1 regularized model을 이용한 이미지 분류 1 Introduction 이미지 데이터는 매트릭스 형태이다. 이미지 분류를 하기 위해서 이미지 형식을 매트릭스 에서 벡터로 변환하는 작업이 필요하다. 그러면 하나의 이미지는 p차원인 벡터형식이다. 만약 n개의 이미지 데이터가 있다면 행은 n개이고 열은 p차원인 매트릭스 형식이 필요 하다. 여기서 사용할 데이터는 흑백 이미지로 이루어진 png 형식이다. 데이터의 출처는 Cambridge U niversity Computer Laboratory이고 1992년 4월부터 1994년 4월 사이에 랩 실에서 사람들의 얼굴을 촬영한 것이다. 40명의 사람들이 10개의 다른 표정을 짓고있다. 예를들어 눈을 감았거나 뜬 얼굴, 웃고 있거나 웃지 않는 얼굴, 안경을 썼거나 쓰지 않는 얼굴 이미지들이 있다. 본 연구의 목적은 안경을 쓴 사람과 쓰지 않은 사람을 분류하는 것 이다. 다음은 여기서 사용할 데이터의 일부분이다. Figure 1: The Database of Faces 각 이미지들의 매트릭스 구조가 같다(112 92). 이제 이 이미지를 벡터로 변환하는 작업을 실시하면 차원은 112 92 = 1030이다. 총 이미지의 개수 즉 관측값은 400개이므로 행: 400, 열: 10304인 매트릭스가 생성된다. 이미지 분류에는 여러가지 기법이 있는데 logistic regression model을 사용할 경우 현재
2 데이터의 차원(10304)이 관측값(400)보다 훨씬 크기 때문에(p >> n) overfitting 문제가 발생한다. 그러므로 logistic regression의 loss function에 penalty term을 주는 방식인 regularized regression model을 사용하면 p>>n인 경우에 overfitting 문제를 해결할 수 있다. regularized regression model은 ridge regression, lasso regression 그리고 elastic net regression model을 사용할 것이다. 2 2.1 Method Ridge regression Ridge regression이란 RSS를 최소화 하면서 회귀계수 β에 L2 norm을 제한하는 기법이다. 모수 추정식은 다음과 같다. R T β = argmin{(y Xβ) (y Xβ) + λkβk2 } wherekβk2 = β p X βj2 j=1 1 T T = (X X + λi) X y, λ 0, where I is the p p identity matrix p X T argmin{(y Xβ) (y Xβ)}, s.t βj2 t β j=1 ridge의 경우 penalty term이 L2 norm 즉, 제곱꼴로 되어있다. 제약식을 보면 β의 제 곱합이 t보다 작으므로 그래프로 그려보면 Figure1 같은 원의 형태로 나타난다. 그래프를 보면 제약식이 동그라미 모양으로 표현되므로 등고선(MSE의 그래프)과 정확하게 한 점에 서 만나지 않는 것을 알 수 있다. 다시 말하면 회귀계수β = 0이 될 수 없으므로 변수 선택이 불가능하다. 또한 t가 커지면 제약식인 동그라미 모양이 커져서 β (OLS에서 모수 추정값) 에 가까와지면서 OLS(Ordinary Least Square)꼴과 비슷해진다. 반대로 t가 작아지면 제약 식인 동그라미 모양이 작아져서 β에 가중치가 커져서 β값들이 0에 가까와진다.
3 Figure 2: Contours of the error and contraint functions for the ridge regression. 2.2 Lasso regression Lasso regression이란 RSS를 최소화하면서 회귀계수 β에 L1 norm을 제한하는 기법이다. 모수 추정식은 다음과 같다. L β = argmin{(y Xβ)T (y Xβ) + λkβk1 } β T argmin{(y Xβ) (y Xβ)} s.t β where kβk1 = p X βj t j=1 p X βj j=1 lasso의 경우 penalty term이 L1 norm 즉, 절댓값 꼴로 되어있다. 제약식을 보면 β의 절 댓값합이 t보다 작으므로 그래프로 그려보면 Figure2와 같은 다이아몬드 형태로 나타난다. 그래프를 보면 제약식이 다이아모드 모양으로 표현되므로 등고선과 정확하게 한 점에서 만나는 것을 알 수 있다. 다시 말하면 회귀계수 β = 0이 될 수 있으므로 변수 선택이 가 능하다. 또한 t가 커지면 제약식인 다이아몬드 모양이 커져서 β (OLS에서 모수 추정값)에 가까와지면서 OLS꼴과 비슷해진다. 반대로 t가 작아지면서 제약식인 다이아몬드 모양이 작아져서 β추정값들이 0에 가까와진다. 즉 변수 선택이 되는 것이다.
4 Figure 3: Contours of the error and contraint functions for the ridge regression. ridge regression과 lasso regression의 차이점 두 제약식의 그래프를 살펴보면 ridge regression은 β 추정값이 0이 될 수 없어서 변수선택이 불가능하고 lasso regression은 β 추정값이 0이 될 수 있으므로 변수선택이 가능하다. 둘 다 차원(p)이 관측수(n)모두 큰 경우에 오버피팅 문제를 피하기 위해서 사용하기 적합하 다. 다음과 같은 예시가 있다. 10,000개의 변수를 가지고 있는 큰 데이터 셋이 있다. 그리고 이 변수들 중에는 서로 correlate되어있는 변수들이 존재한다. 이런 경우 ridge와 lasso 중 어떤 예측 모형을 사용해야 하는가? 1. ridge regression 적용할 경우 모든 변수를 가지고 오면서 계수값을 줄일 것이다. 하 지만 문제는 변수가 10,000개 그대로 유지하므로 모델이 굉장히 복잡하다. 이는 모델 성능 저하에 영향을 미칠 수 있다. 2. lasso regression 적용할 경우 lasso에서의 가장 큰 문제는 변수들끼리 correlate하면 lasso는 단 한 개의 변수만 채택하고 다른 변수들의 계수는 0으로 바꿀 것이다. 이는 정보가 손실되므로 정확성이 떨어질 수 있다. 이런 문제를 해결하는 방법은 다른 regularized regression model인 Elastic net regression
5 을 사용하는 것이다. 2.3 Elastic net regression Elastic net regression이란 RSS를 최소화하면서 회귀계수 β에 L1 norm과 L2 norm 두 개를 제한하는 기법이다. 모수 추정식은 다음과 같다. β enet = argmin{(y Xβ)T (y Xβ) + λ1 kβk1 + λ2 kβk2 } β argmin{(y Xβ)T (y Xβ)} s.t (1 α)kβk1 + αkβk2 t for some t β (1 α)kβk1 + αkβk2 를 elastic net penalty라고 부르고 ridge penalty와 lasso penalty를 결 합한 형태이다. α = 1이면 elastic net은 simple ridge regression이 되고, α = 0이면 elastic net은 simple lasso regression이 된다. 다시 말하면 elastic penalty는 변수의 축소와 선택을 모두 할 수 있고, 최적의 α를 찾아 elastic net의 β를 추정할 수 있다. 이제 실제 데이터를 사 용하여 α값을 바꿔가며 최적의 α값을 찾고 ridge regression, lasso regression 그리고 elastic net regression의 성능 비교를 실시하도록 하겠다.
3 6 Results and Conclustion 본 연구에서는 R 프로그램을 사용하여 분석을 실시했다. 앞서 언급했듯이 본 연구의 목적은 사람들의 얼굴 데이터를 사용하여 안경을 쓴 사람과 쓰지 않은 사람을 분류하는 것이다. 여 기서 반응변수는 y (0, 1) 로 이루어져 있으므로 logistic regression을 이용하여 회귀계수를 추정할 수 있다. 하지만 설명변수의 수가 10304개로 매우 많으므로 설명변수들 사이의 강한 상관관계로 인한 다중공선성이 존재할 수 있기 때문에 회귀계수 추정량의 분산이 커져서 추정회귀식의 예측정확도가 떨어지는 문제점이 발생할 수 있다. 또한 설명변수의 개수가 증가하면 변수에 대한 해석력이 떨어진다. 다시 말하면 많은 설명변수 중 어떤 변수가 중 요한 역할을 하는지에 대한 판단이 어려워진다. 그러므로 차원 축소를 통해 예측 정확도 (prediction accuaracy)를 높여주는 regularized regression model을 사용할 것이다. 데이터 불러오는 작업 pgm형식의 이미지 파일을 불러오는 함수인 pixmap패키지의 read.pnm를 사용하여 불러 온다. 그러면 각 이미지 파일은 (112 92)의 매트릭스 형식으로 저장이 된다. 이제 각 이 미지를 매트릭스에서 벡터로 바꾸는 작업을 실시하고 400개의 벡터를 매트릭스 형식(400 10305)으로 생성한다. 안경 쓴 사람들은 y = 1, 쓰지 않은 사람들은 y = 0으로 지정한다. 이제 이 y값을 원래 이미지 데이터로 만든 매트릭스와 결합한다. 이렇게 생성된 매트릭스에 glmnet패키지를 이용하여 ridge, lasso 그리고 elastic net regression을 적용하도록 하겠다. 데이터 나누는 작업 400개의 관측값을 200개의 train data와 200개의 test data로 나눈다. Ridge regression 적용 glmnet패키지의 glmnet함수는 elastic net의 α를 조절하면 ridge와 lasso regression을 적용 할 수 있다. 여기서는 α = 1로 설정하여 elastic net이 ridge regression이 되도록하여 분석 한다. 최적의 tuning parameter(λ)를 선택하는 방법은 cross-validation을 적용하여 crossvalidation error가 가장 작은 λ를 선택하는 것이다. 그래프로 그려보면 Figure4과 같고, 그렇게 선택한 결과 λ = 1.892이다. 이 λ를 ridge regression에 적용하여 분석한 뒤 test data를 예측한 결과 confusion matrix는 다음과 같고 예측 정확도를 계산해 보면 85%이다. 0 1 0 134 28 1 2 36
7 Figure 4: Plot of selecting lambda which is ridge penalty using cross-validation Lasso regression 적용 이제 α = 1로 설정하여 elastic net이 lasso regression이 되도록하여 분석한다. 최적의 tuning parameter(λ)를 선택하는 방법은 ridge와 마찬가지로 cross-validation을 적용하여 crossvalidation error가 가장 작은 λ를 선택하는 것이다. 그래프로 그려보면 Figure5와 같고, 그렇게 선택한 결과 λ = 0.0127이다. 이 λ를 lasso regression에 적용하여 분석한 뒤 test data를 예측한 결과 confusion matrix는 다음과 같고 예측 정확도를 계산해 보면 78%이다. 0 1 0 129 37 1 7 27
8 Figure 5: Plot of selecting lambda which is lasso penalty using cross-validation Elastic net regression 적용 이제 α = 0.5로 적당한 값을 주어 ridge와 lasso의 중간이 되도록하여 분석한다. 최적의 tuning parameter(λ)를 선택하는 방법은 ridge, lasso와 마찬가지로 cross-validation을 적용 하여 cross-validation error가 가장 작은 λ를 선택하는 것이다. 그래프로 그려보면 Figure6 와 같고, 그렇게 선택한 결과 λ = 0.004이다. 이 λ를 lasso regression에 적용하여 분석한 뒤 test data를 예측한 결과 confusion matrix는 다음과 같고 예측 정확도를 계산해 보면 81% 이다. 0 1 0 127 29 1 9 35
9 Figure 6: Plot of selecting lambda which is elastic penalty using cross-validation ridge vs lasso vs elastic net Ridge Lasso Elastic net 85% 78% 81% 위의 표는 세 개의 regularized regression model의 예측 정확도를 비교한 것이다. 표에 의하면 Ridge regression이 85%로 제일 높고, 두 번째로는 Elastic net regression이 81%로 높고 마지막은 Lasso regression이 78%로 제일 낮다. ROC curve로 비교한 결과는 Figure7 과 같다. ROC curve를 봐도 Ridge regression model이 데이터에 가장 적합한 것 같다.
10 Figure 7: Plot of ROC curve of ridge, lasso and elastic net regression 4 Appendix rm( list = ls ()) gc( reset = T) set. seed (2017) ## load library library ( pixmap ) library ( glmnet ) library ( ROCR ) ## data load pic = list () k=1 for (j in 1:40){ setwd ( paste 0("C :\\ Users \\ uos \\ Google drive \\ datamining _ project \\ att _ faces \\","s",j)) for (i in 1:10){
11 } } pic [[k]]= read. pnm ( file = dir ()[ i]) @grey k=k+1 ## data set pic. mat = matrix ( unlist ( lapply (pic,as. vector )), nrow = length ( pic ), byrow = T) pic. mat.y=c(0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0, 1,1,1,0,0,0,0,1,1,0, 0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, 0,0,0,1,1,0,0,0,0,1, 0,0,0,0,0,0,0,0,0,0, 1,1,0,0,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 1,1,1,0,1,0,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,1,1, 1,1,1,1,1,1,1,1,1,1, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0) ## data split idx = sample ( nrow ( pic. mat ), nrow ( pic. mat )/2) face.tr=as. matrix ( pic. mat [idx,-1]) face.tr.y= pic. mat [idx,1] face.te=as. matrix ( pic. mat [-idx,-1]) face.te.y= pic. mat [-idx,]1
12 ## ridge regression ri.fit = glmnet (x = face.tr,y = as. factor ( face.tr.y), family = " binomial ", alpha = 0) ri. pred = predict (ri.fit, newx = face.te) ri.cv=cv. glmnet (x = face.tr,y = face.tr.y, alpha =0) bestlam =ri.cv$ lambda. min ri.fit 1= glmnet (x = face.tr,y = as. factor ( face.tr.y), family = " binomial ", alpha = 0, lambda = bestlam ) ri. pred 1 = predict (ri.fit 1, newx = face.te) ri. probs = exp (ri. pred 1 )/( 1+ exp (ri. pred 1)) ri. prob = ifelse (ri. probs > 0.5,1,0) ri.ta= table (ri.prob, face.te.y) (ri.ta[1,1]+ ri.ta[2,2 ])/ sum (ri.ta) ## lasso resgression la.fit = glmnet (x = face.tr,y = as. factor ( face.tr.y), family = " binomial ", alpha = 1) la. pred = predict (la.fit, newx = face.te) la.cv=cv. glmnet (x = face.tr,y = face.tr.y, alpha =1) bestlam =la.cv$ lambda. min la.fit 1= glmnet (x = face.tr,y = as. factor ( face.tr.y), family = " binomial ", alpha = 1, lambda = bestlam ) length (la.fit 1$ beta [,1][ la.fit 1$ beta [,1]!= 0]) ## 10304 -> 75 subset selection la. pred 1 = predict (la.fit 1, newx = face.te) la. probs = exp (la. pred 1 )/( 1+ exp (la. pred 1)) # prob la. prob = ifelse (la. probs > 0.5,1,0) la.ta= table (la.prob, face.te.y) # confusion matrix (la.ta[1,1]+ la.ta[2,2 ])/ sum (la.ta) # accuracy ## elastic net regression
13 el.fit = glmnet (x = face.tr,y = as. factor ( face.tr.y), family = " binomial ",alpha = 0.5) el. pred = predict (el.fit, newx = face.te) el.cv=cv. glmnet (x = face.tr,y = face.tr.y, alpha =0.5) bestlam =el.cv$ lambda. min el.fit 1= glmnet (x = face.tr,y = as. factor ( face.tr.y),family = " binomial ",alpha = 0.5,lambda = bestlam ) el. pred 1 = predict (el.fit 1, newx = face.te) el. probs = exp (el. pred 1 )/( 1+ exp (el. pred 1)) el. prob = ifelse (el. probs > 0.5,1,0) el.ta= table (el.prob, face.te.y) (el.ta[1,1]+ el.ta[2,2 ])/ sum (el.ta) ## cv error plot plot (la.cv) plot (ri.cv) plot (el.cv) # ROC curve roc.la= performance ( prediction (la.probs, face.te.y)," tpr "," fpr ") roc.ri= performance ( prediction (ri.probs, face.te.y)," tpr "," fpr ") roc.el= performance ( prediction (el.probs, face.te.y)," tpr "," fpr ") plot ( roc.la, main =" ROC curve ",lwd =2) ri.x= unlist ( attr ( roc.ri,"x. values " )); ri.y= unlist ( attr ( roc.ri,"y. values ")) el.x= unlist ( attr ( roc.el,"x. values " )); el.y= unlist ( attr ( roc.el,"y. values ")) lines (ri.x,ri.y,col =" red ",lwd =2) lines (el.x,el.y,col =" blue ",lwd =2) legend (x = 0.75,y = 0.25,legend = c(" ridge "," elastic net "," lasso "), col = c(" red "," blue "," black "), lwd = 2)