TowardsDataScience-博客中文翻译-2020-五十八-
TowardsDataScience 博客中文翻译 2020(五十八)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
我多么爱你的数据
原文:https://towardsdatascience.com/how-do-i-love-thee-data-89558f2a93f4?source=collection_archive---------57-----------------------
让我来数一数,总结一下

亚历山大·辛恩在 Unsplash 上的照片
数据,你让我在你好。
我们在一起这么多年了。我有无数好的,坏的,失败的回忆。我们去过星星,在雪花中嬉戏,有一段令人惊讶的正常关系,这是大多数人都不知道的。许多其他数据仍然被困在各自的筒仓中,看不到阳光。我们应该认为自己是幸运的。
我一直在投资我们的关系。我似乎不能把我的手指放在回报上,但是我确实知道在我的生活中我如此需要你。你是我的电、油和水。
没有你就没有意义。没有你,我无法做出任何有意义的决定或采取任何行动。
我会尽最大努力保证你的安全,并采取措施防止任何恶意攻击。我付出了一切来确保你不会从我身边被偷走。
你最*变得很大——哦,最亲爱的,不要误解我——不管是大是小,我都爱你。大小并不重要。你要知道,随着你的成长,我不得不做出调整来跟上你。
你需要更多的空间,所以我们从一个地方搬到另一个地方。仍然没有足够的存储空间给你,所以我们搬到了一个大仓库。见鬼,我甚至给你买了自己的湖!
我深情地记得生活简单而有条理的时候。除了一些分隔符,没有什么可以分开我们。
有时候你的脑袋在云里,或者你在其他的空间里。当你想让我们的关系公开时,我很震惊。你可以说我守旧或专有性,我只是还没准备好做出这样的飞跃。我们的隐私对我来说很重要。
数据,你太值得了。
我听别人说起过你的正直,你的卫生,他们说你不可信,或者你不守时。规则不明确,他们一直在操纵你来迎合他们的喜好。他们甚至质疑你的血统。我知道这不完全是你的错,但你似乎承担了所有人问题的责任。
你必须经历很多转变,我知道这有时很困难,但却是必要的。你所做的牺牲得到了回报,你看起来美极了!看到你的色彩和你展现自我的多种方式真是太棒了。你的美丽无法用语言或数字来形容。简直超乎想象!
你已经成为一个不可思议的故事讲述者。我从未想过你能以这样一种方式表达自己,激励人们采取行动。你们分享的故事产生了如此大的影响。
数据,你激励了我。
你不可思议的进化超越了视觉美和讲故事。你努力成为所有决策的中心。我一直有一种直觉,你有能力做到这一点——现在我亲眼目睹了。你是科学、工程、文化、管理领域的开拓者,如此受欢迎,以至于你现在有了自己的文化。
哦,你的智慧太真实了,你的学习已经如此深入。看到你积累的知识的广度和你如此快速地识别模式和解决问题的能力,我感到惊讶。我喜欢你从未停止提升你的能力,并激励我与你并驾齐驱。
数据,你挑战我。
你终于得到了你应得的认可,这让我很骄傲。因为有你,因为有你,世界变得更加美好。
你帮助人类的梦想正在变成现实。我迫不及待地想知道未来会发生什么,我很荣幸我的生命中有你。
数据,你使我完整。
我的工资有多少?
原文:https://towardsdatascience.com/how-do-i-stack-up-9e49a18ba60b?source=collection_archive---------75-----------------------
将你的工资与你的同事的工资进行对比
概观
这篇文章讨论了一种工具背后的方法和动机,这种工具可以帮助人们了解他们的收入与同龄人(同一个城市,同年龄组,可选地,性别)的收入相比如何。
要直接进入计算器,点击此处。

自己试试——这里
动机
研究表明,人们很难估计自己有多富裕。比如,在其 2015 年的工作论文中,金珀森和特里斯曼指出,个人对本国收入分配的信念揭示了“广泛传播的无知和误解……不管数据来源、可操作性和测量方法如何。”他们这样总结这种误解:
富人经常认为他们比实际上更穷,而穷人认为他们比实际上更富。两人都认为自己比实际情况更接*中间值。
这种误解可能会产生广泛的影响,既影响个人福祉——例如主观幸福感和压力水*——也影响政治观点——例如对再分配的看法( Gimpelson 2015 , Hauser 2018 )。
我希望这个工具可以帮助个人更好地将他们的相对“小康”联系起来,这样做:
- 帮助告知一些关键的个人财务决策 —例如,与你所在城市的其他人相比,你的相对收入水*可以让你了解这个城市对你的负担能力。如果你是第 80 个百分之一的人,不知道你是否有能力在城市里抚养孩子,你可能有这个能力!79%的人在低收入的情况下工作!(我知道这 79%的人中并不是每个人都有孩子,但希望你明白我的意思)
- 让一个人更加意识到自己的经济特权(或缺乏经济特权)——如果个人普遍倾向于高估自己的中产阶级程度,纠正这种误解可能会促进对那些不太富裕的人的更多同情。同理心越强,政治和社会利益就越大(这是我未被引用的观点,所以要有所保留)。
- 或许甚至可以缓解一些经济焦虑——人们很容易将自己与社交圈中最成功、最富裕的人进行比较。这可能会对一个人对自己和自己的财务状况产生负面偏见。希望从更广阔的角度看问题,将有助于纠正这种负面偏见。
方法学
数据汇编
为了获得按年龄、地理位置和性别划分的全职员工的收入数据,我使用了 IPUMS CPS ,它“提供了跨越时间和空间的来自世界各地的人口普查和调查数据。”
提供此类信息的最新相关数据集是来自 2019 年 3 月的 ASEC (“当前人口调查的年度社会和经济补充”)数据,包含以下字段:
- INCTOT —“上一日历年所有来源的税前个人收入或损失总额”;
- wks work 1——“被调查人在上一个日历年中为盈利、有报酬或作为无报酬家庭工人工作的周数。”
- full part——“指出在上一个日历年被雇用的受访者是全职还是兼职。全职工作的定义是每周工作 35 小时或以上。”
- 年龄——“某人最后一次生日时的年龄”
- METAREA——“一个家庭所在的大都市地区。大都市区是以一个相当大的市区为中心的县或县群
- 性
- as ecwt——“在分析个人层面 CPS 补充数据时应使用的个人层面权重。”
定义对比群组

一旦收集了数据,用户定义要比较的人群,输入:
- 都会区—一个人居住的地理区域;目前,该工具仅支持该国 10 个最大的城市地区,但如果有兴趣,请在下面添加评论,它应该很容易扩展
- 总年收入—这应该包括用户在过去 12 个月的所有收入(包括兼职、投资收入等。)
- 年龄&相关年龄群组— 默认情况下,计算器会将比较群组的年龄范围设置为用户的年龄+/- 2 岁(例如,照片中的用户为 25 岁,她的年龄将与所有 23 至 27 岁的人进行比较)。此设置可以使用滑块进行调整。
- 性别—默认情况下,比较群组被设置为包括所有性别,但对于那些对女性和男性全职员工之间的收入分配差异感兴趣的人,请切换此设置。
清理数据
为了获得最终数据集,我们:
- 基于用户输入的子集
- 筛选到每周工作 40 小时以上(WKSWORK1 ≥ 40)的全职员工(FULLPART == '全职')
- 将 INCTOT 变量调整为≥ 0(原始数据允许负值)
给 IPUMS 数据添加标签并使其可读有点麻烦——你必须下载一个单独的文件并解析它——但如果你需要帮助,请联系我们。以下是我所做的要点(抱歉没有突出语法):
import pandas as pd
import untangledef get_data_labels(url):
obj = untangle.parse(url)
data = obj.codeBook.dataDscr.var
labels = {
x['ID']: {
int(el.catValu.cdata): el.labl.cdata
for el in x.catgry
}
for x in data
if getattr(x, 'catgry', None)
}
return labelsdef get_working_population_data():
url = ".../data_labels.xml"
data_labels = get_data_labels(url)
ipums = pd.read_csv(".../asec_data.csv") for k, v in data_labels.items():
ipums[k.lower()] = ipums[k].replace(v)
return working_pop
可视化分布
一旦我们有了相关的比较群组,我们就可以绘制该群组的收入分布图,使用我们数据集中的 ASECWT 变量计算样本权重。
例如,让我们看看一个 27 岁的人,他在波士顿市区年收入为 70,000 美元:

我们看到,这个人的收入属于他们同代人中的第 67 个百分位数(那些生活在波士顿-剑桥-牛顿地区的人)。

在洛杉矶地区,一个年龄相仿、收入相同的人会被认为更有意义地“富裕”,在那里,他们会属于收入分布的上分位数,即第 82 个百分位数。

而一个 27 岁的人在费城挣 7 万美元,属于收入较高的阶层,在第 89 百分位。

正如地理位置会极大地影响一个人在同代人中的相对地位一样,一个人比较自己的年龄也会极大地影响他的相对“富裕程度”。
例如,我们 27 岁的费城人年收入 7 万美元,对于她的同龄人来说已经相当不错了,但如果考虑到所有 27 岁及以上的工人,则更接*于费城的中等收入者(第 56 百分位)。
自己试试吧!
**[## 收入分配计算器
一个可视化工具,用于显示你的同伴群体的收入分布以及你如何融入其中
gameplan-app-21.herokuapp.com](https://gameplan-app-21.herokuapp.com/apps/income-forecast)**
结论
希望这个工具能帮助人们更好地理解他们同龄人的收入分配,以及他们如何融入其中。
我的下一篇文章将涵盖该工具中的“收入轨迹”标签,它利用了来自 Fatih Guvenen 和 Derek Tharp 的研究,来估计人们的收入在其一生中会如何增长。
感谢阅读!如果您有任何想法或问题,请联系我们或留下您的评论!
机器学习和信号处理如何融合?
原文:https://towardsdatascience.com/how-do-machine-learning-and-signal-processing-blend-4f48afbb6dce?source=collection_archive---------33-----------------------
IBM 在 Coursera 上的“高级机器学习和信号处理”概述

克里斯里德在 Unsplash 上的照片
作为一名设计工程师,我越来越多地接触到更复杂的工程挑战,其中一些挑战需要多学科专业知识的融合。高级机器学习和信号处理课程为我提供了了解机器学习和信号处理如何集成和应用在一起的窗口。
虽然这门课程的名字一开始听起来令人生畏,但它并不难理解。然而,先前的统计和微积分知识将在课程的后面部分派上用场。这门课程由 IBM 首席数据科学家罗密欧·肯兹勒和尼古拉·曼切夫讲授,由 Coursera 提供,作为 4 门课程的 IBM 高级数据科学专业的一部分。
该课程分为 4 周,第 1 周到第 3 周涵盖机器学习概念和算法。在第 4 周,涵盖了信号处理部分,并向我们展示了如何集成信号处理和机器学习。
第一周
本周为接下来的几周做准备,我们开始探索机器学习中使用的线性代数。我们首先介绍不同的数据对象:标量、向量、矩阵和张量;以及可以应用于它们的数学运算(点积、向量矩阵乘法)。
数据对象 标量是一维的,可以是任意整数,即:
1, 5, -18
向量是一组标量,并且只能包含一种数据类型,即:
(0,11,135)
元组类似于向量,但它可以包含多种数据类型,即:
(0,1,7.8) #notice the integer and float datatypes
矩阵是大小相等的向量的列表,张量是 3 维或更高维的矩阵。张量对于图像处理很有用(例如,一维用于宽度,另一维用于颜色,另一维用于高度)。
然后我们学习了更高维的向量空间,以及描绘和分割它们的直觉。
- 为了在一维空间中分裂,我们使用一个点。
- 为了分割成二维,我们用一条线。
- 为了在三维空间中分割,我们使用一个*面。
- 为了分割高于 3 维的空间,我们使用一个超*面。
机器学习有两种类型:
- 监督学习:在带有输出标签的数据集上训练,即给数据点分配一个标志。该算法旨在通过预测当我们改变 x 时 Y 将会是什么来求解 Y = f(x) 方程。监督学习分为:
- 分类 —预测离散值,即:“真/假”
- 回归 —预测一个连续值,即:“未来手机价格”
2.无监督学习:在没有输出标签的数据集上训练。该算法通过将相似的数据分组在一起,尝试从输入数据中发现模式。无监督学习的一个例子是聚类,其中数据被分成簇(在第 3 周会有更多相关内容)。

由玛丽亚·沙妮娜在 Unsplash 上拍摄的照片
PySpark 允许我们模块化数据管道。通过使用 StringIndexer、、 VectorAssembler 、和Normalizer 的 Spark 库,我们可以确保在 ML 模型发生之前,所有的预处理都完全对齐并得到处理。这个想法是将这些预处理部分浓缩到“管道”中,并利用这种灵活性在不同的训练参数之间快速切换,以优化最佳的机器学习模型。

ML 管道示例
from pyspark.ml import Pipeline
pipeline = Pipeline(stages = (string_indexer, encoder, vectorAssembler, normaliser))model = pipeline.fit(df)
prediction = model.transform(df)
所有的编码任务都在 IBM Watson Studio 中完成,本周的实践方法为建立和运行机器学习项目所需的步骤奠定了基础。
第二周
本周将介绍常见的机器学习模型和概念,这些讲座是解释理论和演示如何使用 Apache SparkML 算法的混合体。课程主持人做了大量工作来解释以下概念,这些概念对于坚实的机器学习基础至关重要。
线性回归和批量梯度下降
线性回归模型是一种基于监督学习的模型,可由以下函数描述:
y = w₀ + w₁x₁ + w₂x₂ +w₃x₃...+wₙxₙ ; whereby w is the feature weight
它的主要功能是根据提供的自变量(x)预测因变量(y)。其对应的逻辑回归用于预测离散值。使用梯度下降策略来确定特征权重,批量梯度下降恰好是这些优化策略之一。

批量梯度下降法寻找全局最小值
如果有足够的时间并且学习速率不太高,批量梯度下降保证找到成本函数的全局最小值。(想象一下试图到达一个山谷的底部)。对于大型数据集来说,这是很慢的,因为模型仅在评估了数据集中每个样本的误差之后才更新。
然后,我们简要了解了如何将数据集分为训练数据集和验证数据集,以及评估预测结果是欠拟合还是过拟合的方法。
朴素贝叶斯定理
尽管这个话题很有挑战性,但 Nickolay 设法将其总结成一种易于理解但又深入的方式。我们看到了朴素贝叶斯定理背后的直觉和数学,例如:
- 求和规则和乘积规则—允许我们解决大多数概率问题
- 高斯分布,或更普遍地称为正态分布,即*均值对称分布的数据。
- 中心极限定理——一个足够大的样本的所有*均值最终都是高斯分布
- 贝叶斯干扰——假设的概率随着新证据的出现而更新
到目前为止,已经有很多关于第 2 周的信息了,但是我们还没有完成!
支持向量机
支持向量机是线性分类器,为了将它们转换成非线性分类器,可以使用“内核”方法。这种方法,或者罗密欧称之为“技巧”,将训练数据转换到“特征”空间,并允许超*面清晰地分离数据点。这部分课程中的例子直观、对初学者友好,并且容易记忆。

SVM 的核心方法
本周很好地总结了决策树、随机森林和梯度提升树。我们看到了取样的方法和每个模型的优缺点。还有一个编码练习,结合了我们在第 1 周和第 2 周学到的内容,演示了使用 SparkML 的 gbt 分类器的应用和预测准确性。
第三周
随着更高级主题的介绍,如聚类和主成分分析,我感到最紧张。我们学习无监督的机器学习,我们试图理解点云之间的距离。有多种方法来测量距离,即两点间相减;毕达哥拉斯定理、欧几里德距离和曼哈顿距离。
我们学习了使用 K-means 算法和层次算法进行聚类。K-means 的工作方式是,我们指定预期聚类的数量,然后算法将在 3D 空间中绘制一个超球体,并尝试根据最*的中心将点云中的每个数据点分组为聚类。

k 均值聚类
维度的诅咒
我们经常不得不在更快的计算时间和更多维度(特征)之间做出权衡,同时保持一定的准确性。随着维度的增加,样本数量变得越来越少,数据点之间的距离也失去了意义。为了解决这个问题,PCA 被用来减少维数,同时尽可能地保持原始数据点之间的距离。这些距离在分类中至关重要,因为它们允许我们将数据点预测到不同的类别中。
本周有几次测验,但它们足以测试我对材料的理解。与前几周相似,有一个编码练习来巩固到目前为止所学的内容。
第四周
我最期待的是本周,因为我们终于谈到了信号处理部分,这是一个我非常渴望探索的话题。
信号
描述一个信号有 3 个变量:
1。频率—信号
2 出现的次数。振幅—信号的强度
3。相移—信号从其原始位置移动的水*偏移量。

描述连续时间信号的变量
大多数信号可以用以下公式产生或描述:
y(t) = **A**sin(2*pi**ft* + **φ**) whereby, **A** = amplitude, *f* = frequency, *t* = time, **φ** = phase shift
傅立叶变换 傅立叶变换允许我们将复杂的信号——无论是音乐、语音还是图像——通过一系列正弦曲线分解成它们的组成信号。
就图像而言,我们可以将图像的颜色分解成它的 RGB 成分。

安德烈科·波迪尔尼克在 Unsplash 上拍摄的照片

图像的 RGB 分解
Nickolay 以钢琴和弦为例,使用傅立叶变换来识别单个音符。振动穿过介质时会产生声波。当我们有不同程度的振动时,我们将获得不同的波形振幅。这些振幅可以相加或叠加,以获得每个单独振幅的净响应。

我们可以研究两个域的波形——T4 时域和频域。傅立叶变换和傅立叶逆变换在这些域之间转换。(前者从时域到频域,后者从频域到时域)。
本章通过小波主题将信号处理和机器学习联系起来而结束。傅立叶变换适用于*稳信号,但在现实生活中,我们经常处理非*稳信号。傅立叶变换不能提供特定频率何时出现在这些信号中的信息。因此,小波变换需要使用标度图来克服这种限制,标度图是小波变换的直观表示。为了充分理解小波和傅立叶变换,Nickolay 解释了它们背后的数学原理。
最后的编程作业是关于如何使用机器学习对信号进行分类的练习。对于正在研究传感器数据和机器学习如何工作的人来说,本周的主题和练习确实令人着迷和有趣。
结论
我发现我正在开发的产品变得越来越智能,安装了更多的传感器。通常,拥有多学科技能有利于交付项目。这门课程通过提供信号处理和机器学习的一些重要主题,对我来说“一举两得”。
交付速度很快,对于专业人员或好奇的业余学习者来说,解释也足够得体。对于教授的一些主题,尤其是贝叶斯定理、主成分分析和小波变换部分,进一步的学习和研究对于加深理解非常重要。
还有其他课程更深入地讲述了机器学习和信号处理,但我真正喜欢这门课程的是这两个相互关联的主题的联系和“融合”。
由于在本课程的作业中使用了 IBM Watson Studio,接触 IBM 的云工具和服务还有另外一个好处。这门课程似乎是让学习者自己选择作业的难度。通过作业并不具有挑战性,因为有很多指导和指导。但是对于初学者来说,总是有一个选项来真正理解显示的代码,这需要时间。
我期待着应用我从这个课程中学到的东西,我希望通过写这个总结,我巩固了我的学习,你也学到了一些东西。
机器是如何学习的?
原文:https://towardsdatascience.com/how-do-machines-learn-e3b023bfa28d?source=collection_archive---------25-----------------------
一个简单的介绍和示例代码!

由 Kaboompics 拍摄的照片。com 来自 Pexels
人工智能
人工智能已经成为科技行业每个人都在谈论的时髦词汇,让外行人感到困惑和茫然。对于那些可能不熟悉人工智能和机器学习的人来说,这篇文章是对人工智能和机器学习的介绍。
让我们开始吧…
什么是数据科学,AI,机器学习?
人工智能的领域是广阔的,然而,也有某些细分领域缩小了它的应用范围。先来介绍一下当我们听到 AI、ML、数据科学这些词的时候是什么意思。每当这样的词出现时,一般来说,它们指的是过去或实时收集的数据被用来创建预测的过程。这些预测是 AI、ML 或一些其他统计模型在“看到”数据后的“最终结果”。为了更好地理解这一点,让我们看看机器学习的三种方式…
- 监督学习
- 无监督学习
- 强化学习
监督学习

来自像素的亚历山大·奈特的照片
当我们有一个大的数据集(简单地说是对某些属性的许多观察)时,比如说身高、体重、性别和鞋码,我们可以使用监督学习来预测某些属性给定其他属性。考虑上面的例子,如果我们有一个包含以下属性的数据集…
- 高度
- 重量
- 性
- 鞋码
…我们想要预测鞋号,我们可以使用数据集中每个人的身高、体重和性别来帮助预测鞋号(我们将在下面讨论这个过程是如何工作的)。
无监督学习

照片由凯奎·罗查从 Pexels 拍摄
每当我们有一个数据集,我们试图识别未知的关系,我们使用无监督学习。这听起来几乎是一个矛盾的说法,不是吗?
了解未知关系
考虑在商店观察到的具有以下属性的数据…
- 性
- 年龄
- 花的钱
- 一天中的时间
…如果我们想更好地了解谁是花钱最多的人呢?更重要的是,如果我们可以了解顶级消费者的关键特征,然后有针对性地进行营销,让他们进门,会怎么样?这正是无监督学习的目标。
强化学习

照片由来自佩克斯的延斯·马赫克拍摄
只要我们有一个可以学习规则的环境,我们就可以实施强化学习。这就是人工智能真正有趣的地方——无人驾驶汽车、人工智能的游戏能力等……在某种意义上,这直接来自心理学(事实上,大多数人工智能算法都是受人类生物学的启发),巴甫洛夫训练狗在听到铃声时分泌唾液,人工智能也被训练成根据状态-行动-奖励系统成功完成任务。
机器是如何学习的?
让我们从使用线性回归来解释线性模型的基本步骤开始。首先,让我们考虑一个具有以下任意属性的数据集…
X1 X2 X3 X4 X5 X6 X7 X8 Y1 Y2
在任何情况下,X 是给定的,而 Y 是八个 X 变量的结果(您可以将此视为前面的鞋码示例)。如果我们想根据 X 预测 Y,第一步是将数据分为因变量(Y)和自变量(X)。使用 python,这将看起来像…
数据现在被有效地分成了两个不同的集合…
- X —一套 X1,X2,X3,…,X8
- Y —一组 Y1 和 Y2
接下来,我们可以使用线性回归模型来帮助预测基于 X 的集合 Y…
这里发生了什么?嗯,线性回归模型只是一条通过数据的最佳拟合线。这意味着它是从所有点到线的距离最小的线(在 2d 中)。看起来像这样…

这就是机器“学习”的方式,它们只是将预测与观察结果的误差最小化
现在,线性回归模型有什么问题?线性回归模型的主要假设是,因变量和自变量之间存在线性关系。如果我们绘制的数据看起来更像这样…

…显然,这不是线性关系,而是非线性关系。这就是多项式回归、神经网络和所有其他有趣的东西发挥作用的地方。与线性回归不同,神经网络可以发现数据中的非线性关系。这就是为什么理解您正在处理的数据类型及其与您试图预测的变量的关系是至关重要的。
结论
在本文中,我讨论了不同类型的学习过程,并举例说明了机器如何使用线性回归模型进行学习。如果你想了解更多关于神经网络的功能以及如何建立自己的神经网络,请点击以下链接…
- 线性回归 vs 神经网络
- 人工智能训练营
- 遗传人工神经网络
网飞和亚马逊怎么知道我想要什么?
原文:https://towardsdatascience.com/how-do-netflix-and-amazon-know-what-i-want-852c480b67ac?source=collection_archive---------28-----------------------

JESHOOTS.COM在 Unsplash 上拍照
或者说推荐系统是如何工作的?
每次谈到推荐系统,我们都把它称为“知道我们一切的算法”。我们每天都能看到他们的搜索结果,例如,当亚马逊向我们推荐有时非常适合我们的产品时,尽管我们以前从未搜索过它们。这通常会吓到一些人,尤其是因为没有多少人知道这些算法在实践中是如何工作的,所以我将在这里尝试总结一下基本知识。无论您是一名数据科学家,想要开始深入研究推荐系统,还是只是好奇想了解整个事情在现实生活中是如何发生的,这都是一个好的起点。
推荐系统如何工作——简短版
推荐算法可以分为两个不同的类别,这取决于它们的方法:协同过滤和基于内容的过滤。
协同过滤
协同过滤考虑到了口味的相似性,这意味着如果爱丽丝喜欢哈利波特,魔戒和纳尼亚传奇电影但讨厌变形金刚,鲍勃喜欢哈利波特和魔戒电影,我们假设他更有可能喜欢纳尼亚传奇而不是变形金刚。因此,它是基于用户之间的相似性,而不是产品。
基于内容的过滤
另一方面,基于内容的过滤通过查看特征本身来模拟喜欢某部电影的可能性。在上面的例子中,我们可以感觉到 Alice 和 Bob 都喜欢奇幻类型的电影,并向他们推荐《霍比特人》。在这个例子中,它是基于产品之间的相似性,而不是用户。

推荐系统如何工作——长篇版
为了做到以上任何一种方法,我们必须找到一种找到相似用户或相似产品的方法。更好的是,我们需要一种方法来衡量它们之间的相似性,这样我们就可以发现哪些产品/用户比其他产品/用户“更相似”。
类似
相似性可以通过测量距离来发现:两个元素越接*,它们就越相似。在数学中,测量距离的方法有很多种,但首先让我们了解一下在这个上下文中距离是什么意思。
在我们的日常生活中,两点之间的距离是使用这些点的空间坐标来测量的。例如,如果我知道我的确切空间坐标(经度和纬度)和我想去的地方,我可以使用我们称之为欧几里得距离来计算我到该点的距离:

当我们拥有年龄、性别或电影类型等特征而不是地理坐标时,我们该如何做到这一点呢?事实证明并没有什么不同,除了空间坐标有两个特征(X 和 Y),在我们的例子中,我们有更多的特征和一个高维空间,很难在图中显示出来。这篇文章的目的并不是深入许多可用的距离度量的细节,但是如果你想了解更多,这里有一篇很好的文章。一旦我们能够计算元素(用户或产品)之间的相似性,我们就可以尝试不同的方法来推荐产品。
实践中的协同过滤
让我们在之前的 Alice 和 Bob 的例子中增加一些人。在纯粹的协作过滤方法中,我们将首先获取用户对我们电影的评分(1-5 ):

然后,我们可以通过推断 Bob 对他还没有看过的两部电影的评价来向他推荐一部电影。这样做的一种方式可以是取最接*他的 2 个用户(在这种情况下是 Alice 和 Carol),并通过取他们对每部电影的*均评级来估计他的评级。对于纳尼亚传奇,我们估计是 4.5,而对于变形金刚,我们估计是 1(因为卡罗尔没有给它评分,所以我们不会考虑她的评分)。在实践中,我们可能会使用比 2 个用户多得多的用户,并且可能根据他们与 Bob 的距离来加权他们的评级,因此更多相似用户的评级被给予更大的权重。请注意,这种方法与他们的年龄或性别无关,也与实际的电影内容无关:它纯粹基于用户之间的评级和相似性。
基于内容的过滤
基于内容的过滤是基于产品之间的相似性。一种方法是使用产品特性。在我们的示例中,它可能是这样的:

给 Bob 推荐一部电影,我们可以根据上面展示的特征,看看哪些电影和他喜欢的电影更相似。他喜欢《哈利波特》和《指环王》,根据上表判断,这两部电影更接*《纳尼亚传奇》,而不是《变形金刚》。
现实生活中是怎么发生的?
大多数公司使用混合方法,这意味着他们结合了协作和基于内容的过滤,不仅考虑评级和类别,还考虑年龄和性别等人口统计数据,以及更高级的功能,例如书中的文本内容。特别是当你没有足够的特定用户的数据,如评分,来推断他们的偏好时,你可以使用人口统计学来估计。
如果你想了解更多关于推荐系统的知识,你可以查阅这篇非常有用的文章,或者,如果你对数学和操作细节感兴趣,你可以查阅这本书。
rcn 如何学习?
原文:https://towardsdatascience.com/how-do-rcns-learn-1b65561f2e38?source=collection_archive---------37-----------------------
皇家护理学院
用匹配追踪代替梯度下降
科学进步一次一个葬礼。马克斯·普朗克的这些话是杰弗里·辛顿在被要求评论反向传播在未来的作用时使用的话,反向传播是他共同发明的算法[1]。为了发展人工智能,检查人类大脑的灵感是很自然的,Vicarious 在他们的递归皮层网络(RCNs)工作中就是这样做的[2]。本专栏文章探讨了 rcn 的不同方面,在本文中,我们探讨了它们的学习机制。
本文假设了解 ConvNets 和 RCNs 的结构,并倾向于了解 RCNs 的推理机制。可以从[2]或者我以前的文章( 结构 , 推论 )中了解 RCNs。
在 rcn 中有两件事情需要学习,功能节点的通道以及它们到其下一层的布线,以及池层中的横向连接。
特征学习
特征到底是什么?
在我们深入研究特征学习机制之前,让我们回顾一下 rcn 甚至 ConvNets 中特征的用途。分层视觉模型中给定层上的特征仅仅是考虑到它们在空间中的排列而对其下一层中的特征进行分组。在 ConvNets 中,特征映射中的一个单元指示在该特定元素周围的局部窗口中存在多少特定的较低级特征分组。在 rcn 中,通道(相当于 ConvNet 特征图中的单元)不是实数,而是二进制值,表示特定特征的存在与否。
但是,我们应该关注什么样的低层特性分组呢?假设我们位于某个中间层,其下的要素图层在多个方向上检测曲线段。如果我们想识别英语中的字符,我们是否应该有一个特征来表示一组形成花、星或圆的曲线段的存在?这个问题的答案是这个特征将在多大程度上帮助模型解释它通常会遇到的关于其他候选特征的图像。所以,在英语 OCR 的情况下,一个圆比一朵花或一颗星更有用,这基本上是 RCNs 的学习算法的本质。
在 rcn 中,我们只需要学习中间层和最顶层的特性,因为最底层具有硬编码的特性,即补丁描述符。对于中间层,算法逐层进行。在每一层,该算法在每次迭代中迭代添加单个特征,直到它找不到任何有用的特征来添加。让我们考虑在图 1 所示的特征层之上学习一个特征层。为简单起见,所示的层将被称为层 A,而它上面的层将被称为层 b。

图 1:对于给定的图像,运行前向传递和稀疏化步骤后的活动特征。所有显示的层已经经历了学习。为简明起见,较低层显示为长方体。其上的图层是具有 8 个颜色编码通道的要素图层(即黄色通道表示在其坐标处存在弯曲的左线段)。抱歉,看起来不专业,但它让事情更清楚。
中间层特征学习
在第一次迭代中,该算法从训练数据集中选取一幅随机图像,并向前传递到层 A。然后,我们应用一个稀疏化步骤,使我们获得层 A 的最有可能解释该层输入图像的特征。请记住,正向传递产生来自所有通道的信念传播消息,但不会告诉我们哪些功能应该激活,哪些不应该激活。如您在图 1 中所见,该图层中将有许多活动要素,其中一些组重复出现,如表示圆的组和表示长直线段的组。然而,在层 B,图像是完全无法解释的,因为在这一层还没有通道。该算法基于一些试探法来挑选一些候选分组,例如活动通道彼此靠*以及其中具有大量子特征的分组。对于每个候选分组,该算法计算其在训练数据集中的使用频率,并挑选最常使用的分组,该分组满足我们之前关于应该学习哪些特征的推理。
在图 1 中,可以看到对应于一个圆的层 A 的红、黄、绿和蓝通道的特定方向出现了两次。因此,我们假设它选择了这组子特征,并将其作为 b 层的特征添加。在下一次迭代中,该算法选择了另一个随机图像。现在,它的所有圆将在层 B 通过稀疏化步骤解释,就像我们在层 A 所做的那样,但是所有长线段不会,所以这次的算法可能会选择长线段的分组,因为它是英文字母中的常见特征,并继续下一次迭代,以此类推。
我想在这里提到,所有这些都依赖于稀疏编码的思想,其中我刚才提到的算法是字典学习算法匹配追踪,但作者添加了轻微的修改。
您可能已经注意到,所有中间层都不需要标签,这是 rcn 的一个很好的特性。在许多任务中,作者使用 SHREC 3D 数据集的 10,000 张图像训练中间层,然后在其他数据集上使用这些学习到的层,这有点像迁移学习。您可以在图 2 中看到实际 RCN 的中间层学会表示哪些通道。

图 2:中间层 RCN 的学习特征。图片摘自[2]的补充材料文档。
最顶层特征学习
最顶层是一个特例。它是使用一个带标签的图像集学习的,我们希望最终对它的图像进行分类。对于每个标记的图像,创建新的分类器特征。因此,对于同一个类,我们实际上可能在最顶层有多个通道。这看起来很昂贵,但是 rcn 是数据高效的,所以它首先不需要大量带标签的图像。我们在上一段中描述的学习算法将被修改,以便允许我们刚才提到的最顶层上的约束,这些约束很简单,不值得一提。
横向联系学习
不幸的是,这篇论文及其附带的补充文档没有提到关于如何学习池层的横向连接的很多细节,并且其算法也没有出现在他们发布的代码库中。他们提到的主要问题是,他们是从输入图像中对象的轮廓连通性中学习的。
本文到此为止。如果你想了解更多关于 RCNs 的知识,你可以查看它的论文[2]和补充材料文档,或者你可以阅读我的关于在不同数据集上应用 RCNs 的结果的文章。
参考资料:
[1] S. LeVine,人工智能先驱说我们需要重新开始(2017),Axios。
[2] D. George,W. Lehrach,K. Kansky 等,一种以高数据效率训练并打破基于文本的验证码的生成视觉模型(2017),科学杂志(第 358 卷—第 6368 期)。
机器人如何在不断变化的世界中“找到”自己?
原文:https://towardsdatascience.com/how-do-robots-find-themselves-in-an-ever-changing-world-19eda1956c56?source=collection_archive---------50-----------------------
机器人位置识别的 ELI5 介绍

由 Unsplash 上的 Tabea Damm 拍摄的照片
想象一下这样的场景:你和一个从印度旅行回来的朋友在一起。你游遍了印度,并推荐你的朋友去那里度假。当你们见面时,你的朋友告诉你曾在一座寺庙前看到一只戴着红帽子的猴子。你记得几年前见过那只猴子!你拿出手机寻找照片作为证据。接下来几分钟的对话听起来可能是这样的:“我知道它就在这里的某个地方!不,不。那是在我们参观瀑布之前。嗯。那是在海滩之后,我很确定……”令人沮丧,对吗?
假期通常持续一到两周,包括连续的假期快照。在你的手机上找到一段时间前拍摄的一张照片可能会很棘手。这可能令人沮丧,但并非不可能。我们直观地回放一系列的心理图像,这些图像提供了我们在任何一个时间点的位置信息。
地点识别
这种对先前看到的信息的识别和回忆构成了位置识别的问题。在你的手机上找到一张一只猴子戴着红帽子的假日照片也涉及同样的精神导航。当你翻阅图片时,你的大脑会回到过去,在脑海中回放假期的持续时间,定位你何时何地看到了这只猴子。
这是另一种解释。当你给某人指路时,通常会说这样的话:“一直往前走,直到你看到著名的汉堡店,向左转,然后你会看到一家药店就在你面前。”。在那里向右转…。如果他们无法将所见与你描述的相匹配,所有这些信息都是无用的。
在更大的范围内
现在,想象一下,如果你的手机日夜不停地捕捉图像。浏览所有内容,从几个月或几年前拍摄的一系列假日快照中找到一张戴着红帽子的猴子图片,几乎是不可能的。这恰恰是自动驾驶汽车要解决的问题。代替手机上的照片,这些机器人必须能够理解在其整个运行寿命中运动时捕获的连续视频序列流(相当于数百万张图像)。
对于机器人来说,大规模观测的成功定位是通过可扩展地点识别的过程实现的。
机器人像人类一样解决问题
作为人类,我们无时无刻不在脑海中带着世界的图像。自动驾驶汽车也是类似的情况。为了在旅途中做出有效的决策,自动驾驶汽车必须尽快理解永无止境的图像序列。**
人类和机器人也共享以 GPS 导航/定位工具的形式获得外部帮助的能力。然而,GPS 并不能在所有情况下对所有任务都足够精确——水下、地下、火星!当谈到自动驾驶汽车的可靠性及其做出准确、实时决策的能力时,这是一个问题。幸运的是,如果机器人,包括自动驾驶汽车,以前看到过一些东西,这些信息应该有助于自我定位。
回想一下你在一个新城市迷路的时候。随意走了一圈,突然看到一个你之前注意到的建筑,可能是因为颜色或者大小。多亏了你头脑中运行的地点识别算法,你可以计算出这座建筑相对于你的酒店的位置,让你安全返回。我们不考虑一个单一的图像或场景来识别我们在哪里。我们通过回放一系列相连的图像(和记忆)来理解事物,从而导航回您的酒店。
作为澳大利亚机器人视觉中心的一部分,我们已经将同样的“人类”策略应用于机器人。我们使用可扩展的地点识别来匹配机器人主动看到的与数百万先前观察到的图像。单个图像可能不足以提供定位信息。然而,从每幅图像中收集一点一滴的证据,并利用这些证据对序列进行推理,已经显示出定位的巨大前景,即使当图像的外观由于天气、一天中的时间等而改变时。
机器学习拯救世界?
虽然机器学习被用来解决机器人领域的大多数问题,但我们对顺序推理的关注采取了一种稍微过时的路线。正如我们在 2019 年 ICCV 上的工作所示,好消息是,顺序推理优于基于定制深度学习的方法来解决机器人的可扩展地点识别问题。这也让我们大吃一惊!
当前深度学习方法的一个很大的局限性是它们无法推广到看不见的场景。相比之下,我们已经证明了我们的方法在各种不同的测试环境中“开箱即用”。此外,因为在顺序推理中没有学习到的成分,我们的方法不受范围的限制,并且可以通过数百万个图像来了解它们。
前进的道路:接下来的步骤和挑战
自动驾驶汽车将很快在我们的道路上成为现实。为了安全导航,这些未来的机器人每次在道路上行驶时,都需要看到并理解无数的图像。
仍然有挑战需要克服。例如,作为人类,即使在变化的条件下,我们也很容易找到自己的位置。在黑暗或暴风雨的条件下,我们仍然可以在暴风雨的黑夜里看着我们的车窗外,仍然能够确定我们在哪里。然而,当一个位置的外观由于外部/环境因素(光线、天气、障碍物等)而改变时,机器人仍然很难解释图像。
一个更迫切需要克服的问题是的储存。自动驾驶车辆看到的所有图像都需要存储在内存中,以便能够对它们进行顺序推理。
我们目前面临的挑战是提出一种“终身地点识别方法,这种方法将在任何可以想象的情况下——无论天气或时间——大规模地持续运行。我们想结合我们目前对自己位置的了解来预测我们在下一个瞬间的位置。利用这些信息,我们可以限制我们需要推理的图像集。背后的推理是这样的。如果我知道我在阿德莱德中央商务区的某个地方,那么在下一个时刻,我很可能(实际上,在没有传送的情况下是不可能的)会发现自己在珀斯的某个地方。因此,让我们只查看靠*我当前位置的图像,并将其他所有内容标记为“不太可能”。
我们希望通过将顺序分析与内存管理结合起来,我们将能够实现一种方法,使自动驾驶汽车能够在任意大的图像集合中定位自己。
想象一下这个未来场景:自动驾驶汽车可以协同工作,捕捉世界在任何给定时刻的实时快照,以及世界每天是如何变化的。这种大规模的地点识别方法可以通过所有汽车的组合眼睛来观察世界,从而为每辆自动驾驶汽车实现精确定位。
激动人心的时刻,的确!
我们如何描述数据?
原文:https://towardsdatascience.com/how-do-we-describe-data-9ce688943c8e?source=collection_archive---------5-----------------------
描述性来自单词“describe ”,所以它通常意味着描述某事。描述统计学本质上是通过图形表示、集中趋势测量和可变性测量等方法来描述数据。它以一种有意义的方式总结数据,使我们能够从中获得深刻的见解。
数据类型
数据可以是定量的,也可以是定性的。定量数据是数字形式的,可以是包括有限数值的离散数据,也可以是除有限数值之外还包括小数值的连续数据。例如,一个班的女生人数只能取有限的值,所以它是一个离散变量,而产品的成本是一个连续变量。
定性数据不是数字,而是基于面试、考试成绩等方法。它可以是名义数据和顺序数据,其中名义数据不包含任何顺序,如性别、婚姻状况,而顺序数据有特定的顺序,如电影的评级、衬衫的尺寸。

作者照片
我们如何描述数据?
为了描述和分析数据,我们需要了解数据的性质,因为数据的类型会影响可以对其执行的统计分析的类型。
频数分布
它测量观察在数据中出现的次数。例如,包含班级学生性别的定性数据,描述的合适方法是男性和女性的频率。或者,对于关于人的年龄的数据,我们可能想要知道各种年龄组的频率,我们可以将数据分类为连续数据,以构建如下所示的频率分布。

作者照片
相对频率分布
有时,频率并不能给我们一个清晰的数据图像。假设您想知道哪个州的大多数学生注册了数据科学的在线项目。绝对数字可能给出模糊的观点,但是如果你用绝对数字除以注册学生总数,你会得到我们所说的相对频率。所以如果你读到有 200 名学生从班加罗尔市入学,你不知道这个数字是否很高。但是如果你被告知相对频率是 0.8,这意味着 80%的学生来自班加罗尔,你可能会认为这个城市的学生比其他城市的学生更倾向于数据科学。

作者照片
条形图
我们可以将频率分布以条形图的形式可视化,该图以高度或条与它们所代表的值成比例的方式绘制分类数据。我们还可以构建一个分组频率条形图来比较不同年份的不同数据集。这可以帮助我们了解数据中是否存在模式。

作者照片
柱状图
有时,通过取一系列值而不是每个单独的值来表示数据更好。假设我们想看看汽车在城市中行驶的速度。绘制每个速度单位没有意义,比如 60.2 km/h 或 74.3 km/h。因此,我们使用 50-60km/h 等范围来绘制直方图,直方图也使用条形图来以图形方式表示数据,但这里每个条形组都是一个范围。较高的柱表示更多的观察值落入该范围。我们可以通过直方图了解连续数据的形状和分布。比方说,我们想了解某个特定国家(比如印度)多年来的 GDP 变化。下图显示了印度的国内生产总值在过去十年中持续增长。

印度历年 GDP(以十亿美元计),作者照片
请注意,每个条形是一个描述年份的范围,比如 2010 年将涵盖从 2010 年 1 月到 2010 年 12 月的数据。因为它表示范围,所以它隐藏了特定月份的 GDP 等细节。在构建直方图时,必须选择适当的容器大小(也称为类间隔)。就像这里的框大小是一年,我们也可以选择一个季度或一个月。容器越大,容器就越小,分析的粒度就越小,因为它代表的细节就越少。
因此,一个 5 年的范围可能无法提供关于 GDP 在 10 年内如何变化的更深刻的见解。而月度范围将包含更多细节,但分析起来可能会很麻烦。然而,如果我们有数据显示工程师的工资范围,我们想知道有多少工程师属于这个范围。在这种情况下,bin 代表薪金,这是一个很大的数字,因此在这种情况下,bin 的大小越大越有意义,比如$50,000 或$100,000。您可以通过调整参数来绘制一些图表,看看哪一个给出的分析最好。理想的箱尺寸既不隐藏太多细节也不暴露太多细节。

作者照片
现在让我们假设我们想知道哪个国家的失业率更高。X 轴将列出国家和失业人口的绝对数量;然而,绝对数字也取决于该国的人口。像中国和印度是人口最多的国家,因此它们的绝对数字要大得多。因此,我们可以取失业人口的百分比,这将给出一个国家的失业人口比例,这在与其他国家的失业情况进行比较时更有意义。作为一名分析师,尝试分析直方图,看看其中是否有趋势。检查哪个区域的数据更集中,或者哪个区域的值很少或没有值。检查数据的偏斜度,是左偏斜还是右偏斜,即更多的条形分别向左或向右,这可能是得出结论的基本要素。
线形图
连线图是一种图形表示,用于理解分布的形状或趋势。它是通过连接柱状图箱的中点并用线将它们连接起来而构建的。

作者照片
使用线形图优于直方图的一个优点是,很容易在同一个图上比较不同的分布,而使用直方图可能会非常拥挤。图形表示可以帮助分析师做出决定,如是否在机器学习算法中包含一个变量。如下图所示,是学生前测和后测成绩的对比曲线图。它表明,与没有参加测试的学生组相比,如果他们的测试是以前进行的,较少的学生取得了较低的分数,而较多的学生取得了较高的分数。这意味着预先进行测试是提高课堂表现的一个重要因素。

作者照片
我们还可以构建显示累积频率的线图。基本上,频率或相对频率从左到右相加得到累积频率。这在执行一些不能仅通过频率执行的分析时非常有用,例如,如果我们比较两个部分的分数,累积频率可以显示 173,即 16%的学生分数小于或等于 75。

作者照片

作者照片
散点图
到目前为止,我们看到了如何使用变量在数据中出现的次数来描述变量。但是,如果我们想描述两个变量,以便检查它们之间是否有关系呢?散点图是一种非常基本和必要的方法。它使用点绘制两个不同变量的值,其中每个点代表一个特定的数据点。散点图可以让我们了解数据中是否存在模式;积极的趋势表明,随着 x 变量的增加,y 变量也增加,反之亦然。如果数据分布不均匀,这可能意味着变量不相关,所以我们可以在 ML 算法中删除它们。
在某些图中,变量可以如此正相关,看起来几乎是线性关系。在某些情况下,它可以是指数的,这传达了 y 变量随着 x 的增加而快速增加。散点图对于获得能够帮助我们做出关键决策的洞察力非常重要。假设我们构建了一个特定地区的农业用地面积和粮食产量的散点图。这通常会给我们一个正的关系,如果有极端的数据点,即土地面积较大但产量较低,这可能意味着这些土地面积没有得到充分利用,因此可以在这方面采取必要的行动。

作者照片
这些是我们描述数据的一些方法。我希望这篇文章对你有所帮助。感谢阅读!
数据科学课程—【https://padhai.onefourthlabs.in/courses/data-science
你如何给新 GPT 协议产生的学期论文评分?
原文:https://towardsdatascience.com/how-do-you-grade-a-gpt-2-generated-term-paper-fcfcd86b384?source=collection_archive---------16-----------------------
人工智能将颠覆学术界。这是件好事。

马克·拉贝在 Unsplash 上的照片
不管我们喜欢与否,人工智能将在咆哮的 21 世纪 20 年代彻底改变学术界的每个角落。
我们已经看到强大的语言模型 GPT-2 被用作、创意写作工具、视频游戏引擎、电影评论家。但是这种超级强大的语言模型将如何影响学术界呢?
我们来想象一个本科生,需要围绕这个主题写一篇十页纸的论文:“比较对比威廉莎士比亚的戏剧《暴风雨》中魔法的使用。
由于页面要求和紧迫的截止日期,本科生可以用现成的 GPT-2 版本(每个人都可以在网上看到)拼凑出一篇 B 级质量的学期论文。
在不到五分钟的时间里,我用对话变形金刚生成了两段还过得去的文字:
*The Tempest is an elaborate expression of the famous allegory of time and cyclical nature. With an interesting hybrid style, Shakespeare describes much of the setting of The Tempest in the form of a dream.Shakespeare uses magic in the story to enhance the sense of danger and enmity between the hero and the villain, who in turn use magic to empower themselves. After describing the magic of the island, the plot develops and reveals the native populace to be isolated, unequal, and politically and morally wrong. Both the creator and observer of the magic were major players in the plot, although in different ways.*
只要再多做一点工作,我们假设的学生可以很快用这种还过得去的散文写满 10 页。作为额外的奖励,他们可以搜集一个收集关于《暴风雨》的大学论文的数据集,并按照我的指示在 Google Colab 上对《GPT 2》进行微调。
可能性实际上是无穷无尽的。这些学生不会写 A+论文,也不会获奖,但 AI 生成的文本完全无法被抄袭检测器检测到。
事实上,早在 2005 年,一些麻省理工学院的学生成功地用一个不太复杂的语言模型骗过了一本学术期刊。麻省理工学院新闻报道了这个故事:
“麻省理工学院计算机科学和人工智能实验室 …的几个学生开发了【ed】’SCIgen,‘一个随机生成无意义的计算机科学论文的程序,配有逼真的图表、数字和引文……SCIgen 的工作就像学术上的各种‘疯狂图书馆’,任意插入诸如‘分布式哈希表’和‘拜占庭容错’等计算机科学术语。”"

照片由菲利普·布特在 Unsplash 拍摄
这是一个机会,而不是灾难
“我不担心学生用 GPT-2 来填充他们的论文,因为他们已经用几乎不加掩饰的抄袭来填充他们的论文了,”Mike Espinos 说,他是诚实教师播客的主持人和第八层教育的教育家。
Espinos 建议我们不要因为学生使用像 GPT-2 这样的人工智能工具而惩罚他们,而是应该把它们作为可教的时刻。他这样向我解释:
“使用 GPT-2 需要你对材料有足够的了解,以确定输出是否合适和适用。如果我在 GPT-2 中放入一个开始语句,可能需要几次尝试才能找到对所写内容的其余部分有意义的东西。使用像 GPT-2 这样的东西的关键学习机会是,它触发了教师需要关注的技能:信息获取和评估。”
今年早些时候,Espinos 使用 GPT-2 撰写了一封电子邮件给他的学术同事。他以这一点结束了这封信:“顺便说一下,这封邮件的大约一半是由一个人工智能程序编写的。我之所以提到这一点,是因为它强调了当你作为读者,甚至不能识别哪些是我写的,哪些是 GPT-2 写的,让我为每件艺术品写一页是多么毫无意义。”
换句话说,我们的学术体系是有缺陷的,强迫学生满足过时的页数要求和记忆信息。我们花了这么多时间担心像 GPT-2 和维基百科这样的数字工具,却错过了一个大好机会:可以解放学生,开创学术创造力的新时代。
埃斯皮诺斯这样总结道:
“在学校,我们仍然要求学生记忆和背诵事实。这是一种过时的做法,需要消除。我们生活在一个不断获取信息的世界,更重要的是培养技能,学会如何解析这些信息以找到有用的部分,丢弃错误的信息,并将这些信息应用于手头的任务。”
我们不应该害怕一个假设的数据科学学生微调 GPT-2 来写令人眼花缭乱的莎士比亚论文的未来,而是应该为 21 世纪的学生使用人工智能和互联网超越死记硬背并创造新东西而鼓掌。

在 Unsplash 上由 Jaredd Craig 拍照
过时的型号
在一次电子邮件采访中,埃斯皮诺斯分享了更多关于人工智能和学术界的想法。
继续阅读,寻找学习未来的新视角!
问:你担心学生用 GPT-2 文本填充论文吗?如果一个学生试图这样做,你会如何回应?
我已经不再把写作的质量和数量联系在一起了。我们应该根据长度来判断学生的过时想法是对学生(以及教育)的侮辱。
我们需要学生表现出理解能力和熟练程度。如果一个学生足够熟练,能够以一种写得很好的简洁的方式达到目标,那么他们在主题和写作技巧上都达到了很高的水*。
如果不告诉他们作业应该有多长,大多数学生都会超过作业的预期长度。
他们会这样做,因为他们更注重展示理解,而不是填充一个人工的单词数。
我批改论文已经很多年了,我可以说一个确定的长度就是你将得到的,仅此而已。达到长度后,工作几乎会立即停止,通常没有完成一个要点或想法。
我不需要知道谁赢了第三届超级碗,因为我可以问 Siri/Alexa/Google。如果某个领域的知识对学习者的日常生活变得重要,那么当他们成为某个领域的专家时,他们就不需要那么频繁地寻找答案了。
学习信息获取和评估将允许个人专注于他们感兴趣的东西,同时仍然向他们提供在其专业知识之外寻找信息的技能。

Brandi Redd 在 Unsplash 上拍摄的照片
获取、综合和应用知识
问:你认为在后 GPT 2 时代,我们应该放弃长度限制吗?有哪些替代方案?
答:我们可以用总结性评估代替论文长度,总结性评估要求学生综合信息,并根据他们的理解创造出独特的产品。
此外,我们需要停止认为书面作业是唯一可信的学习成果。
学生可以用各种方式展示自己的知识和理解力,但很少有机会这样做。
如果一名学生想制作一个 YouTube 视频来展示对该主题的理解,或者写一首歌,或者画一幅漫画,会怎么样?想想有多少学生能在学习中获得成功。
关键是要把每一个学生当作一个个体来对待。这听起来显而易见,但教育往往采取一刀切的方法来解决问题,然而所有的教育者都被教导要因材施教。
我认为我们可以鼓励使用 GPT-2,但我担心它会像其他革命工具一样遭到诋毁。维基百科是一个令人惊叹的研究工具,但尽管它被反复证明比传统百科全书更准确,但它几乎普遍受到教育者的质疑。
教育的目标应该是教会学生如何通过获取、综合和应用知识来提高自己。此外,为作业或课程写作需要一系列技能,这些技能不一定与大多数专业环境下写作所需的技能相同。使用 GPT-2 来共同写作将会暴露出他们的作品被其他人解读时的声音。

JESHOOTS.COM 在 Unsplash 上拍照
“拥抱他们学习的方式”
问:你认为 GPT-2 和其他人工智能语言模型会对学者和学生有帮助吗?
答:我已经转到行政部门,不再直接参与教学,但我与数百名教师合作,支持他们在课堂上使用技术。当我在会议上发言时,我会推广使用像 GPT-2 这样的工具(这会产生令人惊讶的影响)。
我们正处于一个时间点,教师需要承认他们在使用技术时不如学生熟练。
他们需要停止要求学生在老师感到舒适的补救水*上工作,相反,他们需要努力提高他们的技能,并在他们所在的地方满足学生。
作为教师,我们不能再忽视学生的趋势,必须接受他们学习和表达兴趣的方式。
学生们正在寻找使用技术的新方法,我们必须观察他们的行为来构建我们的课程,以利用他们的技能。
一个例子是谷歌搜索;当我的学生在谷歌上搜索一个新话题时,他们会搜索图片结果,而不是通常的谷歌搜索结果。他们通过视觉获取信息,而不是通过更传统的方式。这意味着他们使用一套完全不同的标准来选择点击什么结果。
今天的学生将决定未来 20 年我们如何与科技互动。
你如何从数据中做出统计推断?
原文:https://towardsdatascience.com/how-do-you-make-statistical-inferences-from-data-962a7d9f3870?source=collection_archive---------17-----------------------

戴维·特拉维斯在 Unsplash 上拍摄的照片
运用推断统计学调查女性工资低于男性的说法
你知道美国人的*均年龄是多少吗?你不用去谷歌。我已经在下面为你做了,

截图来自谷歌搜索
快速的谷歌搜索显示,美国人的*均年龄是 38 岁。你有没有想过人口普查局的统计人员是如何得出这个数字的?你认为他们会亲自或通过邮件去问每个人吗?不是因为仅仅为了找到一些统计数据并把它们大胆地放在他们网站上,这纯粹是浪费时间、金钱和资源。
那么他们是怎么做到的呢?他们使用推断统计学的一些基本原理。
好的,那么在这篇文章中,我们将使用统计推断来寻找以下问题的答案。
女性的工资比男性低吗?
在深入案例研究之前,让我们先了解一下推论统计学的一些皮毛。
推断统计学的一些背景知识
总体: 包含我们实验空间中所有数据点的集合。人口数量用 N 表示。
样本: 它是从总体中随机选择的一个子集——样本量用 n 表示。
分布: It 描述了数据/总体/样本范围以及数据在该范围内是如何分布的。
意思是: 来自你所在人群或样本的所有数据的*均值。这对于群体用表示,对于样本用 x̄ 表示。
标准差 是一个衡量你的人口分布情况的指标——用 σ 表示(适马)。
正态分布: 当你的总体围绕均值以σ标准差完美对称分布时,得到如下钟形曲线。

中心极限定理
来自维基百科:
在概率论中,中心极限定理 ( CLT )确立了,在某些情况下,当添加独立的随机变量时,它们的适当归一化和趋向于正态分布(非正式地为钟形曲线),即使原始变量本身不是正态分布。
下面的视频对中心极限定理有一个非常直观的解释
换句话说,这个定理表明,无论初始总体的形状如何,抽样分布总是接*正态分布。
标准差 是样本均值偏离总体均值多少的度量。

标准误差公式,其中σ是标准偏差,n 是样本量。
【样本量(n) 是样本总体的大小。下图显示了样本大小和标准误差之间的关系。随着样本量的增加,标准误差减小。

虽然选择一个大的样本大小没有问题,但是,这在大多数现实世界的复杂问题中是不可行的。因此,需要一个最佳的样本量。
置信区间 代表我们相当确信我们的总体意味着谎言的值的范围。在下图中,下限和上限都代表置信区间。置信区间之间的区域称为接受区域,而置信区间之外的区域称为拒绝区域。

p 值 是检测结果偶然发生的概率。换句话说,就是我们的总体均值落在拒绝区域的概率。p 值越低,表明测试结果的可信度越高。
显著性水*(α) 是设定的阈值 p 值,用于决定测试结果是否具有统计显著性。显著性水*通常设置为 0.05、0.01 或 0.001。如果测试结果的 p 值小于显著性水*(α),那么我们可以得出结论,所获得的测试结果在统计上是显著的,并且它们不是由随机机会或噪声引起的。
案例研究的数据收集
为了我们的分析,我们将使用从综合社会调查(GSS) 收集的数据,该调查自 1972 年以来主要通过面对面的访谈对美国公众进行年度调查。下面是他们网站上的描述。
GSS 旨在收集当代美国社会的数据,以监测和解释态度、行为和属性的趋势和常数;审查整个社会的结构和功能,以及相关小组发挥的作用;将美国与其他社会进行比较,以便将美国社会置于比较的视角中,并发展人类社会的跨国模式;让学者、学生、政策制定者和其他人能够以最少的成本和等待轻松获取高质量的数据。
GSS 的样本是使用区域概率设计抽取的,该设计从全国城市、郊区和农村的混合地理区域中随机选择家庭受访者。因为使用了随机抽样,所以数据代表了美国人口的整体情况。
好了,现在我们已经准备好了数据,让我们深入案例研究并寻找答案。
案例研究:女性工资比男性低吗?
动机
这是我们社会中一个非常基本的问题。在这个案例研究中,我们将调查这种说法是否站得住脚,或者只是社会上的另一种看法。
数据
对于我们的分析,我们将使用最新的可用调查数据(2018 年)。
我们将使用以下变量进行分析:
- 性别:这是参加调查的受访者自我报告的性别。
- conrinc :这是回答者经通胀调整后的年收入。
- 年龄:回答者的年龄。
- 种族:这是回答者自述的种族。
- uscitzn :此字段标识被调查人是否为 a)美国公民或 b)非美国公民或 c)出生在波多黎各、美属维尔京群岛或北马里亚纳群岛的美国公民或 d)在美国境外出生,父母当时是美国公民或 e)不知道。
我们执行以下数据清理来最终确定数据集:
- 年龄的最大值被设置为 89,因为我们有“89 及以上”这样的字段,这给我们的分析带来了困难。
- 我们创建了一个指标 uscitzn_ind ,如果回答者是美国公民(无论他们出生在美国境内还是境外),则取 1;如果回答者不是美国公民,则取 0;如果源字段中有无效值,则取-1。
- 我们注意到一些受访者报告他们的年收入为 0 美元。他们要么不工作,要么休息,要么呆在家里。因此,我们将从我们的分析中删除这些数据点。
探索性数据分析
让我们看看最终数据集的形状:
- 我们总共有 1363 个数据点。
- 我们有 646 名男性和 717 名女性。

让我们把数据分成两组;A 组有男性,B 组有女性。这是我们初始人口的分布。

男女人口分布
我们可以从初始人口分布中得出以下结论:
- 两组都是右偏分布,因此不是完美的正态分布。
- 男性人口*均数为 44K,女性人口*均数为 29K。
推理
我们首先定义我们的假设:
- H0(零假设): 男女的*均差异为零。
- H1(交替假设): 男女之间的*均差异大于零。
首先,我们需要为每组得出一个理想的样本量。使用下面的代码,我们计算两组的样本大小。
对于 95%的置信区间和 5%的误差,我们计算出 A 组(男性)的理想样本量为 242,B 组(女性)的理想样本量为 251。这是期望的置信度和误差规格所需的最小样本量。

使用下面的代码,我们将为两个组创建抽样分布:
这是两组的样本分布结构:

男性和女性的抽样分布
这些现在是完美的正态分布!由于中心极限定理,任何总体的抽样分布都呈正态分布。
不管总体分布的初始形状如何,抽样分布将接*正态分布。随着样本量的增加,抽样分布将变得更窄且更正态。
从抽样分布中,我们观察到男性的*均收入大于女性的*均收入。同样,它们的*均值之差为 14706.00。这是否意味着我们证明了这一说法?还没有,因为我们还不能确定从样本中获得的结果不是偶然的。
因此,为了确定我们的说法,我们对两个独立的样本比例进行了单侧 t 检验。t 检验需要以下检查条件:
- 独立性条件: GSS 数据基于随机抽样,因此我们确保两个样本组相互独立。
- 样本量条件: 每个样本量至少需要 30 个服从正态分布。我们确保我们两个组的样本量都远远超过 30。此外,我们确认我们的样本分布都是完全正态的。
使用下面的代码,我们计算 t 统计,自由度,临界值,p 值。

我们可以从 t 检验结果中做出以下解释:
- 较大的 t 值表明两组的均值差异较大。
- 每个 t 分数都有一个 p 值,p 值是样本数据结果偶然出现的概率。由于 p 值远小于我们期望的显著性水*α=0.05,因此测试结果具有统计学显著性,我们可以拒绝两组*均值相等的无效假设。因此,我们可以接受另一个假设。
有显著的统计证据表明,女性的收入低于男性。在显著性水*为 0.05 时,我们可以确定测试结果不是随机的。
置信区间
此外,我们可以使用以下公式计算均值差异的置信区间:

这里,s1 和 s2 是两个样本组的标准误差,n1 和 n2 是两个组的样本量。
使用下面的代码,我们计算 95%置信水*的置信区间。

我们观察到两组的均值差异很好地落在这个置信区间内。
更多有趣的见解
通过对不同的横截面组重复相同的分析,我们可以得出以下观察结果:
白人男女: 一般来说,白人女性的*均收入是白人男性的 65%左右。139 的 t 值也表明了巨大的差异。

黑人男女: 性别薪酬差距在黑人人口中并不十分显著。一般来说,黑人女性高达黑人男性的 95%。

移民男女: 对于移民人口来说,这种差别更大。一般来说,移民女性的收入只有移民男性的 48%。

千禧一代男女: 千禧一代女性的收入高达千禧一代男性的 69%。

中年男女: 区别对于中年人群来说还不算太差。中年女性的收入高达中年男性的 72%。

老年男女: 这种差别对于老年成年人、退休人口来说又变得更糟了。一个老年女性的收入只有老年男性的 58%。

结论
根据我们的研究结果,有显著的统计证据表明,女性的收入低于男性。
用于分析的所有代码和数据都可以从 GitHub 库下载。
您如何展示您的数据科学解决方案?
原文:https://towardsdatascience.com/how-do-you-present-your-data-science-solution-961c1d1d8dec?source=collection_archive---------28-----------------------
如何通过机器学习准备信用风险建模报告的示例

纽约公共图书馆在 Unsplash 上由拍摄的照片
周末是尝试机器学习新事物的时间,让这段时间变得有价值。记录机器学习方法和解决方案并与利益相关者分享是很重要的,就像最初设计它一样重要。
在今天的帖子中,我们将创建一个关于“信用风险建模”的 ML 解决方案的报告(这里领域偏好是明显的)。
让我们试一试。
第一步也是最重要的一步是彻底理解业务目标。对 ML 解决方案的期望是什么?
初步问题集:
有多少数据可用,有什么模式吗,在预测目标变量时是否足够?在现实生活中,是否有其他变量在决策中起着重要作用,但却不是可用数据集的一部分?可以找到它的来源吗?或者有没有一种方法可以代理这些信息?ML 算法可用的数据是否类似于生成预测的生产数据?换句话说,训练和测试数据是否来自相似的分布,从而能够很好地学习依赖关系,以预测看不见的实例?还有更多…
当我们着手解决这个问题时,我们会试着涵盖所有这些问题,所以请关注:
目标:
了解历史上不同借款人的特征和属性与其还款状态之间的关联,即其是否会导致好的风险或坏的风险。
信用风险的定义:
这是目睹债务违约的风险,可能是由于借款人未能支付所需款项而产生的。
目标变量:
良好(1 级,信誉良好)与不良(0 级,信誉不佳)风险。
数据描述:
包含 10 个变量的 1000 条记录

数据描述
理解数据是关键,确保理解每个变量的描述,例如:
- “信用记录”有 5 个值(0 到 4),但是它的普通性与信用风险有什么关系。值为 0 是否意味着信用记录较差,而值为 4 是否意味着信用记录较好?这类问题应该尽早提出,因为它们在进行探索性数据分析时设定了前提。
- 另一个快速浏览的数据总结告诉我们,“储蓄账户”有一个类别是 Nan。调查 Nan 意味着什么-缺少值或真正的数据条目。此处,“南”条目对应于“无储蓄账户”。
检查训练和测试数据分布:
ML 数据建模中最关键的假设之一是训练和测试数据集属于相似分布,如下图所示。请注意,列车数据用作估计客户未来信用价值的参考,因此 ML 解决方案是概率性的,不能基于过去的数据得到保证。这强调了ML 解的推广性质
- K-S 统计量是一个数值度量,用于检查两个分布是否相同的零假设。小于 p 值的 K-S 统计值表明我们不能拒绝两个分布相同的零假设。

K-S 统计量

“年龄”变量

'贷方金额'
蓝色直方图来自训练数据,绿色直方图来自测试数据,来自两个分布的直方图彼此有明显的重叠,意味着没有明显的漂移(或者换句话说,它们来自相似的分布)。
探索性数据分析:
让我们看看有多少缺失的记录:

空值
只有“储蓄账户”变量有 Nan 条目,我们最初的数据挖掘在这里很方便,我们能够通过用另一个类别“无账户”替换它们来处理这些 Nan。
此外,在撰写报告时,尝试创造性和创新性的方法来呈现分析,报告很有可能会被各种类型的受众(利益相关者)接受。
由于我们可能事先不知道报告的最终用户,因此在不丢失核心分析的情况下,尽可能简单地解释 ML 解决方案工作流程是很好的。
为此,我尝试如下:
- 在初始幻灯片中设置正确的上下文,这样就不会出现空白。
- 随着您在报告中的进展,逐渐增加复杂程度(也称为技术细节)。
- 它有双重好处——读者对最初幻灯片中相对较少的复杂细节感到自信,并能够根据初步理解从接下来的幻灯片中挑选相关信息。
- 此外,尽可能用可视化来帮助分析。

将分析放入报告的方法
重点应该是写一份简明的报告,同时不遗漏任何技术细节。
假设:
在你的分析中总会有一个点,在那里你需要打个电话来做出一些适合 ML 建模的假设。
总是强调这些假设背后的基本原理。如果它也呼应了业务同意,它会变得更令人满意。
例如,我们想检查年轻人是否更有信用。一种可能的方法是将变量“年龄”分为 3 类,如下所示。从 ML 建模的角度提供基本原理也让企业从技术的角度瞥一眼他们的数据。
在这里,我选择了 45 年来标记第二个 bin 的截止时间,很可能是 50 年(因为 50 年听起来更合理地假设人们厌恶贷款),但趋势分析没有足够的样本量来得出结论。因此,我倾向于采取中间立场,以 45 岁为年龄界限来对变量进行分类。

报告中的 EDA 快照
交叉验证:
通常,在验证数据上检查从训练数据学习的依赖性,以基于预先决定的评估度量来选择模型。然后,部署选定的模型,对测试数据进行预测。交叉验证将训练数据迭代地分成多个折叠,并保留一个折叠用于验证,我在分析中使用 5 折叠 CV。
决定评估指标:
它具有巨大的意义,需要一开始就与业务部门进行讨论。例如,在信用风险预测中,业务要求是如果客户被分类为好风险,则对预测给予更多惩罚,而实际上他们带来了坏风险。
业务案例的成本矩阵如下所示:

请介绍一下您的背景,所有指标都适用于这个问题:
在查全率和查准率没有偏好的情况下,一般采用 f 分值作为评价度量:2PR/(P+R),其中
- p:精度:专注于减少假阳性(FP)
- r:召回:专注于减少假阴性(FN)
在环境设置之后,解释您缩小范围的最终评估指标,并解释这种选择背后的原因。我使用Fβ分数作为评估指标,其中β表示回忆的权重。F1 分数与 Fβ分数相同,β= 1。
- 如上所述,当客户是坏风险时,将他们分类为好风险是有成本的,即预测好风险(第 1 类,正类)时,如果它是假的,即假阳性(FP)会根据我们的业务目标受到严厉处罚
- 精度= TP/(TP+FP),所以我们的目标是优先考虑精度,这转化为减少 FP。因此,我们需要更加重视从β< 1 获得的精度。
随意提供一些额外的知识(这没什么坏处),这些知识可能不是来自于商业,但却是值得讨论的。
- 如果目标是在预测不良风险是良好风险时给予惩罚,那么基于这样的 ML 建议,我们将能够避免因限制贷款而造成潜在的业务损失。
- 在这种情况下,重点将放在假阴性(FN)上,即当客户处于良好风险类别时,您预测的是不良风险(0 级,负级)。因此,我们预测了负的错误,这意味着更多的重点应该放在减少 FN 上,这反过来会导致更多的回忆权重(TP/TP+FN)
管道流量:
从原始输入数据通过数据处理管道到模型选择再到预测,直观地呈现您所采取的所有步骤的摘要被认为是很好的。这一步将所有组件连接在一起是我个人最喜欢的,因为它带来了一个抽象层次,并给出了完成最终预测所做的事情的清晰画面

ML 管道流量
解释预测:
最后,这一切都归结于你如何解释这些预测。在给出你选择的模型“可解释性框架”的背景后,给出解释“为什么”的描述:

模型可解释性
请注意,没有一种方法可以接* ML 解决方案,因此,即使是制作报告,这也是我提出解决方案的方法。希望它对你有一些价值。
我愿意与读者交流,从他们的经历中学习,这是交流结果和方法的更好、更有效的方式。
报告和 Jupyter 笔记本放在这里。
到那时,快乐阅读,快乐学习!!!
哪些比较重?狗还是猫?
原文:https://towardsdatascience.com/how-do-you-statistically-prove-that-dogs-are-heavier-than-cats-380d23b12b76?source=collection_archive---------43-----------------------
机器学习的应用统计学

图片由来自 Pixabay 的 Michal Jarmoluk 拍摄
狗比猫重吗?如果你认为答案是肯定的,你将如何从统计学上证明它?
如果你不熟悉科学过程,这个问题对你来说可能看起来很简单。你可能会想到称 20 只狗和 20 只猫的体重,计算狗和猫体重的*均值,然后简单地比较结果。如果猫的*均数是 9 磅,狗的*均数是 18 磅,你可以说:“狗比猫重。”当事情明朗时,这种方法可能会奏效。但是如果猫的*均值是 9,狗的*均值是 10,你能确定狗比猫重吗?如果你在比较 9.1 的*均值和 9.2 的*均值呢?
案例并不总是像比较狗和猫那样简单。科学过程有许多重要的应用。假设您正在研究一种针对癌症患者的新开发的治疗方法,并且结果彼此非常接*,您将确定一个阈值来决定这种治疗方法是否在统计学上显著减少了癌细胞。你不会期望发现治疗癌症的奇迹。你只是期望病人的情况有显著的改善。
让我们回到我们可爱的狗和猫身边。
来源吉菲作者 M OODMAN
统计分析
我们的问题是:狗比猫重吗?我们回答这个问题是在做哪种分析?
统计学中有两种分析。
描述性分析
描述性分析给出以某种方式描述数据的信息。我们以更有意义的方式呈现数据,并对数据进行更简单的解读。
我们使用两种主要的测量方法来描述数据:
- 集中趋势的测量:*均值、中间值和众数。
- 传播的测量:标准偏差,绝对偏差,方差,范围和四分位数。
推理分析
推理分析是从一个样本中了解一个群体的情况。它允许我们从数据中做出推论。我们从样本中获取数据,并对总体进行归纳。
在推断统计学中,我们无法证明某些东西,因为我们没有总体数据,但我们可以通过展示样本数据中的一个例外来反驳某些东西。
- 估计参数:我们从样本中提取一个统计量并预测一个总体参数。
- 假设检验:我们提出一个无效假设和一个替代假设,并使用样本数据来回答总体问题。
我们在回答猫狗问题的同时,也在做推理分析。因为我们试图通过对两个样本的描述性统计数据进行概化来对所有狗和所有猫的种群参数进行推断。
假设检验:
一个假设可以被认为是我们正在测试的一个想法。假设总是关于总体参数,而不是样本统计。
我们试图证明狗比猫重,我们以这种方式设定假设。
虚假设
零假设是我们正在测试的想法。
"狗没有猫重."
“狗和猫的*均体重与相等”
"猫和狗的*均体重没有差异."
替代假设
另一个假设是我们正在测试的想法。
"狗比猫重。"
“狗的*均体重比猫多
"猫和狗的*均体重有显著的差异."
抽样
确定样本量
说到样本量,我们说“样本越多,结果越好”。但是更多的样本意味着更复杂的研究、更多的钱和更多的时间来完成我们的研究。
因此,我们确定置信水*、误差幅度和人口规模,并计算最小样本量来完成我们的研究。
这里的是一个在线样本量计算器,用于计算统计推断的最小样本数。
有偏样本
当总体中的一个或多个部分比其他部分更有可能在样本中被选中时,就会出现有偏样本。无偏的样本必须能代表整个总体。

图片来自 Pixabay 的 Petr Ganaj
如果选择不同国家的宠物猫和流浪狗,决定猫比狗重也不是不可能。

图片来自 Pixabay 的 Andreas Almstedt
猫和狗的品种
品种呢?猫的体重没有很大的差异(5 磅到 15 磅),但是对于狗来说,体重可以从吉娃娃的 3 到 6 磅变化到爱尔兰猎狼犬的 180 磅。

爱尔兰猎狼犬和吉娃娃,图片来自的大卫·马克
男性和女性重量
男性的体重比女性重。我们需要对我们人口中的亚群体保持谨慎。
取样方法
简单随机抽样
简单随机抽样是一种方法,在这种方法中,人口中的每个成员都有*等的机会被选中。SRS 是理想的抽样方法,但是由于许多原因,我们有时不能从总体中进行随机抽样。
对于狗和猫的情况,我们可以使用随机抽样,但我们需要确保我们有足够的所有品种的样本。
分层抽样
我们把人口分成类似的阶层。在每一层中,我们取一个 SRS 并组合 SRS 以得到完整的样本。
在猫狗分析中,分层抽样是一种易于实现的解决方案。我们的阶层是猫狗品种。我们从每个品种中随机选择足够数量的狗和猫。
我们也需要划分女性和男性阶层。如果世界上有相同数量的雄性和雌性狗和猫,我们就取相同数量的雌性和雄性动物作为样本。世界上雌雄猫或狗的数量相等吗?这是另一个统计分析的主题。
巢式抽样法
集群是一组有共同之处的主题。在整群抽样中,我们将人口分成自然群体。我们假设这些群体代表了人口。我们可以根据它们的位置创建集群,并执行 SRS。整群抽样是高效且经济的,但是该群可能不代表总体,这可能导致较高的抽样误差。
在猫和狗的情况下,我们可以选择一个邮政编码,找到这个邮政编码中的兽医诊所,并找到来到这些兽医诊所的猫和狗的体重。这比在世界各地寻找随机的兽医诊所容易,但是不同的品种和体重会导致抽样偏差。有必要找到尽可能多的集群(邮政编码)。
系统抽样
我们不是完全随机选择,而是按顺序选择。
在我们的例子中,我们可以在以零结尾的邮政编码中选择宠物商店,并从那里获取样本。
方便性选样
方便抽样也称为随机抽样、机会抽样或偶然抽样。你选择最简单的方法来获取你的样本。
在我们的例子中,如果我们去最*的宠物店、兽医诊所或动物收容所,并获得猫和狗的重量,我们就做了方便取样。很容易获得样本,但获得有偏差样本的可能性很高。
抽样误差
抽样误差是样本和总体之间的差异。即使我们使用最好的抽样方法,也可能出现抽样误差。为了减少抽样误差,我们应该尽可能地增加样本量和随机化选择。
非抽样误差
非抽样误差是除抽样误差之外的所有形式误差的总和。
在计算动物的重量时,我们可以计算出测量误差。我们甚至可以在数据输入期间制造处理错误。
我们可以在数据清理过程中进行调整误差。例如,来自美国以外国家的动物的重量单位将会是公斤。我们在把千克换算成磅时可能会出错。
误差概率
在科学过程中,你可以得出一个结果,但你需要澄清偶然得出这个结论的概率。
显著性水*
显著性水*(Alpha 阈值)是当零假设为真(I 型错误)时,您认为它是错误的概率。alpha 值为 0.05 表示当您拒绝零假设时,您愿意接受 5%的出错几率。
汇总统计数据
集中趋势
我们通过计算*均值、中值和众数来总结数据的位置。在每种情况下,我们都应该决定哪些汇总值最能代表分布。
在猫狗问题中,计算*均值似乎是最合适的统计。
传播的度量(变化)
传播的度量告诉我们数据是如何在中间传播的。均值、中值和众数如何表示数据?
范围
该范围采用数据集中的最小数字,并从数据集中的最大数字中减去该数字。这个范围给了我们两个极端之间的距离。范围越大,数据越分散。
在我们的例子中,狗的体重范围大于猫的体重范围。
四分位数间距(IQR)
IQR 查看中间 50%数据的分布,并给出核心值的概念。IQR 是第一和第三个四分位数之间的差值。
我们可以使用在线计算器来计算我们的狗和猫体重的 IQR。
差异
方差衡量数据点围绕其*均值的离差。
样本方差等于观察值和样本*均值之间的*方距离之和除以观察总数减 1。
数据点越接**均值,我们获得的方差就越低。正如我们上面提到的,狗的方差会比猫的方差大。
标准偏差
标准差是方差的*方根。这是数据集可变性中最常见的可变性。
在大多数统计中,标准差比方差更有意义。因为方差有*方单位,结果不如标准差有意义。
在猫和狗的例子中,我们的方差单位是磅*方,标准差单位是磅。因此,标准差告诉我们更多关于数据在可解释单元中的分布。
变异系数(相对标准偏差)
变异系数等于标准偏差除以*均值。我们需要相对标准差来比较两个不同数据集的方差。
在我们的案例中,我们使用相对标准偏差来比较猫和狗体重的变化。
选择正确的统计检验
有大量的统计测试,其中一些是学生的 t 检验,曼惠特尼 U 检验,卡方检验,相关性检验, K-S 检验,和方差分析。
我们通过问这些问题来选择正确的测试:
- 数据是名义的(分类的),顺序的还是数量的(区间比)?
- 我们有多少样品?
- 我们想证明什么?我们分析的目的是什么?
在我们的例子中,重量是定量数据。因此,如果我们有超过 30 个样本,我们使用学生的 t 检验,如果我们有少于 30 个样本,我们使用 Mann- Whitney-U 检验。(这个有争议!)
t 值用于测量*均值相对于样本数据变化的差异大小。
当因变量是连续的,但不是正态分布时,Mann-Whitney-U 检验比较两个独立组之间的差异。**
神奇的数字:
为什么我们要根据一个数字来选择考试?t 检验假设数据具有正态分布。但是,如果样本容量小于 30,我们就不能检验正态性。
解释结果
找到 t 统计量和 p 值后,我们将 p 值与我们在分析开始时确定的阈值进行比较。
p 值是犯第一类错误的概率。p 值告诉我们,如果零假设为真,得到这样一个结果的概率。例如,如果 p 值为 0.01,这意味着即使假设为真,也有 1%的几率拒绝零假设。
如果 p 值小于阈值,我们能够拒绝零假设。
如果 p 值大于阈值,我们不能拒绝零假设。
结论
你读了一篇关于数据分析的应用统计学评论。我们问了一个非常简单的问题,并概述了数据科学中使用的许多统计概念。
狗比猫重吗?我们还没拿到数据呢!我要去最*的动物收容所给猫狗称重。
你应该对我说:“住手!你犯了一个方便的错误!”
你是如何在 Kickstarter 上成功的?
原文:https://towardsdatascience.com/how-do-you-succeed-on-kickstarter-c047c60085cf?source=collection_archive---------36-----------------------
项目成功的探索性数据分析

图片由 Immo Wgmann 提供
简介
你是否在计划一个特别的项目,比如一部电影、一张专辑、一部戏剧,甚至一家餐馆?如果是这样,那么在一个融资*台上展示你的想法可以增加你实现想法的机会。Kickstarter 就是这样一个*台,在这里,富有想象力、创新性和雄心勃勃的项目通过其他人的支持得以实现,这些人被称为支持者。
支持者承诺通过资助项目,不仅帮助他们实现,而且支持一个创造性的过程。项目创建者通过提供独特的奖励来感谢支持者的支持,奖励包括将项目的一部分分享给支持者社区,如限量版或折扣。
我第一次听说这个*台是在我点击一个名为 MagicLingua 的未来语言学习应用的广告时。这个链接把我带到了这个应用的 Kickstarter 页面,其中包括通过说而不是打字来学习外语。不管怎样,在它启动的时候,420 个支持者承诺€53051 来帮助实现这个项目。这款应用在应用商店有售,并且有一个网站。现在我正在通过这个应用程序学习德语,我有点希望我是一个支持者。

图像由 MagicLingua 提供
虽然许多项目看起来令人兴奋,但也有一些项目最终没有实现。总的来说,令人惊讶的是,Kickstarter 项目失败的比成功的多。为什么?一些原因包括:他们没有达到他们的目标,他们没有达到他们的目标,他们没有获得他们前进所需的资金。这并不一定意味着你的想法最终会失败。从好的一面来看,达到目标的项目筹集到了几百到几千甚至几百万美元的资金。此外,只要你从其他成功或失败的人那里学习,你就可以开展一项运动,为你带来成功。

图 1 —项目成果的相对频率(图片由作者提供)
为了了解 Kickstarter 项目的结果,我使用了该*台的项目数据来探索对支持者和项目目标的影响。本次分析使用的数据涵盖了 2009 年至 2018 年的 378661 个项目和 19 个变量。这些变量包括项目名称、主要类别、次要类别、国家、截止日期、启动日期、承诺金额、支持者数量、项目状态(结果)、目标和国家。本帖将重点讨论以下问题:
1—哪些项目类别更有可能成功?
2—项目结果和筹款目标之间有什么联系?
3-哪些类别在支持者中很受欢迎,其中哪些子类别远远落后于他们的目标?
第 1 部分:哪些项目类别更有可能成功?
数据有两个类别变量—主要类别和次要类别。对于这一部分,我将把重点放在主类别上,因为它的层次较少。最常见的类别是电影&视频、音乐、出版、游戏和技术。

图 2 —根据数据显示的主要类别频率(图片由作者提供)
鉴于项目成功的频率较低,有一些类别的成功频率较高。这些主要类别是漫画、戏剧和舞蹈项目。漫画的成功概率是 0.53,舞蹈项目是 0.61,戏剧项目是 0.6。如果你的项目想法属于这三类,你可能会有好运气。另一方面,其他类别失败的几率要高得多,尤其是新闻、技术和食品项目。

图 3 —按主要类别划分的成功/失败概率(按作者划分的图片)
回头看图 2,漫画、戏剧和舞蹈项目是 Kickstarter 数据中出现频率最低的项目,这很好地解释了为什么这些类别具有较高的成功概率。此外,更频繁的类别最终的成功概率明显更低还有其他原因。未来将探讨的因素包括项目筹资目标、支持者人数等。
第二部分:筹款目标如何促成项目成功?
Kickstarter 项目失败的一个最常见的原因是他们的融资目标太高。该*台的融资流程由一个要么全有要么全无的模式组成——如果一个项目没有达到目标,资金既不会被收取,也不会从支持者的银行账户转移。这便于支持者在确信项目会成功的情况下为项目认捐资金。
因此,如果承诺的金额超过了目标,那么它很可能成功了。否则,它很可能不会前进。根据 Kickstarter 的数据,从 2009 年到 2017 年,大约 36%的项目达到了筹款目标。

图 4——与项目状态相比,按目标划分的项目成果(图片由作者提供)
对于达到目标的项目,98%成功了,1.2%未定义,不到 1%被取消或暂停。另一方面,对于没有这样做的项目,16%被取消,82.7%失败,不到 1%被暂停或未定义。因此,我们可以看到,与承诺金额相比,目标金额也是项目成功的一个指标。这个变量可以被称为“目标结果”现在,让我们来看看这两种结果在目标金额方面是如何比较的。
根据图 5,左边的条形图表明成功的项目往往有稳定的年*均值,每个条形图顶部的置信区间较小,这表明估计值的可变性很小。这些估计还意味着,要想成功,创作者往往会设定目标,不仅给观众灵感,还能让他们相信目标是可以实现的。
另一方面,不成功的项目包含反映钟形曲线的年*均值。右边的图表包含了更宽的置信区间,不像左边的图表。按年度细分,年度目标往往显示出更高的可变性,这意味着这些目标的变化很大,从接*零到数千到数百万到数亿美元。考虑到这一点,当一个成功项目的最高目标仅仅是 200 万美元时,有多少人会承诺一个成本超过 1 亿美元的项目呢?

图 5 —按年份划分的*均筹款目标(2013–2017 年)(图片由作者提供)
根据上面的图表,项目成功的概率随着资金目标的增加而降低。因此,无论你的项目看起来多么令人兴奋,你都希望在规划阶段接触尽可能多的人,尤其是如果你必须筹集* 100 万美元的资金。如果你有良好的进展,支持者愿意承诺,这取决于你的最后期限。
第 3 部分:哪些类别在支持者中很受欢迎,其中哪些子类别远远落后于他们的目标?
项目成功的另一个主要因素是支持者的数量。支持者承诺为项目做贡献有几个原因,包括支持朋友的项目,支持他们钦佩的人的新努力,受项目想法的启发,以及项目奖励的激励。支持一个项目不像购买一个产品,而是承诺支持他们希望在现实世界中实现的创意。
当谈到目标结果时,项目类别显示不同的支持者分布,其中较成功的项目比不太成功的项目有更多的支持者。具体来说,我们可以在下面的热图中看到一些成功的类别中的黑点。

图 6 —热图:按项目类别和项目成果划分的*均支持者(图片由作者提供)
相对而言,游戏项目通常*均有 807 名支持者,此外还有 716 名技术支持者和 609 名设计支持者。更有趣的是,这种类别顺序在失败的项目中几乎相同,游戏项目除了设计方面的 33 个以外,*均有 47 个支持者,技术项目有 21 个。
承诺的金额与支持者的数量有很强的线性关系——支持者越多,承诺的金额越高。因此,一个有趣的后续问题是:在三个主要类别中,子类别在多大程度上偏离或超过了它们的目标?换句话说,相对于项目子类别,承诺金额和目标金额之间的资金差异如何?资金差额的计算方法是从承诺金额中减去项目目标金额(承诺金额-目标金额)。这种差异对于不成功的项目是负的,对于成功的项目是正的。此外,这些方法根据项目的结果来衡量项目错过或超过目标的程度。
看看游戏、技术和设计类别,下面的条形图按子类别和目标结果显示了*均资金差异。对于游戏项目,八个子类别中有四个非常突出。*均而言,直播游戏未能实现其目标约 208,969 美元,而游戏硬件和视频游戏分别未能实现约 90,062 美元和 83,939 美元。另一方面,游戏硬件超出目标 130,492 美元,因为桌面游戏和视频游戏分别超出目标 45854 美元和 38552 美元。
对于技术子类别,最有趣的是太空探索,它落后于其目标 895,744 美元,因为机器人仅落后 109,043 美元。从积极的方面来看,超出目标最多的子类别包括 3D 打印、相机设备、制造工具、可穿戴设备和声音项目。
对于设计项目来说,最落后于目标的两个子类别是建筑和市政设计项目。建筑项目*均落后 547,242 美元,而市政设计项目落后 229,955 美元。似乎超出他们目标的子类别是产品设计、一般设计和印刷项目。

图 7-游戏、技术和设计 Kickstarter 项目的子类别资金差异(图片由作者提供)
*均超出或下降的金额让我们了解子类别在财务上的表现以及这些项目的成本。此外,该分析将目标、支持者和承诺金额放在一起。所以,如果你的项目涉及太空探索,要小心达到你的目标会非常困难。然而,如果你的项目是建筑、市政设计或现场游戏,难度会小一些。由于游戏项目是最受欢迎的,游戏硬件和桌面游戏在 Kickstarter 上展示会非常酷。
结论
在这篇文章中,我们通过对 Kickstarter 历史项目的数据分析,从三个不同的方面考察了 Kickstarter 项目的成功。
- 成功概率最高的主要类别是舞蹈、戏剧和漫画项目,尽管它们属于最不常见的类别。
- 项目目标在项目成功中起着重要作用。每年,成功的项目与不成功的项目相比,目标金额的差异要小得多。这表明每个创造者必须设定一个目标,让支持者对他们的成功充满信心。
- 最后,我们发现在游戏、设计和技术项目中,哪些子类别落后于或超过了它们的目标。这向我们展示了哪些项目子类别的财务表现。
这些观察结果可以让你对 Kickstarter 如何工作有一个基本的了解,以及你脑海中的潜在想法是否能在这个*台上成功。
用于此分析的代码可以在这里找到。
神经网络是如何学习的?
原文:https://towardsdatascience.com/how-does-a-neural-network-learn-f33bcff61026?source=collection_archive---------28-----------------------
在本系列的第二部分中,我们将讨论神经网络如何通过向前和向后传播来更新权重和偏差,以适应训练数据。这些可以用来预测未来的数据,这是以前没有过的。

在 第 1 部分——为你的神经网络 使用正确的维度中,我们讨论了如何为你的神经网络架构中的向量和矩阵形状选择一致的约定。虽然不同的软件实现可能使用不同的约定,但是有了坚实的理解,就很容易知道需要什么样的预处理来适应模块设计。
[## 为你的神经网络使用正确的维度
当建立你的人工神经网络时,一个令人沮丧的错误是得到向量的形状和…
towardsdatascience.com](/using-the-right-dimensions-for-your-neural-network-2d864824d0df)
在这一部分,我们将扩展我们的知识,以了解神经网络如何通过提供的训练集进行学习。我们将在本文中使用单隐层神经网络来说明下面的关键概念:
- 线性函数和非线性激活函数
- 使用权重和偏差的随机初始化开始滚球
- 使用正向传播来计算预测
- 使用损失函数来计算我们离地面真相有多远
- 使用反向传播使每个权重和偏差更接*事实
- 冲洗并重复——就这么简单!
在本文中,我们将构建一个简单的二进制分类器架构来预测图像显示的是猫还是非猫(出于某些原因,几年前开始 ML 的人一定喜欢猫——你看到的许多例子都涉及这些可爱的动物!)

整体单层架构
架构快速概述
训练集的原始形状是(209, 64, 64, 3),代表猫和非猫的 3 通道 64 乘 64 图像。探索数据的 Google Colab 脚本可以在下面找到,尽管本文不会深入研究构建前馈神经网络的完整代码。我们将在下一篇文章中讨论代码实现。
阅读并探索训练数据集
在最后两个代码块中,我们将维度减少到一个黑白通道,以保持简单。在未来的文章中,我们将探索卷积神经网络(CNN)如何更好地完成图像识别任务,因为它保留了图像二维中的像素关系。现在,我们将在训练集中展*图像,得到一个形状为(64*64, 209)的输入矩阵。
可训练参数的数量
对于每个训练示例,输入包括 4096 个特征,每个特征表示原始图片中的一个像素。
隐藏层由 8 个神经元组成。回想一下我们在第 1 部分中的约定,权重矩阵的形状为(8, 4096),偏差向量的形状为(8, 1)。总之,这个简单神经网络的隐藏层总共有(8 * 4096) + 8 = 32,776个可训练参数。
输出层包括单个节点,因此输出节点的权重矩阵具有(1, 8)的形状,产生 9 个可训练参数(8 个权重和 1 个偏差)。
因此,该模型总共有可以训练的32776 + 9 = 32,785参数。
每个神经元都有一个形式为z = wᵢxᵢ + b的线性函数,在上面的例子中 i 代表从 1 到 4096 的值。然后,将每个结果传递给非线性激活函数g(z)。
在我们的例子中,这会产生一个形状为(8, 209)的矢量,它将被输入到输出层。我们示例中的输出层是一个执行二元分类的单个节点。
现在,让我们浏览一下关键概念,以了解神经网络如何通过这种架构进行学习。
线性函数和非线性激活函数
如果我们观察每个神经元,我们会发现既有由z = wx + b表示的线性函数,也有非线性激活函数。这种简单的设置允许非线性拟合,同时保持功能简单。
正如您将在稍后讨论反向传播时看到的,我们使用导数来最小化预测损失,并相应地调整权重和偏差。线性和非线性函数的这种简单使用允许我们实现期望的非线性,同时保留使用链式法则来容易地计算导数的能力。但我们稍后会谈到这一点。
我们在第 1 部分讨论了使用 sigmoid 函数作为激活函数。该功能定义为:


Sigmoid 函数
sigmoid 函数不常使用,因为使用 ReLU(整流线性单元)有更有效的实现方式,我们将在后面介绍。然而,由于其输出被限制在 0 和 1 之间的性质,它对于二进制分类任务仍然是有用的。
像这样的函数也会遇到通常所说的 消失渐变问题 。在输入值的极值处,函数的斜率接* 0。如果您还记得,我们将在反向传播过程中使用导数来最小化损耗参数。当输入值较大时,这些激活函数会带来挑战,导致导数(斜率)接*于零。这导致非常小的增量,意味着非常慢的学习!
这也是我们通常将输入标准化为通常在-1 和 1 之间的值的部分原因。当我第一次开始学习这个话题时,我不知道为什么需要这个…数字就是数字,对吗?大多数文献仅指出,当输入被缩放到-1 和 1 之间或 0 和 1 之间的一个数时,网络将表现得更好,这取决于场景。
理解消失梯度问题让我们对为什么建议标准化输入有了一些了解。
如今更常用的激活函数是整流线性单元(ReLU)。数学上,ReLU 可以定义为:


整流线性单元
有趣的事实:从技术上讲,当 x 正好等于零时,梯度是不存在的。但是这种情况发生的概率非常小,如果发生这种情况,你可以通过编程将梯度设置为 0。不是真正的实际问题。
通过编程,可以很容易地将它定义为 0 和输入值的最大值。
g(z) = max(0, input)
该激活函数在反向传播期间的另一个附带好处是,对于任何非零值,该函数的斜率简单地为1。尽管对于正值可以避免消失梯度问题,但如果其中一个神经元上存在较大的负偏置(实际上,该神经元将停留在负侧,并始终输出值 0),它仍会导致所谓的“死亡 ReLU”。这个神经元实际上是“死亡”的,因为它不再在拟合过程中起作用。
一些实现使用称为泄漏 ReLU 的混合方法来解决这个问题,其中:


泄漏 ReLU
对于本系列,我们将只对隐藏层使用 ReLU,对输出节点使用 sigmoid 函数(同样,只是因为我们正在进行二进制分类)。如果你有兴趣阅读更多关于其他混合 ReLU 激活功能的信息,下面是刘丹青的一篇有趣的文章:
[## ReLU 实用指南
开始使用和理解 ReLU,没有 BS 或花哨的方程式
medium.com](https://medium.com/@danqing/a-practical-guide-to-relu-b83ca804f1f7)
网络的首次尝试
在第一次训练运行之前,权重矩阵被初始化为一个 非常小的随机数 。
重要的是权重从一个小的随机数开始。如果所有的权重都初始化为零,那么由于z = wx + b,所有的输出都将为零。具有相等的权重不会像反向传播的误差都相等那样有效,从而导致所有权重被更新相同的量。
第一次运行时,偏置向量可以初始化为 0。
显然,网络的第一次尝试真的只不过是一个随机的猜测!
正向传播
前向传播是采用输入、权重、偏差和激活函数来计算每个阶段的值的过程。例如,在我们的单层架构中,计算将按以下顺序进行:

显示正向和反向传播的框图
- 计算 Z1
记住z = wx + b,我们本质上会做以下矩阵乘法。下面的等式显示了一个训练示例的矩阵乘法,但是在应用整个训练集之后,Z将是具有形状(8, 209)的矩阵。

- 计算 A1(激活函数)
我们在隐藏层上使用 ReLU,因此 A1 将简单地计算为 0 的最大值和 Z1 的当前值(即任何负数都变成 0)。 - 将 A1 送入输出层
矩阵 A1(也具有(8, 209)的形状)现在将作为输入送入输出层。 - 计算 Z[L]
在这个最终输出层中,权重矩阵具有(1, 8)的形状。另一个矩阵乘法将产生一个形状为(1, 209)的最终输出,然后将其传递给一个 sigmoid 函数。 - 计算 AL
我们将计算出的值传递给 sigmoid 函数,这将导致返回一个介于 0 和 1 之间的值。
计算损失函数
此次运行的预测基于模型的权重和偏差,对于此二元分类示例,输出为 1 或 0。这与我们作为训练集的一部分提取的标签中的基本事实进行比较(读入train_set_y变量)。
对于二进制分类,损失函数用于每个训练的例子如下。

损失函数—二元分类
直观地,你可以看到这是如何实现我们所需要的,对于基本事实,y = 0 或 1 的情况。记住对数曲线在x = 1处切割 x 轴是有帮助的。

对数函数


损失函数的直观解释
成本函数是训练集上所有损失的*均值,这是我们想要最小化的等式(即,对其他参数求导)。

成本函数—二元分类
使用反向传播来调整权重和偏差
网络将使用反向传播的概念来调整权重和偏差。为了直观地理解这一点,你需要考虑这一点。
- 我们希望最小化关于可训练参数的成本函数,即 W 和 b 应该调整到什么?此图显示了正向传播中使用的函数以及相应的导数。

显示正向和反向传播的框图
- 为了最小化一个参数,我们进行求导,在这种情况下,这意味着我们希望获得以下结果:

对成本函数 wrt a 求导
这个导数的证明超出了本文的范围,尽管其他一些作者已经就此写了一篇完整的文章。我很喜欢阅读 Patrick David 在本文中提供的推导细节:
[## 所有的反向传播导数
你已经完成了吴恩达在 Coursera 上的深度学习课程…
medium.com](https://medium.com/@pdquant/all-the-backpropagation-derivatives-d5275f727f60)
- 我们使用衍生产品的链式法则来计算以下内容:

计算成本函数权重导数的链式规则
- 然后,我们更新这些权重和偏差:

其中,α是学习率的超参数。我们将单独讨论细节,但是它定义了微调的程度。太小,学习过程会很慢。太大,你可能会超过当地的最小值。调音是一门艺术和科学。
重复
然后,上面的过程会重复您定义的迭代次数。这个变量被称为模型的超参数,类似于你在上面遇到的学习率。这些是不可训练的参数,调整这些超参数是一门艺术也是一门科学。我们将在以后的文章中对此进行更多的讨论。
结论
这是一个非常沉重的话题,但我希望它在高层次上强调了神经网络如何通过前向传播进行学习,并随后通过对反向传播中的成本函数求方程的导数来推动权重和偏差。
主要是通过这种反向传播,权重和偏差被缓慢地推到一个使成本最小化的值,这有效地使精度最大化。这就是为什么你总是听到人们说训练神经网络是为了最小化成本,而不是为了最大化精度。
如果你第一次没有理解这些概念,不要绝望。我花了一段时间来理解反向传播,我必须承认,在写这篇文章的时候,我仍然在发现新的东西。
写这些文章帮助我巩固了我的理解,我希望你能从中有所收获。
我再次尽一切努力检查工作。如果我的理解有错误,请告诉我!
下一篇文章将介绍一些代码来实现我们已经讨论过的概念。
成为卓越数据分析师的追求
原文:https://towardsdatascience.com/how-does-a-remarkable-data-analyst-look-like-dd0e4326c670?source=collection_archive---------27-----------------------

活动发起人在 Unsplash 上的照片
超越原始查询,深入洞察交付
我看到过很多文章谈论如何成为一名优秀的数据科学家。不过这并不奇怪,因为在这个蓬勃发展的 HBR 邮报之后,越来越多的人想成为数据科学家。但是我们亲爱的数据分析师呢?
如果你是一家科技公司的早期数据分析师,你可能看不到自己在未来 5-10 年内做这个角色。你打算只做这份工作 2-3 年,然后再考虑转到数据科学家的兄弟角色,或者转到产品管理、业务战略或人员管理角色。这可能只是因为你看不到这个角色的晋升途径,因为你的日常工作(和你周围的分析师)只围绕着 查询-报告-重复 。
我也去过。也差点辞职和转移。但后来我四处探索,遇到了已经做了 5-10 年分析工作的人,在网上发表文章、演讲和播客,最终发现:
是的,数据分析实际上是一个先进的领域,我还有很多方法可以在这里发展
不,不仅仅是通过承担更大的项目范围或成为初级数据科学家。
在这里,我总结了一系列我的发现,关于分析师如何提升自己的技能,成为一名 卓越的数据分析师!
首先最重要的是——基础
这些就是你的卫生因素。这些的存在并不会让你成为一名高级分析师,但是这些的不存在会降低你作为数据分析师专业人士的可信度。
- 商业语境。了解组织的业务流程是必须的。了解业务目标以及组织如何实现这些目标。这些知识将帮助你对 框架和相关问题 进行分析,以得到利益相关者的启发。
- 解决问题和批判性思维。这是每个专业人士都需要的技能。但是在数据分析环境中,需要确定分析方法,这将导致支持数据的想法被探索。此外,这项技能将帮助你计算出什么时候调整和修改方法,如果在这个过程中发现新的发现。
- 查询。根据上下文并从上面的技能组合中找出要做的事情,这一个涵盖了如何实际工作。这是您进入数据库/数据仓库并将数据转换成可处理格式以供分析的地方。根据组织环境(MySQL、PostgreSQL、Google BigQuery)的不同,需要了解SQL 和相关函数,以实现向利益相关者展示相关数据的目标。
进入下一阶段
描述和推断统计
数据分析与统计学交织在一起。为了从您收集的数据点中获得一些有意义的东西,需要一些分析技术。
最常用的(也是最简单的)方法是描述性统计。描述性统计使我们能够获得概括的特征和数据点的数量分布,并了解我们在我们探索的那些特定指标上的位置。即使有其他可用的高级技术,高级浏览仍然需要理解描述性统计数据(均值、中值、众数、标准差、偏斜度等)的能力,甚至更需要验证收集的数据中是否有错误——异常值检测、测量误差等。

图片来源:新南威尔士州教与学的有效实践(教育部),2019。(链接)
有时候,描述性统计是不够的。高增长的初创企业通常会做大量的产品和市场实验,这些实验只够试水。在这些实验中,理想的分析师将与产品经理一起设计实验,到实验完成时,他们将进行统计推断,以量化实验结果在现实世界中发生的可能性。它们就像是对围绕企业运转的假设的科学验证。它们对于确保我们不会突然从数据点中得出结论非常重要。
数据通信
下一个非常重要但经常被忽视的是数据通信。它不仅包括可视化部分——创建图表,还包括区分要突出显示、显示或放入附录部分的信息。一个伟大的数据分析师会找到呈现数据的方法,并从中讲述一个故事,这个故事会让 记住并激励预期的接收者。
一个好的数据展示是简洁的——包含相关的图表和解释,在点上回答构建的目标或假设,容易被目标受众理解。
一个理想的图表会让观众一眼就抓住洞察力。不同的图表服务于不同的目的,并帮助理解不同的可能的可视化。常规的条形图、折线图、散点图甚至文本可能已经满足了您的需求。但是你有没有考虑过使用热图、树状图、小提琴图或桑基图?
不确定使用哪个图表?在这里探索。

不同的图表服务于不同的目的。了解每一个的使用案例!(作者图片)
此外,分析师需要像设计师一样思考。可以做的一些其他事情是消除混乱(即不相关的数据点和不需要的文本),在保持美观(整洁和简单)的同时吸引注意力(围绕大小、颜色、位置等)。
机器学习
接下来是一个百万美元的问题。我是数据分析师(又不是数据科学家),为什么要做数据建模,要了解机器学习?我的回答是:
嗯,作为一名分析师,你的工作是提取信息和见解。大多数时候它来自大规模数据,很多时候它以非结构化数据(文本、图像、语音)的形式出现。仅凭描述性统计数据,很难从中获得有意义的新见解。
分析角色所需的机器学习技能与数据科学家所需的机器学习完全不同。虽然数据科学家更关注产品集成的预测或规定方面,但数据分析师的机器学习纯粹是为了提取洞察力。不同数据处理算法的知识很重要,但是我们很少关注建模效率和工程架构。
数据分析师的机器学习的示例应用包括用于分类的聚类、用于加权重要变量的回归、用于情感总结的文本挖掘。简单说说,没有自然语言处理技术和建模,怎么分析客服投诉?要不要把几百万的投诉一条一条看完,分类?

N-gram 单词云,有助于收集见解
用一种态度来*衡它
我们已经涵盖了优秀数据分析师的大部分技能。然而,有时仅仅拥有这些技能是不够的,因为一个人还需要体现出必要的态度来使事情运转起来。这里有一些从一个伟大的分析师到一个卓越的分析师的态度和精神。
- 好奇心和速度的完美结合。人们期望数据分析师负责战术洞察,带来速度和灵感,作为分析师与其他数据团队的区别。分析师需要有足够的好奇心来探索数据点并根据发现采取行动,同时牢记交付的目标和时间敏感性。
- 坚持事实 (不是假设)来自数据。沿着这条路走下去,尤其是当你在同样的环境下工作了足够长的时间,你会倾向于确认偏差。鉴于你过去做过类似的分析,并且了解你的东西,你对你将要探索的数据进行假设,并找到一种方法来验证它们。这就是你需要小心的地方,在做解释时坚持事实,而不是从数据集中得出结论。
- 学习和适应技术和行业。和其他工作一样,如果你想成长,你必须不断学习。虽然数百年来统计理论一直是相同的,但处理和呈现数据的算法和底层技术一直在不断更新。保持渴望,热衷于探索与数据分析相关的新工具和技术。
- 思考下一步后分析。从分析中可能会做出什么决定,对组织的其他部分会有什么影响,将来有没有可能重做这个分析?即使对其他分析师来说,也要做好记录和重现。
最后的想法
卓越的数据分析师不仅仅是查询和提供原始数据。他们有能力探索不同的统计技术、工具和机器学习算法,以从数据集产生新的见解。他们了解业务目标和利益相关者的需求,因此能够以及时和简洁的方式呈现与他们相关的信息。
最终,有了这些品质,他们就能通过 传递真知灼见,激励利益相关者为业务做出决策 ,使 成为利益相关者的思想伙伴 。
机器人如何利用 RRT 规划路径?
原文:https://towardsdatascience.com/how-does-a-robot-plan-a-path-in-its-environment-b8e9519c738b?source=collection_archive---------20-----------------------
最*,我和一名硕士生在我的研究实验室里研究我自己的移动机器人、南瓜。由于我们试图替换我的机器人从库 ROS 中使用的一些默认包,我们已经学习了在一个典型的机器人堆栈中使用的不同算法。作为一个从事规划和强化学习的人,但显然不是机器人学的人,对我来说有一个很大的学习曲线。一个机器人必须知道如何在它的环境中定位自己——或者计算出它在哪里,如果它还没有地图的话,在飞行中建立它的环境的地图,避开可能随机出现的障碍物,控制它的马达以改变它的速度或方向,想出解决任务的计划,等等。

我的机器人南瓜
正如你所猜想的,机器人的一个真正重要的部分是它能够根据给定的环境地图规划从一个地方到另一个地方的路径。它为什么要这么做?也许它需要穿过房间去送包裹,或者护送一个人去某栋大楼。在任何情况下,每当机器人必须从开始位置到目标位置去完成任务时,它必须想出一个路径计划来如何在它的环境中移动。在机器人论文中,你经常会看到一张类似下图的地图,上面有起点和终点。这是移动机器人学中的经典问题的一个很好的可视化,我们通常称之为路径规划。换句话说,机器人如何找到一条从起点到终点的路径?

来源:安德鲁·霍华德、高拉夫·苏哈特姆和林恩·帕克的机器人论文
免责声明:在过去,我写过几篇有彩色图表和冗长解释的帖子。不可否认的是,因为像这样的帖子需要大量的工作,所以我最终没有发布任何东西。展望未来,我打算写一些不加修饰的帖子,稍微粗糙和随意一些。为什么?嗯,这不仅让我更容易写文章来加强我对一个概念的理解,而且我也非常肯定它们可以像我的其他文章一样没有华而不实的内容。现在回到我们定期安排的节目…
然而,和往常一样,我们必须记住一些微妙之处:
- 路径规划实际上应该适用于机器人。如果路径规划使机器人在锐角处转弯,但机器人不能在锐角处移动(如汽车),则该路径规划不应被允许。
- 路径规划应该尽可能接*最优。尽管找到任何能让机器人从起点到达目的地的路径规划都很好,但不幸的是,这还不够。我们想要有点效率的东西。它不仅能帮助机器人尽快完成任务,还能节省宝贵的电池寿命。
- 路径规划应避免碰撞墙壁。这显然不言而喻。机器人可能非常昂贵,而且崩溃从来都不是一件好事。光是我的小机器人就花了我一千多美元。
试图满足这些条件的最流行的路径规划算法之一叫做快速探索随机树(RRT) 。由于一张图片胜过千言万语,请查看下图。让我们假设机器人必须在没有任何障碍的简单地图中从起点位置(红色点点)到达目标位置(绿色点)。基本上,我们将从一棵树开始,它的根节点代表机器人的起始位置。之后,我们将逐步建立树。怎么会?我们将从地图中随机抽取一些样本,为每个随机样本创建一个新节点,然后以某种方式将每个新节点插入到树中。一旦树中有一个节点足够接*机器人的目标位置,我们就完成了。

来源:原 RRT 论文作者史蒂文·拉瓦尔
因为我知道这看起来很模糊,让我们给这个粗略的想法添加一些细节。首先,让我们检查一下将发送给 RRT 的每个参数。
- 地图:划分为障碍区和无障碍区的环境地图。它看起来就像我贴在上面的地图,障碍区域是灰色的,无障碍区域是白色的。
- 开始位置:机器人在其环境中的开始位置。这只是地图上的红点。
- 目标区域:机器人在其环境中的目标区域。这只是地图上的绿点。
- 迭代次数:RRT 执行的迭代次数。
让我们看看 RRT 的每一步。首先,我们将初始化一个空树。接下来,我们将把代表开始位置的根节点插入到树中。在这一点上,我们将有一个树,它只有一个节点代表开始位置。最后,我们将重复这些步骤,直到达到迭代次数或达到目标,无论哪一个先出现。
- 从地图的无障碍区域中随机抽取一个位置。
- 创建一个与随机位置相关联的节点。
- 找到已经在树中最接*随机位置的节点。
- 计算从随机位置到节点位置的路径,该路径在机器人上实际可行。
- 如果路径与某物冲突,继续进行下一次迭代。
- 将与随机位置相关的节点插入到以该节点(离其最*的节点)为父节点的树中。
- 一旦随机位置在目标位置的一定距离内,返回树。
作为提醒,如果树在我们达到迭代次数时没有接*目标区域,我们将返回到目前为止已经构建的树。

来源:mjbkaufer通过 Reddit
但是一旦我们建立了树,我们如何得到从起点到终点的路径呢?我们所要做的就是从代表目标位置的节点开始,沿着树向上返回,直到到达代表开始位置的节点。这将为我们提供机器人从起点到终点的路径。简单。
在同一个地图中,新的目标位置可以重复使用这棵树吗?当然!如果树中已经有一个节点在新的目标位置附*,我们就可以开始了。然而,如果在新的目标位置附*还没有任何东西,我们可以继续采样,直到找到一个靠*它的节点。只要环境没有改变,你可以继续在同一棵树上建造任何新的目标位置。

来源:实时机器人
事不宜迟,这里是 RRT 算法的粗略版本!
**function** RRT(*map*, *startPosition*, *goalRegion*, *numIterations*):
*tree* = initializeEmptyTree()
insertRootNode(*tree*, *startPosition*) **for** *i* = 1 **to** *numIterations*:
*randomPosition* = sample(*map*) *randomNode* = createNode(*tree*, *randomPosition*)
*nearestNode* = findNearestNode(*tree,* *randomPosition*) *path* = calculatePath(*nearestNode*, *randomNode*) **if** (hasCollision(*map*, *path*)):
**continue** insertNewNode(*tree*, *nearestNode, randomNode*) **if** (*randomPosition* **is within** *goalRegion*):
**return** *tree***return** *tree*
还有一件重要的事情需要注意!早些时候,我提到我们正在寻找一条适用于真实机器人的最佳路径,并且要避开障碍物。虽然这条路径可以在真实的机器人上工作并避开障碍物,但它是最优的吗?不幸的是,事实证明 RRT 并不能保证产生最优路径。在以后的博客文章中,我将讨论 RRT* ,RRT 的一个更好的版本,它最终生成最优路径。但那是下次的事了。
AI 如何检测物体?(技术)
原文:https://towardsdatascience.com/how-does-ai-detect-objects-technical-d8d63fc12881?source=collection_archive---------3-----------------------
了解如何使用机器和深度学习技术应用和实现对象检测
介绍
计算机视觉是包含在更广泛的人工智能研究范围内的一个领域。计算机视觉涉及处理数字图像和视频,以推断出对这些图像和视频中的内容的一些理解。

图片来自 https://www.bulletproof.co.uk/blog/bot-or-not
对象检测与计算机视觉相关联,并且描述了一种可以识别图像中期望的对象或身体的存在和位置的系统。请注意,要检测的对象可能出现一次或多次。
对象检测过程的输出是一个图像,在感兴趣的对象周围有边界框,并指示单个对象的类实例,见上图。
本文将探索对象检测以及使用机器和深度学习技术实现对象检测的各种方法。
应用程序
物体检测最明显的用例之一是在自动驾驶汽车中。
自动驾驶汽车有一个嵌入式系统,可以实时进行多类物体检测,然后根据检测结果采取行动。
例如,自动驾驶汽车的系统可以检测到一个人形物体穿过道路,并继续执行一个程序,使汽车在接触到检测到的物体之前停下几英尺。

图片来自https://www.autonomousvehicleinternational.com/
物体检测的其他应用有:
- 人脸检测:这个术语指的是实现可以自动识别和定位图像和视频中人脸的系统的任务。面部检测存在于与面部识别、摄影和动作捕捉相关联的应用中。
- 姿势估计:从提供的数字资产,如图像、视频或图像序列中推断身体主要关节位置的过程。姿态估计的形式存在于诸如动作识别、人类交互、虚拟现实和 3D 图形游戏的资产创建、机器人等应用中
- 物体识别:识别与 a 类目标物体相关的过程。对象识别和检测是具有相似最终结果和实现方法的技术。尽管在各种系统和算法中识别过程先于检测步骤。
- 跟踪:一种在一段时间内在一系列图像中识别、检测和跟踪感兴趣的物体的方法。在许多监控摄像机和交通监控设备中可以找到系统内跟踪的应用。

来自 cv-tricks.com 的物体跟踪 GIF
机器学习方法
存在用于检测图像中的对象的机器学习技术,并且这些技术是手动实现的算法,因此它们不是学习系统。
诸如大约在 2005 年引入的方向梯度直方图(HOG) 的方法使用组合 HOG/SIFT(尺度不变特征变换)来基于图像梯度的归一化局部直方图识别图像内的兴趣点。
该方法基于这样的直觉,即感兴趣的对象具有一组独特的特征,这些特征可以在每个窗口的基础上通过梯度的局部强度和边缘方向来识别。其结果是生成一个 HOG 描述符,该描述符是仿射不变量,并在引入了 SVM(支持向量机)的检测链中使用,以基于 HOG 描述符检测感兴趣的对象。这种技术对于一般的检测场景,例如行人检测,工作得相对较好。
生成仿射不变的 HOG 特征意味着如果特征被移动、缩放或旋转,则描述符中使用的特征将总是呈现相同的描述符
以下是用于对象检测的更多机器学习技术的快速概述:
尺度不变特征变换
用于检测的目标对象需要具有独特的方法,以便能够跨图像进行识别;这种新方法类似于获取图像中物体的指纹。
SIFT 是一种计算机视觉算法,它识别并封装图像中局部兴趣点(特征)的信息,以基于提取的特征来描述图像中的对象。
对于 SIFT 算法来说,为了创建对图像内的对象的充分描述,当图像中存在诸如噪声、尺度变化和方向之类的不一致时,所收集的兴趣点需要能够进行检测。满足对适当描述符的要求的图像区域的一个例子是图像内的边缘信息。

圣尼古拉斯教堂(starém sto)图像
[## 尺度不变特征变换
尺度不变特征变换(SIFT)是一种图像描述符,用于基于图像的匹配和识别
www.scholarpedia.org](http://www.scholarpedia.org/article/Scale_Invariant_Feature_Transform)
基于哈尔特征的目标检测
类哈尔特征是对象内的标识符,可用于对象识别和检测。
通过比较两个相邻矩形区域的像素强度并找出总和之间的差异,可以捕获图像部分的特征。差异的结果本质上是我们对于图像的特定部分的描述符。
在实际场景中,haar-like 特征可以用于人脸检测。人脸(例如眼睛)的像素强度存在差异。与邻*区域相比,眼睛区域具有较暗的阴影。

图片来自https://www.researchgate.net/
深度学习方法
当利用深度学习技术时,有两种主要的对象检测方法,第一种是从头开始设计和训练网络架构,包括层的结构和权重参数值的初始化。第二种方法是利用 迁移学习 的概念,并在开始对定制数据集进行专门训练之前,利用在大型数据集上训练的预训练网络。
迁移学习是一种重用从解决问题中获得的知识,并将获得的知识应用于相关但独立的问题的方法
第二种方法消除了第一种方法所伴随的时间过长的缺点,即与采用已经训练好的网络相比,从头训练网络所花费的时间要长得多,并且需要付出更多的努力。
下面是一些用于目标检测的卷积神经网络(CNN) 模型的快速概述
基于区域的卷积神经网络及其变体
RCNN 是一种用于解决对象检测和分割的深度学习方法。该技术于 2014 年推出,提出了基于区域的卷积神经网络(简称 RCNN)的概念。
RCNN 利用选择性搜索算法来建议图像中的感兴趣区域,然后使用卷积神经网络来检测建议区域中感兴趣对象的存在。
RCNN 利用 CNN 进行特征提取,利用 二进制 SVM 进行对象分类。尽管 RCNNs 确实包含了一种手动技术来提议感兴趣区域,因此它并不是真正的端到端可学习的解决方案。

图片来自https://cv-tricks . com/object-detection/faster-r-CNN-yolo-SSD/
RCNN 的计算开销很大,*均需要 40-50 秒来完成对每幅图像的预测。它的后继者, Fast-RCNN 和 Fast-RCNN,解决了 RCNN 中普遍存在的一些性能和效率问题。此外,由于对图像进行和完成预测需要时间,RCNN 不能用于实时应用。
你只看一次(YOLO)
YOLO 是替代对象检测技术使用的标准对象检测范例的重新定义。RCNN 等流行技术利用基于区域的分类器,并通过网络传递图像数千次来获得预测。此外,RCNN 是一个两阶段的过程,第一阶段生成建议的区域,第二阶段是对象检测发生的地方。
另一方面,YOLO 是用于对象检测的一步过程。它也是一种神经网络模型,只需要图像通过其网络一次就可以进行对象检测。一个明显的好处是,与 RCNNs 相比,YOLO 提出了更高的效率。
YOLO 的工作原理是在图像上叠加网格,网格中的每个细胞扮演两个角色:
- 每个单元预测边界框,并为每个边界框分配一个置信度值。置信度值是网格内容包含对象的概率的表示。因此,低置信度值被分配给没有任何对象的图像区域。
- 每个单元格还产生一个分类概率结果。分类概率表示如果网格包含对象,则该对象可能是具有最高概率的类的可能性。
使用 YOLO 进行物体检测有几个好处,主要是它可以用于实时应用,例如嵌入在自动车辆系统中的物体检测系统。
下面是一段视频,包含了更多关于 YOLO 的信息:
结论
最后,我们看看对象检测技术的进展和成功,包括机器学习和深度学习方法。
下图直观地描绘了在 Pascal VOC 数据集上进行评估时,从 2006 年到 2016 年的十年间,Jonathan Hui解释了对象检测技术的地图得分 ) 的增加。

Ross Girshick (2015),深度学习的影响:对象检测
2006 年至 2011 年期间显示了利用传统的机器学习技术进行物体检测;我们可以在 2010-2012 年间观察到一些停滞。这种停滞趋势随着 convnet(卷积神经网络)的出现而改变,我们看到 mAP 得分在 2015 年增加到略高于 75%。
下面的链接提供了一些信息,以获得当前技术状态的概述。
****[## PASCAL VOC 2007 上最先进的物体检测表
24 种方法的性能比较。
paperswithcode.com](https://paperswithcode.com/sota/object-detection-on-pascal-voc-2007)****
希望通过这篇文章,您对对象检测和技术有了更多的了解,这些技术可以用来在各种应用程序中实现对象检测。
如果你喜欢这篇文章,并想阅读更多,给我一个关注。
Airbnb 如何影响旧金山的住房?分析和数据。
原文:https://towardsdatascience.com/how-does-airbnb-impact-housing-in-san-francisco-analysis-and-data-d702ea6db73c?source=collection_archive---------33-----------------------
使用数据探索短期租赁如何影响旧金山的住房市场。
一些研究声称,短期租赁推高了当地居民的价格,因为 Airbnb 等服务“吃掉”了本可以流向长期租户的住房供应[1]。事实上,这些*台已经激起了激烈的争论,比如旧金山颁布了相关法规。与此同时,如果有很多因素影响着住房市场,从当地的价格趋势到历史上的不*等,那么像 Airbnb 这样的公司又有多少责任呢?利用数据,本文考察了这些*台如何影响旧金山住房市场,并探讨了监管如何塑造这些趋势。

显示两种列表位置的地图。首先,那些来自“可能的本地”主机,很少有(1-2 个)绿色列表。第二,“潜在缺席”主机,许多列表(3 个或更多)以蓝色显示。下面将进一步讨论这些组。 Mapbox 和 OpenStreetMap 。有些位置是*似的。谢谢,酿酒师。
请注意,这是一个数据和政策交叉的主题,因此本文讨论一些法规的影响。请理解,此处提供的信息不构成也无意构成法律建议。所有内容仅供参考,不提供任何担保。在未首先寻求相关司法管辖区的专业法律意见之前,不要对该信息采取行动或不采取行动【5】。
首先,我们需要定义旧金山的“短期租赁市场”。该分析使用了 Airbnb 内部2019 年 12 月 4 日的数据,因此这些结果仅适用于当时 Airbnb 上列出的房产【6】。记住这个例子,这篇文章排除了酒店/旅馆(8%的列表)。此外,由于 SF Airbnb 市场有许多只允许长期租赁的物业,那些最短停留时间超过 30 天的(4%的房源)也被忽略,因为它们可能不受与短期租赁相同的监管[7]。
考虑到这些定义,谁在 Airbnb 上出租空间?普遍的担忧是,拥有多处房产网络的房东将大量住房从当地长期租赁市场转移到短期租赁市场,而不是当地人出租多余的房间[8]。然而,数据表明大多数主机不符合这个定义:75%的主机只有一个 SF 列表,极少数(3%)有五个或更多*。此外,89%的旧金山寄宿者报告居住在加州,这一发现并不令人惊讶,因为旧金山法规要求寄宿者“每年至少在他们租用的单元中度过 275 个夜晚”[7]。因此,考虑到所有这些,数据表明,大多数主机可能居住在加州,只有一个或两个上市。

大多数主机只有一个列表。
**尽管大多数房东都是本地人,只有少量房源,但这并不是说找不到潜在的“不在”房东。考虑到 11%的主机报告他们的位置不是加利福尼亚。此外,这一“偏远”群体比那些据报道居住在加利福尼亚的人更有可能拥有三个或更多的 SF 清单,而不是只有一个或两个(p < 0.05)。综合这些指标,拥有许多(≥3 个)房源的“远程”房东负责 10 个房源中的 1 个(11%),但他们仅占旧金山 50 个主机中的 1 个(2%)。事实上,这些主机的影响可能是广泛的:19 个这样的“潜在远程”主机每个都有 10 个或更多的列表。这表明,许多房东确实在他们居住的房产中租赁了多余的空间,但可能有少数不在的房东有不成比例的大量供应。
在继续之前,值得一提的是,这篇文章并不一定声称所有这些租赁都是非法的。网上的信息可能已经过时,一个人可能有很多房间,等等。同样值得强调的是,上述 2%之外的一些人也可能是非法的。
**不管怎样,要知道大多数 Airbnb 的房东可能都是本地人,只有一两个房源,但也有一些“潜在的偏远”房东有很多房源,Airbnb 需要什么样的房源呢?**了解 Airbnb 使用的房屋类型,以确定长期租赁市场中流失的供应类型,这一点很重要。因此,使用来自城市的数据,每个列表的分区可以大致确定[9]。多数人(49%)居住在住宅区或“RH”分区(RH 1-3) * 中的一至三个家庭。这与公寓等高密度住宅形成对比,后者在相对湿度区内不太可能出现。事实上,由于一些非相对湿度地区包含房屋和其他建筑的混合物,49%可能是一个低估的数字。这意味着大约一半的房源是出租的,这使得它很容易成为最常见的房产类型。

许多主人从他们的 1 到 3 个家庭的房子中租用。
再说一次,你会想对此有所保留。旧金山的分区法律极其复杂,可用于租赁的公共位置数据并不总是精确的,因此这一发现应被视为*似的。
然而,所有类型的主人都有可能在他们一到三个家庭的房子里租用空间,这是真的吗?即使考虑到这种相对湿度的多元性,不同主机类型的分区使用也不一致,进一步挖掘发现,相对湿度分区中的房源不太可能来自拥有 3 个或更多房源的“远程”房东(p < 0.05)。事实上,与其他主机的 52%相比,来自那些潜在缺席主机的列表(具有≥ 3 个列表)中只有 24%在 RH 中。这一重要结果意味着,RH 区主机可能更有可能实际居住在他们的空间,而具有列表网络的“远程”主机更有可能活跃在其他类型的分区中,如更高密度的公寓。

与其他主机不同,具有≥ 3 个属性的潜在“远程”主机不太可能使用 RH 1–3。有关 RH 区外住宅的更多详细信息,请参见分区定义[10]。
****知道“本地”主机比“远程”主机更可能使用 RH 分区,Airbnb 对 SF 住房市场做了什么?之前的研究似乎是正确的,因为一些 Airbnb 主机可能会通过减少供应来推高价格,特别是少数拥有许多房源的“远程”主机,他们更有可能在 RH 分区之外(如高密度公寓)[1]。然而,当主人真的住在这个单元时,结果就不那么简单了,尤其是对于那些不清楚如果 Airbnb 消失了,那些多余的房间是否会成为长期住房供应的房产。考虑一下,在 RH 区列表中,39%是单家庭住宅(没有附属单元),并且仅用于一个“家庭”和一个“居住单元”[11]。虽然有可能将这些空间长期出租给非亲属,但他们不可能像普通公寓一样进入长期市场,这似乎是合理的。这是因为居住者仅限于那些符合“家庭”定义的人,并且由于 RH-1 不能有一个以上的厨房,所以空间通常无法与典型公寓的特征相匹配[10][11]。这意味着 Airbnb 可能具有减少某些类型住房(特别是高密度住房)供应的双重效应,但 Airbnb 等*台也可能释放市场其他地方未使用的空间(特别是 RH 独栋房屋)。
SF 应该如何看待这些结果?围绕短期租赁的争论需要细致入微,因为像 Airbnb 这样的服务可能会使一种类型的房屋更实惠、更具生产力,同时增加另一种类型的成本。如果没有 Airbnb 这样的服务,对于在自己居住的房子里出租多余房间的当地人来说,由于分区限制,许多房间可能根本就不会被使用。事实上,失去 Airbnb 可能不仅会导致这些空间的经济生产力损失,而且可能会使旧金山的房屋所有权变得更加昂贵和难以获得,因为考虑到分区限制,一些低收入业主可能更难以建立长期租赁来抵消他们的房屋成本。然而,这种越来越多的人拥有住房的影响被潜在的缺席者抵消了,他们有许多房源,可能会提高租房者的成本。当然,如果法律的精神在旧金山被严格遵循,这样的单元确实需要被他们的主人占用,这可能不是一个问题。或者,如果分区更加宽松,RH-1 供应可能对长期租赁更有用。不过,从整体来看,11%的房源来自拥有三套或三套以上房产的偏远房东,但 19%的房源是有这些限制的单户住宅(不包括那些有附属单元的)。因此,即使有少量的坏演员,短期租赁也有很多好处。最终,由读者来决定这种交换是否值得。
Github 上的代码、数据、注释和引用的作品。
想要更多数据、设计和系统交叉的实验吗? 关注我获取更多 !
构建基于记忆的协同过滤推荐器
原文:https://towardsdatascience.com/how-does-collaborative-filtering-work-da56ea94e331?source=collection_archive---------7-----------------------
基于记忆的协同过滤技术综述及电影推荐器的实现

弗洛伦西亚·维亚达纳在 Unsplash 上拍摄的照片
在上一篇文章使用 tf-idf 构建基于电影内容的推荐器中,我解释了如何基于流派构建一个简单的电影推荐器。
在本帖中,我们将实现一个基于内存的协同过滤模型,并讨论基于用户和基于项目的方法在概念和实现上的主要区别。
你可以在 jupyter 笔记本这里找到重现结果的所有代码。
介绍
协同过滤是推荐系统中最常见的技术。顾名思义,它是一种以协作方式帮助用户筛选出项目的技术,也就是说,基于相似用户的偏好。
说 Lizzy 刚刚看了《降临》和《银翼杀手 2049 》,现在想被推荐一些类似的电影,因为她很喜欢这些。

协同过滤(图片由作者提供)
协同过滤方法背后的主要思想是找到也喜欢这些电影的用户,并根据他们的偏好推荐未看过的电影。在这个例子中,模型可能会发现喜欢这些电影的其他用户也喜欢“星际”,这可能是对 Lizzy 的一个不错的推荐。
虽然这是主要思想,但有许多方法可以解决这个问题,选择更合适的方法将取决于多种因素,例如我们正在处理的数据集的大小及其稀疏度。
协作过滤方法的类型
如上所述,有许多协同过滤(简称 CF)方法,下面是我们可以找到的主要类型:
- 基于记忆的
基于记忆的方法使用用户评级历史数据来计算用户或项目之间的相似性。这些方法背后的思想是定义用户或项目之间的相似性度量,并找到最相似的来推荐未见过的项目。
- 基于模型的
基于模型的 CF 使用机器学习算法来预测用户对未评级项目的评级。基于模型的 CF 算法有很多,最常用的有矩阵分解模型,如应用 SVD 重构评级矩阵,潜在狄利克雷分配或基于马尔可夫决策过程的模型。
- 杂交
这些方法旨在结合基于记忆和基于模型的方法。上述方法的主要缺点之一是,你会发现自己必须在历史用户评级数据 和用户或物品属性 之间做出选择。混合方法使我们能够利用两者,因此在大多数情况下表现更好。现在最广泛使用的方法是因式分解机。
现在让我们更深入地研究一下基于内存的方法,因为这是我们将在这篇文章中实现的方法。
基于内存的 CF
基于内存的协同过滤算法主要有两种类型:基于用户的和基于项目的。虽然它们的区别很微妙,但在实践中它们会导致非常不同的方法,所以知道哪种方法对每种情况最方便是至关重要的。让我们快速浏览一下这些方法:
- 基于用户的
在这里,我们找到了看过/评价过类似内容的用户,并使用他们的偏好来推荐新项目:

基于用户的协同过滤(图片由作者提供)
一个缺点是,用户往往比项目多得多,这导致更大的用户相似性矩阵(这在下一节可能会很清楚),从而导致更大数据集上的性能和内存问题,这迫使依赖并行化技术或其他方法。
另一个常见的问题是,我们会遭遇****:可能没有或几乎没有关于新用户偏好的信息,因此没有什么可以比较的。
- 基于项目的
想法是相似的,但是相反,从一部给定的电影(或一组电影)开始,我们根据其他用户的偏好找到相似的电影。

基于项目的协同过滤(图片由作者提供)
与基于用户的方法相反,项目相似性矩阵往往更小,这将减少在我们的相似性矩阵中寻找邻居的成本。
此外,由于一个单个项目足以推荐其他类似的项目,这种方法将不会遭受冷启动问题。
基于项目的方法的缺点是,与基于用户的 CF 相比,它们在推荐中倾向于较低的多样性。
履行
数据
我们将使用与上一篇相同的数据集,即 MovieLens 数据集,它包含来自 MovieLens 网站的评分数据集。它包含 6000 名 MovieLens 用户制作的约 4000 部电影的 100 万匿名评级,这些电影于 2003 年 2 月上映。
我们将和三个人一起工作。csv 文件:收视率、用户、电影。** 请查看 以前的帖子 了解更多关于数据集的详细信息。**
用户-项目矩阵
我们需要做的第一件事是创建用户-项目矩阵。这实际上是一个来自评级数据的旋转表,其中行是用户,列是电影,数据框填充了用户给出的评级(如果存在,否则为0):
user_item_m = ratings.pivot('user_id','movie_id','rating').fillna(0)
print(f'Shape: {user_item_m.shape}')
> Shape: (29909, 5840)
看起来像这样(我已经加入了电影表,所以标题也可以在这里看到):

相似矩阵
接下来,我们将定义一个相似度矩阵。按照上一篇关于基于内容的推荐器的文章的思路,参见章节 向量之间的相似性 ,我们想要在用户-项目矩阵中找到所有用户(或项目)之间的邻*性度量。常用的度量是余弦相似度。
正如我们也看到的,这种相似性度量因其等于被比较的两个向量之间的角度的余弦而得名,在这种情况下,这两个向量是得分的用户(或项目)相似性向量。两个向量之间的角度越小,余弦值就越高,从而产生更高的相似性因子。有关这方面的更多详细信息,请参见前面提到的部分。
我们可以使用sklearn's metrics.pairwise子模块进行成对距离或相似性度量,在这种情况下,我们将使用cosine_similarity。
请注意,该函数具有签名:
sklearn.metrics.pairwise.**cosine_similarity**(*X*, *Y=None*, *dense_output=True*)
Y预计在哪里:
****Y:n array 或稀疏数组,形状:(n_samples_Y,n_features)。如果
None,输出将是X中所有样本之间的成对相似度。
因此,通过仅指定X,这将从X中的样本生成相似性矩阵:
from sklearn.metrics.pairwise import cosine_similarityX_user = cosine_similarity(user_item_m)
print(X_user.shape)
(6040, 6040)print(X_user)
array([[1\. , 0.063, 0.127, 0.116, 0.075, 0.15 , 0.035, 0.102],
[0.063, 1\. , 0.111, 0.145, 0.107, 0.105, 0.246, 0.161],
[0.127, 0.111, 1\. , 0.127, 0.066, 0.036, 0.185, 0.086],
[0.116, 0.145, 0.127, 1\. , 0.052, 0.016, 0.1 , 0.072],
[0.075, 0.107, 0.066, 0.052, 1\. , 0.052, 0.106, 0.18 ],
[0.15 , 0.105, 0.036, 0.016, 0.052, 1\. , 0.067, 0.085],
[0.035, 0.246, 0.185, 0.1 , 0.106, 0.067, 1\. , 0.202],
[0.102, 0.161, 0.086, 0.072, 0.18 , 0.085, 0.202, 1\. ],
[0.174, 0.156, 0.1 , 0.092, 0.242, 0.078, 0.125, 0.217],
[0.209, 0.162, 0.158, 0.096, 0.079, 0.124, 0.091, 0.109]])
这将生成形状为(n_users, n_users)的用户相似度矩阵。
由于X预计为:
****X:n 数组或稀疏数组,形状:(n_samples_X,n_features)
通过转置用户项目矩阵,我们的样本现在将是用户项目矩阵的列,即电影。因此,如果我们的原始用户项矩阵的形状是(n,m),通过在转置矩阵上找到余弦相似性,我们将得到一个(m,m)矩阵:
X_item = cosine_similarity(user_item_m.T)
X_item.shape
(3706, 3706)
这将表示项目相似性矩阵。
该算法
创建了相似性矩阵之后,我们现在可以定义一些逻辑来查找相似的用户。在基于用户的推荐的情况下,我们想要找到与我们想要推荐电影的新用户相似的用户,并且因为我们已经有了相似性分数,我们只需要搜索给定用户行中的最高值,并且从那里选择最高的 k 。一旦我们有了 k 最接*的用户,我们就可以找到该用户还没有看过的评分最高的电影。
当然,在这种情况下更简单,因为我们已经计算了所有用户之间的相似性矩阵。在实际场景中,我们必须用新用户更新相似度矩阵,然后和找到最相似的用户。
基于使用的 CF** 的算法可以总结为:**
- 计算新用户与所有其他用户之间的相似性(如果还没有完成)
- 计算 k 最相似用户所有电影的*均评分
- 推荐其他用户未看过的排名前 n 的电影
下面是一个逐步解释的实现基于用户的 CF 推荐器的功能:
如前所述,基于用户和基于项目的 CF 系统之间的实现差异非常小。因此,将这两种方法包装在一个类中可能是一个好主意,一旦实例化,我们将使用该类向给定用户推荐电影或项目:
在用一些例子测试推荐器之前,定义一个函数来查看用户的偏好以了解推荐是否有意义可能是有用的。在这里,我对用户观看的电影进行分级,取前 10 名:
测试推荐器
测试一个推荐者实际上比看起来更难。在 movielens 数据集中,许多用户将会看到所有的东西,在某种意义上,他们可能会给多种类型的电影很高的评级,而不仅仅是他们最喜欢的。
测试该模型的一个有用的方法是找到一些具有特定品味的用户的具体例子,例如,对一两个流派有明确的偏好。我所做的是找到已经看过几部电影的用户,但这些电影的类型很少,这意味着他们显然对这些电影有偏好。因此,推荐器被期望推荐来自相同类型的电影。
- 让我们从一些基于用户的建议开始:
让我们试试一个似乎偏爱《T4》剧的用户:
rec = CfRec(user_item_m, X_user, movies)
because_user_liked(user_item_m, movies, ratings, 69)

我们可以看到该用户评价最高的电影是剧情电影。让我们看看推荐者的建议:
rec.recommend_user_based(69)

推荐看起来不错!很难说用户是否会完全同意特定的电影,但是用户的类型偏好清楚地反映在推荐中。
现在让我们和一个恐怖电影的粉丝一起试试:
because_user_liked(user_item_m, movies, ratings, 2155)

rec.recommend_user_based(2155)

《闪灵》,《异形》 …听起来这个用户错过了这些恐怖经典!**
- 现在让我们尝试一些基于项目的建议
我们要做的第一件事是创建该类的另一个实例,但是这次使用项目相似性矩阵作为相似性矩阵:
rec = CfRec(user_item_m, X_item, movies)
如前所述,这里的逻辑是根据其他电影推荐电影。来看看推荐者给喜欢科幻经典 沙丘 : 的用户什么建议
rec.recommend_item_based(2021)
>> Because you liked **Dune (1984)**, we'd recommend you to watch:

我们可以看到,所有推荐的电影都来自同一类型,看起来都是不错的建议。
如果我们喜欢 Se7en ,一部犯罪和惊悚电影,我们会被推荐去看 :
rec.recommend_item_based(47)
>> Because you liked **(Se7en) (1995)**, we'd recommend you to watch:

最后,对于一部经典的动画电影, 斑比 :
rec.recommend_item_based(2018)
>> Because you liked Bambi (1942), we'd recommend you to watch:

所以在这两种情况下,实现的协同过滤模型似乎提供了很好的推荐。
有许多可以改进的地方。例如,我们可以考虑这样一个事实,即在给电影分级时,用户可以表现得非常不同。一些用户可能对所有电影评价很高,而其他用户可能更挑剔。这可以通过减去每个用户的*均分来完成,然后我们就有了每个用户的标准化分数。
无论如何,我希望这个例子能够说明协同过滤方法是如何工作的。我鼓励你把它作为一个起点,也许可以稍微调整一下或者增加一些改进。
非常感谢你花时间阅读这篇文章,希望你喜欢:)
联系人追踪是如何工作的?
原文:https://towardsdatascience.com/how-does-contact-tracing-work-bff0bc4c5a25?source=collection_archive---------81-----------------------
我们在保护隐私的同时阻止新冠肺炎病毒传播的最好办法

通过像素点上的动画
接触追踪,作为一个概念,自艾滋病危机以来已经存在了几十年[1]。接触者追踪的基本原则包括确定可能有患病风险的人,并通知他们接受检测(如艾滋病)或自我隔离(如新冠肺炎)。
我们将考虑开发分散隐私保护邻*追踪(DP-3T) 的团队提出的世界版本。还有其他关于如何进行联系人追踪的提议,比如苹果和谷歌提出的那些提议,但同样的基本概念仍然适用。我们将看看该协议是如何工作的,以及它是如何被设计来保护每个人的隐私的。
DP-3T 是如何工作的?

5 步追踪联系人
基本算法可以分为 5 个步骤:
- 每隔 x 分钟从你的手机发送一个随机代码。
- 收听附*的电话发送给你的其他代码。
- 如果你的疾病检测呈阳性,然后(只有在那时)将你发送的随机代码上传到一个安全的中央数据库。
- 从中央数据库下载代码,并测试是否有与您已收听的代码相匹配的代码。
- 如果找到匹配,则通知用户他们有感染疾病的风险。
发送随机代码
在算法设计者发表的白皮书中,随机码被称为短暂标识符或EphIds。作者解释说,在每天开始的时候,手机应该产生(60*24)/l个不同的伪随机码EphIds。l是一个可配置的参数,代表每个 EmpId 被广播的分钟数——对于本文,我们假设它是 1。这些Ephids通过蓝牙低能量发送给周围的手机。旋转提高了隐私性,因为它使跟踪个人的运动变得更加困难。
如果您有兴趣了解更多信息,白皮书中会详细解释这些信息是如何生成的。值得一提的是,创建EphIds的方法对每个用户来说是确定的,但看起来是随机的——这种设计决策的原因将在后面变得清楚。
监听代码
除了发送EphIds之外,你的手机还需要监听并记录来自附*手机的所有 Ephids 列表。id 和日期一起安全地存储在设备中。EphIds只需要储存 14 天,为新冠肺炎的最大孵化时间。
上传 EphIds
该论文的作者建议,当一个人进行测试时,应该给他们一个访问代码,以便在需要时将他们的结果上传到中央数据库。该代码仅在患者测试呈阳性时激活。然后,个人可以选择指示应用程序从第一天开始上传第一个Ephid,它们具有传染性(在出现症状【2】之前*均 5-6 天)。
只有来自个体传染期的第一个Ephid需要被上传,因为,如上所述,由于Ephids的创建是确定性的,所有其他的Ephids可以被用户重新创建。
正在检查匹配
每天你的手机都可以从中央数据库下载一份Ephids列表以及它们被传送的日期。您的手机可以在传染期间重建完整的Ephids系列,并与您的手机在同一时间段听到的Ephids进行交叉引用。如果找到匹配项,则会记录下来,并根据匹配项的数量和找到这些匹配项的时间来计算自定义风险分值。风险评分由当地卫生当局设计,是与中央数据库匹配的Ephids数量的函数。
隐私
像这样的算法的优雅之处在于,它们从不需要知道个人的位置,也不需要访问 GPS 数据。它也不知道个人的日常习惯是什么,或者他们是否遵守锁定策略。使用该协议的应用程序只关心用户的安全。
结论
DP-3T 联系追踪是一种隐私转发、轻量级和安全的联系追踪方法。如果实施得好,它有机会大大减少新冠肺炎的传播,并有助于拯救生命。
[1] Ramstedt K,Hallhagen G,Lundin BI 等.人类免疫缺陷病毒(HIV)感染的接触追踪.性传播疾病。1990;17(1):37‐41.
[2]https://www . who . int/docs/default-source/coronavirus/situation-reports/2020 04 02-sit rep-73-covid-19 . pdf?sfvrsn=5ae25bc7_6
数据科学如何为企业创造价值?
原文:https://towardsdatascience.com/how-does-data-science-create-value-for-firms-a3e3e5ca86e3?source=collection_archive---------31-----------------------
不要关注技术、角色和组织结构图。相反,请考虑如何让数据科学成为您组织的核心竞争力。

马林·斯特兰德瓦尔在 Unsplash 上拍摄的照片
W 我们都读到过数据是“未来的燃料”,听说过数据科学家拥有“21 世纪最性感的工作”,也看到过商业智能和分析行业惊人同比增长的预测。但是,随着多达 85%的大数据项目失败,显然许多公司难以实现数据和人工智能的承诺收益。以我作为数据科学顾问的经验来看,这通常会让公司问这样的问题:
- 我们应该使用什么技术和方法来存储、分析和共享我们的数据?
- 我们的数据科学团队需要哪些技能和角色?
- 我们应该如何在组织中定位我们的数据科学团队?
- 我们能像传统项目一样计划和管理数据科学项目吗?
- 我听说行业中的公司xy 和 z 取得了巨大的成功。这适用于我的情况吗?
虽然这些都是重要的考虑因素,但我认为它们都是同一个基本问题的不同版本:
数据科学如何为企业创造价值?
我最*在华威大学的 MBA 论文中研究了这个问题,在这篇文章中,我将给出一个研究的总结。在这个过程中,我将根据我作为一名实践数据科学家和顾问的工作描述一些经验和建议。附加的注释和参考资料可以在最后找到。
关键要点
- 公司的数据科学功能可以被认为是一组可以协调成能力的资源。理想情况下,这些能力应该支持公司的总体战略目标,并创造可持续的竞争优势。
- 数据科学能力创造的价值取决于它在多大程度上是公司的核心竞争力。数据科学家和云计算自己什么都不做;当这些资源和能力与公司的战略目标相一致并帮助公司应对动态竞争环境时,价值就被创造出来了。
- 这种关系因行业和公司类型而异。虽然结果并不支持一个确定的答案,但在快速变化的竞争环境中的行业(如 it 或服务)的公司最有可能拥有强大的数据科学核心能力。成熟的公司和那些具有较新的数据科学能力的公司也更有可能在数据科学方面拥有强大的核心竞争力。
- 企业可以从他们的数据科学能力中提高竞争优势,例如,通过强调数据科学管理技能的发展;通过选择符合核心战略目标并需要跨职能团队的项目;通过确保数据科学能力对于公司所在行业的变化步伐足够敏捷;以及在个人、操作和战略层面上规划潜在的冲突。
资源、能力和核心竞争力
企业的基本目标是发展和保持市场竞争优势。为了理解数据科学对这一目标的潜在贡献,有必要回顾一下战略管理文献中的两个关键概念:基于资源的企业观和动态能力。
战略优势的资源基础理论(RBT)是“理解组织的最突出和最有力的理论之一”(Barney,Ketchen 和 Wright,2011: 1299)。简而言之,该理论认为企业由以下部分组成:
- 资源:由企业控制的生产投入(Grant,1991)或“任何可以被认为是优势或劣势的东西”(Wernerfelt,1984: 172)。
- 能力:“一组资源执行某项任务或活动的能力”(Grant,1991: 119)。对于数据科学而言,相关能力可能包括收集和处理运营数据、构建预测模型以及向利益相关者和决策者传达由此产生的见解的能力。
虽然 RBT 可以有力地解释为什么企业目前具有竞争优势,但它在解释这些职位是如何在动态竞争环境中创造和保持的方面却不太有效。为此,我们转向动态能力,“企业整合、建立和重新配置内部和外部能力以应对快速变化的环境的能力”,例如,通过感知市场机会和威胁,抓住这些机会,并转变企业资产以保持竞争力(Teece,2007)。
关于管理信息系统的文献,特别是数据分析,强调了两个值得注意的动态能力。第一种观点认为,信息技术系统的利益取决于其与公司战略目标的一致性,以及其日常运营和文化(例如,Venkatraman,1993;Krishnamoorthi &马修,2018)。传统上,这种一致性可能是通过过程标准化和瀑布式项目管理来实现的;相比之下,数据科学活动通常是探索性的,这意味着通过敏捷开发方法更有可能实现一致性。
第二,IT 系统可以提高组织的 a gility ,即其“快速识别并有效应对威胁和机遇”的能力(Ghasemaghaei,Hassanein and Turel,2017: 95)。一项针对 3,500 多名企业高管的关于数字技术挑战的调查表明,这种灵活性对于企业长期应对快速变化的环境至关重要。正如一位受访者所说,一家公司可以在短期内积极推广某项特定能力,但在十年的时间框架内,“我们正在被我们的客户、技术和全球化所牵引”(Buckley and Natasha,2017: 5)。
在下面的分析中,我将市场整合和内部敏捷性作为企业“核心竞争力”的要素;也就是说,战略能力是企业绩效的基础,是创造价值的多种来源的基础(Prahalad 和 Hamel,1990)。最*,关于“大数据分析能力”的文献(如 Mikalef 等人,2018)提出了数据科学在多大程度上可以成为这样的核心竞争力,我的假设是,数据科学通过支撑多种组织能力为公司创造价值;这种关系如图 1 所示。

图一。数据科学如何为企业创造价值的提议模型。尽管之前的研究( 1 、 2 、 3 )已经强调了核心能力结构对于数据科学价值创造的重要性,但他们设想核心能力结构独立于公司的数据科学能力。通过将其建模为中介— 而非调节— 关系,本研究能够更好地评估数据科学能力是否仅通过培养支持企业更广泛目标和动态能力的核心数据科学能力来创造价值。潜在结构显示在圆角矩形中,测量项目显示在矩形中。在本文的结尾可以找到所用项目的列表。
数据收集
关于这一主题的大多数文献都使用了验证性因素分析和结构方程模型来检验假设,我在这里也采用了同样的方法。为了收集所需的数据,我设计了一个封闭式调查,询问受访者以下问题:
- 他们的人口统计数据、数据科学经验和公司属性;
- 组织内数据科学资源的性质;
- 数据科学功能与公司整体战略目标的整合程度;和
- 他们对数据科学在其公司创造的价值的看法。我测量的价值是对数据科学帮助被调查者的公司发现、创造和实现价值的方式的主观评估(Sheng et al. ,2007);成本和收益的货币评估(如 Vidgen 等人,2017)被排除,因为调查受访者是未知行业的代表,也可能无法获得这些信息。
在对调查进行试点和修订后,该调查于 2019 年 5 月通过 LinkedIn、社交媒体、专业人士和校友网络上的数据科学小组进行了分发。图 2 总结了 50 名有效回答者的主要特征。

图二。调查对象的选定特征。受访者来自 ICT、医疗保健、专业服务和零售等行业。
有关如何检查调查工具的有效性以及研究限制的详细信息,请参见技术说明。
主要发现
发现 1:拥有数据科学能力是不够的
为了从数据科学能力中创造价值,仅仅雇用数据科学家并让他们通过一些机器学习算法来运行您的数据是不够的。如图 2 所示,当数据科学能力成为公司核心竞争力时,价值就被创造出来了;也就是说,它使组织能够在多个市场上竞争,它协调整个组织的技能,它被认为是创造客户价值不可或缺的一部分。

图 3。数据科学能力(CAP)创造价值,但主要是当该能力被整合为公司的核心竞争力时。边缘权重显示来自结构方程模型的标准化负荷,除了 CAP → VALUE (p = 0.71),潜在结构之间的路径在 p ≤ 0.01 时显著。为清晰起见,未显示剩余差异。
在实践中,这一结果对于刚开始数据科学之旅的组织来说可能是最重要的。在 DAIN 工作室,我们与之前进行数据科学试点研究的客户合作,但他们对这些项目没有对他们的业务产生变革性影响感到失望。小项目本质上没有错——它们是在组织内建立能力和信任的好方法——但是它们需要有助于可持续的核心竞争力。我们的顶级技巧包括:
- 试点研究团队应该是跨职能团队。不要只是将大量数据导出给数据科学团队,然后期望他们带着成品回来。合作有助于组织协调利益和工作流程,从而为更轻松地部署数据科学见解奠定基础。
- 选择试点研究,开发与战略目标一致的新能力。例如,如果公司的总体目标是通过 x% 增加收入,一个合适的试点研究可能涉及整合两个以前不相关的数据源,这些数据源提供了关于您的客户以及什么类型的优惠可能会吸引他们的更多见解。拥有一个分析路线图也是很有帮助的,它描绘了单个项目如何共同促进所需功能的开发,例如数据存储基础设施、算法开发或可视化。
发现 2:快速发展行业的公司更有可能拥有强大的 DS 核心竞争力
对于不同的企业类型,上述关系如何变化?先前的研究表明,企业特征对企业的敏捷性影响很小,甚至没有影响(见图 1 标题中的参考文献);然而,目前的结果突出了两个重要的特点:一个公司的整个行业和它的个人历史(图 4 和图 5)。

图 4。公司特征—如行业(F1:行业= ICT?F2:工业=服务业?)、规模(F3)及其数据科学能力的年龄(F4) —被发现对数据科学成为核心竞争力的程度有显著影响。边缘权重显示了来自结构方程模型的标准化负荷,除了 CAP → VALUE (p = 0.392),潜在结构之间的路径在 p ≤ 0.01 时显著。为了清楚起见,没有显示残差方差和外生协方差。

图五。公司特征会影响数据科学成为核心能力的程度。所有特征都被建模为虚拟变量。老牌公司是那些超过 25 年或拥有 1000 多名员工的公司。线条表示 95%置信区间,F1 和 F3 在 p < 0.05 显著(F2 → CORE,p = 0.075F4 →核心,p = 0.093)。
先说行业。相对于所有其他行业,ICT 和服务行业的公司在数据科学方面拥有最强的核心竞争力。环境速度的概念有助于解释为什么会出现这种情况(McCarthy 等人、2010)。企业竞争环境的变化速度——例如,企业使用的基础技术、产品供应、客户需求等——在塑造企业为保持竞争力而必须拥有的资源和能力方面起着重要作用。现代市场是充分开放和动态的,企业至少需要某种程度的动态能力才能生存,但在高速环境中,竞争优势的持续时间是不确定的,可用于决策的时间是有限的,动态能力本身是不稳定的(Eisenhardt 和 Martin,2000)。出于这个原因,Schilke (2014)认为,当环境变化的方向和幅度大致可以预测,并且开发这种能力的成本可以在一定程度上收回时,动态能力对竞争优势的贡献最大。随着行业的成熟以及所需资源和能力变得更加广泛可用和标准化,这种“适度”的环境速度似乎适用于数据科学和分析(Ransbotham et al. ,2016)。
对于大多数公司来说,数据科学只是公司整体能力的一部分,因此母行业的发展速度仍然很重要。例如,ICT 行业是由快速的外生技术发展推动的,因此我们希望这些公司拥有整合数据科学能力的经验和能力,无论数据科学是否代表另一波重大创新,或者只是“新瓶装旧酒”。类似地,服务公司的创新周期更短,更容易试验和适应新技术。相比之下,医疗保健、制造或其他行业的公司可能更习惯于由监管变化或有限竞争等因素驱动的较慢的环境速度。
因此,企业应该密切关注其行业的环境速度。如果变革的步伐缓慢,那么可能会有更多的时间来开发数据科学能力。然而,如果变革的速度更快,那么企业需要更加积极主动。这凸显了那些习惯于较慢变革速度、但现在面临新进入者破坏的公司面临的特殊风险;事实上,许多医疗保健公司已经开始认识到将数据科学和人工智能引入其价值链所带来的战略威胁( 1 、 2 )。
发现 3:公司历史影响数据科学核心竞争力的强度,但关系是复杂的
上述回归结果还包括公司历史的属性,即它是否是一家老牌公司(超过 25 年或超过 1000 名员工)以及它的数据科学能力是超过还是少于两年。然而,鉴于这项研究中有限的数据,这个故事仍然不清楚。
拥有年轻数据科学能力的公司似乎拥有更强的核心竞争力。这可能是因为这些公司本质上是数据科学的后期采用者,并且能够从他人的经验中学习。例如,最*的报告( 1 , 2 )表明,德国公司在更普遍地采用数据科学和数字技术方面落后于国际同行。作为一家拥有德国和芬兰共同传统的公司,DAIN 工作室通过安排“体验之旅”,展示在数据和人工智能方面拥有核心竞争力意味着什么,帮助客户克服了一些障碍。
更大、更成熟的组织似乎也具有更强的核心竞争力,而人们可能会认为这些公司很难将新的数据科学技术应用到现有流程中。一种可能的解释是,这些公司只是将现有能力重命名为“数据科学”,例如,通过更名“商业智能”功能或将数据科学嵌入业务部门。或者,成熟企业的持久成功可以建立在敏捷性能力的基础上,这种能力允许几乎任何新的能力一旦被认为与公司的总体方向有很强的一致性,就可以被迅速采用。
需要做更多的研究来更好地理解这些影响。然而,在实践中,人们应该意识到公司内部的潜在冲突,这些冲突可能会阻止数据科学能力成为核心竞争力。这些可以用三个尺度来描述:
- 个人:保险行业报告称,由于“墨守成规的传统主义者和危险的牛仔”之间的冲突,很难调和现有的分析能力和新的数据科学家。
- 运营:数据科学和 IT 职能部门之间经常发生冲突。例如,现有的 IT 采购和安全政策可能会限制数据科学团队开展工作的能力。这里的关键是区分实验和生产;这两个活动之间显然存在依赖关系,但是风险在于,过于关注生产系统的约束会抑制生产性实验。这种运营冲突更有可能发生在具有风险规避文化的公司中。
- 战略:在成熟的公司中,数据科学项目和能力通常在高层管理人员的支持下启动,希望数据科学能够为公司带来重大价值。因此,可以理解的是,现有的 It 职能部门可能会认为数据科学团队侵入了他们的地盘,并声称现有的 IT 活动也是“数据科学”。这可能会在组织内部造成政治冲突,再次阻碍数据科学成为核心竞争力。
这些障碍没有简单的解决办法。但是仔细考虑一个组织的历史并识别潜在的冲突来源有助于顺利采用数据科学。
发现 4:所有数据科学能力都很重要,但有些能力比其他能力更重要。
研究结果 1 表明,企业的数据科学能力通过数据科学核心能力间接影响其从数据科学中创造价值的能力。但是,我们所说的数据科学能力是什么意思呢?
根据文献(如 Gupta 和 George,2016),数据科学能力可分为三个部分:
- 技术资源,如数据源和数据处理技术;
- 人的技能,包括技术和管理技能;和
- 无形资源,例如组织学习和数据在决策文化中的作用。
目前的问卷采用了同样的模式,但验证性因素分析发现,并非所有这些组成部分都同等重要(图 6)。

图六。验证性因素分析表明,公司数据科学能力的最重要元素是其员工的技术和管理技能。数据资产、技术和决策文化不太重要,在最终模型中被忽略了。
有形的数据科学资源,如数据和技术,在该分析中的负载相对较低。这与以前关于信息技术战略管理的文献一致,这些文献认为,当这些资产可以在公开市场上容易地获得时,它们提供的竞争优势很小(例如,Powell 和 Dent-mical lef,1997)。可以说,许多数据科学技术正在被类似地商品化;例如,本次调查中使用的调查项目最初是在 2016 年编写的,涉及 Hadoop 和 NoSQL,这些技术现在被许多数据科学家视为标准(甚至过时)。
这意味着数据科学能力的战略优势主要来自那些难以在企业间复制的因素:即,人力技能和无形资源。虽然人们可能希望在本次调查中看到数据驱动的决策文化项目的更高负载,但技术和管理技能被确认为整体数据科学能力的最佳反映。随着时间的推移,这种情况会如何变化还不确定。一些评论家认为,目前由数据科学家完成的许多任务将在不久的将来实现自动化,这意味着技术技能在组织之间可能变得不那么独特。
这些发现在实践中意味着什么?
- 仔细思考外包的技术技巧。公司可以在技能获取的“做”和“买”两种模式上取得成功,但它们也可能在两种模式上挣扎。一个有用的启发是问自己,这种技术技能在多大程度上促进了我们客户产品的核心部分?如果答案是“不太多”,那么外包可能是好的。但是,如果你的整个企业会因为关键技术人员的离开而受到威胁,那么最好将这些技能留在公司内部。正如普拉哈拉德和哈默尔指出的:
“在我们看来,太多公司在削减内部投资时,无意中放弃了核心竞争力,他们错误地认为内部投资只是为了外部供应商的‘成本中心’。”(第 7 页)
- 成功建立和管理数据科学团队是另一个话题,但在最*的一篇斯隆管理评论文章中,Roger Stein 强调了教育的重要性。组织(尤其是大型组织)中的数据科学家需要与其他业务部门合作,以增加他们对业务领域的了解,了解业务文化中的本地差异,并解释数据科学项目可能与成熟的工作实践有何不同。特别是如果你是一名数据科学经理,这些任务应该像代码审查和技术讨论一样成为你日常工作的一部分。
摘要
数据科学作为一种职业正在走向成熟,它已经成为许多现代组织中的一项重要职能。然而,企业仍然面临着从数据科学能力中提取价值的真正挑战。这项研究证实,仅仅购买“一公斤艾”是不够的;组织还必须努力使这种能力成为公司的核心竞争力,对多种资源和能力、多种产品和服务产生影响。这一挑战的规模似乎取决于公司及其行业的属性。虽然可以采取具体步骤来促进这种关系,但没有简单的解决办法。开发为您的公司创造价值的数据科学能力需要时间和精力。
技术札记
理论模型(图 1)描述了三个潜在结构之间的关系:数据科学能力(CAP)、数据科学核心能力(core)和数据科学价值(value)。由于这些结构不能直接测量,回答者被问了一系列关于整体结构的具体元素的问题。潜在结构不是由这些项目分数的组合形成的,而是被设计成在测量项目中反映的 T2。例如,数据科学能力的总体水*反映在关于数据科学技术使用、技术和管理技能水*以及数据驱动文化方面的具体问题的答案中。
每个潜在的结构都是基于先前发布的调查工具(CAP 和 CORE)或在试点研究中评估的(VALUE)。在拟合整体模型之前,用验证性因子分析检查每个结构。由于没有足够的数据来支持更复杂模型(如 CAP)的拟合,因此必须简化一些结构。对于其他结构,内部有效性和一致性检查表明,可用的数据不支持提出的理论模型,项目要么被分配到其他结构或完全从模型中删除。
这项研究有两个主要的局限性。第一个是相对较小的样本量,,这是 SEM 研究中的一个常见问题,它实际上限制了可评估模型的复杂性。但此外,样本是异质的,包含了来自不同国家、行业和职业经历的受访者;未来的研究最好侧重于数据科学界的特定领域,或者在数据收集方面投入更多资金。
问卷项目
- DM1:性别
- DM2:你住在哪里?
- DM3:你有多少年的职业经验?
- DM4:你从事什么行业?
- DM5:你的组织有多少员工?
- DM6:你的组织的主要收入来源是什么?
- DM7:你的组织有多老了?
- DM8:贵组织的数据科学能力有多强?
- D2:我们将来自多个内部来源的数据整合到一个数据仓库或数据集市中,以便于访问。
- T1:我们已经探索或采用了并行计算方法(如 Hadoop)来处理大数据。
- T3:我们已经探索或采用了基于云的服务来处理数据和进行分析。
- T5:我们探索或采用了新形式的数据库,如用于存储数据的 NoSQL。
- TS3:我们的数据科学员工拥有成功完成工作所需的技能。
- TS4:我们的数据科学员工接受过适当的教育,能够成功完成他们的工作。
- TS6:我们的数据科学员工训练有素。
- MS2:我们的数据科学经理能够与职能经理、供应商和客户合作,确定数据科学可能给我们的业务带来的机会。
- MS3:我们的数据科学经理能够以支持其他职能经理、供应商和客户的方式协调数据科学相关活动。
- MS4:我们的数据科学经理能够预测职能经理、供应商和客户的未来业务需求。
- MS5:我们的数据科学经理非常清楚在哪里应用数据科学。
- DD2:我们的决定是基于数据而不是直觉。
- DD3:当数据与我们的观点相矛盾时,我们愿意超越自己的直觉。
- DD4:我们不断评估和改进业务规则,以响应从数据中提取的洞察力。
- DD5:我们不断指导员工根据数据做出决策。
- M1:我们的数据科学能力使我们能够在多个产品或服务市场上竞争。
- M2:我们的数据科学能力对我们最终产品或服务的感知客户利益做出了重大贡献。
- M3:竞争对手很难模仿我们的数据科学能力。
- M5:如果没有我们的数据科学能力,我们将面临错失未来增长机会的风险。
- I1:我们的数据科学能力协调整个企业的各种技能、数据和技术。
- I2:数据科学是我们组织最重要的能力之一。
- VD1:我们组织的数据科学计划与组织的使命、目标、目的和战略相一致。
- VD3:我们根据对业务绩效的预期影响来确定数据科学投资的优先级
- VC1:数据科学在多大程度上被用于支持内部运营,例如改善生产和运营流程、提高生产率、提高灵活性和设备利用率、简化运营
- VC3:数据科学在多大程度上被用于支持创造客户价值,例如提高产品/服务质量,更好地响应客户需求,更好的售后服务和支持,提高客户忠诚度
- VR1:我们比竞争对手更快地进入新市场。
- VR3:总的来说,我们比竞争对手更成功。
参考
Barney,J. B .,Ketchen,D. J .和 Wright,M. (2011)“资源基础理论的未来:复兴还是衰落?”,管理学杂志。由 J. B. Barney、D. J. Ketchen 和 M. Wright 编辑,37(5),第 1299-1315 页。doi:10.1177/0149206310391805。
Buckley,D. P .,Gerald C. Kane 和 Natasha (2017)“实现数字化成熟”,麻省理工斯隆管理评论。可在:https://Sloan review . MIT . edu/projects/achieving-digital-maturity/。
艾森哈特,K. M .和马丁,J. A. (2000)“动态能力:它们是什么?”,战略管理杂志;芝加哥,21(10/11),第 1105–1121 页。
Ghasemaghaei,m .,Hassanein,k .和 Turel,O. (2017)“通过使用数据分析提高企业敏捷性:fit 的作用”,决策支持系统,101,第 95–105 页。doi:10.1016/j . DSS . 2017 . 06 . 004。
Grant,R. M. (1991)“基于资源的竞争优势理论:对战略制定的影响”,加利福尼亚管理评论;伯克利,第 33 卷第 3 期,第 114 页。
Gupta,m .和 George,J. F. (2016)“发展大数据分析能力”,信息&管理,53(8),第 1049–1064 页。doi:10.1016/j . im . 2016 . 07 . 004。
Krishnamoorthi,s .和 Mathew,S. K. (2018)“商业分析和商业价值:比较案例研究”,信息&管理,55(5),第 643–666 页。doi:10.1016/j . im . 2018 . 01 . 005。
McCarthy,I. P .,Lawrence,T. B .,Wixted,b .和 Gordon,B. R. (2010)“环境速度的多维概念化”,《管理学会评论》,35(4),第 604-626 页。
Mikalef,p .、Pappas,I. O .、Krogstie,j .和 Giannakos,M. (2018)“大数据分析能力:系统性文献综述和研究议程”,信息系统和电子商务管理,16(3),第 547-578 页。doi:10.1007/s 10257-017-0362-y。
t . c . Powell 和 Dent-mical lef,A. (1997)“作为竞争优势的信息技术:人力、业务和技术资源的作用”,《战略管理杂志,第 18 卷第 5 期,第 375-405 页。
Prahalad,C. K .和 Hamel,G. (1990)“企业的核心竞争力”,《哈佛商业评论》,68(3),第 79-93 页。
Ransbotham,s .、Kiron,d .和 Prentice,p . k .(2016)‘超越宣传:分析成功背后的辛勤工作’,麻省理工学院斯隆管理评论,57(3),第 3-16 页。
Schilke,O. (2014)“论竞争优势动态能力的权变价值:环境动态性的非线性调节效应”,战略管理杂志,35(2),第 179–203 页。doi: 10.1002/smj.2099 。
Sheng,j .、Amankwah-Amoah,j .和 Wang,X. (2017)“大数据在管理研究中的多学科视角”,《国际生产经济学杂志》,191,第 97–112 页。doi:10.1016/j . ijpe . 2017 . 06 . 006。
Teece,D. J. (2007)“阐明动态能力:(可持续)企业绩效的本质和微观基础”,战略管理杂志,28(13),第 1319-1350 页。doi: 10.1002/smj.640 。
n .文卡特拉曼、J. C .亨德森和 s .奥达赫(1993)“持续战略联盟:利用信息技术能力取得竞争成功”,《欧洲管理杂志》,11(2),第 139-149 页。doi:10.1016/0263–2373(93)90037-I。
Vidgen,r .,Shaw,s .和 Grant,D. B. (2017)“从业务分析中创造价值的管理挑战”,欧洲运筹学杂志,261(2),第 626–639 页。doi:10.1016/j . ejor . 2017 . 02 . 023。
Wernerfelt,B. (1984)“基于资源的企业观”,战略管理杂志,5(2),第 171-180 页。doi:10.1002/smj . 4250050207。
我在整篇文章中使用了“公司”一词,但这种分析并不取决于所讨论的组织是否追求利润。
包括政府、金融、专业服务和非营利组织。
候选药物筛选是如何进行的?
原文:https://towardsdatascience.com/how-does-drug-candidate-screening-work-f69ff02db619?source=collection_archive---------47-----------------------
数据科学家入门。

一种化合物(“配体”)停靠在酶蛋白中(左:“卡通”视图,右:“表面”视图)。资料来源:EMSKE Phytochem,软件:PyMol
当谈到药物试验时,在产生实验室(体外)和临床(体内)试验的额外费用之前,有必要列出高潜力候选人的名单。大多数制药公司在现实世界的试验之前进行“电子”筛选:他们希望尽可能以最少的“错过”成本通过“击中”筛选。
在对我们大多数最*的 关于抗病毒疗效的的背景研究中,我意识到对于数据科学家观众来说,没有很多药物对接“如何做”。数据科学武库中的这一明显差距让我感到有点难过,因为数据科学家可能是这些工具最高效的用户之一。如果有一代“生化数据科学家”挥舞着生化软件工具来解决人类最大的健康挑战,那就太好了。
如果数据科学家能够克服对使用开源工具的恐惧或不熟悉,这将是可能的。一定要接受你的生物化学家/分子生物学家/病毒学家同事,但不要陷入这样的陷阱,认为你不可能在他们的领域有独特的范围。恰恰相反,这些科学的实践者可以从你的支持中受益匪浅。从经验来看,他们中最聪明的人甚至张开双臂欢迎你。
然后,在这个池塘里放入一块早期的鹅卵石,这是我们为数据科学界准备的关于药物对接的初级读本,通过我们将这些工具应用于一个特定的应用——病毒学——的方法来说明。
背景
在 EMSKE,我们开发了一种自动筛选过程,以在计算机上分析新型冠状病毒冠状病毒的主要蛋白酶(“Mpro”)的候选植物化合物。(这种蛋白酶不要与病毒的第二种蛋白酶 PLpro 混淆)。
一个良好的抗病毒筛选释放了对靶向病毒酶进行早期、大量“赞成/反对”指示的能力。为什么针对主要的蛋白酶?只要一种安全的候选药物(在体外证明对这种关键酶具有抑制作用)能够通过人体代谢和跨细胞膜,那么它就可以一次性杀死病毒。当然,这不是唯一值得靶向的病毒蛋白,但它是比尖峰抑制剂更好的选择,在尖峰抑制剂中,你需要处理多个尖峰,才能对其进入细胞产生任何效力。
计算机筛选基础
我们的屏幕位于一个名为 Autodock Vina 的药物对接工具之上。Autodock 和 Autodock Vina 是由斯克里普斯研究所推出的开源工具。它植根于机器学习,使用梯度下降来寻找符合的、极性吸引的候选化合物“姿势”,以符合正在研究的任何蛋白质受体位点。十多年来,Autodock 系列对接软件已被生命科学研究人员广泛应用于筛选已出版的生物化学文献。Vina 是 Autodock 的成本函数和得分细化,与原始 Autodock 相比,它提高了命中失误的准确性,并显著提高了计算速度。以下是自动对接工具的一般工作流程:

自动对接流程图(来源: MTIOpenScreen ,( CC BY 4.0 )修改为通用自动对接)
- 下载自动对接 Vina
- 从蛋白质数据库下载(较大的)pdb 文件。
- 从在线数据库下载 3D SDF 格式的化合物(称为“配体”),通常是 P ubChem 或 ZINC。
- 为了让 Autodock Vina 与它们一起工作,您需要将化合物和配体转换成。pdbqt 格式。转换是通过 Scripps 网站的 MGLTools 下载页面中的一个工具包完成的(如果你是 Mac 用户,你会希望确保在未升级的 32 位 Mac OS 版本上运行它)。
- 使用 MGLTools 的 prepare_receptor4.py 将蛋白质 pdb 文件转换为。pdbqt 我们更喜欢使用 obabel(不幸的是,obabel 是它自己的安装成果,但是对于 Mac 用户来说,babel 是一个令人愉快的前端)和 prepare_ligand4.py 的组合来转换。sdf 文件转换成。pdb 以及随后的。pdbqt 分别。
现在你几乎准备好做对接运行!剩下要整理的项目是搜索框。Vina 通过迭代 3D 位置、方向和配体旋转键构象的多维空间进行梯度下降搜索。它在用户以埃为单位指定的三维体积搜索框内搜索。用户还指定搜索的中心。总的来说,这些参数允许选择“盲”搜索,即包含整个蛋白质的搜索体积(我们使用 150 埃)。对于与活性位点的靶向对接,更紧密的搜索体积(我们使用 30 埃)缩小了搜索范围并加快了计算速度。
使用像 PyMol 这样的 3D 可视化程序,很容易确定盲对接的坐标(通常是蛋白质的估计几何中心)。对于目标站点,只需打开人类可读的 pdbqt 文件本身,并找到目标站点感兴趣的氨基酸。活性位点的氨基酸是从感兴趣的蛋白质的公开文献中确定的。对于 SARS-CoV 的 Mpro,我们通常查看由 A-组氨酸-41&A-半胱氨酸-145 定义的活性位点。(“A”是指结合形成该酶蛋白整体的两条氨基酸链中的一条)。
根据配体-蛋白质复合物能级定义的成本函数梯度下降,Vina 迭代配体相对于蛋白质表面的位置、旋转和结构姿态。它不是直接考虑配体分子和蛋白质受体表面上相反电荷的吸引力,而是成对地观察配体和受体之间在给定姿势下产生的原子键。Vina 根据-4 到-12 的范围生成结果(形式上:以每摩尔千卡为单位)。换句话说,像 Autodock Vina 这样的对接软件是从最小化一组化学键的“能量水*”的角度来考虑的,这些化学键是由化合物对蛋白质受体位点的姿态决定的。
我们对 Vina 的应用基本上保持了这一规模,但应用了一些基本逻辑,并对蛋白质受体位点的组合进行了适当次数的试验。这样,我们的结果(负数越大,抑制性越强)可能更好地反映了一种化合物击败病毒自我复制能力的倾向,如下图所示。
我们如何有效地将这一工具应用于冠状病毒的主要蛋白酶?
当早期的 SARS 病毒在 2003 年首次袭击时,在随后的几年中,研究人员有足够的时间和资金对病毒的主要蛋白酶 Mpro(在早期的 SARS 文献中通常称为 3CLpro)进行体外抑制研究。研究人员正在研究确定哪些化合物可以抑制这种蛋白酶在培养皿中的生长(称为体外)。
为什么以蛋白酶为目标?因为它能一次性杀死病毒。蛋白酶作为靶标的功效已经得到了很好的确立,特别是得益于 20 世纪 90 年代出现的 HIV 蛋白酶抑制剂。
关键的是,SARS 2003 冠状病毒与目前的 2019 冠状病毒非常非常相似。这两种病毒的主要蛋白酶在氨基酸序列上有 95%的同一性,主要区别在于它们的三维折叠结构。
将体外结果视为我们的“真理来源”,我们将我们对 2003 年 SARS Mpro 的 Autodock 研究结果与自该流行病以来 16 年间研究人员的体外结果进行了逐个化合物的比较。然而,很难知道在现实生活中,体外研究人员设法将他们的抑制化合物结合到哪个目标位点。就像一种真正的化合物可以结合到不同的位点并有可能抑制一样,我们也可以在不同的位点靶向自动对接。
因此,我们必须探索自动对接目标结果的不同组合。通过比较盲法、A 和 B 对接研究的组合结果(首先是单独的,然后是彼此不同的组合)并与相同化合物的真实体外数据进行比较,我们得出了以下与真实数据相关性最高的组合:

经处理的 Autodock 结果与体外研究的相关性
我们获得了 0.362 的 R,这是一个对于生化病毒学研究来说并非非典型的值。
形成分类器的时间
有了相关性,我们现在可以开发一个分类器,用于将抑制性的‘命中’配体与无价值的‘缺失’配体分开。
体外研究人员将任何抑制浓度为 100 uM(微摩尔)或更低的化合物视为体外“命中”的低端截止值。这相当于 log10 值为 2.0。因此,我们通过将模拟的 27 种化合物针对相似的原始 SARS (2003)冠状病毒 Mpro 的多个活性位点的 Autodock Vina 结果与相同化合物的那些实际的体外实验室抑制结果进行比较,来训练我们的分类器。我们对几个活跃网站的 Vina 结果进行了最符合实际的表述,得出了以下命中失误图表:

Autodock Vina 结果的 ML 分类器的 27 种化合物训练集适用于 SARS-2003 化合物
受益于这个训练集,我们分析了我们的 Vina 结果公式对一个额外的 8 化合物测试集。分类器证明,任何具有 -7.7 千卡/摩尔分数或以上的物质都应被归类为“击中”。

我们的 ML 分类器对另外 8 种化合物的测试结果,也是基于 SARS-2003。
我们的 ML 分类器对另外 8 种化合物的测试结果,也是基于 SARS-2003。
基于测试集,我们的分类器显示了 87.5% 的分类准确率。
离别的思绪
请考虑鼓励你自己准备好工具,在家尝试你自己的对接研究。在野外有许多感兴趣的病毒酶(和正常的生化过程蛋白),人们可以尝试与之对接。如上所述,通过将结果与已公布的真实体外研究结果进行比较,确保你的模拟是有根据的。你想把假阳性和真阴性保持在最低限度,但是谦逊要求你接受即使这样也会有一些假阳性和真阴性。
正如本文开头提到的,即使你有了体外 hits,仍然需要对摄入的任何物质应用整个药代动力学建模过程(这被称为 ADME 建模),以及细胞膜进入建模,以防你的候选药物需要进入细胞内部。甚至还有药物相互作用模型来避免药物在人体内的意外后果。这些工具比药物对接处于更早的成熟水*,但也许配备生化设备的数据科学家可以帮助这些努力更快地达到成熟。
但总的来说,计算机是运行模拟生化分析的一个非常安全的环境。(到了得出结论和开始实验室测试的时候,问题就开始了)。但是在你达到那一点之前,无论如何,D̶o̶n̶'̶t̶在家里试试这个。
正如全球毒品码头工人喜欢说的那样— —“对接愉快!”😃
作者想要感谢 1 .开源软件 Autodock、Vina、MGLTools 的创始人和贡献者 2 .MTiOS 主持的对接计划;第三。英国剑桥大学蛋白质晶体学博士余伟臣,致力于 跨越 几十年来 构建意识的计算药物对接工具。
9 月 3 日更新:之前的描述称 Vina 考虑了受体和配体之间原子对的极性。事实上并非如此;相反,Vina 根据两个原子之间形成的键的类型进行评分,但没有执行基于物理学的原子之间的极性模型。这是有意的,因为它 比 Vina 开发之前基于物理的模型更好地匹配了真实世界的蛋白质-配体结合亲和力 。
RNN(及其变体)中的屏蔽是如何工作的,为什么
原文:https://towardsdatascience.com/how-does-masking-work-in-an-rnn-and-variants-and-why-537bf63c306d?source=collection_archive---------30-----------------------
Keras 有一个掩蔽特性,在 RNNs 中经常提到。在这里,我给出了一个快速的可视化来展示它做了什么,并解释了为什么需要这样做。
如果你正在阅读这篇文章,你可能知道为了计算效率以及减少梯度下降路径中的太多随机性,学习是分批进行的(出于某种原因被命名为小分批)。如果您正在处理序列,那么在大多数情况下,序列的长度不会相同,然后要进行批处理,您需要对序列进行“0 填充”。这可以在序列的开始或结束时完成。
现在,如果你在这样的小批量上学习,你的系统最终会学习忽略 0 填充的条目,但这将浪费学习周期。因此,你应该用这个来帮助你的算法。
在 Keras 中,您可以通过向支持它的层提供遮罩来打开遮罩,嵌入层甚至可以生成这样的遮罩。您可以在张量流指南中找到详细信息。
在这篇短文中,我将帮助您直观地了解 RNNs 及其变体中掩蔽的作用。
我们认为迷你电池
inputs=tf.constant([[1,2,4,0,0,0],
[0,0,0,1,2,4],
[0,1,0,5,7,0]
])
如上所述,第一个元素是“后填充”,第二个是“前填充”,第三个是随机插入 0 的序列。我们将看到掩蔽对这三者的影响。
我们制作一个普通的 RNN 单元,它通过给状态加 1 来修改状态,并输出输入和 new_state 元组。这是非常不现实的,但将有助于我们想象在喀拉什发生了什么
class TrivialRNNCell(keras.layers.SimpleRNNCell):
def call(self,inp,state):
next_state=state[0]+1.
return (inp,next_state), next_state
最后,我们使用 Keras 的函数式 API 制作了一个非常简单的模型
inputs=keras.layers.Input(shape=(None,1))
mask = keras.layers.Lambda(lambda inputs: K.not_equal(inputs,3))(inputs)
seq,state=keras.layers.RNN(TrivialRNNCell(1), return_sequences=True,return_state=True)(inputs,mask=mask)
model=keras.Model(inputs=[inputs],outputs=[seq,state])
该模型将小批量作为输入,并将 RNN 输出和状态作为输出。

正如你在上面看到的, 所有被屏蔽的值都被忽略,那些时间步长的输出和状态只是从最后一个非屏蔽状态复制过来的。
为什么会有这种行为?对于一个最后被填充的序列,很容易看出我们想要的 RNN 隐藏状态是最后一个有效(非填充)输入步骤的状态。这正是第一个例子中发生的情况。如果我们在开始时填充了一个序列,那么默认状态将继续,直到遇到第一个相关状态,这就是第二个示例中发生的情况。第三个例子在处理缺失数据时可能有用,在这种情况下,插补方法是简单地结转最后的结果(这是与时间序列数据相关的因果插补)。
这部分总结了我想在这里说的,但请阅读张量流指南,看看掩蔽还有什么作用。一般来说,您还希望确保损失函数只考虑实际数据(而不是填充产生的虚假数据),而掩码对此很有用。此外,在注意机制中,你要注意与此相关的真实数据掩蔽。事实上,我是在全神贯注地为一个编码器-解码器架构编写代码时产生了这篇文章的想法。最后,掩蔽也与保持因果关系相关。
项目管理如何在数据科学中发挥作用?
原文:https://towardsdatascience.com/how-does-project-management-work-in-data-science-1c2b2522741?source=collection_archive---------42-----------------------
为什么将数据科学融入传统的项目管理方法如此困难?
愚蠢的一致性是心胸狭窄的妖怪。
拉尔夫·沃尔多·爱默生(1803-1882)
数据科学通常不太适合其他学科早已确立的标准项目管理方法。这是为什么呢?
数据科学项目传统上涉及一个漫长的探索阶段,甚至在项目后期还有许多未知因素。这不同于传统的软件开发,在传统的软件开发中,一开始就可以列举和量化任务。软件项目经理通常会在编写一行代码之前定义项目的持续时间和最终结果。
传统方法

甘特图的一个例子。来源:维基媒体
最著名的传统项目管理方法有
- 瀑布——以甘特图而闻名,一种显示任务及其依赖关系的级联条形图。
- 敏捷——任务分成 1-2 周的冲刺。
- 看板——卡片从到从左到右穿过一块板,进入进程到完成。
- 还有一个面向数据科学的项目管理系统叫做 CRISP-DM ,它涉及到项目的一系列阶段:业务理解、数据理解、数据准备、建模、评估、部署。
我认为所有这些方法的主要问题是数据科学项目是高度不可预测的,并且容易发生变化。不幸的是,在投入相当大的努力之前,通常甚至不可能预测数据科学项目可以实现什么。
那怎么办呢?
我建议在一周的初步探索阶段结束之前,不要决定项目结构。
然后,我建议确定业务需求:
- 部署的预测模型?
- 独立分析?
- 一个完整的网站和 API?
关键是灵活性,这些需求以后可能会改变。
一个例子
让我们举一个例子:一个部署预测模型的项目。让我们假设商业广告和利益相关者的认同已经到位。假设一家假设的企业想要一个预测模型来预测其客户将购买哪些产品。
该项目可能大致分以下几个阶段进行:
- 2-5 天:了解业务问题。
- 2-5 天:了解可用的数据。你开始了解这个项目是否可行,以及它是否会持续几周、几个月或几年。
- 10-20 天:建立一个“快速和肮脏”的原型。这可能只能在笔记本电脑上运行,但会给涉众一种可以实现的定性感觉。
- 利益相关者会议:定义 KPI 和需求、时间表等。到这个时候,你就会知道这个项目需要多长时间——比软件开发或建设项目要晚得多。
- 3-6 个月:完善模型,并找出如何让它在实时数据上运行。这通常包括建立 200 个不同的模型,根据 KPI 评估每个模型。随着项目和模型的形成,在整个过程中还将与涉众进行密切的沟通。
- 3 个月:部署、负载测试、质量保证,确保它与客户的系统集成。这涉及到客户端的开发人员,可以用常用的软件开发工具进行项目管理。
- 利益相关者会议,以评估项目结果、结束项目、移交、文档和维护计划等。
除了最后的部署阶段,我建议项目的所有阶段都应该非常灵活地定义。
特别是,如果你在第一次尝试量化一项任务时认为它需要 1 个月的时间,实际上它通常需要 2 个月,因为所有未知的障碍都有可能出现。项目中的任何一点都可能出现意外,所有意外都会延长而不是缩短总持续时间。
这种灵活性的另一面是,与利益相关方的定期会议、电子邮件和沟通是必不可少的,以确保企业了解最新的项目进展,数据科学家获得他们需要的一切(数据、安全访问、企业相关部门的合作等)。
结论
关键在名字:数据科学。科学包括定义假设并测试它,而数据科学包括尝试、失败和改进的迭代过程。试图将它硬塞到其他学科的项目管理技术中以失败告终,并增加了项目失败或被放弃的可能性。
我不想建议根本不要使用敏捷或瀑布方法。事实上,它们可能是必不可少的,尤其是当您必须扩展数据科学团队时。然而,所采用的任何项目管理方法都只能作为指导方针,而不能严格遵守。
Python 是如何工作的?
原文:https://towardsdatascience.com/how-does-python-work-6f21fd197888?source=collection_archive---------1-----------------------
简单解释 Python 代码的执行与旧的编程语言有何不同。

图片来源—https://encrypted-tbn0.gstatic.com/images?q = tbn:and 9 gcqaq 5 hozajawskwfboxnonyww-mg 4d XL 7 CWC-1 gufkyvvitnvh 8 sa&s
作为一名机器学习工程师,我使用 Python 已经一年多了。最*也开始学 C++,为了好玩。这让我意识到 Python 是多么的简单和直观。我对 Python 与其他语言的不同之处及其工作原理更加好奇。在这篇博客中,我试图了解 Python 的内部工作原理。
Python 最初是 Guido Van Rossum 的爱好项目,于 1991 年首次发布。作为一种通用语言,Python 正在为网飞和 Instagram 等许多公司提供支持。在的一次采访中,Guido 将 Python 与 Java 或 Swift 等语言进行了比较,并表示后两者是软件开发人员的绝佳选择——他们的日常工作是编程,但 Python 是为那些日常工作与软件开发无关,但他们主要是为了处理数据而编码的人而设计的。
当你阅读 Python 的时候,你经常会遇到这样的词——编译 vs 解释,字节码 vs 机器码,动态类型 vs 静态类型,垃圾收集器等等。维基百科将 Python 描述为
Python 是一种解释的、高级、通用、编程语言。它是动态类型化的和垃圾收集的。
解释语言
当你用 C/C++写程序时,你必须编译它。编译包括将你的人类可理解的代码翻译成机器可理解的代码,或机器代码。机器码是可由 CPU 直接执行的指令的基础级形式。成功编译后,您的代码会生成一个可执行文件。执行该文件会逐步运行代码中的操作。
在很大程度上,Python 是一种解释型语言,而不是编译型语言,尽管编译是一个步骤。Python 代码,用写的。py 文件首先被编译成所谓的字节码(将进一步详细讨论),它与一起存储。pyc 或。pyo 格式。
它不是像 C++那样把源代码翻译成机器码,而是把 Python 代码翻译成字节码。这个字节码是一组低级指令,可以由一个解释器执行。在大多数 PC 中,Python 解释器安装在/usr/local/bin/Python 3.8 .不是在 CPU 上执行指令,而是在虚拟机上执行字节码指令。
为什么解释?
解释语言的一个普遍优点是它们是独立于*台的。只要 Python 字节码和虚拟机的版本相同,Python 字节码就可以在任何*台(Windows、MacOS 等)上执行。
动态类型是另一个优势。在像 C++这样的静态类型语言中,您必须声明变量类型,任何差异,比如添加一个字符串和一个整数,都会在编译时被检查。在像 Python 这样的强类型语言中,检查变量类型和执行的操作的有效性是解释器的工作。
解释语言的缺点
动态类型提供了很大的自由度,但同时也使代码有风险,有时很难调试。
Python 经常被指责‘慢’。虽然这个术语是相对的,并且有很多争议,但是速度慢的原因是因为解释器必须做额外的工作,将字节码指令翻译成可以在机器上执行的形式。一篇 StackOverflow 的帖子用一个类比更容易理解—
如果你可以用你的母语和别人交谈,这通常比让翻译把你的语言翻译成其他语言让听者理解要快得多。
垃圾回收到底是什么?
在早期的编程语言中,内存分配是相当手工的。很多时候,当你在程序中使用不再使用或不再被引用的变量时,它们需要从内存中清除。垃圾收集器会帮你做这件事。它自动释放空间,无需你做任何事情。内存管理有两种方式——
简单地说,它跟踪对一个对象的引用次数。当这个数字下降到零时,它会删除该对象。这被称为引用计数。这在 Python 中是不能禁用的。
在对象引用自身或者两个对象相互引用的情况下,一个叫做的代垃圾收集的过程会有所帮助。这是传统的引用计数无法做到的。
什么是 pycache?
在您的个人项目或 GitHub 上,您可能会多次看到名为 pycache 的文件夹被自动创建。
/folder - __pycache__ - preprocess.cpython-36.pyc - preprocess.py
如您所见,该文件名与 pycache 文件夹外的文件名相同。的。pyc 扩展告诉我们文件包含 preprocess.py 的字节码。名字 cpython 表示解释器的类型。CPython 意味着解释器是用 C 语言实现的。类似地,JPython 是用 Java 实现的 Python 解释器。
但是为什么首先要创建文件夹呢?嗯,它稍微提高了 Python 程序的速度。除非您更改 Python 代码,否则可以避免重新编译成字节码,从而节省时间。
我已经开始了我的个人博客,我不打算在媒体上写更多令人惊叹的文章。通过订阅 thenlp.space 支持我的博客
恶劣天气如何影响您的客户?
原文:https://towardsdatascience.com/how-does-severe-weather-affect-your-customers-26144b95642c?source=collection_archive---------29-----------------------
如何创建风暴事件的动画可视化

图片由 Free-Photos 来自 Pixabay
我们经常被要求寻找关于客户的新见解。有时我们得到指导,有时我们被告知开发一些“新”的东西。
我想建议把恶劣天气作为一层数据。如果客户所在地区正在经历极端天气事件,他们的行为会发生变化吗?他们会在网上购物、*衡投资资产配置、阅读电子邮件、联系呼叫中心或注册新的数字产品吗?不同的天气事件是否与特定的客户行为相关?您能够根据天气预报预测未来的客户活动吗?这有业务用例吗?
所以你的基础数据就是你的客户业务数据。“Flair”是天气数据。
天气数据可能很难掌握,但我确实有一个对我很有用的来源。国家环境信息中心是一个有用的资源。可以下载。您要分析的时间段的 csv 文件。
[## 风暴事件数据库
NCEI >风暴事件数据库批量数据下载该数据库目前包含从 1950 年 1 月到 2020 年 6 月的数据,如…
www.ncdc.noaa.gov](https://www.ncdc.noaa.gov/stormevents/ftp.jsp)
对于这个例子,我提取了 2020 年的恶劣天气事件细节。
数据字典—作者截图
我将这些信息加载到 Tableau Public 中。Tableau Public 对你我都是免费的!
以下是我制作 viz 动画的一些关键步骤。

如何设置动画—作者截图
- 在页面架上,放下事件的数据。这将添加一个特殊的动作框,你可以点击播放。添加日期序列将按增量(在本例中为天)遍历数据,显示所请求的数据。
- 为了激活地图选项,我在图表中添加了 begin_location。该数据将事件的位置放置在地图上。
- 我对事件类型感兴趣。您还可以将事件类型添加到过滤器架,以关注特定情况,如龙卷风、洪水、飓风或暴风雪。
- 为了增加一些严重性,我在 size 参数中加入了财产损失。伤害成本越高,圈子越大。
一旦你准备好了,你点击播放按钮,天气就开始变化了。有时候,你可以看到风暴系统从西向东沿着阿巴拉契亚山脉移动。


请随意下载该笔记本,将您的业务数据分层。我把它发表在 Tableau Public:https://public.tableau.com/profile/dmoyer#!/viz home/2020 weather inmotion/Location
尽情享受吧!
英国的新冠肺炎应对措施有多有效?
原文:https://towardsdatascience.com/how-effective-is-the-uks-covid-19-response-9de2f270f794?source=collection_archive---------57-----------------------

图像来源
在英国封锁的第一周,一位同事分享了这篇来自华盛顿邮报的文章。我受到了疾病如何传播的伟大模拟和一些社会距离措施如何有助于减少传播的演示的启发。
作为对这篇文章的回应,我决定重新创建这些模拟,并为它们添加更多的细节。在本文中,我将讨论一些有趣的特定场景。相比之下,所有的场景都运行了相同的时间长度,但在某些情况下,这并没有足够的时间让疾病完全发展。
作者注: 马特·克鲁克斯*是一位从事数据科学家工作的数学家。他不是健康专家、流行病学家或政府顾问。虽然本文中的模拟旨在展示某些真实现象,但它们并不代表病毒对政府干预的实际反应。想了解更多关于疫情冠状病毒的信息,可以点击* 这里 。
无响应场景
我看到的第一种情况不涉及政府干预。它还排除了人们产生免疫力的可能性,因此如果他们与感染者接触,可能会再次感染病毒。
在下面的动画中,每个点代表一个四处走动和与人交往的人。如果两个人密切接触,感染者(橙色)和健康人(蓝色)之间会发生传播。我给每个点分配了一个年龄,与英国人口的正确比例大致相同。随机应用每个年龄范围的相应恢复率,死亡率随年龄呈指数增长。
我想强调的是,死亡率在模拟中被夸大了
在首次出现症状一周后,每个人随机地要么康复(变回蓝色)要么死亡(变红),其概率基于与年龄相关的恢复率。这里的大部分红点将与更古老的时代联系在一起。

每个点代表一个人四处走动和与人交往。如果人们密切接触,感染者(橙色)和健康人(蓝色)之间会发生传播。红点表示死亡。
下面显示了每个类别中人口的比例,时间沿 x 轴增加(有意模糊,因为它不代表真实时间)。我们可以看到这种疾病传播很快,直到大多数人被感染。尽管在任何特定时间都有一小部分人没有被感染,但这种疾病仍然非常普遍。每一次再感染都有死亡的风险,一次恢复并不意味着长期存活。我们还可以看到模拟早期臭名昭著的指数增长。

免疫反应情景
目前的证据表明,身体确实产生了免疫反应,至少在短期内——这表明康复的人不会再次感染。
在下面的模拟人中,那些康复的人会变成绿色,并且无法感染其他人。

从下图中我们可以看到,橙色区域的初始指数增长完全相同,因为我们必须等待人们恢复,然后免疫反应才会发生(绿色区域)。橙色区域显示的是活的感染,是我们听说过的“钟形”曲线。一段时间后,剩余的种群会产生完全的群体免疫。
死亡率也显著下降,因为在之前的场景中,每次有人被感染时,死亡的概率是随机的。在目前的情况下,人们只需要恢复一次就能获得免疫力。**

自我隔离
英国政府的第一反应是要求出现症状的人留在室内,7 天内不要与任何人接触。这样做的一个问题是,可能需要 5 天症状才会出现,在此期间,这个人可能仍然会感染其他人。
下面你会看到人们被感染(变成橙色),然后过一会儿就静止不动了——这是他们自我隔离,在此期间他们不会感染任何人。7 天后,大多数人产生免疫力,变成绿色,并开始再次走动。

至少在这个模拟中,自我隔离只有轻微的影响。这可能是由于早期的快速传播——大多数人在第一次感染出现症状并开始自我隔离之前就得了这种疾病。然而,我们确实看到“钟形曲线”的峰值从 80%的感染率下降到 75%。我们还可以看到尾部向峰顶右侧延伸。

社交距离
全球几乎每个国家的关键反应之一是社会距离——让人们保持 2 米的距离以降低传播速度。我们听说过很多关于“拉*曲线”的说法,它指的是加宽和缩短上面的橙色钟形曲线形状。
在下面的模拟中,我们看到最初的 3 种感染在很长一段时间内只发展成局部群集,这些群集内的人在疾病变得更广泛传播之前开始康复。

下面我们可以看到曲线急剧变*。现在曲线中没有明显的峰值。感染率最高可达 30-40 %,这个数字保持相当稳定——防止 NHS 同时被所有感染淹没。
我们也看到一部分人(10%)从未感染过这种病毒。虽然值得注意的是,模拟结束时仍有活感染(12%)。

无症状病例
事实上,症状出现*均需要 5 天时间,据信有 50%的人根本没有表现出任何症状。这似乎在儿童和年轻人中更为普遍。
模拟中的每个年龄都有不同的无症状可能性,老年人都有症状,只有极少数 10 岁以下的人有症状。如果我们考虑到无症状病例,那么我们将开始看到一些受感染的橙色圆点继续四处移动,并感染人们,即使他们已经开始自我隔离。

我们可以在下面看到,在模拟的中间区域有更多的感染,与逐渐下降到 30%相比,这段时间的感染率更稳定,为 40%。

学校关闭
学校停课对派对来说太晚了。我在上一节中展示无症状病例的影响的主要原因是,无症状病例在学龄儿童中的比例过高。我们可以通过在模拟中隔离 18 岁以下的学生来模拟学校关闭。这可以防止他们传染给其他人。在下面的模拟中,你会看到一些静止的蓝点,代表留在家中的健康儿童。

我们可以在下面看到,峰值再次下降到 40%以下。我们也看到病例的逐渐增加和急剧下降。这一点在避免被感染的人数中表现得最为明显,如模拟结束时的蓝色区域所示——28%的人口,相比之下,上图中只有 10%(同样,仍有活跃的感染,这可能会减少 28%)。我们还可以看到死亡率显著下降——首次降至 10%以下。

保护弱势群体
由于新冠肺炎在社会中最脆弱的人群中引起了更严重的反应,英国政府已经要求那些最危险的人进行防护——避免与他们家以外的其他人进行任何接触。在我们的模拟中,我们可以隔离 70 岁以上的人,防止他们被感染。在模拟中,你会看到很大一部分静止的蓝点,代表 70 岁以上的老人和学生。

通过隔离 70 岁以上的老人,我们减少了四处走动的人数,从而增加了模拟中的社会距离。这将感染的峰值进一步降低到大约 25%。不过,它对死亡率的影响最为显著。通过防止这些人患上这种疾病,我们可以对死亡率产生显著的影响——在模拟中将其降低到大约 3%。
我想再次强调,这些模拟中使用的死亡率是不现实的

结论
虽然这些模拟不是真实生活,但希望你能看到英国政府实施的一些社交距离措施的有效性。
机器学习探测系外行星的效率有多高?
原文:https://towardsdatascience.com/how-efficient-is-machine-learning-to-detect-exoplanets-78037f502b73?source=collection_archive---------26-----------------------
“在某个地方,一些不可思议的事情正等待被知晓。”卡尔·萨根

照片由格雷格·拉科齐在 Unsplash 上拍摄
我们生活在一个其规模超出我们想象的宇宙中。这个事实让我们质疑我们在宇宙中的位置,很自然地,我们问了这个问题:“我们在宇宙中是孤独的吗?”。它确实是一个大宇宙,只是观测部分覆盖了 10 颗⁴估计的恒星和 50×10 颗与地球相似的行星。
当我看着这些数字时,我会说,“哇,除了我们的星球之外,一定还有生命。”但是,我们没有任何证据来证明这一点,除了最*在金星的大气中发现的磷化氢。尽管如此,它并不是完全可靠的。今天,在望远镜、人造卫星和计算机等技术的帮助下,我们有可能研究其他恒星周围的行星。我们正在努力寻找像我们一样的其他行星和太阳系。

版权所有:欧空局
所以,出于对天文学的好奇,我决定在 Nasa 的系外行星档案上开发一个机器学习项目。通过这个项目,我的目标是测量 M.L 算法寻找其他行星的效率。
什么是系外行星?
系外行星是指在太阳系外围绕恒星运行的行星。搜寻系外行星有两个任务:开普勒,现在已经结束了,还有继续进行的 Tess 任务。这些年来,这些望远镜发现了许多系外行星。因此,我提取了观测恒星的数据集,以便找到系外行星。

版权所有:欧空局
第一步:数据知识
提取的 Nasa 数据集包含 9564 行和 141 列,这些列是关于恒星的特征,但我只需要每个恒星的时序通量数据。因此,我使用了lightkurve包来维护时序流量数据。
#method to gather flux data
def TFsinglestarpipe(kepid):
try:
tpf = KeplerTargetPixelFile.from_archive(kepid, quarter = 1)
lc = tpf.to_lightcurve(aperture_mask=tpf.pipeline_mask)
flat, trend = lc.flatten(window_length=301, return_trend=True)
df = flat.to_pandas()df['KeplerID'] = kepid
df = df.drop(columns = ['time',
'flux_err',
'quality',
'centroid_row',
'centroid_col',
'KeplerID'], axis=1)
df = df.reset_index(drop=True)
df.index.names = [kepid]
flux = df['flux']
array = list(flux)
return array
except:
return None
在收集通量数据后,我得到了一个包含 7888 行和 1627 行的数据集——其中一列是 disposition feature,它指示了一颗恒星是否存在系外行星的状态。

有系外行星和无系外行星恒星的归一化通量水*。作者图片
步骤 2:特征工程
嗯,我的数据集是时间序列,不太适合机器学习算法,因为它有 1626 列。因此,我决定创建自己的数据集,其中包含更多的特征。
首先,我定义了具有统计显著性的特征:
#median flux
medians = []
for i in range(len(df)):
medians.append(np.median(df_values[i]))
#std
stds = []
for i in range(len(df)):
stds.append(np.std(df_values[i]))
#min flux
minimum = []
for i in range(len(df)):
minimum.append(np.amin(df_values[i]))
#max flux
maximum = []
for i in range(len(df)):
maximum.append(np.amax(df_values[i]))
#first percentile
frst_perc = []
for i in range(len(df)):
frst_perc.append(np.percentile(df_values[i], 1))#third percentile
thrd_perc = []
for i in range(len(df)):
thrd_perc.append(np.percentile(df_values[i], 3))#fifth percentile
fifth_perc = []
for i in range(len(df)):
fifth_perc.append(np.percentile(df_values[i], 5))
#seventh percentile
seventh_perc = []
for i in range(len(df)):
seventh_perc.append(np.percentile(df_values[i], 7))
#delta
delta = []
for i in range(len(df)):
delta.append(maximum[i]-minimum[i])

新约简数据集的相关矩阵。作者图片
步骤 3:分类模型
各种算法可用于分类任务。我从逻辑回归、朴素贝叶斯、SVC 等基本模型开始,然后跳到随机森林等集合模型。

作者图片
我的方法是,在运行完本节中的所有模型后,选择最佳模型进行优化。因此,我用默认参数运行了所有的模型,以查看结果。左图是我分类模型的结果。
我在 Bagging 分类器上得到最好的测试精度,因此我用它进行网格搜索。
n_est = [60, 80, 100, 120, 140, 160, 180, 200]
max_features_opt = [0.88, 0.91, 0.93, 0.95, 0.97, 0.99]param_grid = dict(n_estimators = n_est, max_features = max_features_opt)# GridSearchCV on the Bagging Classifier model to make it more robust
# Cross-validation
kf = KFold(n_splits = 10, shuffle = True, random_state = 76)
bag_grid = GridSearchCV(bag, param_grid, cv=kf, scoring='accuracy',
n_jobs=-1, verbose=1)
bag_grid.fit(X_train, y_train)
于是,我用GridSearchCV调了调我的模型的参数,结果得到了 65,8%的准确率分数。以下是优化模型的相关矩阵:

作者图片
步骤 4:结论和进一步的工作
- 我通过定义的模型得到的最好结果是大约 67%的测试准确度。
- 我可以说 M.L 模型不太擅长寻找系外行星。但这并不是彻底的失败。
- 根据特征重要性表,确定系外行星候选的最大因素是最小通量。
作为进一步的工作:
- 我计划将 TESS 数据纳入项目中。
- 视觉识别和神经模型可以添加到项目中。
此外,如果你想了解更多,也可以看看我的 Github 简介!
流行病如何呈指数传播,社会距离和受欢迎的地方如何影响它?
原文:https://towardsdatascience.com/how-epidemics-spread-exponentially-and-how-social-distancing-and-popular-places-affect-it-5ca79979f988?source=collection_archive---------80-----------------------
使用 SIR 模型在 Python 中模拟城市内、城市间的人口流动动态以及热门地点的影响

来源:via pixabay
免责声明:我是数据科学家,不是流行病学家。此模拟仅用于教育目的,不用于决策。
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
新型冠状病毒(新冠肺炎)的爆发在不到半年的时间里已经感染了数百万人。始于一座城市的东西被世卫组织宣布为疫情。在没有任何预防措施的情况下,这种病毒以指数方式传播,每隔几天就翻一番。

来源:我们的数据世界
这种指数式的增长是可怕的,但如果人们实行“社交距离”和其他锁定措施,这种增长可以放缓。为了理解这些行动的重要性,这里将模拟这种疾病在一个假设的城市中的传播。疾病的传播将通过 SIR 模型在划分为不同社区的几何区域内进行建模。人们可以在这样的社区之间旅行,他们的移动将使用转移概率矩阵来控制。人员移动的思想基于一阶马尔可夫链,并且移动将仅取决于他们的当前位置。通过更新转移概率,我们将模拟不同的实验。
什么是 SIR(易感——传染——去除)模型?
SIR 模型是研究最多和最稳健的房室模型之一,许多模型都是这种基本形式的衍生物。该模型由三个区间组成:【S(t)】为易感者数量,【I(t)为传染者数量,【R(t)为给定时间移除(痊愈、死亡或免疫)个体数量【t】。SIR 模型是动态的,因为三种状态下的个体数量随时间而变化。我们将在没有生命动力学的情况下对 SIR 进行建模,即不考虑疾病本身以外的出生或死亡,使总人口保持不变。这背后的一个想法是,像新冠肺炎这样的疾病的动力学比出生和死亡的动力学要快得多。
S(t) + I(t) + R(t) = N(常数值)
SIR 模型可以定义为三个常微分方程(ODE)的集合:

其中,【s(t)I(t)r(t)是在时刻易感、感染、被清除的一小部分人群。 b 为感染率 k 为治愈率。需要注意的一点是,因为我们是在没有生命动力学的情况下建模,所以三个 ODE 的和是 0,表示没有从外部添加或删除新的群体

感染率和恢复率的值?
在我们继续之前,我们将不得不估计感染率和恢复率的值。我们可以通过对这两个参数进行网格搜索来找到最优值,该最优值最小化感染和去除状态的模拟计数和实际计数之间的 RMSE。让我们先做一些假设:
- 由于我们将 R 状态视为已恢复和已死亡,我们将死亡和已恢复计数相加为一个值
- 我们将使用德国的数据,因为:
- 在撰写本报告时,德国也是检测数量最多的国家之一,并已开始检测和记录第一例患者的数据
- 在撰写本文时,德国已经越过了感染高峰期,在过去的一个月中,活跃病例正在下降[1]
在计算 RMSE 时,传染状态和恢复状态的误差将被赋予相等的权重

从上述方法中观察到:
- 参数估计为b = 0.27k = 0.07这意味着患者保持感染状态的*均天数约为 2 周【1/k】。这与恢复持续时间的实际范围一致[2]
- 新冠肺炎的 R0 值或基本再现数为【b/k】=3.9。而实际期望值为1.4–5.7[3]
- 预测计数和实际计数的曲线高度相关,并且彼此一致
基于以上几点,我们可以得出结论,我们的研究可以考虑估计的比率。
实验—锁定
在下面的实验中,模拟将在一个分成 400 个社区的城市中进行(在 20 * 20 的网格中)。每个个体将属于一个社区(我们可以称之为他的家的位置),并且可以基于一些概率移动到其他社区。这些转移概率将按如下方式计算:
- 对于一个给定的社区 i ,它的邻居将被存储在一个名为“ 到 的列表中
- 一些非邻居将被随机选择并添加到同一列表''中**
- 随机概率将被分配给列表'--'中的每个位置。这些概率将是从社区 i 移动到列表“”中的位置的概率
- 将对所有社区重复步骤 1-3
例如,对于生活在社区中的一个人(用红色边框标记),我们有以下转移概率(每个单元代表一个社区):

实验 1: SIR 模型,人们不受任何限制地跨社区移动。
在这个实验中,我们将看到如果不采取预防措施,并且允许所有人不受任何限制地旅行,这种疾病将如何传播。(要了解如何创建下面的动画,请查看下面的文章— 使用 gifski 制作 R 中的任何图形的动画)

不受任何限制,90%的人在 200 天感染,其中2437天 103 。该图在第 50 天左右达到第一个*稳期。在第 75 天之后,斜率再次开始增加,并在第 103 天达到峰值。在右边的动画中,我们可以看到高感染区域达到了城市网格的对角线,并且在第 100 天的右下角创建了一个新的感染热点。****
实验二:25%运动限制的 SIR 模型。
在这个实验中,人们以 0.25 的概率留在他们的家乡社区,因此,模拟了25%的移动受到限制的情况。

在这种情况下,88%的人群仍然受到了感染。但是感染高峰在 13 天之后到达,剧情稍微*缓了一些。**
实验三:50%运动限制的 SIR 模型。
在这个实验中,人们以【0.50】的概率留在他们的家庭社区,因此,模拟了% 50%移动受到限制的情况。

随着 50%的封锁,我们能够减少疾病的影响,只有 49%的人口在 200 天内受到感染。一天中的最大活跃病例也减少到只有1053,并且发生在第 146 天(而在实验 1 中它发生在第 103 )。我们可以说,限制运动一半,大大有助于“拉*曲线”。
实验 4:75%运动限制的 SIR 模型。
在这个实验中,人们以 0.75的概率留在他们的家庭社区中,因此,模拟了一种【75%】运动受到限制的情况。

75% 一级防范禁闭大大减少了疾病的传播。在 200 天内只有 30% 人群感染,感染高峰值仅在第 147 天(比未封锁病例晚 44 天)。我们还可以在热图动画中看到,传播非常缓慢。与没有封锁的第 100 天相比,75%的封锁在第 100 天几乎没有扩散,感染局限在中左部分的一小块区域。由于 100%的完全锁定是不可能的,我们可以在 75%时停止锁定分析。****
有了这个分析,我们可以得出结论:少量的锁定 ( 25%) 只会少量的减少疾病的影响。但是,当我们将锁定增加到高于 50% 时,曲线变*的效果将非常显著。
实验——增加一个受欢迎的位置,如超市
实验五:在市中心有热门场所的 SIR 模型。
在这个实验中,我们将看到超市、商场等受欢迎场所的存在。影响疾病的传播。我们将在市中心增加一个这样的地方,每个人每周都会去一次。

有一个人人都去的受欢迎的地方使得病毒很容易传播到城市的各个地方。正因为如此,感染高峰出现得更早(在 第 66天),活跃病例数更高,为3,255 例(对于实验 1,高峰出现在第 102 天,活跃病例数为*2,437 例)。***
在右边的热图中,我们还可以看到中心社区(有受欢迎的地方)在一开始就被突出显示,这有助于将病毒传播到不同的部分。在 第 100天,传播穿过了城市的对角线部分(而在之前的所有实验中,传播从未在第 100 天穿过对角线)。
实验六:锁定热门地点后的 SIR 模型。
在这个实验中,我们将把受欢迎的地方(这有助于传播疾病)封锁起来,看看它如何影响传播。这意味着不允许任何人去受欢迎的地方。否则,所有人都可以自由迁移到其他社区。

中间的灰色单元格显示了这三个州中任何一个州的 0 人口的热门地点。结果几乎与实验 1 的结果相似,总感染数略有减少。
实验 7: SIR 模型,热门地点是唯一允许去的地方。
在这个实验中,我们将只允许人们参观受欢迎的地方,其他所有活动都受到限制。

这次感染率非常低。由于每个人只被允许移动到一个地方,即使概率很低,这种疾病也得到了很好的控制。
实验——双城动态
实验八:两个城市之间的建模。
在本实验中,两个城市通过一条路线连接。感染始于 1 号城市,慢慢蔓延到 2 号城市。转移概率矩阵创建如下:
- 为两个城市(TM_1 和 TM_2)随机创建转移矩阵
- 两个城市的中心位置被选为他们的机场
- 一个城市中所有个人去机场的概率改为 1/14 (期望人们两周去一次另一个城市)
- 转移矩阵按行标准化,使概率之和为 1

我们从城市 1 开始感染,然后蔓延到城市 2。我们可以看到,城市 1 的感染高峰更早,活跃病例数最高4786。城市 2 在城市 1 之后 40 天达到高峰,因为病毒到达那里需要一些时间。疾病的严重程度也较低,城市 2 的曲线更*坦,传播更*缓。由于在城市 2 中有单一的疾病来源,并且它与城市的所有部分相连,因此与城市 1 相比,疾病在整个城市中的传播更加均匀,这显示了类似“波浪”的现象。
结论
我们没有要求建立准确的流行病模型,我们的目的是深入了解不同的措施和人员流动如何影响像新冠肺炎这样的传染病的传播。虽然小规模的旅行限制没有带来很多好处,但 50%及以上的限制显著减缓了传播速度,使曲线变得更*坦。这意味着,如果任何人感染了新冠肺炎病毒,需要住院治疗,将有机会获得床位和适当的治疗。在实施更持久的解决方案时,这可以是遏制疫情的一项临时措施。

不同实验的高峰日
源代码可以在我的 Github 里找到
参考资料:
- 世界计量仪:德国
- WebMD:冠状病毒恢复
- 维基百科:基本繁殖数
- 如何制作剧情动画
原载于 https://apurv.page
PCA 到底是怎么工作的?
原文:https://towardsdatascience.com/how-exactly-does-pca-work-5c342c3077fe?source=collection_archive---------10-----------------------
最简单的 PCA 指南。

照片由 Unsplash 上的 Pritesh Sudra 拍摄
主成分分析是将大量数据压缩成抓住数据本质的东西的过程。
直觉
PCA (主成分分析)是一种在数据中寻找主要模式进行降维的技术。第一次读到这一行可能会引发几个问题:
这些图案是什么?
如何找到这些模式?
什么是降维?
维度到底是什么?
为什么要减少它们?
让我们一个一个地去看看他们。
假设我们有一个数据集,比如说,有 300 列。所以我们的数据集有 300 个维度。干净利落。但是我们真的需要这么多维度吗?我们可以。但大多数时候,我们没有。因此,我们需要找到一种快速简单的方法,不仅删除一定数量的特征,而且在更少数量的转换的维度中捕获 300 个维度的数据的本质。
差异
这 300 个特征中的每一个都有一定量的变化,即整个值的变化。如果一个特征描述了特定建筑物 200 天的楼层数,那么它的方差将为 0。因为它的值始终没有变化。方差为 0 的特征是没有用的,因为它们不提供洞察力。所以,方差的确是我们的朋友!这就是我之前提到的模式。
差异越大,该特性的重要性就越大。因为它包含更多的“信息”。方差为 0 的变量包含 0 个信息。不要混淆方差和相关性!方差与数据的目标变量无关。它只是陈述特定特性的值在整个数据中是如何变化的。
主成分
现在我们知道了方差,我们需要找到一组新的转换特征集,它可以更好地解释方差。原始的 300 个特征被用来进行特征的线性组合,以便将所有的变化推入几个变换的特征中。这些变换后的特征称为主成分。
主要部件现在与原始特征无关。我们将从 300 个特征中得到 300 个主成分。现在 PCA 的妙处来了——新形成的变换特征集或主成分将具有第一个 PC 中解释的最大方差。第二台 PC 将具有第二高的方差,依此类推。
例如,如果第一个 PC 解释了数据中总方差的 68%,第二个特征解释了总方差的 15%,接下来的 4 个特征总共包含 14%的方差。所以你有 97%的方差可以用 6 个主成分来解释!现在,假设接下来的 100 个特征总共解释了总方差的另外 1%。现在,仅仅为了增加一个百分比的方差而增加 100 个维度已经没有什么意义了。通过只取前 6 个主成分,我们将维数从 300 减少到仅仅 6!
特征向量和特征值
现在让我们考虑一个更简单的例子,它只有两个特征,更容易理解。下图是我们用特征 2 绘制特征 1 的情况。

PCA(具有 SVD 的)所做的是,它为这些数据点找到最佳拟合线,该最佳拟合线使最小化数据点与其在最佳拟合线上的投影之间的距离。现在,考虑特征 1 和特征 2 的数据点的*均值。它将在 a 附*的某个地方。因此,同样地,PCA 也可以最大化最佳拟合线上的投影点与点 a 的距离。

移动直线,使 A 点与原点重合,这样更容易观察。

距离 d1 是点 1 相对于原点的距离。类似地,d2、d3、d4、d5、d6 将是投影点离原点的相应距离。最佳拟合线将具有最大的距离*方和。假设直线的斜率为 0.25。这意味着该线由要素 1 的 4 部分和要素 2 的 1 部分组成。这将类似于:

其中 B=4 & C=1。因此,我们可以很容易地通过毕达哥拉斯定理找到 A,结果是 4.12。PCA 缩放这些值,使得向量 A 为单位长度。因此 A=1,B=4/4.12 = 0.97 & C=1/4.12 = 0.242。这个单位向量 A 就是特征向量!距离 d1、d2、d3、d4、d5、d6 的*方和为特征值。相当直接!这就是我前面说的特征 1 和特征 2 的线性组合。这告诉我们,对于 PC1,功能 1 的重要性几乎是功能 2 的 4 倍,或者说,它包含的数据分布(变化)几乎是功能 2 的 4 倍。
现在,主分量 2 将是与 PC1 正交的向量,因为主分量之间具有 0 相关性。这就像红线一样:

根据类似的理解,PC2 将具有特征 1 的-0.242 份和特征 2 的 0.97 份。这告诉我们,对于 PC2 来说,特性 2 的重要性几乎是特性 1 的 4 倍。对于 PC2,可以类似地计算特征向量和特征值。所以我们终于找到了我们的主要成分!
解释方差
我们计算了两个主成分的距离*方和。如果我们将这些值除以 n-1(其中 n 是样本大小),我们将得到相应主成分的方差。
假设 PC1 的方差为 15,PC2 的方差为 3。因此,围绕两个主成分的总变化是 18。因此,PC1 占 15/18,相当于数据总方差的 0.83 或 83%。PC2 占 3/18,等于数据中总方差的 0.17 或 17%。这就是解释的方差比。这表明数据中有多少差异是由特定的主成分解释的。主成分按其解释的方差比排序。如果总的解释方差比率达到足够的值,我们可以选择前 m 个成分。
主成分分析降低了维数以克服过拟合。您的模型可能不需要所有的功能来提供良好的性能。它可能会给出很高的训练分数,但测试分数却很低。换句话说,它可能过度适应。PCA 不是特征选择或特征消除技术。这更像是一种 T4 特征提取技术。您也可以将它归入特征工程范畴。
这就是本文的全部内容。请参考以下优秀资源,了解更多信息:
- https://sebastianraschka . com/Articles/2014 _ PCA _ step _ by _ step . html
- StatQuest:主成分分析(PCA),逐步
- https://towards data science . com/a-一站式主成分分析-5582fb7e0a9c
与世界其他地区相比,新冠肺炎在你的国家传播的速度有多快?
原文:https://towardsdatascience.com/how-fast-is-the-corona-virus-spreading-in-your-country-compared-to-the-rest-of-the-world-3d22bc79c284?source=collection_archive---------38-----------------------
Tableau 分步指南

"与世界其他地区相比,新冠肺炎在你的国家传播的速度有多快?"
这是我几天前问自己的问题,但我找不到以一种漂亮、吸引人的方式呈现的相关信息。对我来说,能够将特定的国家列表与其他国家进行比较真的很重要。因此,我决定建造这个仪表盘* 。

基里尔·尤纳科夫的画面是冠状病毒新冠肺炎:https://tabsoft.co/33Y9YIL
*写完这篇文章后,我可能会改进仪表盘,但本教程的步骤仍然有效且可重复。如果没有,请不要犹豫与我联系。
- 复杂程度:初级/中级
- 完成时间: ~10 分钟。
- 所需软件: Tableau Desktop ( 免费公版)
重要提示:在我们进入分步指南之前,请先熟悉这些 10 注意事项,然后再通过 Tableau 创建另一个关于新冠肺炎的图表。
第一步。获取数据
您可以通过各种渠道获取这些数据。对我来说,最快最简单的方法是通过 GitHub 应用,然后连接到约翰·霍普斯金 GitHub 库。
您可以在 Tableau Covid-10 数据中心页面探索其他方法。例如通过一个。亢奋,。CSV 文件,网络数据连接器,谷歌表和其他。所有数据源的分步说明可在这里找到。
另一个快速而肮脏的方法是打开约翰·霍普斯金日报回购,直接从那里下载几个 CSV 文件。对于本教程的目的来说,这也是绝对足够的。

手动下载*。来自约翰·霍普斯金 GitHub 库的 CSV 文件
第二步。在 Tableau 中导入数据
如果您已经建立了与数据源的直接连接,您可以跳过这一步。一旦我们有了所有需要的文件,我们就可以在 Tableau 中导入它们。为了做到这一点:
- 打开的画面
- 点击连接到数据
- 通过选择一个文件连接到一个文本文件

在 Tableau 中导入 CSV 文件
第三步。将所有文件合并到一个数据源中
一旦我们在 Tableau 中有了所有可用的 CSV 文件,那么我们就可以继续将这些文件合并/组合到一个专用的 Tableau 数据源中。换句话说,我们将所有文件的所有行合并到一个文件中。在 Tableau 中,这个操作被称为 Union ,它与 SQL 的 UNION ALL 完全相同。通常,当我们知道文件中的所有列都具有相同的名称/结构时,就会执行此操作。
- 点击导入的表格并选择转换为联合。
- 选择通配符(自动),点击点击确定****

将所有文件合并到一个数据源中
第四步。数据争论
步骤 4.1 检查数据
我们需要知道的第一件事是熟悉数据集。您可以在数据源选项卡的表格概览窗格中看到相应列的数据示例。

数据的样本
值得注意的是您可以看到日期数据的两个特殊字段:
- 上次更新 —这是关于上次更新该文件的信息。特别是在新冠肺炎爆发之初,有许多病例被删除或后来被添加。这意味着我们不能使用这个字段作为日期字段。
- 路径 —该字段包含文件的路径信息,包括文件名。在这种情况下,它是该报告的创建日期。然而,字段的数据类型不是日期类型,但是我们将使用它来创建一个日期类型。
步骤 4.2 为日期创建计算字段
为了基于文本字段路径创建日期字段,我们需要使用函数创建计算字段,使用以下计算:
DATE(DATEPARSE ( "'csse'_'covid'_HH_'daily'_'reports'/MM-dd-yyyy.'csv'", TRIM([Path]) ))

为日期创建计算字段
步骤 4.3 创建起点
现在,有一个日期字段是伟大的,是时候创建我们的锚点。因为我们想比较不同的国家,所以为每个国家创建一个共同的起点是有意义的。在我们的案例中,我们将使用数据集中任意一行的第 100 个注册案例作为起点。
- 转到过滤器****
- 添加一个过滤器用于确认
- 选择至少**并将其设置为 100,OK**

创造一个起点
步骤 4.4 分组 国家名称和重命名****
在这一步,我们只是对几个国家不同的命名惯例进行简单的分组,例如
中国(中国;中国内地)、伊朗(伊朗;伊朗伊斯兰共和国)、韩国(韩国;韩国、韩国)、英国(英国;英国)、美国(美国;美国)等。
- 转到工作表标签
- 右击国家/地区维度
- 创建,然后组……
- 将此维度命名为国家****
- 执行分组,好吗

将国家分组
步骤 4.5 创建天数的计算字段
在横坐标上,我们希望显示每个国家自第 100 例登记病例以来的天数。为了做到这一点,我使用了以下计算方法:
DATEDIFF(‘day’, {FIXED [Country]: MIN([Date]) }, {FIXED [Date]: max([Date]) } )+1
这里,我们取每个国家数据集中的最小日期,实际上是第 100 个病例的日期(因为我们已经对此进行了过滤)。然后,我们估计该日期与该行级别上表示的日期之间的差异。我已经将这个字段命名为: days_passed
注意:确保将该字段创建为一个尺寸,而不是一个尺寸。
步骤 4.6 为活动案例创建计算字段
一个非常有用的衡量标准是活动案例的数量。我们可以使用下面的计算和命名措施活动案例轻松实现这一点:
ZN([Confirmed])-ZN([Deaths])-ZN([Recovered])
为了安全起见,我们使用 ZN()函数来防止数据集中出现空值。
步骤 5:创建视觉效果
现在是有趣的时候了。
- 将天已过拖放到列****
- 将活动案例拖放到行****
- 将国家拖放到过滤器架上
- 选择您想要比较的国家
- 将国家从标志架拖放到颜色功能
现在,您可以通过添加标签、工具提示、附加过滤器等进行试验。

冠状病毒 COVID-10 传播的可视化实例
***Part 2 for creating the dashboard —*** [***click here.***](/how-fast-is-the-corona-virus-spreading-in-your-country-compared-to-the-rest-of-the-world-7f8585e77095)The final dashboard can be found here: [https://tabsoft.co/33Y9YIL](https://tabsoft.co/33Y9YIL)
如果你觉得这篇文章有用,你不同意其中的一些观点,有问题或建议,请在下面给我留言。非常感谢您的反馈!
领英: 基里尔·尤纳科夫
从世卫组织获得关于新冠肺炎冠状病毒的最新信息:世卫组织
与世界其他地区相比,冠状病毒在你们国家的传播速度有多快?—第二部分
原文:https://towardsdatascience.com/how-fast-is-the-corona-virus-spreading-in-your-country-compared-to-the-rest-of-the-world-7f8585e77095?source=collection_archive---------61-----------------------
Tableau 分步指南

在我之前的文章中,我描述了如何用 Tableau (Public) 构建一个简单的仪表盘,显示每个国家从第 100 个注册病例开始的病例增长速度。

基里尔·尤纳科夫的画面是冠状病毒新冠肺炎:https://tabsoft.co/33Y9YIL
但是有一个问题——每个国家都不一样。它有不同的人口,大城市有不同的人口密度,不同的卫生系统,等等。因此,我们还可以使用 Tableau 构建一个函数,它将允许我们在考虑各个国家的人口的同时对这些国家进行比较。换句话说,计算每 10 万人的比率。当然,这并不能提供一个完全准确的画面,但也许足以看出一个趋势。此外,通过本教程,我们旨在学习如何使用 Tableau 和而不是如何根据医疗和健康数据得出结论。
- 复杂程度:中等
- 完成时间: ~15 分钟。
- 所需软件: Tableau 桌面(免费公版)
重要提示:在我们进入分步指南之前,请先熟悉这些 10 注意事项,然后再用 Tableau 制作另一个关于新冠肺炎的图表。
在下面的逻辑图中,您可以看到度量、参数和计算字段的逻辑,我们将为我们的控制面板创建这些逻辑。我们必须创建单独的 2 个参数,并使用它们的值作为输入,以在我们的仪表板中显示特定度量的值。如您所见,参数 1 和参数 2 之间的关系是多对多,与计算字段的关系是一对二。换句话说,两个参数的每个值的组合产生一个测量。

下面是使用 Tableau SQL 语法时的逻辑:
// this is just for explaining the chart above
CASE
WHEN[Parameter 1].[Parameter Value] **AND**
[Parameter **2**].[Parameter Value]THEN [Calculated Field].[Measure]
END
第一步。创建具有调整值的度量
我们将从右到左开始—通过创建我们需要的度量。我们已经从我们的数据源(约翰·霍普斯金 GitHub 库)获得了所有病例、痊愈和死亡的措施。活动案例的度量是一个计算,这在我的前一篇文章的第步中有所涉及。4.6.离开的是:
- 所有案例均已调整
- 已调整的活动案例
- 恢复调整
- 死亡人数调整后
步骤 1.1 获取每个国家的人口
为了计算这些调整后的指标,我们需要每个国家的人口。这里的是由维基百科提供的世界上所有国家的人口列表。你既可以抓取网页,也可以将表格复制/粘贴到 Excel/Google 电子表格文件中,并使用函数将文本连接成 Tableau 计算,如下所示。

来自 Google 电子表格的示例
然后复制/粘贴 Tableau 计算(F 列),并在 Tableau 中为总体创建计算字段:
**// Population**IF [Country] = "India" THEN "1366417754"
ELSEIF [Country] = "United States" THEN "329064917"
ELSEIF [Country] = "Indonesia" THEN "270625568"
ELSEIF [Country] = "Pakistan" THEN "216565318"
ELSEIF [Country] = "Brazil" THEN "211049527"
ELSEIF [Country] = "Nigeria" THEN "200963599"
ELSEIF [Country] = "Bangladesh" THEN "163046161"
ELSEIF [Country] = "Italy" THEN "60550075"
ELSEIF [Country] = "Russia" THEN "145872256"
ELSEIF [Country] = "Mexico" THEN "127575529"
ELSEIF [Country] = "Japan" THEN "126860301"
ELSEIF [Country] = "Ethiopia" THEN "112078730"
ELSEIF [Country] = "Philippines" THEN "108116615"
ELSEIF [Country] = "Egypt" THEN "100388073"
ELSEIF [Country] = "Vietnam" THEN "96462106"
END// ... this is just a sample of all countries
确保将人口的新字段转换为一个度量值,并切换到一个数字(整数)作为数据类型。

步骤 1.2 创建校正值的计算字段
为了创建这些度量,我们需要使用以下公式,例如:
**// All cases adjusted:**IF [Country] =”Italy” THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] ="Spain" THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] = "India" THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] = "United States" THEN (**[All Cases]**/[Population])*100000
ELSEIF [Country] = "Pakistan" THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] = "Brazil" THEN (**[All cases]**/[Population])*100000
ELSEIF [Country] = "Nigeria" THEN (**[All cases]**/[Population])*100000
END// ... this is just a sample of all countries
为了添加其他国家,只需将这段计算扩展到您想要的所有其他国家。您可以使用步骤 1.1 中的相同方法。并将所有国家连接成一段代码。完成后,对于您希望拥有的国家,您也可以完成为其他度量创建计算字段的相同过程:
**// Active cases adjusted:**IF [Country] =”Italy” THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] ="Spain" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "India" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "United States" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "Pakistan" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "Brazil" THEN (**[Active cases]**/[Population])*100000
ELSEIF [Country] = "Nigeria" THEN (**[Active cases]**/[Population])*100000
END// ... this is just a sample of all countries
还有…
**// Recovered adjusted:**IF [Country] =”Italy” THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] ="Spain" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "India" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "United States" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "Pakistan" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "Brazil" THEN (**[Recovered]**/[Population])*100000
ELSEIF [Country] = "Nigeria" THEN (**[Recovered]**/[Population])*100000
END// ... this is just a sample of all countries
…还有
**// Deaths adjusted:**IF [Country] =”Italy” THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] ="Spain" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "India" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "United States" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "Pakistan" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "Brazil" THEN (**[Deaths]**/[Population])*100000
ELSEIF [Country] = "Nigeria" THEN (**[Deaths]**/[Population])*100000
END// ... this is just a sample of all countries
如果您完成了上述步骤,您应该有以下措施:

这意味着我们已经准备好了逻辑图的正确部分:

第二步。创建参数 1
要创建第一个参数,进入左侧窗格的空白区域,右键单击并选择创建参数。

将数据类型更改为字符串,从可用值选项中选择列表,然后输入值:
**Parameter name:** ADJUST PER 100k CAPITA**Parameter Value 1:** ADJUST PER 100k CAPITA
**Display Value 1 as:** ADJUSTED PER 100k CAPITA**Parameter Value 2:** REMOVE ADJUSTMENT
**Display Value 2 as:** REMOVE ADJUSTMENT

第三步。创建参数 2
同样,创建一个新参数,将数据类型更改为 string,从列表中选择可用值,并使用以下值:
**Parameter name:** Metric Selection**Parameter Value 1:** All cases
**Parameter Value 2:** Active cases
**Parameter Value 3:** Deaths
**Parameter Value 4:** Recovered

如果操作正确,您应该有两个独立的参数。这意味着我们现在还要创建一个东西—计算字段。

第四步。创建计算字段
下一步是创建函数,该函数将根据参数 1 和参数 2 的值显示特定的度量。
// Shows adjusted or non-adjusted **Measures**IF [ADJUST PER 100k CAPITA] = "REMOVE ADJUSTMENT" and [Parameters].[Metric Selection] = "All cases" then [All cases]ELSEIF [ADJUST PER 100k CAPITA] = "ADJUST PER 100k CAPITA" and [Parameters].[Metric Selection] = "All cases" then [All cases adjusted]ELSEIF [ADJUST PER 100k CAPITA] = "REMOVE ADJUSTMENT" and [Parameters].[Metric Selection] = "Deaths" then [Deaths]ELSEIF [ADJUST PER 100k CAPITA] = "ADJUST PER 100k CAPITA" and [Parameters].[Metric Selection] = "Deaths" then [Deaths adjusted]ELSEIF [ADJUST PER 100k CAPITA] = "REMOVE ADJUSTMENT" and [Parameters].[Metric Selection] = "Recovered" then [Recovered]ELSEIF [ADJUST PER 100k CAPITA] = "ADJUST PER 100k CAPITA" and [Parameters].[Metric Selection] = "Recovered" then [Recovered adjusted]ELSEIF [ADJUST PER 100k CAPITA] = "REMOVE ADJUSTMENT" and [Parameters].[Metric Selection] = "Active cases" then [Active cases]ELSEIF [ADJUST PER 100k CAPITA] = "ADJUST PER 100k CAPITA" and [Parameters].[Metric Selection] = "Active cases" then [Active cases adjusted]END
第四步。完成可视化
现在,我们已经准备好将组件添加到可视化中。右键单击两个参数并选择“显示参数控制”。这将向您显示两张卡片,您可以在其中选择想要查看的指标,以及哪个版本—调整或未调整的数字。
然后将度量“Metric Selection”拖放到行架上。

干得好。在我的仪表板最终版本中,我使用了一个扩展,你可以在这里免费下载。该扩展称为单个复选框参数。

下载完成后,只需将其添加到您的仪表盘中,并选择参数 1:每 100k 人均调整。仅此而已。

最终的仪表盘可以在这里看到:https://tabsoft.co/33Y9YIL
如果你觉得这篇文章有用,你不同意其中的一些观点,有问题或建议,请不要犹豫,在下面给我留言。非常感谢您的反馈!
领英: 基里尔·尤纳科夫
从世卫组织获得关于新冠肺炎冠状病毒的最新信息:世卫组织
如何在科技初创公司找到一份数据科学的工作
原文:https://towardsdatascience.com/how-find-a-job-at-a-tech-start-up-bde5ae7f1b9c?source=collection_archive---------26-----------------------

帮助你获得更多面试机会的三步系统
在一家科技初创公司获得数据科学职位的面试可能具有挑战性:由于初创公司相对较小,它们的招聘信息更难找到,它们的流程也没有更成熟的公司那么正式。
所以你需要依靠你自己的“系统”来获得面试机会。
为此,我想分享一个对我个人来说非常有效的系统。
使用这个系统,我能够争取到对我真正感兴趣的旧金山初创公司的多次数据科学面试。最棒的是,比把我的简历扔进网上求职栏的黑洞有效多了。
首先,你需要做的第一件事是建立一个高质量的潜在职位空缺列表。
第一步:建立一个潜在职位空缺的列表
我发现最有效的方法是使用谷歌搜索特定的网站,使用如下查询。
site:jobs.lever.co data scientist San Francisco
请注意使用site:jobs.lever.co如何将谷歌的搜索结果过滤到该网站上的页面,而这些页面恰好是 Lever 上的所有招聘信息。
注意:Lever 是一个候选人跟踪系统,在科幻科技公司中很受欢迎。Lever 与 Monster 等网站非常不同,因为它不是一个列表网站。
我使用网站
boards.greenhouse.io也取得了不错的效果。如果你知道其他网站可以这样工作,请在评论中告诉我,我会在这里添加它。
你也可以使用谷歌的搜索工具只显示上个月的新列表,这有助于确保帖子不会“过时”

将职位发布的搜索结果过滤为仅“最*”的结果
每个结果都会带你去一个职位描述,它们会包括公司的标志和公司网站的链接。
通过使用这种方法并调整你使用的标题,你应该可以在一个小时左右的时间里找到 10-20 个有趣的创业公司。
杠杆上的帖子允许你直接申请,但我不会推荐它。相反,你应该找到初创公司招聘人员的电子邮件地址,直接联系他们。
第二步:直接给初创公司的招聘人员发电子邮件
我的经验是,直接给招聘人员发电子邮件比提交招聘启事要有效得多。
一旦你知道了公司的域名,就很容易找到招聘人员的电子邮件。
首先,使用 LinkedIn 查找该公司的员工名单。搜索有“招聘人员”或类似头衔的人。
他们的电子邮件几乎总是如下。
firstname@domain.com
所以,如果公司的网站是polleverywhere.com,招聘人员的名字是汤姆·沃特曼,你可以试试tom@polleverywhere.com。(如果你申请的是更大的公司,这种方法不太可能奏效)。
要验证电子邮件地址,您可以使用 http://clearbit.com 的。他们的免费产品允许你“丰富”一个电子邮件地址,它还可以检查你使用的电子邮件地址是否正确。(注:我与 Clearbit 没有任何关系)。

使用 Clearbit 的免费产品检查招聘人员的电子邮件地址
但是如果公司没有招聘人员,你该怎么办?这在初创企业中并不少见。
下一个最好的人选是你申请的团队的经理,甚至是创始人。你可能会对直接给创始人发邮件感到紧张,但我保证他们不会觉得这很粗鲁。
既然你已经收到了招聘人员的电子邮件,你猜对了——你必须给他们发电子邮件。
第三步:明确要求招聘人员打电话
你可能不知道如何给招聘人员发电子邮件要求打电话。
以我的经验来看,最好的方法是保持邮件极其简短,附上你的简历,并包括一个明确的电话请求。
不要用一整面墙的文字来解释你为什么要申请,你的职业历史,或者其他任何东西。不要称呼招聘人员为“先生”只要说明你发邮件的原因和你要求他们采取的行动。
这里有一个对我很有效的模板。
你好[招聘人员名字],
我正在联系我在[公司网站]上找到的数据科学职位。
你有空打个电话讨论一下这个角色是否合适吗?
我希望更多地了解团队当前的项目,以及我的技能和经验是否能与之相匹配。
关于我:
- 目前是脸书的一名数据科学家
- 曾是一家约 50 人的 SaaS 公司的唯一产品分析师
- 以前是一家咨询公司的分析师,主要从事分析项目
- 我还附上了一份更详细的我的项目经历和相关技能的简历
感谢您的宝贵时间!
汤姆
第 3.5 步:如果没有得到回应,继续跟进
你的邮件被忽视是很糟糕的,但这是会发生的。有时候招聘人员忽略你是因为这个职位已经有人了,或者他们认为你不是一个好的候选人,或者他们只是在度假。
别往心里去——我肯定你也没有回复邮件。不管是什么原因,发送一封跟进邮件肯定会提高你的回复率。我总是会发一封后续邮件,即使重温我最初被忽视的事实会伤害我的自尊心。
这个系统对我来说非常有效。我可以在大约两个小时内找到大约 20 份创业招聘信息,并给他们的招聘人员发电子邮件。你的回复率会有所不同,但我通常会看到超过 50%的回复,即 10 个面试请求。
如果你真的尝试了这个系统,我很想知道你会得到什么样的结果——请在评论中告诉我!我不能总是回复,但我会阅读我收到的每一条评论。
找一份数据科学的工作就像买一辆新车
原文:https://towardsdatascience.com/how-finding-a-data-science-job-is-like-buying-a-new-car-50b5f79a66a4?source=collection_archive---------38-----------------------
为什么有些人比其他人更有可能找到工作的框架

马特·拉默斯在 Unsplash 上拍摄的照片
首先,我想说这不仅仅适用于数据科学工作。它与 所有的 工作相关——我只是提到数据科学工作,因为我的大部分观众都渴望获得数据科学职位。因此,在本文中,“数据科学工作”与“工作”同义。
如果没时间看完整本,TLDR 在底部!
那么,找一份数据科学的工作和买一辆新车有什么区别呢?
嗯,让我们想象一下,你现在正计划买一辆新车。你可能会有一些你希望你的新车达到的标准。例如,你可能想要一定程度的燃油效率,如果你有一个大家庭,你可能需要五个以上的座位,或者你可能只是想要一辆红色的车。最终,你需要你的车来满足你的需求。这就引出了我的第一点…
1.你是一个产品,就像一辆汽车。

就像产品一样,人们被雇佣是为了解决问题,满足业务需求。同样,你也有一个你希望你未来的汽车达到的标准列表,面试官也有一个他们希望他们未来的员工达到的预定标准列表。
同时,还有不同类型的汽车,像 SUV 和小型货车,满足不同消费者的各种需求。类似地,数据科学是一个包含许多领域的宽泛术语:分析、可视化、ML 工程和建模是数据科学家可能拥有的专业化的几个例子。
因此,想想你想成为哪种类型的数据科学家,并想想成为那种类型的数据科学所需的技能?你发展了这些技能吗?如果你还没有,那么你需要提高自己的技能,然后才能考虑找一份数据科学家的工作。发展您的技能,成为满足需求(业务问题)的有价值的产品(数据科学家)。
提示:要知道你是否已经获得了成为数据科学家的必要技能,看看你想要的数据科学工作的要求。你满足了所有的需求吗?对自己诚实,在自己欠缺的地方努力。
让我们回到汽车的例子。一旦你决定了对未来汽车的要求,你就必须找到一辆符合你需求的汽车。你现在想到了哪些汽车公司?你现在可能会想到一些汽车公司,但是为什么你会特别想到这些公司呢?这是因为这些公司在营销自己方面做得很好,这就引出了我的第二点…
2.你必须推销自己,让人们了解你。
更具体地说,营销有两个部分你应该牢记在心;意识和可及性。
意识
推销自己的第一步是建立知名度。在市场营销中,知名度描述的是消费者对产品名称的认可程度。汽车公司通过播放电视广告和参加车展来建立知名度。
从工作的角度来看,你可以通过获得更多的意识来增加你的机会。现在,你可能正在一个接一个地申请工作。你还能通过什么方式曝光?你可以做一些事情,比如参加编程竞赛,参加社交活动,甚至在 LinkedIn 上发布成就。

更清楚地描述一下,如果一个人只申请了工作,但没有通过其他渠道建立曝光率,他/她只能接触到他/她申请的工作数量。在这种情况下,应该是 100 人。然而,通过其他渠道建立意识,你的意识会显著增加。在这个例子中,他的意识会增加超过 50000%。
总的来说,树立意识有多种作用:
- 它能建立信誉并表现出兴趣。像参加活动和完成项目这样的事情,展示了你的承诺,也表明了你对你想要得到的任何角色都有热情。
- 它增加了获得机会的可能性和机会的数量。如果你是一个好的“产品”,那么人们会注意到你,并向你伸出援手。
易接*
一旦你确立了自己是一个有价值的“产品”,并建立了曝光渠道,你就要确保自己是可以接触到的。
例如,一家汽车公司花费了数百万美元进行营销,但在纽约只有一家汽车经销商,这将是一家知名度高、可访问性低的公司。
可访问性是一个简单的步骤。让人们向你伸出援手变得简单。创建 LinkedIn 个人资料。创建 YCombinator 配置文件。公开你的电子邮件或创建一个个人网站,人们可以直接联系你。
结合知名度和可访问性,如果你有 YouTube 频道,包括你的联系信息。如果你要参加社交活动,带上名片。你明白我想说什么。
TLDR
- 你就像一件产品,除非你把自己的技能发展到足够有价值,否则你不会被注意到。做法拉利,不要做福特。
- ****推销自己——不要等别人来找你。你必须自己创造机会。
- ****关注知名度(获得曝光)和可及性(让人们更容易接触到你)
感谢阅读!
如果你喜欢我的工作,想支持我…
- 支持我的最好方式是在媒体T10【这里上关注我。
- 在 Twitter 这里成为第一批关注我的人之一。我会在这里发布很多更新和有趣的东西!
- 另外,成为第一批订阅我的新 YouTube 频道 这里的人之一吧!还没有视频,但快到了!
- 在 LinkedIn 上关注我这里。
- 在我的邮箱列表** 这里报名。**
- 看看我的网站,terenceshin.com。
浮点数是如何工作的
原文:https://towardsdatascience.com/how-floating-point-numbers-work-1429907b6d1d?source=collection_archive---------16-----------------------

尼克·希利尔在 Unsplash 上的照片
深度学习和数码摄影的应用
一个讨厌的事实是,计算机以二进制*似值工作,而人类倾向于以精确值思考。这就是为什么,在你的高中物理课上,当你在你的解中计算中间数值时,你可能经历了“舍入误差”,以及为什么,如果你打开一个 python 终端并计算 0.1 * 3,你将得到一个奇怪的结果。
>>> 0.1 + 0.1 + 0.1
0.30000000000000004
这使得浮点数成为一个泄漏抽象的例子。通常,python 和数值计算库(如 numpy 或 PyTorch)会在幕后处理这些。但是理解细节可以帮助你避免意外的错误,并加快许多机器学习计算的速度。例如,谷歌的张量处理单元(TPU)使用了一种改进的浮点格式,在试图保持良好结果的同时,大幅提高了计算效率。
在本文中,我们将深入探讨浮点数的具体细节,涵盖边缘情况(数值下溢和上溢),并以应用程序结束:TPU 的 bfloat16 格式和 HDR 成像。假设的主要背景是你了解如何在二进制中计数,以及二进制分数如何工作。
表示整数
我们简单回顾一下二进制数到 5:0,1,10,11,100,101。明白了吗?这对于一个无符号整数来说很棒;一个从不消极的人。例如,如果我们有一个 8 位无符号整数,我们可以表示 00000000 和 1111111 之间的数字。在十进制中,那是在 0 和 2⁸-1=255.之间例如,大多数标准图像格式是 8 位颜色,这就是为什么“RGB”值从 0 到 255。
还要注意,我们通常用十六进制(以 16 为基数)表示法来缩写:0x00 到 0xFF。0x 前缀表示“这是一个十六进制数”。十六进制数字是 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F;所以 F 本质上是四位“1111”的缩写(0xF 和 1111 在十进制中都是 15)。同样,8 位是一个字节,所以我们的数字是少得可怜的 1 字节。但在本文中我们不会过多关注十六进制。
有符号整数
现在,你会注意到,对于无符号 int,我们不能表示像-2 这样的简单数字。解决这个问题的一个方法是让第一位代表符号。说“0”表示负,“1”表示正。想想 4 位数字,0111 应该是-7,而 1111 应该是+7。然而,这有一些奇怪的特征。例如,0000 是“-0”,而 1000 是“+0”。这并不好:比较两个数字是否相等会变得棘手;另外,我们正在浪费空间。
对此的标准解决方案是使用二进制补码,这是大多数实现用于有符号整数的方式。(还有一个很少用的补语)。然而,这不是我们将需要的浮点数,所以我们不会深入研究它。
让我们考虑一个有符号的 8 位整数的有偏表示。这是有偏差的,因为它有点偏离。我们不用 00000000 来表示 0,而是用 0111111 来表示 0。这通常表示基数为 10 的 127。但是我们的表述有 127 的偏差。这意味着 00000000 代表–127,而 1111111 代表 128。

双精度浮点数
因为最*生产的个人计算机使用 64 位处理器,所以默认的浮点实现是 64 位是很常见的。这被称为“双精度”,因为它是以前标准的 32 位精度的两倍(在过去十年的某个时候,普通计算机切换到 64 位处理器)。
科学符号
对于上下文,浮点数的基本思想是使用科学记数法的二进制等价物。你的高中科学老师满怀希望地训练你如何做到这一点(以及一大堆可怕的有效数字——sigfigs)。例如,8191.31 的科学表示是:

杂项十进制数的科学记数法
您应该注意到三个关键因素。首先,一个符号(数字是+还是-?).第二,我们总是把数字写成一位数(1 到 9 之间,含 1 和 9),后面是小数点,后面是若干位数。相比之下,下面的不在科学符号中,尽管它们是真正的数学事实。

不使用科学符号的表示法
考虑到这一点,让我们想想当我们进入二进制时会发生什么变化。首先,我们不使用 10 作为指数的基数(也称为基数),而是使用 2。其次,我们想用二进制分数代替十进制分数。

二进制与十进制科学记数法
请注意,我选择用十进制形式写基数(2 或 10)和它们的指数(分别是 1 或 0),而左边的数字和有效数字分别是二进制或十进制。
二进制数 1101 以 10 为基数是 13。13/16 是 0.8125。这是一个二进制分数。如果你还没有玩过这些,你应该说服自己以下几点:

一些简单的二元分数
这是事实 0.3 是 3/10,0.55 是 55/100 的二进制版本(当然可以进一步简化)。
太好了。我们现在准备深入研究浮点数的细节。
IEEE 754 标准
下面是通常实施的“ IEEE 754 ”标准的示意图。第一位是符号。0 是正的,1 是负的(与我们上面天真的建议相反)。指数有 11 位,分数有 52 或 53 位(取决于您如何计数),也称为“尾数”或“有效数”。这个标志就像我们上面看到的旗子一样工作,所以我们将深入研究后两个标志。

IEEE 754 双精度浮点数(维基
指数
与我们之前看到的一样,指数是一个 11 位有偏(有符号)整数,但有一些注意事项。偏差为 2 ⁰–1=1023,因此 11 位 01111111111 代表 0。
这通常意味着最大可能的指数由 11 位 11111111111 表示(表示 2–1–1023 = 1024),最小可能的指数由 11 位 0000000000 表示(表示–1023)。
然而,正如我们将要讨论的:
- 由 111111111111 表示的指数是为无穷大和 NaNs 保留的。
- 000000000000 指数是为表示 0 和其他我们将会用到的东西而保留的。
这意味着在正常情况下,指数可以在–1022 和 1023 之间(2046 个可能值)。
有效数字
52 位有效数字表示二进制小数。如果你回顾上面的科学记数法部分,你会发现每当我们用“二进制科学记数法”写一个二进制数时,前导数字总是 1。(在 10 进制中,它可以在 1 和 9 之间,但 2-9 不是二进制数字)。因为我们知道前导数字总是 1(还有一些需要讨论的注意事项),所以我们不需要把它存储在计算机上(这是一种浪费)。这就是为什么我说有效位是 53 位,“取决于你如何计数。”
换句话说,存储在计算机上的 52 位代表小数点后的 52 位(或者我们应该称之为“二进制点”)。始终假定前导 1。
正常数字
我一直在提一些警告,并且我打算尽可能地拖延。“正常数”是一个不使用任何这些警告的非零数,我们可以给出一些例子。
回想一下这三个组件:
- 1 位用于符号
- 11 位表示指数,指数(十进制)在–1022 和+1023 之间。在二进制编码中,它被表示为有偏差的整数。
- 52 位有效位。
我们如何表示十进制数 1?
嗯,符号是正的,所以符号位是 0。(把 1 想象成“负”的标志)。指数是 0。记住有偏表示意味着我们加上 1023,我们得到二进制表示 01111111111。最后,所有的分数位都是 0。简单:

1 的浮点表示形式
我已经写了二进制浮点表示法,用空格将三部分分开。通常,“二进制科学”表示法中的基数和指数实际上是以 10 为基数的。
更难的例子呢,比如 3?3 是 2 的 1.5 倍(十进制),所以把它变成二进制分数,我们得到 1.1。考虑到偏差,指数 2 表示为 10000000000。

我们能得到的最大(正常)数是多少?我们应该把指数做成 111111111110(不能全是 1,那是保留的),十进制就是 1023。

最大浮点值
我们可以这样计算:

但是我们也可以利用 Python 自带的任意精度整数运算,免费写出所有 10 进制的 309 位数字:
>>> 2 ** 1024 - 2 ** 971179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368
最小可能的浮动正好是这个的负数。但是最小的正(正常)浮动是多少呢?我们已经说过最小的正指数是–1022。使有效数字全为 0,这意味着最小的正标准浮点数为:

同样,任意精度整数运算意味着我们可以利用中间分数轻松获得精确的十进制值。
>>> numerator = 5 ** 1022
>>> print('0', str(numerator).rjust(1022, '0'), sep='.')0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002225073858507201383090232717332404064219215980462331830553327416887204434813918195854283159012511020564067339731035811005152434161553460108856012385377718821130777993532002330479610147442583636071921565046942503734208375250806650616658158948720491179968591639648500635908770118304874799780887753749949451580451605050915399856582470818645113537935804992115981085766051992433352114352390148795699609591288891602992641511063466313393663477586513029371762047325631781485664350872122828637642044846811407613911477062801689853244110024161447421618567166150540154285084716752901903161322778896729707373123334086988983175067838846926092773977972858659654941091369095406136467568702398678315290680984617210924625396728515625
以防你好奇。顺便说一下,您可以在 python +硬件设置上使用以下命令检查所有这些:
>>> import sys
>>> sys.float_infosys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.220446049250313e-16, radix=2, rounds=1)
基本上其他编程语言都有类似的特性。
不定式和名词
好吧,事情变得奇怪了。如果所有指数位都是 1,则表示的数字要么是无穷大,要么不是数字(NaN):
- 如果分数位都是 0,则数字是无限的。符号位控制它是–∞还是+∞。
- 如果分数位不全为 0,则“数字”不是数字(NaN)。根据第一位,它可以是安静 NaN 或信令 NaN。一个安静的 NaN 传播(再加一个数,就得到 NaN)。粗略地说,发信号的 NaN 应该“抛出一个错误”。通常不使用剩余的位。
我最初对此感到惊讶的是,这是在常用芯片上的硬件实现。这意味着,例如,你可以在 GPU 上使用它。你为什么要这么做?好吧,考虑这样一个方便的事实,即–∞的幂是 0。
>>> from math import exp
>>> minus_infinity = float('-inf')
>>> exp(minus_infinity)0.0
在介绍用于 NLP 任务的转换器架构的论文中(伯特、GPT-2 和他们最*的同类使用的),训练是自回归的,这意味着在注意力模块的 softmax 层中,某些输出被要求为 0。但是,如果您查看 softmax 的公式,并回忆起您的高中数学老师告诉您“没有任何数字的指数等于 0”,您会发现让 softmax 返回 0 是很棘手的。当然,除非你把(负)无穷大变成一个数!
重要的是,这是一种硬件实现。如果这是一个巧妙的 Python(或 PyTorch,或 Numpy)变通方法,将数字表示为一个对象,有时可能包含一个浮点数,这将大大降低数值计算的速度。
此外,计算机硬件无止境的复杂性总是令人印象深刻。
零
但是等等,还有呢!我们甚至还没有描述如何表示 0。使用我们的指数和分数位,我们只能得到一个很小的正数,实际上不是 0。当然,解决方案是,如果指数位都是 0,分数也是 0,那么数字就是 0。换句话说,如果指数位是 00000000000,并且分数位也全是零。注意,这意味着 0 是“有符号的”——既有+0 也有–0。在 Python 中,它们的存储方式不同,但它们是彼此相等的。
>>> zero = 0.0
>>> print(zero, -zero)0.0 -0.0>>> zero == -zeroTrue
不过,在一些边缘情况下,事情会变得很奇怪。当试图用 atan2 计算一个角度时,你会发现它们实际上是以不同的方式表示的:
>>> from math import atan2
>>> zero = 0.0
>>> print(atan2(zero, zero),
>>> atan2(zero, -zero))0.0 3.141592653589793
低于正常值的数字
最后一种情况是所有指数位都为 0,但分数位不为 0。如果我们有一个不使用一些可能的位序列的表示,我们就是在浪费空间。那么为什么不用它来表示更小的数字呢?这些数被称为次正规(或非正规)数。
基本上,规则是指数仍然被认为有其最小值(–1022),而不是我们的“二进制科学”符号总是从 1 开始(如在 1.001 中),而是我们假设它从 0 开始。所以我们可以得到 0.001 乘以 2 的–1022 次方。这让我们可以用小于 52 的指数来表示数字(小到-1074)。因此:
>>> 2 ** -1074
5e-324>>> 2 ** -1075
0.0>>> 2 ** -1075 == 0
True
次正规数的好处是,当你减去两个不同的正规浮点数时,你一定会得到一个非零的结果。代价是精度损失(前导 0 中没有存储精度——还记得 sigfigs 是如何工作的吗?).这叫做逐渐下溢。随着浮点数变得越来越小,它们逐渐失去精度。
如果没有低于正常值的数字,你将不得不冲到零,立刻失去你所有的精度,并大大增加你意外地被 0 除的机会。然而,低于正常值的数字会显著降低计算速度。
应用程序
好吧,我们一直在讨论浮点数。除了一些从未真正出现的关于 0.1 * 3 的怪异边缘情况,谁会在乎呢?
张量处理单元
除了我们详细探讨的 64 位浮点之外,还有常见的 32 位浮点(单精度)和 16 位浮点(半精度)。PyTorch 和其他数值计算库默认倾向于坚持 32 位浮点。一半的大小意味着计算可以更快地完成(处理一半的位)。
但是较低的精度是有代价的。对于标准的半精度浮点型(5 个指数位,10 个有效位),大于 1 的最小数字约为 1.001。不能代表整数 2049(必须选 2050 或者 2048;中间也没有小数)。65535 是最大的可能数字(或者接*,取决于精确的实现细节)。
相反,谷歌的张量处理单元使用一种经过修改的 16 位格式进行乘法,作为他们对深度学习任务进行优化的一部分。具有 7 位有效位的 8 位指数与 32 位浮点数的指数位数一样多。事实证明,在深度学习应用中,这比有效位更重要。此外,乘法时,指数可以相加(容易),而有效位必须相乘(困难)。使有效数位变小会使相乘的硅浮动大约比小 8 倍。
此外,TPU 浮点格式刷新为零,而不是使用低于正常值的数字来提高速度。
高动态范围(HDR)图像
如果你阅读谷歌关于他们定制的 16 位浮点格式的博客文章,你会看到他们谈论“动态范围”事实上,类似的事情也发生在 HDR 图像上(比如你可以用手机捕捉到的图像)。
标准图像使用 8 位 RGB 编码。这 8 位表示 0 到 255 之间的无符号整数。这样做的问题是,当它更暗时,相对精度(连续值之间的跳跃百分比)要差得多。例如,在(十进制)像素值 10 和 11 之间,有 10%的跳跃!但对于亮值,250 和 251 之间的相对差异仅为 0.4%。
现在,人眼对暗色调的亮度变化比对亮色调的亮度变化更敏感。这意味着固定精度的表示与我们想要的相反。因此,拍摄 JPEG 或类似图像的标准数码相机或手机相机通过使用伽马编码在较暗的色调中相对更精确地记录来调整其灵敏度。
这样做的缺点是,即使你增加了比特(比如一个 16 比特的 RBG 图像),你也不一定能在图像中明亮的部分获得同样的精度。
因此,HDR 图像使用浮点数来表示像素!这允许较高的“动态”范围(指数可高可低),同时在所有亮度范围内保持相对精度。非常适合保存高对比度场景的数据。例如,在辐射 HDR 格式中,指数由每个像素中的三种颜色(通道)共享。
结论
关于浮点数,这可能比你想知道的还要多。幸运的话,你不会遇到太多无法用简单的 log-sum-exp 或任意精度整数解决的数字下溢或上溢。但是如果你这样做了,你会有充分的准备!希望你也能很好地思考你的机器学习模型需要多精确。
笔记
[1]注意:本文假设了一个相对标准的设置。根据您的硬件和软件实现,您的结果可能会有所不同(尽管不常见)。
[2]我的意思是,你 Python 解释器被允许抛出一个错误,崩溃,然后停止做事。你的 CPU 不能完全做到这一点:它必须保持活力。
足球如何帮助理解糟糕的算法
原文:https://towardsdatascience.com/how-football-helps-to-understand-bad-algorithms-b2b1393333ee?source=collection_archive---------25-----------------------

戴夫·阿达姆松在 Unsplash 上拍摄的照片
在商业中实施 AI 时,经常会出现两个主要问题。项目会遇到“坏数据”和“坏算法”。上周的博客描述了处理不良数据时出现的一些问题。本周,我们将使用足球来说明为什么糟糕的算法会给机器学习项目带来麻烦。
想象你是达拉斯牛仔足球队的教练。你的团队努力赢得比赛,你担心失去工作。你已经看到了分析和人工智能为棒球做了什么,所以你决定尝试一下。你雇了一个数据科学家,给她你剧本中的所有战术,以及游戏中每一次战术的结果。你告诉她创建一个算法,显示你应该运行哪些游戏以及以什么顺序运行。
数据科学家获取数据并应用机器学习算法。让我们想象 3 种结果场景:
- 整个游戏的完整剧本
- 建议每次都使用相同的剧本
- 根据游戏中的情况而变化的游戏列表
在场景 1 中,我们可能认为一个完整的剧本在理论上是可行的,但是在真实的游戏中会出现可怕的错误。由于比赛中出现了不同的情况,教练不能相应地调整战术。这意味着游戏脚本可以处理用于训练模型的数据(教练提供的游戏和结果),但不能很好地应对不确定性或新游戏中出现的情况。
这被称为过度拟合数据。当复杂模型应用于数据,并且不允许预测中的任何漂移或变化时,会发生过度拟合。在像足球这样的游戏中,有数以百万计的可用序列和结果,这些序列和结果可能没有被教练提供的数据捕捉到。因此,原始数据集没有提供的任何新情况都不会在所提供的“完美”剧本中得到承认。
在场景 2 中,我们可以看到数据科学家严重缺乏数据。他们选择了一种不了解数据潜在复杂性的模型,并输出了一个它认为最有效的策略。一场足球比赛比模型允许的要复杂得多,因此即使在训练数据上预测也不准确。想象画一条穿过散点图的直线。它不会对数据的起伏做出反应,也不会对变量的变化提供任何见解。
最好的情况是第三种。这里教练给一个理解正规化概念的全明星数据科学家打分。这个花哨的数学术语意味着数据科学家已经允许足够的复杂性来正确理解数据,但限制了输出值以确保模型不会过度拟合。正规化既是一门科学,也是一门艺术。正确限制模型并避免过度/欠拟合数据的问题需要经验和理解。
管理人员需要意识到当不正确的算法应用于数据集时会出现的问题。优秀的经理会看着数据集问:
- 预期的结果是什么?
- 变量之间的预期关系是什么?
有了预先的期望,管理者可以帮助识别过度或不足拟合数据的模型,并避免实现提供不正确结果的模型。
GANs 如何改进医疗保健分析
原文:https://towardsdatascience.com/how-gans-can-improve-healthcare-analytics-7d2379eff19e?source=collection_archive---------36-----------------------
生成性对抗网络为医疗保健组织提供了在患者治疗和隐私保护方面的应用

安娜·施瓦茨在像素上拍摄的照片
在过去的十年中,电子健康记录(EHR)系统在医院中的采用已经变得普遍。这一转变得益于 2009 年的《经济和临床健康卫生信息技术(HITECH)法案》,该法案拨款 3000 万美元用于激励医院和医生采用 EHR 系统。大医疗保健数据中的这种数字爆炸有助于现代机器学习工具,这些工具可用于各种任务,如疾病检测、患者旅程跟踪、概念表示、患者去识别和数据扩充。在过去,一类被称为卷积神经网络(CNN)的深度学习模型已经被成功地部署到各种疾病检测任务,包括与间质性肺病和结肠镜检查帧相关的分类任务以及息肉和肺栓塞的检测。
这些努力是成功的,因为这些任务的基础数据通常包含每个检测类别的足够的正面和负面例子。在上述每个疾病/紊乱的例子中,许多人测试呈阳性,也有许多人测试呈阴性。拥有大量正面和负面的例子有助于机器模型更有效地学习。对于阳性与阴性结果不*衡的疾病检测问题,像 CNN 这样的监督学习方法很难执行。例如,受监督的机器学习模型可能会与像埃博拉这样的罕见疾病斗争,因为很少有患者会检测出阳性,从而导致一个更大的阴性群体。
在这些情况下,生成敌对网络(GANs)是有用的,因为它们可以学习产生未被充分代表的数据的虚假例子,从而更好地训练模型。除了改进疾病检测,GANs 还可用于数据去识别,防止患者个人信息暴露。1996 年健康保险便携性和责任法案(HIPAA)隐私规则要求保护患者信息,这意味着医疗保健提供商需要认真对待它。在医疗保健分析领域,数据去识别是一个具有挑战性的问题,因为传统方法不够强大,不足以承受重新识别。也就是说,大多数当前的去识别方法都可以被逆转,从而危及医疗保健患者个人记录的隐私。研究和实践中的 GAN 模型为当今医疗保健面临的许多棘手问题提出了有希望的解决方案。
什么是生成性敌对网络?
在我们进入 GANs 的医疗保健应用之前,让我们先讨论一下它们的一些基本操作。GANs 背后最重要的底层概念是深度神经网络(即卷积神经网络)和反向传播。鉴于它们的相关性,我们应该简要回顾一下这些术语。
人工神经网络是由人脑粗略启发的数学模型。它们由一组单元(人工神经元)和单元之间的连接(突触)组成,每个单元的权重都随着反向传播过程中学习的改善而变化。要理解反向传播,请考虑下图。与神经网络预测相关联的误差值相对于分配给“学习”特征的权重值来绘制。训练神经网络的目标是找到给出最小误差的权重,这对应于找到图中的山的底部。你可以把学习过程想象成在丘陵地带行走,直到找到最低点。

反向传播图解。作者创作的插图。
典型的神经网络是这些互连和加权单元的集合,这允许模型捕捉输入和输出之间的高维和非线性关系。这种结构是它们运转良好的部分原因。在图像分析的背景下,由神经网络生成的低级特征可以是边缘(即:人脸的边缘/轮廓),高级特征可以是人类可识别的概念,例如字母、数字或人脸。
下图显示了一个基于患者特征(如年龄、体重、胆固醇水*和吸烟状况)预测糖尿病风险的简单示例。神经网络对这些输入进行转换,并设计重要的预测特征,这些预测特征是输入的非线性组合。然后,该网络使用学习到的特征来预测患者患糖尿病的风险。
在这种情况下,高层次特征的一个例子可能是捕捉一个超重的老年人的复合效应,他是一个高胆固醇的重度吸烟者。该患者患糖尿病的风险可能明显高于年轻、超重、高胆固醇的重度吸烟者。但是一个肥胖的高胆固醇的不吸烟的老年人怎么办?肥胖的不吸烟者比超重的重度吸烟者风险更大还是更小?人类很难准确预测这两个病人的结果。幸运的是,神经网络擅长捕捉这些特征之间的复杂相互作用以及它们如何影响结果的概率。
神经网络图像

神经网络图解。作者创作的插图。
卷积神经网络是这些更简单的网络的扩展,但它们也包括卷积层和池层。在高层次上,这些层擅长学习图像中最重要的部分,因为它们与整体图像的内容相关。正如我前面提到的,这些高级特征可能是人类能够识别的。卷积层提取高级概念(即:人脸、字母、物体、数字),max pooling 层将那些特征减少到学习所需的最本质的特征。
下图显示了对患者 CT 扫描中是否存在脑瘤进行分类的示例。卷积神经网络使用卷积层从图像中学习与健康大脑和肿瘤大脑最接*的高级特征。相关特征可以包括健康脑组织的片段、肿瘤的片段、整个肿瘤、肿瘤的边缘以及不一定能被人类解释但对机器学习有用的附加特征。max pooling 图层通过移除不会改善学习的冗余图像片段来减少这些提取的特征。该过程有助于模型从图像像素中优先考虑由高级特征表示的最重要或最常见的图像碎片。
cov net 的图像

卷积神经网络图解。作者创作的插图。脑部 CT 图像
现在我们有了基础,让我们讨论甘斯。GANs 是一组深度神经网络模型,由 Ian Goodfellow 在 2014 年开发,用于产生合成数据。合成数据是与特定情况相关的任何数据,不是通过真实世界的测量直接获得的。
GAN 的目标是训练鉴别器能够区分真实和虚假数据,同时训练生成器产生可以可靠地欺骗鉴别器的数据的合成实例。鉴别器是用于区分真实图像和合成图像的普通卷积神经网络,生成器是被训练来产生看起来真实的假图像的修改的卷积神经网络。GANs 一起训练鉴别器和发生器,以迭代地提高鉴别器识别假图像的能力和发生器产生真实图像的能力。
在下图中,一个生成器根据随机噪声像素数据进行训练,然后生成假的大脑 CT 图像。发生器产生的假图像随后与真图像一起被送入鉴别器。鉴别器是一个普通的 CNN,它被训练来区分真实和虚假的图像。生成器的训练旨在产生越来越逼真的假图像,以欺骗鉴别者。随着训练的继续,生成器在制造假货方面变得更好,鉴别器在区分真实和虚假图像方面变得更好,直到生成器产生与真实图像非常相似的图像。一旦训练完成,GAN 应该能够生成可用于扩充现有数据或创建全新数据集的逼真图像。数据扩充适用于示例中存在不*衡的情况(例如,与埃博拉等罕见疾病相对应的数据)。此外,创建新的合成数据集对于保护患者隐私以及提供购买昂贵的临床注释医疗数据的替代方案是有用的。
甘形象

一个生成性对抗网络的图解。作者创作的插图。脑部 CT 图像。噪声图像。
医学成像领域的 GANs
GANs 在医疗保健领域最普遍的应用是医学成像。两个重要的医学成像任务是脑肿瘤的数据分割和医学图像合成。
脑肿瘤分割
GANs 的一个有趣的应用是脑瘤分割,这相当于将脑 CT 图像分割成图像对象,如肿瘤边缘、健康组织和整个肿瘤部位。虽然对医生来说,检测大多数类型的脑肿瘤,如低级和高级别神经胶质瘤,通常是直截了当的,但通过视觉评估来定义肿瘤边界仍然是一个挑战。在最*的一项研究中,Eklund 等人。艾尔。开发了一种叫做 Vox2Vox 的方法,试图进行脑瘤分割。在他们的研究中,研究人员在脑肿瘤分割(BraTS)挑战 2020 数据集上训练了一组 3D GAN 模型,并能够生成高质量的脑肿瘤片段。具体来说,他们的集成模型能够检测整个肿瘤、肿瘤核心和活动期肿瘤,每个类别的 dice 系数>为 87%,这优于过去使用 CNN的研究。这些方法提供了用于生成高质量脑瘤片段的手段,这些脑瘤片段可以在分析、治疗和手术期间对医生有所帮助。
医学图像合成
GANs 的另一个有趣的应用是在医学图像合成中。由于获得临床注释的高成本,医学成像数据很少可用于大规模分析。考虑到这一阻碍因素,许多研究项目致力于开发可靠的医学图像合成方法。在 2017 年的一篇论文中,Campilho 等人。艾尔。开发了生成合成视网膜图像的方法。通过在来自 DRIVE 数据库的视网膜图像上训练 GAN,这些研究人员能够证明生成真实不存在的高质量视网膜图像的可行性。这些假图像可用于在视网膜图像数量有限的情况下增加数据,并可进一步用于训练未来的人工智能模型。在未来,这些方法可以用来为训练模型产生数据,以检测没有足够真实数据来训练准确模型的疾病。此外,这种类型的合成成像数据可用于进一步保护患者隐私。
生成合成离散医疗数据
虽然 GANs 最常见的用途是用于医学图像合成和图像分割,但是 GANs 也可以帮助生成合成的多标签离散数据。这是 GANs 的一个有用的医疗保健应用,因为它可以为患者隐私提供强大的保护。通常,为了保护患者隐私,EHR 记录去标识的方法包括稍微修改个人可识别属性,例如出生数据。一种常见的去标识方法是一般化,在这种方法中,出生数据等属性只能一般化为月份和年份。
不幸的是,在这种方法中,被修改的记录和产生它们的原始记录之间仍然存在一对一的映射。这使得他们容易受到攻击,不良行为者可以重新识别患者信息。另一种方法是开发合成的患者数据。2017 年,孙等人。艾尔。开发了医疗 GANs (medGAN),以生成合成的多标签离散患者记录。使用这种方法,他们能够准确地产生合成的二进制数,并对代表 EHRs 中事件的变量进行计数(即:某种疾病的诊断或某种药物的治疗)。鉴于访问 EHR 数据的难度,medGAN 为医疗保健研究做出了重大贡献,因为它提供了一种生成高质量合成患者数据的方法。作者还提供了一个隐私的实证评估,并证明了 medGAN 在个人身份识别中造成的风险有限,这进一步验证了他们的方法。
结论
鉴于 GANs 已在图像分割、图像合成和离散患者数据合成领域展现出前景,它们有可能彻底改变医疗保健分析。医学中的图像分割方法可以扩展到医学图像中的外来物体识别、其他类型的肿瘤生长的检测以及器官结构的精确识别。对于后者,使用 GANs 的图像分割可用于在磁共振成像中给出脑、肝、胸、腹和肝的精确结构细节。此外,GANs 在医学图像合成领域显示出巨大的潜力。在许多情况下,医学成像分析受到缺乏数据和/或真实数据的高成本的限制。GANs 可以通过使研究人员和医生能够使用高质量、逼真的合成图像来解决这些问题。这可以显著改善疾病诊断、预后和分析。最后,GANs 在患者数据隐私领域显示出巨大的潜力,因为它提供了一种更可靠的方法来隐式地将真实的患者数据映射到合成数据。这种隐式映射改善了患者的数据隐私,因为它不是典型的一对一映射,因此难以显式恢复。医学图像分割、图像合成和数据匿名化方面的改进都是提高医疗保健信息学效率和可靠性的垫脚石。
地理空间数据如何帮助抗击流行病
原文:https://towardsdatascience.com/how-geospatial-data-can-help-fight-pandemics-112e5baec59c?source=collection_archive---------37-----------------------

约翰·霍普斯金大学绘制的冠状病毒地图
新型冠状病毒或新冠肺炎正在肆虐,这不是我们必须面对的第一种或最后一种传染病。在最*的过去,我们也看到了新传染病的大规模爆发,如 MERS、SARS、寨卡病毒、埃博拉病毒、H1N1 猪流感、禽流感和许多其他疾病。我们目前还有不同的流行病,如脊髓灰质炎、艾滋病、登革热等。在世界的不同地方。
我们相信可能会有更多有害的疾病向我们袭来。我们希望这不会发生,但当我们这样说时,我们有四个理由:
1)超级细菌的进化
2)气候变化
3)人口过剩
4)生物恐怖主义
现在让我们简单解释一下。
超级细菌
随着抗生素的发明,人类找到了杀死以前杀死数百万人的有害细菌的终极武器。但是细菌,像所有生物一样,会进化。它们现在正在进化成超级细菌,这是同样的细菌,但对抗生素有抗药性。
如果你想深入了解超级细菌的细节,请观看这段 6 分钟的视频。它很好地解释了这一现象:
气候变化
气候变化也是人类面临的另一个巨大威胁。人们认为这只会导致极端天气事件,但不幸的是,事实并非如此。它也会带来致命的疾病。
病毒可以休眠数万年,当有生存条件时又会复活。世界各地的冰川中埋藏着过多的古代病毒。对于这些古老的病毒,我们没有药物和疫苗,更糟糕的是,我们的免疫系统也没有进化到可以对抗它们。
一个这样的例子出现在俄罗斯北极地区,一种古老的病毒从融化的永久冻土中复活,杀死了数千只驯鹿和一些人。你可以在 BBC 地球的这个故事中读到更多关于这个事件的细节。
[## 冰里藏着疾病,它们正在苏醒
纵观历史,人类一直与细菌和病毒共存。从黑死病到天花,我们…
www.bbc.com](http://www.bbc.com/earth/story/20170504-there-are-diseases-hidden-in-ice-and-they-are-waking-up)
问题不仅仅在于极地冰川。西藏山脉,通常被称为世界第三极,也有正在融化的巨大冰川,这些冰川也有大量休眠的古代病毒。

锡亚琴冰川是世界上第二长的非极地冰川,为印度河提供水源。脸书的照片
世界上最大的四条河流,即印度河、恒河、黄河和长江都从这些西藏冰川流出。一些相对较小的河流,如雅鲁藏布江和湄公河,也发源于相同的冰川。这些河流流入中国、印度、巴基斯坦、尼泊尔、孟加拉国和阿富汗。这些国家大约拥有地球人口的一半。因此,这些冰川中的任何病毒都可能很快感染人类和/或威胁我们的牲畜。
人口过剩
随着人类人口达到历史最高水*并仍呈上升趋势,我们需要更多的资源和空间。由于这个原因,我们的物种正在越来越深地侵占野生动物的栖息地。这些动物中有许多生活在病毒中,这些病毒对我们人类来说可能是致命的,但对他们来说是无害的。
这段 2015 年的视频警告人们不要打扰野生蝙蝠。它讲述了野生蝙蝠是如何给人类带来潜在的致命疾病的。
生物恐怖主义
现在有一种新的、低成本的、非常致命的武器:生物恐怖主义。
现在,通过修改基因和其他各种技术,可以在实验室合成病毒和细菌。这是非常具有杀伤力的,因为这是一个极低成本和有效的。此外,追踪细菌/病毒的来源非常困难,因此任何人都可以这样做而不用担心遭到反击。
它可以被军队、军队中的流氓分子甚至恐怖组织所利用。所以在我们看来,这是人类对人类非常大的威胁。
地理空间数据有什么帮助?
迄今为止,情况看起来非常糟糕,但事实并非如此。现在来说说解决办法。这里我们有三个地理空间数据可以提供帮助的例子。
识别风险区域
当涉及到冠状病毒等传染病时,地理空间数据非常有用,因为它有助于识别模式。我们最*建立了一个工具“电晕地图”,它显示了电晕在国家层面上传播的历史和地理空间数据。

2020 年 3 月 30 日的统计数据在 thecoronamap.com上查看
这个工具现在有国家一级的数据。但是,如果数据可用,这可以用来深入到最小的地理边界,如县或街道。在这个层面上,它变得非常强大。
当局可以看到哪些是热点,哪些是真正受到攻击的地区,这种地理空间可视化提供了决策支持,如哪些地区需要封锁,哪里需要更多的测试中心等等。这些信息使当局能够将邪恶扼杀在萌芽状态,并将任何流行病遏制在萌芽状态。
可以为医院、临时医院、隔离中心等资产的压力创建类似的地理空间可视化。压力可能是医务人员、呼吸机、氧气瓶和个人防护用品等的缺乏。这种可视化也可以帮助当局有效地管理他们的资源。
我们已经创建了这样一个空间决策支持系统将如何工作的简单流程图。

空间决策支持系统如何帮助当局进行决策的流程图
这种系统不仅可用于流行病/大流行病,还可同样用于监测其他疾病,并有助于发现模式和热点。例如,一个县腹泻病例的增加可能意味着供水管道被污染等等。
该系统的另一个非常重要的要求是其数据必须在国际上共享。这些国家需要在欧洲联盟、阿拉伯联盟、非洲联盟、南亚区域合作联盟和联合国等区域和/或国际组织制定的框架内相互共享数据。
追踪和跟踪患者
这种方法已经在巴基斯坦和韩国等一些国家使用。这些国家正在从电信服务提供商那里获取其公民的位置和移动历史数据。现在,当一名患者的新冠肺炎病毒检测呈阳性时,他过去 14 天的旅行记录会被检查,在此期间与他见过面的人会得到提醒。

巴基斯坦用户收到的警报短信的屏幕截图
在这个流程图中,我解释了这样一个系统应该如何工作。

各国如何追踪冠状病毒感染患者的流程图
同样的数据也被用来追踪病毒的踪迹,并发现更多处于危险中的人。事实证明,地理空间数据的这种用途在这些国家非常有用。
在线考试
另一个非常重要的工具是在线症状检查器,它也在一些地方被使用。如果添加位置数据,这也会变得更加有用。我们还创建了一个症状检查器,你也可以用它来检查你自己的症状这里。

新冠肺炎症状检查器
一旦我们有了症状的信息,病人的位置和他有电晕的可能性就被标绘在地图上。这张地图真的可以帮助当局了解更多病例的来源。您可以在此查看上述测试的症状。

电晕症状图
这些信息也可用于筛选重症病例,并可派遣团队在患者自我隔离时从他们身上收集检测样本。这不仅减轻了对医疗基础设施的压力,还消除了患者在通勤期间进一步传播病毒的风险。
在下面的流程图中,我们解释了这个用例,以帮助您更好地理解。

在线症状检查器如何减轻医疗基础设施的压力
这篇文章是与哈佛医学院的教师 Jacques Kpodonu 博士合著的。
我是拉米兹·萨米。我爬山、举重、构建 WebGIS 解决方案。请随时在 Linkedin 上与我联系。
GIN 索引如何让 Postgres 查询速度提高 15 倍
原文:https://towardsdatascience.com/how-gin-indices-can-make-your-postgres-queries-15x-faster-af7a195a3fc5?source=collection_archive---------8-----------------------
通过查询示例,您可以在笔记本电脑上运行

添加索引将查询时间从几分钟缩短到了几毫秒,这是我职业生涯中从未有过的。作为数据科学家,我们花费大量时间来查询和分析数据,因此我们应该知道如何高效地完成这项工作。
Postgres 有 6 种索引类型。今天我们将讲述杜松子酒指数。
我们将为数据库植入越来越多的数据,并比较使用和不使用 GIN 索引的查询时间。如果您使用 SQL 编辑器(我使用的是 DBeaver)进行操作,您会受益更多。
什么是指数?
一种数据结构,以较慢的插入速度和更多的磁盘空间为代价,提高了从数据库中检索数据的效率。
什么是杜松子酒指数?
GIN 代表广义倒排索引。通常,倒排索引将单词映射到它在表中的位置。
下面是我对倒排索引的一个抽象。
如果我们想在没有索引的情况下在表中查找包含单词lazy的句子,我们需要迭代表中的每个句子来查找匹配。
但是通过增加一个索引,我们提前知道哪些句子包含了lazy这个词,可以直接加载那些。这使得事情快了很多!

这种类型的索引适用于查询复合数据类型,这意味着它们存储不止一个值。例如 hStores、Arrays、Ranges 和 JSONs。
杜松子酒指数快了多少?
让我们找出答案。
首先创建一个表并用数据填充它。
**# create table**
CREATE TABLE articles (
body text,
body_indexed text
);**# add an index**
CREATE INDEX articles_search_idx ON articles USING gin (body_indexed gin_trgm_ops);**# populate table with data**
INSERT INTO articles
SELECT
md5(random()::text),
md5(random()::text)
from (
SELECT * FROM generate_series(1,100000) AS id
) AS x;
太棒了,我们现在有一个名为articles的表,有 100k 条记录和 2 列随机字符串。
如果你对指数感兴趣。我们没有直接索引字符串,而是使用 Postgres 的gin_trgm_ops从每个字符串创建trigrams(想想sklearn中的ngrams),并对其进行索引。
在我的 SQL 编辑器中,该表如下所示。

我将在添加每 100k 条新记录后跟踪查询时间。
我会运行这些查询。
**SELECT** **count**(*) **FROM** articles **where** body **ilike** '%abc%';
**SELECT** **count**(*) **FROM** articles **where** body_indexed **ilike**'%abc%';
相同或相似的查询运行多次会在运行时间上有所不同。这是由于机器上变化的系统负载和变化的查询计划。为了我们的目的,忽略波动,看看时差的一般趋势。

哇!这对于仅有的 200 万张唱片来说是一个巨大的差异。想象一下,我们正在查询一个数十亿的数据库。
结论
大多数时候我们只需要添加一个 B 树索引。但有时像杜松子酒这样的另一个指数更合适。当您最终遇到 B 树无法解决的问题时,知道其他索引类型是有用的。
你有没有遇到过任何很酷的索引用例,或者以有趣的方式应用它们?
民意测验专家有多好?分析 538 的数据集
原文:https://towardsdatascience.com/how-good-are-the-pollsters-analyzing-five-thirty-eights-dataset-fe000eb71909?source=collection_archive---------43-----------------------
我们分析了来自历史悠久的政治预测网站 538 的民调数据。

图片来源:作者拼贴创作(免费图片)
介绍
这是一个选举年,围绕选举(总统大选和众议院/参议院)的投票正在升温。这将在未来几天变得越来越令人兴奋,推文,反推文,社交媒体斗争,以及电视上无休止的专家评论。
我们知道,不是所有的民意测验都是同样的质量。那么,如何理解这一切呢?如何使用数据和分析来识别值得信赖的民意调查者?

图片来源: Pixabay (免费用于商业用途)
在政治领域(以及其他一些领域,如体育、社会现象、经济等)。)预测分析, 五三八 是一个令人生畏的名字。
自 2008 年初以来,该网站已经发表了关于当前政治和政治新闻的各种主题的文章,通常是创建或分析统计信息。该网站由 rockstar 数据科学家和统计学家 Nate Silver 运营,在 2012 年总统大选期间获得了特别的关注和广泛的声誉,当时其模型正确预测了所有 50 个州和哥伦比亚特区的获胜者。

图片来源:维基百科(创意常见)
而在你嗤之以鼻说“ 但是 2016 年大选呢? ”,你或许应该读一读这篇关于唐纳德·川普(Donald Trump)的当选如何在统计建模的正常误差范围内的文章。
[## 特朗普只是落后于克林顿的一个正常的民调误差
即使在总统竞选结束时,民意调查也不能完美地预测选举的最终差距。有时候…
fivethirtyeight.com](https://fivethirtyeight.com/features/trump-is-just-a-normal-polling-error-behind-clinton/)
对于对政治更感兴趣的读者来说,这里有一整袋关于 2016 年大选的文章。
数据科学从业者应该会喜欢上 Five-38,因为它不回避用高度技术性的术语解释他们的预测模型(至少对于外行来说足够复杂)。

图片来源:本文
在这里,他们正在谈论采用著名的 t 分布,而大多数其他民调聚合者可能只是对无处不在的正态分布感到满意。
[## 了解学生的 t 分布
大多数学生被告知,随着样本量的增加,t 分布接*正态分布。
rpsychologist.com](https://rpsychologist.com/d3/tdist/)
然而,除了使用复杂的统计建模技术,Silver 领导下的团队还以一种独特的方法为傲,即民意测验专家评级,以帮助他们的模型保持高度准确和可信。
在这篇文章中,我们分析了这些评级方法的数据。
five-38 并不回避用高度技术性的术语解释他们的预测模型(至少对于外行来说足够复杂)。
民调评级和排名
这个国家有许多民意测验专家。阅读和评估它们的质量可能非常费力和棘手。据该网站称,“阅读民意测验可能对你的健康有害。症状包括过度自信为瘾君子数字 ,以及 急于判断 。谢天谢地,我们有治疗方法。(来源)
有民调。然后,还有的民调的民调。然后,还有民调的加权民调。最重要的是,有一个民意调查的权重是统计建模和动态变化的权重。
** [## 选举 2020 投票现场指南-皮尤研究中心方法
虽然美国的调查研究是一项全年的事业,但公众对投票的关注从来没有像现在这样多…
www.pewresearch.org](https://www.pewresearch.org/methods/2019/11/19/a-field-guide-to-polling-election-2020-edition/)
作为一名数据科学家,你对其他著名的排名方法是否耳熟能详?亚马逊的产品排名还是网飞的电影排名?可能吧,是的。
本质上,538 使用这种评级/排名系统来衡量民意测验结果(排名高的民意测验者的结果被给予更高的重要性等等)。他们还积极跟踪每个民意调查结果背后的准确性和方法,并在全年调整他们的排名。
[## FiveThirtyEight 如何计算民调评分
见 FiveThirtyEight 的民意测验评分。民意测验是 FiveThirtyEight 的创始特色之一。我在……
fivethirtyeight.com](https://fivethirtyeight.com/features/how-fivethirtyeight-calculates-pollster-ratings/)
有民调。然后,还有民调的民调。然后,还有民调的加权民调。最重要的是,有一个民意调查的权重是统计建模和动态变化的权重。
有趣的是注意到他们的排名方法并不一定把样本量大的民意测验专家评为更好的。下面来自他们网站的截图清楚地证明了这一点。虽然 Rasmussen Reports 和 HarrisX 这样的民意调查机构有更大的样本量,但事实上,Marist College 以适中的样本量获得了+评级。

图片来源:网站作者于 2020 年 6 月 6 日截屏。
幸运的是,他们还在 Github 上开源了他们的民意调查排名数据(以及几乎所有其他数据集)。如果你只对好看的桌子感兴趣,这里有。
自然,作为一名数据科学家,您可能希望更深入地研究原始数据,并理解诸如以下内容:
- 他们的数字排名如何与民意测验专家的准确性相关联
- 如果他们对选择特定的民意测验专家有党派偏见(在大多数情况下,他们可以被归类为倾向民主党或倾向共和党)
- 谁是排名最高的民意测验专家?他们进行了很多民意调查,还是有选择性的?
我们试图分析数据集来获得这样的见解。让我们深入研究代码和发现,好吗?
分析
你可以在我的 Github 回购 T3 上找到 Jupyter 笔记本 。
源头
首先,您可以直接从他们的 Github 中提取数据,放入 Pandas 数据框架中,如下所示:

该数据集中有 23 列。这是它们的样子,

一些改造和清理
我们注意到一列有一些额外的空间。其他一些可能需要一些提取和数据类型转换。



在应用该提取之后,新的数据帧具有额外的列,这使得它更适合于过滤和统计建模。

“538 等级”栏目的考核与量化
列“538 等级”包含了数据集的关键—民意测验者的字母等级。就像正规考试一样,A+比 A 好,A 比 B+好。如果我们画出字母等级的数量,我们观察到总共 15 个等级,从 A+到 f。

我们不需要处理这么多的分类等级,我们可以把它们组合成少量的数字等级——4 代表 A+/A/A,3 代表 B,等等。

箱线图
进入视觉分析,我们可以从箱线图开始。
假设我们想要检查哪种轮询方法在预测误差方面表现更好。数据集有一个名为“ 简单*均误差 ”的列,它被定义为“公司的*均误差,计算为投票结果和实际结果之间的差值,用于区分比赛中前两名参赛者。

然后,我们可能会有兴趣去检查是否有一定党派偏见的民意调查者比其他人更成功地正确预测选举。

注意到上面有趣的东西了吗?如果你是一个进步的、自由的思想家,十有八九,你可能是民主党的党员。但是,一般来说,倾向共和党的民意调查者认为选举更准确,可变性更小。最好小心那些投票!
数据集中另一个有趣的列叫做“”NCPP/阿泊尔/罗珀 【T3”。它“表明这家民调公司是不是全国民意调查委员会的成员、* 美国公众舆论研究协会透明度倡议 的签署者,还是罗珀公众舆论研究中心数据档案 的贡献者。实际上,成员资格表明遵循了更可靠的轮询方法”(来源)。*
如何判断前述论断的有效性?数据集有一个名为“ 高级加减 ”的列,这是“一个将一个民调机构的结果与调查相同种族的其他民调公司进行比较的分数,它对最*的结果加权更大。负分是有利的,表示质量高于*均水*”(来源)。
这是这两个参数之间的箱线图。与 NCCP/阿泊/罗珀相关的民意测验专家不仅表现出较低的误差分数,而且还表现出相当低的可变性。他们的预测似乎是稳健的。

如果你是一个进步的、自由的思想家,十有八九,你可能是民主党的党员。但是,*均而言,倾向共和党的民意调查者认为选举更准确,可变性更小。
散点图和回归图
为了了解参数之间的相关性,我们可以通过回归拟合来查看散点图。我们使用 Seaborn 和 Scipy Python 库以及一个定制的函数来生成这些图。
例如,我们可以将正确称为 的“ 种族”与“ ”预测正负 ”联系起来。根据 538,“ 预测正负 ”是“对民意调查者在未来选举中准确性的预测。它是通过将民意测验专家的高级正负分数还原为基于我们的方法论质量代理的*均值来计算的。(来源)**

或者,我们可以检查我们定义的“ 数字等级 ”如何与轮询误差*均值相关联。负趋势表示较高的数字等级与较低的轮询错误相关联。

我们还可以检查“ ”、 “用于偏见分析的民调数字”是否有助于减少分配给每个民调者的“”党派偏见程度。我们可以观察到一种向下的关系,表明大量民意调查的可用性确实有助于降低党派偏见的程度。然而,这种关系看起来高度非线性并且对数标度会更好地拟合曲线。**

****越活跃的民意调查者越值得信任吗?我们绘制了民意测验数量的直方图,看到它遵循负幂律。我们可以过滤掉民意测验数量非常低和非常高的民意测验者并创建一个自定义散点图。然而,我们观察到在民意测验的数量和预测的正负分数之间几乎不存在相关性。因此,大量的民意调查并不一定导致高的民意调查质量和预测能力。
****
…大量民意调查的可用性确实有助于降低党派偏见的程度。
过滤和排序顶级民意测验专家
最后,我们可以通过定制的过滤逻辑,执行简单的数据帧操作来提取排名最高的民意测验者列表。例如,我们可以提出问题“做过 50 次以上民意调查的前 10 名民意调查者中,谁的高级加减分最好?”。

这是结果。请注意,我们没有按照“538 等级”或“数字等级”进行排序,但是因为它们与“高级加减”分数相关,所以在这个提取的列表中,大多数民意调查者都有 A+或 A 评级。

因此,大量的民意调查并不一定导致高的民意调查质量和预测能力。
其他因素
数据集包含其他参数,如' 、豪斯效应 '和' 、均值回复偏差 ',其中也包含党派偏差信息。它们肯定被用于五点三八预测的内部建模,可以进一步探索。
摘要
在本文中,我们展示了如何从久负盛名的 538 门户网站获取民意测验者评级的原始数据,并编写一个简单的 Python 脚本来进行适当的转换和可视化分析数据。
同样,你可以在我的 Github repo 上找到 Jupyter 笔记本 。
答同样,你可以查看作者的 GitHub 知识库获取机器学习和数据科学方面的代码、思想和资源。如果你像我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。
** [## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)****
你的预测有多准确?
原文:https://towardsdatascience.com/how-good-are-your-forecasts-a37cb9cf5c1d?source=collection_archive---------19-----------------------

Artur Matosyan 在 Unsplash 上拍摄的照片
为您的预测选择正确的误差指标
介绍
你的预测几乎总是错误的。无论你是在试图预测苹果下周的股价、巴西明年的能源消耗,还是你公司未来几个月的收入,几乎都不可能击中靶心:你肯定会弄错,哪怕只是很小的误差。一个非常重要的问题是如何测量误差。一个+50 的错误和一个-50 的错误一样糟糕吗?一个+100 的错误是一个+50 的错误的两倍吗?
正确的误差度量将主要取决于您的数据、您的目标和您的业务环境。在这里,我将介绍一些最常见的测量误差的方法(也有一些不常见的),它们的优点和缺点,以及在哪些特定情况下它们是可取的或不可取的。
开始之前的一些重要概念…
天真的模型
朴素模型是你能想到的做出预测的最简单的模型,它被用作比较所有其他模型的基线。通常,这意味着用你最后的观察作为你对下一个时期的预测。所以如果有人问你你的公司这个月会赚多少钱,你会说:“和上个月一样”。此外,如果您正在处理季节性数据,那么您将使用上一季度的同一时期(因此您预测今年 12 月的销售额与去年 12 月的销售额相同)。好像不是很好的模式吧?事实上,要大幅度击败它是非常困难的,尤其是对于非常复杂的模型。
这是一个有用的分析,可以确保你的预测过程是增值的,或者你是否应该坚持简单天真的预测。
步行验证
当处理时间序列时,我们使用以前的信息来估计未来,有时如果我们对下周或未来 10 周进行预测,会产生巨大的差异。因此,在您的模型评估步骤中,您应该尝试复制将在模型实施和预测使用后使用的相同过程。假设您必须制作一个模型来估计您公司的销售额,并且该模型将在每月的第一天用来估计下个月的销售额。为了测试您的模型,您应该使用相同的方法,这意味着您将忽略上个月的观察值来计算每个月的估计值(因为在应用您的模型时您将无法访问该信息),但仅此而已。
这意味着,如果您对数据应用一次传统的训练/测试分割,并尝试评估您的预测,您将不会获得准确的结果。相反,您应该重复训练/测试分割过程,以模拟进行预测的实际条件。在我们之前的示例中,如果您正在测试 2019 年的数据,您将首先使用 2018 年 12 月之前的所有数据作为您的训练集,并预测 2019 年 1 月。然后,为了预测 2 月份,我们将 2019 年 12 月添加到我们的训练集中,以此类推。
误差度量
注释
对于下面的所有公式,我们将使用以下符号:

均方根误差(RMSE)

RMSE 将误差(预测值和实际值之间的差异)进行*方。然后,将它们*均,并计算*均值的*方根。这种双重转换有两个效果:它给较大的误差更大的权重,并且它阻止正负误差相互抵消,因为它们都将变成正的。它可以用来比较同一系列的不同预测,但它不是很直观,所以我不会在管理演示中使用它。
*均绝对误差

也称为*均绝对偏差(MAD),MAE 对绝对值中的误差求和,因此负差不会抵消正差,而是将它们*均。它非常直观,所以很容易解释。它的一个缺点是依赖于规模,也就是说,它会根据你预测的收入是美元还是欧元而变化。同样,这不是很直观,但对于计算另一个误差指标很有用,我们将在下面看到。
*均绝对百分比误差(MAPE)

MAPE 与 MAE 非常相似,不同之处在于它与比例无关,因为我们将其除以实际值。这可能是商业预测中最常用的误差指标,因为它非常容易解释。然而,有一个警告:它有时可能有点误导,让你认为它总是保持在 0 到 100%之间。尽管它总是大于 0,但也可能远高于 100%。另一个不方便的地方是当你的观测值等于 0 时,这意味着你不能把它们作为分数的分母。在这种情况下,有些人会忽略这些观察结果,但是你应该知道,例如,当你处理间歇需求(很多值等于 0)时,MAPE 不是一个足够的度量。
另一个主要缺点是它的不对称性:它对过度预测的惩罚比对预测不足的惩罚更重,导致在比较不同模型时可能出现偏差。
尽管它有缺点,但它非常受欢迎,主要是因为它直观且易于解释。因此,您可以使用其他指标来评估您的预测,但在演示文稿中使用 MAPE 进行管理。
*均绝对标度误差

MASE 增加了一个有趣的视角:它将你的模型误差与简单模型的误差进行比较。它总是正的,尽管它可以无限大,但是如果它大于 1,就意味着你的模型实际上比原始模型表现得更差,因此没有增加价值。
它的价值来自于这样一个事实,即它是唯一一个实际使用天真预测的指标,因此考虑到了数据固有的可预测性。
*均误差/*均值

也被称为 MAD/MEAN,它是你的观察值的*均误差和*均值之间的分界点。这是创建 MAE 的无标度版本的尝试。
结论和进一步阅读
我们已经看到了许多衡量我们的预测有多好的方法,以及我们应该在什么时候使用它们。理想情况下,你不应该只依赖一个指标,而是依赖 2 个或 3 个:一个简单的无标度指标来比较你的模型;另一个是使用天真的预测来检查你的预测过程是否增加了价值;最后一种更直观,更容易理解,可以在演示中使用。
如果你想了解更多关于商业预测的知识,我推荐你从这两本书开始:《商业预测:实际问题和解决方案》和《商业预测交易》,这两本书都是迈克尔·吉利兰写的。
如果你想从整体上了解更多关于预测工作流程的信息,这篇文章展示了一种精益方法。
你的机器人外科医生有多好?递归网络的预测技巧
原文:https://towardsdatascience.com/how-good-is-your-robot-surgeon-predicting-skill-with-recurrent-networks-ef992617aaf4?source=collection_archive---------58-----------------------
Keras 时间序列分类(LSTM)

照片 171474770 罗马塞特—Dreamstime.com
问题是
培养有能力的外科医生是所有外科住院医师计划的目标。在手术室评估技能时,评估通常依赖于对住院医师的技术表现进行评分的外科专家。这种手术评估可以做得更好,原因很明显:
传统的评估速度慢,主观性强,并且受到外科专家数量的限制。
未来的手术室将会不同。配备了机器人辅助手术系统,培训师和学员可以访问 数字化程序数据的宝库——为新一代分析奠定基础,以支持有效、客观和适时的手术反馈。
在这篇文章中,我们展示了深度学习在快速准确的外科技能评估中的应用。
数据
JIGSAWS 数据集源于约翰霍普金斯大学和机器人系统设计和制造的先驱直觉外科公司的合作。迄今为止,这是唯一公开的微创机器人手术数据集。
我们使用 运动学运动传感器 (总共 76 个)作为我们的输入变量,每个传感器都是从具有不同手术经验的八名外科医生那里收集的一系列运动数据。每位外科医生执行三项手术任务——打结、穿针、缝合——,每项任务重复 5 次。
我们使用 技能等级 作为我们的目标变量。技能水*反映为基于受训者实践小时数的自我报告标签。一名专家是报告超过 100 小时的人,一名中级是 10-100 小时之间的人,一名新手是总手术机器人操作时间低于 10 小时的人。

图 JIGSAWS 数据集的汇总表。
准备
我们的实验试图仅使用运动数据来解决分类问题。该过程包括将运动数据处理成多变量时间序列,该时间序列用于输出专家(E) 、中级(I) 或新手(N) 标签,这取决于数据中展示的技能水*。
数据加载(熊猫的文本文件)
JIGSAWS 提供了一个广泛的文件目录——其中很多我们在本教程中并不需要(例如,视频数据、实验数据)。为了简化我们的导航,让我们创建一个单独的目录,只复制包含运动学运动和技能水*的文本文件(meta_files):

图 2:便于导航的新文件夹架构
对于从多个文件夹中读入多个文本文件的 Python 代码,参见笔记本。
此时,我们希望将包含在 meta_files 中的标签合并到它们各自的外科医生。例如,我们需要识别外科医生“打结 B”为 N ,打结 C 为 I ,打结 D 为 E 。我们应用一个自定义函数merge_labels() 来简化这个过程:

图 3:合并传感器数据和技能等级标签
数据扩充
每个时间序列的典型长度在 1 到 5 分钟之间。每个手术有 8 个外科医生和每个外科医生 5 次试验,JIGSAWS 数据集只包含 40 个用于训练每个手术任务模型的独立样本。为了克服训练限制,我们遵循王等人在本文中使用的两步数据扩充程序:
- 行分割运动数据 对于运动数据中的每个行样本,我们将 MTM 和 PSM 通道分成两个实例,并将它们转换为不同的样本。例如,每两行样本将有 38 个传感器,而不是每行样本 76 个传感器。这个“分裂和加倍”步骤是允许的,因为 MTM 和 PSM 传感器由于机器人控制臂的位置差异而不相关。原始传感器数据的每个通道都经过 z 归一化处理,以最小化每个传感器缩放范围的差异。
- 提取子序列
它的工作原理是从传感器数据中捕获固定长度(窗口大小)的观察值,并在序列中逐步移动该窗口(步长)以提取子序列。通过将step_size设置为window_size参数的一半,我们创建了具有 50%重叠区域的时间窗口(尽管仍未确定重叠窗口是否优于非重叠技术)。以下是 Python 代码:
在原始数据集上的这种数据扩充程序使得模型能够分别被供给 8754、6052 和 4134 个作物用于缝合、穿针和打结。总而言之,训练我们的递归神经网络的输入数量更合理!
关于数据增强的更多内容,王等。艾尔的手稿启发了我们的策略。
Keras 的数据格式
在我们准备将注意力转向模型构建之前,我们需要以适合 Keras 的格式准备数据。如果你愿意,你可以在笔记本中进一步挖掘,但为了简洁起见,以下是主要观点:
- 重塑裁剪后的数据:Keras 中的递归层只接受三维数组,因此我们必须将我们的 2D 熊猫数据帧重塑为 3D 数组。为了有效地处理每个手术任务,我们使用自定义函数
shape_inputs()。 - 分离输入/输出:在裁剪和整形后,分离你的动作数据和技能等级值很重要。如果您试图过早地执行分离,您的 X 输入和 Y 标签将会错位。
- 格式输入变量: X 输入必须手动转换成张量,因为我们使用的是一个由列表组成的数组,而不是一个由 Numpy 数组组成的数组。 Keras 不支持数组列表。
- 格式化输出变量:对于 Y 标签,我们需要将输出变量——一个基于字符串的向量
array([’N’, ’N’, ’N’, …, ‘E’, ‘E’, ‘E’], dtype=’<U1')—转换成一个整数编码的 2D 独热数组。如果做得不正确,Keras 会因为使用了特定的损失函数而抛出一个错误(下一节将详细介绍)。我们应用来自笔记本的自定义函数encode()进行整数编码。然后,我们应用张量流函数to_categorical(),进行一键编码。
**## How our output variable should be formatted for Keras**
# array([[0., 0., 1.],
[0., 0., 1.],
[0., 0., 1.],
...,
[0., 0., 1.],
[0., 0., 1.],
[0., 0., 1.]], dtype=float32)
建模
关于递归神经网络(RNN)如何工作的更多信息,安德鲁·卡帕西关于 RNN 计算和长期短期记忆(LSTM)的文章是一个很好的阅读材料。
我们使用 Keras 序列模型类型来构建递归神经网络,这允许逐层构建。我们选择 3 种不同的架构来为每个手术任务训练单独的模型,制作 9 个 rnn 进行比较。虽然有比下图更复杂的构造 RNN 的方法,但单层 LSTM 设置效果很好。以下是每种体系结构使用的层:
- 简单 RNN: 1 简单 RNN 层。1 个全连接密集层,具有 3 个输出类和 sigmoid 激活。
- 深 RNN: 2 简单 RNN 层和返回序列。1 个全连接密集层,具有 3 个输出类和 sigmoid 激活。
- 单层 LSTM: 1 层 LSTM。1 个全连接密集层,具有 3 个输出类和 sigmoid 激活。
LSTM RNN 胜过浅水和深水 RNN。这很直观,因为 LSTM 使用了一个更强大的更新方程,它能更好地从长序列的输入中获取信息。

图 4:按手术任务、模型类型分类的准确性
使用特征融合技术,相关工作的最高准确率达到 99%。LSTM 似乎在没有过度拟合的情况下表现得和那些方法一样好(学习曲线在笔记本中显示)。现在,在写这篇文章的时候,我了解到对于分类问题,的 F1 分数通常比准确度更好,尤其是当与假阳性相关的成本大于假阴性的成本时(反之亦然)。我们的结果仅使用精度度量给出,因此在重复实验中比较 F1 是值得的。
结论
在这篇文章中,我们展示了一种用递归网络对运动时间序列数据建模的方法。我们发现强有力的支持,LSTM 可以是一个有效的工具进行手术技能评估。
对整合的必要关注
随着手术室的注意力转向机器人辅助手术系统,对来自这些*台的数据进行操作的需求将成为焦点。技能预测代表了卫生工作者培训的一个令人兴奋的新方向,但就其本身而言,如果不对医院工作人员进行大量投资,以加深他们对(1) 机器学习可以做什么和(2) 一旦做出预测,应该采取什么行动的知识,则不会产生影响。了解技能水*后,我们如何帮助外科医生达到或超过基准分数?对于患者来说,我们如何确保在新的数字能力下坚持最高的安全和质量标准?
下一个外科手术时代将需要卓越的数据科学和发展,但也需要变革管理和实施。
与这篇文章相关的源代码/笔记本可以在https://github.com/teamlu/roboticsurgery找到。
谷歌搜索如何可能永远存在
原文:https://towardsdatascience.com/how-google-search-might-exist-forever-5510dbb5e3fa?source=collection_archive---------75-----------------------
软件哲学
我们今天构建的软件正在为数百年的相关性而奋斗。

Eclipse 的软件进化故事情节。2010 年迈克尔小川奈那。
自 1997 年 9 月 15 日开放以来,oogle Search 一直是领先的网络搜索引擎。JavaScript 是一种 web 编程语言,由 Brendan Eich 于 1995 年发明。大多数网站的设计,包括谷歌搜索,都是基于 JavaScript 语言的。此外,47 年前创建于 1972 年的 C 编程语言影响了 JavaScript。C 的最新版本是版本 18(2018),该语言仍然广泛用于嵌入式编程以及整个 Windows、Linux 和 macOS 操作系统。甚至 iPhones 和 Androids 都运行在一些 C 代码上。我们将使用我们今天编写的软件几个世纪。
很难想象像谷歌搜索这样的产品会永远存在。但是可口可乐呢?它已经存在了大约 200 年了。它做得很好,甚至比以前更好。一个神奇的产品应该持续数百年,很难说谷歌搜索的发明没有让任何人感到惊讶。谷歌搜索是如此广泛和普遍,甚至牛津词典在 2006 年将“谷歌”作为及物动词加入。那么谷歌搜索怎么才能消失呢?
所有的软件都在竞争它们的使用。当软件被使用时,由于获得了像金钱、反馈和开发这样的资源,它更容易竞争使用。一个新的软件必须在另一个软件的设计中找到仅仅是基本的缺陷,才能做出一个伟大的“解决方案”或得到支持的正当理由。人们不能仅仅因为一个全新的软件拥有另一个软件没有的特性,就指望它能击败竞争对手。
游戏引擎市场由来已久,竞争非常激烈。各种图形游戏引擎已经存在了几十年,但是从来没有一个好的选项是免费的。我们有虚幻引擎,曾经需要付费,现在收取 5%的版税。Unity 是另一个从 2005 年就存在的。它的特点是基于每月订阅的计划。您必须联系其支持团队来协商源代码访问,因为它受到保密协议的保护。
其他较小的游戏引擎争夺市场空间,主要是在 2D,因为它需要大量的研究和开发才能在 3D 空间竞争。除了 CryEngine,它的用户基数很小,但却是所有引擎中最好的 3D 渲染引擎之一,因为它在发布虚幻引擎 4 时失去了大部分用户。然后,它将其引擎订阅计划从每月一次改为类似的基于 5%版税的收入费用。其他引擎如 GameMaker Studio 2 和 Construct 3 都是面向 2D 的,因为独立开发者和爱好者是他们争夺的目标受众。
软件通常是根据一种理念设计的。一些理念可能包括:简单、功能性、健壮性、具有尖端特性。虚幻引擎和 CryEngine 一直都是关于高级特性的,而 Unity 更关注实体-组件-系统工作流的健壮性。尽管软件是围绕他们的第一个理念设计的,但这并不能阻止他们在开发过程中改变路线来获得或保持他们的市场份额。Blender 朝着面向键盘的用户体验的方向发展,但是一年前,Blender 2.82 的发布有了全新的用户界面和更好的面向鼠标的工作流程。Blender 带来了其他面向鼠标的编辑器的客户,如 Maya、3DS Max 和 Cinema 4D。使用搅拌机的最大好处是什么?
这是免费的。
免费是我们需要讨论的主要话题。越来越多的软件被免费提供。我知道自由开放源码软件社区不相信所有的艺术作品都值得免费复制,或者我们需要放弃我们的版权。他们认为用来谋生的工具应该是免费的。更不用说,许多爱好者会免费提供其他类型的工具和游戏。
自由/开源软件项目 Godot Engine 是市场上相对较新的游戏引擎。它的主要卖点是完全免费,而且完全靠捐赠赚钱。自 2014 年出现以来,该引擎一直在努力增加用户渴望的功能,比如极具竞争力的 3D 图形。
等等,什么?
对,没错。社区大部分都处理好了。对引擎的捐赠(截至本文撰写之日,每月 12,100 美元)支付给一些项目所有者,让他们全职从事引擎的研究和开发工作。这意味着,自由软件具有自由和社区运行的所有好处,可以在一个高度稳定的专业发展的市场中竞争,就像 unity 和虚幻引擎一样。尽管 Godot 在功能和用户方面比这两个项目略小,但我并不怀疑它会达到那个地步。
只要谷歌搜索被使用并且有利可图,它就会一直存在。这并不是说它也将永远是最常用的搜索引擎。谷歌不尊重隐私,所以可能会有一点空间来挤压 searc- oh 等待。

没关系。
GPU 如何加速深度学习
原文:https://towardsdatascience.com/how-gpus-accelerate-deep-learning-3d9dec44667a?source=collection_archive---------15-----------------------

在 Unsplash 上由娜娜杜瓦拍摄的照片
神经网络令人尴尬的并行性
神经网络和深度学习并不是最*才出现的方法。事实上,他们已经很老了。感知机是第一个神经网络,由弗兰克·罗森布拉特于 1958 年创建。甚至无处不在的深度学习架构的构建模块的发明也大多发生在 20 世纪末。例如,Yann LeCun 等人在 1989 年的里程碑式论文中将卷积网络引入应用于手写邮政编码识别中。
为什么深度学习革命要等几十年?
一个主要原因是计算成本。即使是最小的架构也可能有数十层和数百万个参数,因此在期间重复计算梯度的计算成本非常高。在足够大的数据集上,训练通常需要几天甚至几周的时间。现在,你可以在几个小时之内在你的笔记本上训练出一个最先进的模型。
有三大进步将深度学习从一种研究工具带到了我们生活的几乎所有领域。这些是反向传播、随机梯度下降和 GPU 计算。在这篇文章中,我们将深入后者,并看到神经网络实际上是令人尴尬的并行算法,可以用来将计算成本提高几个数量级。
一大堆线性代数
深度神经网络乍一看似乎很复杂。然而,如果我们放大它们,我们可以看到它的组件在大多数情况下都非常简单。正如总是才华横溢的 xkcd 所说,网络(主要)是一堆线性代数。

来源: xkcd
在训练过程中,最常用的函数是矩阵乘法和加法等基本的线性代数运算。情况很简单:如果你调用一个函数无数次,从函数调用中减去一点点时间可能会增加很多。
使用 GPU-s 不仅提供了一个小的改进,他们增压整个过程。为了了解这是如何做到的,让我们以激活为例。
假设φ是一个激活函数比如 ReLU 或者 Sigmoid。应用于前一层的输出

结果是

(这同样适用于图像等多维输入。)
这需要循环遍历向量并计算每个元素的值。有两种方法可以加快计算速度。首先,我们可以更快地计算每个【φ(xᵢ】。其次,我们可以在并行中同时计算出 φ(x ₁ )、φ(x ₂ )、…、φ(x ₙ ) 的值。事实上,这是令人尴尬的并行,这意味着计算可以并行化,而无需任何显著的额外工作。
这些年来,更快地做事变得困难多了。过去,处理器的时钟速度几乎每年都要翻一番,但最*趋于*稳。现代处理器设计已经达到了这样一个程度,在单元中装入更多的晶体管会产生量子力学障碍。
然而,并行计算这些值并不需要更快的处理器,只需要更多的处理器。正如我们将要看到的,这就是 GPU 的工作方式。
GPU 计算的原理
图形处理单元,简称 GPU,是为了创建和处理图像而开发的。由于每个像素的值都可以独立于其他像素进行计算,因此拥有许多较弱的处理器比一个非常强的处理器依次进行计算要好。
这与我们对深度学习模型的情况相同。大多数操作可以很容易地分解成可以独立完成的部分。

英伟达费米架构。对此已经有了很多改进,但它很好地说明了这一点。来源: NVIDIA Fermi 架构白皮书
打个比方,让我们考虑一家餐馆,它必须大规模生产炸薯条。要做到这一点,工人们必须将土豆削皮、切片并油炸。雇人削土豆的成本比购买更多的厨房机器人来完成这项任务要高得多。即使机器人速度较慢,你也可以从预算中购买更多,所以总体来说这个过程会更快。
并行模式
当谈到并行编程时,人们可以将计算架构分为四个不同的类别。这是迈克尔·j·弗林在 1966 年提出的,一直沿用至今。
- SsingleI建造,SsingleDATA(SISD)
- 单个 I 构造, M 多个 D ata (SIMD)
- 多条指令,单个数据(MISD)
- M 多个 I 个指令, M 个多个 D 个 ata (MIMD)
多核处理器是 MIMD,而 GPU 是 SIMD。深度学习是一个 SIMD 非常适合解决的问题。当您计算激活时,需要执行完全相同的操作,每个调用使用不同的数据。
延迟与吞吐量
为了更详细地描述 GPU 优于 CPU 的地方,我们需要了解一下延迟和吞吐量。延迟是完成单个任务所需的时间,而吞吐量是单位时间内完成的任务数。
简而言之,GPU 可以提供更好的吞吐量,但代价是延迟。对于令人尴尬的并行任务,如矩阵计算,这可以提供一个数量级的性能改善。但是,它不太适合复杂的任务,比如运行操作系统。
另一方面,CPU 针对延迟进行了优化,而不是吞吐量。它们能做的远不止浮点计算。
通用 GPU 编程
实际上,通用 GPU 编程在很长一段时间内都是不可用的。GPU 只能处理图形,如果你想利用它们的处理能力,你需要学习图形编程语言,比如 OpenGL。这不太实际,而且进入门槛很高。
这种情况一直持续到 2007 年,当时 NVIDIA 推出了 CUDA 框架,这是 C 的一个扩展,为 GPU 计算提供了一个 API。这极大地缩短了用户的学习曲线。快进几年:现代深度学习框架在我们没有明确知道的情况下使用 GPU。
用于深度学习的 GPU 计算
所以,我们已经讨论了 GPU 计算如何用于深度学习,但是我们还没有看到效果。下表显示了 2017 年制定的基准。虽然它是三年前制造的,但它仍然证明了速度的数量级提高。

各种深度学习框架的 CPU vs GPU 基准测试。(基准是从 2017 年开始的,所以它考虑了从那个时候开始的技术状态。然而,观点仍然成立:GPU 在深度学习方面优于 CPU。)来源:基准测试最先进的深度学习软件工具
现代深度学习框架如何使用 GPU
直接用 CUDA 编程,自己写内核,并不是最容易的事情。值得庆幸的是,TensorFlow 和 PyTorch 等现代深度学习框架并不要求你这么做。在幕后,计算密集型部分是使用 NVIDIA 的深度学习库 cuDNN 在 CUDA 中编写的。这些都是从 Python 调用的,根本不需要直接使用。Python 在这方面真的很强:可以很容易的和 C 结合,既强大又好用。
这类似于 NumPy 在幕后的工作方式:它非常快,因为它的函数是直接用 c 编写的。
[## NumPy 真的比 Python 快吗?
是的,但前提是你知道如何使用它。
towardsdatascience.com](/is-numpy-really-faster-than-python-aaa9f8afb5d7)
需要搭建深度学习钻机吗?
如果你想自己训练深度学习模型,你有几个选择。首先,您可以为自己构建一台 GPU 机器,然而,这可能是一项重大投资。幸运的是,你不需要这样做:亚马逊和谷歌等云提供商提供远程 GPU 实例来工作。如果你想免费访问资源,请查看谷歌实验室,它提供免费访问 GPU 实例。
结论
深度学习在计算上非常密集。几十年来,训练神经网络受到硬件的限制。即使相对较小的模型也需要训练数天,而在巨大的数据集上训练大型架构是不可能的。
但是随着通用计算 GPU 编程的出现,深度学习爆发了。GPU 擅长并行编程,由于这些算法可以非常高效地并行化,因此可以将训练和推理的速度加快几个数量级。
这为快速增长开辟了道路。现在,即使相对便宜的商用计算机也能训练出最先进的模型。结合 TensorFlow 和 PyTorch 等令人惊叹的开源工具,人们每天都在构建令人敬畏的东西。这真是出外勤的大好时机。
如果你喜欢把机器学习概念拆开,理解是什么让它们运转,我们有很多共同点。看看我的博客,我经常在那里发表这样的技术文章!
女朋友有多幸福?
原文:https://towardsdatascience.com/how-happy-is-my-girlfriend-be895381d7c2?source=collection_archive---------35-----------------------
让我们用自然语言处理来找出答案…

图片—作者。很抱歉噩梦般的燃料。
在我之前的博客中,我调查了我和我的伴侣之间的消息量在过去五年中是如何变化的。我们能够得出一些有趣的数字分析(我们通常在一天中的什么时候交换信息,这是如何受到生活在一起的影响的,等等。)
[## 一段感情 5 年后的信息是什么样的
或者,用 Python 处理时间序列数据(和表情符号)的一些很酷的方法
towardsdatascience.com](/what-5-years-of-a-relationships-messages-look-like-45921155e3f2)
给定一个文本数据的宝库,或“语料库,我们可以做的不仅仅是简单地查看信息的数量——现代数据科学方法允许我们分析它们的质量。这些技术的复杂程度各不相同;我们可以探索哪些词在语料库中最常见,但我们也可以开始理解一个句子的潜在情感。
然而,在我们做这些之前,有一些基础工作要做——文本数据和其他数据一样需要清理和准备。令人高兴的是,Python 库 NLTK(自然语言工具包)内置了许多关键函数和方法。
- 删除停用词和标点:停用词是“填充符”,否则会使文本分析变得混乱(例如,“I”、“and”、“had”等)。)NLTK 附带了多种语言的预定义停用词列表。我们还想去掉标点符号,因为默认情况下,Python 不知道“Hello!”和“你好?”—如果我们试图记录独特的单词,这是没有用的(出于类似的原因,我们希望将所有单词都用小写字母表示)。
- 对语料库进行标记化:这是获取一个字符串,并将其转换为单个单词列表的过程。使用 NLTK 这样做可以让我们访问一组内置的方法,例如,词频计数。
- 对记号进行词条归类:这是一个更加语言学上微妙的过程,但最终涉及到将每个单词转换成它们各自的“词条”。通俗地说,这一般就是把复数名词变成单数形式(“mice”变成“mouse”),动词变成不定式(“running”、“ran”变成“run”)。这将有助于消除噪音,使我们更容易提取“情绪”。注意——NLTK 的 lemmatizer 本质上是一个大的预填充数据库,它考虑了英语的许多边缘情况。
所有这些组合成的代码如下所示:
**from** nltk **import** word_tokenize
**from** nltk.corpus **import** stopwords
**from** nltk.stem.wordnet **import** WordNetLemmatizer
**import** string***#Get all the stop words in the English language***
stopwords_list = stopwords.words('english')***#Add punctuation to this list***
stopwords_list += list(string.punctuation)***#Create tokens from the corpus and strip out stop words***
tokens = word_tokenize(corpus)
tokens_stopped = [w.lower() for w in tokens if w not in stopwords_list]***#Create and use a lemmatizer object***
lemmatizer = WordNetLemmatizer()
tokens_lem = lemmatizer(tokens_stopped)
注意——我做了两次这个记号化/符号化过程,一次是针对我的消息,一次是针对我伙伴的消息。
计数单词
首先(也是最明显的)要做的事情是查看我们的消息语料库中最常见的单词。我们可以通过 NLTK 轻松做到这一点:
**from** nltk **import** FreqDist***#Count the frequency of unique words***
FreqDist(tokens_lem).most_common()***#This returns a list of tuples
#The first element of each tuple is the word
#The second is the frequency******#Thus, we can get a list of the most common words:*** common_words = [i[0] for i in FreqDist(tokens_lem).most_common(20)]

事实上,这并没有揭示什么特别有趣的事情(除了我是一个“耶”型的男生,而她是一个“好”型的女生)。在我之前的博客中,我注意到我的伴侣比我更热衷于使用表情符号。理论上,我们可以使用表情符号开始分析我们信息的情感内容。然而,这一系列的调查因为这样一个事实而有些泡汤了,那就是我显然更少地使用表情符号来表达我的感情,而是简单地表示“是”。

粉色区域的表情符号是我的伴侣用得比我多的表情符号。蓝色区域没有表情符号。
当分析语料库中事物的频率时,思考短语可能更有见地。让我们来看看哪个相邻的单词配对(或者用术语来说就是“双字母”)对我们每个人来说最常见。同样,这可以使用内置的 NLTK 方法来解决:
**import** nltk
**from** nltk.collocations **import** ****#Create an object to find bigrams in a given corpus***
bigram_finder = BigramCollocationFinder.from_words(tokens_lem)***#Create an object to measure bigrams*** bigram_measures = nltk.collocations.BigramAssocMeasures()***#Combine these to find the frequency of each bigram***
bi_scored = bigram_finder.score_ngrams(bigram_measures.raw_freq)***#Again, this produces a list of tuples
#where the first element is the bigram and
#the second is the share of all bigrams it represents***

“jóJT”在我搭档的母语匈牙利语中是“晚安”的意思
这开始揭示更多的东西。“哦上帝”比“哦”传达了更多的含义。然而,许多这些二元模型仍然是通用的——我们显然有常用短语(在两种语言中,不少!)是我们睡觉前自动翻到的,我女朋友的前两个单词中有四分之三是由“Okay”这个词组成的。
这让我们想到了逐点互信息 (PMI)的概念。这是一种观察语料库中两个词的相互依赖性的方法。例如,像“Okay”和“Good”这样的词可能会有较低的 PMI 分数,它们可能会作为二元模型出现几次,但这两个词会与其他词一起在二元模型中出现多次。然而,像“波多黎各”和“波多黎各”这样的词会有很高的分数,因为它们很少彼此独立出现。
我们可以使用 NLTK 计算 PMI 分数:
***#Create a bigram finder object that filters out
#bigrams that appear fewer than 15 times***
bigram_finder.apply_freq_filter(15)***#Create PMI scores using the existing
#bigram measures object***
pmi_score = bi_finder_c.score_ngrams(bigram_measures.pmi)
一般来说,了解哪些单词具有很强的相互依赖性可以让数据科学家更好地理解单词的潜在含义(语言学家团队通过使用由数千个维基百科页面组成的语料库来实现这一点)。然而,在我们的例子中,它允许我们挑选出一些更有趣的“常用”短语。

似乎我的信息主要是关于购买晚餐(“炒菜”、“红薯”、“即食餐”)和工作(“南非”、“基地报告”、“关键发现”、“神圣的狗屎?”).她的更多是去一些地方(“莱斯特广场”、“国王十字车站”、“金丝雀码头”、“护照检查”),告诉我把钱放进我们的联合账户。
情感分析
当然,虽然这让我们对我们的信息内容有了一些了解,但它不会自动给我们一种情绪的感觉。显然,我谈了很多关于南非人的事情,但这并没有告诉我们我对这个问题中的南非人的想法或感受。
为了进行这种“情绪”分析,我们可以使用一个非常聪明的叫做 VADER 的软件包。根据 GitHub 页面:
VADER (Valence Aware 字典和情感推理器)是一个基于词典和规则的情感分析工具,专门针对社交媒体中表达的情感,对其他领域的文本也很有效。
听起来很符合我们的需求。VADER 可以通过标准的 pip 安装下载,之后,它可以用来从我们的文本数据中推断情感。VADER 的实现非常简单。要分析给定字符串的情感,我们只需执行以下操作:
**from** vaderSentiment.vaderSentiment **import** SentimentIntensityAnalyzer**#Instantiate a sentiment analysis object**
analyzer = SentimentIntensityAnalyzer()**#Pass a sentence, e.g. my_string, through it**
sentiment = analyzer.polarity_scores(my_string)
这将为给定的字符串返回一个包含四种内容的字典:
- 【pos】:有正面情绪的词占多少比例
- 【负面】:有负面情绪的词占多少比例
- 【neu】:有中性情绪的词占多少比例
- ‘compound’:字符串中每个单词的价分值的加权组合,在-1(非常负)和 1(非常正)之间标准化。本质上,它是对一个给定句子的情绪的一个单一的测量。
VADER 的非凡之处在于它能够根据上下文来推断单词的意思。例如:
**IN:** "The book was good."
**OUT:** *{'pos': 0.492, 'neu': 0.508, 'neg': 0.0, 'compound': 0.4404,}***IN:** "The plot was good, but the characters are uncompelling and the dialog is not great."
**OUT:** *{'pos': 0.094, 'neu': 0.579, 'neg': 0.327, 'compound': -0.7042,}*
它知道,当“伟大”放在“不”这个词之后,它的意思就变得非常不同了。它还可以解释标点符号(例如,许多感叹号)、表情符号和俚语的使用。
为了便于我们的分析,我根据发件人将邮件分开,然后按天分组。换句话说,对于给定的一天,我已经将我的所有消息连接到一个单独的段落中,并将我的伙伴的所有消息连接到一个单独的段落中。然后,这些段落通过 SentimentIntensityAnalyzer 对象进行传递。
让我们首先关注一天中有积极或消极情绪的单词的份额。在下面的散点图中,每个点代表我或我的伴侣一天发送的信息,它的位置由当天积极的和消极的信息所占的份额决定。注意——这没有考虑到中性词,这就是为什么这些点不是沿着一条线排列的。

线上的点代表负面词汇比正面词汇多的日子。图表左下角的点代表使用非常中性语言的日子。
我们注意到粉红色的集群(我的伴侣的信息)更靠右,表明她的语言更积极。然而,我们可以看到,同一个集群的*均水*也略高,这表明她的语言同时更消极。相反,我的语言倾向于情感中立,集中在散点图的左下方。令人鼓舞的是,我们可以看到许多点聚集在 x 轴上——没有负面词汇被分享的日子。
我们还可以看到,随着时间的推移,我们的语言变得不那么“积极”。这可能是因为我们面对面说得更多,这意味着信息更具功能性(“你能在回家的路上买红薯吗?”)从而在情感上更加中立。
如果我们将相同的数据绘制成一个时间序列,这是显而易见的,其中红色轴线上方的高度代表给定一天中积极词汇的份额,下方的负高度代表消极词汇的份额。

不出所料,搬到一起后,我们的语言变得不那么明显积极(相反,话是面对面说的)。五年来,我们语言的负面性一直保持相对一致,尽管值得注意的是,我的语言比她的语言更积极的唯一时期是在我辞职之后……相关性,而不是因果关系,肯定吗?
当然,VADER 软件包提供的最先进的指标是“复合”指标,它将总体情绪评级归结为一个完整的字符串。我们可以把它绘制成一个时间序列。

正如我用这些数据绘制的以前的时间序列一样,我们看到了很多波动,即使使用滚动*均也是如此。然而,有一些非常具体的个人事件/时间段,我和我的伴侣可以用来解释我们在这里看到的一些更明显的起伏——例如,她在 2017 年第三季度和 2019 年第四季度的下降,以及我在 2019 年第三季度获得一只小猫后对生活的看法的改善……
这一切都表明了对文本数据的分析是多么强大,我们的个性和情感有多少可以从我们每天产生的大量数字文本数据中推断出来。
感谢一路阅读到博客结尾!我很乐意听到任何关于上述分析的评论,或者这篇文章涉及的任何概念。欢迎在下方留言,或者通过 LinkedIn 联系我。
克什米尔对新型冠状病毒有什么反应?数据科学视角。
原文:https://towardsdatascience.com/how-has-kashmir-reacted-to-the-novel-coronavirus-e1b165f30c5a?source=collection_archive---------47-----------------------

图片来源: kashmirthroughmylens 通过 Instagram
一份分析迄今为止克什米尔山谷新冠肺炎疫情趋势的简短报告。
新冠肺炎的爆发已经对全球普通民众和医护人员构成威胁。由于对新型冠状病毒的了解仍然有限,因此必须了解每个地区的疫情趋势,开拓和拓宽研究空间。这项研究试图通过分析克什米尔的新冠肺炎疫情数据来补充这一探索,并更好地了解克什米尔在全球的地位。
数据集详情:
- 全球新冠肺炎数据:约翰霍普金斯大学医学院。
- 查谟和克什米尔的新冠肺炎数据:查谟和克什米尔政府信息和公共关系部通过其 twitter @diprjk 提供的官方数据。
- 世界人口数据:世界银行
- 全球测试数据:我们的数据世界
数据集限制和警告:
我们评估数据准确性和可靠性的能力有限,这给新冠肺炎数据分析和建模带来了不可量化的不确定性。与所有监测数据一样,由于报告偏差和查明偏差,存在局限性。此外,缺乏机会和诊断质量也可能影响数据。因此,对不同地区进行一对一的数据分析可能不是苹果与苹果之间的比较。
尽管如此,在可靠数据有限的情况下对不同区域进行探索性数据分析,仍有助于正确看待形势,也有助于回答一些关键问题。
克什米尔的新冠肺炎案例
克什米尔和世界其他地方一样,受到新冠肺炎疫情的影响,处于封锁状态。2020 年 3 月 18 日,克什米尔报告了首例新冠肺炎阳性病例。2020 年 3 月 19 日,克什米尔许多地区实行了封锁。
根据政府的最新信息。截至 2020 年 5 月 12 日,克什米尔山谷有 844 例确诊病例,400 例痊愈,9 例死亡。

数据来源:查谟&克什米尔政府信息和公共关系部,使用 covidkashmir.org 的 API 下载。截至 2020 年 5 月 12 日的最新数据
拉*曲线
每天病例数量的急剧增加证明了这一流行病的迅速蔓延。通过减缓传播来减少疫情传播的努力,导致病例数上升速度减缓,进入*台期,最终导致每日报告的病例数下降。
如果太多人同时寻求医疗保健,卫生系统的能力可能会不堪重负。因此,重要的是要认识到,我们每个人都有责任让曲线变*。
美国、义大利、西班牙等许多国家都经历过世界上最严重的新冠肺炎疫情。
韩国是一个突出的例子。作为中国以外世界上最大的初始疫情发生国之一,中国成功地控制了疫情的传播,导致每日报告的病例数下降。
将意大利与韩国进行比较,可以看出差异有多么巨大。2020 年 3 月 1 日,意大利只有 1694 例,而韩国有 3736 例。三周后,也就是 3 月 22 日,意大利的病例数激增至 59138 例,而韩国的病例数仅翻了一番,达到 8961 例(来源:约翰霍普金斯大学新冠肺炎医学数据库)。
韩国成功的关键是早期和积极使用大规模检测以及用于接触者追踪和病例隔离以及接触者隔离的新型数字技术。
鉴于全球各地的这些经验,探索克什米尔在新冠肺炎疫情中的地位是值得的。
下图比较了克什米尔和新冠肺炎阳性病例领先的一些国家。由于每个地区在疫情中面临不同的分布,下图仅帮助我们从更广泛的角度看待情况,并不提供关于一个地区比其他地区风险更高的任何信息。

数据来源:全球新冠肺炎数据— 约翰霍普金斯大学新冠肺炎医学数据仓库 ,克什米尔新冠肺炎数据—查谟政府信息与公共关系部&克什米尔(使用 covidkashmir.org 的 API 下载);截至 2020 年 5 月 12 日的最新数据
关于地块的技术细节:
- x 轴:每个国家每百万人口中出现 5 例阳性病例后的天数。
- y 轴(对数刻度):每百万人口中新冠肺炎阳性病例数。
此图表使用每日新新冠肺炎病例来显示不同地区的疫情趋势。对于每个地区,数据点从每百万人中新冠肺炎阳性病例总数超过 5 的那一天开始,一直到可用的最新数据。例如,对于克什米尔,数据从 2020 年 3 月 30 日(首次记录的每百万新冠肺炎阳性病例数> 5 的日期)开始,到 2020 年 5 月 12 日(本文撰写之日)结束。
关键要点:
- 每百万人中的阳性病例仍在上升。最初的趋势不像许多其他地区那样陡峭(或者也可能是没有进行足够的测试,或者测试没有击中正确的目标人群——在后面的部分中有更多这方面的内容)。
- 即使最初每百万阳性病例数没有急剧的趋势,但这一数字已经增加了* 1.4 倍(从 2020 年 5 月 2 日的每百万 87.97 例增加到 2020 年 5 月 12 日的每百万 122.52 例)。并且自 2020 年 4 月 24 日以来翻了*一番(2020 年 4 月 24 日每百万 57.63 例,至 2020 年 5 月 12 日每百万 122.52 例)。
- 当每天发现的新病例数量开始持续下降时,克什米尔的曲线将变得“*坦”。目前,每天发现的新病例数在 15-45 之间浮动。

数据来源:查谟&克什米尔政府信息和公共关系部,使用 covidkashmir.org 的 API 下载。截至 2020 年 5 月 12 日的最新数据
然而,任何地区的病例数增加并不一定意味着风险增加。更有可能的是,这意味着测试更容易获得,或者报告更完整。相反,关键是降低感染率(Ro ),导致*台期,并最终减少每日报告的病例数。
测试
注:没有克什米尔山谷单独的测试数据。因此,在本节中,报告的数字是查谟&克什米尔的总和,除非另有说明。
在 2020 年 3 月 16 日举行的关于新冠肺炎的媒体吹风会上,世卫组织总干事在开幕致辞中说,随着社交距离的迅速升级,检测、隔离和接触者追踪是新冠肺炎应对的支柱。
不检测和不知道谁被感染会让感染不被发现地传播,以后会给卫生保健系统带来灾难。
不同地区的可用测试数据是否具有可比性?
如前所述,数据的不一致性和不可靠性可能无法让我们准确了解疫情传播或检测情况。本节的分析只是为了更好地理解查谟和克什米尔以及世界其他地区的检测数字。这种分析也可以让我们了解 J&K 是否在测试中采取了适当的措施,以及是否有立即增加测试的需要。
以韩国、新西兰和冰岛为例,这些地区已经成功地使曲线变*,这项分析试图将人们的注意力吸引到一个有趣的相关性上——就目前检测到的阳性病例和检测数量而言,强生公司与这些地区相比如何?

数据来源:全球新冠肺炎数据— 约翰霍普金斯大学新冠肺炎医学数据仓库 ,克什米尔新冠肺炎数据—查谟政府信息与公共关系部&克什米尔(使用 covidkashmir.org 的 API 下载);截至 2020 年 5 月 12 日的最新数据
从这个图表中
- 看起来每天在 J&K 的新新冠肺炎病例仍在上升。
- 任何一天每百万人的新冠肺炎病例总数都低于其他地区,这是好事。但是这仅仅是迄今为止测试和报道的案例。
- 南韩和纽西兰能够在疫情相对较早地展*曲线。截至 2020 年 5 月 12 日,J&K 的每百万新冠肺炎病例数为 82.90 例,趋势是否会朝着更*坦的轨迹发展,或者病例数是否会保持上升趋势,还有待观察。
上面的图没有揭示的重要一点是正在进行的测试的数量。尤其是那些处于疾病爆发早期的患者(因为传播是指数级的,一旦失去了大规模检测和隔离的初始窗口,疾病爆发的数量就会迅速增加)。
让我们看看南韩、纽西兰和冰岛在疫情早期进行了多少次检测(每百万人检测到的新冠肺炎阳性病例大约不到 50)。

数据来源:全球新冠肺炎数据— 约翰霍普金斯大学新冠肺炎医学数据仓库 ,克什米尔新冠肺炎数据—查谟政府信息与公共关系部&克什米尔(使用 covidkashmir.org 的 API 下载),世界人口数据— 世界银行 ,全球检测数据— 我们的世界在数据截至 2020 年 5 月 12 日的最新数据
对于每百万不到 50 例阳性新冠肺炎病例,韩国和新西兰的检测结果分别是强生的 2 倍和 4 倍。因此,可能是 J&K 错过了增加检测的早期窗口,导致未检测和未报告的病例数量增加。然而,该地区最*做了值得称赞的工作,将检测能力提高到每天* 3000 次。
但是在一个地区进行更多的检测不一定会降低风险或降低感染率。更重要的是,测试准确击中正确的人群(那些实际患有疾病的人群)的精确度。
例如,韩国的测试基于监控应用和先进技术。因此,即使人均检测次数相当或更少,韩国也能更准确地识别患病人群。
新西兰和冰岛继续每天将检测能力提高数倍,这有助于遏制新型冠状病毒在这些地区的传播。

数据来源:全球新冠肺炎数据— 约翰霍普金斯大学新冠肺炎医学数据仓库 ,克什米尔新冠肺炎数据—查谟政府信息与公共关系部&克什米尔(使用 covidkashmir.org 的 API 下载),世界人口数据— 世界银行 ,全球检测数据— 我们的世界在数据截至 2020 年 5 月 12 日的最新数据
虽然千分之几的检测是控制特定地区病毒传播的一个重要指标,但仍不足以了解全貌。
真实阳性率
根据政府的最新数据。J & K 共采集样本 53726 份,其中 J & K 阴性 52792 份,阳性 934 份。
真阳性率=总阳性/总检测数* 100 = 1.74%。
换句话说,截至 2020 年 5 月 12 日,在 J&K 接受新型冠状病毒测试的 57 人中有* 1 人被发现患有这种病毒。

数据来源:查谟&克什米尔政府信息和公共关系部,使用 covidkashmir.org 的 API 下载。截至 2020 年 5 月 12 日的最新数据
随着在 J&K 的测试增加,真实阳性率(TPR)一直在下降。2020 年 5 月 12 日 1.74%的真实阳性率相当低,表明:
-低水*的新冠肺炎疫情
-测试了错误的人
-测试质量不佳(或取样技术)
然而,真实的阳性率并不等同于任何地区新冠肺炎阳性病例的比例。实际病例数通过一个叫做患病率的指标来追踪。
流行的重要性
CDC 将患病率(有时称为患病率)定义为在特定时间点或特定时间段内,人群中患有特定疾病或属性的人数比例。
由于各种因素,如有限的检测、无症状病例、缺乏认识或甚至因社会耻辱而拒绝寻求医疗帮助,都可能导致未记录和未发现的病例。这些遗漏和未记录的病例造成了患病率和真阳性之间的差异。
未记录但具有传染性的病例比例是一个关键的流行病学特征,它调节了突发呼吸道病毒的疫情潜能[2–5]。这些未记录在案的感染取决于其传染性和数量,与其他情况相比,可能会使更多的人暴露于该病毒。
像其他传染病一样,新冠肺炎的真实流行率仍然未知。哥伦比亚大学的公共卫生科学家研究了旅行数据和 Wuhan⁶.新型冠状病毒潜伏期和感染率的最新信息他们开发了一个数学模型来模拟该市早期的疫情爆发,并估计在 2020 年 1 月 23 日旅行限制之前,所有感染中有 86%是无记录的,这些无记录的感染是 79%有记录病例的传染源。这些关键发现可能会在具有不同控制、监测和报告实践的其他国家发生变化。然而,它们为增加大规模检测和准确报告提供了强有力的证据,以便能够确定新冠肺炎阳性病例的实际数量。
已知的挑战,如缺乏基础设施、缺乏对疾病的准备、经济因素或政治担忧,可能会导致扩大广泛检测的滞后。之前,对于其他传染病,如丙型肝炎的数学模型也进行了研究,以*似估计 disease⁷.的全面流行新冠肺炎也在研究类似的科学进展。
虽然截至 2020 年 5 月 12 日,J&K 报告的病例为 934 例,但像其他地方一样,同一时间范围内的真实流行率仍然未知。理想情况下,如果有一种方法可以估计疾病的流行程度,测试能力可以提高到这一水*(换句话说,如果病毒传播的趋势呈指数增长,那么理想情况下测试也应该呈指数增长,以检测所有受感染的病例)。如果通过使用接触追踪和其他手段对正确的目标人群进行检测,那么这种增加的检测可以导致最大流行病例的检测。这也许是韩国能够控制病毒的原因。
由于检测无法跟上病毒的传播,许多阳性病例仍未被发现,并继续成为活跃的携带者。越来越多的人从这些未被发现的活跃病例中被感染,结果,流行人群本身不断增加。
截至 2020 年 5 月 12 日,J&K 已经对每千名人口进行了 4.77 次测试,真实阳性率为 1.74%。如果接受检测的人群很好地代表了流行情况,并且如果这些假设和趋势在未来的检测中继续成立,那么该地区将能够迅速遏制病毒的传播。但是如果被检测的人群中缺少活跃的携带者,那么每天的新增病例将会持续上升。
总的来说,在给定时间内,大量的指标,如总检出病例数、每百万总检出病例数、总检测数、每百万总检测数或检测阳性率,不一定表明该地区处于高/低风险状态,也不一定表明对病毒的反应良好/不良。更确切地说,在给定时间,在给定区域,针对相应于相同时间的流行的测试池是对病毒良好反应的更好指标。
结论
新冠肺炎的爆发对全球普通民众和医护人员构成威胁。然而,关于这种新型病毒的知识仍然有限,但目前世界范围内的科学有了很大的进步。
截至 2020 年 5 月 12 日,J&K 每百万人口中有 82.90 例新冠肺炎阳性病例,而克什米尔山谷每百万人口中有 122.52 例新冠肺炎阳性病例。
检测能力每天都在增加,而真正的阳性率却在持续下降。但报告的新阳性病例总数尚未出现下降趋势,这对于使曲线变*很重要。
对于截至 2020 年 5 月 12 日报告和测试的人口,看起来克什米尔在遏制新型冠状病毒的传播方面做得不错。但每一天都是一场新的战斗,曲线随时可能飙升。因此,增加的测试、即将到来的持续社交距离的努力以及封锁将决定未来几周的形势,以将范式转变为可持续的曲线*坦化,新/活跃案例的数量将合理下降。
致谢
我要向美国疾病预防控制中心病毒性肝炎司全球卫生副主任 Francisco Averhoff 博士表示最深切的感谢,感谢他审阅并提供专业知识和见解,极大地改进了手稿。
我要感谢疾病预防控制中心病毒性肝炎实验室分部主任 Saleem Kamili 博士和克什米尔美国卫生保健医学教育学会&研究 (KASHMER)对这个项目的支持以及帮助建立与疾病预防控制中心专家的联系。
我还要感谢位于斯利那加 Soura 的 Sheri 克什米尔医学科学研究所(SKIMS)内科和肺部医学系主任 Parvaiz Koul 教授提供了有关克什米尔新冠肺炎疫情的专业知识。
感谢约翰·霍普金斯大学医学院提供了新冠肺炎的数据。感谢 covidkashmir.org 提供 API 从政府下载新冠肺炎的数据。J & K 的官方推特账号@ diprjk 。
参考文献
1.新冠肺炎国家应急中心,流行病学和病例管理小组,韩国疾病控制和预防中心新冠肺炎在韩国的接触传播:追踪接触者的新调查技术。公共卫生研究展望。 2020 年;11: 60–63
2.陈,袁 S,Kok KH,等。与 2019 年新型冠状病毒相关的家族性肺炎聚集性表明人与人之间的传播:一项家庭聚集性研究。柳叶刀。2020;s 0140–6736(20)30154–9。
3.2020 年 1 月 22 日中国武汉地区新型冠状病毒感染流行病学特征的实时初步评估。欧洲监视。2020;25(3):pii=2000044。
4.Munster VJ,Koopmans M,van Doremalen N,等.中国出现一种新型冠状病毒——影响评估的关键问题。英国医学博士。2020;DOI:10.1056/NEJMp2000929。
5.2019 年新型冠状病毒在武汉检疫隔离前输入中国的风险。MedRxiv。2020;19299.
6.李瑞云、森沛、、宋沂蒙、、万阳、杰弗里·沙曼·梅德西弗 2020 . 02 . 14 . 143533533304https://doi.org/10.1101/2020.02.14.20023127
7.阿马库,m .,布拉提尼,M. N .,柴布,e .,库蒂尼奥,f .,格林哈尔,d .,洛佩斯,L. F .,和马萨德,E. (2017)。从报告不足的年龄相关强制通知数据库中估计传染病的发病率。理论生物学&医学建模, 14 (1),23。https://doi.org/10.1186/s12976-017-0069-2
扎伊拉·穆斯塔山 是美国纽约的一名数据科学家。她于 2017 年获得了宾夕法尼亚大学的计算机科学硕士学位。她是一名研究员和科学家,对人工智能、数据科学和数学感兴趣,尤其是在应用于社会公益时。你可以在这里 找到更多关于她的技术贡献 。她喜欢旅行和探索新的地方。她认为旅行打开了不可想象的新的大门,通过接触不同的文化、风景和令人振奋的人,扩展了一个人的视野。
说唱和嘻哈音乐中的恐同症和厌女症
原文:https://towardsdatascience.com/how-has-the-usage-of-homophobic-and-misogynistic-slurs-in-rap-and-hip-hop-music-changed-over-time-cb30cb9a8436?source=collection_archive---------32-----------------------
随着时间的推移对连音符号用法的抒情分析
安库什·巴拉德瓦伊

在 Unsplash 上由 Namroud Gorguis 拍摄的照片
简介
随着说唱和嘻哈音乐的出现,争议似乎也随之而来,因为这种音乐类型因其音乐中描绘了恐同和厌女的主题而被反复指出(1,2)。在这种类型的音乐中使用亵渎的语言非常普遍,不幸的是,许多说唱和嘻哈音乐的亵渎内容包括贬低的引用,有时甚至描绘对女性的暴力(2)。此外,就像著名说唱歌手、东海岸嘻哈团体“吴唐帮”成员马索·曼恩说的那样,即使是最优秀的 MCs 也会避免被误解为同性恋,因为“你不能一边干别人,一边说自己是黑帮”。不用说,在说唱和嘻哈音乐中融入仇视同性恋和厌恶女性的主题令人担忧,特别是考虑到这种类型是年轻人最喜欢听的类型之一,引起了人们对这些主题对易受影响的思想的影响的担忧。然而,并不是所有的说唱歌手都仇视同性恋和厌恶女性。同样,并不是这一类型的每首歌或每张专辑都有恐同和厌女的主题。通过这个项目,将研究说唱和嘻哈专辑中同性恋恐惧和厌恶女性主题的表达随时间的变化。为此,将分析 1984 年至 2018 年期间 100 张说唱和嘻哈专辑中恐同和厌女诋毁的使用情况。因此,提出的问题如下:
随着时间的推移,说唱和嘻哈音乐中仇视同性恋和厌恶女性的辱骂是如何变化的?
流程
完成这个项目的代码是用 Python 3 放在一个 Jupyter 笔记本中的。
为了完成这个项目,需要大量的网络搜集。首先,需要一份要学习的专辑列表。这个链接上的列表包括了 100 张顶级说唱专辑,是从其他 25 张列表中汇总而来的,这意味着这个列表上的歌曲很好地概括了这张专辑在发行当年的风格标准。在将专辑列表抓取到熊猫数据框后,我开始担心随着时间的推移,这些专辑可能不会像我希望的那样分布均匀。主要是,我担心会过分强调旧专辑。为了消除我的焦虑,我发现,尽管分布确实稍微偏右,但大多数专辑在数据框架中的*均年份之前制作图表,我不应该太担心专辑在我的数据集中制作图表的年份的不*等表示:

我的数据集中相册的分布
下一步是收集每张专辑的曲目列表和专辑中每首曲目的歌词:genius.com 被用来获取每张专辑的曲目列表,以及每张专辑中每首歌的歌词。不幸的是,在这一步,我面临着一个看似不可能完成的任务,即收集大约 1863 个网址来搜集每首歌的歌词。幸运的是,通过注意到用于访问 genius.com 的 URL 具有可预测的模式,我有效地编译了数据帧中大多数歌曲的歌词,尽管不幸的是,由于我在尝试完全自动化歌词的 web 抓取器时出现的错误,我丢失了数据帧中大约 7.24%的原始歌曲。现在每首歌的歌词都在数据帧中,我可以继续进行文本分析。
我的文本分析方法的第一步是定义一个要搜索的恐同和厌女辱骂的列表。同性恋憎恶者名单被定义为包括娘娘腔、三色堇、鸡奸者、南希、仙女、同性恋、本特、同性恋、骑师、和唐克。这份厌恶女人的诽谤清单被定义为包括妓女、荡妇、荡妇、阴户、娘娘腔、同性恋、婊子、妓女、假正经、和女同性恋。接下来,为了确定专辑中包含了多少厌恶女性和厌恶同性恋的污点,我首先找到了每张专辑中每个列表中每个污点的 TF-IDF 分数。TF-IDF 代表词频-逆文档频率,并且是用于确定单词相对于整个语料库(在这种情况下,数据集中的所有相册)对文档(在这种情况下,相册)有多重要的度量。然后,对于每张专辑,对同性恋恐惧症和厌女症的评分将简单地是各自列表中每个污点的*均 TF-IDF 分数。通过这样做,我试图捕捉到相对于数据框架内所有其他专辑中相同词汇的使用,厌恶女性和厌恶同性恋的词汇对特定专辑有多重要。有了这些信息,终于到了阐述我的结果的时候了。
结果

说唱和嘻哈音乐中的连音符号用法
上面的图表展示了我的数据集中所有说唱和嘻哈专辑在特定年份的恐同症和厌女症的*均得分。虽然很难确定随着时间的推移,仇视同性恋的辱骂是否有所改变,但很明显,随着时间的推移,厌恶女性的辱骂越来越多。请注意,直到 20 世纪 90 年代末,专辑才开始使用比数据集中所有专辑发布的厌恶女性诋毁的*均数量更多的厌恶女性诋毁。特别是从这一点上看,似乎在每年发布的嘻哈和说唱音乐中,与使用恐同的污点相比,使用厌恶女人的污点有更多的变化。在计算了标准偏差之后,发现这是正确的,因为使用厌恶女性的辱骂的标准偏差比使用厌恶同性恋的辱骂的标准偏差高*五倍。
此外,我的分析发现,数据集中最害怕同性恋的艺术家如下:史努比·狗狗(或者,正如他在 Doggystyle,他在数据集中唯一的专辑《史努比·狗狗》发行时所知的那样),梅西·埃丽奥特和阿姆。我的分析还发现,数据集中最厌恶女性的艺术家如下:李尔·韦恩、D12 和波斯特马龙。同样,我的分析发现,最厌恶同性恋的三张专辑如下:史努比·多格的《狗狗风格》,坎耶·韦斯特的 808's 和《心碎》,Run-D.M.C 的 Raising Hell ,最后,最厌恶女性的专辑如下:李尔·韦恩的《Tha Carter III》,德瑞医生的 2001 ,阿姆的 The Marshall Mathers LP 。
结论
作为这个项目的结果,我相信我已经产生了以下关键见解:
1.说唱和嘻哈音乐中对女性歧视的使用越来越多。
2.rap 和 hip hop 专辑中厌恶女性的污点每年的使用标准偏差大于 rap 和 hip hop 专辑中厌恶同性恋的污点每年的使用标准偏差。
3.根据我使用的数据和分析,史努比·道格、梅西·埃丽奥特和阿姆是使用最多同性恋辱骂的艺术家。
4.根据我使用的数据和分析,李尔·韦恩、D12 和波斯特马龙是使用最歧视女性的诋毁的艺术家。
5.根据我使用的数据和分析,Snoop Dogg 的 Doggystyle ,Kanye West 的 808's 和 Heartbreak ,Run-D.M.C .的 Raising Hell 是使用最多同性恋憎恶的专辑。
6.根据我使用的数据和分析,李尔·韦恩的《Tha Carter III》、德瑞医生的《2001》和阿姆的《马歇尔·马瑟斯唱片》是使用最歧视女性的诽谤的专辑。
这个项目使用的完整代码可以在这里查看。
参考文献
[1] J. Weiner,无同性恋的兴起和嘻哈同性恋恐惧症的改变 (2009),Slate.com
[2] C. E. Kubrin,R. Weitzer,说唱音乐中的厌女症 (2009),男人和男性气质
拥有一个博客如何推进你作为数据科学家的职业生涯
原文:https://towardsdatascience.com/how-having-a-blog-can-advance-your-career-as-a-data-scientist-245270cc281e?source=collection_archive---------25-----------------------
提示:这也适用于其他职业
内容创作一开始可能会很吓人。我知道对我来说是这样——在比我更有经验的人面前分享想法和观点。尽管如此,即使作为一名初级到中级数据科学家(或软件工程师),拥有一个博客也可以启动你的职业生涯。

在 Unsplash 上由 Brad Neathery 拍摄的照片
我于 2019 年 8 月开始写博客,大约在我开始第一份数据科学家工作的 4 个月后。起初这听起来可能很奇怪,因为有很多人有更多的不写博客的经验。我不知道为什么。
可能是时间不够,但也可能不是——因为每周发表两篇文章对我来说需要 4-8 个小时——这取决于我需要准备的代码量。缺乏意愿和动力是更可能的情况——主要是因为人们没有意识到写博客的好处。
写博客有很多好处——这将是今天文章的主题。这些好处来自一个人的角度,当然,但很容易转移。唯一的问题是——写博客需要行动,需要花很多时间才能看到结果——这不是每个人都愿意做的。我肯定你不属于这一类。
所以,事不宜迟,让我们从第一个好处开始吧。
1 —人们看到你做的事情
博客是一个巨大的声誉建设者。我还是一名大学生,有大学教授走过来称赞我的写作。如果有的话——写作技巧只会随着时间而提高。从你欣赏的人那里获得积极的反馈可以保持动力水*。
另一群你想看你内容的人是潜在雇主。他们有两种方法可以找到你:
- 通过活跃在你写作的*台上
- 点击简历中提供的链接
第一种选择稍微好一点,因为他们可以看到你的进步。如果你了解自己的能力,潜在的雇主很可能会同意你的观点和意见,让你更容易被雇佣。
从这一点来看,工作面试应该成为一种形式。当然,如果你名下有 3 个帖子,你不能指望这种情况会发生,但你需要从某个地方开始。从小事做起,但更重要的是——从今天开始。
作为一名自由职业的数据科学家,拥有一个博客也对你有好处——因为它提供了某个领域专业知识的证明,而这不是一个普通的自由职业者所拥有的。因此,你要么得到更多的工作,要么收取更多的费用,或者两者兼而有之。
总而言之,每个人都想成为数据科学家。因此,你需要从人群中脱颖而出。每个人都知道熊猫和 Scikit-Learn ,但是成为能够教这些的人将会为你创造奇迹。
2 —你学得更快
数据科学和其他技术专业充满了高级和不那么容易理解的主题。让我给你看一个例子。
大约一周前,我对用 Python 将时间序列作为一项监督任务感兴趣。这样做将允许我使用像极端梯度推进(XGBoost)这样的算法。唯一的问题是——绝对没有人能在网上演示如何预测新的、看不见的数据!指南只告诉你如何在测试集上进行预测,这是不够的。
所以我决定为这个任务编写自己的类——XGBTimeSeries——基于 XGBRegressor ,并且现在能够处理每小时、每天、每月和每年的时间序列数据。它也创造了不同的变量——比如是不是周末,值是不是出现在工作时间,以及其他许多变量——仅仅基于频率。
是的,我打算写很多关于它的东西。因为这不是最简单的事情,而且模型类大约有 400 行代码,我怀疑它是否适合写在一篇文章中。更现实的情况是,我会把它做成一门迷你课程。如果你对那样的东西感兴趣,请告诉我。
无论如何,我在这里有点跑题了,但我希望你能抓住要点。这里有一句我特别喜欢的话:
“如果你不能简单地解释它,你就不够了解它。”——阿尔伯特·爱因斯坦
这句话适用于博客,因为它迫使你把事情看得简单到它们本来的样子。写一些你不理解的东西是没有意义的,因为这会让你和读者都感到困惑。
首先确保你理解了这该死的东西,然后试着像你的读者是一个 5 岁的孩子一样解释它。
3 —兼职赚钱
最后说一下钱的问题。没人能告诉你到底能赚多少钱,但大约 10 个月后,我每个月能赚 15000 美元到 10000 美元 3K——包括联盟营销。最重要的是,写博客让我有了种选择。我来详细说明一下。
如果你只是朝九晚五地工作,你就依赖于那份工作。如果你明天停止工作,会发生什么?写博客给你提供了选择,因为如果你做得足够好,你可以有多种收入来源——这样就不会完全依赖于你的日常工作。
而这只是冰山一角。写关于你所做的事情的博客会在你周围创造一个个人品牌。当然,这不会在一个月内发生,但要等几年。我还没到那一步,但我已经看到了个人品牌在我日常生活中的影响。
“我写了好文章,所以读者应该来找我”——是一种不好的态度。还有,事情也不是这样运作的。作为个人品牌所有者,你有责任让读者访问你的博客。这就是我最*在更好的数据科学所做的事情,这并不是世界上最容易的事情。
托管您的内容使您能够以您想要的方式控制它,发布您的产品,并推广代销商的产品,所有这些从长远来看都可以带来可观的收入。
还有,“我不知道该写些什么”的事情出现了很多。这让我感到惊讶,因为数据科学每天都在发展,新事物总是不断涌现。有很多东西要写,而且随着时间的推移,主题列表会越来越大。
在你走之前
总结一下——尽快开博客将会启动你的职业生涯——只要你的想法不是完全错误的。但我相信你知道你在说什么。
有一些令人惊讶的免费地方可以开始,比如 Blogger 或 Medium——后者有固定的受众,这减少了营销工作。你只需要始终如一地写出高质量的内容,并让它吸引读者。有很多方法可以扩展它,但是你应该总是从简单开始——否则,它很容易耗尽。
你有什么想法?拥有一个博客对你的职业生涯有什么影响?欢迎在评论区留下你的想法。感谢阅读。
喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。
[## 通过我的推荐链接加入 Medium-Dario rade ci
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
加入我的私人邮件列表,获取更多有用的见解。
我如何在卡格尔 OSIC 肺纤维化进展竞赛中获得第一名
原文:https://towardsdatascience.com/how-i-achieved-the-1st-place-in-kaggle-osic-pulmonary-fibrosis-progression-competition-e410962c4edc?source=collection_archive---------30-----------------------
结果证明这是相当随机的

https://unsplash.com/photos/6BVinN0Y7Xk
介绍
在 OSIC 肺纤维化进展比赛期间,参赛者被要求根据他们肺部的 ct 扫描和一些额外的表格数据字段来预测患者肺功能下降的严重程度。挑战在于使用机器学习技术,以影像、元数据和基线 FVC 作为输入进行预测。这项任务并不简单。由于可用的数据量相当低,使用传统的计算机视觉方法来建模 CT 扫描和患者 FVC 值之间的相关性并不容易。此外,公共排行榜分数仅基于 15%的测试数据,与验证完全不相关,这使得很难选择最佳模型进行最终提交。
总的来说,在这里解释比赛的所有微妙之处真的很难,所以我建议访问上面的比赛链接,如果你真的感兴趣,可以自己阅读一下!
模型的输入和输出
如上所述,输入数据由 dicom 格式的胸部 ct 扫描组成,这形成了 3d 胸部 CT 扫描加上一些附加的元数据字段,这些字段一般描述了每个患者。这是一个 CT 扫描的切片例子。

https://www . ka ggle . com/andradaolteanu/lung-fibrosis-competition-EDA-DICOM-prep
这是患者附加元数据字段的示例。

https://www . ka ggle . com/andradaolteanu/lung-fibrosis-competition-EDA-DICOM-prep
对于每个患者,都有一个初始 CT 扫描,对应于患者元数据中的第一周和其他周,描述了患者 FVC 在此期间的变化。
对于每个患者的测试集,只给出了第一周的数据,以及最初的 CT 扫描。这项任务不仅要预测接下来几周的“FVC”值,还要显示每次预测的“置信度”得分。
评估指标
谈到这个指标,对数似然分数被用来给所有的提交打分。

https://www . ka ggle . com/c/osic-肺纤维化-进展/概述/评估
这是我的 python 实现。
def loglikelihood(real, pred, sigmas):
sigmasClipped = np.maximum(sigmas, 70)
delta = np.abs(real - pred)
deltaClipped = np.minimum(delta, 1000)
metric = - np.sqrt(2) * deltaClipped / sigmasClipped - np.log(np.sqrt(2) * sigmasClipped)
return np.mean(metric)
验证技术
说到验证,我试图让它尽可能接*组织者使用的评分方法。最初,他们只对最后 3 个预测评分(每个患者最后 3 周),所以我开发了一个类似的验证框架。对于测试集,我只包括不在训练集中的患者,并且只使用最后 3 周进行评分。不过,这个验证方案与排行榜没有很好的关联。
kf = KFold(n_splits = 5, shuffle = True, random_state = 4444)foldMetrics = []
for trIdsIdx, valIdsIdx in kf.split(trainData['PatientID'].unique()):
trIds, valIds = trainData['PatientID'].unique()[trIdsIdx], trainData['PatientID'].unique()[valIdsIdx]
tr = trainData[trainData['PatientID'].apply(lambda x: x in trIds)]
val = trainData[trainData['PatientID'].apply(lambda x: x in valIds)].reset_index(drop=True)
valIdx = []
for idx in val.groupby('PatientID')['target_week'].apply(lambda x: np.array(x.index[np.in1d(np.array(x), np.array(sorted(x)[-3:]))])):
valIdx.extend(idx)
val = val.iloc[valIdx]
#######################
### FIT MODEL HERE
#######################
foldMetrics.append(loglikelihood(val['target_FVC'].values, val_pred, sigmas))
print(np.mean(foldMetrics))
最佳模特
我最好的模型原来是两个模型的混合,实际上是在比赛结束前由其他 kagglers 引入的:EfficientNet B5 和分位数回归密集神经网络。EfficientNet 使用 CT 扫描切片和表格数据,而分位数回归则依赖于表格数据。由于这两个模型最初的构建有点不同,混合它们是一个很好的主意,因为它们的预测具有多样性。
以下是我如何在私人排行榜上获得第一名的具体步骤。
- 从头开始训练这两个模型。对于 Effnet b5,我选择了 30 个时期,对于分位数回归,我选择了 600 个时期进行训练
- 我做了一些特征过滤,通过移除预先计算的“百分比”特征,这使得预测更糟(可能因为这个特征是预先计算的)
- 在模型混合方面,我只是给了分位数回归模型更高的分数,因为从我的角度来看它更可靠。
在训练时间方面,Effnet b5 在单个 Nvidia Titan RTX GPU 卡上进行了大约 5 分钟的微调。分位数回归在推断过程中直接在 Kaggle 机器上训练,训练时间不超过 30 秒。一般来说,所有的推理过程在 Kaggle 机器上只需要 3 分钟。
此外,我想给一个小提示,关于我如何倾向于选择提交和验证预测的正确性,总的来说,这对我帮助很大。当我训练好新模型并收到提交文件时,我总是绘制预测值的分布图,以及预测本身的分布图。下面是预测图的样子:

这些是我的模型子集的测试集“置信度”的图,有时通过查看这些图,您可以识别奇怪的模型行为并找到一个 bug。总的来说,我总是非常仔细地分析预测,并在提交任何东西之前建立许多图表。
什么没起作用
我尝试了很多方法,但在 LB 和 CV 上几乎都不太管用。这里有几件事:
- 使用公共笔记本中的方法计算肺容量,并将其作为两个模型的特征进行传递
- 测试了其他模型、XGBoost、表格数据的对数回归。多亏了我的简历,很快就发现树在这里不起作用,所以从比赛开始我就没有对树做过任何事情。
- 因为我测试的是简单的模型,所以我第二次提交的是一个非常简单的逻辑回归模型,顺便说一下,它落在了青铜区
- CT 扫描的增强效果很差,也许我应该花更多的时间来测试它们
- 图像的直方图特征也不起作用。
- 如果你已经分析了模型输出,你可能已经注意到那些尖峰信号(包括信心和 FVC ),移除它们是完全有意义的,但是它们对我的验证不起作用,所以我让它保持原样。尽管如此,我仍然对它在私有测试集上不工作的原因感到困惑。

信心激增
最后的话
这是我在 Kaggle 上的第一枚金牌,我真的很高兴。我要感谢所有 Kaggle 社区将这么多笔记本公之于众并活跃在论坛上!没有这个,我不会在这次比赛和之前的所有比赛中学到那么多。
下面,我将附上我的最终提交笔记本的链接,以及 Kaggle writeup 和 Github repo。
第一名笔记本
青铜区非常简单的解决方案
Kaggle 报道
Github 库
我如何通过优化合适的地点和时间成为一名数据分析师
原文:https://towardsdatascience.com/how-i-became-a-data-analyst-by-optimizing-the-right-place-and-time-bb068546ff17?source=collection_archive---------19-----------------------
如果你没有准备好利用这种情况,正确的地点和正确的时间就没有任何意义。让我们找出我们能做些什么来充分利用我们面前的机会。

在 Unsplash 上由 Daoudi Aissa 拍摄的照片
在我的家人和朋友中,我是出了名的“关键人物”,因为我几乎能找到任何东西。汽车、电话、家具,应有尽有。我可能以惊人的价格购买过任何产品。问题是,虽然我没有任何特殊的联系或秘密公式来找出何时何地得到大量的交易。我只是准备在机会出现时抓住它,了解交易通常发生在哪里,最重要的是;我很有耐心。我猜这三点就是秘方。
我总是从家人和朋友那里听到这些,
"他们怎么这么幸运能得到那样一份理想的工作?"
"他们是如何找到如此出色的搭档的?"
“你在跟我开玩笑吗?他们可以随时远程工作?”
事情是这样的,我打赌他们不仅仅是幸运,他们可能一直在努力克服困难。你不能完全消除运气因素,但你可以向有利于你的方向倾斜。我将向您介绍当我打算从审计员转行成为数据分析师时,我是如何扭转不利局面的。
(本文的第一部分更多的是关于我如何在错误的地方,对数据分析的角色准备不足,以及我如何发现要走上数据分析的道路。如果你想跳过这些细节,那就直接跳到标题: 向正确的地方前进 )。
在错误的地方
高中毕业后,我去了阿联酋的一所大学,成为一名建筑工程师。我知道我喜欢与数学打交道,并对与有形的东西打交道充满热情,所以这似乎正合我的胃口。我早期遇到的问题是,我所有的微积分和物理教授主要用阿拉伯语授课。在交谈中,我能想到的最多的是,“ wahid dejaj sandweech,minfadlik ”,翻译过来就是“一份鸡肉三明治,谢谢”。理解如何寻找衍生品是一件难事。
对于成为一名建筑工程师的目标来说,这绝对是我个人目标的错误地点。我知道我必须搬家,但我父亲的规定是,如果他要支付学费,就必须在亚洲(那里的高等教育要便宜得多)。我和他做了笔交易。我请他给我买一张去美国的机票,和一点买车的钱,剩下的我来处理。令人惊讶的是他同意了(谢谢爸爸!),于是我就上路了,但到达后不久悲剧就发生了。
当我到达德克萨斯时,我给自己买了一辆 1999 年的尼桑 Altima,已经跑了 83,000 多英里。这是一个完整的垃圾,但它是我的第一辆垃圾车,我喜欢它。(糟糕到我不得不用螺丝刀来换挡)。
从那以后,我试图报名参加德州大学奥斯汀分校的建筑课程,但他们不会转让任何学分,我不得不从头开始。我之前的项目已经进行了两年,不想在 24 岁毕业。当时我很沮丧,因为我一心想要成为一名建筑师。这是大约在《我如何遇见你的母亲》播出的时候,所以我认为成为像泰德·莫斯比那样的建筑师将是超越蜜蜂膝盖的。
在与家人和朋友交谈后,我改变了主意,决定成为一名财务审计员。我知道,我在想什么?当时,这非常有意义。我知道关于我的两件事,这两件事今天仍然适用;我喜欢玩数字,我喜欢不断学习。当时的财务审计员似乎符合要求,我的很多学分都可以转过去。我在 23 岁的高龄毕业,获得了金融和会计双学位,在 GameStop 找到了一份审计员的工作,成为了一家审计公司的审计顾问,为最大的医药分销商之一工作,这变成了有史以来最单调的职业生涯。
回顾财务和流程并不是我想要的那种玩弄数字的方式,几个周期之后,我觉得我没有学到任何新东西。我成了一个没有灵魂的隔间幽灵,每天上班下班。又一次,我在错误的地方。
做了 4 年审计员后,我知道有些事情必须改变。我又一次走错了地方,如果我现在不做出改变,我担心可能会太迟了。
在我最后的几份工作中,我还负责报告我们审计的整体团队进度。我发现我工作中的那一小部分是最令人愉快的。我开始研究它的美学,组织信息,设计图表,使它尽可能的易读。很有趣。然后我开始摆弄这些数字,看看我是否能预测我们将提前(或推迟)多长时间完成给定的审计。然后我突然想到,我其实在工作中很开心。如果我能一直这样做呢?
我开始阅读不同的分析师角色,与同事交谈,并很快发现我的公司有自己的数据科学团队。我那位出色的主管认识数据科学团队中的一些人,并安排了一次对他们的采访。我尽力展示我的热情,以及我自学的东西,但这还不够。我对这个角色没有足够的准备。
朝着正确的方向前进
在我第一次因为没有得到数据科学团队的职位而受挫后,我要求与招聘经理再次会面,以了解我缺乏什么技能以及我需要在哪些方面得到支持。他给我的建议很可靠:
- 学习 SQL 和 Python 或者 R
- 在小公司工作,最好是科技初创公司
精通 SQL 对于简单地查询任何数据库都是必要的。这是分析师的基本技能,就像 Excel 对于会计师一样。学习 Python 或 R 之类的语言对于提供更多分析见解至关重要,并为数据科学职业铺*道路。
在小公司找工作也是天才之举。初创企业缺乏资源,所以即使你有一点技术技能,你也可以打赌你会被借用来帮助其他团队。这实际上是把我自己定位在了正确的位置上。
我去赛马了。我知道我想在哪里着陆,我也有一张如何到达那里的粗略路线图。首先,我开始在 Udacity 学习 SQL 和 Python 课程。这是一个很好的资源,它帮助我学习了 SQL 和 Python 的基础知识,以及关于使用特定 Python 库进行分析的课程,比如 Numpy 和 Pandas。如果你想看我参加的确切课程,请查看下面的链接(下面的链接是附属链接,如果你购买课程,我可能会得到补偿):
[## 在线数据分析师课程| Udacity | Udacity
纳米学位计划与下载教学大纲的先决知识,你应该有工作经验…
www.dpbolvw.net](http://www.dpbolvw.net/t270ft1zt0GQJKPKKKGIKPJNIKI)
与此同时,我开始在小公司找工作。即使我没有做好 100%的准备,我也想尝试获得面试机会,修改我的简历,尽可能多地了解内部信息。我不得不尽可能从每个角度优化。
我居住的许多公司(俄亥俄州哥伦布市)都是大型老牌公司,有很多招聘资源,所以我必须扩大搜索范围。我开始在纽约和旧金山找工作。www.builtin.com 是一个很好的资源。BuiltIn 专注于为纽约、旧金山、丹佛、奥斯汀等地区的小型科技初创企业提供就业机会。这是一个很好的资源,可以用来寻找适合我的公司类型。
经过多次简历重新设计,从我失败的电话面试中给招聘人员发信息寻求反馈,以及不断学习,我在纽约的 Squarespace 找到了一份内部控制分析师的工作。不是数据分析师的角色,但对我来说是退而求其次的事情。尽管我仍然是财务团队的一员,但我必须与数据工程团队密切合作,向他们提供我们的系统需求,以便他们进行构建。我让自己更接*我的最终目标。
我最终会测试这些系统,如果出了问题,就必须开罚单。我以此为契机,深入研究数据,试图自己找出问题所在。我是否正确并不重要。我不仅输入了错误,还输入了我的假设。有时候我是对的,很多时候我是错的,但我每次都学到了东西。我获得了真正的工作经验。
在 Squarespace 工作了将*两年后,我在数据工程、分析和科学团队成员中建立了很多联系。我从他们那里学到了很多东西,在如何继续我的学习道路上,他们比任何文章都更好地指导了我。最终,我开始在纽约的不同科技公司申请一个真正的数据分析师职位。你瞧,这次我参加了几个面试!不幸的是,与其他候选人相比,我每次都因“没有足够的经验”而被拒绝。我提出在证明自己之前做临时工,而且我的要价低于市场价。我只想迈出第一步。
有一天我走运了。我哥哥告诉我,俄亥俄州一家金融科技初创公司 Root Insurance 的招聘网站上有一些数据分析师的职位。一开始我也没多想。我申请了,就像我申请所有其他嘲笑我的名单一样。过了一个月,我收到一封邮件,要求打电话!在我和招聘人员通完电话后,我在网上跟踪了一下招聘经理,结果发现他和我的表弟小世界有联系!我给我表哥打了个电话,他和招聘经理进行了一次谈话。我不确定谈话进行得如何,或者说了些什么,但我只能想象它有所帮助。
我提交了一份工作样本,并亲自面试,他们说我是他们遇到的最好的候选人,我被惊呆了。它真的发生了!他们提出了一个提议,我接受了。
长话短说
这是一个很大的咀嚼,但主要观点来自轶事如下:
- 知道自己想去哪里。你需要知道你想要什么或者你想去哪里,否则没有方向。这花了我一段时间,但保持我对数字的热情,就像它们是谜题一样,不断学习的需求使我意识到数据分析是我需要去的地方。
- 准备是关键。你可以在一天的每一个小时都希望得到所有梦想中的工作,但它什么也不会做。你需要学习怎样才能得到你想要的,然后开始学习、训练、实践。不惜一切代价。这就是为什么我花钱上在线课程并寻找专业人士。我需要做好各方面的准备。
- 身体力行抓住新的机会。对于我想要的每一件事,我都确保自己正朝着正确的方向前进。从阿联酋到德克萨斯到纽约。我去了我认为下一个机会会出现的地方。
- 要有耐心。我知道这很难。达到目标是成功的一半以上,你朝着目标迈出的每一步都是一项新技能,新的思维过程,以及你获得的更多知识。你仅仅通过尝试就成功了,所以坚持下去。你没什么可失去的。

约翰·汤纳在 Unsplash 上的照片
“*静的大海造就不了熟练的水手”——英国谚语
我碰巧得到了一份数据分析师的工作,这似乎很幸运,因为我的表弟是招聘经理的朋友,但问题是,你可能已经认识一个朋友或家庭成员,他们认识你想进入的领域的某个人。唯一不同的是,我做好了充分的准备来抓住这个机会。如果我没有学习 SQL 和 Python,没有与数据工程师、分析师和科学家合作,没有为我申请的每一个职位不断修改我的简历,那么无论我的堂兄是否帮助我,我都不会为这个机会做好充分的面试准备。我花了大约两年时间才成为一名数据分析师,也许还需要两年时间才能成为一名数据科学家。在那之前,我会继续准备,直到我的机会出现。
快乐学习!
如果你喜欢这篇文章,并想了解我是如何为转行更新简历的,请看下面这篇我写的文章:
[## 如何为转行重新设计简历
让我们看看如何改变典型的简历,使你的简历从提交包中脱颖而出。
uxdesign.cc](https://uxdesign.cc/how-to-design-a-resume-for-a-career-change-f4d5f1f0ed1)
我是如何在没有学位和训练营的情况下,在疫情成为一名软件开发人员的
原文:https://towardsdatascience.com/how-i-became-a-software-developer-during-the-pandemic-without-a-degree-or-a-bootcamp-ef7a4184efde?source=collection_archive---------0-----------------------
作为一名自学成才的学生,我在一年内找到了我梦想中的工作,以下是我从这次经历中学到的东西

对 Unsplash 的信贷。
在 2018 年,我很沮丧,没有动力,我认为自己是个失败者,我认为我太笨了,无法完成我的学位或学习任何东西,我没有生活的方向,只想一切都结束。
两年后,一年在国外工作,另一年致力于学习,我对自己有了完全不同的看法,周一我开始了令人兴奋的新开发工作。
经过三年的学习,我鼓起了很大的勇气(也说服了我的父母)离开了我的大学,在里斯本接受了一份不认识任何人也不懂任何语言的工作,但这是一次帮助我找到自我的美妙经历。离开里斯本重新开始学习需要更多的勇气和决心,但我做到了,因为我知道我的梦想是成为一名程序员。
我没有心理学方面的专业知识,如果你在一个黑暗的地方,我的最佳建议是寻求专业帮助,但我知道迷失的感觉,我想通过写这篇文章来帮助任何与我有相同梦想的人,就如何在软件开发中实现职业生涯提供可行的建议。
编码很棒
我花了几年时间试图了解我成年后想做什么,但却失败得很惨。我花了一个学期在医学院学习,这时我意识到我根本不在乎成为一名医生,我参加了三年的工程课程,但我不喜欢我的专业科目,最后,我决定我不想继续下去。
我非常幸运地在我还在学习的时候收到了一份工作邀请,我立即决定抓住机会去争取,当时我从未真正全职工作过,所以我想挑战我对无法在专业环境中成功的恐惧。
幸运的是,我最终绝对热爱我的工作,感谢我认识的所有人,实际上是我的一位同事向我介绍了编码,并让我对它产生了兴趣。
从那以后,我再也没有回头,我开始涉足编程,我很快意识到我想把它作为我的职业,我非常享受挑战和它提供的智力刺激,我认为每个人都应该尝试一下,看看他们对它是否有同样的感觉。
每个人都可以编码…
…是一个古老的苹果活动的口号,虽然我完全同意任何人都可以学习编程的基础,但我问自己,每个人都可以在软件开发领域获得职业生涯吗?
肯定不是,尽管这个职业越来越受欢迎,而且不断有更多的工作岗位产生,但这个领域仍然有限,许多人没有在电脑前长时间孤独(有时令人沮丧)的资质,简而言之不是每个人都应该编码。

不是每个人都会*等地享受编码,但我相信值得一试,图片鸣谢
如果你认为这是一个快速致富的机会,那就去其他地方。如果你不真正喜欢写软件,你永远也不会找到工作,投入这么长时间却看不到任何切实的结果,也没有外部义务,这需要很多动力和奉献精神,不是每个人都可以复制的。
编码很难
不要相信那些所谓的专家或大师,他们承诺给你一个学习编程的简单程序,然后很容易找到六位数的薪水,这完全是一个谎言,如果有人向你讲述这个故事,你应该假设他们并没有把你的最佳利益放在心上。
学习如何编码是一个非常漫长和困难的过程,它需要你吸收一种完全不同的思维方式,花费无数的时间试图理解困难的主题或调试不能正常工作的应用程序。

我喜欢虫子!只要他们远离我的代码。学分
人们经常忘记当他们只是初学者时,编码是多么困难,当你投入足够的时间时,编码会变得容易,但是不要因为你花了很长时间理解递归就错误地认为你不适合,每个人都必须按照自己的速度学习。
没有资历有可能找到工作吗?
答案当然是肯定的,如果你在网上浏览的话,你会发现很多人在四十多岁时改变职业生涯,或者放弃教育去自学并获得他们一直希望的工作的故事,后者基本上就是发生在我身上的事情,但这是追求这一职业的最佳方式吗?
让我们先说,如果我仍然是 19 岁,我毫无疑问会进入大学学习计算机科学,特别是在我的国家意大利,那里的教育是便宜的,进入这个行业最简单的方法无疑是通过获得学位和几个实习机会。

更不用说如果你毕业了,你的父母会很高兴的
我决定尝试更难的自学路线的原因是,我已经有了专业经验,并完成了我的工程学位的很大一部分,这些因素让我在员工眼中更可信,并为我的研究奠定了坚实的数学基础。
我没有训练营的经验,但我的印象是,他们通常只提供一两种语言和一些框架的浅薄知识,但在你对计算机科学和编程的整体理解上留下了巨大的漏洞。
不是说他们都是这样,加入一个对你来说可能是一个很好的选择,但是不要以为你会知道你需要的一切就离开。
如何从零开始
从数量惊人的资源开始,选择走哪条路和选择哪种语言可能会非常困难,如果我做了错误的选择怎么办?
秘密是没有正确或错误的选择,真正的成功之道是通过承诺某事并完成它,不要每隔几天就尝试一门新的课程或教程,因为你认为你可能会比你目前正在做的事情更喜欢它,或者有人向你保证它是最好的。
也就是说,当被问及从哪种语言开始时,我经常说 Python,因为我相信它对初学者最友好,并且足够大,可以让你探索许多不同的专业,从 web 开发到机器学习,但是如果你仍然不确定,我建议阅读这篇伟大的文章来帮助你下定决心。

你应该选择什么?形象信用
最好的入门网站是那些允许你边学习边编程的网站,阅读编程而不实际操作可能会让你成为一名程序员,就像阅读烹饪书而不烹饪可能会让你成为一名厨师一样,这里有一些我最喜欢的:
-FreeCodeCamp;
- 代码库;
- 可汗书院;
- SoloLearn 。
基于项目的学习
开始并不困难,你学习许多新概念,并开始使用你选择的语言,当你想在没有帮助的情况下做一些你以前没有做过的事情时,问题就出现了,精通和独立需要的不仅仅是知道编程语言的基本逻辑和语法。
要进入更复杂和有趣的话题,有几个奇妙的选择,你知道你可以参加世界上最好的机构完全免费的大学课程数千?
有像 Class Central 这样的网站,你可以用它来找到你最感兴趣的课程,或者你可以直接探索其他*台,比如:
-Udemy;
-Coursera;
-Edx;
- MIT 开放课件;
- 复数视线;
- 脑残学院;
-uda city; - 奥丁项目;
——OSSU。
但是,开始一门课程并被动地观看并不能保证你会学到很多东西,避免“教程地狱”并真正变得有能力的最好方法是将你所学的一切很好地用于基于你目前正在学习的材料的项目。
哈佛大学计算机科学导论
不得不在所有这些不同的内容中进行选择,这种感觉并不罕见,否则就不可能了,发展有许多分支,每个人都会根据自己的兴趣选择哪一个,但难道没有一些重要的材料是每个自学者都应该浏览的吗?
每当有人过了绝对初学者阶段问我,“我现在去哪里?”,我的答案永远是哈佛大学的CS50T4。

大卫·J·马兰教授对我来说是编程界的摇滚明星
有许多文章详细介绍和回顾了该计划,因此我在此不再赘述,但我对本课程评价最高的原因有几个,以下是四个:
- 令人敬畏的老师,大卫,布莱恩,道格,和所有其他工作人员都是我曾经有机会学习的最有能力和耐心的老师,除了课程之外还有大量的额外材料。
- 在大多数社交媒体*台上,巨大的同学社区,Reddit,脸书,Discord 等等,总是在我被一个任务困住或者对任何话题感到困惑的时候帮助我。
- 它教授经常被独立学生忽略的编程基础知识,当你最终找到工作时,你可能不需要实现二分搜索法或使用指针,但能够完全理解基础知识会让你更深入地理解每个主题。
- 你不需要在这个介绍性课程上停下来,有不同的与 cs50 相关的专业课程可以让你探索网络、移动、游戏开发和人工智能,这样你就可以在你所学的基础上继续发展。
为了完成课程并获得证书,你必须完成八个评分的问题集,并在结束时创建一个你选择的个人项目,展示你在学习期间学到的东西。
应该选择什么项目?
我们又回到了项目上,原因很好,除了对学习你正在学习的科目至关重要之外,它们还是你向潜在员工介绍自己的最佳方式,尤其是如果你没有正式的经验或教育背景的话。
关于具体做什么,好吧,天空是无限的。我最喜欢编程的一点是,只要你有足够的能力(并且你的谷歌技能能够胜任这项任务),它可以让你做任何你的想象力推动你去做的事情,这个 Github 库包含了一些非常有趣的想法。
说到 Github,如果你还没有的话,你绝对应该开一个账户,用它来展示你最喜欢的作品,使用一个格式良好的自述文件,我的是我的定制编程语言,还有这个预测预期寿命的人工智能模型。
选择你的专业
有抱负的程序员有很多不同的选择,这使得很难选择,你对 Web 开发感兴趣吗?你一直渴望编写游戏程序?或者你想探索像云开发或人工智能这样的新兴趋势吗?

访问该网站获取探索不同编程职业的精彩路线图
人们普遍认为前端开发的门槛最低,初学者经常被鼓励学习它,以便能够尽快找到工作,尽管这是一个合理的建议。我有点不喜欢 HTML,尤其是 CSS,知道我不会对它有热情,我努力学习后端,尽管在纸上谈兵更具挑战性,但我能够找到工作。我的观点是,追随你的激情比选择容易的路线更重要。
但在真正将你的想法设定在一个具体的目标之前,我鼓励你尽可能多地尝试,当我意识到训练模型实际上很无聊,有时令人沮丧,我更愿意从事数据基础设施或编写算法时,我确信人工智能将是我的激情所在。
我准备好工作了吗?
关于这个问题,我收到的一些很好的建议是,你永远不会为你的第一份工作做好准备,因为你可能还没有准备好。大多数公司,至少是好的公司,雇佣初级员工时都清楚地知道,在他们有能力带来利润之前,他们会亏损几个月,他们是在投资你,致力于你的进步!
因此,不要等到你觉得自己达到了完美的程度,而是去问一个该领域的朋友,甚至是你在社交媒体上不认识但愿意帮助你的人,你的投资组合和知识是否达到了通过技术面试的水*。
“完美是进步的敌人”
温斯顿·丘吉尔
老实说,无论如何,在你得到答案之前,这个就业市场将会是几个星期或几个月,你还不如早点开始寻找和申请,但不要太冒险,当机会最终到来时,你会因为完全没有准备而破釜沉舟。
复习你的课程
有很多关于如何构建和填写简历的建议,但有一些对我特别有帮助:
- 利用你以前的经验,不管你是转行还是在服务行业工作,把它放在你的简历里,在面试的时候提到它,即使不是技术性的。以前的职业证明了其他重要的技能,比如能够处理客户或与同事互动。
- 专注于你想要获得的角色,如果你想成为一名 Java 后端开发人员,确保尽可能地拥有所有相关的技能、框架和证书,你可以提及其他一切,但确保它们不会分散你想要发送的图片的注意力。
- 一页!人力资源办公室每天会收到数百份简历,如果你的简历有四五页,那么很可能会被忽略,让你的信息直接而清晰,这样最有可能被注意到。
- 除非你申请的是设计职位,否则不要过分使用图形和简单的模板,有很多免费的模板,只要选择像下面这样漂亮清晰的或者简单明了的这个模板来自 Novoresume 。

一个来自 Novoresume 的实验想象着埃隆·马斯克的简历会是什么样子
如何找到理想的工作
找到一个你感兴趣的职位并不困难,每天都有数百个职位发布,大型科技公司也总是在招聘,对于你的申请,你可以使用像 Monster 、 Linkedin 、实际上这样的网站,或者公司网站本身,如果你有一个特定的想法。
问题是要比所有其他候选人留下更好的印象,你将不得不与来自世界各地的数百人竞争,其中一些人更有经验或受过更好的教育,才能真正进入面试阶段,届时你将能够展示你的激情和准备。
解决办法是建立关系网,积极使用你的社交媒体,如 Reddit、Twitter 和 Linkedin,参加招聘会和会议(实体或虚拟的),尝试与你渴望进入的行业的人会面,并向他们寻求建议,如果你保持礼貌的互动,即使是 Linkedin 上的冷淡信息也能产生奇迹。
事实上,我找到了我现在的公司,因为创始人在一个寻找创业公司就业机会的网站上看到了我的简介,并且非常喜欢它,发信息让我发送简历,我们之间的个人互动真的帮助我通过了第一轮筛选。
所以,在网上建立你的形象,尽可能多地建立联系,记住,只有一个人给你机会,让你最终打入这个行业!
准备面试
技术面试是出了名的困难,有一整个市场的书籍、课程和网站专门为他们准备问题,通常知道一门编程语言的来龙去脉和几个框架不足以成功。
算法、数据结构和 Leetcode 风格的问题已经成为许多公司的标准,尤其是如果你梦想成为脸书或谷歌的工程师,你必须确保你对这些主题的知识非常精通,要开始,我建议参加一个扎实的算法课程,然后每天练习 Leetcode。

大型科技公司因其极具挑战性的白板面试而声名狼藉
别忘了你的面试官也是人!能够交流你的推理比立即得出正确的解决方案更重要,在行为面试中要讨人喜欢和自信,并做好你的研究,公司需要致力于与他们合作的人。
如何应对拒绝
让我们面对现实吧,我们每个人都注定会以这样或那样的方式失败,就像在获得工作前的最后一次面试中,与我互动的人力资源女士认为我似乎不够积极,或者完全,例如当我因为准备不足而彻底搞砸了 C#职位的技术面试。
我仍然会想起那些事件,但没关系,因为它们真的帮助我理解了重要的课程,你如何展示自己和你的人际交往技能与你的技术技能一样重要。),并激励我认真准备。
同样的事情也会发生在你身上,不要让那些重要的课程白白浪费,继续努力,总有一天你会找到合适的机会,所有的努力都会证明是值得的。
有时候你需要运气
“每当我收到一叠简历时,我都会把其中的一半扔进垃圾桶。我当然不希望我的团队里有不走运的人。”
虽然这只是我在 Reddit 上发现的一个笑话,但事实是,通常世界上所有的建议和准备都不足以让你到达你想要的地方,实现目标需要一点运气。
当你的申请被忽略或者面试失败时,记住这通常不是你的错,被认为没有准备好接受一个机会并不意味着你不够好,而是你必须继续寻找合适的地方和合适的人,他们将能够看到你的潜力。
包扎
这个梦想并不容易,你可能要花几个月甚至几年的时间才能准备好,会有怀疑的时刻和看似不可逾越的挑战,但最终,你会很高兴回头看。
所以今天就开始编码吧,祝你旅途好运!
[## 解决 500+ Leetcode 问题后学到的五件事
为什么研磨 Leetcode 没那么糟糕
towardsdatascience.com](/five-things-i-have-learned-after-solving-500-leetcode-questions-b794c152f7a1)
感谢你到目前为止的阅读,如果你想了解更多我的观点,请查看我的其他文章,如果你喜欢这篇文章,请留下掌声,并随时在 Linkedin 上与我联系。
我是如何成为人工智能顾问的:面试问答
原文:https://towardsdatascience.com/how-i-became-an-ai-consultant-interview-questions-answers-689ba03a2620?source=collection_archive---------4-----------------------
在 Medium 上发布了几个自由职业项目和文章后,我被邀请申请几个 AI 咨询工作。

来源
在过去的几周里,我在埃森哲、Wavestone、谷歌和 IBM 面试了一个人工智能顾问职位,我非常喜欢它。因此,我决定写一些关于这次积极经历的东西。我将讨论我是如何准备的,提出在这个过程中我被问到的问题,并在最后分享一些帮助你被录用的技巧。
准备
我一直想为人工智能驱动的公司工作,然而,我意识到我更喜欢战略方面,而不是编码。事实上,我很感激必须了解客户的战略,公司面临的挑战和机遇,客户的数据和分析能力。理想情况下,通过将这些与对最先进的人工智能的理解相结合,顾问可以确定公司最重要的人工智能计划。尽管如此,每个人工智能顾问必须了解人工智能项目的所有步骤。因为我也有一份全职工作,所以我总共花了 2-3 个月来准备。在这个过程结束时,我收到了三份聘书。
因此,我需要为四个不同的领域做准备:编码、机器学习、系统设计和策略。
在进入问题之前,我建议所有对成为人工智能顾问感兴趣的人理解下面提到的元素,因为你将在这些元素上受到挑战:
- 使用分析算法和人工智能解决复杂业务挑战的能力
- 能够使用统计建模、机器学习和优化来设计、构建和部署预测性和规范性模型
- 能够使用结构化决策来完成项目。
- 能够管理整个 ML 项目,从业务问题识别、数据审计到生产中的模型维护。
除了技术方面,我被告知,人工智能顾问需要具备的真正技能是,当客户要求一件事但意味着另一件事时,能够读懂字里行间的意思,并从数据的角度进行战略思考……(如何建立稳固的数据网络效果,如何借助机器学习建立进入壁垒,等等。)
面试—第一部分(机器学习)
我的面试分为三个部分:机器学习、AI 策略和通用知识。以下是我必须回答的问题清单。
1。回归和分类 ML 技术有什么区别?
回答:回归和分类机器学习技术都属于监督机器学习算法。在监督机器学习算法中,我们必须使用带标签的数据集来训练模型,在训练期间,我们必须提供正确的标签,并且算法试图从输入到输出学习模式。如果我们的标签是离散值,那么这将是一个分类问题,例如 A,B 等。但是,如果我们的标签是连续值,那么这将是一个回归问题,例如 1.23,1.333 等。
2。什么是辍学?
回答:辍学是一种防止神经网络过度拟合的简单方法。它是神经网络中某些单元的缺失。这类似于自然繁殖过程,自然通过组合不同的基因(丢弃其他基因)而不是加强它们的共同适应来产生后代。
3。什么是隐马尔可夫模型?
回答: 隐马尔可夫模型 (HMMs) 是一类概率图形模型,它允许我们从一组观察变量中预测一系列未知(隐)变量。一个简单的 HMM 的例子是根据某人穿的衣服类型(观察到的)预测天气(隐藏变量)。
4。什么是模型精度和模型性能?
答案:模型精度是模型性能的子集。模型性能对作为算法输入的数据集进行操作,并且模型精度基于模型性能的算法。
模型性能衡量模型正确预测示例的能力。准确性是分类模型的一种性能度量,它将正确分类的示例的数量与所有示例相关联。
5。算法过拟合和欠拟合是什么意思?
答案:过拟合和欠拟合是导致表现不佳的原因。
过拟合对训练数据表现良好,对其他数据泛化能力较差。
欠拟合在训练数据上表现不佳,但在其他数据上表现良好。与“好”模型相比,过拟合和欠拟合模型在新数据上都表现不佳。一个欠拟合的模型很可能不会表现出“对其他数据的良好推广”。
6。对于物体识别问题,您更喜欢以下哪种数据扩充技术?
答案:裁剪、改变光度、水*翻转、重缩放、缩放;深度学习模型实际上需要如此多的数据来训练模型。它非常需要数据。为了利用不同角度的物体来训练模型,我通常使用数据增强技术。
7。机器学习有哪些不同的类型?

8。深度神经网络中的超参数是什么?
回答:超参数是定义网络结构的变量。例如,学习率等变量定义了网络的训练方式。它们用于定义网络中必须存在的隐藏层数。
超参数的例子:
学习率,最大树深度,隐藏层数,…
9。数据过度拟合是如何发生的,如何修复?
回答:当统计模型或机器学习算法捕捉到数据的噪声时,就会发生过拟合。这导致算法在结果中显示出低偏差但高方差。
10。如何防止过度拟合(说出并解释不同的技术)?
回答:首先你要考虑型号选择(选择不太复杂的型号)。
其次,重要的是要知道交叉验证并不能防止过度拟合。然而,它可能能够检测过度拟合。它可以分割训练数据,以便生成多个小型训练测试分割。然后,这些分割可用于调整您的模型。向机器学习模型提供更多数据有助于更好地分析和分类。然而,这并不总是有效的。
很多时候,数据集包含分析不需要的无关要素或预测变量。这些特征只会增加模型的复杂性,从而导致数据过度拟合的可能性。因此,必须去除这种冗余变量。
机器学习模型是迭代训练的,这允许我们检查模型的每次迭代执行得有多好。但是经过一定次数的迭代后,模型的性能开始饱和。进一步的训练会导致过度适应,因此你必须知道在哪里停止训练。这可以通过提前停止来实现。
正则化:正则化可以用 n 种方法来实现,方法取决于我们实现的学习者的类型。例如,在决策树上执行修剪,在神经网络上使用丢弃技术,并且还可以应用参数调整来解决过拟合问题。
集成模型:集成学习是一种用于创建多个机器学习模型的技术,然后将这些模型组合起来以产生更准确的结果。这是防止过度拟合的最好方法之一。一个例子是随机森林,它使用决策树的集合来进行更准确的预测,以避免过度拟合。集成模型可以用于通过组合几个弱学习器来避免欠拟合。由于集合增加了最终模型的复杂性,因此容易过度拟合,您需要小心避免这种情况。
11。激活功能的作用是什么?
答:用于将非线性引入神经网络,帮助其学习更复杂的函数。没有它,神经网络将只能学习线性函数,该函数是其输入数据的线性组合。激活功能是人工神经元中基于输入传递输出的功能。
面试—第二部分(人工智能策略)
1。在考虑实施人工智能解决方案之前,公司应该做些什么? 组织需要涵盖当前业务和技术状态以及未来目标的数据策略。三个要素是关键:
- 战略数据采集
- 统一数据仓库
- 确定数据值的过程
2。从战略的角度来看,一个公司应该如何开始他们的第一个 AI 项目?
答:根据 吴恩达 ,前几个 AI 项目成功的关键不是成为最有价值的 AI 项目。它们应该足够有意义,以便最初的成功将有助于公司熟悉人工智能,并说服公司的 C 级高管投资于进一步的人工智能项目;它们不应该小到别人会认为是微不足道的。
3。你会如何描述“人工智能的良性循环”以及什么公司使用这种策略? 答案:产品→用户→数据→产品。最好的产品拥有最多的用户,而最多的用户通常意味着获得最多的数据,有了现代 ML,产品变得更好。优步&亚马逊(Alexa)已经实施了这一策略。
4。为什么大部分 AI PoCs 达不到生产阶段?
答案:

来源
5。你将如何帮助一家公司确定他们是否应该制造或购买一个人工智能解决方案?
回答:这个决定主要取决于数据成熟度、对数据集的独家访问、内部数据科学家的存在、拥有人工智能模型的战略需求、预算和项目类型。在某些情况下,依赖外部服务提供商是不可行的(隐私问题)。如果一家公司不仅可以独家访问有价值的数据,而且他们的商业模式也依赖于这些数据,那么建立一个内部人工智能模型很可能是最佳策略。
6。如果一家公司想要实施人工智能,你的第一步工作是什么?
回答:明智的做法是,花时间一起确定一个与公司整体目标相关的人工智能用例。此外,在没有彻底评估数据的情况下,很难承诺一个工作模型。因此,如果没有最初的数据分析,很难估计人工智能项目的具体业务影响。
7。你会如何对 C 级高管和员工进行人工智能教育?
回答:不仅要建立 AI 解决方案,还要在公司创造真正的数据/AI 文化,这一点至关重要。人工智能战略团队应该由产品经理、数据科学家、业务开发人员和最终用户组成。除了实践经验之外,还可以通过现场课程和在线课程的结合来完成员工教育。
8.人工智能战略的五个核心组成部分是什么?
答案:AI 战略的核心组成部分是数据、基础设施、算法、技能和组织
9。您将如何帮助一家小公司改进其数据战略?
回答:首先,发现公司的数据成熟度水*是关键。通常,公司已经拥有解决业务问题所需的数据,但决策者根本不知道如何利用这些数据做出关键决策。公司可以通过具体说明他们需要解决的业务问题和机会来鼓励更全面地看待数据。此外,现有的 IT 体系结构可能会阻止孤立信息的集成,并且管理非结构化数据通常超出了传统 IT 能力的范围。
10。如果一家公司缺少项目数据,你会向他们推荐什么?
回答:很明显,要看项目性质。在探索技术解决方案之前,预先建立一个数据收集机制或者依赖开源数据可能是值得的。ML 有很多可用的数据,有些公司已经准备好免费赠送了。为了获得相关数据,与其他组织建立伙伴关系可能是有益的。
一般来说,机器学习算法越简单,它从小数据集学习的效果就越好。从 ML 的角度来看,小的数据需要具有低复杂性(或高偏差)的模型,以避免模型过度适应数据。我注意到朴素贝叶斯算法是最简单的分类器之一,因此可以从相对较小的数据集中很好地学习。
你也可以依靠其他线性模型和决策树。事实上,它们在小数据集上的表现也相对较好。基本上,简单模型能够比更复杂的模型(神经网络)更好地从小数据集学习,因为它们本质上试图学习更少。
对于非常小的数据集,贝叶斯方法通常是同类中最好的,尽管结果可能对你之前的选择很敏感。我认为朴素贝叶斯分类器和岭回归是最好的预测模型。
当你没有足够的目标训练数据,源域和目标域有些相似但不完全相同时,就要考虑迁移学习技术。
数据扩充意味着增加数据点的数量。就传统的行/列格式数据而言,这意味着增加行或对象的数量。最后,合成少数过采样技术(SMOTE)和改进的 SMOTE 是产生合成数据的两种技术。简而言之,SMOTE 获取少数类数据点,并创建位于由直线连接的任意两个最*数据点之间的新数据点。
面试——第三部分(常识)
此时,我只被问了三个问题:
1。你能描述一下你最新的 AI 项目吗?
回答(取决于你过去的项目):我不得不开发一个可以根据消费者上传的图片识别假货的解决方案。作为团队的一部分,我们使用迁移学习创建了一个基于定制深度学习 CNN 模型的解决方案。在项目期间,我们最大的问题是公司缺乏数据和可扩展性。我们依靠数据扩充技术和合成数据解决了这个问题。
2。你能说出与人工智能相关的新商业模式吗?
回答:一些的例子可以包括智慧城市&数据货币化、预测性维护和工业 4.0、联邦学习和医疗保健数据等。【 如果你认识其他人,请在评论里提及 】
3。什么样的重大进化会影响人工智能的发展?
回答:日益增长的人工智能民主化和低代码/无代码人工智能工具的发展可能会扰乱人工智能项目的管理方式。
外卖食品
- 人工智能顾问不仅仅是数据科学家。他们必须协助设计从需求到部署的整体系统,管理项目(项目管理技能),并帮助提供能力建设方面的专业知识,以便 DevOps 团队的内部资源可以支持人工智能基础设施和代码。
- 我建议确保你理解基本概念,如偏差-方差权衡、过度拟合、梯度下降、L1/L2 正则化、贝叶斯定理等。
- 从商业的角度理解一个人工智能项目(KPI,长期目标,可扩展性等。)
- 你将面临挑战,挑战你以一种简单而精确的方式组织你的想法和呈现复杂概念的能力
我成为 Kaggle 大师的旅程
原文:https://towardsdatascience.com/how-i-became-kaggle-3x-expert-in-just-1-month-b63b37b53865?source=collection_archive---------14-----------------------
先说说我成为三大类 Kaggle 专家,后来成为笔记本高手的故事。此外,为 Kaggle 获得开始新生活的提示!

作者塑造的卡格尔形象
在本文中,我将与您讨论我成为数据集、笔记本和讨论类别的 kaggle 专家的小小里程碑式成就。这篇文章将与我通常写的文章不同。这本书对我来说非常特别,因为它将描述我成为一名卡格尔 3X 专家和后来的大师的旅程。我将讲述我在短短一个月内成为 Kaggle 专家的旅程,以及任何人如何凭借两件事坚持和奉献达到那个水*。

帕拉斯·瓦什尼·卡格尔
那是我在学院读计算机专业本科二年级的时候。我的朋友向我介绍了一个新的研究领域,即数据科学和机器学习。我很快就对这个领域有了更多的了解,并开始探索新的事物和技术来扰乱机器学习。很快,我知道了一个叫 Kaggle 的东西,每个人都在谈论它,但我不知道它是什么?我试图探索更多关于它的信息,发现它真的是一个很酷的*台,人们可以在这里参加 ML 比赛并分享公共笔记本和数据集。此外,讨论也是 Kaggle 的一个令人惊叹的部分,在这里,人们可以与全球各地令人惊叹的数据科学家交谈,了解他们的更多知识,并询问任何形式的公共疑问或分享知识。我变得好奇,想知道更多,并渴望参与 Kaggle 上的全球活动,但我只是这个广阔领域的新手,没有任何从事好项目的好经验。
[## 如何建立一个能让你找到工作的数据科学投资组合?
学会制作一个关于你的强有力的作品集!
towardsdatascience.com](/how-to-build-a-data-science-portfolio-that-can-get-you-a-job-9f8d113739b3)
然后我决定积累我的技能,然后潜入 Kaggle。随着时间的推移,我开始努力提高我的 ML sills,随着时间的推移,我学到了更多,超时参加当地和地区的黑客马拉松,并为 Kaggle 做好准备。
然后在新冠肺炎·疫情时期,我被迫关在我的住处,有很多空闲时间和我在一起。然后我在 2020 年 5 月中旬的某个时候决定,现在我想我已经准备好加入 Kaggle 了。2020 年 6 月 3 日,我在 Kaggle 上创建了自己的账户,并开始深入探索这个*台。我开始在讨论中与人们讨论如何从 Kaggle 开始,社区给了我很大的帮助。我在讨论区的第一篇帖子是“ 帮我从 Kaggle 开始! 。我很快就在那次讨论中获得了金牌,这足以给我最初的动力,并推动我从社区支持中学习和探索更多。
很快,我决定写公共笔记本,研究数据集。我同时参加了知识和荣誉竞赛。我参加的第一个经典比赛是“泰坦尼克号:从灾难中学习机器”,我应该说这是 Kaggle 比赛的最佳起点之一。我写了一个笔记本,并随着时间的推移不断更新,建立了一个结构良好的计划,以便在竞争中取得有利地位。即使付出了很多努力,我甚至没有进入前 10%的人群,这让我很伤心。然后我做了一些研究,发现人们在比赛中发布公共笔记本,大多数顶级竞争者使用好的公共笔记本/数据集进行集成和堆叠,形成更好的模型。哇!我完全被这种合作水*的作品所震惊了。然后,我开始阅读其他参与者的笔记本,他们的作品,如果我发现有什么难以理解的地方,就和作者讨论。我很快就进入了比赛参与者的前 3%,非常高兴。
然后我开始给 kaggle 更多的时间,很快在一个月内,我就获得了笔记本、数据集和讨论类别的 3 个专家徽章。我知道这些徽章只是为了我们自己的兴奋,并不能定义数据科学家的知识和技能水*,但在我内心的某个地方,我对自己在很短时间内的学习水*感到非常兴奋。我开始在笔记本部分做更多的工作,听取顶级数据科学家对我的工作的建议,从我的错误中吸取教训,继续努力写好东西,然后在接下来的 2 个月里,我成为了笔记本大师,这对我来说真是一种激动人心的感觉。

我最*成为笔记本高手的活动
随着时间的推移,我真的很高兴能学到更多,并与了不起的人一起工作,并在我的旅程中遇到了非常酷的人。我很幸运得到数据科学社区的支持,我喜欢与优秀的人互动,从他们的工作和经验中学习,并与他们分享我的经验。
我现在希望在竞争数据科学方面做更多的工作,并更多地参与竞争部分,在 Kaggle 上进行非常酷的竞赛。如果你是一个阅读这篇文章的初学者,我希望这篇文章能给你一些动力去使用 Kaggle,以及你如何从这个*台上成倍地学习。非常感谢你阅读这篇文章。你可以在 My Medium 上浏览我的其他帖子,关注统计学、机器学习和数据科学。享受阅读!
是的。!你可以在这里阅读我的其他相关文章:
[## 如何评价 Python 中机器学习模型性能?
一个实用的方法来计算模型的性能和在 Python 中的实现,涵盖了所有数学…
towardsdatascience.com](/how-to-evaluate-machine-learning-model-performance-in-python-135b4ae27f7e) [## k-最*邻解释-第 1 部分
KNN 算法背后的科学解释!
towardsdatascience.com](/k-nearest-neighbour-explained-part-1-5e5e9192050) [## 禁闭期间如何保证自己的健身?
在封锁期间,你应该遵循的健身策略,以保持你的身体和精神能力!
medium.com](https://medium.com/analytics-vidhya/how-to-ensure-your-fitness-during-the-lockdown-7c7018aeaf75)
我会在另一篇有趣的文章中看到你,在机器学习和数据科学的世界中有一些新的和令人惊讶的事情。在那之前保持安全!
谢谢你!
我如何增强我在数据科学领域的信心
原文:https://towardsdatascience.com/how-i-boost-my-confidence-in-data-science-field-be70953bb69d?source=collection_archive---------77-----------------------
提升数据科学技能的技巧

布拉德·巴莫尔在 Unsplash 上的照片
知道机器学习和深度学习算法是可以接受的。但是,导入算法并通过输入数据来使用这些算法并不是更好地利用数据科学技术的正确做法。我们可以在 Linkedin 上找到很多人的 bio 是机器学习,人工智能,python。但是在你的日常工作中运用它们是具有挑战性的。这就需要获得曝光,并对算法有更好的理解。
我们在数据科学领域的主要目标是有效地使用数据科学家开发的算法。但是,如果我们不知道算法,比如什么进去了,什么出来了,以及黑盒内部发生了什么,我们可能不会有效地使用它们。
在本文中,我将讨论一些更好的方法来改变你对数据科学的看法。以及如何利用数据科学技术更好地想象世界,并在日常生活中有效地使用它们。
更好的 Linkedin 连接
Linkedin 是丰富你的知识和拓宽你对数据科学的思维的有效工具之一。但是,有些人像脸书一样使用它。在添加任何连接的同时,我们应该专注于添加高质量的连接。我们应该在他们的个人资料中检查他们的兴趣,然后只有我们应该将他们添加到连接列表中。这是必要的,因为 Linkedin 算法向你展示了你的人脉所喜欢和分享的帖子。
[## Pranjal Saxena -自动化工程师-凯捷| LinkedIn
在凯捷有 2.3 年的经验,拥有基于 Python、Django、机器学习、Deep…
www.linkedin.com](https://www.linkedin.com/in/pranjalai/)
你添加的相似思维联系越多,你从这个*台上获得的积极效果就越多。社交媒体直接影响我们未来的行动,因此我们需要在这方面更加关注。
阅读文章
当我们写文章时,我们尽最大努力与他人分享知识。此外,阅读和写作直接影响我们的大脑,而不是看视频。因为当我们阅读一些东西时,我们会用大脑将前面句子中的东西关联起来,从而更好地学习,但在观看视频时,我们可以自由地做任何让我们失去焦点的事情。
Medium 有一个更好的出版物列表,提供了对数据科学更好的见解。
走向数据科学
《走向数据科学》(也称为 TDS)是一个著名的出版物,拥有一批优秀的作者,他们贡献出自己的最佳知识来撰写文章。TDS 有一个非常活跃的社区,在撰写高质量文章方面拥有更好的知识和技能。他们通过人工阅读来检查每篇文章,检查各种语法错误,这样读者就不会遇到任何困难。基于你之前的阅读,他们也有更好的推荐。
[## 走向数据科学
共享概念、想法和代码的媒体出版物。
towardsdatascience.com](https://towardsdatascience.com)
走向人工智能
专注于技术、科学和工程。他们有一个更好的社区,为读者提供更好的阅读体验。
[## 走向人工智能——多学科科学杂志
《走向人工智能》是世界领先的多学科科学出版物。走向人工智能出版最好的技术,科学…
medium.com](https://medium.com/towards-artificial-intelligence)
参与真实项目
在我们向世界展示知识之前,知识没有任何用处。阅读许多文章可以让你洞察到如何更好地利用数据科学。现在,轮到您来看看哪些手动任务可以自动化。请从最小的开始,比如使用笔记本电脑摄像头识别人脸,然后添加深度学习来识别人脸,最后添加到闭路电视摄像头来识别您的客人。你能想多广取决于你自己。
结束点
如今数据科学正在蓬勃发展,许多人都对数据科学和机器学习技术感兴趣。但是,这里的关键点是在日常生活中使用数据科学。将您的数据科学技能转化为现实生活。建立机器学习模型是容易的,但主要目标是在现实世界中使用它们。为此,我们必须专注于建立更好的联系,阅读更好的材料,以拓宽我们的思维。
我是如何闯入数据科学的
原文:https://towardsdatascience.com/how-i-broke-into-data-science-8f782cc200f4?source=collection_archive---------15-----------------------
一名软件工程师在 Yelp 和优步的数据科学之旅

由卢克·切瑟在 Unsplash 上拍摄的照片
我不会讨论成为一名数据科学家所需的具体资格和技能;关于这个主题有很多资源,这取决于你对什么样的工作感兴趣。相反,我将谈谈我进入数据科学(DS)的旅程,以及帮助我进入该领域的一般思维方式和习惯。最后,不管你的背景如何,我都会回顾一些要点,希望能帮助你打入 DS 。
本人从未打算过渡到 DS;我也没有这样做的传统背景或教育。幸运的是,我的工程背景教会了我如何批判性地编程和思考,但更重要的是如何学习和坚持。通过阅读论文和做兼职项目,我几乎自学了所有的东西。没有我的导师和他们诚实而有建设性的反馈,我也不可能做到这一点。
在学习了几年软件工程(SE)之后,我作为 SE 实习生加入了 Yelp,从事与 DS 相关的项目。大约一年后,我以 DS 实习生的身份加入了优步,并在那之后不久毕业。这是我如何过渡到 DS 的故事,为什么我决定切换回 SE,以及我在这六年期间学到了什么。
开头
2012 年开始在滑铁卢大学学习机电一体化工程专业。我总是着迷于如何通过建造直接帮助人们的东西来积极影响他们的生活。我最初认为这只能通过建造实物来实现,比如机器人,但我最终意识到你可以通过软件来实现类似的目标;这也是为什么 2014 年我从机电工程转行做 SE 的原因。
刚开始做 SE 不久,就开始听说机器学习(ML)。我对 ML 的兴趣驱使我在空闲时间开始学习它,尽管只是表面水*。与此同时,我继续学习如何成为一名更好的软件工程师,主要是通过实习。
涉足机器学习
我进入曼梯·里的旅程*安无事地开始了。我没能完成吴恩达臭名昭著的机器学习课程;并且没能完成一个本科计算机视觉研究项目。至少我通过了统计学入门课程,这是我在大学里唯一上过的统计学课程。由于统计学是 ML 和 DS 的基础组成部分,至少有一件事是对的。
在我向 DS 过渡的过程中,这是一段没有收获的时期。我更关注的是获得在美国的 SE 实习机会。2015 年冬天,我终于在加州山景城的一家初创公司找到了实习机会。我用的 k-NN 和一个分析仪表板构建了一个简单的推荐系统。在这些项目中的工作向我展示了如何利用数据和分析来获得有助于制造优秀产品的见解。这激起了我足够的兴趣,最终我对 DS 和 ML 变得更加认真。
钻研数据科学和机器学习
2015 年秋天,我在 Yelp 找到了一份 SE 实习工作。我加入了流量质量团队,该团队有一个广泛的目标,即识别和防止欺诈和滥用。我很幸运能够从事与 DS 相关的项目,尽管我是作为 SE 实习生被聘用的。
我在实习期间有些挣扎,但我在那里学到了很多东西。了解了有监督和无监督 ML,统计建模,如何进行严谨的探索性分析,以及用于管理大量数据的基础设施。我认识到理解你的数据和分析方法是至关重要的,否则事情可能不会像预期的那样进行。作为一名工程师,通常将方法和数据视为黑盒和抽象就足够了——但这在 ds 中并不总是有效。例如,一些方法及其参数仅适用于特定类型的数据,并且需要某些假设。
当时,我开始阅读 ML 论文,以便在实习期间更有效地使用这些工具,如随机森林、 k-means 和逻辑回归。我真的不认为这是一次真正的 DS 实习,因为我缺乏基础知识,没有与许多同事合作,并且在实习期间需要很多指导。
我在 Yelp 的经历给了我处理更具挑战性项目的信心。在我们的 Yelp 黑客马拉松上,我和我的团队构建了一个逻辑回归分类器来识别 SLAPP 企业。这让我明白,检索和处理你的数据与程序或算法一样重要——如果不是更重要的话。在另一个黑客马拉松上,我和我的团队为 Messenger(在 Messenger 的虚拟助手出现之前)构建了一个聊天机器人;它能够回答查询和执行命令。2016 年,我与一名博士后合作了几个月,利用新颖的深度学习方法构建了一个在移动设备上运行的面部识别系统。对于一个学校项目,我们的团队选择在 Messenger APIs 上构建一个对话分析工具,它可以洞察不同的对话,如情感,主题和常用词。
在成功完成这些项目并于 2016 年夏天在 Snap 进行了另一次 se 实习后,我决定终于是时候追求一些新的东西了。我以为可以是 ML 和里的东西而不是 DS。
认真考虑数据科学
2016 年秋天,我考虑的只有 SE 和 ML 实习。在参加了优步 DS 信息会议后,我意识到这可能是一个很好的机会,因为数据科学家们从事的项目很有趣,人们看起来很有才华。我决定申请。这将是我申请的唯一一个副主任职位。
出于几个原因,我仍然没有投入到优步 DS 实习中。我专注于获得 SE 和 ML 实习机会;我没有时间为 DS 面试做准备。我知道 DS 的实习机会非常抢手;只有一个职位,但有数百名申请人(这在我们大学的求职公告板上可以看到)。我与许多有正式 DS 背景的有能力和热情的同行竞争。尽管如此,不被太投入的一个好处是,在面试过程中,它给了我很多内心的*静;通常我一想到面试就会变得焦虑。
在申请优步大学后不久,我接受了 DS 挑战。它包括编写 SQL、设计实验和进行探索性分析——所有这些都与优步有关。这使得它新颖有趣;在做这个挑战的时候,我确实学到了一些东西。在提交了我的解决方案后,招聘人员主动安排了一个小时的面试,我觉得一切顺利。几周后,招聘人员告诉我,我是他们实习的第一人选——我既惊讶又欣喜若狂!
我意识到我的经历终于有了回报——从各种 SE 实习、ML 副业项目和 Yelp 的 DS 工作中。我想说这些经历弥补了我传统 DS 背景的不足;他们是让我的 DS 背景独一无二。
进入数据科学领域
此时,我必须在 SE 或 DS 实习之间做出选择。我将 DS 视为一种增长技能的方式,这种方式使将与其他软件工程师区分开来,比如学习更多关于分析、最新研究、ML 和统计学的知识。我把 DS 看作是一个学习比我最初打算的更广阔领域的机会。凭借我在过去几年学到的一切,我突然意识到我已经做好了在优步取得成功的准备。出于这些原因,我决定接受优步 DS 2017 年冬季实习的邀请。
这是一次很棒的实习。我向业内一些最优秀的人学习,并有机会解决有趣且具有挑战性的问题。这和我在 Yelp 上的经历很相似,除了更加强调独立性、演示、交流结果和协作。在优步,我对自己的 DS 能力更有信心。这种信心帮助我在实习结束后从事更雄心勃勃的 DS 项目,比如我们的 SE 班级简介。在这一点上,我认真考虑进入 DS 全职。
在数据科学和软件工程之间抉择
2017 年秋天,我的最后一次实习是在 WhatsApp 的 SE 实习。2018 年,我即将毕业,我要回答的第一个问题是:我应该进 DS 还是 SE?
最终我决定和 WhatsApp 的 SE 一起走。SE 满足了我做一些能影响人们的事情的愿望。这种感觉在我在 WhatsApp 实习期间被重新点燃,因为它能够运送即时影响数十亿用户的产品。作为一名数据科学家,我没有这种感觉,因为对最终用户有额外的间接性;但是你确实通过分析和洞察极大地影响了产品。我观察到工程师和数据科学家的比例通常是几比一。SE 仍然是一个需求量很大的领域——有更多的职位,我认为它会提供更多的职业稳定性。
由于我的背景和经验,我觉得我在 SE 比 DS 更有优势。有许多背景非常适合 ds,这使它以自己的方式具有竞争力。我发现,研究最有趣问题的最佳数据科学家通常拥有物理学、经济学或运筹学博士学位。如果我想达到他们的成就,我必须非常努力地工作;我不确定我是否对 DS 有足够的热情去做这件事。我不认为这是放弃 DS,而是利用SE 和我的优势。
外卖
我决定进入 SE 已经两年了:我可以自信地说这是一个正确的决定。更重要的是,我不后悔投资 DS 的时间,这仍然是一次很棒的经历,我会毫不犹豫地再做一次。如果我能把我的旅程总结成几个要点,这就是我要说的。
学会如何学习
你应该调整你的学习风格以最适合你想要完成的目标。我发现学习 DS 和 ML 的最好方法是阅读研究论文和参与真正的项目——行动胜于语言。围绕学习建立一致性,比如每天学习。为你想要学习和完成的事情设定具体的目标,比如每周读一篇论文。
寻找导师并接受反馈
向他们寻求诚实和建设性的反馈,尤其是在你想擅长的领域。如果你没有导师,你可以通过工作或者通过相互联系找到一个;通常情况下,最好是通过人脉进行介绍,而不是做一封冷冰冰的邮件。确保你开诚布公,设定明确的期望,并与你当前和/或潜在的导师达成一致。
当你稳定的时候,冒险更容易
稳定可能意味着在事业上、经济上、情感上和/或身体上的稳定。我对工程和我在生活中的位置很满意;这给了我在 DS 和 ML 中探索、实验和失败的空间。稳定让你从第一次尝试就匆忙成功的压力中解脱出来。确保你快乐和稳定,如果你有一个安全网,尝试新事物会更容易。
拥抱缘分
我尝试了很多没有太多方向的东西。一旦优步 DS 的机会出现,我意识到我已经做好了抓住机会的准备。保持你的选择开放和耐心,一些伟大的事情可能就在眼前。
假装直到你成功
每个人都必须从某个地方开始。这很有挑战性,因为大多数时候,你被期望知道如何做这份工作,甚至在你被雇佣之前。这可以通过自学足够多的知识来得到这份工作来克服,然后在工作中学习其他一切——就像我在 Yelp 和优步所做的那样。在职学习通常质量更高,因为你可以解决实际问题,获得公司资源,与同事合作并向他们学习。经过足够的时间和毅力,你最终会成为真正的交易者,不再需要伪装。
我希望我的旅程表明,通过一点点努力和意外收获,你可以让自己抓住那些意想不到的机会。祝你一切顺利,我希望这有所帮助!
我很想听听你的意外之旅,你对这篇文章的看法,或者你是否觉得这很有用。请在下面的评论中告诉我你的想法。
我如何用 R 建立分类模型
原文:https://towardsdatascience.com/how-i-build-a-classification-model-with-r-800acc975555?source=collection_archive---------30-----------------------
虹膜数据集的探索与分析

分类是机器学习的一个非常重要的领域,因为它允许您基于某些特征创建类别。它现在被用在很多领域,比如市场营销,我们可以根据访问者的购买欲望对他们进行分类。我们刚刚在之前的一篇文章中讨论过。
在这一个我们将采取一套花卉和他们的特点。我们将分析这些花的不同特征,并尝试看看它们是否相关。这将有助于我们创建一个分类模型,每次我们给出一种花的特征,我们就可以知道它是哪个物种。

对于这个分析,我们将使用一个数据集,它来自一个非常著名的数据集银行 Kaggle。这个索引了 150 种花,人们把它们与一个物种和一些特征联系起来。
特色展示
让我们看看通过使用 summary 函数可以在这个数据集中找到什么。


我们可以看到这里有三个不同的物种:Setosa,Versicolor 和 Virginica,每个物种有 50 个记录。我们还可以看到,与其他特征相比,花瓣长度特征具有非常高的范围。如果我们深入研究,我们可以说第一个四分位数和中位数之间的巨大差异可能是由一个具有非常小花瓣的物种造成的。够投机!让我们一起深入这个数据集。
发现歧视性特征
研究每个物种的的哪个(些)特征以及在多大程度上区别对待将会很有趣。为了做到这一点,我们将从分析每个物种与其他物种的关系开始,以确定其中一个特征是否不在*均值中。如果是这样,我们将更精确地分析这个特征。
濑户沙
我们将从分析 Setosa 的特征之一是否远离*均值开始。

我们首先在一个变量和另一个变量中保存与刚毛藻属物种相关的特征的*均值,以及所有不是刚毛藻属的花。然后,我们可以绘制它。


我们可以立即看到花瓣长度特征似乎歧视 Setosa。现在我们只分析这个特性。
让我们比较一下 Setosa 和所有花的花瓣长度分布。



Setosa 的五分之一长度分布(红色)与全球五分之一长度分布(蓝色)
简直明目张胆!刚毛藻的花瓣比一般的花瓣要小得多。甚至似乎这种独特的特征歧视了我们这个物种。我们可以用 r 快速检查这些信息。

事实上,花瓣小于两厘米的花 100%都是刚毛花。
杂色的
让我们对云芝做同样的事情:


在这种情况下,我们可以看到,没有一个品种的*均特征偏离*均值太多。所以我们不会马上详细介绍这个物种。
弗吉尼亚


嗯,看起来海滨锦鸡儿花的花瓣数高于*均值,让我们分析一下海滨锦鸡儿花的花瓣长度在所有花中的分布。


弗吉尼亚的五分之一长度分布(红色)与全球五分之一长度分布(蓝色)
正如我们所看到的,似乎具有大花瓣的数据集的虹膜主要是海滨鸢尾。我们可以通过观察花瓣大于 5 厘米的花的比例来验证这一点

95.6%是海滨鸟,这个比例很大,让我们可以区分这个物种。
让我们回到云芝
正如我们所见,花瓣小于 2 厘米的花 100%是刚毛花,花瓣大于 5 厘米的花 95.6%是海滨花。所以顺理成章的是云芝介于两者之间。让我们来看看这个:

85%花瓣长度在 2 到 5 厘米之间的花是杂色花。

我们可以很快看到,缺少的 15%是在弗吉尼亚号上。
所以我们可以看到花瓣的大小是一个特征,似乎可以很好地区分所有的鸢尾物种。所以在我们建立模型的时候使用它是非常重要的。
特征之间的相关性
在这一部分,我们将试图找到相关性或去相关性。首先,我们将观察在同一物种中,某些特征是否会影响其他特征。然后我们将比较所有花的一些特征。
同一物种内的相关性
corrplot 函数允许我们拥有一个相关表。我们可以将这个函数应用到我们的数据集,方法是分离出同一物种的花朵。




这些相关表允许我们做更多的分析:
- 首先,很明显,萼片大小的演变与萼片宽度的演变成正比(海滨锦鸡儿和刚毛锦鸡儿)。
- 我们还可以注意到更令人惊讶的事情:例如,在海滨锦鸡儿中,萼片的大小与花瓣的大小相关。
不同功能的比较
通过比较我们在这些花上的不同特征,并按物种对它们进行分类,我们将能够看到除了之前看到的花瓣大小之外,是否还有其他特征允许我们区分物种。
我们将根据萼片的宽度来显示其大小。我们将对花瓣做同样的处理,最后我们将根据萼片的大小显示花瓣的大小。




我们可以看到,第一张图不允许我们对物种进行分类,另一方面,另外两张图显示了物种之间相当清晰的分界线。刚毛藻的花瓣和萼片明显比其他种类的小。海滨种有最长最厚的花瓣和萼片。杂色种介于两者之间,与海滨种有些混合。在对不同的特征及其相互关系进行了长时间的分析之后,我们将能够建立一个模型,根据这些花的特征来猜测它们的种类。
构建分类模型
如果分析做得好,模型的创建和训练应该不会花太多时间。为此,我们将使用 Python,首先加载数据,区分标签和要素。然后,我们将构建两组数据,一组用于训练我们的模型,另一组用于测试它。最后,我们将训练我们的模型,并用测试数据集进行测试。
加载数据

数据现已加载!
我们在一边有 X,它包含我们之前看到的特征,在另一边有 y,它包含花的物种名称,这是我们想要让我们的算法猜测的。
拆分数据

分割数据将允许我们在从未见过的数据上测试我们的模型。
缩放数据
缩放数据通常会产生更好的结果。我们用 sklearn 来做。

训练和测试我们的模型
因为班级被很好的分开,KNN 模式可能是一个很好的选择

我们用这个模型得到了一些很好的结果!!
最后
我们可以通过一个简化的例子看到,为了获得一个好的分类模型,找到允许我们区分我们的类(这里是物种)的特征是很重要的。
只有四种不同的特征,我们能够在 95%的情况下预测花的种类。
因此,我们很容易想象像 PlantNet 这样的应用程序,通过它的智能手机,我们可以识别花卉的种类,使用更多的功能,并获得更多不同种类的精确数据。
我是如何造出一个机器人来打败霸王龙的!
原文:https://towardsdatascience.com/how-i-built-a-bot-to-beat-t-rex-run-3252a47cdcc6?source=collection_archive---------24-----------------------
这篇文章将解释从头开始构建你自己的机器人的一步一步的过程,它将无限期地玩谷歌的 T-Rex 游戏。

简介
T-Rex run game 是一款我相信每个人都玩过的游戏,他们有一部手机或一台装有谷歌 Chrome 的笔记本电脑,但没有连接互联网。对于那些不知道的人,只要关掉手机或笔记本电脑的互联网连接,打开任何一个使用谷歌浏览器的网站,你就可以玩霸王龙快跑了!游戏的基本目标是跳跃或闪避障碍物,让你的恐龙活着。然而,作为人类,我们可能会感到无聊或分心,可能会失去游戏。为了最大限度地打败这个游戏,我们需要一个极度专注的人,一个不会被这个世界上的任何事情分心的人,一个像机器人一样的人!
在这里,我将教你如何构建一个简单的机器人,它将为你玩霸王龙奔跑的游戏,而你可以安静地坐着看它玩(虽然这违背了任何游戏的全部目的,但它只是为了好玩)。
先决条件
我将使用图像处理库在 python 中构建这个机器人。首先,您需要在 PC 或笔记本电脑上安装 Python 3.6 或更高版本。这是你需要安装的库的列表—
- pyautogui——这是一个具有与 T-Rex 运行 gui 交互功能的库
- PIL——PIL 图书馆用于获取屏幕截图并对其进行图像处理
- 时间——用于给出跳跃之间的不同延迟
这些库可以使用命令“pip install
然后,我们通过以下代码片段将我们的先决条件加载到我们的代码中—
import pyautogui
from time import sleep
from PIL import ImageGrab,ImageOps
逻辑
现在,进入文章的主要部分。所以我们在建造机器人时遵循的基本逻辑是模仿人类玩游戏的方式。一个人看到了障碍,并试图为恐龙跳跃计时以避开障碍。对于我们的机器人,我们将做同样的事情。基本上,这里我们截取了霸王龙游戏屏幕的截图,并检查图像中树或鸟障碍物的位置,如果障碍物足够靠*恐龙(使用代码中定义的阈值定义),我们会要求恐龙跳跃
我正在使用这个我随机找到的网站,这是同一个霸王龙游戏,但在互联网上——http://www.trex-game.skipser.com/。
第一步是获取游戏网页的屏幕截图,并定位恐龙的精确像素值。我们找到恐龙的顶角和底角像素值。这可以通过将图像导入 paint.net 并找到像素值来完成。另外,如果你注意到,恐龙的位置是不变的,只有障碍物在向它移动。因此,我们采用这种方法,根据恐龙相对于向前移动的障碍物的静态位置,在恐龙上创建一个动作。下图显示了我们如何使用标尺和网格视图获得恐龙图像的像素位置。通常一幅图像中所有像素值的总和是一个数,如果图像不变,总和总是保持不变。我们将牢记这一点,并在接下来的几段中解释为什么这很重要。

类似地,当一棵树、一只鸟和重放按钮出现时,我们截取游戏的屏幕截图,并记下其像素位置。这不是现在所要求的,但是在将来会很有帮助。
功能和编码
在这个游戏中有 5 个不同的对象-恐龙,树 1,树 2,鸟和重播按钮,如果你崩溃了。你可以使用我为每个字符使用的像素位置值。为了简单起见,我使用了一个类定义来保存这些值。这是如何看起来—
class coordinates():
replay=(353,388)
tree1=(195,416)
tree2=(245,433)
bird=(155,379)
dino=(170,391)
下一步是实际编写这段代码的逻辑。我们为不同的过程或目标创建不同的功能。
首先,我们创建一个函数,它将捕获游戏中的每一帧或截取每一帧的屏幕截图,以便对其进行处理。就像人类玩游戏时如何看待游戏一样,机器人也需要使用截图来看待游戏。这显示在下面的代码片段中。
def imagegrab():
box= (coordinates.dino[0]+20,coordinates.dino[1],coordinates.dino[0]+100, coordinates.dino[1]+30) image = ImageGrab.grab(box)
grayimage = ImageOps.grayscale(image)
a = array(grayimage.getcolors())
return a.sum()
在上面的函数 imagegrab()中,我们获得恐龙的坐标,并在它周围创建一个框。基本上,盒子是一个矩形,每个角有 4 个像素位置值,恐龙在盒子里面。盒子在恐龙的右边有一些开放的空间。然后,我们对盒子进行截屏,盒子的行为就像我们创建跳跃或闪避动作的逻辑一样。这里的基本逻辑是,如果一棵树或一只鸟进入盒子,恐龙被要求分别跳跃或躲避。
但是机器人实际上看不到屏幕截图或者盒子里面发生了什么。机器人只能看到和读取像素。因此,正如上一节所暗示的,我们计算盒子中所有像素的总和。由于恐龙和盒子的图像是恒定的,并且恐龙没有移动,所以盒子中的像素总和总是返回一个常数。但是,如果一棵树或一只鸟进入盒子,总和值实际上会根据像素值增加或减少,这时机器人会得到跳或蹲的提示。下图取代了屏幕截图或框的外观。

一旦我们有了恐龙和盒子的图像,我们就将盒子转换成灰度以增加我们的处理,因为颜色在这里不是一个重要的因素,因为我们只需要计算盒子中像素值的总和。
我们写的下一个函数是跳转函数,它基本上是当一棵树出现时要求机器人跳转。Puautogui 库用于模拟键盘控制,使机器人能够与游戏互动。
类似地,编写了一个 duck 函数。你可以在这里阅读更多关于 pyautogui 的信息——https://pyautogui.readthedocs.io/en/latest/keyboard.html
def jump():
pyautogui.keyDown('space')
sleep(0.05)
pyautogui.keyUp('space')
sleep(0.05)def duck():
pyautogui.keyDown('down')
sleep(0.05)
pyautogui.keyUp('down')
sleep(0.05)
我们写的下一个函数是重启游戏。如果偶然机器人失败(非常低的机会),它应该自动重新启动,没有人类的帮助。我们使用重放按钮坐标并模拟在该位置的点击。下面是它的代码片段。
def restart():
pyautogui.click(coordinates.replay)
一旦完成了所有的函数,我们就可以编写并运行我们的主函数了。下面的代码片段显示了 main 函数。
def main():
restart()
while True:
imagegrab()
if(imagegrab()!=2646):
jump()
sleep(0.001)If __name__=="__main__":
main()
结果
这就是机器人无限期运行的方式,也是我们击败霸王龙运行游戏的方式。这个逻辑也可以用在许多不同的游戏中,也就是使用像素值总和的逻辑。我们应该始终考虑到机器人只能看到像素,其他什么也看不到。对于未来的范围,我们实际上可以使用 OpenCV 和其他图像处理技术动态地计算和找到树和鸟的位置值(我计划在我的下一篇博客中介绍)。
感谢您的时间,希望它是有益的。
我如何建立一个电晕统计 Twitter 机器人
原文:https://towardsdatascience.com/how-i-built-a-corona-stats-twitter-bot-4f0dc90cf96e?source=collection_archive---------65-----------------------
我如何用 Python,Pandas 和 Tweepy 制作了一个包含新冠肺炎每日统计数据的机器人。

迪米特里·卡拉斯泰列夫在 Unsplash 上的照片
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
2020 年 3 月初,新冠肺炎疫情在德国获得了牵引力。每一个主要的新闻版面和报纸都刊登了关于新感染和事实的图表和统计数据。大多数人有一个共同点:他们从约翰·霍普金斯大学获取数据,并在 GitHub 免费发布数据集。我在玩 Python 和熊猫,我在寻找一个好的项目。这是我决定创建一个从 JHU 获取所有数据的 Twitter 机器人的时刻。我在清理数据,创造情节,发推文。这篇文章描述了我如何使用和清理数据集,以及如何用不到 150 行代码发布推文。全部代码在我的 GitHub 。
获取数据并清理干净!
在我们用统计数据创建一个机器人之前,我们需要一些数据。这是我的计划:
- 我的机器人应该显示全球和德国的感染人数。
- 我希望显示与前一天相比的新感染。
- 我在计算一周内的增长百分比。
- 该机器人应该有一个与人口相关的感染线图附加的图像。
幸运的是, JHU 有一个数据集,它提供了我需要的一切。我已经创建了一个小助手模块来做清理和绘图。主要的方法是“get_clean_data”和“plot_diagram”。让我们深入研究数据清理。
第一步是将 CSV 读入 Pandas 数据帧并删除未使用的列。熊猫可以从给定的 URL 读取 CSV。由于 JHU 提供每日更新的时间序列数据 CSV,我不必担心获得最新的 CSV。在该数据集中,一些国家深入到其所在的州。要获得一个国家的所有汇总数字,我必须按“国家/地区”分组。分组之后,我得到了德国的数据框架,并对其进行了总结。我对所有数字做了同样的处理,得到未分组数据的总和。现在我有了两个新的数据框,分别是德国和世界各地的数据。最后一步是删除未使用的列,并添加与人群相关的感染的计算值。相应的方法是自我解释。
清洁就这些了。现在让我们添加一些我在 Twitter 机器人中使用的更有趣的事实。
计算一些有趣的数据
为了检索实际被感染的人数,我编写了一个返回数据的函数。
我增加了一个方法来得到与前一周相比的增长
绘制简单的图表
因为我想为每条 tweet 添加一张图片,所以我用 Matplotlib 绘制了一个简单的线图,并将其保存为 PNG。我写了一个小方法来绘制我的图表。
该方法获取必要的参数并保存图像。对于我的感染相关人群的图表,我添加了一个方便的方法用于我的机器人。
撰写一条推文并发送出去
我使用 Tweepy 与 Twitter API 对话。Tweepy 很容易理解,大约十行代码就可以发布推文。为了能够发推特,你必须在推特开发者门户注册一个应用程序以获得 API 密钥。一旦你得到了你的密钥和秘密,Tweepy 就可以使用了。
机器人本身是一个简单的 Python 脚本
代码易于管理。我正在用 CSV 的 URL 实例化我的助手模块,获取数据,绘图并用我的 Tweet 文本组成一个字符串。最后一步是启动 Tweepy,用给定的文本发布一条推文。
我在家里用覆盆子酱运行我的机器人。机器人脚本每天早上由 cron 作业执行。该机器人从 3 月 11 日开始运行,到目前为止没有任何故障。
我的推特机器人在推特上发布电晕统计数据
如你所见,编写一个简单的 Twitter 机器人很容易。如果你想进入主题,我建议你创建一些小项目。对我来说,用熊猫来清理和使用项目中的数据,并每天在我的 twitter 账户上发布我的见解,这很有趣。
在陷入欧洲最严重的冠状病毒爆发后,我如何用 Dash 和 Plotly 建立一个仪表板
原文:https://towardsdatascience.com/how-i-built-a-dashboard-with-dash-and-plotly-after-being-stuck-in-europes-worst-coronavirus-dc41aaeeca4b?source=collection_archive---------26-----------------------
如果你正在阅读这篇文章,我确信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过 Linkedin 来连线吧!请不要犹豫发送联系请求!Orhan g . yaln—Linkedin
此外,许多问题导致我们创建了一个用于冠状病毒更新的 Instagram 页面。您可以关注我们的每日更新: OUTBREAKSTATS
冠状病毒(新冠肺炎)的爆发已经以这样或那样的方式影响了每个人的生活。确诊人数在 10 万左右,死亡总人数超过 3000 人。出现确诊病例的国家数量接* 70 个。另一方面,比病毒更可怕的是。疫情爆发的成本已经达到数万亿美元,经济学家正在谈论全球经济衰退。这对 2020 年来说肯定不是一个好的开始。

米兰多摩爆发前后(来源:Unsplash)
意大利北部爆发电晕
因此,从中国到美国,从挪威到澳大利亚,我们到处都能看到冠状病毒的影响。然而,从统计数据来看,如果你生活在某些国家,你面临的风险更大,不幸的是,我经历了更严重的风险,因为我生活的城市博洛尼亚位于意大利北部,那里的疫情是欧洲最严重的。不幸的是,意大利的确诊病例总数已经超过 2000 例。

LN 转型的欧洲现状(来源: OutbreakStats )
作为一个不得不远离公众的人,我有一些空闲时间,相信我,我用大部分时间搜索冠状病毒爆发的最新进展。这种可怕的情况给了我在最坏的情况下做最好的事情的想法。
查找最新冠状病毒爆发数据的困难
搜索冠状病毒爆发统计数据是一项繁琐的工作,因为每次我都必须访问多个来源,以了解正在发生的事情。经过一番紧张的研究,我发现约翰·霍普金斯大学系统科学与工程中心发布的疫情数据每天更新。然而。csv 格式使得每次都难以获得有意义的见解。这就是为什么我们有数据可视化这个学科。

确认的冠状病毒病例表(可在 CSSE 获取)
用 Plotly 和 Dash 实现数据可视化
我在自我隔离期间所做的另一件事是在阴谋和破折号方面超越我的知识。
Plotly 是一个交互式 Python 数据可视化库。您可以使用 iPython 在几秒钟内生成漂亮的交互式图形。从 CSV 文件中提取见解是非常好的。有人可能会说,Plotly 是一个花哨的 Matplotlib 。与纯 Javascript 数据可视化库相比,使用 Plotly 的一个缺点是无法与其他人共享它,因为它使用 Python,一种后端语言(附:你可以通过这篇 文章 了解更多关于 Javascript 数据可视化库的信息)。
当我在想我不可能是唯一一个看到这个缺点的人时,我发现了 Dash。这些库背后的公司 Plotly 对 Dash 解释如下:
“Dash *台使数据科学团队能够专注于数据和模型,同时制作和共享基于 Python 和 R 模型的企业级分析应用。通常需要一个后端开发团队、前端开发团队完成的工作,都可以通过 Dash 来完成。”[ 阴谋地
我非常同意这种说法。多亏了 Dash,无论是后端还是前端,你都没有深入的知识。要构建和发布仪表板,Dash 和 Plotly 方面的知识就足够了。
对于这项任务,我的资历过高
另一方面,在过去的三个月里。我完成了三门 Udemy 课程:
- Python 和 Flask Bootcamp:使用 Flask 创建网站!何塞·波尔蒂利亚
- React —完整指南(包括挂钩、React 路由器、Redux)Maximilian Schwarzüller 著
- 何塞·波尔蒂利亚设计的带有 Plotly 和 Dash 的交互式 Python 仪表盘
有趣的是,Dash 构建在 Flask 之上作为后端,ReactJS 作为前端,并使用 Plotly 作为数据可视化工具。尽管我不需要了解 React 和 Flask,但当我试图弄清楚 Dash 背后的逻辑时,它还是派上了用场。因此,我想,作为一个被困在病毒爆发中并拥有新技术知识的人,为什么不利用我最*获得的技术知识来创建一个关于我这些天日常生活的仪表板呢?仪表板的想法对我来说是唯一的“在最坏的情况下做最好的事情”的想法。因此,我在以下来源的帮助下构建并发布了 OutbreakStats 仪表板:
我用于仪表板的来源
数据库
- CSSE 新冠肺炎数据集(每日更新)
新闻更新
- 新闻 API
等值区域图
- 地图框(您可以使用 Plotly 和 Dash 内的地图框地图)
技术知识:
- 何塞·波尔蒂利亚设计的带有 Plotly 和 Dash 的交互式 Python 仪表盘
计算机网络服务器
- Heroku (免费升级 Github 学生包)
- 突进部署指南
主题
- 破折号示例下的外汇网上交易主题
集成驱动电子设备
- 对于阴谋地洞察发现: Jupyter 笔记本
- 对于 Dash app: Visual Studio 代码
我对《阴谋与破折号》的思考
我之前和 Plotly 合作过,在 Upwork 和 Fiverr *台上做过一些自由职业者的工作。与 Matplotlib 和 Seaborn 相比,我的客户喜欢这个结果,因为 Plotly 也提供了交互性。能够发表我在 Plotly library 完成的工作是我学习 Dash 的主要动机。
到目前为止,我对 Dash 的体验如下:

Flask 是一个轻量级的 Python Web 框架
Dash 严重依赖 Flask,它几乎可以作为一个 Flask 应用程序。不可避免的会注意到 Dash 和 Flask 的相似之处。在 Dash app 中,构建仪表盘有两种组件类型:核心组件和 HTML 组件。
核心组件
Dash 为交互式用户界面配备了增压组件。由 Dash 团队编写和维护的一组核心组件可在 dash-core-components 库中找到。[ 仪表板文档
使用核心组件,您可以创建(i) Plotly graphs 和(ii)React 组件,如下拉菜单、滑块、输入。核心组件就像相对复杂的 React 组件,你可以在 Semantic-UI-React 或 Material-UI 中找到。不同之处在于,您使用 Python 将这些组件添加到您的仪表板中。不需要前端技能🥳.
HTML 组件
Dash 是一个 web 应用程序框架,围绕 HTML、CSS 和 JavaScript 提供纯 Python 抽象。仪表板文档
这些组件呈现基本的 HTML 标签,如
、
、。同样,不同之处在于您使用 Python 来添加这些组件。因此,你甚至不需要知道 HTML 就可以构建一个 Dash 应用。不需要标记语言技能🎉🍾。
其他观察
要添加自定义的 javascript、CSS、图片文件,你所要做的就是创建一个文件夹(必须命名为 资产 )并将所有文件存储在这个文件夹下。它们不需要任何导入或配置设置就可以工作,因为 Dash 已经这样配置了。
最后的想法
Dash 是一个 Flask 应用程序,专门为创建仪表板而定制。因此,你不必考虑每一个小细节,因为它们已经被 Dash 团队配置好了。只要您坚持使用文档来创建您的仪表板,开发过程就非常容易和快速。然而,如果你想定制应用程序并添加新功能,使其不仅仅是一个仪表板,可能会有缺点。
结论
我希望你喜欢这篇博文。在我以前的文章中,我通常分享我的源代码,因为它们更像是一个教程,而不是一篇博客文章。在本文中,我试图向您展示一种构建仪表板并为公众服务的方法。你可以在 OutbreakStats 访问我为冠状病毒爆发数据创建的网站,这里有一个预览:

OutbreakStats 仪表盘的预览
因此,生成仪表板代码取决于您的想象力。如果你仔细地遵循我在这篇文章的仪表板部分使用的资源,你甚至可以在一天内轻松地构建你自己的仪表板。
订阅邮件列表获取完整代码
如果你想在 Google Colab 上获得完整的代码,并获得我的最新内容,请订阅邮件列表:✉️
立即订阅
喜欢这篇文章
如果你喜欢这篇文章,可以考虑看看我的其他文章:
[## 使用 MNIST 数据集在 10 分钟内完成图像分类
towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d) [## 利用生成性对抗网络在 10 分钟内生成图像
使用无监督深度学习生成手写数字与深度卷积甘斯使用张量流和…
towardsdatascience.com](/image-generation-in-10-minutes-with-generative-adversarial-networks-c2afc56bfa3b)
我如何建立一个深度学习的表情符号 Slackbot😄 😖 😉
原文:https://towardsdatascience.com/how-i-built-a-deep-learning-powered-emoji-slackbot-5d3e59b76d0?source=collection_archive---------21-----------------------
还有为什么 AI 难的部分和 AI 没关系

晨酿在 Unsplash 上拍摄,作者编辑
当我在加州大学伯克利分校完成我的计算机系统博士论文时,我经常想知道人工智能世界的生活是什么样的。我的人工智能朋友们不断吹嘘深度学习将如何彻底改变从医学到网上购物的一切——他们的论文一经发布就获得了 100 次引用(见鬼!).但我一直很好奇他们到底是怎么用 AI 解决现实问题的。
与此同时,我最*注意到,我把大部分时间都花在了回应无聊的对话上。受到最*一篇博客帖子(经历了许多论文写作冷漠)的启发,我决定构建并部署一个深度学习驱动的 Slackbot,用最合适的表情符号自动添加对 Slack 帖子的反应。😃 👍
在这篇文章中,我回顾了我构建这个由 DeepMoji 驱动的 Slackbot 的经历。我最终使用两种不同的框架部署了 deep moji(AWSsage maker和 Algorithmia )。在这里,我比较了我使用这两个系统的经验,强调了预测服务系统的一些优势、局限性和改进的机会。这篇文章非常高级,但是这个库有详细说明和代码的链接来复制我的 Slackbot。
就我个人而言,过去几年我一直致力于可扩展的云系统。我特别兴奋地投入到这项任务中,因为我们最*花了一些时间思考可扩展预测基础设施。也就是说,我肯定不是人工智能系统的专家,所以如果我错过了什么,请告诉我。
步骤 0:设置 Slackbot
设置一个 Slackbot 相当简单,但是需要在 Slack 网站上点击很多次。我在这里用一些屏幕截图记录了这个过程,但在高层次上,我创建了一个机器人,将它链接到我的工作区,并授予它查看消息和添加表情符号反应的权限。
下一步:选择一个机器学习模型,让我的 Slackbot 能够用表情符号对文本做出反应!
步骤 1:在我的笔记本电脑上运行一个模型
那么我应该调用什么人工智能魔法呢?我没有训练模型的数据,但幸运的是,我可以重新利用大量预先训练好的模型。我的人工智能同事告诉我,这是模型设计的一个新兴趋势:从一个现有的模型开始,根据你的任务对它进行微调。在我的例子中,DeepMoji 模型正是我所需要的,并且已经被训练和开源。
对于一点点上下文,DeepMoji 在 12 亿条带有表情符号的推文中进行了训练,以理解语言情绪以及它如何与表情符号相关联。我的用例非常简单:向模型发送一条松弛的消息,并用模型认为最能反映消息情绪的表情符号做出反应。
坏消息:DeepMoji 用的是 Python 2(恶心)。好消息:HugginFace 的优秀人员开发了 torchMoji ,这是 DeepMoji 的 PyTorch 实现,支持 Python3。torchMoji 代码库有一个 bug,我必须修复它才能正确解析PackedSequence PyTorch 对象。工作版本可在我的叉子这里获得。这一部分只需要一台笔记本电脑,所以如果你有兴趣的话,你可以在家跟进。
随着 bug 的修复,获得训练过的模型是很容易的。首先,我将 torchMoji 作为一个包安装:
pip3 install git+https://github.com/cw75/torchMoji
我需要模型权重和词汇文件来初始化模型。词汇文件已经在 repo 中了(这里是)。为了下载权重,我运行了:
python3 scripts/download_weights.py
既然已经下载了所有的先决条件,那么做一个预测只需要几行 Python 代码:
您可以测试它以确保一切正常:
相当酷!我甚至不需要得到一个图形处理器。
下一步:用我的 Slackbot 可以调用的 REST web 接口把它变成一个预测服务!
步骤 2:建立预测服务
在这种情况下,服务预测是系统的挑战;让这个机器人真正工作的操作引擎。重要的问题是预测服务应该放在哪里?
一个简单的解决方案是将我上面写的预测脚本包装在一个 Flask 服务器中,并使用一个类似 ngrok 的工具在我的笔记本电脑或 EC2 实例上生成一个 REST 端点。问题是,我想将这个机器人部署到我实验室的 Slack 团队中,这样每个人都可以玩它,所以这个机器人需要始终在线并且可伸缩。
所以我需要一些真实的东西,作为一名系统黑客,我的一部分想要从头开始构建服务:将我的脚本打包成一个 Docker 映像,启动一个 Kubernetes 集群,并通过 AWS ELB 公开 REST 端点。
另一方面,作为一名研究人员,我不想重新发明轮子,我知道像谷歌、亚马逊和微软这样的云提供商都提供预测服务。第一个想到的*台是 AWS SageMaker,这是 AWS 上的一项托管服务,涵盖了从模型开发到部署的整个机器学习生命周期。该团队在 SIGMOD'20 上发布了一篇关于 SageMaker 的论文,我多年来一直在使用 AWS 服务进行研究,所以我认为这一定是合理的。我没有意识到我正步入深渊……
*台 1:亚马逊 SageMaker
我原以为在 SageMaker 上部署模型会很简单。我已经有了一个 Python 依赖列表和上面显示的预测脚本。我想做的只是将脚本、依赖项和模型上传到 SageMaker,创建一个 REST 端点,并将其连接到 Slackbot。
但是唉,没有办法上传一个模型到 SageMaker。相反,我必须构建一个 Docker 映像,其中安装了我所有的 Python 依赖项。我还必须编写一个 Flask 服务器来包装我的预测脚本,并响应 SageMaker 的健康检查和模型调用请求——你可以在这里看到文档,在这里看到 docker file,在这里看到我的 Flask 服务器。这并不复杂,但如果我不熟悉 Docker 和 Flask,这可能需要我一段时间才能弄明白。
我用 Docker 已经很多年了,但是我在 AI 的朋友对它不是很了解。你如何看待 Docker:建造容器是人工智能的最高水*吗?人们精通它吗?
我开始想知道 SageMaker 为我做了什么。如果我做了所有这些,为什么不运行我自己的 Kubernetes 集群呢?这甚至可能更简单,因为 Kubernetes 会自动为我进行健康检查!
SageMaker 与 DockerHub 不兼容,所以一旦我构建了 Docker 映像,我就必须将它推送到亚马逊自己的 Docker 注册表— AWS ECR (弹性容器注册表)。接下来,我创建了一个提取 Docker 图像的 SageMaker 模型和一个使用我的模型的 SageMaker“端点”。这需要选择节点类型(ml.m4.large)和集群大小。最后,我可以创建我的 REST 端点!
在等待我的服务开始 10 分钟后,我激动地看到状态从“正在创建”变为“正在服务”,并带有一个绿色的勾号。✅真棒!我将端点 URL 复制粘贴到我的 Slackbot 配置中,准备让实验室中的每个人眼花缭乱。然后……Slack 吐出了这个错误:
**Your URL didn't respond with the value of the challenge parameter.**
是时候排除 SageMaker 的故障了!我必须使用boto3(具有适当的权限)编写一个 Python 脚本,并调用[InvokeEndpoint](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_runtime_InvokeEndpoint.html)来测试端点。使用这个脚本调试半个小时,我发现端点本身实际上工作正常。真正的问题是 SageMaker 只能从 AWS 虚拟专用集群内的访问,并且不应该接受来自外部互联网的请求,所以 Slack 无法访问它!
根据这篇博客文章,解决方案是“简单地”使用 AWS’API Gateway服务接受来自 Slack 的流量,将请求路由到认证请求的 AWS Lambda 函数,然后使用 Lambda 将预测查询发送给 SageMaker。什么?!?这值得一个架构图:

作者图片
当我想做的只是让我的模型可以从网上访问时,这是一些疯狂的重定向!好的,那么…是时候写一个 Lambda 函数了。我总是对使用无服务器系统的机会感到兴奋——毕竟这是我大部分研究的重点——但是这个比我预期的要复杂一点。
实际上,这比我想象的要复杂得多。我必须响应 Slack 的“挑战请求”(第 24–29 行),验证每个请求以抵御黑客(第 31–37 行),并显式解析来自输入 HTTP 请求的文本字段(第 38–43 行),所有这些都是在我实际调用 SageMaker 模型(第 47–52 行)之前。最后,在第 55 行,我使用了 Slack Python API 客户端来添加对输入消息的反应。
到目前为止,还有一些值得注意的事情我已经跳过了:
- 我必须用
sagemaker:InvokeEndpoint策略创建一个 IAM 角色(AWS 的安全和认证服务),并将其分配给 Lambda 函数,以便它可以查询我的 SageMaker 端点。 - 当使用 Slack API 客户端时,我必须提供机器人的 OAuth 访问令牌(第 13 行)和签名秘密(第 15 行),它们对于每个 Slackbot 都是唯一的。
- 我必须显式地将第三方 Python 依赖项(Slack SDK)和 Lambda 函数脚本打包到一个 zip 文件中,并将其上传到 AWS Lambda。详情此处。
等等,那么…说真的,SageMaker 为我做了什么?我已经为我的模型构建了一个 Docker 容器,有效地编写了一个代理服务,手动验证了每个请求,还需要设置一个单独的 REST 端点。也许用 EC2 和 Kubernetes 手工做这件事会更容易些?
最后一步是创建一个 API 网关,将订阅消息从 Slack 路由到我的 Lambda 函数。一路走来,我陷入了我想象中的一些常见陷阱。例如,我忘了检查Use Lambda Proxy integration框,所以 API Gateway 在将请求转发给 Lambda 时剥离了每个请求的 HTTP 头。这导致了认证失败,因为 Slack 将其令牌嵌入到了报头中。我在这里记录了所有(许多)步骤,这样你就不会重复我的错误。
总之,这又花了一个小时来调试,但是 API Gateway 最终生成了一个真正的 REST 端点。我将端点粘贴到我的 Slackbot 的订阅中,它终于工作了!我向 Slack workspace 上的机器人发送了一条消息,得到了一个反应。😎

截图来自 时差 工作区
瞧啊。我花了 6 个小时才把所有的碎片拼在一起,但它终于工作了!每个请求需要几秒钟,这是…嗯,不是很互动。考虑到上面“架构图”中显示的流量,这并不奇怪。这些服务大多没有针对延迟进行优化。
总而言之,在 SageMaker 上部署 torchMoji 是一件痛苦的事情。更糟糕的是,在所有的努力之后,每个请求都花了一秒多的时间!更不用说成本了——除了保持模型服务器一直运行,我们现在还要为每次同步 Lambda 调用支付 AWS 费用。如果 RISELab Slack 上的所有 400+用户都开始玩这个机器人,它肯定不会便宜。
考虑到使用 SageMaker 不是在公园里散步,我对把更多的时间放在微软 Azure 和谷歌云的竞争服务上感到非常沮丧。但这可能是我的错误——如果你对这些产品有更好的体验,请在评论中告诉我。我很想了解更多!
相反,我决定研究一家我听说过的名为 Algorithmia 的初创公司——它专门从事模型部署和管理,所以希望它更容易使用…
*台 2:算法
在这些文档之后,我首先创建了一个与 Algorithmia 相关联的 Git 回购协议,并将我之前的预测脚本的一个略微修改的版本放入回购协议中。该脚本与我在本地使用的脚本非常相似——不需要担心设置 web 服务器和处理健康检查。我只需要修改几行基本的 Python 代码就可以使用 Algorithmia 的 API 了。开了个好头!
repo 还需要一个包含 Python 依赖项列表的requirements.txt文件。这是 Python 项目的标准操作程序,所以我很高兴看到我不需要做任何疯狂的事情。
在提交这些文件之后,我所要做的就是发布我的模型,并用一个版本号标记它(例如,0.0.1)。就这样,torchMoji 模型运行在 Algorithmia 的*台上——比 SageMaker 简单多了!
Algorithmia 的仪表盘有一个简洁的测试功能,我可以输入测试句子并获得表情符号输出。这真的很有帮助:我不需要另一个脚本来调用模型,以确保一切都如我在 SageMaker 中所做的那样正常工作。

截图来自algorithm ia*台
Algorithmia 还生成了多种语言的复制粘贴代码片段,我可以用它们来调用我的模型。Python 版本如下所示:
到目前为止,一切看起来都很好。但当谈到与 Slack 的集成时,Algorithmia 并不比 SageMaker 好。从这些文档中:
为了让您的 Slack 应用程序连接到 Algorithmia,您需要一个中间函数:和 API 端点,它可以接受来自 Slack 的 GET 请求,验证内容,然后发送到 Algorithmia 的一个 API。
我仍然需要之前的 Lambda glue 代码,这很难写。对我来说,好消息是我可以重用以前 Lambda 函数的大部分代码。我只需要将 SageMaker 端点调用替换为对 Algorithmia 的调用,因此——考虑到我第一次调试时已经花了几个小时——再做一次也没那么糟糕。😃完整的脚本可从这里获得。
尽管如此,让我感到奇怪的是,Algorithmia 应该是一个 无服务器模式的服务*台。但是为了与我的 Slackbot 集成,我不得不使用的另一个无服务器*台(AWS Lambda)来路由流量和执行安全检查。端到端延迟保持在个位数秒,因为请求仍然必须经过三跳:从 Slack 到 API 网关,从 API 网关到 Lambda,以及从 Lambda 到 Algorithmia。
我不禁想知道:如果把它与 Slack 等其他服务联系起来仍然如此痛苦,那么把我的模型放进一个盒子里有什么意义——不管是 SageMaker 还是 Algorithmia。如果“连接”意味着我必须了解、配置和支付另外两个服务,那么如果我将预测代码放入我的 Lambda 函数并完全跳过特殊用途的服务,岂不是更容易?我很难相信这真的是最先进的技术!
复制懒人机器人
如果你想复制我的 Slackbot,所有代码和详细说明都在这个资源库里。我和 RISELab 的一些博士生分享了这个库,他们都能够在一个小时内复制和部署这个机器人!然而,他们似乎没有一次超级愉快的经历...他们是这样说的:
为什么部署模型需要将多个服务缝合在一起并学习它们的术语?如果模型可以像调用 python 脚本一样简单地在本地运行,那么将它部署到云中所增加的复杂性应该是最小的。
—杨宗衡,博士四年级学生,研究系统的机器学习。
按照指示安装这个简单的机器人是一次由专家带领在黑暗中盲目进行的练习;出错的方式之多,使得诊断配置错误对于新手来说基本上是不可行的。
—一名匿名的三年级博士生,从事机器学习系统的研究。
总结
我们都知道人工智能基础设施和像 MLOps 这样的领域现在非常热门。所有人都在谈论这个。但实际上,要满足在线预测服务的基本需求,还有很多工作要做。我在这里的目标是适度的——一个简单的模型,具有有限的可扩展性。走到那一步很烦人,表现也很糟糕。
尽管如此,我确信还有其他的预测服务系统。我们自己刚刚在我们实验室的无服务器*台上构建了一个预测管道 DSL 。如果你知道更适合这里的生产系统或技术——或者只是想谈谈你认为这里讨论的服务中缺少的潜在功能——我很乐意通过 Twitter 或电子邮件听到你的意见。
感谢 维克拉姆·斯雷坎蒂约瑟夫·冈萨雷斯乔·赫勒斯坦 对本文初稿的反馈。**
我如何使用 PyTorch Lightning 为新冠肺炎构建了一个面具检测器
原文:https://towardsdatascience.com/how-i-built-a-face-mask-detector-for-covid-19-using-pytorch-lightning-67eb3752fd61?source=collection_archive---------6-----------------------

动机
在法国隔离结束的前几天,我在看新闻,无意中发现了一篇文章:法国正在使用人工智能检查人们是否在公共交通工具上戴口罩。
创建该项目的法国初创公司 DatakaLab 表示,目标不是识别或惩罚不戴口罩的人,而是生成匿名统计数据,帮助当局预测未来新冠肺炎疫情的爆发
于是我决定试一试,自己搭建一个口罩检测仪,检测某人是否戴口罩。

信号源
1.资料组
为了训练深度学习模型来分类一个人是否戴着面具,我们需要找到一个好的数据集,其中包含两个类别的大量图像:
- 戴着面具
- 没有戴面具
真实世界蒙面人脸数据集(RMFD) 提供了我们所需要的!该数据集是为面部识别目的而创建的。然而,我们将使用它来检测面具。
2.步伐
这篇文章的其余部分按以下方式组织:
2.1。数据提取
2.2。构建数据集类
2.3。构建我们的面罩检测器模型
2.4。训练我们的模型
2.5。在真实数据上测试我们的模型。结果
事不宜迟,让我们直接开始吧!
来源
2.1.数据析取
RMFD 提供了两个数据集:
- 真实世界蒙面人脸识别数据集:包含 525 人的 5000 张蒙面人脸和 90000 张正常人脸。
- 模拟掩蔽人脸识别数据集。
在这个实验中,我们将使用第一个数据集。下载并解压缩数据集后,其结构如下所示:
self-built-masked-face-recognition-dataset
├AFDB_masked_face_dataset
│ ├subject-id
│ │ ├image-id.jpg
│ │ └...
│ └...
└AFDB_face_dataset
├subject-id
│ ├image-id.jpg
│ └...
└...
我们通过迭代图像来创建我们的熊猫DataFrame,如果脸部没有被遮罩,则给每张图像分配一个标签0,如果脸部被遮罩,则分配一个标签1。这个数据集的图像已经在人脸周围被裁剪了,所以我们不需要从每个图像中提取人脸。
以下代码说明了数据提取过程:
将图片存储在熊猫数据框中,并贴上相应的标签
2.2.构建数据集类
现在我们已经准备好了 pandas 数据框架,是时候构建 Dataset 类了,它将用于以 PyTorch 可解释的方式批量查询样本。我们的模型将接受 100x100 的图像作为输入,因此我们在查询它时转换每个样本图像,将它的大小调整为 100x100,然后将其转换为一个Tensor,这是 PyTorch 可以操作的基本数据类型:
数据集模块
2.3.建立我们的面罩检测器模型
现在是有趣的部分!
来源
我们将使用 PyTorch Lightning ,它是 PyTorch 的一个薄包装。PyTorch Lightning 在一个类中有效地构建了您的代码,该类包含了我们定义和训练模型所需的所有内容,并且您可以覆盖根据您的需求提供的任何方法,从而在避免意大利面条式代码的同时使其易于扩展。
PyTorch Lightning 公开了许多用于训练/验证循环的方法。但是,我们将根据需要使用其中一些。以下是我们将要覆盖的方法,并且将在内部按以下顺序调用:
1。设置:
- init()
- 准备 _ 数据()
- configure_optimizer()
- train_dataloader()
- val_dataloader()
2。训练循环:
- 训练 _ 步骤()
- training_epoch_end()
3。验证循环:
- 验证 _ 步骤()
- validation_epoch_end()
2.3.1.定义模型和正向传递
为了定义我们的模型,我们对 PyTorch Lightning 的LightningModule进行了子类化,并定义了我们的模型架构以及向前传递。我们还使用由TorchMetrics包提供的Accuracy类,它将负责为我们计算训练/验证的准确性。我们将保持简单,使用 4 个卷积层,然后是 2 个线性层。我们将使用ReLU作为激活函数,使用MaxPool2d作为池层。然后我们用xavier_uniform初始化这些层的权重,因为这将使网络训练更好:
CNN 模型定义
2.3.2.为模型准备数据
我们的数据集是不*衡的(5,000 个蒙面人脸对 90,000 个非蒙面人脸)。因此,当将数据集划分为训练/验证时,我们需要在训练/验证中保持与整个数据集相同的样本比例。我们通过使用sklearn的train_test_split函数来完成,我们将数据集的标签传递给它的stratisfy参数,它将为我们完成剩下的工作。我们将数据集的 70%用于训练,30%用于验证:
prepare_data()方法
在处理不*衡数据时,我们需要将这些信息传递给损失函数,以避免优化器的步长不成比例。为此,我们根据每个类在数据集中的可表示性为其分配一个权重。
我们给样本数量少的类分配更多的权重,这样,如果网络在预测这些类的标签时出错,它将受到更多的惩罚。而样本数量多的类,我们给它们分配一个较小的权重。这使得我们的网络训练与班级比例无关。为每个类别选择权重的一个好的经验法则是使用以下公式:
不*衡数据的类权重
这转化为以下代码:
具有适应的类权重的交叉熵
2.3.3.数据加载器
我们将定义用于培训和验证的数据加载器。我们使用一批尺寸为 32 的产品来训练我们的模型。我们每次都会打乱我们的训练批次样本,以便我们的模型可以通过以非重复的方式接收数据来更好地训练。为了减少加载批量样本的时间(这可能是训练循环中的瓶颈),我们将 workers 的数量设置为 4,这将执行多进程数据加载:
培训/验证数据加载器
2.3.4.配置优化程序
我们通过覆盖configure_optimizers()方法并返回所需的优化器来定义我们的优化器。出于本文的目的,我们将使用Adam,我们将学习率固定为0.00001:
configure _ optimizers()方法
2.3.5.训练步骤
在训练步骤中,我们接收一批样本,通过正向传递将它们传递给我们的模型,并计算该批样本的损失。我们还可以记录损失,PyTorch Lightning 会自动为我们创建 TensorBoard 的日志文件:
培训 _ 步骤()方法
2.3.6.训练时期结束
在training_epoch_end()中,我们计算训练精度并记录下来,以便稍后在 TensorBoard 中可视化。然后,我们重置训练精度变量,以便在下一个时期,精度不携带来自先前时期的值:
2.3.7.验证步骤
在每个训练时期结束时,对每批验证数据调用validation_step(),我们计算准确度和损失,并在字典中返回损失。返回值将用于下一部分:
validation_step()方法
2.3.8.验证时期结束
在validation_epoch_end()中,我们接收从validation_step()(来自前一部分)返回的所有数据。我们计算*均精度和损耗,并记录下来,以便稍后在 TensorBoard 中直观显示:
validation_epoch_end()方法
2.4.训练我们的模型
为了训练我们的模型,我们简单地初始化我们的MaskDetector对象,并将其传递给 PyTorch Lightning 提供的Trainer类的fit()方法。我们还定义了一个模型检查点回调和一个 TensorBoard logger,我们希望以最好的准确性和最低的损失保存模型。我们将为 10 个时期训练我们的模型:
培训模式
我们可以看到,验证损失在各个时期都在减少:

验证损失
我们的模型的验证精度在第 8 个纪元达到最高峰,达到 99%的精度。

验证准确性—保存最佳模型
在纪元 8(红色箭头所指的地方)之后,我们的模型开始过度拟合。因此,验证准确性开始下降。因此,我们将采用 epoch 8 的保存模型,并使用它在真实数据上进行测试!
2.5.在真实视频上测试我们的模型
来源
为了在真实数据上测试我们的模型,我们需要使用一个对人脸遮挡具有鲁棒性的人脸检测模型。幸运的是,OpenCV 有一个深度学习人脸检测模型,我们可以使用。这种深度学习模型是对 Haar-Cascade 模型的更准确的替代,它的检测框架是矩形而不是正方形。因此,面部框架可以适合整个面部,而不捕获背景的部分,这可能干扰我们的面部掩模模型预测。
关于如何使用 OpenCV 的深度学习人脸检测的一个很好的教程如下:
[## 基于 OpenCV 和深度学习的人脸检测——PyImageSearch
今天,我将与您分享一个关于 OpenCV 库的鲜为人知的秘密:您可以快速、准确地执行…
www.pyimagesearch.com](https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/)
为了对视频进行推理,我们将使用上一节中保存的模型,并处理每一帧:
- 提取人脸
- 把它们传给我们的面罩探测器模型
- 在检测到的人脸周围绘制一个边界框,以及由我们的模型计算的预测。
以下是处理视频代码的摘录:
2.6.结果
我让几个朋友给自己拍照,戴上面具,然后摘下来。这些就是结果!看起来我们的模特即使带着定制的面具也很棒!我们模型的权重文件大小约为 8 Mb,在 CPU 上的推理几乎是实时的!!👌

演职员表:伊莉莎和维罗妮卡
完整的代码可以在 GitHub 上找到😃
编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
我如何在不到一天的时间里为冠状病毒创建了一个黑客新闻克隆
原文:https://towardsdatascience.com/how-i-built-a-hacker-news-clone-for-coronavirus-in-less-than-a-day-f4a199f4d842?source=collection_archive---------27-----------------------
使用 Flask 作为后端和 Scrapy 抓取新闻

蒂姆·莫斯霍尔德在 Unsplash上的照片
如果您想观看直播网站,请访问本页。有关实时统计数据,请访问本页。我不打算一行一行地重复如何写代码,如果你想要的话,可以看看这个 Github repo 。我还添加了过去 3-4 天收集的所有新闻。
我想了解关于传染性冠状病毒爆发的最新消息。浏览社交媒体是一种选择,但考虑到如今社交媒体上流传的假新闻和点击诱饵的数量,我更喜欢从可靠的新闻门户网站上获取新闻。问题是有很多。所以我想,也许是时候用我的编码技能来构建一些有用的东西了。

图片来自 Imageflip.com
新闻爬虫
爬行是我的日常工作之一,我以前创建过新闻爬虫。几乎每次我都用 Scrapy 进行抓取和爬行,因为它内置了很多东西。我不想重新发明轮子,更重要的是,我已经习惯了 Scrapy。
RSS 对于几乎所有的网站都是统一的,所以我决定用它来获取新闻。这样,我将只编写一个适用于所有网站的解析器。我需要做的就是在列表中添加更多的 URL,脚本会处理它。RSS 提要中的一个典型条目如下所示
<item>
<title>
<![CDATA[ China coronavirus outbreak: All the latest updates ]]>
</title>
<description>
<![CDATA[Global death toll reaches 427 with two reported dead outside mainland China as infection rate passes 20,500 cases.]]>
</description>
<link>
[https://www.aljazeera.com/news/2020/02/china-admits-shortcomings-coronavirus-death-toll-hits-425-200203234036932.html](https://www.aljazeera.com/news/2020/02/china-admits-shortcomings-coronavirus-death-toll-hits-425-200203234036932.html)
</link>
<guid isPermaLink="false">200203234036932</guid>
<pubDate>Tue, 04 Feb 2020 16:41:35 GMT</pubDate>
</item>
下一步是收集数据。我想要标题、链接和发布日期,我需要一种方法来选择仅在我的页面上显示的与冠状病毒相关的新闻。一种简单的方法是匹配关键词。所以我做了一个关键字列表和一个函数,它将检查标题和描述是否有这些关键字之一,并将其插入数据库或忽略它。所有这些步骤都记录在rss_scraper.py文件中。
前端
所以我想的第一件事就是尽快完成。我不想浪费更多的时间来构建一个简单的 MVP。我承认我对设计和前端的东西很糟糕。所以我做了每个开发人员都会做的事情,即找到一个合适的模板。通常我会搜索“免费引导新闻模板”,但正如我所说,我不想浪费太多时间。我见过的最简单的用户界面是黑客新闻。所以我从他们的网站上复制了所有的 HTML,CSS,删除了多余的东西,做了一些改变,比如颜色,页脚。
后端
选项对我来说是有限的,因为我只知道 Python 和初级 JavaScript/NodeJS。对我来说不是弗拉斯克就是姜戈。Django 很棒,但我想要一个单页应用程序,几乎没有 2-3 页,所以这将是一个大材小用。Flask 因其最小化方法而受欢迎,所以我选择了它。
使用的数据库是 MySQL。我创建了一个端点/corona-news,它查询数据库并将字典列表返回给模板,在模板中它们将被呈现为 HTML。和《黑客新闻》一样,我设定了每页 30 条的限制。点击此链接访问页面。

实时新闻页面
奖金
我发现这个网站正在更新报告的病例数、死亡数和康复病人数。他们也有一个链接到保存汇总数据的 google sheet。我使用 google sheet 定期下载文件,并以表格形式显示数据。有关现场计数和统计,请访问本页。

实时统计页面
部署
我使用 Linode VPS 和 Ubuntu 进行部署。按照 DigitalOcean 的指南在 Ubuntu 上使用 Nginx 和 uWSGI 部署 Flask 应用程序。
最后的想法
我希望这一页将有助于你们中的一些人获得关于冠状病毒的最新消息,这次疫情将尽快得到控制。
我如何在 Amazon SageMaker 上建立一个简单的假新闻检测器
原文:https://towardsdatascience.com/how-i-built-a-simple-fake-news-detector-on-amazon-sagemaker-808bf4e0c490?source=collection_archive---------36-----------------------
最*,我决定注册一个 Udacity 纳米学位,因为这个想法在我脑海里盘旋了很久。
在过去的两个月里,每天晚饭后和周末,我都跟着机器学习工程师 Nanodegree 课程,我遇到了亚马逊 SageMaker。

归功于 aws.amazon.com
Amazon SageMaker 是一项完全托管的服务,允许数据科学家和开发人员大规模构建、训练和部署机器学习模型。
令人惊讶的是,你真的可以在同一个*台上执行整个端到端的数据科学管道。
事实上,通过 Amazon SageMaker,您可以在一组不同的机器上创建 Jupyter 笔记本实例,这些机器基于计算(CPU/GPU)、RAM 和网络功能而有所不同。
您可以从导入数据、探索和清理数据开始,来训练模型并快速将其投入生产环境。
与 SageMaker 共同的工作流程(至少从我的小经验中学到的是这样的):
- 数据整合与处理
- 整合来自任何来源的数据集;
- 探索它,做可视化和汇总统计,了解数据;
- 如有必要,清理必须清理的部分,预处理和设计您的特征;
- 将处理后的数据保存到 S3 存储桶中,该存储桶可以是默认的 SageMaker 实例存储桶,也可以是您选择的其他存储桶。
- 模型搭建&部署
- 要建立模型,Amazon SageMaker 自带了一套有监督和无监督的模型,但是你也可以为你的定制模型提供一个你自己选择的框架(Scikit-learn,TensorFlow,MXNet…)连同一个训练脚本;
- 使用您在 S3 上保存的数据在一个或多个计算实例上训练模型
- 在 SageMaker 端点上部署估计器以进行推断
我发现 SageMaker 对于数据科学项目来说是一个非常有价值的选择。从现在开始,我将与你分享我在 SageMaker 上进行 Udacity Capstone 项目的最后一次体验。
这个项目处理假/真新闻检测。可以毫无疑问地插入到自然语言处理问题的语境中。
当我在 Kaggle 上导航时,我发现了这个有趣的数据集。
该数据集由 2 个 CSV 文件(真实、虚假新闻)组成,其中存储了文章的标题、文章、日期和主题。
问题陈述
所以,这个问题可以这样陈述:给定一篇文章的文本,我希望算法能够预测它指的是真的还是假的新闻。特别是,我将问题的解决方案组织如下:
·来自不同来源(CSV)的数据将被标记和堆叠;
“标题”和“文章”等文本特征被堆叠后,将被处理,以便生成有意义的词汇(没有标签、URL、奇怪的标点符号和停用词)
从这里,可以遵循两条道路,这取决于算法的选择。
如果使用机器学习算法,则有必要创建文本的单词包表示,或者通过使用单词计数,一种术语频率逆文档频率的热编码,可以与其他特征(例如,从日期中提取)一起使用来训练模型;
相反,如果选择深度学习模型,如递归神经网络,人们可以想到只直接使用填充到相同长度的文本序列,并用 word_to_integer 词汇表进行映射。
然后,可以训练神经网络来解决具有二元交叉熵损失的二元分类问题。
由于我的报告长达 10 页,我将只报告主要步骤:
预处理 关于 LSTM 模型的预处理步骤:
- 我只考虑文章文本作为一个特征,过滤长度在 20 个单词以下和 500 个单词以上的文本,以避免空序列或太长的序列。这些文本已经被停用词、奇怪的标点符号过滤掉,并被转换成小写字母。
- 我使用来自 Sklearn 的 train_test_split 来拆分训练、验证和测试数据集中的数据
- 我将 keras 的标记器应用于训练集,然后我使用它来转换验证和测试数据集(以避免数据泄漏),然后将所有序列填充到 max_len 为 500
from tf.keras.preprocessing.text import Tokenizer
from tf.keras.preprocessing import sequencetokenizer = Tokenizer(num_words=80000)
text_tokenizer.fit_on_texts(X_train['article'].astype(str))X_train = text_tokenizer.texts_to_sequences(X_train)
X_val = text_tokenizer.texts_to_sequences(X_val)
X_test = text_tokenizer.texts_to_sequences(X_test)X_train = sequence.pad_sequences(X_train, maxlen=500, padding='post')
X_val= sequence.pad_sequences(X_val, maxlen=500, padding='post')
X_test= sequence.pad_sequences(X_test, maxlen=500, padding='post')
型号
在培训脚本中(请记住我在 SageMaker 上),我定义了环境变量,您可以在这里定义模型结构,对其进行拟合,并在 S3 上保存其工件。这是我使用的网络结构(Keras)。
from tf.keras.layers import Embedding, Bidirectional, LSTM,Dense,Activation
from tf.keras.models import Sequentialdef RNN():model = Sequential()
layer = model.add(Embedding(80000, 128, input_length = 500))
layer = model.add(Bidirectional(LSTM(128))
layer = model.add(Dense(128))
layer = model.add(Activation('relu'))
layer = model.add(Dense(1))
layer = model.add(Activation('sigmoid')) return model
通过在 LSTM 层添加双向功能,我将精确度提高了 15%以上。
然后您添加代码以适应并保存模型;该代码将由 SageMaker 在培训工作中调用。
model.fit(train_X,
train_y,
batch_size=256,
epochs=args.n_epochs,
validation_data=(val_X,val_y))model_path = '/opt/ml/model/'
model.save(os.path.join(model_path,'bi_lstm/1'), save_format='tf')
相反,在实例端,我实例化了一个 TensorFlow 对象,其中设置了训练脚本的路径、我要选择的实例的数量和类型、IAM 角色和超参数:
input_channels = {"train":train_data,
"validation":val_data}from sagemaker.tensorflow import TensorFlowestimator = TensorFlow(entry_point = 'source_train/train_keras_lstm.py',
train_instance_type='ml.p2.xlarge',
train_instance_count=1,
role=role,
framework_version='2.1.0',
py_version='py3',
hyperparameters={"n_epochs":3}
正如你所看到的,我选择了一个' ml.p2.xlarge '实例,这是一个带有 GPU 访问的亚马逊入门级机器。
使用相同的策略,我在训练模型后部署了它:
predictor = estimator.deploy(initial_instance_count=1,
instance_type='ml.c4.xlarge')
并对测试集执行推断(这可以通过 predict() API 来完成,也可以通过在数据较大的情况下创建批处理转换作业来完成):
from sklearn.metrics import accuracy_scorepreds_df = pd.DataFrame(predictor.predict(X_test)
target_preds = pd.concat([y_test,preds_df], axis=1)
target_preds.columns=['targetClass','preds']print(accuracy_score(target_preds['targetClass'],
target_preds['preds']))0.986639753940792
我在测试集上获得了 98%的准确率。
除了模型本身,我希望我引起了你对 SageMaker 功能的注意。
如果你想看完整个步骤,看报告或者看一下培训脚本,这是该项目的 GitHub repo 。
下次见,再见,感谢阅读!
我如何使用 Python 和 Selenium 构建 Twitter Bot?
原文:https://towardsdatascience.com/how-i-built-a-twitter-bot-using-python-and-selenium-c036bfff6af8?source=collection_archive---------36-----------------------
让你的 Python 脚本来做所有的推文吧!!

使用 Python 的 Twitter 机器人— Twilio
我们正在寻求这个星球上每一件事情的自动化。从表单自动填充到无人驾驶汽车,人类使用自动化流程已经走过了漫长的道路。Python 脚本在生成自动化工具和任务方面非常方便。另一方面,Selenium 以自动化浏览器和网络应用而闻名。当 Python 和 Selenium 的力量结合在一起时,人们可以轻松地自动化数百项任务。由于这两者的结合,制造机器人变得更加容易。
这篇文章是制作一个简单的 Twitter 机器人的指南,这个机器人会为你自己发微博。
图书馆
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
Selenium 是我们构建 Twitter bot 所需的主要库。我已经从 selenium 导入了“webdriver”子包来访问浏览器并在其上执行任务。此外,我已经导入了“Keys”子包,以便在自动化过程中使用键盘键进行输入。
现在是肉的部分
我已经初始化了一个类“TwitterBot ”,它有一个接受 Twitter 帐户用户名和密码的构造函数。此外,它踢了自动化的 Chrome 网络驱动程序。
class TwitterBot():
def __init__(self,username,password):
self.browser=webdriver.Chrome("/Users/vishalsharma/Downloads/chromedriver")
self.username=username
self.password=password
你可以从下载 Chrome 网络驱动
我在类中定义了一个函数“SignIn ”,它通过在登录表单中输入用户名和密码来登录 twitter 句柄。我已经使用“find_element_by_name”方法来定位 web 元素并填写表单。
def signIn(self):
self.browser.get("https://www.twitter.com/login")
time.sleep(5)
usernameInput=self.browser.find_element_by_name("session[username_or_email]")
passwordInput=self.browser.find_element_by_name("session[password]")
usernameInput.send_keys(self.username)
passwordInput.send_keys(self.password)
passwordInput.send_keys(Keys.ENTER)
time.sleep(5)
对于我们的推文部分,我使用了“find_element_by_xpath”方法,并使用了“send_keys”方法。在最后一条语句中,“send_keys”有两个参数。这两个参数按 Command+Enter 键发布推文。
def TweetSomething(self):
tweet = self.browser.find_element_by_xpath('''//*[@id='react-root']/div/div/div[2]/main/div/div/div/div/div
/div[2]/div/div[2]/div[1]/div/div/div/div[2]/div[1]/div/div
/div/div/div/div/div/div/div/div[1]/div/div/div/div[2]/div
/div/div/div''')
tweet.send_keys("""Hello World!""")
tweet.send_keys(Keys.COMMAND, Keys.ENTER)
在“find_element_by_xpath”中,你可能会发现大量的胡言乱语。但是,这只是一种定位 web 元素的方法。您也可以使用其他定位方法。找到他们这里!
调用类
现在,在控制台中给出用户名和密码。调用“TwitterBot”类并运行该类中的方法。
if __name__=="__main__":
username= input("Enter your username: ")
password= input("Enter your password: ")
t=TwitterBot(username,password)
t.signIn()
t.TweetSomething()
就是这样!你已经建立了一个为你发微博的推特机器人。现在,你可以查看 Instagram 的关注者,比如照片,甚至可以右键点击你的 Tinder 个人资料。现在,继续尝试使用 Python 和 Selenium 自动化您的社交媒体。
如需讨论和反馈,请联系我 Linkedin !
构建 web scraper 工具来分析多伦多的公寓价格
原文:https://towardsdatascience.com/how-i-built-a-web-scraper-tool-to-analyze-condo-prices-in-toronto-56f829c55e93?source=collection_archive---------27-----------------------
尝试用数据驱动的方法来做人生中最重要的决定之一:买房
公寓一直令我着迷,在我居住的城市,它们可能是许多首次购房者脑海中的第一个(或现实的)选择。除非你一直生活在困境中,否则你会意识到多伦多的房价在过去的十年里上涨了许多倍,在过去的 5 年里更是如此。最*,公寓市场火了起来。所以,如果你和我一样,想买一套公寓,那你来对地方了。

桑德罗·舒赫在 Unsplash 上的照片
作为一个高度数据驱动的人,我建立了一个网络抓取工具,帮助我分析多伦多的公寓价格。我的首选网站是 Condos.ca 。它有一个良好的用户界面,并提供市场情报(我认为这将有助于验证我的结果)。在撰写本文时,它的清单跨越了 80 多个网页,我将从前 50 页中提取数据,如本文后面所述。

图片来自 Condos.ca 主页
这项工作有两个目标:
- 从网站上搜集相关参数的必要数据,建立基准数据库
- 通过对数据库进行一些探索性的 EDA 来进行市场研究,如每间卧室的*均价格、*均维护成本、*均公寓面积等。

数据采集(image src: Condos.ca)
我提取了每张清单上显示的信息,比如价格、街道地址、卧室、浴室的数量、是否有停车场、面积范围以及维护费用。(注:许多其他参数影响公寓价格,如楼龄、财产税、楼层数、图像等。,但为了简单起见,我留下了这些)
这里值得一提的是,在进行这个练习之前,我对 HTML 没有任何经验。但是这就是网络抓取的美妙之处。你不需要对 HTML 有很深的理解。我简单地学习了如何从 HTML 代码中的标签瀑布中提取所需的值。剩下的都是 python!这里的是关于如何抓取网站的有用资源。
那么让我们开始吧!
我们从导入必要的模块开始。
from bs4 import BeautifulSoup *# For HTML parsing* from time import sleep *# To prevent overwhelming the server between connections* import pandas as pd *# For converting results to a dataframe and bar chart plots**# For Visualizations*
import matplotlib.pyplot as plt
import plotly.offline as py
import plotly.graph_objs as go*%matplotlib inline*
当我请求抓取网站时,我遇到了一个错误。这是因为许多网站试图阻止用户抓取任何数据,这可能是非法的,取决于一个人计划如何处理这些数据(不过我已经获得了 condos.ca 的许可)。为了解决这个问题,我使用了一个名为 Selenium 的 API。它是一个 API ,允许你像一个真正的用户那样以编程的方式与浏览器交互。虽然 Selenium 主要用于帮助测试 web 应用程序,但是它也可以用于任何需要浏览器自动化的任务。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver.get(“[https://condos.ca](https://condos.ca)")
使用过滤器
运行前面的代码会打开一个新的浏览器并加载网站,帮助您像真实用户一样与网站进行交互。例如,Selenium 不需要手动点击网站来选择过滤器,如卧室数量、房屋类型或提供价格范围,而是通过传递几行命令来轻松完成。该模型使用户能够选择多个过滤器。
例如,要获得 2 间卧室的选项,我使用以下代码单击按钮:
*two_bed = driver.find_element_by_css_selector( ‘insert_css_path’)* *two_bed.click()*
同样,要获得 Gym 的所有结果,我只需使用以下代码:
*Gym = driver.find_element_by_css_selector('insert_css_path')
Gym.click()*
定义一个函数来迭代多个页面
因为我希望能够对其他城市进行这种分析,所以我定义了一个函数,该函数使用参数' city' 、' mode' 和' page no' )创建一个漂亮的 soup 对象。这里,' mode' '参数接受' Sale '或' Rent '作为值,使用户能够分析租赁价格!
**def** get_page(city, mode, page):
url= f'https://condos.ca/{city}/condos-for-{mode}?mode= {mode}&page={page}'
driver.get(url)
page_source = driver.page_source
soup = BeautifulSoup(page_source, 'lxml')
return soup
该函数利用名为beautiful Soup的模块,为给定的网页返回一个名为 soup 的对象。它还会加载所请求的网页。(稍后我将遍历所有网页来提取所有页面的 soup 对象)
现在我们有了 soup 对象,我们可以提取一些有用的信息,比如清单总数、每页清单总数等。,通过解析网页 HTML。没有听起来那么难!我们使用 soup.find() 来获取相关的标签。一种有用的方法是从提取第一页上的数据开始。如果您能成功做到这一点,rest 只需在所有页面上重复这个过程!
#Defining soup object for page 1
soup = get_page('toronto', 'Sale',1)
从第一页中提取一些关于列表的相关信息。
- 多伦多的物品总数:
#The total number of Condo Listings in Toronto*soup.find(‘div’,class_ = ‘sc-AxjAm dWkXrE’).find(‘span’,class_ = _5FYo1’).get_text()* *#no. of listings : 3560*
- 首页上的列表数量:
*len(soup.find_all(‘div’,class_ = ‘_3O0GU’))* *#43*
现在我们对这个有点满意了,我们可以更大胆一点,提取第 1 页上的所有价格。
*prices=[]
for tag in soup.find_all(‘div’,class_ = ‘_2PKdn’):
prices.append(tag.get_text())
prices[:5]*['$450,000',
'$649,900',
'$399,999',
'$599,900',
'$780,000']
为了使事情更简单,我定义了一个名为 condo_container 的变量,它将保存所有相关数据(价格、位置、大小等)。)页面上的所有列表
*condo_container = soup.find_all('div','_3SMhd')*
现在,我们要做的就是从这个 condo_container 中提取价格和其他数据。请参见下面的示例:
#Obtaining Location of all listings on page 1Location_list=[]
for i in range(len(condo_container)):
for tag in condo_container[i].find('span',class_='_1Gfb3'):
Location_list.append(tag)
Location_list[:5]['1001 - 19 Four Winds Dr',
'306 - 2 Aberfoyle Cres',
'911 - 100 Echo Pt',
'524 - 120 Dallimore Circ',
'1121 - 386 Yonge St']
对所有变量重复上述过程,我们得到了构建数据框所需的所有列表(参见下面的示例代码)。由于 HTML 结构的原因,在试图提取浴室、大小和停车场等参数时,这个过程变得有点棘手,但只需一点点努力,就可以完成!(我不是故意分享完整的代码,以避免代码的复制)。
最终数据集
现在我们有了所有的列表,我们简单地将它们添加到一个名为数据的字典中,定义如下。有些标签有点令人困惑,但那是因为它们已经根据需要从字符串类型格式化为整数。
data = {'Prices':[],
'Location':[],
'Date_listed':[],
'Bedrooms':[],
'Bathrooms':[],
'Maint_Fees':[],
'Size':[],
'Parking':[]
}final_list=[]
for page in range(50):
soup = get_page('toronto', 'Sale',page)
condo_container = soup.find_all('div','_3SMhd')
sleep(random())
print(page) for i in range(len(condo_container)):
listing = [] price_tag = condo_container[i].find('div',class_= '_2PKdn').get_text()
formatted_tag = int(price_tag.split('$')[1].replace(',',''))
data['Prices'].append(formatted_tag)
location_tag = condo_container[i].find('span',class_='_1Gfb3').get_text() data['Location'].append(location_tag) if maint_tag != '':
Maintenance_Fees = int(maint_tag.split('$') [1].replace(',',''))
data['Maint_Fees'].append(Maintenance_Fees)
else:
data['Maint_Fees'].append('error') for info_tag in condo_container[i].find('div',class_='_3FIJA'):
listing.append(info_tag)
final_list.append(listing)
一旦我们准备好词典,我们就把它转换成 pandas 数据框架,以便进一步处理和 EDA。得到的数据帧有 2031 行。

熊猫数据框(图片由作者提供)
快速浏览数据集告诉我们,卧室、浴室、维护费、和大小是对象类型变量,因为它们在 HTML 中被存储为字符串类型。
这些变量被清理并转换成整数或浮点类型。此外,我从大小变量创建了一个变量 Avg_Size 。通过进一步的数据检查,我发现了错误值,我用相应列的*均值替换了这些错误值。我还在 Location 变量的基础上设计了一个街道地址变量,以防以后我想执行某种位置分析。数据集被处理为异常值,这扭曲了我的*均值(昂贵的公寓可以变得非常昂贵!).缺失值用各自列中的*均值或最大出现值进行估算。
现在,我们的数据集看起来既漂亮又干净,我们可以继续进行一些基本的探索性分析了!
分析/结果
我很好奇,*均价格和面积是如何随着卧室数量的变化而变化的,我认为这是任何买家首先想到的事情!所以我使用 Plotly 创建了一些情节(见下面的示例代码)。
price_by_bed = condos.groupby(['Bedrooms']['Prices'].mean()data = go.Bar(
x=price_by_bed.index,
y=price_by_bed.values,
)layout = go.Layout(
title='Average Condo Price',
xaxis_title="No. of Beds",
yaxis_title="Value in $M"
)
fig = go.Figure(data=data, layout=layout)
py.iplot(fig)

病床*均价格(图片由作者提供)

按床位划分的*均大小(图片由作者提供)

按床位分类的价格和尺寸汇总(图片由作者提供)

多伦多每*方英尺的*均价格(Image Src: Condos.ca
每*方英尺的*均价格(仅包括子集中的 1、2 和 3 间卧室)为 897 美元,略高于 827 美元/*方英尺的报价。(注:自 COVID 开始以来,*均价格一直在逐渐下降,因此此处显示的值可能与当前值不同)。
我还可以根据卧室的数量来分析*均维护值。一个有趣的发现是,维修费可以决定你对公寓的投资成败,因为它几乎占你每月抵押贷款价值的 25%!(需要记住的是,不要只关注昂贵的价格)

公寓大小的*均维护费用(图片由作者提供)
下面,我按*均面积分析了房源数量,发现大多数待售公寓的面积在 600-699 *方米之间。金融时报类别。

按大小排列的列表数量(按作者排列的图片)
这些是我从这次网络抓取练习中得到的一些有趣的见解。我确信,现在有了这些知识,我会成为一个“消息灵通的买家”。
如果你有任何有趣的观点要分享,我很乐意在下面听到你的评论。
感谢 condos.ca 的团队允许我进行这个有趣而有价值的练习!
免责声明 : 请注意,文中表达的观点、想法和意见仅属于作者,不一定属于作者的雇主、组织、委员会或其他团体或个人。这不是投资建议,作者不打算将数据用于任何商业目的,只是出于个人原因。
我如何使用 Python 和 Spotify Web API 构建基于音频的音乐流派预测器
原文:https://towardsdatascience.com/how-i-built-an-audio-based-music-genre-predictor-using-python-and-the-spotify-web-api-a957e427a515?source=collection_archive---------12-----------------------
音乐信息检索(MIR)导论——一个涉及音乐数据分析和分类的跨学科领域

由阿格巴洛斯在 Unsplash 上拍摄的照片
你很可能订阅了某种流行音乐流媒体服务。无论是 Spotify 还是 Apple Music,你都可能接触过音乐信息检索的应用程序。想想这个——当使用 Spotify 建立播放列表时,该应用程序会根据您之前添加的歌曲或播放列表标题为您提供歌曲建议。在 Apple Music 中,您会看到根据您之前的收听历史为您量身定制的混音。这里的幕后没有任何魔法。(嗯,也许你,苹果——我们不知道苹果公园的魔法王国里发生了什么)这些例子是由音乐信息检索驱动的流行应用程序。
音乐信息检索是分析和分类音乐数据的科学。MIR 的一些应用与数据科学领域密切相关,同时还结合了心理声学、信号处理、机器学习和计算智能等多个领域。
在本文中,我将给出 MIR 的一个应用的高级演示:体裁预测。这个项目由 Python 构建,包含两个分类器模型,可以预测歌曲的风格。这两个模型都暴露于从一堆歌曲中收集的各种数据点。第一个模型根据歌词预测歌曲的风格。第二个模型根据歌曲的音频属性或声音来预测歌曲的风格。我们将专注于第二个基于音频的模型,但是可以随时在 GitHub 上查看整个项目!让我们开始吧。
我对音乐的热爱和我接触过的 MIR 的许多应用极大地激发了我在这里的工作。我一直在寻找新的音乐,由于 Spotify 和 Apple Music 的推荐,我已经发现了大量的艺术家。
1.收集数据
为了开始构建一个分类器,我们需要数据——以及大量的数据。对于分类者来说,不仅仅是更好的教他们如何钓鱼;这是要求的。我们需要向他们提供大量的数据,以便他们做出准确的类别标签分配。
我们的分类器将根据歌曲的声音进行预测。幸运的是,Spotify 有一个特别有用的 web API ,我们可以利用它来获取我们需要的数据。在这个项目中,我们将使用 Spotipy Python 库访问 Spotify 的歌曲数据。这个轻量级 Python 库支持 Spotify 的 Web API 的所有特性。通过使用 Spotipy,我们可以检索任何给定歌曲的各种数据点,如下所示。

给定曲目、艺术家和流派,使用 Spotipy 收集数据
在预测一首歌曲的风格时,我们可以考虑相当多的数据点。只要看看上面提供的例子,我们就可以知道 Empire Cast 的嘻哈歌曲比它上面的两首朋克/金属歌曲具有更高的可跳舞度。语音的清晰度也更高,这并不奇怪。朋克/金属歌曲的歌词经常在嘈杂的乐器上尖叫或呼喊,使它们更难理解,而嘻哈歌曲包含的歌词与节奏乐器一起演唱或说唱,几乎不会碍事。
为了获得足够数量的歌曲数据,我首先从 Kaggle 和 Ranker 导入了两个数据集。两个数据集都包含成千上万首歌曲,以及它们相关的流派。为了获得这些歌曲的音频属性,我创建了一个函数,该函数贯穿这两个数据集,在每首歌曲处停下来搜索歌曲的音频属性。感谢 Spotipy,我能够获得大量数据来训练这些模型。
2.探索性数据分析
如上面的例子所示,我们能够对收集到的一些歌曲有一个小小的了解。然而,上面显示的歌曲甚至连整个数据集中歌曲数量的百分之一都不到,所以我们还不能做任何假设。为了对每种风格的音频属性得出结论,我们必须进行探索性数据分析,或 EDA。
EDAs 允许我们总结一个数据集的主要特征。这是一个允许数据科学家熟悉他们的数据的过程,收集关于正在实验的数据的本质的关键理解。它也用于检查数据的质量;我们的实验是否会产生任何有意义的结果。
从我的 EDA 开始,我首先将歌曲按流派分组,然后找到每个音频属性的数字*均值。接下来,我对数据集的属性进行了规范化,以便更好地理解每种风格的音频特征之间的差异。我使用了一个差异阈值函数来找出每种风格的音频属性之间的差异,然后将差异列在一行中,显示在数据帧的底部。添加之后,我按照方差对列进行了降序排序。我最终得到了一个数据框架,它显示了每种风格的*均音频属性,以及不同风格之间哪些属性有最多的相似性和差异性。

各列按差异(底行)排序,或者按各种类型之间每个属性的差异程度排序
根据上面显示的数据框架判断,我们现在可以对数据集做出一些关键假设。乐器、声音和语速在每种风格之间的差异最大,而拍号、基调和速度的差异最小。直观地说,这是有意义的,尤其是当我们考虑本文第一节中的例子时。朋克/金属具有非常高的乐器性,因为通常存在尖叫的吉他、重低音、误解的歌词和雷鸣般的鼓声。由于通常存在电子节拍和合成低音,嘻哈音乐的乐器性很低。乡村/民间/摇滚介于两者之间。
还有哪些方法可以将你的音乐直觉运用到上面显示的结果中?
3.构建分类器
一个决策树,机器学习领域的流行工具,利用其树状结构来做决策。

照片由 Stephen Milborrow 在维基百科上 — “一棵树显示了 泰坦尼克号 上乘客的存活数(“sibsp”是船上配偶或兄弟姐妹的数量)。叶子下面的数字显示了存活的概率和叶子中观察到的百分比。总结:如果你是(1)女性或(2)小于 9.5 岁且兄弟姐妹少于 2.5 个的男性,你存活的机会很大。
上图是在决策树学习维基百科文章上找到的图片。这个树参考了电影《泰坦尼克号》,给我们一个直观的例子来说明决策树是如何工作的。
基于音频的分类器将通过做出由每片树叶确定的预测来利用决策树。例如,一片树叶可能会有这样的陈述“声音度>是 0.5 吗?”然后它将决定所讨论的歌曲是被预测为嘻哈歌曲还是朋克/金属歌曲。现在,我们数据集中的歌曲肯定比泰坦尼克号上的人有更多的属性,所以我们的树看起来会比上面列出的树复杂得多。上面,我们看到决策树只考虑了三个属性。我们的歌有 12 个属性。这些属性是决策树进行预测的基础,因此,这棵树变得更大是有道理的——更不用说我们将向它输入大量的歌曲。
我选择使用 scikit-learn 的 Python 工具——特别是训练-测试-分割函数和决策树分类器。构建分类器时,我们必须采取的第一步叫做拟合分类器。我们可以认为拟合是将分类器暴露给数据,并告诉它属于哪个分类。
这和学习的想法很相似。当你为考试而学习时,你会接触到很多信息,到了考试的时候你必须记住这些信息。这里的关键 (这一点很重要) 是在考试上,你会看到你必须解决的问题,而这些问题是你从未见过的——但这些问题与你考试前所学的问题有相似之处。利用你所知道的你所研究的问题,你尽你所能解决这些测试问题,希望你最终能取得一个好的考试成绩。
当适合决策树分类器时,其决策树叶子由它所暴露的数据生成。拟合后,我们可以通过将分类器暴露于它从未见过的数据来测试它,希望它能做出准确的预测。
我通过将整个数据集分成 70%的训练数据和 30%的测试数据来构建决策树分类器。我还决定不考虑两个音频属性,因为流派之间的差异太小了。在研究了如何避免过度拟合之后,我做出了这些决定。
在拟合之前,我使用了一种叫做 打包 的方法来进一步优化分类器。Bagging 本质上是获取你的初始分类器,创建一堆它的副本,然后在原始数据集的随机子集上训练它们。在训练之后取它们的所有*均值,产生一个单一的*均分类器。 Bagging 在分类器的构造中引入了随机化,使其成为改进单个复杂树分类器的一种很好的方式。

最终的决策树
4.结果
现在来最后拟合和测试分类器。我们运行一个简单的评分函数,看看分类器在面对以前从未见过的数据时表现如何。

分类器得分约为 79%
不错——分数略低于 80%。让我们喂它一些歌曲,看看它的行动;保罗麦卡特尼,德雷克和冠军争夺战的歌曲。

预测是正确的!
三个预测都是正确的!科学,宝贝。
结论
数据科学是一个巨大的领域。这也是我如此热爱它的原因之一。它让我能够将我的计算机科学技能与我对音乐的热情结合起来,MIR field 为我提供了一个完美的游乐场,让我在获得音乐洞察力的同时进一步发展我的技能。
GitHub 项目链接
我如何从优步旅行时间数据中构建时间序列数据
原文:https://towardsdatascience.com/how-i-built-time-series-data-out-of-cross-sectional-uber-travel-times-data-e0de5013ace2?source=collection_archive---------44-----------------------

我知道我在写学士论文的过程中想做两件事:提高我的编程技能和从事时间序列数据预测工作。
然而,我不知道的是我想学的东西。然而,它必须是我真正喜欢的东西,不一定与我的专业相关。
由于我喜欢地图和……移动的东西,我决定以某种方式使用我最*偶然发现并爱上的一个网站的数据(可能是在我十几岁时玩了几个小时的模拟城市之后)——优步运动网站。
它允许您可视化从某个点(或区域)到同一城市中任何其他点的*均行驶时间的匿名数据。

我的家乡圣保罗的旅行时间示例。
“太好了!”,我想。“让我下载旅行时间并绘制一些数字,这样我就可以继续进行探索性数据分析(EDA)。”
事实证明,我想要的数据不是那么容易提取的。
问题是
为了有一个更精确的统计结果,我需要我能得到的所有数据。我拥有的数据行越多,我的模型的预测能力就越强(潜在的)。时间增量越小越好。因此,我需要得到日报的旅行时间。
优步运动网站允许你从城市的任何一个区域下载数据到其他区域。然而,有一个问题。无论您想获取哪个日期范围的旅行时间,都不是由每天的数据组成的。
也就是说,如果您选择下载 2020 年 1 月至 2020 年 3 月的值,您将不会收到 90 个值,这大致是该范围内的天数。相反,它会生成一个 csv 文件,其中的是每对区域的三个月*均旅行时间的单个值。

您可以为每个给定的区域对下载不同格式的行驶时间数据。
这意味着我必须在整个时间内的数据点数量上做出妥协,以获得单个时间点的大量值。
TL;博士:优步运动不提供时间序列数据,但单电子/横截面数据。
当然,还有其他限制因素,例如,我只能获得我称之为“径向”的数据,而不能获得每个可能的区域对之间的行驶时间,只能获得从最中心点到其他点的行驶时间。从统计学的角度来说,我不确定这是否能为我提供一个给定城市的*均出行时间的合理准确的测量值。
以下是您可以下载的两种地理空间数据的(非常难看的)描述:

“径向”数据与每对区域。
尽管如此,还是有希望的。
我解决这个问题的天真尝试
可以选择的最大可能日期范围是 3 个月。另一方面,最短的时间是一天,这正是我所需要的。

优步运动日历,您可以在其中选择所需的日期范围。
所以我想:“为什么不点击每一天并下载相应的数据集呢?”。
嗯…我试过了。
我知道自动化这个过程会容易得多,但是我没有编码技能,也不知道我需要用什么包来完成这个任务。
我花了大约 6 分 30 秒下载一个月的数据。在可用的城市中,数据天数最多的是 3.25 年(2016 年 1 月至 2020 年 3 月)或 39 个月。我总共要花 253 分钟,或者连续点击 4 个多小时,才能下载一个城市的所有数据集。总之,我想从 31 个城市提取数据,所以 4 小时乘以 31 个城市大约等于手动下载 5 天。
那就是不吃不睡。
是时候解决房间里的大象了。因为我不想花几乎整整一周的时间点击下载按钮,所以我让自动完成这项工作。
解决方案
我实际上使用了两个 Python 包来自动下载每日数据集:Selenium,用于自动执行操作(比如单击和等待页面响应); datetime,使用精确的数据类型来读取日期和时间,而不仅仅是使用字符串。
代码的很大一部分是由 XPaths 和 CSS 选择器对变量的简单赋值以及对这些变量执行的点击操作组成的。对我来说,这本身就是一次学习练习,因为我从未使用过谷歌 Chrome 开发者工具。
酷,我刚学会自动点击。然后,我有了点击日历上每一天的想法。很简单。
然而,我现在面临着一个巨大的障碍。
为了遍历日期,我必须从下载按钮所在的页面返回到带有日历的窗口(这样我就可以点击下一个日期)。为此,我必须刷新页面。当您刷新页面时,DOM(文档对象模型)也会更新。
也就是说,引用特定 web 元素的任何代码都不能在刷新后的页面上工作,因为 web 元素已经过时了。
例如,Selenium 会给我以下错误消息:
selenium.common.exceptions.StaleElementReferenceException: Message: <element_name>'stale element reference: element is not attached to the page document
这是一场噩梦,也是一个我无法克服的挑战,不管我读了多少 StackOverflow 的帖子。绝望随之而来。
因此,我联系了一位我认识的有 CSS 和 Java 经验的前同事,看他是否能帮助我。虽然我的希望很低,但他提出了一个简单而优雅的想法:“为什么不点击日期并刷新页面,而是更新 URL 本身以包含您想要的日期?”
这是我的项目的一个转折点。(瓦雷乌·爱德华多!).
如果你仔细查看某个城市的优步运动网址,你会注意到它包含了你想要登陆的页面所需的所有信息。
我只需创建一个初始 URL,其中包含城市名称、所需的区域类型和区域原始代码等信息,然后找出一种算法来遍历日期并相应地更新 URL。
URL 创建函数如下:
*# Create URLs for the desired date range* **def** getURL():
*""""*
*Function that creates one URL per date between the specified date range*
*"""*
date = datetime(2016,2,2)
**while** date <= datetime(2020,3,31):
**yield** ('https://movement.uber.com/explore/' + city + '/travel-times/query?si' + origin_code + '&ti=&ag=' + zone_type + '&dt[tpb]=ALL_DAY&dt[wd;]=1,2,3,4,5,6,7&dt[dr][sd]=' +
date.strftime('%Y-%m-**%d**') + '&dt[dr][ed]=' + date.strftime('%Y-%m-**%d**') + '&cd=&sa;=&sdn=' + coordinates + '&lang=en-US')
date += timedelta(days=1)
最后,我们只需要创建一个迭代机制来执行 getURL 函数中的下一个 URL。
*# Perform iteration through URLs downloading the datasets for each URL*
iterated_URLs = []
i = 0
print('Number of generated URLs: ' + str(len(list(getURL()))))
**for** url **in** getURL():
i += 1
driver.execute_script("window.open('"+url+"', '_self')")
iterated_URLs.append(url)
这是运行中的机器人:

数据集下载机器人在行动。
就是这样!
接下来的步骤是将每个 csv 文件连接成一个文件,并执行清理和格式化以启动 EDA 这对熊猫来说很容易做到。
有了这个,任何人都可以充分利用优步免费提供给我们的惊人数据。由于网站上提供的数据结构的性质,时间序列分析是不可能的,现在我们可以扩大对优步旅行时间和地理空间数据的研究范围。
当然,这两段代码并不是故事的全部,所以你可以在 GitHub 上查看我的这个和其他项目。
我如何将 S3 桶连接到 Databricks 笔记本进行分析。
原文:https://towardsdatascience.com/how-i-connect-an-s3-bucket-to-a-databricks-notebook-to-do-analytics-a7b5258619b8?source=collection_archive---------19-----------------------
连接亚马逊 S3 和 databricks 笔记本的基本用例。

在一个项目中,我必须对来自 Kinesis 流并由消防软管排序的数据流进行一些分析,这项技术允许我们简单地将来自流的数据存储在 S3 中。
要做这些分析,你首先必须从 kinesis 笔记本连接到 S3 桶,然后使用 SPARK 对其进行查询以分发计算。
在这个用例中,我们将使用 databricks 的社区版,它的优点是完全免费。
添加新的 AWS 用户
为了能够从我们的 S3 存储桶中读取数据,我们必须提供从 AWS 的访问权限,为此我们需要添加一个新的 AWS 用户:
我们首先转到 AWS IAM 服务->用户->添加用户

我们输入用户名和访问类型。然后,我们授予该用户访问 S3 的权限。

您可以跳过接下来的步骤,直接进入用户验证。

我们点击“查看”并保存这些密钥以备后用。
现在已经创建了用户,我们可以从 Databricks 转到连接。
配置您的数据块笔记本
现在我们的用户已经可以访问 S3,我们可以在 databricks 中启动这个连接。
如果你的账户刚刚创建,你就必须创建一个新的集群来运行你的笔记本。转到集群选项卡- >创建集群

给它一个你想要的名字和一个最新的稳定运行版本。对于本教程,我将使用 Scala 来处理数据。然后点击“创建集群”
现在,您必须创建一个笔记本来运行您的代码。为此,进入工作区->“用户名”->“创建”

同样,给它起你想要的名字,选择 Scala 作为语言,然后选择你刚刚创建的集群。你准备好做云编码了吗,这很简单,不是吗?
从数据块中连接和检索 S3 数据
关系

要将您刚刚创建的笔记本连接到您的 AWS S3 桶,您只需将您的访问和密钥替换为您之前创建用户时保存的密钥,记得吗?
您还必须将“AwsBucketName”属性替换为您的 S3 时段名称。
挂载名称正好对应于包含 S3 数据的变量的本地名称。你可以选择你想要的名字。
检索数据
要从 S3 存储桶中检索数据,请使用以下代码。

这里只是要注意路径。注意 S3 的存储结构,以便只检索您感兴趣的数据。
现在只需使用这行代码将您的数据转换成一个漂亮的数据集。

现在,我们准备好发出请求并可视化我们的数据集。准备好了吗?
使用 SPARK 实现数据帧的可视化
为了可视化你的数据框架,你只需要在上面提出请求。
这是一个如何使用 SPARK 在数据帧上进行请求的例子

- filter 方法用于选择您感兴趣的数据集部分。
- groupBy 用于根据数据框中的分类列对您刚刚选择的数据进行分组。你必须在它之后使用一个聚合函数,比如计数
- 最后一种方法,过滤器,顾名思义,允许您根据数据帧中的一列对数据进行排序。

您将获得一个包含已处理数据的表,作为该请求的输出。
为了形象化,你只需点击底部的绘图按钮,选择你想要的绘图类型。

你可以从 databricks 中找到一些关于数据帧用法和关于可视化的有趣文档。
一旦你有了一组精彩的情节,你就可以用它来创建一个仪表板。
只需点击 View - > new Dashboard,选择您想要的图表……瞧,您就拥有了一个出色的 Databricks 仪表板。
这看起来可能是这样的:


有时很难找到使用这些新的大数据工具的方法。
在本文中,我们一起看了一个详细的用例,如何连接到 S3 桶,并在数据块上创建强大的可视化。
我希望这篇文章能够启发您,并激发您在大数据项目中的创造力。
我如何不断地将我的机器学习模型的准确率从 80%提高到 90%以上
原文:https://towardsdatascience.com/how-i-consistently-improve-my-machine-learning-models-from-80-to-over-90-accuracy-6097063e1c9a?source=collection_archive---------9-----------------------
改进机器学习模型的 5 个技巧和提示

里卡多·阿尔塞在 Unsplash 上的照片
介绍
如果你已经完成了一些自己的数据科学项目,你现在可能已经意识到达到 80%的准确率并不算太坏!但在现实世界中,80%是不会切的。事实上,我工作过的大多数公司都期望至少 90%的准确率(或者他们所关注的任何指标)。
因此,我要谈谈你可以做的 5 件事来显著提高你的准确性。我强烈建议你通读这五点内容,因为我包含了很多大多数初学者不知道的细节。
到此结束时,你应该明白,有比你想象的更多的变量在决定你的机器学习模型的表现方面发挥着作用。
也就是说,你可以做 5 件事来改进你的机器学习模型!
- 如果你喜欢这个, 关注我的 Medium 了解更多
- 关注我Kaggle了解更多内容!
- 我们连线上LinkedIn
- 有兴趣合作?查看我的 [网站](http://Want to collaborate?) 。
- 查看 我的免费数据科学资源 每周都有新素材!
1.处理缺失值
我看到的最大错误之一是人们如何处理缺失的价值观,这不一定是他们的错。网络上的许多资料表明,您通常通过均值插补、用给定特征的均值替换空值来处理缺失值,这通常不是最佳方法。
例如,假设我们有一个显示年龄和健康分数的表格,并假设一个 80 岁的老人缺少健康分数。如果我们从 15 岁到 80 岁的年龄范围内取*均健康分数,那么 80 岁的人看起来会有一个比他实际应该有的高得多的健康分数。
因此,你要问自己的第一个问题是为什么数据一开始就丢失了。
接下来,考虑处理缺失数据的其他方法,除了均值/中值插补:
- 特征预测建模:回到我关于年龄和健康分数的例子,我们可以对年龄和健康分数之间的关系建模,然后使用该模型找到给定年龄的预期健康分数。这可以通过几种技术来完成,包括回归、方差分析等。
- K 最*邻插补:使用 KNN 插补,缺失的数据用另一个相似样本的值填充,对于不知道的人,使用距离函数(即欧几里德距离)确定 KNN 的相似性。
- 删除行:最后,可以删除行。这通常不被推荐,但是当你有一个巨大的数据量时,这是可以接受的。
2.特征工程
第二种可以显著改善机器学习模型的方法是通过特征工程。特征工程是将原始数据转化为更好地代表人们试图解决的潜在问题的特征的过程。这一步没有特定的方法,这使得数据科学既是一门科学,也是一门艺术。话虽如此,以下是一些你可以考虑的事情:
- 转换日期时间变量以仅提取星期几、月份等…
- 为变量创建容器或桶。(例如,对于高度变量,可以有 100-149 厘米、150-199 厘米、200-249 厘米等。)
- 组合多个要素和/或值以创建一个新要素和/或值。例如,泰坦尼克号挑战最准确的模型之一设计了一个新的变量,称为“是女人还是孩子”,如果这个人是女人或孩子,这个变量为真,否则为假。
3.特征选择
第三个可以大幅提高模型精度的领域是要素选择,即选择数据集最相关/最有价值的要素。过多的特征会导致算法过拟合,过少的特征会导致算法欠拟合。
我喜欢使用两种主要方法来帮助您选择功能:
- 特性重要性:像 random forests 或 XGBoost 这样的算法允许您确定哪些特性在预测目标变量的值时是最“重要”的。通过快速创建其中一个模型并进行特征重要性分析,您将了解哪些变量比其他变量更有用。
- 降维:最常见的降维技术之一,主成分分析(PCA)取大量特征,利用线性代数将其降维为较少的特征。
4.集成学习算法
改善你的机器学习模型的一个最简单的方法就是简单地选择一个更好的机器学习算法。如果你还不知道什么是集成学习算法,现在是时候学习它了!
集成学习是一种结合使用多种学习算法的方法。这样做的目的是让您获得比单独使用单个算法更高的预测性能。
流行的集成学习算法包括随机森林、XGBoost、梯度增强和 AdaBoost。为了解释为什么集成学习算法如此强大,我将给出一个随机森林的例子:
随机森林涉及使用原始数据的自举数据集创建多个决策树。然后,该模型选择每个决策树的所有预测的模式(大多数)。这有什么意义?依靠“多数获胜”模型,它降低了单个树出错的风险。

例如,如果我们创建一个决策树,第三个,它会预测 0。但是如果我们依赖所有 4 个决策树的模式,预测值将是 1。这就是集成学习的力量!
5.调整超参数
最后,有一点很少被提及,但仍然非常重要,那就是调整模型的超参数。这是你清楚地理解你正在使用的 ML 模型的必要条件,否则很难理解每个超参数是什么。
看看随机森林的所有超参数:
*class* sklearn.ensemble.**RandomForestClassifier**(*n_estimators=100*, ***, *criterion='gini'*, *max_depth=None*, *min_samples_split=2*, *min_samples_leaf=1*, *min_weight_fraction_leaf=0.0*, *max_features='auto'*, *max_leaf_nodes=None*, *min_impurity_decrease=0.0*, *min_impurity_split=None*, *bootstrap=True*, *oob_score=False*, *n_jobs=None*, *random_state=None*, *verbose=0*, *warm_start=False*, *class_weight=None*, *ccp_alpha=0.0*, *max_samples=None*
例如,了解 min _ infinity _ decrease 是什么可能是一个好主意,以便当您希望您的机器学习模型更加宽容时,您可以调整该参数!;)
感谢阅读!
通过阅读本文,您现在应该对如何将模型的准确性从 80%提高到 90%以上有了更多的想法。这些信息还将使您未来的数据科学项目进行得更加顺利。我祝你在数据科学的努力中好运。
特伦斯·申
- 如果你喜欢这个, 关注我的 Medium 了解更多
- 关注我的了解更多内容!
- 我们来连线上 LinkedIn
- 有兴趣合作?查看我的 [网站](http://Want to collaborate?) 。
- 查看 我的免费数据科学资源 每周有新素材!
我是如何在脸书大学通过 MLE 面试的
原文:https://towardsdatascience.com/how-i-cracked-my-mle-interview-at-facebook-fe55726f0096?source=collection_archive---------0-----------------------

蒂姆·班尼特在 Unsplash 上拍摄的照片
办公时间
我成为 MLE 的旅程
那是去年八月,我正在接受采访。到那个时候,我已经分别面试了谷歌印度和亚马逊印度的机器学习和数据科学职位。然后我的学长建议我申请脸书伦敦的一个角色。
于是我照做了。我在 LinkedIn 上联系了一位招聘人员,他给我介绍了另一位,几天后我就开始了机器学习工程师的招聘过程。
现在,在雇佣机器学习工程师方面,脸书有一个非常不同的流程。他们通过编码、系统设计和机器学习设计面试来选择未来的员工。就我作为数据科学家的经历而言,我对机器学习设计面试相当满意,但其他面试仍然让我感到害怕。我最*没有通过谷歌机器学习软件工程师的第一轮面试,仅仅是因为我没有准备好数据结构的问题。
后来,当我为 FB 编码面试学习时,我意识到我把它看得有点轻,我根本没有为编码面试做准备。
在这篇文章中,我将概述我对所有这些不同面试的方法,以及对于那些对 FB 这样的大机构的 MLE 职位感兴趣的人来说,整个过程是如何进行的。
所以,一旦我和招聘人员联系上了,下一步就是电话面试。
1.电话采访:
这是一次非常基本的数据结构面试,也是一次基本的健康检查。我猜 FB 只是想给你更多的时间来准备接下来的几轮,并看看是否值得打电话给你进行现场查房。对我来说,这次视频电话采访持续了 45 分钟。面试官一开始告诉我他在脸书的简介,然后在开始的 10 分钟左右问我的简介。
然后,我有两个非常基本的数组和基于字典的问题要解决。采访者分享了一个 coderpad 链接,在这个链接上,我必须在没有任何代码格式选项的情况下,用我选择的任何语言(不是伪代码)无错误地解决这些问题。我也被问及这些问题的基于时间和基于空间的限制。面试的进展是我得出了一个像 O(n)这样糟糕的运行时间,面试官问我是否可以做得更好,并在需要的时候给出提示。
由于我不允许分享确切的问题,我只会分享一些难度相当但不相同的公共 Leetcode 问题给你,以便你可以了解难度水*并相应地练习。
a) 单调数组:一个数组是单调的,如果它或者是单调递增的,或者是单调递减的。当且仅当给定数组A单调时,返回true。
b) 有效回文:给定一个字符串,判断它是否是回文,只考虑字母数字字符,忽略大小写。
我这次面试的行动计划?
这只是我参加的第二次数据结构面试,在第一次表现不佳后,我想做一点准备。因此,我开始使用 Gayle Laakmann McDowell 的《破解编码访谈》一书来理解数据结构的基础知识。这本书也包含了很多准备技巧,你应该谨慎地去阅读它们。我最喜欢这本书的一点是,它非常简洁,不像托马斯·科尔曼的《算法导论》,它只是给出了编码采访的适量背景。每一个数据结构都用 2-3 页的篇幅进行了非常简明的解释,一些问题是围绕特定主题解决的,然后给出了一些练习题。这本书还限制了自己,只提供最常被问到的数据结构。例如,AVL 树和红黑树被放在高级部分,而不是在树和图表章节,因为它们在有时间限制的面试环境中不常被问到。
我首先列出了我需要准备的主题清单。你可以准备更多的话题,但这些是面试的最低要求。
数据结构:数组、集合、栈/队列、Hashmap/字典、树/二叉树、堆、图。
算法:分治、DP/记忆化、递归、二分搜索法、BFS/DFS、树遍历。
然后我继续用《破解编码访谈录》阅读他们,并为他们解决了许多 Leetcode 上的简单问题和一些中级问题。也有其他*台可以在线练习,但我喜欢 Leetcode,因为它没有广告的良好设计和基于类的解决方案编程结构。它还提供了一个很好的方法来搜索各种主题和难度的问题。我还在 Leetcode 上做了很多模拟采访,只是为了练习。我这样做了大约一两个星期,每天花大约 3-4 个小时。
在这段时间里,我还开始审核 UCSanDiego 在 Coursera 上的 算法专业,这让我对本科大学教授什么内容来应对编码面试有了一些想法。
我也围绕我所学到的东西写了一些博文,试图简单的解释一下。你可以在我的博客上免费查看。
- 面向数据科学家的链表简单介绍
- 数据科学家的 3 个编程概念 —递归/记忆化、DP 和二分搜索法
- 面向数据科学家的动态编程
- 在数据科学算法面试中处理树
TLDR; 只要把你要准备的题目记下来,每个题目练很多容易的题就行了。也许还有一些中等的。
有一次,我完成了电话面试,招聘人员在短短的一天内回来了,并打电话解释了现场面试的过程。 现场参观将在伦敦进行,我真的很期待去伦敦旅行。免费旅行。大约还有 5 个回合,这是我接下来要说的。我两个月后就要去面试了,这样我就有时间准备了。不管怎样,签证和整个过程花费的时间比这多一点。
一到伦敦,我就在 D 日 9 点左右从他们提供的酒店到达了脸书办事处。比预定时间提前了整整一个小时,因为我很紧张,我通常会尽量准时/提前到达面试地点(当我给他们面试机会时更是如此)。我事先知道当天的整个行程,因为我的招聘人员告诉了我。我也知道哪个采访将在什么时间进行,谁将接受采访。事实上,这是我经历过的最有条理的面试。
2.现场编码第 1 轮

图片由 StartupStockPhotos 来自 Pixabay
我从事数据科学已经很久了,所以我把 DS 作为数据科学而不是数据结构来读。这次采访对我来说是一个痛点。这是我在两个月内学到的东西,而不是我的全部经历。在这里,我是基于这一点而不是我所有的经验和数据科学背景进行评估的。但正如招聘人员告诉我的那样,他们有非常固定的流程,我不得不通过这些轮次来获得 MLE 职位。所以我就配合了。
至于面试,它准时开始,像以前一样,面试官在进入我的个人资料之前做了自我介绍,然后直接进入面试问题。有人问我一个中等水*的字符串问题,我能很快解决,还有一个中等水*的二分搜索法问题,花了我大部分时间,但最终我还是解决了。Leetcode 中的一些类似问题(不是相同的问题):
a) 复数乘法:给定代表两个复数的两个字符串。您需要返回一个表示它们相乘的字符串
b) 排序矩阵中的第 k 个最小元素:给定一个 n x n 矩阵,其中每一行和每一列都按升序排序,找出矩阵中的第 k 个最小元素。
面试官还给了我一个在自己的笔记本电脑上编码的选项,因为招聘人员已经告诉了我在白板/笔记本电脑上编码的选项,所以我特意带着笔记本电脑。但是记住他们不允许使用任何代码格式和 ide。我只有一个基本的编辑器来写代码。
我的编码面试行动计划?
和电话一样的计划,但是更广泛的远程编码。我记得我连续 30 天都在做 Leetcode,每天大约 3-4 个小时。我过去常常尽可能多地解决中等水*的问题,而很少花时间解决高水*的问题。
3。第二轮现场编码:
直到这个时候,我还处于数据结构的最佳状态,并准备好应对面试官抛给我的任何问题。我的心态是——“最坏的情况会是什么?”。所以我只是继续。脸书的人真的很好,他们在每次采访前后都要求提供茶点,并注意不要延长采访时间。很多人认为,每次面试都在需要的时间准时开始,两次面试之间有 15 分钟的冷静期。
同样,一些类似的(不是相同的)问题很难练习,并附有 Leetcode 的简要描述:
a) 基于 API 的问题基于时间的键值存储:创建一个键值存储类,支持两个操作——set 和 get。
b) 合并 k 排序列表:给你一个k链表lists的数组,每个链表按升序排序。将所有链表合并成一个排序后的链表并返回。
我在这次编码面试中的目标是能够在 40 分钟内解决面试官提出的两个问题。但是,这是一个困难的面试,我花了大部分时间在第二个问题上,这是一个困难的水*。尽管面试官给了我一些提示,引导我找到正确的数据结构和算法。最后,我完全解决了问题 1 和问题 2 的大部分问题。
给受访者的一个建议是,说出你所有的解决方案以及所涉及的时间复杂性,只有当你们双方都同意一个好的解决方案时,才开始编写代码。
此外,通过这两次面试,我发现在工作中与面试官交谈并解释你的方法真的很有帮助。他们有时会提供提示,有时会阻止你走向错误的切线。甚至告诉你的面试官你陷入了什么困境也会对你有所帮助,因为这会给面试官一个信号,告诉他你在往哪个方向思考。这也使得整个面试更具协作性,我认为这是面试官在一个人身上寻找的品质之一。

FB 的食物棒极了。尽管如此,我还是不能享受太多,因为我有点焦虑。照片由丹金在 Unsplash 上拍摄
到目前为止,我对所有的白板编码和一般的面试压力感到有些疲惫,因为快到午饭时间了,我和一个指定的同事/朋友去了脸书自助餐厅。这是你可以询问公司情况的部分,这段时间不在面试之列,所以你可以开诚布公地问一些关于脸书人寿的问题。在脸书自助餐厅,你可以品尝到各种各样的食物。
4.系统设计

照片由杰斯温·托马斯在 Unsplash 上拍摄
这又是一次我害怕的面试。正如你所看到的,我害怕大部分的面试,因为这对我来说是非常不自然的面试形式。在系统设计面试中,您需要在白板上创建一个端到端的服务。供您练习的一些示例问题如下:
- 你会如何设计网飞?
- 你会如何设计 Youtube?
- 你会如何设计推特/脸书?
虽然这看起来令人生畏,但当你为此做准备时,它实际上是开放的。因为没有错误的答案。
我喜欢这样的面试方式是:
- 设计一个非常基本的系统,类似于*台,具有面试官要求的基本功能。对于大多数*台来说,它包括在白板上绘制服务器、客户机和数据库的方框。
- 创建我希望系统具备的功能列表。例如,在社交网络中关注,或在优步上预订出租车,或在 Whatsapp 上阅读消息时双击,或 Twitter 上的转发功能,或 FB newsfeed 等。谈到功能,天空是无限的,因为我们都已经看到了这些*台提供的功能,所以列出一个功能列表应该不难。
- 在整个面试过程中增加特色,在非常基础的设计上扩展/改变。这可能涉及添加功能,以及讨论缩放、处理边缘情况、讨论涉及的数据结构和数据库、使用缓存等。
- 继续添加功能并通过询问面试官他们希望根据我提供的功能列表添加什么功能来进化系统,直到最后。
我的系统设计面试行动计划?
网上有很多很好的资源可以为这次采访做准备,但我想提两个我觉得非常有用的资源:
- 多恩·马丁的《系统设计初级读本》:这是任何准备系统设计的人都应该至少看一遍但老实说要看很多遍的资料。这里要学习的最重要的主题是性能、可扩展性、延迟、吞吐量、可用性、一致性、cdn、数据库、缓存、负载*衡等。
- Youtube 上关于最受欢迎的服务的各种系统设计的视频:我说的是大的——网飞/Youtube/WhatsApp/脸书/Gmail/亚马逊等。你可以在 youtube 上找到很多关于所有这些服务的系统设计的视频。我绝对想喊出来的一个 YouTuber 是 Techdummies ,我在所有这些大*台上都看过他们的视频。至少对我来说,他用最简单的方式解释了概念。
我花了一周的时间来来回回地从观看视频跳到阅读多恩·马丁的知识库,为这次采访做准备,我认为这是正确的方式。此外,理解许多工程师使用的术语也很有趣,所以这也是一次很好的学习经历。
最后,在这次面试中最重要的是,你需要用面试官最少的投入来推动讨论。 有时面试官可能会要求你提供一个特定的功能,你应该实现它,但最终,这是你的系统,你需要以最符合逻辑的方式创建和添加你想要的功能,才能在这一轮中取得成功。
5.行为的
这次面试试图考察你是如何处理困难局面的。而且,你可以通过吸收和组织你过去所有的工作经验,你所面临的问题和你设计的解决方案来准备这次面试。你需要收集所有你解决了一个不可能的情况或者没能解决的例子。

米歇尔·邦克斯基在 Unsplash 上的照片
综上所述,掌控面试的最佳方式就是做你自己!
对我来说,这次面试就像是和面试官的一次讨论。他首先介绍了自己和他在 FB 所做的工作。然后他问了我正在做的项目,我们就项目的 ML 部分进行了一个小讨论。然后是一个非常正常的讨论,关于我会如何解决/处理类似“你在职业生涯中犯过什么不值得骄傲的错误?”(这不是我被问到的确切问题)。如果你在准备这次面试的时候能回忆起所有好的和不好的经历,并构思一些小故事,这将会很有帮助。但是最重要的一点还是要诚实,并且是对诸如“你和你的同事有过分歧吗?”这样的问题的一个完全正常的回答如果你没有异议,那就没有。对你的回答要非常诚实,因为这些行为轮的面试官很容易看穿一个说谎的人。
我认为,对我来说,这次面试进行得很顺利。
6.ML 系统设计

来源:脸书 ML 视频系列
这是一次发挥了我优势的面试,老实说,我并没有为此做太多准备。在这次面试中,我被期望创建一个系统来端到端地解决一个 ML 问题。
在这次面试中,面试官只是在评估你将商业问题转化为机器学习系统的能力。因此,你可能会得到一个问题陈述,比如开发一个系统来使用机器学习创建新闻提要,或者创建一个系统来过滤有害的评论,或者诚实地说,任何机器学习系统。
然后,您需要设计一个端到端的系统,同时讨论数据和数据收集的各个方面、EDA、功能工程、模型评估、模型测试、将模型投入生产以及最后的维护和反馈。
准备这次面试的一个很好的资源来自脸书本身:介绍机器学习视频系列脸书现场指南,这是我为这次面试做的唯一准备。
那是一天!
这是多么美好的一天。采访结束后,我去了伦敦和特拉法尔加广场,看人们表演各种各样的把戏和滑稽动作。然后步行回我的酒店。
总之,这是一次很好的面试经历,我没想到会对我有好处。数据结构是我从未申请大公司 ML 职位的主要原因,但当我读到它们时,我发现它们非常可行,而且如果你能花些时间,你可以学到一些东西。
因此,一年后,我加入了脸书伦敦公司,担任软件工程师(MLE ),由于 COVID 相关原因,我的加入期延长了。希望这次经历顺利。
继续学习
如果你想以更结构化的方式阅读更多关于算法和数据结构的内容,这里有一个由 UCSanDiego 在 Coursera 上提供的 算法专门化。 我在准备的时候旁听了这门课。
谢谢你的阅读。将来我也会写更多初学者友好的帖子。关注我在 媒体 或订阅我的 博客 了解他们。
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
[## 通过我的推荐链接加入 Medium-Rahul Agarwal
作为一个媒体会员,你的会员费的一部分给了你所阅读的作家,你可以在…上看到所有的故事
mlwhiz.medium.com](https://mlwhiz.medium.com/membership)
我如何创建一个歌词生成器
原文:https://towardsdatascience.com/how-i-created-a-lyrics-generator-b62bde13badb?source=collection_archive---------13-----------------------
用人工智能创作热门歌曲

图片: IB306660 ,经由pixabay.com(CC0)
网上有很多歌词生成器,虽然玩起来很有趣,但他们创作的歌曲没有多大意义。作为一个真正的人类歌曲作者(我已经写了 100 多首歌),我想一定有更好的方法来做到这一点,所以我决定利用机器学习的最新进展来建立自己的方法。没有好的方法来教人工智能“歌曲”的概念,但是可以使用 NLP 来训练它模仿你给它看的任何文本。我给它大量的歌曲来学习,最终,它能够输出听起来连贯的歌词。总的来说,该项目涉及了大约 50 个小时的编程,但最终结果是值得的:【https://boredhumans.com/lyrics_generator.php.
以下是我做这件事的细节:
我从微调 GPT-2 开始,这是一个开源语言模型,在超过 800 万个网页上训练,预测文本中的下一个单词。为此,我使用了 GPT-2 Simple (它有一个链接,任何人都可以通过谷歌 Colab 在免费的 GPU 上运行它)和一个包含 13,000 首诗歌的数据库。我原本打算在我下载的 400,000 首歌词的数据库上训练它,但其中许多都有脏话,性内容,毒品参考和其他不适合孩子的东西,我不想让我的模型学习所有这些。另外,我希望我的版本听起来比其他网站更“聪明”,所以使用诗歌似乎是一个更好的计划。
一旦我让它很好地用于创作诗歌,我就对我认为有诗意的艺术家(如鲍勃·迪伦、U2、泰勒·斯威夫特和几十个其他艺术家)的 7000 首歌词进行了更多的微调。但结果仍然是诗歌,所以我添加了一堆非 ML 的后期处理步骤,使它看起来更像宋立科的歌词。在 GPT-2 产生原始内容后,我使用前 6 行,称之为“第 1 节”,然后接下来的 4 行是“合唱”,然后接下来的 6 行是“第 2 节”,然后为了让合唱听起来像合唱,我再次重复第一个合唱。我还做了其他各种各样的小调整,比如过滤掉 r 级内容,删除原始歌词的最后一行,因为大部分时间它都没有完成(被剪掉),如果歌曲在所有删除后变得太短,则获得一套全新的歌词。有时它有像[重复合唱]或(乐器间歇)这样的短语,这是不好的,所以我也自动删除了这些台词。所有这些任务都是通过简单的 PHP 编程完成的,比如使用 str_replace 去掉我不想显示的各种字符:
$title = str_replace("/", "", $title);
这是为了删除重复太多的行:
// find repeated lines
for ($i = 0; $i < count($words); $i++) {
if (str_word_count($words[$i])) {
if ($counts[$words[$i]] > 5) array_push($repeated_lines, $i);
}
}
// remove repeated lines
for ($i = 0; $i < count($repeated_lines); $i++) {
if ($i > 3) {
unset($words[$repeated_lines[$i]]);
}
找出给每首歌起一个标题的最佳方式比我预想的要困难得多。有时人类词曲作者很难做到这一点,我不确定 ML 模型可以训练得很好,所以相反,我选择创建一些硬编码的规则来选择标题。我主要使用重复最多的行,但有限制,不能太短或太长。
这一切变得复杂的一个原因是,它是一个网站,而不仅仅是一个普通的 Python 程序。简单地找出将 Python ML 模型部署到 web 的最佳方式是一场磨难,因为它对于 Google Cloud Run 或 AWS Lambda 来说有点太大了,而在常规 AWS 服务器上运行它又太昂贵了。我最终使用了 AWS LightSail,它就像一个普通的 web 主机(如 DigitalOcean),但仍然具有普通 AWS 的许多优点。
此外,一旦部署了模型,还需要做更多的工作,使用 PHP 和 JavaScript/Ajax 使它真正发挥网站的功能。让我的 PHP 页面与 ML 模型(使用 Starlette/uvicon[类似于 Flask])的 REST API feed 一起工作时,我遇到了无尽的 CORS 跨域问题。它涉及到一些修复,比如向 Python API 部分添加如下代码行:
middleware = [Middleware(CORSMiddleware, allow_origins=['*'])]# Needed to avoid cross-domain issues
response_header = {'Access-Control-Allow-Origin': '*'}
并引用我的服务器的 SSL 证书,如:
if __name__ == '__main__':
uvicorn.run(
app,
host='0.0.0.0',
port=int(os.environ.get('PORT', 6006)),
ssl_version=ssl.PROTOCOL_SSLv23,
ssl_cert_reqs=ssl.CERT_OPTIONAL,
ssl_keyfile="./ssl/server.key",
ssl_certfile="./ssl/server.crt"
)
我的计划是最终将人工智能生成的音乐和人工智能生成的人声添加到歌词中。我已经试验过最先进的音频程序,比如谷歌的 Magenta ,虽然它确实输出好听的音乐,但远远达不到创作一首真正的歌曲所需的水*。加入人声更是难上加难,因为除了努力让它听起来像歌手而不仅仅是普通的电脑声音,歌词还必须与旋律/音乐同步。理想情况下,所有这些都可以自动生成,以配合人工智能歌词,然后我将有一首完整的歌曲从开始到结束,所以这是我接下来要做的。
统治他们的标签👉分析公司推文
原文:https://towardsdatascience.com/how-i-created-a-monster-function-to-discover-our-brands-twitter-best-friend-556f2c90dbb4?source=collection_archive---------42-----------------------
Twitter 标签和提及的数据分析(带酷炫功能&剧情!)

扬·巴布拉克在 Unsplash 上拍摄的照片
我们匆匆忙忙,很少停下来闻闻花香。斯多葛派告诉我们要思考我们生活的更大图景,我决定停下来分析我们品牌的 Twitter 账户的更大图景。
我们可以将这种数据分析诗意地命名为💐碎花的味道。
目标
可以用 Twitter 数据做很多事情,相信我,我几乎用尽了所有方法来折磨它(见笔记本的当前版本)。但是,在这篇文章中,我们将关注标签和提及的频率和使用。很快会有其他关于这些美味 话题的帖子,比如相关性、表情符号和一周中最悲伤的日子。
👉让我们开始吧:数据集
该数据集已从 Twitter Analytics 下载,涵盖时间为 2020 年 4 月至 9 月。尽管我很想拥有更多,但 Twitter 并不存储更早的数据,或者即使存储了,也不会向账户所有者公开。
该数据集包括账户@ makingjam 在此期间发送的所有推文。我的大部分推文都是我写的,因此任何后续的文本分析都将是对我营销头脑和幽默感的洞察——做好准备。
😩第一步:一团糟
一开始非常顺利,我们用这个简洁的脚本将所有单独的 csv 文件读入一个数据帧。
我们得到的结果是一个 529 行 40 列的杂乱数据帧。我会帮你省去所有的清洁工作,你可以在笔记本上看到。重要的是我们掉了一个没用栏目的调子。
让我们来玩玩我们“最喜欢”的数据类型、日期时间。
我们要做的是:
- 创建格式正确的日期和小时列,这在以后会很重要。
- 为一周中的每一天添加两列:一列用数字表示,另一列用友好的字符串表示。
现在,数据框的前几行如下所示。

在我们继续之前,我们还将添加两列来保存每条 tweet 中的标签数和被提及次数的值。
🐲第二步:进入怪物功能
我们想从数据框中的文本中提取很多内容。对于标签和提及,我们分别需要:
- 一张所有人的名单
- 独特标签或提及的数量
- 一个集的独特之处
- 具有使用频率的数据帧*
- 十大最常见的
*可能是字典。请随意重写我的 monster 函数,以包含一个字典和一个元组来完成返回数据类型的列表。👌
为了检索整个 this^,我写了一个函数的怪物。对我来说,那是个怪物。
我的额外收获是实例化一个类和对象。如果我所做的方式或者它在函数中的事实对于那些更精通 Python 的人来说是很糟糕的事情,请告诉我。老实说,这是我第一次在辅导课之外做这件事。
现在我们可以得到关于标签的所有统计数据。多么快乐!

分享一个截图,而不是一系列的短片。我希望你原谅我。
🍬剧情!
请记住,我们还有一个完整的数据框架,其中包含了标签的频率。什么意思?对 pyplot 和 seaborn 粉丝的款待——我们可以策划他们!
输出:

猜猜做果酱的牌子是关于什么的!
没错,我们使用的热门标签反映了真相:制作果酱 是关于产品管理(和事件)。此外,我们在推特上发布的数据框涵盖的事件包括 JAM London、Remote PM 和 JAM Barcelona。
🔎第三步:放大标签
如果我们希望看到的是绘制一个特定标签在特定时间段内的使用情况呢?
请便!
首先,我们必须创建一个列来保存每条 tweet 中使用的所有标签。为此,我们创建了一个函数,它的名字就像是西尔维斯特·史泰龙的一部电影的标题。💪
为了规划所选标签的使用,我们需要对文本进行矢量化——创建一个稀疏矩阵,反映哪个标签出现在哪个推文中。要做到这一点,我们只需要带有标签的文本列,但我们需要日期来绘制结果。
输出:

是的,数据帧大部分是零。看起来很无聊,但它非常有用,因为现在我们可以绘制一段时间内所选标签的使用频率。🎉
你可能已经注意到,我编写这些函数的方式可以在以后重用,以获得相同的提及统计。🤔向前思考🤔
让我们用标签来描述发生在 2020 年 5 月的远程总理事件。
plot_usage(hahstags_vectorized, ‘TheRemotePM’, date1=’2020–04–20', date2=’2020–05–21')
🙋♀️给 5 岁孩子的问题:你能猜出远程预防性维护发生在哪天吗?
输出:

🎖最常用的标签
我们可能还想知道特定时间段内使用最多的标签。
most_used_h_or_m(hahstags_vectorized, '2020-06-01', '2020-06-30')
输出:
('product', 14)
也是整个集合中使用最多的 hashtag。
变量‘earliest _ tweet’和‘latest _ tweet’是在笔记本的开头定义的。
输出:整个数据集使用最多的 hashtag 是:product,有 127 次提及。
💁♀️结论:这些推文大部分都是关于产品的,omnia product 的 product um,套用一句著名的悲观名言。
💙第三步:我们推特上最好的朋友
这一部分会更短,因为我们已经有了所有的函数,我们可以重复使用来处理提及。如果你读到这里,我敢肯定你已经迫不及待地想要了解这个数据集中提到的所有数据。
让我们在@上部署怪物功能。

分享一个截图,这样你就可以同时看到代码和输出,否则会有太多的小片段。
这里有一些很酷的人和团体!向马特·勒梅,玛蒂尔德·利奥,三角女孩,吉布森·比德尔,苏珊娜·维黛拉·洛佩斯,索菲亚·金特罗,蒂姆·赫比格,科斯塔·科列夫,亚历克西斯·奥德修斯。
接下来,“西尔维斯特·史泰龙函数”再次进入,创建一个包含提及列表的列,作为向量化的准备步骤。
矢量化!
输出:

这个图和同一时期的标签图有明显的相似之处。🤔
马特·勒梅和远程首相有什么关系?
💁♀ ️He 是东道主!
最后一步:
输出:整个数据集中使用最多的提及是 mattlemay,有 37 次提及。
我承认这里的措辞有点客观化,抱歉马特。但是,我们也认为你是我们 Twitter 上最好的朋友!至少在数据集覆盖的时间段内是如此。
👀下一步是什么?
我将每月从 Twitter analytics 下载一个新的 csv 来扩充数据集。我很确定那里有自动化的空间。而且,也许一旦我掌握了画面——看这个空间!—可能会出现相应的操控板。
这是一系列帖子中的一篇,灵感来自我们品牌的 Twitter 数据集。您可以在此了解更多信息:
- 🙋♀️Does 表情符号的使用与推特互动相关吗?
- 😭Twitter 上最悲伤的一天:情绪分析&公司推文中的参与趋势
- 😅你有多重复?使用 Python 揭示推文中的单词模式。
我如何为 COVID 创建一个实时的 Twitter 情绪分析工具
原文:https://towardsdatascience.com/how-i-created-a-real-time-twitter-sentiment-analysis-tool-for-covid-292ff6a6323b?source=collection_archive---------26-----------------------
利用机器学习和 Python,我开发了一个模型,将关于 COVID 的推文分为正面、负面或中性。

Twitter 是最成功的微博服务,每天有 1.5 亿用户。每秒钟写 6000 条推文。人们在推特上发布任何想到的东西,并使用标签将推文与主题联系起来。
我们可以建立一个机器学习分类器,根据他们的情绪对推文进行评级。一条推文可以表达积极、消极或中性的情绪。
我将创建一个简单的模型来实时分类此类推文,并为 COVID 的整体情绪创建一个图表。人们对这种病毒有什么看法?
1.资料组
首先,我需要一个已经分类到三个类别之一的推特数据集来训练我的模型。Sem-eval 提供了一个相对较大的数据集,包含 65.854 条已标记的推文。因为没有特定于 COVID 的 twitter 数据集,所以我将使用一个通用的 twitter 数据集。
2.文本预处理
接下来,我将使用 16 种预处理技术的组合来预处理推文。tweet 的初始形式不适合自然语言处理(NLP)。推文不干净,包含 URL、用户提及、俚语、缩写、数字、重复的标点符号、拉长的单词等。
因而有这样一段文字:
呆在家里!!注意安全!!保持快乐!!活下去。我们可以和 https://t.co/SEpa9yxg87 一起战斗
会变成:
呆在家里多感叹保持安全多感叹保持快乐多感叹保持活力。我们可以用 COVID-stayhomestaysafe stay health 网址战斗
3.机器学习
我在预处理过的数据集上训练了 10 个机器学习模型。我选择不使用深度学习模型(如 BERT ),因为我不是专家。因此,我使用了逻辑回归、朴素贝叶斯、K *邻、随机森林和支持向量机等模型。后者在性能(f-measure)上胜过其余的,我选择了它。
执行了列车测试分割(20%测试)。TF-IDF 矢量器将文本标记转换为数字,未删除停用词,分类的性能指标如下所示。

ML 模型的性能。
我选择了线性 SVC,并对整个数据重新训练了模型。我记得在过去,支持向量机是 NLP 的最新技术!被训练的模型被保存在困境中。
4.实时预测
为了实时获取推文,我需要一个账户和一个 api 密匙。接下来,我可以选择关键词,只有包含这些关键词的推文才会被返回。我选择了“covid”作为关键字。
当从推文流中获取一条新推文时,经过训练的模型会预测其情绪,并将该推文保存在文本文件中。
与此同时,一个脚本正在运行,随着更多的数据添加到文本文件中,该脚本会实时绘制文本文件的内容。它使用 matplotlib 的动画功能来刷新情节。如果推文是正面的,y 轴得到+1,如果是负面的-1,中立的+0。
这是:
实时推特情感分析。
可以看出,在 1000 条关于 COVID 的推文之后,整体情绪是-80。
可以为任何关键词生成相同的实时图,脚本可以全天候运行以收集和标记推文。
感谢阅读!
我如何用投影贴图制作短片
原文:https://towardsdatascience.com/how-i-created-a-short-film-with-projection-mapping-8a950462509b?source=collection_archive---------35-----------------------
我使用 Lightform 对我的画进行投影映射,以创建一个短片,并对神奇的结果感到完全敬畏。

图片来源:基拉·布尔斯基(作者)
在隔离期间,我花了很多时间进行艺术实验和创作。3 月 27 日的周末,我参加了虚拟的被困在家里的 48 小时电影项目。我有整整 48 小时来制作一部完整的短片。这将是我的第十五个 48 小时电影项目…你可以说我有点痴迷。为了迎接挑战,我决定把这个项目作为一个机会,更深入地研究投影制图。
如果我创作了一部完全投影映射的电影,会发生什么?

视频鸣谢:基拉·布尔斯基(作者)
什么是投影映射?
投影映射,也被称为空间增强现实,是一种投影视觉互动并适合非*面三维表面的技术。你可以投影地图日常物体,建筑物,花卉,人-任何你能想象的,你可以投影地图!点击,通过投影映射中心了解更多信息。
什么是光形态?
Lightform 简化了美国创意人员的投影映射流程。他们设计了一个应用程序,就像 Photoshop 在真实的非数字世界中处理光线一样!太令人兴奋了。我完全爱上了这家公司。

“新思想/无思想”制作过程中的光形式应用——图片来源:基拉·布尔斯基(作者)
Lightform 简化了美国创意人员的投影映射流程。他们设计了一个应用程序,就像 Photoshop 在真实的非数字世界中处理光线一样!太令人兴奋了。
“Lightform 是一种新的设计工具,允许任何人创建投影增强现实体验。投影增强现实使用投影仪为现实生活添加数字信息和神奇效果。与目前的 AR 和 VR 形式不同,投影的 AR 可以用肉眼看到,不需要耳机或手机。
我们希望设计一个未来,在那里数字艺术和信息可以无缝地融入现实生活,不受矩形屏幕的限制。"
-轻型

视频鸣谢:基拉·布尔斯基(作者)
Lightform 工作原理的简化版本:
- 投影仪发出一系列结构光,摄像机扫描场景。
- Lightform 软件从这个过程中收集深度数据。
- 有了这些数据,您使用 Lightform 设计的投影可以无缝地交互并集成到您的真实环境中。纯魔法!
电影概念
在“新思想/无思想”中,一幅画意识到她生活在一张纸上,并经历了意识的转变。

视频鸣谢:基拉·布尔斯基(作者)
我受到启发,讲述了我心理健康之旅的故事。通过冥想,我经历了对现实感知的转变。我已经超越了我曾经认为的现实范围。用语言描述这种经历是相当困难的,但它是美丽的,给人以生命。这部电影是我描绘那段经历的尝试。
物理图纸上的增强现实投影感觉像是一种非常合适的媒体,可以用来描绘一个人对现实感知的扩展。

视频鸣谢:基拉·布尔斯基(作者)
物理图纸上的增强现实投影感觉像是一种非常合适的媒体,可以用来描绘一个人对现实感知的扩展。



视频鸣谢:基拉·布尔斯基(作者)
过程
在构思出概念和故事板之后,我能够将视觉效果缩小到五幅关键的图画。这些画是我的主要镜头,我将在上面投影贴图。



图片来源:基拉·布尔斯基(作者)
我把图纸留得很简单,让自己在投影设计上更灵活。我可以给线条画添加生命和运动。



视频鸣谢:基拉·布尔斯基(作者)
接下来,我利用 Lightform 扫描我的图纸并设计投影。我利用了 Lighform 的一些内置效果和纹理,并获得了额外的免版税动画和剪辑(如窗口中的日落延时剪辑)。

视频鸣谢:基拉·布尔斯基(作者)
我还为其中一个场景绘制了投影图!说到混合现实…被投影映射是相当令人神往的。

视频鸣谢:基拉·布尔斯基(作者)
我拍摄了整张纸的“宽”镜头以及脸部特写和其他投影细节,以便在 Adobe Premiere 中进行编辑。
最终的电影
这是最后一部电影“新思想/没有思想”,全部在 48 小时内完成!
结论
在相机上捕捉投影贴图是一回事,但亲自体验它会让它达到一个全新的水*。投影映射有许多令人兴奋的可能用途:交互式装置、电影制作、现场表演等等。
我有一系列即将到来的项目,在这些项目中,我将进一步试验这项技术。说我很兴奋是一种保守的说法。请随意伸出手来,跟随我的冒险之旅。我把神奇的创意传递给你。

视频鸣谢:基拉·布尔斯基(作者)
基拉·伯斯基是一名电影制作人、多学科艺术家和魔法探索者。她的电影在 YouTube 上有超过 1800 万的浏览量,并在全球放映。
我如何用 D3.js 创建了一个交互式的滚动可视化,你也可以
原文:https://towardsdatascience.com/how-i-created-an-interactive-scrolling-visualisation-with-d3-js-and-how-you-can-too-e116372e2c73?source=collection_archive---------2-----------------------
通过交互式和可滚动的可视化,让您的故事栩栩如生,这通过出色的 D3.js 库成为可能

按类别划分的大学专业

动画版
[## 最佳大学专业
大多数人想要一个能让他们毕业后赚大钱的学位。这里是(几乎)所有的…
cuthchow.github.io](https://cuthchow.github.io/college-majors-visualisation/)
- 可视化
- 代码(Github Repo)
动机
网络上充斥着滚动和交互式可视化的惊人例子,通常是用 D3 构建的。如果你读过《彭博》或《纽约时报》的这类专题文章,我肯定你知道我在说什么。我最喜欢的这种形式的例子有:
- Shirley Wu 的对汉密尔顿中非常线的示范性可视化,用 D3 和 React 构建。事实上,她所有的工作都很出色。
- 《纽约时报》关于经济如何被衰退重塑的文章,用 255 个不同的图表讲述。
- 这个绝对令人难以置信的作品,可视化了机器学习的内部机制,由 R2D3 的人创造。
- 这种古怪的形象化,分解了我们每天消耗的水量
- 《纽约时报》的另一篇文章,描述了背信弃义地爬上埃尔卡皮坦的黎明之墙
- 还有这么多更。
- 说真的,这些项目中的每一个都值得检查和学习。他们太棒了。
每一次滚动事件后,视觉元素的行为方式令人满意,完全受你的控制。很多时候,当我上下滚动页面,看着所有的形状和颜色飞来飞去,我的脸上挂着灿烂的笑容。这种感觉让人想起自己发现了数据中的秘密,我相信这是这些演示如此令人信服的原因。它还提供了一个更具命令性的叙事流程,这在其他静态作品中是缺乏的。浏览这些文章,你可能会发现自己制作这样的视觉效果会非常复杂,你可能会认为它们最好留给顶级出版物的编辑和作者。但我在这里帮助消除这种观念:任何人都可以做一个,包括你!
在通读了一堆在线资源之后(我会在文章末尾列出这些资源),我决定尝试自己创建一个。正如我之前提到的,学习一项新工具、技术、技能或能力的最好方式是在你知道自己是否有能力做这件事之前,就把它投入使用。这就是我在一周内所做的。
(本文假设您对 D3.js 及其工作原理有一些基本的了解)
项目描述
在浏览了一系列数据集后,我找到了一个托管在 Kaggle 上的数据集,它最初来自分析博客 Fivethirtyeight(如果你正在寻找很酷的数据集,请查看谷歌的数据集搜索工具)。这是一个(有点过时的)关于美国大学专业的数据集。它有每个大学专业的注册人数的信息,以及这些学生的中位数,第 75 个百分点和第 25 个百分点的工资。有趣的是,它还提供了每个专业的男性/女性代表的信息,我认为这将是这篇文章的一个重点。
决定数据集后,我开始在 Jupyter 笔记本上使用 Python 和 Pandas 探索数据,寻找任何有趣的趋势或我想在可视化中强调的点。我还对我想在最终产品中展示的图表做了粗略的*似。

我匆忙拼凑的几张草图,只是为了大致勾勒出我希望达到的叙事流程
我对观想的总体概念是,每个大学专业都用一个泡泡来代表。然后,气泡会根据我试图强调的数据类型(如性别差异、工资中位数、类别分组等)改变形状和颜色。).当气泡被特定的属性分组时,我想通过一个 D3 力模拟来实现,这样气泡看起来会被一个看不见的力吸引。

我用 matplotlib 制作的性别分布与工资中位数图表的预览。我在研究这些数据,看看是否有有趣的趋势需要强调,这是其中之一
经过一番探索,我知道我想关注的是专业内的性别分布对毕业生*均工资的影响。我强烈建议你在开始任何可视化过程之前深入研究你的数据,因为在真正坐下来编码最终产品之前,你想要有一些你脑海中的交互的表象。
如果您想要一种真正快速的方法来观察变量之间的关系,python 可视化包 seaborn 有一个“pairplot()”方法来帮助您做到这一点,它会在传递给它的数据帧中的所有变量之间创建一个散点图矩阵。
**#Plotting a scatter matrix**import seaborn as snsfactors = df[['Total', 'Major_category', 'ShareWomen', 'Sample_size', 'Employed', 'Unemployed', 'Median']]sns.pairplot(factors)

根据数据子集创建的配对图示例
现在我们对想要包含的东西有了一个坚实的想法,我们准备开始创建。
处理滚动事件
这(显然)是你构建的每个滚动条中最重要的部分。但方便的是,它也是最可重用的部分,这意味着一旦构建完成,就可以开始使用了。
事实上,我已经创建了一个滚动条功能的模板版本,你可以在这里找到它。(再次感谢吉姆·瓦兰丁汉姆,因为使用的大部分代码来自他的原创文章。事实上,他写了一篇关于创建滚动器的类似文章,重点是滚动机制,所以你应该先读一下。在这篇文章中,我将把重点放在我发现令人困惑的元素上,并把重点放在实际创造观想的部分上。
HTML 和 CSS 大纲
整个可视化应该包含在一个 HTML 页面中。在页面中,有一个包含所有元素的 div,在这个 div 中,有两个单独的 div 用于文本和可视化。
在“sections”div 中有一组 section 元素,每个元素都有一个类“step”。这些部分中的每一个都应该包含一个不同的文本部分,并且对应于观想的一个阶段或部分。当用户在部分之间移动时,可视化将被更新,
<div id="graphic"> <div id="sections"> <section class="step"></section>
<section class="step"></section> </div>
<div id="vis"> </div>
</div>
您可以随意调整这些元素的大小和位置,只要您将#vis 元素固定在页面上(使用 display: fixed),这样它就不会随着用户的滚动而移动。您也可以调整每个的高度。step 元素基于您希望每个部分包含多少文本。
滚动事件
下面是处理滚动事件的代码。我添加了一些注释来澄清某些部分。
function scroller(){ let container = d3.select('body')
let dispatch = d3.dispatch('active', 'progress');
let sections = d3.selectAll('.step')
let sectionPositions
let currentIndex = -1
let containerStart = 0;**// Binds the position function to the scroll event, and the resize function to the resize event. What these functions do are detailed below.** function scroll(){ d3.select(window)
.on('scroll.scroller', position)
.on('resize.scroller', resize) resize(); let timer = d3.timer(function() {
position();
timer.stop();
});
}**//The resize function determines where each of the .step elements are on the page, relative to the top of the first element. It saves all of the co-ordinates of these elements in an array called sectionPositions** function resize(){
sectionPositions = [];
let startPos; sections.each(function(d, i) {
let top = this.getBoundingClientRect().top;
if (i === 0 ){
startPos = top;
}
sectionPositions.push(top - startPos)
});
}**//The position function determines where the user is on the page (using window.pageYOffset), and uses that to determine which section of text should currently be in view. It then uses D3’s dispatching tools to signal the 'progress' event, which will be used in the main script, passing along the current section index so that the script knows which stage of the animation/visualisation should be showing.** function position() {
let pos = window.pageYOffset - 300 - containerStart;
let sectionIndex = d3.bisect(sectionPositions, pos);
sectionIndex = Math.min(sections.size()-1, sectionIndex); if (currentIndex !== sectionIndex){
dispatch.call('active', this, sectionIndex);
currentIndex = sectionIndex;
} let prevIndex = Math.max(sectionIndex - 1, 0);
let prevTop = sectionPositions[prevIndex]
let progress = (pos - prevTop) / (sectionPositions[sectionIndex] - prevTop);
dispatch.call('progress', this, currentIndex, progress)
}//**The code here adds an event listener to the dispatcher.** scroll.container = function(value) {
if (arguments.legth === 0){
return container
}
container = value
return scroll
} scroll.on = function(action, callback){
dispatch.on(action, callback)
};
return scroll;}
上述所有代码都保存在一个单独的脚本文件中。然后我们创建一个主脚本文件,它负责在每次查看器改变部分时更新可视化。
let scroll = scroller().container(d3.select('#graphic'))scroll()let lastIndex, activeIndex = 0**//This is where most of the magic happens. Every time the user scrolls, we receive a new index. First, we find all the irrelevant sections, and reduce their opacity.** scroll.on('active', function(index){
d3.selectAll('.step')
.transition().duration(500)
.style('opacity', function (d, i) {return i === index ? 1 : 0.1;});**//Next, we selection from a range of activationFunctions (which we create), based on the index of the current section.** activeIndex = index
let sign = (activeIndex - lastIndex) < 0 ? -1 : 1;
let scrolledSections = d3.range(lastIndex + sign, activeIndex + sign, sign);
scrolledSections.forEach(i => {
activationFunctions[i]();
})
lastIndex = activeIndex;})**//I placed all the functions in an array. Each function corresponds to a different change in the visualisation. One may change the graph into a scatter plot, and another may initiate a force simulation.**let activationFunctions = [
draw1,
draw2,
draw3,
draw4,
draw5,
draw6,
draw7,
draw8
]
构建滚动条的一般建议
有了滚动条的一般组件,你从这里开始所做的将会根据你希望构建的观想类型而有很大的不同。尽管如此,我还是希望能提供一些有用的建议,我希望我能在这个过程中早点意识到。
在起点画出所有的元素
基本思想是,当页面加载时,应该创建可视化所需的所有元素。我创建了一个名为 drawInitial()的函数,并在数据加载后调用它。这包括创建所有的比例,轴,形状,用于模拟和其他你在观想中需要的元素。
一旦它们都创建好了,你可以简单地把它们的不透明度属性设置为 0,以确保它们直到可视化需要时才显示出来。确保每组特征(即特定图表的一组轴或详细标注)都有相关的类名或 ID 名,以便在需要时可以引用这些特定的特征。
我发现创建一个清理函数很有用,它会在每一步被调用。我将传入我试图创建的图表类型,该函数将移除(或者隐藏)与该图表无关的所有元素,从而使我不必编写大量重复的代码。这是函数的一部分:
function clean(chartType){
let svg = d3.select('#vis').select('svg') if (chartType !== "isScatter") {
svg.select('.scatter-x').transition().attr('opacity', 0)
svg.select('.scatter-y').transition().attr('opacity', 0)
} if (chartType !== "isMultiples"){
svg.selectAll('.lab-text').transition().attr('opacity', 0)
svg.selectAll('.cat-rect').transition().attr('opacity', 0)...
与原力打交道
正如我提到的,我将使用力模拟来分组几个阶段中的圆形元素。要记住的关键是,每次重新使用时,要“重新加热”力模拟。D3 的力模拟有一个 alpha 值,这是一个冷却参数,随着时间的推移逐渐减少,减少了力对节点的影响。你应该在每次重启原力时将 alpha 重置回某个值,以确保它有足够的“能量”达到期望的状态。您还可以调整 alpha 衰减率,以影响模拟稳定到*衡状态的速度。
总是使用过渡
这一部分很关键:当改变观想的状态时,总是使用过渡,即使这种改变是你想要立即发生的。通过利用 D3 的转换特性(即使持续时间为 0),您允许更改被中断。这意味着,如果用户快速滚动各个部分,一个过渡可以被下一个覆盖,从而避免出现尴尬、无效的状态。
你鼓舞了我
SVG 元素是根据它们被附加到父元素的时间来排序的。把它想象成把颜料泼在画布上:最后一层颜料是在顶部可见的。您可以通过将元素从它们的父元素中移除,然后再将它们追加到最末尾来对元素进行重新排序。或者,您可以利用 D3 的. raise()和。lower()方法,当给定一组元素时,这些方法可以方便地完成这个过程。
构建一致的调色板
颜色是良好数据可视化不可或缺的组成部分。在我的项目中,我试图用颜色对 16 种不同类别的大学专业进行编码。这导致了一个精心挑选颜色的过程,因为我想避免任何两种颜色太相似,因此很容易混淆。
我强烈推荐使用颜色搜索来构建你的调色板。这是一个网站,其他创意人员已经建立并分享了他们自己的调色板,它允许你轻松地复制你想要的颜色的十六进制代码,并保存你自己的调色板以供将来使用。
希望这至少揭开了滚动可视化过程的一部分。老实说,这比看起来容易得多,所以一定要去找一个有趣的数据集,亲自尝试一下!
参考的资源
- 吉姆·瓦兰丁汉姆:关于小偷的文章,博客
- 吴雪莉的作品,还有她的 YouTube 频道和 Twitch streams
- 迈克·博斯托克,积木,关于如何滚动的文章
我如何创造我的第一个 Alexa 技能
原文:https://towardsdatascience.com/how-i-created-my-first-alexa-skill-2bf36b921629?source=collection_archive---------40-----------------------
我向你展示了我如何创建我的第一个 Alexa 技能,一个简单的电话前缀信息工具

丹尼尔·方特内尔在 Unsplash 上拍摄的照片
我相信在未来,我们会用语音助手取代我们用手机做的大多数事情,我们会像现在携带智能手机一样携带小型入耳式耳机。
在这篇文章中,我将向你展示我如何为亚马逊的语音助手 Alexa 创建我的第一个技能。我按照亚马逊的这个叫做“蛋糕行走”的教程系列,应用这些步骤来创造我自己的技能。
语音体验设计
教程开始解释技能设计,在编写任何代码之前,从一个好的声音设计开始是非常重要的。首先画一个流程图,说明你的用户将如何使用技能,用户会说什么,Alexa 会回答什么,以及对话可以遵循的不同路径。

我技能的通量图
另一件要记住的事情是我们的技能说话的方式。它必须遵循一些声音设计的准则。这方面的一些例子是告诉用户有哪些选择,等待用户的回复,询问封闭式问题而不是开放式问题。使用自然口语也很重要,我们写的和说的不一样,你写的代码会被 Alexa 读取,所以要确保它听起来像自然口语。
我的想法是创建一个电话前缀信息工具。每个国家都有一个定义好的国际电话前缀,通过查看来电电话的前几个号码,你可以知道它来自哪个国家。例如,像 +34 123456789 这样的手机属于西班牙。回到我的 Alexa 技能,目标是创造一个技能,告诉你你问的前缀属于哪个国家。
让我们开始编码吧
首先,你需要一个亚马逊开发者账户来访问 Alexa 开发者控制台,在那里你可以创造自己的技能。一些示例 Hello World 代码是在开始时创建的,作为您技能的补充。你可以改变一些文本,看看每一段代码是如何影响你的技能行为的。
由于我的技能,我不得不改变文本,使它们谈论电话前缀,然后修改代码以等待对欢迎消息的回答(唯一有效的回答将是一个号码)。收集用户的答案在 Alexa 的术语中称为意图。我们需要为我们期望从用户那里得到的每个答案定义一个意图。
对于我的简单技能,我只需要一个意图,用户给我一个电话前缀。对于每个意图,我们必须定义用户可以说出信息的所有不同方式,称为话语。话语可以包括后端代码可访问的变量,称为意图槽,它们也必须被定义。

用户可以说的一些示例话语
我的技能是用西班牙语制作的,所以话语也是用那种语言。话语的目标是尽可能多地捕捉用户可以说出的短语。
例如,用户可以说“前缀{号码}”或“前缀{号码}”。两者都应该被 Alexa 接受。对于我们的技能,我们必须定义尽可能多的话语,这样用户才能自然地说话并被理解。
我们必须考虑许多不同类型的用户和他们说话的不同方式。
最难的部分
最难的部分是创建程序逻辑,即搜索国家代码并指出它属于哪个国家的代码。我唯一能找到的是一个数据库,里面有电话前缀和国家名称的成对关键字。它是英文的,所以我必须把所有的东西都翻译成西班牙语,为此我使用了 DeepL ,这是一个人工智能翻译器,效果惊人,几乎所有的东西都在第一次尝试中被完美地翻译了。

国家-电话前缀数据库
然后只需将用户的话语与数据库连接,并将国家返回给用户。
最终步骤和发布
在发表之前,你必须填写一个表格,里面有关于你技能的相关数据。这是用户在 Alexa 应用程序上浏览技能商店时看到的内容。

然后在亚马逊的服务器上运行一些测试,检查所有需要的信息,并找出常见的错误。如果这些测试都通过了,我们可以进入下一步,发布技能!
亚马逊完成了一个验证过程,就我而言,在我的技能发表之前花了大约一周时间。
如果你用西班牙语配置了 Alexa,你可以通过说“Alexa,abre prefijos telefónicos”找到我的技能
我如何使用深度学习和光流算法创建锻炼运动计数应用程序
原文:https://towardsdatascience.com/how-i-created-the-workout-movement-counting-app-using-deep-learning-and-optical-flow-89f9d2e087ac?source=collection_archive---------14-----------------------
不要自己跟踪动作,让人工智能替你做!

来源阿洛拉·格里菲斯,经由 unsplash (CC0)
我喜欢进行锻炼和不同类型的训练,如 crossfit,但当训练强度太大或时间太长时,我注意到我经常在计算每次锻炼的运动次数时出错,这可能是因为在训练期间没有专注于运动计数任务,或者下意识地高估了完成的运动次数。作为一名计算机科学理学士三年级的学生,我决定在我的课程工作中解决这个问题,并创建了一个 Web 应用程序来计算锻炼过程中进行的移动次数。在这篇文章中,我想分享我解决这个问题的方法。你可以在 github 库中找到该应用的完整代码。
算法
为了执行运动计数,您必须知道身体在每一帧上是向上还是向下运动。通常,为了完成这样的任务,我需要使用一些 RNN 架构,因为,很明显,你不能只使用一帧来检测运动的方向。他在这张照片上是向上还是向下移动?

https://www.youtube.com/watch?v=7wblGkVQx3U
但我没有足够的训练数据来建立一个稳健的 RNN 模型,因为我必须自己准备和标注数据。我试着朝 PoseNet 模型的方向看,以获得每一帧上每个身体部位的坐标。

https://medium . com/tensor flow/real-time-human-pose-estimation-in-the-tensor flow-js-7 DD 0 BC 881 cd5
这种方法也没有好处,原因有几个:
- 如果我在它被训练的相同环境(相同的房间,相同的视频角度,相同的人)中尝试,该模型表现良好,但是要为一个练习制作一个健壮的模型,我仍然需要大量的训练数据。
- 没有使用 GPU 卡的 PoseNet 的 FPS 真的很低。
- 在某些帧上,检测到的身体部位的质量很低。
总而言之,我玩了很多不同的模型,它们都在某种程度上给出了一个糟糕的结果。直到有一天我了解了光流算法,尤其是密集光流实现(下图的右边部分)。简而言之,这种算法跟踪像素沿着一定数量的连续帧的运动。

https://nanonets.com/blog/optical-flow/
可以使用一些数学模型(例如,在 OpenCV 库中实现)来估计光流,或者可以使用深度学习来直接预测光流,这在复杂的视频场景中给出更好的结果。在我的实现中,我决定坚持使用密集光流算法,它是在 python-opencv 包中实现的。
这就是如何用密集光流对一个俯卧撑进行颜色编码。

【https://www.youtube.com/watch?v=xoCKHx8Yyj4 号
如你所见,密集光流将向下运动编码为绿色,将向上运动编码为紫色。因此,知道了每个帧的颜色编码表示,我可以很容易地构建一个简单的 CNN 网络来执行帧的多类分类。我只是在 PyTorch 中堆叠了一些 Conv +池层,这导致了下面的简单架构。
为了训练这个模型,我加载并按帧标记了几个 YouTube 视频,我自己也准备了一些俯卧撑视频。最后,我有一个彩色编码图像的训练集,包括 252 个向下移动的帧,202 个非上推帧和 206 个向上移动的帧。我还准备了一个由 140 个不同动作的帧组成的小验证集。在运行了 10 个时期的训练循环后,我得到了一个非常令人印象深刻的模型对数损失图。

训练与验证集的对数损失
显然,对于模型来说,预测这三个类别并不太难,因为只需用眼睛观察彩色编码的图像就可以很容易地做到。
更重要的是,经过训练的模型能够对框架进行分类,不仅是俯卧撑,还包括俯卧撑、深蹲和引体向上。一般来说,我想这个精确的模型可以很容易地对所有高振幅的运动进行分类,包括上下运动。
不过,要对一些练习进行分类,如仰卧起坐或一些低幅度的哑铃运动,最好收集一套新的训练集,并重新训练当前的模型。
App
为了在现实生活中应用我的模型,我使用 Django 创建了一个小的 Web 应用程序,在那里我可以创建一个新的锻炼,并在“战斗”环境中尝试我的模型。这是它的样子。

web 应用程序的主屏幕
总的来说,在训练的时候,我注意到俯卧撑、深蹲、引体向上的误差在 2.5% 左右。对于 burpee 来说,误差大约在 5% 左右,这是因为练习涉及到不止一个上下运动。以下是模型在锻炼过程中计算俯卧撑的方法。

结论
总之,这项工作对我来说是一次很好的经历,因为我必须做大量的研究,并测试锻炼过程中运动计数问题的不同假设。我的时间跟踪器显示,现在我已经在这个应用程序开发上花了大约 75 个小时,但谁知道呢,如果我决定继续这个项目,让它变得更大,我可能会花更多的时间。谢谢你的阅读!
你可以在我的 网站 上查看其他帖子
我习惯如何将数据与熊猫绑定
原文:https://towardsdatascience.com/how-i-customarily-bin-data-with-pandas-9303c9e4d946?source=collection_archive---------9-----------------------
熊猫“咔”和“咔”
您可能只使用了默认值

照片由斯蒂夫·约翰森在 Unsplash 上拍摄
动机
“这是什么鬼?”
这是初学者在查看一些硬函数的输出时经常得到的反应。很多教程和课程用一句话就介绍了这些功能,然后转到其他话题,这总是让我感到困惑。即使你从头到尾阅读他们的文档,我保证也要超过一分钟。
作为一个初学者,当我遇到这种情况时,我总是很沮丧。有一次,当我在 Udacity 攻读纳米学位时,我正在学习 Matplotlib 的热图。如果你知道,Matplotlib 不能像 Seaborn 一样自动为热图创建注释,所以你必须手工创建它们。为此,你可以使用qcut或cut(这是本文的主题)将你的数据分类,我对这些函数完全陌生。
讲师用一句话简单地“解释”了这些功能,屏幕上出现了文档链接🤦♂️.他甚至快进了他输入语法的部分。
最*,我一直在写一个小编,解释pandas最难的功能,希望其他人不会面临同样的困难。这是第四部分,是关于使用qcut和cut的宁滨数字数据。
[## 通过我的推荐链接加入 Medium-BEXGBoost
获得独家访问我的所有⚡premium⚡内容和所有媒体没有限制。支持我的工作,给我买一个…
ibexorigin.medium.com](https://ibexorigin.medium.com/membership)
获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:
[## 阿尔法信号|机器学习的极品。艾总结的。
留在循环中,不用花无数时间浏览下一个突破;我们的算法识别…
alphasignal.ai](https://alphasignal.ai/?referrer=Bex)
可点击的目录
∘ 动机
∘ 设置与基础探索
∘ 音程记谱复习
∘ 熊猫 qcut()
∘ 熊猫 q cut()
文中用到的笔记本可以从这个 GitHub repo 下载。
设置和基本探索
对于样本数据,我将使用内置的seaborn数据集planets:

>>> planets.describe()

planets数据集是从美国宇航局的系外行星目录下载的,包含了太阳系外行星的数据。感兴趣的三列是orbital_period、mass和distance:
mass-这颗行星比木星重多少倍distance-这颗行星距离地球多少光年orbital_period-地球绕其恒星一周需要多少个地球日
区间记数复习器
为了从这篇文章中获得最大的收获,并理解我将使用的一些语言,这里有一个关于区间符号的温和复习:
- (1,10) :两边不闭合。不要在区间中包含 1 和 10
- 【1,10】:左闭区间。包括 1 但不包括 10
- (1,10):右闭区间。包括 10 个,但不包括 1 个
- 【1,10】:两边闭合。包括 1 和 10
熊猫qcut()
为了理解qcut()是如何工作的,让我们从直方图开始:
sns.histplot(planets['mass'])

直方图自动将一个数组或一个数字列表分成几个箱,每个箱包含不同数量的观察值。在seaborn中,可以控制箱子的数量:
sns.histplot(planets['mass'], bins=10)

直方图是你可能见过的第一个宁滨数据的例子。下面是使用pandas的describe()功能的另一个例子:
默认情况下,describe()将数字列划分为 4 个桶(箱)-(最小,25 日),(25 日,中值),(中值,75 日),(75 日,最大),并显示箱边缘。您还可以为函数传递自定义百分点:

这些都是宁滨数据的例子。但是如果你注意到了,在上面所有的例子中,我们不能真正地控制箱子。我们只是选择箱子的数量,仅此而已。此外,你不能真的把这些箱子从它们的特定功能中分离出来。
现在,这里有一个问题:如何将每个观察值所属的 bin 存储在一个新列中,或者为以后执行一些操作?这就是qcut()和cut()的用武之地。
首先,让我们探索一下qcut()功能。它作用于任何类似数字数组的对象,如列表、numpy.array或pandas.Series(数据帧列),并将它们分成多个箱(桶)。文档称其正式名称为基于分位数的离散化函数。
让我们从一般语法开始:
如果您第一次看到这个输出,它可能会非常吓人。但是请耐心听我说,你很快就会掌握这个功能。
该函数的第一个参数是要装箱的列。下一个需要的参数是q,它代表分位数。qcut()将数据分成百分位箱,而不是用数字边缘构建每个箱。
让我们分别研究输出的不同部分。当我们将q设置为 4 时,我们告诉pandas创建 4 个区间或区间,并让它自己计算出放置值的位置。
最后一行给出了每个区间的边,分别是(1.349,24.498),(24.498,39.94),(39.94,59.332),(59.332,354)。区间边缘对应于一个百分点值,取决于q的值(在这种情况下,最小值、第 25 个百分点、中值、第 75 个百分点、最大值)。我们可以用describe()函数验证这一点,因为它也将数据分成 4 个分位数:
如您所见,min、max、median、25、75 个百分点的值都是相同的。
现在,主要的部分:如果你看实际的结果,每一行或索引被放入四个容器中的一个。默认情况下,pandas为每个观察值提供文字数字箱名称。为了更好地了解情况,让我们将输出存储到一个新列中:

存储后,我们可以更好地鸟瞰数据帧。您可以验证每个distance值是否放在正确的区间内。我还引入了一个新的参数precision,它让我们指定要保留的小数点位数。
然而,新专栏仍未达到最佳状态。理想的情况是,如果可以为每个区间指定特定的标签。这将提高我们数据的可读性。
为了实现这一点,我们需要创建一个标签列表,并将其传递给qcut()的labels参数:

好多了!但是,我们仍然没有谈到qcut()的定义点。让我们在最新的列上调用value_counts()函数,看看会发生什么:
如果分布中没有太多极值,那么每个箱中的值的数量将会超级接*。如果你熟悉统计学,这是有意义的,因为我已经说过qcut()定义了箱边缘为分布的百分位数。
注意,这并不意味着容器的大小是相同的。如果你从右边减去箱子的左边,你会得到不同的结果。例如,让我们将质量分成 5 个箱,并获得每个箱的宽度:
将retbins(代表返回箱)设置为True会返回一个额外的numpy.ndarray,包含我们切割的箱边缘。我用一个循环来显示每个箱子的宽度来验证我的观点。
为了下一节简单起见,我将删除新列:
熊猫cut()
在讨论了qcut()之后,你现在能够理解cut()之间的差异。
qcut()对我们的数据进行划分,使每个条柱中的值数量大致相同,但条柱范围不同。第一部分中的许多概念在这里也适用。
主要区别在于cut()使用实际的数字箱边缘,默认情况下,它将分布划分为大小相等的箱。与qcut()正好相反。我们先来看一个例子:
我们将mass列分为三个不同的类别。和以前一样,我将把结果存储回数据框,并对其调用value_counts():

此外,让我们看看每个箱的范围:
如您所见,这一次箱的宽度大致相同,我们在每个箱中有不同数量的观测值。
当我们想要为箱子定义自定义范围时,cut的真正威力就发挥出来了。通常,对于真实数据,您不想让pandas自动为您定义边缘。例如,如果您在一家电话公司工作,您可能希望根据服务的总体持续时间对客户进行分类。您可能会优先考虑合作时间较长的客户,并相应地对其他客户进行排序。
让我们来看一个为mass定制宁滨的例子。我们将创建 4 个间隔,并给它们定制标签:

这个例子清楚地显示了cut提供的灵活性。bins参数可以接受 3 种选择:
- 一个整数:我们已经看到例子了。如果传递一个整数,该函数将创建范围相等的存储桶。
- 一系列数字或标量:当传递一系列数字时,该函数将它们视为自定义 bin 边缘。箱的数量将总是比箱边缘的总数少 1。
*pandas.IntervalIndex*对象:也可以使用pandas.interval_range函数传递自定义范围(稍后将详细介绍)。
通常,在一个列表中定义自定义的 bin 范围是很棘手的。所以最好使用numpy.arange或numpy.linspace功能。两者都创建了一个等间距的数字序列,可以作为cut的 bin 范围传递。你可以在这篇有用的文章中了解更多关于这些功能的信息。
在上面代码片段的第一行,我们创建了一个包含 5 个元素的numpy.ndarray。因此,cut将为distance减少一个间隔数。
一般的经验法则是对较少的箱使用简单的列表,但对许多区间使用numpy函数。
使用pandas.interval_range基本可以得到相同的音程。该函数,而不是列表,返回可以进一步定制的IntervalIndex对象:
是的,基本上是一样的,但是有一个额外的参数使这个函数非常有用:
closed参数接受 4 个字符串来控制间隔边缘:
- 左侧:左侧关闭
- 右侧:右侧()关闭(默认)
- 两边:两边关闭****
- :()两边都不闭合****
一个带有cut的例子:
使用interval_range的缺点是在cut中不能使用标签。
关于参数也有一些细微差别,所以一定要查看文档以了解本质细节。另外,这里有一篇类似的文章,比较了来自实用商业 Python 的cut和qcut。
如果你喜欢这篇文章,请分享并留下反馈。作为一名作家,你的支持对我来说意味着一切!
阅读更多与主题相关的文章:
***** [## 认识熊猫最难的功能,第一部分
掌握 pivot_table()、stack()、unstack()的时机和方式
towardsdatascience.com](/meet-the-hardest-functions-of-pandas-part-i-7d1f74597e92) [## 认识熊猫最难的功能,第二部分
掌握交叉表的时间和方式()
towardsdatascience.com](/meet-the-hardest-functions-of-pandas-part-ii-f8029a2b0c9b) [## 认识熊猫最难的功能,第三部分
形状像果冻的桌子有熊猫旋转()和融化()
towardsdatascience.com](/shape-tables-like-jelly-with-pandas-melt-and-pivot-f2e13e666d6) [## 来自 Kagglers:DS 和 ML 的最佳项目设置
来自顶级 Kagglers 的项目成功最佳实践的集合
towardsdatascience.com](/from-kagglers-best-project-setup-for-ds-and-ml-ffb253485f98) [## 想要 Jupyter 的进度条吗?
对你的长时间循环进行健全性检查(和一点视觉风格)
towardsdatascience.com](/ever-wanted-progress-bars-in-jupyter-bdb3988d9cfc)*****
我如何使用 Python 开发数据可视化的 Web 应用程序
原文:https://towardsdatascience.com/how-i-developed-my-web-app-for-data-visualization-with-python-93555ad83c2d?source=collection_archive---------27-----------------------
关于如何开发数据仪表板并将其上传到网上的一些建议

Luke Chesser 在 Unsplash 上的照片
简介
我不是 web 开发人员,但作为一名数据分析师,我认为拥有一个用于数据可视化的 web 应用程序非常有用,您可以在其中部署您的数据并向世界展示您的结果。因此,我决定开发我自己的数据仪表板,我将在其中上传我未来的结果。你可以在这里看到它。为了更好地可视化图表,我建议你用你的电脑而不是智能手机来查看我的网络应用程序。
在这篇文章中,我想给你一些建议来创建你自己的数据可视化 web 应用程序。
关于开发它的技术,唯一的要求是了解标记语言 HTML 和编程语言 Python。
你不需要知道 CSS 或者 JavaScript。事实上,为了开发我的 web 应用程序,我使用 Flask 作为 web 框架,Bootstrap 作为前端框架。
如果你需要一些关于构建你的知识库的建议,你可以以我在 GitHub 上的知识库为例。
在本文中,我将重点介绍部署 Web 应用程序所需的所有步骤。
第 1 部分:在您的操作系统上安装 Anaconda
对于部署,我使用了一个 Linux 终端,我认为它非常适合开发。如果你的操作系统是 windows,你可以点击这个链接查看对应的命令。
当您在终端中时,您必须做的第一件事是更新您的 Anaconda 版本。在这个链接中,你可以找到许多版本的列表。
使用 curl 命令下载 Anaconda 的最新版本。
curl -O [https://repo.anaconda.com/archive/Anaconda3-2020.02-Linux-x86_64.sh](https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh)
按回车键直到结束。然后,对于许可协议,你得说 yes 。
当您到达您可以在下面看到的点时,按照第一个指示并按 Enter,或者您可以按照第三个指示并选择一个不同于默认位置的位置。
出局:
Anaconda3 will now be installed into this location:
/home/your_name/anacond - Press ENTER to confirm the location
- Press CTRL-C to abort the installation
- Or specify a different location below[/home/yor_name/anaconda3]>>>
当这个过程完成时,键入 yes 来确认 Anaconda 将被安装的路径。之后,您可以通过以下方式激活您的安装。
source ~/.bashrc
第二部分:创建您的虚拟环境
在这一部分,你必须创建一个虚拟环境。开始之前,请确保您已进入包含您的 web 应用程序文件的文件夹。所以使用这个命令来创建您的环境。
python3 -m venv my_environment
然后,您可以使用以下命令激活它:
source my_environment/bin/activate
现在你在你的环境里。在我个人的例子中,为了实现我的 web 应用程序,我用以下命令安装了 flask、pandas、Plotly 和 gunicorn:
pip install flask pandas plotly gunicorn
第三部分:上传到 Heroku
现在,你需要在这个环节的云*台 Heroku 上注册。
然后,按照以下方式安装 Heroku 的所有命令行工具:
**curl** https://cli-assets.heroku.com/install-ubuntu.sh | sh
使用这个简单的命令登录并应用:
heroku login
你必须输入你的 Heroku 档案的用户名和密码。
下一步是创建一个文件,目的是告诉 Heroku 当你启动你的 web 应用程序时该做什么。在我的文件中,我写下了以下状态:
web gunigorn app:app
然后,指定将要需要的库。因此,您必须将所有信息放在一个名为 requirements.txt 的文件中,该文件允许 Heroku 知道在哪里查找。命令是:
pip freeze > requirements.txt
现在我们必须初始化存储库:
git init .git add .git commit -m 'first commit'
您可以通过以下方式指定您的电子邮件地址和姓名来进行配置:
git config user.email “username@something.com”git config user.name “Your Name”
最后一步是使用以下命令创建您的 web 应用程序。
heroku create name_of_your_web_app
使用以下命令推送文件:
git push heroku master
每次您想要更新 web 应用程序上的数据时,请记住遵循以下简单指示。
使用以下命令进入您的环境:
source my_environment/bin/activate
然后,使用这些命令更新您的数据仪表板
pip freeze > requirements.txtgit add .git commit -m “make some changes”git push heroku master
结论
这是一种简单的方式,允许你拥有自己的数据仪表板,并向世界上的每个人展示你的结果,我认为这是惊人的。
如果你在创建你的 web 应用程序时遇到了一些问题,请随时私信我或在评论中写给我。
我们也可以在我的电报群 初学数据科学中取得联系。
我如何 DIY 我的预算使用 Python 制作硒和美丽的汤
原文:https://towardsdatascience.com/how-i-diyd-my-budget-using-python-for-selenium-and-beautiful-soup-4d2edc5c519?source=collection_archive---------5-----------------------
使用 Python 提取数据以满足您的个人预算需求

安妮·斯普拉特在 Unsplash 上的照片
我是个性测试的狂热粉丝。我喜欢通读我的预包装类型描述,我发誓这是我独有的,只有我。我喜欢他们给我的感觉,好像两个心理学家用我自己提供的答案偷瞄了一下我的灵魂。但是我知道不是每个人都同意。对于反对者,不管他们是说主流选项太老套,还是因为它在很大程度上是自我报告而对结果打折扣,我提出:预算类型指数。
对于那些现在希望收到你的个人资料的 pdf 文件的人,我希望当我告诉你这是你必须自己制作的东西时,你不会太失望。好吧,好吧,这不是传统意义上的性格测试,但我确实认为一份精心制作的预算可以告诉你很多关于你自己的事情,如果不是更多的话,就像那些诱人的在线测验一样。
当我开始做这个项目时,我想知道我的钱去了哪里,进而了解我优先考虑的是什么。我以前一直手动汇总我的多个银行账户的所有支出,包括非银行但经常使用的服务,如 Venmo。我一直在寻找一种服务,这种服务不仅可以自动完成这个过程,向我展示我的历史数据,而且不需要每月付费。没有完全符合所有这些标准的东西,所以我用 Python 创建了自己的。
对于其他想衡量和管理自己支出的人来说,收集数据是第一步,也是最重要的一步。我根据我使用的两个工具分解了本文的其余部分:
- 硒
- 美味的汤
如果你想建立自己的预算工具,我很乐意帮助你——尽管我们不认识,但请随时联系 jenniferrkim7@gmail.com!
使用 Selenium 从您的在线银行帐户中删除交易
Selenium 自动化浏览器。最初创建它是为了测试 web 应用程序,现在它也广泛用于 web 抓取。在分解我如何使用这个工具之前,我在下面包含了我的全部代码。
进行设置
你首先需要安装两个软件包。
- 硒包装
通过在命令提示符下键入以下命令进行安装:
pip install selenium
- 您正在使用的浏览器的 web 驱动程序
Chrome 驱动程序(这是我正在使用的)可以在这里找到。不同版本的 Chrome 有不同的驱动程序。要了解您使用的版本,请点按浏览器右上角的三个垂直点。这将带您到设置。然后,打开菜单,点击“关于 Chrome”——这将显示你的 Chrome 版本。下载适用的驱动程序,并确保它在您的 Python 路径中。
更全面的安装说明,包括其他浏览器驱动的链接,可以在这里的文档中找到。
尺寸很重要
现在您已经有了必要的包,您可以开始指定驱动程序应该选择的 web 元素。影响这些元素位置的一个因素是窗口的大小。为了获得最大的一致性,我喜欢在启动任何进程之前全屏显示我的窗口。
# from line 8
browser.maximize_window()
定位元件
为了检索交易,我们首先希望 Selenium 登录银行的网站。我们可以通过检查网站的 HTML 页面来确定需要选择哪些元素。要打开页面,请访问网站,并识别登录框。右键单击在线 ID 字段。选择“检查”。

您将弹出此元素定位器,并在您选择的字段(在本例中为在线 ID)上高亮显示。

Chrome 的 HTML 元素定位器
有八种不同的方法来定位硒元素。这些是由:
- 名字
elem = driver.find_element_by_name("INSERT-NAME")
这是我决定使用的一个,正如上面截图中画得不好的红圈所示。
- 身份证明
elem = driver.find_element_by_id("INSERT-ID")
这被认为是最准确的方法,因为每个元素的 ID 都是唯一的。
- 链接文本

elem = driver.find_element_by_link_text("INSERT-NAME-OF-LINK-ON-PAGE")# example if I wanted to select link circled above
elem = driver.find_element_by_link_text("Vote Is Likely to Fall Largely Along Party Lines")
- 部分链接文本
elem = driver.find_element_by_partial_link_text("DONT-NEED-FULL-LINK")# example if I still wanted to select above NYT link
elem = driver.find_element_by_link_text("Vote Is Likely to Fa")
- CSS 选择器
elem = driver.find_element_by_css_selector("INSERT-CSS-SYNTAX")
关于 CSS 选择器的好例子可以在这里找到:https://saucelabs . com/resources/articles/selenium-tips-CSS-selectors
- 标签名称
# referring to an HTML tag. first element with tag is returned.
elem = driver.find_element_by_tag_name("INSERT-TAG-NAME")
- 类别名
elem = driver.find_element_by_class_name("INSERT-CLASS-NAME")
- XPath
elem = driver.find_element_by_xpath("INSERT-XPATH")
XPath 是一种用于在 XML 文档中定位节点的语言。当目标元素没有合适的 id 或 name 属性时,这很有用。基本格式如下:
xpath = //tagname[@attribute = "value"]
你可以在这里阅读更多关于 xpath 的内容。
请注意,所有这些方法只会选择它找到的第一个元素。要选择多个元素,请使用相同的方法,但是将单词“元素”替换为“元素”(例如 driver . find elements by _ NAME(" INSERT-NAME "))
输入键
找到 login 元素后,下一步是输入您的凭证。这是通过函数send_keys()完成的。
username = browser.find_element_by_name("onlineId1").send_keys("YOUR-USERNAME")time.sleep(2)password = browser.find_element_by_name("passcode1")
password.send_keys(<YOUR PASSWORD>)
记住不要在任何地方提交密码,以保护自己。
我添加了一个等待,告诉 Selenium 在使用time.sleep()输入用户名和密码之间暂停两秒钟。我发现没有它,Selenium 移动太快,浏览器很难跟上。
我通常会在输入凭据后按“Enter”按钮,所以我想在 Selenium 中做同样的事情。幸运的是,Selenium 有一个标准键盘键列表和。在这种情况下,我使用了钥匙。返回:
password.send_keys(Keys.RETURN)
现在你进来了!
要查看是否找到了元素并正确输入了凭据,可以尝试运行代码。一个新的 Chrome 实例将会弹出,你可以看到浏览器自动运行。此实例与您经常使用的浏览器不同。它不包含任何 cookies,并在您完成后消失。因此,如果你确实需要 cookies,你可以在这个网站上查看如何添加它们。
当这个 Chrome 实例将我带到我的银行账户主页时,我可以看到我的代码运行正常。我看到两个链接:一个链接到我的支票账户,另一个链接到我的信用卡。要点击这些链接,我使用find_element_by_link_text并使用click()方法进行选择。
browser.find_element_by_link_text('Bank of America Travel Rewards Visa Platinum Plus - ****').click()
一旦您进入包含您想要的交易的页面,从 web 驱动程序中检索page_source并将其存储在一个变量中。这将用于稍后的解析。
boa_travel_html = browser.page_source
现在剩下唯一要做的就是用你的其他银行账户重复。
iFrames
除了一个讨厌的 iFrame 之外,我在巴克莱的另一个账户也是如此。内嵌框架是一个 HTML 文档,嵌入在网站上的另一个 HTML 文档中。当我收到一个没有找到元素的错误时,我第一次怀疑这可能会妨碍我,尽管我通过它的名字清楚地找到了我想要的元素。幸运的是,Selenium 有一种使用switch_to方法导航到 iFrame 的简单方法。
browser.switch_to.frame(browser.find_element_by_tag_name("iframe"))
browser.find_element_by_name("uxLoginForm.username")
使用与美国银行示例中相同的方法继续检索页面源代码。
无头浏览器
一旦你知道你的代码工作了,你可以通过在下次运行你的程序时去掉弹出的浏览器来加速这个过程。
from selenium import webdriver from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument("--headless")driver = webdriver.Chrome(options = chrome_options)
现在,您已经拥有了所有必要的数据。它可能不是一种可读性很强的格式,但是让它变得可用是 Beautiful Soup 的目的。
美味的汤
美汤是一个解析 HTML 文件的 Python 包。现在我们已经有了必要的 HTML 页面,我们可以使用 Beautiful Soup 来解析它以获得我们需要的信息。同样,在深入下面之前,我已经完整地包含了代码。
漂亮的汤函数解析 HTML 银行交易页面
解析交易信息
是时候检查您之前检索的 HTML 页面了。因为混乱的纯文本页面是如此的…混乱,我选择了通过源本身来导航 HTML,通过右击银行网站上的每个交易并选择“Inspect”这突出显示了 web 页面元素检查器中的事务(之前使用 Selenium 来标识登录框)。

Chrome 的网页元素检查器
我想要收集的数据包括日期、交易描述和金额。如上所述,这些信息被嵌套在父“tr”标签内的多个“td”标签中。我使用了[find](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find)和[find_all](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all)函数的组合来沿着树移动,直到到达包含我想要的文本的标签。下面的片段是我如何检索日期的。
# narrowed down to largest parent container
containers = rows.find_all(‘tr’, class_ = [‘trans-first-row odd’, ‘trans-first-row even’, ‘even’, ‘odd’]) dateli = []
descli = []
amtli = []
pending_counter = 0 for container in containers:
date = container.find(‘td’, headers = ‘transaction-date’) . .get_text(strip=True)
由于如何使用 Beautiful Soup 是针对您正在查看的网页而言的(正如我为检索到的每个页面创建的独立函数所证明的那样),因此我不想一行一行地运行我的代码,而是想指出我发现的不规则之处和有趣的花絮,以帮助您尽可能高效地完成整个过程。
类是类 _
所有漂亮的汤find函数都以 HTML 属性作为关键字参数。虽然这对于大多数属性来说非常简单,但是在 Python 中,由于class是一个保留关键字,所以您可以使用class_来表示它的 HTML 对应物。
containers = rows.find_all(‘tr’, **class_** = [‘trans-first-row odd’, ‘trans-first-row even’, ‘even’, ‘odd’])
soup.find()中的 Lambda 函数
find函数也可以将其他函数作为参数。要快速找到符合多个标准的特定标签,请尝试插入一个 lambda 函数。
*# Example 1*
rows = boa_travel_table.find(**lambda** tag: tag.name=='tbody')*# Example 2*
boa_checking_table = boa_checking_soup.find(**lambda** tag: tag.name == 'table' and tag.has_attr('summary') and tag['summary'] == 'Account Activity table, made up of Date, Description, Type, Status, Dollar Amount, and Available balance columns.')
示例 1 非常简单。我也可以不用 lambda 函数来找到相同的元素,使用如下代码:
rows = boa_travel_table.find('tbody', class_ = 'trans-tbody-wrap')
示例 2 是 lambda 函数真正大放异彩的地方。通过结合多种标准并使用 Python 的has_attr ,我搜索我想要的东西的能力成倍增加。lambda 有用性的另一个好例子(以及对 lambda 的解释!)可以在这里找到,作者在这里取 Python isinstance函数进行美汤搜索。
美汤的文字 vs .字符串
在上面我漂亮的 Soup 代码的第 8-19 行中,我将标签(或者我喜欢称之为容器)缩小到最大的一个,它包含了我想要为每笔交易提取的所有三条信息(日期、描述、金额)。为了从这些深入的容器中提取数据,我使用了soup.tag.get_text() 。
date = container.find('td', headers = 'transaction-date').**get_text(**strip=True**)**
如果你通读了漂亮的 Soup 文档,你可能已经看到过用soup.tag.string来代替提取文本。这是我第一次使用的功能,但我很快发现它在这种情况下不起作用。soup.tag.string只返回一个NavigableString类型的对象,该对象必须是标签中的唯一对象。
另一方面,soup.tag.get_text()可以访问它的所有子字符串(即使它不是直接子字符串)并返回一个 Unicode 对象。因此,如果您想要提取的文本数据存在于一个子标签中(您可以在下面的截图中看到td标签中的a标签),您应该使用soup.tag.get_text()。

嵌套标签使得有必要使用soup.tag.get_text()
如果你喜欢稍微干净的代码,你也可以使用soup.tag.text 。它调用get_text(),基本上做同样的事情,但是我更喜欢原来的get_text(),因为它支持关键字参数,比如分隔符、条带和类型。对于这个项目,我包含了strip=True作为关键字参数,从文本中去除任何空白。
结论
现在,您可以通过运行一个程序从数据源中检索所有财务数据。这是你开始创建自己的预算类型指数,并通过你的消费习惯找到更多关于你自己的信息。出发去收集你的数据点,成为你自己最好的金融版本!
我如何设计我的抓取数据
原文:https://towardsdatascience.com/how-i-engineered-my-grab-rides-data-f115b4257aea?source=collection_archive---------53-----------------------
快乐的数据工程师之旅
隐藏数据的 ETL(提取-转换-加载)

在 Unsplash 上由 Carlos Muza 拍摄的照片
世界上谁是谁?
作为一名在马来西亚的外国人,我需要利用现有的交通设施在全国各地旅行。马来西亚的公共交通设施确实非常好,只要你待在它们附*。默认情况下,这将是一个比更远的地区更昂贵的地方。
我的问题是从我工作的地方到经济适用房区的路线离公共交通有点远。所以,我需要坐出租车或者步行 30 分钟。在马来西亚散步挺好的,只要不下雨就行(吉隆坡总是下雨)。
作为一名技术人员,我直接决定使用现有的技术来解决我的问题,在这种情况下,没有什么比拼车服务更有帮助的了。
我的选择标准
我在 2016 年来到马来西亚,当时只有两家拼车服务提供商,和 Grab 。
对我来说,两者都是新的…我考虑的几个因素是:
- 司机离我的位置有多远?(我不想上班迟到)
- 我应该为服务支付多少?(我还没那么有钱)
- 是双赢吗?(这是一项共享服务)
所以,我在选择过程中的标准很简单,都是基于我作为一个新来的外国人在一家不提供弹性工作时间的小 IT 公司工作的情况。没错,我在早高峰时间去办公室,在晚高峰时间离开。(亲爱的 CEO 们,那让你们的员工压力很大!)
为什么我选择抢优步?
有几个原因导致我在马来西亚逗留期间决定选择 Grab 而不是优步。这并不意味着优步不好或什么,但我的生活方式和我作为顾客的角色与 Grab 的关系比优步更密切。
- 与优步相比,那里有更多的临时司机,这使得在高峰时间比优步更容易获得临时搭车服务……与花同样多的时间等待司机来接我相比,我绝对更愿意等待指定的司机来接我。
- 在我开始旅行之前,我就知道我要付多少钱…这正是我喜欢的付款方式。与此同时,优步给你看了估计的总付款额,而这个比率会根据许多因素而变化。交通堵塞,下雨,司机慢,走错路,汽油价格也变了!使用 Grab,它从一开始就给了我应该支付的确切费用,没有什么取决于其他因素,这对于像我这样的中产阶级用户来说是完全可取的……这就像是“这是交易,接受它或离开它”由您决定。
- Grab 是(是)总是比优步便宜,当两个城市都在这个城市的时候…有时我想如果 Grab API 检查了优步 API 上的票价,那么它显示便宜 10%的票价…我 t 只是一种感觉,没有任何证实!为什么我要为同样距离和同样时长的同样服务支付更多费用?
我回答了我的主要选择标准,这也说明了当时我为什么更喜欢 Grab 而不是优步…直到 Grab 在 Malaysia 买了优步的牌照!在那之后,情况完全不同了…根本没有竞争或基准… Grab 控制一切…
数据
现在,在马来西亚生活了四年,*均每天使用 Grab Ride 服务,我有足够的数据来了解我在交通上的支出。
我是怎么得到数据的?
不幸的是,Grab 并没有以直接的方式提供关于您的旅行和费用的报告,它只是给你发了一张最*旅行的收据,但他们没有发送你的使用和支出的每周或每月摘要…所以,如果你想知道你在 Grab Rides 服务上总共花了多少钱,没有直接的方法。
过去有一种方法可以知道你在过去 179 天(过去 6 个月)的旅行细节,从https://hub.grab.com/可以让你检查和下载你最*的旅行…所以,如果你知道那个网站,你可以很好地了解你的费用…在撰写本文时,Grab 不再提供这项服务。我试图在 2020 年使用相同的网站,但已经不可能了。它重定向我创建一个商业帐户(我已经有了),并显示应用程序本身的摘要。
但这不是我获取数据的方式…
我是如何收集数据的
作为一名数据工程师,我工作的一部分就是找到一种聪明的方法来收集分析过程所需的数据。现实生活中的数据分散在各处,不容易被提取出来并以直接的格式使用。再加上我对解决方案架构的热情(我是一名认证的 AWS 解决方案架构师——这是我最初作为爱好学习的。从未在使用 AWS 服务的公司工作过,自学成才)
收集我的抓取行程数据的关键点是我的电子邮件。我将我的电子邮件帐户与我的 Grab 帐户连接起来,因此我收到了我使用 Grab 应用程序完成的大多数活动的电子邮件。
只要我在电子邮件中收到收据,我就可以处理所有电子邮件,以提取从第一次旅行到现在的交通数据。电子邮件通常包含:
- 出发点
- 下车点
- 票价
- 跳闸时间
数据析取
有两种方法,批处理和流。
定量
- 您可以存档和下载从 Grab 收到的所有电子邮件。
- 您将拥有一个 MBOX 文件,您可以使用适当的库来处理它。
- 我在 Apache Beam 的支持下使用 Python 来进行转换。
- 将提取的数据存储到 CSV 文件中
- 使用你的可视化工具可视化你的数据(我使用谷歌数据工作室)
流动
流媒体是一个更加实时的过程,可以让你更深入地了解你正在跟踪的内容。对于数据工程师来说,拥有一个流管道总是比安排修补作业更高级。在我实现了修补技术之后,我决定使用 AWS 服务将它全部转换成一个无服务器的流过程。
这是我的架构

我的架构使用 AWS 服务
我将这封邮件重定向到 AWS SES (简单邮件服务)
邮件将被发送到 S3 下的存储桶中(简单存储服务)
当一个新的电子邮件文件被添加到桶中时,一个λ函数被触发来处理该文件
Lambda (无服务器功能)将解析邮件文件,并提取所有数据。
它提取:
- 收件人的电子邮件地址
- 旅行的日期和时间。
- 提货点
- 目的地
- 旅行费用
然后 Lambda 函数将这些数据存储在 DynamoDB 表中(如果需要,也可以存储在任何 RDP 中)。
然后,可视化工具或报告工具从数据库表中获取这些数据,并在我的仪表板中将其可视化。
可视化
图表总是给出你想知道的大画面。业务分析师总是提供图表来传递聚合信息。一张图胜过百万字。
以下是 2017 年上半年我从工作单位到公寓的行程。

以下是 2018 年上半年从我的工作场所到我的公寓的同一趟旅行的代表。

你可以注意到,与 2017 年相比,接送点服务得到了增强,变得更加准确,这一点很明显,因为我们在寻找司机时变得不那么费劲了。
这是我 2017 年在一整年的消费总额。****

这是我 2018 年在一整年的消费总额。****

还有我 2019 年一整年的消费总额。****

当你回顾和检查你的长期支出时,你可以很容易地做出很多决定:
我应该买辆车吗?
我应该使用公共交通工具吗?
真的是双赢吗?
与去年同季度相比,我现在多付了多少钱?
票价随时间变化了多少?
挑战
源格式更改
在那段时间里, Grab 多次更改了他们的电子邮件格式。这要求我多次更新我的 Lambda 函数代码,并重新部署它来处理新旧格式。所有的数据工程师都有同感;当源模式改变时,您会发现一些不匹配和错误。
出发点
当然,我是从批处理开始的。我下载了电子邮件,并在我的本地机器上进行处理。
然后我创建了一个 Chrome 扩展,直接从邮件中提取数据。然后,扩展向 AWS APIGateway 发送 API 请求,后者将数据重定向到 Lambda 函数。Lambda 随后将数据插入到 DynamoDB 中。
这不是动态的,因为我需要打开邮件并运行扩展来解析邮件并确认将数据发送到端点。
****
我的架构使用 Chrome 扩展作为数据源
错误的选择
我启动了我的流进程,将数据存储到一个 DynamoDB 表中。这个决定是基于在 DynamoDB 上创建一个表并使用 boto 库向其中接收数据是多么简单。但是,在向表中添加数据几个月后,我后悔在这个应用程序中使用它,尤其是在检索数据时。我知道模式,我知道我想要存储什么,并且我对它有完全的控制权,这都意味着一个 rational 数据库应该更好。我觉得极光无服务器应该是更好的选择。
最后一句话
数据提取过程并不容易。我们周围的数据通常不是为了提取而是为了呈现。当数据工程师开始工作时,有些问题需要回答:
- 我需要提取哪些数据?
- 如何提取数据?
- 我需要对这些数据进行什么样的转换?
- 我将在哪里存储数据?
回答这些问题将引出下一层次的问题,这些问题集中在他/她的解决方案的体系结构上:
- 提取的最有效方法是什么?
- 用什么来做转化?
- 如何以最有效的方式存储数据以备将来使用?
总有更多的问题会出现在你的路上,让你的旅途更有乐趣。享受数据之旅。
我是如何进入数据科学领域的(拥有文科学位)——应对面试准备的两大支柱
原文:https://towardsdatascience.com/how-i-entered-the-data-science-field-with-an-arts-degree-2-pillars-to-tackle-interview-ddde055360db?source=collection_archive---------45-----------------------
这本初学者友好的指南概述了我如何为数据科学求职做准备,所以你可以带着详细的行动计划离开。

西蒙·艾布拉姆斯的照片
从 2017 年底到 2018 年初,我为我目前的数据科学角色进行了准备和面试。现在,我得到了训练和部署机器学习模型的报酬(耶!)并用我的统计学/计量经济学和编程技能创造影响。在这篇由两部分组成的文章中,我分享了我的方法,我认为这种方法对我从学校一毕业就进入这个领域贡献最大,并通过对工作的真实观察进行了更新。
现在,无论你是应届毕业生、经验丰富的数据科学家,还是打算转行,我都希望这篇文章能对数据科学求职有所启发。尽管我现在已经坐在桌子的另一边,但作为一名采访者,我仍然从其他数据科学家的经历中学到了很多。我的目标是让这篇文章像与你的在线咖啡聊天;在我找工作的过程中,有很多人与我分享了他们的知识,我想把这些知识传递给他们!
这篇文章以前只对时事通讯的订阅者开放,但是我抓住机会更新了很多额外的内容,最后有两部分!我也鼓励你去看看 Serena 的精彩文章,关于她的数据科学家求职方法,这启发了我写一篇自己的文章。此外,对于那些来自学术界的人(例如博士),请查看 Amir 的综合 LinkedIn 文章。
数据科学技能的两大支柱
我的观点是,数据科学需要统计和编程两方面的专业知识。我确实感觉到最终会有更多的支柱加入进来,比如产品或系统设计,但是因为这篇文章关注的是我进入这个领域的经历,所以我只关注这两个支柱。
为了简单起见,我使用术语“统计学”来指代机器学习理论,特别是对算法如何工作的数学理解,从逻辑回归到自然语言处理(NLP)技术。同样,我会用“编程”这个术语来指代一般的编码、构建数据管道、软件开发(包括版本控制、终端等。如果角色需要)。
事实上,培养统计和编程两方面的专业知识是一个很高的要求——通常情况下,学校教育只能为一个人准备这么多。有统计学背景的人可能没有编程经验,反之亦然。对于入门级别的,我的观点是,在面试时,不需要同时精通统计和编程。然而,你绝对应该而不是在其中任何一个都是“零”。
我这样说的原因是,有很多很多类型的数据科学家。这完全取决于团队、该角色参与的项目、公司的技术水*以及许多其他因素。有些数据科学家在日常工作中只利用了 70%的统计专业知识,但只利用了 30%的编程技能。其他团队成员可以更专注于 MLOps(生产化、CI/CD…),并在日常工作中需要更少的统计数据,但仍应熟悉他们部署的算法。
因此,我更愿意从候选人在这两个支柱方面的技能来看他们的资格,这两个支柱的要求在所有名为“数据科学家”的角色中有很大差异。关键是,对于一个入门级角色来说,不需要 100%同时具备这两个支柱,而是两者的综合。
如果你正在寻找进入该领域,并注意到你在其中一个支柱方面的专业知识较少,例如,对统计只有轻微的了解(例如,1/10,在本科时只上过入门课程),但在编程方面有很多经验(例如,8/10),则专注于将统计支柱提高到 3/10。
我如何用这两个支柱来定制我的面试准备
我的个人教育背景是经济学,主要侧重于使用金融市场、定价、家庭收入等数据进行推理或预测建模。听起来很像工业中的数据科学,不是吗?
计量经济学让我对“统计学”支柱有了坚实的理解,因为高年级的课程需要大量的微积分和矩阵代数,当我开始自学更多的机器学习算法时,这些都是非常宝贵的。但是,有一个问题——我只通过一个名为 Stata 的专有软件学习了统计编程,而不是行业中常见的语言,如 Python 或 r。
对于那些不熟悉 Stata 的人来说,它仍然非常适合进行快速线性建模或时间序列,并且通常用于经济学家职业,例如,向决策者提供建议的政府或相关机构(新闻中引用的那些人!).然而,当我申请(非政府、非研究)行业职位时,我很快注意到 Python 和 R 是更常见的要求,Python 在我的求职过程中被提到得最多。
就正规教育而言,我会把我的 Python 技能放在 1/10,因为我只选修了一门计算机科学课程。注意:这里的 10 分并不是整个行业的 10 分,而是我的印象,不管现实与否,对一个非常有竞争力的入门级候选人的期望。
事实证明我是幸运的——我从三年级就开始编写代码来构建视频游戏原型,这应该可以将编程支柱提升到比如说 4/10。但是我大吃一惊——在工作描述中,Python 包如NumPy和pandas被反复提及。然而,我从来没有听说过他们!在游戏开发中,我根本不需要使用那些包。我有一些重要的事情要做。所以我在心里把我的“编程”定为 1/10,因为我对“用于数据科学的 Python”缺乏经验,而不是对“一般的 Python”。
我详细提到了我的经历,因为如果我没有对这两个支柱的技能进行自我评估,我就不会发现我在数据科学方面的优势。我可能害怕申请任何数据科学职位,因为我的学位不是“纯”统计学或计算机科学。我也不会找出需要改进的地方,所以两个支柱的得分最低都是 4/10。为了实现这个目标,我花了很多时间在小项目中学习NumPy和pandas,比如复制我在 Stata 中做的作业。在我的数据科学专题文章中,我详细介绍了如何构建投资组合;如需更多信息,我推荐 Serena 文章的“工作证明”部分。
警惕工作描述诱发的冒名顶替综合症
我和一些人喝咖啡聊天,他们提到工作描述要求,比如说,计算机科学博士学位,即使这显然是一个入门级的职位。在这种情况下,忽略要求去申请,即使你没有所述学科的博士学位。有可能,其他申请人也是应届毕业生或数据科学新手。
冒名顶替综合症是我很想警告年轻时的自己的一件事。不要因为你认为所有的申请人都比你“更有资格”而回避申请。事实是,你根本不知道其他申请人是谁!所以,这种想法是不正确的,是骗子综合症在说话。
根据个人优势准备数据科学面试
简单回顾一下:在对我在统计和编程这两个支柱上的技能进行自我评估之后,我立即列出了一系列行动项目,旨在将我在这两个支柱上的技能提高到令人满意的最低水*。当时我的 Python 数据科学编程很弱,所以我花了很多时间学习NumPy和pandas,用那些包复制过去的项目(用 Stata 写的),还有statsmodels。
此外,这很大程度上是运气——我刚刚开始对我的游戏开发过程实施版本控制,因为没有它,我的项目在扩大规模时会变得一团糟(在本文中,我会更详细地阐述游戏开发体验)。所以,我从终端(也就是命令行)得到了很多使用git的练习。这些现有的知识对工作有很大的帮助,在我的面试中会被问到,但是如果我没有这方面的经验,我肯定会付出额外的努力来复习。
我也花了很多时间去了解最常见的机器学习算法——逻辑回归、一些聚类技术等。,以及它们的数学推导。我的计量经济学背景为我节省了很多时间,因为在几个学期的课程学习后,迭代最小化损失的核心直觉已经非常清楚了。然而,就像大多数课程一样,当我申请工作时,大多数细节已经从记忆中消失了,所以我不得不回顾这些概念,直到我感到可以向面试官大声解释为止。
建立关系网以了解工作描述中缺失的信息
作为求职的一部分,人际关系网被认为是必不可少的一步。在大学里,我听说了很多关于人际关系网有多重要的事情,但在那时,我从未理解这个术语的真正含义。这给人一种错误的印象,就是带着免费饮料和披萨去参加活动和聚会,随意闲逛,直到遇到愿意雇用你的人。我的意思是,“网络”这个术语非常令人困惑。
然而,现在我进入了这个行业,我回过头来,和我之前的人一样,说人脉很重要。在我看来,原因如下。在读研期间,我参加会议和当地聚会。当时我正在两家大公司的面试过程中,我在不同的场合遇到了两个招聘团队的人——甚至是我未来的几个面试官!
因此,参加活动当然有所帮助,同时也是一种运气——当我在聚会上与那些人交谈时,我不知道他们会直接采访我,我怀疑他们也不知道。此外,在活动中与许多人聊天会让你更好地了解这个行业中的典型角色是什么样的——通常情况下,单单一份工作描述远远不能涵盖日常工作。
这也是一个很好的时间来了解团队使用了多少支柱:他们在日常工作中更依赖于他们的统计知识,还是他们更专注于编程?在接受了这个角色后才知道这一点是不和谐的;毕竟,如果一份工作符合你的长期职业目标,你可以做出更明智的决定。
另一个因素是,与你相处融洽的人通常乐于提供帮助——我在大学期间认识的许多朋友,大多是通过我的志愿者工作认识的,他们一直支持我的职业生涯,尽管在我们相遇的时候,求职还远远没有在我们的脑海中出现。
除了这些偶然的相遇和现有的友谊,我还联系了我的研究生项目的校友。他们给我的求职建议往往是无价的,因为他们的背景相似;很多网上的文章都有很好的见解,但由于教育背景不同,无法回答我的具体问题。我试图对求职有一个整体的看法——有些校友,我特别询问了他们工作场所的问题,而有些人,我问了他们是如何培养技能的,不管是哪家公司。
以上是我的网络经验,可能还不太清楚,所以这里有一些要点可以帮助你迈出第一步:
- 当你和某人喝咖啡聊天或打电话时,不要指望他们会告诉你一个神奇的、放之四海而皆准的解决方案“清单”。如果有人问我到底是如何“找到工作”的,我可能无法给出一个完美的答案,而是我的回溯性猜测(“后知之明是 20/20”)。听听他们的职业历程——通常比预期的更加非线性!
- 参加本地或在线聚会。实际了解人们和他们的团队,这比阅读职位描述更有价值。我有机会认识了很多最终和我一起工作的人,接受一份工作对我来说是一个强烈的吸引力,因为我已经和他们相处得很好了(或者我喜欢这么认为)!然而,我只是在面试进行到一半的时候才遇到他们,所以这里面有一些运气成分。
要开始的行动项目
- 评估你在数据科学、统计和编程这两大支柱上的技能,并制定一个行动计划来总结你的优势和劣势
- 接触人们,无论是面对面还是在线,听取他们的职业经历,并寻求全面的覆盖(例如,接触一些人以了解他们的公司或角色,接触一些人以了解教育经历等。)
在本文的下一部分(即将更新),我将介绍在数据科学面试过程的每一轮中会遇到什么,以及我当时是如何准备的。希望这是有帮助的!
原载于 2020 年 3 月 18 日 https://www.susanshu.com。
量身定制的数据科学面试方法,循序渐进——我是如何进入数据科学领域的(拥有文科学位)
原文:https://towardsdatascience.com/how-i-entered-the-data-science-field-with-an-arts-degree-tailored-approach-to-data-science-f54f3bb8e15a?source=collection_archive---------38-----------------------
关于招聘人员电话、招聘经理技术面试的完整指南,以及如何花一点时间为每家公司量身定制你的答案。

西蒙·艾布拉姆斯的照片
之前,我讲述了数据科学角色的两大支柱:统计和编程知识,以及如何根据您在这两大支柱方面的专业知识准备进入该领域。(链接媒体走向数据科学)。
在这篇文章中,如果你已经收到了你将被面试的好消息,我将会告诉你会发生什么!这包括一些节省时间的技巧,涵盖了各种各样的行为问题,如何让 10 分钟的研究获得数倍的回报,等等。
第一道“关卡”:人力资源或招聘人员的电话筛选
了解人力资源和招聘经理之间的区别
对于大中型公司,人力资源或非技术招聘人员(又名人才获取)通常会对简历进行初步筛选,然后打电话给看起来合格的候选人。谈话结束后,如果他们觉得候选人是潜在的合适人选,他们可能会把它交给招聘经理。
回到 2017 年,我对 HR 和招聘经理的区别感到困惑。现在,我知道招聘经理通常是你真正要一起工作并向其汇报的人,而人力资源部通常进行初步筛选和其他类型的管理,如协调面试。再一次,这是假设一个中型到大型的公司有固定的部门——我将而不是在这篇文章中浏览创业公司的具体信息,尽管大多数提示仍然适用。
展示你的沟通技巧以通过第一道“门”
下面是第一个人力资源或招聘人员电话屏幕的大致情况:
- 他们让你介绍自己
- 他们会问你在某些技术方面的经验(他们通常会将你的答案与职位描述或招聘经理提供的清单进行比较)。例子:“你知道怎么用 Tensorflow 吗?”
- 他们会调查你简历上的项目。例如:“告诉我更多关于你的 Reddit 抓取项目。”
- 他们会问你一些行为面试问题。例子:“告诉我一个你展示领导力的例子。”
- 他们通常会问你为什么对他们公司或这个角色感兴趣。
因为人力资源不会每天和你一起工作,所以跨过第一道“门”所需要的不一定是技术技能,而是沟通技能。
我希望我是在开玩笑,当我说人们这一轮失败实际上是因为可避免的原因,如紧张,或无法用不太专业的术语清楚地表达他们的答案。这是因为你的招聘人员可能来自多种教育背景,所以你需要能够在不同层次的技术细节上进行沟通。如果你能以一种人力资源或招聘人员理解的方式表达,为什么你的技能会有价值,他们会很乐意为你争取,并把你推荐给招聘经理。
清除手机屏幕的定制方法的完整指南
简介:“说说你自己吧”
- 我为这个问题准备了一份“电梯推销”,我在无数次面试中重复使用了这份“电梯推销”。它包括对我的教育背景、经历的简要概述,以及一两句为什么我的经历能帮助我对公司和角色做出贡献的话。
在[技术]、[机器学习技术]或[编程语言]方面有经验
- 在这里,我通常会准备好职位描述。如果描述中列出了我有经验的事情(例如,寻找一个精通 SQL 的候选人),我会准备一个我以前在 SQL 中做过的事情的大纲。
- 我还花了一些时间(10 分钟足够了)来头脑风暴,根据他们的行业,团队可能正在进行什么类型的项目。例如,对于电信,我四处询问,发现他们非常关注客户流失模型(预测哪些客户可能会离开)。就我个人而言,我没有做客户流失建模的经验,但可以事先查找一些例子或常用技术,这样我就可以将这类问题与我的经验联系起来。
关于你简历上所列经历的探讨
- 我精心准备,以便能够描述我在简历中列出的任何项目——这也将为技术面试带来回报。对于人力资源这一轮,我侧重于能够用非技术人员也能理解的高级语言描述影响或结果。然而,如果你能在职位描述中提到任何人力资源正在倾听的行话,那就太好了。如果你指出来就更好了(例如,“我在这个项目中使用了梯度推进技术,这在工作描述中有提到。”)
行为面试问题
- 对于这些,我在网上抓了一个问题清单,确保自己可以口头回答。这里有一些例子。每个公司和面试官都可能会问出截然不同的问题,这让你觉得准备工作让人应接不暇,但不要担心——我的省时建议是准备一些可以用来回答各种问题的故事。
- 例如,我给准备了一个可以用来回答所有这 4 个问题的故事,而不是 4 个关于我如何展示沟通技巧、领导技巧、主动性或主人翁精神的独立故事。你可以随时修改要强调的内容:例如,如果问题是关于沟通技巧的,你可以删除一些关于领导力的细节,同时使用相同的故事。使用这种方法,你可以准备好他们可能抛给你的 99%的问题,只有少数几个故事!
- 使用星形方法,这样你的回答才能传达关键信息。在我知道用这种方式来组织我的答案之前,我大部分时间都忘了提及我项目的结果,这其实是面试官最好奇的!
你为什么对这家公司或这个职位感兴趣?
- 坦白地说,这对人力资源来说非常重要。如果你能表现出热情并理解公司的工作,这将对这一轮很有帮助。很难对一个似乎对公司产品或服务一无所知的候选人感兴趣。我通常会浏览公司的网站或社交媒体,了解公司的概况,如果可能的话,还会了解公司的整体“使命”。他们是 B2B 还是 B2C?如果他们是某种网络*台,他们是更关注创造内容的人,还是消费内容的人,或者两者兼而有之?
- 这项研究在的基础上多次获得回报,因为你将能够围绕如何帮助公司完成使命来构思你的所有答案和故事(例如,“我在【经济建模】方面的教育背景可以帮助我创建稳健而准确的【客户流失模型】,这样我们就可以主动【拯救客户】。”)
这是很多信息,也有很多要准备的,但好消息是,这一轮的准备将在未来的面试中得到回报。不过,如果你觉得没有时间为所有这些问题做详细准备,下面是我发现的一些节省时间的方法,可以大大增加通过这一轮考试的几率:
- 花 10 分钟快速查找公司及其核心使命(或者猜猜可能是什么)。这可以让你成为一个有吸引力的候选人,并多次获得回报
- 准备一个简短的电梯间推介,概述你的经历,以及你为什么对这家公司、团队或职位感兴趣
- 准备 3 个你过去经历的故事来回答各种各样的行为问题
- 例如,一个故事回答关于沟通/协作/领导力的任何问题,另一个故事涵盖时间管理/适应性等,每个故事能够涵盖一些特质
如果可能的话,找一个朋友一起练习——我很幸运,我的朋友们抽出时间来听我的电梯推销——你宁愿先在朋友面前结巴,也不愿在面试官面前结巴!
与招聘经理和未来的同事进行技术/编码交流
在一家中大型公司,如果你在最初的电话面试中赢得了人事经理的赞赏,你很可能会被邀请与招聘经理面谈。我为这几轮面试准备的策略涉及了更多的技术细节,比如回顾我在简历中提到的任何统计模型。因为这些项目中有许多是在我面试的几个月或几年前完成的,所以我需要花时间温习细节是很自然的。
好消息是,前一轮的大量准备也可以帮助你完成这一轮。有些问题,尤其是行为问题,甚至可能是相似或相同的,但后面几轮是在你的答案中加入更多技术细节的好时机。
量身定制的招聘经理面试方法
根据我的经验,我发现技术面试比电话面试有更多的变化。这是因为每家公司,甚至团队本身,都可能专注于不同类型的数据科学。因此,这也是你对公司和团队所做的研究派上用场的地方。
如果角色是入门级的,或者描述不够具体,最好回顾一下一些常见的算法,如随机森林、逻辑回归、K 均值聚类等。(在我目前职位的面试中,我确实被要求口头解释所有这些算法)。
总的来说,我优先考虑基本机器学习算法的理论和技术细节,以及我在简历中特别提到的项目中使用的那些。如果你在简历中提到在一个项目中使用 CNN,准备好解释你的方法及其利弊。当然,如果你的工作描述字面上说他们在寻找 NLP 能力强的人,你最好也准备好特定主题的技术。
然而,如果还没有人告诉你这个角色专注于哪些领域,从公司的使命或招聘团队的信息来看,你可以对需要审查哪种算法进行有根据的猜测。如果是这种情况,我建议询问人力资源或招聘经理,更多细节见下一节。
技术回合变化很大——尽可能多地收集信息
现在,关于编码面试,我听到了各种各样的经历。有一些是 90%编码,10%询问过往经验或算法;有一些面试恰恰相反。
例如,我自己面试候选人的经验是,我们更多地寻找解决问题的技能和对 Python 的熟练程度,我们不会问 LeetCode 风格的编码问题,这似乎越来越受欢迎。因此,我不会评论太多关于编码部分准备的细节,因为它可能会因角色而异,我不想误导任何人。
根据您对团队日常使用数据科学的两大支柱(统计和编程)的了解,可以做出有根据的猜测,如果团队的工作更依赖于统计知识,他们可能会对前者要求更多,反之亦然。我将在本系列的第一部分详细阐述这两个支柱。
我建议你从招聘经理那里获取尽可能多的信息;如果你不知道谁会在这个阶段,问你的人力资源或招聘联系人。如果 HR 不知道,你可以让他们代你去问招聘经理。我发现人力资源部门的人对此非常友好,并尽力帮助你——毕竟,他们的部分职责是给应聘者提供足够的信息。
- 回顾一下你在简历中提到的项目的技术细节——所有的问题都是公*竞争的,如果你不能回答你列出的一些细节,那就不太好了。
- 根据角色或工作描述,查看您认为可能适用于该角色的算法系列。
- 联系招聘经理或人力资源部,尽可能多地了解技术面试的细节(当然,要在合理的范围内)。
- 如果有编码回合,在 LeetCode 上练习或者回顾流行算法的实现。
最后一个提醒,我之前已经提到过,但值得重复:我真的建议你根据公司的使命和你对团队的了解来设计你的答案。可以这样想:如果我的团队为客户个性化进行机器学习,但候选人的经验似乎无法为我们团队的任务或我们日常使用的技术做出贡献,这就使得雇用候选人变得更加困难。
这就是为什么根据你对面试官的了解来描述你的经历是值得的,因为他们根本不知道关于候选人的完美信息。事实上,在两个拥有完全相同技能的候选人之间,谁能更好地证明自己能为团队做出贡献,谁就更有吸引力。
总结和即时面试准备步骤
网上有大量关于数据科学面试流程的资源,可能会让人应接不暇。当我开始找工作时,我也处于那种情况,我肯定能理解——这就是为什么我分享了上面的细节和技巧。我希望我学到的一切可以帮助你!
如果你在申请和面试之前有一些时间,正如本博客系列第一部分中提到的——关键是将你的机器学习理论和编程都带到基线水*。例如,如果你对其中一项一无所知,那就把它提高到 2 或 3。
如果您预约了面试,立即采取的行动是:
- 准备你的电梯间自我介绍
- 研究公司和角色
- 准备几个故事,每个故事都能够回答多个行为问题
- 回顾简历中的技术细节,关注团队或角色需要的技能
- 回顾过去项目的代码实现或 LeetCode
这就是这个博客系列。不管你是否在找工作,我希望它是有帮助的或者有趣的。如果你此时正经历面试,我祝你一切顺利!
原载于 2020 年 3 月 29 日【https://www.susanshu.com】。
我如何向我的非技术同事解释单词嵌入
原文:https://towardsdatascience.com/how-i-explained-word-embeddings-to-my-non-technical-colleagues-52ced76cf3bb?source=collection_archive---------40-----------------------
数据科学
没有代码。没有行话。只是你需要知道的高级事实

在 Unsplash 上由 Franck V. 拍摄的照片
单词嵌入。
它们是什么?他们长什么样?它们是如何制造的?…
我将不用代码或行话来分解它。
这是基于我向非技术同事解释机器学习术语的经验。
理解:机器学习模型只理解数字
您不能向 ML 模型输入文本。
因为,简单来说,数学对文本不起作用。

不工作
你必须先把单词/句子/等等转换成一系列数字。

但是这个有用
单词嵌入是一种将文本转换成机器可读格式的方法。
有几种方法,包括单词袋,但我们不会在这里深入探讨。
单词嵌入将单词转换成数字序列
下面是几个词,“亮”“闪亮”“狗”,用流行的嵌词库 Word2Vec 翻译成数字。

注意“明亮的”和“闪亮的”比“狗”更相似。
当使用像 Word2Vec 这样的预训练嵌入时,每个单词的数字表示都包括在内。
你只需将你的单词转换成每个给定的数字序列,然后将它们插入到你的模型中。
单词嵌入中的值是什么意思?
孤立来说,什么都没有!
但是相对于彼此,它们包含了大量的信息。
在前面的 Word2Vec 示例中,我们可以看到,在每个索引处,“bright”和“shiny”彼此更相似,而不是“dog”。

我们称每个索引为一个“维度”
如果我们把 D1 和 D2 标绘在一个 2x2 的网格上,我们会看到“明亮的”和“闪亮的”离得很*,“狗”离得更远。
在单词嵌入方法中,具有相似含义的单词“应该”具有相似的数值。
为什么相似的词有相似的数值?
好问题。
因为一个词就是它的上下文。
用于构建单词嵌入的训练文本中的“上下文”=“单词周围使用的单词”。
因此,当推导“美丽”和“华丽”的数值时,我们可能会在它们周围找到相似的词,它们会得到相似的数值。

在给定上下文的情况下,单词的数值是正确猜测单词时神经网络中权重的函数(CBOW 方法)。
神经网络不断调整其权重,直到它可以获取单词的上下文,并猜测单词本身。

此时,当前重量(想想机器上的旋钮和刻度盘)变成了数值。
相似的上下文经常出现在意思相似的词周围。
所以相似的神经网络权重会预测相似的词。
结论
免责声明:我已经做了一些概括,并跳过了一些小步骤,以帮助使这个更容易解释
就是这样。
单词嵌入是将文本转换成数字以便计算机处理的一种方法(几种方法之一)。
与其他方法相比,实践经验(成功和失败)是你何时应该真正使用它们的最佳指南。虽然很受欢迎,但它们的表现往往不如更传统的方法(根据我的轶事经验)。
这就是为什么我总是建议深入了解一些代码。
记住,在机器学习中,没有免费的午餐。我们真的不知道什么有效,直到我们尝试它!
我是如何爱上 GitHub 的
原文:https://towardsdatascience.com/how-i-fell-in-love-with-github-1f892a1be67?source=collection_archive---------32-----------------------

马库斯·温克勒在 Unsplash 上的照片
作为一名开发人员,我倾向于对现有的解决方案和开源项目进行大量研究,以进一步构思我当前的项目,并在我每天充满代码的生活中使用一些开源项目。
作为我在 2016 年开始本科学位时开始的旅程的一部分,我开始通过我的大学作业和我的团队积极使用 GitHub 来合作完成各种作业,GitHub 为我提供了一套惊人的工具来积极合作和管理我的所有项目(有时我同时有 3 个项目/作业,人们在不同的时间处理它们)。
GitHub 有各种各样的工具,这些工具实际上让我发现了更多关于软件开发的知识,如果你对某个特定的问题有任何疑问,这个社区非常有用,他们会指导你,从我的角度来看,你可以从那里的开源项目中学到很多东西。
现在让我们来谈谈我最喜欢的 GitHub 的一些特性:
GitHub 动作
当我用 GitHub Actions 说话或做一些事情时,我脑海中出现的第一个词是“哇”,现在我们都已经使用了 Travis CI 和所有这些很酷的工具,但 GitHub Actions 从您的存储库中管理工作流,相信我,您越深入了解,您就越会意识到它是多么挽救生命和有用的工具。您可以查看 GitHub Marketplace 中已经提供的各种工作流,以使您的生活更加轻松,但您也可以编写自己的工作流来完成各种任务,我自己的个人资料自述文件贯穿 GitHub 操作,这是最无缝的过程。
我发现了这个非常酷的博客,它帮助你使用 GitHub Actions 和 Neptune 为机器学习模型设置 CI,并真正解释了在机器学习和数据科学方面,自动化操作是多么令人惊讶。所以请在这里查看(https://Neptune . ai/blog/continuous-integration-for-machine-learning-with-github-actions-and-Neptune)
GitHub 项目
作为我日常工作生活的一部分,我有许多问题和任务要跟踪,我的大脑有时相当于一颗花生,我大量使用 GitHub 项目和看板来管理我的所有工作。当我有了一个想法或者一个任务的时候,我会把它加进去,然后一直放在我旁边,整个星期我都会继续更新它,完成我的任务。我不想夸大其词,但我发现自己使用 GitHub 项目更有效率,它确实帮助我按时完成了任务。
GitHub 页面
担心托管自己的项目网站,那么你没有理由担心,因为 GitHub Pages 来拯救(对不起,这听起来像你最*在互联网上看到的广告)。但实际上,GitHub Pages 允许你托管一个面向你的 GitHub 的项目网站。如果你真的希望为你的目标人群更详细地解释你的项目,你可以根据你的需要为你的项目提供一些技巧和更多的解释。
与 CI/CD 管道整合
在一个基于 DevOps 的世界中工作,我倾向于使用 CI/CD 和我使用过的几乎所有工具,可能是 Tekton、Jenkins 或 IBM toolchain,GitHub 是该项目的主要部分。在 Kubernetes 或 OpenShift 上部署什么东西?您实际上可以将您的项目存储在 GitHub 上,当您提交变更时,您的 CI/CD 工具实际上可以从您的 GitHub 存储库中提取变更,并将它们应用到您的部署中(但是请不要直接提交到 master,使用分支进行变更跟踪😂).
开源软件和社区
另一个“令人惊叹”的因素是,GitHub 上有如此多令人惊叹的开发人员和如此多的开源代码,以至于 GitHub 实际上决定推出 Arctic Vault 程序来存储我们的代码。我倾向于寻找让我的工作生活和开发生活更有效率的工具,GitHub 上的一些开源软件实际上是我工作周期的一部分,是的,我会说我完全是为了生产力和让事情更有效率。
代码空间
哇,这是一个很长的列表,但最后但并非最不重要的是我最喜欢的功能是代码空间。想要一个在线编辑来快速做出改变吗?那么 Codespaces 就是您的答案,它直接将存储库加载到托管的 Visual Studio 代码环境中,允许您随时进行更改并快速编辑您的代码。有时,我会初始化一个代码空间并选择我想要工作的库,而不是克隆,瞧,我有了一个全功能的编辑器,允许我对我的代码进行更改。
这些工具真正的好处是,它们使您的开发生活变得更容易,更有效率,集成是惊人的和安全的。实际上,我建议成长中的开发者积极使用 GitHub,它会教会他们很多东西,是最有用的开发资源之一。我在这里提到的只是一些让我爱上它的工具,但是 GitHub 上还有更多工具可以真正开启一个惊人的开发和项目生命周期。我就是这样爱上 GitHub 的。
您可以通过各种媒介与我联系,我将非常乐意为您提供关于开源的建议,并回答您有关开发的问题
你可以打找到我
推特:【https://twitter.com/fawaz_siddiqi
领英:https://www.linkedin.com/in/fawazsiddiqi/
GitHub:https://github.com/fawazsiddiqi
我如何微调人工智能来创造有创意的域名
原文:https://towardsdatascience.com/how-i-fine-tuned-gpt-2-to-generate-creative-domain-names-a56d59d55aca?source=collection_archive---------28-----------------------

在 Unsplash 上科学高清拍摄的照片
我心中有一个目标,要创造一个对人有帮助,同时又超级简单的人工智能服务。在摆弄了 GPT-2 之后,我意识到它有巨大的创造潜力,可以证明在创造性的文本生成中是有用的。
因此我创建了 NameKrea,这是一个人工智能域名生成器。域名生成器业务已经上线很长时间了,但是还没有看到这么多高质量的内容。(如果你想了解更多关于项目构思阶段和生产力技巧,这里是文章的第一部分)
让我向你介绍一下我是如何构建一个生成域名和商业创意的人工智能服务的!
介绍
在从 Majestic Millions top 100 万域名列表中抓取了大约 10 万个网站后,我微调了 355M 参数模型。结果非常准确,同时也很有创意。看看结果:

Namekrea AI 生成的域名和元文本
如果有足够的训练数据,GPT-2 能够理解上下文。为了能够训练它,我们需要大量的数据。这可以很容易地通过抓取网站的元描述来完成。幸运的是,互联网上并不缺少网站:)
通过使用 CSV 文件读取每一行,可以对 GPT-2 进行微调。在开始抓取之前,我们需要定义算法可以理解的数据结构。为此,我采用了一种相当简单的方法,即给 GPT-2 提供每个域一行的文本和元描述。我们的训练数据中的单个条目将如下所示:
Create an account or log into Facebook. Connect with friends, family and other people you know. Share photos and videos, send messages and get updates. **= @ =** facebook.com
如您所见,我们首先输入给定上下文的元上下文,然后使用一个普通文本中不存在的分隔符。您可以选择自然文本中通常不存在任何内容。我选择了这个分隔符:-> = @ =
第一步:刮擦
正如您可能会想到的,手动复制和粘贴域的元上下文将会花费大量的时间。我们需要想出一个刮算法,能够为我们生成干净的训练数据。
数据的整洁很重要,因为大多数机器学习模型都依赖于质量。你的机器学习模型可以和你的训练数据一样好。因此:
当训练一个机器学习模型的时候,永远记住:垃圾进,垃圾出!

垃圾进,垃圾出!
那么,我所说的干净数据是什么意思呢?首先,GPT-2 主要是在互联网上搜集的英语数据上进行训练的。因此,我们需要确保我们收集的是英语的元上下文数据。其次,有很多网站都有使用表情符号和不同字符的元描述。我们不希望这些出现在我们最终收集的数据中。
如果我们设计一个抓取算法,它应该能够按照以下逻辑过滤和提取数据:
- 仅英文
- 没有表情符号和表情符号之类的。只是光秃秃的英文文本。
- 只收集一系列 TLD 的数据(如。com,。网,。(同 organic)有机..)
- 要快!我们需要同时从多个域获取数据的多重处理,否则将需要很长时间来收集数据。
既然我们决定了我们的主要需求,让我们继续构建我们的铲运机!
Python 有很多很棒的抓取包,比如 BeautifulSoup 。它有许多功能,使它有可能在瞬间开始抓取网站。我们将使用这个库来获取域,然后将它们写入 csv 文件。
在 github repo 的 namekrea 处完成刮刀
出于某种原因,Github Gist 嵌入不能正常工作。在域名生成器 namekrea 的 github repo 看一下源代码中的 scraper.py
首先 scraper.py 从 majestic 的前 100 万域名列表中读取域名,然后开始抓取数据的过程。
注意:在运行 scraper.py 之后,你将从 5 个不同的线程中获得 5 个不同的文件。因此,您需要将这些文件合并成 1 个文件,并将其转换为 csv 文件,否则无法进行微调。
。scraper.py 的 txt 输出如下所示:
Create an account or log into Facebook. Connect with friends, family and other people you know. Share photos and videos, send messages and get updates. = @ = facebook.com Search the world's information, including webpages, images, videos and more. Google has many special features to help you find exactly what you're looking for. = @ = google.com Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube. = @ = youtube.com
当您完成数据收集后,我们将继续下一步。
第二步:微调它!
GPT 二号是巨大的!中等规模的预训练模型有 3.55 亿个参数!这种架构的微调,用你普通的笔记本电脑 CPU 肯定是做不到的。在我的设置中,我使用了 2x1070Ti GPU,大约花了 2 个小时才达到高质量的输出。
让我们看看项目的总体架构,以了解如何训练该模型:

为生成域名微调新 GPT 协议工作流程的基本架构
因此,首先,我们将数据和文本文件组合成一个 csv 文件,使其可以被 model_trainer.py 脚本使用。
训练完成后,我们将把检查点加载到 text_generator.py,随机生成域名。
第三步 AI 生成域名:
随机生成的域名很酷,但是如果我们不能给 GPT-2 系统提示的话,它就没什么用了。幸运的是,这可以通过前缀变量实现:
gpt2.generate(sess, model_name=model_name,
#run_name=run_name, checkpoint_dir=checkpoint_dir,
temperature=0.8, include_prefix=True, **prefix='The best e-cigarette',**
truncate='<|endoftext|>', nsamples=10, batch_size=2, length=128
)
当我看到结果时,我忍不住笑了:
尼古丁含量超过 99%的最好的电子烟。电子烟不仅仅是一种 vape。是一款通讯 APP。把它当作便携式汽化器。或者放在口袋里,用智能手机控制你的 vape。Vaporsca 是最好的电子烟对比网站。
一个 vape 也是一个通讯 APP??我可以肯定地说,这个东西是非常有创意的:D
我希望你喜欢这个教程。GPT-2 当然是一个惊人的神经网络架构,我不能给简单的 GPT-2 包足够的信任。如果没有这个包,这个项目可能需要更多的时间。如果你错过了该项目的 github 链接,这里是:https://github.com/cderinbogaz/namekrea
我还建立了一个网站,你已经可以使用 NameKrea 的创作能力!请查看 Namekrea 人工智能域名生成器
感谢您的阅读,请在评论中告诉我您的想法!
作为一个旁注,我写了另一篇关于我如何在全职工作的时候获得 NameKrea 的文章。如果你需要一些生产力和如何找到适合市场的产品,那么这篇文章就是给你的:
https://becoming human . ai/how-I-launch-an-ai-service-in-60-days-while-work-full-time-part-1-d 42 be 50 c 42 c 2
我如何在 6 天内完成 6 周的编程课程
原文:https://towardsdatascience.com/how-i-finished-6-weeks-of-programming-courses-in-6-days-cd0a3998554b?source=collection_archive---------53-----------------------
有效学习编程的技巧

真诚媒体在 Unsplash 上拍摄的照片
介绍
在我开始之前,让我首先为自己辩护说我并不是鼓励你们所有人在尽可能短的时间内完成课程。速度不是最重要的,学习才是。
数据科学是多学科的。数据科学不仅仅是启动 Jupyter 笔记本电脑。你学习数学、统计学、经济学、市场营销、商业、数据结构、算法等等,甚至顾客心理学。除了 Jupyter Notebook,你还必须熟悉版本控制系统、数据库、DevOps 和不同的编程语言。这个列表永远不会结束。

你永远不能停止学习数据科学。来源:数据经济
在新冠肺炎封锁的情况下,我每天节省了 3 个小时往返工作地点的交通时间。我想,既然有那么多时间,为什么不充分利用呢?
在线课程。不,不是网飞。在线课程。
你会惊讶于你能从大学/工作场所的在线课程中获得如此多的知识。有了大量的在线课程和如此少的时间,我们如何掌握这个领域?!在这篇文章中,我将提供 5 个技巧,告诉你如何在很短的时间内完成大量的在线课程。如果你想知道,不,这个标题并不夸张。有可能在 6 天内完成 6 周的课程。
1.获得动力
动机很重要。如果你没有动力,这篇文章的其余部分将不会有任何帮助。找出激励你的动力。
你想了解更多吗?您想打造自己的产品/解决方案吗?你想被 FAANG 雇佣吗?你想升任首席数据科学家吗?你想给你的女性/男性朋友留下深刻印象吗?你不想浪费你已经花在课程上的 99 美元吗?
你的动力来源可能并不健康,但是……不管怎样都行?什么激励你并不重要。重要的是你有动力,你想做这件事。如果你不帮助你自己,没有人可以。

动力的来源。通过 Slideplayer 向徒弟馆积分
为什么动机如此重要?动力驱使你保持一致。它驱使你坚持你的时间表。它驱使你一点一点地点击你的课程,直到你完成它。
2.找到正确的课程
在你开始这个旅程之前做一些研究。不要简单地点击一门课程,因为你听说 90%的人在完成这门课程后会找到工作。如果你已经是 Python 的高手了,那学习《Python 入门》就没有意义了。
首先,找出你是谁。你想当数据分析师还是数据工程师还是数据科学家?(对,有都不一样)。

信用: Udacity
在你决定了你对哪条道路更感兴趣之后,找出你想学习哪种技术。如果你有一家梦想中的公司,不要害怕去接*他们,了解他们的工作范围和他们在理想候选人身上寻找的技能。一个简单的谷歌搜索“被 ___ 使用的前 ___ 是什么?”会给你很多结果。

信用:业务拓展
此外,我在本文末尾提供了一个有用资源的列表。一定要去看看!
提示:尽量选择有动手练习的课程。如果没有,试着选择有随堂考的课程。尽量避免只包含视频的课程。
3.计划你的时间表
保持一致。快速提问,哪个更好:
- 你每天花 5 分钟试图完成一节课的一半
- 你计划每天花 30 分钟,但是你每隔一节课休息一周
回答:不知道。
每个人都有不同的学习风格。我们中的一些人必须每天学习一些东西,而我们中的一些人必须长时间休息。只要适合你的学习风格,你有动力,你坚持不懈,这都没关系。
我建议你浏览一下你的课程大纲,试着上一课。估量你完成一节课需要多少时间,计算你完成整个课程需要多少时间,根据你的截止日期(如果你有截止日期的话)把计划挤进你的时间表。
最后,计划你的时间表。使用纸质记事本,三星笔记,苹果日历或者写在一张卫生纸上。我自己也用微软的便利贴。这不是最好的,但这是我最习惯的。从你的时间表中删除一些东西的感觉非常令人满意。它让我坚持下去,让我想一个接一个地删除任务。

我的便利贴。是的,它很丑,但对我很有效。
4.交错
交错是一种有效的学习方法。它包括在学习过程中切换不同的主题。
例如,不要在接下来的 2 周内每天学习 MongoDB,而是尝试在 4 周内学习 MongoDB 和 Git。你可以在我上面的便利贴中观察到,我在同一天学习 Azure 和 AWS。

来源:内驱
有什么好处?
- 你会更好地记住新信息。
- 你将能够把不同的概念联系起来。
- 你不会感到无聊。
然而,每个人都是不同的。如果这对你不起作用,你不必遵循它。做对你最有利的事!
5.强化你的学习
我认为这是最重要的一点。
为了确保你完全理解你所学的内容,我建议采取以下步骤(不分先后):
- 不随波逐流。有几门课程的每一节课都是视频课。这会诱使你跳到每门课程的末尾,这样你就可以在 5 分钟内拿到证书。不要这样做。如果有编程练习,就编码吧。如果有要完成的环境,就启动它。如果有重要的数学方程式,把它写下来。如果有测验,那就拿 a。
- 用你自己的数据集复制你所学到的东西。在课程结束时,我强烈建议你用自己的数据集复制你所学到的东西。例如,如果你刚刚学会如何建立一个决策树来预测客户流失,建立另一个决策树来预测购买决策。构建完成后,将其记录在您的 Github 概要文件中!
- 反思/写下你所学到的东西。反思,虽然听起来很老套,但它有助于巩固你的学习。它可以是一篇文章、一篇日志或者仅仅是一幅思维导图。将所有不同的课程整合成一个你写的简明笔记。通过连接这些点,你将对你所学的有更深的理解。
- 教导你的同龄人。不要不好意思/害怕展示你的技能。把你学到的东西教给你的同事或朋友。传播你所获得的知识!
结论
不,网络课程不是没用。如果你只是为了证书而匆匆忙忙地学习课程,却什么也学不到,那是没有用的。软件/库的片断是你可以呈现给客户的最终产品的组成部分。永远不要停止学习!
资源
- Udemy:包含非常具体的技术领域。课程可以很短,很容易完成,特别是如果你想学习特定的软件。
- Coursera:提供了复杂而全面的解释。有学位和全日制课程。有些课程是可以旁听的,也就是说你不需要付费,除非你想要证书。
- Edx:提供复杂和全面的解释。有学位和全日制课程。
- Datacamp:每月 25 美元。如果你有时间,支付 25 美元,尽可能多的做一些课程!课程数量有限,但我强烈推荐 T-SQL 课程。
- 走向数据科学:TDS 就像数据科学世界的谷歌。这里有许多优秀的人才开发出了有用的产品/解决方案。文章短小精悍,非常适合初学者!
- Youtube:除了猫的视频,你还可以找到各种各样与数学、统计学、机器学习等相关的视频。你说出来的,他们都有。
将职业转向自动驾驶汽车
原文:https://towardsdatascience.com/how-i-found-my-current-job-3fb22e511a1f?source=collection_archive---------3-----------------------
我如何从讨债转向自动驾驶汽车

新年是反思过去和规划未来的时候。本着这种精神,我想借此机会讲述一下我作为深度学习(DL) /计算机视觉(CV)工程师在这个行业中的经历。
2017 年 1 月,我在旧金山一家名为 TrueAccord 的公司工作。我使用时间序列和表格数据构建传统的推荐系统。那时,互联网上开始充斥着描述这些新的尖端深度学习模型的博客帖子和论文,这些模型甚至能够超越人类。我的热情很快转移到这个令人兴奋的新领域。
虽然我确实有一些深度学习的知识,但我的实践经验相当有限。研究生院让我几乎没有机会应用机器学习模型,但幸运的是,我发现了 Kaggle,这让我可以培养我的深度学习专业知识。最终,我获得了 Kaggle 大师的称号,在超声波神经分割挑战赛中获得了一枚金牌。这是深度学习架构 UNet 被 Kaggle 社区广泛使用的第一个挑战。这也是第一个挑战,其中软骰子被用作分割任务的损失函数。
在 2017 年之前,Kaggle 主要专注于举办表格数据竞赛。获胜的解决方案通常涉及 xgboost 和其他经典 ML 算法的堆叠。很少有深度学习算法能够取代这样的技术。
2017 年一切都变了。DL 变得更加成熟,从学术界走向工业界。Kaggle 竞赛紧跟潮流,与成像相关的挑战变得更加普遍。
我喜欢我在 TrueAccord 的工作,但我想跳槽到一个可以从事深度学习相关任务的职位。
问题是我的技能不一定有助于这样的改变:
- 我的专业是物理,不是计算机科学。
- 我只有一年的行业经验。
- 我的简历中没有任何机器学习相关的论文。
- 我在工作中没有做过任何计算机视觉项目。
- 我的深度学习知识有限。
基本上,我和其他试图改变工作方向的人处于同样的情况。
因此,我不得不像任何处在我位置上的人一样处理我的困境。方法很简单:你去面试,如果有效,你就完了,如果无效,你就研究你不知道的,然后重复。希望在有限的迭代次数内获得成功,你会幸运地得到想要的位置。
在此期间,我继续完善我的深度学习技能;看论文,看博文,当然还有参加深度学习比赛。
2017 年 3 月,当我和我的朋友 Sergey Mushinsky 在 Dstl 卫星图像特征探测挑战赛中获得 493 名第三名,并分享了 2 万美元的奖金时,我的工作开始得到回报。在那次挑战之后,我开始对二进制图像分割和多光谱图像感到舒适,这通常会在卫星图像中找到。(描述解决方案的博文、预印本、代码)
我用奖金买了第二个 GPU,这反过来让我意识到 Keras 在多 GPU 设置下工作不太好。我转向 PyTorch,它仍然是我选择的 DL 框架。然而,各行各业的成功来之不易。在同一时期,我没有通过笛卡尔实验室的现场面试和一些技术筛选。我知道我需要继续努力提高我的技能。
大约在那个时候,我被邀请参加英伟达的现场面试,但我也没有通过。我遇到的一个问题是我对 2D 物体探测器的工作原理了解有限。幸运的是,DSTL 启动了安全通道:在航空影像挑战赛中对车辆进行检测和分类,该挑战赛专注于 2D 检测。他们决定不在 Kaggle 托管,而是使用自己的*台。
那次比赛有一个重要的规则:“每个人都可以参加,但你需要有护照,并居住在一些有限的国家,才能领取奖金。”我住在旧金山,在美国纳税,但由于我的俄罗斯公民身份,我没有资格获得该奖项。我知道这个不幸的事实,但比赛仍然提供了使用物体探测器的宝贵实践,所以在努力工作后,我能够在比赛中获得第二名。
数据科学的进步在很大程度上基于广泛的国际社会的合作。我在脸书和 Twitter 上表达了我的观点,即我认为 DSTL 的规则与这些理想背道而驰,但随着尘埃落定,我将这些从脑海中清除,继续前进。不知何故,这个故事跟着我,被俄罗斯新闻选中了。很快,我发现我的脸出现在俄罗斯主要新闻媒体和电视频道的头版。
一个英国国防实验室为 MI-6 开发工具,人工智能算法,一个俄罗斯公民因为国籍而被拒绝获奖。这是一个很好的故事,俄罗斯媒体很快就发现了这一点。有一段时间,我对在镜头前接受采访感到不自在,所以我拒绝与记者交谈。这并没有阻止他们。他们把我的个人资料照片放在背景中,并邀请该主题的“专家”给出他们的专业意见。
记者们甚至找到了我的父母,他们对机器学习、竞赛和所有的事情都一无所知。我母亲告诉他们,父母是至关重要的,但低估学校老师的影响力是不明智的。这种偏离奏效了,记者们带着他们的问题来到了我的高中。
俄罗斯顶级科技公司之一的 Mail Ru Group 决定利用这个机会进行一些积极的公关。他们提出给我 15000 美元,相当于挑战的第二名奖金。我喜欢这个主意,但我觉得它不公*。我明知故犯地同意了规定我没有资格获奖的规则。此外,我并不兴奋地在简历中加入我曾为英国军情六处开发人工智能算法而获得报酬。我想到了一个更好的解决办法。我热爱理论物理,我知道要获得足够的资金总是有困难的。因此我要求把钱转给支持基础科学的俄罗斯基金。
最终,一切顺利。邮件 Ru 组和我得到了一些积极的公关。俄罗斯基础科学得到了 1.5 万美元。DSTL 有动力重新考虑他们的大联盟比赛规则。
这个故事引起了俄罗斯观众几天的注意,之后就销声匿迹了。在英语媒体中,只有一篇博客文章谈及此事。也许这样最好:)
很快三月变成了六月,我仍然没有找到一份计算机视觉的工作。
我名单上的下一家公司是特斯拉。招聘人员联系我是因为我的 Kaggle 成就,这并不经常发生。我通过了课后测试、技术筛选和现场面试。接下来是背景调查和埃隆·马斯克对我申请的批准。我没有通过。招聘人员告诉我,我违反了保密协议(NDA),并在一个论坛上谈论了面试过程。这是真的。我确实提到了我正在 slack 频道 ods.ai 进行采访。我没有分享任何面试问题,但从技术上讲,他们是对的。我记得,特斯拉的 NDA 相当严格,禁止讨论你的面试过程,即使是在高层次上。
这个拒绝让我很难过。与安德烈·卡帕西一起工作会很令人兴奋。即使是现在,几年后,我仍然为自己造成了那种不健康的状况而感到内疚。希望在某个时候,我有机会为我的行为道歉。
接下来是在卡格尔举行的星球:从太空了解亚马逊竞赛。这个问题太简单了,不能花太多时间。小数据集上的多标签分类。结果我和另外六个人的团队合并了。一个星期的时间,我们训练了 480 个分类网络,并进行堆叠。938 人中的第 7 名。
组织这次竞赛的公司叫做星球实验室。他们有一个开放的 DL 工程师职位,我问了一下,并被邀请到现场面试。我又失败了。反馈—没有深入的 DL 知识。
那是八月中旬。经过七个月的求职,我开始失去典型的积极态度和对自己的信心。我刚刚开始与 Lyft 的面试过程,但我认为它会像之前的所有事情一样结束。
我坐在窗前,用一杯白兰地来麻痹我的悲伤。
我又被拒绝了。
一位谷歌员工最*推荐你担任谷歌大脑(美国)的研究科学家。我们仔细审查了你的背景和经历,决定目前不继续处理你的申请。
我开始受不了了。
但是我有个主意。在每一个糟糕的情况下,都有一些深奥的举措可能奏效。大多数拒绝是在简历筛选阶段收到的。因此,我没有机会展示我的技能。为了先发制人,我决定需要在简历中添加深度学习出版物。
我联系了麻省理工学院的博士后 Alexey Shvets,并提出了一个建议:
- 找到下一个有比赛赛道的 DL 会议。
- 训练一个模型,创建一个提交,获得最后一名。(我假设,如果人们花费数年时间研究某个问题,那么对他们来说,这将很难成为合法的竞争)
- 写一份关于学术数据集的预印本或论文,描述我们的解决方案。
他同意了,我们寻找一个适合我们的会议。我们遇到了三周内发生的 MICCAI。它有一个名为内窥镜视觉挑战赛的工作室,还有一些计算机视觉比赛。最后期限是八天后。
我们选择了第一个挑战,吉安娜。这个问题有三个次级挑战。在剩下的八个晚上,我修改了我在 Kaggle 比赛中使用的管道,重构了代码,并训练了新的模型。阿列克谢写了描述我们方法的报告。我们相信我们会在排行榜的末尾。因此,我真的没有在这些问题上花时间。我们向组织者提交了我们的申请和报告,我想这将是我们小小冒险的结束。事实并非如此,Alexey 发现该研讨会还有另一项名为机器人器械分割的竞赛,其中有三项分挑战,截止日期延长,四天后即将到来。他问我是否愿意尝试这些次级挑战。我同意了,把自己关了四个晚上,为组织者粗制滥造代码、模型和生成预测。
挑战伴随着一个警告:团队的一名成员需要来 MICCAI 并展示结果。最终地位只能在会议上宣布。
我从来没有去过魁北克市和加拿大,所以我很高兴去,并同意了。
工作坊的日子到了。我走进工作室,发现一大群热情的医学影像专家似乎彼此都认识。我不认识任何人,我也不能开始对话,因为我在深度学习和计算机视觉方面感觉很舒服。尽管如此,医学成像的所有细节对我来说还是有点陌生。
第一项挑战开始了。来自不同大学的团队展示了他们的解决方案。很难判断他们有多好,但很明显他们投入了大量的工作。轮到我了。我来到讲台,告诉观众我不是这个领域的专家,我们做这个挑战只是作为一个深度学习练习,为浪费他们的时间道歉,并展示了我们的两张幻灯片。
组织者展示了结果。
1.第一项子挑战—我们是第一名。
2.第二次挑战—我们是第三名。
3.第三项子挑战—我们是第一名。
首先总体来说。(官方新闻稿)

是第二次挑战的时候了,这次挑战的截止日期推迟了四天。不同的团队提出了他们的解决方案。我再次为浪费观众的时间道歉,并展示了我们的两张幻灯片。
第一,第二,第一。首先总体来说。
我至今记得那一刻。我站在现场。组织者正在准备一张支票和一些礼物。阿列克谢和我取得了胜利,但我不禁对这种明显的荒谬感到沮丧。这是怎么发生的,一些随机的没有医学成像领域知识的家伙在两个挑战中都获得了第一名?然而,那些以医学成像工作为生的人使用的是更弱的模型?
我问观众:“你们知道我在哪里工作吗?”没有人知道,除了一个查看我 LinkedIn 个人资料的组织者。我告诉他们,我在讨债机构 TrueAccord 工作,我没有在工作中训练深度学习模型。我感叹自己没能脱离这种模式,因为 Google Brain 和 Deepmind 里的 HR 甚至都不看我的简历。
在那次充满激情的演讲后,听众中 Deepmind 健康团队的成员在休息时抓住我,问我是否有兴趣面试他们团队的一个研究工程师职位。
我相信这是历史上第一次,一个讨债机构赢得了医学成像的比赛。😃
不久后,我接受了 Lyft 的一份工作邀请,目前我在那里工作。在 TrueAccord 和 Lyft 之间,我还参加了在 Kaggle 举行的 Carvana 图像屏蔽挑战赛。GIANA 的做法让我进入了排行榜的后 20%。新的想法不断涌现,由 Vladimir Iglovikov、Alexander Buslaev 和 Artem Sanakoyeu 组成的团队在 735 名选手中获得第一名。(博文,代号)
该竞赛是社区开始在 UNet 类型架构中使用预训练编码器的第一个大挑战。这是现在的标准,并且有伟大的库允许你用各种不同的预训练编码器得到各种不同的分段网络。但是在那个时候,这个想法还是比较新的。这个挑战导致了名为 TernausNet 的预印本,这是我和阿列克谢写的,只是为了好玩,令人惊讶的是,这是我被引用最多的作品。
结论
在八个月的时间里,我在自己感兴趣的领域找到了一份的优秀工作。那段时间充满了痛苦。当你在尝试新事物时,你会犯错误。每次失败的时候,你可能都会觉得自己很蠢。有时,你可能会开始对自己失去信心。但是记住你正在学习新的东西。你迈出的每一步都会让你更接*你想要的目标。
在过去的几年里,我在我的谷歌学术档案:)中添加了一些深度学习论文

校对: Erik Gaasedelen 。
俄文版正文。
我是如何获得 4 份数据科学工作邀请,并在被解雇后两个月内收入翻倍的
原文:https://towardsdatascience.com/how-i-got-4-data-science-offers-and-doubled-my-income-2-months-after-being-laid-off-b3b6d2de6938?source=collection_archive---------0-----------------------
数据科学面试

马丁·比约克在 Unsplash 上的照片
在这个前所未有的疫情时期,许多人发现他们的职业生涯受到了影响。这包括一些我曾经共事过的最有才华的数据科学家。在与一些密友分享了我的个人经历以帮助他们在下岗后找到新工作后,我认为这值得公开分享。毕竟这触动的不仅仅是我和我的朋友。任何因疫情而被解雇的数据科学家或正在积极寻找数据科学职位的人都可以在这里找到一些相关的东西,我希望这些东西最终会给你的求职带来希望。
所以,如果你曾经陷入困境——在面试中,在面试准备中,在谈判中,任何事情——我都曾在那里,我想帮助你。如果你认为我能以任何方式让你的旅程变得更容易,你可以在这里联系我。这是我的故事。我希望你能从中找到一些有用的提示和鼓励。
目录
- 被解雇
- 准备搜索
- 求职开始
- 面试:概述
- 面试前
- 特定科目准备
- 获得 100%现场报价率的秘诀
- 谈判
- 外卖
- 概述
- 更新(2020 年 10 月 1 日)
被解雇了
2018 年 12 月,我的经理通知我,我将于 2019 年 1 月被解雇。三个月前,我当时创业公司的工程副总裁给我们的人力资源主管写了一封信。这封信解释了为什么我是公司里表现最好的人之一,并主张增加我的工资。这帮助我获得了 33%的加薪。我很自然地感到有动力,渴望在一个重要的项目上突破下一个里程碑。公司和我自己的未来看起来一片光明。正是在这个成功的时刻,我被告知我受到了公司削减成本计划的影响。1 月 15 日我被解雇了。
至少可以说,被迫开始寻找新工作是令人畏惧的。在浏览了市场上的数据科学职位空缺后,我很快意识到了自己的知识差距。我在 B2B 初创公司所做的事情(入门级数据工程和机器学习的结合)与那里的许多工作要求完全无关,比如产品感觉、SQL、统计等等。我知道基础知识,但不确定如何填补更高级技能的空白。然而,与更紧迫的问题相比,即使是这个问题似乎也是次要的,例如我怎么才能得到面试机会?我只有一年半的创业工作经验,而且没有任何统计学或计算机科学相关的学位。更多的问题接踵而至。如果我在失去签证身份前找不到工作怎么办?如果在我找到新工作之前经济衰退了怎么办?尽管我很害怕,但几乎没有选择。我不得不找一份新工作。
为搜索做准备
面对如此艰巨的任务,我需要一些信息来决定接下来的步骤。在做了一些研究后,我意识到市场上超过一半的数据科学职位是产品驱动型职位(‘产品分析’),其余的要么是建模,要么是面向数据工程的职位。我还注意到,产品分析以外的职位往往要求更高。例如,大多数模特职位需要博士学位,工程职位需要计算机科学背景。很明显,不同赛道的要求差异很大,因此每条赛道的准备工作也会有所不同。
有了这些知识,我做了一个重要的决定:为所有的赛道做准备将是势不可挡的,而且很可能是低效的。我需要专注于一个。我选择产品分析,因为根据我的背景和经验,我有更大的机会在这个领域获得面试机会。当然,并不是每个数据科学领域的人都有我的背景和经验,所以下面我总结了大公司三类数据科学职位的一般要求。理解这个基本的问题为我节省了很多时间,我相信它会对其他寻找数据科学工作的人有用。然而,我要补充的是,对于小型创业公司来说,面试可能不那么结构化,需要更多的这三者的混合。
产品分析(约 70%的市场份额)
- 要求:有推出产品的实践经验;商业敏锐度强;高级 SQL 技能
- 例子:数据科学家,Airbnb 的分析;Lyft 的数据科学家;脸书大学的数据科学家;谷歌的产品分析师
建模(市场上约 20%)
- 要求:机器学习的知识(不仅要知道如何使用还要知道底层的数学和理论);强大的编码能力
- 例子:Lyft 的数据科学家、算法;数据科学家,Airbnb 的算法;亚马逊的应用科学家;脸书大学的研究科学家
数据工程(市场上约 10%)
- 要求:具有数据工程技能的端到端数据科学家;分布式系统的知识;MapReduce 和 Spark 有使用 Spark 的实践经验;强大的编码能力
- 例如:Airbnb 基金会数据科学家;一些创业公司的数据科学家
根据我自己的经验,这篇文章的其余部分是为那些准备进入产品分析岗位的人量身定做的。稍后回来查看我关于准备数据工程职位的帖子。
求职开始了
当我知道自己将被解雇时,我做的第一件事就是积极主动地申请其他工作。我用了所有我知道的求职板,包括 GlassDoor 、early和 LinkedIn 。我也问了所有认识的人推荐。但由于已经快年底了,直到 2019 年 1 月,我都没有收到任何回复。
事实证明,寻求推荐比我自己申请有效得多。在大约 50 份原始申请中,我只获得了 3 次面试机会,但在 18 份推荐中,我获得了 7 次面试机会。总的来说,越来越明显的是,在这个市场上,我不被认为是一个强有力的候选人。
面试:概述
虽然每个公司的面试结构都不一样,但大多数公司都遵循一个总体框架:
- 招聘人员最初的电话
- 1 或 2 轮技术电话筛选(TPS)或带回家的作业
- 4 ~ 5 小时的现场面试,通常包括 3 ~ 4 轮技术面试和招聘经理的行为面试
我采访过的公司中,大约有一半(4/10)在 TPS 之前或之外有带回家的任务。带回家的作业消耗了很多能量。通常,8 小时的带回家作业导致我在提交后至少需要半天时间休息。正因为如此,我尽了最大努力相应地安排了面试。我课后作业的第二天早上没有面试。仅仅意识到基本结构就能让你感觉更轻松,并能应对找新工作的过程。
面试前
进入我的面试,每一个机会对我来说都是至关重要的****。虽然我知道有些人通过面试来学习,在多次面试后变得更好,通常会获得他们面试的最后几家公司的录用通知,但我觉得我不能采取这种方法。2017 年毕业的时候,500 份原始申请,我只收到了 4 份面试。我不指望在 2019 年得到更多。因此,我的计划是为每次面试做好充分准备。我会让没有机会去浪费。
被解雇的一个好处是我可以为面试而全职学习。每天我都把我所学的东西组织起来,每天集中在两三件事情上。不会了。从以前的面试中,我了解到深刻的理解可以让你在面试中给出更透彻的回答。当你比*时更加紧张和焦虑的时候,在面试中有一个深度的知识会特别有帮助。这不是你想假装的时候。
当我描述自己的经历时,我不禁想起了我经常听到的一个常见的误解:没有真实的经历,就不可能获得关于产品/实验的知识。我坚决不同意。我之前没有任何产品或 A/B 测试的经验,但是我相信这些技能可以通过阅读、倾听、思考和总结获得。毕竟,这和我们在学校被教导的方式是一样的。事实上,随着我越来越了解更多的资深数据科学家,我不断了解到这种方法很普遍,甚至对于有多年经验的人来说也是如此。你将要面试的内容可能与你正在做的事情完全无关,但是你可以通过工作经验之外的方式获得你需要的知识。
以下是你可以预期的基本情况。通常,产品和 SQL 问题是在 TPS 期间提出的。现场采访包括几轮问题,包括产品意识、SQL、统计、建模、行为,可能还有演示。接下来的几个小节总结了我在准备面试时使用的最有用的资源(都是免费的)。总的来说, GlassDoor 是了解公司具体问题的好来源。一旦我看到这些问题,我就明白了公司需要什么,以及在满足这些需求方面我的差距在哪里。然后我就可以制定一个计划来填补这些空白。
特定科目的准备

安德鲁·尼尔在 Unsplash 上拍照
以下六个小节是我如何准备产品分析专题采访中出现的具体内容的。在解释我自己的准备时,我希望为我的后来者铺*道路。
产品感
在一家创业公司做数据科学家,主要负责开发和部署机器学习模型,编写 spark 作业。因此,我几乎没有获得任何产品知识。当我在 GlassDoor 上看到一些真实的面试问题,比如“如何衡量成功?”或者“如何通过当前用户的行为来验证新功能?”,我完全不知道如何处理这样的问题。当时,它们似乎过于抽象和开放。
为了学习产品意识,我求助于基本的阅读和总结策略,使用下面列出的资源。所有这些阅读帮助我积累了产品知识。因此,我想出了一个结构化的方法(我自己的“框架”)来回答任何类型的产品问题。然后,我将我的知识和框架用于测试,这对于学习任何技能都是必不可少的:练习。我写下了涉及产品感觉的问题的答案。我大声说出我的答案(甚至用手机给自己录音),并用录音来微调我的答案。很快,我不仅可以在面试时假装,我还真的知道自己的东西。
资源:
- 恒星同行
- Gayle Laakmann McDowell 和 Jackie Bavaro 的访谈
- 解码与征服 刘易斯·c·林著
- 案件采访秘闻 作者郑胜利
结构化查询语言
我第一次参加 SQL TPS 考试失败了,那是在一家我非常感兴趣的公司。显然,有些事情需要改变。我需要再次练习,所以我花时间研究 SQL 问题。最终,我能够在一天内完成之前要花一整个星期的问题。熟能生巧!
资源:
- Leetcode 数据库问题
- HackRank SQL 问题
统计和概率
为了准备这类问题,我复习了基础统计和概率,并做了一些编码练习。虽然这看起来很难回答(这两个主题都有很多内容),但是对于产品数据科学家来说,面试问题从来都不难。下面的资源是复习的好方法。
资源:
- 汗学院有一门介绍性的统计和概率课程,涵盖了这两方面的基础知识。
- 这本在线统计书涵盖了所有基本的统计推断。
- 哈佛有一门统计 110:概率课程,这是一门关于带有实际问题的概率的入门课程。如果你更喜欢阅读而不是听,宾夕法尼亚州立大学有一门介绍概率论的课程,里面有很多例子。
- 我还在 HackRank 上通过 10 天的统计进行编码,来巩固我的理解。
- 有时,A/B 测试问题会在统计面试中被问到。Udacity 有一个很棒的课程涵盖 A/B 测试的基础知识,Exp Platform 有一个关于这个主题的更简洁的教程。
机器学习
没有 CS 学位,我带着有限的机器知识去找工作。我在之前的工作中上过一些课程,我复习了这些课程的笔记来准备面试。然而,即使现在建模问题变得越来越频繁,产品数据科学家的面试问题主要是如何应用这些模型,而不是基础的数学和理论。这里仍然有一些有用的资源,可以在面试前提升你的机器学习技能。
资源:
- 首先,我推荐安德烈亚斯·穆勒的免费应用机器学习课程
- Coursera - 机器学习吴恩达
- Udacity - 机器学习工程纳米学位
介绍会;展示会
一些公司要求候选人要么展示带回家的作业,要么展示一个他们最引以为豪的项目。尽管如此,其他公司还是在行为访谈中询问了最有影响力的项目。然而,不管是什么形式,关键是要让你的演讲有趣和有挑战性。
听起来不错,但是你怎么做呢?我的主要建议是考虑所有的细节,比如高层目标和成功指标,ETL,建模实现细节,部署,监控和改进。这些小事情加在一起,而不是一个大想法,就能形成一个伟大的演示文稿。这里有几个问题值得重新思考,以帮助你达到理想的演示效果:
- 项目的目标和成功标准是什么?
- 你如何决定启动这个项目?
- 你如何知道客户是否从这个项目中受益?差多少?
- 你如何测试它?如何设计你的 A/B 测试?
- 最大的挑战是什么?
演示项目时,您希望吸引观众。为了让我的演讲有趣,我经常分享这个项目中有趣的发现和最大的挑战。但是确保你投入的最好方法是练习。练习,大声练习。我练习向我的家人展示,以确保我对材料的掌握和沟通的便利。如果你能让你认识的人参与进来,一个被要求倾听的面试官就没有机会了。
行为问题
虽然很容易陷入准备技术面试问题,但不要忘记行为问题同样重要。我面试过的所有公司在现场部分都至少有一轮行为面试。这些问题通常分为以下三类:
- 为什么是我们?/一份工作中你最看重的是什么?
- 介绍一下你自己/你为什么要离开现在的工作?
- 职业生涯中最大的成功/失败/挑战。其他版本:告诉我你解决冲突的一次经历,或者你不得不说服你的经理或项目经理的一次经历。
行为问题对于数据科学家来说非常重要。所以要做好准备!了解一家公司的使命和核心价值观有助于回答第一组的问题。像问题 2 和 3 可以通过讲故事来回答——3 个故事足以回答所有的行为问题。当你去面试的时候,确保你手头有几个好故事。类似于产品问题,我练习了很多,大声说出来,录音,听,然后调整我的答案。听一个故事是确保它有效的最好方法。
获得 100%现场报价率的秘诀

活动发起人在 Unsplash 上的照片
现场面试的前一天晚上通常是一个紧张、忙碌的夜晚。我总是试图塞进更多的技术知识,同时回顾我的统计笔记,思考我的框架来回答产品问题。当然,正如我们在学校学到的,这些都不是非常有用的。结果在很大程度上取决于没有一晚临时抱佛脚之前的准备量。所以准备是重要的,但是有一些规则你可以遵循,以确保你的面试成功。
- ****总是在回答问题之前澄清问题。用自己的话复述问题,确保你理解了对方的提问。如果你回答问题却不澄清,这是一个危险信号。
- 整理所有问题的答案。用要点写下你的思考过程。这向面试官展示了你处理问题的系统方法,并有助于面试官稍后为你写一篇评论。
- ****不知道答案的时候不要慌。如果你不熟悉这个领域也没关系。在这种情况下,你可以先做一些假设,但一定要告诉对方你在做假设,并询问这些假设是否合理。有时候要求更多的时间完全没问题。如果你想不出任何答案,大脑一片空白怎么办?谈谈你的一次与问题相关的经历。
- 态度很重要。公司正在寻找一个愿意倾听并能接受不同意见的人。你想表现出你是一个容易共事的人。要谦虚,要尊重。听并澄清。把你的正能量带到房间里,尽你所能进行一次愉快的谈话。
- ****研究公司。熟悉其产品。问问你自己如何改进产品,什么样的标准可以用来衡量这些产品的成功。阅读数据科学家的博客也有助于了解他们在每家公司的工作。做这种研究能让面试中的对话更深入,最终更好。
利用这些规则,这是我从现场采访中得到的反馈:
- 非常有条理地回答产品问题
- 演示非常有条理,经过深思熟虑
- 对我们的产品表现出浓厚的兴趣,并提出了宝贵的改进意见
谈判
在收到口头提议后,下一步是与招聘人员合作,最终确定人数。这里只有一条我坚持的规则——永远谈判。但是怎么做呢?
Haseeb Qureshi 有一个关于谈判工作机会的非常有用的指南(带脚本!)在我的报价谈判阶段,我严格遵循了这一原则。每一条规则都是如此真实。我和所有给我报价的公司都进行了谈判。报价的*均增幅为 15% ,最高报价的总价值增幅为 25% 。谈判行得通,所以不要害怕尝试!
外卖食品
- 大量的练习是关键。
- 失败是生活的一部分,也是求职的一部分。不要太认真。
- 找到一种对你有效的减压方式。
概观
在减掉了 11 磅,经历了大量的哭泣和尖叫(找工作压力很大,承认这一点没关系)之后,我终于在被解雇的 2 个月内获得了 4 份工作。其中 3 份来自我从未想过要加入的公司: Twitter、Lyft 和 Airbnb (我最终加入了这家公司),另一份来自一家医疗保健初创公司。在疯狂的两个月结束时,我总共收到了 10 次面试、4 次现场面试和 4 份工作邀请,给了我 40%的 TPS 到现场率和 100%的现场到工作邀请率。

图片由艾玛丁 |从被解雇到加入我梦想中的公司的时间线
我很幸运,在被解雇后,我从家人和朋友那里得到了很多支持和帮助,这对于在我梦想的公司找到一份工作至关重要。这很难。具有讽刺意味的是找工作也是一大堆工作,但一切都是值得的。
我写这篇博客是因为我知道我有多不知所措。面试要准备的东西太多了。我希望这篇文章能让其他需要工作的数据专家明白一些事情,如果你想要更多的建议,请随时联系我这里。我很高兴现在能从事一份很棒的工作,我也很乐意帮助你实现这一目标!
更新(2020 年 10 月 1 日)
自从我三周前发表这篇文章以来,我收到了数百个关于数据科学面试的问题。所以我决定制作一系列视频来帮助你获得梦想中的数据科学工作。有兴趣可以去我的 YouTube 频道看看!
感谢阅读!
如果你喜欢这个帖子,想支持我…
- 订阅我的 YouTube 频道 !
- 跟我上 中 !
- 连接上Linkedin!**
- 前往emmading.com/resources获取更多关于数据科学面试技巧和策略的免费资源!
我如何在加拿大找到一份数据科学的工作
原文:https://towardsdatascience.com/how-i-got-a-data-science-job-in-canada-aacb24d204d7?source=collection_archive---------3-----------------------
我的加拿大新移民之旅

图片鸣谢:https://www . pexels . com/photo/Canada-city-city scape-downtown-6998/
移居国外对我来说是一种幻想。我花了 3 年时间来计划和执行它。我想分享我的旅程,认为它可能会帮助走相同道路的人。长话短说,我拿到了我的公关,于 2018 年 10 月软着陆,探索了一周的城市,并搬回了印度,因为冬天开始了,我也想节省足够的资金,以便我为艰难的开始做好准备。我开始探索就业市场,发现它对数据科学非常乐观。我从以前的移民那里学到的东西
- 人脉是找工作的核心
- 作为一个家庭搬进来会增加我的开销,可能会迫使我去做一份零工。所以我打算一个人来
- 我有 10 个月的资金来集中精力找工作
- 预订了 3 个月的 Airbnb 房间,所以我的注意力完全放在了找工作上。我选择留在怡陶碧谷,因为它在密西沙加和多伦多之间。
- 我在 Coursera 和 Udemy 上完成了许多认证,这帮助我在市场中占据有利位置
抵前规划
- 我得到了一个有加拿大号码的神奇杰克号码,这样加拿大的任何人都可以很容易地与我联系。注意:这样做帮助我建立了联系,但没有帮助我获得面试机会,因为大多数员工希望我亲自去
- 我开始用加拿大格式制作我的 2 页简历(避免花哨的格式,遵循 ATS 格式)。我看到有人建议准备许多版本的简历,并根据工作要求进行更改,但我不建议这样做。我准备了一份合适的简历,并根据许多人的评论持续改进了几个月。
- 我接受了 Access 就业帮助来格式化我的简历。这是为新移民提供的免费服务
- 在联系任何人之前,确保我的 LinkedIn 已经更新,并且复制了简历内容。如果你有一份基于工作描述的不同版本的简历,这就是人们被抓住的地方。我对拥有不同版本的 resume☹持否定态度
- 我是 LinkedIn 的忠实粉丝,因为我的大部分工作都是通过它完成的。我列出了多伦多所有相关公司的候选名单,并开始向分析领域的人员发送带有自定义消息的连接请求(例如:经理、高级经理、主管、副总裁等。每天我都试着联系 60 到 100 个人,我得到的回复率是每天 10 到 20 人。接下来,我会解释我的经历和我正在寻找的机会。20 个人中,大约有 4 到 5 个人会给出不同的回答,比如
a.目前,我们没有任何空缺,但如果有事情发生,我们会通知你
b.请将您的简历发送给我,我们的人力资源团队将会与您联系
c.目前,我们不会在三个月后开放 ping me
d.访问我们的网站并申请这份工作
e.有些人有空缺,但希望我立即加入
我把所有提供积极和中立信息、名称和对 excel 模板的回应的联系人都找了出来。我会定期跟踪人们,更新他们的状态。因为我的搬家计划被推迟了两个月,我停止了这个过程几个月。我本应在 2019 年 4 月前搬家,但我直到 2019 年 5 月才搬家,因为我试图在我之前的公司内部*行调动(我真倒霉,在☹没有成功)
岗位到达提示:
在我到达的前 45 天,我开始积极地推销自己。随着着陆日期的临*,我开始接到很多电话,并在第一周安排了 5 次面试。是的,这是一个令人敬畏的开始,但最*,我意识到事情需要很长时间才能取得进展。幸运的是,在第 10 天,我在一家营销机构找到了一份全职工作(高级分析师),但由于这份工作不符合我的职业目标,我告诉他们我需要一些时间来探索其他机会。是的,我知道这是什么感觉,但我不想在几个月后就开始一个角色并改变。幸运的是,一周后高级经理联系了我,给了我一个月的自由职业机会,并同意让我在完成工作后参加面试。哇,这让我很开心,也给了我一些喘息的机会,因为在接下来的 2 到 3 个月里,我不用动我的资金了。
快进 30 多天,有许多咖啡会议和 10 多个采访,许多都在最后阶段。我攻破了两家银行,一家电信公司和一家营销机构。这一切都发生在一周之内。我选择了一家银行,因为这份工作很棒,气氛也很友好。我喜欢在咖啡会议和采访中与我交谈的人。
如果你需要任何帮助,请随时在 LinkedIn 上给我发消息。
我如何在没有 STEM 背景的情况下找到一份数据科学家的工作
原文:https://towardsdatascience.com/how-i-got-a-job-as-a-data-scientist-without-a-stem-background-f56813208991?source=collection_archive---------9-----------------------
我如何找到一份有商业背景的数据科学家的工作

图片由皮克斯拜的 Gerd Altmann 提供
这篇文章讲述了我是如何对数据科学感兴趣的,我成为数据科学家的历程,以及我对你的建议,即使没有 STEM(科学、技术、工程、数学)背景,你也可以成为一名数据科学家。最后,我希望这能帮助你朝着正确的方向去实现你的目标!开始了…
如果这是你喜欢的那种东西,成为第一批订阅 我的新 YouTube 频道在这里 !虽然还没有任何视频,但我会以视频的形式分享很多像这样的精彩内容。感谢大家的支持:)
尽管我拥有商学学士学位,但我最终还是在 Datatron 找到了一份数据科学家的工作,这是我过去三年的目标。为了让你明白我是如何走到今天这一步的,我认为让你了解一点我的过去是很重要的。
我对数据的兴趣源于本科二年级时对金融数据的涉猎。通过一点分析和足够的运气,我的股票投资组合翻了十倍,我被从原始数据中提取巨大价值的想法迷住了。
大约在同一时间,我接触到的软件工程师朋友让我对学习如何编程产生了兴趣,特别是 Python。当我最终听说机器学习的概念时,我知道这是我想了解更多的东西。
这引出了我的第一个建议…
1.致力于自己学习和完成几个数据科学项目
让我把它进一步分成两个子点:
a)持续了解与数据科学相关的任何内容
因为“数据科学”的定义非常模糊,所以成为一名全面发展的数据科学家需要具备广泛的技能。以下是我在过去几年中努力磨练的一些最重要的技能,以及我为此利用的资源:
机器学习:
- 机器学习入门(Kaggle) :如果你对机器学习一无所知,我相信这是最好的入门资源。它从零开始,带你完成你的第一个机器学习模型。
- 中级机器学习(Kaggle) :这是上述课程的延伸,也以直观的方式教你更多的概念。
- 机器学习 A-Z (Udemy) :一旦你有了机器学习的想法,这门课就(几乎)涵盖了所有的机器学习技术。它涵盖了每个模型背后的概念,并通过代码向您展示了一个示例。
- 机器学习——斯坦福大学(Coursera) :如果你真的想加强对每个模型背后概念的理解,这是最好的方法,也是最受欢迎的课程之一。
Python/SQL :
- Python 简介(Datacamp) :学习 Python 的最好方法是完成一些辅助项目,而不是一堆训练营。也就是说,如果你对 Python 一无所知,这是一个很好的入门资源。
- 学习 Pandas 教程(Kaggle) : Pandas 是一个用于数据操作和分析的 Python 库。知道如何使用这个库是非常有益的,因为当完成个人数据科学项目时,它将使您的生活变得容易得多!
- 学习 SQL (Codecademy) :可以说 SQL 和 Python 一样重要,而且学习基础知识非常容易!一旦你完成了这个课程,你就可以在网上找到练习题来磨练你的技能。
统计/数学:
- 统计与概率(可汗学院):机器学习本质上是统计学。我直到后来才知道这一点,但是有一个好的统计学基础会让你的旅程更加顺利。
- 线性代数(可汗学院):学习线性代数的基础知识也很重要,因为它是机器学习不可或缺的一部分。
b)完成几个出色的数据科学项目。
一旦你建立了基础,加速学习的最好方法就是完成一些数据科学项目。最好的方法是继续追踪,选择一个数据集,并创建一个预测模型或一些数据可视化。记住,你最初的几个项目不会很棒!但重要的是你如何随着时间的推移而进步。
以下是我过去完成的一些数据科学项目,你可以从中获得一些灵感!
- 冠状病毒数据可视化使用 Plotly
- 使用随机森林预测二手车价格
- 预测预期寿命
在您继续学习和实践数据科学技能的同时,您还可以做其他事情来使自己成为更有价值的数据科学候选人,这就引出了我的下一个技巧:
2.寻找类似数据科学家职位的工作
我知道这将是一场艰苦的战斗,尤其是我之前没有数据科学家的经验。然而,找到类似于数据科学家职位的工作将显著增加你成为数据科学家的机会。这样做的原因是相关的工作会给你机会在商业环境中处理实际数据。
我最初在加拿大贝尔公司担任商业情报顾问,这让我第一次接触到现实生活中的数据。实习结束时,我学会了如何更广泛地使用 Excel,如何使用 SQL 查询大型复杂的数据库,以及如何利用数据支持业务决策。
然后,我在 Wealthsimple 担任数据和运营助理,在这里,我有机会开发其第一个数据处理和分析流程,并创建了几个仪表板。
最后,我去了 HelloFresh,做了一名增长型市场分析师。这是我有机会在商业环境中开发机器学习模型的第一份工作,我开发了几个模型来优化折扣。
我的观点是这样的:尽管没有一份数据科学工作,但我能够在前一份工作的基础上学习一些与数据科学相关的技能。
做“数据科学”工作不需要成为数据科学家
以下是一些你可以寻找的数据科学相关的工作:
- 商业智能分析师
- 数据分析师
- 产品分析师
- 增长营销分析师/营销分析
- 定量分析师
除了以上两点,还有一个技巧大大提高了我作为数据科学家的声望…
3.获得定量领域的硕士学位
大多数数据科学工作清单要求硕士学位,因为它通常需要高水*的技术技能。如果你发现上面的两条建议并没有让你获得成功,我建议你去看看定量领域的硕士项目(计算机科学、统计学、数学、分析学等等)
就我个人而言,我选择参加佐治亚理工学院的理学硕士分析课程有以下几个原因:
- 它不需要定量领域的学士学位。
- 它有一个在线项目,以防你想边工作边学习。
- 整个项目只需花费 100 10K 美元.
也就是说,有几种选择,我强烈建议你在做决定之前花时间探索所有的选择!
真正帮助我获得曝光率并最终获得数据科学职位的是我致力于的一个名为“52 周数据科学”的个人计划,在这个计划中,我用一年时间学习和博客任何与数据科学相关的东西。下面是一个时间表,显示了我的成就以及博客是如何帮助我的。
时间表
11 月 28/19 日:发表了我的第一篇博文
12 月 12 日/19 日:这家初创公司发布了第一篇博文
1 月 2 日/20 日:被批准成为《走向数据科学》的作者
2 月 8 日/20 日:单日浏览量超过 28,000 次
2 月 25 日/20 日:在 30 天内获得超过 200,000 的浏览量
2 月 25/20 日:收到 Datatron 的数据科学家职位
TLDR
- 致力于自己学习和完成几个数据科学项目
- 寻找类似数据科学家职位的工作
- 获得定量领域的硕士学位
感谢阅读!
如果你喜欢我的工作,想支持我…
- 支持我的最好方式就是在媒体 这里关注我。
- 在 Twitter 这里成为第一批关注我的人之一。我会在这里发布很多更新和有趣的东西!
- 此外,成为第一批订阅我的新 YouTube 频道 这里!
- 在 LinkedIn 这里关注我。
- 在我的邮箱列表 这里注册。
- 查看我的网站,terenceshin.com。
以前的文章
[## 脸书的数据科学面试实践问题
一些脸书面试问题的预演!
towardsdatascience.com](/facebooks-data-science-interview-practice-problems-46c7263709bf) [## 在这里你可以看到冠状病毒的实时更新和统计数据
以下是你需要了解的关于冠状病毒 Worldometer 的信息
towardsdatascience.com](/heres-where-you-can-see-data-visualizations-live-updates-and-statistics-on-the-coronavirus-dff8b2986b39) [## 使用 Plotly 实现冠状病毒数据可视化
新型冠状病毒 2019 数据集分析及代码
towardsdatascience.com](/coronavirus-data-visualizations-using-plotly-cfbdb8fcfc3d)
我是如何进入 12 个数据科学硕士项目的
原文:https://towardsdatascience.com/how-i-got-into-12-data-science-masters-1eeddae21ba7?source=collection_archive---------4-----------------------
我自己的统计数据,目的声明与个人声明,所有的一切。

PC @我:)狼獾加油!
您好,世界!🌎
我认为这是一个合适的开始,因为当我开始收集申请研究生院的材料时,这就是我所知道的一切。我当时是经济学专业的学生,只是在游戏的后期才意识到我想从经济学博士转向数据科学家——但我做到了,这意味着你也可以。
我的指标(申请本科大四):
- *均绩点: 3.4
- GRE:Quant 162,Verbal 163,写作 4.5
- 学校:密歇根大学——安阿伯分校
- 学过:经济学(主修)数学(副修),语文和法语
- 缺点:我第一次大学数学课(Calc 1)得了个 C-。我不知道如何编码。喜欢,一点都不喜欢。什么是投资组合?
- 优点:我学了 Calc 4 和线性代数(因为我很喜欢惩罚)。随着时间的推移,我的成绩越来越好。热情第一。
数据科学/分析项目硕士:
- 适用: 12
- 接受:12
- 学校:杜克、塔夫茨(2 所)、南加州大学(2 所)、乔治敦、乌米奇(2 所)、弗吉尼亚大学、内奇加戈(2 所)、北卡州立
- 先是拒绝了我,后来又接受了我
- 提供奖学金的项目
- 提供的奖学金:UChicago 每年 25000 美元,弗吉尼亚大学每年 12000 美元,杜克大学学费减免 25%,乔治敦大学每年 14500 美元
哦,我有没有提到我的母校密歇根大学拒绝了我?是的,那一个击中了要害。
高三的秋天🍁
正如你可能知道的那样,我在某种程度上患有编码缺陷(因为我不知道如何编码,或者 Github 是什么,或者提到的 Python 不是有毒的生物),所以我在这里做了两件事:我参加了我大学的 CS 入门班,我找到了一个人雇我为他们做数据可视化。我还参加了一个教授 R 的课程,这是我个人最喜欢的(出于某种原因,我无缘无故地强烈保护 R。跟我打,兄弟)。
坦率地说,这份工作相当幸运;我表达了我对学习如何编码的热情,并表示我会尽可能地收拾残局。我还在面试后发了一封非常体贴的感谢信(就像一个小时的撕掉你的头发,不管是说“真诚的”还是“恭敬地”),并在回复邮件后立即被录用了。谢谢你们已经走了很长的路了,伙计们。
在 CS 入门课程结束时,我已经学会了用 Python 创建基本的机器学习算法。我的最后一个项目是从老玛丽亚·凯莉、麦可·布雷和宾·克罗斯比创作新的圣诞音乐,我还成功地实现了一个 web scraper 程序来完成它。尽管我主要学的是 C++,但我很快发现这些技能是可以转移的,并且能够为最终项目学习很多 Python。
如果你现在是本科生,我强烈推荐你参加计算机科学课程。否则,有很多 MOOCs 会教授基本相同的东西。例如,麻省理工学院使用 Python 类免费在线提供其计算机科学和编程入门(它看起来超级难和有用)。
Christmas_Break == "SOP 写作时间"
我的祖父住在佛罗里达州一个僻静的公寓里,所以我和我的母亲去那里休息(哦,冠状病毒之前的日子!).一天中的大部分时间,我都蹲在这个地方的一个角落里,只是为了出去续杯咖啡或者让我妈妈看我最新的草稿。晚上,我和我的 S.O .面对面交流,让他对我粗暴一点——为了让我的 sop 可行,我流了不止一滴眼泪(还有与冒名顶替综合症相关的崩溃)。
尽管如此,我知道我在其他地方薄弱的地方,我可以通过一封写得很好的信脱颖而出。
在佛罗里达写作给了我一个阳光明媚的好地方,让我感觉超级有灵感和新鲜。如果可以的话,从一个让你开心的地方开始写作——无论是咖啡馆、有着高高的彩色玻璃窗的图书馆,还是散发着薄荷和蛾球味道的公寓(像我一样!).
研究、冲洗、重复🚿
这也意味着我学习了所有的程序,通常大约一个小时。我记下了教员、他们的专业领域以及他们教的课。在我的标准作业程序中,我写了我的兴趣以及那些教员是如何结盟的。大学不会接受他们认为不会去的人(这会降低他们在《美国新闻与世界报道》上的排名),所以尽可能具体是非常重要的。
我申请了 12 所学校,完成了一篇荣誉论文,修了两门高等数学课和一门经济学课,找到了一份工作,在最后一个学期每周教一次跆拳道。我时间紧迫,所以我会按照申请截止日期的顺序完成申请——我只是不能去想那一份申请之前或之后的申请,这确实帮助我专注于每一份申请本身。
要点:如果你时间紧迫,不要在每个申请上花费 10 个小时以上也是可以的。专注于确定 2-3 名你可以谈论的教员,一些让你兴奋的课程,以及你对这所大学的另一件事,这表明你做了功课。
研究生院的应用程序是…命运
首先,他们会问你还申请了哪些学校;这一部分要么是中性的,要么是消极的,取决于你如何管理它。我试图让每所学校看起来像我列出的那些学校中的“范围”,同时也只列出邻*和项目类型相*的学校(这是一种真正令人讨厌和不完美的艺术)。
通常,学校会要求一篇“大”的论文,然后可能会附带一些小论文。他们也可能会留下一些空间来解释你的赤字,如果你有赤字,你应该使用它(像我一样,在 Calc 1 中得了 C)。
最后,目标陈述和个人陈述可以相似。事实上,我基本上为我申请的每所学校交了同样的论文。
例如,这是我对塔夫茨工程学院的个人陈述:
[## 1 PS.pdf 塔夫茨分析公司
测量系统分析(Measurement System Analysis)
drive.google.com](https://drive.google.com/file/d/1y3riMDRtaZDG52bj6qkoQefv6wZXZXgt/view?usp=sharing)
这是我为密歇根大学写的目标声明:
[## 2um SOP.pdf
报文交换数据服务
drive.google.com](https://drive.google.com/file/d/1vpx1x1hNmyw8f1-bVxpII9b3ObwSXwjG/view?usp=sharing)
专注于一个好的,高质量的作品,然后重新加工,以适应每所大学。不要,我重复一遍,不要仅仅因为你认为你需要而写一百万篇不同的文章;首先,我没有。
“大”文章是最重要的,所以我总是确保我至少有一双(或三双)眼睛关注它。在你的时间表中,把大文章放在优先位置,把剩余的时间放在小文章上。
离别的思绪
希望这篇文章对担心申请研究生的人有所帮助。如果你对课程或者我如何帮助你进入硕士有任何问题,请在下面评论。您也可以通过我的个人网站或 Twitter 联系我。感谢阅读!
附言如果你想知道,我决定去 UVA。🧡💜

(再次 PC @我)
附加作品:
[## 选择梦想数据科学项目的 10 个技巧
提示 3:关注中位数,而不是*均数
towardsdatascience.com](/read-this-before-going-to-grad-school-for-data-science-890fd05d4127) [## 研究生论文的艺术
让我进入 12 个数据科学硕士项目的 5 个简单技巧
towardsdatascience.com](/art-of-the-graduate-school-essay-f59b14c79649) [## 加入我的介绍链接媒体-阿曼达西
加入我的推荐链接,我将免费查看您自己的 DS SOP!
lramawest.medium.com](https://amawest.medium.com/membership)
我如何使用 Python 实现可解释的电影推荐
原文:https://towardsdatascience.com/how-i-implemented-explainable-movie-recommendations-using-python-7aa42a0af023?source=collection_archive---------46-----------------------
我还测试了用户是否真的喜欢它们。这是结果。

如何在应用程序中向用户显示建议及其解释。图片作者:Ville Kuosmanen
这篇文章是我关于可解释建议系列文章的第二部分,基于我的 BSc 论文 。 第一部分 介绍了可解释建议的概念,而 第三部分 讨论了事后可解释性在数据科学中的应用。
本系列的前一篇文章讨论了为什么提高推荐系统的可解释性很重要。这不是一个教程,而是我在实现一个带有可解释推荐的电影推荐服务时所采用的方法的概述。如果你想进一步探索,你可以阅读全文或者深入前端或者后端代码库(它们是开源的!).我选择首先使用矩阵分解算法 SVD 实现一个黑盒推荐系统,然后实现两个事后解释器来生成对推荐的解释。然后通过一个模拟电影推荐服务的 web 应用程序来测试添加解释的效果。

描述用户研究中操作顺序的流程图。使用 web 应用程序,用户首先对电影进行评级。推荐系统然后为他们生成推荐,解释器为推荐生成解释,然后显示给用户。图片作者:Ville Kuosmanen
设计和实施
推荐系统是使用惊喜库用 Python 实现的。用于该问题的数据集是公开可用的 MovieLens 数据集,由真实用户的电影评级组成[1]。该数据集广泛用于推荐系统研究,由于 CF 不是特定领域的,因此模型和算法通常会推广到电影评级之外的其他领域。当开发推荐系统时,使用包含 100,000 个评级的开发数据集来减少训练时间;2000 万评级基准集用于评估和使用研究。在训练潜在因素模型之前,使用随机的 75%-25%等级训练-测试分割,将数据分割成训练和测试数据。
在训练之后,推荐系统可以用于预测训练集中的项目和用户的评级。这对于静态评估来说已经足够了:然而,使用系统进行的用户研究需要动态的推荐。为只有几个评分的新用户生成个性化推荐是不可能的:模型首先需要学习用户的潜在因素。这可以通过完全重新训练模型来完成,但是,这种方法在实时系统中是不可行的,因为针对数百万个评级训练模型在计算上是昂贵的,并且需要在每个新的评级时进行。因为现有的模型“几乎是正确的”,并且可以作为添加用户的良好起点,所以可以根据 SVD 算法的底层实现以多种方式优化该方法。例如,一些基于梯度下降的系统可以用原始模型的权重(这里是潜在因子)进行初始化,这将允许算法更快地收敛。然而,Surprise 的 SVD 在运行其梯度下降时使用固定数量的历元,并且直到所有历元都完成时才停止。因此,为 SVD 模型设计了一个新的操作,它向模型添加了一个新用户。这个操作只训练新用户的潜在因子,对于物品和其他用户的因子不变。
我选择添加的解释是基于关联规则和影响,并用 Python 实现的。关联规则解释器的实现遵循了之前提出的方法[2],旨在通过显示数据集中的规则来解释推荐,该规则描述了之前观看的电影是什么导致了它被推荐。影响解释旨在显示哪些先前观看的电影对推荐影响最大。使用的影响方法是新颖的,但它产生了与先前提出的快速影响分析相同的解释[3]。它通过比较在训练集中有和没有每个先前观看的电影的情况下推荐电影的预测评级来工作。这是通过在没有这些单独数据点的情况下反复重新训练模型来实现的。通常情况下,这将是不可能的昂贵,但由于为增加新用户而开发的优化方法,它可以有效地完成。
估价
进行了一项用户研究,以测试解释类型对推荐的测量可信度和说服力的影响,定义见[4]。为此,构建了一个模拟电影推荐服务的 web 应用程序。前端使用 React 构建,后端 REST API 使用 Flask 构建。除了提供对推荐系统和解释器的访问,API 还通过电影 DP API 加载关于真实电影的数据(例如标题、海报和年龄分级)。然后,web 服务被部署到我的大学 web 服务器上。

web 应用程序的电影分级屏幕的屏幕截图,其中有几部电影已经分级(屏幕右侧)。图片作者:Ville Kuosmanen

影响解释如何在 web 界面中呈现给用户。条形的色调显示电影的影响是积极的还是消极的,其宽度显示效果的强度。图片作者:Ville Kuosmanen

关联规则解释如何在 web 界面中呈现给用户。先行项显示在规则的左侧,而结果项显示在右侧。图片作者:Ville Kuosmanen
除了这两个解释者,用户研究还包含了一个基线解释“推荐这部电影是因为你和喜欢它的用户相似”。这项研究首先要求用户对他们过去看过的十部电影进行评级,然后向他们展示每一类的推荐和解释。41 名用户参与了这项研究,在有利于关联规则解释者的解释类型之间,在说服力(p=0.008)和信任度(p=0.001)方面观察到了统计学上的显著差异。

针对每种类型的解释,在用户研究中测量的用户评价的兴趣(黄色)和信任(灰色)的均值条形图。还显示了误差条(即 95%置信区间)。图片作者:Ville Kuosmanen
解释生成器也在各种离线实验中进行了测试。最重要的是,关联规则解释器被发现受到低模型保真度的困扰,模型保真度是衡量可以被解释的建议的份额的指标[2]。低模型保真度导致用户研究中的解释有轻微的选择偏差:关联规则解释被添加到最受欢迎的电影的推荐中(因为它们在挖掘的关联规则中最常见)。令人惊讶的是,这将导致效果的增加——一般来说,用户应该更喜欢对他们更有针对性的推荐。研究*台的“虚假”性质可能会影响这一点——受欢迎但针对性不强的内容可能代表用户事先知道的电影,可以很容易地看出他们想看,但不会在真实系统中观看。在其他实验中,用于为单个用户重新训练推荐系统的算法被示出与完全重新训练一样准确,并且由于重新训练中的随机变化,影响计算被示出遭受适度高的方差(即,相同电影的影响的多次计算会产生非常不同的结果)。
用户喜欢关联规则解释,因此它是添加到实际系统中的一个很好的候选解释。我在生成解释时使用了全局关联规则:它们的优点是挖掘规则的过程只需进行一次。关联规则挖掘中使用的 apriori 算法[5]计算量很大,尤其是对于大型数据集,这可能会在扩大基于局部或聚类的方法[2]中造成重大问题。
为了将关联规则解释应用到实际系统中,需要提高其模型的保真度。如果解释器本身被视为机器学习模型,那么支持度和置信度的阈值(以及用于过滤关联规则集的其他参数)可以被视为其超参数。虽然阈值是根据研究人员的最佳猜测手工设置的,但也可以通过超参数优化来确定。这超出了本项目的范围,但可能是一种有趣的方式,使关联规则步骤更加科学,并允许该方法更容易地应用于更多样化的数据集。
虽然用户研究没有发现添加基于影响的解释对用户评价的信任和说服力有统计学上的显著影响,但它们仍然值得进一步研究。最重要的是,可以进一步优化向用户呈现解释的方法。即使影响解释没有提高模型的可信度和说服力,但它们确实提高了透明度。它们还可以用于实现特殊的用户界面组件:例如,UI 元素可以显示受特定项目影响最大的推荐。这对于实现经典的“这个项目类似于下面的项目……”推荐系统的更个性化版本可能是有用的,推荐系统通常是基于项目的邻居模型或基于内容的模型。
这篇文章展示了我用可解释的推荐来实现和评估电影推荐服务的方法。本系列的最后一部分将描述推荐系统中的激进内容问题,并建议如何使用关联规则解释来帮助数据科学家确定他们的推荐系统是否受到它的影响。
[1]:哈珀,F. M .,&康斯坦,J. A. (2015)。电影镜头数据集:历史和背景。美国计算机学会交互式智能系统汇刊(tiis) , 5 (4),1–19。
[2]:皮克,g .,&王,J. (2018 年 7 月)。推荐系统潜在因素模型的事后可解释性。《第 24 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集》(第 2060–2069 页)。ACM。
[3]:程,魏,沈,杨,黄,李,朱,(2019 年 7 月)。通过快速影响分析将可解释性纳入潜在因素模型。在第 25 届 ACM SIGKDD 知识发现国际会议论文集&数据挖掘(第 885–893 页)。ACM。
[4]:廷塔列夫,n .,&马斯托夫,J. (2011)。设计和评估推荐系统的解释。在推荐系统手册(第 479–510 页)中。马萨诸塞州波士顿斯普林格。
[5]阿格拉瓦尔和斯里坎特(1994 年 9 月)。挖掘关联规则的快速算法。在 Proc 中。第 20 国际。糖膏剂超大型数据库,VLDB (第 1215 卷,第 487–499 页)。
我如何通过 S3 选择提高检索大数据的性能
原文:https://towardsdatascience.com/how-i-improved-performance-retrieving-big-data-with-s3-select-2bd2850bc428?source=collection_archive---------10-----------------------
理解大数据
如何使用 S3 选择有效地提取数据,以及它与亚马逊雅典娜有何不同

照片由 Pexels 的 Erkan Utu 拍摄
我最*在 S3 遇到一个功能,在处理大数据时特别有用。您可以编写一个简单的 SQL 查询来选择特定的列并筛选特定的行,以便只检索您的应用程序所需的数据。在本文中,我将演示如何使用 Python 的boto3库来实现这一点。
示例使用案例
想象以下场景:
- 你经常会得到一个大型 CSV 文件,它存储在一个 S3 桶中。该文件包括您的网上商店活跃的所有国家的营销数据。
- 然而,你有一个运行在 AWS Lambda 中的应用程序,它只需要来自某个特定国家的营销数据。
通常,您必须下载整个大文件并过滤掉应用程序中的数据。问题是你的 Lambda 函数可能没有足够的内存将这个大文件读入内存。有一些方法可以解决这个问题,比如读取和过滤块中的数据或者将函数移动到 Docker 容器,但是在这个场景中最简单和最具成本效益的解决方案是使用 S3 选择特性。这是它的工作原理。
履行
首先,由于我实际上没有任何营销数据,我们将使用来自纽约的出租车出行数据[1],我们将过滤具有未知支付类型的可疑记录,根据数据字典编码为payment_type==5。
让我们看看整个文件有多少行,相比之下,只有那些与payment_type==5。
这意味着我们只对 50 万条记录中的 12 条感兴趣。仅仅为了获得这 12 行数据而将整个数据集下载并读取到内存中是一种巨大的资源浪费!
S3-选择
为了展示 S3 选择的实际效果,我们首先将我们的大型 CSV 文件[1]上传到 S3 存储桶:
现在,我们可以使用 S3 选择来仅获取付款类型等于 5 的数据,即我们仅从 S3 检索我们感兴趣的数据 —付款类型未知的数据。最棒的是,这一切都是在一个简单的 SQL 查询中定义的:
- 在我们的查询中,我们只选择用例需要的列
- 我们只过滤
payment_type='5'—注意,在 S3,*面文件中的所有列都被认为是文本,所以一定要用引号'5'将值括起来。
在上面的代码片段中,我们必须定义InputSerialization='CSV'来指定这是我们的 S3 对象的格式。此外,我们将FileHeaderInfo设置为'Use',这确保我们可以在 S3 选择查询中使用列名。
通过使用OutputSerialization参数,我们定义我们希望我们的输出是逗号分隔的,这允许我们将结果存储在一个单独的 CSV 文件中。如果您想在 API 中使用 S3 选择,您可能更喜欢JSON格式。
一些额外的警告:
- S3 选择只返回记录,不返回列名(标题),所以在第 27 行,我确保在
query中定义的相同列也作为第一行包含在TARGET_FILE中。 - S3 选择返回一个编码字节流 [2],所以我们必须循环返回的流并解码输出:
.decode('utf-8')。
测试结果
让我们交叉检查一下TARGET_FILE ——它应该只有 12 行。
结果是:
Nr of rows: 12
ID distance tip total
0 1 9.7 0 31.80
1 1 10.0 0 30.80
2 1 0.4 0 7.80
3 1 13.6 0 40.80
4 1 0.5 0 7.80
5 1 1.7 0 11.80
6 1 6.4 0 22.80
7 1 4.0 0 16.80
8 1 1.7 0 11.30
9 1 5.6 0 22.80
10 1 7.3 0 30.42
11 1 6.7 0 24.80
S3-选择 vs 雅典娜
您可能会问:如果 S3 这么容易使用,为什么我们需要 Athena 来查询数据湖?这两者的主要区别如下:
- 雅典娜可以一次查询 多个对象,而使用 S3 选择,我们只能查询单个对象( ex。单个*面文件
- 有了 Athena,我们可以使用符合 ANSI 的 SQL 查询封装复杂的业务逻辑,而 S3 选择让您只执行基本查询,在从 S3 加载数据之前过滤掉数据。
- 雅典娜支持更多的文件格式和更多形式的文件压缩比 S3 选择。例如, S3 选择只支持 CSV、JSON 和 Parquet ,而 Athena 另外允许 TSV、ORC 文件等等。
- S3 选择仅适用于 S3 API (例如。通过使用 Python boto3 SDK),而 Athena 可以通过 JDBC 从管理控制台或 SQL 客户端直接查询。
- Athena 允许许多优化技术来获得更好的性能和成本优化,例如分区、列存储,而 S3 选择是一个非常基本的查询,除了过滤数据什么都不是。
- S3 选择可以直接查询,而雅典娜需要定义一个模式。
S3-精选的优势
简而言之,这个 API 的好处是:
- 减少 IO,从而提高性能
- 由于数据传输费用减少,降低了成本。
结论
在本文中,我们讨论了 S3 选择,它允许过滤存储在 S3 的数据。S3 选择应该只在处理单个文件时使用,并且只需要从*面文件中选择特定的列和特定的行。
如果这篇文章有帮助, 关注我 看我下一篇文章。
在下面链接的文章中,我讨论了在 S3 存储桶之间传输大量数据的各种选择。
[## 7 名工程师花了 2 天时间在 S3 存储桶之间移动数据
在两个 S3 存储桶之间传输大数据的最佳选择
medium.com](https://medium.com/better-programming/it-took-2-days-and-7-engineers-to-move-data-between-s3-buckets-d79c55b16d0)
资源:
[1] TLC 行程记录数据:https://www1 . NYC . gov/site/TLC/about/TLC-Trip-Record-Data . page
[2]boto 3 Docs:https://boto 3 . Amazon AWS . com/v1/documentation/API/latest/reference/services/S3 . html # S3。客户端.选择 _ 对象 _ 内容
[3] AWS 文档:https://Docs . AWS . Amazon . com/Amazon S3/latest/API/API _ input serialization . html和https://Docs . AWS . Amazon . com/Amazon S3/latest/API/API _ selectobject content . html
我如何在 React Native 中集成 Instagram 私有 API
原文:https://towardsdatascience.com/how-i-integrated-the-instagram-api-in-react-native-e2bd04dd3119?source=collection_archive---------20-----------------------

在 Unsplash 上 NeONBRAND 拍摄的照片
作为一名开发人员,我总是尽可能地尝试自动化任务。Instagram 就是这样一个自动化似乎很有趣的地方。我在 Github 上偶然发现了这个回购:【https://github.com/dilame/instagram-private-api。它提供了一个 NodeJS Instagram 私有 API 客户端。我用这个库在本地创建了一个新的 npm 项目,运行它,并在我的手机上打开应用程序,看看它是否会自动喜欢帖子。果然是这样!
私有 API 客户端可以让你喜欢,关注,上传,基本上你可以在原生 Instagram 应用中做的一切。我在本地成功地使用了我的脚本,我想知道是否可以在 React Native 中使用客户端。
最初的挑战
我最初的想法是尝试在 React Native 中直接导入库。这并不成功,因为该库有一些依赖项需要使用本机模块,通常称为 C++插件。
然后,我开始研究如何在 React Native 中运行 Node.js。我看到了这篇帖子,它更详细地介绍了 Node.js 移动原生模块面临的挑战。那篇文章的作者致力于创建一个修改版的 node-gyp “它能够针对正确的操作系统和 CPU 架构,并包括来自 Node.js for Mobile Apps 版本的 Node.js 头。”
使用 Node.js 库和 React Native,我成功地构建了一个应用程序,允许用户自动完成通常必须手动完成的功能。
另一种选择是将它安装在服务器上,让用户从应用程序中拨打电话。这种方法的缺点是,所有对 Instagram 的 API 调用都来自与服务器相同的 IP,这将导致服务被阻止。让电话直接来自每个用户的设备,将导致 Instagram 看到这些请求来自用户的常用 IP 地址,该服务将可以安全使用。
积分时间
我首先使用命令创建了一个新的 react-native 项目:
npx react-native init reactNativeInsta
我选择使用 React Native CLI 而不是 Expo ,因为正确运行客户端库需要本机代码。
在我的项目文件夹中,我为 React Native 安装了 Node.js 库。
npm install nodejs-mobile-react-native
你可能想看一下入门指南了解更多关于 Android & iOS 的细节。
Node.js 库包括一个 React 本机桥模块,它有助于 Node.js 代码和 React 本机代码之间的通信。该库将生成一个名为 nodejs-assets 的顶级文件夹。这个文件夹中有一个名为 nodejs-project 的子文件夹。这是安装任何节点库和编写节点代码的地方。下面是它在 VSCode 中的样子。

BUILD_NATIVE_MODULES.txt 存在,所以我可以绕过对本机模块的自动检测。这完全是可选的。
在控制台中,您可能希望导航到 nodejs-project 文件夹并安装 Instagram 私有 API 库。
npm install instagram-private-api
我安装了另外两个库,sleep-promise&blue bird。sleep-promise 用于将脚本暂停一段时间;这很重要,这样你就不会一次发出多个请求,冒着被 Instagram 屏蔽的风险。使用蓝鸟是因为它改进了。catch()函数的工作方式更像 Java 或 C#中的 catch 子句。
节点代码
对于节点代码,我要求这些库在顶部。
const sleep = require("sleep-promise");
const { IgApiClient, IgCheckpointError } = require("instagram-private-api");
const Bluebird = require("bluebird");
const rn_bridge = require("rn-bridge");
const { promises: fs } = require("fs");
let ig = new IgApiClient();
- IgApiClient —用于与 API 交互的类。
- IgCheckpointError —检查点异常类(处理检查点流)。
- rn_bridge —与 React Native 通信的桥。
- fs —访问文件系统以保存用户的状态。
为了允许用户与客户端库(节点代码)交互,我们需要添加一个函数来处理这些消息。下面的代码流通过检查来查看用户是否通过了身份验证,数据对象包括他们通过身份验证流的凭证。通过桥发送的每条消息都被序列化为 JSON。我在函数调用时解析每条消息。
- insta gram creds 的快速说明。我选择将用户/密码存储在本地存储而不是后端服务器上,以保护用户的信息。每次调用节点代码时,我都会从 localStorage 中提取凭证,并与数据对象一起发送。
要执行任何操作,我们需要添加功能来允许用户通过 Instagram 进行身份验证。我创建了一个名为 loginFlow 的函数来检查会话是否存在。我将在下面介绍如何保存和加载这个会话。
如果会话存在,我调用 loadSession 函数。这个函数从手机的文件系统中检索会话 json 文件,并恢复用户的会话。我返回用户的 id,因为我调用的一些函数需要 id 和 API 调用一起发送。
如果会话不存在,我将调用 newLogin 函数,该函数使用用户的凭证处理用户登录,并将会话存储到手机的文件系统中。
这是一个 saveSession 函数,我用它来写文件系统。
const savePath = rn_bridge.app.datadir();const saveSession = async (data) => {
*await* fs.writeFile(savePath + "/igSessionStore.json", JSON.stringify(data), "utf-8");
};
我将 datadir()存储到一个常量变量中,因为这在 iOS 和 Android 之间可能有所不同。关于这一点的更多信息可以在 Github repo 找到。
一旦用户登录,我就调用用户请求的函数。这是一个示例函数,允许用户通过标签喜欢帖子。
我保留了一个计数器来跟踪用户已经喜欢了多少帖子,并在应用内通知 toast 中将其发送给用户。mediaArray 变量调用 getMediaFromTags,它接受用户输入的要被喜欢的以逗号分隔的标签数组,并推送要被喜欢的帖子的主键。
因为数组有时由数组中的数组组成,所以我调用一个实用函数来展*数组。由于 javascript 版本会因*台而异,所以我没有使用 array.flat()。
const flatten = (arr) => {
*for* (let i = 0; i < arr.length; (Array.isArray(arr[i]) && arr.splice(i, 1, ...arr[i])) || i++) {}
*return* arr;
};
一旦我有了一个喜欢的帖子的数组,我就把这个数组发送给一个叫做 likeMedia 的函数,它为用户喜欢这个帖子。我在这里随机化了睡眠功能,以免被 Instagram 屏蔽。
在返回之前的调用是调用一个后端服务器函数,该函数跟踪用户的喜好。该应用程序保存了统计数据,并在登录后的第一个屏幕上显示出来。
React 本机代码
在 React Native 的 index.js 文件中,我从“nodejs-mobile-react-native”导入 nodejs。这允许我使用 Node.js 启动 main.js 脚本。我还添加了一个事件侦听器,它将处理从 Node.js 发送的消息。
当消息返回时,该消息是通知或错误通知;我向用户显示消息。
下面的代码展示了一个允许用户基于标签来喜欢文章的功能。每次我想向节点端发送消息时,我都从“nodejs-mobile-react-native”导入 nodejs。
因为用户输入的是逗号分隔的列表或单个值,所以我选择在将空白列表发送到节点端之前,对其进行修整并删除任何重复的内容。如果 userHashTags 为空,我会提醒用户输入一个或多个 HashTags。当用户在这个特定的屏幕上点击 submit 时,这个函数被调用。当节点代码调用 Instagram 的 API 时,我将 setLoading 设置为 true,以向用户显示一个旋转的加载指示器,并防止用户在初始调用完成之前多次调用 API。一旦节点端的 like 函数完成,它就向 React 本机端发送一条消息,事件侦听器将 loading 设置为 false,并重置一些本地状态值。
DeviceEventEmitter.addListener("changeLoading", (event) => {
setLoading(false);
setUserHashTags();
setUserLimitPost("0");
});
结论
几年前,我在谷歌的 Play Store 上推出了这款应用,并使用 NW.js 发布了桌面版。时间限制使我无法跟上与 Instagram 保持一致所需的更新,用户体验也受到了影响。希望这篇文章能帮助那些想做类似事情的人。
为了简洁起见,此处显示的一些代码示例已被修改,并且删除了一些功能,如对后端的调用。
如果你有任何问题或意见,请在下面留下!
我如何在我的数据科学项目中“发明”机器学习
原文:https://towardsdatascience.com/how-i-invented-machine-learning-in-my-data-science-side-project-ea17cafc61a5?source=collection_archive---------52-----------------------
一名计算机科学学生构建其首个数据科学项目的旅程

斯文·布兰德斯马在 Unsplash 上的照片
对于许多程序员来说,副业给生活增添了情趣。他们不仅仅是一种爱好,他们是珍贵的宝贝,花费你大量的时间和精力,但是当他们长大后,你会感到自豪。在我学习计算机科学的第二年,我准备开始一门新的课程。找到一个好的兼职项目并不容易:它应该是你感兴趣的事情,并能让你学习新技能。作为一名一级方程式赛车的粉丝,我有一个奇怪的想法——我可以用统计数据来预测未来一级方程式比赛的结果吗?这似乎是可行的(统计模型通常用于其他运动来预测结果),对学习新技能有用,最重要的是,有趣!虽然当时我没有数据科学方面的经验,但我接受了挑战,并决定从预测 f1 资格赛的结果开始。
在大多数体育项目中,历史成绩基本上是一个时间序列:与 10 年前相比,运动员未来的表现与他们过去一年的表现更加密切相关。为了对问题的时间序列性质进行建模,我决定将统计模型建立在“权力得分”系统的基础上。该模型将包括用于预测车手在资格赛中表现如何的动力得分。如果他们表现超出预期,他们的分数应该会增加,反之亦然。这类似于 Elo 评级系统,用于对各种游戏(如国际象棋)中的玩家进行排名。然而,一级方程式赛车很复杂,因为车手的表现不能完全归功于他们自己:他们为之效力的车队也扮演着重要的角色。在开发模型时,确定了三个独立的实体:驱动程序、构造器和构造器使用的引擎。该模型为驾驶员、发动机和构造者保持单独的功率分数,并且通过组合所有这些来计算预测。
然而,这又产生了另一个问题:在预测结果时,每个“组件”应该承载多大的权重?车手的分数是否应该比建造师或发动机的权重更大?首先,我根据我的领域知识手工设置权重。但后来我开始想,是否有更聪明的方法来做事情:可以用某种方法计算出最佳权重吗?为了计算最佳权重,我首先需要定义“最佳”。我决定最好的权重应该是最小化真实结果和预测结果之间的位置差异。在这个损失函数中,并不是每个位置的差异都是相等的:前 4 名资格赛选手之间的差异比垫底选手之间的差异更重要,因为我最感兴趣的是看到顶级车手的顺序是什么。定义损失函数后,运行时间序列上的统计模型计算出总体“预测得分”,该得分显示了所选权重对资格结果的预测程度。
然后手动使用损失函数来寻找给出最佳预测分数的权重。我将首先计算初始权重的分数,然后尝试单独调整它们。当分数提高时,我继续调整它们:当分数没有提高时,最初的重量被保留。这样做,直到达到一个点,改变权重不再提高分数:找到了最佳的权重!
虽然模型中的权重已经过优化,但仍有改进的余地。如前所述,该模型是通过读取和转换历史资格结果生成的。然而,有几个参数来定义这种转换是如何工作的,例如新手车手的起步动力得分,动力得分在赛季之间应该改变多少等等。这些可以被认为是模型的超参数——它们也是我的最佳猜测。我也想优化它们,但是由于超参数直接影响模型权重,手动优化这两个权重将过于复杂和耗时。显然,至少该过程的某些部分需要自动化。
至此,我在学校开始学习更多的机器学习和 AI 知识。虽然我以前知道什么是机器学习,但这个话题被神秘化为一些高度复杂的“魔法”,你至少需要一个博士学位才能想到。但随着我对它了解的越来越多,我开始认识到机器学习原理和我的统计模型之间的相似之处。最终,机器学习模型是将一组输入和模型参数(权重)映射到输出的函数。权重可以以你想要的任何方式确定(随机,手动设置,通过询问水晶球等。),但一般都是从训练数据中学习的。我手动优化模型权重的基本方法是正确的,甚至使用了类似于梯度下降的方法,这是一种常用于训练机器学习模型的算法。我的方法也教会了我选择正确的损失函数进行训练的重要性。学习的权重仅在所选损失函数的上下文中是最优的-如果损失函数无效,则学习的解决方案也无效。此外,该项目强调了数据清理和预处理步骤的重要性,这些步骤通常在 AI/ML 作业中给出的整洁数据集中缺失。
最终,机器学习模型是将一组输入和模型参数(权重)映射到输出的函数
上面描述的模型是我为项目的第一个版本构建的。从那以后,对该模型进行了重大改进,最显著的是使用梯度下降实现了模型训练的自动化。输入和权重的概念也已经正式成为一个适当的线性回归模型。尽管线性回归很简单,但它对该数据集非常有效,尤其是因为它在很大程度上避免了其他模型难以解决的过度拟合问题。该模型还使用更传统的 MAE 作为成本函数。该系统还允许超参数优化,尽管它的一部分仍然是手动完成的。由于数据的时间序列性质,系统还没有正确地将数据分成测试集和训练集。这是我希望在未来几个月内解决的问题,之后我可以再看一眼非线性模型。无论如何,预测的结果可以在线访问,尽管由于冠状病毒的爆发,尚不清楚 2020 年一级方程式赛季将于何时正式开始。
机器学习和数据科学是非常有前途的技术领域,因此难怪许多学生对学习它们感兴趣。这个项目告诉我,最好的开始方式可能不是按照一步一步的指南或课程制作标准的 ML 模型,而是在一个真实的项目和数据集上进行实验,并自己发现 ML 技术的需要。在花了几个小时手动调整我的模型的权重后,我比任何教科书都更好地理解了机器学习的目的。因此,如果你开始你的数据科学和 ML 之旅,总是问你自己为什么要使用工作流程中的每一步,如果没有它会发生什么。这样你不仅会学到要做什么,还会学到为什么要完成!
我如何在数据科学领域找到第一份工作
原文:https://towardsdatascience.com/how-i-land-my-first-job-in-data-science-e3c2d3fd3fd2?source=collection_archive---------5-----------------------

乌鲁鲁的登山者| Jun 拍摄
从微生物学博士后到数据分析师的转变
不尝试,永远不知道。
经过* 6 个月的准备和努力,它最终获得了两个数据科学领域的工作机会。回顾过去的半年(2019 年 11 月-2020 年 5 月),这是我一生中最不确定的时期之一,为了一份 3 年的博士后合同,从布里斯班搬到悉尼,决定改变职业生涯,并被 COVID 停工期所困扰。
我总共申请了 41 份工作,要么是数据分析师,要么是初级数据科学家,每个人都有一份量身定制的简历/求职信。在这些申请中,有 21 份没有回应,18 份被拒绝,2 份面试邀请最终在 4 月下旬发出。如你所见,这不是一次令人鼓舞的旅程。但是,我从黑暗隧道的另一边出来了。
在这篇文章中,我想和你分享我是如何完成从博士后研究员到数据分析师的转变的,以及我在这一路上学到的经验教训。虽然过程可能因个人情况而异,但我希望我的经历为那些早期职业研究人员(ECR)提供了一条可能的途径,尤其是那些科学领域的研究人员,他们正在寻求转变,但仍不确定如何开始。
我为什么离开学术界
不要误解我。我喜欢做研究,或者我应该说是“解决问题”。在整个研究训练中,我系统地学会了如何阅读文献、剖析问题、设计实验、检验假设、分析数据和写文章。然而,经过 3 年的博士后研究和 4 年的博士学位,我发现自己逐渐进入了一个非常特定的研究领域,这不是我所期望的。相反,我渴望为我的未来探索更多的可能性,我想利用在学术界获得的所有这些技能来解决更多的实际问题。这是驱使我离开学术界的第一个原因。
此外,学术界已经有不少关于 ECR 的讨论。在所有这些不利因素中(例如,工作不稳定、不正常的工作时间(特别是对生命科学领域的湿实验室研究人员来说)、职位空缺、发表或灭亡的困境),定期合同是一直让我紧张的一个因素。
我确实理解学术聘用制度的重要性。它旨在通过不同实验室的多轮博士后奖学金培养下一代研究人员,直到他们能够独立负责一个研究主题/领域。换句话说,ECR 不太可能在她/他的整个学术生涯中都呆在一个实验室里。然而,从现实的角度来看,在短期研究合同的情况下,包括我在内的大多数博士后甚至无法承诺抵押贷款,因为我们不知道在一份合同之后我们是否会有工作,也不知道下一份工作在哪里。当涉及到我们的伴侣或家庭时,这个问题会变得更加复杂。例如,我们可能需要与他们分开,因为他们待在位于另一个城市或国家的“著名实验室”。
这里我的目的绝不是要抹黑学术界。我想表达的观点是保持选择的开放性。在我职业生涯的这个阶段,我需要一份与我的目标最匹配的工作,并且值得放弃我在学术界多年建立的东西。
为什么选择数据科学
进入数据科学是基于两个方面的慎重考虑,技能和热情。
作为一名生物科学博士后,我一直在使用多元分析、回归、网络分析和显著性检验来分析数据。所有这些知识都可以很容易地转移到数据科学。此外,由于我通常处理的数据量很大(高通量 DNA 测序),我熟悉了 Python、R、bash 脚本和 SQL,它们也非常符合数据科学所需的工具。
除了必要的技能和科学的心态,我认为在设定职业目标时,激情是不可或缺的一部分。我们不想走出死胡同,进入另一个死胡同。因此,确定我们的激情是很重要的,这并不难。我的建议是,当我们仅仅被好奇心和做某事的兴奋感所驱使时,那就是我们的激情所在。
对我来说,我的激情是应用数据洞察来讲述故事和解决问题。我热衷于利用现代统计学和数据可视化的方法从错综复杂的数据集中提取模式。
有了上述基础,我清楚地知道数据科学将是我下一个职业目标的最佳选择。话虽如此,当时我对就业市场还没有完全准备好。我需要将我所知道的转化为更有市场价值的技能,这就导致了下面的部分。
在线学习
虽然我非常熟悉数据科学中需要的一些技能,但他们并没有连贯地学习。在分析数据时,我仍然需要谷歌搜索的帮助。这对于日常工作来说完全没问题,然而,我不想在面试时被简单的问题(例如贝叶斯定理、中心极限定理、t-test、pandas 中的groupby、SQL 中的JOIN等等)卡住。因此,有必要系统地复习这些知识。
在这里,我列出了我用于统计学、python 和 SQL 的在线课程和材料:
- 《统计与概率》(可汗学院,免费) :本课程对所有的基础统计提供了极其详细(有意重复)的讲解和练习。
- 用 Python 和 R 进行基本统计:本书以直接简洁的方式涵盖了统计学的基本思想。更重要的是,它们为统计分析提供了 Python 和 R 语言的代码。
- 【IBM 数据科学专业证书 :该项目由 9 门课程组成,为您提供就业准备技能和技术,涵盖广泛的数据科学主题,包括 Jupyter notebook、Github、Python、SQL、数据可视化和机器学习。在最后一门课程中,你将被要求完成一个数据分析项目,形成你自己的报告并在某个地方发表(这里是我的: 探索悉尼郊区开一家新餐馆 )。所有这些完成后,您将获得一份证书,可以添加到您的 Linkedin 个人资料和简历中。
- 完整的 SQL Bootcamp 2020:从零到英雄 :有很多免费的详细的 SQL 教程。我买这个课程主要是因为 1)它提供了许多数据库,我可以用它来练习 pgAdmin。2) Udemy 提供超低折扣价(~ 20 澳元)。结果证明它完全值这个价。
建筑组合
如今,简历不应该是我们展示技能和经验的唯一方式。很有可能招聘人员或将要面试我们的人想要仔细阅读我们的 Linkedin、Github、个人博客和项目网站。我认为,由于数据科学的性质,这一点对于数据科学角色来说尤其如此。我们网站上展示的所有内容都可以作为我们简历中“漂亮数字”的证据。
此外,作为一名没有任何行业/商业经验的学术界候选人,通过在线学习经历、个人项目和博客来丰富我们的投资组合是最具成本效益的方式,因此可以帮助我们在其他申请人中脱颖而出。我们的投资组合应该传递至少两个信息:1)我们对数据科学充满热情,2)我们在数据科学领域所做的事情是积极的、持久的和专业的。
以下是我丰富投资组合的步骤:
- 建立自己的博客 :这是人们了解我、我的文章和项目的主要途径。在建立和维护自己博客的过程中,我也学到了基本的网站知识,比如 HTML,CSS 和 DNS。有了个人博客,我的个人资料就可以主动提供给每一个潜在的雇主或客户,而不是被动地将简历提交给工作岗位。例如,在推出我的博客并发表了几篇技术博客后,一位来自美国的数字制作人联系我进行一个数据可视化项目(真诚感谢他的信任)。
- 撰写技术文章:作为一名潜在的数据分析师/数据科学家,清晰有效的数据沟通技巧是必须的。写技术文章是我练习这种技能的最好方法。除此之外,我写作还有另外三个原因。1)写作帮助我以清晰和有条理的方式学习。2)写作使我能够贡献我在该领域的经验、技能和知识,并获得反馈。3)写作建立自己的受众群,拓展自己的职业人脉。

一月我的媒介故事统计
- :为了让我的博客有更多的读者,我选择在媒体上发表文章,因为它有巨大的用户群。此外,Medium 为我提供了关于我的文章的详细统计数据,这些数据可以包含在我的简历中。作为一个附带的好处,加入媒体合作伙伴计划,我可以从我的每篇媒体文章中获得收入,这可以支持我在线学习的成本。

新冠肺炎全球病例监测统计
- 开发自己的项目 :作为来自学术界的考生,我们可能缺乏真实数据科学项目的实践经验,这些项目往往比我们所学的课程更重要。所以,还是从零开始开发自己的项目比较好。这样,我们将面临一系列的技术挑战,迫使我们出于需要而不仅仅是好奇心去阅读和学习更多的东西。这就是为什么我开始开发自己的项目,并在 2020 年 2 月启动了新冠肺炎全球病例监测。通过这个项目,我的数据科学技能显著提高,我比以前更有信心(这对面试真的很重要)。例如,我学会了如何从动态加载的网站上抓取网页。我使用
NumPy和Pandas的数据辩论技能显著提高。我现在很擅长在 Python 中使用破折号构建仪表板。 - 整理 Linkedin 简介 : Linkedin 是一个专业的社交网络*台,我们在寻找新工作和维护个人品牌时必须使用。这是除了个人博客之外的第二个展示门户。我用来组织 Linkedin 个人资料的一个原则是保持 Linkedin 个人资料和简历的一致性。具体来说,个人资料摘要部分是精心设计的,以反映我的激情、个性和技能。个人项目和博客已被放在主页上。在线学习证书在许可证&认证部分进行了更新。
建立工作关系网
毫无疑问,人际关系网在寻找新工作中非常重要。有意识的人际交往可以产生信息、建议和机会。作为博士后,我们可能一直呆在实验室里,只有有限的时间与研究课题之外的人交往。然而,如果我们真的想要改变,我们需要走出我们的舒适区,接触新的联系。但我们应该记住,建立关系网是一项互惠的长期投资。
以下是我的一些建议:
- ****参加合适的活动:在由数据科学悉尼主办的活动上,我遇到了 Hieu Tran ,他是一名数据分析师。我们聊得很愉快。在我们第二次叙旧时,他为我修改简历提供了很好的建议。我后来也帮他做过 Python 题。
- 向在你目标公司工作的人伸出援手:只要你把你的目的说得简明扼要,大多数人都愿意提供帮助。这就是我如何在 Linkedin 上与人联系,并认识了黄楚欣,他为我提供了关于面试的宝贵建议。
- ****联系来找我:在启动新冠肺炎全球病例监测后,我在 Linkedin 上收到了许多联系请求和电子邮件。他们要么想为开发提供帮助(非常感谢 Johannes Pistorius 在设计仪表板方面的贡献),要么只是想表达他们对这个仪表板的喜欢。我还收到了尼克·伯恩发来的信息,他友好地在仪表板上覆盖了赫罗库的费用。在知道我在找工作后,尼克·伯恩甚至把我介绍给了他网络中的人。非常感谢他为帮助我所做的努力。
- ****朋友推荐:如果你有在目标领域工作的朋友,他们应该是给你推荐的最佳人选。他们不仅比任何新关系更了解你的个性,还了解你的技能。也可以向他们寻求专业建议,没有任何社会压力。
结束语
正如你所看到的,以上所有的组成部分都是相互依赖的,这需要我们有一个全面的计划并坚持下去(就像在实验室里实施一个实验)。会有艰难和沮丧。但我们只需要不断尝试,接受失败,并做出改进,转折点终将到来。
这是所有的乡亲。和往常一样,我欢迎反馈、建设性的批评以及倾听您的数据科学项目/故事。可以通过 Linkedin 和我的网站找到我。
我是如何得到一份 6 位数的数据科学家工作的
原文:https://towardsdatascience.com/how-i-landed-a-high-6-figure-data-scientist-job-57486a9ca504?source=collection_archive---------42-----------------------
数据科学职业指南
学习这些步骤,这样你也可以!

来源:Unsplash.com(由卢克·切瑟拍摄)
你为什么要读这篇文章?
如果您对从事数据科学职业感兴趣,并且想知道如何才能找到工作。
如果你想知道一个人如何在没有太多经验的情况下获得数据科学的工作。
如果你想知道一个人如何得到一份 6 位数的数据科学工作。
这些只是你会对这篇文章感兴趣的几个原因,但不管出于什么原因,下面的内容会让你对如何获得一份 6 位数的数据科学工作有一个很好的了解。
我的背景
我目前是一名营销数据科学家。我的数据科学之旅并不典型,因为我直到大学毕业才了解这个领域。我主修数学和数量经济学,渴望以分析师的身份加入金融界,并有可能在人生的某个时刻成为一名定量分析师。我一点也不知道华尔街定量分析师的竞争有多激烈。在对股票市场进行一些预测分析研究时,我偶然发现了数据科学的想法。我在大学时学过一些统计分析课程(侧重于计量经济学/统计学),所以我一直对预测未来的能力很感兴趣。实际上,我曾经问过我的数学教授,是否有一种方法可以 100%预测一只股票的未来回报,我得到了一个有趣的回答:“那将是圣杯方程式。就像抛硬币,知道它会落在哪边一样。”我有点希望能够尽可能地预测硬币会落在哪一边,所以我继续把预测作为我的小爱好。这最终让我发现了数据科学和机器学习的世界。我花了无数个小时自学编码,做 Kaggle/DS 相关的项目(偶尔还有 NBA 黑客马拉松比赛)。几份工作之后,我得到了梦寐以求的数据科学职位,从此一往无前。
如何找到数据科学工作?
现在你对我有了一点了解,我想告诉你我是如何适应脚本/编码、统计、机器学习等的。我不会说我是该领域的完全专家,但我确实认识到,我已经实现了许多人想要复制的目标。因此,让我们深入了解帮助我进入数据科学的步骤。
1。挑选你的爱语(Python vs R)
在我们开始之前,第一步是决定你想学习哪种编程语言。在数据科学社区中,关于哪种语言更优越存在着巨大的争论,但是答案是它们都是用于特定任务的优秀语言。
稀有
如果你来自任何与社会科学相关的背景,那么在某个时候你会利用 R 进行一些分析,R 是统计学家的常用语言,因为有许多统计软件包(CRAN 软件包)。我要说的语法是为我们这些以前从未用编程语言编码的人设计的,然而,对于有其他语言经验的人来说,R 语法可能需要一点时间来适应。我从 R 开始,并且能够让自己以面向编程的思维方式思考,如果你可以称之为面向编程的思维方式的话。R 的优势在于它的灵活性和快速运行分析的能力,而不需要导入太多的包。当你进入 for 循环的时候,这种语言确实变得有点笨拙,但是对于一个初学者来说,这是很棒的!r 还有一个很棒的应用程序 RShiny,它允许部署你的代码,对于一个数据科学家来说,这是一个很好的知识。我用了下面这本数据科学的书R来学习。

R for Data Science 是一本学习如何拿起 R 并开始运行的好书
巨蟒
Python 已经成为机器学习和数据科学非常青睐的语言。它有很多机器学习包(scikit-learn ),已经变得非常流行,并且易于使用。Python 是一种多用途语言,其中 R 用于分析,Python 可用于创建 API、Web 应用程序、数据科学模型等。如果发现整个后端数据存储都是用 Python 创建的,然后再用 Python 部署,这并不疯狂。很多人发现学习 Python 要容易得多。我知道一旦我从 R 过渡到 Python,我就能相当容易地学会这门语言。如果您已经有了使用 Python 的经验,那么学习用于分析的包将会相当容易。一本让你入门的好书是 Python for Data Analysis 。

Python for Data Analysis 是一本学习 Python 中用于数据的包的好书。(来源:谷歌图片/亚马逊网站)
决定先学哪种语言,归根结底是你觉得学哪种语言最舒服。真的没有错答案。然而,你应该在职业生涯的某个时候努力成为双语者。
2.研究数据科学/机器学习算法
一旦你对编程语言感到满意,你就可以投入时间学习数据科学了。这个领域一直在变化,实时有新的发现发生,所以成为专家需要你做大量的独立研究。你不需要完全了解深度学习算法的整个后端,但你应该能够回答一些关于最流行的数据科学算法的顶级问题。一些真正帮助我学习这些概念的书籍:用 Scikit 动手机器学习——学习& TensorFlow 、数据科学家实用统计学、统计学习入门、统计学习的要素。

动手机器学习是一本开始学习机器学习模型的好书。给出了模型的详细信息以及帮助您练习的示例。(来源:我的书)

实用统计学是一本学习任何数据科学家都应该知道的所有重要统计概念的好书。用 R & Python 提供了详细的解释和示例代码。(来源:我的书)

统计学习简介是一本深入研究 r 中统计概念应用的好书。这是一本更注重教科书的书,用于研究生课程,因此将更侧重于理论和应用(来源:Google Images/Amazon.com)

统计学习的要素是一本概念/理论厚重的书,深入到数据科学中使用的许多统计/机器学习算法背后的实际数学。如果你真的想学习数学,这是一本很棒的书。请注意,这是非常沉重的概念,将需要一些阅读。(来源:我的书)
3.工程,工程,工程!
类似于软件工程,你应该建立一个项目组合,真正让你在求职中脱颖而出。一旦你完成了编码和建模,你就应该开始将你所学到的应用到数据中。找出你可能感兴趣的东西,思考你能解决的问题。在给定一组属性的情况下,您可能想要预测房子的价格,或者您可能想要根据人口统计和城市大小来预测节目的收视率。可能性是无限的!如果你想不出一个项目,你总是可以通过访问kaggle.com找到难以置信的数据集和问题来解决。这是一个学习和应用数据科学和其他统计模型的好网站。如果你足够优秀,你甚至可以因为帮助公司而获得奖金。
我做的第一个项目是利用 Twitter 的 API 创建一个情感模型。利用词袋法,我能够根据 Twitter 帖子对我感兴趣的任何关键词进行分类。这不是一个完美的项目,还有更复杂的方法可以应用,但这是我的第一个数据科学项目,它真正让我保持了动力。

这是推特情感项目的一个成果。使用 Plotly 创建的图形,我相信这里被分类的是“德雷克”。(来源:我的图)
4.迈出你的第一步
一旦以上所有的都感觉舒适,下一步,我觉得是最艰难的,是得到你的第一份数据科学工作。我可以承认,在一年的时间里,我发出了 500 多份求职申请。然而,现场面试的次数我可以用两只手来数。确保你在简历中突出了你所有的项目成就。如果你缺乏数据科学方面的经验,就把它们作为简历的重点。如果你能表现出对解决项目问题的兴趣和奉献精神,招聘经理有时会忽略你的经历。一旦你进行面试,这些也是很好的话题。这个领域竞争非常激烈,似乎每个人都想从事数据科学方面的职业。不要让那些暂时的失败阻碍你实现目标。我发现,真正让自己进入大公司的最佳方式是接受一个小公司的数据科学职位。这可能不那么有魅力,薪水也不那么有竞争力,但是一旦你迈出了第一步,你真的可以利用自己获得一个极具竞争力的职位,以及随之而来的所有福利。这是我采取的方法。我从一家小媒体代理处开始,靠杠杆作用成为一个 6 位数的角色。但是,如果你有机会直接进入大公司,权力会更大。如果有兴趣的话,我会努力整理一份数据科学的面试指南。
专攻您的数据科学
一旦你进入了这个行业,你应该开始考虑你想把数据科学工作的重点放在哪里。数据科学有许多不同的领域,有时将你的工作专门化可以在未来产生巨大的杠杆作用。不同类型划分的一些示例如下:
数据科学、产品分析 —专注于解决与产品约定和性能相关的问题。(例如脸书新闻源、Facebook Messenger 等)
营销数据科学(Marketing Science) —我目前在做什么!专注于解决营销方面的问题。生命时间价值、客户生命价值、营销组合建模和多点接触归因。
数据科学,分析——更关注事物的分析方面。度量测量。
机器学习工程师——专注于应用深度机器学习实践解决问题。
数据科学有很多不同的领域,所以开始缩小你的兴趣范围会非常有益。将在另一篇文章中解释数据科学的不同应用。
最后的话
我希望本指南能够帮助您了解如何在数据科学领域找到一份有竞争力的工作。有很多方法可以采用,但这就是我所做的,而且很成功。有时也有运气因素,在正确的时间出现在正确的地方,但这不是我们能真正量化的。如果您想了解更多,甚至想进行一对一的咨询,您可以拨打联系我。
感谢阅读:)
- 此帖子包含亚马逊的附属链接。
- 不是赞助内容。
我如何在没有硕士或博士学位的情况下找到一份数据科学的工作
原文:https://towardsdatascience.com/how-i-landed-a-job-in-data-science-without-a-masters-or-ph-d-51a25cc8b8c1?source=collection_archive---------27-----------------------
我在数据科学领域找到工作的故事
这是我在数据科学领域求职之旅的第一部分,我在这里分享我的建议。

由马库斯·斯皮斯克在 Unsplash 上拍摄的照片
你好 Medium 和 TDS 家族!
我叫 Jaemin Lee,是一名刚从数据科学专业毕业的学生。我想分享一下我是如何在没有高等学位(硕士或博士)的情况下找到数据科学领域工作的故事。
要跳过我的人生故事,请向下滚动到建议和意见部分。
如果你想看我的提示和建议的视频版本,请查看这个视频:https://youtu.be/l02DXbGszJM
我的背景
我最初是计算机科学(CS)专业的学生,直到大学三年级的第一学期。在那个学期,我进入了股票交易,我对影响股票价格的不同变量着迷。我认为建立一个预测股票价格的模型会很棒(当时我并不知道为股票建立一个预测模型是如此困难的任务)。然后我遇到了令我非常感兴趣的数据科学领域。我喜欢使用数据历史来预测、分类和分组有趣见解的想法。
有趣的是,我的大学宣布他们将在下学期为本科生开设数据科学课程,这让我很兴奋(多么完美的时机!).于是,我毫不犹豫地从 CS 专业转到了数据科学专业。通过参加数据科学相关的课程,我真正爱上了数据科学的本质。了解数学和统计学如何在机器学习和统计模型的幕后工作是很有趣的。
求职过程
2019 年 12 月开始,我开始应聘数据科学方面的工作。我意识到大多数数据科学家职位至少需要硕士学位(有些公司甚至更喜欢博士)。这有点令人失望,因为我坚信,只要一个人拥有正确的技能,学位并不重要。
我遇到了一个数据科学/体育分析 YouTuber, Ken Jee ,他已经在这个行业工作了 5 年多(他的频道与他的名字相关联),我联系了他。我分享了我对在没有高等学位的情况下找一份数据科学工作的担忧,他建议我申请数据分析师的职位。这让我印象深刻,因为大多数数据分析师角色不需要机器学习或深度学习技能等高级知识,我认为我可以利用这些技能将自己与其他候选人区分开来。
我开始申请数据分析/数据分析师的职位。幸运的是,一家公司的分析团队喜欢我的简历,他们想采访我。在面试过程中,我展示了我的机器学习技能。他们似乎喜欢我的技能,因为他们想将人工智能融入他们的工作。总共有三轮,我很幸运地得到了他们的邀请。
我相信整个面试过程帮助我成长为一个人。我从来没有时间反思自己,准备面试让我更加了解我是谁,我想做什么。
建议和意见
现实情况是,许多数据科学家仍然需要硕士或博士学位,*均至少有 5 年的工作经验。我希望这种情况在未来会有所改变,但这是当前就业市场的预期,我们需要接受这一点。如果你想在没有高等学位的情况下获得数据科学方面的工作,请查看我的建议:
- 开始学习机器学习&深度学习。如果你在本科阶段展示你的机器学习和深度学习知识,公司会印象深刻。如果你的学校提供机器学习/统计学习/深度学习课程,那么一定要选那些。如果没有,网上有大量的资源(Coursera,Udemy,YouTube ),所以只需选择一个并开始学习概念。
- 开始做项目,建立你的投资组合。我非常同意 YouTuber 数据教授 — “学习数据科学的最佳方式是做数据科学。”(也可以看看他的频道。)将数据科学付诸行动,你会获得更多的知识。通过做关于回归、分类、聚类、深度学习和 NLP 的项目来弄脏你的手,并把它们放在 GitHub 或你的个人网站上。
- 确保你的简历有说服力。一旦你理解了机器学习/深度学习的概念,并建立了自己的投资组合,就开始写简历吧。同样,查看肯·吉的 YouTube 频道和他的媒体,了解更多关于如何打造一份优秀简历的信息。
- 不要把重点放在职称上,要把重点放在工作的性质上。你想成为一名数据科学家,应该是因为你喜欢这个领域和工作,而不是因为职称(是的,我知道数据科学家是 21 世纪“最性感”的工作之一)。申请数据分析/数据分析师角色,确保在面试过程中展示你的机器学习/深度学习技能。初级数据科学家的角色也存在,但很少见到。
- 与你的网络互动(这适用于任何工作)。积极主动,通过线下和线上接触你的人际网络。请求推荐人,因为推荐人在选择候选人时发挥着巨大的作用。如果你是被你申请的公司的员工推荐的,那么你的简历会排在第一位(前提是你的简历要有说服力)。
- 了解你的简历。在面试过程中,准备好从头到尾谈论你简历上的项目。公司通常会询问整个过程——获取数据、探索性数据分析、数据清洗、模型构建和结果。提及你所面临的任何挑战,以及你是如何克服这些挑战的,这也是很好的。
感谢你阅读这篇文章!我希望它能帮助任何在数据科学领域寻求职业生涯的人。
特别感谢 Ken Jee (以及他的 YouTube 频道)和 Chanin Nantasenamat (又名。数据教授)给我灵感,让我提到你们!看看他们的 YouTube 频道和媒体。他们张贴无价的内容!
我如何在没有硕士或博士学位的情况下找到一份数据科学的工作|第二部分——经验
原文:https://towardsdatascience.com/how-i-landed-a-job-in-data-science-without-a-masters-or-ph-d-part-2-experience-9fa6591d74b7?source=collection_archive---------53-----------------------
我在数据科学领域找到工作的故事
这是系列的第二部分,我将讲述我是如何在没有实习经验的情况下在 DS 找到一份工作的。

由安妮·斯普拉特在 Unsplash 上拍摄
视频版本
介绍
你可能在想,“这家伙肯定在撒谎!没有高等学位和实习经历的人怎么可能在数据科学领域找到一份工作呢?!"
但这是真的!下面是我的故事…
申请实习
2019 年秋天,我在大学里学习了机器学习和深度学习课程。我认为我对 ML 和 DL 中的概念有很好的理解,所以在学期快结束时我开始申请实习职位。
我申请了大约 20 个职位,得到了 3 次面试机会。其中两个导致了现场面试,其中一个再也没有回复我。我多次联系招聘人员,但没有得到任何回应。
我仍然很高兴我对他们中的两个进行了现场采访。我觉得有一次现场面试还算顺利(为了便于我解释,姑且称这家公司为 A 吧)。我知道我不会从 B 公司得到这个职位,因为他们问我是否曾经部署过一个模型——我从来没有这样做过。
然而,A 公司一直没有回复我。我联系了他们无数次,但他们还是没有回应我。
所以,我最终没有得到任何实习机会。老实说,我压力很大。由于我下学期(2020 年春天)就要毕业了,我不知道我是否能够获得一份没有实习经验的全职工作。
机会依然存在…
让我们再回到 2019 年秋季学期。我收到了学校发来的电子邮件,说他们将举办一个本科生研究展。
幸运的是,有相当多的教授在寻找有机器学习经验的本科生。一位来自政治科学系的教授正在研究多国军事演习。多国军事演习是不同国家之间的联合军事行动,主要分为“作战”、“维和”和“人道主义”。
这个研究项目对我来说非常有趣,因为我在我的祖国服了两年的兵役(韩国男性必须服兵役)。所以我给了他我的简历,并向他展示了我对这个项目的兴趣。最终,我能够为他的项目工作,在这个项目中,我们使用自然语言处理对多国军事演习的类型进行分类。
然后…另一个机会向我走来。之前我提到过,我参加了一门机器学习课程,教授这门课程的教授也教授了我的大数据课程。在学期结束时,我必须在他面前做一个项目演示,演示后,他问我是否想在下一个学期做一个项目。我问他这个项目是关于什么的,他说我可以选择一些主题,我将有机会在他的研究实验室和博士生一起工作。他还提到,他们是政府资助的项目,所以我会得到报酬。
接下来的一个学期(2020 年春天),我回到他的办公室,见到了在他实验室工作的博士生。他们向我们展示了我可以从中选择的主题,我最终参与了识别事故相关推文的项目。然后,我更深入的去找事故的类型——枪击、火灾、车祸、不相关。
通过我的两个研究岗位,我了解到现实生活中的数据是如此的杂乱。在你真正开始做有趣的事情之前,你必须花很多时间收集数据并清理它们。
结束语
因此..在获得数据科学的全职职位之前,我有实习经历吗?没有。但是,在我最后一个学期,我在两个本科研究岗位上工作,在那里我可以获得实践经验。
我不是想贬低实习的重要性。实习是获得经验的好方法,你可以通过实习解决现实世界的问题。
然而,由于目前疫情的形势,许多实习机会被取消。如果你在这种情况下,我很抱歉,但这不是世界末日。归根结底,你只需要一些经验,还有其他获得经验的方法:
- 联系你的教授。大多数教授进行研究。你可以去他们的个人网站,看看他们的研究领域。如果你发现了你感兴趣的东西,不要犹豫,向他们伸出援手。大多数时候,教授们喜欢谈论他们的研究领域,他们可能会给你一个你可以做的项目。
- 利用虚拟实习机会。由于整个疫情的形势,一些公司正在提供虚拟实习机会。点击这里找到虚拟实习。数据教授 YouTuber 也浏览虚拟实习,所以一定要看看他在的视频。
- 找到自己的项目。这可能有点挑战,但绝对值得。这表明你是一个积极主动的人,你可以做任何你想做的项目。有不少网站可以找到数据集(一些有用的网站— Kaggle 、 Reddit 数据集、 UCI 机器学习库、 DataWorld 、Data.gov)。
我希望这篇文章对你有用!我将写更多关于我如何在没有硕士或博士学位的情况下找到一份数据科学的工作,敬请关注!
我如何在没有硕士或博士学位的情况下找到一份数据科学方面的工作|第三部分——简历
原文:https://towardsdatascience.com/how-i-landed-a-job-in-data-science-without-a-masters-or-ph-d-part-3-resume-85abfa002693?source=collection_archive---------62-----------------------
我在数据科学领域找到工作的故事
这是系列文章的第三部分,我将讨论如何组织你的简历。

由马库斯·温克勒在 Unsplash 上拍摄
注:本系列其他部分可以在 这里找到 。
视频版本
介绍
通常,有两个主要的地方会用到你的简历。
- 通过在线申请
- 面对面(招聘活动/招聘会,以及一旦你的简历通过自动筛选)
在这篇文章中,我将谈论你应该如何组织你的简历,你需要写些什么,这样你的简历才能通过电脑屏幕,让人们注意到。
在线简历技巧
一旦你在网上提交了简历,它就会被保存到雇主的求职者跟踪系统(ATS)中。
- 仅使用一页。如果你的工作经验少于 5 年,或者如果你申请的是初级职位,这是一条通用的经验法则。在某些情况下,如果你有 10 年以上的职业经验,并且有很多成就,这份简历可以长达 2 页。
- 一定要放公司找的关键词。 ATS 搜索与职位匹配的关键词。如果你的简历没有足够的关键词,那么你的简历很可能会被存档,永远不会到达招聘人员或招聘经理的手中(取决于招聘的人)。
- 你的简历需要具有可解析性。这意味着你要避免使用独特的字符、多列、不寻常的缩进或图像。我也建议不要用横线或横线来分隔段落。
- 提交 PDF 或 Word 文档格式的简历。我推荐使用 PDF 版本,因为它不可更改。此外,确保检查你的文件转换成 TXT 文件是否没有问题——在简历中创建奇怪的字符或丢失信息。可以用这个这样的网站。
个人简历的结构
你的简历是第一印象。招聘人员会收到大量的简历,他们没有时间仔细检查你的简历。你的简历应该在 10-20 秒内引人注目。以下是一些关于你应该如何组织你的简历以及你应该为数据科学职位写些什么的建议:
- 将你的技能放在首位。你希望审阅你简历的人首先注意到你的技能。我推荐把语言&能力(如编程语言、软件、语言技能等)、技术技能(如回归、分类、聚类、深度学习、NLP 等)、数据科学库(Scikit-learn、Numpy、Pandas、Matplotlib、Seaborn、Tensorflow、ggplots 等)
- 说出你的相关工作经历。你想按从最新到最老的顺序排列它们。如果你有工作经验,但两者没有关联,那么我建议放在你的项目下。一个简单的格式应该是这样的,“动作 X 导致结果 Y”。
- 你参与的项目。正如我上面提到的,如果你没有任何相关的工作经验,这个可以去技能部分下面。我推荐放回归,分类,聚类,深度学习/NLP,数据库(SQL)项目。我提到数据库项目是因为这表明你有基础设施方面的经验。同样,一个简单的格式是,“动作 X 导致结果 Y”。一个例子是“开发了一个程序,它能以 92%的准确率识别狗的图像。”
- 你的教育。我建议写上学校的名字,你的专业,你预计毕业的月份和年份,任何学校活动,以及相关的课程。没有必要公布你的*均绩点,但是如果你没有任何工作经验,我建议你把它公布出来,因为它反映了你的职业道德和你有多勤奋。如果你的 GPA 低于 3.0,我建议你不要考虑它。我相信 GPA 并不总是反映一个人,所以我会用一些其他的方式来展示你的性格(例如,通过项目或工作经历)。
- 关于我(可选)。我个人喜欢放一点“关于我”的版块来展现我的性格。在这一部分,你可以放任何关于你的特别之处,你热衷的事情,你的爱好等等。这也可以作为一个很好的谈话开始。
- 确保没有拼错的单词。拼错代表不注重细节。雇主不在乎你不知道如何拼写某些单词或者你打错了一个错别字。他们关心的是你忽略了一个错误。我会确保在你提交简历之前进行拼写检查,并让人校对,尤其是如果英语不是你的母语的话。
我希望这有所帮助!请继续关注该系列的下一部分!
我如何在没有硕士或博士学位的情况下找到一份数据科学方面的工作|第 4 部分—面试
原文:https://towardsdatascience.com/how-i-landed-a-job-in-data-science-without-a-masters-or-ph-d-part-4-interview-ad9edc24f93d?source=collection_archive---------43-----------------------
我在数据科学领域找到工作的故事
这是本系列的第 4 部分,我将讨论入门级数据科学职位的面试准备以及您应该具备的心态

由史蒂夫·哈拉马在 Unsplash 上拍摄的照片
视频版本
介绍
面试总是让我感到害怕。我过去常常在面试前和面试中感到非常紧张。回想起来,这完全取决于你如何对待面试。
在这篇文章中,我想谈谈以下几点:
- 如何准备技术面试
- 如何准备行为面试
- 面试前你应该有的心态
- 其他一些有用的提示
注意:这些是基于我对入门级数据科学职位的面试经验。
技术面试准备
数据科学是一个技术领域。你需要了解编程、统计和数学,并且会被问到关于这些主题的问题。
- 尽可能多做项目(特别是 SQL、Python 和/或 R)。你做的项目越多,你就会越熟悉数据科学的生命周期。通过做项目和面对问题,你需要思考如何解决问题,这将帮助你记住解决方案。
- 做好基础机器学习题的准备。您可能需要回答过度拟合和欠拟合以及如何处理它们,如何处理缺失值,学习技术之间的差异——监督、非监督、半监督和强化,不同类型的模型精度测量等。我在这里提供机器学习面试问题的网址链接:跳板,分析 Vidhya ,精英数据科学。
- 了解你的简历。准备好从头到尾谈论你在简历上列出的项目。你将被要求向面试官介绍你在处理项目时采取的每一个步骤(数据收集、数据清理、探索性数据分析、模型构建、准确性和/或模型部署)。谈论你所面临的任何挑战,你如何克服它们,以及你本可以做得更好的事情,这很好。
行为面试准备
- 研究公司。他们会问这样的问题:“你为什么想在这家公司工作?”你需要能够谈论你欣赏公司工作的哪些方面,以及为什么这对你很重要。
- 使用 Glassdoor 的面试问题。你可以在 Glassdoor 上找到一些公司问的问题,让自己熟悉他们问的问题类型。
- 展现你的性格。你的性格和行为是你融入团队和公司的有力指标。面试官是你潜在的同事或老板,所以他们想发现你的工作道德和个性。
心态
我曾经认为,如果我没有通过面试,我就不能证明自己是一个合格的候选人。我给自己的压力太大了,这让我害怕面试。
我认为重新构建面试的整体视角很重要。不要想着“我会在面试中表现得很好”,试着告诉自己“我会有一个很好的谈话,会很开心”或者“我会向他们展示我是谁,并了解面试官和公司。”这样,这不是关于你是否通过面试,而是关于你是否享受在那里的时光。你会感到压力较小,因为你的重点是享受乐趣,而不是通过它并获得职位。
即使你被拒绝了也没关系,只要你对这家公司充满了兴奋和热情。你会学到一些有价值的东西,你可以在未来的面试中使用这些经验!
其他提示
- 利用模拟面试,多做一些。通常,学校会提供模拟面试,所以我强烈建议你参加。你也可以请你的朋友或家人帮助你。
- 尝试做公司特定领域的项目。这表明你对公司所在的领域感兴趣。例如,如果你正在申请一家金融公司,并且你做了一个与金融相关的项目,那么这是一个巨大的优势。
- 要诚实。有些事情不知道也没关系。更重要的是,你是诚实的,而不是假装知道。
- 提问。这是你展示对公司真正兴趣的机会。数据科学 YouTuber 的 Ken Jee 制作了一个关于这个主题的非常有用的视频。
- 确保在面试后 24 小时内写一封感谢信。你想在面试官还记忆犹新的时候留下一个好印象。
就是这样!感谢你阅读这篇文章,希望你觉得有用。欢迎在评论区分享你的想法或面试技巧!敬请期待下一部分!
我如何在澳大利亚四大银行之一找到我的第一份数据科学工作
原文:https://towardsdatascience.com/how-i-landed-my-first-data-science-job-in-one-of-australias-big-four-banks-ede61e602c2a?source=collection_archive---------13-----------------------
我在澳大利亚刚下飞机后的旅程

vector pouch/free pik 原创作品
你也可以在这里听故事
澳大利亚的第一天
在我祖国的国际机场含泪告别后,飞往墨尔本的飞机起飞了,不久之后,透过飞机的窗户,一切看起来都变小了。最后一次俯视我的城市,我知道我即将在另一个国家开始一段新的旅程,对未来和归期都没有把握。我告诉自己,至少,我知道目的地,那时我最珍贵的财产是希望和梦想。
第二天到达墨尔本,我不得不离开过去,朋友和家人,像许多其他来澳大利亚参加 2018 年 2 月入学的学生一样开始新的生活。华丽、宁静、阳光是我第一天对墨尔本的感受。被瘦骨嶙峋的摩天大楼包围的古老建筑,反射着夕阳的上坡道路,电车的锣声和人行横道按钮的声音让我从想家的情绪中分心,让我对探索这座历史名城和它在中央商业区的秘密小巷感到兴奋。
努力找工作
在探索墨尔本的第一个星期后,我在城里我的大学旁边的一个学生宿舍安顿下来,并开始跟踪我银行账户中的数字,以计划未来几个月的租金支付。即使我有足够的钱在接下来的 12 个月里不用工作也能在墨尔本生存,看着余额每天下降也是一种真正的压力,就像倒计时直到我破产的时刻…是的,我必须找份工作。
我是一名经验丰富的自动化工程师,有 7 年多的工作经验,曾经在我的祖国为一家德国科技巨头工作。因此,我很有信心,以我的背景,我会很容易找到一份类似的工作,所以我在某些澳大利亚求职网站上创建了我的个人资料,并申请了一些相关的职位。令我震惊的是,在发出的 10 份申请中,只有 3 份得到了回复,尽管他们对我的简介印象深刻,但我对这 3 份申请的面试问题都是一样的。
问题是:“你的居留身份是什么?”
“我目前持有学生签证”,我说。
我就是这样被拒绝的。在澳大利亚,学生每周只能工作 20 个小时,这也是许多公司不愿意雇佣国际学生的原因之一。从我的角度来看,工作时间的限制并不是一件坏事,因为学生应该专注于他们的学习,从项目中受益。我几乎没见过哪个学生边工作边全职学习,还能听懂所有的课。毕竟我们来澳洲都是为了学习,提升自己,追逐梦想。如果你成功地把自己提升到了一个新的高度,金钱肯定会随之而来。
对咖啡因上瘾
然而,这一政策的不利之处在于,由于财政压力仍然存在,学生需要赚取收入来维持生活,因此他们往往会转向有现金在手的工作,这些工作有帐外工资支付和被剥削的高风险。我在大学时曾做过兼职,我想这是全世界典型的学生生活。
几周后,我在一个热门的澳大利亚兼职网站上跳转,开始搜索咖啡师的职位。在来澳大利亚之前,我完成了一个制作澳大利亚咖啡的短期课程,因为我认为万一我找不到工程方面的工作,这可能是有用的,事实也的确如此!
澳大利亚咖啡非常独特,深受澳大利亚历史和文化的影响。如果你有机会去澳大利亚旅行,当一位女士走进咖啡店说她想要一杯黑色的长咖啡时,你应该不会感到惊讶。这个“长黑”的东西绝对不是你现在所想的,相反,它是美式咖啡的澳大利亚版本(如果我这样解释,我的澳大利亚朋友会非常失望)。唯一不同的是倒咖啡和水的顺序。
回到这个故事,我很快在墨尔本西北部的郊区找到了一份咖啡师的工作,这是我在澳大利亚的第一份“工作”。这是一家繁忙的餐厅,供应披萨、咖啡和羊角面包,这是当地人的家常便饭。冲咖啡对我来说不是问题,但在一分钟内完成订单是一个真正的挑战,尤其是从上午 11 点到下午 1 点,有很多顾客走进来。与我还是大学生时相比,在办公室坐几年确实让我慢了下来。我承认我不擅长客户服务,我知道我表现不好。我每天下班后都感到压力很大,筋疲力尽,更不用说由于餐馆离市区很远,我还得长途通勤。此外,我没有时间独立学习或课前预习,这开始拉低我的分数。
我曾考虑辞职,但想到我银行账户上不断下降的数字和所有即将到来的账单,我没有足够的勇气这么做。然而,没过多久,我就收到了经理发来的消息,说“你下周不用来了”……我丢掉了第一份工作。
结束最后一天的工作回家后,我把自己锁在一个小房间里,停用所有社交媒体账户,停止与人交谈,并开始喝大量咖啡来为大学讲座补充能量。如果当时有人给我药,我早就吃了。总之,我对咖啡因上瘾了。咖啡师沉迷于咖啡并不是一件坏事,不是吗?
学期休息活动
我想,如果我这么没用,而且唯一没有人能阻止我做或者没有工作时间限制的事情是"学习"",那么我就会专注于学习、研究并把它做得非常好。否则,我还能做什么,对吗?我对技术和数据科学的热情让我忙碌了一段时间,忘记了“失业”状态以及账户余额。终于在硕士第一学期 GPA 考了个 4.0 满分的 4.0。
时光飞逝,第一学期已经过去,我已经在澳大利亚呆了几个月了。在过去的一段时间里发生了太多的事情,唯一让我振奋的是老师的鼓励,妻子的支持和学校的一封表扬信。坐在经过市中心的火车上,我希望有一天我能在这些摩天大楼之一工作。
然后学期结束了,在下学期开学前我有三周的空闲时间。我试图利用这个空档时间开始一个兼职项目,否则,我会感到无聊并面对失业的现实。我开始研究谷歌云*台,并阅读了我的第一本关于云技术的书:用 Python 编写谷歌应用引擎,作者是丹·桑德森。书中的知识使我能够建立一个自动报纸,能够从我最喜欢的页面抓取新闻,并显示在应用程序的单个首页上。这样我就可以阅读所有我喜欢的新闻,而不用浏览不同的网站。
该应用程序托管在谷歌云*台上,由包括谷歌云数据存储、谷歌云 SQL、谷歌云存储和谷歌应用引擎在内的几个云服务提供支持。当时,人们在多个媒体渠道谈论数字云,认为它是最先进的颠覆性技术,因此我非常兴奋地看到我的第一个应用在研发的三周内就运行在云上。我第一学期的假期就是这样度过的。
寻找联系
一个月后,在我的第二学期开始后,我继续发送我的简历,并收到许多来自人力资源部门的拒绝邮件。直到现在,我都不记得我当时申请了多少份工作。
然后我开始以不同的方式思考,也许我应该停止担心工作,看看硬币的另一面。我有机会学习我热爱和热爱的东西。当我一天天地学习新的东西和探索知识海洋时,我感到兴奋。这就像玩电子游戏时打开地图的隐藏区域一样。最坏的情况当游戏结束时,我仍然可以回到我的祖国,带回留学的无价之宝“知识”。至少,我有一个家可以回去。
虽然这种积极的想法并没有改变我没有工作的事实,反而让我更加开放。然后,我试着去接触新的人,不羞于谈论我的失业状态,并且接受我是一个初学者并且还在学习的事实。从那以后,我扩大了与积极思考者的关系网,他们能够用自己的积极能量激励社区。
这项任务
在第二学期,其中一门课程要求我们建立一个团队,并参加墨尔本的数据科学竞赛,作为评估的一部分。我很快与一位才华横溢的软件工程师合作,他是我几个月前认识的。他是一个经验丰富的前端开发人员,而我在云*台和机器学习作为后端服务方面有一些知识。后来又有三名学生加入,我们和其他 200 支注册队伍一起参加了墨尔本数据马拉松比赛。
所有团队都收到了超过 25 GBs 的公共交通数据,其中包含有关墨尔本乘客的车票触摸和触摸信息。我们需要从这些数据中构建一个应用程序(web 应用程序或移动应用程序),这个想法没有任何限制。这就是他们所说的端到端数据科学。我们的目标是开发一个 web 应用程序,告诉乘客他们是否应该在工作日的特定时间从目的地到目的地乘坐公共交通工具或汽车。该应用程序的后端采用了多个时间序列模型来预测未来给定时间的公共交通等待时间、出行时间和道路交通。
团队结构看起来很完美,成员拥有不同的技能:前端、后端、云基础设施、模型构建、数据处理和数据分析。然而,有一个问题:我们都是一年级学生,我们知道的唯一模型是 K-neighbors、K-Means、DBSCAN 和决策树。深度学习甚至 XGBoost 肯定不在名单上。
让我们玩大的!
成功的机会不是很高,我们都参加了比赛,只是因为这是课程要求的一部分。因此,我们很快就失去了动力,想要放弃,因为这极具挑战性,而且我们中没有人有处理如此大量数据的经验。当时我甚至不知道如何使用 Hadoop 和 Spark(一个流行的大数据*台)。我们的目标是提交项目,完成作业并通过课程。
经过一个月在数据中徘徊,什么也没做,然后我说服团队尝试一些新的东西。我决定使用谷歌云*台(GCP)来存储、处理和分析数据,然后建立模型并将其作为一种服务。云*台让我们能够轻松协作,在同一个 GCP 项目上一起工作,而不用担心计算资源或跨团队共享数据(我在下面为感兴趣的人提供了应用程序架构)。由于工作流程已经改进,我们尽了最大努力,在两个月内完成了申请,并最终提交了申请。我感到非常高兴,因为我完成了一个端到端的数据科学项目,它结合了我在过去几个月中学到的所有知识和技术。
意想不到的结果
第二学期也在我学完课程的时候过去了。我仍然没有工作,但保持积极的态度,不断结识新朋友。我的激情又一次让我忙碌起来。在等待 datathon 的结果时,我学习了 Docker 的容器化机器学习模型,Kubernetes 的容器编排。在所有的事情发生后,我开始相信生活是一面镜子,我对它的看法会反射回来。夏天开始后的几个星期,我得到了最终的结果…我们获得了二等奖。
与此同时,赞助竞赛的银行正在启动一个名为数据科学 Gig 孵化器的特殊实习生项目。他们通过比赛寻找候选人,并选择前两个团队的成员加入该计划。当第三学期开始时,我成为了 Gig 孵化器,并开始在他们位于中央商业区的一栋高楼里的办公室里工作。
一年后,我完成了硕士学位,然后被提升为银行的数据科学家。
一切都是相连的
你可能认为我很幸运,事实上,我对此毫不怀疑。然而,从一个数据科学家的角度来看,我会用“概率”这个词,而不是“幸运”。
在某个时刻,我得到数据科学的工作似乎是一个随机事件,就像中了彩票一样。然而,如果你看看所有发生事件的整个时间表,有一些因素有助于增加获得工作的概率或机会。鉴于最后一个里程碑是成为澳大利亚的数据科学家,可以看出:
- 如果 I 没来澳洲,概率是 0%
- 如果我来澳洲后没有参加比赛,概率只有 50%
- 如果我在第一学期没有学习如何使用谷歌云*台,我赢得比赛的机会将会减少。
- 如果我没有积极思考并接触社区,我就不会认识我伟大的队友,我们赢得比赛的机会也会因此而减少。
- 如果我没有探索技术并将其应用到项目中的热情,面对阻碍时更加努力,我们就不会成为赢家。
或者以复选框的形式(这很像奇异博士对某些事件发生几率的计算):

这些数字不是量化的,它们是用来帮助你理解的
我使用第一人称主语“ I ”来表达这一想法,因为这些是我们可以主动采取的行动,增加了我们想要的结果的可能性,即使总会有一些我们无法控制的外部因素,如银行的赞助或我的签证申请失败。
这里的想法是,它采取了一个旅程,导致今天的结果。换句话说,你现在做的每件事都会把你带到未来的某个地方,当你回头看的时候,你会发现这一切都是因为某些原因而发生的。如果你在漫长的旅途中感到疲惫或失去动力,试着想象你将来想成为什么样的人,就像我希望我能在城市的摩天大楼里有一份工作一样。如果你在旅途中迷失了方向,请永远记住,你的激情将是一个准确的指南针。
附录

我在 2018 年墨尔本数据大会上搭建的*台架构
我如何在 6 个月内学会 Python
原文:https://towardsdatascience.com/how-i-learn-python-in-6-months-87fbef0eceae?source=collection_archive---------1-----------------------
从一个没有编程经验的药学学生到新加坡的数据科学家。

在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
坦率地说,学习一门新语言绝非易事。对于以前没有编程或计算经验的人来说,学习像 python 这样的整个语言似乎是一项不可能的任务。然而,所有的事情都一样,没有什么是完全不可能的,除非你认为它是。在这里,我和大家分享一些我的小技巧,学习 2020 年最流行的编程语言。
心中有一个目标
没有目标的学习是你可能犯的最严重的错误之一。如果没有一个激励性的目标,你将很容易忘记你最初为什么要学习这门语言。我根据经验写了这篇文章,因为我以前曾试图学习 C 和 Java,但没有成功。两者都以失败告终,因为我不知道在哪里应用这种语言,很快就放弃了学习的想法。没有任何用例,我也无法学习这些语言的语法。
然而,当我学习 Python 时,事情就不同了。学习 python 是我学习数据科学技能并将职业生涯转向分析的计划的一部分。因此,我不是为了学习而学习 python。我需要 python 的工作知识来进行数据分析,需要了解一系列的库来开始我的项目。我学 python 有更大的目的。
设定一个最初的目标就是完成工作的一半。为你正在学习的语言找一个应用,你就离掌握它更*了一步。
资源
网上不缺资源。我唯一的建议是不要只依赖一个。利用各种可用的资源,利用不同的交付模式来增强您的学习体验。下面是我用来学习 python 的一些资源;
- Udemy
完整的 Python 训练营和 Python for Data Science 涵盖了 Python 编程的基础知识和数据科学的基本库。这些课程以视频授课的形式进行,作业是 Jupyter 笔记本。
2.交互式编码环境
在你学习数据科学的时候,Datacamp 和 Dataquest 是很好的编码*台。它们提供了一个交互式的环境,让你边走边练习,让你记住概念,熟悉编码。对于一般的 python,查看类似的交付【learnpython.org 的。编程语言类似于自然语言,练习和练习是学习的方式。
- edX
使用 python 的计算思维由 MITx 以课堂式的方式教授 Python。这是最适合你的,如果你错过了参加校内课程,因为讲座和作业是每周一次的,还有期中和期末考试。他们与其他 MOOCs 的区别在于他们给出的编程作业。这些作业是经过深思熟虑的,要求学习者编写基本算法,作为逻辑思维的一个很好的练习。
4.博客
提供学习数据科学资源的推荐或建议的博客并不少见。我最*遇到的一个这样的博客是Self learning Data Science,他们在那里积极推出帮助初学者开始数据科学学习之旅的内容。他们还以简洁明了的方式展示,以客观的方式提供他们的评论和建议。其他更著名的博客包括数据科学中心或 KDnuggets 。根据你的喜好,你可能会更喜欢一些。环顾四周,看看哪些博客适合你的学习风格。
项目
除非你应用你所学的,否则你不会知道你知道多少。Project 是评估你知识的一个很好的方式,绝对是你简历的一个很好的补充。做一个你感兴趣的项目,你可能会学到比上课更多的东西。实际应用永远是学习技能的最佳途径。
举个例子,我自己致力于将机器学习课程材料从 MatLab 翻译成 python 代码。我花了整整一个月的时间每天编写代码,搜索并掌握这门语言。我坚信这比我所学的任何课程都更有助于我掌握 python。你可以在这里阅读更多关于这个项目的信息。
开源代码库
如果你打算进入科技领域,拥有一份 GitHub 档案是必不可少的。您可以找到有用示例/起始代码,用于您想要构建的所有类型的应用程序,甚至用于有趣的项目。那么 GitHub 和学习 python 有什么关系呢?几乎一切。程序员从复制代码中学习,GitHub 就是一个伟大的代码库。从 GitHub 学习 python 有几种方法:
- 从他人处复制代码以在您的应用程序中使用
- 为他人开发您自己的包并获得反馈
- 为现有项目做贡献
这就是我如何在 6 个月内学会 python 的。你当然也能做到,请在评论区告诉我进展如何。
掌握另一种语言就拥有了第二个灵魂——查理曼
9 个月我是如何学会深度学习的
原文:https://towardsdatascience.com/how-i-learned-deep-learning-in-9-months-f5ddaefd3e3b?source=collection_archive---------59-----------------------
我的人工智能之旅与免费的 Udacity 纳米学位

在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
有这么多的资源可以教你深度学习,如果你正在阅读这篇文章,你可能会想知道你应该追求哪一个。
我写这篇文章是为了分享我参加的课程,它不仅帮助我在大约 9 个月的时间里很好地掌握了深度学习,还让我成为了一个相互帮助成长的支持社区的一部分。
我来分享一下我的故事。
学习之旅
我之前记录了我在向数据科学学习数据科学的旅程,我惊讶于它与他人的共鸣程度。很多人告诉我,他们发现我的文章很有帮助,很有启发,所以接下来,我想分享一下我在深度学习方面的旅程。有兴趣的可以看下面我之前的文章。
[## 我如何学习数据科学以及改变一切的 1 门课程
如果你不知道从哪里开始
towardsdatascience.com](/how-i-learned-data-science-and-the-1-course-that-changed-everything-16912ccbab2b)
通过学习数据科学,我接触到了机器学习,这使我对深度学习和人工智能感兴趣。然而,我不知道如何才能学会它,因为它看起来太复杂了。
大约是在去年的这个时候,我发现了 Udacity 与贝塔斯曼一起创建的奖学金,接受者可以获得免费完成深度学习、数据分析或云计算纳米学位的机会。
边注:今年的奖学金刚刚开放,可以在这里 申请 。也可以在 Udacity 的奖学金页面 查看其他可用的。
我最终申请了奖学金,被录取了,并被授予深度学习纳米学位!
我来告诉你我是怎么做到的,它是如何帮助我学习深度学习的。
奖学金申请流程
第一步是申请奖学金。你要选择你想追求的赛道(AI,数据,还是云),所以我选择了 AI 赛道。作为申请流程的一部分,您必须回答一些问题,例如:
- 背景信息(您的个人信息和期望的课程)。
- 必备知识(您的编码经验水*)。
- 你的目标(参加奖学金项目的目的以及你将如何利用新获得的技能)。
- 技术问题(取决于您选择的曲目)。
不同的奖学金申请过程可能会有所不同,但这些是我必须回答的问题。
然后 Udacity 挑选了 15000 人参加挑战课程,我是其中之一!


挑战课程
既然选择了 AI 赛道,我做的挑战课程就是 PyTorch 课程 深度学习入门 。本课程教你深度学习的基础知识,以及如何使用 PyTorch 构建自己的深度神经网络。教学大纲包括:
- 深度学习简介
- PyTorch 简介
- 使用 PyTorch 进行深度学习
- 卷积神经网络
- 风格转移
- 递归神经网络
- 自然语言分类
- 使用 PyTorch 部署
我喜欢这门课程,因为它让我从基本的 Python/数据科学技能发展到能够实现自己的人工智能代码,可以对照片进行分类,生成文本和其他很酷的东西。他们还提供了训练/运行神经网络所需的所有笔记本,这使学习变得更容易。
萧条社区
获得纳米学位需要满足两个要求。
- 完成挑战课程。
- 松散的社区参与。
完成挑战课程
第一个要求很简单。
如果你每周花几个小时学习挑战课程,你应该能够在 3.5 个月的时间内完成。更不用说什么都不评分,所以确保你已经完成课程真的是你自己的事。从技术上来说,你可以点击浏览所有的课程,而不用完成它,但是这将我们引向第二个要求。
松散社区参与
Udacity 为奖学金计划的每个项目创建了一个宽松的工作空间,并希望学生参与其中。这一要求可能是为了确保人们不只是为了完成课程而点击课程,而是真正浏览材料。
那么参与是什么意思呢?
这意味着你必须帮助其他学生,无论是在技术上还是参与社区活动。
有许多方法可以做到这一点,包括:
- 回答学生关于课程的技术问题(例如,在空闲频道回答,撰写/分享媒体文章等)。
- 创建一个网上研讨会/演示,介绍你将如何解决课程问题。
- 启动资源回答常见问题。
- 为学生设计相互了解的计划(例如,开始一个问题线索并标记他人,分享故事并鼓励他人也这样做)。
- 制定计划来帮助学生理解课程材料(例如技术挑战、学习障碍和游戏)。
- 通过在渠道中发布激励信息来鼓励他人完成课程,并庆祝他人的成功。
- 发起一个关于你感兴趣的主题的学习小组(例如,基于位置的、医学的等等),并鼓励人们开始他们的项目。
- 分享你在课程中做的笔记。
- 在 Airtable、Github 或 Google Docs 上建立一个有用资源的数据库。
- 只要能帮助别人就行!
参与并不意味着:
- 只是喜欢别人的帖子。
- 评论低质量的回答,如:“感谢分享”,或“伟大的照片”。
- 重复别人已经分享过的答案。
- 为贡献而贡献,却没有真正帮助他人。
Udacity 定期澄清该计划的参与方面,并表示如果你每天花大约 15 分钟浏览 Slack 并回答人们的问题,或发布高质量的内容,那么你应该有很好的机会获得 nanodegree。
Udacity 如何衡量您的参与度?
Udacity 不共享这些信息。
许多人假设他们有一个 Slack 扩展,可以帮助他们可视化的尖子生,但这并没有得到证实,因为这些信息并没有提供给我们。他们衡量参与程度最可能的方式是通过他们的社区经理(CM ),他们也在 Slack 工作区。这些 CM 监控着频道的日常活动,并对那些不断为社区贡献高质量内容的学生有了很好的了解。
计划创新
你可以利用一些 Udacity 创建的计划来增加你的社区参与。
学生领袖
在挑战课程开始后不久,你的 CM 将发出一个学生领袖(SL)的号召。由于 Slack 社区如此之大,CM 很难跟踪所有的事情,这就是 SL 的用武之地。每个松弛渠道将有几个 SL,他们将致力于确保渠道的意图得以实现。SL 也被期望为他们被分配到的渠道创建计划。
例如,如果你是一个技术渠道的领导者,你将帮助回答技术问题,并提出倡议来帮助学生更好地理解/学习概念。
对我来说,我被选为#Introductions 频道的 SL,所以我的团队创建了一个挑战,让学生们分享自己的个人信息,以帮助更好地了解彼此。我们还组织了一个表格来收集每个人的社交媒体页面,以便进一步联系。
你创造的计划很大程度上取决于你自己,所以要有创造性!例如,我们创建了一个所有学生的图片拼贴,这有助于灌输一种社区意识。

mosaically.com
要成为学生领袖,你必须申请并被选中。申请过程的一部分将是分享你有什么领导经验,为什么你会是一个好的领导者,并选择你的渠道偏好。
学习堵塞
学习堵塞是一个一到两天的活动,SL 和其他学生志愿者花费大量时间帮助其他人完成课程材料。实际上,有一个 SL 专门负责组织学习聚会,他们的工作是计划活动,包括招募其他人来领导/组织网络研讨会、向我提问会议(ama)以及在当天的演示。活动前也需要做大量的工作来管理物流和营销,所以有很多方法可以参与进来。
这是一个非常好的获得一些参与积分的机会!
AMA 刘宇
每周都会有一个 AMA 会议,CM 会分配一个小时的时间来回答学生的任何非技术性问题。通常这些都是在 CM 工作的营业时间内,所以可能会根据他们的时区限制谁可以参加。然而,这是一个非常简单的方法来提高你的参与度,因为通常问题都很容易回答。许多问题也是重复的,因此你可以通过创建漂亮的帖子/指南来回答这些常见问题,从而进一步提高你的社区参与度。
一些学生甚至创造了一个机器人,可以自动转录所有的问题和答案,这样错过会议的人就可以参考它。
uda city 的 60 天
Udacity 鼓励学生每天学习,并在一个特殊的#60DaysOfUdacity 频道上记录他们的工作。
您可以记录您完成了课程的哪一部分或其他编码工作,甚至添加到您日常生活的各个方面。我看到许多学生分享激励性的故事/图片,这无疑增加了他们的参与,因为它激发了更多的对话。
关于社区参与乏力的思考
尽管不得不总是在空闲时间做贡献会变得乏味(我想我在空闲时间花的时间比挑战课程还多!),它仍然是一次无价的经历。我不仅交到了现在仍保持联系的朋友,而且每个人都愿意互相帮助学习和成长,这才是真正让这段经历难忘的原因。
由于参与的要求,每个人可能都开始互相帮助,但最终,他们继续下去,因为他们真的希望看到彼此成功,达到新的高度。我认为这个社区灌输给我一种帮助他人的奉献精神。
摘要
总而言之,获得纳米学位的关键在于:
- 保持一致。
- 总是帮助别人。
就是这样!


深度学习纳米学位
在我获得深度学习纳米学位后,我有大约 6 个月的时间来完成它。
教学大纲包括:
- 神经网络
- 卷积神经网络
- 递归神经网络
- 生成对抗网络
- 部署
你会注意到,nanodegree 有许多主题与【PyTorch 深度学习入门课程相同,所以当我登录时,许多课程实际上已经完成了。
挑战课程和纳米学位的区别
项目
除了纳米学位有新的课程,主要的不同是项目和 Udacity 评论者的评价。一旦你完成了一个项目,它会得到审查,你会得到反馈,以帮助你改善它。
项目包括:
- 预测自行车共享模式
- 犬种分类器
- 生成电视脚本
- 生成面
- 部署情感分析模型
如果你从 Udacity 的 Github 页面下载了挑战课程的所有内容,你实际上就可以访问上述项目的材料。因此,即使你没有获得纳米学位,你仍然可以自己从事这个项目。
学生社区
你还可以访问 Udacity *台上的学生社区,在那里你可以与其他攻读纳米学位的人交流并提出问题。它类似于 Slack 社区,但在我看来更缺乏组织性,所以我没有使用它。
问题论坛
最后,有一个论坛,在那里你可以发布问题,并让 Udacity 的导师回答这些问题,这非常有帮助。
走向
Slack 社区在挑战课程结束几周后关闭,每个人都对此感到沮丧,但其中一名学生创建了一个新的工作空间,以便我们可以在之后继续社区并保持联系。这个新的 Slack 社区直到今天仍然很强大!因此,这提供了另一个*台,我们可以在那里获得纳米级的帮助。

新 Slack 社区
不幸的是,我不能及时完成纳米学位,因为,生活发生了,但我能够保存一些内容,以便我可以按照自己的节奏更慢地工作。我期待着尽快与大家分享更多我从 nanodegree 中学到的项目!我还打算申请即将到来的 Udacity x Bertelsmann 奖学金,所以也许我们会在那里相遇?
包扎
这是一篇相当长的文章。如果你一路走到这一步。感谢您的阅读!
我一直想写这篇文章来分享如何获得 Udacity 奖学金/免费纳米学位。我希望通过分享我的经历和我采取的步骤,它将帮助你发现你自己的学习之路。
如果您有任何问题或意见,请在下面留下您的反馈。你也可以在 Linkedin 上关注我,或者在这里与我联系。
如何在任何赛车游戏中实现你的首次车道检测
原文:https://towardsdatascience.com/how-i-learned-lane-detection-using-asphalt-8-airborne-bae4d0982134?source=collection_archive---------38-----------------------
在 Python 中使用这 5 个简单的编码步骤

图片来自 flickr 上的 bagogames
如今,ane 检测和控制已经成为许多车辆的常见功能。此外,这也是任何人朝着自动驾驶方向前进的基本起点。但对于大多数不从事自动驾驶或计算机视觉工作的人来说,从它开始可能看起来比实际情况更令人生畏。
在进行实际的车道检测时,需要进行大量的技术研究。在这种情况下,我们看到了一个实用的视角,因此任何感兴趣的人都可以毫不费力地尝试一下。该理论的详细链接仍在好奇者的相关章节中:那些不满足于实际应用并喜欢深入主题的人。
以下是您开始工作所需的一切:
- 沥青 8 空降:如果你是 Windows 10 用户,可以到 Windows 商店免费下载:https://www . Microsoft . com/en-us/p/asphalt-8-空降/9wzdncrfj12h?activetab=pivot:overviewtab
- Python 3.7:您可以安装最新版本的 Anaconda,大多数必需的包都已经捆绑好,随时可以使用。这里是下载最新版本的链接:【https://www.anaconda.com/products/individual
- OpenCV:这是一个主要针对实时计算机视觉的库。你可以在这里找到关于如何安装和使用它的文档:https://www.learnopencv.com/install-opencv3-on-windows/
既然我们需要的都有了,那就让我们切入正题吧!
第一步:找到进入游戏屏幕的方法
这个很简单。我做了一个快速的谷歌搜索,查看可以用来访问屏幕的 python 代码。这是一个非常棒的教程,我使用了其中的基本代码,并针对这个案例进行了修改:
[## 如何用 Python-HolyPython.com 捕捉你的屏幕
本 Python 教程解释了数字图像的基本原理。您将了解像素如何表示为…
holypython.com](https://holypython.com/how-to-use-imagegrab-of-cv2/)
如果我们直接运行代码,你会看到一个类似的结果,如下图所示。你会注意到颜色有点不同,屏幕速率导致一些滞后(这对于我们的目的来说是可以的)。

让我们在 OpenCV 文档的帮助下纠正颜色部分。cv2 中有一个参数使屏幕记录看起来像实际的颜色(或至少在我的视觉允许的范围内),即 COLOR_BGR2RGB,这是我在这里用于校正的颜色。还有,时间函数是用来得到屏幕速率的,大概 10 fps 左右,一点都不差!修改后的代码如下所示:
# import libraries
from PIL import ImageGrab
import cv2
import numpy as np
import time# for timing
last_time = time.time()# screen capture loop
while True:
screen = np.array(ImageGrab.grab(bbox=(0,40,800,700)))
print(f'the screen rate is {(1/(time.time()-last_time))}')
last_time = time.time()
cv2.imshow('Python Window', cv2.cvtColor(screen, \
cv2.COLOR_BGR2RGB)) if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
为了让上面的代码正确地捕获屏幕,我将游戏窗口最小化到主显示器的左上角,尺寸为 800 x 700。你可以在你的代码中适当地调整它(通过改变上面的 ImageGrab 中的 bbox ),特别是当你使用多个监视器的时候。
一旦运行此命令,您将获得如下屏幕截图:

这种截屏方法非常方便,特别是当我们需要为机器学习用例生成图像时。
现在我们可以捕捉游戏窗口,我们可以进入下一步。
步骤 2:用于边缘检测的图像处理
由于车道检测基本上是从图像中识别边缘,所以您必须处理图像以实际获得主要轮廓。计算视觉处理中最常用的方法之一是用于边缘检测的 Canny 算法。它基本上从图像中提取并保留有用的结构信息,同时大大减小了它的大小。
Open CV 有一个简洁的 Canny 边缘检测的小实现。这进一步降低了图像的复杂性,我们用三行代码就可以得到图像的边缘。
让我们使用 cv2 中的 Canny 实现创建一个小函数来处理图像。您可以通过查看文档来试验各种阈值,代码如下所示:
# canny image processing for detecting edgesdef edgeprocessed(image):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edgeprocessed_img = cv2.Canny(gray_image, \
threshold1 = 200, threshold2 = 300) return edgeprocessed_img
我们必须在图像捕捉循环中再次运行处理过的图像,因此将该循环定义为一个函数以考虑作为输入的处理更有意义。我在这里有点超前了,将它修改为以列表形式输入的通用函数,这在分析中会更有意义。
def screen_capture(processing = None):
# takes in a list for type of processing
# [processing_function, masking_function]
last_time = time.time()
while True:
screen = np.array(ImageGrab.grab(bbox=(0,40,800,700)))
count = 0
if processing is not None:
for i in processing:
count += 1
processed_screen = processing[0](screen) if count > 1:
masked_screen = processing[1] \
(processed_screen,[vertices]) screen_1 = masked_screen
else:
screen_1 = processed_screen
else:
screen_1 = screen
cv2.imshow('Python Window 2', screen_1)
cv2.imshow('Python Window', cv2.cvtColor(screen, \
cv2.COLOR_BGR2RGB))
print(f'the screen rate is {(1/(time.time()-last_time))}')
last_time = time.time()
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
现在使用该功能会好得多。在下一节中,您将会看到我为什么这样构造函数。到那时,让我们检查边缘处理的结果。
screen_capture([edgeprocessed])
这是你将会看到的:

我们几乎可以从游戏屏幕上获得物体的边缘。这是我在游戏中的测试跑道上尝试时的样子:

正如您所注意到的,图像中仍然有太多不需要的信息。树木、岩石、电线,基本上是道路地*线以上的一切。更不用说游戏本身的覆盖控件显示了。如果我们想把注意力集中在车道上,我们必须找到一种方法,以某种方式过滤掉或掩盖其余的图像线。
步骤 3:从图像中屏蔽附加信息
为此,让我们定义一个掩蔽函数。我们需要的是定义一个多边形来屏蔽图像中的所有信息,除了让我们关注车道的区域。这是一个非常基本的方法,在这种情况下,我用一点试错法定义了我需要的精确区域的顶点,如下图所示:

所需的区域函数使用一个遮罩帧和一个带顶点的多边形。蒙版和多边形的交集只给了我们所需的图像部分。函数和顶点(如上定义)如下所示:
def required_region(image, vertices):
mask = np.zeros_like(image) # black image
cv2.fillPoly(mask, vertices, 255) # fill within vertices
masked = cv2.bitwise_and(image, mask) # intersection
return maskedvertices = np.array([[120,500],[120,400],[150,330],[650,330], \
[680,400],[680,500],[260,500],[260,450], \
[325,370],[475,370],[540,450][540,500]], \
np.int32)
现在,我们也可以用这些输入运行屏幕捕获功能。
screen_capture([edgeprocessed, required_region])
并且,结果如下:

正如你现在注意到的,我已经去掉了所有不必要的信息,除了车道。对于一个基本级别的代码,我要说这是非常整洁的!
但是我们还没有完全实现。
第四步:用霍夫线寻找线条
为了找到实际的几何线,我们需要对边缘处理后的图像进行某种变换。在这种情况下,我在 Open CV 中使用了霍夫变换实现。为了正常工作,图像在作为 Hough 变换的输入之前必须被模糊一点。在这种情况下,我使用了来自 Open CV 的高斯模糊。
此外,需要在图像帧上绘制检测到的线。所以我又定义了一个函数来覆盖帧上检测到的线。
修改的覆盖线和边缘处理代码是:
def overlay_lines(image, lines):
for line in lines:
coordinates = line[0]
cv2.line(image,(coordinates[0],coordinates[1]), \
(coordinates[2],coordinates[3]),[255,255,255],3)def edgeprocessed(image):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
edgeprocessed_img = cv2.Canny(gray_image, threshold1 = 200,\
threshold2 = 300)
edgeprocessed_img = cv2.GaussianBlur(edgeprocessed_img,(5,5),0)
lines = cv2.HoughLinesP(edgeprocessed_img, 1, np.pi/180, \
180, np.array([]), 100, 5)
overlay_lines(edgeprocessed_img, lines)
return edgeprocessed_img

如您所见,这一点也不差,而且只需要几行代码!我们快到了。
第五步:获取车道
在前面的步骤中检测到了各种线条。我们必须找到一种方法,以某种方式合并它们,这样我们就可以得到实际的车道。这有点复杂,我在网上查阅了一些资源,看看是否有更简单的方法。我在 Github 项目这里中发现了一个很棒的绘制车道函数,我在这里直接使用了这个函数(代码太长,所以没有在下面添加,但是你可以参考我在 Github 中的项目笔记本,链接在最后)。所有需要做的就是修改边缘处理函数如下:
def edgeprocessed(image):
original_image = image
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
edgeprocessed_img = cv2.Canny(gray_image, threshold1 = 200, \
threshold2 = 300)
edgeprocessed_img = cv2.GaussianBlur(edgeprocessed_img,(5,5),0)
edgeprocessed_img = required_region(edgeprocessed_img, \
[vertices])
lines = cv2.HoughLinesP(edgeprocessed_img, 1, np.pi/180, 180, \
np.array([]), 100, 5)
#overlay_lines(edgeprocessed_img, lines)
m1 = 0
m2 = 0
try:
l1, l2, m1, m2 = draw_lines(original_image,lines)
cv2.line(original_image, (l1[0], l1[1]), \
(l1[2], l1[3]), [0,255,0], 30)
cv2.line(original_image, (l2[0], l2[1]), \
(l2[2], l2[3]), [0,255,0], 30)
except Exception as e:
pass try:
for coords in lines:
coords = coords[0]
try:
cv2.line(edgeprocessed_img,
(coords[0], coords[1]),
(coords[2], coords[3]), [255,0,0], 2)
except Exception as e:
print(str(e))
except Exception as e:
passreturn edgeprocessed_img,original_image, m1, m2
并相应地对捕获功能进行了一些调整:
def screen_capture(processing = None):
# takes in a list for type of processing
# [processing_function, masking_function]
last_time = time.time()
while True:
screen = np.array(ImageGrab.grab(bbox=(0,40,800,700)))
count = 0
if processing is not None:
for i in processing:
count += 1
processed_screen ,original_image, m1, m2 = \
processing[0](screen) if count > 1:
masked_screen = processing[1] \
(processed_screen,[vertices]) screen_1 = masked_screen
else:
screen_1 = processed_screen
else:
screen_1 = screen
cv2.imshow('Python Window 2', screen_1)
cv2.imshow('Python Window', cv2.cvtColor(screen, \
cv2.COLOR_BGR2RGB))
print(f'the screen rate is {(1/(time.time()-last_time))}')
last_time = time.time()
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
瞧啊。
screen_capture([edgeprocessed])

正如你所看到的,仍然有更多的调整和微调可以做。但作为入门学习项目,这是一个很棒的应用程序!
有趣的是,整个事情现场工作!您可以在运行代码的同时玩游戏和检测车道。这给了我们很多可能性,比如为 ML 保存图像,游戏控制等等。我将在以后的文章中探讨这个问题。
就这样,伙计们!我希望你在这 5 个简单的步骤中实现了车道检测。Jupyter 笔记本可以在这个 链接 中找到。
请随意使用和修改代码,如果您有任何有趣的调整、结果或想法,请告诉我。快乐学习!
我是如何教我的电脑玩 Spot it 的!使用 OpenCV 和深度学习
原文:https://towardsdatascience.com/how-i-learned-my-computer-to-play-spot-it-using-opencv-and-deep-learning-ad1f017a3ec3?source=collection_archive---------25-----------------------
一些有趣的计算机视觉和 CNN 的小数据集。

我的一个爱好是玩棋盘游戏,因为我对 CNN 有所了解,所以我决定开发一个可以在纸牌游戏中击败人类的应用程序。我想用我自己的数据集从头构建模型,看看用一个小数据集从头构建的模型性能如何。我选择从一个不太难的游戏开始, Spot it!(又名多布尔)。
在你不知道的情况下点它!然而,下面是一个简短的游戏解释:发现它!是一个简单的模式识别游戏,玩家试图找到两张卡片上显示的图像。原中的每一张卡都点它!有八种不同的符号,每张牌上的符号大小不同。任何两张牌都有一个相同的符号。如果你是第一个找到那个符号的人,你就赢得这张卡。当 55 张牌用完时,谁收集的牌最多,谁就赢。

自己试试:上面显示的卡片上的共同符号是什么?
从哪里开始?
任何数据科学问题的第一步都是收集数据。我用手机拍了几张,每张卡六张。总共有 330 张照片。其中四个如下所示。你可能会想:这足以构建一个完美的卷积神经网络吗?我会回来的!

处理图像
好了,我们有数据了,下一步是什么?为了成功,这可能是最重要的部分:处理图像。我们需要提取每张卡片上显示的符号。这里有一些困难。你可以在上面的图片中看到,一些符号可能更难提取:雪人和鬼魂(第三张图片)和冰屋(第四张图片)的颜色很浅,污渍(第二张图片)和感叹号(第四张图片)存在于多个部分。为了处理浅色符号,我们给图像增加了对比度。之后,我们调整大小并保存图像。
添加对比度
我们使用 Lab 颜色空间来增加对比度。l 代表亮度,a 是范围从绿色到品红色的颜色分量,b 是范围从蓝色到黄色的颜色分量。我们可以用 OpenCV 轻松提取这些组件:
import cv2
import imutilsimgname = 'picture1'image = cv2.imread(f’{imgname}.jpg’)
lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)

从左至右:原始图像、光分量、a 分量和 b 分量
现在,我们将对比添加到灯光部分,将这些部分合并在一起,并将图像转换回正常状态:
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
cl = clahe.apply(l)
limg = cv2.merge((cl,a,b))
final = cv2.cvtColor(limg, cv2.COLOR_LAB2BGR)

从左到右:原始图像,光组件,增加对比度,转换回 RGB
调整大小
然后我们调整大小并保存图像:
resized = cv2.resize(final, (800, 800))# save the image
cv2.imwrite(f'{imgname}processed.jpg', blurred)
搞定了。
检测卡片和符号
现在图像被处理了,我们可以从检测图像上的卡片开始。使用 OpenCV 可以找到外部轮廓。然后我们需要将图像转换为灰度,选择一个阈值(本例中为 190)来创建一个黑白图像,并找到轮廓。在代码中:
image = cv2.imread(f’{imgname}processed.jpg’)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
thresh = cv2.threshold(gray, 190, 255, cv2.THRESH_BINARY)[1]# find contours
cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)output = image.copy()# draw contours on image
for c in cnts:
cv2.drawContours(output, [c], -1, (255, 0, 0), 3)

经过处理的图像,转换为灰度,设定阈值,并带有外部轮廓
如果我们把外轮廓按面积排序,可以找到面积最大的轮廓:这就是卡片。我们可以创建一个白色背景来提取符号。
# sort by area, grab the biggest one
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[0]# create mask with the biggest contour
mask = np.zeros(gray.shape,np.uint8)
mask = cv2.drawContours(mask, [cnts], -1, 255, cv2.FILLED)# card in foreground
fg_masked = cv2.bitwise_and(image, image, mask=mask)# white background (use inverted mask)
mask = cv2.bitwise_not(mask)
bk = np.full(image.shape, 255, dtype=np.uint8)
bk_masked = cv2.bitwise_and(bk, bk, mask=mask)# combine back- and foreground
final = cv2.bitwise_or(fg_masked, bk_masked)

遮罩、背景、前景、组合
现在是符号检测时间!我们可以利用最后一幅图像再次检测外部轮廓,这些轮廓就是符号。如果我们在每个符号周围创建一个正方形,我们可以提取这个区域。代码有点长:
# just like before (with detecting the card)
gray = cv2.cvtColor(final, cv2.COLOR_RGB2GRAY)
thresh = cv2.threshold(gray, 195, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.bitwise_not(thresh)cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)
cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:10]# handle each contour
i = 0
for c in cnts:
if cv2.contourArea(c) > 1000:
# draw mask, keep contour
mask = np.zeros(gray.shape, np.uint8)
mask = cv2.drawContours(mask, [c], -1, 255, cv2.FILLED) # white background
fg_masked = cv2.bitwise_and(image, image, mask=mask)
mask = cv2.bitwise_not(mask)
bk = np.full(image.shape, 255, dtype=np.uint8)
bk_masked = cv2.bitwise_and(bk, bk, mask=mask)
finalcont = cv2.bitwise_or(fg_masked, bk_masked) # bounding rectangle around contour
output = finalcont.copy()
x,y,w,h = cv2.boundingRect(c)
# squares io rectangles
if w < h:
x += int((w-h)/2)
w = h
else:
y += int((h-w)/2)
h = w # take out the square with the symbol
roi = finalcont[y:y+h, x:x+w]
roi = cv2.resize(roi, (400,400)) # save the symbol
cv2.imwrite(f"{imgname}_icon{i}.jpg", roi)
i += 1

阈值图像、找到的轮廓、幽灵符号和心形符号(用遮罩提取的符号)
分类符号
现在到了无聊的部分!是时候对符号进行排序了。我们需要一个训练,测试和验证目录,每个目录包含 57 个目录(我们有 57 个不同的符号)。文件夹结构如下所示:
symbols
├── test
│ ├── anchor
│ ├── apple
│ │ ...
│ └── zebra
├── train
│ ├── anchor
│ ├── apple
│ │ ...
│ └── zebra
└── validation
├── anchor
├── apple
│ ...
└── zebra
将提取的符号(超过 2500 个)放入正确的目录需要一些时间!我有创建子文件夹的代码,在 GitHub 上设置测试和验证。也许下次用聚类算法排序会更好…
训练卷积神经网络
无聊的部分之后是有趣的部分。让我们建立并训练一个 CNN。你可以在这个帖子中找到关于 CNN 的信息。
模型架构
这是一个多类、单标签的分类问题。我们希望每个符号都有一个标签。这就是为什么有必要选择具有 57 个节点和分类交叉熵损失函数的最后一层激活 softmax。
最终模型的架构如下所示:
# imports
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt# layers, activation layer with 57 nodes (one for every symbol)
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(400, 400, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(256, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(256, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(57, activation='softmax'))model.compile(loss='categorical_crossentropy', optimizer=optimizers.RMSprop(lr=1e-4), metrics=['acc'])
数据扩充
为了获得更好的性能,我使用了数据增强。数据扩充是增加输入数据的数量和多样性的过程。这可以通过旋转、移动、缩放、裁剪和翻转现有图像来实现。使用 Keras 很容易执行数据扩充:
# specify the directories
train_dir = 'symbols/train'
validation_dir = 'symbols/validation'
test_dir = 'symbols/test'# data augmentation with ImageDataGenerator from Keras (only train)
train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=40, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.1, zoom_range=0.1, horizontal_flip=True, vertical_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)train_generator = train_datagen.flow_from_directory(train_dir, target_size=(400,400), batch_size=20, class_mode='categorical')
validation_generator = test_datagen.flow_from_directory(validation_dir, target_size=(400,400), batch_size=20, class_mode='categorical')
如果你想知道,一个增强的幽灵看起来像这样:

左侧为原始重影,其他图像上为增强重影
符合模型
让我们拟合模型,保存它以用于预测,并检查结果。
history = model.fit_generator(train_generator, steps_per_epoch=100, epochs=100, validation_data=validation_generator, validation_steps=50)# don't forget to save your model!
model.save('models/model.h5')

完美的预测!
结果
我训练的基线模型没有数据增加、丢失,并且层数较少。该模型给出了以下结果:

基线模型的结果
你可以清楚地看到这个模型是过度拟合。最终模型的结果(来自前面段落中的代码)要好得多。在下图中,您可以看到训练和验证集的准确性和损失。

最终模型的结果
在测试中,这个模型只犯了一个错误:它预测了一颗炸弹的下落。我决定坚持使用这个模型,在测试集上的准确率是 0.995。
预测两张卡片的共同符号
现在有可能预测两张卡片上的共同符号。我们可以使用两幅图像,分别对每幅图像进行预测,并使用交集来查看两张卡都有什么符号。这给出了三种可能性:
- 预测时出错:找不到公共符号。
- 十字路口只有一个符号(可能是错的,也可能是对的)。
- 十字路口不止一个符号。在这种情况下,我选择了概率最高的符号(两个预测的*均值)。
代码在 GitHub 上,用于预测目录 main.py 文件中两个图像的所有组合。
一些结果:

结论
这是一个完美的表演模式吗?可惜没有!当我给卡片拍新照片并让模型预测共同的符号时,它对雪人有一些问题。有时它预测一只眼睛或一只斑马是雪人!这给出了一些奇怪的结果:

雪人?在哪里?
这个模型比人类好吗?看情况:人类可以做的很完美,但是模型更快!我给计算机计时:我给它 55 副牌,并询问两张牌的每种组合的共同符号。总共有 1485 种组合。这花费了计算机不到 140 秒的时间。计算机犯了一些错误,但就速度而言,它肯定会打败任何人类!

我不认为建立一个 100%的表演模型真的很难。例如,这可以通过使用迁移学习来完成。为了理解模型在做什么,我们可以将测试图像的层可视化。下次要尝试的东西!
我希望你喜欢阅读这篇文章!❤
有关系的
[## 解决 MTV 的《非诚勿扰》:有可能永远不输吗?
爱情游戏还是逻辑游戏?
towardsdatascience.com](/solving-mtvs-are-you-the-one-is-it-possible-to-never-lose-992488277099) [## 用 120 行代码求解诺诺姆图
拼图,组合和解决方案 gif。
towardsdatascience.com](/solving-nonograms-with-120-lines-of-code-a7c6e0f627e4) [## 深度强化学习代理扮演的 Snake
犯了大错
towardsdatascience.com](/snake-played-by-a-deep-reinforcement-learning-agent-53f2c4331d36)
别忘了 订阅 如果你想在我发表新文章时收到电子邮件。
我是如何在一天内学会 Tableau 的
原文:https://towardsdatascience.com/how-i-learned-tableau-in-1-day-8db80c167f9d?source=collection_archive---------9-----------------------
从安装软件到交付仪表板

卢克·切瑟在 Unsplash 上的照片
我是一名机器学习工程师,一直依赖 Matplotlib、Seaborn 和 Plotly 来实现我所有的可视化(拜托,我们都是这样,对吧?).对我来说,冗长的 Python 代码真的很酷,但是拖放式的情节就不酷了。如果我们的任何产品需要一些经典的可视化效果,我们的 BI 团队会伸出援手。就这样两年过去了,我既没有学会 Tableau 也没有学会 PowerBI。
然而,我最终学会了 Tableau,创建了一个不错的仪表板,上面有一些业务问题的调查结果,并与利益相关者分享。这一切都发生在一天之内。
为什么
有了这次经历,我明白了有一个强烈的“为什么”是至关重要的第一步,因为它帮助我们朝着实现目标前进,不管有什么障碍。
先搞清楚自己的“为什么”。是目的,是事业,是信念,驱动着我们每一个人。
给你一点背景,我志愿参加一个伦理项目,分析新冠肺炎时期印度的家庭暴力。这是由 Omdena 主办的——这是一个我绝对喜欢的自下而上的合作人工智能*台,与 RedDot 基金会合作。在这个项目中,我们有几个团队分析不同的渠道,如社交媒体、新闻文章和政府关于印度家庭暴力的数据。
当项目接*尾声时,我们必须统一我们的建模和发现,以交付给利益相关者。最后,我们决定继续使用 Tableau,因为它提供了世界一流的交互式可视化效果,而且大多数合作者对它都很满意。但我不是;我对 Tableau 一无所知。但我不能不将数周的辛勤工作转化为真正的价值。
“为什么”因人而异。你可能想把 Tableau 武器加到你的数据科学盔甲上。或者,您可能希望能够用最少的代码生成一流的可视化效果。你梦想中的公司甚至会在你面试的时候给你布置一个场景。首先理解你的“为什么”,然后继续。
怎么做
我没有浪费时间开始。我下载了 Tableau 桌面版(注册 14 天试用)并马上安装了它。在我的机器上安装该软件有助于我在学习时动手操作。
接下来,我探索了 Tableau 初学者教程的一些选项。在花了一些时间研究之后,我发现 Tableau 的官方教程非常有用。整个入门教程有一步一步的文本形式的指导,很容易理解(是的,文本教程!) 。 这样做的好处是,它让我们在几个小时内浏览完整的教程,理解完整的工作流程,并根据需要使用它。
我跟着 freeCodeCamp 的速成班补充官方教程,大概 30 分钟。以 freeCodeCamp 的出色工作而闻名,它正如标题所声称的那样交付,并使我能够快速入门。
Tableau 速成班 freeCodeCamp
我知道我只是触及了 Tableau 所能做的表面,但是这些已经足够让我开始了。这里的关键是你要设计自己的行动计划,最适合你的,并坚持下去。看看上面我推荐的资源,但也可以随意探索其余的,选择最适合你需求的。
什么
那么我创造了什么?我的目标是了解这些年来以及印度 COVID19 封锁期间家庭暴力案件的模式。我创建了一个基本的交互式仪表板,可以快速传达这些汇总的统计数据,并让利益相关者了解印度的家庭暴力情况。

作者对交互式仪表板的快照
有一个你想要创造什么的想法是很重要的。创建出色的可视化效果,将其添加到您的数据科学产品组合中?或者你想创造一些基本的情节来传达你的发现?你(必须)决定你的“什么”
概述
能够用拖放创建经典的可视化效果也很酷。我们需要有开放的心态,并擅长根据形势需要使用最佳工具的艺术。如果你手头有几天时间,下面是我对 Tableau 的工作的回顾,分为几个步骤。
- 下载 Tableau 桌面版本(连免费公版都可以)
- 你大概有自己的数据;如果没有,浏览这些数据集并挑选一个感兴趣的。
- 写下 3 个你想分析的商业/研究问题。
- 记住这些目标,学习 Tableau
- 创建一个仪表板来分析数据并回答这些问题
- 与世界分享!(可选:在这里留下你的作品的链接,我很乐意看到并自豪地分享它。)
现在回想起来,我意识到我不仅学会了 Tableau,还学会了如何在有限的时间内完成一项任务。
提前理解“为什么”、“如何”和“是什么”,有助于你有目的地学习并创造价值。
当你读它的时候,它似乎是显而易见的,但是大多数时候,当我们试图解决现实世界的问题时,我们忘记了应用它。
谢谢你读到这里。我希望这篇文章为你增加一些价值,帮助你开始使用 Tableau。因为我在这方面是一个真正的初学者,我很乐意听到你对我可能犯的任何错误的反馈以及我如何改进。期待与您的联系!😃
如果你重视这样的文章,并想支持我成为一名作家,可以考虑注册成为一名媒体会员。每月 5 美元,你可以无限制地阅读媒体上的故事。
[## 通过我的推荐链接加入 Medium—Arunn the vapalan
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
arunnthevapalan.medium.com](https://arunnthevapalan.medium.com/membership)
我是如何学会享受 Vim 的——刻意练习和环绕。精力
原文:https://towardsdatascience.com/how-i-learned-to-enjoy-vim-e310e53e8d56?source=collection_archive---------10-----------------------
刻意的练习和环绕。vim 让我爱上了 Vim

胡安·戈麦斯在 Unsplash 上拍照
我最*开始学习 Vim,这很难,尤其是在开始的几天——我的工作效率受到了很大的打击。我几乎不能用 Visual Studio 代码编写任何代码而不感到头痛。想了解更多关于我 15 天旅程的信息,请看这篇文章:
[## 连续 15 天使用 Vim 后,我学到了什么
从 Vim noob 到业余爱好者的旅程
towardsdatascience.com](/what-ive-learned-after-using-vim-15-days-straight-ceda7e773a6d)
现在,两个星期后,我觉得使用 Vim 很舒服,并爱上了它,这要归功于许多常规的刻意练习 和 Tim Pope 的surround . Vim插件。事实上,这篇文章是用 Vim 的 Markdown 写的,我已经开始使用一个非常强大的笔记应用程序(和策略)来使用 Vim。
** [## 使用这个免费的笔记应用程序做更好的笔记,它将成为你的第二大脑
黑曜石使连接想法变得容易,并帮助你更好地思考和写作
medium.com](https://medium.com/@ausius/take-better-notes-with-this-free-note-taking-app-that-wants-to-be-your-second-brain-1a97909a677b)
这篇文章假设你已经了解了 Vim 的基础知识。我将介绍 surround.vim ,提供例子解释其工作原理,并向您展示如何有效地练习。如果你是 Vim 的新手,先看看一些为初学者写的文章(例如,这里的和这里的)。另外,看看我的帖子,告诉你如何成为一个更有生产力的程序员。
[## 使用终端多路复用器 tmux 提高编码和开发效率
简单的 tmux 命令来提高您的生产力
medium.com](https://medium.com/better-programming/code-and-develop-more-productively-with-terminal-multiplexer-tmux-eeac8763d273) [## 4 个键盘快捷键,可高效编辑文本并提高工作效率
高效地在文本中导航和移动光标
medium.com](https://medium.com/better-programming/4-keyboard-shortcuts-to-edit-text-efficiently-and-improve-productivity-66894c8d51b8) [## 在 Python 中更有效地循环的两种简单方法
使用枚举和压缩编写更好的 Python 循环
towardsdatascience.com](/two-simple-ways-to-loop-more-effectively-in-python-886526008a70)
Surround.vim
surround.vim 插件让你处理围绕的对事物,比如括号、HTML 标签和引号(文档在这里)。无论你是编码还是写作,这个插件都能让你的生活变得更加轻松。

vim 允许您添加、删除和更改成对的事物
要安装,请在终端中运行下面的四行代码。
mkdir -p ~/.vim/pack/tpope/start
cd ~/.vim/pack/tpope/start
git clone https://tpope.io/vim/surround.git
vim -u NONE -c "helptags surround/doc" -c q
学习和练习技巧
首先了解插件是如何工作的——学习如何包围(ys)删除(ds)改变 ( cs)。然后,学习指导示例,如下所示。一旦你理解了基础,立即开始在你的日常写作/编码中使用插件。
要快速提高,使用 刻意练习 :每天,找出自己的薄弱环节(例如,添加引号多个单词),通过相关的引导示例(参见下面的环绕多个单词部分),自己生成更多的示例,反复测试自己,直到你可以执行正确的动作/按键,而不必想太多。
如果你进行几天这种有意识的练习——即使每天只有几分钟——你会很快变得擅长使用 surround.vim。
包围一个单词
I am happy.
I am "happy".
解决方法:ysiw" ( ys:添加周边环境;iw:整个单词,不管光标在哪里,只要在你想要包围的单词上;":包围文本的字符)
环绕整条线
I am happy; she is sad.
(I am happy; she is sad.)
解决方法:yss) ( ys:添加周围环境;s:全线;)包围行的字符)
注意:如果您使用yss(而不是yss),将在您的文本周围添加空格:( I am happy; she is sad. )
用标签包围整行或整段
Hello World! How are you?
<p>Hello World! How are you?</p>
解决方案:yss<p> ( yss:给整条线添加环绕;<p>用标记把线围住)
注意:结束标签</p>将自动完成。非常方便!
包围多个单词
I am very very happy.
I am *very very* happy.
解决方法:ys2aw* ( ys:添加周边环境;2:包围字数,从光标下的字开始;aw:绕词;*:包围文本的字符)
用标签包围多个单词
Hello World! How are you?
<em>Hello World</em>! How are you?
解决方法:ys2aw<em>(在 2 字周围加上周边环境;记得先把光标放在Hello下面!)
包围所选文本
The solution is x + y = z. You responded wrongly.
The solution is `x + y = z`. You responded wrongly.
解决方法:将光标放在x下,然后veeeeS`` ( v:进入可视模式选择文本;eeee:按任意次数,选择想要选择的字数;S``用```包围所选文本
删除周围环境
"Hello World!"
Hello World
解决方法:ds" ( ds:删除周边;":要删除的字符;将光标放在文本区域内的任何位置)
删除周围的标签
<em><p>Hello World!</p></em>
Hello World!
解:dstdst(dst);删除周围的标签);如果安装了 repeat.vim ,就可以用.来重复,所以dst.会和dstdst一样
改变环境
"Hello World!"
*Hello World!*
解决方法:cs"* ( cs:改变周边;":现有周边;*:新周边)
更改周围的标签
<p>Hello World!</p>
<em>Hello World!</em>
解决方法:cst<em> ( cst:改变周围标签;<em>:新周边)
常见示例 1
求一组数字的*均值
3 + 2 + 5 + 7 / 4
# wrong because brackets are missing# solution
3 + 2 + 5 + 7 / 4 # place cursor under 3, then veeeeS)
(3 + 2 + 5 + 7) / 4# surround text with functions/methods when coding
(3 + 2 + 5 + 7) / 4 # yss)iprint
print((3 + 2 + 5 + 7) / 4)
常见示例 2
强调文本,有和没有 repeat.vim
Hello World.
Hello *World*.
Hello **World**.
解决方案 1(无 repeat.vim ): ysiw*lysiw移动光标到 W ( ysiw*)下后:用*将单词包围;l:再次移动光标到 W;ysiw*:用*包围单词
解决方案 2(带 repeat.vim ): ysiw*l. ( .重复ysiw*)
结论
为了有助于有意识的练习,我已经合并了上面所有的例子,所以你可以很容易地用它们来定期测试自己。对于每个示例,第一行是原始/开始文本,第二行是目标或结束状态。玩得开心,也可以查看一下文档!
# surround.vim practice# Surround
I am happy. # start
I am "happy". # goalI am happy; she is sad.
(I am happy; she is sad.)Hello World! How are you?
<p>Hello World! How are you?</p>I am very very happy.
I am *very very* happy.Hello World! How are you?
<em>Hello World</em>! How are you?The solution is x + y = z. You responded wrongly.
The solution is `x + y = z`. You responded wrongly.# Delete"Hello World!"
Hello World<em><p>Hello World!</p></em>
Hello World!# Change"Hello World!"
*Hello World!*<p>Hello World!</p>
<em>Hello World!</em># Examples
3 + 2 + 5 + 7 / 4
print((3 + 2 + 5 + 7) / 4)Hello World.
Hello **World**.
更多帖子, 订阅我的邮件列表 。**
我如何让数据影响选择
原文:https://towardsdatascience.com/how-i-let-data-influence-choices-a7a257bfa825?source=collection_archive---------69-----------------------
动手数据
利用数据和常识做出决策。

由拍摄的照片在 Unsplash
几年前,我一头扎进了“数据即服务”( data as-a-service,DaaS)领域——就像“软件即服务”,但交付的是原始或半丰富的数据。那时,我在执行深入的数据分析方面经验很少,也不太了解我们的客户角色。我带来的是解决客户问题的愿望和倾听的意愿。
我将在本文中解释的内容并不特定于 DaaS。然而,我要说的是,我专注于数据的经历促使我比其他情况下更快地理解了这些细微差别的重要性。
这是我以产品为导向的尝试,来解释我是如何看待数据并利用数据做决策的。


由 Celpax 在 Unsplash 上拍摄/由 Luke Chesser 在 Unsplash 上拍摄
做决定
人脑对这部分的理解可能比我们意识到的要好。每天,你都会根据一天中发生的外部刺激——“数据”——做出许多决定。不幸的是,在记录、证明和验证您的决策的企业环境中,您需要理解并向您的利益相关者阐明这个过程。
*年来,数据的重要性和丰富性变得更加明显,以至于数据被称为“新石油”。数据是一种原始资源,如果利用得当,可以帮助您生产出更好的成品。为了实现这一结果,我将介绍两个版本的数据影响决策(我相信还有更多,请随意分享)。
基于数据的决策
基于数据的决策为您提供了灵活性,不仅包括定量分析,还鼓励您包括定性分析。我经常发现自己处于产品开发的十字路口,在这种情况下,选择追求哪种功能/增强功能/新产品时,我所拥有的帮助我做出决定的硬数字和洞察力并不支持。
然而,每枚硬币都有两面,重要的是不要只见树木不见森林——我敢说,也许我们已经采访了愿意承诺购买这种新产品的客户或愿意续订的现有客户。如果我们增加了一项新功能,增加了他们对我们产品的投资回报,就要坚持追加销售。
数据驱动的决策
简而言之,数据驱动决策是指让数据为您驱动决策。在做出数据驱动的决策时,您依赖定量结果来确定手头问题的最佳解决方案。在这种情况下,假设我已经推出了一个新的特性版本,并将其推广到我们 20%的用户群。在我们运行和测试这一功能的过程中,我们看到了每用户*均收入的显著增长。数字不会说谎,证明这种增强似乎是显而易见的。

亚历山大·辛恩在 Unsplash 上的照片
你如何决定?
事实证明,数据有利于决策,因为它是有效的!通常最好不要用心去决定。
这很难。
根据我在这里给出的基本定义和例子,你可能会认为调用基于数据的决策方法成为你想要做出的不一定与数字一致的任何决策的理由。需要记住的重要一点是,即使你选择执行决策并调整结果,决策也应该基于数据。以数据为基础至少会帮助你克服你自己的偏见,这种偏见有时是不可避免的。
关于比我聪明的人如何做决定,还有很多更深入的讨论——就在媒体上,比如凯西·科济尔科夫 ( 决策智能介绍)的这篇关于决策智能的文章。
决策智能是一门的新学科与选项选择的所有方面有关。它将最好的应用数据科学、社会科学和管理科学汇集到一个统一的领域,帮助人们使用数据改善他们的生活、业务和周围的世界。
决策智能通过认识到数据驱动的决策的局限性,确保您在利用数据为您的业务做出最佳决策时不遗余力,从而帮助照亮了基于数据的决策等方法。
这篇文章并不全面,我很乐意听到您对未来主题的意见或建议。欢迎在评论中分享。
关于我
我致力于解决问题、推动卓越运营和推出产品。作为一名专注于 DaaS 的产品经理,我还为致力于通过专注于产品的增长和数据价值实现价值最大化的组织提供咨询。伸出手来继续对话或一起工作。
我如何在 8 个月内提升我的数据科学技能
原文:https://towardsdatascience.com/how-i-levelled-up-my-data-science-skills-in-8-months-fae7897965ec?source=collection_archive---------4-----------------------

照片由免费龙珠 Z 壁纸 6663 在 Eskipaper
介绍
2020 年 3 月,我接到一个电话,通知我将暂时休假,直到另行通知——非正式的意思是我将获得学习报酬。我知道休假期结束后我被解雇的可能性很高,因为没有我正在积极参与的项目。
尽管我在工作中没有做过太多与数据相关的工作,但是不能用数据做任何有意义的工作的想法困扰着我。尽管如此,我觉得关于我下一步可能做什么,我的选择是有限的,因为我在工作中没有获得太多的实践经验。不要误解我,我曾以实习生的身份工作过,但在我的时间里,我没有做任何事情来显著地(或甚至轻微地)改善业务(至少在我看来)。我处在一个非常低的位置,缺乏自信,怀疑自己的技能…对我来说,休假不能来得更快。
我做出的第一个变革性决定是致力于成为一名经得起未来考验的不可或缺的数据科学家。
当你承诺做某事时,一种来自内心的力量驱使着你。我每天醒来都会想,我今天一定要比昨天更好,这就是我的动力。然而,在这篇文章中,我将分享我在休假期间做的三件事,以确保我更接*我的目标。
教育

由斯坦尼斯拉夫·康德拉蒂耶夫在 Unsplash 上拍摄的照片
当涉及到解释机器学习中的理论概念时,我感到很舒服,但我并不满意。
每当我在 Kaggle 上查看人们在使用什么解决方案时,我总是会看到某种形式的助推、打包或深度学习。我对此有很好的理解,但深度学习对我来说是一个禁区。正是当我意识到这一点时,我决定报名参加 Coursera 上的深度学习专业。
[## 深度学习
从 deeplearning.ai 学习深度学习,如果你想打入人工智能(ai),这个专精…
www.coursera.org](https://www.coursera.org/specializations/deep-learning)
在这个课程中,我学习了许多基本的深度学习架构和技术,以改进深度学习模型。
编程;编排
我在编程方面已经相当不错了,但每当我听播客讲述人们如何在这个领域建立自己的事业时,有一件事总是让我印象深刻。
多此一举有利于深入了解!
我从未从头开始编写过机器学习算法,这让我怀疑自己是否真的知道发生了什么。
因此,我给自己设定了一个挑战,从零开始编写许多最流行的机器学习算法——对于那些长期关注我的帖子的人来说,你会知道这是从零开始的算法系列。
[## 从零开始的算法——走向数据科学
阅读《走向数据科学》中关于算法的文章。分享概念、想法和…
towardsdatascience.com](https://towardsdatascience.com/tagged/algorithms-from-scratch)
此外,我认为有必要提高我在关键数据科学框架方面的技能,如 NumPy 和 Pandas,因此我还创建了 PyTrix 系列。
[## Pytrix 系列-走向数据科学
阅读《走向数据科学》中关于 Pytrix 系列的文章。共享概念、想法和代码的媒体出版物。
towardsdatascience.com](https://towardsdatascience.com/tagged/Pytrix-series)
博客
我决定把我发帖的频率从每周一次增加到每周三次。这种变化迫使我做了两件对我的成长至关重要的事情:
- 不断学习
- 简化并交流我学到的东西
作为一名数据科学家,不断学习势在必行。我们都知道技术发展的速度有多快,所以为了保持锋利,我们必须磨快我们的斧头。然而,当你学习一个新的话题,并打算向其他人重复这一信息时,尽管我没有做过这方面的研究,但我发现我吸收信息的方式有所不同——我更深入地思考我正在学习的内容,并试图在脑海中描绘出它,这一切都有助于使学习成为一个无缝的过程。
最好的数据科学家并不是最聪明的。
大多数 MOOCs 都不教授软技能,你必须走出去自己学习。
成为一名数据科学家的要求,如知道如何编程、统计、线性代数、微积分和其他关键数据概念,往往会消耗有抱负的数据科学家如此之多,以至于很容易忘记作为一名数据科学家最重要的部分…能够理解业务想要实现什么,然后使用数据来增加价值。
换句话说,一名优秀的数据科学家知道很多技术概念,但他们与伟大的数据科学家的区别在于,他们能够接受一个技术概念,然后以一种包容团队所有成员的方式进行简化和交流,而不管他们的技术水*如何。
“如果你不能简单地解释它,那你就不够了解它”
建立工作关系网
在我个人看来,每个数据科学家都是一个个人品牌。维基百科对企业家精神的定义是创造或提取价值——实际上,这是数据科学家的本质。
人们通常只在他们认为是时候获得数据科学职位时才开始社交,我认为这完全是胡说八道。
在你需要之前建立你的关系网。
在过去的 8 个月里,建立数据科学网络帮助我提高了 5 个方面:
- 援助
有些人在生活中走在你的前面,我个人认为宇宙允许我们与这些人相遇,所以他们可以指引你。让我们面对现实吧,在你的数据科学职业生涯中,你将需要寻求帮助!
- 营销
一个强大的网络是一个伟大的思想试验场。我在我的 LinkedIn 上进行了许多民意调查,它为我提供了即时反馈。此外,你可以获得个人推荐。就目前的情况来看,我从来没有申请过工作,因为我一直都知道口碑的力量,而且我在很多场合都利用了它——不管是哪个领域。
- 向他人学习
你不可能知道数据科学(或一般生活)的一切,拥有一个多样化的人际网络会让你接触到新事物。经验不重要,如果你有一个构建良好的网络,你会学到新的东西。
- 交朋友
如果你问和我一起长大的人什么是人工智能,他们可能会回答来自黑镜的东西。在这个领域没有朋友可能会很孤独,因为肯定会有你感到疲惫、没有动力的时候,而且你的非数据科学朋友可能无法理解你。与其他数据科学家交流可以让你意识到,你并不是世界上唯一一个面临特定挑战的人,当我情绪低落时,这肯定会让我振作起来。
- 人们知道你能提供什么
维系任何关系的胶水附着在每个人带来的东西的两面,就是这样。如果人们知道你是做什么的,把你介绍给别人会容易得多——这就是我如何在 8 月份找到一份自由职业的。
包裹
需要注意的一个关键点是,我已经接触了很多这个领域,这让我能够像现在这样进步;我要说,我所做的改变我职业轨迹的最重要的事情就是承诺。承诺是一个长期的决定,每天提升自己只掌握在你手中。对你的职业负责,是发展你自己的开始。虽然我离我想要的数据科学职业还差得很远,但我比昨天更*了,比 8 个月前更*了。
让我们继续 LinkedIn 上的对话…
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
我如何让 ChromeBook 成为我的数据科学日常驱动程序
原文:https://towardsdatascience.com/how-i-made-a-chromebook-my-data-science-daily-driver-af273ee47828?source=collection_archive---------13-----------------------
在 ChromeOS 中利用 Linux 和 android 应用

获得 Chromebook
*年来,hromeOS 已经取得了长足的进步,已经成为购买运行 Windows 10 的传统、笨重、昂贵的笔记本电脑的更可行的选择。最*,Chromebooks 获得了从谷歌 Play 商店安装和使用安卓应用的权限。对于充分优化的应用程序来说,这可能非常棒;获得全屏、完全正常的 android 应用程序体验,就好像你在使用一个带有专用键盘的苹果 IPad 一样。正如你可能想象的那样,这些应用程序运行得相当好。Chromebook 处理器在很大程度上是标准 Android 手机处理器的强大竞争者,并且具有相同的基础架构 ARM64。
但是有了笔记本电脑,有很多需要做的事情是 app 做不到的。幸运的是,谷歌偏离 Linux 太远的问题已经在某种程度上得到解决,现在允许从基于 Debian 的仓库安装 Linux 应用程序。所以现在在 ChromeOS 中,我们可以兼容 Debian 仓库中的 ARM64 应用程序,以及 android 应用程序。
所以在寻找我的 Chromebook 时,这两个是我的大要求。笔记本电脑需要有 aptitude 包管理器(我每天使用的包管理器),可能还需要能够运行 Android 应用程序。这两大功能只是 ChromeOS 最初自带的功能之外的功能。ChromeOS 的用户界面不是我最喜欢的,但绝对干净、漂亮、可用。

我的衣柜里放着大约 20 台不同时代的 Lenovo,Thinkpads,Yogas,所以显然当我在网上看到一台标价 30 美元的联想 C330 Chromebook 时,我抓住了这个机会。我不仅可以摆弄 Chromebook,还可以增加我的联想收藏!
联想 C330 是一款很棒的预算 Chromebook,虽然是 ABS 塑料,但是手感比较扎实。键盘还好,有点黏糊糊的,触控板很适合这个系统。这是一款敞篷车,就像我的 Yoga 910 一样,但可能是由于边框、尺寸和 Android 应用程序兼容性的原因,我实际上最终会在*板模式下使用笔记本电脑,而我的 Yoga 910 就不是这样了。此外,我讨厌这样说,但 USB-C/Thunderbolt-3 充电对我来说绝对是一个巨大的优势,因为我喜欢使用
一根电缆代表一切
我为什么想要 Chromebook
首先,应该指出的是,我是一个电脑收藏家和电脑狂热者。增加我的收藏总是一件很棒的事情。除此之外,我还是一个超级 Unix 迷和发行版迷。简而言之,我想要一个新的玩具来玩,但使用 Chromebook 也有一些关键的好处,这些好处是 Chromebook 名称中的主要部分。
电池寿命是许多 Chromebook 的重点,谷歌经常在 chrome book 广告中专门针对电池寿命。我选择的 Chromebook 充电速度很快,*均续航时间约为 10 小时。当然,这有一点不同,但与我目前的日常驱动程序相比,它通常会加倍运行时间。
此外,我使用很多 Google Play 服务,因为我也是安卓用户。Google Play 音乐,Google Play 电影,便利是肯定存在的,因为在我的日常驱动程序上,我无法从 Google Play 下载任何东西。
设置

开箱即用,谷歌已经在吹嘘他们的低级 API 和兼容层,要求你在谷歌账户上安装的 Android 应用程序安装到你的 Chromebook 上。在这些应用中,我选择了 Slack 和 Zoom,这两个应用是我每天经常使用的。这两个应用程序都可以在 Chromebook 上完美使用,所以幸运的是,看起来我们不需要更换它们中的任何一个。除了这些推荐的应用程序之外,第一个设置会将一个名为“Linux 应用程序”的小文件夹放入您的应用程序抽屉中,里面有一个终端应用程序。当然,这是我在 Chromebook 上做的第一件事,甚至是在打开谷歌 Chrome 之前。
快速设置会让您进入 Linux 终端,在那里您可以执行 bash 命令。在古典自然中,我输入的第一件事是
限位开关(Limit Switch)
这没有产生任何结果。好的,接下来我决定看看我们会有多有限,然后开始 CD。当我运行 cd 时..我可以访问整个/目录,尽管所有的文件都被 Google 隐藏了,所以你必须使用 ls -a 而不是 ls。此外,我们可以访问 apt,所以我继续进行了经典测试
sudo apt-get update && sudo apt-get full-upgrade
接下来,如你所料,我决定开始安装一些软件。我的第一个测试是 gedit
sudo apt-get install gedit
幸运的是,gedit 工作正常,甚至出现在 ChromeOS 的应用程序菜单中。不可否认的是,ChromeOS 的 GTK 主题让它与操作系统融合得非常好。
朱皮特
在我确定 apt 运行良好后,我决定继续追求 Jupyter 笔记本。它非常流畅,使用简单的
sudo apt-get install jupyter-notebook

运行笔记本服务器就像在您的终端上运行 jupyter-notebook 一样简单。显然,我喜欢 Python,但要成为我的日常驱动程序,这台电脑将需要朱莉娅。为了得到朱莉娅,这是同样的事情:
sudo apt-get install julia

而现在我们有了 Julia,但是有一个很大的问题…Julia 的最新版本是 1.2,而 ARM64 可用的 apt 中的最新版本是 0.4。因此,有一个非常严重的 Pkg bug,没有 Pkg REPL,很多包包括用于机器学习的车床都不能与这个版本的 Julia 兼容。
下一步:多建筑
幸运的是,我们在一个虚拟的 Debian 机器上,这意味着 GNU 自由软件的辛勤贡献者们将直接迎合我们。Debian Stretch 预装了 MultiArch,它很容易配置。不幸的是,我们将不得不从 aptitude 快速获取 nano 来编辑一些文本文件(或者你可以使用 gedit 或 vi,如果那更适合你的速度的话)。)

幸运的是,我们可以很容易地在 ChromeOS 上纳米到我们的资质来源列表中,因为第一步正是如此。
sudo nano /etc/apt/sources.list
对于 Apt 来说,在这里添加 Ubuntu 源代码可能不会有问题,但是我决定继续使用 Debian Stretch,将这一行添加到源代码文件的底部:
deb-src [http://deb.debian.org/debian](http://deb.debian.org/debian) stretch main
现在我们可以添加我们的新架构,我认为 i386 (32 位)比 AMD64 (64 位)更容易工作。我们可以很容易地添加它
sudo dpkg --add-architecture i386
然后我们需要更新和全面升级:
sudo apt-get update && sudo apt-get full-upgrade
但是当试图为 i386 安装 julia 时,我们遇到了一个新问题:
属国
虽然许多应用程序可以很好地安装在我们现有的应用程序上,而且我们可以用它们来修复依赖性错误
sudo apt-get build-dep julia
这在这里是行不通的,因为对于 arm64 兼容性来说,不存在依赖兼容性文件。无论如何,我仍然决定构建我们已经可用的依赖项。经过一段荒谬的时间后,我们会遇到一个仍然没有解决的依赖问题。在这种情况下,你唯一需要考虑的是把我们的软件包更新到最新版本,也就是 Debian 10/buster。当然,出于稳定性考虑,不建议这样做,也不能保证这样做一定会奏效,但这可能是安装应用程序的最后一次尝试。因此,我们将再次编辑我们的源文件,但这一次我们将把所有提到“stretch”的地方都改为“buster”。写出来,关闭 nano,更新你的资源。
现在我们应该避免通过 apt 得到一个 HTTP 错误,所以我们将升级我们的发行版。环境似乎是虚拟的,所以幸运的是,我们可以完全独立于 ChromeOS 升级我们的发行版,而不需要内核或 grub 更新:
sudo apt-get dist-upgradenano /etc/apt/sources.list
sudo apt-get update && sudo apt
这将是我们最后一次尝试使用 MultiArch 运行我们的应用程序,所以在一个完美的世界里,这将是让您的应用程序工作的事情。对于 Julia,我能够使用 Debian 10 Buster 库让 amd64 Julia 与 MultiArch 一起运行。所以现在我可以正式把我的 Chromebook 命名为我的
JuliaBook
结论
ChromeOS 真的已经从上网本的历史中走了很长一段路。这是一件伟大的事情,因为它使 Chromebooks 成为一个可行的替代品,而以前它不是。现在,您有可能使用 Kdenlive、Gimp 和开放广播软件等应用程序进行多媒体应用,几乎可以使用每种编程语言、libre-office,甚至 Gparted 等系统管理器。我看到了很多关于安装的讨论。deb 文件从网上安装的,还有用 arm64 给的简写,但是从来没有人试过用 MultiArch!所以我希望 Chromebook 的用户能够从他们的 Chromebook 中获得更多!
我如何制作智能求职网络应用程序
原文:https://towardsdatascience.com/how-i-made-an-intelligent-job-search-web-app-8676edc74eb5?source=collection_archive---------71-----------------------
使用简历寻找相关的工作信息

作者图片
找工作糟透了
任何找工作的人都可以告诉你,这是一项艰苦的工作。搜索相关职位,更新你的简历和 Linkedin,申请工作,写求职信,面试需要大量的时间和精力来完成。我经常听到的一句话是:“求职是一份全职工作。”
找工作最费时费力的一个方面就是寻找相关的工作职位。这通常需要经常浏览网上的招聘信息,浏览相关的职位名称,阅读职位描述,并确定这份招聘信息是否与你的资历相关。因为这些数据大部分都可以在网上获得,所以这项任务实现自动化的时机已经成熟。
应用概述
给我找一份开发者工作 是一款网络应用程序,旨在搜索在线职位公告板,并根据特定申请人提供的简历确定哪些职位发布与他们最相关。相关性是通过相似性得分来确定的,相似性得分表明简历与职位发布的相似程度。
这个应用程序是一个简单的,准系统的概念验证,将不断增加和改变。目前,该应用程序仅通过 Github 求职板进行搜索,是为搜索开发人员职位的申请人量身定制的。
由于 Github 上发布的职位数量很少,这个工具对于详尽的职位搜索不是很有用。但是,随着更多职务公告板的添加,该值将会增加。
这个应用程序目前还使用一个简单的相似性算法。这个算法有很大的改进空间,并且将成为未来改进的一个关键特性。
体系结构
给我找个开发者工作 是用 Python 和 Streamlit 包开发的。 Streamlit 是一个令人惊叹的 python 包,允许您快速轻松地创建 web 应用程序——尤其是机器学习工具。如果你本质上是一个数据科学家,而不是像我一样的网页设计师,我强烈推荐你点击这里查看 Streamlit。
除了 Streamlit,pandas 和 numpy 还用于数据处理、api 调用请求、JSON 用于解析 API 返回,difflib 用于相似性算法。
数据管道

作者图片
web 应用程序有三个主要组件:用户界面(即前端)、web 服务器(即后端)和 API 服务器。
用户界面(前端)
用户界面(如下所示)提示用户输入位置、搜索项和简历文本。这三个输入将被传递到服务器后端。位置和搜索词都是可选参数,但是,不提供简历将导致应用程序选择随机工作,因为它没有任何相似性得分来排名。

作者图片
Web 服务器(后端)和 API 服务器
在接收到位置、搜索词和简历之后,服务器将构造一个对 Github job board API 的 HTTP 调用。该调用由位置和搜索项参数构成。然后,API 将返回一个 JSON 字符串,其中包含符合参数的作业。使用 JSON 库读入 JSON 字符串,并将其转换为 pandas 数据帧进行处理。然后,服务器将每个职位的描述与简历进行比较,并计算相似性得分。然后,具有最大相似性得分的职务被传递到用户界面,显示职务名称、描述和申请方法(如下所示)。

作者图片
云托管
在 Streamlit 中创建一个本地 web 应用程序是很棒的,但是,允许其他人轻松访问该应用程序也很重要。为了让人们通过我的网站访问这个工具,我把这个应用程序部署到一个免费的 Heroku 服务器上。为此,需要四个文件:应用程序本身、设置文件、Procfile 和需求文件。
安装文件
安装文件是一个 sh 文件,包含 web 服务器的说明。我使用的安装文件如下所示。
mkdir -p ~/.streamlitecho "[server]
headless = true
port = $PORT
enableCORS = false
" > ~/.streamlit/config.toml
Procfile
Procfile 声明应该运行哪些进程。我的 Procfile 如下所示。
web: sh create_config.sh && streamlit run app.py
需求文件
需求文件是一个文本文件,声明在服务器上运行应用程序需要哪些 python 包。我的需求文件如下所示。
streamlit==0.61.0
numpy==1.17.2
requests==2.22.0
讨论
给我找一份开发人员的工作是一个基本的概念验证。虽然我希望这个项目更进一步,并开始用这个工具提供更多的价值,但 Python 和 Streamlit 是不可或缺的,它们让我能够快速建立并运行一个原型,以收集反馈并进行迭代改进。如果你想测试一下应用程序,我会欣然接受你的任何反馈!
如何使用 Pyodbc 将 SQL Server 的插入速度提高 100 倍
原文:https://towardsdatascience.com/how-i-made-inserts-into-sql-server-100x-faster-with-pyodbc-5a0b5afdba5?source=collection_archive---------2-----------------------
如何修复向 SQL Server 加载数据时与“fast_executemany”相关的问题

照片由 Nextvoyage 从 Pexels 拍摄
我最*一直在尝试用 Python 将大型数据集加载到 SQL Server 数据库中。通常,为了用pyodbc加速插入,我倾向于使用显著加速插入的特性cursor.fast_executemany = True。然而,今天我经历了一个奇怪的错误,并开始深入研究fast_executemany到底是如何工作的。
我的数据框架和 SQL Server 表的架构
当我试图将我的数据加载到 SQL Server 中时,我得到了错误:“将数据类型 varchar 转换为 numeric 时出错。”
这个错误让我非常困惑,因为我的 Pandas 数据帧的数据类型与 SQL Server 表中定义的数据类型完全匹配。特别是,我试图加载的数据是一个带有时间戳和度量列+一些元数据列的时间序列。
*My dataframe schema:
summertime bool
time datetime64[ns]
unique_id object
measurement float64
entered datetime64[ns]
updated datetime64[ns]*
SQL Server 表有一个与此类似的模式:

SQL server 表的架构
如果你看看数据类型,它们完全匹配。
"将数据类型 varchar 转换为数字时出错"
为了将这些数据快速加载到 SQL Server 数据库中,我使用df.values.tolist()将 Pandas 数据帧转换为一个列表列表。为了将我的数据接收到数据库实例中,我创建了:
- SQL Server 数据库实例的连接对象
- 光标对象(来自连接对象
- 和
INSERT INTO声明。
注意,在第 14 行,我们使用了cursor.fast_executemany = True特性。执行脚本时,我得到了以下错误(带版本: *pyodbc==4.0.23*):
ProgrammingError: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server] Error converting data type varchar to numeric. (SQLExecute)
为什么 **pyodbc** 要把 **varchar** 的东西转换成 **numeric** ?!当我注释掉第 14 行以便在没有fast_executemany特性的情况下使用cursor.executemany()时,脚本运行得很好!我能够毫无问题地插入我的数据。
唯一的问题是没有fast_executemany,很慢。
fast_executemany"深入挖掘
根据 Pyodbc Wiki [1]:
fast_executemany可以通过大大减少到服务器的往返次数来提高executemany操作的性能。
这是我想解决这个问题的主要原因。根据来自pyodbc库[2]的 Github 问题,pyodbc内部将所有十进制值作为字符串传递,因为一些差异和与各种数据库驱动程序使用的小数点相关的错误。这意味着当我的数据具有值0.021527或0.02时,这两个值可能都不被接受,因为我的 SQL Server 数据类型被指定为NUMERIC(18,3)。另外,pyodbc需要字符串而不是浮点,所以正确的值应该是'0.021',也就是说,字符串(不是浮点!)逗号后面正好有三个数字。
所以我的解决方案可以归结为增加这一行:
这一行只是将浮点数转换成字符串,用三个小数点表示数字:

对我来说,使用“fast_executemany”和 floats 是一个“奇怪”的解决方案
修复“fast_executemany”的好处
在修复了这个问题之后,该脚本的运行速度比不使用第 14 行(cursor.fast_executemany = True)时快了 100 倍。请注意,它之所以如此之快,是因为它在将数据加载到 SQL Server 之前将整个数据加载到内存中,所以如果您遇到内存不足错误,请考虑分块加载。
结论
总之,通过将我的 float 列转换为与 SQL Server 表中定义的小数点数字完全相同的 string,我能够修复“将数据类型 varchar 转换为 numeric”的错误。令我颇感意外的是,pyodbc并没有在引擎盖下处理这个问题(,或者可能在最*的 Pyodbc 版本中已经解决了?)。
如果你觉得有用,请关注我,不要错过我的下一篇文章。
资源:
[1]https://github . com/mkleehammer/pyo DBC/wiki/Features-beyond-the-d b-API
https://github.com/mkleehammer/pyodbc/issues/388
我如何用电报机器人让我的女朋友开心
原文:https://towardsdatascience.com/how-i-made-my-girlfriend-happy-with-a-simple-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot-2be8e4b150e7?source=collection_archive---------17-----------------------
在我的树莓 Pi 上构建电报机器人的短暂旅程

JESHOOTS.COM在 Unsplash 上拍照
在这篇文章中,我将解释我设计的电报机器人的实现细节:家庭下载器。
家庭下载器允许用户轻松地从互联网上下载视频,然后在他们喜欢的任何设备上观看。它是由用户的简单请求触发的,用户将请求发送到所选的 URL。收到文本后, home-downloader 会检查不需要的用户。然后,它将相关视频下载到一个目录中,该目录存储在 Raspberry Pi 上,可通过本地网络访问。最后,Pi 会将视频播放到用户选择的屏幕上,而用户则可以尽情享用一些受之无愧的爆米花。
问题是
我家里有两台电视,一台是智能的,第二台……没那么多。为了帮助第二个(主要由我的女朋友使用)跟上新的花哨技术,我买了一个小米 Mi Box S。然而,仍然缺少一些东西:我的女朋友不为所动,尽管她可以访问任何发明的媒体服务。问题:她想播放她在网上找到的视频,但有些视频太重,无法通过 Mi Box 打开。Chromecast 也不是一个可行的选择,因为它不允许她从这样的网站上播放视频!
废话!这让我陷入了困境…当我的全新 PS5 到来时,我该怎么办?谁会宣称智能电视的所有权?!
所以我决定解决这个问题,并告诉她
解决方案
好了,让我们建立一些约束/要求:
- 我不想在这上面花钱,我想用家里现有的东西。
- 任何一种用户交互都应该尽可能流畅,我女朋友不是计算机科学家,也不是科技爱好者:)
- Python !
我向工程师提出的解决方案必须解决以下问题:
- 给我一个网址,我能下载视频吗?
- Android 盒子将如何访问下载的视频?
- 以上两点如何实现自动化?
- 最好的用户界面是什么?
原来下载网络视频最简单的方法是 youtube-dl。这款软件的优势之一是它不仅适用于 YouTube:)
tbh,不是每个网站都能用的,不过好在兼容的网站列表还挺大的。是啊。
我决定从我的 Raspberry Pi (RPI)运行 youtube-dl 并将视频保存在 RPI 上托管的文件夹中,并与 桑巴 共享。这个文件夹对于位于同一个本地网络的 Android Box (AB)是可见的。
现在仍然缺少一个重要的部分:从 AB 读取视频。在这一点上,我很确定 VLC 会成功。从 AB 访问 Samba 目录是非常简单的……除非你使用的是 VLC 桌面!因此,试图将 AB 和 VLC 合并是一个巨大的混乱…事实上,我发现这是一个非常著名的,仍然没有解决的问题。但是后来 KODI 出来帮我:易如反掌:)
至此,我才明白 home-downloader 应该是一个电报机器人。我懒得实现任何接口/API,但也不想把工作外包给:D 电报公司!因此,我决定让用户与电报机器人互动,也就是通过简单的聊天。毕竟,丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 已经提供了实现这一点所需的所有 API。
你可以在下面看到完整的建筑图:

由作者创建
履行
我选择的语言是 Python 3.8。
该项目由两个组成。py 脚本和一个。json 配置文件:
- 它存储了 Bot 令牌和其他一些我们不想硬编码到 python 脚本中的信息。
- modules.py 它包含三个函数。
- home _ downloader . pymain。
在深入了解代码的本质之前,这里是我的设置:
- 我使用了一个名为 python-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot 的不错的库,它为原始的电报 API 提供了友好的接口。
- 我在我的 Raspberry Pi 2 Model B 上运行拱臂,并且我按照这个拱臂提供的指导方针设置桑巴。
- 我之前用机器人父亲机器人注册了一个电报机器人,目的是引导用户完成注册。官方指南会给你一个相当透彻的介绍。
配置文件
在这里,我们保存:a)home-downloader Bot 的秘密令牌; b) 可以与机器人交互的用户列表, c) 主人(这里是我)与机器人聊天的 ID。
关于 c) ,出于隐私考虑,我不想让任何未经授权的用户进入!因此,当新用户开始与 home-downloader 聊天时,它会检查该用户是否属于预先确定的白名单。
备注:在部署机器人之前,所有者必须读取他和机器人之间的聊天 ID 并保存到配置文件中。这是每次新用户开始与机器人聊天时,从机器人向主人发送直接消息的唯一方式:电报机器人不能在给定用户名的情况下发送直接消息。
要找出聊天 ID,只需与机器人开始一个新的对话,并在我们将要看到的一个函数中打印这个属性:
update.message.chat_id
模块
该项目包括三个主要功能。
首先,我们设置了一个日志记录器:当你在后台运行几天时,检索关于脚本执行的信息是很有用的!其次,我们打开。json 配置,这样项目的所有功能都可以看到它。
下面的函数是 youtube-dl 的包装器,由子进程执行。子进程库允许您从 Python 运行 bash 命令并返回输出。执行的结果用于确定视频是否被正确下载。
现在我们必须绑定聊天动作和触发电报机器人的命令。正如我上面提到的,每当一个新用户开始一个对话时,以及当一条新消息被发送时,这个机器人应该被触发。
欢迎功能在每次用户开始聊天时打印一条欢迎消息(即通过习惯的 /start 命令)。而且,当前聊天的用户的用户名随后被发送给主人(我!),在 config.json 文件中定义。
最后,incoming _ message _ action函数对新消息的处理进行编码。对每条消息进行解析,以发现 URL(第 8–11 行)。
如果 URL 被批准,该函数将检查网站域(第 14 行):事实上,我可能希望只允许某些网站被用作来源。原因很简单:我不想让我的 RPI 在没有我的允许下下载数十亿字节的资料!
你可能已经注意到函数 incoming_message_action 和 welcome 有一些共同点。首先,它们接受两个名为更新和上下文的参数,这两个参数包含触发机器人的用户的信息和聊天消息。其次,它们都共享这段代码:
if update.message.chat.username not in config["valid_users"]:
return False
上面代码片段的目的是检查与聊天交互的用户是否被允许这样做。
这是将 bot 的使用限制在特定用户范围内的唯一方法。希望 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 能添加一个合适的特性来做到这一点。
家庭下载器
home_downloader.py 把我们目前看到的内容汇总在一起。
机器人被初始化,处理程序基于我们到目前为止看到的函数被创建。
最后,通过调用函数 start_polling 来启动 bot。
结论
在本文中,我想展示我如何处理现实生活中的问题以及我实现的解决方案。我试图强调每个决定背后的创造过程。
这是项目的 GitHub 链接。由于这是一项正在进行的工作,一些代码可能与本文中的略有不同:我已经在开发一些新的特性和改进。无论如何,上面的代码是你构建自己的 Bot 并根据你的需要定制它所需要的全部。
特别感谢阅读和评论这篇文章草稿的人们:
加布里埃尔·约马佐和克里斯蒂安·孔特雷拉斯·坎帕纳
我是如何制作出世界上第一首 100%人工智能歌曲的
原文:https://towardsdatascience.com/how-i-made-one-of-the-worlds-first-100-ai-songs-45da7297075c?source=collection_archive---------36-----------------------
歌词、音乐和人声都是在没有人工参与的情况下创作出来的

图片来自皮克斯拜 (CC0)
你可能听说过“人工智能音乐”这个术语,但你可能从未真正想过它的含义。以下是大多数人的期望:
Aiva 的一首摇滚歌曲
这首令人惊叹的人工智能音乐是由一家名为 Aiva 的公司创建的,该公司使用尖端的机器学习技术来创建这样的曲调。也有人工智能乐队使用类似的机器学习程序在网上发布伟大的音乐。但是,你可能没有意识到,这首歌的原始版本听起来一点也不像你听到的。他们通常使用音乐编辑软件来极大地改善人工智能提出的东西。
AI 的主要输出是旋律,通常是 MIDI 钢琴音轨的形式。当你开始尝试让电脑自动添加其他乐器时,问题就来了。它对节拍没有很好的感觉,也不知道如何混合各种乐器来跟随钢琴的旋律。更糟糕的是,MIDI 文件大部分时间都有非常计算机化/虚假的声音,就像旧的视频游戏音乐。你绝不会把它和你可能在收音机里听到的一首真正的歌混淆。
因为所有这些,人工智能音乐公司和人工智能乐队通常混合使用人类输入和人工智能输入(参见这个谷歌博客帖子中的一些好例子)。到目前为止,我所谈论的甚至没有涉及到让人工智能写歌词和唱歌的所有问题。
为了便于比较,这是我的人工智能杰作,电脑创造了一切(歌名、歌词、旋律、音乐和人声):
我的一首人工智能创作的歌曲
是的,太糟糕了。不过,我没想到会进入前 40 名。重要的是,这是我所知道的为数不多的从头到尾 100%使用人工智能制作的歌曲之一。你可以在我的人工智能音乐网站上听其中的 10 首歌,还可以查看歌词。
我是这样做的:
音乐是用谷歌的开源软件自动生成的。具体来说,我使用了预先训练的“三重奏”模型,正如他们在 MusicVAE 博客帖子中所描述的。
歌词是使用开源的 GPT-2 简单的自然语言程序编写的,我在我的文章如何创建一个关于这个歌词网站的歌词生成器中描述了我对诗歌和歌词的训练。歌名的选择是基于各种非人工智能的规则,大多与歌词中使用最多的台词有关。
人声是最难的部分之一。它必须检测音乐中旋律的音高,将文本转换为语音,并调整语音以匹配旋律的音符。最重要的是,它必须努力找出虚拟歌手应该在哪里说出每个单词,以保持节拍。
还有一个问题是,我不能简单地将 MIDI 音乐文件直接输入到声乐合成程序中。首先,我必须将原始的 MIDI 文件转换成新的 MIDI 文件,其中只有一个通道包含钢琴部分,因为这通常是歌手需要遵循的旋律。我使用了一个叫做香蕉分裂的开源程序来完成这个任务。
接下来,我使用一个名为 midi2voice 的开源虚拟歌手程序来创建人声(一个 WAV 文件),使用歌词和音乐作为输入。最后一步是将声音文件与原始 MIDI 音乐文件结合起来,以产生歌曲。我这样做是通过将 MIDI 文件转换成 WAV,然后像这样使用 ffmpeg 的 amerge 命令:
ffmpeg -i imabandoned.wav -i imabandoned_singer.wav -filter_complex amerge=inputs=2 -ac 2 imabandoned_final.mp3
最终,我实现了我的目标,那就是建立一个自动化的框架来创作一首不需要人工干预的人工智能歌曲。不只是像其他人一样关注音乐,而是用歌词和唱腔把它变成一首真正的歌。我事先知道这听起来不太好,但这只是一个开始。现在我有了一个演示版本,我可以对它进行改进了。也许甚至有一天推出一个人工智能摇滚明星,有 CD,merch 和虚拟音乐会。但是我还有很长的路要走。
一些额外的人工智能音乐资源:
流行音乐制作人:这篇文章有很多关于这个话题的信息,还有一个他的开源程序的链接。
达达机器人——他们使用原始音频而不是 MIDI 制作人工智能音乐,因此结果听起来更真实。但是,大部分输出听起来并不好,所以他们需要手动将许多音乐片段整理成一首歌。
EDM 音乐制作人——你可以在他的 YouTube 视频中听到这个开源程序的演示。
神经故事讲述者(见页面底部)——来自 Pi project 的部分歌曲。他们和我做同样的事情,但是使用非常不同的方法,并在学术论文中解释他们是如何做到的。
Mellotron —来自 NVIDIA 的高品质语音合成,用于演唱。
经过对抗训练的端到端韩语歌唱语音合成系统——这听起来太真实了,但他们没有发布代码,所以我很难复制。
作为一名数据科学家,我如何管理我的时间并保持有序
原文:https://towardsdatascience.com/how-i-manage-my-time-and-stay-organised-as-a-data-scientist-e3e78871b7b5?source=collection_archive---------42-----------------------
我遵循的快速提示和简单规则

照片由 米凯拉 发自 像素
作为一名数据科学家,我的工作有很多层面。我需要跟踪项目需求、利益相关者的要求、代码开发和我想尝试的新想法。除此之外,我还想掌握我想学习的新知识。
很容易理解为什么如果你没有一个适合你的计划,事情可能会失控。很幸运,我男朋友是生产力老师。在建立符合我需求的工作结构时,他给了我很多建议和支持。
起初,我认为设置这些东西会很麻烦。虽然我不得不承认,现在它节省了我很多时间,不用花几个小时去想我下一步应该做什么,或者在开发中期痛苦地感到失落和困惑。我建议你建立一个适合自己的系统,并坚持下去。希望能启发你,并向你展示一些选择,以下是我如何组织和管理我的时间。
我确保可以在一个日历上看到所有即将发生的事件。这包括我的工作事件、个人约会和电话,所以你想成为一名数据科学家?开会,预约医生。基本上,任何让我身心俱疲的事情。在一个地方看到所有这些帮助我了解我一天中有多少时间来做专注的工作。这有助于设定我每天的期望。
这也有助于我将一天划分为不同的情境,因为我会用情境切换来解释更多。
我使用任务管理器来记录我想做的每件事和我生活中不同部分的所有项目。我使用的任务管理器叫做 Things。
当然,这可能是非常私人的事情。正如我所说,我的男朋友是一名生产力教师,所以我能够得到他的帮助,为我建立最好的系统。你可以在他的 YouTube 频道上找到他的建议。
在任务管理器上,我写下了我的项目。这些不一定只是工作项目。报税,申请居留许可或者为我的新课程创建销售页面都是项目。我写下为了完成这个项目我需要做的每一件事,如果必要的话指定一个截止日期,这样我需要做的每一件事都记录在一个地方。
这样我总是知道我突出的任务和责任是什么。
我偶尔(最好是每周)回顾一下我的任务,看看我进步了多少,我还没有解决什么,我已经完成了什么。我用这段时间来思考和计划未来的日子。这样,当我开始新的一天时,我或多或少已经知道需要做什么。
我会花几个小时来集中注意力。因为与其他人一起工作时,会议或闲聊可能会被打断。我想现在大家都在家里工作,这种情况会少一些,但还是有被你的手机吸进去的危险。
为此,我会确保在我的日历上留出时间,在这段时间里我会离线并处理我的主要任务。这包括将我的电脑设置为“请勿打扰”,退出所有可能弹出任何通知的应用程序,把我的手机放好,戴上降噪耳机。
你会惊讶地发现,每天只需 2 小时不间断的工作,你就能完成多少事情。
我尽量避免让自己负担过重。我们都有梦想和抱负,我们都想尽快实现它们。但我认为,明智地规划我的时间比试图耗尽自己的最后一点生产力要好。这些年来,我意识到把自己逼得太紧是有后果的。首先,我在追逐我为自己设定的最后期限时变得压力太大,其次,我开始怨恨我的工作占用了我所有的时间,没有任何时间花在自己身上或只是放松。然后,我开始错过最后期限,事情变得不可收拾,这只是时间问题。
我发现的一个解决办法是给自己放松的时间表。如果我知道一项任务至少需要 2 小时,我不会把它分配到 2 小时的时间段。我把它分配到一个 3 小时甚至 4 小时的时间段。如果在一天结束的时候,我还有时间或精力去做别的事情,我总是可以接受的。这就引出了我的下一个观点。
我意识到这不仅是时间的问题,也是精力的问题。仅仅因为你一天中有更多的时间,并不意味着你应该用这些时间去工作。有时候事情可能会太混乱,可能会有个人的麻烦,比如爱人需要你,或者有开心的事情要处理,比如你坠入爱河。无论大小,我意识到我周围的一切都需要我一整天的能量。我确保意识到我能抽出多少精力来完成一天的任务。这帮助我决定如何计划我的日子;我认为更紧凑或更灵活…
我计划我的每一天都需要尽可能少的环境转换。这是让我在最繁忙的工作日保持高效的关键因素之一。上下文切换正在改变你工作的领域。这可能是工作中的项目 A 或项目 B。这也可能是做与工作相关的事情和处理个人行政事务之间的区别。
我意识到对我来说这需要大量的时间和精力。我经常发现自己在两种不同的环境下工作时需要休息一下。这就是为什么在我计划一天的时候,我会尽量限制一天中需要切换上下文的次数。
看看我的日历,如果我早上有一个与项目 A 相关的会议,只要我需要/可以,我就会把早上的时间花在思考和做与项目 A 相关的任务上。如果下午我需要交付一些东西,我会确保把那段时间花在某个项目上。
我把我的想法记录下来并保持有序。正如我在本文开头所说,一个数据科学项目有很多层。我需要关注的不仅仅是我的代码和编码任务。我还需要跟踪我在开发过程中提出的新想法、项目要求和许多其他事情。
为此,如果项目规模较小,我会确保在我的笔记应用程序上创建名字容易找到的笔记。如果是一个更大的项目,有多个客户会议和各种利益相关者,我会创建一个专门的文件夹,保存我所有的相关文档。偶尔,我会确保花时间来整理这个文件夹。停止你整理笔记和文件的动力感觉是违反直觉的,但我认为从长远来看,它帮助我更有效率,进步更快。
我还会在手边放一个记事本或笔记应用程序,记下我的任何新想法。尽管在编码的时候停下来做笔记很难,所以我找到的一个解决方法是在我正在做的笔记本上做笔记。我用自己想出的关键词,比如#ATTENTION 或#TODO,来记下我现在不能做或想做但下一步想做的事情。
保持组织性和高效性并不一定具有挑战性。我追求的主要目标是善待自己,意识到自己的极限,花时间仔细思考我的计划。希望我在这篇文章中提到的事情能给你一些关于如何应对生产力挑战的想法。
🐼想更多地了解熊猫吗? 获取我的免费熊猫小抄。
我是如何从 IT 支持人员转变为数据科学家的
原文:https://towardsdatascience.com/how-i-managed-to-changed-my-career-from-support-it-to-a-data-scientist-31636f68f18c?source=collection_archive---------7-----------------------
你决定你的命运

多兰·埃里克森在 Unsplash 上的照片
科学称数据科学家是未来收入最高的工作。从大学时代起,我就对 python 和数据科学技术感兴趣。但是,在生活中,事情并不总是如你所愿。我被一家跨国公司录用了。当时我很高兴我被安排在了一家公司。怀着在数据科学领域发挥作用的希望,我加入了这家公司。当我们找到工作时,我们通常会感到高兴。然而,在我心里,我希望更多。我想我会在数据科学领域工作。
终于,有一天他们给我安排了一个项目。
我知道我将作为支持 IT 人员工作,支持不同的应用程序。啊!所以,现在我将不得不从事 IT 支持任务,但是我成为一名成功的数据科学家的热情和目标呢?
一开始,我很麻木,因为我的团队强迫我学习支持任务,我试图专注于数据科学的东西。最后,通过这种方式,他们将我分配到另一个支持项目,因为我在那个项目中没有尽全力。
我意识到我需要同时关注两个方面,我目前作为支持工程师的职位,以及数据科学之旅。这并不容易,因为朝九晚五的工作之后;你没有时间自我提升。在这里,我开始了管理时间和寻找学习数据科学技术的方法的旅程,同时享受我目前的支持 IT 工作。
在我们的生活中,如果我们想专注于学习新事物,我们必须有一个*静的心态。我们不应该有任何其他负荷或任何紧张或压力会导致我们分心;否则,你将无法专注于优秀的学习内容。
本文将分享我成为认证数据科学家的历程。我将分享我是如何开始并继续我的旅程的,即使是在我朝九晚五的日程中忙碌。
不要随波逐流;成为潮流。
研究表明,如果你人云亦云,那么就很难根据自己的能力做出合适的决定。你要不要随波逐流;这完全取决于你。但是命运取决于你的流动。你的环境会让你走上一条随机的道路;但是,根据您的技能和知识修改方式是您的责任。如果你和其他人一样随波逐流,改变你的职业生涯会更有挑战性,如果你想改变你的工作,你需要让你的流动,这种流动应该是持续的。你会在你的心流中发现许多障碍,但你需要如此坚定,以至于障碍不会在你的成功之旅中扮演重要角色。
当我开始工作时,我开始观察项目中的其他人。我发现很多人还在以前的 IT 工作岗位上干了五到六年以上,现在对最新技术的了解还不够。我们可以说,他们变得如此习惯于支持任务,以至于他们不能将他们的职业生涯转换到不同的领域。所以流动应该在开始的时候产生,但不要太晚。

由亚历山大·尚邦在 Unsplash 上拍摄的照片
“大多数人并不追求他们想要的东西。即使是一些最认真的目标追求者和目标设定者,他们也在追求他们认为能得到的东西。”
——鲍勃·普罗克特
追随你的激情,你的激情会跟着你回来。
你的激情在你的精神幸福中起着至关重要的作用。研究发现,追随你的激情比金钱更重要。
这是典型的一天,我正在做我的支援工作。我从我的组织收到一封邮件,说有一些与使用 python、机器学习和机器人流程自动化的自动化相关的认证课程。那天我很兴奋,因为我在我的组织中找到了与我感兴趣的领域相关的东西。在得到我的经理的确认后,我选择了该认证,并在第一次尝试时清除了证书。我给我的经理发了一封邮件,告诉他们我获得了 python 认证。所以,就这样,人们开始像认识一个 python 开发者一样认识我。
有一天,我的一个同事问我是否可以使用 python 来自动化他的任务。我对事情朝着积极的方向发展感到惊讶。在我的经理确认后,我接受了这项任务。我开始着手这项任务,幸运的是,这项任务有点复杂,所以花了大约六到八个月的时间。但即使在我的项目上工作了一年后,我也没有一次机会去从事我梦想中的数据科学项目。我继续在我的项目中使用 IT 支持人员,因为我不想让我的组织觉得我对支持 IT 任务不感兴趣。毕竟,那是我当时唯一的收入来源,也是我的第一份工作。
你的艰难时期将考验你的耐心,但你需要持续不断地追求你的目标。
耐心是一种美德“至少在我们需要的时候,耐心是一颗难以下咽的药丸。
即使工作了一年多,也没有得到从事数据科学项目的机会,于是开始在不同的组织中寻找其他机会。但是,我发现成为数据科学家的标准非常严格。他们要求成为一名数据科学员工所需的大量技能,当时,由于我正在自学数据科学,我还没有做好在另一家公司从事数据科学项目的准备。
那一天,我感觉有点低落,因为我在想,我只有在周末才有时间自学,我没有接触到任何数据科学,所以我将如何将我的职业生涯转换到数据科学领域。
“上帝给你的礼物是你一生都用不完的才华和能力。你给上帝的礼物是在此生尽可能多地开发和利用你的天赋和能力。史蒂夫·鲍"
如果你注意到我开始是一个支持者,现在我有一个项目,在这个项目中我正在利用我的 python 技能,我认为上帝也像一只援助之手一样帮助你。你只需要在你的旅程中不断前进。

马克-奥利维尔·乔多因在 Unsplash 上的照片
有一天我的同事来找我。我的同事知道我的数据科学技能。她告诉我,另一个同事做了一个研究所的数据科学认证。他现在在一个不同的组织中获得了一个数据科学项目,薪水很高。因此,那时我意识到我也应该加入研究所,学习在任何项目中使用数据科学的正确方法。
我决定周末加入那个协会。数据科学课程为期九个月。在学习数据科学课程时,我意识到他们教授的技能是成为数据科学工程师所必需的。我将大部分时间投入到我的认证课程中,在那里我学习了不同的数据科学技术,并向教授我数据科学的导师致敬。导师来自好的大学,他们是不同组织的高级数据科学家。这让我松了一口气。最后,该课程帮助我提高了数据科学知识。
机会会降临到有准备的人身上。
科学表明,机遇偏爱有准备的人。在认证过程中,我了解了数据科学的最新技术。与此同时,我收到了一封来自组织的邮件,在那里我发现了一些与数据科学相关的任务。那天我非常开心。如果我们继续做好事,上帝会帮助我们的。我申请了那个任务,基于我从同事推荐的认证课程中学到的技能,他们接受了我做这个任务。
我在那项任务中尽了最大努力,所有给我分配任务的人都对我的奉献精神感到满意。就这样,他们给我布置了更多的任务。而且,我知道这些任务需要数据科学技能。因此,我可以观察到,如果在那一天,当我的同事向我咨询认证课程时,如果忽略了这个机会,那么我可能无法正确地学习数据科学技能。此外,我可能得不到那些数据科学任务。在这里,我们可以看到机会发挥着重要的作用,我们永远不应该忽视它们。我们应该看一看那些机会。
获得信任和优惠
当我从事 python 和数据科学任务时,我做得非常好。所有人都对我的奉献感到高兴。这帮助我获得了公司高层的信任。后来,他们给我分配了一个数据科学的关键任务。实际上,我是他们完成这项任务的关键员工。
一旦你获得了他们的信任,你不需要去找他们,但是他们会来找你,因为他们知道你会更有激情地完成他们的任务。

照片由布鲁斯·马尔斯在 Unsplash 上拍摄
终于有一天,我开始收到邀请,根据我的技能和工作加入他们的项目。在这背后,主要原因是:首先,我有较少的经验年数,并且是较少经验年数的人,他们将不得不相应地支付我。因此,这对他们来说是一个双赢的局面,因为如果他们任命更多有六到十年经验的经验丰富的数据科学家来做和我一样的任务,但组织将不得不根据这个人的经验支付更多的费用。
认证数据科学家
获得任何技术的认证在一个组织中都起着重要的作用,因为为了展示你的技能,你应该有一些证据。因此,我搜索了获得数据科学认证的不同方法,并了解到微软正在提供一个演示端到端数据科学技能的认证课程。我对数据科学有很好的了解。因此,我选择了认证课程,经过几天的复习,我通过了数据科学家的认证。所以最后,现在我是微软认证 Azure 数据科学家。
数据科学作家
在获得更多数据科学经验并对数据科学领域更加自信之后,我从朋友那里了解到,我们可以通过写文章、制作 YouTube 视频和其他事情来展示我们的数据科学技能。所以我介绍给 medium。我创建了我的帐户并得到了验证,然后我写了一些文章并将其发送给一些专注于数据科学和人工智能的出版物。

照片由 Aaron Burden 在 Unsplash
根据文章内容,他们接受了我在杂志上的文章。就这样,我成为了一名数据科学作家。这有助于我继续提高我的数据科学技能。我写的文章越多,我要学习的就越多,而且,我写文章是有报酬的,这给了我更多的动力去写更多的文章。
结论
一切从流动开始。我创建了我的流程,并专注于我目前的职位,即支持 IT 工程师,以及我成为认证数据科学家的主要目标。有很多障碍,比如朝九晚五的员工;很难找到自我提升的时间。除了日常工作之外,最好每天花点时间来提高自己。我了解到你的固定工作会帮助你获得更多的联系,了解人们的观点和经历。还有,我们应该看到命运就像一个孩子。你根据你的技能、你的奉献、你的热情和你的态度来培养它。
- 你决定你的命运。
- 你的行动、行为和积极的态度是你真正的朋友。
- 不要随波逐流;尽情发挥吧。
没有人生来贫穷,但我们都生来富有。是的,我们生来就有头脑和天赋
非常感谢你的阅读。愿这个故事对你的事业有所帮助。
在你走之前……
如果你喜欢这篇文章,并希望继续关注更多关于 Python &数据科学的精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为中级会员。
请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。
还有,可以随时订阅我的免费简讯: Pranjal 的简讯 。
我如何最大化我的数据科学生产力:PyCharm + Anaconda + JupyterLab
原文:https://towardsdatascience.com/how-i-maximize-my-data-science-productivity-pycharm-anaconda-jupyterlab-2bd045ecadb3?source=collection_archive---------15-----------------------
如何开始您的数据科学编码

RawFilm 在 Unsplash 上拍摄的照片
介绍
不要误解我的意思——我们总是想提高我们的生产力——用同样多的时间,我们可以完成更多的工作。对数据科学研究人员来说也是如此。设置好硬件后,是时候考虑如何选择启动数据科学项目所需的软件了。问题是市面上的选择太多了,出于学习的目的,你可能已经尝试了不同的工具。换句话说,你的购物清单太长了,你可能不知道该从哪里开始。
在本文中,我想分享我发现的适合我的数据科学项目需求的组合。当然,这不会是一个适合所有人的解决方案。但如果你对自己的配置没有想法,或许可以先尝试一下。
具体来说,我们将使用三个工具:PyCharm、Anaconda 和 JupyterLab。我将首先介绍安装,然后讨论每个工具的作用。我会尽量简洁,因为如果我倾注太多的信息,初学者会不知所措。
装置
PyCharm 要安装 PyCharm,可以去 PyCharm 网站:https://www.jetbrains.com/pycharm/download/#section=windows。根据您的操作系统,您需要下载正确的版本。我在一家非盈利教育机构工作,所以我可以接触到专业版。如果你有类似的情况,你可以利用这个好处。然而,如果您主要从事 Python 开发,社区版本应该工作得很好。
下载完成后,按照提示操作即可。没什么特别的。
Anaconda
要安装 Anaconda,可以去 Anaconda 网站:https://www.anaconda.com/products/individual。对于我们大多数人来说,我们可以只使用个人版本。但是对于团队和企业还有其他版本。下面是 链接 对不同方案的比较。
同样,您需要为自己的操作系统选择版本。下载完成后,按照提示操作即可。一切都应该自己说得通。
JupyterLab
你真的不需要为 JupyterLab 下载任何特别的东西,因为一旦你启动了 Anaconda,你就可以在 Anaconda 中非常方便地访问它,它会为你处理所有的安装和其他设置。
每个工具的角色
皮查姆
- Python 脚本编码。它有以下我喜欢使用的功能。当然,其他的 ide 也有这些特性,但是它们有多好会有所不同。
* **Python coding style check.** It can check if there are problems with the coding style, such as naming and indentation. You'll learn the best practices for Python coding along the way.
* **Auto-completion hints.** The auto-completion suggestions are prompted quickly after you start to type. There are also built-in short snippets that can automatically prompted, such as __init__ method for a class.
* **Code analysis.** It can check whether variables have been used or not, whether any imported modules are used or not, whether certain variables are used before their definitions, and various other analyses. An important feature of code analysis is to inform you about the duplicates, which will help you refactor your code.
* **Definition look-up.** It's very convenient to look up any variable or functions with a shortcut (hold down Cmd or Ctrl and click). It's two-way look-up. If it's a definition itself, it'll prompt the usages. If it's a reference to a variable, it'll direct you to the definition.
* **Refactor.** When you change variable names, change function signatures, or delete files, it will allow you to do it systematically, which will prevent bugging due to these refactoring actions.
- 与版本控制集成。无论你是数据科学家还是软件工程师,你总是想使用版本控制工具。对于我们中的许多人来说,选择将是 GitHub,它的使用不仅允许我们拥有代码的备份,还可以访问不同版本的代码以进行重构。PyCharm 有一套专门的版本控制管理工具。您不需要了解很多关于 git 命令的知识。大多数操作只需点击即可完成。在我的项目中,我将只使用常见操作的快捷方式,例如 commit (Cmd + K)和 puch commits (Cmd + Shift + K)。
- 软件包安装提示。对于许多常见的包,您可以开始用 PyCharm 编写代码。如果所需的软件包没有安装,系统会提示您安装该软件包。在大多数情况下,PyCharm 能够很好地完成工作。
- 虚拟环境集成。当您创建一个项目时,您可以指定应该如何设置虚拟环境(接下来将详细介绍)。您可以简单地指定 Conda 作为新的环境管理器。
蟒蛇
- 环境管理。Python 程序员应该不会对虚拟环境这个术语感到陌生。由于 Python 的开源特性,我们有大量可用的包。问题是不同的包可能有不同的需求,因此不可能只有一个 Python 安装和相关的包来满足所有应用程序的需求。
虚拟环境就是通过创建具有特定依赖关系的虚拟环境,为每个应用程序形成独立的自包含盒子来解决这个问题。
* **Create/Clone New Environment.** You can create a new environment from scratch or clone one from an exiting virtual environment.
* **Import Environment.** If you have set up an environment somewhere else, you can import the setup file, which allows you to re-construct the environment easily with Anaconda.
- 启动应用程序。在每种环境下,您都可以启动想要使用的应用程序。例如,您可以在这里启动 PyCharm 或 JupyterLab。用于数据科学的许多其他常见应用程序也很容易访问,如 Visual Studio 代码和 RStudio。
JupyterLab
- 朱庇特笔记本。虽然 PyCharm 支持 Jupyter 笔记本,但我发现体验并不好。您的屏幕有两部分——一部分是编码,另一部分是显示结果。因此,为琐碎的工作编辑笔记本是可以的。但是,如果你想有一个更具交互性和响应性的笔记本体验,你可能需要使用 JupyterLab 来编辑笔记本。
- 笔记本扩展。许多开发者已经开发出了有用的笔记本扩展。因此,通过在 JupyterLab 中运行笔记本,您可以使用这些扩展来提高工作效率,例如查看目录和变量检查器。
在你走之前
这是一个数据科学项目的典型工作流程,这个项目一直在为我工作。当然,它是我到目前为止讨论的这三种工具的组合。
- 运行 PyCharm 并创建一个项目,使用 Conda 进行虚拟环境管理。
- 用 PyCharm 编写脚本。如前所述,通过提供代码完成和分析特性,PyCharm 允许您比许多其他 ide 更快地编写代码。我没有提到的另一件事是对科学模式的支持,它为您创建单独的单元来运行更小的代码片段。
- 创建笔记本。当您准备创建您的 ML 或其他需要更多交互或图形的模型时,您可能希望现在就创建笔记本。在 PyCharm 中创建笔记本很重要,它将为您设置正确的解释器版本。
- 在 JupyterLab 中编辑记事本。去阿纳康达,在那里发射 JupyterLab。打开创建的笔记本,就可以开始编辑笔记本了。
- 在这个过程中,不要忘记使用 PyCharm 中的集成工具为您的项目添加版本控制。
我如何将一个库从 Python 2 迁移到 Python 3
原文:https://towardsdatascience.com/how-i-moved-a-library-from-python-2-to-3-60fc2b2a21a1?source=collection_archive---------35-----------------------
Python 2 已经死了——让我们继续吧!

图片来自 needpix.com 的天空电视台
去年,我举办了一个关于打包 Python 项目的研讨会。其中一名参与者是生物信息学研究者。她需要建议,因为她想从 Python 2 切换到 Python 3,但是她需要的库只适用于 Python 2。将库迁移到 Python 3 非常有趣,我将在这里分享我是如何做到的——或者更确切地说,如果我再次遇到同样的情况,我会如何做。
本地设置
确保可以在本地执行 Python 2 和 Python 3。我喜欢 pyenv 这一点:
$ pyenv install 2.7.18
$ pyenv install 3.8.5
$ pyenv local 3.8.5
$ pip --version
或者,您可以使用 conda 在 Python 2 和 3 之间切换。
常规项目设置
项目应该在版本控制下,你需要确保人们在需要时可以返回。您需要锁定直接和可传递的依赖关系。你应该有一个可复制的环境,比如一个 Docker 容器带有类似2.7.18-slim-buster的固定 Python 版本。为当前版本添加一个 git 标签,将最新版本部署到 pypi,并支持您的用户锁定该版本。
确保您记录了迁移到 Python 3 的当前状态。通常这是通过问题跟踪器来完成的,例如 Github 或吉拉的内置跟踪器。
首先确保你可以执行测试,测试覆盖率是好的(参见单元测试系列)并且总体风格是好的(参见清单 todo)。建立一个 CI / CD 管道。
打印报表
在 Python 2 中,您可以编写打印语句:
print "hello world"
在 Python 3 中,您必须编写打印函数:
print("hello world")
幸运的是,在 Python 2 中还可以有打印功能。令人困惑的是,它的行为方式并不相同:
py2>>> print(1, 2, 3)
(1, 2, 3)
py3>>> print(1, 2, 3)
1 2 3
您需要导入后端口打印函数,以使 Python 2 函数的行为类似于 Python 3 函数:
py2>>> from __future__ import print_function
py2>>> print(1, 2, 3)
1 2 3
注意,我没有使用print_function——我只是导入了它。
应用这个小变化很繁琐,但是您可以使用 2to3 来完成:
$ pip install 2to3
$ 2to3 --fix=print .
保持 Python 2 的兼容性
你应该有一个在一段时间内以完全相同的方式适用于 Python 2 和 Python 3 的版本。对于有很多依赖项的更大的项目,如果它们能够逐步向前推进,那将是一个很大的帮助。
Python 3 移动/重命名了标准库的一部分。这破坏了与 Python 2 的兼容性。但是,解决方法很简单:
try:
from urllib.parse import urlparse, urlencode
from urllib.request import urlopen
except ImportError:
from urlparse import urlparse
from urllib import urlencode
from urllib2 import urlopen
更好的是兼容性库 6:
$ pip install six
six在 Python 2 和 Python 3 中都可以这样使用:
from six.moves.urllib.parse import urlparse, urlencode
from six.moves.urllib.request import urlopen
当您编写代码只是为了保持对旧版本的支持时,请确保添加一个容易找到的字符串。类似于“对 Python 2 的支持”
迭代器
当您调用range(10)时,Python 2 创建一个列表,而 Python 3 为相同的代码创建一个 range 对象。在一些罕见的情况下,您实际上需要这个列表,因此需要将它改为list(range(10))。
输入和原始输入
Python 2 有[input](https://docs.python.org/2/library/functions.html#input)和[raw_input](https://docs.python.org/2/library/functions.html#raw_input),而 Python 3 只有[input](https://docs.python.org/3/library/functions.html#input)。Python 2 的 raw_input 类似于 Python 3 的输入。
除法和舍入
如果将/应用于两个整数,Python 2 会给你一个整数除法。Python 3 的结果是给你一个浮点数。您仍然可以使用在 Python 2 和 3 中都有效的//进行整数除法:
>>> 1 / 2
# Python 2: 0 vs Python 3: 0.5
x.5处的舍入行为也发生了变化:
- Python 2 :如果两个倍数同样接*,则从 0 开始舍入
- Python 3 :如果两个倍数相等,则向偶数方向舍入
>>> round(2.4)
# Python 2: 2.0 vs Python 3: 2>>> round(2.5)
# Python 2: 3.0 vs Python 3: 2>>> round(2.6)
# Python 2: 3.0 vs Python 3: 3
在 Python 2 和 3 中有方法获得相同的舍入行为。
Unicode 和字符串
Unicode 在 Python 2 中是个大麻烦,在 Python 3 中变得简单多了。Unicode 支持是后来才添加到 Python 2 中的。在 Python 2 中,Unicode 字符串和字符串是有区别的。本质上,字符串是包含 ASCII 的字节对象:
>>> a = u"abc"
>>> type(a)
<type 'unicode'>>>> b = "abc"
>>> type(b)
<type 'str'>>>> c = b"abc"
>>> type(c)
<type 'str'>>>> ord('ö')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: ord() expected a character, but string of length 2 found>>> 'ü'[0]
'\xc3'
>>> 'ü'[1]
'\xbc'
在 Python 3 中,情况是一样的:
>>> a = u"abc"
>>> type(a)
<class 'str'>>>> b = "abc"
>>> type(b)
<class 'str'>>>> c = b"abc"
>>> type(c)
<class 'bytes'>>>> ord('ö')
246>>> 'ü'[0]
'ü'
我可以写很多关于 Unicode 和字符串表示的内容,但为了保持简洁:
- Python 2
u"somethin"与 Python 3"something"或u"something"相同 - 我不会用
from __future__ import unicode_literals。你可能想阅读更多关于 unicode_literals 的内容。
[## unicode 在 Python 内部是如何表示的?
感谢贡献一个堆栈溢出的答案!请务必回答问题。提供详细信息并分享…
stackoverflow.com](https://stackoverflow.com/q/26079392/562769)
纯 Python 和万向轮
wheel 文件是分发 Python 代码的一种形式。如果 Python 代码没有 C 扩展,它就被认为是纯的。如果纯 Python 代码兼容 Python 2 和 Python 3,并通过 wheel 文件分发,那么这个文件就叫做universal。它应该可以在每台装有 Python 版本的机器上运行。
你应该总是以源代码分发和轮分发的形式分发你的代码。如果可以,试着创作并发布一个万向轮。
创建版本支持策略

塞巴斯蒂安·赫尔曼在 Unsplash 上拍摄的照片
库创建者需要决定他们想要支持哪些 Python 版本。较新版本的 Python 拥有您想要的杀手级特性,支持所有版本需要大量时间。使你想要支持的版本和你何时想要停止支持变得透明。最好将它与更大的项目联系起来,例如最* 3 个主要的 Python 版本。
你也应该知道 Python 的发布周期在 PEP-602 中被改变了。
NEP-29 是 NumPy 的版本支持政策,希望所有的科学 Python 包也能遵循它。
移除 Python 2 兼容性

JESHOOTS.COM在 Unsplash 上拍照
支持 Python 2 意味着您需要添加额外的代码,并且可能无法使用新 Python 版本的一些致命特性。
当您删除对 Python 版本的支持时,在一次 git 提交中完成,这样更改就很清楚了。搜索该字符串:
$ grep -rnI "support for Python 2"
用新东西!
Python 3 有一些非常酷的特性,你应该尽可能地使用它们。迁移到 Python 3 打开了一个全新的世界:
[## Python 版本的黑仔要素
了解当您支持旧的 Python 版本时,您错过了什么:Python 2.7 到 3.5、3.6、3.7、3.8 和 3.9
medium.com](https://medium.com/python-in-plain-english/killer-features-by-python-version-c84ca12dba8)
[pyupgrade](https://github.com/asottile/pyupgrade)可以帮助你使用新型语法,例如:
dict((a, b) for a, b in y) # -> {a: b for a, b in y}
'%s %s' % (a, b) # -> '{} {}'.format(a, b)
这样做并不是绝对必要的,但它使您的代码更现代、更易读。
分叉项目
我很幸运,propy 的维护者欢迎这些变化。然而,有了自由软件,你就不会被维护者的支持所束缚。您可以简单地创建一个所谓的 fork: 您控制的原始项目的副本。

Scipy 有 3000 多把叉子。马丁·托马斯 Github 截图
对于自由软件来说,分叉一直都在发生。这也是一种开发模式,独立开发人员在他们的副本(他们的分支)中进行更改,并创建一个合并请求(Github 称之为 pull request (PR))。
您也可以将您的 fork 上传到 pypi,但是请只在您想要维护该 fork 并继续独立开发时才这样做。
元类
还有一些主题,比如元类和异常范围,我还没有涉及到。如果你需要的话,我推荐这个由麦克·米勒写的教程:
Anders hov mller 也写了一篇关于这个话题的有趣文章。查看他的“生产中的惊喜”部分!
[## 将大量旧代码转移到 Python3
**我已不再使用介质。新地址是 kodare.net * *
medium.com](https://medium.com/@boxed/moving-a-large-and-old-codebase-to-python3-33a5a13f8c99)
TL;DR:我如何从 Python 2 迁移到 Python 3?
- 获得专业的 Python 2 设置
- 转到您的代码库支持 Python 2 和 Python 3 的状态
- 让它运行一段时间,确保它的工作
- 移除 Python 2 支持
相关资源
- Mike Müller: 从 Python 2 迁移到 3 ,PyCon US2020。
- protpy 是我搬的图书馆。我创造了 propy3 。
我如何从物理学转向数据科学
原文:https://towardsdatascience.com/how-i-moved-from-physics-to-data-science-457340e39902?source=collection_archive---------4-----------------------
我一年从物理到数据科学的一步一步。

照片由 卢卡斯 发自 Pexels
介绍
在我之前的帖子中,我分享了物理学毕业生可能的职业道路,其中之一是成为一名数据科学家。来自学术界和其他工业领域的许多人都有同样的想法。为了满足这种需求,开设了数百门课程,互联网上充斥着帮助你进入数据科学世界的学习材料(就像这里或者这里)。问题是:这可能太多了。
让我们假设我们很忙,很懒,很笨,所以我们没有时间和精力去消耗所有的在线学习材料。对于想在一年内找到一份数据科学工作的人来说,查看这些资源以找到从哪里开始以及何时停止可能会令人不知所措。因此,在这篇博客中,我将分享我从一名物理学博士生转变为一名数据科学家的具体步骤。
免责声明:我现在的职称其实是机器学习工程师,工作范围非常类似于数据科学家。机器学习和数据科学之间的差异将是另一个故事。
物理学和数据科学之间的兼容性
在采取任何行动之前,第一步是准备好心态。
数据科学是一个涉及数学、编程和领域知识的多学科领域,而被认为最适合计算机科学专业的学生。那么,物理学出身的人可以兼容吗?答案是大大的是的。不信,我们来看看一个物理学家典型的日常工作,和一个数据科学家比较一下。

物理学家和数据科学家的工作范围
你没看出来吗?这两个家伙做 一模一样的事情。唯一的区别是它们使用不同的数据集。因此,如果你的物理研究做得不错,很可能你已经具备了成为数据科学家所需的技能。但是在你解决某些问题之前,你还不能成为一个人:
- 你的数据科学技能不够犀利。一个物理学家,既要做实验又要做数据分析,往往在电子/机械工程、数据科学、数学等方面比较擅长..但是没有一个是优秀的。你需要停止做一个万事通,把注意力放在真正重要的技能上。
- 你有技能,但缺乏领域知识,你需要这两者来成为一名优秀的数据科学家。这里的知识是指对不同机器学习/统计算法的理解,以及如何使用它们。
- 别人不知道你拥有这样的技能。在许多招聘经理看来,数据科学仍然更适合计算机科学专业的学生,而物理专业的学生应该坚持学物理。你需要一些东西来证明你的技能,让他们改变主意。
我的准备过程集中在解决这些问题上。
我成为数据科学家的一步一步
在距离我博士论文的截止日期还有 1.5 年的时候,我决定追求成为一名数据科学家的道路。减去 0.5 年找工作的时间,我只有整整一年的时间做准备。以下是我在那段时间里做过的事情:
1.加速博士进程
在我决定我的未来不会在学术界的那一刻,我开始加速我的博士工作。我把毕业所必需的现有项目打包,放弃了其他所有项目。我也和我的主管分享了我的计划,并请求他的支持。这一行动带来了两大好处:
- 确保了我的毕业能够顺利进行,没有拖延,没有挣扎,这样我就有时间在博士毕业的时候找工作了。
- 消除了所有关于留在学术界的第二个想法,没有回头看,所以我可以全力以赴争取一份数据科学的工作。
2.大量练习编码
数据科学,说到底,涉及到很多编程,是计算机专业的强项。因此,我需要升级这个技能来赢得与他们对抗的机会。
我通过使用 Python 来完成我的研究任务,而不是依赖第三方软件来练习编码。从控制设备、处理数据、建筑模拟到图形绘制,都是通过编码来完成的。用竞争性编程练习算法是很好的,但是我就是没有时间。
3.获取机器学习方面的知识

照片由 Pixabay 发自 Pexels
有许多在线资料支持这一目的。然而,知道我的时间有限,我没有在书本和课程上花太多时间。总体来说,我上了 2 门课:Udemy 上的 " 机器学习 A-Z" ,Coursera 上的 " 深度学习专业化" ,看了 2 本书: 《统计学习导论》 和 《用 Python 进行深度学习》 。
我自己的建议是:不要在数学上陷得太深,也不要试图从头开始编写算法。这将花费很长时间,而且没有任何实际意义。相反,我专注于理解直觉,每个算法的优缺点,以及可以使用哪个库来实现它们。获取知识的过程花了我前 5 个月的时间。
4.参与 Kaggle
对于初学者来说,Kaggle 是一个很好的*台,可以让他们找到如何解决机器学习问题的例子,并在学习的过程中进行实践。我开始了我的第一次比赛,从别人的作品中分支和调整。这对我掌握标准工作流程和流行库帮助很大。到第三次比赛的时候,我已经可以从头开始做所有的东西了(这里看我的代码)。
我在 Kaggle 的学习经历非常棒。不过,我是来 Kaggle 学习的,不是来爬排名的。经过 3 个月和 3 场比赛,我已经对数据处理、特征工程和模型构建有了足够的了解。呆得更久可以让我学到更多的技巧来提高我的排名,但这与我最初的目的不符。因此,在第四届比赛结束时,我离开了 Kaggle,开始从事我自己的数据科学项目。
5.做个人数据科学项目

照片由 明锐丹 上 下
“项目”这个词听起来可能有点花哨,但实际工作非常类似于 Kaggle 竞赛。不同的是,你自己决定做什么,在哪里找到数据,以及如何得到解决方案,没有太多参考他人的作品,也没有比较的排名。
在申请数据科学工作时,做自己发起的项目并将它们上传到你的博客或 Github 有很多好处:
- 如今,每个人都参加在线课程,所以在简历上列出那些课程或学位不会给任何人留下印象。相反,个人项目会帮助你脱颖而出,向雇主证明你确实拥有他们需要的技能。
- 在许多公司,申请人被要求完成一项带回家的任务,这类似于一个迷你数据科学项目。在你自己的意志中工作过会让你有经验和信心轻松通过这一轮。
- 在很多面试中,重点会放在你简历上写的东西上。一个项目会成为你讨论的好话题,并以你的技能和知识给面试官留下深刻印象。
总的来说,我做了 3 个数据科学项目:一个是经典机器学习(这里见代码),另一个是计算机视觉(这里见代码),然后一个是自然语言处理(NLP)(这里见代码)。回顾过去,我认为我应该只关注一个特定的领域,比如 NLP。这样做有助于我更深入地了解那个领域,并使我的个人资料更加一致。无论如何,数据科学家的角色可能只关注这三个领域中的一个。********
我完成第三个项目的时间正好是我开始学习数据科学的一年。*均来说,我每天花 2 个小时,加上周末来学习。我的知识还不扎实,离完整还很远,但这足以让我自信地写我的简历并发出申请。
结论
简而言之,以下是我为从物理学转向数据科学所做的准备工作:
- 有正确的心态
- 无论我在做什么,都很快很好地完成了
- 练习编码
- 通过书籍和 MOOCs 获得机器学习知识,但不要停留在那里超过 6 个月
- 通过 Kaggle 和自我启动的项目实践我所学到的东西
学习新事物从来都不容易,但数据科学不是火箭科学。我希望从我的故事中,你能对成为一名数据科学家的道路有一个实际的看法。我相信,有信心,有激情,有努力,你一定能做到。
我如何优化我的数据分析实践——您应该开始使用的技巧和库
原文:https://towardsdatascience.com/how-i-optimized-my-data-analysis-practices-hacks-libraries-you-should-start-using-3a7308b668da?source=collection_archive---------18-----------------------
有用的黑客和库的汇编,以加快您的分析

当我在写这篇文章时,我的显示器的一个镜头
所以,我最*一直在从事许多机器学习和数据科学项目。从我的经验中,我可以分享的一件事是,每次你接一个项目,在你到达项目中最吸引人的部分(至少对我来说)模型工程之前,你必须穿过这个不可避免的数据清理和争论的泥沼。
现在,为了让我的生活更容易,我开始寻找黑客、库、配置等。更有效地执行探索性分析。
在这篇博文中,我将分享一些我的发现/配置,它们可能会对你有用和有趣。
因此,我打算分两部分来讨论这个问题:
- Jupyter hacks 和
- 用于数据分析的有用库
Jupyter Hacks
既然要长时间使用 jupyter 笔记本,那就让成为你的工作空间吧,让它看起来更酷一点,这样你就能集中注意力,享受使用笔记本工作的乐趣。稍后,我们将看到一些技巧,可以帮助您加快分析速度。相信我,你会开始喜欢花时间在你的 jupyter 笔记本上。
如果你是 jupyter 笔记本的新手,这里有一个完整的指南,告诉你如何为数据科学建立一个完美的 python 设置:
[## 数据科学的理想 Python 环境设置
设置 python 环境以开始数据科学项目的指南。
towardsdatascience.com](/ideal-python-environment-setup-for-data-science-cdb03a447de8) [## 面向数据科学的 Jupyter 笔记本完全指南
Ipython 笔记本初学者指南
towardsdatascience.com](/the-complete-guide-to-jupyter-notebooks-for-data-science-8ff3591f69a4)
这里有一些你可能不知道的 Jupyter 笔记本黑客:
1. Jupyterthemes
已经厌倦了 Jupyter 笔记本单调的白色和灰色默认主题?好吧,让我们用 Jupyterthemes 给你的笔记本一个新的外观。一旦安装了 jupyter,您需要做的就是在您的环境中安装 jupyterthemes,使用主题:
pip install jupyterthemes
然后根据你想要的笔记本的氛围设置任何主题,这是我喜欢的深色主题和所有其他格式选项,感觉就像我在一个崇高的文本编辑器中工作。
在您环境中的终端中,键入:
jt -t monokai -f fira -fs 12 -nf ptsans -nfs 12 -N -kl -cursw 2 -cursc r -cellw 90% -T
-t为主题
monokai —主题的名称
所有其他描述在此给出。
重新启动您的 jupyter 笔记本电脑服务器,准备好迎接惊喜吧:

另外,如果您想回到最初的 jupyter 主题,请使用:
jt -r
2.注释掉代码(非常有名)
注释掉代码是每个开发人员/分析师都使用的最重要和最有用的实践之一,如果你不知道,有一个非常快捷的键盘快捷键。
如果你在 Mac 上点击cmd + /或者在 windows 上点击ctrl + /,选中的代码行将被注释掉。
就这么简单!
专业提示:在完成分析之前,总是注释掉代码块,而不是删除它们。
3.恢复已删除的单元格
我们都知道我们对恢复单元格内容的cmd/ctrl + z有多感激,但是如果你删除单元格本身呢?
假设您遵循了上述注释代码的规则,但是错误地删除了整个单元格,并且想要恢复它。我们也有一个捷径:
esc + z或转到Edit > Undo Deleted Cell
这将恢复你的细胞。
不客气!😃
4.%魔法命令(运行、存储、latex)
顾名思义,有一组命令拥有超自然的力量,这种力量可以拯救你,使你的头不会撞到墙上。
- %run —当你不得不在 jupyter 笔记本里面使用 python 脚本
example.py的时候,你会怎么做?复制粘贴全部代码?
这里有一个更智能的方法,您可以使用**%run**magic command 在笔记本中运行您的 python 脚本:
%run example.py
- %
%load example.py
- %%writefile — 要将单元格的内容写入文件并保存在当前工作目录中,可以像这样使用该命令:
%%writefile example.pydef delete_null_values(df):
df.dropna()
- %time — 这是一个非常有用的神奇命令,它返回运行该单元所花费的 CPU 执行时间。你可以这样使用它:

- %% script false — 有时候,您只想再次运行笔记本中的所有单元格,例如,除了一些单元格之外,您可能不想再次训练模型。使用此命令跳过单元运行:
%%script false
model.fit(x_train, y_train)
- %%latex — 这是我的救命稻草,因为我必须为我的数据科学线性代数系列编写大量的数学符号和公式。对于微分方程,可以如下使用:
%%latex
This is a differential equation: $\frac{du}{dt} and \frac{d^2 u}{dx^2}$

- 以下是 latex 的备忘单:
[## 乳胶纸
这是一张乳胶参考纸,适合写科学论文。请将建议发送至…
wch.github.io](https://wch.github.io/latexsheet/)
- %debug — 这是一个交互式调试器,可让您即时查看错误:
%debug
a = []
b = 50
a_len = len(a)
result = b/ a_len

- %lsmagic — 这是一些非常有趣的魔法“把戏”,所以你会想看看整个宝藏。
%lsmagic返回所有神奇命令的列表。到处玩!

有用的库
1。Dabl
Dabl 是一个受 sklearn 启发的数据分析基线库,它试图通过减少常见任务的样板代码来为初学者普及 ML。这是由Andreas Muellersci kit-learn 开发人员开发的项目,该库包含几个工具,可以轻松清理和检查您的数据,然后创建强大的基线模型。
让我们读取一个非常常见的 titanic 数据集,并尝试对其进行探索性分析。
让我们先用 dabl 清理数据:
import dabl# read a dataset
df = pd.read_csv("[https://gist.githubusercontent.com/michhar/2dfd2de0d4f8727f873422c5d959fff5/raw/23da2b7680e0c9e1fd831f05f53de3958f0d75fe/titanic.csv](https://gist.githubusercontent.com/michhar/2dfd2de0d4f8727f873422c5d959fff5/raw/23da2b7680e0c9e1fd831f05f53de3958f0d75fe/titanic.csv))# call the clean method and pass the dataframe to itdabl.clean(df, verbose=1)

检查类型现在,让我们尝试使用已清理的数据帧中的 detect_types 来检测类型:
data_types = dabl.detect_types(df_clean)
print(data_types)

使用 dabl 的绘图功能可以查看模式和高级绘图:
dabl.plot(df_clean, target_col="Survived")

很神奇,对吧?
您还可以创建一个简单的分类器基线模型:
survivor_classifier = dabl.SimpleClassifier(random_state=0).fit(df_clean, target_col="Survived")

花一些时间在 dabl 上,你会喜欢用它来完成你所有的探索任务。
2。表情
你在处理文本数据集的时候遇到过表情符号吗?情感分析需要理解这些表情符号,因此需要对数据中的表情符号进行预处理。你可能知道,表情符号是人类面部表情的一种表现。
假设你有一个如下的句子:
sentence = “it's a sunny day ☀️, let's go fishing! 🐟”
现在,为了从句子中提取表情符号,您可以使用表情库,如下所示:
sentence = "it's a sunny day ☀️, let's go fishing! 🐟"
emot.emoji(sentence)

3。缺失编号
这些数据去了哪里?!!缺少的值总是一件棘手的事情。在使用其中一种输入方法之前,了解缺失值的类型总是很重要的。
Missingno 提供了一种快速而有用的方法来可视化这些值。
使用相同的 titanic 数据,您可以首先通过检查空值来可视化这些值:
df.isnull().sum()
然后您可以导入missingno并使用 bar 和 matrix 函数来可视化那些丢失的值。
! pip install missingno
import missingno as mi # pass the dataframe to the
mi.bar(df, figsize=(12,8))

矩阵函数:
mi.matrix(df, figsize=(12,8))

你可以自己看到在性别,客舱和登船栏中缺失的价值。
4。骗子
就像 web 开发和 UI/UX 中的 Lipsum 文本一样,我们有这个 Faker 库,它可以创建假数据供您使用。你可以创建假用户,电子邮件地址,家庭地址,地理坐标,网址,个人资料等。你可以创建不同类别的数据集,点击这里。
安装并导入 faker:
! pip install Faker
from faker import Faker
创建一个实例并检查假名称:
fake = Faker()
fake.name()

fake.text()

创建尽可能多的假地址或 URL:
for _ in range(10):
print(fake.address())

继续玩下去,并在前进的过程中创建一些有用的数据集。查看的文件。
5。数字器
我偶然发现了一个当地银行的数据集,其中有一个单独的文件,里面有文本数字形式的金额。我偶然发现了这个将自然语言数字转换成整数和浮点数的库。这原本是一颗红宝石的编号器。
从 numerizer 安装并导入 numerize:
!pip install numerizer
from numerizer import numerize
通过对一些文本数字进行编号来尝试:
numerize('forty two')
numerize('twenty one thousand four hundred and seventy three')
'21473'

很有趣,对吧?不是这个。在接下来的部分中,我还会继续介绍许多其他的技巧和库,但是现在,这里有一个到资源库的链接,您可以使用它:
[## dswh/pro _ 数据 _ 分析
汇编技巧、提示和库以加速您的数据分析任务——dswh/pro _ data _ analysis
github.com](https://github.com/dswh/pro_data_analysis)
如果你喜欢看我在我的系统上尝试这些库和工具:
有了这些库和工具的解释,从现在开始我把它留给你的想象力。制作一些有趣的东西,并在下面的评论中分享链接,如果我觉得有趣,我会在我的频道上的下一个视频中喊出你的名字。
数据科学与 Harshit
查看我如何通过 TensorFlow 开发人员考试,以及您如何也能通过考试!
通过这个渠道,我计划推出几个涵盖整个数据科学领域的系列。以下是你应该订阅频道的原因:
- 这些系列将涵盖每个主题和子主题的所有必需/要求的高质量教程,如 Python 数据科学基础。
- 解释了数学和推导为什么我们在 ML 和深度学习中这样做。
- 与谷歌、微软、亚马逊等公司的数据科学家和工程师以及大数据驱动型公司的首席执行官的播客。
- 项目和说明实施到目前为止所学的主题。
我如何在不到 3 周的时间内通过云提供商认证考试
原文:https://towardsdatascience.com/how-i-passed-a-cloud-provider-certification-exam-in-less-than-3-weeks-6b0fc65fb3ba?source=collection_archive---------30-----------------------
这不容易,但值得。

Avel Chuklanov 在 Unsplash 上拍摄的照片
去年 12 月 23 日,在 AWS 持续工作了大约三周后,我参加了 DevOps 工程师专业考试的第一次模拟考试。取得了可观的分数后,我决定在决定是否参加真正的考试之前,再努力学习一周。一周后,我把考试安排在 1 月 8 日。如果我通过了,那就意味着在不到三周的时间里,我已经从一个相对新手变成了 AWS 提供的两个专业等级认证中的一个。
正如你可以从标题中看出的,我确实通过了考试,回顾过去,我的成功至少部分是由于我想分享的一些深思熟虑的策略。其中大部分(如果不是全部的话)是普遍适用的,因为它们可以很容易地用于获得其他认证,无论是在 AWS 生态系统还是其他系统中。
提醒:如果你正在寻找快速简单的提示,这里不是你能找到的地方。这次考试是我自大学以来参加的最难的考试之一(让我告诉你,即使在这种情况下,它也和有机化学一样,是医学生众所周知的入学门槛)。这里没有捷径可走;如果你想实现我所做的,在我所做的时间里,你需要非常努力地工作。为了与认证协议保持一致,我显然也不会分享关于考试本身的具体细节。
事不宜迟,以下是我的建议。
使用行之有效的学习方法
大多数人认为以下是学习的好方法:
- 阅读
- 突出相关段落
- 复习笔记
- 观看培训视频
事实上,假设你的目标是真正记住你试图学习的知识,这些都是你可以学习的最糟糕的方法。
在 2009 年发表的一项研究中,科学家艾米·卡伦德和马克·麦克丹尼尔表明,阅读(包括重复阅读)对提高阅读信息的后续测试的性能几乎没有好处。
在《坚持:成功学习的科学》一书中,作者(其中一人是上述研究的贡献者)展示了无提示回忆(即试图记住如何在不使用选择题的情况下回答问题)实际上是学习和保留新信息的最有效方式之一。
是的,没错:好的旧抽认卡实际上比回顾你的笔记和重点更有效。为此,我为考试学习的方法之一是使用免费的在线工具 Quizlet,,它允许你创建一副抽认卡,并使用各种方法来复习它们(提示:“学习”模式可能是我发现的最好的方法)。如果你喜欢,请随意使用我的卡牌;这当然对我有好处。
也许与直觉相反,知道你是否在使用有效的学习方法的一个好方法是你是否发现这个过程很难。在同一本书中,作者指出,在整个学习过程中犯错误实际上是一个好现象,因为只有通过重复犯这些错误和练习回忆信息,这些信息才会被正确地编码到你的记忆中。我的经历证实了这一点,因为就在我考试的前一天,我在模拟考试中得了一些相当糟糕的分数;尽管如此,我还是以很大的优势通过了考试。关键是:如果你发现这个过程很难,并且犯了错误,不要认为这是你没有进步的迹象。
说到模拟考试,它们绝对应该是你学习的一部分。就我个人而言,我使用了 WhizLabs,这证明足以满足我的需求。我还建议参加 AWS 自己的实践考试(如果你通过了以前的认证,就像我通过了 AWS 解决方案架构师助理的认证一样,你甚至可以获得一个补充的代码),虽然很短,但会给你一个很好的实际测试问题措辞方式的演示。
使用外部资源
虽然我学习的主要来源是 AWS 文档,但我利用了两个外部课程来帮助我完成所有内容。原因是,至少在我的情况下,AWS 文档虽然非常全面,但由于其大小而有点令人不知所措。我经常发现自己陷入兔子洞,这对于我在最短的时间内通过考试可能没有什么用处。只是要注意,这些都不是附属链接,我没有皮肤推荐他们,除了我认为他们肯定会加快你准备考试的进展。
第一个是一直很受欢迎的 ACloudGuru,它很好地概述了与考试相关的各种主题,帮助我知道应该关注哪些领域。虽然它缺乏通过考试所需的复杂细节,但教师在介绍中对此很明确。
我使用的第二个外部资源是夏羽·马瑞克在 Udemy 上的 AWS DevOps 工程师专业课程。相比之下(就其本身而言),这是非常详细的。要知道,如果你真的购买了它,要完全完成它将需要大量的时间,尽管花的时间是值得的。
这里的要点是:利用高质量的第三方内容是充分利用有限时间的一种极好的方式,如果你想在短时间内通过考试,这一点非常重要。
做实际练习,但不要太多
了解如何使用 AWS 技术实际实现常见场景是备考的一个非常重要的部分。至少从我的经验来看,DevOps 工程师专业认证是为了让你做好进入战壕和完成实际工作的准备,而不是像其他认证那样更倾向于整体设计和架构。因此,实践各种相关技术的实际使用是一种很好的准备方式,但是不要做得太过火。有了这么多的选择,特别是如果你像我一样是一个内心的建设者,很容易花大量的时间去创造,而实际上你应该同样专注于事实的纯粹记忆。
获得大量实践经验的两个好方法是:
- 遵循 AWS 文档中给出的教程。
- 完成我之前提到的第三方课程中的“实验室”练习。
只做够及格的,不要再多了
让我们实际一点:没有人会关心你考试得了多少分;如果你通过了,那么你就可以展示徽章,并要求相关的吹嘘权利,无论你的分数是勉强及格还是完全及格。正因为如此,尤其是在短时间内,你必须遵守纪律,不要在你已经有足够的知识通过考试的领域花费过多的时间。
这里有一个我亲身经历的例子。我碰巧非常喜欢无服务器和容器,所以我非常喜欢学习 AWS Lambda 和弹性容器服务,这两个都在考试中。因此,我很容易花更多时间钻研这些领域,但会牺牲其他不太有趣但同样重要的研究领域,如 EC2 自动缩放。
这就是像抽认卡和练习测试这样的东西非常有用的地方,因为它们可以帮助你衡量你的薄弱环节,因此需要重点关注。如果你一直在回答某个特定主题领域的问题,并且回答得足够好,可以跳过这一部分,那就不要在这些领域花更多的时间。考试涉及的题目非常广泛,最好在各个领域都有足够的知识。
结束语
我被问了好几次,除了更多的就业机会和更高的可信度这些明显的好处之外,为通过考试而付出的努力是否值得。我的答案是压倒性的是!毫无疑问,我的研究给了我大量实际应用的知识,其中一些我已经在 AWS *台的 DevOps 工程师的日常工作中得到了很好的利用。
虽然这无疑是一次紧张的经历(在我通过考试后,我告诉我的老板我的大脑受伤了,我是认真的),但这也是一个很好的方式来快速吸收关于如何在 AWS *台内最好地遵循 DevOps 实践的广泛知识。如果你愿意提前付出努力(并得到老板和配偶的支持),你完全没有理由不能做同样的事情。
我是如何通过 2020 年谷歌专业数据工程师考试的
原文:https://towardsdatascience.com/how-i-passed-google-professional-data-engineer-exam-in-2020-2830e10658b6?source=collection_archive---------1-----------------------
八天后。给那些没有时间阅读手册的人的快速学习指南。2020 年 8 月。

谷歌云认证专业数据工程师
想获得该认证吗?这并不容易。你需要做作业。据我在网上读到的,人们通常花 2-3 个月来准备。
众所周知,我们中的许多人不会每天都使用谷歌的每一款产品,但我们需要了解它们,对吗?这篇文章是写给那些没有时间阅读所有手册的人的。我将描述我在 8 天内为准备这次考试做了什么。
首先我需要说的是,我不知道那场考试到底有多严肃。考试问题比我所知道的任何在线课程问题都要复杂和不同。因此,如果你没有任何开发背景,请慢慢来,阅读书籍,做教程。
通过测试用了 1 小时 35 分钟。尽管每个考试问题都完全一样。
“为什么我选择这样对自己?”
在第三个问题之后,我有一种强烈的感觉,我什么都不知道。当我告诉每个人我要参加这次考试时,我真的很害怕。给你一点建议——不要给自己太大压力。不要告诉你的老板或女朋友。如果你失败了,你可以在两周内再次参加考试。我想我通过了,只是因为我是一个幸运的家伙,那天穿着我的幸运 t 恤。在我提交了最终答案后,我马上看到了考试结果。这是一个“通行证”。我的证书和一件帽衫的促销代码下周就要到了。
推荐阅读
有一本【2020 年 5 月的书,一本官方 Google Cloud 认证专业数据工程师学习指南作者 Willey。这是 40 美元,它有一个目录,给出了对考试题型的基本理解。买不买由你决定。你可能只是想熟悉一下内容,这就足够了。
准备
第一天
我从模拟测试开始。对于这项任务,有大量的在线课程。我在下面给出了一些帮助我做好准备的概述。长话短说,如果你不想浪费时间,就从测试开始吧。
谷歌有一个模拟考试,我做了,但没有通过,但我知道问题看起来到底是什么样的。它为您提供了认证考试中可能遇到的问题的格式、级别和范围。

模拟考试—谷歌专业数据工程师
然后就是 Linux 学院实践考试。
最*,他们确实从一位云专家那里移植了一些课程,其中包括谷歌专业数据工程师课程!这个课程本身会比他们*台上的课程更新,但你仍然可以在这里查看他们的数据工程师课程谷歌云认证专业数据工程师(LA) 。更新为最新的 2019 年 7 月考试目标。
第一个是免费的! 所以去解锁挑战吧。第二次注册后,你将有两次免费练习的机会。
而且他们有一本随手可得的课程书(免费):Linux Academy 编写的 Google Cloud 专业数据工程师考试手册 :范围内主要概念汇总。
第二天
第二天,我开始构思如何处理案例研究,考试结构和问题是什么。我开始关注像经济实惠、性价比高、尽快等词。这些类型的关键词通常定义了正确的答案,因为在考试中,你可以找到多个在技术上满足要求的答案。
第 3-5 天
我一天做两次模拟考试,偶尔阅读与我不知道的主题相关的谷歌文档。我骑自行车的时候在健身房做早操。30-40 分钟足够做模拟考试了。还有一项研究表明适度的有氧运动可以改善认知功能。我发现它非常有用,有氧运动听起来不再痛苦了。我在学习。
第 6–8 天
我一天做了两次模拟考试,但现在我打开了两个浏览器标签,上面都是以前通过的模拟考试。每一个我不确定的问题,我都会马上检查并阅读文档。我认为这种策略有助于完善我的知识。此外,我开始记下一些特定产品的笔记,并将它们与我之前提到的关键词联系起来。
到了第七天,我的练习通过率至少达到了 90%。

谷歌认证数据工程师考试
如何通过考试?
这个问题没有通用的答案。在真正的考试中,我觉得我什么都不知道,问题似乎很难。然而,下面的策略对我很有效:
- 做模拟测试,了解问题的类型和结构。
- 了解产品特性
- 请注意问题关键词,因为它们通常定义了正确答案。
穿上你的幸运 t 恤或者任何你拥有的幸运物品。你需要这个。
4.阅读手册。这是可选的,但是非常有用。
阅读谷歌官方文档。至少有概述和案例研究。这些指南很棒,有你通过考试所需的所有信息。我从威利的专业数据工程师学习指南中查找了一个主题,然后在谷歌文档中搜索了这个主题。
大部分考题都是 案例分析 , 如何修复某物,设计一个流程,最佳实践或者关于机器学习 。
真正的考试是非常机器学习重。
典型问题。
确保解决方案质量。
案例研究和最佳实践问题。会有很多。
示例 1 : 您正在监视 GCP 操作(以前称为 Stackdriver)指标,这些指标显示您的 Bigtable 实例的存储利用率接*每个节点 70%。你是做什么的?
答 : 向群集中添加额外的节点,以增加存储处理能力。尽管云 Bigtable 表数据存储在 Google Colossus 中,但是集群需要适当地调整大小,以便节点有足够的资源来处理使用中的总存储。当每个节点的实例存储利用率达到 70%时,应添加额外的节点。
阅读:配额&限制|云 Bigtable 文档|谷歌云
示例 2: 您的组织最*刚刚开始使用 Google Cloud。公司中的每个人都可以访问 BigQuery 中的所有数据集,在他们认为合适的时候使用它,而无需记录他们的用例。您需要实现一个正式的安全策略,但是需要首先确定每个人在 BigQuery 中都做了什么。你这样做的第一步是什么?
答:使用 Stackdriver Logging 查看数据访问。Stackdriver 日志记录将记录每个用户操作的作业和查询的审计日志。查询槽不起作用,因为它们测量 BigQuery 性能和资源使用情况,但是不提供对单个用户活动的可见性。您将无法通过计费记录查看用户活动。IAM 策略应用于数据集,而不是每个数据集中的单个表。此外,IAM 策略显示谁有权访问资源,但不显示他们的活动。
阅读: BigQuery 文档|谷歌云
例 3 :您的安全团队已经决定您的 Dataproc 集群必须与公共互联网隔离,并且没有任何公共 IP 地址。你如何实现这一点?
回答:使用-no-address 标志将会阻止公共 IP 被分配给云 Dataproc 集群中的节点。但是,子网仍然需要私有的 Google 访问权限来访问某些 GCP API。
阅读 : Dataproc 集群网络配置| Dataproc 文档
探索谷歌推荐的最佳实践
- 大查询:https://cloud.google.com/bigquery/docs/best-practices
- 堆栈驱动和记录:https://cloud.google.com/products/operations
- BigTable:https://cloud.google.com/bigtable/docs/performance
- IAM 和安全:https://cloud.google.com/iam/docs/concepts
- 云存储:https://cloud.google.com/storage/docs/best-practices
毕竟,我建议阅读所有数据库产品的概述,因为会有很多关于它们的问题:https://cloud.google.com/products/databases
设计数据处理系统
示例: 一位客户在数据中心运行一个 400GB 的 MySQL 数据库。将该数据库迁移到 GCP 的最佳方法是什么?
回答 : 为 MySQL 二代实例创建云 SQL,并迁移数据。对于这种规模的 MySQL 数据库,推荐使用云 SQL for MySQL 实例。使用计算引擎会增加额外的运营开销。Postgres 和 Spanner 不适合作为 MySQL 数据库的迁移主机。
推荐阅读: 从 MySQL 迁移到云 SQL | Solutions | Google Cloud
选择谷歌数据库产品

选择谷歌数据库产品
例子:你的数据库大小是 500 GB。数据是半结构化的,不需要完全原子性。你需要在谷歌云*台上的销售点应用程序中处理交易?您需要考虑用户的指数级增长,但又不想管理基础设施开销?
使用数据存储
示例:数据超过 1 Tb,要求低延迟(您可能也不关心成本):
使用 BigTable
低延迟不需要和/或需要运行 ANSI SQL 分析并经济地执行?需要方便地从 CSV 和 JSON 加载数据,以便以后用 SQL 检查?
使用 BigQuery 。云数据存储支持 JSON 和类似 SQL 的查询,但不能轻松接收 CSV 文件。云 SQL 可以从 CSV 读取,但不容易从 JSON 转换。云 Bigtable 不支持类似 SQL 的查询。
你正在 Google Cloud 上设计一个关系型数据仓库,以便按需增长。数据将在事务上保持一致,并从世界上的任何位置添加。您希望监控和调整输入流量的节点数,输入流量可能会出现不可预测的峰值。
使用云扳手****
你需要强一致性事务?数据小于 500 Gb?数据不需要流或实时?
使用云 SQL****
请注意:
****高可用性和高性能以及类似故障转移和读取副本的功能。
毕竟有很多重大问题。
请注意:
开发和生产实例、磁盘类型(HDD 与 SSD)。
****BigTable 性能示例:您的组织将部署一批新的物联网设备,预计写入 BigTable 实例的峰值为每秒 50,000 次查询。您已经优化了行键设计,需要设计一个能够满足这一需求的集群。你是做什么的?
****回答:一个优化的 Bigtable 实例,一个设计良好的行键模式,理论上可以支持每个节点每秒 10000 个写查询,所以需要 5 个节点。
阅读 : 了解云 Bigtable 性能
****BigTable 性能示例:您被要求调查一个性能很差的 BigTable 实例。表中的每一行代表来自物联网设备的一条记录,并在各自的列中包含 128 个不同的指标,每个指标包含一个 32 位整数。如何修改设计以提高性能?
****回答:大量单元格排成一行会导致云 Bigtable 性能下降。当数据本身很小时,就像在这个场景中,简单地从一个单元格中检索所有指标,并在单元格中使用分隔符来分隔数据会更有效。行版本控制会沿着表中效率最低的维度创建最多的新条目,从而使问题复杂化,而 HDD 磁盘总是会减慢速度。
阅读 : 了解云大表性能
****BigTable 性能示例:您的生产 BigTable 实例当前使用四个节点。由于表的大小增加,您需要添加额外的节点来提供更好的性能。您应该如何在没有数据丢失风险的情况下实现这一点?
****回答:编辑实例细节,增加节点数。保存您的更改。数据将在不停机的情况下重新分发。您可以在 Bigtable 中添加/删除节点,而无需停机。
阅读 : 云大表概述|云大表文档
****BigTable 性能示例:您当前有一个 BigTable 实例,一直用于运行开发实例类型的开发,使用 HDD 进行存储。您已经准备好将开发实例升级到生产实例,以提高性能。您还希望将存储升级到 SSD,因为您需要实例的最高性能。你该怎么办?
****答:您不能更改现有 Bigtable 实例上的磁盘类型,您需要将您的 Bigtable 数据导出/导入到具有不同存储类型的新实例中。您需要导出到云存储,然后再次返回到 Bigtable。
****BigTable 性能示例:您的客户使用了一个 BigTable 实例,其中包含两个用于区域灾难恢复的复制集群。来自应用程序的表事务需要高度一致。对于这种配置,您如何保证这一点?
****答:确定一个集群为主集群,使用指定单集群路由的应用配置文件。默认情况下,云 Bigtable 最终是一致的。为了保证强一致性,您必须使用应用程序配置文件将查询限制到实例中的单个集群。
阅读:复制概述|云 Bigtable 文档|谷歌云
阅读 : 云大表概述|云大表文档
****BigTable 性能示例:如果一个节点宕机,BigTable 实例中的数据会发生什么变化?
****答:没有,因为存储与节点计算是分开的。从 RAID 重建不是有效的 Bigtable 函数。存储和计算是分开的,因此一个节点宕机可能会影响性能,但不会影响数据完整性;节点仅将指向存储的指针存储为元数据。
阅读 : 云大表概述|云大表文档
****BigTable 性能示例:您正在监视 GCP 操作(以前称为 Stackdriver)指标,这些指标显示您的 BigTable 实例的存储利用率接*每个节点 70%。你是做什么的?
****答:向群集中添加额外的节点,增加存储处理能力。尽管云 Bigtable tablet 数据存储在 Google Colossus 中,但是集群需要适当地调整大小,以便节点有足够的资源来处理使用中的总存储。当每个节点的实例存储利用率达到 70%时,应添加额外的节点。
阅读:配额&限制|云 Bigtable 文档|谷歌云
****BigTable 性能示例:在 BigTable 实例中,以下哪一项不是选择 HDD 存储类型而不是 SSD 的有效理由?
回答 : Bigtable 可以与云存储集成,而不考虑实例使用的磁盘类型。选择 HDD 作为例外情况的其他原因是有效的,但一般来说,SSD 磁盘是首选,因为 HDD 磁盘将导致性能显著下降。
阅读 : 云大表概述|云大表文档
关系数据库问题
请注意:
副本、可用性和迁移指南。
****示例:您正在 Google Cloud 上设计一个关系型数据仓库,以便根据需要进行扩展。这些数据在事务上是一致的,可以从世界上的任何地方添加。您希望监控和调整输入流量的节点数,输入流量可能会出现不可预测的峰值。你该怎么办?
****回答:使用云扳手存放。监控 CPU 利用率,如果在您的时间跨度内利用率超过 70%,则增加节点数。
****例子:您的客户希望将一个 2TB 的 MySQL 数据库迁移到 GCP。他们的业务要求正常运行时间 SLA 超过 99.95%。你如何实现这一点?
****答:将数据库迁移到 Cloud SQL for MySQL 高可用性配置,在二级区域有一个备用实例。云 SQL 的标准 SLA 是 99.95%。通过在辅助可用性区域中使用具有故障转移实例的高可用性配置,可以实现超过这一时间的正常运行时间。故障切换副本不是一项功能,读取副本才是。冷备盘效率低下,因为它们不会自动切换,这与正确的高可用性配置不同。实现所需的 SLA 不需要计算引擎选项。
阅读 : 云 SQL 服务级别协议(SLA) |云 SQL 文档 高可用性配置概述|云 SQL for MySQL
很多关于 Pub/Sub,卡夫卡,开窗的问题。
请注意:
卡夫卡镜像,这两者的区别。
发布/订阅
Pub/Sub 处理来自全球的流量呈指数级增长的需求。Apache Kafka 将无法像 Pub/Sub 一样处理全球用户的指数增长。
云发布/订阅保证向每个用户至少发送一次消息。因为每个订单都需要通知多个系统,所以您应该创建一个主题并使用多个订阅者。发布/订阅不保证交付顺序,因此如果可能,请在发布系统中附上时间戳。
****改为:https://cloud.google.com/pubsub/architecture
****示例:贵公司的 Kafka 服务器集群无法根据数据接收需求进行扩展。流式数据接收来自世界各地。他们如何将这一功能迁移到 Google Cloud,以便能够为未来的增长进行扩展?
****回答:创建一个单独的发布/订阅主题。将端点配置为发布到发布/订阅主题,并将云数据流配置为订阅相同的主题,以便在消息到达时对其进行处理。
**[## 阿帕奇卡夫卡和谷歌云发布/订阅
大数据消息系统的一些竞争者是 Apache Kafka、Google Cloud Pub/Sub 和 Amazon Kinesis(不是……
www.jesse-anderson.com](https://www.jesse-anderson.com/2016/07/apache-kafka-and-google-cloud-pubsub/)**
安全、加密和密钥管理
****示例:您的组织有一个安全策略,要求安全部门必须拥有和管理存储在云存储桶中的数据的加密密钥。分析师和开发人员需要存储用这些密钥加密的数据,而不需要访问密钥本身。如何实现这一点?
****答:使用云 KMS 让安全团队在一个专门的项目中管理他们自己的加密密钥。授予云 KMS 加密密钥加密器/解密器角色,用于其他项目中云存储服务帐户的密钥。云 KMS 允许您创建和管理自己的加密密钥,这些密钥可由其他项目中的服务帐户使用。然后,这些项目中的开发人员可以访问服务,而无需访问底层密钥。不需要临时区域,也不需要安全团队进行任何其他手动干预。
阅读 : 使用客户管理的加密密钥|云存储|谷歌云

加密方法的比较。来源:Coursera
建立和运行数据处理系统
Dataproc
注意:
针对 Dataproc 工作负载的 HDFS 与谷歌云存储。
最佳实践 : Dataproc 集群最好是特定于工作的。如果您需要扩展,请使用云存储,因为 HDFS 不会很好地扩展,并且需要自定义设置。此外,谷歌建议使用云存储而不是 HDFS,因为它更具成本效益,尤其是在工作不运行的时候。
****阅读:https://cloud . Google . com/solutions/migration/Hadoop/Hadoop-GCP-migration-jobs
数据流
请注意:
PCollection分支、展*和连接、变换和滑动窗口。
- ****展*——可以使用 Beam SDKs 中的
Flatten变换来合并同类型的多个PCollection。 - Join —您可以使用 Beam SDK 中的
CoGroupByKey转换来执行两个PCollection之间的关系连接。PCollection必须是键控的(即它们必须是键/值对的集合),并且它们必须使用相同的键类型。
阅读:https://beam . Apache . org/documentation/pipelines/design-your-pipeline/
****开窗:
** [## 波束编程指南
Apache Beam 是一个开源、统一的模型和一组特定于语言的 SDK,用于定义和执行数据…
beam.apache.org](https://beam.apache.org/documentation/programming-guide/#windowing)
示例:你正在编写一个流云数据流管道,在将用户活动更新写入时序数据库之前,对其进行转换。当每个元素到达时不断地进行转换,您还需要在运行时依靠一些额外的数据来创建转换。你如何实现这一点?
回答:如果 ParDo 在处理 input PCollection 中的每个元素时需要注入额外的数据,那么 Side inputs 就很有用,但是额外的数据需要在运行时确定(而不是硬编码)。合并不会获得相同的结果,使用外部 shell 脚本是不必要的,也是低效的。
阅读 : 光束编程指南
示例:您需要设计一个管道,它可以从您的组织的应用程序指标以及您的用户数据库中接收批量数据,然后在输出到 BigQuery 之前使用一个公共键连接数据。最有效的方法是什么?
回答:创建一个云数据流管道,并在公共键上使用 CoGroupByKey 转换连接两个 PCollections。CoGroupByKey 对具有相同键类型的两个或多个键/值 p 集合执行关系联接;“常用钥匙”是这个问题中的神奇线索。
阅读 : 光束编程指南
示例: 您正在计算引擎上设置多个 MySQL 数据库。出于审计目的,您需要从 MySQL 应用程序中收集日志。您应该如何处理这个问题?
回答:在您的数据库实例上安装 Stackdriver 日志代理,并配置 fluentd 插件,以读取您的 MySQL 日志并将其导出到 Stackdriver 日志中。 Stackdriver Logging 代理需要配置 fluentd 插件来从数据库应用程序中读取日志。不是 Stackdriver 监控,不是 Cloud Composer。Cloud Composer 用于管理工作流,而不是日志记录。Stackdriver 监控对于测量性能指标和警报非常有用,但对于日志则没有用处。
阅读 : 关于日志代理|云日志|谷歌云
示例:您想要对当前生产中的云数据流管道进行更改,该管道从云存储中读取数据,并将输出写回到云存储中。在开发过程中测试变更的最简单和最安全的方法是什么?
答:使用 DirectRunner,利用本地计算能力,和一个分段存储桶,对流水线进行试运行。使用带有临时存储桶的 DirectRunner 配置是测试新管道的最快捷、最简单的方式,不会有更改当前生产中的管道的风险。
改为 : 直接流道
示例:您被要求调查一个性能很差的 Bigtable 实例。表中的每一行代表来自物联网设备的一条记录,并在各自的列中包含 128 个不同的指标,每个指标包含一个 32 位整数。如何修改设计以提高性能?
回答:使用分隔符将指标存储在一列中。确保群集正在使用 SSD 磁盘。一行中的大量单元格会导致云 Bigtable 的性能下降。当数据本身很小时,就像在这个场景中,简单地从一个单元格中检索所有指标,并在单元格中使用分隔符来分隔数据会更有效。行版本控制会沿着表中效率最低的维度创建最多的新条目,从而使问题复杂化,而 HDD 磁盘总是会减慢速度。
阅读 : 了解云大表性能
操作化机器学习模型
我从谷歌文档开始,因为我已经熟悉了 ML 的基本概念,但我认为官方的谷歌 ML 速成课程对考试非常有用。100%我应该先从这个开始。它有很多阅读内容和视频。
[## 机器学习入门|机器学习速成班
本模块介绍机器学习(ML)。预计时间:3 分钟学习目标识别实用…
developers.google.com](https://developers.google.com/machine-learning/crash-course/ml-intro)
每一部分都有一个小测验,这样你可以检查你的理解程度:

动态(在线)推理
这个考试真的是机器学习重。
例题:
示例 L1/L2 正则化 : 您正试图训练一个张量流模型,但您意识到您的一些输入特征对预测没有显著影响。您可以采用什么技术来降低模型的复杂性?
回答: L2 正则化在所有特征具有相对相等的权重/影响时更相关,这里不是这种情况。超参数处理学习率,与这个问题无关。 L1 正则化能够将不太重要的特征的权重降低到零或接*零。
阅读 : 为了简单而正规化|机器学习速成班
举例: 什么是过/欠拟合 以及如何修复。你正在训练一个面部检测机器学习模型。您的模型因过度拟合您的训练数据而受到影响。你能采取什么步骤来解决这个问题?

简单回答:修复欠拟合(例如,当你的模型在训练集上的均方根误差(RMSE)是在测试集上的两倍时。)增加模型的复杂性(引入一个额外的层或者增加词汇表的大小)。
模型过拟合时,预测训练数据很好,但在验证集上表现不佳。要修复过度拟合:减少特征的数量 ( 正则化),添加更多数据以增加样本的多样性并更好地概括您的模型,使用丢弃层或通过移除层或减少隐藏层中的元素数量来降低网络的容量。增加您的正则化参数也允许您减少模型中的“噪声”以减少过度拟合。
阅读:https://developers . Google . com/Machine-learning/crash-course/generalization/peril-of-over fitting还有这里:机器学习工作流程| AI *台|谷歌云
- 合成特征
简单回答:
一个 特征 不存在于输入特征中,而是从一个或多个输入特征中创建的。合成特征的种类包括:——将一个连续的特征存储到范围仓中。-将一个特征值乘以(或除以)其他特征值或自身。—创建一个 特征交叉 : 一个 合成特征 通过交叉(取一个笛卡尔积)单个二元特征形成。特征交叉有助于表示非线性关系。
示例 Google 机器学习 API:您正在开发一个应用程序,该应用程序只能识别并标记图像中特定的 B2B 产品徽标。您没有使用机器学习模型的广泛背景,但需要让您的应用程序正常工作。目前完成这项任务的最佳方法是什么?
****答:使用 AutoML 视觉服务,通过视觉 API 训练定制模型。Cloud Vision API 可以识别常见的徽标,但自己很难找到特定的业务徽标。最好的选择是 AutoML,它允许您采用预先训练的 Vision API,并将其应用于自定义图像。从头开始创建一个定制的 ML 模型是非常耗时的,当您可以在现有的模型上构建时,这是没有必要的。
阅读 : 云自动 ML 视觉
****示例:您需要快速为您的应用程序添加功能,使其能够处理上传的用户图像,提取图像中包含的任何文本,并对文本执行情感分析。你该怎么办?
****回答:调用云视觉 API 进行光学字符识别(OCR)然后调用自然语言 API 进行情感分析。用于 OCR 的云视觉 API 是从用户上传的图像中提取的最快方法。自然语言 API 已经有了一个内置的情感分析模型。
阅读 : 检测图像中的文本|云视觉 API |谷歌云 分析情感|云自然语言 API |谷歌云
****示例:您正在开发一个移动应用程序,它允许食品加工企业检测出变质的水果。仓库的工作人员将使用移动设备对水果进行拍照,以确定是否应该丢弃。您可以使用哪些 GCP 服务来实现这一目标?
****答:用已经变质的水果的标签图像训练一个自动视觉模型。使用 ML 套件中的 AutoML Vision Edge 将定制模型部署到使用 ML 套件客户端库的移动设备。AutoML 视觉服务是使用图像数据训练自定义分类模型的最快方法,ML 工具包中的视觉边缘将允许模型部署到 Android 和 IOS 设备。为了训练模型,必须对图像进行标记。不需要使用 Kubernetes 引擎或 App 引擎。
阅读: AutoML Vision API 教程|云 AutoML Vision |谷歌云
****示例:您有大量图像希望通过自定义自动视觉模型进行处理。时间不是因素,成本才是。你应该采取哪种方法?
****回答:使用 batchPredict 方法对整批图像进行异步预测请求。批量预测通常比同步(在线)预测提供更低的每次推理成本和更高的吞吐量。但是,批量预测会产生一个长时间运行的操作(LRO),这意味着只有在 LRO 完成后结果才可用。
阅读 : 批量预测|云自动视觉|谷歌云
ML 产品
这个是一个完整的列表,很容易找到所有文档。只需浏览概述和用例部分。

视觉人工智能用例
****语音转文本 API 最佳实践**:【https://cloud.google.com/speech-to-text/docs/best-practices **
https://cloud.google.com/vision/docs/labels云视觉 API:

来源:Linux 学院
自然语言 API
****例题:你希望建立一个 AutoML 自然语言模型,对一些带有自定义标签的文档进行分类。如何确保为模型提供高质量的训练数据?
****回答:确保每个标签至少提供 10 份培训文档,但最常见标签的文档最好是最不常见标签的 100 倍。为了在为 AutoML 自然语言分类模型准备训练数据时获得最佳结果,每个标签的最小文档数为 10,理想情况下,最常见标签的文档数应该至少是最不常见标签的 100 倍。
阅读 : 准备你的训练数据| AutoML 自然语言|谷歌云
- 谷歌云 AI *台
- 谷歌云 TPUs
- 谷歌 ML 术语表
此外,我推荐以下最佳实践指南:
** [## 机器学习的规则:| ML 通用指南|谷歌开发者
本文档旨在帮助那些具有机器学习基础知识的人从谷歌的最佳…
developers.google.com](https://developers.google.com/machine-learning/guides/rules-of-ml/)
在线模拟考试
来自 Linux 学院的谷歌认证专业数据工程师
排名:4/5——可能是最好的一个。仍然不能涵盖你在考试中可能面临的所有方面。

来自 Linux 学院的谷歌认证专业数据工程师

谷歌认证专业数据工程师结果
Coursera 谷歌云专业数据工程师课程
[## 准备谷歌云专业数据工程师考试
由谷歌云提供。来自课程:“备考最好的方法是在技能上胜任…
www.coursera.org](https://www.coursera.org/learn/preparing-cloud-professional-data-engineer-exam)
它有一个很好的资源部分,里面有pdf 文件,你可以用来准备考试。它也有 7 天的免费试用期。最终实践考试包括 25 道题,其中只有 4 道我发现与 Linux Academy 有些不同。

Coursera GCP 专业数据工程师-考试 pdf 和资源
云学院课程
最*一次更新是在2020 年 7 月 10 日。不幸的是,你不能在这里免费参加模拟考试,但他们有一个很好的移动应用程序和讲稿。所以我在体育馆骑车的时候做了这个。
[## 数据工程师-谷歌云学院专业认证准备
本学习路径旨在帮助您准备 Google 认证专业数据工程师考试。即使…
cloudacademy.com](https://cloudacademy.com/learning-paths/data-engineer-professional-certification-preparation-for-google-83/)
只需点击注册 7 天免费试用。

云学院— GCP 数据工程师考试(不提供免费版本)
最终提示
- 决定你是否真的需要这个认证。备考是一个巨大的承诺。
- 不要告诉任何人。
- 了解更多关于机器学习的信息。会有很多。
- 关注 ML 产品特性
- 真正的考试问题比你在模拟考试中面临的问题更复杂。
推荐阅读:
Ivam Luz:https://docs . Google . com/spreadsheets/d/1 lutqhoejumyscfn 3 ZJ 8 arhzcmazr 3 VRP zy 7 vzj wishe/edit?usp =分享&source = post _ page-bb 6a 0812 a1 b 1-
[## 修正欠拟合和过拟合模型的黑客指南
TL;DR 了解如何使用 TensorFlow 2、Keras 和 scikit-learn 处理欠拟合和过拟合模型。理解…
www.curiousily.com](https://www.curiousily.com/posts/hackers-guide-to-fixing-underfitting-and-overfitting-models/) [## 我是如何通过谷歌云专业数据工程师认证考试的
没有推荐的 3 年实践经验
towardsdatascience.com](/passing-the-google-cloud-professional-data-engineer-certification-87da9908b333) [## ml 874/GCP 河畔数据工程
这份备忘单目前是谷歌云*台上的 9 页参考数据工程。它涵盖了数据…
github.com](https://github.com/ml874/Data-Engineering-on-GCP-Cheatsheet) [## 谷歌云专业数据工程师认证— 2020 年迷你指南
将此作为 2020 年参加考试的人的迷你指南。很难在上找到最新的指南…
medium.com](https://medium.com/@paulmacovei/google-cloud-professional-data-engineer-certification-2020-mini-guide-724244989403) [## 机器学习速成班|谷歌开发者
学习和应用基本的机器学习概念的速成课程,获得现实世界的经验与…
developers.google.com](https://developers.google.com/machine-learning/crash-course) [## 官方谷歌云认证专业数据工程师学习指南
经过验证的学习指南,为您准备新的谷歌云考试谷歌云认证专家数据…
www.wiley.com](https://www.wiley.com/en-us/Official+Google+Cloud+Certified+Professional+Data+Engineer+Study+Guide-p-9781119618454) [## 2020 年考取谷歌云专业数据工程师认证
谷歌云专业数据工程师认证是一个技术认证,证明了知识和能力…
medium.com](https://medium.com/@alessandro.marrandino/taking-google-cloud-professional-data-engineer-certification-in-2020-7b698174af69) [## 如何通过谷歌云专业数据工程师考试
没有推荐的 3 年行业经验
towardsdatascience.com](/how-to-pass-the-google-cloud-professional-data-engineer-exam-f241d7191e47) [## 我的谷歌云专业数据工程师考试笔记
考试结束后,我立即做了一个记忆转储作为笔记。因此它也是非常无序的。这是一份经过清理的列表…
medium.com](https://medium.com/@sathishvj/notes-from-my-google-cloud-professional-data-engineer-exam-530d11966aa0) [## 通过谷歌云专业数据工程师认证考试的终极秘诀(2019 年 10 月)
那么,为什么要考谷歌云专业数据工程师认证考试呢?
medium.com](https://medium.com/@sodiumsun/the-ultimate-hack-to-passing-google-cloud-professional-data-engineer-certification-exam-2019-oct-663b2dfac492) [## 谷歌云——数据工程师考试学习指南
这是一份 12 页的考试学习指南,希望涵盖 GCP 数据工程师认证考试的所有要点
medium.com](https://medium.com/weareservian/google-cloud-data-engineer-exam-study-guide-9afc80be2ee3) [## 如何准备谷歌云认证专业数据工程师考试,并通过你的…
在想新年计划吗?把谷歌云证书加入你的职业组合怎么样?数据…
medium.com](https://medium.com/datadriveninvestor/how-to-prepare-for-google-cloud-certified-professional-data-engineer-exam-and-pass-it-on-your-a7bdef8aa8d0) [## 谷歌云认证:准备和先决条件
谷歌云*台(GCP)已经从一个小众玩家发展成为亚马逊网络服务的有力竞争者
cloudacademy.com](https://cloudacademy.com/blog/google-cloud-certification/) [## 专业数据工程师实践考试|谷歌认证专家
数据工程师实践考试将使您熟悉认证中可能遇到的问题类型…
cloud.google.com](https://cloud.google.com/certification/practice-exam/data-engineer)****
我如何在两个月内零经验通过 AWS 认证解决方案架构师(SAA-C02)
原文:https://towardsdatascience.com/how-i-passed-the-aws-certified-solutions-architect-saa-c02-with-zero-experience-within-two-months-ecc3fa5c1d28?source=collection_archive---------4-----------------------
我用过的课程和学习材料

伊恩·斯托弗在 Unsplash 上拍摄的照片
在开始准备这次考试之前,我对 AWS 毫无经验。但是两个月后,我就认证了!我说这是一个简单的考试吗?没有!绝对错误。这次考试的范围非常大,几乎涉及到大多数的 AWS 服务。在这篇文章中,我将分享我是如何学习并通过 AWS 认证解决方案架构师(SAA-C02)的。
[## AWS 认证解决方案架构师助理认证
AWS 认证解决方案建筑师助理考试是为执行解决方案的个人设计的…
aws.amazon.com](https://aws.amazon.com/certification/certified-solutions-architect-associate/)
课程
我参加了各种课程,既有面对面的也有在线的。
讲师指导的
我的公司在办公室组织了一个讲师指导的课程,我已经免费参加了(很好的福利!).当你在听导师用母语教学时(我的母语不是英语),就更好理解了。
参加教师授课的课程的另一个好处是,当你对授课内容有疑问时,可以在课堂上立即提问。它帮助你更深入地学习和定制。而且,当你的同学也问的时候,这是一个很好的学习过程。有时你只是认为我们知道这些东西,但当你的同学问你从未想到的问题时,你会发现你实际上根本不懂这些材料!在我的课程中,这种情况发生了很多次,我们在这个问答过程中学到了很多。
在课程中,我们需要在 Qwiklabs 中做六个动手实验。学习完相关概念后,立即动手练习是非常好的做法。它通过弄脏你的手来帮助你巩固你刚刚学到的东西。但是如果你没有 Qwiklabs 帐户,你可以随时使用 AWS 免费层来做你的实验。互联网上有许多实践练习指南,可以指导您使用 AWS 中的服务。我在一个 CloudGuru 课程中进行了许多实践。
缺点是如果你需要支付这门课程的费用,那是相当昂贵的。另一个缺点是,与在线课程不同,你不能重播课程。我在备考的时候,不断的回过头去复习忘记的内容。如果你在网上学习,而不是在课堂上,这是可能的。你需要在课堂上放下你自己的笔记。
ACloudGuru
我在 Udemy 上以大约 13 美元的价格购买了这门课程,当时有折扣。如果你愿意,你可以查看下面的链接。您也可以订阅一个 CloudGuru 学习门户网站。
[## AWS 认证解决方案架构师:助理认证考试
注意:我们的课程材料,如 AWS 认证考试,是不断发展的。本课程涵盖了您需要的所有内容…
click.linksynergy.com](https://click.linksynergy.com/deeplink?id=0wsuN4lypZM&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Faws-certified-solutions-architect-associate%2F)
本课程从 AWS *台的概述开始,然后深入探讨 AWS *台的各个元素。您将探索 Route53、EC2、S3、CloudFront、自动扩展、负载*衡、RDS、RedShift、DynamoDB、EMR、VPC 等。
阿克劳德古鲁是一个完美的起点。他们会进行讲座和动手实验,这些内容丰富,会让你保持兴趣。
他们在 2020 年 6 月至 7 月期间更新了该课程的新内容。由于自动气象站的格局在不断变化,寻找当前的资源可能是一个挑战。在 SAA-C02 中有一些章节关注新内容,他们用括号[SAA-C02]标记了这些章节。请特别注意这些章节,因为它们将出现在 SAA-C02 考试中。
有章节摘要可以帮助你关注每堂课最关键的部分。我建议你在考试前复习一下这些总结。
ExamPro 的 Andrew Brown 的 Freecodecamp(免费!)
freeCodeCamp.org YouTube 频道的上有一个完全免费的课程。大约 10 个小时,涵盖了通过考试所需的所有服务。如果你不想在课程上花钱,我推荐你看这个课程。
[## 通过这个 10 小时的免费课程,通过 AWS 认证解决方案架构师考试
AWS 认证解决方案架构师是最受欢迎的云计算认证之一。在本完整课程中…
www.freecodecamp.org](https://www.freecodecamp.org/news/pass-the-aws-certified-solutions-architect-exam-with-this-free-10-hour-course/)
学习资料
教程 Dojo 练习考试
[## AWS 认证解决方案架构师助理实践考试
完全更新到新的 SAA-C02 - AWS 认证解决方案架构师助理考试版本!有很多课程…
click.linksynergy.com](https://click.linksynergy.com/deeplink?id=0wsuN4lypZM&mid=39197&murl=https%3A%2F%2Fwww.udemy.com%2Fcourse%2Faws-certified-solutions-architect-associate-amazon-practice-exams-saa-c02%2F)
我建议大家在参加真正的考试之前通过这些模拟考试。它提供了与实际考试非常相似的模拟问题。
本次模拟考试的卖点之一是每个问题都包含详细解释,这将帮助您更深入地了解 AWS 服务。它不仅解释了什么是正确的答案,还解释了为什么其他答案是错误的。让你认识到类似服务的区别,是极有帮助的。
还有一点就是考试模式真的很贴*实际考试。它模拟得非常好。题目和实际考试真的很像。我想说,做完这 6 次模拟考试后,我就准备好了。如果你愿意,你可以查看上面的链接。
教程 Dojo 备忘单
[## AWS 备忘单
AWS 备忘单我们的 AWS 备忘单旨在让您鸟瞰重要的 AWS 服务,您…
tutorialsdojo.com](https://tutorialsdojo.com/aws-cheat-sheets/)
这些备忘单非常有用,它们让您快速了解重要的 AWS 服务,您需要非常了解这些服务才能通过 AWS 认证考试。它们简明扼要,易于阅读和理解。其中最有帮助的部分就是同类服务的对比。通常在考试中,有两个相似的答案似乎可以解决给定场景中的问题。但是服务之间的微小差异导致一个答案,而不是另一个。通过比较表格/图表熟悉所有服务有助于您通过考试。
AWS 白皮书
虽然建议阅读所有相关的白皮书,并从中学习所有的概念和策略,但我没有阅读白皮书。AWS 刚刚更新了架构良好的框架和五大支柱的白皮书。如果你有足够的时间,阅读这些白皮书将是对你考试准备的一个很好的补充,并将帮助你更好地了解不同的 AWS 服务。
针对非英语母语者的考试提示:
如果你的母语不是英语,你可以要求额外的 30 分钟。
遵循本参考中的步骤,并请求安排额外的 30 分钟来完成它。
[## AWS 认证考试延长 30 分钟
逐步申请 30 分钟参加 AWS 认证考试。2018 年 5 月 31 日以下考试为…
www.linkedin.com](https://www.linkedin.com/pulse/30-minute-extension-your-aws-certification-exam-garcia-lozano)
结论
完成认证并不是故事的结束,其实这只是我云之旅的开始。如果你有兴趣,请和我一起踏上这段旅程。我没有考高分,只是勉强及格。关于 AWS 我还有很多东西要学。考试激励我学习所有这些最新的云技术,考试结果让我不断学习。这是一个终身学习的过程!
祝你好运!如果您有任何问题、意见或顾虑,请随时留下您的回复,我会尽快回复您。
[## 通过我的推荐链接加入灵媒-杨祖华
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@joshua.chyeung/membership)
我如何通过 TensorFlow 开发人员认证考试
原文:https://towardsdatascience.com/how-i-passed-the-tensorflow-developer-certification-exam-f5672a1eb641?source=collection_archive---------1-----------------------
你也可以

一个高技能开发人员的所有迹象:胡子拉碴的胡子,正在开发的鲻鱼,到处都是电缆,帽衫(必须的)。Sam Bourke 的照片,谢谢兄弟。
更新(2021 年 2 月 26 日):在收到一堆关于学习 TensorFlow 和如何通过认证考试的问题后,我制作了一个教授下面提到的技能的课程。 报名学习 TensorFlow 的基础知识,以及如何通过 TensorFlow 开发者认证考试。
2020 年 5 月初,我决定获得 TensorFlow 开发者认证。所以我给自己设置了一个课程来提高我的技能,并在几天前(6 月 3 日)参加了认证考试。结果,我通过了。
让我告诉你我是怎么做到的,你也可以。
坚持住。张量流到底是什么?
TensorFlow 是一个开源的数值计算框架,它允许您预处理数据,对数据建模(在其中找到模式,通常通过深度学习)并将您的解决方案部署到世界各地。
这是谷歌用来支持其所有机器学习服务的。很有可能,你阅读这篇文章的设备之前已经运行过某种张量流。
通常,你会用非常容易理解的 Python(考试内容)或 JavaScript (tensorflow.js)编写 TensorFlow 代码,它会触发一系列用 C 编写的底层函数,执行你告诉它做的事情(大量的数值计算)。
好了,现在我们知道了什么是 TensorFlow,什么是 TensorFlow 开发者认证?你为什么会对它感兴趣?
什么是 TensorFlow 开发者认证?
正如你可能已经猜到的,TensorFlow 开发者认证是展示你使用 TensorFlow 能力的一种方式。
更具体地说,你使用 tensor flow(Python 版本)为一系列任务建立深度学习模型的能力,如回归、计算机视觉(在图像中寻找模式)、自然语言处理(在文本中寻找模式)和时间序列预测(在给定一系列过去事件的情况下预测未来趋势)。
为什么您可能希望获得 TensorFlow 开发者认证?
我的第一个理由是好玩。我想给自己一个小小的挑战去努力,给自己一个理由去读一本我买的新书(后面会有更多)。
但是另外两个有效的理由是:
- 获得构建机器学习驱动的应用程序所需的基本技能。
- 向未来的雇主展示你的技能。
说到未来的雇主,根据 Hacker News 的 Who's Hiring page (一个列出软件开发人员职位月度集合的页面)的数据,与其他深度学习框架相比,TensorFlow 似乎遥遥领先。

比较不同的深度学习框架在 Hacker News 的招聘页面上的各种招聘帖子中的提及率。注:截至 TensorFlow 2.x,Keras 基本上是 TensorFlow 的一部分。注 2: 由于当前的全球环境,所有软件开发人员职位的整体招聘都在下降。图片来源。
我想明确一点,有偿证书并不能保证找到工作。但是在在线学习的世界里,技能正在商品化,这是展示你能力的另一种方式。
我认为这是一个很好的补充,可以添加到你已经完成的个人项目列表中——课程建立基础知识,项目建立具体知识。
那么你是怎么做到的呢?
如何准备考试
当我决定要这么做时,我浏览了认证网站并阅读了 TensorFlow 开发者认证手册。
从这两个资源,我建立了以下课程。
课程——我学习了什么来建立通过考试所必需的技能
需要说明的是,在开始备考之前,我已经有了一些用 TensorFlow 构建几个项目的实践经验。
经验丰富的 TensorFlow 和深度学习实践者可能会发现,他们可以以与我相同的速度(总共 3 周)完成以下课程,甚至更快。
初学者需要多少时间就花多少时间。记住:培养任何有价值的技能都需要时间。
我列出了每种资源的时间表、成本(美元)和有用程度(通过考试)。时间线是基于我的经验。
如果你想为自己创建一个课程,我会推荐如下内容。
注意:对于付费资源,已经使用了附属链接。这不会改变资源的价格,但是如果你碰巧买了一个,我会收到一部分报酬:我用来创造这样的资源的钱。
1.tensor flow 开发者认证手册
时间: 1 小时。
费用:免费。
乐于助人等级:必选。
这应该是你的第一站。它概述了考试将涉及的主题。看完了再看一遍。
如果你是 TensorFlow 和机器学习的新手,你可能会读到这篇文章,并对所有不同的主题感到害怕。别担心。下面的资源将帮助您熟悉它们。
2.Coursera 上的 TensorFlow 练习专精
时间: 3 周(高级用户)到 3 个月(初学者)。
费用:7 天免费试用后每月 59 美元,可通过申请获得经济援助。如果不能访问 Coursera,可以在 YouTube 上看到等效的免费版本。
助人水*: 10/10。
这是与考试(以及 TensorFlow 入门)最相关的资源。细心的学生会注意到 TensorFlow 认证手册和这个专业的大纲几乎完全相同。
它是由两位张量流和机器学习的巨头劳伦斯·莫罗尼和吴恩达教授的,如果我只能选择一种资源来准备考试,这将是它。
我欣赏短视频格式,并尽快关注实际操作的例子。每一部分末尾的多个代码笔记本是任何实际学习者的必备。
编程练习的一个技巧是:不要只是填补代码空白,要自己写出全部内容。
3.使用 Scikit-Learn、Keras 和 TensorFlow 第二版进行机器实践学习
时间: 3 周(从头到尾看完,不做练习)— 3 个月(从头到尾看完,做练习)。
成本:亚马逊上的价格各不相同,但我花了 55 美元买到了一份纸质版。你可以在 GitHub 上免费看到所有的代码。
有用程度: 7/10(只因为有些章节与考试无关)。
这本书有 700 多页,基本上涵盖了所有的机器学习,因此也包括了一些与考试无关的话题。但对于任何有兴趣为未来的机器学习打下坚实基础的人来说,这是一本必读的书,而不仅仅是为了通过考试。
如果你是机器学习的新手,你可能会发现这本书很难读(首先)。同样,不要担心,你不着急,学习有用的技能需要时间。
这么说吧,如果你想了解这本书的质量,我会在早晨上班的路上阅读第一版。我可以告诉你,通常情况下,我会完全按照白天在书上读到的去做。
第二版没有什么不同,只是更新了最新的工具和技术,即 tensor flow 2 . x——考试的基础。
如果你只是在考试的相关章节之后,你会想要阅读:
- 第十章:用 Keras 介绍人工神经网络
- 第十一章:训练深度神经网络
- 第 12 章:使用 TensorFlow 定制模型和训练
- 第 13 章:用 TensorFlow 加载和预处理数据
- 第十四章:使用卷积神经网络的深度计算机视觉
- 第 15 章:使用 RNNs 和 CNN 处理序列
- 第十六章:使用 RNNs 和注意力的自然语言处理
但对于认真的学生,我建议看整本书和练习(也许不是全部,但挑选最适合激发你兴趣的)。
4.麻省理工深度学习简介
时间: 3 小时(我只看了 3 节课)— 24 小时(每节课 1 小时,另加 1 小时复习)。
费用:免费。
乐于助人程度: 8/10。
来自世界一流大学的世界一流深度学习信息,哦,我提到了吗?它是免费的。
前 3 讲,深度学习(一般来说)、卷积神经网络(通常用于计算机视觉)和递归神经网络(通常用于文本处理)与考试最相关。
但是,对于渴望学习的人来说,完成整个课程并不是一个坏主意。
一定要查看他们在 GitHub 上提供的实验室和代码,尤其是 TensorFlow one 的介绍。同样,我不能强调自己编写代码的重要性。
5.【PyCharm 入门
时间: 3 小时(取决于你的电脑有多快)。
费用:免费。
乐于助人等级: 10/10(必须使用 PyCharm)。
考试在 py charm(Python 开发工具)中进行。考试前,我从未用过 PyCharm。建议你在开始之前至少对它有所了解。
为了熟悉 PyCharm,我在 YouTube 上浏览了他们的入门系列,非常简单,“这是这个按钮的功能。”
但主要测试是确保 TensorFlow 2.x 运行没有任何问题,我的电脑可以在相当长的时间内运行深度神经网络(我的 MacBook Pro 没有 Nvidia GPU)。
为了测试这一点,我在本地机器上复制了以下两个 TensorFlow 教程:
- 用张量流进行图像分类
- 用 TensorFlow 进行文本分类
这两种方法在本地都运行良好,但是,正如我们将在下面看到的,当我开始测试时,我遇到了一个问题。
临时演员
- Coursera/YouTube上的 deeplearning.ai 视频——考试纯粹是基于代码的(Python 代码),但如果你想知道你正在编写的代码(线性代数、微积分)背后发生了什么,我会在你认为合适的时候在这里加入和退出视频。比如你不确定什么是小批量梯度下降,搜索“deeplearning.ai 小批量梯度下降”。
- TensorFlow 文档——如果你想成为一名 TensorFlow 实践者,你需要能够阅读这些文档。有不懂的地方,自己写代码,自己注释。
- 用 TensorFlow 在 YouTube 上编码(播放列表)——大部分 TensorFlow 在实践 Coursera Specialization 在 YouTube 上的视频系列,也是同一个导师教的。
我是怎么备考的?
有了上面的资源,我在概念中拼凑了一个大纲。

我的 TensorFlow 开发者认证课程 in idea。我使用看板技术来跟踪需要做的事情,以及各种资源和笔记。如果您访问该链接,您可以通过点击右上角的“复制”按钮制作自己的副本。
整个五月的每个早上,我都会起床、写作、散步、阅读 1 小时的机器学习实践书籍、练习 2-3 小时的 TensorFlow(首先观看讲座,然后完成 Google Colab 中的所有编码练习),然后在每个模块结束时,我会观看相应的麻省理工学院深度学习简介讲座。
例如,有一次我完成了 TensorFlow 实践专业化的计算机视觉部分,我看了麻省理工学院的卷积神经网络(一种计算机视觉算法)讲座。
这种三结合的方法被证明特别有效。
我在书中读到的一个概念会被 Coursera specialization 中的代码示例巩固,并最终被麻省理工学院的视频总结。
为了一个时间线的概念,5 月 11 日开始备考,6 月 3 日参加。
通过我的跟踪(在观念上)和我手写的书签,我*均每小时 20 页,每 2-3 小时的学习单元大约 1 周的课程内容(没有分心)。
最后,在考试前几天,我下载了 PyCharm,并确保我所经历的一些代码示例能够在我的本地机器上运行。
考试细节——实际考试过程中会发生什么?
你已经完成了你的研究?现在怎么办?
好吧,先说两个重要因素。
考试费用: $100 美元(每次考试,如果你失败了,你要等 2 周再试一次,以后每次失败要等更长时间)。
时限: 5 小时。如果没有考试开始时的错误,我会说我会在 3 小时内轻松完成考试。然而,延长的时间限制是为了给你足够的时间在你的计算机上训练深度学习模型(所以在开始之前确保这是可行的)。
考试是如何组织的?
我不会在这里透露太多,因为那会是欺骗。我要说的是阅读 TensorFlow 开发人员手册,你会对考试的主要部分有一个公*的想法。
练习手册中提到的每一种技术(使用上面提到的资源),你会做得很好。
考试花絮
训练模型 —如果你的计算机不能足够快地训练深度学习模型(评分标准的一部分是提交训练好的模型),你可以使用免费的 GPU 在 Google Colab 中训练它们,然后下载,放在考试的相关目录中,通过 PyCharm 提交。
我的破 Python 解释器 —备考资料强调考试需要 Python 3.7。我开始的时候有 Python 3.7.3。由于某种原因,即使 TensorFlow 前一天在我使用 PyCharm 的本地机器上工作,但在开始考试(它会自动为您创建 TensorFlow 环境)后,它就坏了。
也就是说,每次我运行一行 TensorFlow 代码,都会得到错误:
RuntimeError: dictionary changed size during iteration
现在不确定是考试安装的 TensorFlow 的版本(2.0.0)还是我曾经的 Python 的具体版本(3.7.3)。
尽管如此,在经过一番咒骂和对旧 GitHub 问题线程的深度搜索之后,我发现了一个奇怪的修复,这意味着必须修改我正在使用的 Python 版本的源代码(具体来说,就是 lincache.py 的第 48 行)。
# Previous line 48 of lincache.py
for mod in sys.modules.values():# Updated line 48 of linecache.py
for mod in list(sys.modules.values()): # added list()
注意:这只是权宜之计,因为是在考试期间做的,所以我不确定它是否有任何长期的好处或影响。
在我疯狂搜索的过程中,我还读到了一个替代方法,就是更新/重新安装你在 PyCharm 中使用的 TensorFlow 版本(例如 2.0.0 -> 2.2.x)。我试过了,但是没有用,作为 PyCharm 的新手,我怀疑是用户的错误。
实施修复后,我能够顺利完成考试。
考完试之后呢?
如果你通过了考试,你会收到电子邮件通知。除了“恭喜你通过了”或者“很遗憾你这次没通过”之外,不会有任何反馈。
在不破坏太多的情况下,当你参加考试时,你会得到一个非常清楚的指示,如果你有可能通过或不通过(每次你提交一个模型,它会被标记)。
但是如果你通过了,恭喜你!
请务必填写电子邮件中的表格,以确保您被添加到 TensorFlow 认证开发者网络。

一旦你通过了考试,并填写了确认邮件中的表格,几周后你就可以进入谷歌的全球认证网络了。注:截至发稿,我还没到。需要 1-2 周才能出现。
在此注册意味着任何寻找熟练 TensorFlow 开发人员的人都可以根据您的认证类型、经验和地区找到您。
最后,在几周内(我还没有收到我的),你会收到一封官方 TensorFlow 开发者证书和徽章的电子邮件。除了你做过的项目,你还可以增加两件事。
问题
我可以只上课程、看书、自己练习吗,我真的需要证书吗?
当然了。归根结底,你应该追求的是技能,而不是证书。证书是最好拥有的而不是需要拥有的。
如果你说不需要证书,那你为什么还需要呢?
我喜欢有挑战性的工作。为自己设定一个日期,比如“我将在 6 月 3 日参加考试”,这让我别无选择,只能学习。
我可以用免费资源来做这件事吗?
是的,你当然可以。您可以通过浏览 TensorFlow 文档来学习您需要的所有技能。事实上,当我需要练习一些东西时,我会逐字复制文档示例(每一行代码),逐行练习理解,然后看看我自己能否做到。
为什么不是 PyTorch?
我爱 PyTorch。但他们不提供认证,如果他们提供,我可能也会这样做(为了好玩)。另外,两个框架(PyTorch 和 TensorFlow)的有经验的用户将开始看到最*的更新意味着这两个框架变得非常相似。如果说有什么不同的话,TensorFlow 在企业领域拥有优势(见上图)。
我不知道任何机器学习,我能从哪里开始?
阅读文章学习机器学习的 5 个初学者友好步骤。
我已经通过了考试,并注册了谷歌开发者认证网,接下来我该做什么?
是时候建造了!运用你所学的技能,做出你想在这个世界上看到的东西。别忘了分享你的作品,你永远不知道谁会看到。
一些没有提到的事?欢迎在下面发表评论或通过电子邮件提问。我会回答的。
PS 如果你比较喜欢看东西,我做了一个视频版的这篇文章。
我如何用简单的线性回归预测选举结果
原文:https://towardsdatascience.com/how-i-predicted-the-election-result-with-simple-linear-regression-e54c6c196239?source=collection_archive---------25-----------------------
这个简单的回归模型轻而易举地击败了所有主要的民调机构和博彩公司。

一切都应该尽可能简单,而不是更简单~阿尔伯特·爱因斯坦
长话短说——在我上周发表的 文章 中,我预测了波兰总统选举中两位候选人的选举结果。
预测
杜达:50.97%
Trzaskowski:49.03%
官方结果
杜达:51.03%
Trzaskowski:48.97%
对我来说,预测的准确性令人瞠目结舌。
在这篇文章中,我提供了一个总结,什么去计划,什么没有,什么见解可以从这些结果中得出。
我对 2005 年以来的历史数据进行了分析。在绘制了无数的图表,调查了不同类型的相关性之后,我决定了最终的模型。
如果你是一个喜欢盯着图表看的数据狂,或者是一个对功能选择持怀疑态度的数据科学家,看看我以前的工作。
基本模型
我决定将分析分解成一个个县的数据,以说明当地的差异和偏好。这给了我两个数据集,包括每个县的选举结果。一份包括第一轮投票数据,另一份包括决胜投票数据。
在决胜选举中,一切都归结于说服那些在第一轮选举中没有投票给你的人。选民基础的增加对确保你的竞争优势至关重要。

注:需要注意的是,选民基数是按该县合格选民总数的百分比来衡量的,而不是按投票数的百分比来衡量的。

自 2005 年以来,只有两个主要政党的候选人进入了决胜选举——法律与正义党和公民纲领党。我通过对过去三次选举运行上述回归来研究该模型。结果如下:

根据 2020 年的趋势进行调整后,预测系数为:

与 PiS 的情况类似:


最后,我假设这些系数是均匀分布的,并对选举进行了模拟,其中系数被画出,选举结果的实现被记录下来。
在这些模拟中,杜达总统的*均得分为 50.97%,*均投票率接* 65%。
官方结果

资料来源:POLITICO 民意调查
如上所述,杜达总统获得了 51.03%的选票,确保了他的第二个任期。看到这个结果与我的预测非常接*,我进一步查看了实际的回归系数。
比较每个县的选民基数增长,我得到了以下结果:


我们可以立即看到,在这两种情况下,β0截距都变大了。这意味着两位候选人能够在全国范围内保持一致的支持率。真实截距和预测截距之间的差异主要出现在投票率中,投票率为 68.18%,而预测投票率为 65.49%。
β1系数落在预测范围内,反映了政党动员未使用选民能力的能力。Trzaskowski (PO)的高 beta 1 来自第一轮结果与 Szymon hoownia 的高相关性,实际上将 hoownia 的选民计为 PO。
下面我包括实际增长以及模型的预测范围。


相对于第一轮投票中的候选人结果,针对 b0 和 b2 调整候选人增加
有趣的是, beta 2 最终远低于两位候选人的预期。对杜达总统来说,这是因为 Krzysztof Bosak 的选民基础在 PiS 和 PO 之间几乎*分秋色。在 rafatrzaskowski 一案中,原因是 Robert Biedro 和 wad ysaw Kosiniak-kamy SZ 的选民投票率低。然而,这与动员第三方选民的能力下降是一致的,因为两党的β2 系数一直在不断下降。
结论
这是一种实验性的方法,与科学界发表的任何具体方法都没有联系。然而,考虑到波兰社会的两极分化,历史趋势似乎在预测选举结果时发挥了重要作用。
请注意,在逐届选举的基础上,对 PiS 和 PO 候选人的支持相对增加。鉴于我在上一篇文章中谈到的政治环境,偏好会适度变化。因此,利用以前的选举可以给我们很多的洞察力。
此外,传统调查容易导致受访者的行为偏差!在决胜选举之前,拉法茨扎斯科斯基倾向于在包括未决定选民的投票中领先,而杜达则在没有他们的投票中领先。
因此,我深信传统的调查应该根据政治形势和历史趋势进行调整。目前,他们似乎只是复制粘贴受访者的回答,而没有任何更深入的分析。
你怎么想呢?
你认为这个分析遗漏了什么吗?
你认为我的假设是否正确?
也许你想更详细地谈谈这个模型?
随时联系!
[## Cezary Klimczuk —数据科学家|伦敦大学学院毕业生
www.linkedin.com](https://www.linkedin.com/in/cezary-klimczuk-423522129/)
我在 Jupyter Notebook 中使用 Python 进行了所有分析。
我下载并清理了 pkw.gov.pl 的选举数据。请访问我的 GitHub 页面 ,深入探索我的项目!
我如何准备人工智能认证工程师助理认证
原文:https://towardsdatascience.com/how-i-prepared-for-the-ai-certified-engineer-associate-certification-29780464f472?source=collection_archive---------24-----------------------
以下是我给有抱负的人工智能认证工程师助理的建议

在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
截至 2022 年 1 月更新:该职业资格现被重构为特许人工智能工程师(CAIE) ,由人工智能专业人员协会(点击访问 LinkedIn 上的 AIP)管理。之前这是 AI 认证工程师,由 AI Singapore(新加坡国立大学)管理。
我直接跳到了 AI 新加坡公司的首届 AI 认证工程师助理认证
似乎有越来越多的人加入了人工智能/数据科学/机器学习的行列。我们都开始在业余时间看关于机器学习的视频,在 Jupyter 笔记本上绘制一些可视化图形,在媒体上阅读一些关于数据科学的文章,等等。我们今天需要的是一种客观的方法来衡量我们当前的熟练程度来衡量我们已经知道的东西,以及行业当前需要的东西。那么有什么比认证考试更好的方法呢?
如果你不能衡量它,你就不能改善它。—彼得·德鲁克
什么是 AI 认证工程师助理认证?
人工智能认证是一个国家认证和评估框架,以承认在人工智能相关的工程角色的工作专业人员的证书。
评估框架验证申请人的技术能力和经验,并向通过同行和公认的人工智能从业者评估面试的人授予认证证书。
—来源:艾新加坡网站 —
有 4 个不同的级别来衡量人工智能工程中的 4 个能力级别:
- AI 认证工程师助理
- AI 一级注册工程师
- AI 认证工程师二级
- AI 三级注册工程师
对于这篇文章,我将只谈论人工智能认证工程师助理。要了解更多关于其他认证的信息,请随意浏览 AI 新加坡网站。
人工智能认证工程师助理是指理解主要人工智能框架和云基础设施并构建解决业务问题的人工智能模型的个人。
这个级别的认证是针对那些还没有人工智能相关工作经验的人。
个人应具备的技术知识和技能包括:
- Python 背景
-了解数据库并运行基本的 SQL 查询
-了解并熟悉软件工程、人工智能云服务、数据工程、数据管理和数据科学
—来源:艾新加坡网站 —
这听起来像是你可能感兴趣的事情吗?然后继续读下去,找出我认为这个证书值得考的理由,以及我要准备的一些小技巧。
免责声明:
文中表达的观点、想法和意见仅属于作者,不一定属于作者的雇主、组织、委员会或其他团体或个人。
我为什么要参加这个考试?
有许多职业倾向于甚至要求某种证书来执业。根据我的观察,这些人包括会计师、医生、律师等等。但是在这个时代,我相信开发和工程生产就绪的人工智能/人工智能系统正迅速成为下一个也更喜欢甚至可能需要有人拥有这种证书的职业之一。
证书是客观上给予雇主对雇员能力的信心和信任的方法之一。对我来说,现在就开始总是比不开始好,在数据科学这样一个快速发展的领域,我很欣赏证书提供的保证,即我的技能(当然在一定程度上)仍然是最新的。此外,主动这样做表明你对提升自己感兴趣,表明你是一个积极主动的人,当然这将使你脱颖而出,并在雇主(现有或潜在的)眼中增加价值。
100%的受访者同意在招聘过程中优先考虑行业认证— 来源:HR . com 的调查—
你们中有多少人能对下面的自我对话产生共鸣:我真的知道我在做什么吗?我做事情的方式正确吗?我到底做对了什么??当我忙于数据科学产品开发工作和计算机科学硕士学位承诺时,我经常问自己这些问题,我来自商业管理背景。所以当我看到有一个通过认证来证明自己的机会时,我决定抓住它,我确信确保你步入正轨的一个方法是开始通过这样的认证考试来衡量你自己的熟练程度。
最后,当然同样重要的是,当你自豪地展示认证时,你会有一些成就感和吹嘘的权利。这也让你在 LinkedIn 上有更多的曝光率,这可以让你进入你想去的理想公司面试。
所以我给这里的观众的第一个建议是花些时间思考一下你为什么要做这个证书。如果你清楚自己的目标,知道这是成功的一半。我希望我已经使你相信接受这样一个证书的价值。
那么在这个认证考试中我能期待什么呢?
你将有一个技术测试,大约 5 天的时间来完成它。这个测试挑战你在这些广泛领域的实践知识:
- 数据提取。您能够使用 SQL 和 SQLalchemy 从数据库中提取数据吗?用 python 熊猫从 csv *面文件读取?
- 探索性数据分析。能在 jupyter 笔记本上做一个全面的 EDA 吗?做 EDA 有没有很强的框架和思维过程?最重要的是,你能构建和组织你的 EDA,使之易于理解吗?
- 机器学习/数据科学。你能处理原始数据吗?为所需的数据处理步骤辩护?为数据选择合适的机器学习模型?集成几个机器学习模型(如果合适的话)?用适当的指标定义每个模型并对其评分,以判断最佳模型?选择需要什么输出(例如:度量/图表)来维护你的模型?
- 软件工程。你能建立一个从原始数据到“部署的”机器学习模型的端到端管道吗?在 Linux 中从命令行调用你的模型 API?您的程序是否易于配置,以便最终用户决定使用哪些参数或算法?
免责声明 :我没有正式的评测标准,以上列表也绝非详尽。
测试结束后会有一个简短的面试,给你 10 到 15 分钟的时间来演示和运行你提交的整个工作流程。接下来的 10 到 15 分钟是问答时间,你必须为你的模型辩护,并准备好描述算法、统计、数学和数据科学的概念。因此,不要忘记另一个重要的方面:
- 沟通。你能够清晰简洁地交流你的 EDA 发现和见解吗?解释一下你为什么用那个模型而不用另一个模型?解释你选择的模型的局限性?
似乎很刺激(或者说势不可挡)!我该如何为此做更好的准备?
- 找到一个有趣的数据集。你可以选择从这个链接进行练习。
- 使用数据集制定您自己的清晰的问题定义/陈述来解决。
- 把手弄脏!在 EDA、数据清理和预处理、绘制图像和解释这些方面有很多乐趣。
- 尝试不同的机器学习模型。尝试 scikit learn 上所有不同的回归变量。确保你知道你在做什么,如何解释你的步骤!另一个建议是:在你有一个自信的基线模型之前,不要从神经网络或任何非常花哨的东西开始,基线模型可以像线性回归一样简单。
- 将所有这些放在一个 python 脚本中,并使用 Linux bash 脚本运行它。更改您的配置文件(或命令行参数),您的程序应该仍然像预期的那样工作。试用您的程序!额外收获:如果你能展示出测试驱动开发(pytest)和版本控制(git)的知识,这肯定会让你脱颖而出!
- 练习交流你的想法。单靠技术技能和硬技能是不足以成功的。你需要能够吸引观众,用你的数据讲述故事。用你的发现给利益相关者留下深刻印象,并说服他们在从数据中提炼出所有见解后采取适当的行动。毕竟,一旦你重新进入这个行业,这是意料之中的。
- 额外收获:准备一份关于你的方法、设计、发现、见解和行动的高级演示文稿,就好像你正在向客户做一份重要的演示文稿,让他们相信你的产品的有用性,以及你如何向他们提供商业价值。
- 只有当以上所有步骤都完成了,你才能认为一个项目完成了,你才会更有信心为技术测试处理类似的东西。
最后的建议:
通过在线视频学习数据科学/机器学习/人工智能,甚至单独通过视觉阅读文章,不幸的是,这不是最高效的学习和实践方式。我甚至敢说:不要再学新东西了!(目前),并开始应用和整合所有你已经知道的知识,然后在需要的时候填补空白。
动觉学习者在这里有一个观点。多做副业,把自己的技能用到实际中去。自豪地在像 Github 这样的公共知识库上展示你的作品。永远记住你给最终用户带来了什么价值,并尽你所能与他们交流。祝你好运!
附注:在撰写本文时,下一轮申请是在 2020 年第四季度。有充足的时间练习。现在走吧!
关于作者
Albert Bingei 是人工智能认证工程师助理,新加坡一家初创公司的全职顾问,佐治亚理工学院的兼职硕士 CS(机器学习)学生。
Albert 拥有设计和构建基于 python 的优化引擎的经验,该引擎将机器学习模型应用于实时流数据,以影响工程控制系统来提供商业价值。
请通过 Linkedin 、 Medium 或 Github 联系艾伯特
我如何准备 AWS 认证机器学习专业
原文:https://towardsdatascience.com/how-i-prepared-for-the-aws-machine-learning-speciality-certification-10834924d192?source=collection_archive---------2-----------------------
我如何准备 AWS 认证机器学习-专业,我使用了什么资源,我如何规划我的时间,以及通过考试的技巧

作者图片
介绍
我最*刚刚以超过 95%的成绩通过了 AWS 认证机器学习专业考试,进行了大约 4 周的明确准备。
通过这篇文章,我想分享:
- 在开始准备这个考试之前,我对 AWS 和机器学习了解多少?
- 我采取了什么方法来准备这次考试?
- 我用了哪些资源来准备?
- 我用什么工具来帮助我?
- 备考小贴士
我的背景
首先,让我给你介绍一下我的背景,包括机器学习和 AWS 方面的知识。我原本是一名流体力学工程师,在英国一家工程咨询公司的石油和天然气团队工作。我选择参加这个考试的原因是为了验证我对端到端机器学习的理解,并发展我在为云上的机器学习系统构建可靠有效的架构方面的知识。虽然我通过在线课程(训练营)、研讨会和黑客马拉松学习数据科学已经有一段时间了(不到两年),但我在数据科学领域还是一个相当新的人,作为数据科学家的专业经验还不到 1 年。就 AWS 而言,我也是新手,更不用说,我在预订 AWS ML 专业考试之前通过了 AWS 认证云从业者考试。我在这方面没有太多的专业经验,我在一些学习项目中使用过它,作为课程/研讨会和小型自由职业项目的一部分;但是和 AWS 官方推荐的不太接*。
首先成为 AWS 认证的云从业者
既然我们正在讨论云从业者考试,我想提一下,在您预订 ML 考试之前准备并通过云从业者考试当然是强烈推荐的,原因有二:
- 云从业者考试,让您很好地理解云概念和各种 AWS 服务,包括 S3、EC2、IAM 用户、角色和策略、云安全性、可扩展性、弹性、容错、共同责任模型、架构良好的框架和其他基础知识,这在准备 AWS ML 专业认证时非常有帮助。
- 云从业者考试费用为 100 美元,ML 专业考试费用为 300 美元,但如果您参加过云从业者考试,则下次 AWS 考试可享受 50%的折扣,总共只需 250 美元(两次考试加在一起),节省了 50 美元,并且您还可以获得一次免费的实践考试。模拟考试要短得多,只有 20 个问题,而真正的考试有 65 个问题。
理解考试内容
考试分为 4 个领域:数据工程(20%),探索性数据分析(24%),建模(36%)和 ML 实施与操作(20%)。根据我在准备和考试期间的经验,EDA 和建模方面的内容可以很好地*衡您对主题本身以及 AWS 特定服务的理解,而数据工程和 MLOps 领域则稍微偏重于 AWS。因此,你应该做好两者兼而有之的准备,一个好的 ML 工程师,以及一个好的 AWS 工程师在考试中竭尽全力。
提示 1:做好两者兼而有之的准备,一个好的 ML 工程师,以及一个好的 AWS 工程师都要在考试中尽最大努力。
准备、资源和规划
我提前一个月开始准备,并在考试前 10 天预定了考试。在我预约考试的时候,我觉得我已经准备好了一半。在文章的这一部分,我将简要讨论我是如何准备考试的,以及我利用了哪些资源来最大化我通过考试的机会。完整的参考资料列表也可以在文章末尾找到。
当我开始准备时,我准备考试的方法并不完全清楚。但事实证明这是一个好主意,帮助我通过考试。最初,我从 AWS 和外部供应商的课程开始准备,后来用大量时间阅读其各种服务(主要是 Sagemaker)的 AWS 开发者文档来支持它,最后用大量的实践测试来支持,更不用说我已经从《用 Scikit-Learn、Keras 和 Tensorflow 实践机器学习》一书中阅读了机器学习和深度学习的基础知识。这些并不是按顺序进行的,但视频课程肯定是第一步。就我用于准备考试的时间而言,我会说大约每天 4 到 6 个小时,持续大约 4 周。这包括课程(以 1.25 倍或 1.5 倍的速度跑)和上面提到的所有其他课程。如果你每天花更少的时间或者更详细地浏览它,你可能想把它延长一段时间。
入门:机器学习之路
首先开始的地方是 AWS 建议备考的这条机器学习路径。在这条道路上,我主要关注两门课程,数据科学的要素和考试准备课程。《数据科学的元素》涵盖了数据科学的基础知识,如果你想参加这个考试,你应该知道很多,但这仍然是一个很好的复习。下一步是考试准备课程,该课程简要介绍了每个领域和子领域中您需要了解的所有内容。它只是概述了主题,你可以用它作为参考来检查你的准备情况。当我浏览课程内容时,我将整个课程内容作为笔记&截图,我后来不时地参考这些内容,以保持自己的进度。两者加起来最多需要 3-4 天。到目前为止,除了课程中的小测验之外,我没有阅读任何文档或练习题。
提示 2:多次快进你的学习,而不是一次一次地慢慢复习
进入 SageMaker
下一站,我开始从头开始浏览 sagemaker 文档,一个接一个,包括:什么是亚马逊 SageMaker?、入门、 SageMaker 工作室和笔记本实例。这些是最入门和初学者友好的部分,我在 SageMaker 控制台上跟随。作为补充,我还开始观看亚马逊 SageMaker 技术深潜系列,在我准备期间,我发现它非常有用。这是一系列 16 个视频,*均每个 15 到 20 分钟,我在接下来的日子里泡茶或吃早餐时不连续地观看。此时,我已经准备了大约一周半。
深入潜水:课程 1
在我完成 SageMaker 的最初部分后,我偶然发现了视频课程, AWS 认证机器学习专业 2020-动手!夏羽·马瑞克和弗兰克·凯恩。为了节省时间,我没有亲自动手做所有的事情,但我确实完成了整个课程,观看了每一个视频,以便对考试内容有一个更全面的了解。这门课程当然会涉及大部分内容,包括一些你应该知道的机器学习的概念,但是这还不足以通过考试。你必须对机器学习和深度学习的基础有更好、更透彻的理解。这让我度过了第二周的周末。
中途:课程 2 和 SageMaker 文档
接下来我上了 WhizLab 的 AWS 认证机器学习——专业视频课程。这与之前的课程类似。当我经历这些的时候,我已经开始挑选一些主题每天阅读 AWS 的开发者文档;例如深度的特定算法,或者各种人工智能服务之一。对于我选择阅读的每一个算法,我会从头到尾阅读 sagemaker docs 必须传达的所有内容,通常每篇 3 到 5 页。这将包括诸如底层概念、预期的输入/输出格式、要调优的超参数等细节。对于每一个人工智能服务(例如 AWS 的理解),我会通读它的功能,常见问题,并简要看看它的开发者指南,只是为了更好地了解它提供了什么。还有 8 天就要考试了。
技巧 3:阅读大量 SageMaker 文档,以至于您确切地知道在哪里可以找到什么信息。如果可能的话,多看几遍。
最重要的一点:练习测试
到那时,我已经完成了课程并对内容有了很好的理解,我从各种来源收集了大量的练习题和论文,包括 Udemy、EXAMTOPICS、testprep 和 AWS 网站上的样题。即使考试中的问题并不完全相同,但至少模拟测试促使我学习了考试可能需要的各种主题。我开始进行模拟测试,每天至少一次,当测试结束时,我会重新开始。完成每篇论文后,我会查看答案及其描述,并通读所有提供的参考资料。
抓住主题并掌握它们
当有如此多的东西需要学习时,很容易被内容淹没,忘记自己已经掌握了什么,还需要在哪些方面更加努力。对于我遇到的每一个难题或我回答错误的问题,我都用一个易于理解的标题、参考资料和链接来捕获这些问题或主题,并按考试领域和复习状态标记到一个概念数据库中,这使我能够建立一个看板来掌握我的学习情况。这是它的快照。

修订主题的概念数据库,按作者分类的图像
对于每一个主题,我还会捕捉到我读到的最重要的细节,这样我就不需要重新查阅参考资料了。

修订主题的子页面,按作者排序的图像
对于我捕捉到的每个主题,我都反复查看,直到我有信心为止,每次访问它时都会更新查看状态。这种策略几乎类似于那些助推算法中的一种,其中你递归地训练弱学习者以形成强学习者。我发现这套有条理的笔记非常有用,尤其是在临*考试的时候。
技巧 4:练习大量的测试,捕捉要学习的主题和问题,组织它们,并反复复习。
规划时间
为了跟上课程、文档阅读和练习测试,我计划了每天的时间,以确保我涵盖了所有三个方面,并跟踪我的时间,例如,2 小时用于论文,1 小时用于阅读,1 小时用于观看课程视频,更不用说,阅读和视频几乎总是针对我决定掌握的专门主题。甚至在我完成了一次课程视频后,当我临*考试时,我又看了一遍建模和数据工程部分。在过去的两天里,我只是反复检查我在概念数据库和练习试卷中标记的考试题目。
技巧 5:计划你的时间,记录时间,在阅读、视频和练习题之间合理分配时间,更具体地说,分配到不同考试领域的主题
就在考试前和考试后
就在考试前,我必须承认,经过几周的训练和练习,我仍然感到紧张。老实说,我不确定我能不能通过。但是我已经承诺不会改变考试日期,所以别无选择。然而,通过考试是数周强化学习后最愉快的经历。因此,我强烈推荐这个考试给任何对使用 AWS 感兴趣的数据科学家/ML 工程师。AWS 是领先的云服务提供商之一,通过自己在云中的一套强大的算法和人工智能服务,无疑主导了 ML 领域。
提示 6:你可能会感到有点紧张,但如果你付出了努力,你肯定会得到回报。
资源列表
课程和视频讲座
- 亚马逊 SageMaker 技术深潜系列【视频系列】
- AWS 认证机器学习专业 2020——动手!【视频课程】
- AWS 认证机器学习—专业【视频课程】
需要阅读的文件和书籍
- 亚马逊 SageMaker 开发者指南【文档】
- AWS 文档与考试相关的其他 AWS 服务【文档】
- 使用 Scikit-Learn、Keras 和 TensorFlow 进行机器实践学习 [Book]
- AWS 服务(理解/确认/等)概述页面、功能页面和常见问题解答[AWS 网站]
我如何使用 CNN 为我的文本分类任务使用正则表达式预处理文本数据
原文:https://towardsdatascience.com/how-i-preprocessed-text-data-using-regular-expressions-for-my-text-classification-task-cnn-cb206e7274ed?source=collection_archive---------17-----------------------
使用正则表达式进行预处理的步骤
- 从文件名中提取标签和文件编号
- 提取电子邮件
- 提取主题
- 去收缩
- 正在从以下位置删除写入:
- 删除括号<>、()中的数据
- 删除换行符、制表符
- 用分块预处理人名和城市名
- 移除数字
- 使用匹配将“word”、“word”、“word”替换为 word 会捕获
- 多方面的

介绍
自然语言处理是人工智能中处理语言数据的一个分支。它基本上是一个研究人和机器之间互动的分支。机器翻译、文本到语音、文本分类——这些是自然语言处理的一些应用。
在本文中,我将使用 1D 卷积神经网络对文本数据进行分类,广泛使用正则表达式进行字符串预处理和过滤。
本文的重点是如何使用正则表达式进行文本数据预处理
问题陈述
数据是新闻组 20 数据集。我们的数据中总共有 20 种类型的文档。文档的名称包含标签和标签中的编号。格式为' class label _ DocumentNumberInThatLabel '。数据可以从这里下载。
我们的任务是对文本数据进行预处理,并将其分类到正确的标签中。

类别标签的计数图

示例数据(我们将在整篇文章中跟踪这些数据)
使用正则表达式预处理
我们已经创建了一个函数,它将原始数据作为输入,并将经过预处理的过滤数据作为输出。
I .从文件名中提取标签和文件编号
我们将使用适用于字符串的拆分方法。
1 for filename in os.listdir(path):
2 i,j = filename.split('_')
3 j = int(j.split('.')[0])
4 label.append(i)
5 doc_num.append(j)
对于路径中的所有文件名,我们获取文件名并将其拆分为“_”。该功能。split()使用 paranthesis 中的元素来拆分字符串。同样,我们再次使用它来过滤。文件名中的 txt 。
**Ex.- we get i = talk.religion.misc and j = 82778**
二。提取电子邮件
我们的任务是找到一个文档中的所有电子邮件,提取“@”后的文本,并用“.”分割,去掉所有小于 3 的字,去掉”。com”。将所有内容组合成一个字符串。最后,我们将电子邮件从我们的文本中删除。
Ex.-
**[bskendig@netcom.com , joslin@pogo.isp.pitt.edu] →** **[netcom, pogo.isp.pitt.edu] → [netcom, pogo, isp, pitt, edu] →****“netcom pogo isp pitt edu”**
以下代码执行任务
em = [] # for each doc
st = "" # for each doc#extracting email
for i in re.findall(r'[\w\-\.]+@[\w\.-]+\b', f): #extracting email
temp=[]
temp = i.split('@')[1] #taking text after @
temp = temp.split('.') #a list containing words split by "." if 'com' in temp:
temp.remove('com')
for i in temp: #removing words less than 3
if len(i)>2:
em.append(i)for i in em: #joining all the words in a string
st+=i
st+=' 're.sub(r'[\w\-\.]+@[\w\.-]+\b',' ') #removing the email
正则表达式解释

\w → 匹配任何字母数字字符
-\。→ 匹配“-”和。”(“\ "用于转义特殊字符)
[]+ → 匹配括号内的一个或多个字符
……………………………………………………。@ → 匹配[\w-\后的“@”。]
三提取主体
在这项任务中,我们将只保留来自主题部分的有用信息。主题:将被删除,所有非字母数字字符将被删除。以下代码执行任务-
#extracting subject
temp1 = re.findall(r'^Subject.*$',f, re.MULTILINE)sub = temp1[0]
sub = sub[7:] #Truncate Subjectfor i in string.punctuation: #remove all the non-alphanumeric
sub = sub.replace(i," ") sub = re.sub(r"re","",sub, flags=re.IGNORECASE) #removing Re sub = sub.lower() #lower-casingre.sub(r'Subject.*$'," ", flags=re.MULTILINE) #removing subject
正则表达式解释

^ → 占了字符串的开头。
Subject → 匹配字符串的开头是单词 Subject。
。* →匹配主题后的 0 个或多个单词。
$ →检测字符串的结尾。
注意:“^”对于确保 Regex 只检测标题的“主题”很重要。它不应该在我们文本的任何其他部分检测到单词“subject”。
四。去收缩
用我会代替我会,用不能代替 T21 等等..
# specific
f = re.sub(r"won't", "will not", f)
f = re.sub(r"can\'t", "can not", f)# general
f = re.sub(r"n\'t", " not", f)
f = re.sub(r"\'re", " are", f)
f = re.sub(r"\'s", " is", f)
f = re.sub(r"\'d", " would", f)
f = re.sub(r"\'ll", " will", f)
f = re.sub(r"\'t", " not", f)
f = re.sub(r"\'ve", " have", f)
f = re.sub(r"\'m", " am", f)
动词 (verb 的缩写)正在从以下位置删除写入:
删除写在“写给:”和“发件人:”下的地址等内容。
f = re.sub(r"Write to:.*$","",f, flags=re.MULTILINE) f = re.sub(r"From:.*$","",f, flags=re.MULTILINE) f = re.sub(r"or:","",f,flags=re.MULTILINE)
注意- "$" 匹配字符串的结尾只是为了安全
六。删除括号内的数据< >,()
删除括号内的所有数据。
我的名字是拉梅什(钦图)→我的名字是拉梅什
f = re.sub(r"<.*>","",f, flags=re.MULTILINE) f = re.sub(r"\(.*\)","",f,flags=re.MULTILINE)
VII。移除换行符、制表符
#delete /,-,/n,f = re.sub(r"[\n\t\-\\\/]"," ",f, flags=re.MULTILINE)
八。组块
组块是基于词性标注从句子中提取有价值的短语的过程。它给句子增加了更多的结构,帮助机器更准确地理解句子的意思。你可以阅读尼基塔·巴查尼的这篇文章,她详细解释了分块。

组块的例子
我们的任务是在组块的帮助下删除城市名并给城市名添加下划线。Ex- Ramesh 将被删除,新德里→新德里
chunks=[]
chunks=(list(ne_chunk(pos_tag(word_tokenize(f)))))for i in chunks:
if type(i)==Tree:
if i.label() == "GPE":
j = i.leaves()
if len(j)>1: #if new_delhi or bigger name
gpe = "_".join([term for term,pos in j]) f = re.sub(rf'{j[1][0]}',gpe,f, flags=re.MULTILINE) #replacing delhi with new_delhi f = re.sub(rf'\b{j[0][0]}\b',"",f, flags=re.MULTILINE) #deleting new, \b is important if i.label()=="PERSON": # deleting Ramesh
for term,pog in i.leaves():
f = re.sub(re.escape(term),"",f, flags=re.MULTILINE)
正如我们上面看到的,组块有三个部分- 标签,术语,词性。如果类型是树,标签是 GPE,那么它是一个地方。如果这个地方有不止一个单词,我们用“_”将它们连接起来。
f = re.sub(rf'{j[1][0]}',gpe,f, flags=re.MULTILINE)
f = re.sub(rf'\b{j[0][0]}\b',"",f, flags=re.MULTILINE)
我们一起使用了格式字符串和正则表达式。“j”包含叶,因此 j[1][0]包含第二项,即德里,j[0][0]包含第一项,即新。所以,我们把德里换成了新德里,删掉了 new。\b 是检测单词的结尾。
f = re.sub(re.escape(term),"",f, flags=re.MULTILINE)
为了删除 Person,我们使用了 re.escape ,因为这个术语可以包含一个字符,这个字符对于 regex 来说是一个特殊的字符,但是我们想把它仅仅当作一个字符串。
九。移除数字
f = re.sub(r'\d',"",f, flags=re.MULTILINE)
X.将“word”、“word”、“word”替换为 word
f = re.sub(r"\b_([a-zA-z]+)_\b",r"\1",f) #replace _word_ to word
f = re.sub(r"\b_([a-zA-z]+)\b",r"\1",f) #replace_word to wordf = re.sub(r"\b([a-zA-z]+)_\b",r"\1",f) #replace word_ to word
这里,我们使用一种叫做的匹配捕获。
在我们使用“ \b_([a-zA-z]+)_\b”获得字符串之后,匹配捕获使我们能够只使用匹配字符串的特定部分。这里我们在下划线之间有一组并列句。因此这里有一组。我们使用 r '\1' 来提取特定的组。简单的例子来解释这个概念。

有两个参数,所以有两个匹配捕获
XI 杂项
{m,n} →这用于匹配 m 和 n 之间的字符数。m 可以是零,n 可以是无穷大。
f = re.sub(r"\b[a-zA-Z]{1}_([a-zA-Z]+)",r"\1",f) #d_berlin to berlinf = re.sub(r"\b[a-zA-Z]{2}_([a-zA-Z]+)",r"\1",f) #mr_cat to catf = f.lower() #lower casef = re.sub(r'\b\w{1,2}\b'," ",f) #remove words <2f = re.sub(r"\b\w{15,}\b"," ",f) #remove words >15f = re.sub(r"[^a-zA-Z_]"," ",f) #keep only alphabets and _
f = re.sub(r" {2,}", " ", f, flags=re.MULTILINE) # REMOVE THE EXTRA SPACES
最终数据准备
如前所述,整个预处理被放在一个返回五个值的函数中。将我们的数据传递给这个函数-
doc_num, label, email, subject, text = preprocessing(prefix)
创建包含预处理的电子邮件、主题和文本的数据帧。类别标签已被整数取代。

预处理文本是这三者的串联
…向量化…
在将数据分成训练和测试(0.25)之后,我们将数据矢量化成算法可以理解的正确形式。我们已经使用了来自 keras 的 tokenizer 函数,它将用于嵌入向量。
最后对文本进行编码并填充,创建统一的数据集。
模型
我们训练该数据集的模型由三个'一维卷积'层组成,这些层连接在一起,并通过下面给出的其他各层。

最后一块是我们的最终输出(softmax,categorical _ crossentropy)
结论
在训练模型之后,我们得到大约 75% 的准确率,这可以通过在模型中做一些调整来容易地进一步提高。本文的主要焦点是预处理部分,这是比较棘手的部分。
我是如何在 Julia 中编写第一个 Hone 扩展的
原文:https://towardsdatascience.com/how-i-programmed-the-first-hone-extension-in-julia-edf7813d0e1b?source=collection_archive---------85-----------------------
Hone.jl
在 Julia 中创建和使用我的绘图库的扩展。

Github 回购
介绍
当我最初为 Julia 创建矢量绘图库 Hone.jl 时,我希望有一个模块化的绘图库,可以由任何人扩展。使用这种方法,用户将能够创建包扩展来增加功能,并使它成为一个更好的通用库。
创建一个能够做这样事情的包说起来容易做起来难。然而,这个想法对我很有吸引力,因为据我所知,真的没有其他图形库做这样的事情。对朱莉娅来说尤其如此。不幸的是,在我们开始创建一个 Hone 扩展之前,我们必须增加一些代码。
为 Hone 添加扩展
从相对早期的版本开始,Hone 就有了可扩展的能力。然而,这个系统并不是最好的。它使用一个名为 custom 的参数,用户可以在其中输入要作为元表达式计算的串联标记。像这样处理扩展有几个基本问题,会降低 Hone 扩展的可行性。
- 需要有一个自定义条件
- 输入标记需要连接,或者是连接在函数中的数组。
- 对于没有使用扩展的人来说,这将会降低功能的速度,使得 Hone 运行更慢,但没有任何好处。
这里是代码,所以你可以理解我指的是什么。所有提及“自定义”的内容均以粗体显示。
function _arrayscatter(x,y,shape=Circle(.5,.5,25),axiscolor=:lightblue,
debug=false, grid=Grid(3), **custom=""**, frame=Frame(1280,720,0mm,0mm,0mm,0mm))
topx = maximum(x)
topy = maximum(y)
axisx = Line([(0,frame.height), (frame.width,frame.height)],axiscolor)
axisx_tag = axisx.update([(-1,-1), (-1,1), (1,1)])
axisy = Line([(0,0), (0,frame.height)],axiscolor)
axisy_tag = axisy.update([(0,0), (0,1), (0,1)])
grid_tag = grid.update()
######
######
**fullcustom = ""
if custom != ""
[custom = string(fullcustom, i) for i in custom]
end**
expression = string("")
# Coordinate parsing -------
for (i, w) in zip(x, y)
inputx = (i / topx) * frame.width
inputy = (w / topy) * frame.height
exp = shape.update(inputx,inputy)
expression = string(expression,string(exp))
end
expression = string(expression, "(context(),", axisx_tag,grid_tag,**custom**, axisy_tag,"),")
tt = transfertype(expression)
frame.add([tt])
if debug == true println(expression) end
composition = eval(expression)
show() = frame.show()
tree() = introspect(composition)
save(name) = draw(SVG(name), composition);
get_frame() = frame
(var)->(show;composition;tree;save;get_frame)
end
量化一下,这段代码总共有 34 行。与 custom 相关的行数总共是 6,这意味着 17%的代码行属于 custom,而大多数时候它根本不会被使用。也许我疯了,但是
我不能忍受这个。
此外,每当我创建框架函数时,我都会创建一个名为 add()的方法,您可以在其中向框架添加一个对象。我想到,使用这种方法来添加任何扩展对象都比使用定制标签优越得多,也比让用户获取标签并将它们连接起来以使用旧系统容易得多。因此,在从 _arrayscatter()和 _dfscatter()函数中清除了所有出现的 custom 之后,我决定改进框架,以便能够接受这些对象。
add(object) = composition,objects,tag = _frameup(base,objects,object)
add 方法只是调用 _frameup 方法,并将为它提供框架的基本标记“base”、对象的迭代列表“objects”和 object。以前,旧的 add()方法是这样的:
add(objects) = composition,objects,tag = _frameup(base,objects)
这意味着几件事。首先,对象不会被添加到对象列表中,而是替换对象。更糟糕的是,提供的对象需要在一个数组中,函数才能工作(因为不能迭代单一类型。)这只是意味着当调用函数时,您需要使用数组语法:
# This is how you would expect it to work:
frame.add(object)
# This is the change you needed to make:
frame.add([object])
我不喜欢这样,因为它假设一个数组存在于一个对象中,而这个对象很可能永远是单独的。当然,这个函数只是 _frameup()方法的一个路由器,所以让我们来看看:
function _frameup(tag,objects)
for object in objects
tag = string(tag,"(context(),",object.tag, ")")
end
tag = string(tag,")")
println(tag)
exp = Meta.parse(tag)
composition = eval(exp)
return(composition,objects,tag)
end
对象只是连接到字符串,然后在解析和计算之前添加到表达式中。相反,应该做的是将对象添加到由类型提供的对象数组中。之后,可以将一个字符串与每个对象的标签连接起来。我是这样做的:
function _frameup(tag,objects,object)
push!(objects, object.tag)
objecttags = ""
for o in objects
objecttags = string(objecttags,"(context(),",o, "),")
end
println("objects: ",objecttags)
tag = string(tag,objecttags,")")
exp = Meta.parse(tag)
println(exp)
composition = eval(exp)
return(composition,objects,tag)
ends
最后,我将向 _arrayscatter()和 _dfscatter()函数添加一个方法,该方法将调用框架来添加特性:
add(obj) = frame.add(obj)
现在我们来测试一下!
首先,我们将创建一个圆。这是我们将要添加到散点图顶部框架中的对象。我还创建了两个相同长度的数组来解析并绘制成散点图。

现在我们将创建我们的散点图。幸运的是,如果我们不记得我们的参数,Hone 有很好的文档可以参考。

plt = Scatter(x,y,Circle(.5,.5,25,:orange),:purple)
现在我们可以使用 show()方法:
plt.show()

我们可以把之前做的例子加进去,再展示一次。
plt.add(exampshape)
plt.show()

哎呀,
我们忘记将我们的方法添加到我们的类型中:

您可能已经注意到,幸运的是,我们确实有一个 get_frame()函数,我们可以调用它来返回我们的帧,并且我们可以从那里添加它。
fr = plt.get_frame()
fr.show()
这时我意识到我们把形状的 x 和 y 分别设置为 0.5 和 0.5,所以让我们改变一下…这次我们把它放在图的中心。这次我决定用文字:
realshape = Hone.Text("Greetings",(1280 / 2), (720 / 2), :blue, 30)
fr.add(realshape)
fr.show()

厉害!
创建扩展
众所周知,数据可视化和机器学习可以很好地结合在一起。考虑到这一点,我决定基于车床机器学习库对 Hone 进行第一次扩展。这也将是 Hone 的统计图的家,因为他们将使用车床模块。女士们先生们,我向你们介绍
LatheHE.jl
我决定给这个扩展添加的第一件事是绘制最佳拟合线的能力。这将相对容易,所以不要期望我一开始就做什么疯狂的事情。然而,要做到这一点,我们必须导出散点图方法中使用的所有数据,以便任何人在扩展图时都可以访问这些数据。所以回到 Hone,我只是将数据添加到类型中:

现在回到我们的最佳拟合线示例,我们可以使用 plt.x 和 plt.y 从我们的图中获取数据。为了制作最佳拟合线,我们可以采用几种方法:
- 拟合线性回归模型。
- 分离数据,得到所述数据每一部分的*均值,然后用这些点画一条线。
- 线性绘制四分位数。
我决定选择第二种方法,因为我认为这种方法可以获得最好的结果,同时对性能的要求也最低。车床.预处理有一个名为 SortSplit 的函数。要查看它的文档,我们需要首先将其导入到我们当前的环境中。
using Lathe.preprocess
然后我们可以在文档窗格中搜索它。

朱诺太方便了…
当然,第一步是从参数中获取数据,这是我设置函数的方式:
function BestFit(plt, divisions = 5, color = :lightblue, weight = 2)
frame = plt.get_frame()
x = plt.x
y = plt.y
我认为像在网格中一样使用分割可能会很酷,这样用户可以确定他们想要分割最佳拟合线的次数,并且它会自动确定这样做的数据百分比。用 1 除以划分的数目将得到一个百分比,我们可以用它来确定我们离创建每个划分还有多远。
divisionamount = 1 / divisions
接下来,我们使用一个 while 循环,该循环不断地将除法量添加到一个变量中,该变量将处理每个除法的逻辑。
lower = 75
totaldivisions = 0
arrays = []
while totaldivisions < 1
top, lower = SortSplit(y,divisionamount)
append!(arrays,top)
totaldivisions += divisionamount
end
我们在这里所做的只是将数组的小分割版本附加到一个数组中。接下来,我们需要对这个数组做一些实际的操作。
xmeans = [a = mean(a) for a in arrays]
我们将从数组中获取*均值,并将其赋给一个名为 xmeans 的变量。接下来,我们将对 y 值做同样的事情。
lower = 75
totaldivisions = 0
arrays = []
while totaldivisions < 1
top, lower = SortSplit(y,divisionamount)
append!(arrays,top)
totaldivisions += divisionamount
end
ymeans = [a = mean(a) for a in arrays]
接下来,为了执行缩放算法,我们需要 y 的顶部和 x 的顶部。
topy = maximum(y)
topx = maximum(x)
现在我们基本上要从 Hone 的 Linear()函数中复制从两个数组生成数组对的循环。如果您想了解关于这个函数的更多信息,我在这里写了一篇关于它的文章:
[## 向我的图形库添加线图
继续构建 Hone.jl 中实现的特性,并调试出现的问题。
towardsdatascience.com](/adding-line-graphs-to-my-graphing-library-eb6447a0c726)
pairs = []
first = true
for (i,w) in zip(xmeans,ymeans)
if first == true
x = 0
first = false
else
x = (i / topx * frame.width)
end
y = (w / topy * frame.height)
pair = Tuple([x,y])
push!(pairs,pair)
end
在这个循环中唯一不同的是有一个新的变量和条件名为 first,它将决定我们是否在第一个循环中。我这样做的原因是为了让这条线总是从左边来。另一种我们可以在这里做 X 的方法是,将框架高度除以划分的数量,然后将原始数量加到自身,直到我们达到划分的数量。这样做将确保该行始终是一个从零开始并在帧的末尾结束的函数。
最后,我们将把帧作为元组数组进行类型断言,创建一个 line 对象,把它放入一个 transfer 类型,而不是返回一个类型,我们只是把它添加到帧中。
pairs = Array{Tuple{Float64,Real},1}(pairs)
lin = Line(pairs,color,weight)
expression = string("(context(),",lin.update(:foo),")")
tt = Hone.transfertype(expression)
frame.add(tt)
end
现在让我们来试试吧!
plt = Scatter(x,y,Circle(.5,.5,25,:orange),:purple)
include("src/LatheHE.jl")
using Main.LatheHE
LatheHE.BestFit(plt,2)
plt.show()

在未来,我可能会考虑像我之前谈到的那样填充 X,而不是像这样,因为我们确实有很多重叠,因为 X 是我们除法的手段。
结论
我对 Hone extensions 的潜力感到非常兴奋!您可以执行任何操作,从创建用于绘制数据的自定义图形,到向绘图添加新要素。最重要的是,一切都变得完全自定义,因为我们使用标签来呈现一切。任何可以适当组合的东西都可以添加到任何框架中。
我看到未来有很多延伸。也许有些很简单,只是添加了一些你可以使用的不同的看起来很酷的图例。也许一些或更复杂,实际上动画你的情节或添加 Javascript 的交互性——可能性是无限的!如果你想开始制作自己的 Hone 扩展,你可以添加#Unstable 分支以获得最新版本(0.0.4)并开始试用它!
[## emmettgb/Hone.jl
模块化的形状,网格和线条容易预制快速绘图简单和轻型车床集成(即将推出)…
github.com](http://github.com/emmettgb/Hone.jl)
我如何发布了一个应用程序和模型来对 85 种蛇进行分类(你也可以这样做)
原文:https://towardsdatascience.com/how-i-published-an-app-and-model-to-classify-85-snake-species-and-how-you-can-too-c13ac8fdb6c?source=collection_archive---------40-----------------------
从 MOOC 到现实,你如何成为一名实践者,如何克服项目过程中的任何挑战!
为什么?
我刚刚完成了最后一门 MOOC 课程,不禁想知道自己是否准备好开始一个项目。我吓坏了,害怕了,缺乏自信。然而,经过数周的沉思,我咬紧牙关,宣布我将创建一个简单的图像分类模型。
现在我有一个在 Play Store 上正式可用的应用程序和一个带有开源代码的 GitHub repo 。我想解释一下我所面临的障碍以及我在克服这些障碍时所学到的经验(希望这也能帮助你)!

封面图片来源于此处
我的旅程
- 从谷歌图片搜索结果中创建了我自己的数据集
- 从最简单的线性回归模型开始
- 尝试使用我自己定制的 CNN
- 切换到一个 大得多的数据集
- 参加了斯坦福大学的 CS231n 课程来巩固我的基础(理论知识)
- 创建了基本代码来训练一个 MobileNetV2 模型
- 了解超级融合(关于 PURE PyTorch 超级融合的文章即将推出……)
- 为 Snaked 创建了一个 Android 应用程序,可以在输出蛇的种类之前拍摄和导入照片
简而言之,我犯了很多错误,这也正是我学习的方式。谷歌图片报废让我体会到创建一个包含 120,000 张图片的数据集所付出的努力。从线性回归开始是一个重大的、愚蠢的和可笑的错误,但它教会了我 CNN 的和预先训练好的模型的第一手价值。在这样的任务中尝试线性回归也迫使我去发现神经网络是如何工作的以及为什么会工作!一个普通的预训练模型的长训练时间和*庸的结果使我发现了超级收敛!
我的错误就像一个个阶段,如果没有每一个阶段,我就不会学到我所学的全部内容
好处
一个显而易见的问题是,既然免费的 MOOC 可以教授相同的内容(甚至可能花费更少的时间和精力),为什么还要克服一个又一个障碍呢?我已经回答了问题,但简而言之,归结为:
你记得你反复使用的信息,并逐渐忘记所有其他的信息
现在,这并不意味着你不去参加任何 MOOC 教程,只是确保你不会陷入“教程地狱”!相反,如果你知道基础知识,那么就把你现在学到的东西应用到创建一个你可以炫耀的又酷又有趣的项目中去!
我克服的挑战
我应该现在开始吗?
你质疑自己目前的技能、知识和理论基础水*的事实表明,你意识到了自己理解的局限性!这并不意味着你很笨,或者没有准备好,相反,你学到了足够多的东西,知道前方还有很多路等着你。
要明白总会有更多的东西要学,所以不妨开始使用你已经知道的东西
我的想法够好吗?
你可以做两件事来判断:
- 我的想法是不是太简单/复杂了?
- 问别人
如果你不确定这个项目会有多复杂,考虑一下其他人在类似任务中的表现。找到答案的一个方法是搜索在线文章或研究论文。如果你找到了数百个,那么问题可能太简单了,但是如果你只找到了几个,那可能就不现实了(或者你有一个天才的想法)。手头的主题知识是必须的,所以只要研究这个主题,看看你会发现什么!
如果你还没有任何与数据科学家的联系,那么你就必须伸出援手(像我一样)!无论如何,我都会尽快这样做,因为在任何情况下,拥有不同的观点总是非常有用的。我个人的方法是联系我附*的数据科学家,说我正在研究机器学习,寻求一些建议。大多数人拒绝,但如果你付出足够多,它仍然有效!
万一失败了呢?
找出为什么你的项目不能工作!
如果找出为什么一个想法行不通不能解开另一个解决方案,那么你已经发现了一些新的东西……这就是一种成就!
我不知道该怎么办!
找出与你试图解决的问题相似的问题。对我来说,我从如何使用 PyTorch 分类数字(MNIST)和更复杂的对象(CIFAR100)的教程开始。我跟着教程走,弄清楚他们是如何完成任务的。然后我使用迁移学习,复制每个教程所做的,但是这次是为了我自己的问题。
当然,我还远远没有准备好应对全部挑战,但是随着时间的推移,我越来越明白了。
如果你仍然停滞不前,你可能真的需要回到书本(或课程)中去。
什么都没用!
只要坚持下去,过一会儿,就会有所收获!在创建我的第一个模型的开始,我的代码都没有运行,但最终(几天后),我设法找到了 bug 并修复了它。我知道如何用 PyTorch 运行培训和评估循环!请注意,通常是一个小小的微小变化最终会使代码复活(所以,四处试验,大量调试,你就会弄明白)。
我不明白一切是如何运作的?
理论可能很难。你可以有一个工作模型,但是不知道迁移学习模型、优化器、损失函数…或者你用过的其他东西是如何工作的。但是训练模型需要多长时间…几小时,几天,几周?如果你能写代码,就这么做,运行它,在它工作的时候学习理论。你们俩的训练然后(双关语)!
这是可行的,但是我如何改进它?
我有一篇关于如何改进你的模型的博文。一旦你有了一个工作模型,看看吧!
创建一个像样的模型后,我做什么?
这是一个循环:
学习,创造,提高,炫耀,冲洗,重复!
只是创建博客,创建项目,然后继续这个循环。
感谢阅读!
既然你已经听了我的漫谈,我想感谢你花时间通读我的博客(或者跳到最后)。
如果这对你有所帮助,请考虑查看如何选择型号!
我是如何剔除和分析巴黎人口统计数据的
原文:https://towardsdatascience.com/how-i-scraped-and-analized-paris-demographical-data-7025acf01a09?source=collection_archive---------36-----------------------
使用 Python 和 Tableau 处理和分析数据

https://www.pinterest.fr/pin/614108099163543096/
在过去的 20 年里,作为法国首都的巴黎一直面临着人口的重大转变。因此,分析它会很有趣。
在本文中,我们将从不同的来源收集数据,然后使用基本工具进行分析。
数据报废
巴黎人口演变
“启动我的项目最方便的是什么?”
开始一个项目时的经典问题。
我开始在巴黎数据网站上搜索:https://opendata.paris.fr/pages/home/。在这里,我只找到当前的人口统计数据,没有关于它的演变。所以这项工作从一些数据废弃开始。

你可能知道,巴黎分为几个区,称为“区”。所以我需要每个地区的人口数量。
我们可以用这种表格为每个地区找到一页。这些维基百科页面有着相同的模式:
https://fr . Wikipedia . org/wiki/" district number " arressment _ de _ Paris # D % C3 % a9 mographie
经过半个小时的报废,我很快获得了这样的东西:

我只收集了 1999 年以后的数据来做分析。
我们可以看到,我们必须在分析之前处理这些数据
我们需要有一个数据框架,其中有区县,年份和人口为特征
我们可以使用融化功能来做到这一点。


然后,我们将该数据帧保存为 csv 格式,以备将来使用
区域价格演变
分析这些地区一年来的价格变化可能很有意思,但我找不到合适的 csv 来分析。
我在巴黎公证处网站上找到了一个 pdf 格式的表格,里面有我想要的所有信息。

我用一个在线工具把这个 pdf 文件转换成 csv 格式。https://www.zamzar.com/fr/convert/pdf-to-csv/
数据帧如下图所示。

这里我们有很多预处理要做

- 我们要删除“未命名的 0”列
- 我们在 pdf 版本中有一些只有文本的行,我们必须删除。
- 我们需要“地区名称”具有邮政编码格式。
- 最后,我们需要使用 melt 函数,以便我们的数据帧具有与人口数据帧相同的格式。
区的面积
为了得到人口密度,你必须将人口除以面积,所以我必须得到每个区的面积
为了得到这些数据,我查阅了这个网站:https://fr.vikidia.org/wiki/Arrondissements_de_Paris
形象化
可视化价格演变
数据准备好了吗?我们可以想象!
我打开 Tableau 上的价格数据集,并按地区显示历年的价格


1999 年至 2019 年巴黎各区房价的演变
我们可以很容易地看到,在过去的几年里,价格飞涨。我们可以用熊猫来发现这种进化。

我们获得了 1999 年的 2863.75 英镑和 2019 年的 10618.6 英镑。
价格因此在 20 年间上涨了 4 倍。对投资者来说真是太划算了!



1999 年(左)和 2019 年(右)的价格分布
我们可以看到,第 7 区和第 6 区一直是最贵的,而第 19 区和第 20 区是最便宜的。然而,我们可以在 2019 年看到中心区和其他区之间更严格的划界。
可视化密度演变
为了分析密度,我们需要两个不同的数据集,一个是面积数据集,一个是人口数据集。我们将在“行政区”进行左连接以合并这些

我们还需要删除 2009 年和 2011 年的行,因为我们没有这两年每个地区的数据。然后,我们可以创建我们的密度特征和导出我们的 csv 显示在 Tableau



巴黎各区人口密度的演变
嗯,看来巴黎的人口密度在那些年间并没有太大的变化。无论如何,那样是看不到的。
然后,我们将尝试检查各区的价格是否会影响其密度。为了做到这一点,我们将编写一个简单的函数,比较每个地区密度最大的年份与价格最小的年份是否相同。
但首先我们需要合并价格和密度数据集。


作为输出获得的数据帧
数据已经准备好了,我们可以把它们显示在桌面上


我们取得了什么结果?
一般来说,低价格并不意味着特别高的密度,除了中心的四个区(姑且称之为“四大”)。我们可以问自己:为什么会有如此尖锐的分界?
2006 年,四大的密度处于最佳状态,但在 2017 年,由于某种原因,这些地区的密度有所下降。
总之,我们将通过将四大中的地区与不在四大中的地区分开来比较价格和密度的演变。
我们需要两个数据集,一个包含四大,另一个包含其他

然后用简单的微积分我们可以得到我们的进化


从 2006 年到 2017 年的价格和密度演变
尽管“四大”的房价涨幅与其他地区几乎相同,但我们看到“四大”的人口密度下降了* 5%。
因此,我们可以假设这些地区的价格继续上涨,而 11 452 €的价格上限正在阻止这些地区稳定其人口
总之,我们看到,只要有一点耐心和时间,我们不一定需要现成的数据集来产生强大的分析,我们可以纯粹使用整个互联网作为我们的数据集。
我如何与数据科学保持同步
原文:https://towardsdatascience.com/how-i-stay-up-to-date-with-data-science-41e2e6bbbe72?source=collection_archive---------14-----------------------
分享我所知道的最好的数据科学资源

由 Szabo Viktor 在 Unsplash 上拍摄
跟上数据科学的发展,同时从杂质中过滤黄金,对于任何认真掌握自己技术的数据科学家来说都是必不可少的。
自从我对自己承诺每周发布 3 篇博客文章后,拥有可靠的、鼓舞人心的、有效的资源对确保我实现我对自己的承诺至关重要。
话虽如此,以下是我如何保持最新的…
走向数据科学
[## 走向数据科学
共享概念、想法和代码的媒体出版物。
towardsdatascience.com](https://towardsdatascience.com)
一般来说,我用得最多的是数据科学。一份受欢迎的媒体出版物,涵盖了一系列技术领域,如编程、数据可视化、机器学习、深度学习,当然还有数据科学。
最*,我也在钻研 Spotify 上的“走向数据科学”播客——我个人更喜欢较短的播客(1 小时或更短),因为我倾向于在早上健身时听它们,这就是为什么这个播客符合要求。
走向人工智能
[## 走向人工智能——最好的技术、科学和工程
欢迎来到人工智能最好的技术,科学和工程。走向人工智能最新故事更新[rev_slider…
towardsai.net](https://towardsai.net/)
《走向人工智能》是世界领先的多学科出版物,关注科学、技术和工程,强调多样性、公*和包容性。我们出版最好的技术、科学、工程和未来。”——(来源:走向 AI 关于页面)
《走向人工智能》越来越受欢迎。我第一次看到他们的作品是因为 Benjamin Obi Tayo 博士的伟大著作。
我发现关于《走向人工智能》的文章比《走向数据科学》要广泛得多,而且有许多有趣的读物。
KDnuggets
[## KDnuggets
机器学习、数据科学、大数据、分析、人工智能
www.kdnuggets.com](https://www.kdnuggets.com/)
当我第一次学习机器学习时,我遇到的第一个网站可能是 KDnuggets,幸运的是,我已经在 KDnuggets 上分享了许多我在 Medium 上分享的文章(绝对荣幸!).
我强烈推荐给 KDnuggets 添加书签。
除了博客和新闻,网站上还有在线研讨会、教程、课程和数据集。
注意:我必须指出,我没有使用过他们的任何课程,但是考虑到网站上精选文章的质量,我毫不怀疑其余的内容将会非常有用。
数据营
[## 在线学习 R、Python 和数据科学
使用 DataCamp 的视频教程&编码,按照您自己的节奏,在您的浏览器中舒适地学习数据科学…
www.datacamp.com](https://www.datacamp.com/)
我可能是错的,但我相信 Datacamp 可能因其密集的课程而闻名,这些课程涵盖了从一名有抱负的数据科学家到全职专业人员的整个旅程。
我最*看到了社区博客,这些博客对我写的一些文章很有启发。
注意:我在 Datacamp 上看到的许多文章都更具技术性,尽管也有一些非常好的建议,比如 如何通过 8 个步骤 成为一名数据科学家。
分析 Vidhya
[## 分析 Vidhya
了解机器学习、人工智能、商业分析、数据科学、大数据、数据可视化…
www.analyticsvidhya.com](https://www.analyticsvidhya.com/)
Analytics Vidhya 是另一个提供完整数据科学生态系统的流行*台,我也有幸为 Analytics Vidhya 撰写文章。
在 Analytics Vidhyam 上,你可能会决定了解行业的顶级趋势,参加在线课程,参加黑客马拉松,等等,尽管我主要是在 Analytics Vidhya 上寻找“深入”教程(特别是关于新技术——或者我应该说是新技术)。
Chai-Time 数据科学(播客)
[## 柴时代数据科学
您已成功订阅柴时代数据科学太好了!接下来,请完成结帐,以便完全访问 Chai Time…
chaitimedatascience.com](https://chaitimedatascience.com/)
如果我不包括 Chai-Time 数据科学播客,那将是难以置信的刻薄,因为它对我来说太棒了。
我从第一次采访阿布舍克·塔库尔开始就一直是一名听众。当时,我从未听说过 Abhishek(当时是 3x 特级大师)或 Kaggle,但我忍不住返回播客,观看最新的获胜解决方案(关于 Kaggle 竞赛)采访。
包裹
在不久的将来,我计划阅读更多的研究论文,参加更多的活动——如果参加是安全的(如果不在网上也可以)。无论如何,这些并不是掌握数据科学最新动态的唯一渠道,所以如果你有一些想要分享的来源,请在下面的评论中留下回应或在 LinkedIn 上给我发消息。
[## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)
我如何了解最新的人工智能研究
原文:https://towardsdatascience.com/how-i-stay-updated-on-the-latest-ai-research-b81203155551?source=collection_archive---------25-----------------------
这一切都是为了订阅正确的提要

克里斯托夫·杰施克在 Unsplash 上的照片
艾是新电 ,为溟故。每天都有另一个应用被前沿的机器学习研究打乱。试图跟上层出不穷的新技术令人心碎。如果你想试着应付它,在这里我给你介绍我的 5 大人工智能相关新闻和知识资源。
第一批
deeplearning.ai 每周简讯。每周,它都包含最*的突破和值得注意的新闻,以及吴恩达本人的简短介绍。批处理最大的优点是它快速、独立,并且总是包含一些关于新闻的观点,比如“为什么它很重要”
这是开始的最佳地方,因为它不是压倒性的,是独立的,并且不专注于任何特定的子主题。
#2 中等
是啊,这地方太棒了。确保你将人工智能和数据科学作为感兴趣的话题,并开始关注与你有相似兴趣的人和出版物。我在批次中看到的大部分内容也在这里看到,但更详细。有时候我在还没到批次之前就在这里找到了。
媒介的显著特征是声音。你经常会看到在大公司工作的人、初创公司的首席执行官或者顶尖大学的博士生。技术内容通常是由真正的技术人员编写的。它们不是由训练有素的记者写的,而是由真正该死的书呆子写的。樱桃去评论区。你不仅仅是在阅读这些人的来信,你也有机会直接和他们交谈,问他们任何问题。
推特排名第三
找到你喜欢其作品的人,并在 Twitter 上关注他们。这足以让*台将他们最重要的推文通过电子邮件发送给你。在我开始这样做之后,我惊讶于我收到的有用链接的数量。如果你不知道从哪里开始,从跟随#5 的客人开始。
Twitter 是新闻诞生的地方。在我创建了我的账户并开始关注人工智能的人之后,我开始看到一些故事,这些故事只会在几周后在更大的频道上弹出。在任何人可以就某件事写一篇文章之前,它的作者已经在推特上谈论它了。除此之外,我不使用 twitter。
排名第四的 YouTube
与 Medium 类似,YouTube 有许多技术人员在撰写关于人工智能的论文。YouTube 的缺点是它没有那么多的监管,也没有有用的电子邮件摘要。积极的一面是对你的要求比较低。看视频比读文章更能放松眼睛。
我的推荐是 两分钟斯帕茨和扬尼克·基尔彻。前者专注于展示令人赏心悦目的人工智能和图形研究,后者则更深入地分析人工智能论文,直至数学。我承认我不太喜欢扬尼克的视频,因为它们太长了,但我喜欢他的选择。每当他上传东西,我就搜索报纸看。
#5 人工智能播客/莱克斯·弗里德曼播客
Lex Fridman 是前麻省理工学院教授,经营一个关于人工智能和计算机科学的播客。客人的选择是杰出的。其中包括图灵奖得主、诺贝尔奖得主,以及许多才华横溢的个人,比如 3Blue1Brown 的主持人格兰特·桑德森和埃隆·马斯克。对我来说,这个播客的美妙之处在于莱克斯总是要求他的客人解释基本概念,但谈话从不回避技术问题。
这是获得视角的地方。你还能在哪里找到诺姆·乔姆斯基和丹尼尔·卡内曼在讨论艾的未来?或者是 TensorFlow 背后的首席工程师深入讨论它的历史,并不羞于谈论技术?阅读论文固然很好,但倾听一些迄今为止最具突破性的研究背后的人所说的话,对于理解现在正在发生的事情和接下来可能会发生的事情有很大帮助。
免责声明:该播客最*更名为 Led Fridman 播客,因为 Lex 采访了越来越多来自其他领域的嘉宾,如哲学、神经科学等。
#6 奖励:社区建议
在这里,我在评论区展示了其他用户提到的额外资源。请让我知道你是否想加入这个列表。
大卫·佐丹奴建议 AI 趋势、麻省理工科技评论、论文代码。这最后一个有一个时事通讯,我不知道。我自己刚签到。
Marc von Wyl 推荐了 TWiML 播客和 Twitter 简介@ Omar saro和 @seb_ruder ,NLP 新闻的金矿。
Gaurav Ragtah 增加了catalyst ex,这是一个针对 AI 模型和 ML 知识库的管理员/搜索引擎。浏览器插件可用于 Chrome 和 Firefox 。
Unmesh Kurup 强调了数据科学周刊和数据灵丹妙药时事通讯,这是另外两个为从业者策划的新闻来源。
非常感谢每个人的建议和允许将它们添加到这个奖励区。
he Batch 有一般新闻,Medium 有各种声音,Twitter 有最新的东西,YouTube 给你展示最闪亮的结果。最重要的是,听播客有助于你从该领域的重要人物那里获得一些观点。
当你开始有规律地消耗这些资源时,真正的魔力就出现了。随着时间的推移,你会意识到你在一个地方看到的一些新闻会突然出现在另一个地方,但细节数量不同。这极大地有助于获得更深层次的理解,因为你在不同的深度上一遍又一遍地接触同样的想法。你开始建立联系。
欢迎评论或联系我。如果你刚接触媒体,我强烈推荐订阅。对于数据和 IT 专业人士来说,中型文章是 StackOverflow 的完美搭档,对于新手来说更是如此。注册时请考虑使用我的会员链接。
快乐阅读/聆听/观看:)
我是如何熬过两年没有 Excel 的日子的
原文:https://towardsdatascience.com/how-i-survived-two-years-without-excel-53cb20aca5b7?source=collection_archive---------49-----------------------
2018 年,我停止使用 Excel 冷火鸡,Python 使我成为一名更好的专业人士。这个故事讲述了我从 Excel 走向 Python 世界的个人历程。

在 Unsplash 上由 Hitesh Choudhary 拍摄的照片
两年前,我做了一个重大的改变,我不再使用 Excel,转而使用 Python。自从 1996 年我开始学习机械工程以来,Excel 已经成为我生活的一部分。不知不觉中,Excel 成了我日常工作的一部分,我用它来处理工作和家庭中的大部分事情。它只是偷偷溜进来,从未离开,直到我意识到它在限制我。我注意到世界的其他地方都在前进,我必须改变自己,为一个编码成为规范的新世界做准备。
最初的 100 个小时是最艰难的,但也是最有收获的。
我突然停止,一气呵成,没有回头。我觉得这是我做出改变的唯一途径。最初的 100 个小时是最艰难的,但也是最有收获的。当第一个 Excel 需求出现时,我感到不舒服,我感到紧张,几乎开始发抖,因为我知道我必须用 Python 来做。晚上我会做一些最基本的事情,比如从文件中读取数据(比如别人发来的 Excel 表格),对列排序,重命名列,改变格式(datetime…arghh),对数据分组,计算新列等等。我多次感到沮丧,因为我知道如何在 Excel 中通过几次点击来完成这些事情,但我坚持下来了,因为我决心不故态复萌,不给面子。然而,每次我设法把事情做完,我都感到非常满意,并且有更多的精力去迎接下一个挑战。
一天晚上,我突然意识到,当我感到沮丧时,我在学习,换句话说,沮丧是整个经历的一部分。挫折就像戒断症状,也就是一件好事。
在我停止之前,我确实通过学习 Python 的一些基础知识为自己做了准备。我知道,如果没有准备,我会很快回到我的老套路。这些是我所做的事情,目的是为了让我能够轻松地放弃 excel。如果这个列表对你来说太长了,专注于学习熊猫,因为这个库最接* Python 中的 excel 和你的生命线。
我读这些书给我一个坚实的基础:
- 面向儿童的 Python:有趣的编程介绍 — 学习 Python 的基本语法
- 与 Python 的数据角力——学习熊猫的诀窍,替换 excel 的库(你的生命线)
- 使用 Scikit-Learn 和 Tensorflow 进行机器学习 — 学习机器学习的概念,以激励我向前看并保持动力
阅读像你这样的普通人写的关于 Python 和编码的文章也会有所帮助(也就是说,你并不孤单)。我开始阅读各种关于 Medium.com 的出版物,比如:
- 编程
- Python 直白的英文
- 代码突发
- 走向数据科学
我通过 MITs 开放课件(免费)学习了一门课程:“计算机科学和 Python 编程导论”本课程向您介绍基本概念和 Spider IDE。它迫使你通过实践刚刚学到的东西来建立新的习惯。我不认为你需要学习整个纳米学位来学习 Python,一门课程就足够了,然后迅速应用到现实生活的项目中。
[## 计算机科学和 Python 编程导论
6.0001 计算机科学和 Python 编程的介绍是为很少或没有…
ocw.mit.edu](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-0001-introduction-to-computer-science-and-programming-in-python-fall-2016/)
我认为学习 Python 不需要读一个纳米学位。最重要的是做真正的项目。
一旦做好准备,我就觉得可以轻松地跨过去,就像处理任何其他成瘾问题一样(我的情况很好),你需要迅速养成新习惯。在这种情况下,新习惯意味着你需要在现实生活项目中工作;最好是你工作中的项目。对于所有这些项目,我使用了 Jupyter Lab 。
我参与的一些项目:
- 分析维护记录以计算设备的*均修复时间(MTTR)
- 分析维护活动,并确定这些活动的类型和成本的长期趋势
- 分析实时工厂信息(数百万行传感器数据,如压力、温度和流量),以了解导致跳闸和故障的事件
- 应用 pyautogui 来自动批准休假——以及 IT 请求(并且通过每 5 分钟移动鼠标来看起来很忙…)
- 使用镶嵌方在技术图纸上进行光学字符识别
- 安全和维护记录的 NLP 主题建模
- 关于设备故障(阀门、压缩机、冷却器、仪器仪表)的机器学习
正如你从这些项目中看到的,我很快进入了 Python 的更高级的使用。这些项目无法在 excel 中完成,这只是展示了离开 excel 是多么的自由,并最终使我成为一名更好的专业人士。

照片由布鲁斯·马尔斯在 Unsplash 上拍摄
这是不是意味着我完全不用 Excel 了?不完全是不幸的。只有当有人给我发来一份 excel 表格,其中包含了大量的数据争论,并且重做每一件事会花费太多的时间时,我才会使用 excel。然而,我停止了创建新的 excel 表格,现在开始默认使用 Python,因为我知道我需要保持我新获得的技能。
对我来说,两年前离开 Excel 给了我启发,并开启了许多新的机会。我已经生存了 2 年,我知道我会继续下去。再见 Excel,不会想你的…
人工智能学习飞行(上)|飞机模拟和强化学习
原文:https://towardsdatascience.com/how-i-taught-a-plane-to-fly-using-rl-c170a152b771?source=collection_archive---------19-----------------------
了解飞行力学以及如何用 Python 模拟飞机

来源。皮沙贝
从伊卡洛斯燃烧他的翅膀到莱特兄弟翱翔天际,人类花了几千年才学会飞行,但人工智能要多久才能做到呢?
介绍
大家好!
在这一系列文章中,我将讲述我使用人工智能驾驶飞机的旅程。如今,人工智能被用于从双足机器人到自动驾驶汽车的各种应用中,但迄今为止还没有看到人工智能飞机,让我们改变这一点!
强化学习是机器学习 (让算法学习如何做事情,而不是告诉它们如何做) 的分支,它通过一个行动和奖励过程来处理对人工智能的训练。代理将与环境交互,选择动作、并观察其结果(新状态和奖励),同时试图优化其回报(其奖励的总和)。
在这篇第一篇文章中,我们将定义转换函数,允许环境根据先前的状态和代理动作计算下一个状态:在我们的例子中,根据飞机的当前位置、速度和加速度以及飞行员的动作(推力值和俯仰角)计算飞机的下一个位置、速度和加速度。我们将基本上创建一个基本的飞机模拟。
在第二篇文章中(** 这里 ),我们将讨论环境的其余部分(状态、动作和奖励)和强化学习 代理(模型选择、超参数优化、代理训练和测试)。**

飞机是怎么飞的?
为了创建一个飞行模型,让我们首先快速回顾一下飞机是如何飞行的。有四个力影响一个*面

影响飞机的四个力
这两个水*力是:
****推力:推进器或反应堆产生的推动飞机前进的力
****阻力:空气阻力产生的力,与飞机的运动方向相反
两个垂直力是:
****重量:飞机的重量
****升力:让飞机飞行的力量
为了让飞机在水*方向获得速度,我们必须有推力>阻力,为了让飞机在垂直方向获得速度,我们必须有升力>重量。
在这篇文章中,我不会对飞行力学和升力的起源进行过多的技术分析,但是如果你想了解更多关于这个主题的知识(伯努利原理、牛顿定律和纳维尔-斯托克斯方程),我强烈推荐你观看大卫·卢阿普雷的这个视频(我为此添加了英文字幕,目前正在等待批准) :
一.飞行模型
让我们创建我们的飞机模拟,根据飞机的上一个位置、速度和加速度计算飞机的下一个位置、速度和加速度。
我选择模拟空客 A320 是因为它在世界范围内的广泛应用以及该飞机可用的数据数量(插图仍将使用我的木制玩具飞机制作,但数字将基于实际飞机,这些数字可以在[1]中找到)。
I.1)模拟范围
我们将建模:
****推力(因海拔和空气稀薄而变化)
升力
****阻力(由于空气密度随高度变化以及由于迎角变化)
****升力(襟翼用于增加升力)
****燃油消耗(燃油消耗率估算和因燃油消耗引起的飞机质量变化
*面模型的目的是根据前一时间步的条件,计算任意给定时间步的*面的加速度、速度和位置(在本文的其余部分,我将称之为动力学)。在整个研究中,我们将使用地面参照系。
I.2)空气动力学建模
所以,让我们深入建模。为了计算地面参照系中给定时间步长的飞机动态,我们将使用以下关系式:

我们现在有了一种基于加速度计算速度和位置的方法。现在我们来计算加速度。为此,我们将使用牛顿第二定律:

换句话说,作用在物体上的力的总和等于它的质量乘以它的加速度。所以,为了计算我们飞机的加速度,我们必须计算施加在它上面的力的总和。如前所述,我们有重量、推力、阻力和升力。让我们一个一个来看看。
1.3)重量
这是最简单的!这是地球引力对飞机质量的作用力。

I.4)推力
这个有点复杂。这是飞机涡轮喷气发动机产生的力。涡轮喷气发动机基本上吸入飞机前方的空气,并以更大的速度排出,从而推动飞机前进。
随着高度的增加,涡轮喷气发动机的效率由于空气稀薄而降低(导致吸入和加速的空气减少)。我们将使用以下关系来解释这种减少(我从网上找到的图表[2]中*似得到)。
****
我们将忽略温度变化对涡轮风扇效率的影响,因为我们假设空气密度的变化已经说明了这一点。
I.5)拖拉和提升
阻力基本上是阻碍飞机运动的空气。升力是由机翼上方和下方的速度差产生的力,用来补偿重量,从而获得高度。尽管它们对飞行的影响完全不同,但它们都是气动力,并通过类似的公式获得:

正如我们在研究推力时所看到的,空气密度随着高度的增加而减小。因此,我们有:

在进一步讨论之前,我们需要确定阻力和升力之间的区别。为此,我们必须引入*面的参考,并定义几个角度:

作用在*面上的所有力

我们将在以后计算速度,但现在我们已经解决了空气密度,让我们更仔细地看看升力和阻力系数,参考面,以及它们与迎角的关系。
I.6)升力/阻力系数
升力系数和阻力系数,用来描述气流绕过形状的难易程度,与迎角成正比。我们将使用下列*似值(考虑 20°以上的失速)来计算它们:
****
相对于α()的*似 Cz 和 Cx
I.7)马赫数影响
另一个重要现象是接*音速的速度对阻力和升力系数的影响。随着飞机接*音速,机翼上开始出现湍流,并影响阻力和升力。m,马赫数代表速度与音速之比。我们将再次*似这个关系:
****
相对于马赫数的 Cx 和 Cz *似值
I.8)参考表面
计算阻力和升力所需的参考面,是与我们感兴趣的力的方向正交的面。对于阻力,参考面是与相对风相反的一面,而对于升力,参考面是与相对风*行的一面。我们感兴趣的表面是相对于相对风的表面。因此,我们将使用相对风的参照系(x'z ')。它是通过旋转我们的初始参考系的斜率值得到的。****

绝对(地面)框架和相对风框架
我们必须计算前表面和机翼表面相对于相对风参考系的投影。

表面投影
因此,我们得到了沿相对风轴 x’和 z’投影表面的方程:

I.9)襟翼
(如果您想了解更多关于襟翼的信息,请随意观看此视频)
在起飞和着陆期间,飞机使用襟翼以增加阻力为代价来增加升力从而缩短起飞和着陆距离。起飞距离定义为跑道起点与飞机到达跑道上方 25m 高度点之间的距离。我们将起飞角定义为飞机达到起飞速度后所使用的俯仰角(地面与飞机之间的角度)。这是我们的飞机在没有襟翼的情况下的起飞距离(我们将只绘制低于 5 公里的起飞距离值,即最长民用跑道的长度)。

起飞距离(m)与不带襟翼的起飞角( )
A320 的起飞距离应该在 2 公里左右。在这一点上,飞机没有产生足够的升力,所以我们需要使用襟翼。我们假设襟翼使升力增加 70%。(价值基于文档,并经过调整以实现实际结果)。襟翼将在飞机启动时伸出,并在 400 英尺高度自动返回。去掉襟翼后,我们的起飞距离更接*真正的 A320:

襟翼展开时起飞距离(m)与起飞角度的对比( )
I.10)角度冲击
现在我们已经有了重量、推力、升力和阻力的基本公式,我们需要讨论它们的方向的影响。让我们再看看我们的角度图。

所有影响飞机的力量
现在让我们把这些力投射到 x 和 z 轴上:

x 轴上的投影

z 轴上的投影
因此,我们得到要求解的方程,以便得到 x 轴和 z 轴上的力之和。

I.11)碰撞
为了完成我们的模型,我们需要使它能够阻止飞机穿过地面并检测碰撞。对于这些情况,通过将任何负垂直位置设置回 0 以及将速度设置回 0 来防止这些碰撞。考虑到未来的碰撞检测,如果飞机的垂直位置为负,同时垂直速度为负(设置回 0 之前),我们将计算飞机的动能,用于检查与地面的碰撞是否导致碰撞。

如果地面接触的动能低于给定值 E_crash,那么飞机就会坠毁。否则,它将被视为安全着陆。该功能将在以后用于强化学习部分。
I.12)油耗
对于燃料消耗,我们将使用基于推力燃料消耗** (SFC) 的简单模型,该模型将推力和时间与燃料消耗联系起来。为了简化问题,我们将总是假设巡航水* SFC,而忽略海*面 SFC(因为我们将在巡航水*花费大部分时间)。**

为了估算 SFC,我们将假设海*面推力(反应堆的最大可用推力)和巡航 SFC 之间的关系是线性的。根据这一假设,我们可以根据 A320 发动机的数据估算推力和 SFC 之间关系的参数,我们得到 SFC 为 17.5。由于燃料消耗,飞机的质量将会变化,我们将把这种变化考虑到动力学中。此外,如果燃料的变化超过总容量,飞机的反应堆将停止工作。
二。结果分析和验证
为了检验我们的模拟,我们将对 A320 的模拟结果与现实进行分析和比较。
系好安全带,准备起飞!
二. 1)起飞

起飞时加速度、速度和位置与时间的关系
在这三张图中,我们可以看到起飞阶段的加速度、速度和位置随时间的变化。加速度一开始只是水*的,到了 Vr(旋转速度)(~25s)且*面旋转的时候水*和垂直都有。这种现象在速度上也可以看到,垂直速度在 25s 时开始上升,水*速度(水*加速度)的增长率下降。最后,最后一张图允许我们估计大约 1800 米的起飞距离,这接*于我们预期的距离(大约 1900 米)。此外,25s 的起飞时间(离地前的时间)也与现实相符(约 30s)。此外,我们还可以注意到,加速度值保持在令人不愉快的值以下(水*方向达到最大值 0.33g,垂直方向达到最大值 0.06g)。
II.2)最大速度
我们希望评估我们的飞机没有超过对其结构完整性危险的速度(过于接* 1 马赫会在飞机结构上产生严重的湍流和应力)。为了测量我们的飞机可以达到的最大速度,我们将推力设置到最大值,并观察飞机稳定的速度。

全速时速度与时间的关系
飞机稳定在 300 米/秒(0.87 马赫)的最大速度,这远远低于音速,对我们的飞机来说是安全的。然而,它高于真正的 A320 的最大速度(0.75 马赫),但我们假设忽略这一差异是合理的,因为大多数航班根本达不到这一速度。
II.3)巡航速度和高度
为了估计我们的巡航速度,我们将不得不把我们的反应堆调到巡航状态,这通常意味着把功率降低到 60%到 70%之间。我们将把我们的涡轮风扇切换到 60%的输出,设置一个给定的θ角(通过试探法获得 2.5°),观察我们达到的巡航速度和巡航高度。

速度和位置与时间
我们观察到巡航速度为 231 米/秒,*均巡航高度为 10500 米。这两个值与 A320 0.72 马赫(233 米/秒)的经济巡航速度和 37000 英尺的巡航高度相匹配。这种匹配是通过调整模型的一些参数(巡航阶段的推力百分比和θ角)实现的。
II.4)范围
一架飞机的航程是在给定燃油量和起飞质量的情况下,它可以行驶的最大距离。我们将研究我们的飞机在油箱加满和最大起飞质量(总共 73.5 吨)的情况下的航程。航程将通过在给定的巡航推力和巡航角(通过反复试验直到达到接*现实的结果)下飞行飞机直到耗尽燃料来测量。
我使用的策略如下:
直到 Vr 使用全推力在 0°俯仰角,襟翼放出。
在 Vr 旋转到 10。
在 400 英尺(122 米)的高度放下襟翼。
在 3 千米的高度,推力 65%,俯仰 2.5。
继续下去,直到燃料耗尽

全飞行剩余燃油和位置与时间的关系
我们观察到航程为 4580 公里(经过 5 小时 30 分的飞行),这比预期的要小一点(大约 6000 公里)。然而,这主要是由于我们的模型不准确,以及(缺席的)飞行员缺乏飞行优化。我们将接受这个值(我们将在下一部分中尝试改进它)。
结论
我们现在已经验证了我们的飞机模拟是功能性的并且有点真实。它允许我们根据当前状态(当前飞机位置、速度和加速度)计算代理(飞行员)动作对我们环境(飞机)的影响,并返回一个新状态(飞机的新位置、速度和加速度)。我们现在可以使用这个模型作为我们的强化学习环境的转换函数。****

在下一篇文章中,我们将定义和编码强化学习的其余部分:动作、状态和奖励、,当然还有代理本身。有了完整的框架,我们将训练代理人飞行!****
希望教会一个人工智能飞行将允许我们优化飞行策略(到目前为止我们已经非常基本地*似了)并提高燃料消耗和航程(或者至少我们会很高兴看到一个人工智能努力学习如何飞行)。
敬请期待下一部分机长(我们的强化学习 特工)将指挥我们的飞机!
扬恩·贝特洛
这里是这个模型的代码(转换函数和图形工具)。
我在这个项目中使用的完整代码(Python)可以在我的 Github 上找到:
**** [## YannBerthelot/飞机模型
RL 的 PlaneModel 环境。在 GitHub 上创建一个帐户,为 YannBerthelot/PlaneModel 开发做贡献。
github.com](https://github.com/YannBerthelot/PlaneModel)****
参考文献
[1]“空中客车公司的虚拟技术”【在线】。可用:http://passion-aviation.html.pagesperso-orange.fr/Fiches技术空客. htm # A320–200。[访问日期:2020 年 4 月 11 日]。
[2]“标准大气计算器中气压、密度和温度与海拔的关系热力学-热量在线单位转换器。”【在线】。可用:https://www . translators cafe . com/unit-converter/en-US/calculator/altitude/。【访问时间:2020 年 4 月 12 日】。
[3]“我爱上了一个陌生人。”【在线】。可用:https://www . lavionnaire . fr/aerodynfluxtra . PHP # profilesupercrit。【访问时间:2020 年 4 月 12 日】。
我是如何自学链表的
原文:https://towardsdatascience.com/how-i-taught-myself-linked-lists-72c4837ea721?source=collection_archive---------12-----------------------
数据结构和算法,但更简单
一部分一部分地分解链表的定义。
什么是链表?
链表是最简单和最常见的数据结构之一。如果您曾经试图学习更多关于基本数据结构的知识,很可能您已经遇到过链表,并且读过类似下面的定义:
链表是一种数据结构,其中对象以线性顺序排列。然而,与数组不同,在数组中,线性顺序由数组索引决定,而链表中的顺序由每个对象中的指针决定。
根据学习数据结构时的个人经验,以上内容对于初学者来说可能毫无意义。因此,这篇文章旨在向你展示链表在概念上是简单的,以一种直观和外行的方式分解它的定义,就像你是一个完全的初学者一样。
我们将离开“那又怎样?”我相信,当我们对链表有了更好的理解后,我们将能够问更有意义的“那又怎样”。请注意,我们将在整篇文章中引用上述定义。
所以让我们开始吧。
什么是数据结构?
链表是一种数据结构…
因为链表是一种数据结构,所以简单地理解什么是数据结构是有好处的。
简单地说,数据结构就是数据存储和组织的方式。
然后,根据数据的存储和组织方式,可以对数据应用不同的操作。
数据结构之间的区别可能在于数据是如何存储和组织的,可以对数据做什么,或者两者都有。计算机科学中的大量问题都需要某种数据,我们需要根据问题类型从数据中有效地检索信息,这是我们今天创建不同数据结构的动机。
例如,一个链表在指针的帮助下以线性顺序存储和组织数据(这就是“数据的组织方式”),这些指针允许我们轻松地插入和删除元素,而无需重新组织整个数据结构(这就是“能做的”)。这使得一个链表成为一个线性数据结构(与非线性相对)。
什么是线性顺序?
…其中对象以线性顺序排列。
以线性顺序存储元素意味着以连续的顺序组织它们,使得:
- 只有一个第一个元素,并且只有一个下一个元素
- 只有最后一个元素,并且只有前一个元素
- 所有其他元素都有上一个和下一个元素
例如,除了链表,数组也是线性数据结构,以线性顺序存储数据。

作者绘制的图像。
同样,线性还是非线性数据结构更好取决于您的用例。像往常一样,这两种类型各有利弊。
好吧,但是数组有什么问题?
…但是,与数组不同的是…
到目前为止,你应该已经注意到链表最常被比作数组。数组的错误(或正确)取决于您的用例。和其他数据结构一样,数组也有自己的优点和缺点。
虽然数组提供非常快速的索引访问和元素赋值,但是它们有固定的、不可变的长度。这意味着它们不能增长或收缩,也不可能追加或插入项目。因此,在创建数组时,我们必须知道我们想要存储多少元素,这可能会导致某些问题,具体取决于手头的问题。
动态数组(例如 Python 的列表)具有可变长度,这是通过保留额外的内存空间来实现的。然而,在动态数组的开头插入一个元素比在末尾插入要昂贵得多。这可能会成为一个巨大的障碍,这也取决于你试图解决的问题。
使用 Python 的 list 对象,我们可以运行以下代码来说明这一点:
n = 500000
example_list1 = []
example_list2 = []# Slow insertion of at the front of Python lists
for i in range(0, n):
example_list1.insert(0, i)# Fast insertion of at the end of Python lists
for i in range(0, n):
example_list2.insert(i, i)
记录并打印完全插入 500,000 个元素所需的时间,我们得到:
Insertion at start took: 110.1042 seconds
Insertion at end took: 0.1853 seconds
对于动态数组,为了在第一个位置(或第一个索引)插入一个元素,您需要将所有其他元素“向右”移动,以便为这个新元素腾出空间。很自然,你可以想象如果你有一个包含大量元素的数组,这将是非常低效的。此外,在移动元素之前,您可能需要为数组分配更多的内存空间。

作者绘制的图像。
这就是链表可以做得更好的地方。
好的,那么链表和数组有什么不同呢?
…链表中的顺序由每个对象中的指针决定。
指针指针指针。
尽管链表和数组都是线性数据结构,但链表使用指针保持其元素的线性顺序(与数组中的索引相比)。与使用数组相比,使用指针可以更有效地在任意位置插入或删除节点。
在其最基本的形式中(即只包含必需的属性),链表由以下部分组成:
- 被称为节点的对象,其属性为:(a) 项,它被分配了它存储的数据(必需),(b) 下一个指针,它指向线性顺序中的下一个节点(必需)和(c) 上一个指针,它指向线性顺序中的上一个节点(非必需)。
- 指向列表头部的指针(必需)
- 指向列表尾部的指针(不是必需的)
为了了解链表如何允许我们有效地在头部和尾部插入对象,我们将实现一个有 3 个节点的链表,以线性顺序保存整数 14、5 和 22 作为数据。每个节点都有一个指向下一个节点的指针,而链表既有一个指向列表头部的指针,又有一个指向列表尾部的指针。

作者绘制的图像。
由于链表中节点的位置存储在前一个节点的指针中,所以链表中的节点不必在内存中连续组织。事实上,它可以存储在内存中的任何地方。因此,它看起来更像这样:

作者绘制的图像。
在尾部插入
为了在链表的尾部插入一个整数为 50 的节点,我们执行以下操作:
- 创建一个新节点,其项 = 50
- 让它的下一个指针指向无
- 让当前尾节点指向这个新节点,而不是 None
- 重置链表的尾指针指向这个新创建的节点

作者绘制的图像。
在头部插入
类似地,为了在链表的头部添加一个条目,我们执行以下操作:
- 创建新节点
- 让它的下一个指针指向链表的当前头
- 重置链表的头指针指向这个新创建的节点
这本质上是一个最简单形式的链表。
那又怎样?
答应了,那又怎样?
我们可以看到,与(动态)数组相比,链表的主要优点是它允许快速插入(和移除)条目。与数组不同,不需要重新构建整个数据结构,也不需要为重新构建而重新分配内存。这源于使用指针来保持数据的线性顺序,这消除了数据项以连续方式存储在存储器中的需要。换句话说,链表允许使用固定数量的操作(如上面步骤中所列)来插入和移除项目,而不管列表的长度。
使用节点的这些基本概念,它如何存储数据并指向它的邻居,我们可以根据我们的需要建立其他(更复杂)类型的链表,例如双向链表和循环链表。
更令人兴奋的是,理解链表及其节点可以引导我们探索和理解其他数据结构甚至算法。链表是实现其他抽象数据类型的多种方式之一,例如栈、队列、散列表和图形,我们将在以后的某一天再深入讨论。
这是上面的单链表在传统教科书中的样子,当然没有颜色:

作者绘制的图像。
我如何教 R
原文:https://towardsdatascience.com/how-i-teach-r-360e19502a0b?source=collection_archive---------38-----------------------
因此学生可以面对现实世界的数据问题

迈克尔·克里斯滕森在 Unsplash 上的照片
去年,我开始在一所大学教授为期六周的 R 编程课程,我在 Udemy 上还有另外一个在线课程,名为 ,所以你需要学习 R 。关于如何教 r,我想了很久,以下是我的想法。
初学者
我想要一门初学者也能上的课程。大多数通过课程学习 R 的人不是计算机科学家或经验丰富的黑客,而是科学领域的博士生、目前在工作中使用 Excel 的分析师或刚刚开始从事数据科学职业的人。他们可能有基本的编码经验,但可能基础不牢。
(我也希望一个有经验的 Python 程序员能够参与进来,专注于 R 语法以及它的不同之处。)
编程与实用性
我知道我需要涵盖基本的编程概念,如循环、数据结构和函数。但是人们学习 R 是为了用数据做实际工作,而不是为了一般地学习计算机科学。因此,我真的没有提到任何理论,或谈论算法设计,或任何类似的东西。我们所有的例子和问题都是关于数据的(而不是如何编写一个排序函数,例如,就像你在 C 或 Java 类中所做的那样)。
不过,我也决心融入实际的编程,而不仅仅是写脚本。这种区别主要在于让学生自己编写函数。这教会了他们如何抽象问题和思考极限情况,重用代码和构建自己的工具,以及调试。
我不想让任何学生在结束我的课程时,不能写一个简单的函数并将其应用于他们的数据。我这么说是因为我遇到过很多人,他们认为自己学了 R 但是不会写函数,不会索引数组,不会使用循环。这些对我来说是最基本的:如果你不能完成这些任务,为什么还要用编程语言呢?所以我的课程侧重于编程技巧,而不仅仅是脚本编写。
做困难的事情——一次
如果学生从高级工具开始,他们永远也不会理解底层发生了什么;他们也永远无法为更棘手的问题(高级工具无法处理的问题)编写定制的解决方案。所以我从基础开始,积累他们的知识。我们从向量开始,在向量上花了很多时间。在我们对数据框进行聚合之前,我们手动拆分一个列表(数据框实际上就是这个列表),计算统计数据,然后重新组合它。这不是你每天都想做的手术;但是做过一次还是有用的。
保持简单
由于对基本技能的关注,我决定尽量少用软件包。
我们使用 reshape2 进行一些数据转换。这有“融化”和“铸造”工作流程(分别用于长转换和宽转换),这在概念上非常简单,并且与更高级的数据共享。
我尽可能使用基本图形,并为更复杂的情节引入 ggformula 。这是一个 ggplot2 的包装器,但是使用了公式符号,学生们已经在聚合中看到了,并将在模型规范中看到。我确实提到了其他的绘图方法,比如决策树。
不太整洁
特别是,我不教任何来自 tidyverse 的东西。我不是一般的粉丝。但更糟糕的是,tidyverse 与我的大部分目标背道而驰。它引入了无数要学习的函数,试图省略 r 中更基本的操作。它积极地不鼓励使用下标和公式——相反鼓励管道和不寻常的 ggplot2 语法。
学习 tidy 的学生似乎擅长快速编写高级脚本来处理某些常见的数据任务。但他们的核心编程能力往往显得非常薄弱。我班上的许多学生已经尝试过用 tidyverse 学习 R,但是不能做像索引一个向量这样的事情!这不仅仅是他们技能上的一个漏洞:当他们试图解决问题时,这是他们心理过程中的一个漏洞。
为什么采用这种方法?
我们学习编程不只是为了告诉计算机做什么:我们学习编程是为了以不同的方式理解和处理问题;成为更好的思考者。如果我们不专注于编程的真正任务,从最基本的开始,然后在此基础上进行构建,我们就无法学习这种方法。
当然,这是有限制的:R 用户不应该像在 c 语言中那样担心内存地址,但是他们应该担心计算机在执行 apply 时如何遍历数据帧的行。对于大多数问题来说,这似乎不是必要的:但是当一个更难的问题出现时,你需要更多的基本理解,这样你就可以制定你自己的、定制的解决方案。
我还发现,在入门课程中,你想要达到的程度是有限度的。我教的第一个学期,我以一个单元结束数据表。真是个错误!交替的语法和使用它的小技巧太聪明了——学生们只是被弄糊涂了。相反,他们需要巩固更多的基础。
最后,我教 R 是因为我记得我在研究生院的同事们学习它是多么大的挑战。他们不是程序员。他们不是电脑迷。所以即使他们(非常)聪明,这也是一场斗争,因为编程是一种新的思维方式。我很幸运,因为我爱好编程已经有一段时间了,学习 R 相对容易。但对于其他人来说,很少有好的资源,是为需要学习 R 的人(早期职业科学家、研究人员和分析师)准备的。
我想我可以用我的课程来填补这个空白。不是因为我是世界上最好的 R 程序员,也不是因为我对 R 的内部工作有最先进的理解。而是因为我像很多人一样自学了 R,并且已经用它解决了十多年的实际问题。即使经历了这一切,我还是喜欢 R!这是一种奇怪的混合语言,学习起来并不容易——但我们可以让它变得更容易。
Jasper McChesney 是一名高级数据分析师,拥有自然科学和数据可视化方面的背景。他曾在非营利组织、人力资源和高等教育部门工作过。目前在麻省大学教授 R 课程,Udemy 上 。
我如何过渡到数据科学
原文:https://towardsdatascience.com/how-i-transitioned-into-data-science-e6854534e306?source=collection_archive---------27-----------------------
我如何从 CFD 工程师转变为数据科学家的旅程,旅程的不同阶段,挑战和提示。

伊恩·施耐德在 Unsplash 上拍摄的照片
介绍
我获得了航空航天工程硕士学位,开始了我的职业生涯,成为一名空气动力学/ CFD(计算流体动力学)工程师。在工程领域工作了 4 年后,我现在已经永久性地过渡到了数据科学领域。上个月,我开始担任 Kainos 的数据科学家。我花了两年的时间明确而专注地完成了这个转变。通过这篇文章,我想分享我的故事,以激励和引导其他人走上类似的道路。
为什么我选择转向数据科学
我决定转向数据科学主要有两个原因。
促使我进行这一转变的主要原因是,我希望能够使用数据科学来解决世界上许多更广泛的挑战,并能够使用我的技能来造福社会。
向数据科学转型的第二个动机是每个行业都有广泛的就业机会。
数据科学与我已经在做的事情没有太大区别:数学、编程、数据分析和可视化,以及解决问题。所以,没有什么能阻止我转变。
向数据科学过渡:我的旅程
阶段 1——获取知识
大约两年前,我开始了我的数据科学之旅,当时我在一家工程咨询公司担任 CFD 工程师。那时,我已经完成了 Python 的基础速成课程,知道了 pandas 和 matplotlib 的最基本知识。但我决心使用 Python(数据科学堆栈)对我在工作中遇到的任何项目和任何数据进行自动化、分析、可视化或处理。很快我就开始擅长这个了。在接下来的一年里,我通过各种来源的各种数据科学和机器学习课程继续学习。我不是一个非常守纪律的学生,但我知道我永远不会放弃。就这样缓慢而稳定地,我在业余时间、工作中、上下班途中和周末继续学习。经过一年的学习,我已经能够自如地使用 pandas 处理数据,使用 matplotlib 创建整洁的图,并使用 sklearn 训练和评估最基本的 ML 模型,包括回归和分类。
提示 1:度过学习阶段的唯一方法,就是要有耐心,并假设没有回头路。
第二阶段——付诸实践:黑客马拉松、竞赛和社区项目
在学习数据科学的第一年,我一直在使用 Python 为我的团队开发工具,以处理和可视化数据。我养成的关键习惯是尽可能多地将我学到的东西运用到工作中。同时,我也开始参加大量关于数据科学的研讨会(现在都是虚拟的)和黑客马拉松。参加黑客马拉松让我有机会解决各种数据科学问题,获得实际操作的真实数据集,以及使用机器学习解决各种行业中的实际挑战。最棒的是,在 2-3 天的黑客马拉松中,我学到的东西比我几个月学到的还要多。除了黑客马拉松,我还作为志愿者参加了 kaggle 比赛和社区项目。这些努力结合在一起导致了我转变旅程的第三阶段;发现机会和网络。
提示 2:仅仅有课程是不够的,你需要在真实世界的数据集和实际的问题上工作。
第 3 阶段——发现机会和建立关系网
黑客马拉松和社区项目将我与许多其他志同道合、充满热情的数据科学家、企业家、行业领袖或与我有类似经历的人联系在一起。这些都是无价的联系,这反过来会导致伟大的友谊,学习伙伴,或者获得经验的机会,甚至是从事有偿项目。在我真正成为数据科学家之前,这是我进入这个领域并开始从数据科学家的角度了解数据科学行业的地方。从这里开始,我开始抓住每一个参与的机会,从事真正的数据科学项目,并与其他数据科学家建立联系。事实上,我参与的第一个商业项目是从赢得黑客马拉松挑战开始的,这导致了一个成熟的、有资金支持的项目。在我找到一份数据科学家的工作之前,这个项目给了我最多的数据科学经验。此外,我为新冠肺炎承担的一个解决食品安全问题的特定社区项目是我在进入我的第一个永久性数据科学职位之前收集的另一个主要数据科学经验。更不用说,有几个人工智能和技术博览会,我参加的会议(免费)专门给网络。在我的旅程中,阶段 2 和阶段 3 是不可分割的。与此同时,
我也继续学习,参加 udemy 课程和阅读书籍。这包括丰富我在 sklearn 堆栈之外的更复杂算法、深度学习、超参数调整方面的知识,以及了解如何解决数据科学中的典型挑战,如数据质量问题、正则化、不*衡数据集等。
提示 3:抓住每一个机会,加入数据科学社区,拓展你的人脉
第 4 阶段——验证你的知识并感到自信
在我的投资组合中有两个主要的数据科学项目的一年半的旅程中,我觉得我几乎为一份工作做好了准备,直到我开始在公司面试。我意识到,主要的缺失实际上不是数据科学知识,而是端到端的体验,包括数据工程、部署模型和数据科学的云架构(MLOps)。为了验证这一点,我准备并通过了 AWS 认证的机器学习专业,并在获得 offer 后,还获得了 Azure 数据科学家助理。如果你感兴趣的话,还有一个 GCP 版本。这些认证验证了四件事:我对数据科学原理的更广泛理解,我对 MLOps、云特定服务(AWS 或 Azure)的理解,以及我学习新技能的热情。在大约 4 个月的时间里,我获得了 4 个云认证来验证这些,可以在这里找到。我特别推荐 AWS 认证机器学习专业,因为在我看来它是所有专业中最全面的。在此了解如何准备和通过该认证。
提示 4:获得云 ML/DS 认证,以验证您的端到端知识
第 5 阶段—工作、面试和技术测试
在准备和通过这些认证的同时,是我申请的工作的实际面试和技术测试,主要是作为数据科学家或机器学习工程师。我面试的几乎所有职位都包括 3-4 个阶段:电话面试、技术测试、视频面试(技术)和最终面试(文化契合度)。对于我的投资组合中的项目,在云认证之前的初始面试中,我能够通过技术测试并参加技术视频面试,但是缺乏生产/云经验。有了证书,我的信心有了巨大的提升,我终于能够做到这一点。在我的旅程中,第 4 和第 5 阶段也是不可分割的。根据我的经验,除了文化和性格的契合,成功的数据科学面试的关键要素总结如下:
- 展示持续学习和发展的态度
- 展示对数据科学原理的深刻和广泛理解,以及端到端意识,尤其是在部署/生产模型方面
- 展示对领域的理解,特别是对角色和公司的理解
- 对你胜任这个角色的信心
提示 5:每一次面试都是向面试官学习、完善自我和在需要的地方成长的机会。
找工作
在所有的努力工作、经历和认证之后,我最终得到了多份有吸引力的工作机会,比我想象的要多得多。选择一个比做技术测试和面试更难。看到艰苦的工作终于有了成果,那也是在疫情的中期,这是压倒性的。
最后一点:这需要时间、努力、自律和坚持。如果你播下了种子,你就会收获回报,不会早于或晚于你应得的。
挑战
在闯入人工智能的过程中有几个未知的挑战,我将试图从我的角度提炼和简化这些挑战。
第一个也是最大的挑战是选择合适的学习资源。有数百门课程可供选择,包括 udemy、coursera、edx、datacamp、dataquest 等*台。从什么开始,接着做什么?没有设计好的途径来学习和获得必要的技能和知识,以保证职业生涯过渡到数据科学。更麻烦的是,在开始和完成课程后,可能仍然会有一种感觉,“也许我应该选择另一门课程,以不同的方式开始”。没有对错,也没有完美的路径。我的看法是:设计你自己的数据科学学位,当你觉得你已经成功时,给你自己颁发学士学位。
第二个挑战是,我如何知道我已经掌握了足够的技能?我如何知道我已经掌握了数据科学技能谱中的所有必要技能,从而获得一份工作?事实是,我永远不会学到足够多的技能。我的方法是为了解决项目中的问题而发展技能,而不是为了找到一份工作。
第三个最艰巨的挑战是要有信念和毅力坚持下去,直到我能做到。最大的问题是:我做得对吗?我会到那里吗?我做得够吗?关闭后门是我解决这些问题的方法。我只是决心要转型。
结论
在所有这些工作和闯入 AI 领域的成就之后,我觉得真正的旅程才刚刚开始。真正的努力从现在开始,因为总是有更多的东西要学;就像有人说的,“让你到这里的东西,不会让你到那里”。我希望这能激励那些踏上类似数据科学之旅的人。
我是如何试图建立一个名为 Thulani 的聊天机器人来管理我的投资组合的
原文:https://towardsdatascience.com/how-i-tried-to-build-a-chatbot-named-thulani-to-manage-my-investment-portfolio-359f46b439d4?source=collection_archive---------51-----------------------
Thulani 项目:ChatOps 会见 LazyOps。
这是 Thulani 的故事,我设计这个聊天机器人是为了让我的生活变得更简单,也让我更了解聊天机器人。我希望能有更多的东西,我真的希望,但这篇文章是一个指南,介绍了我用来更好地理解聊天操作的工具和资源,以及如何使用聊天机器人解决(希望更好)问题。
什么是聊天操作?
ChatOps 是使用聊天客户端、聊天机器人和实时通讯工具,方便软件开发和运营任务如何沟通和执行。
我为什么需要聊天机器人?
我最*开始使用由自由贸易团队开发的自由贸易*台。我不是一个认真的投资者,最初是出于兴趣,想拥有一些我喜欢的公司的股票,但随着时间的推移,随着越来越多的朋友注册,我们开始讨论和研究股票。但在这次研究中,我发现很难跟上每只股票,尤其是那些我只想密切关注的股票。这意味着有时我可能会错过买入或潜在的退出机会。所以我坐下来思考,我该如何为自己做些什么来确保这种事情不会发生?
免责声明:其他应用程序具有可以消除这个问题的功能,但这并没有教会我关于聊天机器人的知识,不是吗🙃
Thulani 计划诞生了!
第一步是命名我的聊天机器人,并正式开始这个项目。我选择的名字是祖鲁族血统的 Thulani。它的意思是“安静/得到安慰。”我喜欢这个名字,觉得它会让我的聊天机器人更有个性,我们多久会看到有祖鲁语名字的机器人?
确定了我的问题和建议的解决方案后,现在是时候想象成功会是什么样子了:

这是我希望我的机器人看起来的样机。这就是成功的样子。使用僵尸网络设计
A user finds a share → User informs Thulani → Thulani checks API with stock information → User confirms → End.
这是我试图构建的用户故事草案,每次我决定监控一家公司的股票,Thulani 都会记住 时间和日期 ,因为这将是我想要监控的价格点,然后我可以设置 Thulani 在价格低于或高于 X 时向我发送消息。由于我实际上并不想为这个功能创建一个完整的应用程序,聊天机器人是最好的解决方案。
Thulani 遇到了 Watson!
沃森助手是 IBM 的人工智能产品,可以让你在任何应用程序、设备或渠道中构建、训练和部署对话交互。我选择探索 Watson 作为 Thulani 对话技巧的后端,因为与大多数聊天机器人不同,Watson Assistant 并不试图模仿人类互动。它实际上会要求清晰,知道何时从知识数据库(我们将查询的 API)中搜索,并且可以部署在 Slack 上。

我有没有提到它是免费的?—由 IBM 提供
我能够部署一个 Watson Assistance 的实例,我实际上可以预加载一些客户服务对话技巧,但没有任何东西真正涵盖我正在寻找的问题,所以我必须从头开始教 Thulani 如何响应。

不同的反应,因为你知道,Thulani 有范围 IBM 沃森助手
“你好”节点是我最初的对话开始。当用户打开聊天机器人时,Thulani 会如何问候他们?当然,他可以和他们打招呼,挥挥手👋🏾同时等待输入,但更有意义的是充分利用交互(因为这意味着你编写更少的对话节点)。所以 Thulani 会问候用户,并立即询问他们想要什么股票。但这不是写对话的好方法。因为它限制了我的聊天机器人的功能。如果有增长的空间,我希望第一次交互实际上像一个菜单,所以 Thulani 会让用户直接,“嘿,这是你的选择!”
然后头痛来了🤯

使用 IBM Watson Assistant 绘制逻辑图。
写完逻辑之后,我意识到现在需要为股票信息集成一个 API。但是一个月只有10000 个 API 调用,我内心的基础设施工程师就踢了进来。我如何优雅地保留 API 调用?Thulani 应该能够在没有我的干预下检查特斯拉的股价,然后向我反馈埃隆是否已经崩溃了市场。但是在周末或者股市关闭的时候会发生什么呢?这意味着我必须想办法为 Thulani 增加逻辑和运营时间。
- 仅在工作日上午 8 点到晚上 9 点期间运行。(这是英国和美国股票市场开放的时间)
- 不要在周末进行 API 调用——除非用户要求。
但是即使有这些问题要回答,我从哪里得到数据呢?
- 数据需要是 live ish 。
- 如果不是 live ish ,Thulani 需要让我知道上次检查的时间。
- Thulani 需要保存我上次询问的日志,并更新我自那时以来股票是涨还是跌。
API 🕸
感谢黄慎发布了2020 年 5 个最好的免费股票市场 API我能够找到一个满足我需要的 API。我选择使用 yfinance ,因为它保存的历史数据实际上在未来可能有用,问问 Thulani 石油在 2008 年衰退期间的表现不是很好吗?
但它与 Watson 不兼容,因为目前没有可用的 webhook。当我试图让它成为一个免费资源时,投资运行一个可以与沃森通信的虚拟机是不可行的。我确实在寻找 webhook 版本来获取这些信息,但是它们都是有成本的。
Thulani 的末日到了吗?🥺
我经常宣扬的一件事是熟能生巧,尝试新事物是跟上计算机科学技术的最好部分。我绝不是软件工程师,甚至不是与聊天机器人打交道的人,但这个周末我能够尝试科技的一个新方面,使用低代码解决方案来尝试和构建一个聊天机器人。我的朋友斯蒂芬·万(Stephen Wond)是一名专注于人工智能的软件工程师,他也接受了这个挑战,并采取了一种完全不同的方法,走微软的路线,使用微软的路易斯(LUIS)。对我们俩来说,这是一个重新思考我们领域中可以用聊天机器人解决的问题的机会。关于网络安全和数据科学,实际上有很多不同的用例,我现在可以期待用聊天机器人来尝试。例如,我目前运行多个蜜罐,如果能建立一个电报机器人就太好了,用户可以在那里询问一个 IP 是否出现在我的蜜罐数据中,或者关于攻击情况的每日统计和数字。沃森可能不是我项目的最佳选择,但这并不意味着这是 Thulani 的终结,因为斯蒂芬·万和路易斯取得了更大的成功,我将期待重温我的 Azure 技能(,并希望获得一些 Azure 学分🤣,嗨 微软英国开发者 )。这是一种有趣的边做边学的方式,但是尽管这一次,我没有完成我想要的原型,我期待着重新学习和重建 Thulani 2.0🤖

为此,我使用了 Canva 团队。
资源
- Pluralsight — 如何使用 IBM Watson 构建聊天机器人
- YouTube — 什么是聊天机器人,它是如何工作的?
- 聊天机器人杂志上有数量惊人的聊天机器人指南。
- 聊天机器人的设计框架——杰西·马丁
- 我们需要谈谈聊天机器人的可访问性——卡伊奥·卡拉多
- 如何创建一个 Slack bot
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
作者:斯蒂芬·查彭达玛
我是如何用 eGPU 将我的旧笔记本电脑变成机器学习超级明星的
原文:https://towardsdatascience.com/how-i-turned-my-older-laptop-into-a-machine-learning-superstar-with-an-egpu-66679aa27a7c?source=collection_archive---------6-----------------------
以新电脑的零头成本改造超极本的惊人简单之旅
几年前的 2016 年初,在佐治亚理工学院(Georgia Institute of Technology)读本科的过程中,我试图用一台使用了 5 年的笔记本电脑获得计算机科学学位,这台电脑的硬盘出现了故障。我需要升级。新的英特尔 Skylake 处理器和 Dell XPS 15 9550 让我惊叹于超极本的外形和功能,所有这一切,加上专用的 NVIDIA 移动 GPU,我想我会准备好多年。
我准备好了。事实上,我正在同一台笔记本电脑上写这个故事,从我拿到它的那天起,它就没有慢过一点。直到年,我开始攻读人工智能和机器学习的硕士课程。我被分配了一个经典的深度学习任务,这个任务现在已经解决了,但在计算机视觉方面证明是一个很好的学习机会,训练一个 CNN 解决 CIFAR-10。 CIFAR-10 是由 10 类低分辨率(32×32)图像组成的数据集,任务是训练一个模型,将新图像正确分类到这 10 类中的一类。它被广泛用作教材,因为低分辨率允许快速训练。至少我是这么认为的。一个多层的 CNN 开始需要几个小时甚至一个晚上来训练,而这本来应该是一个简单的任务。突然,可靠的 Skylake I7(现在已经有 3 代以上的历史了)和 2gb 的专用 GPU RAM 开始显示出磨损的迹象。
我知道我需要一个解决方案,所以我头脑风暴从头开始构建一个桌面 PC。要获得一台中高档的当前一代机器学习台式机,至少需要花费 1100 美元(配备 i5 6 内核 CPU 和 RTX 3070),此外,作为一名喜欢在校园工作的研究生,1100 美元的 PC 将我限制在一个单独的位置,或者需要许多同步措施才能在两个位置工作。我可以买一台当前一代的超极本,它配备的 GPU 有时和 3050-Ti 一样好,但这些型号很容易就超过 2000 美元,并且不具备台式机用于培训的能力。
这促使我对像我这样的人的最佳解决方案进行了大量的研究。我有一台可靠但较旧的计算机,忙碌的生活让我忙个不停,需要更多的处理能力,并且希望在不倾家荡产的情况下将所有这些都放在一个地方。我知道,我的要求很多,但我确实找到了一个解决方案 eGPU。
外部 GPU 是一种允许您使用 thunderbolt 3 端口将显卡连接到现有电脑的设备。如果你有一台超极本 PC 2017 或更高版本(像我一样),或者 MacBook Pro 2016 或更高版本,你可能已经有了,因此可以使用 eGPU 来彻底改造你的笔记本电脑。一个 eGPU 在设计上也相对简单,在其核心,它所包含的只是一个连接 GPU 的 PCIe 端口,一个连接计算机的 thunderbolt 3 端口,一个电源(GPU 需要的功率远远超过你的计算机所能提供的),以及为你的 GPU 散热。你可以一起 DIY 所有这些组件,或者你可以像我一样采取更简单的方法,找到一个包含端口和电源的 GPU 外壳,将搜索减少到 2 个部分,一个 GPU 和一个外壳。
一旦我决定了我的行动路线,尝试 eGPU,是时候我去网上搜索,尝试找到最好的交易了。巧合的是,我的两笔交易都来自一个叫做 Letgo 的买家卖家应用。我以 260 美元的价格买到了一台英伟达 GTX 1080 8GB(我能在网上找到的最便宜的价格是 375 美元),作为一个附件,我能找到有人以 280 美元的价格出售 Razer Core v2(在易贝的售价约为 400 美元),这使我的总构建成本为 540 美元,从而获得了完全增强的笔记本电脑体验。
不是每个人都像我一样想要交易 hunt,所以我也评估了创建一个 ML eGPU 的最佳选项,价格约为 500 美元,完全在线,订购所有零件不超过 10 分钟。我会推荐一个 NVIDIA 1660-Ti 6GB,给出类似的 GPU 能力(稍微降级),280 美元,还有一个翻新的 Razer Core X,270 美元就可以从 Razer 那里买到。如果你愿意多花一点钱买一个更好、更新的 GPU,RTX 3060 8GB 会更经得起未来考验,但价格也要 400 美元。如果您正在考虑改造 Macbook,可能值得考虑 AMD 处理器,因为它们在苹果生态系统中的支持水*有所提高。
一旦我造好了机器,我就开始量化我的经验。GTX 1080 比我以前的移动 GPU 有多大的改进?为了解决这个任务,我使用了 AI-benchmark ,这是一个 Python 库,它利用 Tensorflow 在 19 个不同的部分上运行 42 个测试,为 GPU 提供了一个很好的广义 AI 分数。我将 AI-Benchmark 与 Jupyter 笔记本、pandas 和一个名为 Seaborn 的可视化工具相结合,以量化我的结果。代码可以在 Github 这里找到。
第一个结果是关于单个测试及其运行时间(毫秒)。我只包括了 19 个测试中的第 1 到第 9 个,因为大量的结果会让人眼花缭乱。我的 GTX 960m GPU(XPS 自带的 GPU)也遇到了一个大问题。因为它只有 2GB 的显卡,它没有通过大量的测试,因为张量太大了,不适合 2GB 的卡。

测试 1 至 9
这个测试的结果非常清楚。集成显卡绝不适合机器学习,即使它比移动 GPU 更稳定。这些测试运行的时间都要长得多,甚至会导致简单的任务运行得非常慢。当谈到任务的速度时,GTX 960M 实际上保持了自己的。然而,它的不足之处在于可靠性。只有 2GB 的内存是一个巨大的障碍,将导致您不得不牺牲模型的大小,以便能够适应这样一个严重的限制。出于这个原因,GTX 960M 远不适合现代深度学习。然而,8GB 内存的 GTX 1080 完美地运行了所有任务,并在实际运行的任务中提供了比 GTX 960M 大约 3 倍的速度升级。

3 项测试的总结
AI-benchmark 还会在测试结束后创建一个综合分数(越高越好)。请注意,GTX 960 米基准是推断出来的。由于测试无法完成,因此无法获得总分。正因为如此,我从 AI-Benchmark 的结果测试的类似 GPU 中推断出分数。替代的 GPU 使用相同的架构,在成功运行的测试中,性能相差不到百分之几。显而易见,GTX 1080 击败了所有自动化测试,并在可靠性和速度方面取得了可观的进步。基于这一结果,很明显 eGPU 是其昂贵替代品的绝佳替代品,的确如此,但我对此有一个警告。
尽管与 XPS 本身相比,结果令人震惊,但与集成 GPU 相比,使用 eGPU 可能会带来速度损失。

带有基准的摘要
当将我得到的基准与 AI 基准达到的顶级基准进行比较时,它还有很多需要改进的地方。我预计雷电 3 端口的带宽会导致 10%到 15%的性能损失,但是这些测试显示分数明显下降了 30%,我有一个关于原因的假设。
XPS 15 9550 和 9650 型号虽然声称完全支持 thunderbolt 3,但硬件上限为 2 通道,而不是宣传的 4 通道(戴尔后来解决了这一问题)。我的假设是,这是在雷电港造成了瓶颈。在未来的版本中,我可能会用 MacBook(有 4 个通道可用)来运行这些测试,以证实我的怀疑。如果我是正确的,我应该在 MacBook 上看到 AI 得分超过 1400。这篇文章也印证了我的怀疑!
这让我想到了我的一般建议——这是一个可行且经济的选择吗?
我会说绝对的。即使分数没有达到基准,这台 540 美元的电脑升级到曾经 1500 美元的电脑已经延长了它的生存能力。仅仅是拥有 2GB GPU 和 8GB GPU 之间的差异就足以让这件事值得去做。如果你的笔记本电脑只有集成显卡,如果你想用它进行深度学习,我甚至会说这种升级是必须的。
我不建议这种升级的唯一方式是,如果你的笔记本电脑已经有 4GB 的 GPU RAM 和至少一个 GTX 1050-Ti GPU。如果是这样的话,您不太可能看到性能的巨大提高,并且只有当您发现自己需要更多的 RAM 来处理更重的任务时,eGPU 才真正值得您花钱。
结论和后续行动
如果你喜欢这篇文章,我写了另外一篇文章比较这个 eGPU 和 Google Colab!如果你喜欢这篇文章,它值得一读,在这篇文章的另一篇后续文章中,我测试了当连接速度提高到 40 Gbps 时会发生什么。如果你喜欢这个内容,请用我作为推荐人,这样我就可以继续发布我喜欢的内容。
我如何使用 AWS Lambda 让我的女朋友微笑
原文:https://towardsdatascience.com/how-i-used-aws-lambda-to-make-my-girlfriend-smile-61194596f2d?source=collection_archive---------10-----------------------
开始这个有趣的小项目来提升你周围人的精神

莱斯莉·华雷斯在 Unsplash 上的照片
我们目前正处于一些前所未有的时代。新冠肺炎已经接管了,我们唯一能做的就是把自己锁在里面。
除非你是一个人隔离,否则有可能你已经对周围的人失去了耐心(或者他们对你失去了耐心)。
也许是我们传播快乐的时候了。
有什么比让一个无生命的物体为你传播快乐更好的方式呢?
我们将编程一个 Alexa 技能,使我们的亚马逊设备说一些定制的有趣的事情。
内向的我喜欢这项运动。它不仅让我大量接触了一些尖端技术,还让我周围的人脸上露出了笑容。在这艰难的时刻,我想我们都需要微笑。

我们在这里使用一种叫做“震惊幽默”的喜剧风格。当一个人在最意想不到的时候听到一个无生命的物体称赞自己的名字时,肯定会让他们在接下来的几分钟里笑得流泪。
本教程不要求你具备编程能力(尽管它确实有所帮助)。你真正需要的只是跟随指示的能力。
让你的女朋友,男朋友,儿子,女儿,丈夫,妻子,姐妹,兄弟,阿姨,叔叔,狗今天笑!
目标
创造一个 Alexa 技能来传播积极。

照片由拉胡尔·查克拉博蒂在 Unsplash 拍摄
先决条件
开始学习本教程需要以下物品:
- 安装了 Alexa 的设备——亚马逊 Echo、Echo Dot、FireTV、Fire *板电脑等。
- AWS 自由层帐户
- 大约 20 分钟的时间
创建 Lambda 函数
我们开始吧!
登录您的 AWS 帐户并导航至 AWS Lambda,您可以在计算部分找到它:

然后,我们将单击 AWS Lambda 仪表板内的创建功能按钮:

对于这个 Lambda 函数,我们将使用由其他人创建的无服务器应用程序存储库。这些存储库是由 AWS、AWS 合作伙伴和其他开发者创建的,可供我们随时使用。
如果你没有看到任何 Alexa 技能相关的选项,请尝试将您的地区切换到美国东部 1。这就是我正在使用的。

接下来,点击上面的Alexa-skills-kit-nodejs-factskill卡片。
单击该链接后,将所有设置保留为默认值。但是,我将把应用程序的名称改为其他名称:

完成该功能的设置配置后,单击右下角的 deploy 按钮。
CloudFormation 会处理这个部署。
几分钟后,您将看到以下内容:

现在,当您到达 AWS Lambda 函数(在左侧的导航栏上)时,您将看到您新创建的函数。

单击您新创建的函数链接。
编辑你的 Lambda 函数
现在,这就是有趣的地方。
一旦你进入 Lambda 函数,你可以向下滚动到函数代码中的文本编辑器。
搜索这段代码。这是为说英语的人准备的版本。选择您使用的任何语言:
我们必须将GET_FACT_MESSAGE字段和FACTS数组编辑为绝对最小的值,以使其按照我们想要的方式工作。请随意编辑其他内容:
你会注意到我从FACTS数组中取出了所有东西。这是因为这个特定的 Alexa 技能被设计成从数组中随机选择一个元素来说。当数组中只有一个元素时,它只有一个选项可以说:)
把你想要的任何东西放进这些字段。尽情享受吧!
好了,这就是我们从λ方面需要做的。让我们制作它,这样我们就可以在家里使用 Alexa 设备了。
创造 Alexa 技能
导航到https://developer.amazon.com/alexa/console/ask;这是我们要为我们的 Alexa 创造实际技能的地方。我们将创建一个开发人员帐户。
如果您尚未注册,请使用您注册 Amazon Alexa 的同一帐户。这将使这个过程变得容易得多。
如果你没有把你的 Alexa 注册到你的亚马逊账户,很简单。只需在手机上下载 Alexa 应用程序,然后按照步骤操作。
一旦你在https://developer.amazon.com/alexa/console/ask,点击右手边的创造技能按钮:

然后给它起一个名字,选择 Custom 作为模型来添加我们的技能,提供您自己的作为托管我们的技能后端资源的方法:

然后,我们将改变我们的模板事实技能,因为这是我们如何生成我们的 Lambda 函数。

一旦你点击选择,我们的 Alexa 应用就创建好了!就这么简单。
现在,这一步至关重要。我们必须将端点更改为 AWS Lambda 函数的端点。否则,它怎么知道触发哪个 Lambda 函数呢?
回到 AWS 中的 Lambda 函数,在右上角寻找 ARN:

将其复制到剪贴板,并粘贴到端点选项卡的默认区域字段中:

单击顶部的保存端点按钮。
现在我们需要添加一个新的意图。这是你需要对你的 Alexa 说的话,让它触发你的 Lambda 功能。所以你会在下面看到我已经输入了,“我对塔拉的看法。”塔拉是我女朋友的名字;你可以把它做成任何东西。
这句话是你需要对你的 Alexa 设备说的话,它会用你在 AWS Lambda 函数代码中写的内容作出响应。

一旦你添加了所有你希望 Alexa 回应的话语,点击保存模型和建立模型。这应该只需要几秒钟或几分钟的时间来构建。
当构建成功时,您应该会在底部看到以下消息:

现在导航到顶部导航栏中的测试选项卡。
将技能测试启用下拉菜单更改为发展。
在左边输入你的话语,你的 Lambda 函数就会被触发,你的回答就会被输出。

现在,如果你的 Alexa 设备注册到你的帐户,你可以对着你的设备说出话语,同样的响应将会返回,但这次是来自 Alexa。
这就是所有的人。希望你用这个来逗别人笑。有这么多你可以做的这些 Alexa 技能;我们只是浏览了一下表面。
尽情享受吧!
我如何利用数据科学技能成为一名铁人三项运动员
原文:https://towardsdatascience.com/how-i-used-data-science-skills-to-become-a-triathlon-athlete-f1628e5cc522?source=collection_archive---------57-----------------------
360°分析,用捷径提高你的铁人三项成绩!
我知道这些词永远不会匹配:更少的努力和铁人三项。在这篇文章结束时,你会明白我的意思。

我的第一场比赛=)
我参加铁人三项的全部训练都集中在游泳上,原因有三:
- 我做了 11 年的冲浪者,这对于想完成铁人三项的人来说是个问题。我必须建立我的策略,在游泳中获得稳定的成绩,因为那些冲浪的人有爆发力和强有力的划水,这与你在铁人三项中需要做的相反。
- 第二个原因是我以前从未在海上游过 300 米以上。
- 第三个也是最后一个,小时候在海里游泳有过不好的经历。
由于这些原因,我在比赛前一个月集中精力,每周每天在游泳池里游泳(至少尝试过)40 分钟。我也专注于只用手臂划水。
越野和山地自行车比游泳更容易训练,因为我经常做这两项运动。由于我遵循了健康食品和天然营养,我觉得我已经为比赛做好了准备。
好吧,但是这些和数据科学有什么关系呢?
嗯,这是我的“基线模型”,我知道我不会登上领奖台。但这足以完成、分析和学习。这就是我的目标——观察内在(我的身体表现)和外在(竞争对手和赛道)的一切。
从我所有的超参数(我在这三项运动中的训练)中,我希望只调整一项,即游泳,我知道它会给我一个可接受的最终结果。
当我冲过终点线时,在我看来,我看到了许多细节,我必须为下一场比赛改进。此外,我以为会很难的事情,其实一点也不难。基准测试,以及对其他有经验的竞争对手的分析,最终变得非常重要。
作为一个善于分析的人,我意识到的和认为需要调整的一切都不够。我需要大量的东西来证明我的想法是正确的。
为此,我使用 Python 对我参加的铁人三项赛的数据进行了探索性数据分析(EDA)。
GitHub 上的全部代码。
基本上,我在铁人三项网站上搜集了所有业余运动员的最终成绩,做了一些图表和简单的推理分析。
第一步:我想了解一下所有参赛者在铁人三项赛中的表现。所以,正如你所看到的,游泳者(蓝色)在 20 分钟内完成了绝大多数。另一方面,骑自行车的人(橙色)分布广泛,我们可以看到两个集群。第一组自行车时间不到 70 分钟,另一组*均超过 70 分钟。最后一个,跑步者,有 30-40 分钟的微小间隙。

游泳、自行车和跑步直方图 python 代码
下一个直方图使用与上面相同的分析技术,但是现在是关于过渡时间。我们可以得出结论,在第一个跃迁(蓝色)中,可以保持一个比第二个跃迁(橙色)大的时间范围(0:00–1:30)。第二个,必须在一分钟内完成。

转换直方图 python 代码
完成对所有业余运动员的分析后,我拍了一张我的类别(M2529)表现的快照。主要目的是了解分布情况,以及是否有机会通过减少几分钟来提高最终排名。

时间 x 按男性类别排名 python 代码
在分类数据中,有两个位置的差距小于 5 分钟。
下一张图是按类别分类的直方图,我们可以很容易地确认,更多的参与者年龄在 30-44 岁之间。

按男性分类的参与者 python 代码
这三类运动员占所有业余运动员的 68%。

男子业余运动员分类饼图 python 代码
综上,我想知道哪项运动对最终结果的影响最大。为此,我选择了一个散点图来理解这种相关性。

所有变量的分布和相关性— python 代码
虽然散点图矩阵足以理解每项运动对最终结果的影响,但下面有两个相关矩阵来进一步探索变量之间的关系。
在这两种情况下,对于通过 M2529 类别过滤的所有运动员,骑自行车的时间对最终结果有很大影响,其次是跑步时间,然后是游泳时间。
真正有趣的是,过渡 1 对 M2529 类别的最终结果产生了强烈的影响。

所有业余运动员—相关矩阵

25-29 岁的男性业余运动员——相关矩阵
这些都是我在第一次参加铁人三项时收集和学到的见解。
我已经用我的基本数据科学技能为我的下一次活动做了更充分的准备,同样的方式,你也可以在你的爱好或日常工作中做同样的事情。只要搜索其中的数据,有用的见解就会出现。
我的 python 脚本很乱,没有评论,但是非常直观,所以我道歉!
数据科学几乎可以应用于所有情况,那么你还在等什么?!
感谢您的阅读。请在下面分享您的意见和反馈。
我如何利用数据科学购买二手车
原文:https://towardsdatascience.com/how-i-used-data-science-to-buy-a-new-car-a2d8bbd72c00?source=collection_archive---------8-----------------------

我的二手车价格预测器的真实世界测试,任何人都可以使用
大家好,好久不见!几个月前,你可能看过我的博客,在那里我讨论了使用线性回归建立一个模型来预测二手车的价格。如果你错过了,你可以在这里找到它。
为了让大家了解情况,我使用线性回归建立了一个模型,根据二手车的年份、里程、燃油效率以及它是否是豪华车来预测二手车的价格。这很酷,但由于之前没有购车或购车经验,我只能根据可用的网络清单测试我的模型,偶尔还会帮助我哥哥为他的 2015 款本田飞度定价(精确到 200 美元)。我对这个模型进行了一些简单的测试,以确定它的准确性,并且很高兴我为那些随意逛橱窗的人创造了一个有用的工具。
从那时起,数百人一直在使用它,并告诉我它的一些不足之处。比如 SUV 和皮卡就不那么配合车型。同样,保时捷和玛莎拉蒂这样的高端豪华车也不太好用,主要是因为样本量小,或者是因为玛莎拉蒂很烂,它们的转售价值在头 6 个月后就消失了(这有很多原因,不完全是汽车的错,主要是车主的错)。
不幸的是,在 7 月份,当我开着我哥哥的车从韩国炸鸡店回家时,我遭遇了一场事故。你可以在这里观看视频(故事的寓意,拿个仪表盘摄像头)。我就不跟你说长故事了,关于保险的很多前前后后,但损坏程度足以让 Geico 确定这辆车是全损。不是因为车不能开,而是因为修理损坏的费用会超过车价值的 75%。这是我的模型的第一次真实世界测试。Geico 对我哥哥的汽车估价为 11,352.00 美元,而我的模型预测价格为 11,878.00 美元!除了汽车的实际损失,我很高兴我的模型为我的家人提供了一些有用的东西!
购买另一辆汽车的理由
现在,作为一个纽约的长期居民,我很容易想象你们中的许多人在想什么。在纽约市,拥有汽车是最令人愉快的事情,同时也是纽约市最令人恼火的事情。是的,只要你愿意,你可以去真正的杂货店,去新泽西或汉普顿自驾游。另一方面,你不断躲避坑洞,不断躲避停车罚单,不断躲避疯狂的纽约司机。在城市里,你实际上什么也做不了,因为你永远找不到停车位,而且车库的费用又那么高。另外,我们有地铁!
所有这些都是吉文斯,但在我哥哥拥有那辆车的 5 年里,我真的开始喜欢拥有它了。在我看来,这种挫折是值得的,每年换一次轮胎,因为你不可能躲开每一个坑洞,当然你撞上的那个就是那个轮胎坏掉的那个。
自从我在 2014 年搬到长岛市以来,我大部分时间都在郊区度过,这使得公共交通不如城里方便。此外,我的姻亲住在法拉盛,所以有一辆车意味着可以更灵活地去看望他们,并帮助做一些随机的家务。在我哥哥买车之前,拜访他们意味着要坐 45 分钟的 7 路火车,然后再坐 35 分钟左右的公共汽车才能到达他们住的地方。开车,这是一个连续 20 分钟拍摄的谎言。没有车,拜访是精心安排的,而且只能是为了特殊的家庭活动。否则就不值得了。有了车,我们可以在任何时候停下来,取紫菜包饭,放下杂货,并帮助奶奶找到完美的纱线,为我们编织圣诞围巾。因此,当涉及到处理我哥哥汽车报废的问题时,我们自然而然地陷入了沉没成本谬误。我们打算再买一辆车。
经过反复讨论,我和我哥哥决定升级,而不是直接换下一款本田飞度。这有很多原因,但是安全是前十位的。我很好地度过了事故,但我们觉得本田很适合,虽然非常适合在纽约驾驶(这该死的东西可以停在任何地方,滑过双车位和三车位的汽车),与路上的一些 SUV 和大型卡车相比,我们不禁觉得我们的小车有点脆弱。过去,我们曾无数次差点冲出马路,因为大型汽车根本没有注意到我们。根据我们的需求、价格,再加上几次试驾,我们最终决定选择斯巴鲁 Outback 作为我们的下一辆车。
使用模型购物
一旦我们选择了我们想要的汽车,下一步对任何想要购买大件商品的人来说都是熟悉的:研究。
通过浏览网页,我们缩小了搜索范围。汽车必须有某种盲点检测系统,这需要获得一辆装有斯巴鲁视力套件的汽车。不会超过 40,000 英里,根据我们的预算,2017 年及以上可能是我们的目标年龄。这意味着我们要么必须找到一个视力升级的优质修剪内陆,或更昂贵的视力标准的有限修剪。
现在,关于我的模型有几件事你必须知道。这个模型是建立在大量二手车列表的基础上的,有些是由授权经销商托管的,有些是由普通二手车停车场托管的。我和我的合作伙伴注意到,在我们的模型运行中,当涉及到微调和特殊升级时,没有太多的相关性或重要系数。此外,修剪范围如此之广,以至于很难对我们的模型进行适当的分类。例如,一辆汽车可能具有加热座椅升级,但同一辆汽车的更豪华的装饰可能具有加热座椅作为标准。一些汽车品牌只是把加热座椅作为他们所有汽车的标准配置。因此,我们去除了 trims 这一变量,采用了“二手车批量”定价模型,在这种模型中,只有基本要素才是重要的。
这导致了一些困难,后来当我用这个模型给我们的内地定价时。看,与二手车不同,经销商知道他们的装饰和升级的确切价格点,并相应地将其纳入定价,即使是二手车。
例如,看看下面的清单。一个来自斯巴鲁授权经销商,在左边,另一个是二手汽车“商场”:

左:经销商,右:二手车经销商
这些不完全是苹果对苹果,因为经销商列出了升级的溢价,而二手车地段列出了有限的,这些升级是其基本包的一部分。不过,值得注意的是,斯巴鲁经销店实际上记录了升级的价格,他们将在谈判价格时用这个价格来对付你。二手经销商只是简单地列出汽车的特点。我们在上市研究中相当一致地看到了这种差异。
现在,对于普通的基本装饰 Outbacks 的定价,我的模型做得很好:

问题是当我们在 trims 开始上升时。显然,如果我建立一个忽略装饰的模型,并让它们与非常关心装饰和升级的汽车经销商对抗,我将开始遇到问题。解决办法?开始收集数据并跟踪变化!!
我将我的模型与我们在网上找到的所有符合我们标准的汽车进行了对比。然后我注意到了我的型号和标价之间的差异。这让我深入了解了经销商是如何为他们的装饰定价的。就额外成本而言,Premium 似乎没有给我带来太多好处,但 boy Limited 确实展示了一些有趣的模式!

我们可以看到,斯巴鲁经销商认真对待他们的装饰。对于 5 号线诺沃克的标准 2.5 基本装饰,它们实际上是根据我的模型非常准确地定价的。但是,当我们进一步进入包的中间部分时,有限的调整往往会额外增加 35000 美元。
我们的下一步是跳舞,找到里程数、额外费用、离纽约市的距离的正确组合,最后是手头的现金,以选择我们最少被敲竹杠的车。正如我之前提到的,我和我哥哥倾向于有限的装饰,因为这些都是斯巴鲁视力套装标准,而对于溢价,我们必须做进一步的调查,以确定它是否可用。在 Koeppel 和 Vestal Premium trims 这两款车中,Eyesight 是可用的,但 Koeppel 拒绝对他们的车进行认证二手车检查,这本来可以减轻我们在可靠性方面的许多担忧。Vestal 经销店需要 4 个小时的车程,对我们来说太远了,无法证明试驾之旅的合理性,但如果他们乘坐 CPO 过来,在谈判中用来对付 Koeppel 会很好。
抛开溢价不谈,斯巴鲁世界和诺沃克内陆是名单上最便宜的。世界斯巴鲁傲虎既有低价格和低里程,这使它看起来像一个很好的交易。然而,Carfax 的报告表明,尽管它只有 13k 英里,但它已经发生了 2 起事故和 2 个前车主。那段历史显然在它的定价中起了很大的作用,我可能会考虑在未来的模型构建中包括这一点。
留给我们的是诺沃克内陆。40k 英里,这确实有点超出了我们可接受的里程范围,但与我们认识的其他斯巴鲁车主的交谈使我们确信,40k 对于 Outbacks 来说是可接受的里程。最重要的是,在大喊大叫、走出门外又回来之后,他们又把价格降低了 500 美元,降到了 21500 美元!诺沃克的差价为 2934 美元,在我们的名单中绝对值得购买。
结论
买车,不管是二手车还是新车,都是一个漫长的过程。总之,我们花了大约 3 周的时间来追踪、研究、试驾和谈判所有这些汽车。在整个故事中,我们一直担心我们被骗了,担心车里有我们不知道的隐藏问题(我们仍然担心),并质疑我们购买新车的决定是否正确。
这种模式有助于减轻一些压力。知道即使我们会被敲竹杠,其他人也会以同样的方式敲竹杠多少有些帮助。更重要的是,有了这个基线来进行适当的比较,意味着我们可以更容易地剔除潜在的柠檬。
总而言之,虽然我绝对憎恶购买这款新车的整个繁琐过程,但我对我的车型很满意。它帮助我们缩小了选择范围,这样我们就可以把研究重点放在对我们真正重要的汽车上,让我们安心。
我邀请您在购买您的下一辆二手车时亲自体验一下!
我如何利用数据科学为一个重要事件挑选香槟
原文:https://towardsdatascience.com/how-i-used-data-science-to-select-champagne-for-an-important-event-f54e81bad59?source=collection_archive---------30-----------------------
警告:读完这篇文章后,你可能会感到口渴

图片来源—葡萄酒搜索者
我有一个重要的事件即将发生。宾客名单中包括高级香槟的鉴赏家。香槟的选择不容出错。我有两种选择香槟的方法。
- 通常的方法——去一个香槟洞穴,尝几口,向洞穴主人寻求建议,选择我喜欢的。我要得到的是山洞里能得到的东西。显然,世界上没有一个洞穴拥有世界上所有的 10K+香槟。
- 数据科学的方式——使用数据和算法来帮助选择。
我之前已经对方法 1 有过不好的体验。要么是我没有好的香槟口味,要么是洞穴主人想推销他们想推销的香槟。
所以我决定采用方法 2。方法 2 的另一个优点是,如果一切顺利,我可以用好的数据故事打动我的客人。边喝香槟边讨论人工智能和数据科学的一些前沿问题听起来非常酷。
这是我用一些很酷的数据科学材料选择香槟的旅程。
在我们开始之前,我要对我使用的所有资源表示感谢:香槟数据库—https://www.wine-searcher.com
从哪里开始
因为苏格兰威士忌总是来自苏格兰,香槟总是法国的。原因是法国有一个叫香槟的地区出产世界上大部分的香槟。香槟的数量远远超过数千。所以第一步是列出所有香槟的清单。幸运的是,有一个每月更新的香槟数据库(可在 https://www.wine-searcher.com找到)。
我下载了 10000 多瓶香槟。相当长的名单。这里显示了一个数据截图。

香槟数据库下载快照。
数据库有一些有用的信息,例如
葡萄——葡萄的种类能很好地表明香槟的味道和口感。
受欢迎程度——这个指标是一种销售等级,也表明客户购买它的频率
分数——这是香槟品酒专家对香槟评价的一个指标
价格——一瓶 750 毫升香槟的欧元价格
我认为我已经获得了开始应用数据科学的良好信息。
决定选择策略
下一步是建立一个选择策略。品尝所有的 10K 香槟是个好主意,但不可行。这是我想到的两个基本策略
- 看看数据里有没有稀有的——比如高分或者高人气,但是价格低。
- 根据列将相似的香槟分成组,并从每组中选择。这将确保良好的总体选择。
策略——寻找稀有品种
我决定看看是否有罕见的使用三个领域-人气,得分,价格。但是首先,重要是看这些字段中是否有任何不相关的。我有过这样的想法,如果低价香槟很受欢迎呢?人气和价格有关联吗?如果是,那么我只需要选择其中一个。
并且它显示了-0.16 的相关值,这意味着没有显著的相关性。

价格与受欢迎程度的相关性
所以现在我可以安全地使用这三个字段,因为它们之间没有重叠。
在数据科学术语中,稀有意味着离群值。发现异常值意味着发现一些不寻常的流行度、分数、价格的组合。找到跨越 10K+行和 3 个字段的非共同组合是一个复杂的问题。幸运的是,借助数据科学的力量,我们可以使用异常值检测算法。
这是异常值检测的结果。

离群点检测
该算法发现了 30 个异常值。这意味着我可以从 10K+香槟名单中挑选出 30 个香槟。哇!这个结果令人震惊。我永远也不会用 excel 手动将 10K 香槟的数量减少到 30 瓶。
我还可以通过查看各个列中的正常范围和异常值来减少列表。这是对各个列进行异常值分析的结果。
对于列分数,高于 94 的值是异常值。
对于列流行度,没有异常值。
对于列价格,超过 400 的值可以被认为是非常高的价格。

因此,在异常值中,仍然通过分数> 94 和价格< 400 进行过滤,我得到了 2 个香槟。瞧啊。这是我的稀有发现。

隐藏的金块

图片来源—葡萄酒搜索者
然后我在网上搜索,我发现了异常的评论。
“世界上 1%的顶级香槟之一”。“以这种质量,价格可能会高出 3 倍”。
我知道我利用数据科学发现了一些罕见的香槟。如果没有数据科学,我会在互联网上花费无数的时间,对我的搜索没有任何信心。
现在来看第二个策略。
策略——将相似的香槟分组
在这个策略中,计划是通过分组来减少列表。这也将有助于我看一些团体,而不是 10K+个人线。然后我可以从组里选几个。
这次我决定使用以下字段葡萄,受欢迎程度,得分,价格。
在数据科学中,分组也是聚类或细分。
第一步是确定我应该分成多少组。我用聚类法将香槟分成 2、3、4 和 5 组,然后观察所有香槟在各组中的分布情况。这是对集群数量的分析结果。

聚类大小分析
我决定选择 3 个组,因为每个组都很重要。这是 3 个集群的聚类结果。

聚类结果
结果很有趣,我来解释一下。首先,输出表明影响集群的列是流行度、得分、价格。这意味着葡萄类型均匀地存在于所有的聚类中,并不真正在数据分组中起作用。
第二,我可以看到三个集群,这意味着
这里需要注意的是,低人气指数意味着高排名。
- 聚类 0-具有低流行数(高等级)和低分数的香槟
- 聚类 2——具有高流行数(低等级)和低分数的香槟
- 聚类 1-高分香槟
然后我决定选择聚类 1(高分),然后根据它的等级和价格进行过滤< 400 (like we did in first strategy). And I reach a short-list of about 12+ champagnes. And the beauty is that rare ones (Pierre Peters Grand Cru and Roederer Rosé) which I found in first strategy also made this list.

Also I see that I find all Grapes types, which is good, as my guest will have a good variety to choose from
霞多丽是世界上最著名的白葡萄酒葡萄。与之搭配的食物有胡桃南瓜烩饭(烩饭 alla zucca )、日式五花肉、蜂蜜芝麻胡萝卜烧鸡
黑比诺的本质是其红色浆果和樱桃的香气。与之搭配的食物有意大利面配牛肝菌肉片,烤鸭胸配梅子酱,烤鸡肝配吐司
Pinot Meunier (历史上只是 Meunier)是一种黑浆果葡萄品种。搭配食物有金枪鱼、椒盐鱿鱼、香蕉叶蒸虾
香槟混合是以上 3 种的混合

图片来源—葡萄酒搜索者
葡萄种类
我决定每种葡萄都去买几个。
瞧,这是我考虑策略 1 +策略 2 后的最终选择

图片来源—葡萄酒搜索者
下一步是去品尝狂欢。幸运的是,我有一个候选名单,我不必根据销售人员提供的东西做一些随机品尝。
活动当天,我把所有通过数据科学挑选出来的香槟都冷藏起来,准备上菜。所有的客人都非常喜欢它!!!他们都很兴奋地知道我是如何使用一些很酷的算法来做出选择的。

图片来源—葡萄酒搜索者
庆祝时间
现在,我已经成为朋友们挑选香槟的首选。我这样做有一个条件——我将使用数据科学,我将进行品尝狂欢!!!
干杯!!!
额外资源
网站(全球资讯网的主机站)
你可以访问我的网站进行零编码分析。https://experiencedatascience.com
请订阅每当我发布一个新的故事时,请保持通知。
[## 每当 Pranay Dave 发表文章时,您都会收到电子邮件。
每当 Pranay Dave 发表文章时,您都会收到电子邮件。注册后,如果您还没有,您将创建一个中型帐户…
pranay-dave9.medium.com](https://pranay-dave9.medium.com/subscribe)
你也可以通过我的推荐链接加入 Medium。
[## 通过我的推荐链接加入 Medium—Pranay Dave
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
pranay-dave9.medium.com](https://pranay-dave9.medium.com/membership)
Youtube 频道
这里是我的 Youtube 频道的链接
【https://www.youtube.com/c/DataScienceDemonstrated
我如何在我的博士学位中使用光学/光子学应用中的机器学习
原文:https://towardsdatascience.com/how-i-used-machine-learning-in-optics-photonics-optoelectronics-9452fe332a9f?source=collection_archive---------23-----------------------
对于你的光学/光子学问题,没有太多/任何开源数据集…
几年前,我获得了奖学金,攻读光子学建模博士学位。光学/光子学波导的建模和优化对于许多即将到来的应用非常重要,例如在增强现实应用中用于引导光的光学波导。看到这些很酷的应用程序激励我开始我的博士之旅。

米卡·鲍梅斯特在 Unsplash 上的照片
像任何其他博士研究员一样,我去了一个地方,当每个人都不确定他们在寻找什么以及如何找到他们正在寻找的东西时,他们都会去那里。是的,你猜对了——谷歌!!
幸运的是,我已经知道我在寻找某种开源代码/库或商业软件,来尝试光子建模应用。
令我惊讶的是,我发现了…
- 商业软件 - Comsol/Lumerical 当时对我来说很贵,我甚至不确定让我的主管去买,因为我不确定我需要哪一个。
- 开源库- 有一些开源库,如 Meep、但我认为我们需要更多。谷歌、脸书、微软都采用了这种新趋势,将他们的技术开源给所有人学习。但是光学建模领域的大公司准备好开源了吗?
- 在我的学士学位期间,我从未费心去学习 Fortran,事实上,我可以说我选择不去听或学习 Fortran,因为它是一种如此过时的语言。语法不好,没有内置绘图库,以及其他问题。什么事?人们仍在使用它,因为它速度快,而且许多仍在使用的代码是用 Fortran 编写的。 但还是 Fortran…
- 没有光学工程师/科学家社区——这个对我伤害最大。我找不到任何博客/网站让光学工程师定期来分享他们的工作和经验。到目前为止,我正在寻找这样的网站,分享人们谈论光子学的常规流量(如果你知道这样的地方,请告诉我!).
机器学习——时髦的词…
如果你正在读这篇文章,那么你很有可能听说过当今的科技术语-
人工智能、机器学习、深度学习
每个人都在谈论它。每一个新公司都在使用它或者想要使用它。他们是否需要并不重要,但他们想使用它。或者至少表明他们跟上了新技术的发展,使我们的生活变得更轻松、更美好。我想这也是很好的营销方式!!
从马克·扎克伯格、比尔·盖茨、蒂姆·库克那里听了好几次这些时髦的话,我认为寻找机器学习到底是什么没有坏处。
机器学习是什么鬼? 然后我就明白了,机器学习其实就是统计学加上很多其他的东西。

机器学习是什么鬼?信用:https://www.meme-arsenal.com/en/create/meme/1868835
我从斯坦福大学的吴恩达教授的免费课程开始,并查看了一些 YouTube 视频。我最终花了 1000 多英镑去上 Udacity 和 Udemy 的课程。几个月来,这些课程消耗了我的每个周末。几乎每个周末。为了参加聚会,我甚至不得不几次对朋友说不。你能想象吗!!我知道我很愚蠢。反正现在都过去了…
机器学习+光子学…
读博士的第一年,我仍在寻找一个将成为我博士论文的主题。花了几个月时间阅读各种光子学研究论文,在尽可能少的帮助下理解一些最初的光学建模代码,并对几乎不存在的在线光学科学家社区感到恼火。
这时候我突然想到- 我应该尝试将机器学习用于光学/光子学应用吗?
是啊,为什么不呢!!有一个很大的机器学习在线社区,我有光学工程的背景。我觉得可能会有用。但是请记住,我在机器学习领域仍然是新手,几乎没有触及表面来理解和有效地使用它。那么问题就来了,如果我必须让它工作-
- 到底有没有可能?有人做过吗?
- 我不确定哪种光学应用可以考虑使用机器学习。
- 数据集- 没有可用于任何光学应用的开源数据集。再次没有大的在线光学社区。
- 编码帮助- 有没有可以开始的初始代码?还是什么都要我自己写?
- 最大的问题——用光学来使用机器学习真的有用吗,还是我只是想在工作中使用一下流行语技术?
这个想法消失了将* 6 个月…
带着以上问题,我放弃了在光子学中使用机器学习的想法。我想每个人在寻找博士课题时都会遇到这种情况。每天,他们都有新的想法,然后继续前进。同样的事情也发生在我身上,我忙于典型的光学/光子学应用问题。
这是一个普通的工作日,也许我开始感到无聊,开始查看谷歌新闻。我完全不记得了。我看到一篇发表的研究论文,在一些光子功率分配器问题中使用了机器学习。我记得当时我对自己说- 哦,该死!几个月前你想过这个问题,这是有可能的…这不仅仅是因为我对使用光学应用的术语技术感到兴奋。
我也可以用它,并且会用它…我所有的疑惑/问题都被它自己回答了……

陈奕迅在 Unsplash 上拍照
最后一个未解之谜…
数据集?
我仍然没有任何网上可用的数据集。然后我想,如果我在网上找到数据集,那么我必须坚持光学问题。但是如果我可以根据自己感兴趣的问题生成自己的数据集呢?这导致了我自己长达一个月的数据收集过程。这大约是 10000 个数据点,仍然远远低于一般的机器学习问题。
我想说的是,如果你对使用机器学习的问题感兴趣,你可以收集自己的数据。但这同样取决于你感兴趣的问题类型。在我的情况下,它的工作原理是,我可以使用我们内部开发的代码和研究实验室中可用的制造设施来收集它。
一个百万美元的问题…
在我最后的 viva 和 2 次工作面试中,我被问了 3 次——如果我们可以使用方程来预测或优化特定的光学设备,为什么要使用机器学习来解决光学应用问题?
当有大量输入参数需要优化时,机器学习大放异彩。首先,如果在我们的光学问题中,例如有超过 10 个输入设备尺寸需要优化,那么我们可以容易地使用机器学习。自己逐一比较和优化 10 个或更多的参数是一项艰巨的工作。第二,如果我们实验收集的数据有一些未知的噪声因子,而这些未知的噪声因子在方程中从来没有被考虑过。 在这种情况下,可以使用机器学习来预测新值,该新值将考虑实验套件的未知噪声。所以我认为这两个因素/情况使得机器学习在光学问题中的应用非常有用。
后来,我发表了两篇关于这项工作的期刊论文,其中一篇甚至被选为编辑推荐。理解机器学习对我来说是一种好奇,但最终却成了我博士论文的主题。所以你永远不知道…
正如史蒂夫·乔布斯所说——你只能回顾过去才能把点点滴滴联系起来。
如何在光学中使用机器学习,查看下面的文章-
[## 如何用 40 行代码将机器学习用于光学/光子学应用
而且你不需要成为机器学习的专家…
medium.com](https://medium.com/@sunnychugh/how-to-use-machine-learning-for-an-optical-photonics-application-in-40-lines-of-code-92cc1c6704f6)
我如何使用机器学习来自动手绘任何图片
原文:https://towardsdatascience.com/how-i-used-machine-learning-to-automatically-hand-draw-any-picture-7d024d0de997?source=collection_archive---------16-----------------------
监督和非监督学习变得容易!

[左]我的代理人自主绘制的照片。【右图】来源 : 杰克·莫雷
自动化无用的任务很有趣
没有什么比让机器人做无用的事情更好的了。我对艺术一窍不通,所以我决定发挥自己的优势,训练一个代理人在 MS paint 上为我手绘任何一幅画。

代理绘制不带颜色的马卡龙图片(32 倍速)
然而,说实话。我可以很容易地编辑图像,混合一些像素颜色,瞧!我创造了和你在第一张照片中看到的一样的绘画般的图像。
但那很无聊。
是的,在 MS Paint 中绘制它是乏味的,耗时的,并且相当麻烦。但是,它表明人工智能、机器学习和优化的基础知识可以让我们做出令人惊叹的东西。在这里,我将概述我是如何设计这个代理来绘制任何图片的。
处理图像
TLDR:使用 OpenCV 应用可选的高斯滤波器,使用 Canny 边缘检测提取线条,并使用二进制阈值处理使我们的边缘变黑。有一些超参数控制绘图及其细节的相对大小。
首先,我们需要从图像中提取边缘。这样,代理就知道该画什么线了。使用 OpenCV,我们应用高斯滤波器,并使用 Canny 边缘检测来提取要绘制的大部分相关线条。然后,在使用反向二进制阈值使我们的边缘变黑之后,我们就可以提取出我们的程序要画的轮廓了!

【左】原图。来源 : BelleDeese 【右图】图像处理后
我提供了三个混合匹配高斯模糊核大小和谨慎边缘检测阈值的选项。通常,增加的高斯模糊与较低的阈值成对出现,反之亦然。我们如何决定使用哪个选项?答:这取决于图像的细节。
有些图片只是有太多的难以辨认的线条(比如狮子的鬃毛)。在这些情况下,最好使用更多的模糊,因为我们会忽略细线,而注意到更强的线。另一方面,一些图片可能自然有足够的、可辨别的细节,允许我们使用较少的模糊。

如果不进行过滤,更精细的线条会变得难以辨认
还有两个特定的超参数需要优化。变量 "scale" 决定了我们想要用于绘图的屏幕部分。变量“细节”决定了我们想要从原始图像中保留多少细节。
在我们的专用部分内适当地拟合照片之后,我们使用细节参数将照片缩小成具有假定的伪尺寸的图像。这是我们计划草图路径的维度(我们的程序画线的顺序)。同样,我们通过使用变量 startX 和 startY 来定义我们将要绘制的原点。这有助于我们定义 translate 方法,从物理绘图中抽象出我们的实现。
等等,但是我们要怎么画?
TLDR:使用一个超级方便的鼠标光标控制库 PyAutoGui。构建一个事件列表,包括拖动铅笔的方向、何时提起铅笔以及何时推动铅笔。
好的,但是在我们开始规划草图路径之前,我们需要检查一下我们到底是如何将代码转换成 MS Paint 上的绘图的。我们可以使用一个名为 PyAutoGui 的库来控制鼠标事件。首先,我们构建一个命令列表(在下一节中讨论),其中包含拖动光标的点、何时释放左键以及何时按住左键。然后,我们处理每个命令,看它创造奇迹!

代理在海滩上画城堡(256 倍速度)
下面是将命令列表转换成鼠标事件的简单代码:
规划草图路径
TLDR:将所有的边缘像素插入 KD-Tree 和 Hashset。我用一个简单的算法来规划路径:从任何边缘像素开始。第二步,将铅笔拖动到未访问的相邻像素,有利于保持代理当前方向的像素。重复第二步,直到没有未访问的相邻像素。使用 K-最*邻来找到最*的未绘制边缘像素,并重复直到图片被完全绘制。对执行速度进行了其他优化。
是的,我很容易就能拍下这张处理过的照片,然后就此收工,但这一点也不好玩。相反,我们将使用监督学习和一个简单的算法来有效地找到代理绘制的路线。

照片由 niko photos 在 Unsplash 上拍摄(非代理绘制)
KD 树和 K-最*邻
我们需要一种方法来有效地跟踪我们的边缘像素。因此,我们可以将所有边缘像素坐标放入一个 HashSet 和 KD 树中。这些将跟踪我们的未绘制的边缘像素。这意味着一旦我们画完一个边缘像素,我们就从两个数据结构中删除它。
好的,我们知道如何跟踪我们的边缘像素,但是我们如何决定绘制它们的顺序呢?
动量和连续性
当我们人类画画时,我们试图保持方向性。也就是说,我们用*滑、连续的笔触描绘事物,而不是跳动或不稳定的笔触。所以,我们用动量的概念。
我们可以把我们的命令想象成一个元组列表,每个元组告诉我们从哪里拖动光标到哪里。当我们的机器人规划它的路径时,在我们从某个方向输入一个像素后,我们通过偏好与前一个方向最相似的未绘制的边缘像素来决定我们要行进到的下一个像素。换句话说,我们查看像素的八个相邻像素中的每一个,过滤掉那些不是未绘制边缘像素的像素,并选择最大化方向性保留的像素。如果没有相邻的,使用 K-最*邻从一个新的位置开始。

使用规划的路径绘制日落海滩(64 倍速度)
为了快速复习 K-最*邻和 K-D 树,这里有一个来自莎万·帕特尔的很棒的教程:
[## 第四章:K *邻分类器
监督学习中的第四个也是最后一个基本分类器!k 个最*邻居。在本帖中,我们将讨论…
medium.com](https://medium.com/machine-learning-101/k-nearest-neighbors-classifier-1c1ff404d265)
所以,我们可以把这个算法总结成几个步骤:
- 选择任意起点和方向
- 如果有相邻的未绘制边缘像素,请将铅笔拖动到最大程度保留方向性的像素。然后,重复。
- 如果没有,使用 K-最*邻移动到一些新的未绘制的边缘像素。回送至步骤 2,直到所有像素都已绘制完毕
这可以用代码表示:
在第 39 行,您会注意到有一点优化。我们告诉代理:如果你正朝着与上一步相同的确切的方向移动,将两个命令合并成一个。这样,我们可以画一个简单的笔画,而不是
运行时间
散列表的查找和删除需要[分摊的]固定时间。K-D 树对于每个查询花费 O(D*Log(N))。如果我们将 N 表示为图像中的像素总数,我们可以通过查看算法的每个部分来找到运行时间:
- 插入 HashSet 和 K-D 树:O(N) + O(2NLog(N))
- 总像素查找和 K-NN 查询:O(N(常数+ 2*Log(N))
- 删除总数:O(N(常数+ 2*Log(N)))
通过将所有部分加在一起,我们得到 O(N*Log(N))的总分摊运行时间来确定绘制路径。当然,绘制图片的物理行为比计算花费的时间要长得多,但是我们不要担心这个!

paweczerwiński在 Unsplash 上拍摄的照片(非代理绘制)
添加颜色
TLDR:将图像上的每个点解释为代表 BGR 值的三维向量。使用 K-均值聚类,将点集分成 K 组,每组对应一种颜色。然后,使用上面的草图算法绘制每种颜色。
有一个选项,我们可以添加颜色到我们的图像。在这里,我们将回顾我们的代理如何决定使用哪些颜色,因为它可以选择的颜色数量有限。
k 均值聚类
K-Means 聚类是一种无监督的学习方法,也非常流行。回顾一下,这里有一篇来自丹尼尔·福利的文章:
[## k 均值聚类
使用无监督学习理解文本数据
towardsdatascience.com](/k-means-clustering-8e1e64c1561c)
在这种情况下,我们应用 K-Means 聚类来确定我们的代理在填充图片时将使用哪些颜色。我们可以把图像上的每个点想象成一个表示其 BGR 值的三维向量。
旁注:OpenCV 很奇怪,它把所有东西都放在 BGR 值中,而不是 RGB
我们可以使用 K-Means 聚类将这些像素中的每一个聚集成 K 个聚类,每个聚类对应于代理被限制使用的 K 种颜色中的一种。这个变量 K 在代码中是可调的。

慢慢填充颜色。来源 : 杰克·莫尔
不幸的是,我无法在 MS paint 上自动选择颜色。因此,对于每个聚类,程序都会提示用户在 MS Paint 上更改笔的颜色。提示颜色的 BGR 值等于相关聚类的*均值。
然后,我们将该簇中的所有像素传递给之前的相同草图路径算法,只是这次使用了不同的颜色。我们对每个集群重复上述步骤。
此外,我们可以决定作为一个超参数,如果我们想添加额外的轮廓后,所有的颜色已经填写。就我的口味而言,我宁愿不写提纲,但我有什么资格评判呢?

无轮廓的左与有轮廓的右来源 : 杰克·莫尔
结果呢
TLDR:哦,是的!一切看起来都很棒!
那么,这个程序能画出什么样的图呢?嗯,实际上什么都可以。当然,当图片没有明确的边缘或有点模糊时,它有时无法绘制出正确的轮廓,但颜色看起来很棒。更妙的是,画一张图还挺费时间的,所以我们只做了几张。

【左】原创。来源:阮安琪[右]经纪人的画

[左]代理商的图纸[右]原件。来源 : 杰克·莫雷

[左]代理商的图纸[右]原件。来源 : 贝勒迪斯
结论
你有它!我们成功地创造了一个自动[模仿]艺术家!这表明,即使是基本的机器学习算法也可以带我们走多远!当然,人工智能中有无限多的子领域、方面和技术,但有时,无论任务多么无用,都需要创造力和一点努力才能看到结果。
从经典到最先进,这里是讨论人工智能和强化学习的相关文章:
[## OpenAI 的 MADDPG 算法
多主体 RL 问题的行动者批评方法
towardsdatascience.com](/openais-multi-agent-deep-deterministic-policy-gradients-maddpg-9d2dad34c82) [## DeepMind 的虚幻算法解释
最佳深度强化学习
towardsdatascience.com](/how-deepminds-unreal-agent-performed-9-times-better-than-experts-on-atari-9c6ee538404e)
我如何使用机器学习来制定 GRE 备考策略。
原文:https://towardsdatascience.com/how-i-used-machine-learning-to-strategize-my-gre-preparation-75e904a63fd8?source=collection_archive---------10-----------------------
GRE 备考最具挑战性的部分是词汇部分。至少对我来说是这样,直到我的机器学习模型帮我解决了这个问题。

巴伦的 333 个单词(红色)及其同义词的图表。
当我开始准备 GRE 时,在浏览了许多资源(词汇部分)后,我发现有些单词在考试中经常出现,Barron 的高频单词表是解决这个问题的著名资源之一。首先,我选择了 Barron 的 333,这是一个包含 333 个在 GRE 中出现频率最高的单词的单词列表。下一个挑战是学习这些单词,所以我想出了一个计划。如果我能以某种方式把相似的单词组合在一起,学习过程就会容易得多。但是怎么做呢?手动将这些单词分组比简单地按原样学习单词更具挑战性。思考了一段时间后,我想到为什么不让机器做所有的艰苦工作!我认为每秒超过一百万次浮点运算的能力比我更适合这些类型的任务,所以让我们开始,看看如何从头开始构建一个模型,将相似的单词聚集在一起。
我将涵盖几个机器学习概念,如自然语言处理( NLP )、词频-逆文档频率( TF-IDF )、奇异值分解( SVD )、 K-Means 、t-分布式随机邻居嵌入( t - SNE )以及许多其他数据搜集、特征工程和数据可视化技术,以展示我们如何从零开始对数据进行聚类。
注意:我将在这个项目中使用 python 3.7。
博客将分为以下几个部分-
- 数据收集:抓取网站来收集数据。
- 数据清理
- 特征工程
- 建模
- 可视化结果
现在我们知道了问题陈述和数据流,让我们开始吧。
抓取数据
第一项任务是收集数据,即巴伦的 333 个高频词。这可以通过手动键入单词并创建列表来完成,也可以通过自动化过程来完成。我使用 BeaulifulSoup 和 request 创建了一个从不同网站自动抓取数据的功能,让我们简单了解一下这些库以及如何使用它们。
- Numpy: 一个库,增加了对大型多维数组和矩阵的支持,以及对这些数组进行操作的大量高级数学函数。
- Pandas: 一个为数据操作和分析而编写的库。特别是,它提供了操纵数值表的数据结构和操作。
- BeautifulSoup: 一个解析 HTML 和 XML 文档的库。它为解析过的页面创建了一个解析树,可以用来从 HTML 中提取数据,这对 web 抓取很有用。
- 请求: 请求模块允许您使用 Python 发送 HTTP 请求。HTTP 请求返回一个包含所有响应数据(内容、编码、状态等)的响应对象。
代码将使用请求从目标网站获得响应,然后使用 BeautifulSoup 解析 html 响应,从页面中提取所需信息,并使用 pandas 以表格格式存储信息。 要了解一个 html 页面的格式,可以查看本教程。
# importing necessary librariesimport requests
from bs4 import BeautifulSoup
import re
from functools import reduce
import numpy as np
import pandas as pd
让我们从这个网站上刮下巴伦的 333 个单词及其含义
chrome 中网页的 HTML 代码可以在 mac 上使用 ⌘+shift+c 或者在 windows/Linux 上使用 c trl+shift+c 来访问。
这里我使用“span”作为标记,class _ = ' term text not translate lang-en ',因为包含单词和含义的元素具有相同的标记和类,并且在每个行元素中只有两个这样的元素,第一个对应于单词,第二个对应于含义。

需要废弃的元素的 HTML 结构的屏幕截图。
这是以表格形式收集的数据。

废弃单词和意义的数据框架。
这些数据是不够的,所以让我们通过从这个网站收集每个单词的同义词来增加更多的数据

这里有一个同义词的元素。

包含单词和同义词的数据帧
现在让我们连接两个数据框(含义和同义词):
result = pd.merge(df.word, data, on='word')
result.fillna('', inplace=True)
print(result)

我们可以看到,数据需要一些清理,因为它包含停用词,如和,或,和其他元素,如标点符号。此外,我们必须注意不能、不会、不这些必须分别转换为不能、不愿意、不做的缩写。
现在,既然数据已经被清理,让我们做一些特征工程。
特色工程
我注意到的一件事是,其中一些单词的同义词也属于 Barron 的 333 列表。如果我能以某种方式连接这些单词的同义词,它可以提高我们的模型的性能。

- 例如对于,同义词有迂回、迂回、迂回、迂回。**
- 在这 3 个同义词中,错综复杂出现在巴伦的 333 个单词列表中,它的同义词错综复杂,错综复杂。**
- 所以,曲折的最后的同义词应该是迂回的、迂回的、间接的、错综的、迷宫般的、令人费解的。
在这一步之后,对于 Barron 的 333 个单词列表中的每个单词,我们都有直接同义词、间接同义词(在上面的例子中,错综复杂的同义词是曲折复杂的间接同义词)和含义。在这篇博客中,我将对这些数据使用符号 set 。
集合:关于一个词的数据(这里这个词来自 barron 的 333)比如它的直接同义词、间接同义词和意义。词的集合包括词本身。
我们已经获得了需要聚类的干净的单词集,但是记住我们首先需要将这些集合转换成某种数字数据,因为我们的模型需要数字来处理。
我将使用 TF-IDF 对数据进行矢量化。在开始之前,让我们先了解一下什么是 tf-idf
TF-IDF 术语频率的缩写-逆文档频率是一种数字统计,旨在反映一个词对语料库中的文档有多重要。让我们用单词袋*来理解这一点。*
单词袋模型是在自然语言处理和信息检索中使用的简化表示。在这个模型中,文本被表示为它的单词包。
简单来说,单词包只不过是文档的基本数字表示,它是通过首先创建包含所有文档中所有不同单词的单词的词汇表来完成的。现在,每个文档都用一个有“n”个元素的向量来表示(这里,n 是词汇表中的单词数,所以每个元素对应于词汇表中的一个单词),每个元素都有一个数值,告诉我们这个单词在文档中出现了多少次。让我们考虑一个例子:

- 列字代表词汇。
- 在该表中,列文档 1 和文档 2 分别表示文档 1 和文档 2 的弓。
- 数字表示相应的单词在文档中出现的次数。
- 现在来了 TF-IDF,简直就是词频和逆文档频的乘积。
词频 : 表示一个词在文档中出现的频率的数字。

逆文档频率 : 它是找到包含该单词的文档的概率的倒数。

请这样想:如果这个词在所有文档中广泛使用,那么它在特定文档中的存在将无法提供关于该文档本身的同样多的特定信息。因此,第二个词可以被看作是一个惩罚词,用来惩罚常见的词,如“a”、“the”、“and”等。因此,tf-idf 可以被视为特定文档中单词相关性的加权方案。
我们来看看两个文档的 TF-IDF:
文档 1:“TF 代表词频”,terms: 5
文档 2:“and IDF 代表逆文档频”,terms: 7

一袋单词、TF 和 IDF 值。

TF-IDF 值。
二元模型: 二元模型是一串记号中两个相邻元素的序列,这些记号是典型的字母、音节或单词。下面是一个从文档中生成的单词和双词的例子。
doc:【TF 代表词频】
单字: ['tf ','代表','代表','词频']
[' TF 代表','代表','代表词频']
n 元语法的优点是它们增加了关于文档中单词序列的信息。
我写了一个计算 TF-IDF 的函数,这个函数同时使用了一元和二元。
现在,我们已经有了每个集合的 TF-IDF 嵌入,我们可以继续建模了。
注意:我们目前拥有的数据是一个表格,包含 m 行和 n 列,其中‘m’是 Barron 的 333 个单词列表中的单词数,而‘n’是单词词汇表的大小。这个表格数据也可以表示为一个维度数组(m×n)。在博客的后面,我将使用数组来表示数据。****
在建模之前,我想分享一些我觉得非常有用的东西。与其直接使用 TF-IDF 值进行建模,不如降低数据的维度?这意味着,我们有对应于每个集合的 TF-IDF 值,并且因为这些 TF-IDF 值被表示为 n 个元素的向量,其中‘n’也对应于我们所有集合中不同单词的数量。如果两个集合具有几乎相同的单词,则 n 维超*面中对应点之间的距离将会非常小,反之亦然。类似地,如果 2 个集合有非常少的共同单词,则 n-超*面中对应点之间的距离将会大得多,反之亦然。现在,我不再使用 n-超*面来表示这些点,而是将这些点的维度降低到 32 维(为什么是 32 维?稍后将在博客中讨论)。可以通过挑选 32 个随机维度并忽略其他维度来降低维度,但这太愚蠢了,所以我尝试使用不同的维度降低技术,并发现截断的 SVD 可以为给定的数据创造奇迹。
我使用降维的方法给数据添加某种形式的正则化。
让我们理解截断奇异值分解-
SVD 是奇异值分解的缩写,它是一种矩阵分解技术,将任何给定的矩阵分解为三个矩阵 U、S 和 v。
它遵循以下等式-

这里,A 是包含 m 行和 n 列的输入矩阵。
让我解释一下什么是 U,S,V。
U(又名左奇异): 是一个正交矩阵,其列是 AᵀA 的特征向量。 S(单数): 为对角矩阵,其对角元素为按降序排列的 AᵀA 或 AAᵀ (两者具有相同的特征值)的特征值的*方根即

V(又名右奇异): 是一个正交矩阵,其列是 AAᵀ 的特征向量。

****特征向量:特征向量是当对其进行线性变换时,其方向保持不变的向量。考虑下图,其中显示了三个向量。绘制绿色方块只是为了说明应用于这三个向量的线性变换。
注意,这些特征向量的方向不变,但它们的长度变了,而特征值是它们长度变化的因子。
来源:https://www . vision dummy . com/2014/03/特征值-特征向量/

对特征向量(红色)应用线性变换(例如缩放)时,它们不会改变方向。其他载体(黄色)有。
现在我们知道了如何分解矩阵,我们可以使用截断奇异值分解来降低矩阵的维数,截断奇异值分解是奇异值分解的简单扩展。
****截断奇异值分解:假设我们有一个维数为(m x n)的输入矩阵,我们希望将它简化为(m x r)其中 r < n.
我们简单地计算 AᵀA 的第一个‘r’特征向量并将其存储为 u 的列,然后我们计算 AAᵀ 的第一个‘r’特征向量并将其存储为 v 的列,最后存储为的根

简而言之,截断 SVD 是一种聪明的技术,它通过保留尽可能多的信息(方差)以一种聪明的方式降低了给定数据的维数。
如果你想更深入地研究奇异值分解,可以看看 W. Gilbert Strang 教授的讲座和关于奇异值分解的博客。
Scikit-learn 带有内置的截断 SVD ,可以直接导入和使用。
建模

http://graph alchem . github . io/Alchemy/images/features/cluster _ team . png
现在我们已经完成了数据预处理和特征工程部分,让我们看看如何使用聚类算法将相似的词分组在一起。
k 均值
K - 的意思是聚类是一种无监督学习,当你有未标记的数据(即没有定义类别或组的数据)时使用。该算法的目标是在数据中寻找组,组的数量由变量 K 表示。
让我们看看 K-means 是如何工作的。
假设在一个二维*面上有一些点,我们想把这些点聚集成 K 簇。
内容来源:https://www.youtube.com/watch?v=5I3Ei69I40s&feature = youtu . be
步骤很简单-
- 在*面上随机定义 K 个点。让我们称这些点为群集质心。
- 迭代数据中的每个点,检查最*的质心,并将该点分配给其最*的质心。
- 经过上述步骤,每个质心必须有一些最接*它的点,让我们称这些点集为簇。
- 通过计算每个聚类中所有点的 x 和 y 坐标的*均值来更新该聚类的质心。计算的*均值(x,y)是该聚类的更新质心的坐标。
- 重复最后 3 个步骤,直到质心的坐标没有更新太多。
但是如何决定 K(聚类数)的正确值呢?

http://www . SEM spirit . com/artificial-intelligence/machine-learning/clustering/k-means-clustering/k-means-clustering-in-python/
失真可以用来检查对于给定的 K 值,聚类算法的效率如何。
K 的最佳值可以通过计算不同 K 值的失真值,然后绘制它们来确定。
该图被称为弯头图。只需查看肘形图,我们就可以确定最佳“K ”,即失真停止快速下降的值。

这是一个肘形图,通过观察,我们可以说最佳超参数是 k=3。
它被称为肘图,因为它看起来像一只手臂(也许是棍子人的手臂),这只手臂的肘部代表最佳 k。
还有一件事,我将使用余弦距离作为度量来计算点之间的距离(包括质心)。让我们快速了解什么是余弦距离利用余弦相似度。

****余弦相似度是计算 2 个向量*行程度的度量。它是使用两个向量之间的角度的余弦来计算的。很容易计算出来,用-

所以如果 2 个向量 a 和 b *行,那么它们之间的角度将为 0,余弦相似度将为 cos(0) = 1。类似地,如果两个向量 a 和 b 指向相反的方向,它们之间的角度将是𝛑,余弦相似度将是 cos(𝛑) = -1。
简而言之,余弦相似性告诉我们两个向量在多大程度上指向相似的方向。接* 1 的值告诉我们,向量指向非常相似的方向,而接*-1 的值对应于指向相反的方向。

现在 2 点之间的余弦距离无非是
1 -(多维空间中代表它们的向量的余弦相似度) 。
所以范围从(0 到 2),其中 0 对应非常相似的点,2 对应非常不相似的点。
你猜两点间的余弦距离什么时候会是 1?
要了解更多信息,请查看这个博客。
我将从头开始实现 K-means,因为 Scikit 知道 K-Means 不支持余弦距离。
是时候对预处理数据运行算法并检查正确的超参数了。
超参数调整是一个确定正确的超参数的过程,使模型对给定数据非常有效。在这种情况下,有两个超参数-
- 1 来自截断 SVD: n_components(降维)
- 1 from K-表示:‘K’(聚类数)。
我已经画出了不同 n_component 值的肘图。

**通过观察这些图,我们可以说最佳的超参数是-
- n_components: 32
- K(聚类数):50**
最后,使用最佳超参数初始化截断的 SVD 和 K-Means,并对数据进行聚类。
**from sklearn.decomposition import TruncatedSVD> trans = TruncatedSVD(n_components=32)
> data_updated = trans.fit_transform(words_tfidf.toarray())
> model = custom_KMeans(n_clusters=50)
> model.train(data_updated)**
可视化结果
这些是对数据进行聚类后得到的结果。

让我们来看看一些集群:
我将使用 networkx 库来创建集群。
在每个聚类中,红色节点对应于 Barron 的 333 个单词列表中的单词,以及它们之间的联系和它们的同义词。
你可以在这里查看 networkx 的文档。另外,我将在最后用一个例子来演示它有多棒。

最后,让我们用 t-SNE 三维可视化数据,但首先,
我们来说说 t-SNE:

https://www.youtube.com/watch?v=wvsE8jm1GzE
****t-SNE(t-分布式随机邻居嵌入)是一种用于探索高维数据的非线性降维算法。它将多维数据映射到两个或更多维,使得在较低维中的每个嵌入表示较高维中的值。此外,这些嵌入以保持邻域点之间的距离的方式放置在较低的维度中。所以,t-SNE 也保留了数据的本地结构。
我会试着解释它是如何工作的。
对于 n 维超空间中的给定点,它计算该点与所有其他点的距离,并将这些距离分布转换为学生的 t 分布。对所有点都这样做,最终,每个点到所有其他点的距离都有自己的 t 分布。
现在,这些点被随机分散在低维空间中,每个点被移位一定距离,使得在完成所有点的移位之后,如果我们重新计算每个点到剩余点的距离的 t 分布(这次是在低维空间中完成的),该分布将与我们在 n 维超空间中获得的分布相同。
在 t-SNE 中有 2 个主要的超参数-
困惑: 不用计算到所有其他点的距离,我们可以只使用‘k’个最*的点。这个“k”值被称为困惑值。
迭代: 我们希望 t-SNE 更新低维空间中的点的迭代次数。
由于随机性,算法可能会因不同的困惑值而表现不同,因此作为一种良好的实践,最好针对不同的困惑值和不同的迭代次数运行 t-SNE。
想了解更多关于霸王龙 SNE 的信息,请查看这个很棒的博客,它用互动可视化很好地解释了霸王龙 SNE。
下面是使用 t-SNE 表示 3d 空间中的点的代码。
在上图中,每个气泡代表 3d 空间中的一个单词。我们可以看到一些紫色和橙色的点很好地聚集在一起。我们还可以在橙色中看到一个太远的点,这意味着它在语义上不同于大多数单词。这种表示可能不是很好,因为聚类是使用余弦距离计算的,而 t-SNE 使用一些不同的距离度量,并且因为 t-SNE 是随机的,所以它需要一些超参数调整,所以如果您想使用另一个数据集或使用欧几里德距离的较少数量的聚类进行实验,希望它会工作。
这是另一个使用 t-SNE 的图,只使用不同困惑和迭代值的二维。我们可以看到 t-SNE 与困惑 20 和 2000 迭代工作得很好。

最后,这里是使用 networkx 的所有单词及其同义词的完整图表(我为每个单词使用了 4 个同义词)。

最终注释
感谢您阅读博客。我希望它对那些有志于从事 NLP、无监督机器学习、数据处理、数据可视化项目的人有用。
如果你对这个项目有任何疑问,请在这个项目的回复部分或 GitHub repo 中留下评论。
我的 Github 上有完整的项目:
https://Github . com/SarthakV7/Clustering-Barron-s-333-word-list-using-unsupervised-machine-learning
在 LinkedIn 上找到我:www.linkedin.com/in/sarthak-vajpayee
和*!☮
我如何使用 Python 代码来提高我的韩语水*
原文:https://towardsdatascience.com/how-i-used-python-code-to-improve-my-korean-2f3ae09a9773?source=collection_archive---------33-----------------------
“你好世界!”/ "안녕하세요 세계!"

Valery Rabchenyuk 在 Unsplash 上拍摄的照片
对我来说,两件重要的事情是高效和有效。
2020 年初,我决定要自学韩语。我对这种文化很感兴趣,并被学习一门非欧洲语言的挑战所吸引。我不想成为通常的陷阱的受害者,这感觉像是一件苦差事,所以我开始使用各种各样的资源,包括 Duolingo、LingoDeer、Talktomeinkorean.com、闪存卡、韩剧和显然还有——几千小时的 BTS 专辑。
朝鲜语(韩文)很有逻辑性,很有趣,在许多关键方面与英语有很大不同。花了几个月的时间来掌握话题标记、敬语和不同的对话水*,但最终我对语言的结构有了足够的熟悉,并专注于学习更多的词汇。
然而——正如许多学习者可能同意的那样——我发现用谷歌翻译并不总是有用,因为不仅翻译经常有点偏离主题,而且因为韩语句子是由主语-宾语-动词(而不是 S-V-O)构成的,使用助词标记,并以不同的方式部署描述符,所以翻译的文章不容易告诉我哪些词是动词、名词、形容词。
进入파이썬!(…在韩语中是‘python’的意思)
我最*一直在学习几门不同的课程,所有课程都涉及到大量使用 python。因此,我想“一定有办法让这两个伟大的爱人走到一起”,经过大量的研究,下面的计划诞生了:
基本想法是,我希望能够通过 python 传递一段韩语文本(例如,新闻文章、菜谱、歌词),并让它清楚地告诉我哪些部分是名词、动词等。然后,我会翻译每一部分,并使用一个数据帧来打印一个词汇表。剧透预警:我做到了。
好消息是,和往常一样,几乎所有的艰苦工作都已经被一些伟大的开发者完成了。我决定使用 KoNLPy 模块和 Google Translate API 来保持相对简单。【KoNLPy 是韩语自然语言处理的 python 包,而且认真酷炫。 ]
设置 KoNLPy
关于设置模块的所有细节,可以在这里找到一个非常清晰的演示。在导入到我的 python 环境之前,我所需要做的就是在命令行安装 Java 开发工具包、一个正确版本的 JPype wheel 和 KoNLPy 。有几个可用的类,但我使用的是 OKT,它是“打开朝鲜语文本”的包装器:
from konlpy.tag import Okt
from konlpy.utils import pprint
测试模块
在调用 pprint utils 类之前,我将我的“文本”设置为句子“我正在吃蛋糕”,并将该类初始化为一个对象。我加入了一些参数,这些参数将使句子规范化,并将单词简化为词根形式:
text = '나는 케이크를 먹고있다'
okt = Okt()
pprint(okt.pos(text, norm=True, stem=True, join=True))
输出正是我想要的,向我显示了名词“我”和“蛋糕”,两个助词(主语和话题)和动词“吃”的词干“吃”。
['나/Noun', '는/Josa', '케이크/Noun', '를/Josa', '먹다/Verb']
现在开始有趣的部分。
构建原型
最终的脚本只使用了三个库:
- 孔尔比
- 谷歌翻译
- 熊猫
将所有这些放在一起相当简单。这次我取了一段文字,用如上使用 KoNLPy 后的结果做了一个数据框:
from konlpy.tag import Okt
from googletrans import Translator
from pandas import DataFrame
text = '내가 뭐랬어 이길 거랬잖아 믿지 못했어 (정말) 이길 수 있을까 이 기적 아닌 기적을 우리가 만든 걸까 (No) 난 여기 있었고 니가 내게 다가와준 거야'
okt = Okt()
# use the okt.pos function and make a dataframe
ttrans = (okt.pos(text, norm=True, stem=True, join=True))
koreanlist = DataFrame(ttrans, columns=['Korean'])
接下来,我将结果分成两列,删除任何重复的行或标点符号,并对值进行排序:
# remove punctuation and sort based on word type
koreanlist.drop(koreanlist[koreanlist.Type == "Punctuation"].index, inplace=True)
koreanlist.drop_duplicates(subset="OriginalWord", keep = False, inplace = True)
koreanlist = koreanlist.sort_values(by="Type")
然后,我设置了翻译器,并添加了一个列来将结果附加到数据帧中。我放弃了原来的专栏,把数据框打印成了减价商品:
# set up translate
translator = Translator()
# translate by adding a column
koreanlist['English'] = koreanlist['OriginalWord'].apply(translator.translate).apply(getattr, args=('text',))
# format
del koreanlist['Korean']
print(koreanlist.to_markdown())
最后,我设置了两个选项:要么导出到 _csv 作为. txt 文件,要么保存到 _html 作为。html:
# optional save as a text file
koreanlist.to_csv('songtranslation.txt', sep='\t', index=False)
# optional save as html
koreanlist.to_html('koreanlist.html')
现在我们有了。你可以在这里看到 html 文件看起来像一个适当的词汇图表,我认为这是非常有效的!

用 python 制作的 HTML 词汇图表
如果你能走到这一步——非常感谢!我很想知道你的想法。这只是一个不起眼的起点,具有很大的潜力,但一旦 K-pop twitter 掌握了它,我相信它会取得巨大的成功:-)。
查看 KoNPLy:https://konlpy.org/en/latest/朴恩贞,宋祖镇。“KoNLPy:Python 中的韩语自然语言处理”,第 26 届人类&认知语言技术年会会议录,韩国春川,2014 年 10 月。
我是如何在我的第一次 Kaggle 比赛中从第一名升至第 18 名的
原文:https://towardsdatascience.com/how-i-went-from-1st-position-to-18th-in-my-first-kaggle-competition-df7b13de6ec8?source=collection_archive---------32-----------------------
我最*参加了我的第一次 Kaggle 比赛,这是一次课堂比赛,是我硕士学位机器学习课程的一部分。我将分享我如何在公开测试数据中排名第一,后来在私人测试数据中排名第 18 的经历。
我是悉尼麦考瑞大学的数据科学硕士。在我的第三个学期,我参加了机器学习课程,40%的课程权重是一场 Kaggle inclass 竞赛,我们必须开发一个深度学习模型,从名人的照片中预测头发的颜色。这里有一个比赛的链接。
为此,我们与名人数据集合作,这是一个广泛使用的名人面孔数据集。这项任务是预测名人的头发颜色,可能是黑色、棕色、金色或灰色。提供给我们的数据集在几个方面对原始数据集进行了预处理:
- 标签已经为任务设定好了。
- 它包含了原始图像的子集。
- 图像的尺寸缩小了,为 48x48,但仍有 3 种颜色(48x48x3)。
预处理过的数据集被分割成 train、val 和 public_test 数据,这与 CelebA 使用的标准分割一致。
我所有的模型都是在一个 python 笔记本中的 Google Colab 中构建的,第一步是将数据下载到 Colab 笔记本中,并为我的模型做好准备。
我随机画了几张图,看看数据是什么样的。

来自训练集的图像样本
我检查了我的训练和验证集中的目标类分布。我绘制了两组中每个目标类的频率,以查看在训练数据中是否有任何一个类对另一个类有更大的影响。

训练数据的目标类分布

每个目标类在两个数据集中的分布非常相似,但 gray 在训练集中的图像数量最少,这可能使 gray 的类特定精度低于其他类。由于这些数据已经被分成了训练集和测试集,所以我决定创建另一对训练集和验证集,在这个新集中有相等的类分布。我这样做是为了看看这种不均匀的分布是否对模型的整体准确性有任何显著的影响。
在创建了一个*衡的训练集之后,这就是类分布的样子。

基线模型
我的第一个模型是一个简单的卷积神经网络,这里没有什么花哨的,这是用来设置一个基线性能,然后创建更多的模型来改善这种性能。
model_basic = Sequential()
model_basic.add(keras.layers.Conv2D(64, 7, activation="relu", padding="same",input_shape=[48, 48, 3]))
model_basic.add(keras.layers.MaxPooling2D(2))
model_basic.add(keras.layers.Flatten())
model_basic.add(keras.layers.Dense(128, activation="relu"))
model_basic.add(keras.layers.Dense(4, activation="softmax"))model_basic.summary()model_basic.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model_basic.fit(images_train, train_labels, epochs=10, validation_data=(images_val, val_labels), batch_size=128)
输入层的形状为 48x48x3,因为我们的图像是 48x48 像素,每个像素有 3 个 RGB 值,有 64 个 Conv2D 滤镜。使用的激活函数是 relu,除了使用 softmax 的最后一层,损失函数是二元交叉熵,adam 作为优化器。该模型在默认数据分割上进行训练,在验证数据集上的准确率为 86.17%。
深度模型
接下来是第一个多层深度学习模型。它有 3 对 Conv2D 和 MaxPooling2D 层,然后是一个 flatten 层,接着是 5 个密集层,中间有 dropout 层。这是我第一次深入 CNN。损失函数和优化器与上面模型中的相同。
model_deep = Sequential()model_deep.add(Conv2D(filters=16, kernel_size=(5, 5), activation="relu", input_shape=(48,48,3)))model_deep.add(MaxPooling2D(pool_size=(2, 2)))model_deep.add(Dropout(0.25))model_deep.add(Conv2D(filters=32, kernel_size=(5, 5), activation='relu'))model_deep.add(MaxPooling2D(pool_size=(2, 2)))model_deep.add(Dropout(0.25))model_deep.add(Conv2D(filters=64, kernel_size=(5, 5), activation="relu"))model_deep.add(MaxPooling2D(pool_size=(2, 2)))model_deep.add(Dropout(0.25))model_deep.add(Flatten())model_deep.add(Dense(128, activation='relu'))model_deep.add(Dropout(0.5))model_deep.add(Dense(128, activation='relu'))model_deep.add(Dropout(0.5))model_deep.add(Dense(64, activation='relu'))model_deep.add(Dropout(0.5))model_deep.add(Dense(64, activation='relu'))model_deep.add(Dropout(0.5))model_deep.add(Dense(4, activation='sigmoid'))model_deep.summary()model_deep.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])model_deep.fit(images_train, train_labels, epochs=10, validation_data=(images_val, val_labels), batch_size=128)

深度 CNN 模型的训练历史
该模型给出了 88.31%的验证准确度,这与以前的模型相比不是很高,但是查看其损失和准确度图可以看出,训练集和验证集的准确度都在不断提高,而损失在不断降低,这表明该模型比以前的模型好得多。这是 Kaggle 上第一次提交时使用的模型,但它被训练了大约 50 个时代,以使它稍微好一点。该算法在公开测试数据集上的准确率为 91.309%。这大约是排行榜上的第 13 位。
迁移学习
提高整体准确性的下一个方法是使用迁移学习,即利用 keras 库中可用的预训练模型。使用的第一个型号是 resnet50。在使用预训练模型之前,我根据我的数据集修改了输入和输出层。模型是在不包括顶部的情况下使用的,根据我的数据,输入层被更改为 48x48x3 大小。
在输出中,使用了大小为 4 的致密层和 sigmoid 激活函数,因为我们有 4 个目标类。使用的优化器是 SGD,学习率很小,动量为 0.9。这个模型花了很长时间来训练。
img_rows, img_cols, img_channel = 48, 48, 3base_model = keras.applications.ResNet50V2(weights='imagenet', include_top=False, input_shape=(img_rows, img_cols, img_channel))add_model = Sequential()add_model.add(Flatten(input_shape=base_model.output_shape[1:]))add_model.add(Dense(4, activation='sigmoid'))model_ResNet50V2 = Model(inputs=base_model.input, outputs=add_model(base_model.output))model_ResNet50V2.compile(loss='binary_crossentropy', optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),metrics=['accuracy'])model_ResNet50V2.summary()model_ResNet50V2.fit(images_train, train_labels, epochs=10, validation_data=(images_val, val_labels), batch_size=128)

resnet50 的型号摘要
由于该模型中有大量的可训练参数,大约有 2350 万个可训练参数,所以训练花费了很长时间,但最终的性能与我们的第一个基本模型相似,在验证数据集上有大约 86.05%的可训练参数。虽然精度的提高和损耗的降低也很*稳。这个模型没有在公开测试中使用,因为其准确性与我们的第一个模型相似。
VGG16
接下来,我决定使用 VGG16 进行迁移学习,此外还使用了数据扩充和学习速率调度程序。
在数据扩充中,使用了旋转、宽度移动、高度移动、水*翻转。学习率计划在第 10 个纪元后开始降低学习率。
base_model = keras.applications.VGG16(weights='imagenet', include_top=False, input_shape=(img_rows, img_cols, img_channel))add_model = Sequential()add_model.add(Flatten(input_shape=base_model.output_shape[1:]))add_model.add(Dense(4, activation='sigmoid'))modelVGG_raw = Model(inputs=base_model.input, outputs=add_model(base_model.output))modelVGG_raw.compile(loss='binary_crossentropy', optimizer=optimizers.SGD(lr=1e-4, momentum=0.9),metrics=['accuracy'])modelVGG_raw.summary()batch_size = 128epochs = 50 # data augmentationtrain_datagen = ImageDataGenerator(rotation_range=30,width_shift_range=0.1,height_shift_range=0.1,horizontal_flip=True) train_datagen.fit(images_train) #Learning Rate schedulerdef scheduler(epoch): if epoch < 10: return 0.001 else: return 0.001 * tf.math.exp(0.1 * (10 - epoch))callback = tf.keras.callbacks.LearningRateScheduler(scheduler)history = modelVGG_raw.fit_generator( train_datagen.flow(images_train, train_labels, batch_size=batch_size), steps_per_epoch=images_train.shape[0] // batch_size, epochs=epochs, validation_data=(images_val, val_labels), callbacks=[callback] )

VGG16 车型培训总结
该模型给出了迄今为止最好的结果,在验证数据集中具有好得多的准确度,约为 92.50%。它用学习率时间表训练 50 个时期,在第 10 个时期之后,在每个时期开始降低学习率。该模型用于 kaggle 上的公共数据集,在公共测试数据集上给出了 0.92752 的准确率,这与我们在验证集上得到的结果一致。我注意到,在训练这个模型 50 个时期后,验证精度从 0.9075 增加到 0.9250,这表明学习率调度程序确实有助于提高精度。
其他型号
我测试了一些不同的模型,我尝试冻结 VGG16 模型的前几层,只训练其余的层,看看预训练的模型是否有助于提高精度,我尝试在 VGG16 模型中添加我自己的几层,然后测试它。
我还通过对数据集的默认分割和*衡分割进行训练来比较一些模型,但这种差异没有显著影响,我仍然不确定为什么会这样。
集成学习
提高性能的下一步是对迄今为止最好的 3 个模型使用集成学习。机器学习中的集成模型结合了来自多个模型的决策,以提高整体性能。我使用了目前为止我拥有的 3 个最好的模型,并综合了它们的结果
有各种方法可以完成集合,我们可以从每个模型中获取预测模式,并将其用作最终预测,例如,如果 2 个模型预测头发颜色为棕色,1 个模型预测头发颜色为黑色,则最终预测将是棕色。
另一种方法是对每个模型的每个目标类的概率求和,并使用最大概率作为最终预测。例如
模型 1 给出了棕色、黑色、金色和灰色分别为 0.85、0.20、0.50、0.15 的概率,模型 2 给出了目标类别为 0.75、0.35、0.40、0.10 的概率,棕色的总概率将是 0.85+0.75 = 1.6,这将是所有类别的最大值,并且将是最终预测。
在我的验证中,通过对概率求和并选择最大值来设置集合,比使用 mode 的方法给出了更好的准确性,所以我使用了这个方法。我在这个集合方法中使用的 3 个模型是
- VGG16 和我自己的附加层
- 前几层冻结的 VGG16
- VGG16 模型,所有层都经过训练,没有添加新层。
这个集合模型用于 kaggle 公开测试数据,给出了 93.935%的准确率,这使我在 kaggle 公开测试排行榜中排名第一。
Kaggle 私有测试数据
私有测试数据在 12 小时内发布,有 2 次提交尝试。我对我的模型非常有信心,为了进一步改进我的模型,我在*衡数据集中训练了我的 3 个最佳模型,所以我有 2 对模型,一对在默认分割上训练,一对在*衡分割上训练。我对 6 个模型使用了相同的集成技术来对私有测试数据进行预测。我做的第一次提交的准确率只有 62.823%,我的排名在第 18 位左右,这对我来说是一个很大的冲击和现实检查,这个数据集的最高准确率约为 70%。我只有 1 次机会再提交一次,离截止日期还有几个小时,我做了一些修补,从我的整体方法中删除了几个低精度模型,但第二次提交并没有给我一个更好的结果。比赛结束了,我满脸愁容地坐在 62.8%的座位上。我不知道发生了什么,为什么我的模型失败了。
为什么私有测试数据的性能如此之差?
我决定调查为什么我的模型的性能在私人测试数据上下降了这么多。我从私人测试数据中随机绘制了一些图片,这就是结果。

来自私有测试数据的图像
几乎所有的图像都通过旋转得到了增强,背景是黑色的。
现在我确实在我的模型中使用了增强,使用了翻转和旋转,所以我决定看看我的增强与这个私人数据集中的有什么不同

我的模型增强了。
我的增强代码确实旋转了图像,但主要的区别是当它旋转时,它也放大了图像,所以在我旋转的任何图像中都没有黑色背景。我的直觉是,由于私人数据集的每个旋转图像中有许多额外的黑色像素,大多数图像都被预测为黑色头发,这降低了整体准确性。
在我的过程中,我可能还犯了很多其他的错误,因为这是我第一次使用深度学习模型,并且参加 kaggle 比赛,我想我在公共测试中取得了第一名,因为这个比赛仅限于我班上的学生,如果是全球比赛,我的排名会低很多。
如果你对我的方法有任何建议或意见,我很乐意倾听。
如果你想看的话,我所有的代码都可以在 github 上找到。
我是如何从一个想成为 VFX 艺术家的人变成娱乐界的数据科学家的?
原文:https://towardsdatascience.com/how-i-went-from-wanna-be-vfx-artist-to-data-scientist-in-entertainment-da166c679e97?source=collection_archive---------18-----------------------

早期娱乐生活
当我进入印度苏拉特的国家理工学院攻读计算机工程学士学位时,我只是一个不知道自己想做什么的孩子。那是计算机科学蓬勃发展的时期,我听到类似“如果你进入计算机科学,你就万事俱备了”的说法,因此我最终选择了 NIT Surat 的计算机工程,而不是 IIT BHU 瓦拉纳西的采矿工程(因为我妈妈不想让我在偏远的矿井度过一生:p)。我是看 WWE 长大的(我知道现在这是假的,罗曼·雷恩斯是我的新宠:p),我喜欢它在我单调的学习日程中每隔一天用那些超级明星摔跤手和烟火娱乐我的方式。在我的学生时代,我梦想为一家公司工作,在人们无聊的生活中给他们带来欢乐和微笑。
在第一学期,我加入了 NIT Surat 的电影制作俱乐部和其他技术俱乐部,在那里我学会了编辑和添加 VFX 到那些编辑过的镜头中(我甚至曾经制作了一部恐怖电影,那是一场灾难)。然后我转而精通软件,如 Adobe Photoshop、Illustrator、After Effects、Premiere Pro 和 Sony Vegas。我知道我已经开始了一件当时没有人在做的事情(大学里的 VFX 革命!开个玩笑),对于所有梦想被谷歌、脸书和其他科技公司聘用的人来说,我听起来像个疯子。我正考虑在某个工作室找一份 VFX 艺术家的工作,毕竟我还只是大学一年级的学生。我仍然记得,当我们被要求介绍我们想要的公司(Prime Focus 是一家印度 VFX 工作室,是奥斯卡获奖影片《地心引力》(Gravity)和《第一人》(First Man)的幕后推手)时,我在传播课上第一次介绍了“ Prime Focus Studios ”。我还记得教授告诉我“好家伙!,你对这个行业真的很有激情!”
我继续为大学庆典制作预告片、预告片和图片(实际上我有自己的脸书页面和行为简介)。伙计。我真的很喜欢那份工作,以至于我在第三学期的学业上受到了严重的影响(这并不好笑!).那时,我已经涉足了 web 界面的 UI/UX 设计,我也成为了一名不错的前端开发人员。但很快,我意识到我将不得不从大学辍学去学习 VFX 课程(尽管☹从来没有这个选项),或者把这种附带的激情放在一边,因为我害怕在没有任何正式培训的情况下,由于这个行业的低前景而扼杀我的职业生涯,我决定就这样了。我受够了。
走进数据科学的世界
我学过计算机工程,所以我决定学习一些新的编程知识,我开始学习 Python。该死的。我爱上了这种语言的语法。这么直观!如此流畅!好性感!好吧!现在怎么办?用 Python 可以做什么?在那里我读到了人工智能,我的大便变得疯狂!我可以教计算机如何像人类一样行动?WTF!很快,我开始选修一些统计学和机器学习方面的 MOOCs 课程(尽管那时安德鲁·吴的课程非常棒,但我最终选择了 T2 的亚塞尔·阿布·穆斯塔法的《从数据中学习》( T3)——数学很重),这立刻激发了我的直觉,这是我除了 VFX 之外还想做的事情。这狗屎能改变人的一生!尽管又一次做了一些很少有人做的事情。我在大学期间学到了很多东西,指导了很多人,直到大学三年级时,我决定攻读数据科学硕士学位,并获得21 世纪最性感的工作’数据科学家。出于对自己决定的坚定,我在大三的时候提交了 GRE 和 TOEFL。2017 年夏天,我结束了在印度班加卢鲁的印度人类住区研究所的数据科学实习生生涯,在那里我为 Landsat 8 卫星构建了自动土地利用土地覆盖影像分类系统,该系统后来被用于联合国开发计划署在印度规划 7 个可持续城市的项目。
在我大学的最后一年,我得到了 Dassault Systèmes 的一份工作邀请(我认为生活再次给了我一个机会,因为它是一些虚拟现实和三维设计软件如 CATIA 和 Solidworks 的领先公司),作为一名研发软件工程师,但我喜欢“软件工程师!啊哈!我不能”。我决定接受挑战,继续我的硕士计划,最终接受了锡拉丘兹大学应用数据科学硕士的邀请。
开始我正式的数据科学教育
因为另一边的草总是更绿,我过去一直认为美国会有很多崭露头角的数据科学家的机会,但这并不十分正确。从第一天起,我就和詹妮弗·斯特罗姆-格里教授一起工作,在锡拉丘兹大学计算和数据科学中心担任研究助理。我写了一篇短文,告诉你如何从第一学期就直接获得研究助教奖学金,你可以在我的博客上随意查看:用研究助教奖学金快速进入微软。我开始从事照明项目,该项目是关于在竞选期间利用机器学习来展现社交媒体上的模式,由著名的骑士基金会资助。我通过开发数据管道、制作 ML 模型和数据库转换对项目做出了贡献。锡拉丘兹大学信息研究学院的旅程进行得相当顺利。我很早就开始了在美国寻找数据科学实习机会的过程。它有起有落,但我在财富 500 强公司获得了两次数据科学实习机会(博客:数据科学实习机会:财富 500 强的故事)
寻找数据科学实习的简单提示
- 尽早开始申请!
- 保持对各种职位的选择,因为目前行业中数据工程师、ML 工程师或数据科学家有很多重叠。
- 保持你的编码(最好是 Python 和 SQL)技能。练习!
- 反复阅读你的简历和求职信,直到你开始接到电话。
- 保持你的求职信简短(比起故事格式,我更喜欢注重技能的格式)
- 总是在面试结束时推销自己(为什么是你?:以积极的语气结束)
- 把拒绝当作一个信号,让你更加努力工作,获得一份完美的工作
需要具备的关键技能
- 好奇心
- Python、数据结构和 SQL
- 机器学习(模型背后的一些数学)和统计
- Web 应用程序和 API 开发(Flask 非常适合部署模型)
- 云技术(GCP、AWS 或 Azure)——可选但加分
2019 年夏天
我完全同意这是我度过的最好的一个夏天,因为当我在美国最受关注的电视网 CBS(现在是 ViacomCBS )的数字部门 CBS Interactive 获得一份数据工程实习时,生活实际上又回到了原点。我怎么会错过这个机会呢?当我内心的感觉和大脑的思考相遇。我怎么会?我必须全力以赴。实习的第一天,当我走进佛罗里达州劳德代尔堡的办公室时。我知道那一刻:就是这样!电视屏幕电视屏幕遍布办公室,中央是 CBS 体育总部演播室(我过去只是梦到过这样的事情)。嗯,我当时致力于解决流媒体行业的一些最关键的问题。我为 CBS 网站建立了一个异常检测系统,其准确性超过了所有以前和现在使用的内部模型(这是一个初始的小型任务)。我参与的主要项目是构建最先进的订阅滥用(密码共享:耶!我来救你们了!)使用机器学习(或深度学习)的能力对 CBS All Access 的图形进行检测的系统。除此之外,我是赢得 2019 年全公司黑客日的“那些家伙”(这是我的团队名称)之一。

佛罗里达州劳德代尔堡的 CBS 体育总部演播室
在我实习的最后一周,我得到了毕业后重新加入团队的口头邀请,我怎么能不高兴呢!?我不知所措!我觉得我注定要来到这里,虽然我不敢相信自己,因为这一切就像一部电影。
人才差距

亚马逊数据科学家职位描述
现在所有的全职职位都要求你有至少 2 年的工作经验或博士学位,这对于刚从大学毕业的人(学士或硕士)来说是不可行的。学校教授的内容和行业对数据科学家的要求之间也存在巨大的人才差距。原因就在于此,目前大多数数据科学家都处于职业生涯中期。我的建议是保持范围开放:你甚至可以从一些职位开始,如软件工程师、数据工程师、数据分析师、商业智能工程师或顾问,最终与有经验的数据科学家交换头衔或获得博士学位。此外,数据科学家(分析)有几个新的毕业生空缺,如果你想更多地关注分析和商业部分,你可以瞄准这些职位。但如果你想做机器学习,你必须去找机器学习工程师、大数据工程师或数据科学家(ML)。
这是我认为你应该在寻找实习机会和实习本身期间付出大量努力的原因之一,这是保证你在没有任何行业经验的情况下直接从大学毕业后获得数据科学家职位的好方法。
另一种方法是超级努力地进行 ML 研究,在著名的会议上发表研究论文,建立关系网并获得数据科学方面的面试机会。
高潮
在我硕士的第二年,经过一些等待。我终于接受了 ViacomCBS 的数字部门 CBS Interactive 的数据科学家职位。我敢肯定,最*两大巨头维亚康姆和哥伦比亚广播公司的合并催生了大量数据科学中需要解决的有趣问题。我太激动了,以至于我不得不用文字来写我的电影故事。这就是我如何从一个想成为 VFX 艺术家的人变成了娱乐界的数据科学家!
在 gmail dot com 的[我的名字][我的名字]上提问,或者在的 LinkedIn 上联系。
我如何在 6 个月内从零编码技能成为数据科学家
原文:https://towardsdatascience.com/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3?source=collection_archive---------0-----------------------
我用来自学数据科学的 4 个工具没有花一美元

开启我的数据科学
我刚刚结束了 8 年的学习和努力工作,没有任何计划。你可能想知道为什么有人会这样做。我的老板粉碎了我的精神,知道我需要做出改变。
男朋友建议成为一名数据科学家。我说“你疯了!”我对编程一无所知。他肯定高估了我的能力。冒名顶替综合症又发作了。
大约两个星期后,我的朋友安娜提出了完全相同的建议,我想了想,开始考虑这个想法。为什么不呢?我决定再次成为一名初学者,将自己重塑为一名数据科学家。
我想按照自己的进度学习,所以我决定参加在线课程。我想,有了神经科学博士学位,我可能有足够的正式培训来获得一份数据科学的工作。我只是需要实用的技能。
这个故事将描述我参加的 4 门不同的课程,以及它们如何让我在硅谷的一家医疗保健初创公司获得一份数据科学工作。
当时,我接触到的大多数在线课程都是免费的。所以我挑战自己,在不花钱的情况下获得我需要的技能。我能说什么呢,我很吝啬😜

https://imgs.xkcd.com/comics/correlation.png
基本技能
当我辞去 UCSF 的博士后工作时,我没有任何编程经验。我在整个研究中使用了统计学,但只是在小范围内。我之前分析的所有数据集都是我自己在实验室中生成的。因此,观察到的数量非常少。我需要学习编码和分析更大规模的数据。
开始编码
当我决定成为一名数据科学家时,我想学的第一件事是如何编写计算机代码。因为我从来没有编码过,这是一个完全未知的领域。我发现如果我真的讨厌写代码,那么数据科学就不太适合我。所以这似乎是一个很好的开始。
我很幸运,我的搭档本在许多技术领域工作过,能够给我指出正确的方向。他建议说 Python 可能最适合我。Python 在数据分析方面表现出色,用途广泛,能够很好地处理大型数据集,所以这就是我开始的地方。
学习编码
1.代码集
为了开始学习编码,我使用了代码学院。我从 Python 入门开始,但我不确定我在 2014 年完成的课程是否仍然存在。如果我现在使用 Codecademy 开始学习 python,我可能会选择用 Python 分析数据课程。
我发现 Codecademy 是一个很好的起点。对我来说,主要的优势是能够在我的浏览器中编写代码。在我的电脑上正确安装编程环境仍然是我的致命弱点。所以我很高兴一开始就避开它。令人欣慰的是,如果我的代码不能工作,那是因为语法,而不是因为环境设置错误。
我也喜欢你用 Codecademy 一次做几分钟的工作。如果我有一些空闲时间,我会登录并做一些问题,因为它都在那里等着我。这种循序渐进的方式意味着我不会太害怕陷入其中。
在我完成这门课程的时候,只有少数几门 Codecademy 课程提供,而且这门是免费的。我对网上免费课程的质量感到非常惊讶。
一旦我学会了 Python 的基础,我需要开始提升我的统计经验,并学习在更大范围内分析数据。
学习数据分析
2.约翰霍普金斯大学的 Coursera 数据科学专业
第二,我获得了约翰霍普金斯大学的 Coursera 数据科学专业学位。当时,你可以免费做一个荣誉代码证书版本,只有当你想要验证证书时才需要付费。
对我来说,经过验证的证书似乎并不重要。相反,我需要能够在技术面试中展示课程中教授的技能。所以我选择了专业化的免费版本。
对我来说,一个缺点是这一系列课程是用 R 语言讲授的,R 是一种优秀的统计分析编程语言,受到学术界的青睐。然而,我想学习数据科学的 Python。我认为 Python 在我想工作的初创公司中会更有用。
我研究了一些 Python 中的数据分析课程,但它们似乎假设了相当多的知识,而这些知识是我还不具备的。我相信这些课程中的大部分是针对那些想要过渡到数据科学的软件工程师的。所以他们假设您有扎实的编程技能,并且已经知道如何设置 python 环境。
我喜欢 Coursera 数据科学专业化的主要方面是它从一开始就开始了。在第一个课程中,有关于如何安装 R and R 工作室的逐步说明。这使得在知道不会有任何技术问题的情况下处理随后的课程变得容易。
约翰霍普金斯数据科学专业适合我的另一个方面是,它是由公共卫生部门教授的。我在健康科学领域的专业知识让我很容易就能理解他们列举的例子。他们有使用空气质量对哮喘的影响和其他与医疗保健相关的数据集的例子。因此,我可以专注于课程内容,而不是找出数据分析的场景。
这一系列课程让我对数据科学工作的主要方面有了基本的了解。它涉及到 R 编程、基本数据清理、分析、回归和机器学习。我真的很喜欢学习编码以及如何使用代码来分析数据,这鼓励了我继续学习。
信息访谈
在我接受再培训的这个阶段,我开始询问我的网络中的人,他们是否可以把我介绍给在旧金山从学术界转向数据科学的其他人。一些人能够联系到我,所以我尽可能多地安排了信息面试。
一个朋友向我介绍了一位来自 Modcloth 的数据科学家,他和我走了一条相似的路。她曾经是一名神经科学家,我发现她的建议特别有帮助。
她的主要建议是学习 SQL。
学习查询数据库
3.DB5 SQL 斯坦福在线
约翰霍普金斯大学的 Coursera 数据科学专业根本没有涉及 SQL。她说她大部分的日常工作是查询数据库。她必须为业务开发和营销团队提供见解。她只有一小部分时间花在了统计分析和机器学习上。
我接受了她的建议,在斯坦福大学网上开设了一门自定进度的 SQL 课程。在我学过的所有课程中,这是我最喜欢的。我很喜欢,因为老师很优秀,用简单的例子解释概念。她还用多种不同的方式解释了每个概念。
此后,我向许多人推荐了这门课程,因为我认为良好的 SQL 基础对于任何数据科学家都是必不可少的。我接触过的数据科学课程并不包括如何使用 SQL 从数据库中获取数据。我认为这是一个巨大的疏忽。大多数课程都准备了 CSV 格式的数据供学生使用,但根据我的经验,在行业数据科学工作中很少出现这种情况。
一旦我完成了斯坦福 SQL 课程,我就开始申请数据科学的职位。那时,我已经回到澳大利亚,开始用 Skype 采访旧金山湾区的初创公司。面试时,我想继续发展我的技能。
固化概念
4.edX 数据分析基础
然后,我参加了使用 R by edX 的数据分析基础课程。这对于修改我在 Coursera 课程中学到的很多概念非常有帮助。
我坚信从不同的老师那里学习概念可以提供新的见解。第二次学习统计和机器学习概念要容易得多。我觉得通过这门课我有了更深的理解。
当我结束课程时,我成功地参加了旧金山医疗保健初创公司 Amino 的一次面试,并获得了工作签证,搬到了美国。
获得数据科学工作
我认为我在最后的面试中是成功的,因为我有过得去的编码技能和不错的统计学理解,但更重要的是我有医疗保健领域的知识、实验设计和科学方法的专业知识。
在我看来,正是这些额外的方面让我的申请脱颖而出,并让这家初创公司给了我一次机会。我资历很浅,需要更多的工作培训。我认为我所学的所有课程足以让招聘团队考虑我,我在医疗保健领域的经验让我过关了。
因此,如果你想将职业道路转向数据科学,我建议你寻找一家你现有领域知识有价值的公司。
我希望我学到了什么
我希望在开始新的数据科学工作之前,我已经填补了知识上的主要空白,那就是从命令行使用 git。我以前从未使用过终端或命令行,也不知道如何使用 git 将我的代码提交给公司的 Github 库。
几个工程师花了很长时间才让我跟上进度。我希望在开始之前至少知道如何使用它,这样我就不会浪费他们宝贵的时间。我的同事们很棒,他们似乎并不介意教我,但在最初的几天里,我确实觉得有点累赘。
我最终赶上并发现艰难地学习代码命令行非常有用。
如果你正在考虑走类似的道路进入数据科学,我会鼓励你去做!对我来说,这绝对是正确的选择。不同的人以不同的方式学习,但如果你有学习和完成你开始的自律,通过在线课程自学数据科学肯定是可行的。如果这是你的目标,我祝你好运,如果可以的话,我很乐意回答任何问题。
[## 通过我的推荐链接加入 Medium-Kate Marie Lewis
想了解更多关于数据科学的知识吗?今天就成为会员吧&不要错过凯特的帖子,直接交会员费…
medium.com](https://medium.com/@katemarielewis/membership)
如果你想了解更多关于我为什么转行的信息:
[## 让我获得第一份数据科学工作的面试策略
我是如何展示自己得到这份工作的
towardsdatascience.com](/interview-strategy-that-landed-me-my-first-data-science-job-bdd5e77bfb49) [## 愤怒退出癌症研究
为什么我从神经科学家变成了数据科学家
towardsdatascience.com](/rage-quitting-cancer-research-5e79cb04801)
我是如何用我独特的“非正式方法”赢得国家级 ML 比赛的
原文:https://towardsdatascience.com/how-i-won-a-national-level-ml-competition-with-my-unique-informal-approach-e86fd95532fd?source=collection_archive---------14-----------------------
深度学习
像数据科学黑客一样思考——你不需要遵守规则就能获胜

来源:图片由作者提供(使用 Canva 制作)
L 去年(2019 年),一家公司 ( 不能透露他们的名字! ) ,进行了一场国家级机器学习竞赛用于招聘。比赛本身是在hackere earth举办的。
页面上写着:
【我们在】寻找有热情的具有机器学习实践技能和分析技能的 ML 开发人员加入他们在海德拉巴的动态团队。
资格标准:
工作经验: 0 至 2 年
技能:机器学习和分析技能
由于对机器学习和深度学习领域的浓厚兴趣,我对这场为期 13 天的比赛感到非常兴奋。_!
所以,让我们深入细节,看看我是如何解决这个问题并赢得比赛的。
问题——“任务”
来自挑战页面的片段:
mcq 是一种广泛使用的问题格式,用于对候选人的领域知识进行总体评估。大多数 mcq 都是以段落为基础的问题。
一个段落或代码片段构成了此类问题的基础。这些问题是根据三个或四个选项创建的,其中一个选项是正确答案。其余的选项被称为干扰项,这意味着这些选项最接*正确答案,但并不正确。
为您提供了一个包含问题、答案和干扰项的训练数据集,用于构建和训练 NLP 模型。测试数据集包含问题和答案。你需要使用你的 NLP 模型为测试数据中提供的每个问答组合创建最多三个干扰项。
类型:自然语言
问题类型:上下文语义相似度,自动生成基于文本的答案
起初,这个问题似乎很简单。输入清晰,输出清晰,我所要做的就是建立模型。对吗?
嗯嗯嗯……不
以下是训练数据集的结构:

来源:图片由作者提供(使用 Canva 制作)
以及评估数据集的结构:

来源:图片由作者提供(使用 Canva 制作)
如你所见,在开始之前,我必须做大量的预处理和重组工作。
根据问题的公式化来重构给定的训练和测试数据是很重要的。
由于我能想到的每种方法都需要不同的数据集公式,所以我有多种方法可以选择?
你可以在这里 找到 问题解决方案的完整源代码。
所以让我们跳到有趣的部分。我们走吧。
数据预处理——一切从这里开始
俗话说,
垃圾进,垃圾出
在像这样的深度学习和机器学习任务中,这一点再正确不过了。对于 NLP 领域, NLTK (自然语言工具包)是我选择的武器。
我用它来删除不需要的符号、标点符号和停用词,以便进行分析和训练。此外,可以使用 NLTK 完成标记化、词性标注、计算编辑距离和 Jaccard 相似性计算。
在所有的清理之后,数据预处理的下一步是为给定的问题、答案和干扰项创建向量。为此,我不得不选择嵌入这个词。
单词嵌入困境
传统上,在文本生成任务中,人们倾向于对较小的数据集使用一键向量。但是对于中大型数据集,使用固定维数的嵌入来节省内存和有效训练网络是绝对必要的。
我使用 GloVe(全局向量)和 Word2Vec,两者都是dimension _ size = 300, 来转换我的令牌向量,它将通过神经架构中的嵌入层到嵌入向量。
这些向量也将捕捉句子和上下文的语义,不像一个热点向量。

资料来源:developers.google.com(使用 Canva 重新设计)
这里唯一的问题是,正确计算损失和更新梯度。
这可以通过使用 稀疏分类交叉熵 代替分类交叉熵作为损失函数,并使用 稀疏分类准确度 作为度量函数来实现。
酸洗和保存嵌入物,以加速该过程
因为每次程序运行时创建完整的单词嵌入矩阵非常昂贵,所以我必须将单词集包含在训练和测试数据集中,并开发一个嵌入矩阵,一劳永逸。
在使用 pickle 创建了 embedding_matrix 文件之后,我可以检查它在本地是否存在,并在相对较短的时间内将其加载到内存中。
因此,加快了程序。
生成序列
在输入我们的神经网络之前,我们需要数据以序列的形式存在。
考虑一个函数 f 。为了产生输出 y ,需要 n 个输入。让输入用 x 表示。所以数学上,我们可以这样写
y = f ( x1,x2,x3,.。。,xn)
这里,[x1,x2,x3,…,xn]是长度为 n 的输入序列,y 是长度为 1 的输出序列。而 f 是神经网络确定的函数。
在我的 python 序列实现中,这是使用 Numpy 数组实现的。Numpy 是一个强大的数学运算工具包。Numpy 数组直接进入神经网络 。
这里,我使用的序列长度是 n = 5。
简而言之,一个由 5 个单词组成的序列,当输入到网络中时,预测第 6 个单词。
我的正式方法
在理解了给定问题的独特性后,我尝试了几种不同的方法来寻找最高质量的干扰物。我对完美干扰物的定义是,
干扰词:与答案/答案高度相似但不完全相同的问题/短语/词干的延续句。

来源:图片由作者提供(使用 Canva 制作)
我最喜欢的五种方法是:
方法-1:
思路:使用一个 2 层 RNN-LSTM 网络 与 word2vec 嵌入 在给定数据集(未预训练)上使用固定长度的令牌向量进行训练,然后从它们中生成序列(固定长度),以馈入神经网络。
Embedding Layer >> LSTM >> Dropout >> LSTM >> Dropout >> Dense
缺陷:这种方法的唯一缺陷是, word2vec 嵌入向量由于其半结构化的性质而无法在给定的数据集上进行训练 。主成分分析(PCA)和 2D 散点图绘图显示了语料库中不相关/所有单词的聚类形成。
因此,我转向了方法 2。
精度:在评估标准的 12%到 17%之间
注:问题的评价标准基于余弦相似度。所以这个 12-17%的准确度并不算太差。
方法-2 :
思路:使用一个 2 层 RNN-LSTM 网络 与 手套预训练嵌入向量 。使用可变长度令牌向量来生成较小的固定长度序列,并将其馈送给网络。
Embedding Layer >> LSTM >> Dropout >> LSTM >> Dropout >> Dense
缺陷:这种方法更好,但是当 陷入局部极小值 并且在获取上下文时更慢时遇到了障碍。
因此,我转向了方法-3。
准确度:在评估标准的 16%到 20%之间
方法-3 :
思路:使用一个 2 层双向 LSTM 层 与 手套预训练嵌入向量 。使用可变长度令牌向量来生成较小的固定长度序列,并将其馈送给网络。
Embedding Layer >> Bi-LSTM >> Dropout >> Bi-LSTM >> Dropout >> Dense
缺陷:这种方法表现最好,但是对于预测来说,最佳温度值很难找到。
准确度:高于评估标准的 17%
方法-4 :
思路:使用 逻辑回归和随机森林分类器(LR-RF) 级联模型对干扰项池中最高质量的干扰项进行排序。从训练数据集中产生一个干扰物池。
这种方法的灵感来自于陈亮、肖扬、Neisarg Dave、Drew Wham、Bart Pursel 和 C. Lee Giles 的研究论文“利用学习排序为多项选择题生成干扰物”。
准确率:在 15%到 18%之间的评价标准
接*-5 :
思路:使用 编译码器 与 Luong 注意, 以前用于神经机器翻译(NMT),用于从单独输入的答案键中生成干扰物。
这种方法受到了谷歌大脑团队等人的论文“注意力是你所需要的一切】的启发。
Encoder(Embedding >> LSTM)
LuongAttention
Decoder(Embedding Layer >> LSTM >> LuongAttention)
方法 5 的神经架构由于其非顺序的性质,在这里更难描述。虽然,你可以在 model.py 文件中看到,其中编码器、解码器、LuongAttention 是作为类实现的。它们中的每一个都包含了 call( ) 函数中的层,在每个类中定义。
注意:
化解渐变爆炸
这是我搬到 LSTM 和双向 LSTM 网络时遇到的一个小问题。为了成功地 防止梯度爆炸, 我将批量大小减少了一半, 128 ,将学习速率降低到 0.0001 ,使用剪辑归一化= 1.0,并在通过 Adam 优化器更新梯度值时执行剪辑= 0.5 。
我根据从数据集中收集的见解进行了几次非正式试验。
上传的结果是得分最高的方法的组合(3、4 和 5)。
采用高度模块化的程序结构
规划至关重要。在写一行代码之前,你必须从头到尾制定策略。
在这次竞赛中,我遵循了一种介于面向对象和过程之间的中间方法。我试图以类似于 API 的形式开发整个软件,以增加它们的可重用性。
规划开发在开始时会花费更多的时间,但从长远来看是值得的。
给我六个小时去砍树,我会用前四个小时去磨斧子
由于这种模块化的方法,我的工作流程快了很多,我可以尝试更多的东西和方法来解决这个问题,因为我不必从头再来开发某些东西。
注:本设计方案仅在方案一、方案二、方案三中实施。对于方法 4 和 5,由于缺少时间和快速开发的需要,选择了更紧凑的设计方案。
细节
我的软件由四个主文件组成,加上一些用于重组和预处理数据以及建立语料库的小脚本。
- 层次结构顶部的一个文件,它导入 API 并根据需要使用它们。
- 包含工作流流程(如培训、测试、比较和数据加载任务)的高级抽象的文件。(API)
- 包含与数据操作、文件创建和删除相关的任务的文件,例如数据预处理、嵌入矩阵创建、用于进行不同预测的采样以及许多其他帮助功能。
- 一个包含模型的文件,所有神奇的事情都发生在这里。该文件包含 Keras 中的神经网络架构实现和单个函数形式的所有超参数。

来源:图片由作者提供(使用 Canva 制作)
在上述所有文件中, API 文件是集成所有组件的文件。
尽管如此,所有的文件都被设计成可以彼此独立使用,非常容易。
同样,如果你想要每个文件用法的更详细的解释,去我的库。在那里你还可以找到整个项目的蓝图(针对每一种方法)。
我在试着删掉这里无聊的部分!
注意:我使用了支持 GPU 的设备,因为在只有 CPU 的设备上训练和预测会花费太长时间。为了利用 GPU,请使用 Nvidia 为 nVidia 显卡提供的 CUDA 软件。
非正式方法——制胜技巧
在我看来——无意冒犯这个挑战的创造者——这个问题的评估标准不太适合这个特殊的任务。 那是我利用而不是正面攻击的问题。
自己看评价标准…
评定标准
对于每个问题-答案组合,干扰项被转换成单词的反向量,并且计算预测值和实际值之间的余弦相似度:
得分= 100 *均值([余弦 _ 相似度(文本 _ 至 _ 向量(实际值),文本 _ 至 _ 向量(预测值))])
因为计数向量的余弦相似度不包含句子试图传达的语义思想,所以更好的方法是使用手套向量或任何其他单词嵌入。
一个能真正捕捉语义含义然后计算余弦相似度之类的嵌入。
漏洞
在这个过程中,我发现了一些数学漏洞,并利用它们来测试我的假设(正如我前面所说,我从数据库中收集了见解)。
让我告诉你赢得比赛的(令人捧腹的)结果:
- 32.13%(整场比赛得分准确率最高) 在抄同一个正确答案加上出现频率最高的前 6 个词——“the,of,to,a,is,in”。你能相信吗?我用这个赢了比赛!
- 28.49% 正确率仅在复制与干扰物相同的正确答案 3 次上。
- 20.01% 准确率通过打印语料库中前 8 个最频繁出现的单词,3 次作为干扰项。
- 16.63% 准确率通过打印最频繁的单词,在一个字符串中‘the’出现 6 次,3 次作为干扰项。
这些方法清楚地描述了这样一个事实,即上述干扰物绝对没有机会干扰正在进行 MCQ 测试的人。
但尽管如此,根据所谓的“评估标准”,它们具有更高的准确度分数。然而,更有可能使人困惑的选项在评估量表上得分较低。
简单来说,
对于像“苹果是什么颜色的?”,一串【The The The The】比【苹果的颜色是蓝色】,根据评价量表更让人分心/信服。
总之, 评价标准在这一点上失去了它的可信性。
一个不太成功的非正式方法…
“马尔可夫链句子生成”技术也给出了相当好的结果。但不幸的是,没有得到足够高的分数来作为正式的方法。它所做的出色工作值得肯定和进一步发展。所以值得一提。
本办法的代码也包含在 回购 中。
我得到那份工作了吗?—后果
没有 。
虽然我以 32.13%的最高准确率赢得了比赛,但在全国层面上,公司告诉我,我 没有得到这份工作的【经验】 (我是大一新生,2020 及格)。
所以我在这里,写下我的经历,比赛的经历。
我希望你也能从这个故事中学到一些东西。
结束语
根据评估标准,我的“非正式”方法做得最好,然而,在问题的真实世界应用中,我的正式方法(3、4 和 5)共同赢得了比赛。
如前所述,评价标准偏向词频。它无法正确计算上下文相似性,因此,我在方法-(1,2,3 和 5)中的深度学习模型(在学习方面是可扩展的)仍未确定。
虽然,在我自己阅读了许多生成的干扰物后,我得出结论,结果是合格的。
总而言之,我非常享受这个挑战,并且在这个过程中学到了很多新东西。我将期待未来一些更具挑战性的任务。
感谢阅读&祝你有美好的一天!
如果你喜欢阅读这些故事,那么我相信你会喜欢成为一名中等付费会员。每月只需 5 美元,你就可以无限制地接触成千上万的故事和作家。你可以通过 注册使用此链接 ,来支持我,我将赚取一点佣金,这将帮助我成长并出版更多像这样的故事。
您可能喜欢的其他文章—
[## 中等 API —文档
中型 API 入门
medium.com](https://medium.com/geekculture/medium-api-documentation-90a01549d8db) [## 值得了解的 10 个改变游戏规则的人工智能突破
过去几十年中引人入胜的想法和概念
medium.com](https://medium.com/towards-artificial-intelligence/10-game-changing-ai-breakthroughs-worth-knowing-about-b2076afc4930) [## 为什么做一个 ML 研究员或者开发者超级难?
这一认识彻底改变了我的生活
medium.com](https://medium.com/towards-artificial-intelligence/why-its-super-hard-to-be-an-ml-researcher-or-developer-67fa62fc1971) [## 音乐数学 Python 语言]
让我们用 Numpy 演奏一些“旋律”
towardsdatascience.com](/mathematics-of-music-in-python-b7d838c84f72)
