sklearn六大板块中有两块都是关于数据预处理和特征工程的,两个板块互相交互,为建模之前的全部工程打下基础:Dimensionality reduction 和 Preprocessing
一.数据预处理 Preprocessing & Impute
1.数据无量纲化
- 数据无量纲化可以是线性的,也可以是非线性的
- 线性的无量纲化包括中心化处理和缩放处理
preprocessing.MinMaxScaler
- MinMaxScaler有一个重要参数:feature_range,控制我们希望把数据压缩到的范围,默认[0,1]
preprocessing.StandardScaler
- 对于大多数机器学习算法,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择
- MinMaxScaler在不涉及距离度量,梯度,协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像处理量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中
- 建议先试试看StandardScaler,效果不好再换MinMaxScaler
2.缺失值
impute.SimpleImputer
它包括四个重要参数
- missing_values:数据中的缺失值长什么样,默认空值np.nan
- strategy:填补缺失值的策略,默认均值
- fill_value:当参数strategy为“constant”的时候可用,可输入字符串或数字表示要填充的值,常用0
- copy:默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去
3.处理分类型特征:编码与哑变量
在机器学习中,大多数算法,比如逻辑回归,支持向量机,K近邻等都只能处理数值型数据,不能处理文字。在sklearn中,除了专用来处理文字的算法,其它算法在 fit 的时候全部要求输入数组或矩阵,也不能导入文字型数据(其实决策树和朴素贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)
然而现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的,在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,将文字型数据转换成数值型
- preprocessing.LabelEncoder:标签专用,能够将分类转换成分类数值
- preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
- preprocessing.OneHotEncoder:独热编码,创建哑变量。类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量向算法传达最准确的信息。特征可以做哑变量,标签也可以吗?可以,使用sklearn.preprocessing.LabelBinarizer可以对标签做哑变量
4.处理连续型特征:二值化与分段
sklearn.preprocessing.Binarizer
- 根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量。大于阈值的值映射为1,而小于或等于阈值的值映射为0。默认阈值为0时,特征中所有的正值都映射到1.二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否,它还可以用作考虑布尔随机变量的估计器的预处理步骤
preprocessing.KBinsDiscretizer
将连续型变量划分为分类型变量,能够将连续型变量排序后按顺序分箱后编码,有三个重要参数
- n_bins:每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征
- encode:编码的方式,默认“onehot”
- strategy:用来定义箱宽的方式,默认“quantile”
二.特征选择 feature_selection
1.Filter过滤法
- 过滤法的主要对象是:需要遍历特征或升维的算法们
- 过滤法的主要目的是:在维持算法表现的前提下,帮助算法们降低计算成本
①方差过滤
VarianceThreshold
- 这是通过特征本身的方差来筛选特征的类
- 无论接下来的特征工程要做什么,都要优先消除方差为 0 的特征
- VarianceThreshold有重要参数threshold,表示方差的阈值,表示舍弃所有方差小于threshold的特征,不填默认为0,即删除所有记录都相同的特征
- 怎么样知道方差过滤掉的到底是噪音还是有效特征?过滤后模型到底会变好还是会变坏呢?现实中我们会使用阈值为0或者阈值很小的方差过滤来为我们优先消除一些明显用不到的特征,然后我们会选择更优的特征选择方法继续削减特征数量
②相关性过滤
卡方过滤
- 卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤
- feature_selection.chi2计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。再结合feature_selection.SelectKBest这个可以输入评分标准来选出前k个分数最高的特征的类,我们可以借此除去最可能独立于标签,与我们分类目的无关的特征
- 如何设置一个最佳的k值呢?①学习曲线 ②看p值选择k(从特征工程的角度看,我们希望选取卡方值很大,p值小于0.05的特征,即和标签是相关联的特征,而调用SelectKBest之前,我们可以直接从chi2实例化后的模型中获得各个特征所对应的卡方值和p值)
F检验
- 用来捕捉每个特征与标签之间的线性关系的过滤方法
- 它既可以做回归也可以做分类,包含feature_selection.f_classif(F检验分类)和feature_selection.f_regression(F检验回归)两个类
- 其中F检验分类用于标签是离散型变量的数据,而F检验回归用于标签是连续型变量的数据
- 和卡方检验一样,这两个类需要和类SelectKBest连用,并且我们也可以直接通过输出的统计量来判断我们到底要设置一个什么样的K。需要注意的是,F检验在数据服从正态分布时效果会非常稳定,因此如果使用F检验过滤,我们会先将数据转换成服从正态分布的方式
- F检验的本质是寻找两组数据之间的线性关系,其原假设是数据不存在显著的线性关系。它返回F值和p值两个统计量。和卡方过滤一样,我们希望选取p值小于0.05或0.01的特征,这些特征与标签是显著线性相关的,而p值大于0.05或0.01则被我们认为是和标签没有显著线性关系的特征,应该被删除
互信息法
- 用来捕捉每个特征与标签之间的任意关系的过滤方法
- 与F检验相似,它既可以做回归也可以做分类,并且包含两个类:feature_selection.mutual_info_classif(互信息分类)和feature_selection.mutual_info_regression(互信息回归)
2.Embedded嵌入法
- 嵌入法是一种让算法自己决定使用哪些特征的方法,即特征选择和算法训练同时进行
- 在使用嵌入法时,我们先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据权值系数从大到小选择特征。这些权值系数往往代表了特征对于模型的某种贡献或某种重要性,我们就可以基于这种贡献的评估,找出对模型建立最有用的特征
- 相比于过滤法,嵌入法的结果会更加精确到模型的效用本身,对于提高模型效力有更好的效果,并且,由于考虑特征对模型的贡献,因此无关的特征(需要相关性过滤的特征)和无区分度的特征(需要方差过滤的特征)都会因为缺乏对模型的贡献而被删除掉
- 嵌入法的缺点:使用的权值系数没有范围可找,在这种情况下,权值系数就是超参数;嵌入法引入了算法来挑选特征,因此其计算速度也会和应用的算法有很大的关系,如果采用计算量很大,计算缓慢的算法,嵌入法本身也会非常耗时耗力,并且在选择完毕之后,还是需要自己来评估模型
feature_selection.SelectFromModel
- estimator:使用的模型评估器,只要是带feature_importances_或者coef_属性,或带有L1和L2惩罚项的模型都可以使用
- threshold:特征重要性的阈值,重要性低于这个阈值的特征都要被删除
- prefit:默认False,判断是否将实例化后的模型直接传递给构造函数。如果为True,则必须直接调用fit和transform,不能使用fit_transform,并且SelectFromModel不能与cross_val_score,GridSearchCV和克隆估计器的类似实用程序一起使用
- norm_order:k可输入非零整数,正无穷,负无穷,默认值为1,在评估器的coef_属性高于一维的情况下,用于过滤低于阈值的系数的向量的范数的阶数
- max_features:阈值设定下,要选择的最大特征数
3.Wrapper包装法
feature_selection.RFE
- estimator:实例化后的评估器
- n_features_to_select:想要选择的特征个数
- step:每次迭代中希望移除的特征个数
- RFE类有两个很重要的属性:.support_(返回所有的特征是否最后被选中的布尔矩阵),.ranking_(返回特征的按数次迭代中综合重要性的排名)