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函数分析获取的数据和预处理方法来制作最佳超平面而获得的。