Нейронная сеть Тренирует штрафа и предсказания теста ужасно граничат с нелепостью - PullRequest
0 голосов
/ 12 мая 2018

У меня много проблем с моделью нейронной сети, использующей функцию R neuralnet ().Когда я тренирую сеть на всех данных, как и ожидалось, прогнозы очень точны.Однако, когда я разделяю данные на обучающие и тестовые наборы, прогнозы теста ужасны.Я не могу понять, что все, что я делаю неправильно.Я был бы признателен за любые советы или помощь в устранении неполадок, так как я не думаю, что смогу понять это самостоятельно.Заранее спасибо.

Я включил код R и некоторые графики, и пример данных под полными данными - 3600 наблюдений.

Best Regards-Pat

ОБНОВЛЕНИЕ05/12/18: НА ОСНОВЕ ОБРАТНОЙ СВЯЗИ, ЧТО ЭТОТ ВЫГЛЯДИТ, КАК ПЕРЕКРЕПЛЕНИЕ, Я ПЫТАЛСЯ ОСТАНОВИТЬ УЧЕБНУЮ УЧЕБНУЮ УЧЕБНУЮ РАБОТУ И НАЙТИ, ЧТО MSE ПРОГНОЗА ИСПЫТАНИЯ НИКОГДА НЕ ПОЛУЧАЕТ ОЧЕНЬ НИЗКИЙ И НИЗКИЙ ПОДХОД К ОБУЧЕНИЮ ЭДОЛАПРИЛОЖЕНО)

###########
#ANN Models
###########

#Load libraries
library(plyr)
library(ggplot2)
library(gridExtra)
library(neuralnet)

#Retain only numerically coded data from data1 in (data2) for ANN fitting
data2 = data1[,c(3:7)]

#Calculate Min and Max for Scaling
max_data = apply(data2,2,max)
min_data = apply(data2,2,min)
#Scale data 0-1
data2_scaled = scale(data2,center=min_data,scale=max_data-min_data)
#Check data structure
data2_scaled

#Fit neural net model
model_nn1 = neuralnet(formula=time~instructions+nodes+machine_num+app_num,data=data2_scaled,hidden=c(8,8),stepmax=1000000,threshold=0.01)
#Calculate Min and Max Response for rescaling
max_time = max(data2$time)
min_time = min(data2$time)
#Rescale neural net response predictions
pred_nn1 = model_nn1$net.result[[1]][,1]*(max_time-min_time)+min_time
#Compare model predictions to actual values
a03 = cbind.data.frame(data1$time,pred_nn1,data1$machine,data1$app)
colnames(a03) = c("actual","prediction","machine","app")
attach(a03)
p01 = ggplot(a03,aes(x=actual,y=prediction))+
geom_point(aes(color=machine),size=1)+
scale_y_continuous("Predicted Execution Time [s]",breaks=seq(0,1000,100),limits=c(0,1000))+
scale_x_continuous("Actual Execution Time [s]",breaks=seq(0,1000,100),limits=c(0,1000))+
ggtitle("Neural Net Fit (ALL DATA):\nActual vs. Predicted Execution Time")+
geom_abline(intercept=0,slope=1)+
theme_light()
p02 = ggplot(a03,aes(x=actual,y=prediction))+
geom_point(aes(color=app),size=1)+
scale_y_continuous("Predicted Execution Time [s]",breaks=seq(0,1000,100),limits=c(0,1000))+
scale_x_continuous("Actual Execution Time [s]",breaks=seq(0,1000,100),limits=c(0,1000))+
ggtitle("Neural Net Fit (ALL DATA):\nActual vs. Predicted Execution Time")+
geom_abline(intercept=0,slope=1)+
theme_light()
grid.arrange(p01,p02,nrow=1)
#Visualize ANN
plot(model_nn1)
#Epochs taken to train "steps"
model_nn1$result.matrix[3,]

#########################
#Testing and Training ANN
#########################>

