티스토리 뷰
회귀는 현대 통계학을 떠받치고 있는 주요 기둥 중 하나로서, 데이터 값이 평균과 같은 일정한 값으로 돌아가려는 경향을 다룹니다.
회귀란 여러 독립변수와 하나의 종속변수 간의 상관관계를 모델링하는 기법입니다. $Y = W_{1}X_{1} + W_{2}X_{2} + ... + W_{n}X_{n}$ 이라는 선형 회귀식을 예로 들면, $Y$는 종속변수이며 $X_{i}$가 독립변수입니다. $W_{i}$는 독립변수의 값에 영향을 미치는 회귀 계수(coefficients)입니다. 머신러닝 관점에서 보면 독립 변수는 피처이며 종속변수는 결정값입니다. 머신러닝 회귀 예측의 핵심은 주어진 피처와 결정값 데이터로 학습을 진행하여 최적의 회귀 계수를 찾아내는 것입니다.
회귀는 회귀 계수의 선형/비선형 여부, 독립변수의 개수, 종속변수의 개수에 따라 여러 유형으로 나뉩니다. 가장 중요한 것은 회귀 계수이며, 이것이 선형이냐 아니냐에 따라 선형/비선형 회귀로 나뉩니다. 또한 독립변수의 개수가 한 개인지 여러 개인지에 따라 단일 회귀, 다중 회귀로 나뉩니다.
여러 회귀 중에서 선형 회귀가 가장 많이 사용됩니다. 선형 회귀란 실제값과 예측값의 차이(오류의 제곱값)을 최소화하는 직선형 회귀선을 최적화하는 방식입니다. 선형 회귀 모델은 규제(Regularization)에 따라 다시 별도의 유형으로 분류할 수 있습니다. 규제란 선형 회귀의 과적합 문제를 해결하기 위해 회귀 계수에 페널티 값을 적용하는 것입니다.
- 선형 회귀 : 예측값과 실제 값의 RSS(Residual Sum of Squares)를 최소화할 수 있도록 회귀 계수를 최적화하며, 규제를 적용하지 않은 모델
- 릿지(Ridge) : 선형 회귀에 L2 규제를 적용. L2 규제란 상대적으로 큰 회귀 계수 값의 예측 영향도를 감소시키기 위해 회귀 계수값을 더 작게 함
- 라쏘(Lasso) : 선형 회귀에 L1 규제를 적용. L1 규제란 예측 영향력이 작은 피처의 회귀 계수를 0으로 만들어 예측시 피처가 선택되지 않도록 함
- 엘라스틱넷(ElasticNet) : L2, L1 규제를 결합한 모델. 주로 피처가 많은 데이터에 적용 됨
- 로지스틱 회귀(Logistic Regression) : 이름은 회귀지만 사실은 분류에 사용하는 선형 모델. 이진 분류, 희소 영역 분류(예 : 텍스트 분류) 등의 영역에서 뛰어난 예측 성능 보임
가장 단순한 선형 회귀 모델을 살펴봅시다. 단순 선형 회귀는 독립변수와 종속변수가 모두 하나인 선형 회귀입니다.
가령 주택 가격이 종속 변수이며, 독립 변수는 주택 크기라고 합시다. 일반적으로 주택의 크기가 크면 가격이 비싸지므로, 주택 가격은 주택 크기에 대해 선형의 관계로 표현할 수 있습니다. X축이 주택 크기이고 Y축이 주택 가격이라면, 1차 함수 $Y = W_{0} + W_{1}X$로 주택 가격을 모델링할 수 있습니다.
실제 주택 값과 회귀 모델의 값의 차이에 따른 오류값을 잔차라고 부릅니다. 최적의 회귀 모델은 전체 데이터의 잔차의 합이 최소인 모델을 뜻합니다. 이는 동시에 잔차의 합이 최소가 될 수 있도록 하는 회귀 계수를 찾아야 함을 의미합니다.
잔차의 부호는 양수와 음수 둘 다 가능하므로, 보통 잔차의 합을 계산할 때는 잔차에 절댓값을 취해 더하거나(Mean Absolute Error), 잔차의 제곱을 구해서 더하는(RSS, Residual Sum of Square) 방식을 취합니다. 일반적으로 미분 등의 계산을 편리하게 하기 위해 RSS로 잔차합을 구합니다. 이 RSS를 최소로 하는 회귀 계수를 학습을 통해 찾는 것이 머신러닝 기반 회귀의 핵심입니다. RSS에서 회귀 계수가 중심 변수라는 것을 인지하는 것이 매우 중요합니다(학습 시 독립변수와 종속변수는 그저 상수입니다).
일반적으로 위의 RSS 값을 학습 데이터의 개수로 나누어줍니다. 회귀에서 RSS 값은 비용(Cost)이며, 회귀 계수로 구성되는 RSS 식을 비용 함수라고 합니다. 머신러닝 회귀 알고리즘은 데이터를 학습하면서 RSS값을 지속해서 감소시키고, 최종적으로 더 이상 감소하지 않는 최소 오류 값을 구합니다. 비용 함수는 손실 함수(loss function)이라고도 합니다.
비용함수가 최소가 되도록 하는 회귀 계수를 어떻게 찾을 수 있을까요? 회귀 계수의 개수가 적다면 고차원 방정식을 풀어 비용함수가 최소가 되는 회귀 계수가 무엇인지 찾을 수 있습니다. 하지만 회귀 계수의 개수가 많다면 일반적으로 경사 하강법을 이용합니다. 사실 경사 하강법은 '데이터를 기반으로 알고리즘이 스스로 학습한다'는 머신러닝 개념을 실현시킨 핵심 기법 중 하나입니다. 반복적인 계산을 통해 점진적으로 회귀 계수 값을 업데이트하면서 오류값을 최소화하는 회귀 계수를 구합니다.
경사 하강법은 반복적으로 오류값이 작아지는 방향으로 회귀 계수를 보정해나갑니다. 그리고 오류값이 더 이상 작아지지 않으면 그 오류값을 최소 비용으로 판단하고 그 때의 회귀 계수를 반환합니다. 핵심은, 오류가 작아지는 방향으로 회귀 계수를 어떻게 보정할 것인지입니다. 해답은 미분에 있습니다. 비용 함수를 각 회귀 계수로 미분하여 비용 함수가 증가하는 방향을 얻을 수 있습니다. 이를 이용하여 회귀 계수의 값을 반대 방향으로 보정해나가면 됩니다.
비용 함수 $RSS(W_{0}, W_{1})$를 편의상 $R(W)$로 지칭합시다. $R(W)$를 각 회귀 계수에 대해 편미분한 결과는 다음과 같습니다.
편미분 결괏값은 비용 함수가 증가하는 방향이므로, -1을 곱하여 반대로 함수가 감소하는 방향으로 각 회귀 계수를 업데이트 해야합니다. 편미분 값이 너무 클 수 있기 때문에 보정 계수를 추가로 곱하며, 이를 학습률이라고 합니다.
지금까지 설명한 경사 하강법을 파이썬 코드로 구현해 봅시다. 간단한 회귀식인 $Y = 4X+6$을 근사하기 위한 100개의 데이터를 만들고, 여기에 경사 하강법을 이용해 회귀 계수 $W_{1}, W_{0}$를 찾아봅시다.
$Y = 4X+6$를 중심으로 무작위로 퍼져 있는 100개의 데이터를 생성했습니다.
비용 함수를 정의합시다. 실제 $y$값과 예측된 $y$값을 인자로 받아서 $RSS$ 값을 반환합니다.
경사 하강법을 수행하는 메서드입니다. 먼저 회귀 계수인 $W_{0}$과 $W_{1}$를 0으로 설정하고 주어진 반복 횟수만큼 경사 하강법을 통해 회귀 계수를 업데이트합니다. 마지막으로 업데이트 한 회귀 계수를 반환합니다.
경사 하강법 절차 중, 회귀 계수의 업데이트 값을 계산하는 메서드입니다. 일단 업데이트 전의 회귀 계수를 통하여 현재 모델의 예측 $Y$값을 계산합니다. $R(W)$를 $W_{1}$, $W_{0}$로 각각 편미분 한 결과에 -learning rate을 곱한 결과를 그대로 코드로 구현하면 됩니다. 행렬곱 연산을 이용하여 각 데이터에 대한 가중합 따위의 계산을 쉽게 처리했습니다.
주어진 데이터에 경사 하강법을 적용하여 얻은 회귀 계수와, 해당 회귀 계수를 바탕으로 계산한 $RSS$ 값을 계산했습니다.
경사 하강법으로 만들어진 회귀선을 시각화했습니다. 경사 하강법은 모든 학습 데이터에 대해 반복적으로 비용함수 최소화를 위한 값을 업데이트하기 때문에 수행 시간이 매우 오래 걸린다는 단점이 있습니다. 그러므로 현실에선 대부분 확률적 경사 하강법(Stochastic Gradient Descent)을 이용합니다. 확률적 경사 하강법은 전체 데이터가 아닌 일부 데이터만을 이용하여 업데이트할 값을 계산합니다. 전체 데이터를 이용하지 않으므로 경사 하강법에 비해 빠른 속도를 보장합니다. 대용량의 데이터일수록 속도 차이가 벌어질 것입니다.
확률적 경사 하강법의 구현은 경사 하강법과 크게 다르지 않습니다. 그저 전체 데이터에 대해 회귀 계수를 업데이트 하는 게 아니라, 배치 사이즈 개수만큼 데이터를 랜덤하게 추출하여 해당 데이터에 대해서만 회귀 계수를 업데이트하면 됩니다.
미니 배치 확률적 경사 하강법의 결과 $RSS$ 값은 경사 하강법의 $RSS$값과 거의 같은 것을 볼 수 있습니다. 이처럼 성능 상의 큰 차이가 없으므로, 실전에선 대부분 확률적 경사 하강법을 사용합니다.
방금까지 독립변수(피처)가 1개인 단순 선형 회귀에서 경사 하강법을 적용해 봤습니다. 피처가 여러 개인 경우에는 어떻게 회귀 계수를 도출할 수 있을까요? $Y = W_{0} + W_{1}X_{1} + W_{2}X_{2} + ... + W_{n}X_{n}$과 같은 회귀식을 가지고 동일하게 경사 하강법을 수행하면 됩니다.
다중 선형 회귀의 경우도 행렬곱 연산을 통해 모델의 예측값을 간편하게 계산할 수 있습니다.
'파이썬 머신러닝 완벽 가이드' 카테고리의 다른 글
파이썬 머신러닝 완벽 가이드 : 다항 회귀와 과적합/과소적합 이해 (0) | 2023.05.11 |
---|---|
파이썬 머신러닝 완벽 가이드 : 사이킷런 회귀 클래스를 이용한 보스턴 주택 가격 예측 (0) | 2023.05.11 |
파이썬 머신러닝 완벽 가이드 : 스태킹 앙상블 (0) | 2023.05.07 |
파이썬 머신러닝 완벽 가이드 : 캐글 신용카드 사기 검출 분류해보기 (0) | 2023.05.06 |
파이썬 머신러닝 완벽 가이드 : XGBoost, LightGBM으로 캐글 산탄데르 고객 만족 예측해보기 (0) | 2023.05.05 |