我已经测试了各种特征选择方法,例如 F 检验、互信息和额外树(额外随机)森林分类器 (ETC) 以及 PCA(技术上是一种特征提取方法),使用 ETC仅用于特征选择而不是作为分类器,随后结合 GridSearch 和来自精彩 scikit-learn Python 包的管道对我的模型进行了 10 倍交叉验证,这些模型是随机森林、SVM、KNN 和逻辑回归。
这样做后,我发现当使用 Extra Tree Classifier 作为特征选择器时,验证集的平均 AUC 得分是模型中最高的,SVM 表现特别好,其余的都可以,除了逻辑回归,它的表现明显不佳与其他模型相比,逻辑回归和 ETC 的平均 AUC 为 0.4761。奇怪的是,在执行 GridSearchCV 时捕获的性能最佳的排列涉及使用惩罚,, 和选定的特征. 由于每个模型都执行了数千次排列,这意味着一些验证 AUC 分数在 0.4 和 0.3 的范围内,鉴于大多数在线资源都指出,这是非常不寻常的 ,这是有道理的。
但是,其他来源确实说明了这是由于机器在执行算法时产生的分类错误,解决这个问题的一种直接方法是而其他人则表示表明分类器模型比完全随机分类的模型更差,这就是我产生困惑的地方。到目前为止,我采用了从 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 倾向于捕捉变量之间非常复杂的高度非线性关系,这可以解释为什么逻辑回归(自然是线性模型(?))与其他模型相比表现不佳。如果有帮助,我的混淆矩阵如下:

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