본문 바로가기
기계학습(ML)/Linear Models

n212 Multiple Linear Regression / 과적합 과소적합

by kiimy 2021. 6. 12.
728x90
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression,  LogisticRegression, Ridge, RidgeCV
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.model_selection import train_test_split

# X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
from sklearn.metrics import r2_score, mean_squared_error

* Train data / Test data

  • 우리가 정말 관심있는것은 모델 학습에 사용한 훈련(train) 데이터를 잘 맞추는 모델이 아니라,
  • 학습에 사용하지 않은 테스트(test) 데이터를 얼마나 잘 맞추는지 입니다.
  • 데이터를 훈련/테스트 데이터로 나누어야 우리가 만든 모델의 예측 성능을 제대로 평가할 수 있습니다.
  • =학습에 사용하는 데이터와 모델을 평가하는데 사용하는 데이터가 달라야 한다

**시계열 데이터를 가지고 과거에서 미래를 예측하려고 하는 경우는 train data보다 test data가 미래의 것이어야함

# df.sample(frac=0.75,random_state=1

 

시계열 데이터란, 시간을 통해 순차적으로 발생한 관측치의 집합이라고 할 수 있다. 이렇게 순차적으로 발생한 연속적인 관측치는 서로 관련이 있다. 하지만 하나 알아두어야 할 점이 있다. 바로,

 

"이 때 시계열은 반드시 고정된(fixed) 시간 구간의 관측치어야 한다."

 

즉, 시계열이 불규칙적인 시간 구간이여서는 안된다는 것이다. 어떤 구간은 Daily 구간이였다가, 어떤 구간은 Monthly, 또 어떤 구간은 Yearly... 이렇게 다양한 구간이 동시에 존재해서는 안된다는 것이다.

 

#### process####

X데이터를 각각 X_train, X_test로 나누고

y데이터를 각각 y_train, y_test로 나눈다.

다음 X_train과 y_train으로 ML 모델을 만들고(= fit)

X_test를 모델에 넣으면 어떠한 y값이 나온다.(= predict)

이제 궁금한 건 모델을 통해 나온 y값이 우리가 가지고 있는 y_test와 같은지. (= y_test, y_pred)

*기준모델 ( Target )

  1. 먼저 해당 target 기준모델로 사용
  2. train= df.sample(frac=0.75,random_state=1) 75% train
  3. test= df.drop(train.index) 25% test
  4. y_train= train['target'] / predict= y_train.mean() # 평균값의로 예측(기준모델)
  5. y_test= test['target']
  6. 기준모델로 훈련 에러/ 테스트 에러 확인
  7. train mae = [predict] * len(y_train) // mean_absolute_error(y_train, [predict] * len(y_train))
  8. test mae = [predict] * len(y_test) // mean_absolute_error(y_test, [predict] * len(y_test))

* sklearn 단순선형

  1. 모델 설정 model= LinearReg
  2. feature 설정
  3. y_train= train['target'] // y_test= test['target']
  4. X_train= train['feature'] // X_test= test['feature']
  5. model.fit( train data )
  6. train error, test error ==> y_pred= model.predict(X_train) // model.predict(X_test)
  7. train, test mae 확인

해결하고자 하는 문제가 무엇인가? 특정 수치를 예측 -> 회귀 

주어진 데이터를 분류 및 분류 기준을 파악 -> 분류

* sklearn 다중선형

  1. feature 설정시 ['ㅁㄴㅇㅁㄴㅇ', 'ㅁㄴㅇㅁㄴㅇ'] 설정해주고 이하는 같다

 

  • 단순선형회귀식 
  • 2특성의 다중선형회귀 식: 

## 절편(intercept)과 계수들(coefficients)

model.intercept_, model.coef_ ==> feature 순서대로 나옴

*평가지표(evaluation metrics)

==> 회귀직선의 방정식이 얼마나 원래자료를 잘 설명하는지 나타내는 수치

  • MSE (Mean Squared Error) = 
  • MAE (Mean absolute error) 
  • RMSE (Root Mean Squared Error) 
  • ==>  MSE를 실제값과 유사한 단위로 변화시켜주는 장점
  • R-squared (Coefficient of determination) = 분포되있는 관측값과 추정값(회귀점들)을 비교
  • ==> 1에 가깝다 = 회귀선이 데이터를 잘 설명해주고 있다.
  • ==> (= 관측값과 예측값이 같다면 오차는 없으므로 SSR과 SST가 같음 / SSE가 0)
  • 참고
    • SSE(Sum of Squares Error, 관측치와 예측치 차이): 잔차 
    • SSR(Sum of Squares due to Regression, 예측치와 평균 차이): y의 평균 
    • SST(Sum of Squares Total, 관측치와 평균 차이): 
       , SSE + SSR

mse = mean_squared_error(y, y_pred)

mae = mean_absolute_error(y, y_pred)

rmse = mse ** 0.5

r2 = r2_score(y, y_pred)

*결정 계수

상관계수 = -1, 0, +1 인 것

상관계수는 공분산에선 대략적으로도 알 수 없던 선형관계를 대략적으로 알려주는 역할(= 방향)

독립변수(X)에 주택의 크기, 종속변수(Y)에 주택 가격으로 설정하여 그 데이터를 추출해 결정계수를 구하였는데 0.7788이 나왔다고 하자. 이때 결정계수의 의미는 "주택 가격이 변동하는 것의 77.88%는 주택의 크기가 변동에 의해 설명될 수 있다."

