利用支持向量机判断学生成绩所属类别

简介: 利用支持向量机判断学生成绩所属类别

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()

  结果展示:

支持向量机可视化


相关文章
|
9月前
|
存储 缓存 运维
服务器分类与选择
服务器分类与选择
101 0
|
19天前
|
测试技术
数据分享|R语言回归,虚拟变量和交互项,假设检验:F检验、AIC和 BIC分析学生成绩数据附自测题(下)
数据分享|R语言回归,虚拟变量和交互项,假设检验:F检验、AIC和 BIC分析学生成绩数据附自测题
|
19天前
|
机器学习/深度学习 数据可视化
|
19天前
|
数据可视化 机器学习/深度学习
|
12月前
分数等级划分
分数等级划分
48 0
|
大数据 iOS开发 Python
Python 按分类权重(区间)随机获取分类样本
Python 按分类权重(区间)随机获取分类样本
59 0
|
机器学习/深度学习
想要神经网络输出分类的概率值?应该这样写代码
想要神经网络输出分类的概率值?应该这样写代码
rpcms获取指定分类下的文章的方法
往往网站首页是不同模块对不同分类的文章进行展示,在制作首页的时候发现不知道该如何获取指定分类下的文章。查看了rpcms默认模板的代码,发现是把最新文章、最热文章这种功能性的单独封装成函数了,如果想获取指定分类下的文章就需要改改了。在网上找了找,看到rpcms论坛上有整理好的函数,就用了下试试,挺好的,还支持子分类的获取。《模板常用的功能函数整理》上面还有很多其他常用函数,可以看看有没有需求。
|
机器学习/深度学习 算法
②特征选取之单变量统计、基于模型选择、迭代选择
特征选取之单变量统计、基于模型选择、迭代选择
317 0
②特征选取之单变量统计、基于模型选择、迭代选择