Что такое 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 |
Средняя абсолютная ошибка | |
| R² | r2_score |
Коэффициент детерминации | |
| RMSE | sqrt(mean_squared_error) |
Корень из среднеквадратичной ошибки |
Преимущества и ограничения Scikit-learn
Преимущества
- Простота использования — единый API для всех алгоритмов
- Качественная документация — подробные примеры и объяснения
- Широкий выбор алгоритмов — покрывает большинство задач ML
- Интеграция с экосистемой — отлично работает с NumPy, Pandas, Matplotlib
- Стабильность — проверенные временем алгоритмы
- Активное сообщество — регулярные обновления и поддержка
Ограничения
- Нет глубокого обучения — для нейронных сетей нужны TensorFlow/PyTorch
- Не подходит для больших данных — ограничения по памяти
- Нет встроенной поддержки GPU — только CPU вычисления
- Ограниченная работа с текстом — базовые возможности NLP
Практические рекомендации
Выбор алгоритма
- Для небольших данных (< 10000 объектов): SVM, KNN
- Для средних данных: Random Forest, Gradient Boosting
- Для больших данных: Линейные модели, SGD
- Для интерпретируемости: Деревья решений, линейные модели
- Для высокой точности: Ансамблевые методы
Процесс работы с данными
# Типичный 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. Её простота, надежность и полнота функционала делают её идеальным выбором для большинства задач классического машинного обучения. Несмотря на некоторые ограничения, библиотека продолжает активно развиваться и остается стандартом индустрии для решения задач анализа данных и машинного обучения.
Настоящее и будущее развития ИИ: классической математики уже недостаточно
Эксперты предупредили о рисках фейковой благотворительности с помощью ИИ
В России разработали универсального ИИ-агента для роботов и индустриальных процессов