目录

一、摘要

二、数据探索

三、数据预处理

3.1 缺失值处理

3.2 重复值处理

3.3 异常值处理

四、特征工程

4.1 建立benchmark

4.2 划分训练集和测试集

4.3 订单时间

4.4 支付方式

4.5 城市

4.6 商品类别、商品渠道和订单渠道

4.7 订单金额和销售数量

4.8 用户ID、商品ID、商品品牌

五、使用融合模型进行预测

5.1 特征工程后的数据建模,与benchmark对比

5.2 调整参数,进行优化

5.3 使用Voting法则进行模型融合

一、摘要

此案例数据来源于某500强企业流出的非脱敏数据,2018年首次公开,为该企业2013年部分电商交易数据,数据量级为十万级。本文使用python语言,对该交易数据进行建模,实现对异常订单的检测。将包括数据预处理、特征工程、调参优化、模型融合,涉及算法包括随机森林、GDBT和XGBoost。

二、数据探索

查看样本数和特征数

数据一共包含13W左右样本,特征和标签一共14列。

查看数据整体信息

​​​​​​​

  1. 数据存在少量缺失值
  2. 各个特征中只有订单金额是浮点数类型,整数型特征都是id,几乎不可用
  3. 大多数有效特征都是object类型,存在较大预处理空间
  4. ID类特征原则上应该属于离散值,不能代入数值运算。订单金额虽然是离散型数据,但是可以看作是连续型
字段名 含义
order_id 订单号
order_date 下单日期
order_time 下单时间
cat 商品一级类别
attribution 商品所属渠道
pro_id 商品ID
pro_brand 商品品牌
total_money 订单金额
total_quantity 商品销售数量
order_source 订单渠道
pay_type 支付方式
user_id 用户ID
city 城市
abnormal_label 异常(标签)

标签探索

样本不均衡,但是不均衡程度不算严重。对“异常”的定义尚存在疑问,是退货?刷单?假货?在工作中需要同业务方沟通清楚。

下单日期探索

类别364个,应该是覆盖2013年每一天,数据应该是全年交易数据的抽样。

订单ID探索

  1. 可能数据样本中存在大量重复订单,需要删除
  2. 可能每条数据样本不是订单,而是订单中的一个商品或一笔交易,不能直接删除 。此时的标签可能代表交易异常,而非订单异常。

类别探索

覆盖多种品类,高位为电子类产品。

商品所属渠道探索

POP(Platform Open Plan):平台开放计划,货物来自第三方商家的供应商

GO:推测为自营渠道。

交易中自营渠道占比较高。

订单渠道探索

多种订单渠道,主站流量较高。

支付方式探索

​​​​​​​

城市探索

城市数量多,可能是收货城市也可能是发货城市,收货城市可能性更高。

三、数据预处理

3.1 缺失值处理

缺失值较少,但还需观察信息缺失与标签异常之间的关系。

占比不高,全部删除对异常样本数量影响不大,所以直接删除

 

3.2 重复值处理

之前查看order_id的时候发现其有重复值,现在来具体观察一下

重复最多的订单号有32个,选择这个订单号将对应交易记录调出来看看

  1. 同一个订单号对应的交易,出现了不同日期,同一时间多次下单的情况,且时间精确到秒都相同,显然日期数据出现造假
  2. 出现同样的pro_id,可以猜测为一笔订单中多个同样商品被当成单独的交易进行标记了

再查看一下其他的order_id

 

另一个订单ID也是相似的情况,基本可以判断订单或者交易被复制,再被赋予了不同的日期。现需要查看这些造假数据覆盖了多少异常样本。

查看异常样本中,是否存在order_id和pro_id都相同的情况

  1. 对于异常样本重复order_id中如果没有重复的pro_id,异常样本应该没有伪造,只是日期伪造。
  2. 若异常样本中重复order_id中含有大量重复的pro_id,则异常样本很可能也是伪造的,这份数据不能用于建模。

删除订单日期后,再看有多少重复数据,少则直接删除

合理推测,订单号相同的交易标签都是一致的,接下来对所有异常订单做检查

