TowardsDataScience 博客中文翻译 2021(三百四十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

我如何构建 ELTEA17 数据集

原文:https://towardsdatascience.com/how-i-built-the-eltea17-dataset-a8dc9f27ed57?source=collection_archive---------25-----------------------

用于情感分类和讽刺检测的实体级 Tweets 情感分析数据集

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ELTEA17 ( 图片来源于 jasondavies.com/wordcloud/)

实体级推文情感分析数据集(ELTEA17)是一个对推文进行细粒度情感分析的数据集,我在这里公开了。它是我 2017 年关于原因、持有人、目标共提取的推文结构化情感预测研究的子产品。

ELTEA17 由 2034 条匿名推文组成,用 Ekman 的六个类中的一个类进行注释,以及它们的二进制讽刺注释。在令牌级标注中,该数据集用一个或多个 Ekman 类标记每个情感关键词,并标记总体情感的持有者、原因和目标。如果您发现这对您的研究或用例有用,请前往 GitHub 上的 ELTEA17 资源库

用例

来自 Twitter 等微博服务的大量用户生成数据是一个很好的来源,反映了公众对从政治和世界事件到消费品的现象和情况的看法和反应。由于统计和机器学习方法已经成为构建各种自然语言处理(NLP)应用的首选方法,情感分析正在成为 NLP 研究中的一个热门话题,该研究主要关注用户在社交媒体上的情感反应。

各种各样的信息处理应用处理自然语言文本。这些应用除了处理它们的表面形式之外,还需要提取和处理文本实体。通过访问预定义的文本实体,诸如情感分析、意见挖掘和情感分析等应用程序受益匪浅。例如,基于方面的情感分析旨在提取重要的实体,如意见目标、意见表达、目标类别和意见极性。就像基于方面的情感分析一样,提取文本实体,如情感的持有人、原因和目标,可以提供对情感承载推文的显著覆盖。

情感分类学

情感分析的首要问题是确定情感的分类。研究人员为此提出了一个主要情绪列表。对于 ELTEA17,我采用了埃克曼的情绪分类,它确定了六种主要情绪,即:快乐悲伤愤怒恐惧惊讶、厌恶。为了进行细粒度的情感分类,识别持有者原因目标以及情感关键词可以为分类器提供有意义的特征。这种信息非常有趣,因为它可以提供关于推文情绪极性的实用知识。例如,这三者之间的相互作用和推文的整体情绪极性可以给我们回答的能力;“谁表达了情感?”,“是什么情绪?”“情感的目的是什么?”以及“为什么会产生这样的情绪?”

数据集构建

ELTEA17 数据集具有句子级和标记级注释。在句子级注释中,每个句子都用六个埃克曼类中的一个进行注释。在标记级注释中,注释指示用于其角色含义情感持有者原因、目标的每个词汇,以及情感关键词。

在高层次上,ELTEA17 经历了以下步骤:

  1. 考虑情感关键词、情感标签、表情符号、文本长度等,从 Twitter 自动获取随机帖子。
  2. 排除干扰,如网页链接、地理标签、重复的帖子等。
  3. 定义情感角色和情感关键词标注的标注策略
  4. 当存在多种情绪或代表情绪不明确时,定义一个策略
  5. 使用情感角色和情感关键词手动注释推文(令牌级注释)
  6. 手动将推文标注为六种埃克曼情感类别(句子级标注)

数据收集

数据收集的目标是捕获对目标数据集可靠的数据。也就是说,数据集必须包含带有特定关键字的推文,这些关键字传达情感以及因果关系的语言学线索。因果关系的语言学线索并不一定输出带有情感原因的推文。相反,它们帮助我们收集具有一般因果关系的推文。由于情感原因检测是一般原因检测的特殊情况,这将是过滤掉不需要的数据用于注释的有用过程。

推特数据

出于这项研究的目的,我使用 Twitter 的基本 API 和 tweepy 构建了一个数据收集器作业。该脚本采用一组关键字来过滤掉不想要的推文。以下是每个过滤器的详细说明:

  • 语言:整个摄取过程用英语设定
  • 表情符号:预定义的最常用表情符号列表,如:)、😄 等。,带着各自的情绪。这个列表摘自马克·兰伯特的一部未出版的作品。
  • 情感标签:基于这项研究“93%带有用户提供的情感标签的推文都是与情感相关的”我采用了他们提出的情感标签列表的最小版本,每个标签都对应于它的 Ekman 类。
  • 情感关键词:我用了 NRC 情感词表。这个列表包含了 3462 个字典,每一个都被划分到了 Plutchik 类中。
  • 致使语言线索:为了有更多的数据明确提到了情绪的哪一个原因,我构建了一个致使语言线索列表,比如因为由于等等。
  • 战争相关关键词:经过对数据的样本分析,我注意到大部分收集到的数据都偏向于快乐,因为比如生日快乐的信息。于是我决定用一个传达战争和政治冲突的关键词列表来收集,比如进攻入侵出兵等。

为了更好地分配主题,数据收集过程持续了近一个月,每次在一天的不同时间进行。对于数据收集器的每一次运行,都使用了上述所有关键字,而没有使用任何关键字。在此图中,您可以看到基于过滤器使用的收集数据的分布。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根据文件大小分发收集的数据,过度使用关键字(作者图片)

该脚本将每个 tweet 数据作为 python 字典返回,其中包含诸如“创建于”、“id”、“文本”等关键字。,因为这些数据包含了大量不必要的数据集信息,在下一步中,我从这些内容中剔除了不需要的信息。提取标签、表情符号、提及、链接和表情符号后,每条记录如下所示:

{
 "id":9025500993849∗∗∗∗∗,
 "text":"Josh’s Family Must Be so Proud of him ... ,
 "datetime":"Tue Aug 29 15:14:46 +0000 2017",
 "links":[],
 "emojis":[],
 "mentions":["@∗∗∗∗∗"],
 "emoticons":[],
 "hashtags":[],
 "filter":"CE",
 "num_words":n,
}

过滤

收集的推文总数超过 100 万条。最终,每条记录都存储在 SQLite 数据库中,以便更快地访问,应用查询进行进一步的记录选择和清理。为了处理重复的 tweet,我将 tweet 数据库的文本字段设置为唯一标识符,它会自动拒绝存储重复的 tweet。tweet 表的整体记录差不多有 50 万条。以下快照显示了数据库模式。让我们检查一些应用于进一步过滤的查询:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来自 SQLite 数据库的 Tweets 表(作者的图片)

# selects random tweets where they have hashtag and the filter which has been used for ingestion was emotion hashtags (EHT)
SELECT * FROM tbl_tweets WHERE (hashtag != ’F’ AND filter = ’EHT’ ) ORDER BY RANDOM()# selects random tweets where the filter which has been used for ingestion was causative keywords
SELECT * FROM tbl_tweets WHERE (filter = ’CE’ ) ORDER BY RANDOM()# selects random tweets where they have emoji
SELECT * FROM tbl_tweets WHERE emoji != ’F’ ORDER BY RANDOM()# selects LIMIT number of tweets where the length field is less or equal to 20, and the filter which has been used for ingestion was 'war' keywords
SELECT * FROM tbl_tweets WHERE (filter = ’war’ AND length <= 20) ORDER BY length DESC LIMIT# selects tweets where they have hashtag and the filter which has been used for streaming was NRC emotion lexicon, and no link exists in tweets, and the length of tweets is between 5 and 35 tokens
SELECT * FROM tbl_tweets WHERE (hashtag != ’F’ AND filter = ’NRC’ AND link = ’F’ AND (length BETWEEN 5 AND 35))

限制推文长度的动机是,出于机器学习的目的,较长的推文包含更多的上下文信息。有链接的推文越少越好,因为那些大多是广告,包含的观点内容越少。

综合所有查询的结果,得到 3348 条 tweet 实例,这些实例包含足够多的情感关键词和每条 tweet 的原因提及。

注释

句子级

这个数据集的主要目的之一是用于文本分类器。句子级标注考虑了两组标签。埃克曼情感类以及讽刺二元注释。这个注释不需要特定的平台,只需使用一个文本编辑器就可以完成。每条推文的注释考虑了以下标准:

  • 只有表达某种类型的 Ekman 类的 tweets 才会被注释。
  • 当多种情绪存在时,占主导地位的情绪被选中。
  • 如果情绪太难或太模糊而无法决定,这条推文就会被丢弃。

这个过程成功地注释了 2034 tweet 实例。在这里,您可以看到注释数据在句子级别的分布,分布在六个类别中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Ekman 类上句子级的注释数据分布(作者图片)

令牌级

在这一节中,首先我描述了情感表达中的语言现象。然后我解释注释方案的细节。该数据集的另一个目的是从推文中识别持有者原因目标和情感关键词,以便可以轻松地将其输入序列标记算法,如 HMM、CRF 或 LSTM。

情感关键词

在书面文本中,可能会有用来表达情感的关键词。在情感角色的背景下,在标注中找到合适的情感类关键词是识别其角色的前提。注释侧重于显性情绪,在这种情绪中,他们通常通过关键词来表达,如“听到他的死讯后,我很震惊”。由于不同的可能原因,如意义模糊,关键词的存在不一定传达情感信息。例如,“祝愿”在“他希望有好天气”中是一个幸福的词。它也可以是不同上下文中的歌曲名称。因此,注释应该通过考虑 tweets 的上下文来完成。

情感关键词注释的粒度级别是词汇单元。它可以是单个单词或短语。对于每个条目,关键字都用它们各自的 Ekman 类进行了注释。因为在一个条目中可以呈现一种以上的情感;注释者可以选择多个合适的类(最多 3 个类)。比如“愤慨”显然属于愤怒范畴。另一方面,“恐怖主义”根据上下文,可以被贴上悲伤愤怒恐惧的标签。词汇单位可以分为以下几类:

  • 六种情绪之一:注释者指出他们认为更合适的情绪(如果有的话)。
  • 同时多个类:注释者用多个类的组合来表示情感,他们认为这样更接近词汇单元的情感(注意不允许 3 个以上 Ekman 类的组合)。
  • 六个情感类都不是:注释者从三个建议类期望信任、其他中选择一个。

情感原因

根据大多数理论,一种情绪通常是由外部事件引发的。因果关系是一种被定义为“原因和结果之间的关系”的语义关系,为了识别情绪状态的原因,注释者应该能够回答这样的问题:“为什么持有人会感觉到那种情绪?”

在文本中,情感原因被认为是一个引起相应情感出现的命题。一般认为一个命题有一个动词,它可以选择把出现在它前面的名词作为主语,把出现在它后面的名词作为宾语。然而,一个原因有时被表示为一个名词。由于情感原因检测是一般原因检测的特例,标注者可以采用一些典型的语言模式,如:因为因此结果因此由于等。,以及其他一些潜在表明情感原因的语言线索,如使役动词像 gethavemakelet 。情感原因的注释需要两个基本约束:

  • 显式约束限定了与情绪表达直接相关的单个突出的情绪原因(使用致使语言线索可以很容易地检测到)。
  • 隐性约束限定了所有直接和间接的情感原因(原因可以从含义中推断出来)。

在标注情感原因时,如果某个特定原因存在,标注者应该考虑与该原因对应的每个情感关键词。一个情感关键词有时可以与多个原因相关联,在这种情况下,所有原因都被标记。注意,情感关键词的存在并不一定保证情感原因的存在。没有明确表示原因的推文,主要是因为以下原因:

  • 推文太短,因此没有足够的上下文信息,例如:“我很生气,很臃肿”。
  • 这条推文足够长,但原因可能超出了上下文。
  • 原因不明,可能是由于高度抽象。

情感持有者

一条推文的来源是作者。情绪状态的来源是表达情绪的人。当一条推文带有情绪时,推文的作者可能是持有人,因为作者可能在帖子中表达了他/她的情绪,但作者也可能写了其他人的情绪,导致一句话有多个来源。

情感持有人识别是语义角色标注研究的一个子领域,使用通用语言模式进行识别是合理的。我将情感持有者定义为一个带有标签 holder 的短语,用于语料库的构建,无论是隐性的还是显性的情感表达。不是把情感持有者限定为一个人,而是可以是任何表达情感的实体。情感持有者通常是名词短语,有时是介词短语。例如,在下面的句子中,粗体显示的跨度表示情感持有者。

杰夫感到非常高兴。
珍妮感到幸福关于杰夫的幸福。

在第二个示例中,还应该标识“Jeff”。因此,在一个句子中有两个情感持有者。

情感目标

情感目标是情感所涉及的实体。更具体地说,它们是情感所针对的实体及其属性。在 tweets 中,情感目标是相当多样的,因为有大量不同的主题:命名实体和作为情感对象的名词短语。在主观文本中,情感目标往往伴随着情感关键词。例如,在“我讨厌下雨的天气”中,下雨的天气是情感的目标。有人可能会说,下雨的天气可以解释为情绪状态的一个原因。有时,情感表达在像 tweets 这样的非正式文本中可以有重叠的情感原因和情感目标。这就是为什么该数据集甚至将原因提取与目标识别相结合,以提高性能[3]。情绪目标很重要,因为如果不知道它们,推文中表达的情绪就没有多大用处。

情感关键词和目标之间存在语言关系,这是因为情感关键词是用来修饰目标的。在主观表达中,情感持有者、情感关键词和情感目标与主体相关,修饰直接客体。

一旦持有人有了特定的情绪状态,这种情绪状态可以用引发它的特定原因和对情绪目标进行分类的主题来描述。也可以有这样的情况,其中响应发生或者原因为什么引起持有者的特定响应,但是在注释中没有考虑它。换句话说,标注过程中不考虑情感关键词、情感原因、情感目标之外的任何信息。下面是带注释的数据在标记级的最终分布:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Ekman 类上标记级的注释数据分布(作者图片)

训练数据集格式

对于序列标记问题,“行业标准”编码是生物编码。它将标签中的文本细分为实体外部(O-X)、实体开头(B-X)或实体延续(I-X)。在 ELTEA17 中,BIO 表示法将文本分成重叠的单词组,即所谓的文本块。因此,对于每组标记,需要不同的生物表示。具体来说,每六个情感类别加三个情感角色一个生物编码,这导致九层生物编码。下表显示了不同层中 BIO 编码的注释表示。注意,杀死的令牌已经被标注了恐惧悲伤*。*

