机器学习训练营——机器学习爱好者的自由交流空间(入群联系qq:2279055353)

支持向量机(Support Vector Machines, 简称SVM)是一套有监督学习的方法集,经常用于分类、回归和异常点检测。SVM的优势主要体现在:

  • 在高维空间很有效;

  • 在特征数超过样本数的情况下仍然是有效的;

  • 在决策函数里使用了一个训练点子集,因此存储也是有效的;

  • 在决策函数里可以使用不同的核函数。

SVM的劣势包括:

  • 如果特征数远超样本数,为了避免过度拟合(over-fitting), 核函数和正则项的选择至关重要;

  • SVM不直接提供概率估计,而是使用5倍交叉验证来计算它们。

在scikit-learn里,SVM支持稠密的样本(numpy.ndarray, numpy.asarray)和稀疏的样本(scipy.sparse)作为输入向量。然而,为了使用SVM预测稀疏数据,必须在稀疏数据上作拟合。这样,为了最佳的表现,使用numpy.ndarray模块(稠密样本)、或者scipy.sparse.csr_matrix、参数dtype=float64模块(稀疏样本)。

分类

SVC, NuSVC, LinearSVC能够在一个数据集上作多类别的分类问题。

支持向量分类执行类。请注意,LinearSVC不接受关键词kernel, 因为它被假设是线性的。LinearSVC也没有像support_这样的成员函数。SVC, NuSVC, LinearSVC取两个数组作为输入。一个是大小为[n_samples, n_features]的数组X, 装载训练样本;另一个是大小为[n_samples]的类标签数组y, 类标签为字符串或整数。

from sklearn import svm
X = [[0, 0], [1, 1]]
y = [0, 1]
clf = svm.SVC()
clf.fit(X, y)

拟合后的模型可以用来预测新值。

clf.predict([[2., 2.]])

SVM决策函数依赖于训练数据的子集,这个子集称支持向量。这些支持向量的属性能在成员函数support_vectors_, support_ and n_support里找到。

# get support vectors
clf.support_vectors_

# get indices of support vectors
clf.support_

# get number of support vectors for each class
clf.n_support_

多类别分类

对于多类别的分类问题,类SVC, NuSVC执行一个one-against-one方法。如果参数n_class是类别数,那么创建n_class * (n_class - 1) / 2个分类器,每一个分类器作为两类别分类器训练数据。为了向其它分类器提供一致的接口,decision_function_shape选项允许将“one-against-one”分类器的所有结果汇总给形如(n_samples, n_classes)的决策函数。

X = [[0], [1], [2], [3]]
Y = [0, 1, 2, 3]
clf = svm.SVC(decision_function_shape='ovo')
clf.fit(X, Y)

