近期总是无脑地做一些天池的比赛,工具的使用虽说用时查阅一样方便,但是还是想陆续归纳总结一些东西,毕竟自己也算是新手,还是需要积累和沉淀。先总结一下基础的python包中关于特征工程的工具吧。
1 特征工程
刚开始做比赛时也是边做边学,最初以为模型才是决定成绩的关键,总是一股脑地看一些模型的推导,试图从底层理解模型的运转,但是在做完天池智慧交通比赛后,与决赛失之交臂,赛后观看top5的答辩视频时才慢慢感觉到,大家模型无外乎xgb,LGBM或是一些神经网络的模型,而唯一决定最后几个千分位的差距在于特征有没有选好。我也将各种模型使用遍了,甚至搬上了LSTM来做时序预测,最后还融合了多个模型,但还是没能进决赛。真正印证了那句最经典的话:特征决定模型上限。
那么究竟特征工程是什么?
说的暴力一些,就是从原有数据中挖掘出更能够表达数据集特点和分布的新数据出来,让模型能够更好地认识你的数据从而给出更加精确的预测。
有人说magic feature是靠想象力,不可否认的确在kaggle中很多牛x的特征真的让人脑洞大开。但是对于最基础的特征工程,也就是最初需要探索的新特征的提取方法却是有章可循的。下面主要归纳一下sklearn中好用的特征处理的工具。
2 数据预处理
目的:将原始数据转换为模型更容易识别的形式。
2.1 常见问题
对于原始数据,常见的一些需要我们在这一步中重点处理的问题有:
1、量纲不同。sklearn.preprocessing 库中提供了相应的工具可以使用。
2、数据残缺。可以使用最基本的均值等统计值填补,或是使用一些较为复杂的填补方法,例如你的数据是时空数据,那么可以考虑时序和空间两个维度对数据进行填补,看到过比较有名的是微软亚洲研究院郑宇老师的一篇城市计算方面的论文,就是针对时空数据的缺失提出了一套方案。
3、数据信息冗余。也就是我们仅仅关心数据的一方面或是宏观的层面,对于细分的数据我们需要想方设法提升到宏观大方面去看待。例如我们关心词语表达情感是消极还是积极,因此可以将很多词进行二分类后以0和1来表示即可。
4、类别特征无法直接使用。大多模型只接受数值型特征,因此,对于类别描述性的特征,我们需要将其进行转换。
5、信息利用率低。单一的变量无法造成对因变量较大的影响,但是这维变量若十分重要,那么需要对其进行相应处理(哑变量或是多项式转换等),使其所表达的信息更大。
2.2 无量纲化
无量纲化是针对特征的列进行处理。常见的无量纲化方法有标准化和区间缩放法。
标准化的前提是 特征值服从正态分布,标准化后,其转换成标准正态分布。
区间缩放法是利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0, 1]等。
1、标准化
标准化的计算方法就是(原始值-均值)/标准差,在sklearn中的使用方法如下:
from sklearn.preprocessing import StandardScaler
#标准化,返回值为标准化后的数据
StandardScaler().fit_transform(data)
注:以下所使用的data.data全为np.array,并非dataframe
2、区间缩放
(原始值-最小值)/(最大值-最小值)
from sklearn.preprocessing import MinMaxScaler
#区间缩放,返回值为缩放到[0, 1]区间的数据
MinMaxScaler().fit_transform(data.data)
3、正则化
正则化是针对特征的行进行处理,正则化的前提是样本各特征值服从正态分布,正则化后将其转换成标准正态分布。正则化的公式类似于标准化,不同的是样本均值和样本标准差改为特征值均值和特征值标准差。
from sklearn.preprocessing import Normalizer
#正则化,返回值为正则化后的数据
Normalizer().fit_transform(data.data)
2.3 信息冗余--二值化处理
数值型特征二值化的核心在于设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0。
from sklearn.preprocessing import Binarizer
#二值化,阈值设置为3,返回值为二值化后的数据
Binarizer(threshold=3).fit_transform(data.data)
2.4 类别特征做onehot
数据集中的类别特征需要做数据化处理方可放入模型,此时可使用onehot编码。
from sklearn.preprocessing import OneHotEncoder
#哑编码,对数据集的目标值,返回值为哑编码后的数据
OneHotEncoder().fit_transform(data.target.reshape((-1,1)))
##其中reshape中-1是指行数未知,1表示最终生成一列。
2.5 缺失值填充
如果在数据集中存在缺失值,一般默认用NaN表示,这个时候可以使用Imputer类对缺失值进行填充。
from numpy import vstack, array, nan
from sklearn.preprocessing import Imputer
#缺失值计算,返回值为计算缺失值后的数据
#参数missing_value为缺失值的表示形式,默认为NaN
#参数strategy为缺失值填充方式,默认为mean(均值)
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), data.data)))
##因为是实验代码,所以我们这里使用vstack对原始data添加一行nan。
stack、hstack、vstack的用法参考这里
2.6 数据变换
常用的方法有多项式变换、取对数、取指数等。
1、多项式变换就是将原有的几维特征进行规定度数的乘法转换。例如现有4维特征,那么度为2的多项式转换:

from sklearn.preprocessing import PolynomialFeatures
#多项式转换
#参数degree为度,默认值为2
PolynomialFeatures().fit_transform(data.data)
某些情况下,我们只需要用到交叉项,则可以设置interaction_only=True来保留。
2、函数转换
例如log变换:
from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
#自定义转换函数为对数函数的数据变换
#第一个参数是单变元函数
FunctionTransformer(log1p).fit_transform(data.data)
网友评论