特征选择
一、 特征
一般来说,一个样本是用多个特征来表征的。特征可以理解为属性,它可以被分为三类:
- 相关特征:可以提升学习算法的效果;
- 无关特征:不会给算法的效果带来任何提升;
- 冗余特征:这种特征的信息可以由其他的特征推断出。
二、特征选择
特征选择就是从N个特征中选择其中M(M<=N)个子特征,并且在M个子特征中,准则函数可以达到最优解。
特征选择想做的是,选择尽可能少的子特征,模型的效果不会显著下降,并且结果的类别分布尽可能的接近真实的类别分别。(注意用词)
它的主要目的就是降维,从而降低学习任务的难度,提升模型的效率。
那么问题来了,如何做特征选择?一般来说,特征选择方法有三种:过滤法、包裹法和嵌入法。
(一)过滤法(Filter)
过滤法运用统计指标来为每个特征打分并筛选特征,其聚焦于数据本身的特点。(但没有考虑到特征之间的关联作用,可能把有用的关联特征误踢掉)
当使用过滤法审视变量(也就是特征)时,我们会从单变量自身情况和多变量之间的关系去判断变量是否应该被过滤掉。
单变量
- 缺失百分比:变量的缺失值占比太大,可以认为该变量没啥参考意义,建议剔除。
- 方差:计算各个变量的方差,根据阈值选择方差大于阈值的变量。(方差较大的特征较有用。如果方差较小,比如小于1,则这个变量可能对算法作用没那么大。最极端的,如果某个变量方差为0,即所有的样本该变量的取值都是一样的,那么它对模型训练没有任何作用,建议剔除)
from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris
iris = load_iris()
data = VarianceThreshold(threshold=3).fit_transform(iris.data, iris.target)
- 频数:若某离散型变量的枚举值样本量占比分布集中在某一枚举值上,即频次严重不平衡,可以考虑剔除。
多变量
研究多变量之间的关系时,主要从两种关系出发。
(1)自变量与自变量之间的相关性:相关性太高,会引起多重共线性问题,进而导致模型稳定性变差。建议在具有共线性的特征中选择一个即可,其余剔除。
(2)自变量与因变量之间的相关性:相关性越高,说明特征对模型预测目标更重要,建议保留。由于变量分离散型和连续型,因此在研究变量之间的关系时,也要选用不同的方法。
连续型VS连续型
- 皮尔逊相关系数(Pearson Correlation Coefficient):Pearson相关系数是两个变量的协方差除以两变量的标准差乘积。协方差能反映两个随机变量的相关程度(协方差大于0表示正相关,小于0表示负相关),而除以标准差后,Pearson的值范围为[-1,1]。当两个变量的线性关系增强时,相关系数趋于1或-1,正负号指向正负相关关系。但Pearson相关系数的缺陷在于它只对线性关系敏感,若关系是非线性的,即便两个变量一一对应,Pearson值也有可能接近0.
代码:X.corr(Y, method="pearson")
- 斯皮尔曼相关系数(Spearman’s Rank Correlation Coefficient):Pearson相关系数是建立在变量符合正态分布的基础上,而Spearman相关系数不假设变量服从何种分布,它基于等级(rank)的概念去计算变量间的相关性。如果变量是顺序变量(Ordinal Feature),推荐使用Spearman相关系数。
同样地,相关系数趋于1或-1,正负号指向正负相关关系。
代码:x.corr(y, method='spearman')
连续型VS离散型
- 方差分析(Analysis of variance, ANOVA):ANOVA的目的是检验不同组下的平均数是否存在显著差异,具体见方差分析详解。
代码:from statsmodels.stats.anova import anova_lm
(注:ANOVA分析前需要满足3个假设: 每组样本具备方差同质性、组内样本服从正态分布,样本间需要独立) - 肯德尔等级相关系数(Kendall tau rank correlation coefficient):举个🌰,假设我们要评价学历与工资的相关性,Kendall系数会对按学历对样本排序,若排序后,学历和工资排名相同,则Kendall系数为1,两变量正相关。若学历和工资完全相反,则系数为-1,完全负相关。而如果学历和工