我想对不同参数的不同分类器进行评分。
为了加速LogisticRegression
,我使用了LogisticRegressionCV
(至少快2倍),并计划对其他分类器使用GridSearchCV
。
但是,虽然它们给出了相同的C
参数,但AUC ROC
评分却不同。
我会尝试固定许多参数,如scorer
、random_state
、solver
、max_iter
、tol
…请看下面的示例(实际数据无关紧要):
测试数据和公共部分:
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=10000
和tol=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
更快的原因)。