machine-learning Лекция

Валидация, Тюнинг и Пайплайны (Pipelines)

Лекция 15: Валидация, Тюнинг и Пайплайны (Pipelines)

Цели лекции

  1. Понять, почему одиночного train_test_split недостаточно. Введение в Cross-Validation.
  2. Автоматизировать подбор гиперпараметров с помощью GridSearch и RandomizedSearch.
  3. Осознать проблему Утечки данных (Data Leakage) при препроцессинге.
  4. Освоить Sklearn Pipelines: как писать чистый, безопасный и воспроизводимый код.

Часть 1: Кросс-валидация (Cross-Validation)

До сих пор мы делили данные один раз: 80% Train, 20% Test.

Риск одиночного разбиения

А что, если в Test случайно попали самые легкие примеры? Мы получим Accuracy 99%, обрадуемся, а в продакшене модель провалится. Или наоборот, в тест попали выбросы, и мы забракуем хорошую модель.

1.1. K-Fold Cross-Validation

Мы делим данные не на 2 части, а на KK блоков (фолдов). Обычно K=5K=5.

  1. Итерация 1: Учим на фолдах [2, 3, 4, 5], тестируем на [1].
  2. Итерация 2: Учим на [1, 3, 4, 5], тестируем на [2].
  3. Итерация 5: Учим на [1, 2, 3, 4], тестируем на [5].

В итоге мы получаем 5 оценок качества. Мы усредняем их и получаем Mean Accuracy ±\pm Std Dev. Это дает доверительный интервал. Мы говорим: “Точность модели 0.85±0.020.85 \pm 0.02“.

1.2. Stratified K-Fold

Критически важно для дисбаланса классов. Обычный K-Fold режет данные подряд. Может случиться так, что в один фолд попадут только “здоровые”, а в другой — только “больные”. Stratified K-Fold гарантирует, что в каждом блоке процент классов такой же, как во всем датасете.


Часть 2: Тюнинг гиперпараметров

Как выбрать n_neighbors для KNN или max_depth для дерева? Гадать? Нет. Мы используем перебор.


Часть 3: Утечка данных (Data Leakage) — Смертный грех

Самая коварная ошибка в ML

Ситуация: Вы делаете StandardScaler на ВСЕМ датасете, а потом делаете train_test_split.

  • Почему это плохо? При расчете среднего и дисперсии Скалер “подсмотрел” в тестовые данные. Информация из будущего утекла в обучение.
  • Результат: На валидации качество завышено. В реальности — ниже.
  • Правило: Любой fit (обучение скалера, PCA, модели) должен происходить только на Train части текущего фолда.

Часть 4: Sklearn Pipelines (Конвейеры)

Чтобы не писать спагетти-код и избежать утечек, sklearn придумал класс Pipeline. Это “капсула”, в которую мы кладем шаги обработки:

  1. Scaler
  2. PCA
  3. Classifier

4.1. Как это работает

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('pca', PCA(n_components=5)),
    ('model', LogisticRegression())
])

Логика выполнения Pipeline

Когда вы вызываете pipe.fit(X_train, y_train):

  1. Данные заходят в scaler. Он делает fit_transform.
  2. Выход скалера идет в pca. Он делает fit_transform.
  3. Выход PCA идет в model. Она делает fit.

Когда вы вызываете pipe.predict(X_test):

  1. Данные идут в scaler (только transform!).
  2. Потом в pca (только transform!).
  3. Потом в model (predict).

4.2. GridSearch по Пайплайну

Самое мощное применение. Мы можем перебирать не только параметры модели, но и параметры препроцессинга!

  • “Нужен ли нам PCA?” -> переберем pca__n_components: [5, 10, None].
  • “Нужен ли Scaler?” -> переберем scaler: [StandardScaler(), MinMaxScaler(), None].

Пайплайн сам позаботится о том, чтобы на каждом фолде кросс-валидации скалер обучался заново, предотвращая утечку.


Takeaways (Ключевые выводы)

  • Cross-Validation дает честную оценку устойчивости модели. Одиночный тест может врать.
  • Data Leakage при препроцессинге (скалирование до сплита) ведет к переобучению.
  • Pipeline — это стандарт индустрии. Он гарантирует правильную последовательность шагов и изолирует тест от трейна.
  • GridSearch внутри Пайплайна позволяет найти идеальную архитектуру (препроцессинг + модель) автоматически.
  • RandomizedSearch используйте, когда пространство параметров слишком велико.

🧠 Проверка знаний

Какую ключевую ошибку (Data Leakage) предотвращает использование объекта Pipeline при проведении кросс-валидации?

В чем главное практическое отличие RandomizedSearch от классического GridSearch при поиске оптимальных гиперпараметров?