일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- subdag
- flask
- GenericGBQException
- youtube data
- Airflow
- TensorFlow
- API
- top_k
- hadoop
- Retry
- session 유지
- UDF
- chatGPT
- GCP
- airflow subdag
- API Gateway
- XAI
- integrated gradient
- requests
- BigQuery
- gather_nd
- tensorflow text
- Counterfactual Explanations
- correlation
- grad-cam
- spark udf
- login crawling
- 상관관계
- 공분산
- 유튜브 API
- Today
- Total
데이터과학 삼학년
회귀분석의 가정과 한계 극복 방법 (nc 단비 블로그 퍼옴) 본문
회귀분석의 가정 (데이터관련)
-
오차항은 평균이 0이고 분산이 일정한 정규 분포를 갖는다.
-
독립변수와 종속변수는 선형 관계이다.
-
오차항은 자기 상관성이 없다.
-
데이터에 아웃라이어가 없다.
-
독립변수와 오차항은 서로 독립이다.
-
독립변수 간에서는 서로 선형적으로 독립이다.
따라서
만약 실제 데이터가 이런 가정을 충족하지 않는다면, 고전적 선형 회귀 모델은 실제 데이터를 정확히 반영하지 못하게 되므로 다른 방법을 사용해야 합니다. 일반적으로 알려진 가이드라인은 다음과 같습니다.
회귀분석 가정의 한계 극복 방법
-
독립 변수와 종속 변수가 선형 관계가 아닌 경우: Polynomial regression, Generalized Additive Model (GAM)
-
오차항의 확률분포가 정규분포가 아닌 경우: Generalized Linear Model (GLM)
-
오차항에 자기 상관성이 있는 경우: Auto-regression
-
데이터에 아웃라이어가 있는 경우: Robust regression, Quantile regression
-
독립변수 간에 상관성이 있는 경우(다중공선성): Ridge regression, Lasso regression, Elastic Net regression, Principal Component Regression (PCR), Partial Least Square (PLS) regression
독립 변수와 종속 변수가 선형 관계가 아닌 경우
다항 회귀 (Polynomial regression)
이름 그대로 독립 변수가 다항식으로 구성되는 회귀 모델입니다. 아래 그림처럼 만약 종속변수인 y와 독립변수인 x가 선형 관계가 아닌 곡선 형태를 갖는다면 독립변수에 지수승을 붙여서 여러 개의 변수로 만들어 회귀 모델을 구성하는 기법을 말합니다. 실상 형태적으로 보면 고전적인 다중 선형 회귀 모델과 똑같습니다. 또한 R에서 다항 회귀를 이용하는 방법은 아래 그림에 나와 있듯이 고전적 선형 회귀와 똑같이 lm() 함수를 이용하면 됩니다.
Generalized Additive Model (GAM)
‘일반화 가법 모형(GAM)’은 회귀 모델을 만들 때 독립변수를 그대로 이용하는 것이 아니라 다른 함수의 선형 결합으로 표현하는 기법입니다.
독립변수에 적용되는 함수들을 smooth function 이라고 부르는데, 이 smooth function 으로 비선형 함수를 사용함으로써 종속변수와 독립변수 간의 비선형 관계를 표현하는 방식입니다. smooth function 으로 어떤 함수를 사용하느냐에 따라 다양한 관계를 표현할 수 있기 때문에 ‘generalized’ 라는 이름이 붙었죠. 실상 바로 위에서 소개한 다항 회귀 역시 일종의 GAM 입니다.
GAM 은 이렇게 표현할 수 있는 모델의 범위가 넓긴 하지만 여전히 회귀 계수 관점에서는 선형 결합 형태로만 표현되는 한계가 있습니다(즉, 비선형 회귀 모델이 아닙니다). 가령, GAM은 두개 이상의 독립 변수 간의 상호 작용에 대한 추정을 자동으로 해주지는 못합니다.
참고로 R에서는 ‘gam’ 이라는 패키지가 있는데 이 패키지에서 제공하는 gam() 이 일반화 가법 모형을 만드는 함수입니다. https://www.r-bloggers.com/generalized-additive-models/ 에 기본적인 사용법이 나와 있습니다.
오차항의 확률분포가 정규분포가 아닌 경우
Generalized Linear Model (GLM)
일반화 선형 회귀 모델은 종속 변수에 적절한 함수를 적용하는 회귀 모델링 기법입니다.
이렇게 종속변수에 적용하는 함수를 link function 이라고 부르는데 오차항의 확률 분포가 무엇이냐에 따라 일반적으로 사용하는 link function 이 정해져 있습니다. 대표적인 것 몇 가지만 소개하면 아래와 같습니다.
오차항의 확률 분포사용하는 Link function
binomial | logit function |
exponential | inverse function |
poisson | log function |
보통 GLM은 종속 변수의 특성에 따라 세부적인 명칭을 구분하기도 합니다.
- 종속 변수가 0 아니면 1인 경우: Logistic regression
- 종속 변수가 순위나 선호도와 같이 순서만 있는 데이터인 경우: Ordinal regression
- 종속 변수가 개수(count)를 나타내는 경우: Poisson regression
참고로 R에서는 glm() 함수가 GLM을 만드는 함수인데 이 함수의 옵션 파라미터 중에 ‘family’ 가 바로 위 표에 나오는 오차항의 확률 분포를 지정해주는 옵션입니다. 가령, 로지스틱 회귀의 경우 family 옵션에 ‘binomial’ 을 주는데 그 이유는 이렇게 종속 변수가 0 아니면 1인 경우 오차항의 확률 분포는 binomial 분포라고 가정하는 것이 합리적이기 때문입니다.
GLM은 가장 많이 사용하는 회귀 분석 기법 중 하나입니다. http://www.theanalysisfactor.com/r-glm-model-fit/ 에는 다양한 GLM 활용 방법에 소개되어 있습니다 (시리즈 글이므로 전체 글을 다 보시면 좋습니다).
오차항에 자기 상관성이 있는 경우
Autoregressive Model
보통 시계열 데이터와 같이 순서가 정해져 있는 데이터의 경우 주기성이나 계절성 같이 일정한 패턴을 갖고 있는 경우가 많은데 이것을 ‘자기 상관성’ 이라고 합니다. 그래서 이런 경우에는 아래와 같이 회귀 모델을 만들게 됩니다.
수식을 보면 알 수 있듯이, 특정 시점 t의 데이터를 과거 시점의 종속변수들이 설명하는 방식입니다. 이런 모델을 ‘자기 회귀 (Autoregressive)’ 모델이라고 부릅니다. 대개의 경우 현실 세계에서는 위와 같이 단순한 자기 회귀 모델로만 적용할 수 있는 경우는 거의 없습니다. 보통 위 수식에 있는 e_t 에 또 다른 패턴이 있는 경우가 많으며 어떤 패턴이 있느냐에 따라 크게 두 가지 방식으로 확장됩니다.
- 시간에 따라 평균이 변하는 경우: Auto-Regressive Moving Average (ARMA) model
- 시간에 따라 분산이 달라지는 경우: Auto-Regressive Conditionally Heteroscedastic (ARCH) model
R에서는 arima()라는 함수를 기본 패키지로 제공하며 이 함수를 이용해 자기 상관 모델을 만들 수 있습니다. 다만, arima()는 위에서 소개한 두 가지 방식 중 평균이 변하는 경우에 대해서만 모델링할 수 있습니다. 만약 분산이 달라지는 경우에 대해 처리하려면 GARCH(Generalized ARCH) 모델링 기능을 제공하는 ‘fGARCH’ 같은 패키지를 추가로 설치해야 합니다.
데이터에 아웃라이어가 있는 경우
Robust regression
일반적으로 선형 회귀 모델에서는 회귀 계수를 추정할 때 잔차의 제곱합을 이용하는 ‘최소 제곱법’을 사용합니다. 그런데 이렇게 잔차의 제곱을 이용할 경우 아웃라이어와 같이 잔차가 다른 데이터에 비해 매우 큰 경우에는 제곱을 하면 그 값이 비례적으로 커지기 때문에 이 값 하나로 인해 전체 추정치가 왜곡되기 쉽습니다.
Robust regression 은 이런 문제를 완화하기 위한 회귀 모델 기법입니다. 모델의 형태 자체는 일반적인 선형 회귀 모델과 동일하지만 회귀 계수의 추정 방식에서 차이가 있는 것이죠. 가장 널리 알려진 Robust regression 기법은 잔차의 제곱 대신 절대값의 합이 최소가 되도록 계수를 추정하는 방식입니다. 이렇게 절대값을 이용하면 아웃라이어의 영향력이 줄어들기 때문에 왜곡 현상이 완화됩니다. 고전적 선형 회귀와 로버스트 회귀의 계수 추정 방법을 수식으로 비교하면 아래와 같습니다.
-
Classical linear regression:
-
Robust regression:
R에서는 ‘MASS’ 라는 패키지에서 rlm() 함수를 이용하면 로버스트 회귀 분석을 할 수 있습니다. 사용방법은 lm()과 거의 유사합니다.
Quantile regression
첫부분에서 언급했듯이 대부분의 회귀 모델은 어떤 조건에서 종속 변수의 ‘평균’을 추정하는 방식입니다. 그런데 특이하게도 quantile regression은 평균이 아니라 특정 분위값을 추정하는 기법입니다. 분위값이란 전체 데이터를 정렬한 후 전체 순위를 백분율로 표시했을 때 특정 %에 위치한 값을 의미합니다. 예를 들어 1%의 분위값은 상위 1% 그룹의 경계에 있는 데이터의 종속변수값을 말합니다. 따라서 만약 quantile regression을 이용해서 50% 분위값인 중앙값을 추정하는 모델을 만들면 아웃라이어의 영향을 거의 받지 않게 됩니다. 왜냐하면 아웃라이어의 값이 아무리 비정상적으로 크더라도 전체 데이터 상에서 다른 관측값들의 순위는 영향을 받지 않기 때문입니다.
Quantile regression이 갖는 또다른 장점은 분산이 일정하지 않은 이분산(heteroscedasticity) 데이터도 회귀 모델링이 가능하다는 점입니다. 더 나아가 다양한 분위값에 대해 각각 회귀 모델을 만들 경우 데이터의 전반적인 분포와 그에 따른 영향력(회귀계수)의 관계를 추정할 수도 있습니다.
R에서는 ‘quantreg’ 이라는 패키지를 이용해서 quantile 회귀 분석을 할 수 있습니다. 좀 더 상세한 분석 방법은 http://data.library.virginia.edu/getting-started-with-quantile-regression/ 를 참고하시기 바랍니다.
다중공선성이 있는 경우
Ridge / Lasso / Elastic net regression
다중공선성이 있는 데이터에 대해서 그냥 고전적인 선형 회귀 모델을 만들게 되면 회귀 계수의 영향력이 과다 추정될 수 있습니다. 이런 문제를 피하기 위해 가장 널리 알려진 방법이 ‘regularization’이라고 부르는 기법입니다. 여기서 소개하는 Ridge / lasso / elastic net 이 모두 이런 regularization 을 이용한 회귀 모델링 기법입니다. 이것 역시 로버스트 회귀처럼 모델의 형태 자체는 고전적인 선형 회귀 모델과 동일하나 회귀 계수를 추정하는 방식에서 차이가 있습니다. 말로 설명하기에 앞서 우선 수식으로 표현하면 아래와 같습니다.
-
Classical linear regression:
-
Ridge:
-
Lasso:
-
Elastic net:
위 수식을 보면 고전적인 선형 회귀 모델은 회귀 계수를 추정할 때 잔차의 제곱의 합을 계산합니다. 이 함수를 비용함수라고 부르는데 이 비용 함수가 최소가 되는 회귀 계수를 찾는 것이죠. 그런데 여기서 소개하는 회귀 모델들은 이 비용함수에 (그림에서 빨간색으로 표시한) 추가적인 수식들이 붙습니다. 이런 추가적인 수식을 페널티 함수라고 부릅니다. 말그대로 회귀 계수 값 자체가 너무 커지지 않도록 페널티를 줌으로써 회귀계수값들이 과다 추정되는 것을 막는 것입니다. 이 때 페널티 함수의 형태에 따라 ridge 와 lasso 가 구분됩니다. ridge regression 은 회귀 계수의 제곱합을 계산하는 방식이고, lasso 는 회귀 계수의 절대값을 계산하는 방식입니다. 그리도 elastic net은 이 둘을 결합한 방식이죠.
이런 페널티 함수를 이용하면 다중공선성이 있더라도 회귀 계수 과다 추정을 막을 수 있으며, 더 나아가 모델이 overfitting 되는 문제도 어느 정도 완화시킬 수 있습니다. 그래서 보통 독립 변수의 개수가 데이터의 개수에 비해 너무 많은 경우에 이 기법을 사용합니다. 특히 lasso regression은 영향력이 적은 변수의 회귀 계수값을 0으로 만들기 때문에 일종의 변수 선택 효과까지 있는 장점이 있습니다.
이들 회귀 모델을 R에서 만들기 위해선 ‘glmnet’이라는 패키지를 설치해야 합니다. 사용 방법은 https://www.r-bloggers.com/ridge-regression-and-the-lasso/ 을 참고하시기 바랍니다.
Principal Component Regression (PCR)
PCR은 말그대로 독립 변수들의 주성분(Principal Component)들을 추출한 후 이 주성분들을 이용해서 회귀 모델을 만드는 기법입니다. 즉, PCA + multiple linear regression 입니다. 주성분들은 서로 직교하기 때문에 다중공선성이 발생하지 않습니다. 따라서 안심하고 다중 선형 회귀 모델을 만들 수 있죠.
게다가 PCA를 이용해서 변환한 주성분 변수들 중에서 상위 몇개의 변수만 이용할 경우 위에 lasso 처럼 일종의 regularization 효과를 줄 수 있어 모델의 overfitting 현상도 완화시킬 수 있습니다.
반면, 각각의 주성분 변수들은 실제 독립변수들의 전체 영향력을 부분적으로 반영한 변수들이기 때문에 이 회귀 모델을 이용해서는 각 조건의 영향력을 파악하기가 거의 불가능해지는 문제가 있습니다 (즉, 모델을 해석하기가 어렵습니다). 그래서 실제로 PCR은 잘 사용하지 않습니다.
http://www.milanor.net/blog/performing-principal-components-regression-pcr-in-r/ 은 PCR 에 대해 간략히 소개한 자료입니다.
Partial Least Square (PLS) regression
PCR과 기본 개념은 비슷하지만 아래와 같이 변수들의 변환 방식이 다릅니다.
- PCR: 독립 변수의 분산을 최대로 하는 축을 찾아 데이터를 전사(projection)하는 방식으로 독립변수만 변형합니다.
- PLS: 종속 변수와 독립 변수의 관계를 가장 잘 설명하는 축을 찾아 전사하는 방식으로 종속 변수와 독립 변수를 모두 변형합니다.
https://www.r-bloggers.com/partial-least-squares-regression-in-r/ 에 PLS 에 대한 기본적인 사용법이 나와 있으니 참고하시기 바랍니다.
결론
지금까지 언급한 회귀 모델들을 특징에 따라 분류한 내용을 도식화하면 아래 그림과 같습니다.
이것을 다시 일반화 수준에 따라 계층적으로 정리하면 아래 그림처럼 표현할 수 있습니다.
보통 회귀 모델이라고 하면 ‘다중 선형 회귀 모델’이나 ‘로지스틱 회귀 모델’ 정도 만 생각하기 쉽지만 위 도식을 보면 아시다시피 전체 회귀 모델에서 이들이 차지하는 비중은 굉장히 작습니다. 데이터가 가진 특징이나 모델링 목적 등에 따라 적절한 회귀 모델을 사용하는 것이 중요하기 때문에 다양한 회귀 분석 기법을 알아 두는 것은 중요합니다. 더 나아가 올바른 회귀 분석을 위해선 먼저 탐사 분석 과정을 통해 내가 모델링하려는 데이터의 특성을 파악해야하며, 이후 모델링 결과가 정말 내가 생각한 가정과 잘 맞는지를 확인하는 모델 검정 절차가 필요합니다.
물론 모든 가정을 다 따져가며 완벽한 모델을 찾으려는 것은 어리석은 시도일 수 있습니다. 여러 가지 현실적인 제약 때문에 완벽한 회귀 모델을 만드는 것은 불가능에 가깝습니다 (우리는 ‘라플라스의 악마’가 아니기 때문이죠). 특히 실전에서는 비용적, 시간적인 제약으로 인해 더욱 불가능합니다. 따라서 우리는 완벽한 모델을 만드는 것이 아니라 우리가 수행하려는 작업에 사용해도 괜찮은 정도의 모델을 만드는 것을 목표로 삼아야 합니다. ‘All models are wrong, but some are useful(https://en.wikipedia.org/wiki/All_models_are_wrong)’ 이라는 말의 의미를 되새겨 보면 좋겠습니다.
참조 :
danbi-ncsoft.github.io/study/2018/05/04/study-regression_model_summary.html
'Statistical Learning' 카테고리의 다른 글
생존 분석 (Survival Analysis) - 퍼옴 (0) | 2021.04.01 |
---|---|
Maximum Likelihood Estimation (Simple Error Bound) (1) | 2021.03.17 |
[기초통계] 모수, 비모수 (0) | 2020.12.23 |
MLE vs OLS (0) | 2020.12.12 |
[기초통계] 공분산과 상관계수 (covarience, correlation) (0) | 2020.12.07 |