“数据决定了机器学习的上限,而算法只是尽可能逼近这个上限”,这里的数据指的就是经过特征工程得到的数据。特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是最大限度地从原始数据中提取特征以供算法和模型使用。从数学的角度来看,特征工程就是人工地去设计输入变量 x x x。特征工程在机器学习中占有非常重要的作用,一般认为括特征构建、特征提取、特征选择三个部分。
变量过程是个比较复杂的过程,需要考虑的因素很多,比如: 变量的预测能力(最主要和最直接的衡量标准) 变量之间的相关性 变量的简单性(容易生成和使用) 变量的强壮性(不容易被绕过) 变量在业务上的可解释性(被挑战时可以解释的通)等等
特征构建是指从原始数据中人工的找出一些具有物理意义的特征的过程。 特征构建比较麻烦,需要一定的经验,需要结合具体的业务,花费大量的时间去观察原始数据,思考问题的潜在形式和数据结构,以及如何将特征数据输入给预测算法。 特征构建是一个升维的过程。但是同一个维度,有不同的方法。举个栗子, 假设你的数据里现在有一个颜色的维度,比如是“itemColor”,它的三个取值分别是:red、blue、unknown。从特征构建的角度来看,你可以将其转化成一个二值特征“hascolor”,取值为1或0。其中1表示有颜色,0表示没颜色。你还可以将其转换成三个二值属性:IsRed, IsBlue and Is_Unknown。这取决于你的业务是否对其中的某一种颜色很敏感。 常用方法 特征构建是一个升维的过程,需要找到各种不同的维度,以及这些维度上的值。 列表数据类进行遍历:比如要预测房价则需要把房价面积、距离地铁口多远等信息列举出来;比如要预测西瓜是否是一个好瓜,要把瓜蒂形状、颜色、敲声等列举出来。 文本类:词频(term frequency,TF)和逆向文件频率(inverse document frequency,IDF),一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章,TF-IDF。 图像类:通过图片像素,滤波器等手段,提取出边缘、线等。 机器视觉、语音识别等,通常使用的是深度学习的算法,这些深度学习算法会自己进行特征学习,一般不需要人工手动构建特征。 属性分割和结合是特征构建时常使用的方法—— 结构性的表格数据,可以尝试组合二个、三个不同的属性构造新的特征,例如最近5天的平均值、最近10天的平均值;也可以把一个属性分解或切分,例如时间可以切分成上午、下午、晚上、周末等。 自然语言处理则使用词向量Word2vec。 机器视觉则使用卷积核。
通过特征转换,将原始特征转换为新的具有明显物理意义或者统计意义或核的特征的过程,从而达到降维的效果。其实就是特征转换。 常用方法(针对每种方法具体原理将在后面进行详细介绍):
PCA (Principal component analysis,主成分分析) PCA的思想是通过坐标轴转换,寻找数据分布的最优子空间,从而达到降维、去相关的目的。 在数学上,是先用原始数据协方差矩阵的前N个最大特征值对应的特征向量构成映射矩阵,然后原始矩阵左乘映射矩阵,从而对原始数据降维。 PCA算法:通过协方差矩阵的特征值分解能够得到数据的主成分,以二维特征为例,两个特征之间可能存在线性关系(例如运动的时速和秒速度),这样就造成了第二维信息是冗余的。PCA的目标是发现这种特征之间的线性关系,并去除。LDA (Linear Discriminant Analysis,线性判别分析) LDA的原理是将带上标签的数据(点),通过投影的方法,投影到维度更低的空间,使得投影后的点,会形成按类别区分,相同类别的点,将会在投影后更接近,不同类别的点距离越远。 LDA算法:考虑label,降维后的数据点尽可能地容易被区分。例如sklearn中的lda.LDA,不过LDA在许多算法里面都要被删除,不使用了。ICA(Independent component analysis,独立成分分析) ICA认为观测到数据矩阵X是可以由未知的独立元举证S与未知的矩阵A相乘得到。ICA希望通过矩阵X求得一个分离矩阵W,使得W作用在X上所获得的矩阵Y能够逼近独立源矩阵S,最后通过独立元矩阵S表示矩阵X,所以说ICA独立成分分析提取出的特征中的独立部分。例如sklearn中的decomposition.FastICA。 PCA特征转换降维,提取的是不相关的部分,ICA独立成分分析,获得的是相互独立的属性。特征选择是剔除不相关或者冗余的特征的过程,(1) 减少特征数量、降维,使模型泛化能力更强;(2) 减少过拟合,增强对特征和特征值之间的理解。 常用方法(针对每种方法具体原理将在后面进行详细介绍):
去掉取值变化小的特征 假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。单变量特征选择 单变量特征选择能够对每一个特征进行测试,衡量该特征和响应变量之间的关系,根据得分扔掉不好的特征。 在单因子分析中,如果某个变量对目标变量影响不大甚至完全独立,那么可以去掉这个变量。 如果两个变量相关性很高,其中一个变量解释性比较高,另外一个变量解释性比较低时,即使解释性比较低的变量效果更好一些,我们也会将其去掉,保留解释性比较高的那个变量。当然这是在回归模型中(奇异性问题)。其他模型不需要剔除。 Pearson相关系数 Pearson Correlation 能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关(这个变量下降,那个就会上升),+1表示完全的正相关,0表示没有线性相关。Sklearn提供的f_regrssion方法能够批量计算特征的p-value;pandas的df.corr()和spark mllib的Correlation.corr()也能够获取pearson相关系数。 互信息和最大信息系数 Mutual information and maximal information coefficient (MIC) 距离相关系数 (Distance correlation) 距离相关系数是为了克服Pearson相关系数的弱点而生的。在x和x^2这个例子中,即便Pearson相关系数是0,我们也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是0,那么我们就可以说这两个变量是独立的。 基于学习模型的特征排序 (Model based ranking)线性模型和正则化 在很多实际的数据当中,往往存在多个互相关联的特征,这时候模型就会变得不稳定,数据中细微的变化就可能导致模型的巨大变化(模型的变化本质上是系数,或者叫参数,可以理解成 W W W),这会让模型的预测变得困难,这种现象也称为多重共线性。例如,假设我们有个数据集,它的真实模型应该是 Y = X 1 + X 2 Y=X_1+X_2 Y=X1+X2,当我们观察的时候,发现 Y ′ = X 1 + X 2 + e Y'=X_1+X_2+e Y′=X1+X2+e, e e e是噪音。如果 X 1 X_1 X1和 X 2 X_2 X2之间存在线性关系,例如 X 1 X_1 X1约等于 X 2 X_2 X2,这个时候由于噪音e的存在,我们学到的模型可能就不是 Y = X 1 + X 2 Y=X_1+X_2 Y=X1+X2了,有可能是 Y = 2 X 1 Y=2X_1 Y=2X1,或者 Y = − X 1 + 3 X 2 Y=-X_1+3X_2 Y=−X1+3X2。随机森林 随机森林具有准确率高、鲁棒性好、易于使用等优点,这使得它成为了目前最流行的机器学习算法之一。随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy。 平均不纯度减少 mean decrease impurity 随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。 平均精确率减少 Mean decrease accuracy 另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。特征提取与特征选择的区别: (1) 特征提取通过特征转换实现降维,特征选择则是依靠统计学方法或者于机器学习模型本身的特征选择(排序)功能实现降维。 (2) 特征选择是个重复迭代的过程。 判别特征的重要性是对特征进行选择的预先指标,特征根据重要性被分配分数,然后根据分数不同进行排序,其中高分的特征被选择出来放入训练数据集。 特征选择在很多机器学习和数据挖掘场景中都是非常有用的。在使用的时候要弄清楚自己的目标是什么,然后找到哪种方法适用于自己的任务。当选择最优特征以提升模型性能的时候,可以采用交叉验证的方法来验证某种方法是否比其他方法要好。当用特征选择的方法来理解数据的时候要留心,特征选择模型的稳定性非常重要,稳定性差的模型很容易就会导致错误的结论。对数据进行二次采样然后在子集上运行特征选择算法能够有所帮助,如果在各个子集上的结果是一致的,那就可以说在这个数据集上得出来的结论是可信的,可以用这种特征选择模型的结果来理解数据。
参考内容:http://tech.dianwoda.com/2018/04/23/te-zheng-gong-cheng/