Python机器学习基础篇一《为什么用Python进行机器学习》

本文是Python机器学习基础教程的第一部分,主要介绍了为何选择机器学习,特别是监督学习,以及为何使用Python作为工具。通过鸢尾花分类案例,展示了数据预处理、模型构建、评估和可视化的基本步骤,强调了理解数据和任务的重要性,以及Python科学计算库如scikit-learn、NumPy、SciPy、matplotlib和pandas在机器学习中的作用。
摘要由CSDN通过智能技术生成

机器学习(machine learning)是从数据中提取知识。它是统计学、人工智能和计算机科学交叉的研究领域,也被称为预测分析(predictive analytics)或统计学习(statistical learning)。近年来,机器学习方法已经应用到日常生活的方方面面。从自动推荐看什么电 影、点什么食物、买什么商品,到个性化的在线电台和从照片中识别好友,许多现代化网站和设备的核心都是机器学习算法。当你访问像 Facebook、Amazon 或 Netflix 这样的复杂 网站时,很可能网站的每一部分都包含多种机器学习模型。

除了商业应用之外,机器学习也对当前数据驱动的研究方法产生了很大影响。本书中介绍的工具均已应用在各种科学问题上,比如研究恒星、寻找遥远的行星、发现新粒子、分析 DNA 序列,以及提供个性化的癌症治疗方案。

不过,如果想受益于机器学习算法,你的应用无需像上面那些例子那样给世界带来重大改变,数据量也用不着那么大。本章将解释机器学习如此流行的原因,并探讨机器学习可以 解决哪些类型的问题。然后将向你展示如何构建第一个机器学习模型,同时介绍一些重要的概念。

1.1 为何选择机器学习

在“智能”应用的早期,许多系统使用人为制订的“if”和“else”决策规则来处理数据, 或根据用户输入的内容进行调整。想象有一个垃圾邮件过滤器,其任务是酌情将收到的某些邮件移动到垃圾邮件文件夹。你可以创建一个关键词黑名单,所有包含这些关键词的邮 件都会被标记为垃圾邮件。这是用专家设计的规则体系来设计“智能”应用的一个示例。 人为制订的决策规则对某些应用来说是可行的,特别是人们对其模型处理过程非常熟悉的 应用。但是,人为制订决策规则主要有两个缺点。

  • 做决策所需要的逻辑只适用于单一领域和单项任务。任务哪怕稍有变化,都可能需要重写整个系统。
  • 想要制订规则,需要对人类专家的决策过程有很深刻的理解。

这种人为制订规则的方法并不适用的一个例子就是图像中的人脸检测。如今,每台智能手机都能够检测到图像中的人脸。但直到 2001 年,人脸检测问题才得到解决。其主要问题 在于,计算机“感知”像素(像素组成了计算机中的图像)的方式与人类感知面部的方式有非常大的不同。正是由于这种表征差异,人类想要制订出一套好的规则来描述数字图像中的人脸构成,基本上是不可能的。

但有了机器学习算法,仅向程序输入海量人脸图像,就足以让算法确定识别人脸需要哪些特征。

1.1.1 机器学习能够解决的问题

最成功的机器学习算法是能够将决策过程自动化的那些算法,这些决策过程是从已知示例中泛化得出的。在这种叫作监督学习supervised learning)的方法中,用户将成对的输入和预期输出提供给算法,算法会找到一种方法,根据给定输入给出预期输出。尤其是在没有人类帮助的情况下,给定前所未见的输入,算法也能够给出相应的输出。回到前面垃圾邮件分类的例子,利用机器学习算法,用户为算法提供大量电子邮件(作为输入),以及这些邮件是否为垃圾邮件的信息(作为预期输出)。给定一封新邮件,算法就能够预测它是否为垃圾邮件。

