【scikit-learn基础】--『回归模型评估』之准确率分析
分类模型
的评估和
回归模型
的评估侧重点不一样,
回归模型
一般针对连续型的数据,而
分类模型
一般针对的是离散的数据。
所以,评估
分类模型
时,评估指标与
回归模型
也很不一样,
比如,分类模型的评估指标通常包括
准确率
、
精确率
、
召回率
和
F1分数
等等。
而
回归模型
的评估指标通常包括
均方误差
(MSE)、
均方根误差
(RMSE)和
平均绝对误差
(MAE)等等,
不过,这些指标衡量的都是预测值与真实值之间的数值差异。
关于
回归模型
的评估,可以参考之前的文章,本篇开始,主要讨论
分类模型
的评估。
1. 准确率分数
准确率分数
(
accuracy score
)代表了模型正确分类的样本比例,它能够直观地反映出模型在分类任务上的准确度。
不过,在处理不平衡数据集时,需要注意的是,
准确率分数
并不能完全反映模型的性能。
1.1. 计算公式
\(\texttt{accuracy}(y, \hat{y}) = \frac{1}{n} \sum_{i=0}^{n-1} 1(\hat{y}_i = y_i)\)
其中,
\(n\)
是样本数量,
\(y_i\)
是真实值,
\(\hat{y_i}\)
是预测值。
1.2. 使用示例
from sklearn.metrics import accuracy_score
import numpy as np
n = 100
y_true = np.random.randint(1, 10, n)
y_pred = np.random.randint(1, 10, n)
s1 = accuracy_score(y_true, y_pred)
s2 = accuracy_score(y_true, y_pred, normalize=False)
print("准确率比例:{},准确率计数:{}".format(s1, s2))
# 运行结果
准确率比例:0.16,准确率计数:16
上例中,
预测值
和
真实值
是随机生成的,所以你的运行结果不一定和我这个一样。
accuracy_score
默认是计算正确的
比率
,如果加上参数
normalize=False
,则计算正确的
数量
。
2. top-k 准确率分数
top-k 准确率分数
(
top-k accuracy score
)用于衡量模型在前
k
个预测结果中的正确率。
不同的
k
值会得到不同的
top-k准确率
,这可以帮助我们更全面地了解模型的性能。
2.1. 计算公式
\(\texttt{top-k accuracy}(y, \hat{f}) = \frac{1}{n} \sum_{i=0}^{n-1} \sum_{j=1}^{k} 1(\hat{f}_{i,j} = y_i)\)
其中,
\(n\)
是样本数量,
\(y_i\)
是真实值,
\(\hat{f}_{i,j}\)
是对应于第
\(j\)
最大预测分数的第
\(i\)
样本的预测类别。
\(k\)
是允许的猜测次数,
\(1(x)\)
是指示函数。
关于指示函数是什么,可以参考:
https://en.wikipedia.org/wiki/Indicator_function
2.2. 使用示例
from sklearn.metrics import top_k_accuracy_score
import numpy as np
n = 100
y_true = np.random.randint(1, 10, n)
y_score = np.random.rand(n, 9)
s1 = top_k_accuracy_score(y_true, y_score, k=2)
s2 = top_k_accuracy_score(y_true, y_score, k=2, normalize=False)
print("top-k 准确率比例:{},top-k 准确率计数:{}".format(s1, s2))
# 运行结果
top-k 准确率比例:0.23,top-k 准确率计数:23
top-k 准确率分数
计算时,不是用真实值和预测值,用的是
真实值
和
top-k中预测值
的正确率。
3. 平衡准确率分数
平衡准确率分数
(
balanced accuracy score
)特别适用于针对不平衡数据集时的性能评估,
它可以避免某一类样本的预测性能被过度夸大,从而能够更准确地评估模型的性能。
不过,
平衡准确率
适用于二元分类问题,对于多类分类问题可能需要使用其他扩展的平衡性能指标进行评估。
3.1. 计算公式
\(\texttt{balanced-accuracy}(y, \hat{y}, w) = \frac{1}{\sum{\hat{w}_i}} \sum_i 1(\hat{y}_i = y_i) \hat{w}_i\)
其中,
\(n\)
是样本数量,
\(y_i\)
是真实值,
\(\hat{y_i}\)
是预测值。
而
\(\hat{w}_i = \frac{w_i}{\sum_j{1(y_j = y_i) w_j}}\)
,
\(1(x)\)
是指示函数,
\(w_i\)
是对应的样本权重。
3.2. 使用示例
from sklearn.metrics import balanced_accuracy_score
import numpy as np
n = 100
y_true = np.random.randint(1, 10, n)
y_pred = np.random.randint(1, 10, n)
s = balanced_accuracy_score(y_true, y_pred)
print("平均准确率:{}".format(s))
# 运行结果
平均准确率:0.17929799866074375
4. 精确率、召回率和 F1 度量
介绍
精确率
、
召回率
和
F1 度量
之前,先介绍几个概念。
实际结果(真) | 实际结果(假) | |
---|---|---|
预测结果(真) | tp(true positive)真阳性 | fp(false positive)假阳性 |
预测结果(假) | fn(false negative)假阴性 | tn(true negative)真阴性 |
其中,
tp
和
tn
是预测结果与实际结果
相符
;
fp
和
fn
是预测结果与实际结果
不符
。
4.1. 计算公式
基于上面的概念,下面定义
精确率
、
召回率
和
F1 度量
了。
精确率
:
\(\text{precision} = \frac{tp}{tp + fp}\)
它用于衡量模型的
查准性能
,即模型预测为
真
的样本中有多少是真正的
真
。
召回率
:
\(\text{recall} = \frac{tp}{tp + fn}\)
它用于衡量模型的
查全性能
,即模型能够找出多少真正的
真
。
F1度量
:
\(F_1 = 2 \times \frac{\text{precision} \times \text{recall}}{\text{precision} + \text{recall}}\)
它是精确率和召回率的
调和平均数
,用于综合评价模型的性能。
4.2. 使用示例
from sklearn.metrics import precision_score, recall_score, f1_score
import numpy as np
n = 100
y_true = np.random.randint(0, 2, n)
y_pred = np.random.randint(0, 2, n)
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f1 = f1_score(y_true, y_pred)
print("精确率:{}\n召回率:{}\nF1度量:{}".format(p, r, f1))
# 运行结果
精确率:0.4489795918367347
召回率:0.4782608695652174
F1度量:0.46315789473684216
5. 总结
本篇归纳总结了
分类模型
中关于
准确率相关
的一些评估方法:
- 准确率分数
- top-k 准确率分数
- 平衡准确率分数
- 精确率,召回率和 F1度量