在sksvm中学习如何绘制边界?

2024-06-11 15:05:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从训练集读取电子邮件数据,并创建训练矩阵、训练标签和测试标签。现在我如何在python中使用matplot显示决策边界。我使用的是sklearn的支持向量机。有通过iris预先给定数据集的在线示例。但在自定义数据上绘图失败。这是我的密码

错误:

Traceback (most recent call last):
  File "classifier-plot.py", line 115, in <module>
    Z = Z.reshape(xx.shape)
ValueError: cannot reshape array of size 260 into shape (150,1750)

代码:

^{pr2}$

Tags: 数据绘图示例iris电子邮件矩阵标签sklearn
1条回答
网友
1楼 · 发布于 2024-06-11 15:05:31

在您所关注的tutorial中,Z是通过将分类器应用于生成的一组特征向量来计算的,这些特征向量生成了一个规则的NxM网格。这使情节变得流畅。在

当你换了

Z = svc.predict(np.c_[xx.ravel(), yy.ravel()])

^{pr2}$

您用数据集上的预测替换了这个常规网格。下一行失败,错误是因为它无法将大小为len(files)的数组重塑为NxM矩阵。没有理由len(files) = NxM。在

你不能直接跟随教程是有原因的。你的数据维是3000,所以你的决策边界是3000维空间中的2999维超平面。这不容易想象。在

在本教程中,尺寸为4,为便于可视化,尺寸减小为2。 减少数据维度的最佳方法取决于数据。在本教程中,我们只选取四维向量的前两个分量。在

另一个在很多情况下都很有效的选择是使用主成分分析来减少数据的维数。在

from sklearn.decomposition import PCA
pca = PCA(n_components = 2)
pca.fit(features_matrix, labels)
reduced_matrix = pca.fit_transform(features_matrix, labels)
model.fit(reduced_matrix, labels)

该模型可用于二维可视化。您可以直接按照教程进行操作并定义

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])

一个完整但并不令人印象深刻的例子

我们无法访问您的电子邮件数据,因此我们可以使用随机数据作为说明。在

from sklearn import svm
from sklearn.decomposition import PCA

# initialize algorithms and data with random
model = svm.SVC(gamma=0.001,C=100.0)
pca = PCA(n_components = 2)
rng = np.random.RandomState(0)
U = rng.rand(200, 2000)
v = (rng.rand(200)*2).astype('int')
pca.fit(U,v)
U2 = pca.fit_transform(U,v)
model.fit(U2,v)

# generate grid for plotting
h = 0.2
x_min, x_max = U2[:,0].min() - 1, U2[:, 0].max() + 1
y_min, y_max = U2[:,1].min() - 1, U2[:, 1].max() + 1
xx, yy = np.meshgrid(
    np.arange(x_min, x_max, h),
    np.arange(y_min, y_max, h))

# create decision boundary plot
Z = s.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
contourf(xx,yy,Z,cmap=plt.cm.coolwarm, alpha=0.8)
scatter(U2[:,0],U2[:,1],c=v)
show()

会产生一个看起来不太令人印象深刻的决策边界。在

decision boundary obtain by reducing 2000 dimensions to 2

实际上,前两个主要组件只捕获了数据中包含的大约1%的信息

>>> print(pca.explained_variance_ratio_) 
[ 0.00841935  0.00831764]

如果现在你引入一点点小心掩饰的不对称,你已经看到了效果。在

修改数据,以便在为每个特征随机选择的一个坐标处引入偏移

random_shifts = (rng.rand(2000)*200).astype('int')
for i in range(MM):
    if v[i] == 1:
        U[i,random_shifts[i]] += 5.0

应用PCA你会得到更多的信息。在

decision boundary obtain by reducing 2000 dimensions to 2 after positive instances were randomly shifted

请注意,这里的前两个主成分已经解释了大约5%的方差,图片的红色部分包含的红点比蓝色的多得多。在

相关问题 更多 >