支持向量机是数据挖掘中的一项新技术,是借助于最优化方法来解决机器学习问题的新工具,开始成为克服“维度灾难”和过学习等困难的强有力手段。
支持向量机算法的任务就是寻找一块超平面实现分类器的功能,
它可以很好的解决线性可分的数据集和线性不可分的数据集
,对于线性可分的数据集,就是寻找一条最大间隔超平面:
对于线性不可分的数据集,需要使用某种核函数,可以是线性核函数、多项式核函数、高斯核函数和神经网络核函数等。
优点:
1)可解决离散的分类和连续数值的预测问题
2)不会过多地受噪声数据的影响
3)精准度高,灵活性强
缺点:
1)寻找最好的模型需要测试不同的核函数和模型参数的组合
2)训练缓慢,尤其是数据维度高或观测量极大的情况下
3)模型结果不易解释
有关支持向量机算法的实现可以使用R语言中e1071包中的svm()函数或kernlab包中的ksvm()函数。
有关支持向量机算法的实现可以使用R语言中e1071包中的svm()函数或kernlab包中的ksvm()函数。
由于《基于R语言的支持向量机实现》中使用了e1071包中的svm()函数,本文尝试使用kernlab包中的ksvm()函数,函数语法如下:
ksvm(x, y = NULL, scaled = TRUE, type = NULL,
kernel ="rbfdot", kpar = "automatic",
C = 1, nu = 0.2, epsilon = 0.1, prob.model = FALSE,
class.weights = NULL, cross = 0, fit = TRUE, cache = 40,
tol = 0.001, shrinking = TRUE, ...,
subset, na.action = na.omit)
x:指定模型的自变量,可以是向量、矩阵,切记不可以是数据框格式
y:指定因变量,可以是因子,也可以是数值型向量
scaled:指定数据是否标准化,默认将原始数据进行标准化处理
type:指定模型是用于离散因变量分类还是连续因变量的预测
kernel:指定使用何种核函数,可以是高斯核函数、线性核函数、多项式核函数等
kpar:指定核函数的参数值,以列表的形式存放
C:指定违反约束条件的惩罚(成本),默认为1
class.weights:为不同水平的类赋予不同的权重,可以提高分类的准确性
cross:整数值,可以指定训练数据集上的k重交叉验证,同样可以提高模型的准确率
na.action:指定缺失值的处理办法,默认将删除缺失值
支持向量机非常适合图像数据的处理,它能够学习复杂的图案而不受噪声数据的影响。本文将使用该算法识别如下图所示的英文字母:
当图像字符被扫描到计算机中时,它们将转换成像素,包括图像字符的水平尺寸、垂直尺寸、像素的平均水平等指标。
本文所使用的数据来源是《机器学习与R语言》书中的案例数据,数据包含了26个大写英文字母的20000个观测,20个变量体现如上图所示的字母像素点指标。
#读取数据
letters
str(letters)
除letter变量为因子变量,其余变量均为整数变量。
#生成训练样本和测试样本
set.seed(1234)
index
train
test
#查看训练集和测试集中字符比例
train_letter_ratio
test_letter_ratio
Ratio
names(Ratio)
Ratio
总体上看,两组数据集中字母的比例几乎接近。
ksvm()函数提供了5种分类的类型,分别是‘C-svc’,‘nu-svc’,‘C-bsvc’,‘spoc-svc’,‘kbb-svc’,同时也提供了4种最常用的核函数,它们是‘rbfdot’,‘polydot’,‘vanilladot’,‘tanhdot’。
如何选择这些搭配是一个问题,下面通过循环选择各种组合,挑选出最为理想的参数组合。
library(kernlab)
KSVM
type
kernel
#用于存放20种组合的预测结果
pred
#用于存放预测错误数
errors
dimnames(errors)
for(i in 1:5){
for(j in 1:4){
pred[,i,j]
errors[i,j]
}
}
return(errors)
}
由于数据量比较大,模型训练起来非常缓慢,这里从测试集中挑选出2000样本进行测试。
model