코딩일기

[DataScience] 분산/편향 트레이드오프(Multiple Linear Regression) 본문

Code/머신러닝(ML)

[DataScience] 분산/편향 트레이드오프(Multiple Linear Regression)

daje 2021. 1. 29. 12:06
728x90
반응형

안녕하십니까 다제입니다. 

 

어제는 저희가 선형회귀(Linear regression)에 대해서 알아보았습니다. 

 

그러나, 선형회귀는 feature(데이터의 column)를 하나만 사용하기 때문에 실생활에서 사용하기 부정확합니다. 

 

 

그럼 어떻게 하면 성능을 높일 수 있을가요?

가장 먼저 생각나는 방법은 feature의 수를 늘리는 것입니다.

그럼~ 두 개이상의 feature를 사용하여 저희의 머신러닝의 성능을 높여보죠!

( 혹시  "feature의 수를 늘리는 것"이라는 말이 이해가 안돼시는 분는 접어진 글을 참고 부탁드립니다.)

더보기

오~ 접는 글을 여셨군요!

머신러닝에 관련된 글을

처음보시는 분들이라고 생각이 됩니다.

 

잘 오셨습니다~! 저는 최대한 머신러닝을

쉽게 말하고자 블로그를 운영하는 다제 입니다. 

 

바로 설명드릴게요!

 

머신러닝이라는 것은

기계가 학습한다라고 생각하시면 됩니다. 

 

그런데 기계가 어떻게 학습을 할까요?

여러 가지 방법이 있지만

 

본 포스터에서는

우리가 기계에게 엑셀sheet로 되어진 표와

정답을 알려주고

 

표에 없는 데이터 값을

예측하는 모델을 만드는 중입니다. 

 

그중 내가 생각하기 표를 가장 대표하는

세로줄을 선정하여 모델에게 학습시키는 것을 

Linear regression이라고 하고 

 

표를 두개 이상 선택하여 

학습시키는 것을

Mutiple Linear regression

라고 합니다. 

 

위에서 세로줄이라고 명명했는데

데이터사이언스에서는 이를 feature라고 합니다. 

 

이정도면 충분히 이해가 되셨을거라 믿습니다!

본문으로 오세요

 

이를 조금 멋있게 보이려면 "우리의 머신러닝을 일반화해보자" 라고 말할 수 있습니다. 

즉, 일상생활에서 모두가 사용할 수 있도록 머신러닝 모델의 성능을 높이는 것이 일반화라고 말할 수 있습니다. 

 

머신러닝과 딥러닝의 궁극적인 목적은 일반화를 잘하는 것입니다. 

어려운 수학적 개념 다 빼놓고 솔직히 터놓고 이야기해서

내가 만든 머신러닝이 현실세계를 엄청 잘 예측한다면 

더 이야기할 것이 없겠죠

 

그런데, 현실세계를 예측하는 것이 결코,,, 결코 쉽지 않습니다. 

자! 그럼 오늘 학습을 진행해보겠습니다. 

 

 


개요

 -. 다중선형회귀를 이해하기

 

 -. 머신러닝모델을 만들 때 학습과 테스트 데이터를 분리 해야 하는 이유는??

 

 -. 과적합/과소적합을 일반화 관점에서 바라보기

 

 -. 편향/분산의 트레이트오프 개념 & 일반화 관점에서 설명 바라보기

 

 


 

1. 다중선형회귀(다항회귀) 이해하기

 

어제 학습한 데이터 및 코드입니다. 

 

다항회귀를 어떻게 하는지 결론부터 말씀드리겠습니다. 

아래 코드에서 우리가 예측하기 위해 사용되는 특징 이라는 부분을 아래와 같이 고쳐주기만 하면 됩니다. 

 

선형회귀  ->  X = df[['sqft_living']]

다항회귀  ->  X = df[['sqft_living', 'grade', "sqft_above", "sqft_lot15"]]

 