只有极少数样本在重复订单号的情况下标签不一致,说明一个订单ID下的所有样本的标签几乎是一致的。

3.3 异常值处理

首先应该观察数据的分布,现在数据中只有total_money和total_quantity两个连续型变量

没有小于0的异常值,最大值虽然超过四分之三位数的1.5倍,但考虑到是在电商场景下, 存在合理性。

  1. ​​​所有交易异常样本只有3W多,这7K+样本不能直接删除
  2. 特征的异常与交易的异常应该并没有直接的关系,我们可以按照是否有“特征异常”构成新的特征,计算该特征与标签之间的相关性

特征异常和标签异常几乎没有关系,所以异常值暂不处理。

四、特征工程

4.1 建立benchmark

建立benchmark,之后用于衡量特征工程的效果。

在预处理的时我们对全数据进行了处理,而不是只针对训练集,也没有做避免信息泄漏的特征工程,因此模型效果虚高,但我们可以此作为基准。

4.2 划分训练集和测试集

在数据预处理中我们发现同一订单号的交易标签几乎一致,如果删除order_id可以使用train_test_split。但目前我们想保留order_id这个特征,基于这一点我们在划分训练集和测试集的时候,要注意不要把同一个订单号的交易一部分划分到测试集,另一部分划分到训练集。

4.3 订单时间

进行订单时间和标签异常之间的关系探索

异常交易时间和正常交易时间没有明显区别,下单时间很可能与是否异常没有关系,但我们仍然保留下单时间这个特征,并将其转化为小时和分钟。其中小时按24小时进行编码,分钟按前半小时、后半小时分别编码为0与1。

4.4 支付方式

支付渠道的异常风险评估,可以将每个支付类别的异常率作为新的聚合特征,可以使用聚合特征提升树及集成模型的表现。

通过函数创建聚合特征

然后将支付方式进行编码

4.5 城市

收货城市有多达364个,按这个数量的类别进行风险评估很难看出趋势,我们可以新建“省份”和“省份异常率”两个特征。(可在网上下载省份城市的对应表)

注意检查有没有空值

不同省份之间的异常率差距还是挺大的,使用上述GroupByFeature函数创建“省份异常率”的聚合特征。

接下来对省份和城市进行编码,这个函数和刚才支付方式的编码函数一样,可以不重写

测试集中出现缺失值,说明在映射数据的时候,测试集中出现了字典没有包括的城市,需要手动调整。

4.6 商品类别、商品渠道和订单渠道

如果某一类/某一件商品具有较高的退货、敲诈、纠纷风险,那这一类/一件商品的订单中、异常订单的比例应该很高。如果存在这种商品,我们则可以在特征工程中单独标注高风险商品。同理,对于订单渠道和商品渠道,我们也可以按异常率增加特征。

从上图看出,异常交易比例最高的是钟表首饰、箱包奢品、图书音像,最低的是家纺、母婴用品以及美妆产品,未出现某一品类的异常比例极端的情况将品类异常率作为一个聚合特征,放入我们的特征矩阵。

在手机团购、抢购的冲动消费可能性高的场景下,异常率也更高。

商品所属渠道中,POP店铺的异常率更高,而官方自营店铺的异常率较低。

将商品类别、商品渠道和订单渠道三个特征进行特征编码,编码函数与之前支付方式等编码方式相同,之后的同种编码方式不再单独写函数。

4.7 订单金额和销售数量

在电商交易场景中,一次性下单金额或者下单数量巨大出现异常的可能性更高。现在查看一下异常交易和正常交易的均值。

可以看出异常交易的交易金额均值明显高于正常订单。

异常交易的订单金额均值高、方差也高。对订单金额可以进行分箱,并将每个箱内异常交易的比例进行对比,如果各箱之间差异巨大,则可以根据分箱后的结果创造新特征。

新增两个特征,一个是订单金额分箱,一个是所属分箱中订单金额的均值。

  1. 从分布图可看,一笔交易中下单20个以上商品的多是异常交易,但20个商品以下的交易中,普通交易和异常交易的差异不明显
  2. 普通交易与异常交易中99%都是一次下单5个商品以下的订单,从这个角度来说,很可能“商品销售数量”这个特征对于模型的预测并无帮助
  3. 因此我们对这个特征执行简单的二值化操作,数量大于25的,是高风险,标注为1,反之是低风险,标注为0

