我有一个只包含一个特征的数据集,我使用scikit-learn训练了一个支持向量分类器。我想可视化结果,但我对如何绘制散点图有些困惑。我通过以下方式获得了超平面:
slope = clf.coef_[0][0]intercept = clf.intercept_[0]
这给我得到了 y = -0.01x + 2.5
我假设这就是我的超平面。我似乎无法弄清楚如何在只有一个特征的情况下围绕这个超平面绘制我的数据。我应该用什么作为y轴呢?
回答:
这是一个有趣的问题。表面上看它非常简单——一个特征意味着一个维度,因此超平面必须是0维的,即一个点。然而,scikit-learn给你的却是一条线。所以问题实际上是如何将这条线变成一个点。
我花了一个小时左右的时间在scikit-learn的文档中寻找答案,但关于1维SVM分类器的信息几乎没有(可能是因为它们不实用)。所以我决定尝试下面的示例代码,看看我能不能找到答案:
from sklearn import svmn_samples = 100X = np.concatenate([np.random.normal(0,0.1,n_samples), np.random.normal(10,0.1,n_samples)]).reshape(-1,1)y = np.array([0]*n_samples+[1]*n_samples)clf = svm.LinearSVC(max_iter = 10000)clf.fit(X,y) slope = clf.coef_intercept = clf.intercept_print(slope, intercept)print(-intercept/slope)
X
是样本数组,其中前100个点是从N(0,0.1)中抽取的,接下来的100个点是从N(10,0.1)中抽取的。y
是标签数组(100个类别’0’和100个类别’1’)。直观上,很明显超平面应该在0和10之间的一半。
一旦你训练了分类器,你会发现截距大约是-0.96,这与0维超平面(即一个点)应该在的位置相差甚远。然而,如果你取y=0
并反向计算x
,它会非常接近5。现在尝试更改构成X的分布的均值,你会发现答案总是-intercept/slope
。这就是分类器的0维超平面(点)。
所以为了可视化,你只需要在数轴上绘制你的数据(为不同的类别使用不同的颜色),然后绘制通过将负截距除以斜率获得的边界。我不确定如何绘制数轴,但你总可以使用所有y
坐标设置为0的散点图来解决这个问题。