机器学习简明手册

本文是一份机器学习简明手册,适合有一定基础的读者。涵盖了k近邻、决策树、朴素贝叶斯、逻辑回归、提升方法等多个重要算法,讨论了如何衡量距离、选择特征以及算法的应用和优化。此外,还介绍了k-means、EM算法和隐马尔科夫模型等。文章强调了机器学习中数据预处理和模型选择的重要性。
摘要由CSDN通过智能技术生成

机器学习简明手册

面向读者:有一定机器学习基础的。不是新手入门手册。实用导向的,所以不会扣细节和具体式子,只给出算法idea。能当作复习提纲,或者学习的roadmap吧。参考资料主要有《机器学习实战》(简称《实战》),《统计机器学习》,李航著(简称《统计》),cs229

k近邻(k nearest neighbour)

(注意名字不要跟k-means搞混了)很简单,求离样本最近的k个点中大部分是什么标签,就作为这个点的标签。计算量有点大,大数据貌似用不来的。虽然用kd树能优化到O(logN)

算法挺简单,但是传递出机器学习的一个重要思想:所谓的机器学习,从某种程度上来说,就是把一个新的样本放到历史收集到到大数据里去找某种程度的”相似”罢了,这种”相似”,有时候比较直接,有时候没那么直接。

可操作性的地方:

  • 我们怎么衡量“距离”?
    常用欧式距离(日常生活中理解的两点之间的距离)
    看Mining of Massive Datasets 3.5 里面提到还有其他几种,具体用到的时候再去细看就行了。

    1. Jaccard距离
    2. 余弦距离
    3. 编辑距离
    4. 海明距离
  • 数据需要归一化。不然算距离就不准了。比如“汽车行驶公里数”这个特征可能上万,“使用年限”只有不到10。显然不归一化的话,算距离就会被某个特征dominate

  • k值的选择。貌似也没啥好办法,只能试了。k值太小、太大,那个是过拟合? 太小的时候过拟合,比如k=1。k=N就相当于用样本的众数来预测了,仔细想想,这样做某种程度上也说得通。

决策树

一系列的布尔节点生成的树形结构。
看个图应该就明白。

决策树 来源见水印

有个问题,决策树是二叉树还是多叉树?ID3和C4.5是多叉树,CART说是只能二叉树。不过多值(枚举)比如a1,a2,a3,也能转换成是否a1,是否a2,是否a3这三个布尔特征变成二叉树。

应该是很好理解,但重点就是该如何划分节点?树是递归结构,其实对每个节点就只有两个子问题:
1. 选哪个特征来分裂。
2. (对于连续变量还有) 选这个特征的哪个值来分裂,布尔特征就没这个问题。

分类的目的其实就是为了让无序的数据更有序,熟悉信息论的应该马上能联想到了。

  • 熵:衡量无序程度。
  • 信息增益(information gain),也叫互信息(mutual information):熵的减少。比如原来的一个数据集熵是A,划分后熵是B,信息增益就是A-B。 具体到B的计算,比如我们选了其中一个布尔特征x来划分树,
    那么B = x为0的占比 * x为0这些样本的熵 + x为1的占比 * x为1这些样本的熵。

公式是g(D,A) = H(D) - H(D|A)

信息增益特征A,训练集D, 信息增益g(D,A) 等于经验熵H(D)减去条件熵 H(D|A)

这个就是ID3算法。

以信息增益作为划分训练集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比可以对这一问题进行校正。
– 李航 《统计学习方法》

这句话直观上怎么理解?选择取值较多的特征后,一般会变得更“有序”,我们想除去取值多(多叉树)的影响。

对比公式

  • ID3: 公式是g(D,A) = H(D) - H(D|A)
  • C4.5: 公式是gr(D,A) = g(D,A) /Ha(D) 就是原来ID3的基础上除以Ha(D),注意不是H(D)

Ha(D)= - ∑pi *log(pi) pi为特征a某个取值的占比。

把信息增益换成信息增益比,ID3算法就变成C4.5了。这里相当于做了归一化,有点类似于增长值和增长率的关系。

CART

CART(classification and regression tree)看名字可以知道不单单可以用于回归。限定了要二叉树。

  • 回归树
    跟k-means有点像。遍历特征j,再用启发式方法找切分点s。让划分出来的两陀尽量聚拢。
    具体怎么衡量切分好坏? 算出切分后两个组的y(注意是y,不是x)的圆心c1和c2,然后让属于c1的∑(yi-c1)^2 和属于c2的∑(yi-c2)^2 和最小

  • 分类树
    属于某个类的概率Pi,那么基尼指数
    Gini(P)=1-∑Pi^2
    就是把ID3算法的熵H换成Gini罢了。因为是二叉树,都不需要C4.5算信息增益比。

朴素贝叶斯

几个名字带“贝叶斯”的概念别搞混了。

贝叶斯概率公式