​​​​​​​

4.8 用户ID、商品ID、商品品牌

用户ID

  1. 一共有58463个用户ID,下单数为1的用户ID为44119个,占绝大多数
  2. 只下了一单的用户是无法计算异常率的,那么怎么选择下多少单是可以计算异常率呢?对大量数据来说5-6单合适,但现在数据量小,选择2-3单就计算异常率也可
  3. 无法计算异常率的,给异常率赋值-1,以示区别

 商品ID

  1. 处理方式同用户ID, 大部分产品都只卖了5个以下,均值为6更倾向于是大销售量商品拉起来的
  2. 但是为避免部分样本太少,划分成10个以下是交易过少无法判断其异常风险的商品,赋值-1,其他计算异常率

​​​​​​​

大部分商品的异常率都在30%一下,符合正常情况

商品品牌

均值为43,说明大部分品牌在一年当中的销售量比较大,我们可以选择均值、上四分位数、10等数作为划分,大于某数的计算异常率。这里选择的时候销售数量超过10的品牌计算异常率,其余赋-1

我们可以将用户异常率、商品异常率、品牌异常率作为聚合特征放入特征矩阵。对于训练集,不到阀值的部分标为-1,超过的按照异常率标注;对于测试集,检查测试样本ID是否出现在训练集中,出现按照训练集标注,未出现标为-1

将上述过程打包成函数

对这三个特征进行编码

检查测试集有没有空值

特征工程结束,保存特征工程后的训练集数据和测试集数据。

五、使用融合模型进行预测

5.1 特征工程后的数据建模,与benchmark对比

可以看到,比起benchmark的平均准确率81.226%,现在的模型无论是准确率均值还得到了极大的提升。现在我们再观察三个模型的AUC分数如何:

注意:经过交叉验证后必须重新设置类,否则会在原来的基础上继续进行训练

同样,benchmark的平均AUC为82.829%,现在三个模型的AUC分数也得到了大幅提升,方差也变小了,可见特征工程是成功的。我们可以在此基础上继续调参,来观察模型的结果。

5.2 调整参数,进行优化

集成模型默认参数是经过精心设计的,一般来说使用默认参数时,模型就已经达到了某种上限。调参基本是微调,效果可能不明显。但我们仍然尝试从三个方面进行调参,看看能不能提升模型效果。

样本不均衡

对于随机森林,通过调整class_weight观察结果:

对class_weight的调整对AUC起到微弱的作用,当其值为“balanced”时效果最好。

对于XGBoost,通过调整scale_pos_weight观察结果:

随着scale_pos_weight下降,AUC出现下降后上升的变化,0.1时效果最好,可以接着对其进行精细调参。

随着 scale_pos_weight下降,AUC逐步升高,选择0.01作为scale_pos_weight的值。

树的数量

  1. 随机森林和GDBC随着树数量增多,auc值仍在增大。xgb在100达到最好分数
  2. 可以对xgb在50-150进行精密调参,rf和gdbc再尝试增加数量

对于XGBoost,确定num_boost_round为85

  1. 森林结果随着树的数量上升、持续增长中,但1000棵树已经非常非常多了,再增加树的数量会增加太多运算时间和运算成本
  2. 对于GBDT来说,我们可以调整学习率,让树迭代得更快,以此来尝试减少树的数量
  3. 对于森林来说,我们可以从对抗过拟合的角度来考虑,降低每棵树的复杂度,虽然树的数量很多,但是尽量加快建树的速度
  4. 基于这样的结论,GBDT的树数量暂时还是定位200,森林的树数量暂定为1000

学习率

现在得到新的学习率GDBT:0.29444XGB:0.28333,再次调整树的数量 :

对于GDBT,num_round确定为200

对抗过拟合