从输入 / 输出对中进行学习的机器学习算法叫作监督学习算法(supervised learning algorithm), 因为每个用于算法学习的样例都对应一个预期输出,好像有一个“老师”在监督着算法。虽然创建一个包含输入和输出的数据集往往费时又费力,但监督学习算法很好理解,其性能也易于测量。如果你的应用可以表示成一个监督学习问题,并且你能够创建包含预期输出的数据集, 那么机器学习很可能可以解决你的问题。

监督机器学习任务的示例如下:

1.识别信封上手写的邮政编码

​ 这里的输入是扫描的手写数字,预期输出是邮政编码中的实际数字。想要创建用于构建机器学习模型的数据集,你需要收集许多信封。然后你可以自己阅读邮政编码,将数字保存为预期输出。

2.基于医学影像判断肿瘤是否为良性

​ 这里的输入是影像,输出是肿瘤是否为良性。想要创建用于构建模型的数据集,你需要 一个医学影像数据库。你还需要咨询专家的意见,因此医生需要查看所有影像,然后判 断哪些肿瘤是良性的,哪些不是良性的。除了影像内容之外,甚至可能还需要做额外的诊断来判断影像中的肿瘤是否为癌变。

3.检测信用卡交易中的诈骗行为

​ 这里的输入是信用卡交易记录,输出是该交易记录是否可能为诈骗。假设你是信用卡的发行单位,收集数据集意味着需要保存所有的交易,并记录用户是否上报过任何诈骗交易。

在这些例子中需要注意一个有趣的现象,就是虽然输入和输出看起来相当简单,但三个例 子中的数据收集过程却大不相同。阅读信封虽然很辛苦,却非常简单,也不用花多少钱。 与之相反,获取医学影像和诊断不仅需要昂贵的设备,还需要稀有又昂贵的专家知识,更不要说伦理问题和隐私问题了。在检测信用卡诈骗的例子中,收集数据要容易得多。你的顾客会上报诈骗行为,从而为你提供预期输出。要获取所有欺诈行为和非欺诈行为的输入 / 输出对,你只需等待即可。

本书会讲到的另一类算法是无监督学习算法unsupervised learning algorithm)。在无监督学习中,只有输入数据是已知的,没有为算法提供输出数据。虽然这种算法有许多成功的 应用,但理解和评估这些算法往往更加困难。

无监督学习的示例如下:

1.确定一系列博客文章的主题

​ 如果你有许多文本数据,可能想对其进行汇总,并找到其中共同的主题。事先你可能并不知道都有哪些主题,或者可能有多少个主题。所以输出是未知的。

2.将客户分成具有相似偏好的群组

​ 给定一组客户记录,你可能想要找出哪些客户比较相似,并判断能否根据相似偏好对这 些客户进行分组。对于一家购物网站来说,客户分组可能是“父母”“书虫”或“游戏 玩家”。由于你事先并不知道可能有哪些分组,甚至不知道有多少组,所以并不知道输出是什么。

3.检测网站的异常访问模式

​ 想要识别网站的滥用或 bug,找到异常的访问模式往往是很有用的。每种异常访问模式 都互不相同,而且你可能没有任何记录在案的异常行为示例。在这个例子中你只是观察流量,并不知道什么是正常访问行为和异常访问行为,所以这是一个无监督学习问题。

**无论是监督学习任务还是无监督学习任务,将输入数据表征为计算机可以理解的形式都是十分重要的。**通常来说,将数据想象成表格是很有用的。你想要处理的每一个数据点(每一封电子邮件、每一名客户、每一次交易)对应表格中的一行,描述该数据点的每一项属性(比如客户年龄、交易金额或交易地点)对应表格中的一列。你可能会从年龄、性别、 账号创建时间、在你的购物网站上的购买频率等方面来描述用户。你可能会用每一个像素的灰度值来描述肿瘤图像,也可能利用肿瘤的大小、形状和颜色进行描述。

在机器学习中,这里的每个实体或每一行被称为一个样本sample)或数据点,而每一列 (用来描述这些实体的属性)则被称为特征(feature)。

