Введение
Машинное обучение (ML) уже давно перестало быть уделом узких специалистов. Сегодня любой разработчик, аналитик или исследователь может запустить модель с помощью библиотек Scikit-learn, XGBoost и CatBoost. Но как сделать процесс не просто рабочим, а эффективным? Ключ — в правильных промтах (запросах к AI-ассистентам, таким как ChatGPT или Claude), которые помогают автоматизировать рутину: от очистки данных до подбора гиперпараметров. В этой статье я собрал 15 промтов, разбитых на три уровня сложности, с примерами кода и пояснениями. Вы узнаете, как ускорить препроцессинг, избежать переобучения и построить production-ready пайплайн.
Базовые промты: препроцессинг и первая модель
1. Очистка данных с Scikit-learn
Задача: Удалить пропуски, выбросы и нормализовать числовые признаки.
Промт: «Напиши код на Python с Scikit-learn, который загружает CSV, обрабатывает пропуски методом median imputation, удаляет выбросы по методу IQR (межквартильный размах) и масштабирует признаки с помощью StandardScaler. Данные: числовые и категориальные столбцы.»
Пример результата:
import pandas as pd
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, LabelEncoder
from scipy import stats
import numpy as np
df = pd.read_csv('data.csv')
# Обработка пропусков
num_cols = df.select_dtypes(include=[np.number]).columns
imputer = SimpleImputer(strategy='median')
df[num_cols] = imputer.fit_transform(df[num_cols])
# Удаление выбросов
z_scores = np.abs(stats.zscore(df[num_cols]))
df = df[(z_scores < 3).all(axis=1)]
# Масштабирование
scaler = StandardScaler()
df[num_cols] = scaler.fit_transform(df[num_cols])
2. Разделение данных на train/test
Задача: Сбалансированное разбиение датасета.
Промт: «Напиши код на Python с train_test_split из Scikit-learn, который стратифицирует данные по целевой переменной и разделяет их в соотношении 80/20.»
Пример результата:
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, stratify=y, random_state=42)
3. Обучение логистической регрессии
Задача: Быстрый бейзлайн.
Промт: «Обучи LogisticRegression на Scikit-learn с L2-регуляризацией и выведи accuracy на тестовой выборке.»
Пример результата:
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
model = LogisticRegression(penalty='l2', C=1.0, random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(f'Accuracy: {accuracy_score(y_test, y_pred):.3f}')
4. Простое дерево решений
Задача: Интерпретируемая модель.
Промт: «Построй DecisionTreeClassifier с глубиной 3 и визуализируй дерево с помощью plot_tree.»
Пример результата:
from sklearn.tree import DecisionTreeClassifier, plot_tree
import matplotlib.pyplot as plt
dt = DecisionTreeClassifier(max_depth=3, random_state=42)
dt.fit(X_train, y_train)
plt.figure(figsize=(12,8))
plot_tree(dt, filled=True, feature_names=feature_names)
plt.show()
Продвинутые промты: XGBoost и CatBoost
5. XGBoost с настройкой гиперпараметров
Задача: Обучение XGBoost с ранней остановкой.
Промт: «Напиши код для XGBoost, используя XGBClassifier, с параметрами: learning_rate=0.1, max_depth=6, n_estimators=1000, early_stopping_rounds=10 на eval_set.»
Пример результата:
import xgboost as xgb
model = xgb.XGBClassifier(learning_rate=0.1, max_depth=6, n_estimators=1000, random_state=42)
model.fit(X_train, y_train, eval_set=[(X_test, y_test)], early_stopping_rounds=10, verbose=False)
print(f'Best iteration: {model.best_iteration}')
6. CatBoost с категориальными признаками
Задача: Использовать CatBoost без кодирования категорий.
Промт: «Обучи CatBoostClassifier с указанием категориальных признаков через cat_features, используя eval_metric='F1'.»
Пример результата:
from catboost import CatBoostClassifier
cat_features = ['category_column'] # индексы или имена
model = CatBoostClassifier(iterations=500, learning_rate=0.1, eval_metric='F1', random_seed=42)
model.fit(X_train, y_train, cat_features=cat_features, eval_set=(X_test, y_test), verbose=False)
7. Подбор гиперпараметров с GridSearchCV
Задача: Оптимизация XGBoost.
Промт: «Используй GridSearchCV для XGBClassifier с сеткой параметров: learning_rate [0.01, 0.1], max_depth [3, 6], n_estimators [100, 200].»
Пример результата:
from sklearn.model_selection import GridSearchCV
param_grid = {'learning_rate': [0.01, 0.1], 'max_depth': [3, 6], 'n_estimators': [100, 200]}
grid = GridSearchCV(xgb.XGBClassifier(random_state=42), param_grid, cv=3, scoring='f1')
grid.fit(X_train, y_train)
print(f'Best params: {grid.best_params_}')
8. Feature importance визуализация
Задача: Понять, какие признаки важны.
Промт: «Выведи feature importance для XGBoost в виде barplot, отсортировав по убыванию.»
Пример результата:
import matplotlib.pyplot as plt
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
plt.figure(figsize=(10,6))
plt.bar(range(len(importances)), importances[indices])
plt.xticks(range(len(importances)), [feature_names[i] for i in indices], rotation=90)
plt.title('Feature Importance - XGBoost')
plt.show()
9. Кросс-валидация XGBoost
Задача: Оценка стабильности модели.
Промт: «Выполни 5-фолдную кросс-валидацию для XGBClassifier, используя cross_val_score с метрикой ROC-AUC.»
Пример результата:
from sklearn.model_selection import cross_val_score
scores = cross_val_score(xgb.XGBClassifier(random_state=42), X, y, cv=5, scoring='roc_auc')
print(f'Mean AUC: {scores.mean():.3f} (+/- {scores.std():.3f})')
10. CatBoost с кастомной метрикой
Задача: Задать свою функцию потерь.
Промт: «Определи кастомную метрику для CatBoost, например, weighted accuracy, и передай её в eval_metric.»
Пример результата:
class WeightedAccuracy:
def get_final_error(self, error, weight):
return error / weight
def is_max_optimal(self):
return True
def evaluate(self, approxes, target, weight):
weight = weight or 1
approx = approxes[0]
pred = (approx > 0.5).astype(int)
correct = (pred == target).astype(float)
return sum(correct * weight), sum(weight)
model = CatBoostClassifier(iterations=100, eval_metric=WeightedAccuracy(), random_seed=42)
Экспертные промты: ансамбли и production
11. Стекинг моделей
Задача: Объединить Scikit-learn, XGBoost и CatBoost в стекинг-ансамбль.
Промт: «Создай StackingClassifier с базовыми моделями: RandomForest, XGBClassifier, CatBoostClassifier; финальный мета-модель — LogisticRegression.»
Пример результата:
from sklearn.ensemble import StackingClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
base_models = [
('rf', RandomForestClassifier(n_estimators=100, random_state=42)),
('xgb', xgb.XGBClassifier(n_estimators=100, random_state=42)),
('cat', CatBoostClassifier(iterations=100, verbose=False, random_seed=42))
]
meta_model = LogisticRegression()
stack = StackingClassifier(estimators=base_models, final_estimator=meta_model, cv=5)
stack.fit(X_train, y_train)
12. Сохранение и загрузка модели
Задача: Сериализация модели для продакшена.
Промт: «Сохрани обученный XGBoost в формат JSON с помощью save_model и загрузи обратно.»
Пример результата:
import xgboost as xgb
model.save_model('model.json')
loaded_model = xgb.XGBClassifier()
loaded_model.load_model('model.json')
13. Оптимизация с Optuna
Задача: Байесовская оптимизация гиперпараметров.
Промт: «Используй Optuna для поиска лучших параметров XGBoost: learning_rate, max_depth, subsample, colsample_bytree.»
Пример результата:
import optuna
def objective(trial):
params = {
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),
'max_depth': trial.suggest_int('max_depth', 3, 10),
'subsample': trial.suggest_float('subsample', 0.6, 1.0),
'colsample_bytree': trial.suggest_float('colsample_bytree', 0.6, 1.0)
}
model = xgb.XGBClassifier(**params, n_estimators=100, random_state=42)
score = cross_val_score(model, X, y, cv=3, scoring='f1').mean()
return score
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)
print(f'Best params: {study.best_params}')
14. Интерпретация SHAP
Задача: Объяснить предсказание модели.
Промт: «Вычисли SHAP-значения для XGBoost и построй summary_plot.»
Пример результата:
import shap
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, feature_names=feature_names)
15. Пайплайн с ColumnTransformer
Задача: Единый пайплайн препроцессинга и обучения.
Промт: «Создай Pipeline с ColumnTransformer для числовых (StandardScaler) и категориальных (OneHotEncoder) признаков, заканчивающийся XGBoost.»
Пример результата:
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
numeric_features = ['age', 'income']
categorical_features = ['city', 'gender']
preprocessor = ColumnTransformer(
transformers=[
('num', StandardScaler(), numeric_features),
('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
])
pipeline = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', xgb.XGBClassifier(random_state=42))
])
pipeline.fit(X_train, y_train)
Заключение
Мы разобрали 15 промтов, которые покрывают весь жизненный цикл ML-модели: от загрузки и очистки данных до продвинутых ансамблей и интерпретации. Scikit-learn остаётся лучшим выбором для быстрых экспериментов и препроцессинга, XGBoost — для соревнований и задач с табличными данными, а CatBoost — для работы с категориальными признаками без лишнего кодирования. Используйте эти промты как шпаргалку, адаптируйте под свои данные и не забывайте про валидацию. Если вы хотите углубиться в тему, рекомендую изучить официальную документацию каждой библиотеки: Scikit-learn, XGBoost, CatBoost.
Комментарии