TargetEncoder 를 이용한 범주형 데이터 변환

Beginner

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

소개

이 실습에서는 Scikit-learn 라이브러리의 TargetEncoder 클래스를 사용하는 방법을 배웁니다. 타겟 인코딩은 범주형 데이터를 머신 러닝 알고리즘의 입력으로 사용할 수 있는 숫자 데이터로 변환하는 기술입니다. TargetEncoder는 범주형 특징의 각 범주를 해당 범주에 대한 타겟 변수의 평균으로 대체합니다. 이 방법은 범주형 특징과 타겟 변수 사이에 강한 관계가 있는 경우 유용합니다.

VM 팁

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

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

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

필요한 라이브러리 설치

먼저 필요한 라이브러리를 설치해야 합니다. Scikit-learn, Pandas, Matplotlib 라이브러리를 사용할 것입니다. 다음 명령어를 실행하여 이러한 라이브러리를 설치합니다.

!pip install scikit-learn pandas matplotlib

필요한 라이브러리 가져오기

다음으로 필요한 라이브러리를 가져와야 합니다. 다음 코드를 실행하여 필요한 라이브러리를 가져옵니다.

import numpy as np
import pandas as pd
from sklearn.preprocessing import KBinsDiscretizer, TargetEncoder
from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt

합성 데이터 생성

이 실습에서는 세 가지 범주형 특징을 가진 합성 데이터를 생성합니다. 중간 크기의 정보 특징, 중간 크기의 비정보 특징, 그리고 높은 크기의 비정보 특징이 포함됩니다. Scikit-learn 의 KBinsDiscretizer 클래스를 사용하여 정보 특징을 생성합니다. 다음 코드를 실행하여 합성 데이터를 생성합니다.

n_samples = 50_000

rng = np.random.RandomState(42)
y = rng.randn(n_samples)
noise = 0.5 * rng.randn(n_samples)
n_categories = 100

kbins = KBinsDiscretizer(
    n_bins=n_categories, encode="ordinal", strategy="uniform", random_state=rng
)
X_informative = kbins.fit_transform((y + noise).reshape(-1, 1))

permuted_categories = rng.permutation(n_categories)
X_informative = permuted_categories[X_informative.astype(np.int32)]

X_shuffled = rng.permutation(X_informative)

X_near_unique_categories = rng.choice(
    int(0.9 * n_samples), size=n_samples, replace=True
).reshape(-1, 1)

X = pd.DataFrame(
    np.concatenate(
        [X_informative, X_shuffled, X_near_unique_categories],
        axis=1,
    ),
    columns=["informative", "shuffled", "near_unique"],
)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

원 데이터로 Ridge 회귀 모델 학습

이 섹션에서는 인코딩 여부와 구간 교차 검증 (interval cross-validation) 유무에 따라 타겟 인코더를 사용하여 데이터셋에 Ridge 회귀 모델을 학습하고 그 영향을 살펴봅니다. 먼저, 원본 특징으로 Ridge 모델을 학습합니다. 다음 코드를 실행하여 Ridge 모델을 학습합니다.

ridge = Ridge(alpha=1e-6, solver="lsqr", fit_intercept=False)

raw_model = ridge.fit(X_train, y_train)
print("Raw Model score on training set: ", raw_model.score(X_train, y_train))
print("Raw Model score on test set: ", raw_model.score(X_test, y_test))

교차 검증을 사용한 Ridge 회귀 모델 학습

다음으로 TargetEncoder와 Ridge 모델을 포함하는 파이프라인을 생성합니다. 이 파이프라인은 교차 검증을 사용하는 TargetEncoder.fit_transform을 사용합니다. 교차 검증을 사용하여 Ridge 모델을 학습하는 코드는 다음과 같습니다.

model_with_cv = make_pipeline(TargetEncoder(random_state=0), ridge)
model_with_cv.fit(X_train, y_train)
print("Model with CV on training set: ", model_with_cv.score(X_train, y_train))
print("Model with CV on test set: ", model_with_cv.score(X_test, y_test))

교차 검증을 사용한 선형 모델 계수 평가

선형 모델의 계수를 살펴보면, 대부분의 가중치가 정보적인 특징인 0 번 열의 특징에 집중되어 있습니다. 교차 검증을 사용하여 선형 모델의 계수를 평가하는 코드는 다음과 같습니다.

coefs_cv = pd.Series(
    model_with_cv[-1].coef_, index=model_with_cv[-1].feature_names_in_
).sort_values()
_ = coefs_cv.plot(kind="barh")

교차 검증 없이 Ridge 회귀 모델 학습

TargetEncoder.fit_transform은 구간 교차 검증을 사용하지만, TargetEncoder.transform 자체는 교차 검증을 수행하지 않습니다. 범주형 특징을 변환하기 위해 전체 학습 데이터 집합의 집계를 사용합니다. 따라서 교차 검증을 비활성화하려면 TargetEncoder.fit을 먼저 실행하고 TargetEncoder.transform을 사용할 수 있습니다. 이렇게 인코딩된 데이터는 Ridge 모델에 전달됩니다. 교차 검증 없이 Ridge 모델을 학습하는 코드는 다음과 같습니다.

target_encoder = TargetEncoder(random_state=0)
target_encoder.fit(X_train, y_train)
X_train_no_cv_encoding = target_encoder.transform(X_train)
X_test_no_cv_encoding = target_encoder.transform(X_test)

model_no_cv = ridge.fit(X_train_no_cv_encoding, y_train)
print(
    "Model without CV on training set: ",
    model_no_cv.score(X_train_no_cv_encoding, y_train),
)
print(
    "Model without CV on test set: ", model_no_cv.score(X_test_no_cv_encoding, y_test)
)

교차 검증 없이 선형 모델 계수 평가

Ridge 모델이 과적합되는 이유는 정보적인 특징에 비해 극단적으로 높은 카디널리티를 가진 특징에 더 많은 가중치를 할당하기 때문입니다. 교차 검증 없이 선형 모델의 계수를 평가하는 코드는 다음과 같습니다.

coefs_no_cv = pd.Series(
    model_no_cv.coef_, index=model_no_cv.feature_names_in_
).sort_values()
_ = coefs_no_cv.plot(kind="barh")

요약

이 실습에서는 Scikit-learn 의 TargetEncoder 클래스를 사용하여 범주형 데이터를 기계 학습 알고리즘의 입력으로 사용할 수 있는 숫자 데이터로 변환하는 방법을 배웠습니다. 또한 과적합을 방지하는 구간 교차 검증의 중요성을 학습했습니다. 원시 데이터로 Ridge 모델을 학습하고 성능을 평가했습니다. 또한 교차 검증이 적용된 Ridge 모델을 학습하고 선형 모델의 계수를 평가했습니다. 마지막으로 교차 검증 없이 Ridge 모델을 학습하고 선형 모델의 계수를 평가했습니다.