A ship in harbor is safe, but that is not what ships are built for.

STUDY/Machine Learning

Ch03. 다중 선형 회귀(Multiple Linear Regression)

플리피나리 2025. 2. 7. 14:26
반응형

선형 회귀를 위한 가정(Assumptions of Linear Regression)

1. 선형성(Linearity) : 종속 변수와 각각의 독립 변수가 서로 선형 관계를 이루는지 확인해야 한다.

2. 동분산성(Homoscedasticity) : 등분산으로 증가하는 형태든 감소하는 형태든 독립 변수에 따라 분산이 달라지면 안 된다.

3. 다변량 정규성(Multivariate Normality) : 오류 분포가 정규 분포를 따라야 한다.

4. 독립성(Independence) : 자기상관이 없어야 한다. = 데이터에서 어떤 패턴도 나타나서는 안 된다.

5. 다중공선성 결여(Lack of Multicollinearity) : 독립 변수 또는 예측 변수가 서로 상관되지 않아야 한다.

6. 이상치 확인(The Outlier Check) : 이상치가 있을 때 모델에 포함시킬 것인지 여부를 결정한다.

 

 

다중 선형 회귀(Multiple Linear Regression)

정의

둘 이상의 독립 변수(입력 변수, \(x_1\), \(x_2\), ..., \(x_n\))를 사용하여 종속 변수(출력 변수, \(y\))를 예측하는 선형 회귀 모델

 

수식

$$\hat y = b_0 + b_1X_1 + b_2X_2 + ... + b_nX_n$$

 

  • : 종속 변수 (예측 값)
  • \(X_1\), \(X_2\) , ..., \(X_n\) : 독립 변수들 (입력 값)
  • \(b_0\) : 절편 (Intercept, 상수)
  • \(b_1\), \(b_2\), ..., \(b_n\)  : 회귀 계수 (각 독립 변수의 영향력)

 

모델 학습 방법

최소제곱법(Ordinary Least Squares, OLS)

일반적으로 평균제곱오차(Mean Squared Error, MSE)를 최소화하는 방향으로 경사 하강법(Gradient Descent) 또는 정규 방정식(Normal Equation) 등을 사용해 최적의 회귀 계수를 찾는다. 

$$J(b_0​,b_1​,...,b_n​)  = \frac{1}{n}\sum_{​i=1}^{n}(y_i​−\hat{y_​i}​)^2$$

 

한계

1. 다중공선성 문제 : 독립 변수들끼리 상관 관계가 너무 높을 경우 모델이 불안정해질 수 있다. → 변수 선택 기법 이용

2. 이상치에 민감 : 선형 회귀는 이상치에 크게 영향을 받을 수 있다.

3. 비선형 관계를 학습 불가 : 다중 선형 회귀도 결국 독립 변수와 종속 변수 간 선형 관계만 학습이 가능하다.

 

 

 

변수 선택 방법

1. All - in

: 모든 열을 Feature로 설정 후 최소제곱법(OLS)을 이용해 최적의 회귀 계수 찾기

 

2. Backward Elimination(후진 소거법)

: OLS를 기반으로 p-value가 가장 높은(통계적으로 유의하지 않은) 변수부터 하나씩 제거하여 최적의 모델을 찾는 방법

 

  1. 모델 내 유의 확률 설정
  2. 모든 독립 변수를 포함한 다중 선형 회귀 모델 생성
  3. 가장 높은 p-value를 가진 독립 변수 제거 → p-value > 유의 확률인지 확인, p-value ≤ 유의 확률일 경우 종료
  4. 모델을 다시 학습해 새로운 p-value 계산
  5. 모든 변수의 p-value ≤ 유의 확률 일 때까지 3~4번 반복
  6. 남은 변수들만을 이용한 최적 모델 선택

 

3. Forward Selection(전진 선택법)

: 변수를 하나씩 추가하면서 최적의 모델 찾는 방법

 

  1. 모델에 들어갈 유의 수준 선택
  2. 각 독립 변수를 하나씩 추가하면서 p-value 계산
  3. p-value가 가장 낮은 변수를 추가하고, 모델 다시 학습
  4. 추가된 변수 중 p-value > 유의 확률일 경우 제거
  5. 모든 변수 확인 후, 더 이상 추가할 변수가 없을 경우 최적 모델 선택

 

4. Bidirectional Elimination(양방향 선택법)

