Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
apachecn-ds-zh
提交
f7ded8ff
A
apachecn-ds-zh
项目概览
OpenDocCN
/
apachecn-ds-zh
10 个月 前同步成功
通知
1
Star
287
Fork
69
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-ds-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f7ded8ff
编写于
8月 02, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-08-02 15:49:50
上级
81056c6c
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
16 addition
and
16 deletion
+16
-16
docs/learning-sklearn/ch01.md
docs/learning-sklearn/ch01.md
+8
-8
docs/learning-sklearn/ch02.md
docs/learning-sklearn/ch02.md
+8
-8
未找到文件。
docs/learning-sklearn/ch01.md
浏览文件 @
f7ded8ff
...
...
@@ -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`
(花瓣长度和宽度)以及这四个特征乘积的组合。
直观地说,我们需要更多的训练数据来充分估计这些参数。如果我们添加更多特征或更高阶项,参数的数量(以及因此,充分估计它们所需的训练数据量)将迅速增加。这种现象存在于每种机器学习方法中,被称为维度的概念:当模型的参数数量增加时,学习它们所需的数据呈指数增长。
...
...
docs/learning-sklearn/ch02.md
浏览文件 @
f7ded8ff
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录