scikit-learn
| Автор | Давид Курнапо (Google Summer of Code, 2007) |
|---|---|
| Первый публичный выпуск | 2010 (INRIA) |
| Язык | Python, Cython |
| Зависимости | NumPy, SciPy, joblib |
| Лицензия | BSD 3-Clause |
| Импорт | import sklearn |
| Сайт | scikit-learn.org |
scikit-learn (sklearn) — свободная библиотека Python для классического машинного обучения: классификации, регрессии, кластеризации, понижения размерности, предобработки данных и оценки моделей. Она построена поверх NumPy и SciPy и знаменита единообразным интерфейсом: любая модель обучается методом fit и делает предсказания методом predict. Для табличных данных среднего размера scikit-learn — стандартная отправная точка; глубокое обучение в ней не реализуется — для этого есть PyTorch.[1]
История
Проект начал Давид Курнапо в 2007 году в рамках Google Summer of Code как дополнение («scikit») к SciPy. В 2010 году разработку подхватили исследователи французского института INRIA, выпустив первую публичную версию; статья в JMLR 2011 года стала одной из самых цитируемых в области.[2] Версия 1.0 вышла в 2021 году. Проект развивается сообществом при поддержке фонда и компании Probabl, созданной ключевыми разработчиками.
Дизайн API
Все объекты следуют нескольким соглашениям:[3]
- Оценщик (estimator) — любой объект с методом
fit(X, y); гиперпараметры задаются в конструкторе. - Предсказатель — добавляет
predict, для классификаторов такжеpredict_proba, иscore. - Преобразователь (transformer) —
transformиfit_transform: масштабирование, кодирование, отбор признаков. - Выученные параметры имеют суффикс подчёркивания:
coef_,classes_. - Данные — массивы NumPy, таблицы pandas или разреженные матрицы.
Благодаря этому модели взаимозаменяемы: сменить логистическую регрессию на случайный лес — одна строка.
Что внутри
| Раздел | Примеры |
|---|---|
| Линейные модели | LinearRegression, Ridge, Lasso, LogisticRegression |
| Деревья и ансамбли | DecisionTreeClassifier, RandomForestClassifier, HistGradientBoostingClassifier |
| Прочие модели | SVM, k ближайших соседей, наивный Байес |
| Кластеризация | KMeans, DBSCAN, AgglomerativeClustering |
| Понижение размерности | PCA, TruncatedSVD |
| Предобработка | StandardScaler, OneHotEncoder, SimpleImputer |
| Оценка | train_test_split, cross_val_score, GridSearchCV, метрики |
Задачи с учителем и без разобраны в статье Обучение с учителем и без; выбрать подходящую модель помогает официальная «карта оценщиков».[5]
Конвейеры
Pipeline и ColumnTransformer объединяют предобработку и модель в один объект. Это не только удобно, но и защищает от утечки данных: масштабирование и заполнение пропусков обучаются только на обучающей части каждого фолда.[4]
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
pre = ColumnTransformer([
("num", StandardScaler(), ["age", "income"]),
("cat", OneHotEncoder(handle_unknown="ignore"), ["city"]),
])
pipe = Pipeline([("pre", pre), ("clf", HistGradientBoostingClassifier())])
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=0)
search = GridSearchCV(pipe, {"clf__learning_rate": [0.05, 0.1],
"clf__max_depth": [3, None]}, cv=5, scoring="roc_auc")
search.fit(X_train, y_train)
print(search.best_params_, search.score(X_test, y_test))
Подбор гиперпараметров по кросс-валидации (GridSearchCV, RandomizedSearchCV, HalvingGridSearchCV) — основной инструмент борьбы с переобучением при выборе модели. Метрики — в модуле sklearn.metrics, см. Метрики качества классификации.
Ограничения
- Работает в памяти и в основном на CPU; данные порядка миллионов строк — предел комфортного использования.
- Нет глубокого обучения и GPU (частичная поддержка через Array API).
- Для соревнований на табличных данных чаще берут специализированные библиотеки градиентного бустинга — они совместимы с API scikit-learn.
Сохранение и продакшен
Модели традиционно сохраняют через joblib или pickle — это быстро, но небезопасно для недоверенных файлов и привязано к версии библиотеки. Альтернативы — формат skops и экспорт в ONNX для сервинга.[6] Эксперименты и модели удобно отслеживать в MLflow, у которого есть автологирование для scikit-learn.