Перейти к основному содержимому

Классическое машинное обучение на Python

Разработчику

См. также: Анализ данных · Pandas — практикум · PyTorch для разработчика · раздел «ИИ»

Место scikit-learn в стеке

scikit-learn — библиотека классического машинного обучения: табличные признаки, интерпретируемые модели, быстрые эксперименты на CPU. Она опирается на NumPy и часто на pandas для подготовки данных — см. обзор анализа и практикум pandas.

Глубокое обучение (нейросети, изображения, большие языковые модели) — отдельный путь: PyTorch и раздел нейросети. scikit-learn остаётся актуальным для baseline, отчётов, малого объёма данных и задач без GPU.

Установка:

pip install scikit-learn pandas

Типы задач

ЗадачаПримерыМетрики
КлассификацияСпам / не спам, категория товараaccuracy, F1, ROC-AUC
РегрессияПрогноз цены, спросаMAE, RMSE, R²
КластеризацияСегменты клиентов без метокsilhouette, визуальный разбор
Понижение размерностиВизуализация, сжатие признаковобъяснённая дисперсия (PCA)

Данные почти всегда представляют матрицей X (признаки) и вектором y (целевая переменная для обучения с учителем).


Минимальный пример классификации

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

df = pd.read_csv("customers.csv")
X = df[["age", "orders_count", "avg_check"]]
y = df["churn"]

X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)

scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train)
X_test_s = scaler.transform(X_test)

model = LogisticRegression(max_iter=1000)
model.fit(X_train_s, y_train)
pred = model.predict(X_test_s)

print(classification_report(y_test, pred))

Ключевые идеи:

  • train_test_split — отделить тест, на котором не учимся, чтобы оценить обобщение;
  • fit только на train для StandardScaler, иначе утечка информации из теста;
  • stratify=y — сохранить доли классов в train/test при дисбалансе.

Pipeline — единый контракт

Чтобы не забыть шаги препроцессинга при предсказании в продакшене, шаги объединяют в Pipeline:

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

numeric_features = ["age", "orders_count"]
categorical_features = ["region"]

preprocess = ColumnTransformer(
transformers=[
("num", StandardScaler(), numeric_features),
("cat", OneHotEncoder(handle_unknown="ignore"), categorical_features),
]
)

pipe = Pipeline([
("prep", preprocess),
("clf", LogisticRegression(max_iter=1000)),
])

pipe.fit(X_train, y_train)
pipe.score(X_test, y_test)

Один объект pipe сериализуют (joblib.dump) и загружают на сервер — признаки обрабатываются так же, как при обучении.


Подбор гиперпараметров

from sklearn.model_selection import GridSearchCV

param_grid = {"clf__C": [0.1, 1.0, 10.0]}
search = GridSearchCV(pipe, param_grid, cv=5, scoring="f1_macro")
search.fit(X_train, y_train)
print(search.best_params_, search.best_score_)

Cross-validation (cv=5) оценивает качество на нескольких разбиениях train, не трогая финальный test.


Популярные модели (кратко)

МодельСильные стороны
LogisticRegressionБыстрый baseline, интерпретируемые веса
RandomForestClassifierНелинейности, устойчивость к выбросам
GradientBoostingClassifier / HistGradientBoostingВысокое качество на таблицах
KMeansКластеризация без меток
PCAСжатие и визуализация

Выбор модели зависит от объёма данных, необходимости объяснимости и латентности inference.


Типичные ошибки

  1. Обучение на всём датасете и отчёт accuracy на тех же строках — завышенные метрики.
  2. Утечка целевой переменной в признаки (например, «сумма возврата» при предсказании «будет ли возврат»).
  3. Разные распределения train и prod — модель деградирует без переобучения или мониторинга drift.
  4. Игнорирование дисбаланса классов — смотреть F1 / balanced accuracy, а не только accuracy.

Когда переходить к PyTorch

  • изображения, звук, текст длиной в тысячи токенов;
  • нужна тонкая архитектура сети и GPU;
  • transfer learning с предобученными весами.

До этого разумно зафиксировать baseline на scikit-learn — он часто занимает часы, а не недели.


Связанные материалы


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).