from sklearn.linear_model import LinearRegression # 선형회귀 모델 import함 
from sklearn.model_selection import train_test_split # 데이터를 train과 test set으로 자동 분류해주는 것 
from sklearn.metrics import mean_squared_error # MSE를 만든 선형회귀 모델을 평가하고자 함  


url = "https://raw.githubusercontent.com/daje0601/pandas_study/main/kc_house_data.csv"

df = pd.read_csv(url)
df.head()

#데이터 준비 
# 우리가 예측해보고 싶은 값(타켓이라고 많이 말합니다.)
y = df[['price']]

# 우리가 예측하기 위해 사용되는 특징
X = df[['sqft_living', 'grade', "sqft_above", "sqft_lot15"]]

# 학습시킬 데이터와 분석할 데이터를 자동으로 나누는 코드 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=5 )

model = LinearRegression() # 모델 정의 
model.fit(X_train,y_train) # 모델 학습 
y_test_prediction = model.predict(X_test) # 모델 예측 

mean_squared_error(y_test, y_test_prediction) ** 0.5 # 모델 평가

쉽죠잉? 

이렇게 쉽게 할 수 있는건 선배 개발자분들의 피와 땀 때문입니다..( 항상 감사드립니다. )

 

 

일단 따라오다보니 먼가 결과가 나오긴 했는데

이게 무엇을 의미하는지 직관적으로 와닿지 않습니다. 

 

이를 설명하기 위해 제가 에러 값(MSE)들을 가져왔습니다.  

무엇을 보여드릴 거냐면, 학습하기 전의 에러와 학습 후 에러가 

얼마나 차이가 있는지를 본다면 오~ 학습하여 에러를 줄였구나! 라고 바로 와닿을 겁니다. 

 

 

[학습전 오류검사] -> 234,984.01

#테스트 에러: 234984.01

train_data["price"].mean()
target = 'price'
y_train = train_data[target]
y_test = test_data[target]
predict = y_train.mean()

from sklearn.metrics import mean_absolute_error
y_pred = [predict] * len(y_train)
mae = mean_absolute_error(y_train, y_pred)

print(f'훈련 에러: {mae:.2f}')

# 테스트 에러(MAE)
y_pred = [predict] * len(y_test)
mae = mean_absolute_error(y_test, y_pred)
print(f'테스트 에러: {mae:.2f}')

 

[학습후 오류검사] -> MAE : 163,580.71

#테스트 에러 : 163580.71

from sklearn.linear_model import LinearRegression # 선형회귀 모델 import함 
from sklearn.model_selection import train_test_split # 데이터를 train과 test set으로 자동 분류해주는 것 


X = df[['sqft_living', 'grade', "sqft_above", "sqft_lot15"]]
y = df[['price']]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=5 )

model = LinearRegression()
model.fit(X_train,y_train)
y_test_prediction = model.predict(X_test)
y_test_prediction


from sklearn.metrics import mean_absolute_error
MAE = mean_absolute_error(y_test, y_test_prediction)

 

[다항회귀의 결론]

 -. feature를 두개 이상을 사용하여 보다 정확하게 예측하고 오류를 줄 일 수 있는 하나의 방법입니다. 

 

 

 


 

2. 머신러닝모델을 만들 때 학습과 테스트 데이터를 분리 해야 하는 이유는??

 

 

위에서 저희는 아래 코드를 이용하여 데이터를 분리하였습니다. 

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=5 )

 

그러나 제가 별도의 설명을 드리지 않았죠?

train_test_split이라는 sklearn에 하나의 method입니다. 

 

그러면 우리는 왜 이렇게 데이터를 나눌까요?

 

우리가 하고자 하는 것을 다시 한번 생각해볼 필요가 있습니다. 

우리는 머신러닝 모델을 만들어서(모델에게 데이터를 학습시켜서)

이 모델에게 한번도 보여주지 않는 데이터를 나왔을 때 

