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-ассистент не знает контекст ваших данных, поэтому всегда проверяйте сгенерированный код на подвыборке. Используйте эти промты как шпаргалку и ускоряйте рутину, чтобы больше времени оставалось на креативные эксперименты.
Комментарии