支持向量机(SVM)是一种可用于分类和回归的有效监督学习方法,是一种基于最大间隔的分类器。对于 SVM 的理解需要很多数学理论知识,尤其是对于拉格朗日对偶求解的理解。由于水平有限,文章并未用python实现SVM算法,而是用Scikit-learn中的libsvm来简单介绍下支持向量机的用法。
对于一组数据集,我们希望用超平面很好的将其分类,以下以2D数据集举例,如下图所示。那么在2D数据集中的分类超平面即是线
很明显该数据集有多个解,可以有多条直线将数据集分类,但是什么才是最优解呢?这就是寻找最大间隔的意义。最优解通常要保证是稳定、可靠的决策界,下图中的“黑线”即是最优解,其中两条蓝线就是支持向量机。 多条直线“解”
1.分类标签 yi 定义为+1和-1,方便表示和运算 2.假设一个超平面将数据集很好的分离,超平面的方程为 f(x)=wTx+b=0 ,那么在超平面的一侧的数据集 f(x)>=0 st. yi=1 而另一侧 f(x)<=0 st. yi=−1 , 而支持向量机为 f(x)=wTx+b=±1 3.由以上两个条件可将支持向量机求解转化 yif(x)>=1 求最优解
由几何知识可知最两平行线的间隔为 1||w|| ,求最大间隔则可转化为:
{min(12||w||2)yi(wTx+b)−1≥0由拉格朗日数乘子及对偶可将上式转化为求解
L(w,b,ξ,α,μ)=12||w||2−∑ni=1α(yi(wTx+b)−1)
原始问题
优化问题
先求极小,对 w 、 b 求偏导,令其=0,再求极大值,此处省略过程,直接写推导后的结果:
结果
Fitting 3 folds for each of 9 candidates, totalling 27 fits 最佳效果 : 0.867 最优参数集: clf__C, 0.3 clf__gamma, 0.1 结果报告: precision recall f1-score support 0.0 0.92 0.92 0.92 12 1.0 0.92 0.92 0.92 13 avg / total 0.92 0.92 0.92 25
ROC曲线
from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt false_postive_rate, recall, thresholds = roc_curve(y_test, predictions, pos_label=1) roc_auc = auc(false_postive_rate, recall) print(roc_auc) plt.title('Recevier Operating Characteristic') plt.plot(false_postive_rate, recall, 'b', label='AUC = %.2f' % roc_auc) plt.legend(loc='lower right') plt.plot([0, 1], [0, 1], 'r--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.0]) plt.xlabel('Fall-out') plt.ylabel('Recall') plt.show()ROC曲线越靠近左上角,则准确率越高,训练效果越好。
附录,skicit-learn中SVM各项参数