Scikit-learn: практические примеры и рекомендации по использованию

Раздел: Машинное обучение и ИИ -> Библиотеки машинного обучения

Библиотека Scikit-learn предоставляет унифицированный интерфейс для множества алгоритмов машинного обучения, а также инструменты для предобработки данных, отбора признаков и оценки моделей. Она построена на основе NumPy, SciPy и Matplotlib, что делает её удобной для интеграции в научные вычисления.

Основные подходы к использованию Scikit-learn

Как реализовать регрессионный анализ с помощью Scikit-learn?

Наиболее распространённый способ начать работу - построить модель линейной регрессии. Это эффективный базовый подход, который позволяет прогнозировать непрерывные целевые переменные.

from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_regression

X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LinearRegression()
model.fit(X_train, y_train)
predictions = model.predict(X_test)

Tensorflow python (tensorflow в python)

После обучения модели можно оценить качество с помощью метрик: среднеквадратичная ошибка (MSE) и коэффициент детерминации R².

from sklearn.metrics import mean_squared_error, r2_score

mse = mean_squared_error(y_test, predictions)
r2 = r2_score(y_test, predictions)
print(f"MSE: {mse:.2f}, R²: {r2:.2f}")

Scikit learn python (библиотека scikit-learn в python)

Типичные ошибки: при использовании нестандартизированных признаков с большими диапазонами значений модель может стать неустойчивой. Также линейная регрессия чувствительна к мультиколлинеарности. Рекомендуется применять StandardScaler и проверять корреляцию признаков.

Как выполнить бинарную классификацию с помощью логистической регрессии?

Логистическая регрессия - простой и интерпретируемый метод для задач классификации. В Scikit-learn она реализована в классе LogisticRegression.

from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=200, n_features=4, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

clf = LogisticRegression()
clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)
accuracy = clf.score(X_test, y_test)
print(f"Точность: {accuracy:.2f}")

Распространённые сложности: дисбаланс классов может привести к низкой полноте. Стоит использовать параметр class_weight='balanced' или применять методы oversampling/undersampling.

Как выполнить кластеризацию данных без учителя?

Алгоритм K-средних (KMeans) группирует наблюдения по схожести. Количество кластеров задаётся заранее.

from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=0)
kmeans = KMeans(n_clusters=4, random_state=0)
kmeans.fit(X)
labels = kmeans.labels_
centroids = kmeans.cluster_centers_

Для выбора числа кластеров часто используют метод локтя (inertia).

inertias = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, random_state=0).fit(X)
    inertias.append(kmeans.inertia_)

Проблемы: чувствительность к начальной инициализации центров; данные должны быть масштабированы. Рекомендуется использовать n_init и StandardScaler.

Как подготовить данные перед обучением модели?

Предобработка - обязательный этап. Scikit-learn предлагает множество трансформеров: StandardScaler, MinMaxScaler, OneHotEncoder.

from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
import numpy as np

# Пример с числовыми и категориальными признаками
numeric_features = ['age', 'salary']
categorical_features = ['city']

preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numeric_features),
        ('cat', OneHotEncoder(), categorical_features)
    ])

Этот трансформер затем объединяется с моделью в пайплайн.

Ошибки: забывание применить fit только на обучающей выборке, утечка данных из теста. Всегда следует использовать fit_transform для обучения и transform для теста.

Как найти лучшие гиперпараметры модели?

Поиск по сетке (GridSearchCV) - полный перебор заданных значений параметров с кросс-валидацией.

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

param_grid = {
    'C': [0.1, 1, 10],
    'kernel': ['linear', 'rbf']
}
grid = GridSearchCV(SVC(), param_grid, cv=5)
grid.fit(X_train, y_train)
best_params = grid.best_params_
print("Лучшие параметры:", best_params)

Проблемы: при большом числе параметров поиск становится затратным. Альтернатива - RandomizedSearchCV с фиксированным числом итераций.

Как объединить преобразования и модель в единый процесс?

Пайплайны (Pipeline) позволяют последовательно применять трансформеры и модель, что упрощает кросс-валидацию и развёртывание.

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('poly', PolynomialFeatures(degree=2)),
    ('linear', LinearRegression())
])
pipeline.fit(X_train, y_train)
score = pipeline.score(X_test, y_test)

Типичные ошибки: применение трансформеров, изменяющих размерность, внутри пайплайна без учёта соответствия; несовместимость с ColumnTransformer на разных наборах признаков. Рекомендуется проверять get_feature_names_out.

