【问题标题】:How to perform multi-class SVM in python如何在python中执行多类SVM
【发布时间】:2020-10-29 12:34:45
【问题描述】:

我能够理解如何编写二进制 SVM,例如简单的 1、-1 标签。但是,我将走出自己的舒适区,尝试执行多类且实际上是多标签 SVM。但是,我在任何地方都找不到如何做到这一点。

我将使用 iris 数据集,它具有三个类。那么如何执行三个标签呢?是简单的 -2, -1 , 1 还是 2, 1 , -1?

例如,我们训练具有两个类和三个类的 SVM 的方式有何不同。我正在尝试从头开始实现这一点,以真正获得一个很好的理解,而不是仅仅使用库来帮助我完成。

如果有人能找到一个很好的例子,或者可能解释这个过程,那就太棒了。感谢您的宝贵时间

【问题讨论】:

  • 我建议研究多类分类的 One vs Rest 和 One vs One 方法。 Python 有一个名为 sklearn 的库,其中包含大量有关此类主题的可靠资源和信息,以及可实现的工具(尽管听起来您将放弃使用后者)。
  • 您可以在“sklearn 多类 svm 函数”stackoverflow.com/questions/49848453/…中找到有用的信息
  • @谢谢大家看看

标签: python svm


【解决方案1】:

我相信sklearn 库在这里会有所帮助。根据 scikit-learn 文档 (https://scikit-learn.org/stable/modules/svm.html),sklearn.svm.SVC 类“能够对数据集执行二进制和多类分类。”

标签实际上可以采用任何整数集,只要它们是不同的(例如 {-1, 1, 2} 和​​ {0, 1, 2} 和​​ {1, 2, 3} 都是有效的)。一般来说,我认为将 {0, 1, 2, ..., N} 用于标签分配是最佳做法。

请看下面的代码示例:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC

N = 1000  # Number of samples

# Create synthetic dataset
X1 = np.random.normal(loc=0, scale=1, size=(N, 2))
Y1 = 0 * np.ones(shape=(1000,))  # LABEL = 0 

X2 = np.random.normal(loc=[-5, 5], scale=1, size=(N, 2))
Y2 = 1 * np.ones(shape=(1000,))  # LABEL = 1

X3 = np.random.normal(loc=[5, -5], scale=1, size=(N, 2))
Y3 = 2 * np.ones(shape=(1000,))  # LABEL = 2

# Create stacked dataset
X = np.vstack((X1, X2, X3))
Y = np.hstack((Y1, Y2, Y3))

# TRAIN SVM LEARNING ALGORITHM
clf = SVC(kernel='linear')
clf = clf.fit(X, Y)

# create decision boundary plot
xx, yy = np.meshgrid(
    np.arange(-10, 10, 0.2),
    np.arange(-10, 10, 0.2))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

# PLOT EVERYTHING
plt.scatter(X1[:,0], X1[:,1], color='r')
plt.scatter(X2[:,0], X2[:,1], color='b')
plt.scatter(X3[:,0], X3[:,1], color='y')
plt.contourf(xx,yy,Z,cmap=plt.cm.coolwarm, alpha=0.8)
plt.title("SVM With Linear Kernel and Three Labels (0, 1, 2)")
plt.show()

希望这会有所帮助!

【讨论】:

  • 谢谢,虽然我想要三个标签。在这里你展示了两个很容易理解的标签,但是三个我不知道代码是如何变化的。
  • @Willdomybest18 很抱歉没有澄清。我在上面编辑了我的答案以反映这一点,但简而言之,我相信任何标签分配都适用于多类 SVM,只要标签分配是唯一的(例如 {-1, 1, 2}, {0, 1, 2} 和 {1, 2, 3} 都适用于三标签 SVM)。
猜你喜欢
  • 2014-03-27
  • 2018-08-22
  • 2015-11-18
  • 2019-12-18
  • 2018-11-18
  • 2016-03-23
  • 2020-03-06
  • 2018-06-29
  • 2015-03-17
相关资源
最近更新 更多