【发布时间】:2022-06-15 03:10:14
【问题描述】:
问题:我有一个二元分类器,我想使用 statsmodel 对我的数据进行逻辑回归。我想要一些指标,比如 roc 曲线并绘制混淆矩阵。但我观察到 roc 曲线和混淆矩阵之间似乎有些奇怪的差异。这是我第一次使用 statsmodel,因为 Documentation、and this one also 信息量不是很大,我不知道该怎么办......
好吧,我在 pandas 中有一个数据集,我将其分为 X_variables 和 y_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