不同层次的例句生物注释

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ELTEA17 注释的图形表示(作者图片

数据统计

让我们来看看 ELTEA17 的一些初步统计数据。下表显示了语料库的总体概要。为了进行评估,我使用了 5 倍交叉验证,通过应用随机搜索算法设置了的值。

语料库摘要

接下来,让我们看看不同实体的一些统计数据,下表显示了情绪导致持有人目标被提及的推文比例。对于原因的提及,最高的数字属于惊讶一类,有趣的是表达他们惊讶感觉的作者,关于一个情境或现象,他们更愿意带来他们情感的原因。对于提及目标而言,最低的数字属于恐惧类别,这意味着在恐惧已被表达的背景下,持有者不太愿意提及恐惧所针对的实体。最后,提到持有者,最小的数字属于愤怒类别。

包含情感原因、目标和持有人的推文比例

下面的表格显示了每一类推文的最大、最小和平均长度。

注释工具

有许多工具可以提供带有实体和关系的手动注释环境。文本工程通用架构(General Architecture for Text Engineering or GATE)是一套完善的开源工具套件,用于 NLP 任务,最初由谢菲尔德大学开发。它为语义标注和本体数据建模提供了一个协作的标注环境。Brat rapid 是一个协作文本注释的在线环境。它是专门为结构化注释而设计的。WebAnno 是一个基于网络的注释工具,用于各种各样的语言注释,包括不同层次的词法、句法和语义注释。在此工具中,可以定义自定义注记图层。此外,它支持多个用户进行协作注释项目。

我最终选择了 WebAnno 作为注释工具,唯一的原因是它使得在不同的层中构建注释变得容易。下图是 WebAnno 的工作环境。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

WebAnno 工具的工作环境(图片作者)

这个工具可以以多种文件格式导出注释,在所有 TSV 3 中最容易转换成 BIO 编码。导出的文件包括标题和正文部分。标题部分包含有关文件中使用的不同类型的注记图层和要素的信息。下面你可以看到 WebAnno TSV 3 文件的标题标记以及一个示例注释。

#FORMAT=WebAnno TSV 3.1
#T SP=webanno.custom.Emotion|Emotion|Role#Text=I need a tutor because chemistry exam is killing me
305–1 33289–33290 I _ _
305–2 33291–33295 need _ _
305–3 33296–33297 a _ _
305–4 33298–33303 tutor _ _
305–5 33304–33311 because _ _
305–6 33212–33321 chemistry *[3364]|cause[3364]
305–7 33322–33326 exam *[3364]|*[3365] cause[3364]|target[3365] 
305–8 33327–33329 is _ _
305–9 33330–33337 killing sadness[3366]|fear[3367] *[3366]|*[3367] 
305–10 33338–33340 me * holder

对于跨度类型,图层用“#”标记,后跟“T SP=”,要素用“”分隔。句子出现在文本标记“#Text=”之后。标记注释以句子标记号开始,后面是开始-结束偏移量和标记本身,用制表符分隔。这里对于第一个记号“I”, 305 表示句子编号, 1 表示记号编号, 33289 是记号的开始偏移, 33290 是记号的结束偏移。对于一个跨度的每个特征,注释值将与记号/子记号注释出现在同一行中,由制表符分隔。如果没有给定跨度层的注释,则在列中放置“”字符。如果要素没有注记或跨度图层根本没有要素,则“”字符表示注记。对于令牌“我”,星号意味着该令牌不与任何情绪类型相关联,因为第一层专用于情绪类型,并且该令牌的角色与持有者相关联。令牌上的多跨度注记将有一个用括号括起来的编号参考,如[N],其中 N 表示图层上的第个*注记。

后续步骤

进一步参考

[1]罗伯特·普卢奇克:《情绪:理论、研究和经验》。情绪理论,第一卷。美国纽约州纽约市学术出版社。, 1980.

[2]任,石,一个通用的基于本体的多语言多功能多媒体智能系统 (2000)会议论文集。2000 年 ieee 系统、人和控制论国际会议。

[3]陈、应、李一梅、、和朱(T0)(2010)《第 23 届计算语言学国际会议论文集》第 179-187 页

[4]李维员,华旭基于文本的情感分类与情感原因抽取 (2014)专家系统与应用 41(4):1742–1749

[5]https://weban no . github . io/weban no/releases/3 . 2 . 2/docs/user-guide . html

我是如何在谷歌破解 DS-Tech 面试的

原文:https://towardsdatascience.com/how-i-cracked-ds-tech-interview-at-google-2aca19d21ea5?source=collection_archive---------6-----------------------

给我的数据和技术专业学生的课程

通过 ML 工程师 SQL/编码面试的简易指南

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在 Google Tech Sprint 与大学生分享我的面试经历(来源于作者)

我如何开始准备谷歌技术面试?

我需要做些什么来使自己区别于其他候选人?

在过去的几年里,我收到了一些关于谷歌数据/技术/编码面试的问题。这些问题可能来自广泛的受众,从研究生到寻找更好机会的专业人士。

技术面试很难。由于合格申请人的数量,科技公司的招聘应该非常严格。所以我真诚地希望我可以分享我的经验,以减少你的痛点。

**免责声明:**对于这篇文章,我将关注编码/技术面试(技术筛选/现场面试)。

请记住,我不是专家。FAANG 和其他公司的很多编码面试我都没通过。但是我试着向前失败,和你分享这个经验,这样你就不需要像我一样失败那么多次。

由于谷歌的博客政策,我不会分享任何细节,但我希望这篇文章能帮助你做好准备。

这里有一个博客,概括了我在谷歌的面试经历。

就这样,让我们开始吧

什么是技术面试?

技术面试测试你通过代码解决问题的能力。

这需要大约 45 分钟的面试时间,面试官会问你 1-2 个编码/SQL 问题,意在:

  • **简单易懂:**问题将简单到适合半个小时的时间框架。
  • **含糊不清:**面试官可能只会给你问题背景的一个子集,让你进一步探究。你需要提出问题,以便很好地理解问题,制定解决方案。
  • 挑战:这个问题可能有多个解,你需要优化。这是为了让大型科技公司测试你解决问题的能力,以过滤掉误报,避免接受糟糕的候选人。

技术面试是如何进行的?

根据我的经验,这是关于如何进行技术面试的重要信息:

  • **一般准则:**在大多数情况下,你需要给出实际的代码。在写出你的解决方案之前,你应该先澄清你的面试官。练习开发不同数据结构问题的实际代码(例如:树、图、字符串、列表、哈希映射等)。
  • 工具:大多是 google docs 来描述问题,写测试,设计伪代码。在我之前的采访中,我们使用白板来回答 SQL 和编码问题。在疫情期间,我听说 coderpad.io 在 Google 之外也很常用。
  • **解决方案的复杂性(时间和空间)😗*了解多个解决方案之间的差异。我记得我在面试中的第一个解决方案是使用一种运行时间很长的暴力方法,比如:O(n)然后我主要在哈希映射的帮助下将代码优化为 O(n)。

你的行动计划

在任何技术面试之前,你都应该遵循这些建议

  1. 沟通:将面试视为双向沟通
  2. **准备:**非常了解你的工具
  3. **微笑:**祈祷,保持冷静,执行

沟通

将面试视为双向交流将大大增加你被录用的机会。

在我看来,沟通是通过每一次技术面试最重要的因素。

让我给你举个例子。

  • 候选人 A :创造了最佳解决方案,但未能传达折衷方案
  • 候选人 B :创造了次优解决方案,但与面试官交流了算法的潜在问题和解决方案

你更喜欢哪个候选人?从招聘人员的角度来看,这可能是候选人 b。这是因为沟通是在团队环境中做好工作的重要信号。表达你的想法和考虑比创造完美的解决方案更重要。

此外,这还能让招聘人员理解你采用解决方案的逻辑,并在你陷入困境时给你提示和鼓励。我听说过一个朋友,他没能给出最佳解决方案,但还是被录用了,因为他清晰地表达了自己的思维过程,并通过面试官的暗示和提示推动了讨论。

科技面试有多难?

想象一下,在令人紧张的 45 分钟面试中,你在交流想法的同时,被评估创造最佳解决方案。冷汗

这无疑很难。但是你可以通过练习你的沟通技巧来减少痛苦。

一个简单的方法是申请众多的公司,然后按升序排列,把你最重要的放在最后。这意味着,你在用一些面试作为练习,为你梦想中的公司做准备。在最好的情况下,你有这些成功的申请作为薪资谈判的筹码。

如果你没有时间去参加无数的面试。那么我建议在 Leetcode 上报名模拟面试,或者请你的朋友帮忙。

为了让你对如何不断沟通有一个清晰的看法,我强烈推荐你观看谷歌关于编码面试的视频。

准备

非常了解你的工具

准备时间表

当我准备 Google 的编码面试的时候,我在 Visa 工作的时候在兼职读硕士,所以关于编码和数据结构的知识还是新鲜的。但即便如此,我还是在一周内花了额外的 3-4 个小时来集中注意力。我利用假期复习了 LeetCode 上的数据结构/算法和练习题。

我发现的一个标准指导方针是至少在 1 个月内准备好面试。大多数大型科技公司都意识到了这些压力,并会给你时间准备。

您需要明智地做好准备,在短时间内更新您的数据结构知识并练习解决问题。

总的来说这是我的练习习惯:

  1. 【数量】每天解决至少 5 个 Leetcode 问题:这将使你每月解决+150 个问题
  2. 【数量】每周至少进行 2 次模拟面试:这样可以让你在一个月内进行 8 次模拟面试,帮助你在面试时不那么紧张。
  3. **【素质】20 分钟内解决每道题:**你会感到解决问题的时间紧迫压力。确保你意识到时间限制并解决它。
  4. **【质量】在 Leetcode 上寻找最优解:**有些问题可能有多个复杂程度不同的解。例如有 4 种不同的算法求解回文题。目的是了解哪一个是最佳的,为什么。
  5. **【素质】练习你的弱点:**多学习一些你不熟悉的数据结构(比如:树/图),延伸你的目标,为意想不到的问题做准备。

分配时间学习基础和高级算法

大多数技术面试持续 30-45 分钟,这意味着你解释红黑树或 AVL 树等高级概念的可能性非常低。

这意味着你应该分配更多的时间来温习基本概念,直到你清楚地理解它们。你可以集中练习容易到中等难度的问题,然后可能是一些难的问题。

这里有一些你可以使用的准备资源:

  • Coursera 算法特殊化 : 这是一个非常好的总结,可以帮助您刷新常用算法和数据结构概念的技能。我建议你在开始练习之前先审核一下这些课程。
  • 破解编码面试 :这是一个在谈论编码面试时真正流行的参考。有一个很好的理由,这本书是每次你想更新你的知识和技能时的一本好书。它很简洁,但仍然足够清晰地描述典型的编码面试问题和理论。
  • Github SWE 面试准备 :这是一个很好的知识库,可以让你重温从基础到高级的算法。作者在解释棘手的问题和列举编码访谈中的重要概念( 博客 )方面做得非常出色。

微笑

祈祷,冷静,表演

我意识到我在谷歌面试中成功的可取之处是我总是微笑。

微笑创造奇迹。微笑让埃鲁德·基普乔格成为排名第一的马拉松运动员。微笑有助于镇定神经,建立一种控制感,让你看到全局。微笑能让你与面试官展开对话,建立必要的联系,为你的解决方案辩护。

当你微笑时,你允许面试官帮助你。这使得面试更具合作性,也让你与那些固执于解决基于错误前提的问题的候选人区别开来。

如果微笑能让你更接近赢得你梦想的工作,那么为什么不利用它呢?

你应该知道的重要技术概念

复杂性

这一点超级重要。请熟悉复杂性。

不同的解决方案在时间和空间上会有不同的权衡和复杂性结构。最重要的术语是大 O 符号;通过计算步骤数来测量运行时间的符号,步骤数转化为算法运行的时间和空间。

例如,你可以用几种方法处理回文:

  1. 强力循环每个字符两次,然后比较-时间 O(n),空间 O(1)
  2. 字符串前后的两个迭代器—时间 O(n),空间 O(1)
  3. 递归调用堆栈—时间 O(n),空间 O(n)

这些术语可能对你有用:

  • 增长率由1<log(n)<n<n*log(n)<n^2<n^3<2^n<n!表示
  • 常数 1: 表示固定的算法运行时间,不考虑观测值。
  • 对数对数(n) :表示重复减半或加倍运行时间(例如:二分搜索法)
  • Linear n :遍历数组或链表中的每一项。
  • 准线性 n*log(n):在线性时间内运行(如:快速排序、合并排序)
  • 二次 n:迭代并匹配每一对元素(例如:插入/选择排序)
  • 立方 n :迭代并匹配所有三个一组的项目
  • 指数 2^n :枚举项目的所有子集
  • 阶乘 n!:生成项目的排列或排序

数据结构

数据结构是编程的一切。在谷歌,我们内部开玩笑说,软件和数据的主要工作只是移动和操纵数据。

在谷歌,每天有 20pb 的数据被移动,你需要非常清楚地理解数据结构,即使你只有使用熊猫数据框架的经验。

您对这些基本数据结构的理解能力将有助于您做出推出可扩展和可靠产品的每个决策。

**重要概念:**数组、链表、集合、栈、队列、树、图、堆、散列表、字典

  • 一般理解:在内存块中存储值的结构。
  • **数组:**固定大小的记录来存储值。这是节省空间的
  • **链表:**从下一个元素链接到上一个元素。
  • 堆栈:后进先出(LIFO)与压入和弹出操作。当订单不重要时,这是一个非常有效的操作。
  • 队列:先进先出(FIFO ),最大限度地减少最大等待时间。这可以通过动态数组或链表来实现。
  • **集合:**包含唯一元素的列表
  • 二叉树:T 每个节点都有一个关键字的树。左边的子树有较小的键集,而右边的子树较大,以便进行有效的查询。
  • **图:**一组点(顶点)和线(边),存储数值和数值之间的关系。图通常存储在邻接矩阵(n*n)或邻接表(稀疏)中
  • **字典:**支持按键快速内容查询。这种方法的一个实现叫做 HashMaps
  • 平衡 BST: 保持高度较小的自平衡二叉查找树。

算法

算法对于创建逻辑流来操作存储在数据结构中的数据非常重要。算法和数据结构需要同时学习。没有对数据结构的正确理解,就很难理解为什么我们要在特定的条件下使用特定的算法。

重要概念:分而治之、动态编程/记忆、递归、树遍历(广度优先搜索— BFS /深度优先搜索— DFS)

  • **动态编程:**用较小的实例计算解决方案,以构造解决方案(例如:递归)
  • **贪婪编程:**计算每一步的局部最优解。这意味着我们可能关注局部最优而不是全局最优(例如:人工神经网络中的梯度下降)
  • **分而治之:**把问题分成更小的子问题。然后在解决每个子问题时,我们可以反映整个问题的解决方案(例如:合并排序)
  • **排序:**强力总是产生 O(n ) —插入排序、冒泡排序,而最优排序应该产生准线性 O(n log n) —快速排序、合并排序(更多信息)
  • **广度优先搜索:**从初始深度开始遍历树,到递增的更高深度。这在寻找最小生成树(MST)问题的解决方案时很有用。
  • **深度优先搜索:**首先覆盖所有深度,从初始的左到右子树开始遍历树。
  • Dijkstra: 求图中最短路径的算法。A*是建立在 Dijkstra 算法之上的启发式算法。

样题

由于我不能透露我的谷歌面试问题,我很乐意分享我认为与我的面试问题相当的 leetcode 问题。这将有助于您理解复杂程度,并相应地进行练习。

  1. 3Sum :给定一个带有条件的列表,寻找三元组集合
  2. 单调数组:如果给定数组是单调的(递增或递减),则生成结果。
  3. 最长的回文子串:从一个字符串中,返回回文子串(向前或向后读都一样)
  4. 生成括号:给定括号对,生成所有格式良好的括号组合。

个人小贴士来自 阿尔伯特·宾盖 :在某些情况下,有应聘者在 GlassDoor 上分享了自己的面试经历。您可以使用这些评论来找出技术面试流程和困难的基准。

在此,我祝贺你完成本指南。祝你编码面试准备顺利。

结论

为了增加你进行最佳技术面试的机会,你应该:

  1. 沟通:将面试视为双向沟通
  2. 准备:非常了解你的工具
  3. 微笑:祈祷,保持冷静,执行

在谷歌或其他大型科技公司招聘很复杂,因为他们想避免误报。这是因为雇佣不良职业道德的候选人会破坏团队士气和绩效。因此,由于不完善的技术面试,他们很有可能会让有能力的候选人失望。如果你是他们中的一员,那么请继续努力,他们中的一个会来到你身边。

因此,请利用你所拥有的机会好好准备。尽你所能,让上帝来处理剩下的事情。

非常感谢 Albert Bingei 审阅并为本文做出贡献。

索利·德奥·格洛丽亚

我职业经历中其他有用的博客

</5-biggest-tips-to-juggle-work-and-study-as-data-scientists-7cad143f10a>

关于作者

文森特用 ML @ Google 对抗网络滥用。文森特使用高级数据分析、机器学习和软件工程来保护 Chrome 和 Gmail 用户。

除了在谷歌的工作,Vincent 还是佐治亚理工学院计算机科学硕士校友、三项全能运动员和数据科学媒体的特约作家,该媒体在全球拥有 100 多万观众。

最后,请通过 LinkedIn Medium Youtube 频道 联系文森特

我是如何用 Java 爬取一个国家的邮政编码列表的

原文:https://towardsdatascience.com/how-i-crawled-the-entire-list-of-postal-codes-in-a-country-with-java-fde6259a8353?source=collection_archive---------29-----------------------

从 OneMap.sg 中检索新加坡的 141,848 个邮政编码—代码实现

在我居住的地方,没有太多的地理空间专业知识。当然,研究起来很有趣,也很吸引人,但是由于这个领域非常小众,很难在这个领域找到志同道合的人,更不用说找到另一个愿意不断更新️she 地图数据的人了。其中一个仓库恰好是新加坡现有邮政编码的完整列表,我计划每年发送几次。

被分配到一个有很多限制的环境中工作,让我变得越来越敏捷,越来越适应环境。这表现为寻找替代方案,通过漏洞绕过等等。手头有一份邮政编码列表恰好是我在工作中使用的少数几个技巧之一。对于地理编码相关的任务,例如识别某个建筑物所在的地理边界

[……]与在分配任务后仅使用地图服务 API**标记每个感兴趣的地点相比,**使用带有相关地带/地区/区域标记的邮政编码列表可以节省我几天的工作时间。

对于有兴趣了解如何以最少的麻烦对位置列表进行地理编码的读者,请阅读我关于 TurfJS 的文章:

Java 代码实现——用令牌调用 API

第 1 点—以编程方式更新 API 令牌

对于熟悉 Google Maps 服务 API 的读者来说,您应该知道专门为您的 API 帐户生成了一个令牌,以限制您调用 API 服务器的次数。类似地,我使用一个名为 OneMap.sg 的地图服务提供者,它需要一个令牌。然而,问题是 OneMap 选择在某个月之后使令牌失效,因此,每当我的调度程序被编程设置为开始进行 API 调用时,我需要首先确保进行单独的 API POST 请求,以便检索未过期的令牌。以下是我在 Java 中使用的效用函数:

private static void setAccessToken() throws UnsupportedEncodingException, IOException {
        String endpoint = "https://developers.onemap.sg/privateapi/auth/post/getToken";
        String email = "<EMAIL REGISTERED>";
        String password = "<PASSWORD OF ACCOUNT>";
CloseableHttpClient httpclient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(endpoint);
List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("email", email));
        params.add(new BasicNameValuePair("password", password));
        httpPost.setEntity(new UrlEncodedFormEntity(params));
CloseableHttpResponse httpresponse = httpclient.execute(httpPost);
        int statusCode = httpresponse.getStatusLine().getStatusCode();
        System.out.println("Success Status: " + statusCode);
if (statusCode >= 200 && statusCode <= 299) {
            Scanner sc = new Scanner(httpresponse.getEntity().getContent());
            StringBuilder sb = new StringBuilder();
            while (sc.hasNext()) {
                sb.append(sc.next());
            }
            String jsonStrResult = sb.toString();
            JSONObject responseObj = new JSONObject(jsonStrResult);
            access_token = responseObj.getString("access_token");
        }
        httpclient.close();
    }

第 2 点——使用递归处理分页 API

由于一个邮政编码可以引用许多地址,这取决于感兴趣的地区/国家,API 可以被分页—例如,如果有 50 个结果,但是每个页面只返回 10 个响应,那么有必要连续调用 API 来检索最后 4 页中的完整结果列表。

根据 API 的分页格式,您可能需要相应地调整代码。

然而,实现处理 API 分页的逻辑的一个简单方法是check if **no. of returned addresses <** **maximum no. of addresses per page**

因此,在实用函数中包含将每个页面的结果连接成一个 JSON 数组也更简洁:

private static JSONArray concatArray(JSONArray arr1, JSONArray arr2) 
throws JSONException {
    JSONArray result = new JSONArray();
    for (int i = 0; i < arr1.length(); i++) {
        JSONObject obj = (JSONObject) arr1.get(i);
        result.put(obj);
    }
    for (int i = 0; i < arr2.length(); i++) {
        JSONObject obj = (JSONObject) arr2.get(i);
        result.put(obj);
    }
    return result;
}

下面是完整源代码实现的链接: GitHub

使用的 JAR 依赖项有:

  • commons-log-1.2 . jar
  • httpclient-4.5.2.jar
  • httpcore-4.4.12.jar
  • json-20140107.jar
  • sqlite-jdbc-3.27.2.1.jar(可选。仅适用于 SQLite DB 用户。)

让它运行几天,根据国家/大洲邮政编码的格式,值的范围需要相应地调整 ( 我使用的例子是新加坡,它使用一个 6 位数的格式,所以范围是10000–999999)

另一方面,代码中的字段名(如**【BLK 编号】、【建筑】、【道路名称】、【地址】、【邮政】、【纬度】、【经度】、【X】、【Y】、【搜索值】**)应与地图服务提供商返回的每个地址的字段名相匹配。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者截图|我的 SQLite DB 中存储的 SG 地址列表。请注意,OneMap.sg 的数据由开放数据许可证管理。

**对读者的评论:*虽然你的工作角色不一定是以地理空间为中心的,但拥有一份你所在国家的邮政编码列表不会有什么坏处(除了需要一些存储空间)*事实上,在你最意想不到的时候,它会被证明是有用的!

持怀疑态度?然后看看你能在日常生活中完成以下哪些任务:

  • 寻找附近的医院进行医疗护理
  • 确定离工作场所/居住区最近的公交车站/火车站在哪里
  • 估计到达目的地的最短路线(考虑到你必须完成的任务和你需要中途停留的地方)

与从头开始搜索和盲目地搜索地址相比,从一系列地点中筛选出你要找的地点总是容易得多。

因此,尝试代码并享受其中的乐趣吧!

非常感谢你坚持到这篇文章的结尾!❤希望有人会觉得这很有用,并欢迎使用 Medium 跟随我。会非常感激😃

https://geek-cc.medium.com/membership

我如何创建分析师风格指南

原文:https://towardsdatascience.com/how-i-create-an-analyst-style-guide-for-a-good-data-story-presentation-6ec9f2504ac8?source=collection_archive---------18-----------------------

办公时间

对于有效的数据故事呈现

在我的第一篇博文我如何用数据讲故事中,我提到过一个好的故事讲述的一个关键部分是创造一个视觉上负担得起的演示,它应该是你口头交流的一个很好的补充,而不是分散你的观众的注意力。

