研究随着分类阈值的变化,精确率和召回率的变化

第一部分:导包

#第一部分:导包
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_score
from sklearn.metrics import recall_score

precision_scores = []
recall_scores = []
thresholds = np.sort(decision_scores)
for threshold in thresholds:
    y_predict = np.array(decision_scores >= threshold, dtype='int')
    precision = precision_score(y_test, y_predict)
    recall = recall_score(y_test, y_predict)
    precision_scores.append(precision)
    recall_scores.append(recall)

第七部分:绘图展示所有精确率和召回率的变化曲线

#第七部分:绘制以上得到的不同精确率和召回率情况
import matplotlib.pyplot as plt
plt.plot(thresholds, precision_scores, color='r', label="Precision")
plt.plot(thresholds, recall_scores, color='b', label="Recall")
plt.legend()
plt.show()#横坐标是分类阈值,纵坐标是精确率和召回率的值

第八部分:完整pycharm代码汇总

#第一部分:导包
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_score
from sklearn.metrics import recall_score

precision_scores = []
recall_scores = []
thresholds = np.sort(decision_scores)
for threshold in thresholds:
    y_predict = np.array(decision_scores >= threshold, dtype='int')
    precision = precision_score(y_test, y_predict)
    recall = recall_score(y_test, y_predict)
    precision_scores.append(precision)
    recall_scores.append(recall)
#第七部分:绘制以上得到的不同精确率和召回率情况
import matplotlib.pyplot as plt
plt.plot(thresholds, precision_scores, color='r', label="Precision")
plt.plot(thresholds, recall_scores, color='b', label="Recall")
plt.legend()
plt.show()#横坐标是分类阈值,纵坐标是精确率和召回率的值

横坐标是分裂阈值,纵坐标是精确率和召回率的变化曲线。

第九部分:我们也可以优化第六部分和第七部分的代码,通过sklearn-learn调用函数计算精确率和召回率并绘制图像

在第七部分绘图中,我们不能取精确率和召回率集合中的最后一个值,那个是自动补充的一个数作为结束标志。

# 第六部分:获取精确率,召回率和置信区间
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(thresholds, precision_scores[:-1], color='r', label="Precision")
plt.plot(thresholds, recall_scores[:-1], color='b', label="Recall")
plt.xlabel('Threshold')
plt.ylabel('Score')
plt.legend()
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(thresholds, precision_scores[:-1], color='r', label="Precision")
plt.plot(thresholds, recall_scores[:-1], color='b', label="Recall")
plt.xlabel('Threshold')
plt.ylabel('Score')
plt.legend()
plt.show()  # 横坐标是分类阈值,纵坐标是精确率和召回率的值


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还不秃顶的计科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值