Return Fraud Detection — 退货欺诈识别:GNN 检测虚假退货与促销滥用
Skill-Return-Fraud-Detection · 19-风控反欺诈
causalexperimentdata_collectionfraud_detectionpricing数据采集与治理定价与利润风控与合规WF-D 选品扫描WF-F 动态定价WF-K 全域风险防御
年化 ROI¥10-40 万
实现难度⭐⭐☆☆☆
业务视角
适用角色运营负责人 / 合规负责人 · 品牌负责人 · CEO
适用平台Amazon 刷评检测与举报 · TikTok Shop 刷单识别 · 竞品 Listing 攻击溯源
什么情况下用竞品刷单刷好评,自己的 BSR 和评分被打压;账号/ASIN 被恶意投诉删除;店铺有异常订单不确定是真实买家
成功是什么样的识别过滤刷评/恶意竞争行为,账号风险提前预警,维权有数据证据,降低封号风险
业务痛点
1. 解决的问题
某款299美元婴儿推车退货率18%但工厂QC合格率99.5%怀疑有组织欺诈却无法证明——账号关联图谱识别共享地址设备的欺诈团伙,拦截30-50%欺诈退货年化节省10-40万元
2. 核心算法逻辑
退货欺诈的三大模式:
3. 业务应用场景
业务问题:某款 $299 婴儿推车连续三个月退货率 18%,远高于品类均值 6%。退货原因几乎都是"产品损坏收到"——但工厂QC合格率 99.5%。怀疑有组织化欺诈但无法证明。
数据要求: - 退货订单明细(账号ID/收货地址/退货原因/退货时间) - 账号历史行为(该账号历史订单总数/退货总数/退货率) - 设备指纹(如有)或 IP 地址
预期产出: - 欺诈账号风险评分(0-1) - 账号关联图谱(可视化共享地址/设备的账号集群) - 高风险账号列表(建议拒绝退货申请/拉黑/向 Amazon 举报)
4. 输入数据要求
请查看原始代码模板获取输入规格。
5. 输出结果
请查看原始代码模板获取输出规格。
6. 业务价值 / ROI
- ROI 预估:
- 识别并拦截 30-50% 欺诈退货:月节省 ¥3-10 万(高价母婴品)
- 减少货损(欺诈退货货损率 80%+):年化节省 ¥5-20 万
- 向 Amazon 提供欺诈证据改善账号健康度
- 年化综合 ROI:¥10-40 万
- 实施难度:⭐⭐☆☆☆(规则+图特征版 2 周实现;需要退货数据权限;完整 GNN 版约 4-6 周)
7. 代码模板
代码块数量:2 · 路径:未检测到
"""
Return Fraud Detection
基于规则 + 图特征的退货欺诈识别模型
"""
import numpy as np
from collections import defaultdict
from dataclasses import dataclass
from typing import Optional
@dataclass
class ReturnRecord:
order_id: str
account_id: str
product_price: float
return_reason: str
return_days_after_purchase: int
address_id: str
device_fingerprint: Optional[str] = None
# 欺诈风险规则(启发式)
FRAUD_SIGNALS = {
'high_return_rate': 0.25, # 账号退货率超 25%
'luxury_product_return': 0.20, # 高价品(>$100)退货
'post_promo_return': 0.15, # 促销结束后 3 天内退货
'address_hopping': 0.20, # 近 30 天更换过收货地址
'damage_claim_pattern': 0.10, # 退货原因为"损坏/缺件"
'repeat_account': 0.10, # 该账号曾有欺诈记录
}
def compute_account_stats(records: list[ReturnRecord]) -> dict:
"""统计各账号的退货行为特征"""
account_stats = defaultdict(lambda: {
'total_orders': 0, 'total_returns': 0,
'return_rate': 0.0, 'addresses': set(),
'high_value_returns': 0, 'damage_claims': 0,
'post_promo_returns': 0,
})
# 模拟订单数量(实际需从订单数据库获取)
account_order_counts = defaultdict(lambda: np.random.randint(3, 30))
for r in records:
stats = account_stats[r.account_id]
stats['total_returns'] += 1
stats['addresses'].add(r.address_id)
if r.product_price > 100:
stats['high_value_returns'] += 1
if 'damage' in r.return_reason.lower() or 'broken' in r.return_reason.lower():
stats['damage_claims'] += 1
if r.return_days_after_purchase <= 3:
stats['post_promo_returns'] += 1
for account_id, stats in account_stats.items():
total_orders = account_order_counts[account_id]
stats['total_orders'] = total_orders
stats['return_rate'] = stats['total_returns'] / max(total_orders, 1)
stats['address_count'] = len(stats['addresses'])8. 论文来源
- 2408.09812