简介
在本实验中,我们将学习如何将支持向量机(SVM)用于不平衡类。我们将首先使用普通的 SVM 找到分隔平面,然后绘制(虚线)带有不平衡类自动校正的分隔超平面。我们将使用 make_blobs 函数创建两个随机点簇。
虚拟机提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。
导入库
我们将通过导入本实验所需的库来开始:matplotlib.pyplot、svm、make_blobs 和 DecisionBoundaryDisplay。
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.5,linestyles 设置为 ["-"]。我们还将把 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。我们绘制了样本以及两个分类器的决策函数,并为图表添加了图例。