p(c|x) = p(x|c) * P(c) /p(x)

注意x是向量,c是label

这个公式怎么理解? 给你一个样本的特征x,怎么判断它的类别c,即p(c|x),比如给你一堆医学指标,然后判断是否病人有癌症。

我们可以统计训练数据里P(c)的概率,然后再统计一下 p(x|c) ,也就是得癌症的病人,出现x这种指标的概率有多大。
最后判断p(c=1|x) 和 p(c=0|x) 谁的概率大。

等等,这个好像有点扯蛋,我们如果样本里能得到p(x|c),难道还得不到p(c|x)?

(注意到x是个向量)朴素贝叶斯发挥作用就在这里了。

p(x|c)=p(x1|c) * p(x2|c) * p(x3|c) … * p(xn|c)

这个是加个朴素贝叶斯条件独立性假设的效果后才=的,现实中通常不成立,比如x1是某指标多少厘米,x2换成英寸,那两个特征显然不独立的。但实际中运用,效果还是有些合理的。就像以前学物理计算时候为了简化模型,忽略了阻力,但结果还是比较可用的,只是精度有些问题。

显然一下子豁然开朗了,虽然p(x|c)几乎在样本里获取不到(很难碰到检查指标完全跟你一样的人),但是p(x1|c)、p(x2|c)啥的,还是比较丰富的。或者另外的例子,垃圾邮件识别p(x1|c)、p(x2|c)就是垃圾邮件常见词汇出现的概率,比如“免费”,“折扣”,“优惠”这些词。这里有没联想起tf-idf里面的tf?不过tf-idf并没有处理label。

注意的点:

  • p(x1|c)=0怎么办?相乘都是0了,平滑一下,分子多加上1,分母加上n(x∈R^n)。
  • p(x1|c) * p(x2|c) … 都是很小的小数,相乘结果下溢怎么办?加上一个取对数操作,然后变成加法。 ln(a*b) = ln(a) + ln(b)

这两个技巧其他地方估计也用得上吧。

LR

普通的LR就不说了。

局部加权线性回归

有点像svm里面的高斯核 ,就是只考虑输入x附近的点(说到距离又想起k近邻了),离太远的权重就很低了。问题就是计算量比较大,而且predict的时候要保留整个数据集才行,这种叫做non-parametric algorithm(cs229 note1第15页)

加正则项

  • L1正则叫做lasso
  • L2正则叫做岭回归(ridge regression)

sgd加速

要点

  • 取样一定要随机,不然会有抖动(不可分的样本)。
  • a随着迭代减少才行。

缺失值处理

  1. 均值
  2. 特殊值,如-1
  3. 直接忽略有缺失值的样本
  4. 使用相似样本均值
  5. 使用ml方法来预测缺失值(蛋疼)

bagging

bagging全称是(bootstrap aggregating),好吧,以前还以为bagging是一个单词。

可重复抽样。然后得到多个样本进行多次训练得到多个模型。

最后,如果是分类问题就投票,回归问题就取平均。

经典的,看随机森林(random forest)吧。

boosting

思想挺简单,就是学错的样本加权,学对的样本降权,就像以前高中准备的错题本一样,哈哈。然后把weak learner合并到一起。boosting应该只是一个框架,因为只说明了思路,没说具体怎么操作,见wiki

AdaBoost

一种具体的Boost方法。

要点:

  • 样本加权多少。每一轮训练完后重新给样本赋权am,分错的权重变大,分对的权重变小。
  • 子模型权重多少。每一轮的子分类器的权重Wmi跟分类误差率相关。误差低的权重高

直觉上,这样做挺合理的。具体的权重式子比较复杂,就不列了。

以前觉得理解AdaBoost这样也就够了,如果式子没兴趣推导的话。 后来看了《统计学习方法》8.3提到AdaBoost的算法解释还挺有意思的

AdaBoost算法是模型为加法模型,损失函数为指数函数、学习算法为前项分步算法时的二分类学习方法。

  • 二分类:突然才发现有个问题,AdaBoost是用于分类,不能用于回归,而且分类还是二分类。

  • 加法模型: 就是说把模型加起来。如果是线性的函数y,相加起来其实没啥用,因为可以合并成一个函数,所以表示不了复杂函数。比如y1=a1*x + b1 , y2=a2*x + b2,可以合并成y=(a1+a2)*x+(b1+b2)。不过,AdaBoost用的子模型是分类器,而且取值为{-1,1},并且限定了最终加起来的函数是sign(x>0,y=1; x<0,y=-1},这样有正有负,加法才有意义

比如弱分类器是阶跃函数的话(x>v或x<v),而y={-1,1},这样可以组成复杂的函数,比如划分出[+, -, +, -}这样的区间。

  • 损失函数为指数函数。 exp[-y*fm(x)] 可以展开为exp[-y( fm-1(x) + am * Gm
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值