# Кейс 6. Фрод или нормальная транзакция

Fraud (фрод) – это задача, где ошибка стоит денег. Иногда – очень больших.

В отличие от предыдущих кейсов, здесь важно не только предсказать класс, но и понимать последствия ошибки. Пропустить мошенническую операцию и заблокировать нормальную – это две разные по цене ошибки.

Логистическая регрессия в таких задачах используется как базовый инструмент оценки риска.

#### Цель кейса

Определить, является ли транзакция мошеннической, и оценить вероятность фрода.

Модель должна:

1. Оценить риск операции
2. Дать вероятность, с которой можно работать дальше
3. Позволить управлять чувствительностью системы через порог

#### Сценарий

Представим платежную систему, которая обрабатывает транзакции в реальном времени.

Для каждой операции доступны простые признаки:

* сумма транзакции
* страна (например, 0 – подозрительная, 1 – обычная)
* количество операций за день

Каждая транзакция описывается так:

$$
x = \[amount, country, transactionsPerDay]
$$

Целевая переменная:

* "fraud" – фрод
* "normal" – нормальная операция

#### Данные

Минимальный учебный пример:

```php
use Rubix\ML\Classifiers\LogisticRegression;
use Rubix\ML\Datasets\Labeled;
use Rubix\ML\Datasets\Unlabeled;

$samples = [
    [50, 1, 2],
    [5000, 0, 15],
    [200, 1, 1],
    [7000, 0, 20],
];

$labels = ['normal', 'fraud', 'normal', 'fraud'];
$dataset = new Labeled($samples, $labels);

$model = new LogisticRegression();
$model->train($dataset);

$transaction = new Unlabeled([[3000, 0, 10]]);
$prediction = $model->predict($transaction);

echo "Predicted label (normal or fraud): \n";
print_r($prediction);

$probas = $model->proba($transaction);
$probabilityOfFraud = $probas[0]['fraud'] ?? null;

echo "\nProbability of fraud (class=fraud): ";
print_r($probabilityOfFraud);
echo "\n";

$threshold = 0.7;
$fraud = $probabilityOfFraud !== null && $probabilityOfFraud >= $threshold;

echo 'Threshold: ' . $threshold . "\n";
echo 'Decision: ' . ($fraud ? 'BLOCK' : 'ALLOW') . "\n";

// Результат:
// Predicted label (normal or fraud): 
// Array (
//    [0] => fraud
// )
// Probability of fraud (class=fraud): 1
// Threshold: 0.7
// Decision: BLOCK
```

Мы анализируем новую транзакцию:

* сумма: 3000
* страна: 0 (подозрительная)
* операций за день: 10

Модель должна оценить вероятность того, что это фрод.

### Что делает модель

Как и в других кейсах, логистическая регрессия считает:

$$
z = w\_1 \ amount + w\_2 \ country + w\_3 \ transactions + b
$$

И затем:

$$
p = \frac{1}{1 + e^{-z}}
$$

Здесь $$p$$ – вероятность того, что транзакция является мошеннической.

#### Главное отличие: цена ошибки

В этой задаче важно не только качество модели, но и тип ошибок.

Есть два варианта:

* False Positive – нормальную транзакцию считаем фродом
* False Negative – пропускаем мошенническую транзакцию

Их цена сильно отличается:

* False Positive → раздражение клиента, потеря лояльности
* False Negative → прямые финансовые потери

Обычно False Negative дороже.

#### Порог как инструмент управления

Как и в кейсе с кредитами, модель возвращает вероятность.

Но решение зависит от порога.

Например:

* порог 0.5 → баланс
* порог 0.3 → агрессивная защита (ловим больше фрода, но больше блокировок)
* порог 0.7 → мягкая защита (меньше ложных блокировок, но больше пропусков)

Это означает: система можно "настроить" под бизнес-задачу.

#### Decision boundary

С тремя признаками decision boundary имеет вид:

$$
w\_1 x\_1 + w\_2 x\_2 + w\_3 x\_3 + b = 0
$$

Это плоскость, которая разделяет пространство на:

* подозрительные операции
* нормальные операции

Чем дальше точка от границы, тем выше уверенность модели.

<div align="left"><figure><img src="https://4057452061-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FjIcWF5FKKxpY4JporyGd%2Fuploads%2FJjtNa8xmdpIgzi0kBXcq%2F14.9-fraud-decision-boundary.png?alt=media&#x26;token=2a7b6f3b-073e-4cba-960b-c4846387d70d" alt="" width="563"><figcaption><p>14.9 Граница принятия решения о мошенничестве</p></figcaption></figure></div>

#### Интерпретация

Даже в таком простом виде модель уже отражает здравую логику:

* большие суммы → повышенный риск
* подозрительная страна → повышенный риск
* высокая частота операций → повышенный риск

Вес каждого признака показывает его вклад в итоговое решение.

#### Практический смысл

В реальных системах антифрода:

* признаков гораздо больше
* используются ансамбли моделей
* решения принимаются в миллисекундах

Но базовая идея остается той же: оценить вероятность риска и принять решение на основе порога.

#### Выводы

Этот кейс добавляет важный слой понимания:

* не все ошибки одинаковы по цене
* модель дает вероятность, а не финальное решение
* порог становится инструментом управления системой

И ключевой практический вывод:

> False negative дороже false positive.

Логистическая регрессия здесь выступает как простой и понятный способ оценить риск и встроить его в бизнес-процесс.

И именно в таких задачах становится ясно: важно не только "насколько точна модель", но и как используется её результат.

{% hint style="info" %}
Чтобы самостоятельно протестировать этот код, воспользуйтесь [онлайн-демонстрацией](https://aiwithphp.org/books/ai-for-php-developers/examples/part-3/logistic-regression) для его запуска.
{% endhint %}