本文后面会更详细地介绍如何构建良好的数据表征,这被称为特征提取feature extraction)或特征工程feature engineering)。但你应该记住,如果没有数据信息的话,所有机器学习算法都无法做出预测。举个例子,如果你只有病人的姓氏这一个特征,那么任何算法都无法预测其性别。这一信息并未包含在数据中。如果你添加另一个特征,里面包含病人的名字,那么你预测正确的可能性就会变大,因为通过一个人的名字往往可以判断其性别。

1.1.2 熟悉任务和数据

在机器学习过程中,最重要的部分很可能是理解你正在处理的数据,以及这些数据与你想要解决的任务之间的关系。随机选择一个算法并将你的数据输入进去,这种做法是不会有什么用的。在开始构建模型之前,你需要理解数据集的内容。**每一种算法的输入数据类型和最适合解决的问题都是不一样的。**在构建机器学习解决方案的过程中,你应该给出下列问题的答案,或者至少要将这些问题记在脑中。

  • 我想要回答的问题是什么?已经收集到的数据能够回答这个问题吗?
  • 要将我的问题表示成机器学习问题,用哪种方法最好?
  • 我收集的数据是否足够表达我想要解决的问题?
  • 我提取了数据的哪些特征?这些特征能否实现正确的预测?
  • 如何衡量应用是否成功?
  • 机器学习解决方案与我的研究或商业产品中的其他部分是如何相互影响的?

从更大的层面来看,机器学习算法和方法只是解决特定问题的过程中的一部分,一定要始 终牢记整个项目的大局。许多人浪费大量时间构建复杂的机器学习解决方案,最终却发现 没有解决正确的问题。

当深入研究机器学习的技术细节时(本书会讲到这些细节),很容易忽视最终目标。我们 虽然不会详细讨论上面列出的问题,但仍然鼓励你记住自己在开始构建机器学习模型时做 出的假设,无论是明确的还是隐含的假设。

1.2 为何选择Python

Python 已经成为许多数据科学应用的通用语言。它既有通用编程语言的强大功能,也有特定领域脚本语言(比如 MATLAB 或 R)的易用性。Python 有用于数据加载、可视化、统计、自然语言处理、图像处理等各种功能的库。这个大型工具箱为数据科学家提供了大量的通用功能和专用功能。使用 Python 的主要优点之一,就是利用终端或其他类似 Jupyter Notebook 的工具能够直接与代码进行交互;我们很快会讲到 Jupyter Notebook。机器学习 和数据分析本质上都是迭代过程,由数据驱动分析。这些过程必须要有快速迭代和易于交互的工具。

作为通用编程语言,Python 还可以用来创建复杂的图形用户界面(graphical user interface, GUI)和 Web 服务,也可以集成到现有系统中。

1.3 scikit-learn

scikit-learn 是一个开源项目,可以免费使用和分发,任何人都可以轻松获取其源代码来查看其背后的原理。scikit-learn 项目正在不断地开发和改进中,它的用户社区非常活跃。它包含许多目前最先进的机器学习算法,每个算法都有详细的文档(http://scikit-learn.org/stable/documentation)。scikit-learn 是一个非常流行的工具,也是最有名的 Python 机器学习库。它广泛应用于工业界和学术界,网上有大量的教程和代码片段。scikit-learn 也可以与其他大量 Python 科学计算工具一起使用,本章后面会讲到相关内容。

在阅读本书的过程中,我们建议你同时浏览 scikit-learn 用户指南(http://scikit-learn.org/stable/user_guide.html)和 API 文档,里面给出了每个算法的更多细节和更多选项。在线文档非常全面,而本书会介绍机器学习的所有必备知识,以便于你深入了解。

1.安装scikit-learn

scikit-learn 依赖于另外两个 Python 包:NumPySciPy。若想绘图和进行交互式开发, 还应该安装 matplotlibIPythonJupyter Notebook。我们推荐使用下面三个预先打包的 Python 发行版之一,里面已经装有必要的包。

Anaconda(https://store.continuum.io/cshop/anaconda/)

​ 用于大规模数据处理、预测分析和科学计算的 Python 发行版。Anaconda 已经预先安装 好 NumPy、SciPy、matplotlib、pandas、IPython、Jupyter Notebook 和 scikit-learn。 它可以在 Mac OS、Windows 和 Linux 上运行,是一种非常方便的解决方案。对于尚未安装 Python 科学计算包的人,我们建议使用 Anaconda。Anaconda 现在还免费提供商用 的 Intel MKL 库。MKL(在安装 Anaconda 时自动安装)可以使 scikit-learn 中许多算法的速度大大提升。

Enthought Canopy(https://www.enthought.com/products/canopy/)

​ 用于科学计算的另一款 Python 发行版。它已经预先装有 NumPy、SciPy、matplotlib、 pandas 和 IPython,但免费版没有预先安装 scikit-learn。如果你是能够授予学位的学术机构的成员,可以申请学术许可,免费使用 Enthought Canopy 的付费订阅版。 Enthought Canopy 适用于 Python 2.7.x,可以在 Mac OS、Windows 和 Linux 上运行。

Python(x,y)(http://python-xy.github.io/)

​ 专门为 Windows 打造的 Python 科学计算免费发行版。Python(x,y) 已经预先装有 NumPy、 SciPy、matplotlib、pandas、IPython 和 scikit-learn。

如果你已经安装了 Python,可以用 pip 安装上述所有包:

$ pip install numpy scipy matplotlib ipython scikit-learn pandas

1.4 必要的库和工具

了解 scikit-learn 及其用法是很重要的,但还有其他一些库也可以改善你的编程体验。 scikit-learn 是基于 NumPySciPy 科学计算库的。除了 NumPy 和 SciPy,我们还会用 到 pandasmatplotlib。我们还会介绍 Jupyter Notebook,一个基于浏览器的交互编程环 境。简单来说,对于这些工具,你应该了解以下内容,以便充分利用 scikit-learn。

1.4.1 Jupyter Notebook

Jupyter Notebook 是可以在浏览器中运行代码的交互环境。这个工具在探索性数据分析方面非常有用,在数据科学家中广为使用。虽然 Jupyter Notebook 支持多种编程语言,但我们只需要支持 Python 即可。用 Jupyter Notebook 整合代码、文本和图像非常方便,实际上本教程所有内容都是以 Jupyter Notebook 的形式进行编写的。所有代码示例都可以在 GitHub 下 载(https://github.com/amueller/introduction_to_ml_with_python)。

1.4.2 NumPy

NumPy 是 Python 科学计算的基础包之一。它的功能包括多维数组、高级数学函数(比如线性代数运算和傅里叶变换),以及伪随机数生成器。

scikit-learn 中,NumPy 数组是基本数据结构。scikit-learn 接受 NumPy 数组格式的数据。你用到的所有数据都必须转换成 NumPy 数组。NumPy 的核心功能是 ndarray 类, 即多维(n 维)数组。数组的所有元素必须是同一类型。NumPy 数组如下所示:

In[2]:

import numpy as np
x = np.array([[1, 2, 3], [4, 5, 6]])
print("x:\n{}".format(x))

Out[2]:

x:
[[1 2 3]
 [4 5 6]]

本文会经常用到 NumPy。对于 NumPy ndarray 类的对象,我们将其简称为“NumPy 数组” 或“数组”。

1.4.3 SciPy

SciPy 是 Python 中用于科学计算的函数集合。它具有线性代数高级程序、数学函数优化、信号处理、特殊数学函数和统计分布等多项功能。scikit-learn 利用 SciPy 中的函数集合来实现算法。对我们来说,SciPy 中最重要的是 scipy.sparse:它可以给出稀疏矩阵 (sparse matrice),稀疏矩阵是 scikit-learn 中数据的另一种表示方法。如果想保存一个大部分元素都是 0 的二维数组,就可以使用稀疏矩阵:

In[3]:

from scipy import sparse
# 创建一个二维NumPy数组,对角线为1,其余都为0
eye = np.eye(4)
print("NumPy array:\n{}"
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值