为什么区域/决策边界与 sci-kit 中使用 SVM 的多类分类重叠?

数据挖掘 机器学习 Python scikit-学习 支持向量机 matplotlib
2022-02-28 22:23:39

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

结果

有人可以解释一下我是在区域重叠方面进行一对一还是一对一之间的区别?我假设一对一会清楚地划定没有重叠的区域,因为它最大限度地提高了与其他类的差距,并且一对一可能有区域重叠,但这可能是不准确的,因为我正在训练的 4 个模型中有 3 个是一对一的,它们显示重叠的区域。

我也考虑过这可能是一个绘图问题,但无法确定任何问题。如果 alpha 为 1,则这些区域不再重叠,但我认为这是意料之中的,因为它只是覆盖了它所覆盖的其他区域(这是意料之中的,并不能解决问题)。

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

def createSVMandPlot(X,y,x_name,y_name):
    h = .02  # step size in the mesh

    # we create an instance of SVM and fit out data. We do not scale our
    # data since we want to plot the support vectors
    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))

        # title for the plots
        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)):
            # point in the mesh [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()])

            # Put the result into a color plot
            Z = Z.reshape(xx.shape)
            plt.contourf(xx, yy, Z, alpha=.5)

            # Plot also the training points
            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() 

其结果是决策边界/区域重叠的图像。这意味着如果一个点位于特定的 2D 坐标 (x1,y1),那么它可以被分类为两个或多个类,而不仅仅是一个不是期望或预期的类。有人可以解释可能发生的事情吗?谢谢

0个回答
没有发现任何回复~