【不周山之数据科学】机器学习基础与环境搭建

欢迎走进机器学习的世界!『不周山之机器学习』系列会结合原理与实践,在弄懂机器学习理论的前提下,把抽象的机器学习理论给用起来。这一讲是系列正文的开端,主要介绍开始学习机器学习的预备知识和相关学习资料,以及搭建好我们用于实践算法的环境。


更新历史

  • 2017.03.18: 更新链接
  • 2017.02.15: 标题更新
  • 2016.11.25: 完成初稿

任务目标

  1. 复习机器学习所需的数学基础,即线性代数、概率和统计
  2. 了解机器学习中的基础概念
  3. 完成实验环境的搭建
  4. 熟悉 SQL 的基本语法,能够处理比较复杂的查询(可选)
  5. 阅读推荐的书籍和文章(可选)

注:很多概念对于刚入门的同学来说可能难以理解,不要担心,能明白多少是多少,随着课程的深入,回过头来看看就可以明白了。

数学基础

机器学习是一门理论结合实践的学科,甚至可以认为是更加偏重于理论的学科,因为没有对理论的深入了解,可能连现成的机器学习开源工具都学不好。这里列出一些必备基础知识与对应的书籍、课程推荐,方便大家查漏补缺(不会涉及特别艰深的数学)

熟悉机器学习的朋友会发现,线性代数和统计学实际上是机器学习中两种攀登路线的代表。

  • 代数方法研究函数和变换,如降维、特征提取、核工程
  • 统计方法研究模型和分布,如图模型、熵模型

作为非数学专业科班出身的程序员(比如我),虽然很多时候对于底层的数学理论只有基本的概念,但是了解不同方法背后的核心思想仍然是非常重要的。我建议是先从高层的理论和应用做起,需要深入的时候,再从最底层进行数学的补全,会稍微轻松一些(这句话的意思是涉及到数学的话无论怎么样都不会太轻松)

线性代数

推荐书籍

  • Linear Algebra and Its Applications (3rd Ed.) by David C. Lay
  • Introduction to Linear Algebra (3rd Ed.) by Gilbert Strang

线性代数在机器学习中最重要的不是矩阵运算和解方程的方法,而是理解矩阵及其背后的基础概念,这些概念会在之后的学习中不断出现,它们是:

  • 子空间 Subsapce
  • 正交 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(全称在文末列出)

需要标注好的数据,必须知道目标变量的分类信息。对具有标记的训练样本进行学习,以尽可能对训练样本集外的数据进行分类预测。

举个例子,现在我有两百张猫和狗的图片,每张图片都已经标记好了是猫还是狗,这样机器可以从这两百张图片中『学习』到猫和狗的特征,这样再来一张猫或者狗的图片,机器能够根据之前学习的特征来判断这是猫还是狗。这里我们首先得知道有两种分类(猫、狗),且要分类的图片也必须在这两类之中。

非监督学习

  • 代表算法:KMEANS, DL(全称在文末列出)

数据没有类别信息,也没有目标变量,直接对未标记的样本进行训练学习,来发现我们之前不知道的结构知识。将数据集合分成由类似的对象组成的多个类的过程被称为聚类

举个例子,我们收集一百篇新闻,把里面的词汇拆开,在同一篇文章里的词汇我们认为关联程度更高,这样把所有的词汇都统计一次,就会发现不同的词汇会根据大家习惯的用法而汇聚成不同的类别,比方说褒义词/贬义词。但这里我们没有事先进行标记(即指定哪个词是褒义),而是根据输入的数据自动聚集而成的类别。

半监督学习

  • 代表算法: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 是看到女生,那么 $P(A)=60\%$,看到男生的概率是 $P(A’)=40\%$
  • $P(B\;| \;A)$ 是女生穿短裤的概率,这里是 50%
  • $P(B\;| \;A’)$ 是男生穿短裤的概率,这里是 100%
  • 设事件 B 是看到穿短裤的同学,那么 $P(B)=70\%$,看到穿长裤的同学的概率 $P(B’)=30\%$,这个 70% 是这么算出来的:$P(B)=P(B\;|\;A)P(A)+P(B\;|\;A’)P(A’)$,即『女生穿短裤的概率乘以女生的概率』+『男生穿短裤的概率乘以男生的概率』

根据贝叶斯定理,我们可以计算出照片里是女生的概率(即穿短裤的这个人是女生的概率)为

$$P(A\;|\;B)= \frac{P(B\;|\;A)P(A)}{P(B)}= \frac{0.5 \times 0.6}{0.7}=0.4286$$

即照片里是女生的概率是 42.86%