XGBoost过拟合不严重,可通过调整max_depth抑制过拟合。sklearn中交叉验证不能调出训练集的结果,因此对于随机森林和GDBT无法判断是否处于过拟合,但是从树的数量来说,应该比xgboost更有优化空间。

  1. GDBT和XGB在改变max_depth后都没有取得比之前更好的结果,rf在max_depth较小时结果不好,等于10时达到93%
  2. GDBT可以在默认值3附近精密调参,XGB可以在6附近精密调参,本次不进行
  3. 这两种效果都比rf好的情况下,主要关注rf的调参

确定rf的max_depth参数为13后,再对树的数量进行调参:​​​​​​​

对于随机森林,确定n_estimators为400

5.3 使用Voting法则进行模型融合

调参之后的模型如下:

查看三个模型的AUC分数,以确定投票权重:

可以看出,随机森林的分数最高,GBDT和XGBoost差别不大,可以为随机森林赋更高权重,也可以认为随机森林过拟合可能性更高而赋较小权重,可自己调整。 (我自己选择了rf:gbdt:xgb=4:0.8:0.2 / 1:4:1 / 0.8:0.15:0.05),效果第一种更好。

接下来调整模型阀值找到最佳准确率:

这说明模型的泛化能力通过融合方法已经有了显著的提升。

接下来在测试集上验证:

虽然测试集中分数比训练集还是差了很多,处于过拟合状态,但是在业务场景中可以起到预警的效果了。

基于集成融合模型检测电商异常订单相关推荐

  1. 基于AI大模型的电商商家端自定义报表分析诊断经营数据

    随着电商市场的不断发展和壮大,各个电商平台上的商家需要更加精细化.定制化的数据分析和诊断.但是,目前市面上尚未有一款能够满足商家对于自定义报表的需求的电商数据分析工具,且可视化展示效果也不够灵活.直观 ...

  2. 【项目实战】Python实现基于LDA主题模型进行电商产品评论数据情感分析

    说明:这是一个机器学习.数据挖掘实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 视频: Python实现基于LDA模型进行电商产品评论数据情感分析 ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务...

    我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布...

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录: 一.通过Dapr实现一个简单的 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格...

    多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权...

    Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪

    Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录: 一.通过Dapr实现一个简单的基于.net的微服务电商 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理...

    状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式...

    目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务 ...

最新文章

  1. 写一个不能被继承的类(友元的不可继承性)
  2. 计算机栈是什么,什么是数据栈?——线性表
  3. fun是什么意思 python中def_【python】 numpy中的矩阵转置(ndarray.T)为什么不加括号却可以实现方法的功能...
  4. Android studio gradle task list 不显示问题
  5. delphi 中如果不进行 closehandle 会怎么样_报考八一农大的十一大选择之七|带你走进不一样的“信息世界”...
  6. JPA @Lob 存储大文本 org.postgresql.util.PSQLException: 大型对象无法被使用在自动确认事物交易模式。问题...
  7. php读取大文件某行内容,PHP读取和修改大文件的某行内容_PHP教程
  8. angularjs(显示和隐身) 依赖注入
  9. Vue.directive使用注意
  10. 向量数量积公式_向量的数量积公式大全
  11. Python 中的列表(一)
  12. 白色背景,白色文字怎么显示清晰?
  13. 你在工作中遇到了哪些问题,解决办法是什么
  14. 电脑上编辑文件打字时页面乱跳解决方法
  15. tp5利用redis缓存制作qq邮箱验证
  16. java中unicode编码和utf8编码相互转换
  17. 微信小程序合并单元格
  18. 双麦阵列回音消除模块 F-23设计应用说明
  19. 循环神经网络 - 卷积神经网络
  20. Handle初解,看完你就懂了handle

热门文章

  1. 这两天眉毛一直在跳动,连带着脑袋也开始噗通噗通的,好痛啊!这是什么神经失调了?...
  2. 科尔莫戈罗夫检验(Kolmogorov-Smirnov test)
  3. UVA 716(Commedia dell' arte-三维八数码)
  4. win11安装安卓子系统流程
  5. SQL导入Excel报错:外部表不是预期的格式
  6. jQuery仿京东无限级菜单HoverTree
  7. artifactIdspring-boot-starter-freemarker/artifactId
  8. Java学习之App开发公司手机端设想
  9. 电脑任务栏放在右侧的好处
  10. JSP Cookies处理