机器学习

xiaoxiao2021-02-28  49

支持向量机(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)10

由拉格朗日数乘子及对偶可将上式转化为求解

L(w,b,ξ,α,μ)=12||w||2ni=1α(yi(wTx+b)1)

原始问题

优化问题

先求极小,对 w b 求偏导,令其=0,再求极大值,此处省略过程,直接写推导后的结果:

scikit-learn中的SVM包

from sklearn.pipeline import Pipeline from sklearn.preprocessing import scale from sklearn.cross_validation import train_test_split from sklearn.svm import SVC from sklearn.grid_search import GridSearchCV from sklearn.metrics import classification_report import numpy as np data=np.loadtxt(fname='mlslpic/logistci_data1.txt', dtype='float', delimiter=',') dataSet=data[:,0:2] classLabel=data[:,2] X = scale(dataSet) y = classLabel X_train, X_test, y_train, y_test = train_test_split(X, y) pipeline = Pipeline([ ('clf', SVC(kernel='rbf')) ]) paramters = { 'clf__gamma' : (0.01, 0.03, 0.1), 'clf__C' : (0.01,0.1, 0.3) } grid_search = GridSearchCV(pipeline, paramters, n_jobs=1, verbose=1, scoring='accuracy', refit=True) grid_search.fit(X_train, y_train) print('最佳效果 : %.3f' % grid_search.best_score_) print('最优参数集:') best_paramters = grid_search.best_estimator_.get_params() for param_name in sorted(paramters.keys()): print('%s, %r' % (param_name, best_paramters[param_name])) predictions = grid_search.predict(X_test) print('结果报告:', classification_report(y_test, predictions))

结果

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各项参数
转载请注明原文地址: https://www.6miu.com/read-600010.html

最新回复(0)