или «Как не утонуть в датасетах, и не сгореть на проде»
"Обучить модель — полдела. Сделать так, чтобы ей кто-то пользовался — вот где настоящая магия."
— инженер, который сделал REST API в пятницу вечером
🚧 Реальный ML ≠ Каггл
На Kaggle:
- чистые данные,
- готовые функции,
- всё работает.
В реальной жизни:
- данные поломаны, как печенье в рюкзаке,
- бизнес не знает, чего хочет,
- продакшн — это не Jupyter, а Flask и docker 🫠
🧠 Шаг 0: Прежде чем писать код — пойми задачу
🎯 Задачи бывают:
- Классификация (да/нет, кошка/собака)
- Регрессия (предсказание чисел)
- Кластеризация (группировка без меток)
- Ранжирование (что показать первым)
- Рекомендации (что посоветовать)
- Аномалии (а что тут вообще происходит?)
💡 Не прыгай в код — сначала поговори с теми, для кого ты это делаешь. Модель, не решающая бизнес-задачу, никому не нужна.
📦 Задача 1: ML в e-commerce — «Кто купит, а кто уйдёт?»
Контекст: У нас есть пользователи, их поведение, и мы хотим предсказать — купят ли они товар.
🔹 Данные
import pandas as pd
df = pd.DataFrame({
'time_on_site': [5, 3, 15, 2, 7],
'pages_viewed': [2, 1, 10, 1, 5],
'came_from_ad': [1, 0, 1, 0, 1],
'purchased': [1, 0, 1, 0, 1]
})
🔹 Модель
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
X = df[['time_on_site', 'pages_viewed', 'came_from_ad']]
y = df['purchased']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print("Accuracy:", accuracy_score(y_test, y_pred))
👉 Комментарий: Это уже полноценная ML-задача. Теперь можно превратить это в API.
🛠️ Шаг 1: Оберни модель в API
🧪 Задача 2: Делаем простой REST API с Flask
from flask import Flask, request, jsonify
import joblib
app = Flask(__name__)
model = joblib.load("model.pkl") # Загружаем модель
@app.route("/predict", methods=["POST"])
def predict():
data = request.get_json()
features = [[
data["time_on_site"],
data["pages_viewed"],
data["came_from_ad"]
]]
prediction = model.predict(features)
return jsonify({"purchased": int(prediction[0])})
# Запуск: flask run
👉 Комментарий: Теперь кто угодно может отправить JSON с данными и получить предсказание от модели. Это и есть "реальная жизнь" ML.
📦 Задача 3: Прогноз оттока клиентов (Churn)
# Допустим, есть данные по пользователям телеком-оператора
df = pd.DataFrame({
"monthly_charges": [20, 55, 70, 40],
"tenure": [1, 12, 36, 24],
"contract_type": [0, 1, 1, 0], # 0 — помесячно, 1 — годовой контракт
"churn": [1, 0, 0, 1]
})
X = df[["monthly_charges", "tenure", "contract_type"]]
y = df["churn"]
model = LogisticRegression()
model.fit(X, y)
joblib.dump(model, "churn_model.pkl")
👉 Комментарий: Это реальный use-case. Подключай к backend и уведомляй менеджера, если клиент "на грани".
⚙️ Шаг 2: Продакшн: как не сгореть
💡 Советы от тех, кто выжил:
- Сохраняй модель: joblib.dump(model, 'model.pkl')
- Следи за версией данных: если структура изменилась — модель упадёт.
- Нормализуй и кодируй — до обучения и в API. Повторяем те же шаги и при предсказании!
- Оборачивай препроцессинг в Pipeline:
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
pipe = Pipeline([
('scaler', StandardScaler()),
('model', LogisticRegression())
])
pipe.fit(X, y)
joblib.dump(pipe, 'pipeline.pkl')
🐳 Шаг 3: Оборачиваем в Docker
Dockerfile (простой пример)
FROM python:3.10
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["flask", "run", "--host=0.0.0.0"]
👉 После этого можно запускать модель на любом сервере (или облаке).
📊 Задача 4: ML в проде — предсказание рейтинга фильма
df = pd.DataFrame({
"duration_min": [90, 120, 150, 110],
"genre_action": [1, 0, 1, 0],
"genre_drama": [0, 1, 0, 1],
"rating": [7.2, 8.5, 6.9, 8.1]
})
X = df[["duration_min", "genre_action", "genre_drama"]]
y = df["rating"]
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
model.fit(X, y)
joblib.dump(model, "movie_rating_model.pkl")
👉 API можно сделать так же, как выше, только prediction будет числом с плавающей точкой.
🚨 Задача 5: Обнаружение аномалий в банковских транзакциях
from sklearn.ensemble import IsolationForest
df = pd.DataFrame({
"amount": [10, 12, 9, 11, 1000, 8, 10, 2000], # 1000 и 2000 — подозрительные
})
model = IsolationForest(contamination=0.2)
model.fit(df)
df["anomaly"] = model.predict(df) # -1 — аномалия
print(df)
👉 Подходит для автоматического мониторинга: если пришла транзакция и predict = -1, можно отправить сигнал безопасности.
📋 Чеклист ML в продакшне
✅ Обучил модель
✅ Сохранил через joblib
✅ Обернул в API (Flask, FastAPI)
✅ Проверил на боевых данных
✅ Упаковал в Docker
✅ Не забыл про requirements.txt
✅ Задеплоил (на Heroku, Railway, Render, AWS, etc.)
🧾 Финалка
🎓 Обучить модель — это 30% работы.
🚀 Доставить её до пользователей — 70%.
В реальной жизни ML — это больше про инженерию и поддержку, чем про "магические нейросети".