【问题标题】:Confusion matrix, threshold and ROC curve in statsmodel LogItstatsmodel LogIt中的混淆矩阵、阈值和ROC曲线
【发布时间】:2022-06-15 03:10:14
【问题描述】:

问题:我有一个二元分类器,我想使用 statsmodel 对我的数据进行逻辑回归。我想要一些指标,比如 roc 曲线并绘制混淆矩阵。但我观察到 roc 曲线和混淆矩阵之间似乎有些奇怪的差异。这是我第一次使用 statsmodel,因为 Documentationand this one also 信息量不是很大,我不知道该怎么办......

好吧,我在 pandas 中有一个数据集,我将其分为 X_variablesy_variable。更准确地说,X 条目是矩阵 model_matrix,二进制响应是来自我的数据框 df 的列 with_payment。编码:

log_reg = sm.Logit(df[\'with_payment\', model_matrix).fit()

##Adding predictions:
model_matrix[\'pred\'] = log_reg.predict(model_matrix)

究竟返回什么?

我确信对象log_reg 是适合数据框中的模型,它会保留一些信息,例如最佳阈值,因此它可以对数据进行分类。但似乎并非如此,因为 predict 方法对所有内容都返回 0。我的意思是,当数据为 1 时,结果类似于 10^-2,当数据为 0 时,结果类似于 10^-5

我绘制了一条 roc 曲线:

fpr, tpr, thresholds = roc_curve(df[\'with_payment\'], model_matrix[\'pred\'])
roc_auc = auc(fpr, tpr)
print(\"Area under the ROC curve : %f\" % roc_auc)

但是混淆矩阵是......:

model_matrix[\'with_payment\'] = df[\'with_payment\']

prediction= np.round(model_matrix[\'pred\'])
cm = confusion_matrix(model_matrix[\'with_payment\'], prediction)
disp = ConfusionMatrixDisplay(confusion_matrix= cm)
disp.plot()
plt.show()

这样对吗? ROC 曲线就是这样,混淆矩阵是猜测所有内容为标签 = 0 的模型之一,这是否有意义?我的意思是,我的 ROC 曲线不是一个模型的 ROC,它猜测所有东西的 label=0。为什么会出现差异?我相信我在滥用 statsmodel,但我不知道为什么以及在哪里。

我是否需要以某种方式手动输入阈值?为什么 statsmodel 将 0 作为对所有数据的预测?我认为predict 方法会使用优化的阈值,如果不是这样,我应该把阈值放在哪里?

使用的库,以防需要指定: 将熊猫导入为 pd 将 numpy 导入为 np 将 matplotlib.pyplot 导入为 plt 将 statsmodels.api 导入为 sm 从 sklearn.metrics 导入 roc_curve,auc 从 sklearn.metrics 导入混淆矩阵 从 sklearn.metrics 导入 accuracy_score 从 sklearn.metrics 导入 ConfusionMatrixDisplay

  • Logit 中的predict 返回预测概率。将其转换为决策并选择阈值取决于用户,并且取决于在决策中犯不同类型错误的成本。

标签: python pandas logistic-regression statsmodels


【解决方案1】:

好吧,我认为这是因为您的数据不平衡。您的 label=1 与 label=0 的比率为 0.83%。您可以尝试 sklearn 包中的 LogisticRegression 对象。您可以在此处选择指定class_weight='balanced'。我不确定statsmodels 是否也支持这一点。或者,您可以重新采样数据以解决不平衡问题。为此,我强烈建议使用 ìmblearn 包,它是 scitkit-learn 的扩展,可以直接实现。

【讨论】:

    猜你喜欢
    • 2018-12-26
    • 2016-01-15
    • 2018-09-23
    • 2019-12-26
    • 2017-08-29
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多