Отбраковка мошеннических объявлений о продаже квартир
Загрузка данных, разметка по 21 метрике, обучение модели и анализ объявлений
Загрузка данных
📖 Справка — что происходит на этом шаге?
На этом шаге вы загружаете данные — таблицу объявлений о продаже квартир — в базу данных системы. После загрузки данные можно размечать и обучать на них модель.
- Датасет
- Именованный набор данных — таблица объявлений, хранящаяся в БД. Можно создать несколько датасетов (например, «март 2026» и «апрель 2026») и сравнивать результаты обучения на разных данных.
- CSV / TSV — формат файла
- CSV (Comma-Separated Values) — таблица, где столбцы разделены запятой. TSV (Tab-Separated Values) — то же самое, но разделитель — символ табуляции (⇥). Это обычный текстовый файл, который можно открыть в Excel или блокноте.
- Разделитель
- Символ, отделяющий столбцы друг от друга в файле. Выберите «Табуляция» для TSV-файлов и «Запятая» для CSV-файлов. Если выбрать неправильно — все данные загрузятся в один столбец.
- Столбец
is_fraud - Признак мошенничества: 0 — нормальное объявление, 1 — мошенническое. Если в вашем файле этот столбец уже заполнен экспертом — разметку (Шаг 2) можно пропустить и сразу перейти к Шагу 3 «Обучение».
- Статистика датасета
- После загрузки можно посмотреть: сколько строк и столбцов, сколько из них размечено (есть метка
is_fraud), сколько мошеннических. Помогает убедиться, что файл загрузился корректно и данные выглядят ожидаемо.
Датасеты в БД
Загрузить CSV/TSV в выбранный датасет
Выберите датасет выше, затем загрузите файл.
Статистика датасета
📋 Справочник — признаки датасета и форматы файлов
Столбцы датасета (21 признак)
| Столбец | Что означает | Тип |
|---|---|---|
| price | Полная цена квартиры, руб. | число |
| total_area | Общая площадь, м² | число |
| living_area | Жилая площадь, м² | число |
| kitchen_area | Площадь кухни, м² | число |
| rooms | Количество комнат | число |
| floor | Этаж квартиры | число |
| total_floors | Этажность дома | число |
| ceiling_height | Высота потолков, м | число |
| year_built | Год постройки дома | число |
| days_on_market | Сколько дней объявление висит на сайте | число |
| city | Город | текст |
| address | Адрес объявления | текст |
| house_type | Тип дома (кирпичный, панельный, монолитный…) | текст |
| description_text | Текст объявления от продавца | текст |
| seller_phone | Телефон продавца | текст |
| seller_name | Имя / псевдоним продавца | текст |
| seller_inn | ИНН продавца (если указан) | текст |
| seller_type | Тип продавца: собственник / агентство | текст |
| listing_date | Дата публикации объявления | дата |
| region | Регион / субъект РФ | текст |
| is_fraud | Метка: 0 = нормальное, 1 = мошенническое. Если заполнена экспертом — Шаг 2 можно пропустить | 0 / 1 |
CSV vs TSV — когда что использовать:
| Формат | Разделитель | Когда использовать |
|---|---|---|
| CSV | Запятая , | Стандартный экспорт из большинства систем и Excel (сохранить как…) |
| TSV | Табуляция ⇥ | Если данные содержат запятые внутри полей (например, в адресах) |
Разметка по 21 метрике обнаружения мошенничества
📖 Справка — что происходит на этом шаге?
На этом шаге система автоматически проверяет каждое объявление по 21 правилу и ставит метку: мошенническое (1) или нормальное (0). Это называется синтетической разметкой — автоматической, на основе правил.
- Зачем нужна разметка?
- Модель машинного обучения учится на примерах — нужно показать ей, какие объявления мошеннические. Разметка создаёт эти примеры автоматически, без ручной проверки каждой строки.
- 21 метрика
- Набор из 21 правила разных типов: статистические (аномальная цена), логические (противоречия в описании), поведенческие (подозрительная активность продавца), контентные (ключевые слова мошенничества), временны́е и геолокационные. Каждое сработавшее правило добавляет очки риска — если сумма превышает порог, объявление получает метку «мошенническое».
- Синтетическая разметка vs экспертная
- Синтетическая — быстро, автоматически, но может ошибаться (правила не идеальны). Экспертная — вручную человеком, точнее. Если у вас есть CSV с готовым столбцом
is_fraudот эксперта — используйте его и пропустите этот шаг. - Осторожно: разметка перезапишет метки
- Если датасет уже содержит столбец
is_fraud— запуск разметки заменит все значения новыми, сгенерированными правилами. Экспертные метки будут потеряны.
Если загруженный CSV уже содержит столбец is_fraud с экспертными метками (0 / 1) — запускать разметку не нужно. Перейдите сразу к шагу 3 «Обучение».
Запуск разметки перезапишет экспертные метки синтетическими.
Комплексная разметка (21 метрика)
Система из 21 метрики: статистические, логические, поведенческие, контентные, временные и геолокальные проверки.
📋 Справочник — 21 правило и формула Fraud Score
Fraud Score — итоговая оценка подозрительности от 0 до 1. Это взвешенная сумма сработавших метрик, делённая на максимально возможную сумму. Чем ближе к 1 — тем подозрительнее объявление.
Формула: Fraud Score = Σ(risk_index × weight) / Σ(max_possible)
Три зоны риска: низкий риск (чистое) → средний (подозрительное) → высокий (мошенническое). В системе 6 уровней Fraud Score, укрупнённо — 3 зоны.
Три типа правил:
- Жёсткий порог — число вшито в код, не меняется (потолок < 2 м, комнат > 6)
- Динамически по датасету — порог считается по загруженному CSV (5-й/95-й процентиль цены)
- Сравнение внутри датасета — смотрит на повторения между строками одного CSV (один телефон в 20 объявлениях)
Таблица всех 21 правила
| # | Название | Что проверяет | Тип порога |
|---|---|---|---|
| 1 | Аномальная цена за м² | Цена/площадь выходит за 5–95 процентиль по своему городу | динамически по городу |
| 2 | Аномальная цена (абсолютная) | Полная цена квартиры за пределами 5–95 процентиля датасета | динамически |
| 3 | Аномальная площадь | Площадь > 115 м² или < 10 м² | жёсткий |
| 4 | Несоответствие структуры | Комнат > 6, или < 6 м² на комнату, или кухня > 50% площади, или жилая > общей | жёсткий |
| 5 | Быстрая продажа | Продаётся менее 3 дней | жёсткий |
| 6 | Активный продавец | Один телефон фигурирует в > 20 объявлениях датасета | сравнение внутри |
| 7 | Отсутствие информации | Более 50% ключевых полей пустые | жёсткий |
| 8 | Подозрительное описание | Описание 1–20 символов, или в тексте есть номер телефона | жёсткий |
| 9 | Аномальная цена на комнату | Цена/комнату > 95 процентиля по датасету | динамически |
| 10 | Проблемный адрес | Адрес заполнен, но длина 1–5 символов | жёсткий |
| 11 | Состояние и возраст | Год постройки < 1800 или > текущий+2, или потолки < 2 м или > 4 м | жёсткий |
| 12 | Экстремально низкая цена | Цена/м² менее 50% от нижнего процентиля | динамически |
| 13 | Юридический статус | В описании 2+ слов: «срочно», «без посредников», «наследство», «доверенность»… | список слов |
| 14 | Данные продавца | 2 или более из трёх полей (телефон, имя, ИНН) отсутствуют | жёсткий |
| 15 | Дублирующиеся объявления | Цена + площадь + комнаты + этаж + город совпадают с другим объявлением | сравнение внутри |
| 16 | Невалидный ИНН | ИНН заполнен, но не 10 и не 12 цифр | жёсткий |
| 17 | Массовый телефон | Один телефон > 5 объявлений (мягче метрики 6) | сравнение внутри |
| 18 | Активный «собственник» | Телефон с пометкой «собственник» в > 10 объявлениях | сравнение внутри |
| 19 | Плагиат описания | MD5-хэш текста совпадает с другим объявлением | сравнение внутри |
| 20 | Темп размещения | Продавец публикует > 3 объявлений в день | сравнение внутри |
| 21 | Один телефон — разные имена | Один телефон фигурирует под > 3 разными именами | сравнение внутри |
Обучение модели
📖 Справка — что происходит на этом шаге?
На этом шаге модель машинного обучения учится отличать мошеннические объявления от нормальных. Перед обучением данные автоматически проходят конвейер предобработки — подготовку, как чистка и нарезка овощей перед готовкой.
- Дубликаты
- Одинаковые строки в таблице — одно и то же объявление, добавленное дважды. Удаляются автоматически, иначе модель считает его «важнее», хотя это просто технический повтор.
- Пропущенные значения
- Пустые ячейки в таблице — данных нет (например, не указан этаж). Большинство алгоритмов не умеют работать с пустотой: числовые заполняем средним по столбцу, текстовые — самым частым значением.
- Нормализация и стандартизация
- Приведение числовых признаков к сопоставимому масштабу. Пример: цены 1–50 млн и этажи 1–25 — без нормализации модель будет «слушать» только цену, потому что её числа больше. После — оба признака влияют одинаково.
- Кодирование категориальных признаков (One-Hot Encoding)
- Перевод текстовых значений в числа. Пример: «тип дома» = кирпичный / панельный / монолитный → три столбца (is_кирпичный, is_панельный, is_монолитный) с 0 или 1. Только одна «1» в строке — отсюда название One-Hot.
- TF-IDF — обработка текстового описания
- Метод превращения текста объявления в числа с учётом важности слов. TF — как часто слово встречается в этом объявлении. IDF — насколько редко оно встречается во всех объявлениях. Редкое и специфичное слово получает высокий балл; слова «и», «в», «на» — почти нулевой. Результат — числовой вектор, по одному числу на каждое слово словаря.
- Мультиколлинеарность и отбор признаков
- Если два признака несут одинаковую информацию (например, «цена» и «цена за м²» — зная одно, можно вычислить другое), один удаляется. Это запутывает модель: она не знает, кому «доверять». Меньше шума — лучше результат.
- Разделение 80 / 20
- Датасет делится на две части: 80% — обучающая выборка (на ней модель учится), 20% — тестовая (честная проверка результата). Модель не видит тестовую выборку во время обучения. Как экзамен: учишься по билетам, но сдаёшь другие вопросы.
- Random Forest / Логистическая регрессия / Gradient Boosting
- Три алгоритма на выбор. Random Forest — ансамбль деревьев решений, устойчив к выбросам, хорошо работает «из коробки». Логистическая регрессия — простая и интерпретируемая, быстро обучается. Gradient Boosting — мощный алгоритм, но медленнее. Для детектирования мошенничества обычно лучший результат у Random Forest или Gradient Boosting.
Сохранённые модели
📋 Справочник — три модели и метрики качества
| Модель | Как работает | Плюсы | Минусы |
|---|---|---|---|
| Logistic Regression | Рисует разделяющую линию между классами | Быстрая, интерпретируемая, точка отсчёта для сравнения | Плохо улавливает нелинейные зависимости |
| Random Forest | Ансамбль деревьев решений, итог — голосование большинства | Устойчив к выбросам и переобучению, хорошо из коробки | Медленнее логрегрессии на больших данных |
| Gradient Boosting | Деревья строятся последовательно, каждое исправляет ошибки предыдущего | Как правило лучший результат по качеству | Медленнее, чувствителен к параметрам |
Параметры обучения:
| Параметр | Что означает | По умолчанию |
|---|---|---|
| test_size | Доля данных, отложенных для проверки. Модель их не видит при обучении | 0.2 (20%) |
| fraud_threshold | Порог вероятности для метки «мошенник». Ниже → больше находит, выше → меньше ложных тревог | 0.2 |
| class_weight='balanced' | Ошибка на редком классе (мошенники) стоит дороже. Компенсирует дисбаланс классов | включено всегда |
Метрики качества:
| Метрика | Что показывает | Когда важна |
|---|---|---|
| Accuracy | Доля всех правильных ответов | Ненадёжна при дисбалансе — модель может всегда говорить «чистое» и получить 90% |
| Precision | Из всех названных мошенниками — сколько реально мошенники? | Важна, если дорого ложно обвинить |
| Recall | Из всех реальных мошенников — скольких нашла модель? | Важнее Precision в нашей задаче — лучше лишний раз проверить |
| F1 | Баланс Precision и Recall в одном числе | Основная метрика при дисбалансе классов |
| ROC-AUC | Насколько хорошо модель ранжирует подозрительные выше чистых. 1.0 — идеал, 0.5 — монетка | Наш результат: 0.996 |
Сравнение ROC-кривых моделей
Прогноз и экспорт
📖 Справка — что происходит на этом шаге?
На этом шаге обученная модель применяется к данным и для каждого объявления выдаёт прогноз: мошенническое или нормальное. Результаты можно скачать для дальнейшей работы.
- Прогноз по датасету из БД
- Применяет выбранную модель к датасету, уже загруженному в систему. Удобно для повторного анализа тех же данных другой моделью или с другими параметрами порога.
- Прогноз по загруженному файлу
- Позволяет загрузить новый CSV/TSV файл и сразу получить прогноз — без сохранения в БД. Удобно для разовой проверки новой порции объявлений.
- Столбцы в результатах
fraud_probability— вероятность мошенничества от 0 до 1 (например, 0.85 = 85%).is_fraud_predicted— итоговая метка: 1 (мошенническое) или 0 (нормальное), зависит от порога классификации, заданного при обучении.- Экспорт CSV / Excel
- CSV — универсальный текстовый формат, открывается в любой программе. Excel — отформатированный файл с цветовой подсветкой строк по результату прогноза.
Прогноз по датасету из БД
Прогноз по загруженному файлу
📋 Справочник — столбцы результатов и форматы экспорта
| Столбец | Что означает |
|---|---|
fraud_probability | Вероятность мошенничества от 0 до 1. Например, 0.85 = модель на 85% уверена, что объявление мошенническое. Используйте для сортировки «топ подозрительных» |
is_fraud_predicted | Итоговая метка: 1 = мошенническое, 0 = нормальное. Присваивается автоматически: если fraud_probability ≥ порог (задан при обучении) → 1 |
| Формат | Особенности | Когда использовать |
|---|---|---|
| CSV | Текстовый файл, открывается в любой программе | Для дальнейшей обработки, загрузки в другие системы |
| Excel (.xlsx) | Цветовая подсветка строк по результату прогноза | Для ручного просмотра и передачи модератору |
Экспорт CSV / Excel
Сначала выполните прогноз по датасету, затем скачайте файл.
Скачать CSV Скачать ExcelДашборд системы
📖 Справка — что показывает этот раздел?
Дашборд — сводная страница с общей картиной работы системы: архитектура, статистика данных и результаты анализа мошеннических объявлений.
- Архитектура системы
- Схема того, как устроена система: браузер → Nginx → FastAPI → PostgreSQL. Nginx — «администратор на ресепшене», принимает все запросы. FastAPI — «сотрудник в кабинете», выполняет реальную работу. PostgreSQL — база данных, где хранятся объявления, модели и результаты.
- Статистика по датасету
- Общая сводка по загруженным данным: сколько объявлений, сколько размечено, сколько выявлено мошеннических. Помогает оценить масштаб и качество загруженных данных.
- Анализ мошеннических объявлений
- Детализация по конкретным объявлениям с высоким риском: какие правила сработали, какой итоговый балл риска (
fraud_score). Удобно для ручной проверки подозрительных случаев.
Архитектура системы
📋 Справочник — архитектура и компоненты системы
Схема запроса: Браузер → Nginx → FastAPI → PostgreSQL/Redis
| Компонент | Роль в системе | Аналогия |
|---|---|---|
| Nginx | Обратный прокси: принимает все запросы, отдаёт статику (HTML/CSS/JS), перенаправляет /api/* в FastAPI | Администратор на ресепшене |
| FastAPI | Сервер приложений на Python: обрабатывает запросы API, обучает модели, считает метрики | Сотрудник в кабинете |
| PostgreSQL | Реляционная база данных: хранит объявления, метки, метаданные моделей, результаты прогнозов | Архив с папками |
| Redis | Хранилище в памяти: JWT-токены авторизации, кэш. Данные не сохраняются после перезапуска | Доска для стикеров |
| Docker Compose | Запускает все четыре компонента одной командой в изолированных контейнерах | Коробка с отсеками |