scikit-learn支持向量机(SVM)--手写数字识别

#手写数字识别
#scikit-learn库
from sklearn import datasets
digits = datasets.load_digits()    #加载scikit-learn自带的手写数字识别图片数据集
from matplotlib import pyplot as plt
#将数据所代表的的图片显示出来

images_and_labels = list(zip(digits.images, digits.target))
plt.figure(figsize=(8,6), dpi=200)
for index, (image, label) in enumerate(images_and_labels[:8]):
    plt.subplot(2, 4, index+1)
    plt.axis('off')
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('Digit: %i' %label, fontsize=20)

scikit-learn支持向量机(SVM)--手写数字识别_第1张图片

print("shape of raw image data:{0}".format(digits.images.shape))
print("shape of data: {0}".format(digits.data.shape))
shape of raw image data:(1797, 8, 8)
shape of data: (1797, 64)
#将数据集分成训练集和测试集,其中20%作为测试数据集

from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split

Xtrain, Xtest, Ytrain, Ytest = train_test_split(digits.data, digits.target, test_size=0.2, random_state=2)    #X为图片数据,Y为标记
#选择支持向量机来训练模型

from sklearn import svm

clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(Xtrain, Ytrain);        #fit(训练集样本,训练集标记)
#模型测试,返回正确率

clf.score(Xtest, Ytest)        #score(测试集样本,测试集标记)
0.9777777777777777
#将测试数据里的部分图片显示出来,并且在图片的左下角显示预测值,在右下角显示真实值

fig, axes = plt.subplots(4, 4, figsize=(8,8))
fig.subplots_adjust(hspace=0.1, wspace=0.1)

Ypred = clf.predict(Xtest)

for i, ax in enumerate(axes.flat):
    ax.imshow(Xtest[i].reshape(8,8), cmap=plt.cm.gray_r, interpolation='nearest')
    ax.text(0.05, 0.05, str(Ypred[i]), fontsize=32, transform=ax.transAxes, color='green' if Ypred[i] == Ytest[i] else 'red')
    ax.text(0.8, 0.05, str(Ytest[i]), fontsize=32, transform=ax.transAxes, color='black')
    ax.set_xticks([])
    ax.set_yticks([])

scikit-learn支持向量机(SVM)--手写数字识别_第2张图片

# 保存模型参数

from sklearn.externals import joblib
joblib.dump(clf, 'digits_svm.pkl');
#导入训练好已保存的模型参数,直接进行预测

clf = joblib.load('digits_svm.pkl')
Ypred = clf.predict(digits.data)   #预测标记
clf.score(digits.data, digits.target)
0.9955481357818586

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