working_helen

[R로 하는 통계분석] Linear Regression feature selection 본문

교내 수업/R 통계분석

[R로 하는 통계분석] Linear Regression feature selection

HaeWon_Seo 2024. 11. 9. 12:34

1. linear model fitting method

2. subset selection 

3. subset selection R 코드로 구현하기

4. regularization 

5. regularization R 코드로 구현하기

 

 


1. linear model fitting method

 

- p개의 설명변수 X, 반응변수 Y 

- 기본적으로 linear model은 LSE(least square estimation) 방법으로 회귀계수 추정

- 관측치 수가 충분히 많지 않거나 설명변수가 너무 많은 경우,  

  설명변수를 너무 많이 포함하면 과적합이 일어나고 model complexity가 증가

 

- LSE 대신 다른 model fitting 방법을 사용 

  • subset selection : 전체 변수 중 일부만 사용하여 model fitting 
  • regularization : 설명변수 개수에 penalty를 부여하는 loss function 사용 

 

- Y와 크게 관련없는 X들의 회귀계수 추정량을 제외하거나 제약을 둠으로써 

 ① prediction ↑ : bias는 무시할만한 수준으로 증가시키면서 variance를 크게 감소시켜 모델 성능 개선 

 ② interpretation : 관련없는 X들의 회귀계수를 0으로 만들어 모델을 더 간단하게 만듬 

 

 

 

 

2. subset selection 

: p개의 X들 중 Y의 변동성을 설명하기에 충분한 subset을 선택 

 

  • Best Subset selection : p개의 X로 만들 수 있는 모든 X subset에서 각각 모델을 적합한 후 RSS(SSE, L2 norm)가 최소가 되는 X  subset을 선택
  • Stepwise selection : 많은 계산량으로 인해 Best Subset selection을 사용하기 어려울 때, 단계적으로 모델에 사용할 X를 선택 
    • Forward Stepwise selection : X를 하나도 포함하지 않은 모델에서부터 모든 X를 다 포함하는 모델까지 X를 하나씩 추가하며 모델 적합, 각 단계에선 모델의 RSS를 최소로 만드는 X subset을 선택 
    • Backward Stepwise selection : 모든 X를 다 포함하는 모델에서부터 X를 하나도 포함하지 않는 모델까지 X를 하나씩 제거하며 모델 적합, 각 단계에선 모델의 RSS를 최소로 만드는 X subset을 선택 
    • hybrid approaches : forward와 유사하게 단계적으로 새로운 X를 추가하는 동시에, backward와 유사하게 새로운 모델에서 모델 성능을 개선시키지 않는 X들은 제거 

 

 

 

3. subset selection R 코드로 구현하기

ISLR2 package의 Hitters 데이터

- 반응변수 Y = 'Salary' 

 

 

Best Subset selection 수행 : regsubsets() 함수 

 

- nvmax = 19 : X 최대 19개까지 포함

- "*" : 각 단계에서 모델에 포함된 변수 표시

         예를 들어 변수 개수 1개일 땐 'CRBI', 2개일 땐 'CRBI'와 'Hits'가 선택 

 

- id : 모델에 사용되는 변수 개수,

        id 개수의 변수를 사용했을때 선택되는 변수의 종류 + 각 변수의 회귀계수 추정량 확인

 

 

- model evaluation

  • R2 : 설명변수 X를 추가할수록 항상 모델 성능이 좋아짐 
  • adjusted R2 : 값이 클수록 더 성능이 좋은 모델 
  • AIC : 값이 작을수록 더 성능이 좋은 모델
  • BIC : 값이 작을수록 더 성능이 좋은 모델

- adjusted R2 기준, 변수 11개를 사용한 경우 최적의 모델

  AIC 기준, 변수 10개를 사용한 경우 최적의 모델

  BIC 기준, 변수 6개를 사용한 경우 최적의 모델 

 

 

 

 

Forward Subset selection 수행 : regsubsets() 함수 + method = "forward" 

 

Backward Subset selection 수행 : regsubsets() 함수 + method = "backward" 

 

 

 

Subset selection 방식에 따른 결과 비교 

- BIC 기준, best subset selection과 forward selection에선 6개의 변수를 사용한 모델이 가장 적절했고, backward selection에선 8개의 변수를 사용한 모델이 가장 적절 

 

- 각각의 방법에서 최적의 변수 개수 사용시 선택된 X의 종류 및 회귀계수 추정량 

 

 

 

 

 

 

4. regularization 

: loss function에 회귀계수 추정량이 너무 커지지 않도록 제어하는 penalty항 추가 

 

regularization이 적용된 Loss function 수식

 

- λ : regularization hyperparameter

    • λ = 0 : penalty를 주지 않는 경우, LSE와 동일한 결과
    • λ 커질수록 X 개수에 더 강한 penalty 부여 
    • λ → ∞ : 거의 모든 X의 회귀계수 추정량이 0으로 수렴 

 

- Rigde regression : L2 penalty 사용 

 

- Lasso regression : L1 penalty 사용 

 

 

 

 

5. regularization R 코드로 구현하기

