KT-Aivle School (AI)/머신러닝

[모델링기초] 1. 선형회귀

똔똔똔 2022. 8. 23. 23:06

Chapter 0. 선 요약

선형회귀 (Linear Regression)

1. 알고리즘의 원리 개념

➔ 선형회귀식(직선, 평면식)으로 Target과의 관계를 설명하는 모델

➔ 오차를 최소화해주는 선형회귀식을 찾는 최적화과정

2. 전제조건

➔ NaN 조치, 가변수화, feature들은 독립성 가정을 충족해야 함 (다중 공선성 문제 등)

3. 성능: hyper parameter, 복잡도 결정 요인

➔ 어떤 변수를 포함할 것인가? 즉, 선형회귀에서는 변수 선택이 가장 중요.

➔ 변수가 많을 수록 복잡해짐.

 

회귀모델 평가

1. 오차 비 : R-squared(평균모델 오차 대비, 회귀모델이 오차를 해결한 비율)

= 모델의 설명력, 결정계수 (최소값: -∞최대값: 1)

2. 오차의 양 : MSE, RMSE (오차 제곱의 평균), MAE(절대값 오차의 평균, 평균오차)

(제곱의 특징: 큰 것은 더 크게, 작은 것은 더 작게)

3. 오차의 율 : MAPE (오차율의 평균)

 

 

 

모델링은 데이터로부터 패턴을 찾아 수학식으로 정리하는 과정


Chapter 1. 모델링 개요

Model (모델)

데이터로부터 패턴(규칙, 반복)을 찾아 수학식으로 정리해 놓은 것

Modeling : 오차가 적은 모델, 오차를 최소화 시킨 모델을 만드는 과정

 모델의 목적: 샘플을 가지고 전체를 추정, 예측, 추론

 

패턴을 찾는 2가지 방법

    1) 답이 있는 상황에서 패턴 찾기 (정답有) ➔ 답(y)을 알려주면서 패턴을 찾음

    = 지도학습(Supervised Learning)

     • 답의 종류

        (1) 숫자 회귀     ex) 내일 코스피는 얼마일까?

        (2) 범주 분류     ex) 내일 코스피는 오를까? ('답이 Yes or No 라면' 분류 문제)

    2) 답이 없는 상황에서 패턴 찾기 (정답無) ➔ 데이터 안에서 비슷한 것들끼리 묶어 패턴을 찾음

    = 비지도 학습(Unsupervised Learning)

 

오차

실제 값 = 모델 + 오차

(모델 ➔ 찾아낸 패턴, signal)

(오차 ➔ 자료가 벗어난 정도(Sum of Square Error) = σ(실제값 − 모델)^2, noise)

모델링의 목표는 오차의 최소화 (모형이 실제를 설명하는 영역을 최대화)

평균

  통계학에서 사용되는 가장 단순한 모형 중 하나

  관측값과 모형의 차이: 이탈도(deviance)

위 데이터의 평균: 173. 오차는 4건

 

모델링 예시

    1. 데이터 로딩

TV, Radio, Newspaper 광고비용 지출에 따른 판매액 데이터

우리의 비즈니스 목표: 광고비용 지출에 따른 매출액 예상

 

2. 데이터 전처리

    1) 데이터를 X와 Y로 나누기

데이터를 X와 Y로 나누기

target = 'Sales'
x = data.drop(target, axis=1)
y = data.loc[:, target]

    2) train, val (test)로 분할 (학습용과 검증용)

train, test로 분할

# train : test의 비율을 7 : 3으로 나누기
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3) # 4덩이

 

3. 학습

    1) 함수 불러오기

from sklearn.linear_model import LinearRegression #선형회귀
from sklearn.metrics import *

    2) 선언 (설계)

# 선형회귀(디폴트)를 model로 저장하여 사용
model = LinearRegression()

    3) 학습 (모델링)

# 학습용 데이터로 학습
model.fit(x_train, y_train)

    4) 검증

        (1) 예측 (일종의 모의고사)

        학습할 때 x 데이터 구조와 예측할 때 x의 구조는 똑같아야 함

