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

6
我想知道Sklearn的RFECV是否可以选择固定数量的最重要特征。例如,在一个具有617个特征的数据集上工作,我一直在尝试使用RFECV来确定哪5个特征是最重要的。然而,与令我困惑的RFE不同,RFECV没有参数'n_features_to_select'。我该如何处理?

除了下面的答案,看看这个例子,它说明了RFECV的工作原理。正如答案所建议的那样,RFECV会自动调整特征数量,因此不需要提供要选择的特征。 - Vivek Kumar
2个回答

5
根据这个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文档, Quora帖子


3

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

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

解决这个问题的一个天真的方法是在设置n_features_to_select为所需数量并进行“手动”交叉验证的同时运行RFE

如果您想从最佳m个特征中选择n个特征(其中n<m),可以执行以下操作:

# 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]]

您需要注意的是,多个功能可能具有相同的重要性或系数,您在使用此方法时可能会将它们忽略。


你可以用一行代码完成:np.argsort(selector.estimator_.feature_importances_)[-n:]。另外请注意,top_n_idx指的是已经转换过的X的特征,而不是原始特征。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接