判别方法

  • 代表算法:KNN, DT, SVM, NN, CRF, LDA(线性判别分析), LR, Boosting

由数据直接学习决策函数 $Y=f(X)$ 或条件概率分布 $P(Y\;|\; X)$ 作为预测的模型。基本思想是有限样本条件下建立判别函数,不考虑样本的产生模型,直接研究预测模型。寻找不同类别之间的最优分类面,反映的是异类数据之间的差异。

  • 优点
    • 分类边界更灵活,比使用纯概率方法或生产模型得到的更高级
    • 能清晰的分辨出多类或某一类与其他类之间的差异特征
    • 适用于较多类别的识别
    • 可以对数据进行各种程度上的抽象、定义特征并使用特征,简化学习问题
  • 缺点
    • 不能反映训练数据本身的特性
    • 类似于黑盒,变量之间的关系不明确
    • 无法处理包含隐变量的情况

生成方法

  • 代表算法:NB, GDA, HMM, BN, GMM, LDA(潜在狄利克雷分配)

先来复习一下条件概率的公式:

$$P(Y\;|\; X)= \frac{P(X, Y)}{P(X)}$$

所谓生成模型,意思是我们不是直接得到公式左边的部分,而是通过求出公式右边分子分母的两项来得到后验概率 $P(Y\;|\; X)$ 并用它来进行分类。

  • 优点
    • 实际上带的信息要比判别模型丰富,有更强的解释力
    • 研究单类问题比判别模型灵活性强
    • 模型可以通过增量学习得到
    • 能用于数据不完整的情况
    • 可以处理存在隐变量的情况
  • 缺点:
    • 学习和计算过程比较复杂

由生成模型可以得到判别模型,但由判别模型得不到生成模型。

线性分类器

  • 常见线性分类器:LR, 贝叶斯分类,单层感知机,线性回归,SVM(线性核)

模型是参数的线性函数,并且存在线性分类面。SVM 是比较特殊的一类,会根据核函数的不同而有不同。线性分类器速度快、编程方便,但是可能拟合效果不会很好。

  • 如果特征比数据量还大,那么选择线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分
  • 对于维度很高的特征,选择线性分类器,因为维度高的时候,数据一般在维度空间里面会比较稀疏,很有可能线性可分

非线性分类器

  • 常见非线性分类器:DT, RF, GBDT, 多层感知机,SVM(高斯核)

不属于线性分类器的就是非线性分类器,非线性分类器编程复杂,但是效果拟合能力强。

  • 对于维度极低的特征,选择非线性分类器,因为低维空间可能很多特征都跑到一起了,导致线性不可分

过拟合

如果一味的去提高训练数据的预测能力,所选模型的复杂度往往会很高,这种现象称为过拟合。所表现的就是模型训练时候的误差很小,但在测试的时候误差很大。

产生原因

  • 因为参数太多,导致模型复杂度上升,容易过拟合
  • 权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征
  • 解决方法:交叉验证法、减少特征、正则化、权值衰减、验证数据

泛化能力是指模型对未知数据的预测能力

正则化

实际上是通过为要优化的函数增加一个模型复杂度的项目来权衡训练出来模型本身的结构化经验风险,可以防止训练出来的模型过度复杂,降低过拟合的风险。

比方说现在训练出两个模型,一个模型的准确率是 75%,一个是 85%,那么按照原来的选择标准,肯定选 85% 的那个。但是这个 85% 是针对训练数据得出来的模型,可能这个模型只对这些数据有用(也就是过拟合,而这些数据可能不具有很高的代表性),那么在实际使用的过程中,可以表现得比 75% 的那个还要糟糕。但是加入正则化之后,可能原先 75% 的模型会更加优秀,在一定程度上可以降低过拟合的概率。

正所谓奥卡姆剃刀原理所说的那样:能够很好的解释已知数据并且十分简单才是最好的模型

作用是:

  1. 数值上更容易求解;
  2. 特征数目太大时更稳定;
  3. 控制模型的复杂度,光滑性。复杂性越小且越光滑的目标函数泛化能力越强。而加入规则项能使目标函数复杂度减小,且更光滑。
  4. 减小参数空间;参数空间越小,复杂度越低。
  5. 系数越小,模型越简单,而模型越简单则泛化能力越强。
  6. 可以看成是权值的高斯先验。

