Binning(Discretization)
데이터를 가장 잘 표현하는 방법은 데이터가 가진 의미뿐 아니라 어떤 모델을 사용하는지에 따라 다릅니다.
선형 모델은 선형 관계로만 모델링합니다.
결정 트리는 훨씬 더 복잡한 모델을 만들 수 있습니다.
wave 데이터셋을 이용하여 선형 회귀 모델과 결정 트리 회귀를 비교해보겠습니다.
연속형 데이터에 아주 강력한 선형 모델을 만드는 방법 하나는 한 특성을 여러 특성으로 나누는 구간 분할 (이산화)입니다.
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]]
샘플을 만듭니다.
import numpy as np
bins = np.linspace(-3, 3, 11)
print("bins: {}".format(bins))
which_bin = np.digitize(X, bins=bins)
bins: [-3. -2.4 -1.8 -1.2 -0.6 0. 0.6 1.2 1.8 2.4 3. ]
-3과 3 사이에 같은 간격으로 10개의 구간을 정의했습니다.
np.digitize 함수로 각 데이터 포인트가 어느 구간에 속하는지 기록합니다.
from sklearn.preprocessing import OneHotEncoder
# 변환을 위해 OneHotEncoder를 사용합니다
encoder = OneHotEncoder(sparse=False)
# encoder.fit은 which_bin에 나타난 유일한 값을 찾습니다.
encoder.fit(which_bin)
# 원-핫-인코딩으로 변환합니다.
X_binned = encoder.transform(which_bin)
print(X_binned[:5])
구간을 10개로 정의했기 때문에 변환된 데이터셋 X_binned는 10개의 특성으로 구성됩니다.
Wave 데이터셋 - 선형 모델, 트리 모델
각 구간에서 다른 값을 가지고 있으므로 선형 모델이 훨씬 유연해졌습니다.
결정 트리는 덜 유연해졌습니다.
결론
선형 모델은 구간 분할을 새로 추가해 큰 이득을 볼 수 있습니다.
일부 특성과 출력이 비선형 관계이지만, 용량이 매우 크고 고차원 데이터셋이라 선형 모델을 사용해야 한다면 구간 분할이 모델 성능을 높이는 데 아주 좋은 방법이 될 수 있습니다.
특성의 값을 구간으로 나누는 것은 결정 트리에 아무런 득이되지 않습니다.
결정 트리는 데이터를 자유롭게 나눠 학습할 수 있고 데이터셋에서 예측을 위한 가장 좋은 구간을 학습합니다.
구간 나누기는 특성마다 따로 해야 하지만, 결정 트리는 한 번에 여러 특성을 살필 수 잇습니다.
비선형모델은 binning을 사용하지 않고 복잡한 문제를 학습할 수 있습니다.
파이썬 라이브러리를 활용한 머신러닝 책과 성균관대학교 강석호 교수님 수업 내용을 바탕으로 요약 작성되었습니다.
'파이썬 라이브러리를 활용한 머신러닝' 카테고리의 다른 글
Univariate Nonlinear Transformations (0) | 2019.12.06 |
---|---|
Polynomials and Interactions (0) | 2019.12.06 |
Categorical Variables (0) | 2019.12.04 |
Comparing and Evaluating Clustering Algorithms (0) | 2019.12.02 |
DBSCAN (0) | 2019.11.28 |
댓글