R 三结果支持向量机
目标: 我想利用classificaiton支持向量机来模拟三种结果:赢=1、输=0或平局=2。输入共有50个区间变量和2个分类变量:R 三结果支持向量机,r,classification,svm,cross-validation,R,Classification,Svm,Cross Validation,目标: 我想利用classificaiton支持向量机来模拟三种结果:赢=1、输=0或平局=2。输入共有50个区间变量和2个分类变量:isHome或isAway。数据集由23324实例或行组成 数据是什么样子的: 区间变量在0到1的范围内,因此我认为如果它们是百分比,则不需要缩放。分类变量输入为0表示不在家,1表示在家,在iHome表示不在家,在1表示不在家,在0表示不在家 摘要 创建支持向量机模型 修正伽马和成本 问题 老实说,这是我第一次使用SVM,我已经练习过使用Kaggle的Titani
isHome
或isAway
。数据集由23324
实例或行组成
数据是什么样子的:
区间变量在0到1的范围内,因此我认为如果它们是百分比,则不需要缩放。分类变量输入为0
表示不在家,1
表示在家,在iHome
表示不在家,在1
表示不在家,在0
表示不在家
摘要
[0,1]
的刻度?我不相信library(e1071)
library(caret)
# set up data
set.seed(500)
isHome<-c(1,0,1,0,1)
isAway<-c(0,1,0,1,0)
Outcome<-c(1,0,2,2,0)
Var1<-abs(rnorm(5,0,1))
Var2<-abs(rnorm(5,0,1))
Var3<-abs(rnorm(5,0,1))
Var4<-abs(rnorm(5,0,1))
Var5<-abs(rnorm(5,0,1))
df<-data.frame(Outcome,isHome,isAway,Var1,Var2,Var3,Var4,Var5)
# split data into train and test
inTrain<-createDataPartition(y=df$Outcome,p=0.50,list=FALSE)
traindata<-df[inTrain,]
testdata<-df[-inTrain,]
# Train the model
svm_model<-svm(Outcome ~.,data=traindata,type='C',kernel="radial")
summary(svm_model)
# predict
pred <- predict(svm_model,testdata[-1])
# Confusion Matrix
table(pred,testdata$Outcome)
# Tune the model to find the best cost and gamma
svm_tune <- tune(svm, train.x=x, train.y=y,
kernel="radial", ranges=list(cost=10^(-1:2),
gamma=c(.5,1,2)))
print(svm_tune)
库(e1071)
图书馆(插入符号)
#设置数据
种子集(500)
isHome我会尽力回答每一点,我认为你可以为你的问题找到不同的解决方案,因为现在它有点“宽泛”。您也可以通过搜索上的类似主题获得答案
数据是否必须转换成[0,1]
的刻度
这取决于情况,通常是的,最好缩放var1、var2、…
。一个很好的方法是建造管道。一个是缩放每个var
,一个是离开它们,验证集上的最佳模型将获胜
注意,你会经常发现这种方法是为了决定“最佳方式”
通常情况下,你真正感兴趣的是绩效,因此通过via检查是评估假设的一种好方法
我发现一些文献表明用3进行预测是可能的
类别,但这超出了我的知识范围。我该怎么做
在R中实现这一点
是的,事实上,有些函数立即实现了这一点。请参见下面链接的示例
注意,您始终可以通过构建更多模型来进行多标签分类。这通常称为“一对多”方法
一般来说,你可以:
- 首先训练一个模型来检测
Wins
,您的标签将是[0,1]
,因此绘制和损失
都将被视为“零”类,而Wins
将被标记为“一”
- 对其他两个类重复相同的原则
当然,现在你们将有三个模型,对于每个观测,你们将至少有两个预测
您将以最大概率或多数票将每个OB分配给该类
注意,还有其他方法,这取决于您选择的型号
好消息是你可以避免这种情况。你可以先看看
e1071::svm()
可以很容易地针对您的问题进行推广,它会自动实现这一点,因此无需适应多个模型
是否有太多的功能,我正在寻找,以使这项工作,或可能有一个噪音问题?我知道这不是一个肯定或否定的问题,但我很想听听人们的想法
可能是,也可能不是,再次看看你通过简历的表现。你有理由怀疑var1,…,var50的变量太多了?然后你可以在合适的地方建立一个管道,用来减少这些维度,比如说减少95%的方差
你怎么知道这是有效的?通过再次查看性能,您猜对了,这是通过CV获得的验证集之一
我的建议是遵循这两种解决方案,并保持最佳性能
我知道SVM可以线性、径向或以一种方式分割数据
多边形。如何为他们的数据做出最佳选择
您可以再次将内核选择视为要调优的超参数。在这里,你需要再次看看表演
这就是我要遵循的,因为您似乎已经选择了svm
作为选择模型。我建议看一下这个软件包caret
,它应该可以简化您需要执行的所有评估(使用caret的示例)
缩放数据与非缩放数据
执行PCA与保留所有变量
在培训集中安装所有模型,并通过CV进行评估
花点时间测试所有这些管道(到目前为止有4条)
使用kernel
最好的CV以及其他超参数(C
,gamma
,…)再次评估
你应该找到哪条路能让你得到最好的结果
如果您熟悉经典,您甚至可以将准确度用作多类分类问题的性能指标。这个问题非常广泛。这实际上更多的是一个统计方法的问题,至少有一部分是主观的,也就是说,每个部分都可以用“视情况而定”来回答。如果你问我如何做某事,你可能会更幸运地把它分成几个独立的问题,然后在邮件上发帖
library(e1071)
library(caret)
# set up data
set.seed(500)
isHome<-c(1,0,1,0,1)
isAway<-c(0,1,0,1,0)
Outcome<-c(1,0,2,2,0)
Var1<-abs(rnorm(5,0,1))
Var2<-abs(rnorm(5,0,1))
Var3<-abs(rnorm(5,0,1))
Var4<-abs(rnorm(5,0,1))
Var5<-abs(rnorm(5,0,1))
df<-data.frame(Outcome,isHome,isAway,Var1,Var2,Var3,Var4,Var5)
# split data into train and test
inTrain<-createDataPartition(y=df$Outcome,p=0.50,list=FALSE)
traindata<-df[inTrain,]
testdata<-df[-inTrain,]
# Train the model
svm_model<-svm(Outcome ~.,data=traindata,type='C',kernel="radial")
summary(svm_model)
# predict
pred <- predict(svm_model,testdata[-1])
# Confusion Matrix
table(pred,testdata$Outcome)
# Tune the model to find the best cost and gamma
svm_tune <- tune(svm, train.x=x, train.y=y,
kernel="radial", ranges=list(cost=10^(-1:2),
gamma=c(.5,1,2)))
print(svm_tune)