logo

[머신러닝] 선형 회귀

선형 회귀는 머신러닝 및 통계학에서 가장 기본적이고 널리 사용되는 예측 모델링 기법 중 하나입니다. 그 정의는 하나 이상의 독립 변수(설명 변수)와 종속 변수(대상 변수) 사이의 선형 관계를 모델링하는 것입니다. 이를 수식으로 표현하면, Y = aX + b 형태로, 여기서 Y는 종속 변수, X는 독립 변수, a는 기울기(또는 계수), b는 절편을 나타냅니다. 이때의 목적은 주어진 데이터에 가장 잘 맞는 선형 모델의 a와 b 값을 찾는 것입니다.

선형 회귀는 머신러닝에서 지도 학습의 한 예로 분류됩니다. 지도 학습은 입력 데이터와 해당하는 출력값(레이블)을 사용하여 모델을 훈련시키는 방법을 말합니다. 선형 회귀의 가장 큰 중요성은 그 단순성과 해석 용이성에 있습니다. 설명 변수와 반응 변수 사이의 관계를 선형 방정식으로 쉽게 나타낼 수 있기 때문에, 모델의 결과를 해석하고 이를 바탕으로 의사결정을 하는 데에 있어 매우 유용합니다.

머신러닝 분야에서 선형 회귀는 예측, 추정 등 다양한 분야에서 활용됩니다. 예를 들어 주택 가격 예측, 판매량 예측, 고객 행동 예측 등 실생활에서 마주치는 다양한 문제 해결에 사용됩니다. 이 때문에 선형 회귀 모델이 비교적 간단하면서도, 머신러닝을 처음 접하는 이들에게 필수적인 기초 도구로 인식됩니다.

다음은 간단한 선형 회귀 예제를 Python 코드로 나타낸 것입니다. 이 예제는 sklearn 라이브러리의 LinearRegression 클래스를 사용하여 구현합니다.

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pyplot as plt

# 임의의 데이터 생성
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 훈련 세트와 테스트 세트 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 선형 회귀 모델 생성 및 훈련
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)

# 예측 결과 시각화
plt.scatter(X, y, color='blue')
plt.plot(X, lin_reg.predict(X), color='red')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Linear Regression Example')
plt.show()

print(f"모델의 기울기: {lin_reg.coef_[0][0]}, 절편: {lin_reg.intercept_[0]}")

위 코드는 임의로 생성한 데이터에 대해 선형 회귀 모델을 훈련시키고, 결과를 시각화하는 과정을 보여줍니다. 이처럼 선형 회귀를 이용하면, 데이터 간의 선형 관계를 파악하고 미래 값을 예측할 수 있습니다.


선형 회귀는 통계학과 머신러닝에서 가장 기본적이면서도 중요한 알고리즘 중 하나입니다. 데이터 사이의 선형 관계를 모델링하는데 사용되며, 수학적으로는 하나 또는 그 이상의 독립 변수(x)와 종속 변수(y) 사이의 관계를 선형 방정식으로 표현합니다. 선형 회귀의 역사를 살펴보는 것은 이 알고리즘이 어떻게 발전하였으며, 통계학과 머신러닝의 발전에 어떤 영향을 미쳤는지 이해하는 데 도움이 됩니다.

 

선형 회귀의 발전 과정

선형 회귀의 기원은 19세기 초로 거슬러 올라갑니다. 초기에는 천문학과 농업 연구에서 주로 사용되었습니다. 그러나 가장 중요한 발전은 19세기 중반, 프랑스의 수학자 앙드레-미셸 귀요 (Adrien-Marie Legendre)와 독일의 수학자 카를 프리드리히 가우스 (Carl Friedrich Gauss)에 의해 이루어졌습니다. 이들은 오차를 최소화하는 최선의 데이터 직선을 찾는 방법으로 최소제곱법(Least Squares Method)을 도입했습니다.

주요 이정표 및 기여한 학자들

  • 앙드레-미셸 귀요 (1805년): 최소제곱법을 발표하며 선형 회귀의 초석을 놓았습니다. 귀요는 이 방법을 사용하여 천체의 궤도를 계산하는데 사용했습니다.

  • 카를 프리드리히 가우스: 독립적으로 최소제곱법을 발견하고 이를 확률론적 관점에서 정식화하였습니다. 가우스는 측정 오류를 설명하기 위해 정규 분포를 사용했는데, 이는 오늘날 선형 회귀 분석에서 오류 용어가 정규 분포를 따른다는 가정의 근거가 되었습니다.

  • 프랜시스 갤턴 (Francis Galton, 19세기 말): 회귀 개념과 용어를 도입한 것은 영국의 과학자 갤턴입니다. 그는 유전학 데이터 분석을 통해 부모와 자식간의 키 관계를 연구하며 이 용어를 사용했습니다. 갤턴은 데이터가 평균으로 '회귀(귀환)'하는 경향을 발견하고 이 현상을 "회귀(Regression)"라고 명명했습니다.

이후 선형 회귀는 다양한 과학 분야에서 널리 적용되면서 발전해왔습니다. 20세기에는 계산 도구의 발달로 인해 보다 복잡한 데이터 세트에 대한 선형 회귀 분석이 가능해졌습니다. 컴퓨터의 등장은 대규모 데이터 세트에 대한 선형 회귀 모델의 계산 속도와 정확성을 크게 향상시켰습니다.

오늘날 선형 회귀는 데이터 과학, 경제학, 의학 연구, 공학 등 다양한 분야에서 기본적인 통계 기법으로서 활용되고 있습니다. 기술적인 발전에 따라 선형 회귀 모델을 분석하고 향상시키는 새로운 방법들이 지속적으로 개발되고 있습니다.


 

기본 원리

선형 회귀는 통계학에서 관측 데이터 간의 선형 관계를 모델링하는 가장 기본적이며 널리 사용되는 방법 중 하나입니다. 이 절에서는 선형 회귀의 기본 원리에 대해 자세히 알아보겠습니다.

 

수학적 배경

선형 회귀 모델의 수학적 형태

선형 회귀 모델은 일반적으로 하나의 종속 변수 yy와 한 개 이상의 독립 변수 XX의 선형 관계를 나타내는 수학적 방정식으로 표현됩니다. 가장 단순한 형태의 선형 회귀인 단순 선형 회귀는 다음과 같이 표현됩니다.

y=β0+β1X+ϵ y = \beta_0 + \beta_1X + \epsilon

여기서:

  • yy는 종속 변수입니다.
  • XX는 독립 변수입니다.
  • β0\beta_0는 y절편입니다.
  • β1\beta_1는 기울기입니다.
  • ϵ\epsilon는 오차 항입니다.

다중 선형 회귀의 경우, 모델은 다음과 같이 확장됩니다.

y=β0+β1X1+β2X2+...+βnXn+ϵ y = \beta_0 + \beta_1X_1 + \beta_2X_2 + ... + \beta_nX_n + \epsilon

비용 함수(Cost Function) 및 최소 제곱법

선형 회귀 모델의 핵심 목표는 실제 데이터와 모델이 예측한 값 사이의 오차를 최소화하는 것입니다. 이 목표를 달성하기 위해 주로 사용되는 방법은 비용 함수인 평균 제곱 오차(MSE)를 최소화하는 것입니다.

MSE=1ni=1n(yiy^i)2 MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2

여기서:

  • nn은 관측값의 수입니다.
  • yiy_i는 실제 값입니다.
  • y^i\hat{y}_i는 예측값입니다.

최소 제곱법은 이 MSE를 최소화하는 계수 β0,β1,...,βn\beta_0, \beta_1, ..., \beta_n을 찾는 과정입니다.

 

가정

선형 회귀 모델의 유효성은 다음과 같은 가정에 대한 충족 여부에 달려 있습니다.

선형성

모델은 종속 변수와 독립 변수 간에 선형 관계가 있다고 가정합니다. 이는 독립 변수의 변화가 종속 변수에 일정한 영향을 준다는 것을 의미합니다.

독립성

오차 항 ϵ\epsilon은 서로 독립적이라고 가정합니다. 즉, 한 오차 값이 다른 값에 영향을 미치지 않는다는 것입니다.

등분산성

모든 독립 변수 값에 대해 오차 항의 분산이 일정하다고 가정합니다. 이는 오차가 예측값이나 독립 변수와 관계없이 일정하다는 것을 의미합니다.

정규성

오차 항은 정규 분포를 따른다고 가정합니다. 이는 선형 회귀 모델이 통계적 추론을 위해 정규 분포의 속성을 활용한다는 것을 의미합니다.

이러한 가정들이 충족될 때, 선형 회귀 모델은 신뢰할 수 있는 예측과 통계적 추론을 제공할 수 있습니다. 그러나 현실에서는 이러한 가정이 완벽하게 충족되기 어렵기 때문에, 모델 진단과 가정 검토를 통해 필요한 조정을 가하는 것이 중요합니다.


선형 회귀 모델 구축 과정

 

데이터 수집

데이터 수집은 선형 회귀 모델을 구축하는 데 있어 초기 단계로, 연구 목적과 분석 목표에 부합하는 적합한 데이터의 선정이 필수적입니다. 데이터 수집에 있어 중요한 기준은 다음과 같습니다:

  • 관련성: 수집하는 데이터는 분석하고자 하는 문제에 대해 직접적인 정보를 제공해야 합니다.
  • 정확성: 데이터는 가능한 한 오류가 없고 정확해야 합니다.
  • 신뢰성: 데이터는 신뢰할 수 있는 출처에서 가져온 것이어야 합니다.
  • 최신성: 데이터는 현재 상황을 반영할 정도로 최신이어야 합니다.
  • 완전성: 충분한 양의 데이터를 수집해야 모델이 잘 작동할 수 있습니다.

