zoukankan      html  css  js  c++  java
  • 机器学习与数据分析课程笔记-机器学习基本概念

    什么是机器学习?

    比如这个学习机,输入是数据,输出是预测。比如要做一个模型,识别一些阿拉伯数字,输入是0-9的图片,输出是预测的那个图片

    。除了输出预测其实它还输出假设,什么是假设呢?假设是关于模型的假设,从数据中学习模型的参数,模型确定,输出就确定了。

    • 机器学习是研究算法使得它能随着由数据所计算得到的经验的累积,在一些任务.上算法的性能得以提升
    • 机器学习就是-一个基于经验数据的函数估计问题
    • 提取重要模式、趋势,并理解数据,即从数据中进行学习

    总结:机器学习从数据中学习到模型并作出预测

    机器学习的关键本质

    比如人脸识别,没法直接编程来识别人脸,人脸肯定是存在一定规律的,我们又有大量相关的数据,这时候就可以选择使用机器学习:

    • 存在一些要学习的当前的模式
    • 但是没有可编程的定义
    • 有数据

    什么时候使用机器学习?

    1.当人难以定义答案的时候,比如语音和图形的识别
    2.需要快速进行决策的时候,但是人却很难做到的时候,比如高频交易

    问答题

    以下哪个问题更适合于应用机器学习算法?
    A.预测是否下一次-一个婴儿的哭声是在奇数秒还是偶数秒?
    B.确定是否-一个给定的图包含-一个环
    C.确定是否同意某人的信用卡申请
    D.预测地球是否会因为滥用核能源在接下来的十年内被摧毁

    答案:C

    1.婴儿啼哭没有固定模式
    2.是否包含一个环,图论有相关算法
    3.是否地球被摧毁因为没有发生过,没有模式或者数据

    C可以根据年龄、职业、以往记录来计算欺诈可能性

    监督学习

    机器学习大概可以分成以下三个大类:

    • 监督学习
    • 无监督学习
    • 半监督学习

    其中监督学习是给定输入的数据xi和我们期望输出f(xi),来得到从输入到输出的函数。监督学习要学到函数g,我们希望我们学到的函数g尽可能的接近真实的函数f
    例子比如手写体识别,每一个手写体图片全都是28*28的灰度图像。

    对于手写体识别的输入是什么呢?

    1.对于手写体输入是(28*28的图片,期望输出),例如(2的图片,2)
    2.机器学习监督学习算法有一个模型假设h,θ是模型的参数,hθ代表模型,表示你用啥模型。假设用这些数据学到了这个模型,所谓的学到,就是学到了模型的参数,
    3.学到模型参数后,在给这么模型图片,这个图片和训练集中的图片是不一样的,我们希望将这个图片输入到模型中,得到的预测输出和期望是一样的。比如输入2的照片得到2,输入5的图片得到5

    监督学习实际上是从输入到输出的映射,准确的是学到模型的参数

    监督学习根据输出类型又可以分为回归和分类、结构学习。

    回归

    如果输出y是连续值(实数或连续整数),f (x)的输出也是连续值。这种类型的问题就是回归问题。
    回归就是给定输入预测输出,给定输入返回值,比如投保人将来会要的索赔金额。如果索赔风险比较高,那么价格也要高。在或者预测PM2.5值,还有预测股票价格等等。

    对于回归问题可以看出给出了很多的数据点,找一条曲线去拟合这条曲线,拟合出来这条曲线之后,给定一个输入,就可以得到输出了。回归可以理解为曲线拟合的问题。但是不止一条曲线拟合点。

    问题就来了,这么多的曲线都可以拟合点,但是可能有些误差大些有些误差小一些,每一条曲线代表一个模型,每一个模型都可以拟合到这些点,选那一条呢?
    回归要从数据中学映射函数,这个函数就是曲线,符合的函数可能不止一个,选哪个呢?

    奥卡姆剃刀法则
    若有多个假设与观察一致,则选择最简单的那个,对于这些数据点来说都是和观察一致的模型,选择最简单的那个就是直线。
    思想:越复杂的模型拟合到你这个模型的概率就越大,简单模型恰巧拟合到你这个模型的概率比较小,这个时候它又拟合到了你的模型,说明确实学到了本质。
    有多个假设和观察一致的情况下,选择和观察一致的那个。

    分类

    如果输出y是离散的类别标记(符号),就是分类问题。在分类问题中,通过学习得到的决策函数f(x)也叫分类器

    比如手写体数字的分类,学习算法返回函数。
    假如学到了一个决策函数g,那么我就希望给函数输入一个图片,我们可以的得到期望的label。如果输出结果与label一致就说明学的好,否则就学的不是特好。

    二值分类

    二值分类其实就是给定输入返回Yes和No

    比如垃圾邮件过滤器,输入邮件内容,得到是否是垃圾邮件。

    多值分类

    多值分类给定一个输入返回多个类,两个以及以上的类。

    比如网络上的文本分为各个类型,比如体育、财经、等。

    损失函数

    损失函数是学习的目标,是设计机器学习系统的核心,我们学习的目标就是使得损失函数的结果越小越好,为啥呢?因为损失函数是衡量算法输出与期望输出之间差异的,如果输出和预测完全一样,那肯定是最好了,因为模型可以预测任何情况了,但是实际上输出和期望肯定有误差的,那我们自然希望越小越好。学习算法目的是通过不断的学习,在训练数据集,使得输出和误差不断的减少,但是这还不算完,你可能训练到最后,模型在训练集上的预测结果与期望都一致了,但是在测试集上的却表现不好。就好比给你10个人的照片,告诉你这是人,你学会了,之后给你任何出现在这10个人中的照片给你看,你都能快速说出,这是人,然而给你一个陌生人的照片,你发现你没见过,却错判为这是个猴子。这说明你迁移能力差,只能认识你学过的东西,但是没法根据学过的东西的特征去预测未知的东西。这种预测未知,也就是在测试集上预测准确的能力叫做泛化能力,不局限于你见过的数据,也希望你能在没见过的数据集上表现好,也就是预测与期望一致,这就是泛化能力强。

    回归问题用的最多的损失函数是交叉熵损失函数。

    对于回归问题,一般使用均方误差损失函数:

    假设一个有m个训练样本,xi代表其中第i个训练样本,h代表的是假设,θ代表的是模型的参数,hθ(xi)将第i个样本代入模型后得到的输出,yi代表期望输出,两者相减代表要看两者差异,为何要平方呢?因为误差有正有负我们仅仅关注大小,所以取平方,将每个样本对应模型输出与期望的差加起来,除以m得到平均的误差,但是为什么要有一个1/2在前面呢?因为在训练的过程中要对该公式进行求导,所以要有个1/2来抵消乘出来的2

    对于分类问题,使用交叉熵损失函数:

    为什么使用交叉熵损失函数呢?

    因为分类问题和回归问题不一样,它最终的结果是一个label,比如你输入的是图片2,但是识别得到是9,或者3,对于9或者3来说相对与2来说误差都是一样的,都是错的。所以没法通过(9-2)或者(3-1),判断哪个误差大,哪个误差小,这样是不靠谱的。那怎么办呢?交叉熵损失函数表达的是,在给定指定的输入xi的情况下,给定输出是我们期望输出的概率越大越好,对应来说,这个式子前面加个负号,也就是希望,在该种情况下,输出损失函数得到的值越小越好。将这些概率加起来取个平均,加个负号,得到了交叉熵损失函数。

    优化问题

    在有了损失函数的概念之后,整个学习的过程就有了目标,也就是找到模型的参数θ,使得在取得参数θ的情况下,损失函数的值取得最小。其实就是从n对训练数据(训练样本xi,标签值yi),中预测模型的参数。我们都是基于训练集来设计优化函数,但是在测试集上的性能度量可能不同于训练集。比如你在训练集上98%的正确率,放到它没见过的数据集也就是测试集上,可能效果非常的差,这也是有可能的。训练模型的目的就是拿来用在没见过的数据集上的,所以我们希望尽可能它在测试集上表现也特别好。

    监督学习的流程

    1.监督学习给定的数据都是成对的,有输入数据xi和它对应的输出yi,这些一对对的样本点组成了样本集
    2.我们将这些数据样本输入给学习算法,学习算法有模型假设,通过建立优化目标进行学习,就学到了模型f
    3.用一个测试数据(x,y)来测试这个模型,给它一个x,输出是y',那我们就拿输出和期望输出y进行比较,看它们是否一致,如果不一致的话就通过优化目标降低损失值,找到使得损失函数取得最小的优化参数值,模型学好了,之后就可以使用输入来进行测试它,输入与预期是否一致
    4.治理有一个独立同分布的假设,所有样本都是从同一个分布函数,取样获得的
    5.监督学习一个重要的特点是给定了预期输出进行训练的。

    无监督学习

    无监督学习和有监督学习最大的区别在于无监督学习仅仅给出了要学习的输出,但是没有给出预期的输出。有监督学习输入的数据是成对的包括输入的数据和期望的输出。这种情况下我们依旧希望构建一个模型假设hθ,然后通过无监督学习算法来学到这样一个模型,学到模型之后就可以通过模型来做预测。我们希望模型的预测结果和期望的预测结果是一样的。

    无监督学习没有提供预期的输出,它学习的目的是学习数据的规律,或者说输入空间的某种结构。

    比如对于不同客户进行划分,目的是学习输入空间的某种结构,比如通过学习数据在分布上的结构,将数据划分成三个类。

    无监督要学习的时候要构建我们的目标,也就是损失函数,但是无监督学习没有期望的标签,在这种情况下如何构建损失函数呢?
    无监督学习采用的思想是通过优先假设类来重新创造输入。

    假设模型将n维空间的输入映射到另外一个n维空间的输出,如果假设输出和原始的输入近似相等,因为希望两者相等,就用两者减一下,二范数的平方,来构造目标函数。我们希望假设输出尽可能接近原始的输入,那么我们直接令两者相等不就可以了吗?不可以,因为学不到任何的东西。所以一方面我们希望假设输出尽可能等于原始的输入,另一个方面我们又不能直接令其直接等于原始的输入。

    K-means聚类

    K-means算法的主要目的是将输入的数据分为k类。对于输入数据的每一个类,我们找到它的中心。

    u1一直到uk是k个类的中心,为了确定任意点属于哪个类,我们仅仅需要看该点和k个中心中,哪个中心的距离是最短,那么它就属于哪个类。所以假设就定为和当前输入数据最近的类中心。

    有了该假设之后可以定义目标函数,目标函数是数据和假设之间差值的二范数的平方。

    有了目标函数之后,我们就有了优化的目标。通过优化算法可以求出模型的参数。对于k-means算法来说主要就是找到k个中心,即模型的参数,只要中心点找到了,就可以通过计算和那个中心距离最近进而得到该点属于哪个类。

    主成份分析法(PCA)

    主成分分析法是一种常见的数据降维方法。什么是数据降维呢?比如有一个维度非常高的向量,有一千维,我们希望找到一个更低维的数据来代替高维的向量,除此之外我们还希望低维的数据虽然维度没1000维的向量高,但是低维数据包含的信息尽可能和高维数据一致。低维对计算资源要求低的多,计算速度会更快。

    在求解主成分分析问题的时候,可以用两个矩阵来进行求解,两个矩阵θ1和θ2,他们两个的维度分别是nk,和kn,k是小于n的值。假设原始的时候是n维的向量,我们希望找到低维k维的向量来代替n维向量,除此之外,我们还希望k维向量包含了n维向量绝大部分原始的信息。

    假设函数构造为θ1θ2x,x是原始的输入向量它是n维的,θ2是kn的矩阵,两者相乘所得到的维度结果是k维,可以说两者相乘之后,将x从原来的n维降为了k维,再左乘以θ1(nk)之后,又恢复为了n维。我们希望恢复完的向量和原始的向量尽可能的接近。

    因此构造损失函数:
    将n维向量x降维为k维度之后再恢复为n维,看它与原始输入的差异。

    有了目标函数之后,进行优化算法来求解参数。

    强化学习

    强化学习是和人类学习最接近的方式,它主要是学习如何做一个好的序列决策。从一个状态到你想要的目标状态不是一步到位的,要经过一系列的步骤。每一步都要有行为,在学习的过程中不断和环境进行交互,并获得反馈,来学习策略,也就是在每一种状态下该如何行动。比如一个婴儿,在学习的过程中,看到火焰就去摸了,摸是一个动作,他和环境进行交互得到的是痛这个回报,他收到惩罚之后就不会再去摸了,就会调整行为和策略,之后看到火就不会去摸了。

    机器学习基本概念

    泛化

    我们训练的过程中都是基于训练集进行训练的,可能你在训练集上的表现很好,但是在测试集上表现却很差。而我们所希望的是模型可以在未见到的模型上表现的很好,因为训练样本不能覆盖所有的情况,我们希望训练集能够泛化到未见到的样本。

    过拟合

    如图所示,红色曲线是测试曲线,蓝色曲线是训练曲线,纵轴是误差,我们可以看出训练曲线的误差,随着训练次数的增加在不断的减小,而在测试数据集上误差一开始在下降,但是随着训练次数的增加,误差反而上升了。这种现象就称为过拟合。

    什么是过拟合呢?

    当学习器把训练样本学得“太好”时,很可能把训练样本的一些特 点当作了所有潜在样本都具有的性质,这样会导致泛化能力下降,这种
    那现象在机器学习中称为“过拟合”

    什么因素会造成过拟合?

    过拟合问题往往是由于模型容量过大(训练数据少)和噪声等原因造成的。

    这里列举两个分类器,该图上面的是过拟合的分类器,下面是一个训练比较好的分类器。上图的过拟合的分类器将一些点的特性当成了共性,进而得到了过于复杂的决策边界,使得对一些点的分类错误。

    过拟合往往是因为模型过于丰富了,进而把一些次要的特征也当做了共性的特征,比如识别的青蛙的例子,左边是带斑点的青蛙,右边是不带斑点的青蛙,它认为带斑点是青蛙的共性,进而认为带斑点的青蛙不是青蛙。欠拟合的模型会认为四条腿的就是青蛙,也就是误认为蜥蜴也是青蛙。

    欠拟合

    欠拟合指对训练样本的一般性质尚未学好。

    造成欠拟合的原因:
    1.模型采用的不够强大和丰富
    2.很难找到全局的最优解,而陷入局部最优解
    3.计算资源不够,迭代次数不够,模型训练的不够好

    比如如图所示,数据点是按照曲线来进行分布的,但是假如你选择使用线性模型来进行拟合的话。无论怎么拟合都难以拟合到曲线,所以这是模型不够丰富的问题。

    模型的容量

    模型的容量指的是它拟合各种函数的能力。

    以几个简单的模型来进行举例
    1.线性模型,它的参数有两个分别是斜率和截距
    2.二次函数,该模型有三个参数
    3.更为复杂的模型,十次方的多项式的函数

    这几个模型的容量由上至下是逐渐增加的,参数越多,就允许函数捕捉到更多的输入到输出的映射关系,比如十次方的多项式,它不仅仅可以拟合十次方的多项式,还可以退化成为线性模型,仅仅需要除了斜率和截距项以外剩下参数全部变为0就可以了。对于十次多项式来说,它能拟合的函数种类更多,具有更大的模型容量。

    如何度量模型的容量呢?

    • 容量能够用学习器能拟合的训练样本x(i),y(i)的数量来度量
    • 模型的容量指其拟合各种函数的能力
    • 容量不足的模型不能解决复杂任务;容量高的模型能解决复杂任务,但其容量高于任务所需时,有可能会过拟合。

    模型的复杂度

    对于参数模型来说,它的复杂度模型复杂度=权值(参数)的数量,由此我们可以知道线性模型的模型复杂度是比二次模型复杂度高。
    关于模型的复杂度还有一些其他的细节:

    • 如果参数为0,则它对复杂度的贡献也为0;
    • 小的参数对复杂度的贡献要小于大的参数)

    教训

    如果我们的目标是在新的数据集上获得优化的准确度,则我们仅仅最小化在训练数据集.上的损失是不够的
    为了达到这这个目标,我们需要在三方面进行权衡,进而达到一个平衡点。

    • 数据量
    • 拟合数据的模型的复杂度
    • 模型在新数据点上的准确度

    如图所示,是模型的性能随着数据量、和模型复杂度变化的情况,纵轴代表损失或者误差,横轴代表的是复杂度。从左到右是模型的复杂度,随着模型复杂度增加,损失先减小后增大,有一个临界点,超过临界点,模型相对当前任务过于复杂的时候会发生过拟合。对于每一个数据量来说都有一个临界点,当模型复杂度超过这个临界点后就会发生过拟合。如何防止模型发生过拟合呢?通过正则化技术来防止过拟合!

    正则化

    通过正则化来控制模型的复杂度,如果模型的参数数量越多,那么它的复杂度就越大,除此之外模型的某个参数越大,它对模型复杂度贡献就越大,如果模型的参数为0的话,那么它对于模型的复杂度是没有贡献的。正则化方法是通过惩罚模型参数的绝对值来控制模型的复杂度,如何惩罚模型参数的值呢?在模型的损失函数内加入额外的项,就是正则化项,该项是当前模型参数的平方和。我们知道监督学习的时候,要设置优化目标,通过学习来找到使得优化目标最小的参数,增加正则化项之后,我们希望整个损失函数值小,那么模型参数值就不可能大了。进而约束模型参数值小,进而模型的复杂度就会降低。

    • 正则化项前面λ是正则化系数
    • 给定例子是神经网络的优化目标
    • 训练过程要计算该函数导数,求导的过程中加了正则化项给损失函数带来的导数变化是2λΣwi^2,对于神经网络有一个特殊称呼给它叫做权值衰减

    正则化系数如何选取?

    采用交叉校验的方法。
    1.首先将数据集分成两个子集,分别叫做训练集和验证集
    2.我们要从一堆正则化系数λ1,λ2,λ3,λ4...λn选正则化系数
    3.在优化的过程中,基于训练集训练,基于验证集来进行验证,看取那个λ值使得损失值最小

    k重交叉校验。

    1.将训练集分成k个相等子集
    2.运行算法k次,每次用一个子集作为测试集,其他作为训练集
    3.对于每一个λ值,都运行k次,计算平均运行的数据集上损失值,对每个λ对应平均损失值进行对比,选取λ

    偏差方差权衡

    如果我们训练一个模型,我们往往通过实验来验证该模型的泛化性能,但是我们希望有一个工具来解释模型的泛化性能,偏差方差分析就提供了这样一个工具来解释模型的泛化性能。

    比如以手写体数字识别为例:

    我们输入的手写体数字的图片,f^是我们希望找到的从输入到输出的映射,其中f*是我们从数据中找到的从输入到输出的近似。

    f*和f^之间是存在距离的,一般来说该距离代表模型的误差,误差包含两项,一个是方差项,另外一个是方差项。

    要了解模型的偏差方差,首先从概率论关于一个变量的偏差方差计算看起:

    假设我们要预测一个变量x的均值μ和方差σ^2:

    对均值进行估计

    1.计算均值μ的话,随机采样数值{x1,x2,...,xn},求均值m

    2.不同次实验采用的值,都不一样,进而均值都不同,我们对每次实验的均值再求期望

    3.每一个m分布在μ的周围,分布的分散程度就用m的方差来衡量,因为它的期望为μ,那就称其为无偏估计

    4.用方差来衡量在m分布在u周围的分散程度,方差依赖于样本个数,样本个数越多,方差就越小

    对方差进行估计

    1.对方差进行估计要在均值的基础上,计算s2来估计σ2

    2.s2计算,用每一个x和m的差,计算平方求期望得到s2的期望

    3.做多次实验,每次用不同n,得到多个s,用多个s求期望

    假设我们打靶,靶心的位置就是我们期望要找的f,从训练集中获得模型,我们称为f*,如果做多次实验,每次用具有相同样本数据的数据集,但是数据集之间的样本都不一样,来多次训练,得到多个f*,对于多个f*我们可以得到均值f-.,f-和f距离叫做偏差。打靶的过程中我们实际瞄准是是f-的位置,f*在f-周围分布情况的衡量标准是方差。

    偏差:模型的期望输出与真实的标记之间的差别,称为偏差。

    训练集x上, f(x;D)为在训练集D.上学得的模型在x.上的输出,以归顶测为例,学习算法的期望预测为:

    期望输出与真实输出的差别:

    为什么会有偏差?

    是由于模型无法表达数据的全部复杂度所引起,模型太简单了,没法捕捉到数据的复杂度

    方差:度量同样大小的训练集变动所导致的学习性能的变化性,刻画了数据扰动所造成的影响)

    使用样本数相同的不同的训练集产生的方差为:
    var(x)=Ep[(f(x;D)- f(x) )2]

    • 方差是当使用不同训练数据时,所预测的目标函数的变化量
    • 方差产生典型原因的是由于模型相对于数据太复杂所引起的

    模型的全部误差可分为偏差项的和方差项的和:

    如上图,做了100次实验,每次实验数据集数据量一样,数据不一样,得到100个模型。从上图可以知道模型越简单,模型之间差异越小,模型越复杂,模型之间差异越大


    简单模型对应小的方差,复杂模型对应大的反差

    模型越复杂偏差越小,方差越大,我们需要在蓝色曲线上找到最低点,就是找到偏差方差都比较小

    偏差和方差是一个矛盾的概念,我们减少方差,就会增大偏差,减少偏差,会增大方差,我们需要找到平衡点

    • 偏差比较大的时候,要重新设计模型,可能模型太简单了捕捉不到真正模型,应当选择更复杂的模型。

    • 方差比较大的时候,首先用更多的数据来训练模型,或者增加正则化项。

    没有免费午餐定理

    若考虑所有问题,则所有学习算法都一样好,如果我们想设计一个可以解任何问题的算法,这样的算法是不存在的。

    • 重要前提条件:所有问题出现的机会相同,或所有问题同等重要
    • 说明:没有通用学习器,即没有学习器能在所有任务.上学习成功;
    • 谈论学习算法的优劣,必须针对具体的学习问题
    • 利用对特定学习任务的先验知识,这样的先验知识可以利用限制假设类来表示。
    • 如何选择假设类? ---希望所选定的假设类在给定数据上误差小,另一方面又不能太复杂

    iid假设

    对所有样本的iid假设:所有样本构成样本空间;:假定样本空间中所有样本服从一个未知的分布D,每个样本都是独立
    地从这个分布上采样获得的,即“独立同分布"

    学习过程可看作为在所有的假设组成的空间中进行搜索的过程。

  • 相关阅读:
    kettle处理未发现hadoop插件问题
    文档公式编辑神器-Snip
    hive -e执行出现「cannot recognize input near '<EOF>' in select clause」问题
    hive从本地导入数据时出现「Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask」错误
    K-Means算法的Python实现
    kettle并行运行时出现「Unknown error in KarafBlueprintWatcher」
    初识 Kafka Producer 生产者
    一次 RocketMQ 进程自动退出排查经验分享(实战篇)
    再谈 RocketMQ broker busy(实战篇)
    RocketMQ 升级到主从切换(DLedger、多副本)实战
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/12885947.html
Copyright © 2011-2022 走看看