本系列文章主要介绍机器学习在实践中的应用,介绍利用 Python 的生态环境,使用机器学习的算法来解决工程实践中的问题,而不是介绍算法本身。本系列文章参考了《机器学习Python实践》,会通过例子一步一步地引导大家使用机器学习来处理和分类与回归模型相关的问题。每个算法模型都介绍其较为通用且实用的建模过程,力争使基础较差的读者也能无障碍利用python来使用机器学习算法。
1 初识机器学习
1.1 什么是机器学习
机器学习(Machine Leaming , ML)是一门多领域的交叉学科,涉及概率论、统计学、线性代数、算法等多门学科。 它专门研究计算机如何模拟和学习人的行为,以获取新的知识或技能,重新组织已有的知识结构使之不断完善自身的性能。
机器学习已经有了十分广泛的应用,例如:数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、检测信用卡欺诈、证券市场分析、 DNA 序列测序、语音和手写识别、战略游戏和机器人运用。
机器学习的算法分为两大类 : 监督学习和无监督学习 。
监督学习即在机器学习过程中提供对错指示。一般是在数据组中包含最终结果(0 , 1),通过算法让机器自己减少误差。这一类学习主要应用于分类和预测(Regression &Classify) 。监督学习从给定的训练数据集中学习出一个目标函数,当新的数据到来时,可以根据这个函数预测结果。监督学习的训练集要求包括输入和输出,也可以说包括特征和目标,训练集中的目标是由人标注的。常见的监督学习算法包括回归分析和统计分类。非监督学习又称归纳性学习(Clustering),利用 K 方式(KMean)建立中心( Centriole),通过循环和递减运算(lteration&Descent)来减小误差,达到分类的目的 。
机器学习解决的问题:分类,回归,降维,聚类。其中有些算法适合多种问题,有些只适合解决一种问题,下面列出一些常见的一些机器学习算法。
- 分类算法:逻辑回归,贝叶斯
- 回归算法:线性回归,岭回归,lasso,弹性网络
- 聚类:Kmeans,DBSCAN,层次聚类,光谱聚类
- 分类&回归:KNN,决策树,神经网络,随机森林,梯度提升树、xgboost
- 分类&回归&聚类:SVM
- 降维:PCA
1.2 学习机器学习的误区
在学习机器学习之前,有一些理解和误区需要先做好说明,防止大家在学习机器学习的过程中过于钻牛角尖。对于通过Python来基本实现机器学习算法,有几个误区可能是比较广泛存在的,应该尽量避免:
1、必须非常熟悉Python的语法和擅长Python的编程。实际上并不需要,Python有scikit-learn模块等可以直接进行建模的调用包,基本只需要学会python的各种基础的知识和应用,熟悉scikit-learn的相关模型用法,以及包括numpy、pandas、matplotlib模块在内的常用的数据处理和可视化包,就可以实现各种机器学习算法了。
2、必须非常深入地学习和理解在scikit- learn中使用的机器学习的理论和算法。实际上也不需要,除非你是这一方向的硕士甚至博士学位的学习者。机器学习不同的算法涉及的知识点是非常广阔的,要做到每一种算法的理论知识的学习都非常深入,是比较难的,实际上简单的机器学习应用中,只需要了解不同算法的基础知识就可以使用了。
3、学习知识就行了,不需要做什么项目。恰恰相反,机器学习的应用是需要大量的项目经验积累,才能把机器学习用得更好。
这些方式对一部分人可能会非常有效,但是这会降低掌握机器学习技能的速度和要达到通过机器学习来解决问题的目标。这也会浪费大量时间单独学习机器学习算法,但却不知如何利用机器学习来解决现实中遇到的问题。 实际上利用Python来实现机器学习算法的门槛并不高,在基本运用过程中,只需要了解机器学习各种算法的一些基础知识,一些常用流程和不同算法,数据集的适用要求就可以了。
1.3 Python 中的机器学习
本系列文章主要关注监督学习中的分类与回归问题处理的预测模型,这是在工业中应用非常广泛的分类,也是scikit-leam擅长的一个领域。与统计学不同,机器学习的预测模型是用来理解数据、解决问题的;聚焦于如何创建一个更加精准的模型,而不是用来解释模型是如何设置的。与大部分机器学习的领域不同的是,预测模型是使用表格格式的数据作为模型的输入的,因此数据的采集和整理是很重要的工作。
在接下来的一系列文章中,致力于让大家能够学习在项目中如何将机器学习的任务和Python有机地结合在一起,以便实现每一个机器学习问题的最佳实践。通过各种实例来理解学到的预测模型的知识。尽量完善一套较为通用的机器学习建模过程,通过python的一系列方法,力求只是进行简单的复制粘贴操作就可以启动一个新的机器学习项目。
我们将通过项目来介绍基于Python的生态环境如何完成机器学习的相关工作。一旦明白了如何使用Python平台来完成机器学习的任务,就可以在不同的项目中重复使用这种方法解决问题。利用机器学习的预测模型来解决问题共有六个基本步骤。
- 定义问题: 研究和提炼问题的特征,以帮助我们更好地理解项目的目标。
- 数据理解: 通过描述性统计和可视化来分析现有的数据。
- 数据准备: 对数据进行格式化,以便于构建一个预测模型 。
- 评估算法: 通过一定的方法分离一部分数据,用来评估算法模型,并选取一部分代表数据进行分析,以改善模型。
- 优化模型: 通过调参和集成算法提升预测结果的准确度。
- 结果部署: 完成模型,并执行模型来预测结果和展示。
1.4 学习机器学习的原则和技巧
学习机器学习是一段旅程。需要知道自己具备的技能、目前所掌握的知识,以及明确要达到的目标。要实现自己的目标需要付出时间和辛勤的工作 ,但是在目标的实现过程中 ,有很多工具可以帮助你快速达成目标。
1、创建半正式的工作产品。以博客文章、技术报告和代码存储的形式记下学习和发现的内容,快速地为自己和他人提供一系列可以展示的技能、知识及反思。
2、实时学习。不能仅在需要的时候才学习复杂的主题,例如,应该实时学习足够的概率和线性代数的知识来帮助理解正在处理的算法。在开始进入机器学习领域之前,不需要花费太多的时间来专门学习统计和数学方面的知识,而是要在平时的使用和参与过程中不断地进行实时学习,积累知识。
3、利用现有的技能。如果可以编码,那么通过实现算法来理解它们,而不是研究数学理论。使用自己熟悉的编程语言,让自己专注于正在学习的一件事情上,不要同时学习一种新的语言、工具或类库,这样会使学习过程复杂化。
掌握是理想。掌握机器学习需要持续不断的学习。也许你永远不可能实现掌握机器学习的目标,只能持续不断地学习和改进所掌握的知识。
下面三个技巧可以有效地帮助你快速提高学习机器学习的能力。
- 启动一个可以在一个小时内完成的小项目。
- 通过每周完成一个项目来保持你的学习势头,并建立积累自己的项目工作区。
- 在微博、微信、博客、 Github 等社交工具上分享自己的成果,或者随时随地地展示自己的兴趣,增加技能、知识,并获得反馈。
1.5 总结
这一系列的文章主要是写给对机器学习感兴趣和立志学习机器学习,但只有机器学习基础知识的甚至没多少了解人群,主要是介绍关于机器学习实践的内容,而不是关于机器学习的理论知识。 这里只会简单介绍机器学习的基本原理和算法。在这里假设你已经掌握了机器学习的基础知识,或者有能力自己来完成机器学习的基础知识的学习。
有一些人可能只是对机器学习的理论知识比较了解,但是没有多少项目实践应用,对于机器学习的应用实践可能不怎么了解;有一些人则可能只是对机器学习有一个大概的了解,不知道能通过什么样的工具和方法来使用,该如何使用。而在本系列文章中,将会引导读者如何通过Python实践机器学习算法。
2 Python机器学习的生态圈
随着 Python 生态圈的发展,在机器学习领域,Python 已经发展成为机器学习方面最主要的语言。Python 为什么能够成为机器学习的主流语言?这是因为 Python 不仅可以应用在R&D科研部门,也可以应用在实际的生产当中。本段将主要介绍Python在机器学习方面的生态圈。
2.1 Python
Python是一门面向对象的动态解释语言,简单易学,并且具有很好的可读性。Python语法简洁清晰,特色之一是强制用空白符(White Space)作为语句缩进。Python 具有丰富和强大的类库,它常被称为“胶水语言”,能够很轻松地把用其他语言制作的各种模块(尤其是C/C++)联结在一起。常见的一种应用情形是,先使用 Python 快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分用更合适的语言改写, 比如 3D游戏对图形渲染模块的性能要求特别高,就可以用 C/C++重写,而后封装为 Python可以调用的扩展类库。目前,在 Python 的生态圈中存在大量的第三方扩展类库,可以借助这些类库轻松实现项目需求。需要注意的是,在使用扩展类库时可能需要考虑平台问题,某些扩展类库可能不提供跨平台的实现。Python 目前是一门非常流行的语言,在 TIOBE最新推出的2020年1月编程语言排名位列第三,用户使用率稳居前三。
在PYPL各种编程语言的流行程度的统计中,最新一期2020年1月Python的排名遥遥领先。
Python 是一门动态语言,非常适合于交互性开发和大型项目的快速原型开发。由于Python 具有丰富的类库支持,因此被广泛应用于机器学习和数据科学方面。从这个方面来说,利用 Python 可以将研究项目和生产项目用统一的语言来实现,这就有效地降低了将研究项目转化成生产项目的成本。
2.2 SciPy
SciPy 是在数学运算、科学和工程学方面被广泛应用的Python 类库。它包括统计、优化、整合、线性代数模块、傅里叶变换、信号和图像处理、常微分方程求解器等,因此被广泛地应用在机器学习项目中 。 SciPy 依赖以下几个与机器学习相关的类库。
NumPy:是 Python 的一种开源数值计算扩展。它可用来存储和处理大型矩阵,提供了许多高级的数值编程工具, 如矩阵数据类型、矢量处理、精密的运算库。
Pandas:是基于 NumPy 的一种工具,是为了解决数据分析任务而创建的 。 Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具,也提供了大量能使我们快速、便捷地处理数据的函数和方法 。
Matplotlib:Python中最著名的20绘图库,十分适合交互式地进行制图;也可以方便地将它作为绘图控件,嵌入GUI应用程序中 。
熟悉 SciPy 是提高机器学习实践的有效手段,尤其是在以下几个方面:
- 可以利用 NumPy 数组来准备机器学习算法的数据 。
- 通过 Pandas 导入、展示数据,以便增强对数据的理解和数据清洗、转换等工作。
- 可以使用 Matplotlib 来创建图表,展示数据。
2.3 scikit-learn
scikit-leam是Python中开发和实践机器学习的著名类库之一,依赖于SciPy及其相关类库来运行。scikit-leam的基本功能主要分为六大部分:分类、回归、聚类、数据降维、模型选择和数据预处理。需要指出的是,由于scikit-leam本身不支持深度学习,也不支持GPU加速,因此 scikit-leam对于多层感知器(MLP)神经网络的实现并不适合处理大规模问题。(scikit-leam对MLP 的支持在 0.18 版之后增加)
scikit-leam是一个开源项目,遵守BSD协议,可以将项目应用于商业开发。目前主要由社区成员自发进行维护。可能是由于维护成本的限制,scikit-leam相比其他项目要显得更为保守,这主要体现在两个方面 :
- scikit-leam 从来不做除机器学习领域之外的其他扩展。
- scikit-leam 从来不采用未经广泛验证的算法。
比方说,神经网络不见得比决策树好,同样反过来也不成立。最后的结果是有很多因素在起作用的,比方说数据集的大小以及组成。
所以,针对你要解决的问题,最好是尝试多种不同的算法。并借一个测试集来评估不同算法之间的表现,最后选出一个结果最好的。当然,你要选适合解决你问题的算法来尝试。比方说,要打扫房子,你会用真空吸尘器,扫把,拖把;你绝对不会翻出一把铲子来开始挖坑,对吧。
面对海量的机器学习算法,萌新最爱问的是:“我该选什么算法?” 在回答这个问题之前,要先想清楚:
-
数据的数量、质量、本质
-
可供计算的时间
-
这个任务的紧急程度
-
你用这个数据想做什么。
要知道,即使是老司机,也无法闭着眼睛说哪个算法能拿到最好的结果。还是得动手试。