【机器学习】特征工程步骤——以二分类问题为例

1、数据的探索分析EDA
数据的探索分析EDA,是对数据进行初步的统计分析,统计数据的分布、异常、相互关系,目标是让我们了解这些数据能告诉我们什么。可以用来指导我们进行模型的选择,比如说帮助我们初步的决定哪些特征需要被使用,哪些特征需要被剔除。

准备好样本、特征、label
查看样本集中样本总个数、特征总个数
查看正负样本个数,如果正负样本相差不多,则属于样本均衡的建模问题,如果其中一类明显高于另外一类,则属于样本不均衡的建模问题
查看一下每个特征的类型:离散型、连续型。按照不同的类型进行分组,分别进行处理
按照上面的分组,进行单个特征评估

1.1、单个特征评估
分析过程按照以下顺序依次进行,没有出现的情况就跳过
分析方法是推荐使用,如有其他方式达到相同效果也可行
分析工具自由选择

1.1.1 连续型特征
1、查看变量的缺失值(missing value,空值)个数以及所占比例

1)剔除掉缺失率>80%并且未来依然会高缺失的变量
2)如果“缺失”包含了业务含义,保留该变量,并且直接将缺失值填充为区别于其他正常值的默认值,比如-1。
3)如果“缺失”没有业务含义:
    a)连续型变量:偏正态分布,用均值填充,可以保持数据的均值;偏长尾分布,使用中值填充,避免受异常值的影响。
      编程上可以用sklearn.preprocessing中的Imputer实现;
    b)若缺失量比较大,不适合使用平均值填补。一般通过使用其它变量预测或者直接将缺失值设置为默认值的方法填补;

2、画概率密度图,查看样本在该特征值上的分布

根据连续变量的值域范围,将该变量分成10箱,就是分成10段,箱数可自由选择;
统计每一箱内样本的占比:该箱内样本个数/总样本个数,这就是概率密度。然后将每一箱的概率密度画出来:

1)X轴:分箱区间
2)Y轴:概率密度:落在该分箱内的样本个数 / 总样本个数
3)编程可以用seaborn. distplot(kde=True)实现。
4)可以看出:样本在该特征值上的分布:大部分样本集中在哪个范围内?
5)上图中是两组样本集,一种颜色代表一组,画在同一个图里面,可以看出两组样本【在特征分布上】有哪些不同

3、画“好坏样本比”曲线

根据连续变量的值域范围,将该变量分成10箱,就是分成10段,箱数可自由选择;
统计每一箱内的两类样本的比值:该箱内label=1的样本个数 / 该箱内label=0的样本个数;
可以看出该特征对两类样本的区分度。
问题:在实际画图的时候,会出现一个问题,当分母=0的时候,该比值会无穷大,画不出来;
解决办法:找到该样本集中总体占比多的那一类,比说label=1的样本多,那么统计每一箱内label=1样本个数 / 该箱内总样本个数,效果也是一样的,因为就只有两类。

1)X轴:分箱区间
2)Y轴:两类样本比:该箱内label=1的样本个数 / 该箱内label=0的样本个数
3)比较纵坐标的值,跌宕起伏很陡峭的话,说明该特征对两类样本有一定区分度;如果是一条接近水平的直线,则说明该特征对于两类样本没有区分能力。
   也就是各箱之间的【差值】越大,该特征区分能力就越好。
4)上图中是两组样本集,一种颜色代表一组,画在同一个图里面,可以看出两组样本【在特征的区分度上】有哪些不同,这在比较样本构成的时候会用到。
   从上图可以看出:橘色的样本集中,label=0的样本在每一箱内的占比,明显比蓝色的样本集少,也就是橘色每一箱内label=1的样本占比多;
   在该特征的区分度上也有一点差别,看倒数第二、三个分箱,蓝色的差值更大,说明该特征在该样本集上的这两个区间内的区分力比橘色的大