Расширенные примеры использования Scikit-learn

Случайный лес с подбором гиперпараметров через RandomizedSearchCV

Данный подход позволяет эффективно перебирать большое число комбинаций параметров.

Пример
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import randint

param_dist = {
    'n_estimators': randint(50, 200),
    'max_depth': [None, 10, 20, 30],
    'min_samples_split': randint(2, 11)
}
rf = RandomForestRegressor(random_state=42)
random_search = RandomizedSearchCV(rf, param_distributions=param_dist, n_iter=10, cv=3, random_state=42)
random_search.fit(X_train, y_train)
print("Лучшие параметры:", random_search.best_params_)
Лучшие параметры: {'max_depth': 20, 'min_samples_split': 4, 'n_estimators': 156}

Пайплайн с ColumnTransformer для смешанных типов данных

Пример обработки числовых и категориальных признаков с последующей моделью градиентного бустинга.

Пример
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.pipeline import Pipeline
from sklearn.ensemble import GradientBoostingRegressor
import pandas as pd

data = {'age': [25, 30, 35], 'city': ['Moscow', 'London', 'Moscow'], 'target': [100, 150, 130]}
df = pd.DataFrame(data)
X = df[['age','city']]
y = df['target']

numeric_features = ['age']
categorical_features = ['city']

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

pipeline = Pipeline(steps=[
    ('preprocessor', preprocessor),
    ('regressor', GradientBoostingRegressor(random_state=42))
])
pipeline.fit(X, y)
predictions = pipeline.predict(X)
print(predictions)
[100. 150. 130.]

Классификация текстов с TfidfVectorizer и логистической регрессией

Преобразование текстовых данных в числовые признаки с помощью TF-IDF.

Пример
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline

texts = ["отличный фильм", "ужасный фильм", "нормальный фильм"]
labels = [1, 0, 1]

pipeline = Pipeline([
    ('tfidf', TfidfVectorizer()),
    ('clf', LogisticRegression())
])
pipeline.fit(texts, labels)
print(pipeline.predict(["хороший фильм"]))
[1]

Кривая обучения для диагностики переобучения

Позволяет понять, как объём данных влияет на качество модели.

Пример
from sklearn.model_selection import learning_curve
import numpy as np

train_sizes, train_scores, test_scores = learning_curve(
    RandomForestRegressor(n_estimators=50, random_state=42),
    X, y, cv=5, train_sizes=np.linspace(0.1, 1.0, 5)
)
mean_train = train_scores.mean(axis=1)
mean_test = test_scores.mean(axis=1)
print("Средняя точность на обучении:", mean_train)
print("Средняя точность на тесте:", mean_test)
Средняя точность на обучении: [0.98 0.99 0.99 1.   1.  ]
Средняя точность на тесте: [0.85 0.88 0.87 0.89 0.9 ]

Сохранение и загрузка модели с помощью joblib

Модели можно сериализовать для последующего использования.

Пример
import joblib
from sklearn.svm import SVC

model = SVC().fit(X_train, y_train)
joblib.dump(model, 'svm_model.joblib')
loaded_model = joblib.load('svm_model.joblib')
print("Точность загруженной модели:", loaded_model.score(X_test, y_test))
Точность загруженной модели: 0.95

Калибровка вероятностей классификатора

Некоторые модели дают плохо откалиброванные вероятности. Scikit-learn предоставляет класс CalibratedClassifierCV.

Пример
from sklearn.calibration import CalibratedClassifierCV
from sklearn.naive_bayes import GaussianNB

base_clf = GaussianNB()
calibrated_clf = CalibratedClassifierCV(base_clf, cv=5)
calibrated_clf.fit(X_train, y_train)
probabilities = calibrated_clf.predict_proba(X_test)
print(probabilities[:5])
[[0.1 0.9]
 [0.8 0.2]
 [0.3 0.7]
 [0.6 0.4]
 [0.0 1.0]]

Отбор признаков с SelectKBest

Выбор k лучших признаков по заданной статистической мере.

Пример
from sklearn.feature_selection import SelectKBest, f_classif

selector = SelectKBest(score_func=f_classif, k=2)
X_new = selector.fit_transform(X, y)
print("Форма после отбора:", X_new.shape)
print("Выбранные признаки (индексы):", selector.get_support(indices=True))
Форма после отбора: (200, 2)
Выбранные признаки (индексы): [1 3]

Библиотека Scikit-learn в Python - comments

En
Scikit learn python (python)