逻辑回归的 AUC 分数小于 0.5

机器算法验证 机器学习 物流 scikit-学习 奥克
2022-03-17 09:10:21

我已经测试了各种特征选择方法,例如 F 检验、互信息和额外树(额外随机)森林分类器 (ETC) 以及 PCA(技术上是一种特征提取方法),使用 ETC仅用于特征选择而不是作为分类器,随后结合 GridSearch 和来自精彩 scikit-learn Python 包的管道对我的模型进行了 10 倍交叉验证,这些模型是随机森林、SVM、KNN 和逻辑回归。

这样做后,我发现当使用 Extra Tree Classifier 作为特征选择器时,验证集的平均 AUC 得分是模型中最高的,SVM 表现特别好,其余的都可以,除了逻辑回归,它的表现明显不佳与其他模型相比,逻辑回归和 ETC 的平均 AUC 为 0.4761。奇怪的是,在执行 GridSearchCV 时捕获的性能最佳的排列涉及使用L1惩罚,C=0.1, 和选定的特征n=20. 由于每个模型都执行了数千次排列,这意味着一些验证 AUC 分数在 0.4 和 0.3 的范围内,鉴于大多数在线资源都指出,这是非常不寻常的 0.5AUC1,这是有道理的。

但是,其他来源确实说明了AUC<0.5这是由于机器在执行算法时产生的分类错误,解决这个问题的一种直接方法是1AUC,而其他人则表示AUC<0.5表明分类器模型比完全随机分类的模型更差,这就是我产生困惑的地方。到目前为止,我采用了从 1 中减去 AUC 的启发式方法,但我对此非常怀疑,因为它可能过于启发式而无法有效。我当前的逻辑回归代码如下所示

def logistic(data, outcome):

X_test, y_test = data, outcome

pipe = Pipeline([('a', RFE(ExtraTreesClassifier(n_estimators=400),20,step=1000)),('b',LogisticRegression(C=100))])
pipe.fit(X_train, y_train)
auc_score = roc_auc_score(y_test, pipe.predict_proba(X_test)[:,1]))

if auc_score < 0.5:
    fpr_svc, tpr_svc, _ = roc_curve(y_test, pipe.predict_proba(X_test)[:,1], pos_label=0)
    auc_score = 1 - auc_score
else:
    fpr_svc, tpr_svc, _ = roc_curve(y_test, pipe.predict_proba(X_test)[:,1])

print("Test set AUC: {:.3f}".format(auc_score))   

plt.plot(fpr_svc, tpr_svc, label='ROC Curve', color='cyan')
plt.plot([0,1], [0,1], color='black', linestyle='--')
plt.xlim([0,1])
plt.ylim([0,1])
plt.show()

default_prob = pipe.predict_proba(X_test)[:,1]
confusion_mat = confusion_matrix(y_test, pipe.predict(X_test))
results = classification_report(y_test, pipe.predict(X_test))

print(results)

f,ax=plt.subplots(figsize=(7,6))
sn.heatmap(confusion_mat,ax=ax,annot=True)
plt.show()

return default_prob, confusion_mat

可以看出,我创建了一个简单的 if 语句,如果 AUC 小于 0.5,我从 1 中减去它,这也是为 ROC 曲线图完成的,因为我会得到一个逆(或凸)ROC曲线而不是凹曲线。在此之前,将我的测试数据输入到函数中时,我偶尔会产生大于 0.5 的测试 AUC 分数,这导致了正常的凹 ROC 曲线,但主要是在 0.4 左右或低至 0.3。

在此处输入图像描述

左图对应的 AUC 得分为 0.629,而右图对应的 AUC 得分为 0.401。

因此,有谁知道 ETC 和逻辑回归相结合的这种不稳定和异常低的 AUC 分数可能是什么原因?根据我在网上阅读的内容,ETC 倾向于捕捉变量之间非常复杂的高度非线性关系,这可以解释为什么逻辑回归(自然是线性模型(?))与其他模型相比表现不佳。如果有帮助,我的混淆矩阵如下: 在此处输入图像描述

我非常感谢任何人的任何形式的投入或帮助。

1个回答

更新:Sycorax 在评论中发布了以下链接:随机森林可以用于多元线性回归中的特征选择吗?处理这个问题并描述了为什么这可能不能很好地工作。

类似的解释:您的数据/模型可能会遭受维度诅咒,因为逻辑回归很容易陷入这种诅咒


几点:(可能是有足够声誉的评论)

pipe.fit(X_train, y_train)

你在哪里定义训练数据?

您是否尝试class_weight="balanced"过逻辑回归?这可能会产生不同的错误分类率。

RFE没有步骤的结果是什么?