7 мощных методов оценки ML-моделей в Scikit-learn: руководство

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Специалисты и практики в области машинного обучения и анализа данных
  • Студенты и начинающие аналитики, желающие углубить свои знания в оценке моделей
  • Профессионалы, работающие с Scikit-learn и заинтересованные в повышении точности своих предсказательных моделей

    Выбор правильных методов оценки моделей машинного обучения — это то, что отличает посредственного специалиста от истинного мастера данных. В мире, где алгоритмы принимают решения стоимостью в миллионы долларов, ошибочная оценка модели может стоить карьеры. Scikit-learn предлагает мощный арсенал инструментов для валидации моделей, но немногие знают, как использовать их на полную мощность. В этой статье я раскрываю 7 ключевых методов оценки, которые превратят вас из обычного кодера в архитектора высокоточных предсказательных систем. 🔍

Если вы хотите глубоко разобраться в оценке моделей машинного обучения и стать востребованным специалистом по данным, обратите внимание на Профессию аналитик данных от Skypro. Курс включает практические модули по Scikit-learn, где вы не только изучите теорию, но и научитесь применять все описанные методы оценки моделей на реальных проектах под руководством опытных практиков из индустрии. Ваше портфолио пополнится проектами, демонстрирующими мастерство в выборе и оптимизации ML-моделей.

Основные метрики классификации в Scikit-learn

Оценка классификационных моделей — фундаментальный навык для любого специалиста по машинному обучению. Scikit-learn предлагает набор мощных метрик, позволяющих точно определить эффективность ваших моделей в различных контекстах.

Давайте начнем с базовых метрик, которые являются строительными блоками для более сложных оценок:

  • Accuracy (Точность) — простейшая метрика, измеряющая долю правильных предсказаний: accuracy_score(y_true, y_pred)
  • Precision (Точность в узком смысле) — измеряет, какая доля положительных предсказаний действительно верна: precision_score(y_true, y_pred)
  • Recall (Полнота) — показывает, какую долю истинно положительных случаев удалось обнаружить: recall_score(y_true, y_pred)
  • F1-score — гармоническое среднее precision и recall: f1_score(y_true, y_pred)

Выбор правильной метрики критически важен и зависит от специфики вашей задачи. Рассмотрим пример: при разработке модели для выявления мошеннических транзакций, recall будет важнее precision, поскольку стоимость пропуска мошенничества обычно выше, чем ложного срабатывания.

Алексей Петров, Lead Data Scientist

Однажды наша команда работала над моделью выявления аномалий в промышленном оборудовании. Мы долго оптимизировали accuracy модели, доведя её до впечатляющих 98%. Руководство было в восторге... до первого инцидента. Оказалось, что несмотря на высокую общую точность, модель пропускала редкие, но критические поломки. Класс поломок составлял менее 2% данных, и даже просто классифицируя всё как "норма", можно было получить точность 98%!

После этого случая мы полностью пересмотрели подход к оценке, внедрив weighted F1-score и precision-recall кривые. Это был ценный урок: никогда не полагайтесь только на accuracy в несбалансированных задачах. С новой системой оценки нам удалось увеличить recall для критических случаев до 92%, что предотвратило простои оборудования на миллионы рублей.

Для многоклассовой классификации Scikit-learn предлагает дополнительные варианты расчёта метрик через параметр average:

Метод усреднения Описание Применение
macro Равное взвешивание всех классов Когда все классы одинаково важны
weighted Взвешивание по количеству экземпляров При несбалансированных данных
micro Агрегация по всем предсказаниям Когда важно общее количество правильных ответов
None Возвращает метрику для каждого класса Для детального анализа по классам

Интегральная оценка производительности классификационной модели возможна с помощью confusion matrix (матрицы ошибок), которая визуализирует все типы ошибок:

Python
Скопировать код
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt

