通过Sklearn的RFECV(具有交叉验证的递归特征消除)选择特定数量的特征

时间:2018-07-04 21:57:34

标签: python machine-learning scikit-learn cross-validation feature-extraction

我想知道Sklearn的RFECV是否可以选择固定数量的最重要功能。例如,在处理具有617个要素的数据集时,我一直试图使用RFECV来查看其中哪些要素中最重要的5个。但是,与RFE不同,RFECV没有参数'n_features_to_select'(这使我感到困惑)。我该如何处理?

2 个答案:

答案 0 :(得分:2)

根据此quora post

  

RFECV对象有助于使用交叉验证来调整或找到此n_features参数。对于消除了“步骤”数量的特征的每个步骤,它都会根据验证数据计算分数。在验证数据上给出最高分的步骤中剩余的特征数被认为是数据的“最佳n_features”。

哪个表示RFECV确定了最佳特征数(n_features)以获得最佳结果。
拟合的RFECV对象包含具有特征等级的属性ranking_support_掩码,用于选择找到的最佳特征。
但是,如果您必须从RFECV中选择前n个功能,则可以使用ranking_属性

optimal_features = X[:, selector.support_] # selector is a RFECV fitted object

n = 6 # to select top 6 features
feature_ranks = selector.ranking_  # selector is a RFECV fitted object
feature_ranks_with_idx = enumerate(feature_ranks)
sorted_ranks_with_idx = sorted(feature_ranks_with_idx, key=lambda x: x[1])
top_n_idx = [idx for idx, rnk in sorted_ranks_with_idx[:n]]

top_n_features = X[:5, top_n_idx]

参考: sklearn documentationQuora post

答案 1 :(得分:0)

我知道这是一个老问题,但我认为它仍然相关。

我不认为 shanmuga 的解决方案是正确的,因为同一等级内的特征不是按重要性排序的。也就是说,如果 selector.ranking_ 有 3 个等级为 1 的特征,我认为列表中的第一个特征不一定比第二个或第三个更重要。

这个问题的一个简单的解决方案是运行 RFE,同时将 n_features_to_select 设置为所需的数字并“手动”交叉验证它。

如果你想从最优的 m 个特征中得到 n 个特征(n

# selector is a RFECV fitted object
feature_importance = selector.estimator_.feature_importances_  # or coef_
feature_importance_sorted = sorted(enumerate(feature_importance), key=lambda x: x[1])
top_n_idx = [idx for idx, _ in feature_importance_sorted[:n]]

您应该注意,多个特征可能具有相同的重要性或系数,您可能会在此方法中忽略这一点。