R에서 신경망 모델을 훈련시키고 검증하는 방법?


33

신경망을 사용한 모델링에 익숙하지 않지만 관찰 된 데이터에 잘 맞는 모든 사용 가능한 데이터 포인트로 신경망을 구축 할 수있었습니다. 신경망은 nnet 패키지로 R에서 수행되었습니다.

require(nnet)      
##33.8 is the highest value
mynnet.fit <- nnet(DOC/33.80 ~ ., data = MyData, size = 6, decay = 0.1, maxit = 1000)      
mynnet.predict <- predict(mynnet.fit)*33.80  
mean((mynnet.predict - MyData$DOC)^2) ## mean squared error was 16.5      

내가 분석하는 데이터는 다음과 같습니다. 여기서 DOC는 모델링해야 할 변수입니다 (약 17,000 개의 관측치가 있음).

      Q  GW_level Temp   t_sum   DOC
1 0.045    0.070 12.50     0.2 11.17
2 0.046    0.070 12.61     0.4 11.09
3 0.046    0.068 12.66     2.8 11.16
4 0.047    0.050 12.66     0.4 11.28
5 0.049    0.050 12.55     0.6 11.45
6 0.050    0.048 12.45     0.4 11.48

이제 모델이 데이터 포인트의 70 %로 훈련되고 나머지 30 %의 데이터 포인트로 검증되어야한다는 것을 읽었습니다. 어떻게해야합니까? 어떤 기능을 사용해야합니까?

캐럿 패키지의 기차 기능을 사용하여 크기 및 붕괴에 대한 매개 변수를 계산했습니다.

require(caret)
my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
mynnetfit <- train(DOC/33.80 ~ ., data = MyData, method = "nnet", maxit = 100, tuneGrid = my.grid, trace = f)

다른 웹 사이트 / 게시물에 대한 직접적인 도움이나 링크는 대단히 감사합니다.


6
실제로 알고리즘의 성능은 선택한 분할 지점에 따라 상당히 달라질 수 있기 때문에 트레인 / 테스트 분할 방법론은 하위 수준입니다 (5 % 차이를 보았습니다 ...). 더 나은 방법론은 교차 검증입니다.
John Doucette

답변:


36

Max Kuhn의 캐럿 매뉴얼-모델 구축 은 훌륭한 출발점입니다.

유효성 검사 단계는 캐럿 train () 호출 내에서 발생하는 것으로 생각합니다. 부트 스트랩을 통해 부패 및 크기의 하이퍼 매개 변수 또는 trControl 매개 변수를 통해 지정할 수있는 다른 방법을 선택하기 때문입니다. 최종 선택된 모델의 오류를 테스트 세트로 특성화하는 데 사용하는 데이터 세트를 호출합니다. 캐럿이 선택 가능한 하이퍼 파라미터를 처리하므로 훈련 세트와 테스트 세트 만 있으면됩니다.

caret에서 createDataPartition () 함수를 사용하여 데이터 세트를 학습 및 테스트 세트로 분할 할 수 있습니다. 교육 수준 및 직업적 명성과 관련된 소득에 대한 정보가있는 자동차 패키지의 Prestige 데이터 세트를 사용하여이를 테스트했습니다.

library(car)
library(caret)
trainIndex <- createDataPartition(Prestige$income, p=.7, list=F)
prestige.train <- Prestige[trainIndex, ]
prestige.test <- Prestige[-trainIndex, ]

createDataPartition () 함수는 파티션을 만들지 않기 때문에 이름이 약간 잘못 지정된 것 같지만 훈련 및 테스트 세트를 구성하는 데 사용할 수있는 인덱스 벡터를 제공합니다. 그건 자신이 일을 아주 쉽게 ) 샘플 ()하지만 한 가지의 createDataPartition을 (사용 R에 명백히 요인 수준 내에서 샘플을 하는가이다. 또한 결과가 범주 형인 경우 데이터 파티션 전체에 분포가 유지됩니다. 그러나 결과가 연속적이기 때문에이 경우에는 관련이 없습니다.

이제 훈련 세트에서 모델을 훈련시킬 수 있습니다.

my.grid <- expand.grid(.decay = c(0.5, 0.1), .size = c(5, 6, 7))
prestige.fit <- train(income ~ prestige + education, data = prestige.train,
    method = "nnet", maxit = 1000, tuneGrid = my.grid, trace = F, linout = 1)    

따로 : 회귀 (vs. 분류) 문제로 nnet을 작동 시키려면 linout 매개 변수를 추가해야했습니다. 그렇지 않으면 모델에서 1을 모두 예측 값으로 얻었습니다.

그런 다음 테스트 데이터 세트를 사용하여 맞춤 객체에 대해 예측을 호출하고 결과에서 RMSE를 계산할 수 있습니다.

prestige.predict <- predict(prestige.fit, newdata = prestige.test)
prestige.rmse <- sqrt(mean((prestige.predict - prestige.test$income)^2)) 

Max Kuhn 링크가 사망 한 것 같습니다.
EngrStudent-복직 모니카

Max Kuhn의 책을 찾았습니다. 여기에 숨겨져 있습니다 : feat.engineering
Agile Bean
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.