题目
在机器学习二分类问题中,我们通常需要评估模型的性能。假设我们正在开发一个医疗诊断系统,用于判断患者是否患有某种疾病(正类)或健康(负类)。
给定两个整数数组:
- y_true: 真实标签数组,其中 1 表示正类(患病),0 表示负类(健康)
- y_pred: 模型预测结果数组,其中 1 表示预测为正类,0 表示预测为负类
请编写一个函数来计算该分类模型的精确率和召回率(又称为查准率和查全率)。
不允许使用python库函数计算查准率和查全率。发现记零分
背景知识
混淆矩阵
在二分类问题中,预测结果可以分为四种情况:
真正例 (True Positive, TP): 真实为正类,预测为正类
假正例 (False Positive, FP): 真实为负类,预测为正类
真负例 (True Negative, TN): 真实为负类,预测为负类
假负例 (False Negative, FN): 真实为正类,预测为负类
计算公式
-
精确率 (Precision)
含义: 在所有被预测为正类的样本中,真正为正类的比例。衡量模型的"准度"。
Precision = TP / (TP + FP) -
召回率 (Recall)
含义: 在所有真实为正类的样本中,被正确预测为正类的比例。衡量模型的"查全率"。
Recall = TP / (TP + FN)
这道题不是算法相关的,只是我的一个作业。借着本篇的机会,我来说说目前作为大三的我目前的状况吧,这样感觉有点像在写日记,不过又没说csdn上的博客只能发专业相关的内容,当微博发也没人管的着吧!
目前大三,计算机专业,觉得学校专业课没意义,于是一节专业课都没打算上,但是作为补充,我需要在本学期完成三到四个项目,这是作为不上课的交换,我不可能一边不上课,一边混子,这样的生活在中国会相当难受。项目都在初期,但是都搞得我很焦躁,因为都是跟着ai干的,目前没有任何产出,做一件事如果长期没有正反馈是很抑郁的,所以我打算在之后也更新一点博客内容在本账号,如果真有一天项目差不多完结了,或许我还会在b站上分享吧,这都是后话了。
平常还有要准备其他东西,考研的东西啦,英语的啦,大三还谈恋爱了,这些都需要我去花经历经营,就是最近这个干劲好像没有说特别足了,一个人如果能持之以恒地干一件事,那真是特别厉害。
总之生活就是这样,还是做题吧,前面一直在发算法相关的,不知道的真以为是机器人呢哈哈哈哈哈
这道题只需要照着概念复现一边即可,就是python的写法我有点不熟悉。
python
def calc_precision_recall():
python是这样创建函数的,这样单拎一条说感觉这人特别小白,但是没办法,第一时间没想到的东西,就是要重复强调
python
n = int(input())
y_true = list(map(int, input().split()))
y_pred = list(map(int, input().split()))
这样获取数据,注意python注重的空格
input().split()分割得到 ["1","1","1","0","0"](类似这样的)
map把列表里每一个字符串,批量转成整数
list把 map 对象转换成 Python 列表 list
python
for true, pred in zip(y_true, y_pred):
if true == 1 and pred == 1:
TP += 1
elif true == 0 and pred == 1:
FP += 1
elif true == 1 and pred == 0:
FN += 1
zip(y_true, y_pred)y_true 是真实标签列表,y_pred 是预测标签列表。 zip 会成对取出两个数组里位置相同的元素。
true来自y_true pred来自y_pred
其他的没啥好说的。
python
def calc_precision_recall():
# 读取输入
n = int(input())
y_true = list(map(int, input().split()))
y_pred = list(map(int, input().split()))
TP = 0
FP = 0
FN = 0
for true, pred in zip(y_true, y_pred):
if true == 1 and pred == 1:
TP += 1
elif true == 0 and pred == 1:
FP += 1
elif true == 1 and pred == 0:
FN += 1
# 计算精确率,防止分母为0
precision = TP / (TP + FP) if (TP + FP) != 0 else 0.0
# 计算召回率,防止分母为0
recall = TP / (TP + FN) if (TP + FN) != 0 else 0.0
# 格式化输出,保留2位小数,中间用-分隔
print("{0:.2f}-{1:.2f}".format(precision, recall))
calc_precision_recall()