🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972
个人介绍: 研一|统计学|干货分享
擅长Python、Matlab、R等主流编程软件
累计十余项国家级比赛奖项,参与研究经费10w、40w级横向
1 目的
我们的核心目标是利用先进的机器学习技术——支持向量机(SVM),来精准地判断学生成绩所属的类别。学生的成绩通常反映了他们在学习上的表现和努力程度,而将这些成绩分类则有助于我们更好地理解学生的学业状况,并为他们提供有针对性的指导和帮助。
2 数据来源
该演示数据来源于: 机器学习和智能系统中心
3 案例演示
3.1 探索数据
1.查看数据类型
运行代码:
data1<-read.csv("G:\\studentclasssvm.csv") #数据读取
str(data1) #查看数据类型
结果展示:
## 'data.frame': 10 obs. of 3 variables:
## $ math : int 40 25 10 33 27 75 85 95 80 90
## $ english: int 35 55 5 26 52 92 79 86 85 90
## $ class : int -1 -1 -1 -1 -1 1 1 1 1 1
2.转换数据类型
运行代码:
k<-as.factor(data1$class) #将类别数据转化为因子型
data1$class1<-k #将数据存储进data1
str(data1) #查看数据类型
结果展示:
## 'data.frame': 10 obs. of 4 variables:
## $ math : int 40 25 10 33 27 75 85 95 80 90
## $ english: int 35 55 5 26 52 92 79 86 85 90
## $ class : int -1 -1 -1 -1 -1 1 1 1 1 1
## $ class1 : Factor w/ 2 levels "-1","1": 1 1 1 1 1 2 2 2 2 2
通过读取数据后发现数据类型均为数值型,为方便后面操作,将class数据类型转化为因子型。
3.2 模型的建立及优化
3.2.1 创建训练集和测试集
运行代码:
prop.table(table(data1$class1)) #查看类别情况
set.seed(12) #设置随机种子
data1_sample<-sample(10,8)
data1_train<-data1[data1_sample,]
data1_test<-data1[-data1_sample,]
prop.table(table(data1_train$class1)) #创建训练集
prop.table(table(data1_test$class1)) #创建测试集
结果展示:
> prop.table(table(data1$class1)) #查看类别情况
## -1 1
## 0.5 0.5
> prop.table(table(data1_train$class1)) #创建训练集
## -1 1
## 0.5 0.5
> prop.table(table(data1_test$class1)) #创建测试集
## -1 1
## 0.5 0.5
通过初步查看发现,-1和1类别分别占据50%,由于前5个案例class均为-1,后5个案例均为1。将样本数据通过随机化的方式对顺序进行重新排列,并取前8个案例作为训练集,后2个案例作为测试。可以看到抽取的训练集和测试集类别比例与原始数据类别分布比例相同,说明训练集和测试集的选取是合理的。
3.2.2 基于数据训练模型
运行代码:
data1_classifier<-ksvm(class1~math+english,data=data1_train,kernel="vanilladot")
data1_classifier
结果展示:
## Support Vector Machine object of class "ksvm"
##
## SV type: C-svc (classification)
## parameter : cost C = 1
##
## Linear (vanilla) kernel function.
##
## Number of Support Vectors : 3
##
## Objective Function Value : -0.5369
## Training error : 0
根据线性核函数拟合模型。
3.2.3 评估模型性能
运行代码:
data1_predictions<-predict(data1_classifier,data1_test)
data1_predictions
table(data1_predictions,data1_test$class1)
data1_agreement<-data1_predictions==data1_test$class1
table(data1_agreement)
prop.table(table(data1_agreement))
结果展示:
> data1_predictions
## [1] -1 1
## Levels: -1 1
> table(data1_predictions,data1_test$class1)
##
## data1_predictions -1 1
## -1 1 0
## 1 0 1
> table(data1_agreement)
## data1_agreement
## TRUE
## 2
> prop.table(table(data1_agreement))
## data1_agreement
## TRUE
## 1
根据测试集拟合效果发现,模型准确率为100%,拟合效果完美,已经没有进一步优化空间。
3.2.4 支持向量机可视化
通过改变支持向量机核函数优化模型。
运行代码:
data_classifier=ksvm(class~.,data=data1,type="C-svc",kernel="vanilladot",C=100,scaled=c())
alpha=data_classifier@alpha[[1]]
alphaindex=data_classifier@alphaindex[[1]]
y=data1$class
x=data1[,1:2]
w=alpha[1]*y[alphaindex[1]]*x[alphaindex[1],]+
alpha[2]*y[alphaindex[2]]*x[alphaindex[2],]+
alpha[3]*y[alphaindex[3]]*x[alphaindex[3],]
b=-data_classifier@b
xx1=seq(20,110,length =10 )
xx1=data1$math
xx2=(-b-w[1,1]*xx1)/w[1,2]
xx2_sh=(1-b-w[1,1]*xx1)/w[1,2]
xx2_xia=(-1-b-w[1,1]*xx1)/w[1,2]
plot(x,col=ifelse(y>0,1,2),pch=ifelse(y>0,1,2),lwd=5)
text(x+2,labels = 1:dim(x)[1])
lines(xx1,xx2,col="purple",lwd=5)
lines(xx1,xx2_sh,col="pink",lwd=3,lty=2)
lines(xx1,xx2_xia,col="pink",lwd=3,lty=2)
points(x[c(1,2),1],x[c(1,2),2],col="blue",pch=17,cex=2)
points(x[c(9),1],x[c(9),2],col="green",pch=16,cex=1.5)
text(x[c(1,2,9),1],x[c(1,2,9),2]-4,labels="sv")
grid()
结果展示: