在机器学习中,数据点的权重可以显著影响模型的训练结果。权重较高的数据点对模型的决策边界有更大的影响。本文通过一个简单的Python示例,展示了如何使用带权重的样本来训练一个分类器,并可视化了权重对决策边界的影响。
首先,导入了必要的库,包括用于数据可视化的matplotlib.pyplot,用于数值计算的numpy,以及用于机器学习的sklearn库。
import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model
接下来,生成了20个随机点,并将它们分为两组,每组10个点。然后,为这些点分配了标签和权重。权重是通过随机生成的数乘以100得到的,并且特意为后10个样本分配了更大的权重。
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
然后,使用numpy的meshgrid函数生成了一个网格,用于绘制决策边界。接着,使用scatter函数绘制了带权重的数据点。
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")
接下来,使用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]], ["no weights", "with weights"], loc="lower left")
ax.set(xticks=(), yticks=())
plt.show()
整个脚本的运行时间非常短,仅为0.079秒。这个示例展示了如何使用Python和sklearn库来处理带权重的样本,并可视化了权重对模型决策边界的影响。
如果对这个话题感兴趣,还可以查看其他相关的示例,例如: