支持向量机平局决胜

Machine LearningMachine LearningBeginner
立即练习

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

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

简介

本实验介绍支持向量机(SVM)的平局决胜及其对决策边界的影响。在支持向量机中,平局决胜是用于在两个或多个类别的距离相等时解决它们之间冲突的机制。当 decision_function_shape='ovr' 时,默认情况下不启用平局决胜,因为其成本较高。因此,本实验说明了 break_ties 参数对多类分类问题和 decision_function_shape='ovr' 的影响。

虚拟机提示

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49312{{"支持向量机平局决胜"}} sklearn/datasets -.-> lab-49312{{"支持向量机平局决胜"}} ml/sklearn -.-> lab-49312{{"支持向量机平局决胜"}} end

导入所需库

在这一步中,我们将导入支持向量机(SVM)和可视化所需的库。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import make_blobs

创建示例数据

在这一步中,我们将使用 scikit-learn 中的 make_blobs 函数创建一个示例数据集。这个数据集包含 3 个类别和 2 个特征。

X, y = make_blobs(random_state=27)

创建启用和平局决胜的支持向量机模型

在这一步中,我们将创建两个支持向量机(SVM)模型——一个禁用平局决胜,另一个启用平局决胜。我们将使用 scikit-learn 中的 SVC 类来创建这些模型。两个模型的 break_ties 参数分别设置为 FalseTrue

for break_ties, title, ax in zip((False, True), titles, sub.flatten()):
    svm = SVC(
        kernel="linear", C=1, break_ties=break_ties, decision_function_shape="ovr"
    ).fit(X, y)

创建决策边界

在这一步中,我们将为两个模型创建决策边界。我们将使用 predict 函数预测示例数据点的类别,并绘制决策边界。

    xs = np.linspace(xlim[0], xlim[1], 1000)
    ys = np.linspace(ylim[0], ylim[1], 1000)
    xx, yy = np.meshgrid(xs, ys)

    pred = svm.predict(np.c_[xx.ravel(), yy.ravel()])

    colors = [plt.cm.Accent(i) for i in [0, 4, 7]]

    points = ax.scatter(X[:, 0], X[:, 1], c=y, cmap="Accent")
    classes = [(0, 1), (0, 2), (1, 2)]
    line = np.linspace(X[:, 1].min() - 5, X[:, 1].max() + 5)
    ax.imshow(
        -pred.reshape(xx.shape),
        cmap="Accent",
        alpha=0.2,
        extent=(xlim[0], xlim[1], ylim[1], ylim[0]),
    )

绘制决策边界

在这一步中,我们将绘制上一步中创建的决策边界。我们将使用支持向量机(SVM)模型的 coef_intercept_ 属性来绘制决策边界。

    for coef, intercept, col in zip(svm.coef_, svm.intercept_, classes):
        line2 = -(line * coef[1] + intercept) / coef[0]
        ax.plot(line2, line, "-", c=colors[col[0]])
        ax.plot(line2, line, "--", c=colors[col[1]])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    ax.set_title(title)
    ax.set_aspect("equal")

显示绘图

在这一步中,我们将显示包含两个模型决策边界的绘图。

plt.show()

总结

本实验展示了支持向量机(SVM)平局决胜对决策边界的影响。我们创建了两个SVM模型——一个禁用平局决胜,另一个启用平局决胜。然后,我们绘制了两个模型的决策边界。在类别出现平局的区域,启用平局决胜的模型的决策边界是非凸的。