0Pricing
Learn AI with Python · Урок

Стратегии кросс-валидации

k-блочная, стратифицированная k-блочная, с исключением одного объекта и разбиение временных рядов — когда применять каждую.

«Стратегии кросс-валидации» — бесплатный урок Learn AI with Python на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Learn AI with Python, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Learn AI with Python содержит 4 уроков всего.

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

Одно разбиение на обучающую и тестовую выборки может оказаться удачным или неудачным. Кросс-валидация повторяет оценивание на разных разбиениях и усредняет оценки, обеспечивая более надёжную оценку производительности.

Кросс-валидация по K блокам

KFold разделяет данные на K равных частей. Каждый блок один раз используется как тестовая выборка, а на остальных блоках обучается модель. В результате Вы получаете K оценок, которые можно усреднить.

from sklearn.model_selection import KFold

kf = KFold(n_splits=5, shuffle=True, random_state=0)
for train_idx, test_idx in kf.split(X):
    Xtr, Xte = X[train_idx], X[test_idx]
    ytr, yte = y[train_idx], y[test_idx]
    # train and evaluate here

Стратифицированная кросс-валидация по K блокам для классификации

При классификации обычное разбиение на K блоков может создавать блоки с несбалансированными соотношениями классов. StratifiedKFold сохраняет пропорции классов в каждом блоке.

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
for train_idx, test_idx in skf.split(X, y):
    # each fold keeps the same class balance as the full set
    pass

Сокращённый вызов cross_val_score

cross_val_score выполняет за Вас весь цикл и возвращает массив оценок для блоков. Для классификаторов он автоматически использует StratifiedKFold.

from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier

clf = RandomForestClassifier(random_state=0)
scores = cross_val_score(clf, X, y, cv=5, scoring="accuracy")
print(scores)
print("Mean:", scores.mean(), "Std:", scores.std())

Выбор числа блоков

Большее число блоков (например, 10) даёт менее смещённую оценку, но требует больше вычислений. Кросс-валидация по 5 блокам — распространённый компромисс. Для очень маленьких наборов данных метод с исключением одного наблюдения использует N блоков, в каждом из которых тестовая выборка состоит из одного образца.

from sklearn.model_selection import LeaveOneOut, cross_val_score

loo = LeaveOneOut()
scores = cross_val_score(clf, X, y, cv=loo)
print("Mean:", scores.mean())

TimeSeriesSplit для временных данных

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

from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
    # train_idx always precedes test_idx in time
    print(len(train_idx), len(test_idx))

Почему порядок важен во временных рядах

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

cross_validate для нескольких метрик

cross_validate похож на cross_val_score, но возвращает несколько метрик одновременно и может включать оценки на обучающих данных и время обучения.

from sklearn.model_selection import cross_validate

results = cross_validate(
    clf, X, y, cv=5,
    scoring=["accuracy", "f1_macro", "roc_auc_ovr"],
    return_train_score=True,
)
print(results["test_accuracy"])
print(results["test_f1_macro"])

Анализ результата cross_validate

Результат представляет собой словарь с такими ключами, как test_<metric>, train_<metric>, fit_time и score_time. Сравнение оценок на обучающих и тестовых данных помогает выявить переобучение.

import numpy as np

gap = results["train_accuracy"].mean() - results["test_accuracy"].mean()
print("Overfit gap:", gap)
print("Avg fit time:", np.mean(results["fit_time"]))

Кросс-валидация и утечка данных

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

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score

pipe = make_pipeline(StandardScaler(), SVC())
scores = cross_val_score(pipe, X, y, cv=5)

Выбор подходящей стратегии

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

Быстрая проверка

Проверьте свои знания о кросс-валидации.

Повторение

Повторение: Кросс-валидация усредняет производительность по нескольким разбиениям. Используйте KFold для регрессии, StratifiedKFold для сбалансированной классификации и TimeSeriesSplit для временных данных. cross_val_score возвращает одну метрику, а cross_validate — несколько метрик и данные о времени выполнения. Всегда выполняйте предварительную обработку внутри Pipeline, чтобы предотвратить утечку.

Часто задаваемые вопросы

Урок «Стратегии кросс-валидации» бесплатный?

Да — полный текст урока «Стратегии кросс-валидации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Learn AI with Python, подпишись на CoddyKit PRO. Курс Learn AI with Python содержит 4 уроков всего.

Чему я научусь в уроке «Стратегии кросс-валидации»?

k-блочная, стратифицированная k-блочная, с исключением одного объекта и разбиение временных рядов — когда применять каждую. Ты практикуешь Learn AI with Python с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Learn AI with Python?

Предыдущий опыт не требуется. Learn AI with Python на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Стратегии кросс-валидации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Learn AI with Python?

Да. Каждый урок Learn AI with Python включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Стратегии кросс-валидации
  2. Подробный разбор метрик классификации
  3. Поиск по сетке и случайный поиск
  4. Байесовская оптимизация с Optuna
← Назад к Learn AI with Python