2017-07-14 5 views
1

分類予測にSOMアルゴリズムを使用できるかどうかを確認したいと思います。 私は以下のコードを使用しましたが、分類結果が正しいとは限りません。たとえば、テストデータセットでは、訓練ターゲット変数にある3つの値以上のものがあります。トレーニングターゲット変数に合わせて予測モデルを作成するにはどうすればよいですか?分類予測にSOMアルゴリズムを使用する方法

library(kohonen) 
    library(HDclassif) 
    data(wine) 
    set.seed(7) 

    training <- sample(nrow(wine), 120) 
    Xtraining <- scale(wine[training, ]) 
    Xtest <- scale(wine[-training, ], 
        center = attr(Xtraining, "scaled:center"), 
        scale = attr(Xtraining, "scaled:scale")) 

    som.wine <- som(Xtraining, grid = somgrid(5, 5, "hexagonal")) 


som.prediction$pred <- predict(som.wine, newdata = Xtest, 
          trainX = Xtraining, 
          trainY = factor(Xtraining$class)) 

そして結果:

$unit.classif 

[1] 7 7 1 7 1 11 6 2 2 7 7 12 11 11 12 2 7 7 7 1 2 7 2 16 20 24 25 16 13 17 23 22 
[33] 24 18 8 22 17 16 22 18 22 22 18 23 22 18 18 13 10 14 15 4 4 14 14 15 15 4 

答えて

1

これは役立つかもしれない:

  • SOMは教師なし分類アルゴリズムである、あなたはそれが含まれているデータセットで訓練されることを期待してはならないので、クラシファイアラベル(これを行うと、この情報が必要になりますが、ラベルの付いていないデータセットでは役に立たなくなります)
  • アイデアは親切です入力数値ベクトルをネットワークユニット番号に「変換」します(3グリッドあたり1つのコードで再度コードを実行しようとすると、期待通りの出力が得られます)
  • これらのネットワークユニット番号探しているカテゴリに戻る(コードに欠けている部分)

以下の再現可能な例では、古典的な分類エラーが出力されます。オリジナルの投稿に欠けている "変換バック"部分の実装オプションが1つ含まれています。

この特定のデータセットでは、モデルが非常に速くオーバーフィッティングされますが、3単位が最良の結果を示します。

#Set and scale a training set (-1 to drop the classes) 
data(wine) 
set.seed(7) 
training <- sample(nrow(wine), 120) 
Xtraining <- scale(wine[training, -1]) 

#Scale a test set (-1 to drop the classes) 
Xtest <- scale(wine[-training, -1], 
       center = attr(Xtraining, "scaled:center"), 
       scale = attr(Xtraining, "scaled:scale")) 

#Set 2D grid resolution 
#WARNING: it overfits pretty quickly 
#Errors are 36% for 1 unit, 63% for 2, 93% for 3, 89% for 4 
som_grid <- somgrid(xdim = 1, ydim=3, topo="hexagonal") 

#Create a trained model 
som_model <- som(Xtraining, som_grid) 

#Make a prediction on test data 
som.prediction <- predict(som_model, newdata = Xtest) 

#Put together original classes and SOM classifications 
error.df <- data.frame(real = wine[-training, 1], 
         predicted = som.prediction$unit.classif) 

#Return the category number that has the strongest association with the unit 
#number (0 stands for ambiguous) 
switch <- sapply(unique(som_model$unit.classif), function(x, df){ 
    cat <- as.numeric(names(which.max(table(
    error.df[error.df$predicted==x,1])))) 
    if(length(cat)<1){ 
    cat <- 0 
    } 
    return(c(x, cat)) 
}, df = data.frame(real = wine[training, 1], predicted = som_model$unit.classif)) 

#Translate units numbers into classes 
error.df$corrected <- apply(error.df, MARGIN = 1, function(x, switch){ 
    cat <- switch[2, which(switch[1,] == x["predicted"])] 
    if(length(cat)<1){ 
    cat <- 0 
    } 
    return(cat) 
}, switch = switch) 

#Compute a classification error 
sum(error.df$corrected == error.df$real)/length(error.df$real) 
+0

ありがとうございます。コード例の@Kevin Dallaporta。私は2つの質問があります。まず、trainY = factor(Xtraining $ class)を使用しましたが、予測関数には表示されません。第2に、クラス予測結果をテストデータセットに追加できますか? – mql4beginner

+0

私はそれが助けてうれしい!コノネンの 'V2.X'には' trainY = factor'引数が存在し、 'V3.X'では消滅したようです。私はそれが何をすべきか分かっていませんが、返品は同一であり、2017年3月の文書にトラックはありません。私が提供したコードでは、結果は 'error.df $ corrected'にありますので、' test $ predicted < - error.df $ corrected'でテストにアタッチできます。 – kdallaporta

関連する問題