我们先来研究:不同分类阈值下,模型的“精确率”和“召回率”变化情况:
可以见我博客:研究随着分类阈值的变化,精确率和召回率的变化-CSDN博客
绘图展示的效果为:
横坐标为分类阈值,纵坐标为精确率和召回率的变化情况。
(1)第一部分:PR曲线
也就是绘制的图像横坐标是precision精确率,纵坐标是recall召回率。
也就是将上述第七部分代码替换如下:
import matplotlib.pyplot as plt
plt.plot(recall_scores, precision_scores)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.show()
完整代码:
#第一部分:导包
import numpy as np
from sklearn import datasets
#第二部分:加载数据集
iris=datasets.load_iris()
X=iris.data
y=iris.target
#第三部分:分割数据集
#为了简化问题,我们将其转化为二分类问题
y[y!=0]=1
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=666)
#第四部分:训练模型
logreg=LogisticRegression()
logreg.fit(X_train,y_train)
y_pred=logreg.predict(X_test)
#print(y_pred)
#第五部分:获取每一个测试集元素的置信分数
decision_scores=logreg.decision_function(X_test)
#print(decision_scores)正常情况下,我们是以0为分类标准,大于0分类为1,小于0分类为0
# 第六部分:获取精确率,召回率和置信区间
from sklearn.metrics import precision_recall_curve
# 使用 precision_recall_curve 获取不同阈值下的精确率和召回率
precision_scores, recall_scores, thresholds = precision_recall_curve(y_test, decision_scores)
# 第七部分:绘制以上得到的不同精确率和召回率情况
import matplotlib.pyplot as plt
# 绘制精确率和召回率曲线
plt.plot(recall_scores, precision_scores)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.show()
也可以看到,最优情况的时候,recall和precision都能够达到1
(2)第二部分:ROC曲线
我们现在给recall换个名字:叫做TPR
以疫情检测核酸为例:
那么:
TPR:就是阳性患者里面被误检的概率
FPR:就是代表的是阴性患者里面被误检的概率
下面是代码实现ROC曲线的核心代码:
# 第六部分:获取精确率,召回率和置信区间
from sklearn.metrics import roc_curve
fpr,tpr,threshold=roc_curve(y_test,decision_scores)
# 第七部分:绘制以上得到的不同精确率和召回率情况
import matplotlib.pyplot as plt
# 绘制精确率和召回率曲线
plt.plot(fpr, tpr)
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()
完整代码如下:
#第一部分:导包
import numpy as np
from sklearn import datasets
#第二部分:加载数据集
iris=datasets.load_iris()
X=iris.data
y=iris.target
#第三部分:分割数据集
#为了简化问题,我们将其转化为二分类问题
y[y!=0]=1
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=666)
#第四部分:训练模型
logreg=LogisticRegression()
logreg.fit(X_train,y_train)
y_pred=logreg.predict(X_test)
#print(y_pred)
#第五部分:获取每一个测试集元素的置信分数
decision_scores=logreg.decision_function(X_test)
#print(decision_scores)正常情况下,我们是以0为分类标准,大于0分类为1,小于0分类为0
# 第六部分:获取精确率,召回率和置信区间
from sklearn.metrics import roc_curve
fpr,tpr,threshold=roc_curve(y_test,decision_scores)
# 第七部分:绘制以上得到的不同精确率和召回率情况
import matplotlib.pyplot as plt
# 绘制精确率和召回率曲线
plt.plot(fpr, tpr)
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()
分析图像:
这个点FPR=0,TPR=1,代表的就是所有反例中没有错误,所有正例中全部正确,最终得到的就是本次检验全部数据都检测的正确。
(3)第三部分:AUC(area under curve)
也就是上述第二部分ROC曲线下面的这块区域的大小,面积越大,roc越高,分类模型越好:
#第八部分:绘制auc曲线
from sklearn.metrics import roc_auc_score
auc=roc_auc_score(y_test,decision_scores)
print(auc)
完整代码:
#第一部分:导包
import numpy as np
from sklearn import datasets
#第二部分:加载数据集
iris=datasets.load_iris()
X=iris.data
y=iris.target
#第三部分:分割数据集
#为了简化问题,我们将其转化为二分类问题
y[y!=0]=1
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=666)
#第四部分:训练模型
logreg=LogisticRegression()
logreg.fit(X_train,y_train)
y_pred=logreg.predict(X_test)
#print(y_pred)
#第五部分:获取每一个测试集元素的置信分数
decision_scores=logreg.decision_function(X_test)
#print(decision_scores)正常情况下,我们是以0为分类标准,大于0分类为1,小于0分类为0
# 第六部分:获取精确率,召回率和置信区间
from sklearn.metrics import roc_curve
fpr,tpr,threshold=roc_curve(y_test,decision_scores)
# 第七部分:绘制以上得到的不同精确率和召回率情况
import matplotlib.pyplot as plt
# 绘制精确率和召回率曲线
plt.plot(fpr, tpr)
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()
#第八部分:绘制auc曲线
from sklearn.metrics import roc_auc_score
auc=roc_auc_score(y_test,decision_scores)
print(auc)
auc取值最大值也就是1,代表正确率为100%