R语言实现 黑箱方法——支持向量机

Support Vector Machines -------------------

Step 1: Exploring and preparing the data ----

read in data and examine structure
将输入读入到R中,确认接收到的数据具有16个特征,这些特征定义了每一个字母的案例。

letters <- read.csv("F:\\rwork\\Machine Learning with R (2nd Ed.)\\Chapter 07\\letterdata.csv")
str(letters)

在这里插入图片描述
支持向量机学习算法要求所有特征都是数值型的,并且每一个特征需要压缩到一个相当小的区间中。

divide into training and test data
一部分作为训练数据,一部分作为测试数据

letters_train <- letters[1:16000, ]
letters_test  <- letters[16001:20000, ]

Step 2: Training a model on the data ----训练模型

begin by training a simple linear SVM
#install.packages(‘kernel’)

为了提供度量度量支持向量机性能的基准,我们从训练一个简单的线性支持向量机分类器开始。

library(kernlab)
letter_classifier <- ksvm(letter ~ ., data = letters_train,
                          kernel = "vanilladot")

ksvm函数默认使用高斯RBF核函数
vanilladot表示线性函数

look at basic information about the model

letter_classifier

在这里插入图片描述
这里没有提供任何信息告诉我们模型在真实世界中运行的好坏,所以想下面我们用测试数据来研究模型的性能。

Step 3: Evaluating model performance ----评估模型性能

predictions on testing dataset

letter_predictions <- predict(letter_classifier, letters_test)
head(letter_predictions)

这里我们用table函数对预测值和真实值之间进行比较

table(letter_predictions, letters_test$letter)

在这里插入图片描述
对角线的值144、121.120.156和127表示的是预测值与真实值相匹配的总记录数。同样,出错的数目也列出来了。例如,位于行B和列D的值5表示有5种情况将字母D误认为字母B。

单个地看每个错误类型,可能会揭示一些有趣的关于模型识别有困难的特定字母类型的模式,但这也是很耗费时间的。因此,我们可以通过计算整体的准确度来简化我们的评估,即只考虑预测的字母是正确的还是不正确的,并忽略错误的类型。

look only at agreement vs. non-agreement
construct a vector of TRUE/FALSE indicating correct/incorrect predictions

下面的命令返回一个元素为TRUE或者FALSE值的向量,表示在测试数据集中,模型预测的字母是否与真实的字母相符(即匹配)。

agreement <- letter_predictions == letters_test$letter

使用table()函数,我们看到,在4000个测试记录中,分类器正确识别的字母有3357个:

table(agreement)

在这里插入图片描述
以百分比计算,准确度大约为84%

prop.table(table(agreement))

在这里插入图片描述

Step 4: Improving model performance ----提高模型性能

之前的支持向量机模型使用简单的线性核函数。通过使用一-个更复杂的核函数,我们可以将数据映射到一个更高维的空间,并有可能获得-一个较好的模型拟合度。

然而,从许多不同的核函数进行选择是具有挑战性的。一个流行的惯例就是从高斯RBF核函数开始,因为它已经被证明对于许多类型的数据都能运行得很好。我们可以使用ksvm()函数来训练-一个基于RBF的支持向量机,如下所示:

set.seed(12345)
letter_classifier_rbf <- ksvm(letter ~ ., data = letters_train, kernel = "rbfdot")
letter_predictions_rbf <- predict(letter_classifier_rbf, letters_test)

最后,与我们的线性支持向量机的准确度进行比较:

agreement_rbf <- letter_predictions_rbf == letters_test$letter
table(agreement_rbf)

在这里插入图片描述

prop.table(table(agreement_rbf))

在这里插入图片描述

通过简单地改变核函数,我们可以将字符识别模型的准确度从84%提高到93%。如果这种性能水平对于光学字符识别程序仍不能令人满意,那么你可以测试其他的核函数或者通过改变成本约束参数C来修正决策边界的宽度。

欢迎指正哦~(原理百度一下很多,所以就不添加了)
需要数据请私信哦~

发布了3 篇原创文章 · 获赞 3 · 访问量 486

猜你喜欢

转载自blog.csdn.net/qq_44658157/article/details/103947214