Модели машинного обучения на Python: практическое руководство с 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 для дисбаланса).
Цель: осознанный выбор модели на основе эмпирических результатов.
Расширенные примеры использования моделей 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()
Отображается графическое дерево с пороговыми значениями и распределением классов в узлах.