机器学习算法基本型 分类(笔记)

 

数据工作逻辑

1、定义问题对应的数据
• 原始数据集
• 通过各种方式获取,如公共平台、个人整理等
 
2、定义数据体现的特征,和数据之间的关系
• 根据数据集,你可以得到的一些特征,比如可用性、利润程度等
• 通过思考你的目标是什么,需要什么指标去衡量,指标即特征
 
3、数据分析。分为训练、开发和测试 (有时可以简化为2部分,比如 训练集:测试集=7:3)
• 训练集(training set):训练模型的数据
• 开发集(dev set):在开发过程中用于调参、验证(validation)等步骤的数据集(保证不被模型提前学习)
• 测试集(test set):实际测试时所使用的数据集(保证不被模型提前学习)
 
4、根据测试效果,回到1和2步进行优化。不断迭代。

image

三个关键的误差水平

  • 人类水平误差:假设,观察一张CT片子,不同的医生可能的误差是:普通医生误差10%,专家医生7%,一个专家组5%。这5%,就是现实世界的“最优可达到误差”的近似,也称为 “贝叶斯最优误差” 。理论上最低的误差,也不会低于这个值了;
  • Avoidable bias(可避免偏差):可避免偏差 = 训练集误差 - 人类水平误差。它衡量的是模型在训练集上相对于人类专家还差多少。这个值应该尽可能小,如果过大,就会欠拟合,需要通过对模型的调优(增加复杂度、调参数、训练再久一点等)来降低它;
  • Variance(方差): 方差 ≈ 测试集误差 - 训练集误差。它衡量的是模型从训练集到测试集的性能下降程度,这个值应该尽可能小,如果过大,就会过拟合。高方差意味着模型泛化能力差。
  • 权衡关系:

    • 降低偏差(可以让模型更复杂、加长模型训练时间、新的模型/算法):通常会导致方差上升。

    • 降低方差(可以简化模型、正则化、用更多的数据训练、数据调整/重新抽样、新的模型/算法):通常会导致偏差上升。

    • 我们的目标是找到最佳平衡点,使总误差最小。这种将avoidable bias和variance结合,就是机器学习领域的bias-variance trade-off(偏差-方差权衡)。一个很美好的目标是:误差小,偏差和方差也小,这是一个泛化能力很好的模型。实际中,误差、偏差、方差,多大是大呢,这个很难界定,但可以用经验做一些衡量。有这样一些经验,值得考虑:

    1. 如果方差 远大于 可避免偏差(至少3倍) → 先解决过拟合(减少模型复杂度、加正则化、获取更多数据等);
    2. 如果可避免偏差 远大于 方差 (至少3倍)→ 先解决欠拟合(用更复杂的模型、训练更久等)
    3. 如果两者差不多 → 可以同时处理。

其次,还可以从开发误差是训练误差的几倍,判断是不是需要干预方差。以及业务要求的误差是多少,来决定是否要继续干预。

 

image

 Tips:

1、贝叶斯最优误差:即使在拥有所有可能信息、做出最优决策的情况下,完成该任务仍然无法避免的最低错误率。它是由任务本身的模糊性决定的,而不是由学习者的能力决定的。比如上面的CT片子,可能由于图像质量、疾病本身的复杂性,或者信息的缺失,比如某些角度没拍到,导致这个任务本身具备一定的模糊性,你再提高自身能力,也一定会存在误差,这就是无法避免的错误。那和贝叶斯有什么关系呢?这是因为它的来源路径是:贝叶斯定理 → 贝叶斯分类器 → 贝叶斯最优误差。

1)从贝叶斯定理到最优分类器:以CT片子为例,根据这个片子,判断得癌症的概率,根据贝叶斯定理,可以基于“图像长成这样的概率(证据概率)“,以及“得癌症的概率(先验概率)“和“如果得癌症,我会有这种图像的概率(似然概率)”,得到得癌症的后验概率。即

