查看原文
其他

《跟我一起学机器学习》

空字符 月来客栈 2023-06-18

壬寅季夏,七月念七,述作之喜,照临月来。遥岑(cén)远目,乃知客栈营治之艰;寄怀日下,而操存之心弥笃(mí dǔ)。惟今新书告蒇(chǎn),幸与诸公一闻。

仆尝悲岁月奄忽(yǎn hū),觉桑榆且迫,以为人生遭世无常,当奋笔如戈,挥斥八纮(hóng),以遂无涯之功。是以寒来暑往,笔不停辍(chuò),数稔(rěn)之间,积稿已二百余。时清华有兰台女史赵佳霓者,闻仆有机棙(jī lì)之言,欲以结集刊行,使嘉惠学林,裨(bì)益后学。仆自知愚滞,不敢奉从,而其人勤勤劝勉终不能拂(fú)其情惟谨素履(lǚ),悉心修订,毋使玷(diàn)缺以致遗误学人

语云:“虽小道,必有可观者焉。”仆为是书,亦非惟狂谬(miù)臆说之言,实蕲(qí)志有所存,学有所托,俾(bì)读者翻检其章,足以知机巧所为用也。仆又学识固陋(gù lòu),文笔粗疏,罕能穷言意之精妙,尽造化之奥衍(ào yǎn),然文从字顺,皆平正可观矣。以仆资禀(bǐng),学力恐有不逮(dài),书中疏误亦所不免,特不揣(chuǎi)鄙陋草成此文,以俟(sì)方家教正矣。



各位朋友大家好,欢迎来到月来客栈,我是掌柜空字符。

经过近15个月的等待,《跟我一起学机器学习》一书今天终于上市了!

现在回想起这从零到一的过程可能既是偶然也是必然。这本书的初稿内容只是掌柜在一开始学习机器学习时所做的记录,多年之后一次偶然的机会,清华大学出版社赵佳霓老师找到掌柜说是可以整理出版,于是便有了现在的《跟我一起学机器学习》。当然,其必然之处在于一件持续性的事情终归会有它的落脚点,不是在这里就是在那里,不是以这样的形式就是以那样的形式,如果没有那就是坚持的时间还不够长。

1 为什么会有这本书?

掌柜大约是在2016年开始接触机器学习,也正是在那个时间点附近,掌柜越发地认为“要想学得好,笔记不能少”。于是在这之后,每每学完一个新的知识点掌柜都会选择将它记录下来。慢慢地,不知不觉就记录了近200篇博客。在记录过程中掌柜都会将看到的各种资料以掌柜自己的思维方式从头梳理一遍再形成笔记,而这样做的好处便是能使得这些知识点与自己脑中原本固有的知识结构更好地进行融合。

在2020年4月份,掌柜注册了一个公众号(也就是现在大家看到的月来客栈)用来分享与传播机器学习相关的知识内容,当然从名字可以看出客栈不仅仅是局限于分享技术内容。同时,为了提高这些文章的质量,掌柜以原先的博客记录为蓝本又一次地从头梳理了这些内容,然后陆续在公众号上进行了推送。大约是在同年11月初,掌柜在群里看到有朋友说,如果能将这些文章整理成一个文档就好了,因为在手机上看容易分神。为了满足这些朋友的需要,掌柜又一次对这些内容的组织结构进行了梳理排版与发布,很大程度上也满足了对于初学者的需求。

在2020年12月初,清华大学出版社的赵佳霓老师找到掌柜,希望能将这份笔记整理成书稿进行出版。在与出版社签订合同后掌柜又开始对所有内容进行了第3次的修订与补充。在整个内容的修订过程中,为了达到学术上的严谨以及自己对于内容质量的要求,掌柜又同本书的另外一位作者黄晓辉一起对本书内容结构进行了调整与补充,对文中所出现的每一处知识点做了详细的考证与引用,对于每个算法所涉及到的示例代码也都进行了重新调试。工作之余,在历经近半年的修订后终于形成了现在的《跟我一起学机器学习》一书。

目录

第1章 环境配置

  • 1.1安装Conda
    • 1.1.1 Windows环境
    • 1.1.2 Linux环境
  • 1.2 替换源
  • 1.3 Conda环境管理
    • 1.3.1虚拟环境安装
    • 1.3.2虚拟环境使用
  • 1.4 PyCharm安装与配置
  • 1.5小结

