目录
前言
笔者现在正在考研复试准备中,所以有快速学完西瓜书来应对面试的需求(具体来说是一个星期),这里分享以下我认为很重要也很基础的内容,整理成笔记的形式,分享给同样有此方面需求的同志。
特别注意:学习这本书需要有线性代数和概率论以及凸优化的基础,如果你想深入学习但是没有相关方面的知识是几乎不可能的。但是本文所有内容尽量不涉及特别专业和高深的内容(因为笔者也不会bushi)。而且是面试的原因,本文不会涉及到过多数学公式(如非解释必要)
最后,此文以笔记的形式记录,笔者水平也非常低,肯定有很多错误,切记!希望你可以每天开心!
重要概念速查
- 属性/特征:反应一个东西的表现/性质的指标,如“西瓜的色泽”
- 特征向量:用于描述事物的,通过不同特征的不同取值所张成的多维空间,其中的一个点(样本)对应一个向量,就是特征向量。比如,西瓜的“色泽”“根蒂”“敲声”的不同取值构成了一个三维空间,其中有一个样本是{“乌黑”,“蜷缩”,“沉闷”},就构成了一个特征向量。
- 训练集:可以通过算法的学习得到模型,学习/训练所使用的数据集合即训练集。
- 泛化能力:指模型运用在未知数据上的任务完成能力,提高泛化能力正是模型的最终目标,即让模型“好用”。
- 验证集/测试集:模型验证集可以通过验证集继续学习,其意义在于减小泛化误差,但是测试集只是为了测试泛化性能/误差,在测试的过程中不发生学习。
- 有监督/无监督:关键在于是否提前知道训练集的结果(即标记),比如提前知道了训练集中的每个西瓜是否是好瓜,那么这个学习就是有监督的,反之无监督。
- 回归/分类:关键在于我们想要模型预测(注意这个词的含义)的是连续值还是离散值,如果是连续值,那么我们使用的模型就是回归模型,若是离散值就是分类模型。
- 聚类:无监督学习的典型,即在没有标记的前提下,让数据“自发地”聚集成一些集合(即簇),请特别注意“自发”这个词,表明我们的模型提前并不知道聚类的结果是什么,而是我们通过结果才能知道模型的潜在概念划分,这一点非常重要。
- 归纳偏好:为了完成一个任务,可以选择的模型往往有很多种,这就需要基于某种“偏好”进行选择,比如著名的“剃刀原理”:在泛化性能相等的前提下,选择更简单的模型。
- 过拟合/欠拟合:学习器对训练集的学习过于完全,导致对训练集的某些误差/非一般特征过于敏感,从而使泛化误差过大。反之,学习不够完全会导致欠拟合。
- 属性的序(order):即属性取值有一种隐含的排序关系,让我们可以量化成连续值。比如“老年”比“青年”大(请注意大这个字表明一种排序关系),我们就可以量化成{20,60}。
- 激活函数(activation function):可以简单理解为线性函数外面再套一个非线性函数的这个非线性函数,比如 y = g( wx + b ) 的g()。
模型评估与选择
一、评估方法(测试集的生成方法)
-
留出法:直接从训练集划出一部分作为测试
-
k折交叉验证法:将训练集划分为k个互斥子集,进行k次训练,每次把一个集合作为测试集,其余作为训练集,每次测试集不同。这样就得到了k个测试结果,然后取均值。
-
Bootstrap自助法:对于给定训练集,每次随机有放回的采样,得到一个数据量相等的采样集作为新的训练集,而原训练集作为测试集。这样做的目的在于,使得到的测试集的数据量和训练集相等的同时,包含了一些训练集没有的特征向量(因为是有放回的)。
二、性能度量方法(评价泛化性能)
- 均方误差:通常用在回归中,即
(D为训练集,(xi,yi)为样本,f为模型)
- 错误率/精度:
常用在二分类。 二者为相反的概念,但是衡量的是一个东西,即模型的正确率。
- 差全率、查准率、F1度量:
用在二分类,比错误率更能体现模型的性能度量
首先要理解混淆矩阵:
预测结果 | 预测结果 | |
---|---|---|
真实情况 | 正例 | 反例 |
正例 | TP(真正例) | FN(假反例) |
反例 | FP(假正例) | TN(真反例) |
查全率:P = TP / ( TP + FP ) 即预测的正例中有多少是正确的
· 查准率:R = TP / ( TP + FN ) 即真实的正例中有多少预测了出来
F1度量: 即将P、R综合平衡起来度量性能,这种思想反应到图像上就是模型的P-R曲线。
在实际模型的评估中,往往每个错误的代价是不一样的。所以以混淆矩阵的基础,在每个错误前乘上代价的权重(cost),再累加起来综合度量性能,就是代价敏感错误率。
下面我们进入各类模型了,加油!
K均值算法(k-means)
我们先从最简单的算法开始吧!在完成聚类任务时,我们先要回答一个问题:聚类的标准是什么?是什么衡量了一个类聚到了一起?时聚类的性能度量,也就是——距离,但不是传统意义上的距离。在不同任务中,我们会选择不同的距离去衡量,这里介绍经典的民可夫斯基距离:
(xi,xj即两个特征向量,u为每个维度的属性,p是我们自己偏好选择的正整数值)
k均值算法以贪心策略为核心,每一次迭代中,以均值向量为依据,到每个均值向量最近的向量就划分成一个类别。而在划分完成后,每个类别中的所有向量取均值,就得到新的均值向量,不断迭代直到收敛。
线性回归(linear reg)
基本形式: , 简写成向量形式(这对于理解很重要,因为可以避免过多参数的混乱,让我们专注于形式):
优化目标:均方误差,即 也叫最小二乘估计。
优化方法:把目标看成w,b的函数,对w,b求偏导,令其等于0,得到最优解
优化结果:,
对数几率回归(logistic reg)
使用线性模型加上激活函数的形式进行二分类任务,优点是:解释性强(模型简洁),分类阈值灵活(激活函数的选择多),计算效率高(模型数学性质好)。
基本形式:, 其中
我们先看里面的线性部分,里面的每个参数其实是权重,表示每个特征x对于预测的贡献;而整个 z 表示总的预测“得分”,即成为“1”/“正类”的倾向性;而sigmod函数只作为转换器的作用(而不参与预测),把得分投影到0-1区间。
优化目标:找到使模型准确率最高的w,b
优化方法:通过极大似然估计把目标转化为以w,b为变量的极大似然函数的最优化,然后利用凸优化的知识找到最优解(如拉格朗日乘子法、牛顿法等)。
线性判别分析(LDA)
请特别注意与后文的主成分分析的区别:是否有监督。
基本思想:想要处理高维特征向量的二分类任务,就把他们投影到一条直线上,是得同类点尽量相近,异类点尽量远离,因此我们定义了两个东西去衡量两者的远离程度,即“类内散度矩阵”和“类间散度矩阵”
。
优化目标:把“类内散度矩阵”和“类间散度矩阵”相除,找到最大的值,即符合我们最初的思想。即 ,也叫“广义瑞利商”。
优化方法:考虑到w,也就是我们想找的投影直线,我们只想知道它的方向,而截距项我们并不关心,所以不妨令J分母为1,这样就得到了一个拉格朗日条件,再利用凸优化的拉格朗日等式优化的知识求出最优解。
决策树(decision tree)
决策树方法在完成多分类任务时非常常用,其思想也非常好理解,即把每个当前的父集合中,我们找到一个划分的最优属性,以此为依据把父集合划分成若干个子集合,并把这些子集合再作为父集合不断迭代下去,直到达到我们想要的划分结果。但是怎么找到当前的“最优属性”呢?以下有不同的方法:
- ID3决策树:使用“信息增益”作为指标,把划分后信息增益最高的划分属性作为当前的最优属性。缺点是偏好取值数目多(即子集合多)的属性。而信息增益是通过子、父集合“信息熵”的差值计算得来的,信息熵这个指标也非常好理解,即属性的混乱程度,哪个划分属性把当前集合的混乱程度下降的最快,我们就用哪个(这其实包含了一种贪心策略)。
- C4.5决策树:在ID3算法的基础上,使用“信息增益率”作为指标,用来中和对取值数目多的属性的偏好。这也非常好理解,我们只需要把信息增益在除以一个以取值数目为自变量的“固定值”,就相当于消去了取值数目对判断的影响。
- CART决策树:使用“基尼系数”作为指标。基尼系数其实就是集合里面随机两个样本是不同标记的概率的累加,所以基尼系数越小,样本标记不同的总概率越低,纯度就越高。所以在每一步划分中,哪个属性把基尼系数下降的最快,我们就把它作为当前最优属性。
如前文所说,我们建立模型中往往需要处理过拟合的问题,在决策树算法中,就是“剪枝处理”,其思想就是把一些不必要的“枝条”减去,而不降低泛化性能,有预剪枝和后剪枝两种方式,即在模型生成过程中和生成完成后进行剪枝处理。
神经网络(neural network)
这是本文最重要也是最难的一部分,加油!顾名思义,我们希望通过生物神经传导的形式构建、训练一个个神经元组成的网络模型,来完成分类和回归的任务。其中神经元介绍最经典的M-P神经元:
(素材来源于网络)
这里请特别注意“激活函数”的含义,模拟了生物神经元对刺激的反映,在刺激达到阈值之后通过一个非线性函数将信息输出为下一个神经元的输入信息,并不断这样传导下去,构成了一个网络,这样没有返回传导的网络叫做“前馈神经网络”。总体来说,一个神经网络包含输入层,隐藏层,输出层三个部分。
优化目标:每个神经元的权重w,阈值θ
优化方法:误差逆传播算法(BP算法)是最经典也是最成功的算法。即将输出层的误差,利用函数的链式法则,一步一步返回到前一个神经元的参数微调中(也就是模型的“学习”),再利用“学习率”去限制每一次微调的调整程度(非常重要,即我们不希望模型学习的过快,也不希望过慢),直到整个网络收敛,或者误差达到我们满意。
我们显然能发现,神经网络的参数可以非常多,比前文介绍的算法都多得多,换句话说,神经网络所遇到的过拟合问题也非常严重。这里介绍几个策略来对砍过拟合问题:
- 早停:当迭代过程中,训练集误差下降而验证集误差上升时,就立刻停止。
- 正则化:也可以理解为罚函数,代价函数,即在误差优化项后面加上一个描述网络复杂度的部分来控制整体的优化目标,使得网络不要太复杂(这里有一个很精妙的点,我们其实希望参数w越小越好,甚至小到0就最好了,所以正则化项往往会带上w的平方项,可以理解下这个思想)
凸优化的知识告诉我们,网络有可能会收敛到局部最小而不是全局最优,这不是我们想看到的,为了应对这种情况,我们也有几种策略:
- 多个初始点进行下降,取最优
- 退火算法:在每次迭代中,都有不同的概率去接受上一次更差的结果
- 随机梯度下降:每次迭代在计算下降的方向时加入随机因素
贝叶斯分类(Bayes)
在分类问题中,统计学给出了一种思想:我们把分类结果看成一个可能值,通过训练的结果得出一个统计学上“最可能”的分类。而基于这种思想,统计学两种学派给出了两种方法:极大似然估计方法和贝叶斯方法:
- 极大似然估计:假设参数虽然目前不知道,但是是固定值,可以通过最优化似然函数的方法,来得到参数的最优估计。
- 贝叶斯分类:假设参数在我们进行估计之前已经有了一些认识(即服从一个先验分布),我们再通过训练去修正这个分布,得到后验分布。而基于后验分布,再给出每个分类的“错误分类”的损失,我们就可以求出总损失的期望,让这个期望最小的估计分类就是贝叶斯最优分类。
另外,贝叶斯计算后验概率时,需要计算总体的联合概率,这在训练集比较难做到,所以为了解决这个问题,朴素贝叶斯分类加上了一个“属性条件独立性”的假设,即解释属性没有相关性,这样就比较容易计算。
主成分分析(PCA)
在理解主成分分析之前,我们先要理解维数的概念。在模型学习的过程中,我们往往需要要求特征向量之间靠的比较近,即特征空间密度比较高,这便于我们进行参数微调,但是对于高维向量的现实学习过程中,我们往往做不到这一点,因为需要的样本量太大了,以至于我们计算机的性能完全跟不上。所以为了解决这个问题,很直接的思路就是把空间的维数降下来,而同时尽量不损失样本的信息。而其中一种重要方法就是PCA。
PCA的思想也很简单,就是在正交属性空间中,找到一个超平面,把所有向量投影到这个超平面上,但是我们不希望向量损失太多信息,这就需要保证:
- 最近重构性:每个向量到这个平面都够近
- 最大可分性:每个投影都尽量分开
实际上,这两点的优化目的都是一个数学式,再利用凸优化的知识求解。
另外,请特别注意PCA和LDA的区别,LDA的目的是为了分类,PCA的目的是为了降维。
总结
机器学习的知识并不是简单掌握才行,而是不断熟练的过程。希望我们学习,一起进步,共勉!