所以我发现StandardScaler()可以让我的RFECV在GridSearchCV中更快地运行,每个RFECV都在嵌套的三倍交叉验证中运行。如果没有StandardScaler(),我的代码运行了2天多,所以我取消了,并决定将StandardScaler注入到该过程中。但现在它已经运行了4个多小时,我不确定我是否做对了。这是我的代码:
# Choose Linear SVM as classifier
LSVM = SVC(kernel='linear')
selector = RFECV(LSVM, step=1, cv=3, scoring='f1')
param_grid = [{'estimator__C': [0.001, 0.01, 0.1, 1, 10, 100]}]
clf = make_pipeline(StandardScaler(),
GridSearchCV(selector,
param_grid,
cv=3,
refit=True,
scoring='f1'))
clf.fit(X, Y)
老实说,我认为我没有做对,因为我认为StandardScaler()应该放在GridSearchCV()函数中,让它在每个折叠中规范化数据,而不仅仅是一次(?)。如果我错了,或者我的管道不正确,以及为什么它仍在长时间运行,请纠正我。
我有8000行145个特征要由RFECV修剪,还有6个C值要由GridSearchCV修剪。因此,对于每个C值,最佳特征集由RFECV确定。
谢谢!
更新:
所以我把StandardScaler放在RFECV里,就像这样:
clf = SVC(kernel='linear')
kf = KFold(n_splits=3, shuffle=True, random_state=0)
estimators = [('standardize' , StandardScaler()),
('clf', clf)]
class Mypipeline(Pipeline):
@property
def coef_(self):
return self._final_estimator.coef_
@property
def feature_importances_(self):
return self._final_estimator.feature_importances_
pipeline = Mypipeline(estimators)
rfecv = RFECV(estimator=pipeline, cv=kf, scoring='f1', verbose=10)
param_grid = [{'estimator__svc__C': [0.001, 0.01, 0.1, 1, 10, 100]}]
clf = GridSearchCV(rfecv, param_grid, cv=3, scoring='f1', verbose=10)
但它仍然抛出以下错误:
ValueError:估计器管道的参数C无效(内存=无,steps=[('标准缩放器',标准缩放器(copy=True,with_mean=True,>with_std=True)),('svc',svc(C=1.0,cache_size=200,class_weight=None,>coeff0=0.0,decision_function_shape="vr",degree=3,gamma="auto",kernel="linear",max_iter=-1,probability=False,random_state=None,shring=True,tol=0.001,verbose=False))])。使用>
estimator.get_params().keys()
检查可用参数列表。
Kumar是对的。此外,您可能想做的是,在GridSearchCV中启用verbose。此外,您可以对SVC的迭代次数进行限制,从一个很小的数字开始,比如5,只是为了确保问题不在于收敛。