为啥在逻辑回归中对 roc_auc 进行评分时,GridSearchCV 不给出具有最高 AUC 的 C
Posted
技术标签:
【中文标题】为啥在逻辑回归中对 roc_auc 进行评分时,GridSearchCV 不给出具有最高 AUC 的 C【英文标题】:Why doesn't GridSearchCV give C with highest AUC when scoring roc_auc in logistic regression为什么在逻辑回归中对 roc_auc 进行评分时,GridSearchCV 不给出具有最高 AUC 的 C 【发布时间】:2017-04-01 18:14:33 【问题描述】:如果这很明显,我对此很抱歉。
lr = LogisticRegression(penalty = 'l1')
parameters = 'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]
clf = GridSearchCV(lr, parameters, scoring='roc_auc', cv = 5)
clf.fit(X, Y)
print clf.score(X, Y)
tn, fp, fn, tp = metrics.confusion_matrix(Y, clf.predict(X)).ravel()
print tn, fp, fn, tp
我想运行逻辑回归 - 我正在使用 L1 惩罚,因为我想减少我使用的功能数量。我正在使用 GridSearchCV 为 Logistic 回归找到最佳 C 值
我运行它并得到 C = 0.001,AUC = 0.59,混淆矩阵:46、0、35、0。只有 1 个特征具有非零系数。 我回到我的代码并从我的参数列表中删除 C = 0.001 的选项并再次运行它。 现在我得到 C = 1,AUC = 0.95,混淆矩阵:42、4、6、29。许多(但不是全部)特征具有非零系数。
我认为既然我的得分是“roc_auc”,那么不应该用更好的 AUC 创建模型吗?
认为这可能与我的 l1 惩罚有关,我将其切换为 l2。但这给出了 C = 0.001, AUC = 0.80, CM = 42,4,16,19,当我删除 C = 0.001 作为选项时,它再次给出 C = 0.01, AUC = 0.88, CM = 41,5,13,22 .
l2 惩罚的问题较少,但 l1 似乎有很大的不同。是惩罚吗?
从我的一些阅读资料中,我知道 ElasticNet 应该结合一些 l1 和 l2 - 这是我应该寻找的地方吗?
另外,不完全相关,但在我发布时 - 我没有为此进行任何数据规范化。这对逻辑回归来说是正常的吗?
【问题讨论】:
【参考方案1】:clf.score(X, Y)
是训练数据集上的分数(gridsearch 在选择最佳参数后会在整个数据集上重新拟合模型),您不想使用它来评估您的模型。这也不是 gridsearch 在其模型选择内部使用的,而是使用交叉验证的折叠并取平均值。您可以通过clf.best_score_
访问模型选择中使用的实际分数。
【讨论】:
所以让我看看我是否理解。评分集为“roc_auc”时,我用来评估模型的 clf.score(X,Y) 实际上报告了训练集上的 AUC。但是,如果我用 print clf.best_score 替换该行,那将报告交叉验证折叠内测试集中的最佳 AUC?这是对模型的合理评估吗? 如果我使用的是训练和测试集,我会使用 clf.fit(X_train, Y_train) 然后使用 clf.score(X_test, Y_test) 这将是一个比 clf 更正确的评估。 best_score_? 是的,您现在理解正确,尽管您是否想使用交叉验证或训练/测试拆分来评估您的模型是一个悬而未决的问题;如果你只有一个小数据集,最好使用交叉验证/best_score_
,这样你就可以在整个数据集上训练你的模型;如果您有更多数据,我最好将其拆分为训练/测试(最好使用时间戳进行排序)以制作更真实的测试情况。以上是关于为啥在逻辑回归中对 roc_auc 进行评分时,GridSearchCV 不给出具有最高 AUC 的 C的主要内容,如果未能解决你的问题,请参考以下文章