Scikit-learn: инструментарий для ML проектов на Python

Раздел: Python -> Scikit-learn

Введение в Scikit-learn

Scikit-learn (sklearn) – одна из самых популярных библиотек машинного обучения на Python. Она предоставляет единый интерфейс для множества алгоритмов, инструменты для предобработки данных, оценки моделей и подбора гиперпараметров. Библиотека активно используется в исследовательских и промышленных проектах благодаря простоте и документированности.

Как обучить первую модель классификации с помощью Scikit-learn?

Рассмотрим базовый сценарий – задачу классификации на наборе данных Iris. Основные шаги включают загрузку данных, разделение на обучающую и тестовую выборки, обучение модели и оценку точности.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# загрузка данных
iris = load_iris()
X, y = iris.data, iris.target

# разделение
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# создание и обучение модели
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

# прогноз и оценка
y_pred = model.predict(X_test)
print(f"Точность: {accuracy_score(y_test, y_pred):.3f}")

библиотеки для машинного обучения python (библиотеки для машинного обучения в python (scikit-learn, tensorflow, pytorch))

Точность: 1.000

Feature names python (имена признаков в python)

Возможные проблемы:

  • Если не указать random_state, результаты могут не воспроизводиться.
  • При использовании алгоритмов, чувствительных к масштабу (SVM, k-ближайших соседей), необходимо предварительное масштабирование признаков.

Как заменить модель на другую, например, на метод опорных векторов?

from sklearn.svm import SVC

svm_model = SVC(kernel='rbf', gamma='scale', C=1.0)
svm_model.fit(X_train, y_train)
y_pred_svm = svm_model.predict(X_test)
print(f"Точность SVM: {accuracy_score(y_test, y_pred_svm):.3f}")

Python model (модели в python (машинное обучение))

Точность SVM: 1.000

статистическая библиотека python (статистическая библиотека python (scipy, statsmodels))

При этом важно выполнить стандартизацию признаков с помощью StandardScaler, иначе модель может давать нестабильные результаты.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

svm_model.fit(X_train_scaled, y_train)
print(accuracy_score(y_test, svm_model.predict(X_test_scaled)))

создание нейросетей на python (создание нейронных сетей на python (tensorflow, pytorch))

Как оценить качество модели с помощью других метрик, например, F1-меры?

from sklearn.metrics import f1_score, classification_report

print(classification_report(y_test, y_pred, target_names=iris.target_names))
print(f"F1 (weighted): {f1_score(y_test, y_pred, average='weighted'):.3f}")

библиотека scikit python (библиотека scikit-learn для python)

              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        10
  versicolor       1.00      1.00      1.00         9
   virginica       1.00      1.00      1.00        11

    accuracy                           1.00        30
   macro avg       1.00      1.00      1.00        30
weighted avg       1.00      1.00      1.00        30

F1 (weighted): 1.000

задачи машинного обучения python (задачи машинного обучения на python)

Типичная ошибка:

Использование accuracy_score на несбалансированных данных без учёта распределения классов. Рекомендуется смотреть на f1-score и confusion_matrix.

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

from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

housing = fetch_california_housing()
X_h, y_h = housing.data, housing.target
X_train_h, X_test_h, y_train_h, y_test_h = train_test_split(
    X_h, y_h, test_size=0.2, random_state=42
)

lin_reg = LinearRegression()
lin_reg.fit(X_train_h, y_train_h)
y_pred_h = lin_reg.predict(X_test_h)
mse = mean_squared_error(y_test_h, y_pred_h)
print(f"MSE: {mse:.3f}")

машинное обучение на данных python (машинное обучение на данных с помощью python)

MSE: 0.555

нейросеть python (нейросеть на python)

Как применить кластеризацию методом K-средних?

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

X_blob, y_blob = make_blobs(n_samples=300, centers=3, random_state=42)
kmeans = KMeans(n_clusters=3, random_state=42, n_init='auto')
kmeans.fit(X_blob)
print("Метки кластеров:", kmeans.labels_[:10])

