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

2021-03-10 18:28:52

上级 654b5ed8
......@@ -931,7 +931,7 @@ scikit_learn==0.19.0
![Create categorical fieldscreatingcategorical fields from continuous variables and make segmented visualizations](img/image1_151.jpg)
`MEDV`小提琴图不同,在每个小提琴图中,分布图的宽度大致相同,而这里的宽度随`AGE`的增加而增加。 以旧房屋为主的社区(“极老”部分)的居民数量很少,甚至很多,而相对较新的社区更可能是较高阶级的人群,超过 95% 的样本的较低阶级百分比低于“非常”阶级 旧社区。 这是有道理的,因为相对而言,新街区会更昂贵。
`MEDV`小提琴图不同,在每个小提琴图中,分布图的宽度大致相同,而这里的宽度随`AGE`的增加而增加。 以旧房屋为主的社区(“非常旧”的部分)的居民数量很少,甚至很多,而相对较新的社区更可能是较高阶级的人群,超过 95% 的样本的低阶级百分比低于“非常旧”的社区。 这是有道理的,因为相对而言,新街区会更昂贵。
# 摘要
......
......@@ -513,11 +513,11 @@ print(df.left.isnull().sum())
找出问题所在后,我们学习了使用 Jupyter笔记本构建和测试数据转换管道的技术。 这些技术包括用于填充缺失数据,转换分类特征以及构建训练/测试数据集的方法和最佳实践。
在本课程的其余部分中,我们将使用预处理后的数据来训练各种分类模型。 为了避免盲目地应用我们不了解的算法,我们首先介绍它们并概述它们的工作方式。 然后,我们使用 Jupyter 来训练和比较其预测能力。 在这里,我们有机会讨论机器学习中的更多高级主题,例如过拟合,K 折交叉验证和验证曲线。
在本课程的其余部分中,我们将使用预处理后的数据来训练各种分类模型。 为了避免盲目地应用我们不了解的算法,我们首先介绍它们并概述它们的工作方式。 然后,我们使用 Jupyter 来训练和比较其预测能力。 在这里,我们有机会讨论机器学习中的更多高级主题,例如过拟合,K 折交叉验证和验证曲线。
# 训练分类模型
正如我们在上一课中已经看到的那样,使用诸如 Scikit-learn 之类的库和诸如 Jupyter 之类的平台,可以仅用几行代码来训练预测模型。 通过抽象化与优化模型参数有关的困难计算,可以做到这一点。 换句话说,我们处理一个黑盒,内部操作被隐藏。 这种简单性也带来了滥用算法的危险,例如在训练过程中过拟合或无法正确测试看不见的数据。 我们将展示如何在训练分类模型时避免这些陷阱,并通过使用 K 折交叉验证和验证曲线来产生可信赖的结果。
正如我们在上一课中已经看到的那样,使用诸如 Scikit-learn 之类的库和诸如 Jupyter 之类的平台,可以仅用几行代码来训练预测模型。 通过抽象化与优化模型参数有关的困难计算,可以做到这一点。 换句话说,我们处理一个黑盒,内部操作被隐藏。 这种简单性也带来了滥用算法的危险,例如在训练过程中过拟合或无法正确测试看不见的数据。 我们将展示如何在训练分类模型时避免这些陷阱,并通过使用 K 折交叉验证和验证曲线来产生可信赖的结果。
## 子主题 A:分类算法简介
......@@ -541,11 +541,11 @@ K 最近邻分类算法可存储训练数据并根据特征空间中的 K 个最
本质上,该术语描述了试图选择目标变量的最佳分割的数学。
训练随机森林包括为一组决策树创建引导数据集(即带替换的随机采样数据)数据集。 然后根据多数表决做出预测。 这些具有减少过拟合和更好地泛化的好处。
训练随机森林包括为一组决策树创建引导数据集(即带替换的随机采样数据)数据集。 然后根据多数表决做出预测。 这些具有减少过拟合和更好地泛化的好处。
### 注意
决策树可用于对连续和分类数据的混合进行建模,这使它们非常有用。 此外,正如我们将在本课程后面看到的那样,可以限制树的深度以减少过拟合。 要详细了解决策树算法,[请查看以下流行的 StackOverflow 答案](https://stackoverflow.com/a/1859910/3511819)
决策树可用于对连续和分类数据的混合进行建模,这使它们非常有用。 此外,正如我们将在本课程后面看到的那样,可以限制树的深度以减少过拟合。 要详细了解决策树算法,[请查看以下流行的 StackOverflow 答案](https://stackoverflow.com/a/1859910/3511819)
作者在那里展示了一个简单的示例,并讨论了诸如节点纯度,信息增益和熵之类的概念。
......@@ -710,7 +710,7 @@ K 最近邻分类算法可存储训练数据并根据特征空间中的 K 个最
![Training k-nearest neighbors fork-Nearest Neighborstraining our model](img/image2_45.jpg)
特别是对于类别 1,我们看到了整体准确性的提高,并且有了显着提高。 但是,决策区域图将表明我们过度拟合了数据。 坚硬的,“不稳定的”决策边界和到处都是蓝色的小口袋可以证明这一点。 我们可以通过增加最近邻居的数量来软化决策边界并减少过度拟合。
特别是对于类别 1,我们看到了整体准确性的提高,并且有了显着提高。 但是,决策区域图将表明我们过拟合了数据。 坚硬的,“不稳定的”决策边界和到处都是蓝色的小口袋可以证明这一点。 我们可以通过增加最近邻居的数量来软化决策边界并减少过拟合。
3. 通过运行包含以下代码的单元,使用`n_neighbors = 25`训练 KNN 模型:
......@@ -771,15 +771,15 @@ K 最近邻分类算法可存储训练数据并根据特征空间中的 K 个最
* 我们对支持向量机(SVM),K 最近邻分类器(kNN)和随机森林有了定性的了解
* 现在,我们可以使用 Scikit-learn 和 Jupyter笔记本训练各种模型,因此我们可以放心地建立和比较预测模型
特别是,我们使用了来自员工保留问题的预处理数据来训练分类模型,以预测员工是否已离开公司。 为了使事情简单并着重于算法,我们建立了模型来预测这一点,仅给出两个特征:满意度和最后评估值。 这个二维特征空间还使我们能够可视化决策边界并确定过拟合的外观。
特别是,我们使用了来自员工保留问题的预处理数据来训练分类模型,以预测员工是否已离开公司。 为了使事情简单并着重于算法,我们建立了模型来预测这一点,仅给出两个特征:满意度和最后评估值。 这个二维特征空间还使我们能够可视化决策边界并确定过拟合的外观。
在以下部分中,我们将介绍机器学习中的两个重要主题:K 折交叉验证和验证曲线。
## 子主题 B:具有 K 折交叉验证和验证曲线的评估模型
到目前为止,我们已经在数据的子集上训练了模型,然后在看不见的部分(称为测试集)上评估了性能。 这是一个好习惯,因为训练数据的模型性能不能很好地表明其作为预测变量的有效性。 通过过拟合模型来提高训练数据集的准确性非常容易,这可能会导致看不见的数据性能下降。
到目前为止,我们已经在数据的子集上训练了模型,然后在看不见的部分(称为测试集)上评估了性能。 这是一个好习惯,因为训练数据的模型性能不能很好地表明其作为预测变量的有效性。 通过过拟合模型来提高训练数据集的准确性非常容易,这可能会导致看不见的数据性能下降。
就是说,仅这样的数据分割训练模型还不够好。 数据中存在自然差异,这会导致准确性根据训练和测试分裂而有所不同(甚至略有不同)。 此外,仅使用一个训练/测试组来比较模型会导致对某些模型的偏见并导致过拟合。
就是说,仅这样的数据分割训练模型还不够好。 数据中存在自然差异,这会导致准确性根据训练和测试分裂而有所不同(甚至略有不同)。 此外,仅使用一个训练/测试组来比较模型会导致对某些模型的偏见并导致过拟合。
**K 折交叉验证**为提供了解决此问题的方法,并允许通过每次准确性计算中的误差估计来解决方差。 反过来,这自然会导致使用验证曲线来调整模型参数。 这些将精度绘制为超参数的函数,例如随机森林中使用的决策树数或最大深度。
......@@ -815,7 +815,7 @@ K 折交叉验证算法如下:
![Subtopic B: Assessing Models with k-Fold Cross-Validation and Validation Curves](img/image2_52.jpg)
从图的左侧开始,我们可以看到两组数据在得分上都一致,这很好。 但是,与其他伽玛值相比,该分数也很低,因此我们说该模型不适合数据。 随着伽马的增加,我们可以看到一点,这两条线的误差线不再重叠。 从这一点开始,我们看到分类器过拟合数据,因为与验证集相比,模型在训练集上的表现越来越好。 可以通过在两行误差线重叠的情况下寻找较高的验证分数来找到伽玛参数的最佳值。
从图的左侧开始,我们可以看到两组数据在得分上都一致,这很好。 但是,与其他伽玛值相比,该分数也很低,因此我们说该模型不适合数据。 随着伽马的增加,我们可以看到一点,这两条线的误差线不再重叠。 从这一点开始,我们看到分类器过拟合数据,因为与验证集相比,模型在训练集上的表现越来越好。 可以通过在两行误差线重叠的情况下寻找较高的验证分数来找到伽玛参数的最佳值。
请记住,某些参数的学习曲线仅在其他参数保持不变时才有效。 例如,如果在该图中训练 SVM,我们可以决定选择 10-4 数量级的伽玛。 但是,我们可能还想优化`C`参数。 如果`C`的值不同,则前面的图将不同,并且我们对 Gamma 的选择可能不再是最佳的。
......@@ -927,7 +927,7 @@ K 折交叉验证算法如下:
总而言之,我们已经学习并实现了两种重要的技术来构建可靠的预测模型。 第一种这样的技术是 K 折交叉验证,该技术用于将数据拆分为各种训练/测试批次并产生设定的准确性。 然后,从这个集合中,我们计算出平均准确度和标准偏差作为误差的度量。 这很重要,因此我们可以衡量模型的可变性,并可以产生可信赖的准确性。
我们还了解了另一种可以确保获得值得信赖的结果的技术:验证曲线。 这些使我们可以根据比较训练和验证准确性来可视化模型何时过拟合。 通过在选定的超参数的范围内绘制曲线,我们可以确定其最佳值。
我们还了解了另一种可以确保获得值得信赖的结果的技术:验证曲线。 这些使我们可以根据比较训练和验证准确性来可视化模型何时过拟合。 通过在选定的超参数的范围内绘制曲线,我们可以确定其最佳值。
在本课程的最后部分,我们将到目前为止所学到的所有知识综合起来,以便为员工保留问题建立最终的预测模型。 与迄今为止训练的模型相比,我们力求通过将模型中数据集的所有特征包括在内来提高准确性。 我们将看到现在熟悉的主题,例如 K 折交叉验证和验证曲线,但是我们还将引入一些新的东西:降维技术。
......@@ -1010,7 +1010,7 @@ K 折交叉验证算法如下:
![Training a predictive model for the employee retention problem](img/image2_54.jpg)
对于较小的最大深度,我们看到该模型无法拟合数据。 通过使决策树更深,并在数据中编码更复杂的模式,总精度会急剧增加。 随着最大深度的进一步增加和的准确性接近 100%,我们发现该模型过拟合了数据,导致训练和验证的准确性不断提高。 基于此图,让我们为模型选择`6`的`max_depth`。
对于较小的最大深度,我们看到该模型无法拟合数据。 通过使决策树更深,并在数据中编码更复杂的模式,总精度会急剧增加。 随着最大深度的进一步增加和的准确性接近 100%,我们发现该模型过拟合了数据,导致训练和验证的准确性不断提高。 基于此图,让我们为模型选择`6`的`max_depth`。
我们确实应该对`n_estimators`做同样的事情,但是出于节省时间的精神,我们将跳过它。 欢迎您自己绘制。 您应该在训练和验证集之间找到适用于各种价值的协议。 通常,最好在“随机森林”中使用更多的决策树估计器,但这是以增加训练时间为代价的。 我们将使用 200 个估算器来训练我们的模型。
......
......@@ -1014,7 +1014,7 @@ Bokeh 是一个用于 Python 的交互式可视化库。 其目标是提供与 D
第一个课程是 Jupyter笔记本平台的简介,其中涵盖了所有基础知识。 我们了解了界面以及如何使用和安装魔术函数。 然后,我们介绍了将要使用的 Python 库,并对*波士顿房屋*数据集进行了探索性分析。
在第二课中,我们专注于与 Jupyter 一起进行机器学习。 我们首先讨论了制定预测分析计划的步骤,然后介绍了几种不同类型的模型,包括 SVM,KNN 分类器和随机森林。 在处理*员工保留*数据集时,我们应用了数据清理方法,然后训练了模型以预测员工是否离开。 我们还探讨了更高级的主题,例如过拟合,K 折交叉验证和验证曲线。
在第二课中,我们专注于与 Jupyter 一起进行机器学习。 我们首先讨论了制定预测分析计划的步骤,然后介绍了几种不同类型的模型,包括 SVM,KNN 分类器和随机森林。 在处理*员工保留*数据集时,我们应用了数据清理方法,然后训练了模型以预测员工是否离开。 我们还探讨了更高级的主题,例如过拟合,K 折交叉验证和验证曲线。
最后,在第三课中,我们简要地从数据分析转移到使用 Web 抓取的数据收集,并了解了如何在 Jupyter 中进行 HTTP 请求和解析 HTML 响应。 然后,我们通过使用交互式可视化来探索我们收集的数据来完成本书。
......
......@@ -157,9 +157,9 @@ plt.show()
现在,如果需要,我们还可以使用二阶多项式,看起来像`y = ax ^ 2 + bx + c`。 如果我们使用二阶多项式进行回归,则将获得`a``b``c`的值。 或者我们可以做一个`ax ^ 3 + bx ^ 2 + cx + d`形式的三阶多项式。 阶数越高,可以表示的曲线越复杂。 因此,将`x`混合在一起的能力越强,可以获得的形状和关系就越复杂。
但是,获得更多学位并不总是更好。 通常,您的数据中存在某种自然关系,实际上并没有那么复杂,如果您发现自己在拟合数据时投入了很大的精力,那您可能就过拟合了!
但是,获得更多学位并不总是更好。 通常,您的数据中存在某种自然关系,实际上并没有那么复杂,如果您发现自己在拟合数据时投入了很大的精力,那您可能就过拟合了!
当心过拟合!
当心过拟合!
* 不要使用过多的学位
* 首先可视化您的数据以查看曲线的真正复杂程度
......@@ -170,7 +170,7 @@ plt.show()
因此,始终仅从可视化数据开始,然后考虑曲线真正需要多么复杂。 现在,您可以使用 R 平方来衡量您的拟合度,但是请记住,这只是在测量该曲线与您的训练数据的拟合度,即您用来实际基于其进行预测的数据。 它不能衡量您准确预测未来的能力。
稍后,我们将讨论称为**训练/测试**的一些防止过度拟合的技术,但是现在您只需要仔细研究一下,以确保您不会过度拟合并得到一个比您需要的阶数更高的函数。 当我们探索一个示例时,这将更有意义,所以让我们继续。
稍后,我们将讨论称为**训练/测试**的一些防止过拟合的技术,但是现在您只需要仔细研究一下,以确保您不会过拟合并得到一个比您需要的阶数更高的函数。 当我们探索一个示例时,这将更有意义,所以让我们继续。
# 使用 NumPy 实现多项式回归
......@@ -221,11 +221,11 @@ plt.show()
![](img/be56a569-0f3e-4921-88d8-bfdfa72c018a.png)
在这一点上,看起来很合适。 但是,您想问自己:“我是否过拟合?我的曲线看起来是否真的超出了容纳异常值的范围?” 我发现那并不是真的。 我真的没有看到很多疯狂的事情发生。
在这一点上,看起来很合适。 但是,您想问自己:“我是否过拟合?我的曲线看起来是否真的超出了容纳异常值的范围?” 我发现那并不是真的。 我真的没有看到很多疯狂的事情发生。
如果我有一个非常高阶的多项式,它可能会在顶部向上捕捉以捕获那个离群值,然后向下扫描以捕捉在那里的离群值,并在我们有很多密度的地方变得更稳定,然后它可能会遍历整个地方,以尝试适应最后的最后一组离群值。 如果您看到这样的废话,就知道多项式中的阶数过多,阶数过多,您应该将其降低,因为尽管它适合您所观察到的数据,但对预测您尚未看到的数据没有用。
想象一下,我有一条曲线突然向上弯曲,然后再次向下弯曲以适应异常值。 我对介于两者之间的内容的预测将不准确。 曲线确实应该在中间。 在本书的后面,我们将讨论检测这种过拟合的主要方法,但是现在,请观察它并知道我们以后会更深入。
想象一下,我有一条曲线突然向上弯曲,然后再次向下弯曲以适应异常值。 我对介于两者之间的内容的预测将不准确。 曲线确实应该在中间。 在本书的后面,我们将讨论检测这种过拟合的主要方法,但是现在,请观察它并知道我们以后会更深入。
# 计算 R 平方误差
......@@ -247,7 +247,7 @@ print r2
# 多项式回归的活动
我建议您开始研究这些东西。 尝试多项式的不同阶数。 返回到我们运行`polyfit()`函数的位置,然后尝试除 4 之外的其他值。您可以使用 1,然后返回线性回归,也可以尝试使用诸如 8 之类的非常高的数值,也许您会开始看到过拟合。 所以看看有什么效果。 您将要更改它。 例如,让我们转到三次多项式。
我建议您开始研究这些东西。 尝试多项式的不同阶数。 返回到我们运行`polyfit()`函数的位置,然后尝试除 4 之外的其他值。您可以使用 1,然后返回线性回归,也可以尝试使用诸如 8 之类的非常高的数值,也许您会开始看到过拟合。 所以看看有什么效果。 您将要更改它。 例如,让我们转到三次多项式。
```py
x = np.array(pageSpeeds)
......@@ -263,7 +263,7 @@ p4 = np.poly1d(np.polyfit(x, y, 3))
我们的三次多项式绝对不如第四次多项式拟合。 如果您实际测量 R 平方误差,则从数量上看,它实际上会变得更糟。 但是如果我过高,您可能会开始觉得过拟合。 因此,您可以从中获得一些乐趣,尝试不同的值,并了解多项式的不同阶数对回归的影响。 去弄脏你的手,尝试学习一些东西。
这就是多项式回归。 同样,您需要确保对问题的重视程度不超过所需。 仅使用正确的量来查找看起来像对数据的直观拟合。 太多会导致过拟合,而太多会导致拟合不佳...因此,您现在可以同时使用眼球和 R 平方度量,以找出适合数据的度数。 让我们继续。
这就是多项式回归。 同样,您需要确保对问题的重视程度不超过所需。 仅使用正确的量来查找看起来像对数据的直观拟合。 太多会导致过拟合,而太多会导致拟合不佳...因此,您现在可以同时使用眼球和 R 平方度量,以找出适合数据的度数。 让我们继续。
# 多元回归和预测汽车价格
......
......@@ -2,7 +2,7 @@
在本章中,我们将学习机器学习以及如何在 Python 中实际实现机器学习模型。
我们将研究有监督和无监督学习的含义,以及它们之间的区别。 我们将看到防止过拟合的技术,然后看一个有趣的示例,其中实现了垃圾邮件分类器。 我们将分析一个长期的 K 均值聚类方法,并通过一个工作示例使用 Scikit-learn 根据人们的收入和年龄对其聚类!
我们将研究有监督和无监督学习的含义,以及它们之间的区别。 我们将看到防止过拟合的技术,然后看一个有趣的示例,其中实现了垃圾邮件分类器。 我们将分析一个长期的 K 均值聚类方法,并通过一个工作示例使用 Scikit-learn 根据人们的收入和年龄对其聚类!
我们还将介绍称为**决策树**的机器学习一个非常有趣的应用程序,并且将在 Python 中构建一个工作示例来预测公司中的重要决策。 最后,我们将讲解集成学习和 SVM 的迷人概念,这是我最喜欢的机器学习领域!
......@@ -59,7 +59,7 @@
所以你知道我在那做什么? 我有一组数据,已经有了可以训练模型的答案,但是我将保留其中的一部分数据,并实际使用它来测试使用训练集生成的模型! 这为我提供了一种非常具体的方法来测试我的模型在看不见的数据上的表现,因为实际上我保留了一些可以用来测试它的数据。
然后,您可以使用 R 平方或其他度量标准(例如,均方根误差)来定量评估其效果如何。 您可以使用它来测试一个模型与另一个模型,并查看针对给定问题的最佳模型。 您可以调整该模型的参数,并使用训练/测试来最大化该模型在测试数据上的准确性。 因此,这是防止过拟合的好方法。
然后,您可以使用 R 平方或其他度量标准(例如,均方根误差)来定量评估其效果如何。 您可以使用它来测试一个模型与另一个模型,并查看针对给定问题的最佳模型。 您可以调整该模型的参数,并使用训练/测试来最大化该模型在测试数据上的准确性。 因此,这是防止过拟合的好方法。
需要指导学习的一些注意事项。 需要确保您的训练和测试数据集都足够大以实际代表您的数据。 您还需要确保在培训和测试中都捕获到了您关注的所有不同类别和异常值,以便很好地衡量其成功并建立良好的模型。
......@@ -67,7 +67,7 @@
现在,如果您的模型过拟合,并且只是竭尽全力地接受训练数据中的离群值,那么当您将其与未设定的测试数据场景相对应时,这将被揭示出来。 这是因为异常值的所有旋转都无法解决之前从未出现过的异常值。
在这里让我们清楚一点,训练/测试不是完美的,并且有可能从中获得误导性的结果。 就像我们已经讨论过的那样,也许您的样本量太小,或者仅仅是由于随机的机会,您的训练数据和测试数据看起来非常相似,但它们实际上有一组相似的离群值-您仍然可能过拟合。 如下面的示例所示,它确实可以发生:
在这里让我们清楚一点,训练/测试不是完美的,并且有可能从中获得误导性的结果。 就像我们已经讨论过的那样,也许您的样本量太小,或者仅仅是由于随机的机会,您的训练数据和测试数据看起来非常相似,但它们实际上有一组相似的离群值-您仍然可能过拟合。 如下面的示例所示,它确实可以发生:
![](img/dfd6dacd-41fc-415b-ab5b-dda9abf05c09.jpg)
......@@ -149,7 +149,7 @@ scatter(testX, testY)
在这里,我们看到剩下的 20 个测试数据也具有与原始数据相同的总体形状。 因此,我认为这也是一个代表性的测试集。 当然,它比您在现实世界中看到的要小一些。 例如,如果您有 1,000 点而不是 100 点,您可能会得到更好的结果,例如,从中选择并保留 200 点而不是 20 点。
现在,我们将尝试将 8 次多项式拟合到此数据,并且我们将随机选择数字`8`,因为我知道这是一个非常高的阶数,并且可能过拟合。
现在,我们将尝试将 8 次多项式拟合到此数据,并且我们将随机选择数字`8`,因为我知道这是一个非常高的阶数,并且可能过拟合。
让我们继续使用`np.poly1d(np.polyfit(x, y, 8))`拟合我们的 8 阶多项式,其中`x`仅是训练数据的数组,而`y`仅是训练数据的数组。 我们仅使用预留给训练的 80 个点来查找模型。 现在,我们有了此`p4`函数,可以将其用于预测新值:
......@@ -176,11 +176,11 @@ plt.show()
```
您可以在下图中看到它看起来非常合适,但您显然知道它做了一些过拟合:
您可以在下图中看到它看起来非常合适,但您显然知道它做了一些过拟合:
![](img/16b521a0-d571-4cd7-a5a8-e5557dcb7c1f.jpg)
右边的这种疯狂是什么? 我很确定我们的真实数据(如果有的话)不会令人发指,因为此功能会暗示这一点。 因此,这是过拟合数据的一个很好的例子。 它非常适合您提供的数据,但是在超出图表右侧的疯狂点之前,预测新值会做得很糟糕。 因此,让我们尝试进行梳理。 让我们给它测试数据集:
右边的这种疯狂是什么? 我很确定我们的真实数据(如果有的话)不会令人发指,因为此功能会暗示这一点。 因此,这是过拟合数据的一个很好的例子。 它非常适合您提供的数据,但是在超出图表右侧的疯狂点之前,预测新值会做得很糟糕。 因此,让我们尝试进行梳理。 让我们给它测试数据集:
```py
testx = np.array(testX)
......@@ -225,7 +225,7 @@ R 平方值原来是`0.6`,这并不奇怪,因为我们在训练数据上对
您可能会猜到您的作业是什么。 因此,我们知道 8 阶多项式不是很有用。 你能做得更好吗? 因此,我希望您回顾一下我们的示例,并对要用于拟合的次数多项式使用不同的值。 将该 8 更改为不同的值,然后查看是否可以找出使用训练/测试作为度量标准的多项式最有效的分数。 您在哪里可以得到最佳的 R 平方分数作为测试数据? 这里适合什么程度? 去玩吧。 这应该是一个非常容易的练习,同时对您也非常有启发性。
因此,这实际上是培训/测试,这是掌握的一项非常重要的技术,并且您将一遍又一遍地使用它,以确保您的结果很好地适合您所拥有的模型,并且您的结果可以很好地预测看不见的值。 这是在进行建模时防止过拟合的好方法。
因此,这实际上是培训/测试,这是掌握的一项非常重要的技术,并且您将一遍又一遍地使用它,以确保您的结果很好地适合您所拥有的模型,并且您的结果可以很好地预测看不见的值。 这是在进行建模时防止过拟合的好方法。
# 贝叶斯方法-概念
......@@ -571,11 +571,11 @@ plt.show()
# 随机森林技术
现在,决策树的一个问题是它们很容易过拟合,因此您最终可能会得到一个决策树,该树对于您训练过的数据非常有效,但是对以前从未见过的新朋友实际预测正确的分类可能不是那么好。 决策树都是为了为您提供的培训数据做出正确的决策,但是也许您没有真正考虑正确的属性,也许您没有给予足够的代表性样本以供学习 。 这可能会导致实际问题。
现在,决策树的一个问题是它们很容易过拟合,因此您最终可能会得到一个决策树,该树对于您训练过的数据非常有效,但是对以前从未见过的新朋友实际预测正确的分类可能不是那么好。 决策树都是为了为您提供的培训数据做出正确的决策,但是也许您没有真正考虑正确的属性,也许您没有给予足够的代表性样本以供学习 。 这可能会导致实际问题。
因此,为了解决这个问题,我们使用了一种称为随机森林的技术,该技术的思想是针对多个不同的决策树,以不同的方式对训练的数据进行采样。 每个决策树都从我们的训练数据集中获取不同的随机样本,并从中构造出一棵树。 然后,每个结果树都可以对正确的结果进行投票。
现在,使用同一模型对数据进行随机重采样的技术称为引导聚合或装袋。 这是我们称为集成学习的一种形式,稍后我们将详细介绍。 但是基本的想法是,我们有多棵树,如果有的话,是一棵树,每棵树都使用我们必须训练的数据的随机子样本。 然后,每棵树都可以对最终结果进行投票,这将有助于我们针对给定的一组训练数据来对抗过拟合。
现在,使用同一模型对数据进行随机重采样的技术称为引导聚合或装袋。 这是我们称为集成学习的一种形式,稍后我们将详细介绍。 但是基本的想法是,我们有多棵树,如果有的话,是一棵树,每棵树都使用我们必须训练的数据的随机子样本。 然后,每棵树都可以对最终结果进行投票,这将有助于我们针对给定的一组训练数据来对抗过拟合。
随机森林可以做的另一件事是,实际上,它在每个阶段都限制了它可以选择的属性数量,同时它试图将熵降到最低。 我们可以随机选择每个级别可以选择的属性。 因此,这也使我们从树到树的变化更多,因此,我们获得了更多可以相互竞争的算法。 他们都可以使用略有不同的方法对最终结果进行投票以获得相同的答案。
......@@ -705,7 +705,7 @@ Image(graph.create_png())
# 集成学习–使用随机森林
现在,假设我们要使用随机森林,您知道,我们担心我们可能过拟合训练数据。 创建包含多个决策树的随机森林分类器实际上非常容易。
现在,假设我们要使用随机森林,您知道,我们担心我们可能过拟合训练数据。 创建包含多个决策树的随机森林分类器实际上非常容易。
因此,为此,我们可以使用之前创建的相同数据。 您只需要``X````y``向量,这就是要在其上进行预测的功能集和列:
......@@ -758,7 +758,7 @@ print clf.predict([[10, 0, 4, 0, 0, 0]])
现在,所有这些都是非常复杂的技术,我在本书的范围内无法真正涉及到,但是总而言之,很难仅胜过我们已经讨论过的简单技术。 这里列出了一些复杂的技术:
* **贝叶斯光学分类器**:从理论上讲,有一种称为贝叶斯最佳分类器的东西总是最好的,但是这是不切实际的,因为这样做在计算上是令人望而却步的。
* **贝叶斯参数平均**:许多人试图对贝叶斯最佳分类器进行变型以使其更实用,例如贝叶斯参数平均变型。 但是它仍然容易过拟合,并且经常由于装袋而表现不佳,这与随机森林的想法相同。 您只需多次对数据进行重新采样,运行不同的模型,然后让它们全部对最终结果进行投票。 事实证明,该方法同样有效,而且简单得多!
* **贝叶斯参数平均**:许多人试图对贝叶斯最佳分类器进行变型以使其更实用,例如贝叶斯参数平均变型。 但是它仍然容易过拟合,并且经常由于装袋而表现不佳,这与随机森林的想法相同。 您只需多次对数据进行重新采样,运行不同的模型,然后让它们全部对最终结果进行投票。 事实证明,该方法同样有效,而且简单得多!
* **贝叶斯模型组合**:最后,有一种称为贝叶斯模型组合的东西试图解决贝叶斯最佳分类器和贝叶斯参数平均的所有缺点。 但是,归根结底,它并没有比对模型组合进行交叉验证做得更好。
同样,这些都是非常复杂的技术,很难使用。 在实践中,最好使用我们已详细讨论过的简单方法。 但是,如果您想听起来很聪明,并且经常使用贝叶斯一词,那么至少要熟悉这些技术并知道它们是什么是很好的。
......
# 处理真实数据
在本章中,我们将讨论处理现实数据的挑战,以及您可能会遇到的一些怪癖。 本章首先讨论偏差方差折衷,这是一种更原则性的方式,用于讨论您可能过度拟合和欠拟合数据的不同方式,以及它们之间如何相互关联。 然后,我们讨论 K 折交叉验证技术,该技术是打击过度拟合的重要工具,并介绍了如何使用 Python 实现该技术。
在本章中,我们将讨论处理现实数据的挑战,以及您可能会遇到的一些怪癖。 本章首先讨论偏差方差折衷,这是一种更原则性的方式,用于讨论您可能过拟合和欠拟合数据的不同方式,以及它们之间如何相互关联。 然后,我们讨论 K 折交叉验证技术,该技术是打击过拟合的重要工具,并介绍了如何使用 Python 实现该技术。
接下来,我们分析在实际应用任何算法之前清除数据并对其进行规范化的重要性。 我们看到一个示例,用于确定网站上最受欢迎的页面,这些页面将演示清洁数据的重要性。 本章还涵盖了记住对数值数据进行规范化的重要性。 最后,我们研究如何检测异常值并加以处理。
......@@ -15,7 +15,7 @@
# 偏差/方差折衷
在处理现实世界数据时,我们面临的基本挑战之一是拟合过高与拟合过低而不是拟合数据,模型或预测。 当我们谈论欠拟合和过拟合时,我们经常可以在偏差和方差以及偏差与方差之间进行权衡。 所以,让我们谈谈这意味着什么。
在处理现实世界数据时,我们面临的基本挑战之一是拟合过高与拟合过低而不是拟合数据,模型或预测。 当我们谈论欠拟合和过拟合时,我们经常可以在偏差和方差以及偏差与方差之间进行权衡。 所以,让我们谈谈这意味着什么。
因此,从概念上讲,偏差和方差非常简单。 偏差与您与正确值的距离有多远,也就是说,您的总体预测在预测正确的总体值方面有多好。 如果您采用所有预测的均值,它们或多或少都在正确的位置上? 还是您的错误始终在一个方向或另一个方向上始终偏斜? 如果是这样,则您的预测会偏向某个方向。
......@@ -30,13 +30,13 @@
* 在左下角的飞镖板上,您可以看到我们的预测分散在错误的均值周围。 因此,我们有很高的偏见。 一切都偏向了不该有的地方。 但是我们的差异也很大。 因此,这是两个世界中最糟糕的一个。 在此示例中,我们具有较高的偏见和较高的方差。
* 最后,在一个奇妙的完美世界中,您将看到一个示例,例如右下方向的飞镖盘,其中我们的偏见低,所有事物都集中在应该放置的地方,而方差很小,所有事物都紧密地聚集在应该放置的地方。 因此,在一个完美的世界中,这就是最终的结果。
实际上,您通常需要在偏差和方差之间进行选择。 归结为过拟合对数据的拟合不足。 让我们看下面的例子:
实际上,您通常需要在偏差和方差之间进行选择。 归结为过拟合对数据的拟合不足。 让我们看下面的例子:
![](img/7a856ab7-9d88-404c-8cfb-97365495b525.png) ![](img/0386221c-18f7-4cc9-88aa-9139c77d4ba5.png)
这与偏见和差异的思考方式有些不同。 因此,在左图中,我们有一条直线,相对于这些观察,您可以认为这具有非常低的方差。 因此,该行没有太多变化,即,变化很小。 但是偏差(每个点的误差)实际上很高。
现在,将其与右图中的过拟合数据进行对比,我们已经竭尽全力来拟合观察值。 该线具有较高的方差,但具有较低的偏差,因为每个点都非常接近应有的位置。 因此,这是我们用方差权衡偏差的一个例子。
现在,将其与右图中的过拟合数据进行对比,我们已经竭尽全力来拟合观察值。 该线具有较高的方差,但具有较低的偏差,因为每个点都非常接近应有的位置。 因此,这是我们用方差权衡偏差的一个例子。
归根结底,您并不想减少偏差或减少方差,而是想减少误差。 真正重要的是,事实证明您可以将误差表示为偏差和方差的函数:
......@@ -46,15 +46,15 @@
现在,让我们将其与本书中较早的概念联系起来。 例如,在`k`个最近的邻居中,如果我们增加 K 的值,我们就会开始平均扩展到更大区域的邻居。 这具有减少方差的效果,因为我们可以在更大的空间上使事物平滑,但是它可能会增加我们的偏见,因为我们将要挑选到的人群可能与我们开始时的相关性越来越小 。 通过在大量邻居上平滑 KNN,我们可以减小方差,因为我们正在通过更多值平滑事物。 但是,我们可能会引入偏见,因为我们引入了越来越多的点,而这些点与开始时的点之间的关联性却不那么高。
决策树是另一个例子。 我们知道,单个决策树很容易过拟合,因此可能暗示它具有很大的方差。 但是,随机森林寻求权衡一些方差以减少偏差,并且它通过拥有多个随机变异的树并将其所有解决方案求平均来做到这一点。 就像当我们通过增加 KNN 中的 K 来对事物进行平均时:我们可以通过使用多个使用相似森林的随机森林决策树来平均决策树的结果。
决策树是另一个例子。 我们知道,单个决策树很容易过拟合,因此可能暗示它具有很大的方差。 但是,随机森林寻求权衡一些方差以减少偏差,并且它通过拥有多个随机变异的树并将其所有解决方案求平均来做到这一点。 就像当我们通过增加 KNN 中的 K 来对事物进行平均时:我们可以通过使用多个使用相似森林的随机森林决策树来平均决策树的结果。
这是偏差方差的权衡。 您知道必须在价值的整体准确性,价值的分散程度或紧密程度之间做出决定。 那就是偏差-方差的权衡,它们都会导致整体误差,这是您真正关心的要最小化的事情。 因此,请记住这些条款!
# K 折交叉验证以避免过拟合
在本书的前面,我们讨论了训练和测试,将其作为防止过度拟合并实际测量模型在从未见过的数据上的性能的好方法。 我们可以使用称为 K 折交叉验证的技术将其提升到一个新的水平。 因此,让我们谈谈您的武器库中用于对抗过度拟合的强大工具; K 折交叉验证并了解其工作原理。
在本书的前面,我们讨论了训练和测试,将其作为防止过拟合并实际测量模型在从未见过的数据上的性能的好方法。 我们可以使用称为 K 折交叉验证的技术将其提升到一个新的水平。 因此,让我们谈谈您的武器库中用于对抗过拟合的强大工具; K 折交叉验证并了解其工作原理。
回想一下火车/测试,当时的想法是,我们将要构建机器学习模型的所有数据分为两个部分:训练数据集和测试数据集。 想法是,我们仅使用训练数据集中的数据来训练模型,然后使用为测试数据集保留的数据评估模型的性能。 这样可以防止我们过拟合现有的数据,因为我们正在针对该模型进行过从未见过的数据测试。
回想一下火车/测试,当时的想法是,我们将要构建机器学习模型的所有数据分为两个部分:训练数据集和测试数据集。 想法是,我们仅使用训练数据集中的数据来训练模型,然后使用为测试数据集保留的数据评估模型的性能。 这样可以防止我们过拟合现有的数据,因为我们正在针对该模型进行过从未见过的数据测试。
但是,训练/测试仍然有其局限性:您仍然可能最终过度适合您的特定训练/测试单元。 也许您的训练数据集并不能真正代表整个数据集,并且太多的东西最终出现在您的训练数据集中,使事情发生了偏差。 因此,这就是 K 折交叉验证的用武之地,它需要训练/测试并将其提升一个档次。
......@@ -67,7 +67,7 @@
仅此而已。 这是一种进行训练/测试的更强大的方法,而这也是一种方法。
现在,您可能会好好考虑一下,如果我对保留的那一个测试数据集过拟合该怎么办? 对于这些训练数据集中的每个数据集,我仍使用相同的测试数据集。 如果该测试数据集也不能真正代表事物怎么办?
现在,您可能会好好考虑一下,如果我对保留的那一个测试数据集过拟合该怎么办? 对于这些训练数据集中的每个数据集,我仍使用相同的测试数据集。 如果该测试数据集也不能真正代表事物怎么办?
有 K 折交叉验证的变体,也可以将其随机化。 因此,您可以每次都随机选择训练数据集是什么,而只是保持随机地将事物分配给不同的存储桶并测量结果。 但是通常,当人们谈论 K 折交叉验证时,他们谈论的是这种特定技术,即您保留一个存储桶用于测试,其余的存储桶用于训练,然后当您为每个桶建立一个模型时,相对于测试数据集评估全部训练数据集。
......@@ -159,9 +159,9 @@ print scores.mean()
![](img/705c48f3-a3b4-4d63-ae15-c4159c0e5c76.png)
事实证明,当我们使用多项式拟合时,最终得出的总体得分甚至低于我们的原始得分。 因此,这告诉我们多项式内核可能过拟合。 当我们使用 K 折交叉验证时,它显示出比线性核函数更低的分数。
事实证明,当我们使用多项式拟合时,最终得出的总体得分甚至低于我们的原始得分。 因此,这告诉我们多项式内核可能过拟合。 当我们使用 K 折交叉验证时,它显示出比线性核函数更低的分数。
这里重要的一点是,如果我们仅使用单个火车/测试单元,就不会意识到我们过度拟合。 如果我们像在线性内核上那样只进行一次训练/测试拆分,我们实际上会得到相同的结果。 因此,我们可能会无意间在此处过度拟合数据,甚至在不使用 K 折交叉验证的情况下甚至都不知道。 因此,这是一个很好的例子,它说明了救援人员使用 K 折的情况,并警告您过拟合,在这种情况下,单次火车/测试分站可能无法解决这一问题。 因此,请将其放在工具箱中。
这里重要的一点是,如果我们仅使用单个火车/测试单元,就不会意识到我们过拟合。 如果我们像在线性内核上那样只进行一次训练/测试拆分,我们实际上会得到相同的结果。 因此,我们可能会无意间在此处过拟合数据,甚至在不使用 K 折交叉验证的情况下甚至都不知道。 因此,这是一个很好的例子,它说明了救援人员使用 K 折的情况,并警告您过拟合,在这种情况下,单次火车/测试分站可能无法解决这一问题。 因此,请将其放在工具箱中。
如果您想更多地玩这个游戏,请尝试不同程度的尝试。 因此,您实际上可以指定其他数量的度数。 多项式内核的默认值为 3 度,但是您可以尝试其他一个,也可以尝试两个。
......@@ -636,4 +636,4 @@ plt.show()
# 概括
在本章中,我们讨论了在偏差和方差之间保持平衡并最小化误差的重要性。 接下来,我们看到了 K 折交叉验证的概念以及如何在 Python 中实现它以防止过度拟合。 我们了解了在处理数据之前清理数据并对其进行标准化的重要性。 然后,我们看到了一个确定网站受欢迎页面的示例。 在第 9 章,“Apache Spark-大数据机器学习”中,我们将使用 Apache Spark 学习大数据机器学习。
\ No newline at end of file
在本章中,我们讨论了在偏差和方差之间保持平衡并最小化误差的重要性。 接下来,我们看到了 K 折交叉验证的概念以及如何在 Python 中实现它以防止过拟合。 我们了解了在处理数据之前清理数据并对其进行标准化的重要性。 然后,我们看到了一个确定网站受欢迎页面的示例。 在第 9 章,“Apache Spark-大数据机器学习”中,我们将使用 Apache Spark 学习大数据机器学习。
\ No newline at end of file
......@@ -354,7 +354,7 @@ GPA 高且属于非常春藤盟校的申请人与 GPA 低且属于非常春藤
随机森林基本上在数据集上创建许多决策树,然后对结果求平均。 如果您看到歌唱比赛(例如《美国偶像》)或体育比赛(例如,奥运会),则有多个评委。 拥有多名法官的原因是为了消除偏见并给出公正的结果,而这正是随机森林试图实现的目标。
如果数据稍有变化,决策树可能会发生巨大变化,并且很容易使数据过拟合。
如果数据稍有变化,决策树可能会发生巨大变化,并且很容易使数据过拟合。
让我们尝试创建一个随机森林模型,并查看其精度/召回率与刚创建的决策树的比较:
......
......@@ -748,7 +748,7 @@ $> pip install git+git://github.com/fchollet/keras.git
该项目最初称为 IPython,由 Fernando Perez 于 2001 年作为一个免费项目启动。 通过他的工作,作者打算解决 Python 堆栈中的不足问题,并向公众提供用于数据调查的用户编程接口,该接口可以轻松地在数据发现和软件过程中结合科学方法(主要是实验和交互式发现) 发展。
科学的方法意味着可以以可重复的方式对不同的假设进行快速实验(数据科学中的数据探索和分析也是如此),当使用此界面时,您将能够更自然地实现探索性,迭代性,反复试验和错误研究策略 您的代码编写
科学的方法意味着可以以可重复的方式对不同的假设进行快速实验(数据科学中的数据探索和分析也是如此),当使用此界面时,在您的代码编写过程中,您将能够更自然地实现探索性,迭代性,反复试验和错误研究策略
最近(在 2015 年春季期间),IPython 项目的很大一部分移到了一个名为 Jupyter 的新项目中。 这个新项目将原始 IPython 接口的潜在可用性扩展到了广泛的编程语言,例如:
......@@ -1300,7 +1300,7 @@ Out: (1605, 119) (1605,)
如果您已经将数据下载并解压缩(如果需要)到工作目录中,则 NumPy 和 Pandas 库及其各自的`loadtxt``read_csv`函数提供了加载数据并开始工作的最简单方法。
例如,如果您打算分析波士顿的住房数据并使用[这个页面](http://mldata.org/repository/data/viewslug/regression-datasets-housing)中提供的版本,则必须首先下载 您本地目录中的`regression-datasets-housing.csv`文件。
例如,如果您打算分析波士顿的住房数据并使用[这个页面](http://mldata.org/repository/data/viewslug/regression-datasets-housing)中提供的版本,则必须首先在您本地目录中下载`regression-datasets-housing.csv`文件。
[您可以使用以下链接直接下载数据集](http://mldata.org/repository/data/download/csv/regression-datasets-housing)
......@@ -1410,7 +1410,7 @@ Out: (array([[-3.31994186, -2.39469384, -2.35882002, 1.40145585]]),
不论计算机和具体情况如何,`random_state`都可以确保确定性的结果,使您的实验可以完美地复制。
使用特定的整数定义`random_state`参数(在本例中为`101`,但是它可能是您喜欢或认为有用的任何数字),从而可以轻松设置机器上相同数据集的设置方式 在不同的操作系统和不同的机器上运行
使用特定的整数定义`random_state`参数(在本例中为`101`,但是它可能是您喜欢或认为有用的任何数字),可以轻松复制你的计算机上的相同的数据集,以及它的配置方式,到不同的操作系统和不同的机器上
顺便说一下,花了太长时间吗?
......
......@@ -364,9 +364,9 @@ In: import numpy as np
# 访问其他数据格式
到目前为止,我们仅处理 CSV 文件。 为了加载 MS Excel,HDFS,SQL,JSON,HTML 和 Stata 数据集,Pandas 包提供了类似的功能(和功能)。 由于这些格式中的大多数格式在数据科学中并未常规使用,因此大多数人只能了解如何加载和处理每种格式,您可以参考[Pandas网站上的可用文档](http://pandas.pydata.org/pandas-docs/version/0.16/io.html)。 在这里,我们将仅演示如何有效地使用磁盘空间以快速有效的方式存储和检索机器学习算法信息的要点。 在这种情况下,您可以利用 [SQLite 数据库](https://www.sqlite.org/index.html)来访问特定的信息子集并将其转换为 Pandas `DataFrame`。 如果您不需要对数据进行特定的选择或过滤,但是唯一的问题是从 CSV 文件读取数据非常耗时,并且每次都需要很多工作(例如,设置正确的变量类型和 名称),则可以使用 [HDF5 数据结构](https://support.hdfgroup.org/HDF5/whatishdf5.html)来加快保存和加载数据的速度。
到目前为止,我们仅处理 CSV 文件。 为了加载 MS Excel,HDFS,SQL,JSON,HTML 和 Stata 数据集,Pandas 包提供了类似的功能(和功能)。 由于这些格式中的大多数格式在数据科学中并未常规使用,因此大多数人只能了解如何加载和处理每种格式,您可以参考[Pandas网站上的可用文档](http://pandas.pydata.org/pandas-docs/version/0.16/io.html)。 在这里,我们将仅演示如何有效地使用磁盘空间以快速有效的方式存储和检索机器学习算法信息的要点。 在这种情况下,您可以利用 [SQLite 数据库](https://www.sqlite.org/index.html)来访问特定的信息子集并将其转换为 Pandas `DataFrame`。 如果您不需要对数据进行特定的选择或过滤,但是唯一的问题是从 CSV 文件读取数据非常耗时,并且每次都需要很多工作(例如,设置正确的变量类型和名称),则可以使用 [HDF5 数据结构](https://support.hdfgroup.org/HDF5/whatishdf5.html)来加快保存和加载数据的速度。
在第一个示例中,我们将使用 SQLite 和 SQL 语言存储一些数据并检索其过滤后的版本。 与其他数据库相比,SQLite 具有许多优点:它是独立的(所有数据都将存储在一个文件中),无服务器(Python 将提供存储,操作和访问数据的接口)且速度很快。 导入`sqlite3`程序包(它是 Python 堆栈的一部分,因此无论如何都不需要安装)后,您定义了两个查询:一个删除同名的先前数据表,另一个创建一个新表 能够保留日期,城市,温度和目的地数据(并且您使用整数,浮点数和`varchar`类型,它们对应于`int``float``str`)。
在第一个示例中,我们将使用 SQLite 和 SQL 语言存储一些数据并检索其过滤后的版本。 与其他数据库相比,SQLite 具有许多优点:它是独立的(所有数据都将存储在一个文件中),无服务器(Python 将提供存储,操作和访问数据的接口)且速度很快。 导入`sqlite3`程序包(它是 Python 堆栈的一部分,因此无论如何都不需要安装)后,您定义了两个查询:一个删除同名的先前数据表,另一个创建一个新表,它能够保留日期,城市,温度和目的地数据(并且您使用整数,浮点数和`varchar`类型,它们对应于`int``float``str`)。
打开数据库(此时已创建,如果尚未在磁盘上创建的数据库)之后,执行两个查询,然后提交更改(通过提交,[实际上是在一个批量中开始执行所有先前的数据库命令](https://www.sqlite.org/atomiccommit.html)):
......@@ -698,7 +698,7 @@ In: squared_iris = parallel_apply(iris[['sepal_length', 'sepal_width',
squared_iris
```
`Iris`数据集很小,在这种情况下,执行所需要的时间可能比仅应用命令还要长,但是在较大的数据集上,差异可能会非常明显,尤其是如果您可以依靠大量的数据 工人
`Iris`数据集很小,在这种情况下,执行所需要的时间可能比仅应用命令还要长,但是在较大的数据集上,差异可能会非常明显,尤其是如果您可以依靠大量的数据工作器
提示,在 Intel i5 CPU 上,您可以设置`workers=4`以获得最佳结果,而在 Intel i7 上,您可以设置`workers=8`
......@@ -794,7 +794,7 @@ In: dataset.iloc[range(2), [2,1]]
分类和数值的加号是布尔值。 实际上,它们可以看作是分类的(特征的存在/不存在),或者另一方面,可以认为特征具有展览(已显示,未显示)的概率。 由于许多机器学习算法不允许将输入分类,因此布尔特征通常用于将分类特征编码为数值。
让我们继续以天气为例。 如果要映射包含当前天气并采用集合[`sunny``cloudy``snowy``rainy``foggy`]中的值并将其编码为二进制特征的要素,则应 创建五个`True`/`False`功能,每个级别的分类功能。 现在,地图很简单:
让我们继续以天气为例。 如果要映射包含当前天气并采用集合`[sunny, cloudy, snowy, rainy, foggy]`中的值并将其编码为二进制特征的要素,则应创建五个`True`/`False`功能,每个级别的分类功能。 现在,地图很简单:
```py
Categorical_feature = sunny binary_features = [1, 0, 0, 0, 0] Categorical_feature = cloudy binary_features = [0, 1, 0, 0, 0] Categorical_feature = snowy binary_features = [0, 0, 1, 0, 0] Categorical_feature = rainy binary_features = [0, 0, 0, 1, 0] Categorical_feature = foggy binary_features = [0, 0, 0, 0, 1]
......@@ -1041,7 +1041,7 @@ In: text_1 = 'we love data science'
前面的示例非常直观地结合了我们先前介绍的第一种和第二种方法。 在这种情况下,我们使用了`CountVectorizer`,但是这种方法在`TfidfVectorizer`中非常常见。 请注意,使用 N 元组时,特征数量呈指数爆炸式增长。
如果功能太多(词典可能太丰富, N 元组可能太多,或者计算机可能很有限),则可以使用一种技巧来降低问题的复杂性(但是您应该首先评估 权衡性能/权衡复杂性)。 通常会使用散列技巧,其中会散列多个单词(或 N 元组),并且它们的散列会发生冲突(这会产生一堆单词)。 存储桶是语义上不相关的单词集,但具有冲突的哈希。 使用`HashingVectorizer()`,如以下示例所示,您可以决定所需的单词存储桶数。 当然,结果矩阵反映了您的设置:
如果功能太多(词典可能太丰富, N 元组可能太多,或者计算机可能很有限),则可以使用一种技巧来降低问题的复杂性(但是您应该首先评估和权衡性能/复杂性)。 通常会使用散列技巧,其中会散列多个单词(或 N 元组),并且它们的散列会发生冲突(这会产生一堆单词)。 存储桶是语义上不相关的单词集,但具有冲突的哈希。 使用`HashingVectorizer()`,如以下示例所示,您可以决定所需的单词存储桶数。 当然,结果矩阵反映了您的设置:
```py
In: from sklearn.feature_extraction.text import HashingVectorizer
......@@ -1050,7 +1050,7 @@ In: from sklearn.feature_extraction.text import HashingVectorizer
word_hashed.shape Out: (1187, 1000)
```
请注意,您不能反转哈希过程(因为它是摘要操作)。 因此,在完成此转换之后,您将必须按原样处理散列特征。 散列具有许多优点:允许将一袋单词快速转换为特征向量(在这种情况下,散列桶是我们的特征),可以轻松地在特征之间容纳从未见过的单词,并通过使用不相关的单词来避免过度拟合 在同一要素中碰撞在一起
请注意,您不能反转哈希过程(因为它是摘要操作)。 因此,在完成此转换之后,您将必须按原样处理散列特征。 散列具有许多优点:允许将一袋单词快速转换为特征向量(在这种情况下,散列桶是我们的特征),可以轻松地在特征之间容纳从未见过的单词,并通过使不相关的单词在同一特征中碰撞在一起,来避免过拟合
# 用美丽的汤刮网
......
......@@ -981,7 +981,7 @@ Out: 0.984974958264
第一种方法是使用`X`数组拟合模型,以便正确预测`y`向量指示的 10 个类别之一。 此后,通过调用`.score()`方法并指定相同的预测变量(`X`数组),该方法根据相对于`y`向量给定的真实值的平均准确度来评估性能。 结果在预测正确的数字上约为 98.5% 的准确度。
该数字表示样本内性能,即学习算法的性能。 它纯粹是指示性的,尽管它代表了性能的上限(提供不同的示例,但平均性能始终会很差)。 实际上,每种学习算法都具有一定的记忆能力,可以记忆训练过的数据。 因此,样本内性能部分归因于该算法从数据中学习一些一般推断的能力,部分归因于其记忆能力。 在极端情况下,如果模型相对于可用数据而言训练过度或过于复杂,则存储的模式将优先于派生的规则,并且该算法将不适合正确地预测新的观测值(尽管对过去的观测值非常有用)。 这样的问题称为过拟合。 由于在机器学习中,我们无法分离这两种伴随的影响,为了正确估计我们的假设的预测性能,我们需要在没有记忆效应的一些新数据上对其进行测试。
该数字表示样本内性能,即学习算法的性能。 它纯粹是指示性的,尽管它代表了性能的上限(提供不同的示例,但平均性能始终会很差)。 实际上,每种学习算法都具有一定的记忆能力,可以记忆训练过的数据。 因此,样本内性能部分归因于该算法从数据中学习一些一般推断的能力,部分归因于其记忆能力。 在极端情况下,如果模型相对于可用数据而言训练过度或过于复杂,则存储的模式将优先于派生的规则,并且该算法将不适合正确地预测新的观测值(尽管对过去的观测值非常有用)。 这样的问题称为过拟合。 由于在机器学习中,我们无法分离这两种伴随的影响,为了正确估计我们的假设的预测性能,我们需要在没有记忆效应的一些新数据上对其进行测试。
记忆的发生是由于算法的复杂性。 复杂的算法拥有许多系数,可以在其中存储有关训练数据的信息。 不幸的是,由于预测过程变得随机,因此在预测未见实例时,记忆效应会导致估计的高方差。 三种解决方案是可能的:
......@@ -1011,7 +1011,7 @@ In: chosen_random_state = 1
实际上,我们甚至可以从测试集中获得有偏差的性能估计。 如果我们选择(在使用`random_state`进行各种试验后)可以确认我们假设的测试集,或者开始使用测试集作为参考以对学习过程做出决定(例如,选择符合特定测试样本的最佳假设)。
与仅评估训练数据的拟合度一样,对选定的测试集进行操作也可以确保最终的性能看起来不错。 但是,您建立的模型不会在不同的测试集上复制相同的性能(再次是过拟合问题)。
与仅评估训练数据的拟合度一样,对选定的测试集进行操作也可以确保最终的性能看起来不错。 但是,您建立的模型不会在不同的测试集上复制相同的性能(再次是过拟合问题)。
因此,当我们在将每个假设拟合到训练数据之后必须在多个假设之间进行选择(数据科学中的一个常见实验)时,我们需要一个可用于比较其性能的数据样本,并且它不能是测试集( 由于我们之前提到的原因)。
......@@ -1494,9 +1494,9 @@ James Bergstra 和 Yoshua Bengio 设计了随机搜索,以使深度学习中
# 功能选择
对于将要使用的机器学习算法,不相关且多余的功能可能会导致结果模型的可解释性不足,训练时间长,最重要的是过拟合和泛化性差。
对于将要使用的机器学习算法,不相关且多余的功能可能会导致结果模型的可解释性不足,训练时间长,最重要的是过拟合和泛化性差。
拟合与观察次数与数据集中可用变量的比率有关。 当变量与观测值相比有很多时,由于变量之间的相关性,您的学习算法将有更多的机会以某种局部优化或某些杂散噪声的拟合结果。
过拟合与观察次数与数据集中可用变量的比率有关。 当变量与观测值相比有很多时,由于变量之间的相关性,您的学习算法将有更多的机会以某种局部优化或某些杂散噪声的拟合结果。
除了降维(这需要您转换数据)之外,特征选择还可以解决上述问题。 通过选择最具预测性的变量集,可以简化高维结构。 也就是说,即使某些功能在独立级别上并不是很好的预测指标,它也会选择能够很好地协同工作的功能。
......@@ -1650,7 +1650,7 @@ classifier.score(X_test_s, y_test)) Out: Out-of-sample accuracy: 0.900
# 稳定性和基于 L1 的选择
尽管有效,但递归消除实际上是一种逐步算法,其选择基于单个求值序列。 修剪时,它会选择某些选项,可能会排除许多其他选项。 这是将特别具有挑战性和耗时的问题(例如在可能的集合中进行详尽搜索)减少为更易于管理的一个好方法。 无论如何,还有另一种解决问题的方法,就是联合使用所有手头的变量。 一些算法使用正则化来限制系数的权重,从而防止过拟合和最相关变量的选择而不会失去预测能力。 特别是,正则化 L1(套索)在创建变量系数的稀疏选择方面众所周知,因为它会根据设置的正则化强度将许多变量推到 0 值。
尽管有效,但递归消除实际上是一种逐步算法,其选择基于单个求值序列。 修剪时,它会选择某些选项,可能会排除许多其他选项。 这是将特别具有挑战性和耗时的问题(例如在可能的集合中进行详尽搜索)减少为更易于管理的一个好方法。 无论如何,还有另一种解决问题的方法,就是联合使用所有手头的变量。 一些算法使用正则化来限制系数的权重,从而防止过拟合和最相关变量的选择而不会失去预测能力。 特别是,正则化 L1(套索)在创建变量系数的稀疏选择方面众所周知,因为它会根据设置的正则化强度将许多变量推到 0 值。
一个示例将阐明逻辑回归分类器和我们用于递归消除的综合数据集的用法。
......
......@@ -447,7 +447,7 @@ In: import numpy as np
* `C`:惩罚值。 减小它会使余量更大,从而忽略了更多噪声,同时也使该模型更具通用性。 通常可以在`np.logspace(-3, 3, 7)`的范围内考虑最佳值。
* `kernel`:可以将 SVM 的非线性主力设置为`linear``poly``rbf``sigmoid`或自定义内核(供专家使用!)。 当然,最常用的是`rbf`
* `degree`:它与`kernel='poly'`一起使用,表示多项式展开的维数。 相反,它被其他内核忽略。 通常,将其值设置为 2 到 5 效果最佳。
* `gamma``'rbf'``'poly'``'sigmoid'`的系数。 高值倾向于以更好的方式拟合数据,但可能导致一些过拟合。 直观地,我们可以将伽马想象为单个示例对模型的影响。 较低的值使每个示例的影响都很大。 由于必须考虑许多点,因此 SVM 曲线倾向于采用受局部点影响较小的形状,其结果将是病态的轮廓曲线。 相反,较高的`gamma`值会使曲线更多地考虑点的局部排列方式。 许多小气泡会阐明结果,这些小气泡通常会表示局部点所产生的影响。 该超参数的建议网格搜索范围为`np.logspace(-3, 3, 7)`
* `gamma``'rbf'``'poly'``'sigmoid'`的系数。 高值倾向于以更好的方式拟合数据,但可能导致一些过拟合。 直观地,我们可以将伽马想象为单个示例对模型的影响。 较低的值使每个示例的影响都很大。 由于必须考虑许多点,因此 SVM 曲线倾向于采用受局部点影响较小的形状,其结果将是病态的轮廓曲线。 相反,较高的`gamma`值会使曲线更多地考虑点的局部排列方式。 许多小气泡会阐明结果,这些小气泡通常会表示局部点所产生的影响。 该超参数的建议网格搜索范围为`np.logspace(-3, 3, 7)`
* `nu`:对于使用`nuSVR``nuSVC`进行回归和分类,此参数将对没有可靠分类的训练点进行近似估计,即,错误分类的点和边界内或边界上的正确点。 它应该在`[0, 1]`的范围内,因为它是相对于您的训练集的比例。 最后,它以`C`的形式发挥作用,高比例扩大了边距。
* `epsilon`:此参数通过定义`epsilon`大范围来指定 SVR 将接受多少误差,在该范围内,与该点的真实值无关的惩罚。 建议的搜索范围是`np.insert(np.logspace(-4, 2, 7),0,[0])`
* `penalty``loss``dual`:对于`LinearSVC`,这些参数接受`('l1', 'squared_hinge', False), ('l2', 'hinge', True), ('l2', ' squared_hinge', True)``('l2', 'squared_hinge', False)`组合。 `('l2', 'hinge', True)`组合类似于`SVC(kernel = 'linear')`学习器。
......@@ -700,7 +700,7 @@ In: import numpy as np
* `max_depth`:它增加了方差和复杂性。
* `subsample`:使用 0.9 到 0.7 的值可以有效减少估计的方差。
* `learning_rate`:较小的值可以改善训练过程中的优化,尽管这将需要更多的估计量来收敛,因此需要更多的计算时间。
* `in_samples_leaf`:这可以减少由于噪声数据导致的方差,从而保留对极少数情况的过拟合。
* `in_samples_leaf`:这可以减少由于噪声数据导致的方差,从而保留对极少数情况的过拟合。
除了深度学习,梯度提升实际上是最先进的机器学习算法。 自从 Adaboost 和 Jerome Friedman 开发的以下梯度提升实现以来,出现了各种算法实现,最近的是 XGBoost,LightGBM 和 CatBoost。 在以下各段中,我们将探索这些新解决方案,并使用 Forest Covertype 数据在道路上对其进行测试。
......@@ -728,7 +728,7 @@ XGBoost 算法在 [Kaggle](http://www.kaggle.com) 和 KDD-cup 2015 等数据科
* `eta`:相当于 Scikit-learn 的 GTB 中的学习率。 它影响算法学习的速度,从而影响需要多少棵树。 较高的值有助于更好地融合学习过程,但代价是要花费更多的训练时间和更多的树木。
* `gamma`:这是树开发中的停止标准,因为它表示在树的叶节点上进行进一步分区所需的最小损失减少。 更高的价值使学习更加保守。
* `min_child_weight`:这些代表树的叶子节点上存在的最小权重(示例)。 较高的值可防止过拟合和树的复杂性。
* `min_child_weight`:这些代表树的叶子节点上存在的最小权重(示例)。 较高的值可防止过拟合和树的复杂性。
* `max_depth`:树中的交互数。
* `subsample`:训练数据中示例的一部分,将在每次迭代中使用。
* `colsample_bytree`:在每次迭代中使用的特征分数。
......@@ -743,7 +743,7 @@ In: from sklearn.datasets import fetch_covtype
加载数据后,我们首先通过设置目标(如`multi:softprob`来定义超参数,但是 XGBoost 为回归,分类,多类和排名提供了其他选择),然后设置了一些前述参数。
当拟合数据时,可以对算法给出进一步的指示。 在我们的案例中,我们将`eval_metric`设置为针对多类问题的准确性(`'merror'`),并提供了`eval_set`,这是 XGBoost 在训练过程中必须通过计算评估指标来监控的验证集。 如果训练在 25 个回合中没有提高评估指标(由`early_stopping_rounds`定义),则训练将在达到先前定义的估算器数量(`n_estimators`)之前停止。 这种方法称为“早期停止”,它源自神经网络训练,有效地避免了训练阶段的过拟合:
当拟合数据时,可以对算法给出进一步的指示。 在我们的案例中,我们将`eval_metric`设置为针对多类问题的准确性(`'merror'`),并提供了`eval_set`,这是 XGBoost 在训练过程中必须通过计算评估指标来监控的验证集。 如果训练在 25 个回合中没有提高评估指标(由`early_stopping_rounds`定义),则训练将在达到先前定义的估算器数量(`n_estimators`)之前停止。 这种方法称为“早期停止”,它源自神经网络训练,有效地避免了训练阶段的过拟合:
有关参数和评估指标的完整列表,请参见[这个页面](http://github.com/dmlc/xgboost/blob/master/doc/parameter.md)。 在这里,我们开始导入包,设置其参数并将其适合我们的问题:
......@@ -818,7 +818,7 @@ IO 参数定义如何加载(甚至由模型存储)数据:
* `min_data_in_leaf`:要创建的叶子的最小示例数。
* `bagging_fraction`:在每次迭代中随机使用的数据比例。
* `feature_fraction`:当增强为`rf`时,此参数指示要为分割随机考虑的全部特征的比例。
* `early_stopping_round`:固定此参数,如果您的模型在一定回合中没有改善,它将停止训练。 它有助于减少过拟合和培训时间。
* `early_stopping_round`:固定此参数,如果您的模型在一定回合中没有改善,它将停止训练。 它有助于减少过拟合和培训时间。
* `lambda_l1``lambda_l2`:正则化参数,范围为 0 到 1(最大值)。
* `min_gain_to_split`:此参数指示在树上创建拆分的最小增益。 通过不发展分裂对模型的贡献不大,它限制了树的复杂性。
* `max_cat_group`:在处理具有高基数(大量类别)的类别变量时,此参数通过聚合次要变量来限制变量可以具有的类别数目。 此参数的默认值为 64。
......@@ -831,7 +831,7 @@ IO 参数定义如何加载(甚至由模型存储)数据:
如果要通过误差度量获得更高的精度,则应改用较大的`max_bin`(这意味着在使用数字变量时精度更高),应使用较小的`learning_rate`和较大的`num_iterations`(这是必需的,因为算法会收敛),并使用较大的`num_leaves`(尽管可能会导致过拟合)。
在过拟合的情况下,您可以尝试设置`lambda_l1``lambda_l2``min_gain_to_split`并获得更多的正则化。 您也可以尝试`max_depth`避免生长过深的树木。
在过拟合的情况下,您可以尝试设置`lambda_l1``lambda_l2``min_gain_to_split`并获得更多的正则化。 您也可以尝试`max_depth`避免生长过深的树木。
在我们的示例中,我们承担与之前相同的任务,以对 Forest Covertype 数据集进行分类。 我们首先导入必要的软件包。
......@@ -849,7 +849,7 @@ In: train_data = lgb.Dataset(data=covertype_X, label=covertype_y)
val_data = lgb.Dataset(data=covertype_val_X, label=covertype_val_y)
```
最后,我们通过提供先前设置的参数,确定最大迭代次数为 2500,设置验证集,并要求误差大于 25 的迭代不能改善验证,要求提早停止训练,从而设置训练实例( 这将使我们避免由于太多的迭代而导致的过拟合,也就是说,增加了树的数量):
最后,我们通过提供先前设置的参数,确定最大迭代次数为 2500,设置验证集,并要求误差大于 25 的迭代不能改善验证,要求提早停止训练,从而设置训练实例( 这将使我们避免由于太多的迭代而导致的过拟合,也就是说,增加了树的数量):
```py
In: bst = lgb.train(params,
......@@ -900,7 +900,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)。 我们的建议是谨慎使用此技巧。
......@@ -1057,7 +1057,7 @@ In: import os
解决此问题的一种更可靠的方法是使用 Sigmoid归一化,将所有可能值范围限制在 0 到 1 之间。
通过次数可能会成为问题。 实际上,当您多次传递相同的示例时,可以帮助将预测系数收敛到最佳解决方案。 如果您通过太多相同的观察结果,该算法将趋于过拟合; 也就是说,它将过多地适应重复多次的数据。 一些算法(例如 SGD 系列)对您建议的要学习的示例的顺序也非常敏感。 因此,您必须设置其随机播放选项(`shuffle = True`)或在学习开始之前随机播放文件行,请记住,为提高效率,为学习建议的行顺序应该是随意的。
通过次数可能会成为问题。 实际上,当您多次传递相同的示例时,可以帮助将预测系数收敛到最佳解决方案。 如果您通过太多相同的观察结果,该算法将趋于过拟合; 也就是说,它将过多地适应重复多次的数据。 一些算法(例如 SGD 系列)对您建议的要学习的示例的顺序也非常敏感。 因此,您必须设置其随机播放选项(`shuffle = True`)或在学习开始之前随机播放文件行,请记住,为提高效率,为学习建议的行顺序应该是随意的。
验证是一个批量流,可以通过两种方式实现:
......@@ -1217,7 +1217,7 @@ In: New_text = ["A 2014 red Toyota Prius v Five with fewer than 14K" +
需要调整以使该算法最适合您的数据的关键参数如下:
* `n_iter`:数据上的迭代次数。 根据经验,通过次数越多,算法的优化效果越好。 但是,如果通过次数过多,则存在过度装配的较高风险。 根据经验,SGD 在看到`10 ** 6`个示例后趋于收敛到一个稳定的解。 根据您的示例,相应地设置迭代次数。
* `penalty`:您必须选择 l1,l2 或 Elasticnet,它们都是不同的正则化策略,以避免由于过度参数化而导致过拟合(使用过多不必要的参数导致的记忆远大于对模式的学习)。 简而言之,l1 倾向于将无用系数减小为零,l2 只是将其衰减,而 Elasticnet 是 l1 和 l2 策略的混合。
* `penalty`:您必须选择 l1,l2 或 Elasticnet,它们都是不同的正则化策略,以避免由于过度参数化而导致过拟合(使用过多不必要的参数导致的记忆远大于对模式的学习)。 简而言之,l1 倾向于将无用系数减小为零,l2 只是将其衰减,而 Elasticnet 是 l1 和 l2 策略的混合。
* `alpha`:这是正则项的乘数; `alpha`越高,正则化越多。 我们建议您通过执行`10 ** -7``10 ** -1`的网格搜索来找到最佳的`alpha`值。
* `l1_ratio`:l1 比率用于弹性网惩罚。 建议值或 0.15 通常会非常有效。
* `learning_rate`:这设置每个示例对系数的影响程度。 通常,对于分类器而言,它是最佳选择;对于回归而言,`invscaling`是最佳选择。 如果要使用`invscaling`进行分类,则必须设置`eta0``power_t (invscaling = eta0 / (t**power_t))`。 使用`invscaling`,您可以从较低的学习率开始,尽管它会降低得较慢,但学习率低于最佳率。
......@@ -1407,7 +1407,7 @@ Out: ['aber', 'alle', 'allem', 'allen', 'aller', 'alles', 'als', 'also',
# 完整的数据科学示例–文本分类
现在,这是一个完整的示例,可让您将每个文本放在正确的类别中。 我们将使用`20newsgroup`数据集,该数据集已在第 1 章,“第一步”中引入。 为了使事情更真实,并防止分类器过拟合数据,我们将删除电子邮件标头,页脚(例如签名)和引号。 另外,在这种情况下,目标是在两个相似的类别之间进行分类:`sci.med``sci.space`。 我们将使用准确性度量来评估分类:
现在,这是一个完整的示例,可让您将每个文本放在正确的类别中。 我们将使用`20newsgroup`数据集,该数据集已在第 1 章,“第一步”中引入。 为了使事情更真实,并防止分类器过拟合数据,我们将删除电子邮件标头,页脚(例如签名)和引号。 另外,在这种情况下,目标是在两个相似的类别之间进行分类:`sci.med``sci.space`。 我们将使用准确性度量来评估分类:
```py
In: import nltk
......
......@@ -450,7 +450,7 @@ In: from pandas.tools.plotting import parallel_coordinates
# 介绍 Seaborn
Seaborn 由 Michael Waskom 创建并托管在 [PyData 网站](http://seaborn.pydata.org/)上,是一个将底层 Matplotlib 与整个 pyData 堆栈包装在一起的库,允许集成图表 包含 NumPy 和 Pandas 的数据结构,以及 SciPy 和 StatModels 的统计例程。 借助内置主题以及专为揭示数据模式而设计的调色板,所有这些工作都特别注重美学。
Seaborn 由 Michael Waskom 创建并托管在 [PyData 网站](http://seaborn.pydata.org/)上,是一个将底层 Matplotlib 与整个 pyData 堆栈包装在一起的库,允许集成图表和来自 NumPy 和 Pandas 的数据结构,以及 SciPy 和 StatModels 的统计例程。 借助内置主题以及专为揭示数据模式而设计的调色板,所有这些工作都特别注重美学。
如果您当前尚未在系统上安装 Seaborn(例如,Anaconda 发行版默认提供它),则可以通过`pip``conda`轻松获得它(提醒您`conda`版本可能落后于直接从 PyPI(Python 包索引)获取的`pip`版本)。
......@@ -563,7 +563,7 @@ In: current_palette = sns.color_palette()
作为`hsl`的替代,您可以使用`husl`调色板,它对人眼更友好,如[这个页面](http://www.hsluv.org/)所述。
最后,您可以使用 Color Brewer 工具创建个性化的调色板,[该工具可以在网上找到](http://www.personal.psu.edu/cab38/ColorBrewer/ColorBrewer_intro.html)必需 在 Jupyter笔记本中的应用程序中。 在笔记本单元中,使用`choose_colorbrewer_palette`命令将显示一个交互式工具。 为了使一切正常工作,必须将`data_type`作为参数指定,这是一个字符串,该字符串说明与要表示的数据相关的调色板的性质:
最后,您可以使用 Color Brewer 工具创建个性化的调色板,[该工具可以在网上找到](http://www.personal.psu.edu/cab38/ColorBrewer/ColorBrewer_intro.html)在 Jupyter笔记本中的应用程序中是所需的。 在笔记本单元中,使用`choose_colorbrewer_palette`命令将显示一个交互式工具。 为了使一切正常工作,必须将`data_type`作为参数指定,这是一个字符串,该字符串说明与要表示的数据相关的调色板的性质:
* **顺序**:如果要表示连续性
* **发散**:用于表示反差
......@@ -854,7 +854,7 @@ In: from sklearn.learning_curve import validation_curve
正如在第 3 章,“数据管道”的结论中所讨论的那样,选择正确的变量可以通过减少噪声,估计方差和过多计算负担来改善学习过程 。 集成方法(例如,随机森林)可以为您提供与数据集中其他变量一起使用时变量所扮演角色的不同视图。
在这里,我们向您展示如何提取随机森林和极端树模型的重要性。 重要性的计算方式最初由 Breiman,Friedman 等人在《分类和回归树》一书中描述。 1984 年。这是一个真正的经典,为分类树奠定了坚实的基础。 在本书中,重要性用*基尼重要性**平均减少杂质*来描述,这是由于特定变量平均超过 集成中的所有树木。 换句话说,平均减少杂质是在该变量上分割的节点的总错误减少乘以路由到每个节点的样本数。 值得注意的是,根据这种重要性计算方法,减少错误不仅取决于误差度量-基尼或熵用于分类,而 MSE 用于回归,而且树顶的拆分也被认为更重要,因为它们涉及处理更多问题。 例子。
在这里,我们向您展示如何提取随机森林和极端树模型的重要性。 重要性的计算方式最初由 Breiman,Friedman 等人在《分类和回归树》一书中描述。 1984 年。这是一个真正的经典,为分类树奠定了坚实的基础。 在本书中,重要性用*基尼重要性**平均减少不纯度*来描述,这是由于在整个集成树上平均一个特定变量而导致的节点杂质的总减少量。 换句话说,平均减少不纯度是在该变量上分割的节点的总错误减少乘以路由到每个节点的样本数。 值得注意的是,根据这种重要性计算方法,减少错误不仅取决于误差度量-基尼或熵用于分类,而 MSE 用于回归,而且树顶的拆分也被认为更重要,因为它们涉及处理更多问题。 例子。
在几个步骤中,我们将学习如何获取此类信息并将其投影到清晰的可视化文件中:
......
......@@ -293,9 +293,9 @@ Out:
![](img/7e5bf2a2-dd9d-4f5a-a1ea-42a3818b90d4.png)
分类似乎已经很好了。 我们可以做得更好,避免过拟合吗? 是的,这是我们可以使用的:
分类似乎已经很好了。 我们可以做得更好,避免过拟合吗? 是的,这是我们可以使用的:
* **丢弃层**:这等效于正则化,并且可以防止过拟合。 基本上,在训练的每个步骤中,都会停用一部分单元,因此该层的输出不会过分依赖其中的一些单元。
* **丢弃层**:这等效于正则化,并且可以防止过拟合。 基本上,在训练的每个步骤中,都会停用一部分单元,因此该层的输出不会过分依赖其中的一些单元。
* **批量规范化层**:通过减去批次平均值并将其除以标准偏差,此 z 标准化层。 这对于更新数据很有用,并且在每个步骤都会放大/衰减信号。
* **最大池化**:这是一个非线性变换,用于通过对内核下的每个区域应用最大滤波器来对输入进行下采样。 用于选择最大功能,该功能在同一类中的位置可能略有不同。
......
......@@ -73,7 +73,7 @@ HDFS 的体系结构是主从结构。 如果主服务器(称为**名称节点
请求读取文件的客户端必须首先联系**名称节点**,它将返回一个表,其中包含块及其位置的有序列表(如**数据节点**中所示)。 此时,客户端应分别与**数据节点**联系,下载所有块并重建文件(通过将块附加在一起)。
要写入文件,客户端应首先联系**名称节点**,后者将首先决定如何处理请求,然后更新其记录并使用**数据节点**的有序列表回复客户端 写入文件每个块的位置。 客户端现在将根据**名称节点**答复中的报告,将块联系并上传到**数据节点**。 命名空间查询(例如,列出目录内容,创建文件夹等)由**名称节点**通过访问其元数据信息完全处理。
要写入文件,客户端应首先联系**名称节点**,后者将首先决定如何处理请求,然后更新其记录并使用文件每个块的写入位置的**数据节点**的有序列表回复客户端。 客户端现在将根据**名称节点**答复中的报告,将块联系并上传到**数据节点**。 命名空间查询(例如,列出目录内容,创建文件夹等)由**名称节点**通过访问其元数据信息完全处理。
此外,**名称节点**还负责正确处理**数据节点**故障(如果未接收到心跳数据包,则标记为死),并将其数据复制到其他节点。
......@@ -153,7 +153,7 @@ $> docker run -d -p 8888:8888 --name spark jupyter/pyspark-notebook start-notebo
用您选择的密码替换`mypassword`占位符。 请注意,Jupyter 笔记本电脑在启动时会要求输入该密码。
5. 运行上述命令后,Docker 将开始下载`pyspark-notebook image`(可能需要一段时间); 为它分配名称`spark`,将 Docker 映像上的`8888`端口复制到您计算机上的`8888`端口,然后执行`start-notebook.sh`脚本,并将笔记本密码设置为空(这样您就可以立即 仅使用前面提到的 IP 地址和`8888`端口访问 Jupyter
5. 运行上述命令后,Docker 将开始下载`pyspark-notebook image`(可能需要一段时间); 为它分配名称`spark`,将 Docker 映像上的`8888`端口复制到您计算机上的`8888`端口,然后执行`start-notebook.sh`脚本,并将笔记本密码设置为空(这样您就可以仅通过前面提到的 IP 地址和`8888`端口立即访问 Jupyter)
此时,您需要做的唯一另一件事就是在浏览器中输入以下内容:
......@@ -498,7 +498,7 @@ In: import urllib.request
2. 然后,我们实例化一个累加器变量(初始值为`0`),并在处理输入文件的每一行(带有映射)时为发现的每一个空行添加`1`。 同时,我们可以在每一行上进行一些处理; 例如,在下面的代码中,我们只为每一行返回`1`,就以此方式对文件中的所有行进行计数。
3. 在处理的最后,我们将获得两条信息:第一条是行数,来自对变换后的 RDD 的`count()`操作的结果,第二条是值中包含的空行数 累加器的属性。 请记住,在扫描数据集一次之后,这两个选项均可用:
3. 在处理的最后,我们将获得两条信息:第一条是行数,来自对变换后的 RDD 的`count()`操作的结果,第二条是累加器的属性中包含的空行数。 请记住,在扫描数据集一次之后,这两个选项均可用:
```py
In: accum = sc.accumulator(0)
......
......@@ -34,7 +34,7 @@
机器学习模型工作流程
与往常一样,工作流从数据开始。 在监督学习的情况下,数据将用作示例,因此必须正确标记正确答案。 然后处理输入数据以提取称为**特征**的内在属性,我们可以将其视为代表输入数据的数值。 随后,将这些特征输入构建模型的机器学习算法中。 在典型设置中,原始数据分为训练数据,测试数据和盲数据。 在模型构建阶段,将使用测试数据和盲数据来验证和优化模型,以确保其不会过度拟合训练数据。 当模型参数过于紧随训练数据时会发生过度拟合,从而在使用看不见的数据时导致错误。 当模型产生所需的精度水平时,然后将其部署到生产中,并根据主机应用程序的需要将其用于新数据。
与往常一样,工作流从数据开始。 在监督学习的情况下,数据将用作示例,因此必须正确标记正确答案。 然后处理输入数据以提取称为**特征**的内在属性,我们可以将其视为代表输入数据的数值。 随后,将这些特征输入构建模型的机器学习算法中。 在典型设置中,原始数据分为训练数据,测试数据和盲数据。 在模型构建阶段,将使用测试数据和盲数据来验证和优化模型,以确保其不会过拟合训练数据。 当模型参数过于紧随训练数据时会发生过拟合,从而在使用看不见的数据时导致错误。 当模型产生所需的精度水平时,然后将其部署到生产中,并根据主机应用程序的需要将其用于新数据。
在本节中,我们将通过简化的数据流水线工作流程对机器学习进行非常高级的介绍,仅足以直观地说明如何构建和部署模型。 再一次,如果您是初学者,我强烈推荐在 Coursera 上使用 Andrew Ng 的《机器学习》课程(我仍然会不时地复习)。 在下一节中,我们将介绍称为深度学习的机器学习分支,我们将使用它来构建图像识别样本应用程序。
......
......@@ -1426,7 +1426,7 @@ max 5.023380e+00
dtype: float64
```
平均残留误差为![Build an ARIMA model for the MSFT stock time series](img/00201.jpeg),非常接近零,因此表明该模型可能过拟合了训练数据。
平均残留误差为![Build an ARIMA model for the MSFT stock time series](img/00201.jpeg),非常接近零,因此表明该模型可能过拟合了训练数据。
现在我们有了一个模型,让我们尝试对其进行诊断。 我们定义了一种称为`plot_predict`的方法,该方法将用作模型,一系列日期和一个数字,这些数字指示我们要追溯的距离。 然后,我们调用 ARIMA `plot_predict()`方法来创建包含预测值和观察值的图表。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册