python机器学习(02-混淆矩阵及精确率_召回率_F1值计算)

"""

案例:

演示 逻辑回归模型的 评估方式, 即: 精确率, 召回率, F1值.

混淆矩阵解释:

概述:

用来描述 真实值(样本值)中 正例, 反例 和 预测值的正例, 反例的关系的.

名词解释:

真正例(TP, True Positive): 样本值 => 正例, 预测值 => 正例

伪正例(FP, False Positive): 样本值 => 假例, 预测值 => 正例

伪反例(FN, False Negative): 样本值 => 正例, 预测值 => 假例

真反例(TN, True Negative): 样本值 => 假例, 预测值 => 假例

细节:

TP + FP + FN + TN = 样本总数

逻辑回归模型 评估:

方式1: 正确率(准确率)

计算规则: 预测的真实结果 / 样本总数

方式2: 精确率(Precision)

计算规则: tp / (tp + fp)

方式3: 召回率(Recall), 也叫: 查全率 => 预测出的正例 在所有正例中的 占比

计算规则: tp / (tp + fn)

方式4: F1-Score, 简称叫: F1值, 如果对于 精确率 和 召回率都有要求, 则可以直接计算F1值.

计算规则: 2 * 精确率 * 召回率 / (精确率 + 召回率)

方式5: AUC值(了解)

方式6: ROC曲线(了解)

"""

导包

import pandas as pd

from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score

1. 准备 样本集(10条), 6个 => 恶性肿瘤, 4个 => 良性肿瘤. 即: 训练集的标签.

y_train = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']

2. 准备标签.

label = ['恶性', '良性']

dataframe_label = ['恶性(正例)', '良性(假例)']

3. 准备预测值, 即: 模型A => 预测对了3个恶性肿瘤, 预测对了4个良性肿瘤.

y_predict_A = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']

4. 准备预测值, 即: 模型B => 预测对了6个恶性肿瘤, 预测对了1个良性肿瘤.

y_predict_B = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性']

5. 基于模型A, 构建: 混淆矩阵(confusion_matrix)

参1: 真实值, 参2: 预测值, 参3: 模型标签

confusion_matrix_A = confusion_matrix(y_train, y_predict_A, labels=label)

print(f'混淆矩阵A: \n {confusion_matrix_A}')

6. 把上述的混淆矩阵, 转成 DataFrame即可.

df_A = pd.DataFrame(confusion_matrix_A, index=dataframe_label, columns=dataframe_label)

print(f'DataFrame对象A: \n {df_A}')

7. 基于模型B, 构建: 混淆矩阵(confusion_matrix), 然后转成DF对象.

confusion_matrix_B = confusion_matrix(y_train, y_predict_B, labels=label)

print(f'混淆矩阵B: \n {confusion_matrix_B}')

把上述的混淆矩阵, 转成 DataFrame即可.

df_B = pd.DataFrame(confusion_matrix_B, index=dataframe_label, columns=dataframe_label)

print(f'DataFrame对象B: \n {df_B}')

8. 分别计算 模型A 和 模型B的 精确率

参1: 真实值, 参2: 预测值, 参3: 正例标签

print(f'模型A的精确率: {precision_score(y_train, y_predict_A, pos_label="恶性")}') # 1.0

print(f'模型B的精确率: {precision_score(y_train, y_predict_B, pos_label="恶性")}') # 0.6666666666666666

9. 分别计算 模型A 和 模型B的 召回率

print(f'模型A的召回率(查全率): {recall_score(y_train, y_predict_A, pos_label="恶性")}') # 1.0

print(f'模型B的召回率(查全率): {recall_score(y_train, y_predict_B, pos_label="恶性")}') # 0.6666666666666666

10. 分别计算 模型A 和 模型B的 F1值.

print(f'模型A的F1-Score(F1值): {f1_score(y_train, y_predict_A, pos_label="恶性")}') # 0.6666666666666666

print(f'模型B的F1-Score(F1值): {f1_score(y_train, y_predict_B, pos_label="恶性")}') # 0.8

相关推荐
学习是种信仰几秒前
复现conda环境及Python 项目路径(PYTHONPATH)问题——基于Ubuntu
python·ubuntu·conda
AI玫瑰助手3 分钟前
Python流程控制:if-else与if-elif-else嵌套使用
开发语言·python·信息可视化
贵州晓智信息科技8 分钟前
学词鸭 Typing 无痛背单词
人工智能·pytorch·python·深度学习
茗创科技12 分钟前
IEEE子刊|利用最优数量EEG电极实时检测认知负荷的深度学习技术
深度学习·机器学习·matlab·脑网络
折哥的程序人生 · 物流技术专研17 分钟前
出版社物流WMS智能调度实战:从架构升级到机器学习落地
人工智能·机器学习·架构·人机交互
清水白石00820 分钟前
从手写初始化到 pytest fixture:让 Python 测试既干净、可复用,又能驾驭异步并发
开发语言·python·pytest
人工智能培训25 分钟前
集中式与分布式智能:单个复杂智能体 vs. 多个简单智能体协同
大数据·人工智能·机器学习·计算机视觉·知识图谱
贫民窟的勇敢爷们25 分钟前
Scikit-learn机器学习项目:从入门到实战的价值与实践
python·机器学习·scikit-learn
专注VB编程开发20年28 分钟前
专业分析python底层调用与按键精灵,ah3等的对比,hookdll,内存加载,调用.net dll
开发语言·javascript·python·microsoft·php·.net