机器学习实例(二)手写体数字识别

数据描述

Number of Instances: 1797
Number of Attributes: 64
Attribute Information: 8x8 image of integer pixels in the range 0…16.

# 从sklearn.datasets里导入手写体数字加载器
from sklearn.datasets import load_digits
import matplotlib.pyplot as plt

# 从通过数据加载器获得手写体数字的数码图像数据并存储在digits变量中
digits = load_digits()

# 检视数据规模和特征维度
print(digits.data.shape)	# (1797, 64)
print(digits.images[0])		# 查看矩阵表示
plt.imshow(digits.images[0])	# 利用plt.imshow函数显示出原图

机器学习实例(二)手写体数字识别_第1张图片
输出表明:该手写体数字的数码图像数据共有1797条,并且每幅图片是由 8 × 8 = 64 8\times 8=64 8×8=64的像素矩阵表示。在模型使用这些像素矩阵的时候,我们习惯将2D的图片像素矩阵逐行首尾拼接为1D的像素特征向量。
依照惯例,对于没有直接提供测试样本的数据,通过数据分割获取75%的训练样本和25%的测试样本

# 从sklearn.model_selection中导入train_test_split用于数据分割
from sklearn.model_selection import train_test_split

# 随机选取75%的数据作为训练样本;其余25%的数据作为测试样本
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=0)
# 这里采用的是33的随机种子

# 分别检视训练与测试数据规模
print(y_train.shape)	# (1347,)
print(y_test.shape)		# (450,)
# 从sklearn.preprocessing里导入数据标准化模块
from sklearn.preprocessing import StandardScaler

# 从sklearn.svm里导入基于线性假设的支持向量机分类器LinearSVC
from sklearn.svm import LinearSVC 

# 对训练和测试的特征数据进行标准化
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)

尝试模型

这里尝试了线性支持向量机

# 初始化线性假设的支持向量机分类器
lsvc = LinearSVC()
# 进行模型训练
lsvc.fit(X_train, y_train)
# 利用训练好的模型对测试样本的数字类别进行预测,预测结果储存在变量y_predict中
y_predict = lsvc.predict(X_test)

模型评估

使用准确率、查全率、查准率和F1指标这4个测度对支持向量机模型从事手写体数字图像识别任务进行性能评估

# 使用模型自带的评估函数进行准确性测评
print('The Accuracy of Linear SVC is', lsvc.score(X_test, y_test))

# 依然使用sklearn.metrics里面的classification_report模块对预测结果做更加详细的分析
from sklearn.metrics import classification_report
print(classification_report(y_test, y_predict, target_names=digits.target_names.astype(str)))

机器学习实例(二)手写体数字识别_第2张图片
查准率、查全率和F1指标最先适用于二分类任务,对于多分类任务,通常的做法是,注意评估某个类别的这三个性能指标:我们把所有其他的类别看作负样本,这样一来,就创造了10个二分类任务。

你可能感兴趣的:(机器学习)