P(癌症 | x) = [P(x | 癌症) × P(癌症)] / P(x)
= (0.3 × 0.01) / 0.031
≈ 0.003 / 0.031
≈ 0.0968 ≈ 9.7%

那么:P(正常 | x) = 1 - P(癌症 | x) ≈ 90.3%

此时,假设有一个全知全能的“上帝诊断系统”,它知道所有可能的概率,那它做决策,肯定是选择概率大的那个。比如,如果 P(癌症 | x) > P(正常 | x) → 预测癌症,否则 → 预测正常。上面的例子里,P(癌症 | x) ≈ 9.7%,P(正常 | x) ≈ 90.3%,9.7% < 90.3%,所以,在这种图像下,就可以判断,你没病,正常。那么问题就是,你没有上帝视角,你并不知道P(x | 癌症) ,也不知道P(癌症)、P(x),这三个数据,本身的获取,存在误差。贝叶斯最优分类的意义主要在于,我假定你就是准确的概率结果,那我会怎么做决策,我的决策思路就是,谁概率大我选谁。它其实也隐藏了一个含义:如果你的估计足够准确,那你基于贝叶斯分类器大概率得到正确的决策(因为后验概率也不是100%,我只是让你选择错误率低的那个,也就是(1-后验概率)小的)。如果你概率就是错的,那根据我的分类器,你决策错了,这也不是我导致的决策误差。

2)从贝叶斯最优分类器到贝叶斯最优误差:理论上的贝叶斯最优分类器在实际应用时会犯的错误率。也就是P(errorx)=1max{P(C=1∣x),P(C=0∣x)},选择了最大的那个概率,仍然可能犯错的概率。为了方便使用,通常使用P(error∣x)=min{P(C=1∣x),P(C=0∣x)}。然后把每个x对应的错误率,乘上x出现的概率,全部相加求平均,得到对应的错误率, 求平均,就是贝叶斯最优误差。比如:

image

那么,总最优误差 = (A型出现频率 × A型最优错误概率) + (B型出现频率 × B型最优错误概率) + (C型出现频率 × C型最优错误概率)

                              = (20% × 0.05) + (30% × 0.10) + (50% × 0.45)
                              = 0.01 + 0.03 + 0.225
                              = 0.265 = 26.5%

 这个26.5%就是贝叶斯最优误差。

2、方差,数学上不是用来做稳定性的判断么?这里为什么又用来做误差的判断了呢?其实这是因为 期望误差=偏差²+方差+σ²,方差项确实会导致测试误差上升,高方差的模型必然在测试集上表现更差。既然,我能轻易算:测试误差 - 训练误差,那我就用“测试误差 - 训练误差”来代表“期望误差”吧。而期望误差,又和方差强相关。于是大家开始用“方差”指代“泛化差距”。可以理解为这是“方差”这个术语,在机器学习上的一个演化叫法。

 效果指标

Correctly Classified Instances:
  • TP(True Positive):被判定为正样本,且事实上也是正样本
  • FP(False Positive):被判定为正样本,但事实上是负样本(误报)
  • TN(True Negative):被判定为负样本,且事实上也是负样本
  • FN(False Negative):被判定为负样本,但事实上是正样本(漏报)

构造混淆矩阵:

image

 

  • Precision:查准率 (即在检索后返回的结果中,正确个数占整个结果的比例。强调正确率。),precision = TP/(TP+FP);
  • Recall:查全率 (即在检索结果中真正正确的个数 占整个数据集(检索到的和未检索到的)中真正正确个数的比例。强调是否有漏报。),recall = TP/(TP+FN);
  • F-Measure/ F-Score :Precision和Recall平均 (P和R指标有时候会出现矛盾),用这个值来帮助进一步判断。

分类算法-决策树

