计划
学习时长:7/13——7/14
任务标题:了解sklearn包中svm算法的使用
任务简介:阅读sklearn-user guide 1.4.1
任务详解:
了解sklearn包中的SVM算法是如何使用的,请大家认真看完1.4.1的内容,重点关注两部分内容:第一,怎么使用【SVC】这个api,第二,这个api中的参数是什么意思。其中在最末端有一个案例的链接,大家可选择看,不作为任务要求。同学们,对这部分学习的深入程度,依据个人代码能力而定。
资料链接:https://scikit-learn.org/dev/modules/svm.html
内容:参照链接给的代码或者下图代码,实际动手敲一遍,使用sklearn的SVM接口实现鸢尾花分类,将运行结果截图。
https://scikit-learn.org/dev/auto_examples/svm/plot_iris_svc.html#sphx-glr-auto-examples-svm-plot-iris-svc-py
学习
支持向量机(SVM)是一组用于分类, 回归和异常值检测的监督学习方法。
支持向量机的优点是:
- 在高维空间有效。
- 在尺寸数量大于样本数量的情况下仍然有效。
- 在决策函数中使用训练点的子集(称为支持向量),因此它也具有内存效率。
- 多功能:可以为决策功能指定不同的内核功能。提供了通用内核,但也可以指定自定义内核。
支持向量机的缺点包括:
- 如果要素的数量远远大于样本数量,请避免在选择内核函数时过度拟合,并且正则化项是至关重要的。
- SVM不直接提供概率估计,这些是使用昂贵的五重交叉验证计算的。
scikit-learn中的支持向量机支持密集(numpy.ndarray可转换为by by numpy.asarray)和稀疏(任意scipy.sparse)样本向量作为输入。但是,要使用SVM对稀疏数据进行预测,它必须适合此类数据。为获得最佳性能,请使用C-ordered numpy.ndarray(密集)或 scipy.sparse.csr_matrix(稀疏)dtype=float64。
分类
SVC,NuSVC并且LinearSVC是能够对数据集执行多类分类的类。
回归
支持向量分类的方法可以扩展到解决回归问题。此方法称为支持向量回归。
由支持向量分类(如上所述)产生的模型仅取决于训练数据的子集,因为用于构建模型的成本函数不关心超出边界的训练点。类似地,由支持向量回归产生的模型仅取决于训练数据的子集,因为用于构建模型的成本函数忽略了接近模型预测的任何训练数据。
有支持向量回归的三种不同的实现方式: SVR,NuSVR和LinearSVR。LinearSVR 提供了比实际更快的实现,SVR但只考虑了线性内核,同时NuSVR实现了与SVR和稍微不同的公式LinearSVR。
实际使用技巧
- 避免数据复制:对SVC,SVR,NuSVC和 NuSVR,如果通过一定的方法将数据不是C有序连续的,而双精度,它会调用底层的C实现之前复制。您可以通过检查其flags属性来检查给定的numpy数组是否为C-contiguous 。
对于LinearSVC(和LogisticRegression)任何作为numpy数组传递的输入将被复制并转换为liblinear内部稀疏数据表示(双精度浮点数和非零组件的int32索引)。如果你想要一个大规模的线性分类器,而不是复制一个密集的n-cy连续双精度数组作为输入,我们建议使用SGDClassifier该类。目标函数可以配置为与LinearSVC 模型几乎相同。 - 内核缓存大小:对SVC,SVR,NuSVC和 NuSVR,内核缓存的大小有较大的问题,在运行时间有很大的影响。如果有足够的RAM可用,建议设置cache_size为高于默认值200(MB)的值,例如500(MB)或1000(MB)。
- 设置为C:C是1在默认情况下,这是一个合理的默认选择。如果你有很多嘈杂的观察,你应该减少它。它对应于更多地规范估计。
LinearSVC并且当它变大时LinearSVR不太敏感C,并且在一定阈值之后预测结果停止改善。同时,较大的C值将需要更多的时间来训练,有时长达10倍,如Fan等人所示。(2008年) - 支持向量机算法不是规模不变的,因此强烈建议您扩展数据。例如,将输入向量X上的每个属性缩放为[0,1]或[-1,+ 1],或将其标准化为均值0和方差1.请注意,必须将相同的缩放应用于测试向量获得有意义的结果 有关缩放和规范化的更多详细信息,请参阅 预处理数据一节。
- 参数nu在NuSVC/ OneClassSVM/ NuSVR 近似于训练误差和支持向量的分数。
- 在SVC,如果用于分类的数据是不平衡的(例如,许多正数且很少负数),则设置class_weight='balanced’和/或尝试不同的惩罚参数C。
- 底层实现随机性:的底层实现SVC和NuSVC使用一个随机数发生器仅洗牌为概率估计的数据(当 probability被设置为True)。可以使用random_state参数控制该随机性。如果probability设置为False 这些估算器不是随机的并且random_state对结果没有影响。底层OneClassSVM实现类似于SVC和NuSVC。由于没有提供概率估计OneClassSVM,因此它不是随机的。
底层LinearSVC实现使用随机数生成器在使用双坐标下降(即,dual设置为True)时拟合模型时选择要素。因此,对于相同的输入数据具有略微不同的结果并不罕见。如果发生这种情况,请尝试使用较小的tol参数。这种随机性也可以用random_state参数控制。何时dual设置为False底层实现LinearSVC不是随机的,random_state对结果没有影响。 - 使用由提供的L1惩罚产生稀疏解,即,仅特征权重的子集不为零并且对决策函数有贡献。增加产量是一个更复杂的模型(选择更多功能)。在其产生一个“空”模型(所有重量等于零)值可以使用下式计算。LinearSVC(loss=‘l2’, penalty=‘l1’, dual=False)CCl1_min_c
内核函数
实验
print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm, datasets
def make_meshgrid(x, y, h=.02):
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, **param):
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
out = ax.contourf(xx, yy, Z, **param)
return out
iris = datasets.load_iris()
x = iris.data[:, :2]
y = iris.target
c = 1.0
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)
titles = ('SVC with linear kernel',
'LinearSVC (linear kernel)',
'SVC with RBF kernel',
'SVC with polynomial (degree 3) kernel'
)
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()