目录
1. 移除低方差的特征 (Removing features with low variance)
2、单变量特征选择 (Univariate feature selection)
(2)Pearson相关系数 (Pearson Correlation)
4 、距离相关系数 (Distance Correlation)
5、基于模型的特征排序 (Model based ranking)
1、递归特征消除 (Recursive Feature Elimination)
(2) 随机稀疏模型 (Randomized sparse models)
(3)基于树的特征选择 (Tree-based feature selection)
四、将特征选择过程融入pipeline (Feature selection as part of a pipeline)
一、概述
1、当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
-
特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
-
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除移除低方差法外,本文介绍的其他方法均从相关性考虑。
2、根据特征选择的形式又可以将特征选择方法分为3种:
-
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
-
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
-
Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
3、特征选择主要有两个目的:
-
减少特征数量、降维,使模型泛化能力更强,减少过拟合;
-
增强对特征和特征值之间的理解。
拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的)。本文将结合 Scikit-learn提供的例子 介绍几种常用的特征选择方法,它们各自的优缺点和问题。
二、Filter
1. 移除低方差的特征 (Removing features with low variance)
假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。
当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。
而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。
from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
print(X)
# 移除方差小于 0.16的列
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
X_v = sel.fit_transform(X)
print(X_v)
2、单变量特征选择 (Univariate feature selection)
单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些指标重要,剔除那些不重要的指标。
(1)对于分类问题(y离散),可采用:卡方检验,f_classif, mutual_info_classif,互信息
(2)对于回归问题(y连续),可采用:皮尔森相关系数,f_regression, mutual_info_regression,最大信息系数
(3)优缺点
优点:比较简单,易于运行,易于理解,通常对于理解数据有较好的效果。
缺点:对特征优化、提高泛化能力来说不一定有效。这种方法有许多改进的版本、变种。
(4)单变量特征选择基于单变量的统计测试来选择最佳特征。它可以看作预测模型的一项预处理。Scikit-learn将特征选择程序用包含 transform 函数的对象来展现:
-
SelectKBest 移除得分前 k 名以外的所有特征(取top k),选择排名靠前的K个特征。
-
SelectPercentile 移除得分在用户指定百分比以后的特征(取top k%),选择排名靠前的 k% 比率的特征。
-
对每个特征使用通用的单变量统计检验: 假正率(false positive rate) SelectFpr, 伪发现率(false discovery rate) SelectFdr, 或族系误差率 SelectFwe.
-
GenericUnivariateSelect 可以设置不同的策略来进行单变量特征选择。同时不同的选择策略也能够使用超参数寻优,从而让我们找到最佳的单变量特征选择策略。
(5)将特征输入到评分函数,返回一个单变量的 f_score(F检验的值) 或 p-values (P值,假设检验中的一个标准,P-value用来和显著性水平作比较),注意 SelectKBest 和 SelectPercentile 只有得分,没有p-value。
(6)如果你使用稀疏数据(比如,使用稀疏矩阵表示的数据), 卡方检验(chi2)、互信息回归(mutual_info_regression)、互信息分类(mutual_info_classif)在处理数据时可保持其稀疏性.
(1)、卡方(Chi2)检验
原理参考:https://mp.csdn.net/postedit/101861846
经典的卡方检验是检验定性自变量对定性因变量的相关性。比如,我们可以对样本进行一次chi2 测试来选择最佳的两项特征:
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
iris = load_iris()
X, y = iris.data, iris.target
print(X.shape)
selector = SelectKBest(chi2, k=2)
X_new = selector.fit_transform(X, y)
print(X_new.shape)