如何做特征选择?

1 参考链接

Topic 6. Feature Engineering and Feature Selection
https://www.kaggle.com/kashnitsky/topic-6-feature-engineering-and-feature-selection

结合Scikit-learn介绍几种常用的特征选择方法
https://blog.youkuaiyun.com/LY_ysys629/article/details/53641569

2 原因

  • 越多的数据,越高的复杂度
  • 噪声特征造成过拟合

3 鉴别

  • 统计:特征不改变,相当于没有提供任何信息。所以可以说,低方差的特征比高方差的特征差,所以可以考虑去掉方差阈值少于一定阈值的特征。
from sklearn.feature_selection import VarianceThreshold
VarianceThreshold(.7).fit_transform(x_data_generated).shape
  • 分类统计
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score

x_data_kbest = SelectKBest(f_classif, k=5).fit_transform(x_data_generated, y_data_generated)
x_data_varth = VarianceThreshold(.9).fit_transform(x_data_generated)

cross_val_score(LogisticRegression(), x_data_generated, y_data_generated, scoring='neg_log_loss').mean()
-0.4085819819399657

cross_val_score(LogisticRegression(), x_data_kbest, y_data_generated, scoring='neg_log_loss').mean()
-0.3391459274373541

cross_val_score(LogisticRegression(), x_data_varth, y_data_generated, scoring='neg_log_loss').mean()
-0.37782243684017525

可以看出处理后的特征分数比较高。

  • 模型来选择特征,利用Random Forest或者linear model这些简单的模型容易使弱特征无效,所以没比较将这些特征放到复杂的模型中去。
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
from sklearn.model_selection import cross_val_score
from sklearn.pipeline import make_pipeline

x_data_generated, y_data_generated = make_classification()

pipe = make_pipeline(SelectFromModel(estimator=RandomForestClassifier()), LogisticRegression())

lr = LogisticRegression()
rf = RandomForestClassifier()

print(cross_val_score(lr, x_data_generated, y_data_generated, scoring='neg_log_loss').mean())
print(cross_val_score(rf, x_data_generated, y_data_generated, scoring='neg_log_loss').mean())
print(cross_val_score(pipe, x_data_generated, y_data_generated, scoring='neg_log_loss').mean()
-0.3568462635817046
-0.9547234045086143
-0.28555118731986034

当然上述方法也可能使结果变差

  • 暴力搜索:以所有特征的子集训练,得到结果,然后重复不同的子集,通过比较模型的结果来确定最优的feature,当然搜索所有空间太耗时,可以一个相对较小的N,迭代选择N个features的组合,来选择特定的最优组合,然后再考虑添加新的特征,来优化,直到特征没有显著提升效果。
from mlxtend.feature_selection import SequentialFeatureSelector

selector = SequentialFeatureSelector(LogisticRegression(), scoring='neg_log_loss', 
                                     verbose=2, k_features=3, forward=False, n_jobs=-1)

selector.fit(x_data, y_data)
随机森林是一种基于决策树的集成学习方法,可以用于特征选择。在随机森林中,特征的重要性是通过袋装法(bootstrap aggregating)和随机子空间(random subspace)两种方法来计算的。 首先,袋装法是通过从原始数据集中有放回地抽样生成多个训练集,每个训练集大小与原始数据集相同,但是其中有一部分样本会被重复采样,这些训练集被用于构建多个决策树。由于每个训练集都是从原始数据集中随机抽取的,所以每个决策树都会有一定的差异。通过对这些决策树的预测结果进行平均或投票,可以得到最终的预测结果。 其次,随机子空间是通过在构建每个决策树时随机选择一部分特征来实现的。在选择特征时,每次随机选择一个大小为m的特征子集,其中m远小于原始数据集中的特征数。然后,使用这个子集中的特征来构建决策树。这样可以防止某些特征在整个随机森林中占据主导地位,使得所有的决策树都依赖于它们。 最后,在随机森林中,特征的重要性是通过计算平均减少不纯度(mean decrease impurity)来确定的。这个指标可以用来衡量每个特征对模型性能的贡献。在随机森林中,每个决策树在分裂节点时都会计算一个减少不纯度的值,而每个特征对应的减少不纯度值可以通过累加每个决策树中相应特征的减少不纯度值来计算。最后将所有特征的减少不纯度值除以总和即可得到每个特征的重要性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值