Machine Learning/Models (with codes)

Polynomial Regression Model

metamong 2022. 4. 24.

* Linear Regression Model - 즉, y 종속변수와 x 독립변수(1개 또는 2개 이상)들 간의 관계가 선형인 경우를 뜻한다. 즉, x 독립변수의 증감 변화에 따라 y도 이에 상응하여 증감이 일정한 수치의 폭으로 변화한다.

 

🧏‍♀️ 우리는 크게 3가지의 Linear Regression Model에 대해 배웠다.

 

1. SLR (단순선형회귀모델)

 

Simple Linear Regression (concepts)

** 우리는 저번시간에 Supervised Learning - Regression - Linear Regression까지 concepts에 대해 배웠다 (↓↓↓↓↓↓ 하단 포스팅 참조 ↓↓↓↓↓↓) ML Supervised Learning → Regression → Linear Regr..

sh-avid-learner.tistory.com

 

2. MLR (다중선형회귀모델)

 

Multiple Linear Regression Model (concepts+w/code)

✌️ 저번 시간에 feature가 1개인 단순선형회귀모델에 대해서 배웠다 ✌️ - 이론(개념) - Simple Linear Regression (concepts) ** 우리는 저번시간에 Supervised Learning - Regression - Linear Regression..

sh-avid-learner.tistory.com

 

3. RR (Ridge선형회귀모델)

 

(L2 Regularization) → Ridge Regression (concepts)

** 우리는 저번 포스팅에서 Supervised Learning 중 Regression의 일종인 'linear regression'에 대해 학습했다. ☝️ 위 그림에서 보다시피 linear 선형 regression으로는 많은 종류의 model이 있음을 확인할..

sh-avid-learner.tistory.com

 

🙋 여기서, 선형관계가 아니라, 좀 더 observation들에 맞게 fitting 되게끔

비선형 형태로 바꿔주는 모델이면 기존 선형회귀모델보다 더 정확성이 올라가지 않을까 예측해본다!

여기서 나온 model인 Polynomial Regression Model(다항회귀모델)에 대해서 이번 포스팅을 통해 배워볼까 한다!


-- 용어 주의 ⚠️ --

🦸‍♂️ 좀 더 엄밀히 말하면, 여기서 다루는 다항회귀모델(Polynomial Regression Model)은 선형회귀모델의 일종이라 할 수 있다. 선형이라 부르는 이유는 y 종속변수를 예측하기 위한 회귀변수끼리 서로 선형관계를 이루고 있기 때문.

(즉, 선형 & 비선형 구분 기준은 우리가 주목하는 회귀변수(계수들)의 선형결합으로 표현할 수 있는 지를 보여줌)

🙅 비선형회귀모델은 독립변수가 아니라 회귀변수가 서로 비선형인 모델을 뜻하며 너~무 복잡해서 스킵!

 

🧙🏻‍♀️ 다항회귀모델의 term들을 자세히 식으로 살펴보자면..

 

$y = ax1 + bx2 + cx1x2 + d(x1)^2 + e(x2)^2 + f$

 

→ 당장 독립변수가 2개만 있어도 항이 6개로 늘어나는 복잡한 다항식으로 표현된다. (3개 이상이면 식 표현하기도 어려움)

 

👨🏻‍✈️ 하지만 하나 확실한 건 식이 좀 더 복잡해 모델의 복잡성이 증가하는 만큼, 주어진 observation들을 더 잘 맞추어 선형회귀의 과소적합성 문제를 어느 정도 해결해 줄 수 있다는 것이다 (하지만 과적합 문제를 좀 피해야 할 필요성은 있겠지!)

w/sklearn - 실습

■sklearn.preprocessing.PolynomialFeatures docu

https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html

 

class sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False, include_bias=True, order='C')

 

"Generate polynomial and interaction features. Generate a new feature matrix consisting of all polynomial combinations of the features with degree less than or equal to the specified degree. For example, if an input sample is two dimensional and of the form [a, b], the degree-2 polynomial features are [1, a, b, a^2, ab, b^2]."

 

→ sklearn에서는 원하는 degree를 집어넣으면 degree 차수에 맞는 다항회귀모델의 가능한 모든 feature를 반환해준다.

→ 그러면 polynomialfeatures로 반환된 여러 X feature들을 기존의 y label과 함께 SLR 모델에 fitting하면 됨!

(결국 다항회귀모델도 SLR에 fitting하여 나타내는 일종의 선형모델이라 볼 수 있다)

 

☝️ PolynomialFeatures 반환결과 집어넣은 X features가 여러 다항 term들로 바뀜

 

-- 예시 -- 

 

① ibm data에서 가져온 car data를 사용 - target은 'price' & feature는 'stroke'

 

import seaborn as sns 
geyser = sns.load_dataset('geyser') 
feature = ['waiting'] 
target = ['duration'] 
X = geyser[feature].to_numpy()
y = geyser[target].to_numpy()

 

