我正在尝试运行RFECV以选择最佳功能,并尝试运行GridSearchCV获得最佳超参数。我的代码如下:
params = {'estimator__C': [1e-4, 1e4]}
estimator = LogisticRegression(random_state=123)
selector = RFECV(estimator, step=1, cv=5, scoring='recall')
clf = GridSearchCV(selector, params, cv=5)
clf.fit(X_train, y_train)
当我在GridSearchCV中包含相同的评分标准时,我从cv_results获得了不同的最佳功能,n_features和参数。为什么会发生这种情况?哪种方法正确?
params = {'estimator__C': [1e-4, 1e4]}
estimator = LogisticRegression(random_state=123)
selector = RFECV(estimator, step=1, cv=5, scoring='recall')
clf = GridSearchCV(selector, params, cv=5, scoring='recall')
clf.fit(X_train, y_train)
答案 0 :(得分:1)
为什么会这样
在第二种情况下,如果您未明确指定scoring
,则GridSearchCV
将使用所用估计量的默认评分,此处为LogisticRegression
;来自docs:
评分:字符串,可调用,列表/元组,字典或无,默认值:无
[...]
如果为“无”,则使用估算器的评分方法。
LogisticRegression
的得分是多少?再次来自docs:
得分 (自我,X,y,sample_weight =无)
返回给定测试数据和标签的平均准确度。
因此,在第一种情况下,对于GridSearchCV
部分,您将获得使 accuracy 最大化的参数,而在第二种情况下,将使 recall < / em>。原则上,最大化这两个不同指标的参数不必相同(它们可以当然可以,但它们可以很好地 可以像这里一样)。
以下哪种方法是正确的?
从技术上讲,这两种方法都是正确的;唯一可以回答该问题的人是你自己,它与您的 business 问题更可取的度量标准有关。
也就是说,第一种方法确实看起来很怪异-为什么要在RFECV
和GridSearchCV
期间针对两个不同指标进行优化?至少从原则上讲,根据您选择的指标优化所有内容将更为有意义。
再次,请记住,所有这些技术实际上都是 ad hoc 方法,它们背后没有太多理论;最终的判断是实验。因此,例如,如果您有兴趣最大化最终模型的准确性,但是您发现尝试最大化召回率的中间RFECV
阶段最终会提供更好的总体准确性,那么您可能只是加油...