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()
输出:
支持向量机所做的不仅是在此处在两个类之间画一条线,而且还要考虑围绕某个给定宽度的线的区域。这是一个看起来像的例子:
# 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()
导入数据集
这是支持向量机的直觉,它可以优化表示数据集之间垂直距离的线性判别模型。现在,让我们使用我们的训练数据来训练分类器。在训练之前,我们需要将癌症数据集导入为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.])
让我们在图表上看一下它是如何显示的。
这是通过分析所获取的数据和使用matplotlib函数制作最佳超平面的预处理方法而获得的。