一般常用的是 L1 和 L2 正则,用来降低模型复杂度:

  • L1 是在损失函数后面加上模型参数的 1 范数(也就是 $|x_i|$ )
  • L2 是在损失函数后面加上模型参数的 2 范数(也就是 $\Sigma(x_i^2)$ ),注意L2范数的定义是 $\sqrt{( \Sigma(x_i^2)}$ ),在正则项上没有添加根号是为了更加容易优化
  • L1 会产生稀疏的特征
  • L2 会产生更多地特征但是都会接近于 0

L1 会趋向于产生少量的特征,而其他的特征都是 0,而 L2 会选择更多的特征,这些特征都会接近于 0。L1 在特征选择时候非常有用,而 L2 就只是一种规则化而已。

凸函数

很多机器学习的问题到最后都会变成一类数学问题,而且是一类特定的数学问题,就是凸函数的优化问题。为什么呢?因为对于凸函数,我们已经拥有有效求解出全局最优值的方法,也就是我们常说的凸优化。不过在介绍凸优化之前,我们先了解一些前置基础概念:

凸集

一个集合 C 是凸集,当前仅当 $\forall x,y \in C$ 且 $0 \le \theta \le 1$ 时,都有 $\theta x+(1-\theta)y \in C$

在二维空间举例的话就是,C 是这样一个集合,集合中任意两点所组成的线段,也在集合 C 中,那么 C 是一个凸集(大家可以自己画画图感受一下)。

凸函数

有了凸集的定义,我们可以继续了解凸函数了。一个凸函数 f 其定义域 $D(f)$是凸集,并且对任意 $x,y \in D(f)$ 且 $0 \le \theta \le 1$ 都有
$f(\theta x+(1-\theta)y)<=\theta f(x)+(1-\theta)f(y)$(称为 jensen 不等式)

还是用二维空间举例,就是函数曲线上任意两点的割线都在曲线的上方。那么为什么这个性质这么重要呢?我们画一个 U 形,是有一个最低点的,并且任意找两点组成的割线都在曲线的上方,随着我们缩小两点间的距离,我们是能够找到这个最低点的,也就是我们要的全局最优解!

常见的凸函数有

  • 指数函数 $f(x)=a^x \; when \;a>1$
  • 负对数函数 $-log_a x \; when \; a>1,x>0$
  • 开口向上的二次函数

凸函数的判定方法为

  1. 如果 f 是一阶可导的,且 $f’(x)$ 是递增函数,那么是凸函数
  2. 如果 f 是一阶可导的,对于任意数据域内的 x,y 满足 $f(y)\ge f(x)+f’(x)(y-x)$,那么是凸函数
  3. 如果 f 是二阶可导的,且在区间上非负,那么是凸函数

凸函数的进阶——凸优化部分会专门介绍,这里暂时略过

实验环境搭建

Octave

Octave 可以看作是开源版的 Matlab,具体的安装教程可以参考 Octave Wiki,这里简单说一下使用 homebrew 进行安装的教程(比较简单的方式)

brew tap homebrew/science
brew update && brew upgrade
brew cask install xquartz
brew install octave

Scikit-Learn

简单粗暴的方式是直接安装 CanopyAnaconda,如果不想一次安装一堆可能一辈子都用不到的包,可以安装 Miniconda,因为我之前用过 Anaconda 觉得太臃肿,所以这里主要介绍 Miniconda 的安装和使用:

  • 下载安装文件,是 .sh 文件
  • 执行 bash Miniconda3-latest-MacOSX-x86_64.sh,跟着步骤走即可
  • 如果使用的是 zsh,那么把 /Users/dawang/miniconda3/bin 添加到 ~/.zshrc 中的 PATH 变量中
  • 输入 conda list 可以查看目前已经安装的包
  • 安装 numpy conda install numpy
  • 安装 scipy conda install scipy
  • 安装 scikit-learn conda install scikit-learn
  • 如果想要了解更多,可以参考这里的 30 分钟入门教程
  • 如果要更新,可以使用 conda update conda
  • 如果想要卸载,先删除整个文件夹 rm -rf ~/miniconda,然后更新 .bash_profile(或其他命令行)的 PATH 变量,最后删除临时文件 rm -rf ~/.condarc ~/.conda ~/.continuum

试一试

  1. 把 Octave 和 Scikit-Learn 官方的快速入门指南过一遍,有一个基础的认知
  2. 记下不太了解的名词,留着以后遇到了重点看
  3. 回忆一下大数定理和中心极限定理,那些年的高数还记得吗

总结

这节课中我们简单介绍了学习机器学习所需要的数学基础以及机器学习中常见的基本概念,最后搭建好了实验环境。接下来,我们就可以正式进入机器学习的世界了。

附:缩写对照表

  • 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 Discriminative 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 支持向量机

参考链接

捧个钱场?