cm = confusion_matrix(y_true, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')
plt.ylabel('Истинный класс')
plt.xlabel('Предсказанный класс')
plt.show()

При работе с несбалансированными классами особенно полезны метрики, учитывающие структуру данных:

  • Balanced accuracy — средняя точность для всех классов, независимо от их размера: balanced_accuracy_score(y_true, y_pred)
  • Matthews correlation coefficient — коэффициент, учитывающий все элементы матрицы ошибок: matthews_corrcoef(y_true, y_pred)
  • Cohen's kappa — метрика согласованности, учитывающая случайное совпадение: cohen_kappa_score(y_true, y_pred)

Выбор оптимальной метрики — это искусство, требующее глубокого понимания как домена задачи, так и особенностей данных. Опытные специалисты часто комбинируют несколько метрик для получения целостной картины эффективности модели. 🔢

Пошаговый план для смены профессии

Cross-validation и разделение данных для тестирования

Правильное разделение данных на обучающую и тестовую выборки — критический этап в построении надежных моделей машинного обучения. Без грамотной стратегии валидации даже самый продвинутый алгоритм может дать иллюзорные результаты, которые не будут воспроизводиться на новых данных.

Scikit-learn предоставляет мощный инструментарий для разделения данных и кросс-валидации, который можно адаптировать под любые задачи:

  • traintestsplit — базовый метод для случайного разделения данных: train_test_split(X, y, test_size=0.3, random_state=42)
  • KFold — разделяет данные на k равных частей для перекрестной проверки: KFold(n_splits=5, shuffle=True, random_state=42)
  • StratifiedKFold — вариант KFold, сохраняющий распределение классов: StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
  • GroupKFold — гарантирует, что определенные группы наблюдений не будут разделены между обучающими и тестовыми выборками: GroupKFold(n_splits=5)
  • TimeSeriesSplit — специализированное разделение для временных рядов: TimeSeriesSplit(n_splits=5)

Рассмотрим типичные сценарии применения кросс-валидации в Scikit-learn:

Python
Скопировать код
from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier

# Базовая кросс-валидация с предопределенным числом фолдов
scores = cross_val_score(RandomForestClassifier(), X, y, cv=5, scoring='f1')
print(f"Средняя F1-мера: {scores.mean():.4f}, стандартное отклонение: {scores.std():.4f}")

# Расширенная кросс-валидация с настройкой
kf = KFold(n_splits=10, shuffle=True, random_state=42)
scores = cross_val_score(RandomForestClassifier(), X, y, cv=kf, scoring='f1')

Важно учитывать особенности данных при выборе метода кросс-валидации:

Тип данных Рекомендуемый метод CV Особенности применения
Несбалансированные классы StratifiedKFold Сохраняет пропорции классов во всех фолдах
Временные ряды TimeSeriesSplit Предотвращает утечку будущих данных в обучение
Сгруппированные данные GroupKFold Гарантирует, что связанные наблюдения не разделяются
Данные малого объема LeaveOneOut Максимизирует размер обучающей выборки

Для многоклассовой классификации или несбалансированных данных особенно важно использовать StratifiedKFold:

Python
Скопировать код
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.metrics import f1_score, make_scorer

# Создаем собственную метрику оценки с настройкой
f1_weighted = make_scorer(f1_score, average='weighted')

# Инициализируем стратифицированную кросс-валидацию
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# Проводим оценку с собственной метрикой
scores = cross_val_score(model, X, y, cv=skf, scoring=f1_weighted)

При наличии временной составляющей в данных обязательно используйте TimeSeriesSplit, чтобы избежать утечки информации из будущего в обучение:

Python
Скопировать код
from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
model.fit(X_train, y_train)
predictions = model.predict(X_test)

Правильная кросс-валидация — это не просто техническая процедура, а стратегическое решение, влияющее на надежность вашей модели. Используйте инструменты Scikit-learn осознанно, адаптируя их под специфику ваших данных и задачи. 🔄

Оценка регрессионных моделей через metrics API

Оценка регрессионных моделей требует иного подхода, чем классификация. В этом разделе мы рассмотрим ключевые метрики, предоставляемые metrics API Scikit-learn, которые помогут вам точно измерить эффективность регрессионных моделей.

Начнем с основных метрик, которые должен знать каждый специалист по данным:

  • Mean Absolute Error (MAE) — средняя абсолютная ошибка, нечувствительная к выбросам: mean_absolute_error(y_true, y_pred)
  • Mean Squared Error (MSE) — средний квадрат ошибки, подчеркивает большие отклонения: mean_squared_error(y_true, y_pred)
  • Root Mean Squared Error (RMSE) — корень из MSE, более интерпретируемый: np.sqrt(mean_squared_error(y_true, y_pred))
  • R² (коэффициент детерминации) — показывает долю объясненной дисперсии: r2_score(y_true, y_pred)
  • Explained Variance Score — оценивает долю дисперсии, объясняемую моделью: explained_variance_score(y_true, y_pred)
  • Median Absolute Error — медианная абсолютная ошибка, очень устойчивая к выбросам: median_absolute_error(y_true, y_pred)

Вот полный пример оценки регрессионной модели с использованием нескольких метрик:

Python
Скопировать код
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
from sklearn.metrics import explained_variance_score, median_absolute_error
import numpy as np

# Предположим, у нас есть модель и данные
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

# Рассчитываем различные метрики
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)
exp_var = explained_variance_score(y_test, y_pred)
median_ae = median_absolute_error(y_test, y_pred)

