【发布时间】:2016-07-16 05:35:54
【问题描述】:
我想用不同的参数对不同的分类器进行评分。
为了提高 LogisticRegression 的速度,我使用 LogisticRegressionCV(至少快 2 倍)并计划为其他人使用 GridSearchCV。
但问题是它给了我相等的C 参数,而不是AUC ROC 评分。
我会尝试修复许多参数,例如scorer、random_state、solver、max_iter、tol...
请看例子(真实数据无所谓):
测试数据和公共部分:
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())
最大 auc_roc:0.970588235294
Solver newton-cg 只是用来提供固定值,其他的也试过了。
我忘记了什么?
附:在这两种情况下,我也收到警告“/usr/lib64/python3.4/site-packages/sklearn/utils/optimize.py:193: UserWarning: Line Search failed warnings.warn('Line Search failed')" 我也无法理解。如果有人也描述它的含义,我会很高兴,但我希望它与我的主要问题无关。 p>
编辑更新
通过@joeln 评论添加max_iter=10000 和tol=10 参数。它不会改变任何数字的结果,但警告消失了。
【问题讨论】:
-
只是为了确定,你能减少
tol并提供同样大的max_iter到LogisticRegression吗?如果它们正在求解相同的方程并达到不同的最小值,则可能是因为它过早地停止了搜索。 -
谢谢。我添加 max_iter=10000 和 tol=10 (不确定这是什么意思)并正确的问题。它不会改变任何数字的结果。
-
很好奇。我建议减少而不是增加
tol,其默认值为 1e-4。在围绕目标函数的最小值进行搜索(如在牛顿法中)时,tol定义了足够接近零的小变化,表明已找到最小值。较小的tol确保具有不同初始化的优化更有可能达成一致。我不确定,但我认为你应该在 scikit-learn 跟踪器上提出这个问题。LogisticRegressionCV相对较新,可能有一些事情需要解决或更好地记录。您可能需要提供一些发生这种效果的数据。 -
抱歉
tol值。你建议什么价值?不幸的是,我是 ML 中的新手,也不确定......什么涉及数据 - 我的问题示例尤其基于嵌入在波士顿的 sklearn 中的示例值和完全可重现!所以,我希望任何人只要复制、粘贴和运行它就会收到完全相同的结果。 -
哈哈抱歉,我没有注意到您是如何从
LogisticRegressionCV打印乐谱的。这似乎是错误的主要来源。
标签: python machine-learning scikit-learn regression logistic-regression