KBinsDiscretizer 를 이용한 연속형 특징 구간화

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 Scikit-learn 의 KBinsDiscretizer 클래스를 사용하여 연속적인 특징을 이산화하는 방법을 보여줍니다. 이산화는 특징 값을 여러 구간 (bin) 으로 나누어 연속적인 특징을 이산적인 특징으로 변환하는 과정입니다. 이는 선형 관계만 모델링할 수 있는 선형 모델을 사용하거나 의사결정 트리의 복잡성을 줄이는 데 유용할 수 있습니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

필요한 라이브러리 로드

이 단계에서는 필요한 라이브러리를 가져옵니다.

import numpy as np
import matplotlib.pyplot as plt

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import KBinsDiscretizer
from sklearn.tree import DecisionTreeRegressor

데이터셋 생성

이 단계에서는 연속적인 입력 특징과 연속적인 출력 특징을 가진 데이터셋을 생성합니다. numpy.random.RandomState() 메서드를 사용하여 입력 특징에 대한 난수를 생성하고 numpy.sin() 메서드를 사용하여 출력 특징을 생성합니다.

rnd = np.random.RandomState(42)
X = rnd.uniform(-3, 3, size=100)
y = np.sin(X) + rnd.normal(size=len(X)) / 3
X = X.reshape(-1, 1)

데이터셋 시각화

이 단계에서는 산점도를 사용하여 데이터셋을 시각화합니다.

plt.scatter(X, y, color='black')
plt.show()

입력 특징 이산화

이 단계에서는 KBinsDiscretizer 클래스를 사용하여 입력 특징을 이산화합니다. 10 개의 구간을 생성하고 원 - 핫 인코딩을 사용하여 데이터를 변환합니다.

enc = KBinsDiscretizer(n_bins=10, encode="onehot")
X_binned = enc.fit_transform(X)

이산화된 데이터셋 시각화

이 단계에서는 산점도를 사용하여 이산화된 데이터셋을 시각화합니다.

plt.scatter(X_binned, y, color='black')
plt.show()

선형 회귀 모델 학습

이 단계에서는 원본 데이터셋에 선형 회귀 모델을 학습시킵니다.

reg = LinearRegression().fit(X, y)

의사결정 트리 모델 학습

이 단계에서는 원본 데이터셋에 의사결정 트리 모델을 학습시킵니다.

reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X, y)

구간화된 데이터셋에 대한 선형 회귀 모델 학습

이 단계에서는 구간화된 데이터셋에 선형 회귀 모델을 학습시킵니다.

reg = LinearRegression().fit(X_binned, y)

구간화된 데이터셋에 대한 의사결정 트리 모델 학습

이 단계에서는 구간화된 데이터셋에 의사결정 트리 모델을 학습시킵니다.

reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X_binned, y)

결과 시각화

이 단계에서는 구간화 전후 선형 회귀 및 의사결정 트리 모델의 결과를 시각화합니다.

## 원본 데이터셋으로 예측
fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True, figsize=(10, 4))
line = np.linspace(-3, 3, 1000, endpoint=False).reshape(-1, 1)
reg = LinearRegression().fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="green", label="선형 회귀")
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X, y)
ax1.plot(line, reg.predict(line), linewidth=2, color="red", label="의사결정 트리")
ax1.plot(X[:, 0], y, "o", c="k")
ax1.legend(loc="best")
ax1.set_ylabel("회귀 출력")
ax1.set_xlabel("입력 특징")
ax1.set_title("구간화 전 결과")

## 변환된 데이터셋으로 예측
line_binned = enc.transform(line)
reg = LinearRegression().fit(X_binned, y)
ax2.plot(
    line,
    reg.predict(line_binned),
    linewidth=2,
    color="green",
    linestyle="-",
    label="선형 회귀",
)
reg = DecisionTreeRegressor(min_samples_split=3, random_state=0).fit(X_binned, y)
ax2.plot(
    line,
    reg.predict(line_binned),
    linewidth=2,
    color="red",
    linestyle=":",
    label="의사결정 트리",
)
ax2.plot(X[:, 0], y, "o", c="k")
ax2.vlines(enc.bin_edges_[0], *plt.gca().get_ylim(), linewidth=1, alpha=0.2)
ax2.legend(loc="best")
ax2.set_xlabel("입력 특징")
ax2.set_title("구간화 후 결과")

plt.tight_layout()
plt.show()

요약

이 실습에서는 Scikit-learn 의 KBinsDiscretizer 클래스를 사용하여 연속적인 특징을 구간화하는 방법을 배웠습니다. 구간화는 선형 모델을 사용하거나 의사결정 트리의 복잡성을 줄이는 데 유용할 수 있습니다. 또한 원본 데이터셋과 구간화된 데이터셋 모두에 선형 회귀 및 의사결정 트리 모델을 학습시키고 결과를 시각화하는 방법을 배웠습니다.