34290


{e1071}パッケージの`tune.svm()`を利用して、C-SVM（ソフトマージンSVM）の C
値のチューニングをグリッドサーチにかけて見つけようとしているのですが、グリッドサーチ結果の図がうまく作成出来ません。  
`tune.svm()`を利用してのグリッドサージ結果の作図をご教示して頂けると助かりますm(__)m

<170305追記>  
尚、作成したいグラフは以下のような種類のグラフです  
[![画像の説明をここに入力](https://i.stack.imgur.com/RBzLD.png)](https://i.stack.imgur.com/RBzLD.png)

`tune.svm()`を含む Wrapper Functions のヘルプ  
<https://www.rdocumentation.org/packages/e1071/versions/1.6-8/topics/tune.wrapper>

<170317追記>  
参考サイト  
<http://d.hatena.ne.jp/hoxo_m/20110325/p1>  
<https://bi.biopapyrus.net/machine-learning/svm/e1071.html>

以下作成中のコードです。

[code]

    #install.packages("kernlab")
    #install.packages("e1071")
    
    # expand lib on memory
    library( MASS )    # MASS package
    library( kernlab ) # use C-SVM function
    library( e1071 )   # grid serch of C-SVM
    
    ############################
    # set Pima data            #
    ############################
    # Pima data expand on memory
    data( Pima.tr )
    data( Pima.te )
    
    # copy data from Pima data
    lstPimaTrain <- list(
      numNoDiabetes = 0,       # 糖尿病未発症人数（0で初期化）
      numDiabetes = 0,         # 糖尿病発症人数（0で初期化）
      glu = Pima.tr$glu, 
      bmi = Pima.tr$bmi, 
      bResult = rep(0, length(Pima.tr$glu)) # 糖尿病か否か？（FALSE:糖尿病でない、TRUE:糖尿病）
    )
    
    # Pima.tr$type のデータ（Yes,No）を符号化[encoding]
    for ( i in 1:length(Pima.tr$type) ) 
    {
      if(Pima.tr$type[i] == "Yes" )
      {
        lstPimaTrain$numDiabetes <- (lstPimaTrain$numDiabetes + 1)
        lstPimaTrain$bResult[i] <- 1
      }
      else if( Pima.tr$type[i] == "No" )
      {
        lstPimaTrain$numNoDiabetes <- (lstPimaTrain$numNoDiabetes + 1)
        lstPimaTrain$bResult[i] <- 0
      }
      else{
        # Do Nothing
      }
    }
    
    # sort Pima data
    lstPimaTrain$glu <- lstPimaTrain$glu[ order(lstPimaTrain$bResult) ]
    lstPimaTrain$bmi <- lstPimaTrain$bmi[ order(lstPimaTrain$bResult) ]
    lstPimaTrain$bResult <- lstPimaTrain$bResult[ order(lstPimaTrain$bResult) ]
    
    # split data to class C1 and C2
    lstPimaTrain_C1 <- list(
      glu = lstPimaTrain$glu[1:lstPimaTrain$numNoDiabetes], 
      bmi = lstPimaTrain$bmi[1:lstPimaTrain$numNoDiabetes],
      bResult = rep( 0, lstPimaTrain$numNoDiabetes ),  # 糖尿病か否か？（FALSE:糖尿病でない、TRUE:糖尿病）
      vec_u = matrix( 0, nrow = 2, ncol = 1 ),
      mat_S = matrix( 0, nrow = 2, ncol = 2 )
    )
    lstPimaTrain_C2 <- list(
      glu = lstPimaTrain$glu[(lstPimaTrain$numNoDiabetes+1):(lstPimaTrain$numNoDiabetes+lstPimaTrain$numDiabetes)], 
      bmi = lstPimaTrain$bmi[(lstPimaTrain$numNoDiabetes+1):(lstPimaTrain$numNoDiabetes+lstPimaTrain$numDiabetes)],
      bResult = rep( 1, lstPimaTrain$numDiabetes ),  # 糖尿病か否か？（FALSE:糖尿病でない、TRUE:糖尿病）
      vec_u = matrix( 0, nrow = 2, ncol = 1 ),          # 変数１（glu）の平均値、変数２（BMI）の平均値
      mat_S = matrix( 0, nrow = 2, ncol = 2 )           # 共分散行列
    )
    
    # sort class C1,C2 data
    lstPimaTrain_C1$glu <- lstPimaTrain_C1$glu[ order(lstPimaTrain_C1$glu) ]
    lstPimaTrain_C1$bmi <- lstPimaTrain_C1$bmi[ order(lstPimaTrain_C1$glu) ]
    lstPimaTrain_C2$glu <- lstPimaTrain_C2$glu[ order(lstPimaTrain_C2$glu) ]
    lstPimaTrain_C2$bmi <- lstPimaTrain_C2$bmi[ order(lstPimaTrain_C2$glu) ]
    
    # release memory
    rm( Pima.tr ) 
    rm( Pima.te )
    
    # set class C1 data
    lstPimaTrain_C1$vec_u <- matrix(       # クラス１（糖尿病発症なし）の平均ベクトル
      c( mean( lstPimaTrain_C1$glu ), mean( lstPimaTrain_C1$bmi ) ), 
      nrow = 2, ncol = 1
    )
    
    lstPimaTrain_C1$mat_S[1,1] <- sqrt( var( lstPimaTrain_C1$glu, lstPimaTrain_C1$glu ) )
    lstPimaTrain_C1$mat_S[1,2] <- sqrt( var( lstPimaTrain_C1$glu, lstPimaTrain_C1$bmi ) )
    lstPimaTrain_C1$mat_S[2,1] <- sqrt( var( lstPimaTrain_C1$bmi, lstPimaTrain_C1$glu ) )
    lstPimaTrain_C1$mat_S[2,2] <- sqrt( var( lstPimaTrain_C1$bmi, lstPimaTrain_C1$bmi ) )
    
    # set class C2 data
    lstPimaTrain_C2$vec_u <- matrix(       # クラス２（糖尿病発症なし）の平均ベクトル
      c( mean( lstPimaTrain_C2$glu ), mean( lstPimaTrain_C2$bmi ) ), 
      nrow = 2, ncol = 1
    )
    
    lstPimaTrain_C2$mat_S[1,1] <- sqrt( var( lstPimaTrain_C2$glu, lstPimaTrain_C2$glu ) )
    lstPimaTrain_C2$mat_S[1,2] <- sqrt( var( lstPimaTrain_C2$glu, lstPimaTrain_C2$bmi ) )
    lstPimaTrain_C2$mat_S[2,1] <- sqrt( var( lstPimaTrain_C2$bmi, lstPimaTrain_C2$glu ) )
    lstPimaTrain_C2$mat_S[2,2] <- sqrt( var( lstPimaTrain_C2$bmi, lstPimaTrain_C2$bmi ) )
    
    
    #--------------------------
    # normalize Pima data
    #--------------------------
    lstNormPimaTrain_C1 <- lstPimaTrain_C1
    lstNormPimaTrain_C2 <- lstPimaTrain_C2
    
    lstNormPimaTrain_C1$glu <- scale( lstNormPimaTrain_C1$glu )
    lstNormPimaTrain_C1$bmi <- scale( lstNormPimaTrain_C1$bmi )
    lstNormPimaTrain_C2$glu <- scale( lstNormPimaTrain_C2$glu )
    lstNormPimaTrain_C2$bmi <- scale( lstNormPimaTrain_C2$bmi )
    
    ############################
    # C-SVM                    #
    ############################
    # SVM用のデータ作成
    dat_CsvmForm <- c( lstNormPimaTrain_C1$bResult, lstNormPimaTrain_C2$bResult)
    df_CsvmData <- data.frame( 
      glu = c( lstNormPimaTrain_C1$glu, lstNormPimaTrain_C2$glu ),
      bmi = c( lstNormPimaTrain_C1$bmi, lstNormPimaTrain_C2$bmi ),
      bResult = dat_CsvmForm
    )
    
    #----------------------------
    # C-SVMモデル構築
    #----------------------------
    result <- ksvm(
      dat_CsvmForm ~ ., 
      data = df_CsvmData,       # 
      type = "C-bsvc",           # 分類方法を指定
      kernel = "rbfdot",         # 利用するカーネル関数を指定
      kpar = list(sigma = 0.2),  # カーネル関数のパラメーターを指定
      C = 5,                     # Cパラメーター
      cross = 3,
      prob.model = TRUE          # 予測時に予測確率を出力するためにTRUEに設定
    )
    print(result)
    
    #----------------------------
    # パラメータのチューニング
    #----------------------------
    # グリッドサーチの範囲
    gamma_lim <- 10^( seq(from = -5, to = 5, by = 0.1) ) # 階乗
    cost_lim  <- 10^( seq(from = -1, to = 1, by = 0.1) )
    
[/code]

以下のコードでエラーが発生します。

[code]

    resTune <- tune.svm(
      dat_CsvmForm ~ ., 
      data = df_CsvmData, 
    #  gamma = gamma_lim,          # gammaパラメーターをgamma.limの範囲で移動させる 
    #  cost = cost_lim,            # costパラメーターをcost.limの範囲で移動させる
      tunecontrol = tune.control( sampling = "cross", cross = 5 )  # 5-cross validation
    )
    
[/code]

> Error in model.frame.default(formula, data) : 変数 ('glu' に基づく)  
>  の長さが異なります

以下コードの続きです。

[code]

    print(resTune)
    
    ############################
    # set graphics parameters  #
    ############################
    # 軸に関してのデータリスト
    lstAxis <- list(                        
      xMin = 0.0, xMax = 1.0,  # x軸の最小値、最大値
      yMin = 0.0, yMax = 1.0,  # y軸の最小値、最大値
      zMin = 0.0, zMax = 1.0,  # z軸の最小値、最大値
      xlim = range( c(0.0, 1.0) ), 
      ylim = range( c(0.0, 1.0) ), 
      zlim = range( c(0.0, 1.0) ),
      mainTitle = "mainTitle", # 図のメインタイトル（図の上）
      subTitle  = "subTitle",  # 図のサブタイトル（図の下）
      xlab      = "x", # x軸の名前
      ylab      = "y", # y軸の名前
      zlab      = "z"  # z軸の名前
    )
    lstAxis$xMin <- 0
    lstAxis$xMax <- 200
    lstAxis$yMin <- 0
    lstAxis$yMax <- 50
    lstAxis$zMin <- 0
    lstAxis$zMax <- 1
    lstAxis$xlim = range( c(lstAxis$xMin, lstAxis$xMax) )
    lstAxis$ylim = range( c(lstAxis$yMin, lstAxis$yMax) )
    lstAxis$zlim = range( c(lstAxis$zMin, lstAxis$zMax) )
    lstAxis$xlab <- "glu"
    lstAxis$ylab <- "BMI"
    lstAxis$mainTitle <- "Pima.tr の散布図\n[row data]"
    lstAxis$subTitle <- "row data"
    
    # plot frame only
    par(new=F)
    plot.new()  # clear
    plot( c(), type='n',
          main = lstAxis$mainTitle,
          xlim=lstAxis$xlim, ylim=lstAxis$ylim,
          xlab=lstAxis$xlab, ylab=lstAxis$ylab
    )
    grid() #グリッド線を追加
    
    ############################
    # Draw figure              #
    ############################
    # 変換前の散布図
    par(new=T)
    plot(
      lstPimaTrain_C1$glu, lstPimaTrain_C1$bmi,
      type='p',
      col = "red",
      pch = 1,  
      main = lstAxis$mainTitle,
      xlim=lstAxis$xlim, ylim=lstAxis$ylim, 
      xlab=lstAxis$xlab, ylab=lstAxis$ylab
    )
    
    par(new=T)
    plot(
      lstPimaTrain_C2$glu, lstPimaTrain_C2$bmi,
      type='p',
      col = "blue",
      pch = 2,  
      main = lstAxis$mainTitle,
      xlim=lstAxis$xlim, ylim=lstAxis$ylim, 
      xlab=lstAxis$xlab, ylab=lstAxis$ylab
    )
    
    # 凡例の追加
    legend(
      x = 0, y = 15,
      legend = c("糖尿病発症無し","糖尿病発症有り"),
      col = c("blue","red"),
      pch = c(2,1),
      text.width = 60
    ) 
    
    #----------------------
    # 標準化後のの散布図
    #-----------------------
    lstAxis$xMin <- -5
    lstAxis$xMax <- 5
    lstAxis$yMin <- -5
    lstAxis$yMax <- 5
    lstAxis$zMin <- 0
    lstAxis$zMax <- 1
    lstAxis$xlim = range( c(lstAxis$xMin, lstAxis$xMax) )
    lstAxis$ylim = range( c(lstAxis$yMin, lstAxis$yMax) )
    lstAxis$zlim = range( c(lstAxis$zMin, lstAxis$zMax) )
    lstAxis$mainTitle <- "Pima.tr の散布図\n[normalized data]"
    plot(
      lstNormPimaTrain_C1$glu, lstNormPimaTrain_C1$bmi,
      type='p',
      col = "red",
      pch = 1,  
      main = lstAxis$mainTitle,
      xlim=lstAxis$xlim, ylim=lstAxis$ylim, 
      xlab=lstAxis$xlab, ylab=lstAxis$ylab
    )
    grid()
    
    par(new=T)
    plot(
      lstNormPimaTrain_C2$glu, lstNormPimaTrain_C2$bmi,
      type='p',
      col = "blue",
      pch = 2,  
      main = lstAxis$mainTitle,
      xlim=lstAxis$xlim, ylim=lstAxis$ylim, 
      xlab=lstAxis$xlab, ylab=lstAxis$ylab
    )
    
    # 凡例の追加
    legend(
      x = 0, y = 15,
      legend = c("糖尿病発症無し","糖尿病発症有り"),
      col = c("blue","red"),
      pch = c(2,1),
      text.width = 60
    ) 
    
[/code]

[![画像の説明をここに入力](https://i.stack.imgur.com/N7tDN.png)](http://d.hatena.ne.jp/hoxo_m/20110325/p1)  
[![画像の説明をここに入力](https://i.stack.imgur.com/QkFyg.png)](https://bi.biopapyrus.net/machine-
learning/svm/e1071.html)


CC BY-SA 3.0
2017-03-04T14:37:54.383
33095
2017-04-26T08:47:44.253
2017-03-06T21:32:16.013
20266
20266
question
r 機械学習
Rの{e1071}パッケージの関数 tune.svm() を利用して、C-SVM（ソフトマージンSVM）のパラメータ C をグリッドサーチでチューニングする際のグリッドサーチ結果の作図について


もう解決しているかもしれませんが、目的変数が連続値で回帰分析をやる場合はtune(svm, ~~)を用いる必要があった気がします。


CC BY-SA 3.0
2017-04-26T08:47:44.253
34290
2017-04-26T08:47:44.253
22791
33095
answer