在这篇文章中,我想进一步阐述我在上一篇文章中提到的技巧,并分享一些我认为在数据分析师的现实生活中非常有用的良好实践和示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

来源:https://unsplash.com/photos/Ar-iTL4QKl4

这篇文章将涵盖分析报告,这些报告通常以文章或幻灯片的形式制作,并使用图表和文本来分享对探索性复杂主题的见解,如“为什么我们看到本月的销售收入下降了?”或者“我们能做些什么来提高用户漏斗转化率?”。通常它们是与混合的受众群体共享和/或呈现的,这些受众群体可以包括产品经理、UX/UI 设计师、运营经理、营销人员、高级管理人员等。

在这篇文章中,我们不会讨论如何创建交互式仪表盘。😃

以下是这篇文章的几个原则,也就是说,后面将要讨论的所有技巧都服务于这些原则中的一个或多个。

  • 我们的时间有限。我们演示中的内容应该以这样一种方式进行优先排序,即最重要的信息总是排在第一位,以便我们的观众首先提取。
  • 我们认为消费包含数据的复杂信息对每个人来说都不是一件容易的事情。因此,我们应该以一种方式设计我们的演示文稿,使我们的观众从其中提取信息的努力最小化。
  • 人类的大脑喜欢模式和一致性。清晰一致的结构可以训练我们的观众习惯我们的故事情节,让他们更容易摄取和消化呈现的内容。

仅此而已!下面你可以找到四个技巧,我发现它们在制作一个易于理解的演示文稿以与多元化的受众群体分享数据见解时非常有用。在这篇文章的最后,我还分享了一个链接到我自己的模板。

我希望它们也对你有用——非常感谢你的任何反馈、想法或问题!

永远把结论放在第一位,让细节跟随其后。

首先是结论——这是我从《金字塔原理》一书中最大的收获。这种方法背后的想法是帮助你的观众在第一眼看到关键的想法,通常是“什么”,让他们自己决定是否或何时想知道“什么”背后的更多细节。

例如,如果我被要求调查我们这个月销售收入下降的原因,我会把摘要幻灯片作为我报告的第一页。在这张总结幻灯片上,通常有三个部分,每个部分包含 1-2 个句子。

为什么是三个?这也是我从金字塔原理中学到的一招。三是在一个团队中能最有效地传达你的信息的想法的神奇数量。如果你感兴趣的话,我发现这篇文章对详细解释这条规则很有帮助:https://medium . com/lessons-from-McKinsey/the-rule-of-3-c1cd 82 DBC 96

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

这张幻灯片可以帮助那些早上查看收件箱、打开附件、每封邮件只有 5 分钟时间的观众。第一张幻灯片让观众有机会抓住关键信息,并让他们决定是现在就深入细节还是留待以后。他或她不必在打电话之前浏览整个演示文稿。

这个技巧的另一个应用是使用有意义的句子作为幻灯片标题。这意味着,不要将幻灯片的标题定为“销售前景”,而是写下“未来 12 个月的销售前景看好”。

为什么我们要写一个更长的标题呢?同样,假设你是销售总监,你只有 5 分钟的时间浏览 10 页的报告。当你浏览幻灯片时,标题是第一个吸引你眼球的东西。如果你看到标题“未来 12 个月销售前景看好”——唷!这是个好消息,你现在不必担心销售前景。也许你对销售收入预测的一些具体细节感到好奇,但这不是你现在的优先事项,你可以在以后有更多时间时详细阅读该报告。然而,如果你第一眼看到的标题是“销售前景”,你就不确定这是好是坏。你不得不查阅图表和文本来找出答案,不幸的是,这增加了你获取你现在需要的准确、简单信息的努力。

同时,与“销售前景”相比,标题“未来 12 个月的销售前景看好”包含一个思维判断,可以更好地吸引观众对幻灯片内容的兴趣。

使用布局为您的受众创建学习模式。

不管我们承认与否,我们的大脑喜欢模式。当我们看到一系列[1,3,5,7,9,?],我们的大脑会自动用数字 11 代替问号。同样的道理也适用于你的演讲!当你的观众打开或看到你的幻灯片时,他们的大脑开始学习你的模式,并在他们从你的幻灯片中吸收信息时应用这些知识。

例如,我有一个叫做驱动器布局的布局。使用这种布局,我通常会在左侧绘制目标 KPI 的趋势,并在同一个框中显示文本描述。我使用右侧较大的空间来绘制驱动因素 KPI 的趋势,这些趋势可以解释目标 KPI 的发展。在下一张幻灯片中,目标 KPI 是销售收入,驱动 KPI 是销售线索(#)、转换率(%)和订单价值(欧元)。另外,我也用一些弹出的评论框来评论不规范的地方。

当我想要解释基于驱动 KPI 的目标 KPI 的发展时,我在整个演示中使用这种布局。当我的观众下次看到这种布局时,他们已经知道我的故事情节会是什么样子,这让他们更容易理解我的故事。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

另一个我经常使用的布局是对比布局。当我想强调两个或多个 KPI 在相同细分下的差异时,我发现这非常有用。使用这种布局,我通常根据我想要比较的指标的数量来平均划分空间。我还运用对比色方案,让我的观众知道他们应该注意不同部分之间的差距或差异。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

同时,我也发现配色方案的选择在创造图案时起着关键作用。**当你想要突出差异、差距或偏差时,使用对比色;当你想要表达序列或时间趋势时,选择顺序调色板。**例如,通过下面的图表,我想展示不同人群的货币化程度有所提高。我创建了一个连续调色板,其中越年轻的群体曲线越暗,这样我的观众就可以很容易地跟随颜色的变化,并注意到最暗的曲线(以及更近的客户群体)总是位于图中更高的位置,换句话说,最近的客户群体比老的群体平均产生更多的收入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

另一方面,随机调色板无法帮助观众在曲线的黑暗和群组的新近性之间建立联系,因此增加了观众阅读图表的挑战。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

让一致性主宰你幻灯片的每一个角落。

一旦你为你的观众设计好了幻灯片的结构和模式,下一步就是尽量减少任何可能分散观众注意力的调整。

尽可能对幻灯片的相同尺寸使用相同的配色方案。例如,如果你在多个图表中使用性别作为比较的关键维度,蓝色代表男性,黄色代表女性,那么在你的演示文稿中尽可能坚持这种配对。这样,下一次当你的观众在你的观想中看到“蓝/黄”对时,他们会直观地知道这是性别间的比较,而不必阅读这个小图例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

**在你的书面和口头交流中使用一致的词汇——特别是,坚持使用你特定领域的词汇。**如果您组织中的“Lead”一词指的是访问您网站但没有注册账户的任何人,那么在您的演示文稿的其余部分中继续使用这个定义。如果你在描述注册了账户但没有下单的人时突然开始使用“Lead”这个词,你的听众可能会感到困惑,并要求你做出澄清。

**为相同的时间粒度使用相同的日期/时间标签。**例如,如果你在图表或文本中使用“2020 年 7 月”作为月份标签,那么当你讨论每月趋势时,在你的整个演示文稿中坚持这种日期格式。突然切换到“2020/07”或“2020–07–01”将需要你的观众的大脑将其转换为之前学习的格式,从而为处理信息带来不必要的负担。

保持一切简单。

虽然我总是对能够传达非常复杂的趋势和维度的高级和全面的数据可视化印象深刻(就像汉斯·罗斯林的这个众所周知的数据演示:https://www . ted . com/talks/Hans _ rosling _ the _ best _ stats _ you _ ve _ ever _ seen),但我总是尽最大努力让我的报告中的数据可视化尽可能简单。

理论上,使用普通的 BI 工具或 R 和 Python 的可视化包,一个人可以用一个静态图表可视化多达六个维度,我在工作中应用的经验法则是在一个图表上不应显示超过三个维度。记住——三是一个神奇的数字:)

**尽可能使用简单简短的日期和数字格式。**例如,如果我需要展示一个从 2,000 到 200,000 的数字系列,我更喜欢在书面和口头交流中使用数据标签“3K”而不是“3,543”。确实,通过这样做,我们无法轻易显示 3,200 和 3,240 之间的差异(因为两者现在都被描述为 3K),这应该不是一个大问题,除非我们处于对准确性非常敏感的环境中,例如月度会计报告、投资者董事会会议或公关发布。

摘要

就是这样!

在这里附上我为这篇文章创建的分析师风格指南,并附有所有示例:https://docs . Google . com/presentation/d/1 oupyxbjn 9 MFI _ awe 74-fk 6 otl 4 i3 i5 iumfqdibsvlu/edit # slide = id . p

我鼓励你创建自己的分析师风格指南,在你的幻灯片中使用它,并不断改进它!

我如何用 Python 创建假新闻检测器

原文:https://towardsdatascience.com/how-i-created-a-fake-news-detector-with-python-65b1234123c4?source=collection_archive---------9-----------------------

用 spaCy 和 Streamlit 开发假新闻检测应用程序

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·温克勒在 Unsplash 上的照片

假新闻的泛滥是对现代民主社会的一个重大挑战。不准确的信息会影响人们的健康和福祉,尤其是在新冠肺炎疫情充满挑战的时期。此外,虚假信息通过阻止公民根据可证实的事实做出理性决定,侵蚀了公众对民主制度的信任。一项令人不安的研究表明,假新闻比真实新闻接触到更多人,传播速度更快,尤其是在社交媒体上。麻省理工学院的研究人员发现,假新闻在 Twitter 和脸书等平台上被分享的可能性增加了 70%。

假新闻运动是现代信息战的一种形式,被国家和其他实体用来削弱对手的权力和合法性。根据欧盟当局的说法,欧洲国家已经成为中国和俄罗斯虚假信息运动的目标,在许多话题上散布谎言,包括新冠肺炎疫情。东方战略任务小组已经成立,通过监控和揭露有关欧盟成员国的假新闻来处理这个问题。

事实审查员是核实已发布新闻事实正确性的个人。这些专业人士通过识别他们的虚假声明来揭穿假新闻。研究表明,传统的事实核查可以通过机器学习和自然语言处理(NLP)算法来增强。在这篇文章中,我将解释如何使用 Python 编程语言开发一个 web 应用程序来检测用我的母语(希腊语)编写的假新闻。

希腊假新闻数据集

每一个机器学习项目的成功都取决于拥有一个适当而可靠的数据集。有许多公开的假新闻数据集,如《骗子》和《FakeNewsNet⁴》,但不幸的是,其中大多数都是由英文文章组成的。由于我找不到任何包含希腊语文章的数据集,我决定创建自己的数据集。希腊假新闻(GFN)数据集由用希腊语编写的真实和虚假新闻组成,可用于训练文本分类模型,以及其他 NLP 任务。

该数据集是基于以下方法创建的。首先,真实的新闻是从一些著名的希腊报纸和网站上收集的。我添加了各种话题的新闻,主要集中在政治、经济、新冠肺炎疫情和世界新闻上。为了识别假新闻,我咨询了 Ellinika Hoaxes ,这是一个希腊事实核查网站,已经获得了国际事实核查网络 (IFCN)的认证。被验证为虚假的新闻条目样本也被添加到数据集中。该过程完成后,生成的数据集用于训练希腊假新闻检测器应用程序的文本分类模型。

spaCy Python 库

有许多高级 Python 库可用于自然语言处理任务。其中最受欢迎的是 spaCy ,这是一个 NLP 库,带有预训练的模型,以及对 60 多种语言的标记化和训练的支持。spaCy 包括命名实体识别(NER)、词性标注、句子分割、文本分类、词汇化、形态分析等组件。此外,spaCy 是一款健壮且可用于生产的软件,可用于现实产品中。这个库用于创建希腊假新闻检测器应用程序的文本分类模型。

简化框架

Streamlit 是一个 Python 框架,可以让你非常快速地为数据科学项目构建 web 应用。您可以用几行代码轻松创建一个包含各种小部件的用户界面。此外,Streamlit 是一个很好的工具,可以将机器学习模型部署到 web 上,并增加数据的可视化效果。Streamlit 还有一个强大的缓存机制,可以优化应用程序的性能。此外, Streamlit Sharing 是一项由库创建者免费提供的服务,让您可以轻松地部署您的应用程序并与其他人共享。有关 Streamlit 的详细介绍,请参见这里的

开发 Web 应用程序

出于多种原因,我决定开发希腊假新闻检测器。首先,我想从总体上熟悉 spaCy 库和 NLP,从而提高我的技能集并成为一名专业人员。其次,我想展示使用机器学习来处理假新闻问题的潜力,以一种非专家也能理解的方式。实现这一点的最佳方式是开发一个 web 应用程序形式的简单原型。Streamlit 是实现这一目的的理想工具,所以我决定利用它。我现在将解释源代码功能,从文本分类模型训练开始。我最初使用的是 Jupyter 笔记本,但是出于本文的目的,代码被转换为下面的 Python 文件,名为gfn_train.py

首先,我们导入必要的 Python 库,并定义两个助手函数。load_data()函数重组数据,为每篇新闻文章分配一个类别,并将数据集分成训练和测试子集。evaluate()函数计算各种指标,如精确度、召回率和 F 分数,这可以帮助我们评估文本分类器的性能。在定义辅助函数之后,我们加载 spaCy 预训练模型。我选择了el_core_news_md模式,因为我们正在处理用希腊语写的文章。

之后,我们将 GFN 数据集加载到熊猫数据帧,并通过删除一些不需要的字符来清理它。之后,我们将textcat组件添加到我们的预训练模型中。该组件将用 GFN 数据集进行训练,以创建文本分类模型。然后我们禁用其他组件,因为我们只需要训练textcat。然后,我们使用load_data()update()函数分别加载数据集和训练模型。我们之前定义的evaluate()函数用于打印培训指标和绩效。训练完成后,使用to_disk()功能保存模型。我们现在将检查 Streamlit web 应用程序的主文件app.py

我们从导入 Streamlit、spaCy 和其他必要的库开始。在此之后,我们定义了get_nlp_model()函数,该函数加载我们之前训练的 spaCy 文本分类模型。这个函数用@st.cache decorator 标记,它让 Streamlit 将模型存储在本地缓存中,从而提高性能。然后,我们使用markdown()函数和一些常见的 HTML 标签定义了打印分类结果的generate_output()函数。之后,文章文本被打印出来,同时还有一个用于可视化的单词云。

然后,我们使用各种 Streamlit 小部件创建应用程序布局。首先,我们设置页面标题和描述。其次,我们创建一个用于输入类型选择的单选按钮小部件。通过这样做,用户可以选择输入文章的 URL 或文本。如果用户选择文章 URL 作为输入类型,则使用get_page_text()功能抓取文本。否则,用户可以在多行文本输入中粘贴文章。在这两种情况下,都使用一个按钮小部件来调用generate_output()函数,从而对文章进行分类并打印结果。最后,我们可以执行streamlit run app.py命令在本地运行应用程序,或者使用免费的 Streamlit 共享服务来部署它。

结论

我希望读完这篇文章后,你会更加了解使用 NLP 和机器学习来处理假新闻这一严重问题的潜力。此外,我鼓励您尝试并创建自己的假新闻检测应用程序,因为修改代码以在不同的数据集上训练模型很简单。如果你想克隆这个项目的 Github 库,可以在这里找到。欢迎在评论中分享你的想法,或者在 LinkedIn 上关注我,我经常在那里发布关于数据科学和其他主题的内容。你也可以访问我的个人网站或者查看我的新书,名为用 PyCaret 简化机器学习。

参考

[1]沃索伊、索罗什、德布罗伊和希南阿拉尔。"真假新闻在网上的传播."理科359.6380(2018):1146–1151。

[2]大川、雷、钱景和威廉·王洋。“用于假新闻检测的自然语言处理综述.” arXiv:1811.00770 (2018)。

[3]王,杨威廉.““骗子,骗子裤子着火了”:假新闻检测的新基准数据集.” arXiv:1705.00648 (2017)。

[4]舒,凯等,“假新闻网:一个包含新闻内容、社会背景和时空信息的数据仓库,用于研究社交媒体上的假新闻。”大数据8.3(2020):171–188。

我如何创建一个实时情绪分析器

原文:https://towardsdatascience.com/how-i-created-a-real-time-sentiment-analyzer-fc24d7d99e3a?source=collection_archive---------23-----------------------

实时预测你演讲的情绪

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片由穆罕默德·哈桑来自 Pixabay

情感分析是一种自然语言处理技术,用于预测给定文本的情感或观点。它包括使用自然语言处理、文本分析、计算机语言学来识别或提取主观信息。情感分析广泛用于预测评论、评论、调查响应、社交媒体等的情感。

情感分析器模型可以预测给定文本是指积极的、消极的还是中性的情感。在本文中,我们将重点开发一个实时情感分析器,它可以使用 NLTK 和 TextBlob 等开源 Python 库来实时预测语音的情感。

想法:

在这个项目中,我们将开发一个可以听语音并将其转换为文本数据的模型,并使用 TextBlob 库实时分析文本的情感。

  1. 使用语音识别器引擎识别语音并将其转换为文本格式。
  2. 使用 TextBlob 实时预测文本的情感。
  3. 重复步骤 1 和 2,直到对话结束。

语音识别器:

第一步是使用语音识别器引擎将语音转换成文本格式。我们将使用一个开源的 Python 库 SpeechRecognizer 来将演讲转换成文本。这是一个用于执行语音识别的库,支持在线和离线的多个引擎和 API。

安装:

**pip install SpeechRecognition**

使用 TextBlob 的情感分析器:

TextBlob 是一个基于 NLTK 的开源 Python 库,提供易于使用的 API,用于情感分析、翻译、词性标注、名词短语提取、分类等。它用于处理文本数据,并允许哪个算法使用其简单的 API。

对于情感分析,TextBlob 提供了两种实现算法:

  • 模式分析器:(默认)情感分析器算法,使用与模式库相同的实现。它以命名元组的形式返回结果,格式如下:
**Sentiment(polarity, subjectivity, [assessments])**

其中【评估】是被评估的表征及其极性和主观性得分的列表。

  • **Naive Bayes analyzer:**Naive Bayes analyzer 是一个 NLTK 分类器,它在电影评论数据集上进行训练。以命名元组的形式返回结果,格式如下:
***Sentiment(classification, p_pos, p_neg)***

param callable feature _ extractor:给定单词列表,返回特征字典的函数。

实施:

  • 导入必要的库(第 1–2 行)。
  • 初始化语音识别器引擎(第 4 行)。
  • 使用识别器引擎监听音频(第 10 行),如果 2 秒内没有音频(timeout=2),识别器将停止监听。
  • 使用 TextBlob 函数recognizer_google(第 10 行)将音频输入转换成文本格式。
  • 使用 TextBlob 情感分类器预测输入文本的情感(第 13 行)。
  • 运行循环,直到你说出“退出”这个词,退出循环。

(作者代码)

结论:

在本文中,我们讨论了一个使用 TextBlob 的实时情感分析器模型。您还可以使用上面讨论的自定义函数实时实现该模型,该函数将听取您的讲话,并预测情绪。

在这个实验中,我们使用了来自 TextBlob 库的预先训练的情感分类器模型。还有一些其他的技术来开发一个情感分析模型,阅读下面的文章来获得这些方法实现的概述。

</5-ways-to-develop-a-sentiment-analyser-in-machine-learning-e8352872118>

感谢您的阅读

我如何为 Twitch 创建一个实时流精彩检测应用程序

原文:https://towardsdatascience.com/how-i-created-an-app-for-live-stream-highlight-detection-for-twitch-532f4027987e?source=collection_archive---------24-----------------------

内部源代码

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://unsplash.com/photos/HUBNTCzE-R8

介绍

在 Twitch 上直播期间,许多流媒体和电子竞技组织都很难从海量的流媒体数据中提取有趣的瞬间。对于大型电子竞技组织来说,让员工在直播过程中找到精彩内容也是非常昂贵的。除了这个问题之外,另一个问题出现了,现场直播通常持续相当长的时间,有时直播者需要休息,在这些时刻观众从流中流出。在此期间显示有趣的精彩片段可能是让观众继续观看视频流的潜在解决方案。
在亮点检测领域,积极的工作正在进行中。最近,已经提出了大量的解决方案,一些大公司和初创公司也试图提供现成的解决方案。不幸的是,大多数服务都没有为这个问题提供开源解决方案。到目前为止,还没有现成的解决方案可以推出和测试,几家处理类似问题的初创公司被迫关闭。也许这一领域发展如此不成功的根本原因是任务的复杂性,甚至一个人也不能够准确地阐述有趣时刻的定义。除其他外,这项工作旨在更准确地制定这一定义,并努力改善现有的研究和开发成果。

机器学习模块开发

为了解决在直播流中找到有趣时刻的问题,我决定将问题分成更小的部分,因此,结合使用了几种机器学习算法。首先,我从直播流中提取了 10 秒钟的剪辑,对于每个剪辑,我从聊天+音频+视频数据中提取了以下信息:

  • 通过当前时刻的情感和评论数量来评估剪辑;
  • 使用陈盼 CNN 进行音频标记,通过音量和检测到的声音信号来评估剪辑;
  • 利用密集光流和卷积神经网络,通过帧与帧之间的运动量来评估剪辑;

然后元模型使用这些特征对每个片段进行独立评分。以下是机器学习工作流程的粗略架构:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

机器学习模块的工作流程

现在,让我们分别深入研究机器学习模块的每个组件。

1.Twitch 聊天功能

为了从 Twitch 聊天中提取数据,我们选择使用以下聊天功能:

  1. 10 秒钟片段的消息总数
  2. 在 10 秒钟的剪辑中,积极情绪的消息总数
  3. 在 10 秒钟的剪辑中,带有负面情绪的消息总数

出于这个目的,我使用了出色的变形金刚库,在那里,情感分析可以在几行代码中完成。

2.运动特征

随着运动估计变得更加有趣,为了更好地理解光流概念,你可能想看看我的帖子关于使用光流进行运动计数。

也就是说,运动估计模型基于光流算法,该算法突出显示图像的每个像素,使得在一个方向上移动的像素以相同的颜色突出显示。可以配置光流,使其对像素进行分组并突出显示整个区域,由于这一技巧,具有大量运动的帧会呈现以下外观:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用光流算法编码的具有大量运动的帧

移动次数少的帧会呈现以下外观:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

用光流算法编码的低运动量帧

正如你所看到的,区分一种类型的图像和另一种类型的图像是非常容易的;为了让这一功能在应用中发挥作用,使用了简单的卷积神经网络(CNN)的架构。网络的任务是将通过光流编码的图像识别为具有大量运动的图像(类别 1)和具有少量运动的图像(类别 0)。这么简单的任务,即使是架构最简单的 CNN 也表现的很好。

3.声音特征

几种方法同时被用来从声音中提取数据。首先,对于每个剪辑,提取最大声音值。其次,使用陈盼 CNN 进行音频标记,可以在音频中找到特定的声音,然后从中提取必要的数据。以下是模型提取的声音特征列表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

陈盼 CNN 模型提取的声音特征

4.元模型!

由于人们很难找到有趣的时刻,以及“有趣的时刻”这一概念的模糊性,因此决定创建一个元模型,它可以总结出哪些特征对于从数据中识别有趣的时刻是重要的。
元模型获取由音频、动作和聊天组件提取的关于 Twitch 广播的所有数据。然后,它根据提供的特征预测该时刻成为有趣时刻的概率。
从直播中提取所有数据后,以下一组特征被输入到元模型的输入中:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

元模型使用的所有特性

经典的监督学习方法用于训练元模型。为此,收集并标记了直播样本。为了标记每个广播,我使用了 supervise.ly 平台,这对于数据标记来说非常方便!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

supervise.ly 视频标注界面截图

为了标记直播,使用了来自我的应用程序的现成代码库。已卸载所选直播的所有功能。每个广播都被切成连续的 10 秒钟的片段。对于每个广播,获得以下数据表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

元模型使用的数据集示例

在所有的类标签被标记之后,训练元模型的过程就开始了。根据两个标签进行类别预测的问题是一个常见的二分类问题。为了解决这个问题,我使用了 scikit-learn 库中的模型。最佳模型(可解释性、速度和 f1 值)是逻辑回归,F1 值为 0.44 。以下是逻辑回归模型(系数)的特征重要性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

逻辑回归模型中的特征重要性

在训练元模型并可视化特征的重要性之后,人们可以看到模型能够从数据中提取的几个有趣的模式:
确定类“有趣时刻”的最重要标准:

  • 音量(声音响度)
  • (机关枪的)射击声
  • 笑声。

确定班级“无趣时刻”的最重要标准:

  • 背景音乐(音乐)
  • 演讲(演讲,男性演讲)
  • 单发射击(枪响、枪声)

不影响模型结果的特征:

  • 脚步声
  • 聊天中正面消息的数量
  • 一个女人的声音。

一个有趣的事实是,该模型将女性的声音归类为不重要,尽管这不是真的。事实是,男性的声音在训练样本中占主导地位,正因为如此,模型得出女性的声音不重要的结论,这是一个经典的“人工智能中的偏见”问题

实施细节

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

应用架构

该应用程序由两个主要部分组成:
Web 应用程序,用户与主界面
服务器进行交互,在此进行视频流处理和精彩片段检测
在与应用程序前端部分的交互过程中,用户上传一个到直播的链接,他希望在那里找到精彩片段,然后该链接连同用户的元数据一起被发送到服务器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

向应用程序添加新的实时流

在服务器上,直播及其评论被持续加载到本地存储器中,同时在直播中检测有趣的时刻。一旦发现新的有趣时刻,就会将其保存在谷歌云存储中,并将包含该有趣时刻的视频链接发送回 web 应用程序。

应用程序的两个部分(web 应用程序和服务器)都位于谷歌云平台上,当启动时,会收到它们的公共 IP 地址,您可以连接到这些地址。

这是该应用的一个快速展示:

结论

我希望这篇文章能帮助你更好地理解我的高光检测管道。我在我的 GitHub 简介上发布了所有代码,所以请随意查看并将其用于您自己的项目!

你可能喜欢在我的 网站 上查看其他帖子,别忘了订阅:)

