머신러닝 예제

한치록(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')
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)
# [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를 만든다.

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(x,y)라는 함수를 만들어 사용하자. 그리고 rmspe.rw는 단순 임의보행(random walk)을 가정하여 예측값을 구하는 경우(직전 연도와 동일한 값으로 예측)의 RMSE이다.

RMSE <- function(x,y) sqrt(mean((x-y)^2))
rmspe.rw <- RMSE(z15$ynext, z15$deathrate)
rmspe.rw # random walk, defined in index11.php
# [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
## --------------------------------------------------------------------