提交 4b6df056 编写于 作者: W wizardforcel

2021-03-05 22:13:09

上级 012d08f2
......@@ -34,7 +34,7 @@ Anaconda 安装随附的 Python 库:
* beautifulsoup4 4.6.0+
* numpy 的 1.13.1+
* Pandas 0.20.3+
* scikit 学习 0.19.0+
* scikit-learn 0.19.0+
* Seaborn 0.8.0+
* 散景 0.12.10+
......
......@@ -276,7 +276,7 @@
现在我们已经讨论了序数特征,让我们来谈谈另一种称为标称特征的类型。 这些是没有固有顺序的字段,在我们的案例中,我们看到`product`是一个完美的例子。
大多数 scikit 学习模型都可以在这样的数据上进行训练,在这种数据中,我们使用字符串而不是整数编码的标签。 在这种情况下,必须在引擎盖下进行必要的转换。 但是,对于 scikit-learn 或其他机器学习和深度学习库中的所有模型而言,情况可能并非如此。 因此,优良作法是在预处理过程中自行编码。
大多数 scikit-learn模型都可以在这样的数据上进行训练,在这种数据中,我们使用字符串而不是整数编码的标签。 在这种情况下,必须在引擎盖下进行必要的转换。 但是,对于 scikit-learn 或其他机器学习和深度学习库中的所有模型而言,情况可能并非如此。 因此,优良作法是在预处理过程中自行编码。
17. 将类标签从字符串转换为数值的一种常用技术称为“单热编码”。 这会将不同的类拆分为单独的功能。 可以用`pd.get_dummies()`优雅地完成。 通过运行包含以下代码的单元格来执行此操作:
......
......@@ -87,9 +87,9 @@ spark-submit SparkKMeans.py
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
* Windows 的 WinRAR / 7-Zip
* 适用于 Mac 的 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
* Windows 的 WinRAR/7-Zip
* 适用于 Mac 的 Zipeg/iZip/UnRarX
* 适用于 Linux 的 7-Zip/PeaZip
本书的代码包也托管在[这个页面](https://github.com/PacktPublishing/Hands-On-Data-Science-and-Python-Machine-Learning)。 我们还从[这个页面](https://github.com/PacktPublishing/)提供了丰富的书籍和视频目录中的其他代码包。 去看一下!
......
......@@ -6,7 +6,7 @@
* 安装有思想的顶篷
* 安装 Python 库
* 如何使用 IPython / Jupyter 笔记本
* 如何使用 IPython/Jupyter 笔记本
* 如何使用,阅读和运行本书的代码文件
* 然后,我们将深入研究速成课程,以了解 Python 代码:
* Python 基础-第 1 部分
......@@ -73,7 +73,7 @@
![](img/349fff7b-40d9-4e47-887d-33d57016a416.png)
现在,转到列表中的 Outliers 文件,即`Outliers.ipynb`文件,双击它,应该发生的事情是,它将首先启动 Canopy,然后启动您的 Web 浏览器! 这是因为 IPython / Jupyter笔记本实际上位于您的 Web 浏览器中。 一开始可能会有一点停顿,并且第一次可能会有些混乱,但是您很快就会习惯这个想法。
现在,转到列表中的 Outliers 文件,即`Outliers.ipynb`文件,双击它,应该发生的事情是,它将首先启动 Canopy,然后启动您的 Web 浏览器! 这是因为 IPython/Jupyter笔记本实际上位于您的 Web 浏览器中。 一开始可能会有一点停顿,并且第一次可能会有些混乱,但是您很快就会习惯这个想法。
您很快就会看到 Canopy,对于我来说,我的默认网络浏览器是 Chrome。 由于我们双击`Outliers.ipynb`文件,您应该看到以下 Jupyter笔记本页面:
......@@ -91,9 +91,9 @@
# 使用和理解 IPython(Jupyter)笔记本
恭喜您安装成功! 现在让我们使用 Jupyter 笔记本(也称为 IPython Notebook)进行探索。 如今,更现代的名称是 Jupyter 笔记本,但是很多人仍将其称为 IPython笔记本,因此,我认为这些名称对于工作中的开发人员而言可以互换。 我也确实找到了名称“ IPython Notebooks”,它可以帮助我记住笔记本文件的文件名后缀,即`.ipynb`,因为您在本书中会对此非常了解!
恭喜您安装成功! 现在让我们使用 Jupyter 笔记本(也称为 IPython Notebook)进行探索。 如今,更现代的名称是 Jupyter 笔记本,但是很多人仍将其称为 IPython笔记本,因此,我认为这些名称对于工作中的开发人员而言可以互换。 我也确实找到了名称“IPython 笔记本”,它可以帮助我记住笔记本文件的文件名后缀,即`.ipynb`,因为您在本书中会对此非常了解!
好的,现在让我们再次从上而下-我们对 IPython / Jupyter笔记本的首次探索。 如果您尚未这样做,请导航到`DataScience`文件夹,我们在其中下载了本书的所有材料。 对我来说,这是`E:DataScience`,如果您在前面的安装部分中没有这样做,请双击并打开`Outliers.ipynb`文件。
好的,现在让我们再次从上而下-我们对 IPython/Jupyter笔记本的首次探索。 如果您尚未这样做,请导航到`DataScience`文件夹,我们在其中下载了本书的所有材料。 对我来说,这是`E:DataScience`,如果您在前面的安装部分中没有这样做,请双击并打开`Outliers.ipynb`文件。
现在,当我们双击此 IPython `.ipynb`文件时,将首先触发 Canopy,如果尚未触发,则将其触发。 启动网络浏览器。 这是完整的`Outliers`笔记本电脑网页在浏览器中的显示方式:
......@@ -101,7 +101,7 @@
正如您在此处看到的那样,笔记本的结构方式使我可以在实际代码本身中散布有关您在此处看到的内容的小注释和评论,并且可以在 Web 浏览器中实际运行此代码! 因此,对于我来说,这是一种非常方便的格式,可以为您提供一些参考,您可以在以后的生活中使用它来提醒自己,我们将要讨论这些算法的工作原理,并实际对其进行实验和玩耍 和他们自己在一起。
IPython / Jupyter笔记本文件的工作方式是,它们实际上是从您的浏览器内部运行的,就像网页一样,但是它们受到您安装的 Python 引擎的支持。 因此,您应该看到的屏幕类似于上一个屏幕快照中显示的屏幕。
IPython/Jupyter笔记本文件的工作方式是,它们实际上是从您的浏览器内部运行的,就像网页一样,但是它们受到您安装的 Python 引擎的支持。 因此,您应该看到的屏幕类似于上一个屏幕快照中显示的屏幕。
在浏览器中向下滚动笔记本时,您会注意到有代码块。 它们很容易发现,因为它们包含我们的实际代码。 请在离群值笔记本中的顶部附近找到此代码的代码框:
......@@ -197,7 +197,7 @@ plt.show()
制表符和空格在 Python 中具有真正的含义,因此您不能只是按照自己的方式设置格式。 您必须注意它们。
我想说明的是,在其他语言中,通常会有某种形式的方括号或大括号表示我在`for`循环,`if`块或某种内部 代码块,但在 Python 中,所有这些都用空格指定。 Tab 对于告诉 Python 哪个代码块实际上很重要:
我想说明的是,在其他语言中,通常会有某种形式的方括号或大括号表示我在`for`循环,`if`块或某种内部 代码块,但在 Python 中,所有这些都用空格指定。 `Tab`对于告诉 Python 哪个代码块实际上很重要:
```py
for number in listOfNumbers:
......@@ -249,7 +249,7 @@ print (A)
# 数据结构
让我们继续进行数据结构。 如果您需要暂停一下,让事物沉入一点,或者您想多玩一点,那就随便吧。 学习这些东西的最好方法是潜入并进行实际试验,因此,我绝对鼓励这样做,这就是为什么我为您提供 IPython / Jupyter笔记本的原因,因此您实际上可以走进去,弄乱代码,做不同的事情 东西。
让我们继续进行数据结构。 如果您需要暂停一下,让事物沉入一点,或者您想多玩一点,那就随便吧。 学习这些东西的最好方法是潜入并进行实际试验,因此,我绝对鼓励这样做,这就是为什么我为您提供 IPython/Jupyter笔记本的原因,因此您实际上可以走进去,弄乱代码,做不同的事情 东西。
例如,这里我们有一个围绕`25.0`的分布,但是让我们围绕它`55.0`
......@@ -341,7 +341,7 @@ x[3:]
```
您可能想要保留此 IPython / Jupyter笔记本文件。 这是一个很好的参考,因为有时切片操作符是否包含该元素,或者是否包含或不包含该元素,可能会造成混淆。 因此,最好的方法是在这里玩转并提醒自己。
您可能想要保留此 IPython/Jupyter笔记本文件。 这是一个很好的参考,因为有时切片操作符是否包含该元素,或者是否包含或不包含该元素,可能会造成混淆。 因此,最好的方法是在这里玩转并提醒自己。
# 负语法
......@@ -543,7 +543,7 @@ print (income)
```
假设我们输入了一行输入数据,它是一个逗号分隔的值文件,其中包含年龄(例如`32`),以收入逗号分隔的年龄(例如`120000`),用于弥补年龄。 我所能做的就是在每行输入时,我可以调用`split`函数将其实际上分成一对用逗号定界的值,然后将结果元组从 split 中分离出来并将其分配给 两个变量-`age``income`-同时定义了年龄,收入和说我想将其设置为等于`split`函数产生的元组。
假设我们输入了一行输入数据,它是一个逗号分隔的值文件,其中包含年龄(例如`32`),以收入逗号分隔的年龄(例如`120000`),用于弥补年龄。 我所能做的就是在每行输入时,我可以调用`split`函数将其实际上分成一对用逗号定界的值,然后将结果元组从`split`中分离出来并将其分配给 两个变量-`age``income`-同时定义了年龄,收入和说我想将其设置为等于`split`函数产生的元组。
因此,这基本上是您一次将多个字段分配给多个变量的常见缩写。 如果运行该命令,您会发现`age`变量实际上最终分配给了`32``income`分配给了`120,000`,因为那里有一些小技巧。 在执行此类操作时,您一定要小心,因为如果在结果元组中没有预期的字段数或预期的元素数,那么如果尝试分配更多的字段,则会出现异常 或少于您期望在此处看到的东西。
......@@ -709,7 +709,7 @@ False
我们可以做的另一件事是使用`is`,它等同于相同的事物。 它是 Python 式的平等表示,因此`1 == 3``1 is 3`是同一回事,但这被认为是使用 Python 的方式。 因此,`1 is 3`返回为`False`,因为`1`不是`3`
# if-else 循环
# `if-else`循环
```py
if 1 is 3:
......@@ -728,7 +728,7 @@ All is well with the world
```
我们也可以在此处执行`if-else``else-if`块。 让我们在这里做一些更复杂的事情。 如果`1 is 3`,我将打印`How did that happen?`,但是`1`当然不是`3`,所以我们将退回到`else-if`块,否则,如果`1`不是`3`,我们 ll 测试是否`1 > 3`。 嗯,这也不是正确的,但是如果确实如此,我们将打印`Yikes`,最后我们将进入将打印`All is well with the world`的所有`else`子句。
我们也可以在此处执行`if-else``else-if`块。 让我们在这里做一些更复杂的事情。 如果`1 is 3`,我将打印`How did that happen?`,但是`1`当然不是`3`,所以我们将退回到`else-if`块,否则,如果`1`不是`3`,我们测试是否`1 > 3`。 嗯,这也不是正确的,但是如果确实如此,我们将打印`Yikes`,最后我们将进入将打印`All is well with the world`的所有`else`子句。
实际上,`1`既不是`3`,也不是`1`大于`3`,并且肯定是`All is well with the world`。 因此,您知道其他语言具有非常相似的语法,但这是 Python 的特性以及如何执行`if-else``else-if`块。 因此,请再次随身携带此笔记本。 以后可能是一个很好的参考。
......@@ -772,9 +772,9 @@ for x in range(10):
在此示例中,我们将遍历 0 到 9 的值,如果我们打到数字 1,我​​们将继续进行操作,然后将其打印出来。 我们基本上将跳过数字 1,如果数字大于`5`,我们将中断循环并完全停止处理。 我们期望的输出是我们将打印出`0``5`的数字,除非它是`1`,在这种情况下,我们将跳过数字`1`,并且可以肯定的是,它就是这样做的。
# while 循环
# `while`循环
另一种语法是 while 循环。 在大多数语言中,这都是一种标准的循环语法:
另一种语法是`while`循环。 在大多数语言中,这都是一种标准的循环语法:
```py
x = 0
......@@ -791,7 +791,7 @@ while (x < 10):
```
我们也可以说,以`x = 0``while (x < 10):`开头,将其打印出来,然后以`1`递增`x`。 这将一遍又一遍,递增 x 直到它小于 10,这时我们跳出`while`循环,然后完成。 因此,它的功能与此处的第一个示例相同,只是风格不同。 它使用`while`循环打印出`0``9`的数字。 那里只是一些例子,没有什么太复杂的。 同样,如果您之前做过任何形式的编程或脚本编写,这都应该非常简单。
我们也可以说,以`x = 0``while (x < 10):`开头,将其打印出来,然后以`1`递增`x`。 这将一遍又一遍,递增`x`直到它小于 10,这时我们跳出`while`循环,然后完成。 因此,它的功能与此处的第一个示例相同,只是风格不同。 它使用`while`循环打印出`0``9`的数字。 那里只是一些例子,没有什么太复杂的。 同样,如果您之前做过任何形式的编程或脚本编写,这都应该非常简单。
现在要真正让它陷入,我已经在整章中说过,进入那里,弄脏你的手,然后玩。 所以我会让你这样做。
......@@ -809,13 +809,13 @@ while (x < 10):
# 运行 Python 脚本
在整本书中,我们将使用到目前为止一直在使用的 IPython / Jupyter笔记本格式(`.ipynb`文件),对于这样的书,这是一种很好的格式,因为它可以让我放一些小块 代码,然后在其中放一些文字和说明操作的内容,然后您就可以尝试实际操作。
在整本书中,我们将使用到目前为止一直在使用的 IPython/Jupyter笔记本格式(`.ipynb`文件),对于这样的书,这是一种很好的格式,因为它可以让我放一些小块 代码,然后在其中放一些文字和说明操作的内容,然后您就可以尝试实际操作。
当然,从这个角度来看,这很棒,但是在现实世界中,您可能不会使用 IPython / Jupyter笔记本在生产中实际运行 Python 脚本,所以让我简要地简要介绍一下其他方法 运行 Python 代码以及其他交互方式来运行 Python 代码。 因此,这是一个非常灵活的系统。 让我们来看看。
当然,从这个角度来看,这很棒,但是在现实世界中,您可能不会使用 IPython/Jupyter笔记本在生产中实际运行 Python 脚本,所以让我简要地简要介绍一下其他方法 运行 Python 代码以及其他交互方式来运行 Python 代码。 因此,这是一个非常灵活的系统。 让我们来看看。
# 不仅仅是 IPython / Jupyter笔记本的更多选择
# 不仅仅是 IPython/Jupyter笔记本的更多选择
我想确保您知道有多种方法可以运行 Python 代码。 现在,在整本书中,我们将使用 IPython / Jupyter笔记本格式,但在现实世界中,您将不会像笔记本一样运行代码。 您将以独立的 Python 脚本运行它。 因此,我只想确保您知道该怎么做并查看其工作原理。
我想确保您知道有多种方法可以运行 Python 代码。 现在,在整本书中,我们将使用 IPython/Jupyter笔记本格式,但在现实世界中,您将不会像笔记本一样运行代码。 您将以独立的 Python 脚本运行它。 因此,我只想确保您知道该怎么做并查看其工作原理。
![](img/378e204b-200b-4ac4-b05a-65f905c25481.png)
......@@ -859,7 +859,7 @@ while (x < 10):
![](img/3f4a7f96-ead8-4dfa-8f1c-da8eddf25b03.png)
这样便有了运行 Python 代码的三种方式:IPython / Jupyter 笔记本,我们将在整本书中使用它,只是因为它是一个很好的学习工具,您还可以将脚本作为独立的脚本文件运行,也可以执行 交互式命令提示符中的 Python 代码。
这样便有了运行 Python 代码的三种方式:IPython/Jupyter 笔记本,我们将在整本书中使用它,只是因为它是一个很好的学习工具,您还可以将脚本作为独立的脚本文件运行,也可以执行 交互式命令提示符中的 Python 代码。
因此,您拥有了它,并且这里有三种不同的方式来运行 Python 代码以及在生产中进行实验和运行。 所以记住这一点。 在本书的其余部分中,我们将一直使用笔记本电脑,但是,到时候,您还有其他选择。
......
......@@ -149,7 +149,7 @@ Sum of samples/Number of samples
0: 4, 1: 1, 2: 3, 3: 1
```
MODE 为 0
模式为 0
如果我只看一下最常出现的数字,它的值为 0,因此该数据的模式为 0。在该邻里给定房屋中,最常见的孩子数是没有孩子,这意味着 。
......@@ -200,7 +200,7 @@ Out[1]: 27173.098561362742
让我们可视化这些数据,使其更具意义。 因此,还有一个名为`matplotlib`的软件包,以后我们将再次讨论更多,但这是一个软件包,可以让我在 IPython笔记本中制作漂亮的图形,因此这是一种可视化您的简单方法 数据,看看发生了什么。
在此示例中,我们使用`matplotlib`创建我们的收入数据的直方图,该直方图分为`50`个不同的存储桶。 因此,基本上,我们要获取连续数据并将其离散化,然后可以在`matplotlib.pyplot`上调用 show 来实际显示该直方图。 请参考以下代码:
在此示例中,我们使用`matplotlib`创建我们的收入数据的直方图,该直方图分为`50`个不同的存储桶。 因此,基本上,我们要获取连续数据并将其离散化,然后可以在`matplotlib.pyplot`上调用`show`来实际显示该直方图。 请参考以下代码:
```py
%matplotlib inline
......@@ -301,7 +301,7 @@ stats.mode(ages)
```
该代码意味着,从`scipy`包导入`stats`,而我仅将该包称为`stats`Tha 意味着我不需要像以前使用 NumPy 时那样的别名, 只是做事的方式不同。 两种方式都可以。 然后,我在`ages`上使用了`stats.mode`函数,这是我们随机年龄的列表。 当我们执行上面的代码时,我们得到以下输出:
该代码意味着,从`scipy`包导入`stats`,而我仅将该包称为`stats`,意味着我不需要像以前使用 NumPy 时那样的别名, 只是做事的方式不同。 两种方式都可以。 然后,我在`ages`上使用了`stats.mode`函数,这是我们随机年龄的列表。 当我们执行上面的代码时,我们得到以下输出:
```py
Out[11]: ModeResult(mode=array([39]), count=array([12]))
......@@ -371,14 +371,14 @@ Out[11]: ModeResult(mode=array([29]), count=array([14]))
# 测量方差
我们通常将方差称为 sigma 平方,您会立即找出原因,但现在,仅知道方差是均值平方差的平均值。
我们通常将方差称为`σ²`,您会立即找出原因,但现在,仅知道方差是均值平方差的平均值。
1. 要计算数据集的方差,首先要弄清楚它的平均值。 假设我有一些数据可以代表任何东西。 假设在一个小时内排队的最大人数。 在第一个小时,我观察到有一个人在排队,然后依次是 4、5、4、8。
2. 计算方差的第一步只是找到该数据的平均值或平均值。 我将它们全部相加,将总和除以数据点的数量,得出 4.4,这是排队的平均人数`(1 + 4 + 5 + 4 + 8) / 5 = 4.4`
3. 现在,下一步是找到每个数据点均值的差异。 我知道平均值是 4.4。 所以对于我的第一个数据点,我有 1,所以`1 - 4.4 = -3.4`,下一个数据点是 4,所以`4 - 4.4 = -0.4`, 等等等等。 好的,因此我得到了这些正数和负数,它们代表每个数据点(`-3.4, -0.4, 0.6, -0.4, 3.6`)与平均值的方差。
4. 现在,我需要一个代表整个数据集方差的数字。 因此,我接下来要做的就是找到这些差异的平方。 我只是要仔细研究均值中的每一个原始差异,然后将它们平方。 这有两个不同的原因:
让我们看一下发生了什么,所以(-3.4) <sup class="calibre33">2</sup> 是正 11.56,而(-0.4) <sup class="calibre33">2</sup> 最终是一个小得多的数字,即 0.16,因为这要大得多 接近 4.4 的平均值。 同样,(0.6) <sup class="calibre33">2</sup> 接近平均值,仅为 0.36。 但是当我们达到正离群值时,(3.6) <sup class="calibre33">2</sup> 最终为 12.96。 这样就得出:`11.56, 0.16, 0.36, 0.16, 12.96`
让我们看一下发生了什么,所以`(-3.4)²`是正 11.56,而`(-0.4)²`最终是一个小得多的数字,即 0.16,因为这要大得多 接近 4.4 的平均值。 同样,`0.6²`接近平均值,仅为 0.36。 但是当我们达到正离群值时,`3.6²`最终为 12.96。 这样就得出:`11.56, 0.16, 0.36, 0.16, 12.96`
为了找到实际的方差值,我们只取所有那些平方差的平均值。 因此,我们将所有这些平方的方差相加,将总和除以 5(即我们拥有的值的数量),最后得出方差 5.04。
......@@ -390,7 +390,7 @@ Out[11]: ModeResult(mode=array([29]), count=array([14]))
现在,通常,我们谈论标准偏差多于方差,事实证明标准偏差只是方差的平方根。 就这么简单。
因此,如果我的差异为`5.04`,则标准偏差为`2.24`。 现在您知道为什么我们说方差=(σ) <sup class="calibre33">2</sup> 。 这是因为σ本身代表标准偏差。 因此,如果我取(σ) <sup class="calibre33">2</sup> 的平方根,则得到 sigma。 在此示例中最终为 2.24。
因此,如果我的差异为`5.04`,则标准偏差为`2.24`。 现在您知道为什么我们说方差`= σ²`。 这是因为`σ`本身代表标准偏差。 因此,如果我取`σ²`的平方根,则得到`σ`。 在此示例中最终为 2.24。
![](img/e5593f79-70de-45c1-95f6-a481fcd4932e.png)
......@@ -404,7 +404,7 @@ Out[11]: ModeResult(mode=array([29]), count=array([14]))
通常使用标准偏差作为思考如何识别数据集中异常值的方法。 如果我说我在 4.4 平均值的一个标准偏差内,则认为这是正态分布中的典型值。 但是,您可以在上图中看到`1``8`实际上不在该范围内。 因此,如果我采用 4.4 的正负 2.24,我们最终会在`7``2`周围,而`1``8`都落在 标准偏差的范围。 因此,我们可以从数学上说 1 和 8 是离群值。 我们不必猜测和盯着它。 现在仍然需要根据数据点与平均值有多少标准偏差来判断离群值。
通常,您可以通过与平均值之间的标准差(或有时为多少个 sigma)来谈论一个数据点有多少离群值。
通常,您可以通过与平均值之间的标准差(或有时为多少个`σ`)来谈论一个数据点有多少离群值。
因此,您会看到在现实世界中使用的标准偏差。
......@@ -432,21 +432,21 @@ S² = (11.56 + 0.16 + 0.36 + 0.16 + 12.96) / 4 = 6.3
至于为什么总体和样本方差之间存在差异,它涉及关于您可能不想考虑太多的概率的真正怪异的东西,并且它需要一些花哨的数学符号,在本书中我尽量避免使用符号 尽可能多,因为我认为概念更重要,但这已经足够基本了,您将一遍又一遍地看到它。
如我们所见,总体方差通常指定为 sigma 平方(σ <sup class="calibre33">2</sup> ),其中 sigma(σ)为标准偏差,我们可以说这是每个数据点 X 的总和减去平均值 ,mu,平方,即每个样本在 N(数据点的数量)上平方的方差,我们可以用以下公式表示:
如我们所见,总体方差通常指定为 `σ²`,其中`σ`为标准偏差,我们可以说这是每个数据点`X`的总和减去平均值,`μ`,平方,即每个样本在`N`(数据点的数量)上平方的方差,我们可以用以下公式表示:
![](img/8d3eb6fb-41e3-4d56-ab18-1d5ccd2a2bb4.png)
* X 表示每个数据点
* µ表示平均值
* N 表示数据点数
* `X`表示每个数据点
* `µ`表示平均值
* `N`表示数据点数
样本方差类似地指定为 S <sup class="calibre33">2</sup> ,其等式如下:
样本方差类似地指定为`S²`,其等式如下:
![](img/76eac09f-5b97-4c46-92a6-620407eaba69.png)
* X 表示每个数据点
* M 表示平均值
* N-1 表示数据点数减去 1
* `X`表示每个数据点
* `M`表示平均值
* `N-1`表示数据点数减去 1
这里的所有都是它的。
......@@ -793,7 +793,7 @@ Out[5]:-0.41810340026619164
```
第 20 个百分位数大致为-0.4,我再次相信这一点。 也就是说,20% 的数据位于-0.4 的左侧,相反,80% 的数据更大。
第 20 个百分位数大致为 -0.4,我再次相信这一点。 也就是说,20% 的数据位于-0.4 的左侧,相反,80% 的数据更大。
如果您想了解这些断点在数据集中的位置,则百分位函数是一种简单的计算方法。 如果这是代表收入分配的数据集,我们可以调用`np.percentile(vals, 99)`并找出第 99 个百分位数。 您可以弄清楚人们一直在谈论的那些一心一意的人到底是谁,如果您是其中之一。
......@@ -809,7 +809,7 @@ Out[5]:-0.41810340026619164
![](img/8f5319b6-97bd-41c2-b66e-aa3d787011af.png)
如果您确实知道微积分,那么它实际上并不是那么复杂的概念。 我们将每个值之间的差值从某个值提高到 n 次幂,其中 n 是矩数,并在整个函数中积分(从负无穷大到无穷大)。 但是从直观上讲,它比微积分要容易得多。
如果您确实知道微积分,那么它实际上并不是那么复杂的概念。 我们将每个值之间的差值从某个值提高到`n`次幂,其中`n`是矩数,并在整个函数中积分(从负无穷大到无穷大)。 但是从直观上讲,它比微积分要容易得多。
矩可以定义为概率密度函数形状的定量度量。
......
此差异已折叠。
......@@ -18,7 +18,7 @@
![](img/0c9e8d83-c2cb-419a-a681-48b1790465ed.png)
我在`x`轴上显示了重量,在`y`轴上显示了高度,我可以绘制所有这些数据点,例如人们的体重与身高, 我可以说:“嗯,这看起来像是线性关系,不是吗?也许我可以在其中拟合一条直线,然后用它来预测新值”,这就是线性回归的作用。 在本例中,我的斜率为 0.6,`y`-截距为 130.2,它们定义了一条直线(直线的等式为`y = mx + b`, 其中,m 是斜率,b 是`y`-截距)。 给定一个斜率和一个`y`-截距,该截距适合我所拥有的最佳数据,我可以使用该线来预测新值。
我在`x`轴上显示了重量,在`y`轴上显示了高度,我可以绘制所有这些数据点,例如人们的体重与身高, 我可以说:“嗯,这看起来像是线性关系,不是吗?也许我可以在其中拟合一条直线,然后用它来预测新值”,这就是线性回归的作用。 在本例中,我的斜率为 0.6,`y`截距为 130.2,它们定义了一条直线(直线的等式为`y = mx + b`, 其中,`m`是斜率,`b``y`截距)。 给定一个斜率和一个`y`截距,该截距适合我所拥有的最佳数据,我可以使用该线来预测新值。
您可以看到,我观察到的重量仅上升到重 100 公斤的人。 如果有人重 120 公斤怎么办? 好吧,我可以根据之前的数据,使用那条线找出身高 120 公斤的人的身高在哪里。
......@@ -50,13 +50,13 @@
通常,尽管最小二乘是进行线性回归的完美选择,并且始终是合法的事情,但是如果遇到梯度下降,您将知道这只是线性回归的另一种方法, 通常在高维数据中看到。
# 确定系数或 r 平方
# 确定系数或 R 平方
那么我怎么知道我的回归有多好呢? 我的行适合我的数据的程度如何? 这就是 r 平方的出现,并且 r 平方也称为确定系数。 同样,有人试图听起来很聪明,可能会这样称呼它,但通常将其称为 r 平方。
那么我怎么知道我的回归有多好呢? 我的行适合我的数据的程度如何? 这就是 R 平方的出现,并且 R 平方也称为确定系数。 同样,有人试图听起来很聪明,可能会这样称呼它,但通常将其称为 R 平方。
这是模型捕获的 Y 总变化的一部分。 那么,您的生产线如何顺应这种变化? 我们在行的两边是否都得到等量的方差? 这就是 r 平方的度量。
这是模型捕获的 Y 总变化的一部分。 那么,您的生产线如何顺应这种变化? 我们在行的两边是否都得到等量的方差? 这就是 R 平方的度量。
# 计算 r 平方
# 计算 R 平方
要实际计算该值,请取 1 减去平方误差的总和乘以均值的平方变化的总和:
......@@ -64,15 +64,15 @@
因此,计算并不是很困难,但是 Python 再次会为您提供可以为您计算的函数,因此您不必自己真正进行数学运算。
# 解释 r 平方
# 解释 R 平方
对于 r 平方,您将获得一个介于 0 到 1 之间的值。现在 0 表示您的拟合度很糟糕。 它不会捕获数据中的任何差异。 尽管 1 是一个完美的拟合,但数据中的所有方差都被该行捕获,并且在这种情况下,您在行两侧看到的所有方差都应该相同。 所以 0 是不好的,而 1 是好的。 这就是您真正需要知道的。 介于两者之间的事物。 较低的 r 平方值表示拟合度较差,较高的 r 平方值表示拟合度较高。
对于 R 平方,您将获得一个介于 0 到 1 之间的值。现在 0 表示您的拟合度很糟糕。 它不会捕获数据中的任何差异。 尽管 1 是一个完美的拟合,但数据中的所有方差都被该行捕获,并且在这种情况下,您在行两侧看到的所有方差都应该相同。 所以 0 是不好的,而 1 是好的。 这就是您真正需要知道的。 介于两者之间的事物。 较低的 R 平方值表示拟合度较差,较高的 R 平方值表示拟合度较高。
正如您将在接下来的部分中看到的,进行回归的方法不止一种。 线性回归就是其中之一。 这是一种非常简单的技术,但是也有其他技术,您可以使用 r 平方作为定量度量,以衡量给定回归对一组数据点的良好程度,然后使用它来选择最适合的模型 您的数据。
正如您将在接下来的部分中看到的,进行回归的方法不止一种。 线性回归就是其中之一。 这是一种非常简单的技术,但是也有其他技术,您可以使用 R 平方作为定量度量,以衡量给定回归对一组数据点的良好程度,然后使用它来选择最适合的模型 您的数据。
# 使用 Python 计算线性回归和 r 平方
# 使用 Python 计算线性回归和 R 平方
现在让我们玩线性回归,并实际计算一些线性回归和 r 平方。 我们可以从这里创建一些 Python 代码开始,该代码会生成实际上线性相关的*随机*数据。
现在让我们玩线性回归,并实际计算一些线性回归和 R 平方。 我们可以从这里创建一些 Python 代码开始,该代码会生成实际上线性相关的*随机*数据。
在此示例中,我将伪造一些有关页面渲染速度和人们购买量的数据,就像前面的示例一样。 我们将在网站加载所需的时间与人们在该网站上花费的金额之间建立线性关系:
......@@ -103,7 +103,7 @@ stats.linregress(pageSpeeds, purchaseAmount)
```
您可以从`scipy`导入`stats`,然后只需在两个功能上调用`stats.linregress()`。 因此,我们有一个页面速度列表(`pageSpeeds`)和一个相应的购买金额列表(`purchaseAmount`)。 `linregress()`函数将带给我们很多东西,包括坡度,截距,这是我定义最佳拟合线所需要的。 它还为我们提供了`r_value`,从中我们可以得到 r 平方来衡量该拟合的质量,以及几件事我们将在以后进行讨论。 现在,我们只需要斜率,截距和`r_value`,所以让我们继续运行它们。 我们将从找到最合适的线性回归开始:
您可以从`scipy`导入`stats`,然后只需在两个功能上调用`stats.linregress()`。 因此,我们有一个页面速度列表(`pageSpeeds`)和一个相应的购买金额列表(`purchaseAmount`)。 `linregress()`函数将带给我们很多东西,包括坡度,截距,这是我定义最佳拟合线所需要的。 它还为我们提供了`r_value`,从中我们可以得到 R 平方来衡量该拟合的质量,以及几件事我们将在以后进行讨论。 现在,我们只需要斜率,截距和`r_value`,所以让我们继续运行它们。 我们将从找到最合适的线性回归开始:
```py
r_value ** 2
......@@ -114,7 +114,7 @@ r_value ** 2
![](img/d4cdfbe1-90cf-4adf-8a5c-7b3e986dfc7f.png)
现在,我们返回的线的 r 平方值为 0.99,几乎是 1.0。 这意味着我们非常适合,这并不奇怪,因为我们确保这些数据之间存在真实的线性关系。 即使那条线周围有一些变化,我们的线也能捕捉到该变化。 我们在行的两边都有大致相同的方差量,这是一件好事。 它告诉我们,我们确实具有线性关系,并且我们的模型非常适合我们拥有的数据。
现在,我们返回的线的 R 平方值为 0.99,几乎是 1.0。 这意味着我们非常适合,这并不奇怪,因为我们确保这些数据之间存在真实的线性关系。 即使那条线周围有一些变化,我们的线也能捕捉到该变化。 我们在行的两边都有大致相同的方差量,这是一件好事。 它告诉我们,我们确实具有线性关系,并且我们的模型非常适合我们拥有的数据。
让我们画一条线:
......@@ -143,7 +143,7 @@ plt.show()
# 线性回归活动
现在该弄脏你的手了。 尝试增加测试数据中的随机变化,看看是否有影响。 请记住,r 平方是对拟合的度量,我们要捕获多少方差,因此方差的数量也是如此……您为什么不看看它是否真的有所作为。
现在该弄脏你的手了。 尝试增加测试数据中的随机变化,看看是否有影响。 请记住,R 平方是对拟合的度量,我们要捕获多少方差,因此方差的数量也是如此……您为什么不看看它是否真的有所作为。
那是线性回归,这是一个非常简单的概念。 我们要做的只是将一条直线拟合到一组观测值,然后我们可以使用该直线对新值进行预测。 这里的所有都是它的。 但是为什么要限制自己呢? 我们还可以执行其他类型的回归操作,这些操作更为复杂。 接下来,我们将探讨这些。
......@@ -153,9 +153,9 @@ plt.show()
多项式回归是回归的更一般情况。 那么,为什么将自己限制在一条直线上呢? 也许您的数据实际上没有线性关系,或者可能有某种曲线,对吗? 这种情况经常发生。
并非所有关系都是线性的,但是线性回归只是我们可以做的一整类回归的一个例子。 如果您还记得我们最终得到的线性回归线的形式为`y = mx + b`,则可以从普通最小二乘法或其他方法的线性回归分析中获得 m 和 b 的值 你选。 现在,这只是一阶或一阶多项式。 阶数或次数是您看到的 x 的幂。 这就是一阶多项式。
并非所有关系都是线性的,但是线性回归只是我们可以做的一整类回归的一个例子。 如果您还记得我们最终得到的线性回归线的形式为`y = mx + b`,则可以从普通最小二乘法或其他方法的线性回归分析中获得`m``b`的值 你选。 现在,这只是一阶或一阶多项式。 阶数或次数是您看到的`x`的幂。 这就是一阶多项式。
现在,如果需要,我们还可以使用二阶多项式,看起来像`y = ax ^ 2 + bx + c`。 如果我们使用二阶多项式进行回归,则将获得 a,b 和 c 的值。 或者我们可以做一个`ax ^ 3 + bx ^ 2 + cx + d`形式的三阶多项式。 阶数越高,可以表示的曲线越复杂。 因此,将`x`混合在一起的能力越强,可以获得的形状和关系就越复杂。
现在,如果需要,我们还可以使用二阶多项式,看起来像`y = ax ^ 2 + bx + c`。 如果我们使用二阶多项式进行回归,则将获得`a``b``c`的值。 或者我们可以做一个`ax ^ 3 + bx ^ 2 + cx + d`形式的三阶多项式。 阶数越高,可以表示的曲线越复杂。 因此,将`x`混合在一起的能力越强,可以获得的形状和关系就越复杂。
但是,获得更多学位并不总是更好。 通常,您的数据中存在某种自然关系,实际上并没有那么复杂,如果您发现自己在拟合数据时投入了很大的精力,那您可能就过度拟合了!
......@@ -164,11 +164,11 @@ plt.show()
* 不要使用过多的学位
* 首先可视化您的数据以查看曲线的真正复杂程度
* 可视化拟合并检查您的曲线是否偏离了正常值
*r 平方仅表示您的曲线非常适合您的训练数据; 它可能是也可能不是很好的预测指标
*R 平方仅表示您的曲线非常适合您的训练数据; 它可能是也可能不是很好的预测指标
如果您拥有到处都是的数据并且变化很大,那么您可能会发疯并创建一条线,就像向上和向下一样尝试尽可能地拟合该数据,但实际上并不能 代表数据的内在联系。 它在预测新值方面做得不好。
因此,始终仅从可视化数据开始,然后考虑曲线真正需要多么复杂。 现在,您可以使用 r 平方来衡量您的拟合度,但是请记住,这只是在测量该曲线与您的训练数据的拟合度,即您用来实际基于其进行预测的数据。 它不能衡量您准确预测未来的能力。
因此,始终仅从可视化数据开始,然后考虑曲线真正需要多么复杂。 现在,您可以使用 R 平方来衡量您的拟合度,但是请记住,这只是在测量该曲线与您的训练数据的拟合度,即您用来实际基于其进行预测的数据。 它不能衡量您准确预测未来的能力。
稍后,我们将讨论称为**训练/测试**的一些防止过度拟合的技术,但是现在您只需要仔细研究一下,以确保您不会过度拟合并在 一个比您需要的功能。 当我们探索一个示例时,这将更有意义,所以让我们继续。
......@@ -227,9 +227,9 @@ plt.show()
想象一下,我有一条曲线突然向上弯曲,然后再次向下弯曲以适应异常值。 我对介于两者之间的内容的预测将不准确。 曲线确实应该在中间。 在本书的后面,我们将讨论检测这种过度拟合的主要方法,但是现在,请观察它并知道我们以后会更深入。
# 计算 r 平方误差
# 计算 R 平方误差
现在我们可以测量 r 平方误差了。 通过取`sklearn.metrics`中具有的`r2_score()`函数中的`y`和预测值(`p4(x)`),我们可以计算出该值。
现在我们可以测量 R 平方误差了。 通过取`sklearn.metrics`中具有的`r2_score()`函数中的`y`和预测值(`p4(x)`),我们可以计算出该值。
```py
from sklearn.metrics import r2_score
......@@ -243,7 +243,7 @@ print r2
![](img/a18ffeef-c620-42d8-8fea-a2e3b60a3e1d.png)
我们的代码仅用一行代码即可将一组观察值与一组预测值进行比较,并为您计算 r 平方! 为此,我们的 r 平方为 0.829,还不错。 记住,零是坏的,一是好。 0.82 非常接近一个,不是完美的,而且从直觉上讲,这是有道理的。 您可以看到我们的行在数据的中间部分非常好,但是在最左边的位置不太好,在最右边的位置不太好。 因此,0.82 听起来不错。
我们的代码仅用一行代码即可将一组观察值与一组预测值进行比较,并为您计算 R 平方! 为此,我们的 R 平方为 0.829,还不错。 记住,零是坏的,一是好。 0.82 非常接近一个,不是完美的,而且从直觉上讲,这是有道理的。 您可以看到我们的行在数据的中间部分非常好,但是在最左边的位置不太好,在最右边的位置不太好。 因此,0.82 听起来不错。
# 多项式回归的活动
......@@ -261,9 +261,9 @@ p4 = np.poly1d(np.polyfit(x, y, 3))
![](img/208e9b74-bc29-443a-91b3-88f04c1deff8.png)
我们的三次多项式绝对不如第四次多项式拟合。 如果您实际测量 r 平方误差,则从数量上看,它实际上会变得更糟。 但是如果我过高,您可能会开始觉得过拟合。 因此,您可以从中获得一些乐趣,尝试不同的值,并了解多项式的不同阶数对回归的影响。 去弄脏你的手,尝试学习一些东西。
我们的三次多项式绝对不如第四次多项式拟合。 如果您实际测量 R 平方误差,则从数量上看,它实际上会变得更糟。 但是如果我过高,您可能会开始觉得过拟合。 因此,您可以从中获得一些乐趣,尝试不同的值,并了解多项式的不同阶数对回归的影响。 去弄脏你的手,尝试学习一些东西。
这就是多项式回归。 同样,您需要确保对问题的重视程度不超过所需。 仅使用正确的量来查找看起来像对数据的直观拟合。 太多会导致过度拟合,而太多会导致拟合不佳...因此,您现在可以同时使用眼球和 r 平方度量,以找出适合数据的度数。 让我们继续。
这就是多项式回归。 同样,您需要确保对问题的重视程度不超过所需。 仅使用正确的量来查找看起来像对数据的直观拟合。 太多会导致过度拟合,而太多会导致拟合不佳...因此,您现在可以同时使用眼球和 R 平方度量,以找出适合数据的度数。 让我们继续。
# 多元回归和预测汽车价格
......@@ -285,7 +285,7 @@ p4 = np.poly1d(np.polyfit(x, y, 3))
在本书中,我确实应该经常说这句话。 您总是想做数据科学中最简单的事情。 不要使事情复杂化,因为通常最简单的模型才是最好的。 如果您找到的只是适当数量的复杂性,而没有更多,那通常就是正确的模型。 无论如何,这些系数实际上为您提供了一种方法,“嘿,其中某些事情比其他事情更重要。也许我可以放弃其中的一些因素。”
现在我们仍然可以使用 r 平方通过多元回归来衡量拟合的质量。 它以相同的方式工作,尽管在进行多元回归时您需要假设的一件事是因素本身并不相互依赖...而且并非总是如此。 因此,有时您需要在脑后留些小警告。 例如,在这个模型中,我们将假设汽车的行驶里程和寿命无关。 但实际上,它们可能紧密相关! 这是该技术的局限性,可能根本无法捕获效果。
现在我们仍然可以使用 R 平方通过多元回归来衡量拟合的质量。 它以相同的方式工作,尽管在进行多元回归时您需要假设的一件事是因素本身并不相互依赖...而且并非总是如此。 因此,有时您需要在脑后留些小警告。 例如,在这个模型中,我们将假设汽车的行驶里程和寿命无关。 但实际上,它们可能紧密相关! 这是该技术的局限性,可能根本无法捕获效果。
# 使用 Python 进行多元回归
......@@ -336,7 +336,7 @@ est.summary()
![](img/ffce0020-9e84-4ecd-9a73-ac3008463f3a.png)
您可以在此处看到 r 平方非常低。 模型的确不是很好,但是我们可以洞悉各种误差是什么,有趣的是,最低标准误差与行驶里程有关。
您可以在此处看到 R 平方非常低。 模型的确不是很好,但是我们可以洞悉各种误差是什么,有趣的是,最低标准误差与行驶里程有关。
现在,我之前已经说过,系数是一种确定哪些项目重要的方法,尽管输入数据已标准化,但这是正确的。 也就是说,如果一切都在 0 到 1 的范围内。如果不是,则这些系数可以补偿所看到的数据的规模。 在这种情况下,如果您不处理规范化数据,则查看标准错误会更有用。 在这种情况下,我们可以看到里程数实际上是该特定模型的最大因素。 我们能早点弄清楚吗? 好吧,我们可以做一点切片和切块,以找出门的数量实际上根本不会影响价格。 让我们运行以下几行:
......
此差异已折叠。
......@@ -248,7 +248,7 @@ avgRating
由于这个原因,存在降维技术以找到一种将高维信息还原为低维信息的方法。 这不仅可以使查看和分类变得更加容易,而且对于诸如压缩数据之类的事情也很有用。 因此,通过保留最大的方差量,同时减少维度的数量,我们可以更紧凑地表示数据集。 降维的一个非常普遍的应用不仅是可视化,而且还用于压缩和特征提取。 我们稍后再讨论。
降维的一个非常简单的例子可以认为是 k 均值聚类:
降维的一个非常简单的例子可以认为是 K 均值聚类:
![](img/8b8a47d6-5330-471d-b6c9-e36d861d9247.png)
......
......@@ -63,7 +63,7 @@
1. 我们没有将数据分为两个存储桶,一个用于训练,一个用于测试,而是将其分为 K 个存储桶。
2. 我们保留其中一个存储桶用于测试目的,以评估模型的结果。
3. 我们针对剩余的 K-1 桶对模型进行训练,然后获取测试数据集,并使用该数据集来评估模型在所有这些不同训练数据集中的表现。
4. 我们将这些结果误差度量(即那些 r 平方值)平均,以从 k 倍交叉验证中获得最终误差度量。
4. 我们将这些结果误差度量(即那些 R 平方值)平均,以从 k 倍交叉验证中获得最终误差度量。
仅此而已。 这是一种进行训练/测试的更强大的方法,而这也是一种方法。
......
......@@ -719,7 +719,7 @@ spark-submit SparkDecisionTree.py
# Spark 中的 K 均值聚类
好吧,让我们看一下在 MLlib 中使用 Spark 的另一个示例,这一次我们将研究 k 均值聚类,就像我们对决策树所做的一样,我们将采用与使用决策树相同的示例 scikit-learn,我们将改为在 Spark 中进行,因此它实际上可以扩展到海量数据集。 因此,再次,我确保将所有其他内容都排除在外,并且我将进入我的书中,并打开`SparkKMeans` Python 脚本,让我们研究发生了什么。
好吧,让我们看一下在 MLlib 中使用 Spark 的另一个示例,这一次我们将研究 K 均值聚类,就像我们对决策树所做的一样,我们将采用与使用决策树相同的示例 scikit-learn,我们将改为在 Spark 中进行,因此它实际上可以扩展到海量数据集。 因此,再次,我确保将所有其他内容都排除在外,并且我将进入我的书中,并打开`SparkKMeans` Python 脚本,让我们研究发生了什么。
![](img/375a2436-ca5b-41bf-94d4-a80bedf814e1.png)
......@@ -743,7 +743,7 @@ from sklearn.preprocessing import scale
```
在本示例中,我将使用 k 为 5 的 k-means 聚类,即五个不同的聚类。 然后,我将继续设置仅在我自己的桌面上运行的本地`SparkConf`
在本示例中,我将使用 k 为 5 的 K 均值聚类,即五个不同的聚类。 然后,我将继续设置仅在我自己的桌面上运行的本地`SparkConf`
```py
conf = SparkConf().setMaster("local").setAppName("SparkKMeans")
......@@ -758,8 +758,8 @@ data = sc.parallelize(scale(createClusteredData(100, K)))
```
1. 我们要做的第一件事是通过并行化我正在创建的一些虚假数据来创建 RDD,这就是`createClusteredData`函数的作用。 基本上,我要告诉您创建围绕 K 个质心聚类的 100 个数据点,这与我们在本书前面介绍 k-均值聚类时所看的代码几乎相同。 如果需要复习,请继续阅读该章。 基本上,我们要做的是创建一堆随机质心,通常我们会围绕这些质心分发年龄和收入数据。 因此,我们正在尝试根据人们的年龄和收入对他们进行聚类,并且我们正在构造一些数据点来实现此目的。 这将返回我们假数据的`numpy`数组。
2.`createClusteredData`返回该结果后,我将其命名为`scale`,这将确保我的年龄和收入处于可比的范围内。 现在,还记得我们研究过的那一部分,您必须记住有关数据标准化的内容吗? 这是重要的示例之一,因此我们正在使用`scale`对该数据进行归一化,以便从 k 均值中获得良好的结果。
1. 我们要做的第一件事是通过并行化我正在创建的一些虚假数据来创建 RDD,这就是`createClusteredData`函数的作用。 基本上,我要告诉您创建围绕 K 个质心聚类的 100 个数据点,这与我们在本书前面介绍 K 均值聚类时所看的代码几乎相同。 如果需要复习,请继续阅读该章。 基本上,我们要做的是创建一堆随机质心,通常我们会围绕这些质心分发年龄和收入数据。 因此,我们正在尝试根据人们的年龄和收入对他们进行聚类,并且我们正在构造一些数据点来实现此目的。 这将返回我们假数据的`numpy`数组。
2.`createClusteredData`返回该结果后,我将其命名为`scale`,这将确保我的年龄和收入处于可比的范围内。 现在,还记得我们研究过的那一部分,您必须记住有关数据标准化的内容吗? 这是重要的示例之一,因此我们正在使用`scale`对该数据进行归一化,以便从 K 均值中获得良好的结果。
3. 最后,我们使用`parallelize`将数组的结果列表并行化为 RDD。 现在,我们的数据 RDD 包含我们所有的假数据。 我们要做的就是比我们的决策树更容易做,就是在训练数据上调用`KMeans.train`
```py
......@@ -779,7 +779,7 @@ resultRDD = data.map(lambda point: clusters.predict(point)).cache()
```
该功能只是将每个点转换为根据我们的模型预测的聚类数。 同样,我们只是采用数据点的 RDD。 我们正在调用`clusters.predict`来确定我们的 k 均值模型将它们分配给哪个集群,然后将结果放入`resultRDD`中。 现在,我想在这里指出的一件事是上述代码中的此缓存调用。
该功能只是将每个点转换为根据我们的模型预测的聚类数。 同样,我们只是采用数据点的 RDD。 我们正在调用`clusters.predict`来确定我们的 K 均值模型将它们分配给哪个集群,然后将结果放入`resultRDD`中。 现在,我想在这里指出的一件事是上述代码中的此缓存调用。
在执行 Spark 时,重要的一点是,每当您要在 RDD 上调用多个动作时,首先对其进行缓存很重要,因为当您在 RDD 上调用动作时,Spark 会熄灭并弄清楚 DAG,以及如何最佳地获得该结果。
......@@ -826,7 +826,7 @@ print("Within Set Sum of Squared Error = " + str(WSSSE))
* 我们介绍了`reduce`功能的使用。
* 在这里,我们还有几个有趣的映射器函数,因此在此示例中有很多东西可以学习。
归根结底,它将仅进行 k-means 聚类,因此让我们继续运行它。
归根结底,它将仅进行 K 均值聚类,因此让我们继续运行它。
# 运行代码
......@@ -845,7 +845,7 @@ spark-submit SparkKMeans.py
接下来,我们打印出每个点的聚类分配,并且,如果您还记得的话,构成该数据的原始数据是按顺序进行的,因此,将所有 3 个和所有 1 个一起查看实际上是一件好事 ,以及所有 4s 在一起,看起来好像开始与 0s 和 2s 有点混淆了,但是总的来说,它似乎非常好地发现了我们最初创建数据的集群。
最后,我们计算了 WSSSE 指标,在本示例中为 19.97。 因此,如果您想稍微尝试一下,我鼓励您这样做。 您可以看到随着增加或减小 K 值,该错误度量会发生什么,并思考为什么会这样。 如果不对所有数据进行归一化,您还可以尝试发生什么,这是否会对您的结果产生有意义的影响? 这实际上是一件重要的事情吗? 您还可以在模型本身上使用`maxIterations`参数进行试验,从而很好地了解实际对最终结果的影响以及它的重要性。 因此,可以随意使用它并进行实验。 这是使用 MLlib 和 Spark 以可扩展方式完成的 k-均值聚类。 很酷的东西。
最后,我们计算了 WSSSE 指标,在本示例中为 19.97。 因此,如果您想稍微尝试一下,我鼓励您这样做。 您可以看到随着增加或减小 K 值,该错误度量会发生什么,并思考为什么会这样。 如果不对所有数据进行归一化,您还可以尝试发生什么,这是否会对您的结果产生有意义的影响? 这实际上是一件重要的事情吗? 您还可以在模型本身上使用`maxIterations`参数进行试验,从而很好地了解实际对最终结果的影响以及它的重要性。 因此,可以随意使用它并进行实验。 这是使用 MLlib 和 Spark 以可扩展方式完成的 K 均值聚类。 很酷的东西。
# 特遣部队
......
......@@ -24,7 +24,7 @@
第 9 章和“使用集成模型推展边界”使您熟悉集成技术,该技术用于组合多个模型的功能以增强预测的准确性。 这样做是因为有时单个模型不足以估计结果。
第 10 章和“将分段与 k-means 聚类一起应用”教您有关 k-means 聚类及其使用方法。 细分在行业中广泛用于将相似的客户分组在一起。
第 10 章和“将分段与 K 均值聚类一起应用”教您有关 K 均值聚类及其使用方法。 细分在行业中广泛用于将相似的客户分组在一起。
第 11 章和“使用文本挖掘分析非结构化数据”,教您处理非结构化数据并弄清它们。 世界上非结构化数据比结构化数据更多。
......
......@@ -52,7 +52,7 @@
这是本章将介绍的无监督机器学习算法的一些示例,在以下各章中将详细介绍其中一些:
1. k 均值聚类
1. K 均值聚类
2. 层次聚类
## 强化学习
......@@ -224,13 +224,13 @@ P(A1 | B) = 0.065
朴素的贝叶斯在电子邮件过滤中大量使用。 它采用电子邮件中每个单词的实例,并计算电子邮件是否为垃圾邮件的概率。 朴素的贝叶斯模型从以前的电子邮件历史中学习,并将邮件标记为垃圾邮件,这有助于得出有关电子邮件是否为垃圾邮件的结论。
# k 均值聚类
# K 均值聚类
k 均值聚类是一种无监督的学习技术,有助于将`n`观测值的数据划分为相似观测值的`K`桶。
K 均值聚类是一种无监督的学习技术,有助于将`n`观测值的数据划分为相似观测值的`K`桶。
![The k-means clustering](img/B03450_05_10.jpg)
之所以称其为聚类算法,是因为它通过计算特征的均值来进行操作,这些均值是指我们对事物进行聚类的因变量,例如根据平均交易量和每季度购买的平均产品数量对客户进行细分 一年 然后,该平均值成为群集的中心。`K`数是指簇数,即,通过计算均值`K`数,从而导致周围数据的*聚类*组成的技术 这些 k 均值。
之所以称其为聚类算法,是因为它通过计算特征的均值来进行操作,这些均值是指我们对事物进行聚类的因变量,例如根据平均交易量和每季度购买的平均产品数量对客户进行细分 一年 然后,该平均值成为群集的中心。`K`数是指簇数,即,通过计算均值`K`数,从而导致周围数据的*聚类*组成的技术 这些 K 均值。
我们如何选择这个 K? 如果我们对所要寻找的东西有所了解,或者期望或想要多少个集群,那么在启动引擎并让算法进行计算之前,将`K`设置为该数字。
......@@ -240,9 +240,9 @@ k 均值聚类是一种无监督的学习技术,有助于将`n`观测值的数
`||x[i] - v[j]||``xi``vj`的欧几里德距离。 `c[i]`是第`i`个群集的数据点的数量,`c`是群集中心的数量。
k 均值聚类广泛用于计算机视觉,市场细分,天文学,地统计学和农业。
K 均值聚类广泛用于计算机视觉,市场细分,天文学,地统计学和农业。
k 均值聚类将在后面的章节中更详细地介绍,并带有实际示例。
K 均值聚类将在后面的章节中更详细地介绍,并带有实际示例。
# 分层聚类
......
......@@ -288,7 +288,7 @@ OLS 函数有助于创建具有因变量和自变量的线性回归对象。 `fi
![Training and testing a model](img/3450_06_12.jpg)
我们可以看到变量变小了,并且 r 平方值真的变低了。 可以使用变量的不同组合多次迭代前面的模型,直到获得最佳模型。
我们可以看到变量变小了,并且 R 平方值真的变低了。 可以使用变量的不同组合多次迭代前面的模型,直到获得最佳模型。
让我们将两个模型应用于测试数据,并查看实际值和预测值之间的均方误差。 给出最小均方误差的模型是一个好的模型:
......@@ -370,7 +370,7 @@ Intercept is 15.5129271596
系数和截距类似于使用 statsmodels 软件包构建的模型。
为了计算 SciKit 中的 r 平方,使用了 SciKit 包的交叉验证模块:
为了计算 SciKit 中的 R 平方,使用了 SciKit 包的交叉验证模块:
```py
>>> cross_validation.cross_val_score(lm, X_train, y_train, scoring='r2')
......
......@@ -97,7 +97,7 @@ Logistic 回归是一种回归分析,可帮助您根据某些给定参数估
![Building a model](img/B03450_07_02.jpg)
我们可以看到,最大似然估计已用于预测系数。 伪 r 平方类似于线性回归的 r 平方,用于测量它的优度。 如果我们得到`0.33`的值,则认为`0.2``0.4`之间的伪 r 平方值是好的。
我们可以看到,最大似然估计已用于预测系数。 伪 R 平方类似于线性回归的 R 平方,用于测量它的优度。 如果我们得到`0.33`的值,则认为`0.2``0.4`之间的伪 R 平方值是好的。
从前面的表中,我们可以看到乘船的港口和父母/子女的数量是重要的预测因子,因为它们的 p 值高于`0.05`
......
# 第 10 章。通过 k-means 聚类应用细分
# 第 10 章。通过 K 均值聚类应用细分
聚类属于无监督学习,有助于以一种使组中的实例具有相似特征的方式将一个实例划分为多个组。 亚马逊可能想了解他们的高价值,中价值和低价值用户是谁。 以最简单的形式,我们可以通过将每个用户的总交易金额存储在三个存储桶中来确定这一点。 高价值客户将排在前 20% 的百分比范围内,中值客户将排在第 20 至 80% 的百分比范围内,而最低 20% 的百分比将包含低价值客户。 亚马逊将由此了解他们的高价值客户,并确保在发生某些情况(例如交易付款失败)时会照顾他们。 在这里,我们使用了一个变量,例如交易金额,并且我们手动存储了数据。
我们需要一种算法,该算法可以采用多个变量,并可以帮助我们进行存储分区实例。 k 均值是执行聚类的最流行算法之一,因为它是在聚类下最容易理解的机器学习算法。 此外,细分是将客户分为多个组的过程,而聚类是一种有助于发现组中相似点并帮助将客户分配给特定组的技术。
我们需要一种算法,该算法可以采用多个变量,并可以帮助我们进行存储分区实例。 K 均值是执行聚类的最流行算法之一,因为它是在聚类下最容易理解的机器学习算法。 此外,细分是将客户分为多个组的过程,而聚类是一种有助于发现组中相似点并帮助将客户分配给特定组的技术。
在本章中,您将学习以下主题:
* 通过 k 均值技术确定理想的簇数
*k-均值算法聚类
* 通过 K 均值技术确定理想的簇数
*K 均值算法聚类
# k-means 算法及其工作
k 均值聚类算法通过计算特征的平均值(例如我们用于聚类的变量)来进行操作。 例如,根据平均交易金额和每季度购买的平均产品数量对客户进行细分。 然后,这意味着成为群集的中心。`K`数是聚类数,也就是说,该技术包含计算`K`数的均值,这些均数导致围绕这些 k 均值的数据聚类。
K 均值聚类算法通过计算特征的平均值(例如我们用于聚类的变量)来进行操作。 例如,根据平均交易金额和每季度购买的平均产品数量对客户进行细分。 然后,这意味着成为群集的中心。`K`数是聚类数,也就是说,该技术包含计算`K`数的均值,这些均数导致围绕这些 K 均值的数据聚类。
我们如何选择`K`? 如果我们对所要寻找的东西有所了解,或者期望或想要多少个集群,则可以在启动引擎并进行算法计算之前将`K`设置为该数字。
如果我们不知道有多少个集群,那么我们的探索将花费更长的时间并涉及一些反复试验,例如,当我们尝试`K = 3``4`时, 和`5`
k 均值算法是迭代的。 首先从数据中随机选择`K`点,然后将它们用作聚类中心。 然后,在每个迭代步骤中,此算法都会确定哪些行值最接近聚类中心,并为其分配`K`点。
K 均值算法是迭代的。 首先从数据中随机选择`K`点,然后将它们用作聚类中心。 然后,在每个迭代步骤中,此算法都会确定哪些行值最接近聚类中心,并为其分配`K`点。
完成此操作后,我们便有了新的积分安排。 因此,由于聚类的中心或均值可能已更改,因此再次对其进行了计算。 什么时候不转移? 当我们拥有稳定的集群并且进行迭代直到无法从进一步迭代中受益时,这就是我们的结果。
在某些情况下 k 均值不会收敛,也就是说,没有稳定的簇,但在这里我们不做讨论。 您可以在[这个页面](http://webdocs.cs.ualberta.ca/~nray1/CMPUT466_551/kmeans_convergence.pdf)上进一步了解 k 均值的收敛性。
在某些情况下 K 均值不会收敛,也就是说,没有稳定的簇,但在这里我们不做讨论。 您可以在[这个页面](http://webdocs.cs.ualberta.ca/~nray1/CMPUT466_551/kmeans_convergence.pdf)上进一步了解 K 均值的收敛性。
## 一个简单的例子
在进入 k 均值聚类之前,让我们看一个简单的示例。 我们将在以下各列中使用 T 恤尺寸的数据集:
在进入 K 均值聚类之前,让我们看一个简单的示例。 我们将在以下各列中使用 T 恤尺寸的数据集:
* `Size`:这是指 T 恤的尺寸
* `Height`:这是指一个人的身高
......@@ -78,7 +78,7 @@ k 均值算法是迭代的。 首先从数据中随机选择`K`点,然后将
您会看到尺寸小的人,例如身材矮小,身高矮,体重轻且呈蓝色。 类似地,对于其他 T 恤尺寸,人的身高和体重彼此围绕在一起。
在前面的案例中,我们为 T 恤尺寸设置了标签。 但是,如果我们没有随身携带的 T 恤尺寸,而是拥有个人的身高和体重,而我们想根据身高和体重来估算尺寸,那么这就是 k 均值算法可以帮助我们的地方:
在前面的案例中,我们为 T 恤尺寸设置了标签。 但是,如果我们没有随身携带的 T 恤尺寸,而是拥有个人的身高和体重,而我们想根据身高和体重来估算尺寸,那么这就是 K 均值算法可以帮助我们的地方:
```py
>>> from math import sqrt
......@@ -104,7 +104,7 @@ S 0 15 0
```
我们根据已知的 T 恤尺寸在 k 均值算法中假设了三个聚类(稍后我们将讨论如何确定聚类的数量),然后在“平均长度”中输入身高和体重 k-均值算法。 发布之后,我们将预测存储桶并将这些存储桶分配给`SizePredict`变量。 然后,我们查看实际值与预测值之间的混淆矩阵,以了解预测存储桶所属的位置。 我们可以看到`0`桶属于`L`衬衫尺寸,`1`属于`S``2`属于`M`。 现在,将桶映射回 T 恤尺寸并绘制散点图:
我们根据已知的 T 恤尺寸在 K 均值算法中假设了三个聚类(稍后我们将讨论如何确定聚类的数量),然后在“平均长度”中输入身高和体重 K 均值算法。 发布之后,我们将预测存储桶并将这些存储桶分配给`SizePredict`变量。 然后,我们查看实际值与预测值之间的混淆矩阵,以了解预测存储桶所属的位置。 我们可以看到`0`桶属于`L`衬衫尺寸,`1`属于`S``2`属于`M`。 现在,将桶映射回 T 恤尺寸并绘制散点图:
```py
>>> c_map = {
......@@ -145,9 +145,9 @@ Name: SizePredict, dtype: object
![A simple example](img/3450_10_02.jpg)
从图中可以看出,k 均值算法能够将人们分类到适当的存储桶中,其中衬衫尺寸可用于将存储桶识别为唯一的存储桶。
从图中可以看出,K 均值算法能够将人们分类到适当的存储桶中,其中衬衫尺寸可用于将存储桶识别为唯一的存储桶。
# 与国家/地区的 k 均值聚类
# 与国家/地区的 K 均值聚类
我们拥有有关世界不同国家/地区有关人员接受国内生产总值教育的联合国数据。 我们将使用这些数据根据国家/地区的发展对其进行分类。 以下是各列的说明:
......@@ -221,7 +221,7 @@ dtype: float64
## 确定簇数
在应用 k 均值算法之前,我们想估计一个理想的集群数量到称为国家的组:
在应用 K 均值算法之前,我们想估计一个理想的集群数量到称为国家的组:
```py
>>> K = range(1,10)
......@@ -233,7 +233,7 @@ dtype: float64
```
在前面的代码中,我们定义了 1 到 10 之间的多个簇。使用 SciPy 库的 **k 均值函数**,我们计算了质心以及这些质心之间的失真以及与所计算的失真相关的观测值 在质心和群集的观测值之间:
在前面的代码中,我们定义了 1 到 10 之间的多个簇。使用 SciPy 库的 **K 均值函数**,我们计算了质心以及这些质心之间的失真以及与所计算的失真相关的观测值 在质心和群集的观测值之间:
```py
>>> euclidean_centroid = [cdist(df.values, centroid, 'euclidean') for (centroid,var) in k_clusters]
......@@ -308,7 +308,7 @@ dtype: float64
数组中的每个值都是平方的平均和,该平方具有一个群集到一组十个群集。
现在,我们使用以下数据绘制 k 均值聚类的**肘形曲线**(这是曲线开始展平的点):
现在,我们使用以下数据绘制 K 均值聚类的**肘形曲线**(这是曲线开始展平的点):
```py
>>> #Choosing the cluster number
......
......@@ -62,9 +62,9 @@
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
* Windows 的 WinRAR / 7-Zip
* Mac 版 Zipeg / iZip / UnRarX
* 适用于 Linux 的 7-Zip / PeaZip
* Windows 的 WinRAR/7-Zip
* Mac 版 Zipeg/iZip/UnRarX
* 适用于 Linux 的 7-Zip/PeaZip
本书的代码包也托管在[这个页面](https://github.com/PacktPublishing/Python-Data-Science-Essentials-Third-Edition)。 如果代码有更新,它将在现有的 GitHub 存储库中进行更新。
......
......@@ -366,7 +366,7 @@ Out: Community 0
[...] Modularity score: 0.7941026425874911
```
程序的第一个输出是图中检测到的社区列表(每个社区都是节点的集合)。 在这种情况下,该算法检测到八个组。 我们想强调的是,我们没有指定要查找的输出社区的数量,但是它是由算法自动确定的。 这是并非所有聚类算法都具有的理想功能(例如,k 均值需要聚类数作为参数)。
程序的第一个输出是图中检测到的社区列表(每个社区都是节点的集合)。 在这种情况下,该算法检测到八个组。 我们想强调的是,我们没有指定要查找的输出社区的数量,但是它是由算法自动确定的。 这是并非所有聚类算法都具有的理想功能(例如,K 均值需要聚类数作为参数)。
然后,我们打印了图,为每个社区分配了不同的颜色。 您可以看到边缘节点上的颜色非常均匀:
......
......@@ -147,9 +147,9 @@ PixieGateway 是一项突破性的创新,具有可以显着加快分析操作
下载文件后,请确保使用以下最新版本解压缩或解压缩文件夹:
* 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/Thoughtful-Data-Science)。 我们还从[这个页面](https://github.com/PacktPublishing/)提供了丰富的书籍和视频目录中的其他代码包。 去看一下!
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册