《机器学习实战》主要讲述流行的机器学习技术和其Python实现,内容基础适合初学者,其详细代码实现较有价值,可以让你深入细节理解分类器的运行过程。但某些分类器数学原理上讲述的过少,例如SVM,直接上代码显得难以理解,建议配合其他书籍或课程同步学习。
以下总结为自己复习一遍顺便写下重点。
k-NearestNeighbor
- 计算当前点于训练集全部点的距离,返回前k个点出现频率最高的分类;
- 优点:精度高、对异常值不敏感、无数据输入假定;
- 缺点:计算复杂度高、空间复杂度高;
- 适用数据范围:数值型和标称型;
- kNN对于每个训练样本都必须在全部训练集上计算,没有办法保存训练出来的分类器,但应该存在优化的方法,例如用树存储训练集;
- kNN的另外一个缺点是无法给出任何数据的基础结构信息,无法知晓平均或者典型的样本哟什么样的特征。
Desicion Tree(ID3)
- 构造决策树的核心是如何划分数据集,我们常用信息论中的信息增益的方法(或Gini指数)来确定划分数据集的最好特征。
- 本书采用ID3算法来划分数据集:对每个特征划分数据集的结果计算信息熵,划分是对训练集中该特征的所有取值分别划分出分支;
- 划分一次消耗一个特征,所以可能出现全部特征都消耗完但是类标签任然不唯一的情况,这时候需要以多数表决的形式确定分类标签;
- 构造决策树需采用递归的方式,递归结束的条件是划分完全部属性或者每个分支下所有的实例都具有相同的分类;类别完全相同则停止划分,直接返回类标签,所以树的全部叶子节点都是类标签信息;
- 在Python中可以以dict存储一棵树,dict键值对的形式中前者可以表示父节点,后者可以表示子节点;
- 优点:计算复杂度不高,输出结果直观易于理解,对中间值的缺失不敏感,可以处理不相关特征数据;
- 缺点:可能产生Overfitting;
- 使用数据范围:数值型和标称型;
- 决策树与kNN不同的地方就在于可以将训练好的分类器存储下来,存储决策树可用Python中的pickle序列化对象;
- 决策树还有C4.5和CART算法;通过剪枝,合并节点等可以解决Overfitting的问题。
Naive Bayes
- 贝叶斯的核心就是贝叶斯公式,在需要计算一个条件概率的情况下,我们可以利用公式将条件概率中的条件和结果互换;例如,给定一个vector,需计算在这个vector的情况下分别所属不同类别的概率,互换概率后就变成了在(全体训练数据中)这个类别中该vector出现的概率;
- 朴素贝叶斯的朴素就是做了假设以方便计算:假设全部特征之间相互独立,这样vector相关计算就可以拆成乘积的形式,同时降低了对数据量的要求;但显然,这种假设是错误的,但是大多数问题中NB的表现还是可以的;
- 计算过程中会出现两个问题:1.乘积的0概率问题,可以通过很多方式例如平滑来解决;2.下溢出,很多太小的数相乘,可通过取自然对数来解决;
- 优点:在数据较少的情况下任然有效,可以处理多类别问题;
- 缺点:对于输入数据的装备方式比较敏感;
- 适用数据类型:标称型数据;
Logistic Regression
- 逻辑回归可以用于分类,其主要思想是对分类边界建立回归公式;
- 逻辑回归实际上就是标准的线性回归后加上了一个Sigmoid函数输出结果;Sigmoid函数很像一个阶跃函数,输出0-1之间的值,输入为0时输出为0.5;
- 逻辑回归的优化方式为梯度上升,首先将每个回归系数初始化为1,计算整个数据集的梯度,使用步长
*
梯度的方向更新回归系数,迭代n次; - 实际上本书的代码这样实现:每次迭代中计算error,error为当前分类器输出的结果减去真实标签,更新为回归系数+步长
*
训练数据*
error(均为矩阵运算); - 梯度上升在数据量大的时候计算复杂度太高,故提出随机梯度上升,每次随机选取一个样本来更新系数,同时使步长随着迭代次数不断减小;实际上,我们现在的随机一般是随机抽取一个batch,不仅仅是一个来进行运算;
- 优点:计算代价不高,易于理解和实现;
- 缺点:容易欠拟合,分类精度可能不高;
- 适用数据类型:数值,标称;
- SGA还是一个在线算法,即可以在新数据到来时完成数据更新,不需要重新读取整个数据集。
Support Vector Machine
- SVM的核心就是寻找最胖的分类边界,即找到距离分隔超平面最近的点,确保它们离分割面的距离尽可能的远;支持向量指的就是离分隔超平面最近的那些点;
- 将此优化问题转换成带约束条件的优化问题,引入拉格朗日乘子和松弛变量,可用二次规划来解决;
- 本书描述了不同于二次规划的SMO(序列最小优化)算法来解决上述问题,SMO核心思想是将大优化问题分解为多个小优化问题来求解的;每次循环中选择两个合适的alpha,增大其中一个的同时减小另外一个。这部分是本书中最难理解的部分。
- SVM中还有另外一个重要的工具:核函数;核函数使SVM可以解决非线性分类问题,它将一个特征空间转换到另外一个高维的特征空间,在高维空间中解决线性问题;
- SVM的所有运算都是内积的形式,我们可以把内积运算替换成核函数,不必做任何简化处理,这就是Kernel Trick;
- RBF核函数,又叫高斯,又叫径向基;映射到无穷维的空间,十分常用;
- 优点:繁华错误率低,计算开销不大,结果易解释;
- 缺点:对参数调节和核函数的选择敏感;
- 适用数据类型:数值,标称;
- SVM可以说是监督学习中最好的定式算法;
Adaptive Boosting
- 集成学习方法:可以将不同的分类器组合;可以是不同算法的集成,也可以是同一算法在不同设置下的集成,还可以是数据集的不同部分分配给不同分类器之后的集成;
- bagging方法(自举汇聚法):从原始数据集选择S次后得到S个新数据集,新数据集的大小和原始数据集相等,将某个学习算法分别作用于每个数据集就得到了S个分类器,选择分类器投票结果中最多的类别作为最后的分类结果;还有一些更先进的bagging方法,例如Random Forest;
- boosting方法:使用也是同样的分类器,但是串行训练,即每个新分类器根据已经训练出的分类器性能来训练,关注被已有分类器错分的样本来获取新的分类器;
- bagging中每个分类器权重相等,但是boosting不相等,每个权重代表对应分类器在上一轮迭代中的成功度;
- AdaBoost中有两个权重,第一样本权重向量D,第二每个分类器的权重alpha;训练过程为:首先在训练集上训练一个弱分类器并计算错误率,然后调整样本权重:分对的样本权重降低,错分的样本权重提高,再次在同一数据集上训练弱分类器;同时每次训练结束后基于分类器的错误率计算alpha;测试过程为:每个分类器的估计值分别乘上对应的alpha累加得到输出;
- 通常情况下,AdaBoost会达到一个稳定的测试错误率,并不会由于分类数目的增多而提高;
- AdaBoost和SVM是监督机器学习中最强大的两种方法。
Linear Regression
- 线性回归用来寻找最佳拟合直线,是可以直接求解的(最小均方误差的无偏估计),需要求一个逆矩阵;
- 如果矩阵的行列式为0,那么求逆会出现错误;
- 衡量线性回归结果的好坏:利用皮尔逊相关系数计算两个序列之间的相关度,越大匹配越完美;
- LWLR(局部加权线性回归):解决欠拟合;给待测点附近的每个点赋予一定的权重,然后在这个子集上进行普通的线性回归;
- LWLR同样适用Kernel来对附近的点赋予权重,常用的为高斯核,调整参数k;离待测点越远的权重越小;所以基本来说就是只看待测点附近的点;
- LWLR增加了计算量,类似于kNN;
- Ridge Regression(岭回归):RR最初用来解决样本点比特征少的问题,因为这样矩阵不是满秩矩阵,在求逆时会出现问题,于是在估计中加入一个偏差λI使得矩阵非奇异从而可以求逆;RR又是一种Shrinkage,通过引入该惩罚项,对回归系数的大小增加了限制,能够减少不重要的参数,选取合适的λ,能使部分不重要的系数缩减为0;不难证明,当对系数的平方和添加一个小于λ的约束时,可以得到与RR一样的公式;
- lasso:就是约束条件使用绝对值取代了平方和;但却极大了增加了计算复杂度;
- 向前逐步回归:与可以得到与lasso差不多的结果,但更加简单;属于一种贪心算法,即每一步都尽可能减少误差;一开始,所有的权重都设为1,然后每一步所做的决策是对某个权重增加或减少一个很小的值,然后计算错误率,如果错误率更低则保存改变;它可以帮助人们理解现有模型并做出改进;构建一个模型之后,可以运行该算法找出重要的特征;
- 当使用缩减方法时,模型的偏差(Bias)增加,但是同时方差(Variance)减少;也就是说,使用缩减法,减少了模型复杂度,降低了过拟合的风险;
- 优点:结果易于理解,计算不复杂;
- 缺点:对非线性拟合不好;
- 适用数据类型:数值,标称;
Classification and Regression Tree
- 当数据拥有众多特征且特征之间关系十分复杂时,构建全局模型的想法就不现实了,一种可行的方法是将数据切分成多份易建模的数据,再在每份数据上用工具建模;
- CART(分类回归树)既可以用于分类又可以用于回归,它使用二元切分来处理连续型变量;
- CART只做二元切分,所以与ID3相比,可以使用固定的数据结构来存储树节点;
- 回归树认为数据中的复杂关系可以用树结构来概括;
- 连续数据混乱程度计算:首先计算所有所有数据的均值,然后计算每条数据到均值的差值,也就是方差×样本点个数;
- CART同样对每个特征,再对每个特征值,将数据切成两份,计算切分的误差,由此来找到最佳切分;其中有两个参数来实现预剪枝:如果切分数据集后效果提升不大,那就不切分直接创建叶子结点;另外检测两个切分后的子集的大小,如果大小小于参数,那么也不切分;
- 如果是回归树,那么叶子结点就是目标变量的均值;
- 剪枝:降低决策树的复杂度来避免过拟合;预剪枝:上述的两个参数,就是提前终止条件,效果相对不错;后剪枝:将数据分成训练集和测试集,首先使构建出的树足够复杂,接下来从上到下找到叶节点,用测试集来判断这些叶节点是否能合并来降低测试误差,如果是则合并;后剪枝并没有预剪枝有效,但预剪枝对于参数非常敏感;
- 模型树:叶节点设定为分段线性函数;关键在于误差的计算,应该先用线性模型拟合,然后计算真实目标值和模型预测值之间的插值,最后求差值的平方和得到误差;叶节点是线性回归的系数向量;
- 树回归在预测复杂数据时会比简单线性模型更加有效;
k—Means
- k均值是最简单的无监督学习,聚类方法,它将相似的对象归到同一个簇中;
- 簇的个数k由用户给定,每个簇通过其质心来描述;
- 首先随机确定k个初始点为质心,然后将数据集中的每个点分配到一个簇中,反复迭代结算质心和分配,直到所有数据点的簇分配结果不再改变为止;
- 一种度量聚类效果的指标是SSE(误差平方和,误差指点到质心的距离),越小表示数据点越接近质心,聚类效果越好;一种后处理的方法是合并最近的质心,或者合并使得SSE增幅最小的质心;
- 为了克服kM的局部最小值问题,提出二分K-均值算法,该算法首先将所有的点作为一个簇,然后将该簇一分为二,之后选择一个簇继续划分,选择哪一个簇划分取决于对其划分是否可以最大程度降低SSE的值;
- 优点:容易实现;
- 缺点:可能收敛到局部最小值,在大规模数据上收敛较慢;
- 适用数据类型:数值;
Association Analysis:Apriori
- 从大规模数据中寻找物品之间的隐含关系被称作关联分析;
- 频繁项集是经常出现在一起的物品集合,关联规则暗示两种物品之间可能存在很强的关系;
- 支持度:数据集中包含该项集的记录所占的比例;
- 可信度:对于包含某物品的记录,我们有多少条记录都适用;
- Apriori可以用来发现频繁项集,可以减少计算次数;Apriori原理:如果某个项集是频繁的,那么它的所有子集都是频繁的,也就是说如果某个项集是非频繁的,那么它的所有超集也都是非频繁的;该算法首先生成所有单个物品的项集列表,接着将不满足最小支持度的集合去掉,然后对剩下的集合进行组合生成包含多一个元素的项集,反复迭代;
- 关联规则从频繁项集生成;如果某个规则不满足最小可信度要求,那么该规则的所有子集也不会满足最小可信度要求;从每条频繁项集中生成关联规则的方法如下:首先获取机集合中的所有元素,对于长度为1的不考虑,对于长度为2的直接计算,对于长度大于2的,先固定右边,对左边合并计算;
- 优点:易编码实现;
- 缺点:在大数据集上可能较慢;
- 适用数据类型:数值,标称;
Association Analysis:FP-growth
- FP-growth通过将数据存储在一个FP树中来发现频繁项集,但不能用于发现关联规则;同样利用Apriori原理;
- FP树分为树和头指针表,树中是每个项集的路径和其出现频率;头指针表保存每个元素的出现频率并指向书树中该元素,接着在树中再次指向别的该元素,形成链表;
- 工作流程:首先构建FP树,为了构建FP树,需要扫描两次原始数据集,第一遍对所有元素项的出现次数计数,第二遍扫描构建树,在将集合添加到树之前需要对集合排序,基于绝对出现频率;
- 从FP树中挖掘频繁项集:从FP树中获取获得条件模式基(是以所查找元素项为结尾的路径集合,前缀路径,是介于所查找元素与根结点之间的所有内容,构建可通过头指针表上溯),再利用条件模式基构建条件FP树;迭代上述直到树包含一个元素项为止;
- 优点:一般要比Apriori快;
- 缺点:实现比较困难,在某些数据集上性能会下降;
- 适用数据类型:标称;
Dimensionality Reduction
- 在低维下,数据更容易进行处理;
- PCA(主成分分析):数据从原来的坐标系转换到了新的坐标系,第一个坐标轴选择的是原始数据中方差最大的方向,第二个坐标轴选择的是和第一坐标轴正交且具有最大方差的方向;
- 通过数据集的协方差矩阵及其特征值分析可以求得主成分的值;而保留几个主成分可以通过计算主成分所占方差的百分比来决定;
- 优点:降低数据的复杂性,识别出最重要的特征;
- 缺点:不一定需要,且可能损失有用信息;
- 适用数据类型:数值;
- SVD(Singular Value Decomposition 奇异值分解):SVD的方法为隐性语义索引(LSI)或隐性语义分析(LSA),在LSI中,一个矩阵由文档和词语组成,当我们在该矩阵上应用SVD时,就会构建出多个奇异值,这些值代表了文档中的概念或主题;
- SVD是矩阵分解的一种类型,矩阵分解是将数据矩阵分解为多个独立部分的过程;SVD将原始数据集矩阵分解为三个矩阵U,Σ和VT的乘积;其中Σ矩阵只有对角元素且从大到小排列的,这些对角元素就叫做奇异值;如果我们在r个奇异值之后将其他奇异值全都置为0,这就意味着数据集中仅有r个重要特征,其它都是冗余或者噪声;选取奇异值后,再将其乘回去,可以得到与原矩阵行列相同,数值相似的矩阵,这就达到了降维,压缩的目的;
- 那如何知道保留多少奇异值?一个典型的做法是保留矩阵中90%的能量信息,为了计算能量信息,我们将所有的奇异值求平方和,将奇异值得平方和累加到90%为止;
- 优点:简化数据,去除噪声;
- 缺点:数据的转换可能难以理解;
- 适用数据类型:数值;
- SVD这里说到了基于协同过滤的推荐引擎,协同过滤式将用户和其他用户的数据进行对比来实现推荐;那么相似度计算就变得十分重要,我们利用用户对物品的意见来计算相似度;相似度计算方式一般有欧氏距离,皮尔逊相关系数,余弦相似度;
- 在用户数量很多的情况下,我们使用基于物品相似度的计算方法;因为相似度计算时间和数目相关;
- 推荐引擎寻找用户没有评过分的物品,寻找相似的物品计算相似度,并为每个物品预计一个可能的评级分数,为相似度和相似物品评分的乘积;
- 推荐系统的冷启动(缺乏数据的情况下)是个挑战,我们可以利用基于内容的推荐作为一个良好的开始;
其他
- 数据预处理:数据归一化,除以同一个数值;
- 数据预处理:缺失值填充,均值,相似样本等;
- 非均衡分类问题:不同类别的分类代价并不相等,需要在错误衡量中加权;过抽样或者欠抽样;
- 分类性能度量指标:Presicion,Recall和ROC曲线;
- MapReduce;