可视化 SVM 结果

机器算法验证 r 机器学习 支持向量机
2022-03-27 13:02:08

我想知道是否有办法在具有超过 3 个特征/维度的 SVM 中可视化分离超平面。通常,分类图可能具有 1,2 和 3 维(参见例如 Noble,Nature Biotechnology 2006。图 1 [1])。当然,我知道 4 维或更多维的可视化即使不是不可能也很难。但是,出于演示目的,如果可以以某种方式可视化分离超平面,那就太好了。除了绘制 ROC 曲线之外,还欢迎使用其他显示结果质量的可视化!

作为示例,我从r获取 Iris 数据,将其缩减为二维。可以绘制得到的拟合并在图中显示(部分复制自[2]的代码)。但是,如果保留了Sepal.LengthSepal.WidthPetal.LengthPetal.Width这四个特征,该怎么做呢?

library(e1071)
iris.part = subset(iris, Species != 'setosa')
iris.part$Species = factor(iris.part$Species)
iris.part = iris.part[, c(1,2,5)]
fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear')
plot(fit, iris.part)

在此处输入图像描述

1个回答

通常采用降维技术来可视化许多变量的拟合。

通常再次使用 SVD 来减少尺寸并保留 2 个组件,并进行可视化。

这是它的样子 - 在此处输入图像描述

请注意,x 和 y 轴是 SVD 分解的前 2 个分量。

我最近没怎么用R,所以我用python来创建上面的图片。

from sklearn.decomposition import TruncatedSVD
from sklearn.svm import SVC
from sklearn.datasets import load_iris

# To visualize the actual data in top 2 dimensions
iris=load_iris()
x,y=iris.data,iris.target

model=SVC().fit(x,y)
predicted=model.predict(x)

svd=TruncatedSVD().fit_transform(x)

from matplotlib import pyplot as plt
plt.figure(figsize=(16,6))
plt.subplot(1,2,0)
plt.title('Actual data, with errors highlighted')
colors=['r','g','b']
for t in [0,1,2]:
    plt.plot(svd[y==t][:,0],svd[y==t][:,1],colors[t]+'+')

errX,errY=svd[predicted!=y],y[predicted!=y]
for t in [0,1,2]:
    plt.plot(errX[errY==t][:,0],errX[errY==t][:,1],colors[t]+'o')


# To visualize the SVM classifier across
import numpy as np
density=15
domain=[np.linspace(min(x[:,i]),max(x[:,i]),num=density*4 if i==2 else density) for i in range(4)]

from itertools import product
allxs=list(product(*domain))
allys=model.predict(allxs)

allxs_svd=TruncatedSVD().fit_transform(allxs)

plt.subplot(1,2,1)
plt.title('Prediction space reduced to top two SVD\'s')
plt.ylim(-3,3)
for t in [0,1,2]:
    plt.scatter(allxs_svd[allys==t][:,0],allxs_svd[allys==t][:,1],color=colors[t],alpha=0.2/density,edgecolor='None')