실제값과 유사하게 잘 예측하는지를 평가하기 위한 것입니다. 

 

[결론]

 -. 뒤로 가시면 분류하는 방법에 대해 다양하게 배웁니다. 

 -. 지금은 위 분류하는 코드를 일고 사용할줄만 아시면 됩니다. 

 


 

 

3. 과적합/과소적합을 일반화 관점에서 바라보기

 

사실 이 부분이 매우 중요합니다. 

왜냐하면 이 다음에 배울 부분이

과적합/과소적합을 해결하기 위한 방법을 배웁니다. 

 

그러니! 꼭 과적합과 과소적합을 잘 이해해주시기 바랍니다. 

 

저희는 위에서

"일상생활에서 모두가 사용할 수 있도록

머신러닝 모델의 성능을 높이는 것이 일반화"라고 하였습니다. 

 

이 일반화를 모델에 적용하여 설명 드리겠습니다. 

테스트데이터에서도 좋은 성능을 내는 모델을 일반화가 잘 된 모델이라고 합니다. 

 

[과적합/과소적합 결론]

 

과적합은 
train_data의 정확도는 ↑, test_data의 정확도는 ↓


반대로 과소적합
train_data의 정확도도 ↓, test_data의 정확도도↓


(설명이 부족하닥 생각하시는 분들은 하단 더보기를 참고해주세요)

더보기

우리는 당연히 예측모델이 훈련데이터에서보다 테스트데이터에서 오차가 적게 나오기를 기대합니다. 하지만 현실적으로 모든 데이터를 얻을 수 없기 때문에 훈련데이터로부터 일반화가 잘 되는 모델을 학습시켜야 합니다.

  • 과적합은 모델이 훈련데이터에만 특수한 성질을 과하게 학습해 일반화를 못해 결국 테스트데이터에서 오차가 커지는 현상을 말합니다
  • 반대로 과소적합은 훈련데이터에 과적합도 못하고 일반화 성질도 학습하지 못해, 훈련/테스트 데이터 모두에서 오차가 크게 나오는 경우를 말합니다.

사실 머신러닝과정 중에서 과적합은 피할 수 없는 문제이고 완전히 극복할 수도 없습니다. 그래서 대부분 학습알고리즘은 이런 과적합을 완화시킬 수 있는 방법을 제공하기 때문에 잘 알아 두어야 하겠습니다.

 

 


 

4. 편향/분산의 트레이트오프 개념 & 일반화 관점에서 설명 바라보기

 

일단 편향이 높다는 말은 한쪽으로 데이터가 많이 치우져있다 생각하시면 됩니다. 

분산이 높다라는 말은 골고루 퍼져 있다라고 생각하시면 됩니다. 

 

그런데 잠깐! 

편향 ↔ 분산이구나! 하는 생각이 드시나요?

 

편향 ↑ , 분산↓되고 

편향 , 분산↑된다는 결론을 도출할 수 있겠네요!

 

 

이 개념을 모델에 적용해 보겠습니다. 

 

편향이 높은 머신 러닝 모델은

너무 간단해서 주어진 데이터의 관계를 잘 학습하지 못하고

 

편향이 낮은 모델은

주어진 데이터의 관계를 아주 잘 학습합니다.

 

분산은 다양한 테스트 데이터가 주어졌을 때

모델의 성능이 얼마나 일관적으로 나오는지를 뜻합니다.

 

직선 모델은 어떤 데이터 셋에 적용해도 성능이 비슷하게 나오지만,

복잡한 곡선 모델은 데이터 셋에 따라 성능의 편차가 굉장히 크기 때문에 직선 모델은 분산이 작고,

곡선 모델은 분산이 큽니다.

 

 

오늘은 어려운 내용을 다루어 보았습니다. 

힘들었지만, 꼭 잘 이해하고 넘어가셔야 하는 부분입니다. 

 

화이팅입니다!

 

728x90
반응형
Comments