![26af80906ff736b992a6ff02a7d2d34e.png](https://i-blog.csdnimg.cn/blog_migrate/07c17c8a487b9f8c8c9f20d7ae144067.jpeg)
原文链接:https://www.pyimagesearch.com/2019/01/14/machine-learning-in-python/
作者:Adrian Rosebrock
这是一篇手把手教你使用 Python 实现机器学习算法,并在数值型数据和图像数据集上运行模型的入门教程,当你看完本文后,你应当可以开始你的机器学习之旅了!
本教程会采用下述两个库来实现机器学习算法:
- scikit-learn
- Keras
此外,你还将学习到:
- 评估你的问题
- 准备数据(原始数据、特征提取、特征工程等等)
- 检查各种机器学习算法
- 检验实验结果
- 深入了解性能最好的算法
在本文会用到的机器学习算法包括:
- KNN
- 朴素贝叶斯
- 逻辑回归
- SVM
- 决策树
- 随机森林
- 感知机
- 多层前向网络
- CNNs
安装必备的 Python 机器学习库
开始本教程前,需要先确保安装了一下的 Python 库:
- Numpy:用于 Python 的数值处理
- PIL:一个简单的图像处理库
- scikit-learn:包含多种机器学习算法(注意需要采用 0.2+ 的版本,所以下方安装命令需要加上 --upgrade )
- Kears 和 TensorFlow:用于深度学习。本教程可以仅采用 CPU 版本的 TensorFlow
- OpenCV:本教程并不会采用到 OpenCV,但 imutils 库依赖它;
- imutils :作者的图像处理/计算机视觉库
安装命令如下,推荐采用虚拟环境(比如利用 anaconda 创建一个新的环境):
$ pip install numpy$ pip install pillow$ pip install --upgrade scikit-learn$ pip install tensorflow # or tensorflow-gpu$ pip install keras$ pip install opencv-contrib-python$ pip install --upgrade imutils
数据集
本教程会用到两个数据集来帮助更好的了解每个机器学习算法的性能。
第一个数据集是 Iris(鸢尾花) 数据集。这个数据集的地位,相当于你刚开始学习一门编程语言时,敲下的 “Hello,World!”
这个数据集是一个数值型的数据,如下图所示,其实就是一个表格数据,每一行代表一个样本,然后每一列就是不同的属性。这个数据集主要是收集了三种不同的鸢尾花的数据,分别为:
- Iris Setosa
- Iris Versicolor
- Iris Virginica
对应图中最后一列 Class label,然后还有四种属性,分别是:
- Sepal length--萼片长度
- Sepal width--萼片宽度
- Petal length--花瓣长度
- Petal width--花瓣宽度
![e52af0222ee4764e1ac8b718f943eba6.png](https://i-blog.csdnimg.cn/blog_migrate/aa130f714d7f9f3d6136c9493139fad7.jpeg)
这个数据集可能是最简单的机器学习数据集之一了,通常是用于教导程序员和工程师的机器学习和模式识别基础的数据集。
对于该数据集,我们的目标就是根据给定的四个属性,训练一个机器学习模型来正确分类每个样本的类别。
需要注意的是,其中有一个类别和另外两个类别是线性可分的,但这两个类别之间却并非线性可分,所以我们需要采用一个非线性模型来对它们进行分类。当然了,在现实生活中,采用非线性模型的机器学习算法是非常常见的。
第二个数据集是一个三场景的图像数据集。这是帮助初学者学习如何处理图像数据,并且哪种算法在这两种数据集上性能最优。
下图是这个三场景数据集的部分图片例子,它包括森林、高速公路和海岸线三种场景,总共是 948 张图片,每个类别的具体图片数量如下:
- Coast: 360
- Forest: 328
- Highway: 260
![61d67f05eae2aebfba849f1bfa593c2a.png](https://i-blog.csdnimg.cn/blog_migrate/71419a8fb3f7b81578ab1215d96b40db.jpeg)
这个三场景数据集是采样于一个八场景数据集中,作者是 Oliva 和 Torralba 的 2001 年的一篇论文,Modeling the shape of the scene: a holistic representation of the spatial envelope: http://people.csail.mit.edu/torralba/code/spatialenvelope/
利用 Python 实现机器学习的步骤
无论什么时候实现机器学习算法,推荐采用如下流程来开始:
- 评估你的问题
- 准备数据(原始数据、特征提取、特征工程等等)
- 检查各种机器学习算法
- 检验实验结果
- 深入了解性能最好的算法
这个流程会随着你机器学习方面的经验的积累而改善和优化,但对于初学者,这是我建议入门机器学习时采用的流程。
所以,现在开始吧!第一步,就是评估我们的问题,问一下自己:
- 数据集是哪种类型?数值型,类别型还是图像?
- 模型的最终目标是什么?
- 如何定义和衡量“准确率”呢?
- 以目前自身的机器学习知识来看,哪些算法在处理这类问题上效果很好?
最后一个问题非常重要,随着你使用 Python 实现机器学习的次数的增加,你也会随之获得更多的经验。根据之前的经验,你可能知道有一种算法的性能还不错。
因此,接着就是准备数据,也就是数据预处理以及特征工程了。
一般来说,这一步,包括了从硬盘中载入数据,检查数据,然后决定是否需要做特征提取或者特征工程。
特征提取就是应用某种算法通过某种方式来量化数据的过程。比如,对于图像数据,我们可以采用计算直方图的方法来统计图像中像素强度的分布,通过这种方式,我们就得到描述图像颜色的特征。
而特征工程则是将原始输入数据转换成一个更好描述潜在问题的特征表示的过程。当然特征工程是一项更先进的技术,这里建议在对机器学习有了一定经验后再采用这种方法处理数据。
第三步,就是检查各种机器学习算法,也就是实现一系列机器学习算法,并应用在数据集上。
这里,你的工具箱应当包含以下几种不同类型的机器学习算法:
- 线性模型(比如,逻辑回归,线性 SVM)
- 非线性模型(比如 RBF SVM,梯度下降分类器)
- 树和基于集成的模型(比如 决策树和随机森林)
- 神经网络(比如 多层感知机,卷积神经网络)
应当选择比较鲁棒(稳定)的一系列机器学习模型来评估问题,因为我们的目标就是判断哪种算法在当前问题的性能很好,而哪些算法很糟糕。
决定好要采用的模型后,接下来就是训练模型并在数据集上测试,观察每个模型在数据集上的性能结果。
在多次实验后,你可能就是有一种“第六感”,知道哪种算法更适用于哪种数据集。
比如,你会发现:
- 对于有很多特征的数据集,随机森林算法的效果很不错;
- 而逻辑回归算法可以很好处理高维度的稀疏数据;
- 对于图像数据,CNNs 的效果非常好。
而以上的经验获得,当然就需要你多动手,多进行实战来深入了解不同的机器学习算法了!
开始动手吧!
接下来就开始敲代码来实现机器学习算法,并在上述两个数据集上进行测试。本教程的代码文件目录如下,包含四份代码文件和一个 3scenes文件夹,该文件夹就是三场景数据集,而 Iris 数据集直接采用 scikit-learn 库载入即可。
├── 3scenes│ ├── coast [360 entries]│ ├── forest [328 entries]│ └── highway [260 entries]├── classify_iris.py├── classify_images.py├── nn_iris.py└── basic_cnn.py
代码和数据集文件可以在公众号后台,也就是公众号会话界面回复 『py_ml』获取!
首先是实现 classify_iris.py,这份代码是采用机器学习算法来对 Iris 数据集进行分类。
首先导入需要的库:
from sklearn.neighbors import KNeighborsClassifierfrom sklearn.naive_bayes import GaussianNBfrom sklearn.linear_model import LogisticRegressionfrom sklearn.svm import SVCfrom sklearn.tree import DecisionTreeClassifierfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.neural_network import MLPClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_reportfrom sklearn.datasets import load_irisimport argparse# 设置参数ap = argparse.ArgumentParser()ap.add_argument("-m