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

Binning (Discretization)

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

 

Binning(Discretization)

 

데이터를 가장 잘 표현하는 방법은 데이터가 가진 의미뿐 아니라 어떤 모델을 사용하는지에 따라 다릅니다.

 

선형 모델은 선형 관계로만 모델링합니다.

 

결정 트리는 훨씬 더 복잡한 모델을 만들 수 있습니다.

 

wave 데이터셋을 이용하여 선형 회귀 모델과 결정 트리 회귀를 비교해보겠습니다.

 

연속형 데이터에 아주 강력한 선형 모델을 만드는 방법 하나는 한 특성을 여러 특성으로 나누는 구간 분할 (이산화)입니다. 

 

그림1

 

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])

그림2

 

구간을 10개로 정의했기 때문에 변환된 데이터셋 X_binned는 10개의 특성으로 구성됩니다.

 

 

Wave 데이터셋 - 선형 모델, 트리 모델

 

각 구간에서 다른 값을 가지고 있으므로 선형 모델이 훨씬 유연해졌습니다. 

 

결정 트리는 덜 유연해졌습니다.

 

그림3

결론

 

선형 모델은 구간 분할을 새로 추가해 큰 이득을 볼 수 있습니다. 

 

일부 특성과 출력이 비선형 관계이지만, 용량이 매우 크고 고차원 데이터셋이라 선형 모델을 사용해야 한다면 구간 분할이 모델 성능을 높이는 데 아주 좋은 방법이 될 수 있습니다.

 

 

특성의 값을 구간으로 나누는 것은 결정 트리에 아무런 득이되지 않습니다.

 

결정 트리는 데이터를 자유롭게 나눠 학습할 수 있고 데이터셋에서 예측을 위한 가장 좋은 구간을 학습합니다. 

 

구간 나누기는 특성마다 따로 해야 하지만, 결정 트리는 한 번에 여러 특성을 살필 수 잇습니다. 

 

 

비선형모델은 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

댓글