今天也要加油鸭~
所谓巧妇难为无米之炊,“特征工程”就扮演着米的角色。今天总结了特征工程里面涉及到的对数据进行分析并处理,包括异常值处理、缺失值处理、数据分桶、特征处理、特征构造、特征筛选及降维等。
不处理:针对xgboost等树模型,有些模型有处理缺失的机制
缺失太多:删除该列
缺失部分:插值补全(均值/中位数/众数/建模预测/多重插补)、分箱处理(缺失值一个箱)
数值型数据:BOX-COX转换(处理有偏分布),箱线图(box_plot)分析删除异常值或长尾截断等
定义:将多个连续值分组为较少数量的分桶方法。
分箱的数据不一定必须是数字,它们可以是任何类型的值,如“狗”,“猫”,“仓鼠”等。 分箱也用于图像处理,通过将相邻像素组合成单个像素,它可用于减少数据量。
优势:在建立分类模型时,需要对连续变量离散化,特征离散化后,模型会更稳定,降低过拟合。比如对用户年龄离散化,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这一区间中。这两种算法都忽略了实例所属的类型,落在正确区间里的偶然性很大。
(1)数据归一化(MinMaxScaler)
(2)标准化(StandardScaler)
(3)对数变换(log1p)
(4)转换数据类型(astype)
(5)独热编码(OneHotEncoder):类别特征pd.get_dummies
(6)标签编码(LabelEncoder)
(7)修复偏斜特征(boxcox1p)
对于类别中取值个数非常多,一般可以使用聚类(KMeans/层次)的方式,然后独热
特征构造的需要考虑数值特征、类别特征、时间特征;
(1)时间特征的构造(time_data):
车龄:司机的注册时间到现在的日期之差,一般来说,车龄越长,司机越不容易流失;然后可以对司机的车龄进行分箱,1年以下,1-2年,2-3年,3-4年,4年以上
司机平均在线时长,根据司机的上线时间提取早高峰信息
是不是淡旺季
(2)类别特征的构造(cat_data):
从邮编中提取城市信息
兼职司机和全职司机分开
不同车型类别:快车/专车/顺风车
先提取潜在信息再OneHot(不要太早)
(3)数值特征的构造(num_data):
对抢单量、里程进行分箱操作
热点订单比例:因为不同的区域扣车情况不一样,火车站/飞机场扣车比例会大,看时间段内,热点扣车区域的订单量/所有订单量的占比
平均值,总和和标准差
减少特征数量、降维,使模型泛化能力更强,减少过拟合;增强对特征和特征值之间的理解。
特征选择方法:
(1)Filter:过滤法,按照发散性或相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
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回归。
特征选择是从已存在的特征中选取携带信息最多的,选完之后的特征依然具有可解释性,而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_)#属性可查看降维后的每个特征向量所带信息量大小