2016-05-19 94 views
1

我想獲得神經網絡預測結果的準確度或者RMSE。我開始使用混淆矩陣,但如前面的答案所示,混淆矩陣爲非連續變量提供了有效的結果。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'但仍然沒有成功,我只是看不到我做錯了什麼(請看我編輯的問題) – mina

+0

@Jason in the代碼的最後一行'confusionMatrix(as.factor(yhat),y)',你的意思是x而不是y,其中'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')