p94-p115
纯度
熵:
熵函数H(p1)的图像,p1是样本中猫的含量。这就是衡量纯度?当样本中全是猫,或者全不是猫时(全是狗),熵为0。熵只看纯不纯,不看这里面是什么东西。
熵的公式:
决策树学习中,熵的减少称为信息增益。
例:在猫狗分类的根节点中:
我们比较它的熵:左右分支的熵加权平均值。
在构建决策树时,实际上会对这些公式进行更改,以遵循决策树构建的惯例,但实际上不会改变结果。不再是计算加权平均值,而是计算“与我们根本没有分裂相比,熵的减少”,转回根节点,10个样本中5猫5狗,p1=0.5,根节点熵H(0.5)=1,
最后得到的0.28等等被称为信息增益(相当于这个数字越大,信息提升就越好)。这样计算是为了决定何时不再进一步分裂(熵的减少是否太小)。
于是我们拆分,达到停止条件:如熵为0、或者树的深度达到多少层等等。
先序遍历、递归?
当我有多个离散特征时:比如耳朵可以是尖耳朵,圆耳朵和折耳。可以使用one-hot编码
阈值的确定:
比如我们要根据体重来划分这是猫还是狗:
计算信息增益就可以决定阈值,图中选择9kg是最合适的(绿色那条),它的信息增益是最大的。
回归树
现在加入了体重因素。
构建回归树,不是为了减小熵,而是为了减小每个数据子集中体重的加权方差。
对于回归树,我们类似的计算加权方差后,再用根节点的减掉,寻找加权方差降低的最多的那个。
使用多个决策树
单个决策树的缺点之一就是该决策树可能对数据中的微小变化高度敏感。那么我们建立多个决策树,称为树集成。
例如,在之前的猫狗分类中,在根节点处拆分最佳的特征是耳朵(根据信息增益算的)。我们将其中一只猫换成另一种,这时计算下来发现胡须是信息增益最高的特征:
仅仅改变一个训练样本,就可能导致算法在根部分裂成完全不同的树了,所以我们可以选择训练一大堆不同的决策树。
使用树集合的原因就是通过大量决策树出来很多结果,然后让他们投票:比如树1说这是猫,树2说不是,树3说是,那么结果选择“是”,有点少数服从多数的意思。
但是我如何选择这些不同的,但是又看似合理的策略来构建不同决策树呢?
随机森林
例:袋子里有4个球,红黄蓝绿,每次拿一个出来记录颜色,再放回去,重复四次。可能会有如下结果:
这种有放回的抽样过程能让我构建一个新的训练集,它与原来的训练集有些相似,但也有很大不同
这些新的训练集中有些数据重复,但是没关系,拿这些新的训练集来建立决策树。这些训练集中,能选择更小的特征集合(因为有些样本不会被抽到,我们抽取的是总样本的一部分),然后呢在这些特征集合中选择出用来分割的特征,这些特征子集是随机选出来的。
往往子集中特征的个数是k=sqr(n)。原样本中n个特征。森林比单个决策树更稳健的理由就是,在替换的过程中导致算法探索了数据的许多微小变化,并且它在训练不同的决策树并对所有的这些树进行平均。
XGBoost
对于之前的决策树,观察哪里没有做好,然后在构建下一个决策树时,我们将更多地关注我们没有做好的例子(分错类的就多放点)。
XGBoost(分布式梯度增强库)能很好的选择默认的分裂标准和何时停止分裂,还内置了正则化以防止拟合过度。
什么时候选择决策树而不是神经网络
决策树和树集成通常适用于表格数据,也称为结构化数据。
能用表格储存的:前文的房价预测中的,房屋大小、卧室数量等。
不太能用表格储存的数据:图像、音频、文本等。
神经网络往往更适合处理非结构化数据。
决策树特点
1.运行快。
2.可解释性,比如我只训练一个决策树,这个树有几十个注释,我可以打印出来看它是怎么决策的。但是我要是有一个森林要全部看到还是有点麻烦吧?况且树集成还是需要一定的计算资源。
神经网络特点
1.适用于所有类型的数据
2.慢
3.可以使用迁移学习
4.多个神经网络串在一起比多个树串在一起要简单。多个神经网络依然可以用梯度下降来训练。
无监督学习
最后一课了,加油啊要开始炼丹了。
聚类
聚类算法:在数据中寻找一种特定类型的结构,找到相似的数据将它们分到一个类里。
K-means算法
第一件事:随机猜测我要求它找到的两个聚类的中心位置。在这个例子中,要求他找到两个集群。
不过下图中,它找到的两个初始点不算太合适。K-means算法循环做两件事:将点分配给簇质心,然后移动簇质心。
第一步:猜测两个点作为簇质心,然后遍历所有点,看它更接近红心还是更接近蓝心。然后给他们分类:
第二步:计算所有红点并求“每个点坐标的平均值”,然后将红色聚类中心移动到这里,对蓝点做同样的事。
接着继续检查这些点,看它们离哪个近就给他变成哪个色。换色之后再计算平均位置,并改变簇质心...循环...
当我们一遍一遍应用这个步骤,但是质心不再变化说明收敛了:
总结步骤:
1.随机初始化k个簇质心μ1、μ2...μk
2.分配给聚类中心:这也被称为L2 范数
3.求平均值(分别是各个特征的平均,然后得到一个坐标),把簇质心挪过来。
但是遇到极端情况:比如蓝色一个都没有被分配到:
如果发生这种情况,最常见的做法就是消除该集群。
K-means除了在边界清晰的类型中效果良好,在不那么清晰也做得可以:
常用符号标记
指当前样本被分配到的集群索引
是簇质心
是分配给示例x的集群的簇心
成本函数:
m指样本的总数哈,其实这个就是每个点距离自己中心距离的平均值。这个函数又叫失真函数。
如何决定k的数量
k:有多少个聚类中心
肘法:选择不同的k,观察J随k的变化,可见J随着k增加在减小,如果可以发现一个转折点,导致图像一个手肘,这时候就选择这个k值。
更多的情况下,J都是在平滑的减少(如果k和样本数一样多,那还能j=0呢)
其他选择方法他没说,有待自己查:【机器学习】——K_means如何选择k值?_kmeans怎么确定k值-CSDN博客
kmeans算法的k值选择_kmeans如何确定k值-CSDN博客
异常检测
有一家公司在造飞机,如何检测他家的发动机是不是有故障?
假设x1=温度,x2=振动强度。我们收集了m个数据,并画了图。这时有一个新发动机,拿来预测它是否ok:
如果这个新样本和之前的好像不在一起,那么建议再好好检查之后再投入使用。
高斯分布
又称正态分布,假设x是个随机数(随机变量)
其中μ是均值,σ是标准差,
曲线下面的面积是1,所以p是概率密度?下图可见方差越小分布越集中。
对于异常检测,使用高斯分布来进行密度估计,这意味着我们要建模来估计p(x)的概率密度。
假设样本x有n个特征:x1、x2...xn;
建模步骤:
1.选择特征
2.计算每个特征的μ和σ
3.拿新的x来计算它的p(x)
4.设定阈值,如ε=0.02,计算p(x)=0.0426>ε,那么“ok”,如果p(x)<ε,那么“异常”。
如何选择epsilon?
今天就到此为止吧,乏了