如何从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

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

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