机器学习特征处理(特征工程)

特征工程是什么?
有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。
好数据>多数据>好算法
其中数据特征工程概括图如下
机器学习特征处理(特征工程)
文章图片
1、数据的量纲化
无量纲化使不同规格的数据转换到同一规格。常用的无量纲化方法有标准化和区间缩放法。标准化的前提是特征值服从正态分布,标准化后,其转换成标准正态分布;区间缩放法利用了边界值信息,将特征的取值区间缩放到某个特点的范围,例如[0,1]等。
1)标准化
机器学习特征处理(特征工程)
文章图片

【机器学习特征处理(特征工程)】2)区间缩放法
机器学习特征处理(特征工程)
文章图片

3)标准化与归一化的区别
简单来说,标准化是依照特征矩阵的列处理数据,其通过z-score(均值0,标准差1)的方法,将样本的特征值转换到同一量纲下;归一化是依照特征矩阵的行处理数据,其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准,也就是说都转化为“单位向量”。规则为l2的归一化公式如下:
机器学习特征处理(特征工程)
文章图片

4)对定量特征二值化
定量特征的二值化的核心在于设定一个阈值,小于等于阈值的赋值为0,大于阈值的赋值为1,公式表达如下:Binarizer
5) 对定性特征哑编码OneHotEncoder
2、数据变换
常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的
PolynomialFeatures:
基于单变元函数的数据变换可以使用一个同一的方式完成,使用preprocessing库的FunctionTransformer对数据进行对数函数转换的代码如下:
from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
FunctionTransformer(log1p).fit_transform(iris.data)
3、特征选择
特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用;
特征与目标的相关性:这点比较显见,与目标相关性高的特征应当优先选择。
根据特征选择的形式又可以将特征选择方法分为3种:
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者选择阈值的个数,选择特征;以下几种方法可以归纳为:
Filter
1)方差选择法:(使用方差选择法,先要计算各个特征的方差,选择方差大于阈值的特征。)
使用feature_selection库的VarianceThreshold
2)相关系数法(使用相关系数法,先要计算各个特征对目标值的相关系数的P值)
用feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:
3)卡方检验:经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:
feature_selection库的SelectionKBest类结合卡方检验来选择特征的代码如下:
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
SelectKBest(chi2,k=2).fit_transform(iris.data,iris.target)
4)互信息法:经典的互信息也是评价定性自变量对定性因变量的相关性的
使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:
from sklearn.feature_selection import SelectKBest
from minepy import MINE
def mic(x,y):
m = MINE()
m.compute_score(x,y)
return (m.mic(),0.5)
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
Wrapper:包装法
根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征;
1) 递归特征消除法
递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。
使用feature_selection库的RFE类来选择特征的代码如下:
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
RFE(estimator=LogisticRegression(),n_features_to_select=2).fit_transform(iris.data,iris.target)
Embedded:嵌入法
先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是通过训练来确定特征的优劣。
1) 基于惩罚项的特征选择法:使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。
使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
RFE(estimator=LogisticRegression(),n_features_to_select=2).fit_transform(iris.data,iris.target)
2) 基于树模型的特征选择法
树模型中GBDT也可以用来作为基模型进行特征选择,用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data,iris.target)
4、 降维:
当特征选择完成后,可以直接训练模型了,但是可能由于特征矩阵过大,导致计算量大、训练时间长的问题,因此降低特征矩阵维度也是必不可少的
另外还有主成分分析法(PCA)和线性判别分析(LDA),线性判别分析本身也是一个分类模型。
1) 主成分分析法(PCA)
from sklearn.decomposition import PCA
PCA(n_components=2).fit_transform(iris.data)
2) 线性判别分析法(LDA)
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
LDA(n_components=2).fit_transform(iris.data,iris.target)
5、多项式特征构造
机器学习,一些比赛竞赛中,通常会给一定的特征数据进行分类或者回归预测。有时需要构建更多的特征,然后对特征再进行特征选择。通过增加一些输入数据的非线性特征来增加模型的复杂度通常是有效的。一个简单通用的办法是使用多项式特征,这可以获得特征的更高维度和互相间关系的项。这在 PolynomialFeatures 中实现:
机器学习特征处理(特征工程)
文章图片

    推荐阅读