我是新手,如果这很明显就道歉。
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
我想运行Logistic回归 - 我使用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 - 是我应该看的地方吗?
此外,并非完全相关,但在我发布时 - 我还没有为此做任何数据规范化。这对Logistic回归来说是正常的吗?
答案 0 :(得分:1)
clf.score(X, Y)
是训练数据集上的分数(gridsearch在选择最佳参数后对整个数据集进行模型修改),您不希望使用它来评估您的模型。这也不是gridsearch在其模型选择中内部使用的内容,而是使用交叉验证的折叠并取平均值。您可以使用clf.best_score_
访问模型选择中使用的实际分数。