分类器链集成模型

Machine LearningMachine LearningBeginner
立即练习

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

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本实验展示了在多标签数据集上使用分类器链的示例。分类器链算法是对多标签分类问题转换方法的一种改进。该方法通过构建二元分类器链来利用类别之间的相关性。每个模型将链中前序模型的预测结果作为特征。我们将使用 “酵母”(yeast)数据集,该数据集包含2417个数据点,每个数据点有103个特征和14个可能的标签。每个数据点至少有一个标签。作为基线,我们首先为14个标签中的每一个训练一个逻辑回归分类器。为了评估这些分类器的性能,我们在一个留出的测试集上进行预测,并计算每个样本的杰卡德分数。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到 “笔记本”(Notebook)标签页,以访问Jupyter Notebook进行练习。

有时,你可能需要等待几秒钟让Jupyter Notebook完成加载。由于Jupyter Notebook的限制,操作的验证无法自动化。

如果你在学习过程中遇到问题,随时向Labby提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49079{{"分类器链集成模型"}} end

加载酵母数据集

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

绘制杰卡德相似性得分

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("杰卡德相似性得分")
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()

总结

本实验展示了如何使用分类器链算法来构建逻辑回归分类器链的集成模型,以利用类别之间的相关性。每个链的杰卡德相似性得分往往高于独立逻辑模型集的得分。最后,我们通过对链的二元预测求平均值来构建分类器链的投票集成模型,并应用了0.5的阈值。集成模型的杰卡德相似性得分高于独立模型,并且往往超过集成模型中每个链的得分。