2017-03-17 11 views
1

私が懸念しているのは、nnetを訓練すると、そのクラスは型因子ですが、予測をすると、chrが返されます。nnetからの予測は文字であり因子ではありません

私はこの例を別の投稿から取りました。

library(nnet) 
library(C50) 
library(caret) 
attach(iris) 
set.seed(3456) 
trainIndex <- createDataPartition(iris$Species, p = .8, 
          list = FALSE, 
          times = 1) 
irisTrain <- iris[ trainIndex,] 
irisTest <- iris[-trainIndex,] 

irispred <- nnet(Species ~ ., data=irisTrain, size=10) 
predicted <- predict(irispred,irisTest,type="class") 

> str(irisTrain) 
'data.frame': 120 obs. of 5 variables: 
$ Sepal.Length: num 5.1 4.9 4.6 5 5.4 5 4.4 4.9 5.4 4.8 ... 
$ Sepal.Width : num 3.5 3 3.1 3.6 3.9 3.4 2.9 3.1 3.7 3 ... 
$ Petal.Length: num 1.4 1.4 1.5 1.4 1.7 1.5 1.4 1.5 1.5 1.4 ... 
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.4 0.2 0.2 0.1 0.2 0.1 ... 
$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 
> str(irisTest) 
'data.frame': 30 obs. of 5 variables: 
$ Sepal.Length: num 4.7 4.6 4.8 4.3 5.4 4.6 5 5 4.6 5.3 ... 
$ Sepal.Width : num 3.2 3.4 3.4 3 3.4 3.6 3.5 3.5 3.2 3.7 ... 
$ Petal.Length: num 1.3 1.4 1.6 1.1 1.7 1 1.3 1.6 1.4 1.5 ... 
$ Petal.Width : num 0.2 0.3 0.2 0.1 0.2 0.2 0.3 0.6 0.2 0.2 ... 
$ Species  : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ... 

ようトレーニングおよびテストデータセット種における要因であるが、予測の

str(predicted) 
chr [1:30] "setosa" "setosa" "setosa" "setosa" "setosa" ... 

結果が文字です。私は予測の出力のために一貫性のある、ベースの要因、形式を好むだろう

> irispred <- C5.0(Species ~ ., data=irisTrain) 
> predicted <- predict(irispred,irisTest,type="class") 
> str(predicted) 
Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 2 1 1 ... 

、私は、例えばC50を、他のデータ・マイニング・パッケージを使用しています、そして、彼らは予測からの要素を返します。 nnetの場合の予測の文字出力を要因に変換することは、すべてのレベルが文字変数として存在するとは保証できないため、機能しません。たとえば、私の650件のケースでは、一意のレベルを持つケースが1つあり、これはテストデータセットに含まれていることもありますが、時にはそうではない場合もありますが、テストデータに含まれていなくても、

ありがとうございました。

答えて

1

nnet.formulaで遊んでいた場合は、その結果のメンバーであるlevにクラスのレベルが格納されます。たとえレベルがトレーニングセットに含まれていなくても、レベルの順序は入力データから保持されます。予測されたクラスは、factor(predicted_class, levels = model_object$lev)を使用することで簡単に因子に戻すことができます。例:

iris2 <- iris 
iris2$Species <- factor(iris2$Species, 
    levels = c("versicolor", "banana", "setosa", "cherry", "virginica")) 
iris_pred <- nnet(Species ~ ., data = iris2[trainIndex, ], size = 10) 

#Warning message: 
#In nnet.formula(Species ~ ., data = iris2[trainIndex, ], size = 10) : 
# groups ‘banana’ ‘cherry’ are empty 

identical(iris_pred$lev, levels(iris2$Species)) 
#[1] TRUE 

predicted <- predict(iris_pred, iris2[-trainIndex, ], type="class") 
predicted_fac <- factor(predicted, levels = iris_pred$lev) 
table(iris2[-trainIndex, "Species"], predicted_fac) 

#   predicted_fac 
#    versicolor banana setosa cherry virginica 
# versicolor   10  0  0  0   0 
# banana    0  0  0  0   0 
# setosa    0  0  10  0   0 
# cherry    0  0  0  0   0 
# virginica   0  0  0  0  10 
+0

ありがとう、ニック、これは動作するようです。 –

関連する問題