Ai/SikitLearn

02. (지도학습)_Multiple Linear Regression(다중 선형 회귀)

Python Developer 2025. 4. 3. 19:46

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

원-핫 인코딩

import pandas as pd
dataset = pd.read_csv('../data/MultipleLinearRegressionData.csv')

X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values

dataset.head()
  hour absent place score
0 0.5 3 Home 10
1 1.2 4 Library 8
2 1.8 2 Cafe 14
3 2.4 0 Cafe 26
4 2.6 2 Home 22
X, y
(array([[0.5, 3, 'Home'],
        [1.2, 4, 'Library'],
        [1.8, 2, 'Cafe'],
        [2.4, 0, 'Cafe'],
        [2.6, 2, 'Home'],
        [3.2, 0, 'Home'],
        [3.9, 0, 'Library'],
        [4.4, 0, 'Library'],
        [4.5, 5, 'Home'],
        [5.0, 1, 'Cafe'],
        [5.3, 2, 'Cafe'],
        [5.8, 0, 'Cafe'],
        [6.0, 3, 'Library'],
        [6.1, 1, 'Cafe'],
        [6.2, 1, 'Library'],
        [6.9, 4, 'Home'],
        [7.2, 2, 'Cafe'],
        [8.4, 1, 'Home'],
        [8.6, 1, 'Library'],
        [10.0, 0, 'Library']], dtype=object),
 array([ 10,   8,  14,  26,  22,  30,  42,  48,  38,  58,  60,  72,  62,
         68,  72,  58,  76,  86,  90, 100], dtype=int64))
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(drop='first'), [2])], remainder='passthrough')
X = ct.fit_transform(X) # 범주형 데이터를 변환하고 학습
X

# remainder='passthrough' 범주형 데이터 외에 나머지는 그대로 유지
# remainder='drop' : 변환되지 않은 열들을 삭제

# 1 0 : Home
# 0 1 : Library
# 0 0 : Cafe
array([[1.0, 0.0, 0.5, 3],
       [0.0, 1.0, 1.2, 4],
       [0.0, 0.0, 1.8, 2],
       [0.0, 0.0, 2.4, 0],
       [1.0, 0.0, 2.6, 2],
       [1.0, 0.0, 3.2, 0],
       [0.0, 1.0, 3.9, 0],
       [0.0, 1.0, 4.4, 0],
       [1.0, 0.0, 4.5, 5],
       [0.0, 0.0, 5.0, 1],
       [0.0, 0.0, 5.3, 2],
       [0.0, 0.0, 5.8, 0],
       [0.0, 1.0, 6.0, 3],
       [0.0, 0.0, 6.1, 1],
       [0.0, 1.0, 6.2, 1],
       [1.0, 0.0, 6.9, 4],
       [0.0, 0.0, 7.2, 2],
       [1.0, 0.0, 8.4, 1],
       [0.0, 1.0, 8.6, 1],
       [0.0, 1.0, 10.0, 0]], dtype=object)

단순 선형 회귀 y = mx + b

다중 선형 회귀 y = b + m1x1 + m2x2 + mnxn....

다중공선성(Multicollinearity)이란?

다중공선성은 하나의 변수를 다른 변수로 예측할 수 있는 경우 발생합니다. 즉, 어떤 변수들이 서로 완전히 또는 부분적으로 상관관계를 가지면, 모델이 이들 간의 상관성을 해석하기 어려워집니다. 예를 들어, 세 가지 범주를 모두 인코딩하면 해당 열의 값을 합산하여 마지막 범주를 예측할 수 있는 상황이 생기므로 다중공선성이 발생합니다.

예시:

Apple과 Banana 열이 0이면, Orange 열은 자동으로 1이어야 합니다. 이는 모델이 하나의 변수를 다른 변수들로 예측할 수 있게 만들므로 다중공선성을 유발합니다.

drop='first'의 역할:
drop='first' 옵션은 이 문제를 방지하기 위해 원-핫 인코딩 시 첫 번째 범주를 제거합니다. 즉, 첫 번째 범주는 자동으로 나머지 범주에 의해 유추될 수 있으므로 굳이 포함하지 않아도 됩니다. 위 예시에서 'Apple'을 제거한 후 원-핫 인코딩하면 다음과 같이 변환됩니다:

데이터 세트 분리

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

학습 (다중 선형 회귀)

from sklearn.linear_model import LinearRegression
reg = LinearRegression()
reg.fit(X_train, y_train)
LinearRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

예측 값과 실제 값 비교 (테스트 세트)

y_pred = reg.predict(X_test)
y_pred
array([ 92.15457859,  10.23753043, 108.36245302,  38.14675204])
y_test
array([ 90,   8, 100,  38], dtype=int64)
  1. reg.coef_은 각 독립 변수의 기여도를 나타내며, 모델이 학습한 변수 간의 관계를 보여줍니다.
    reg.coef_에서 절대값이 클수록 해당 독립 변수가 종속 변수에 더 큰 영향을 미칩니다.
    계수의 부호(양수/음수)는 변화 방향을 나타낼 뿐, 영향력의 크기는 절대값을 기준으로 판단합니다.
  2. reg.intercept_는 모든 독립 변수가 0일 때 예측되는 종속 변수의 값입니다.
reg.coef_
# ('Home', 'Library', 공부시간, 결석)
# 'Cafe' 가 drop 됐음으로 'Cafe' 가 기준이 되어 나머지 데이터가 그에 대한 비교로 나타남
# 'Cafe' 의 회귀계수는 0임
array([-5.82712824, -1.04450647, 10.40419528, -1.64200104])
reg.intercept_
5.365006706544733

모델 평가

reg.score(X_train, y_train) # 훈련 세트
0.9623352565265528
reg.score(X_test, y_test) # 테스트 세트
0.9859956178877445

다양한 평가 지표 (회귀 모델)

  1. MAE (Mean Absolute Error) : (실제 값과 예측 값) 차이의 절대값
  2. MSE (Mean Squared Error) : (실제 값과 예측 값) 차이의 제곱
  3. RMSE (Root Mean Squared Error) : (실제 값과 예측 값) 차이의 제곱에 루트
  4. R2 : 결정 계수

R2 는 1에 가까울수록, 나머지는 0에 가까울수록 좋음

from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test, y_pred) # 실제 값, 예측 값 # MAE
3.225328518828811
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred) # MSE
19.90022698151514
from sklearn.metrics import root_mean_squared_error
root_mean_squared_error(y_test, y_pred) # RMSE
4.460967045553591
from sklearn.metrics import r2_score
r2_score(y_test, y_pred) # R2
0.9859956178877445