具有 3 个结果的支持向量机 [关闭]

Posted

技术标签:

【中文标题】具有 3 个结果的支持向量机 [关闭]【英文标题】:Support Vector Machine with 3 outcomes [closed] 【发布时间】:2019-09-21 20:32:54 【问题描述】:

目标:

我想利用分类支持向量机来模拟三种结果: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 代表非 Home 和 1 代表 Home in isHome1 代表 Away 和 0 代表非 Away。

总结

    创建支持向量机模型 修正伽马值和成本

问题

老实说,这是我第一次使用 SVM,并且我已经练习过使用来自 Kaggle 的 Titanic 数据集,但我正在尝试扩展它并尝试新事物。

    数据是否必须转换为[0,1] 的尺度? 我不相信

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

    我要查看的功能是否太多才能使其正常工作,或者是否存在噪音问题? 我知道这不是一个是或否的问题,而是很想听听人们的想法。

    我了解 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)

【问题讨论】:

这个问题真的很宽泛。这实际上更像是一个统计方法问题,并且至少部分是一个主观问题,即每个部分都可以用“它取决于”来回答。您可能会更幸运地将其拆分为离散的问题并在Cross Validated 上发布 问题是,如果你在简历上问如何在 R 中做某事,它会被撞到这里,或者至少这是我的经验。 当然,但这是作为一个代码问题发布的几个统计方法问题。也许如果你打破这个问题的特定代码相关部分,它们将成为 SO 的主题。 问题 1、3、4 和 2 的第一部分只是关于统计建模。如果您忽略 2 的第二部分,我不明白为什么这些问题不会在 CV 上受到欢迎。 【参考方案1】:

我会尝试回答每一点,我认为您可以为您的问题找到不同的解决方案,因为现在它有点“广泛”。您也可以通过在CrossValidated 上搜索类似主题来获得答案。

    数据是否必须转换成[0,1]的尺度?

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

注意,你会经常发现这种方法来决定“最好的方法”。

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

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

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

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

一般来说你可以:

首先训练一个模型来检测Wins,你的标签将是[0,1],所以DrawsLosses都将被计为“零”类,Wins将被标记为“一” 对其他两个类重复相同的原则

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

您将把每个 obs 分配给概率最大或以多数票投票的类。

注意,还有其他方法,这真的取决于你选择的模型。

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

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

    我要查看的功能是否太多才能使其正常工作,或者是否存在噪音问题?我知道这不是一个是或否的问题,而是很想听听人们的想法。

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

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

我的建议是同时遵循这两种解决方案并保留表现最佳的一种。

    我了解 SVM 可以线性、径向或以 多边形。如何为自己的数据做出最佳选择?

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


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

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

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

【讨论】:

我真的不在乎投反对票,但这似乎毫无意义..我的回答有问题吗?它没有解决问题吗?仅仅是因为问题太宽泛了吗?即使这个问题被迁移到 CV 仍然是 IMO 的有效答案。 你说看性能,这里是什么意思?你的意思是做k-fold交叉验证吗?另外,我认为您的回答没有任何问题,我也没有否决它,我只是想通读它并理解/实施它。 我确实有一个后续问题。当您将 Wins 或 Losses 标记为 [0,1] 时,同样适用于 Home 或 Away。这是如何写在数据框中的?作为两个单独的列? 不,您构建 3 data.frame,将结果重新编码为二进制问题。然后你在每个模型上训练它们,这就是为什么你最终得到三个模型。 e1071 小插图 "Support Vector Machines" 说:“数据缩放通常会极大地改善结果。因此,svm() 默认会缩放数据”(第 6 页)。所以 OP 的代码确实可以扩展功能。

以上是关于具有 3 个结果的支持向量机 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

svm支持向量机系列 -- 线性支持向量机

支持向量机优缺点?

支持向量机(SVM)

SVM支持向量机

换个角度看支持向量机

具有分类数据的一类支持向量机