如何在python中学习数据时绘制决策边界?

如何在python中学习数据时绘制决策边界?,python,matplotlib,scikit-learn,svm,svc,Python,Matplotlib,Scikit Learn,Svm,Svc,我正在从训练集中读取电子邮件数据,并创建训练矩阵、训练标签和测试标签。现在,我如何在python中使用matplot显示决策边界。我正在使用sklearn的svm。有通过iris预先给定数据集的在线示例。但在自定义数据上绘图失败。这是我的密码 错误: Traceback (most recent call last): File "classifier-plot.py", line 115, in <module> Z = Z.reshape(xx.shape) Valu

我正在从训练集中读取电子邮件数据,并创建训练矩阵、训练标签和测试标签。现在,我如何在python中使用matplot显示决策边界。我正在使用sklearn的svm。有通过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)
在中,通过将分类器应用于生成的一组特征向量以形成规则的
NxM
网格,可以计算您所遵循的
Z
。这使情节流畅

当你更换

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

您使用数据集上的预测替换了此常规网格。下一行因错误而失败,因为它无法将大小
len(文件)
的数组重塑为
NxM
矩阵。没有理由
len(文件)=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()
将产生一个看起来不太令人印象深刻的决策边界

事实上,前两个主成分只捕获了数据中约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
应用主成分分析,你会得到更多的信息


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

添加了绘图命令和错误回溯。您是否遵循任何教程?如果是,请链接到此处。绘图代码似乎基于scikit学习文档。下面的示例使用尺寸为2的特征向量。您拥有尺寸为3000的特征向量。这个不太合适。你能研究一下这个问题吗
>>> 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