【1】案例背景
光学字符识别(Optical Character Recognition, OCR)是指扫描仪等电子设备通过检测暗、亮的模式确定字符形状, 并使用字符识别方法将形状翻译成计算机字符的过程. 如何除错或利用辅助信息提高识别正确率, 是OCR最重要的课题, OCR技术的发展对于信息自动化和办公自动化的普及具有极大的推动作用.
此案例所给数据集共有26 个英文大写字母的20000个样本, 每一个样本代表光学图像中的一个矩形区域. 该区域只包含单个字符, 每个样本包含16 个输入特征和目标特征” letter” , “ letter” 特征表示当前样本是哪一个字母. 在此构建支持向量机模型实现对光学字符的分类.
【2】方法陈述
SVM模型通过使用最大分类间隔来确定最优的划分超平面, 以获得良好的泛化能力. SVM通过核函数的方法将低维数据映射到高维空间, 并使得在高维空间中的数据是线性可分的,从而处理低维空间中线性不可分的情况. SVM主要应用于模式识别领域中. 因此, 在此构建SVM模型实现光学字符的分类.
【3】实验代码
步骤一 数据准备,划分训练集和测试集
rm(list=ls())
library(kernlab)
letters <- read.csv("letterecognition.csv")
letters$letter=as.factor(letters$letter)
str(letters)
letters_train<-letters[1:16000,]
letters_test<-letters[16001:20000,]
步骤二训练模型
#线性核函数
letter_classifier<-ksvm(letter~.,data=letters_train,kernel="vanilladot")
letter_classifier
步骤三评估模型
letter_prediction<-predict(letter_classifier,letters_test)
head(letter_prediction)
table(letter_prediction,letters_test$letter)
步骤四改进模型
agreement<-letter_prediction==letters_test$letter
table(agreement)
prop.table(table(agreement))
#1.polydot核函数
letter_classifier_polydot<-ksvm(letter~.,data=letters_test,kernel="polydot")
letter_prediction_polydot<-predict(letter_classifier_polydot,letters_test)
agreement_polydot<-letter_prediction_polydot==letters_test$letter
table(agreement_polydot)
prop.table(table(agreement_polydot))
#2.rbfdot核函数
letter_classifier_rbf<-ksvm(letter~.,data=letters_test,kernel="rbfdot")
letter_prediction_rbf<-predict(letter_classifier_rbf,letters_test)
agreement_rbf<-letter_prediction_rbf==letters_test$letter
table(agreement_rbf)
prop.table(table(agreement_rbf))
【4】结果分析
步骤一导入数据后使用str()函数检查数据框中数据变量及类型. 如: kernlab包中的ksvm函数要求将letter转换为factor类型才可运行. 转换后数据如图1所示.
图1 letters中数据变量及类型图 |
步骤二训练模型后如图2所示, 并不能通过此直接看出模型的优劣, 因此进行测试集的数据分析.
图2 模型训练图 |
步骤三评估模型,将测试数据的预测值与实际值作比较,结果如图3所示.
图3 测试值与实际值比较图 |
由图3发现将B类正确分类121个,错误地将5个分给了D,2个分给了E等。在此只需要判断预测的字母是正确的还是错误的,不需要找到其类型。因此对模型做出改进,改进后模型正确率如图4所示,正确率为84%.
图4 改进后正确率图 |
将模型进一步改进,通过更加复杂的核函数,将数据映射到更高维的空间,并获得更好的模型拟合度,如图5所示,发现运用polydot核函数,正确率达到88%,运用rbfdot核函数,正确率达到91%.
图5 模型改进后性能图 |