Developer's Development

3.2.7 [머신러닝] 회귀 본문

데이터 분석과 머신러닝, 딥러닝/머신러닝

3.2.7 [머신러닝] 회귀

mylee 2025. 7. 21. 20:03
머신러닝 모델 선정 : 회귀

 

회귀분석이란, 독립 변수와 종속 변수의 관계를 분석하는 것이다. 머신러닝에서 독립변수는 feature이고, 종속변수는 label이다.

즉, 피처와 레이블 사이의 관계를 분석하는 것이다.

 

  • 종류

👉🏻 독립 변수의 개수에 따른 분류

- 단순 회귀: 독립 변수가 1개인 것으로 선형 그래프 구조를 보인다.

- 다중 회귀 : 독립 변수가 여러 개인 것으로 비선형 그래프 구조를 보인다.

 

👉🏻 종속 변수의 성질에 따른 분류

- 연속형 회귀 : 종속 변수가 연속적인 값을 가지는 경우에 해당한다. (ex. 주택 가격 예측, 키와 몸무게 관계 등)

- 범주형 회귀 : 종속 변수가 범주형 값을 가지는 경우에 해당한다. (ex. 이진 분류를 위한 로지스틱 회귀 등)

 

👉🏻 모델 형태에 따른 분류

- 선형 회귀 : 독립 변수와 종속 변수 간의 관계가 직선 형태로 나타나는 경우이다.

- 비선형 회귀 : 독립 변수와 종속 변수 간의 관계가 곡선 형태로 나타나는 경우이다.

 

  • 회귀모델 종류 요약

Linear Regression(선형 회귀), Ridge Regression(릿지 회귀), Lasso Regression(라쏘 회귀), Random Forest Regressor (랜덤 포레스트 회귀), Gradient Boosting Regressor(GBM), XGBoost Regressor, LightGBM Regressor

 

 

경사 하강법 (Gradient Descent)

 

머신러닝에서 모델의 최적화 과정을 수행하는 데 사용되는 기본적인 알고리즘이다. 주로 손실 함수를 최소화하여 모델의 예측 성능을 향상시키기 위해 사용된다.

경사 하강법은 현재 위치에서 손실 함수의 기울기를 계산하고, 이 기울기의 반대 방향으로 일정한 비율(학습률)만큼 이동함으로써 최적의 파라미터를 찾는다.

 

❗손실 함수 (비용 함수)

: 모델의 예측 값과 실제 값 사이의 차이를 측정하기 위해 비용 함수를 사용한다.

가장 일반적으로 사용되는 비용 함수는 평균 제곱 오차(Mean Squared Error, MSE)다.

🐿️ 손실함수가 작아진다 = 오차 범위가 작아진다 = 실제값과 예측값의 차이가 작다 = 예측값이 실제값을 거의 맞췄다 = 성능👍🏻

 

  • 경사 하강법의 작동 원리

1. 모델의 파라미터를 임의의 값으로 초기화한다.

2. 현재 파라미터에서 손실 함수의 기울기를 계산한다.

3. 파라미터기울기의 반대 방향으로 이동시킨다.

4. 손실 함수가 수렴할 때까지 또는 사전에 정한 반복 횟수만큼 2-3단계를 반복한다.

 

  • 경사 하강법의 종류

👉🏻 배치 경사 하강법

전체 데이터셋을 사용하여 기울기를 계산하고 파라미터를 업데이트한다.

장점 : 안정적인 수렴을 보이며, 최적의 방향으로 이동할 수 있다.

단점 : 대규모 데이터셋에서는 계산 비용이 높고 메모리 사용량이 많다.

 

👉🏻 확률적 경사 하강법

각 반복마다 하나의 샘플을 사용하여 기울기를 계산하고 파라미터를 업데이트한다. (데이터 한 개씩 랜덤하게 뽑음)

장점 : 대규모 데이터셋에서도 빠르게 업데이트가 가능하며, 지역 최적점에 빠지지 않고 전역 최적점을 찾을 가능성이 있다.

단점 : 업데이트에 노이즈가 많아 수렴이 불안정할 수 있다.

 

👉🏻 미니 배치 경사 하강법

전체 데이터셋을 작은 배치(덩어리)로 나누어 각 배치마다 기울기를 계산하고 파라미터를 업데이트한다.

장점 : 배치 경사 하강법과 확률적 경사 하강법의 장점을 모두 가지며, 효율적인 연산이 가능하다.