print(f"MAE: {mae:.4f}")
print(f"MSE: {mse:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"R²: {r2:.4f}")
print(f"Explained Variance: {exp_var:.4f}")
print(f"Median Absolute Error: {median_ae:.4f}")

Для сложных регрессионных задач Scikit-learn также предлагает более специализированные метрики:

  • Mean Absolute Percentage Error (MAPE) — средняя абсолютная процентная ошибка, удобная для интерпретации: mean_absolute_percentage_error(y_true, y_pred)
  • Mean Squared Logarithmic Error (MSLE) — полезна для данных с экспоненциальным ростом: mean_squared_log_error(y_true, y_pred)
  • Huber Loss — компромисс между MAE и MSE: HuberRegressor().fit(X, y)

Ирина Соколова, Principal Data Scientist

При разработке системы прогнозирования энергопотребления для крупной энергетической компании мы столкнулись с интересной проблемой. Наша модель показывала отличный R² (0.92), но заказчик был недоволен — прогнозы в пиковые часы сильно отклонялись от реальности.

Анализ показал, что стандартные метрики не учитывали бизнес-контекст: ошибка в 10 кВт⋅ч в пиковый час могла стоить в 5 раз дороже, чем такая же ошибка ночью. Мы разработали кастомную весовую функцию ошибки, учитывающую тариф в каждый час:

Python
Скопировать код
def weighted_mse(y_true, y_pred, weights):
return np.average((y_true – y_pred) ** 2, weights=weights)

# Где weights — массив с тарифами на электроэнергию в соответствующие часы

После оптимизации модели по этой метрике точность прогнозов в финансовом выражении улучшилась на 43%, хотя общий R² незначительно снизился до 0.89. Этот опыт научил меня всегда адаптировать метрики под бизнес-задачу, а не слепо следовать академическим стандартам.

При выборе метрики для регрессионных моделей важно понимать их особенности и ограничения:

Метрика Преимущества Недостатки Рекомендуемое применение
MAE Устойчива к выбросам, интуитивно понятна Не отражает вариативность ошибок Когда все ошибки одинаково важны
MSE Штрафует большие ошибки, математически удобна Чувствительна к выбросам Когда большие ошибки критичны
Легко интерпретируема, нормирована Может быть отрицательной, зависит от данных Для сравнения моделей на одних данных
MSLE Работает с экспоненциальным ростом Требует положительных значений Продажи, прогноз спроса

Помните, что выбор метрики должен соответствовать вашей бизнес-задаче. Например, для прогнозирования цен на недвижимость RMSE может быть предпочтительнее, чем MAE, поскольку большие отклонения могут иметь непропорционально высокую стоимость для бизнеса. Для розничных продаж с сезонностью MAPE часто является лучшим выбором благодаря своей интерпретируемости.

При настройке гиперпараметров регрессионных моделей в Scikit-learn можно использовать эти метрики напрямую:

Python
Скопировать код
from sklearn.model_selection import GridSearchCV
from sklearn.ensemble import RandomForestRegressor

param_grid = {
'n_estimators': [100, 300, 500],
'max_depth': [None, 5, 10],
'min_samples_split': [2, 5, 10]
}

# Используем негативный MSE, так как GridSearchCV максимизирует метрику
grid_search = GridSearchCV(
RandomForestRegressor(random_state=42),
param_grid,
cv=5,
scoring='neg_mean_squared_error',
n_jobs=-1
)

grid_search.fit(X_train, y_train)
best_params = grid_search.best_params_
print(f"Лучшие параметры: {best_params}")
print(f"Лучший RMSE: {np.sqrt(-grid_search.best_score_):.4f}")

Scikit-learn предлагает разнообразный набор инструментов для оценки регрессионных моделей, но всегда помните: метрика — это перевод бизнес-требований на язык математики. Выбирайте её осознанно, исходя из конкретных целей вашего проекта. 📊

ROC-кривые и AUC для бинарной классификации

ROC-кривая (Receiver Operating Characteristic) и показатель AUC (Area Under Curve) — это золотой стандарт оценки моделей бинарной классификации, особенно в условиях несбалансированных классов. Они позволяют визуализировать и количественно оценить компромисс между чувствительностью и специфичностью модели при различных порогах отсечения.

Scikit-learn предоставляет простые в использовании функции для построения ROC-кривых и расчёта AUC:

Python
Скопировать код
from sklearn.metrics import roc_curve, roc_auc_score, plot_roc_curve
import matplotlib.pyplot as plt

# Получаем вероятности принадлежности к положительному классу
y_pred_proba = model.predict_proba(X_test)[:, 1]

# Рассчитываем ROC-кривую
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)

