1.1设计目的
(1)通过对手写数字识别的研究,对机器学习进一步了解和学习,利用我们所掌握的计算机和人工智能的专业知识来实现对数据的处理和算法的分析设计。
(2)scikit-learn库提供了大量数据集,可用于测试数据分析相关的问题和结果预测问题。使用它的Digits图像数据集进行训练,用其前1700个作为训练集,用剩余97个作为验证集。
(3)使用三种以上模型进行构建,并在测试集上比较每种模型的优劣。
1.2课程设计原理
1.2.1贝叶斯模型
贝叶斯决策论(Bayesian decision theory)是概率框架下实施决策的基本方法,对于分类问题来说,基于贝叶斯的分类器都是在概率已知的理想情况下,贝叶斯决策论考虑如何基于概率和误判损失来标记数据的类别,朴素贝叶斯法(Naive Bayes)是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集,首先基于特征条件独立假设学习输入/输出的联合概率分布;然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
对于每一个样本数据集的条件风险,如果我们使得每一个样本的风险都达到最小化,那么我们的总体风险也必然是最小的,也就是R(h)最小化,那么这就产生了贝叶斯判定准则:为了最小化总体的风险,只需要在每一个样本上选择哪个能使条件风险R(c|x)最小的类别标记:h*(x)=argminR(c|x),h*(x)被称为我们最优的贝叶斯分类器,与之对应的总体风险R(h*)被称为贝叶斯风险,1-R(h*)可以反映分类器所能达到的最好的性能。
1.2.2 SVM模型
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
利用数据点到超平面的距离,确定超平面,在超平面确定的情况下,我们就能够找出所有支持向量,然后计算出间隔margin。每一个超平面都对应着一个margin,我们的目标就是找出所有margin中最大的那个值对应的超平面。因此用数学语言描述就是确定w、b使得margin最大。从而得到一个优化问题的目标函数,然后对起进行简化和等效替代,最终转化成对一个凸二次规划问题的求解。
1.2.3 决策树模型
决策树模型是运用于分类以及回归的一种树结构。决策树由节点和有向边组成,一般一棵决策树包含一个根节点、若干内部节点和若干叶节点。决策树的决策过程需要从决策树的根节点开始,待测数据与决策树中的特征节点进行比较,并按照比较结果选择选择下一比较分支,直到叶子节点作为最终的决策结果。
目标变量可以采用一组离散值的树模型称为分类树(常用的分类树算法有ID3、C4.5、CART),而目标变量可以采用连续值(通常是实数)的决策树被称为回归树(如CART算法)。
决策树算法本质上就是要找出每一列的最佳划分以及不同列划分的先后顺序及排布。
1.2.4 KNN模型
KNN算法的核心思维:相似度较高的样本,映射到n维空间后,其距离回避相似度较低的样本在距离上更加接近。即计算测试样本与每个训练样本的距离,取前k个距离最小的训练样本,最后选择这k个样本中出现最多的分类,作为测试样本的分类。
KNN,即K近邻算法,K近邻就是K个最近的邻居,当需要预测一个未知样本的时候,就由与该样本最接近的K个邻居来决定。KNN既可以用于分类问题,也可以用于回归问题。当进行分类预测时,使用K个邻居中,类别数量最多(或加权最多)者,作为预测结果;当进行回归预测时,使用K个邻居的均值(或加权均值),作为预测结果。
1.3设计方案
(1)收集数据
带有标签的训练数据集来源于scikit-learn库的是Digits图像数据集,此次共导入1797张8*8的像素大小的灰度图,由0到255之间的数构成,图像内容为一个手写体数字。
数据集装载命令语句:
from sklearn import datasets
digits = datasets.load_digits()
导出部分数据查看:
from sklearn import datasets
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
digits = datasets.load_digits()
print(len(digits.data))
print(digits.data[0])
print(digits.data)
(2)处理数据使其符合算法要求
最终我们要求是一个一维数组作为数据源,所以需要将每一个文件对应的特征数据处理成一行,即1*64,这样所有样本集就变成了1797行的64列的大一维数组。用x_tarin, x_test, y_train, y_test = train_test_split()函数对数据进行分割,选择合适的数据占比来实现前1700张图片用于训练,后97张图片用于测试。
(3)显示随机的12个数据集图片
为了更好的了解数据集的图像,采取随机取样的方法查看数据集中的部分数据,对样本有个基本的了解。
(4)调用封装函数实现贝叶斯模型、SVM模型、决策树模型和KNN模型
2.设计的内容
2.1 数据集处理设计
digits = datasets.load_digits() #加载数据集
x_tarin, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.053978,random_state=NONE) #选择测试集占比
print(len(x_tarin)) #输出训练集长度
print(len(x_test)) #输出测试集长度
2.2显示数据集图片设计
images=digits.data.reshape(-1,8,8) #像素
for i in range(1,13): #选择随机数的个数
plt.subplot(3,4,i) #显示排列
plt.imshow(images[randint(0,len(images))])
plt.show()
2.3 贝叶斯模型设计
bayes = naive_bayes.GaussianNB()
bayes.fit(x_tarin, y_train)
bayes_score = accuracy_score(y_test, bayes.predict(x_test))
print("Bayes accuracy:", bayes_score)
2.4 SVM模型设计
svm = SVC()
svm.fit(x_tarin, y_train)
svm_score = accuracy_score(y_test, svm.predict(x_test))
print("svm accuracy:", svm_score)
2.5 决策树模型设计
tree = tree.DecisionTreeClassifier()
tree.fit(x_tarin, y_train)
tree_score = tree.score(x_test, y_test)
print("tree accuracy:", tree_score)
2.6 KNN模型设计
knn = KNeighborsClassifier()
knn.fit(x_tarin, y_train)
knn_score = knn.score(x_test, y_test)
print("KNN accuracy:", knn_score)
源程序:
from PIL.Image import NONE #图像处理库
from sklearn import datasets #导入数据集
from sklearn.metrics import accuracy_score, confusion_matrix
#分类准确率分数是指所有分类正确的百分比
#返回一个混淆矩
from sklearn.model_selection import train_test_split #随机划分训练集和测试集
from sklearn import naive_bayes #贝叶斯
from sklearn.svm import SVC #支持向量机
from sklearn import tree #决策树
from sklearn.neighbors import KNeighborsClassifier #K近邻算法
import matplotlib.pyplot as plt #绘图
from random import randint #生成随机数
#实现根据键值输出键
def getDictKey(myDict, value):
keyList = []
for k, v in myDict.items():
if v == value:
keyList.append(k)
return keyList
#定义一个字典,用于存储不同算法的准确率
best = {}
# 1797行64列
digits = datasets.load_digits() #加载数据集
x_tarin, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.053978,random_state=NONE) #划分数据集,选择测试集占比
print(len(x_tarin)) #输出训练集长度
print(len(x_test)) #输出测试集长度
print("数据集矩阵:",digits.data) #查看矩阵 1797*64
print("第一个数据集矩阵:",digits.data[0])
#显示随机的12个数据集图片
images=digits.data.reshape(-1,8,8) #像素
for i in range(1,13): #选择随机数的个数
plt.subplot(3,4,i) #显示排列
plt.imshow(images[randint(0,len(images))])
plt.show()
#贝叶斯模型
bayes = naive_bayes.GaussianNB() #初始化一个贝叶斯模型
bayes.fit(x_tarin, y_train)
bayes_score = accuracy_score(y_test, bayes.predict(x_test))
print("Bayes accuracy:", bayes_score)
best.update(Bayes准确率最高=bayes_score) #放入best
#SVM模型
svm = SVC()
svm.fit(x_tarin, y_train)
svm_score = accuracy_score(y_test, svm.predict(x_test))
print("svm accuracy:", svm_score)
best.update(SVM准确率最高=svm_score)
#决策树模型
tree = tree.DecisionTreeClassifier()
tree.fit(x_tarin, y_train)
tree_score = tree.score(x_test, y_test)
print("tree accuracy:", tree_score)
best.update(Tree准确率最高=tree_score)
#knn模型
knn = KNeighborsClassifier()
knn.fit(x_tarin, y_train)
knn_score = knn.score(x_test, y_test)
print("KNN accuracy:", knn_score)
best.update(KNN准确率最高=knn_score)
print(getDictKey(best,max(best.values()))) #输出最优模型