机器学习基础:从问题、数据到模型
本页目录
欢迎走进机器学习的世界!『不周山之机器学习』系列会结合原理与实践,在弄懂机器学习理论的前提下,把抽象的机器学习理论给用起来。这一讲是系列正文的开端,主要介绍开始学习机器学习的预备知识和相关学习资料,并说明后续实践所需的工具。
更新历史
- 2017.03.18: 更新链接
- 2017.02.15: 标题更新
- 2016.11.25: 完成初稿
任务目标
- 复习机器学习所需的数学基础,即线性代数、概率和统计
- 了解机器学习中的基础概念
- 了解实验工具及其官方安装入口
- 熟悉 SQL 的基本语法,能够处理比较复杂的查询(可选)
- 阅读推荐的书籍和文章(可选)
注:很多概念对于刚入门的同学来说可能难以理解,不要担心,能明白多少是多少,随着课程的深入,回过头来看看就可以明白了。
数学基础
机器学习是一门理论结合实践的学科,甚至可以认为是更加偏重于理论的学科,因为没有对理论的深入了解,可能连现成的机器学习开源工具都学不好。这里列出一些必备基础知识与对应的书籍、课程推荐,方便大家查漏补缺(不会涉及特别艰深的数学)
熟悉机器学习的朋友会发现,线性代数和统计学实际上是机器学习中两种攀登路线的代表。
- 代数方法研究函数和变换,如降维、特征提取、核工程
- 统计方法研究模型和分布,如图模型、熵模型
作为非数学专业科班出身的程序员(比如我),虽然很多时候对于底层的数学理论只有基本的概念,但是了解不同方法背后的核心思想仍然是非常重要的。我建议是先从高层的理论和应用做起,需要深入的时候,再从最底层进行数学的补全,会稍微轻松一些(这句话的意思是涉及到数学的话无论怎么样都不会太轻松)
线性代数
推荐书籍
- Linear Algebra and Its Applications (3rd Ed.) by David C. Lay
- Introduction to Linear Algebra (3rd Ed.) by Gilbert Strang
线性代数在机器学习中最重要的不是矩阵运算和解方程的方法,而是理解矩阵及其背后的基础概念,这些概念会在之后的学习中不断出现,它们是:
- 子空间 Subspace
- 正交 Orthogonality
- 特征值和特征向量 Eigenvalues and Eigenvectors
- 线性变换 Linear transform
概率和统计
- 《普林斯顿微积分读本》
- 《统计学习理论》李航
- A First Course in Probability (9th Ed.) by Sheldon M. Ross
- Probability and Statistics (5th Ed.) by Jay L. Devore
概率和统计最重要的同样是对基本概念的理解,部分内容需要高等数学基础,《普林斯顿微积分读本》是挺好的复习,其他重要的概念有:
- 概率论公理与随机变量
- 离散与连续
- 条件概率与联合分布
- 期望与极限定理
- 抽样、估计与模拟
- 回归与数据分析
机器学习基本概念
监督学习
- 代表算法:KNN, NB, SVM, DT, BP, RF, GBRT(全称在文末列出)
需要带目标值的训练数据,任务可以是分类,也可以是回归。对具有标记的训练样本进行学习,以尽可能对训练样本集外的数据进行分类预测。
举个例子,现在我有两百张猫和狗的图片,每张图片都已经标记好了是猫还是狗,这样机器可以从这两百张图片中『学习』到猫和狗的特征,这样再来一张猫或者狗的图片,机器能够根据之前学习的特征来判断这是猫还是狗。这里我们首先得知道有两种分类(猫、狗),且要分类的图片也必须在这两类之中。
非监督学习
- 代表算法:K-Means、主成分分析(PCA)
数据没有类别信息,也没有目标变量,直接对未标记的样本进行训练学习,来发现我们之前不知道的结构知识。将数据集合分成由类似的对象组成的多个类的过程被称为聚类。
举个例子,我们收集一百篇新闻,把里面的词汇拆开,在同一篇文章里的词汇我们认为关联程度更高,这样把所有的词汇都统计一次,就会发现不同的词汇会根据大家习惯的用法而汇聚成不同的类别,比方说褒义词/贬义词。但这里我们没有事先进行标记(即指定哪个词是褒义),而是根据输入的数据自动聚集而成的类别。
半监督学习
- 代表算法:Graph Inference, Laplacian SVM
简单来说就是一小部分数据有类别信息,一大部分数据没有,我们先利用一小部分有类别信息的数据为一大部分没有类别信息的数据进行分析和预测,然后用所有的数据来进行类别预测。一般用于数据量庞大且没办法完全标注的情况(图像识别)。
强化学习
- 代表算法:Q-Learning, Temporal difference learning
主要用于机器人控制和系统控制领域,智能体与环境交互,并接收奖励反馈,而不仅仅只是一个判断对错的标准。反馈之后,模型会对此进行调整。简单来说,和我们驯化动物的方式类似,做得好就给奖励,做得不好就给惩罚,这样模型就会根据这样的反馈进行调整。
离散数据
分类任务的目标是类别。离散数据还包括计数等数值型数据,并不都属于标称型。举个例子,袋子里有红、白、黑三种颜色的小球,每次摸出来一个,记下每次摸出来的颜色,那么这个数据就是一个离散数据,因为每次只可能是红、白、黑三种之一,不可能是其他的(即有限的目标集)。
连续数据
连续数据(数值型)目标变量主要用于回归分析,通过给定数据点的最优拟合曲线。举个例子,我们收集每天的最高温度数据,这个数据是一个连续数据,因为每天的最高温度的值可能是任何的数值(变化范围取决于精度),通常用实数区间作为模型中的取值范围。
最大似然估计
一种概率论在统计学中的应用,主要用于参数评估。理论介绍可以参考维基-最大似然估计,这里我用一个简单的例子来进行说明。
假如我们拿到了一个骰子,但掷出每一面的概率不一定是相同的,在没有办法得到真实数值的情况下,我们如何进行估计呢,其中一个方法就是多掷几次看看。比方说我们掷了 600 次,其中:
- 点数 1:100 次
- 点数 2:150 次
- 点数 3:150 次
- 点数 4:50 次
- 点数 5:50 次
- 点数 6:100 次
从这样的分布来看,每一面的概率是 2:3:3:1:1:2,或者说,如果这个骰子每一面的概率是 2:3:3:1:1:2,那么更可能会掷出我们刚才的结果,所以就干脆把这个概率当做我们已知的最可能的概率,即最大似然估计。按照这个思路,如果我们要预测下一次可能掷出的点数,那么就更可能是点数 2 或 3。
后验概率
先验概率描述观察本次数据之前的判断,可以来自历史数据或建模假设,并不天然准确。而后验概率是在先验概率的基础上增加了信息之后得到的概率,具体的理论介绍可以参考 Wiki - Posterior probability,这里同样使用一个简单的例子进行说明。
假设操场上有两个班各 50 人上体育课,每个班都有 30 个女生和 20 个男生,所有的男生今天都穿了短裤,而一个班的女生穿了短裤,另一个班的女生穿了长裤。忽然来了一个记者在远处抓拍了一张穿短裤但看不清男女的照片,问照片里的是女生的概率是多少。
那么这个概率,就是我们所说的后验概率了,是在先验概率的基础上(即女生占 60%)增加了穿短裤这个信息后需要计算的概率。那么现在来具体计算一下:
- 设事件 A 是看到女生,那么 ,看到男生的概率是
- 是女生穿短裤的概率,这里是 50%
- 是男生穿短裤的概率,这里是 100%
- 设事件 B 是看到穿短裤的同学,那么 ,看到穿长裤的同学的概率 ,这个 70% 是这么算出来的:,即『女生穿短裤的概率乘以女生的概率』+『男生穿短裤的概率乘以男生的概率』
根据贝叶斯定理,我们可以计算出照片里是女生的概率(即穿短裤的这个人是女生的概率)为
即照片里是女生的概率是 42.86%
判别方法
- 代表算法:KNN, DT, SVM, NN, CRF, LDA(线性判别分析), LR, Boosting
由数据直接学习决策函数 或条件概率分布 作为预测的模型。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。寻找不同类别之间的最优分类面,反映的是异类数据之间的差异。
判别方法直接围绕预测任务建模,不必同时描述输入的分布;但解释性、隐变量处理和所需数据量都取决于具体模型,不能一概而论。
生成方法
- 代表算法:NB, GDA, HMM, BN, GMM, LDA(潜在狄利克雷分配)
先来复习一下条件概率的公式:
所谓生成模型,意思是我们不是直接得到公式左边的部分,而是通过求出公式右边分子分母的两项来得到后验概率 并用它来进行分类。
生成模型描述联合分布,可以通过条件化得到分类规则;只有条件概率 时,通常无法唯一恢复联合分布。模型是否可解释、能否增量学习,需要看具体构造。
线性与非线性分类器
逻辑回归、线性 SVM 和感知机可以产生线性决策边界;决策树、随机森林、多层神经网络和使用非线性核的 SVM 可以表达非线性边界。高维稀疏数据可以先尝试线性模型,但不能只凭特征维度决定算法,仍应比较验证集表现、计算成本和解释需求。
过拟合
如果一味的去提高训练数据的预测能力,所选模型的复杂度往往会很高,这种现象称为过拟合。所表现的就是模型训练时候的误差很小,但在测试的时候误差很大。
产生原因
- 因为参数太多,导致模型复杂度上升,容易过拟合
- 权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征
- 解决方法:交叉验证法、减少特征、正则化、权值衰减、验证数据
泛化能力是指模型对未知数据的预测能力
正则化
实际上是通过为要优化的函数增加一个模型复杂度的项目来权衡训练出来模型本身的结构化经验风险,可以防止训练出来的模型过度复杂,降低过拟合的风险。
比方说现在训练出两个模型,一个模型的准确率是 75%,一个是 85%,那么按照原来的选择标准,肯定选 85% 的那个。但是这个 85% 是针对训练数据得出来的模型,可能这个模型只对这些数据有用(也就是过拟合,而这些数据可能不具有很高的代表性),那么在实际使用的过程中,可以表现得比 75% 的那个还要糟糕。但是加入正则化之后,可能原先 75% 的模型会更加优秀,在一定程度上可以降低过拟合的概率。
正所谓奥卡姆剃刀原理所说的那样:能够很好的解释已知数据并且十分简单才是最好的模型。
常见的正则项有:
- L1:,常用于产生稀疏解。
- L2:,是二范数的平方,通常使权重缩小,但不保证每个权重都接近零。
其中 控制惩罚强度,应使用验证数据选择。L2 可与高斯先验联系起来,L1 则可与拉普拉斯先验联系起来。正则化不保证泛化一定变好,惩罚过强也会欠拟合;L1 在零点不可导,不能笼统地说正则项都让目标更光滑。
凸函数
很多机器学习的问题到最后都会变成一类数学问题,而且是一类特定的数学问题,就是凸函数的优化问题。为什么呢?因为对于凸函数,我们已经拥有有效求解出全局最优值的方法,也就是我们常说的凸优化。不过在介绍凸优化之前,我们先了解一些前置基础概念:
凸集
一个集合 C 是凸集,当且仅当 且 时,都有
在二维空间举例的话就是,C 是这样一个集合,集合中任意两点所组成的线段,也在集合 C 中,那么 C 是一个凸集(大家可以自己画画图感受一下)。
凸函数
有了凸集的定义,我们可以继续了解凸函数了。一个凸函数 f 其定义域 是凸集,并且对任意 且 都有 (称为 jensen 不等式)
还是用二维空间举例,就是函数曲线上任意两点的割线都在曲线的上方。那么为什么这个性质这么重要呢?我们画一个 U 形,是有一个最低点的,并且任意找两点组成的割线都在曲线的上方,随着我们缩小两点间的距离,我们是能够找到这个最低点的,也就是我们要的全局最优解!
常见的凸函数有
- 指数函数
- 负对数函数
- 开口向上的二次函数
凸函数的判定方法为
- 如果 f 是一阶可导的,且 是递增函数,那么是凸函数
- 如果 f 是一阶可导的,对于任意数据域内的 x,y 满足 ,那么是凸函数
- 如果 f 是二阶可导的,且二阶导数在区间上非负,那么是凸函数
凸函数的进阶——凸优化部分会专门介绍,这里暂时略过
实验工具
旧稿的 Octave、Homebrew 和 Miniconda 安装步骤依赖当时版本,这里改为官方入口:
- scikit-learn 安装说明:在独立环境中安装并核对 Python 版本。
- GNU Octave:需要复现使用 Octave 的课程时再安装。
- 站内实践:Numpy 实例指南、Pandas 实例指南。
试一试
- 把 Octave 和 Scikit-Learn 官方的快速入门指南过一遍,有一个基础的认知
- 记下不太了解的名词,留着以后遇到了重点看
- 回忆一下大数定理和中心极限定理,那些年的高数还记得吗
总结
这节课中我们简单介绍了学习机器学习所需要的数学基础以及机器学习中常见的基本概念,并给出了实验工具的入口。接下来,我们就可以正式进入机器学习的世界了。
附:缩写对照表
- BP - Back Propagation 误差反向传播算法
- BN - Bayes Network 贝叶斯网络
- CRF - Conditional Random Field 条件随机场
- DL - Deep Learning 深度学习
- DT - Decision Tree 决策树
- GBDT/GBRT/MART - Gradient Boosting Decision Tree
- GDA - Gaussian Discriminant Analysis 高斯判别分析
- GMM - Gaussian Mixture Model 高斯混合模型
- KMEANS - K 均值
- KNN - K Nearest Neighbor K 近邻
- LDA 潜在狄利克雷分配 or 线性判别分析
- LR 线性回归 or Logistic Regression
- NB - Naive Bayes 朴素贝叶斯
- NN - Neural Network 神经网络
- RF - Random Forest 随机森林
- SVM - Support Vector Machine 支持向量机
参考链接
相关文章
- 机器学习平台设计:让实验能够交付2026-11-06
- 【机器学习与数据科学之旅】B2 《算法与数据中台》读书笔记2020-12-07
- 【机器学习与数据科学之旅】B1 《深入理解 AutoML 和 AutoDL》读书笔记2020-10-28
- 【机器学习与数据科学之旅】1 Numpy 实例指南2020-06-16