800K Rows, 9 Days, Zero Handwritten Functions: The Exact ChatGPT Prompt Stack I Used to Ship a CatBoost ML Service With ROC-AUC 0.91

Промты для 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 и промпт-инжинирингу.

← All posts

Comments