0%

机器学习入门(一)

备注

参考书籍

  • 机器学习实战 基于Scikit-Learn、Keras和TensorFlow》第二版
    • 作者:【法】Aurelien Geron
  • Python科学数据手册
    • 作者:【美】Jake VanderPlas

什么是机器学习

比较工程化的概念:

一个计算机程序利用经验 E 来学习任务 T,性能是 P,如果针对任务 T 的性能 P 随着经验 E 不断增长,则称为机器学习。 – Tom Mitchell

适用场景

  • 有解决方案(但方案需要进行大量人工微调或需要遵循大量规则)的问题:机器学习算法通常可以简化代码,相比传统方法有更好的性能
  • 传统方法难以解决的复杂问题:最好的机器学习技术也许可以找到解决方案
  • 环境有波动:机器学习算法可以适应新数据
  • 洞察复杂问题和大量数据

机器学习应用示例

  • 自动分类新闻:这是自然语言处理(NLP),更具体是文本分类,可以使用循环神经网络(RNN)、CNN 或者 Transformer
  • 论坛中自动标记恶评:文本分类,使用相同的自然语言处理工具
  • 创建聊天机器人或个人助理:涉及自然语言处理的很多分支,包括自然语言理解(NLU)和问答模块
  • 让应用对语音命令作出反应:语音识别,要求能处理音频采样。因为音频是很长很复杂的序列,所以一般使用 RNN、CNN 或者 Transformer 进行处理
  • 检测信用卡欺诈:异常检测
  • 基于以前的购买记录给客户推荐可能感兴趣的产品:这是推荐系统,一个办法是将以前的购买记录(和客户的其他信息)输入人工神经网络,从而输出客户最可能购买的产品。这个神经网络是在所有客户的购买记录上训练的

机器学习系统的类型

现有的机器学习系统类型繁多,根据以下标准进行大的分类:

  • 是否在人类监督下训练
    • 有监督学习
    • 无监督学习
    • 半监督学习
    • 强化学习
  • 是否可以动态地进行增量学习
    • 在线学习
    • 批量学习
  • 是简单地将新的数据点和已知的数据点进行匹配,还是像科学家那样,对训练数据进行模式检测然后建立一个预测模型
    • 基于实例的学习
    • 基于模型的学习

这些标准直接互相不排斥,可以任意组合

有监督学习和无监督学习

根据训练期间接受的监督数量和监督类型,可以将机器学习系统分为四个主要类别:
有监督学习、无监督学习、半监督学习和强化学习

有监督学习

在有监督学习中,提供给算法的包含所需解决方案的训练集称为标签

分类任务是一个典型的有监督学习任务,比如垃圾邮件过滤器

另一个典型的任务是通过给定一组称为预测器的特征(里程、使用年限、品牌等)来预测一个目标数值(例如汽车的价格)。这种类型的任务称为回归

列举部分重要的有监督学习算法:

  • k - 近邻算法
  • 线性回归
  • 逻辑回归
  • 支持向量机(SVM)
  • 决策树和随机森林
  • 神经网络

无监督学习

无监督学习的训练数据都是未经标记的

列举部分重要的无监督学习算法:

  • 聚类算法
    • k - 均值算法
    • DBSCAN
    • 分层聚类分析(HCA)
  • 异常检测和新颖性检测
    • 单类 SVM
    • 孤立森林
  • 可视化和降维
    • 主成分分析
    • 核主成分分析
    • 局部线性嵌入(LLE)
    • t - 分布随机近邻嵌入(t-SNE)
  • 关联规则学习
    • Apriori
    • Eclat

半监督学习

由于通常给数据做标记是非常耗时和昂贵的,你往往会有很多未标记的数据而很少有已标记的数据。有些算法可以处理部分已标记的数据,这称为半监督学习

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

强化学习

强化学习系统(智能体)能够观察环境,做出选择,执行动作,并获得回报(或者以负面回报的形式获得惩罚)

所以它必须自行学习什么是最好的策略,从而随着时间的推移获得最大的回报,策略代表智能体在特定的情况下应该选择的动作

例如:

  • 许多机器人通过强化学习算法来学习如何行走
  • DeepMind 的 AlphaGo 项目也是一个强化学习的好示例

批量学习和在线学习

另一个给机器学习系统分类的标准是看系统是否可以从传入的数据流中进行增量学习

批量学习

