写点什么

机器学习入门

2016 年 12 月 18 日

数据科学正在快速发展成所有行业开发人员和管理人员的关键技能,它看起来也十分有趣。但是,它非常复杂,虽有许多工程和分析工具助力,却也难清楚掌握现在做得对不对,哪里是不是有陷阱。在本文中,我们解释了如何发挥数据科学的作用,理解哪里需要它,哪里不需要它,以及如何令它为你产生价值,如何从先行者那里获得有用的经验。

这是“ Getting A Handle On Data Science ”系统文章中的一部分,你可以通过此 RSS 予以订阅。

本文要点

  • 大多数类型的机器学习项目归根结底通常是使用监督式学习方式进行分类或回归。
  • 特征工程是大多数机器学习过程中的一个关键组成部分。
  • 像 K 均值(K-means)之类无人监督式的学习算法能用于你事前并不清楚数据标签时的聚类分析。
  • 这里提到的绝大多数机器学习算法都是要为模型找到最适合的参数使模型可以最好地拟合数据。
  • 过拟合是数据科学家必须面对的常见问题,在此是从一个有限的数据集得到假设的,在加入更多的数据点后并不能很好的推广。

许多机器学习(ML)项目的其中一部分即为数据集拟合一个函数(通常非常复杂),其目标为针对分类问题计算一个 1 或者 0 的数值(比如它是不是垃圾邮件?),或者对回归问题计算一系列数值(比如某种商品每周的销量)。是的,它全是关于数字和大量运算的,这正是计算机所擅长的。这即为机器学习(ML)中的机器(M)了,那么学习(L)又是关于什么的呢?

Kaggle 网站上可以找到一些声音数据,通过这些数据可以进行性别识别,我们以此来展开下面的探讨。这些数据集的目标是针对一个给定的语音信号,识别它是来自于男性还是女性。这项挑战归入分类问题这一类。在此该目标是为给定语音信号指定所属类别是男性还是女性,但是,分类问题是不一定要局限为两类的。分类问题的一些其他例子是文本的情感分析(积极的、中立的还是消极的),图像识别(你在一张图片中看到了什么种类的花?),等等。

那么计算机应该如何学习去识别一个已录好的声音是由男性还是女性发出的呢?好吧,如果我们想要计算来帮助我们,那么我们需要去讲它的语言:数字。在机器学习的世界,这就意味着抽取这些数据的特征。如果你访问一下 Kaggle 的链接,会在上面看到它们已经从语音信号中提取了许多特征。一些特征示例是:平均频率、中频、频率的标准差、四分间距、 基频的平均值,等等。也就是说,他们提取这些可能帮助我们分辨语音信号属于男性还是女性的特征而不是直接用时间序列来表示语音信号,这就是所谓的“特征工程”了。特征工程是大多数机器学习过程的一个重要组成部分。

我将选择这个数据集的两个特征,它们称为平均基频和四分间距,如下图所示。

在本图中,这些点分成了明显的两组。已知这个数据集由男性和女性的声音组成,我猜较高平均基频的那一组是属于女性(更高的音高)的,反之另一组是属于男性的。因此,一种识别该信号属于哪个性别的方式是,把数据分为两组,给其中较高平均基频的一组贴上女性的标签,而另一组贴上男性标签。这其实就是一些机器学习算法所做的抽取工作——分类归并。 K 平均(K-means)是其中执行这类运算的最常用的一个算法,在其命名中的“K”是你想要识别的群集数量(在本例中是两个)。注意,所有此类算法会获取你想要识别的群集初始数量,以及原始的数据,然后它返回一般性标签(比如 0 或者 1),附到每个点上,表明每个实体属于哪个群集。在本例中,我会按我的领域知识赋予这些标签含义。

K 平均属于称为无人监督式学习的一类机器算法,这种机器学习属于你预先不知道数据标签的情况。因为我们有两个可清晰界定的群集,所以它是可行的,但如果有大量的重叠那么可能它就不是分类问题的最佳解决方案了。另一类机器算法称之为监督式学习,在此情况下你可以使用数据标签。让我们拿出来自于这些声音识别数据集的数据标签,并重新描绘一下同一个图表吧。

凭直觉判断,具有最高平均基频的群集的确是属于女性的。为引入监督式方法,我将尝试用一条线把这两类分隔开,这样在视觉上就更容易区分了。这条线称之为决策边界,我还把它的方程式写了下来。这些“theta”是这条线的参数,而“x”则表示这个图中标绘点的两个变量,即本例中的四分间距和平均基频。因为我清楚这些数据标签,所以我能够拟合这条线。所以如果我在该声音数据集上使用左手边的方程式,并且如果我得出该数字大于 0,那么我就能够预测这个声音是来自于女性的,或者如果该数字小于 0,那么它就是来自于男性的。轻松解决。

