导语:前天,手欠误删了基于 Github Pages + Hexo 搭建的个人技术博客,已经花费了2小时写了篇 SVM 算法总结,没了 T_T ( ´・・)ノ(._.`) 吸取这次的教训,做好数据/文档的备份操作 !!!但是,换个角度想想,这也给我一个再次抛开书本、博客文档(当时的短时记忆加个人理解写成),再次思考什么 SVM,SVM到底说了啥,如何利用scikit-learn 快速构建一个基于 SVM 分类器/模型的机会哦 ~ 我必须谢谢我自己 🤣🤣🤣

Cover Photo by scikit-learn.org

导语:前天,手欠误删了基于 Github Pages + Hexo 搭建的个人技术博客,已经花费了2小时写了篇 SVM 算法总结,没了 T_T ( ´・・)ノ(._.`) 吸取这次的教训,做好数据/文档的备份操作 !!!但是,换个角度想想,这也给我一个再次抛开书本、博客文档(当时的短时记忆加个人理解写成),再次思考什么 SVM,SVM到底说了啥,如何利用scikit-learn 快速构建一个基于 SVM 分类器/模型的机会哦 ~ 我必须谢谢我自己 🤣🤣🤣

一、介绍

众所周知,机器学习我们一般可以分为两大类:一是监督学习或有监督学习(Supervised Learning),另一类是自主学习或无监督学习(Unsupervised Learning)。今天,我想回顾一下或者说温习下上周学习的一种有监督学习算法 SVM。

SVM 是英文 Support Vector Machines 的英文所写,翻译成中文,我们一般称之为支持向量机。利用 SVM 我们可以实现对线性空间场景下(非线性空间下,我们可以利用 kernel tricks 进行改造,后面会详细以及)分类问题,具体举例来说,可以尝试用 SVM 解决下列问题:

  • 垃圾邮件分类
  • 作者预测
  • 个性化推荐 (好友推荐、音乐推荐、商品推荐)

二、核心思想

SVM 核心思想是一个超平面内,找到一条直线,实现对不同类型的点进行分类的目的,且边界距离Margin达到最大值。需要注意的是,现实世界中的问题是复杂多变、多种多样,有时我们在处理分类问题遇到非典型线性分类问题,要么采用其他分类算法,要么对问题进行“改造”,把实际工程应用中具体的非线性问题转换成线性或类线性问题。

所以,在具体工程应用中,我们可能还会见到一些 SVM 的变体模型,这里我在后面如若遇到也会总结、分享 ~

我们想要达到掌握/精通一门语言、技术的程度,不是一朝一夕能够达到的,相反的,我们不如边用边学(遇到需要使用这门技术的时候,开始按需学习、实践、反复)、边学边用(阅读GitHub源代码,是一种非常好的快速学习一门语言/技术的方法)。逆行思维,多想想自己已经 了解/理解/掌握 哪些知识/技术/工具

