Scikit-learn – машинное обучение

онлайн тренажер по питону
Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Что такое Scikit-learn

Scikit-learn — это одна из самых популярных и мощных библиотек Python для машинного обучения с открытым исходным кодом. Разработанная в 2007 году Дэвидом Курнапо, библиотека стала стандартом де-факто для реализации алгоритмов машинного обучения в Python-экосистеме.

Основные задачи и возможности Scikit-learn

Библиотека предоставляет готовые инструменты для решения широкого спектра задач машинного обучения:

Задачи обучения с учителем:

  • Классификация — определение принадлежности объектов к определенным классам
  • Регрессия — предсказание непрерывных числовых значений

Задачи обучения без учителя:

  • Кластеризация — группировка похожих объектов
  • Уменьшение размерности — сжатие данных с сохранением важной информации
  • Обнаружение аномалий — выявление выбросов в данных

Дополнительные возможности:

  • Предобработка данных — нормализация, масштабирование, кодирование
  • Отбор признаков — выбор наиболее информативных характеристик
  • Оценка моделей — различные метрики качества
  • Кросс-валидация — проверка устойчивости модели
  • Подбор гиперпараметров — автоматическая настройка параметров

Установка и первоначальная настройка

Установка через pip

pip install scikit-learn

Установка с дополнительными зависимостями

pip install scikit-learn pandas matplotlib seaborn jupyter

Проверка установки

import sklearn
print(sklearn.__version__)

Импорт основных компонентов

# Основные модули
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.linear_model import LinearRegression, LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report
from sklearn.datasets import load_iris, make_classification

Архитектура и основные концепции

Estimator (Оценщик)

Estimator — это базовый класс для всех алгоритмов машинного обучения в Scikit-learn. Каждый estimator реализует два основных метода:

  • fit(X, y) — обучение модели на данных
  • predict(X) — предсказание для новых данных
from sklearn.linear_model import LinearRegression

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

Transformer (Трансформер)

Transformer — класс для преобразования данных. Реализует методы:

  • fit(X) — изучение параметров преобразования
  • transform(X) — применение преобразования
  • fit_transform(X) — объединение fit и transform
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

Pipeline (Конвейер)

Pipeline позволяет объединить несколько шагов обработки данных и обучения в единую последовательность:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

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

pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)

Работа с данными

Встроенные датасеты

Scikit-learn предоставляет множество готовых датасетов для обучения и тестирования:

from sklearn.datasets import load_iris, load_wine, load_breast_cancer

# Загрузка датасета Iris
iris = load_iris()
X, y = iris.data, iris.target

# Информация о датасете
print(iris.DESCR)
print(f"Размерность данных: {X.shape}")
print(f"Классы: {iris.target_names}")

Генерация синтетических данных

from sklearn.datasets import make_classification, make_regression

# Генерация данных для классификации
X, y = make_classification(
    n_samples=1000,
    n_features=20,
    n_informative=10,
    n_redundant=5,
    n_clusters_per_class=1,
    random_state=42
)

# Генерация данных для регрессии
X_reg, y_reg = make_regression(
    n_samples=1000,
    n_features=10,
    noise=0.1,
    random_state=42
)

Разделение данных

from sklearn.model_selection import train_test_split

# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(
    X, y, 
    test_size=0.2,
    random_state=42,
    stratify=y  # Сохранение пропорций классов
)

# Разделение на три части
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
X_val, X_test, y_val, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

Предобработка данных

Масштабирование признаков

from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler

# Стандартизация (среднее=0, стд=1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_train)

# Нормализация в диапазон [0, 1]
min_max_scaler = MinMaxScaler()
X_minmax = min_max_scaler.fit_transform(X_train)

# Устойчивое масштабирование (робастное к выбросам)
robust_scaler = RobustScaler()
X_robust = robust_scaler.fit_transform(X_train)

Кодирование категориальных данных

from sklearn.preprocessing import LabelEncoder, OneHotEncoder
import pandas as pd

# Кодирование меток
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y_categorical)

# One-hot кодирование
encoder = OneHotEncoder(sparse_output=False)
X_encoded = encoder.fit_transform(X_categorical)

# Для pandas DataFrame
df_encoded = pd.get_dummies(df, columns=['categorical_column'])

Алгоритмы машинного обучения

Линейные модели

from sklearn.linear_model import LinearRegression, LogisticRegression, Ridge, Lasso

# Линейная регрессия
linear_reg = LinearRegression()
linear_reg.fit(X_train, y_train)
print(f"Коэффициенты: {linear_reg.coef_}")
print(f"Свободный член: {linear_reg.intercept_}")

# Логистическая регрессия
logistic_reg = LogisticRegression(random_state=42)
logistic_reg.fit(X_train, y_train)

