본문 바로가기
파이썬 라이브러리를 활용한 머신러닝

Polynomials and Interactions

by 지식광부키우기 2019. 12. 6.

 

Polynomials (다항식)

 

선형 모델에서 특성을 풍부하게 나타내는 방법은 원본 데이터에 다항식을 추가하는 것입니다.

 

다변량 다항 회귀 예시 

 

선형 회귀 모델 (polynomial degree=1)

 

$\hat{y} = w_{0} + w_{1}x$

 

2차 회귀 모델 (polynomial degree=2)

 

$\hat{y} = w_{0} + w_{1}x + w_{2}x^{2}$, $x^{2}$은 x의 제곱입니다.

 

다항 회귀 모델 (polynomial degree=9)

 

$\hat{y} = w_{0} + \sum_{i=1}^{9}w_{i}x^{i}$ $x^{i}$ : i-th power of x

 

그림1

 

 

Interactions (상호작용)

 

상호작용 특성은 데이터에 원래 특성을 다시 추가합니다.

 

$(x_{1}, x_{2}) -> (x_{1}x_{2})$

 

$(x_{1}, x_{2}, x_{3}) -> (x_{1}x_{2}, x_{2}x_{3}, x_{1}x_{3}, x_{1}x_{2}x_{3})$

 

변수가 두개인 이차 회귀 예시 

 

$\hat{y} = w_{00} + w_{10}x_{1} + w_{01}x_{2} + w_{20}x_{1}^{2} + w_{11}x_{1}x_{2} + w_{02}x_{2}^{2}$

 

 

Wave 데이터셋 - 다항식

 

import mglearn
X, y = mglearn.datasets.make_wave(n_samples=100)
print(X[:5])

[[-0.753]

 [ 2.704]

 [ 1.392] 

 [ 0.592]

 [-2.064]]

 

데이터셋을 만듭니다.

 

 

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=3, include_bias=False)
poly.fit(X)
X_poly = poly.transform(X)
print(X_poly[:5])

그림2

 

3차원을 사용했으므로 3개의 특성이 만들어집니다. 

 

 

다항식 특성은 1차원 데이터셋에서도 매우 부드러운 곡선을 만듭니다.

 

고차원 다항식은 데이터가 부족한 영역에서 너무 민감하게 동작합니다.

 

그림3

 

 

Iris 데이터셋 - 상호작용 다항식 없이

 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,
                                                    random_state=42)

# 데이터 스케일 조정
scaler = StandardScaler()
scaler.fit(X_train)
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

 

아이리스 데이터셋을 이용합니다.

 

훈련 데이터와 테스트 데이터로 나누어주고 스케일 조정을 해줍니다.

 

 

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(X_train_scaled, y_train)

 

모델을 만든 후

 

 

from sklearn.metrics import accuracy_score
y_train_hat = clf.predict(X_train_scaled)
print('train accuracy :', accuracy_score(y_train, y_train_hat))
y_test_hat = clf.predict(X_test_scaled)
print('test accuracy :', accuracy_score(y_test, y_test_hat))

train accuracy : 0.8839285714285714

test accuracy : 0.9473684210526315

 

정확도는 위와 같습니다.

 

 

Iris 데이터셋 - 상호작용 다항식 적용

 

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,
                                                    random_state=42)

 

아이리스 데이터셋을 이용합니다.

 

훈련 데이터와 테스트 데이터로 나누어줍니다.

 

 

from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2, include_bias=False)
poly.fit(X_train)
poly.get_feature_names()

그림4

 

어떤 원본 특성이 곱해져 새 특성이 만들어졌는지 정확한 관계를 보기 위해서는 get_feature_names 메서드를 사용합니다.

 

 

X_train_poly = poly.transform(X_train)
X_test_poly = poly.transform(X_test)
print(X_train.shape, X_train_poly.shape)

(112, 4) (112, 14)

 

특성의 수가 4개에서 14개로 확장되었습니다.

 

 

# 데이터 스케일 조정
scaler = StandardScaler()
scaler.fit(X_train_poly)
X_train_poly_scaled = scaler.fit_transform(X_train_poly)
X_test_poly_scaled = scaler.transform(X_test_poly)

 

데이터의 스케일을 조정해줍니다.

 

 

from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
clf.fit(X_train_poly_scaled, y_train)

 

모델을 만든 후

 

 

from sklearn.metrics import accuracy_score
y_train_hat = clf.predict(X_train_poly_scaled)
print('train accuracy :', accuracy_score(y_train, y_train_hat))
y_test_hat = clf.predict(X_test_poly_scaled)
print('test accuracy :', accuracy_score(y_test, y_test_hat))

train accuracy : 0.9553571428571429

test accuracy : 1.0

 

상호작용과 다항식 특성이 성능을 높였습니다.

 

 

결론

 

다항식과 상호작용 특성은 선형 모델을 사용할 때 성능을 향샹시켜 줍니다.

 

비선형 모델은 다항 없이도 복잡한 문제를 학습할 수 있습니다. 

 

 

파이썬 라이브러리를 활용한 머신러닝 책과 성균관대학교 강석호 교수님 수업 내용을 바탕으로 요약 작성되었습니다.

댓글