提交 c5290276 编写于 作者: W wizardforcel

2021-03-05 22:59:54

上级 ad0514d8
......@@ -392,7 +392,7 @@ K 均值聚类是机器学习中一种非常普遍的技术,您仅尝试获取
这显示了一个用 K 为 3 的 K 均值聚类的示例,并且正方形表示散点图中的数据点。 圆圈表示 K 均值聚类算法得出的质心,并且根据每个点最接近的质心为其分配了一个聚类。 真的,这就是全部。 这是无监督学习的一个例子。 在这种情况下,我们不会拥有大量数据,而对于给定的一组训练数据,我们已经知道正确的群集; 相反,您只是获得了数据本身,并且仅基于数据的属性就尝试自然地在这些群集上收敛。 这也是一个示例,其中您尝试查找甚至都不知道的集群或分类。 与大多数无监督学习技术一样,关键是要找到潜值,直到算法向您展示它们之前,您才真正意识到它们。
例如,百万富翁住在哪里? 我不知道,也许有一些富人倾向于居住的有趣的地理集群,而 K 均值集群可以帮助您弄清楚这一点。 也许我真的不知道今天的音乐类型是否有意义。 这些天替代是什么意思? 不多吧? 但是通过对歌曲属性使用 K 均值聚类,也许我可以找到彼此相关的有趣的歌曲聚类,并为这些聚类表示的名称命名。 或者,也许我可以查看人口统计数据,也许现有的刻板印象不再有用。 也许西班牙裔失去了意义,实际上还有其他一些属性可以定义人群,例如,我可以通过聚类来发现。 听起来不错,不是吗? 真的很复杂的东西。 用 K 集群进行无监督的机器学习,听起来很花哨,但是和大多数数据科学技术一样,这实际上是一个非常简单的想法。
例如,百万富翁住在哪里? 我不知道,也许有一些富人倾向于居住的有趣的地理集群,而 K 均值聚类可以帮助您弄清楚这一点。 也许我真的不知道今天的音乐类型是否有意义。 这些天替代是什么意思? 不多吧? 但是通过对歌曲属性使用 K 均值聚类,也许我可以找到彼此相关的有趣的歌曲聚类,并为这些聚类表示的名称命名。 或者,也许我可以查看人口统计数据,也许现有的刻板印象不再有用。 也许西班牙裔失去了意义,实际上还有其他一些属性可以定义人群,例如,我可以通过聚类来发现。 听起来不错,不是吗? 真的很复杂的东西。 用 K 集群进行无监督的机器学习,听起来很花哨,但是和大多数数据科学技术一样,这实际上是一个非常简单的想法。
这是简单的英语算法:
......@@ -420,7 +420,7 @@ K 均值聚类是机器学习中一种非常普遍的技术,您仅尝试获取
1. **选择 K**:首先,我们需要选择正确的 K 值,这根本不是一件容易的事情。 选择 K 的主要方法是从低开始,并根据想要的组数不断增加 K 的值,直到不再大幅度减少平方误差为止。 如果查看每个点到其质心的距离,可以将其视为误差度量。 在停止减少该错误指标的那一刻,您知道您可能有太多的群集。 因此,此时您无法通过添加其他集群真正获得任何更多信息。
2. **避免局部最小值**:此外,存在局部最小值的问题。 您可能会对最初选择的质心感到非常不走运,而且它们最终可能只收敛于局部现象,而不是更多的全局簇,因此通常,您需要运行几次并可能求平均结果。 我们称这种集成学习。 我们稍后再讨论,但是使用一组不同的随机初始值多次运行 K 均值总是一个好主意,只是看看您是否最终得到相同的总体结果 或不。
3. **标记群集**:最后,K 均值集群的主要问题是没有针对您获得的集群的标签。 它只会告诉您这组数据点在某种程度上是相关的,但是您不能在上面加上名称。 它无法告诉您该群集的实际含义。 假设我正在看一堆电影,并且 K 均值聚类告诉我这堆科幻电影就在这里,但我不会将它们称为“科幻”电影。 我要真正去研究数据并弄清楚,这些东西到底有什么共同点? 我怎么用英语来描述? 那是最困难的部分,而 K 均值并不能帮助您。 再次说明,scikit-learn 使执行此操作变得非常容易。
3. **标记群集**:最后,K 均值聚类的主要问题是没有针对您获得的集群的标签。 它只会告诉您这组数据点在某种程度上是相关的,但是您不能在上面加上名称。 它无法告诉您该群集的实际含义。 假设我正在看一堆电影,并且 K 均值聚类告诉我这堆科幻电影就在这里,但我不会将它们称为“科幻”电影。 我要真正去研究数据并弄清楚,这些东西到底有什么共同点? 我怎么用英语来描述? 那是最困难的部分,而 K 均值并不能帮助您。 再次说明,scikit-learn 使执行此操作变得非常容易。
现在让我们来看一个例子,将 K 均值聚类付诸实践。
......
......@@ -385,7 +385,7 @@ rdd.map(lambda x: x*x)
因此,即使其中的一些操作不是很有趣,但有趣的是它可以运行的规模。 它还可以支持线性回归和逻辑回归等功能,因此,如果您需要将函数拟合到大量数据并将其用于预测,则也可以这样做。 它还支持支持向量机。 我们将在这里介绍一些更高级的算法,一些更高级的算法,并且它们也可以使用 Spark 的 MLlib 扩展到海量数据集。 MLlib 中内置了一个朴素的贝叶斯分类器,因此,还记得我们在本书前面构建的垃圾邮件分类器吗? 实际上,您可以使用 Spark 在整个电子邮件系统中执行此操作,然后将其扩展到所需的范围。
决策树,这是我在机器学习中最喜欢的东西之一,也得到了 Spark 的支持,我们实际上将在本章的后面有一个示例。 我们还将研究 K 均值集群,您可以使用 K 均值和带有 Spark 和 MLlib 的海量数据集进行集群。 甚至主成分分析和 **SVD****奇异值分解**)也可以通过 Spark 进行,我们也将提供一个示例。 最后,MLlib 内置了一个内置的推荐算法,称为最小二乘。 就我个人而言,它的结果有些复杂,就我的口味而言,它有点像一个黑匣子,但是我是一个推荐系统势利小人,所以带一点盐就可以了!
决策树,这是我在机器学习中最喜欢的东西之一,也得到了 Spark 的支持,我们实际上将在本章的后面有一个示例。 我们还将研究 K 均值聚类,您可以使用 K 均值和带有 Spark 和 MLlib 的海量数据集进行集群。 甚至主成分分析和 **SVD****奇异值分解**)也可以通过 Spark 进行,我们也将提供一个示例。 最后,MLlib 内置了一个内置的推荐算法,称为最小二乘。 就我个人而言,它的结果有些复杂,就我的口味而言,它有点像一个黑匣子,但是我是一个推荐系统势利小人,所以带一点盐就可以了!
# 特殊 MLlib 数据类型
......
......@@ -52,7 +52,7 @@ y = A + Bx
![Simple linear regression](img/3450_06_02.jpg)
我们可以清楚地看到,基于 0 的 Pearson 相关值系数,身高和体重之间存在明显的相关性。94\. Pearson 相关性的范围是-1 到+1,因此当数字更大时 正值表示,如果两个变量一起增加或减小,则它们之间的关系要强得多。 如果相关值为负,则两个变量之间的关系很强,但方向相反。
我们可以清楚地看到,基于 0 的 Pearson 相关值系数,身高和体重之间存在明显的相关性。94\. Pearson 相关性的范围是 -1 到 +1,因此当数字更大时 正值表示,如果两个变量一起增加或减小,则它们之间的关系要强得多。 如果相关值为负,则两个变量之间的关系很强,但方向相反。
让我们生成一个线性回归模型,权重为因变量,x 为自变量:
......@@ -76,7 +76,7 @@ Coefficient value of the height is [ 1.00092142]
![Simple linear regression](img/3450_06_03.jpg)
在前面的代码中,我们使用`linear_model.LinearRegression()`创建线性回归对象 lm。 然后,我们使用`lm``fit()`方法定义因变量和自变量,在我们的示例中,`weight`是因变量,`height`是自变量。
在前面的代码中,我们使用`linear_model.LinearRegression()`创建线性回归对象`lm`。 然后,我们使用`lm``fit()`方法定义因变量和自变量,在我们的示例中,`weight`是因变量,`height`是自变量。
要获取截距值,请使用`lm.intercept_`,并要获取系数,请使用`lm.coef`
......
......@@ -14,8 +14,8 @@ Logistic 回归是一种回归分析,可帮助您根据某些给定参数估
这是泰坦尼克号数据集的字段描述的回顾:
* `Survival`:这是指乘客的生存(`0` =否,`1` =是)
* `Pclass`:这指的是乘客等级(`1` = 1st,`2` = 2nd,`3` = 3rd
* `Survival`:这是指乘客的生存(`0`:否,`1`是)
* `Pclass`:这指的是乘客等级(`1`:一等,`2`:二等,`3`:三等
* `Name`:这是指乘客的姓名
* `Sex`:这是指乘客的性别
* `Age`:这是指乘客的年龄
......@@ -24,7 +24,7 @@ Logistic 回归是一种回归分析,可帮助您根据某些给定参数估
* `Ticket`:这是票证编号
* `Fare`:这是指旅客票价
* `Cabin`:这是指客舱
* `Embarked`:此是指登船港口(C =瑟堡,Q =皇后镇,S =南安普敦)
* `Embarked`:此是指登船港口(`C`:瑟堡,`Q`:皇后镇,`S`南安普敦)
## 数据准备
......@@ -60,7 +60,7 @@ Logistic 回归是一种回归分析,可帮助您根据某些给定参数估
在前面的代码中,我们删除了`Ticket``Cabin``Name`列,然后删除了缺少的值。
我们将使用名为 Patsy 的 Python 软件包,该软件包有助于描述统计模型。 它有助于定义与 R 相似的因变量和自变量公式。在[`~`]左侧定义的变量是因变量,在其右侧定义的变量是自变量。 `C()`中包含的变量被视为分类变量。
我们将使用名为 Patsy 的 Python 软件包,该软件包有助于描述统计模型。 它有助于定义与 R 相似的因变量和自变量公式。在`~`左侧定义的变量是因变量,在其右侧定义的变量是自变量。 `C()`中包含的变量被视为分类变量。
现在,我们将根据数据创建训练和测试集:
......@@ -254,10 +254,10 @@ Area under the ROC curve : 0.879934
以下是我们的一些观察结果:
* `False Positive``FP`):这是一个肯定的预测,实际上是错误的。 因此,在前面的交叉表中,`0`为假肯定
* `True Positive``TP`):这是一个肯定的预测,实际上是正确的。 因此,在前面的交叉表中,`24` True
* `True Negative``TN`):这是一个负面预测,实际上是正确的。 因此,在上述交叉表中,`67`为真负
* `False Negative``FN`):这是一个否定预测,实际上是错误的。 因此,在前面的交叉表中,`21` False Negative
* `False Positive``FP`):这是一个肯定的预测,实际上是错误的。 因此,在前面的交叉表中,`0`为假正例
* `True Positive``TP`):这是一个肯定的预测,实际上是正确的。 因此,在前面的交叉表中,`24`真正例
* `True Negative``TN`):这是一个负面预测,实际上是正确的。 因此,在上述交叉表中,`67`为真负
* `False Negative``FN`):这是一个否定预测,实际上是错误的。 因此,在前面的交叉表中,`21`假负例
因此,误报率告诉我们,在所有未幸存的人中,有百分之几被预测为幸存。 真实阳性率告诉我们,在所有幸存的人中,有百分之多少被预测为幸存了。 理想情况下,假阳性率应低,真阳性率应高。
......
......@@ -321,7 +321,7 @@ movie_user_preferences['William']['Gone Girl']
我们将相似性得分乘以每个用户的电影评分。 然后,我们将这个新分数相加,然后将其除以适用的相似性分数。 总而言之,我们将基于相似度分数得出加权平均值。
从前面的输出中,我们可以看到《 Gone Girl》在被推荐方面得分很高,然后是 Kill the Messenger。
从前面的输出中,我们可以看到《Gone Girl》在被推荐方面得分很高,然后是 Kill the Messenger。
现在,我们将创建一个函数,该函数将通过包含上述逻辑为用户生成推荐:
......
......@@ -35,7 +35,7 @@
| `gender` | 这是指一个人的性别 |
| `hours_per_week` | 这是指每周的平均工作时间 |
| `native_country` | 这是指原籍国 |
| `greater_than_50k` | 这是指一个标志,该标志指示一个人是否一年收入超过$ 50K |
| `greater_than_50k` | 这是指一个标志,该标志指示一个人是否一年收入超过50K 刀|
让我们加载以下数据:
......@@ -80,7 +80,7 @@ dtype: float64
### 假设 1:年龄较大的人收入更高
我们将创建一个直方图,说明收入超过$ 50K 的人:
我们将创建一个直方图,说明收入超过 50K 刀的人:
```py
>>> hist_above_50 = plt.hist(data[data.greater_than_50k == 1].age.values, 10, facecolor='green', alpha=0.5)
......@@ -106,11 +106,11 @@ dtype: float64
![Hypothesis 1: People who are older earn more](img/B03450_09_02.jpg)
我们可以看到,收入超过$ 50K 的人的年龄大多在 30 年代末至 50 年代中期,而收入低于$ 50K 的人则主要在 20 至 30 岁之间。
我们可以看到,收入超过 50K 刀的人的年龄大多在 30 年代末至 50 年代中期,而收入低于 50K 刀的人则主要在 20 至 30 岁之间。
### 假设 2:基于工人阶级的收入偏见
让我们看看,在不同的工人阶级群体中,收入超过$ 50K 的人的分布是什么。 我们将使用以下代码查看每个组中收入超过 5 万美元的收入者的百分比:
让我们看看,在不同的工人阶级群体中,收入超过 50K 刀的人的分布是什么。 我们将使用以下代码查看每个组中收入超过 5 万美元的收入者的百分比:
```py
>>> dist_data = pd.concat([data[data.greater_than_50k == 1].groupby('workclass').workclass.count()
......@@ -127,7 +127,7 @@ dtype: float64
![Hypothesis 2: Income bias based on working class](img/B03450_09_03.jpg)
我们看到,自营职业并拥有公司的人所获得的最大份额收入超过$ 50K。 就收入而言,第二富裕人群是联邦政府雇员。
我们看到,自营职业并拥有公司的人所获得的最大份额收入超过 50K 刀。 就收入而言,第二富裕人群是联邦政府雇员。
### 假设 3:受过更多教育的人收入更高
......@@ -256,7 +256,7 @@ dtype: float64
### 假设 8:钟表时间越长的人收入越高
让我们看看根据每周工作时间得出的收入超过$ 50K 的人群分布:
让我们看看根据每周工作时间得出的收入超过50K 刀的人群分布:
```py
>>> hist_above_50 = plt.hist(data[data.greater_than_50k == 1].hours_per_week.values, 10, facecolor='green', alpha=0.5)
......@@ -266,7 +266,7 @@ dtype: float64
![Hypothesis 8: People who clock in more hours earn more](img/B03450_09_09.jpg)
现在,让我们看看根据他们每周的工作时间得出的低于$ 50K 的收入者的分布:
现在,让我们看看根据他们每周的工作时间得出的低于50K 刀的收入者的分布:
```py
>>> hist_below_50 = plt.hist(data[data.greater_than_50k == 0].hours_per_week.values, 10, facecolor='green', alpha=0.5)
......@@ -276,7 +276,7 @@ dtype: float64
![Hypothesis 8: People who clock in more hours earn more](img/B03450_09_10.jpg)
我们可以看到,收入超过$ 50K 的人每周平均工作 40 小时,但是可以看出,收入超过$ 50K 的人有更多的工作时间, 40 小时
我们可以看到,收入超过50K 刀的人每周平均工作 40 小时,但是可以看出,收入超过50K 刀的人有更多的工作时间, 40 小时
### 假设 9:基于原籍国的收入存在偏差
......@@ -344,7 +344,7 @@ GPA 高且属于非常春藤盟校的申请人与 GPA 低且属于非常春藤
![Decision trees](img/B03450_09_12.jpg)
我们可以看到,收入不超过$ 50K 的人们可以得到很好的预测,其准确度为 85%,召回率为 87%。 收入超过$ 50K 的人只能以 56% 的准确度和 52% 的召回率来预测
我们可以看到,收入不超过50K 刀的人们可以得到很好的预测,其准确度为 85%,召回率为 87%。 收入超过50K 刀的人只能以 56% 的准确度和 52% 的召回率来预测
请注意,公式中给出的因变量的顺序将略微更改这些值。 您可以尝试查看更改变量的顺序是否会提高其精度/调用率。
......@@ -380,7 +380,7 @@ GPA 高且属于非常春藤盟校的申请人与 GPA 低且属于非常春藤
![Random forests](img/B03450_09_13.jpg)
我们可以看到,我们提高了收入和收入不超过$ 50K 的人的准确性和召回率。
我们可以看到,我们提高了收入和收入不超过50K 刀的人的准确性和召回率。
让我们尝试通过使用`min_samples_split`参数并将其设置为`5`来对进行微调,以使模型获得更好的性能。 此参数告诉我们创建拆分所需的最小样本数为`5`
......@@ -440,10 +440,10 @@ GPA 高且属于非常春藤盟校的申请人与 GPA 低且属于非常春藤
![Random forests](img/B03450_09_16.jpg)
我们可以看到,那些与平民配偶结婚的人可以很好地表明特定人群的收入是否超过 5 万美元。 接下来是人的年龄,最后是一个人每周工作的小时数。 此外,未婚人士是预测收入低于$ 50K 的人群的良好指标。
我们可以看到,那些与平民配偶结婚的人可以很好地表明特定人群的收入是否超过 5 万美元。 接下来是人的年龄,最后是一个人每周工作的小时数。 此外,未婚人士是预测收入低于50K 刀的人群的良好指标。
# 摘要
在本章中,我们探索了普查数据中的模式,然后了解了如何构建决策树,并且还基于给定的数据建立了决策树模型。 然后,您在随机森林的帮助下学习了集成模型的概念,并通过使用随机森林模型提高了预测的性能。
在下一章中,您将学习聚类,基本上是将彼此相似的元素分组在一起。 我们将为此使用 k-means 集群。
\ No newline at end of file
在下一章中,您将学习聚类,基本上是将彼此相似的元素分组在一起。 我们将为此使用 K 均值聚类。
\ No newline at end of file
......@@ -9,7 +9,7 @@
* 通过 K 均值技术确定理想的簇数
* 用 K 均值算法聚类
# k-means 算法及其工作
# K 均值算法及其工作
K 均值聚类算法通过计算特征的平均值(例如我们用于聚类的变量)来进行操作。 例如,根据平均交易金额和每季度购买的平均产品数量对客户进行细分。 然后,这意味着成为群集的中心。`K`数是聚类数,也就是说,该技术包含计算`K`数的均值,这些均数导致围绕这些 K 均值的数据聚类。
......@@ -342,7 +342,7 @@ dtype: float64
# 聚集国家
现在,我们将应用 k-means 算法将国家/地区聚在一起:
现在,我们将应用 K 均值算法将国家/地区聚在一起:
```py
>>> km = KMeans(3, init='k-means++', random_state = 3425) # initialize
......@@ -450,6 +450,6 @@ Name: GDPperCapita, dtype: float64
# 摘要
在本章中,使您了解了聚类的概念,并学习了一种称为 k-means 技术的无监督学习技术。 您还学习了如何在使用 k-means 分割数据之前确定群集的数量,最后,您看到了使用 k-means 群集的结果。
在本章中,使您了解了聚类的概念,并学习了一种称为 K 均值技术的无监督学习技术。 您还学习了如何在使用 K 均值分割数据之前确定群集的数量,最后,您看到了使用 K 均值群集的结果。
在下一章中,您将学习如何探索非结构化数据以及如何在非结构化数据上使用文本挖掘技术。
\ No newline at end of file
......@@ -5,7 +5,7 @@
在本章中,我们将学习以下内容:
* 预处理数据
* 从数据绘制 Wordcloud
* 从数据绘制词云
* 单词和句子分词
* 标记词性
* 词干和词条去除
......@@ -108,11 +108,11 @@
```
# 创建 wordcloud
# 创建`wordcloud`
worldcloud 是单词的拼贴,而大小较大的单词的出现频率很高。
`worldcloud`是单词的拼贴,而大小较大的单词的出现频率很高。
如果使用 Ubuntu,则可以使用以下命令下载 wordcloud
如果使用 Ubuntu,则可以使用以下命令下载`wordcloud`
```py
$ pip install git+git://github.com/amueller/word_cloud.git
......@@ -121,7 +121,7 @@ $ pip install git+git://github.com/amueller/word_cloud.git
您可以通过参考[这个页面](https://github.com/amueller/word_cloud)遵循说明进行操作。
让我们使用以下代码为 BBC 绘制 wordcloud
让我们使用以下代码为 BBC 绘制`wordcloud`
```py
>>> wordcloud = WordCloud(width = 1000, height = 500).generate(' '.join(data['bbc']))
......@@ -138,9 +138,9 @@ $ pip install git+git://github.com/amueller/word_cloud.git
![Creating a wordcloud](img/B03450_11_05.jpg)
从前面的 wordcloud 中,我们可以发现,提到了 80 年代的 Mad Max 和当前的 Mad Max 之间的持续时间长。 本文讨论了梅尔·吉布森(Mel Gibson),汽车和小人 Immortan Joe,因为它们是最常出现的关键字。 还强调了*一个*关键字给出的电影的不同方面。
从前面的`wordcloud`中,我们可以发现,提到了 80 年代的 Mad Max 和当前的 Mad Max 之间的持续时间长。 本文讨论了梅尔·吉布森(Mel Gibson),汽车和小人 Immortan Joe,因为它们是最常出现的关键字。 还强调了*一个*关键字给出的电影的不同方面。
现在,通过使用以下代码,让我们看看对于 Forbes 而言,wordcloud 的样子:
现在,通过使用以下代码,让我们看看对于 Forbes 而言,`wordcloud`的样子:
```py
>>> wordcloud = WordCloud(width = 1000, height = 500).generate(' '.join(data['forbes']))
......@@ -174,7 +174,7 @@ $ pip install git+git://github.com/amueller/word_cloud.git
监护人强调妇女和水。 如果您看过电影,那么您会了解到 Guardian 强调女性角色及其荒地中缺水的情况。
最后,这是 moviepilot 的单词 cloud 的样子:
最后,这是 moviepilot 的词云的样子:
```py
>>> wordcloud = WordCloud(width = 1000, height = 500).generate(' '.join(data['moviepilot']))
......@@ -417,9 +417,9 @@ Actual: of Stem: of
词法化与词干相似,但与词干不同,它引入了词的上下文。
基于词形化的算法会将火车与单词机车匹配,但词干算法将无法做到这一点。 lemmatization 算法利用字典来链接单词。
基于词形化的算法会将火车与单词机车匹配,但词干算法将无法做到这一点。 词形还原算法利用字典来链接单词。
`WordNet` Princeton 的英语词汇数据库,我们将使用其词素化技术:
`WordNet`普林斯顿的英语词汇数据库,我们将使用其词素化技术:
```py
Actual: Pundits Lemma: Pundits
......
......@@ -32,7 +32,7 @@ Hadoop 是编程范例,它采用大型分布式计算作为对键/值对的大
在映射器阶段之后,Hadoop 按键对中间数据集进行排序,并生成一组键值元组,以便属于特定键的所有值都在一起。
reduce 阶段,reduce 接收中间键值对并调用用户定义的函数,然后该函数生成输出键值对。 Hadoop 在机器之间分配化简器,并为每个化简器分配一组键-值对。
归约阶段,归约接收中间键值对并调用用户定义的函数,然后该函数生成输出键值对。 Hadoop 在机器之间分配化简器,并为每个化简器分配一组键-值对。
![The programming model](img/3450_12_03.jpg)
......@@ -48,7 +48,7 @@ Hadoop 的分布式文件系统已设计为以分布式方式存储非常大的
## Hadoop 的 DFS 架构
它还具有主/从体系结构,其中 NameNode 是主计算机,而 DataNode 是从计算机。 实际数据存储在数据节点中。 NameNode 保留一个选项卡,用于存储某些类型的数据以及是否具有所需的复制。 它还通过创建,删除和移动文件系统中的目录和文件来帮助管理文件系统。
它还具有主/从体系结构,其中名称节点是主计算机,而数据节点是从计算机。 实际数据存储在数据节点中。名称节点保留一个选项卡,用于存储某些类型的数据以及是否具有所需的复制。 它还通过创建,删除和移动文件系统中的目录和文件来帮助管理文件系统。
# Python MapReduce
......@@ -238,7 +238,7 @@ not so much another bloated sequel as it is the fruition of dreams deferred in t
## 整体情感评分
要计算总体情感评分,我们需要使用 reducer,我们将使用相同的 mapper,但要进行一些修改。
要计算总体情感评分,我们需要使用归约器,我们将使用相同的映射器,但要进行一些修改。
这是我们将使用存储在`overall_senti_mapper.py`文件中的映射器代码:
......@@ -418,7 +418,7 @@ $ Hadoop jar /usr/lib/hadoop-0.20-mapreduce/contrib/streaming/hadoop-*streaming*
```
在前面的代码中,我们将 Hadoop 命令与 Hadoop 流 JAR 文件一起使用,然后定义映射器和 reducer 文件,最后定义 Hadoop 中的输入和输出目录。
在前面的代码中,我们将 Hadoop 命令与 Hadoop 流 JAR 文件一起使用,然后定义映射器和归约器文件,最后定义 Hadoop 中的输入和输出目录。
让我们检查一下电影评论的情感评分:
......@@ -563,7 +563,7 @@ DUMP top10_word_count;
```
在前面的代码中,我们可以加载 Moby Dick 的摘要,然后将其逐行分词,并基本上拆分成各个元素。 flatten 函数将一行中单个单词标记的集合转换为逐行形式。 然后,我们对单词进行分组,然后对每个单词进行单词计数。 最后,我们按降序对单词计数进行排序,然后将单词计数限制在前 10 行,以获取出现次数最多的前 10 个单词。
在前面的代码中,我们可以加载 Moby Dick 的摘要,然后将其逐行分词,并基本上拆分成各个元素。 `flatten`函数将一行中单个单词标记的集合转换为逐行形式。 然后,我们对单词进行分组,然后对每个单词进行单词计数。 最后,我们按降序对单词计数进行排序,然后将单词计数限制在前 10 行,以获取出现次数最多的前 10 个单词。
让我们执行前面的 Pig 脚本:
......@@ -640,7 +640,7 @@ dump average_sentiments;
```
在前面的 Pig 脚本中,我们首先使用 register 命令注册 Python UDF 脚本,并为其指定适当的名称。 然后,我们加载《侏罗纪世界》评论。 然后,我们将评论转换为小写形式,并对评论的正面和负面情感进行评分。 最后,我们添加分数以获得评论的总体感觉。
在前面的 Pig 脚本中,我们首先使用`register`命令注册 Python UDF 脚本,并为其指定适当的名称。 然后,我们加载《侏罗纪世界》评论。 然后,我们将评论转换为小写形式,并对评论的正面和负面情感进行评分。 最后,我们添加分数以获得评论的总体感觉。
让我们执行 Pig 脚本并查看结果:
......@@ -791,7 +791,7 @@ Total: 19
# 摘要
在本章中,向您介绍了大数据,了解了 Hadoop 软件的工作方式以及与之相关的架构。 然后,您学习了如何为 MapReduce 程序创建一个映射器和一个 reducer,如何在本地对其进行测试,然后将其放入 Hadoop 并进行部署。 然后,您被介绍到 Hadoopy 库中,并且使用该库,您能够将文件放入 Hadoop。 您还了解了 Pig 以及如何使用它创建用户定义的函数。 最后,您了解了 Apache Spark,它是 MapReduce 的替代品,以及如何使用它来执行分布式计算。
在本章中,向您介绍了大数据,了解了 Hadoop 软件的工作方式以及与之相关的架构。 然后,您学习了如何为 MapReduce 程序创建一个映射器和一个归约器,如何在本地对其进行测试,然后将其放入 Hadoop 并进行部署。 然后,您被介绍到 Hadoopy 库中,并且使用该库,您能够将文件放入 Hadoop。 您还了解了 Pig 以及如何使用它创建用户定义的函数。 最后,您了解了 Apache Spark,它是 MapReduce 的替代品,以及如何使用它来执行分布式计算。
在本章中,我们的旅程已经结束,您应该处于使用 Python 执行数据科学任务的状态。 从这里开始,您可以参加[这个页面](https://www.kaggle.com/)上的 Kaggle 竞赛,以提高您解决实际问题的数据科学技能。 这将微调您的技能,并帮助您了解如何解决分析问题。
......
......@@ -81,7 +81,7 @@ HDFS 的体系结构是主从结构。 如果主服务器(称为**名称节点
# MapReduce
**MapReduce** 是在 Hadoop 的最早版本中实现的编程模型。 这是一个非常简单的模型,旨在并行处理分布式群集上的大型数据集。 MapReduce 的核心由两个可编程功能组成:一个执行过滤的映射器和一个执行聚合的 reducer,以及一个将对象从映射器移动到正确的 reducer 的 shuffler。 Google 于 2004 年在 [MapReduce](https://ai.google/research/pubs/pub62) 上获得了专利,专利发表了几个月。
**MapReduce** 是在 Hadoop 的最早版本中实现的编程模型。 这是一个非常简单的模型,旨在并行处理分布式群集上的大型数据集。 MapReduce 的核心由两个可编程功能组成:一个执行过滤的映射器和一个执行聚合的归约器,以及一个将对象从映射器移动到正确的归约器的 shuffler。 Google 于 2004 年在 [MapReduce](https://ai.google/research/pubs/pub62) 上获得了专利,专利发表了几个月。
具体来说,这是 MapReduce 用于 Hadoop 实现的步骤:
......@@ -89,7 +89,7 @@ HDFS 的体系结构是主从结构。 如果主服务器(称为**名称节点
* **映射器**:从每个块中生成一系列键值对。 每个映射器实例将相同的映射函数应用于不同的数据块。 继续前面的示例,对于每一行,在此步骤中生成了三个键值对-一个键值对包含该行中的字符数(键可以简单地是*字符串*),其中一个包含单词个数(在这种情况下,密钥必须不同,所以假设是*单词*),其中一个包含行数,该行数始终为 1(在这种情况下,密钥可以是*行*)。
* **打乱器**:从可用键的数量和可用的化简器的数量,混洗器将具有相同键的所有键-值对分配给同一异化器。 通常,此操作是计算键的哈希值,将其除以精简器的数量,然后使用余数来指出特定的精简器。 这应确保每个异径管有足够数量的钥匙。 该功能不是用户可编程的,而是由 MapReduce 框架提供的。
* **归约器**:每个简化器都接收一组特定键的所有键值对,并且可以产生零个或多个聚合结果。 在该示例中,所有与*单词*键相关的值都到达简化器; 它的工作只是总结所有价值。 其他键也一样,这将产生三个最终值:字符数,单词数和行数。 请注意,这些结果可能在不同的减速器上。
* **输出编写器**:减速器的输出写在文件系统(或 HDFS)上。 在默认的 Hadoop 配置中,每个 reducer 都会写入一个文件(`part-r-00000`是第一个 reducer 的输出,`part-r-00001`是第二个 reducer 的输出,依此类推)。 要在文件上显示完整的结果列表,应将所有结果串联起来。
* **输出编写器**:减速器的输出写在文件系统(或 HDFS)上。 在默认的 Hadoop 配置中,每个归约器都会写入一个文件(`part-r-00000`是第一个归约器的输出,`part-r-00001`是第二个归约器的输出,依此类推)。 要在文件上显示完整的结果列表,应将所有结果串联起来。
在视觉上,可以简单地传达和理解此操作,如下所示:
......@@ -97,7 +97,7 @@ HDFS 的体系结构是主从结构。 如果主服务器(称为**名称节点
映射步骤之后,每个映射器实例还可以运行一个可选步骤,即合并器。 基本上可以预期,如果可能的话,在映射器上执行减少步骤,通常用于减少要重新整理的信息量,从而加快了处理速度。 在前面的示例中,如果一个映射程序处理输入文件的多行,则在(可选)组合器步骤中,它可以预聚合结果,并输出较少数量的键值对。 例如,如果映射器在每个块中处理 100 行文本,那么当可以将信息汇总为三时,为什么输出 300 个键值对(字符数为 100,单词为 100,行为 100)? 这实际上是合并器的目标。
在 Hadoop 提供的 MapReduce 实现中,随机分配操作被分配,从而优化了通信成本,并且每个节点可以运行多个 mapper 和 reducer,从而充分利用了节点上可用的硬件资源。 此外,Hadoop 基础架构还提供了冗余和容错功能,因为同一任务可以分配给多个工作人员。
在 Hadoop 提供的 MapReduce 实现中,随机分配操作被分配,从而优化了通信成本,并且每个节点可以运行多个映射器和归约器,从而充分利用了节点上可用的硬件资源。 此外,Hadoop 基础架构还提供了冗余和容错功能,因为同一任务可以分配给多个工作人员。
# 介绍 Apache Spark
......@@ -301,7 +301,7 @@ In: numbers_rdd.map(lambda x: x**2).reduce(lambda a,b: a+b)
Out: 285
```
为了使其更简单,我们可以使用`sum`动作来代替 reducer
为了使其更简单,我们可以使用`sum`动作来代替归约器
```py
In: numbers_rdd.map(lambda x: x**2).sum()
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册