단점 : 배치 크기 선택에 따라 성능이 달라질 수 있다.

 

  • 학습률의 중요성

경사 하강법에서 파라미터를 업데이트할 때 이동하는 비율을 결정하는 중요한 하이퍼 파라미터이다. 학습률의 선택은 알고리즘의 수렴 속도와 안정성에 큰 영향을 미친다.

- 학습률이 너무 작을 경우 : 수렴 속도가 매우 느려지며, 많은 반복이 필요하다.

- 학습률이 너무 클 경우 : 최적의 파라미터를 지나쳐 발산할 수 있다.

 

  • 경사 하강법의 한계와 해결 방안

경사 하강법은 강력한 최적화 도구이지만 몇 가지 한계가 존재한다.

- 비볼록 함수의 경우, 지역 최적점에 빠질 수 있다.

- 특히 복잡한 모델에서는 수렴 속도가 느릴 수 있다.

- 적절한 학습률을 선택하는 것이 어려울 수 있다.

→ 이러한 문제를 해결하기 위해 다양한 변형 알고리즘이 개발되었다. 예를 들어, 모멘텀, 아담, RMSProp과 같은 최적화 알고리즘은 경사 하강법의 단점을 보완하여 더 빠르고 안정적인 수렴을 도모한다.

 

  • 학습률 (Learning Rate)

최적의 해를 빠르게 혹은 천천히 조금씩 찾아가는 '정도'를 가르키는 하이퍼 파라미터

기본값으로 보통 0.001을 사용

 

  • 잔차제곱합 (Residual Sum of Squares, RSS)

- 잔차 = 실제 값 - 예측 값

- 잔차제곱합 = (실제 값 - 예측 값)의 제곱의 합

- 회귀 모델의 정확도를 측정하는 지표

👉🏻 RSS가 작을수록 정확하게 예측하는 모델

👉🏻 RSS가 클수록 잘못된 예측하는 모델

 

- 모든 회귀 모델은 RSS가 최소가 되는 방향으로 학습이 진행됨 = 회귀계수(절편)는 RSS가 최소가 되도록 학습

- 비용함수 R(w)가 가장 작을 때의 w를 찾는 것이 회귀 모델의 목표

👉🏻 매 회차에 계산된 R(w)에서 순간변화율(기울기)를 구해야 함 → 미분 사용

👉🏻 단, 우리가 구해야 하는 회귀계수는 하나 이상이므로 우리는 편미분을 사용함

       →w0(절편)을 고정한 채로 w1의 미분을 구하고, w1을 고정한 채로 w0 미분을 구함

 

❗ 경사하강법 수식

 

❗ 경사하강법 공식

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(0)

X = np.random.rand(100, 1)
# print(X.shape)  # (100, 1) 2차원 형태
# print(X)

noise = np.random.randn(100, 1)  # 난수로 잡음을 더해줌
y = 6 + 4 * X + noise

plt.scatter(X, y)
plt.show()

# 경사하강법 실행

# 회귀계수(가중치) 초기화
w0 = np.zeros((1, 1))
w1 = np.zeros((1, 1))

# 잔차 계산
y_pred = w0 + np.dot(X, w1)
diff = y - y_pred

# 학습률
learning_rate = 0.01

# 데이터 개수
N = len(X)

# w0 편미분 (w0를 갱신할 값)
w0_diff = - learning_rate * 2/N * np.sum(diff)
w0 = w0 - w0_diff

# w1 편미분 (w1를 갱신할 값)
w1_diff = - learning_rate * 2/N * np.dot(X.T, diff)
w1 = w1 - w1_diff

print(f'1회 업데이트된 회귀계수 w0: {w0}, w1: {w1}')
# 1회 업데이트된 회귀계수 w0: [[0.16167019]], w1: [[0.08298126]]
def gradient_descent(X, y, learning_rate=0.01, max_iter=1000):
    # 회귀계수(가중치) 초기화
    w0 = np.zeros((1, 1))
    w1 = np.zeros((1, 1))

    # 데이터 개수
    N = len(X)

    for _ in range(max_iter):
        # 잔차 계산
        y_pred = w0 + np.dot(X, w1)
        diff = y - y_pred

        # w0 편미분 (w0를 갱신할 값)
        w0_diff = - learning_rate * 2/N * np.sum(diff)
        w0 = w0 - w0_diff

        # w1 편미분 (w1를 갱신할 값)
        w1_diff = - learning_rate * 2/N * np.dot(X.T, diff)
        w1 = w1 - w1_diff
        
    return w0, w1
    
