首先先说说特征选择。
特征选择包含三大类:过滤式、包裹式、嵌入式。
过滤式(filter)
它是先设计一个过滤方法进行特征选择,再去训练学习器。而这个过滤方式是设计一个“相关统计量”,去对特征进行计算,最后设定一个阈值去进行选择。
相关统计量计算:
对于每个样本xi,他都会做以下事情。
找出同类中,最邻近的样本x1;在异类中,找出最邻近的x2。
如果xi与x1更近,说明特征是对同类异类有益的,会增大相对应的统计量;反之,如果xi与x2更近,说明特征起到副作用,会减少相对应的统计量。(当然有时候也不需要把整个训练集全用上,可以用采样的办法进行计算)
方差选择法:
from sklearn.feature_selection import VarianceThreshold
vt = VarianceThreshold(threshold = 1)
vt = vt.fit_transform(data)
卡方检验法(相关性)
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
skb = SelectKBest(chi2,k=2)
new_data = skb.fit_transform(data,target)
皮尔森相关系数法法(相关性)(回归问题)
from sklearn.feature_selection import SelectKBest # 移除topK外的特征from scipy.stats import pearsonr # 计算皮尔森相关系数
'''
# 函数返回值:保留topk特征,移除topk外特征
# 第一个参数:皮尔森相关系数(输入特征矩阵和目标向量,输出二元组(评分,P),二数组第i项为第i个特征的评分和p值
# 第二个参数:topK个数
'''
skb = SelectKBest(lambda X, Y: tuple(map(tuple,array(list(map(lambda x:pearsonr(x, Y), X.T))).T)), k=3)
skb = skb.fit_transform(data, target)
包裹式选择(wrapper)
它与过滤式不同,它会考虑后续的学习器。它会把学习器的性能作为评价准则。
1.LVW
第一步:随机选出特征集;
第二步:计算相关误差,如果误差比原本的小,或者误差相当但是特征数比之前的少,则把子集留下。
2.RFE
第一步:对初始特征进行训练,得到权重
第二步:提出权重最小的特征,构成新的集合
第三步:不断重复,知道满足停止条件为止。
Class sklearn.feature_selection.RFE(estimator,n_features_to_select=None,step=1,estimator_params=None,verbose=0)
参数:
estimator:一个学习器(通常使用SVM和广义线性模型作为estimator)
n_features_to_select:指定要选出几个特征
step:指定每次迭代要剔除权重最小的几个特征
大于等于1:指定每次迭代要剔除权重最小的特征的数量
在0.0~1.0:指定每次迭代要剔除权重最小的特征的比例
estimator_params:一个字典,用于设定estimator的参数
sklearn还提供了RFECV类,它是RFE的一个变体,它执行一个交叉验证来寻找最优的剩余特征数量,因此不需要指定保留多少个特征。原型为
class sklearn.feature_selection.RFECV(estimator,step=1,cv=None,scoring=None,estimator_params=None,verbose=0)
嵌入式、ridge regression、lasso 在下一个总结。