目录
1、数据与处理与特征工程概述
2、Sklearn数据预处理之Preprocessing & Impute
3、Sklearn特征选择feature_selection
4、总结
1、概述:
数据预处理与特征工程是数据建模前流程,数据不给力,再好的算法都没用。数据决定了模型的上限。算法只是无限逼近这个上限。
Sklearn中的数据预处理和特征工程核心模块:
模块 preprocessing:几乎包含数据预处理的所有内容。
模块 impute:填补缺失值专用。
模块 feature_selection:包括特征选择的各种方法实践。
2、Sklearn数据预处理之Preprocessing & Impute
数据无量纲化:在机器学习算法实践中,我们往往有着将数据转换到同一规格或不同分布的数据转换到某个特定的分布的需求,这种需求称为将数据“无量纲化”。无量纲化可以使矩阵和梯度为核心的算法中,加快算法求解速度,使算法尽快收敛,而在距离计算为核心的算法中,无量纲化可以帮助我们提升模型精度,避免某一个取值过大的特征对距离计算公式造成影响。(决策树和树的集成算法除外,不需要无量纲化,均能将任意数据处理的很好)
无量纲化可以是线性也可以是非线性的。线性无量纲化包括:中心化(Zero-centered或者Mean-subtraction)处理和缩放处理(scale)。中心化的本质是让所有记录减去一个固定值,即让样本数据平移到某个位置。缩放的本质是通过除以一个固定值,将数据固定在某一个范围之中,取对数也是一种缩放处理。
preprocessing.MinMaxScaler:当数据(x)按照最小值中心化后,再按极差(最大值-最小值)缩放,数据移动了最小值个单位,并且会被收敛到【0-1】之间,而这个过程叫做数据归一化(Normalization,又称Min-Max Scaling),归一化的数据服从正态分布。
公式如下:
preprocessing.StandardScaler:当数据(x)按均值()中心化后,再按标准差()缩放,数据就会服从均值为0,方差为1的正态分布(即标准正态分布),而这个过程,就叫做数据标准化(Standardization,又称Z-score normalization)。
公式如下:
StandardScaler和MinMaxScaler选哪个?
两种归一化方法的主要区别在于,如果数据集比较小,且相对噪声少,数据跨度不大时,采用MinMaxScaler,如果数据量较大,维度较多,一般采用后者进行归一化。
impute.SimpleImputer:用于缺失值处理。
处理分类特征:
preprocessing.OneHotEncoder:特征专用,独热编码,创建哑变量(处理名义变量)。
preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值。
preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值。
三者区别:独热编码主要处理无序的名义变量,而OrdinalEncoder主要处理有距变量(变量取值之间有一定的计算关系),LabelEncoder处理有序分类变量。
处理连续型特征:二值化与分段(分箱)
sklearn.preprocessing.Binarizer : 根据阈值将数据二值化为(0或1),用于处理连续型变量。
preprocessing.KBinsDiscretizer:这是将连续型的变量划分为分类变量的类,能够将连续型变量排序分箱后编码。
3、Sklearn特征选择feature_selection
Filter过滤法:过滤法的主要对象是需要遍历特征或升维的算法们,而过滤法的主要目的是在维持算法表现的前提下,帮助算法降低它们的计算成本。
1、方差过滤(VarianceThreshold) :通过特征本身的方差来筛选特征的类。比如:特征本身的方差较小,表示这个特征上基本上没有差异,或许大部分特征值都相同,说明这个特征对样本区分没什么作用。因此要消除方差为0的特征。
说明:方差过滤法有可能将有效特征过滤掉,导致模型效果变差;方差过滤的阈值一般设置比较小的值,对明显不重要的特征进行预筛选,然后继续选择其他更优的特征选择方法继续消减特征数量。
2、相关性过滤:方差选择之后,就是特征相关性问题了。我们希望选择与标签相关性强的特征,这样的特征能够为我们提供大量信息。如果特征与标签无关,不仅会白白浪费计算内存,还有可能为模型引入噪音。在Sklearn中有三种常用的方法来判断特征与标签之间的相关性:卡方,F检验,互信息。
a、卡方过滤:卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。卡方检验类feature_selection.chi2计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。再结合feature_selection.SelectKBest这个可以输入“评分标准”来选出前K个分数最高的特征的类,我们可以借此去除最可能独立于标签,与我们分类无关的标签。
卡方检验的本质:是推测两组数据之间的差异,其检验原假设是“两组数据是相互独立的”。卡方检验返回卡方值和P值两个统计量。其中卡方值很难界定有效范围,我们一般使用P值,0.05或0.01作为判断边界:我们希望选择卡方值很大,p值小于0.05的特征,即和标签是相关的特征。
b、F检验:又称ANOVA,方差齐性检验,是用来捕捉每个特征与标签之间的线性关系的过滤方法。
F检验在数据服从正态分布时效果会非常稳定,因此在使用F检验时,会先将数据转换成服从正态分布的方式。F检验的本质上是寻找两组数据之间的线性关系。返回F和P两个统计量,和卡方检验一样我们希望选取P值小于0.05或0.01的特征,这些特征与标签是有显著线性相关的。
c、互信息:互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。与F检验类似,既可以做分类又可以做回归。参数和用法与F检验一模一样,但功能更强大,互信息既可以检测出线性关系,也可以找出非线性关系。
互信息的返回值是“每个特征与目标之间的互信息量的估计”,这个估计量在【0-1】之间,为0表示两个变量独立,为1表示两个变量完全相关。
Embedded嵌入法:嵌入法是一种基于算法自己做决定选择某些重要度高的特征(通过相关性过滤无关特征和通过方差过滤掉无区分度特征),因此嵌入法是过滤法的进化版。
feature_selection.SelectFromModel
过滤法使用统计量可以使用统计知识和常识查找范围过滤特征,而嵌入法通过权值系数很难界定特征的重要度阈值,并且其计算速度也会和应用的算法有很大的关系。如果采用计算量大,计算缓慢的算法,嵌入法本身也会非常耗时耗力。并且,特征选择过后,还是需要自己来评估模型。
Wrapper包装法:包装法也是一个特征选择和算法训练同时进行的方法,与嵌入法十分相似,它也是依赖于算法自身的选择,比如coef_属性或feature_importances_属性来完成特征选择。但不同的是,我们往往使用一个目标函数作为黑盒来帮助我们选取特征,而不是自己输入某个评估指标或统计量的阈值。
feature_selection.RFE
包装法效果是所有特征选择方法中最利于提升模型表现的,它可以使用很少特征达到很优秀的效果。除此之外,在特征数目相同时,包装法和嵌入法的效果能够匹敌,不过它比嵌入法算得更见缓慢,所以也不适用于太大型的数据。相比之下,包装法是最能保证模型效果的特征选择方法。
4、总结:经验来说,过滤法更快速,但更粗糙。包装法和嵌入法更精确,比较适合具体到算法去调整,但计算量比较大,运行时间长。当数据量很大的时候,优先使用方差过滤和互信息法调整,再上其他特征选择方法。使用逻辑回归时,优先使用嵌入法。使用支持向量机时,优先使用包装法。迷茫的时候,从过滤法走起,看具体数据具体分析。