人工智能与机器学习——线性分类
一、深入阅读《机器学习》(周志华著)第二章《模型评估与旋转》,掌握'精确率'、'召回率'、'F1-Score'、'roc curve'以及'confusion matrix'等核心概念的具体含义。你需要理解这些指标在评估模型性能中的作用机制,并通过实例练习熟悉其计算方法和实际应用价值。
查准率(Precision)(precision)表示一种检索系统性能的重要指标,在信息处理领域具有重要应用价值
查准率= 检索出的信息量/检索出的相关信息量∗100%
召回率(Recall),是用来评估某一检索系统从文档集中获取相关文档效率的一项指标。具体而言,在该检索系统中被正确识别出的相关文档数量与所有相关文档数量之间的比率
查全率= 系统中的相关信息量/检索出的相关信息量 ∗100%
3.F1-Score 定义
F1 分数(F1 Score)是一种用于评估二分类模型性能的重要指标,在统计学领域有着重要地位。该指标综合考量了分类模型在区分真实正样本与假正样本之间以及真实负样本与假负样本之间的能力,并通过平衡这两者的性能表现来计算结果值。\n
数学上而言,在计算 F1 分数时采用的是精确率与召回率的算术平均值作为核心评价标准。\n
基于这一特性,在公式推导过程中将 F1 分数视为精确度与完整性之间的折中解决方案。
F1=2∗ (precision+recall)/(precision∗recall)
4.ROC定义
ROC的全名叫做Receiver Operating Characteristic,其主要分析工具是一个画在二维平面上的曲线——ROC 曲线。平面的横坐标是false positive rate(FPR),纵坐标是true positive rate(TPR)。对某个分类器而言,我们可以根据其在测试样本上的表现得到一个TPR和FPR点对。这样,此分类器就可以映射成ROC平面上的一个点。调整这个分类器分类时候使用的阈值,我们就可以得到一个经过(0, 0),(1, 1)的曲线,这就是此分类器的ROC曲线。一般情况下,这个曲线都应该处于(0, 0)和(1, 1)连线的上方。
- 混淆矩阵定义
混淆矩阵亦称误差矩阵,在图像处理领域被广泛用作评估一种算法性能的标准格式之一。它通常采用n×n阶的二维表格形式来展示不同类别之间的预测与真实情况对比关系[1]。其中常用的评价指标包括总体精确度、制图精确度以及用户精确度等[2]。
在人工智能领域中这一工具具有重要的应用价值尤其在监督学习场景下常被采用而在无监督学习过程中则通常被称为匹配矩阵。
对于图像处理领域中的精度评估而言混淆矩陣的应用尤为突出它主要用於對比分類输出結果與實際觀測值之間的差異並將这种差異以表格的形式展示出来。
具體而言混 MONTHS_ABOUT_ago淆矩陣是由將每個實測像元的位置與其分類結果進行對比後計算得出的一種數據表徵方式。
深入研究《机器学习实战》第三章关于分类器的内容,并开发Jupyter程序用于对MNIST数据集中的10个字符(数字0到9)进行分类识别
1.使用sklearn的函数来获取MNIST数据集
from sklearn.datasets import fetch_openml
import numpy as np
import os
import datetime
# to make this notebook's output stable across runs
np.random.seed(42)
# To plot pretty figures
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
# 为了显示中文
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
# 耗时巨大
def sort_by_target(mnist):
reorder_train=np.array(sorted([(target,i) for i, target in enumerate(mnist.target[:60000])]))[:,1]
reorder_test=np.array(sorted([(target,i) for i, target in enumerate(mnist.target[60000:])]))[:,1]
mnist.data[:60000]=mnist.data[reorder_train]
mnist.target[:60000]=mnist.target[reorder_train]
mnist.data[60000:]=mnist.data[reorder_test+60000]
mnist.target[60000:]=mnist.target[reorder_test+60000]
- 因为sklearn获取数据集的时间较长, 我们可以通过计算这个程序的运行时间来评估其效率. 运行速度主要受电脑性能的影响.
starttime=datetime.datetime.now()
mnist=fetch_openml('mnist_784',version=1,cache=True)
mnist.target=mnist.target.astype(np.int8)
sort_by_target(mnist)
endtime=datetime.datetime.now()
print("运行时间:",endtime-starttime)
运行结果:

3.数据集排序,生成数据集矩阵
mnist["data"], mnist["target"]
运行结果:

4.查看数据集维度
mnist.data.shape

5.展示图片
# 展示图片
def plot_digit(data):
image = data.reshape(28, 28)
plt.imshow(image, cmap = mpl.cm.binary,
interpolation="nearest")
plt.axis("off")
some_digit = X[36000]
plot_digit(X[36000].reshape(28,28))
运行结果:

6.完成对手写体Mnist数据集中10个字符 (0-9)的分类识别
def plot_digits(instances,images_per_row=10,**options):
size=28
# 每一行有一个
image_pre_row=min(len(instances),images_per_row)
images=[instances.reshape(size,size) for instances in instances]
# 有几行
n_rows=(len(instances)-1) // image_pre_row+1
row_images=[]
n_empty=n_rows*image_pre_row-len(instances)
images.append(np.zeros((size,size*n_empty)))
for row in range(n_rows):
# 每一次添加一行
rimages=images[row*image_pre_row:(row+1)*image_pre_row]
# 对添加的每一行的额图片左右连接
row_images.append(np.concatenate(rimages,axis=1))
# 对添加的每一列图片 上下连接
image=np.concatenate(row_images,axis=0)
plt.imshow(image,cmap=mpl.cm.binary,**options)
plt.axis("off")
plt.figure(figsize=(9,9))
example_images=np.r_[X[:12000:600],X[13000:30600:600],X[30600:60000:590]]
plot_digits(example_images,images_per_row=10)
plt.show()
运行结果如下图:

本次实验就到此结束拉!谢谢大家观看