# Вычисляем AUC
auc_score = roc_auc_score(y_test, y_pred_proba)

# Визуализируем ROC-кривую
plt.figure(figsize=(10, 6))
plt.plot(fpr, tpr, label=f'ROC curve (AUC = {auc_score:.3f})')
plt.plot([0, 1], [0, 1], 'k--', label='Random model')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc='lower right')
plt.show()

Построение ROC-кривой позволяет решить несколько ключевых задач:

  • Оценить общее качество модели через площадь под кривой (AUC)
  • Выбрать оптимальный порог отсечения для конкретной бизнес-задачи
  • Сравнить различные модели визуально и количественно
  • Оценить стабильность модели при различных порогах принятия решений

Для сравнения нескольких моделей на одном графике:

Python
Скопировать код
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

# Создаем несколько моделей
models = {
'Logistic Regression': LogisticRegression(),
'Random Forest': RandomForestClassifier(),
'SVM': SVC(probability=True)
}

plt.figure(figsize=(10, 8))

# Обучаем и строим ROC для каждой модели
for name, model in models.items():
model.fit(X_train, y_train)
y_pred_proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
auc = roc_auc_score(y_test, y_pred_proba)
plt.plot(fpr, tpr, label=f'{name} (AUC = {auc:.3f})')

plt.plot([0, 1], [0, 1], 'k--', label='Random')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curves Comparison')
plt.legend(loc='lower right')
plt.show()

Интерпретация значений AUC имеет практическую ценность:

Значение AUC Интерпретация Рекомендации
0.5 Модель не лучше случайного угадывания Пересмотреть подход или признаки
0.5-0.7 Плохая дискриминация Требуется существенное улучшение модели
0.7-0.8 Приемлемая дискриминация Можно использовать, но есть потенциал для улучшения
0.8-0.9 Отличная дискриминация Надежная модель для большинства приложений
0.9-1.0 Исключительная дискриминация Проверить на переобучение; возможно, идеальная модель

Важно, чтобы выбор оптимального порога отсечения не ограничивался стандартным порогом 0.5, а учитывал конкретные метрики или бизнес-ценность:

Python
Скопировать код
from sklearn.metrics import precision_recall_curve

# Находим оптимальный порог для F1-меры
precision, recall, thresholds = precision_recall_curve(y_test, y_pred_proba)
f1_scores = 2 * (precision * recall) / (precision + recall + 1e-10)
optimal_threshold = thresholds[np.argmax(f1_scores)]

print(f"Оптимальный порог для максимизации F1: {optimal_threshold:.4f}")

# Применяем найденный порог для получения предсказаний
y_pred_optimal = (y_pred_proba >= optimal_threshold).astype(int)

Для задач с асимметричной стоимостью ошибок (например, медицинская диагностика или выявление мошенничества), полезно рассмотреть кривую выгоды (profit curve) или кривую стоимости (cost curve), которые учитывают бизнес-ценность каждого решения:

Python
Скопировать код
# Предположим, что false_negative_cost = 10, false_positive_cost = 1
def calculate_total_cost(y_true, y_pred, fn_cost=10, fp_cost=1):
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
return fn * fn_cost + fp * fp_cost

# Рассчитываем стоимость для различных порогов
costs = []
for threshold in np.linspace(0, 1, 100):
y_pred_t = (y_pred_proba >= threshold).astype(int)
costs.append(calculate_total_cost(y_test, y_pred_t))

# Находим порог с минимальной стоимостью
optimal_threshold_cost = np.linspace(0, 1, 100)[np.argmin(costs)]
print(f"Порог с минимальной стоимостью ошибок: {optimal_threshold_cost:.4f}")

ROC-анализ также может быть расширен для многоклассовой классификации через подход "one-vs-rest" или "one-vs-one", где Scikit-learn предоставляет соответствующие функции:

Python
Скопировать код
from sklearn.metrics import roc_auc_score

# Для многоклассовой задачи (предполагается, что y_pred_proba содержит вероятности для всех классов)
# Используем стратегию 'ovr' (one-vs-rest)
auc_score_multi = roc_auc_score(y_test, y_pred_proba, multi_class='ovr', average='weighted')
print(f"Weighted AUC (one-vs-rest): {auc_score_multi:.4f}")

ROC-анализ — мощный инструмент в арсенале специалиста по данным, позволяющий глубже понять характеристики модели и принимать обоснованные решения о её применимости для конкретной задачи. Грамотное использование ROC-кривых и AUC способно значительно улучшить качество принимаемых решений, особенно в чувствительных областях, где цена ошибки высока. 📈

Методы анализа переобучения и недообучения моделей

Переобучение (overfitting) и недообучение (underfitting) — классические проблемы в машинном обучении, способные существенно снизить эффективность моделей на реальных данных. Scikit-learn предоставляет мощный арсенал инструментов для выявления и устранения этих проблем.

Давайте рассмотрим ключевые методы диагностики и борьбы с переобучением и недообучением:

  • Кривые обучения (Learning Curves) — визуализируют зависимость производительности модели от размера обучающей выборки
  • Кривые валидации (Validation Curves) — показывают влияние конкретного гиперпараметра на качество модели
  • График сравнения обучающей и тестовой ошибок — простой, но эффективный способ выявления проблем
  • Диагностика через коэффициенты — особенно полезна для линейных моделей
  • Анализ остатков (Residual Analysis) — помогает выявить паттерны в ошибках модели

