Menu
CoddyTech

Шпаргалка по scikit-learn (sklearn)

Последнее обновление

Загрузка и разбиение данных

Первым делом отложи тестовую выборку и смотри на неё только в самом конце.

ЗадачаКод
Импорт функции разбиенияfrom sklearn.model_selection import train_test_split
Признаки и целевая из DataFrameX = df.drop(columns="target") y = df["target"]
Встроенный датасет как pandasfrom 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 и testX_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 и стандартное отклонение 1scaler = StandardScaler() X_train_s = scaler.fit_transform(X_train[["age", "income"]]) X_test_s = scaler.transform(X_test[["age", "income"]])
Масштабировать в диапазон от 0 до 1MinMaxScaler().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
Accuracyaccuracy_score(y_test, y_pred)
Precision, recall и F1precision_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)
Несколько метрик и оценки на traincross_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)
Все допустимые имена scoringfrom 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)
Настроить шаг внутри pipelineGridSearchCV(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)
Задействовать все ядра CPUGridSearchCV(pipe, {"logisticregression__C": [0.1, 1]}, cv=5, n_jobs=-1)
Все результаты таблицейpd.DataFrame(grid.cv_results_).sort_values("rank_test_score")

Кластеризация и снижение размерности

Модели обучения без учителя учатся только на X. Сначала масштабируй признаки, потому что оба метода опираются на расстояния.

ЗадачаКод
Кластеры k-meansfrom sklearn.cluster import KMeans km = KMeans(n_clusters=3, random_state=0) labels = km.fit_predict(X)
Центры кластеров и inertiakm.cluster_centers_, km.inertia_
Насколько хорошо разделены кластерыfrom sklearn.metrics import silhouette_score silhouette_score(X, labels)
Кластеры по плотности, шум это -1from 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-hotOneHotEncoder(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)

Сохранение, загрузка и воспроизводимость

ЗадачаКод
Сохранить обученную модель или pipelineimport 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 бесплатная?
Да. Эта шпаргалка по scikit-learn полностью бесплатна, регистрация не нужна. Добавь её в закладки или сохрани в PDF через печать в браузере и возвращайся, когда нужно вспомнить точный вызов для pipeline, метрики или grid search.
sklearn и scikit-learn это одно и то же?
Да. 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 делает это за тебя.
Нужно ли масштабировать признаки?
Для моделей, которые используют расстояния или градиенты, да: k ближайших соседей, SVM, k-means, PCA, а также линейная и логистическая регрессия с регуляризацией работают лучше на масштабированных данных. Деревьям, таким как деревья решений, случайный лес и градиентный бустинг, масштабирование не нужно. Помести scaler в pipeline, чтобы он обучался только на обучающих данных.
С какой модели scikit-learn начать?
Начни с простой и быстрой модели в качестве бейзлайна: LinearRegression для предсказания чисел, LogisticRegression для предсказания классов. Затем попробуй RandomForestClassifier или HistGradientBoostingClassifier (или их версии для регрессии), сравни их с помощью кросс-валидации и настрой лучшую через GridSearchCV.
Какую версию scikit-learn охватывает шпаргалка?
scikit-learn 1.9, ту версию, что работает на Coddy, вместе с NumPy 2 и pandas 3. Старые вызовы, которые теперь падают или выдают предупреждения, например squared=False в mean_squared_error, sparse=False в OneHotEncoder и аргумент penalty у LogisticRegression, собраны в таблице старых форм рядом с тем, что писать вместо них.
Можно ли запускать код scikit-learn онлайн?
Да. Бесплатная песочница Matplotlib запускает Python с scikit-learn, pandas, NumPy и Matplotlib прямо в браузере, так что любой фрагмент из этой шпаргалки можно вставить и запустить без установки. Курс Coddy по машинному обучению шаг за шагом проводит через весь процесс с этой страницы, от разбиения данных до подбора параметров модели.
Иллюстрация языков программирования Coddy

Изучайте Scikit-learn с Coddy

НАЧАТЬ