西瓜书/南瓜书_学习笔记_1

注:成文基本是以原文为主,加上自身的举例和批注

1.1 绪论

        机器学习所研究的主要内容,是关于在计算机上从数据中产生“模型(model)”的算法,即“学习算法”(learning algorithm)。可以说,机器学习是研究关于算法的学问。

注:下述“模型”泛指从数据中学习的结果,有文献用“模型”指全局性结果(例如一棵决策树),而用“模式”指局部性结果(例如一条规则)。

1.2 基本术语

        设想我们有一个西瓜(之后举例基本都以西瓜为主,这也是叫西瓜书的原因),一个西瓜有色泽(青绿、乌黑、浅白)、根蒂(蜷缩、稍蜷、硬挺)、敲声(浊响、沉闷、清脆)等特点,以此将每个西瓜区分开来。我们把这些特点写为(色泽=青绿;根蒂=蜷缩;敲声=浊响)的形式,这些记录的集合就是所谓的“数据集”(data set)。

每个记录是对一个西瓜的描述——“示例”(instance)或“样本”(sample);

”色泽“、”根蒂“、”敲声“这类反应西瓜的特点的描述——属性(attribute)或特征(feature);

属性上的取值“青绿”“乌黑”——“属性值”(attribute value);

属性张成的空间——”属性空间“(attribute space)、“样本空间”(sample space)或“输入空间”。        

        如果我们把特征(”色泽“、”根蒂“、”敲声“)作为坐标系的三个坐标轴的话,可以在坐标空间中,对每一个西瓜都找到点使之对应,因此,每一个样本也可以用向量形式表示,也就是“特征向量”。特征向量在之后的计算中会常常出现,比如回归算法中就会进行矩阵乘法来计算costfunction

Halfrost-Field/contents/Machine_Learning/Multivariate_Linear_Regression.ipynb at master · halfrost/Halfrost-Field · GitHub

        从数据中学得模型的过程称为“学习”(learning)或”训练“(training)(eg: 我们学习挑出好瓜的过程);

过程中的数据集称为“训练数据”(training data)(eg: 买来的一堆瓜);

样本称为一个“训练样本”(training sample)(eg: 即从西瓜堆里挑出来的一个西瓜);

样本集合称为“”训练集“(training set)(eg:所有已经被挑出来,用于学习如何挑瓜的西瓜);

我们建立的这个模型,事实上反应了一种潜在规律(eg: 即好瓜与其特征的联系),称为”假设“(hypothesis);

而这个规则本身(eg: 即事实上,好瓜到底和什么有关)则称 为"真相"或"真实"(ground-truth);

学习过程就是为了找出或逼近真相。模型也可称为"学习器"(learner),可看作学习算法在给定数据和参数空间上的实例化.

       

      现在,我们要建立一个挑西瓜模型,来帮我们分辨瓜的好坏,当然,是在切开瓜之前,也就是说,这是一种预测(prediction)。要建立这样的关于"预测"(prediction)的模型,我们需获得训练样本的"结果"信息(eg:"((色泽:青绿;根蒂二蜷缩; 敲声=浊响),好瓜)"),这里关于示例结果的信息,其中的"好瓜",称为"标记"(label);拥有了标记信息的示例,则称为"样例"(example)。

        一般地,用(Xi,Yi)表示第i个样例,其中是示例Xi的标记,Y是所有标记的集合, 亦称"标记空间"(label space)或"输出空间”。 

若我们欲预测的是离散值(eg:"好瓜""坏瓜"),此类学习任务称为 "分类"(classification);

若欲预测的是连续值(eg: 西瓜成熟度0.95、0.37), 此类学习任务称为"回归"(regression)。

对只涉及两个类别的"二分类"(binary classification)任务,通常称其中一个类为"正类"(positive class), 另一个类为"反类"(negative class);涉及多个类别时,则称为"多分类"(multi-class classificatio)任务。

        一般地,预测任务是希望通过对训练集{(X1'Y1), (X2, Y2),..., (Xm, Ym)}进行学习,建立一个从输入空间X到输出空间Y的映射f:X→Y。对二分类任务,通常令Y= {-1,+1}或{0,1};对 多分类任务,IYI>2;对回归任务,Y=lR,lR为实数集。

        学得模型后,使用其进行预测的过程称为"测试"(testing),被预测的样本 称为“测试样本"(testing sample)。例如在学得f后,对测试例X,可得到其预测标记y=f(x)。 

       想想现实中我们会如何处理一大堆西瓜,显然,现根据它们自身的一些特点把它们分开成A组是个好主意,而这,就是所谓的"聚类"(clustering),被根据自身特征分开的每一组西瓜称为"簇"(cluster)。需要注意的是,分类的过程中,我们并不知道这些特征叫什么,意味着什么,我们只是看它们不一样或一样,就直接分开。也就是说,我们没有给这些特征以标记信息,而这就是无监督学习。

       根据训练数据是否拥有标记信息,学习任务可大致划分为两大类"监督学习“(supervised learning)和"无监督学习"(unsupervised learning)。分类和回归是前者的代表,而聚类则是后者的代表。

        我么进行这些模型预测和计算,和现实中积累经验类似。你挑了很多瓜,来看它们是不是好瓜,增强了你辨别好瓜的能力,但终究,你的目的是下一次买瓜的时候,可以不打开就挑到好瓜。同样,这也就是机器学习的目标,是使学得的模型能很好地适用于"新样本", 而不是仅仅在训练样本上工作得很好,这种能力就称为"泛化"(generalization)能力,用于判断一个模型能否很好的应用于整个样本空间,也就是你学来的挑瓜技巧能不能去哪一家水果店都适用。

        通常假设样本空间中全体样本服从一个未知"分布"(distribution) Ð,我们获得的每个样本都是独立地从这个分布上采样获得的,即"独立同分布"(independent and identically distributed,简称i.i.d.)。一般而言,你买瓜的次数越多,你就越会挑出好瓜。同样的,训练样本越多,我们得到的关于D的信息越多,这样就越有可能通过学习获得具有强泛化能力的模型。

1.3假设空间

归纳(induction):从 特殊到一般的"泛化"(generalization)过程,即从具体的事实归结出一般性规 律。例如,从样例中学习,也就是学习挑瓜。因此亦称 "归纳学习"(inductive learning)。

横绎(deduction):从一般到特殊的"特化"(specialization)过程,即从基础原理推演出具体状况。例如,在数学公理系统中,基于一组公理和推理规则推导出与之相洽的定理。也就是从决定瓜的好坏的理论,实现挑出好瓜。

        广义的归纳学习大体相当于从样例中学习, 而狭义的归纳学习则要求从训练数据中学得概念(concept),因此亦称为"概念学习"或"概念形成"。概念学习技术目前研究、应用都比较少,现实常用的技术大多是产生"黑箱"模型(可参考:黑箱模型_ZJJ啥都学不会的博客-CSDN博客)。

         概念学习中最基本的是布尔概念学习,即对"是""不是"这样的可表示为0或1的布尔值的目标概念的学习。例如:

                                     

我们的目标还是挑出好瓜。暂且假设只要某个瓜的"色泽""根蒂" "敲声"这三个特征取值明确, 我们就能判断出它是不是好瓜。于是我们可以得到:
                        

                                好瓜↔(色泽=?)⋀(根蒂=?)⋀(敲声=?)

由此可得,这个问题的假设空间为4*4*4+1=65,其中1代表世上没有好瓜的情况,剩下的三个特征各有三种取值,外加一种特征为无关条件的情况,例如,色泽可能与是否为好瓜无关,此时以通配符” * “代表取值。

        可以有许多策略对这个假设空间进行搜索,例如自顶向下、从一般到特殊, 或是自底向上、从特殊到一般。搜索过程中可以不断删除与正例不一致的假设、和(或)与反例一致的假设。最终将会获得与训练集一致(即对所有训练样本能够进行正确判断)的假设,这就是我们学得的结果。 需注意的是,现实问题中我们常面临很大的假设空间,但学习过程是基于有限样本训练集进行的,因此,可能有多个假设与训练集一致,即存在着一个与训练集一致的"假设集合",我们称之为"版本空间"(version space)。例如, 在西瓜问题中,与表1.1训练集所对应的版本空间如图1.2所示:

详细推理可参考:【机器学习】假设空间与版本空间_小天才才的博客-CSDN博客

大致可以理解为,给定一个正例,如((色泽=浅白,根蒂=*,敲声=浊响),好瓜),以此为基础,去除所有色泽和敲声与好瓜不一致的假设。当然,实际好瓜不会只有一种,所以仅是举例。

1.4 归纳偏好

        通过上述的推导,似乎挑瓜问题已经解决了,但是,图1.2的西瓜版本空间也给我们带来一个麻烦:假如现在有三个与训练集一致的假设,但与它们对应的模型在面临新样本的时候,却会产生不同的输出。例如,对(色泽口青绿; 根蒂=蜷缩;敲声=沉闷)这个新收来的瓜,如果我们采用的是"好瓜=(色泽=*)⋀(根蒂=蜷缩)⋀(敲声=*)”,那么将会把新瓜判断为好瓜;而如果采用了另外两个假设,则判断的结果将不是好瓜。那么,应该采用哪一个模型呢?

         若仅有表1.1中的训练样本,则无法断定上述三个假设中哪一个"更好“, 然而,对于一个具体的学习算法而言,它必须要产生一个可以判断好坏的模型。这时,学习算法本身的"偏好"就会起到关键的作用。

        例如,若我们的算法喜欢"尽可能特殊"的模型,则它会选择"好瓜=(色泽=*)⋀(根蒂=蜷缩)⋀(敲声=浊晌)"; 但若我们的算法喜欢"尽可能一般"的模型,并且由于某种原因它更"相信" 根蒂,则它会选择"好瓜=(色泽=*) ⋀ (根蒂=蜷缩)⋀(敲声=*)" 。

        就和你在现实中会更倾向于相信某一种特征来决定瓜的好坏一样,机器学习算法在学习过程中也会有对某种类型假设的偏好,称为"归纳偏好"(inductive bias) , 或简称为"偏好"。 任何一个有效的机器学习算法必有其归纳偏好,正如你一样,否则它将被假设空间中在训练集上"等效"的假设所迷惑,而无法产生确定的学习结果。就以上面的为例,假如没有偏好,我们的挑西瓜学习算法产生的模型每次在进行预测时随机抽选训练集上的等效假设,那么对这个新瓜"(色泽=青绿;根蒂口蜷缩;敲声=沉闷)",学得的模型时而会告诉我们它是好的、时而告诉我们它是不好的,这样的学习结果显然没有意义。

         归纳偏好的作用在图1.3这个回归学习图示中可能更直观。这里的每个训练样本是图中的一个点(x,y),要学得一个与训练集一致的模型,相当于找到一 条穿过所有训练样本点的曲线。就和你在做数学题的时候,根据给定的数据做出一张函数图像一样。显然,对有限个样本点组成的训练集,存在着很多条曲线与其一致,也就是上面所说的,表面等效的算法,它们会影响我们的判断。因而,我们的算法必须有某种偏好,才能产出它认为"正确"的模型。例如,若认为相似的样本应有相似的输出(例如,在各种属性上都很相像的西瓜,成熟程度应该比较接近),则对应的学习算法可能偏好图1.3中 比较"平滑"的曲线A而不是比较"崎岖"的曲线B。

                       

        人对某种事物产生判断和人本身的价值观有很大的联系,像是人形成价值观,算法也需要形成”偏好",来帮助形成对事物的判断和认知。奥卡姆剃刀(Occam's razor)(参考极简主义的思想内核-奥卡姆剃刀原则_奥卡姆剃刀是一种极简主义吗_Wanderer001的博客-CSDN博客)是一种常用的、自然科学 研究中最基本的原则,一句话概括就是“如无必要,勿增实体”,放在我们的讨论语境下即"若有多个假设与观察一致,则选最简单的那个"。

        就以上图而言,假如我们认为,越平滑越简单,即上图的A曲线,作为二次函数,它的确很简单。但是,相信你也能看出来,这样的理论,反例一举一大把。

         然而,奥卡姆剃刀并非唯一可行的原则,而且奥卡姆剃刀本身就存在不同的诠释,使用奥卡姆剃刀原则并不具备绝对的普适性。例如对我们已经很熟悉的西瓜问题来说,“假设1:好瓜= (色泽=*) ⋀  (根蒂=蜷缩)⋀(敲声=浊响)”和假设2: "好瓜=(色泽=*) ⋀ (根蒂=蜷缩)⋀(敲声=*)"这两个假设,哪一个更"简单"呢?

        这个问题并不简单,需借助其他机制才能解决。 或者说,仅以目前的标准,是无法判断两者孰优孰劣的。事实上,归纳偏好对应了学习算法本身所做出的关于"什么样的模型更好"的假设。

假设是否成立,即算法的归纳偏好是否 与问题本身匹配,大多数时候直接决定了算法能否取得好的性能。

        说人话就是,具体问题具体分析

        让我们再回头看看图1.3。假设学习算法基于某种归纳偏好产生了对应 于曲线A的模型,学习算法基于另一种归纳偏好产生了对应于曲线B的模型。基于前面讨论的平滑曲线的某种"描述简单性",我们满怀信心地期待算法更好。确实,图1.4(a)显示出来与B相比,A与训练集外的样本更一致;换言之,A的泛化能力比B强。

        但是事实真的如此吗?

        为简单起见,假设样本空间X和假设空间H都是离散的.令P(hIX,) 代表算法基于训练数据X产生假设h的概率,再令f代表我们希望学习的、真实目标函数的 '"训练集外误差",即鸟在训练、集之外的所有样本上的误差为

        

E代表的是期望,ote我查到是off_training_error的意思,加起来就是对训练外误差的数学期望;

就是算法A;

X是指数据集,也就是样本空间,就是我们拿到手的那一堆西瓜;

f代表希望学得的真实目标函数,其实这里的这个函数也不是唯一的,是根据X样本空间产生的,它自身就存在一个函数空间,采用的是均匀分布分布在空间上,而均匀分布就是我们得出这一部分结论的关键;

: h是假设的意思,这里是因为学习算法对于训练数据X是可能产生多个假设的,就是算法会对好瓜的判断标准生成很多个,且不同的假设都有有不同的产生概率,所以有这个表达式,放在一起理解就是,按照La算法,对样本空间X上的样本生成了假设h,每个h有各自生成的概率P(h)然后对它们求和。

对样本空间X外的所有样本,进行右侧运算后,求和。

P(X):应该是指每一种样本被取到的概率大小;

是指示函数,真则返回1,假则返回0;

h(x) != f(x)比较好理解,就是你的模型算出来的准不准,就是说你判断这个瓜是不是好瓜,判断对了没有。

而此处f的数量的话,因为对每一个样本x,f都有两种结果,即{0,1},所以总共有个f函数

最后一部分上面也说过了。

要计算这个式子的话,我们先分解一下,它事实上可以排成这个样子:

也就是对于X之外的x选到的概率先求和,也就是使用训练集之外的样本进行测试,乘上所有假设出现概率的和,再乘上所有f进行判断对错后,返回的{0,1}求和的结果。

这一部分和实际值紧密相关,所以我们先放下,

其实很好理解,就是概率论的知识,个人感觉有点儿像概率函数求下面的面积,其实就是1

这一部分的话,上面说了,h按照均匀分布,也就是1和0的比例为1:1,那么,既然总共有个f,求和结果就是

所以最后我们可以得到

参考:机器学习周志华--没有免费的午餐定理_没有免费的午餐定理案例_蓝域小兵的博客-CSDN博客

此时,我们惊讶地发现,这是个只与P(X)有关的函数啊,和La算法长什么样一点儿关系没有啊,这也就是所谓的没有免费的午餐定理。

说人话就是,不可能存在什么情况下都最优的算法。表现在我们的算法中就是,不管La多精密,Lb多乱来,期望只与X有关。

但是,我们要注意到一个问题,就是这种情况下,我们少考虑了很多因素。

(1)我们现在把所有可能的问题和假设全部纳入考虑了,事实上,我们只会针对某一个问题。

也就是这一项,它事实上是否等于1是个未知数。

(2)我们在考虑h(x)!=f(x)的时候,假设它是均匀分布的,显然不可能每一种问题,都是均匀分布的。

课后题:

思路来源:《机器学习》(西瓜书)课后习题答案 第一章-绪论 - 知乎 (zhihu.com)

1.1 表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间。

说只含1和4的样例,我们先写出这种情况下的数据集:

编号色泽根蒂敲声好瓜
1青绿蜷缩浊响
4乌黑稍蜷沉闷

删除与1不一致的,同时删除与4一致的,得到:

1.(色泽=青绿)∧(根蒂= ∗ )∧(敲声= ∗ )

2.(色泽= ∗ )∧(根蒂=蜷缩)∧(敲声= ∗ )

3.(色泽= ∗ )∧(根蒂= ∗ )∧(敲声=浊响)

4.(色泽=青绿)∧(根蒂=蜷缩)∧(敲声= ∗ )

5.(色泽=青绿)∧(根蒂= ∗ )∧(敲声=浊响)

6.(色泽= ∗ )∧(根蒂=蜷缩)∧(敲声=浊响)

7.(色泽=青绿)∧(根蒂=蜷缩)∧(敲声=浊响)

1.2 与使用单个合取式来进行假设表示相比,使用“析合范式”将使得假设空间具有更强的表示能力。若使用最多包含k个合取式的析合范式来表达表1.1西瓜分类问题的假设空间,试估算有多少种可能的假设。

        单个合取式在不包含“ * ”的情况下,共有2*3*3=18种情况,对应每一个特征有无,即取1或0,所以总共的假设数量就是2^18种(这里我的理解是,把“*”的含义,分给了每一个特征所属的几种情况,比如根蒂有三种可能的情况,假设前两种情况下是好瓜,则(1,1,0),以此类推,得到总数)。这样我们就得到了2^18的一个特征空间,18维向量的任何一维不同,即可认为是两种假设。在代码实现中,我们可以先用三维向量对应三种特征进行数据装载,再把它们转换为18维向量:

def get_18(data): #把三维向量变为代表特征组合的18维向量
    feature_set = np.zeros([2,3,3])
    if data[0] == 0:  #对于第一种属性为"*"的情况,分散到两种赋值上
        f1 = [1,2]
    else:
        f1 = [data[0]]
    if data[1] == 0:  #对于第二种属性为"*"的情况,分散到三种赋值上
        f2 = [1,2,3]
    else:
        f2 = [data[1]]
    if data[2] == 0:  #对于第三种属性为"*"的情况,分散到三种赋值上
        f3 = [1,2,3]
    else:
        f3 = [data[2]]
    for m1 in f1:
        for m2 in f2:
            for m3 in f3:
                a[m1-1][m2-1][m3-1] = 1
    feature_set = feature_set.flatten()
    return feature_set       #转换为了特征组合的18维向量

        如果要以析取范式的形式表示,比如”(色泽=青绿)∧(根蒂= ∗ )∧(敲声= ∗ )“,可以看到,在这何种情况下,“*”不能被省略,则共有3*4*4=48种情况。所以我们现在需要做的就是构建一个函数,进行每个18维向量对析取范式的对应:

def from_48_to_18(num):  #把0-47的某个数唯一对应到某个18维向量
    data = turn_48_to_trible(num) # num in [0,47],把一个小于48的数字对应到一个三维数组中
    a = get_18(data)
    return a

        根据之前分析的,假设空间的组成,我们可以对48个析取范式进行取并操作,类似上面分析假设空间用的“自顶向下、从一般到特殊, 或是自底向上、从特殊到一般”思路,将所有可能是好瓜的特征项合并。因为我们的取法是48中取k个,我们最后可以得到个18维向量,去重后即可得到最终答案。

import numpy as np
import itertools as it
import time
def get_18(data): #把三维向量变为代表特征组合的18维向量
    feature_set = np.zeros([2,3,3])
    if data[0] == 0:  #对于第一种属性为"*"的情况,分散到两种赋值上
        f1 = [1,2]
    else:
        f1 = [data[0]]
    if data[1] == 0:  #对于第二种属性为"*"的情况,分散到三种赋值上
        f2 = [1,2,3]
    else:
        f2 = [data[1]]
    if data[2] == 0:  #对于第三种属性为"*"的情况,分散到三种赋值上
        f3 = [1,2,3]
    else:
        f3 = [data[2]]
    for m1 in f1:
        for m2 in f2:
            for m3 in f3:
                a[m1-1][m2-1][m3-1] = 1
    feature_set = feature_set.flatten()
    return feature_set       #转换为了特征组合的18维向量
def turn_48_to_trible(num):# num in [0,47],把一个小于48的数字对应到一个三维数组中    
    i = num//16
    j = num%16//4
    k = num%16%4
    return [i,j,k]
def from_48_to_18(num):  #把0-47的某个数唯一对应到某个18维向量
    data = turn_48_to_trible(num)
    feature_set = get_18(data)
    return feature_set
def main(k):
    hypo_list=[]
    for i in it.combinations(range(48),k):
    #开始对48取k的组合数进行穷举,i是一个k元数组,其中每个元素都是0-47中的某个数,代表(A1,A2,*)(B1,B2,B3,*)(C1,C2,C3,*)的一个组合
        subset = 0
        for j in range(k):
            p = i[j]
            subset = subset | hypo48_oct[p]
        hypo_list.append(subset)
        if len(hypo_list) > 5000000:
            hypo_list = list(set(hypo_list))  #set是集合,是对rset数组进行去重!
            #设置500W上限为了防止set操作时数组长度太长导致程序崩掉
    hypo_list = list(set(hypo_list)) #最终set操作一下得到最终结果
    print("正好包含%d个合取式的析合范式能表示 : %d 种假设" % (k, len(hypo_list)))
    return(hypo_list)

hypo48 = []
for i in range(48):
    h = from_48_to_18(i)
    hypo48.append(h)
hypo48_oct = []
for hypo in hypo48:
    hypo_bin = '0b'
    for i in hypo:
        hypo_bin = hypo_bin + str(int(i))
    hypo_oct = eval(hypo_bin)
    hypo48_oct.append(hypo_oct)

start = time.time()
hypo_stack = []
for k in range(18):
    k = k+1
    hypo_list = main(k)
    hypo_stack = hypo_stack + hypo_list
    hypo_stack = list(set(hypo_stack))
    end = time.time()
    print( "最多包含%d个合取式的析合范式能表示 : %d 种假设"%(k,len(hypo_stack)+1))  #加1是因为还有空集这个假设,即不存在好瓜
    print("用时:%.2fs"%(end-start))

1.3 若数据包含噪声,则假设空间中有可能不存在与所有训练样本都一致的假设。在此情形下,设计一种归纳偏好用于假设选择。

(1)选取满足最多样本的那种假设,就是可以在训练集中挑出最多好西瓜的那种。

(2)也可以选择准确率最高的一种,即挑出来的好瓜占挑出来的瓜的数量最多的一种假设。

1.4 本章1.4节在论述“没有免费的午餐”定理时,默认使用了“分类错误率”作为性能度量来对分类器进行评估。若换用其他性能度量 ,则式(1.1)将改为

试证明“没有免费的午餐定理”仍成立。

和上面的思路类似,先把提出来,放到一边,然后再把提出来,也放在一边,所以我们可以看到,需要考虑的其实就是l(h(x),f(x))一项,

在证明定理之前,先构造一个引理:
引理1:在二分类问题下,对任意性能度量指标,为某一常数。
证:对于二分类问题,任意性能度量中的正确分类得分与错误分类得分应该是固定的。即:
l(0,0)=l(1,1),l(0,1)=l(1,0)
因此

l(0,0)+l(0,1)=l(1,1)+l(1,0)

设l(0,0)+l(0,1)=l(1,1)+l(1,0)=A
即可得l(h(x)=f(x))+l(h(x)≠f(x))=A

所以原式中的l()项,就是一个常数A,那么结合之前的推导,E仍然只和P(X)有关,所以仍成立。

(引理推导:《机器学习》(周志华)第一章课后习题参考答案_试述机器学习能在互联网搜索的哪些环节起作用_零食i的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值