Fraud AI

AI Fraud Detection: Dolandırıcılık Tespiti

Yapay zeka ile gerçek zamanlı dolandırıcılık tespiti. Anomaly detection, transaction monitoring, identity verification ve credit card fraud prevention.

🛡️Fraud Detection Türleri

AI Fraud Detection, şüpheli işlemleri makine öğrenmesi ile tespit eder. %95+ doğrulukla çalışır ve finansal kayıpları %60-80 azaltır.

Payment Fraud

• Kredi kartı dolandırıcılığı
• Çalıntı kart kullanımı
• Card-not-present (CNP)
• Chargeback manipulation

Account Fraud

• Account takeover (ATO)
• Fake account creation
• Identity theft
• Promo abuse

Transaction Fraud

• Unusual purchase patterns
• Money laundering
• Return fraud
• Friendly fraud

Anomaly Detection (Isolation Forest)

# Isolation Forest ile anomali tespiti
import pandas as pd
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import StandardScaler

# İşlem verileri
transactions = pd.DataFrame({
    'amount': [50, 45, 120, 3000, 55, 60, 15000, 40, 75],  # 3000 ve 15000 anormal
    'hour': [14, 15, 10, 3, 16, 18, 2, 12, 17],  # Gece 2-3 şüpheli
    'merchant_category': [1, 1, 2, 3, 1, 1, 5, 1, 2],
    'card_present': [1, 1, 1, 0, 1, 1, 0, 1, 1],  # 0: Online (riskli)
    'country_match': [1, 1, 1, 0, 1, 1, 0, 1, 1],  # Kart ülkesi != işlem ülkesi
    'velocity_1h': [1, 1, 2, 5, 1, 1, 8, 1, 2]  # Son 1 saatte işlem sayısı
})

# Feature engineering
features = ['amount', 'hour', 'merchant_category', 'card_present', 'country_match', 'velocity_1h']
X = transactions[features]

# Normalize et
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Isolation Forest modeli
model = IsolationForest(
    contamination=0.1,  # %10 anomali bekliyoruz
    random_state=42,
    n_estimators=100
)

model.fit(X_scaled)

# Tahmin (-1: anomali, 1: normal)
predictions = model.predict(X_scaled)
anomaly_scores = model.decision_function(X_scaled)  # Negatif = anomali

transactions['is_fraud'] = predictions == -1
transactions['fraud_score'] = anomaly_scores

print(transactions[['amount', 'hour', 'is_fraud', 'fraud_score']])
#    amount  hour  is_fraud  fraud_score
# 0      50    14     False         0.15
# 1      45    15     False         0.18
# 2     120    10     False         0.12
# 3    3000     3      True        -0.23  ← ANOMALI
# 4      55    16     False         0.16
# 5      60    18     False         0.14
# 6   15000     2      True        -0.41  ← ANOMALI
# 7      40    12     False         0.19
# 8      75    17     False         0.11

# Gerçek zamanlı fraud check
def check_fraud(transaction):
    features_scaled = scaler.transform([[
        transaction['amount'],
        transaction['hour'],
        transaction['merchant_category'],
        transaction['card_present'],
        transaction['country_match'],
        transaction['velocity_1h']
    ]])

    prediction = model.predict(features_scaled)[0]
    score = model.decision_function(features_scaled)[0]

    return {
        'is_fraud': prediction == -1,
        'fraud_score': score,
        'risk_level': 'HIGH' if score < -0.3 else 'MEDIUM' if score < 0 else 'LOW'
    }

# Test
new_transaction = {
    'amount': 8000,
    'hour': 4,
    'merchant_category': 5,
    'card_present': 0,
    'country_match': 0,
    'velocity_1h': 6
}

result = check_fraud(new_transaction)
print(result)
# {'is_fraud': True, 'fraud_score': -0.35, 'risk_level': 'HIGH'}

Machine Learning Classifier (XGBoost)

# XGBoost ile supervised fraud detection
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, roc_auc_score, confusion_matrix

# Etiketli veri (fraud: 1, normal: 0)
df = pd.read_csv('transactions_labeled.csv')

# Features
feature_columns = [
    'amount', 'hour', 'day_of_week', 'merchant_id',
    'card_age_days', 'transaction_count_1h', 'transaction_count_24h',
    'avg_amount_7d', 'distance_from_home', 'is_international',
    'device_id_changes', 'billing_shipping_match'
]

X = df[feature_columns]
y = df['is_fraud']

# Train/test split (imbalanced data için stratify)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42, stratify=y
)

# Class imbalance handling (SMOTE veya class weights)
from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=42)
X_train_balanced, y_train_balanced = smote.fit_resample(X_train, y_train)

