机器学习那些事儿之特征工程 - Blog2

今天也要加油鸭~

  • 这是一份总结的学习笔记
  • 路漫漫其修远兮,吾将上下而求索
  • 可阅读可评论可分享可转载,希望向优秀的人学习

特征工程

所谓巧妇难为无米之炊,“特征工程”就扮演着米的角色。今天总结了特征工程里面涉及到的对数据进行分析并处理,包括异常值处理、缺失值处理、数据分桶、特征处理、特征构造、特征筛选及降维等。

1、缺失值处理

不处理:针对xgboost等树模型,有些模型有处理缺失的机制
缺失太多:删除该列
缺失部分:插值补全(均值/中位数/众数/建模预测/多重插补)、分箱处理(缺失值一个箱)

2、异常值处理

数值型数据:BOX-COX转换(处理有偏分布),箱线图(box_plot)分析删除异常值或长尾截断等
机器学习那些事儿之特征工程 - Blog2_第1张图片

3、数据分桶

定义:将多个连续值分组为较少数量的分桶方法。

分箱的数据不一定必须是数字,它们可以是任何类型的值,如“狗”,“猫”,“仓鼠”等。 分箱也用于图像处理,通过将相邻像素组合成单个像素,它可用于减少数据量。

优势:在建立分类模型时,需要对连续变量离散化,特征离散化后,模型会更稳定,降低过拟合。比如对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;

方法:

  • 有监督分箱
    (1)卡方分箱
    自底向上的(即基于合并的)数据离散化方法。它依赖于卡方检验:具有最小卡方值的相邻区间合并在一起,直到满足确定的停止准则。
    基本思想:
    对于精确的离散化,相对类频率在一个区间内应当完全一致。因此,如果两个相邻的区间具有非常类似的类分布,则这两个区间可以合并;否则,它们应当保持分开。而低卡方值表明它们具有相似的类分布。
    这里需要注意初始化时需要对实例进行排序,在排序的基础上进行合并。
    卡方阈值的确定:
    根据显著性水平和自由度得到卡方值自由度比类别数量小1。例如:有3类,自由度为2,则90%置信度(10%显著性水平)下,卡方的值为4.6。
    阈值的意义:
    类别和属性独立时,有90%的可能性,计算得到的卡方值会小于4.6。 大于阈值4.6的卡方值就说明属性和类不是相互独立的,不能合并。如果阈值选的大,区间合并就会进行很多次,离散后的区间数量少、区间大。
    注:
    1、ChiMerge算法推荐使用0.90、0.95、0.99置信度,最大区间数取10到15之间.
    2、也可以不考虑卡方阈值,此时可以考虑最小区间数或者最大区间数。指定区间数量的上限和下限,最多几个区间,最少几个区间。
    3、对于类别型变量,需要分箱时需要按照某种方式进行排序
    (2)最小熵法分箱

    Best-KS分桶(类似于利用基尼系数进行二分类)

  • 无监督分箱

    (1)等距分箱
    从最小值到最大值之间,均分为 N 等份, 这样, 如果 A,B 为最小最大值, 则每个区间的长度为 W=(B−A)/N , 则区间边界值为A+W,A+2W,….A+(N−1)W 。这里只考虑边界,每个等份里面的实例数量可能不等。

    (2)等频分箱
    区间的边界值要经过选择,使得每个区间包含大致相等的实例数量。比如说 N=10 ,每个区间应该包含大约10%的实例。
    以上两种算法的弊端:比如,等宽区间划分,划分为5区间,最高工资为50000,则所有工资低于10000的人都被划分到同一区间。等频区间可能正好相反,所有工资高于50000的人都会被划分到50000这一区间中。这两种算法都忽略了实例所属的类型,落在正确区间里的偶然性很大。

4、数据转换

(1)数据归一化(MinMaxScaler)
(2)标准化(StandardScaler)
(3)对数变换(log1p)
(4)转换数据类型(astype)
(5)独热编码(OneHotEncoder):类别特征pd.get_dummies
(6)标签编码(LabelEncoder)
(7)修复偏斜特征(boxcox1p)
对于类别中取值个数非常多,一般可以使用聚类(KMeans/层次)的方式,然后独热

5、特征构造

特征构造的需要考虑数值特征、类别特征、时间特征

  • 数值特征:特征加减组合或者提取一些统计特征(count/avg/max/median/sum/std)
  • 类别特征:特征之间的交叉组合,或embedding
  • 时间特征:在时间序列预测中非常重要,尽可能挖掘时间信息

(1)时间特征的构造(time_data)
车龄:司机的注册时间到现在的日期之差,一般来说,车龄越长,司机越不容易流失;然后可以对司机的车龄进行分箱,1年以下,1-2年,2-3年,3-4年,4年以上
司机平均在线时长,根据司机的上线时间提取早高峰信息
是不是淡旺季

(2)类别特征的构造(cat_data)
从邮编中提取城市信息
兼职司机和全职司机分开
不同车型类别:快车/专车/顺风车
先提取潜在信息再OneHot(不要太早)

