1. Вычислим метрики классификации.

tp = 60

fp = 15

fn = 25

tn = 100

 

precision = tp / (tp + fp)

recall = tp / (tp + fn)

 

f1 = (

    2 * precision * recall

    / (precision + recall)

)

 

print("Precision:", round(precision, 3))

print("Recall:", round(recall, 3))

print("F1-score:", round(f1, 3))

Результат:

Precision: 0.800

Recall: 0.706

F1-score: 0.750

Precision характеризует точность положительных прогнозов, а Recall — полноту обнаружения положительных объектов.

2. Вычислим MAE и RMSE.

import numpy as np

from sklearn.metrics import (

    mean_absolute_error,

    mean_squared_error

)

 

y_true = np.array([100, 150, 200, 250, 300])

y_pred = np.array([110, 145, 210, 230, 280])

 

absolute_errors = np.abs(

    y_true - y_pred

)

 

mae = mean_absolute_error(

    y_true, y_pred

)

 

rmse = np.sqrt(

    mean_squared_error(y_true, y_pred)

)

 

print("Абсолютные ошибки:", absolute_errors)

print("MAE:", round(mae, 3))

print("RMSE:", round(rmse, 3))

Результат:

Абсолютные ошибки: [10, 5, 10, 20, 20]

MAE: 13.0

RMSE: 14.663

MAE показывает среднюю абсолютную величину ошибки.

RMSE сильнее реагирует на большие отклонения, поскольку ошибки возводятся в квадрат перед усреднением.

3. Выполним перекрёстную проверку и независимую тестовую оценку.

from sklearn.datasets import make_classification

from sklearn.model_selection import (

    train_test_split,

    cross_val_score

)

from sklearn.pipeline import make_pipeline

from sklearn.preprocessing import StandardScaler

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import (

    precision_score,

    recall_score,

    f1_score,

    roc_auc_score

)

 

X, y = make_classification(

    n_samples=400,

    n_features=6,

    n_informative=4,

    n_redundant=0,

    random_state=42

)

 

X_train, X_test, y_train, y_test = train_test_split(

    X, y,

    test_size=0.2,

    stratify=y,

    random_state=42

)

 

model = make_pipeline(

    StandardScaler(),

    LogisticRegression(max_iter=1000)

)

 

cv_scores = cross_val_score(

    model,

    X_train,

    y_train,

    cv=5,

    scoring="f1"

)

 

print("Средний CV F1:", round(cv_scores.mean(), 3))

 

model.fit(X_train, y_train)

 

predictions = model.predict(X_test)

probabilities = model.predict_proba(X_test)[:, 1]

 

print(

    "Precision:",

    round(precision_score(y_test, predictions), 3)

)

print(

    "Recall:",

    round(recall_score(y_test, predictions), 3)

)

print(

    "F1:",

    round(f1_score(y_test, predictions), 3)

)

print(

    "ROC-AUC:",

    round(roc_auc_score(y_test, probabilities), 3)

)

Перекрёстная проверка проводится только на обучающей выборке.

Тестовые данные используются после завершения обучения и выбора модели.

ROC-AUC характеризует способность модели ранжировать положительные объекты выше отрицательных. При редких положительных классах дополнительно необходимо анализировать Precision, Recall, кривую Precision–Recall и базовую частоту события.

Использование тестовой выборки для выбора гиперпараметров приводит к завышению оценки качества, поскольку модель косвенно подстраивается под тестовые данные.