Scikit-learn — регрессия и классификация
Что такое Scikit-learn и табличное машинное обучение
Scikit-learn — стандартная библиотека для табличного машинного обучения на Python — регрессия, классификация, кластеризация, предобработка и оценка моделей в едином API. Данные в sklearn — массивы NumPy; базовые операции — NumPy — массивы и матрицы. Для изображений, длинных текстов и больших нейросетей обычно переходят к TensorFlow или PyTorch — см. Keras и TensorFlow. Обзор всех типов обучения — в Машинное обучение; практический end-to-end пример — проект Melbourne.
Если вы хотите приступить сразу к первым шагам - есть практикум - Первые шаги в анализе табличных данных.
Табличное машинное обучение (Tabular Machine Learning) — это подобласть искусственного интеллекта, которая занимается созданием и обучением алгоритмов для работы со структурированными данными, представленными в виде таблиц (строк и столбцов). В отличие от работы с текстом, изображениями или аудио, здесь каждая строка является отдельным объектом наблюдения, а каждый столбец — конкретным признаком этого объекта. Это самый распространенный в реальном бизнесе тип машинного обучения. На нем строятся банковские скоринги, прогнозы продаж, медицинская диагностика и рекомендательные системы интернет-магазинов.
В отличие от однородных сигналов (например, пикселей на фото), таблицы обладают уникальной спецификой:
- Гетерогенность признаков: в одной таблице могут одновременно находиться числа (возраст, доход), категориальные данные (город, пол), даты и бинарные флаги (да/нет).
- Отсутствие пространственной связи: если поменять местами два столбца в таблице, смысл данных не изменится. В картинках или тексте случайная перестановка элементов разрушит весь контекст.
- Пропуски и шум: реальные бизнес-таблицы почти всегда содержат незаполненные ячейки, выбросы и ошибки ввода, которые модели должны уметь обрабатывать.
В табличном машинном обучении исторически и до сих пор доминируют классические методы, а не глубокие нейросети.
- Деревья решений и их ансамбли. Одиночные деревья решений легко интерпретировать, но они склонны к переобучению.
- Градиентный бустинг (Gradient Boosting). Абсолютный лидер для табличных задач. Алгоритмы последовательно строят деревья решений, где каждое следующее исправляет ошибки предыдущих. Главные библиотеки-флагманы - XGBoost, LightGBM и CatBoost.
- Случайный лес (Random Forest). Построение множества независимых деревьев решений и усреднение их ответов. Отличается высокой стабильностью.
- Глубокое обучение (Deep Learning). Нейросети (например, специализированные архитектуры вроде TabNet) используются реже, так как требуют огромного объема данных, долго обучаются и часто уступают бустингу в качестве на таблицах.
- Автоматическое машинное обучение (AutoML). Фреймворки, которые сами подбирают лучшую модель, обрабатывают признаки и настраивают гиперпараметры для конкретной таблицы.
Если табличное машинное обучение — это теория и архитектура, то scikit-learn — это главный рабочий инструмент, в котором уже написан код для решения всех этих задач. Вам не нужно программировать алгоритмы с нуля; библиотека позволяет вызвать их одной строчкой.
Библиотека имеет очень четкую структуру. Каждому нашему шагу и типу задач внутри неё соответствует конкретный модуль.
Когда достаточно scikit-learn
| Задача | Типичные алгоритмы sklearn |
|---|---|
| Прогноз числа (цена, спрос) | LinearRegression, GradientBoostingRegressor, RandomForestRegressor |
| Категория (спам, отток) | LogisticRegression, RandomForestClassifier, SVC |
| Группы без меток | KMeans, DBSCAN |
| Сжатие признаков | PCA, TruncatedSVD |
Прогноз числа (цена, спрос) — это задача регрессии в машинном обучении, цель которой заключается в предсказании точного непрерывного числового значения для каждого объекта на основе имеющихся признаков. В отличие от классификации (где модель выбирает категорию, например «купит» или «не купит»), здесь результатом работы алгоритма всегда является конкретная величина.
Прогноз цены - это когда модель вычисляет справедливую рыночную стоимость объекта.
Прогноз спроса - это когда модель определяет, сколько единиц конкретного товара купят в будущем периоде.
Поскольку модель редко угадывает число со стопроцентной точностью, ошибку измеряют специальными метриками:
- MAE (Mean Absolute Error): средняя абсолютная ошибка. Показывает, на сколько единиц в среднем ошибается модель (например,
«ошибка в прогнозе цены составляет ±500 рублей»). - RMSE (Root Mean Squared Error): среднеквадратичная ошибка. Наказывает модель за крупные промахи сильнее, чем за мелкие.
- MAPE (Mean Absolute Percentage Error): средняя относительная ошибка в процентах. Показывает отклонение в процентах (например,
«модель ошибается в спросе в среднем на 5%»).
Категория (спам, отток) — это результат решения задачи классификации в машинном обучении, где цель модели — отнести объект (письмо, клиента, транзакцию) к одной из заранее известных групп (классов). В отличие от прогнозирования чисел (регрессии), здесь модель выдает метку класса (например, «Да/Нет», «Спам/Не спам») или вероятность принадлежности объекта к этому классу.
Классификация «Спам / Не спам» (Бинарная классификация) - когда модель разделяет входящий поток сообщений на две изолированные группы.
Прогноз оттока клиентов (Churn Prediction) - когда модель выявляет клиентов, которые с высокой вероятностью планируют перестать пользоваться услугами компании (банка, телеком-оператора, сервиса подписок).
Просто посчитать процент правильных ответов (Accuracy) часто нельзя. Если в банке уходит 1% клиентов, а модель всегда говорит «никто не уйдет», ее точность будет 99%, но она абсолютно полезна. Поэтому используют другие метрики:
- Precision (Точность): какая доля объектов, которым модель присвоила категорию «Спам», реально оказалась спамом. Защищает от ложных срабатываний.
- Recall (Полнота): какую долю из всего реального спама модель смогла найти и поймать. Защищает от пропуска важных событий.
- F1-score: сбалансированная метрика, которая объединяет Precision и Recall в одно число.
Группы без меток — это описание задачи кластеризации в машинном обучении, которая относится к разделу обучения без учителя (Unsupervised Learning). В отличие от классификации (где мы заранее знаем категории «спам» или «отток»), в данных без меток нет готовых правильных ответов. Модель самостоятельно анализирует свойства объектов и объединяет их в похожие группы (кластеры) на основе скрытых паттернов и связей.
У вас есть база данных из 10 000 покупателей с их историей покупок, средним чеком и возрастом. У вас нет метки «категория клиента». Модель анализирует данные и делит людей на группы:
- Группа 1: Молодежь, покупают редко, но дорогие вещи (гаджеты).
- Группа 2: Семейные люди, покупают стабильно раз в неделю, средний чек высокий (продукты, товары для дома).
- Группа 3: Экономные покупатели, приходят только во время распродаж и акций.
Результат: Бизнес понимает, кому какую рекламу отправлять, хотя изначально никаких групп не было.
Поиск аномалий и мошенничества (Anomaly Detection) подразумевает, что модель изучает миллионы «обычных» банковских транзакций (без меток «фрод»). Все они ложатся в один большой плотный кластер. Если появляется транзакция с нетипичным поведением (например, перевод ночью в другую страну), она оказывается далеко от основной группы. Модель маркирует её как подозрительную.
Главный принцип кластеризации — геометрическое расстояние. Каждый объект (клиент, товар) представляется как точка в многомерном пространстве признаков. Модель группирует точки так, чтобы:
- Расстояние между объектами внутри одной группы было минимальным (максимальное сходство).
- Расстояние между самими группами было максимальным (четкое разделение).
Сжатие признаков (Feature Reduction / Dimensionality Reduction) — это процесс уменьшения количества столбцов (признаков) в таблице данных при максимальном сохранении полезной информации.
В машинном обучении этот процесс также называют снижением размерности. Представьте, что у вас есть анкета клиента из 500 вопросов; сжатие признаков позволяет сократить её, например, до 15 главных показателей, не теряя сути.
Почему вся индустрия любит sklearn? Из-за единого и простого интерфейса. Какую бы сложную задачу вы ни решали (сжатие признаков, классификацию или регрессию), код всегда пишется по одной и той же схеме из трех шагов:
- Создание модели:
model = KMeans()илиmodel = RandomForestClassifier(); - Обучение на таблице:
model.fit(X, y)(передаем данные); - Предсказание или трансформация:
predictions = model.predict(X_new).
Несмотря на свое величие, sklearn — это инструмент для классического табличного ML. Он не подходит для:
- Глубокого обучения (Нейросетей): для этого используют PyTorch или TensorFlow.
- Продвинутого бустинга: упоминавшиеся ранее короли табличного ML — XGBoost, LightGBM и CatBoost — это отдельные библиотеки, хотя они полностью копируют интерфейс sklearn, чтобы дата-сайентистам было удобно с ними работать.
Данные — таблица: строки — объекты, столбцы — признаки. Перед обучением нужны кодирование категорий и честное разбиение train/test.
Единый контракт API
Почти все модели sklearn поддерживают три метода:
fit(X, y)— обучение;predict(X)— прогноз;score(X, y)— быстрая оценка (для классификаторов — accuracy по умолчанию).
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.25, random_state=42, stratify=y
)
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)
print(clf.score(X_test, y_test))
.fit() — это главный метод (команда) в библиотеке scikit-learn, который запускает процесс обучения модели на ваших данных. С английского слова to fit переводится как «подгонять», «настраивать» или «адаптировать». Когда вы вызываете эту команду, алгоритм смотрит на предоставленную ему таблицу, ищет в ней закономерности и подстраивает свои внутренние математические параметры под ваши данные.
.predict() — это метод (команда) в библиотеке scikit-learn, который заставляет уже обученную модель сделать предсказание для новых данных. Если метод .fit() — это процесс обучения и зубрежки правил, то .predict() — это экзамен или применение знаний на практике. Модель берет характеристики новых объектов, подставляет их в формулу, которую она вывела во время обучения, и выдает готовый ответ.
.predict(X_test) возвращает вам огромный список конкретных предсказаний для каждого объекта (например: [150.2, 84.1, 110.5]). Вы сами должны сидеть и сравнивать их с реальностью.
.score(X_test, y_test) сам берет эти предсказания, сравнивает их с правильными ответами y_test и возвращает вам всего одно итоговое число (например: 0.84), отражающее общий успех.
.score() — это метод в библиотеке scikit-learn, который позволяет одной строчкой кода узнать, насколько хорошо или плохо обучилась ваша модель. Если .fit() — это учеба, а .predict() — это ответы на экзамене, то .score() — это финальная оценка в зачетке. Метод берет тестовые данные (которые модель еще не видела), делает для них предсказания, сравнивает их с правильными ответами и выдает итоговый балл качества.
Регрессия — прогноз числа
Регрессия — это математический термин, который в машинном обучении означает предсказание конкретного непрерывного числа на основе имеющихся признаков. Слово «непрерывное» здесь ключевое: модель регрессии может выдать абсолютно любое число на числовой прямой (например, цена квартиры может быть 5 450 120 рублей, а может 12 300 000 рублей).
Регрессия предсказывает непрерывную величину y (цена, температура, время доставки).
Код ITЗагрузка примера кода…
| Метрика | Смысл |
|---|---|
| MAE | Средняя абсолютная ошибка в единицах целевой переменной |
| RMSE | Штрафует крупные промахи сильнее MAE |
| R² | Доля дисперсии, объяснённая моделью (1.0 — идеально на train, на test обычно ниже) |
Сквозной пример с GradientBoostingRegressor и GridSearchCV — Мельбурн. Пошаговая линейная регрессия с coef_ — Lab 1159 — Insurance.
Интерпретация coef_ и intercept_
Линейная регрессия (Linear Regression) - это самый простой базовый метод. Он пытается провести прямую линию (или плоскость) через все точки данных так, чтобы она проходила максимально близко к каждой из них. Формула выглядит как в школе: y = kx + b.
В линейной регрессии атрибуты coef_ и intercept_ — это те самые внутренние математические параметры, которые модель находит и запоминает во время выполнения команды .fit().
После LinearRegression().fit(X, y):
intercept_— прогноз при нулевых признаках (смещение прямой);coef_[i]— на сколько в среднем меняетсяy, если признакiувеличить на 1 (остальные фиксированы).
intercept_ (с англ. «точка пересечения») — это базовое значение прогноза, когда все входные признаки равны нулю. Графически это точка, в которой линия регрессии пересекает вертикальную ось Y.
Если признаки — это Площадь и Количество комнат, то intercept_ — это гипотетическая стоимость квартиры площадью 0 кв.м. с 0 комнат. Часто это число не имеет физического смысла и служит просто математической отправной точкой для калибровки модели.
coef_ (сокращение от coefficients) — это массив чисел, где каждый коэффициент жестко привязан к своему столбцу (признаку) из таблицы. Знак коэффициента (+ или -) указывает на направление связи. Плюс — показатель растет, минус — показатель падает. Величина коэффициента показывает, на сколько единиц изменится прогноз (y), если конкретный признак (x) увеличится ровно на 1 единицу (при условии, что все остальные признаки останутся неизменными).
Сравнивать коэффициенты между собой напрямую, чтобы понять «какой признак важнее», можно только если данные масштабированы (приведены к общему диапазону, например, от 0 до 1). Если один признак измеряется в миллиметрах (большие числа), а другой — в тоннах (маленькие числа), модель подстроит коэффициенты под эти масштабы. В итоге коэффициент при тоннах будет огромным, а при миллиметрах — крошечным, но это не значит, что тонны важнее для прогноза.
import matplotlib.pyplot as plt
import numpy as np
from sklearn.linear_model import LinearRegression
# один признак для наглядности
X1 = np.array([[1], [2], [3], [4], [5]], dtype=float)
y1 = np.array([2.1, 4.0, 5.9, 8.2, 10.0])
reg = LinearRegression()
reg.fit(X1, y1)
print("intercept:", reg.intercept_)
print("coef:", reg.coef_)
x_line = np.linspace(0, 6, 50)
plt.scatter(X1, y1, label="данные")
plt.plot(x_line, reg.predict(x_line.reshape(-1, 1)), "r", label="модель")
plt.legend(); plt.grid(alpha=0.3); plt.show()
На нескольких признаках уравнение: y = b + w₁x₁ + w₂x₂ + …. Знак w — направление связи; величина — сила при линейной модели.
МНК vs градиентный спуск (SGDRegressor)
В библиотеке scikit-learn линейную регрессию можно обучить двумя принципиально разными путями: классическим методом LinearRegression (использует МНК) и стохастическим градиентным спуском SGDRegressor.
МНК — это аналитический (точный) способ решения. Модель не угадывает коэффициенты, а находит их за один шаг с помощью точной математической формулы линейной алгебры (через матричные операции). Находит глобальный минимум ошибки мгновенно, решая уравнение системы. Выдает математически идеальные, максимально точные коэффициенты для текущих данных. Не требует настройки скорости обучения.
Стохастический градиентный спуск (SGD) — это численный (приближенный) способ решения. Модель начинает с абсолютно случайных коэффициентов, а затем циклически улучшает их. Модель берет маленькую порцию данных (батч) или даже одну случайную строку, считает ошибку и делает небольшой шаг (градиент) в сторону уменьшения этой ошибки. Процесс повторяется много раз (эпох), пока ошибка не перестанет падать. Невероятная экономия памяти. Модели не нужно загружать в RAM всю гигантскую таблицу целиком, данные можно подавать порциями.
LinearRegression | SGDRegressor | |
|---|---|---|
| Метод | Закрытая формула (МНК) | Итеративный градиентный спуск |
| Масштаб данных | Устойчив на малых таблицах | Чувствителен — нужен StandardScaler |
| Большие данные | Медленнее на миллионах строк | Потоковое partial_fit |
| Когда брать | Дефолт для учебных таблиц | Онлайн-обучение, очень большие матрицы |
from sklearn.linear_model import SGDRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
sgd_pipe = Pipeline([
("scaler", StandardScaler()),
("reg", SGDRegressor(max_iter=5000, tol=1e-3, random_state=42)),
])
sgd_pipe.fit(X_train, y_train)
Идея градиентного спуска — в перцептроне на NumPy; Keras делает то же автоматически.
Классификация — прогноз категории
Классификация — это фундаментальная задача машинного обучения, цель которой заключается в определении принадлежности объекта к одной из заранее известных категорий (классов) на основе его признаков.
Если в регрессии мы предсказывали непрерывное число (например, цену), то в классификации ответом модели всегда является дискретная метка (категория), выбранная из фиксированного списка.
В отличие от человека, который мыслит образами, алгоритм классификации под капотом работает с числами и вероятностями. Процесс состоит из двух шагов:
- Расчет вероятности: Модель анализирует признаки объекта и вычисляет, с какой вероятностью (от 0 до 1) он принадлежит к каждому из классов. Например: «Вероятность того, что это письмо спам — 88%, а что обычное — 12%».
- Принятие решения (Порог отсечения): По умолчанию в бинарной классификации установлен порог 0.5 (50%). Если вероятность класса выше этого порога, модель присваивает объекту финальную текстовую или числовую метку (категорию).
Классификация предсказывает метку класса — 0/1, "кошка"/"собака", один из нескольких видов.
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
clf = LogisticRegression(max_iter=500)
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
При дисбалансе классов (99% "не спам", 1% "спам") accuracy вводит в заблуждение. Смотрите precision, recall, F1 и матрицу ошибок — подробнее в разделе метрик Машинное обучение.
В зависимости от структуры бизнес-задачи, классификация делится на три основных типа:
- Бинарная (Binary Classification): Выбор строго из двух вариантов. Самый популярный тип в реальном секторе.Примеры: Транзакция мошенническая (1) или честная (0); Клиент уйдет (1) или останется (0); Опухоль злокачественная (1) или доброкачественная (0).
- Многоклассовая (Multiclass Classification): Вариантов больше двух, но объект может принадлежать только к одной категории.Примеры: Определение типа животного по характеристикам (собака, кошка или попугай); Сортировка писем в поддержке (жалоба, инвойс, технический баг).
- Многотемная / С множественными метками (Multilabel Classification): Объект может одновременно относиться к нескольким категориям.Пример: Классификация фильма по жанрам (одно кино может получить категории «боевик», «комедия» и «фантастика» одновременно).
Как читать confusion matrix
Confusion Matrix (Матрица ошибок / Матрица неточностей) — это таблица, которая наглядно показывает, насколько хорошо алгоритм классификации справился с предсказанием категорий. Она детально расписывает, где именно модель ответила правильно, а в каких классах и как именно она ошиблась. Название происходит от слова confuse (путать), так как матрица буквально показывает, какие категории модель путает между собой.
| Аббревиатура | Название | Значение | Пример в задаче оттока |
|---|---|---|---|
| TP | True Positive | Модель предсказала 1, факт — 1 | Клиент ушел, модель это предсказала |
| TN | True Negative | Модель предсказала 0, факт — 0 | Клиент остался, модель это предсказала |
| FP | False Positive | Модель предсказала 1, факт — 0 | Модель предупредила об оттоке, но клиент лоялен |
| FN | False Negative | Модель предсказала 0, факт — 1 | Модель не заметила уход, клиент молча ушел |
Для бинарной классификации (классы 0 и 1) матрица 2×2:
| Предсказано 0 | Предсказано 1 | |
|---|---|---|
| Истина 0 | TN (верно «нет») | FP (ложная тревога) |
| Истина 1 | FN (пропуск) | TP (верно «да») |
from sklearn.metrics import ConfusionMatrixDisplay
cm = confusion_matrix(y_test, y_pred)
ConfusionMatrixDisplay(cm, display_labels=["class_0", "class_1"]).plot()
- Accuracy = (TP + TN) / всего — доля всех верных ответов.
- Recall для класса 1 = TP / (TP + FN) — сколько реальных «единиц» нашли.
- Precision для класса 1 = TP / (TP + FP) — сколько из предсказанных «единиц» верны.
Сквозной пример с тремя моделями — Lab 1157 — Titanic; spam и TF-IDF — Lab 1158.
predict_proba(X) возвращает вероятности по классам — удобно для порога "срабатывания" в проде.
У логистической регрессии знак coef_[i] показывает, как признак влияет на лог-шанс класса 1; модуль — сила при прочих равных. На Titanic удобно сравнить, какой признак сильнее связан с выживанием.
Pipeline — без утечки данных
Pipeline (конвейер) в scikit-learn — это инструмент, который объединяет все шаги подготовки данных и финальное обучение модели в один единый, неделимый объект. Главная цель использования Pipeline — гарантированная защита от утечки данных (Data Leakage) во время валидации модели.
Утечка данных — это ошибка, при которой информация из будущего (из тестового набора) случайно попадает в прошлое (тренировочный набор) во время предобработки. Из-за этого модель на тесте показывает идеальные результаты, а на реальных данных полностью проваливается.
Ошибка новичка: сначала StandardScaler на всей таблице, потом train_test_split. Статистики scaler "видят" test — метрики завышаются.
- Вы взяли всю таблицу и заполнили в ней пропуски средним значением (SimpleImputer).
- Вы отмасштабировали всю таблицу через StandardScaler.
- Вы разбили данные на train и test.
В чем ошибка? StandardScaler посчитал среднее и отклонение по всей таблице. Это значит, что тренировочные данные уже «узнали» распределение, максимум и минимум тестовых данных. Это и есть утечка. При кросс-валидации эта ошибка множится на количество фолдов.
Pipeline строго изолирует шаги трансформации. Он устроен так, что при запуске обучения методы предобработки рассчитывают свои внутренние параметры (например, среднее для масштабирования) строго на тренировочном куске, а к тестовому куску они эти параметры просто применяют.
Внутри Pipeline все промежуточные шаги обязаны быть трансформерами (иметь методы .fit() и .transform()), а финальный шаг — эстиматором (иметь метод .fit() и .predict()). Их называют трансформерами (Transformers) именно потому, что их главная и конечная цель — преобразовать (transform) данные из одного вида в другой. Они берут вашу таблицу на входе и выдают измененную таблицу на выходе.
Любой класс в sklearn, который официально считается трансформером (например, StandardScaler, SimpleImputer, OneHotEncoder или PCA), обязан иметь эти методы.
В sklearn есть четкое разделение ролей, чтобы не путать задачи:
- Трансформер (Transformer): Меняет форму или содержание данных, изменяет признаки таблицы. Главный метод: .
transform(). Пример: Был столбец с пропусками - стал столбец без пропусков. - Эстиматор / Оценщик (Estimator / Model): Строит прогнозы на основе данных, предсказывает ответы. Главный метод: .
predict(). Пример: Была строка с характеристиками квартиры - модель выдала число (цену). У моделей (линейная регрессия, случайный лес) метода.transform()вообще нет, потому что они данные не переделывают.
В классическом машинном обучении (в scikit-learn) «трансформер» — это простой инструмент предобработки данных, названный так из-за метода .transform().
В глубоком обучении (Deep Learning) существует архитектура нейросетей Transformer (на которой работают GPT-4, Claude и другие языковые модели). Они называются так потому, что трансформируют последовательности векторов (слов) через механизм внимания (Attention). Это совершенно другая технология, хотя лингвистический корень у названий один.
Pipeline объединяет предобработку и модель; fit на train применяет scaler только к train.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
pipe = Pipeline([
("scaler", StandardScaler()),
("clf", SVC(kernel="rbf", probability=True)),
])
pipe.fit(X_train, y_train)
print(pipe.score(X_test, y_test))
Тот же pipeline можно передать в GridSearchCV — перебор гиперпараметров внутри кросс-валидации на train.
Подбор гиперпараметров
Гиперпараметры — это внешние настройки алгоритма машинного обучения, которые разработчик задает вручную перед началом обучения модели. Они определяют правила, по которым модель будет учиться, но сами в процессе обучения не меняются.
Если провести аналогию с человеком, то гиперпараметры — это методика обучения: сколько часов в день учиться, какую литературу читать и насколько строго наказывать за ошибки.
Код ITЗагрузка примера кода…
Параметры (внутренние): Модель находит и подбирает их сама во время выполнения команды .fit(). Это те самые коэффициенты coef_ и intercept_ в линейной регрессии или веса в нейросетях. Влиять на них напрямую программист не может.
Гиперпараметры (внешние): Задаются программистом до запуска .fit(). Модель не может изменить их самостоятельно. Они управляют тем, как именно модель будет искать свои внутренние параметры.
cv=5 — пять фолдов на train; test остаётся для финального отчёта один раз.
В зависимости от модели, гиперпараметры бывают самыми разными:
- Для дерева решений (DecisionTreeClassifier):
- max_depth (максимальная глубина) — сколько этажей вопросов может задать дерево. Если сделать слишком глубоким — модель переобучится.
- min_samples_split — минимальное количество объектов в узле, чтобы дерево продолжало делиться.
- Для градиентного спуска (SGDRegressor):
- learning_rate (скорость обучения) — размер шага, с которым алгоритм спускается к минимуму ошибки. Слишком большой шаг — проскочим минимум, слишком маленький — будем учиться вечность.
- max_iter — максимальное количество эпох (повторений) обучения.
- Для метода К-ближайших соседей (KNeighborsClassifier):
- n_neighbors — количество соседей, на которых модель смотрит при принятии решения.
Поскольку заранее предугадать идеальные настройки под конкретную таблицу невозможно, дата-сайентисты используют автоматический перебор. В scikit-learn для этого есть два главных инструмента:
- GridSearchCV (Поиск по сетке): Вы передаете список возможных вариантов (например,
max_depth: [3, 5, 10]), и алгоритм в лоб перебирает вообще все комбинации, оценивая качество каждой на кросс-валидации. - RandomizedSearchCV (Случайный поиск): Вместо полного перебора алгоритм берет случайные комбинации параметров из заданного диапазона. Это работает в разы быстрее на больших данных и часто находит параметры не хуже, чем поиск по сетке.
Сохранение модели
Сохранение обученной модели (или всего Pipeline целиком) на диск — это финальный шаг разработки. После этого файл с моделью можно перенести на рабочий сервер (в продакшн), где разработчики будут использовать его для прогнозов через метод .predict().
В экосистеме Python и scikit-learn для этого есть два главных инструмента: встроенный модуль pickle и библиотека joblib.
pickle — это стандартный встроенный инструмент Python для сохранения любых объектов. Хорош для простых и небольших моделей.
joblib — это сторонняя библиотека, которая оптимизирована специально для машинного обучения. Если ваша модель весит много (например, RandomForest, где внутри тысячи деревьев и миллионы весов), joblib сохранит и загрузит её на диск в разы быстрее, эффективно сжимая большие числовые массивы данных. В табличном ML joblib является золотым стандартом.
Перед использованием убедитесь, что библиотека установлена (pip install joblib).
import joblib
joblib.dump(pipe, "model.joblib")
loaded = joblib.load("model.joblib")
loaded.predict(X_test[:1])
В проде версионируйте и модель, и схему признаков (имена и типы столбцов), иначе после переобучения API сломается.
При сохранении моделей в файлы формата .pkl или .joblib есть критически важные нюансы, о которых часто забывают новички:
- Версии библиотек должны строго совпадать: Файл хранит не исходный код алгоритма, а структуру его внутренних параметров. Если вы обучили модель на компьютере с scikit-learn версии 1.4, а на сервере стоит версия 1.2, модель вызовет ошибку при загрузке или, что еще хуже, начнет выдавать некорректные предсказания. Вместе с моделью всегда фиксируйте версии библиотек (файл
requirements.txt). - Не загружайте чужие
pkl-файлы из интернета: Форматpickleпозволяет исполнять произвольный код в момент загрузки файла. Если злоумышленник подменит файл модели, при вызове команды.load()на вашем компьютере может запуститься вредоносный скрипт. Загружайте только те модели, которые обучили вы сами или ваша команда. - Сохраняйте Pipeline, а не просто модель: Если перед обучением вы масштабировали данные через StandardScaler или заполняли пропуски, сохраняйте в файл весь Pipeline целиком. Иначе на сервере вам придется вручную писать код предобработки, что приведет к багам. При загрузке пайплайна в нем восстановятся и настройки масштабирования, и сама модель.
Если вы не хотите устанавливать лишние библиотеки, можно использовать стандартный подход Python. Для записи файлов используется менеджер контекста with и бинарный режим записи ('wb' / 'rb').
Связь с другими материалами
| Тема | Статья |
|---|---|
| Алгоритмы (деревья, SVM, бустинг) | Алгоритмы ИИ |
| Titanic — LR, дерево, Keras | Lab 1157 |
| Insurance — регрессия charges | Lab 1159 |
| Diabetes — logistic + NN | Lab 1160 |
| Spam — TF-IDF | Lab 1158 |
| Pandas и EDA | Python для анализа |
| Нейросети, изображения, текст | Keras и TensorFlow, распознавание |
| Облачные API без своего обучения | Cognitive Services |