#Split the data into a test and training set
index = sample(1:nrow(data2_scaled),round(0.80*nrow(data2_scaled)))
train_data = as.data.frame(data2_scaled[index,])
test_data = as.data.frame(data2_scaled[-index,])
model_nn2 = neuralnet(formula=time~instructions+nodes+machine_num+app_num,data=train_data,hidden=c(3,2),stepmax=1000000,threshold=0.01)
pred_nn2_scaled = compute(model_nn2,test_data[,c(1,2,4,5)])
pred_nn2 = pred_nn2_scaled$net.result*(max_time-min_time)+min_time
test_data_time = test_data$time*(max_time-min_time)+min_time
a04 = cbind.data.frame(test_data_time,pred_nn2,data1[-index,2],data1[-index,1])
colnames(a04) = c("actual","prediction","machine","app")
attach(a04)
p01 = ggplot(a04,aes(x=actual,y=prediction))+
geom_point(aes(color=machine),size=1)+
scale_y_continuous("Predicted Execution Time [s]",breaks=seq(0,1000,100),limits=c(0,1000))+
scale_x_continuous("Actual Execution Time [s]",breaks=seq(0,1000,100),limits=c(0,1000))+
ggtitle("Neural Net Fit (TEST DATA):\nActual vs. Predicted Execution Time")+
geom_abline(intercept=0,slope=1)+
theme_light()
p02 = ggplot(a04,aes(x=actual,y=prediction))+
geom_point(aes(color=app),size=1)+
scale_y_continuous("Predicted Execution Time [s]",breaks=seq(0,1000,100),limits=c(0,1000))+
scale_x_continuous("Actual Execution Time [s]",breaks=seq(0,1000,100),limits=c(0,1000))+
ggtitle("Neural Net Fit (TEST DATA):\nActual vs. Predicted Execution Time")+
geom_abline(intercept=0,slope=1)+
theme_light()
grid.arrange(p01,p02,nrow=1)

#EARLY STOPPING TEST

i = 1000
summary_data = data.frame(matrix(rep(0,4*i),ncol=4))
colnames(summary_data) = c("treshold","epochs","train_mse","test_mse")
for (j in 1:i){
a = runif(1,min=0.01,max=10)
#Train the model
model_nn2 = neuralnet(formula=time~instructions+nodes+machine_num+app_num,data=train_data,hidden=3,stepmax=1000000,threshold=a)
#Calculate Min and Max Response for rescaling
max_time = max(data2$time)
min_time = min(data2$time)
#Predict test data from trained nn
pred_nn2_scaled = compute(model_nn2,test_data[,c(1,2,4,5)])
#Rescale test prediction
pred_test_data_time = pred_nn2_scaled$net.result*(max_time-min_time)+min_time
#Rescale test actual
test_data_time = test_data$time*(max_time-min_time)+min_time
#Rescale train prediction
pred_train_data_time = model_nn2$net.result[[1]][,1]*(max_time-min_time)+min_time
#Rescale train actual
train_data_time = train_data$time*(max_time-min_time)+min_time
#Calculate mse
test_mse = mean((pred_test_data_time-test_data_time)^2)
train_mse = mean((pred_train_data_time-train_data_time)^2)
#Summarize
summary_data[j,1] = a
summary_data[j,2] = model_nn2$result.matrix[3,]
summary_data[j,3] = round(train_mse,3)
summary_data[j,4] = round(test_mse,3)
print(summary_data[j,])
}

plot(summary_data$epochs,summary_data$test_mse,pch=19,xlim=c(0,2000),ylim=c(0,300000),cex=0.5,xlab="Training Steps",ylab="MSE",main="Early Stopping Test: Comparing MSE : TEST=BLACK TRAIN=RED")
points(summary_data$epochs,summary_data$train_mse,pch=19,col=2,cex=0.5)

Training Predictions

Test Predictions

data2 example

EARLY STOPPING TEST

1 Ответ

0 голосов
/ 12 мая 2018

Я бы предположил, что это переоснащение. Сеть учится воспроизводить данные как словарь, а не изучает основную функцию в данных. Есть разные вещи, которые могут вызвать это, и способы их устранения. Вещи, которые вызывают переоснащение:

  • Возможно, сеть слишком долго тренировалась.
  • Сеть может иметь гораздо больший вес, чем обучающие примеры.

Способы уменьшения переоснащения:

  • Создать проверочный набор данных и прекратить обучение сети, как только потери набора проверки начинают увеличиваться. Это необходимость.
  • Уменьшение размера сети. (Меньше веса)
  • Используя метод регуляризации, такой как снижение веса или отсев.

Кроме того, может оказаться, что нейронной сети слишком сложно решить проблему на основе предоставленных данных. Воспроизведение обучающих данных не доказывает, что сеть может решить проблему, это только доказывает, что сеть может запоминать такие вещи, как словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...