如何设定下单-收货地址相似度阈值?
解读
在国内电商与本地生活场景里,“下单-收货地址相似度”常被用来识别虚假交易、刷单、薅羊毛、分销囤货以及高价值用户真实复购。阈值设得太低,容易误杀正常用户,导致投诉与流失;设得太高,又会让黑产漏网,直接拉低ROI。因此,面试官想考察的是:你能否把业务目标、数据分布、成本收益、灰度验证四件事一次性讲清楚,并给出可落地的迭代节奏。
知识点
- 地址标准化:先调用高德/百度地图API把原始字符串解析成省-市-区-街道-POI-经纬度六级结构化字段,去掉空格、特殊符号、楼层房号噪声。
- 相似度算法:
- 文本层面:Jaro-Winkler对“同音错字”鲁棒,SimHash适合长文本去重。
- 空间层面:把经纬度转GeoHash(精度6位约±1.2 km),再算Levenshtein距离;或直接用球面距离≤500 m视为同一小区。
- 业务分层:
- 新客首单:阈值≥85%即触发复核,防止“自买自收”刷单。
- 老客复购:允许≤3个常用地址,相似度≥90%才合并,避免误合并家庭+公司地址。
- 代价矩阵:
- 误杀成本 = 预计GMV × 客单价 × 投诉率10% × 挽回率30%。
- 漏杀成本 = 刷单佣金 + 平台补贴 + 逆向物流 + 信用损耗。
用Fβ-score(β<1)把误杀权重降低,找到业务可接受的最优切点。
- 灰度与监控:先取5%流量A/B测试,核心指标看支付转化率、客诉率、风控拦截率;上线后每日跑PSI(群体稳定性指标)>0.1即回滚。
答案
我会用“数据分桶→代价敏感→灰度迭代”三步法来设定阈值:
第一步,把近30天成交订单的“下单地址”与“收货地址”做标准化,并用Jaro-Winkler+GeoHash双路相似度打分,得到0-1的连续分布。按每5 pct分桶,观察各桶的刷单标签命中率(已有风控案件为1)与正常用户占比。
第二步,画出ROC曲线,找到Youden Index最大点作为基准阈值,再引入业务代价矩阵:对新客场景,把漏杀权重调高3倍,最终阈值从0.88提升到0.92;对老客场景,误杀代价大,阈值下调到0.85,并允许用户手动纠正一次。
第三步,上线前做7天灰度,核心监控支付转化率下降不超过0.3 pct、客诉率增加不超过万分之二;同时跑每日PSI,一旦地址分布漂移超过0.1立即回滚,并自动触发模型重训。整个流程用Airflow+Kafka实时回写,确保T+1更新阈值。
拓展思考
- 地址相似度只是“节点”特征,建议叠加设备指纹、支付卡BIN、收货手机号归属地做图关联,用GNN发现“同一团伙多地址”模式,可降低对单一阈值的敏感度。
- 对同城小时达业务,用户确实会填写“附近便利店”自提,此时可把500 m球面距离规则升级为“允许POI类型=便利店/菜鸟驿站”白名单,动态放宽阈值到0.8,减少误杀。
- 长期看,把阈值做成个性化:对年度消费≥5万元且0投诉的VIP,直接关闭地址相似度校验;对30天内已触发2次风控的新客,阈值自动收紧到0.95,实现千人千面的风险-体验平衡。