description: 《Python机器学习基础教程》的第一章笔记,书中用到的相关代码见github:https://github.com/amueller/introduction_to_ml_with_python ,笔记中不会记录。
为何选择机器学习
人为制订决策规则主要有两个缺点:
- 做决策所需要的逻辑只适用于单一领域和单项任务。任务哪怕稍有变化,都可能需要重写整个系统。
- 想要制订规则,需要对人类专家的决策过程有很深刻的理解。
机器学习能够解决的问题
- 监督学习
从输入/输出对中进行学习的机器学习算法叫作监督学习算法(supervised learning algorithm),用于算法学习的样例都对应一个预期输出, 好像有一个“老师”在监督着算法。 - 无监督学习
只有输入数据是已知的,没有为算法提供输出数据。虽然这种算法有许多成功的应用,但理解和评估这些算法往往更加困难。 - 样本&特征
通常来说,将数据想象成表格是很有用的,这里的每个实体或每一行被称为一个样本(sample)或数据点,而每一列(用来描述这些实体的属性)则被称为特征(feature)。
熟悉任务和数据
- 我想要回答的问题是什么?已经收集到的数据能够回答这个问题吗?
- 要将我的问题表示成机器学习问题,用哪种方法最好?
- 我收集的数据是否足够表达我想要解决的问题?
- 我提取了数据的哪些特征?这些特征能否实现正确的预测?
- 如何衡量应用是否成功?
- 机器学习解决方案与我的研究或商业产品中的其他部分是如何相互影响的?
为何选择Python
- 机器学习和数据分析本质上都是迭代过程,由数据驱动分析。这些过程必须要有快速迭代和易于交互的工具。
scikit-learn
- 它包含许多目前最先进的机器学习算法,每个算法都有详细的 文档 scikit-learn 也可以与其他大量 Python 科学计算工具一起使用。
- 浏览 scikit-learn 用户指南 和 API 文档,里面给出了每个算法的更多细节和更多选项。
必要的库和工具
- 如果不熟悉 NumPy 或 matplotlib,推荐阅读 SciPy 讲稿 的第 1 章
Jupyter Notebook
- 书中所有内容都是以 Jupyter Notebook 的形式进行编写的。所有代码示例都可以在 GitHub 下载 。
NumPy
- 它的功能包括多维数组、高级数学函数(比如线性代数运算和傅里叶变换),以及伪随机数生成器。
- 在 scikit-learn 中, NumPy 数组是基本数据结构,你用到的所有数据都必须转换成 NumPy 数组。
- NumPy 的核心功能是 ndarray 类,即多维(n 维)数组。数组的所有元素必须是同一类型。
SciPy
- 用于科学计算的函数集合。它具有线性代数高级程序、数学函数优化、信号处理、特殊数学函数和统计分布等多项功能。
- 对我们来说, SciPy 中最重要的是 scipy.sparse:它可以给出稀疏矩阵(sparse matrice),稀疏矩阵是 scikit-learn 中数据的另一种表示方法。如果想保存一个大部分元素都是 0 的二维数组,就可以使用稀疏矩阵。
- 关于 SciPy 稀疏矩阵的更多内容可查阅SciPy 讲稿 。
matplotlib
- 在 Jupyter Notebook 中, 可以使用
%matplotlib notebook
和%matplotlib inline
命令,将图像直接显示在浏览器中。我们推荐使用%matplotlib notebook
命令,它可以提供交互环境(虽然在本书中使用的是%matplotlib inline
)。
pandas
- 基于一种叫作 DataFrame 的数据结构。
- 一个 pandas DataFrame 是一张表格,类似于 Excel 表格。 pandas 中包含大量用于修改表格和操作表格的方法,尤其是可以像 SQL 一样对表格进行查询和连接。
- 它可以从许多文件格式和数据库中提取数据,如SQL、 Excel 文件和逗号分隔值(CSV)文件。
mglearn
- 书的附加代码可以在 GitHub 下载 附加代码不仅包括书中的所有示例,还包括 mglearn 库。 这是为本书编写的实用函数库,以免将代码清单与绘图和数据加载的细节混在一起。
- 书会频繁使用 NumPy、 matplotlib 和 pandas。所有代码都默认导入了这些库:
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import mglearn
Python 2与Python 3的对比
- 3>2
本书用到的版本
- 见代码
import sys
print("Python version: {}".format(sys.version))
import pandas as pd
print("pandas version: {}".format(pd.__version__))
import matplotlib
print("matplotlib version: {}".format(matplotlib.__version__))
import numpy as np
print("NumPy version: {}".format(np.__version__))
import scipy as sp
print("SciPy version: {}".format(sp.__version__))
import IPython
print("IPython version: {}".format(IPython.__version__))
import sklearn
print("scikit-learn version: {}".format(sklearn.__version__))
第一个应用——鸢尾花分类
- 监督学习->分类->三分类问题
初识数据
本例中用到了鸢尾花(Iris)数据集,这是机器学习和统计学中一个经典的数据集。它包含在 scikit-learn 的 datasets 模块中。我们可以调用 load_iris 函数来加载数据。
衡量模型是否成功: 训练数据与测试数据
- 模型会一直记住整个训练集,所以对于训练集中的任何数据点总会预测正确的标签。这种“记忆”无法告诉我们模型的泛化(generalize)能力如何(换句话说,在新数据上能否正确预测)。
- 用新数据来评估模型的性能->将收集好的带标签数据(此例为 150 朵花的测量数据)分成两份->一份用于构建机器学习模型,叫作训练数据(training data)或训练集(training set),其余用来评估模型性能,叫作测试数据(test data)、测试集(test set)或留出集(hold-out set)。
scikit-learn 中的 train_test_split 函数可以打乱数据集并进行拆分。这个函数将 75% 的行数据及对应标签作为训练集,剩下 25% 的数据及其标签作为测试集。(训练集与测试集的分配比例可以是随意的,但使用 25% 的数据作为测试集是很好的经验法则)
- scikit-learn 中的数据通常用大写的 X 表示,而标签用小写的 y 表示。这是受到了数学标准公式 f(x)=y 的启发,其中 x 是函数的输入, y 是输出。我们用大写的 X 是因为数据是一个二维数组(矩阵),用小写的 y 是因为目标是一个一维数组(向量),这也是数学中的约定。
为了确保多次运行同一函数能够得到相同的输出,这里利用 random_state 参数指定了随机数生成器的种子。这样函数输出就是固定不变的,所以这行代码的输出始终相同。本书用到随机过程时,都会用这种方法指定 random_state。
要事第一: 观察数据
- 在构建机器学习模型之前,通常最好检查一下数据。
检查数据也是发现异常值和特殊值的好方法
-
检查数据的最佳方法之一就是将其可视化,有两种方法:
(1)绘制散点图:数据散点图将一个特征作为 x 轴,另一个特征作为 y 轴。
(2)绘制散点图矩阵:可以两两查看所有的特征。pandas 有一个绘制散点图矩阵的函数,叫作 scatter_matrix
构建第一个模型: k近邻算法
k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如
说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。然后,我们可以用这些
邻居中数量最多的类别做出预测。
现在我们只考虑一个邻居的情况
- scikit-learn 中所有的机器学习模型都在各自的类中实现,这些类被称为 Estimator类(需实例化为对象才可使用该模型)。
knn 对象对算法进行了封装,既包括用训练数据构建模型的算法,也包括对新数据点进行
预测的算法
- 想要基于训练集来构建模型,需要调用 knn 对象的 fit 方法。
做出预测
发现新花,将这朵花的测量数据转换为二维 NumPy 数组的一行,调用 knn 对象的 predict 方法来进行预测。产生预测结果,但由于并不知道这个样本的实际品种,故要进行结果评估。
评估模型
需要用到之前创建的测试集,可以对测试数据中的每朵鸢尾花进行预测,并将预测结果与标签(已知的品种)进行对比。通过计算精度(accuracy)来衡量模型的优劣,精度就是品种预测正确的花所占的比例。对于这个模型来说,测试集的精度约为 0.97。
小结与展望
学接口,学调参orz