: Forward Selection 방식으로 변수를 추가할 때마다 Backward Elimination 방식으로 p-value가 높은 변수를 다시 제거

  1. 들어갈 유의 수준과 유지할 유의 수준 설정
  2. Forward Selection처럼 변수 추가
  3. 변수 추가할 때마다, Backward Elimination으로 p-value가 높은 변수 제거
  4. 더 이상 추가/제거할 변수가 없을 경우 최적의 모델로 선택

 

5. All Possible Models

: 가능한 모든 조합의 변수를 활용해 모델을 만든 후 성능 비교

  1. 모든 독립 변수 조합 생성
  2. 각 조합마다 회귀 모델을 학습
  3. 가장 좋은 모델 선택

 

 

 

P-value

정의

통계절 가설 검정에서 귀무 가설이 맞다고 가정할 때 얻은 결과보다 극단적인 결과가 실제로 관측될 확률

 

예시 상황

동전을 던져 뒷면이 나올 확률

  • \(H_0\) : This is a fair coin → 귀무 가설
  • \(H_1\) : This is not a fair coin → 대립 가설
  • 확률 : 0.5(1회), 0.25(2회), 0.12(3회), 0.06(4회), 0.03(5회), 0.01(6회) → P-value는 점차 작아짐

 

연속해서 뒷면이 5번 나올 확률을 3%이고, 이는 가설이 잘못되었다는 직관을 느끼게 함 → 특정 확률을 넘어가게 되면 해당 가설 자체가 잘못되었다고 느끼며 이를 신뢰도라 함

일반적인 신뢰도는 95%이며, 이때 \(\alpha\) = 0.05 → 연속해서 뒷면이 5번 나올 경우 귀무 가설이 기각됨

 

 

가변수(Dummy Variables)

머신러닝과 회귀 분석에서는 모델이 숫자 데이터 입력만을 받기 때문에 범위형 데이터를 모두 가변수로 변경한다. 이때 Dummy Variables를 만든다는 건 해당 변수를 위한 추가적인 열들을 만든다는 것과 같다. 이때 각 범주를 0 또는 1로 변환하기 때문에 One-hot encoding 방식이라 부른다.

예를 들어 State Column → New York Column, California Column 로 변경한다. 이때 Florida Column은 생략되는데 이는 Florida = 1 - (New York + California) 가 성립되어 Florida Column이 없어도 나머지 두 열을 보면 값을 알 수 있기 때문이다. 결국 다중공선성 문제가 발생하게 되어 독립 변수들이 상관관계를 가지지 않도록 방지하기 위해 하나의 변수를 제거한다.

 

 


 

Multiple Linear Regression with Python

Importing the libraries

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

 

Importing the dataset

dataset = pd.read_csv('50_Startups.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

 

Encoding categorical data

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing immport OneHotEncoder

ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [3])], remainder='passthrough')
X = np.array(ct.fit_transform(X))

Tip) State Column이 숫자값이 아닌 범주형 자료이다. OneHotEncoder를 진행하면 앞쪽 부분에 열이 추가된다. drop 매개변수에 'first' 값을 주면 열이 하나 제외된다. 나중에 모델 적용할 때 가변수 오류가 해결되므로 여기서는 그냥 진행한다. 하지만 해석할 때는 drop='first'가 더 안정적인 모델을 만들 수 있다.

 

Splitting the dataset into the Training set and Test set

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
  • Multiple Linear Regression에는 Feature Scaling 적용 X → 각 독립 변수 별 계수(중요도)가 모두 다르기 때문

 

Training the Multiple Linear Regression model on the Training set

from sklearn.linear_model import LinearRegression
regressor = LinearRegression()
regressor.fit(X_train, y_train)

  • 해당 클래스에서 가변수 오류와 후진제거를 자동적으로 처리

 

Predicting the Test set results

y_pred = regressor.precict(X_test)
np.set_printoptions(precision=2)
print(np.concatenate((y_pred.reshape(len(y_pred), 1), y_test.reshape(len(y_test), 1)), 1))

  • set_printoption의 precision 인자는 숫자 표기 소수점을 의미
  • concatenate는 두 벡터를 연결 → 인자로 벡터 튜플과 axis를 입력
  • axis=0 수직 연결, axis=1 수평 연결
  • reshape(a, b)는 벡터 배열을 a행 b열로 변경
반응형