2016-05-19 18 views
1

ニューラルネットワークの予測結果の精度またはRMSEを取得したいと考えています。私はConfusion Matrixを使い始めましたが、以前の回答で示されているように、Confusion Matrixは非連続変数に対して有効な結果を返します。ニューラルネットワークの予測R

ニューラルネットワーク予測の精度またはエラー率を得る方法はありますか?ここでは例として

は私が今までのコード持っている:

library(nnet) 
library(caret) 
library(e1071) 
data(rock) 
newformula <- perm ~ area + peri + shape 
y <- rock[, "perm"] 
x <- rock[!colnames(rock)%in% "perm"] 
original <- datacol(rock,"perm") 

nnclas_model <- nnet(newformula, data = rock, size = 4, decay = 0.0001, maxit = 500)  
nnclas_prediction <- predict(nnclas_model, x) 
nnclas_tab <- table(nnclas_prediction, y) 
rmse <- sqrt(mean((original - nnclas_prediction)^2)) 

誰もが、私はこの作品を作ることができる方法を知っていますか?またはニューラルネットワーク予測の精度や精度をどのように得ることができますか? ご協力いただければ幸いです。

+0

が何であるかを与える予測された結果に直接 'confusionMatrix'を呼び出していないのはなぜと 'y'? 'confusionMatrix(nnclas_prediction、y)' – cdeterman

+1

あなたは、連続変数に関する予測の混乱行列を作成しようとしているようです。混乱行列は、分類問題のためのものです... – Jason

+0

あなたは 'nnclas_prediction < - confusionMatrix((predict(nnclas_model、x))、y)'のようなものを意味します。 – mina

答えて

1

コメントに記載されているとおり、混同行列は分類問題のためのものです。レベルに応じてpermを分類する場合は、次のコードを使用してください。

library(nnet) 
library(caret) 
library(e1071) 
data(rock) 
rock$perm <- as.factor(rock$perm) 
nnclas_model <- nnet(perm ~ area + peri + shape, data = rock, 
        size = 4, decay = 0.0001, maxit = 500) 
x <- rock[, 1:3] 
y <- rock[, 4] 
yhat <- predict(nnclas_model, x, type = 'class') 
confusionMatrix(as.factor(yhat), y) 

あなたは連続としてpermを治療することを意味する場合は、混同行列はどんな意味がありません。代わりに平均二乗誤差で考えるべきです。

+0

私は 'RMSE'を取得しようとしましたが、まだ私はsuccesを持っていません、私は間違って何をしているのか分かりません(私の編集した質問を参照してください) – mina

+0

@ Jasonコードの最後の行 'confusionMatrix(as.factor(yhat)、y)'では、yの代わりにxを意味します、 'y < - rock [、4]'はどこですか?そのyがどこから来ているのか分かりません。ありがとう! –

+0

@ nate-m、はい、私は行をスキップしました。私は今それを追加しました。 – Jason

2

「nnet」についてはわかりませんが、「neuralnet」ライブラリを使用して、RMSEを取得できました。ここに私の完全なコードは次のとおりです。はちょうどあなたの要件ごとや「チャンネル」の代わりのようにtraining_Dataとtesting_Dataのためのデータを変更するあなたの分類属性が

dat <- read.csv("Give path of your data file here") 
summary(dat) 
cleandata <- dat 
cleandata <- na.omit(cleandata) 

#scaling 

apply(cleandata,MARGIN = 2, FUN = function(x)sum(is.na(x))) 
maxs = apply(cleandata, MARGIN = 2, max) 
mins = apply(cleandata, MARGIN = 2, min) 
scaledData =  as.data.frame(scale(cleandata, center = mins, scale = maxs - mins)) 
summary(scaledData) 

#Splitting data in 80:20 ratio 
train = sample(1:nrow(scaledData), nrow(scaledData)*0.8) 
test = -train 
training_Data = scaledData[train,] 
testing_Data = scaledData[test,] 
dim(training_Data) 
dim(testing_Data) 

#neural net 

library(neuralnet) 
n <- names(training_Data) 
f <- as.formula(paste("Channel ~", paste(n[!n %in% "Channel"], collapse = " + "))) 
neuralnet_Model <- neuralnet(f,data = training_Data, hidden = c(2,1)) 
plot(neuralnet_Model) 
neuralnet_Model$result.matrix 
pred_neuralnet<-compute(neuralnet_Model,testing_Data[,2:8]) 
pred_neuralnet.scaled <- pred_neuralnet$net.result *(max(scaledData$Channel)-min(scaledData$Channel))+min(scaledData$Channel) 
real.values <- (testing_Data$Channel)*(max(cleandata$Channel)-min(cleandata$Channel))+min(cleandata$Channel) 
MSE.neuralnetModel <- sum((real.values - pred_neuralnet.scaled)^2)/nrow(testing_Data) 
MSE.neuralnetModel 
plot(real.values, pred_neuralnet.scaled, col='red',main='Real vs predicted',pch=18,cex=0.7) 
abline(0,1,lwd=2) 
legend('bottomright',legend='NN',pch=18,col='red', bty='n') 
関連する問題