支持向量机(SVM)是一种可用于分类和回归的有效监督学习方法,是一种基于最大间隔的分类器。对于 SVM 的理解需要很多数学理论知识,尤其是对于拉格朗日对偶求解的理解。由于水平有限,文章并未用python实现SVM算法,而是用Scikit-learn中的libsvm来简单介绍下支持向量机的用法。
最大间隔的直观理解
对于一组数据集,我们希望用超平面很好的将其分类,以下以2D数据集举例,如下图所示。那么在2D数据集中的分类超平面即是线
很明显该数据集有多个解,可以有多条直线将数据集分类,但是什么才是最优解呢?这就是寻找最大间隔的意义。最优解通常要保证是稳定、可靠的决策界,下图中的“黑线”即是最优解,其中两条蓝线就是支持向量机。
多条直线“解”
数学模型表示
1.分类标签
2.假设一个超平面将数据集很好的分离,超平面的方程为
3.由以上两个条件可将支持向量机求解转化
由几何知识可知最两平行线的间隔为
由拉格朗日数乘子及对偶可将上式转化为求解
原始问题
优化问题
先求极小,对
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各项参数