python - RFECV 与 GridSearchCV 的评分有什么区别?
问题描述
我正在尝试运行 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)
解决方案
为什么会这样
在第二种情况下,您没有明确指定scoring
,GridSearchCV
将使用使用的估计器的默认评分,这里LogisticRegression
; 来自文档:
评分:字符串,可调用,列表/元组,字典或无,默认值:无
[...]
如果没有,则使用估计器的评分方法。
那分数是为了LogisticRegression
什么?再次来自文档:
score (self, X, y, sample_weight=None)
返回给定测试数据和标签的平均准确度。
因此,在第一种情况下,对于GridSearchCV
零件,您将获得最大化准确度的参数,而在第二种情况下,获得最大化召回率的参数。原则上,最大化这两个不同指标的参数不必相同(当然可以,但也可以不一样,就像这里一样)。
这些方法中哪一个是正确的?
从技术上讲,这两种方法都是正确的;唯一能回答这个问题的是你自己,这与哪种指标更适合你的业务问题有关。
也就是说,无可否认,第一种方法看起来有点奇怪 - 为什么您要在和期间针对两个不同的指标进行优化?至少在原则上,根据您选择的指标优化所有内容会更有意义。RFECV
GridSearchCV
同样,请记住,所有这些技术实际上都是临时方法,背后没有太多理论;最终的判断是实验。所以,如果你对最大化最终模型的准确性感兴趣,但你发现RFECV
试图最大化召回率的中间阶段最终会提供更好的整体准确性,你可能会选择它。 .
推荐阅读
- typo3 - Typo3:显示最后创建的页面
- spring - 为什么我的 spring 应用程序没有正确构建?
- python - 使用 python Github 将本地存储库推送到远程存储库
- python - 如何创建具有不丢失数据(不是 NaN)的特征、值和索引的 DataFrame?
- umbraco - Umbraco 8 - 如何使用 ClientDependency 渲染两个不同的 JS 包 - RenderJsHere()
- python - 为什么在使用 `PIL.ImageFont` 打开 TTF 时出现“`OSError: unknown file format`”?
- php - 亚马逊 v2 上的签名无效
- javascript - 国家按用户选择过滤
- html - 如何访问祖父母 CSS 的背景
- javascript - 向控制器发出请求 - ASP.NET Core