8

私はおそらくここで非常に単純な(そして愚かな)間違いを犯していますが、それを理解することはできません。Kaggle(Digit Recognizer)からのデータで遊んでいて、CaretパッケージでSVMを使用して分類を行おうとしています。ラベル値を数値型として関数にプラグインするとtrain、Caretの関数はデフォルトで回帰に設定されているように見え、パフォーマンスはかなり低下します。そこで次に試したのは、関数を使用して因子に変換し、factor()SVM分類を実行してみることです。ダミーデータを生成し、それをCaretにプラグインするコードを次に示します。

library(caret)
library(doMC)
registerDoMC(cores = 4)

ytrain <- factor(sample(0:9, 1000, replace=TRUE))
xtrain <- matrix(runif(252 * 1000,0 , 255), 1000, 252)

preProcValues <- preProcess(xtrain, method = c("center", "scale"))
transformerdxtrain <- predict(preProcValues, xtrain)

fitControl <- trainControl(method = "repeatedcv", number = 10, repeats = 10)
svmFit <- train(transformerdxtrain[1:10,], ytrain[1:10], method = "svmradial")

このエラーが発生します:

Error in kernelMult(kernelf(object), newdata, xmatrix(object)[[p]], coef(object)[[p]]) : 
  dims [product 20] do not match the length of object [0]
In addition: Warning messages:
1: In train.default(transformerdxtrain[1:10, ], ytrain[1:10], method = "svmradial") :
  At least one of the class levels are not valid R variables names; This may cause errors if class probabilities are generated because the variables names will be converted to: X0, X1, X2, X3, X4, X5, X6, X7, X8, X9
2: In nominalTrainWorkflow(dat = trainData, info = trainInfo, method = method,  :
  There were missing values in resampled performance measures.

誰かが私が間違っていることを教えてもらえますか?ありがとうございました!

4

2 に答える 2

2

10の異なるクラスがありますが、に含まれているのは10のケースのみですtrain()。これは、リサンプリングするときに、分類子の個々のインスタンスに10個のクラスすべてが含まれるとは限らないことを意味します。train()これらのさまざまなカテゴリのSVMの結果を組み合わせるのが困難です。

これは、ケースの数を増やす、クラスの数を減らす、または別の分類子を使用することの組み合わせによって修正できます。

于 2012-12-26T20:54:59.193 に答える
0

数字認識のユースケースでcaretを使用するのは難しいと感じました。問題の一部は、ラベルデータが数値であるということだと思います。カレットがそれから変数を作成しようとすると、それらは数値で始まることになりますが、これは実際にはR変数として受け入れられません。

私の場合、dplyrを使用してラベルデータを離散化することで回避しました。これは、トレーニングデータが「トレーニング」データフレームに配置されていることを前提としています。

labelをlabel2に記述します

train $ label2 = dplyr :: register(train $ label、0= "zero"、1= "one"、2= "two"、3= "three"、4= "four"、5= "five"、6= "six"、7= "セブン"、8= "エイト"、9= "ナイン")

元のラベルと一緒に新しいlabel2が表示されるように、列を再配置します

電車<-電車[、c((1)、(786)、(2:785))]ヘッド(電車)

ラベルを離散化されたラベルの因数分解されたバージョンに変更します2

train $ label <-factor(train $ label2)

一時変数だったのでlabel2を殺す

train $ label2 <-NULL

結果を表示

頭(電車)

于 2020-05-16T18:12:46.970 に答える