# Регуляризованные модели
ridge = Ridge(alpha=1.0)
lasso = Lasso(alpha=1.0)

Деревья решений

from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

# Дерево решений для классификации
tree_clf = DecisionTreeClassifier(
    max_depth=3,
    min_samples_split=5,
    random_state=42
)
tree_clf.fit(X_train, y_train)

# Визуализация дерева
plt.figure(figsize=(12, 8))
plot_tree(tree_clf, feature_names=iris.feature_names, class_names=iris.target_names, filled=True)
plt.show()

Ансамблевые методы

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier, AdaBoostClassifier

# Случайный лес
rf_clf = RandomForestClassifier(
    n_estimators=100,
    max_depth=3,
    random_state=42
)
rf_clf.fit(X_train, y_train)

# Градиентный бустинг
gb_clf = GradientBoostingClassifier(
    n_estimators=100,
    learning_rate=0.1,
    random_state=42
)
gb_clf.fit(X_train, y_train)

# Важность признаков
feature_importance = rf_clf.feature_importances_

Метод опорных векторов

from sklearn.svm import SVC, SVR

# SVM для классификации
svm_clf = SVC(
    kernel='rbf',
    C=1.0,
    gamma='scale',
    random_state=42
)
svm_clf.fit(X_train, y_train)

# SVM для регрессии
svm_reg = SVR(kernel='rbf', C=1.0, gamma='scale')

Алгоритмы кластеризации

from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN

# K-means
kmeans = KMeans(n_clusters=3, random_state=42)
cluster_labels = kmeans.fit_predict(X)

# Иерархическая кластеризация
agg_clustering = AgglomerativeClustering(n_clusters=3)
agg_labels = agg_clustering.fit_predict(X)

# DBSCAN
dbscan = DBSCAN(eps=0.5, min_samples=5)
dbscan_labels = dbscan.fit_predict(X)

Оценка качества моделей

Метрики для классификации

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix, classification_report

# Предсказания
y_pred = model.predict(X_test)

# Основные метрики
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='weighted')
recall = recall_score(y_test, y_pred, average='weighted')
f1 = f1_score(y_test, y_pred, average='weighted')

print(f"Точность: {accuracy:.3f}")
print(f"Precision: {precision:.3f}")
print(f"Recall: {recall:.3f}")
print(f"F1-score: {f1:.3f}")

# Подробный отчет
print(classification_report(y_test, y_pred))

# Матрица ошибок
cm = confusion_matrix(y_test, y_pred)

Метрики для регрессии

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score

y_pred_reg = model.predict(X_test)

mse = mean_squared_error(y_test, y_pred_reg)
mae = mean_absolute_error(y_test, y_pred_reg)
r2 = r2_score(y_test, y_pred_reg)

print(f"MSE: {mse:.3f}")
print(f"MAE: {mae:.3f}")
print(f"R²: {r2:.3f}")

Кросс-валидация и подбор гиперпараметров

Кросс-валидация

from sklearn.model_selection import cross_val_score, StratifiedKFold

# Простая кросс-валидация
scores = cross_val_score(model, X, y, cv=5)
print(f"Средняя точность: {scores.mean():.3f} (+/- {scores.std() * 2:.3f})")

# Стратифицированная кросс-валидация
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=skf)

Подбор гиперпараметров

from sklearn.model_selection import GridSearchCV, RandomizedSearchCV

# Сетка параметров
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [3, 5, 7, None],
    'min_samples_split': [2, 5, 10]
}

# Поиск по сетке
grid_search = GridSearchCV(
    RandomForestClassifier(random_state=42),
    param_grid,
    cv=5,
    scoring='accuracy',
    n_jobs=-1
)

grid_search.fit(X_train, y_train)
print(f"Лучшие параметры: {grid_search.best_params_}")
print(f"Лучший результат: {grid_search.best_score_:.3f}")

# Случайный поиск
random_search = RandomizedSearchCV(
    RandomForestClassifier(random_state=42),
    param_grid,
    n_iter=20,
    cv=5,
    random_state=42
)

Сохранение и загрузка моделей

import joblib
import pickle

# Сохранение с помощью joblib (рекомендуется)
joblib.dump(model, 'model.pkl')
loaded_model = joblib.load('model.pkl')

# Сохранение с помощью pickle
with open('model.pkl', 'wb') as f:
    pickle.dump(model, f)

with open('model.pkl', 'rb') as f:
    loaded_model = pickle.load(f)

Полная таблица методов и функций Scikit-learn

Основные модули библиотеки

