具有 3 个结果的支持向量机 [关闭]
Posted
技术标签:
【中文标题】具有 3 个结果的支持向量机 [关闭]【英文标题】:Support Vector Machine with 3 outcomes [closed] 【发布时间】:2019-09-21 20:32:54 【问题描述】:目标:
我想利用分类支持向量机来模拟三种结果:Win=1、Loss=0 或 Draw=2。输入共有 50 个区间变量和 2 个分类变量:isHome
或 isAway
。数据集由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 isHome
和 1
代表 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]
,所以Draws
和Losses
都将被计为“零”类,Wins
将被标记为“一”
对其他两个类重复相同的原则
当然,现在您将拥有三个模型,并且对于每个观察,您至少要做出两个预测。
您将把每个 obs 分配给概率最大或以多数票投票的类。
注意,还有其他方法,这真的取决于你选择的模型。
好消息是您可以避免这种情况。您可以查看here 开始。
e1071::svm()
可以轻松概括您的问题,它会自动执行此操作,因此无需拟合多个模型。
我要查看的功能是否太多才能使其正常工作,或者是否存在噪音问题?我知道这不是一个是或否的问题,而是很想听听人们的想法。
可能是这样,也可能不是这样,再次,通过简历查看您的表现。你有理由怀疑 var1,..,var50 变量太多了?然后,您可以构建一个管道,在适合之前使用 PCA 来减少这些维度,例如降低 95% 的方差。
你怎么知道这行得通?通过再次查看性能,您猜对了,这是您通过 CV 获得的验证集之一。
我的建议是同时遵循这两种解决方案并保留表现最佳的一种。
我了解 SVM 可以线性、径向或以 多边形。如何为自己的数据做出最佳选择?
您可以再次将内核选择视为要调整的超参数。在这里,您需要再次查看表演。
这就是我要遵循的,基于您似乎已经选择 svm
作为首选模型的事实。我建议查看 caret
包,它应该简化您需要做的所有评估(CV 的示例,带有插入符号)。
-
缩放数据与非缩放数据
执行 PCA 与保留所有变量
在训练集上拟合所有模型并通过 CV 进行评估
花点时间测试所有这些管道(目前有 4 个)
使用 CV 再次评估
kernel
最佳,以及其他超参数(C
、gamma
、..)
您应该找出哪条路径可以让您获得最佳结果。
如果您熟悉经典的 Confusion Matrix,您甚至可以将准确率用作多类分类问题的性能指标。
【讨论】:
我真的不在乎投反对票,但这似乎毫无意义..我的回答有问题吗?它没有解决问题吗?仅仅是因为问题太宽泛了吗?即使这个问题被迁移到 CV 仍然是 IMO 的有效答案。 你说看性能,这里是什么意思?你的意思是做k-fold交叉验证吗?另外,我认为您的回答没有任何问题,我也没有否决它,我只是想通读它并理解/实施它。 我确实有一个后续问题。当您将 Wins 或 Losses 标记为[0,1]
时,同样适用于 Home 或 Away。这是如何写在数据框中的?作为两个单独的列?
不,您构建 3 data.frame
,将结果重新编码为二进制问题。然后你在每个模型上训练它们,这就是为什么你最终得到三个模型。
e1071
小插图 "Support Vector Machines" 说:“数据缩放通常会极大地改善结果。因此,svm()
默认会缩放数据”(第 6 页)。所以 OP 的代码确实可以扩展功能。以上是关于具有 3 个结果的支持向量机 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章