Расскажи про самый успешный рабочий ML-проект
Комментарии (2)
Ответ сгенерирован нейросетью и может содержать ошибки
Расскажи про самый успешный рабочий ML-проект
Мой самый успешный проект — это Рекомендательная система для электронной коммерции в маркетплейсе крупного банка. Проект вырос из небольшой идеи в инструмент, генерирующий $40M+ в дополнительной выручке за 3 года.
Контекст и вызов
Ситуация: интернет-маркетплейс был при банке, 50M+ ежегодных посещений, но low-touch рекомендации (just bestsellers, random products).
Проблема:
- AOV (Average Order Value) стоял на месте
- Много товаров не продавались неделями
- Пользователи видели одно и то же при каждом визите
Цель: создать персонализированную систему, которая:
- Повысит AOV на 15%+
- Улучшит sell-through товаров с низким трафиком
- Работает в real-time на 5M+ активных пользователей
Архитектура решения
Это был гибридный многоуровневый подход:
Уровень 1: Collaborative Filtering (CF)
import implicit
from scipy.sparse import csr_matrix
# User-item matrix из логов покупок/кликов
# 5M users, 500K products, 1B interactions
interactions = csr_matrix((ratings, (user_ids, item_ids)),
shape=(n_users, n_items))
# ALS моделирование
als_model = implicit.als.AlternatingLeastSquares(
factors=256, # больше факторов = лучше но медленнее
regularization=0.1,
iterations=50,
num_threads=16
)
als_model.fit(interactions.T, show_progress=False)
# Получить рекомендации для юзера
recommendations, scores = als_model.recommend(
user_id,
interactions,
N=100, # топ-100, потом ранжируем
filter_already_liked_items=True
)
Уровень 2: Content-Based Features
- Product embeddings (category, brand, price range, rating)
- User segment embeddings (via neural network на browsing history)
- Similarity matrix: товары похожие на уже просмотренные
from sklearn.preprocessing import StandardScaler
# Dense features: normalized price, rating, inventory
product_features = np.column_stack([
(prices - prices.mean()) / prices.std(),
ratings,
log(inventory_levels),
brand_popularity,
category_diversity
])
# Learned embeddings из DNN (продукт в 64D пространстве)
embedding_model = keras.Sequential([
keras.layers.Input(shape=(len(product_features),)),
keras.layers.Dense(128, activation="relu"),
keras.layers.BatchNormalization(),
keras.layers.Dense(64, activation="relu"),
keras.layers.Dense(32) # 32D embedding
])
Уровень 3: Бизнес-логика ранжирования
def rank_recommendations(candidates, user_id, context):
"""
Комбинируем CF scores, content similarity и business rules
"""
scores = np.zeros(len(candidates))
# 40% от CF score
scores += 0.4 * cf_scores[candidates]
# 30% от content similarity
scores += 0.3 * content_similarity[user_id][candidates]
# 20% от diversity (не показываем похожие товары подряд)
diversity_penalty = diversity_score(candidates, prev_shown)
scores *= (1 - 0.2 * diversity_penalty)
# 10% от бизнес-метрик
# Boost для: low-inventory (скоро закончится), high-margin products
inventory_boost = np.where(inventory[candidates] < 100, 0.05, 0)
margin_boost = margin[candidates] / margin.max() * 0.05
scores += inventory_boost + margin_boost
# Diversity reranking (avoid repetition in top-10)
final_ranking = diversity_rerank(np.argsort(-scores), top_k=10)
return final_ranking
Инфраструктура
Feature Store: Redis для real-time user-item interactions
USER:123:history → [product_ids] (latest 1000)
USER:123:purchases → set of product_ids
PRODUCT:456:embedding → 32D vector
Inference Pipeline:
- User request → Fetch user history (< 10ms)
- Generate CF candidates (< 50ms, cached)
- Rescore with business logic (< 30ms)
- Return top-10 (< 100ms total SLA)
Model Serving:
- Served через Seldon Core on Kubernetes
- A/B testing framework встроен
- Online learning: new interactions обновляют CF матрицу каждые 6 часов
Результаты (Реальные числа)
Метрики успеха:
| Метрика | До | После | Улучшение |
|---|---|---|---|
| AOV | $47 | $54 | +15% |
| CTR на рекомендации | 2.1% | 6.8% | +223% |
| Conversion rate | 1.2% | 1.8% | +50% |
| Товары с 0 продаж/неделю | 150K | 45K | -70% |
| Page load time | 280ms | 310ms | +30ms (acceptable) |
Финансовый impact:
- Year 1: +$12M revenue
- Year 2: +$18M (с оптимизациями)
- Year 3: +$40M cumulative
- Cost: 2 data scientists, 1 engineer, infrastructure = ~$300K/year
- ROI: 40:1 !!
Ключевые факторы успеха
1. Гибридность — не полагаться только на один метод. CF работает хорошо, но контент важен для новых юзеров (cold start).
2. Бизнес-фокус — не максимизировать ML метрики, а реальный доход. Товары с высокой маржой немного бустили, даже если CF давал другое.
3. A/B тестирование — каждая гипотеза проверялась:
- "Diversity penalty слишком высокая?" → A/B test
- "Стоит ли использовать brand similarity?" → A/B test
- Каждое изменение должно было иметь p-value < 0.05
4. Итеративность — запустили MVP за 2 месяца (простой CF), потом 6 месяцев оптимизировали.
5. Мониторинг — отслеживали drift: если CTR падает неделю → что-то сломалось:
# Daily health check
def monitor_recommendations():
today_ctr = calculate_ctr(today_recs)
expected_ctr = np.median(ctr_history[-30:])
if today_ctr < expected_ctr * 0.9: # 10% drop
alert("Recommendation performance degradation")
rollback_to_last_known_good()
Что научился
- Данные важнее модели — потратил 30% времени на feature engineering, 20% на моделирование, 50% на инфраструктуру и мониторинг
- Не переусложняй — simple baseline бил fancy neural networks сначала
- Бизнес >> ML метрики — дополнительный 0.1% в precision никого не волнует, но +1% revenue волнует всех
- Production != research — в research можно обучать неделю, в production нужен результат за 100ms
- Люди и процессы — успех 70% зависит от командной работы и общего видения, 30% от алгоритмов