如果这很明显,我是新手,所以很抱歉。
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/