4、极端值分析

1)在上一步画图的时候,就可以看出来有哪些极端值
2)除非是计算或者人为错误,极端值需要从业务层面进行分析
    a)    分别计算“拥有极端值的那些样本中,label=1样本的占比R1” 和“拥有非极端值的那些样本中,label=1样本的占比R2”
    b)    如果R1明显大于R2,则说明极端值有业务意义,建议保留,特别是从反欺诈的角度来分析一下
3)如果是计算或者人为错误,极端值的影响可以通过分箱被中和,对模型训练没有影响;
   也可以将极端值设置成缺失值/空值,然后用处理缺失值的方法进行处理

5、计算变量的方差

如果方差接近于0,也就是该特征的特征值之间基本上没有差异,这个特征对于样本的区分并没有什么用,剔除
1
6、查看变量与label之间的相关性

皮尔逊系数/斯皮尔曼系数:衡量2个变量之间的线性相关性。
.00-.19 “very weak”
.20-.39 “weak”
.40-.59 “moderate”
.60-.79 “strong”
.80-1.0 “very strong”

结合上面几步,综合来决定,该特征对于样本的区分有没有作用。
7、查看变量之间的相关性

1)目的:去除冗余变量,并结合业务含义取舍
2)皮尔逊系数/斯皮尔曼系数:衡量2个变量之间的线性相关性。
3)如果>0.8,说明2个变量有明显线性关系,只保留一个,保留与label的皮尔逊系数较大的那个变量
  或者保留lightgbm AUC最大的那个;

8、计算变量IV值(也可以考虑Gini系数)

目的:筛选变量,IV值低的变量根据业务分析决定是否剔除,一般<0.02的变量可剔除
<0.02 unpredictive
0.02 – 0.1 weak (maybe acceptable)
– 0.3 medium
>0.3 strong

9、    计算AUC

计算单变量的AUC:该变量经过lightgbm之后的AUC,AUC>0.53可以考虑留下
1
10、    计算importance

将上面步骤筛选出来的特征,全部输送到lightgbm算法中训练,得到每一个特征的importance,过滤掉importance=0的变量。
1
11、其他考虑因素

以上所有特征工程的步骤,都要跟业务结合在一起,综合考虑,衡量一个变量采用与否。

1.1.2    离散型特征
1、查看变量的缺失值(missing value,空值)个数以及所占比例

1)剔除掉缺失率>80%并且未来依然会高缺失的变量
2)如果“缺失”包含了业务含义,保留该变量,并且直接将缺失值填充为默认值。
3)如果“缺失”没有业务含义
    a)离散型变量,用众数填充;
    b)若缺失量比较大,不适合使用中位数或者平均值填补。一般通过使用其它变量预测或者直接将缺失值设置为默认值的方法填补;

2、对离散特征的值进行编码
由于离散值有数值型、字符型等,其中字符型没有办法直接入模计算,所以要对其进行编码,全部变成数值型, 将定性数据编码为定量数据

1)Label encoding  
   将变量中的每个unique value指定为一个整数,编程上可以用sklearn中的LabelEncoder实现。
2)One-hot encoding  
   将一个变量变成多个变量,例如有4个样本,原特征及特征值是{“户籍省“:[“北京”,”上海”,”福建”,”四川”]},
   {“四川”:[0,0,0,1]}。编程上可以用pd.get_dummies(df)或者sklearn.preprocessing中的OneHotEncoder实现。

3、    画概率密度图,查看样本在该特征值上的分布

对该特征进行分箱,由于是离散变量,值比较少,所以该特征的每一个值就是一箱;
统计每一箱内样本的占比:该箱内样本个数/总样本个数,这就是概率密度。然后将每一箱的概率密度画出来:

