TelegramПерейти в канал
Sofiia Nazaryshyna
Merged · Machine Learning

Класифікація за допомогою 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

Рев’ю спільноти