为什么 GridSearchCV 在逻辑回归中得分 roc_auc 时不给出 AUC 最高的 C
Why doesn't GridSearchCV give C with highest AUC when scoring roc_auc in logistic regression
我是新手,如果这很明显,我深表歉意。
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 值
I 运行 并得到 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)
是训练数据集上的分数(网格搜索在选择最佳参数后在整个数据集上重新拟合模型),你不想用它来评估你的模型。这也不是网格搜索在其模型选择中内部使用的,而是使用交叉验证的折叠并取平均值。您可以使用 clf.best_score_
.
访问模型选择中使用的实际分数
我是新手,如果这很明显,我深表歉意。
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 值
I 运行 并得到 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)
是训练数据集上的分数(网格搜索在选择最佳参数后在整个数据集上重新拟合模型),你不想用它来评估你的模型。这也不是网格搜索在其模型选择中内部使用的,而是使用交叉验证的折叠并取平均值。您可以使用 clf.best_score_
.