目录
5.1 准确率(Accuracy)与精确率(Precision)概念
5.2 Python代码实现准确率的计算
5.3 混淆矩阵
5.3.1 混淆矩阵举例
5.3.2 Python代码实现混淆矩阵的计算
5.1 准确率(Accuracy)与精确率(Precision)概念
有关介绍的网站:https://en.wikipedia.org/wiki/Accuracy_and_precision(注:下面的一些图片转载自该网站,并非原创)。
准确率和精确率是观测误差的两个衡量标准。 准确率是一组给定的预测值与其真实值的接近或远离程度,而精确率是预测值彼此之间的接近或分散程度。准确率的计算公式如图1所示。
图1 准确率计算公式
图2 准确率和精确率
图3 根据 ISO 5725-1,准确度包括准确率(测量结果与真实值的接近程度)和精确率(测量的可重复性或再现性)
图4 由于精确率低导致准确率低
图5 即使精确率高准确率也低
5.2 Python代码实现准确率的计算
def calculate_the_accuracy(actual_data,predicted_data):
"""
该函数用于计算模型预测的准确率
Parameters
----------
actual_data: 一纬列表
真实数据.
predicted_data: 一维列表
预测数据.
Returns
-------
TYPE
准确率.
"""
# 定义一个变量用于后续统计真实数据等于预测数据的个数
correct_num = 0
# 循环遍历每一个真实数据与预测数据
for i in range(len(actual_data)):
# 判断真实数据与预测数据是否相等
if actual_data[i] == predicted_data[i]:
# 如果相等,计数器则加一
correct_num += 1
# 返回模型预测的准确率
return correct_num/float(len(actual_data))*100
# 主函数
if '__main__' == __name__:
# 定义一组真实数据
actual_data = [0,1,1,0,1,0,1,1,0,1]
# 定义一组预测数据
predicted_data = [1,0,1,0,1,0,1,0,0,1]
# 调用calculate_the_accuracy函数计算模型预测的准确率
accuracy = calculate_the_accuracy(actual_data, predicted_data)
5.3 混淆矩阵
def calculate_the_accuracy(actual_data,predicted_data):
"""
该函数用于计算模型预测的准确率
Parameters
----------
actual_data: 一纬列表
真实数据.
predicted_data: 一维列表
预测数据.
Returns
-------
TYPE
准确率.
"""
# 定义一个变量用于后续统计真实数据等于预测数据的个数
correct_num = 0
# 循环遍历每一个真实数据与预测数据
for i in range(len(actual_data)):
# 判断真实数据与预测数据是否相等
if actual_data[i] == predicted_data[i]:
# 如果相等,计数器则加一
correct_num += 1
# 返回模型预测的准确率
return correct_num/float(len(actual_data))*100
# 主函数
if '__main__' == __name__:
# 定义一组真实数据
actual_data = [0,1,1,0,1,0,1,1,0,1]
# 定义一组预测数据
predicted_data = [1,0,1,0,1,0,1,0,0,1]
# 调用calculate_the_accuracy函数计算模型预测的准确率
accuracy = calculate_the_accuracy(actual_data, predicted_data)有关介绍的网站:https://en.wikipedia.org/wiki/Confusion_matrix(注:下面的一些图片转载自该网站,并非原创)。
在机器学习领域,特别是统计分类问题中,混淆矩阵,也称为误差矩阵,[9]是一种特定的表格布局,可以可视化算法的性能,通常用于监督学习算法(在无监督学习中通常称为匹配矩阵)。矩阵的每一行代表实际值,而每一列代表预测值,反之亦然。[10]这个名称的来源是因为它可以很容易地看出系统是否混淆了两个类。
5.3.1 混淆矩阵举例
给定一个包含 12 个个体的样本,其中 8 个被诊断患有癌症,4 个未患癌症,其中癌症个体属于 1 类(阳性),非癌症个体属于 0 类(阴性),我们可以显示数据如下:
图6 举例1
假设我们有一个分类器以某种方式区分患有癌症和未患癌症的个体,我们可以将这 12 个个体通过分类器运行。然后分类器做出 9 次准确的预测并遗漏了 3 次:2 个患有癌症的人被错误地预测为没有癌症(样本 1 和 2),以及 1 个没有癌症的人被错误地预测为患有癌症(样本 9)。
图7 举例2
请注意,如果我们将实际分类集与预测分类集进行比较,则有 4 种不同的结果。
一、如果实际分类为正,而预测分类为正(1,1),这称为真正结果(Ture Positive,TP),因为正样本被分类器正确识别。
二、如果实际分类为正,而预测分类为负(1,0),这称为假负结果(False Negative,FN),因为正样本被分类器错误地识别为负。
三,如果实际分类为负,而预测分类为正(0,1),这称为假正结果(False Positive,FP),因为负样本被分类器错误地识别为正。
四,如果实际分类为负,而预测分类为负(0,0),这称为真负结果(Ture Negative,TN),因为负样本被分类器正确识别。
然后,我们可以在实际分类和预测分类之间进行比较,并将此信息添加到表格中,使正确的结果显示为绿色,以便更容易识别。
图8 举例3
任何二元混淆矩阵的模板都使用上面讨论的四种结果(真阳性、假阴性、假阳性和真阴性)以及阳性和阴性分类。这四个结果可以用 2×2混淆矩阵表示,如下所示:
图9 混淆矩阵
选择上述三个数据表的颜色约定以匹配此混淆矩阵,以便轻松区分数据。
现在,我们可以简单地汇总每种类型的结果,代入模板,并创建一个混淆矩阵,该矩阵将简明扼要地总结测试分类器的结果:
图10 举例10
在这个混淆矩阵中,8个有癌症的样本中,系统判断2个没有癌症,4个没有癌症的样本,它预测1个确实有癌症。所有正确的预测都位于表格的对角线(以绿色突出显示),因此很容易直观地检查表格中的预测错误,因为对角线之外的值将区分它们。通过将混淆矩阵的2行相加,还可以推导出原始数据集中正(P)和负(N)样本的总数,即TP+FN=P和 FP+TN=N.
在预测分析中混淆矩阵是一个包含两行两列的表格,用于显示真阳性、假阴性、假阳性和真阴性的数量。这不是简单地观察正确分类的比例(准确率)。如果数据集不平衡,准确率会产生误导性结果;也就是说,当不同类别的观察数量差异很大时。
例如,如果数据中有 95 个癌症样本和只有 5 个非癌症样本,则特定分类器可能会将所有观察结果分类为患有癌症。总体准确度为 95%,但更详细地说,分类器对癌症类别的识别率(灵敏度)为 100%,但对非癌症类别的识别率为 0%。在这种情况下, F1 分数甚至更不可靠。
根据 Davide Chicco 和 Giuseppe Jurman 的说法,评估混淆矩阵的信息量最大的指标是Matthews 相关系数 (MCC)。
其他指标可以包含在混淆矩阵中,每个指标都有其意义和用途。
图11 混淆矩阵具体指标
图12 混淆矩阵具体指标英文
5.3.2 Python代码实现混淆矩阵的计算
def confusion_matrix(actual_data,predicted_data):
"""
该函数用于计算混淆矩阵
Parameters
----------
actual_data: 一纬列表
真实数据.
predicted_data: 一纬列表
预测数据.
Returns
-------
unique_class : 一纬列表
记录类别标签.
matrix : 二维列表
混淆矩阵.
"""
# 定义一个变量来存储类别标签(通过集合剔除重复值)
unique_class = set(actual_data)
matrix = [list() for x in range(len(unique_class))]
for i in range(len(unique_class)):
matrix[i] = [0 for x in range(len(unique_class))]
# 创建一个空字典用于后续给标签记录上索引
indexing_our_class = dict()
# 遍历类别标签,将类别作为key,索引作为value
for i,class_value in enumerate(unique_class):
indexing_our_class[class_value] = i
# 根据类别去找到对应的索引作为行列号,然后遍历,在相应的位置上累加
for i in range(len(actual_data)):
col = indexing_our_class[actual_data[i]]
row = indexing_our_class[predicted_data[i]]
matrix[row][col] += 1
return unique_class,matrix
def perfect_confusion_matrix(unique_class,matrix):
"""
该函数用于优化混淆矩阵(主要是打印,添加相应的表头)
Parameters
----------
unique_class : 一维列表
记录类别标签.
matrix : 二维列表
混淆矩阵.
Returns
-------
None.
"""
print("(Actual)"+" ".join(str(x) for x in unique_class))
print("(Predicted)------------------------------------")
for i,x in enumerate(unique_class):
print("{} | {}".format(x," ".join(str(x) for x in matrix[i])))
# 主函数
if '__main__' == __name__:
# 定义一组真实数据
actual_data = ["狗","猫","狗","狗","猫","猫","狗","狗","猫","猫"]
# 定义一组预测数据
predicted_data = ["猫","猫","狗","狗","猫","猫","狗","狗","猫","猫"]
# 调用confusion_matrix函数计算混淆矩阵
unique_class,matrix = confusion_matrix(actual_data, predicted_data)
perfect_confusion_matrix(unique_class,matrix)
def confusion_matrix(actual_data,predicted_data):
"""
该函数用于计算混淆矩阵
Parameters
----------
actual_data: 一纬列表
真实数据.
predicted_data: 一纬列表
预测数据.
Returns
-------
unique_class : 一纬列表
记录类别标签.
matrix : 二维列表
混淆矩阵.
"""
# 定义一个变量来存储类别标签(通过集合剔除重复值)
unique_class = set(actual_data)
matrix = [list() for x in range(len(unique_class))]
for i in range(len(unique_class)):
matrix[i] = [0 for x in range(len(unique_class))]
# 创建一个空字典用于后续给标签记录上索引
indexing_our_class = dict()
# 遍历类别标签,将类别作为key,索引作为value
for i,class_value in enumerate(unique_class):
indexing_our_class[class_value] = i
# 根据类别去找到对应的索引作为行列号,然后遍历,在相应的位置上累加
for i in range(len(actual_data)):
col = indexing_our_class[actual_data[i]]
row = indexing_our_class[predicted_data[i]]
matrix[row][col] += 1
return unique_class,matrix
def perfect_confusion_matrix(unique_class,matrix):
"""
该函数用于优化混淆矩阵(主要是打印,添加相应的表头)
Parameters
----------
unique_class : 一维列表
记录类别标签.
matrix : 二维列表
混淆矩阵.
Returns
-------
None.
"""
print("(Actual)"+" ".join(str(x) for x in unique_class))
print("(Predicted)------------------------------------")
for i,x in enumerate(unique_class):
print("{} | {}".format(x," ".join(str(x) for x in matrix[i])))
# 主函数
if '__main__' == __name__:
# 定义一组真实数据
actual_data = ["狗","猫","狗","狗","猫","猫","狗","狗","猫","猫"]
# 定义一组预测数据
predicted_data = ["猫","猫","狗","狗","猫","猫","狗","狗","猫","猫"]
# 调用confusion_matrix函数计算混淆矩阵
unique_class,matrix = confusion_matrix(actual_data, predicted_data)
perfect_confusion_matrix(unique_class,matrix) 


