scikit-learn - 为什么在逻辑回归中对 roc_auc 进行评分时,GridSearchCV 不给出具有最高 AUC 的 C

标签 scikit-learn logistic-regression grid-search

如果这很明显,我是新手,所以很抱歉。

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 来找到逻辑回归的最佳 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 - 那是我应该寻找的地方吗?

此外,不完全相关,但在我发布时 - 我没有为此做过任何数据规范化。这对逻辑回归来说是正常的吗?

最佳答案

clf.score(X, Y)是训练数据集的分数(gridsearch 在选择最佳参数后在整个数据集上重新拟合模型),您不想使用它来评估您的模型。这也不是 gridsearch 在其模型选择中内部使用的,而是使用交叉验证的折叠并取平均值。您可以使用 clf.best_score_ 访问模型选择中使用的实际分数。 .

关于scikit-learn - 为什么在逻辑回归中对 roc_auc 进行评分时,GridSearchCV 不给出具有最高 AUC 的 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40667856/

相关文章:

python - 在不使用 "internal"API 的情况下获取 scikit-learn PCA 上的组件

python - TensorFlow 中特定的线性分类器 : input element as vector

python-3.x - 什么是 _passthrough_scorer 以及如何更改 GridsearchCV (sklearn) 中的记分器?

python - GridsearchCV 和 Kfold 交叉验证

python - 如何使用 train_test_split 在交叉验证中保持测试大小不变?

python - preprocessing.scale() 做什么?它是如何工作的?

python - 我可以用特定的数据集替换 'make_blobs' 吗?

python - 保存 Spark 模型摘要

r - 逻辑回归混淆矩阵问题

python - 使用 Scikit-Learn GridSearchCV 与 PredefinedSplit 进行交叉验证 - 交叉验证结果非常好