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

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

이론

  • 단순 선형 회귀 : y = mx + b

  • 다중 선형 회귀 : y = b + m1x1 + m2x2 + … + mnxn

즉, 독립변수가 많은 경우를 의미.

참고로 독립변수는 x, y생각하면 되는데 우리가 사는 3차원은 x, y, z인데 이 이상은 시각적으로 표현하기는 불가능

원-핫 인코딩

데이터가 다른것들은 숫자인데 어떤건 문자형(범주형)일 경우 우리가 원하는 데이터만 1로 표현하고, 나머지는 0으로 표현하는 방식을 의미한다.

  • Dummy Column이 문자 종류에 맞게 생성

예로 공부장소 : Home, Library, Cafe 인 경우?

  • Home : 1, 0, 0

  • Library : 0, 1, 0

  • Cafe : 0, 0, 1

다중 공선성

다중 공선성이라는 문제가 있다.

이는 독립변수들이 서로 상관관계가 있는 경우를 말한다.

해결 방법은 하나의 독립변수를 삭제하는것이다.

  • Dummy bariable trap : Dummy Column이 n개면? n-1개만 사용

예로 공부장소 : Home, Library, Cafe 인 경우?

  • Dummy Column이 3개이다. 하지만 1개를 삭제해서 2개를 사용한다.

  • Home : 1, 0

  • Library : 0, 1

import pandas as pd
dataset = pd.read_csv('MultipleLinearRegressionData.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
X
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)
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(drop='first'), [2])], remainder='passthrough') # drop으로 다중 공선성 해결
X = ct.fit_transform(X)
X

# 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)

데이터 세트 분리

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)
reg.coef_
array([-5.82712824, -1.04450647, 10.40419528, -1.64200104])
reg.intercept_
5.365006706544747

모델 평가

reg.score(X_train, y_train) # 훈련 세트
0.9623352565265527
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. R^2 : 결정 계수

R^2 는 1에 가까울수록, 나머지는 0에 가까울수록 좋음

결정 계수의 공식이며

  • 예측 값이 실제 값과 가까워 질수록 분수가 0이 될테니까 1이 수렴됨.

  • 그래서 1에 가까울수록 좋다는것

\[R^2 = 1 - \frac{(실제 값 - 예측 값)^2 의 합} {(실제 값 - 평균 값)^2 의 합 }\]
from sklearn.metrics import mean_absolute_error
mean_absolute_error(y_test, y_pred) # 실제 값, 예측 값 # MAE
3.2253285188288023
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred) # MSE
19.900226981515015
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, y_pred, squared=False) # RMSE
4.460967045553578
from sklearn.metrics import r2_score
r2_score(y_test, y_pred) # R2
0.9859956178877445
  • 참고 : 위 R2결과와 reg.score(X_test, y_test) # 테스트 세트

동일한 결과를 가진다는 것을 알 수 있다.

참고자료 : 나도코딩-유튜브

추천!

댓글남기기