快递公司每天都会接收处理大量的快递,多数的地址邮编都是通过手写,并且每个人写的数字都样式各异,原本这项任务是通过人工来进行,后来人们尝试用机器代替人工,但是由于没有统一的形状规则来进行识别分类,机器也没有取得很好的效果。随着机器学习技术的兴起,研究人员开始重新考虑这个任务,并且通过大量的研究证明:支持向量机(SVM)对手写数字有很好的预测效果。
什么是支持向量机
支持向量机(Support Vector Machine),简而言之,就是通过对向量的进行运算的一种二分类器。百科的含义:是一类按监督学习方式对数据进行二元分类的广义线性分类器,其决策边界是对学习样本求解的最大边距超平面。具体原理后续抽时间再细说。
本文通过sklearn内部集成的数据中获取手写数字图片数据集,并对数据进行建模预测,最后进行性能评估。由于数字从0-9共有10个类别,而召回率、准确率、F1指标只适用于二分类任务,因此本次性能评估需要创造10个二分类。
数据获取
从sklearn.datasets里导入手写数字图片数据加载器,并将加载器的数据存储在digits中,获取数据特征和数据标签。
from sklearn.datasets import load_digits
digits = load_digits()
data_x = digits.data
data_y = digits.target
#检查手写数据的记录和维度
data_x.shape (1797, 64)
data_y.shape (1797,)
数据分割并标准化
使用train_test_split模型 将数据 按1:3 的比例进行分割,测试数据占比25% ,训练数据 占比75%。并使用StandardScaler函数进行标准化。
from sklearn.cross_validation import train_test_split
x_train,x_test,y_train,y_test = train_test_split(data_x,data_y,test_size=0.25,random_state=33)
#数据标准化
from sklearn.preprocessing import StandardScaler
#标准化数据
SS= StandardScaler()
x_train=SS.fit_transform(x_train)
x_test=SS.transform(x_test)
支持向量机分类模型建模
使用支持向量机分类算法对上述的训练数据进行学习,并对测试数据进行预测。
from sklearn.svm import LinearSVC
lsvc = LinearSVC() #初始化模型
lsvc.fit(x_train,y_train) #调用fit函数进行模型训练
y_predict = lsvc.predict(x_test) #使用predict 函数进行预测
模型性能评估
通过自带的评估函数对模型结果进行准确性测评,并使用classification_report模块对预测结果进行详细的分析。
from sklearn.metrics import classification_report
print("模型得分:%.2f" % (float(lsvc.score(x_test,y_test))*100))
print(classification_report(y_test, y_predict,target_names= digits.target_names.astype('str')))
预测结果如下:
针对450个预测进行对比,模型整体平均得分在95分左右,支持向量机对手写数据的识别效果确实不错。
支持向量机特点分析
支持向量机精妙的模型假设,适用于数据量建模,但是数据量一大,这些优势需要付出很大的计算待机(计算时间和CPU的资源)。所以针对大数据,还是要结合实际情况,权衡利弊选择支持向量机模型。
今天就到这,如有疑惑,欢迎大家关注留言,共同学习,共同进步!