zoukankan      html  css  js  c++  java
  • 机器学习概览

    第一章 机器学习概览

    1 什么是机器学习

    机器学习是一门能够让编程计算机从数据中学习的计算机科学(和艺术)。

    略微笼统定义:
    机器学习研究如何让计算机不需要明确的程序也能具备学习能力。 —— Arthur Samuel,1959

    偏工程化定义:
    一个计算机程序在完成任务T之后,获得经验E,其表现效果为P,如果任务T的性能表现,也就是用于衡量的P,随着E的增加而增加,可以称其为学习。 —— Tom Mitchell,1997

    2 为什么要使用机器学习

    人工编写规则 :程序复杂,难以维护,容易出错,更新麻烦,甚至无法找到规则。
    机器学习 :程序简短,易于维护,更准确,自动更新,自动寻找规律。

    数据挖掘 :应用机器学习技术来挖掘海量数据,发现模式。

    3 机器学习系统的种类

    3.1 监督式/无监督式学习

    根据训练期间接受的监督数量和监督类型分类:监督式学习、无监督式学习、半监督式学习和强化学习。

    3.1.1 监督式学习

    在监督式学习中,提供给算法的包含所需解决方案的训练数据,称为 标签 或 标记 。

    属性 是一种数据类型,特征 是属性加上其值。

    典型的监督式学习任务:分类 和 回归 。

    算法:

    • K-近邻算法(k-Nearest Neighbors)
    • 线性回归(Linear Regression)
    • 逻辑回归(Logistic Regression)
    • 向量机(Support Vector Machine, SVM)
    • 决策树和随机森林(Decision Trees and Random Forests)
    • 神经网络(Neural networks)

    3.1.2 无监督式学习

    无监督式学习的训练数据都是未经标记的。系统会在没有老师的情况下进行学习。

    算法:

    聚类

    • k-平均算法(k-Means)
    • 分层聚类分析(Hierarchical Cluster Analysis, HCA)
    • 最大期望算法(Expectation Maximization)
    • 可视化和降维
    • 主成分分析(PCA)
    • 核主成分分析(Kernel PCA)
    • 局部线性嵌入(LLE)
    • t-分布随机近临嵌入(t-SNE)
    • 关联学习
    • Apriori
    • Eclat

    3.1.3 半监督式学习

    有些算法可以处理部分标记的训练数据——通常是大量的未标记数据和少量的标记数据。这称为半监督式学习。

    大多数半监督式算法是无监督式和监督式算法的结合。例如深度信念网络(DBN),它基于一种互相堆叠的无监督式组件,这个组件叫作受限玻尔兹曼机(RBM)。受限玻尔兹曼机以无监督是方式进行训练,然后使用监督式学习对整个系统进行微调。

    3.1.4 强化学习

    强化学习的学习系统(智能体)能够观察环境,做出选择,执行操作,并获得回报(reward),或者是以负面的形式获得惩罚。
    所以它必须学习什么是最好的策略(policy),从而随着时间推移获得最大的回报。策略代表智能体在特定的情况下应该选择的操作。

    机器人学习行走、AlphaGo。

    3.2 批量学习和在线学习

    根据系统是否可以从传入的数据流中进行增量学习。

    3.2.1 批量学习

    在批量学习中,系统无法进行增量学习——即必须使用所有可用数据进行训练。
    这需要大量时间和资源,所以通常情形下,都是离线完成的。

    离线学习:先训练系统,然后将其投入生产环境,这时学习过程停止,它只是将其所学到的应用出出来。

    如果希望批量学习系统学习新数据,你需要在完整数据集(不仅仅是新数据,还要包括旧数据)的基础上重新训练一个新版本的系统,然后停用旧系统,用新系统取而代之。

    这个解决方法比较简单,但是每次需要全套的数据集进行训练,资源耗费大,实时性差。

    3.2.2 在线学习

    在在线学习中,你可以循序渐进地给系统提供训练数据,逐步积累学习成果。
    这种提供数据的方式是单独的,也可以采用小批量(mini-batches)的小组来进行训练。每一步学习都很快速且便宜,所以系统就可以根据飞速写入的最新数据进行学习。

    在线学习系统的一个重要参数是其适应不断变化的数据的速度,这就是所谓的 学习率 。
    如果设置的学习率很高,那么系统将会迅速使用新数据,但同时也会很快忘记旧数据。反过来,如果学习率很低,系统会有更高的惰性,也就是说,学习会更缓慢,同时也会对新数据中的噪声或者非典型数据点的序列更不敏感。

    3.3 基于实例与基于模型的学习

    • 根据“简单地将新的数据点和已知的数据点进行匹配,还是对训练数据进行模式检测,然后建立一个预测模型”可分为(基于实例的学习和基于模型的学习)

    3.3.1 基于实例的学习

    系统完全记住学习示例(example),然后通过某种相似性度度量方式将其泛化到新的实例。

    3.3.2 基于模型的学习

    构建这些示例的模型,然后使用该模型进行预测。

    过程:
    学习数据
    选择模型
    使用训练数据进行训练(即前面学习算法搜索模型参数值,从而使成本函数最小化的过程)
    最后,应用模型对新示例进行预测(称为 推断 )

    注意这些标准之间互相并不排斥,你可以更具具体需求将其进行组合,例如:现在最先进的垃圾邮件过滤器可能是通过使用深度神经网络模型对垃圾邮件和常规邮件进行训练,完成动态学习。这使其成为一个在线的、基于模型的、监督式学习系统

    4 机器学习的主要挑战

    主要任务是选择一种学习算法对数据进行训练 => 挑战:“坏算法”,“坏数据”

    4.1 训练数据的数量不足

    大部分的机器学习算法需要大量的数据才能正常工作。

    一般来说,对复杂问题而言,数据比算法更重要。

    4.2 训练数据不具代表性

    使用不具代表性的训练集训练出来的模型不可能做出准确的预估。

    但是,实现困难:如果样本集太小,将会出现采样 噪声 (即非代表性数据被选中);而即便是非常大的数据样本,如果采样方式欠妥,也同样可能导致非代表性数据集被选中,这就是所谓的 采样偏差 。

    4.3 质量差的数据

    如果训练集满是错误、异常值和噪声(例如,质量差的测量产生的数据),系统将更难检测到低层模式,更不太可能表现良好。 => 数据清洗

    4.4 无关特征

    只有训练数据里包含足够多的相关特征,以及较少的无关特征,系统才能够完成工作。

    一个成功的机器学习项目,关键部分是提取出一组好的用来训练的特征集,这个过程叫做 特征工程 ,包括:
    特征选择: 从现有的特征中选择最有用的特征进行训练。
    特征提取:将现有特征进行整合,产生更有用的特征。
    通过收集新数据创造新特征。

    4.5训练数据过度拟合

    过度拟合 指模型在训练数据上表现良好,但是泛化时却不尽如人意。

    当模型对于训练数据的数量和噪度都过于复杂时,会发生过度拟合。可能的解决方案:

    简化模型:

    • 选参数较少的模型,减少训练数据中的属性数量,又或是约束模型。
    • 收集更多的训练数据。
    • 减少训练数据中的噪声。
    • 通过约束模型使其简单,并降低过度拟合的风险,这个过程称为 正则化 。
    • 应用正则化的程度可以通过一个 超参数 来控制,超参数是学习算法(不是模型)的参数。因此,它不受算法本身的影响;它必须在训练之前就设置好,并且在训练期间保持不变。
      如果将正则化超参数设置为非常大的值,会得到一个几乎平坦的模型;学习算法虽然肯定不会过度拟合训练数据,但是也更不可能找到一个好的解决方案。

    4.6 训练数据拟合不足

    拟合不足 和 过度拟合 相反,它的产生通常是因为,对于下层的数据结构来说,你的模型太过简单。

    解决的方法:

    • 选择一个带有更多参数、更强大的模型
    • 给学习算法提供更好的特征集(特征工程)
    • 减少模型中的约束(比如,减少正则化参数)

    4.7 退后一步

    纵观前文内容:

    机器学习是关于如何让机器可以更好地处理 某些特定任务的理论,从数据中学习。
    类型多:监督式和无监督式,批量的和在线的,基于实例的和基于模型的,等等。
    在一个机器学习项目中,你从训练集中采集数据,然后将数据交给学习算法来计算。基于模型的会调整模型,基于实例的会根据相似度进行新的泛化。
    训练集的数据太少,数据代表性不够,包含太多噪声或者是被一些无关特征污染,模型过于简单或复杂,系统将无法进行很好的工作。

    5 测试与验证

    直接应用到现实场景太草率 => 划分 训练集 和 测试集 。(通常 80% & 20% )

    应对新场景的误差率称为 泛化误差,通过测试集来评估你的模型,你就可以得到对这个误差的评估。

    但是通过对测试集的泛化误差进行多次度量并调整模型和超参数来拟合测试集会出现在新数据场景泛化性能下降的问题 => 增加一个 验证集 来调整超参数。

    为避免验证集“浪费”太多的训练数据,使用 交叉验证 :将训练集分成若干个互补子集,然后每个模型都通过这些子集的不同组合来进行训练,之后用剩余子集进行验证。

  • 相关阅读:
    基于springboot1.5.9整合shiro时出现静态文件找不到的问题
    基于springboot多模块项目使用maven命令打成war包放到服务器上运行的问题
    关于使用map存放数据乱序”问题“
    springboot1.5.9整合websocket实现实时显示的小demo
    SpringBoot1.5.10.RELEASE配置mybatis的逆向工程
    SpringBoot1.5.10.RELEASE整合druid时,在druid monitor界面出现(*) property for user to setup
    SpringBoot1.5.10.RELEASE整合druid
    SpringBoot1.5.10.RELEASE项目如何在tomcat容器中运行
    JS学习-01
    List,Set,Map在java.util包下都是接口 List有两个实现类:ArrayList和LinkedList Set有两个实现类:HashSet和LinkedHashSet AbstractSet实现了Set
  • 原文地址:https://www.cnblogs.com/lpdeboke/p/14814562.html
Copyright © 2011-2022 走看看