w0, w1 = gradient_descent(X, y)
print(f'최종 회귀 계수(가중치): {w1}')  # 최종 회귀 계수(가중치): [[3.77397397]]
print(f'최종 회귀 계수(절편): {w0}')  # 최종 회귀 계수(절편): [[6.30473552]]

def cost_functon(y_true, y_pred):
    return np.sum((y_true - y_pred) ** 2) / len(y_true)
    
y_pred = w0 + np.dot(X, w1)
print(cost_functon(y, y_pred))  # 0.9946766142140662

plt.scatter(X, y)
plt.plot(X, y_pred, color='red')
plt.show()

def mini_batch_gradient_descent(X, y, batch_size=10, learning_rate=0.01, max_iter=1000):
    # 회귀계수(가중치) 초기화
    w0 = np.zeros((1, 1))
    w1 = np.zeros((1, 1))

    # 데이터 개수
    N = len(X)

    for _ in range(max_iter):
        # 미니 배치 데이터 선정
        random_idx = np.random.permutation(X.shape[0])
        X_sample = X[random_idx[:batch_size]]
        y_sample = y[random_idx[:batch_size]]
        
        # 잔차 계산
        y_pred = w0 + np.dot(X_sample, w1)
        diff = y_sample - y_pred

        # w0 편미분 (w0를 갱신할 값)
        w0_diff = - learning_rate * 2/N * np.sum(diff)
        w0 = w0 - w0_diff

        # w1 편미분 (w1를 갱신할 값)
        w1_diff = - learning_rate * 2/N * np.dot(X_sample.T, diff)
        w1 = w1 - w1_diff

        # 시각화
        plt.figure(figsize=(3, 2))
        plt.scatter(X, y)
        plt.plot(X_sample, y_pred, color='red')
        plt.show()
        
    return w0, w1
    
random_idx = np.random.permutation(X.shape[0])

w0, w1 = mini_batch_gradient_descent(X, y, batch_size=20, max_iter=100)

print(f'최종 회귀 계수(가중치): {w1}')
print(f'최종 회귀 계수(절편): {w0}')
# 최종 회귀 계수(가중치): [[1.31328426]]
# 최종 회귀 계수(절편): [[2.54915749]]

 

 

 

선형 회귀

 

머신러닝에서 가장 기본적이고 널리 사용되는 지도 학습 알고리즘 중 하나다. 연속적인 숫자 값을 예측하는 데 사용되며, 독립 변수(입력 변수)와 종속 변수(출력 변수) 사이의 관계를 선형 방정식으로 나타낸다. 즉, 데이터가 직선이나 평면으로 표현될 수 있다고 가정한다.

선형 회귀의 목표는 주어진 데이터에 가장 잘 맞는 직선(또는 초평면)을 찾아 새로운 입력값에 대한 예측을 수행하는 것이다.

 

  • 선형 회귀의 종류

👉🏻  단순 선형 회귀

하나의 독립 변수와 하나의 종속 변수 사이의 관계를 모델링한다.

 

👉🏻  다중 선형 회귀

둘 이상의 독립 변수와 하나의 종속 변수 사이의 관계를 모델링한다.

 

  • 파라미터 학습 방법

👉🏻  정규 방정식

👉🏻  경사 하강법

 

  • 선형 회귀의 가정

선형 회귀 모델이 유효하려면 다음과 같은 가정이 성립해야 한다.

 

1. 선형성(Linearity) : 독립 변수와 종속 변수 사이의 관계가 선형이어야 한다.

2. 독립성(Independence) : 각 관측치는 서로 독립적이여야 한다.

3. 등분산성(Homoscedasticity) : 오차의 분산이 모든 수준의 독립 변수에 대해 일정해야 한다.

4. 정규성(Normality) : 오차가 정규 분포를 따라야 한다.

 

  • 회귀 모델 성능 평가 지표

👉🏻  평균 제곱 오차(Mean Squared Error, MSE) : 오차(실제 값과 예측값의 차이)의 제곱 평균으로, 값이 작을수록 좋다.

👉🏻  평균 제곱근 오차(Root Mean Squared Error, RMSE) : MSE 값은 오류의 제곱을 구하므로 실제 오류 평균보다 더 커지는 특성이 있다. 따라서 MSE에 루트를 씌운 것이다.