我如何使用 spaCy、Flask 和 Heroku 部署情感分析器 API

原文:https://towardsdatascience.com/how-i-deployed-a-sentiment-analyser-api-with-spacy-flask-and-heroku-bd9b8f9de6cf?source=collection_archive---------19-----------------------

了解如何使用您构建的模型开发 RESTful APIs

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

混合动力Unsplash 上拍照

通过完成本教程,您将学会使用 Flask 将机器学习模型部署到 Heroku。因此,即使您的组织中没有机器学习工程师或软件工程师,您也将拥有部署机器学习 REST APIs 的必要技能。

我将首先使用 spaCy 创建一个情感分析模型来进行演示。然后,我将向您展示如何使用 Flask 将这个模型转换成 REST API。最后,API 将被部署到 Heroku 并集成到现有的 web 应用程序中。

用 spaCy 创建一个简单的情感分析器

首先,我们构建了一个基本的情感分析模型,它可以识别用户输入是积极的还是消极的。我们将使用 spaCyTextBlob ,它从 TextBlob 扩展了 SpaCy ,具有额外的文本处理能力,包括情感分析。

首先,我们导入 spaCy 和 TextBlob。

import spacyfrom spacytextblob.spacytextblob import SpacyTextBlob

我们还加载了 spaCy 语言模型,并使用 TextBlob 扩展了我们的文本处理管道。

nlp = spacy.load('en_core_web_sm')nlp.add_pipe('spacytextblob')

我们的目标是建立一个情感分析模型,该模型接受用户输入的字符串并对情感进行评分。模型应该在字典中输出它的预测,这将简化我们的 API 的开发。

# User input text
user_input = 'This is a wonderful campsite. I loved the serenity and the birds chirping in the morning.'# Process user input
doc = nlp(user_input)# Convert the model output to a dictionary
input_polarity = doc._.polarity
sentiment = {
    'score': input_polarity
}
print(sentiment)

如果我们运行这个管道,我们应该得到以下输出:

{'score': 0.85}

我们的模型输出从-1(负面情绪)到 1(正面情绪)的分数。

要自己运行这段代码,请查看我的 Google Colab 笔记本

Flask RESTful API 概念回顾

在我们开始开发情绪分析 Restful API 之前,让我们先回顾一些概念。

烧瓶是什么?

Flask 是一个 Python 微型 web 框架,为您提供开发和构建 web 应用程序所需的工具。“微”指的是 Flask 不像其他框架那样执行特定的库或结构(例如 Django )。Flask 的轻量级设计使框架灵活易用,受到熟悉 Python 的数据科学家的欢迎。

什么是 API?

应用程序编程接口(API)允许产品和服务基于一组规则相互通信。作为一名数据科学家,你不需要理解一个 API 是如何实现的,但是,你可以使用它的接口与它进行交互。例如,下面是简单 API 的列表:

什么是 RESTful API?

REST 代表 RE 表象 S 状态 T 转移。当一个 API 在开发时考虑了特定的约束,它就是 RESTful 的。这些约束使得其他人更容易使用您的 API 并与之通信。

在 REST 架构中,客户端(例如您的浏览器)请求在服务器上创建、读取、更新或删除(也称为“CRUD”)数据。然后,服务器将根据您的请求做出响应。

一个简单的使用 Flask 的“Hello World”API

我们将从开发一个简单的 API 来演示 Flask 的主要构件开始。

注意:我建议你使用 Python IDE 或者代码编辑器,比如 Visual Studio 代码 ,来编写你的脚本。我的应用程序是在 Windows 机器上开发的,因此您的命令可能在 Unix 或 macOS 上有所不同。

虚拟环境和安装库

使用终端,在名为 flask-hello-world 的新目录中创建一个名为 env 的虚拟环境:

$ py -m venv env

如果你在 Unix 或 macOS 上,命令是:

$ python3 -m venv env

在我们开始安装 Flask 和我们需要的其他库之前,激活您的虚拟环境:

$ .\env\Scripts\activate

如果你在 Unix 或 macOS 上,命令是:

$ source env/bin/activate

现在,让我们安装烧瓶烧瓶-RESTful :

$ pip install Flask
$ pip install flask-restful

最后,让我们为我们的服务器安装 gunicorn :

$ pip install gunicorn

编写我们的 app.py

一切都设置好了,我们可以进入我们的 app.py 文件了。从导入 Flask 和 Flask-RESTful 开始:

from flask import Flask
from flask_restful import Resource, Api

然后,我们初始化 Flask 应用程序,并将其指定为 API:

app = Flask(__name__)
api = Api(app)

Flask-RESTful 提供了称为资源的构建块,允许我们访问 POST、GET、PUT 和 DELETE 等 HTTP 方法。这些分别对应于我们的创建、读取、更新和删除(CRUD)操作。让我们定义一个简单的 GET 路线:

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

当需要创建我们的情绪分析应用程序时,我们将返回到这段代码,并根据需要进行调整。

接下来,我们将 URL 为“/”的 HelloWorld 资源添加到我们的 API:

api.add_resource(HelloWorld, '/')

最后,如果当前文件名与主文件名相同,我们希望运行应用程序。我们还在调试模式下运行,部署时将关闭该模式:

if __name__ == '__main__':
    app.run(debug=True)

如果你一直跟随,你的 app.py 应该看起来像这样:

为了启动我们的简单 web 应用程序,我们在终端中运行我们的 app.py 文件:

$ python app.py

如果一切按计划进行,您应该会在终端中看到以下消息:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

为了测试我们的 API,我们有几个不同的选项。最简单的方法是在新的终端窗口中使用 curl,方法是使用以下命令:

$ curl http://127.0.0.1:5000/

您应该得到以下输出:

{
    "hello": "world"
}

或者,您可以使用类似于 Postman 的工具,它是为构建和测试 API 而设计的。例如,下图展示了对我们的服务器的 GET 请求以及我们收到的响应。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

最后,您可以使用 Python Requests 库来发送 HTTP 请求。然而,本教程没有涵盖请求库,我鼓励您阅读文档。

就是这样!至此,您应该已经运行了第一个“hello world”Flask API。作为参考,你可以在这个 GitHub 库里找到我所有的代码。

用 spaCy 为我们的 API 添加情感分析

在我们的 spaCy 情感分析器笔记本和“hello world”Flask API 之间,你应该拥有创建情感分析 API 所需的一切。

首先创建一个新的目录(我的目录名为情绪分析器 yelpcamp ),设置你的虚拟环境并安装你需要的库。不要忘记包括 spaCy 和 spaCyTextBlob:

$ pip install -U pip setuptools wheel
$ pip install -U spacy
$ python -m spacy download en_core_web_sm
$ pip install spacytextblob

然后,我们通过导入和初始化我们的库来开始我们的 app.py 文件:

from flask import Flask, request
from flask_restful import Resource, Api, reqparseimport spacy
from spacytextblob.spacytextblob import SpacyTextBlobnlp = spacy.load('en_core_web_sm')
nlp.add_pipe('spacytextblob')app = Flask(__name__)
api = Api(app)

您可能会注意到,我们正在从 Flask-RESTful 导入 reqparse 模块。reqparse 模块简化了表单验证,允许我们在将用户输入传递到我们的情感分析模型之前检查它。

我的 API 将被部署到我的网站 YelpCamp ,对露营地评论的情绪进行分类。我将设置 reqparse 来检查表单(或来自 Postman 等工具的请求)是否包含名为“review”的字段:

parser = reqparse.RequestParser()
parser.add_argument('review', required=True,
                    help='Review cannot be blank!')

现在,让我们定义一个 POST route,它从请求正文中提取“review”字段,通过nlp对象将其转换为 spaCy Doc对象,并使用 spaCyTextBlob 提取情感分数:

class PredictSentiment(Resource):
    def post(self):
        args = parser.parse_args()
        review = args['review']
        doc = nlp(review)
        score = doc._.polarity
        return {'score': score}

然后,我们将 URL 为’/predict '的PredictSentiment资源添加到我们的 API 中:

api.add_resource(PredictSentiment, '/predict')

最后,如果当前文件名与主文件名相同,我们希望运行应用程序。然而,这一次我们没有在调试模式下运行我们的 API,因为在下一步我们将把我们的应用程序部署到 Heroku。

if __name__ == '__main__':
    app.run()

一旦完成,你的 app.py 应该看起来像这样:

我们现在可以启动我们的 Flask 应用程序,并使用 Postman 测试我们的 API,看看我们是否收到了预期的响应。这一次,我们将向“http://127.0.0.1:5000/predict”发出发布请求,并在请求正文中包含“review ”:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我们的模型以 JSON 响应,表明情绪得分为 0.60(在-1 到 1 的范围内),这意味着我们的评论情绪非常积极。

现在我们的 API 已经在本地环境中运行了,我们可以将应用程序部署到 Heroku。

作为参考,您可以在我的 GitHub 上访问我的代码。

将 API 部署到 Heroku

在您的应用程序目录中,添加一个名为 Procfile 的文件,并包含以下内容:

web: gunicorn app:app

根据 Heroku 文档,Procfile“指定了应用程序在启动时执行的命令”。

我们还需要创建一个包含在我们目录中的 requirements.txt 文件:

pip freeze > requirements.txt

在我们将应用程序部署到 Heroku 之前,我们将初始化一个 Git 存储库:

$ git init

然而,我们不想在我们的虚拟环境中包含所有的包,所以我们将创建一个**。gitignore** 包含以下内容:

env/
__pycache__/

然后,我们可以添加应用程序文件并提交我们的更改:

$ git add .gitignore app.py requirements.txt Procfile
$ git commit -m "Initialize Git repository"

现在,您应该有一个类似于的目录。

要将我们的 API 部署到 Heroku,您需要注册一个免费的 Heroku 帐户,并安装 Heroku CLI 。之后,您可以使用终端登录 Heroku CLI:

$ heroku login

我们现在要将我们的代码链接到 Heroku 服务器,这可以通过 Git remote 来实现。这可以通过从 CLI 运行以下命令来实现,该命令将创建一个 Heroku 应用程序:

$ heroku create

最后,我们将代码推送到触发构建过程的 Git 远程存储库。运行以下命令后,您将看到关于部署过程的信息,并且(希望)在完成后会看到一条成功消息:

$ git push heroku main

