📜  在Python使用支持向量机(SVM)对数据进行分类

📅  最后修改于: 2021-10-21 05:04:28             🧑  作者: Mango

SVM 简介:
在机器学习中,支持向量机(SVM,也支持向量网络)是具有相关学习算法的监督学习模型,用于分析用于分类和回归分析的数据。
支持向量机 (SVM) 是由分离超平面正式定义的判别分类器。换句话说,给定标记的训练数据(监督学习),该算法会输出一个对新示例进行分类的最佳超平面。

什么是支持向量机?

SVM 模型将示例表示为空间中的点,并进行映射,以便将不同类别的示例划分为尽可能宽的明显间隙。
除了执行线性分类之外,SVM 还可以有效地执行非线性分类,将它们的输入隐式映射到高维特征空间。

支持向量机有什么作用?

给定一组训练示例,每个示例都标记为属于两个类别中的一个或另一个,SVM 训练算法构建一个模型,将新示例分配给一个或另一个类别,使其成为非概率二元线性分类器。

在继续之前,让您对本文有基本的了解。在这里,我将讨论一个关于使用机器学习工具(即与Python兼容的 scikit-learn )对癌症 UCI 数据集进行 SVM 分类的示例。
先决条件: Numpy、Pandas、matplot-lib、scikit-learn
让我们有一个支持向量分类的快速示例。首先我们需要创建一个数据集:

# importing scikit learn with make_blobs
from sklearn.datasets.samples_generator import make_blobs
  
# creating datasets X containing n_samples
# Y containing two classes
X, Y = make_blobs(n_samples=500, centers=2,
                  random_state=0, cluster_std=0.40)
import matplotlib.pyplot as plt
# plotting scatters 
plt.scatter(X[:, 0], X[:, 1], c=Y, s=50, cmap='spring');
plt.show() 

输出:
g2

支持向量机所做的不仅是在此处在两个类之间画一条线,而且还要考虑某个给定宽度的线周围的区域。下面是它的外观示例:

# creating line space between -1 to 3.5 
xfit = np.linspace(-1, 3.5)
  
# plotting scatter
plt.scatter(X[:, 0], X[:, 1], c=Y, s=50, cmap='spring')
  
# plot a line between the different sets of data
for m, b, d in [(1, 0.65, 0.33), (0.5, 1.6, 0.55), (-0.2, 2.9, 0.2)]:
    yfit = m * xfit + b
    plt.plot(xfit, yfit, '-k')
    plt.fill_between(xfit, yfit - d, yfit + d, edgecolor='none', 
    color='#AAAAAA', alpha=0.4)
  
plt.xlim(-1, 3.5);
plt.show()

g3

导入数据集

这是支持向量机的直觉,它优化了表示数据集之间垂直距离的线性判别模型。现在让我们使用我们的训练数据训练分类器。在训练之前,我们需要将癌症数据集导入为 csv 文件,我们将从所有特征中训练两个特征。

# importing required libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
  
# reading csv file and extracting class column to y.
x = pd.read_csv("C:\...\cancer.csv")
a = np.array(x)
y  = a[:,30] # classes having 0 and 1
  
# extracting two features
x = np.column_stack((x.malignant,x.benign))
  
# 569 samples and 2 features
x.shape 
  
print (x),(y)
[[  122.8   1001.  ]
 [  132.9   1326.  ]
 [  130.    1203.  ]
 ..., 
 [  108.3    858.1 ]
 [  140.1   1265.  ]
 [   47.92   181.  ]]

array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,
         0.,  0.,  0.,  0.,  0.,  0.,  1.,  1.,  1.,  0.,  0.,  0.,  0.,
         0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,
         0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  1.,  1.,  1.,  1.,
         1.,  0.,  0.,  1.,  0.,  0.,  1.,  1.,  1.,  1.,  0.,  1., ....,
         1.])

拟合支持向量机

现在我们将为这些点拟合支持向量机分类器。虽然似然模型的数学细节很有趣,但我们将在别处阅读这些细节。相反,我们只是将 scikit-learn 算法视为完成上述任务的黑匣子。

# import support vector classifier 
# "Support Vector Classifier"
from sklearn.svm import SVC  
clf = SVC(kernel='linear') 
  
# fitting x samples and y classes 
clf.fit(x, y) 

拟合后,该模型可用于预测新值:

clf.predict([[120, 990]])
  
clf.predict([[85, 550]])
array([ 0.])
array([ 1.])

让我们看看图表是如何显示的。

g1
这是通过使用 matplotlib函数分析获取的数据和预处理方法来制作最佳超平面而获得的。