오답노트
[ML] 선형회귀 (Linear Regression) 본문
선형회귀 (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 |