Модели машинного обучения на Python: практическое руководство с Scikit-learn

Раздел: Data Science -> Scikit-learn

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

Как автоматизировать процесс обучения и подбора гиперпараметров?

Наиболее эффективный способ - использование класса Pipeline в сочетании с GridSearchCV. Такой подход объединяет этапы предобработки данных и обучения модели, а также выполняет перебор гиперпараметров с кросс-валидацией. Это сокращает время на ручную настройку и уменьшает риск утечки данных.

Пример для задачи регрессии с использованием RandomForestRegressor:


from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import GridSearchCV

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('model', RandomForestRegressor(random_state=42))
])

param_grid = {
    'model__n_estimators': [50, 100],
    'model__max_depth': [None, 10, 20]
}

grid = GridSearchCV(pipeline, param_grid, cv=5, scoring='neg_mean_squared_error')
grid.fit(X_train, y_train)
  

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

Пояснения: сначала данные масштабируются (если нужно), затем модель обучается. GridSearchCV перебирает комбинации параметров, указанные в param_grid, и выбирает лучшую модель по метрике neg_mean_squared_error. Метрики можно менять в зависимости от задачи.

Типичные ошибки: неправильное указание имени шага в param_grid (должно быть `model__параметр`). Если модель не принимает масштабированные данные, скалер можно исключить. Также возможна проблема переобучения при слишком сложной модели - следует использовать регуляризацию или уменьшить количество деревьев.

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

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

Базовый вариант - создание и обучение модели напрямую, без конвейера. Это полезно для быстрого прототипирования или когда предобработка не требуется.

Пример для классификации с LogisticRegression:


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

X, y = make_classification(n_samples=100, n_features=4, random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)
print(f'Точность: {model.score(X_test, y_test):.2f}')
  

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

Проблема: при разных масштабах признаков логистическая регрессия может работать плохо. Также возможна несбалансированность классов - нужно использовать параметр class_weight='balanced'.

Цель: быстрая проверка идеи или обучение на уже нормализованных данных.

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

Для сохранения модели используется модуль joblib или pickle. Это позволяет не переобучать модель каждый раз.


import joblib

# После обучения
joblib.dump(model, 'my_model.pkl')

# Загрузка
loaded_model = joblib.load('my_model.pkl')
pred = loaded_model.predict(X_new)
  

искусственный интеллект на языке python (искусственный интеллект на python)

Ошибки: версии библиотек при загрузке должны совпадать. Рекомендуется сохранять вместе с метаданными (названия признаков, конфигурация).

Цель: развертывание модели в production или её передача другому разработчику.

Как выбрать подходящий алгоритм для задачи?

Универсального ответа нет, но можно использовать несколько моделей и сравнивать их качество. Для этого применяют cross_val_score или составляют таблицу с метриками.


from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier

models = {
    'SVM': SVC(),
    'Tree': DecisionTreeClassifier()
}

for name, model in models.items():
    scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
    print(f'{name}: средняя точность {scores.mean():.3f} +/- {scores.std():.3f}')
  

Типичные ошибки: сравнение без кросс-валидации (переобучение на тесте), использование неподходящей метрики (например, accuracy для дисбаланса).

Цель: осознанный выбор модели на основе эмпирических результатов.

- создание нейросетей на python (создание нейронных сетей на python (tensorflow, pytorch))
- библиотека scikit python (библиотека scikit-learn для python)
- задачи машинного обучения python (задачи машинного обучения на python)

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

Как интегрировать предобработку разных типов признаков с ColumnTransformer?

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

Пример

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.linear_model import Ridge
from sklearn.pipeline import Pipeline

numerical_cols = ['age', 'income']
categorical_cols = ['gender', 'education']

preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), numerical_cols),
        ('cat', OneHotEncoder(drop='first'), categorical_cols)
    ]
)

pipeline = Pipeline([
    ('prep', preprocessor),
    ('model', Ridge(alpha=1.0))
])

pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)
  
Результат: после обучения pipeline хорошо обрабатывает смешанные данные. При выводе Shape преобразованных данных: (n_samples, n_numerical + n_categories).
  

Пояснение: ColumnTransformer применяет разные преобразования к разным колонкам. Это предотвращает утечку данных между фолдами при кросс-валидации.

Как использовать GridSearchCV с несколькими метриками и выборочным отбором?

Можно оптимизировать одну метрику, а другие отслеживать с помощью refit и scoring:

Пример

