🔖 Как Random Forest вычисляет продавцов-мошенников на маркетплейсах
Автор столкнулась с обманом на маркетплейсе и решила разобраться: можно ли с помощью ML выявлять мошенников до того, как они обманут покупателей?
🔸 Данные
Набор данных с Kaggle содержит информацию о продавцах C2C-платформы: подписчики, активность, количество товаров, давность входа. Целевая переменная
Fraud (1 = мошенник) добавлена на основе несоответствия отправленного товара описанию.Проблема: датасет несбалансирован — среднее значение
Fraud меньше 0.5, что означает перекос в сторону честных продавцов.🔸 Построение модели
Используется Random Forest с GridSearchCV для подбора гиперпараметров. Ключевой момент — параметр
class_weight: ['balanced', 'balanced_subsample'] для борьбы с дисбалансом классов.Метрика оптимизации — ROC AUC score.
Первый запуск:
paramdict = {
'criterion': ['gini','entropy'],
'min_samples_leaf': range(1,5),
'class_weight': ['balanced','balanced_subsample'],
...
}Результат показал, что
min_samples_leaf=4 (верхняя граница диапазона) — нужно расширить поиск.Второй запуск:
'min_samples_leaf': range(4,10)
Лучшие параметры оказались внутри диапазона — модель найдена.
Результат: Recall для класса 1.0 (мошенники) = 69.77%
Недостаточно для production!
🔸 Оптимизация порога
Автор предлагает сместить акцент с точности на полноту (Recall). Логика:
Два типа ошибок:
- False Negative: пропустили мошенника (опасно!)
- False Positive: заблокировали честного продавца (менее критично)
Лучше заблокировать несколько честных продавцов, чем пропустить мошенника — на маркетплейсе всегда много альтернатив.
ROC-кривая в 3D
Построена интерактивная 3D ROC-кривая с осями:
- X: False Positive Rate
- Y: True Positive Rate
- Z: Probability Threshold
Автор отмечает три точки компромисса:
Красная черта: FPR ≈ 36%, порог = 0.35
Оранжевая: FPR ≈ 50%, порог = 0.25
Зелёная: FPR ≈ 60%, порог = 0.20
Выбор зависит от толерантности к ложным срабатываниям. Автор выбрала зелёную (порог 0.20) как оптимальную.
🔸 Финальные результаты
После сдвига порога до 0.20:
Recall для класса 1.0 = 90.11%
Прирост с 69.77% до 90.11% — модель теперь обнаруживает 9 из 10 мошенников!
🔸 Ключевые выводы
1. Дисбаланс классов решается через
class_weight='balanced'2. GridSearchCV помогает найти оптимальные гиперпараметры
3. Сдвиг порога критически важен для несбалансированных задач
4. ROC-кривая в 3D — удобный инструмент для выбора порога
5. Бизнес-логика важнее технических метрик: лучше больше FP, чем FN
Практическое применение:
Маркетплейс может использовать эту модель для:
- Автоматической проверки новых продавцов
- Дополнительной верификации подозрительных аккаунтов
- Приоритизации ручных проверок
Конечно, 10% мошенников всё равно проскочат, но это огромный прогресс для защиты покупателей.
📎 Статья
🎙 Новости
📝 База вопросов