예를 들어, 주택 가격 예측 모델을 구축하기 위해서는 주택의 크기, 위치, 방의 수, 건축 연도와 같은 관련된 정보가 포함된 데이터 세트가 필요합니다.

 

데이터 전처리

데이터 전처리는 모델의 성능에 큰 영향을 미칠 수 있는 중요한 과정입니다. 주로 다루는 내용은 다음과 같습니다:

 

특성 스케일링

서로 다른 범위를 가진 변수들이 동일한 스케일을 가지도록 조정하는 과정입니다. 최대-최소 정규화(Min-Max Scaling)와 표준화(Standardization)가 일반적인 방법입니다.

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaled_features = scaler.fit_transform(features)
 

결측치 처리 방법

결측치를 처리하는 방법에는 주로 삭제, 평균값 대체, 중간값 대체, 가장 빈번한 값으로 대체 등이 있습니다.

from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy='mean')  # 또는 'median', 'most_frequent'
imputed_features = imputer.fit_transform(features)
 

변수 선택

 

변수의 중요성 평가

모든 변수가 회귀 모델에 동일한 영향을 미치지 않습니다. 변수의 중요성을 평가하여 영향력이 큰 변수를 선별하는 것이 중요합니다. 이는 모델의 특성 중요도(feature importance) 분석을 통해 이루어질 수 있습니다.

 

특성 선택 방법

변수 선택 과정에서는 다양한 특성 선택 기법이 사용될 수 있습니다. 대표적으로 순차 특성 선택(Sequential Feature Selection), 재귀적 특성 제거(Recursive Feature Elimination, RFE) 등이 있으며, 이는 과적합을 방지하고 모델의 성능을 향상시키는 데 도움을 줍니다.

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
model = LinearRegression()
rfe = RFE(model, n_features_to_select=5)
fit = rfe.fit(features, target)

이 코드는 최적의 5개 변수를 선택하기 위해 RFE를 사용하는 예시입니다. 선택된 변수들은 모델 구축에 사용될 수 있으며, 결과적으로 모델의 복잡도를 줄이고 해석을 용이하게 할 수 있습니다.


모델 평가는 선형 회귀 모델이 얼마나 잘 동작하는지를 알아보는 데 필수적인 단계입니다. 여기서는 결정 계수(R²), RMSE(Root Mean Square Error), 그리고 MAE(Mean Absolute Error)를 사용하여 선형 회귀 모델을 평가하는 방법을 소개하겠습니다.

 

결정 계수 (R²)

결정 계수, 또는 R²는 회귀 모델의 성능을 평가하는 데 널리 사용되는 지표입니다. 이 값은 모델이 데이터의 변동성을 얼마나 잘 설명하는지를 나타내며, 0에서 1 사이의 값을 갖습니다. R²의 값이 1에 가까울수록 모델이 데이터를 더 잘 설명한다고 할 수 있습니다.

R²는 다음과 같은 식으로 계산됩니다:

R2=1SSresSStot R² = 1 - \frac{SS_{res}}{SS_{tot}}

여기서, SSresSS_{res}는 잔차 제곱 합(모델 예측값과 실제 값의 차이의 제곱 합)이고, SStotSS_{tot}는 전체 제곱 합(실제 값과 실제 값의 평균과의 차이의 제곱 합)입니다.

Python에서는 scikit-learn의 r2_score 함수를 사용해 R²를 쉽게 계산할 수 있습니다.

from sklearn.metrics import r2_score

y_true = [실제 값 리스트]
y_pred = [모델이 예측한 값 리스트]

r2 = r2_score(y_true, y_pred)
print(f'R²: {r2}')
 

RMSE와 MAE

RMSE와 MAE는 모델의 예측 오차를 측정하는 데 사용되는 지표입니다. 이 둘은 모두 오차의 크기를 수치로 나타내지만, 각각 다른 방식으로 오차를 처리합니다.

  • RMSE (Root Mean Square Error): 예측값과 실제값의 차이를 제곱한 값들의 평균의 제곱근입니다. RMSE는 큰 오차에 더 많은 가중치를 줍니다.
RMSE=1ni=1n(yiy^i)2 RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2}
  • MAE (Mean Absolute Error): 예측값과 실제값의 차이의 절대값들의 평균입니다. MAE는 모든 오차를 동일하게 취급합니다.
MAE=1ni=1nyiy^i MAE = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|

