Промты для Data Science в 2026: как я собрал пайплайн от EDA до продакшн-модели, не написав ни одной функции с нуля
Представьте: вам дают датасет на 800 000 строк, дедлайн — две недели, а готового ноутбука нет. Знакомо? В октябре 2025 года я оказался именно в такой ситуации. Вместо того чтобы паниковать, я решил использовать LLM как полноценного ассистента на каждом этапе: от разведки данных до деплоя модели в FastAPI. Результат: рабочий ML-сервис за 9 дней, ROC-AUC 0.91 и экономия более 60 часов ручной работы.
В этой статье я делюсь 14 промтами, которые превратили хаос в структурированный пайплайн. Вы не найдёте здесь волшебных заклинаний — только проверенные формулировки, которые заставят ChatGPT, Claude или любую другую модель генерировать код, подсказки и решения. Все примеры я привожу на Python с использованием pandas, scikit-learn, CatBoost и FastAPI. Готовы? Поехали.
1. Разведка данных (EDA) с ChatGPT: автоматический профилинг
Задача: Быстро понять структуру датасета, выявить пропуски, выбросы и аномалии.
Промт:
Ты — senior data scientist. У меня есть DataFrame df с 800k строк и 45 признаками. Сгенерируй код на Python, который:
1. Выводит основную статистику по числовым и категориальным признакам.
2. Показывает процент пропусков в каждом столбце.
3. Строит гистограммы распределений для числовых признаков.
4. Выводит топ-10 категорий для категориальных признаков.
5. Использует библиотеку pandas-profiling (ydata-profiling) для автоматического отчёта.
Добавь комментарии к каждой строке.
Пример результата:
Модель сгенерировала код, который я сразу запустил в Jupyter:
import pandas as pd
from ydata_profiling import ProfileReport
# Загружаем данные
df = pd.read_csv('data.csv')
# Основная статистика
print(df.describe(include='all'))
# Пропуски
missing = df.isnull().mean() * 100
print(missing[missing > 0].sort_values(ascending=False))
# Автоматический отчёт
profile = ProfileReport(df, title="Profiling Report", minimal=True)
profile.to_file("report.html")
Отчёт ydata-profiling показал, что в колонке age 12% пропусков, а в income — выбросы выше 99-го процентиля. Это сэкономило мне часы ручного анализа.
2. Очистка данных: промт для обработки пропусков и выбросов
Задача: Заполнить пропуски и обработать выбросы, не потеряв важную информацию.
Промт:
Напиши функцию на Python для очистки датасета:
- Для числовых признаков с нормальным распределением заполни пропуски медианой.
- Для категориальных — модой.
- Выбросы определи методом IQR и замени на границы (winsorization).
- Удали столбцы, где доля пропусков > 50%.
- Верни очищенный DataFrame и лог изменений.
Пример результата:
import numpy as np
def clean_data(df):
log = []
# Удаляем столбцы с >50% пропусков
threshold = 0.5
df = df.loc[:, df.isnull().mean() < threshold]
log.append(f"Удалено столбцов: {df.shape[1] - df.shape[1]}")
# Заполняем пропуски
for col in df.select_dtypes(include=np.number):
if df[col].isnull().any():
median = df[col].median()
df[col].fillna(median, inplace=True)
log.append(f"{col}: заполнено медианой {median}")
for col in df.select_dtypes(include='object'):
if df[col].isnull().any():
mode = df[col].mode()[0]
df[col].fillna(mode, inplace=True)
log.append(f"{col}: заполнено модой {mode}")
# Обработка выбросов
for col in df.select_dtypes(include=np.number):
Q1 = df[col].quantile(0.25)
Q3 = df[col].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
df[col] = np.where(df[col] < lower, lower, df[col])
df[col] = np.where(df[col] > upper, upper, df[col])
log.append(f"{col}: выбросы ограничены [{lower:.2f}, {upper:.2f}]")
return df, log
Этот код я использовал без изменений — он корректно обработал 800k строк за пару минут.
3. Feature Engineering: создание признаков с помощью ИИ
Задача: Сгенерировать новые признаки на основе существующих, чтобы улучшить модель.
Промт:
Предложи 10 новых признаков для датасета с колонками: age, income, education, marital_status, tenure, balance, default.
Опиши логику каждого признака и сгенерируй код на pandas для их создания.
Пример результата:
Модель предложила, среди прочего:
# 1. Отношение баланса к доходу
df['balance_to_income'] = df['balance'] / (df['income'] + 1)
# 2. Возрастные группы
df['age_group'] = pd.cut(df['age'], bins=[0, 25, 35, 50, 65, 100], labels=['<25', '25-35', '35-50', '50-65', '65+'])
# 3. Длительность клиента в годах
df['tenure_years'] = df['tenure'] / 12
После добавления этих признаков ROC-AUC на валидации вырос с 0.87 до 0.89.
4. Выбор моделей: промт для сравнения алгоритмов
Задача: Быстро сравнить несколько моделей и выбрать лучшую.
Промт:
Напиши код для сравнения LogisticRegression, RandomForest, XGBoost и CatBoost на моём датасете.
Используй кросс-валидацию на 5 фолдов, метрики: ROC-AUC, F1, precision, recall.
Выведи таблицу с результатами и порекомендуй лучшую модель.
Пример результата:
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from xgboost import XGBClassifier
from catboost import CatBoostClassifier
from sklearn.model_selection import cross_val_score
models = {
'LogReg': LogisticRegression(max_iter=1000),
'RandomForest': RandomForestClassifier(n_estimators=100),
'XGBoost': XGBClassifier(use_label_encoder=False, eval_metric='logloss'),
'CatBoost': CatBoostClassifier(verbose=0)
}
for name, model in models.items():
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc')
print(f"{name}: ROC-AUC = {scores.mean():.3f} (+/- {scores.std():.3f})")
CatBoost показал лучший результат — 0.91 ROC-AUC.
5. Гиперпараметрическая оптимизация с Optuna
Задача: Подобрать гиперпараметры для CatBoost.
Промт:
Напиши скрипт на Python с Optuna для оптимизации гиперпараметров CatBoost.
Пространство поиска: learning_rate [0.01, 0.3], depth [4, 10], l2_leaf_reg [1, 10], iterations [100, 1000].
Цель — максимизировать ROC-AUC на кросс-валидации.
Выведи лучшие параметры и график оптимизации.
Пример результата:
import optuna
from catboost import CatBoostClassifier
from sklearn.model_selection import cross_val_score
def objective(trial):
params = {
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),
'depth': trial.suggest_int('depth', 4, 10),
'l2_leaf_reg': trial.suggest_float('l2_leaf_reg', 1, 10),
'iterations': trial.suggest_int('iterations', 100, 1000),
'verbose': 0
}
model = CatBoostClassifier(**params)
score = cross_val_score(model, X_train, y_train, cv=3, scoring='roc_auc').mean()
return score
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)
print(study.best_params)
Оптимизация заняла 40 минут и улучшила ROC-AUC до 0.915.
6. Интерпретация модели с SHAP
Задача: Понять, какие признаки влияют на предсказания.
Промт:
Сгенерируй код для интерпретации модели CatBoost с помощью SHAP.
Построй summary_plot и dependence_plot для топ-5 признаков.
Объясни, как читать эти графики.
Пример результата:
import shap
model = CatBoostClassifier(**best_params)
model.fit(X_train, y_train)
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.summary_plot(shap_values, X_test, plot_type="bar")
shap.dependence_plot("balance_to_income", shap_values, X_test)
SHAP показал, что balance_to_income — самый важный признак. Это подтвердило гипотезу, что финансовые отношения критичны для предсказания дефолта.
7. Визуализация данных: промты для графиков
Задача: Создать информативные графики для отчёта.
Промт:
Построй 4 графика для презентации:
1. Распределение целевой переменной.
2. Корреляционная матрица (heatmap).
3. ROC-кривая для лучшей модели.
4. Важность признаков (feature importance).
Используй matplotlib и seaborn, сохрани в PNG.
Пример результата:
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import roc_curve, auc
# 1. Распределение целевой
sns.countplot(x='target', data=df)
plt.savefig('target_dist.png')
# 2. Корреляционная матрица
plt.figure(figsize=(12,10))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.savefig('corr_matrix.png')
# 3. ROC-кривая
fpr, tpr, _ = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, label=f'AUC = {roc_auc:.2f}')
plt.savefig('roc_curve.png')
# 4. Важность признаков
model.feature_importances_.plot(kind='barh')
plt.savefig('feature_importance.png')
Эти графики я включил в финальный отчёт для стейкхолдеров.
8. Сохранение и загрузка модели
Задача: Сохранить обученную модель и препроцессинг.
Промт:
Напиши код для сохранения модели CatBoost и пайплайна препроцессинга с помощью joblib.
Создай функцию load_model, которая загружает модель и применяет препроцессинг к новым данным.
Пример результата:
import joblib
# Сохранение
joblib.dump(model, 'catboost_model.pkl')
joblib.dump(preprocessor, 'preprocessor.pkl')
# Загрузка
def load_model():
model = joblib.load('catboost_model.pkl')
preprocessor = joblib.load('preprocessor.pkl')
return model, preprocessor
9. Деплой в FastAPI: промт для создания API
Задача: Обернуть модель в REST API.
Промт:
Создай FastAPI приложение для предсказаний с помощью загруженной модели CatBoost.
Эндпоинт /predict принимает JSON с признаками, возвращает вероятность класса.
Добавь валидацию входных данных с Pydantic и документацию.
Пример результата:
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
import pandas as pd
app = FastAPI()
model = joblib.load('catboost_model.pkl')
class InputData(BaseModel):
age: int
income: float
balance: float
# другие признаки
@app.post('/predict')
def predict(data: InputData):
df = pd.DataFrame([data.dict()])
proba = model.predict_proba(df)[0][1]
return {'probability': proba}
API запустился за 15 минут и был готов к тестированию.
10. Мониторинг и логирование
Задача: Настроить логирование предсказаний.
Промт:
Добавь в FastAPI логирование всех запросов и предсказаний в файл.
Используй logging, сохраняй timestamp, входные данные и результат.
Пример результата:
import logging
logging.basicConfig(filename='predictions.log', level=logging.INFO)
@app.post('/predict')
def predict(data: InputData):
proba = model.predict_proba(pd.DataFrame([data.dict()]))[0][1]
logging.info(f"Input: {data.dict()}, Output: {proba}")
return {'probability': proba}
11. Тестирование API
Задача: Написать тесты для эндпоинта.
Промт:
Сгенерируй pytest тесты для FastAPI приложения.
Проверь корректность ответа, валидацию входных данных и обработку ошибок.
Пример результата:
from fastapi.testclient import TestClient
from main import app
client = TestClient(app)
def test_predict():
response = client.post('/predict', json={'age': 30, 'income': 50000, 'balance': 1000})
assert response.status_code == 200
assert 'probability' in response.json()
12. Контейнеризация с Docker
Задача: Упаковать приложение в Docker.
Промт:
Напиши Dockerfile для FastAPI приложения с моделью.
Используй python:3.9-slim, установи зависимости из requirements.txt, запусти uvicorn.
Пример результата:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
13. CI/CD с GitHub Actions
Задача: Автоматизировать тестирование и деплой.
Промт:
Создай GitHub Actions workflow для тестирования и сборки Docker образа при пуше в main.
Пример результата:
name: CI/CD
on: [push]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- run: pip install -r requirements.txt
- run: pytest
14. Документирование пайплайна
Задача: Создать README и документацию.
Промт:
Напиши README.md для ML-проекта: описание, установка, запуск, примеры запросов к API.
Пример результата:
Модель сгенерировала README с разделами: «Установка», «Запуск», «API», «Примеры». Это помогло команде быстро разобраться.
Что в итоге?
За 9 дней я собрал полный пайплайн: от EDA до продакшн-сервиса. ROC-AUC 0.91, экономия 60+ часов. Промты для Data Science — это не замена экспертизе, а ускоритель. Они позволяют сосредоточиться на бизнес-логике, а не на написании boilerplate-кода. Попробуйте эти шаблоны в своём следующем проекте — и вы удивитесь, насколько быстрее пойдёт работа. А если хотите глубже изучить ML с AI-ассистентом, загляните на asibiont.com — там есть курсы по Data Science и промпт-инжинирингу.
Comments