② dataset을 train set & test set으로 나누어서 train data로 Polynomial Model fitting 후 test data로 해당 model 성능 체크

 

from sklearn.model_selection import train_test_split

## X_train, X_test, y_train, y_test
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)

 

 polynomial degree를 계속 높여가면서(최대 10차 degree) 과연 R^2 score값이 좋아지는 지 체크! (+시각화도 확인)

 

( test set의 R^2 score값이 모델의 복잡성이 증가함에 따라 계속 좋아지는 지 체크)

 

# Visualizing the Polymonial Regression results
def viz_polymonial():
    plt.subplot(3,4,dg)
    plt.rcParams["grid.linewidth"] = 1
    plt.style.use('default')
    plt.scatter(X_train, y_train, color='#170327', marker='*', linewidths=1.1, s= 20)
    plt.plot(sorted(X_train), sorted(pol_reg.predict((X_poly))), color='#F3452D',linewidth=5)

    title_font = {
        'fontsize': 20,
        'fontweight' : 'bold',
    }
    label_font = {
        'fontsize':12
    }
    plt.title(f'degree of {dg}', fontdict=title_font, pad=15)
    plt.xlabel('waiting time', fontdict=label_font)
    plt.ylabel('duration time', fontdict=label_font)
    return

# Fitting Polynomial Regression to the dataset
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
train_r = []
test_r = []

for dg in range(1,13,1):
    poly_reg = PolynomialFeatures(degree=dg)
    X_poly = poly_reg.fit_transform(X_train)

    pol_reg = LinearRegression()
    #fitting train set
    pol_reg.fit(X_poly, y_train)

    #train 결과 확인하기
    train_r_squared = pol_reg.score(X_poly, y_train)
    train_r.append(train_r_squared)
    
    #visualization
    viz_polymonial()

    #test 결과 확인하기
    test_r_squared = pol_reg.score(PolynomialFeatures(degree=dg).fit_transform(X_test), y_test)
    test_r.append(test_r_squared)

plt.rcParams["figure.figsize"] = (20,20)
plt.tight_layout()
plt.show()

 

-- 시각화 결과 --

 

 

-- 결과 해석 --

 

result = pd.DataFrame({'train':train_r, 'test':test_r})

fig = plt.figure(figsize=(7,6))
sns.set_style('ticks')
sns.set_context("poster", font_scale = .8, rc={"grid.linewidth": 0.2})
s = sns.lineplot(data=result);
plt.axvline(4.0, color='red', linewidth=4)
s.set_xticks(range(12))
s.set_xticklabels(['1', '2','3','4','5','6','7','8','9','10', '11', '12']);

 

 

→ degree를 점점 높여가며 주어진 train data에 맞게 설정해 가니 train data의 결정계수값은 계속 증가했으며 10차까지 갈 때는 주어진 훈련 data에 대해 거의 90%의 설명력을 가지는, 매우 과적합 된 상태임을 알 수 있다. (그후 모델 degree가 11이상으로 증가할 경우 과적합으로 인해 설명력이 소폭 감소)

 

→ 반대로 test set의 경우 train set과 함께 5차까지는 결정계수값이 증가하나, 이후 train data에 대한 모델의 overfitting 문제로 인해 결정계수 값이 급격히 떨어짐을 알 수 있다. 

 

※ 따라서 SLR의 한계를 넘기 위해 다항회귀모델을 사용할 수 있으나, 차수를 너무 높이면 overfitting의 문제가 발생해 적정한 범위에서 cut되는 지점에 최적의 모델을 찾을 수 있다.

 

→ 위 그림상으로 봤을 때 최적의 polynomial regression model은 degree가 5인 다항모델이 된다.

🧐 polynomial model을 적용하지 않았더라면 test data의 설명력의 성능은 0.83 부근에 만족해야 했으나, polynomial degree를 높임으로써 설명력을 최대 0.88부근까지 올릴 수 있음을 알 수 있다 (PR 모델의 효과 증명)

 

※ ① degree 차수 뿐 아니라 training data 수에 의해서도 설명력이 달라진다. 추후 실험에서 주어진 training data 수에 의해 달라지는 설명력을 learning curve로 시각화 해 직접 알아보자

※ ② training data 뿐 아니라, grid search를 사용해 더 자세하게 parameter를 조정할 수 있다. 이를 통해 가장 validation score를 높이게 하는 최적의 parameter 조합을 구체적으로 찾을 수 있슴! (grid search 관련해서는 추가 포스팅 참조)


* 썸네일 출처 https://www.analyticsvidhya.com/blog/2020/03/polynomial-regression-python/

* 출처) 선형 & 비선형 차이 https://brunch.co.kr/@gimmesilver/18#comment

* 출처 - visualization https://towardsdatascience.com/machine-learning-polynomial-regression-with-python-5328e4e8a386

* 출처 - visualization https://www.theaispace.com/blog/Polynomial-Regression

댓글