Python создание модели (создание модели машинного обучения на python)

Метки кластеров: [1 2 1 0 1 2 2 0 1 2]

Проблема выбора числа кластеров:

Метод локтя (inertia) помогает определить оптимальное n_clusters. Необходимо провести анализ для нескольких значений и построить график.

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

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

Использование Pipeline и GridSearchCV позволяет автоматизировать процесс масштабирования и настройки модели. В примере ниже для задачи классификации на наборе Iris подбираются параметры SVM и выбирается метод масштабирования.

Пример
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler, MinMaxScaler

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('svm', SVC())
])

param_grid = {
    'scaler': [StandardScaler(), MinMaxScaler()],
    'svm__kernel': ['linear', 'rbf'],
    'svm__C': [0.1, 1, 10]
}

grid = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy')
grid.fit(X_train, y_train)
print("Лучшие параметры:", grid.best_params_)
print("Лучшая точность (CV):", grid.best_score_)
Лучшие параметры: {'scaler': StandardScaler(), 'svm__C': 1, 'svm__kernel': 'rbf'}
Лучшая точность (CV): 0.9833333333333333

Как обработать категориальные признаки с помощью OneHotEncoder и ColumnTransformer?

На примере датасета Titanic (вымышленный код) показана обработка смешанных типов данных. Сначала разделяем числовые и категориальные колонки, применяем к ним разные преобразования и объединяем через ColumnTransformer.

Пример
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier

# Предположим, что df содержит числовые и категориальные признаки
numeric_features = ['age', 'fare']
categorical_features = ['sex', 'embarked']

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

full_pipeline = Pipeline([
    ('prep', preprocessor),
    ('clf', RandomForestClassifier(random_state=42))
])

# full_pipeline.fit(X_train, y_train)

Типичная ошибка:

Забыть указать handle_unknown='ignore' для OneHotEncoder, что может привести к ошибке, если в тестовой выборке появятся новые категории.

Как сохранить обученную модель и загрузить её для дальнейшего использования?

Пример
import joblib
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier().fit(X_train, y_train)
joblib.dump(model, 'model.pkl')

# загрузка
loaded_model = joblib.load('model.pkl')
preds = loaded_model.predict(X_test)
print(preds[:5])
[0 1 2 1 1]

Проблема совместимости версий:

Модели, сохранённые в одной версии sklearn, могут не загружаться в другой из-за изменений в API. Рекомендуется фиксировать версии библиотек.

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

Пример
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression

scores = cross_val_score(LogisticRegression(max_iter=1000), X, y, cv=5, scoring='accuracy')
print("Оценки по фолдам:", scores)
print("Среднее:", scores.mean())
Оценки по фолдам: [0.96666667 1.         0.93333333 0.96666667 1.        ]
Среднее: 0.9733333333333334

Как использовать метрики для регрессии, например, R² и MAE?

Пример
from sklearn.metrics import r2_score, mean_absolute_error

y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
print("R²:", r2_score(y_true, y_pred))
print("MAE:", mean_absolute_error(y_true, y_pred))
R²: 0.9486081370449679
MAE: 0.5

Как построить кривую ROC и вычислить AUC для бинарного классификатора?

Пример
from sklearn.metrics import roc_curve, auc
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification

X_bin, y_bin = make_classification(n_samples=200, n_features=2, random_state=42)
X_train_b, X_test_b, y_train_b, y_test_b = train_test_split(X_bin, y_bin, test_size=0.3, random_state=42)

lr = LogisticRegression()
lr.fit(X_train_b, y_train_b)
y_score = lr.predict_proba(X_test_b)[:, 1]
fpr, tpr, _ = roc_curve(y_test_b, y_score)
roc_auc = auc(fpr, tpr)
print("AUC:", roc_auc)
AUC: 0.9743589743589743

Для визуализации ROC-кривой можно использовать библиотеку matplotlib.

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

En
библиотека scikit python (python)