为什么在使用sci-kit的SVM进行多类分类时,区域/决策边界会重叠?

我在使用scikit-learn库中的SVM进行多类分类。我想知道为什么这些区域(决策边界)会重叠(如下面图片所示)?

结果

能否有人解释一下我使用一对一和一对所有方法在区域重叠方面有什么不同?我原本以为一对一方法应该有明确划分的区域且没有重叠,因为它是在最大化与每个其他类别的边距,而一对所有方法可能会有区域重叠,但也许这是不准确的,因为我训练的四个模型中有三个是一对一的,它们显示了重叠区域。

我也考虑过可能是绘图问题,但没有发现任何问题。如果alpha值为1,那么区域就不再重叠,但我认为这是预期的,因为它只是覆盖了它覆盖的其他区域(这是预期的,且不解决问题)。

以下是创建、训练和绘制4个不同SVM模型的函数(使用SVC的3个不同核函数和1个使用LinearSVC)。

def createSVMandPlot(X,y,x_name,y_name):        h = .02  # 网格步长        # 我们创建一个SVM实例并拟合我们的数据。我们不缩放数据,因为我们想要绘制支持向量    # 数据的SVM正则化参数    C = 1.0  # SVM regularization parameter    svc = svm.SVC(kernel='linear', C=C).fit(X, y) #1 vs 1     rbf_svc = svm.SVC(kernel='rbf', gamma='scale', C=C).fit(X, y) #1v1    poly_svc = svm.SVC(kernel='poly', degree=3, gamma='scale',C=C).fit(X, y) #1v1    lin_svc = svm.LinearSVC(C=C).fit(X, y) #1 vs rest        print(str(x_name)+' vs. '+str(y_name))    for i, clf in enumerate((svc, lin_svc, rbf_svc, poly_svc)):                X_pred=clf.predict(X)        X_pred1=np.asarray(X_pred).reshape(len(X_pred),1)        A=confusion_matrix(X_pred1, y)        print(A)        c=0        for r in range(len(X_pred)):            if X_pred[r]==y[r]:                c+=1        print(str(c)+' out of 34 predicted correctly (true positives)')        =============================================================================    with warnings.catch_warnings():                warnings.filterwarnings("ignore")        =============================================================================                x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1        y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1        xx, yy = np.meshgrid(np.arange(x_min, x_max, h),                             np.arange(y_min, y_max, h))                # 绘图的标题        titles = ['SVC w/ linear kernel',                  'LinearSVC (w/ linear kernel)',                  'SVM w/ RBF kernel',                  'SVM w/ poly(degree 3) kernel']                plt.pause(7)        for i, clf in enumerate((svc, lin_svc, rbf_svc, poly_svc)):            # 网格中的点 [x_min, x_max]x[y_min, y_max].            plt.subplot(2, 2, i + 1)            plt.subplots_adjust(wspace=0.4, hspace=0.4)                    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])                    # 将结果放入颜色图中            Z = Z.reshape(xx.shape)            plt.contourf(xx, yy, Z, alpha=.5)                        # 绘制训练点            plt.scatter(X[:, 0], X[:, 1], s=13,c=y)            plt.xlabel(x_name)            plt.ylabel(y_name)            plt.xlim(xx.min(), xx.max())            plt.ylim(yy.min(), yy.max())            plt.xticks(())            plt.yticks(())            plt.title(titles[i])                        plt.show() 

这个结果是一张决策边界/区域重叠的图片。这意味着如果一个点位于特定的二维坐标(x1,y1),它可能被分类为两个或更多的类别,而不是期望的单一类别。能否有人解释一下可能发生了什么?谢谢

编辑:我包含了一张显示决策边界重叠的结果图片。


回答:

在多类SVM中,无法避免区域重叠。从https://arxiv.org/ftp/arxiv/papers/0711/0711.2914.pdf,你可以找到一个相当清晰的解释:

如前所述,SVM分类本质上是一种二元(两类)分类技术,必须进行修改以处理现实世界中的多类任务,例如从卫星图像中提取土地覆盖信息。使其适应的两种常见方法包括一对一(1A1)和一对所有(1AA)技术。1AA方法是最早和最常见的SVM多类方法(Melgani和Bruzzone,2004),涉及将N类数据集分成N个两类情况。如果说卫星图像中感兴趣的类别包括水、植被和建筑区,分类将通过将水与非水区域分类,即(植被和建筑区)或将植被与非植被区域分类,即(水和建筑区)。另一方面,1A1方法涉及为每对类别构建一个机器,结果是N(N-1)/2个机器。当应用于测试点时,每个分类给获胜类别一票,该点被标记为得票最多的类别。此方法可以进一步修改以对投票过程进行加权。从机器学习理论来看,公认的1AA方法相对于1A1方法的劣势是其性能可能因不平衡的训练数据集而受到损害(Gualtieri和Cromp,1998),然而,1A1方法计算上更为密集,因为需要计算更多SVM对的结果。在本文中,比较和评估了这两种技术的性能,以确定它们在从卫星图像中提取土地覆盖信息方面的表现。

因此,你要么有N个分类器,要么有N(N-1)/2个分类器,这些分类器使用所有可用的空间。由于这些分类器(为了此解释的目的)是独立的,决策边界不交叉的唯一方法是具有平行的决策边界,即使这样,区域也会重叠(我觉得这句话可能不够清楚,如果需要更详细的解释,请随时询问)。

如果你想要清晰的非重叠区域,我建议你使用其他处理多类问题更好的算法,如KNN。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注