你成功了!输出将显示您的 API 的 URL(我的是https://sentiment-analyser-yelpcamp.herokuapp.com/)。或者,您可以通过 Heroku 仪表盘访问该应用程序,网址为:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

为了测试我们的 API 是否已经正确部署,我们可以使用 Postman。使用相同的检查,我们从部署的 API 得到与在本地机器上相同的响应。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

(奖励)将 API 与现有的 web 应用程序集成

大多数情况下,对于您构建的 API,您会有一个特定的用例。您可能希望在一些批量 ETL 处理作业中调用 API,或者在 Streamlit 上演示一个原型。在我的例子中,我的目标是对我的网站 YelpCamp 上露营地评论的情绪进行分类。

YelpCamp 是用 NodeJS 开发的。因此,我使用 Axios 库来调用我的 API,传递评论体并返回存储在 MongoDB 中的情感评分。下面的代码演示了这个过程,但是,解释超出了本教程的范围:

结论

通过学习本教程,您现在应该了解了:

  • 利用 spaCy 和 spaCyTextBlob 进行文本情感分类
  • 用 Flask 和 Flask-RESTful 开发一个简单的 REST API
  • 将您的应用程序部署到 Heroku

您开发的模型不再需要保存在本地的 Jupyter 笔记本中。使用本教程作为指南,并开始与世界分享您的模型。

你有什么问题吗? 推我 或者在 LinkedIn 上加我。

你可以在 GitHub 上找到这篇文章中用到的所有代码。

我如何部署我的第一个机器学习模型

原文:https://towardsdatascience.com/how-i-deployed-my-first-machine-learning-model-1147c04c449b?source=collection_archive---------15-----------------------

实践教程

我用来交付我的第一个商业机器学习模型的流程和工具

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

戴恩·托普金Unsplash 上的照片

1。简介

我们在机器学习中听到最多的一个词是术语部署。机器学习模型的部署只不过是一个过程,在这个过程中,我们让其他人可以使用机器学习模型,正是在这个阶段,我们看到模型如何成为产品。

向用户提供模型时,会出现几个问题,例如:

  • 模型是如何生产和测试的?
  • 如何监控模型?
  • 如何更新我的模型?
  • 我使用什么框架和工具?

在这篇文章中,我稍微解释了一下部署我的第一个机器学习模型的生产过程,从生产流水线、模型监控、交付给最终用户和持续/交付集成(CI/CD)。目标是直接关注生产过程,解释做出了哪些决定及其原因,以及解释在模型构建过程中使用了哪些工具。在这篇文章中,我们没有任何类型的代码,只是对生产过程的解释。

2。TFX(张量流扩展)

这个模型是用 TFX建造的并且大部分应用内容是通过面向生产的机器学习工程(MLOps)综合课程项目学习的,这些课程由吴恩达、罗伯特·克劳和劳伦斯·莫罗尼等杰出的专业人士讲授。

“TFX 是基于 TensorFlow 的谷歌生产规模的机器学习(ML)平台。它提供了一个配置框架和共享库,以集成定义、启动和监控您的机器学习系统所需的通用组件。”根据 TFX 用户 Guide⁴.的说法

但是你为什么选择为你的第一个模型使用一个不那么简单的框架呢?

在生产中处理模型时,MLOps 中有三个非常重要的概念。

  • 数据来源

您的数据来自哪里,如何产生,提交了什么方法和流程。

  • 数据谱系

它指的是到达管道末端之前的一系列步骤。

  • [计]元数据

是数据描述数据。它们用来解释我们正在看的物品的特征。例如,如果我们正在查看一张照片,元数据可能是照片拍摄的时间、相机设置、照片拍摄者等等。

这三个部分是生产模型 的关键,因为它们有助于跟踪模型生命周期中发生的变化。假设我们有一个团队来收集和清理数据,另一个团队来管理接收,另一个团队来创建/测试模型,还有一个团队来部署它。有许多人在不同的环境中处理不同的文件,如果没有有效地完成,这会使变更跟踪过程变得非常复杂。

假设我们将模型投入生产,但是在几个版本之后我们发现在清理数据时出现了错误。我们如何跟踪数据版本,执行了什么转换,模型的属性是什么?我们如何再现之前提交数据的相同环境?

**这就是为什么使用对这些过程有某种支持的框架是很重要的。**开发 TFX 是为了在生产环境中构建和管理工作流。因此,TFX 的三个主要组成部分是:

  • 管道
  • 成分
  • 图书馆

2.1 管道

为了确保数据遵循逻辑顺序的步骤,有管道。TFX 管道包含一系列组件,它是为可伸缩和高性能的机器学习任务而设计的。在管道内部,您可以转换数据、训练模型、部署、显示推论等等。TFX 支持多个 orchestrators,例如 Apache Airflow、Apache Beam 和 Kubeflow 管道。

2.2 组件

我喜欢把组件想象成乐高积木。您可以单独或一起使用它,每个组件都是为特定的任务而设计的。有些组件依赖于另一个组件的输出,因此您必须按照逻辑顺序使用它们。

为了理解我们的管道是如何组装的,我们首先需要理解它的组件。TFX 有几个教程解释如何使用这些组件。通常,TFX 管道包括以下组件:

  • ExampleGen 在开始时出现,将数据分成训练和评估数据集,将其转换为“tf”。“示例”格式。它接受不同的格式,如 CSV、TFRecord、Avro、Parquet 和 BigQuery。
  • StatisticsGen 负责计算数据集的统计数据,如分布、最大值、最小值、缺失值等。
  • SchemaGen 创建一个数据模式。它显示了每个功能的预期数据类型。
  • 示例验证器在训练和评估数据集中寻找异常(与预期值不同的值)和缺失值,例如检测训练服务偏差。
  • Transform 负责执行我们模型中变量的所有转换/创建。该组件的一个重要之处在于,它生成一个存储数据全局属性的图表,这些属性将用于训练和推理,从而提供可靠性。
  • 培训师培训模特。在这个组件中,除了定义模型的整个架构之外,我们还指定了模型将在哪里以及如何被训练。
  • 调谐器调谐模型的超参数。调谐器可以在管道的所有执行中执行,或者如果您只想不时地执行超参数的调整,也可以导入它。
  • 评估员深度评估模型的性能。它还可以验证您的模型,允许您对数据的特定子集进行度量,确保模型足够好,可以推向生产。
  • 推送器将经过验证的模型推送到部署目标。这是我们指定模型将被服务的地方。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图一。 TFX 管道。这张图片是从谷歌创作和分享的作品中复制的,并根据知识共享 4.0 归属许可中描述的条款使用。来源:https://www.tensorflow.org/tfx/guide

2.3 库

库是为组件提供功能的基础。

基本上,TFX 管道是由组件组成的,而组件又是由库组成的。

3。实验跟踪和管理

在建立模型的过程中,我认为非常重要的一步是实验跟踪和管理。在构建模型时,您将运行几个实验,包括:

  • 具有不同超参数的不同模型
  • 不同的培训和测试数据
  • 不同的特征
  • 对代码的细微更改

这些不同的实验会产生不同的指标。记录所有这些信息不是一项简单的任务,而是一项非常重要的任务,主要是跟踪模型的进展,比较不同的实验以对最终结果有信心。

这就是实验跟踪和管理的用武之地。在这个过程中,我们保存所有对我们进行的每个实验都很重要的信息。每个项目都有自己的一组需要保存的重要信息,包括:

  • 每个文件使用的代码
  • 环境设置
  • 数据集版本
  • 超参数设置
  • 性能指标
  • 使用的模型类型

有几种方法可以保存这些信息,但是 对于大型项目来说,控制正在做的事情是非常重要的。为此,有几个工具可用,如 CometML权重和偏差(WandB)MLFlow

在我们的项目中,我们选择使用海王星。

“Neptune 是任何 MLOps 工作流的元数据存储。它是为进行大量实验的研究和生产团队设计的。它让您可以在一个地方监控、可视化和比较数以千计的 ML 模型。”根据 Patrycja⁸的观点

Neptune 支持实验跟踪、模型注册和模型监控,其设计方式允许轻松协作。它还具有 TensorFlow integration ,使得在一个地方监控所有实验变得非常简单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图二。**海王星运行(图片由作者提供)。

4。顶点 AI + TFX 管线

当我们部署一个模型时,我们需要考虑如何将它提供给我们的最终用户。在我们的例子中,我们需要通过 API 使模型可用,这样我们就可以发送请求和接收响应。

为了建立我们的管道,我们选择与谷歌云合作。作为一名管弦乐手,我们使用 Kubeflow 管道,因为大多数教程都是通过它完成的。有几个教程教你如何在云中集成 TFX 管道,如[1]、[2]和[3]。

我们决定使用 顶点人工智能 ,谷歌新的人工智能平台平台来建立我们的管道。我们选择 Vertex AI 有两个原因:

  • 与人工智能平台管道相比,它更便宜(在我们的情况下)。顶点流水线不需要集群一直处于活动状态,成本按每次运行收取,并且与用于训练/预测模型的计算资源的使用相关联。
  • 不像 GKE (谷歌 Kubernetes 引擎),我们不需要管理我们组件的基础设施/服务器/健康状况,因为它是一个自我管理的平台。

根据文档,Vertex AI 管道可以运行使用 Kubeflow Pipelines SDK v1.8.9 或更高版本或 TensorFlow Extended v0.30.0 或更高版本创建的管道。

虽然我们的流水线运行在 Vertex AI 上,但我们选择在 AI 平台 上训练和服务我们的模型。Vertex AI 是一个最新的平台,其局限性将随着时间的推移而改善,因此,在撰写本文时,有一些重要的特性还不存在于被服务的模型中,例如在发出 predict 请求时指定一个 SavedModel TensorFlow 的签名。

每个组件负责 TFX 管道中的一项任务,并且通常一个组件依赖于另一个组件的输出。在我们的例子中,我们选择不使用 InfraValidator 和 BulkInferrer 组件。然而,我们选择在管道中增加一个节点,即解析器。Resolver 是一个特殊的 TFX 节点,用于处理特殊工件的求解,在我们的例子中,它用于将最新的基础模型指定到评估器组件中。

所以我们的顶点管道是这样构成的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图三。 Vertex AI 管道(图片由作者提供)。这张图片是基于谷歌创作和分享的作品的修改,并根据知识共享 4.0 归属许可中描述的条款使用。来源:https://www.tensorflow.org/tfx/guide

5。监控

一旦管道被执行,我们的模型将可用于预测。然而,这并不意味着我们的工作已经结束,而是刚刚开始。当您在生产中部署一个 ML 模型以服务于业务用例时,**定期地、主动地验证模型性能不会衰退是至关重要的。**由于模型不在静态环境中运行,ML 模型的性能会随着时间的推移而降低。数据分布可能会发生变化,导致数据不对称,从而影响模型的性能。为了维护模型在生产中的性能,有必要注册服务请求并将其与定型数据进行比较,以验证模型的预测能力是否发生了变化。

所以,我们需要监控模型。我们已经选择从我们的模型中记录服务请求,这个过程以 raw (JSON)格式记录在线预测请求和对 BigQuery 表的响应的示例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 4。**监控架构。这张图片是从谷歌创作和分享的作品中复制的,并根据知识共享 4.0 归属许可中描述的条款使用。来源:https://cloud . Google . com/architecture/ml-建模-监控-分析-ai-平台-预测-大查询

**有了这些记录,我们就可以分析数据、计算统计数据并可视化数据的偏差。**这一过程对于模型的健康发展至关重要,提供数据会改变其分布,这将导致我们的模型性能下降,表明有必要重新训练/调整模型。由于数据将被注册到 BigQuery 表中,因此生成关于数据分布和模型预测的可视化和报告非常容易,要使用的工具的一个例子是 Data Studio

6。CI/CD

现在,让我们进入项目的最后一步。假设我们有几十个模型,生产中有数百个文件,并且我们定期需要进行调整,例如调整数据集、创建变量、重新训练模型、调整超参数等。我们如何自动化这个过程,以便检测、测试任何设计变更,并自动部署新模型?

“在软件工程中,持续集成(CI)和持续交付(CD)是两个非常重要的概念。CI 是指集成变更(新特性、批准的代码提交等。)进入你的系统。CD 是您可靠地、持续地部署这些变更的时候。CI 和 CD 既可以单独执行,也可以耦合执行。”根据 P. Chansung 的说法;Sayak⁶

CI/CD 管道允许我们的软件处理代码变更、测试、交付等等。我们可以自动化实施变更、测试和交付的流程,以便检测、测试项目的任何变更,并自动部署新模型。这使得我们的系统除了提供速度和可靠性之外,还可以扩展和适应变化,减少由于重复故障导致的错误。如果你想了解更多关于 CI/CD 的重要性以及为什么你的项目需要它,请查看这篇文章

在此项目中,我们创建了以下 CI/CD 管道:

  1. 我们在 Github 上创建了一个存储库,包含了将在 Vertex AI 上运行的 TFX 管道的所有代码。
  2. 我们已经在 GitHub Actions 上建立了一个工作流,它将在每次推送到主分支时触发,并将检查我们存储库中特定目录的更改。
  3. 如果包含与管道配置相关的文件的目录发生变化,流程将启动云构建过程,该过程将克隆整个存储库,基于代码变化构建新的 Docker 映像,将新映像上传到 Google 容器注册表,并在 Vertex AI 中提交 TFX 管道。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

**图 5。**整个管道的 CI/CD。本图片转载自 P. Chansung 创作并分享的作品;P. Sayak 并根据 Apache 2.0 许可证中描述的条款使用。来源:https://cloud . Google . com/blog/topics/developers-从业者/模型-培训-cicd-system-part-i

4.如果目录中存在包含对模型代码、预处理或训练数据的改变的改变,则流程将启动云构建过程,该过程将克隆整个储存库,仅将改变的模块复制到 GCS 桶中的目录模块,并在 Vertex AI 中提交 TFX 管道,而无需构建新的 Docker 映像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图 6。 CI/CD 用于数据预处理和建模模块。本图片转载自 P. Chansung 创作并分享的作品;P. Sayak 并根据 Apache 2.0 许可证中描述的条款使用。来源:https://cloud . Google . com/blog/topics/developers-从业者/模型-培训-cicd-system-part-i

配置好管道后,任何对存储库的推送都将激活 GitHub Actions ,它将检查变更并自动运行管道,自动部署我们的模型。需要强调的是,TFX 管道将正常遵循流程,也就是说,例如,如果候选模型没有得到评估者的批准,那么该模型将不会被部署。

CI/CD 管道还有其他一些可能的改进,例如:

  • 培训数据验证
  • 不同模块的单元测试,如可接受的数据类型、预期的数据量等。
  • 测试模型输出是否不产生空值
  • 通过使用测试数据调用服务 API 来测试预测服务,以验证模型是否正常工作
  • 预生产环境的自动部署,例如,在审阅者批准变更后,代码合并触发的主分支的部署

7。结论

部署机器学习模型并将其提供给用户并不是一件容易的事情,构建模型只是第一步。部署我们的第一个机器学习模型并保持我们模型的性能,我们需要监控您的预测并提供替代方案,使我们的流程可扩展并适应变化。此外,我们保留有关管道执行的数据是很重要的,这样我们的过程是可重复的,并且纠错过程是有效的。使用支持该过程的工具对于抽象项目的复杂性是必不可少的,使其更具可伸缩性和更易于维护。

8。参考文献

[1] 云上 TFX AI 平台管道(2021 年 11 月 05 日),TensorFlow。

[2] O. Rising, 深度潜入 ML 模型在生产中使用 TensorFlow Extended (TFX)和 kube flow(2021 年 11 月 12 日),海王星博客。****

[3] 简单 TFX 管道为顶点管道(2021 年 12 月 08 日),TensorFlow。

【TFX 用户指南】(2021 年 12 月 14 日),TensorFlow。****

[5] MLOps:机器学习中的连续交付和自动化管道(2020 年 01 月 07 日),谷歌。****

[6]陈松;P. Sayak, 作为 CI/CD 系统的模型训练:第一部分(2021 年 10 月 6 日),谷歌。

[7] ML 模型监控:利用 AI 平台预测(2021 年 3 月 12 日),Google。

[8] J. Patrycja,ML 实验跟踪管理的 15 个最佳工具(2021 年 10 月 25 日),海王博客。****

我如何使用 corona lockdowns 开发我的数据科学技能

原文:https://towardsdatascience.com/how-i-developed-my-data-science-skills-using-corona-lockdowns-ad9d8d46c3bc?source=collection_archive---------32-----------------------

处于禁闭状态,并通过学习新技能来对抗新出现的无聊感?是的,我做到了。这是我在封锁期间创造的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

伊万·阿列克西奇在 Unsplash 上的照片

2020 年是艰难的一年。我从没想过我会见证一个世界性的疫情。就像我们大多数人一样。进入封闭状态,在家工作,减少工作时间,在家上学。但是如何对抗新出现的无聊感呢?

疫情创建了许多免费的数据,我决定积累我的数据科学知识。我已经实现了一些学习新工具和技术的小项目。

这篇文章是我个人尝试和学习的事情的一个简要概述。这不是关于电晕,而是关于如何在疫情期间学习新事物。

我造了一个推特机器人

我的第一个项目是创建一个 Twitter 机器人,定期发布当前数据和图表。我打算学习如何建立一个 Twitter 机器人,从公开的可用资源中收集数据,并可视化一些关于这种疾病的关键事实。

更多的细节在我写的一篇关于我如何进行的文章中给出。

我学到了什么

我学会了三件事:

  1. 如何创建一个定期发微博的推特机器人
  2. 如何收集数据并清理数据以备后用
  3. 如何可视化我的数据洞察力

Plotly 仪表板

在用 Pandas 和 MatplotLib 创建我的 Twitter 机器人时,我偶然发现了用于交互式可视化的 Plotly 。最后,我找到了 Plotly 的破折号。Dash 允许使用 Plotly 图形构建基于浏览器的仪表板。你不必摆弄 HTML、Javascript 或 CSS。Dash 使用的方法是声明性的,您完全用 Python 代码描述您的布局。我对 Dash 进行了深入研究,并由此为德国开发者杂志《Entwickler》撰写了一篇文章

我学到了什么

我学到了很多关于 Plotly 和 Dash 的东西。在我的文章中,我从两个来源收集了数据,并将它们组合起来创建了一个仪表板。至少我已经为印刷杂志发表了一篇文章!最后,我把我的知识用于我工作的公司的一个项目。

推文的情感分析

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

情感分析(按作者)

自然语言处理。我对这个话题很好奇,我决定对一些关于德国 corona 应用程序的推文进行情感分析。这款应用过去和现在都备受争议,我只是想弄清楚随着时间的推移,人们的情绪会如何变化。我已经收集了发布时、一周后和两周后的推文。最后,我用 Tableau 形象化了我的发现。

我学到了什么

我学会了如何收集大量的推文。此外,我想出了如何清理自然语言,以便能够进行分析:删除停用词,删除链接,删除标签等实体,最后对推文进行词汇化,以便能够开始情感分析。

哦,我进入了 Tableau 形象化。引领我进入下一个学习领域。

画面可视化

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一段时间的气候数据(按作者)

在为我的情感分析修改了 Tableau 之后,我决定尝试用 Tableau 做更多的分析和可视化。这次我收集了一些我在德国居住的地区的气候数据。最后,我用图片在的 Twitter 帖子上解释了我的发现。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

封锁之前、期间和之后的电晕感染(作者)

另一个使用 Tableau 的项目是一个图表可视化的愚蠢在第一次封锁后重新开放德国的学校,在封锁前有更高的感染率。

我学到了什么

最后,我进入了 Tableau。这个功能丰富的怪物比我担心的要容易学。公版免费使用,可以学习如何使用一个企业可视化工具。我了解到气候变化是可见的——可怕!

从 PDF 文件中收集数据

我居住的县以 PDF 文件的形式发布了它的电晕放电数据。易于阅读,但难以分析。此外,他们每周生成一次 PDF。我的计划是收集一些数据,以便能够创建一个时间序列分析。但是如何从 PDF 中提取表格数据呢?我发现有一个为熊猫设计的 PDF 阅读器,名为 tabula/read_pdf。我修补了 jupyterNotebook,可以读取数据。不幸的是,PDF 本身每周都在改变格式。我不得不放弃定期收集数据的计划。

我学到了什么

我又一次了解到熊猫有多强大。特别是在使用自定义阅读器时,比如 read_pdf 。而且我了解到,有些项目没有意义。

对熊猫使用复杂的 Excel 表格

谈到熊猫的阅读器,我已经深入研究了熊猫 Excel 阅读器。我的目标是将复杂的 Excel 表格中的数据放到数据框中。我发现熊猫确实有阅读 Excel 表格的超能力。我的文章详细展示了熊猫阅读 Excel 表格的超能力。

我学到了什么

熊猫很棒。不多不少。

免费提供数据和可视化

最后但同样重要的是,我再次找到了一些为我的国家提供数据的来源。我已经开始每天收集数据。利用这些数据,我用 Datawrapper 创建了一个可视化,这是一个的基于 web 的数据可视化工具。最好的:它有一个免费层。在 Twitter 上发表我的见解时,人们问我是否愿意分享我收集的数据。对一个好位置的简短搜索把我带到了Qri——一种类似 GitHub 的服务,只提供数据。厉害!我在一篇文章中总结了这一点:

我学到了什么

我再次学会了如何定期收集数据。我还学会了如何使用现有的工具和服务来完成特定的任务。Datawrapper 非常棒,被报纸和在线杂志广泛使用。有了 Qri,每个人都可以以开源的方式共享数据集。你不需要自己实现所有的东西。看看并使用已经存在的工具。

(我的)结论

2020 年和 2021 年初是狂野的。但是利用这些环境来促进你的个人成长是相对容易的。新冠肺炎产生了大量的免费数据来玩。当然,还有其他可用的数据源。接受它,保持好奇心,给自己设定挑战。充分利用它,训练自己,尝试新的工具,也许可以走出你的舒适区。没有什么比对某事没有好处更糟糕的了!我学到了很多伟大的东西。这也分散了我们对目前复杂局势的注意力。就我个人而言,我学习了许多新工具和技术,进行了大量实践,并提高了一些数据科学技能。

我如何让工资翻倍:3 年内从数据分析师变成数据科学家(英国)

原文:https://towardsdatascience.com/how-i-doubled-my-salary-data-analyst-to-data-scientist-in-3-years-uk-94b610067fb3?source=collection_archive---------1-----------------------

我的数据科学之旅的开始。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Unsplash 上的 Mantas Hesthaven 拍摄

介绍

当我得到第一份分析师的工作时,我不知道我最终会从事数据科学这一行。

那是不久前的事了。回到 2016 年,我毕业时对自己的人生想做什么毫无头绪。我终于拿到了数学学位,我知道我需要找份工作。

所以我最终申请了分析师的职位,因为大多数数学毕业生都是这么做的。在我获得第一份分析师工作后不久,我决定转行到数据科学领域。

像任何职业改变一样,这对我来说是一个相当重大的决定。我知道数据科学有更高的门槛,我不确定它是否行得通。当时事情看起来很吓人。

对我来说幸运的是(剧透一下),它最终还是成功了。当时,我花了大量时间在网上寻找有从分析师转型为数据科学家经验的人。

令我失望的是,我记得在英国没有发现多少人有这样的经历;许多在线数据科学信息往往感觉更以用户为中心。

这就是为什么我要分享我作为一名数据科学家在英国生活和工作的经历。这是一个帖子,当我想改变我的职业生涯时,我会很感激。

每个人的经历都不一样,所以很难说我的经历是否有用。但希望它能给你一些方向,如果它至少有一点相关的话。

除了阅读这篇文章,你还可以看看我在 YouTube 上关于这个话题的视频。

背景

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Susan Q Yin 在 Unsplash 上拍摄的照片

正如我已经简单提到的,我在 2016 年获得了数学学位。我学到的大部分内容感觉都很理论化,不太实用。我也没觉得特别过瘾。

尽管如此,这对我的数据科学职业生涯无疑是有益的。不管我在课程中学到了什么,雇主们都知道数学学位——本质上是一门分析学科——在分析工作中会很有用。

但是回过头来看,我需要获得数学学士学位才能有今天的成就吗?我个人不这么认为。如果我不得不重新选择我的本科课程,我可能会选择计算机科学和数学的联合学位。我会试着选择一些更实际的东西,只要有足够的理论来知道我在做什么。

数据科学是一个非常广阔的领域。任何表明你有分析头脑的学位或经历才是最重要的。在有机会之前,你可能需要接受一定程度的正规教育,但要成为数据科学家,你并不需要某个特定学科的学位。所以,如果你正在读这篇文章,并且因为你的背景而觉得为时已晚,我会说那不是真的。

我的建议是专注于用独特的方式运用你的背景来解决复杂的问题。我能想起一些我和不同背景的人一起从事数据科学项目的例子。心理学,化学,物理等等的人。这种多样性往往是利大于弊。

第一项分析工作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上的新数据服务拍摄

我在 2017 年 2 月获得了我的第一份毕业生工作,是一名分析师。那是一家发薪日贷款公司的初级职位。

当我申请的时候,我有兴趣或者知道什么是发薪日贷款吗?没有。我缺乏研究在面试中相当明显,我甚至迟到了 30 分钟,因为我找不到停车位。

只能说我非常幸运地得到了一份工作。

我在那里工作了一年半左右,大部分时间都在学习 SQL 和 Tableau。几乎总是相同的任务:使用 SQL 将数据转换成正确的格式,然后使用这些数据创建一个漂亮的 Tableau 仪表板。

一旦我在这些任务上变得足够优秀,我就会感到厌倦。我加入发薪日贷款公司也不是因为我对这个行业充满热情。和大多数毕业生的工作一样,工资也不是特别高。

现实打击了我,我意识到我想要更好的东西。除非我做点什么,否则什么都不会改变,所以我开始寻找其他职业选择。

就在那时,我遇到了数据科学:一个结合了数学、计算机科学和商业的领域。以我的数学背景以及对计算机科学和人工智能的兴趣,这听起来非常合适。

在对典型的数据科学家要求进行更多研究后,我变得气馁了。我看到的招聘广告通常要求硕士学位,并具备使用各种工具的经验。

我不知道如何进行机器学习,也对计算机科学概念知之甚少;我只有一个相当一般的数学学位和不到两年的分析师经验。

我认为有几个选择可以让我进入数据科学领域:

  • 继续做分析师(在同一家或另一家公司),直到我有足够的经验申请数据科学家的职位。这很可能需要几年时间。
  • 继续在同一家公司工作,希望他们能为我创造一个数据科学家的职位。这可能是最糟糕的选择,因为它完全超出了我自己的控制。
  • 辞去分析师的工作,攻读数据科学硕士学位,把学习时间压缩到一年。

您可能已经猜到了,我最后选择了攻读数据科学硕士学位。这使我们进入下一部分。

攻读数据科学硕士学位

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上的 Matese Fields 拍摄

2018 年 7 月,我辞职去利兹大学读数据科学硕士。如果你想看看我在课程中做了什么,我已经有一个关于这个的视频。我还有一篇深入的博客文章,也有更详细的内容(申请流程、模块等)。).

