Лекция 15: Валидация, Тюнинг и Пайплайны (Pipelines)
Цели лекции
- Понять, почему одиночного
train_test_splitнедостаточно. Введение в Cross-Validation. - Автоматизировать подбор гиперпараметров с помощью GridSearch и RandomizedSearch.
- Осознать проблему Утечки данных (Data Leakage) при препроцессинге.
- Освоить Sklearn Pipelines: как писать чистый, безопасный и воспроизводимый код.
Часть 1: Кросс-валидация (Cross-Validation)
До сих пор мы делили данные один раз: 80% Train, 20% Test.
Риск одиночного разбиения
А что, если в Test случайно попали самые легкие примеры? Мы получим Accuracy 99%, обрадуемся, а в продакшене модель провалится. Или наоборот, в тест попали выбросы, и мы забракуем хорошую модель.
1.1. K-Fold Cross-Validation
Мы делим данные не на 2 части, а на блоков (фолдов). Обычно .
- Итерация 1: Учим на фолдах [2, 3, 4, 5], тестируем на [1].
- Итерация 2: Учим на [1, 3, 4, 5], тестируем на [2].
- …
- Итерация 5: Учим на [1, 2, 3, 4], тестируем на [5].
В итоге мы получаем 5 оценок качества. Мы усредняем их и получаем Mean Accuracy Std Dev. Это дает доверительный интервал. Мы говорим: “Точность модели “.
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.
Это “капсула”, в которую мы кладем шаги обработки:
- Scaler
- PCA
- Classifier
4.1. Как это работает
pipe = Pipeline([
('scaler', StandardScaler()),
('pca', PCA(n_components=5)),
('model', LogisticRegression())
])
Логика выполнения Pipeline
Когда вы вызываете pipe.fit(X_train, y_train):
- Данные заходят в
scaler. Он делаетfit_transform. - Выход скалера идет в
pca. Он делаетfit_transform. - Выход PCA идет в
model. Она делаетfit.
Когда вы вызываете pipe.predict(X_test):
- Данные идут в
scaler(толькоtransform!). - Потом в
pca(толькоtransform!). - Потом в
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 используйте, когда пространство параметров слишком велико.