提交 6ee34fb9 编写于 作者: W wizardforcel

2021-03-12 22:58:49

上级 8665f330
......@@ -112,7 +112,7 @@ In: %timeit regr.fit(X_train, y_train) Out: 544 µs ± 37.4 µs per loop
![](img/11faed20-2131-458d-97c3-846e307fe09f.png)
`W`可以借助矩阵求逆(或更可能是伪求逆,这是一种计算有效的方法)和点积的帮助容易地找到。 这就是线性回归如此之快的原因。 请注意,这只是一个简单的解释-实际方法添加了另一个虚拟功能来补偿过程的偏差。 但是,这并没有很大程度地改变回归算法的复杂性。
`W`可以借助矩阵求逆(或更可能是伪求逆,这是一种计算有效的方法)和点积的帮助容易地找到。 这就是线性回归如此之快的原因。 请注意,这只是一个简单的解释-实际方法添加了另一个虚拟特征来补偿过程的偏差。 但是,这并没有很大程度地改变回归算法的复杂性。
我们现在进行逻辑回归。 尽管顾名思义,它是一个分类器,而不是回归器。 它只能用于仅处理两个类的分类问题(二分类)。 通常,目标标签是布尔值; 也就是说,它们的值为`True/False`或 0/1(指示是否存在预期结果)。 在我们的示例中,我们继续使用相同的数据集。 目标是猜测房屋价值是高于还是低于我们感兴趣的阈值的平均值。本质上,我们从回归问题转向二元分类问题,因为现在我们的目标是猜测一个示例成为一个小组的一部分的可能性有多大。 我们开始使用以下命令来准备数据集:
......@@ -172,13 +172,13 @@ y_pred[i] = sign(X[i] * W)
在上面的公式中,您具有:`logistic(α) = exp(α) / (1 + exp(α))`
为什么`logistic`函数而不是其他功能? 好吧,因为它在大多数实际情况下都很好用。 在其余情况下,如果您对其结果不完全满意,则可能需要尝试其他一些非线性函数(不过,合适的函数种类有限)。
为什么`logistic`函数而不是其他函数? 好吧,因为它在大多数实际情况下都很好用。 在其余情况下,如果您对其结果不完全满意,则可能需要尝试其他一些非线性函数(不过,合适的函数种类有限)。
# 朴素贝叶斯
**朴素贝叶斯**是用于概率二进制和多类分类的非常常见的分类器。 给定特征向量,它利用贝叶斯规则来预测每个类别的概率。 它通常用于文本分类,因为它对大量数据(即具有许多功能的数据集)非常有效,并且具有一致的先验概率,可有效处理维数问题的诅咒。
**朴素贝叶斯**是用于概率二进制和多类分类的非常常见的分类器。 给定特征向量,它利用贝叶斯规则来预测每个类别的概率。 它通常用于文本分类,因为它对大量数据(即具有许多特征的数据集)非常有效,并且具有一致的先验概率,可有效处理维数问题的诅咒。
朴素贝叶斯分类器分为三种: 他们每个人都对这些功能有很强的假设(假设)。 如果要处理真实/连续数据,则高斯朴素贝叶斯分类器会假定特征是从高斯过程生成的(也就是说,它们是正态分布的)。 或者,如果要处理事件模型,其中可以使用多项式分布来建模事件(在这种情况下,特征是计数器或频率),则需要使用“多项朴素贝叶斯”分类器。 最后,如果您所有的功能都是独立且布尔的,并且可以安全地假设它们是伯努利过程的结果,则可以使用伯努利朴素贝叶斯分类器。
朴素贝叶斯分类器分为三种: 他们每个人都对这些特征有很强的假设(假设)。 如果要处理真实/连续数据,则高斯朴素贝叶斯分类器会假定特征是从高斯过程生成的(也就是说,它们是正态分布的)。 或者,如果要处理事件模型,其中可以使用多项式分布来建模事件(在这种情况下,特征是计数器或频率),则需要使用“多项朴素贝叶斯”分类器。 最后,如果您所有的特征都是独立且布尔的,并且可以安全地假设它们是伯努利过程的结果,则可以使用伯努利朴素贝叶斯分类器。
现在让我们尝试高斯朴素贝叶斯分类器的应用示例。 此外,本章结尾给出了文本分类的示例。 您可以通过简单地将示例的 SGDClassifier 替换为 MultinomialNB 来与朴素贝叶斯一起测试它。
......@@ -233,7 +233,7 @@ Out: 685 µs ± 9.86 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
![](img/0dae1c59-ccf3-43d0-8dca-beb2572b834e.png)
朴素的假设是,当与每个类别相关时,每个功能都被认为有条件地独立于其他功能。 因此,概率可以简单地相乘。 公式如下:
朴素的假设是,当与每个类别相关时,每个特征都被认为有条件地独立于其他特征。 因此,概率可以简单地相乘。 公式如下:
![](img/2bf137b0-1347-423d-9fa2-8c22a27fa3ef.png)
......@@ -343,7 +343,7 @@ In: from sklearn.datasets import load_svmlight_file
X_train, y_train = X_train[:first_rows,:], y_train[:first_rows]
```
为了举例说明,我们将观测值的数量从 25,000 限制为 2,500。 可用功能的数量为 22。此外,由于它已经与 SVM 要求兼容,并且已经在 0 到 1 之间范围内重新缩放了功能,因此我们不会对其进行预处理。
为了举例说明,我们将观测值的数量从 25,000 限制为 2,500。 可用特征的数量为 22。此外,由于它已经与 SVM 要求兼容,并且已经在 0 到 1 之间范围内重新缩放了特征,因此我们不会对其进行预处理。
```py
In: import numpy as np
......@@ -357,7 +357,7 @@ In: import numpy as np
mean = 0.910 std = 0.001
```
在我们的示例中,我们测试了带有 RBF 核的 SVC。 所有其他参数均保持默认值。 您可以尝试将`first_rows`修改为更大的值(最大 25,000),并验证算法扩展到观察数量增加的程度。 跟踪计算时间,您会注意到缩放比例不是线性的。 也就是说,计算时间将与数据大小成比例增加。 关于 SVM 可伸缩性,有趣的是,看到这种算法在遇到多类问题和大量情况时的行为。 我们将使用的 Covertype 数据集以美国 30x30 米的大片森林为例。 收集与它们有关的数据以预测每个斑块(覆盖类型)的优势树种。 这是一个多类分类问题(可以预测为七个`covertypes`)。 每个样本都具有 54 个功能,并且有超过 580,000 个示例(但出于性能原因,我们将仅处理 25,000 个此类示例)。 而且,类是不平衡的,大多数示例都有两种树。
在我们的示例中,我们测试了带有 RBF 核的 SVC。 所有其他参数均保持默认值。 您可以尝试将`first_rows`修改为更大的值(最大 25,000),并验证算法扩展到观察数量增加的程度。 跟踪计算时间,您会注意到缩放比例不是线性的。 也就是说,计算时间将与数据大小成比例增加。 关于 SVM 可伸缩性,有趣的是,看到这种算法在遇到多类问题和大量情况时的行为。 我们将使用的 Covertype 数据集以美国 30x30 米的大片森林为例。 收集与它们有关的数据以预测每个斑块(覆盖类型)的优势树种。 这是一个多类分类问题(可以预测为七个`covertypes`)。 每个样本都具有 54 个特征,并且有超过 580,000 个示例(但出于性能原因,我们将仅处理 25,000 个此类示例)。 而且,类是不平衡的,大多数示例都有两种树。
这是可用于加载先前准备的数据集的脚本:
......@@ -368,7 +368,7 @@ In: import pickle
covertype_y = covertype_dataset.target[:25000] -1
```
使用此脚本,您可以了解要预测的示例,功能和目标:
使用此脚本,您可以了解要预测的示例,特征和目标:
```py
In: import numpy as np
......@@ -545,7 +545,7 @@ Leo Breiman 和 Adele Cutler 最初是在“随机森林”算法的核心中设
随机森林的工作方式与 Leo Breiman 所设计的装袋相似,但它只能使用二叉拆分决策树进行操作,而二叉决策树会不断发展壮大。 此外,它使用自举对每个模型中要使用的案例进行采样。 并且,随着树的生长,在分支的每个分割处,也将随机绘制要用于分割处的变量集。 最后,这是该算法的核心秘密,因为它使由于不同样本和拆分时所考虑的变量而彼此不同的树融合在一起。 与众不同,它们也不相关。 这是有益的,因为当结果汇总时,可以排除很多差异,因为平均而言,分布两侧的极值趋于彼此平衡。 换句话说,装袋算法保证了预测中的一定程度的多样性,从而允许制定可能永远不会遇到单个学习器(例如决策树)的规则。
在 Scikit-learn 中以`ExtraTreesClassifier`/`ExtraTreesRegressor`类表示的极端树是一种随机性更高的随机森林,其估计值的方差较小,但代价是估计量的偏差更大。 无论如何,在 CPU 效率方面,与随机森林相比,极端树可以提供相当大的提速,因此从示例和功能上来说,当您使用大型数据集时,极端树是理想的选择。 产生更高偏差但速度更快的原因是在极端树中构建拆分的方式。 随机森林会从要考虑拆分树的分支的采样特征中仔细搜索最佳值,以分配给每个分支,而在极端树中,这是随机决定的。 因此,尽管随机选择的分割可能不是最有效的分割(因此存在偏差),但无需进行大量计算。
在 Scikit-learn 中以`ExtraTreesClassifier`/`ExtraTreesRegressor`类表示的极端树是一种随机性更高的随机森林,其估计值的方差较小,但代价是估计量的偏差更大。 无论如何,在 CPU 效率方面,与随机森林相比,极端树可以提供相当大的提速,因此从示例和特征上来说,当您使用大型数据集时,极端树是理想的选择。 产生更高偏差但速度更快的原因是在极端树中构建拆分的方式。 随机森林会从要考虑拆分树的分支的采样特征中仔细搜索最佳值,以分配给每个分支,而在极端树中,这是随机决定的。 因此,尽管随机选择的分割可能不是最有效的分割(因此存在偏差),但无需进行大量计算。
让我们看看这两种算法在预测的准确率和执行时间方面如何与 Covertype 森林问题进行比较。 为此,我们将在 Jupyter 笔记本电脑的单元格中使用神奇的`%%time`单元格,以测量计算表现:
......@@ -903,7 +903,7 @@ In: y_probs = bst.predict(covertype_test_X,
2. 根据损失函数将级别转换为整数,以使其最小化。
3. 根据对目标的随机排序,根据对级别标签进行计数,将级别号转换为浮点数值(更多详细信息请参见[这个页面](https://tech.yandex.com/catboost/doc/dg/concepts/algorithm-main-stages_cat-to-numberic-docpage/)(带有简单示例)。
CatBoost 用来编码分类变量的想法并不是什么新鲜事物,但它已经成为一种特征工程,已经被广泛使用,主要是在 Kaggle 的数据科学竞赛中使用。 均值编码(也称为似然编码,影响编码或目标编码)只是将标签与目标变量的关联关系转换为数字的一种方法。 如果您进行回归分析,则可以根据该级别的平均目标值来转换标签; 如果是分类,则只是给定该标签的目标分类的概率(目标概率,取决于每个类别值)。 它可能看起来像是一个简单而明智的功能工程技巧,但实际上,它具有副作用,主要是在过拟合方面,因为您正在将来自目标的信息纳入预测变量。
CatBoost 用来编码分类变量的想法并不是什么新鲜事物,但它已经成为一种特征工程,已经被广泛使用,主要是在 Kaggle 的数据科学竞赛中使用。 均值编码(也称为似然编码,影响编码或目标编码)只是将标签与目标变量的关联关系转换为数字的一种方法。 如果您进行回归分析,则可以根据该级别的平均目标值来转换标签; 如果是分类,则只是给定该标签的目标分类的概率(目标概率,取决于每个类别值)。 它可能看起来像是一个简单而明智的特征工程技巧,但实际上,它具有副作用,主要是在过拟合方面,因为您正在将来自目标的信息纳入预测变量。
有几种经验方法可以限制过拟合并利用将分类变量作为数字变量进行处理。 最好了解更多信息,实际上是 Coursera 的视频,[因为没有关于它的正式论文](https://www.coursera.org/lecture/competitive-data-science/concept-of-mean-encoding-b5Gxv)。 我们的建议是谨慎使用此技巧。
......@@ -919,7 +919,7 @@ CatBoost 除了具有 R 和 Python API 并在 GBM 领域中以与 XGBoost 和 Li
* `l2_leaf_reg`:正则化系数
* `random_strength``bagging_temperature`控制随机装袋
我们首先导入所有必需的包和功能
我们首先导入所有必需的包和函数
1. 由于 CatBoost 在处理分类变量时表现出色,因此我们必须重建 Forest Covertype 数据集,因为其所有分类变量都已经被热编码。 因此,我们只需重建它们并重新创建数据集即可:
......@@ -1599,7 +1599,7 @@ In: dbs_2 = DBSCAN(eps=0.5)
![](img/7d82af20-0c13-43fa-82b8-eccb2b2d8f00.png)
在本节的最后,最后一个重要说明是,在 K 均值和 DBSCAN 的基本介绍中,我们一直使用欧几里得距离,因为它是这些函数中的默认距离度量(尽管如果您认为合适的话,其他距离度量也可以使用)。 在实际情况下使用此距离时,请记住您必须对每个特征进行归一化(z 归一化),以便每个特征对最终失真的贡献均相等。 如果未对数据集进行规范化,则具有更大支持的功能将对输出标签具有更大的决策权,而这正是我们所不希望的。
在本节的最后,最后一个重要说明是,在 K 均值和 DBSCAN 的基本介绍中,我们一直使用欧几里得距离,因为它是这些函数中的默认距离度量(尽管如果您认为合适的话,其他距离度量也可以使用)。 在实际情况下使用此距离时,请记住您必须对每个特征进行归一化(z 归一化),以便每个特征对最终失真的贡献均相等。 如果未对数据集进行规范化,则具有更大支持的特征将对输出标签具有更大的决策权,而这正是我们所不希望的。
# 潜在狄利克雷分布(LDA)
......@@ -1639,7 +1639,7 @@ In: processed_docs = [tokenize(doc) for doc in documents]
print("Num tokens:", len(word_dic)) **Out:** **Num tokens: 16161**
```
在数据集中,有超过 16,000 个不同的词。 现在是时候过滤太常见的单词和太稀有的单词了。 在这一步中,我们将使单词出现至少 10 次,且不超过文档的 20%。 至此,我们有了每个文档的“单词袋”(或 BoW)表示形式; 也就是说,每个文档都表示为字典,其中包含每个单词在文本中出现的次数。 文本中每个单词的绝对位置都会丢失,就像将文档中的所有单词都放在袋子中一样。 结果,并非基于此方法在功能中捕获文本中的所有信号,但在大多数情况下,足以建立有效的模型:
在数据集中,有超过 16,000 个不同的词。 现在是时候过滤太常见的单词和太稀有的单词了。 在这一步中,我们将使单词出现至少 10 次,且不超过文档的 20%。 至此,我们有了每个文档的“单词袋”(或 BoW)表示形式; 也就是说,每个文档都表示为字典,其中包含每个单词在文本中出现的次数。 文本中每个单词的绝对位置都会丢失,就像将文档中的所有单词都放在袋子中一样。 结果,并非基于此方法在特征中捕获文本中的所有信号,但在大多数情况下,足以建立有效的模型:
```py
In: word_dic.filter_extremes(no_below=10, no_above=0.2)
......
......@@ -649,7 +649,7 @@ In: with sns.axes_style('ticks'):
![](img/66b3aad2-56aa-46a9-8851-06f0d79f05e4.png)
在我们的示例中,在波士顿数据集中,对离散值的径向公路的可及性指标与目标进行了比较,以检查其关系的功能形式以及每个级别的相关方差。
在我们的示例中,在波士顿数据集中,对离散值的径向公路的可及性指标与目标进行了比较,以检查其关系的函数形式以及每个级别的相关方差。
而是在数字变量之间进行比较; Seaborn 提供了增强的散点图,并结合了回归拟合曲线趋势,当关系不是线性的时,可以提示您进行可能的数据转换:
......@@ -885,7 +885,7 @@ In: from sklearn.datasets import load_boston
```
该代码将产生以下图表,突出显示该模型的重要功能
该代码将产生以下图表,突出显示该模型的重要特征
![](img/f04b4cbf-f992-42af-abd8-435893538ac4.png)
......@@ -897,7 +897,7 @@ In: from sklearn.datasets import load_boston
# 梯度提升树的部分依赖图
功能重要性的估计是一条信息,可以帮助您根据最佳选择来确定要使用的功能。 有时,您可能需要更好地理解为什么变量对预测特定结果很重要。 通过控制分析中涉及的所有其他变量的效果,梯度提升树为您提供了变量与预测结果之间关系的清晰观点。 与使用非常有效的 EDA 可能获得的信息相比,此类信息可以为您提供更多因果关系动态的见解:
特征重要性的估计是一条信息,可以帮助您根据最佳选择来确定要使用的特征。 有时,您可能需要更好地理解为什么变量对预测特定结果很重要。 通过控制分析中涉及的所有其他变量的效果,梯度提升树为您提供了变量与预测结果之间关系的清晰观点。 与使用非常有效的 EDA 可能获得的信息相比,此类信息可以为您提供更多因果关系动态的见解:
```py
In: from sklearn.ensemble.partial_dependence import
......@@ -910,7 +910,7 @@ In: from sklearn.ensemble.partial_dependence import
feature_names=feature_names)
```
作为输出,您将获得三个图,它们构成了 RM 和 LSTAT 功能的局部图:
作为输出,您将获得三个图,它们构成了 RM 和 LSTAT 特征的局部图:
![](img/cfbd2644-1631-4fba-9b9e-07d937e6984d.png)
......@@ -937,15 +937,15 @@ Bottle 是一个 Python 网络框架,是 HTTP 上微型应用的起点。 这
在执行代码之前,让我们逐行分析代码:
1. 我们开始从 Bottle 模块中导入所需的功能和类。
1. 我们开始从 Bottle 模块中导入所需的函数和类。
2. 然后,我们指定 HTTP 服务器将监听的端口。
3. 在示例中,我们选择端口`9099`; 您可以随意将其更改为另一个,但是首先请检查是否有其他服务正在使用它(请记住 HTTP 位于 TCP 之上)。
4. 下一步是 API 端点的定义。 当对指定为参数的路径执行 HTTP 调用时,`route`装饰器将应用其后定义的功能。 请注意,在路径中,它表示`name`,这是即将到来的函数的参数。 这意味着`name`是调用的参数; 您可以在 HTTP 调用中选择所需的任何字符串,然后您的选择将作为参数名称传递给函数。
5. 然后,在功能主页中,返回了带有 HTML 代码的模板。 以一种更简单的方式,将其视为`template`函数,该函数将创建您将从浏览器中看到的页面。
4. 下一步是 API 端点的定义。 当对指定为参数的路径执行 HTTP 调用时,`route`装饰器将应用其后定义的函数。 请注意,在路径中,它表示`name`,这是即将到来的函数的参数。 这意味着`name`是调用的参数; 您可以在 HTTP 调用中选择所需的任何字符串,然后您的选择将作为参数名称传递给函数。
5. 然后,在函数主页中,返回了带有 HTML 代码的模板。 以一种更简单的方式,将其视为`template`函数,该函数将创建您将从浏览器中看到的页面。
**模板**,是一个示例,它只是一个普通的 HTML 页面,但它可能更复杂(它实际上可以是一个模板页面,其中需要填充一些空白)。 模板的完整描述超出了本节的范围,因为我们仅将框架用于简单的纯输出。 如果您需要其他信息,请浏览 Bottle 帮助页面。
6. 最后,在`print`函数之后,有核心`run`函数。 这是一个阻止功能,它将在作为参数提供的主机和端口上设置 Web 服务器。 当您运行清单中的代码时,一旦执行了该功能,就可以打开浏览器并将其指向`http://localhost:9099/personal/Carl`,您将找到以下文本:`Hi Carl!`
6. 最后,在`print`函数之后,有核心`run`函数。 这是一个阻止函数,它将在作为参数提供的主机和端口上设置 Web 服务器。 当您运行清单中的代码时,一旦执行了该函数,就可以打开浏览器并将其指向`http://localhost:9099/personal/Carl`,您将找到以下文本:`Hi Carl!`
当然,将 HTTP 调用中的名称从`Carl`更改为`Tom`或任何其他名称将导致不同的页面,其中包含调用中指定的名称。
......@@ -963,7 +963,7 @@ Bottle 是一个 Python 网络框架,是 HTTP 上微型应用的起点。 这
print("Try going to http://localhost:{}/predict".format(port)) run(host='localhost', port=port) # Try insert the following values: # [ 5.1, 3.5, 1.4, 0.2] -> setosa # [ 7.0 3.2, 4.7, 1.4] -> versicolor # [ 6.3, 3.3, 6.0, 2.5] -> virginica
```
导入后,在这里我们使用`get`装饰器,指定仅对 HTTP GET 调用有效的路由。 装饰器以及后面的函数没有参数,因为所有功能都应插入`predict`函数中定义的 HTML 表单中。 表单提交后,将使用 HTTP `POST`传递到`/prediction`页面。
导入后,在这里我们使用`get`装饰器,指定仅对 HTTP GET 调用有效的路由。 装饰器以及后面的函数没有参数,因为所有特征都应插入`predict`函数中定义的 HTML 表单中。 表单提交后,将使用 HTTP `POST`传递到`/prediction`页面。
现在,我们需要为此调用创建一个路由,这就是我们在`do_prediction`函数中所做的。 它的装饰器是`/prediction`页面上的`post`(即与`get`相反;它仅定义`POST`路由)。 数据被解析并转换为`double`(默认参数为字符串),然后将特征向量馈送到`classifier`全局变量中以获得预测。 这是使用简单模板返回的。 对象请求包含传递给服务的所有参数,包括我们 *POST* 到路由的整个变量。 最后,似乎我们只需要定义全局变量分类器-即在鸢尾花数据集上训练的分类器-最后,我们可以调用`run`函数。
......@@ -985,7 +985,7 @@ Bottle 是一个 Python 网络框架,是 HTTP 上微型应用的起点。 这
sl=A&sw=B&pl=C&pw=D".format(port)) run(host='localhost', port=port)
```
该解决方案非常简单明了。 不过,让我们逐步分析它。 功能的入口点由`/prediction`路径上的`get`装饰器定义。 在此,我们将访问`GET`值以提取预测(请注意,如果您的分类器需要许多功能,则最好在此处使用`POST`调用)。 与前面的示例完全相同,生成了预测; 最后,将该值与`status`键的`OK`值一起插入 Python 字典中。 如果此函数引发异常,将不会进行预测,但`status`键中将出现`ERROR`字符串。 然后,将输出应用格式设置为 JSON,然后将 Python 字典序列化为 JSON 字符串。
该解决方案非常简单明了。 不过,让我们逐步分析它。 函数的入口点由`/prediction`路径上的`get`装饰器定义。 在此,我们将访问`GET`值以提取预测(请注意,如果您的分类器需要许多特征,则最好在此处使用`POST`调用)。 与前面的示例完全相同,生成了预测; 最后,将该值与`status`键的`OK`值一起插入 Python 字典中。 如果此函数引发异常,将不会进行预测,但`status`键中将出现`ERROR`字符串。 然后,将输出应用格式设置为 JSON,然后将 Python 字典序列化为 JSON 字符串。
当它运行时,我们可以访问 URL `localhost:9099/prediction`,后跟特征值,然后我们将预测作为 JSON 取回。 请注意,由于它是 JSON,因此不需要浏览器来解释返回的 HTTP 响应。 因此,我们可以从不同的应用(`wget`,浏览器或`curl`)或任何编程语言(包括 Python 本身)调用终结点。 要使其正常运行,请启动它并将您的浏览器指向(或以任何方式请求 URL)`http://localhost:9099/prediction?sl=5.1&sw=3.5&pl=1.4&pw=0.2`。 您将取回有效的 JSON:`{"predicted_label": "setosa", "status": "OK"}`。 另外,如果参数解析出错,您将得到以下 JSON:`{"status": "ERROR"}`。 这是您的第一个 ML-AAS!
......
......@@ -130,7 +130,7 @@ In: nx.to_numpy_matrix(G) Out: matrix([[ 0., 1., 0., 1.],
![](img/ea88aeb5-d78f-4d2e-bf84-7de068c2287a.png)
当然,如果要加载 NetworkX 图,则可以使用相反的功能(将函数名称中的`from`更改为`to`),并且可以加载 NetworkX 列表,边列表以及 NumPy,SciPy 和`pandas`结构的字典中的图。
当然,如果要加载 NetworkX 图,则可以使用相反的函数(将函数名称中的`from`更改为`to`),并且可以加载 NetworkX 列表,边列表以及 NumPy,SciPy 和`pandas`结构的字典中的图。
图中每个节点的重要度量是其度。 在无向图中,节点的度数表示该节点具有的链接数。 对于有向图,度有两种类型:入度和出度。 这些分别计算节点的入站和出站链接。
......@@ -191,7 +191,7 @@ In: print(nx.has_path(G, source=1, target=9))
[1, 6, 7, 8, 9] 4
```
功能仅给出从一个节点到另一节点的最短路径。 如果我们要查看从节点 1 到达节点 9 的所有路径,该怎么办? Jin Yen 提出的算法提供了此答案,并在 NetworkX 的`shortest_simple_paths`函数中实现。 此函数返回图中节点源和目标之间从最短到最长的所有路径的生成器:
函数仅给出从一个节点到另一节点的最短路径。 如果我们要查看从节点 1 到达节点 9 的所有路径,该怎么办? Jin Yen 提出的算法提供了此答案,并在 NetworkX 的`shortest_simple_paths`函数中实现。 此函数返回图中节点源和目标之间从最短到最长的所有路径的生成器:
```py
In: print (list(nx.shortest_simple_paths(G, source=1, target=9))) Out: [[1, 6, 7, 8, 9], [1, 0, 5, 7, 8, 9], [1, 6, 5, 7, 8, 9],
......
......@@ -297,7 +297,7 @@ Out:
* **丢弃层**:这等效于正则化,并且可以防止过拟合。 基本上,在训练的每个步骤中,都会停用一部分单元,因此该层的输出不会过分依赖其中的一些单元。
* **批量规范化层**:通过减去批次平均值并将其除以标准差,此 z 标准化层。 这对于更新数据很有用,并且在每个步骤都会放大/衰减信号。
* **最大池化**:这是一个非线性变换,用于通过对内核下的每个区域应用最大过滤器来对输入进行下采样。 用于选择最大功能,该功能在同一类中的位置可能略有不同。
* **最大池化**:这是一个非线性变换,用于通过对内核下的每个区域应用最大过滤器来对输入进行下采样。 用于选择最大特征,该特征在同一类中的位置可能略有不同。
除此之外,总是有改变深层网络和训练属性的空间。 也就是说,优化程序(及其参数),批量大小和周期数。 在下一个单元格中,这里是具有以下几层的改进的深层网络:
......@@ -418,7 +418,7 @@ Out:
现在,用一个新的笔记本,导入我们将要使用的模块。 在此示例中,我们将使用 InceptionV3 预训练网络,该网络能够很好地识别图像中的对象。 它是由 Google 开发的,其输出可与人眼媲美。
1. 首先,我们导入建立网络,预处理输入并提取预测所需的功能
1. 首先,我们导入建立网络,预处理输入并提取预测所需的特征
```py
In: from keras.applications.inception_v3 import InceptionV3
......@@ -453,7 +453,7 @@ In: def predict_top_3(model, img_path):
print('Predicted:', decode_predictions(preds, top=3)[0])
```
基本上,此功能会加载图像并将其调整为`299x299`像素(这是预训练网络 InceptionV3 的默认输入大小),并将图像转换为模型的正确格式。 之后,它会预测图像的所有标签并选择(并打印)前三个。
基本上,此函数会加载图像并将其调整为`299x299`像素(这是预训练网络 InceptionV3 的默认输入大小),并将图像转换为模型的正确格式。 之后,它会预测图像的所有标签并选择(并打印)前三个。
让我们通过使用预训练的模型并根据概率来询问前三个预测,看看它如何与示例图像配合使用:
......
......@@ -269,7 +269,7 @@ In: numbers_rdd.saveAsTextFile("file:////home//jovyan//numbers_1_10.txt")
RDD 仅支持两种类型的操作:
* 转换,将数据集转换为另一数据集。 转换的输入和输出都是 RDD。 因此,可以将多个转换链接在一起,从而达到一种编程的功能风格。 而且,转换是懒惰的。 也就是说,他们不会立即计算出结果。
* 转换,将数据集转换为另一数据集。 转换的输入和输出都是 RDD。 因此,可以将多个转换链接在一起,从而达到一种编程的函数式风格。 而且,转换是懒惰的。 也就是说,他们不会立即计算出结果。
* 动作从 RDD 返回值,例如元素的总和和计数,或者仅收集所有元素。 动作是执行(惰性)转换链的触发器,因为需要输出。
典型的 Spark 程序是一系列转换,最后是一个动作。 默认情况下,RDD 上的所有转换都是在您每次执行操作时执行的(即,不保存每个转换器之后的中间状态)。 但是,只要您想`cache`转换后的元素的值,就可以使用`persist`方法(在 RDD 上)覆盖此行为。 `persist`方法允许内存和磁盘持久性。
......@@ -556,7 +556,7 @@ In: from pyspark import AccumulatorParam
errAccum = sc.accumulator([], ErrorAccumulator())
```
现在,让我们定义映射功能:每个节点都应在广播`iris`数据集上训练,测试和评估分类器。 作为参数,该函数将接收分类器对象,并应返回一个元组,该元组包含分类器名称及其准确率分数(包含在列表中)。
现在,让我们定义映射函数:每个节点都应在广播`iris`数据集上训练,测试和评估分类器。 作为参数,该函数将接收分类器对象,并应返回一个元组,该元组包含分类器名称及其准确率分数(包含在列表中)。
如果这样做引发异常,则将分类器名称和以字符串引用的异常添加到累加器中,并返回一个空列表:
......@@ -1091,7 +1091,7 @@ Out: [StringIndexer_44f6bd05e502a8ace0aa,
PipelineModel_4f61afaf96ccc4be4b02
```
`DataFrame`中提取某些列就像在 SQL 查询中使用`SELECT`一样容易。 现在,让我们为所有数字功能建立一个名称列表。 从标题中找到的名称开始,我们删除分类名称,并将其替换为
`DataFrame`中提取某些列就像在 SQL 查询中使用`SELECT`一样容易。 现在,让我们为所有数字特征建立一个名称列表。 从标题中找到的名称开始,我们删除分类名称,并将其替换为
数字衍生的名称。 最后,由于只需要特征,因此删除了目标变量及其从数值上导出的等效项:
```py
......
......@@ -200,7 +200,7 @@ def sigmoid(x):
return 1.0
```
最后,您可以使用`lambda`函数来创建匿名函数。 将匿名函数视为简单函数,您可以在代码中的任何位置内联定义,而无需使用`verbose`构造器(以`def`开头的函数)。 只需调用`lambda`,然后输入其输入参数即可; 然后,冒号将发信号通知要由`lambda`函数执行的命令的开始,这些命令必须在同一行上。 (没有`return`命令!这些命令将从`lambda`函数返回。)您可以将`lambda`函数用作另一个函数的参数,如先前在`defaultdict`中看到的那样,也可以使用它在一行中表达一个功能。 在我们的示例中就是这种情况,我们通过返回`lambda`函数并结合第一个参数来定义函数:
最后,您可以使用`lambda`函数来创建匿名函数。 将匿名函数视为简单函数,您可以在代码中的任何位置内联定义,而无需使用`verbose`构造器(以`def`开头的函数)。 只需调用`lambda`,然后输入其输入参数即可; 然后,冒号将发信号通知要由`lambda`函数执行的命令的开始,这些命令必须在同一行上。 (没有`return`命令!这些命令将从`lambda`函数返回。)您可以将`lambda`函数用作另一个函数的参数,如先前在`defaultdict`中看到的那样,也可以使用它在一行中表达一个函数。 在我们的示例中就是这种情况,我们通过返回`lambda`函数并结合第一个参数来定义函数:
```py
def sum_a_const(c):
......@@ -224,7 +224,7 @@ sigmoid(0)
通过使用函数,您可以通过对重复过程进行形式化的输入和输出来使重复过程组合在一起,而不会让它们的计算以任何方式干扰主程序的执行。 实际上,除非您声明变量是全局变量,否则将丢弃您在函数中使用的所有变量,并且主程序将仅接收`return`命令返回的内容。
顺便说一句,请注意,如果您将一个列表传递给一个仅函数的列表,而该列表不会在变量中发生,那么即使不返回,也将对其进行修改,除非您将其复制。 为了复制列表,您可以使用复制或深层复制功能(要从复制包中导入),也可以仅使用应用于列表的运算符[:]
顺便说一句,请注意,如果您将一个列表传递给一个仅函数的列表,而该列表不会在变量中发生,那么即使不返回,也将对其进行修改,除非您将其复制。 为了复制列表,您可以使用复制或深层复制功能(要从复制包中导入),也可以仅使用应用于列表的运算符`[:]`
为什么会这样? 因为列表尤其是由地址而不是整个对象引用的数据结构。 因此,当您将列表传递给函数时,您只是将一个地址传递给计算机的内存,该函数将通过修改您的实际列表来对该地址进行操作:
......
......@@ -50,7 +50,7 @@
第 2 章,“借助 Jupyter 笔记本和 PixieDust”,我开始深入研究流行的数据科学工具,例如 Python 及其专用于数据科学的开源库生态系统,以及 Jupyter 笔记本。 我解释了为什么我认为 Jupyter 笔记本电脑将在未来几年成为大赢家。 我还从简单的`display()`方法开始介绍 PixieDust 开源库功能,该方法使用户可以通过构建引人注目的图表直观地浏览交互式用户界面中的数据。 使用此 API,用户可以从多个渲染引擎(例如 Matplotlib,Bokeh,Seaborn 和 Mapbox)中进行选择。 `display()`函数是 PixieDust MVP(最低可行产品)中的唯一功能,但是随着时间的流逝,当我与许多数据科学从业人员进行互动时,我为快速成为 PixieDust 工具箱添加了新功能:
* `sampleData()`:一个简单的 API,可轻松将数据加载到 Pandas 和 Apache Spark`DataFrame`
* `wrangle_data()`:用于清理和按摩数据集的简单 API。 此功能包括使用正则表达式从非结构化文本中提取内容的功能,可将列分解为新的列。 `wrangle_data()` API 也可以基于预定义的模式提出建议。
* `wrangle_data()`:用于清理和按摩数据集的简单 API。 此函数包括使用正则表达式从非结构化文本中提取内容的函数,可将列分解为新的列。 `wrangle_data()` API 也可以基于预定义的模式提出建议。
* **包管理器**:允许用户在 Python 笔记本中安装第三方 Apache Spark 包。
* **Scala 桥接**:使用户能够在 Python 笔记本中运行 Scala 代码。 在 Python 端定义的变量可以在 Scala 中访问,反之亦然。
* **Spark 作业进度监视器**:使用实时进度条跟踪您的 Spark 作业状态,该进度条直接显示在正在执行的代码的输出单元格中。
......
......@@ -44,7 +44,7 @@
首先,收集的数据量一直以指数速度增长。 根据 [IBM Marketing Cloud](https://www-01.ibm.com/common/ssi/cgi-bin/ssialias?htmlfid=WRL12345GBEN) 的最新市场研究,大约每天创建了 2.5 亿个字节(让您知道它有多大,即 25 亿个字节),但只分析了这些数据的一小部分,却遗漏了许多机会。
其次,我们正处于几年前开始的认知革命之中。 几乎每个行业都在追赶 AI 潮流,其中包括**自然语言处理****NLP**)和机器学习。 尽管这些领域已经存在了很长时间,但它们最近重新受到关注,以至于它们现已成为大学中最受欢迎的课程之一,并且在开源活动中获得了最大份额。 显然,如果要生存,公司就需要变得更加敏捷,更快地发展并转变为数字业务,并且随着可供决策的时间越来越接近实时,它们必须完全具备数据功能, 驱动。 如果您还包括 AI 算法需要高质量数据(以及很多数据)才能正常工作的事实,我们就可以开始理解数据科学家扮演的关键角色。
其次,我们正处于几年前开始的认知革命之中。 几乎每个行业都在追赶 AI 潮流,其中包括**自然语言处理****NLP**)和机器学习。 尽管这些领域已经存在了很长时间,但它们最近重新受到关注,以至于它们现已成为大学中最受欢迎的课程之一,并且在开源活动中获得了最大份额。 显然,如果要生存,公司就需要变得更加敏捷,更快地发展并转变为数字业务,并且随着可供决策的时间越来越接近实时,它们必须完全具备数据驱动功能。 如果您还包括 AI 算法需要高质量数据(以及很多数据)才能正常工作的事实,我们就可以开始理解数据科学家扮演的关键角色。
第三,随着云技术的进步以及**平台即服务****PaaS**)的开发,访问大型计算引擎和存储从未如此简单或便宜。 曾经是大公司的权限的大数据工作负载现在可用于较小的组织或拥有信用卡的任何个人; 反过来,这也促进了创新的全面发展。
......@@ -209,8 +209,8 @@ IBM Watson 在 Jeopardy 中与 Ken Jennings 和 Brad Rutter 作战!
* **问题类别**:这会将问题映射到 *Jeopardy* 中使用的预定义类型之一,例如,类事实,多项选择题,难题等。
2. **主要搜索和假设生成(信息检索)**:此步骤在很大程度上依赖于问题分析步骤的结果,以组装适用于不同可用答案源的一组查询。 答案源的示例包括各种全文本搜索引擎,例如 [Indri](https://www.lemurproject.org/indri.php)[Apache Lucene/Solr](http://lucene.apache.org/solr),面向文档和面向标题的搜索(Wikipedia),三重存储等等。 然后,搜索结果用于生成候选答案。 例如,面向标题的结果将直接用作候选,而文档搜索将需要对段落进行更详细的分析(再次使用 NLP 技术)以提取可能的候选答案。
3. **假设和证据评分(NLP 和信息检索)**:对于每个候选答案,将进行另一轮搜索,以使用不同的评分技术来查找其他支持证据。 此步骤还用作预筛选测试,其中消除了一些候选答案,例如与步骤 1 中计算得出的 LAT 不匹配的答案。此步骤的输出是一组机器学习特征,对应于找到的支持性证据。 这些功能将用作一组机器学习模型的输入,以对候选答案进行评分。
4. **最终合并和评分(机器学习)**:在此最后步骤中,系统识别出同一答案的变体并将其合并在一起。 它还使用步骤 3 中生成的功能,使用机器学习模型来选择按其各自分数排名的最佳答案。这些机器学习模型已经针对一组代表性问题进行了训练,这些问题具有针对已被收集的文档的正确答案。 预先吃了。
3. **假设和证据评分(NLP 和信息检索)**:对于每个候选答案,将进行另一轮搜索,以使用不同的评分技术来查找其他支持证据。 此步骤还用作预筛选测试,其中消除了一些候选答案,例如与步骤 1 中计算得出的 LAT 不匹配的答案。此步骤的输出是一组机器学习特征,对应于找到的支持性证据。 这些特征将用作一组机器学习模型的输入,以对候选答案进行评分。
4. **最终合并和评分(机器学习)**:在此最后步骤中,系统识别出同一答案的变体并将其合并在一起。 它还使用步骤 3 中生成的特征,使用机器学习模型来选择按其各自分数排名的最佳答案。这些机器学习模型已经针对一组代表性问题进行了训练,这些问题具有针对已被收集的文档的正确答案。 预先吃了。
当我们继续讨论数据科学和 AI 如何改变计算机科学领域时,我认为了解最新技术水平非常重要。 IBM 沃森(Watson)是这些旗舰项目之一,为我们在 *Jeopardy* 游戏中击败肯·詹宁斯(Ken Jennings)和布拉德·鲁特(Brad Rutter)奠定了基础,为我们取得更大的进步铺平了道路。
......
......@@ -376,7 +376,7 @@ url = "https://github.com/ibm-watson-data-lab/pixiedust_rosie/raw/master/sample-
pixiedust_rosie.wrangle_data(url)
```
在前面的代码中,我们在`url`变量引用的 CSV 文件上调用`wrangle_data()`。 该功能首先在本地文件系统中下载文件,然后对数据的子集执行自动数据分类,以推断数据模式。 然后启动模式编辑器 PixieApp,它提供了一组向导屏幕,可让用户配置模式。 例如,用户将能够删除和重命名列,更重要的是,通过提供 Rosie 模式,可以将现有列分解为新列。
在前面的代码中,我们在`url`变量引用的 CSV 文件上调用`wrangle_data()`。 该函数首先在本地文件系统中下载文件,然后对数据的子集执行自动数据分类,以推断数据模式。 然后启动模式编辑器 PixieApp,它提供了一组向导屏幕,可让用户配置模式。 例如,用户将能够删除和重命名列,更重要的是,通过提供 Rosie 模式,可以将现有列分解为新列。
下图说明了工作流程:
......
......@@ -75,7 +75,7 @@
当然,在`A`上应用神经元激活函数`g(x)`不能简单地产生二进制(0 或 1)值,因为如果存在多个类的得分为 1,我们将无法正确地排列最终候选答案。相反,我们使用激活函数,该函数提供介于 0 和 1 之间的非离散得分,并设置阈值(例如 0.5)来决定是否激活神经元。
Sigmoid 功能是最受欢迎的激活函数之一:
Sigmoid 函数是最受欢迎的激活函数之一:
![What is deep learning?](img/00118.jpeg)
......@@ -1110,7 +1110,7 @@ class LabelsApp():
[**注意**:您可以下载完整的笔记本,以按照此处的讨论进行操作](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%206/Tensorflow%20VR%20Part%204.ipynb)
本节中的代码相当广泛,一些与该主题不直接相关的帮助器功能将被省略。 但是,与往常一样,请参阅 GitHub 上完整的笔记本以获取有关代码的更多信息。
本节中的代码相当广泛,一些与该主题不直接相关的帮助器函数将被省略。 但是,与往常一样,请参阅 GitHub 上完整的笔记本以获取有关代码的更多信息。
在本节中,我们希望使用自定义训练数据对 MobileNet 模型进行再训练,并使用它来对在常规模型上得分较低的图像进行分类。
......
......@@ -285,7 +285,7 @@ class RawTweetsListener(StreamListener):
从前面的代码中需要注意的重要事项是:
* 来自 Twitter API 的每条推文都包含大量数据,我们选择继续使用`field_metadata`变量的字段。 我们还定义了一个全局变量`fieldnames`,该全局变量保存要从流中捕获的字段列表,而一个`transforms`变量则包含一个字典,该字典的所有字段名称均具有转换功能作为键,而转换功能本身作为值:
* 来自 Twitter API 的每条推文都包含大量数据,我们选择继续使用`field_metadata`变量的字段。 我们还定义了一个全局变量`fieldnames`,该全局变量保存要从流中捕获的字段列表,而一个`transforms`变量则包含一个字典,该字典的所有字段名称均具有转换函数作为键,而转换函数本身作为值:
```py
from pyspark.sql.types import StringType, DateType
......@@ -348,7 +348,7 @@ def start_stream(queries):
### 注意
注意`async=True`参数传递给`stream.filter`。 需要确保该功能不会被阻止,这将阻止我们在笔记本中运行任何其他代码。
注意`async=True`参数传递给`stream.filter`。 需要确保该函数不会被阻止,这将阻止我们在笔记本中运行任何其他代码。
[您可以在此处找到代码文件](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%207/sampleCode4.py)
......@@ -1528,7 +1528,7 @@ def on_data(self, data):
设置架构并预览实时流数据
现在,选择**代码**运算符,以实现调用 Watson NLU 的代码。 动画的上下文右侧窗格包含一个 Python 代码编辑器,该代码编辑器带有样板代码,其中包含要实现的必需功能,即`init(state)`和`process(event, state)`。
现在,选择**代码**运算符,以实现调用 Watson NLU 的代码。 动画的上下文右侧窗格包含一个 Python 代码编辑器,该代码编辑器带有样板代码,其中包含要实现的必需函数,即`init(state)`和`process(event, state)`。
在`init`方法中,我们实例化`NaturalLanguageUnderstandingV1`实例,如以下代码所示:
......
......@@ -19,7 +19,7 @@ NumPy 库是 Python 在数据科学家社区中获得如此高吸引力的主要
NumPy 提供的关键功能为:
* 一个非常强大的多维 NumPy 数组,称为`ndarray`,具有非常高性能的数学运算(至少与常规的 Python 列表和数组相比)
* 通用功能也简称为`ufunc`,用于在一个或多个`ndarray`上提供非常高效且易于使用的逐元素操作
* 通用函数也简称为`ufunc`,用于在一个或多个`ndarray`上提供非常高效且易于使用的逐元素操作
* 强大的`ndarray`切片和选择功能
* 广播功能,使得只要遵守某些规则,就可以对不同形状的`ndarray`进行算术运算
......@@ -85,11 +85,11 @@ numpy.ma.MaskedArray.var
Compute the variance along the specified axis.
```
在几秒钟内,我可以找到一些候选功能,而不必离开我的笔记本电脑来查阅文档。 在前面的例子中,我可以发现一些有趣的函数-`np.average``np.mean`-我仍然需要了解它们的参数。 再一次,我没有使用费时的文档来破坏我的工作流程,而是使用 Jupyter 笔记本鲜为人知的功能,该功能为我提供了内联函数的签名和文档字符串。 要调用功能的内联帮助,只需将光标置于功能的末尾并使用`Shift + Tab`组合即可。 第二次调用`Shift + Tab`将展开弹出窗口,以显示更多文本,如以下屏幕快照所示:
在几秒钟内,我可以找到一些候选函数,而不必离开我的笔记本电脑来查阅文档。 在前面的例子中,我可以发现一些有趣的函数-`np.average``np.mean`-我仍然需要了解它们的参数。 再一次,我没有使用费时的文档来破坏我的工作流程,而是使用 Jupyter 笔记本鲜为人知的功能,该功能为我提供了内联函数的签名和文档字符串。 要调用函数的内联帮助,只需将光标置于函数的末尾并使用`Shift + Tab`组合即可。 第二次调用`Shift + Tab`将展开弹出窗口,以显示更多文本,如以下屏幕快照所示:
### 注意
**注意**`Shift + Tab`仅适用于功能
**注意**`Shift + Tab`仅适用于函数
![Getting started with NumPy](img/00166.jpeg)
......@@ -135,7 +135,7 @@ statsmodels.tsa.tests.test_stattools.TestACF_FFT
* 从使用`np.array()`的 Python 列表或元组中,例如`np.array([1, 2, 3, 4])`
* 从 NumPy 工厂函数之一:
* `np.random`: 提供大量用于随机生成值的功能的模块。 此模块由以下类别组成:
* `np.random`: 提供大量用于随机生成值的函数的模块。 此模块由以下类别组成:
简单随机数据:`rand`,`randn`,`randint`等
......@@ -1922,7 +1922,7 @@ def build_arima_model_screen(self, p_order, d_order, q_order):
模型诊断画面
在本节中,我们展示了如何改进`StockExplorer`样本 PixieApp,以包括使用 ARIMA 模型预测功能。 顺便说一句,我们已经演示了如何使用 PixieApp 编程模型创建一个三步向导,该向导首先执行一些数据探索,然后配置模型的参数并构建它,最后根据测试集对模型进行诊断。
在本节中,我们展示了如何改进`StockExplorer`样本 PixieApp,以包括使用 ARIMA 模型预测功能。 顺便说一句,我们已经演示了如何使用 PixieApp 编程模型创建一个三步向导,该向导首先执行一些数据探索,然后配置模型的参数并构建它,最后根据测试集对模型进行诊断。
### 注意
......
......@@ -386,7 +386,7 @@ flight_graph = nx.from_pandas_edgelist(
[您可以在此处找到代码文件](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%209/sampleCode7.py)
**注意**:NetworkX 支持通过从多种格式创建,包括字典,列表,NumPy 和 SciPy 矩阵,当然还有 Pandas。 [您可以在此处找到有关这些转换功能的更多信息](https://networkx.github.io/documentation/networkx-2.1/reference/convert.html)
**注意**:NetworkX 支持通过从多种格式创建,包括字典,列表,NumPy 和 SciPy 矩阵,当然还有 Pandas。 [您可以在此处找到有关这些转换函数的更多信息](https://networkx.github.io/documentation/networkx-2.1/reference/convert.html)
我们可以通过直接打印其节点和边来快速验证我们的图是否具有正确的值:
......
......@@ -92,7 +92,7 @@
[您可以在此处找到代码文件](https://github.com/DTAIEB/Thoughtful-Data-Science/blob/master/chapter%205/sampleCode27.py)。
* `@Logger`: 通过向类中添加日志记录方法来添加日志记录功能`debug`, `warn`, `info`, `error`, `critical`, `exception`
* `@Logger`: 通过向类中添加日志记录方法来添加日志记录函数`debug`, `warn`, `info`, `error`, `critical`, `exception`
参数:无
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册