支持向量机(Support Vector Machine)是一种建立在统计学VC维和结构风险最小化原则下的监督学习机制,既可用于分类,也可用于回归和异常值检测。
SVM分类的理论基础及Python代码详见我的《小瓜讲机器学习——分类算法(二)支持向量机(SVM)算法原理详解》。
这里只对scikit-learn中的svm分类器做介绍和实践。
sklearn库中的svm包是基于国立台湾大学林智仁(Lin Chih-Jen)教授团队开发的libsvm和linearsvm开源库开发的支持向量机包,里面包含多种支持向量机模型,如下表所示
模型/estimators | 说明 |
---|---|
svm.LinearSVC | 线性支持向量机分类器 |
svm.LinearSVR | 线性支持向量机回归模型 |
svm.NuSVC | 支持向量机分类器 |
svm.NuSVR | 支持向量机回归模型 |
svm.OneClassSVM | 异常值检测 |
svm.SVC | 支持向量机分类器 |
svm.SVR | 支持向量机回归模型 |
svm.l1_min_c |
支持向量机SVC是一种多分类器,帮助可查sklearn.svm.SVC,格式如下
sklearn.svm.SVC(C=1.0, kernel=’rbf’, degree=3, gamma=’auto_deprecated’, coef0=0.0, shrinking=True,
probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False,
max_iter=-1, decision_function_shape=’ovr’, random_state=None)
参数说明:
属性:
支持向量机NuSVC是一种多分类器,帮助可查sklearn.svm.NuSVC,格式如下
sklearn.svm.SVC(nu=0.5, kernel=’rbf’, degree=3, gamma=’auto_deprecated’, coef0=0.0, shrinking=True,
probability=False, tol=0.001, cache_size=200, class_weight=None, verbose=False,
max_iter=-1, decision_function_shape=’ovr’, random_state=None)
参数说明:与SVC不同的点是将惩罚系数C换了nu,其他都一样。
属性说明:属性与SVC前六点一样,第7和8两项NuSVC没有。
支持向量机LinearSVC是一种多分类器,帮助可查sklearn.svm.LinearSVC,格式如下
sklearn.svm.LinearSVC(penalty=’l2’, loss=’squared_hinge’, dual=True, tol=0.0001, C=1.0, multi_class=’ovr’,
fit_intercept=True, intercept_scaling=1, class_weight=None, verbose=0,
random_state=None, max_iter=1000)
参数说明:
属性说明:
训练样本为
4.45925637575900 8.22541838354701 -1
0.0432761720122110 6.30740040001402 -1
6.99716180262699 9.31339338579386 -1
4.75483224215432 9.26037784240288 -1
...
4.15244831176753 1.44597290703838 1
9.55986996363196 1.13832040773527 1
1.63276516895206 0.446783742774178 1
9.38532498107474 0.913169554364942 1
训练过程如下
import numpy as np
import pandas as pd
from sklearn.svm import SVC
import matplotlib.pyplot as plt
def dataplot(data, label):
data1 = data[label.label==-1]
data2 = data[label.label==1]
plt.scatter(data1.x, data1.y, c='red')
plt.scatter(data2.x, data2.y, c='blue')
#plt.show()
if __name__=='__main__':
with open(r'h:\python dataanalysis\sklearn\svm_train_data.txt') as f:
data = []
label = []
for loopi in f.readlines():
line = loopi.strip().split('\t')
data.append([float(line[0]),float(line[1])])
label.append(float(line[2]))
feature_x = np.array(data)
label_y = np.array(label)
datax = pd.DataFrame(data, columns=['x','y'])
labely = pd.DataFrame(label, columns=['label'])
clf = SVC(C=0.5,kernel='linear')
clf.fit(feature_x, label_y)
print('----support vector indice----')
print(clf.support_)
print('------ support vector ------')
print(clf.support_vectors_)
print('------- coef of feacture -------')
print(clf.coef_)
print('--------- intercept_ -------')
print(clf.intercept_)
print('--------- n_support_ -------')
print(clf.n_support_)
x = np.array([0, 10])
y = -1/clf.coef_[0,1] * (clf.coef_[0,0] * x + clf.intercept_)
dataplot(datax, labely)
plt.plot(x,y)
plt.show()
可以得到训练的线性支持向量机模型
----support vector indice----
[ 46 62 127 139]
------ support vector ------
[[4.14342744 5.21158368]
[5.47187479 6.52268275]
[9.41511021 8.19137839]
[1.29475743 0.24866204]]
------- coef of feacture -------
[[ 0.89370539 -0.91378603]]
--------- intercept_ -------
[0.07033913]
--------- n_support_ -------
[2 2]