目标:
我想利用分类支持向量机对三个结果进行建模:赢= 1,输= 0或平局= 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
而不是Home,而isHome
则是Home,1
是Away,0
是Not 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)
答案 0 :(得分:3)
我将尽力回答每个问题,我认为您可以针对您的问题获得不同的解决方案,因为它现在有点“广泛”。您还可以通过在CrossValidated上搜索类似的主题来获得答案。
是否必须将数据转换为
[0,1]
的比例尺?
这取决于,通常是,最好扩展var1,var2,..
。一种好的方法是建立管道。一个在每个var
上缩放的位置,一个在离开它们的位置,验证集上的最佳模型将获胜。
注意,您会经常发现这种方法来决定“最佳方法”。
通常您真正对性能感兴趣,因此通过cross-validation进行检查是评估假设的一种好方法。
我发现一些文献表明可以用3来预测 类别,但这超出了我的知识范围。我怎么会 在R中实现这一点?
是的,实际上某些功能立即实现了此功能。请参见下面的链接示例。
注意,您始终可以通过构建更多模型来进行多标签分类。这通常称为一对多方法(更多here)。
通常,您可以:
Wins
,您的标签将为[0,1]
,因此Draws
和Losses
都将被视为“零”类,而{{ 1}}将被标记为“一个” 当然,现在您将拥有三个模型,并且对于每个观察,至少要做出两个预测。
您将以最高的概率或多数投票将每个obs分配给班级。
请注意,还有其他方法,这实际上取决于您选择的模型。
好消息是可以避免的。您可以查看here来开始。
Wins
可以很容易地针对您的问题进行概括,它是自动完成的,因此不需要适合多个模型。
我是否正在寻找太多功能以使其正常工作,还是可能出现噪音问题?我知道这不是一个是或不是的问题,但很好奇听到人们的想法。
可能是,也可能不是,请再次查看通过CV获得的性能。您有理由怀疑var1,..,var50变量太多吗?然后,您可以建立一个管道,在此管道之前,您可以使用PCA减小尺寸,例如减少到95%的差异。
您怎么知道这有效?通过再次查看性能,您猜对了,它是通过CV获得的验证集之一。
我的建议是同时遵循两种解决方案,并保持最佳性能。
我了解SVM可以线性,径向或以线性方式分割数据 多边形。如何为他们的数据做出最佳选择?
您可以再次将内核选择视为要调整的超参数。在这里,您需要再次查看表演。
这是我要遵循的,基于您似乎已经选择e1071::svm()
作为选择模型的事实。我建议看一下软件包svm
,它应该简化您需要进行的所有评估(带有插入符号的CV示例)。
caret
和其他超参数(kernel
,C
,..)最好的CV再次评估如果您熟悉经典的Confusion Matrix,甚至可以将精度用于多类分类问题,作为性能指标。