R 三结果支持向量机

R 三结果支持向量机,r,classification,svm,cross-validation,R,Classification,Svm,Cross Validation,目标: 我想利用classificaiton支持向量机来模拟三种结果:赢=1、输=0或平局=2。输入共有50个区间变量和2个分类变量:isHome或isAway。数据集由23324实例或行组成 数据是什么样子的: 区间变量在0到1的范围内,因此我认为如果它们是百分比,则不需要缩放。分类变量输入为0表示不在家,1表示在家,在iHome表示不在家,在1表示不在家,在0表示不在家 摘要 创建支持向量机模型 修正伽马和成本 问题 老实说,这是我第一次使用SVM,我已经练习过使用Kaggle的Titani

目标:

我想利用classificaiton支持向量机来模拟三种结果:赢=1、输=0或平局=2。输入共有50个区间变量和2个分类变量:
isHome
isAway
。数据集由
23324
实例或行组成

数据是什么样子的:

区间变量在0到1的范围内,因此我认为如果它们是百分比,则不需要缩放。分类变量输入为
0
表示不在家,
1
表示在家,在
iHome
表示不在家,在
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)
    
    库(e1071)
    图书馆(插入符号)
    #设置数据
    种子集(500)
    
    isHome我会尽力回答每一点,我认为你可以为你的问题找到不同的解决方案,因为现在它有点“宽泛”。您也可以通过搜索上的类似主题获得答案

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

  • 这取决于情况,通常是的,最好缩放
    var1、var2、…
    。一个很好的方法是建造管道。一个是缩放每个
    var
    ,一个是离开它们,验证集上的最佳模型将获胜

    注意,你会经常发现这种方法是为了决定“最佳方式”

    通常情况下,你真正感兴趣的是绩效,因此通过via检查是评估假设的一种好方法

  • 我发现一些文献表明用3进行预测是可能的 类别,但这超出了我的知识范围。我该怎么做 在R中实现这一点

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

    注意,您始终可以通过构建更多模型来进行多标签分类。这通常称为“一对多”方法

    一般来说,你可以:

    • 首先训练一个模型来检测
      Wins
      ,您的标签将是
      [0,1]
      ,因此
      绘制
      损失
      都将被视为“零”类,而
      Wins
      将被标记为“一”
    • 对其他两个类重复相同的原则
    当然,现在你们将有三个模型,对于每个观测,你们将至少有两个预测

    您将以最大概率或多数票将每个OB分配给该类

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

    好消息是你可以避免这种情况。你可以先看看

    e1071::svm()
    可以很容易地针对您的问题进行推广,它会自动实现这一点,因此无需适应多个模型

  • 是否有太多的功能,我正在寻找,以使这项工作,或可能有一个噪音问题?我知道这不是一个肯定或否定的问题,但我很想听听人们的想法

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

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

    我的建议是遵循这两种解决方案,并保持最佳性能

  • 我知道SVM可以线性、径向或以一种方式分割数据 多边形。如何为他们的数据做出最佳选择

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


    这就是我要遵循的,因为您似乎已经选择了
    svm
    作为选择模型。我建议看一下这个软件包
    caret
    ,它应该可以简化您需要执行的所有评估(使用caret的示例)

  • 缩放数据与非缩放数据
  • 执行PCA与保留所有变量
  • 在培训集中安装所有模型,并通过CV进行评估
  • 花点时间测试所有这些管道(到目前为止有4条)
  • 使用
    kernel
    最好的CV以及其他超参数(
    C
    gamma
    ,…)再次评估
  • 你应该找到哪条路能让你得到最好的结果

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

    这个问题非常广泛。这实际上更多的是一个统计方法的问题,至少有一部分是主观的,也就是说,每个部分都可以用“视情况而定”来回答。如果你问我如何做某事,你可能会更幸运地把它分成几个独立的问题,然后在邮件上发帖
    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)