Шпаргалка по scikit-learn (sklearn)
Последнее обновление
Загрузка и разбиение данных
Первым делом отложи тестовую выборку и смотри на неё только в самом конце.
| Задача | Код |
|---|---|
| Импорт функции разбиения | from sklearn.model_selection import train_test_split |
| Признаки и целевая из DataFrame | X = df.drop(columns="target")
y = df["target"] |
| Встроенный датасет как pandas | from sklearn.datasets import load_iris
X, y = load_iris(return_X_y=True, as_frame=True) |
| Синтетические данные для экспериментов | from sklearn.datasets import make_classification
X, y = make_classification(n_samples=500, n_features=8, random_state=0) |
| Разбиение 80/20 на train и test | X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) |
| Сохранить доли классов в обеих частях | train_test_split(X, y, test_size=0.2, stratify=y, random_state=42) |
| Train, validation и test (60/20/20) | X_tmp, X_test, y_tmp, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X_train, X_val, y_train, y_val = train_test_split(X_tmp, y_tmp, test_size=0.25, random_state=0) |
Предобработка признаков
Обучай преобразователь только на обучающих данных, а потом преобразуй обе выборки. Обучение на тестовых данных ведёт к утечке информации.
| Задача | Код |
|---|---|
| Импорты | from sklearn.preprocessing import StandardScaler, MinMaxScaler, OneHotEncoder, OrdinalEncoder |
| Среднее 0 и стандартное отклонение 1 | scaler = StandardScaler()
X_train_s = scaler.fit_transform(X_train[["age", "income"]])
X_test_s = scaler.transform(X_test[["age", "income"]]) |
| Масштабировать в диапазон от 0 до 1 | MinMaxScaler().fit_transform(X_train[["age", "income"]]) |
| One-hot кодирование категорий | enc = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
enc.fit_transform(X_train[["city"]]) |
| Упорядоченные категории в числа | OrdinalEncoder(categories=[["low", "mid", "high"]]).fit_transform([["mid"], ["high"]]) |
| Заполнить пропуски | from sklearn.impute import SimpleImputer
SimpleImputer(strategy="median").fit_transform(X_train[["age", "income"]]) |
| Полиномиальные признаки и взаимодействия | from sklearn.preprocessing import PolynomialFeatures
PolynomialFeatures(degree=2, include_bias=False).fit_transform(X_train[["age", "income"]]) |
| Получать DataFrame вместо массивов | scaler.set_output(transform="pandas") |
| Текстовые метки в целые числа | from sklearn.preprocessing import LabelEncoder
LabelEncoder().fit_transform(["cat", "dog", "cat"]) |
Выбор модели
Начни с простого и держи простую модель как планку, которую нужно превзойти.
| Задача | Начни с | Потом попробуй |
|---|---|---|
| Предсказать число (регрессия) | LinearRegression(), Ridge(alpha=1.0) | RandomForestRegressor(), HistGradientBoostingRegressor() |
| Предсказать класс (классификация) | LogisticRegression(max_iter=1000) | RandomForestClassifier(), HistGradientBoostingClassifier() |
| Мало данных, у похожих точек одна метка | KNeighborsClassifier(n_neighbors=5) | SVC(kernel="rbf") |
| Правила, которые можно прочитать | DecisionTreeClassifier(max_depth=3) | RandomForestClassifier() |
| Сгруппировать строки без меток | KMeans(n_clusters=3) | DBSCAN(eps=0.5) |
| Меньше признаков для графиков или скорости | PCA(n_components=2) | TSNE(n_components=2) |
| Найти необычные строки | IsolationForest(random_state=0) | LocalOutlierFactor() |
Обучение модели
Все модели устроены одинаково: создай её с нужными параметрами, а затем вызови fit.
| Задача | Код |
|---|---|
| Шаблон для любой модели | model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train) |
| Линейная регрессия | from sklearn.linear_model import LinearRegression
LinearRegression() |
| Линейная регрессия с регуляризацией | from sklearn.linear_model import Ridge, Lasso
Ridge(alpha=1.0), Lasso(alpha=0.1) |
| Логистическая регрессия (классификация) | from sklearn.linear_model import LogisticRegression
LogisticRegression(C=1.0, max_iter=1000) |
| k ближайших соседей | from sklearn.neighbors import KNeighborsClassifier
KNeighborsClassifier(n_neighbors=5) |
| Дерево решений | from sklearn.tree import DecisionTreeClassifier
DecisionTreeClassifier(max_depth=3, random_state=0) |
| Случайный лес | from sklearn.ensemble import RandomForestClassifier
RandomForestClassifier(n_estimators=200, random_state=0) |
| Градиентный бустинг, быстрый на больших данных | from sklearn.ensemble import HistGradientBoostingClassifier
HistGradientBoostingClassifier(random_state=0) |
| Метод опорных векторов | from sklearn.svm import SVC
SVC(kernel="rbf", C=1.0) |
| Наивный байесовский классификатор | from sklearn.naive_bayes import GaussianNB
GaussianNB() |
| Бейзлайн: всегда самый частый класс | from sklearn.dummy import DummyClassifier
DummyClassifier(strategy="most_frequent") |
Предсказания и анализ модели
| Задача | Код |
|---|---|
| Предсказать классы или значения | y_pred = model.predict(X_test) |
| Вероятность положительного класса | model.predict_proba(X_test)[:, 1] |
| Быстрая оценка: accuracy или R² | model.score(X_test, y_test) |
| Коэффициенты линейной модели | model.coef_, model.intercept_ |
| Важность признаков у деревьев | pd.Series(forest.feature_importances_, index=X_train.columns).sort_values() |
| Важность через перемешивание признаков | from sklearn.inspection import permutation_importance
permutation_importance(model, X_test, y_test, random_state=0).importances_mean |
| Метки классов, известные модели | model.classes_ |
| Прочитать и изменить параметры | model.get_params(), model.set_params(C=0.5) |
| Нарисовать дерево решений | from sklearn.tree import plot_tree
plot_tree(tree, filled=True, feature_names=list(X_train.columns)) |
Метрики классификации
Одна только accuracy скрывает ошибки на редком классе. Смотри также на precision, recall и матрицу ошибок.
| Задача | Код |
|---|---|
| Импорты | from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score |
| Accuracy | accuracy_score(y_test, y_pred) |
| Precision, recall и F1 | precision_score(y_test, y_pred), recall_score(y_test, y_pred), f1_score(y_test, y_pred) |
| F1 для нескольких классов | f1_score(y_test, y_pred, average="macro") |
| Все метрики по каждому классу | from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred)) |
| Матрица ошибок | from sklearn.metrics import confusion_matrix
confusion_matrix(y_test, y_pred) |
| Нарисовать матрицу ошибок | from sklearn.metrics import ConfusionMatrixDisplay
ConfusionMatrixDisplay.from_estimator(model, X_test, y_test) |
| ROC AUC по вероятностям | from sklearn.metrics import roc_auc_score
roc_auc_score(y_test, model.predict_proba(X_test)[:, 1]) |
| Нарисовать ROC-кривую | from sklearn.metrics import RocCurveDisplay
RocCurveDisplay.from_estimator(model, X_test, y_test) |
| Accuracy при несбалансированных классах | from sklearn.metrics import balanced_accuracy_score
balanced_accuracy_score(y_test, y_pred) |
| Свой порог принятия решения | y_pred = (model.predict_proba(X_test)[:, 1] >= 0.3).astype(int) |
Метрики регрессии
Метрики ошибки измеряются в единицах целевой переменной (чем меньше, тем лучше). R² это доля объяснённой дисперсии (1 значит идеально).
| Задача | Код |
|---|---|
| Импорты | from sklearn.metrics import mean_absolute_error, mean_squared_error, root_mean_squared_error, r2_score |
| Средняя абсолютная ошибка | mean_absolute_error(y_test, y_pred) |
| Среднеквадратичная ошибка и корень из неё | mean_squared_error(y_test, y_pred), root_mean_squared_error(y_test, y_pred) |
| Коэффициент R² | r2_score(y_test, y_pred) |
| Средняя абсолютная ошибка в процентах | from sklearn.metrics import mean_absolute_percentage_error
mean_absolute_percentage_error(y_test, y_pred) |
| График предсказаний против фактических значений | from sklearn.metrics import PredictionErrorDisplay
PredictionErrorDisplay.from_predictions(y_test, y_pred, kind="actual_vs_predicted") |
Pipeline
Pipeline соединяет предобработку и модель в один estimator, поэтому при кросс-валидации и grid search каждый шаг обучается только на обучающих фолдах.
| Задача | Код |
|---|---|
| Импорты | from sklearn.pipeline import make_pipeline, Pipeline |
| Масштабировать, затем обучить модель | pipe = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
pipe.fit(X_train, y_train) |
| Шаги со своими именами | pipe = Pipeline([("scale", StandardScaler()), ("model", LogisticRegression(max_iter=1000))]) |
| Доступ к шагу внутри | pipe.named_steps["model"], pipe[-1] |
| Разные шаги для разных столбцов | from sklearn.compose import ColumnTransformer
pre = ColumnTransformer([
("num", StandardScaler(), ["age", "income"]),
("cat", OneHotEncoder(handle_unknown="ignore"), ["city"]),
]) |
| Предобработка и модель в одном объекте | model = make_pipeline(pre, RandomForestClassifier(random_state=0))
model.fit(X_train, y_train)
model.score(X_test, y_test) |
| Выбрать столбцы по типу | from sklearn.compose import make_column_selector
make_column_selector(dtype_include="number")(X_train) |
| Заполнить пропуски, затем масштабировать | make_pipeline(SimpleImputer(strategy="median"), StandardScaler()) |
| Имена выходных признаков | pre.get_feature_names_out() |
Кросс-валидация
Кросс-валидация обучает и оценивает модель на нескольких разбиениях, и это даёт более устойчивую оценку, чем одна тестовая выборка.
| Задача | Код |
|---|---|
| Импорты | from sklearn.model_selection import cross_val_score, cross_validate, KFold, StratifiedKFold |
| Оценка на 5 фолдах | scores = cross_val_score(pipe, X, y, cv=5)
scores.mean(), scores.std() |
| Выбрать метрику | cross_val_score(pipe, X, y, cv=5, scoring="f1_macro") |
| Фолды с перемешиванием | cv = KFold(n_splits=5, shuffle=True, random_state=0) |
| Одинаковый баланс классов в фолдах | cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=0) |
| Несколько метрик и оценки на train | cross_validate(pipe, X, y, cv=cv, scoring=["accuracy", "f1"], return_train_score=True) |
| Out-of-fold предсказание для каждой строки | from sklearn.model_selection import cross_val_predict
cross_val_predict(pipe, X, y, cv=5) |
| Фолды по группам, фолды по времени | from sklearn.model_selection import GroupKFold, TimeSeriesSplit
GroupKFold(n_splits=5), TimeSeriesSplit(n_splits=5) |
| Все допустимые имена scoring | from sklearn.metrics import get_scorer_names
get_scorer_names() |
Grid search и подбор параметров
Поиск обучает модель для каждого набора параметров с кросс-валидацией, оставляет лучший и заново обучает его на всех обучающих данных.
| Задача | Код |
|---|---|
| Импорты | from sklearn.model_selection import GridSearchCV, RandomizedSearchCV |
| Перебрать все комбинации | grid = GridSearchCV(RandomForestClassifier(random_state=0), {"n_estimators": [50, 100], "max_depth": [None, 5]}, cv=5)
grid.fit(X_train, y_train) |
| Лучшие параметры и их оценка | grid.best_params_, grid.best_score_ |
| Использовать лучшую модель | grid.best_estimator_.predict(X_test), grid.score(X_test, y_test) |
| Настроить шаг внутри pipeline | GridSearchCV(pipe, {"logisticregression__C": [0.1, 1, 10]}, cv=5).fit(X_train, y_train) |
| Случайные параметры из распределений | from scipy.stats import randint
search = RandomizedSearchCV(RandomForestClassifier(random_state=0), {"n_estimators": randint(50, 150)}, n_iter=5, cv=3, random_state=0)
search.fit(X_train, y_train) |
| Задействовать все ядра CPU | GridSearchCV(pipe, {"logisticregression__C": [0.1, 1]}, cv=5, n_jobs=-1) |
| Все результаты таблицей | pd.DataFrame(grid.cv_results_).sort_values("rank_test_score") |
Кластеризация и снижение размерности
Модели обучения без учителя учатся только на X. Сначала масштабируй признаки, потому что оба метода опираются на расстояния.
| Задача | Код |
|---|---|
| Кластеры k-means | from sklearn.cluster import KMeans
km = KMeans(n_clusters=3, random_state=0)
labels = km.fit_predict(X) |
| Центры кластеров и inertia | km.cluster_centers_, km.inertia_ |
| Насколько хорошо разделены кластеры | from sklearn.metrics import silhouette_score
silhouette_score(X, labels) |
| Кластеры по плотности, шум это -1 | from sklearn.cluster import DBSCAN
DBSCAN(eps=0.5, min_samples=5).fit_predict(X) |
| Проекция на 2 компоненты | from sklearn.decomposition import PCA
pca = PCA(n_components=2)
X_2d = pca.fit_transform(X) |
| Дисперсия, объяснённая каждой компонентой | pca.explained_variance_ratio_ |
| Сохранить 95% дисперсии | PCA(n_components=0.95).fit_transform(X) |
scikit-learn 1.9: старые формы и что писать теперь
Код из старых туториалов в scikit-learn 1.9 может падать или выдавать предупреждения. Пиши вместо него то, что указано в столбце scikit-learn 1.9.
| Задача | scikit-learn 1.9 | Старая форма |
|---|---|---|
| Корень из среднеквадратичной ошибки | root_mean_squared_error(y_test, y_pred) | mean_squared_error(y_test, y_pred, squared=False) |
| Плотный вывод one-hot | OneHotEncoder(sparse_output=False) | OneHotEncoder(sparse=False) |
| Логистическая регрессия с L1 (lasso) | LogisticRegression(l1_ratio=1, solver="liblinear") | LogisticRegression(penalty="l1", solver="liblinear") |
| Логистическая регрессия без регуляризации | LogisticRegression(C=np.inf) | LogisticRegression(penalty=None) |
Сохранение, загрузка и воспроизводимость
| Задача | Код |
|---|---|
| Сохранить обученную модель или pipeline | import joblib
joblib.dump(model, "model.joblib") |
| Загрузить обратно | model = joblib.load("model.joblib") |
| Одинаковый результат при каждом запуске | random_state=0 |
| Какая версия установлена | import sklearn
sklearn.__version__ |
Код scikit-learn для реального процесса машинного обучения, в том порядке, в каком ты его пишешь: загрузить и разбить данные, предобработать их, выбрать модель, обучить и получить предсказания, оценить результат, собрать шаги в pipeline, провести кросс-валидацию и подобрать параметры через grid search. В каждой строке короткий фрагмент кода, который можно сразу вставить, и одна строчка о том, что он делает.
У всех моделей в scikit-learn один и тот же API: fit учится на обучающих данных, а predict и transform применяют выученное. Всё здесь написано для scikit-learn 1.9, той версии, что работает на Coddy: X обозначает признаки, а y целевую переменную. scikit-learn работает с массивами NumPy и DataFrame из pandas, а про графики рассказывает шпаргалка по Matplotlib. Только начинаешь с Python? Загляни в шпаргалку по Python.
Частые вопросы о шпаргалке по scikit-learn
Эта шпаргалка по scikit-learn бесплатная?
sklearn и scikit-learn это одно и то же?
pip install scikit-learn), а sklearn это имя, которое ты импортируешь в коде (from sklearn.linear_model import LinearRegression). Шпаргалка по sklearn и шпаргалка по scikit-learn описывают одно и то же.Чем отличаются fit, transform и fit_transform?
fit учится на данных: scaler запоминает среднее каждого столбца, модель подбирает свои веса. transform применяет выученное, а fit_transform делает и то, и другое за один вызов. Используй fit_transform на обучающей выборке и только transform на тестовой, иначе тестовые данные утекут в обучение. Pipeline делает это за тебя.Нужно ли масштабировать признаки?
С какой модели scikit-learn начать?
LinearRegression для предсказания чисел, LogisticRegression для предсказания классов. Затем попробуй RandomForestClassifier или HistGradientBoostingClassifier (или их версии для регрессии), сравни их с помощью кросс-валидации и настрой лучшую через GridSearchCV.Какую версию scikit-learn охватывает шпаргалка?
squared=False в mean_squared_error, sparse=False в OneHotEncoder и аргумент penalty у LogisticRegression, собраны в таблице старых форм рядом с тем, что писать вместо них.