对数据科学和研究导向的专业人员、方法和结果的快速调查
这项民意调查旨在评估在求职过程中,在数据科学和其他研究相关专业领域工作的专业人士中,薪资有多重要
介绍
在与现任、前任和有抱负的数据科学家交谈时,我听到了一个常见的抱怨。招聘人员会根据你的薪资历史或你的薪资期望来筛选你。
招聘人员这样做我很困扰,不仅是为了应聘者,也是为了招聘人员。为了进一步推动对话,我利用社交媒体进行了一次民意调查。
我在 2020 年 10 月底和 11 月初进行了这项民意调查。我在 LinkedIn、Twitter 和脸书上发布了调查结果。我使用了标签、关键词和论坛,我认为它们会鼓励那些从事数据科学或其他研究导向职业的人做出回应。我还(通过 Twitter)推广了这项调查,以增加回复数量。
伴随民意调查的提示和帖子要求受访者在决定如何回答时考虑他们当前或最近的求职情况。
结果
Image credit:作者对社交媒体投票结果的可视化。
这些民意调查收集了 343 份答复。Twitter 有 269 条,脸书有 47 条,LinkedIn 有 27 条。这里的视觉聚集了来自所有三个平台的响应。
下面的图片提供了分类结果的视图。
尽管综合结果显示,大多数受访者将薪资列为第二、第三、第四或较低的关注点,但各平台的回复模式有所不同。在脸书的回答中,大多数人确实表示薪水是他们最关心的问题。在 Twitter 和 LinkedIn 的回复中,薪资并不是第一关注点。
这和随后的视觉崩溃反应从四类降到两类。
结论
Image credit:作者对社交媒体投票结果的可视化。该图显示,在脸书的回答中,大多数人确实表示薪水是他们最关心的问题。然而,在 Twitter 和 LinkedIn 的回复中,薪水并不是第一关注点。
这项简短的、非科学的民意调查表明,数据科学家和其他研究专业人士认为薪水是他们求职的一个重要因素。但是,也许有一半的候选人有他们认为更重要的其他考虑。
尽管这项调查有许多已知和未知的弱点,但它为在招聘过程中询问薪水的相关讨论带来了曙光。
当招聘人员问这个问题时,我对候选人有些担心。候选人似乎面临着一个不可能的选择,要么提出他们认为招聘者会满足的薪水(可能薪酬过低),要么提出代表应得和应得的职业发展的薪水(可能有被拒绝的风险)。
我也担心招聘人员。当招聘人员在讨论薪资要求的早期筛选候选人时,就失去了从候选人那里了解什么才是真正重要的机会。这种策略也有可能错过优秀的候选人,这些人可能会被与薪资无关的因素所吸引。与此相关的是,对非薪金因素做出反应的候选人现在可能会抵制以后被其他组织聘用的尝试。
对于招聘人员来说,更好的方法是问候选人“在工作机会谈判中,你最重要的考虑因素是什么?”然后,听候选人说。之后,谈谈对候选人重要的考虑因素。然后在入职期间和之后,确保进一步解决你现在知道对新员工很重要的需求和愿望。
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
adamrossnelson.medium.com](https://adamrossnelson.medium.com/membership)
感谢阅读
感谢阅读。把你的想法和主意发给我。你可以写信只是为了说声嗨。如果你真的需要告诉我是怎么错的,我期待着尽快和你聊天。推特:@ adamrossnelsonLinkedIn:亚当罗斯尼尔森。
数据科学项目 JustPy 快速入门
只用 Python 构建一个简单的原型站点
你知道什么最棒吗?
制作一个新的模型,并展示出来进行更多的测试。
你知道什么不好吗?
做一个新模型,却没有一个很好的方式来展示它。
越来越容易找到一些数据并建立一个模型(无论是低劣的还是深刻的)。你可以训练和测试(以及更多的测试),但是就像你做的任何东西一样,在使用新数据之前,很难说它有多有用。我确实制作了一些模型,认为它们得分很高,然后当用新的输入进行测试时,显示出它们的真实面目。
你有时会遇到的麻烦是把这个模型放到一个可用的版本中,比如一个网站。你不想要一个蹩脚的纯文本页面,但编写网站代码需要时间和完全不同的技能。不要误解我的意思,我认为 HTML、CSS 和 Javascript 通常是每个人都知道的很好的语言,因为它们在我们现代世界的几乎每个领域都很方便,但是拥有丰富的 web 设计经验不应该是制作有用的数据科学项目的先决条件。有一些 web 框架可以利用您的 Python 技能(比如 Flask 和 Django),但对我来说,这两种框架都有自己独特的复杂性。
输入 JustPy 。这个方便的 Python 包为您提供了在 Python 文件中快速创建网页的能力。它并没有消除对熟悉 web 设计语言的需求,但是可以大大简化事情,特别是对一个模型的测试。它还可以很好地处理熊猫和共享数据可视化。我花了一些时间创建了一个基本模板,您可以在自己的数据科学项目中使用它,但我想分享一下基本知识的概述。
你好世界!
在此之前,让我们先来看看这两个神奇的编码词。您首先需要安装 JustPy,这可以通过 pip 轻松完成:
pip install justpy
接下来,您创建一个 Python 文件,这是您的基本页面:
import justpy as jp
def hello_world():
wp = jp.WebPage()
p = jp.P()
p.text = 'Hello!'
return wp
jp.justpy(hello_world)
让我们一行一行地了解一下。首先,我们开始导入 JustPy 并使用他们喜欢的缩写jp
。接下来,我们将整个页面放在一个函数中,使其清晰且易于调用。在函数内部,我们首先用jp.WebPage()
创建一个网页实例。需要知道的重要一点是,我们总是要创建页面的实例,然后向其中添加内容。就像网页一样,我们所有的其他标准 web 组件也以类的形式存在。对于这个例子,我们创建一个段落标签的实例,jp.P()
,然后用一个值设置它的文本属性。有了这些,我们就可以返回网页实例了。最后,我们用jp.justpy
调用我们的函数,我们就有了一个页面!
查看标签类
所以我注意到有助于理解标记类的许多选项。让我们看一个 div 标签:
main = jp.Div(
classes='bg-gray-400 italic', text="My main div", a=wp)
这需要您将要更新的三个主要实例变量:classes
、text
和a
。是您想要添加到标签中的类。关于 JustPy 需要注意的一件重要事情是,它集成了 Tailwind CSS ,这是一个实用的 CSS 框架,可用于轻松设置页面元素的格式和样式。与其他一些 CSS 框架不同,Tailwind 是相当低级的,所以要获得你想要的外观可能需要一些组合类。text
显而易见,但了解这一点很重要。是嵌套标签的标签。因为你不像 HTML 那样嵌套标签,你必须告诉每个标签实例它需要放在哪里。在上面的例子中,我只是把这个 div 放在我们的主网页实例中。
轻松输入
我认为最初吸引我测试它的原因之一是它可以如何无缝地与输入一起工作,当连接 Python 和 HTML 时,这有时感觉像是一件苦差事。有使用表单的能力,但是对于一个简单的文本输入例子,你可以有这样的东西:
in = jp.Input(placeholder='Please type here')
嘣,投入!输入的值将存储在类实例中,在这个场景中,它将存储在in.value
中。您可以实时查看异步函数输入的内容,或者存储并提交进行处理。
推出垃圾邮件检测器
好了,我们对基础有了一些了解,让我们来看一个例子!假设您的任务是为公司电子邮件帐户创建一个垃圾邮件检测器。你有一套很好的电子邮件标签,并建立了一个非常直接的逻辑回归模型,你感觉很好。然后就发生了,有人说“我能试试吗?”。与其惊慌失措,不如把这个模型处理掉,然后和你的网页一起放入一个新的 Python 文件中!
为了帮助简化设计,我找到了一个带有顺风模板的网站,并以此为基础。我创建了两个主要函数,一个用于处理输入,一个用于网页。所以在一个 Python 文件中,viola:
看起来相当不错!最重要的是,它不需要大量的文件或依赖项目录。我的整个页面是用一个 Python 文件构建的,还有一个我构建模型的地方。我将它设置为在输入时自动处理,但是你可以看到它在查找垃圾邮件时表现良好。
优点:
坏消息是:
您可以从我的回购这里跳出来,创建自己的 easy JustPy 模型网页来测试我们自己的数据科学项目。尽情享受吧!
统计能力的 4 步复习
当你忘记如何计算功耗时,这是一个简单易懂的指南
10 多年来,我经常谈论统计的力量,但无法记住细节。如果你和我一样,收藏这篇文章!我将快速介绍在更新您的幂计算知识时需要遵循的四个步骤。
- 了解你的重要性测试
- 知道如何从 p 回来工作
- 处理两次不确定性
- 从 p 开始工作两次
复制这篇文章的所有代码在 GitHub 上都有。
我们的数据和统计测试
我们将使用双尾单样本 t 测试来评估以下问题的平均答案是否与 0 有显著差异。
在我们的疫情问题中,人们对回家的感觉从-2(糟糕)到 2(很好)进行评分。由谷歌从平面图标制作的图标
1.了解你的重要性测试
首先要知道你的功率计算意味着真正知道你如何从数据到 p 值。单样本 t 测试的步骤:
- 根据平均值、标准偏差和样本量计算出一个 t 统计量:
获得 t 统计量的公式,然后从相应的 t 分布映射到 p 值。sd =标准偏差,n =样本量。使用编码准备的方程式。
- 将其映射到带有自由度的 t- 分布,样本大小减 1。
- 从该点开始的曲线百分比等于 p 值。
注:为清晰起见,只显示了一面。双边测试的 p 值加倍。
2.知道如何从 p 返回工作
功率计算从p-值返回到关于数据的缺失信息。假设我们知道标准偏差(1.17)和样本量(10),并希望计算平均值,其中 p = 0.05。有了p-值和样本量,我们就可以得到t-值(回想一下,这是一个双尾检验)。
将所有内容代入公式:
做数学和mean(x) = +/-0.84
。对于我们的标准差和样本,高于 0.84 或低于-0.84 的平均值将具有小于 0.05 的p-值。
3.两次处理不确定性
假设人口平均值确实是 0.84,确切地说,t = 2.26,T2 = 0.05。你不能保证得到一个重要的结果。记得为什么吗?
在 null (0)附近有一个t-分布,因为即使它是真的,我们也很少用那个精确的值对一个组进行采样。同样,我们很少会看到 0.84,即使它是真正的潜在平均值。所以有第二个分布,它描述了在给定真实总体均值的情况下,我们可能观察到的情况。为了简单起见,我们将使用一个等价于零的 t- 分布,但是看看非中心性参数如何被用于变得严重。
如果总体平均值在临界值 t 上,这意味着我们将有 50%的时间观察到样本平均值高于临界值。这是“功效”——在给定特定总体均值的情况下,观察到统计显著结果的概率——总体均值为 0.84。
任何值的幂是其采样分布下超出与零值显著差异点的面积。就像计算另一个 p 值一样,如果你知道你的显著性测试,这应该是轻而易举的。在这个例子中,1.40 的总体平均值映射到 3.76 的 t 值,并且具有 92%的功效。
4.从 p 返回工作两次
计算功效很有趣,但更实际的是计算样本大小或可能产生显著结果的效果。两者都涉及设定两种概率:
- 显著性的阈值(称为 alpha,通常为 0.05)。
- 期望的功率(称为β,通常为 0.80)
计算效果大小
让我们从了解样本大小开始,并希望评估我们可以检测到多大的影响。假设我们可以将我们的调查发送给另外 10 个人,并认为标准差与之前大致相同(1.17)是合理的。显著性阈值为 0.05 时,什么总体均值(正向)具有 0.80 的功效(样本产生显著结果的概率为 80%)。
p1。 算出位于意义边界的意思。这里没有变化。是+/-0.84。
p2。计算出将分布中最低的 20%和最高的 80%分开的平均值。如果 T30 分布集中在 0(我们马上会解决这个问题),它将是-0.33。
我们现在需要找到这两点的交汇点。想象移动总体平均值的分布(用于 p2 ),直到定义 80%功效的值与显著性阈值相同。也就是说,移动分布,使得-0.33 现在是 0.84。分布的中心/平均值相应地移动并落在 1.17(纯粹是巧合,它与标准偏差相匹配)。瞧啊。对于我们已知的样本大小和标准偏差,如果真实总体均值为 1.17 或更大——对应于 3.15 的 t 值——我们将有相当好的机会(80%)观察到显著的结果。
计算样本大小
让我们反过来试试。假设平均值 1.17 是对我们有意义的最小值,但是我们不确定需要多大的样本。其他标准相同(标准差= 1.17,显著性阈值= 0.05,功效= 0.80)。
这个问题更棘手,因为在不知道样本大小(这涉及到自由度)的情况下,我们不知道 t 分布的形状。我们可以通过一些迭代来解决它。在高层次上…
第一步。选择一个样本大小。
第二步。从 p 回工作两次:
p1。 算出位于意义边界的平均值。 p2。 算出将人口分布分割为 80%的平均值。移动它,使人口值集中在预先确定的效果大小(1.17)。第三步。如果 p1 和 p2 的结果相等,则停止。 如果不是,从步骤 1 开始用不同的样本量。
有很多方法可以优化这一点,你可以在我的代码中找到一个简单的解决方案。不管你怎么做,结果都是 10(验证最后一部分)。为了多样化,让我们尝试一些不同的东西。如果总体均值为 0.02,我们需要多大的样本量才能达到 80%的功效?
27,037!
结论
统计学,像所有的技术课题一样,具有挑战性。学习细节会加深你的理解,但不要觉得有压力去记忆它们。当你学习新技术的时候,学习它的实用价值,它们能解决和不能解决的问题,优势和劣势。当需要技术资料的时候,就准备一篇这样的文章吧:)
感谢阅读。如果你喜欢这个,并且对更高级的电力话题感兴趣,你可能会喜欢我的文章,“Booking.com 如何用 CUPED 增加在线实验的电力”
Numpy 和 Matplotlib 快速回顾
Python 是数据科学的首选语言,只是因为它提供了大量的包和库,这些包和库增强了我们的数据可视化和解释,从而获得最大的生产率。Python 提供的两个这样的包是 Numpy 和 Matplotlib,我们今天要讨论这两个包。因此,让我们深入了解两个最简单但却是最基本的数据科学工具的一些基础知识。
Numpy
Numeric Python,或 Numpy,是一个基本的 Python 包,它提供了常规 Python 列表的替代方案,即 Numpy n 维同构数组。列表是 Python 提供的一个非常有用的工具,因为它可以让你一次存储不同类型的值,并对其执行许多操作。但是它有一定的局限性,对链表的一些操作效率不高。例如:
列表法
在这里,Numpy 可能非常有益。它可以在一行代码中解决我们的问题,而无需使用 loop:
数字阵列法
Numpy 不仅对此很有帮助,而且还允许您在这些数组上执行大量复杂的科学计算。这些计算包括,但不限于,线性代数、矩阵乘法和矩阵操作,所有这些都不使用循环,以一种无障碍且高效的方式进行。
安装 Numpy
所以,我们看到了 Numpy 数组是多么有用,但是如何使用它们以及从哪里获得它们。嗯,要获得 Numpy,你可以在计算机的命令行中使用**pip install numpy**
,或者你可以使用任何科学的 Python 发行商(推荐使用 Anaconda )。要了解下载 Numpy 的详细步骤,请点击此链接。
现在安装 Numpy 后,要使用它,您需要导入它,因为它不容易使用。你可以通过**import numpy**
来实现。但通常只是为了避免一直键入全名,它是用别名‘NP’导入的:
import numpy as np
您已经准备好使用这个受到所有数据科学家喜爱的漂亮工具。首先,让我们熟悉创建 Numpy 数组的不同方法。
创建 Numpy 数组
Numpy 数组主要是使用np.array()
方法定义的,但这不是唯一的方法。下面列出了定义 Numpy 数组的多种方法:
**np.array()**
: 可以用来定义任何维度的任何一种数组,是最常用的方法。dtype
在将输出定义为我们首选的数据类型时,可以添加参数。如下所示:
使用 np.array()
2.**np.zeros()**
: 使用np.zeros()
只会产生一个零数组。你只需要定义零数组的维数。
使用 np.zeros()
3.**np.ones()**
: 使用np.ones()
只会产生一个 1 的数组。同样,您只需要定义数组的维数。
4.**np.arange()**
: 当你想要一个数组,里面的值在一个给定的范围内有规律的间隔,你可以用np.arange()
来实现。它接受三个值,前两个是范围值,第三个是跳过值。请注意,该范围的第二个值不包含在内。
创建 Numpy 数组还有许多其他方法,如np.linspace()
、np.identity()
等。
数字阵列的一些特殊方法
**.size**
: 返回数组中元素的个数,不考虑其维数。**.shape**
: 以(row,columns)的形式返回数组的行数和列数。**.reshape()**
: 让你把给定数组的维数改成自己选择的维数。**.resize()**
: 其操作与 shape 相同,唯一不同的是使用resize()
会改变原来的数组。
所有上述方法如下所示:
子集数数组
Numpy 数组与 Python 列表非常相似,这是它们有多相似的另一个例子。Numpy 数组中的元素的选择方式与 Python list 中的选择方式相同。要选择数值范围,您可以使用**np_arr_name[start:end:skip]**
。就像列表一样,end
位置的元素是不包含的,skip
决定两个选定值之间的间隔。
Numpy 有一种特殊的数组子集化方法,那就是使用一个布尔数组。为此,您只需使用条件创建一个布尔数组,并将该数组作为对象传递给 Numpy 数组。
下面展示了各种子集设置方式:
二维数组
二维数组基本上是数组中的数组。这在数据科学中很常见,因此,您应该非常熟悉它。
子集化
该数组可以被认为是一种矩阵形式,其中子集数组的数量是行,每个子集数组中的元素数量是列。可以使用格式**np_arr[start:end:skip,start:end:skip]**
来选择这种类型的阵列中的元素,即使用两个方向上的切片,第一个方向用于行,第二个方向用于列。
矩阵运算
矩阵中的算术运算可以通过简单地使用运算符(+
、-
、*
、/
等)来完成。)以给出期望的输出。对矩阵的各种操作如下所示:
在这里,当我们执行标量加法或减法时,Numpy 让我们将一个整数与整个矩阵相加。这是因为 播 才有可能。
对于广播,这两个维度要么相同,要么其中一个为 1。在后一种情况下,Numpy 将维度更改为值不为 1 的维度。例如,
A (4d array): 8 x 1 x 6 x 1
B (3d array): 7 x 1 x 5
Result (4d array): 8 x 7 x 6 x 5
如果维数不相等且不是 1,那么它将抛出一个错误:**ValueError: operands could not be broadcast together**
。
数字矩阵的一些特殊性质
- **乘法:**在 Numpy 中,您可以使用
np.dot()
执行常规的矩阵乘法,即点积。它还允许你像对任何向量一样执行叉积。这是使用np.cross()
完成的。 - **转置:**转置是同一个矩阵,但是将原矩阵的行作为新矩阵的列,原矩阵的列作为新矩阵的行。这是用
matrix.T
方法完成的。 - **行列式:**要计算矩阵的行列式,就必须使用
linalg
模块。行列式可以用np.linalg.det(matrix)
来计算。 - **求逆:**可以使用
linalg
模块以类似于行列式的方式计算求逆。语法是np.linalg.inv(matrix)
。
所有上述特征如下所示:
数字统计
现在,我们知道了 Numpy 中的很多操作和工具。但是,如果我们实际上获得了大量数据,这是机器学习中的典型情况,该怎么办呢?简单地查看数据,或者将数据打印成数组或矩阵不会有任何帮助。为了从这些数据中得到有用的东西,我们需要对其进行一些统计分析,Numpy 是一个很好的工具。各种统计操作包括均值、中位数、标准差、方差等。所有这些操作既可以在整个数组上完成,也可以只在行或列上完成。下面演示了其中的一些操作:
还有很多其他的方法像sum()
、 sort()
、corcoeff()
等等。,这在进行深入的数据分析时会派上用场。
好了,我们快搞定 Numpy 了。你所要做的就是练习,练习,练习,真正擅长它,并了解在分析大数据时应该使用什么。现在你必须考虑从哪里得到练习,从哪里得到数据,这样你就可以执行一些操作并分析它。你可以自己生成数据。
生成数据
我们可以使用 Numpy np.random.normal()
函数模拟数据。它接受三个参数: 1) 均值, 2) 标准差, 3) 样本数。
现在,你已经拥有了进入这个领域的所有工具,并开始进入机器学习领域。
Matplotlib
在上一节中,您了解了可以用来深入了解数据的各种操作。这些都是数字,你必须用你的头脑来分析这些数据。如果我们能对数据进行可视化分析会怎么样?那不是超级有帮助,而且容易理解吗?Matplotlib 来救你了。Matplotlib 是最强大的可视化库。要使用它,您需要导入它的子包 pyplot。我将谈谈 Matplotlib 的一些基本知识,它可以帮助你实现数据可视化。
要使用 Matplotlib,我们需要使用以下方式导入它:
**import matplotlib.pyplot as plt**
Matplotlib 基础
所有图中最简单的是线图。plt.plot()
方法会给你一个线图。它接受两个数组作为参数。我们将学习线形图中绘图的各个方面。plt.show()
方法将显示图表。如果不想一直打,可以用%matplotlib inline
。
- **标签:**您可以给图形的 x 轴和 y 轴添加标签。要为 x 轴设置标签,我们可以使用
plt.xlabel()
。同样对于 y 轴,我们可以使用plt.ylabel().
- **标题:**你可以使用
plt.title()
来设置你的图的标题。 - **刻度:**您可以根据自己的选择标注 x 轴或 y 轴的位置。例如,x 轴上的人口可以标记为“1B”、“2B”、“3B”等。,代替写 1,2,3 等。这将增加图形的可读性。x 轴和 y 轴分别使用
plt.xticks()
和plt.yticks()
完成。 - **图形尺寸:**您可以使用
figure()
方法增加或减小图形的尺寸。要更改大小,您需要将一个包含行和列的长度值的元组分配给参数figsize
。 - **支线剧情:**有时候你可能想要在同一个人物中出现不止一个剧情。在这种情况下,您可以使用
plt.subplot()
方法。它接受三个参数:nrows
即行数,ncols
即列数,index
即每个图的索引号。 - **支线剧情:**支线剧情与支线剧情十分相似,但是
plt.subplots()
的结果被解包在两个变量中,即图形和轴,因此更容易引用生成的图形中的特定剧情。
上述内容的演示如下:
用户化
制作一个图表是一回事,但是使用颜色和线条使它引人注目和更有成效是另一回事。定制我们的图表使它更有洞察力,更容易阅读。
- **颜色:**要设置图形的颜色,您可以指定
plt.plot()
方法的color
参数。您可以以字符串的形式传递颜色的名称。 - **标记:**标记是图中点的格式。要更改标记,只需将包含您选择的标记的字符串传递给
plt.plot
方法的mark
参数。 - **线条样式:**线条样式定义图形线条的格式。要更改 linestyle,只需将包含您选择的标记的字符串传递给
plt.plot
方法的linestyle
参数。
不同颜色、市场和线型的不同地块如下所示:
不同类型的地块
Matplotlib 提供了各种类型的绘图来帮助您更好地可视化数据。下面解释了一些图表:
条形图:
如果我们有按类别组织的数据,那么我们可以使用条形图来描述它,其中每个条形的高度代表特定类别中数据的值。您可以使用plt.bar()
绘制常规条形图,使用plt.barh()
绘制水平条形图。有不同类型的条形图,即水平堆叠条形图和垂直堆叠条形图。要绘制水平堆叠条形图,您需要定义index
和width
来定义图上条形的位置和大小,而要绘制垂直堆叠条形图,您需要定义一个bottom
参数来定义图上条形的正确描述。所有这些如下所示:
直方图:
我们看到的柱状图,显示了不同条件下变量的值。现在,我们将讨论直方图。直方图有助于我们将特定变量的值的分布可视化。可使用plt.hist()
绘制直方图。默认情况下,它将绘制一个有十个柱的直方图,即本例中的柱。但是你可以把它定制成你选择的数字,或者用数字列表来作为 x 轴上的位置。您也可以使用plt.hist()
方法的histtype
参数自定义直方图的类型。
方框图:
箱线图是一种统计可视化工具,它显示一个数据的五个数字摘要,即最小值、第一个四分位数、中值、第三个四分位数和最大值。使用plt.boxplot()
绘制。
散点图:
散点图是获得数据洞察力的另一个超级重要的图,特别是当我们必须在我们的观察中比较不同的变量时。可以使用plt.scatter()
方法绘制。
好了,现在你知道了一些工具,它们是机器学习的基础。有了这个,我们更加接近了解真正的机器学习算法。一旦你熟悉了在数据科学中非常重要的所有工具和库,我就会写这些东西。
接下来,我会写一篇关于熊猫的深度博客,这是另一个非常重要的工具。了解熊猫将有助于你处理更大的数据集,了解如何获得洞察力并对更大的数据框架进行有效的分析。
我希望你在阅读这篇文章时感到有趣,并且你发现一切都很容易理解。如果你需要任何主题的进一步信息,请在回复中告诉我。
网上学习 Python 的最佳免费资源的快速汇总
你不需要付费就可以开始使用 Python
TLDR;
- 提出好的问题(见下面的模板)。
- learnpython.org 是一个经常被忽视的资源,它能让你从最基本的开始
- 编写程序是一本很好的介绍 CS 的教科书,里面有使用 Python 的例子
- Regex One 非常适合学习高级字符串操作
- 对于练习来说,这是非常棒的
- 约翰·菲利普·琼斯在 YouTube 上有一个很棒的频道
- 学到足够危险的东西,然后开始做自己的项目
介绍
Python 已经成为数据分析和数据科学领域任何顶级职位的必备技能。不幸的是,很多数据人在学习 Python 的时候忽略了基础。我创建了这个资源列表,以支持一个希望转型到更具技术性的角色的朋友。
问伟大的问题
几乎每个程序员都在网上寻求帮助,Python 的优势之一是支持性社区可以帮助回答他们。获得帮助的最好方法是提出好的问题。这是我在 Udemy 上从 Ziyad Yehia 改编的最佳实践列表(非免费资源)。
- 为你的问题起一个清晰的标题
- 描述观察到的行为
- 描述预期的行为
- 在 github 上链接到您的代码(您应该注册一个 github 帐户)
- 说出你认为问题可能出在哪里和什么地方
- 说你已经做了什么来试图解决这个问题
- 包括完整的错误消息
- 包括您正在使用的 Python 版本
- 不要仅仅发布你的代码的图片,而不让别人复制它
遵循这些步骤,你会更快地获得帮助。
基础知识
Learnpython.org 会让你掌握所有的基础知识。你可以在你的浏览器中运行代码,所以你不需要担心安装任何东西,它们的描述是用简单的语言写的,可以让你快速编码。
免费计算机科学教科书
编写程序是一个免费的计算机科学教科书,使用 Python 中的例子快速涵盖了计算机科学的最重要的部分。它在数学上比许多人认为的要难一些,但是它会给你一个坚实的基础。
操纵字符串
Regex One 是我最喜欢的学习如何使用正则表达式的资源之一,正则表达式是操作字符串和清理数据的常见任务。虽然不是 Python 特有的,但是很好地处理正则表达式将会在解决实际问题时给你很大的帮助
练习练习练习
Exercism.io 有一系列使用多种语言的指导练习题。在学习语言的过程中,他们有两种选择,有人指导和自我指导。都是免费的。
完全公开,我是他们 Python 轨道上的导师。我的建议是实际上不要使用指导。我在指导过程中的经历是,导师(所有志愿者)都是不一致的,我经常会等上几天,得不到特别有价值的反馈。
也就是说,很少有在线资源能让我像做练习一样快地学会编码。它迫使你去解决各种各样的问题,并打破你的舒适区。
油管(国外视频网站)
YouTube 上有无数的 Python 教程。我喜欢约翰·菲利普·琼斯,因为他的频道制作精良,涵盖了初学者和更高级主题的广泛话题,并有易懂的解释。
学到足够危险的程度
我的最后一条建议是学习足够的 Python 来解决你生活中的实际问题。我花了几个月的时间绞尽脑汁试图理解循环。当我不得不在工作中解决一个需要我使用 for 循环的问题时,我才真正开始理解它们。
编程的主体是条件语句(If、elif、else)和循环。一旦你知道了这些和基本的数据结构(列表、字典、元组),你就可以开始应用你所知道的。
你最喜欢的让你更擅长 Python 的免费资源有哪些?
关于作者:
Charles Mendelson 是 PitchBook 的营销数据分析师。在过去的五年里,他一直在销售和营销机构工作。他的工作是分析师和开发人员的混合角色。他不断努力成为一名更好的程序员,目前正通过自学计算机科学课程沉浸在计算机科学的基础知识中。如果他有超能力,他会花很多时间思考如何解决问题,而不仅仅是解决问题。
原载于 2020 年 9 月 26 日【https://charlesmendelson.com】。
Gephi 布局快速教程—使用问答 StackOverflow 数据集
前几天,当我为一个做社交网络分析的朋友准备教学/咨询服务时,我需要修改 Gephi 的布局。以下是我重新学习的总结。
Gephi 是一个令人惊叹的开源网络分析和(交互式!)可视化软件,提供大量非常有用的工具,用于探索图形数据、计算统计数据、检测集群、社区等。它不需要任何编码技能。即使你有的编码技能,也请暂时停止使用 Python 的 NetworkX,尝试一下 Gephi。值了。
Gephi 提供的一个非常好的特性是一系列不同的布局算法——也就是您实时查看图表的方式。让我们尝试它们,看看它们背后的直觉是什么,以及它们的利弊。
我们将使用这个来自 Kaggle 的 StackOverflow 数据集。我创建了一个以人为节点的网络,当且仅当 A 回答了 B 的问题时,A — > B 链接才存在。边的权重就是答案的分数。我用 Python 中的 pandas 库创建了这个。
当我在 Gephi 中可视化结果图时,它看起来并不太好——因为它是随机布局:
StackOverflow 图的 R̶o̶r̶s̶c̶h̶a̶c̶h̶ ̶t̶e̶s̶t̶随机布局。
ForceAtlas
我们来试试另一种布局: ForceAtlas 。这对于小世界/无标度网络是一个有用的布局,对于探索网络也是有用的,因为它不会在绘图时引入偏差。复杂度为 O(N ),建议将其用于< 10K 节点。该算法将强连接的节点拉在一起,并将弱连接的节点推开。你通常需要调整它的参数来得到一个好的显示。
一些定义:
- 小世界:对于每个节点来说,它没有很多邻居,但它的邻居很可能是彼此的邻居,并且大多数节点可以通过小步数从每个其他节点到达。(听说过六度分离的想法吗?)
- 无标度:这只是程度分布遵循幂律:
我们如何检验我们的网络是否是无尺度的?直接去统计,运行“平均度”计算。这是我的:
看起来像是幂律!也许原力图集会好看。
ForceAtlas(默认参数)
这更好——至少孤立的节点被推到了外面。不过网络的中心有点乱。通过选择“按大小调整”参数,我们避免了节点重叠。如果你想要更高的精度,速度可以降低。这是这个过程的前 20 秒:
使用“按大小调整”参数移除重叠的节点
这是最后的结果:
按大小调整强制图集
我们可以做得更好。通过到这里:
选择“节点”、“等级”和同心圆选项,我们可以使节点的大小与度量成比例,例如,出度。在这之后,我们可以再次运行布局算法,我们得到这个:
节点大小与输出度成比例
我们甚至可以通过悬停在其中一个大节点上来关注它:
节点的邻域
最后,通过计算模块性统计,我们可以根据节点所属的社区对节点进行着色:
着色的过程类似于用于节点大小的过程——只是这次我们需要选择调色板,以及用于排序的模块化类。结果如下:
社区可视化
在进入下一个布局之前,让我们再玩一个参数:通过选择景点分布,枢纽(具有高出度的节点)被推到外围,而权威(高入度)更集中。有时,从随机布局重新开始会更好,因为它收敛得更快。
更改后,我们可以看到中心(突出显示)确实位于外围—如果我们过滤出度高于 12、入度低于 3 的节点,我们可以看到中心也不是权威:
具有吸引力分布的 Force Atlas 将枢纽投入到 perifery 中
弗鲁特曼-莱因戈尔德
该布局将节点模拟为质量粒子,将边模拟为字符串。然后,它只是最小化系统的能量。复杂度也是 O(N ),但建议使用最多 1K 个节点,因为实际收敛很慢。
请注意,这些边被视为无方向的。这种布局有助于理解图形的拓扑结构,因为拓扑上的近节点位于相同的邻近区域,而远节点彼此远离。因此,断开的组件很容易可视化。
我们将在我们的(已经按社区划分的)网络上运行它。
实际上,我们的图表中有很多不相连的部分。我们可以控制布局的面积和重心来避免它们的分散:
奥彭德
这种布局需要一个无方向的加权图,对于检测集群非常有用。它比其他布局更快——复杂度为 O(N log(N))并且推荐用于高达 1M 节点的网络。
OpenOrd 基本上是 Fruchterman-Reingold,带有一个额外的参数(edge cut ),在优化过程中控制边的最大长度。默认值为 0.8:这意味着在优化过程中,长度超过当前最长边长 80%的每条边都被切割。这使得星团可以分离,因为高权重的长边会对远处的星团产生不适当的影响(还记得 Fruchterman-Reingold 基本上是一个弦系统吗?)
值 1 对应于标准 Fruchterman-Reingold,因为没有边的长度大于最长的边,值 0 对应于真正的侵略性切割(受每个非孤立节点必须保留至少一条边的事实的约束)。
我们在这里切换到黑色背景,因为这将有助于我们理解边缘的切割。而且,它看起来更酷。
我们可以看到一些边在优化过程中是如何被切割的,因为一些节点现在不自然地远离:
OpenOrd —关注一个节点。
圆形布局
我不得不安装这个,因为它不是默认提供的——这很简单。你只需进入工具>插件>可用插件,检查其名称并点击安装。不幸的是,您需要重启应用程序来完成安装。
这种布局简单但功能强大:它根据您能想到的任何度量或属性对节点进行排序。您可以使用它来可视化它们的节点及其链接的分布。这种布局速度非常快——O(N ),因为它不需要运行任何优化。
圆形布局(按向内角度顺时针排序)
你也可以用这个来准备一个不那么无聊的演示文稿!例如,我们可以使用 pandas(提示:使用group by+nunique)计算每个节点回答的不同标签 (Python、C#等)的数量。姑且称此为知识 _ 综艺。我们可以用一个方框图来展示这个指标的分布,但也可以用一个圆形布局。
幻灯片示例使用圆形布局和节点大小来说明网络的统计事实
双圆形布局
这是圆形布局的一个很酷的变体,您可以将顶部节点放置在外圆中,下面是度数的一个示例:
双圆形布局(按度数顺序,顺时针方向)
如果您既想可视化指标的分布,又想更详细地了解排名靠前的节点,这将非常有用。
径向轴
这个将节点分组,并呈现为从一个中心圆向外辐射。它带有圆形布局插件。它也是 O(N ),并且对研究与属性相关的同向性极其有用。
然后,我们可以将节点的 knowledge_variety 分布在一个圆中,并将它们的度数分布在来自该圆的螺旋中。下面是它的样子——40 个螺旋,顺时针顺序(最大知识 _ 11 和 12 标记之间的变化)和低边缘宽度。请记住,节点大小与外部程度相关,颜色表示社区:
径向轴
- 最长的尾巴在第 1 小时;那里用户的外向度很低:大多数用户贡献的内容很少,而且是关于非常具体的主题。
- Out-degree 与 knowledge_variety 相关:这是有道理的,因为你的知识越多样化,你就越能为整个社区做出贡献。然而,也有一些例外——超级用户知道很多非常具体的主题。
其他
还有很多其他的布局,如果我感兴趣的话,将来我会再写一篇关于地理网络布局的教程!祝你黑客生涯愉快!
你可以随时通过 LinkedIn 这里 联系我,讨论数据科学,自由职业优惠,数学,桌游。
用 Python 进行 AWS 转录的快速教程
通过 Google Colab 和 Google Drive 使用 AWS 转录的转录服务简介
去年夏天,我开发了一些涉及语音转文本机制的产品,我认为最好使用现有的 API 来实现这些目的。在这篇文章中,我想与那些想尝试这些美妙技术的人分享我使用这些 API 的一点点经验。希望你们觉得有帮助:)
哦!而这里是我将涉及的快速内容:
-设置:通用包和初始化基本功能
-单扬声器文件
-多扬声器文件
-通过 Colab 和 Google Drive 访问文件并上传到 S3 存储器
-创建词汇表以增强转录准确性
代码链接:Google Colab ( 此处)、Gist ( 此处)或 Github( 此处)。
为什么选择语音转文本?
语音转文本是一项很有前途的技术,不是作为一个产品本身,而是更多地基于它对许多其他产品的底层应用。由于我们的阅读速度比听力速度快得多,阅读转录比听类似内容的音频节省更多的时间。谷歌的新旗舰手机:Pixel 4,引入了执行实时转录的录音应用程序!有前途的产品可能是会议记录(Zoom 已经提供了这个功能)、讲座(文本记录)等等。
多年来,语音转文本已经是一个相当成熟的领域。由于这种挑战更多的是横向的,而不是纵向的,因此拥有来自各种输入源的大量数据的公司会胜出。毫无疑问,像亚马逊、谷歌、IBM、微软这样的大公司是在他们的云上提供转录服务的领导者。
每种产品都有其优点和缺点,可能会不同程度地满足您的需求。我强烈建议尝试所有这些服务,并选择最适合您所需用例的服务。在这篇文章中,我将重点放在 Amazon Transcription 服务上,因为它有丰富的输出:一个 JSON 文件,包含所有时间戳和其他信息,这非常有用!
(对我(希望)下一篇帖子的小炒作:Google Cloud(执行单个说话者转录时):输出没有任何标点符号。我希望写一个 RNN 模型来添加标点符号,以丰富输出。但这是在未来。让我们暂时回到 AWS!)
我将通过使用谷歌 Colab 的步骤。完整代码的链接是这里是。我们开始吧!
设置:通用软件包和初始化基本功能。
!pip install boto3
import pandas as pd
import time
import boto3
Boto 是用于 Python 的 AWS 软件开发工具包。更多关于 Boto 3 文档的信息可以在这里找到。
我们还需要 AWS 帐户的访问密钥。如果你还没有创建一个帐户,请这样做(它是免费创建的,如果你不使用太多,还有免费层)!
当您拥有自己的帐户时,以下是获取个人访问密钥的方法(如果您已经有了访问密钥,请随意使用):
- 步骤 1:转到 AWS 管理控制台页面。
- 第二步:点击右上角的用户名,选择“我的安全凭证”
- 步骤 3:选择“访问密钥(访问密钥 ID 和秘密访问密钥。”
- 第四步:创建新的密钥,并记住保存它!
- 步骤 5:添加到我们的代码中:初始化转录作业。
transcribe = boto3.client('transcribe',
aws_access_key_id = #insert your access key ID here,
aws_secret_access_key = # insert your secret access key here
region_name = # region: usually, I put "us-east-2"
此外,我们需要创建/连接我们的亚马逊 S3 存储。
AWS 转录将从您的 S3 存储中转录文件。这非常方便,因为你可以将文件存储到亚马逊 S3,并直接从云中处理它们。点击阅读如何创建你的 S3 桶。
尝试上传一个随机的音频/视频文件到 S3 存储,让我们试试转录服务!这些是我们的价值观
- job_uri: S3 访问链接,通常为“S3://bucket _ name/”+audio _ file _ name(如“S3://viethoangtranduong/AWS . wav”)
- job_name:对于每个转录调用,我们需要一个作业名。在这种情况下,我使用音频文件名本身。我们也可以使用散列函数来自动化系统。
注意:如果已经存在同名作业,作业将会崩溃。避免这些问题的可能方法是 :- 一个哈希函数来编码音频文件名和作业的时间戳(这将避免重复,即使文件具有相同的名称)
- 一个密钥生成器数据库:如果我们使用 base 62(因为我们想避免“/”和“+”),那么我们可以有 62⁶ = 56.8 B 唯一代码(这应该足够了)。我们可以将未使用的密钥用于每项工作。
我们可以有两个数据库来存储使用和未使用的密钥。每次使用一个未使用的键时,我们将它移动到另一个数据库。我们必须跟踪文件名和匹配的键,以便将来遍历。使用这种方法,我们可以进一步发展成转录文件的链接缩写。
- file_format:文件格式。AWS 可以处理大多数文件,如. mp3、.wav,甚至像. mp4 这样的视频
为了简单起见,我创建了一个函数调用 check_job_name 来处理重复的作业名。
def check_job_name(job_name):
job_verification = True # all the transcriptions
existed_jobs = transcribe.list_transcription_jobs() for job in existed_jobs['TranscriptionJobSummaries']:
if job_name == job['TranscriptionJobName']:
job_verification = False
break if job_verification == False:
command = input(job_name + " has existed. \nDo you want to override the existed job (Y/N): ") if command.lower() == "y" or command.lower() == "yes": transcribe.delete_transcription_job(TranscriptionJobName=job_name)
elif command.lower() == "n" or command.lower() == "no": job_name = input("Insert new job name? ") check_job_name(job_name)
else:
print("Input can only be (Y/N)")
command = input(job_name + " has existed. \nDo you want to override the existed job (Y/N): ")
return job_name
对于单扬声器文件
def amazon_transcribe(audio_file_name):
job_uri = # your S3 access link
# Usually, I put like this to automate the process with the file name
# "s3://bucket_name" + audio_file_name # Usually, file names have spaces and have the file extension like .mp3
# we take only a file name and delete all the space to name the job
job_name = (audio_file_name.split('.')[0]).replace(" ", "") # file format
file_format = audio_file_name.split('.')[1]
# check if name is taken or not
job_name = check_job_name(job_name)
transcribe.start_transcription_job(
TranscriptionJobName=job_name,
Media={'MediaFileUri': job_uri},
MediaFormat = file_format,
LanguageCode='en-US')
while True:
result = transcribe.get_transcription_job(TranscriptionJobName=job_name)
if result['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
break
time.sleep(15)
if result['TranscriptionJob']['TranscriptionJobStatus'] == "COMPLETED":
data = pd.read_json(result['TranscriptionJob']['Transcript']['TranscriptFileUri'])
return data['results'][1][0]['transcript']
因为转录可能需要时间,所以我们创建了一个 while 循环来等待它完成(每 15 秒重新运行一次)。
最后一个“if”语句从 JSON 文件中提取特定的脚本。我将在文章的最后讨论如何提取时间戳。
对于多扬声器文件
对于 AWS 为多个扬声器转录,它可以检测的最大扬声器是 10 个。这次我将接受两个参数作为输入:audio_file_name 和 max_speakers。我强烈建议使用 max_speakers 值来提高 AWS 的准确性。但是,您也可以将其留空。
def amazon_transcribe(audio_file_name, max_speakers = -1):
if max_speakers > 10:
raise ValueError("Maximum detected speakers is 10.")
job_uri = "s3 bucket link" + audio_file_name
job_name = (audio_file_name.split('.')[0]).replace(" ", "")
# check if name is taken or not
job_name = check_job_name(job_name)
if max_speakers != -1:
transcribe.start_transcription_job(
TranscriptionJobName=job_name,
Media={'MediaFileUri': job_uri},
MediaFormat=audio_file_name.split('.')[1],
LanguageCode='en-US',
Settings = {'ShowSpeakerLabels': True,
'MaxSpeakerLabels': max_speakers})
else:
transcribe.start_transcription_job(
TranscriptionJobName=job_name,
Media={'MediaFileUri': job_uri},
MediaFormat=audio_file_name.split('.')[1],
LanguageCode='en-US',
Settings = {'ShowSpeakerLabels': True}) while True:
result = transcribe.get_transcription_job(TranscriptionJobName=job_name)
if result['TranscriptionJob']['TranscriptionJobStatus'] in ['COMPLETED', 'FAILED']:
break
time.sleep(15) if result['TranscriptionJob']['TranscriptionJobStatus'] == 'COMPLETED':
data = pd.read_json(result['TranscriptionJob']['Transcript']['TranscriptFileUri'])
return result
这一次,输出不再是文本,而是一个文件结果(在 Python 中,它是一种字典数据类型)。
data = pd.read_json(result['TranscriptionJob']['Transcript']['TranscriptFileUri'])
transcript = data['results'][2][0]['transcript']
这段代码将为您提供原始的转录(没有扬声器标签):结果将类似于将这些文件输入到单扬声器模型中。
如何添加扬声器标签?
现在,我们将读取“TranscriptFileUri”中的 JSON 文件。
由于我们正在使用 Google Colab,我还将演示如何访问特定文件夹中的文件。假设我们已经把它放在一个文件夹中:Colab Notebooks/AWS transcript reader:下面是访问它的方法。
from google.colab import drive
import sys
import os drive.mount('/content/drive/')
sys.path.append("/content/drive/My Drive/Colab Notebooks/AWS Transcribe reader")
os.chdir("/content/drive/My Drive/Colab Notebooks/AWS Transcribe reader")
现在,我们需要处理来自 AWS 转录的 JSON 输出。下面的代码将提供一个带有[时间戳,演讲者标签,内容]的. txt 文件。
当输入“filename.json”文件时,期待完整抄本的“filename.txt”文件。
import json
import datetime
import time as ptime def read_output(filename):
# example filename: audio.json
# take the input as the filename
filename = (filename).split('.')[0]
# Create an output txt file
print(filename+'.txt')
with open(filename+'.txt','w') as w:
with open(filename+'.json') as f:
data=json.loads(f.read())
labels = data['results']['speaker_labels']['segments']
speaker_start_times={}
for label in labels:
for item in label['items']:
speaker_start_times[item['start_time']] = item['speaker_label'] items = data['results']['items']
lines = []
line = ''
time = 0
speaker = 'null'
i = 0
# loop through all elements
for item in items:
i = i+1
content = item['alternatives'][0]['content'] # if it's starting time
if item.get('start_time'):
current_speaker = speaker_start_times[item['start_time']] # in AWS output, there are types as punctuation
elif item['type'] == 'punctuation':
line = line + content
# handle different speaker
if current_speaker != speaker:
if speaker:
lines.append({'speaker':speaker, 'line':line, 'time':time})
line = content
speaker = current_speaker
time = item['start_time'] elif item['type'] != 'punctuation':
line = line + ' ' + content
lines.append({'speaker': speaker, 'line': line,'time': time}) # sort the results by the time
sorted_lines = sorted(lines,key=lambda k: float(k['time']))
# write into the .txt file
for line_data in sorted_lines:
line = '[' + str(datetime.timedelta(seconds=int(round(float(line_data['time']))))) + '] ' + line_data.get('speaker') + ': ' + line_data.get('line')
w.write(line + '\n\n')
然后,在同一个文件夹中,会出现“filename.txt”文件,其中包含所有的抄本。
奖励 1:直接访问和上传文件到 S3 存储器
将文件上传到 AWS S3 存储肯定会使许多过程自动化。
# define AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, and bucket_name
# bucket_name: name of s3 storage folder
s3 = boto3.client('s3',
aws_access_key_id = AWS_ACCESS_KEY_ID,
aws_secret_access_key = AWS_SECRET_ACCESS_KEY,
region_name = "us-east-2")s3.upload_file(file_name, bucket_name, file_name)
红利二:我们为什么不创建一个词汇表来增强准确性?
我们可以通过控制台管理将词汇表手动上传到 AWS 转录服务中。接受的文件有。csv 或. txt.
然而,如果我们想用 Python 来自动化这个过程,那就有点棘手了。
下面是我发现的一种方法:AWS 通过 Python 接受特定类型的输入,这是一个有 4 列的 data frame:[’ Phrases ‘,’ IPA ‘,’ SoundsLike ‘,’ DisplayAs’]转换成。txt 文件。有关各列含义和自定义词汇的更多信息,请阅读此处的。
def vocab_name(custom_name):
vocab = pd.DataFrame([['Los-Angeles', np.nan, np.nan, "Los Angeles"], ["F.B.I.", "ɛ f b i aɪ", np.nan, "FBI"], ["Etienne", np.nan, "eh-tee-en", np.nan]], columns=['Phrase', 'IPA', 'SoundsLike', 'DisplayAs']) vocab.to_csv(custom_name+'.csv', header=True, index=None, sep='\t')
import csv
import time
csv_file = 'custom_name+'.csv
txt_file = 'custom_name+'.txt with open(txt_file, "w") as my_output_file:
with open(csv_file, "r") as my_input_file:
my_output_file.write(" ".join(row)+'\n') for row in csv.reader(my_input_file)]
my_output_file.close()
ptime.sleep(30) # wait for the file to finish bucket_name = #name of the S3 bucket
s3.upload_file(txt_file, bucket_name, txt_file)
ptime.sleep(60) response = transcribe.create_vocabulary(
VocabularyName= custom_name,
LanguageCode='en-US',
VocabularyFileUri = "your s3 link" + txt_file)
# the link usually is bucketname.region.amazonaws.com# after running vocab_name, we can check the status through this line# if it's ready, the VocabularyState will be 'READY'
transcribe.list_vocabularies()
上传和添加词汇表花费了相当多的时间。这可能不是最佳的方法,但它是有效的(在尝试字符串列表、列表列表中,但目前没有一个有效)。
如果你找到了进一步自动化的方法,请评论!我很乐意讨论和了解更多。
结论和…下一步是什么?
这里有一个关于 AWS 转录的快速教程。希望你觉得有用!此外,我希望听到你的想法,并进一步讨论它们。(我可能会写一些关于在 Google Cloud little-punctuations 抄本中添加标点符号的内容,所以我希望我不会偷懒)。
链接到代码:Google Colab ( 这里),Gist ( 这里,或者 Github( 这里)。
欢迎通过linkedin.com/in/viethoangtranduong/联系我或在此发表评论,我会尽力尽快回复!
附:实时转录比转录一个类似的文件要好得多。
参考资料 五分钟概述 AWS 转录
AWS 转录为 Docx。
隆起建模:快速介绍
了解提升建模如何改善传统数据科学应用。
摄影爱好者:摄影工作室
简介
本文涵盖了隆起建模背后的思想。
到本文结束时,你将会很容易向别人解释隆起建模是什么。
这是隆起建模系列的第一篇文章。
- 隆起建模:快速介绍
- 使用 Python 的应用隆起建模示例(即将推出)
- 通过提升建模引领优化示例(即将推出)
- 不同提升技术的比较(即将推出)
- 隆起建模的 5 个技巧(即将推出)
- 端到端提升建模项目(即将推出)
问题介绍
我们从一个实际应用开始,然后概括提升建模如何对任何行业和业务单位有用。
一家保险公司正在根据收集到的订单将前一天的新线索分配给保险代理人。通过呼出电话营销活动,代理可以将 5%的销售线索转化为销售额。
该公司已经意识到,他们现在一天产生的销售线索比代理能够工作的还要多。还有一种感觉是,很多线索都是浪费时间。
为了更好地实现数据驱动,该公司的数据科学团队希望优化处理线索的顺序。利用从网站上收集的线索数据,他们建立了一个模型,对每条线索转化为销售的可能性进行评分。
这样,代理可以在每天开始时密切关注最有机会在未来转化为销售的销售线索。他们还可以避免在很可能永远不会促成销售的线索上浪费时间。
该模型投入生产后,公司发现代理商现在将 10%的工作线索转化为销售。这是对旧操作的 100%改进!
我们需要休息一下!还没有击掌…
这个数据科学项目有一个重大缺陷。
这个项目看似成功,但你如何知道呼出电话营销活动是否导致了客户的转变?这可能只是樱桃采摘容易获胜。
换句话说,倾向模型所做的只是收集最有可能转化为销售的线索。它没有将已经打算购买的客户与需要通过呼出电话说服的客户区分开来。
欢迎来到隆起建模的世界——因果推理和机器学习之间的桥梁。上面的案例研究忘记考虑的是说服、渐进或外向销售活动的真实效果。
隆起建模
那么隆起建模是如何工作的呢?
上一节强调的购买倾向模型使用机器学习来回答这个问题:
“客户将来购买的可能性有多大?”
隆起建模通过回答更重要的问题对此进行了改进:
- “我的广告让顾客从我这里购买了吗?”
- “我是不是浪费钱向已经打算从我这里购买的顾客做广告?”
- 我的广告是否降低了人们购买的可能性(负面影响)?
换句话说,经典倾向模型(和大多数机器学习算法)在给定特征(x)的情况下预测目标(y)。在给定特征(x)的情况下,提升旨在解决处理(t)对目标(y)的影响。
隆起建模通常用四个客户群来解释(Siegel 2011 年):
1.无论什么(确定的东西)都会购买的人
2.只有在看到广告时才会购买的人(有说服力)
3.无论如何都不会购买的人(失败原因)
4.如果看到广告,那些不会购买的人(睡狗)
倾向模型通过帮助你避免失败的原因来增加价值。提升建模通过只关注可说服细分市场中的客户,进一步提高了针对性。
常见应用
这如何应用于任何业务单位或行业?
政治竞选:
提升建模已被用于识别和锁定持观望态度的选民( Stedman 2013 )。通过利用提升模型,政治营销活动可以避免那些对他们的政党死心塌地的人,而是只关注可说服的人。
一种新的健康疗法:
不仅仅是评估整个治疗组与对照组的结果,隆起建模可以帮助理解治疗如何不同地影响某些组。还有,这些影响的差异有多大。
也许这种治疗对 50 岁以上有潜在健康问题的人有很大的积极影响,但对 50 岁以下健康的人影响不大。
销售线索优化:(这听起来应该很熟悉)
一家公司有销售线索数据库,但他们生成的销售线索比能够处理的还要多,而且许多销售线索都是浪费时间,目前代理可以按照他们选择的任何顺序处理销售线索。
交叉销售:
一家公司想要开展交叉销售活动,假设他们不想向他们的整个客户群进行交叉销售,因为预算有限,一些人可能不需要或不想要其他产品。
保留:
一家公司希望接触到即将流失的客户,并拯救他们。该公司希望在接触客户时防止进一步扰乱客户,并只关注高风险的可挽救客户。
用户体验测试:
一家公司希望了解他们网站或应用程序的更改是否产生了预期的结果。
常用技法
在一个快速发展的空间里,我觉得技术目前可以分成三大支柱。
传统倾向模型
这实际上不是一个提升模型,但需要包括在内,因为这是解决提升问题的经典方法。该算法通常是像逻辑回归这样的分类器。这些算法可以输出 0 到 1 的概率,用于对观众进行排序。那么可以选择一个阈值(可能 0.70 的概率或更大)作为那些应该接受治疗的人的截止值。
直接提升型号
这个支柱代表的技术和算法可以让你直接模拟治疗效果。它需要像随机森林这样的算法完全重新设计,以进行特征选择、超参数调整,并适合解决给定(x)时(t)对(y)的影响。像 Scikit-learn 这样的包中的典型算法不能做到这一点。您可以使用 R 的包提升和 Python 的 CausalML 来实现提升树。
元学习者
最后一个支柱代表可用于对提升建模的技术和算法,但使用某种快捷方式来获得提升的代理。代理方法在大多数应用中是有用的,并且这些快捷方式通常在速度和/或简单性方面提供好处。
似乎有许多技术,所以下面的列表绝不是全面的。根据您要去的地方,似乎也有不同的方法来实现这些技术。
隆起建模的当前挑战
为什么隆起建模会很棘手。
- 除非数据是合成的,否则真相标签是不可用的。
在机器学习中,通常有特征(帮助预测的输入)和基本事实标签(预测的目标)。
在隆起建模中,地面真相是永远不可用的,因为个人不能既看到又看不到广告。因果推理模拟了没有发生的场景,因此有可能估计地面真相标签,并将其视为机器学习问题。
因为基本事实标签不可用,这使得测量和验证不太直接。通常,您可以通过比较预测值和实际值来了解模型的表现。在提升建模中,您可以通过与估计的实际值进行比较来了解模型的表现。
生成用于验证的合成数据的优势在于,它可以被构建为模拟两种场景。这样,不同的技术可以更清楚地评估,以选择一个赢家。然而,合成数据可能永远不会完美地反映您想要提升模型的真实世界数据。
2.像 Scikit-learn 这样高度优化的包并不是为了解决升级而设置的。
如前所述,机器学习算法被设置为在给定特征(x)的情况下预测目标(y)。直接建模需要调整算法和整个机器学习管道。功能选择、型号选择、超参数调整以及与 Scikit-learn 等优化包的匹配并不简单。
目前,(在撰写本文时)直接方法是可用的,但即使在小数据集上也很慢。
3.事物和技术的名称是无组织无共识的。
为了证明这一点,就连隆起建模的名称也会因观察地点的不同而有所变化:
根据我自己的研究,我不确定是否有一个全面的技术列表或关于如何实现每种技术的共识。
资源
重新列出我自己的收藏,然后还有其他值得注意的链接。
这是隆起建模系列的第一篇文章。
- 快速提升建模简介
- 使用 Python 的应用隆起建模示例(即将推出)
- 通过提升建模引领优化示例(即将推出)
- 不同升级产品包的比较(即将推出)
- 隆起建模的 5 个技巧(即将推出)
- 端到端提升建模项目(即将推出)
推荐包:
参考文献:
费,g .(2019 . 10 . 29)。直接建模抬升:以 KL 散度和欧氏距离为分裂准则的抬升决策树。
古铁雷斯,P. &杰勒迪,J. (2016)。因果推理和隆起模型:文献综述。 JMLR:研讨会和会议记录 67:1–13
昆泽尔、塞孔、比克尔和于(2019)利用机器学习评估异质治疗效果的金属学者。美国国家科学院院刊,116(10):4156–4165
米歇尔·雷内,施纳肯伯格,I .,&马滕斯,t .冯。(2019).目标提升:净得分介绍。查姆:斯普林格国际出版公司。
西格尔,E. (2011 年 10 月 19 日)。通过预测来优化营销影响力。
斯特德曼,C. (2013 年 11 月 11 日)。提升建模如何帮助奥巴马的竞选——以及如何帮助营销人员——机器学习时代——机器学习&数据科学新闻。
易,r .&弗罗斯特,w .(2019 . 2 . 7)。Pylift:用于隆起建模的快速 Python 包。
一种快速重新格式化熊猫数据框中的列的方法
大蟒
使用 df.melt 将多个列压缩成一列。
姐姐塑造的形象
直接进入分析可能很诱人,但在此之前的一个重要步骤是预处理。
Pandas 提供了许多内置功能,允许您按照自己需要的方式重新格式化数据帧。在执行计算或创建可视化之前,大多数数据集都需要某种形式的整形。
在这篇文章中,我们将会看到如何使用一个 **df.melt**
函数将多个列的值合并成一个。
这意味着您正在将数据帧从“宽”格式更改为“长”格式。当许多列在技术上具有相同类型的值时,这很有帮助。
例如,假设你拥有一家咖啡店,开始经营两种饮料。为了跟踪每种饮料的成分,您制作了一个如下所示的表格:
目前这可能行得通,但是如果你想包含一种有三种成分的饮料呢?您必须创建另一个类似“配料 3”的列,但是如果您想要一种含有 4、5 甚至 10 种配料的饮料呢?每次需要输入更多数据时都生成新列并不是最优雅的解决方案。
相反,如果你有一张这样的桌子就太好了:
现在,你的桌子灵活多了。您的饮料可以根据您的需要添加或多或少的配料,并且您不需要为不同类型的数据条目改变表格结构。
让我们在一个更复杂的例子上看看如何用df.melt
来做这件事。我们将使用这个视频游戏销售数据的修改版本,所以如果你想继续的话,请下载 csv 文件。我已经为这个练习加载并预处理了它,所以您可以使用下面的代码开始。
# pre-processing data
df = pd.read_csv('vgsales.csv').dropna()
df['Year'] = df['Year'].astype(int)
df = df.loc[df['Publisher']=='Nintendo']
df = df.loc[(df['Platform']=='Wii') | (df['Platform']=='WiiU')]
df = df[['Platform','NA_Sales','EU_Sales','JP_Sales','Other_Sales','Global_Sales']]
df = df.groupby('Platform').sum().reset_index()
边注:如果你不熟悉 *df.loc[]*
功能,你可以看看我写的这篇文章和下面的其他矢量化熊猫解决方案。
用向量化解决方案看一下“for 循环”的替代方案。
towardsdatascience.com](/you-dont-always-have-to-loop-through-rows-in-pandas-22a970b347ac)
如何融化数据帧
您可以在上表中看到,我们有几个不同地区的总销售额。虽然这很容易阅读,但它不是最好的表结构。
我们的目标是将所有的销售额放在一列中,将所有的销售区域放在另一列中。
在此之前,我们先简单介绍一下df.melt
函数。该函数有四个关键参数:
- id_vars - >用来标识每一行的列(类似于索引列)—传递一个列表;
- value_vars - >表格中要压缩(或取消透视)的列。如果您想压缩除 id_vars 之外的所有列,您可以将其留空—传递一个列表;
- var_name - >新“类别”列的名称,其中的值是您传递给“value_vars”的列名—传递一个标量值;
- value_name - >新“值”列的名称-传递一个标量值。
对于我们的表,我们需要用“Platform”列标识每一行,所以我们将把它传递给id_vars
。我们的值列将是除“全球销售”之外的所有销售列,因为从技术上讲,这不是一个区域类别。我们将把一个列名列表传递给value_vars
来实现这一点。
为了提高可读性,我们还将两个新列命名为“销售区域”和“销售额(百万)”,分别包含在var_name
和value_name
参数中。
最终的代码如下所示:
df = df.melt(id_vars=['Platform'],
value_vars=['NA_Sales','EU_Sales','JP_Sales','Other_Sales'], var_name='Sales Region',
value_name='Sales (millions)')
就在那里!我们已经将所有旧的列名移到一个新的 category 列中,并将它们的值合并到一个 values 列中。
为了更好地表示,我们还可以用一行额外的代码对表进行排序:
df1 = df1.sort_values(['Platform','Sales (millions)'], ascending=False)
我希望你发现这个df.melt
的快速浏览对你的熊猫工作有用!不涉及太多细节,您也可以实现这种技术来创建满足 1NF 的表,并更好地组织关系数据库的输入。
Pandas 还提供了比我上面使用的方法更多的排序方法,所以如果你想了解更多,你可以看看这篇文章:
正确探索、理解和组织您的数据。
towardsdatascience.com](/4-different-ways-to-efficiently-sort-a-pandas-dataframe-9aba423f12db)
祝你和熊猫的冒险之旅好运!
通过网络抓取构建数据集的更快捷方式
通过抓取 Yelp 评论来比较 Autoscraper 和 Selenium + BeautifulSoup
托马斯·毕晓普在 Unsplash 上的照片
如果你想跳过 HTML 标签的挖掘,直接进入抓取,这里是要点。**注意,scraper 试图与你想要的列表中的每一项进行精确匹配。**否则,请继续阅读有关网络抓取的简短背景知识,这对于抓取网站很有用,以及抓取时您可能会遇到的一些挑战。
背景
我最近在研究美国的泡沫茶趋势。我想看看饮料订单的变化,精品和特许泡泡茶店开业的时间,以及顾客对这些店的评价。很自然地,我转向 Yelp。但是一些限制很快让我退缩了;我被限制在 Yelp API 上的前 1000 个商家,每个商家我只能得到三个 Yelp 精选评论。
从商业的角度来看,这是有意义的——你不希望其他企业轻易窥探你的成功和失败,并重复这些。但它也展示了网络抓取的更大不幸。一方面,这是为我们感兴趣的课题获取数据的好方法。另一方面,公司很少希望机器人在他们的网站上互动。即使他们提供了 API,他们也不总是公开所有需要的信息。
针对网络抓取的安全性也提高了。从标题数据验证,到验证码挑战,再到机器学习指导的行为方法,已经投入了大量工作来使机器人更难祸害网站。最后,大多数页面不会立即用 HTML 提供有用的信息。相反,它们是通过 JavaScript 执行注入的,并且只有在检测到“真实用户”时才注入。
因此,值得信赖的过程:
- 手动导航到网站
- 突出显示感兴趣的部分
- 右键单击并检查元素
- 复制 html 标记或 XPath,并使用 BeautifulSoup 之类的库来解析 HTML
该过程
这是我项目中的一个例子。比方说,你想解析 Yelp 上关于某个泡泡茶店的评论https://www . Yelp . com/biz/chun-yang-tea-flushing-new York-flushing?osq = bubble % 20 tea&sort _ by = date _ desc(我不属于这家泡泡茶店,也不属于 Yelp。这是我目前项目中的一个样本,分析美国的泡沫茶趋势。)
为了在动态网页上执行任何 JavaScript,您首先需要设置一个无头浏览器,或者模拟真实浏览器的标题。
然后,将它连接到一个可以从 HTML 和 XML 文件中提取数据的库。
为了找出将我引向评论的特定标签lemon--span__373c0__3997G raw__373c0__3rKqk
,我按照上面编号的步骤列表,突出显示一个示例评论,检查元素,并四处窥探感兴趣的标签。
问题是
这实际上是非常脆弱的,因为网站可能会随时改变它们呈现页面的方式。更重要的是,这个过程是多余的,因为我们需要首先手动找到想要的标签,然后才能设置一个自动化的 webscraper。
另一种方法
与其搜索 HTML 标记或 XPath,为什么不使用简单的匹配规则自动进行手动搜索呢?这是 Alireza Mika 的 AutoScraper 库的基本前提。让我们完成搜集 Yelp 评论的相同任务,这次是用 AutoScraper 库。
AutoScraper
对象#3 接受目标 url #1 和想要的项目列表#2,并围绕提供的参数#4 建立一些规则。请注意,它只会标记与感兴趣的项目完全匹配的标签;因此,我列入通缉名单的评论是 Yelp 网页上第一篇完整的评论。
在打印results
时,你将会看到 webscraper 找到的所有元素。您可以使用以下命令在同一个或另一个 url 上再次获取这些结果。
scraper.get_result_similar(url)
你可能会注意到,刮刀已经获得了一些无关的信息。您可以微调其选择,方法是首先根据刮刀已学习的规则对其进行分组:
groups = scraper.get_result_similar(url, grouped=True)
由于groups
是一个字典,你可以通过调用print(groups.keys())
得到规则的名称
然后,您可以使用特定的规则键入字典:
groups['rule_io6e']
如果指定规则的结果准确地反映了期望的结果,你可以选择用方法调用来保持规则:
scraper.keep_rules('rule_io6e')
最后,您可以将模型保存到文件中以备后用。
scraper.save('yelp-reviews')
最后
当然,这个库并不是万无一失的。如果没有浏览器模拟器,点击量大的网页(如谷歌的商业评论)将很难实现自动化。
由于 AutoScraper 希望通缉列表中的物品与网站上出现的物品完全匹配,因此很难确定一个不断更新的值,如股票价格。
然而,作为开发人员,我们的部分职责是将解决方案沿着管道连接在一起,以迭代或创建新产品。希望你可以利用这个抓取库,无论是在 scrapy 这样的框架中,还是只是为了简化你的下一个抓取任务。
不管你如何决定刮一个网站,这样做负责任!
- 不要用请求轰炸网站。这是网络抓取新手犯的头号错误:他们试图通过一次从多个服务器发送多个请求来加快抓取速度——这是一种 DDoS 攻击!
- 尊重 robots.txt:你通常可以通过在索引页面添加
robots.txt
来找到它们。比如https://www.yelp.com/robots.txt - 使用提供的 API!
TensorBoard 快速入门指南
如何使用 TensorBoard 可视化 ML 实验
艾萨克·史密斯在 Unsplash 上拍摄的照片
大家都认同“视觉胜于文字”。可视化在任何一种解释中都提供了可行性和交互性。ML 建模也是如此。人们可能希望监控训练损失或权重和偏差,以改善模型性能。这可以用 TensorBoard 来可视化。
TensorBoard 是 TensorFlow 的可视化工具包。它提供了各种功能来绘制/显示机器学习管道的各个方面。
在本文中,我们将介绍 TensorBoard 的基础知识,并了解如何可视化各种机器学习任务中的一些要素。
如何推出 TensorBoard?
首先,我们需要了解如何使用命令行/笔记本导入和启动 TensorBoard。我们使用这个神奇的命令加载 TensorBoard 笔记本扩展:
%load_ext tensorboard
通过命令行或在笔记本中启动 TensorBoard。在笔记本上,使用 %tensorboard 线条魔法。在命令行上,运行不带“%”的相同命令。
%tensorboard --logdir <log_directory>
在接下来的章节中,我们将会看到什么是日志目录以及它的重要性。
损耗
一个模型应该是通用的,而且必须对看不见的数据做出准确的预测。为此,我们监控验证(或开发)数据的损失和其他指标,并确保损失不会相差太多。这可以通过在培训时间内可视化这些指标以更有洞察力的方式来完成。
可视化训练和评估损失和准确性
前面提到的是 TensorBoard 对 Train(橙色)和 Val(蓝色)损耗和精确度的交互式可视化(从上到下)。可以清楚地观察到,训练和 val 损失在训练过程中一直在减少(横轴是历元),这给出了模型正在实现泛化以及低偏差的直觉。读取偏差-方差权衡。
那么,我们该怎么做呢?
使用 Keras API
当使用 keras API 训练一个模型时,我们创建一个 tensorboard 回调,确保指标被记录在指定的目录中。
日志记录指标
使用自定义训练循环
当手动定义训练循环时,我们需要手动记录损失。 tf.summary API 促进了这一点。首先,我们为指定的日志目录定义一个文件写入器(分别用于训练和测试),然后使用这个文件写入器实例,我们在每个时期后将数量记录为标量**。因此,我们可以在训练过程中逐步观察这些指标的趋势。**
自定义培训中的手动登录
可训练参数
在前面的部分中,在创建 tensorboard 回调时,我们将 histogram_freq 参数设置为 1。
tensorboard_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, **histogram_freq=1**)
直方图和分布仪表盘允许我们可视化张量随时间的分布。使用这些,我们可以监控权重、偏差、激活等等。
histogram_freq 告诉 tensorflow 在每个历元后计算分布。如果设置为 0,则不会绘制任何分布。
密集层权重分布的偏移和叠加直方图
上图是模型中密集(完全连通)图层的权重分布直方图。左边是偏移视图,而右边是同一分布的叠加视图。
请注意,该分布类似于正态分布。
偏移视图
在偏移视图中,我们有一个三维图形:
- 水平轴对应于权重的值;基本上这一层的权重取值范围。在这种情况下,[-0.6 到 0.6]。
- 垂直轴对应于分布。直观地,这些值显示了层中相应权重值相对于其他值的出现次数。例如,在上面的图像中,我们可以看到峰值为 0.0626 的 685,这表面上意味着 685 个输入假定值为 0.0626。
- 深度轴本质上是步骤(或时期)。我们可以观察这些步骤中重量分布的变化。
覆盖视图
叠加视图本质上是同一直方图的二维表示。这里,深度(历元)轴被压缩以获得分布之间的直接比较。我们可以将鼠标悬停在图上,突出显示特定步骤的分布。
还有另一种方法来可视化权重在各个时期的分布。
各时期权重和偏差范围的趋势
这是 tensorboard 互动工具包的发行版标签。
相邻的图实际上是先前直方图中深度和水平轴之间的图。
该图本质上描述了层的权重值在各个时期的变化范围。
韵律学
使用 TensorBoard,以及前面讨论的默认指标,我们还可以记录和可视化我们在建模中使用的任何自定义指标。在本例中,我们将可视化学习率,该学习率将由自定义学习率调度程序进行调整。
自定义学习率计划程序回调
我们首先定义一个自定义的学习率计划。然后我们为它创建一个回调,确保调度程序在定义每个时期的学习速率时被调用。我们已经使用 tf.summary API 记录了学习率,我们在前面的小节中已经讨论过了。
监控各时期的学习率
可以观察到,无论我们在调度程序中定义了什么,学习率都会下降(参见时期 10、20 和 50)。
计算图表
我们可以使用图形仪表板轻松查看模型结构的概念图,并确保它与我们的预期设计相匹配。这也是对 TensorFlow 如何解释模型的一个很好的洞察。
TensorBoard 的图表仪表板
每个展开的视图都显示了对模型计算工作流的更深入的了解。
对于 Keras 模型,除了创建一个 tensorboard 回调来查看 graphs 仪表板之外,不需要任何特别的工作。
然而,在必须定义自定义计算的情况下, tf.function 注释将 python 计算函数转换成张量流图。可以使用 tf.summary 跟踪 API 来跟踪和记录这个图表。
追踪 tf.function 图
如文档中所述,要使用摘要跟踪 API:
- 在您的函数调用站点之前立即使用 tf.summary.trace_on() 。
- 通过传递 profiler=True 向图形添加分析信息(内存、CPU 时间)
- 使用摘要文件编写器,调用*TF . Summary . trace _ export()*保存日志数据
形象
绘制图像类似于绘制任何其他标量值。但是要用 TensorBoard 可视化 matplotlib 的图,需要先转换成图像。为此,我们有一个将 pyplot 图转换成图像的样板代码:
绘制到图像
这里,我们举一个例子,用 tensorboard 绘制一个视觉上生动的混淆矩阵。
首先,我们添加一个 LambdaCallback,它将在每个时期后被调用,计算混淆矩阵并记录下来。
创建 lambda 回调
然后,我们使用 pyplot 创建混淆矩阵的可视化。
情节混乱矩阵
这将返回一个 pyplot 图,我们使用前面讨论过的样板代码将它转换成图像。
混淆矩阵在历元上的转换
嵌入
嵌入本质上是非常复杂的量在向量方面的表示,其中向量中的值具有相对于其他相关量的归属的概念。我们可以使用 TensorBoard 的嵌入投影仪来可视化高维嵌入。这对监控 keras 嵌入层很有用。
使用 TensorBoard 的嵌入投影仪可视化嵌入
我们以序列分类任务为例,将 imdb 电影评论分类为正面或负面。我们构建了一个简单的模型,包含一个嵌入层和几个完全连接的层。
为了记录和可视化,我们首先将词汇表中的单词写到文件中。
将词汇表写入文件
然后,我们将训练好的嵌入权重检查点放入一个变量,然后放入一个文件。
从变量中保存训练的权重
最后,我们设置投影仪配置并投影嵌入:
配置和投影
结论
我们看到了什么是 TensorBoard,并探索了一些基本的东西。然而,我想特别提到一些我在这里没有提到的东西。
- 超参数调谐
- 假设分析工具
- 仿形
- 公平性指标(Beta)
如果有兴趣,你可以在这里查看这些。
这里的是本文所涉及主题的完整代码的链接,可以随意分叉。
参考
本指南中使用的代码引用自以下官方 TensorFlow 文档:
[## TensorBoard | TensorFlow 入门
在机器学习中,为了改进某些东西,你通常需要能够测量它。TensorBoard 是一款提供…
www.tensorflow.org](https://www.tensorflow.org/tensorboard/get_started) [## 了解张量板(权重)直方图
看到和理解 TensorBoard 中的标量值真的很简单。然而,不清楚如何…
stackoverflow.com](https://stackoverflow.com/questions/42315202/understanding-tensorboard-weight-histograms)
请参见
[## 深入 TensorBoard:示例教程- neptune.ai
有一个常见的商业说法是,你不能改进你没有衡量的东西。这在机器学习中是正确的,因为…
海王星. ai](https://neptune.ai/blog/tensorboard-tutorial)
CNN 深度学习阅读指南
第一部分:图像识别和卷积骨干网
本系列的下一部分是:第二部分:图像分割
这个系列是关于什么的
想象一下,你一觉醒来,感觉有一种数据科学探险的冲动。你决定投身于人们谈论的深度学习。太好了,在深入无尽的 Github 森林,在远程资源库中四处乱砍之前,您打开 PC,查看一些艺术文献。在你准备的过程中,可能会发生的是,你偶然发现了一个有前途的作品,告诉你他们已经使用了三重 ResNeXt-101 级联掩模 R-CNN 或类似的东西…啊哈…
来源:img lip
你的旅程可能会在这里结束,你会回到你舒适的小屋,没有装满闪亮的算法和知识的箱子,你可以在你当地的酒馆里分享。
这一系列是关于通过你在冒险中必须知道的术语和历史提供一个指南。深度学习文献、科学出版物以及关于它的博客和讨论,充满了概念和模型的缩写和花哨的名称。开始阅读它感觉就像试图用一个普通的水桶抓住一个瀑布。 在这个系列中,你会找到一个阅读指南,引导你浏览科学和非科学的里程碑文献,以及关于深度学习和卷积神经网络(CNN)的额外解释。
这个系列的动机
几年前,我正处于投入深度学习冒险的境地。尽管有数据分析的背景,但习惯深度学习中应用的术语和概念还是有点挑战。开始阅读深度学习文学对我来说就像开始阅读《权力的游戏》小说一样:一大堆无尽的名字和关系;高度分支的家族树,以几乎相同的名字在这里和那里合并和分支…仍然,相当令人兴奋的阅读。
我开始从字面上绘制这些深度学习架构的家谱,最终有了从 2012 年到 2019 年底的 CNN 在图像识别、图像分割和对象检测方面的发展概况。我决定把它写下来,它最终变成了这篇开放存取评论论文[1]:
[## 基于对地观测数据深度学习的目标检测和图像分割:综述-部分…
深度学习(DL)对大部分科学产生了巨大影响,并日益成为一种自适应的学习方法
www.mdpi.com](https://www.mdpi.com/2072-4292/12/10/1667)
非常欢迎任何对以科学文献为重点的 CNN 图像处理深度学习的科学但直观的综述和直接阅读指南感兴趣的人阅读它。尽管它是为遥感杂志写的,但它从计算机视觉的角度讲述了进化,因此适用于使用 CNN 进行图像处理的每个领域,而不仅仅是遥感。
"好吧,既然这个指南已经存在,为什么还要写这篇中间文章呢?"合法的问题,为了进一步强调《权力的游戏》的类比,这样考虑它:主要的书籍讲述了所有事实和进展的故事,直到结束;与在会议、同行评审期刊和 arXiv 上发表的关于深度学习的科学文献相同。你可以通过阅读主要文献来了解整个故事。但是还有更多的,支持主要情节的次要故事,同人小说和关于单个角色的讨论,关于我们感兴趣的世界起源的整个故事,或者仅仅是传说。对我来说,我认为像 Medium、Youtube 或 Stackexchange boards 这样的地方是你可以找到关于深度学习文献的知识的来源,这使得主要故事更加直观。因此,除了科学文献之外,这份阅读指南还有一些其他的来源,我发现这些来源对于思考科学发表的论文中所讨论的内容非常有帮助。
如何使用本指南
下面的表格是以这样一种方式组织的,你可以决定你想要深入到什么程度。每个表格中的前几个来源是介绍、概述或评论。其余的按某种方式排序,你将逐步需要以前来源的信息。所以,我建议去这个系列的 Github 库,拿到表格,开始阅读,自己做笔记。花所有你需要的时间来通过,但是每次你在信息的深地牢中迷路时,回到指南并想出下一步去哪里,或者回到一个你感觉舒服的点并重新开始。
这份阅读指南发表在媒体故事系列中,是一份关于 CNN 深度学习的阅读指南。它补充道…
github.com](https://github.com/thho/CNN_reading_guide)
我希望你能像我一样享受这次冒险,并经历那些洞察力开始相互交融的史诗般的时刻!
深度学习
来源: imgflip
图像识别和卷积骨干网
2012 年,Alex Krizhevsky 等人[2]通过引入 CNN AlexNet 赢得了 ILSVRC。加上 Ciresan 等人(2012) [3]的发表,2012 年可以被视为深度学习和 CNN 研究现代发展的起点。这两个出版物都是关于预测图像的单个标签的任务,即所谓的图像识别或图像分类。这项任务的后继者正致力于优化 CNN 的重要特征提取器,即所谓的卷积骨干网。由于卷积骨干也用于例如图像分割和对象检测,图像识别的发展成为整个领域的驱动力。因此,理解细胞神经网络在图像识别方面的发展对于进一步阅读是至关重要的。
介绍用于图像识别的 CNN 架构及其在 ImageNet 2012 数据集上的性能,圆圈的大小与对数标度中的参数数量有关。资料来源: Hoeser and Kuenzer 2020 第 10 页 [1]。
上图显示了分为 5 个系列的里程碑建筑,有助于组织阅读
古典建筑
Vintage 架构以其堆叠运算的理念而闻名,该理念在深入网络的同时从输入数据中提取要素。他们建立了这种经常被比作哺乳动物视觉皮层的结构。
盗梦空间系列
Inception 家族起源于 Le Cun 等人 1989 年的早期工作[4](所谓的 LeNet),其网络也被称为 GoogLeNet。他们因以下原因而闻名:
- 复杂的构建模块
- 参数高效设计,如卷积运算的瓶颈设计或因子分解
- 最重要的是,Inception 家族引入了批量规范化,这对训练深度网络非常重要。
ResNet 家族
ResNet 家族都是关于残余连接的。这种设计卷积模块的新方法,通过连接绕过卷积运算,使网络变得相当深入,但仍然是可训练的。ResNet 家族的架构是当今非常受欢迎的特征提取器。
高效的设计
最后一组是 NAS 和 MobileNet 系列,因为它们的目标都是参数高效,它们共同发展,最终成为 2019 年的高效网络模型,即 sota 架构。
手头有了这些文献,你就为深度学习冒险的第一个挑战做好了充分的准备。我强烈建议你做些旁门左道的事情,比如访问一个在线课程,或者通过探索 TensorFlow 或 Pytorch 来尝试一下,如果你已经准备好进行下一步,就回到你的阅读指南。在本系列的下一部分中再见,我们将探讨图像分割这一章。
参考
[1]赫泽,T;利用对地观测数据的深度学习进行目标探测和图像分割:综述-第一部分:发展和最近趋势。遥感 2020,12(10),1667。DOI: 10.3390/rs12101667。
[2]克里热夫斯基,a;苏茨基弗岛;Hinton,例如,使用深度卷积神经网络的 ImageNet 分类。神经信息处理系统的进展:f .佩雷拉、Burges、C.J.C .、Bottou、l .、Weinberger、K.Q .编辑。;柯伦联合公司:美国纽约州红钩镇,2012 年;第 25 卷,第 1097-1105 页。
[3] Ciresan,d;Meier,u;用于图像分类的多列深度神经网络。2012 年 IEEE 计算机视觉和模式识别会议(CVPR)论文集,美国罗德岛普罗维登斯,2012 年 6 月 16-21 日;第 3642-3649 页。
[4] LeCun,y;博瑟湾;登克,J.S。亨德森博士;霍华德;哈伯德,w。应用于手写邮政编码识别的反向传播。神经计算。1989, 1, 541–551.
CNN 深度学习阅读指南
第二部分:图像分割
欢迎回到本系列的第二部分。如果你错过了第一部分,看看这里:第一部分:图像识别与卷积骨干 。
在这一部分中,您将通过有关卷积神经网络(CNN)图像分割的文献找到指南,直到 2019 年。它在 这篇开放存取综述论文 中增加了非科学来源,以进一步增加对 CNN 进化的直观理解。
与第一部分相同,您可以在 github 资源库中找到源代码表:
这份阅读指南发表在媒体故事系列中,是一份关于 CNN 深度学习的阅读指南。它补充道…
github.com](https://github.com/thho/CNN_reading_guide)
现在,让我们和 CNN 一起进入深度学习冒险的下一个篇章。
基于细胞神经网络的图像分割概述
在图像分割过程中,对每个像素预测一个类别,如下所示:
图像分割示例。修改依据: Hoeser and Kuenzer 2020 第 8 页【1】
当我们在第一部分中讨论的 CNN变得更加流行时,它们首先被用于所谓的基于小块的图像分割。因此,CNN 以移动窗口方式在输入图像上移动,并预测小块(整个图像的一小部分)或整个小块的中心像素的类别。
随着 Long 等人 2014 年[2]的工作,所谓的全卷积网络(FCNs)被引入,使用 CNN 的图像分割变得更加复杂。总的来说,FCNs 中的处理看起来是这样的:首先通过使用卷积骨干从输入图像中提取特征(编码器,参见第一部分)。因此,分辨率越来越小,而特征深度越来越大。这样提取的特征图具有高语义,但是没有精确的定位。由于我们需要对图像分割进行逐像素预测,因此该特征图会被向上采样回输入分辨率**(解码器)**。与输入图像的不同之处在于,每个像素持有一个离散的类别标签,因此图像被分割成语义上有意义的类别。
存在两种主要的不同概念,即如何在解码器中进行上采样:
- 朴素解码器(该术语例如在 Chen 等人 2018 [3]中使用):通过应用例如双线性插值来完成上采样
- **编码器-解码器:**上采样是通过可训练的去卷积操作和/或通过在上采样期间将来自编码器部分的特征与更高的定位信息合并来完成的,参见那些例子:
资料来源:Hoeser 和 Kuenzer 2020 年第 17 页【1】
为了利用深度学习深入研究图像分割,下表中的来源是很好的起点。请注意,除了 CNN 之外,还有其他执行图像分割的深度学习模型类型,如生成对抗网络(GANs)或长短期记忆(LSTM)方法;本指南主要关注 CNN。此外,有时从图像分割的角度讨论 R-CNN 家族的模型。本指南将在下一部分讨论物体检测时讨论它们。所以,当你在别的地方读到它们(比如在评论文章中)而这里没有提到它们时,不要感到困惑。
模糊神经网络在图像分割中的发展
PASCAL-VOC 2012 基准数据集上不同 FCN 启发的里程碑式架构的性能演变概述。*这些模型在其他数据集上进行了测试。资料来源:Hoeser 和 Kuenzer,2020 年,第 17 页[1]
DeepLab 家族的发展是 FCN 启发的图像分割模型发展的特征。DeepLab 变体可以在 naive-decoder 和 encoder-decoder 模型中找到。因此,本指南首先着眼于简单的解码器,然后转向编码器-解码器模型,从而对这一系列进行定位。
朴素解码器模型
朴素解码器模型的最重要的见解主要是建立所谓的 atrous 卷积和用于像素级预测的长距离图像上下文开发。阿特鲁卷积是普通卷积的一种变体,它允许在不损失图像分辨率的情况下增加感受野。DeepLab-V2 [4]中著名的阿特鲁空间金字塔池模块( ASPP 模块)以及后来的组合:Atrous 卷积和长距离图像上下文开发。阅读以下文献时,请关注这些功能的发展——阿特鲁卷积、ASPP 模块和远程图像上下文开发/解析。
编码器-解码器模型
今天,最著名的编码器-解码器可能是 U-Net [5]。为分析医学图像而开发的 CNN。其清晰的结构吸引了许多研究人员进行试验和采用,并以其跳跃连接而闻名,这允许编码器和解码器路径之间共享功能。编码器-解码器模型关注于在解码器中的上采样期间,利用来自编码器的更局部精确的特征映射来增强语义丰富的特征映射。
有了手头的文献,你将能够思考现代图像分割论文和 CNN 的实现。让我们在第三部分再次见面,我们将讨论对象检测。
参考
[1]赫泽,T;利用对地观测数据的深度学习进行目标探测和图像分割:综述-第一部分:发展和最近趋势。遥感 2020,12(10),1667。DOI: 10.3390/rs12101667。
[2]龙,j;谢尔哈默,e;语义分割的完全卷积网络。IEEE Trans。肛门模式。马赫。智能。2014, 39, 640–651.
[3]陈;朱;帕潘德里欧;施若夫,f;语义图像分割的阿特鲁可分卷积编码器-解码器。在计算机视觉领域——ECCV 2018;法拉利 v,赫伯特 m,斯明奇塞斯库 c;韦斯,y,编辑。;施普林格国际出版公司:瑞士查姆,2018 年;第 833-851 页
[4]陈;帕潘德里欧;科基诺斯岛;墨菲,k。用深度卷积网、阿特鲁卷积和全连接条件随机场进行语义图像分割。IEEE Trans。肛门模式。
马赫。智能。2016, 40, 834–848.
[5] Ronneberger,o;菲舍尔,p。生物医学图像分割的卷积网络。医学图像计算和计算机辅助介入——MICCAI 2015;Navab,Hornegger,j .,
Wells,W.M .,Frangi,A.F .编辑;施普林格国际出版公司:瑞士查姆,2015 年;第 234-241 页。
Python 中的实时产品推荐器
克里斯蒂安·威迪格在 Unsplash 上拍摄的照片
我们如何调整我们的电子购物体验?
我们可能会同意,我们这些熟悉网上购物的人都有在亚马逊购物的经历。多年来,它无疑已经成为最大的电子购物中心之一。因此,当我们搜索某样东西时,我们可以依靠亚马逊的搜索算法,根据我们的搜索词为我们提供几个最佳选择。让我们来谈谈如何轻松使用基于亚马逊结果的实时产品推荐器,并微调我们的购物体验。
这个想法背后的动机
驱动的想法是,看看我们能使我们的购物过程变得多么健壮和用户友好。比如说,我们想买一副耳机。如果我们在亚马逊上搜索,它会给出一个大约 25-30 种产品的列表。现在,每个买家都有一些偏好。这些偏好中最重要的是品牌规格和定价。除此之外,买家还会考虑其他几个因素,如产品受欢迎程度、产品评级、产品评论和最佳价格匹配。此外,作为用户,我们有时也会觉得,如果我们能一眼看到几个产品提供的规格,并从专家的角度做出决定,那就太好了。
现在,每个顾客的需求都不一样。比方说,一些购物者关注评论,一些关注评级,而另一些则坚持价格。所以,如果我们能给用户提供决定他/她想关注什么的权力,这不是很好吗?所以,让我们看看如何实现这些目标。
这个想法
这个想法是给每个产品分配一个基于字段的分数,用户可以在购物时查看。例如,我们分配一个产品,基于流行度的分数,基于评论的分数,等等。随后,我们根据用户偏好计算加权分数。
让我们用一个具体的例子来看看这个想法。比如说,我们想买一个耳机。因此,我们搜索并获得一个包含 25 个项目的列表。我们根据评级为每个产品分配可变分数 x1,根据受欢迎程度分配 x2,根据评论分配 x3,根据价格限制分配 x4。现在,我们询问用户他/她是否有任何偏好,比如更关注某个方面。例如,如果用户希望更多地关注评论,我们将整体得分计算如下:
y= x1+x2+ax3+x4
这给了 x3 更多的权重。如果用户没有这样的偏好,那么我们可以计算为。
y= x1+x2+x3+x4
这里,我们将每个值标准化为最大值 1,以保持每个因素的权重平衡。接下来,我们可以根据 y 值对产品进行排序,以获得我们的结果。
同时,我们将创建所有产品的规格列表,以帮助具有特定需求的用户直观地了解哪种产品最适合他们。
让我们跳到应用程序
应用
如果我们在亚马逊网站上搜索,我们的选项如下所示。
我们将废弃亚马逊搜索算法给出的选项。我们将使用 Selenium Webdriver 来完成这项工作。
如果我们仔细观察搜索栏,并打破它,我们可以很容易地框住我们的直接搜索网址,这将有助于我们登陆亚马逊搜索页面。
import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoupimport requests
def search_am(phrase):
link="[https://www.amazon.in/s?k=](https://www.amazon.in/s?k=)"
l_end="&ref=nb_sb_noss"
phrase_w= phrase.replace(' ','+')
link_full=link+phrase_w+l_end
#print(link_full)
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 5)
driver.get(link_full)
names_f=[]
names=driver.find_elements_by_tag_name("a")
i=0
for name in names:
className = name.get_attribute('class')
if className=='a-link-normal a-text-normal':
names_f.append(name)
i+=1
links=[]
for i in names_f:
temp= i.get_attribute('href')
links.append(temp)
driver.quit()
return links
上面的函数帮助我们抓取搜索页面上所有列出的产品的所有链接,并返回链接。
每个链接都将我们引向一个特定的产品页面。
接下来,我们将重点关注产品页面的某些部分。
- 评级部分:
这部分提到产品的等级。
2.受欢迎程度部分:在这里,我用收视率来衡量受欢迎程度。
3.价格部分:这部分给出了产品的价格。
4.规格部分:它列出了所有的产品规格和细节。
5.评论部分:这个部分反映了产品的评论。
现在,如果我们在这里用粗体字显示,那么每个评估都有一个声明。这一行给出了评论的要点。我们会拿起这些句子,判断情绪,分配复习分数。
让我们首先从产品页面中删除所需的细节。
def get_element_dets(link):
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 2)
driver.get(link)
title_o= driver.find_elements_by_id("productTitle")
title=title_o[0].text
number_o= driver.find_elements_by_id("acrCustomerReviewText")
try:
popularity=(number_o[0].text)
except:
popularity='0'
rate=driver.find_elements_by_css_selector("#reviewsMedley > div > div.a-fixed-left-grid-col.a-col-left > div.a-section.a-spacing-none.a-spacing-top-mini.cr-widget-ACR > div.a-fixed-left-grid.AverageCustomerReviews.a-spacing-small > div > div.a-fixed-left-grid-col.aok-align-center.a-col-right > div > span > span")
try:
rate_o=(rate[0].text).split(' ')[0]
except:
rate_o='0'
feat_f=[]
tag=[]
value=[]
#features=driver.find_elements_by_css_selector("#feature-bullets > ul > li > span")
#for f in features:
# feat_f.append(f.text)
price=0
try:
tag_o=driver.find_elements_by_tag_name('th')
for name in tag_o:
className = name.get_attribute('class')
if className=='a-color-secondary a-size-base prodDetSectionEntry':
tag.append(name.text)
value_o=driver.find_elements_by_tag_name('td')
for name in value_o:
className = name.get_attribute('class')
if className=='a-size-base':
value.append(name.text)
i=0
while i<len(value):
t=str(tag[i])+':'+str(value[i])
feat_f.append(t)
i+=1
except:
feat_f=[':']
try:
price_o= driver.find_elements_by_id("priceblock_ourprice")
for name in price_o:
className = name.get_attribute('class')
if className=='a-size-medium a-color-price priceBlockBuyingPriceString':
price=(name.text)
break
except:
price=0
#price=price_o.text
feedbacks=driver.find_elements_by_tag_name("a")
feedback_f=[]
for feed in feedbacks:
className = feed.get_attribute('class')
if className=='a-size-base a-link-normal review-title a-color-base review-title-content a-text-bold':
feedback_f.append(feed.text)
driver.quit()
return feedback_f,title,rate_o,popularity,feat_f,price
上面的代码片段有助于删除产品页面所需的所有细节,并返回产品标题反馈、评分、流行度和其他所需的值。
def caller(phrase):
links=search_am(phrase)
data={}
print(len(links))
for link in links:
data[link]={}
feedback_f,title,rate,popularity,feat_f,price=get_element_dets(link)
data[link]['feedback']=feedback_f
data[link]['title']=title
data[link]['rate']=rate
data[link]['popularity']=popularity
data[link]['features']=feat_f
if isinstance(price, int):
data[link]['price']=price
else:
data[link]['price']=price.split(' ')[1]
#print(len(data))
return data
上面的代码片段有助于以字典格式排列所有产品及其相应的特性。
每个产品的键都是它的链接,相应地,嵌套字典中的所有特性都是键值对。
Amazon 页面的标签很少会有变化,不过,最好还是使用 try 和 exception 块来处理错误,以防万一。
现在,在我们丢弃了所有需要的数据之后,让我们开始分配分数。
基于流行度和等级的系统
def assign_popularity_rating():
with open('products.json', 'r') as openfile:
data = json.load(openfile)
temp=0
for k in data.keys():
p=int(data[k]['popularity'].split(' ')[0])
r=float(data[k]['rate'])
if p<50:
temp=1
elif p<100:
temp=2
elif p<150:
temp=3
else:
temp=4
score=(temp)
data[k]['Popularity_Score']=score
data[k]['Rating_Score']=r
with open("products_mod.json", "w") as outfile:
json.dump(data, outfile)
上面的代码用于根据人口和评级来分配每个产品的分数。对于人口,我使用了宁滨或类的方法。我们已经从刮擦获得的值中获得的评级。
审查基于情感的系统
from textblob import TextBlob
def assign_sentiment_rating():
with open('products_mod.json', 'r') as openfile:
data = json.load(openfile)
sm=0
for k in data.keys():
temp=data[k]['feedback']
z=0
sm=0
for i in temp:
#print(i)
z+=1
t=TextBlob(i).sentiment.polarity
#print(t)
sm+=t
if (z==0):
rating=0
else:
rating=sm/z
data[k]['Review_Score']=rating
with open("products_mod_2.json", "w") as outfile:
json.dump(data, outfile)
对于评论情感极性检测,我使用了 TextBlob 库的情感极性功能。它根据从评论中检测到的情绪分配一个从-1 到+1 的值。对于一个产品,我们有多个评论,因此,对于每个评论,我们都有一个值。因此,我们将从所有评论中获得的所有值相加,并除以评论的数量,试图使总分小于或等于-1。因此,我们对每个产品重复这一过程,并获得每个产品的评级。
价格相关性系统
def check_price_relevence():
with open('products_mod_2.json', 'r') as openfile:
data = json.load(openfile)
print("Specify the approx price to tune search")
price=int(input())
print("Specify a margin")
margin=int(input())
for k in data.keys():
data_ref=str(data[k]['price']).replace(',','')
temp=float(data_ref)
if temp<price+margin and temp>price-margin:
rating=1
else:
rating=0
data[k]['Price_relevence_Score']=rating
with open("products_mod_3.json", "w") as outfile:
json.dump(data, outfile)
这是我们的价格相关性函数。它要求一个大概的价格和比较的利润。然后,它比较产品的价格和范围,以分配相关性分数。
在分配完所有分数后,我们的字典会为每个产品添加以下内容。
收集规格
接下来,我们将为有特定需求的客户创建一个包含所有列出产品规格的 csv 或 excel 文件。
import pandas as pd
def form_featureset():
with open('products_mod_3.json', 'r') as openfile:
data = json.load(openfile)
feat=[]
set_c=[]
for k in data.keys():
temp=data[k]['features']
temp2=[]
for i in temp:
tag=i.split(':')[0]
if tag not in feat:
feat.append(tag)
#print(feat)
for k in data.keys():
temp=data[k]['features']
temp2=[-1]*len(feat)
for i in temp:
tag=i.split(':')[0]
#print(tag)
ind= feat.index(tag)
#print(ind)
temp2[ind]= i.split(':')[1]
set_c.append(temp2)
df=pd.DataFrame(set_c,columns=feat)
df.to_csv('product_descriptions.csv',index=False)
return df
这个片段生成了一个数据框,其中包含所有产品及其列出的规格,以提供对可用规格的洞察。
生成的规格表如下所示。对于产品页面中没有给出的值,我填了-1。
这些表格将有助于客户比较查找规格。
加权分数
def tune_search(choice):with open('products_mod_3.json', 'r') as openfile:
data = json.load(openfile)
for k in data.keys():
price_rel=data[k]['Price_relevence_Score']
review_score=data[k]['Review_Score']
pop_score=data[k]['Popularity_Score']
pop_score_k=pop_score/4
rate_score=data[k]['Rating_Score']
rate_score_k=rate_score/5
if choice==1:
total_score=5*pop_score_k+rate_score_k+review_score+price_rel
if choice==2:
total_score=pop_score_k+5*rate_score_k+review_score+price_rel
if choice==3:
total_score=pop_score_k+rate_score_k+review_score+5*price_rel
if choice==4:
total_score=pop_score_k+rate_score_k+5*review_score+price_rel
else:
total_score=pop_score_k+rate_score_k+review_score+price_rel
data[k]['Total_score']=total_score
#print(data[k]['Total_score'])
links=sort_d(data)
return links
这段代码片段根据用户的选择提供了一个分数。我使用了一个非常基本的条件驱动方法。我将收视率除以 5,人口除以 4,以保持数值在 0 和 1 之间。这里权重值固定为 5。只是随便选的。
这都是关于我们的代码。
应用
给定的视频演示了该应用
无论选择是什么,我也给出了其他选择的链接,只是为了给用户额外的安慰和尝试其他选择的机会。
在我的例子中,你会看到 chrome 窗口,虽然它是自动的,会自己关闭,但会不断弹出,你可以使用 headless chrome 阻止它启动,并使用 chromeoptions()为你的 chrome 驱动程序利用它。
展望未来
可以通过两种方式修改应用程序或使其更加健壮,但这两种方式都需要数据,目前似乎还没有数据(据我所知)。
- 如果当前的亚马逊情感数据集可用,我们可以制作自己的情感分类器,在其中我们可以将其他类别与积极和消极的情感放在一起,这将有助于我们基于评论的评分更加稳健。
- 如果数据或规格是绝对存在的,我们可以为规格创建我们自己的特性嵌入。例如,如果我们有足够的笔记本电脑数据实例,我们可以为笔记本电脑创建一个嵌入或编码空间。我们可以将每台笔记本电脑表示为其规格的嵌入向量。我们可以根据用户需求创建新的规格向量。在那里,我们可以应用 K-最近邻算法来获得与需求向量最近的 K 个嵌入向量,并根据它们的欧几里德距离对它们进行排序。因此,我们可以获得规格接近用户要求的 k 笔记本电脑。这将让我们添加一个基于相关规范的分数,使我们的系统更加健壮。
结论
因此,我们可以通过几个步骤用 python 构建一个实时产品推荐引擎。
这里是 Github 的链接。
希望这有所帮助。
现实世界的时间序列预测:每日平均汇率
如何应用 ARIMA 模型预测时间序列数据
时间序列数据的平稳性意味着序列的均值、方差和自相关等统计属性不会随时间而改变。序列平稳性的概念对于应用统计预测模型非常重要,因为:
- 像 ARIMA 这样的大多数统计方法都是基于过程是平稳或近似平稳的假设[1]。
- 平稳的时间序列可以提供有意义的样本统计,如均值、方差、与其他变量的相关性[1]。
过程的平稳性可以通过目视检查时间序列图或序列的变差图来验证。可以执行像增强的 Dickey-Fuller** 测试这样的统计测试来检查过程的平稳性。本文通过直观检查时间序列图和变异函数来验证平稳性。**
时间序列图— 如果给定的时间序列图显示一段时间内的恒定均值和方差,则该时间序列图可视为平稳过程。
变异函数— 是一种检查时间序列数据平稳性的图形工具。如果给定过程(时间序列)的变差函数在一定数量的滞后后显示稳定,则该过程被定义为平稳过程。
如果原始时间序列没有表现出平稳性,那么可以通过实施变换(例如对数变换)和差分来稳定该序列。
我们将把 ARIMA 模型应用于真实世界的数据集“美元和欧元之间的日平均汇率”。Sorren Bissgard 和 Murat Kulachi 在《时间序列分析和实例预测》一书中给出了数据集。下面给出了数据集的一个片段:
美元和欧元之间的日平均汇率
平稳性:原始时间序列及其变差函数
图 1 和图 2 分别展示了原始时间序列及其变异函数。图 1 显示该序列不是稳定的,因为它不遵循恒定的均值和方差。图 2 中的变差函数没有显示出稳定性,因为在大约 80°滞后之后,变差函数显示出下降趋势,从长远来看,变差函数可能无法保持稳定的模式,这表明该过程不是稳定的。
图 1:原始时间序列
图 2:原始系列的变差函数
平稳性:区别原始序列
图 3 和图 4 分别显示了原始序列的一元差分过程的时间序列及其变异函数。图 3 示出了一个差分序列遵循恒定的均值和方差,表示平稳序列。此外,图 4 中的一阶差分变异函数显示了稳定系列的特征,因为它证明了长期稳定。因此,一个差分序列适合用于进一步分析。
图 3:原始时间序列的一个不同过程
图 4:一个差分系列的变差函数
调查候选模型并选择最佳模型
可以阅读这篇文章 — 时间序列分析:利用 ACF 和 PACF 图识别 AR 和 MA—了解如何利用 ACF 和 PACF 图选择 ARMA 模型的阶数。
图 5 和图 6 显示了一个差分序列的 ACF 和 PACF。ACF 在一个滞后之后切断,并且 PACF 也从系列的开始切断。因此,ARIMA(p,d,q)可以是其中 p = 0,d = 1,q = 1 的候选模型。然而,我们也试验了 ARIMA (1,1,1)、ARIMA (0,1,2)和 ARIMA (1,1,2)来研究模型的性能。在应用不同的模型后,我们将把 AIC 作为一个性能指标来选择最佳模型。
图 5:一个差分系列的 ACF
图 6:一个差分序列的 PACF
图 6、7、8 和 9 显示了我们在一个差分序列上实现的 4 个不同的前述模型的结果。所有候选模型的方差和标准误差大致相似。AIC 也显示了所有四种模型的相似值。ARIMA (1,1,1)模型的 AIC 最低,为-1398(图 8),尽管所有的估计参数在统计上并不显著。ARIMA (0,1,1)和 ARIMA (0,1,2)可被视为最佳模式,因为它们的 AIC 是第二低的,但 ARIMA (0,1,2)的估计参数不显著。因此,我们最终选择 ARIMA (0,1,1)作为最佳模型(图 6)。
图 6: ARIMA (0,1,1)模型
图 7: ARIMA (1,1,2)模型
图 8: ARIMA (1,1,1)模型
图 9: ARIMA (0,1,2)模型
最终模型的分析
以下是最终模型 ARIMA (0,1,1)的图。白噪声概率显示了白噪声的显著性,残差图显示了正态性。IACF 没有显示出任何不稳定性,白噪声概率是显著的。Q-Q 图遵循线性模式,残差分布也遵循正态曲线,这表明该模型满足正态假设。
时间数列预测法
表 1 显示了该比率的预测值。标准误差显示预测值的稳定性,因为所有标准误差都不显著。图 10 显示了 7 天预测值的曲线,表明曲线稳定。表二。将原始比率值与预测值进行比较。平方误差(SE)显示原始值和预测值之间的平方误差。每个预测比率的 SE 显示预测比率非常接近原始比率,这表明 ARIMA 模型的预测质量良好。
表 1:平均汇率预测
图 10:未来 7 天的汇率预测
表 2:原始汇率和预测汇率的比较
参考
[1]https://people.duke.edu/~rnau/411diff.htm
(真正)温和地介绍命名实体识别以及如何使用它进行数据分析。
自然语言处理变得简单
用 Spacy 发现《权力的游戏》书中最受欢迎的名字!
话来了!托马斯·博诺梅蒂在 Unsplash 上拍摄的照片
NLP 是热门的东西,任何有抱负的数据科学家都应该学习它,对吗?当然,但是 NLP 除了在机器学习项目中的应用之外,还可以发挥更大的作用,因为它可以为数据分析带来强大的工具。
在本文中,我将使用 spacy ,它是最流行的 NLP 任务库之一。它有很好的文档,提供了 10 种语言的模型,还有一个多语言库。我们的数据集将是流行的《权力的游戏》系列的第一本书,可以在这里下载。所有的代码和图表都来自我专门为你制作的笔记本,所以请自便。
为什么使用 NLP 进行分析?
作为数据分析师,我注意到当我们开始学习时,我们学习的很多内容都集中在 ML 建模、预测和人工智能上,有很多很酷的东西要学。然而,当遇到第一份工作机会时,通常会与数据分析、数据清理和数据可视化相关,所以我们应该投入更多的注意力来提高我们在这些领域的技能,NLP 可以在这个过程中提供很多帮助。
文本数据是杂乱的,很难组织。帮助我们理解它的方法之一是将单词转换成记号,记号是单词的数字表示。Spacy 出色地做到了这一点,它还使用一个通常非常有效的复杂统计模型来预测一个词在给定上下文中的功能。
什么是命名实体识别(NER)?
根据文档:“命名实体是一个“现实世界的物体”,它被赋予了一个名字——例如,一个人、一个国家、一个产品或一本书的书名”。下面你可以找到一个例子:
完整的列表可以在这里找到。
如何使用 NER 进行数据分析?
在今天的例子中,我们使用的是《权力的游戏》第一本书,名为《国王的冲突》。假设你正在做你的分析,在这么多的角色中,你问自己,哪一个名字在那本书里出现得最多?好了,不要再害怕了,因为 NER 在这里帮助你!
想把它们都记住是不可能的!来源
首先,让我们看看数据是什么样子的:
来源:作者
好的,这是一个文本文件,每行都是一行。我们需要遍历这些行,并要求 spacy 选择一个名称,并将其保存到一个列表中。很简单,对吧?让我们把它翻译成代码!
首先,创建 NLP 对象。来源:作者
我们首先需要创建一个 NLP 对象。它加载模型,在这种情况下是英文模型,并使用这个对象,我们将转换和预测文本中的单词,如下例所示:
2:迭代每一行。
上面的代码的作用是:
- 创建一个空列表来存储我们的名字;
- 要求 nlp 对象处理每一行;
- 然后,当它预测单词是一个人时,它得到每个标记的文本;
- 最后,它应该将该名称存储在空列表中。
现在,我们可以看到为我们的书选择十大名字的结果:
来源:作者
哇!看那个!请记住,我们没有给算法任何信息,它自己预测了名字,至少对于前 10 名,它们都是正确的。另外,我们只用了很少几行代码就完成了所有这些工作。现在,为了让这些信息看起来更好,为什么不创建一个条形图呢?
结论
今天就到这里。在本文中,我向您展示了自然语言处理不仅仅是关于机器学习,还可以用于分析。我们探索了什么是 NER 以及如何使用它,并给出了一个实际的例子,欢迎您不仅仅是自己去尝试。
我希望你喜欢阅读,请在评论中告诉我你的想法,并在下一篇文章中看到你!
Python 中 NLP 的(非常)温和的介绍
自然语言处理变得简单
握住我的手,让我们一起开始吧。
帕特里克·托马索在 Unsplash 上的照片
我知道,这不容易。NLP 是每个人都在谈论的事情,似乎每个人都在做,除了在人群中迷失和悲伤的你自己。不用担心,自然语言处理(NLP)是一个很难学的东西,即使很少有人会承认这一点。
在本教程中,我将一步一步地讲述基础知识,没有冗长的解释(因为这里的目标只是介绍主题),也提供了后面的所有代码(笔记本是在这里等着你),所以你可以跟随我通过整个过程。
数据来自巴西一家网上商店的顾客评论,原始数据集可以在 OLIST 存储库中找到。我为 NLP 分析创建的转换后的文件可以在这里找到。让我们检查第一行,看看是关于什么的:
来源:作者。
第一列是来自客户留下的评论的文本,第二列告诉是否是正面评论,如果是正面评论,则值为 1 ,如果不是正面评论,则值为 0 。您可以查看本笔记本了解更多关于我如何合并不同数据集以及如何创建目标要素的详细信息。
在这第一个教程中,我将介绍:
- NLP 的使用及其在机器学习中的应用;
- 基本预处理技术;
- 词汇化;
- 标记化。
自然语言处理的使用
我们先来思考一下 NLP 的可能性。理解人们对某事的看法是一个强有力的工具,但是语言是一个很难学的东西。想想我们自己学习语言的过程,用词汇中所有不同的单词和它们之间的组合,以一种有意义的方式完全吸收它需要多长时间?然后,我们需要发展发现隐藏在词语背后的微妙情绪的技能,以便将一些事情分为真诚、傲慢、真实、虚假、讽刺等。如果这对我们来说很难,因为计算机要复杂得多,因为它根本不理解任何单词!
是的,它是正确的,计算机只理解数字,而不是单词。那么,如何让他们理解我们所说或所写的东西呢?简单来说,我们需要将单词转换成数字。当我们这样做时,计算机可以处理信息,并根据计算产生强大的洞察力,因此需要在运行任何机器学习文本数据中的算法之前进行这种转换。
自然语言处理和机器学习
在我们让计算机理解单词之后,我们可以使用机器学习来预测这些单词,如构建翻译应用程序,在打字时建议下一个单词,以及更复杂的应用程序,如理解文本的情感。
预处理技术
使文本计算机友好的第一步是清理它。我们这样做是为了让学习过程更顺利、更快。由于本文无意全面研究预处理技术,所以我将向您展示最基本的技术:
- 小写单词:否则电脑会把“猫”和“猫”理解成不同的东西。
- 移除:
1- 标点:因为标点本身没有任何意义。
2- 停用词:是经常出现的常用词,如“该”、“安”、“他”、“自己”等。删除这些单词减少了算法需要处理的数据量,使其速度更快。
词汇化
词汇化是将一个词转换成其基本形式的过程。我们可以认为基本形式应该出现在字典中,例如,英语中的单词“walked”、“walking”和“walks”都来自同一个词根“walk”,这就是该单词的引理和。
有趣的是,词汇化也用于根据词义而不仅仅是拼写来转换单词。一个例子是“更好”,它有“好”作为它的引理。这是一个强大的工具,因为它有助于减少以后需要处理的单词数量。
标记化
还记得我说过计算机只能理解数字吗?嗯,标记化就是将一个单词转换成一个数字表示,或者一个标记的过程。标记非常有用,因为它们使得在文本数据中应用机器学习模型成为可能,并且很少有方法可以做到这一点。
在 python 中,有一个名为 *spacy,*的库,它附带了一些非常方便的函数,可以帮助我们用几行代码完成所有这些预处理。我已经创建了下面的例子,所以你可以检查它的行动:
来源:作者
我们可以看到,记号将每个单词和标点符号分隔成单独的记号,并且引理将单词简化为它们的基本形式。如果你是一个说葡萄牙语的人,你会注意到它并没有那么好,就像将“antes”(之前)转换为“antar”,这没有任何意义。它也没有删除一些常见的单词,如“e”和“ok”。葡萄牙语库似乎是一个正在进行的项目,所以如果你打算使用除英语之外的任何包,请注意,但这是一个很好的第一种方法。请随意在其他文本中尝试该代码,看看它是如何工作的。
今天就到这里,我希望它能帮助你理解如何从 NLP 开始。非常欢迎你在下面的评论中留下你的想法。在你看来,NLP 的真正基础是什么?
(非常)温和地介绍了 Python 中的 Web 抓取
废弃你的第一个网页,开始创建你自己的数据集!
就像在一个建筑工地,网页抓取是关于使用正确的工具!来源
当我写了一篇关于数据科学家有能力废弃自己的数据的重要性的文章时,我收到了几个关于如何开始这样做的问题,尽管有一些令人惊叹的教程,但它们可能会变得非常复杂,使完全初学者很难轻松跟上。
我在这里的目的是向您展示有关工具和代码的基础知识,您可以使用这些工具和代码来收集数据并构建您的第一个数据集。在此之后,我希望您能够放心地继续学习和提高您对数据科学这一迷人领域的知识。
写满所有代码的笔记本就在这里。请便:)
你喜欢你的汤吗?
在 python 中,做网页抓取最流行的库是美汤。它帮助我们从 HTML 文件中获取信息,并且,由于所有的网页都是用 HTML 编写的,我们使用大量我们称之为 soup 命令来提取我们需要的数据。
关于 HTML,至少有一些关于它的基本知识是有用的,包括它的书写方式和语法,但我应该警告你,这不是你在几天内就能学会的,所以我建议你在练习抓取技巧的同时学习它,至于我,就我个人而言,当我看到它们被用于实际例子时,我会学得更好。
从哪里开始刮?
在进入亚马逊、IMDB(电影评论)等真实世界的页面之前,我建议你看一下抓取中心,在那里你可以找到专门为想要练习抓取的人创建的页面。我之所以建议这样做,是因为像 e-bay 和其他巨头不希望人们抓取他们的页面,因为这会影响 page 的性能,所以他们创建了一些机制,使抓取变得更加困难。在本教程中,我们将使用一个虚构的书店,所以让我们来看看它是什么样子的:
http://books.toscrape.com/登陆页面。
我们的使命
今天的重点是基础知识,所以我们的目标是用每本书的标题和价格创建一个数据框架,这正是我们接下来要一步一步做的事情。
1-制作汤
第一步是找出我们想要的信息(书名和价格)在网站上的存储位置。要做到这一点,如果使用 Chrome,点击鼠标右键,选择“检查”。将显示所有 HTML 信息。然后,点击检查框左上角的箭头,用吸尘器将它吸到第一本书上,这样它将显示存储该项目信息的类的名称:
图书信息发现课。来源:作者。
所有图书信息都存储在*“product _ pod”类下,这创建了我们所说的容器,*一个存储一组数据的对象。然后,我们将创建一个 soup 对象,只需使用命令 find_all() 获取该页面上每本书的信息:
20
结果显示,我们检索了大约 20 本书的信息。这是因为在 1000 本书的宇宙中,我们在这一页上只展示了 20 本书。我们以后会想办法获取所有书籍的信息。现在,我们将专注于探索第一本书,找出我们需要的信息,书名和价格,存储在哪里。
2-探索第一本书
如上所述,有 20 个容器可用,都具有相同的结构。让我们探索第一个:
结果很长,但是请花几分钟逐行阅读。你能弄清楚标题和价格在哪里吗?
<article class="product_pod"> <div class="image_container">
<a href="catalogue/a-light-in-the-attic_1000/index.html"><img alt="A Light in the Attic" class="thumbnail" src="media/cache/2c/da/2cdad67c44b002e7ead0cc35693c0e8b.jpg"/></a>
</div> <p class="star-rating Three">
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i>
<i class="icon-star"></i> </p> <h3><a href="catalogue/a-light-in-the-attic_1000/index.html" title="A Light in the Attic">A Light in the ...</a></h3> <div class="product_price">
<p class="price_color">£51.77</p>
<p class="instock availability"> <i class="icon-ok"></i> In stock </p>
<form>
<button class="btn btn-primary btn-block" data-loading-text="Adding..." type="submit">Add to basket</button>
</form>
</div>
</article>
如果你不熟悉 HTML,可以把它想象成一棵树。这里我们树的主干是<article class = " product _ pod ">,在这个结构中,一切都在后面。您应该已经注意到,我们在“a”元素下有一个标题,它也在“h3”元素内:
查找书名
要获得这些信息,语法类似于您想要访问数据框中的列,但是使用命令 get() 在“a”元素内导航:
'A Light in the Attic'
很简单,不是吗?价格呢?逻辑总是一样的,但现在我们有了不同的情况:
这里,我们将信息存储在元素“p”的一个类中。要访问它,我们需要使用 find() 函数,它需要对象和类名作为参数:
'51.77'
瞧啊。我们现在有了获取数据所需的代码!
3-抓取所有页面
让我们想想我们需要废弃多少页。通常,像我们这里这样的在线商店,喜欢在每个页面上展示按几个元素分组的产品。在我们的例子中,第一页显示了前 20 本书:
检查网页的组织方式总是很重要的。
有时我们拥有的总页数会显示在页面底部,所以让我们来看看:
要废弃的总页数。
我们不得不删除 50 页,因为每个页面的链接都是一样的,我们需要更改 url 的页码。有了这些知识,我们要做的是:
- 创建一个数字从 1 到 50 的列表;
- 启动两个空列表来存储关于标题和价格的信息;
- 启动一个 for 循环 ,该循环将迭代 50 页;
- 在每个页面中创建一个请求,然后为每本书创建容器;
- 使用另一个 for 循环,迭代每个容器以获得标题和价格;
- 最后,将这些信息添加到列表中。
这正是下面的代码所做的。我再一次邀请你一行一行地仔细阅读。我试图让它尽可能简单,因为理解代码是如何编写的很重要,所以你可以用你自己的方式来写:
4-创建数据框
创建列表后,我们只需使用我们的老朋友熊猫将列表“压缩”在一起,并创建我们想要的数据框:
结果,我们有了一个新鲜出炉的数据框,随时可以使用!
抓取网页后产生的数据框。
最终考虑
我希望你对网络抓取的可能性感到兴奋。这可能非常具有挑战性,因为每个网站都是不同的,我们需要执行的策略也是如此,以便检索每个网站上的数据。但是在我看来,练习使用 Beautifulsoup 是提高你的网页抓取技能的最好方法。接下来,您可以使用该项目的笔记本作为起点,并尝试向数据框中添加更多信息,例如:
- 评级和
- 现货供应。
在您对语法感到满意之后,您还可以尝试改进循环,在每一页书内导航并获得产品描述。无论如何,你在这里学到的知识可以在网上的任何地方使用。
非常感谢你花时间阅读这篇文章,下一篇再见!