TGViewer
Java Ready | Программирование Java Ready | Программирование @java_ready · 9.25K subscribers
Post #1798 1.68K
Выявление мошеннических транзакций с помощью ML!

Детекция мошеннических операций — одна из основных задач финтех-систем. Модель должна оценивать риск транзакции и выявлять подозрительную активность в потоке платежей.

Установка библиотек:
pip install pandas scikit-learn


Будем использовать pandas для работы с данными и scikit-learn для построения модели.

Импорт модулей:
import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report


Мы будем использовать пайплайн, который объединяет предобработку и модель — это стандартная практика для воспроизводимости и предотвращения утечек данных.

Пример структуры данных (учебный):
data = pd.DataFrame({
"amount": [12, 35, 60, 15, 22, 40, 2500, 4200, 5000, 3600],
"hour": [14, 18, 12, 10, 16, 19, 3, 2, 1, 2],
"is_foreign": [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],
"transactions_last_24h": [2, 3, 1, 2, 2, 3, 15, 20, 25, 18],
"fraud": [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]
})


Признаки отражают типичные сигналы риска: сумма операции, время суток, зарубежная транзакция и активность аккаунта за последние сутки. Целевая переменная fraud показывает, признана ли операция мошеннической.

Разделим данные на признаки и целевую переменную:
X = data.drop(columns=["fraud"])
y = data["fraud"]


Теперь модель будет учиться предсказывать fraud на основе остальных признаков.

Разделим данные на обучающую и тестовую выборки:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)


Стратификация сохраняет долю мошеннических операций в обеих выборках, что особенно важно при дисбалансе классов.

В антифроде логистическая регрессия часто используется как базовая модель: она быстрая, понятная и умеет оценивать вероятность мошенничества. Чтобы учесть дисбаланс классов, зададим веса.

Обучим модель в составе пайплайна:
model = Pipeline(steps=[
("scaler", StandardScaler()),
("clf", LogisticRegression(max_iter=1000, class_weight="balanced"))
])

model.fit(X_train, y_train)


StandardScaler нормализует числовые признаки, что улучшает сходимость линейных моделей.

Оценка качества модели:
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))


Отчёт показывает precision, recall и F1-меру для каждого класса. На малых данных, метрики приведены исключительно в демонстрационных целях.

Пример оценки новой транзакции:
tx = pd.DataFrame([{
"amount": 3200,
"hour": 2,
"is_foreign": 1,
"transactions_last_24h": 18
}])

risk = model.predict_proba(tx)[0][1]
print("Вероятность мошенничества:", round(risk, 2))


Модель возвращает вероятность fraud, которую можно использовать для принятия решения.

🔥 В настоящих системах такие модели работают в режиме реального времени: вероятность риска влияет на блокировку операции, запрос дополнительной аутентификации или передачу транзакции на ручную проверку.

👉 Java Ready | #практика
  • ❤ 10
  • 👍 7
  • 👎 5
  • 🔥 5
  • 😁 1
More from @java_ready
  1. Oct 8, 2026Почему String.format может заменить точку на запятую? Представим, что программа сохраняет…
  2. Oct 7, 2026Почему split(".") в Java не делит строку по точке? На первый взгляд кажется, что достаточн…
  3. Oct 6, 2026Безопасная настройка retry для всей системы! В статье Java-разработчик делится опытом внед…
  4. Oct 5, 2026Почему после Stream.toList() нельзя добавить элемент? При работе со Stream часто нужно соб…
  5. Oct 5, 2026Находим три самых популярных товара! Есть поток покупок с повторяющимися названиями. Постр…
  6. Oct 2, 2026photo post
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →