熊猫初学者的关键编程概念
照片由 PhotoMIX 公司从 Pexels 拍摄
如果你刚刚开始使用 Python 或熊猫,欢迎使用。
让我先简短地说几句鼓励的话。
学习编码在开始时可能会感到有点令人生畏,因为有很多未知的东西。
除此之外,有时你周围的人会让你泄气: 你没有合适的背景……如果你不知道 x,你就做不了 y……开始接触技术的唯一正当途径是获得学位。
他们错了。
与任何学科一样,编程是一种技能组合,存在于一个范围内。不要相信任何循环论证,如果你不知道如何写代码,你就不能写代码。你唯一需要的是坚持。
你属于。
事实是有很多东西需要学习。这并不总是容易的,需要持续的努力才能达到这个技能范围。
在这篇文章中,我将提供一些基本编程概念的概述,以便当您开始编写 Pandas 代码时,您对正在发生的事情有一个更好的了解。
我会试着把每个概念都带回熊猫图书馆,以便尽可能地让它变得有形。
语言与图书馆
简而言之,编程语言是一套规则和惯例,控制我们如何指示计算机做我们想让它做的事情。
不同的编程语言使用不同的词汇或“语法”。
在 python 中,我们可以通过编写以下内容让计算机返回单词“hello world ”:
print(“hello world”)
在 Java(另一种编程语言)中,我们写道:
System.out.println("hello world");
在幕后,编程语言从高级词汇,如“print”,一直向下转换到 1 和 0。
我们的计算机可以“理解”1 和 0,因为我们可以用物理状态来表示这些值。
例如,我们可以使用电灯开关。当它打开时,我们可以说它代表数字 1,当它关闭时,它代表 0。
伊莎贝拉和路易莎·菲舍尔的照片
电脑有数十亿个被称为晶体管的微小开关,它们以同样的方式工作。结合在一起,它们编码了你需要的所有数据。
“高级”语言离那些 1 和 0 更远,这意味着从语言到硬件状态需要更多的转换。
“低级”语言更接近于 1 和 0,需要较少的翻译。
这里有一个自然的折衷——高级语言往往更慢,但更容易使用。低级语言往往更快,但更难使用。
另一方面,库(又名包)是其他人用编程语言编写的代码,然后整齐地捆绑起来,以便其他程序员可以借用。
Python 是一种编程语言。Pandas 是一个开源软件(即免费的、公开可用的)用 python 编写的数据分析库。
Python 成为数据分析如此受欢迎的选择的原因之一是因为它的开发人员社区已经创建了大量有用的库,包括 Pandas、Numpy、Matplotlib、Scikit-learn 等等。
当我们想要利用这些库中的一个时,我们需要安装代码(一次)并将其导入到我们的文件中(每次我们想要使用它时)。
数据类型/类
就其核心而言,编程就是转换数据;将输入转换成输出。
但并不是所有的数据都一样。我们有不同的数据类型,可以用不同的方式使用。
为了进一步说明这一点,让我们比较两种最常用的数据类型——字符串(也称为文本)和整数。
整数可以整除。字符串不能。
4/2=2.但是“你好”/“再见”并不代表什么。
相反,可以大写字符串,但不能大写整数。
因此,区分数据类型的主要因素是与它们相关联的功能。
在 Python 这样的面向对象语言中,我们可以创建自己的数据类型,通常称为类。
类是一个蓝图,它告诉我们可以用我们的数据类型(方法)做什么,以及我们可以存储关于它们的什么信息(属性)。
一个类的单个实例称为对象。
从上面的例子中,我们可以对字符串运行资本化方法:
但不是 int:
Python 有一些内置的数据类型(类),如 int、string、boolean、list 等。
Pandas 也有自己的类,使得数据分析工作成为可能。
Pandas 中最流行的类是 DataFrame,它存储表格数据(像 excel 电子表格)。
设计 DataFrame 类的开发人员编写代码来赋予它所拥有的功能。
例如,我们可以使用“to_csv”方法用数据帧中的数据创建一个 csv 文件:
dataframe.to_csv(‘my_df.csv’)
同样,这个功能与 DataFrame 类相关联,data frame 类是 Pandas 库的一部分。
通俗地说:别人写了很多代码让你不用。
这就是术语抽象的含义——也是编程中最令人敬畏的事情之一。
其他人写了数百万行代码,从 1 和 0,到 python 语言,到 Pandas 库,到 DataFrame 类,到 to_csv 方法。
但是你所要做的就是写一行代码。
变量
变量是存储值的容器。
在一些语言中,你需要给一个变量分配一个特定的数据类型(这些被称为静态类型语言)。
在其他语言中,您可以将数据存储在变量中,而无需分配特定的类型(动态类型语言)。
Python 是动态类型的。因此,我们可以直接在变量中存储一个值:
my_variable = 5
Java 是静态类型的,所以如果我们想将整数 5 直接放入变量中,我们必须声明该变量是整数的容器,而不是任何其他数据类型的容器:
Int myVariable = 10
我们的变量可以“存储”python 中的任何类。
功能
功能是将输入转换为输出的过程。
如果这听起来很熟悉,那应该是。
我们已经讨论过“方法”,它是函数的一种类型。所有的方法都是函数,不是所有的函数都是方法。
关键的区别在于方法被绑定到特定的数据类型/类,而一般的函数没有*。*
如果这令人困惑,一个例子应该可以澄清事情。
当我们想要大写一个字符串时,我们可以调用 capital 方法。这个方法是显式绑定到字符串的。
另一方面,我们可以创建自己的函数,不依赖于特定的类。
假设我们想写一个将数字 5 加到字符串末尾的函数:
现在我们有一些功能不是由 对象调用 ,而是由 用户自定义输入(input_string)调用 。
理论上,字符串可以拥有这个方法。但是期望 python 在 string 类的定义中考虑这种任意的任务是荒谬的。
在真正的意义上,函数帮助我们创建可重用的代码,这些代码还没有被我们正在使用的语言或库所考虑。
Pandas 用户最常犯的一个错误是在使用数据执行分析任务时没有利用函数。
这导致了混乱和重复的代码。
混乱和重复的代码更容易出错,也更难维护。
无论是在实践中还是在理论上,当您想要重用您正在编写的代码时,使用函数是最佳实践。
将功能限制在一定范围内也是最佳实践,这样每个功能都执行一个独特且独立的任务。
函数通常有输入,称为“参数”。这些是你的函数代码的组成部分。它们通常会以某种方式用于产生输出。
直到用户(通常是您自己)通过传入值来代替这些参数来运行该函数,否则什么都不会发生。
您传入的值在技术上称为“参数”。
这里有很多单词需要记录,所以让我们以一些示例代码结束,这些代码涵盖了上面讨论的大多数概念:
结束语
在这篇文章中,我们介绍了一些最重要的编程概念,以及它们如何应用于 Pandas 库。
如果你想了解更多关于如何开始接触熊猫的知识,请查看我的一些直观指南,并确保在下面订阅。编码快乐!
数据科学中的关键统计概念
丹·法雷尔在 Unsplash 上的照片
一些必须知道的统计概念的汇编
如果你在处理数据,你可能经常会遇到术语,比如“测试”、“分数”、“值”等等。以字母开头,如‘F’,‘P’,‘R’,‘T’,‘Z’等。这篇文章是关于一些在数据科学领域经常遇到的统计术语/概念的通俗解释。
免责声明:这篇文章不是关于什么?
本文不是关于提供全面的解释**,而是对一些关键统计指标的** 简明和高层次的汇编。下面的每个概念都有几篇专门的文章。我将提供几篇这样的文章的链接供你参考。
将涵盖以下主题:
1) H_0 和 H_a —假设检验
2) P 值
3) Z 分数
4) t 检验
5) F 检验
6) R 平方
1) H_0 和 H_a —假设检验
简单地说,假设是你想要测试(或验证)的想法(或前提或主张)。例如,喝着咖啡,你开始思考,“纽约州人的平均身高与加利福尼亚州人的平均身高相比如何?”这是你的想法。
Franki Chamaki 在 Unsplash 上拍摄的照片
现在,为了测试你的想法/主张,你需要一些数据。此外,你需要构建一个问题陈述——一个假设,为了检验这个假设,你需要一个假设检验。更具体地说,你需要设计两个场景——一个支持你的主张,另一个是备选场景。
一个零假设基本上是现状(或者默认的建立或普遍接受的价值,正如这个视频很好地解释的那样)。例如,现状可能是两个州的人的平均身高是相等的。这将形成你的零假设, 记为 H_0 。在法庭上,你有起诉和辩护。同样,对于每一个零假设,你都有一个备选(或替代)假设(为了测试你的想法/主张),记为 H_a (又名研究假设,因为你需要做一些研究/采样来挑战 H_0)。
阐明了你的无效假设和替代假设后,你现在需要一些数据。当然,测量纽约和加州完整人口的身高是不切实际的。因此,你会为一些人(比如 50 或 100 或更高)收集样本数据来测试你的说法。有了样本数据,您将执行一些统计测试,这将在接下来的部分中解释(使用其他等效的示例)。
更多资料:
2) P 值
该术语主要用于在假设检验中测量 结果的统计显著性。这里, P 代表“概率”。所以,它是一个介于 0 和 1 之间的概率值。你用它来拒绝或支持零假设。****
与P-值密切相关的是显著性水平(由希腊字母 alpha 表示),通常为 0.05(或 5%)。基本就是 100%减去的置信水平。较高的α水平意味着较低的置信区间,反之亦然。
如果 P 值小于该显著性水平,则拒绝零假设。如果P-值大于显著性水平,则支持替代假设的支持度不那么强,因此,零假设为未被拒绝,即替代假设为未被接受。
我个人觉得,当“重要性”的意义与“偶然性”定量相关时,P 值更直观。例如,0.01 的P-值(实际上是一个很小的值)表示有仅仅 1%的机会(概率)您对样本进行的实验结果是“偶然”获得的,或者是由于某种采样误差而“随机”发生的。换句话说,你可以庆幸你获得的结果确实 非常显著。简单地说,P-值越小,你的结果就越有意义,随机或偶然发生(获得)的可能性就越小。按照这个逻辑,一个高的 P 值,比如 0.7,意味着你的结果有 70%的概率是偶然得到的,这与你进行实验的方式无关。所以,你现在的发现没那么重要了。
我的显著性水平(alpha)是太严格还是太宽松?
回答:要看手头的问题。想象一下,通过拒绝零假设,你做出了一个错误的决定,也就是说,尽管现在你选择了另一个假设,你拒绝零假设的选择不是一个好的选择。你只是拒绝了它,因为你的 P 值低于 alpha 值。您只是遵循规则(基于您在研究之前设置的 alpha 值)。但是,并不是所有的规则都是好的。
现在,如果你正在对球员踢点球的平均速度进行假设测试,你必须对 95%的置信区间感到满意,也就是说,为拒绝零假设留出 5%的宽窗口(可以认为是 5%的宽松),或者为做出错误决定留出 5%的窗口。那很好。 这只是踢腿的速度。 然而,如果你正在研究一些关键的东西,比如说非侵入性治疗对患者肿瘤的影响,你肯定会想要一个高置信区间,可能是 99.9%,留下 0.1%的显著性水平,即 0.001(把它想象成只有 0.1%宽松;非常非常严格地与肿瘤分析妥协。现在你有一个只有 0.1%的小得多的窗口来做出错误的决定(假设这里的“错误”是指拒绝零假设,接受替代假设)。
关于 P 的更多文章-值:
- 关于数据科学的 p 值,你应该从头开始了解的一切
- 数据科学家解释的 P 值
- 为数据科学家简单解释 P 值
- P 值的圣杯以及它们如何帮助我们进行假设检验
- P 值,以及何时不用它们
- 假设检验和 P 值的直观解释
- 统计显著性解释
3) Z 分数
照片由марьянблан| @ marjanblan在 Unsplash 上拍摄
a***【Z】-score(又名标准分数)告诉你距离**(下方/左侧或上方/右侧)多少个标准差,一个观察值是正态分布的平均值。它既可以取正值,也可以取负值。负的Z*-分数意味着数据点是均值左侧的 Z 标准差,正的Z-分数意味着数据点是正态分布均值右侧的 Z 标准差,该数据点属于正态分布。
在哪里使用 Z -score?
一个重要的应用是计算与给定数据点相关的正态曲线下的(概率)面积。 什么都没听懂?继续读!
迪伦·吉利斯在 Unsplash 上的照片
下面举一个改编自这个精彩视频的例子。假设你的瑜伽班参与者的年龄遵循正态分布(下图中的左曲线),平均值为 50(岁),标准差为 10(岁)。我知道,当你接近退休的时候,你需要瑜伽!
现在,你被问及 35 岁以下参与者的比例(曲线下的红色阴影区域)。要回答这个问题,您必须首先使用下面的公式将标准化正态分布,即均值= 0,标准差= 1 的正态分布。标准化分布中 x 轴上的值以偏离平均值(0)的标准偏差表示,代表Z-分数。35 年的值现在偏离平均值-1.5 个标准偏差,即Z-得分为-1.5。根据定义,Z-分数是无单位的。
正态和标准正态分布示意图(未按比例绘制)。
**于是,求 35 岁以下参与者比例的问题转化为求 Z < -1.5 的比例。**现在你要做的就是,查Z-评分表得到 Z = -1.5 对应的数值。该值为 0.0668。这是所需的比例(红色阴影区域的面积,其中黑色曲线下的总面积为 1) — 6.68%的参与者。
Z 分数的一些进一步应用
同样,**您可以使用 Z -score 来比较两个或更多数据具有不同刻度的情况。**例如,寻找前 10%的学生,他们参加了两种不同的考试(不同的分数系统),如 GMAT 和 SAT。
另一个应用是检测人群/数据集中的异常值。**如何?**标准化人口分布(如果是正态的)并标记位于Z-分数-3 以下和Z-分数+3 以上的数据点,因为这些点将超过平均值的标准偏差的 3 倍,即概率为 0.003(99.7%的区域位于正负 3 个标准偏差内)。
进一步材料:
4) t 检验
这是一个假设检验(又名学生的t-检验)允许您确定两个研究组/样本之间是否存在显著的统计差异,其数据点假定为正态分布。
乔纳森·法伯在 Unsplash 上拍摄的照片
一个例子:
假设你想比较两个不同大陆的人的身高。你取两个独立/不成对的样本,每个大洲的人口各取一个,假设他们是正态分布的。虽然你可以简单地说,你可以比较两个样本的平均值,并说平均值较大的大陆有较高的人。但是样本分布中的方差/分布呢?可以是样本在上有显著差异。
这就是 t 值发挥作用的地方。正如这个视频很好地解释的那样,它基本上是信号(均值差异)和噪声(两个样本内的变化),如下图所示。两个平均值之间的差值越大,则 t 值越高。变化越大, t 值越低。
解释 t 值计算的草图(改编自这段视频)
现在你可以使用这个t*-假设中的值t-测试,你的零假设可能会说两个样本之间没有统计学上的显著差异。如果t-值高于临界t-值(类似于显著性水平α,在p-值的情况下),则零假设被拒绝(即两个样本在统计上不同),而支持替代假设。如果 t 值低于临界 t 值,则不拒绝零假设。*
如何选择临界t*-值?*
可以使用t-表找到临界值。要使用t*-表,您需要一个预定义的p-值和自由度 f ,它就是 n -2,其中 n 是两个样本中数据点的总数(总样本大小)。使用这两个值( p 和 f ,可以查找临界t-值。*
进一步材料:
- 使用 Python 和 Numpy 进行 T-test
- 统计测试——何时使用哪一种?
- 为初学者和专家讲解的统计分析 t 检验
5) F 检验
为什么 F ?这项测试以 R. A. Fischer 的名字命名,他发展了这个概念。 F 测试广泛用于比较适合数据集的统计模型,以确定哪一个更好地解释或捕捉了独立/目标变量的方差。
*测试的一个关键应用是在回归问题的背景下。具体来说,给定一个带有一些参数 p_ 1 的回归模型(称为限制模型),它允许您确定一个更复杂(更多回归者)的带有 p_ 2 参数(*p _2>p _1)的回归模型(称为非限制模型)是否是为您的数据建模的更好选择。
注意: 不要把 P1 和 p2 与前面介绍的 p 值混淆。
最简单的(最简单的/基本的)受限模型可以是一个简单的、仅截距的模型(例如,你的目标数据的平均值),具有 p _1 = 1。在仅截距模型中,所有回归系数都为零。紧接的下一个有竞争力的、不受限制的模型可以是除截距之外仅具有一个独立特征的模型,即 p _2 = 2。同样,您可以将 p _1 和 p _2 推广到任何值。
使用 f 检验
您可以在假设测试的上下文中使用F-测试,方法是制定一个空假设 H _0,声明“非限制模型的 并不比限制模型的 好很多。”相应的替代假设 H_a ,将是无限制模型 明显优于限制模型 。
在下面的公式中,下标 1 和 2 分别对应于受限和非受限模型,RSS_1 和 RSS_2 作为它们各自的残差平方和**。显然,分子表明与无限制模型(模型 2) 相比,限制模型(模型 1)仍然无法解释多少方差。**
F 统计量的定义。术语(p2—P1)和(n_p2)代表自由度,其中 n 是样本中数据点的数量。
有了 F 统计量的计算值,你需要一个预定义的显著性水平 p** (就像上面的 t 测试一样;通常 0.05 表示在 95%的置信区间评估 F 统计值)。现在,在零假设的假设下,F-统计量遵循一个F-分布,该分布具有两个自由度作为其两个特征参数。最后,为了测试你的假设(要求),你查阅F-分配表,其中 df_1 将是你的第一个自由度, df _ 2 是第二个自由度。对于您预定义的p-值,F-分配表中 df _1 和 df _2 的交点将是临界值。如果你计算的F-统计值大于临界值,你拒绝零假设,反之亦然。**
直观地说,F-统计公式中分子的巨大差异意味着非限制模型(模型 2)比限制/简单模型(模型 1)解释了更大的数据方差。因此,F-统计值越高,模型 2 越好,拒绝零假设的机会越大。
F 测试的另一个关键应用是对一组样本进行方差分析(ANOVA ),以确定它们在统计上是否不同。
延伸阅读:
6) R 平方
注意:这是而不是任何称为 r 的变量的平方**。**
它被称为决定系数**,通常表示为 R ,读作R-平方。它表明与目标变量平均值的简单基线猜测相比,您的模型拟合得有多好。更准确地说,它测量的是目标(响应/相关)变量的变化有多大比例是由您的模型确定(捕捉、解释或预测)的。**
下面的定义 R 的就说清楚了。
解释 R 计算的草图(重绘自 Wiki )。
公式中的两个彩色项是什么?
这两项都是方差。所以,第二项基本上是两个方差的比值。
- 蓝色项是残差平方和****
- 洋红色项是总平方和**(根据定义,与数据的方差成比例)**
如果你的模型是一个完美的拟合,你右边图中的黑色直线将穿过每个数据点,公式中的蓝色项将为零,导致 R = 1 。如果您的模型 f 只是目标变量 y 的平均值,即基准模型,您将得到蓝色项等于品红色项,从而得到 R = 0。
例如, R 值为 0.85 意味着您的模型捕捉到了您预测的目标变量中 85%的方差。r 越高预测越好。然而,更好的预测并不总是意味着更好的模型。你也可以过度拟合。所以要小心!
****流言终结者:这篇文章着眼于 R 平方,解释了为什么低 R 平方并不总是坏事,高 R 平方也不总是好事。
注意: A 负 R 平方仅仅意味着你的模型比一个简单的平均基线模型更差。 是时候检查你的模型了!
调整后的 R 平方
如果你不断地给你的模型增加新的特性,R 的值将总是增加。这样,虽然你会得到越来越好的分数,但你最终可能会过度拟合你的数据。为了避免这种情况,有时使用调整的 R 平方的**。它包括一个依赖于特征(变量/回归量)数量 p 和数据点数量 n 的惩罚项。**
计算调整后的 R 平方的公式
关于 R 的更多文章-平方:
结论:
这篇文章的目的是让读者对数据科学中最常用的统计方法有一个基本的了解。本文中讨论的测试/概念并不局限于任何特定的领域,而是在它们的框架中是通用的。
这就把我带到了这篇文章的结尾。要了解我的文章,请关注我这里的。如果你想让我给这篇文章补充些什么,请随意评论相关的消息来源。
采用现有数据科学项目的成功关键
软件开发
代码本来可能不是你的,但现在是你的了。那么接下来呢?
我最近收集了大量笔记本,这些笔记本有助于创建分析。这听起来像是一个令人生畏的项目,但我对代码了解得越多,我就越意识到它并不那么糟糕。笔记本看起来让人不知所措,但是当分解成更小、更易管理的块时,代码相对简单。
采用代码
当我采用这套笔记本时,我做的第一件事就是阅读它。我花了半周时间浏览每一个笔记本,每一行代码都至少读了三遍,并分解了一个笔记本如何过渡到另一个笔记本的流程。我想确保我理解了创建代码所需的输入、代码生成的预期输出以及代码库的整体架构。
由于大多数最初的开发人员都走了,我只能依靠一个人尽可能多地问一些问题。这些问题和答案打破了我的任何误解或困惑,并允许我在头脑中更好地设计代码的未来状态。我开始看到代码的更广阔的图景,以及如何利用它向前发展。
当您采用其他人的项目时,最好记住他们在最初开发代码时可能只有一个用例。了解这个初始用例可以帮助您理解如何将代码转换成更通用的解决方案,从而允许代码重用和扩展。你可能不是软件开发人员,但你可以开始像软件开发人员一样思考。坐下来,考虑一下在代码中可能出现多次的区域。你能从中创建一个函数或类吗?当你设计代码的时候,记录所有的东西。这有时可能看起来很乏味,但是文档可能是让新队友加入并确保他们能够快速学会并使用任何代码的关键。
确定价值
当我开始清理和重新利用我所采用的代码时,很明显这项工作有一些已知的用例,但是代码从笔记本到 Python 库的迁移可能会导致工具不被使用。人们不使用代码是你需要考虑的风险。如果项目需要一周的时间来阅读、清理和迁移到它的新位置,如果项目成为一个死胡同,您的团队能负担得起迁移吗?
在我移植了该工具的代码之后,在几次使用之后,很明显它可能在库中处于休眠状态,没有人使用它。有几次,这个工具被用来推动对其他工作的见解,但很快就失去了它的魅力。几个月后,当我开始从事其他项目时,我正坐在一个 sprint 回顾会上,这时有人带来了他们工作的演示。当他们开始展示他们的分析时,我意识到他们使用了这个工具!在休眠了这么长时间之后,这个工具又变得与一个不期望的用例相关了。努力的程度变得值得了,现在新的用例正在出现;随着人们更多地使用代码,代码也在更新,它提供了价值。
当你采用别人的项目时,理解清理、改进和扩展工作的商业理由是至关重要的。你需要知道团队或客户将如何使用这些代码,以及你所做的工作是否有意义。我们经常会陷入一个很酷的想法,即我们错过了为什么我们在这个项目上工作的商业理由。如果没有客户要求这项工作,没有理由展开或重新运行分析,那么你在做什么?坐下来,确保你看到了一条清晰的代码移植之路。了解如何使用这项工作,并向客户提供价值。当您继续构建数据科学项目并向他人展示您的工作时,培养这方面的技能以了解业务合理性和附加值可能是有益的。
执行迁移
知道您已经通读了代码,并确定了迁移和清理代码的工作量是否值得。假设这个问题的答案是肯定的,你如何开始?
我喜欢的第一个出发点是尽早制定一个策略,告诉我如何将代码移植到它的新家。如果您将代码从一个笔记本移动到另一个笔记本,清理工作可能不同于将代码集成到软件库中。当您迁移您的代码时,考虑您将来如何扩展工作,以及需要为大量工作开放的领域。当您决定创建类或函数时,这可能会有所帮助。
当我在移植代码时,我也喜欢关注测试。您希望确保获得与最初采用代码时相同的输出。如果同时更新代码,则可能得不到相同的结果;因此,功能可能相似,但输出可能不同。我喜欢在多次迁移代码时验证我的代码输出,以确保在添加会改变结果的更改之前它看起来是相同的。它还可以帮助开发单元测试来验证代码是否按预期运行,或者让团队中的其他人测试您的代码。他们的反馈对于理解您在继续迁移时需要进行的任何更改至关重要。
在过去的一年里,我采纳了两个项目,都放在他们自己的一套笔记本里,并把它们移植到他们的图书馆里。当我与其他数据科学家和开发人员一起工作时,很明显可以将这些功能合并到一个软件库中,允许这两个工具共享相似的功能或类。当我移植代码时,这些反馈对于理解我应该如何继续工作很有价值。这些对话和其他对话将帮助您确定您正在进行的工作的后续步骤,这些工作涉及代码的改进或扩展领域。
需要记住的要点
一开始,采用别人的数据科学项目可能看起来很麻烦或有压力,但它可以带来许多好处。当您采用这个项目时,您可以帮助提高您在审查代码和理解功能方面的技能,掌握代码迁移和改进的业务合理性,并在清理您已经获得的工作时继续学习编码实践。
采用代码
- 读,读,读。你想要理解你正在处理的代码。
- 理解最初的用例以及未来的期望。
- 代码重用和可扩展性设计。
- 记录一切。原始评论可能会产生误导;更新并记录所有变更。
确定数值
- 如果采用和清理代码没有价值,为什么还要这样做?
- 理解项目对团队的增值。
- 你的商业理由是什么?
执行迁移
- 尽早开发您的代码迁移策略。
- 确定如何构建代码。
- 测试,测试,测试,甚至更多的测试!您希望确保代码按预期运行。
- 开发您的单元测试来验证代码是否按预期运行。
- 确定接下来的步骤。这项工作已经完成了吗,或者您已经识别出代码中可能需要改进或扩展的地方了吗?
如果你想阅读更多,看看我下面的其他文章吧!
在从事数据科学项目时,请一位主题专家来审查您的工作可能会有所帮助。
towardsdatascience.com](/stop-wasting-your-time-and-consult-a-subject-matter-expert-f6ee9bffd0fe) [## 每位数据科学工程师的前三本书
我放在书架上的伟大资源,我喜欢介绍给软件工程师和数据科学家。
towardsdatascience.com](/top-3-books-for-every-data-science-engineer-e1180ab041f1) [## 在数据科学中我们需要面向对象编程吗?
让我们讨论一下作为一名数据科学家转向面向对象编程的利弊。
towardsdatascience.com](/do-we-need-object-orientated-programming-in-data-science-b4a7c431644f) [## 关于寻找数据科学项目的思考
有时候你需要在工作中把一个项目交给别人,这没什么。
towardsdatascience.com](/thoughts-on-finding-a-data-science-project-d4b74893f50)
用 BERT 提取关键词
入门,NLP
一种提取关键词和关键短语的最小方法
由 Wokandapix 创作
当我们想要从特定文档中理解关键信息时,我们通常转向关键词提取。关键词提取是提取与输入文本最相关的单词和短语的自动化过程。
用耙和雅克等方法!我们已经有了易于使用的软件包,可以用来提取关键字和关键短语。然而,这些模型通常基于文本的统计属性工作,而不是基于语义相似性。
伯特进来了。BERT 是一个双向转换器模型,它允许我们将短语和文档转换为捕捉其含义的向量。
如果我们用 BERT 代替统计模型会怎么样?
尽管有许多优秀的论文和解决方案使用了 BERT 嵌入(例如, 1 、 2 、 3 ),但我找不到一个简单易用的基于 BERT 的解决方案。相反,我决定创建 KeyBERT 一种利用 BERT 嵌入的简单易用的关键字提取技术。
现在,这篇文章的主要话题将不是使用 KeyBERT 而是一个关于如何使用 BERT 创建你自己的关键词提取模型的教程。
1.数据
对于本教程,我们将使用一个关于监督机器学习的文档:
doc = """
Supervised learning is the machine learning task of
learning a function that maps an input to an output based
on example input-output pairs.[1] It infers a function
from labeled training data consisting of a set of
training examples.[2] In supervised learning, each
example is a pair consisting of an input object
(typically a vector) and a desired output value (also
called the supervisory signal). A supervised learning
algorithm analyzes the training data and produces an
inferred function, which can be used for mapping new
examples. An optimal scenario will allow for the algorithm
to correctly determine the class labels for unseen
instances. This requires the learning algorithm to
generalize from the training data to unseen situations
in a 'reasonable' way (see inductive bias).
"""
我相信,使用一个读者相当了解的主题的文档有助于你理解产生的关键短语是否有质量。
2.候选关键词/关键短语
我们首先从文档中创建候选关键字或关键短语的列表。虽然很多都集中在名词短语上,但是我们将通过使用 Scikit-Learns CountVectorizer
来保持它的简单性。这允许我们指定关键字的长度,并使它们成为关键短语。这也是一个快速删除停用词的好方法。
我们可以使用n_gram_range
来改变候选结果的大小。例如,如果我们将它设置为(3, 3)
,那么得到的候选词将是包含 3 个关键字的短语。
然后,变量candidates
只是一个包含候选关键字/关键短语的字符串列表。
注意:你可以用n_gram_range
创造不同长度的关键短语。然后,您可能不想删除停用词,因为它们会将较长的关键短语连接在一起。
3.嵌入
接下来,我们将文档和候选关键字/关键短语都转换成数字数据。我们使用 BERT 来达到这个目的,因为它在相似性和释义任务上都显示出了很好的结果。
生成 BERT 嵌入的方法有很多,比如 Flair , Hugginface Transformers ,现在甚至还有 spaCy 的 3.0 版本!然而,我更喜欢使用sentence-transformers
包,因为它允许我快速创建高质量的嵌入,这对于句子和文档级的嵌入非常有效。
我们用pip install sentence-transformers
安装包。如果你在安装这个包时遇到问题,那么先安装 Pytorch 可能会有帮助。
现在,我们将运行以下代码,将我们的文档和候选项转换为向量:
我们是 Distilbert ,因为它在相似性任务中表现出了出色的性能,这就是我们对关键词/关键短语提取的目标!
因为 transformer 模型有令牌限制,所以在输入大文档时可能会遇到一些错误。在这种情况下,你可以考虑把你的文档分成几个段落,然后把得到的向量放在一起(取平均值)。
注意:有很多预先训练好的基于 BERT 的模型可以用于关键词提取。不过,我会建议你使用distilbert — base-nli-stsb-mean-tokens
或xlm-r-distilroberta-base-paraphase-v1
,因为它们分别在语义相似度和释义识别中表现出色。
4.余弦相似性
在最后一步,我们希望找到与文档最相似的候选项。我们假设与文档最相似的候选项是表示文档的好的关键字/关键短语。
为了计算候选项和文档之间的相似度,我们将使用向量之间的余弦相似度,因为它在高维度中表现得相当好:
就这样了!我们将与输入文档最相似的前 5 个候选项作为结果关键字:
图片由作者提供。
结果看起来棒极了!这些术语看起来肯定像是描述了一个关于监督机器学习的文档。
现在,让我们看看如果将n_gram_range
改为(3,3)
会发生什么:
图片由作者提供。
似乎我们现在得到的是关键词而不是关键词!这些关键短语本身似乎很好地代表了文档。然而,我不高兴的是,所有的关键短语都如此相似。
为了解决这个问题,让我们看看我们的结果的多样化。
5.多样化
返回相似的结果是有原因的…它们最能代表文档!如果我们将关键字/关键短语多样化,那么它们就不太可能很好地代表整个文档。
因此,我们结果的多样化需要在关键词/关键短语的准确性和多样性之间取得微妙的平衡。
我们将使用两种算法来使我们的结果多样化:
- 最大和相似度
- 最大边际关联
最大和相似度
数据对之间的最大总距离定义为数据对之间的距离最大化。在我们的例子中,我们希望最大化候选项与文档的相似性,同时最小化候选项之间的相似性。
为此,我们选择前 20 个关键词/关键短语,并从这 20 个关键词/关键短语中选择彼此最不相似的 5 个:
如果我们将设为低 nr_candidates
,那么我们的结果似乎与我们最初的余弦相似度方法非常相似:
图片由作者提供。
然而,相对较高的**nr_candidates
将创建更多不同的关键短语:**
图片由作者提供。
如前所述,您必须牢记准确性和多样性之间的权衡。如果你增加了nr_candidates
,那么很有可能你会得到非常多样化的关键词,但是这些关键词并不能很好的代表文档。
我建议你保持nr_candidates
少于你文档中独特单词总数的 20%。
最大边际关联
使我们的结果多样化的最后一个方法是最大边际相关性** (MMR)。在文本摘要任务中,MMR 试图最小化冗余并最大化结果的多样性。幸运的是,一个名为embe beed的关键词提取算法已经实现了一个版本的 MMR,允许我们使用它来多样化我们的关键词/关键短语。**
我们首先选择与文档最相似的关键字/关键短语。然后,我们迭代地选择既与文档相似又与已经选择的关键词/关键短语不相似的新候选:
如果我们设置一个相对较低的多样性,那么我们的结果似乎与我们最初的余弦相似性方法非常相似:
图片由作者提供。
然而,相对较高的多样性分数将创建非常多样化的关键短语:
图片由作者提供。
感谢您的阅读!
如果你像我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。
本文中的所有示例和代码都可以在这里找到:
KeyBERT 是一种简单易用的关键字提取技术,它利用 BERT 嵌入来创建关键字和…
github.com](https://github.com/MaartenGr/KeyBERT)**
如何在手臂皮层上实现咳嗽检测-M0
小型微控制器中的关键字定位
超低功耗 MCU 的挑战
深度神经网络(DNNs)具有无与伦比的提取高级信息的能力(比如,“一个病人在过去的一个小时里咳嗽了几次?”)来自原始传感器数据。
但是 dnn 通常在云中实现,因为它们对于嵌入式微控制器来说太耗费资源了。这让嵌入式系统工程师面临一个令人不安的选择:要么(1)将数据从传感器传输到基于云的神经网络,并付出电池寿命短、延迟差和数据隐私威胁的代价,要么(2)放弃深度神经网络的强大推理能力。
目前针对这一问题的“edge AI”解决方案依赖于重型微处理器和 DSP,但这些器件可能会消耗 0.5 W 至 30 W 的功率。对于一个重量轻、不显眼的用于咳嗽计数的可穿戴设备来说,它们是不切实际的,因为它只有 10 毫瓦的备用功率。
在本文中,我们描述了一些将深度神经网络压缩到资源受限平台中的技巧,如超低功耗 ARM Cortex-M0+微控制器。
嵌入式门控循环单元
我们的方法基于嵌入式门控递归单元(eGRU),它利用了一些修改(见图 1 ),我们现在将依次考虑这些修改。
图 1:示出了(a) GRU 和(b) eGRU 的小区架构的框图。与 GRU 相比,eGRU 省略了重置门 r,并且不需要权重 wr。此外,它用 softsign 变体替代 sigmoid 和 tanh 激活功能。
单门机构
eGRU 有一个更新门,但没有复位门。这将模型的占地面积减少了三分之一。现在,如果没有复位门,当出现某些大输入时,eGRU 容易闩锁。这一挑战在反向传播训练期间得到缓解:在每次迭代的正向传递期间,eGRU 状态从均匀随机分布初始化。这迫使 eGRU 在任何新的相关数据出现时丢弃过去的记忆。
软设计激活功能
Cortex-M0+没有专用的浮点单元,这使得软设计成为传统 GRUtanh和 sigmoid 激活功能的理想替代品。校正线性单元(ReLU)是更有效的激活函数,但是将 ReLU 与大量量化的权重相结合会破坏网络的性能。因此, softsign 是一个很好的妥协:它的饱和属性有助于保持网络性能,它的运行速度比 M0+上的 tanh 或 sigmoid 快 10 倍以上。
重量量化
eGRU 使用 3 位指数量化码存储其权重,从而将网络占用空间减少了 10 倍。
Q15 定点运算
为了符合 M0+ 32 位架构,eGRU 使用 Q15 16 位定点格式执行所有运算。由于指数权重量化,权重乘法(最常见的运算)被实现为右移运算。这使得速度提高了 20 倍。
评估 eGRU
已经在不同复杂度的三个声学事件检测(AED)任务上评估了 eGRU:咳嗽检测、口语数字识别和城市声音识别(见图 2)。
与在工作站上实现的传统 GRU 相比,在 ARM Cortex-M0+上实现的 eGRU 在咳嗽检测上表现相当好,在语音数字任务上稍差。eGRU 在城市声音任务上的表现比传统的 GRU 差得多(见图 3)。
目前,eGRU 对于嵌入在低功率微控制器单元上的短声音事件检测或关键词识别任务是有效的。
图 2: (a)在实验中调查的三个音频事件检测(AED)数据集和任务的总结。咳嗽检测是最容易的,因为样本相对较短,并且它是一个 3 类问题。城市音长 10 倍,由 10 个不同的类别组成。(b)说明用于所有任务的神经网络结构。前两层中的重复单位是 RNN、eGRU 或 GRU 细胞。输入是 FFT 向量序列
图 3:显示嵌入 ARM Cortex-M0+处理器的 eGRU 模型性能的结果。(a)在不同的任务中,M0+上的 eGRU 模型与其在计算机上的完全精确的 GRU 模型相比,表现良好。然而,嵌入式 eGRU 模型是高效的,仅占用 GRU 的 10%大小,并且只需要廉价的整数运算。(eGRU 和 GRU 模型在所有任务中的验证精度曲线。eGRU 比 GRU 需要更长的历元来训练。©相应的验证损失曲线。eGRU 模型在短期任务中接近类似的损失
对来源感兴趣?查看我们的原创研究 论文 。
对茶感兴趣?这件物品与伯爵茶很相配。
带有 MLOps 的 Kickstarter
使用 PySpark 和 TensorFlow 对 kickstarter 项目的成功进行分类。
介绍
对我来说,在 99 %的情况下,在 Kickstarter 上支持发明者会导致多年等待一个永远不会出现在我家门口的产品。因此,让我们用一个惊人的 kickstarter 成功分类器来彻底解决这个问题。我们将使用 MLOps 平台来获取我们的数据源(您可以在 Kaggle 上找到它),然后使用 SDK 在本地开发我们的预处理和建模脚本,最后将整个包提交到我们的 AWS 帐户,以对其进行版本控制并为生产做好准备。毕竟,这可能是一个真正的赚钱机器。
使用 PySpark 进行预处理
有些人可能会认为对 50 MB 的数据集使用 Spark 可能有点大材小用。但我喜欢一致性和改进。毕竟,它对 MB 和 TB 一样有效。
让我们从定义我们的主要功能开始:
像往常一样,我使用 MLOps 平台生成脚本模板,从 S3 读取数据源。MLOps SDK 为我们不想考虑的所有事情提供了一个很好的包装——比如读、写和版本控制转换,这样我就可以专注于my_transformations
中发生的事情。
接下来,让我们定义我将使用的 PySpark 类:
这里没有什么特别的,普通的 Spark 预处理类以及导入的 MLOps SDK 。
我们还需要我最喜欢的 PySpark 辅助函数,它将 PySpark 向量转换成列:
一旦我们完成了这些,我们就可以转到 main 函数了,它获取原始输入数据帧,执行所有转换,然后将其返回给 main 函数进行磁盘写入。我们从稍微清理一下数据帧开始,断言所有值都有正确的类型:
我们还通过减去项目的开始和结束时间来计算活动的总“在线”时间,并过滤掉一些小的子类,如非美元的货币(约 10 %的数据)和非成功或失败的州(约 6 %的数据)。
完成后,我们可以继续将所有分类字符串列转换为整数:
完成后,我们可以继续缩放所有列。这是深度学习的重要一步,因为我们不想让我们的权重失控。我将使用StandardScaler
,一旦完成,我还将使用OneHotEncoder
将我的项目状态列(成功/失败)转换成一个 hot 编码表示,因为这是 TensorFlow 需要的格式:
需要注意的一件重要事情是OneHotEncoder
的dropLast=False
论点,你只能通过痛苦的经历来了解这一点。我知道他们有理由默认这个给True
,但是我真的认为有人在喝醉的时候决定的。
最后,我们可以将一个热编码向量分解成列,然后返回 main:
当我开发这个脚本时,我通过做pip install mlops-local
来使用平台内部可用的 MLOps 本地测试环境,这样我可以快速迭代数据的子集,直到我对我的转换满意为止:
然后,我可以在数据集视图中查看计算出的指标的最终结果:
使用 TensorFlow 训练
和往常一样,训练和预处理的设置是一样的。与预处理一样,我在 main 函数中有一点模板生成的代码,用于处理数据的读取、写入和发送回控制台。
除此之外,我有一个my_network
函数,在那里我定义了我的架构。在控制台中,我为脚本提供我的超参数,在这种情况下是batch_size
、learning_rate
和epochs
,然后在mlops.hyperparameters
下连同数据矩阵一起用于训练、验证和测试。我将运行 20 个时期,这可能会超出数据量:
正如所料,我们看到一个快速上升到几乎 96 %的准确性,然后停滞不前,损失变得疯狂。严重过度训练。但话说回来,它在测试集上获得了稳定的 96 %的分数,这只是我玩玩而已。
投入生产
既然我们对我们的模型如此满意,是时候利用它赚钱了,把它公之于众(其实不是,它藏在一个 VPC 里,可以从你的云服务中访问)。我将创建一个活动端点,这意味着一个 24/7 全天候运行的托管 API,根据推理机的 CPU 利用率水平扩展实例。
我还将设置 10 %的数据采样百分比,这意味着对于每 10 个请求,MLOps 平台将保存来自推理的输入和输出,并对数据漂移、模式正确性等进行分析。在这一点上,我可以稍后设置一个警报,通知我的 DevOps 团队,如果大便击中风扇:
所以,对你来说这是一个端到端的魔术。希望很快在 Slack 社区与您见面,在这里我们将从数据工程、数据科学和 DevOps 的角度讨论机器学习和操作,以及它们如何融合在一起!
伯特在计算 2019 年城市幸福指数
随着时间的推移,非洲充满了负面含义。我没有立场来捍卫或支持这样的主张,因为在大多数情况下,我认为这样的观点只是支持者的观点。除此之外,我选择从数据的角度来看待非洲大陆的积极因素,更多的是整体公民的幸福感。在此之前,我深入分析了一下,请花点时间通读一下根据 BBC 报道的 2019 年非洲大陆五大正面故事。老师 塔比奇 必须在那里,可能是我太肯尼亚化了。如果我不提我最喜欢的合唱团在 AGT 的表演,恩德洛武青年合唱团以及跳羚队获得世界橄榄球冠军,非洲众神会不高兴的。
为了解开这个幸福理论,我写下了几个“研究问题”,我相信这些问题会引导我找到最终结果
1。有可能获得关于非洲国家的重要数据来确定他们的幸福吗?
2。对于同样的问题,最好的计算方法是什么?
3。这些结果可以通过任何方式验证吗?有验证集吗?
大多数国家都有关于幸福指数的数据,但通常涉及几个指标的组合,我不愿意走这条路,至少目前是这样。但愿这将在未来形成验证集,但愿如此。我训练过许多分析模型,所以使用正确的数据,这种方法并不难。
按人口统计的最大城市的数据
我最终收到了来自非洲不同城市的随机推文,这些推文是基于这些城市的人口数量和个人喜好。因此,预计数据和个人偏好会有一点偏差,但是结果仍然是确定的。这里列出了人口最多的城市。我最终融入了几个东非城市,尽管它们的人口规模很大。阿比让、亚的斯亚贝巴、布琼布拉、开罗、达累斯萨拉姆、约翰内斯堡、坎帕拉、基加利、金沙萨、拉各斯、罗安达、摩加迪沙和内罗毕在分析中受到关注。
推文收藏
地理定位在收集从这些城市传播的推文中至关重要。Twitter 有一个高级搜索功能,因此这个集合可以使用关键字“附近”。看看杰斐逊的 GetOldTweets repo 来深入搜索和收集过去的推文。你以后会感谢我的。收集来自内罗毕的推文就像下面的 Python 命令一样简单。
通过上面的命令,你将能够收集来自/靠近肯尼亚内罗毕的 2019 年传播的多达1000 万条推文**。**
我感兴趣的是来自城市的一小部分推文,因此最终收集了 16942 条随机和独特的推文。挑战在于推文使用不同的语言,这与我的训练数据和选择的方法的要求相反。
推文预处理和翻译
与传统的英语文本不同,推特是独特的,因为它们被缩短以适应字符限制,并且在大多数情况下表达的语言是非传统的。因此,预处理同样是不同的。我用 Pandas 将 CSV 转换成数据帧,以便于操作。
令人感兴趣的是推文本身的**“text”**栏。因此,我删除了所有其他的专栏,删除了重复的,停用的词以及空的推文。这在推特上经常发生。下面的代码将处理所有这些过程。
不幸的是,这个过程将再次留下几条短推,如下所示。
解决方法是再次删除空值,如下所示,因为在空字段上训练模型是浪费资源。
上述过程的输出如下。
这是有道理的。不幸的是,我们的模型是在英语文本上训练的,因此需要将这些推文翻译成英语,尤其是来自阿比让和金沙萨等法语城市的推文。我使用了 GoogleTranslate API 键将所有推文翻译成英语。这需要一些时间,但将使用下面的代码完成工作:
与城市字段连接后的输出如下。
伯特在训练我们的模特
来自变形金刚的双向编码器表示(BERT) 是 Google 基于变形金刚开发的自然语言处理(NLP)技术。来自谷歌博客、的消息称,这一突破是谷歌对变形金刚研究的结果:模型将单词与句子中的所有其他单词联系起来处理,而不是一个接一个地按顺序处理。因此,BERT 模型可以通过查看单词前后的单词来考虑单词的完整上下文,这对理解搜索查询背后的意图特别有用。”
由于 BERT 模型已经在数百万个句子和特征上被训练过,它们在许多开箱即用的 NLP 任务上表现得相当好。我使用了 Fast-Bert ,这是 PyTorch BERT 模块的一个优秀的简单包装器,用于在 tweets 的数据集上训练模型,以文本作为特征,以情感类别(0 到 4)作为标签。该模型随后在我们翻译的推文中进行了测试。
先决条件
不幸的是,BERT 模型非常庞大,有数百万个特征,因此运行模型的计算能力对我来说是个大问题。我选择了几个云选项,下面是我对我尝试过的几个选项的想法。
- Kaggle —有 GPU 支持的免费平台,但内存分配对我不利。由于内存相关问题,培训过程被终止。
- 谷歌的 Colab——运行良好,但在经过数小时的训练后,它也分别关闭了,尽管与 Kaggle 的平台相比,它更适合这项任务。没有尝试 TPU 功能,因为 Pytorch 还不被支持。
- 谷歌云平台——我最终选择了这个平台,因为我可以使用他们提供的 300 美元免费积分。我使用了相同的一小部分,所以这是任何有兴趣训练这样一个模型的人的最佳平台。首先,不要为 GCP 买单。因为您将使用虚拟机(VM ),所以只要满足于 CPU 和内存高的虚拟机就可以了。不要用付费的 GPU。我试过这个,结果除了支付 68 美元之外,什么也没训练。只需按照这篇文章在 GCP 上设置你的笔记本。你会节省很多时间。
附加工具:
Python 3
Fast-Bert 如果使用 CPU,请忽略此选项。
Ubuntu
我选择了 DistilBERT ,一个更小、更快、更便宜的模型来训练和设置 CPU 版本,因为我无法使用谷歌积分访问 GPU。下面的代码除了对训练集和验证集进行分段之外,还导入了模型训练所需的所有包。
数据束
建模的第一步是创建数据束。这只是一个对象,它接受训练、验证和测试 CSV 文件,并将它们转换为 BERT 及其变体(如 DistilBERT)的内部表示。它还根据设备配置文件、batch_size 和 max_sequence_length 实例化正确的数据加载器。
学习者
学习步骤以数据分组和相关参数作为输入。下面是 Python 中相同内容的表示,其中学习者封装了模型生命周期的关键逻辑,如训练、验证和推理。
然后模型被训练如下。
考虑到训练时间和资源,我只是将纪元的数量设置为 1。如果您有足够的资源,您可以更改这个数字以获得更好的准确性(不保证)。使用 16 个 vCPUs 和 64GB 内存,培训需要大约 19 个小时。建议保存模型,这样就不会进行重新训练。下面的预测器对象将模型和标签作为输入。
对测试集进行情感分析
使用下面的代码可以选择批量情绪预测。
如下所示的输出将是该推文属于情感类别的标签和概率。每条推文情感输出的概率总和应该等于 1。
因此,具有最高概率的标签是选择的预测标签。根据上面的输出,第一个 tweet 情感预测标签是 0,概率为 25%。为了选择列表中概率最高的标签,下面代码中的第一行起作用了。然后,输出被转换成第二行中的数据帧。
原始测试集和每条 tweet 的预测的串联产生了以下结果:-
酸甜苦辣的时刻
到现在为止,你一定已经对快乐在输出中意味着什么有了一个概念。与其余的相比,情绪标签 4 显示了更大程度的满足。另一方面,标签 0 表示不满,因此被解释为悲伤的感觉。因此,获得情绪得分的平均值,按城市分组,是计算一个城市总体幸福感的一个简单但似乎合理的答案。下面的代码表明。
卢旺达基加利 摘得 13 个最幸福城市的桂冠。令人惊讶的是, 摩加迪沙,索马里 位居第二,尽管我们读到过关于索马里这个国家的负面报道。 肯尼亚内罗毕 我的首都是继 乌干达坎帕拉 之后东非第二不快乐的城市。
结论
当使用数据驱动的解决方案来获得某些国家或城市的人们的幸福时,上述结果在某种程度上令人大开眼界。几点作为我的结论:—
- 城市的选择纯粹是基于人口和个人喜好,特别是东非城市的选择。这是我讲述非洲故事的最好/唯一方式。随着时间和更多的资源,我将能够从非洲大多数国家的首都获得更多的推文,并进行更好的比较。
- 20 万条随机推文的训练集(虽然在类中是平衡的)有点偏低。DistilBERT 模型也具有较少的特征( 66M ),这在很小程度上损害了准确性。我计划用一个多语言的完整模型(110 万功能)和整个 160 万 tweets 训练集实现同样的功能。希望会有一些显著的不同。
- 翻译是一项挑战,尤其是对推文中的缩写词和有语境挑战的词。原始上下文可能会丢失,但翻译者在人类评估者查看的几个样本上工作得相当好。
- 验证我们的结果。这是一个棘手的部分。我们的数据基于社交数据,尤其是推特。推文描述了各个城市的日常聊天,因此最适合衡量传播者的总体幸福感。然而,目前使用的方法考虑了其他几个决定幸福感的因素。例如,联合国世界幸福报告就是其中之一,因此如果模型中包含其他因素,将其作为基础事实将是有效的。这是可以讨论的。
杀死汽车保险商
正如我们所知,人工智能正在如何改变汽车保险
戴维·沃特基斯在 Unsplash 上的照片
在黎明降临这座城市之前,约翰起床去上班。这对他来说是重要的一天,因为他要向董事会做报告。由于他非常紧张,而且这一天似乎相当愉快,他决定开车去上班,而不是让自动驾驶汽车载他。约翰已经通过他的移动设备订阅了智能保险计划。这基本上意味着保险费率根据他的情况而变化。事实上,他决定关闭汽车的自动驾驶仪,这导致他的驾驶保险费略微增加了几美分。但这对他来说很好,因为他需要从演示中转移注意力。
每年,全世界有 125 万人死于车祸,另有 200 万人受伤。这些事故中有 94%是由于人为错误造成的,但随着每辆驾驶经验超过 60 年的自动驾驶汽车的扩散,死亡和受伤的数量下降了。安全性的提高最终导致全球保险费的下降。
由 Samuele Errico Piccarini 在 Unsplash 拍摄的照片
约翰一坐到驾驶座上,他的虚拟助手凯蒂就查看了他的日记,并给汽车的导航仪设置了程序。这条路线不仅考虑到了当时的交通状况加上驾驶时间,这将使他能够及时到达目的地,而且还考虑到了安全因素。由于所有汽车都与中央智能交通系统(ITS)实时连接,人工智能(AI)每天都会收集数百万辆汽车的数据。然后计算基本统计数据,如交通和事故热点、事故可能性等。该系统优化了整个道路网络,以减少交通和事故。
然而,John 决定不走这条路线,而是选择了一条风景更好但系统不推荐的路线。这一选择导致他的每日保险费进一步增加,因为风险稍高。这些增加的费用通过他的银行账户用微支付系统自动支付。
尤金·特里古巴在 Unsplash 上的照片
一路上,一个疯狂的司机开着一辆这样的车(没有撞坏传感器)径直撞上了他。这辆车有一个内部诊断系统,可以自动判断受损程度。约翰的虚拟助手凯蒂对事故进行了统计分析,将其归类为轻微事故,因此没有派出救护车。然而,它与约翰互动,以确保他感觉良好。此外,意识到约翰的演示要迟到了,凯蒂叫了一辆替换车尽快把他送到办公室。
与此同时,智能交通系统派出无人驾驶飞机用视频记录事故。凯蒂已经向在线保险公司提出了索赔,并上传了所有记录在案的证据。在这种情况下,事故相当简单,人工智能法官查明了另一名人类司机的过错。由于汽车仍在运行,因此不需要自动驾驶拖车,汽车会自动驾驶到附近的一家钣金厂进行维修。根据人工智能法官做出的决定,所有发生的费用都自动向另一名人类司机收取。当钣金工完成修理后,汽车自己开回了约翰的家。与此同时,凯蒂让约翰了解维修的最新情况。
当然,这是一个未来的场景,但它可能比我们想象的要近得多。
- 无人驾驶汽车已经在美国的一些州出现并广泛使用。
- 从 SIRI 到 Cortana,虚拟助手几乎可以在任何手机中找到。这些助手已经在导航方面提供了帮助,并考虑到了实时交通、约会等因素。
- 许多国家都有智能交通系统,配备了大量摄像机和其他传感器,能够监测道路网络,并在必要时提供援助。
- 无人机越来越普及,越来越普及。他们在监视偏远地区和运送轻型货物方面已经非常成功。
- 人工智能法官已经做出了一些小的决定。例如,爱沙尼亚目前正在试行一种可以裁决小额索赔纠纷的“机器人法官”。
不同的组件是可用的。仍然缺少的是将它们连接在一起的粘合剂。然而,我们开始生活在上面提到的场景中只是时间问题。当我们做到了,我们的生活将永远改变。我们将会有更少的车祸和死亡。我们将能够专注于最重要的事情,而不会被驾驶压力所困扰。对于无聊的部分,总有我们的虚拟助手不知疲倦地工作,让我们的生活变得轻松。
本文原载于【https://www.businesstoday.com.mt】
Alexei DingliProf 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他已经出版了几本同行评审的出版物,并且是马耳他的成员。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。
20 年代金融创新的动力知识
埃里克·达尔林普尔在 Unsplash 上拍摄的照片
社会&商业正在加速变革,这在很大程度上要归功于技术!
人们总是很容易说这个十年将与之前的十年有很大不同。直觉上,我们都知道这一点,然而,有时我们没有认识到变化的指数性质。技术可能是社会和商业变革的最大驱动力,作为一个例子,如果你研究美国家庭对技术的采用,你会发现变化的速度惊人。随着新技术以更快的速度传播,S 曲线变得越来越陡峭!从某种程度上来说,未来十年我们将经历比过去整个世纪更多的技术变革。
伟大的未来学家、《未来的冲击》一书的作者阿尔文·托夫勒早在 1970 年就对此做了很好的总结。如果人类的存在已经大约。50,000 年(800 世),相比之前 798 世的总和,我们在过去两世经历了更多的变化。直到 150 世以前,我们一直住在洞穴里,然而,在未来的 80 年里,世界人口的 85%将是城市人口!
20 年代:金融服务领域的技术十年=变革步伐加快=颠覆?
近 700 年来,金融机构一直相当有弹性,并保持了其作为经济支柱的角色。从本质上讲,金融机构并没有发生太大变化,它们提供的是同样的服务:金融咨询、金融投资、存款/贷款/交易、流动性和信用管理以及风险管理,还有价值主张:专业知识、经验、规模、关系管理和市场理解。
当然,这并不是说没有发生变化。随着经济、监管、全球化、信息技术、企业和消费者的发展,银行也发生了重大转变。然而,当我们仔细观察时,这些变化大部分发生在过去的 100 年里,其中大部分发生在过去的 50 年里。拉古拉姆·拉扬在他的论文中也提到了这一点,他的论文是《透过不完全契约的视角看商业银行的过去和未来。他写道,这种变化(至少在企业银行业)有三个关键因素——技术、信息处理和产权环境。
这也是有意义的。如果将银行视为处理信息以提供金融解决方案的大型数据存储,那么随着多种技术(区块链、人工智能、加密、云等)的入侵,银行似乎已经成熟。
2018 年,埃森哲研究了 10,000 家公司的 62 个参数,以确定各行业的中断状态。尽管金融服务业迄今仍有弹性,但它似乎最容易在未来受到冲击。
来源:埃森哲
金融服务的中断有时被认为是一种激进的观点,尽管人们普遍承认,银行业已经出现了加速变革和更新的破坏性力量。过去十年,金融机构在某些领域已经在解决这一问题上取得了进展。例如,在财富管理领域(如下图),由于市场力量,数字化采用和服务创新变得咄咄逼人。同样,由于 MIFID 导致新的创新模型,我们正在见证买方和卖方的重大长期变化。
来源:ThomasBrand
也就是说,对金融机构进化的总体关注,以及由此带来的绩效和效率方面的结果,充其量只是适度的,并回避了一个问题——从更广泛的意义上讲,在颠覆性力量和技术进步的推动下,金融机构如何为加速变革的时代做好准备?
引领金融行业的加速变革——动态知识可能是关键!
Thomas Ricketts 在他的文章中,在创新前沿发现机遇 描述了知识如何在数字时代的行业创新中发挥关键作用,这些行业更加关注知识资本/无形资产/知识资本(下图)。据估计,现在标准普尔 500 指数 80%的企业价值是无形资产。
资料来源:托马斯·里基茨
对于金融服务来说,知识的作用变得更加突出,因为它具有最高的无形强度(无形资产占总资产的百分比)以及跨行业产品和流程中最高的信息强度。
资料来源:没有资本的资本主义:理解我们新的“知识”经济;迈克尔·波特的 HBR 文章
此外,还有几个影响金融服务的破坏性驱动因素,使得确定优先级和重点变得异常困难。
来源:世界经济论坛
因此,金融服务领域的知识是创新和效率的强大驱动力。在数据、信息和人工智能的数字时代,不仅仅是一个拥有智能人工智能的被动系统。
为了更全面更全面地利用知识的力量,我们需要一个新的框架,叫做运动知识。动能知识(很像动能——质量&速度)着眼于知识的两个维度(1)资本(2)速度:
(1)知识型资本(KBC)一般指无形形式的资本,包括一系列资产。经合组织为知识资本创建了一个框架,使这种资本的衡量更加科学:
资料来源:基于知识的资本、创新和资源分配经合组织
(2)第二个维度,即知识的速度或应用,虽然研究得不太科学,但却是创新前沿过程中缺失的一个关键方面。由于缺乏适用性,知识资本并没有产生预期的产出,适用性主要体现在四个方面:
我在之前的文章中也有详细介绍:工业 4.0:向知识型企业演进
理解和应用 动态知识框架 极大地增加了产品、流程和主张(3P)演变的机会,从而带来结构和客户创新。
资料来源:Amit Shanker
在过去的十年中,以技术、“决策工厂”和“创新实验室”的形式对知识资本进行了更大的投资,以开发尖端创新。然而,随着技术变得更加普及,所产生的知识的传播仍然薄弱,这些投资的效果可能会相对较快地消失。这就要求银行从根本上更加关注他们的运营模式和技术之间的平衡,以在整个 3P 生态系统中部署动态知识。金融机构需要创造新的“知识”角色,专注于知识的学习和传播方法,如应用不同学习理论开发智力资本的认知主义者和连接主义者。
举例说明 KMeans 超参数
图片来源:失眠症患者/索尼
如今,任何高中学历的人都可以实现机器学习算法,这是一件好事。大多数人都能接触到的东西总是一件好事。有很多公共库可以用来简化算法部分。但是权力越大,责任越大。从头开始编写库所节省的时间应该用来微调您的模型,这样您就可以获得不错的结果。
今天我们来看看 Scikit KMeans 模型的调校。KMeans 是一种广泛使用的数据聚类算法:如果您希望根据客户的购买行为将大量客户聚类到相似的组中,您可以使用 KMeans。如果希望根据人口统计和兴趣对所有加拿大人进行聚类,可以使用 KMeans。如果你想根据植物或葡萄酒的特征对它们进行分类,你可以使用 KMeans。所有这些问题都需要无监督聚类,也就是说,我们事先不知道聚类看起来是什么样子。还有其他无监督聚类的方法,如 DBScan、层次聚类等,它们各有优点,但在这篇文章中,我将讨论 KMeans,因为它是一种计算量很小的聚类方法,你可以经常在笔记本电脑上运行,特别是使用迷你批处理 KMeans 。
完整代码的链接在最后。
示例的样本数据
我们生成 3 个具有 2 个特征的聚类(0,1,2)(xx和 yy )。聚类由以下 3 对 x,y 值生成:
mu1 = 3.0
sigma1 = 0.5
mu2 = 20.0
sigma2 = 5.5
mu3a = 1.0
sigma3a = 0.8
mu3b = 5.0
sigma3b = 0.4
numpoints = 1000
np.random.seed(1234)
x1 = np.random.normal(mu1, sigma1, numpoints)
y1 = np.random.normal(mu1, sigma1, numpoints)
x2 = np.random.normal(mu2, sigma2, numpoints)
y2 = np.random.normal(mu2, sigma2, numpoints)
x3 = np.random.normal(mu3a, sigma3a, numpoints)
y3 = np.random.normal(mu3b, sigma3b, numpoints)
我们有三组蓝色、栗色和红色的数据。左图显示了所有数据。右图显示了一个放大的版本,因此我们可以清楚地看到有两个集群。
超参数
超参数来自 Scikit 的 KMeans :
*class* sklearn.cluster.**KMeans**(*n_clusters=8*, *init='k-means++'*, *n_init=10*, *max_iter=300*, *tol=0.0001*, *precompute_distances='auto'*, *verbose=0*, *random_state=None*, *copy_x=True*, *n_jobs=None*, *algorithm='auto'*)
随机状态
这是设置一个随机种子。如果我们想要一次又一次地复制精确的集群,这是很有用的。我们可以把它设置成任何我们想要的数字。下面我设置为 random_state=1234 。
n _ 簇
我们需要为算法提供我们想要的聚类数。标准文献建议我们使用肘方法来确定我们需要多少个集群,并且它对于 Scikits 的干净的理论数据集很有效。实际上,这只是一个初步的猜测。在这个例子中,我们知道我们有 3 个集群。所以让我们用 n_clusters=3 试试:
km = KMeans(n_clusters=3, random_state=1234).fit(dftmp.loc[:, dftmp.columns != ‘group’])
这是怎么回事?我们预测了 3 个簇,但是它们不在我们最初的 3 个簇附近。
我们确实得到了 3 个集群,但是它们与我们最初的集群非常不同。最初,我们在左下角有两个集群,但它们都被归入一个集群,黄色的圆圈。这是因为 KMeans 随机指定初始聚类质心,然后根据点到质心的距离尝试对尽可能多的点进行分组。当然,它重复这个过程直到收敛,但是没有什么能阻止它陷入局部最小值。事实上,众所周知,KMeans 依赖于质心初始化。这是我们的第一个线索,我们不能盲目地使用知识手段。如果我们要求 3 个聚类,那么我们需要有一些概念,我们期望聚类中心在所有特征中的位置。
初始化
这是您可以设置初始簇质心的地方。在我们的例子中,我们有 3 个集群,所以我们需要 3 个质心阵列。因为我们有两个特征,每个数组的长度都是 2。所以在我们的例子中,我们必须有 3 对聚类中心。因为这是一个模拟,所以我们知道准确的聚类中心,所以让我们试试。
centroids = np.asarray([[mu1,mu1],[mu2,mu2], [mu3a,mu3b]])
km = KMeans(n_clusters=3, init=centroids, random_state=1234).fit(dftmp.loc[:, dftmp.columns != 'group'])
最后,我们有了最初的 3 个集群!(通过将我们的聚类中心初始化为原始值)
啊!我们走吧。对于大多数数据点,我们都有原始的 3 个聚类!
但是等等!那是作弊!我们永远不会知道我们星团的精确质心。没错。我们只能推测我们的聚类中心大概是什么。所以你不必知道精确的中心,但是近似值会有帮助。
如果我们只有近似的聚类中心,我们还能做什么来改进我们的聚类?接下来,我们将看看另一种方法,我们可以得到我们的原始集群。
更改群集的数量
我知道!你想,但是,但是,但是,我们最初有 3 个集群,我们将集群的数量设置为 3。我们还能做什么?不如我们把集群的数量设为预期的两倍。什么?我知道,请原谅我。
km = KMeans(n_clusters=numclusters, random_state=1234).fit(dftmp.loc[:, dftmp.columns != 'group'])
啊!左下方有两个分开的集群,如底部一行图所示。我们不需要给出初始的聚类中心。
请看右下方显示的原始群集 0 和 2,它们或多或少被很好地分开了。所以这是一件好事。但是原来的集群 1(右上)现在被分成 4 个集群。但是我们知道这只是我们模拟的一个集群。因此,接下来我们只需将这些集群整合在一起。类似集群(紫色、棕色、深绿色和浅绿色)的东西将成为单个集群。
因此,如果我们不知道我们的聚类中心在哪里,这可能是许多特征的情况,那么我们可以使用这个技巧-高估我们的聚类数量。有人可能会说这是过度拟合——这对于右上的簇来说是正确的,但这是在没有好的质心的情况下,我们可以让左下的簇分离的唯一方法。即使我们有近似的质心,这种方法也能更好地增强聚类分离。
标准化数据
你说:“但是等等!我知道你必须对你的数据进行标准化。事实上这是真的。无论何时进行任何涉及欧几里得空间的操作,您都必须对数据进行归一化,以便所有的特征都在相同的范围内,KMeans 就是这样做的。在这种情况下,我能够逃脱,因为我的原始数据的 x 和 y 范围看起来差不多:0–30(参见上面样本数据部分的第一个图表)。但是让我们将数据标准化,看看是否有所不同。
scl = StandardScaler()
dftmparray = (dftmp.loc[:, dftmp.columns != 'group']).values
dfnorm = scl.fit_transform(dftmparray)
dfnorm = pd.DataFrame(dfnorm)
km = KMeans(n_clusters=3, random_state=1234).fit(dfnorm)
我们不能预测底部坐标较低的独立星团。右上角显示了原始空间中两个聚类的分离,但右下角显示这两个聚类在预测中没有很好地分离。
我们看到,即使我们对数据进行了归一化,我们仍然没有成功地分离原始聚类 0 和 2(在原始数据的左下方)。
其他人
还有其他超参数,如 tol、max_iter,有助于缩短计算时间。这些参数在一个更复杂的问题中变得比这个例子中显示的更重要,所以我不会试图通过例子来展示它们。
但是让我们看看它们的含义:
n_init =默认为 10,因此算法将初始化质心 10 次,并将选择最收敛的值作为最佳拟合。增加该值以扫描整个特征空间。注意,如果我们提供了质心,那么算法将只运行一次;事实上,它会在运行时警告我们这一点。如果我们设置了初始质心,或者如果我们设置的聚类数比我们预期的要多(为了以后合并一些聚类,如上所述),那么我们可以保留默认值。
tol =如果我们将它设置为一个更高的值,那么它意味着在我们宣布收敛之前,我们愿意容忍惯性的更大变化,或损失的变化(有点像我们收敛的速度)。因此,如果惯性的变化小于 tol 指定的值,那么算法将停止迭代,并宣布收敛,即使它已经完成了少于 max_iter 轮次。将其保持在较低的值,以扫描整个特征空间。
max_iter =通常有 n_init 次运行,并且每次运行迭代 max_iter 次,即,在一次运行中,点将被分配给不同的簇,并且针对 max_iter 次计算损失。如果将 max_iter 保持在一个较高的值,那么可以保证您已经探索了整个特征空间,但这通常是以收益递减为代价的。
其他变量决定计算效率,因此如果您有一个非常大的数据集,最好保持默认值。
结论
仅仅运行一个肘方法、确定集群的数量以及仅仅运行标准的 KMeans 通常是不够的。一般来说,我们必须研究数据,并获得主题专家对必须有多少个群集以及它们的近似质心应该是多少的意见。一旦我们有了这些,我们就可以将它们放在一起调整 KMeans:
- 通过提供初始聚类中心
- 通过要求更多的集群,以便我们可以在事后整合一些集群。
- 我们还可以通过增加一些特征的权重来增加它们的贡献,试图用 Mahlanobis 距离来代替欧几里德距离。例如,在上面的例子中,如果我们认为 xx 在分离中比 *yy、*重要 10 倍,那么我们将在归一化步骤后将 xx 乘以 10。虽然这并不总是可取的——还有其他方法来处理这个问题,例如 PCA。
重现上述情节的完整 python 代码可以在这里找到。Jupyter 笔记本的 pdf 版本可以在这里找到。
KNN 算法:何时?为什么?怎么会?
KNN: K 近邻算法是机器学习的基本算法之一。机器学习模型使用一组输入值来预测输出值。KNN 是最简单形式的机器学习算法之一,主要用于分类。它根据相邻数据点的分类方式对数据点进行分类。
图片由 Aditya 提供
KNN 根据先前存储的数据点的相似性度量对新数据点进行分类。例如,如果我们有一个西红柿和香蕉的数据集。KNN 将存储类似的措施,如形状和颜色。当一个新的物体出现时,它会检查颜色(红色或黄色)和形状的相似性。
KNN 的 k 代表我们用来分类新数据点的最近邻的数量。
图片由 Aditya 提供
我该如何选择 K?
在我们有很多点的实际问题中,问题是如何选择 K 的值?
选择正确的 K 值称为参数调整,这是获得更好结果的必要条件。通过选择 K 的值,我们对数据集中可用的数据点的总数求平方根。
a.K = sqrt(数据点总数)。
b.总是选择 K 的奇数值,以避免两个类之间的混淆。
KNN 是什么时候?
a.我们有正确标记的数据。例如,如果我们预测某人是否患有糖尿病,最终标签可以是 1 或 0。它不能是 NaN 或-1。
b.数据无噪声。对于糖尿病数据集,我们不能将葡萄糖水平设为 0 或 10000。这几乎是不可能的。
c.小数据集。
KNN 是如何工作的?
我们通常用欧氏距离来计算最近邻。如果我们有两点(x,y)和(a,b)。欧几里德距离(d)的公式为
d = sqrt((x-a) +(y-b))
图片由 Aditya 提供
我们试图获得最小的欧几里德距离,并基于较小距离的数量来执行我们的计算。
让我们在一个数据库上尝试 KNN,看看它是如何工作的。数据可以从https://github . com/adityakumar 529/Coursera _ Capstone/blob/master/diabetes . CSV中提取。
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.metrics import f1_score
pd 和 np 是熊猫和 NumPy 图书馆的。最后 3 行(混淆矩阵、准确度分数和 f1 分数)用于检查模型的准确度。train_test_split 就是对数据进行拆分和训练。KNeighborsClassifier 代表 K 个最近邻。数据集的标准化是许多机器学习评估器的共同要求:如果单个特征看起来不像标准的正态分布数据,它们可能表现得很差。
data = pd.read_csv("../input/diabetes.csv")
data.head()
我们已经通过 pd.read_csv 读取了 CSV 文件。通过头部()我们可以看到前 5 行。有些因素的值不能为零。例如,对于人类来说,葡萄糖值不能为 0。同样,人类的血压、皮肤厚度、胰岛素和身体质量指数也不能为零。
non_zero = ['Glucose','BloodPressure','SkinThickness','Insulin','BMI']
for coloumn **in** non_zero:
data[coloumn] = data[coloumn].replace(0,np.NaN)
mean = int(data[coloumn].mean(skipna = True))
data[coloumn] = data[coloumn].replace(np.NaN, mean)
print(data[coloumn])0 148.0
1 85.0
2 183.0
3 89.0
4 137.0
...
763 101.0
764 122.0
765 121.0
766 126.0
767 93.0
Name: Glucose, Length: 768, dtype: float64
0 72.0
1 66.0
2 64.0
3 66.0
4 40.0
...
763 76.0
764 70.0
765 72.0
766 60.0
767 70.0
Name: BloodPressure, Length: 768, dtype: float64
0 35.0
1 29.0
2 29.0
3 23.0
4 35.0
...
763 48.0
764 27.0
765 23.0
766 29.0
767 31.0
Name: SkinThickness, Length: 768, dtype: float64
0 155.0
1 155.0
2 155.0
3 94.0
4 168.0
...
763 180.0
764 155.0
765 112.0
766 155.0
767 155.0
Name: Insulin, Length: 768, dtype: float64
0 33.6
1 26.6
2 23.3
3 28.1
4 43.1
...
763 32.9
764 36.8
765 26.2
766 30.1
767 30.4
Name: BMI, Length: 768, dtype: float64
我们创建了非零值,该值包含预测结果值所需的所有列。我们需要确保这些列没有任何与零或 NaN 值相关的值。如果我们有 0,我们将替换为 NaN。然后用列的平均值替换 NaN。让我们绘制糖尿病数据的细节图。
import seaborn as sns
p=sns.pairplot(data, hue = 'Outcome')
我们用值不能为零的列定义了非零值。在每一列中,我们将首先检查是否有 0 个值。然后我们用 NaN 替换它。稍后,我们将创建该列的含义,并用 mean 替换前面的含义。
既然我们已经准备好了数据。是时候训练和测试数据了。
X =data.iloc[:,0:8]
y =data.iloc[:,8]
X_train,X_test,y_train, y_test = train_test_split(X, y, test_size=0.2,random_state=0, stratify=y)
对于数据 X,我们取范围从 0 到 7 的所有行和列。同样,对于 y,我们取第 8 列的所有行。
我们有在程序开始时导入的 train_test_split,我们将测试大小定义为 0.2,这意味着在所有数据中,20%将被保留下来,以便在稍后阶段测试数据。
*#feature Scaling*
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
标准缩放器执行标准化任务。通常,数据集包含不同规模的变量。例如,数据集将包含一个值范围为 20–70 的胰岛素列和一个值范围为 80–200 的葡萄糖列。由于这两个列的规模不同,因此在构建机器学习模型时,它们被标准化为具有共同的规模。
import math
math.sqrt(len(y_test))
外出:
12.409673645990857
我们用这个值得到 K 的值。我们需要 K 的一个奇数值,所以我们将它设为 12–1 或 12+1。
classifier = KNeighborsClassifier(n_neighbors=13,p=2,metric='euclidean')classifier.fit(X_train,y_train)
外出:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='euclidean',
metric_params=None, n_jobs=None, n_neighbors=13, p=2,
weights='uniform')
让我们用分类器预测来预测我们的数据。
y_pred = classifier.predict(X_test)
y_pred
外出:
array([0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1,
1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0,
1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0,
0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0,
0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1,
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0])
我们有一系列数据,但我们需要评估我们的模型来检查准确性。让我们从一个混淆矩阵开始。
cm= confusion_matrix(y_test,y_pred)
cm
外出:
array([[86, 14],
[24, 30]])
我们有一个混淆矩阵,其中 86 和 30 的对角线表示正确的值,14,24 表示我们错过的预测。
我们会检查 f1 的成绩。
print(f1_score(y_test,y_pred))
在外
0.6122448979591836print(accuracy_score(y_test,y_pred))
外出:
0.7532467532467533
我们的 f1 评分为 0.61,准确率为 0.75
让我们绘制实际数据和预测值的图表。
import matplotlib.pyplot as plt
plt.figure(figsize=(5, 7)) ax = sns.distplot(data['Outcome'], hist=False, color="r", label="Actual Value")
sns.distplot(y_pred, hist=False, color="b", label="Predicted Values", ax=ax) plt.title('Actual vs Precited value for outcome')
plt.show()
plt.close()
可在以下位置查看实际代码:
使用 Kaggle 笔记本探索并运行机器学习代码|使用来自[私人数据源]的数据
www.kaggle.com](https://www.kaggle.com/adityakumar529/knn-algorithm)
https://git hub . com/aditykumar 529/Coursera _ Capstone/blob/master/KNN . ipynb。
变压器并没有你想象的那么难理解
破解注意事项—为了解最新的 SOTA 自然语言处理模型打下基础。
Ttransformer 的架构已经成为许多最新 SOTA NLP 模型开发的基石。它主要依靠一种叫做注意力的机制。与之前的其他成功模型不同,它不涉及卷积或递归层。
如果你是这个模型的新手,你可能不会发现这个架构是最容易理解的。如果是这样的话,希望这篇文章能有所帮助。
我们将从常规编码器-解码器网络如何工作以及它可能会遇到哪些困难开始解释,常规编码器-解码器架构中使用的注意 机制是什么,最后,它如何用于变压器。
用于神经机器翻译的编码器-解码器网络
编码器-解码器架构。图片来源。
左边的图像显示了一个编码器-解码器架构,两个组件都由递归层组成。
在左边,编码器接收输入句子,每个单词由它们的嵌入表示,并期望为输入句子输出良好的摘要。这个概要被称为上下文 向量(连接二者的箭头),并作为其初始 状态被馈送给解码器。
右边的解码器负责输出翻译,每步一个单词。在训练期间,它将目标 句子作为输入。在进行预测时,它用来自最后一个 步骤的输出进行自我反馈(如此处所示)。
这种架构优于更简单的序列到序列 RNN,因为来自编码器的上下文 向量整体上提供了对输入语句的更多直接 访问。因此,解码器在输出单个翻译之前可以通过上下文向量查看整个句子,而常规的序列到序列 RNN 只能访问位于当前时间步长之前的单词。
在所有递归层中,信息通过隐藏 状态从一个时间步传递到另一个时间步,随着更多时间步的执行,它们逐渐被遗忘。当编码一个长的序列时,输出上下文向量很可能已经忘记了关于句子的第一个成分的许多信息。这同样适用于解码器,如果序列太长,包含在上下文向量中的信息不会 传递 向下到最后几个时间步。
注意事项
为了解决这个内存 问题并提高模型性能,引入了注意 机制、双向递归层,以及对模型结构的一些修改。
编码器现在由双向 LSTM/GRU 组成,因此输入句子在两个 方向被读取。除了上下文 向量之外,编码器现在还输出由来自每个编码步骤的每个输入字的编码组成的序列。在每个时间步,编码序列在被完全传递给解码器。由于解码器每次输出一个字,所以注意 机制用于选择要处理的编码序列的正确部分,以及编码器自己的输入。****
下图说明,尽管使用了相同的编码器输出,但不同的时间步长对编码器序列的不同部分给予不同程度的关注。
编码器输出的加权和。为了翻译每个单词,这个序列的不同部分被赋予不同的重要性。图片来源。
这种选择是通过用一组注意 权重对编码器 序列执行加权 求和来完成的,所述权重由求和为 1 的浮点组成。对于给定的时间步长,编码序列中只有少数部分值得关注,并且每一步使用不同的权重集。
Say that we have only one input sentence X = [x1, x2, ..., xn] in our batch, it has *N* words and each is represented by its embedding vector of length *M*. The input sentence is then a sequence with a shape of *N* x *M*.The encoder is used to output a good summary of the input sentence by transforming X into its encodings Z = [z1, z2, ..., zn], with zi being the encoding of the word in the i-th position.The dimension of each encoding vector z is determined by the number of neurons from the encoder's the last layer.A set of attention weights ⍺ = [⍺1, ⍺2, ..., ⍺n], at a given time step *t*, is a *N*-dimensional vector. Each element multiples one word encoding from Z, outputting a weighted sum, ∑⍺i x zi.
这些注意力权重是可学习的参数,通过测量编码器序列S****与解码器的最后* 隐藏 状态 h 中每个元素的兼容性来确定。来自编码器序列的向量与该隐藏状态越相似,其对应的注意力权重就越大。*
乘法/点积注意力。
h 和 S 之间的点* 积测量 S 中的每个向量与 h 的相似度,通过应用 softmax 我们将结果转化为分布。整个过程可以看做是模型在使用隐藏 状态 h 作为查询来寻找中最相似的元素**。T* 要检索它们,用获得的注意力权重乘以 S 。**
**But why attentions are determined using the previous hidden state, and why is this similarity important?Say that we are using this model to translate a sentence from one language to another and we’ve just finished translating one word and we’re working on the next output.The hidden state of the decoder from the previous step contains information regarding the last output. Since the model is trained to predict the next word, this hidden state can be seen as something related to what the model wants to predict as the next word. It’s then logical to search for information similar to the hidden state from the encoder sequence to produce the next translation.**
自我关注
到目前为止,解码器使用注意力来映射其隐藏状态,编码器输出用来找到需要注意的相关部分。在一个转换器中,这个机制也被它的编码器用来从一个句子中找到与句子本身相关的信息。换句话说,对于一个句子中的一个给定单词,在产生它的编码时要考虑更多的上下文。这叫自我关注**。**
对单词“it”的编码器自我注意分布从第 5 层到第 6 层的转换器被训练用于英语到法语的翻译。图片来源。
这张图片以一种形象的方式展示了自我关注。每个单词与单词*【it】*的相关性由连接它们的线的强度来表示。
在这种情况下,并不是所有的单词都与单词’’ it’具有相同的相关性,句子中的不同单词对该单词具有不同程度的重要性,包括非常 ‘it’ 。****
这就是自我关注所做的,每个单词的编码包含了它的关系和其他关于一个句子中所有单词的信息。这可以为编码器提供更好地理解单词的潜在句法和语义含义的能力。
用于执行自我关注的等式与上面所示的等式相同,只是现在不是使用隐藏** 状态h,而是使用句子** 本身作为查询,并且 softmax 内的值被缩放以避免 softmax 具有可忽略的 梯度。****
成比例的点积注意力。图片来自原纸。
在引擎盖下,注意力只是模型执行查找的工具,将带有一组键值对的查询映射到输出。仅当相应的关键字与查询匹配时,才检索来自值的组件。
早期情况下, Q 为隐藏** 状态hK和 V 均为编码器输出 S* 。 S 和 h 用于查找注意 权重⍺ ,然后通过执行 ⍺ ⋅ S 从 S 中检索匹配组件。***
由于循环层的顺序性质,我们无法将所有隐藏状态打包在一个矩阵中,并一次性找到所有注意力权重。在每个时间步骤找到注意力权重。****
为了执行自我关注,所有的值 Q 、 K 和 V 都是来自输入** 句子的同一个单词列表,因此对单词和本身进行比较。与之前的情况不同,现在所有单词的所有注意力权重都可以在一个镜头中处理,因为它不受循环层的顺序性质的限制。**
现在,让我们来看看变压器架构,还有更多值得挖掘的地方。
变压器和多头注意
该模型再次由一个编码器-解码器结构组成,每个编码器-解码器又由 N(=6)个编码器/解码器模块相互堆叠组成。
全变压器架构。图片来自原创论文
每个编码器/解码器块将其输出传递给下一个编码块**,并且来自最后一个编码块的输出被传递给 N 个解码块中的每个编码块**。****
每个编解码块中有不同的子层**:与层归一化层跳过连接,一个由两个 密集 层组成的“前馈模块,最后一个是多头关注模块。在每个解码器块的底部增加了一个屏蔽的多头注意力,行为略有不同。这里的主要目标是理解多头注意力是如何运作的,以及注意力是如何在其中执行的。**
如你所见,在这个模型中没有卷积或递归层,整个架构完全依赖于注意机制。
多头警示模块
多头注意力模式示意图
本质上,一个多头注意力模块只是一些规模的点积注意力并行工作。对于每个注意力,输入 Q 、 K 和 V 首先被投影到不同的子空间**,使用不同的权重矩阵 、Wk 和 Wv 。通过这种方式,每个注意力开始处理输入的不同方面。它们的输出然后被线性组合。**
它在编码器中的行为非常简单,它执行自我关注**,其中 Q 、 K 、 V 都是输入语句中的单词的相同 l ist。每个编码器模块将其输出传递给下一个,最后一个输出馈给所有解码器模块。**
多头关注。
对于解码器来说,屏蔽多头注意力将自我注意力应用于目标** 句子(在训练期间),其中未来单词被屏蔽 排除,防止任何单词将其自身与位于其后的单词进行比较。在推断时间,解码器只能访问其最后的输出,因此不需要屏蔽。该模块的输出作为 Q 传递给上方的多头注意力,多头注意力从编码器接收编码,并将其作为 K 和 V 。它的输出与来自掩蔽注意模块的输出**重新组合,并被传递以供进一步处理。****
最后,解码器输出被传递到一个密集层,最后的 softmax 输出当前步骤的翻译。
最后的话
这是一个关于变形金刚的绝妙类比!
本文到此为止。如果你喜欢它的内容,可以看看我的其他作品。如果有任何错误,最好能在评论中看到。
PS:阿尔弗雷多有一门关于深度学习的免费课程。有兴趣就去看看,告诉我有多差!
讨论自然语言处理中三种最常用的输入类型。
towardsdatascience.com](/an-overview-for-text-representations-in-nlp-311253730af1) [## 从零开始的集成学习
引入集成学习,这是一种通过组合训练好的模型来提高性能的强大工具。
towardsdatascience.com](/ensemble-learning-from-scratch-20672123e6ca)**
有效学习机器学习算法的诀窍
机器学习
我希望我在开始自学时就知道这一点。
多兰·埃里克森在 Unsplash 上的照片
B ackdrop:
几天前,我的一个朋友过来嘲笑我,说“你怎么花了这么长时间才学会机器学习?只是几个型号,我一个星期就学会了”。这是他的原话。我只是对他笑笑,询问他学到了什么。他说出了几个机器学习算法的名字。我问他到底学到了什么,然后得到的明显回答是使用 Sklearn 的 fit 和 predict 方法,以及该算法如何工作的简要概述。
我脸上带着邪恶的笑容,问他为了得到最好的参数,他会怎么做?模型如何学习最佳权重?当我们有低延迟要求时,我们该怎么做?虽然这些都不是什么复杂的问题,他坐在那里默默地看着我的脸,我笑到了最后。
这个故事的要点是,机器学习不仅仅是简单的拟合和预测方法。
我们大多数人只是在 youtube 上看了几个视频,然后声称我们知道机器学习,结果很快就意识到我们的错误。对所有自学的人,只要记住有成千上万像你我一样的人在学习机器学习/数据科学。请记住,我们将与拥有数据科学相关领域硕士/博士学位的人竞争。因此,要想与他们竞争,我们需要在基本面上非常强大。
随着围绕机器学习的大量讨论,每天都有新的课程冒出来,目前有比实际工作更多的课程。面对如此巨大的资源,选择正确的道路是一个难题。
说实话,这些课程大多很平庸,没有深入覆盖。嗯,有一些好的课程,但他们都提供不同的课程。很少有人深入研究数学部分,很少有人擅长编码部分等等。所以今天我不会特别提到任何课程。我将分享我在故事中遵循并建议给同一个朋友的方法。我相信它也会对您的数据科学之旅有所帮助。
简介:
在我们进入算法部分之前,让我告诉你我们在机器学习项目中的确切位置。完成机器学习项目涉及许多阶段,每个阶段都同等重要。
机器学习项目的关键阶段
建模是我们的机器学习算法进入的阶段,它只是 ML 生命周期中的重要阶段之一。
好了,让我们进入机器学习算法的主题。
对于每一个算法,我们需要注意一些重要的事情。
学习 ML 算法的流水线
1.算法背后的直觉是什么
最初,我习惯于学习一个算法,过一段时间后就会忘记,每当我回去修改它时,我会发现很难理解我当时已经学过的内容。随着时间的推移,我意识到我们人类无法真正记住太理论化的东西,如果通过可视化来学习,我们更有可能记住很长时间。这就是几何学帮助我们以最简单的方式形象化算法核心的地方。如果我们有一些关于这些算法的很酷的现实生活中的例子,我们会更倾向于理解它。
一旦你从你选择的任何课程中完成了一个算法的学习,打开一个新的标签,开始寻找那个算法的直觉。相信我,网上有很多很酷的解释。首先,Quora 和 Medium 是最好的起点。
2.算法是如何工作的?
一旦你对它有了直觉,试着观察算法实际上是如何工作的。你需要检查的另一件事是算法如何处理各种形式的数据,比如文本/分类/数字。
在这个阶段,用多个因素进行实验,看看算法是如何工作的,你可以参考 Scikit-Learn 中现成的算法。检查算法的参数,并尝试使用它们,看看它们如何影响模型的性能。
3.哪里可以用/哪里不能用
这是大多数人经常忽略的最重要的因素,而他们更关注它是什么和如何工作的。为什么行得通,或者为什么行不通,这对于深入理解算法非常重要。
尝试体验并理解它是如何处理大型数据集和高维数据的。如果它倾向于离群值或不平衡的数据集。
在面试中,最棘手的问题不是什么和怎样,而是为什么。假设明天你在学习算法后做了一个个人项目,你用了一个特定的 X 算法来解决它,面试官很可能会回答为什么是 X 算法为什么不是 Y 算法?让我们假设你想出了准确性作为理由,然后是最困难的问题为什么你认为它比其他的更好。
哦,好家伙!这就是为什么你应该知道它在哪里工作,在哪里不工作。
例如,你需要给出这样的回答,因为我们的数据是高维的,本质上是非线性的,由于种种原因,算法 X 在处理非线性数据时往往比 Y 做得更好。
4.为什么算法的可解释性很重要
这是关键步骤之一,之所以重要,是因为作为一名数据科学家,你可能需要向完全没有技术知识的客户展示模型。在此期间,你可能需要让他们相信你的模型预测的是正确的结果,你需要提供一些他们应该适应它的好理由。你不能简单地把准确性扔给他们。如果你的算法是可解释的,那么你可以向他们展示为什么这个模型能预测一些东西。可解释性只意味着算法的特性重要性。
例如:如果你正在做一个医疗保健项目,你的模型预测一个人的疾病是阳性还是阴性。这是一个非常敏感的问题,他们不能犯错误,这就需要可解释性。如果你的模型向你展示了预测这个人积极/消极的原因(因为 X 特征(身体的某些水平)大于 X 值或其他什么),这将变得更加容易和有意义。
5.为什么要学习算法的时间/空间复杂度?
当我们实时工作时,我们可能必须处理大量数据,如果需要低延迟,时间和空间复杂性可以帮助您选择正确的算法。
如果您的模型占用更多内存,那么实时运行它会非常昂贵,尤其是如果您使用云基础架构来运行模型。有时,一些业务问题伴随着低延迟要求,其中一些算法提供了良好的准确性,但由于其时间/空间复杂性的限制而无法满足要求。
Wikipedia 是一个很好的资源,可以获得每个算法的所有相关信息。
6.为什么我们需要理解算法背后的数学?
又是数学?是的,是的,我明白了。我们甚至可以通过简单地从 Scikit learn 导入来使用算法,即使不理解数学,但是让我告诉你,从长远来看,这是完全不推荐的。好吧,不管我们接受与否,我们肯定需要数学来更好地理解在引擎盖下到底发生了什么。这可能会让一些人失望,但我得到了好消息,我们不能避免数学,但我们可以简化它,避免严格的数学。
简单地说,大多数机器学习算法的工作是最小化实际输出和预测输出之间的差异(损失)。
算法=最小化(损失)+正则化项
例如,我们应该最小化逻辑回归的对数损失和 SVM 等的铰链损失。
注意:并不是每个 ML 算法都是这样,这只对少数算法有效。
为了最大限度地减少这种损失,在内部这些算法使用优化技术,如梯度下降和其他涉及一点数学的味道。因此,如果你不太擅长数学,那么就试着理解每个算法的损失函数及其梯度下降,这样你就可以避免所有其他严格的数学,并保持目标不变。一旦你对此感到满意,你就可以深入研究更多的数学知识。
7.为什么要从头开始实施(可选):
如果假设你正在学习吉他,你会先从基础开始,然后慢慢地尝试复制别人已经创作的音乐,在这个阶段,如果你明白他们是如何创作音乐和曲调的,那么下一步就是创作你自己的音乐,对吗?
同样,我们可以通过复制现有算法来从头实现它们,从而更清楚地理解现有算法。您将学到一些要点,这些要点可以帮助您在将来构建更好的模型。请记住,由于一些问题,我们可能无法在我们的项目中始终使用 Scikit learn 版本的算法。在这种情况下,您必须准备好以满足您需求的方式优化或修改算法。
这说起来容易做起来难,这将花费你大量的时间来达到这一点,这就是为什么我把它标记为可选的。至少尝试实现一个算法来理解它实际上是如何工作的。如果你觉得很难编码,把算法分解成几个部分,先写伪代码,然后试着把它转换成实际代码。
塞巴斯蒂安·拉什卡的《Python 机器学习是一本真正的好书,可以指导你从零开始开发算法。
结论:
不要急于求成,慢慢来,用最好的方式学习,而不是学了一半又回来多次,每次都要参考。记住,目标不是完美,而是一个强大的基础,相信我,我们永远不能完美的事情,目标总是每天都变得更好。如果你能理解算法的要点,并且清楚算法是如何工作的,那么从长远来看,你肯定会感谢你自己。
在这个过程中,如果你不明白某件事或卡住了,把它放在一边,继续其他话题。不要一味的坚持,浪费自己宝贵的时间。稍后带着一个全新的想法回来,再次检查一下,相信我,你会感到惊讶的。万一你仍然不能理解某件事,寻找其他能以更简单的方式解释它的资源。
最后一步,将您的所有知识应用于不同数据类型和大小的多个数据集。要获得真正的知识,实践就是一切。比起单纯的阅读,你会学到很多东西,所以准备好动手吧。
如果你读到这里,你肯定有学习 ML 的热情,这是学习任何技能最重要的因素。不断学习,不要放弃。
如果您有任何建议或疑问,请随时在评论中告诉我,或者您可以通过我的 Linkedin 与我联系。
编码快乐!回头见!!
了解雇主对 2020 年数据科学家的期望
数据科学就业市场趋势
该分析是从 1000 多份最近的数据科学家工作中完成的,这些工作是使用网络搜集从工作门户中提取的。
最近,我开始积极地寻找一份数据科学方面的工作,我没有任何像人工智能/机器学习方面的硕士或博士背景的正规教育。我开始学完全是出于自己的兴趣(不仅仅是因为炒作)。这是一个具有挑战性的选择加入的轨道,尤其是如果你同时从事其他一些技术。我通过参加许多 MOOCs(大规模开放在线课程)开始了我的旅程,并开始阅读多个博客。最初,它没有意义,最终在阅读了其他人的代码并接触了实时数据集之后。慢慢开始有意义了。
当我开始找工作时,一个有趣的新故事开始了。我在印度打开了一个顶级工作门户网站,开始搜索工作,我发现很少有工作与我正在寻找的相关,但当我打开其中一个时,令我惊讶的是,他们提到的要求对我来说是新的。抛开传统的数据分析、机器学习、深度学习不谈,一些 ETL 工具和多种大数据技术被提到是必备技能。我认为这没什么,因为如今每个公司都有自己对数据科学家的定义,并开设了另一个职位。这一次,它提出了对 AWS、Azure 和 Power BI 等其他技术的需求。
请记住,所有这些空缺职位都标有“仅数据科学家”字样。所有这些空缺都有共同的要求,如机器学习算法,统计学,数据分析,数据清洗和深度学习技术。除了这些技能,一些公司还希望候选人具备云知识(AWS、Azure 或 GCP)和数据可视化工具,如 Tableau、Power BI 和 ETL 工具,如 SSIS。通常,这些技术更多地与数据分析师/数据工程师角色有关,但数据科学家角色仍在不断发展,并没有真正坚持特定的技能组合。
我确实理解这样一个事实,即公司寻找一个符合他们职位空缺的申请人,并且拥有他们所寻求的技术技能。这肯定会为公司节省时间和金钱,而不是重新提供培训。
因此,我有了一个有趣的想法,来了解 IT 行业对实时数据科学家角色的确切期望,而不是 MOOCs 中通常教授的内容。
**目标:**我们将努力找出目前业内最热门的技能和趋势。为此,我们将从工作门户获取数据。
注意:这整个分析是为印度市场的数据科学家角色而做的。
在本文中,我们将尝试找到几个重要问题的答案,这些问题是每个数据科学求职者都会想到的。
- 公司寻找的顶尖技能有哪些?
- 业内最期望的经验水平是什么?
- 在这个领域积极提供工作机会的公司有哪些?
- 空缺较多的位置有哪些?
注:你可以在结论部分找到完整代码的链接。
1.网页抓取:
我从印度顶级求职门户网站-Naukri.com收集了所有相关的工作信息,如今几乎每个求职者和招聘人员都在使用这个网站。我使用 selenium-python 进行 web 抓取,因为传统的 BeautifulSoap 方法在这个站点上不太好用。
来自 Naukri.com 的工作列表示例
免责声明:网络搜集纯粹出于教育目的。
我们将为每份工作收集这五个要素:角色、公司名称、经验、地点和关键技能。
刮削代码:
2。预处理:
在开始之前,让我们做一些基本的预处理。
2.1.处理缺失值:
执行了基本的清理,找到丢失的值并删除它们。
2.2.处理重复数据:
我们在处理重复数据时需要非常小心,因为一家公司可能会多次发布相同的要求,因为该职位仍然空缺或另一方面,该公司可能会寻找一个具有相同要求的全新职位。为了简单起见,我没有丢失任何数据。
2.3.标记位置和技能列
将所有字符串转换为小写以避免冗余,并将位置和技能列标记化,因为这些列中有多个值。
这是预处理后的样子。
3.分析:
现在,我们有一切可以开始了。
3.1.哪个位置提供更多的机会?:
注意:如果你不是印度人,可以跳过这个位置部分。
- 如果我们观察上面的图,几乎有 38% 的工作岗位位于孟加拉鲁鲁。
- 排名前四的城市,即孟加拉鲁鲁、孟买、海德拉巴和浦那构成了该国数据科学工作岗位总数的近 72 % 。
- 因此,如果你来自这些城市中的任何一个,你获得数据科学家工作的机会可能会比其他城市多。
3.2.有哪些公司在积极招聘?:
- 分析 Vidhya educon 以几乎占总职位列表 21%的比例高居榜首。
- 名单上还有许多咨询公司。这些咨询公司通常为他们的客户进行招聘。
- 一般来说,求职网站的竞争会非常激烈。由于收到的申请数量巨大,大多数时候招聘人员甚至不会看到你的简介。有些情况下,即使是一个空缺职位,你也必须与数百名其他申请人竞争。最好了解那些正在积极招聘的公司,这样我们可以通过他们的官方网站直接申请,这增加了获得面试机会的概率。
3.3.最渴望的体验是什么?:
不同经验层次的工作机会。
- 我们可以观察到,公司显然在寻找**有经验的候选人。有 5-10 年工作经验的候选人似乎有更多的空缺。**这很有意义因为数据科学家的工作涉及关键的决策技能,这些技能来自经验。
- 至少有两年工作经验的候选人有相当好的机会。
- 这并不意味着新生进不去,只是有经验的候选人比新生有更多的机会。公司通常不会从这些招聘门户网站上招聘应届生,他们会直接从校园招聘中招聘。大一新生总是可以选择为创业公司工作,以获得必要的经验。
3.4.需求中的角色有哪些:
这是调查的重要一步,因为在几个结果之后,工作门户通常会开始显示一些与我们正在搜索的工作无关的其他工作。为了确保我们寻找的是正确的角色,让我们来看看最常提到的 10 个角色。
- 如果我们在上一节中观察到,有更多的职位空缺给有更多经验的人,这给我们留下了一个基于角色的空缺问题。
- 大部分空缺仍然被称为数据科学家。其次是高级数据科学家和首席数据科学家,这当然需要良好的经验。
3.5.公司寻找的技能:
终于,我们到了。你读这篇文章的主要原因。
- 看起来很复杂,别担心,我会在后面的部分分解它。我之所以在这个情节中包含了许多技能,是因为数据科学涉及的领域非常广泛。
- 虽然我们能够在上面的情节中描绘出一些顶级技能,但它仍然不能服务于这个分析的目的。
让我们深入研究一下,以便更清楚地了解这些趋势。
3.5.1.必备技能?:
- **机器学习,**作为数据科学家最重要的技能,这并不奇怪。
- 数据挖掘和数据分析是每个数据科学家必须经历的关键活动。
3.强大的统计建模是成为更好的数据科学家所需要的。
4.公司希望对深度学习有很好的了解,因为它提供了最先进的技术来解决一些有趣的实时问题,如 NLP 和计算机视觉。
5.由于每天记录的数据量大幅增加,雇主希望候选人具备大数据技术的知识。实际上,我们可能正在处理大型数据集,这些技能肯定会派上用场。
3.5.2.编程语言吃香?:
- 如果您开始学习数据科学,在开始时,您肯定会发现很难选择正确的编程语言。虽然有许多语言,但竞争总是在 Python 和 R 本身之间进行。让我们看看数据告诉我们什么。
2.业界仍然支持 Python,因为它有丰富的库,随后是 R 语言。
- SQL 是每个数据科学家的必备。虽然它不适合被当作编程语言,但我还是碰运气把它包含在这里:)。
4.在 python 和 R 之后,对 SAS T21 和 C++语言的需求似乎很大。
3.5.3.深度学习框架可供选择?:
- 由于深度学习的突然兴起,许多深度学习框架从谷歌和脸书这样的巨头进入市场。
2.业界更赞成 Tensorflow 而不是 PyTorch 。
3.Keras 在市场上有很好的份额,人们喜欢它,因为它简单易用。
4.虽然有许多其他框架,如 Caffe,Maxnet,但似乎没有太多的机会。即使不在世界上,至少在印度。
3.5.4.哪种大数据技术具有优势?
- 火花高居榜首。你可以选择 python 版本的 spark -Pyspark。
- Hadoop 与 spark 几乎拥有相同的机会,只是略有不同。
- 蜂巢也有相当多的空缺。
3.5.5。哪家云提供商需要 ML?
- 训练模型涉及大量的计算,很容易变得非常昂贵。公司正在寻找更便宜的方式来完成工作,这就是这些云平台出现的原因。
- AWS 高居榜首,其次是 Azure 。
- 企业正在迅速转向云选项。这些技术有更多的机会在未来的数据科学中发挥重要作用。
3.5.6。数据可视化工具有需求吗?
- 雇主们对数据可视化的表格表现出了更大的兴趣。
- 而微软的 Power BI 依然落后。
结论:
为了得到一份工作,你真的必须具备这篇文章中提到的所有技能吗?
也不尽然,如果你对自己的基础知识很在行,列表中没有什么工具是你在工作中容易掌握的。话虽如此,如果你只是在找工作,在简历上写下这些技能可能会帮助你获得面试机会。
如果你擅长所有提到的数据科学家必备技能,那么最好的方法应该是开始参加面试,同时尝试填补你理解中的空白,并学习你认为会让你比其他候选人更有优势的工具/技术。
如果你觉得这很有帮助或者有任何问题,请在评论中告诉我。
回头见。快乐编码…!
参考文献:
- https://medium . com/@ krishnakumar/donut-chart-with-python-matplotlib-d 411033 c 960 b
- https://stack overflow . com/questions/51389377/unfolding-bag-of-words-in-pandas-column-python
- https://www.naukri.com
知道你不知道的:当对预测不确定时,获得可靠的信心分数
接触样本外的例子,作为获得更有意义的预测分数的一种方式。
Artem Sapegin 在 Unsplash 上拍摄的照片
Softmax 预测分数通常用作多类分类设置中的置信度分数。在本帖中,我们将展示在通过梯度下降进行常规经验风险最小化时,softmax 分数可能是没有意义的。我们还将应用异常值暴露深度异常检测中介绍的方法来缓解这一问题,并为 softmax 分数添加更多含义。
判别分类器(试图从数据中估计 P(y|x)的模型)往往在预测中过于自信,即使输入样本看起来与他们在训练阶段看到的任何东西都不一样。这使得这种模型的输出分数不能被可靠地用作置信度分数,因为该模型经常在它不应该有置信度的地方有置信度。
示例:
在这个合成示例中,我们有一个类别 0 的大聚类和另一个类别 1 的大聚类,外加两组较小的训练集中不存在的离群点。
玩具示例
如果我们对此应用常规分类器,我们会得到如下结果:
置信度得分基线
我们看到分类器在任何地方都过于自信,即使是离群样本也有很高的分数。使用热图显示置信度得分。
这使得直接使用 softmax 分数作为置信度分数不是一个好主意,如果分类器在训练中没有看到任何证据来支持它,那么它可能意味着置信度分数是错误的。
但是,如果我们使用异常值暴露深度异常检测中提出的方法,我们可以获得更合理的 Softmax 分数:
异常暴露
这个得分图更加合理,有助于了解模型在哪些地方有足够的信心,在哪些地方没有。异常区域具有非常低的置信度~0.5(相当于在两类设置中完全没有置信度)。
方法的描述
异常值暴露的深度异常检测中提出的想法是使用与您的训练/测试数据大不相同的外部数据,并强制模型预测该外部数据的均匀分布。
例如,如果您试图构建一个分类器来预测图像中的猫和狗,您可以获得一组熊和鲨鱼图像,并强制模型在这些图像上预测[0.5,0.5]。
数据和模型
我们将使用 102 朵花作为分布内数据集,使用 OpenImage 数据集的子集作为分布外数据集。在引言中引用的论文中,他们表明,对一组非分布样本的训练可以很好地推广到其他非分布样本。
我们使用 MobilenetV2 作为我们的分类架构,并用 Imagenet 初始化权重。
**def** get_model_classification(
input_shape=(**None**, **None**, 3),
weights=**"imagenet"**,
n_classes=102,
):
inputs = Input(input_shape)
base_model = MobileNetV2(
include_top=**False**, input_shape=input_shape, weights=weights
) x = base_model(inputs)
x = Dropout(0.5)(x)
out1 = GlobalMaxPooling2D()(x)
out2 = GlobalAveragePooling2D()(x)
out = Concatenate(axis=-1)([out1, out2])
out = Dropout(0.5)(out)
out = Dense(n_classes, activation=**"softmax"**)(out)
model = Model(inputs, out)
model.compile(
optimizer=Adam(0.0001), loss=categorical_crossentropy, metrics=[**"acc"**]
) **return** model
我们将使用生成器从硬盘上一批一批地加载图像。在基线中,我们仅加载分布内图像,而在异常曝光模型中,我们从具有正确标签的分布内图像中加载一半,从具有统一目标的分布外图像中加载另一半= >:
target = [1 / n_label **for** _ **in** range(n_label)]
结果
两种训练配置对分布样本的准确率都略高于 90%。如果 softmax max 得分低于 0.15,我们选择预测“不知道”,从而放弃进行类别预测。
现在让我们看看每个模型是如何工作的!
常规培训:
您可以通过以下方式运行 web 应用程序:
streamlit run main.py
来自 Unsplash 的第一张鸟图像/来自 102 种花数据集的第二张花图像
我们训练了一个花卉分类,然后尝试对一张鸟的图片进行分类,该模型预测仙客来类具有相当高的置信度" 0.72 ",这不是我们想要的。
异常风险:
您可以通过以下方式运行 web 应用程序:
streamlit run ood_main.py
来自 Unsplash 的第一张鸟图像/来自 102 朵花数据集的第二张花图像
好多了!因为最大 softmax 分数是 0.01,所以鸟图片被分类为“不知道”。在两个模型之间,分布内花图像(右)的预测保持不变。
接下来是对来自维基百科的图像的预测,第一个(左)是 102 朵花数据集中的一朵花,第二个是分布中不存在的一种食肉植物。异常暴露模型表现如预期,分布内图像被正确分类,而模型避免对食肉植物进行分类预测。
修改第一张花图由 aftabnoori—Own work,CC BY-SA 4.0,【https://commons.wikimedia.org/w/index.php?curid=41960730】T2/修改第二张植物图:https://commons . wikimedia . org/wiki/File:Venus _ fly trap _ showing _ trigger _ hairs . jpg
结论
在这篇文章中,我们展示了 softmax 分数作为信心的衡量标准是多么的有缺陷。然后,我们应用了一种基于离群值暴露的方法来解决这个问题,并获得更有意义的置信度得分。这使我们能够在需要时可靠地避免做出预测,这在许多商业/研究应用中是一个至关重要的特性,在这些应用中,不做任何预测比做出明显错误的预测要好。
参考资料:
代码:
[## cvx tz/learning _ to _ absent
知道自己不知道的。通过在 GitHub 上创建一个帐户,为 CVxTz/learning _ to _ absent 开发做贡献。
github.com](https://github.com/CVxTz/learning_to_abstain)
了解你的受众。如何展示你的数据科学项目!
史蒂文·洛艾扎在 Instagram 上的照片
如何定义和调用将您的冗长代码隐藏在别处的函数。
介绍
你是否展示过一个项目,并开始一行一行地滚动代码,只是为了找到你想要展示的情节?
这从你打算展示的有价值的信息中拿走了。
你们中有人有像这样或者更长的 Jupyter 笔记本吗?
如果你这样做了,请记住几件事:
如果你的听众精通技术,他们不会在乎你能使用 pandas 来操作数据或者知道如何使用 matplotlib 上的选项。
而商业利益相关者真正做的是 而不是 的关心。
这条建议特别适用于你必须向上级展示你的发现的工作环境。
更好的方法
你可以从 Github 下载 jupyter 笔记本和 python 脚本来跟进。
开发工具来展示我们的机器学习模型和预测。-StevenLoaiza/演示
github.com](https://github.com/StevenLoaiza/presentation)
下面,我们在笔记本上运行一个 Python 脚本。该脚本包含一些函数,这些函数将用于执行与上述示例完全相同的任务,但是代码行更少。
这段代码是可展示的,并没有把注意力从真正重要的东西上转移开,在这个例子中,就是图表。
我们如何做到这一点?
定义函数
要做的主要事情是定义一些函数。我知道我需要过滤数据,创建一个新列,更改列名并绘制数据图表。
我创建了几个函数来完成这些任务。下面是其中一个函数的例子— create_yr() 。
*我假设您已经知道如何用 python 编写函数 *
我建议你把所有的功能都写在笔记本上,这样你就可以验证它们是否有效。一旦你对它们感到满意,我们就要把它们从视线中移除!
保存\运行脚本
将上面编写的函数复制并粘贴到记事本中。当您转到“另存为”时,将其从 *更改为。txt 文件到一个 *。py 文件。(我一般保存在笔记本的同一个目录下)
现在,您可以将脚本调用到您正在处理的数据科学笔记本中。这将允许您使用保存在 *中的所有功能。py 文件。
**如果不在同一个目录中,您可以将其更改为"Path/function _ call . py " *
哦不!什么是 create_yr()
想象一下,你必须在几个月后重新访问这个项目。
当你阅读它的时候,你会看到许多用户定义的函数,但是你不记得它们是什么。
加载脚本
可以加载脚本了!这将把脚本的全部内容放在笔记本单元格中供您查看。
结论
我希望这些想法能在你的下一个项目中很好地为你服务。编码是一门艺术,在开始时有一些额外的步骤,你可以在将来为调试或重组笔记本节省无数的时间。
感谢您的阅读!
附加说明
熊猫。DataFrame.pipe:这是我在上面使用的操作符之一。这是一个很好的工具,可以用来创建像样的代码。从上面的例子中,您可以遵循对代码执行操作的逻辑顺序。
[## 熊猫。DataFrame.pipe - pandas 1.0.3 文档
应用于系列/数据框架的函数。、和被传递到。或者,数据关键字是字符串的元组…
pandas.pydata.org](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.pipe.html)
了解你的偏见
你在收集数据时应该注意什么
在统计学中,你可能在每一步都会犯错误。你可能会问一个与你的问题无关的问题,错误地定义感兴趣的人群,在你的分析中犯一个错误,等等。
最脆弱的时刻之一是数据收集。因为你在这一步得到的是你最终决定的基础。今天,让我们来讨论几个常见的陷阱,它们会让你的完美数据收集过程大打折扣。
首先让我们介绍一下我们的主要敌人——偏见**。在统计学中,偏差指的是数据的系统性失真**(与方差相反,方差是混乱的)。你可以想象一个弓箭手射击一个目标,并一直击中正下方的中心。同样的,例如,由于设备故障,你的大学生身高数据可能会高估测量值。
虽然高方差意味着射手射遍所有地方,但高偏差会让他们朝同一个方向射失目标。[图片由 Grzegorz jurdzinski 提供]
问题是你并不总是知道你的数据是否以及如何被歪曲。这就是为什么意识到即将打破你的分析的危险是很重要的。
远程办公
由于持续的新冠肺炎疫情,许多公司被迫关闭办公室。只要有可能,工人们就在家工作。一些 IT 公司,如 Twitter 或脸书,甚至决定允许员工无限期在家工作。许多人怀疑这是否是一个好决定。毕竟,那时人们的工作效率不是更低吗?想象一下,你是一家科技公司的董事,正在考虑这样的举动。你可能想知道在这个行业工作的人对此感觉如何,以及他们这样工作是否有任何问题。
在家工作似乎是个不错的选择。但是有那么好吗?[图片由 Dillon 在 Unsplash 上摇动
假设你准备了一张表格,上面有你感兴趣的问题,并把它发给人。我们来讨论一些场景。
覆盖不足偏差
场景一:你向所有员工发送了一封带有问题的电子邮件。
这很方便——你有所有的地址,也许你甚至相信你的员工不会说谎(下面会有更多关于这个问题的内容)。但是首先你想了解 IT 行业的所有人,而不仅仅是你的公司。你的同事很可能不会成为人口样本的代表。也许你有一个很酷的办公室,每个人都想回去?还是你的员工都是积极性很高的人,在家里没有注意力集中的问题?你不知道。
你收集数据的方法从样本中排除了一部分人口。因此它不具有代表性——这种偏差被称为覆盖不足偏差。
选择偏差
场景二:为了接触更多的人,你将表格发布在公司的公共博客上。
现在每个人都包括在内了——每个有互联网接入的人都可以访问您的表单(并且您假设所有 IT 人员都有互联网),因此您不会遗漏任何人。但是每个人回答你的问题的可能性都一样吗?由于文章发布在你公司的博客上,你的员工更有可能阅读它,从而填写你的表格(即使他们不是唯一这样做的人)。
你的取样方法更喜欢某些人,导致了选择偏差。
无反应偏差
场景三:你雇佣了一家专门从事民意调查的公司来寻找 IT 行业员工的代表性样本,并向你提供他们的电子邮件地址。
看起来很完美,对吧?你设法联系了你感兴趣的人群的代表性样本。还有一个问题——不是所有人都会回复。不回答你问题的人不会只是一些随机的人,他们可能有一些不回答的共同原因。
这就是为什么你可能会以无反应偏差而告终。仅仅接触一个代表性的样本是不够的——你的答案是你最终感兴趣的数据。
反应偏差
场景四:厌倦了失败,你雇佣了一名黑客来封锁 IT 行业典型员工的电脑,直到他们填写了你的表格。
这次一定要成功,对吧?没有人会为了避免填写一些简短的表格而扔掉他们的电脑。但是你得到了答案并不意味着他们是诚实的。毕竟,人们现在很愤怒,他们可能会撒谎。他们也知道你会以某种方式利用他们,所以他们可能会欺骗你相信适合他们的东西。也许他们害怕数据不会被适当地匿名化,他们不想承认他们没有生产力?或者也许他们想让你认为 WFH 很棒,他们会说他们喜欢它,只是因为他们想有这个选择?
这可能是最难防范的情况之一——你得到了答案,但你不知道它们是否是真的——我们称之为反应偏差。
不止如此
请注意,有更多种类的偏见可能会潜入您的数据中,您应该始终考虑什么可能是错误的。它们包括但不限于观察者偏差、损耗偏差、回忆偏差等。维基百科描述了其中一些。还有一部关于生存偏见的伟大的 xkcd 漫画。
总是分析你是如何收集数据的,错误就在等待着你去犯。[图片由艾米丽·莫特在 Unsplash 上拍摄]
结束语
你的数据可能看起来非常完美,但它可能会让你得出错误的结论,即使它与现实略有出入。很难保护自己不受偏见的影响,但是意识到什么可能出错会帮助你避免许多错误。
如果你有兴趣看看现实生活中犯的一些错误,我们推荐你看一下最近由 Cassie Kozykov 写的关于纽约市新冠肺炎感染研究的文章。
本文与 托马什·韦索斯基 共同撰写。请看他的新 篇 ,在那里他描述了推断和预测的区别。
用 RFM 了解你的客户
最后更新于 2020 年 6 月
了解如何仅用三个数据点来细分你的客户:新近性、频率和货币价值。
来源:( @annadziubinska )转自 Unsplash
在这篇文章中,我们将向你展示如何通过几个简单的步骤创建一个 RFM 模型。您还将学习如何用几行 Python 代码实现该模型。无论你是有技术背景的人还是非编码人员,我都强烈鼓励大家跟随我,去感受开发一个有价值的 RFM 模型是多么容易。在后续的博客文章中,我们将扩展 RFM 模型,并介绍来自统计学和机器学习领域的更先进的技术。
为什么你应该做 RFM 细分
RFM 细分将使您能够更好地了解您的客户群,并作为您的数据之旅和更高级的客户模型的良好起点。您将能够为您的企业的关键问题提供更准确的答案,例如:
- 谁是你最好的客户?
- 哪些客户处于流失的边缘?
- 谁有潜力转化为更有利可图的客户
- 哪些客户流失/不活跃?
- 留住哪些客户至关重要?
- 谁是你的忠实客户?
- 哪一组客户最有可能对您当前的活动做出回应?
RFM —基础知识
RMF 是一种简单的统计方法,根据顾客的购买行为对他们进行分类。仅通过使用三个客户数据点来识别行为:购买的最近度®、购买的频率(F)和每次购买的平均货币价值(M)。在对 RFM 数据进行一些计算后,我们可以创建可操作且易于理解的客户细分,如下所示:
- **冠军:**最近买的,经常买,花的最多
- **忠诚客户:**定期购买。对促销有反应。
- **潜在忠诚者:**平均频率的近期客户。
- **最近客户:**最近购买,但不经常购买。
- **前景看好:**最近有购物者,但还没花多少钱。
- **需要关注:**高于平均新近度、频率和货币值。可能不是最近才买的。
- **即将入睡:**低于平均新近度和频率。如果不重新激活,将会丢失它们。
- **面临风险:**他们购买后已经有一段时间了。需要把他们带回来!
- **不能丢了它们:**以前经常购买但很久没回过。
- **冬眠:**上一次采购是长退,订单数少。可能会丢失。
上述细分市场和标签经常被用作一个起点,但你可以想出更适合你的客户群和商业模式的你自己的细分市场和标签。
对于每个细分市场,您可以设计适当的操作,例如:
- **冠军:**奖励他们。他们可以成为新产品的传播者和早期采用者。
- **忠诚客户:**追加销售更高价值的产品。与他们交战。求点评。
- **潜在忠臣:**推荐其他产品。参与忠诚度计划。
- **最近/新客户:**提供良好的入职流程。开始建立关系。
- **有前途:**创造更多的品牌知名度。提供免费试用。
- **需要注意:**重新激活它们。提供限时优惠。根据购买历史推荐新产品。
- **即将睡眠:**重新激活它们。分享宝贵的资源。推荐热门产品。提供折扣。
- **有风险:**发送个性化电子邮件或其他信息以重新建立联系。提供优惠并分享宝贵的资源。
- **不能失去他们:**把他们赢回来。和他们谈谈。给他们特别优惠。让他们觉得自己有价值。
- **冬眠:**再造品牌价值。提供相关产品和优惠。
准备我们的数据
在本帖中,我们将使用在线零售数据集——在互联网上广泛用于不同的分析。看起来是这样的:
交易数据的起始表
经过一些调查,我们发现数据需要一些清理,所以我们做了一些过滤以获得更好的输出——记住:垃圾输入,垃圾输出。以下是我们所做的:
- 仅选择英国事务以获得不太复杂的组。不同国家的行为会受到不同活动、折扣、运费等的影响。我们也避免了不同货币可能带来的困难。
- 过滤掉所有没有正确 CustomerID 的交易。
- 筛选出数量或单价为零或更低的交易。
- 创建了一个 sum 列,我们通过将数量乘以单价来计算每个订单行的收入。然后,我们将 InvoiceNo 上的交易分组,并创建 InvoiceSum 列来保存每张发票的收入。
我们现在已经拥有了创建 RFM 模型所需要的一切。我们的事务表现在看起来像这样:
我们清理的交易表按发票号分组
从交易数据中创建 RFM 模型
为了使创建模型的过程更容易理解,我们将在进行过程中展示数据清单。
步骤#1 计算 RFM 值
为了创建 RFM 分数,我们必须获得每个客户的新近度、频率和货币价值的数据点。它们的定义如下:
**最近:**客户最后一次交易的年龄。这与香草 RFM 略有不同,在香草中,新近度是根据自上次购买后的天数来计算的。
**频率:**客户生命周期内的购买次数
**货币价值:**客户交易的平均货币价值。
这一步之后的结果应该是一个 RFM 汇总表,其中包含一个唯一的客户 id 以及最近、频率和平均货币值的数据。它应该是这样的:
我们的开始摘要 RFM 表
分割时,我们将只使用频率、新近度和货币值列。 T 列(客户的年龄)仅在内部用于计算 recency 的值,不会用于将来的计算。
首先,我们将快速检查一下我们的数据,看看它们是如何分布的。
最近分布
频率分布
正如我们所见,频率数字是高度倾斜的,因为大量的非重复交易。事实上,多达 85,3% 的顾客都是非回头客。为了创造更合理的细分市场,我们选择过滤掉非回头客。现在分布看起来像这样:
不考虑回头客的频率分布。
新近分布
回头客的新近分布
在过滤掉非回头客之后,新近数据也具有更好的分布。如果没有过滤器,图会严重偏向零。
货币分配
回头客的货币价值分布
这是具有挑战性的数据。正如我们所看到的,大多数客户的平均货币价值在 0 到 500 之间,但我们也有一些客户超过 2000,甚至超过 16000。这些顾客看起来像是局外人。对此的一个假设是,他们的行为更像是做生意,买了再卖。我们决定移除“异常值”并将阈值设置为 2k,这给出了以下分布:
没有“*异常值”*的货币价值分布
请注意,我们应该进一步调查异常值,而不仅仅是抛弃它们。
步骤 2:获得个人 RFM 分数
获得个人 RFM 分数有几种方法。你可以利用你自己的商业专长和启发,做出适合你的客户群的排名。在这种情况下,我们将走统计路线,使用四分位数对我们的客户进行排名。
通过将每个 RFM 值分成四分位数,创建四个或多或少相等的桶,来对各个 RFM 分数进行排名。然后,我们将每个桶从一到四进行排序;四是最好的。我们的汇总表现在应该看起来像这样:
RFM 个人得分表
得分最低的 A recency ®为 1,表示已经有一段时间没有活动的客户。频率为 4,得分最高,是你最频繁的买家,以此类推。
第 3 步:计算总体 RFM 分数
这一步可以通过两种方式完成:
- 连接——创建片段 这里我们只是像字符串一样连接(而不是添加)单个的 RFM 乐谱,并得到带标签的片段作为回报。我们最好的部分将是 444 分,最差的部分将是 111 分,这意味着在所有三个 RFM 类别中的最低分。
- 加法—创建一个分数 在这里,我们将各个 RFM 分数(如数字)相加,并得到一个指示客户分数的数字作为回报。分数范围从 3 到 12,我们可以用它来创建更加人性化的标签类别。
如果我们选择同时进行串联和加法,我们的汇总表将如下所示:
包含 RFM 片段和分数的表格
步骤#4 用人类友好的名字分组和标记
即使像 411 和 243 这样的片段可以被人类理解,它们也不是对人类最友好的标签。但正如帖子开头所承诺的,为 RFM 片段和 RFM 分数创建更多可用的标签是可能的。对于 RFM 部分,我们将使用最常见的命名方案,如上所述。我们的汇总表现在将如下所示:
带有 RFM 线段的表格
如你所见,我们现在有冠军和冬眠者等等。就位。
如果您更喜欢附加方案,我们可以创建客户标签,如:青铜、白银、黄金和白金。
RFM 表与人类友好的分数标签。
看起来怎么样?
为了鸟瞰您的总体客户群,我们可以绘制一个简单的条形图,显示每个类别中有多少客户:
RFM 段计数
不幸的是,看起来我们的大多数客户都在冬眠,所以我们最好走了。好的一面是:我们有一些冠军、以及一些有前途的和新类别的客户。我们最好好好照顾他们。
我们可以对 RFM 分数做同样的绘图,看看它如何比较。
RFM 分数计数
自然,我们看到了相同的模式:少数最有价值的客户和大量需要关注和重新激活的客户。最好开始工作。我们学到了什么
我们学到了什么
如果 OnlineRetail 数据集中的客户是我们的客户,我们可以说我们已经了解了以下内容:
- 我们 85%以上的客户都不是回头客——我们需要制定一个如何提高保留率的计划。
- 我们的数据包含大量需要清理的垃圾——我们需要了解数据是如何生成的,并改进我们的数据验证。
- 我们的数据包含离群值,离群值应该被调查,并可能被标记或删除。
- 清理数据后,我们的 RFM 模型可用于为每个客户群创建更精确的行动计划。这可以对营销支出、转化率和客户保持率产生积极影响。
结论
如您所见,我们只需使用三个客户数据点就可以获得可操作的客户细分。如果您刚刚开始您的数据之旅,RFM 模型是一个有用的起点,它既快速又易于理解和实施。
Python 代码的完整示例
准备数据
创建 RFM 模式
从你的 WhatsApp 聊天记录中了解自己
使用 python 对聊天数据进行简单的数据探索以发现新事物
由于新冠肺炎疫情,我被建议在家做远程工作。已经一个星期了,整天呆在家里让我厌烦,所以我随意地想,也许是时候做自我反省了。幸运的是,我记得不久前我导出了我的 WhatsApp 聊天。所以我一头扎进去,决定做快速的数据探索,以更多地了解我自己和我的对话者。让数据说话。
数据准备
WhatsApp 导出的聊天格式为.txt
。消息的每一行都由<timestamp> — <sender> : <message>
组成。在消息有多行的一些情况下,第二行和随后的行将仅用<message>
表示,而没有<timestamp> — <sender>
。结构见下例。
将数据转换成数据帧让我可以做更多的事情。这个任务的美妙之处在于它需要模式匹配来区分timestamp
、sender
和message
。正则表达式将使工作变得容易得多。我将 Python 的re
模块与其f-string
字符串格式结合起来,发现这是一个很好的组合,尤其是在更复杂的模式上。下面是我将.txt
文件转换成dataframe
文件的代码。
够不够?不。我们可以检索更多的信息来帮助未来的分析。因此,我在下面的代码中做了更多的特性工程,并返回下面的dataframe
。
探索性数据分析
现在数据已经准备好了,让我们从回答几个问题开始
1.最活跃的对话发生在什么时候
了解聊天行为是必须的。我认为调查谈话发生最多的时间将会很好地描述它。所以,在小时频率中,我取了平均值:
- 字数(
word
), - 字符数(
char
), - 被认为是一个回复 (
seq
)的行的顺序号 - 行数(
seq_line
)。
万一你把seq
和seq_line
搞混了,假设 A 和 B 之间有一段对话
- A-A-B-B-B 将有 2 个序列和 5 个
seq_line
- A-B-A-B 将有 4 个序列和 4 个
seq_line
从上面的图表中,我至少知道:
- 在工作日,我们倾向于在休息时间(12 点)停止聊天,而在周末,则是在下午 3 点。我能理解为什么我们在工作日的中午停止聊天。现在是休息时间。我吃午饭,快速休息,这让我远离我的手机。但是,我从没想过周末下午 3 点会那么低。
- 在工作日,seq 和 seq_line 之间的差距在中午变得更小,这意味着在这个时间每个回复包含的行数非常少。总体差距在周末要高得多,这意味着我们经常在周末回复更多的行。
- 如果我们放大到晚上 7-10 点,即使工作日和周末之间的行数(
seq_line
)相对相同,周末的字数(word
)也要高得多。这意味着每一行在周末包含的单词比工作日多。我想这是“故事时间”。如果我必须讨论什么,我想我会在那个时候做。
我可以说,平均而言,我在下午 6 点开始积极聊天,每天晚上 10-11 点达到高峰,直到早上 6 点才停止聊天。
2.谁反应更快
我想知道,谁回复短信的时间更长。知道谁有反应,谁没有反应是非常重要的。我不想在没有任何证据的情况下,被人笼统地以“你回复晚了”来评判。所以,这又是关键时刻了。
我计算了甲方和乙方所有文本的平均值。我计算了甲方最后一次聊天和乙方第一次回复之间的差异(反之亦然),进行了一些数据辩论,结果如下:
看起来甲方和乙方差不多。他们花了大约 10 分钟回复一条信息。然而,在乙方方面,差异更大,这意味着乙方有更大的机会需要更长的时间来回复。我想我知道乙方是谁了*哎。
3.最快的响应时间是什么时候
与前一个问题类似,但现在我想看看最快的反应发生在什么时候。从平均值来看,在工作日(周一至 Fri),甲方和乙方的响应时间分别为凌晨 1 点和晚上 11 点。周末,甲方凌晨 0 点最快,乙方还在晚上 11 点。
你可以看到甲方和乙方的几个不同的峰值,但我想强调的是,这个事实支持了我之前的说法,即谈话在深夜更激烈。
4.谁写得更长或更快
我已经告诉你谁回答得更快了。但是如果用更长时间回复的一方用了更多的词呢?我对每个聚会的文本中使用的行、词和字符进行了简要总结。请注意,文本或回复可以包含多行。
如果我们仔细观察,就行数而言,乙方回复的行数比甲方多。这可能会导致一个结论,即甲方倾向于用一整行来总结回复,而乙方倾向于用不同的行来发送。
乙方在每次回复中发送的字数和字符数相对低于甲方,这意味着甲方比乙方写得更长。这也得到持续时间变量的支持,其中甲方比乙方写回复的持续时间更长。因此,甲方比乙方写得更长
在前面的问题中,我们知道乙方需要更长的时间来响应。我假设那是因为 B 写的比 A 长,实际上 A 写的更长。而且 B 写的甚至比 a 还快所以 B 没有借口哈哈。
5.词频
检查单词数据的一种最流行的方法是使用单词云可视化其词频。
我删除了几个停用词,以去除无意义的常用词。因为我在聊天中使用印度尼西亚语,所以我使用 Elang 来删除印度尼西亚语的停用词。现在,使用单词云,看看这些单词
有很多“哈哈”和“wkwk”,印度尼西亚人认为是笑的词。使用正则表达式,我删除了笑的单词,这是最后的单词云。
如果你听不懂的话我很抱歉,这是印尼语,而且多是非正式用语(反正谁在聊天中用正式用语)。
6.我们多久笑一次
之前我发现笑的单词占据了我的单词云很多空间。我们笑得那么频繁吗(通过短信)?为了找出答案,我提取了所有笑的单词,并将其数量与行数进行比较,以获得概率。
21.7%概率一句台词有笑点?太搞笑了。我没期望那么多。但事实就是如此。也许我在短信里是个有趣的人。我是吗?
摘要
我们在深夜进行了一次激烈的谈话,可能是在谈论彼此的经历。我们经常笑。甲方写的很多但是写的时间比较长,乙方写的比较短但是回复的时间比较长。
未来的工作
这些数据有许多应用。在未来的工作中,我想对聊天进行情感分析,看看我是否可以使用数据来预测对话的数量,并使用多个对话(多人)进行聚类
如果你认为我在这篇文章中遗漏了什么,请在下面留下评论。我也希望听到任何形式的问题/建议。
我的 git 库上有完整的代码
谢谢你。