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

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

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

  结果展示:

支持向量机可视化


相关文章
|
6月前
|
数据可视化 机器学习/深度学习
|
大数据 iOS开发 Python
Python 按分类权重(区间)随机获取分类样本
Python 按分类权重(区间)随机获取分类样本
84 0
|
算法 数据挖掘 API
AutoML | AutoSklearn的基本分类、回归、多输出回归和多标签分类数据集的使用示例
AutoML | AutoSklearn的基本分类、回归、多输出回归和多标签分类数据集的使用示例
194 0
AutoML | AutoSklearn的基本分类、回归、多输出回归和多标签分类数据集的使用示例
|
机器学习/深度学习
想要神经网络输出分类的概率值?应该这样写代码
想要神经网络输出分类的概率值?应该这样写代码
rpcms获取指定分类下的文章的方法
往往网站首页是不同模块对不同分类的文章进行展示,在制作首页的时候发现不知道该如何获取指定分类下的文章。查看了rpcms默认模板的代码,发现是把最新文章、最热文章这种功能性的单独封装成函数了,如果想获取指定分类下的文章就需要改改了。在网上找了找,看到rpcms论坛上有整理好的函数,就用了下试试,挺好的,还支持子分类的获取。《模板常用的功能函数整理》上面还有很多其他常用函数,可以看看有没有需求。
|
测试技术
1012 数字分类(20分)
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字: A1​ = 能被 5 整除的数字中所有偶数的和; A2​ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 n1​−n2​+n3​−n4​⋯; A3​ = 被 5 除后余 2 的数字的个数; A4​ = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位; A5​ = 被 5 除后余 4 的数字中最大数字。
108 0
EL之RF(RFR):利用RandomForestRegressor对回归问题(实数值评分预测)建模(调2参)
EL之RF(RFR):利用RandomForestRegressor对回归问题(实数值评分预测)建模(调2参)
EL之RF(RFR):利用RandomForestRegressor对回归问题(实数值评分预测)建模(调2参)
ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测)
ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测)
ML之PLiR之LARS:利用LARS算法求解ElasticNet回归类型(包括类别编码+属性重要程度排序)问题(实数值年龄预测)