第2章 线性回归

  • 2.1模型的建立与求解
    • 2.1.1理解线性回归模型
    • 2.1.2建立线性回归模型
    • 2.1.3求解线性回归模型
    • 2.1.4 sklearn简介
    • 2.1.5安装sklearn以及其它库
    • 2.1.6线性回归示例代码
    • 2.1.7小结
  • 2.2多变量线性回归
    • 2.2.1理解多变量
    • 2.2.2多变量线性回归建模
    • 2.2.3多变量回归示例代码
  • 2.3多项式回归
    • 2.3.1理解多项式
    • 2.3.2多项式回归建模
    • 2.3.3多项式回归示例代码
    • 2.3.4小结
  • 2.4回归模型评估
    • 2.4.1常见回归评估指标
    • 2.4.2回归指标示例代码
    • 2.4.3小结
  • 2.5梯度下降
    • 2.5.1方向导数与梯度
    • 2.5.2梯度下降算法
    • 2.5.3小结
  • 2.6正态分布
    • 2.6.1一个问题的出现
    • 2.6.2正态分布
  • 2.7目标函数推导
    • 2.7.1目标函数
    • 2.7.2求解梯度
    • 2.7.3矢量化计算
    • 2.7.4从零实现线性回归
    • 2.7.5小结

第3章 逻辑回归

  • 3.1模型的建立与求解
    • 3.1.1理解逻辑回归
    • 3.1.2建立逻辑回归模型
    • 3.1.3求解逻辑回归模型
    • 3.1.4逻辑回归示例代码
    • 3.1.5小结
  • 3.2多变量与多分类
    • 3.2.1多变量逻辑回归
    • 3.2.2多分类逻辑回归
    • 3.2.3多分类示例代码
    • 3.2.4小结
  • 3.3常见的分类评估指标
    • 3.3.1二分类场景
    • 3.3.2二分类指标示例代码
    • 3.3.3多分类场景
    • 3.3.4多分类指标示例代码
    • 3.3.5小结
  • 3.4目标函数推导
    • 3.4.1映射函数
    • 3.4.2概率表示
    • 3.4.3最大似然估计
    • 3.4.4求解梯度
    • 3.4.5从零实现二分类逻辑回归
    • 3.4.6从零实现多分类逻辑回归
    • 3.4.7小结

第4章 模型的改善与泛化

  • 4.1基本概念
  • 4.2特征标准化
    • 4.2.1等高线
    • 4.2.2梯度与等高线
    • 4.2.3标准化方法
    • 4.2.4特征组合与映射
    • 4.2.5小结
  • 4.3过拟合
    • 4.3.1模型拟合
    • 4.3.2过拟合与欠拟合
    • 4.3.3解决欠拟合与过拟合
    • 4.3.4小结
  • 4.4正则化
    • 4.4.1测试集导致糟糕的泛化误差
    • 4.4.2训练集导致糟糕的泛化误差
    • 4.4.3正则化中的参数更新
    • 4.4.4正则化示例代码
    • 4.4.5小结
  • 4.5偏差方差与交叉验证
    • 4.5.1偏差与方差定义
    • 4.5.2模型的偏差与方差
    • 4.5.3超参数选择
    • 4.5.4模型选择
    • 4.5.5小结
  • 4.6实例分析手写体识别
    • 4.6.1数据预处理
    • 4.6.2模型选择
    • 4.6.3模型测试
    • 4.6.4小结

第5章 K近邻

  • 5.1 K近邻思想
  • 5.2 K近邻原理
    • 5.2.1算法原理
    • 5.2.1 K值选择
    • 5.2.3距离度量
  • 5.3 sklearn接口与示例代码
    • 5.3.1 sklearn接口介绍
    • 5.3.2 KNN示例代码
    • 5.2.5小结
  • 5.3
    • 5.4.1构造
    • 5.4.2最近邻树搜索
    • 5.4.3最近邻搜索示例
    • 5.4.4 K近邻树搜索
    • 5.4.5 K近邻搜索示例
    • 5.4.6小结

