R语言svm支持向量机分类与参数优化

首先构建数据集

x<-c(runif(50,0,1),runif(100,1,3),runif(50,3,4))

y<-runif(200,0,1)
z<-c(rep(0,50),rep(1,100),rep(0,50))

data<-cbind(x,y,z)

画出数据集的情况

plot(x,y,col=c(rep('red',50),rep('blue',100),rep('red',50)))


构建支持向量机

library(e1071)

svm.fit<-svm(z~x+y,data=data)
summary(svm.fit)
########
Call:
svm(formula = z ~ x + y, data = data)

Parameters:
   SVM-Type:  eps-regression 
 SVM-Kernel:  radial 
       cost:  1 
      gamma:  0.5 
    epsilon:  0.1 

Number of Support Vectors:  158

#########

SVM-Kernel:  radial表示此处使用的核函数为radial核函数,即径向基核函数,这是一个基于样本点之间的距离决定映射方式的函数。

Number of Support Vectors:  158 表示在这个模型中支持向量的数目是158

查看分类结果

predict(svm.fit)


预测值为正说明模型判断样本点属于类别1,为负说明属于类别0,且数值绝对值越大说明预测可靠性越大

svm.pre<-ifelse(predict(svm.fit)>0,1,0)
n<-ifelse(svm.pre==z,1,0)
sum(n)

[1] 131

131个分类正确,正确率为65.5%

col<-ifelse(svm.pre==0,'red','blue')
plot(x,y,col=col)

分类图像


下面尝试使用其他的核函数来分类

1.线性核函数

svm.line<-svm(z~x+y,data=data,kernel='linear')
svm.linepre<-ifelse(predict(svm.line)>0,1,0)
n<-ifelse(svm.linepre==z,1,0)
sum(n)
[1] 100

col<-ifelse(svm.linepre==0,'red','blue')
plot(x,y,col=col)



使用线性核函数的分类结果正确率是50%,而且把全部样本点判断为类别1

2.kernel设置为polynomial使用多项式核函数,结果与线性核函数一样

这是因为线性核函数和多项式核函数擅长解决线性分类,径向基核函数擅长解决非线性分类

3.同理可以试一下s型核函数,其正确率为56.5%,其分类结果散点图呈现倾斜带状,因为s型核函数对样本数据呈现带状规律过分敏感。实际上,他是神经网络核函数的首选。

支持向量机中比较重要的参数有三个:degree,cost,gamma

1.degree是仅用于多项式核函数中的参数,代表多项式核函数的次数,在本例中,经过实践发现degree为奇数时,degree越大模型表现越好,为偶数时,degree越大,模型越差,当degree足够大时,模型准确率趋于稳定。另外,当degree高于15时,R出现警告信息,而且当样本数据量较大时,设置过高的degree将非常危险(书上说的,我是想象不出来有什么危险)

2.cost是惩罚因子,可与任意核函数搭配,在本例中,分别取了1 2 3 4,发现cost越大越好。此外,cost与degree通常配合使用,在研究他们时,使用交叉验证法会得到更精确的结果。

3.gamma是选择径向基核函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。本例也选取了1~20来测试,随着gamma的增加,准确度先增加后减小,在3处取最大值。

下面我们用穷举法来确定本例的最佳参数组合

a<-c()
for(i in 1:10){
for(j in 1:10){
for(k in 1:10){
svm.fit<-svm(z~x+y,data=data,degree=i,cost=j,gamma=k)
svm.pre<-ifelse(predict(svm.fit)>0,1,0)
n<-ifelse(svm.pre==z,1,0)
result<-c(i,j,k,sum(n))
a<-rbind(a,result)
}}}
a[which(a[,4]==max(a[,4])),]

结果如下

       [,1] [,2] [,3] [,4]
result    1    7    3  147
result    2    7    3  147
result    3    7    3  147
result    4    7    3  147
result    5    7    3  147
result    6    7    3  147
result    7    7    3  147
result    8    7    3  147
result    9    7    3  147
result   10    7    3  147

显然,degree的变化不影响径向基核函数的结果,所以最佳参数为cost=7,gamma=3,模型准确率可以达到73.5%

### 如何在R语言中使用支持向量机SVM)进行机器学习 #### 安装必要的包 为了在 R 中使用 SVM 进行机器学习,首先需要安装 `e1071` 包。这个包提供了实现 SVM 所需的功能。 ```r install.packages("e1071") library(e1071) ``` #### 加载数据集并准备训练测试集 以 Iris 数据集为例,该数据集常被用来展示分类算法的效果。这里将加载内置的 Iris 数据集,并将其分为训练集和测试集。 ```r data(iris) set.seed(123) # 设置随机种子以便结果可重复 trainIndex <- sample(seq_len(nrow(iris)), size = floor(0.7 * nrow(iris))) trainData <- iris[trainIndex, ] testData <- iris[-trainIndex, ] ``` #### 构建和支持向量机模型 接下来创建一个简单的线性核函数的支持向量机模型来进行物种预测: ```r svmModel <- svm(Species ~ ., data=trainData, kernel="linear", cost=1, scale=TRUE) print(svmModel) ``` 这段代码定义了一个基于线性内积的空间转换方式(linear kernel),并且设置了惩罚参数(cost)为默认值 1 来控制过拟合的程度[^2]。 #### 预测评估性能 利用之前建立好的模型对测试集中样本做出类别预测,并计算混淆矩阵来评价模型的表现。 ```r predictions <- predict(svmModel, testData[, -5]) confusionMatrix <- table(Predicted=predictions, Actual=testData$Species) print(confusionMatrix) accuracy <- sum(diag(confusionMatrix)) / sum(confusionMatrix) cat('Accuracy:', accuracy*100, '%\n') ``` 通过上述过程可以得到一个初步的支持向量机模型及其准确性度量指标。当然,在实际应用过程中还需要进一步调整参数以及尝试不同的核方法以获得更好的效果。 #### 模型优化 对于更复杂的场景,可以通过交叉验证的方法寻找最优的成本系数(Cost parameter)和其他超参数设置;也可以考虑采用径向基(RBF)或其他类型的非线性核函数来提升泛化能力。 ```r tuneResult <- tune(svm, Species~., data=trainData, kernel="radial", ranges=list(gamma=c(.1,.5,1,2),cost=c(.1,1,10))) bestModel <- tuneResult$best.model summary(bestModel) ``` 以上展示了如何在 R 中运用 e1071 库下的 svm 函数完成从基础到高级配置的支持向量机构建流程[^4]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值