用一棵树来刻画规则。在数据分析中,每一个分支都代表一次判断,每一个叶子都通向一个结论。我们要做的,就是让“树”的生长,有据可依、简洁高效。那么如何科学地构建这棵树呢?从哪个属性开始分割?根节点后又继续选择哪个属性做下一个节点?什么时候停止分化这棵树?下面通过一个例子来描述这个算法是怎么构建这棵树的。
 
这里需要用到一个重要的概念 信息熵(entropy),来帮助进行树节点的选择计算。信息熵,是用来衡量一个东西的不确定性有多大的。比如你观察一个事情,如果熵高,也就是发生什么结果的不确定性高,那它每次的结果,能给你带来信息可能就越多(超级意外!)。如果熵低,不确定性就低,带来的信息少,就像太阳的东升日落,不会给你任何惊喜和意外。所以二元系统(只有两种结果)中,当发生的概率是一半一半,说明发生什么事情非常不确定,那么熵是最大的,为log2 2=1比特.当发生的事情非常确定,那么熵是最小的,就是0比特. 熵,用来衡量要编码集合 S 中任意成员的分类所需要的最少二进制的位数。我们获得更多信息的价值,用降低了多少的不确定性来衡量。
 
 Tips:
1、熵是所需要的最少二进制的位数,怎么理解呢?这是因为,对于一个离散随机变量 X,有 n 种可能的取值,概率分布为 P(xi),香农熵定义如下:

image

熵的单位是比特(bit),因为公式里用的是 log⁡2,代表是二进制,二进制单位是bit.为什么用log2就代表是二进制?因为假设用二进制编码,码长 L 位。每增加 1 位,可能性数量乘以 2(因为每位有 2 种选择)。总可能性数量,就是2的L次方。如果现在我需要N种可能,也就是需要image,那么 image。这个L就是码长,也就是几位二进制。比如8种可能性,就是2³,也就是L=log28=3,二进制的码长或者说二进制的位数,就是3bit,也就是用3位来表示8种,000,001,010,011... ...

所以,这个公式可以看出来,求熵,就是求它平均使用了多少比特/多少码字长度。更进一步的理解,当你使用了更多的比特(对应码子长度高),那么代表你输入了更多的限制条件或者影响条件或者可能性,也就因此,不确定性更高。

 2、二元系统计算等概率事件的熵,为啥为log2 2=1比特?

image

 

image

 

 

image

 当N=2时,就是log22=1。如果N=3时(有3个结果),那就是log23,大概是1.585 比特.

 

构造树的基本想法是,随着树深度的增加,节点的熵迅速降低,来让我们更高效地确定一个事情。如何刻画这个降低效率?方法是,用前后两次的熵相减,值越大,说明新的规则熵越小,相对来说它本身的确定性就大,那么因此带来的确定性就大,也就是选择它以后,价值更大,可以更快得到有效结果。这个差值,就是信息增益Gain(S,A),S是基于的基本环境,A是要计算的目标环境。以下面的天气示例,来进行说明:

1、确认根节点。

1)确认初始熵:在没有天气状况、温度、湿度、风力这些信息的情况下,直接根据14天的打球结果,计算初始熵。这14天,去打球是9天,不打球是5天,所以打球概率是9/14,不打球概率是5/14,代入信息熵的公式,计算初始熵;

image

 2)分别计算四种情况的信息熵,以及对应的信息增益:

a 如果知道了天气,那么打球结果是什么情况的信息熵、信息增益;

b 如果知道了温度,那么打球结果是什么情况的信息熵、信息增益;

c 如果知道了湿度,那么打球结果是什么情况的信息熵、信息增益;

d 如果知道了风力,那么打球结果是什么情况的信息熵、信息增益。

具体计算如下:

a 如果知道了天气,那么打球结果是什么情况的信息熵、信息增益:

1)计算晴朗时,打球的熵。晴朗时,一共是5天,2天打球,3天不打球。所以晴朗时,打球概率2/5,不打球概率3/5。代入信息熵的公式,得到0.97比特;

