支持向量机有3个结果

时间:2019-05-03 09:53:26

标签: r classification svm cross-validation

目标:

我想利用分类支持向量机对三个结果进行建模:赢= 1,输= 0或平局= 2。输入总共有50个区间变量和2个类别变量:isHomeisAway。数据集由23,324个实例或行组成。

数据如下:

Outcome isHome isAway   Var1   Var2    Var3 ... Var50
   1      1      0      0.23   0.75    0.5  ...  0.34
   0      0      1      0.66   0.51    0.23 ...  0.89
   2      1      0      0.39   0.67    0.15 ...  0.45
   2      0      1      0.55   0.76    0.17 ...  0.91
   0      1      0      0.35   0.81    0.27 ...  0.34

区间变量在0到1的范围内,因此我相信它们是百分比,因此不需要缩放。在0中,分类变量输入是1而不是Home,而isHome则是Home,1是Away,0是Not Away。

摘要

  1. 创建支持向量机模型
  2. 更正伽玛和成本

问题

老实说,这是我第一次使用SVM,并且已经使用Kaggle的Titanic数据集进行了练习,但是我试图从中脱颖而出,尝试新事物。

  1. 是否必须将数据转换为[0,1]的小数位数? 我不相信

  2. 我发现一些文献指出可以用3个类别进行预测,但这超出了我的知识范围。我将如何在R中实现呢?

  3. 我是否正在寻找太多功能以使其正常工作,还是可能出现噪音问题? 我知道这不是一个是或不是的问题,但是很想听到人们的想法。

  4. 我知道SVM可以线性,径向或多边形分割数据。如何为他们的数据做出最佳选择?

可复制代码

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)

1 个答案:

答案 0 :(得分:3)

我将尽力回答每个问题,我认为您可以针对您的问题获得不同的解决方案,因为它现在有点“广泛”。您还可以通过在CrossValidated上搜索类似的主题来获得答案。

  1.   

    是否必须将数据转换为[0,1]的比例尺?

这取决于,通常是,最好扩展var1,var2,..。一种好的方法是建立管道。一个在每个var上缩放的位置,一个在离开它们的位置,验证集上的最佳模型将获胜。

注意,您会经常发现这种方法来决定“最佳方法”。

通常您真正对性能感兴趣,因此通过cross-validation进行检查是评估假设的一种好方法。

  1.   

    我发现一些文献表明可以用3来预测   类别,但这超出了我的知识范围。我怎么会   在R中实现这一点?

是的,实际上某些功能立即实现了此功能。请参见下面的链接示例。

注意,您始终可以通过构建更多模型来进行多标签分类。这通常称为一对多方法(更多here)。

通常,您可以:

  • 首先训练一个模型来检测Wins,您的标签将为[0,1],因此DrawsLosses都将被视为“零”类,而{{ 1}}将被标记为“一个”
  • 对其他两个类重复相同的原理

当然,现在您将拥有三个模型,并且对于每个观察,至少要做出两个预测。

您将以最高的概率或多数投票将每个obs分配给班级。

请注意,还有其他方法,这实际上取决于您选择的模型。

好消息是可以避免的。您可以查看here来开始。

Wins可以很容易地针对您的问题进行概括,它是自动完成的,因此不需要适合多个模型。

  1.   

    我是否正在寻找太多功能以使其正常工作,还是可能出现噪音问题?我知道这不是一个是或不是的问题,但很好奇听到人们的想法。

可能是,也可能不是,请再次查看通过CV获得的性能。您有理由怀疑var1,..,var50变量太多吗?然后,您可以建立一个管道,在此管道之前,您可以使用PCA减小尺寸,例如减少到95%的差异。

您怎么知道这有效?通过再次查看性能,您猜对了,它是通过CV获得的验证集之一。

我的建议是同时遵循两种解决方案,并保持最佳性能。

  1.   

    我了解SVM可以线性,径向或以线性方式分割数据   多边形。如何为他们的数据做出最佳选择?

您可以再次将内核选择视为要调整的超参数。在这里,您需要再次查看表演。


这是我要遵循的,基于您似乎已经选择e1071::svm()作为选择模型的事实。我建议看一下软件包svm,它应该简化您需要进行的所有评估(带有插入符号的CV示例)。

  1. 规模数据与非规模数据
  2. 执行PCA与保留所有变量
  3. 将所有模型放在训练集上并通过简历进行评估
  4. 花点时间测试所有这些管道(到目前为止有4条)
  5. 使用caret和其他超参数(kernelC,..)最好的CV再次评估
  6. 您应该找到使您获得最佳结果的路径。

如果您熟悉经典的Confusion Matrix,甚至可以将精度用于多类分类问题,作为性能指标。