(3)数值特征的构造(num_data):
对抢单量、里程进行分箱操作
热点订单比例:因为不同的区域扣车情况不一样,火车站/飞机场扣车比例会大,看时间段内,热点扣车区域的订单量/所有订单量的占比
平均值,总和和标准差

6、特征选择

减少特征数量、降维,使模型泛化能力更强,减少过拟合;增强对特征和特征值之间的理解。

  • 特征是否发散:如一个特征不发散,例如方差接近0,也就是样本在这个特征上没有差异,这个特征对于样本的区别也就没有什么用
  • 特征与目标的相关性:与目标相关性高的特征,应当优先选择

特征选择方法:
(1)Filter:过滤法,按照发散性或相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。

  • 主要思想:对每一位特征“打分”,即给每一维的特征赋予权重,权重就代表这特征的重要性,然后根据权重排序。先进行特征选择,然后在训练学习器,所以特征选择的过程与学习器无关。相当于先对特征进行过滤操作,然后用特征子集来训练分类器。
  • 主要方法:
    1、移除降低方差的特征;
    2、相关系数排序,分别计算特征与输出值之间的相关系数,设定一个阈值,选择相关系数大于阈值的部分特征;
    3、利用假设检验得到特征与输出值之间的相关性,方法有比如卡方检验、t检验、F检验等;
    4、互信息,利用互信息从信息熵的角度分析相关性。
    注意
  • 去掉取值变化小的特征:对于数值型特征,方差很小的特征可以不要,如某特征值只有0和1,95%的实例取值都是1,则可认为特征作用不大。当特征值都是离散型变量才能用(连续值变量需要离散化)。也可作为特征选择的预处理,去掉取值变化小的特征,再特征选择;data.std().sort_values() (data去掉了独热的特征)
  • 单变量特征选择:能够对每个特征进行测试,衡量特征和响应变量之间的关系,根据得分去掉不好的特征。对于回归和分类问题可采用卡方检验等方式对特征进行测试。Pearson相关系数,衡量变量之间的线性相关性,结果的取值区间是[-1,1],-1代表完全的负相关(这个变量下降,那个就会上升),+1代表完全正相关,0表示没有线性关系。(Scipy的pearsonr可同时计算相关系数和p-value/pandas的corr);

Pearson相关系数:连续数据,正态分布,线性关系;缺点是作为特征排序机制,只对线性关系敏感,如果关系是非线性,即使两变量具有一一对应相关性,pearson相关性也可能接近为0。
Spearman系数:不符合上面条件或排序后的变量的pearson的相关系数,场景:两个定序测量数据(顺序变量)之间;
热力图:ax.subplot() sns.heatmap(corr,annot=True) 根据特征的线性相关性,可以考虑正负相关0.6以上的特征,相关性为1就删除掉一个。

(2) Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
特征选择是基于机器学习模型的方法,有些机器学习方法本身就具有对特征进行打分的机制,或者很容易将其运用到特征选择任务中,例如回归模型,SVM,决策树,随机森林等;

  • 主要思想:从初始特征集合中不断选择特征子集,训练学习器,根据学习器的性能对子集进行评价,直到选出最佳的子集。包裹式特征选择直接针对给定学习器进行优化。
  • 主要方法:递归特征消除算法,基于机器学习模型的特征排序
  • 优缺点:从最终学习器性能来看,包裹式比过滤式更好;但多次训练学习器开销大;
    对于特征和响应变量关系是非线性的,可以使用基于树的方法(决策树、随机森林)或者扩展的线性模型等;如随机森林。
#例子:xgboost
from xgboost import XGBRegressor
from xgboost import plot_importance
xgb = XGBRegressor()
xgb.fit(X, Y)
plt.figure(figsize=(20, 10))
plot_importance(xgb)
Plt.show()

还可以把两种方式封装起来,画出边际效应
这样,根据使用的模型,可对特征进行选择,综合以上方式,可保留和删除的特征就选出来了,该删就删。

(3) Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从小到大选择特哼。类似与Filter方法,但是同构训练来确定特征的优势。
在学习器训练过程中自动进行特征选择。嵌入式选择最常用是L1正则和L2正则。在对线性回归模型加入两种正则化方法后,分别变成了岭回归和Lasso回归。

  • 主要思想:在模型既定的情况下学习出对提高模型准确率最好的特征。
  • 主要方法:岭回归就是线性回归过程加入了L2正则项。
    L1正则化有助于生成一个稀疏权值矩阵,可用于特征选择
    L2正则在拟合过程中倾向让权值尽可能小,最后构造一个所有参数都比较小的模型(参数足够小,数据偏移,结果影响小,抗扰动能力强)

7、PCA降维技术

特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,而PCA将已存在的特征压缩,降维完毕后不是原来特征的任何一个。
#保留10维
From sklearn.decomposition import PCA
pca = PCA(n_components = 10)
X_new = pca.fit_transform(X)
Print(X_new.shape)
Print(pca.explain_variance_)#属性可查看降维后的每个特征向量所带信息量大小

你可能感兴趣的:(机器学习,机器学习,人工智能,数据分析)