Построение кривых обучения — отличный способ визуализировать проблемы переобучения или недообучения:

Python
Скопировать код
from sklearn.model_selection import learning_curve
import numpy as np
import matplotlib.pyplot as plt

# Функция для построения кривых обучения
def plot_learning_curve(estimator, X, y, cv=5):
train_sizes, train_scores, test_scores = learning_curve(
estimator, X, y, cv=cv, n_jobs=-1, 
train_sizes=np.linspace(0.1, 1.0, 10)
)

# Средние значения и стандартные отклонения
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)

# Построение графика
plt.figure(figsize=(10, 6))
plt.fill_between(train_sizes, train_mean – train_std, train_mean + train_std, 
alpha=0.1, color='blue')
plt.fill_between(train_sizes, test_mean – test_std, test_mean + test_std, 
alpha=0.1, color='orange')
plt.plot(train_sizes, train_mean, 'o-', color='blue', label='Обучающая выборка')
plt.plot(train_sizes, test_mean, 'o-', color='orange', label='Тестовая выборка')
plt.xlabel('Размер обучающей выборки')
plt.ylabel('Точность')
plt.title('Кривая обучения')
plt.legend(loc='best')
plt.grid(True)
plt.show()

# Пример использования
from sklearn.ensemble import RandomForestClassifier
plot_learning_curve(RandomForestClassifier(random_state=42), X, y)

Интерпретация кривых обучения:

  • При переобучении: высокая точность на обучающей выборке и существенно более низкая на тестовой
  • При недообучении: низкая точность как на обучении, так и на тесте
  • Оптимальная модель: близкие значения точности на обучающей и тестовой выборке, с высокой общей точностью

Кривые валидации помогают выбрать оптимальные значения гиперпараметров, влияющих на сложность модели:

Python
Скопировать код
from sklearn.model_selection import validation_curve

# Функция для построения кривых валидации
def plot_validation_curve(estimator, X, y, param_name, param_range, cv=5):
train_scores, test_scores = validation_curve(
estimator, X, y, param_name=param_name, param_range=param_range,
cv=cv, scoring='accuracy', n_jobs=-1
)

# Средние значения и стандартные отклонения
train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
test_mean = np.mean(test_scores, axis=1)
test_std = np.std(test_scores, axis=1)

# Построение графика
plt.figure(figsize=(10, 6))
plt.fill_between(param_range, train_mean – train_std, train_mean + train_std, 
alpha=0.1, color='blue')
plt.fill_between(param_range, test_mean – test_std, test_mean + test_std, 
alpha=0.1, color='orange')
plt.plot(param_range, train_mean, 'o-', color='blue', label='Обучающая выборка')
plt.plot(param_range, test_mean, 'o-', color='orange', label='Тестовая выборка')
plt.xscale('log')
plt.xlabel(param_name)
plt.ylabel('Точность')
plt.title(f'Кривая валидации для {param_name}')
plt.legend(loc='best')
plt.grid(True)
plt.show()

# Пример для регуляризационного параметра C в логистической регрессии
from sklearn.linear_model import LogisticRegression
param_range = np.logspace(-3, 3, 10)
plot_validation_curve(
LogisticRegression(max_iter=1000), 
X, y, 
'C', 
param_range
)

Для более точной диагностики и борьбы с переобучением и недообучением, Scikit-learn предлагает множество специализированных техник:

Проблема Методы диагностики Методы решения
Переобучение – Большая разница между метриками на обучении и тесте<br>- Высокая вариативность предсказаний при небольших изменениях данных – Регуляризация (L1, L2)<br>- Уменьшение сложности модели<br>- Ранняя остановка<br>- Увеличение объема данных
Недообучение – Низкие метрики как на обучении, так и на тесте<br>- Модель не улавливает очевидные паттерны – Увеличение сложности модели<br>- Добавление признаков<br>- Полиномиальные признаки<br>- Выбор более мощного алгоритма