尽管硕士学费为 9000 英镑(有校友折扣),我还是想压缩学习时间,在一年内尽可能多地学习我真正喜欢的科目。我知道我是那种在有严格期限的游戏中做得更好的人。

另一个原因,如果我完全诚实的话,是为了我自己的自尊。对我来说,这是一个很好的机会来弥补我相当普通的本科学位。就这一次,我想向自己证明我可以在学术界做得很好。

现在,这些年来我注意到的一件事是,如果他们的原始背景与数据科学完全无关,那么很多人都会攻读数据科学硕士学位。就个人而言,事实并非如此:我想利用我的数学背景,更快地进入数据科学领域。

攻读硕士学位是迄今为止我为自己的职业生涯所做的最好的事情。它帮助我获得了我的第一份数据科学家工作,如果没有它,我想我今天不会在这里(或者至少我认为它会花费我更多的时间)。

但我确实想知道——我这么说是因为我已经在硕士学位上投入了大量的时间和金钱吗?这是一个我时常问自己的问题,但现在,我不认为是这样。

第一份数据科学家工作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

卢卡斯·布拉塞克在 Unsplash 上的照片

2019 年 12 月正式毕业,数据科学硕士。众所周知,那是疫情正式开始前的几个月。

直到 2020 年 8 月,我才找到了第一份数据科学家的工作。由于疫情,发生了很多我无法控制的事情。在停工期间,我会在找工作、做项目和学习证书之间交替。

在我参加的所有面试中,面试官经常问我的背景。一段时间以来,我第一次终于感觉到,由于我的硕士学位和分析师经验,我在申请时有了一个不错的机会。

他们还问了我在硕士期间和之后做的项目。面试官通常会想知道我在停工期间在做什么,我认为这只是为了检查我在那段时间里是否让自己保持忙碌。

我尽最大努力确保面试时总有话题可谈,以使自己与其他求职者区分开来。封锁和由此产生的空闲时间实际上非常有用,让我改进了我觉得自己欠缺的地方;尽管情况很糟糕,我还是想充分利用它。

如果你感兴趣,你可以看看这个视频,在这里我分享了一些让你获得第一份数据科学家工作的技巧。

结论

凭借一些运气和连贯性,我花了 3 年时间从最初的分析师变成了数据科学家。总而言之:

  • 2017 年—第一份数据分析师工作
  • 2018 —开始数据科学硕士
  • 2020 年—第一份数据科学家工作

我这么说可能有偏见,但我认为如果我不读硕士,我会花更长的时间。我需要硕士学位才能得到数据科学家的工作吗?最后值不值?这些很难回答,但是我已经有了关于这个话题的视频和博客。

话虽如此,请对我的经历有所保留。会有生存偏差,因为那些和我有相似背景的人并没有都成为数据科学家(不管出于什么原因)。

我希望我的经历能对数据科学之旅有所启发,尤其是在英国。正如我在开始时所说的,当我第一次开始成为一名数据科学家的旅程时,我会很欣赏这一点。

如果你喜欢这篇文章,你可以看看我在 YouTube 上的其他视频。如果你想通过电子邮件了解我在做什么,你可以考虑注册我的简讯🙂

原载于 2021 年 12 月 30 日 https://leonlok.co.ukhttps://leonlok.co.uk/blog/how-i-doubled-my-salary-data-analyst-to-data-scientist-in-3-years-uk/

从编码训练营到编码工作

原文:https://towardsdatascience.com/how-i-found-a-coding-job-after-attending-a-coding-bootcamp-b22b05615742?source=collection_archive---------37-----------------------

我毕业后的旅程——不像你想的那么简单

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上由 Austin Distel 拍摄的照片

当我从一个编码训练营毕业时,我被大量的情感和想法淹没了。成就感、决心、紧张和疑问涌入我的脑海。我做到了,下一步是什么?我该何去何从?以及当一个人进入生活的下一个篇章时,他通常会有的想法。但有一个问题始终存在:

我如何找到一份工作?

我是何时何地毕业的?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由马格纳斯·奥尔森Unsplash 上拍摄

首先,我参加了一个名为纽约熨斗学校的编码训练营。我选择的课程是数据科学。为了保持简洁,我选择了数据科学,因为使用机器学习的吸引力和我的 Python 背景。

经过 15 周的机器学习、统计学、Python 编程、数据分析的学习,我于 2019 年 10 月毕业。从 numpy 这样相对基础的数据科学库到 TensorFlow 这样更复杂的库,我学到了很多东西。

毕业后

毕业后,熨斗学校帮助我,为我提供了自己的求职指导和大量在线工作资源。这些资源从帮助我构建一份好看的简历到与其他技术专业人士建立关系网。

这段时间我学到的一件重要的事情是,找工作本身是一项非常有价值的技能,但却经常被忽视。这方面的一个例子是,没有多少人知道为每个职位量身定制简历和求职信。就我个人而言,我对此一无所知,因为我以前会给每一位潜在雇主发送同样的通用简历和求职信。然而,我并不是仅仅因为我的简历或求职信而找到现在的工作的。

在这里注册一个中级会员,可以无限制地访问和支持像我这样的内容!在你的支持下,我赚了一小部分会费。谢谢!

求职过程

我从熨斗学校毕业后就开始了我的求职之旅。我接受了一些采访,打了一些电话,但没有什么真正成功的。我将我的项目添加到我的 Github 个人资料和简历中。我申请了 LinkedIn 上的许多招聘信息,并联系了许多在我想去的公司工作的数据科学家,希望能得到推荐。我和许多人有过一些很棒的对话(甚至一些尴尬的对话),我至今还记得。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·温克勒在 Unsplash 上的照片

一切进展得比我预期的要慢得多,因为我期望在毕业后的 6 个月内得到一份工作。在这 6 个月里,我的同学开始收到他们的那份工作邀请。被抛在后面的感觉开始向我袭来。因为一些我应该知道的问题和答案,我甚至错过了几次工作面试。

继续前进

即使在那些缓慢的时期,我也继续从事新的项目和文章。让我的数据科学和编程技能保持敏锐的任何事情。我记录了我所有的联系人,以及我应该何时与他们联系。我承认,我惹恼了相当一部分经理和招聘人员,只是为了能得到他们的回应。

没有什么是真正起飞。但是,我的文章和他们各自的项目开始受到一些关注…

写文章

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由丹参赞Unsplash 上拍摄

我在熨斗学校期间的要求之一是每隔一周写一篇文章。在当时,这似乎是非常压倒性的。我应该如何平衡课程、项目和现在的写作?我当时并不知道,但我会开始喜欢写作。

毕业后和找工作期间,我仍被要求发表文章,但这次是每周。这都是学校退款保证计划的一部分。这令人生畏,但却是可行的。

文章和项目

当我写我的每周文章时,我开始创建与它们相关的配套项目。这将允许我学习和实践我的数据科学技能,以及写我的文章。(请随意查看下面我的第一个配套作品):

https://medium.com/swlh/teaching-a-machine-to-trade-stocks-like-warren-buffett-part-i-445849b208c6

与我的文章联网

我的文章越来越受关注。我开始在 LinkedIn 上收到陌生人的消息。这些信息从一般的赞赏和联系请求到项目合作机会不等。

我开始意识到我的文章正在慢慢变成被动的求职申请。我开始意识到,在求职过程中,这些文章将成为我最大的资产。考虑到这一点,我开始在我的简历、求职信和 LinkedIn 上的社交信息中展示我的文章。

带文章链接的消息传递

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

布雷特·乔丹在 Unsplash 上的照片

我仍在申请许多工作。然而,我尝试了一种不同的方法。我会申请,然后给公司的招聘人员或经理发信息。在这些信息中,我会链接到我的一篇文章,并解释为什么他们应该检查它们。希望这些文章能展示我的技能,并说明为什么我非常适合他们的公司。

大多数时候,这些信息没有得到回应。但其他时候,我会得到热情的回应。我不完全确定链接我的文章是否提高了回复率,但我相信它帮助我脱颖而出。

从文章到工作面试

有一次,我联系上了一家中小型公司的数据科学总监。我发给他的网络邮件中包含了一个我的一篇文章的链接。(如果你感兴趣,可以看到我链接的文章):

他急切地回复了我的电子邮件,邀请我和他视频聊天。视频聊天结束后,我被邀请到他们公司大楼进行正式面试。在那里,我经历了两个多小时的面试过程。这并不像我预期的那么可怕,我随后被邀请参加另一场面试。

接下来的采访结束后,我欣喜若狂!我以为我一定会得到这份工作。但不幸的是,情况并非如此。一周后,我接到他们的电话,告诉我我没有得到那个职位。(另一方面,Covid 在这次采访后一个月左右来到纽约,我可能已经被解雇了)。

我从未被告知为什么我没有得到那份工作,但这是意料之中的。在求职过程中,你很少会收到关于你为什么没有得到这份工作的回应。

走向

然而,这并没有阻止我继续寻找我文章的链接。我仍然坚持我的网络信息。我能够与阅读我文章的人联系,他们也有兴趣为我提供自由职业的机会。

给自由数据科学家写文章

当我继续写文章时,我头脑风暴了一个数据科学项目,它将利用 ML 聚类和推荐系统。我觉得我没有对这些概念和技能进行足够的实践。所以,我决定写一系列与他们相关的文章。

我想为这个项目和系列做的是用机器学习创建一个约会算法。(有兴趣可以在下面了解一下):

自由职业者和合作

事实证明,很多人觉得我的文章非常有趣。直到今天,我仍然收到关于我的约会算法文章的消息。一个人向我提供了一个自由职业的职位。在这个职位上,我终于能够利用我的数据科学技能。这是一个几乎没有监督的独立职位。我仍然设法度过难关,并学习了一些更重要的数据科学工具。

当自由职业者时,我为我所做的工作建立了某种程度上稳定的金钱回报。如果我在一家大公司工作,我挣的钱不会那么多,但这也算是一件好事。在此期间,我还在申请和寻找长期的工作。

自由职业暂时很棒,但与在公司里有一个固定的角色相比,它太不确定了。

工作邀请

过了一段时间,我收到了一条来自某人的消息,他已经阅读了我的约会算法文章。他想和我谈谈他和他的商业伙伴关于我的约会算法文章的想法。

他和我来回打了很多电话,以充分确定他需要我做什么。我问了许多关于这个想法和公司的问题。你对我的期望是什么?我会得到多少报酬?我将和谁一起工作?这个需要什么时候做?他迅速回答了每个问题。

我试图确定这不仅仅是一个普通的自由职业机会。他向我保证,在公司做了 3 个月的自由职业者后,我会收到一份正式的工作邀请。我并不完全自信,但我有什么损失呢?充其量,我会为他们做自由职业者,并得到一份正式的长期聘用。在最坏的情况下,我得到 3 个月的带薪经验。所以我决定放手一搏。

现在的工作

写这篇文章的时候,我已经在这家公司工作了 10 个月了。事实上,三个月后我收到了一封正式的工作邀请信。收到的时候,终于从求职过程中走出来,进入编程领域,我很欣慰,也很兴奋。在通过 Covid、网络信息和工作申请寻找工作一年后,我终于做到了!

这个过程可能比预期的要长,但仍然是一次成长和学习的经历。我唯一的遗憾是,即使收到了工作邀请,我也应该继续写作。现在我正试着重新投入其中。我从来不知道我的文章最终会帮我找到工作!

我如何让我的文章出现在 TDS 上

原文:https://towardsdatascience.com/how-i-got-my-articles-featured-on-tds-1606ed7966e6?source=collection_archive---------26-----------------------

如果你感兴趣的话,以下是对我有效的方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Unsplash 上的思想目录

我在 Medium 上写文章已经一年半了,对我来说这是一段非常有趣的旅程。我在 LinkedIn 上收到关于我如何发表关于数据科学的文章以及我如何获得追随者的问题。以下是对我有效的策略总结:

写作是为了帮助他人理解/清晰地写作

对我来说,这是技术写作最重要的目标。大多数关于 TDS 的文章本质上都是技术性的,所以帮助你的读者理解你的观点是关键。

如果我的受众是数据科学初学者,我会分解技术概念,甚至使用隐喻。我解释所有的缩写,我有时制作定制的视觉效果,我保持段落简短,等等。例如,查看我写的一篇关于数据科学初学者的文章:

如果我的文章更适合在数据领域有经验的人,我仍然喜欢清晰透彻地解释技术和方法。你不需要证明你聪明或者有经验——只要写得像你试图帮助学生理解你的想法就行了(不需要过于复杂的语言)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Unsplash 上的absolute vision拍摄

