提交 08f7f1c3 编写于 作者: W wizardforcel

2020-08-04 10:03:30

上级 f74687eb
......@@ -254,7 +254,7 @@ l2_y_vals = tf.square(target - x_vals)
l2_y_out = sess.run(l2_y_vals)
```
> TensorFlow 具有 L2 范数的内置形式,称为`nn.l2_loss()`。这个函数实际上是 L2 规范的一半。换句话说,它与前一个相同,但除以 2。
> TensorFlow 具有 L2 范数的内置形式,称为`nn.l2_loss()`。这个函数实际上是 L2 范数的一半。换句话说,它与前一个相同,但除以 2。
1. L1 范数损失也称为绝对损失函数。我们不是平衡差异,而是取绝对值。 L1 范数对于异常值比 L2 范数更好,因为对于较大的值,它不是那么陡峭。需要注意的一个问题是 L1 范数在目标处不平滑,这可能导致算法收敛不好。它看起来如下:
......
......@@ -6,7 +6,7 @@
* 实现分解方法
* 学习 TensorFlow 回归方式
* 理解线性回归中的损失函数
* 实现 deming 回归
* 实现戴明回归
* 实现套索和岭回归
* 实现弹性网络回归
* 实现逻辑回归
......@@ -15,7 +15,7 @@
线性回归可能是统计学,机器学习和一般科学中最重要的算法之一。它是最广泛使用的算法之一,了解如何实现它及其各种风格非常重要。线性回归优于许多其他算法的优点之一是它是非常可解释的。我们最终得到一个数字,用于直接表示该特征如何影响目标或因变量的每个特征。在本章中,我们将介绍线性回归是如何经典实现的,然后继续讨论如何在 TensorFlow 范例中最好地实现它。
> 请记住,所有代码都可以在 [Github](https://github.com/nfmcclure/tensorflow_cookbook) 以及 [ Packt 仓库](https://github.com/PacktPublishing/TensorFlow-Machine-Learning-Cookbook-Second-Edition)获得。
> 请记住,所有代码都可以在 [Github](https://github.com/nfmcclure/tensorflow_cookbook) 以及 [Packt 仓库](https://github.com/PacktPublishing/TensorFlow-Machine-Learning-Cookbook-Second-Edition)获得。
# 使用矩阵逆方法
......@@ -44,7 +44,7 @@ x_vals = np.linspace(0, 10, 100)
y_vals = x_vals + np.random.normal(0, 1, 100)
```
1. 接下来,我们创建要在逆方法中使用的矩阵。我们首先创建`A`矩阵,它将是`x`数据列和 1s 列。然后,我们从`y`数据创建`b`矩阵。使用以下代码:
1. 接下来,我们创建要在逆方法中使用的矩阵。我们首先创建`A`矩阵,它将是`x`数据列和全 1 的列。然后,我们从`y`数据创建`b`矩阵。使用以下代码:
```py
x_vals_column = np.transpose(np.matrix(x_vals))
......@@ -185,7 +185,7 @@ plt.show()
## 准备
在这个秘籍中,我们将遍历批量数据点并让 TensorFlow 更新斜率和`y`截距。我们将使用内置于 scikit-learn 库中的 iris 数据集,而不是生成的数据。具体来说,我们将通过数据点找到最佳线,其中`x`值是花瓣宽度,`y`值是萼片长度。我们选择了这两个,因为它们之间似乎存在线性关系,我们将在最后的绘图中看到。我们还将在下一节中详细讨论不同损失函数的影响,但对于这个秘籍,我们将使用 L2 损失函数。
在这个秘籍中,我们将遍历批量数据点并让 TensorFlow 更新斜率和`y`截距。我们将使用内置于 scikit-learn 库中的鸢尾花数据集,而不是生成的数据。具体来说,我们将通过数据点找到最佳线,其中`x`值是花瓣宽度,`y`值是萼片长度。我们选择了这两个,因为它们之间似乎存在线性关系,我们将在最后的绘图中看到。我们还将在下一节中详细讨论不同损失函数的影响,但对于这个秘籍,我们将使用 L2 损失函数。
## 操作步骤
......@@ -387,29 +387,29 @@ plt.show()
## 更多
为了理解正在发生的事情,我们应该看看大学习率和小学习率如何影响 L1 规范和 L2 规范。为了使这个可视化,我们查看两个规范的学习步骤的一维表示,如下所示:
为了理解正在发生的事情,我们应该看看大学习率和小学习率如何影响 L1 范数和 L2 范数。为了使这个可视化,我们查看两个规范的学习步骤的一维表示,如下所示:
![](img/f15420de-a851-4e7f-8b87-434e1eba5e2d.png)
图 7:学习率越来越高的 L1 和 L2 规范会发生什么
图 7:学习率越来越高的 L1 和 L2 范数会发生什么
# 实现 deming 回归
# 实现戴明回归
在这个秘籍中,我们将实现 deming 回归,这意味着我们需要一种不同的方法来测量模型线和数据点之间的距离。
在这个秘籍中,我们将实现戴明回归,这意味着我们需要一种不同的方法来测量模型线和数据点之间的距离。
> 戴明回归有几个名字。它也称为总回归,正交距离回归(ODR)和最短距离回归。
## 准备
如果最小二乘线性回归最小化到线的垂直距离,则 deming 回归最小化到线的总距离。这种类型的回归可以最小化`y``x`值的误差。
如果最小二乘线性回归最小化到线的垂直距离,则戴明回归最小化到线的总距离。这种类型的回归可以最小化`y``x`值的误差。
请参阅下图进行比较:
![](img/7b0c20a1-43c3-4a07-9785-2f7a5706ad6b.png)
图 8:常规线性回归和 deming 回归之间的差异;左边的线性回归最小化了到线的垂直距离,右边的变形回归最小化了到线的总距离
图 8:常规线性回归和戴明回归之间的差异;左边的线性回归最小化了到线的垂直距离,右边的变形回归最小化了到线的总距离
要实现 deming 回归,我们必须修改损失函数。常规线性回归中的损失函数使垂直距离最小化。在这里,我们希望最小化总距离。给定线的斜率和截距,到点的垂直距离是已知的几何公式​​。我们只需要替换此公式并告诉 TensorFlow 将其最小化。
要实现戴明回归,我们必须修改损失函数。常规线性回归中的损失函数使垂直距离最小化。在这里,我们希望最小化总距离。给定线的斜率和截距,到点的垂直距离是已知的几何公式​​。我们只需要替换此公式并告诉 TensorFlow 将其最小化。
## 操作步骤
......@@ -486,11 +486,11 @@ plt.show()
![](img/e53cec07-65ac-4af7-8a26-f9d5a1c27642.png)
图 9:对鸢尾数据集进行 deming 回归的解决方案
图 9:对鸢尾数据集进行戴明回归的解决方案
## 工作原理
deming 回归的方法几乎与常规线性回归相同。关键的区别在于我们如何衡量预测和数据点之间的损失。而不是垂直损失,我们对`y``x`值有垂直损失(或总损失)。
戴明回归的方法几乎与常规线性回归相同。关键的区别在于我们如何衡量预测和数据点之间的损失。而不是垂直损失,我们对`y``x`值有垂直损失(或总损失)。
> 当我们假设`x`和`y`值中的误差相似时,使用这种类型的回归。根据我们的假设,我们还可以根据误差的差异在距离计算中缩放`x`和`y`轴。
......@@ -510,7 +510,7 @@ deming 回归的方法几乎与常规线性回归相同。关键的区别在于
我们按如下方式处理秘籍:
1. 我们将再次使用 iris 数据集并以与以前相同的方式设置我们的脚本。我们先加载库;开始一个会议;加载数据;声明批量大小;并创建占位符,变量和模型输出,如下所示:
1. 我们将再次使用鸢尾花数据集并以与以前相同的方式设置我们的脚本。我们先加载库;开始一个会议;加载数据;声明批量大小;并创建占位符,变量和模型输出,如下所示:
```py
import matplotlib.pyplot as plt
......@@ -712,7 +712,7 @@ plt.show()
## 准备
逻辑回归是将线性回归转换为二元分类的一种方法。这是通过将线性输出转换为 Sigmoid 函数来实现的,该函数将输出在 0 和 1 之间进行缩放。目标是零或一,表示数据点是在一个类还是另一个类中。由于我们预测 0 和 1 之间的数字,如果预测高于指定的截止值,则预测被分类为类值 1,否则分类为 0。出于此示例的目的,我们将指定 cutoff 为 0.5,这将使分类像舍入输出一样简单。
逻辑回归是将线性回归转换为二元分类的一种方法。这是通过将线性输出转换为 Sigmoid 函数来实现的,该函数将输出在 0 和 1 之间进行缩放。目标是零或一,表示数据点是在一个类还是另一个类中。由于我们预测 0 和 1 之间的数字,如果预测高于指定的截止值,则预测被分类为类值 1,否则分类为 0。出于此示例的目的,我们将指定截断为 0.5,这将使分类像舍入输出一样简单。
我们将用于此示例的数据将是从作者的 GitHub 仓库获得的[低出生体重数据](https://github.com/nfmcclure/tensorflow_cookbook/raw/master/01_Introduction/07_Working_with_Data_Sources/birthweight_data/birthweight.dat)。我们将从其他几个因素预测低出生体重。
......@@ -789,9 +789,9 @@ x_vals_train, train_min, train_max = np.nan_to_num(normalize_cols(x_vals_train))
x_vals_test = np.nan_to_num(normalize_cols(x_vals_test, train_min, train_max))
```
> 请注意,在缩放数据集之前,我们将数据集拆分为 train 和 test。这是一个重要的区别。我们希望确保测试集完全不影响训练集。如果我们在分裂之前缩放整个集合,那么我们不能保证它们不会相互影响。我们确保从训练组中保存缩放以缩放测试集。
> 请注意,在缩放数据集之前,我们将数据集拆分为训练和测试。这是一个重要的区别。我们希望确保测试集完全不影响训练集。如果我们在分裂之前缩放整个集合,那么我们不能保证它们不会相互影响。我们确保从训练组中保存缩放以缩放测试集。
1. 接下来,我们声明批量大小,占位符,变量和逻辑模型。我们不将输出包装在 sigmoid 中,因为该操作内置于 loss 函数中。另请注意,每次观察都有七个输入特征,因此`x_data`占位符的大小为`[None, 7]`
1. 接下来,我们声明批量大小,占位符,变量和逻辑模型。我们不将输出包装在 sigmoid 中,因为该操作内置于损失函数中。另请注意,每次观察都有七个输入特征,因此`x_data`占位符的大小为`[None, 7]`
```py
batch_size = 25
......
......@@ -184,7 +184,7 @@ x_embed = tf.nn.embedding_lookup(identity_mat, x_data)
x_col_sums = tf.reduce_sum(x_embed, 0)
```
1. 现在我们为每个句子都有固定长度的句子向量,我们想要进行逻辑回归。为此,我们需要声明实际的模型操作。由于我们一次只做一个数据点(随机训练),我们将扩展输入的维度并对其进行线性回归操作。请记住,TensorFlow 具有包含 sigmoid 函数的 loss 函数,因此我们不需要在此输出中包含它:
1. 现在我们为每个句子都有固定长度的句子向量,我们想要进行逻辑回归。为此,我们需要声明实际的模型操作。由于我们一次只做一个数据点(随机训练),我们将扩展输入的维度并对其进行线性回归操作。请记住,TensorFlow 具有包含 sigmoid 函数的损失函数,因此我们不需要在此输出中包含它:
```py
x_col_sums_2D = tf.expand_dims(x_col_sums, 0)
......@@ -548,7 +548,7 @@ from nltk.corpus import stopwords
sess = tf.Session()
```
1. 然后我们声明一些模型参数。我们将一次查看 50 对单词嵌入(批量大小)。每个单词的嵌入大小将是一个长度为 200 的向量,我们只考虑 10,000 个最常用的单词(每隔一个单词将被归类为未知单词)。我们将训练 5 万代,并每 500 代打印一次。然后我们将声明一个我们将在 loss 函数中使用的`num_sampled`变量(我们将在后面解释),并且我们还声明了我们的 Skip-Gram 窗口大小。在这里,我们将窗口大小设置为 2,因此我们将查看目标每侧的周围两个单词。我们将通过名为`nltk`的 Python 包设置我们的停用词。我们还想要一种方法来检查我们的单词嵌入是如何执行的,因此我们将选择一些常见的电影评论单词并从每 2,000 次迭代中打印出最近的邻居单词:
1. 然后我们声明一些模型参数。我们将一次查看 50 对单词嵌入(批量大小)。每个单词的嵌入大小将是一个长度为 200 的向量,我们只考虑 10,000 个最常用的单词(每隔一个单词将被归类为未知单词)。我们将训练 5 万代,并每 500 代打印一次。然后我们将声明一个我们将在损失函数中使用的`num_sampled`变量(我们将在后面解释),并且我们还声明了我们的 Skip-Gram 窗口大小。在这里,我们将窗口大小设置为 2,因此我们将查看目标每侧的周围两个单词。我们将通过名为`nltk`的 Python 包设置我们的停用词。我们还想要一种方法来检查我们的单词嵌入是如何执行的,因此我们将选择一些常见的电影评论单词并从每 2,000 次迭代中打印出最近的邻居单词:
```py
batch_size = 50
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册