带有阈值python的混淆矩阵

Posted

技术标签:

【中文标题】带有阈值python的混淆矩阵【英文标题】:confusion matrix with threshold python 【发布时间】:2020-02-04 16:04:29 【问题描述】:

如果将阈值在 [0.5,0.6,0.9] 之间更改一次 0.5 和一次 0.6 等等,如何打印逻辑回归的混淆矩阵

from sklearn.linear_model import LogisticRegression
import pandas as pd  
import numpy as np  
import matplotlib.pyplot as plt  

X = [[0.7,0.2],[0.9,0.4]]
y = [1,-1]

model = LogisticRegression()
model = model.fit(X,y)

threshold = [0.5,0.6,0.9]

CM = confusion_matrix(y_true, y_pred)

TN = CM[0][0]
FN = CM[1][0]
TP = CM[1][1]
FP = CM[0][1]

【问题讨论】:

嗨!我不明白你的问题:门槛是什么?您没有在代码中使用变量 threshold 请查看https://***.com/questions/32627926/scikit-changing-the-threshold-to-create-multiple-confusion-matrixes 【参考方案1】:
def predict_y_from_treshold(model,X,treshold):  
    return np.array(list(map(lambda x : 1 if x > treshold else 0,model.predict_proba(X)[:,1])))

【讨论】:

你能澄清一下代码的作用吗?【参考方案2】:

让我们试试这个!

for i in threshold:
   y_predicted = model.predict_proba(X)[:1] > i
   print(confusion_matrix(y, y_predicted))

predict_proba() 返回一个包含两列的 numpy 数组。第一列是目标 = 0 的概率,第二列是目标 = 1 的概率。这就是为什么我们在 predict_proba() 之后添加 [:,1] 以获得 target=1 的概率

【讨论】:

【参考方案3】:

我认为伪代码(基于 python)的一种简单方法是:

1 - 预测一组已知值 (X) y_prob = model.predict_proba(X),因此您将获得 X 中每个输入的概率。

2 - 然后为每个阈值计算输出。即如果 y_prob > 阈值 = 1 否则 0

3 - 现在得到每个向量的混淆矩阵。

如果您需要更深入的解释,请告诉我!

【讨论】:

我们怎样才能找到最好的阈值,然后在那个if条件中使用它:“If y_prob > threshold = 1 else 0” 嗯.. 反复试验,也取决于你在寻找什么。在检测所有阳性或检测所有阴性之间存在这种权衡(如果您说结果始终是第 1 类,您将成功找到所有第 1 类,但您将无法检测到第 -1 类)寻找 auc 作为分类器的指标。

以上是关于带有阈值python的混淆矩阵的主要内容,如果未能解决你的问题,请参考以下文章

机器学习系列模型评价ROC曲线约登指数最佳阈值一个函数中实现约登指数计算并集成到ROC图中,给出默认阈值及最佳阈值下的混淆矩阵

python 一个简单的例子:带有Keras的混淆矩阵flow_from_directory.py

R语言glm拟合logistic回归模型:模型评估(模型预测概率的分组密度图混淆矩阵准确率精确度召回率ROCAUC)PRTPlot函数获取logistic模型最优阈值(改变阈值以优化)

混淆矩阵是什么?Python多分类的混淆矩阵计算及可视化(包含原始混淆矩阵及归一化的混淆矩阵):基于skelarn框架iris数据集

Python使用pandas的crosstab函数计算混淆矩阵并使用Seaborn可视化混淆矩阵实战

python评分卡之LR及混淆矩阵、ROC