R 来自nnet的预测是一个特征,而不是一个因素

R 来自nnet的预测是一个特征,而不是一个因素,r,neural-network,predict,R,Neural Network,Predict,我关心的是,当我训练一个nnet时,类是类型因子,但是当我做预测时,我得到一个返回的chr 我从另一个帖子中引用了这个例子 library(nnet) library(C50) library(caret) attach(iris) set.seed(3456) trainIndex <- createDataPartition(iris$Species, p = .8, list = FALSE,

我关心的是,当我训练一个nnet时,类是类型因子,但是当我做预测时,我得到一个返回的chr

我从另一个帖子中引用了这个例子

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(predicted)
chr [1:30] "setosa" "setosa" "setosa" "setosa" "setosa" ...
预测结果具有一定的特征性。我正在使用其他数据挖掘软件包,例如C50,它们返回预测中的因子

> 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 ...
>irispred预测str(预测)
系数w/3级“刚毛”、“花色”和….:1。。。
我更喜欢预测输出的一致、基于因素的格式。在nnet的情况下,将predict的字符输出转换为因子将不起作用,因为我不能保证所有级别都将作为字符变量出现。例如,在我的650个案例中,有一个案例具有唯一级别,这可能有时在测试数据集中,有时不在,但我希望predict的输出能够了解它,即使它不在测试数据中


谢谢。

使用了
nnet.formula
,它将类的级别存储在其结果的
lev
成员中。从输入数据中保留级别的顺序,即使培训集中不包括级别。通过使用
因子(predicted\u class,levels=model\u 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
iris2
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