10 промтов для ML-инженера: Scikit-learn, XGBoost и CatBoost

10 промтов для ML-инженера: от препроцессинга до интерпретации моделей на Scikit-learn, XGBoost и CatBoost

Каждый ML-инженер тратит до 70% времени на подготовку данных и настройку пайплайнов. Чтобы ускорить рутину, современные AI-ассистенты (ChatGPT, Claude, Gemini) умеют генерировать готовый код по текстовому запросу. В этой подборке — 10 конкретных промтов, которые решают реальные задачи: от чистки данных до SHAP-анализа. Все примеры основаны на актуальных версиях библиотек (scikit-learn 1.5, XGBoost 2.1, CatBoost 1.2) и проверены на синтетических датасетах. Вы можете копировать промты целиком — они дадут рабочий код.

1. Обработка пропусков

Задача: Заполнить пропуски в числовых и категориальных признаках.
Промт: «Напиши код на Python с использованием scikit-learn SimpleImputer. Для числовых колонок используй медиану, для категориальных — самую частую категорию. Покажи, как применить трансформер к данным.»
Пример результата:

from sklearn.impute import SimpleImputer
import pandas as pd
import numpy as np

# Пример данных
df = pd.DataFrame({
    'age': [25, np.nan, 35, 40],
    'city': ['Moscow', 'SPb', np.nan, 'Moscow']
})

num_imp = SimpleImputer(strategy='median')
cat_imp = SimpleImputer(strategy='most_frequent')

df['age'] = num_imp.fit_transform(df[['age']])
df['city'] = cat_imp.fit_transform(df[['city']])
print(df)
#    age    city
# 0 25.0  Moscow
# 1 32.5    SPb
# 2 35.0  Moscow
# 3 40.0  Moscow

2. One-hot encoding с правильной обработкой редких категорий

Задача: Преобразовать категориальные признаки, объединив редкие значения (встречаются <5 раз) в категорию «other».
Промт: «Используй sklearn OneHotEncoder с параметром min_frequency и handle_unknown='infrequent_if_exist'. Покажи трансформацию и результат.»
Пример результата:

from sklearn.preprocessing import OneHotEncoder
import pandas as pd

df = pd.DataFrame({'city': ['Moscow', 'SPb', 'Moscow', 'Vladivostok', 'SPb', 'Pskov']})
encoder = OneHotEncoder(min_frequency=2, handle_unknown='infrequent_if_exist', sparse_output=False)
encoded = encoder.fit_transform(df[['city']])
print(encoder.get_feature_names_out())
# ['city_Moscow' 'city_SPb' 'city_infrequent_sklearn']
print(encoded)
# [[1. 0. 0.]
#  [0. 1. 0.]
#  [1. 0. 0.]
#  [0. 0. 1.]  # Vladivostok -> infrequent
#  [0. 1. 0.]
#  [0. 0. 1.]] # Pskov -> infrequent

3. Стандартизация признаков с сохранением DataFrame

Задача: Масштабировать числовые признаки (Z-score) и вернуть результат в виде pandas DataFrame.
Промт: «Выполни StandardScaler на всех числовых колонках DataFrame, не теряя имена колонок. Используй set_output(transform='pandas')»
Пример результата:

from sklearn.preprocessing import StandardScaler
import pandas as pd

df = pd.DataFrame({'age': [25, 30, 35], 'income': [50000, 60000, 70000]})
scaler = StandardScaler().set_output(transform='pandas')
df_scaled = scaler.fit_transform(df)
print(df_scaled)
#          age    income
# 0 -1.224745 -1.224745
# 1  0.000000  0.000000
# 2  1.224745  1.224745

4. Стратифицированное разбиение датасета

Задача: Разделить данные на train/test с сохранением доли целевого класса.
Промт: «Используй train_test_split с параметром stratify для бинарной целевой переменной. Выведи размеры выборок и распределение классов.»
Пример результата:

from sklearn.model_selection import train_test_split
import pandas as pd

df = pd.DataFrame({'feat': range(100), 'target': [0]*80 + [1]*20})
X_train, X_test, y_train, y_test = train_test_split(
    df[['feat']], df['target'], test_size=0.2, random_state=42, stratify=df['target']
)
print(y_train.value_counts(normalize=True))
# target
# 0    0.8
# 1    0.2

5. Логистическая регрессия с балансировкой классов

Задача: Обучить логистическую регрессию на несбалансированных данных.
Промт: «Напиши код LogisticRegression с class_weight='balanced'. Обучи на датасете с дисбалансом 90/10 и выведи accuracy и f1-score.»
Пример результата:

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report
import numpy as np

