Класифікація за допомогою sklearn
Розглянемо, як розв’язувати задачі класифікації з використанням бібліотеки sklearn. На двох практичних прикладах - текстові дані та класи з сильним дисбалансом - розберемо повний підхід до побудови, навчання й коректної оцінки моделей.
Код і результати
Опублікована версія після Merge. Результати збережені автором; код на цій сторінці не запускається.
HTML, SVG, віджети та інтерактивні результати не переносяться. Збережено безпечний текст або зображення.
Python · 1
import os
import kagglehub
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.metrics import (
classification_report,
f1_score,
precision_score,
recall_score,
roc_auc_score,
precision_recall_curve
)
from sklearn.linear_model import LogisticRegression
import xgboost as xgb
Python · 2
path = kagglehub.dataset_download("fedesoriano/heart-failure-prediction")
df = pd.read_csv(os.path.join(path, "heart.csv"), sep=",")Результат, збережений автором у Colab
Using Colab cache for faster access to the 'heart-failure-prediction' dataset.
Python · 3
df.head()Результат, збережений автором у Colab
Age Sex ChestPainType RestingBP Cholesterol FastingBS RestingECG MaxHR \ 0 40 M ATA 140 289 0 Normal 172 1 49 F NAP 160 180 0 Normal 156 2 37 M ATA 130 283 0 ST 98 3 48 F ASY 138 214 0 Normal 108 4 54 M NAP 150 195 0 Normal 122 ExerciseAngina Oldpeak ST_Slope HeartDisease 0 N 0.0 Up 0 1 N 1.0 Flat 1 2 N 0.0 Up 0 3 Y 1.5 Flat 1 4 N 0.0 Up 0
Python · 4
df.shapeРезультат, збережений автором у Colab
(918, 12)
Python · 5
df['HeartDisease'].value_counts()Результат, збережений автором у Colab
HeartDisease 1 508 0 410 Name: count, dtype: int64
Python · 6
df.isna().sum()Результат, збережений автором у Colab
Age 0 Sex 0 ChestPainType 0 RestingBP 0 Cholesterol 0 FastingBS 0 RestingECG 0 MaxHR 0 ExerciseAngina 0 Oldpeak 0 ST_Slope 0 HeartDisease 0 dtype: int64
Python · 7
TARGET_NAME = "HeartDisease"
X = df.drop(columns=[TARGET_NAME])
y = df[TARGET_NAME]
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.33, shuffle=True, random_state=42)Python · 8
XРезультат, збережений автором у Colab
Age Sex ChestPainType RestingBP Cholesterol FastingBS RestingECG \
0 40 M ATA 140 289 0 Normal
1 49 F NAP 160 180 0 Normal
2 37 M ATA 130 283 0 ST
3 48 F ASY 138 214 0 Normal
4 54 M NAP 150 195 0 Normal
.. ... .. ... ... ... ... ...
913 45 M TA 110 264 0 Normal
914 68 M ASY 144 193 1 Normal
915 57 M ASY 130 131 0 Normal
916 57 F ATA 130 236 0 LVH
917 38 M NAP 138 175 0 Normal
MaxHR ExerciseAngina Oldpeak ST_Slope
0 172 N 0.0 Up
1 156 N 1.0 Flat
2 98 N 0.0 Up
3 108 Y 1.5 Flat
4 122 N 0.0 Up
.. ... ... ... ...
913 132 N 1.2 Flat
914 141 N 3.4 Flat
915 115 Y 1.2 Flat
916 174 N 0.0 Flat
917 173 N 0.0 Up
[918 rows x 11 columns]Python · 9
X_train.shapeРезультат, збережений автором у Colab
(615, 11)
Python · 10
binary_col = ['FastingBS']
num_col = ['Age', 'RestingBP', 'Cholesterol', 'MaxHR', 'Oldpeak']
cat_col = X_train.select_dtypes(include=['object']).columns.tolist()Python · 11
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), num_col),
('cat', OneHotEncoder(handle_unknown='ignore'), cat_col),
('binary', 'passthrough', binary_col)
]
)Python · 12
pipeline = Pipeline([
('pred', preprocessor),
('cls', LogisticRegression())
])Python · 13
pipeline.fit(X_train, y_train)
y_val_pred = pipeline.predict(X_valid)
print(classification_report(y_valid, y_val_pred))Результат, збережений автором у Colab
precision recall f1-score support
0 0.80 0.91 0.85 123
1 0.93 0.84 0.89 180
accuracy 0.87 303
macro avg 0.87 0.88 0.87 303
weighted avg 0.88 0.87 0.87 303
Python · 14
y_val_proba = pipeline.predict_proba(X_valid)[:, 1]Python · 15
precision, recall, thresholds = precision_recall_curve(y_valid, y_val_proba)
f1_score = (2 * precision * recall) / (precision + recall)
idx = np.argmax(f1_score)Python · 16
y_valid_pred = [1 if el >= thresholds[idx] else 0 for el in y_val_proba]
print(classification_report(y_valid, y_valid_pred))Результат, збережений автором у Colab
precision recall f1-score support
0 0.89 0.87 0.88 123
1 0.91 0.93 0.92 180
accuracy 0.90 303
macro avg 0.90 0.90 0.90 303
weighted avg 0.90 0.90 0.90 303
Python · 17
Рев’ю спільноти
Approved. Можна мерджати