然而,这并不是全部。

我仅针对每一类标绘了 100 个点,但实际上整个数据集是由 3164 个数据点构成的,男性和女性各占了一半。如果针对每一类标绘 200 个数据点会发生什么呢?

好吧,黑色虚线现在看起来就不那么合适了。我打算重复一下这个过程,并重新拟合另一条红色虚线,视觉化思维应该是一种分隔这些种类的好方法。图中这两条线之间的数学差异与第一张图中方程式里的“theta”的值有紧密的联系。这就是我所做的,“学习”更好的方式去将提交给我的给定数据进行分类。其实本质上最终是去为该决策边界找新的系数。你能理解是怎么进行的了,对吗?

我们现在是在理解在 ML 中的 L 是关于寻找最佳参数去达成当下目标的,在本例中,是去预测给定声音信号是来自于男性还是女性。如果我令你失望了,我表示抱歉,但实际上大多数 ML 算法是以最适合数据的方式去找用于模型的“theta”或系数或参数(此类算法的典型例子是 Logistic Regression Artificial Neural Networks )。当然,这些算法比我靠视觉画条线要更好。它们通常基于最优化的函数,它们通过模型拟合线,把实际的值与预言的值之间的错误降到最低。在 ML 的领域,这类错误也称为损失或损失函数。

还有一些应该非常广泛的算法,它们基于的是 Random Forest (随机森林) 或 Gradient Tree Boosting (一种迭代决策树的算法)之类的决策树集合,它们不会明确去针对一条线去找系统,而是去找其他参数去划分数据,得出更复杂的决策边界。实际上,事实是给出如上的标绘图,不解释为什么一条线应被选择为一个决策边界。我们在理论上应该为该数据集拟合一条曲线。

该黑色虚线应该被选择为一个决策边界,但是这存在一个问题,那就是每个数据科学家都会经常提到的过度拟合。曲线是创建决策边界的,非常局限于当前的数据集,如果有更多的数据点添加进来,可能就不能推广了。我们已经看到,每类有的 100 个数据点还是有 200 个数据点之间存在着巨大的差异。那么设想一下,如果更多的数据点加进来呢?

那就很混乱了。整个数据集标绘如上图,现在我用复杂的视觉化方法为该数据拟合的线就变得很有问题了。我们需要帮助机器学习算法现在去选择一条线或曲线,这条线能够最小化我们因为拟合这些决策边界导致的错误或损失。此外,我们在此需要算法的帮助,因为至今为此我们仅靠两个特征去解释声音数据集的从属,然而整个数据集是由 21 个特征构成的。

这是个好消息,也是个坏消息。

想象一下,我们用三个维度来替换至今为止已向大家展示过的两维度标绘,其中第三个维度是另一个特征,比如所有信号中的最大基本频率,我们就叫它做“最大基频(maxfun)”吧。想象一下如下场景:每个女性的最大基频都在 0 附近,而每个男性的最大基频都在 1 附近。如果我们用 3D 图像来标绘它,你就能更容易地想象到一个能以完美的方式来区分男性和女性的平面了。这真是太棒了。如果你为该数据集增加更多的特征,就可以想象出更高维度的平面(超平面)了,它有希望以更精确的方式把数据区分开。这是好消息。

坏消息是,我们没办法可视化地检查它,除非我们用 主要组件分析 之类降低维度的算法,举个例子,比如把这个高维度的数据转化为两或三维,这是有缺点的,在标绘轴中将不再有物理特征(比如平均基频或最大基频),但是有变量,它们是对你的数据集的最重要特征的推测。让我们通过举例来解释一下这一点,我们来标绘一个简单示例,它来自于声音识别数据集,具有语音的平均频率和中值频率。

如上图所示,这里有两个相关的变量,考虑到它们是来自于相同概率分布的音频样品,所以这是合情合理的。但现在对这两个变量的使用存在有多余的信息。应该找办法简化这些数据在更低维度中的方差的可视化图像,这样会更好。出于这个目的,我为这张图画了一个缩略版本。

如果我们选择一个尽可能可减少这两个变量信息丢失的方向投影出这些数据的可视化图像,从而代替这两个变量的可视化图像,那么会怎样呢?这是在z1 轴完成的,但仍会有一些信息丢失的代价。针对此具体示例,这个方向可以看成是一个频率,但它即不是中值也不是平均值。然而,想象一下把21 维的数据集投影到两维。我们实际上不可能了解这两维到底代表什么。此外,在这个简单示例中并没有丢失太多的信息,但把21 个特征投影为两个将导致大量的丢失。在数据的可视化期间它应该很有意思,但不应该用在机器学习算法的执行上。

我们已经看到这些数据集中的有些特征是相互关联的,它们应该被包含在机器学习项目中吗?我们实际上应该使用多少特征?仅使用两个特征和所有这些数据点,该决策边界不足以对此分类问题有清晰的界定。当你把这条线作为决策边界来计算导致的错误或损失就会确认这一点。通过增加第三个特征(如果特征合适的话),损失应该会被降低。如果不是这样,那就表明要么这个增加的特征不合适,要么就是它对当前的问题没那么重要。

我希望通过本文能唤起你对机器学习的好奇心。这只是一个泛泛的介绍,要了解更多详情需要从前到后地开发和理解一个机器算法项目。机器学习算法可以用每种编程语言来实现。Python 和R 是其中最常用的语言,而且针对机器学习有非常棒的类库,比如用于模型的 scikit-learn 和用于信件的 caret 。我建议你以自己选择的语言去深入钻研一个教程。我要说的就是这么多了,希望你能了解其中的全部内容。

关于作者

Rafael Fernandes 是 Black Swan Data 的一位数据科学家。他不但已经使用机器学习帮助客户揭示了消费者的洞察力和行为,还帮他们完成了产品的定价和需求定位。在他之前的生涯中,还模拟过“阿波罗”太空舱从太空以八倍音速返航,而他现在仍是一名航空航天极客。

数据科学正在快速发展成所有行业开发人员和管理人员的关键技能,它看起来也十分有趣。但是,它非常复杂,虽有许多工程和分析工具助力,却也难清楚掌握现在做得对不对,哪里是不是有陷阱。在本文中,我们解释了如何发挥数据科学的作用,理解哪里需要它,哪里不需要它,以及如何令它为你产生价值,如何从先行者那里获得有用的经验。

这是“ Getting A Handle On Data Science ”系统文章中的一部分,你可以通过此 RSS 予以订阅。

查看英文原文: Article: Getting Started with Machine Learning

2016 年 12 月 18 日 16:466190

评论

发布
暂无评论
发现更多内容

数仓大法好!跨境电商 Shopee 的实时数仓之路

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

第二周作业

晨光

使用WebMaker快速预览Ionic页面效果

davidce

Ionic WebMaker 混合应用开发

【大厂面试06期】谈一谈你对Redis持久化的理解?

NotFound9

数据库 redis 后端

实时即未来?一个小微企业心中的流计算

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

第二周总结

qqq

极客大学架构师训练营

课程总结

AIK

红警1游戏开源,代码非常规范。网友:秀色可餐

程序员生活志

游戏开源 红警1

如何构建低延时的直播体验,让互动更实时?

巨侠说

CDN 短视频 直播 视频

Apache Flink 误用之痛

Apache Flink

大数据 flink 流计算 实时计算 数据处理

《实现领域驱动设计》拆书稿 DDD入门 & 领域、子域和限界上下文

三界

架构 领域驱动设计 DDD

TiDB原理解析

Chank

依赖倒置架构

AIK

第二周作业

Aldaron

Flink on Zeppelin (4) - 机器学习篇

章剑锋_Jeff

大数据 flink 学习 流计算 Zeppelin

小师妹学JVM之:JDK14中JVM的性能优化

程序那些事

JVM 「Java 25周年」 小师妹 JIT JDK14

数仓系列 | 深入解读 Flink 资源管理机制

Apache Flink

大数据 flink 流计算 实时计算

从字符串到常量池,一文看懂String类设计

程序员DMZ

JVM 常量池 intern

20年行业变革与技术演进,当下CDN如何为政企数字化转型加速?

巨侠说

CDN 边缘计算 移动视频

POJO类中布尔类型为啥不让用isXxx命名

Java课代表

Flink 在快手实时多维分析场景的应用

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

当你启动Redis的时候,Redis做了什么

老胡爱分享

redis 源码分析 面试题

面向开发者的 WSL2 安装指南

simpleapples

Python golang Windows 10 wsl

免费下载 | 阿里云实时计算整体解决方案白皮书重磅发布!

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

第二周-作业

JI

极客大学架构师训练营

第二周-总结

JI

极客大学架构师训练营

Flink作业问题分析和调优实践

Apache Flink

大数据 flink 流计算 实时计算 大数据处理

看清远处模糊的事,不如做好身边清楚的事

Neco.W

创业心态 未知

28岁程序员期权过亿,彪悍从字节退休,网友:酸了酸了!

程序员生活志

程序员 字节跳动 开发 退休

第二周总结

晨光

【Week02】框架设计

Aldaron

InfoQ 极客传媒开发者生态共创计划线上发布会

InfoQ 极客传媒开发者生态共创计划线上发布会

机器学习入门-InfoQ