scikit-learn

Материал из llmdocs — справочник разработчика
Портал: ML и MLOps
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.

См. также

Источники

  1. scikit-learn — User Guide
  2. Pedregosa et al. — Scikit-learn: Machine Learning in Python (JMLR, 2011)
  3. Buitinck et al. — API design for machine learning software (2013)
  4. scikit-learn — Common pitfalls and recommended practices
  5. scikit-learn — Choosing the right estimator
  6. scikit-learn — Model persistence