Модуль Назначение Основные классы/функции
sklearn.preprocessing Предобработка данных StandardScaler, MinMaxScaler, OneHotEncoder, LabelEncoder
sklearn.model_selection Разделение данных и валидация train_test_split, cross_val_score, GridSearchCV
sklearn.linear_model Линейные модели LinearRegression, LogisticRegression, Ridge, Lasso
sklearn.tree Деревья решений DecisionTreeClassifier, DecisionTreeRegressor
sklearn.ensemble Ансамблевые методы RandomForestClassifier, GradientBoostingClassifier
sklearn.svm Метод опорных векторов SVC, SVR, LinearSVC
sklearn.neighbors Алгоритмы ближайших соседей KNeighborsClassifier, KNeighborsRegressor
sklearn.cluster Кластеризация KMeans, AgglomerativeClustering, DBSCAN
sklearn.metrics Метрики качества accuracy_score, precision_score, confusion_matrix
sklearn.datasets Загрузка и генерация данных load_iris, make_classification, make_regression

Алгоритмы машинного обучения по категориям

Категория Алгоритм Класс Основные параметры
Классификация Логистическая регрессия LogisticRegression C, penalty, solver
  Случайный лес RandomForestClassifier n_estimators, max_depth, min_samples_split
  SVM SVC C, kernel, gamma
  K-ближайших соседей KNeighborsClassifier n_neighbors, weights, metric
  Наивный Байес GaussianNB var_smoothing
  Дерево решений DecisionTreeClassifier max_depth, min_samples_split, criterion
Регрессия Линейная регрессия LinearRegression fit_intercept, normalize
  Ridge регрессия Ridge alpha, solver
  Lasso регрессия Lasso alpha, max_iter
  Случайный лес RandomForestRegressor n_estimators, max_depth
  SVM SVR C, kernel, epsilon
Кластеризация K-means KMeans n_clusters, init, max_iter
  Иерархическая AgglomerativeClustering n_clusters, linkage
  DBSCAN DBSCAN eps, min_samples

Методы предобработки данных

Метод Класс Назначение Параметры
Стандартизация StandardScaler Приведение к нормальному распределению with_mean, with_std
Нормализация MinMaxScaler Масштабирование в диапазон [0,1] feature_range
Робастное масштабирование RobustScaler Устойчивость к выбросам quantile_range
One-hot кодирование OneHotEncoder Кодирование категориальных признаков sparse_output, drop
Кодирование меток LabelEncoder Преобразование категорий в числа -
Полиномиальные признаки PolynomialFeatures Создание полиномиальных комбинаций degree, include_bias

Метрики оценки качества

Тип задачи Метрика Функция Описание
Классификация Точность accuracy_score Доля правильных предсказаний
  Precision precision_score Точность по положительному классу
  Recall recall_score Полнота по положительному классу
  F1-мера f1_score Гармоническое среднее precision и recall
  ROC AUC roc_auc_score Площадь под ROC-кривой
Регрессия MSE mean_squared_error Среднеквадратичная ошибка
  MAE mean_absolute_error Средняя абсолютная ошибка
  r2_score Коэффициент детерминации
  RMSE sqrt(mean_squared_error) Корень из среднеквадратичной ошибки

Преимущества и ограничения Scikit-learn

Преимущества

  • Простота использования — единый API для всех алгоритмов
  • Качественная документация — подробные примеры и объяснения
  • Широкий выбор алгоритмов — покрывает большинство задач ML
  • Интеграция с экосистемой — отлично работает с NumPy, Pandas, Matplotlib
  • Стабильность — проверенные временем алгоритмы
  • Активное сообщество — регулярные обновления и поддержка

Ограничения

  • Нет глубокого обучения — для нейронных сетей нужны TensorFlow/PyTorch
  • Не подходит для больших данных — ограничения по памяти
  • Нет встроенной поддержки GPU — только CPU вычисления
  • Ограниченная работа с текстом — базовые возможности NLP

Практические рекомендации

Выбор алгоритма

  1. Для небольших данных (< 10000 объектов): SVM, KNN
  2. Для средних данных: Random Forest, Gradient Boosting
  3. Для больших данных: Линейные модели, SGD
  4. Для интерпретируемости: Деревья решений, линейные модели
  5. Для высокой точности: Ансамблевые методы

Процесс работы с данными

# Типичный workflow
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report

# 1. Загрузка и разделение данных
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 2. Создание пайплайна
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', RandomForestClassifier(random_state=42))
])

# 3. Подбор параметров
param_grid = {
    'classifier__n_estimators': [50, 100, 200],
    'classifier__max_depth': [3, 5, 7]
}

grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

# 4. Оценка качества
y_pred = grid_search.predict(X_test)
print(classification_report(y_test, y_pred))

Заключение

Scikit-learn остается одной из самых важных библиотек для изучения и применения машинного обучения в Python. Её простота, надежность и полнота функционала делают её идеальным выбором для большинства задач классического машинного обучения. Несмотря на некоторые ограничения, библиотека продолжает активно развиваться и остается стандартом индустрии для решения задач анализа данных и машинного обучения.

Новости