Практический пример комплексного анализа и настройки модели:

Python
Скопировать код
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.linear_model import Ridge
from sklearn.model_selection import cross_val_score

# Создаем пайплайн для полиномиальной регрессии с регуляризацией
def create_poly_pipeline(degree, alpha):
return Pipeline([
('poly', PolynomialFeatures(degree=degree, include_bias=False)),
('ridge', Ridge(alpha=alpha))
])

# Анализ моделей разной сложности
degrees = [1, 2, 3, 5, 10]
alphas = [0\.0, 0.001, 0.01, 0.1, 1.0, 10.0]

results = {}
for degree in degrees:
for alpha in alphas:
pipeline = create_poly_pipeline(degree, alpha)
# Оценка на обучающей выборке
train_score = pipeline.fit(X_train, y_train).score(X_train, y_train)
# Оценка на тестовой выборке через кросс-валидацию
cv_score = np.mean(cross_val_score(pipeline, X, y, cv=5))
results[(degree, alpha)] = (train_score, cv_score)

# Находим модель с наименьшим расхождением между обучением и валидацией
best_params = min(results.items(), key=lambda x: abs(x[1][0] – x[1][1]))
print(f"Оптимальные параметры: степень={best_params[0][0]}, alpha={best_params[0][1]}")
print(f"Точность на обучении: {best_params[1][0]:.4f}, на валидации: {best_params[1][1]:.4f}")

Анализ остатков предоставляет ценную информацию о систематических ошибках модели:

Python
Скопировать код
# Анализ остатков для регрессионной модели
def plot_residuals(y_true, y_pred):
residuals = y_true – y_pred

plt.figure(figsize=(12, 8))

# График остатков
plt.subplot(2, 2, 1)
plt.scatter(y_pred, residuals)
plt.axhline(y=0, color='r', linestyle='-')
plt.xlabel('Предсказанные значения')
plt.ylabel('Остатки')
plt.title('Остатки vs. Предсказанные значения')

# Гистограмма остатков
plt.subplot(2, 2, 2)
plt.hist(residuals, bins=30)
plt.xlabel('Остатки')
plt.ylabel('Частота')
plt.title('Распределение остатков')

# QQ-plot для проверки нормальности
plt.subplot(2, 2, 3)
from scipy import stats
stats.probplot(residuals, dist="norm", plot=plt)
plt.title('QQ-plot остатков')

# Абсолютные остатки vs. предсказанные значения
plt.subplot(2, 2, 4)
plt.scatter(y_pred, np.abs(residuals))
plt.xlabel('Предсказанные значения')
plt.ylabel('Абсолютные остатки')
plt.title('Гомоскедастичность')

plt.tight_layout()
plt.show()

# Применение анализа остатков
y_pred = model.predict(X_test)
plot_residuals(y_test, y_pred)

Глубокое понимание природы переобучения и недообучения, а также умение применять соответствующие методы диагностики и коррекции — необходимые навыки для специалиста по машинному обучению. Scikit-learn предоставляет все необходимые инструменты, но требуется опыт и понимание, чтобы эффективно их использовать. 🔍

Грамотная оценка моделей машинного обучения — это не просто технический навык, а искусство, требующее глубокого понимания как математических основ, так и специфики решаемых задач. Применяя описанные методы — от базовых метрик классификации до продвинутых техник анализа ROC-кривых и диагностики переобучения — вы получаете не просто числовые показатели, а глубокое понимание сильных и слабых сторон ваших моделей. Помните, что идеальная метрика не существует, а выбор методов оценки должен всегда диктоваться конкретной задачей и бизнес-целями. Мастерство приходит с опытом, но первый шаг — это владение инструментарием, который предлагает Scikit-learn.

Читайте также

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей
Что такое точность (Accuracy) в оценке моделей машинного обучения?
1 / 5

Загрузка...