[Python] 机器学习库 Scikit-learn之SVM
2015-04-29 15:50
411 查看
0. SVM简介
SVM是最常用的分类器之一,其可以用来做分类,回归以及异常检测。其模型定义和学习如下:
原始问题:
minw,b,ζ12wTw+C∑ni=1ζi\min_ {w, b, \zeta} \frac{1}{2} w^T w + C \sum_{i=1}^{n} \zeta_i
subject to yi(wTϕ(xi)+b)≥1−ζi,\textrm {subject to } y_i (w^T \phi (x_i) + b) \geq 1 - \zeta_i, \\
ζi≥0,i=1,...,n \zeta_i \geq 0, i=1, ..., n
对偶问题:
minα12αTQα−eTα\min_{\alpha} \frac{1}{2} \alpha^T Q \alpha - e^T \alpha
subject to yTα=0y^T \alpha = 0
0≤αi≤C,i=1,...,n 0 \leq \alpha_i \leq C, i=1, ..., n
决策函数:
sgn(∑ni=1yiαiK(xi,x)+ρ)\operatorname{sgn}(\sum_{i=1}^n y_i \alpha_i K(x_i, x) + \rho)
其中 ee 是全为1的向量, C>0C > 0 是上边界, QQ 是 nn ×\times nn 半正定矩阵, Qij≡K(xi,xj)=ϕ(xi)Tϕ(xj)Q_{ij} \equiv K(x_i, x_j) = \phi (x_i)^T \phi (x_j) 是核, 训练数据通过 ϕ\phi被映射到高纬空间中.
svm的优点:
在高纬空间的有效性。在特征维度高于样本维度的情况下,依然有效。
它的决策函数只使用训练数据的一部分,通常把这一部分数据称之为支持向量,所以它是比较节省内存的。
可以提供各种各样的核函数来扩展SVM的功能。
SVM的缺点:
如果特征的维度远大于样本的数目,那么性能将大大的降低。SVM不直接提供概率估计。
1. SVM用来做分类:
SVC, NuSVC,LinearSVC
这三类都能用来做多类分类,SVC 和 NuSVC 类似,但是在一些参数上有所不同,LinearSVC 则是另外一种svm的实现,它是线性核。输入:
SVC, NuSVC 和LinearSVC的输入训练数据:[n_samples, n_features] ,标签数据:[n_samples],标签可以是整数或者是字符串都可以。#训练svm: >>> from sklearn import svm >>> X = [[0, 0], [1, 1]] >>> y = [0, 1] >>> clf = svm.SVC() >>> clf.fit(X, y) ` #测试svm` >>> clf.predict([[2., 2.]
成员变量:
因为svm模型只需要用到训练数据中的一部分,也就是支持向量的部分。support_vectors_:存放模型的支持向量。
support_ :存放模型的支持向量的索引。
n_support: 存放模型每一类的支持向量的数目。
多类分类
原始的svm只能支持二类的分类,而多类分类是通过多次二分类来实现的,具体有两种方式,即一对一和一对多两种方式。SVC 和 NuSVC是采用一对一的方式,如果 n_class 是总的类别的数目,那么共需要训练n_class * (n_class - 1) / 2 个不同的二分类器。
#获取分类器的数目: X = [[0], [1], [2], [3]] Y = [0, 1, 2, 3] clf = svm.SVC() clf.fit(X, Y) dec = clf.decision_function([[1]]) print dec.shape[1]
不同的是, LinearSVC 是采用一对多的方式来进行多分类,具体来说,有 n_class 个类别就训练n_class 个分类器,显然,在了类别数目比较多的情况下,这样更节省空间和时间。
不平衡数据:
SVC实现了不平衡训练数据集上的处理,通过设置class_weight参数来给每个类别设置不同的权重,具体的使用还得看文档。2. SVM用来做回归
SVM分类器可以很自然的被扩展用来做回归,被称之为支持向量回归。SVR跟SVC一样,模型只考虑支持向量的数据,那些原理分界边际的点将被忽视。
跟SVC类似,其也有三个类来显示它,对应的是: SVR, NuSVR , LinearSVR,
>>> from sklearn import svm >>> X = [[0, 0], [2, 2]] >>> y = [0.5, 2.5] >>> clf = svm.SVR() >>> clf.fit(X, y) SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma=0.0, kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verbose=False) >>> clf.predict([[1, 1]]) array([ 1.5])
3. 密度估计,异常检测
类别:OneClassSVM 来实现异常检测,这是一种无监督的方法,它的训练数据只需要XX,而无需YY。4. 复杂度分析
SVM是一个二次规划问题(QP问题),其实重训练数据集合中分离出支持向量的数据点,在基于libsvm的实现中,其复杂度介于: O(nfeatures×n2samples)O(n_{features} \times n_{samples}^2) 和 O(nfeatures×n3samples)O(n_{features} \times n_{samples}^3) 之间。5. 核函数
• 线性核: ⟨x,x′⟩\langle x, x'\rangle.• 多项式核: (γ⟨x,x′⟩+r)d(\gamma \langle x, x'\rangle + r)^d. dd is specified by keyword degree, r by coef0.
• rbf: exp(−γ|x−x′|2)\exp(-\gamma |x-x'|^2). γ\gamma is specified by keyword gamma, must be greater than 0.
• sigmoid (tanh(γ⟨x,x′⟩+r))(\tanh(\gamma \langle x,x'\rangle + r)), where rr is specified by coef0.
linear_svc = svm.SVC(kernel='linear') linear_svc.kernel 'linear' rbf_svc = svm.SVC(kernel='rbf') rbf_svc.kernel 'rbf'
参考文献:Scikit文档
相关文章推荐
- [Python & Machine Learning] 学习笔记之scikit-learn机器学习库
- Python/scikit-learn机器学习库(SVM支持向量机)
- Python/scikit-learn机器学习库(特征选取)
- Python机器学习 scikit-learn机器学习库
- python机器学习 scikit learn svm 中关于svc函数的参数解释
- Python学习笔记——scikitlearn SVM
- Python:scikit-learn机器学习库
- Python scikit-learn 模块的SVM方法介绍
- Python/scikit-learn机器学习库(决策树)
- Python scikit-learn 学习笔记—PCA+SVM人脸识别
- python/scikit-learn机器学习库(回归分析)
- 用Python的scikit-learn实现支持向量机SVM
- [python] 安装numpy+scipy+matlotlib+scikit-learn及问题解决
- Py之scikit-learn:python包之机器学习scikit-learn包安装及使用详细攻略——Jason niu
- Python Machine Learning---scikit-learn
- Python数据挖掘入门与实践(二)——scikit-learn数据的预处理转换器以及流水线
- [python] 使用scikit-learn工具计算文本TF-IDF值
- scikit-learn中的SVM
- [Python][Scikit-learn][学习笔记01]线性回归之波士顿房价实例分析