ISLR2 package의 Hitters 데이터

- 반응변수 Y = 'Salary' 

- train-test split : 다양한 λ 값 중 최적의 모델 성능을 보이는 λ를 찾기 위해 train MSE와 test MSE 비교 

 

lambda grid 설정

- ridge나 lasso 코드 내에서 lambda = grid로 실험하고 싶은 λ값 sequence를 지정 가능

- 별도로 지정하지 않으면 glmnet 함수는 자체적으로 λ값 sequence 를 생성해 모델 학습

- seq(10, -2, length = 100) : 10부터 -2까지 값을 가지는, 길이 100짜리 벡터 

 

 

 

glmnet() 함수

- alpha : Ridge regression과 Lasso regression 중 panelty 종류 결정

- standardize : 설명변수 x 정규화 여부 결정

 

✏️ Ridge와 Lasso에서 standardization이 중요한 이유!

: 두 방법 모두 회귀계수의 크기를 기반으로 한 panelty를 사용하고 있다. 이때 각 설명변수 x마다 scale이 서로 다르면 예측 회귀계수의 scale도 달라지고, 규제항에서 각 변수별로 영향을 받는 정도도 달라진다. 따라서 모든 설명변수의 scale을 동일하게 만들어주는 standarization(정규화)를 통해 특정 설명변수가 scale 차이로 인해 규제항에 더 많은 영향을 미쳐 결과가 왜곡되는 것을 막을 수 있다.

glmnet(
  x,			# input matrix
  y,			# response variable
  lambda = NULL,	# lambda sequence
  alpha = 1,		# type of penalty
  standardize = TRUE,	# x variable standardization
  family = c("gaussian", "binomial", "poisson", "multinomial", "cox", "mgaussian"),
  ...
)

 

 

 

Ridge Regression : glmnet() 함수 + alpha = 0

 

모델 적합

- λ값이 커질수록 regularization 강함 = 회귀계수 추정량 작아짐 = 추정량의 L1 norm 감소 

- Rigde에서는 회귀계수 추정량이 매우 낮아지더라도 그 값이 0이 잘 되진 않음

  항상 19개의 변수 모두 사용, 변수 선택의 기능이 없음

 

grid에서 각 λ값 확인

 

 

각 λ에서 회귀계수 추정량 확인 

- 20개의 X변수 * 100개의 λ값 행렬 

 

-  λ_10 > λ_90 =  λ_10이 λ_90보다 penalty가 더 강함

  = λ_10인 경우 회귀계수 추정량 값이 더 작아짐 

  = λ_10인 경우 회귀계수 추정량의 L2 norm이 더 작아짐 

 

 

원하는 λ 값에서의 회귀계수 추정량 확인 

- predict 함수, s로 λ값 지정, type = "coefficients" 

- λ = 0 → regularization을 사용하지 않는 일반적인 LSE 기반 회귀계수 추정량 

 

 

특정 λ값에서 회귀계수 추정량으로 예측 + train/test MSE 계산

- predict 함수, newx = 예측할 데이터 

 

 

 

 

CV로 최적의 λ 정하기 

cv.glmnet() 함수 이용, default는 10-folds CV 수행 
- 상단 숫자 : 사용된 X 변수의 개수, Ridge regression은 변수 선택의 기능이 없음
- y축 : 각 lambda에서 cv의 평균 MSE
 오류 막대 : 각 lambda에서 평균 MSE의 표준오차 범위 

 

 

최적의 λ값 확인 

 

최적의 λ값일때 Ridge regression 회귀계수 추정량 확인

 

최적의 λ값에서 회귀계수 추정량으로 예측, train/test MSE 계산

 

 

 

 

Lasso Regression : glmnet() 함수 + alpha = 1

 

모델 적합

- λ값이 커질수록 regularization 강함 = 회귀계수 추정량 작아짐 = 추정량의 L1 norm 감소 

- Lasso에서는 regularization이 강해지면 회귀계수 추정량이 0이 되는 변수가 발생 

  Ridge와 달리 변수 선택의 기능이 존재, λ값이 커질수록 사용되는 X 개수 감소 

 

 

CV로 최적의 λ 정하기 

 

최적의 λ값 확인

 


최적의 λ값일때 Lasso regression 회귀계수 추정량 확인

- Ridge와 달리 회귀계수 추정량이 0이 되는 X 변수가 존재

- 기존의 19개의 변수 중 6개 변수의 회귀계수 추정량이 0이 되어 최적 모델에서는 13개의 변수만 사용 


최적의 λ값에서 회귀계수 추정량으로 예측, train/test MSE 계산

 

 

 

 

Ridge와 Lasso 결과 비교

 

test mse를 비교한 결과 ridge regression 모델이 더 적합한 것으로 판단 

 

최종 모델 = 전체 데이터에 대하여 최적의 ridge λ값에서 적합한 ridge regression 모델 

 

 

 

 

 

 

 

 

 

 

 

Reference

https://syj9700.tistory.com/29

https://direction-f.tistory.com/75

https://www.rdocumentation.org/packages/glmnet/versions/4.1-8/topics/glmnet