提交 e5799f0c 编写于 作者: W wizardforcel

2020-12-23 23:14:08

上级 118c1e3c
......@@ -39,9 +39,9 @@ Python 是一种编程语言,可提供数据科学领域的各种功能。 在
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
* Windows 的 WinRAR / 7-Zip
* Mac 版 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
* Windows 的 WinRAR/7-Zip
* Mac 版 Zipeg/iZip/UnRarX
* 适用于 Linux 的 7-Zip/PeaZip
本书的代码包也托管在 [GitHub](https://github.com/PacktPublishing) 上。 如果代码有更新,它将在现有的 GitHub 存储库中进行更新。
......
......@@ -49,9 +49,9 @@
套袋过程涉及以下步骤:
1. 我们选择要使用的估计量或单个模型的数量。 让我们将其视为参数 B
2. 我们使用训练集中的自举抽样从 B 抽取样本数据集并进行替换。
3. 对于这些训练数据集中的每一个,我们将机器学习模型拟合到每个引导样本中。 这样,我们获得了 B 参数的单独预测变量。
1. 我们选择要使用的估计量或单个模型的数量。 让我们将其视为参数`B`
2. 我们使用训练集中的自举抽样从`B`抽取样本数据集并进行替换。
3. 对于这些训练数据集中的每一个,我们将机器学习模型拟合到每个引导样本中。 这样,我们获得了`B`参数的单独预测变量。
4. 我们通过汇总所有单个预测来获得整体预测。
在回归问题中,获得总体预测的最常见方法是找到所有单个预测的平均值。
......@@ -170,7 +170,7 @@ import pandas as pd
![](img/12d93d64-a55f-4309-b819-93c9523166cf.png)
现在,当我们比较所有这些模型的结果时,我们可以看到随机森林模型是最成功的。 套袋模型和 KNN 模型分别排在第二和第三。 这就是为什么我们将 KNN 模型与 bagging 模型一起使用的原因。
现在,当我们比较所有这些模型的结果时,我们可以看到随机森林模型是最成功的。 套袋模型和 KNN 模型分别排在第二和第三。 这就是为什么我们将 KNN 模型与装袋模型一起使用的原因。
以下屏幕截图显示了在测试数据集时用于在预测价格和观察到的价格之间生成图形表示的算法,还显示了随机森林模型的性能:
......@@ -219,7 +219,7 @@ import pandas as pd
![](img/fe6dbac4-e195-481e-8831-add56f69a0de.png)
让我们在`grad _school``university``high_school`中产生用于教育的虚拟功能。 不用[性别]一词,使用`male`虚拟功能,而不是使用婚姻,让我们使用`married`功能。 当此人结婚时,此功能的值为 1,否则为 0。 对于`pay_1`功能,我们将做一些简化过程。 如果我们在此处看到一个正数,则表示该客户在`i`个月内延迟付款。 这表示`ID`为 1 的客户将付款延迟了前两个月。 我们可以看到,三个月前,他/她的付款没有延迟。 这是数据集的样子:
让我们在`grad _school``university``high_school`中产生用于教育的虚拟功能。 不用`sex`一词,使用`male`虚拟功能,而不是使用婚姻,让我们使用`married`功能。 当此人结婚时,此功能的值为 1,否则为 0。 对于`pay_1`功能,我们将做一些简化过程。 如果我们在此处看到一个正数,则表示该客户在`i`个月内延迟付款。 这表示`ID`为 1 的客户将付款延迟了前两个月。 我们可以看到,三个月前,他/她的付款没有延迟。 这是数据集的样子:
![](img/f4ab3d2e-f4b8-4deb-a55d-80d918758c2d.png)
......@@ -265,7 +265,7 @@ def CMatrix(CM, labels=['pay', 'default']):
# 套袋模型
使用集成学习技术中的方法训练装袋模型涉及使用 Logistic 回归方法导入装袋分类器。 为此,我们将拟合其中的 10 个逻辑回归模型,然后使用装袋将 10 个单独的预测合并为一个预测。 之后,我们将其保存到指标数据帧中。
使用集成学习技术中的方法训练装袋模型涉及使用逻辑回归方法导入装袋分类器。 为此,我们将拟合其中的 10 个逻辑回归模型,然后使用装袋将 10 个单独的预测合并为一个预测。 之后,我们将其保存到指标数据帧中。
以下屏幕截图显示了代码和混淆矩阵作为输出:
......@@ -335,4 +335,4 @@ def CMatrix(CM, labels=['pay', 'default']):
在本章中,我们介绍了不同的集成方法,例如引导程序采样,装袋,随机森林和增强方法,并通过一些示例说明了它们的工作原理。 然后,我们将它们用于回归和分类。 对于回归,我们以菱形数据集为例,还训练了一些 KNN 和其他回归模型。 后来,对它们的性能进行了比较。 为了进行分类,我们以信用卡数据集为例。 同样,我们训练了所有回归模型。 我们比较了它们的性能,发现随机森林模型的性能最佳。
在下一章中,我们将研究 k 倍交叉验证和参数调整。 我们将比较具有 K 折交叉验证的不同集成学习模型,然后,我们将使用 K 折交叉验证进行超参数调优。
\ No newline at end of file
在下一章中,我们将研究 K 折交叉验证和参数调整。 我们将比较具有 K 折交叉验证的不同集成学习模型,然后,我们将使用 K 折交叉验证进行超参数调优。
\ No newline at end of file
......@@ -10,7 +10,7 @@
* 保持交叉验证
* K 折交叉验证
* 将模型与 k 倍交叉验证进行比较
* 将模型与 K 折交叉验证进行比较
* 超参数调优简介
# 保持交叉验证
......@@ -23,7 +23,7 @@
# K 折交叉验证
在 k 折交叉验证中,我们基本上会进行多次交叉验证。 因此,在 k 倍交叉验证中,我们将数据集划分为`k`个相等大小的样本。 在许多`k`子样本中,保留了一个子样本作为用于测试模型的验证数据,其余`k-1`子样本用作训练数据。 然后,此交叉验证过程重复`k`次,每个`k`子样本中的每一个仅被使用一次作为验证数据。 然后可以将`k`结果平均,以产生单个估计。
在 k 折交叉验证中,我们基本上会进行多次交叉验证。 因此,在 K 折交叉验证中,我们将数据集划分为`k`个相等大小的样本。 在许多`k`子样本中,保留了一个子样本作为用于测试模型的验证数据,其余`k-1`子样本用作训练数据。 然后,此交叉验证过程重复`k`次,每个`k`子样本中的每一个仅被使用一次作为验证数据。 然后可以将`k`结果平均,以产生单个估计。
以下屏幕截图显示了 5 倍交叉验证的直观示例(`k = 5`):
......@@ -37,7 +37,7 @@
2. 我们将第二部分用于测试,其余部分用于培训,然后使用它来获得评估指标的第二估计。
3. 我们将第三部分用于测试,将其余部分用于培训,依此类推。 这样,我们获得了评估指标的五种估计。
k 倍交叉验证中,观察到评估矩阵的`k`估计后,取其平均值。 这将使我们可以更好地估计模型的性能。 因此,我们可以通过 k 倍交叉验证获得`n`个估计数,而不是仅对这一评估指标进行一次估计,然后取平均值,以获得对性能的更好估计。 该模型。
K 折交叉验证中,观察到评估矩阵的`k`估计后,取其平均值。 这将使我们可以更好地估计模型的性能。 因此,我们可以通过 K 折交叉验证获得`n`个估计数,而不是仅对这一评估指标进行一次估计,然后取平均值,以获得对性能的更好估计。 该模型。
如此处所示,k 折交叉验证方法的优势在于它不仅可以用于模型评估,而且还可以用于超参数调优。
......@@ -45,17 +45,17 @@
以下是 k 折交叉验证的变体:
* **重复交叉验证**:在重复交叉验证中,我们多次执行 k 倍交叉验证。 因此,如果我们希望对评估指标进行 30 次估算,则可以进行 6 次 5 倍交叉验证。 因此,我们将获得 30 个评估指标的估算值。
* **重复交叉验证**:在重复交叉验证中,我们多次执行 K 折交叉验证。 因此,如果我们希望对评估指标进行 30 次估算,则可以进行 6 次 5 倍交叉验证。 因此,我们将获得 30 个评估指标的估算值。
* **留一法(LOO)交叉验证**:在这种方法中,我们将除一点之外的整个数据集用于训练。 我们将这一点用于评估,然后对数据集中的每个数据点重复此过程。
如果我们有数百万个点,则此验证方法的计算量将非常昂贵。 在这种情况下,我们使用重复的 k 倍交叉验证,因为这种验证方法将为我们提供相对较好的结果。
如果我们有数百万个点,则此验证方法的计算量将非常昂贵。 在这种情况下,我们使用重复的 K 折交叉验证,因为这种验证方法将为我们提供相对较好的结果。
# 实施 k 折交叉验证
让我们以`diamond`数据集为例来了解 k 倍交叉验证的实现。
让我们以`diamond`数据集为例来了解 K 折交叉验证的实现。
为了在`scikit-learn`中执行 k 倍交叉验证,我们首先必须导入将要使用的库。 以下代码段显示了用于导入库的代码:
为了在`scikit-learn`中执行 K 折交叉验证,我们首先必须导入将要使用的库。 以下代码段显示了用于导入库的代码:
```py
import numpy as np
......@@ -98,7 +98,7 @@ from sklearn.ensemble import RandomForestRegressor
RF = RandomForestRegressor(n_estimators=50, max_depth=16, random_state=123, n_jobs=-1)
```
为了执行 k 倍交叉验证,我们从`scikit-learn`中的`model_selection`模块导入`cross_validate`函数。 下面显示了用于导入`cross_validate`函数的代码:
为了执行 K 折交叉验证,我们从`scikit-learn`中的`model_selection`模块导入`cross_validate`函数。 下面显示了用于导入`cross_validate`函数的代码:
```py
# this will work from sklearn version 0.19, if you get an error
......@@ -137,9 +137,9 @@ print("Mean test R-squared:", scores['test_r2'].mean())
因此,在平均上,我们看到测试 MSE 的平均值是我们在此处拥有的值以及其他指标的平均值,即 R 平方评估指标。
# 将模型与 k 倍交叉验证进行比较
# 将模型与 K 折交叉验证进行比较
由于 k 折交叉验证方法被证明是一种更好的方法,因此它更适合于比较模型。 其背后的原因是 k 倍交叉验证对评估指标给出了很多估计,并且对这些估计求平均后,我们可以更好地评估模型性能。
由于 k 折交叉验证方法被证明是一种更好的方法,因此它更适合于比较模型。 其背后的原因是 K 折交叉验证对评估指标给出了很多估计,并且对这些估计求平均后,我们可以更好地评估模型性能。
下面显示了用于导入库以比较模型的代码:
......@@ -236,7 +236,7 @@ boosting_test_mse = cross_validate(estimator=boosting,X=X,y=y,
![](img/e98e483d-748c-4067-ab99-27a387d6d1c6.png)
前面的屏幕截图显示,在这种情况下,最多的模型是 KNN 模型,其次是 boosting 模型,而随机森林模型的变化最小。 因此,随机森林模型是这三种模型中最好的。 即使对于此数据集,随机森林模型也表现最佳。
前面的屏幕截图显示,在这种情况下,最多的模型是 KNN 模型,其次是提升模型,而随机森林模型的变化最小。 因此,随机森林模型是这三种模型中最好的。 即使对于此数据集,随机森林模型也表现最佳。
# 超参数调优简介
......@@ -246,9 +246,9 @@ boosting_test_mse = cross_validate(estimator=boosting,X=X,y=y,
# 穷举网格搜索
执行超参数调优的最重要且最常用的方法之一是**穷举网格搜索**。 这是一种蛮力方法,因为它尝试从参数值网格中尝试所有超参数组合。 然后,对于超参数的每种组合,使用 k 倍交叉验证和任何其他指定的指标来评估模型。 因此,为我们提供最佳度量的组合是我们将在`scikit-learn`中使用的对象返回的组合。
执行超参数调优的最重要且最常用的方法之一是**穷举网格搜索**。 这是一种蛮力方法,因为它尝试从参数值网格中尝试所有超参数组合。 然后,对于超参数的每种组合,使用 K 折交叉验证和任何其他指定的指标来评估模型。 因此,为我们提供最佳度量的组合是我们将在`scikit-learn`中使用的对象返回的组合。
让我们以超参数网格为例。 在这里,我们为`n_estimators`超参数尝试三个不同的值,例如 10、30 和 50。 我们将为`max_features`尝试两个选项,例如 auto 和 square root,并为`max_depth`分配四个值-5、10、20 和 30。 因此,在这种情况下,我们将有 24 个超参数组合。 这 24 个将被评估。 在这种情况下,对于这 24 个组合中的每个组合,我们使用十倍交叉验证,计算机将训练和评估 240 个模型。 网格搜索面临的最大缺点是维数的诅咒,这将在以后的章节中介绍。 维数的诅咒从本质上讲意味着,您评估模型的次数将随着参数的数量呈指数增长。
让我们以超参数网格为例。 在这里,我们为`n_estimators`超参数尝试三个不同的值,例如 10、30 和 50。 我们将为`max_features`尝试两个选项,例如`auto`和平方根,并为`max_depth`分配四个值 -5、10、20 和 30。 因此,在这种情况下,我们将有 24 个超参数组合。 这 24 个将被评估。 在这种情况下,对于这 24 个组合中的每个组合,我们使用十倍交叉验证,计算机将训练和评估 240 个模型。 网格搜索面临的最大缺点是维数的诅咒,这将在以后的章节中介绍。 维数的诅咒从本质上讲意味着,您评估模型的次数将随着参数的数量呈指数增长。
如果未测试某些超参数组合,则可以将不同的网格传递给`GridSearchCV`对象。 在这里,可以以字典列表的形式传递不同的网格,因为每个网格都是`scikit-learn`中的字典。
......@@ -295,7 +295,7 @@ y = diamonds[target_name]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=123)
```
执行并创建用于建模的对象后,我们执行`train_test_split`功能。 在前面的代码块中,我们将设置 0.1(10% )的数据进行测试,因此在调整超参数后,数据集的这一部分将用于模型评估。
执行并创建用于建模的对象后,我们执行`train_test_split`功能。 在前面的代码块中,我们将设置 0.1(10%)的数据进行测试,因此在调整超参数后,数据集的这一部分将用于模型评估。
我们将使用以下参数调整`RandomForestRegressor`模型:
......@@ -342,7 +342,7 @@ from sklearn.model_selection import GridSearchCV
![](img/99ba11ae-8c28-44e3-bebe-433858fbe813.png)
在这里,我们看到可以给出`best_params_`的组合是`max_depth`的值为`20``max _features`的值为 auto `n_estimators`的值为`100`。 因此,这是参数的最佳组合。
在这里,我们看到可以给出`best_params_`的组合是`max_depth`的值为`20``max _features`的值为`auto``n_estimators`的值为`100`。 因此,这是参数的最佳组合。
我们还可以获取`best_estimator_`对象,这是超参数的完整列表。 以下屏幕截图显示了用于获取`best_estimator_`的代码,并显示了结果:
......@@ -378,7 +378,7 @@ RF_tunned_test_mse = mean_squared_error(y_pred=RF_classifier.predict(X_test), y_
# 概要
在本章中,我们学习了交叉验证以及各种交叉验证方法,包括保持交叉验证和 k 折交叉验证。 我们知道 k 折交叉验证不过是多次进行保持交叉验证而已。 我们使用`diamond`数据集实施了 k 折交叉验证。 我们还使用 k 倍交叉验证比较了不同的模型,并找到了性能最佳的模型,即随机森林模型。
在本章中,我们学习了交叉验证以及各种交叉验证方法,包括保持交叉验证和 k 折交叉验证。 我们知道 k 折交叉验证不过是多次进行保持交叉验证而已。 我们使用`diamond`数据集实施了 k 折交叉验证。 我们还使用 K 折交叉验证比较了不同的模型,并找到了性能最佳的模型,即随机森林模型。
然后,我们讨论了超参数调优。 我们遇到了详尽的网格搜索方法,该方法用于执行超参数调优。 我们再次使用`diamond`数据集实施了超参数调优。 我们还比较了调整后的模型和未调整的模型,发现调整后的参数使模型的性能优于未调整的模型。
......
......@@ -25,7 +25,7 @@
![](img/5fc96b69-e4fa-497c-9c96-25fc7005239d.png)
您可以删除超过 x% 的样本中所有为 0 或 1 的虚拟特征,或者可以为这些特征的方差建立最小阈值。 现在,可以使用前面的公式获得这些特征的方差,其中`p`是您的虚拟特征中`1`的数量或比例。 我们将在 Jupyter 笔记本中查看其工作原理。
您可以删除超过`x%`的样本中所有为 0 或 1 的虚拟特征,或者可以为这些特征的方差建立最小阈值。 现在,可以使用前面的公式获得这些特征的方差,其中`p`是您的虚拟特征中`1`的数量或比例。 我们将在 Jupyter 笔记本中查看其工作原理。
# 统计确定重要特征
......@@ -250,7 +250,7 @@ RFE 是我们将使用`RandomForestClassifier`模型的第三种技术,请记
这些是一些功能工程技术以及示例,您可以在数据集中执行这些示例,但是您可能希望从现有转换中创建其他转换或变量。
现在,让我们看一下 Diamonds 数据集中的几个示例。 我们需要通过执行一些命令来导入 Diamonds 数据集,如以下屏幕截图所示:
现在,让我们看一下钻石数据集中的几个示例。 我们需要通过执行一些命令来导入钻石数据集,如以下屏幕截图所示:
![](img/1a5b38e2-d2e8-4ed0-b02e-add5805bddac.png)
......
......@@ -110,7 +110,7 @@
* **权重初始化策略**:必须使用一些值来初始化网络中每个感知器的权重,并且优化算法将逐步更改这些值以最大程度地减少损失。 您可以通过多种方式初始化这些值。 您可以用全零初始化。 多年来,研究人员习惯于使用随机正态分布进行初始化,但近年来,研究人员提出了更好的选择,包括 Xavier 初始化和 He 初始化。
* **正则化策略**:这是一项可选功能,但强烈建议您使用该功能,因为深度学习模型由于计算出的参数数量过多,往往会过拟合数据。 您可以使用许多选择,包括 L1 正则化,L2 正则化和丢弃正则化策略。 在本书中,我们不会在示例中使用正则化,但请记住,如果您要构建真正有效的深度学习模型,则很有可能需要正则化策略。
* **训练策略**:训练策略是指将数据呈现给训练算法的方式。 这不是模型本身的一部分,但是会影响模型的结果和性能。 在谈论训练深度学习模型时,您会听到“ epoch”一词。 一个时期是所有训练实例通过网络的第一步。 在这些深度学习模型中,您将不得不多次将数据呈现给网络,以便网络可以为模型学习最佳参数。 这里还有另一个概念:批量大小。 这是同时显示给训练算法的元素数量。 因此,在深度学习模型的情况下,我们不向模型提供整个训练数据集。 我们要做的是呈现数据集的批次,并且在每批次中,我们仅发送几个示例,也许是 100 或 50,这就是我们训练深度学习模型的方式。 现在,您可以使用时期和批量大小来计算模型中的迭代次数,这就是训练步骤数,这是优化算法对模型权重进行调整的次数。 因此,例如,如果您有 1,000 个训练示例,并且将使用的批量大小为 100,则将需要 10 次迭代才能完成一个周期。 您可以使用以下公式获得迭代总数:
* **训练策略**:训练策略是指将数据呈现给训练算法的方式。 这不是模型本身的一部分,但是会影响模型的结果和性能。 在谈论训练深度学习模型时,您会听到“周期”一词。 一个时期是所有训练实例通过网络的第一步。 在这些深度学习模型中,您将不得不多次将数据呈现给网络,以便网络可以为模型学习最佳参数。 这里还有另一个概念:批量大小。 这是同时显示给训练算法的元素数量。 因此,在深度学习模型的情况下,我们不向模型提供整个训练数据集。 我们要做的是呈现数据集的批次,并且在每批次中,我们仅发送几个示例,也许是 100 或 50,这就是我们训练深度学习模型的方式。 现在,您可以使用时期和批量大小来计算模型中的迭代次数,这就是训练步骤数,这是优化算法对模型权重进行调整的次数。 因此,例如,如果您有 1,000 个训练示例,并且将使用的批量大小为 100,则将需要 10 次迭代才能完成一个周期。 您可以使用以下公式获得迭代总数:
![](img/c5dca712-14af-4483-8080-112349aedbb5.png)
......
......@@ -16,11 +16,11 @@ TensorFlow 是 **Google Brain Team** 开发的开源库。 它用于大型机器
# MNIST 数据集简介
MNIST 代表**国家混合标准技术研究院**,它已经产生了一个手写的数字数据集。 这是机器学习中研究最多的数据集之一,用于对手写数字进行分类。 由于其庞大的规模,该数据集有助于进行预测分析,从而允许深度学习有效地发挥其魔力。 该数据集包含 60,000 个训练图像和 10,000 个测试图像,格式为 28 x 28 像素的单色图像。 以下屏幕截图显示了此数据集中包含的图像:
MNIST 代表**国家混合标准技术研究院**,它已经产生了一个手写的数字数据集。 这是机器学习中研究最多的数据集之一,用于对手写数字进行分类。 由于其庞大的规模,该数据集有助于进行预测分析,从而允许深度学习有效地发挥其魔力。 该数据集包含 60,000 个训练图像和 10,000 个测试图像,格式为`28 x 28`像素的单色图像。 以下屏幕截图显示了此数据集中包含的图像:
![](img/29266a1b-4e37-493c-b841-555f004034c3.png)
在前面的屏幕截图中,我们可以看到,对于每个手写数字,都有一个对应的 true 标签; 因此,我们可以使用该数据集构建分类模型。 因此,我们可以使用图像将每个数字分类为从 0 到 9 的 10 个数字之一。
在前面的屏幕截图中,我们可以看到,对于每个手写数字,都有一个对应的真实标签; 因此,我们可以使用该数据集构建分类模型。 因此,我们可以使用图像将每个数字分类为从 0 到 9 的 10 个数字之一。
# 使用 MNIST 数据集构建分类模型
......@@ -258,7 +258,7 @@ y = tf.placeholder(y_train.dtype)
![](img/e9121538-21c3-43f6-8fe0-59ecaa8da16e.png)
在最后一次测试的 MSE(epoch 40)中,我们获得了培训和测试的 MSE 的最终价值。
在最后一次测试的 MSE(周期 40)中,我们获得了培训和测试的 MSE 的最终价值。
我们从网络获得了实际的预测,并且值相对接近。 在这里,我们可以看到预测价格。 对于廉价钻石,该网络产生的价值相对接近。 对于非常昂贵的钻石,网络产生了很高的价值。 而且,预测值与观察值非常接近。 以下屏幕截图显示了我们从网络获得的实际值和预测值:
......@@ -278,7 +278,7 @@ y = tf.placeholder(y_train.dtype)
![](img/1e4604f6-28a4-4da0-9faa-de706a4da045.png)
上面的屏幕截图显示,在`0`处,我们没有拐角。 对于 ReLU 函数,我们有一个角落。 在此函数中,我们将 ELU 函数缓慢地移至负 alpha 参数,而不是将单个值移至`0`
上面的屏幕截图显示,在`0`处,我们没有拐角。 对于 ReLU 函数,我们有一个角落。 在此函数中,我们将 ELU 函数缓慢地移至负`alpha`参数,而不是将单个值移至`0`
# DNN 分类
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册