如何从LogisticRegressionCV和GridSearchCV获得可比较和可重复的结果

我想对不同参数的不同分类器进行评分。

为了加速LogisticRegression,我使用了LogisticRegressionCV(至少快2倍),并计划对其他分类器使用GridSearchCV

但是,虽然它们给出了相同的C参数,但AUC ROC评分却不同。

我会尝试固定许多参数,如scorerrandom_statesolvermax_itertol…请看下面的示例(实际数据无关紧要):

测试数据和公共部分:

from sklearn import datasetsboston = datasets.load_boston()X = boston.datay = boston.targety[y <= y.mean()] = 0; y[y > 0] = 1import numpy as npfrom sklearn.cross_validation import KFoldfrom sklearn.linear_model import LogisticRegressionfrom sklearn.grid_search import GridSearchCVfrom sklearn.linear_model import LogisticRegressionCVfold = KFold(len(y), n_folds=5, shuffle=True, random_state=777)

GridSearchCV

grid = {    'C': np.power(10.0, np.arange(-10, 10))     , 'solver': ['newton-cg']}clf = LogisticRegression(penalty='l2', random_state=777, max_iter=10000, tol=10)gs = GridSearchCV(clf, grid, scoring='roc_auc', cv=fold)gs.fit(X, y)print ('gs.best_score_:', gs.best_score_)

gs.best_score_: 0.939162082194

LogisticRegressionCV

searchCV = LogisticRegressionCV(    Cs=list(np.power(10.0, np.arange(-10, 10)))    ,penalty='l2'    ,scoring='roc_auc'    ,cv=fold    ,random_state=777    ,max_iter=10000    ,fit_intercept=True    ,solver='newton-cg'    ,tol=10)searchCV.fit(X, y)print ('Max auc_roc:', searchCV.scores_[1].max())

Max auc_roc: 0.970588235294

使用newton-cg解算器只是为了提供一个固定值,其他解算器也尝试过。我遗漏了什么?

附注:在两种情况下,我还收到了警告“/usr/lib64/python3.4/site-packages/sklearn/utils/optimize.py:193: UserWarning: Line Search failedwarnings.warn(‘Line Search failed’)”,我也不明白这是什么意思。如果有人能解释一下,我会很高兴,但希望这与我的主要问题无关。

编辑更新

根据@joeln的评论,我还添加了max_iter=10000tol=10参数。这并没有改变结果的任何数字,但警告消失了。


回答:

这是我在scikit-learn问题跟踪器上看到的Tom的回答的副本:

LogisticRegressionCV.scores_给出了所有折叠的得分。GridSearchCV.best_score_给出了所有折叠的平均得分中的最佳值。

为了获得相同的结果,你需要更改你的代码:

print('Max auc_roc:', searchCV.scores_[1].max())  # 是错误的print('Max auc_roc:', searchCV.scores_[1].mean(axis=0).max())  # 是正确的

通过使用默认的tol=1e-4而不是你的tol=10,我得到的结果是:

('gs.best_score_:', 0.939162082193857)('Max auc_roc:', 0.93915947999923843)

剩下的(微小)差异可能是由于LogisticRegressionCV中的热启动(这实际上是它比GridSearchCV更快的原因)。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注