在机器学习中,样本权重是一个重要的概念,它允许模型在训练过程中对某些样本赋予更多的关注。例如,在处理不平衡数据集时,通过增加少数类别样本的权重,可以提高模型对这些样本的识别能力。本文将介绍如何使用Python的scikit-learn库来绘制加权样本的决策函数图,以直观地展示权重对模型决策边界的影响。
首先,需要生成一些样本数据。在这个例子中,将创建20个样本点,其中10个为正类,10个为负类。为了模拟加权样本的效果,将为这些样本分配不同的权重。具体来说,将为后10个样本分配更大的权重,以观察模型在这些样本上的决策边界是否会发生变化。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
# 设置随机种子以保证结果的可重复性
np.random.seed(0)
# 生成样本数据
X = np.r_[np.random.randn(10, 2) + [1, 1], np.random.randn(10, 2)]
y = [1] * 10 + [-1] * 10
# 为样本分配权重
sample_weight = 100 * np.abs(np.random.randn(20))
sample_weight[:10] *= 10
# 绘制加权样本点
xx, yy = np.meshgrid(np.linspace(-4, 5, 500), np.linspace(-4, 5, 500))
fig, ax = plt.subplots()
ax.scatter(X[:, 0], X[:, 1], c=y, s=sample_weight, alpha=0.9, cmap=plt.cm.bone, edgecolor="black")
接下来,将使用scikit-learn库中的SGDClassifier来训练一个线性分类器。SGDClassifier是一种随机梯度下降分类器,它通过迭代地更新模型参数来最小化损失函数。在这个例子中,将分别训练两个模型:一个使用未加权的样本,另一个使用加权的样本。通过比较这两个模型的决策边界,可以观察到权重对模型的影响。
# 训练未加权模型
clf = linear_model.SGDClassifier(alpha=0.01, max_iter=100)
clf.fit(X, y)
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制未加权模型的决策边界
no_weights = ax.contour(xx, yy, Z, levels=[0], linestyles=["solid"])
# 训练加权模型
clf = linear_model.SGDClassifier(alpha=0.01, max_iter=100)
clf.fit(X, y, sample_weight=sample_weight)
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# 绘制加权模型的决策边界
samples_weights = ax.contour(xx, yy, Z, levels=[0], linestyles=["dashed"])
# 添加图例
no_weights_handles, _ = no_weights.legend_elements()
weights_handles, _ = samples_weights.legend_elements()
ax.legend([no_weights_handles[0], weights_handles[0]], ["无权重", "有权重"], loc="lower left")
# 隐藏坐标轴
ax.set(xticks=(), yticks=())
# 显示图形
plt.show()
通过上述代码,成功地绘制了加权样本的决策函数图。从图中可以看出,加权模型的决策边界明显向权重较大的样本点倾斜,这表明权重对模型的决策过程有显著影响。这个例子展示了如何在Python中使用scikit-learn库来处理加权样本,并直观地展示权重对模型决策边界的影响。
需要注意的是,加权样本并不总是能够提高模型的性能。在某些情况下,过度依赖某些样本可能会导致模型过拟合。因此,在实际应用中,需要根据具体问题来决定是否使用加权样本,以及如何合理地设置样本权重。此外,除了SGDClassifier之外,scikit-learn库还提供了许多其他支持加权样本的分类器,如LogisticRegression、RandomForestClassifier等。这些分类器也可以通过设置样本权重来提高模型对不平衡数据集的处理能力。