具有 3 个结果的支持向量机

Support Vector Machine with 3 outcomes

Objective:

我想利用分类支持向量机来模拟三种结果:Win=1、Loss=0 或 Draw=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 表示在 isHome 中的家庭,1 表示离开,0 表示不离开。

总结

  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)

我会尽力回答每一点,我认为您可以针对您的问题找到不同的解决方案,因为现在有点 "broad"。您也可以通过在 CrossValidated.

上搜索类似主题来获得答案
  1. Does the data have to be transformed into a scale of [0,1]?

视情况而定,通常是的,扩展 var1,var2,.. 会更好。一种好的方法是构建管道。一种是你对每个 var 进行缩放,另一种是你让它们保持不变,验证集上最好的模型将获胜。

注意,你会经常发现这种方法来决定"the best way"。

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

  1. I have found some literature stating it is possible to predict with 3 categories, but this is outside of my scope of knowledge. How would I implement this in R?

是的,有些功能实际上立即实现了这一点。请参阅下面链接的示例。

注意,您始终可以通过构建更多模型来进行 multi-label class化。这通常称为one-vs-all方法(更多here)。

一般来说你可以:

  • 首先训练一个模型来检测Wins,你的标签会是[0,1],所以DrawsLosses都会被算作"zero"class,而 Wins 将被标记为 "one"
  • 对其他两个重复同样的原则classes

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

您将以最大概率或多数票将每个 obs 分配给 class。

注意,还有其他方法,具体取决于您选择的型号。

好消息是您可以避免这种情况。你可以看看here开始。

e1071::svm() 可以很容易地概括您的问题,它会自动执行此操作,因此无需拟合多个模型。

  1. Are there too many features that I am looking at in order for this to work, or could there be a problem with noise? I know this is not a yes or no question, but curious to hear people's thoughts.

可能是也可能不是,再一次,看看你通过简历的表现。你有理由怀疑 var1,..,var50 变量太多了?然后你可以建立一个管道,在适合之前你使用 PCA 来减少这些维度,比如 95% 的方差。

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

我的建议是两种解决方案都采用,并保留性能最好的一种。

  1. I understand SVM can split data either linearly, radially, or in a polygon. How does one make the best choice for their data?

您可以再次将内核选择视为要调整的超参数。这里需要再看一下性能。


这就是我要遵循的,因为您似乎已经选择 svm 作为首选模型。我建议查看包 caret,它应该简化您需要做的所有评估(带插入符的 CV 示例)。

  1. 缩放数据与不缩放数据
  2. 执行 PCA 与保留所有变量
  3. 在训练集上拟合所有模型并通过 CV 进行评估
  4. 花点时间测试所有这些管道(到目前为止有 4 个)
  5. 再次使用 kernel 最佳的 CV 以及其他超参数(Cgamma、..)
  6. 进行评估
  7. 您应该找出哪条路径让您获得了最佳结果。

如果您熟悉 classic Confusion Matrix,即使对于 multi-class class化问题,您也可以将准确性用作性能指标。