Краткое резюме: Скликивание рекламы – серьёзная проблема, когда конкуренты или боты кликают по объявлениям без намерения купить, унося до 15-40% бюджета рекламной кампании. Современные антифрод-сервисы, например clickfraud, используют нейросетевые алгоритмы для анализа каждого клика и быстрой блокировки ботов. В статье рассмотрим, как работают классические методы защиты и в чём их ограничения, покажем, какую роль играют машинное обучение и нейросети в борьбе с кликфродом. Приведём сравнительные таблицы подходов, опишем пример архитектуры системы защиты, а в конце ответим на частые вопросы по теме.
Что такое кликфрод и скликивание рекламы
Кликфрод (click fraud) – это мошенничество, при котором конкуренты, клик-фермы или автоматизированные боты искусственно увеличивают число кликов по вашим объявлениям без намерения купить товар. В результате рекламодатель тратит деньги впустую, а данные статистики искажены. По отраслевым исследованиям, рекламодатели в России теряют на таких нецелевых кликах 15-40% бюджета. Скликивание может осуществляться несколькими способами:
- Конкуренты: намеренно «сливают» ваш бюджет, чтобы вывести вас из аукциона.
- Клик-фермы и боты: сети автоматических программ или людей, которые массово кликают по рекламе.
- Автоматизированные скрипты: собирают данные по объявлениям, генерация кликов происходит без участия человека.
- Случайные клики: неконтролируемые нажатия (например, некорректное срабатывание мобильных экранов).
Чтобы понять, что вашу рекламу скликивают, обратите внимание на признаки в статистике: внезапный рост числа кликов без увеличения заявок, высокий процент отказов (>90%), множественные переходы с одного IP за короткое время, клики в нерабочее время или из «подозрительных» регионов. При совпадении 2-3 сигналов стоит подключать защиту от скликивания.
Традиционные методы защиты от кликфрода
Ранее защита от скликивания опиралась на жёсткие правила: чёрные списки IP, капчи, блокировку подозрительных пользователей или пороговые эвристики. Многие рекламные платформы (Яндекс.Директ, Google Ads) имеют встроенные антифрод-модули, но они не дают 100% защиты. Эти «статические» подходы просты, но у них есть минусы: мошенники адаптируются и становятся хитрее, поэтому фиксированные правила быстро устаревают. Классические системы на основе правил (блокировка по IP, уточнение частоты кликов и т.д.) легко обходятся злоумышленниками.
Преимущества классических методов:
- Быстрая реализация и знакомые администратору правила.
- Понятность решений (например, «забанить IP с N кликов в минуту»).
Недостатки:
- Низкая адаптивность: при новой схеме мошенничества придётся вручную обновлять правила.
- Высокая доля ложных срабатываний: реальных пользователей можно заблокировать по ошибке.
- Не учитывают скрытые закономерности в поведении пользователей.
Как показали исследования, статические системы часто проигрывают современным атакам. Например, в одном обзоре отметили, что традиционные правила «быстро становятся устаревшими, поскольку мошенники совершенствуют техники, имитируя поведение реальных людей». Поэтому в последние годы всё больше внимания уделяется автоматическому анализу данных и более «умным» методам защиты.
Машинное обучение и классические алгоритмы обнаружения кликфрода
Классические алгоритмы машинного обучения
Прежде чем перейти к нейросетям, напомним о проверенных классических алгоритмах, которые нередко успешно применяются для обнаружения кликфрода. Все они решают задачу бинарной классификации (клик – фрод/легитимность) и опираются на различные подходы.
Логистическая регрессия
Принцип работы: Логистическая регрессия – один из базовых методов для классификации. Она строит линейную комбинацию признаков и «проталкивает» её через сигмоидальную функцию, чтобы получить вероятность принадлежности к классу «фрод». Если $x$ – вектор признаков, то вычисляется $\sigma(w^T x + b)$, где $\sigma(t)=1/(1+e^{-t})$. Полученная вероятность сравнивается с порогом.
Плюсы/минусы в задаче кликфрода: Логистическая регрессия хорошо работает при небольшом количестве признаков и линейной зависимости. Она даёт вероятностный ответ, что удобно для настраиваемых порогов (например, снизить ложные срабатывания на честные клики). Её легко интерпретировать (веса $w_i$ показывают важность признаков). Главный минус – если связь «признаки-метка» сложная и нелинейная, простая линейная модель может плохо отделять фродовые клики.
Требования к данным: Нужны числовые признаки (категории обычно кодируют одним горячим кодированием или метками). Хорошо работает, когда признаки масштабированы (например, стандартизированы). Не «требователен» к объёму данных: можно обучаться и на сравнительно небольших выборках, но с ростом числа признаков и данных время обучения растёт.
Примеры признаков: Часто используются частоты кликов, интервалы между кликами, количество уникальных IP, время между переходом и кликом, поведение юзера до/после клика. Простейшая модель могла бы учитывать, например, количество кликов с одного IP за N секунд. Формула модели: $$\hat y = \sigma(w_1 x_1 + \dots + w_n x_n + b),.$$ Обучение обычно ведётся методом градиентного спуска (или методом Ньютона) с регуляризацией. Сложность обучения около $O(n_{\text{iter}} \times N \times M)$, где $N$ – число образцов, $M$ – число признаков, $n_{\text{iter}}$ – число итераций оптимизации. Предсказание новой точки – $O(M)$.
Пример псевдокода (обучение):
css for epoch in 1..n_iter:
pred = sigmoid(X @ w + b)
grad_w = X^T (pred - y) / N + reg * w
w = w - lr * grad_w
b = b - lr * sum(pred - y)/N
Деревья решений
Принцип работы: Дерево решений строит модель в виде набора «если-то» правил. По каждому признаку оно рекурсивно делит объём данных на группы. На листе дерева к определённому сочетанию условий прикрепляется метка «фрод/не фрод». Например, проверять: «Если число кликов с одного IP > 5, то идём в одну ветку, иначе в другую», дальше «Если геолокация не совпадает с IP, то метка = фрод, иначе – нет» и т.д. Дерево самостоятельно выбирает разбиения по признакам, которые максимально разделяют классы (с точки зрения критерия Джини или энтропии).
Плюсы/минусы: Дерева легко интерпретировать («белый ящик»). Не требует масштабирования данных и справляется как с числовыми, так и категориальными признаками (в scikit-learn категориальные сначала надо кодировать). Быстро обучаются, а предсказание нового примера занимает время, пропорциональное глубине дерева (обычно небольшое). Минусы: склонны к переобучению, если дерево вырастить глубоко. Одно большое дерево может дать низкую смещённость, но высокую дисперсию. В задаче кликфрода дерево хорошо подходит, когда поведение мошенника описывается простыми правилами (например, много кликов подряд с одного IP), но может пропустить сложные паттерны. Построение дерева чувствительно к шуму в данных, поэтому результат может сильно меняться при незначительных изменениях выборки.
Требования к данным: Данные могут быть необработанными; важны информативные признаки. Чтобы избежать переобучения, часто ограничивают глубину дерева или минимальное число образцов в листе. Деревья нечувствительны к масштабам признаков. Требуют достаточного объёма данных, чтобы надёжно оценить разбиения.
Пример признаков: Правила могут выглядеть так: если время между кликами очень маленькое, или IP необычной страны, или клики идут по определённому шаблону. Дерево само находит пороговые значения.
Псевдокод (рекурсивное построение):
kotlin build_tree(dataset):
if все объекты одного класса или мало данных:
return Leaf(label = majority_class)
иначе:
найти лучший признак и порог по критерию (максимальное улучшение чистоты)
split data на left/right по этому порогу
node.left = build_tree(left_data)
node.right = build_tree(right_data)
return node
Сложность: Обучение обычного дерева порядка $O(M N \log N)$ в среднем случае (M – число признаков, N – число образцов). В худшем случае (несбалансированное дерево) – $O(M N^2)$. Предсказание одного примера – $O(\text{глубина дерева})$, обычно $\sim O(\log N)$.
Случайный лес
Принцип работы: Случайный лес (Random Forest) – ансамбль многих деревьев решений. Каждый дерево обучается на случайной подвыборке объектов и признаков (bagging). Для предсказания каждый классификатор голосует, и финальный ответ берётся по большинству. Такая схема снижает переобучение, присущее одному дереву.
Плюсы/минусы: «Лес» обычно даёт более высокую точность, чем одиночное дерево, и устойчив к шуму в данных. Он хорошо работает на разнородных признаках (числовые+категориальные). Минусы – низкая интерпретируемость (вместо правил у нас множество деревьев). К тому же обучение леса медленнее в масштабах из-за большого числа деревьев.
Требования к данным: Аналогичны деревьям: требует числовые признаки (категории кодируются). Благодаря случайному выбору подмножеств умеет работать и с высокоразмерными данными. Часто используют при большом количестве простых признаков.
Пример признаков: Один лес может содержать деревья, каждая проверяющая свой признак: число кликов от IP, тип устройства, географию, шаблоны поведения и т.д. Например, одно дерево изучает «кинули ли кликеры трафик-артефакты, параллельные покупкам», другое – «частота кликов по часу дня».
Простая формула: Нет простой формулы как у логистической регрессии, но можно сказать, что вероятностный прогноз равен среднему (или большинству) по деревьям: $$\hat y = \mathrm{mode}{\text{Tree}i(x)}{i=1..T}.$$
Сложность: Тренировка леса – порядка $O(T \times M \times N \log N)$ (T – число деревьев). Предсказание – $O(T \times \log N)$ на один пример.
Градиентный бустинг
Принцип работы: Градиентный бустинг (Gradient Boosting) тоже ансамбль деревьев, но собирает их последовательно: каждое новое дерево «исправляет» ошибки предыдущих. Формально строят сумму моделей $F(x) = \sum_t \alpha_t h_t(x)$, где $h_t$ – слабый ученик (обычно мелкое дерево), $\alpha_t$ – вес. На шаге $t$ модель обучается на градиенте ошибки предыдущей модели по логарифму правдоподобия. Таким образом каждая новая модель фокусируется на сложных примерах. Часто используют реализации XGBoost, LightGBM, CatBoost.
Плюсы/минусы: Обычно даёт очень высокую точность и хорошо обрабатывает большое число признаков. Часто побеждает в соревнованиях по детектированию кликфрода. Минусы: чувствителен к шуму и аномалиям (может переобучаться без регуляризации), дольше тренируется, настройка параметров сложнее (темп обучения, глубина деревьев, число итераций). Тем не менее многие исследования показывают превосходство бустинга. Например, GTB-модель показала лучшие результаты на выделенных наборах данных кликфрода.
Требования к данным: Как и в случае леса – числовые или заранее закодированные категориальные. Быстро растёт память при большом количестве деревьев и глубине. Обычно нужен большой объём данных, чтобы «набрать» статистику и избежать переобучения.
Пример признаков: Те же самые, что в лесе или дереве, но можно добавлять сложные взаимодействия: например, умножение признаков или любые комбинации. Большинство библиотек сами умеют обрабатывать большие наборы признаков.
Формула (упрощённо): Итерация бустинга строит модель так: $$F_{t}(x) = F_{t-1}(x) + \alpha_t h_t(x),$$ где $h_t(x)$ минимизирует градиент лосс-функции по $F_{t-1}(x)$. Формулы обновления специфичны для вида бустинга (AdaBoost, GBDT и т.п.).
Сложность: Тренировка примерно $O(T \times M \times N)$ (T – число деревьев) на каждой итерации, суммарно $O(T^2 M N)$, но реализация может чуть лучше (примерно $\sim O(T M N)$ при малой глубине). Предсказание сходно со случайным лесом, но может быть медленнее из-за большой глубины деревьев.
Метод опорных векторов (SVM)
Принцип работы: SVM ищет в пространстве признаков разделяющую гиперплоскость с максимальным зазором (margin) между классами. То есть находит вектор весов $w$ и $b$ такой, что все положительные примеры лежат с одной стороны, отрицательные – с другой, и при этом минимально удалённые примеры («опорные векторы») находятся как можно дальше друг от друга. SVM можно применять с разными ядрами (линейным, RBF/Гауссовым, полиномиальным и др.). На практике SVM хорошо выявляет сложные нелинейные границы за счёт ядра.
Плюсы/минусы: SVM эффективен при большом числе признаков (может быть меньше примеров, чем размерность). Он использует лишь опорные векторы, что экономит память. Сильная сторона – высокая точность при хорошо настроенном ядре. Минусы – плохо масштабируется на очень большие выборки: время обучения растёт как минимум квадратично от числа примеров. Для очень больших данных и SVM может «не потянуть» без приближений. Кроме того, SVM не сразу выдаёт вероятности (требуется дополнительная кросс-валидация для оценки вероятностей), и зачастую требует тщательного подбора параметров ядра и регуляризации. В задаче кликфрода SVM применяют реже – его можно взять как альтернативу для небольшой стопки признаков или для поиска нелинейных закономерностей (например, если в данных есть сложно разделимые шаблоны).
Требования к данным: Признаки желательно масштабировать (SVM чувствителен к масштабу признаков). Обычно применяют стандартную нормализацию. СVM подходит и к числовым, и к категориальным (после кодирования), но обучение при большом числе категорий может быть дорогим.
Пример: Пусть мы хотим отделить фродовые клики от легитимных на основе двух признаков. SVM найдёт прямую (или кривую для нелинейного ядра), которая отделяет кластеры наибольшим запасом. Его математическая формула решения – задача квадратичного программирования: $$ \min_{w,b} \frac{1}{2}|w|^2 + C \sum_i \xi_i, \quad \text{с учетом } y_i(w^Tx_i + b)\ge1 – \xi_i $$ Где $\xi_i$ – допуски для некорректно классифицированных примеров. После оптимизации предсказание – знак $w^Tx+b$.
Сложность: Как отмечено в документации, обучение SVM занимает от $O(n_\text{features} \times N^2)$ до $O(n_\text{features} \times N^3)$. LinearSVC (линейное ядро) обучается быстрее (приближенно линейно по N и M). Предсказание на новый пример – $O(N_\text{SV})$, где $N_\text{SV}$ – число опорных векторов (обычно $\ll N$).
Метод k-ближайших соседей (k-NN)
Принцип работы: k-NN – ленивый алгоритм: во время обучения он просто запоминает все метки и признаки. При предсказании для нового примера ищутся $k$ ближайших по расстоянию (обычно евклидово) примеров из обучающей выборки. Класс присваивается большинством голосов этих соседей. Проще говоря, если большинство из ближайших $k$ кликов были мошенническими, новый кейс тоже пометим как фрод.
Плюсы/минусы: Основное преимущество – простота: нет этапа «обучения» как такового, только хранение данных. k-NN хорошо выделяет аномалии, если аномальные случаи «отдалены» от основных кластеров. Минус – медленно работает при больших данных: предсказание для каждого примера требует сравнения с каждой точкой из набора (в худшем $O(N)$). При высоком числе признаков качество может сильно ухудшаться (проблема «проклятия размерности»). Также выбор метрики расстояния и $k$ критичен. В кликфроде k-NN используют редко в продакшене, но он может служить простым бейзлайном: если фродовые клики образуют «скопления» по определённым признакам, они детектируются.
Требования к данным: Нужны только числовые признаки и/или закодированные категориальные. Признаки желательно нормализовать (чтобы разная масштабность не искажала расстояния). Довольно чувствителен к нерелевантным признакам и выбросам. Объём данных желательно умеренный, иначе предсказание будет слишком медленным.
Пример: Пусть мы храним $N$ прошлых кликов с признаками (IP, время, устройство и т.д.). Применим k-NN (например, $k=5$). Новый клик сопоставляется с 5 ближайшими (например, по евклидовой метрике или дистанции Хэмминга для категорий) и классифицируется по большинству. Если 3 из 5 «соседей» были фродом, новый клик тоже помечаем как фрод.
Сложность: Время предсказания – $O(N \times M)$ для поиска ближайших (или $O(\log N)$ с KD-деревом при малом M). Обучение – $O(1)$ (просто хранение).
Наивный байес
Принцип работы: Наивный байес опирается на теорему Байеса с допущением, что признаки условно независимы друг от друга при заданном классе. Расчёт идёт так: оцениваем $P(\text{класс}|\text{признаки}) \propto P(\text{класс}) \prod_i P(x_i|\text{класс})$. Слов «наивный» – потому что мы предполагаем независимость признаков, что редко строго выполняется. Обучение состоит в оценке распределений $P(x_i|\text{класс})$ (например, нормального для чисел, или по частоте для категорий).
Плюсы/минусы: Очень прост в обучении и работе, требует малой выборки, поскольку считается, что каждый признак влияет независимо. Скорость обучения и предсказания очень высока. Наивный байес часто хорошо работает на больших разреженных данных (например, текст), но в задачах с коррелированными признаками его допущения могут снижать качество. Он известен тем, что выдаёт неплохую baseline-оценку. Минусы – мало устойчив к нарушениям независимости и редко превосходит более «умные» методы в точности.
Требования к данным: Признаки выбирают в зависимости от варианта NB (GaussianNB для чисел, MultinomialNB/ComplementNB для счётных, BernoulliNB для бинарных). Хорошо подходит, когда имеются частотные признаки (сколько кликов, временные интервалы). Работает даже на небольших наборах. Но если признаки сильно зависимы, точность падает.
Пример: Признаки: число кликов за последние 10 минут, число уникальных устройств, возраст сессии. Наивный байес обучается: вычисляет частоты или параметры Гаусса для каждого признака в каждом классе. Предсказание: при новых данных перемножает вероятности по признакам. Формула предсказания (MAP-оценка): $$ \hat y = \arg\max_{y\in{\text{fraud,ok}}} P(y)\prod_{i}P(x_i|y). $$
Интересный факт: Наивный байес требует мало данных для обучения и работает очень быстро. Но он ориентирован на классификацию (хорош как предсказатель метки), а вот его оценки вероятностей не слишком точны (то есть выдаваемая вероятность класса может быть смещена).
Сложность: Обучение – $O(N \times M)$ (для подсчёта частот/параметров по классам). Предсказание – тоже $O(M)$ на пример (умножение M вероятностей).
Предобработка данных и инженерия признаков
Успех любой ML-модели для кликфрода во многом зависит от грамотного приготовления данных. На вход моделям подаются признаки (фичи), описывающие поведение рекламного клика/пользователя. Часто исходные «сырые» данные бывают шумными или слишком деталями, поэтому их подготавливают так:
- Очистка данных: убирают явные артефакты (пропуски, дубли, нулевые значения). Например, если IP-где-то записан как «0.0.0.0» или неизвестный user agent, то либо выкидывают такие строки, либо помечают отсутствующие значения специальной меткой («unknown»).
- Нормализация и масштабирование: многие алгоритмы (SVM, k-NN, логистическая регрессия) лучше работают, если числовые признаки приведены к схожему масштабу. Обычно используют стандартное шкалирование (привести к нулевому среднему и единичной дисперсии) или минимакс-шкалу (от 0 до 1). Это важно, например, при объединении скорости кликов с числом кликов: без нормализации тот, что численно больше, доминирует.
- Кодирование категорий: Признаки «категориальные» (тип устройства, страна, источник трафика, канал, категория приложения) нужно перевести в числа. Простейший вариант -one-hot encoding (каждая категория – свой бинарный признак). Или label encoding (присвоить уникальные метки) -подходит для деревьев, но не для линейных моделей. Удобно и кодирование, основанное на частоте или таргетировании (mean-encoding) для линейных и бустинг-алгоритмов.
- Временные признаки: Важный источник информации – время клика. Из метки времени выделяют составные фичи: час дня, день недели, месяц, лаг (разница во времени от предыдущего клика). Например, пик активности мошенников может приходиться на нерабочее время или наоборот. Известно, что такие признаки помогают существенно повысить качество: исследования кликфрода часто вычисляли статистики по временному признаку (среднее, дисперсию, максимум, энтропию интервалов кликов), или разбивали время на день/час/период.
- Агрегаты по сессии/пользователю: Мошенники часто генерируют аномально много кликов с одного IP/устройства за короткий период. Поэтому для каждого события можно сконструировать агрегаты: число кликов с этого IP за последние X минут, число уникальных юзеров на сайте, количество сессий с этой подсети, среднее время между клик-ами пользователя, число приложений установлено после клика пользователем. Эти фичи даёт «окно скольжения» по времени или группировка по полям (IP, device, user_id). Например, типичная обработка: для каждой записи посчитать количество кликов с тем же IP в предыдущий час. Такие агрегаты часто оказываются решающими в детекции.
- Группировка признаков (feature crosses): Иногда имеет смысл объединять признаки: например, IP + медиа-кампания, географию + канал, чтобы уловить связи. Но такие операции увеличивают размерность, поэтому применяются выборочно.
- Детектирование аномалий (анализ выбросов): Можно предварительно запускать модели аномалий (Isolation Forest, LOF) на данных кликов и строить новый признак – «score аномалии». Это помогает поймать очень нетипичные клики.
- Балансировка классов: В кликфроде обычно положительные (мошеннические) примеры составляют лишь малую долю (например, <1%). Поэтому перед обучением надо учесть дисбаланс. Варианты: взвешивание классов (в параметрах моделей задать
class_weight='balanced'), повторная выборка (oversampling minority с копированием или SMOTE, undersampling большинства), или генеративные методы. Важно: при сильном дисбалансе чистая точность (accuracy) мало что показывает, нужно фокусироваться на метриках, чувствительных к классам (см. ниже).
Практические советы:
- Удаление или заполнение пропусков: если признак имеет мало пропусков, можно заполнить средним/медианой (для числовых). Если много – подумать, стоит ли признак вообще.
- Устранение мультиколлинеарности: для линейных моделей или SVM проверьте, не дублируют ли признаки друг друга. Коррелированные фичи можно убрать или объединить.
- Одновременный числовой и категориальный признак: например, номер IP часто разбивают на четыре числа (IPv4). Но может выделить регионы/города из IP.
- Автоматические преобразования: можно использовать
ColumnTransformerиPipelineиз scikit-learn для линейки кодирования и нормализации. Это упрощает передачу данных в модель. - Оценка важности признаков: после обучения модели можно посмотреть важности фич (у леса или бустинга
feature_importances_, у линейных – веса). Это подскажет, какие новые признаки добавить или какие убрать.
Правильная подготовка признаков часто сильнее самого алгоритма. Как писали в обзорах, например, статистические признаки времени клика, средние/дисперсные характеристики сессий и агрегации по IP дают значительный прирост качества.
Метрики оценки и методы валидации
В задачах кликфрода классический accuracy мало информативен, так как негативных (мошеннических кликов) обычно очень мало. Поэтому применяют более тонкие метрики и стратегии валидации:
- Precision (точность) – доля правильно предсказанных мошеннических кликов среди всех помеченных системой как фрод. Т.е. сколько из помеченных «кликфродом» действительно были фродом: $P = \frac{TP}{TP+FP}$.
- Recall (полнота) – доля правильно найденных мошеннических кликов среди всех реальных мошенников: $R = \frac{TP}{TP+FN}$. Он показывает, насколько полно мы ловим фрод.
- F1-score – гармоническое среднее precision и recall: $F1 = 2\frac{P\cdot R}{P+R}$. Эта метрика балансирует точность и полноту. В кликфроде F1 часто служит ключевой, поскольку важен компромисс между «найти больше мошенников» и «не помечать лишних».
- ROC-AUC (Area Under ROC) – площадь под кривой ROC. ROC-кривая строится по точкам (FPR, TPR) при разных порогах. AUC близкий к 1 говорит о хорошем разделении классов. Однако при сильном дисбалансе ROC-AUC может вводить в заблуждение.
- PR-AUC (площадь под кривой Precision-Recall) – более информативна при дисбалансе. Хороший PR-AUC означает, что есть порог, дающий и высокую точность, и высокую полноту.
Чтобы смотреть, как модель ошибается, строят матрицу ошибок (confusion matrix):
| Предсказано «Фрод» | Предсказано «Ок» | |
|---|---|---|
| Фрод | TP (ист. +) | FN (пропуск) |
| Ок | FP (лож.+) | TN (ист.-) |
Здесь $TP$ – правильно пойманные фродовые клики, $FP$ – нормальные клики, ошибочно помеченные как фрод, $FN$ – пропущенные мошеннические клики, $TN$ – правильно отметившие честные. По матрице считаем $P, R$.
Примеры интерпретации:
- Если стратегия нацелена на «любое обнаружение фрода» (бизнес хочет не упускать мошенников), выбирают модель с высоким recall; плата – больше ложных срабатываний (низкий precision).
- Если нужно убедиться, что каждый помеченный как фрод действительно мошенник (чтобы не обижать честных издателей), максимизируют precision.
- Обычно выбирают порог вероятности, при котором $P$ и $R$ приемлемы. Например, можно добиться $P,R>90%$ на тестовой выборке с помощью F1-оптимизации.
Кросс-валидация: Нельзя просто делать случайные фолды (особенно если клики имеют временную привязку). Рекомендуется:
- Time-based split (walk-forward): обучаем на ранних данных, проверяем на последующих (чтобы не обучаться на будущем). Так мы имитируем реальный запуск модели, когда появляются новые клики. Валидацию лучше строить сдвигом окна (каждый раз двигать границу дат) или расширением обучающей части.
- Стратифицированная K-Fold: при огромном количестве данных можно делать K-Fold, сохраняя баланс классов (например, stratified K-Fold в sklearn). Это даст устойчивую оценку точности. Но обязательно убедитесь, что тренируете на более старых данных, а тестируете на более новых по времени.
Пример: Для разреженного класса (1% фрода) случайная 5-fold CV может «слегка обмануть», если мошеннические события равномерно распределены. Лучше взять хронологию: Train (январь-март), Test (апрель), потом Train (ян-апр), Test (май) и т.д. Такой time-based CV покажет, выживет ли модель на новых условиях.
Порог и ROC/PR-кривые: Модель обычно даёт вероятность фрода. По ROC/PR-кривым выбираем оптимальный порог. К примеру, если нам важен F1, то ищем порог, дающий наибольшее $2PR/(P+R)$. Затем округляем результат в приложении (например, любую модель, выдающую >0.5, ставим как фрод).
привели формулы Precision/Recall и их объяснение. При оценке обязательно проверяйте обе метрики и их сочетание (ROC-AUC и PR-AUC) – это даёт наибольшую уверенность.
Ансамблирование и стекинг классических моделей
Чтобы повысить качество, часто используют ансамбли. Мы уже обсуждали два типа ансамблей деревьев: случайный лес и бустинг. Кроме них, есть и другие подходы для классических моделей:
- Bagging (Bootstrap Aggregation): обучение нескольких независимых моделей (обычно деревьев) на разных бутстрап-выборках. Упоминался Random Forest. Аналогично можно бэггировать логистику или SVM (bagging logistic). Повышает стабильность, уменьшает дисперсию.
- Boosting: описан выше (градиентный бустинг, AdaBoost). Улучшает слабые модели, итеративно «наказывая» ошибки.
- Voting/VotingClassifier: если у нас есть несколько разных классификаторов (скажем, логистическая регрессия, SVM, дерево), можно объединить их прогнозы голосованием: например, простым большинством или взвешенным. При наличии моделей с разной природой это помогает учесть разные аспекты данных. Часто ставят равные веса, либо пропорционально F1 на валидации.
- Stacking (Стекинг): более сложный ансамбль. Сначала базовые модели обучаются на исходных данных, затем создают новый датасет из их предсказаний (обычно вероятностей), и обучают «мета-модель» (обычно простую, например логистическую регрессию) на этом датасете. То есть выходы (прогнозы) моделей становятся признаками для финального классификатора. Такой подход объединяет сильные стороны разных алгоритмов. Например, можно слать в стекинг линейную модель, SVM и случайный лес; их выходы скормить простому дереву или регрессии. В scikit-learn есть
StackingClassifier.
Практический совет по стекингу: При построении стекинга нужно избегать утечки целевой переменной. Обычно базовые модели обучаются на одной части данных, а их предсказания на другой (например, через cross_val_predict с несколькими фолдами) формируют тренировочные признаки для мета-модели.
Пример: Обучаем RandomForest, XGBoost, SVM на тренировке. На валидации (через CV) берём их предсказанные вероятности и обучаем LogisticRegression на этих трёх числах. В результате получаем ансамбль, который учитывает то, что лес и бустинг предлагают, и дополняет простая модель.
Достоинства стекинга: Часто даёт прирост F1/AUC над отдельными моделями, особенно если базовые модели разнородны. Учёт комбинаций моделей помогает «накрыть» крайние случаи фрода. Минус – сложнее в реализации и интерпретации, больше риска переобучения (особенно если базовые модели обучались на тех же данных).
Развертывание и эксплуатация моделей
После того как модель обучена и протестирована, её нужно запустить в реальном сервисе (продакшене). Здесь важно обеспечить быстрое и надежное (стабильное) предсказание на новых данных и контроль качества в течение работы:
- Обновление моделей: Поведение кликфрода меняется со временем. Планируйте регулярное переобучение моделей – например, раз в неделю или месяц – с учётом новых кликов. Можно делать «латентное» (online) обучение: добавлять свежие данные, постепенно пересчитывать веса модели. В простом случае собирают новые данные в накопитель, периодически пересчитывают модель в оффлайне и выкатывают новую версию.
- Мониторинг дрейфа: Следите за изменением распределений признаков и предсказаний: если они сильно сдвигаются от тренировочных, модель может «выбиться из колеи». Нужно метрики, которые постоянно контролируют долю фродовых и нормальных предсказаний. Например, если вдруг процент меток «фрод» резко упал, это может значить, что модель устарела или мошенники изменили тактику. Для этого полезны статистики (mean, std) признаков и score drift detectors.
- Требования к задержке и ресурсам: Классические модели обычно достаточно быстры в предсказании. Линейные модели и NB занимаются быстро – миллисекунды. Деревья/ансамбли немного дольше, но всё ещё в пределах сотен миллисекунд на запрос при средних объёмах. Если приложение требует супербыстрой реакции (real-time bidding), то важно оптимизировать: предобучить модель один раз и хранить сериализованную версию (pickle или Joblib). В стеке все тяжелые вычисления уже сделаны. Если алгоритм слишком тяжелый (много деревьев, большой SVM), можно использовать быстрые LightGBM/LinearSVC или квантование моделей.
- API-шаблон: Обычно модели разворачивают через API. Пример на Python с Flask/FastAPI:
pythonКопироватьfrom sklearn.externals import joblib
from flask import Flask, request, jsonify
app = Flask(__name__)
model = joblib.load('clickfraud_model.pkl')
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json() # ожидаем JSON с признаками клика
X = [data['features']]
proba = model.predict_proba(X)[0,1]
label = int(proba > 0.5)
return jsonify({"is_fraud": label, "probability": float(proba)})
При развертывании важно учесть:
- Версионность: хранить версии модели и данных, чтобы в случае отката можно было вернуть рабочий вариант.
- Ресурсы: ансамблевые модели (большой лес или бустинг) могут требовать до нескольких сотен мегабайт памяти. Возможно, нужно обеспечить машину с достаточной RAM/CPU или преобразовать модель в оптимальный формат (ONNX, CoreML).
- Мониторинг производительности: вести логи запросов, замерять задержку. Например, с помощью Python APM можно отслеживать среднее время ответа и количество ошибок.
- Обновление данных и этикеток: Иногда лейблы «фрод/не фрод» от модераторов приходят с задержкой. Важно предусмотреть схему сбора и дообучения (например, помеченные после факта события данные можно добавлять в следующее обучение).
Схема работы в продакшене (пример):
Отправка данныхСобытие: кликПреобразование признаковREST API моделиМодель классификацииРезультат: «Фрод/ОК»Логирование решенияМониторинг и метрикиТревоги при дрейфе/потере качестваИнженеры обновляют модельПоказать код
Такой поток позволяет обрабатывать клик, быстро выдать решение (через API), и при этом отслеживать метрики и обновлять модель в случае необходимости.
Примеры реализации на Python (scikit-learn)
Ниже приведены простые примеры использования классических моделей из scikit-learn для задачи детекции кликфрода. Эти примеры демонстрируют концепцию обучения, предсказания и оценки качества.
python from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import precision_score, recall_score, f1_score
# Примерные данные: X - признаки, y - метки (1 = фрод, 0 = ок)
X, y = load_clickfraud_data() # функция-заглушка для чтения данных
# Разбиваем на train/test
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, stratify=y, random_state=42)
# Обучаем логистическую регрессию с балансировкой классов
clf = LogisticRegression(class_weight='balanced', solver='lbfgs', max_iter=1000)
clf.fit(X_train, y_train)
# Предсказываем на тесте
y_pred = clf.predict(X_test)
y_proba = clf.predict_proba(X_test)[:,1]
# Оценка
print("Logistic Regression:")
print(" Precision:", precision_score(y_test, y_pred))
print(" Recall: ", recall_score(y_test, y_pred))
print(" F1: ", f1_score(y_test, y_pred))
# Теперь случайный лес
rf = RandomForestClassifier(n_estimators=100, class_weight='balanced', random_state=42)
rf.fit(X_train, y_train)
y_pred_rf = rf.predict(X_test)
print("Random Forest:")
print(" Precision:", precision_score(y_test, y_pred_rf))
print(" Recall: ", recall_score(y_test, y_pred_rf))
print(" F1: ", f1_score(y_test, y_pred_rf))
В этом примере мы: загрузили данные, сделали stratified split (чтобы сохранить баланс), обучили две модели (линейную и лес), и вывели основные метрики. Подчеркнём, что в реальных задачах кликфрода данных может быть очень много, но принцип остаётся тем же. Также обычно делают предварительную обработку (StandardScaler, OneHotEncoder в Pipeline) и кросс-валидацию (скрыта здесь).
Еще пример кода: стратифицированная кросс-валидация и отчёт Confusion Matrix:
python from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import confusion_matrix
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
for train_idx, val_idx in skf.split(X, y):
X_tr, X_val = X[train_idx], X[val_idx]
y_tr, y_val = y[train_idx], y[val_idx]
rf = RandomForestClassifier(n_estimators=50, class_weight='balanced')
rf.fit(X_tr, y_tr)
y_pred_val = rf.predict(X_val)
tn, fp, fn, tp = confusion_matrix(y_val, y_pred_val).ravel()
print(f"TP={tp}, FP={fp}, FN={fn}, TN={tn}")
Этот пример показывает, как оценить распределение ошибок в каждом фолде.
Не забудьте, что в продакшн-окружении код должен быть задокументирован и обёрнут в сервис/API.
Сравнение алгоритмов и признаков
Ниже приведены сравнительные таблицы: первая – ключевых свойств алгоритмов, вторая – что они умеют с признаками.
| Алгоритм | Точность** | Скорость обучения | Скорость предсказания | Устойчивость к шуму | Нужно данных | Интерпретируемость |
|---|---|---|---|---|---|---|
| Логистическая регрессия | средняя | быстрая | быстрая | средняя (при линейности) | небольшая | высокая (веса) |
| Дерево решений | средняя | быстрая (обычно) | очень быстрая (логарифмическая) | низкая (может переобучаться) | умеренная | высокая (правила) |
| Случайный лес | высокая | медленная (T деревьев) | умеренная (T деревьев) | высокая (стабильный) | умеренная | низкая (чёрный ящик) |
| Градиентный бустинг | очень высокая | медленная (T деревьев) | умеренная (T деревьев) | средняя (чувствителен к шуму) | много | низкая |
| SVM (ядро RBF) | высокая | медленная (кубическая в N) | медленная (N_sv) | высокая (при выборе ядра) | умеренная | низкая (неявное) |
| k-NN | низкая/средняя | нет обучения (O(1)) | очень медленная (O(N)) | очень низкая (сильно шумоустойчив) | нет (хранит всё) | низкая |
| Наивный Байес | низкая/средняя | очень быстрая | очень быстрая | низкая (допущения о независимости) | маленькая | средняя (понятна) |
Пояснение столбцов:
- Точность: обобщённая ожидаемая эффективность (в задачах кликфрода лес/бустинг обычно лидируют).
- Устойчивость к шуму: способность игнорировать нерелевантные или искажённые данные (лес помягче к шуму, k-NN крайне чувствителен, т.к. ему любые выбросы будут «соседом»).
- Нужно данных: примерный минимальный объём: «много» означает, что на маленьких выборках метод плохо учится, «маленькая» – может на тысячах работать.
Вторая таблица: как алгоритмы работают с разными типами признаков:
| Тип признаков | Логистическая регрессия | Дерево/Лес | Градиентный бустинг | SVM | k-NN | Наивный Байес |
|---|---|---|---|---|---|---|
| Непрерывные (числовые) | ✓ (с нормализацией) | ✓ | ✓ | ✓ (нужна норма) | ✓ (нужна норма) | ✓ (Gaussian) |
| Категориальные (строки) | после кодирования | можно прямо (сколько угодно) | после кодирования (обычно one-hot) | после кодирования (один) | после кодирования (код/one-hot) | ✓ (Multinomial или Bernoulli) |
| Разреженные (sparse) | ✓ (работает с разреженным) | частично (scikit нет) | ✓ (LightGBM поддерживает) | требуются dense | ✓ (можно с KD-tree) | ✓ (Multinomial) |
| Большой размер (миллионы примеров) | если LinearSVM/SGD-реализация | потребует O(N log N) | долго, но LightGBM быстрый | LinearSVC почти линейно | очень медленно | быстро (O(N M)) |
| Интерпретируемые (непрозрачные) | высоко прозрачный (веса) | легко (дерево) | нет | нет | нет | средний (очевидно формулы) |
Пояснения:
- ЛогРег так же работает с текстами, если мы кодируем их tf-idf.
- «Одн.горячее кодирование» (one-hot) создаёт много признаков, некоторые методы (SVM) «потянет» плохо, а деревья нет проблем.
- k-NN и SVM плохо с разреженными данными, обычные реализации предпочитают плотные матрицы.
- Наивный байес имеет разные варианты:
GaussianNBдля числовых,MultinomialNBдля словарных (тексты),BernoulliNBдля булевых.
Эти таблицы показывают, что нет «универсального чемпиона». Для защиты от кликфрода часто комбинируют несколько алгоритмов (см. стекинг/ансамбли), чтобы компенсировать слабые стороны каждого.
Глубокое обучение и нейросети
Глубокие нейросети помогают обнаруживать кликфрод благодаря умению анализировать сложные паттерны поведения пользователей во временных рядах кликов. Различные архитектуры (RNN, LSTM, GRU, CNN, трансформеры, графовые сети, автоэнкодеры и гибриды) могут сочетаться для обработки сессий и признаков. Входные данные представляются в виде последовательностей кликов, поведенческих фич и категориальных признаков (дата/время, устройства, гео, embedding категорий и др.). Обучение проводится поднадзорно или слабо поднадзорно, применяют контрастивное или аномальный подход. Архитектуры улучшают через механизмы attention, residual, dropout, batchnorm и др. Нестабильность данных (concept drift) требует периодической дообучения моделей. Эффективность оценивается по precision, recall, F1, ROC-AUC и другим KPI. Ниже подробно рассмотрены все эти аспекты с примерами архитектур и рекомендациями.
Кратко о главном:
- Архитектуры: RNN/LSTM/GRU хорошо анализируют последовательности кликов, CNN выявляет локальные паттерны, трансформеры эффективно моделируют длинные цепочки с помощью внимания, графовые сети анализируют связи между сущностями, автоэнкодеры работают для выявления аномалий.
- Признаки: Используются фичи сессий (количество страниц, время на сайте и т.д.), временные метки, поведенческие метрики (интервалы между кликами), категориальные (User-Agent, гео, устройство), сетевые и графовые данные. Их кодируют с помощью one-hot или embedding и нормализуют числовые данные.
- Обучение: Преобладает supervised (метки «фрод/не фрод»), но важны semi- и self-supervised подходы при малом объёме разметки. Contrastive learning позволяет учить хорошее представление без меток. Аномальные методы и автоэнкодеры нацелены на обнаружение отклонений.
- Регуляризация и приёмы: Attention-слои, multi-head, остаточные связи (residual), dropout, batchnorm/layernorm, ранняя остановка помогают улучшать обучение сетей.
- Классовый дисбаланс: Применяют oversampling минорного класса, focal loss, взвешивание классов, синтетику данных и скоринг аномалий.
- Внедрение: Модели могут обучаться офлайн и/или онлайн; важны низкая задержка на inference и масштабируемый сервис. На практике проводят A/B-тесты, следят за drift (концептуальным дрейфом) и периодически дообучают модели.
- Метрики: Основные – precision (низкий процент ложных срабатываний), recall (низкий процент пропущенных фрод-кликов), F1, ROC-AUC, PR-AUC, FPR, а также бизнес-метрики (стоимость фрода, скорость обнаружения).
- Интерпретируемость: Для доверия к решению используются SHAP/LIME или визуализация attention. Это помогает понять, какие фичи влияют на решение.
Таблицы ниже дают сравнение архитектур, методов обучения и признаков. Наконец, приводятся простые псевдокоды и диаграммы архитектур, а также практические советы по внедрению.
Архитектуры глубоких нейронных сетей
Разные типы нейросетей подходят для анализа данных о кликах:
- Рекуррентные сети (RNN, LSTM, GRU): Имеют скрытое состояние, которое запоминает предыдущие события. Они хорошо улавливают временную последовательность кликов, выявляя зависимости по времени. Например, LSTM/GRU могут хранить информацию о событиях из далеко прошлого, что помогает заметить необычные цепочки действий бота. Но простые RNN иногда теряют долгосрочные зависимости (проблема затухающего градиента).
- Свёрточные сети (CNN) для последовательностей: 1D-CNN можно применять к ряду кликов или к односрезным фичам. CNN выявляют локальные шаблоны: например, быстро повторяющиеся клики за короткий промежуток. Они хорошо вычисляются параллельно, но не хранят информацию о порядке на большой дистанции так же как RNN. Зачастую CNN используют вместе с RNN или трансформерами (гибридная модель).
- Трансформеры (Transformer): Базируются на механизме attention, который сразу смотрит на всю последовательность. Многоголовый self-attention позволяет моделировать длинные зависимости без рекурсии. Такие модели успешно применяются в анализе последовательностей кликов: они масштабируются на большие данные и эффективны при обучении. Однако трансформеру требуются значительные вычисления и много данных для обучения.
- Графовые нейросети (GNN): Построены на графах, где узлы – это пользователи, сайты, рекламные объявления, IP-адреса и т.д. Ребра отражают взаимодействия (показы, клики). GNN учитывают отношения между объектами: например, можно соединить пользователя и сайт через клик. Один подход создаёт динамический граф «Пользователь-Реклама-Канал» и обучает GNN с пространственно-временным вниманием. Это помогает выявлять комплексные взаимосвязи, которые упускают обычные модели. С помощью GNN удаётся заметить, если группа аккаунтов одновременно кликала по тем же объявлениям (показательно для фрода). Недостаток: сбор и поддержка графа сложнее.
- Автоэнкодеры и аномальные модели: Автоэнкодер обучается восстанавливать нормальные образцы (сессии пользователей). Если на вход подаются отклоняющиеся (фродовые) сессии, то восстановление получается плохим (большая ошибка). Аномальные методы без меток выявляют события с аномальными признаками. Такие подходы полезны, когда нет точной разметки: они выделяют подозрительные клики как выбросы.
Ниже представлена сравнительная таблица архитектур:
| Модель | Плюсы | Минусы | Случаи использования |
|---|---|---|---|
| RNN (LSTM/GRU) | Улавливает временные паттерны; подходит для серий кликов | Сложнее обучать на длинных последовательностях; требует много данных | Последовательные данные кликов и событий |
| CNN (1D для кликов) | Выявляет локальные шаблоны; быстрая параллельная обработка | Не хранит долгосрочный порядок без усложнения | Выявление кратких burst-паттернов кликов |
| Трансформеры | Мощный механизм внимания; хорошо масштабируются при большом датасете | Высокая вычислительная сложность; много параметров | Длинные последовательности кликов; адаптивные модели |
| Графовые сети (GNN) | Учитывает связи между пользователями/объявлениями | Сложная подготовка данных (графа); настройка моделей | Обнаружение синдицированного фрода, сетевой анализ |
| Автоэнкодеры | Без меток находят аномалии; проста концепция | Может пропускать незаметные фроды, если аномалии «похожи» на норму | Аномалия-детекция в поведении пользователя |
| Гибридные модели | Комбинируют сильные стороны разных подходов | Сложность настройки, больше параметров | Сложные задачи фрод-анализа с разными данными |
Входные признаки и представление данных
Для обучения нейросетей важно правильно подготовить признаки:
- Временные признаки и сессии: Поступающие данные представляют собой временной ряд кликов в рамках одной сессии. Каждый клик имеет метку времени (таймстемп), возможно URL объявления и идентификатор сессии. Эти данные можно подавать как последовательность (для RNN/трансформеров) или как матрицу (для CNN). Часто из таймстемпов вычисляют дополнительные признаки – например, интервал между кликами, время суток или день недели. Циклические признаки (час, день) можно кодировать синусом/косинусом для учёта периодичности.
- Поведенческие фичи: Сформировать агрегированные метрики сессии – например, общее время просмотра страниц, количество просмотренных страниц, количество действий (клики, скроллы). В [20] перечислены типичные признаки: User-Agent, число страниц, длительность сессии, завершение сессии, действия пользователя. Эти фичи часто нормализуют (например, дробят на среднее/стандартное отклонение) или бинаризуют.
- Категориальные признаки: Признаки типа «браузер», «тип устройства», «страна/гео», «канал трафика» и т.д. Их принято кодировать либо one-hot (при небольшом количестве категорий), либо embedding-векторами (при больших категориях или в нейросетях). Эмбеддинги позволяют моделям автоматически учить схожие представления для похожих категорий. Например, клик по объявлению можно представить вектором признаков (эмбеддинг-рекламы) и присоединить к входу сети.
- Признаки сети и графа: Можно строить граф взаимодействий: пользователи, объявления и другие объекты – это узлы графа, а клик задаёт ребро. Отсюда берут graph-фичи: центральность узлов, число общих соседей (матрица смежности) и др. Такие фичи помогают GNN ловить структуры мошенничества.
- Другие: Часто выделяют такие фичи, как IP-адрес, координаты, мобильная платформа. Их тоже кодируют в категориальные признаки или дополняют бинарными флагами (например, подозрительный IP или VPN).
Таблица признаков и предобработки:
| Тип признака | Примеры | Подготовка и нормализация |
|---|---|---|
| Временные / последовательность | Время клика, интервалы между кликами, длительность сессии | Вычисление относительных интервалов; параметризация времени (час/день) |
| Поведенческие (агрегаты) | Количество страниц, количество действий (кликов, свайпов) | Стандартное масштабирование (zero mean, unit var) или min-max; логарифмирование крупных значений |
| Категориальные (девайсы, ОС, гео) | User-Agent, операционная система, страна пользователя | One-hot кодирование или embedding-слои; учитывают многомерность категорий |
| Идентификаторы (рекламы, сайты) | ID объявлений, ID кампаний | Embedding категорий перед обучением нейросетей; хеширование при огромном числе уникальных значений |
| Графовые признаки | Степень узла, центральность в графе «пользователь-реклама» | Нормализация по максимальному значению; добавление фиктивных значений для новых узлов |
| Байесовские/статистические признаки | Скользящие средние, оценки доверия | Вычисляются отдельно; используются при обучении моделей как входные |
Методы обучения и разметки
Обучение моделей
- Supervised (полное обучение): Классический подход – обучать модель на размеченных данных (клик «фрод» или «человек»). Например, для обучения RNN подаём последовательность кликов и метку фрод/нет. Понадобится довольно много размеченных примеров (что может быть проблемой, т.к. реальных фрод-кликов мало).
- Semi-supervised (полуподнадзорное): Часть данных размечена, часть нет. Используют алгоритмы, которые могут учиться на нескольких метках и находить похожие примеры. Иногда строят кластеризацию с доразметкой, или сначала аутоэнкодер обучается на неразмеченных данных, потом дообучают классификатор.
- Unsupervised (анализ без меток): Например, кластеризация сессий по схожести или аномальный детектор на основе автоэнкодера. Подозрительными считаются те экземпляры, которые сильно отличаются от обычных. Такие методы не требуют меток, но не всегда точны без апостериорной проверки.
- Self-supervised (самообучение): Модель учится на предсказании части данных по другой. Например, предсказывать следующий клик по предыдущим (Next-click prediction). Это помогает моделям заучивать общие паттерны поведения, после чего они способны детектировать аномалии. Один пример: предобучение на больших неразмеченных потоках кликов с помощью языковых моделей (подобно трансформерам), а затем дообучение на задаче фрода.
- Contrastive learning (контрастивное обучение): Обучение отличать «похожие» и «непохожие» образцы. Например, пары последовательностей кликов от одного пользователя vs от разных. Модель учится так, чтобы представления (эмбеддинги) «человека» были близки, а бот/человек – далеко. Такой метод помогает выделять нюансы поведения и может быть использован как этап генерации эмбеддингов.
- Anomaly detection (аномальный подход): Отдельный класс методов, где обучаются только на нормальных примерах (человеческих сессиях), а аномалии (фрод) выявляют по большой ошибке реконструкции или по редким срабатываниям отдельных узлов сети. Часто комбинируется с автоэнкодерами или одним из контрастивных методов.
Таблица сравнения методов обучения:
| Метод | Разметка | Описание и применение |
|---|---|---|
| Supervised | Полностью размеченные данные | Наиболее распространён: точность зависит от качества меток. Хорош, если есть исторический датасет фрод/не-фрод. |
| Semi-supervised | Часть примеров размечена | Используется при малом количестве меток: обучает модель на метках и на неразмеченных данных одновременно. |
| Unsupervised | Нет меток | Кластеризация или аномальные детекторы находят необычные сессии. Могут давать много ложно-положительных. |
| Self-supervised | Нет прямых меток, есть предсказание | Предобучение на общей задаче (прогноз следующего клика и т.п.), потом тонкая настройка. Улучшает обучение при ограниченной разметке. |
| Contrastive learning | Пары похожих/разных | Модели учатся формировать эмбеддинги так, чтобы похожие сессии сходились, а разным – различались. Помогает при косвенной разметке. |
| Anomaly detection | Метки не нужны (или «только норм») | Автоэнкодер или статистический метод настраивается на человеческом трафике; аномалии выделяются по большой невязке. |
Архитектурные приёмы и регуляризация
Современные нейросети используют ряд приёмов для повышения качества:
- Attention (внимание): Механизм, позволяющий модели концентрироваться на важных элементах входа. Например, transformer-модель с self-attention перебирает все позиции кликов и оценивает их важность для задачи. Добавление attention к RNN (или GNN) позволяет сети «смотреть» на ключевые клики в последовательности или на ключевые узлы графа.
- Multi-head attention: Усовершенствование обычного attention: внимание считается параллельно в нескольких подпространствах. Это повышает выразительность модели (как в классическом Transformer).
- Остаточные связи (Residual): Слои добавляются друг к другу через пропуск («shortcut»). Это помогает строить глубокие сети (десятки слоёв) без проблемы «затухающих градиентов». В трансформерах и ResNet-архитектурах распространено.
- Dropout: Случайное обнуление части нейронов во время обучения для предотвращения переобучения. Практически всегда используют для Dense-слоёв и иногда для RNN/LSTM.
- BatchNorm / LayerNorm: Нормализация слоёв ускоряет и стабилизирует обучение. BatchNorm хорошо работает в сверточных и полностью-связных сетях; LayerNorm часто используется в RNN и трансформерах (независимо от размера батча).
- Early stopping (ранняя остановка): Метод приостановки обучения, когда метрика на проверочном наборе перестает улучшаться. Помогает не переобучиться и экономит ресурсы.
Например, современные трансформер-модели для фрода имеют по несколько слоев multi-head attention с residual и layernorm между ними. RNN-модели часто дополняют dropout и attention-слоем, чтобы избежать переобучения и выделить значимые паттерны.
Справление с дисбалансом классов
В задачах кликфрода «плохих» событий значительно меньше, чем «хороших». Существуют приёмы борьбы с этим дисбалансом:
- Oversampling: искусственно увеличить число образцов «фрод»-кликов (допустим, дублировать их или генерировать вариации), чтобы сбалансировать классы. Недостаток: легко переобучиться на копиях.
- Focal loss: модификация функции потерь, которая задаёт больший вес редким классам. Например, penalizes well-classified examples and фокусируется на сложных (обычно это фрод-примеры). Популярно в детектировании редких событий.
- Взвешивание классов (class weights): при обучении задают больший вес ошибки на «фрод»-примерах. Это проще, чем перекомпоновка данных, и поддерживается большинством фреймворков.
- Синтетические образцы: генерируют синтетические фродовые сессии (например, с помощью GAN или простого объединения частей), чтобы увеличить выборку «плохих» примеров. Если выполнено грамотно, сеть лучше учится отличать фрод.
- Аномальный скоринг: вместо явной классификации, модель выдает «оценку аномальности» (anomaly score) для каждого клика или сессии. Затем по порогу оценивает фрод. Это работает особенно в случае аномального обучения (где explicit class imbalance не фигурирует – просто высокие баллы аномалии означают фрод).
В целом часто сочетают подходы: например, oversampling + focal loss + мониторинг false positives, чтобы модель не «лжекликивала» слишком много.
Онлайн и офлайн обучение, inference и обслуживание моделей
- Offline vs Online: Обычно модель обучается «офлайн» (на исторических данных) – это длительный этап. Для адаптации к изменяющемуся фроду может применяться «онлайн-обучение» или регулярный re-training. Например, ежедневно или еженедельно обновлять модель на новых данных (отслеживая concept drift). В онлайн варианте модель может постепенно подстраиваться по мере поступления новых примеров (требует аккуратного контроля роста ошибок).
- Задержка вывода (latency): В реальном времени (real-time) важно, чтобы модель быстро выдавала решение. Латентность обработки (инференс) должна быть минимальна, особенно если от результата зависит показ следующего объявления. Легковесные архитектуры (или применённые prunning/quantization) помогают ускорить отклик.
- Model serving: Модель разворачивается как сервис (часто через REST/gRPC), интегрируется в pipeline системы. Сервис может отправлять в него обновлённые данные по сессиям, получать индикаторы фрода и, при необходимости, передавать список подозрительных кликов обратно в рекламную систему. Чаще всего используют облачные платформы MLOps или специальные фреймворки (TensorFlow Serving, TorchServe, Kubernetes).
- A/B-тестирование: Перед тем как полностью переключиться на новую модель, её проверяют в тестовой группе кампаний. Сравнивают метрики (например, экономию бюджета, число обнаруженных фрод-кликов) между старой и новой версиями. Это важно для безопасности: вдруг улучшение метрик (например, precision) привело к падению recall или к нежелательному отсеиванию трафика.
- Дрейф концепции (concept drift): Во фроде атаки постоянно меняются – боты становятся умнее, люди меняют поведение. Как показано в соревновании FDMA 2012, метки фрода в разные периоды могут меняться. Чтобы бороться с этим, модель нужно регулярно переобучать на новых данных. В системе можно настроить автоматическую подкачку последних сессий и ретренинг модели. Также полезно хранить исторические метрики и в случае роста количества пропущенных фрод-кликов – запускать срочное обновление.
- Сохранение и мониторинг: В продакшене отслеживают стабильность модели: метрики drift detection (изменение распределения входов или выходов), стабильность prediction scores. При сдвиге выше порога – требуется пересобрать модель.
Метрики оценки и бизнес-KPI
Для оценки качества детектора кликфрода используют следующие метрики:
- Precision (точность): доля правильно выявленных фрод-кликов среди всех помеченных как фрод. Высокая precision означает мало ложных срабатываний (false positives).
- Recall (полнота): доля реально фродовых кликов, которые модель нашла. Высокая recall – мало пропущенных фрод-событий. Обычно есть компромисс: увеличение recall может снизить precision, и наоборот.
- F1-score: гармоническое среднее precision и recall. Сводит две метрики в одну, позволяет сравнивать модели с учётом баланса между ними.
- ROC-AUC: площадь под ROC-кривой. Хороша, когда в приоритете ранжирование подозрительных сессий по «скор» риска.
- PR-AUC: площадь под кривой precision-recall. Важно на сильно несбалансированных задачах (как кликфрод).
- False Positive Rate (FPR): доля хороших кликов, ошибочно отмеченных как фрод. Низкий FPR важен, чтобы не блокировать нормальных пользователей.
- Временные метрики: Time-to-detect – время от начала фрод-кампании до её обнаружения. Чем ниже, тем лучше защита.
- Бизнес-метрики: Экономия бюджета (сколько денег сэкономлено), ROI от Anti-Fraud-системы. Часто вычисляют Expected Cost Savings: сколько потерь отфильтровано минус стоимость сервиса. Иногда считают штрафной cost-based metric, где разные типы ошибок («пропустил фрод» vs «ошибочно заблокировал») имеют разную цену.
Часто в отчётах упоминают, что моделям доверяют, если они показывают очень высокие precision+recall (→ высокий F1) при низком FPR. Например, в одной работе сообщается F1 ~92%, что лучше традиционных методов.
Примеры моделей: псевдокод и диаграммы
Ниже представлены упрощённые примеры архитектур с псевдокодом и схемами.
Пример 1: RNN (LSTM) для последовательности кликов. Имеем входную последовательность кликов X = [x_1, x_2, ..., x_T], где каждый x_t – вектор признаков одного клика (таймстемп, категорийные embedding и т.д.). Модель: двунаправленный LSTM + классификатор.
pythonКопировать# Псевдокод
h_fw, h_bw = zeros(), zeros() # инициализация скрытых состояний
for t in range(1, T+1):
h_fw = LSTM_cell_fw(x[t], h_fw)
h_bw = LSTM_cell_bw(x[T-t+1], h_bw)
# Конкатенируем состояния последнего шага вперёд и назад
h = concat(h_fw, h_bw)
# Полносвязный слой + сигмоида для предсказания фрода
pred = sigmoid(W @ h + b)
mermaidКопироватьflowchart LR
I[Input sequence X] --> L1[LSTM cell (forward)]
L1 --> L2[LSTM cell (forward)]
L2 --> FC[Dense + Sigmoid]
I --> R1[LSTM cell (backward)]
R1 --> R2[LSTM cell (backward)]
R2 --> Merge[concat]
Merge --> FC
FC --> Out[Output: доля фрода]Пример 2: Трансформер для обработки сессии кликов. Сначала вход токенизируется и превращается в эмбеддинги. Затем проходят несколько блоков Multi-Head Attention + FeedForward с residual и нормализацией.
pythonКопировать# Псевдокод-структура (упрощённый)
embedded = embed(tokens(X)) # Встроить токены кликов
for layer in Transformer_layers:
attended = MultiHeadAttention(embedded)
norm1 = LayerNorm(attended + embedded)
ff = FeedForward(norm1)
embedded = LayerNorm(ff + norm1)
pred = Classifier(embedded.mean(axis=0))
Токенизация / эмбеддингMulti-Head AttentionResidual + LayerNormFeed-ForwardResidual + LayerNormСреднее/классификаторOutput: вероятность фродаПоказать код
Пример 3: Графовая сеть для «пользователь-реклама». Строим граф, где узлы – пользователь U и объявление A, ребро между ними – клик. У каждого узла есть фичи (например, embedding пользователя, embedding объявления). Слой GNN обновляет представления.
pythonКопировать# Псевдокод (один шаг свёртки графа)
for edge in edges:
send_msg = message_function(node_features[U], node_features[A])
receive at both U and A
for node in nodes:
agg = aggregate_incoming_messages(node)
node_features_new[node] = update_function(node_features[node], agg)
pred = readout(node_features_new) # например, классификатор по узлу или ребру
GNN layermsgmsgПользователь UОбъявление AОбновление UОбновление AКлассификаторПредсказание фродаПоказать код
Пример 4: Автоэнкодер для обнаружения аномалий. Вход – вектор признаков сессии (без разделения на последовательность). Модель пытается восстановить этот вектор.
pythonКопировать# Псевдокод
z = Encoder(x) # размерности уменьшаются, создаём латентное представление
x_recon = Decoder(z) # восстанавливаем в исходные фичи
loss = MSE(x_recon, x) # обучаем минимизировать ошибку восстановления
if loss > threshold:
mark_as_fraud()
mermaidКопироватьflowchart LR
X[Фичи сессии] --> Enc[Encoder (Dense слои)]
Enc --> Latent[Латентный вектор]
Latent --> Dec[Decoder (Dense слои)]
Dec --> Xrec[Восстановленные фичи]
Xrec --> Compare[Сравнение с оригиналом]
Compare --> Score[Ошибка восстановления]
Score --> Pred[Аномалия: фрод / нормал]Практические рекомендации по внедрению
- Сбор данных: Соберите максимально полную историю сессий и кликов. Важно иметь информацию о реальных фрод-кликах (например, из предыдущих кампаний, логов рекламных систем). Пометьте фродовые паттерны (например, клики с одинаковым IP через равные интервалы).
- Интеграция с Clickfraud: Сервис Clickfraud уже занимается сбором лога кликов и идентификацией подозрительных сессий. Модель можно встраивать так: Clickfraud передаёт в модель батч новых сессий, получает оценку риска и при необходимости автоматически отправляет сигналы обратно в рекламные системы (Google Ads, Яндекс.Директ и др.).
- Итеративное обучение: В начале можно использовать простые модели (например, RNN с несколькими слоями). После получения результатов разметьте новые данные: «модуль интерпретируемости» (SHAP/LIME) показывает, почему модель считает сессию фродовой. Проверьте вручную – если метка подтверждается, добавьте эти примеры в обучающую выборку для следующего цикла. Таким образом модель «учится на ошибках».
- Мониторинг показателей: Настройте дашборд с основными метриками (precision/recall, cost savings, инциденты false positive). Если precision падает (модель ложно блокирует больше), или если системы жалуются на ухудшение ROI, нужно срочно пересмотреть модель или пороги.
- Обновление модели: Регулярно (например, раз в неделю/месяц) переобучайте модель на новых данных. Это позволит адаптироваться к новым паттернам фрода (drift detection). При этом старые данные (например, месяцев за 6) можно убирать, если они слишком отличаются от текущих.
- Прокомментируйте результат: Всегда связывайте вывод модели с человеком. Сервисы Clickfraud обычно предоставляют логи: когда модель пометила сессию как фрод, в отчёте должны быть пояснения, какие признаки стали решающими. Интерпретируемость через SHAP/LIME или визуализацию attention помогает понять логику и доверять модели.
Ограничения и интерпретируемость
- Ограничения: Нейросети сильны, но не всесильны. Они нуждаются в больших данных и могут «переобучаться» на случайные паттерны. Если фрод используют совершенно новую схему (например, бот с поведенческой имитацией человека), модель его изначально не поймает. Именно поэтому нужно гибридное решение: нейросеть + правила (при необходимости вручную добавляем правила на типовые атаки).
- Риски: Чаще всего – ложные срабатывания (ошибочная блокировка «хороших» кликов). Это может испортить пользовательский опыт или отменить конверсию. Поэтому при настройке важно балансировать recall и precision. Второй риск – скрытый дрейф: мошенники находят способ обойти фильтр. Решение – постоянный мониторинг и обновление моделей.
- Интерпретируемость: Модели типа RNN/Transformers сложно объяснить напрямую. Для доверия их решениям используют:
- SHAP/LIME: оценивают вклад каждого признака в решение модели (для Dense-слоёв или на выходе).
- Attention-визуализация: в трансформерах/GNN можно посмотреть, на какие части входа обратили внимание. Например, если внимание сфокусировалось на всплеске кликов в сессии, это объяснимо.
- Извлечение правил: иногда после обучения нейросети можно найти простые правила, которые модель имплицитно использует (например, аномальные интервалы между кликами). Это нужно не для работы системы, а для понимания и отчётности.
Сравнение подходов
| Подход | Преимущества | Недостатки |
|---|---|---|
| Правила (статические) | * Простота настройки<br>* Объяснимость решений | * Низкая адаптивность<br>* Много ложных блокировок |
| Классические ML | * Высокая точность при правильных признаках<br>* Легко проверять (деревья решений) | * Зависимость от ручной подготовки фич<br>* Нужно переобучать при новых схемах |
| Глубокие нейросети | * Автоматическая работа со сложными данными<br>* Хорошо обрабатывают временные паттерны | * Требуют много данных и ресурсов<br>* Сложнее в отладке и объяснении результатов |
Таблица демонстрирует: нейросети выигрывают по гибкости и адаптивности, однако их внедрение сложнее. Впрочем, современные облачные решения позволяют запускать их быстро, а гиперпараметры настраивать автоматически, например с помощью алгоритмов оптимизации.
Практические рекомендации и архитектура системы защиты
Чтобы построить эффективную систему защиты от скликивания, рекомендуются следующие шаги:
- Сбор и хранение данных: подключите на сайт или лэндинг код-«уточку», который будет фиксировать информацию о каждом клике: IP-адрес, User-Agent, регион, URL источника, timestamp, длительность сессии и т.д. Чем больше данных и признаков, тем лучше модель сможет учиться.
- Обработка и выделение признаков: агрегируйте и нормализуйте данные. Выделите такие фичи, как число кликов с одного IP за время, среднее время между кликами, глубина просмотров, повторные конверсии без покупки и т.п. Например, исследователи извлекли множество временных и поведенческих фичей, что позволило ML/нейросетям находить тонкие отличия кликов.
- Выбор модели и обучение: разделите данные на «мошеннические» и «честные» клики. Обучите сначала простой ML-классификатор (база) и затем нейросеть. Популярные архитектуры – LSTM/RNN для последовательностей, иногда CNN или Transformer для дополнительных признаков. Автоматический подбор гиперпараметров через meta-алгоритмы (PSO, GA, COA) помогает добиться высокой точности.
- Онлайн-детекция (реалтайм): разверните модель на сервере с низкой задержкой (например, как микросервис). При каждом новом клике модель должна выдать решение за доли секунды (<0.3 сек). По результату решение: либо показать объявление пользователю, либо «отсечь» его (не списывать бюджет).
- Интеграция с рекламными кабинетами: настройте автоматический обмен данными с системами рекламы (Яндекс.Директ, Google Ads и др.). Современные сервисы отправляют списки подозрительных сессий обратно в рекламные кабинеты, чтобы не платить за эти клики.
- Мониторинг и отчёты: выведите в интерфейс показатели: общее число заблокированных кликов, сэкономленные деньги, доля подозрительных сеансов и т.п. По данным Сlickfraud, уже через 24-48 часов после запуска видно первые результаты по экономии бюджета. Устанавливайте уведомления (email, Telegram) при резких аномалиях.
- Постоянное обучение: собирайте новые данные о подозрительных кликах и периодически дообучайте модель. Обычно первые 1-3 дня система учится на вашем трафике и «накручивает» свои веса. После этого она адаптирована именно под ваш трафик и реагирует на новые виды атак.
Пример архитектуры системы (clickfraud): Сервис может состоять из трёх основных частей:
- Сбор данных: JavaScript-код на стороне пользователя фиксирует события кликов и передаёт их на сервер защиты.
- Хранилище и обучение: большой бэкенд (БД + система ML) хранит историю кликов и обучает нейросеть (обычно на GPU). Здесь выделяются признаки и происходит обучение новых моделей.
- Realtime API: легковесный сервер (или несколько узлов) запускает обученную модель на входящих кликах и принимает решение блокировать или пропустить. Решения отправляются обратно в рекламную систему, и бюджет корректируется.
Сервис clickfraud работает примерно по такому сценарию. Он адаптирован на российский рынок и платформу Яндекс.Директ. Сразу после установки (регистрация и авторизация в Директе) сервиса запускает «умный фильтр». Уже на этапе «пилота» защита может включать две стадии фильтрации: простую (например, основные гео/устройства) и глубокую (нейросеть).
В сравнении с другими решениями clickfraud позиционируется как «нейросетевой пример защиты». Его алгоритмы «обучены на паттернах поведения в Рунете» (с учётом прокси, региональных особенностей и тактик конкурентов). Справедливости ради, есть и более простые решения: например, бесплатная встроенная защита click.ru или вендорские «антиботы», но их точность и гибкость уступают специализированным системам.
Часто задаваемые вопросы
- Что такое кликфрод и чем он опасен? Кликфрод (скликивание) – это когда кто-то намеренно кликает по рекламе без интереса к продукту. Это уничтожает бюджет: до 15-40% денег рекламодателей уходит впустую.
- Как понять, что мою рекламу скликивают? Следите за метриками. Тревожные сигналы: резкий рост кликов при отсутствии роста заявок, отказов больше 90%, много кликов с одного IP, клики ночью или из нетипичных регионов. Если заметили 2-3 таких признака, стоит включить защиту.
- Почему обычные правила не спасают? Статические блокировщики (черные списки, лимиты по IP) быстро обходятся мошенниками. Исследования показывают: злоумышленники эволюционируют, и жёсткие правила становятся неэффективными.
- Как нейросети выявляют клики ботов? Нейросеть «учится» отличать поведение обычных пользователей от аномального. Она анализирует всю доступную информацию о сессии (время, частоту, гео, поведение на сайте и т.д.) и выявляет скрытые закономерности. Например, RNN смотрит на последовательность действий и «понимает», что эта цепочка кликов выглядит неестественной, даже если отдельный клик не выделяется.
- Насколько эффективны нейросети на практике? Очень эффективно. В экспериментах алгоритмы на основе глубоких сетей достигают точности порядка 97% и выше при выявлении кликфрода. Для сравнения, классические ML-алгоритмы показывали ~99%. При этом нейросети могут находить ранее неизвестные схемы мошенничества, подстраиваясь под новые данные.
- Сколько времени требуется на «обучение» защиты? Минимальная фильтрация включается сразу после подключения сервиса. Полное обучение нейросети на вашем трафике обычно занимает 24-72 часа. По опыту, к концу третьих суток система уже хорошо «понимает» типичный трафик и замечает аномалии.
- Будут ли блокироваться реальные пользователи? Современные системы антифрода настроены на минимизацию ложных срабатываний. По данным Clickfraud, вероятность блокировки честного пользователя составляет менее 0,1%. Модели используют поведенческие сигналы и репутационные базы, чтобы отличать ботов от настоящих людей.
- Работает ли защита сразу в нескольких рекламных системах? Да. Большинство решений поддерживают мультиплатформенность. Например, clickfraud может защищать одновременно кампании и в Яндекс.Директ, и в Google Ads, и ВКонтакте, показывая результаты в едином личном кабинете.
- Как увидеть, сколько сэкономлено? В интерфейсе защиты обычно есть дашборд с отчётами. Там видно количество отсечённых подозрительных кликов, их среднюю стоимость и рассчитанную сумму сэкономленного бюджета. У clickfraud, например, есть прозрачный отчёт «сколько ₽ сэкономлено каждый день». Первые результаты обычно видны уже через сутки после запуска.
Заключение
Нейросетевые технологии оказываются одним из самых эффективных инструментов в борьбе с кликфродом. Они анализируют поведение пользователей глубже, чем простые фильтры, и адаптируются к новым угрозам. В условиях растущих затрат на интернет-рекламу защита от скликивания становится необходимостью 2026 года. Практика показывает: рекламодатели, использующие сервисы наподобие clickfraud, окупают затраты на подписку за 1-2 недели и стабильно экономят до 30-40% рекламного бюджета.
Комплексный подход с применением нейросетей, машины обучения и анализа поведения приносит реальную выгоду. Уже сегодня запуск «умной» защиты от кликфрода занимает считанные минуты, а первые заметные результаты – экономия реальных рублей – появляются в течение суток. Интернет-реклама становится всё дороже, а мошенники изощреннее, поэтому защищать бюджет нужно на уровне передовых технологий. Нейросети для борьбы с кликовым мошенничеством доказали свою эффективность и становятся стандартом №1 в отрасли.
Список источников
Русскоязычные источники
- Что такое скликивание? Полное руководство по кликфроду – https://clickfraud.ru/chto-takoe-sklikivanie-polnoe-rukovodstvo-po-klikfrodu/?utm_source=chatgpt.com
- Как мы защищаем от скликивания – https://clickfraud.ru/zashhita-ot-sklikivaniya/?utm_source=chatgpt.com
- Использование антифрод-систем для защиты от скликивания – https://clickfraud.ru/ispolzovanie-antifrod-sistem-dlya-zashhity-ot-sklikivaniya/?utm_source=chatgpt.com
- Финансовые потери: реальная цена скликивания – https://clickfraud.ru/finansovye-poteri-realnaya-czena-sklikivaniya/?utm_source=chatgpt.com
- Что такое боты? Как трафик-боты вызывают хаос в интернете – https://clickfraud.ru/chto-takoe-boty-kak-trafik-boty-vyzyvayut-haos-v-internete/?utm_source=chatgpt.com
- Защита от недействительного трафика – https://yandex.ru/support/direct/ru/technologies-and-services/antifraud?utm_source=chatgpt.com
- Что делать, если меня «скликивают» – https://yandex.ru/support/direct/ru/troubleshooting/stat?utm_source=chatgpt.com
- Как работает Метрика – https://yandex.ru/support/metrica/ru/general/how-it-works?utm_source=chatgpt.com
- Отображение роботов в Метрике – https://yandex.ru/support/metrica/ru/general/robots?utm_source=chatgpt.com
- Фильтры и операции в Яндекс Метрике – https://yandex.ru/support/metrica/ru/general/filters?utm_source=chatgpt.com
- Основы машинного обучения – https://developers.google.com/machine-learning/crash-course/?utm_source=chatgpt.com
- Метрики классификации: точность, полнота и precision – https://developers.google.com/machine-learning/crash-course/classification/accuracy-precision-recall?utm_source=chatgpt.com
- Векторные представления данных – embeddings – https://developers.google.com/machine-learning/crash-course/embeddings?utm_source=chatgpt.com
- Правила машинного обучения – https://developers.google.com/machine-learning/guides/rules-of-ml?utm_source=chatgpt.com
- Данные, обобщение и переобучение моделей – https://developers.google.com/machine-learning/crash-course/overfitting?utm_source=chatgpt.com
- Обнаружение выбросов и новых объектов – https://scikit-learn.org/stable/modules/outlier_detection.html?utm_source=chatgpt.com
- Калибровка вероятностей в моделях машинного обучения – https://scikit-learn.org/stable/modules/calibration.html?utm_source=chatgpt.com
- Документация по XGBoost и параметрам моделей – https://xgboost.readthedocs.io/en/latest/parameter.html?utm_source=chatgpt.com
- Введение в графовые нейронные сети – https://pytorch-geometric.readthedocs.io/en/latest/get_started/introduction.html?utm_source=chatgpt.com
- Таксономия и терминология атак и методов защиты в adversarial machine learning – https://www.nist.gov/publications/adversarial-machine-learning-taxonomy-and-terminology-attacks-and-mitigations?utm_source=chatgpt.com









