오답노트

[ML] 선형회귀 (Linear Regression) 본문

Python/ML

[ML] 선형회귀 (Linear Regression)

권멋져 2022. 8. 22. 21:01

선형회귀 (Linear Regression)

데이터를 하나의 직선으로 요약이 가능하다면 선형회귀 알고리즘을 사용할 수 있다.

 

데이터를 설명 할 때, 여러가지 직선으로 설명할 수 있겠지만 그중에서 가장 잘 설명하는 직선 한 개를 선정하는 방법이다.

 

(출처 : http://primo.ai/index.php?title=Linear_Regression) 

 

단순회귀와 다중회귀로 나눌 수 있다.

단순회귀는 Feature가 1개를 사용하고 다중회귀는 Feature가 두개 이상을 사용하여 모델링하는 것을 말한다.

 

단순회귀 모델링 코드

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

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


path = 'boston.csv'
data = pd.read_csv(path)

target = 'medv'
x = data.drop(target,axis=1)
y = data[target]

x_train, x_val, y_train, y_val = train_test_split(x,y,test_size= .3, random_state= 2022)

features = ['lstat']

x_train1 = x_train[features]
x_val1 = x_val[features]

m1 = LinearRegression()
m1.fit(x_train1,y_train)
pred1 = m1.predict(x_val1)

print(m1.coef_,m1.intercept_)
# [-0.9568563] 34.676249051494665

print(r2_score(y_val,pred1))
#0.6315401111275217

print('RMSE : ',mean_squared_error(y_val,pred1,squared=False))
print('MAE : ', mean_absolute_error(y_val,pred1))
print('MAPE : ', mean_absolute_percentage_error(y_val,pred1))

'''

RMSE :  5.618124932523877
MAE :  4.138380487348265
MAPE :  0.22398686231166276

'''

 

1~3 줄 : 데이터 분석을 위한 라이브러리를 import한다.

4~7 줄 : 회귀분석 머신러닝을 위한 라이브러리 및 함수를 import 한다.

 

10~11 줄 : 학습시킬 데이터를 불러온다.

 

13~15 줄 : 타겟 데이터를 기존에 데이터에서 분리하여 타겟 데이터(Target)는 y, 나머지 데이터(Feature)는 x로 정의한다.

 

17 줄 : train_test_split 함수를 통해 x, y 데이터를 train 데이터와 validation으로 나눈다.

train 데이터는 모델을 학습시킬 때 사용하고, validation은 모델을 검증할 때 사용한다. 또 validation에서 test 데이터를 나누는 경우 혹은 train, validation, test 데이터로 나누는 경우가 있는데, test 데이터는 validation으로 검증을 모두 끝냈을 때 최종적으로 테스트 하는 데이터이다. 그런만큼 모델링중에는 절대 건들지 않도록하자.

 

19~22 줄 : 단순회귀를 사용하기 위해 Feature 데이터 중 1개를 선택하여 train 데이터와 validation 데이터를 만드는 과정이다.

 

24 줄 : 모델을 선언한다.

25 줄 : train 데이터를 입력하여 모델을 학습한다.

 

26 줄 : validation 데이터를 통해 데이터를 예측한다. 예측한 결과를 pred1에 반환한다.

 

28 줄 : 선형회귀는 데이터를 가장 잘 설명하는 한 개의 직선을 선택하는 알고리즘이다. 즉 1차원 방정식으로 표현이 가능하다. coef_ 는 회귀계수, intercpt_ 는 y 절편을 의미한다. 수식으로 표현하자면 아래와 같다.

위 코드에서 선형회귀 모델은 y = -0.95685* x + 34.67624 이다.

 

31~36 줄 : 회귀 모델를 평가하는 함수들이다.

R^2은 오차의 비, RMSE, MAE 는 오차의 양, MAPE는 오차의 율이다.

 

모델 평가

R squared

평균 모델의 오차 대비 회귀모델이 해결한 오차의 비율이다.

결정계수, 설명력이라고 부른다.

결정계수가 1에 가까울 수록 오차가 작다고 할 수 있다.

(출처 : https://vitalflux.com/r-squared-explained-machine-learning/)

  • SST : 실제값 - 평균값 = 평균 모델로 예측할 때 오차 (Base line 오차)
  • SSE : 실제값 - 예측값 = 회귀 모델로 예측할 때 오차
  • SSR : 회귀 모델이 평균 모델로 부터 얼마나 해결했는지

Root Mean Sum Squared Error (RMSE)

먼저 Sum Squared Error는 실제 값에서 예측 값을 뺀 값의 제곱에 대한 합이다.

Mean Sum Squared Error은 실제 값에서 예측 값을 뺀 값의 제곱에 대한 평균이다.

제곱은 연산의 결과가 어떻든 무조건 양수로 만들어준다는 특성이 있지만 작은 값은 더 작게, 큰 값은 더 크게 만들어주는 특성도 가지고 있다. 즉, 제곱의 편차가 더 극단적이게 계산됨을 의미한다.

 

이 값에 제곱근을 구하는 것이 RMSE다.

제곱근을 구하므로써 실제 편차에 가까운 값을 반영할 수 있다.

Mean Absolute Error (MAE)

Mean Sum Squared Error처럼 실제 값에서 예측 값을 뺀 값의 제곱을 하는 것이 아닌 절대값을 취한다.

MAE는 좀 더 직관적인 오차의 양을 구할때 용이하다.

Mean Absolute Percentage Error (MAPE)

Mean Absolute Percentage Error는 실제 값에서 예측 값을 뺀 퍼센트에 절대값을 취해 평균을 구하는 방법이다.

오차 율을 구할때 용이하다.

다중회귀 모델링 코드

Feature가 두 개 이상으로 모델링을 할 때 다중회귀라고 한다.

이 Feature 들은 서로 독립성을 띄고 있어야한다.

features = ['lstat','crim']

x_train2 = x_train[features]
x_val2 = x_val[features]

m2 = LinearRegression()
m2.fit(x_train2,y_train)

print(m2.coef_,m2.intercept_)
# [-0.92619138 -0.05916294] 34.493907672462406

coef_ 값이 단일회귀와 달리 2개의 값이 출력되었는데 이는 각각 'lstat'와 'crim'에 대한 계수다.

식으로 보면 아래와 같다.

 

다중 공선성

공선성이란 하나의 독립 변수가 다른 하나의 독립 변수로 잘 예측되는 경우, 또는 서로 상관이 높은 경우 공선성이 있다고 한다.

 

다중 공선성은 하나의 독립 변수가 다른 여러 개의 독립 변수들로 잘 예측 되는 경우에 다중 공선성이 있다고 할 수 있다.

 

다중회귀시 다중 공선성이 있는 변수로 모델링을 할 경우, 계수 추정이 잘 되지 않거나 불안정해져서 데이터가 조금만 바뀌어도 추정치가 크게 달라진다. 그리고 계수가 통계적으로 유의미하지 않은 것 처럼 나올 수 있다.

 

따라서 다중회귀는 Feature간의 독립성을 확인해야한다.

'Python > ML' 카테고리의 다른 글

[ML] 범주형 데이터 모델 평가 방법  (0) 2022.08.23
[ML] 로지스틱 회귀(Logistic Regression)  (0) 2022.08.23
[ML] KNN - KNeighborsRegressor  (0) 2022.08.23
[ML] KNN (K-Nearest Neighbors)  (0) 2022.08.23
[ML] 모델링 개요  (0) 2022.08.22