我对机器学习技术和R语言编程都比较新手,目前正在尝试将神经网络拟合到我的一些数据上。然而,神经网络的预测结果对我来说毫无意义。我已经查看了StackOverflow,但没有找到解决这个问题的方案。
我的数据(这是测试集的一部分,训练集的格式相同)
target monday tuesday wednesday thursday friday saturday indepedent428 277 1 0 0 0 0 0 3317429 204 0 1 0 0 0 0 1942430 309 0 0 1 0 0 0 2346431 487 0 0 0 1 0 0 2394432 289 0 0 0 0 1 0 2023433 411 0 0 0 0 0 1 1886434 182 0 0 0 0 0 0 1750435 296 1 0 0 0 0 0 1749436 212 0 1 0 0 0 0 1810437 308 0 0 1 0 0 0 2021438 378 0 0 0 1 0 0 2494439 329 0 0 0 0 1 0 2110440 349 0 0 0 0 0 1 1933
我的代码
resultsnn <- neuralnet(target~monday+tuesday+wednesday+thursday+friday+saturday+independent,data=training,hidden=3,threshold=0.01,linear.output = TRUE)compute(resultsnn,test[,2:8])$net.result
我的结果(所有测试集案例的预测值都相同)
[,1]428 508.4962231429 508.4962231430 508.4962231431 508.4962231432 508.4962231433 508.4962231434 508.4962231435 508.4962231436 508.4962231437 508.4962231438 508.4962231439 508.4962231440 508.4962231
我还尝试了什么?
我尝试了不使用虚拟变量的版本(只包括独立变量,这并没有改变结果的类型)
我创建了一些合成数据并将其用作输入,对于相同的代码,这确实能正常工作:
#构建训练集input_train <- as.data.frame(c(1:100))output_train <- as.data.frame(c(sqrt((1:100)+1)))train <- cbind.data.frame(output_train,input_train)colnames(train) <- c("output","input")#构建测试集input_test <- as.data.frame(c(101:150))output_test <- as.data.frame(c(sqrt((101:150)+1)))test <- cbind.data.frame(output_test,input_test)colnames(test) <- c("output","input")#NEURALNET包#神经网络3个神经元res.train <- neuralnet(output~input,data=train,hidden=3,threshold=0.01) #训练神经网络compute(res.train,test[,2])$net.result #使用神经网络在测试集上进行预测
我还尝试了其他包(例如,nnet和RSNNS),但这些包在使用合成数据时已经无法提供正确的预测。
一些额外信息
关于数据类型的额外信息:
str(test) 'data.frame': 82 obs. of 8 variables: $ target : int 277 204 309 487 289 411 182 296 212 308 ... $ monday : int 1 0 0 0 0 0 0 1 0 0 ... $ tuesday : int 0 1 0 0 0 0 0 0 1 0 ... $ wednesday : int 0 0 1 0 0 0 0 0 0 1 ... $ thursday : int 0 0 0 1 0 0 0 0 0 0 ... $ friday : int 0 0 0 0 1 0 0 0 0 0 ... $ saturday : int 0 0 0 0 0 1 0 0 0 0 ... $ independent: int 3317 1942 2346 2394 2023 1886 1750 1749 1810 2021 ...str(training) 'data.frame': 397 obs. of 8 variables: $ target : int 1079 1164 1069 1038 629 412 873 790 904 898 ... $ monday : int 0 0 0 0 0 0 1 0 0 0 ... $ tuesday : int 1 0 0 0 0 0 0 1 0 0 ... $ wednesday : int 0 1 0 0 0 0 0 0 1 0 ... $ thursday : int 0 0 1 0 0 0 0 0 0 1 ... $ friday : int 0 0 0 1 0 0 0 0 0 0 ... $ saturday : int 0 0 0 0 1 0 0 0 0 0 ... $ independent: int 2249 2381 4185 2899 2387 2145 2933 2617 2378 3569 ...
如果您需要任何额外信息,请告诉我!感谢大家的帮助(:
回答:
看起来target和independent之间没有信号。暂时忽略工作日,如果你拟合带有和不带有梯度的线性模型:
# 一个查看响应与independent的线性模型(带截距)lm1 <- lm(target ~ indepedent, data = training)lm1## Call:# lm(formula = target ~ indepedent, data = training)## Coefficients:# (Intercept) indepedent # 206.37312594 0.04853823 # 仅截距lm0 <- lm(target ~ 1, data = training)lm0## Call:# lm(formula = target ~ 1, data = training)## Coefficients:# (Intercept) # 310.0769 # 两个模型的数据等同于可能的结果plot(target ~ indepedent, data = training)lines(fitted(lm1) ~ indepedent, data = training, lty = 2)lines(fitted(lm0) ~ indepedent, data = training, col = 2)
… 仅截距的模型更受青睐:
# 测试哪个模型更好# 大p值表明我们乐于接受简单模型anova(lm0, lm1)# Analysis of Variance Table## Model 1: target ~ 1# Model 2: target ~ indepedent# Res.Df RSS Df Sum of Sq F Pr(>F)# 1 12 86990.923 # 2 11 81792.165 1 5198.7582 0.69917 0.42086head(fitted(lm0))# 428 429 430 431 432 433 # 310.0769231 310.0769231 310.0769231 310.0769231 310.0769231 310.0769231
所以这也是机器学习方法告诉你的。简单模型预测对于每个independent值,target都有一个单一的值。显然,添加工作日变量并不能改善这一点。
你看到玩具示例的预测是因为响应中有一个强信号。