具有 3 个结果的支持向量机
Support Vector Machine with 3 outcomes
Objective:
我想利用分类支持向量机来模拟三种结果: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
表示不在家,1
表示在 isHome
中的家庭,1
表示离开,0
表示不离开。
总结
- 创建支持向量机模型
- 校正伽玛和成本
问题
老实说,这是我第一次使用 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)
我会尽力回答每一点,我认为您可以针对您的问题找到不同的解决方案,因为现在有点 "broad"。您也可以通过在 CrossValidated.
上搜索类似主题来获得答案
Does the data have to be transformed into a scale of [0,1]
?
视情况而定,通常是的,扩展 var1,var2,..
会更好。一种好的方法是构建管道。一种是你对每个 var
进行缩放,另一种是你让它们保持不变,验证集上最好的模型将获胜。
注意,你会经常发现这种方法来决定"the best way"。
通常您真正感兴趣的是性能,因此通过 cross-validation 检查是评估假设的好方法。
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]
,所以Draws
和Losses
都会被算作"zero"class,而 Wins
将被标记为 "one"
- 对其他两个重复同样的原则classes
当然,现在您将拥有三个模型,并且对于每个观察,您至少要做出两个预测。
您将以最大概率或多数票将每个 obs 分配给 class。
注意,还有其他方法,具体取决于您选择的型号。
好消息是您可以避免这种情况。你可以看看here开始。
e1071::svm()
可以很容易地概括您的问题,它会自动执行此操作,因此无需拟合多个模型。
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 获得的验证集之一。
我的建议是两种解决方案都采用,并保留性能最好的一种。
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 示例)。
- 缩放数据与不缩放数据
- 执行 PCA 与保留所有变量
- 在训练集上拟合所有模型并通过 CV 进行评估
- 花点时间测试所有这些管道(到目前为止有 4 个)
- 再次使用
kernel
最佳的 CV 以及其他超参数(C
、gamma
、..) 进行评估
- 您应该找出哪条路径让您获得了最佳结果。
如果您熟悉 classic Confusion Matrix,即使对于 multi-class class化问题,您也可以将准确性用作性能指标。
Objective:
我想利用分类支持向量机来模拟三种结果: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
表示不在家,1
表示在 isHome
中的家庭,1
表示离开,0
表示不离开。
总结
- 创建支持向量机模型
- 校正伽玛和成本
问题
老实说,这是我第一次使用 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)
我会尽力回答每一点,我认为您可以针对您的问题找到不同的解决方案,因为现在有点 "broad"。您也可以通过在 CrossValidated.
上搜索类似主题来获得答案Does the data have to be transformed into a scale of
[0,1]
?
视情况而定,通常是的,扩展 var1,var2,..
会更好。一种好的方法是构建管道。一种是你对每个 var
进行缩放,另一种是你让它们保持不变,验证集上最好的模型将获胜。
注意,你会经常发现这种方法来决定"the best way"。
通常您真正感兴趣的是性能,因此通过 cross-validation 检查是评估假设的好方法。
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]
,所以Draws
和Losses
都会被算作"zero"class,而Wins
将被标记为 "one" - 对其他两个重复同样的原则classes
当然,现在您将拥有三个模型,并且对于每个观察,您至少要做出两个预测。
您将以最大概率或多数票将每个 obs 分配给 class。
注意,还有其他方法,具体取决于您选择的型号。
好消息是您可以避免这种情况。你可以看看here开始。
e1071::svm()
可以很容易地概括您的问题,它会自动执行此操作,因此无需拟合多个模型。
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 获得的验证集之一。
我的建议是两种解决方案都采用,并保留性能最好的一种。
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 示例)。
- 缩放数据与不缩放数据
- 执行 PCA 与保留所有变量
- 在训练集上拟合所有模型并通过 CV 进行评估
- 花点时间测试所有这些管道(到目前为止有 4 个)
- 再次使用
kernel
最佳的 CV 以及其他超参数(C
、gamma
、..) 进行评估
- 您应该找出哪条路径让您获得了最佳结果。
如果您熟悉 classic Confusion Matrix,即使对于 multi-class class化问题,您也可以将准确性用作性能指标。