西瓜书(《机器学习》周志华)习题解析-第2章-模型评估与选择

西瓜书(《机器学习》周志华)习题解析-第2章-模型评估与选择


2.1 数据集包含1000个样本,其中500个正例、500个反例,将其划分为包含70%样本的训练集和30%样本的测试集用于留出法评估,试估算有多少种划分方式。

500个正例和500个反例,根据分层抽样的原则,30%的测试样本共300个,其中必须包含150个正例和150个反例。若不考虑样本其他的分布情况,则选取方式为:从500个正例中随机抽取150个,再从500个反例中随机抽取150个,两个过程相互独立,则共有 ( C 500 150 ) 2 (C_{500}^{150})^2 (C500150)2 种方式。

2.2 数据集包含100个样本,其中正、反例各一半,假定学习算法所产生的模型是将新样本预测为训练样本数较多的类别(训练样本数相同时进行随机猜测),试给出用10折交叉验证发和留一法分别对错误率进行评估的结果

10折交叉验证:将样本集划分为10个同分布不相交的子集,将其中9个作为训练集,1个作为测试集,每个划分可得到10次不同的训练和验证。对于题目所述的模型,总是将新样本预测为训练样本较多的类别,但每一次验证时,训练集的正例和反例一样多,将会进行随机猜测。每次都进行随即猜测,其错误率的期望是50%。

留一法:k折交叉验证中k等于样本个数的特例。在题目所述的情况下,即将100个样本每次取出1个样本用于测试,99个用于训练。当1个测试样本为正例时,99个训练样本为50个反例和49个正例,新样本将被预测为出现较多的反例,而测试样本的ground truth是正例,必然会预测错误。当测试样本为反例时同理必然会预测错误,此时错误率的期望为100%。

2.3 若学习器A的F1值比学习器B高,试析A的BEP值是否也比B高。

首先,了解什么是F1,什么是BEP。F1:查准率P和查全率R的调和平均;BEP:Beak-Even Point,P-R曲线上P = R时二者的取值。

F1和BEP有概念上的巨大差异,二者没有必然联系。P-R曲线的定义是:学习器将所有样本按“可能是正例”的概率从前向后排序,然后依次将前若干个样本按正例进行预测,所得出的预测结论。注意此时BEP曲线只是衡量了学习器进行“排序”的性能,并不包含最终预测的结果。也就是说,给定了P-R曲线的情况下,根据不同的预测策略,会产生不同的P和R。而F1是一个确定的概念,是在P和R都确定的情况下计算出的二者的调和平均。因此在同一P-R曲线上,F1在不同的位置有不同的取值。

因此对于题目所述的假设,我们很容易给出反例:对于R-P曲线完全相同的两个学习器,二者的P-R曲线上存在两个不同位置,使得对应的F1值不同。不妨设F1值较大的位置所对应的预测策略为学习器A,另一个为B,此时学习器A的F1值比学习器B高,但二者P-R曲线完全相同,也有相同的BEP值。

2.4 试述真正例率(TPR)、假正例率(FPR)与查准率(P)、查全率(R)之间的联系。

查全率: 真实正例被预测为正例的比例
真正例率: 真实正例被预测为正例的比例
显然查全率与真正例率是相等的。

查准率:预测为正例的实例中真实正例的比例
假正例率: 真实反例被预测为正例的比例
两者并没有直接的数值关系。

2.5 试证明式(2.22)

南瓜书:https://datawhalechina.github.io/pumpkin-book/#/chapter2/chapter2?id=_221的链接证明了书中大部分公式。但同时,根据南瓜书的建议:

对于初学机器学习的小白,西瓜书第1章和第2章的公式强烈不建议深究,简单过一下即可,等你学得有点飘的时候再回来啃都来得及。

同学们可以根据自己的情况选择性啃食该公式。

2.6 试述错误率与ROC曲线的联系

与2.3中所述的情况相似,ROC曲线本质上只反映学习器的“排序能力”,而具体的预测策略则取决于在ROC曲线上的哪一点作截断。当确定了一种预测策略时,才会对应一个确定的错误率。因此可以说,ROC曲线上的每一点,对应了学习器一种情况下的错误率。

(由代价矩阵所确定的错误率,参照西瓜书2.3.4节与公式2.23)

2.7 试证明任意一条ROC曲线都有一条代价曲线与之对应,反之亦然

代价曲线、ROC曲线、P-R曲线都是为了描述某一学习器的“排序能力”而引入的概念。ROC曲线下方的面积仅能在“错误代价均等”的条件下反应学习器的排序质量,而在错误代价并不均等的情况下,引入代价矩阵后,应当使用代价曲线来反应考虑代价的排序质量。但不论使用哪一种曲线,衡量哪一种面积,一旦学习器给定,其排序质量是一定的,则三种曲线都是确定的。从这一角度来看,任意一条ROC曲线都对应了一个确定的学习器,而该学习器有唯一确定的代价曲线,反之亦然。

若要严格证明该结论,西瓜书给出了ROC曲线和代价曲线的转换方法:ROC曲线上没一点对应了代价平面上的一条线段,设ROC曲线上点的坐标为(FPR, TPR),则可计算相应的FNR,然后再代价平面上绘制一条从(0, FPR)到(1, FNR)的线段,如此求出ROC曲线上所有点对应的线段,其下界围成的曲线即代价曲线。同理,在代价曲线上寻找一个连续的分段,将其线段计算出相应的FPR与FNR,再计算出TPR,即得到ROC曲线上的一个点,连接所有如此的到的点即得ROC曲线。

2.8 Min-max规范化和z-score规范化是两种常用的规范化方法。令 x x x x ′ x' x 分别表示变量在规范化前后的取值,相应地令 x m i n x_{min} xmin x m a x x_{max} xmax 分别表示规范化前的最小值和最大值, x m i n ′ x'_{min} xmin x m a x ′ x'_{max} xmax 表示规范化后的最小值和最大值, x ˉ \bar x xˉ σ x \sigma_x σx 分别表示规范化前的均值和标准差,则min-max规范化、z-score规范化分别如式(2.43)和(2.44)所示,试析二者的优缺点。

x ′ = x m i n ′ + x − x m i n x m a x − x m i n × ( x m a x ′ − x m i n ′ ) , (2.43) x' = x'_{min} + \frac{x - x_{min}}{x_{max} - x_{min}} \times (x'_{max} - x'_{min}), \tag{2.43} x=xmin+xmaxxminxxmin×(xmaxxmin),(2.43)

x ′ = x − x ˉ σ x , (2.44) x' = \frac{x - \bar x}{\sigma_x}, \tag{2.44} x=σxxxˉ,(2.44)

从公式可以看出,min-max规范化会将整个样本线性地拉伸到新的区间,其优点有:简单易于计算(新的元素加入后,只有当其超出最大最小值范围时才需要重新计算全部元素)、可灵活设置归一化后的区间;其缺点在于:容易受极端数据影响(一旦有极端大或极端小数据,整个范围会受到拉伸)。

z-score规范化会将整个样本映射到0均值和1方差的准正态分布状态,其优点在于:不受个别极端数据影响;其缺点在于:无法灵活控制规范化后的范围,每当加入新的元素都需要重新计算整个样本集。

2.9 试述 χ 2 \chi^2 χ2 检验的过程

卡方检验是统计学领域的知识,在此建议大家若无特别的需求,了解其在机器学习模型评估中的应用即可,具体内容请查阅统计学相关书籍。

2.10* 试述在Friedman检验中使用式(2.34)与(2.35)的区别

这篇博客简洁但清楚地叙述了该问题:https://www.cnblogs.com/daigz1224/p/7163342.html

很高兴为您解答这个问题!本次我们将学习如何用 Python 实现《机器学习周志华教授第十四中的概率图模型习题。在这里,我们将使用 Python 的 pgmpy 库来构建和分析概率图模型。 首先,我们需要安装 pgmpy。可以使用 pip 安装: ```python pip install pgmpy ``` 安装完成后,我们就可以开始实现习题了。 #### 习题 14.1 考虑一个三元组 $(X, Y, Z)$,其中 $X$ 是二元随机变量,$Y, Z$ 是一元随机变量,试构造一个无向图结构,使其成为正态分布的一个合法图模型。 我们可以使用 pgmpy 来创建这个无向图模型。代码如下: ```python from pgmpy.models import MarkovModel # 创建一个空的无向图模型 model = MarkovModel() # 添加变量节点 model.add_nodes_from(['X', 'Y', 'Z']) # 添加边 model.add_edges_from([('X', 'Y'), ('X', 'Z')]) # 将模型转换成正态分布模型 from pgmpy.factors.continuous import ContinuousFactor from pgmpy.inference import Inference # 定义正态分布的 mean 和 covariance mean = [0, 0, 0] covariance = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # 创建正态分布因子 factor = ContinuousFactor(['X', 'Y', 'Z'], mean, covariance) # 将因子添加到模型中 model.add_factors(factor) # 执行因子分解 inference = Inference(model) factors = inference.factors() ``` 在上面的代码中,我们首先创建了一个空的无向图模型,然后添加了三个变量节点 $X, Y, Z$ 和两条边 $(X, Y), (X, Z)$。接着,我们使用 `pgmpy.factors.continuous.ContinuousFactor` 来定义正态分布的 mean 和 covariance,并将其添加到模型中。最后,我们使用 `pgmpy.inference.Inference` 来执行因子分解,得到了模型中的所有因子。 #### 习题 14.2 考虑一个四元组 $(X_1, X_2, X_3, X_4)$,它们之间的关系如下图所示。试构造这个有向图结构的贝叶斯网模型。 ![image.png](attachment:image.png) 我们可以使用 pgmpy 来创建这个有向图模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向图模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X3', 'X2'), ('X4', 'X2')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向图模型,然后添加了四个变量节点 $X_1, X_2, X_3, X_4$ 和四条边 $(X_2, X_1), (X_3, X_1), (X_3, X_2), (X_4, X_2)$。最后,我们打印出了模型的边结构。 #### 习题 14.3 考虑一个五元组 $(X_1, X_2, X_3, X_4, X_5)$,它们之间的关系如下图所示。试构造这个有向图结构的贝叶斯网模型。 ![image-2.png](attachment:image-2.png) 我们可以使用 pgmpy 来创建这个有向图模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向图模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4', 'X5']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X4', 'X2'), ('X5', 'X2'), ('X5', 'X3')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向图模型,然后添加了五个变量节点 $X_1, X_2, X_3, X_4, X_5$ 和五条边 $(X_2, X_1), (X_3, X_1), (X_4, X_2), (X_5, X_2), (X_5, X_3)$。最后,我们打印出了模型的边结构。 #### 习题 14.4 考虑一个六元组 $(X_1, X_2, X_3, X_4, X_5, X_6)$,它们之间的关系如下图所示。试构造这个有向图结构的贝叶斯网模型。 ![image-3.png](attachment:image-3.png) 我们可以使用 pgmpy 来创建这个有向图模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向图模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X1', 'X2', 'X3', 'X4', 'X5', 'X6']) # 添加边 model.add_edges_from([('X2', 'X1'), ('X3', 'X1'), ('X4', 'X2'), ('X5', 'X3'), ('X6', 'X4'), ('X6', 'X5')]) # 打印模型结构 print(model.edges()) ``` 在上面的代码中,我们首先创建了一个空的有向图模型,然后添加了六个变量节点 $X_1, X_2, X_3, X_4, X_5, X_6$ 和六条边 $(X_2, X_1), (X_3, X_1), (X_4, X_2), (X_5, X_3), (X_6, X_4), (X_6, X_5)$。最后,我们打印出了模型的边结构。 #### 习题 14.5 考虑一个二元组 $(X, Y)$,其中 $X$ 是一元随机变量,$Y$ 是二元随机变量,试构造一个有向图结构,使其成为正态分布的一个合法图模型。 我们可以使用 pgmpy 来创建这个有向图模型。代码如下: ```python from pgmpy.models import BayesianModel # 创建一个空的有向图模型 model = BayesianModel() # 添加变量节点 model.add_nodes_from(['X', 'Y1', 'Y2']) # 添加边 model.add_edges_from([('X', 'Y1'), ('X', 'Y2')]) # 将模型转换成正态分布模型 from pgmpy.factors.continuous import ContinuousFactor from pgmpy.inference import Inference # 定义正态分布的 mean 和 covariance mean = [0, 0, 0] covariance = [[1, 0, 0], [0, 1, 0], [0, 0, 1]] # 创建正态分布因子 factor = ContinuousFactor(['X', 'Y1', 'Y2'], mean, covariance) # 将因子添加到模型中 model.add_factors(factor) # 执行因子分解 inference = Inference(model) factors = inference.factors() ``` 在上面的代码中,我们首先创建了一个空的有向图模型,然后添加了三个变量节点 $X, Y_1, Y_2$ 和两条边 $(X, Y_1), (X, Y_2)$。接着,我们使用 `pgmpy.factors.continuous.ContinuousFactor` 来定义正态分布的 mean 和 covariance,并将其添加到模型中。最后,我们使用 `pgmpy.inference.Inference` 来执行因子分解,得到了模型中的所有因子。 以上就是本次的答案,希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值