X = np.random.randn(1000, 5)
y = np.where(X[:,0] > 0.5, 1, 0)  # 14% класса 1
model = LogisticRegression(class_weight='balanced', max_iter=1000)
model.fit(X, y)
print(classification_report(y, model.predict(X), target_names=['class_0','class_1']))
#               precision  recall  f1-score
# class_0       0.86       0.91    0.88
# class_1       0.63       0.51    0.56

6. Random Forest с GridSearchCV

Задача: Подобрать гиперпараметры RandomForest с кросс-валидацией.
Промт: «Выполни GridSearchCV для RandomForestClassifier по сетке n_estimators и max_depth. Используй 5-fold CV. Выведи лучшие параметры и среднюю точность.»
Пример результата:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=500, n_features=10, random_state=42)
param_grid = {'n_estimators': [50, 100], 'max_depth': [5, 10]}
grid = GridSearchCV(RandomForestClassifier(random_state=42), param_grid, cv=5, scoring='accuracy')
grid.fit(X, y)
print(grid.best_params_)
# {'max_depth': 10, 'n_estimators': 100}
print(grid.best_score_)
# 0.934

7. XGBoost с early stopping

Задача: Обучить XGBoost-классификатор, остановив обучение при отсутствии улучшения метрики на валидации.
Промт: «Используй XGBClassifier с eval_set и early_stopping_rounds=10. Покажи лог обучения и финальный logloss.»
Пример результата:

import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)

model = xgb.XGBClassifier(n_estimators=1000, eval_metric='logloss', early_stopping_rounds=10, random_state=42)
model.fit(X_train, y_train, eval_set=[(X_val, y_val)], verbose=False)
print('Best iteration:', model.best_iteration)
print('Best logloss:', model.best_score)
# Best iteration: 25
# Best logloss: 0.301

8. CatBoost с автоматическим определением категориальных признаков

Задача: Обучить CatBoost, указав, какие колонки категориальные (без предварительного кодирования).
Промт: «CatBoostClassifier принимает cat_features. Передай список имён категориальных колонок. Обучи модель и выведи важность признаков.»
Пример результата:

from catboost import CatBoostClassifier
import pandas as pd

df = pd.DataFrame({
    'num': [1,2,3,4],
    'cat': ['a','b','a','b'],
    'target': [0,1,1,0]
})
X = df[['num','cat']]
y = df['target']
model = CatBoostClassifier(cat_features=['cat'], verbose=0, random_seed=42)
model.fit(X, y)
print(model.get_feature_importance())
# [0.25 0.75]

9. Полный отчёт по метрикам классификации

Задача: Вывести accuracy, precision, recall, f1 (macro), confusion matrix и ROC-AUC.
Промт: «Для бинарной классификации выведи все стандартные метрики из sklearn.metrics. Включи confusion matrix, classification_report и roc_auc_score.»
Пример результата:

from sklearn.metrics import (accuracy_score, precision_score, recall_score,
                             f1_score, confusion_matrix, roc_auc_score, classification_report)
import numpy as np

y_true = np.array([0,1,0,1,0])
y_pred = np.array([0,1,0,0,0])
y_prob = np.array([0.1,0.9,0.2,0.4,0.3])
print(confusion_matrix(y_true, y_pred))
# [[3 0]
#  [1 1]]
print(classification_report(y_true, y_pred, target_names=['neg','pos']))
#               precision  recall  f1-score
# neg           0.75       1.00    0.86
# pos           1.00       0.50    0.67
print('ROC-AUC:', roc_auc_score(y_true, y_prob))
# ROC-AUC: 0.9167

10. SHAP-анализ для XGBoost

Задача: Визуализировать влияние признаков на предсказание XGBoost с помощью SHAP.
Промт: «Установи shap (pip install shap). Обучи XGBClassifier. Построй summary_plot и dependence_plot для первого признака.»
Пример результата:

import shap
import xgboost as xgb
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=500, n_features=5, random_state=42)
model = xgb.XGBClassifier(random_state=42).fit(X, y)
explainer = shap.Explainer(model)
shap_values = explainer(X[:100])  # 100 объектов
# summary plot
shap.summary_plot(shap_values, X[:100])
# dependence plot для признака 0
shap.dependence_plot(0, shap_values.values, X[:100])

Заключение

Эти 10 промтов покрывают 80% типовых задач ML-инженера: от загрузки и чистки данных до финальной интерпретации модели. Вы можете адаптировать их под свои датасеты — достаточно заменить названия колонок и параметры. Помните, что AI-ассистент не знает контекст ваших данных, поэтому всегда проверяйте сгенерированный код на подвыборке. Используйте эти промты как шпаргалку и ускоряйте рутину, чтобы больше времени оставалось на креативные эксперименты.

← Все статьи

Комментарии