Проблема «слепой веры» в AI-код
Генеративные модели все чаще берут на себя рутинную часть написания кода для машинного обучения. Однако они склонны использовать стандартные значения параметров (defaults) библиотек, не учитывая специфику данных. В scikit-learn, одной из самых популярных библиотек Python, такие «тихие» настройки могут привести к серьезным ошибкам в оценке качества модели или даже к утечке данных.
1. Stratified K-Fold: Критично для несбалансированных данных
По умолчанию функция cross_val_score использует KFold, который просто разбивает данные на части. Если ваш датасет несбалансирован (например, 95% классов A и 5% класса B), случайная выборка может оставить класс B полностью в тестовой или обучающей выборке. Это сделает метрики (accuracy, F1) бессмысленными.
Решение: Всегда используйте StratifiedKFold для задач классификации, чтобы сохранить пропорции классов в каждой фолде.
2. Random State: Воспроизводимость результатов
Многие алгоритмы (например, RandomForestClassifier или train_test_split) используют случайность. Если не задать random_state, каждый запуск кода будет давать разные результаты. В продакшене это недопустимо: вы не сможете отладить модель или воспроизвести баг.
Решение: Фиксируйте random_state на этапе разработки и тестирования.
3. StandardScaler: Fit только на train, transform на test
AI-ассистенты часто применяют StandardScaler ко всему датасету сразу. Это приводит к data leakage (утечке данных): статистика (среднее и стандартное отклонение) рассчитывается на основе тестовых данных, которые модель «видела» до обучения. В реальном мире вы не знаете статистики новых данных заранее.
Правильный паттерн:
scaler.fit_transform(X_train)scaler.transform(X_test)(без fit!)
4. Max Iterations в логистической регрессии
По умолчанию LogisticRegression имеет max_iter=100. Для сложных датасетов этого часто недостаточно для сходимости алгоритма. Модель может остановиться на локальном оптимуме, выдав заниженную точность, а в логах вы увидите предупреждение, которое легко пропустить.
Решение: Увеличьте max_iter (например, до 1000) или используйте solver 'lbfgs' с явным указанием лимита.
5. Class Weights в Imbalanced Data
При работе с несбалансированными данными алгоритмы по умолчанию оптимизируют общую точность, игнорируя меньший класс. Модель может просто всегда предсказывать мажоритарный класс, получая 95% accuracy, но нулевой F1-score для целевого класса.
Решение: Используйте class_weight='balanced' в классификаторах (SVM, Random Forest, Logistic Regression) для автоматической корректировки весов ошибок.
Итоговая таблица: Дефолты vs Продакшен
| Параметр/Настройка | Значение по умолчанию | Риск в продакшене | Рекомендация |
|---|---|---|---|
| Кросс-валидация | KFold | Искажение метрик на несбалансированных данных | StratifiedKFold |
| Скейлинг данных | Применение ко всему датасету | Data Leakage (утечка тестовых данных) | Fit на train, Transform на test |
| Логистическая регрессия | max_iter=100 | Несходимость алгоритма, ложная уверенность | max_iter=1000+ |
| Баланс классов | None (равные веса) | Игнорирование редкого класса | class_weight='balanced' |
| Воспроизводимость | Random (нет seed) | Невозможность отладки и воспроизведения | Фиксация random_state |
Проверка этих «невидимых» настроек — обязательный этап Code Review для любого AI-генерированного кода перед запуском в production.
Источник: Towards Data Science ↗
