Feature Engineering in Fraud Detection
Xây dựng đặc trưng trong chống gian lận
Công ty nào đang ứng dụng Xây dựng đặc trưng?
Bạn mua hàng online, nhập số thẻ, nhấn “Thanh toán” — và trong chưa đầy 100 mili-giây, Stripe Radar (công cụ chống gian lận của Stripe) đã chấm điểm hơn 1.000 đặc trưng để quyết định cho qua hay chặn.
Bí quyết không nằm ở mô hình phức tạp. Nó nằm ở cách kỹ sư Stripe biến vài trường dữ liệu thô của một giao dịch (số thẻ, IP, số tiền, thời gian) thành hàng trăm tín hiệu có ý nghĩa: velocity feature (tốc độ dùng thẻ), device fingerprint (dấu vân tay thiết bị), network graph (liên kết giữa các thực thể). Đây chính là feature engineering ở quy mô toàn cầu.
Vấn đề công ty cần giải quyết
Stripe xử lý hàng trăm tỷ đô-la thanh toán mỗi năm. Chỉ khoảng 0,1% là gian lận — nhưng con số tuyệt đối lên tới hàng tỷ đô-la. Mỗi giao dịch chỉ cung cấp vài trường raw data: số thẻ, số tiền, IP, thời gian, vài metadata.
Vấn đề lõi: từ vài trường đó, làm sao tạo ra tín hiệu đủ mạnh để phân biệt giao dịch thật và gian? Kẻ gian liên tục thay đổi chiêu: VPN, thẻ ảo, danh tính giả. Dữ liệu mất cân bằng cực đoan: đoán “hợp lệ” cho tất cả vẫn đạt accuracy 99,9% — nhưng recall bằng 0, vô dụng.
Accuracy 99,9% có thể = recall 0. Cần feature mạnh hơn cả mô hình.
Mọi feature phải tính được real-time, không được chậm.
Feature hôm nay mạnh, mai cũ. Phải cập nhật liên tục.
Cách Xây dựng đặc trưng giải quyết vấn đề
Velocity features (đặc trưng tốc độ).Stripe tính “thẻ này đã thử bao nhiêu giao dịch trong 10 phút / 1 giờ / 24 giờ qua?” Giao dịch hợp lệ thường 1 – 2 lần mỗi ngày. Kẻ gian thử hàng chục lần liên tiếp (card testing). Velocity bắt ngay pattern bất thường đó. Stripe có hệ thống tính velocity real-time trên toàn mạng lưới.
Device fingerprinting (dấu vân tay thiết bị). Stripe.js thu độ phân giải, font, timezone, WebGL renderer, ngôn ngữ hệ thống. Tổ hợp các tín hiệu tạo “vân tay” gần như duy nhất. Kẻ gian đổi danh tính nhưng giữ laptop — vân tay vẫn lộ.
Network graph features (đồ thị mạng lưới). Stripe nối mọi giao dịch trên toàn mạng: thẻ A đã dùng ở merchant B, từ thiết bị C, với email D. Thẻ mới dùng cùng thiết bị với thẻ đã bị chargeback ⇒ cảnh báo ngay. Đây là lợi thế quy mô của Stripe: hàng triệu merchant chia sẻ tầm nhìn mạng lưới.
Aggregated risk scoring.1.000+ feature đưa vào mô hình ML. Mỗi giao dịch nhận một risk score. Rủi ro cao ⇒ chặn hoặc yêu cầu 3D Secure. Toàn bộ pipeline chạy trong < 100 ms. Stripe báo cáo cải thiện > 20% hiệu suất mỗi năm nhờ liên tục thêm feature mới.
Thử tự tay
Dưới đây là phiên bản tinh gọn của ý tưởng: bạn có 8 giao dịch (4 gian lận, 4 hợp lệ) và 4 feature để bật/tắt. Xem AUC tăng thế nào khi bạn bật từng feature — chính là trải nghiệm của kỹ sư Stripe khi thêm một cột mới vào pipeline.
Bảng bên dưới có 8 giao dịch, 4 gian lận (đỏ) và 4 hợp lệ (xanh). Hãy bật/tắt từng feature và xem điểm AUC (khả năng tách biệt gian/hợp) thay đổi. Ở cấu hình rỗng, mô hình không có tín hiệu — AUC ~0.5 (đoán bừa).
Chưa bật feature nào — mô hình đoán bừa.
Giao dịch xếp theo risk (cao xuống thấp)
Grab VN
78.000đ · 8h · vel=1
risk 10%
ElectroShop.ru
6.900.000đ · 3h · vel=14
risk 10%
Tiki
350.000đ · 19h · vel=1
risk 10%
GiftCard-Depot
4.500.000đ · 2h · vel=22
risk 10%
Shopee
1.200.000đ · 13h · vel=2
risk 10%
CryptoExch.io
9.800.000đ · 4h · vel=31
risk 10%
VNPay
120.000đ · 11h · vel=1
risk 10%
LuxuryBag.tk
7.200.000đ · 1h · vel=18
risk 10%
Một vụ gian lận thật — từng feature bóc mặt nạ
Theo dõi một giao dịch giả trông bình thường bị hệ thống tóm qua bốn bước feature khác nhau.
Thẻ Visa, mua đồ điện tử 6.9 triệu tại một shop ở Nga. Số tiền hợp lý cho đồ công nghệ, thẻ hợp lệ, 3D Secure bỏ qua. Nếu chỉ nhìn raw data, nhiều ngân hàng sẽ cho qua.
Bạn là kỹ sư Stripe, cần thêm 1 feature nữa để bắt thêm các vụ gian lận dùng thẻ quà (gift card). Feature nào có khả năng hữu ích nhất?
Code mẫu — tính velocity feature với pandas
import pandas as pd
df = df.sort_values(["card_id", "ts"])
df["vel_10m"] = (
df.groupby("card_id")["ts"]
.rolling("10min")
.count()
.reset_index(0, drop=True)
)
df["vel_1h"] = (
df.groupby("card_id")["ts"]
.rolling("1h")
.count()
.reset_index(0, drop=True)
)Pandas rolling theo cửa sổ thời gian. Ở production, Stripe dùng stream processing (Kafka + Flink) để tính real-time, nhưng logic vẫn giống.
Code mẫu — ghép feature vào risk score
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import GradientBoostingClassifier
features = [
"vel_10m", "vel_1h",
"amount_vs_user_avg",
"ip_distance_km",
"is_unusual_hour",
"device_flagged_count",
]
X = StandardScaler().fit_transform(df[features])
model = GradientBoostingClassifier(n_estimators=300).fit(X, y)
df["risk_score"] = model.predict_proba(X)[:, 1]Con số thật
- Phân tích hơn 1.000 đặc trưng cho mỗi giao dịch trong dưới 100 mili-giây [1]
- Ngăn chặn hàng tỷ đô-la gian lận, bảo vệ hàng triệu doanh nghiệp trên toàn cầu [4]
- Cải thiện hiệu suất phát hiện gian lận hơn 20% mỗi năm nhờ cập nhật feature liên tục [1]
- Tốc độ phát hành mô hình tăng gấp 3 lần nhờ tự động hoá pipeline huấn luyện và đánh giá [1]
Nếu không có Xây dựng đặc trưng, app sẽ ra sao?
Nếu bỏ bước feature engineering, mô hình chỉ thấy raw data: số thẻ, số tiền, IP. Một giao dịch 6,9 triệu từ thẻ mới trông giống hệt giao dịch hợp lệ. Nhưng velocity feature tiết lộ: thẻ này đã thử 14 lần trong 10 phút. Device fingerprint cho biết: cùng laptop đã dùng 8 thẻ bị chargeback. Network graph nối lại: email này từng xuất hiện cùng thiết bị bị chặn ở merchant khác.
Feature thông minh biến raw data vô hồn thành tín hiệu có ý nghĩa — như thám tử không chỉ nhìn hiện trường mà còn kiểm tra tiền sử, mối quan hệ, hành vi quá khứ. Đây là lý do cùng một mô hình ML, người có feature tốt hơn luôn thắng.
- Raw data có thể chỉ có 5 trường, nhưng feature phái sinh có thể lên đến hàng nghìn — velocity, fingerprint, graph là ba kiểu mạnh nhất cho fraud.
- Mọi feature phải tính được trong real-time (< 100 ms). Tính nhanh là ràng buộc khắc nghiệt nhưng bắt buộc.
- Lợi thế quy mô (dữ liệu toàn mạng) tạo ra những feature mà merchant đơn lẻ không thể có — đó là lý do Stripe chiến thắng.
Kiểm tra nhanh
Kiểm tra hiểu biết
Vì sao Stripe phải tự chế 'velocity feature' thay vì dựa vào cột có sẵn trong giao dịch?