2)计算阴天时,打球的熵。阴天全部选择打球,因为只有这一种可能,所以信息熵最小,为0;

3)计算雨天时,打球的熵。雨天时,一共是5天,3天打球,2天不打球。所以雨天时,打球概率3/5,不打球概率2/5。代入信息熵的公式,得到0.97比特;

4)因此,在天气的影响下,是否打球的整体熵,需要结合这三种情况,并分别*对应天气发生的概率,作为权重,得到整体熵的结果。比如14天里,5天晴朗,4天阴天,5天下雨,整体熵=5/14*0.97+4/14*0+5/14*0.97=0.693;

5)天气的信息增益=初始熵-天气熵=0.94-0.693=0.247.

image

 b 如果知道了温度,那么打球结果是什么情况的信息熵、信息增益---同理计算得到,Gain(温度)=0.029;

image

 c 如果知道了湿度,那么打球结果是什么情况的信息熵、信息增益---同理计算得到,Gain(湿度)=0.152;

image

 d 如果知道了风力,那么打球结果是什么情况的信息熵、信息增益---同理计算得到,Gain(风力)=0.048.

image

综上,四种情况里面,Gain(天气)是最大的,所以根节点选择天气。

2、根节点为天气,那么会有三个分支:晴朗、阴天、雨天。那么每个分支下面,应该选择什么节点呢?

1)以晴朗分支开始计算,在基于晴朗的前提下,分别计算如下几种情况的信息熵和信息增益。这里的初始熵,为晴朗天气的熵,上面已经计算过,为0.97:

a 晴朗天气下,如果知道了温度 ,那么打球结果是什么情况的信息熵、信息增益;

b 晴朗天气下,如果知道了湿度 ,那么打球结果是什么情况的信息熵、信息增益;

c 晴朗天气下,如果知道了风力 ,那么打球结果是什么情况的信息熵、信息增益。

具体计算如下:

a 晴朗天气下,如果知道了温度 ,那么打球结果是什么情况的信息增益:

1)晴朗天气一共5天,对应着hot是是2天(2/5),mild是2天(2/5),cool是1天(1/5);

2)晴朗天气下,hot打球全部是no,熵为0;mild打球一天去,一天不去,熵为1;cool打球全部是去,熵为0;

3)这里的初始熵,为晴朗天气的熵,上面已经计算过,为0.97。因此晴朗天气下,温度的信息增益计算如下:

Gain(Sunny,Temperature) = 0.970 - (2/5)0.0 - (2/5)1.0 - (1/5)0.0
                                          = 0.970-(2/5){-1*log(1)-0*log(0)}-(2/5){-0.5*log(0.5)-0.5*log(0.5)}-(1/5)*{-1*log(1)-0*log(0)}
                                          = 0.570 
b 晴朗天气下,如果知道了湿度 ,那么打球结果是什么情况的信息熵、信息增益:
Gain(Sunny, Humidity) = 0.970 - (3/5)0.0 - (2/5)0.0 = 0.970
c 晴朗天气下,如果知道了风力 ,那么打球结果是什么情况的信息熵、信息增益:
Gain(Sunny,Wind) = 0.970- (2/5) ){-0.5*log(0.5)-0.5*log(0.5)}-(3/5){-2/3*log(2/3)-1/3*log(1/3)}
                              = 0.970 - (2/5)1.0 - (3/5)0.915 
                              = 0.019