Python에서는 scikit-learn의 mean_squared_errormean_absolute_error 함수를 사용해 RMSE와 MAE를 계산할 수 있습니다. RMSE를 얻으려면 mean_squared_error의 결과값의 제곱근을 취하면 됩니다.

from sklearn.metrics import mean_squared_error, mean_absolute_error
import numpy as np

y_true = [실제 값 리스트]
y_pred = [모델이 예측한 값 리스트]

rmse = np.sqrt(mean_squared_error(y_true, y_pred))
mae = mean_absolute_error(y_true, y_pred)

print(f'RMSE: {rmse}')
print(f'MAE: {mae}')

이러한 지표들을 활용하면 선형 회귀 모델의 성능을 객관적으로 평가하고, 모델을 개선하기 위한 방향을 찾을 수 있습니다.


 

모델 향상시키기

머신러닝 모델의 성능을 향상시키기 위하여 다양한 기법들이 존재합니다. 선형 회귀 모델의 경우, 특히 데이터의 다양성과 복잡성을 반영하여 보다 정확한 예측을 할 수 있도록 모델을 조정하는 과정이 중요합니다. 이번 섹션에서는 선형 회귀 모델을 향상시키는 두 가지 주요 방법, 즉 특성 공학과 정규화 및 규제에 대해 탐구해보겠습니다.

 

특성 공학

특성 공학은 모델의 예측력을 높이는데 중요한 역할을 합니다. 기본적으로 기존의 변수를 조합하거나 변형하여 새로운 변수를 생성하는 과정을 말합니다. 예를 들어, 선형 회귀에서는 복잡한 비선형 관계를 모델링하기 위해 기존 변수의 제곱항이나 로그 변환된 변수를 추가할 수 있습니다.

예시:

import pandas as pd
from sklearn.preprocessing import PolynomialFeatures

# 데이터 준비
X = pd.DataFrame({'age': [25, 32, 47, 51, 62],
                  'salary': [40000, 50000, 60000, 80000, 90000]})

# 다항 특성 생성
poly = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly.fit_transform(X)
X_poly_feature_names = poly.get_feature_names_out(['age', 'salary'])
X_poly_df = pd.DataFrame(X_poly, columns=X_poly_feature_names)

print(X_poly_df)

위 코드에서는 PolynomialFeatures를 사용하여 원래 데이터에 대한 2차 다항식 특성을 만들어내는 예를 보여줍니다. 이러한 방식으로 새로운 변수를 만들어 내는 것은 모델이 데이터의 복잡성을 더 잘 이해하고, 그 결과 정확도를 높일 수 있게 도와줍니다.

 

정규화와 규제

선형 회귀 모델에서 과대적합은 매우 흔한 문제입니다. 모델이 훈련 데이터에 너무 잘 맞추어져 있어 새로운 데이터에 대한 예측력이 떨어지는 경우를 말합니다. 이러한 문제를 해결하기 위한 방법 중 하나는 모델에 정규화 또는 규제를 적용하는 것입니다.

  • 릿지(Ridge) 회귀: 선형 회귀의 계수(가중치) 제곱에 대한 패널티를 추가합니다. L2L_2 규제라고도 하며, 높은 계수 값을 갖는 특성의 영향을 줄여줍니다.
  • 라쏘(Lasso) 회귀: 선형 회귀의 계수 절대값에 대한 패널티를 추가합니다. L1L_1 규제라고 하며, 덜 중요한 특성의 계수를 0으로 만들어 변수 선택의 효과가 있습니다.
  • 엘라스틱넷(Elastic Net) 회귀: 릿지와 라쏘 규제를 결합한 모델입니다. 중요한 특성을 선택하면서도 계수가 급격히 커지는 것을 방지합니다.

예시:

from sklearn.linear_model import Ridge, Lasso, ElasticNet
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston

# 데이터 로드
X, y = load_boston(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# 릿지 회귀 모델 훈련
ridge = Ridge(alpha=1.0)
ridge.fit(X_train, y_train)

# 라쏘 회귀 모델 훈련
lasso = Lasso(alpha=0.1)
lasso.fit(X_train, y_train)

# 엘라스틱넷 모델 훈련
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net.fit(X_train, y_train)

# 여기서 alpha는 규제 강도를 조절하는 파라미터입니다.

이 코드 예시에서는 릿지, 라쏘, 엘라스틱넷 회귀를 각각 적용해본 것을 볼 수 있습니다. alpha 값은 규제의 강도를 의미하며, 이 값을 조정함으로써 모델의 과대적합을 효과적으로 관리할 수 있습니다.

정리하자면, 선형 회귀 모델을 개선하는 과정에서 특성 공학을 통해 데이터의 정보를 더 잘 추출하고, 정규화 및 규제를 적용하여 과대적합을 방지함으로써 모델의 일반화 성능을 높일 수 있습니다.

Previous
지도 학습