分类评估方法-混淆矩阵、精确率、召回率、F1值
本文会介绍机器学习中分类模型的评估方法
提问:分类模型能用准确率来评测吗?
答案:可以,但是结果不准确,拿逻辑回归模型进行举例,其主要用于二分类,即:A类还是B类,弱准确率是97%;不能说97%A类,3%的B类
所以要通过混淆矩阵来测评,即:精确率,召回率,F1,ROC,AUC
一、混淆矩阵的定义
| 真实结果 \ 预测结果 | 正例 | 假例 |
|---|---|---|
| 正例 | 真正例TP | 伪反例FN |
| 假例 | 伪正例FP | 真反例TN |
混淆矩阵四个指标
- 真实值是正例的样本中,被分类为正例的样本数量,叫做真正例(TP,True Positive)
- 真实值是正例的样本中,被分类为假例的样本数量,叫做伪反例(FN,False Negative)
- 真实值是假例的样本中,被分类为正例的样本数量,叫做伪正例(FP,False Positive)
- 真实值是假例的样本中,被分类为假例的样本数量,叫做真反例(TN,True Negative)
二、精确率(Precision)的定义
- 查准率,对正例样本的预测准确率。比如:把恶性肿瘤当做正例样本,想知道模型对恶性肿瘤的预测准确率。
- 计算方法:
\[P = \frac{TP}{TP+FP}
\]
三、召回率(Recall)的定义
- 也叫查全率,指的是预测为真正例样本占所有真实正例样本的比重。
例如:恶性肿瘤当做正例样本,则我们想知道模型是否能把所有的恶性肿瘤患者都预测出来。 - 计算方法:
\[\text{Recall} = \frac{TP}{TP+FN}
\]
四、F1-score的定义
- 若对模型的精确率、召回率都有要求,希望知道模型在这两个评估方向的综合预测能力,可以使用F1分数。
- 计算方法:
\[F1 = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision}+\text{Recall}}
\]
五、代码实现
加载相应的库
import pandas as pd
from sklearn.metrics import confusion_matrix, precision_score, f1_score, recall_score
1. 定义变量,记录:样本数据
y_train = ["恶性", "恶性", "恶性", "恶性", "恶性", "恶性", "良性", "良性", "良性", "良性"]
2. 定义变量,记录:模型A的预测结果
y_pred_A = ["恶性", "恶性", "恶性", "良性", "良性", "良性", "良性", "良性", "良性", "良性"]
3.标签正例和反例
label = ['恶性','良性']
df_label = ['恶性(正例)','良性(反例)']
4. 针对于 真实值(y_train)和模型A的预测结果(y_pred_A),搭建混淆矩阵
cm_A = confusion_matrix(y_train, y_pred_A)
print(f'混淆矩阵A:\n{cm_A}')
5.为了测试结果更好看,吧上述的混淆矩阵转换成DataFrame
df_A = pd.DataFrame(cm_A,index=df_label,columns=df_label)
print(f'混淆矩阵的DataFrame形式:\n{df_A}')
6. 计算A模型的精确率,召回率,F1值
print(f'模型A精确率:{precision_score(y_train,y_pred_A,pos_label='恶性')}')
print(f'模型A召回率:{recall_score(y_train,y_pred_A,pos_label='恶性')}')
print(f'模型A F1值:{f1_score(y_train,y_pred_A,pos_label='恶性')}')

浙公网安备 33010602011771号