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

📅  最后修改于: 2021-04-17 01:41:00             🧑  作者: Mango

SVM简介:
在机器学习中,支持向量机(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() 

输出:
22

支持向量机所做的不仅是在此处在两个类之间画一条线,而且还要考虑围绕某个给定宽度的线的区域。这是一个看起来像的例子:

# 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()

33

导入数据集

这是支持向量机的直觉,它可以优化表示数据集之间垂直距离的线性判别模型。现在,让我们使用我们的训练数据来训练分类器。在训练之前,我们需要将癌症数据集导入为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.])

让我们在图表上看一下它是如何显示的。

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