# 테스트용 데이터(모의고사)로 모델이 얼마나 정확한지 검증
pred = model.predict(x_test)

        (2) 평가

# 정답지와 예측치를 비교
mean_absolute_error(y_test, pred) #평균오차

>>> 1.3187794881015067

  모델이 예측한 매출액과 실제값에는 1.3정도의 평균오차가 있었다.

 

Chapter 2. Linear Regression 1

단순회귀(Simple Regression)

➔ 하나의 예측변수로 하나의 결과변수를 예측

ex) <집값 예측 모델의 수학식>

집값 = -2 * (하위계층의 비율) + 10

: 하나의 예측변수(하위 계층의 비율)로 결과변수(집값)을 예측

 

자료를 설명하는 직선을 여러 개가 있을 수 있지만

     그 중 가장 잘 데이터를 설명하는 하나의 직선, 직선식으로 요약 (전체 오차가 가장 적은 직선)

• 머신러닝이 직선을 찾는 방법

= 최적화 ➔ 기울기와 절편을 조절하여 오차를 조금씩 줄이며 직선을 찾아감

 

 

데이터 분할 (train, validation, test)

train, validation, test로 데이터를 분할

train: 모델링에 사용되는 학습용 데이터

validation (= val): train과 함께 모델링에 사용되는 검증용 데이터

test: 데이터셋이 준비된 처음부터 떼어내는 부분

(마치 운영에서 발생된 데이터인양 간주)

(최종 검토용)

 

모델 내부 열어 보기

• 모델.coef_: 회귀계수 (=기울기)

• 모델.intercept_: y절편 (=가중치)

ex) <집값 예측 모델의 수학식>

집값 = (회귀계수) * (하위계층의 비율) + (y절편)

예를 들어, medv = -2 * (lstat) + 10에서 기울기가 나타내는 비즈니스적 의미는 (집값 단위: 1000달러)

➔ 하위비율이 1% 올라가면, 집값은 1000달러 하락

 

 

회귀 모델 평가

✓ 회귀 모델은 두 가지 관점으로 평가

    1) [y의 평균] 모델의 오차   vs   [회귀] 모델의 오차

    ➔ R² Score (=오차의비, 설명력, 결정계수)

    

    2) [실제 값(y)]   vs   [회귀 모델의 예측 값(y)]

     ➔ MSE, RMSE, MAE, MAPE (=오차의 크기, 오차율)

    

기억해야할 기호들

1. 오차의 비로 평가하기: R²

    ① 평균모델과 실제값(Yi) 과의 차이(SST) (의미: 회귀모델에서 BaseLine이 되는 오차)

    ② 평균 모델과 회귀모델 과의 차이(SSR) ➔ (의미: 회귀모델로 예측할 때 발생하는 오차)

    ③ 실제 값과 회귀모델 과의 차이(SSE) ➔ (의미: 회귀모델이 기존모델(평균모델)에서 해결한 오차)

평균 모델의 오차와 회귀모델 오차
R - squared

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

    ➔ 회귀모델이 얼마나 오차를 해결(설명)했는지를 나타냄

    ➔ 결정계수, 모델의 설명력 이라고 부르기도 함.

        *(SSE / SST = 잔차)

 

 

2. 오차의 양과 율로 비교하기