综上,晴朗天气下,信息增益最大的,是湿度。所以晴朗分支下的节点,就是湿度。
2)同理,计算阴天分支。阴天的初始熵,上面已经计算了,已经是“所有结果都是去打球”,熵为0.所以不再分支了,直接指向结果节点“是”;
3)同理,计算雨天分支,增益最大的是风力。所以雨天分支下的节点,就是风力。
Gain(Rain,Temperature) = 0.970-(3/5){-2/3*log(2/3)-1/3*log(1/3)}-(2/5){-0.5*log(0.5)-0.5*log(0.5)= 0.019
Gain(Rain,Humidity)= 0.970- (2/5) ){-0.5*log(0.5)-0.5*log(0.5)}-(3/5){-2/3*log(2/3)-1/3*log(1/3)}=0.019
Gain(Rain, Wind) = 0.970 - (3/5)0.0 - (2/5)0.0 = 0.970
3、这棵树什么时候停止?当你计算得到的增益为0,就停止。比如接下来,本来应该继续在每个节点下,根据分支,计算不同条件下的信息增益,来决定每个分支下继续选择什么节点。但在这个例子中,晴朗--湿度高--全部为不去打球,晴朗--湿度正常--全部为去,因此湿度下的两个分支直接指向了两个增益为0的结果节点,这就已经可以结束了,我们不需要再次分情况讨论新的节点了。最终,这棵树长这样了:

image

 

实际上,在真实应用中,为了避免无限运算,或者考虑成本,通常,我们会通过限制最大树深度、限制叶子节点数量、限制每个叶子节点最少样本数,来让树停止分化。
 

使用weka练习一个分类算法-cars

实验目的:通过构建J48决策树分类模型,对汽车购买推荐进行预测分析。具体包括: 探索影响汽车购买决策的关键因素(即根节点和高层节点)、验证模型的泛化能力和实际应用价值(采用训练集-测试集分离验证的方式。通过对训练集进行训练,得到模型,然后在测试集上进行验证,结果和测试集的真实结果进行对比,得到混淆矩阵,了解模型的应用价值)。

数据说明:数据集的属性包括buying(价格低、中、高、很高)、maint(维护)、doors(几扇门)、persons(乘载几人)、lug_boot(后备箱多大)、safety(安全系数)、CAR(只有0和1,代表不购买和购买)。

实验步骤:

1、训练阶段:用训练集(1209条)建立J48决策树模型

image

 2、预测阶段:用建好的模型对测试集(519条)进行预测

image

3、评估阶段:运行结果如下。通过对预测结果与测试集真实的CAR标签进行比对,得到混淆矩阵,进而得到精准度等指标,判断此模型的应用价值

 image

 正为1,购买;负为0,不购买。

image

  J48常用参数的说明:

image

 

image

指标的说明:

  • kappa:(观察一致性 - 期望一致性) / (1 - 期望一致性)。其中,观察一致性可以理解为准确率,即(预测为0,实际为0+预测为1,实际为1),在所有测试集的占比;期望一致性,需要先计算出实际结果为0、1的概率,预测结果为0、1的概率。假设预测、实际都是独立随机事件,所以整体随机猜中0的概率就是(实际0的概率*预测0的概率),整体随机猜中1的概率就是(实际1的概率*预测1的概率),两者相加,为整体期望一致性
  • 混淆矩阵:根据截图中红色字体的说明,建立矩阵。进而涉及4个关键数据:TP(预测为1,实际为1)、TN(预测为0,实际为0)、FP(预测为1,实际为0)、FN(预测为0,实际为1)。Precision = TP/(TP+FP),即预测为正的样本中,真正为正的比例

其他

如果想看这棵树的整体效果,可以右键运行结果标题,选择visualize tree。之后点击 fit to screen,就可以看到清晰的树结构了。 

image

 

可以看到,根节点是safety,说明客户购买的最主要参考因素,就是安全性,安全性为1的,全部不购买。接下来是考虑坐几个人,再来是考虑价格。

image

 

实验小结:此模型的泛化能力在本数据集上表现很好,准确度达到了96%.kappa值0.916,也说明模型预测结果与真实结果的一致性很高,并不是随机猜对的。可以用于预测客户购买的决策(首先是考虑安全性,其次是载客量,再来是价格),也可以考虑利用在二手车价值的评判、保险风险评估的评判上。

posted @ 2026-01-15 14:32  1234roro  阅读(5)  评论(0)    收藏  举报