# XGBoost modeli
model = xgb.XGBClassifier(
    max_depth=6,
    learning_rate=0.1,
    n_estimators=200,
    subsample=0.8,
    colsample_bytree=0.8,
    scale_pos_weight=len(y_train[y_train==0]) / len(y_train[y_train==1]),  # Class weight
    eval_metric='auc',
    random_state=42
)

# Eğitim
model.fit(
    X_train_balanced, y_train_balanced,
    eval_set=[(X_test, y_test)],
    early_stopping_rounds=10,
    verbose=False
)

# Tahmin
y_pred = model.predict(X_test)
y_pred_proba = model.predict_proba(X_test)[:, 1]

# Performans
print(classification_report(y_test, y_pred))
#               precision    recall  f1-score   support
#
#            0       0.99      0.98      0.99     19500
#            1       0.87      0.91      0.89       500
#
#     accuracy                           0.98     20000

print(f"AUC-ROC: {roc_auc_score(y_test, y_pred_proba):.2%}")  # 96%

# Confusion matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)
# [[19110   390]     True Negative: 19110, False Positive: 390
#  [   45   455]]    False Negative: 45,   True Positive: 455

# Feature importance
import matplotlib.pyplot as plt
xgb.plot_importance(model, max_num_features=10)
plt.title('En Önemli Fraud Göstergeleri')
plt.show()

# Gerçek zamanlı fraud scoring API
def fraud_risk_score(transaction_data):
    features = pd.DataFrame([transaction_data])
    fraud_probability = model.predict_proba(features)[0][1]

    # Risk seviyeleri
    if fraud_probability > 0.8:
        decision = 'BLOCK'
        action = 'Transaction blocked'
    elif fraud_probability > 0.5:
        decision = 'REVIEW'
        action = 'Manual review required'
    elif fraud_probability > 0.2:
        decision = 'CHALLENGE'
        action = '3D Secure / 2FA required'
    else:
        decision = 'APPROVE'
        action = 'Transaction approved'

    return {
        'fraud_probability': round(fraud_probability, 3),
        'decision': decision,
        'action': action,
        'reasons': get_fraud_reasons(transaction_data, model)
    }

def get_fraud_reasons(data, model):
    """Neden şüpheli olduğunu açıkla (SHAP)"""
    import shap
    explainer = shap.TreeExplainer(model)
    shap_values = explainer.shap_values(pd.DataFrame([data]))

    # En yüksek SHAP value'lara sahip özellikler
    feature_importance = dict(zip(feature_columns, shap_values[0]))
    top_reasons = sorted(feature_importance.items(), key=lambda x: abs(x[1]), reverse=True)[:3]

    return [f"{feature}: {value:.2f}" for feature, value in top_reasons]

# Örnek
transaction = {
    'amount': 5000,
    'hour': 3,
    'day_of_week': 2,
    'merchant_id': 12345,
    'card_age_days': 5,  # Yeni kart (şüpheli)
    'transaction_count_1h': 8,  # Hızlı işlemler (şüpheli)
    'transaction_count_24h': 15,
    'avg_amount_7d': 150,  # Normal tutar 150, şimdi 5000 (şüpheli)
    'distance_from_home': 500,  # 500km uzak
    'is_international': 1,
    'device_id_changes': 3,  # Farklı cihazlar
    'billing_shipping_match': 0  # Adres uyuşmazlığı
}

result = fraud_risk_score(transaction)
print(result)
# {
#   'fraud_probability': 0.87,
#   'decision': 'BLOCK',
#   'action': 'Transaction blocked',
#   'reasons': ['transaction_count_1h: 0.45', 'avg_amount_7d: 0.32', 'card_age_days: 0.28']
# }

Graph Analysis (Network Fraud)

# NetworkX ile fraud ring detection
import networkx as nx

# Transaction graph oluştur (kullanıcı → merchant)
G = nx.DiGraph()

transactions = [
    ('user_1', 'merchant_A', 100),
    ('user_2', 'merchant_A', 150),
    ('user_3', 'merchant_B', 200),
    ('user_1', 'merchant_C', 5000),  # Şüpheli
    ('user_4', 'merchant_C', 4800),  # Şüpheli (aynı merchant)
    ('user_5', 'merchant_C', 5200),  # Şüpheli (fraud ring?)
]

for user, merchant, amount in transactions:
    G.add_edge(user, merchant, weight=amount)