{"originWidth":938,"originHeight":632,"style":"alignCenter","width":542,"height":365,"caption":"실제값,&nbsp; &nbsp; &nbsp; &nbsp;예측값,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;실제값 - 예측값,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (실제값 - 예측값)&sup2;,

 

*(제곱의 특성: 큰 값은 더 크게, 작은 값은 더 작게 만들어줌)

SSE: 오차제곱의 합,&nbsp; &nbsp; &nbsp;MSE: SSE의 평균,&nbsp; &nbsp; RMSE: MSE의 제곱근
MAE: (절대치 오차의 합)의 평균 (= 평균오차)
{"originWidth":640,"originHeight":128,"style":"alignCenter","caption":"MAPE: ((

 

 

print("r2_score: ",r2_score(y_val,pred2))
print("MSE: ",mean_squared_error(y_val,pred2))
print("RMSE: ",mean_squared_error(y_val,pred2,squared=False))
print("MAE :",mean_absolute_error(y_val,pred2)) #평균오차
print("MAPE :",mean_absolute_percentage_error(y_val,pred2)) #평균오차율
print("회귀모델의 정확도 :",1-mean_absolute_percentage_error(y_val,pred2)) # 1 - MAPE: 회귀모델의 정확도

*(Quiz)

평균오차율(MAPE)의 최대_최소값(범위)는?

 

0 ~ 100%가 아니다. (오차율은 무한대까지 훨씬 커질 수도 있음)

➔ 오차가 무한대에 가까워지면 회귀모델의 정확도도 마이너스로 갈 수 있음

 

*(정리)

        (1) R² score: 평균모델의 오차 중에서 회귀 모델이 해결(설명)한 비율           

        (2) MSE: 오차 제곱의 평균           

        (3) RMSE: 오차 제곱의 평균의 제곱근 (큰 값은 더 크게, 작은 값은 더 작아짐)               

 

        (4) MAE: 평균오차           

        (5) MAPE: 평균오차율              

 

 

 

Chapter 3. Linear Regression 2

다중회귀(Multiple Regression)

➔ 복수의 예측변수로 하나의 결과변수를 예측

➔ Feature가 2개 이상 (단, Feature들 간에 상관관계가 없이 독립적이어야 한다)

 

ex) <집값 예측 모델의 수학식>

집값 = -2 * (하위계층의 비율) + -1.3 * (범죄율) + 6 * (재산세율) 이라고 가정하면

'재산세율' 변수가 '하위계층의 비율' 변수보다 회귀모델에서 더 중요하다는 의미가 아닌 것 

 

(단, 스케일링 과정이 있다면 더 중요한 변수의 의미를 뽑아낼 수 있음)

 

참조: 다중 공선성(Multi-Collinearity) - 변수들이 독립적이지 않을 때 생기는 문제

✓ 공선성(collinearity)

    • 하나의 독립변수가 다른 하나의 독립변수로 잘 예측되는 경우, 또는 서로 상관이 높은 경우

    ex) a 변수와 b 변수가 결과(Y)에 영향을 줄 때, a = 2 * b + 1 처럼 하나의 변수가 다른 변수로 예측이 됨

 

✓ 다중 공선성(multi-collinearity)

    • 하나의 독립변수가 다른 여러 개의 독립변수들로 잘 예측되는 경우

 

✓ 다중 공선성이 있으면

    • 회귀계수 추정이 잘 되지 않거나 불안정해져서 데이터가 약간만 바뀌어도 추정치가 크게 달라짐

    • 계수가 통계적으로 유의미하지 않은 것처럼 나올 수 있음

    ex) y = 3 * a - 2 * b + 5 일 때,   a와 y의 관계는 3

        그러나, b = 2 * a - 1로 표현이 되면  y = - 1 * a + 7로 회귀식이 바뀜

          

✓ 다중 공선성을 확인하기 위한 방법: 분산 팽창 지수(VIF, Variance Inflation Factor)

    • 일반적으로 VIF 값이

        • 5 이상 : 다중 공선성 존재

        • 10 이상 : 강한 다중 공선성

    • 공식 𝑉𝐼𝐹j = 1 1 − 𝑅j 2

(R² 이용)

 

✓ 그러나, 다중 공선성이 항상 성능에 문제가 되는 것은 아닐 수 있다.

    • 실험을 해봐야 한다.

 

 

 

============================================================================================

Tip)
(1) X_train(행렬), y_train(벡터)은 개발자들이 가장 많이 쓰는 변수 이름
X를 굳이 대문자로 쓰는 이유: 행렬은 수학적으로 대문자로 쓰고, 벡터는 소문자로 쓰기 때문

(2) 파이썬에서 함수끝에 '_'가 붙으면 값을 나타냄
ex) model.coef_, model.intercept_