利用圖神經網路和Neo4j構建即時欺詐檢測系統

利用圖神經網路和Neo4j構建即時欺詐檢測系統

文章目录

  • 為什麼傳統欺詐檢測會失敗?
  • 基於規則的陷阱
  • 為什麼連傳統的機器學習方法都失效了?
  • 圖神經網路應運而生
  • 圖表示的力量
  • 系統構建:架構概述
  • 實現步驟詳解
  • 步驟 1:在Neo4j中建模資料
  • 步驟 2:使用真實欺詐模式生成資料
  • 步驟 3:構建GraphSAGE神經網路
  • 步驟 4:特徵工程
  • 步驟 5:訓練模型
  • 結果:我們取得的成果
  • 績效指標
  • 結果解讀
  • 視覺化圖表說明問題
  • 欺詐模式分析
  • 何時使用此方法
  • 小結

利用圖神經網路和Neo4j構建即時欺詐檢測系統

根據 LexisNexis 釋出的《欺詐真實成本研究》,銀行每年因欺詐損失超過 4420 億美元。傳統的基於規則的系統已無法應對,Gartner 的報告顯示,由於攻擊者適應新策略的速度遠超規則更新速度,這些系統會漏掉超過 50% 的新型欺詐模式。與此同時,誤報率持續上升。Aite-Novarica 的研究發現,近 90% 的被拒交易實際上是合法的,這不僅令客戶感到沮喪,也增加了運營成本。欺詐活動也變得越來越有組織性。Feedzai 的資料顯示,欺詐團伙的活動在一年內增長了 109%。

為了保持領先地位,銀行需要能夠理解使用者、商戶、裝置和交易之間關係的模型。因此,我們正在構建一個由圖神經網路和 Neo4j 驅動的下一代欺詐檢測系統。該系統不會將交易視為孤立事件,而是分析整個網路,從而發現傳統機器學習常常忽略的複雜欺詐模式。

為什麼傳統欺詐檢測會失敗?

首先,讓我們嘗試理解為什麼我們需要轉向這種新方法。大多數欺詐檢測系統使用傳統的機器學習模型來隔離需要分析的交易。

基於規則的陷阱

以下是一個非常標準的基於規則的欺詐檢測系統:

def detect_fraud(transaction): 
    if transaction.amount > 1000: 
        return "FRAUD" 
    if transaction.hour in [0, 1, 2, 3]: 
        return "FRAUD" 
    if transaction.location != user.home_location: 
        return "FRAUD" 
    return "LEGITIMATE"

這裡的問題非常直接:

  • 有時,一些合法的高價值交易會被標記出來(例如,您的客戶在百思買購買了一臺電腦)。
  • 詐騙分子會迅速調整策略——他們只會進行低於 1000 美元的交易。
  • 缺乏上下文資訊——例如,一位出差的商務人士在出差期間購物,也會被標記出來。
  • 系統無法學習新知識——它無法從識別出的新欺詐模式中改進。

為什麼連傳統的機器學習方法都失效了?

隨機森林和 XGBoost 演算法有所改進,但它們仍然獨立分析每筆交易。它們可能沒有意識到!使用者 A、使用者 B 和使用者 C 的賬戶都被盜用了,它們都受同一個詐騙團伙控制,而且在短短幾分鐘內,它們似乎都在針對同一家可疑商家下單。

重要啟示:欺詐是關聯性的。詐騙分子並非孤軍奮戰:他們以網路形式運作,共享資源。只有觀察實體間的關係,才能發現他們的作案模式。

圖神經網路應運而生

圖神經網路專為學習網路資料而構建,它分析整個圖結構,其中交易構成使用者和商家之間的關係,其他節點則代表裝置、IP 地址等資訊,而不是一次分析單個交易。

圖神經模型架構

圖表示的力量

在我們的框架中,我們使用圖結構來表示欺詐問題,圖結構包含以下節點和邊:

節點:

  • 使用者(持有信用卡的客戶)
  • 商戶(接受付款的商家)
  • 交易(單次購買)

Edges:

  • 使用者 → 交易(執行購買的使用者)
  • 交易 → 商戶(購買發生的地點)

圖表示的力量

這種表示方法使我們能夠觀察到以下模式:

  • 欺詐團伙:15 個賬戶在 2 小時內全部針對同一商家進行攻擊
  • 被盜用的商家:一家看似信譽良好的商家突然間只吸引欺詐
  • 高速攻擊:同一裝置使用 10 個不同的賬戶進行購買

系統構建:架構概述

我們的系統包含五個主要元件,構成一個完整的流程:

系統構建:架構概述

技術棧:

  • Neo4j 5.x:用於圖儲存和查詢
  • PyTorch 2.x:與 PyTorch Geometric 配合使用,實現圖神經網路 (GNN)
  • Python 3.9+:用於整個流程
  • Pandas/NumPy:用於資料處理

Python 3.9+ Neo4j 5.x

實現步驟詳解