写一个你了解的主题(或者引用你的资料来源)

这是不言自明的,但是让我继续解释一下:如果你必须为你的文章做研究,引用你的资料来源。如果你不做研究,确保你知道你在说什么。如果你走的是第二条路,拥有相关的职称、大学专业或过去的经验有助于建立你的可信度。

写一篇独特的文章

我开始在媒体上阅读数据科学文章。我发现他们通常有助于故障排除,向更有经验的数据科学专业人士或教师学习也很棒。然而,我觉得没有太多的内容充满了技术概念,但面向初学者。所以我从那里开始。

我喜欢认为我在 TDS 上发表的文章是独一无二的。为了被接受,他们至少要有足够的独创性*。我的阅读量最高的文章都有不同的突出标题*。以下是我根据浏览量和掌声数得出的最受欢迎的一个:*

*

*免责声明:你希望你的标题突出而不被点击诱饵。

我也喜欢写一些我希望几个月前就能读到的东西。然后,我根据经验写作来填补我看到的一些内容空白。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

艾蒂安·吉拉尔代Unsplash 上的照片

为乐趣而写作&带着激情

我把最好的留到了最后——为个人享受而写作!

我觉得我最好的文章是那些自己写出来的,因为我对它们感到兴奋,或者文字是从我的经历中流出的。如果你按照严格的时间表写作,并且已经没有文章的思路了,或者试图强迫自己写作,那么你的写作质量很可能会下降。同样,发表一篇你喜欢写并引以为豪的文章也是值得的。然后,如果碰巧没人看到它——我认为这不太可能——对你来说就没那么重要了。

有趣的事实:对我来说最容易或最有趣的文章是 TDS 决定在他们的社交媒体平台上发布的文章。*

有什么数据科学写作小技巧吗?欢迎在评论中留下它们。祝每个人在写作生涯中好运!

当然,如果你想知道如何在 TDS 上发表文章的最真实的来源,请直接访问他们的指导方针:

* [## 为迈向数据科学而写作

towardsdatascience.com](/questions-96667b06af5)*

作为一名数据科学家,我如何成长

原文:https://towardsdatascience.com/how-i-grow-as-a-data-scientist-62027b7cc069?source=collection_archive---------14-----------------------

科技职业

适合我的可能也适合你

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

陈虎Unsplash 上拍照

我的数据故事

有人曾经告诉我,我有一条通向数据科学的有趣职业道路。

是的,我的教育背景是软硬科学的结合。我几乎所有的本科、硕士和博士学位都是社会科学。声明一下,我确实有统计学硕士学位,这是后话。

我如何成为一名数据科学家?

说来话长,我就把它分解成几个片段。

从今天开始,我将开设一个名为“ 科技职业 ”的新博客系列它以职业成长、有效沟通和其他“啊哈”时刻的故事为特色,为现有的更多技术序列添加了个人色彩,如“</why-data-scientists-should-learn-dynamic-programming-e50dfe62a5c7?sk=2f50d13ab53a4984153e4ccda8870bb1>实验和因果推理破解数据科学面试 “要浏览现有的博客文章,请参考这个欢迎页面

再说一遍,“ 科技职业 ”系列不再讨论技术,而是关注我作为一名数据专家的奋斗和个人成长。这是我的承诺:我会在 NDA 允许的范围内提供尽可能多的细节,并分享这一过程中的每一个教训,无论是好是坏,不会粉饰任何东西。

让我的教训成为你的经验;

所以你不必重复错误。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

UnsplashKea Mowat 拍摄的照片

为什么你应该关心

数据科学和其他任何技术一样,有很高的门槛。候选人接受多年的正规教育,并在迈出第一步之前通过多轮技术和行为面试。

如果你已经做到了,恭喜你,但是你必须保持下去,继续成长。

原因如下。

像任何其他行业一样,数据科学也在不断发展,充满活力,瞬息万变。今天让你得到工作的技能可能明天就过时了。当然是一种表达方式。我敢肯定,更换劳动力需要的时间不仅仅是一天。

例如,我是一名在实验平台上工作的推理数据科学家。几年前,从常客的角度来看,占主导地位的分析框架是典型的 A/B 测试设置。快进到今天的就业市场:研究人员已经采用了一个新的框架,称为多臂土匪,贝叶斯方法。

如果你没有注意到,这是一个范式的转变!

事物变化如此之快,终身学习既是目标也是应对形势的策略。

踏入未知的领域可能是可怕的。我希望当我开始走这条路的时候,有人能站在我这边。当你情绪低落时,有人支持你,这对成功非常重要。我们需要的只是一些提示,剩下的我们会解决的。这就是我为什么开始这个系列的驱动力。我会尽我所能在整个过程中握住你的手,帮助你找出任何差距,一起成长。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由阿曼达·弗兰克Unsplash 上拍摄

数据科学 101:我如何成长为一名数据科学家

作为该系列的第一篇文章,我将分享在这个过程中对我帮助很大的四个通用技巧。这些技巧很容易复制,而且非常有效。在以后的帖子中,我将分享更多作为技术圈内人士的生活故事和职业发展。

秘诀 1:把阅读当成呼吸

  • 你每天的阅读量是多少?
  • 读数=呼吸
  • 休息一会儿,尽快回来阅读

大约 3 年前,我还没有决定毕业后想做什么。鉴于我的教育背景,做一些与数据分析相关的工作似乎很合适。嗯,这是一个比较宽泛的方向,我还要缩小范围。数据分析可能意味着定量分析师、定量 UX 研究员(老实说,UXR 曾经是我的方向)、统计顾问、数据分析师,当然还有数据科学家。

在与人们接触并进行信息采访后,我转向了数据科学。即使之前没有接触过,我也能通过问以下三个问题快速建立起对行业的整体看法:

  1. DS 领域有多少角色?
  2. 每个角色都需要哪些技能?
  3. 领先的公司(如微软、网飞、优步等)是如何做到的。)做到?

前两个问题主要是关于外面有什么可用的和我需要获得什么新技能。最后一个问题旨在找到该领域的最高标准。

通过广泛的阅读和研究,以下是我的发现和思考过程。数据科学中有三类角色: 算法,分析 ,推理。鉴于我在社会科学(因果推理为主)和统计学方面的混合背景,推理轨道似乎是最有前途的选择。当时我有大多数首选的需求,但不是一个伟大的 SQL 和 Python 程序员。**

缩小具体的数据轨迹后,事情就变得更清晰简单了。剩下的问题是了解领先的公司是如何做到的。当我深入研究这个领域时,事情变得有趣了。几乎所有的推理数据科学职位都要求有 A/B 测试的经验。顶级公司(如网飞和微软)甚至更进一步,拥有自己的内部实验平台。

我在这里看到了一个机会,这最终让我在一家大型科技公司获得了一份工作——关于这一点,我将在以后的博客中详细介绍。

通过阅读,我能够理解其他人如何应用这种方法,并理解他们如何做出权衡。即使以前没有接触过,我们也能很快建立起知识全息,并据此创建路线图。

经过大量阅读,我对主要科技公司的数据方法非常熟悉。我可以告诉你微软是如何处理这个问题的,网飞是如何做的,以及为什么他们对同一个问题选择不同的方法。

所以,将阅读融入你的日常生活。如果有人引起你的兴趣,请联系作者。如果你累了,就休息一下,然后尽快回来阅读。

邻近学习

  • 编程
  • 数据工程

如上所述,数据科学家必须兼顾多项任务,并履行许多跨学科义务。作为一名数据科学家,我需要经常与数据工程师和产品经理这两个角色打交道。

项目经理将业务需求带到桌面上,数据工程师用代码执行统计方法。数据科学家、数据工程师和产品经理这三个角色一起工作,在产品生命周期中扮演不同的角色。

想象一下:

如果一个数据人员可以穿上工程师(或项目经理)的鞋子,难道不会让你成为一个更好的数据科学家吗?

这种方法被称为邻近学习**:发展与你的角色相关的额外技能。它让你成为一个更有能力、更全面的思考者。**

老实说,相邻学习要求很高。我还在想办法。就我个人而言,我的长期目标是更好地编程,并了解更多关于数据管道的工程和基础设施前沿的知识,这是一个正在进行的项目。

下面是模型部署中的一个典型场景:

有一个很棒的机器学习模型,在小数据集上表现很好;

但是,它没有伸缩性。

如果一个所谓的全栈数据人,懂数据两端,我们也许能聪明地解决问题。

你的相邻学习策略是什么?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

斯蒂芬·莱昂纳迪Unsplash 上拍摄的照片

熟能生巧

  • 弄脏你的手

勤奋是不可替代的,如果你想进入数据科学领域,你应该弄脏你的手。中国有句名言:

纸上得来终觉浅,绝知此事要躬行.

直译是这样的:在纸上获得的知识总是感觉肤浅,你必须付诸实践才能完全理解它。

以下是我的两点看法:读书只能告诉你理论的这么多,但永远不会教你“如何做”做和知道的差距很大。

几乎我所有的技术朋友都同意这一观点:采取亲身实践的方法是高效和有效的。如果你想学习一种新的机器学习,最好的方法是在生产环境中部署。

浏览课本时,你不必担心细小的事情;边做边学才是正道。

成为社区的一部分

  • 助人为乐;帮助你
  • 教学是最好的学习方式

我收到的最好的建议是:成为社区的一部分。一旦你对某件事有了足够的了解,你就可以快速建立一个社区。直到很久以后,我才意识到它有多重要。

有人在你身边,给你建议,帮助你度过人生的低谷。相信我,不管你有多自信,被拒绝后又被拒绝可能是一次令人沮丧的经历,会导致自我怀疑。

成为社区的一员让你可以在需要的时候寻求帮助。每个人都在经历人生的高潮和低谷,这很正常。所以,让你的社区成为你的资产。

一旦踏入这个领域,记得要还回去,做别人的资产。

另一个很好的教训是教导和指导那些资历较浅的人。例如,关于某个选定主题的完整教程可以帮助你更好地理解这个概念,而 LinkedIn 上的一篇简短帖子可以让事情变得更有趣:如何向非技术人员讲授数据科学?

你必须很好地理解它才能做到这一点。

如果不能简单的解释,说明你理解的不够好。

阿尔伯特·爱因斯坦

Medium 最近进化出了自己的 作家伙伴计划 ,支持像我这样的普通作家。如果你还不是订户,通过下面的链接注册,我会收到一部分会员费。

**https://leihua-ye.medium.com/membership **

外卖食品

  • 读书如呼吸
  • 相邻学习
  • 熟能生巧
  • 成为社区的一部分

喜欢读这本书吗?

请在 LinkedIn和 Youtube 上找到我。

还有,看看我其他关于人工智能和机器学习的帖子。

我如何帮助一家风投公司自动监控其投资组合的表现

原文:https://towardsdatascience.com/how-i-helped-a-vc-automate-its-portfolio-performance-monitoring-a812189de3e2?source=collection_archive---------29-----------------------

行业笔记

通过使用 Google stacks 建立一个轻量级 ELT 项目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

马库斯·斯皮斯克Unsplash 上拍摄的照片

除了我的工作之外,我从事的一个有趣的兼职项目是帮助我目前雇主的一位投资者自动监控其投资组合公司的业绩。

数据、自动化、性能监控——在“数据是新的石油”成为新口号、市场上有大量数据集成平台供应商可供选择的世界里,这些工作听起来应该很简单。然而,对于这样一个特殊的用例来说,这些解决方案可能太多了。我们这里并没有真正的大数据,数据延迟也不是我们最关心的问题。

我们面临的真正挑战是减少我们每年定期从 30 多家投资公司收到的 200 多份 Excel 表格的编译、清理和分析过程中的人工劳动,同时确保一致性和准确性。我们的最终用户也不是很懂数据,所以我们选择的工具不应该有陡峭的学习曲线。我们也没有任何工程能力来建设和管理复杂的数据管道。因此,我们在这里寻找的是一个真正轻量级的 ELT 解决方案(提取、加载和转换),具有仪表板功能。幸运的是,我们的投资者已经使用 G-suite 作为他们的办公平台,谷歌也提供了广泛的分析服务供选择。通过一些创意,我们和我的投资者一起设计了一个工作流程,如下所示:

  1. 我们邀请投资组合公司通过填写一份精心设计的标准化谷歌表格来分享他们的月度关键业绩数据——这是“E”部分。
  2. 将 Google Form 连接到 Google sheet,这样答案将被自动编译成性能数据集——这是“L”部分。
  3. 创建一些辅助数据集来收集我们可以与绩效数据集关联的其他静态事实,以便我们在进一步的分析中有更多有趣的维度(例如,公司总部、融资状态、投资年份等)来进行切分。
  4. 将数据集作为数据源添加到 Data Studio,连接这些数据集,创建计算字段和指标,并最终构建自动化的交互式仪表板来推动我们的决策制定,这是“T”部分。

结果呢?此后,投资者采用这种解决方案来监控他们的投资组合表现。你猜怎么着?在他们最近发布的员工招聘信息中,他们提出了一个要求:“最好有:你有一些现代商业智能解决方案的经验(例如,Google Data Studio、Tableau、Power BI)”。😉

这绝对不是一个大数据故事。它不涉及任何现代的数据堆栈,如雪花和红移。它也不是要开发一个先进的机器学习模型来解决一个非常复杂的现实生活问题。然而,这个项目对我来说意义重大,因为它揭示了除了大型、先进的技术项目之外,还有许多可能的方式来从数据中创造价值。在我看来,这一小步实际上可以为那些不像我一样精通数据的人创造巨大的商业价值,并激励他们在自己的组织中建立强大的数据文化。

如果你感兴趣,你可以在下面找到一个模板管道,我用一些假的数字设置的。如果你有一个谷歌账户,你可以把这个文件夹和谷歌数据工作室的报告复制到你自己的谷歌硬盘上,然后开始摆弄它。我还分享了一些有用的技巧。

以下是模板的链接。玩得开心!

设计一个谷歌表单来收集你的数据。

我喜欢谷歌表单的三点:

  • 填写谷歌表单不一定需要谷歌账户。
  • 您可以为每个问题设置数据验证规则,这样您就不必花费时间来手动检查拼写错误、数字等。
  • 你可以将一个谷歌表单连接到一个谷歌表单,答案会自动流向那个表单。

请记住,谷歌表单中的每个问题都将作为一列进入谷歌表单。因此,确保你以一种聪明的方式设计你的问题!

如果您想要在 Google 表单中添加/更改问题,这可能会有点乏味,这会导致目标 Google 表单中出现重复或不匹配的列。因此,我建议在与您的投资组合公司分享之前,尽可能地测试和改进您的 Google 表单!

最后提醒:尽量不要在目标 Google 工作表中做任何修改,例如,根据日期创建一个月列,或者链接到另一个工作表以获得一个新列。这些转换都可以在 Google Data Studio 中以一种更简单、更简洁的方式集中完成。将所有转换保存在一个中心位置的优势是显而易见的:我们不必去多个地方检查和更改维度和度量定义。

这是我们每月性能监控信息表中的问题列表:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月度投资组合绩效监控(第 1 部分)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

月度投资组合绩效监控(第二部分)

目标 Google 工作表看起来是这样的:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

我在我的模板中选择了这些问题,因为我们可以推导出大多数 KPI,这些 KPI 可以用于评估所有行业的初创公司的表现。一些例子是:

  • 客户获取:新客户数量(和同比增长)
  • 留存率= 100%-#流失客户总数/#新客户总数
  • 财务:可变成本(收入-毛利润),固定成本(毛利润-EBITDA),利润率(毛利润/收入)
  • 单位经济学:CLV/CAC
  • 运营效率:每个 FTE 的客户总数,每个 FTE 的成本

为最终报告中的更多维度创建一些辅助数据集。

这些辅助数据集应该是静态事实——不会经常变化或增长的东西。

在我的例子中,有一份公司情况说明书,如下所示:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

通过公共列“公司名称”,我们可以将该事实表与月度业绩数据表相结合,并使用其他维度,如简称、国家、基金群组和融资状态,作为 Data Studio 报告中的过滤和分组列。另外,请记住从两个表中选择您想要使用的所有维度和指标,以便它们显示在最终的混合表中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

例如,我们可以将这些过滤器添加到仪表板的每个部分,并将它们应用到一个仪表板上的所有图表。我们还可以了解每个国家和地区的投资组合公司概况。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

在 Data Studio 上创建自动化的交互式仪表板。

有很多有用的教程教你如何从 Google Sheets 在 Data Studio 上创建报告,我会一直向推荐这个来自 Google 的在线课程。

