用于不平衡类别的支持向量机

Machine LearningMachine LearningBeginner
立即练习

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

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

简介

在本实验中,我们将学习如何将支持向量机(SVM)用于不平衡类。我们将首先使用普通的 SVM 找到分隔平面,然后绘制(虚线)带有不平衡类自动校正的分隔超平面。我们将使用 make_blobs 函数创建两个随机点簇。

虚拟机提示

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

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

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/inspection -.-> lab-49283{{"用于不平衡类别的支持向量机"}} sklearn/datasets -.-> lab-49283{{"用于不平衡类别的支持向量机"}} ml/sklearn -.-> lab-49283{{"用于不平衡类别的支持向量机"}} end

导入库

我们将通过导入本实验所需的库来开始:matplotlib.pyplotsvmmake_blobsDecisionBoundaryDisplay

import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
from sklearn.inspection import DecisionBoundaryDisplay

创建数据

我们将使用 make_blobs 函数创建两个随机点簇。我们将创建一个包含 1000 个点的簇和另一个包含 100 个点的簇。簇的中心将分别为 [0.0, 0.0][2.0, 2.0]clusters_std 参数控制簇的标准差。

n_samples_1 = 1000
n_samples_2 = 100
centers = [[0.0, 0.0], [2.0, 2.0]]
clusters_std = [1.5, 0.5]
X, y = make_blobs(
    n_samples=[n_samples_1, n_samples_2],
    centers=centers,
    cluster_std=clusters_std,
    random_state=0,
    shuffle=False,
)

拟合模型

我们将使用 svm 库中的 SVC 函数来拟合模型并获得分隔超平面。我们将使用线性核,并将 C 设置为 1.0。

clf = svm.SVC(kernel="linear", C=1.0)
clf.fit(X, y)

对加权类别拟合模型

我们将使用 svm 库中的 SVC 函数对模型进行拟合并获得分隔超平面。我们将使用线性核,并将 class_weight 设置为 {1: 10}。这将给较小的类别赋予更大的权重。

wclf = svm.SVC(kernel="linear", class_weight={1: 10})
wclf.fit(X, y)

绘制样本

我们将使用 matplotlib.pyplot 中的 scatter 函数来绘制样本。

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors="k")

绘制两个分类器的决策函数

我们将使用 sklearn.inspection 库中的 DecisionBoundaryDisplay 函数来绘制两个分类器的决策函数。我们将把 plot_method 设置为 "contour",普通支持向量机(SVM)的 colors 设置为 "k",加权支持向量机的 colors 设置为 "r"levels 设置为 [0]alpha 设置为 0.5linestyles 设置为 ["-"]。我们还将把 ax 设置为 plt.gca()

ax = plt.gca()
disp = DecisionBoundaryDisplay.from_estimator(
    clf,
    X,
    plot_method="contour",
    colors="k",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

wdisp = DecisionBoundaryDisplay.from_estimator(
    wclf,
    X,
    plot_method="contour",
    colors="r",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

添加图例

我们将使用 matplotlib.pyplot 中的 legend 函数为图表添加图例。我们将分别把标签设置为“未加权”和“加权”。

plt.legend(
    [disp.surface_.collections[0], wdisp.surface_.collections[0]],
    ["non weighted", "weighted"],
    loc="upper right",
)

显示图表

最后,我们将使用 matplotlib.pyplot 中的 show 函数来显示图表。

plt.show()

总结

在本实验中,我们学习了如何将支持向量机(SVM)用于不平衡的类别。我们使用 make_blobs 函数创建了两个随机点簇,并创建了两个 SVM 模型,一个是普通的 SVM,另一个是对不平衡类别进行自动校正的 SVM。我们绘制了样本以及两个分类器的决策函数,并为图表添加了图例。