第6章 朴素贝叶斯

  • 6.1朴素贝叶斯算法
    • 6.1.1概念介绍
    • 6.1.2理解朴素贝叶斯
    • 6.1.3计算示例
    • 6.1.4求解步骤
    • 6.1.5小结
  • 6.2贝叶斯估计
    • 6.2.1平滑处理
    • 6.2.2计算示例
    • 6.2.3小结

第7章 文本特征提取与模型复用

  • 7.1词袋模型
    • 7.1.1理解词袋模型
    • 7.1.2文本分词
    • 7.1.3构造词表
    • 7.1.4文本向量化
    • 7.1.5考虑词频的文本向量化
    • 7.1.6小结
  • 7.2基于贝叶斯算法的垃圾邮件分类
    • 7.2.1载入原始文本
    • 7.2.2制作数据集
    • 7.2.3训练模型
    • 7.2.4复用模型
    • 7.2.5小结
  • 7.3考虑权重的词袋模型
    • 7.3.1理解TF-IDF模型
    • 7.3.2 TF-IDF计算原理
    • 7.3.3 TF-IDF计算示例
    • 7.3.4 TF-IDF示例代码
    • 7.3.5小结
  • 7.4词云图
    • 7.4.1生成词云图
    • 7.4.2自定义样式
    • 7.4.3小结

第8章 决策树与集成学习

  • 8.1决策树的基本思想
    • 8.1.1冠军球队
    • 8.1.2信息的度量
    • 8.1.3小结
    • 8.2决策树的生成之ID3与C4.5
    • 8.2.1基本概念与定义
    • 8.2.2计算示例
    • 8.2.3 ID3生成算法
    • 8.2.4 C4.5生成算法
    • 8.2.5特征划分
    • 8.2.6小结
  • 8.3决策树生成与可视化
    • 8.3.1 ID3算法示例代码
    • 8.3.2决策树可视化
    • 8.3.3小结
  • 8.4决策树剪枝
    • 8.4.1剪枝思想
    • 8.4.2剪枝步骤
    • 8.4.3剪枝示例
    • 8.4.4小结
  • 8.5 CART生成与剪枝算法
    • 8.5.1 CART算法
    • 8.5.2分类树生成算法
    • 8.5.3分类树生成示例
    • 8.5.4分类树剪枝步骤
    • 8.5.5分类树剪枝示例
    • 8.5.6小结
  • 8.6集成学习
    • 8.6.1集成学习思想
    • 8.6.2集成学习种类
    • 8.6.3 Bagging集成学习
    • 8.6.4 Boosting集成学习
    • 8.6.5 Stacking集成学习
    • 8.6.6小结
  • 8.7随机森林
    • 8.7.1随机森林原理
    • 8.7.2随机森林示例代码
    • 8.7.3特征重要性评估
    • 8.7.4小结
  • 8.8泰坦尼克号生还预测
    • 8.8.1读取数据集
    • 8.8.2特征选择
    • 8.8.3缺失值填充
    • 8.8.4特征值转换
    • 8.8.5乘客生还预测
    • 8.8.6小结

第9章 支持向量机

  • 9.1 SVM思想
  • 9.2 SVM原理
    • 9.2.1超平面的表达
    • 9.2.2函数间隔
    • 9.2.3几何间隔
    • 9.2.4最大间隔分类器
    • 9.2.5函数间隔的性质
    • 9.2.6小结
  • 9.3 SVM示例代码与线性不可分
    • 9.3.1线性SVM示例代码
    • 9.3.2从线性不可分谈起
    • 9.3.3将低维特征映射到高维空间
    • 9.3.4 SVM中的核技巧
    • 9.3.5从高维到无穷维
    • 9.3.6常见核函数
    • 9.3.7小结
  • 9.4 SVM中的软间隔
    • 9.4.1软间隔定义
    • 9.4.2最大化软间隔
    • 9.4.3 SVM软间隔示例代码
    • 9.4.4 小结
  • 9.5拉格朗日乘数法
    • 9.5.1条件极值
    • 9.5.2求解条件极值
    • 9.5.3小结
  • 9.6对偶性与KKT条件
    • 9.6.1广义拉格朗日乘数法
    • 9.6.2原始优化问题
    • 9.6.3对偶优化问题
    • 9.6.4 KKT条件
    • 9.6.5计算示例
    • 9.6.6小结
  • 9.7 SVM优化问题
    • 9.7.1构造硬间隔广义拉格朗日函数
    • 9.7.2硬间隔求解计算示例
    • 9.7.3构造软间隔广义拉格朗日函数
    • 9.7.4软间隔中的支持向量
    • 9.7.5小结
  • 9.8 SMO算法
    • 9.8.1坐标上升算法
    • 9.8.2 SMO算法思想
    • 9.8.3 SMO算法原理
    • 9.8.4偏置 求解
    • 9.8.5 SVM算法求解示例
    • 9.8.6小结

