【问题标题】:Doing hyperparameter estimation for the estimator in each fold of Recursive Feature Elimination在递归特征消除的每一折中对估计器进行超参数估计
【发布时间】:2015-06-14 19:21:37
【问题描述】:

我正在使用 sklearn 使用 RFECV 模块通过交叉验证执行递归特征消除。 RFE 涉及在全部特征集上反复训练估计器,然后删除信息量最少的特征,直到收敛到最佳特征数量。

为了使估计器获得最佳性能,我想为估计器为每个特征数量选择最佳超参数(为清晰起见进行了编辑)。估计器是一个线性 SVM,所以我只研究 C 参数。

最初,我的代码如下。但是,这只是在开始时对 C 进行了一次网格搜索,然后每次迭代都使用相同的 C。

from sklearn.cross_validation import StratifiedKFold
from sklearn.feature_selection import RFECV
from sklearn import svm, grid_search

def get_best_feats(data,labels,c_values):

    parameters = {'C':c_values}

    # svm1 passed to clf which is used to grid search the best parameters
    svm1 = SVC(kernel='linear')
    clf = grid_search.GridSearchCV(svm1, parameters, refit=True)
    clf.fit(data,labels)
    #print 'best gamma',clf.best_params_['gamma']

    # svm2 uses the optimal hyperparameters from svm1
    svm2 = svm.SVC(C=clf.best_params_['C'], kernel='linear')
    #svm2 is then passed to RFECVv as the estimator for recursive feature elimination
    rfecv = RFECV(estimator=svm2, step=1, cv=StratifiedKFold(labels, 5))      
    rfecv.fit(data,labels)                                                     

    print "support:",rfecv.support_
    return data[:,rfecv.support_]

RFECV 的文档提供了参数“estimator_params:外部估计器的参数。当 RFE 对象作为参数传递给例如 sklearn.grid_search.GridSearchCV 对象时,对于进行网格搜索很有用。”

因此我想尝试将我的对象'rfecv'传递给网格搜索对象,如下:

def get_best_feats2(data,labels,c_values):

    parameters = {'C':c_values   
    svm1 = SVC(kernel='linear')
    rfecv = RFECV(estimator=svm1, step=1, cv=StratifiedKFold(labels, 5), estimator_params=parameters)
    rfecv.fit(data, labels)

    print "Kept {} out of {} features".format((data[:,rfecv.support_]).shape[1], data.shape[1])


    print "support:",rfecv.support_
    return data[:,rfecv.support_]

X,y = get_heart_data()


c_values = [0.1,1.,10.]
get_best_feats2(X,y,c_values)

但这会返回错误:

max_iter=self.max_iter, random_seed=random_seed)
File "libsvm.pyx", line 59, in sklearn.svm.libsvm.fit (sklearn/svm   /libsvm.c:1674)
TypeError: a float is required

所以我的问题是:如何将 rfe 对象传递给网格搜索,以便对递归特征消除的每次迭代进行交叉验证?

谢谢

【问题讨论】:

    标签: python machine-learning scikit-learn feature-selection rfe


    【解决方案1】:

    所以您想在 SVM 中对 C 进行网格搜索,以获取 RFE 中的每个特征数量?或者对于 RFECV 中的每个 CV 迭代?从你的最后一句话,我猜是前者。

    您可以通过RFE(GridSearchCV(SVC(), param_grid)) 来实现这一点, 虽然我不确定这是否真的有用。

    我认为第二个现在不可能(但很快)。你可以使用GridSeachCV(RFECV(), param_grid={'estimator__C': Cs_to_try}),但这会将两组交叉验证嵌套在一起。

    更新: GridSearchCV 没有coef_,所以第一个失败了。 一个简单的修复:

    class GridSeachWithCoef(GridSearchCV):
        @property
        def coef_(self):
            return self.best_estimator_.coef_
    

    然后改用它。

    【讨论】:

    • 您好安德烈亚斯,感谢您的回复。是的,我想做的是前者。但是,我不能按照建议将 GridSearchCV 传递给 RFE,因为这会返回错误 'AttributeError: 'GridSearchCV' object has no attribute 'coef_'''(如果我使用 RFECV 而不是 RFE,仍然会出现同样的错误)
    • 好点。也许我们应该在 sklearn 中解决这个问题。我更新了我的答案以包含修复。
    • 太棒了。该修复确实有帮助。干杯。
    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 2019-04-29
    • 1970-01-01
    相关资源
    最近更新 更多