はじめに
この実験では、マルチラベルデータセットでの分類器チェーンの使用例を示します。分類器チェーンアルゴリズムは、マルチラベル分類の問題変換手法の修正版です。この手法は、2 値分類器のチェーンを構築することでクラス間の相関を活用します。各モデルは、チェーン内の前のモデルの予測を特徴として取得します。ここでは、103 個の特徴と 14 個の可能なラベルを持つ 2417 個のデータポイントが含まれる「yeast」データセットを使用します。各データポイントは少なくとも 1 つのラベルを持っています。ベースラインとして、まず 14 個のラベルそれぞれに対してロジスティック回帰分類器を学習させます。これらの分類器の性能を評価するために、ホールドアウトテストセットで予測を行い、各サンプルの Jaccard スコアを計算します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、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 = (
"Independent",
"Chain 1",
"Chain 2",
"Chain 3",
"Chain 4",
"Chain 5",
"Chain 6",
"Chain 7",
"Chain 8",
"Chain 9",
"Chain 10",
"Ensemble",
)
x_pos = np.arange(len(model_names))
fig, ax = plt.subplots(figsize=(7, 4))
ax.grid(True)
ax.set_title("Classifier Chain Ensemble Performance Comparison")
ax.set_xticks(x_pos)
ax.set_xticklabels(model_names, rotation="vertical")
ax.set_ylabel("Jaccard Similarity Score")
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 類似度スコアは、独立したロジスティックモデルの集合のそれよりも大きくなる傾向があります。最後に、チェーンの 2 値予測を平均化することによって分類器チェーンの投票アンサンブルを構築し、0.5 の閾値を適用しました。アンサンブルの Jaccard 類似度スコアは、独立モデルのそれよりも大きく、アンサンブル内の各チェーンのスコアを上回る傾向があります。