第10章 聚类

  • 10.1聚类算法的思想
  • 10.2 k-means聚类算法
    • 10.2.1算法原理
    • 10.2.2 值选取
    • 10.2.3 k-means聚类示例代码
    • 10.2.4小结
  • 10.3  k-means算法求解
    • 10.3.1 k-means算法目标函数
    • 10.3.2求解簇中心矩阵
    • 10.3.3求解簇分配矩阵
    • 10.3.4小结
  • 10.4从零实现k-means聚类算法
    • 10.4.1随机初始化簇中心
    • 10.4.2簇分配矩阵实现
    • 10.4.3簇中心矩阵实现
    • 10.4.4聚类算法实现
    • 10.4.5小结
  • 10.5 k-means++聚类算法
    • 10.5.1算法原理
    • 10.5.2计算示例
    • 10.5.3从零实现 k-means++聚类算法
    • 10.5.4小结
  • 10.6 聚类评估指标
    • 10.6.1聚类纯度
    • 10.6.2兰德系数与F值
    • 10.6.3调整兰德系数
    • 10.6.4 聚类指标示例代码
    • 10.6.5小结
  • 10.7 加权k-means聚类算法
    • 10.7.1引例
    • 10.7.2 加权k-means算法思想
    • 10.7.3 加权k-means算法原理
    • 10.7.4 加权k-means迭代公式
    • 10.7.5从零实现加权k-means聚类算法
    • 10.7.6参数求解
    • 10.7.7小结

当然,本书内容远远不会止步于此,掌柜也会一直在公众号持续加入新的内容,以待后续有机会增加到书本中。

2 如何进行学习?

好的方法事半功倍,差的方法事倍功半。当然,从本质上来讲方法没有好坏之分,只有适合不适合的区别。因此本书中所总结的学习方法也只是掌柜的一家之言,不过这也十分值得学习与借鉴。

如果各位朋友也经常在网上浏览有关人工智能的相关内容,肯定会经常看到有人提出类似 “如何才能入门机器学习?”这样的问题。想想掌柜自己在刚开始接触机器学习的时候又何尝不是这样呢,总觉得自己一直是在门外徘徊,就是不得其中之道。幸运的是经过漫长地摸索后,掌柜终于总结出了一条适合自己的学习路线。同时掌柜也坚信,这也是适合绝大多数初学者的学习路线。

2.1 怎么学?

掌柜第一次学习机器学习时所接触到的资料就是吴恩达老师的机器学习视频,并且相信很多朋友也都或多或少的看过这个视频。总的来说,它的确是一个很好的机器学习入门 材料,内容也非常浅显易懂,并且吴恩达老师讲得也十分详细。但是,学着学着掌柜渐渐地发现这份资料并不是那么的适合自己。局限于当时没有找到更好的学习方法,掌柜也就只有硬着头皮的看完了整个内容。后来,直到拿着李航老师的《统计机器学习》 课本进行第二次学习的时候,掌柜才慢慢的总结出了一条有效的学习路线,总结起来就是一句话:先抓主干,后抓枝节

掌柜认为,学习一个算法就好比遍历一棵大树上的所有枝节,算法越是复杂其对应的枝叶也就越是繁多。一般来说通常有两种方式来遍历这棵大树:“深度优先遍历”和“广度优先遍历”。对于有的人来说可能适合第一种,即从底部的根开始,每到一个枝干就深入遍历下去,然后再回到主干继续遍历第二个枝干,直到遍历结束;而对于有的人来说可能更适合第二种,即从底部的根开始,先沿着主干爬到树顶对树的整体结构有一定的概念,然后再从根部开始像第一种方法一样遍历整棵大树。相比于第一种方法,第二种方法在整个遍历过程中更不容易“迷路”,因为一开始我们就先对树的整体结构有了一定的了解。

