이전 포스트에서 올린 코드에서 에러가 난다는 쪽지를 받고 해결법에 대해 포스팅을 남깁니다. 우선 포스트를 꼼꼼히 읽고 그 내용을 복기하면서 공부해주신 독자분들에게 감사드립니다. 저도 기록을 남기면서 공부를 하고 누군가에게도 도움이 될 것으로 기대하고 포스트를 올리는 것인데, 목적대로 된 셈이니까요. 문제의 에러는 머신러닝 관련 패키지인 뉴럴넷 (neuralnet) 관련 에러입니다.
require(neuralnet)
x<-seq span="">-seq>
set.seed(4567)
b<-rnorm span="">-rnorm>
y=3*x+b
y
model=lm(y~x)
summary(model)
data1<-as .data.frame="" span="" x="">-as>
data2<-as .data.frame="" span="" y="">-as>
data3<-cbind data1="" data2="" span="">-cbind>
data3$pred=2.96*data3$x+22
data3$error=data3$pred-data3$y
summary(data3)
fit<-neuralnet data="data3," hidden="c(3,3)," stepmax="1e6)</span" threshold="0.1" x="" y="">-neuralnet>
pred<-compute fit="" span="" x="">-compute>
이 예제 코드를 진행하면 본래 정상적으로 진행이 됐는데, 마지막 코드에서 에러가 발생했다는 쪽지를 받은 것입니다. 처음에 제 컴퓨터에서 잘 됐기 때문에 왜 이런지 몰랐으나 이런 경우 버전 업데이트에 따른 차이일 가능성이 있어 패키지와 R 버전 업데이트 후 다시 시행했습니다.
> pred<-compute fit="" span="" x="">-compute>
Error in if (ncol(newdata) == length(object$model.list$variables)) { :
argument is of length zero
이 에러는 뭔가 null 값이 있거나 혹은 객체 간의 길이가 다르다는 이야기로 해석되지만, 실제로는 그런 데이터가 아니라서 잠시 고민했습니다. 어쩌면 버전 업데이트에 따른 예기치 않은 에러일수도 있다는 생각입니다. 아무튼 가장 간단한 해결책은 신경망 연산 결과인 fit에서 바로 결과를 가져오는 것입니다. fit을 실행시키면 여러 가지 결과값이 나옵니다. 이중에서 신경망이 연산한 결과값은 fit$net.result에 저장됩니다. 굳이 compute 없이도 결과를 볼 수 있습니다.
> fit$net.result
[[1]]
[,1]
[1,] 19.21814
[2,] 21.82396
[3,] 29.48279
[4,] 36.85065
[5,] 40.57497
[6,] 42.75879
[7,] 44.81411
[8,] 47.24921
[9,] 50.14866
[10,] 53.35323
[11,] 56.59110
[12,] 59.63742
[13,] 62.40546
[14,] 64.91615
[15,] 67.21052
[16,] 69.28216
[17,] 71.06039
[18,] 72.45383
[19,] 73.58927
[20,] 75.50948
[21,] 79.68781
[22,] 85.69231
[23,] 91.63713
[24,] 96.34857
[25,] 99.68361
[26,] 101.93615
[27,] 103.54711
[28,] 105.26694
[29,] 107.87737
[30,] 111.33103
[31,] 114.93902
[32,] 118.17665
[33,] 120.92336
[34,] 123.29691
[35,] 125.48471
[36,] 127.66397
[37,] 129.97654
[38,] 132.52380
[39,] 135.36545
[40,] 138.51733
[41,] 141.94946
[42,] 145.58780
[43,] 149.32293
[44,] 153.02631
[45,] 156.57092
[46,] 159.85042
[47,] 162.79154
[48,] 165.35754
[49,] 167.54413
[50,] 169.37117
이제 이를 이용해서 예제와 같은 결과를 얻어 보겠습니다. 다만 이름이 바뀌기 때문에 결과에 V1이라는 이름을 같이 붙여줍니다.
fit$net.result
data4<-as .data.frame="" fit="" net.result="" span="">-as>
colnames(data4) = c("V1")
data5<-cbind data3="" data4="" span="">-cbind>
data5를 실행시키면 이전 예제와 같은 결과가 나올 것입니다.
혹시 같은 에러가 나오시는 분은 이렇게 해결하시기 바랍니다.
피드백 주시는 독자분들에게 감사드립니다.
댓글
댓글 쓰기