本文为数据茶水间群友原创,经授权在本公众号发表。
0x00 前言
大数据、处理器等技术的成熟,将已经有60多年历史的“人工智能”推向了舞台中心。随着机器学习、深度学习等概念的火热,很多同学也摩拳擦掌,准备在人工智能这一“弯道”进行超车。
但是也有很多同学在打开这人工智能的大门时,发现里面充斥了大量的数学公式、推导过程等早已归还给大学老师的知识。在头晕眼花的同时无奈地又把门关上了。
居士发起的“学习小组”的初衷正是希望组织大家成体系地对统计学知识进行温习、掌握常用算法模型并提高相应的工程能力。本文作为“学习小组”的第一篇入门向的输出内容,主要讲一下机器学习以及深度学习的概念,并引出sklearn和tensorflow这两个在领域中举足轻重的学习库对其进行简单的科普介绍。
0x01 ML/DL简介
机器学习
相信“机器学习”这个词,这两年大家已经听烦了,这里就简单介绍一下定义:
一个程序要完成任务(T),如果程序获取关于T的经验(E)越多则表现的越好,那么就可以说程序学习了关于T的经验。
简单地说:传统的编程方式是人类自己积累经验,并将这些经验转换为规则或者数学公式,然后用不同的编程语言去描述这些规则和公式。而机器学习则只需要人订制学习步骤,将大量的数据输入给计算机,计算机则可以根据数据和学习步骤自己总结经验,自动升级,借助计算机的计算性能,接近甚至超越人类自身水平。
机器学习的方法包括:
- 监督学习 supervised learning;
- 非监督学习 unsupervised learning;
- 半监督学习 semi-supervised learning;
- 强化学习 reinforcement learning;
- 遗传算法 genetic algorithm.
(以上相关概念不在本文重点范围内)
特征工程
为什么要在“机器学习”和“深度学习”之间夹着“特征工程”这一概念的,因为特征工程是机器学习,甚至是深度学习中最为重要的一部分,也是最难讲的一部分。因为特征工程往往与具体的数据相结合,是要撸起袖子动手干的实战技巧,因此很难系统地讲清楚。本部分向大家介绍基本概念,方便大家后续阅读。
在kaggle中有一句经典的话:
数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。
数据里面提取出来的特征好坏与否直接影响模型的效果。从某些层面上来说,所使用的特征越好,得到的效果就会越好。
要了解特征工程,首先要知道什么是特征
特征(feature),是反映对象在某方面的表现或性质的事项,也可以被称作属性(attribute)。比如我们在描述一个人外表时,“身高”、“体重”、“发型”、“肤色”等就是特征,那么与之对应的“偏高”、“偏瘦”、“短发”、“较白”就是特征值。这四个特征值组成一行,就是所谓的特征向量。n条特征向量组成的一个矩阵,就是所谓的数据集。
特征值1 | 特征值2 | 特征值3 | 特征值4 | |
---|---|---|---|---|
特征向量1 | 偏高 | 中等 | 短发 | 较白 |
特征向量2 | 中等 | 偏胖 | 光头 | 较黑 |
特征向量3 | 偏矮 | 偏瘦 | 长发 | 较白 |
那么什么是特征工程呢?
现在根据上面的样本数据,用逻辑回归方法设计一个身材分类器。
首先我们要对数据进行判断:“发型”和“负责”这两个特征值对身材分类有帮助么?很明显,没有,甚至如果我们提取了某些冗余特征(不发散、不相关),还会降低模型的性能。那么我们就需要选择符合我们要求的特征,这就是特征选择。
那么接下来,我们选择了身高和体重两个特征值。那么输入数据X:身高和体重 ,标签为Y:身材等级(胖,不胖)。
需要注意,我们不能单纯的根据体重来判断一个人胖不胖,02年NBA选秀时的姚明,重吗?重!胖吗?显然不是。
那么针对这个问题,一个非常经典的特征工程是,BMI指数,BMI=体重/(身高^2)。这样,通过BMI指数,就能帮助我们刻画一个人身材如何。甚至,你可以抛弃原始的体重和身高数据。
所以说,特征工程就是通过X,创造新的X’。基本的操作包括,衍生(扩充维度),筛选(降低维度)。说起来简单,实际上在真正的AI项目中,扩维和降维都是困难重重,需要非常专业的知识和丰富的经验。
特征工程的一般步骤如下:
- 确定任务:根据实际业务确定需要解决的问题
- 数据选择:整合数据
- 预处理:涉及数据清洗等一系列操作
- 构造特征:将数据转换为有效的特征,常用归一化、标准化、特征离散处理等方法
- 模型使用:计算模型在该特征上的准确率
- 上线效果:通过在线测试来判断特征是否有效
- 进行迭代
总之,除去语音和图像等特定场景,对于大部分生活中的机器学习项目,由于没有足够的训练数据支撑,我们还无法完全信任算法自动生成的特征,因而基于人工经验的特征工程依然是目前的主流。这就需要建模人员对实际业务有较深的理解和把控。
深度学习
首先要明确一下机器学习和深度学习的关系:深度学习是机器学习的一个子集。
对机器学习来说,特征提取并不简单。特征工程往往需要人工投入大量时间去研究和调整,就好像原本应该机器解决的问题,却需要人一直在旁边搀扶。
深度学习便是解决特征提取问题的一个机器学习分支。作为一种强大的自动化特征工程工具,能够自动学习各种低级和高级的特征。它可以自动提取数据的内在特征,并学习特征和任务之间的关联,还能从简单特征中提取复杂的特征。
要理解深度学习,不得不提的一个概念就是神经网络,实际上,深度学习就是多层神经网络的训练过程。
神经网络
神经网络简单点将就是由好多个神经元组成的系统。
人之所以能够进行思考,是因为人体的生物神经网络。外部刺激通过神经末梢传到神经元,无数个神经元构成了神经中枢,神经中枢综合各种信号,做成判断,从而对外部刺激做出反应。
从生物神经网络获得灵感,提出了人工神经网络,人工神经元模型就是我们所说的“感知机(perceptron)”。
上图的圆圈就代表一个感知机,接收多个输入信号,乘以权重并求和,并与阈值做判断,最后产生一个输出信号。就这样,单个感知机就构成了一个简单的决策模型。
但是在真实世界中,要处理的问题复杂得多,不是一个简单的据测模型就可以判断的。我们可以组成多层神经网络。多层神经网络分为:输入层(inputs)、隐藏层(可能有一层或多层)、和输出层(output),其中由于输入层未做任何变换,可以不看做单独的一层。
输入层将信号传递到到隐藏层中的底层神经元,底层神经元的输出是高层神经元的输入,直到最后得到结果。
实际中,输入层的每个神经元代表了一个特征,输出层个数代表了分类标签的个数。而每个隐藏层就是对上一层的输出值进行一次“转换”,也就是加权求和与非线性变换的过程。神经网络就是通过将神经元(线性分类器)进行组合叠加,通过不断调整误差,反复训练,从而不断地逼近正确答案,达到较好地非线性分类效果。
与机器学习做对比
首先,特征工程的角度上来说:机器学习需要人工处理特征,而深度学习则是自动从数据中学习特征。
其次,从解决问题的思想上来说:机器学习是将问题拆解,一一解决后再组合起来;而深度学习是一次性地、端到端地解决问题(相应地,可解释性较差)。
最后,深度学习适合处理大数据,计算量大、训练时间长,十分依赖高端硬件设施;而在数据量比较小的时候,机器学习也许更合适。
0x02 scikit-learn
scikit-learn是python进行机器学习及数据挖掘与分析的重要而有效的工具。我们可以看到官网中的描述:
- Simple and efficient tools for data mining and data analysis
- Accessible to everybody, and reusable in various contexts
- Built on NumPy, SciPy, and matplotlib
- Open source, commercially usable - BSD license
包含了很多的机器学习方式:
- Classification 分类
- Regression 回归
- Clustering 非监督分类
- Dimensionality reduction 数据降维
- Model Selection 模型选择
- Preprocessing 数据预处理
sklearn主要针对中小型的、通用机器学习项目,尤其是数据量不大,且需要人工对数据进行处理的项目。并且sklearn提供了强大的特征工程,比如选择特征、压缩维度、转换格式等,满足了传统机器学习需要手动进行数据处理的要求。
sklearn中大部分函数都可以归为Estimator
和Transformer
两类。
Estimator
实际上实就是模型,它用于对数据的预测或回归。基本上预估函数都会有以下几个方法:fit(x,y)
:进行模型训练score(x,y)
:对模型的正确率进行评分。predict(x)
:对数据进行预测,用于评估模型。
Transformer
用于对数据进行处理,例如标准化、降维以及特征选择等等。与估计器的使用方法类似:fit(x,y)
:计算数据变换的方式。transform(x)
:返回数据x变换后的结果fit_transform(x,y)
:既包含训练,又包含转换。
sklearn作为一个通用机器学习库来说,抽象度高,封装程度好。我们只要遵循其固有模式,就可以通过少量的几行代码可以完成模型训练,对新人十分友好。
其实sklearn的学习曲线比较平缓,官方文档就是它最好的学习工具。文档中不但包含了对知识点的概述,还有通俗易懂的实例代码,简直是一份友好的新手入门指南。
因此,sklearn作为传统机器学习库的代表,调包侠们的瑞士军刀,是我们需要熟练使用并细心研究的,
0x03 TensorFlow
TensorFlow是Google开源的神经网络Python外部结构包, 也是一个采用数据流图(data flow graphs)来进行数值计算的开源软件库。TensorFlow是目前深度神经网络中最好用的库之一。我们可以通过使用TensorFlow来快速的入门神经网络, 大大降低了深度学习的开发成本和开发难度。
我们可以通过命名来理解:tensor
,翻译为“张量”,表示N维向量;flow
,表示流,是指一个有向无环图。tensorflow的运行过程就是张量从图的一端流动到另一端的过程。
数据流图用“节点”(nodes
)和“线”(edges
)的有向图来描述数学计算。nodes
一般用来表示施加的数学操作,也可以表示数据输入(feed in)的起点/输出(push out)的终点,或者是读取/写入永久变量(persistent variable)的终点。edges
表示node
之间的输入/输出关系。这些edges
可以传送大小可动态调整的多维数据数组,也就是张量
。一旦输入端的所有张量准备好,节点将被分配到各种计算设备完成异步并行运算。
使用Tensorflow需要:
- 向tf中输入搭建模型所需要的信息,并将其转化为可处理的数据。
- 通过tf内置的函数模块搭建模型
- 循环地迭代训练以及评估模型,以便确定模型中的参数。
不同于高度抽象及模块化的sklearn,TensorFlow作为深度学习库,有很高的自由度,这些意味着对使用这的要求更高,当然我们也可以使用keras(深度学习领域的sklearn)。
其实,在更常见的情况下,可以把sklearn和tf,甚至keras结合起来使用。sklearn肩负基本的数据清理任务,keras用于对问题进行小规模实验验证想法,而tf用于在完整的的数据上进行严肃的调参(炼丹)任务。
0x04 一些想法
其实大部分同学可能都是开发出身,对于AI等相关概念略有了解,或缺乏成体系的理论知识,或缺乏具体的实践业务。居士发起的学习小组的初衷,也是为了使大家能够互相督促地补一补知识。
我本人在某AI独角兽交付部门任开发工程师,也不是从事专门的算法岗位。那么我想从我的角度谈一谈为什么想要学习AI。
近些年AI领域的火热,在招聘市场,尤其是校园招聘中,算法岗位的竞争之激烈,是经历过的同学们有目共睹的。很多大厂算法组招聘实习生的条件也是海外名校/985硕博起步的,而且一定要有匹配的专业背景以及优秀的学术能力。那么对于我们这些非算法岗位的人来说,就没有办法涉及这一领域了么?其实我认为,对于企业来说,对于AI人才的需求分为两种:一种是学术界的牛人,发过大paper,有学术界比赛的结果的。公司需要他们去做算法研究,保持技术的领先性,在业内赢得口碑,这样才能在领域内保持头部领域。另一方面,人工智能早已不是一个概念了,企业需要把业务部门的算法落地的人,能够快速、稳定、高效地把实验室中的算法落实到生产环境中,解决实际问题的人。这就需要那些工程底子扎实、能够实打实地写代码,并且对算法模型理解深刻,能够快速将AI项目工程化、落地有产出的复合型人才。
再结合居士的观点:统计学相关知识、人工智能相关知识已经逐渐地成为了我们必备的基础技能。很多时候我们要跳出自己的眼界,从更高的角度来说,这些知识有助于我们更好的了解自己的数据,更加了解业务,从而提高自己的竞争力,打破自己的能力边界,来进行“错位竞争”。
作为一名职场新人,我也希望能够不断完善自己的技术储备、从更多维的角度开阔自己眼界和想法。也希望能够通过输出的方式,和大家交流技术以及职业等方面的想法。