数字识别
1、数据的采集和标记
加载数据
import matplotlib.pyplot as plt
from sklearn import datasets
digits=datasets.load_digits()#sk自带数据集
# print(digits)
#把数据所代表的图片显示出来
images_and_labels=list(zip(digits.images,digits.target))
# print(images_and_labels)#解压数据
plt.figure(figsize=(8,6),dpi=200)#尺寸
for index,(images,label) in enumerate(images_and_labels[:8]):#画8张
plt.subplot(2,4,index+1)
plt.axis('off')
plt.imshow(images,cmap=plt.cm.gray_r,interpolation='nearest')
plt.title('Digit:%i' % label,fontsize=20)
plt.show()
2、特征选择
print("shape of raw image data:{0}".format(digits.images.shape))
print("shape of data:{0}".format(digits.data.shape))#查看sklearn将数据保存为 样本个数*特征个数 格式的array对象
总共1797个训练样本,64为像素点个数,用来训练的数据是把图片的64个像素点转化为特证,直接用digits.data作为训练数据
3、数据清洗
本例中将用户手写的大小为200200的数字图片(假设)缩小为88的数字图片即为数据清洗,转化为适合机器学习的数据
4、模型选择
本例使用支持向量机作为手写识别算法的模型。
5、模型训练
要把数据分为训练数据集和测试数据集,这里我们用下列代码把数据集分出20%作为测试数据集:
tips(在sklearn 0.18及以上的版本中,出现了sklearn.cross_validation无法导入的情况,原因是新版本中此包被废弃改为model_selection)
from sklearn.model_selection import train_test_split
Xtrain,Xtest,Ytrain,Ytest=train_test_split(digits.data,digits.target,test_size=0.20,random_state=2)
接着,使用训练数据集Xtrain,Ytrain来训练模型
from sklearn import svm
clf = svm.SVC(gamma=0.001,C=100.)
clf.fit(Xtrain,Ytrain);
6、模型测试
clf.score(Xtrain,Ytrain)#准确度测试
print(clf.score(Xtrain,Ytrain))#此例准确度为100%
7、保存此模型
下次需要预测时可以直接加载模型来进行预测,直接加载模型即可进行预测不需要从新训练
tips(新版本使用import joblib代替from sklearn.externals import joblib)
import joblib
#保存模型参数
joblib.dump(clf,'digits_svm.plk');
#导入模型参数,直接进行预测
clf=joblib.load('digits_svm.plk')
Ypred=clf.predict(Xtest);
print(clf.score(Xtrain,Ytrain))