```{python}
dec = clf.decision_function([[1]])
dec.shape[1] # 4 classes: 4*3/2 = 6

clf.decision_function_shape = "ovr"
dec = clf.decision_function([[1]])
dec.shape[1] # 4 classes

另一方面,LinearSVC执行“one-vs-the-rest”多类别策略,这样训练n_class模型。如果仅有两个类,那么只有一个模型被训练。

lin_clf = svm.LinearSVC()
lin_clf.fit(X, Y)

dec = lin_clf.decision_function([[1]])
dec.shape[1]

注意到LinearSVC也能执行多类策略,通过设置参数multi_class='crammer_singer'.在实际应用中,one-vs-rest分类通常是首选,虽然结果近似,但运行时间要快得多。

对于“one-vs-rest”, LinearSVC属性coef_, intercept_各自有形状[n_class, n_features], [n_class]. 系数的每一行对应很多“one-vs-rest”分类器n_class之一,而常数项相似。

在“one-vs-one” SVC的例子里,属性的表示方式有点复杂。在有一个线性核的情况下,coef_, intercept_与上述的LinearSVC相似,只是coef_的形状是[n_class * (n_class - 1) / 2, n_features], 对应很多二值分类器。类0到n的顺序是“0 vs 1”, “0 vs 2” , … “0 vs n”, “1 vs 2”, “1 vs 3”, “1 vs n”, . . . “n-1 vs n”.

dual_coef_的形状是[n_class-1, n_SV], 这有点难理解。其中的列对应n_class * (n_class - 1) / 2个“one-vs-one”分类器的支持向量。每一个支持向量被用在n_class - 1个分类器里。每一行里的n_class - 1项对应这些分类器的双重系数。举个例子说明:

考虑一个三类的分类问题。类0有3个支持向量 v00,v01,v02v_0^0, v_0^1, v_0^2v00​,v01​,v02​, 类1, 类2各有2个支持向量 v10,v11v_1^0, v_1^1v10​,v11​, v20,v21v_2^0, v_2^1v20​,v21​. 对于每一个支持向量 vijv_i^jvij​, 都有两个双重系数。在分类器里,我们记在类 iii, KKK 之间的支持向量 vijv_i^jvij​ 的系数为 αi,kj\alpha_{i, k}^jαi,kj​, 那么dual_coef_看起来像下面这样:

SVC方法decision_function对每个样本给出属于每个类的分数(per-class scores). 当构造器参数probability的值设置为True时,能够得到类成员的概率估计(来自方法predict_proba, predict_log_proba)。在二值分类的情况下,概率进一步由Platt scaling校正。Platt scaling校正,是在SVM分数上使用logistic回归,经训练集上的交叉验证拟合。对于大数据集,我们知道交叉验证是很费时的,可以用置信分数代替,建议设置probability=False, 使用decision_function代替predict_proba.

不平衡问题

在有的分类问题里,如果想要重视某些特殊的类,或者是样本,可以使用关键词class_weight, sample_weight. SVC在fit方法里执行class_weight, 它是一个{class_label : value}形式的字典,其中的value是一个大于0的浮点数,设置类class_label的参数C为C * value. 分类结果如下图所示:

SVC, NuSVC, SVR, NuSVR and OneClassSVM也在fit方法里通过关键词sample_weight对样本加权。类似class_weight, 它们设置第i个例子的参数C为C * sample_weight[i].

精彩内容,请关注微信公众号:统计学习与大数据

【sklearn第九讲】支持向量机之分类篇相关推荐

  1. sklearn保存svm分类模型_【菜菜的sklearn】07 支持向量机(上)

    小伙伴们大家好~o( ̄▽ ̄)ブ,我是菜菜,这里是我的sklearn课堂第7期,今天分享的内容是支持向量机(上),下周还有下篇哦~ 我的开发环境是Jupyter lab,所用的库和版本大家参考:Pyth ...

  2. 开发工具篇第九讲:菜鸟入坑指南

    摘要:本文是开发工具篇第九讲:菜鸟入坑指南.针对新人上手慢的问题,写了这篇入坑指南,方便自己回顾,总结.本文分为四个部分,分别为jenkins使用技巧:常用软件操作命令:开发手册:调试手册.主要材料来 ...

  3. Stanford机器学习---第九讲. 聚类

    本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学 ...

  4. Stanford机器学习---第八讲. 支持向量机SVM

    本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归.Octave Tutorial.Logistic Regression.Regularization.神经网络.机器学 ...

  5. sklearn中的支持向量机SVM(下)

    1 二分类SVC的进阶 1.1 SVC用于二分类的原理复习 sklearn中的支持向量机SVM(上) 1.2 参数C的理解进阶 有一些数据,可能是线性可分的,但在线性可分状况下训练准确率不能达到100 ...

  6. 基于python的分类预测_机器学习算法(五): 基于支持向量机的分类预测

    声明:本次撰写以Datawhale团队提供的学习材料以自学为主,代码为Datawhale团队提供,利用阿里云天池实验室与编辑器pycharm完成测试. 支持向量机(Support Vector Mac ...

  7. sklearn SVM(支持向量机)模型使用RandomSearchCV获取最优参数及可视化​​​​​​​

    sklearn SVM(支持向量机)模型使用RandomSearchCV获取最优参数及可视化 支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义 ...

  8. C#发现之旅第九讲 ASP.NET验证码技术

    C#发现之旅第九讲 ASP.NET验证码技术 袁永福 2008-5-15 系列课程说明     为了让大家更深入的了解和使用C#,我们将开始这一系列的主题为"C#发现之旅"的技术讲 ...

  9. 内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理

    内核知识第九讲,32位下的分页管理,36位下的分页管理.以及64位下的分页管理 一丶熟悉WinDbg的常见命令. dd 虚拟地址      显示内存. !dd 加上!,        ! dd 物理地 ...

  10. sklearn中的决策树(分类)

    本文在我的知乎上同步更新:sklearn中的决策树(分类) - 知乎 Sklearn库有很多机器学习模型,不同的模型有着不同的特点,针对不同的问题,选取对应的模型,可以很好地解决问题.树模型作为经典的 ...

最新文章

  1. vs2005's addin folder
  2. Qt动画框架Animation Framework
  3. mac下完全卸载程序的方法
  4. Redis多机功能介绍
  5. C# 字符串格式化测试小工具
  6. setCharacterEncoding 是在request.getParameter获取参数之前 设置request的编码格式 一步到位...
  7. time.c 的Java实现(从timestamp计算年月日时分秒等数值)
  8. 如何用计算机解开op手机密码,OPPO手机忘记解锁密码怎么办 OPPO R9忘记解锁密码解锁教程...
  9. 业务中台--如何设计企业级权限管理系统
  10. Unity3D 手机竖屏设置(For Android)
  11. oracle 导入 imp-00008,imp导入文件时报大量的imp-0008错误
  12. 山东大学项目实训审计系统(七)数据可视化
  13. 五年级上册计算机工作总结,五年级上册信息技术教学工作总结
  14. Camera Feature(1)--介绍及常见问题
  15. centos无法识别NTFS格式的U盘解决办法
  16. 简单聊聊VisualStudio的断点调试
  17. 怎么获取apk的包名??
  18. logistics回归模型的原理和实现
  19. 基于springboot的校园闲置图书共享平台
  20. 如何保障邮件内容安全

热门文章

  1. 在ubuntu12.04下编译android4.1.2添加JNI层出现问题
  2. Nginx与Tomcat、Client之间请求的长连接配置不一致问题解决[转]
  3. 方维分享系统修改,本地安装失败,后台无法登陆
  4. 数组玩法(1):下标移位
  5. 对称二叉树(C++)
  6. 游戏开发之C++继承与派生(包含访问控制)(C++基础)
  7. 游戏开发之函数的重载(C++基础)
  8. Security+ 学习笔记8 渗透测试和安全练习
  9. 华为系列设备优先级总结(三)
  10. Leetcode 刷题笔记(十六) —— 二叉树篇之二叉搜索树的属性