因此,对于一个算法的学习,掌柜将它归结成了五个层次(三个阶段):

其中阶段一可以看成是先从大树主干爬上树顶一窥大树全貌的过程,因为对于一个算法来说最基本就是它所对应的思想,而这也是一个算法的灵魂所在。阶段二和阶段三就可以看成是遍历完整个大树后的层次,它是对算法里细枝末节的具体探索。

那为什么会是上面这个排序呢?可以打乱吗?掌柜的回答是:当然可以,只要是适合自己的方法,那就是好方法。不过,对于绝大多数人来说,掌柜认为都应该遵循上面这一学习顺序。不过遗憾的是现在大多读者的学习顺序都是①②④⑤③或者是①②④③⑤。这两种学习顺序的弊端就在于,很多算法在其数学推导过程中是有难度的,当克服不了这个难度时很读者往往就不会接着往下进行,而这一问题在初学者当中尤为突出。相反,掌柜一贯主张的是:先学会怎么用,再探究为什么。学习过程最重要的就是要形成一个良好的正向循环,这样才会有继续学习下去的动力。

2.2 学到什么时候?

对于一个算法到底应该学到什么时候或者什么样的层次同样也是初学者所面临的一个问题。可以想象,如果没有事先将一个算法的学习过程归结为如上三个阶段,此时掌柜还真不知道告诉你应该学到哪种程度。因此掌柜的建议是,对于所有的算法来说阶段一是必须完成的;对于一些相对容易的算法(如线性回归)可以要求自己达到上述三个阶段;而对于那些难度较大的算法(如支持向量机)可以根据自己的定位来选择。同时需要注意的是,对于任何一个算法的学习很少有人能做到学一遍就全懂的境界,所以也不要抱着学一边就结束的想法。

因此,大家在实际的学习过程中,第一次学可以先达到阶段一,然后第二次学再达到阶段二、阶段三等等。因为这样分阶段的学习方式更能够相对容易的使自己获得满足感,获得继续学下去的乐趣。最后,照着以上步骤进行,学习大约3-4个算法后,便算得上是初窥机器学习的门径了。

3 本书特色

从整理笔记伊始,掌柜都尽量选择了以直白的方式来阐述每个算法背后的思想与原理。尽管这看起来可能有点口语化,但却极大的降低了学习的门槛,尤其是对于那些非计算机专业的读者来说。同时,对于一些重要而又难以理解的概念,掌柜都会反复两至三次以不同的口吻来进行阐述。例如掌柜在第 3 章中用了下面这么一段话来阐述为什么我们需要用到最大似然估计:

我们知道,在有监督的机器学习中都是通过给定训练集,即来求得其中的未知参数。换句话说,对于每个给定的样本,我们事先已经知道了其所属类别,即的分布结果我们是知道的。那什么样的参数能够使得一直的这样一个结果(分布)最容易出现呢?也就是说给定什么样的参数能使得当输入个样本时,最能够产生已知类别标签这一结果呢?

尽管这段话读起来可能有些重复啰嗦,但只要各位读者认真体会,一定会受益匪浅。

4 本书源代码

本书的所有源码包括图示代码均可从此仓库中获取,后续新增内容掌柜也会第一时间通过公众号进行推送,如有疑问可直接在Issue中进行提交!

https://github.com/moon-hotel/MachineLearningWithMe

点击文末阅读原文可直接跳转!

5 致谢

首先感谢清华大学出版社赵佳霓编辑的耐心指点与校对,以及推动了本书的出版。其次要感谢的是在本书中掌柜所引用到的文献的作者们,没有你们付出也不会有本书的出版。接着要感谢的是为本书提出宝贵意见的朋友们: Brandy、十、olderwang、XiaomeiMi、Wanlong、fanfan、凌同学吃饱了。最后,还要感谢我的家人在背后默默的支持我。

由于时间仓促,书中难免存在不妥之处,请各位读者见谅,并提宝贵意见。如能再版你们的名字也将出现在致谢当中。

本次内容就到此结束,感谢您的阅读!青山不改,绿水长流,我们月来客栈见

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存