한치록(2022). 계량경제학강의, 제4판, 박영사, 19장 부록 “머신러닝 예제”, 버전 0.2.2.
이 문서에 제시된 R 명령들은 주로 James, Witten, Hastie and Tibshirani (2013, An Introduction to Statistical Learning: with Applications in R, Springer)을 참고하였으며, 그 책으로 충분하지 않은 부분은 패키지 문서에 기초하여 직접 코딩하였거나 인터넷 검색으로부터 얻은 정보를 확인하여 작성하였다.
회귀(regression) | 분류(classifiction) |
---|---|
데이터 준비 Subset Selection Splines Ridge와 Lasso PCR과 PLS Decision Tree Tree Ensemble Support Vector Regression Neural Networks Super Learner |
데이터 준비 Logit, LDA, QDA ROC와 Cutoff 값 Class Imbalance Ridge와 Lasso Decision Tree Tree Ensemble Support Vector Machines Neural Networks Super Leaner |
loedata
패키지(『계량경제학 강의』 데이터 패키지)를 아직
설치하지 않았으면 설치한다.
install.packages("loedata")
loedata
패키지 설치 후 아래와 같이 데이터를
정리한다.
지역별 데이터를 읽어들이고 정리한다.
data(RegkoPanel, package='loedata')
<- RegkoPanel
z for (v in c('grdp', 'regpop')) z[[v]] <- z[[v]]/1e6
$eq5d <- z$eq5d*100
z
<- subset(z, year==2014)
z14 <- subset(z, year==2015)
z15 <- subset(z, year==2016)
z16
$ynext <- z15[match(z14$id, z15$id), 'deathrate']
z14$ynext <- z16[match(z15$id, z16$id), 'deathrate']
z15
<- na.omit(z14[,-(1:5)])
z14 <- na.omit(z15[,-(1:5)])
z15 <- z15
z.test
dim(z14)
# [1] 223 20
names(z14)
# [1] "grdp" "regpop" "popgrowth" "eq5d" "deaths" "drink"
# [7] "hdrink" "smoke" "aged" "divorce" "medrate" "gcomp"
# [13] "vehipc" "accpv" "dumppc" "stratio" "deathrate" "pctmale"
# [19] "accpc" "ynext"
z14
데이터에서 ynext
변수는 2015년
deathrate
이고, z15
데이터에서
ynext
변수는 2016년 deathrate
이다.
z14
데이터를 이용하여 머신러닝을 실습해 본다(train set).
목표변수는 이듬해 사망률(ynext
), 예측변수들은 당해 연도의
모든 변수들이다. z15
(z.test
) 데이터는
시험용으로 사용한다(test set).
경우에 따라 data frame이 아니라 특성변수 행렬(matrix)과 목표변수
벡터가 필요하다. 이때 사용할 목적으로 X
, Y
,
X15
를 만든다.
<- ynext~.
fm <- model.frame(fm, data=z14)[,1]
Y <- model.matrix(fm, data=z14)[,-1]
X <- model.matrix(fm, data=z.test)[,-1] X15
RMSE(x,y)
라는 함수를 만들어 사용하자. 그리고
rmspe.rw
는 단순 임의보행(random walk)을 가정하여 예측값을
구하는 경우(직전 연도와 동일한 값으로 예측)의 RMSE이다.
<- function(x,y) sqrt(mean((x-y)^2))
RMSE <- RMSE(z15$ynext, z15$deathrate)
rmspe.rw # random walk, defined in index11.php
rmspe.rw # [1] 53.24273
## -------------------------------------------------------------------- data(RegkoPanel, package='loedata') z <- RegkoPanel for (v in c('grdp', 'regpop')) z[[v]] <- z[[v]]/1e6 z$eq5d <- z$eq5d*100 z14 <- subset(z, year==2014) z15 <- subset(z, year==2015) z16 <- subset(z, year==2016) z14$ynext <- z15[match(z14$id, z15$id), 'deathrate'] z15$ynext <- z16[match(z15$id, z16$id), 'deathrate'] z14 <- na.omit(z14[,-(1:5)]) z15 <- na.omit(z15[,-(1:5)]) z.test <- z15 dim(z14) names(z14) fm <- ynext~. Y <- model.frame(fm, data=z14)[,1] X <- model.matrix(fm, data=z14)[,-1] X15 <- model.matrix(fm, data=z.test)[,-1] RMSE <- function(x,y) sqrt(mean((x-y)^2)) rmspe.rw <- RMSE(z15$ynext, z15$deathrate) rmspe.rw ## --------------------------------------------------------------------