Scikit learn scikit学习中的详尽功能选择?

Scikit learn scikit学习中的详尽功能选择?,scikit-learn,Scikit Learn,在scikit learn中是否有任何内置的蛮力功能选择方法?即,彻底评估输入特征的所有可能组合,然后找到最佳子集。我熟悉“递归特性消除”类,但我对逐个评估输入特性的所有可能组合特别感兴趣 否,未实现最佳子集选择。最简单的方法是自己写。这应该让你开始: from itertools import chain, combinations from sklearn.cross_validation import cross_val_score def best_subset_cv(estimato

在scikit learn中是否有任何内置的蛮力功能选择方法?即,彻底评估输入特征的所有可能组合,然后找到最佳子集。我熟悉“递归特性消除”类,但我对逐个评估输入特性的所有可能组合特别感兴趣

否,未实现最佳子集选择。最简单的方法是自己写。这应该让你开始:

from itertools import chain, combinations
from sklearn.cross_validation import cross_val_score

def best_subset_cv(estimator, X, y, cv=3):
    n_features = X.shape[1]
    subsets = chain.from_iterable(combinations(xrange(k), k + 1)
                                  for k in xrange(n_features))

    best_score = -np.inf
    best_subset = None
    for subset in subsets:
        score = cross_val_score(estimator, X[:, subset], y, cv=cv).mean()
        if score > best_score:
            best_score, best_subset = score, subset

    return best_subset, best_score

这将在循环内执行k折叠交叉验证,因此它将适合k 2ᵖ 当给出具有p特征的数据时,估算器。

结合Fred Foo的答案和nopper、ihadanny和jimijazz的评论,以下代码得到的结果与本书实验1(6.5.1最佳子集选择)中第一个示例的R函数regsubsets()相同“统计学习导论及其在R中的应用”

来自itertools导入组合的

从sklearn.cross_验证导入cross_val_分数
def最佳_子集(估计量,X,y,最大_大小=8,cv=5):
''计算X的最大尺寸特征的最佳模型。
估计器必须具有拟合和得分函数。
X必须是数据帧。“”
n_特征=X.形状[1]
子集=(组合(范围(n_特征),k+1)
对于范围内的k(最小值(n个特征,最大值)))
最佳大小\u子集=[]
对于子集中的子集_k:#对于相同大小的每个子集列表
最佳分数=-np.inf
最佳子集=无
对于子集中的子集_k:#对于每个子集
拟合(X.iloc[:,列表(子集)],y)
#在相同大小的子集中获得得分最佳的子集
得分=估计员得分(X.iloc[:,列表(子集)],y)
如果分数>最佳分数:
最佳分数,最佳子集=分数,子集
#为了比较不同大小的子集,我们必须使用CV
#首先存储每个大小的最佳子集
最佳大小的子集。追加(最佳子集)
#比较每个大小的最佳子集
最佳分数=-np.inf
最佳子集=无
列出分数=[]
对于最佳_大小_子集中的子集:
得分=交叉得分(估计量,X.iloc[:,列表(子集)],y,cv=cv)。平均值()
列出分数。追加(分数)
如果分数>最佳分数:
最佳分数,最佳子集=分数,子集
返回最佳子集、最佳分数、最佳大小子集、列出分数

查看笔记本,您可能想看一看。它显然不是内置在scikit learn中的,但支持分类器和回归器对象。

@AbhishekThakur谢谢。但不,我想要一个“傻瓜”“蛮力功能选择——事实上,我可以在所有组合中循环进行选择。但如果存在内置方法/管道,则更喜欢这种方法/管道??谢谢您的回答!!代码中有一个错误。它应该是
组合(xrange(n_功能))
。性能提示-在相同尺寸k的不同型号之间进行比较时,无需执行cv-比较列车组统计数据(如R^2)就足够了。只有在比较不同尺寸的最佳候选人时,才需要简历。参见这本优秀的书中的第6章:同样,对于sklearn 0.22,您必须像这样分割输入:
X.iloc[:,list(subset)]