1)X轴:分箱区间
2)Y轴:概率密度:落在该分箱内的样本个数 / 总样本个数
3)编程可以用seaborn. distplot(kde=True)实现。
4)上图中是两组样本集,一种颜色代表一组,画在同一个图里面,可以看出两组样本【在特征分布上】有哪些不同
5)可以看出
    a)该离散特征unique value的个数以及具体数值
    b)异常值/极端值
    c)样本在该特征值上的分布:大部分样本集中在哪个范围内?

4、    画“好坏样本比”图

对该特征进行分箱,由于是离散变量,值比较少,所以该特征的每一个值就是一箱;
统计每一箱内的两类样本的比值:该箱内label=1的样本个数 / 该箱内label=0的样本个数;
可以看出该特征对两类样本的区分度。
问题:在实际画图的时候,会出现一个问题,当分母=0的时候,该比值会无穷大,画不出来;
解决办法:找到该样本集中总体占比多的那一类,比说label=1的样本多,那么统计每一箱内label=1样本个数 / 该箱内总样本个数,效果也是一样的,因为就只有两类。

1)X轴:分箱区间
2)Y轴:两类样本占比:该箱内label=1的样本个数 / 该箱内label=0的样本个数
3)比较纵坐标的值,跌宕起伏很陡峭的话,说明该特征对两类样本有一定区分度;如果是一条接近水平的直线,则说明该特征对于两类样本没有区分能力。
   也就是各箱之间的【差值】越大,该特征区分能力就越好。
4)上图中是两组样本集,一种颜色代表一组,画在同一个图里面,可以看出两组样本【在特征的区分度上】有哪些不同,这在比较样本构成的时候会用到。
   从上图可以看出:橘色的样本集中,label=0的样本在每一箱内的占比,明显比蓝色的样本集少,也就是橘色每一箱内label=1的样本占比多;
   在该特征的区分度上也有一点差别,看倒数第二、三个分箱,蓝色的差值更大,说明该特征在该样本集上的这两个区间内的区分力比橘色的大

5、    其他评估方法,类似连续特征处理方式

2、特征衍生
以上特征评估方法,都是在原有特征的基础上,进行分析、筛选,并没有生成新的特征,下面来介绍特征工程的另一重头戏:利用已有特征,衍生出新的特征

2.1 Polynomial features(多项式特征)
我们在进行分类和回归预测的时候,有时需要根据已有的特征构建更多的特征,然后对特征再进行特征选择。实验发现,通过增加一些输入数据的非线性特征来增加模型的复杂度,这种做法通常是有效的。一个简单通用的办法是使用多项式特征,可以获得特征的更高维度和互相间关系的项。
多项式特征,是一个简单的特征构造方法,该方法是根据已有的特征产生新的特征,可以通过sklearn.preprocessing 中的PolynomialFeatures 实现。这些由多个单独变量组合而成的特征称为交互项。换句话说,虽然两个变量本身对目标的影响不大,但将它们组合成一个单独的交互变量可能会显示出与目标的强关系。

举一个例子:
1)原特征是(X_1, X_2),计算原特征与label的pearson线性相关系数;
2)用PolynomialFeatures(degree=2)构造多项式特征,构造出来的新特征就是(1, X_1, X_2, X_1^2, X_1X_2, X_2^2);
3)再计算这些新特征与label的pearson线性相关系数,查看是否有提高;
4)如果有,可以考虑将这些新生成的多项式特征合并到原特征里;
5)为了查看这些多项式特征有无效果,需要进行对比实验
    a)    用原特征训练模型,记录AUC
    b)    加入多项式特征之后,再训练模型,记录AUC
    c)    查看后者AUC是否较前者AUC有提高,如果有,说明多项式特征起了作用。
--------------------- 
作者:lanyuelvyun 
来源:CSDN 
原文:https://blog.csdn.net/lanyuelvyun/article/details/82151767 
版权声明:本文为博主原创文章,转载请附上博文链接!

发布了392 篇原创文章 · 获赞 487 · 访问量 239万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览