P paper2skillsPlaybook
AI 路线图 →

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