결정계수= 독립변수(X)의 변동에 의해 설명되는 종속변수(Y)의 변동 정도를 측정한다. 

 

"독립변수(X)가 원인이기 종속변수(Y)가 결과이다."라고 해석할 수 있는데 이는 맞지 않다.

만일 독립변수(X)가 원인이라면 관측되지 않은 종속변수(Y)의 값에 대해서도 독립변수(X)만으로

설명할 수 있어야 하기 때문이다.

 

하지만 관측되지 않은 종속변수(Y)는 단순히 상관관계 분석만으로 예측할 수 없다.  

그렇기 때문에 선형관계의 척도로는 독립변수와 종속변수에는 인과관계를 설명할 수 없고 

단지 독립변수의 변동이 종속변수의 변동을 어느정도를 설명하는지 나타낸다는 것을 반드시 기억해야한다.

-켈러의 경영경제통계학 제 9판-

*과적합(Overfitting)과 과소적합(Underfitting) 트레이드 오프 == 면접질문 단골

* 일반화 = 모든 입수할 증거에 입각하여 문제에 대한 가장 논리적이고 조리있는 해결을 말하는 것이다.

  • 테스트데이터에서 만들어내는 오차를 일반화 오차라고 부릅니다.
  • 훈련데이터에서와같이 테스트데이터에서도 좋은 성능을 내는 모델은 일반화가 잘 된 모델이라고 부릅니다.
  • 모델이 너무 훈련데이터에 과하게 학습(과적합)을 하지 않도록 하는 많은 일반화 방법들이 있습니다.
  • train / test 의 오차가 비슷하다 = var 이 낮다 , bias 높다 (오차는 여전히 많지만)
과적합 overfitting = 복잡한 모델 과소적합 underfitting = 간단한 모델
variance error 크고 bias error 작을때 variance error 작고 bias error 클때
train data에서는 오차가 작고 test data에서는 큼 train data, test data 둘다 못함 = 오차가 크게나옴
비모수 or 비선형 (의사결정트리 , k 최근접 ) 모수 선형모델 ( 선형회귀, 로지스틱 )

 ## train

* 좌측 편향이 큼(= 관찰값과 예측값의 오차가 큼 )

* 우측 train에선 오차가 없다.

##  test 

* 좌측 train 과 test의 분산이 낮다(= 오차가 다른 데이터 셋에서 비슷한 경향을 보이는 것)

* 우측 train에선 오차가 없었는데 test 데이터 셋에선 오차가 크다(= 과적합)

 

* bias // variance( 목표= bias도 낮고 var도 낮은 것을 찾는 것 )

bias 편향 variance 분산
알고리즘에서 잘못된 가정을 했을때 발생하는 오차 train data 내에 작은 변동 때문에 발생하는 오차
실제값과 얼마나 멀어져 있는가에 대한 척도 예측된 값들이 얼마나 멀어져 있는가에 대한 척도

*overfitting 일 경우

  • 모델의 기능 또는 조정 가능한 매개 변수 수를 제한합니다. 피쳐 수가 증가하면 모델의 복잡성도 증가하여 과적 합 가능성이 높아집니다.
  • 모델이 훈련 데이터를 "과도하게 학습"하지 않도록 훈련을 줄입니다.
  • 보다 원활한 네트워크 매핑을 장려하기 위해 오류 / 비용 함수에 정규화 용어를 추가합니다 (Ridge 또는 Lasso 회귀는 일반적으로 사용되는 기술).
  • 평균 제곱 오차를 최소화하기위한 교차 검증

*underfitting일 경우

  • 오류 / 비용 함수 (예 : MSE 또는 SSE)가 충분히 최소화되도록 훈련 데이터가 충분한 지 확인합니다.

* 다항회귀모델(polynomial regression =선형관계가 아닌 비선형관계일때 )

과소적합 == > 과적합

from sklearn.preprocessing import PolynomialFeatures

from sklearn.pipeline import make_pipeline

==> 비선형관계에서 상관계수는 낮게 나올 수 있지만 변수간 관계가 존재하지 않는 것은 아님

==> 비선형으로 회귀식을 잡으면 충분히 관계를 설명할 수 있음 

회귀모델의 목적이 해석이 아니라 예측이라면 비선형모델은 굉장히 유연하기때문에

복잡한 패턴을 가진 데이터 모델링 가능

def PolynomialRegression(degree=2, **kwargs):

    return make_pipeline(PolynomialFeatures(degree),

                                 LinearRegression(**kwargs))

poly_features = PolynomialFeatures(degree=2, include_bias=False)

 

파라미터 degree=2는 2차다항을 생성한다는 것이고, (x1, x2) -> (1, x1, x2, x1**2, x1x2, x2**2)

(새로운 특성을 생성)

include_bias=False는 default가 True인데 True이면 편향을 위한 변수(X0)인 1이 추가된다.

이와 같이 각 변수(X)값들을 제곱하여(degree=2), 새로운 변수를 만들어 주는 역할을 한다.

 

728x90

'기계학습(ML) > Linear Models' 카테고리의 다른 글

n214 Logistic Regression / validation  (0) 2021.06.14
n213 Ridge Regression, onehotencoding  (0) 2021.06.12
n211 Simple Regression  (0) 2021.06.12

댓글