Кросс-валидация

Обучение с учителем с помощью scikit-learn

George Boorman

Core Curriculum Manager, DataCamp

Зачем нужна кросс-валидация

  • Качество модели зависит от способа разбивки данных

  • Это не отражает способность модели обобщать на новых данных

  • Решение: кросс-валидация!

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

заголовки таблицы: разбивка 1, блок 1, блок 2, блок 3, блок 4 и блок 5

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

разбивка 1 зарезервирована как тестовая выборка

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

блоки 2–5 используются как обучающие данные

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

вычисление метрики на этих блоках

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

блок 2 в роли тестовых данных

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

блоки 1, 3, 4 и 5 в роли обучающих данных

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

повторное вычисление метрики

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

повторение с третьим блоком

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

повторение с четвёртым блоком

Обучение с учителем с помощью scikit-learn

Основы кросс-валидации

повторение с пятым блоком

Обучение с учителем с помощью scikit-learn

Кросс-валидация и качество модели

  • 5 блоков = 5-fold CV

  • 10 блоков = 10-fold CV

  • k блоков = k-fold CV

  • Больше блоков = больше вычислительных затрат

Обучение с учителем с помощью scikit-learn

Кросс-валидация в scikit-learn

from sklearn.model_selection import cross_val_score, KFold

kf = KFold(n_splits=6, shuffle=True, random_state=42)
reg = LinearRegression()
cv_results = cross_val_score(reg, X, y, cv=kf)
Обучение с учителем с помощью scikit-learn

Оценка результатов кросс-валидации

print(cv_results)
[0.70262578, 0.7659624, 0.75188205, 0.76914482, 0.72551151, 0.73608277]
print(np.mean(cv_results), np.std(cv_results))
0.7418682216666667 0.023330243960652888
print(np.quantile(cv_results, [0.025, 0.975]))
array([0.7054865, 0.76874702])
Обучение с учителем с помощью scikit-learn

Давайте потренируемся!

Обучение с учителем с помощью scikit-learn

Preparing Video For Download...