步驟 1:在Neo4j中建模資料

Neo4j 是一個原生圖資料庫,它將關係作為一等公民進行儲存。以下是我們如何對實體進行建模:

  1. 具有行為特徵的使用者節點
CREATE (u:User { 
    user_id: 'U0001', 
    age: 42, 
    account_age_days: 1250, 
    credit_score: 720, 
    avg_transaction_amount: 245.50 
})
  1. 具有風險指標的商戶節點
CREATE (m:Merchant { 
    merchant_id: 'M001', 
    name: 'Electronics Store', 
    category: 'Electronics', 
    risk_score: 0.23 
})
  1. 事務節點捕獲事件
CREATE (t:Transaction { 
    transaction_id: 'T00001', 
    amount: 125.50, 
    timestamp: datetime('2024-06-15T14:30:00'), 
    hour: 14, 
    is_fraud: 0 
})
  1. 關係連線實體
CREATE (u)-[:MADE_TRANSACTION]->(t)-[:AT_MERCHANT]->(m)

image6-2

這種模式有效的原​​因:

  • 使用者和商家是具有特定特徵集的穩定實體。
  • 交易是構成我們圖中邊的事件。
  • 二分圖結構(使用者-交易-商家)非常適合圖神經網路 (GNN) 中的訊息傳遞。

步驟 2:使用真實欺詐模式生成資料

利用嵌入的欺詐模式,我們生成合成但真實的資料:

class FraudDataGenerator: 
    def generate_transactions(self, users_df, merchants_df): 
        transactions = [] 
         
        # Create fraud ring (coordinated attackers) 
        fraud_users = random.sample(list(users_df['user_id']), 50) 
        fraud_merchants = random.sample(list(merchants_df['merchant_id']), 10) 
         
        for i in range(5000): 
            is_fraud = np.random.random() < 0.15  # 15% fraud rate 
             
            if is_fraud: 
                # Fraud pattern: high amounts, odd hours, fraud ring 
                user_id = random.choice(fraud_users) 
                merchant_id = random.choice(fraud_merchants) 
                amount = np.random.uniform(500, 2000) 
                hour = np.random.choice([0, 1, 2, 3, 22, 23]) 
            else: 
                # Normal pattern: business hours, typical amounts 
                user_id = random.choice(list(users_df['user_id'])) 
                merchant_id = random.choice(list(merchants_df['merchant_id'])) 
                amount = np.random.lognormal(4, 1) 
                hour = np.random.randint(8, 22) 
             
            transactions.append({ 
                'transaction_id': f'T{i:05d}', 
                'user_id': user_id, 
                'merchant_id': merchant_id, 
                'amount': round(amount, 2), 
                'hour': hour, 
                'is_fraud': 1 if is_fraud else 0 
            }) 
         
        return pd.DataFrame(transactions)

該函式幫助我們生成 5,000 筆交易,欺詐率為 15%,其中包括欺詐團伙和基於時間的異常等真真實模式。

步驟 3:構建GraphSAGE神經網路

我們選擇 GraphSAGE(圖取樣和聚合方法)作為 GNN 架構,因為它不僅可擴充套件性好,而且無需重新訓練即可處理新節點。以下是我們的實現方式:

import torch 
import torch.nn as nn 
import torch.nn.functional as F 
from torch_geometric.nn import SAGEConv 
 
class FraudGNN(nn.Module): 
    def __init__(self, num_features, hidden_dim=64, num_classes=2): 
        super(FraudGNN, self).__init__() 
         
        # Three graph convolutional layers 
        self.conv1 = SAGEConv(num_features, hidden_dim) 
        self.conv2 = SAGEConv(hidden_dim, hidden_dim) 
        self.conv3 = SAGEConv(hidden_dim, hidden_dim) 
         
        # Classification head 
        self.fc = nn.Linear(hidden_dim, num_classes) 
         
        # Dropout for regularization 
        self.dropout = nn.Dropout(0.3) 
     
    def forward(self, x, edge_index): 
        # Layer 1: Aggregate from 1-hop neighbors 
        x = self.conv1(x, edge_index) 
        x = F.relu(x) 
        x = self.dropout(x) 
         
        # Layer 2: Aggregate from 2-hop neighbors 
        x = self.conv2(x, edge_index) 
        x = F.relu(x) 
        x = self.dropout(x) 
         
        # Layer 3: Aggregate from 3-hop neighbors 
        x = self.conv3(x, edge_index) 
        x = F.relu(x) 
        x = self.dropout(x) 
         
        # Classification 
        x = self.fc(x) 
        return F.log_softmax(x, dim=1)

這裡發生了什麼:

  • 第 1 層檢查直接鄰居(使用者 → 交易 → 商家)
  • 第 2 層將擴充套件到兩跳鄰居(查詢透過同一商家連線的使用者)
  • 第 3 層將觀察三跳鄰居(查詢跨多個商家連線的欺詐使用者群)
  • 使用 dropout(30%)來減少對圖中特定結構的過擬合
  • softmax 的對數將提供合法交易與欺詐交易的機率分佈

