虽然我们人来识别一张面孔,或者是一个动物是很简单的,但使用严格的规则来定义这些规则是很困难的。此外,图像数据往往是噪声数据,关于图像的捕获,有许多细微的变化,取决于灯光、位置等多种因素。支持向量机非常适合处理图像数据带来的挑战,它能够学习复杂的图案而不需要对噪声过度敏感,能以高的准确度识别光学图案。而且,支持向量机的主要缺点,对于图像处理并不重要。如果一个支持向量机能够识别出一条狗或者一只猫,我们不用去知道它是如何做到的。
此模型类似于那些往往与桌面文档扫描仪捆绑在一起的光学字符识别软件的核心模型。通过将印刷或者手写文本转换成一种电子形式,保存在数据库中国来处理纸质文件。但由于手写风格和印刷字体有许多变体,因此,这是一个困难的问题。我们希望这个软件能近乎完美,以免因为错误造成高昂的代价。因此,我们使用支持向量机来构建模型,达到这个目的。
一、 数据准备
letters<-read.csv(“letterdata.csv”)
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)
(为研究分类的性能,将预测值域实际值做比较)
上面的表格显示,分类器将B类正确分了121个,错误地分了5个给D,2个给E……
我们只需要判断预测的字母是正确的还是错误的,不需要找到其类型。因此作如下改进:
agreement<-letter_prediction==letters_test$letter
table(agreement)
prop.table(table(agreement))
由上表可知,模型的正确率为84%。我们可以进一步优化。
四、 提高模型性能
之前我们通过的是最简单的线性核函数,我们可以通过更加复杂的核函数,将数据映射到更高维的空间,并获得更好的模型拟合度
分别使用polydot和rbfdot两个核函数来进行拟合:
-
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))
由上图可知,字符识别模型的准确度由84%提升至88%,准确率有了一定的提高。当然我们也还可以用其他的核函数进行分析。
-
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))
通过改变核函数,字符识别模型的准确率由88%升至91%,准确率进一步提高。我们还可以使用其他的核函数,使结果更加精确。
完整代码如下:
letters<-read.csv("letterdata.csv")
str(letters)
#数据准备
letters_train<-letters[1:16000,]
letters_test<-letters[16001:20000,]
#训练模型
install.packages("kernlab")
library(kernlab)
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))
#提高模型性能
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))
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))
补充table()函数知识点:
#说明table()函数
#1.实现各数据频次的统计
z<-c(1,2,1,4,1,4,6,4)
table(z)
#2.实现混淆矩阵
t=table(c(1,0,1,1,1,0,0,1),c(0,0,1,1,1,0,1,1));t
#预测对的概率
#diag(t)函数。如果t为矩阵,则结果为t主对角线元素组成的向量;
#如果t为向量,则结果为使用t作为主对角线元素创建对角矩阵。
(sum(diag(t))/sum(t))
|
请发表评论