Добавить в корзинуПозвонить
Найти в Дзене
Анастасия Софт

🧠 Машинное обучение для обычных людей. 🔹 Часть 5: ML в реальной жизни: с чего начать проект

или «Как не утонуть в датасетах, и не сгореть на проде» "Обучить модель — полдела. Сделать так, чтобы ей кто-то пользовался — вот где настоящая магия."
— инженер, который сделал REST API в пятницу вечером На Kaggle: В реальной жизни: 💡 Не прыгай в код — сначала поговори с теми, для кого ты это делаешь. Модель, не решающая бизнес-задачу, никому не нужна. Контекст: У нас есть пользователи, их поведение, и мы хотим предсказать — купят ли они товар. 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)
Оглавление
Часть 5: ML в реальной жизни: с чего начать проект
Часть 5: ML в реальной жизни: с чего начать проект

или «Как не утонуть в датасетах, и не сгореть на проде»

"Обучить модель — полдела. Сделать так, чтобы ей кто-то пользовался — вот где настоящая магия."

— инженер, который сделал 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 — это больше про инженерию и поддержку, чем про "магические нейросети".