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

时间:2016-03-28 21:04:18

标签: python machine-learning scikit-learn regression logistic-regression

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

对于LogisticRegression的加速,我使用LogisticRegressionCV(至少快2倍)并计划将GridSearchCV用于其他人。

但问题是它给了我相等的C参数,但不是AUC ROC得分。

我会尝试修复许多参数,例如scorerrandom_statesolvermax_itertol ... 请看一下示例(真实数据没有主要内容):

测试数据和公共部分:

from sklearn import datasets
boston = datasets.load_boston()
X = boston.data
y = boston.target
y[y <= y.mean()] = 0; y[y > 0] = 1

import numpy as np
from sklearn.cross_validation import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.grid_search import GridSearchCV
from sklearn.linear_model import LogisticRegressionCV

fold = 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

Solver newton-cg仅用于提供固定值,其他人也尝试过。 我忘记了什么?

P.S。在这两种情况下我都收到警告&#34; /usr/lib64/python3.4/site-packages/sklearn/utils/optimize.py:193:UserWarning:Line Search失败   warnings.warn(&#39;行搜索失败&#39;)&#34;这也是我无法理解的。如果有人也描述了它的意思,我会很高兴,但我希望这与我的主要问题无关。

编辑更新

通过@joeln注释添加max_iter = 10000和tol = 10参数。它不会改变任何数字的结果,但警告消失了。

1 个答案:

答案 0 :(得分:1)

以下是scikit-learn问题跟踪器上answer by Tom的副本:

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

要获得相同的结果,您需要更改代码:

print('Max auc_roc:', searchCV.scores_[1].max())  # is wrong
print('Max auc_roc:', searchCV.scores_[1].mean(axis=0).max())  # is correct

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

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

(小)剩余差异可能来自LogisticRegressionCV的热启动(这实际上是使它比GridSearchCV更快的原因。)