批量学习中,系统无法进行增量学习————即必须使用所有可用数据进行训练

这需要大量时间和计算资源,所以通常都是离线完成的

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

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

在线学习

在在线学习中,可用循序渐进地给系统提供训练数据,逐步积累学习成果

这种提供数据的方式可以是单独的,也可以采用小批量的小组数据来进行训练,每一步学习都很快度且便宜,这样系统就可以根据飞速写入的最新数据进行学习

适用情况:

  • 对于需要接受持续的数据流(如股票价格)、同时对数据流的变化做出快速或自主的反应的系统
  • 计算资源有限,新的数据实例一旦经过在线学习系统的学习,就不再需要,可用将其丢弃(除非需要回滚)
  • 对于超大数据集,超出一台计算机的主存储器的数据,算法每次只加载部分数据,并针对这部分数据进行训练,然后不断重复该过程,直到完成所有数据的训练(这称为核外学习)

核外学习通常是离线完成的(不在实时(live)系统上),在线学习这个名字很容易让人产生误解,我们可以将其视为增量学习

基于实例的学习和基于模型的学习

另一种机器学习系统进行分类的方法是看它们如何泛化

大多数机器学习任务是要做出预测,这意味着系统需要通过给定的训练示例,在其此前并未见过的示例上进行预测(泛化)

泛化的主要方法有两种:基于实例的学习和基于模型的学习

基于实例的学习

系统学习给定的实例,然后通过使用相似度度量来比较新实例和已经学习的实例(或它们的子集),从而泛化新实例,这被称为基于实例的学习

基于模型的学习

从一组示例集中实现泛化的另一种方法是构建这些示例的模型,然后使用该模型进行预测,这称为基于模型的学习

Jupyter 快速入门

Jupyter Notebook 是 IPython shell 基于浏览器的图形界面

可以执行 Python/IPython 语句,还允许用户添加格式化文本、静态和动态的可视化图像、数学公式、JavaScript 插件等等

在命令行输入以下命令方可启动:

1
jupyter notebook

命令会启动一个本地的 Web 服务器,可以在浏览器看到页面内容

一般访问的地址是 http://localhost:8888

帮助文档

用符号”?”获取文档

Python 内置的 help()函数可以获取包含对象的简要介绍和使用方法,IPython 引入了 ? 作为获取该文档和其他相关信息的缩写

这种表示方法几乎适用与一切,包括对象方法

通过符号”??”获取源代码

用Tab补全探索模块

对象内容的自动补全

为了缩小列表,可以输入属性或方法名称的前几个字符

如果只有一个选项,Tab 键会把名称自动补全

但是,按照惯例,首部带有下划线的私有属性或方法在列表中被默认省略了,不过明确输入一条下划线就可以将其列出

导入模块时的自动补全

通配符匹配

IPython shell 中的快捷键

列举部分常用快捷键

快捷键 效果
Ctrl + a 将光标移动到本行的开始处
Ctrl + e 将光标移动到本行的结尾处
Ctrl + r 对历史命令的反向搜索
Ctrl + l 清除终端屏幕的内容
Ctrl + c 中断当前的 Python 命令
Ctrl + d 退出 IPython 会话

IPython 魔法命令

魔法命令有两种形式:

  • 行魔法(line magic):以单个 % 为前缀,作用于单行输入
  • 单元魔法(cell magic):以两个 %% 为前缀,作用于多行输入

执行外部代码 %run

使用 IPython 进行交互式探索,需要存储复用的代码

假设你创建了一个 myscript.py 文件,文件包含

1
2
3
4
5
def fun(idx):
return 'script-{}'.format(idx)

for i in range(3):
print(fun(i))

这时,就可以进行如下操作

计算代码运行时间 %timeit

%timeit 可以计算接下来一行代码的执行时间

可以加入第二个 % 将其转变成单元魔法

魔法函数的帮助

获取 %timeit 的文档注释

获取魔法函数通用描述

获取所有可以魔法函数列表

IPython 和 shell 命令

IPython 提供了在其终端直接执行 shell 命令的语法

这是通过!实现的,一行中任何在!之后的内容将不会通过 Python 内核运行,而是通过系统命令行运行

shell 快速入门

当然还有许多命令,例如:

  • mkdir
  • cd
  • mv
  • cp
  • rm

IPython 中的 shell 命令

这里只需要注意 Windows 和 Linux 命令的区别即可

例如 !dir!ls