支持向量机
支持向量机 (Support Vector Machines)是一系列用于分类、回归和异常点检测的监督学习方法。
支持向量机的优点是:
- 在高维数据空间的高效性
- 当维度远大于样本数量时,仍然有效
- 在决策函数中使用训练点的子集
- 通用性:对于决策函数,可以使用不同的核函数。提供了通用的核,但是也可以指定定制化的核
支持向量机的缺点是:
- 如果特征的数量远大于样本的数量时,为避免拟合,在选择核函数和正则项时非常关键
- SVMs没有直接提供概率估计,需使用昂贵的五折交叉验证计算
在scikit-learn中,支持向量机可以使用密集的(numpy.ndarray
和numpy.asarray
)和稀疏的(scipy.sparse
)样本向量作为输入。
分类
SVC
、NuSVC
和LinearSVC
是能够用于执行多类别分类的算法。
# coding: utf-8
# Plot different SVM classifiers in the iris dataset
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
def make_meshgrid(x, y, h=.02):
"""Create a mesh of points to plot in
Parameters
----------
x: data to base x-axis meshgrid on
y: data to base y-axis meshgrid on
h: stepsize for meshgrid, optional
Returns
-------
xx, yy : ndarray
"""
x_min, x_max = x.min() - 1, x.max() + 1
y_min, y_max = y.min() - 1, y.max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
return xx, yy
def plot_contours(ax, clf, xx, yy, **params):
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
out = ax.contourf(xx, yy, Z, **params)
return out
iris = datasets.load_iris()
X = iris.data[:, :2]
y = iris.target
C = 1.0 # SVM regularization parameter
models = (svm.SVC(kernel='linear', C=C),
svm.LinearSVC(C=C, max_iter=10000),
svm.SVC(kernel='rbf', gamma=0.7, C=C),
svm.SVC(kernel='poly', degree=3, gamma='auto', C=C))
models = (clf.fit(X, y) for clf in models)
# title for the plots
titles = ('SVC with linear kernel',
'LinearSVC (linear kernel)',
'SVC with RBF kernel',
'SVC with polynomial (degree 3) kernel')
# Set-up 2x2 grid for plotting.
fig, sub = plt.subplots(2, 2)
plt.subplots_adjust(wspace=0.4, hspace=0.4)
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)
for clf, title, ax in zip(models, titles, sub.flatten()):
plot_contours(ax, clf, xx, yy,
cmap=plt.cm.coolwarm, alpha=0.8)
ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
ax.set_xlim(xx.min(), xx.max())
ax.set_ylim(yy.min(), yy.max())
ax.set_xlabel('Sepal length')
ax.set_ylabel('Sepal width')
ax.set_xticks(())
ax.set_yticks(())
ax.set_title(title)
plt.show()
SVC
和NuSVC
是相同的方法,但是接受略微不同的参数集,且有不同的数学模型。另一方面,LinearSVC
是在线性核下的支持向量分类。注意:LinearSVC
不接受参数kernel
,它同样也没有svc
和NuSVC
的成员,如support_
。
支持向量机的决策函数依赖于训练数据的子集,称作支持向量。这些支持向量可以通过如下成员找到support_vectors_
、support_
和n_support
。
多类别分类
svc
和NuSVC
使用one-against-one
实施多类别分类。如果n_class
表示类别的数量,那么需要构建n_class*(n_class-1)/2
个分类器,且每个分类器在两个类的数据上训练。为了提供与其它分类器相同的接口,decision_function_shape
允许单调地将one-against-one
分类器的结果转化为大小为(n_samples, n_classes)
的决策函数。
LinearSVC
实施one-vs-the-rest
多分类策略,训练n_class
个模型。
# coding: utf-8
from sklearn import svm
X = [[0], [1], [2], [3]]
Y = [0, 1, 2, 3] # 4 classes
clf = svm.SVC(decision