我正在尝试运行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中使用相同的评分指标时,我得到了不同的最佳特征、n_features和cv_results中的参数。为什么会发生这种情况?这两种方法哪一种是正确的?
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)
回答:
为什么会发生这种情况
在第二种情况下,如果你没有明确指定scoring
,GridSearchCV
将使用所用估计器的默认评分,这里是LogisticRegression
;从文档中可以看到:
scoring : string, callable, list/tuple, dict or None, default: None
[…]
如果为None,将使用估计器的score方法。
那么LogisticRegression
的评分是什么呢?再次从文档中可以看到:
score (self, X, y, sample_weight=None)
返回给定测试数据和标签的平均准确率。
因此,在第一种情况下,对于GridSearchCV
部分,你得到的是最大化准确率的参数,而在第二种情况下,是最大化召回率的参数。原则上,最大化这两个不同指标的参数不必相同(它们可以相同,但也可能不相同,就像这里的情况)。
这两种方法哪一种是正确的?
从技术上讲,这两种方法都是正确的;唯一能回答这个问题的只有你自己,这与你的业务问题中偏好的指标有关。
话虽如此,第一种方法确实看起来有点奇怪——为什么你会在RFECV
和GridSearchCV
期间优化两个不同的指标?至少在原则上,根据你选择的指标优化所有内容会更有意义。
再次提醒,所有这些技术实际上都是临时的方法,背后没有太多理论;最终的评判者是实验。所以,如果你感兴趣,比如说,最大化你的最终模型的准确率,但你发现一个中间的RFECV
阶段试图最大化召回率,最终能提供更好的整体准确率,你完全可以选择这种方法…