👉🏻  평균 절대 오차(Mean Absolute Error, MAE) : 오차(실제 값과 예측값의 차이)의 절대값 평균으로, 해석이 직관적이다.

👉🏻  결졍 계수(R ²  score): 모델이 데이터를 얼마나 잘 설명하는지 나타내며, 분산 기반으로 예측 성능을 평가한다. 실제 값의 분산 대비 예측값의 분산 비율을 지표로 하며, 1에 가까울수록 좋다. 

 

  • 선형 회귀의 한계와 개선 방안

선형 회귀는 단순하고 해석이 용이하지만, 다음과 같은 한계가 있다.

👉🏻 독립 변수와 종속 변수 사이의 관계가 비선형인 경우 적합하지 않다.

👉🏻 데이터의 이상치에 크게 영향을 받는다.

👉🏻 독립 변수들 간의 상관관계가 높은 경우 문제가 발생한다.

▶ 이러한 한계를 극복하기 위해 다항 회귀, 규제 회귀, 비선형 모델 등이 사용된다.

 

  • 보스턴 집값 예측 데이터 활용 실습
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
boston_df = pd.read_csv('./data/boston_housing_train.csv')
boston_df.info()
boston_df.describe()

fig, ax = plt.subplots(figsize=(16, 10), ncols=5, nrows=3)

columns = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX',
            'RM', 'AGE', 'DIS', 'RAD', 'TAX', 
            'PTRATIO', 'B', 'LSTAT']

for i, col_name in enumerate(columns):
    row = i // 5
    col = i % 5
    ax_temp = ax[row][col]

    # sns.scatterplot(data=boston_df, x=col_name, y='MEDV', ax=ax_temp)
    sns.regplot(data=boston_df, x=col_name, y='MEDV', ax=ax_temp)  # 산점도와 회귀선까지 같이

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, root_mean_squared_error, mean_absolute_error, r2_score

# 입력-라벨 데이터 분리
X = boston_df.drop(['MEDV'], axis=1)
y = boston_df['MEDV']

# 학습-테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.2, random_state=0)

lr = LinearRegression()
lr.fit(X_train, y_train)

# 평가 -> score() -> 기본 평가 지표 R^2 (결정계수)
lr.score(X_train, y_train), lr.score(X_test, y_test)  
# (0.7730135569264234, 0.5892223849182503) -> 과소적합, 과대적합

y_pred = lr.predict(X_test)

# 다른 평가 지표
def evaluate_regression(y_true, y_pred):
    mse = mean_squared_error(y_true, y_pred)
    rmse = root_mean_squared_error(y_true, y_pred)
    mae = mean_absolute_error(y_true, y_pred)
    r2 = r2_score(y_true, y_pred)

    print(f'MSE: {mse}, RMSE: {rmse}, MAE: {mae}, R2: {r2}')
    
evaluate_regression(y_test, y_pred)
# MSE: 33.44897999767657, RMSE: 5.783509315085138, MAE: 3.842909220444503, R2: 0.5892223849182503

print(boston_df.columns)
print(lr.coef_)
print(lr.intercept_)

 

 

다항 회귀

 

독립 변수와 종속 변수 간의 비선형 관계를 모델링할 수 있는 회귀 분석 기법이다. 회귀 분석을 위한 요소 항이 여러 개 있는 경우로, 선형 회귀 모델에서 독립 변수의 다항식을 추가하여 복잡한 데이터 패턴을 표현할 수 있다.

- 회귀식 선형이 아닌 2차, 3차 방정식으로 표현되는 회귀 기법

 

  • 사용 이유

데이터 분포가 선형이 아닌 곡선 형태를 띠는 경우, 선형 회귀 모델로는 정확한 예측이 어렵다. 이러한 비선형 패턴을 잡아내기 위해 다항 회귀를 사용하여 모델의 복잡도를 높이고, 데이터에 더 잘 맞는 예측선을 생성할 수 있다.

 

  • 장단점

👉🏻 장점

선형 회귀로는 잡아내기 어려운 비선형 패턴을 효과적으로 모델링할 수 있다.

차수를 조절하여 모델의 복잡도를 쉽게 변경할 수 있다.

 

👉🏻 단점

차수가 높아질수록 모델이 학습 데이터에 지나치게 적합하여 새로운 데이터에 대한 일반화 성능이 떨어질 수 있다. (과적합)

고차 다항식의 경우 모델의 해석이 복잡해진다.

 

  • 과적합 방지 방법

