通过 Sklearn 的 RFECV(带有交叉验证的递归特征消除)选择特定数量的特征
Posted
技术标签:
【中文标题】通过 Sklearn 的 RFECV(带有交叉验证的递归特征消除)选择特定数量的特征【英文标题】:Selecting a Specific Number of Features via Sklearn's RFECV (Recursive Feature Elimination with Cross-validation) 【发布时间】:2018-12-13 08:06:15 【问题描述】:我想知道 Sklearn 的 RFECV 是否可以选择固定数量的最重要特征。例如,在处理具有 617 个特征的数据集时,我一直在尝试使用 RFECV 来查看其中 5 个特征是最重要的。但是,RFECV 没有参数“n_features_to_select”,这与 RFE 不同(这让我感到困惑)。我该如何处理?
【问题讨论】:
除了下面的答案之外,look at this example 说明了 RFECV 的工作原理。正如答案所建议的那样,RFECV 会自行调整功能的数量,因此不要提供可供选择的功能。 【参考方案1】:据此quora post
RFECV 对象有助于使用交叉验证调整或查找此 n_features 参数。对于消除“步”数特征的每一步,它都会计算验证数据的分数。在验证数据上给出最高分数的步骤中剩余的特征数被认为是您数据的“最佳 n_features”。
这表示 RFECV 确定最佳特征数 (n_features) 以获得最佳结果。
拟合的 RFECV
对象包含一个属性 ranking_
和特征排名,以及 support_
掩码以选择找到的最佳特征。
但是,如果您必须从 RFECV 中选择前 n_features,则可以使用 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 documentation, Quora post
【讨论】:
【参考方案2】:我知道这是一个老问题,但我认为它仍然相关。
我不认为 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]]
【讨论】:
以上是关于通过 Sklearn 的 RFECV(带有交叉验证的递归特征消除)选择特定数量的特征的主要内容,如果未能解决你的问题,请参考以下文章