- 数据分析
1.1数据结构分析
1.2正负样本标定
1.3缺失值分析
从缺失值分析,把缺失值太大的字段删除,和有些重复字段删除。
1.4数值类型正态分布图分析
根据数据分布趋势,可以预判数据异常值,重复列等等。
1.5变量关系
用热力图查看各变量之间的关系,比较直观看到有一些变量有很强的相关性
1.6离散变量分析
离散变量数不能直接用来建模的,必须通过一定的处理变成数值之后再放进模型,方法有很多。可以直接映射,也有one-hot Encoding, Target Encoding等编码方式。在风控模型中还会常用到分箱的方法赋值。
- 数据预处理
数据预处理大致包括以下三个方面:
- 缺失值处理
- 时间格式处理
- 对象类型特征转换到数值
2.1 缺失值处理
(1)把所有缺失值替换为指定的值0
(2)向用缺失值上面的值替换缺失值
(3)纵向用缺失值下面的值替换缺失值,且设置最多只填充两个连续的缺失值
2.2 时间格式处理
这个数据集一共有两个时间变量,在EDA的时候已经顺便处理了。
2.3 对象类型特征转换到数值
例如 公司经营年限 10年 ,转为数据10.
2.4 类别特征处理
例如信用等级 A、 B 、C 映射为 1、2、3
2.5 异常值处理
异常值的存在很可能会影响模型的最终结果,但是你发现异常值后,一定要先分清是什么原因导致的异常值,然后再考虑如何处理。首先,如果这一异常值并不代表一种规律性的,而是极其偶然的现象,或者说你并不想研究这种偶然的现象,这时可以将其删除。其次,如果异常值存在且代表了一种真实存在的现象,那就不能随便删除。在现有的欺诈场景中很多时候欺诈数据本身相对于正常数据勒说就是异常的,我们要把这些异常点纳入,重新拟合模型,研究其规律。能用监督的用监督模型,不能用的还可以考虑用异常检测的算法来做。
2.5.1 检测异常的方法一:均方差
在统计学中,如果一个数据分布近似正态,那么大约 68% 的数据值会在均值的一个标准差范围内,大约 95% 会在两个标准差范围内,大约 99.7% 会在三个标准差范围内。
2.5.2 检测异常的方法二:箱型图
总结一句话:四分位数会将数据分为三个点和四个区间,IQR = Q3 -Q1,下触须=Q1 − 1.5x IQR,上触须=Q3 + 1.5x IQR;
2.6 数据分箱
2.6.1特征分箱的目的:
从模型效果上来看,特征分箱主要是为了降低变量的复杂性,减少变量噪音对模型的影响,提高自变量和因变量的相关度。从而使模型更加稳定。
数据分桶的对象:
将连续变量离散化
将多状态的离散变量合并成少状态
分箱的原因:
数据的特征内的值跨度可能比较大,对有监督和无监督中如k-均值聚类它使用欧氏距离作为相似度函数来测量数据点之间的相似度。都会造成大吃小的影响,其中一种解决方法是对计数值进行区间量化即数据分桶也叫做数据分箱,然后使用量化后的结果。
分箱的优点:
处理缺失值:当数据源可能存在缺失值,此时可以把null单独作为一个分箱。
处理异常值:当数据中存在离群点时,可以把其通过分箱离散化处理,从而提高变量的鲁棒性(抗干扰能力)。例如,age若出现200这种异常值,可分入“age > 60”这个分箱里,排除影响。
业务解释性:我们习惯于线性判断变量的作用,当x越来越大,y就越来越大。但实际x与y之间经常存在着非线性关系,此时可经过WOE变换。
特别要注意一下分箱的基本原则:
(1)最小分箱占比不低于5%
(2)箱内不能全部是好客户
(3)连续箱单调
2.6.2 分箱方法
1.固定宽度分箱
当数值横跨多个数量级时,最好按照 10 的幂(或任何常数的幂)来进行分组:09、1099、100999、10009999,等等。固定宽度分箱非常容易计算,但如果计数值中有比较大的缺口,就会产生很多没有任何数据的空箱子
2.分位数分箱
3.卡方分箱及其他分箱方法的尝试
2.7 数据编码
编码就是把一些离散的变量变成能够表示特征间关系的的数值放入模型,常用的方法有:
Label Encoding
即类似{A=1,B=2}的映射
One-Hot Encoding
生成稀疏矩阵,比如有A,B,C三类,分别表示为[0,0,1] [0,1,0]和 [1,0,0]
Target Encoding
把target的均值赋给变量,比如:
取值为A时,有三个target是1,一个是0,因此A = 3/4=0.75
同理 B= 2/4 = 0.5
这个方法的缺点是容易过拟合,因此一般会使用交叉验证或者添加噪音的方式去编码,我们这里的编码使用target encoding
2.8 特征衍生
匿名变量里缺失值可能是某种原因造成的,分成以下三类缺失查看正负样本比
- 只有某一列缺失
- 除了第1列 和第10列之外都缺失
- 全部缺失
- 无缺失
2.9 逻辑回归等模型要单独增加的特征工程
对特征做归一化,去除相关性高的特征
归一化目的是让训练过程更好更快的收敛,避免特征大吃小的问题
去除相关性是增加模型的可解释性,加快预测过程。
2.10 特征筛选
特征选择技术可以精简掉无用的特征,以降低最终模型的复杂性,它的最终目的是得到一个简约模型,在不降低预测准确率或对预测准确率影响不大的情况下提高计算速度。特征选择不是为了减少训练时间(实际上,一些技术会增加总体训练时间),而是为了减少模型评分时间。
特征选择的方法:
2.10.1 Filter
基于特征间的关系进行筛选
方差选择法
方差选择法中,先要计算各个特征的方差,然后根据设定的阈值,选择方差大于阈值的特征。
Pearson 相关系数
皮尔森相关系数是一种最简单的,可以帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性。
结果的取值区间为 [-1,1] , -1 表示完全的负相关, +1表示完全的正相关,0 表示没有线性相关。
卡方检验
经典的卡方检验是用于检验自变量对因变量的相关性。 假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距。 其统计量如下: χ2=∑(A−T)2T,其中A为实际值,T为理论值。
互信息法
经典的互信息也是评价自变量对因变量的相关性的。 在feature_selection库的SelectKBest类结合最大信息系数法可以用于选择特征。
2.10.2 Wrapper (Recursive feature elimination,RFE)
递归特征消除法 递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。 在feature_selection库的RFE类可以用于选择特征。
2.10.3 Embedded
基于惩罚项的特征选择法 使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。 在feature_selection库的SelectFromModel类结合逻辑回归模型可以用于选择特征。
基于树模型的特征选择 树模型中GBDT也可用来作为基模型进行特征选择。 在feature_selection库的SelectFromModel类结合GBDT模型可以用于选择特征,相关代码如下:
3、特征工程
特征筛选是机器学习里面比较重要的一个环节,特征工程大致包括以下步骤:
- 数据预处理
- 异常值处理
- 数据分箱
- 特征衍生
- 数据编码
- 特征选择
4 建模及调参
4.1构建基础模型
构建分类的基础模型,使用Gradient Boosting Classifier 、XGBoost、LightGBM作为基础模型
4.2 Simplest Stacking approach : Averaging base models
使用基本模型的预测值,进行投票决定最终预测结果。
4.3 Less simple Stacking : Adding a Meta-model
使用base model预测结果,并把预测结果作为meta model的输入
4.1构建基础模型
5 模型融合
常见的模型融合是指将多个不同的 Base Model 组合成一个 Ensemble Model 的方法。它可以同时降低最终模型的 Bias 和 Variance,从而在提高分数的同时又降低 Overfitting 的风险。
5.1、常见的ensemble算法
Bagging:使用训练数据的不同随机子集来训练每个 Base Model,最后进行每个 Base Model 权重相同的 Vote。也即 Random Forest 的原理。
Boosting:迭代地训练 Base Model,每次根据上一个迭代中预测错误的情况修改训练样本的权重。也即 Gradient Boosting,Adaboost 的原理。比 Bagging 效果好,但更容易 Overfit。
Bagging,Boosting二者之间的区别
(1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
(2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
(3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
(4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
Blending:用不相交的数据训练不同的 Base Model,将它们的输出取(加权)平均。实现简单,但对训练数据利用少了。
Stacking:接下来会详细介绍。
stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。stacking的方法在各大数据挖掘比赛上都很风靡,模型融合之后能够小幅度的提高模型的预测准确度。
2、stacking的含义
stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为特征加入训练集进行再训练,从而得到完整的stacking模型。stacking的方法在各大数据挖掘比赛上都很风靡,模型融合之后能够小幅度的提高模型的预测准确度。
5.2、stacking的详细过程
假设Training data有10000行,test data有2000行,stacking的步骤如下:
对测试集的处理:
(1)将全部数据划分成training set 和test set,training set采用五折交叉验证,划分成5份数据;
(2)对每一折数据使用base model 五分之四的数据训练,五分之一的数据预测,记为a1,a2,a3,a4,a5,最终得到5列2000行的预测值;
(3)拼接上面5列数据,得到1列当前base model的预测,值(10000行);(a1,a2,a3,a4,a5)的转置
(4)假如有10个base model,就会得到10列10000行的预测值;
(5) 最后使用一个模型来训练这10列数据(把这10预测值当作训练数据);
对训练集的处理有两种方法,
一种是上一步训练完成后,一次性预测Test data的;
另一种方法是,对于每个base model每折训练完后,就对test data进行预测,得到b1,1个base model就会有5次的预测值,最终有b1,b2,b3,b4,b5,对这5列2000行的数据取平均值,得到1列数据。10个base model就有10列数据,用上一步最后训练的模型来对10列数据做预测,得到1列预测值
6 调参
6.1 调参
最终调整参数为
- 模型测试结果
7.1测试结果
RandomForestClassifier+xgboost |
AUC 测试0.8898 |
xgboost+toad |
AUC 测试0.721 |
catboost+5KFold+500iterations |
AUC 测试0.8130 |
最后测试结果,得分为0.8898
7.2 XGBoost输出特征重要性以及筛选特征
7.2.1每个属性的重要性得分
使用梯度提升算法的好处是在提升树被创建后,可以相对直接地得到每个属性的重要性得分。一般来说,重要性分数,衡量了特征在模型中的提升决策树构建中的价值。一个属性越多的被用来在模型中构建决策树,它的重要性就相对越高。
属性重要性是通过对数据集中的每个属性进行计算,并进行排序得到。在单个决策树中通过每个属性分裂点改进性能度量的量来计算属性重要性。由节点负责加权和记录次数,也就是说一个属性对分裂点改进性能度量越大(越靠近根节点),权值越大;被越多提升树所选择,属性越重要。性能度量可以是选择分裂节点的Gini纯度,也可以是其他度量函数。
最终将一个属性在所有提升树中的结果进行加权求和后然后平均,得到重要性得分。
7.2.2绘制特征重要性
importance |
影响分值 |
cc_Import_VAT__y |
69999.8 |
cc_Import_tariffs__y |
67214.2 |
cc_Gross_weight |
66542.8 |
cc_The_net_weight |
60675.2 |
cc_The_unit_price |
46916.2 |
cc_The_total_price |
40638.6 |
cc_The_tax_amount |
33007 |
cc_Import_VAT__x |
32061.2 |
cc_Declaration_date_dag |
25798.2 |
cc_Method_a_number |
25634.4 |
cc_The_date_of_import_and_export_dag |
23795 |
cc_The_date_of_import_and_export_month |
20719.2 |
cc_Declaration_date_month |
20451.8 |
cc_number |
19399 |
cc_The_exchange_rate |
14446.8 |
cc_Inbound_and_outbound_don't_coding |
14095 |
cc_Port_of_entry_code |
9488 |
cc_Declare_to_the_customs_code |
8816.6 |
cc_A_special_relationship_to_confirm |
4325.2 |
cc_The_date_of_import_and_export_year |
1949.2 |
cc_Declaration_date_year |
1302.4 |
cc_Prices_confirmed |
857.4 |
cc_Royalty_payment_confirmation |
604 |
cc_The_AD_valorem_tax_rate, |
523.6 |
cc_The_code_shall_be_way |
519.8 |
7.3测试数据集混淆矩阵
7.4训练数据集混淆矩阵
- 思维导图