1. 차수 조절 : 적절한 다항식의 차수를 선택하여 모델의 복잡도를 제어한다.

2. 규제 기법 적용 : Ridge, Lasso 등의 규제 기법을 사용하여 가중치의 크기를 제한한다.

3. 교차 검증 : 교차 검증을 통해 모델의 일반화 성능을 평가하고 최적의 차수를 찾는다.

4. 데이터 확장 : 더 많은 데이터를 수집하여 모델의 일반화 능력을 향상시킨다. 

from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(include_bias=False)      # degree = 2 기본값
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)

print(X_train.shape, X_train_poly.shape, X_test.shape, X_test_poly.shape)  # (379, 13) (379, 104) (127, 13) (127, 104)
poly.get_feature_names_out()

# 학습
lr_poly = LinearRegression()
lr_poly.fit(X_train_poly, y_train)

# 평가
lr_poly.score(X_train_poly, y_train), lr_poly.score(X_test_poly, y_test)
# (0.9448313975211595, 0.7758378393362159

# 예측 -> 평가지표 확인
y_pred = lr_poly.predict(X_test_poly)
evaluate_regression(y_test, y_pred)
# MSE: 15.697435826658243, RMSE: 3.961998968533213, MAE: 2.5831967744134205, R2: 0.7758378393362159

 

 

학습 곡선

 

머신러닝 모델의 성능을 학습 데이터와 검증 데이터에 대한 학습 진행 과정에서 학습 데이터 크기 또는 학습 단계(에포크) 대비 시각화한 그래프다. 학습 곡선은 모델이 학습하는 동안의 성능 변화를 보여주며, 과적합이나 과소적합 문제를 진단하는 데 유용하다.

 

 

선형 모델

 

독립 변수와 종속 변수 간의 관계를 선형 방정식으로 모델링하는 알고리즘이다.

선형 회귀, 규제 선형 모델, 그리고 일반화 성형 모델(GLM)이 이에 해당한다.

 

  • 규제 선형 모델

선형 회귀의 단점을 보완하기 위해 추가적인 제약(규제)을 도입한 모델이다.

과적합 문제를 완화하고, 모델의 일반화 성능을 향상시키기 위해 사용된다.

선형 회귀 모델의 경우 특성에 곱해지는 계수(또는 기울기)의 크기를 작게 만든다.

 

1. Ridge Regression (L2 규제)

a. Ridge 회귀는 L2 규제를 사용하는 선형 회귀 모델이다. 손실 함수에 가중치의 제곱합을 추가하여 큰 가중치를 억제한다.

b. 특징

- 큰 가중치를 줄여 과적합 문제를 완화한다.

- 가중치가 0에 가까워질 뿐, 완전히 0이 되지는 않는다.

c. 하이퍼 파라미터

- λ (규제 강도) : 값이 클수록 규제가 강해진다.

 

❗회귀 계수들의 제곱합에 alpha 패널티를 곱해 비용산정에 반영

❗alpha 값이 커지면 회귀 계수가 작아짐 → 과대적합 방지

from sklearn.model_selection import train_test_split

# 데이터 로드 및 분리
boston_df = pd.read_csv('./data/boston_housing_train.csv')

X = boston_df.drop('MEDV', axis=1)
y = boston_df['MEDV']

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
from sklearn.linear_model import Ridge

reg = Ridge(alpha=1)  # alpha 기본값: 1.0, 커질수록 규제강도 강해짐

reg.fit(X_train, y_train)
print(reg.score(X_train, y_train), reg.score(X_test, y_test))
# 0.7461161787884155 0.678974832784608
# 0.6659274317723316 0.6378962987850003 /alpha=1000

print(reg.coef_)
# 다른 평가 지표
from sklearn.metrics import mean_squared_error, root_mean_squared_error, mean_absolute_error, r2_score

def evaluate_regression(y_true, y_pred):
    mse = mean_squared_error(y_true, y_pred)
    rmse = root_mean_squared_error(y_true, y_pred)
    mae = mean_absolute_error(y_true, y_pred)
    r2 = r2_score(y_true, y_pred)

    print(f'MSE: {mse}, RMSE: {rmse}, MAE: {mae}, R2: {r2}')
    
    
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline

model = Pipeline([
    ('poly', PolynomialFeatures(include_bias=False, degree=2)),
    ('reg', Ridge(alpha=10))
])

model.fit(X_train, y_train)
print(model.score(X_train, y_train), model.score(X_test, y_test))
evaluate_regression(y_test, model.predict(X_test))
# 0.934045449915728 0.7735821268700346
# MSE: 15.855396927570286, RMSE: 3.981883590409228, MAE: 2.490640641202681, R2: 0.7735821268700346
# alpha 값에 따른 시각화
fig, ax = plt.subplots(nrows=1, ncols=5, figsize=(15, 5))

alphas = [0.01, 0.1, 1, 10, 100]

for i, alpha in enumerate(alphas):
    model = Ridge(alpha=alpha)  # alpha 값에 따라 달라진 가중치 확인

    model.fit(X_train, y_train)  # 학습

    coef = model.coef_
    coef_ser = pd.Series(coef, index=X.columns)
    coef_ser_name = 'alpha: ' + str(alpha)
    coef_ser = coef_ser.sort_values(ascending=False)

    ax[i].set_title(coef_ser.name)
    ax[i].set_xlabel('coef')
    ax[i].set_ylabel('index')
    ax[i].set_xlim(-20, 5)
    sns.barplot(x=coef_ser.values, y=coef_ser.index, ax=ax[i], hue=coef_ser.index)

plt.tight_layout()
plt.show()
# alpha 값이 커질수록(규제가 커질수록) 가중치의 규모가 작아짐 (특히 NOX 컬럼) -> 과대적합 방지

 

2. Lasso Regression (L1 규제)

a. Lasso 회귀는 L1 규제를 사용하는 선형 회귀 모델이다. 손실 함수에 가중치의 절댓값 합을 추가한다.

b. 특징

- 일부 가중치를 0으로 만들어 불필요한 특성을 제거한다. (특성 선택 가능)

c. 하이퍼 파라미터

- λ : 값이 클수록 더 많은 가중치를 0으로 만든다.

 

❗회귀계수 절대값의 합을 alpha 값과 곱해 규제 정도 지정

❗alpha 값이 커지면 규제 정도가 커짐

❗회귀 계수를 0까지 줄일 수 있음 = 해당 특성을 아예 반영되지 않도록 함 = 특성 선택 효과가 있음

from sklearn.linear_model import Lasso

reg = Lasso(alpha=10)

reg.fit(X_train, y_train)
print(reg.score(X_train, y_train), reg.score(X_test, y_test))  # 0.5373948270602298 0.49459972513091244
print(reg.coef_)

 

 

3. ElasticNet

a. L1 규제L2 규제를 결합한 모델이다. Ridge와 Lasso의 장점을 모두 활용할 수 있다.

b. 특징

- Lasso의 특성 선택 기능과 Ridge의 안정성을 모두 제공한다.

c. 하이퍼 파라미터

- λ1, λ2 : L1과 L2 규제의 가중치를 조절한다.

- α : 규제 강도를 조절한다.

from sklearn.linear_model import ElasticNet

reg = ElasticNet(alpha=10, l1_ratio=0.2)

reg.fit(X_train, y_train)
print(reg.score(X_train, y_train), reg.score(X_test, y_test))
print(reg.coef_)
# Pipeline 사용 -> degree=3 특성 확장 -> ElasticNet
# 학습 -> 평가 -> evaluate_regression()

poly = PolynomialFeatures(include_bias=False, degree=3)

model = Pipeline([
    ('poly', poly),
    ('reg', ElasticNet(alpha=100, l1_ratio=.6))
])

model.fit(X_train, y_train)
print(model.score(X_train, y_train), model.score(X_test, y_test))
evaluate_regression(y_test, model.predict(X_test))
# 0.9418717330309763 0.7629179933873925
# MSE: 16.602175734907753, RMSE: 4.074576755309409, MAE: 2.5467349670911603, R2: 0.7629179933873925
reg = model.named_steps['reg']  # 이름에 따른 단계들을 나타냄
print(reg.coef_, reg.intercept_)

 

  • 일반화 선형 모델 (GLM)

선형 회귀를 확장하여 종속 변수가 비선형적이거나 특정 분포를 따르는 경우에도 적용할 수 있도록 만든 모델이다.

GLM은 다양한 종류의 데이터에 유연하게 적용할 수 있는 강력한 모델이다.

 

1. GLM의 구조

👉🏻 선형 예측기, 링크 함수, 확률 분포

 

2. GML의 예

👉🏻 선형 회귀, 로지스틱 회귀, 포아송 회귀