一、特征选择

1、引出:给定的属性集中,包括有效特征数据,也包括无效或者低效的特征数据;显然,有效特征数据才是模型训练中起关键作用的数据。

2、目的:剔除无效特征数据或者低效特征数据。

3、效果:

1) 简化模型:特征数据精选后,模型的训练也会更简单、更快;

2) 训练效果:模型的拟合性能更好;

3) 训练开销:节省计算资源,节省存储资源;

4) 风险规避:维数灾难风险得到规避。

4、缺点: 增加方差

二、特征选择的场景

1、训练数据中确实存在多余或者无用的特征数据,移除这些数据不会导致数据缺损;

2、特征数据较多,样本数据较少。

三、特征数据的处理步骤

1、生成待选的特征数据集合;

2、评价待选的特征数据集合中、各个特征数据的重要性或者好坏;具体的,特征数据与标签数据间是否存在满足要求的关联性,特征数据之间的相似程度;

3、控制计算量,评价函数在达到设定阈值后,可停止计算;

4、验证选出来的多个特征数据是否确实满足要求。

四、实现手段:Filter(过滤法)、Wrapper(包装法)和Embedded(嵌入法)

1、Filter(过滤法)

        1)原理:按照发散性或者相关性,对各个特征数据进行评分,根据设定阈值或者设定目标特征数据的数量,确定筛选范围;又可分为,单变量过滤方法和多变量过滤方法;

        2)单变量过滤方法:

        不考虑多个特征数据间的相关性,考虑各个特征数据与目标标签间的相关性,按照该相关性对多个特征数据进行优先级排序,过滤掉优先级倒数的特征数据;

        优点:计算效率高、不易过拟合。

        3)多变量过滤方法:

        考虑多个特征数据之间的相关性,常用:基于相关性和一致性的特征选择。

        4)优点和缺点

        优点:不依赖于任何机器学习方法,且不需要进行交叉验证,计算效率比较高;

        缺点:没有考虑机器学习算法的特点。

        5)常用方法:

        覆盖率:根据覆盖频次筛选;例如,100个样本数据,该特征数据仅出现5次,则pass掉;

        方差选择法:计算各个特征数据对应的方差,将方差大于设定阈值的保留;

from sklearn.feature_selection import VarianceThrehold
# 方差选择法,返回值为特征选择后的数据
# 参数threhold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(iris.data)

        皮尔森(Pearson)相关系数:

        计算两个变量之间的协方差和标准差的商:\rho _{X,Y}=\frac{cov\left ( X,Y \right )}{\sigma _{X}\sigma _{Y}}=\frac{E\left [ \left ( X-\mu _{X} \right ) \left ( Y-\mu _{Y} \right )\right ]}{\sigma _{X}\sigma _{Y}}

        样本上的相关系数为:\gamma =\frac{\sum_{i=1}^{n}\left (X _{i}-\widetilde{X}\right )\left (Y _{i} -\widetilde{Y}\right )}{\sqrt{\sum_{i=1}^{n}\left (X _{i}-\widetilde{X} \right )^{2}}\sqrt{\sum_{i=1}^{n}\left (Y _{i}-\widetilde{Y} \right )^{2}}}

 

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
# 选择K个最好的特征,返回选择特征后的数据
# 第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量
# 第一个参数为计算评估特征是否最好的函数,该函数输入特征矩阵和目标向量
# 输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值
# 在此为计算相关系数
# 其中参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x: pearsonr(x, Y), X·T)·T, k=2).fit_transform(iris.data, iris.target)

        卡方检验:检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量

\chi ^{2}=\sum \frac{\left ( A-E \right )^{2}}{E}

        这个统计量的含义即自变量对因变量的相关性

from sklearn.feature-selection import SelectKBest
from sklearn.feature_selection import chi2
# 选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

具体详细列举,可参照: 特征选择方法全面总结 - 知乎

2、Wrapper(包装法)

        1)使用机器学习算法,可检测至少两个特征数据之间的交互关系,而且选择的特征

数据子集可让模型的效果达到最优;

        2)结合特征子集搜索和评估指标;

        3)在每一个特征子集上训练并评估模型,以找到最优子集

        4)常用:完全搜索(穷举法)、启发式搜索、随机搜索、递归特征消除法

其中,递归特征消除法代码:

from sklearn.feature-selection import RFE
from sklearn.linear_model import LogisticRegression
# 递归特征消除法,返回特征选择后的数据
# 参数estimator为基模型
# 参数n_features_to_select为选择的特证个数
RFE(estimators=LogisticRegression(). n_features_to_select=2).fit_transform(iris.data, iris.target)

3、Embedded(嵌入法)

        1) 将特征选择嵌入到模型的构建过程中,具有包装法与机器学习算法相结合的优点,也具有过滤法计算效率高的优点

        2)常用方法:LASSO方法、基于树模型的特征选择方法

       

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
# 带L1惩罚的逻辑回归作为基模型的特征选择
SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)
from sklearn.feature-selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
# GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

具体的,可参照: 特征选择方法全面总结 - 知乎

 

更多推荐