三、具体实例

  1. 为什么选择 scikit-learn

    scikit-learn 是当下入门机器学习几乎都会用到的机器学习集成包,主要基于Python编写的。文档齐全、社区友好、支持当下几乎所有主流的机器学习算法、框架;上手快,易于实现(个人感觉 scikit-learn 有点类似深度学习中 keras 框架,基本构建模型都已经封装好,“搭积木”的方式你主要调用/组合就好了)。

    ☀ 当然了,我们在享受 scikit-learn 快捷便利强大的同时,也不能过于依赖。防止自己的编程能力 keep your hands dirty,还要关注大公司(BAT,FLAG)发布新的开源包/框架(我自己一直关注微博上 “爱可可-爱生活”的微博号)

  2. 利用 scikit-learn 快速构建一个基于 SVM 的分类器/模型

    下面,我们看下如何使用 scikit-learn 快速搭建起一个基于 SVM 的分类器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #导入sklearn相关算法包,以及自己编写的数据预处理程序
    from sklearn.svm import SVC
    from sklearn.metrics import accuracy_score
    from prep_data import makeTerrainData

    #数据预处理:训练集 + 测试机
    features_train, features_test, labels_train, labels_test = makeTerrianData()

    # 生成实例
    clf = SVC(kernel='linear')

    # 拟合分类器
    clf.fit(features_train, labels_train)

    # 进行预测
    pred = clf.predict(features_test)

    # 准确率
    accuracy = accuracy_score(pred, labels_test)

    看到了吧 o(^@^)o 使用 scikit-learn 构建一个基于 SVM 的分类器就是这么容易,给 scikit-learn 手动点赞吧 👍 b( ̄▽ ̄)d

  3. 调参

    有些人会说调参,占据机器学习的大部分时间,虽然有些夸张,但却也反映出了调参对于机器学习模型好坏、质量的重要性

    • kernel:rbf(default) / linear/ sigmoid … 我们称之为 kernel trick ,非常好用。我们前面提到在分类问题非线性情况是,我们需要转换成类线性或线性问题,这里 kernel 主要起这个作用哈 ~~~ 吼吼吼 💃

    • C:一般来说,C 值越大,拟合程度越高

    • gamma:gamma 参数相比 C 参数对模型的拟合影响程度小很多,但还是存在一定影响的。根据经验值,我们得出,一般gamma

    下面是 Udacity SVM 算法部分的 Mini 小项目,我的运行主要结果

    练习1:作者身份准确率
    no. of Chris training emails: 7936
    no. of Sara training emails: 7884
    accuracy: 0.984072810011

    练习2:对SVM分类器计时
    training time: 321.045 s
    predicting time: 28.493 s

    练习3:降低训练集大小 (100% -> 1%)
    training time: 0.139 s
    training time: 1.551 s
    accuracy: 0.884527872582

    练习4:改变内核(100% -> 1%,linear -> rbf)
    training time: 0.153 s
    training time: 1.783 s
    accuracy: 0.616040955631

    练习5:优化C参数(100% -> 1%,C: 10.0、100.、1000. 和 10000.)
    0.616040955631 -> 0.616040955631 -> 0.821387940842 -> 0.892491467577

    练习6:改变内核(linear -> rbf, C: 10000)
    training time: 158.059 s
    training time: 15.595 s
    accuracy: 0.990898748578

四、SVM 的 pros and cons

Pros:

  • 适合处理线性分类问题
  • robust

Cons:

  • 防止过度拟合问题,上文提及的 C 参数和 gamma 参数需要调整优化
  • 优化问题比较复杂
  • 对噪声敏感

注:这里pros and cons 参考了 Udacity 夏季线下讨论营的 SVM 优缺点总结

五、思考

  1. 我们该怎样学习机器学习(个人见解)

    记得周志华老师在他的“西瓜书”🍉——《机器学习》的前言如何使用本书就明确表示,希望读者,不要指望一下俩下掌握机器学习,建立读者不妨多读几遍该书,每次收获获取都不同;此外,周老师不建议初学者,上来就一头扎进“十大经典算法” 或 “二十大算法”,沉迷于某个算法的数学推导、代码实现等,“只见其木,不见其林”。我个人十分赞同周志华老师的观点。

    1)机器学习好比一大片森林,初来乍到,我们最好观其全貌,概览机器学习主要内容和知识体系;

    2)边学边思考,多实践、多总结。Andrew Ng 说过—— 人人都可以掌握机器学期、深度学习,关键要掌握掌握其的方法,很多人就忽视复现他们实验这个常见但经常被大家忽略的快速学习机器学习/深度学习的高效学习方法。

  2. 我接下来的学习计划和蓝图(仅供参考)

    1. 参加 Kaggle / 天池 数据科学竞赛,实战中学习,学习中实战;
    2. 多写机器学习或数据分析技术、方法等博客,不断回顾学习,深化知识理解,朝着掌握/精通的方向不断努力
    3. 强化编程能力。不过度依赖 scikit-learn 等算法包
    • Be open-minded !
    • Be proactive !

后记

关于我的博文的几点说明:

  • 我的博文主要是个人随笔、技术总结分享、数据科学/机器学习项目踩坑经验以及一些杂七杂八的内容,作为自己的一个小天地 ~
  • 我的博文内容更多强调自己的个人理解和思考,而非知识、技能的提纲,合上书本、各种资料后,写出来的东西才是自己的东西,行文逻辑也将是你自己的思维过程,以及你意识中觉得比较重要的地方。这样相当于“一千个读者,就有一千个哈姆雷特一样”。
  • 技术总结博客很多都是初学札记,难免有疏漏或理解错误的地方,恳请阅者多多包涵,但如果我的一点个人理解或思考能给你带来一点儿启发或进一步思考,我将会十分高兴的,说明我写的博客帮助提升自己的同时,也帮助到了TA人。

砥砺前行,不忘初心 ,一直在路上 ε=ε=ε=( ̄▽ ̄)


机器学习算法之【SVM】
https://github.com/zhililab/2017/10/24/MachineLearning-SupervisedLearning-SVM/
作者
Zhi Li
发布于
2017年10月24日
许可协议