Оценка моделей и перекрёстная проверка
Оценивайте модели с помощью точности, F1, ROC-AUC и k-кратной CV.
«Оценка моделей и перекрёстная проверка» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Разделение на обучающую, валидационную и тестовую выборки
Используйте разделение на три части: обучающую — для обучения, валидационную — для настройки гиперпараметров, тестовую — для итоговой оценки производительности. Никогда не используйте тестовую выборку во время разработки.
from sklearn.model_selection import train_test_split
import numpy as np
X = np.random.rand(1000, 10)
y = (X[:,0] > 0.5).astype(int)
X_tr, X_rest, y_tr, y_rest = train_test_split(X, y, test_size=0.3)
X_val, X_te, y_val, y_te = train_test_split(X_rest, y_rest, test_size=0.5)Оценка точности
accuracy_score — это доля правильных предсказаний. Используйте её для сбалансированных классов, а для несбалансированных данных предпочтительнее F1 или AUC.
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, random_state=0)
model = LogisticRegression().fit(X_tr, y_tr)
print("Accuracy:", accuracy_score(y_te, model.predict(X_te)))Точность, полнота и F1
Для несбалансированных классов: точность = TP/(TP+FP), полнота = TP/(TP+FN), F1 = гармоническое среднее точности и полноты.
from sklearn.metrics import precision_score, recall_score, f1_score, classification_report
# Use classification_report for a full summary:
print(classification_report(y_te, model.predict(X_te)))
# shows precision, recall, f1 for each classМатрица ошибок
Матрица ошибок показывает истинно положительные, ложно положительные, истинно отрицательные и ложно отрицательные результаты.
from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay
import matplotlib.pyplot as plt
cm = confusion_matrix(y_te, model.predict(X_te))
print(cm)
# [[TN FP]
# [FN TP]]ROC-кривая и AUC
roc_auc_score измеряет площадь под ROC-кривой. AUC = 1.0 означает идеальный результат, а 0.5 — случайное угадывание.
from sklearn.metrics import roc_auc_score, roc_curve
y_prob = model.predict_proba(X_te)[:,1]
print("AUC:", roc_auc_score(y_te, y_prob))
fpr, tpr, thresholds = roc_curve(y_te, y_prob)
# plot fpr vs tpr for the full ROC curveМетрики регрессии
Для задач регрессии используйте mean_squared_error (MSE), root_mean_squared_error (RMSE) и r2_score.
from sklearn.metrics import mean_squared_error, r2_score
y_pred = regression_model.predict(X_te)
mse = mean_squared_error(y_te, y_pred)
print("RMSE:", mse**0.5)
print("R²:", r2_score(y_te, y_pred))k-блочная кросс-валидация
cross_val_score разделяет данные на k блоков, обучает модель на k−1 блоке, оценивает её на одном и повторяет эту процедуру k раз. Такой подход надёжнее одного разделения.
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(random_state=0)
scores = cross_val_score(LogisticRegression(), X, y, cv=10, scoring="accuracy")
print(f"{scores.mean():.3f} ± {scores.std():.3f}")StratifiedKFold
Используйте StratifiedKFold, чтобы в каждом блоке сохранялось одинаковое распределение классов — это особенно важно для несбалансированных наборов данных.
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
X, y = make_classification(weights=[0.9,0.1], random_state=0)
cv = StratifiedKFold(n_splits=5)
scores = cross_val_score(LogisticRegression(), X, y, cv=cv, scoring="f1")
print("Stratified F1:", scores.mean())Компромисс между смещением и дисперсией
Большое смещение означает недообучение (модель слишком проста). Большая дисперсия означает переобучение (модель слишком сложна). Кросс-валидация показывает, с какой проблемой Вы столкнулись.
# Underfitting: low train score AND low val score
# → increase model complexity, add features
# Overfitting: high train score, low val score
# → regularise, reduce complexity, get more data
from sklearn.model_selection import validation_curve
import numpy as np
train_sc, val_sc = validation_curve(DecisionTreeClassifier(), X, y, param_name="max_depth", param_range=range(1,10))Вложенная кросс-валидация
Для непредвзятой настройки гиперпараметров AND оценки используйте вложенную CV: внутренний цикл выполняет настройку, а внешний — оценку.
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
X, y = make_classification(random_state=0)
gs = GridSearchCV(SVC(), {"C":[0.1,1,10]}, cv=5)
outer_scores = cross_val_score(gs, X, y, cv=5)
print("Nested CV accuracy:", outer_scores.mean())Калибровка
Оценки вероятностей классификатора могут быть плохо откалиброваны. Используйте CalibratedClassifierCV, чтобы получать более точные оценки вероятностей.
from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(random_state=0)
X_tr, X_te, y_tr, y_te = train_test_split(X, y)
cal = CalibratedClassifierCV(SVC(), cv=5).fit(X_tr, y_tr)
print(cal.predict_proba(X_te[:3]))Быстрая проверка
Почему для оценки моделей кросс-валидация предпочтительнее одного разделения на обучающую и тестовую выборки?
Повторение
Используйте точность для сбалансированных задач, а F1/AUC — для несбалансированных. Оценивайте модели с помощью k-блочной cross_val_score, используйте StratifiedKFold для несбалансированных данных, а при настройке гиперпараметров — вложенную CV, чтобы получить непредвзятую итоговую оценку. Никогда не обращайтесь к тестовой выборке во время разработки.
Часто задаваемые вопросы
Урок «Оценка моделей и перекрёстная проверка» бесплатный?
Да — полный текст урока «Оценка моделей и перекрёстная проверка» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Оценка моделей и перекрёстная проверка»?
Оценивайте модели с помощью точности, F1, ROC-AUC и k-кратной CV. Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Оценка моделей и перекрёстная проверка»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- API scikit-learn: fit, transform, predict
- Линейные модели: регрессия и классификация
- Модели на основе деревьев: деревья решений и случайные леса
- Оценка моделей и перекрёстная проверка