步驟 4:特徵工程

為了進行穩定的訓練,我們將所有特徵歸一化到 [0, 1] 範圍內:

def prepare_features(users, merchants): 
    # User features (4 dimensions) 
    user_features = [] 
    for user in users: 
        features = [ 
            user['age'] / 100.0,                     # Age normalized 
            user['account_age_days'] / 3650.0,       # Account age (10 years max) 
            user['credit_score'] / 850.0,            # Credit score normalized 
            user['avg_transaction_amount'] / 1000.0  # Average amount 
        ] 
        user_features.append(features) 
     
    # Merchant features (padded to match user dimensions) 
    merchant_features = [] 
    for merchant in merchants: 
        features = [ 
            merchant['risk_score'],  # Pre-computed risk 
            0.0, 0.0, 0.0           # Padding 
        ] 
        merchant_features.append(features) 
     
    return torch.FloatTensor(user_features + merchant_features)

步驟 5:訓練模型

以下是我們的訓練流程:

def train_model(model, x, edge_index, train_indices, train_labels, epochs=100): 
    optimizer = torch.optim.Adam( 
        model.parameters(),  
        lr=0.01,           # Learning rate 
        weight_decay=5e-4  # L2 regularization 
    ) 
     
    for epoch in range(epochs): 
        model.train() 
        optimizer.zero_grad() 
         
        # Forward pass 
        out = model(x, edge_index) 
         
        # Calculate loss on training nodes only 
        loss = F.nll_loss(out[train_indices], train_labels) 
         
        # Backward pass 
        loss.backward() 
        optimizer.step() 
         
        if epoch % 10 == 0: 
            print(f"Epoch {epoch:3d} | Loss: {loss.item():.4f}") 
     
    return model

訓練動態:

  • 初始損失約為 0.80(隨機初始化)
  • 經過 100 個 epoch 後,損失收斂至 0.33-0.36
  • 在我們的資料集上,CPU 執行時間約為 60 秒

結果:我們取得的成果

執行完整流程後,以下是我們的結果:

imageb

績效指標

分類報告:

分類報告

結果解讀

讓我們來分析一下結果,以便更好地理解。

哪些方面表現出色:

  • 總體準確率達到 91%:遠高於基於規則的準確率 (70%)。
  • AUC-ROC 為 0.96:展現出極佳的類別區分能力。
  • 合法交易的召回率達到 100%:我們沒有誤判合法使用者。

哪些方面需要改進:

  • 欺詐交易的精確率為零。模型在此次執行中過於保守。
  • 這可能是因為模型需要更多欺詐樣本,或者閾值需要調整。

視覺化圖表說明問題

以下混淆矩陣展示了模型在此次執行中如何將所有交易分類為合法交易:

混淆矩陣

ROC曲線顯示出很強的區分能力(AUC = 0.961),這意味著即使閾值需要調整,該模型也能學習欺詐模式:

ROC曲線 交易圖表

欺詐模式分析

我們的分析揭示了清晰的趨勢:

時間趨勢:

  • 0 至 3 小時和 22 至 23 小時:欺詐率為 100%(典型的非高峰時段攻擊)
  • 8 至 21 小時:欺詐率為 0%(正常營業時間)

金額分佈:

  • 合法交易:主要集中在 0 至 250 美元範圍內(對數正態分佈)
  • 欺詐交易:主要集中在 500 至 2000 美元範圍內(高價值攻擊)

網路趨勢:

  • 由 50 個賬戶組成的欺詐團伙共有 10 家商戶
  • 欺詐活動並非均勻分佈,而是集中在某些商戶叢集中

何時使用此方法

此方法適用於:

  • 欺詐活動具有明顯的網路模式(例如, (例如:環狀攻擊、協同攻擊)
  • 您擁有關係資料(使用者-商戶-裝置連線)
  • 交易量巨大,值得投資基礎設施(數百萬筆交易)
  • 50-100毫秒的延遲即可實現即時檢測

這種方法不適用於以下場景:

  • 完全獨立的交易,沒有任何網路效應
  • 非常小的資料集(< 1萬筆交易)
  • 需要低於10毫秒的延遲
  • 機器學習基礎設施有限

小結

圖神經網路徹底改變了欺詐檢測的格局。企業不再將交易視為孤立事件,而是可以將其建模為網路,從而檢測到傳統機器學習方法無法識別的更復雜的欺詐手段。

我們的工作進展證明,這種思路不僅在理論上有趣,而且在實踐中也十分有效。基於圖神經網路 (GNN) 的欺詐檢測方法,準確率高達 91%,AUC 值達到 0.961,並且能夠檢測欺詐團伙和協同攻擊,為企業帶來真正的價值。

所有程式碼均已上傳至 GitHub,您可以根據自身具體的欺詐檢測問題和用例進行修改。

評論留言