机器学习实战——基于Scikit-Learn和TensorFlow 阅读笔记 之 前言与第一章:机器学习概览

版权声明:访问者可将本博客提供的内容或服务用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。除此以外,将本网站任何内容或服务用于其他用途时,须及时征得本网站及相关权利人的明确许可。 https://blog.csdn.net/qq_38262728/article/details/87916981
《机器学习实战——基于Scikit-Learn和TensorFlow》
这是一本非常好的机器学习和深度学习入门书,既有基本理论讲解,也有实战代码示例。
我将认真阅读此书,并为每一章内容做一个知识笔记。

在这里插入图片描述

前言

本书的Jupyter示例代码:https://github.com/ageron/handson-ml

Andrew Ng 在Coursera上的机器学习课程:https://www.coursera.org/learn/machine-learning/
Geoffrey Hinton的神经网络和深度学习课程:https://www.coursera.org/course/neuralnets

Scikit-Learn用户指南:http://scikit-learn.org/stable/user_guide.html

Dataquest交互式教程:https://www.dataquest.io/

机器学习博客:http://goo.gl/GwtU3A

深度学习资源列表:http://deeplearning.net/

第一章 机器学习概览

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% )

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_38262728/article/details/87916981