机器学习教程 五.SVM(支持向量机)算法理解和应用

这篇博客我本来想花大力气来写的,写到一半时发现有人已经做了充足的工作,而且写的很完美,此处膜一下July的这篇《支持向量机通俗导论(理解SVM的三层境界)》本着不重复造*的思想(其实我写了不一定有他好),我简单介绍SVM和如何在sklearn中运用。

我们现在要学习另一种形式的监督机器学习和分类算法:支持向量机。支持向量机的目标是找到数据间的最佳分割边界。在二维空间中,你可以把它想象成分割数据集的最佳拟合线。在支持向量机中,其实我们是在处理向量空间,因此分离线实际上是一个分离的超平面。最好的分离超平面被定义为包含支持向量之间“最宽”边界的超平面。超平面也可以称为决策边界。最简单的表达方式是通过图片:

机器学习教程 五.SVM(支持向量机)算法理解和应用

我们将从上述数据开始。前一篇博客我们使用了KNN算法对这个数据集进行分类,下面我们将使用svm对其进行分类.我们怎么算出最好的分割超平面呢?好吧,我们可以看这个:

机器学习教程 五.SVM(支持向量机)算法理解和应用

这可能是正确的,但是,我们如何找到它呢?首先你找到了支持向量:

机器学习教程 五.SVM(支持向量机)算法理解和应用

一旦你找到了支持向量,我们可以很容易地找到决策边界,取总宽度:

机器学习教程 五.SVM(支持向量机)算法理解和应用

宽度除以2:

机器学习教程 五.SVM(支持向量机)算法理解和应用

我们就可以得到超平面的位置了:

机器学习教程 五.SVM(支持向量机)算法理解和应用

如果一个点在分离超平面的左边,那么我们说它是一个黑点类。如果它在右边,那么它就是一个红色加号类。 好吧,说了这么多有可能还是比较懵的,没事我后面还会仔细讨论的,现在我们先用sklearn中自带的SVM对一个对面前面的乳腺癌(UCI数据集)做分类:

import numpy as np
from sklearn import preprocessing, cross_validation, neighbors, svm
import pandas as pd

df = pd.read_csv('breast-cancer-wisconsin.data.txt')
df.replace('?',-99999, inplace=True)
df.drop(['id'], 1, inplace=True)

X = np.array(df.drop(['class'], 1))
y = np.array(df['class'])

X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2)

# 注意这里构建分类器是svm.SVC
clf = svm.SVC()

clf.fit(X_train, y_train)
confidence = clf.score(X_test, y_test)
print(confidence)

example_measures = np.array([[4,2,1,1,1,2,3,2,1]])
example_measures = example_measures.reshape(len(example_measures), -1)
prediction = clf.predict(example_measures)
print(prediction)

预测结果为:

机器学习教程 五.SVM(支持向量机)算法理解和应用

貌似比KNN算法分类更精准点,一般来说,支持向量机处理无意义的数据比K近邻算法要好,而且肯定会更好地处理离群值,但是在这个例子中,无意义的数据仍然会误导我们。

最后:

希望大家好好看《支持向量机通俗导论(理解SVM的三层境界)》

希望大家好好看《支持向量机通俗导论(理解SVM的三层境界)》

希望大家好好看《支持向量机通俗导论(理解SVM的三层境界)》

下一篇我们介绍聚类算法。。。