机器学习_scikit-learn中的SVM

支持向量机(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曲线
ROC曲线越靠近左上角,则准确率越高,训练效果越好。

  • 附录,skicit-learn中SVM各项参数
    skicit-learn中SVM各项参数

猜你喜欢

转载自blog.csdn.net/ljyhust/article/details/75948247