# Fraud ring detection (aynı merchant'a yüksek tutarlı işlemler)
def detect_fraud_ring(graph, min_amount=4000):
    fraud_rings = []

    for merchant in graph.nodes():
        # Merchant'a gelen tüm işlemler
        incoming = graph.in_edges(merchant, data=True)

        # Yüksek tutarlı işlemler
        high_value_users = [
            user for user, _, data in incoming
            if data['weight'] > min_amount
        ]

        if len(high_value_users) >= 2:  # 2+ kullanıcı = ring
            fraud_rings.append({
                'merchant': merchant,
                'suspicious_users': high_value_users,
                'total_amount': sum(data['weight'] for _, _, data in incoming if data['weight'] > min_amount)
            })

    return fraud_rings

rings = detect_fraud_ring(G)
print(rings)
# [{'merchant': 'merchant_C', 'suspicious_users': ['user_1', 'user_4', 'user_5'], 'total_amount': 15000}]

# Community detection (benzer davranış kümeleri)
import community  # python-louvain

# Undirected graph'a çevir
G_undirected = G.to_undirected()

# Community detection
communities = community.best_partition(G_undirected)

# Aynı community'deki kullanıcılar birbirine benzer
for user, comm_id in communities.items():
    print(f"{user} → Community {comm_id}")

Gerçek Zamanlı Sistem Mimarisi

# FastAPI ile real-time fraud detection API
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import redis
import joblib

app = FastAPI()

# Model yükle
fraud_model = joblib.load('fraud_model.pkl')

# Redis cache (velocity tracking için)
redis_client = redis.Redis(host='localhost', port=6379, db=0)

class Transaction(BaseModel):
    user_id: str
    amount: float
    merchant_id: str
    card_id: str
    ip_address: str
    device_id: str
    country: str

@app.post("/check-fraud")
async def check_fraud(transaction: Transaction):
    # 1. Velocity check (Redis)
    velocity_key = f"user:{transaction.user_id}:transactions"
    transaction_count = redis_client.incr(velocity_key)
    redis_client.expire(velocity_key, 3600)  # 1 saat TTL

    # 2. Feature engineering
    features = {
        'amount': transaction.amount,
        'transaction_count_1h': transaction_count,
        'merchant_risk_score': get_merchant_risk(transaction.merchant_id),
        'card_age_days': get_card_age(transaction.card_id),
        'ip_reputation': get_ip_reputation(transaction.ip_address),
        'device_fingerprint_changes': count_device_changes(transaction.user_id),
        # ... diğer özellikler
    }

    # 3. ML prediction
    fraud_probability = fraud_model.predict_proba([list(features.values())])[0][1]

    # 4. Decision
    if fraud_probability > 0.8:
        # BLOCK - Fraud team'e bildirim gönder
        send_alert_to_fraud_team(transaction, fraud_probability)
        return {"decision": "BLOCK", "reason": "High fraud risk", "score": fraud_probability}

    elif fraud_probability > 0.5:
        # REVIEW - Manuel inceleme kuyruğuna ekle
        add_to_review_queue(transaction)
        return {"decision": "REVIEW", "reason": "Moderate risk", "score": fraud_probability}

    elif fraud_probability > 0.2:
        # CHALLENGE - 2FA/3D Secure
        return {"decision": "CHALLENGE", "reason": "Additional verification required", "score": fraud_probability}

    else:
        # APPROVE
        return {"decision": "APPROVE", "score": fraud_probability}

# Yardımcı fonksiyonlar
def get_merchant_risk(merchant_id):
    # Merchant'ın geçmiş fraud oranı
    # 0.0 (güvenli) - 1.0 (riskli)
    merchant_stats = db.query(f"SELECT fraud_rate FROM merchants WHERE id={merchant_id}")
    return merchant_stats['fraud_rate']

def get_ip_reputation(ip):
    # IP reputation servisi (MaxMind, IPQualityScore)
    response = requests.get(f"https://ipapi.co/{ip}/json/")
    data = response.json()
    return 1.0 if data.get('threat', {}).get('is_proxy') else 0.0

İş Etkileri ve ROI

Fraud Detection Performansı

96%
Doğruluk Oranı
-75%
Fraud Kayıpları
<100ms
Yanıt Süresi

Örnek ROI: Fintech

Aylık işlem hacmi: 50M TL
Fraud oranı (öncesi): %1.2 = 600K TL kayıp/ay
AI sistemi sonrası: %0.3 = 150K TL kayıp/ay (%75 azalma)
Tasarruf: 450K TL/ay = 5.4M TL/yıl
Sistem maliyeti: 200K TL (kurulum) + 50K TL/ay (işletme)
Net kazanç: 5.4M - 800K = 4.6M TL/yıl
ROI: %575 (ilk yıl)

AI Fraud Detection Sisteminizi Kuralım

Gerçek zamanlı dolandırıcılık tespiti, anomaly detection ve risk scoring ile finansal kayıplarınızı %75'e kadar azaltın.

Demo İste