분류기 체인 앙상블

Beginner

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

소개

이 실습은 다중 레이블 데이터셋에 분류기 체인을 사용하는 예시를 보여줍니다. 분류기 체인 알고리즘은 다중 레이블 분류를 위한 문제 변환 방법의 수정된 버전입니다. 이 방법은 각 모델이 체인 내 이전 모델의 예측 결과를 특징으로 활용하여 클래스 간의 상관관계를 활용합니다. yeast 데이터셋을 사용할 예정이며, 이 데이터셋은 103 개의 특징과 14 개의 가능한 레이블을 가진 2417 개의 데이터 포인트를 포함합니다. 각 데이터 포인트는 적어도 하나의 레이블을 가지고 있습니다. 기준선으로 먼저 14 개의 레이블 각각에 대한 로지스틱 회귀 분류기를 학습합니다. 이 분류기의 성능을 평가하기 위해 홀드아웃 테스트 세트에 예측하고 각 샘플의 Jaccard 점수를 계산합니다.

VM 팁

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

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

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

yeast 데이터셋 로드

X, Y = fetch_openml("yeast", version=4, return_X_y=True, parser="pandas")
Y = Y == "TRUE"
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

각 클래스에 대한 독립적인 로지스틱 회귀 모델 학습

base_lr = LogisticRegression()
ovr = OneVsRestClassifier(base_lr)
ovr.fit(X_train, Y_train)
Y_pred_ovr = ovr.predict(X_test)
ovr_jaccard_score = jaccard_score(Y_test, Y_pred_ovr, average="samples")

로지스틱 회귀 분류기 체인 앙상블 학습

chains = [ClassifierChain(base_lr, order="random", random_state=i) for i in range(10)]
for chain in chains:
    chain.fit(X_train, Y_train)

Y_pred_chains = np.array([chain.predict(X_test) for chain in chains])
chain_jaccard_scores = [
    jaccard_score(Y_test, Y_pred_chain >= 0.5, average="samples")
    for Y_pred_chain in Y_pred_chains
]

모든 체인의 예측 평균 계산

Y_pred_ensemble = Y_pred_chains.mean(axis=0)
ensemble_jaccard_score = jaccard_score(
    Y_test, Y_pred_ensemble >= 0.5, average="samples"
)

Jaccard 유사도 점수 시각화

model_scores = [ovr_jaccard_score] + chain_jaccard_scores
model_scores.append(ensemble_jaccard_score)

model_names = (
    "독립",
    "체인 1",
    "체인 2",
    "체인 3",
    "체인 4",
    "체인 5",
    "체인 6",
    "체인 7",
    "체인 8",
    "체인 9",
    "체인 10",
    "앙상블",
)

x_pos = np.arange(len(model_names))

fig, ax = plt.subplots(figsize=(7, 4))
ax.grid(True)
ax.set_title("분류기 체인 앙상블 성능 비교")
ax.set_xticks(x_pos)
ax.set_xticklabels(model_names, rotation="vertical")
ax.set_ylabel("Jaccard 유사도 점수")
ax.set_ylim([min(model_scores) * 0.9, max(model_scores) * 1.1])
colors = ["r"] + ["b"] * len(chain_jaccard_scores) + ["g"]
ax.bar(x_pos, model_scores, alpha=0.5, color=colors)
plt.tight_layout()
plt.show()

요약

이 실험에서는 클래스 간 상관관계를 활용하기 위해 로지스틱 회귀 분류기 체인의 앙상블을 구축하는 Classifier Chain 알고리즘을 보여주었습니다. 각 체인의 Jaccard 유사도 점수는 독립적인 로지스틱 모델 집합의 점수보다 일반적으로 높았습니다. 마지막으로, 체인의 이진 예측을 평균하여 투표 앙상블을 구성하고 0.5 의 임계값을 적용했습니다. 앙상블의 Jaccard 유사도 점수는 독립 모델의 점수보다 높았으며, 앙상블 내 각 체인의 점수를 초과하는 경향이 있었습니다.