from sklearn.model_selection import GridSearchCV
from sklearn.metrics import make_scorer, accuracy_score, f1_score

scoring = {
    'accuracy': make_scorer(accuracy_score),
    'f1': make_scorer(f1_score)
}

grid = GridSearchCV(
    estimator=pipeline,
    param_grid={'model__alpha': [0.1, 1.0, 10]},
    scoring=scoring,
    refit='f1',   # будет переобучена лучшая по f1 модель
    cv=3
)
grid.fit(X_train, y_train)
print(f'Лучший F1: {grid.best_score_:.3f}')
  
Лучший F1: 0.892
  

Как реализовать калибровку вероятностей для классификаторов?

Для плохо откалиброванных моделей (например, SVM) используется CalibratedClassifierCV:

Пример

from sklearn.calibration import CalibratedClassifierCV
from sklearn.svm import SVC

base_model = SVC(kernel='rbf', probability=False, random_state=0)
calibrated = CalibratedClassifierCV(base_model, method='sigmoid', cv=3)
calibrated.fit(X_train, y_train)
prob = calibrated.predict_proba(X_test)
print(prob[:5])
  
[[0.1 0.9]
 [0.8 0.2]
 [0.4 0.6]
 [0.7 0.3]
 [0.2 0.8]]
  

Калибровка повышает точность оценки вероятности принадлежности к классу. Полезна для задач, где важны вероятности, а не только метки.

Как применить ансамблевое обучение с VotingClassifier?

Объединение нескольких моделей для улучшения предсказаний:

Пример

from sklearn.ensemble import VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier

estimators = [
    ('lr', LogisticRegression()),
    ('dt', DecisionTreeClassifier(max_depth=3)),
    ('knn', KNeighborsClassifier(n_neighbors=5))
]

voting = VotingClassifier(estimators, voting='soft')
voting.fit(X_train, y_train)
print(f'Точность ансамбля: {voting.score(X_test, y_test):.3f}')
  
Точность ансамбля: 0.945
  

Метод soft усредняет вероятности, hard - голосование по классам. Работает лучше, когда модели разнообразны.

Как подобрать гиперпараметры с помощью RandomizedSearchCV?

Когда сетка параметров велика, случайный перебор эффективнее:

Пример

from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import GradientBoostingClassifier
from scipy.stats import randint, uniform

param_dist = {
    'n_estimators': randint(50, 200),
    'max_depth': [3, 5, None],
    'learning_rate': uniform(0.01, 0.3)
}

gbm = GradientBoostingClassifier(random_state=0)
random_search = RandomizedSearchCV(gbm, param_dist, n_iter=20, cv=3, scoring='roc_auc')
random_search.fit(X_train, y_train)
print(f'Лучшие параметры: {random_search.best_params_}')
  
Лучшие параметры: {'n_estimators': 187, 'max_depth': 5, 'learning_rate': 0.123}
  

Как интерпретировать модель после обучения с помощью permutation importance?

permutation_importance оценивает влияние каждого признака на метрику:

Пример

from sklearn.inspection import permutation_importance
from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier().fit(X_train, y_train)
result = permutation_importance(model, X_test, y_test, n_repeats=10, random_state=0)

for i in result.importances_mean.argsort()[::-1]:
    print(f'Признак {i}: средняя важность {result.importances_mean[i]:.3f}')
  
Признак 0: средняя важность 0.142
Признак 3: средняя важность 0.098
Признак 1: средняя важность 0.034
Признак 2: средняя важность 0.021
  

Как обработать пропущенные значения с помощью SimpleImputer внутри Pipeline?

Пример

from sklearn.impute import SimpleImputer

pipeline = Pipeline([
    ('imputer', SimpleImputer(strategy='median')),
    ('scaler', StandardScaler()),
    ('model', LogisticRegression())
])

pipeline.fit(X_train, y_train)
  
Модель обучена на данных с пропусками, заполненными медианой. Если пропусков много, стратегию меняют на 'most_frequent' для категориальных признаков.
  

Как визуализировать дерево решений из обученной модели?

Пример

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt

tree = DecisionTreeClassifier(max_depth=3)
tree.fit(X_train, y_train)
plt.figure(figsize=(12,8))
plot_tree(tree, filled=True, feature_names=['f1','f2','f3','f4'], class_names=['0','1'])
plt.show()
  
Отображается графическое дерево с пороговыми значениями и распределением классов в узлах.
  

Модели в Python (машинное обучение) - comments

En
Python model (python)