参考用书:数据挖掘:R语言实战 黄文 王正林 编著
支持向量机方法建立在统计学理论的VC维理论和结构风险最小原理的基础下,根据有限样本在模型的复杂性和学习能力之间寻求最佳折中,
以期获得最好的推广能力。
统计学习的目标从经验风险最小化变为了寻求经验风险与置信风险之和最小化,即结构风险最小化。
e1071包
svm(formula, data = NULL, ..., subset, na.action =
na.omit, scale = TRUE)
svm(x, y = NULL, scale = TRUE, type = NULL, kernel =
"radial", degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x),
coef0 = 0, cost = 1, nu = 0.5,
class.weights = NULL, cachesize = 40, tolerance = 0.001, epsilon = 0.1,
shrinking = TRUE, cross = 0, probability = FALSE, fitted = TRUE,
..., subset, na.action = na.omit)
第一类格式中formula代表的是函数模型的形式,data是变量是可选格式数据
第二类格式中x可以是数据矩阵,数据向量,稀疏矩阵,y是对于x数据的结果标签
type是指建立模型的类别,取值可以为:C-lassification、nu-classification、
one-classification、eps-regression、nu-regression,前3种是字符型分类方式,后三种是数量型
kernel核函数对原始特征进行变换,提高原始特征维度,解决支持向量机模型线性不可分问题。
有4个可选核函数线性linear、多项式polynomial、径向基radial basis、神经网络sigmoid。识别率
最高的、性能最好的是径向基和函数,最差的是神经网络核函数。
核函数分为局部性核函数和全局性核函数,径向基核函数是一个典型的局部性核函数,学习能力强、泛化能力弱,多项式和函数是一个
典型的全局性核函数,泛化性能较强、学习能力较弱。
degree参数指和函数多项式内积函数中的参数默认值为3
gamma指除线性内积函数以外的所有函数的参数,默认值为1.
svm函数对数据建立模型后所输出的结果
SV即support vectors,就是支持向量机模型中最核心的支持向量。
Index所包含的结果是模型中支持向量在样本数据中的位置
install.packages("e1071")
library(e1071)
data(iris)
summary(iris)
?svm
model=svm(Species~.,data=iris)
x=iris[,-5]
y=iris[,5]
summary(model)
x=iris[,1:4]#确认需要进行预测的样本特征矩阵
prd=predict(model,x)#根据模型model对x数据进行yuce
prd[sample(1:150,5)]#随机挑选8个预测结果进行展示
table(prd,y)#模型预测精度展示
attach(iris)#将数据集iris按列单独确认为向量
x=subset(iris,select=-Species)#除去Species
y=Species
type=c("C-classification","nu-classification","one-classification")#确定要使用的分类方式
kernel=c("linear","polynomial","radial","sigmoid")#去诶的那个要使用的核函数
pred=array(0,dim=c(150,3,4))#初始化预测结果矩阵的三维长度为150,3,4
accuracy=matrix(0,3,4)#初始化模型精准度矩阵的两位分别为3,4
yy=as.integer(y)#将结果变量数量化为1,2,3
for(i in 1:3)#确认i影响的维度代表分类方式
{
for(j in 1:4)#确认j影响的维度代表和函数
{
pred[,i,j]=predict(svm(x,y,type=type[i],kernel=kernel[j]),x)#对每一模型进行预测
if(i>2) accuracy[i,j]=sum(pred[,i,j]!=1)
else accuracy[i,j]=sum(pred[,i,j]!=yy)
}
}
dimnames(accuracy)=list(type,kernel)#确定模型精度变量的列名和行名
table(pres[,1,3],y)
plot(cmdscale(dist(iris[,-5])),
col=c("lightgray","black","gray")[as.integer(iris[,5])],
pch=c("o","+")[1:150 %in% model$index+1])#绘制模型分类散点图
legend(2,-0.4,c("setosa","versicolor","virginica"),
col=c("lightgray","black","gray"),lty=1)#标记图例
data(iris)
wts=c(1,1,1)#确定模型的各个类别比重为1:1:1
names(wts)=c("setosa","versicolor","virginica")#确定各个比重对应的类别
model1=svm(x,y,class.weights=wts)建立模型
wts=c(1,100,100)#确定模型的各个类别比重为1:100:100
names(wts)=c("setosa","versicolor","virginica")#确定各个比重对应的类别
model2=svm(x,y,class.weights=wts)
pred2=predict(model2,x)#根据模型进行预测
table(pred2,y)#展示预测结果
wts=c(1,500,500)#确定模型各个类别的比重1:500:500
names(wts)=c("setosa","versicolor","virginica")#确定各个比重对应的类别
model3=svm(x,y,class.weights =wts)
pred3=predict(model3,x)
table(pred3,y)#在实际构建模型时可以改变各类样本的权重比例来提高模型预测精度