在这里,我只分享一个我发现对我的项目非常有帮助的技巧:**记得在你的数据源中设置一个“数据范围”列,并在图表中使用它来过滤日期范围。**通常应该是报告月的开始日期)。这在我们的案例中非常重要,因为在目标 Google 工作表中,我们有一个 KPI 的“上个报告月”列和“YTM 累计”列,我们总是必须基于这些列创建指标(例如,SUM(收入(LRM),SUM(收入(YTM))来构建图表。我们必须确保筛选上个月的数据,这样我们就不会显示所有月收入的总和,而实际上我们只想显示上个报告月的收入。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

作者图片

当谈到如何构建直观和易于理解的仪表板时,我应用了我在以前的帖子我如何创建分析师风格指南中分享的许多原则。请随意检查!

如果你正面临类似的挑战,并且正在寻找一个轻量级、无代码的 BI 解决方案,我希望这篇文章能给你一些启发。

欢迎任何想法和问题!

我如何用 Python 实现算法:规划图

原文:https://towardsdatascience.com/how-i-implemented-algorithm-in-python-planning-graph-f3ac98351add?source=collection_archive---------9-----------------------

一步一步的算法实现:从伪代码和方程到 Python 代码。本文将实现规划图及其规划器 Python 中的 GraphPlanner,AI 规划的数据结构和搜索算法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Python 中的规划图实现(图片由作者提供)

介绍

规划图的开发是为了解决传统人工智能规划方法中发现的复杂性问题,也称为条状规划器。我们需要实现两个主要部分:

  • 计划图:数据结构,以及
  • 图形规划器:为我们找到解决方案的搜索算法

如果你不熟悉规划图,想了解更多,请查看我下面的帖子:

领域和问题表示

在我们开始实现之前,我们需要知道我们将如何表示这个方法的规划领域和规划问题。

规划图及其规划器使用许多条状规划器中使用的相同表示法,因此我们将使用 PDDL ( 规划域定义语言)来表示它们。这里有一个 PDDL 域文件的例子。

PDDL 的规划领域表述(作者代码)

我们可以把 PDDL 想象成类似 JSON 或 XML 的东西,这意味着我们需要一个解析器来反序列化其中的表示。当我在 Github 上搜索时,出现了几个,但有一个似乎很适合我们的项目,即 pddlpy

https://github.com/hfoffani/pddl-lib

然而,它在开发中不再活跃,我在其中发现了一个 bug 和一些问题。因此,我决定使用它并编写一个适配器/包装器,这是一个很薄的层,我们添加它来修复 bug 并解决其他问题。

PDDL 适配器

对于我们的代表,我们需要以下内容:

  • 世界初始状态:数据类型为 set()
  • 目标状态:数据类型为 set()
  • 用实变量实例化的基本运算符(也称为操作)列表:数据类型为 列表【运算符】

我们将只使用来自 pddlpy 库中的一个接口,即 DomainProblem() 类构造函数。

我们需要提供上面列出的三个接口,初始状态、目标状态和地面操作员列表。

我们创建了一个名为规划问题的类:

规划问题类(由作者编写代码)

库提供的状态不是我们想要的正确数据类型,所以我们需要将它们转换成一组元组。我们使用 set() 数据类型,以便于我们以后实现数据结构和算法。因为在经典的 AI 规划中,我们大量使用集合论,我们应该使用 set() 数据类型来利用内置函数来加快我们的实现。我们将在下一节看到更多内容。

我们还必须创建一个我们称之为行动的地面操作员列表。这是适配器的最终代码。

PDDL 适配器模块(由作者编码)

我们现在可以将这个类用于我们的规划领域和规划问题,并将我们的注意力转向数据结构和算法实现。

规划图:数据结构

我们在这里只看伪代码和方程,重点是如何将它们翻译成代码,要理解这个概念,请阅读简介部分的帖子链接。

以下是我们构建规划图的方式:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

构建规划图的算法(图片由作者提供)

有四个步骤,我们一个一个来。

计算动作

这是指这一步:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算动作(图片由作者提供)

它由两部分组成:

  • 对于 PDDL 适配器提供的所有操作,我们在当前状态下搜索适用的操作,并且
  • 我们确保那些可应用的动作的前提条件不在前提条件互斥体中

计算动作(作者代码)

计算前提条件

下一步是计算前提条件,也就是这一步:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算前提条件(图片由作者提供)

这一步非常简单:

计算前提条件(作者编写的代码)

我们只是存储计算出的动作的效果。

计算操作互斥

该算法的下一步是计算动作互斥量,这是一个相互抵消效果的动作对列表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算动作互斥体(图片由作者提供)

在这个等式中有三个部分,对于行动中所有可能的排列,我们希望在我们的列表中包含以下内容:

  • 行动的负面影响会干扰其他行动的正面影响或先决条件
  • 第二部分相同,只是另一个方向( ba )
  • 第三部分是他们的前提条件是互斥的

计算动作互斥体(由作者编写代码)

计算先决条件互斥

构建规划图算法的最后一步是计算前提互斥。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

计算先决条件互斥体(图片由作者提供)

这意味着我们要寻找一对互斥的前提条件。它们是互斥的,当且仅当:

  • 对于所有产生 pq 的动作对,它们都在动作互斥列表中,并且
  • 没有一个动作同时产生 pq

计算先决条件互斥体(由作者编写代码)

我们现在已经完成了构建数据结构的代码,即规划图。为了帮助调试,您可以用 pydot 来扩充您的代码,以生成图形可视化。下面是它的一个例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

规划图可视化(图片由作者提供)

搜索算法:GraphPlanner

我们现在已经准备好了数据结构,我们可以开始实现搜索算法来为我们的规划问题找到解决方案。

该算法是递归的,有三个部分:

  • 计划
  • 提取
  • 搜索

提取和搜索

这两步是递归的,算法如下。第一部分是 摘录() :

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

提取算法(图片由作者提供)

下一部分是 搜索() :

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

搜索算法(图片由作者提供)

这是这两个函数如何递归工作的示例:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

算法流程(作者图片)

它递归调用 Search() 直到所有命题都被解决,并调用 Extract() 转到规划图中的下一级。

这是我们用 Python 写的:

提取和搜索算法(由作者编写代码)

主程序

最后,我们到达最后一步,主要程序和我们算法的入口点:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

主算法(图片由作者提供)

在某些情况下,我们需要计划更多的步骤来创建解决方案计划,我们需要扩展我们的计划图表并重试搜索。

我们还需要添加一个额外的步骤,以确保算法在没有可能的解决方案时终止。这是我们的最后一段代码:

主算法(作者代码)

包扎

我意识到要描述实现这个算法的思维过程并不容易。但是我希望你至少对如何实现算法有所了解,从方程和伪代码到 Python 代码。

完整的代码可以在下面的 Github 上找到:

https://github.com/debbynirwan/planning_graph

我如何在沃尔玛找到一份数据科学的工作

原文:https://towardsdatascience.com/how-i-land-a-data-science-job-at-walmart-b2d9bd1539be?source=collection_archive---------5-----------------------

破解数据科学访谈

这是一个完美的适合和支付真的很好!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

布拉德·巴莫尔在 Unsplash 上的照片

介绍

我的求职季在一个绝对糟糕的时间开始:

  • 一个致命的疫情出乎所有人的意料;
  • 全球经济进入恐慌模式;
  • 公司冻结了新员工。

作为一名应届毕业生,我不得不在努力保持健康(大部分时间与外界隔绝)和完成博士课程的同时,在找工作的旅途中游刃有余。这是一次如此孤独的旅程,我敢打赌,你们很多人都会有同感。

一次又一次的面试,一次又一次的拒绝。

自我怀疑和犹豫开始出现,我的信心开始动摇。

日以继夜,我过去 5 年多的努力什么时候会有回报?

我于 2020 年 9 月正式开始找工作,并于 2021 年 7 月在沃尔玛全球科技获得了一份工作。这是一个数据科学家/统计学家的联合职位,我可以在实验平台 Expo 利用我在机器学习和因果推理(实验)方面的背景。

非常适合!

此外,总的薪酬方案非常有竞争力,我根本不需要谈判。在付出了这么多努力之后,老实说,这是一种甜蜜的泪水、热情和彻底疲惫的混合感觉。

在今天的帖子中,我想记录下我的求职之旅,并分享这个过程中的好、坏、丑。我按照面试漏斗中的步骤来组织这篇文章:如何获得面试机会,确定技术回合,以及破解现场面试。

背景

首先,我是加州大学圣巴巴拉分校政治学的应届博士候选人,拥有统计学硕士学位。此外,我在实验、因果推断和数据分析方面有 5 年以上的研究经验。

自然,研究和行业经验之间有差距,但这并不意味着博士候选人是书呆子,不能去企业工作。事实证明,这是业内高级学位持有者的一个普遍假设。我通过展示可转移的技能、将他们的业务问题转化为可研究的问题、理解并做出实际的权衡等方式,在面试环节尽早解决这个问题。

关于做出实际权衡的快速说明:企业领导人必须平衡速度和数据质量。如果我们能够以一种快速的方式提供一个合理有效的解决方案,这在行业中已经足够好了!这是许多博士候选人挠头想知道的时候:

为什么我们不试着找到完美的解决方案呢?

简单的回答是,企业等不了那么久。如果他们必须在 6 个月内等待一个完美的解决方案,他们可能会破产。

展示你对必要权衡的理解可以提高你在面试中对成熟和专业的认知。

鉴于我的教育背景和研究经验,我不敢想象如此可怕的面试过程。

事实证明,我大错特错了。

博士找工作一直很有挑战性,因为我们要求更好的薪酬待遇,但就业市场却很小。疫情让情况变得糟糕 10 倍。在 Covid 开始后的最初几个月,公司陷入恐慌,停止招聘新人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

菲尔·科夫曼在 Unsplash 上的照片

步骤 0:准备面试

我在业内的数据朋友在找工作之前安排了几轮模拟面试,这帮助我迅速意识到差距,并发现我需要发展的技能。两项技能名列前茅:Python 和 SQL。虽然,在我看来,学术界使用 R 的频率要高得多,也不用担心大数据。

为了准备面试,我花了很多时间掌握数据结构和算法、时间和空间复杂性,以及编程的所有细节。我在我的电脑上创建了 50 多个 Jupyter 笔记本,在 Medium 上创建了 20 多个编程帖子。在不到一年的时间里,我在 LeetCode 上已经有了 2600+的提交,解决了 322 个编程问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2021 年 8 月自己的截图

与此同时,我联系了很多人,并经常安排信息采访。具体来说,我记下了我想知道的最重要的问题,例如他们作为数据科学家的日常工作,他们试图解决的典型问题,每个项目的持续时间等。

我个人最喜欢的问题是关于他们工作中最具挑战性的部分。这个问题让我站在他们的角度,培养他们对自己责任的第一人称视角。安排信息面试是培养同理心和沟通技巧的捷径。

最佳实践

  • 积极主动,向人们伸出援手。

这是关键的第一步。你真的需要在踏入赛场之前感受一下水温。如果你没有达到职位描述中列出的最低要求,最好停止面试,发展所需的技能。这并不意味着你必须在开始面试循环之前做好充分准备;退一步说,这意味着你应该对工具/技能有所了解。

  • 成为社交媒体的大师,了解它们的不同工作方式。

媒体LinkedIn 上的技术写作对我帮助很大。如果没有这些平台,我的求职之旅会困难得多。 LinkedIn 是一个基于人脉的职业网络,我的人脉构成了该领域的商业领袖和数据科学家。他们最迫切的需求是有什么解决方案可以解决他们的业务问题。因此,我对我的帖子进行了修改,以满足这些需求,并提供一站式解决方案。查看 LinkedIn上的这篇文章,获取一个简单的例子:

https://www.linkedin.com/posts/leihuaye_womanday-data-abtesting-activity-6774769825265909760-fxbR

相比之下,我在 Medium 上的追随者是热切的数据学习者,他们希望了解如何实现该方法。因此,我详细阐述了技术细节,并特别关注代码实现。

一个快速更新,我已经开始了一个新的 YouTube 频道致力于统计学、研究设计、职业发展、数据科学、实验和因果推理。这个视频解释了我在渠道背后的想法,以及它如何能让你受益。此外,我在技术部门工作的几十个朋友已经同意来这个频道,分享他们的生活经历和职业发展技巧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

凯尔·科特雷尔在 Unsplash 上的照片

第一步:如何获得面试机会

第一步总是最难的。我的大部分职业网络都在学术界,走出我的舒适区并不是一件容易的事情。不管怎样,我开始申请,运气不好,接受了几次面试。然后,拒绝。我当时觉得挺正常的,没想太多。我提交了更多的申请,一次又一次被拒绝。有一次,我运气不好,不再接受任何采访。

出事了!

为什么我得不到任何面试机会?

我当时目光短浅,没有评估自己应用策略的有效性。我愣了一会儿,毫无头绪。

幸运的是,我很快意识到专业社区的重要性,并通过直接与行业领导者联系,将我的在线内容“货币化”。如第 0 步所述,我在媒体LinkedIn 上运用不同的写作策略来适应受众。每一个帖子和分享都会带来新的联系。

很快,一家顶级科技公司的招聘人员伸出手来,想要打电话更好地了解我。这是一系列后续请求的开始。

事实证明,内容写作是建立联系和获得面试机会的最有效方式。我会向新朋友介绍我的背景和专业领域,并询问他们是否在招聘。

最佳实践

  • 挑个利基。

我们都想成为“全栈”数据科学家,但现实是,如果你专注于自己最强的领域,你会更好。数据科学主要有三条职业轨迹: 算法分析推理 。作为一名社会科学家和统计学家,我最强的优势在于推理轨道,具体来说就是因果推理。因此,我的整个面试策略建立在这样一个假设之上:如果我在推理领域找不到数据科学的职位,我就不可能在其他两个领域找到工作。

  • 与领域保持同步。

公司希望招聘内部人员,即了解其商业模式的技术人员。如果你是一名有能力的数据科学家,下一步就是展示你理解他们的痛点,并准备好在第一天就为团队做出贡献。阅读公司的技术博客是保持更新的最好方式。

查看这份中等清单,了解顶尖公司的数据科学团队目前正在做什么: A/B 测试正在进行

常见陷阱

  • 蛮力和原始应用。

这是新毕业生的通病。这是浪费时间,是行不通的。即使在与理想的候选人签订了合同之后,公司还是会继续刊登招聘广告。

  • 努力成为通才,心中没有重点。

几年工作经验后大概可以申请不同赛道的职位。然而,我的建议是在开始时利用你最强的力量,在转向其他人之前进入大门。

不要做那个想让太平洋升温的人。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Petalz_RUnsplash 上拍摄

第二步:如何通过技术轮面试

恭喜你。你已经走出了自己的舒适区,获得了面试机会。嗯,我们应该记住:这只是一次面试,不是一份工作邀请!

我应该说:还没有。

在得到工作机会之前,还有两到三轮面试。

技术回合主要关注脚本编程、商业案例或行为问题。根据我过去的经验,公司在技术回合中会问所有这些类型的问题,所以要做好准备。他们会在最后的现场面试中再次问你这些问题,但会有意识地问。

经过大量的训练,我毫无问题地通过了几乎所有的技术面试,并被邀请进入最后一轮。这并不容易。最疯狂的几周,我几乎每天都做技术面试。

如果几轮面试都没通过,不要对自己太苛刻。最好的策略是从失败中学习,磨练你需要的技能。一开始,我不能用 Python 写一个简单的 for 循环。现在,我在教别人如何编码。

最佳实践

  • 编码,编码,编码!

数据科学家的一个基本职责是有效地编码。了解如何用 SQL 和 Python 编码。练习 LeetCode 问题,发展你的软件工程技能。

我的编程秘诀叫做深思熟虑的练习:专注于一个领域(例如 Python 中的字典),彻底理解底层逻辑。我遵循了这种类型的实践计划,从一个 Python 新手变成了一个(自称的)编程大师。

一些例子请参考这个编程列表: 破解数据科学访谈

  • 把编程当成语言。

归根结底,Python 或 SQL 是一种与计算机对话的编程语言。语法与人类语言非常相似。我的诀窍是把它当成一门语言,理解底层逻辑。当然,学习数据结构和算法很有帮助。

在这篇文章中,我分享了数据科学家如何开发编码技能:

  • 沟通,沟通,沟通。

公司正在寻找能够清晰表达自己观点并与团队有效沟通的人。所以,我们应该把面试视为双向对话,而不是单向独白。

以下是我对一个编码问题的逐步分解:

  1. 再次阅读问题提示,并确保您理解它的底层逻辑。
  2. 然后,如果你有什么不清楚的地方,要求澄清,必要时收集进一步的信息。我经常把问题反馈给面试官,确保我的思路是正确的。
  3. 先给出一个整体的答案,再用 Python/SQL 进行编码。比如你可以说这个问题要求求斐波那契数,我首选的算法是递归,它有两个部分:基条件和递归条件。这也叫做在你的思维过程中走一遍。
  4. 编码完成后,我会测试它,看看算法是如何工作的。通常,在我们第一次运行任何算法时,它会抛出一些错误,主要是因为缺少边缘情况。解决问题并再次运行。
  5. 到目前为止,我有一个可以运行的暂定解决方案,但这并不意味着工作已经完成。还没有。尝试讨论时间和空间复杂性以及不同算法之间的权衡。如果可能,提供任何可以提高模型性能的更好的算法或解决方案。学习大 O 符号。

一些例子请参考这个编程列表: 破解数据科学访谈

  • 要自信!

每个人都会偶尔被卡住。积极主动地寻求暗示。实际上,面试官希望你被卡住,他们已经准备好给出暗示了。试着自信一点。

常见陷阱

  • 玻璃门不是你的朋友。

科技公司有很多面试问题,但人们喜欢在谷歌上搜索最近的面试问题。首先,这是一种不被认可的做法,因为求职者需要签署一份 NDA。其次,公司很可能不会一遍又一遍地问同样的问题。这是浪费时间。第三,它让你在心理上消沉。你可能会想,“会包括在我的面试中吗?”除了焦虑和失眠,它没有创造任何价值。

  • 沟通不够。

一些人在没有沟通的情况下就开始编码,一旦他们陷入困境或错过了边缘案例,他们就开始恐慌。但是,你知道,解决技术问题不仅仅是关于技术部分;也是关于良好的沟通。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

照片由 Unsplash 上放大的

第三步:如何破解现场面试

干得好。你和梦想中的工作只有最后一英里了。与前几轮相比,现场比赛需要一整天的时间,是一场智力和体力的考验。它包括 4 到 5 次单独的面试,面试中有两个主要目标:

1.进一步测试候选人的技术技能:Python、SQL 和机器学习(以技术为基础)。

2.了解你将如何融入团队(更多基于行为)。

至于编码问题,我建议遵循上面列出的相同步骤。为了破解行为回合,我遵循了一种SituationTaskAactionRresult(STAR)的方法:

  • 简单描述一下情况。有什么问题?为什么重要?
  • T 提问:描述你的角色以及为了解决问题而委派给你的任务。
  • T4:为了解决这个问题,你们采取了哪些具体措施?为什么选择这一步,而不是其他?描述给定情况下的权衡。
  • 结果:你取得了什么成就?你彻底解决问题了吗?如果可以再来一次,你会有哪些不同的做法(提升空间)?

在整个面试过程中,我坚持使用明星法。这很有帮助。

最佳实践

  • 明星是你的朋友。

反思你过去的经验,并思考如何应用 STAR 框架。

  • 准备好谈论你的简历。

如果你在简历上写了什么,面试官很可能会问你。所以,回忆一下细节。我得到了这个教训。作为一名研究人员,我在简历中加入了几个项目,但已经有一段时间没看了。所以,当面试官想了解更多的时候,一些技术细节就变得模糊了。

  • 在任何面试结束时提问。

这是你更多了解团队、他们的痛点和未来方向的机会。我总是问他们最具挑战性的部分和解决方案的相关问题。

常见陷阱

  • 不应用 STAR。

对于行为问题,新毕业生可能会漫谈他们过去的经历,无法给出明确的答案。同样,这是一个很大的危险信号。

此外,他们漫谈和重复自己,一个大的拒绝。

相反,在开始之前,要求一些时间来整理你的想法,记下几行笔记。

Medium 最近进化出了自己的 作家伙伴计划 ,支持像我这样的普通作家。如果你还不是订户,通过下面的链接注册,我会收到一部分会员费。

https://leihua-ye.medium.com/membership

外卖食品

  • 不要让拒绝让你沮丧。我知道你花了这么多精力准备面试,但还是被拒绝了,这是什么感觉。我经历过,理解那种感觉。从过去的经历中学习,成长。
  • 有成长的心态 。数据科学是一个如此广阔的领域,什么都知道是不现实的。如果职位描述包括 Python 和 SQL,我们可以学习编程;我们可以通过阅读和研究来培养商业意识。我们可以在学完数据结构和算法之后,和软工程师讨论时间和空间的复杂性。为了 100%透明,我一开始对编程知之甚少,没有商业意识,也没听说过 DSA。刻意的训练和自我教育把我带到了这里。
  • 稍事休息但绝不放弃 。我知道这是毫无头绪的漫长一天,你只想放弃。但是相信我:你可能只需要几行代码和练习就能得到你梦想中的工作。不要让任何人告诉你“不可能是你。”可以是你!

喜欢读这本书吗?

请在 LinkedInYoutube 上找到我。

还有,看看我其他关于人工智能和机器学习的帖子。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值