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
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])
3차원을 사용했으므로 3개의 특성이 만들어집니다.
다항식 특성은 1차원 데이터셋에서도 매우 부드러운 곡선을 만듭니다.
고차원 다항식은 데이터가 부족한 영역에서 너무 민감하게 동작합니다.
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()
어떤 원본 특성이 곱해져 새 특성이 만들어졌는지 정확한 관계를 보기 위해서는 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
상호작용과 다항식 특성이 성능을 높였습니다.
결론
다항식과 상호작용 특성은 선형 모델을 사용할 때 성능을 향샹시켜 줍니다.
비선형 모델은 다항 없이도 복잡한 문제를 학습할 수 있습니다.
파이썬 라이브러리를 활용한 머신러닝 책과 성균관대학교 강석호 교수님 수업 내용을 바탕으로 요약 작성되었습니다.
'파이썬 라이브러리를 활용한 머신러닝' 카테고리의 다른 글
Automatic Feature Selection (0) | 2019.12.09 |
---|---|
Univariate Nonlinear Transformations (0) | 2019.12.06 |
Binning (Discretization) (0) | 2019.12.06 |
Categorical Variables (0) | 2019.12.04 |
Comparing and Evaluating Clustering Algorithms (0) | 2019.12.02 |
댓글