提交 f7ded8ff 编写于 作者: W wizardforcel

2020-08-02 15:49:50

上级 81056c6c
......@@ -8,11 +8,11 @@
你可以用这些数据做很多事情:检查它,总结它,甚至以几种美妙的方式将它可视化。但是,本书讨论了数据的另一种用途:作为改善算法表现的经验来源。这些算法可以从以前的数据中学习,属于机器学习领域,这是人工智能的一个子领域。
任何机器学习问题都可以 用以下三个概念表示:
任何机器学习问题都可以用以下三个概念表示:
* 我们将必须解决任务`T`。例如,构建一个垃圾邮件过滤器,学习将电子邮件归类为垃圾邮件或正常邮件。
* 我们需要一些经验`E`来学习执行任务。通常,经验通过数据集表示。对于垃圾邮件过滤器,体验来自一组电子邮件,由人工分类为垃圾邮件或正常邮件。
* 我们需要一定程度的表现`P`来了解我们解决任务的能力,以及了解经过一些修改后,我们的结果是在改善还是在恶化。我们的垃圾邮件过滤正确将 分类为垃圾邮件或正常邮件的电子邮件百分比,可能是我们的垃圾邮件过滤任务的`P`
* 我们需要一定程度的表现`P`来了解我们解决任务的能力,以及了解经过一些修改后,我们的结果是在改善还是在恶化。我们的垃圾邮件过滤器将电子邮件正确分类为垃圾邮件或正常邮件的百分比,可能是我们的垃圾邮件过滤任务的`P`
Scikit-learn 是一个开源的 Python 机器学习算法库,它允许我们构建这些类型的系统。该项目于 2007 年由 David Cournapeau 作为 Google Summer of Code 项目启动。那年晚些时候,Matthieu Brucher 作为他论文的一部分开始研究这个项目。2010 年,Fabian Pedregosa,Gael Varoquaux,Alexandre Gramfort,INRIA 的 Vincent Michel 领导项目并首次公开发布。如今,该项目正在由热情的贡献者社区积极开发。它建立在 [NumPy](http://www.numpy.org/)[SciPy](http://scipy.org/) 之上,它是用于科学计算的标准 Python 库。通过本书,我们将使用它向您展示,如何将先前数据整合为经验来源,来有效解决几个常见的编程任务。
......@@ -126,7 +126,7 @@ Scikit-learn 是一个开源的 Python 机器学习算法库,它允许我们
# 我们的第一个机器学习方法 - 线性分类
为了处理 scikit-learn 中机器学习的问题,我们将从一个非常简单的机器学习问题开始:我们将尝试仅预测两个鸢尾花种属性:萼片宽度和萼片长度。这是分类问题的一个实例,我们希望 根据其特征为项目分配标签(从离散集合中取得的值)。
为了处理 scikit-learn 中机器学习的问题,我们将从一个非常简单的机器学习问题开始:我们将尝试仅预测两个鸢尾花种属性:萼片宽度和萼片长度。这是分类问题的一个实例,我们希望根据其特征为项目分配标签(从离散集合中取得的值)。
让我们首先构建我们的训练数据集 - 原始样本的子集,由我们选择的两个属性及其各自的目标值表示。导入数据集后,我们将随机选择大约 75% 的实例,并保留剩余的实例(评估数据集)来用于评估目的(我们将在后面看到为什么我们应该总是这样做):
......@@ -148,7 +148,7 @@ Scikit-learn 是一个开源的 Python 机器学习算法库,它允许我们
`train_test_split`函数自动构建训练和评估数据集,随机选择样本。为什么不选择前 112 个例子呢?这是因为样本中的实例顺序可能很重要,并且第一个实例可能与最后一个实例不同。事实上,如果你看一下 Iris 数据集,实例按其目标类排序,这意味着新训练集中`0``1`类的比例将更高 ,与原始数据集进行比较。我们总是希望我们的训练数据成为他们所代表的总体的代表性样本。
前一代码的最后三行在通常称为特征缩放的过程中修改训练集。对于每个特征, 计算平均值,从特征值中减去平均值,并将结果除以它们的标准差。缩放后,每个 特征的平均值为零,标准差为 1。这种值的标准化(不会改变它们的分布,因为你可以通过在缩放之前和之后绘制`X`值来验证)是机器学习方法的常见要求,来避免具有大值的特征可能在权重上过重。
前一代码的最后三行在通常称为特征缩放的过程中修改训练集。对于每个特征, 计算平均值,从特征值中减去平均值,并将结果除以它们的标准差。缩放后,每个特征的平均值为零,标准差为 1。这种值的标准化(不会改变它们的分布,因为你可以通过在缩放之前和之后绘制`X`值来验证)是机器学习方法的常见要求,来避免具有大值的特征可能在权重上过重。
现在,让我们看一下我们的训练实例如何在由学习特征生成的,二维空间中分布。来自 matplotlib 库的`pyplot`将帮助我们:
......@@ -184,7 +184,7 @@ Scikit-learn 是一个开源的 Python 机器学习算法库,它允许我们
>>> clf.fit(X_train, y_train)
```
`SGDClassifier`初始化 函数 允许多个参数。目前,我们将使用默认值,但请记住,这些参数可能非常重要,尤其是当您面对更多真实世界的任务时,实例数量(甚至属性数量)可能非常大。 `fit`函数可能是 scikit-learn 中最重要的函数。它接收训练数据和训练类别,并构建分类器。 scikit-learn 中的每个监督学习方法都实现了这个函数。
`SGDClassifier`初始化函数允许多个参数。目前,我们将使用默认值,但请记住,这些参数可能非常重要,尤其是当您面对更多真实世界的任务时,实例数量(甚至属性数量)可能非常大。 `fit`函数可能是 scikit-learn 中最重要的函数。它接收训练数据和训练类别,并构建分类器。 scikit-learn 中的每个监督学习方法都实现了这个函数。
在我们的线性模型方法中,分类器看起来像什么?正如我们已经说过的,每个未来的分类决策都只取决于超平面。那个超平面就是我们的模型。`clf`对象的`coef_`属性(暂时考虑,只考虑矩阵的第一行),现在具有线性边界的系数和`intercept_`属性,直线与 y 轴的交点。我们打印出来:
......@@ -236,7 +236,7 @@ Scikit-learn 是一个开源的 Python 机器学习算法库,它允许我们
第一个图显示了为原始二元问题构建的模型。看起来这条线与其余的线条相当好地分离了 Iris setosa。对于其他两个任务,正如我们所预料的那样,有几个点位于超平面的错误一侧。
现在,故事的结尾:假设 我们有一个新的花,萼片宽度为 4.7,萼片长度为 3.1,我们想要预测它的类别。我们只需要使用我们全新的分类器(标准化后!)。预测方法接受实例列表(在这种情况下,仅使用一个元素)并返回预测类别的列表:
现在,故事的结尾:假设我们有一个新的花,萼片宽度为 4.7,萼片长度为 3.1,我们想要预测它的类别。我们只需要使用我们全新的分类器(标准化后!)。预测方法接受实例列表(在这种情况下,仅使用一个元素)并返回预测类别的列表:
```py
>>>print clf.predict(scaler.transform([[4.7, 3.1]]))
......@@ -280,7 +280,7 @@ Scikit-learn 是一个开源的 Python 机器学习算法库,它允许我们
在 scikit-learn 中,有几个评估函数;我们将展示三种流行的:精确率,召回率和 F1 得分(或 f-measure)。他们假设二元分类问题和两个类 - 正面和负面。在我们的例子中,正类可以是 Iris setosa,而其他两个将合并为一个负类。
* **精确率**: 计算预测为正例的实例中,正确评估的比例(它测量分类器在表示实例为正时的正确程度) 。
* **召回率**:计算 正确评估的正例示例的比例(测量我们的分类器在面对正例实例时的正确率)。
* **召回率**:计算正确评估的正例示例的比例(测量我们的分类器在面对正例实例时的正确率)。
* **F1 得分**:这是精确率和召回率的调和平均值。
### 注意
......@@ -381,7 +381,7 @@ Mean score: 0.713 (+/-0.057)
# 与机器学习相关的重要概念
我们在上一节 中提出的线性分类器看起来太简单了。如果我们使用更高次多项式怎么办?如果我们不仅将萼片的长度和宽度,还有花瓣长度和花瓣宽度作为特征,该怎么办?这是完全可能的,并且根据样本分布,它可以更好地拟合训练数据,从而提高准确率。这种方法的问题是,现在我们不仅要估计三个原始参数(`x1``x2`的系数,以及截距),还有新特征的参数`x3``x4`(花瓣长度和宽度)以及这四个特征乘积的组合。
我们在上一节中提出的线性分类器看起来太简单了。如果我们使用更高次多项式怎么办?如果我们不仅将萼片的长度和宽度,还有花瓣长度和花瓣宽度作为特征,该怎么办?这是完全可能的,并且根据样本分布,它可以更好地拟合训练数据,从而提高准确率。这种方法的问题是,现在我们不仅要估计三个原始参数(`x1``x2`的系数,以及截距),还有新特征的参数`x3``x4`(花瓣长度和宽度)以及这四个特征乘积的组合。
直观地说,我们需要更多的训练数据来充分估计这些参数。如果我们添加更多特征或更高阶项,参数的数量(以及因此,充分估计它们所需的训练数据量)将迅速增加。这种现象存在于每种机器学习方法中,被称为维度的概念:当模型的参数数量增加时,学习它们所需的数据呈指数增长。
......
......@@ -6,7 +6,7 @@
# 使用支持向量机进行图像识别
想象一下,数据集中的实例是多维空间中的点;我们可以假设我们的分类器构建的模型可以是 表面,也可以使用线性代数术语,即将一个类的实例(点)与其余类别分开的超平面。**支持向量机****SVM**)是监督学习方法,试图以最佳方式获得这些超平面,通过选择那些通过不同类的实例之间最宽的间距。新实例将根据它们在表面的哪一侧,被归类为属于某个类别。
想象一下,数据集中的实例是多维空间中的点;我们可以假设我们的分类器构建的模型可以是表面,也可以使用线性代数术语,即将一个类的实例(点)与其余类别分开的超平面。**支持向量机****SVM**)是监督学习方法,试图以最佳方式获得这些超平面,通过选择那些通过不同类的实例之间最宽的间距。新实例将根据它们在表面的哪一侧,被归类为属于某个类别。
下图显示了具有两个特征(`X1``X2`)和两个类别(黑色和白色)的二维空间示例:
......@@ -16,7 +16,7 @@
这种方法不仅可以在二维中构造超平面,而且可以推广到高维或无限维空间中。更重要的是,我们可以使用非线性曲面,例如多项式或径向基函数,通过使用所谓的核技巧,隐式地将输入映射到高维特征空间。
SVM 已成为许多任务中最先进的机器学习模型之一,在许多 实际应用中具有出色的结果。SVM 的最大优势之一是它们在高维空间上工作时非常有效,即在具有许多要学习的特征的问题上。当数据稀疏时,它们也非常有效(考虑具有极少数实例的高维空间)。此外,它们在存储空间方面非常有效,因为学习空间中仅有一部分点用于表示决策表面。
SVM 已成为许多任务中最先进的机器学习模型之一,在许多实际应用中具有出色的结果。SVM 的最大优势之一是它们在高维空间上工作时非常有效,即在具有许多要学习的特征的问题上。当数据稀疏时,它们也非常有效(考虑具有极少数实例的高维空间)。此外,它们在存储空间方面非常有效,因为学习空间中仅有一部分点用于表示决策表面。
提到一些缺点,SVM 模型在训练模型时可能非常耗费计算量,并且它们不会返回数字指标,表明它们对预测的置信度。但是,我们可以使用一些技术,如 K-fold 交叉验证来避免这种情况,代价是增加计算成本。
......@@ -24,7 +24,7 @@ SVM 已成为许多任务中最先进的机器学习模型之一,在许多
我们将 SVM 应用于图像识别,这是一个具有非常大的维度空间的经典问题(图像的每个像素的值被视为一个特征)。我们将尝试做的是,给出一个人脸的图像,预测它可能属于列表中的哪些人(例如,在社交网络应用中使用这种方法来自动标记照片中的人物)。我们的学习集将是一组人脸的带标记图像,我们将尝试学习一种模型,可以预测没见过的实例的标签。第一种直观的方法是将图像像素用作学习算法的特征,因此像素值将是我们的学习属性,而个体的标签将是我们的目标类。
我们的数据集在 scikit-learn 中提供,所以让我们从 开始导入并打印其描述。
我们的数据集在 scikit-learn 中提供,所以让我们从导入开始并打印其描述。
```py
>>> import sklearn as sk
......@@ -351,7 +351,7 @@ Confusion Matrix:
如果您查看`sklearn.feature_extraction.text`模块,您会发现三个不同的类可以将文本转换为数字特征:`CountVectorizer``HashingVectorizer``TfidfVectorizer`。它们之间的区别在于它们为获得数字特征而执行的计算。 `CountVectorizer`基本上从文本语料库中创建单词词典。然后,将每个实例转换为数字特征的向量,其中每个元素将是特定单词在文档中出现的次数的计数。
`HashingVectorizer`,则是在内存中限制并维护字典,实现了 将标记映射到特征索引的散列函数,然后计算`CountVectorizer`中的计数。
`HashingVectorizer`在内存中限制并维护字典,实现了将标记映射到特征索引的散列函数,然后计算`CountVectorizer`中的计数。
`TfidfVectorizer`的工作方式与`CountVectorizer`类似,但更高级的计算称为**单词频率逆文档频率****TF-IDF**)。这是用于测量在文档或语料库中单词的重要性的统计量。直观地说,它在当前文档中查找中更频繁的单词,与它们在整个文档集中的频率的比值。您可以将此视为一种方法,标准化结果并避免单词过于频繁而无法用于表征实例。
......@@ -417,7 +417,7 @@ Mean score: 0.862 (+/-0.004)
正如您所见,`CountVectorizer``TfidfVectorizer`具有相似的表现,并且比`HashingVectorizer`好得多。
让我们继续`TfidfVectorizer`;我们可以尝试通过尝试将文本文档 解析为具有不同正则表达式的标记来改进结果。
让我们继续`TfidfVectorizer`;我们可以通过尝试使用不同正则表达式将文本文档解析为标记来改进结果。
```py
>>> clf_4 = Pipeline([
......@@ -555,7 +555,7 @@ Accuracy on testing set:
它首先询问电子邮件是否包含单词`Viagra`;如果答案是肯定的,它会将其归类为垃圾邮件;如果答案是否定的,它会进一步询问,它是否来自您的联系人列表中的某个人;这次,如果答案是肯定的,它会将电子邮件归类为正常;如果答案是否定的,则将其归类为垃圾邮件。该模型的主要优点是,人类可以轻松地理解和再现决策序列(特别是如果属性的数量很小),来预测新实例的目标类。这对于医疗诊断或信用审批等任务非常重要,我们希望在这些任务中显示决策的原因,而不是仅仅说,这是训练数据所表明的内容(根据定义,这是每种监督学习方法的作用) 。在本节中,我们将通过一个工作示例向您展示决策树的外观,它们是如何构建的,以及它们如何用于预测。
我们想要解决的问题是,确定泰坦尼克号的乘客是否会幸存下来,考虑到年龄,乘客等级和性别。我们将使用 [Titanic 数据集]](http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt) 。与本章中的其他所有示例一样,我们从数据集开始,包含泰坦尼克号乘客列表,以及表明他们是否幸存的特征。数据集中的每个实例都具有以下形式:
我们想要解决的问题是,确定泰坦尼克号的乘客是否会幸存下来,考虑到年龄,乘客等级和性别。我们将使用 [Titanic 数据集]](http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt) 。与本章中的其他所有示例一样,我们从数据集开始,包含泰坦尼克号乘客列表,以及表明他们是否幸存的特征。数据集中的每个实例都具有以下形式:
```py
"1","1st",1,"Allen, Miss Elisabeth Walton",29.0000,"Southampton","St Louis, MO","B-5","24160 L221","2","female"
......@@ -735,7 +735,7 @@ Integer classes: [[0] [1] [2]]
>>> clf = clf.fit(X_train,y_train)
```
`DecisionTreeClassifier`接受控制其行为的几个超参数(像大多数学习方法一样)。在情况下,我们使用**信息增益****IG**)标准来分割学习数据,告诉方法最多构建三层的树,并且如果节点包括至少五个训练实例,则接受该节点作为叶子。为了解释这一点并展示决策树如何工作,让我们可视化建立的模型。以下代码假定您使用的是 IPython,并且您的 Python 发行版包含`pydot`模块。此外,它允许从树生成 **Graphviz** 代码,并假设安装了 Graphviz 本身。有关 Graphviz 的更多信息,请参阅[这里](http://www.graphviz.org/)
`DecisionTreeClassifier`接受控制其行为的几个超参数(像大多数学习方法一样)。在这种情况下,我们使用**信息增益****IG**)标准来分割学习数据,告诉方法最多构建三层的树,并且如果节点包括至少五个训练实例,则接受该节点作为叶子。为了解释这一点并展示决策树如何工作,让我们可视化建立的模型。以下代码假定您使用的是 IPython,并且您的 Python 发行版包含`pydot`模块。此外,它允许从树生成 **Graphviz** 代码,并假设安装了 Graphviz 本身。有关 Graphviz 的更多信息,请参阅[这里](http://www.graphviz.org/)
```py
>>> import pydot,StringIO
......@@ -763,7 +763,7 @@ Integer classes: [[0] [1] [2]]
在预测时,我们选取一个实例并开始遍历树,根据实例特征回答问题,直到我们到达一个叶子。此时,我们将查看训练集中每个类的实例数,并选择大多数实例所属的类。
例如,考虑确定一个 10 岁女孩是否能够幸存下来的问题。第一个问题的答案(她是女性吗?)是肯定的,所以我们走树的左分支。在接下来的两个问题中答案是否(她来自三等舱?)和是(她来自头等舱?),所以我们分别走左右分支。这时,我们已经到了一片叶子。在训练集中,我们有 102 人具有这些属性,其中 97 人是幸存者。所以,我们的答案是幸存。
例如,考虑确定一个 10 岁女孩是否能够幸存下来的问题。第一个问题的答案(她是女性吗?)是肯定的,所以我们走树的左分支。在接下来的两个问题中答案是否(她来自三等舱?)和是(她来自头等舱?),所以我们分别走左右分支。这时,我们已经到了一片叶子。在训练集中,我们有 102 人具有这些属性,其中 97 人是幸存者。所以,我们的答案是幸存。
一般来说,我们找到了合理的结果:死亡人数较多的群体(496 人中有 449 人)对应二等或三等舱的成年男子,因为您可以在树上查看。大多数来自头等舱的女孩幸存下来。让我们在训练集中测量方法的准确率(我们将首先定义辅助函数来测量分类器的表现):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册