TowardsDataScience-博客中文翻译-2019-一-

龙哥盟 / 2024-10-14 / 原文

TowardsDataScience 博客中文翻译 2019(一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

TDS2019

来源:{url}

1.5T 担心的理由

原文:https://towardsdatascience.com/1-5t-reasons-to-be-worried-14dac3c280aa?source=collection_archive---------27-----------------------

…为什么 1.5 万亿美元只是学生贷款问题的开始

学生贷款借款人的平均债务超过 3 万美元。也许这代表了你的情况,也许没有。无论如何,学生债务的影响触及到每个人,因为这些贷款的影响可能意味着每个纳税的美国人欠下 4000 多美元,并对年度增长构成重大阻力。

额外的 350 美元学生贷款——大约是一个普通借款人的还款额——是通过外出就餐或在当地购物注入当地经济的更少的钱;支持旅游驱动型地区的是更少的旅行;为退休存的钱少了。

教育是一项投资,随着时间的推移会有回报——这一点已经得到了充分的研究和证明。但是,它对每个人的回报并不一样,考虑到对借款人精神和财务的不利影响,它的价值是有限的。考虑这些事实:

  • 如今,每 1 美元的政府贷款中,至少有~ 0.15 美元不太可能得到偿还
  • 普通借款人可以免费在 T2 生活两年,用这些钱来偿还债务
  • 经济每月损失了 150 亿美元的支出
  • 面对经济复苏和繁荣,问题变得越来越严重

我们今天在哪里?

联邦贷款的总未偿余额(包括本金和利息)在短短十年多的时间里增加了近三倍,这是由直接贷款的指数增长和联邦家庭教育贷款的适度下降(FFEL)推动的

…随着接受者的人数趋于稳定。合乎逻辑的结论?每个唯一借款人的平均余额正在增加:

让我们用几种不同的方式来思考这些数字的含义。对于持有 2018 年学生债务平均数额的人来说,这个数额代表:

  • 一居室公寓 24 个月的租金,基于美国的平均租金(~1405 美元/月)
  • 购买超过 12 年半的食物,基于每人每年在食物上的平均花费(~ 2641 美元/年)
  • 15%的房屋首付,基于美国房屋价值中位数(~ 226,300 美元)
  • 退休储蓄的机会成本超过 80,000 美元,假设 10 年内的月供以 5%的回报率进行投资,那么该金额将增长 20 年,直到退休

越来越糟了

不仅数额在增长,借款人的还款能力也在下降。当某人短期内无法支付时,金额不仅不会消失,反而会增加利息。

而且,这发生在我们历史上第二长(118 个多月)的经济扩张期。在经济衰退期间,这些债务会发生什么?

自 2013 年第三季度以来,未偿还直接贷款增长了 102%;违约直接贷款增长超过 225%

政府在未来几年将面临数千亿美元的损失,这反过来又让纳税人面临数千亿美元的损失。

如果我们假设大约有 1 . 3 亿纳税人,那么今天每个纳税人的欠款超过 1700 美元,这是一个保守的假设——除了未来新发放贷款的违约之外,目前“信誉良好”的一些贷款肯定会转变为违约贷款。

觉得这听起来不算过分?考虑一下这个:

  • 中位储蓄账户 少于 5000 美元
  • 80%的美国人报告靠薪水生活
  • 消费者支出约占美国经济的 70% ,因此为了国家的经济健康,支出不能放缓。

不仅大多数人负担不起额外的 1700 美元以上的税收,而且经济也负担不起。

我们是怎么来到这里的?

这场危机正在升级的两个原因是,大学越来越贵,学位的价值也在上升。

Shades of blue = College prices indexed

根据 2000 年的指数,公立学校的大学费用已经增长到 2.218 英镑;CPI 已经增长到 1.376;收入中值为 1.013 英镑。

整个“我用暑期兼职付了大学学费”的轶事不再管用了。

与此同时,大学学历和高中学历之间的差异也从未如此之大:

人们无法承受拿不到学位的代价,同时也无法承受学位本身的代价。

债务分配

债务分配不公平。根据你所在的州、专业和种族的不同,债务水平和支付能力也不同。

下面的地图根据平均工资和平均债务负担之间的差异给各州(不包括北达科他州)着色。这个数字代表平均债务。因此,举例来说,虽然加州的债务相对低于俄勒冈州,但俄勒冈州人的支付能力高于平均工资。

专业不同,预期收入也不同。想要高薪专业?很明显,选择工程:

对艺术或非营利组织充满热情,想要“高意义”(有意义)的工作?虽然没有报酬,但你还是要为学位付钱:

尽管每个专业的期望工资不同,但大学对每个学生收取的费用是一样的。这公平吗?不同专业是否应该有不同的借款限额上限?

在种族问题上,《华尔街日报》最近做了一项深度分析,研究学生债务如何对传统黑人大学的毕业生产生比其他人更大的影响:

[## 学生债务危机对历史上的黑人大学打击最大

长期以来,传统的非裔美国人学校是通往财务安全的必经之路,但现在,这些学校培养出的毕业生却面临着…

www.wsj.com](https://www.wsj.com/articles/the-student-debt-crisis-hits-hardest-at-historically-black-colleges-11555511327?mod=article_inline&mod=hp_lead_pos9)

下一步是什么?

对于每一美元的学生贷款,大约有 15 美分违约;一家银行典型的拖欠率是 1.57 分。太多的钱被发放出去,而不考虑人们是否能够偿还,我们都被套牢了。

以下是基于历史趋势和衰退对违约率的影响,对未来 5 年联邦贷款违约的基本情况、上行情况和下行情况的预测:

Bars = Forecasted total federal loan volume; Lines = Estimated loan defaults and forebearance

我估计,如果衰退环境即将来临,学生贷款会走上上次衰退期间消费贷款的老路,那么改善的空间很小,而下行风险很大。

你怎么看?

学生贷款是个问题吗?的解决方案是消灭所有学生债务重新开始吗?促进收入分享协议?

我认为,大学应该承担更多的责任,培养出符合需求的技能和毕业生,让他们能够就业,为当今经济所需的各种领域做好准备。

由于几乎所有的还款风险都由政府和私人贷款机构承担——没有对表现非常差的学生的惩罚——激励措施略有偏差。贷款发放后,这所大学就完整了。如果贷款部分以毕业后 6 个月就业为条件呢?全额偿还贷款?

现状不能继续,否则我们应该期待同样的结果。同样的结果将意味着更多的政府风险、持续的高违约率,以及用新的或更高的税收来弥补这些损失的负担。

有何反馈或意见?我很想收到你的来信!请随时在 LinkedIn 上与我联系,或在 jordan@jordanbean.com 发邮件给我

1 —流失=快乐:以客户为中心的保持方法

原文:https://towardsdatascience.com/1-churn-happiness-a-customer-centric-approach-to-retention-540d1f4a7037?source=collection_archive---------19-----------------------

异种客户血统

通过计算终身价值来庆祝“客户异质性”

Photo by Henry & Co on Pexels

“从来没有人说:嗯……他是个糟糕的律师,但至少他很便宜!!"彼得·费德

在之前的一篇文章中,我讨论了如何超越预测,留住客户不可避免地归结为理解 客户价值我们愿意支付 的价格来保持这一价值。为了达成这一谅解及其各自的实施,我们提出了三个必须回答的问题:

1)哪些客户很快就有翻盘的概率最高?

2)我们每个客户的终身价值是什么?

3)什么样的挽留优惠最适合每位客户?

在回答问题#1 时,我们开发了一个客户流失预测模型,该模型提供了几种我们可以用来识别高风险客户/会员的策略。由于各种权衡,不存在单一的最优策略,因此决定使用哪种特定策略将完全基于我们愿意投资的金额,以防止现有成员离开。

你会问,“那么我们应该对每个高风险客户投资多少呢?”?嗯,这完全取决于我们期望他们在一生中购买和贡献多少。这种期望被称为顾客的终身价值(LTV)。

这篇文章是我的回购的“后续文章”。在这里,我将涵盖我在这个项目过程中遇到的主要想法、结果和推论。现在,让我们直接跳到问题 2:

我们每个客户的终身价值是什么?

终生价值(LTV)为什么它很重要?

通常,当我们想到获取和保留客户时,我们会立即进入成本最小化(底线)的思维状态。然而,为什么当我们雇佣人才时,我们想要最好的,而且我们愿意为最好的支付(最高限额)?我们需要将同样的逻辑应用到我们的客户获取和保留工作中。如果有美元可赚,我们就不应该纠结于便士!

LTV,又名获取-保留价值,被定义为未来(净)现金流的现值。这是一个前瞻性的概念,而不是衡量过去的盈利能力。

那么我们如何计算 LTV 呢? 嗯,看情况。所有的收入来源都可以归结为合同或非合同模式。主要区别在于,在合同环境中,我们观察客户“死亡”的时间(例如:一个应用程序提供每月订阅,而客户没有重新订阅),而在非合同环境中,不观察客户变得不活跃的确切时间(例如:客户从电子商务网站购买商品,并且不再返回)。

Types of Revenue Streams

这些模型中的每一个都有自己独特的评估 LTV 的方式,因此我们将只涵盖离散的合同计算,因为我们的用例涉及基于订阅的固定价格业务如果你对非合约 LTV 分析感兴趣,可以参考这个很棒的教程。

在离散的合同环境中计算 LTV——游戏计划:

1)进行生存分析,并使用 Kaplan Meier 曲线分析我们每个成员的生存概率。

2)创建一个 Cox 比例风险模型(生存回归)来研究生存时间(预期寿命)和我们的变量之间的关系。

3)使用该回归模型确定所有成员的预期寿命,并计算其各自的 ltv。

4)重新审视我们的客户流失模型和已识别的高风险会员。

生存分析

生存分析是统计学的一个分支,最初用于医学和生物学科,研究患有重大疾病的试验患者的生存时间。简单地说,我们称之为“事件时间”分析。这项技术不仅可以进一步应用于传统的死亡事件,还可以应用于不同业务领域中许多不同类型的事件。

生存分析适用于我们可以定义的情况:

  • 一个“出生”事件:对于我们的应用程序,这将是客户与公司签订合同的时候。我们用这个来衡量用户成为会员的时间(任期)。
  • “死亡”事件:当客户在 2016 年 2 月会员资格到期后的 30 天内没有重新订购时,就会发生这种情况。

但是,请记住,这更像是一种探索性的数据分析技术,用于通过可视化不同群组各自随时间推移的累积生存概率来评估不同群组的预期寿命。该函数的直观表示通常被称为卡普兰-迈耶曲线,它展示了某一时间间隔内某一事件(例如,生存)的概率。

类似于我们如何在创建回归模型之前进行双变量 EDA 以了解个体特征的行为和潜在影响,我们在创建 Cox 比例风险(CPH)回归之前进行生存分析。现在让我们看看使用一种叫做卡普兰-迈耶曲线的特定类型的生存曲线,我们可以收集到什么信息。

上面的曲线提供了一些与我们人口健康相关的直觉。总的来说,我们的成员在 4000 天时有~80%的存活概率,因此保持力似乎相对较强。这表明 KKBox 是一个相当健康的业务,因为客户幸存的几率很高。现在,在确定客户的终身价值之前,让我们将我们的数据分成不同的群组,以建立一个坚实的基础。

生存分析#1:集群客户群

在之前的项目中,我们根据用户活动确定了以下 4 个群组:

  • 集群 3,电力用户
  • 集群 2,二级电力用户
  • 群集 0,活动多数
  • 聚类 1,不太活跃的少数群体

在这里,我们可以看到群 1(不太活跃的少数)和其他群之间的明显区别。这是对我们的细分分析的可靠跟进,因为它进一步证明了集群 1 如何明显地具有该组的最差预期寿命(75%的存活率,而其他组在 4000 天的存活率约为 89%)。然而,从长远来看,让 75%的最差客户存活 11 年是一个很大的问题。

生存分析#2:注册方法

虽然 KKBox 没有提供太多关于注册方法值的信息,但我发现这是一个有趣的特性,因为它可能代表用户“如何”加入平台。

进行生存分析的一个好处是,我们可以清楚地看到影响强成员和弱成员的确切因素。在这里,我们看到了所有 4 种注册方法的存活率的明显差异,其中 registered_via = 9 和 3 优于其他方法。拥有 registered_via = 10 和 4 的成员似乎几乎瞬间死亡。如果我们对这一特征的假设是正确的,那么通过归因,我们可以用前两种方法重新分配我们的资源,以获得更多的长期成员。

从过程改进的角度来看,存活曲线也是调查为什么 4 和 10 表现如此差的一个提示。这是一个很好的例子,说明我们如何通过评估营销活动及其为我们公司创造的客户类型,使用生存曲线来优化用户获取。**

生存分析#3:付款计划期限

使用订阅的公司通常为客户提供不同的层级。通常,这些层中的一个会被突出显示或区分,因为公司有意试图吸引客户选择默认包。通过生存分析,我们可以问这样一个问题:我们默认用户订阅的内容会如何影响他们作为客户与我们在一起的时间?

在这里,我们可以看到计划的选择对会员资格期限有重大影响。与每月 30 天的计划相比,持续时间更长的计划随着时间的推移存活率更低。这可能是因为一旦计划到期,计划期限长的人不太愿意以同样高的一次性付款重新投保。此外,这张图表对我们如此有价值是因为它告诉我们如何能够 优化客户激活

那么我们应该给每个人默认一个 30 天的计划吗?嗯,那要看目前的经营策略。如果企业希望在短期内(365 天或更短)增加收入以获得现金流,那么默认用户使用 360 天计划可能是最好的选择。但如果企业优先考虑长期客户健康和权益,那么 30 天计划是显而易见的候选方案。

这些卡普兰迈耶图不仅在视觉上吸引人,而且它们清楚地向我们现有的客户解释了潜在的模式。这是一个如此简单和初级的工具,但它提供了有价值的信息,我们可以根据这些信息做出清晰、有效的决策。不要忘记,所有这些见解仅仅来自于从两个特征(任期和流失率)计算累积边际率!

Cox 比例风险(CPH)回归

如前所述,我们的卡普兰迈耶曲线只适用于一个特征,忽略了所有其他特征的影响。因此,需要一个更好的模型来同时评估所有数字和多重预测因子对生存时间的影响。

Cox 比例风险(CPH) 是一种常用的半参数模型,用于研究生存时间和所有变量(包括分类和定量预测因子)之间的关系。对于给定的危险率,它通过累积计算一段时间内个人的“死亡”风险来返回每个用户的预期寿命。这些“危险”可以被认为是增加/减少生存机会的东西。例如,在我们的业务问题中,风险可能是由于客户拥有的合同类型或他们注册应用程序的方式而导致的相关死亡可能性(客户流失)。

我们必须再次强调,运行 CPH 回归模型的要点不是分析谁死谁不死。相反,我们这样做是为了研究我们的特征(也称为协变量)对死亡的时间的影响。所述研究的结果是预测用户预期寿命的能力,然后我们反过来用它来计算他们各自的寿命值。

CPH Regression Output

由此产生的模型摘要相当详细,所以现在我们只关注关键输出: exp(coef) 。这被解释为变量的每个额外单位的危害(风险)的标度:

  • 1: 无影响,对死亡贡献无影响
  • 低于 1: 风险降低,对死亡的影响较小
  • 以上 1: 危险增加,对死亡的贡献更大

解释摘要:

  • city_agg 是一个工程特性,根据人口将所有城市减少到 5 个组成部分。在 exp(coef) 下针对每个预测值给出的风险比(HR)表明,具有exp(coef)=~. 9city_agg_4 和 city_agg_3 特征在降低风险方面的作用最小。
  • Cluster_2 和 Cluster_3 分别具有 exp(coef) = .77 和. 71, (即小于 1)的特征意味着危险降低,因此生存更好。因此,一个成员被归类为这些集群中的任何一个,死亡的几率就会降低一倍。 分别为 77 和. 71 ,因此是更好生存的良好预后。
  • city_agg_1,Cluster_1,registered_via_PCA危害比= ~2 及以上!因此,这些是重要的“杀手”,因此是低存活率的强烈迹象。

既然我们有了 CPH 回归模型,我们现在可以计算预期寿命和寿命价值。

估算所有成员的预期总寿命,并计算其各自的 ltv。

这里我们看到观察到的任期和我们新计算的预期寿命。通过比较这两块地,我们可以看到,就任期而言,我们目前的成员人口相当年轻。中位年龄约为 1000 天,我们的成员变动率(死亡事件),我们可以预计我们的成员与我们在一起的中位时间为 4000 天(约 11 年)。

如前所述,预期寿命价值是作为未来(净)现金流的现值计算的。我们假设加权平均月成本为 9.50 美元(每天约 0.32 美元,美元换算),年折扣率为 10%(实际上,折扣率通常为 6-12%)。

超过 4000 天的总 LTV 为 819.45 美元,我们看到了大规模采用对于这种商业模式的成功是多么的关键。值得注意的是,这一计算没有考虑成员的任期,这意味着 443,914,440.78 美元的总 LTV 包括了我们的成员已经为公司贡献的过去价值。然而,我们更感兴趣的是确定我们期望成员贡献多少剩余价值。

对于我们的用例来说,这更有价值,因为我们现在对未来的预期有了一个现实的视角。此外,我们可以看到 LTV 如何陷入负面,因此我们可以识别根据我们对生命周期的估计预计会死亡的活着的用户。为了更好地理解这一点,有助于将它们解释为代表这些成员贡献的超过其各自 LTV 数额的额外价值的绝对值。

这是 LTV 建模提供的另一个很好的洞察,因为这些成员可能属于 【集群 3(高级用户) ,并且可能是潜在的溢价向上销售的候选人。即使从公司估值的角度来看,我们也可以做出一个非常有力的论证,仅仅基于这种分布,这家公司实际上值多少钱。

重新审视我们的流失模型和已识别的高风险会员

在之前的项目中,我们就着手回答了这个问题:哪些客户很快就有翻盘的概率最高?尽管我们创建了几个可以轻松回答这个问题的模型,但我们仍然没有足够的信息来为我们的业务选择最佳模型。我们的结论是,因为我们不知道每个客户的价值,我们不能正确地确定什么样的治疗将有效地说服他们留在我们身边。这种治疗的成本是最终决定我们应该使用哪种模型的因素,因为这些模型让我们清楚地了解了取决于策略的风险和回报。现在我们知道了客户对我们的价值,让我们重温一下之前的模型,量化两者之间的风险回报权衡。

在我们继续之前,这是一个很好的地方来简要提及 LTV 分析的一个小免责声明。最终,LTV 将作为一个临时快照来使用和对待。它应该被视为一种结果,而不是原因。因此,价值的变化应该是我们在营销、产品、沟通策略等方面采取行动的结果。考虑到这一点,即使我们见证了 4000 天的高存活率,假设这一存活率将随着时间的推移保持不变也是不明智的。因此,我们将使用我们当前的模型,使用未来三年的 LTV 上限值进行推断。

因此,如果我们不进行干预,而我们所有的实际高风险成员都受到了影响,那么总的潜在价值损失会是多少?答案是 未来三年 5833677.41 美元。 这是对实际上是高风险成员的预期剩余 LTV 的总和。但是如果我们真的干预了呢?你愿意花多少钱来保持这种价值?

GBT 1:1 比率模型—太多的假阴性

在这个模型中,我们放弃了 2,618 名会员,剩下约 764,000 美元,因此我们有机会在三年内保留 17,305 名会员,剩余 LTV 为 507 万美元。然而,这也带来了一个问题。为了接触到所有 17,305 名成员,我们必须再次接触被标记为高风险的 94,020 名成员。

GBT 13:1 比率模型—假阳性太多

这种模式基本上放弃了 11,670 名会员,剩下 324 万美元,因此我们有机会保留 8,253 名会员,剩余 LTV 为 241 万美元。这种模式的优点是,我们只有 15,559 名成员被确定为实际高风险。这意味着“按比例”与其他模型相比,我们不需要接近那么多人来接触那些实际上是高风险的用户。

有了这些信息,我们现在就有了做出实际决策的框架。作为一个例子,让我们以单个治疗成本来评估每个模型,以更好地了解它们的总成本和 ROI。让我们从一些假设开始:

  • 治疗费用为 9.50 美元(1 个月订阅,加权平均)
  • 我们只会接近那些我们能获得至少 200%总回报的用户。这样我们就忽略了 LTV 不超过 30 美元的会员。
  • 所有成员都受到同样的待遇

由于 LTV 建模,我们可以做出明智的决定,我们应该选择哪种模型策略。通过只追逐有潜力给我们带来合理投资回报的客户,我们可以确保明智地花钱。还需要注意的是,这仅仅是一个查看成本对我们每个模型的影响的练习。事实上,我们不会给予所有会员相同的待遇,因为顾客从来都不是同质的。当我们忽视客户的异质性时,我们会浪费宝贵的资源去追逐任何人和任何人的产品销售,不惜任何代价。我们稍后再看这个。

有了这些模型以及它们相关的风险、回报和成本,我们可以简单地决定我们愿意花多少钱。

结论:我们每个客户的终身价值是什么?**

我们从了解 LTV 的需要开始这篇文章,这样我们就可以确定我们可以花多少钱来说服一个高风险客户重新考虑他们的退出。这个成本是至关重要的,因为它将阐明我们的每个模型策略在成本和潜在收益方面的权衡。在执行计算时,我们实际上能够通过计算获得更多的价值。

优化客户获取和激活

进行生存分析的一个好处是,我们可以清楚地看到促成强势和弱势成员的确切因素,从而使我们能够根据需要重新分配资源,以更好地集中精力进行收购。

尽管人们普遍认为长期计划对企业最有利,但这项分析利用相对有限的数据为相反的观点提供了有力的证据。诸如此类的洞见使得生存分析对所有企业来说都是非常宝贵的。

收购成本与收购价值

正如我之前提到的,我们经常寻求将获取和保留客户的成本降至最低,同时愿意为最优秀的人才支付额外费用。LTV 是一个有价值的工具,可以用来寻找和获得最好的成员。当有美元可赚时,我们不应该纠结于便士!

让我们看看第三个也是最后一个问题:

什么样的挽留服务最适合每位客户?

不幸的是,这个问题的答案超出了这个项目的范围。但是,回答这个问题背后的主要思想是承认所有的顾客并不是生来平等的。如前所述,我们对所有客户一视同仁,仅仅是为了展示成本对客户流失模型的影响。事实上,平等对待所有客户的问题在于存在“普通客户”的错误观念。使用这种方法,我们无法在更精细的层次上识别客户的独特属性。当我们忽视客户的异质性时,我们会浪费宝贵的资源去追逐任何人的产品销售,不惜任何代价。 LTV 是我们用来了解适合合适客户的合适价格的工具。将这些治疗方法分配给所有高风险客户后,可以创建一个模型来了解哪些治疗方法被证明是最有效的。

正确回答这个问题的一种方法是通过细分、目标和定位的方法。从总体上看,我们可以将 CLV 的客户群分为三类,并定义一个如何对待他们的简单主题:

  • 高价值客户 :识别他们
  • 中等价值客户 :发展他们
  • 低价值客户 :控制成本

Screenshot from InfoTrust CLV Video

通过利用 LTV,我在这个项目中展示的一切都为我们如何处理客户流失建模项目增加了一个新的视角。这一点尤其正确,因为它们不像许多人想象的那样是一维的。关于这个项目,最令人印象深刻的是我们能够从客户获取、激活和保留方面得出的推论数量。这证明了终身价值是一种无价的工具,任何企业都不应该缺少它,但却没有得到足够的重视。干杯!

其他参考资料和灵感:

  • Peter Fader 和 Bruce Hardie,契约环境中基于顾客的估价:忽视异质性的危险
  • Peter Fader,回归基础客户终身价值
  • 鲁本·范·帕门,卡普兰·迈耶曲线:简介
  • 布鲁斯·哈迪和彼得·费德,CLV的合同分配
  • Cam Davidson-Pilon,生命线库(Python)

我希望你喜欢这些文章!我对客户终身价值这一话题非常感兴趣,如果您想进一步了解这一话题,请随时通过 LinkedIn 与我联系!

1 —流失=快乐:以客户为中心的保持直觉

原文:https://towardsdatascience.com/1-churn-happiness-customer-centric-approach-to-retention-fd1d85464e45?source=collection_archive---------22-----------------------

异种客户血统

使用 Google BigQuery 和 Apache Spark 的 KKBOX Music 的流失预测用例

Photo by Pixabay on Pexels

“只有一个老板。顾客。他可以解雇公司里从董事长开始的所有人,只要把钱花在别的地方。”

—萨姆·沃尔顿

客户流失无疑是企业主最害怕的词汇之一,因为这意味着他们已经永远失去了一个客户。尽管这是做生意不可避免的一部分,但如果公司实施适时的营销和销售方法,许多流失的客户都可以被保留下来。

如果你问任何一个数据科学家,流失预测模型的目的是什么,他们很可能会说“预测流失…废话。”这个回答当然是正确的;然而,它只是部分地解决了实际问题。

除了预测,客户的获得和保留不可避免地归结为理解 客户价值我们愿意支付 的价格来保持这一价值。它是关于“庆祝客户的异质性”知道所有客户并非生来平等,从而使公司产品和服务的开发和交付与其最高价值客户的当前和未来需求保持一致。要正确执行此操作,我们需要回答以下问题:

1)哪些客户很快就有翻盘的概率最高?如前所述,可以训练预测模型来识别最有可能离开的客户。

2)我们每个客户的终身价值是什么?在确定哪些客户有离开的风险后,我们会遇到这样的问题:“我们提供什么激励措施让他们重新考虑?”(这种优惠通常被称为治疗)。通过了解客户对我们企业长期成功的价值(即客户终身价值),我们可以开始以合适的价格用合适的待遇接近他们。

3) 什么样的挽留优惠最适合每位客户? 根据顾客的终身价值,商家可以制定多种治疗方案。将它们分发给所有高风险客户后,可以创建一个模型来了解哪些治疗方法是最有效的。

我将使用现有企业的数据作为例子来探讨这些问题。在本文中,我们将遵循 CRISP-DM 方法,并在下一篇文章中的建模和评估基础上进行构建:

  • 业务理解: 这个阶段从业务的角度考虑我们想要完成什么
  • 数据理解: 此阶段涉及收集、描述和探索数据
  • 数据准备: 此阶段涉及数据的清理、构建和集成
  • 建模: 这一阶段包括建立和评估模型
  • 评估: 在这里,我们评估模型满足我们的业务目标的程度,并试图找到该模型有缺陷的业务原因
  • 部署: 在这个阶段,我们确定一个部署结果的策略,监控部署的性能,维护部署。这一部分不包括在内。

最后,这篇文章是作为我的回购的“后续”而写的。在这里,我将涵盖我在这个项目过程中遇到的主要想法、结果和推论。所以,让我们从问题 1 开始:

哪些客户很快翻盘的概率最高?

1.商业理解:进入 KKBOX 音乐

KKBOX 是亚洲领先的音乐流媒体服务,拥有世界上最全面的亚洲流行音乐库,拥有超过 3000 万首歌曲。他们向数百万人提供无限制版本的服务,由广告和付费订阅支持。然而,这种微妙的商业模式依赖于准确预测付费用户的流失,这正是我希望实现的。

2.数据理解

本次练习的数据可在 Kaggle 公开获取。这是由第 11 届 ACM 网络搜索和数据挖掘国际会议(WSDM 2018)主办的比赛的一部分。数据包含了~ 230 万会员从 2015 年 1 月到 2017 年 3 月的音乐收听和交易习惯。

— 2.1 数据集描述—

我们将在这个项目中使用的数据集分为两个版本: v1v2 。这里,我们将只使用 v1 文件,因为它们包含近 3 年的数据,而 v2 只包含一个月。

  • train_v1: 包含唯一的用户 id,以及自20172/28 日起是否被篡改。 ~800K 记录@ 45.56 MB
  • 交易 _v1: 截至20172/28 的用户交易。它包含与计划定价、交易日期和会员到期日相关的功能。~ 2200 万条记录@ 1.68 GB
  • user_logs_v1: 截至20172/28 日的日订阅用户活跃度。这包含与播放的独特歌曲数量、每天收听的总秒数以及部分收听的歌曲数量相关的特征。 ~4 亿条记录@ 29.78 GB
  • 会员:所有用户信息数据。它包含与性别、注册方法、城市和年龄相关的特征。~ 500 万条记录@ 417.89 MB

总计:31.92 GB 包含所有文件的 22 个原始数据点,包括 4 个日期字段

以下是我用于高效数据准备和模型构建的数据架构:

  • 原始表( RAW_ ) —所有表的原始未触及版本,将用作干净备份。
  • 工作表( WRK_ ) —所有表格的清洁和正确格式化版本。这些将作为我们的派生表的源。
  • 衍生表( DRV_ ) —专为我们的用例创建的表。所有的特征工程都将在这里进行。

— 2.2 注释和观察—

鉴于如此庞大的数据集,我决定使用 Google BigQuery 作为持久化的存储解决方案。对于建模,我使用了 Apache Spark(通过 Google Dataproc)。

免责声明:我意识到 Google BigQuery 并不打算用作 DBMS,Postgre 和 MySQL 服务器之类的东西更适合这个用例,但是……他们提出让我免费使用它!

3.数据准备

请参考 创建派生表 及特性 章节中的 KKBox 搅动—第 1 部分— ETL 笔记本

— 3.1 派生表构造—

我们将从构建每月派生表开始,其中包含在每个月内具有成员资格到期日的所有成员。我们还将包括表中所有特定于成员的信息,以及一些简单派生的特性。最后,我们根据 KKBOX 的定义计算 is_churn 。结果是:

我们将分别使用 2016 年 1 月和 2016 年 2 月作为训练集和验证集。

— 3.2 特征工程—

对于这个项目,我最终创建了大约 230 个特性,每个特性都有两种形式;汇总和追溯数据。

聚集特征 是成员数据的一般聚集,主要是绝对总和和平均值。这些集合特征的例子:

  • Total _ spend:会员一生中花费的总金额。
  • spent_per_num_unq :总花费/独特歌曲数量总和

回顾性特征 采取三种主要形式:

成员资格到期后 7、15、30、60 和 120 天的时间间隔内的聚合数据(AVG、标准差、总和)。示例:

  • total_secs_last_15_AVG :过期 15 天内平均收听的音乐秒数
  • over_50perc_last_30 :过期 30 天内收听率超过 50%的歌曲数量

两周一次的活动街区。示例:

  • SUM_unq_songs_0_15 :对过期后 0 到 15 天内的唯一歌曲进行求和
  • AVG _ 歌曲 _15_30 : AVG #到期后 15 到 30 天内的歌曲

双周活动板块比较。创建这些功能是为了捕捉导致成员到期日期的趋势行为。示例:

  • dif SUM _ unq _ Songs _ 0 _ 15 _ 15 _ 30:过期后 0-15 天与 15-30 天区间内唯一歌曲总和的差值
  • dif avg _ Songs _ 15 _ 30 _ 30 _ 45:到期后 15-30 天与 30-45 天内每天播放的 AVG 歌曲数量的差异

— 3.3 EDA 和客户细分分析—

本节参考以下笔记本:

  • KKBox 搅动—第二部— EDA 笔记本
  • KKBox 细分—第二部分—客户细分分析

由于本文更多地关注于项目的建模方面,我强烈建议您访问本节的相应笔记本。正如您将在第一个笔记本中看到的,我喜欢使用统计方法来指导 EDA 过程,尤其是在处理如此多的功能时。除此之外,还通过 K-Means 将用户划分为集群组,以进一步了解现有的客户群及其各自的行为。

我将这些细分市场定义如下:

电力用户

人数不多但忠诚,这部分用户是所有指标中最活跃的。由于这些用户往往比其他人拥有更长的会员时间,他们的流失率低于 1%。这个群体也拥有最高的每用户平均收入。

集群 2,二级电力用户

就活跃度而言,这些用户仅次于我们的超级用户,约占总观察收入的 16%。像我们的集群 0 用户一样,他们的流失率略高于 1%。

集群 0,主动多数

排在第三位的是活跃分子,我们称之为“活跃多数”。这些用户占我们观察人口的近 43%,是收入的最大贡献者,占总收入的近一半。尽管集群 2 的用户更活跃,但在流失率%和每用户平均收入方面,他们之间几乎没有区别。

集群 1、 非活跃少数

与所有其他群体相比,客户流失率最高,我们观察到这部分客户的活跃程度明显低于其他群体。然而,有趣的是,这些用户最有可能在他们的订阅上获得折扣,然而他们中的许多人最终都搅动了 (集群 1 中所有用户中 34.5%的人目前低于他们的计划价格,搅动了。这让我对这些人中的许多人是否值得花费资源产生了疑问,并强调了为什么在决定谁值得追求时,客户终身价值如此重要。

— 3.4 处理阶级不平衡—

正如我们在探索性数据分析中所讨论的,我们正在处理我们的目标变量(流失)中的一个显著的类别不平衡,非流失与流失的比例为 97:3。为了避免我们的非流失数据占主导地位,我们将从基于 50:50 平衡集(通过对主导类进行欠采样)的建模开始,并在必要时调整这种平衡。

4.建模

请参考本节的跟踪笔记本:

  • KKBox 搅动—第三部分— Spark RFC 建模笔记本
  • KKBox 搅动—第三部分—火花 GBT 建模笔记本

我们最终在 Apache Spark 上使用了两个分类评估器:【GBT】随机森林分类器(RFC) 。为这个项目构建了各种模型,这些迭代产生了许多特性。在这里,我将介绍导致我们最终的 GBT 模型(最佳性能)的一般演变。该部分按如下方式进行:

  1. 最初的 GBT 和 RFC 模型建立在一个 1 对 1 样本上
  2. GBT 模型基于各种 x 比 1 采样比例,以减少过拟合和整体精度
  3. 基于各种 x 比 1 采样比例和不同特征重要性阈值构建的 GBT 模型,以进一步降低过拟合和整体精度

我们会参考流失值如下: 流失= 0: 正类,客户没流失。 流失= 1: 负类,客户确实流失了

模型#1:一对一流失与非流失比例分割

观察

值得注意的是,我们的模型特征目前仅包括聚合特征和随时间间隔聚合数据特征。查看这些分数,我们可以看到我们的模型稍微有些过度拟合。然而,最令人担忧的是,与召回率相比,我们的准确率较低。查看我们的验证模型的混淆矩阵,我们可以看到这些分数的影响。

这里我们看到,与我们的假阳性相比,我们模型的假阴性太高了。考虑到我们目前的使用案例,如果 KKBox 使用这种模式,他们在治疗成本上的损失可能会比实际客户流失更多。就验证分数而言,GBT 和 RFC 之间没有实质性差异,然而,RFC 似乎概括得更好。

下一次迭代的注释

我们需要解决的第一个问题是两个模型中的大量假阴性。由于我们的模型目前对做出客户流失=1 预测更加敏感,我相信通过引入更多非客户流失数据来创造轻微的不平衡,我们可能能够降低这种敏感性。

模型#2:具有趋势特征的多个比率子集分割

在这里,我们总共创建了 7 个子集,在每个奇数时间间隔上从 1 比 1 到 13 比 1(非流失到流失),因为我们希望改善假阳性和假阴性之间的平衡。我们还增加了更多关注趋势的功能。

观察

我们现在有大约 230 个功能,包括我们的双周活动板块双周活动板块功能对比。看上面的结果,我们可以看到我们对 AUC 做了一些改进。我们还可以看到,在比率子集上,回忆显著增加。这意味着子集似乎已经解决了大量假阴性的问题,但代价是产生了更多的假阳性。

我们的模型仍然过度拟合,高比率模型(9:1、11:1 等)表现最差。然而,在高比率模型上,我们的召回分数更好,在模型误差上也有所改善,精确度略有下降。

下一次迭代的注释

由于归纳缺乏一致性,我们将通过基于重要性减少特征的数量来解决模型的复杂性。为此,我们将首先得出所有模型的所有特征重要性分数的平均值。然后,我们将生成该组的 5 个数字的汇总,以生成以下特征组:高于平均值的特征、高于 75%的特征、高于 50%的特征和高于 25%的特征。

模型#3:多个比率子集分裂@调整阈值—最佳性能模型

观察

为了简化我们的分析,我们只包括了每个比率子集的模型,这些模型都是一般化的最佳模型(最佳 1:1 模型、最佳 3:1 模型等)。基于目前的结果,我们增加了模型的总体概括。

我希望在泛化、假阳性和假阴性方面有更好的结果。我们可以通过许多方式继续构建和改进这些模型,但我们将结束项目的这一阶段,继续我们目前的成果。

5.估价

— 5.1 模型评估—

在这个项目开始的时候,我们就着手回答这个问题: 哪些客户很快就有翻腾的概率最高? 和虽然我们创建了几个可以轻松回答这个问题的模型,但我们仍然没有足够的信息来为我们的业务选择最佳模型。

由于我们目前不知道每个客户的价值,因此我们不能正确地确定什么样的待遇会说服他们留在我们这里。这种治疗的成本是最终决定使用哪种模型的因素,因为 这些模型根据我们选择的策略让我们清楚地了解风险和回报。 让我进一步解释一下:

例#1:太多的假阴性

通过查看 预测,流失=1 列,我们可以看到我们的模型归类为高流失风险的总人数。仅根据这一模型,我们将为 93,367 名成员提供治疗,希望保留其中的 17,305 人,同时冒着 2,618 人的风险。这并不意味着这种模式不好。据我们所知,这些成员的治疗费用可以忽略不计,这意味着对所有 93,367 名成员进行治疗是可以承受的。但是如果总的治疗费用不可忽略呢?在这种情况下,这种模式可能过于昂贵,因为总治疗成本可能超过没有流失的用户的总价值。

例二:误报太多

与之前的模型相比,现在我们只有一小部分的假阴性,但是我们也有大约 4.5 倍的假阳性。查看 预测,流失=1 列,我们看到 15,559 个成员被标记为高风险。我们冒着失去 11,670 名会员的风险,却可能获得说服 8,253 名会员留下的回报。因此,这种模式可能更适合于总治疗费用高而我们的资源有限的情况。

— 5.2 结论—

这两个模型仅仅是我们在寻找如何识别和接近不开心的顾客的完美平衡时追求的两个极端。它们还展示了正确理解客户价值对我们业务长期成功的重要性,以及留住客户的相关成本。流失预测项目通常不会产生一个单一的、完美的模型,但是它们会提供有价值的信息,这些信息可以用于更有效的决策和实践。

如果你喜欢这个话题,你可能会喜欢我写的下面这篇文章。通过计算终身价值庆祝“客户异质性”。

1 分钟数学:0 是偶数还是奇数?

原文:https://towardsdatascience.com/1-minute-math-is-0-even-or-odd-93d30090201f?source=collection_archive---------18-----------------------

我的学生经常问我的一个问题是:0 是偶数还是奇数 还是两者都是

Photo by Jeremy Perkins on Unsplash. Zero — a beautiful number.

0 是偶数吗?

要回答这个问题,我们首先需要定义“偶数”是什么意思。

偶数是一个数 n,它可以写成某个整数 k 的 n=2⋅ k

这意味着如果我们把一个偶数除以 2,就没有余数了!

我们可以把 0=2⋅ k 写成一些 k 吗? Yepp,如果选择 k=0 就可以。

太棒了。这意味着 0 是偶数!

0 也是奇数吗?

同样,我们首先需要定义“奇数”的含义,常见的定义与偶数的定义非常相似。

奇数是一个数 n,对于某个整数 k,它可以写成 n=2⋅ k+1

我们能把 0=2⋅k+1 写成整数 k 吗?没有。我们不能,因为解这个方程得到的不是一个整数。

答案

好了,证明完成了。0 是偶数(且只有偶数!).

不会甚至(一语双关)太难吧?

一分钟数学:比萨和毕达哥拉斯可视化

原文:https://towardsdatascience.com/1-minute-math-pizza-and-pythagoras-visualized-359470941bd6?source=collection_archive---------44-----------------------

小号+中号还是大号?还有呢?

许多比萨饼店提供小号、中号和大号的比萨饼。如果你想知道点一个大披萨而不是一个小的和一个中的披萨会不会让你得到更多的披萨,这里有一个漂亮的视觉技巧可以帮你找到答案。

每种尺寸点一份披萨(我知道,这就是它如此美丽的原因!多好的理由去订购更多的比萨饼!),把它们切成两半,像这样放在一起。

Perfectly fitting pizza!

它是否完全合适,并且在左下角有一个直角?如果你点了一个小的和一个中的比萨,而不是一个大的,你会得到同样多的比萨。披萨的三个直径符合毕达哥拉斯的方程式。

是不是长这样而且大披萨“太短”了?那么你可能想点一个小号和中号的比萨饼来代替。

The pizza is too small. The small and the medium pizza together are indeed more than the large pizza.

还是大披萨“太长”?这在大多数地方都应该发生——这意味着如果你点一个大披萨而不是一个小的和一个中的一起点,你会得到更多。

The pizza is too big! These were our original dimensions — it looks like we made a good deal.

当然,我们假设所有三个比萨饼的高度 a 是相同的。因为如果我们将毕达哥拉斯方程两边的一些数字相乘,我们会得到一个包含三个披萨体积的方程。

所以下次你点披萨的时候,记得每种尺寸至少买一个,亲自尝试一下。

当然,纯粹是出于科学原因。

从零开始的单向方差分析—用一个工作实例剖析方差分析表

原文:https://towardsdatascience.com/1-way-anova-from-scratch-dissecting-the-anova-table-with-a-worked-example-170f4f2e58ad?source=collection_archive---------4-----------------------

ANOVA 是方差分析的缩写,是一种使用统计显著性比较平均值的常用统计方法。在这篇文章中,我解释了如何从零开始计算一元方差分析表,应用于一个很好的例子。

本文概述:

  1. 介绍单因素方差分析的示例和目标
  2. 了解方差分析模型
  3. 使用 Python 的 statsmodels 库执行 ANOVA
  4. 从头开始的方差分析—剖析方差分析表
  5. 结论

1.单因素方差分析的目的是通过一个例子

在整篇文章中,我将使用一个关于披萨递送时间的例子。假设我们在 3 家不同的披萨公司(A、B 和 C)订了很多次披萨,并且测量了送货时间。

跟着 Python 笔记本过来吧!

首先,我们需要将数据导入 Python:

Getting our 21 observed pizza delivery times into pandas

数据现在看起来如下:

Pandas DataFrame with the pizza delivery times

每家公司的平均交付时间提供了哪家公司更快的第一手信息,在本例中,B 公司:

Average delivery time per company

但是,平均水平不足以很好地描述这种情况,因为交付时间存在相当大的差异。例如,原始数据显示 B 公司有时也非常慢。

为了说明 B 公司是否比 T4 公司更快,我们需要一个假设检验。如果需要的话,不要犹豫,回到这篇文章中,这篇文章对假设检验给出了直观的解释。

在当前比较 2 组以上平均值的情况下,我们需要一个单向方差分析。

2.ANOVA 是如何工作的?

ANOVA 模型从估计比萨饼交付时间中存在的总变化量开始(这就是为什么它被称为方差分析)。

查看我们的示例,我们可以说比萨饼的交付时间从 8.9 分钟到 14.0 分钟不等。如果我们忽略关于公司的信息,我们对新的比萨饼外卖的最佳估计是 8、9 和 14 分钟之间。我们暂且称之为总变差

The companies’ average delivery time is more valuable information than the overall average delivery time

下一步是将这个总的变化分成两部分:组间变化和组内变化

组间差异由我们的变量公司解释

如果我们在图表中添加变量 company ,我们会发现,如果我们知道哪家公司配送我们的披萨,我们就可以给出更精确的配送时间范围。

  • 如果 A 公司送货,需要 11,8 到 14 分钟。
  • 如果 B 公司送货,需要 10,0 到 14,0 分钟。
  • 如果 C 公司送货,需要 8.9 到 13.6 分钟。

这种现象是由于组间变异:由我们的变量解释的变异的量化。

我们的可变公司无法解释组内变化

但是,也有一部分变化是我们的变量“公司”无法解释的:我们仍然不知道为什么 A 公司的交付时间在 11、8 和 14 之间存在差异,我们需要更多的变量来解释这一点。

由于我们没有这些新的变量,这种变异仍然无法解释,被称为组内变异

方差分析:组间差异的假设检验

当总变差被一分为二时,应用假设检验来找出在我们的 21 个样本中观察到的差异是否具有显著性:

  • 是一家比萨公司系统地更快,还是这种随机噪声是由于抽样效应?

我们需要一个统计测试来给我们这个答案:ANOVA F-test(T7 ),这将在本文的剩余部分中详细讨论。

3.使用统计模型的方差分析

在 Python 中,可以如下获得单向 ANOVA F 检验:

1-Way ANOVA table

为了理解这个表中发生了什么,我现在从头开始展示 ANOVA 表中每个值的计算!

4.使用数学和 python 的方差分析——从零开始

跟着 Python 笔记本过来吧!

4.1.平方和总计

我们开始行动吧!我之前描述的变化是用平方和来计算的,

Sum of Squares

为了达到这个目的,我们首先计算整体平均值

Compute overall mean for ANOVA

然后计算原始分数和总平均值之间的平方差之和:

Compute the Sum of Squares Total

通过对 sum_sq 列求和,可以在 statsmodels 的 ANOVA 表中找到该值。

4.2.残差平方和

残差平方和的计算略有不同,因为它采用的不是整体平均值,而是三组平均值。

我们需要从其组的平均值(其自己的比萨饼公司的平均值)中减去每个值,然后对这些差值求平方并求和。

下面是 Python 中的实现方式:

Compute Sum of Squares Residual

我们可以在 sum_sq 下的 statsmodels 的 ANOVA 表中的 Residual 行找到该值。

4.3.解释的平方和

计算了总平方和和残差平方和后,我们现在可以使用以下公式计算解释的平方和:

Summation of Sums of Squares

因为我们已经有了 SS 残差和 SS 总数,我们可以做一个简单的减法来得到 SS 解释。为了达到这一目的,我们采用每组平均值和总体平均值之间的平方差的加权和,如下所示:

Compute Sum of Squares Model

该值可在 ccompany 行的 sum_sq 下的 statsmodels 表中找到。

4.4.自由度

在本文中,我不会深入探讨自由度,但我们在进一步的计算中需要用到它们:

  • df1 =被解释部分的 df1 =组数-1
  • df2 =残差的 df2 =观察次数-组数

在我们的示例中,df1 = 2,df2 = 18。

4.5.均方差

方差分析中最重要的统计检验是 f 检验。零假设表明所有组的平均值是相等的,这意味着我们的模型没有解释价值,我们没有证据选择一家比萨饼公司而不是另一家。

另一种假设认为,至少有一种方法是不同的,这将是更深入地了解哪家或哪些公司更快的原因。

我们计算均方如下:

Computing the Mean Squares

下面是 Python 中的实现方式:

Computing the Mean Squares in Python

4.6.f 统计量

我们使用均方差来计算 F 统计量,作为解释变量与未解释变量之间的比率:

Computing the F statistic

以下是 Python 中的实现:

Compute the F score in Python.

4.7.p 值

在假设检验中,p 值用于决定一个替代假设是否可以被接受(如有必要,在此阅读更多关于 p 值的内容)。

如果 p 值低于 0.05,我们拒绝零假设,支持替代方案:这意味着至少有一个组均值显著不同

我们使用具有 df1 和 df2 自由度的 F 分布计算 P 值,在我们的例子中是 F(2,18)分布。使用概率计算,我们发现 p 值如下:

Compute the p-value using scipy

4.8.解释 p 值

我们必须将 p 值与我们选择的α值进行比较,在本例中,α值为 0.05。

我们的 p 值 0.45 大于 0.05,所以我们不能拒绝我们的零假设,也不能接受我们的替代方案。尽管三个样本的平均值不同,我们没有统计上的显著差异。

这意味着,根据观察到的数据,没有足够的证据来假设三家披萨公司的送货时间存在普遍差异。

5.结论

在本文中,方差分析使我们能够从统计上检验样本差异是否可以概括为总体差异。

在我们的数据中,一家披萨公司的平均速度更快,但由于方差分析,我们意识到这种差异并不显著:我们没有足够的证据来得出一家公司总体速度更快的结论

这完美地说明了统计推断的目标:判断观察到的差异是否显著。

我希望这篇文章对你有用,并祝你在单向方差分析中好运。感谢阅读!

一万种行不通的方法

原文:https://towardsdatascience.com/10-000-ways-that-wont-work-311925525cf0?source=collection_archive---------23-----------------------

fast.ai《程序员实用深度学习》第三课

“我没有失败。我刚刚发现了一万种行不通的方法。”

~托马斯·爱迪生

我是一名数学助教,正在努力学习 fast.ai 的“程序员实用深度学习”的第三课,这一周对我来说是一个主要的骄傲吞咽者。在第二课结束时,我能够构建一个模型,将画作分类为毕加索或莫奈的作品,并将我的模型投入生产(在此尝试一下!)。

然而,这个星期,我什么也没做出来。我遵循了我通常的 fast.ai 工作流程:我看了一遍讲座,然后边看边翻阅笔记本,根据需要暂停。当我复习第二次(第三次,第四次…)时,我将宝贵的详细版讲稿放在手边。

Photo by Lukas Blazek on Unsplash

所以这个星期,我打开了讲座中使用的第一个笔记本,这是一个多标签分类器,使用了 Kaggle 的“星球:从太空了解亚马逊”数据集。我计划用那个数据集运行笔记本,就像在讲座中一样,然后获取另一个数据集,并确保我仍然可以让它工作。

但是我甚至不能让笔记本像在课堂上那样运行。使用 Kaggle API 获取数据、查看数据、拟合网络头部以及拟合一个周期都很顺利,但是当需要为整个模型绘制学习率图时,我得到了以下错误:

RuntimeError: CUDA out of memory. Tried to allocate 2.00 MiB (GPU 0; 7.43 GiB total capacity; 6.89 GiB already allocated; 2.94 MiB free; 47.24 MiB cached)

我毫不气馁,转向 fast.ai 论坛,看看是否还有人遇到过这个问题。有人有,他们的问题通过减少批量解决了。也许那对我也有用!

没有。我尝试通过将bs=32作为参数传递给databunch()函数来将批处理大小设置为 32,还尝试了bs=16bs=4bs=2,但是我一直得到相同的错误。bs=1给了我一个不同的错误,因为该函数进行比较,所以每批需要多个项目。于是我自己在论坛发帖。

没有人回答这个问题,但我在 fast.ai 网站上找到了一个关于 CUDA 内存错误的文档。它说要减少批量大小或训练一个更小的模型,这是我尝试过的,所以因为那时我已经花了整整三天试图解决这个问题,我把笔记本放在一边。

其他笔记本——使用 CAMVID 数据集进行图像分割,以及使用 BIWI 头部姿态数据集进行图像回归——至少进展顺利。

在讲座的最后,Jeremy 说我们应该尝试思考一个有趣的多标签分类、图像回归或图像分割问题,并警告我们最具挑战性的部分将是创建我们的数据集群。他绝对是对的!

fastai 库有一个名为 data_block API 的工具,它完成了大量繁重的工作,包括将数据分成训练集和验证集以及它们的标签,并设置它们以加载到您的模型中。只涉及到 10 行代码,但我并不真正理解第 0 步是什么:我不知道如何为它选择数据集,如何让数据集准备好成为数据束,一般来说,我只是觉得它难以理解。在接下来的四天里,我阅读了 data_block API 文档,Wayde Gilliam 的“寻找数据块涅槃(快速 ai 数据块 API 之旅)”,以及几十个论坛帖子,但我仍然只是.没有.明白。

Photo by JESHOOTS.COM on Unsplash

Jeremy 说我们会经常回到 data_block API,所以我会采纳下图(本课程第 1 课的幻灯片)的建议,收起我的骄傲,继续学习第 4 课,而不会觉得自己已经稍微掌握了第 3 课。口碑-口碑。

Slide from Lesson 1 of the course, found on https://hackernoon.com/how-not-to-do-fast-ai-or-any-ml-mooc-3d34a7e0ab8c

关于此主题的其他帖子:

第一课:fast . ai 入门

第二课:对孕检结果进行分类!

第二课(续):深度学习能比鸽子表现得更好吗?

第四课:预测服务员的小费

第五课:但是泡菜去哪里了?

第六课:每个人都想成为一只猫我是一名南加州大学东湾分校的数学讲师,也是一名有抱负的数据科学家。在 LinkedIn 上和我联系,或者在 Twitter 上和我打招呼。

2020 年要考虑的 10 个人工智能 API

原文:https://towardsdatascience.com/10-artificial-intelligence-apis-to-consider-for-2020-4b8147578833?source=collection_archive---------44-----------------------

你认为开发人员会自己编写整个软件的代码吗?即使他们想也做不到。软件代码很复杂,包含数百万个逻辑。开发人员最终可能会感到困惑,搞乱整个软件。

这就是应用编程接口(API)的用武之地。对于那些不知道的人来说,API 是一种现成的代码,有助于将单调的任务数字化和将复杂的功能自动化。现在,每个 IT 服务领域都有它的 API:网站开发、手机 app 开发、联网、DevOps。甚至当涉及到人工智能开发服务时,我们有一些特定的 API 使得整个人工智能应用程序开发&部署过程变得更加容易。

在这篇博客中,我列出了 10 个最受欢迎的 API。这些 API 将是人工智能(AI)行业中最常用的。我在对流行的人工智能和机器学习咨询服务进行了广泛的研究和讨论后,收集了这个列表。为此,非常值得你花时间。因此,仔细阅读列表,决定哪一个符合您的要求:

2020 年十大人工智能 API

Signity Solutions

1.Alexa 技能管理 API

大家都知道亚马逊的智能助手 Alexa 吧?它通过允许人们使用语音命令与设备进行交互而改变了人们的生活,这种方式非常壮观。

Alexa 技能管理 API 允许开发者通过为 Alexa 智能助手创建、管理和测试新技能来更新交互模型。这些技能可以是任何东西——比如播放你最喜欢的歌曲,阅读新闻标题,打开某个网站,预订航班,支付账单,或者播放你最喜欢的电影。(如果我们相信亚马逊,有超过 70,000 种技能可用。

这样使用 Alexa 技能管理 API,开发者可以将 Alexa 智能助手的功能提升到一个全新的水平。该 API 对开发 Alexa 智能助手的开发人员非常有用。

2.谷歌助手 API

Google Assistant API 允许开发者将 Google 智能助手嵌入到移动应用、扬声器、智能显示器、手表、汽车、笔记本电脑、电视和其他 Google Home 设备中。这样做可以在这些设备中实现语音控制,让用户搜索天气、交通、新闻、航班、添加提醒和管理任务,并通过使用他们的手机来控制智能家居设备。类似热门词汇检测、自然语言理解和其他智能服务的功能在谷歌助手 API 的帮助下也是可行的。所以,对于希望让自己的人工智能应用更智能、更高效的人工智能开发者来说,这个 API 可以成为一个很好的资源。

3.BigML

从事 BigML 工作的开发人员同意其公司的说法,即它是人工智能和机器学习的最简单的 API。嗯,这是因为 API 包含了令人印象深刻的功能,如异常检测和旭日东升可视化。这意味着开发人员可以完美地使用它,即使他们没有以前的经验。此外,还有案例研究和用户指南来帮助开发人员,以防他们在任何任务中遇到困难。

因此,API 甚至可以帮助新手人工智能开发人员以无与伦比的专业知识执行他们的任务。难怪它是目前可用的最优选的人工智能 API。

4.预测

PredictionIO 是你在理想的人工智能 API 中想要的一切。它可以免费部署,提供了各种可定制的模板,并能够在部署为 web 服务后动态响应查询。更令人兴奋的是,PredictionIO API 附带了包含开发人员说明和演示教程的详细文档。这意味着开发者在充分利用它的时候不会遇到任何问题。

最重要的是,API 会定期更新。这意味着使用它的开发人员会不时遇到新的特性。

5.Animetrics 人脸识别

对于正在寻找一个 API 来创建面部软件或只是简单地进行图像分析的开发人员来说,Animetrics 人脸识别是正确的选择。找原因?嗯,这里有一些:

首先,Animetrics 人脸识别软件的工作很简单。它检测照片中的人脸,并将它们与已知人脸集进行匹配。

第二,API 返回关于面部特征或地标的信息,作为图像上的坐标。

第三,开发人员可以使用 API 轻松地从图库中上传或提取主题,甚至从主题中删除人脸。

通过这种方式,这些开发人员可以使用这种人工智能 API 轻松获得面部识别和图像分析所需的相关信息。如果你问我,这个人工智能 API 对于开发者来说无疑是一个很好的选择。

6.Wit.ai

Wit.ai 用于为家庭自动化、联网汽车、机器人、智能手机和可穿戴设备等人工智能系统构建智能语音接口。

人工智能 API 是我最喜欢的选择,它可以在人工智能系统中为开发人员提供强大的语音自动化工具。不仅仅是因为它帮助他们轻松地传输和处理来自人类互动的自然语言。还因为它通过鼓励开发人员与社区中的其他人共享他们的发现来促进合作和共享的文化。Wit.ai 帮助每个人成长。也许,这是主要原因之一,Wit.ai API 因创建高度先进的人工智能系统而受到全球开发者的青睐。

7.Salesforce 爱因斯坦语言

如果你正在寻找一个有效的人工智能 API 来分析来自电子邮件、聊天或网络表单的文本,没有比它更好的选择了:Salesforce Einstein 语言 API。背后最大的原因是

API 将文本情感分为积极、消极和中性类别,以理解文本背后的情感。(我们也可以创建自定义模型或使用预建的情感模型。)然后,API 将文本分类到用户定义的标签中,以理解用户发送文本的意图。因此,通过这种方式,Salesforce Einstein 语言 API 可以让开发人员轻松理解他们从电子邮件、消息或任何 web 表单中收到的任何文本背后的意图。

8.蟒蛇

Anaconda 是一个由 Python 支持的企业级安全和可伸缩的 API。开发人员用它来控制数据科学资产。使用 API 的主要原因之一是它允许开发者访问 700 多个易于安装的软件包。此外,您可以使用 Anaconda 快速地将项目部署到交互式数据应用程序、实时笔记本和 ML 模型中。正因如此,许多开发者都在使用它。

9.Indico

Indico 无疑是用于预测分析的最佳人工智能 API 之一,原因是它的工作速度非常快。API 有两个选项。其中一个进行文本演变(情感分析、参与度、情感),另一个进行文本演变(面部情感、面部定位)。这样,API 可以很容易地预测照片和文本,而不必获得任何正式的培训。难怪 Indico API 是每个想要创建高级文本和图像分析系统的人的最爱。

10.SummarizeBot API

SummarizeBot API 用于人工智能系统和区块链驱动的解决方案的文本和多媒体分析。这个 API 非常适合这些功能是有原因的。使用 API,您可以轻松地从文档或网站中抓取重要信息,从视频、图像和 gif 中进行情感分析和提取。此外,还有超过 100 种语言,以及对多种文件格式的支持。总的来说,人工智能提供了很多,开发者应该选择它。

结论:

那么,现在你有 10 个最好的人工智能 API,你可以在 2020 年考虑。现在,您的工作是确定哪一个满足您的业务需求。你当然可以借助人工智能开发公司,有足够的知识和经验。所以,赶紧伸出手吧。

原载于 2019 年 10 月 15 日【https://www.signitysolutions.com】

学生的 10 本最佳数据科学读物

原文:https://towardsdatascience.com/10-best-data-science-reads-for-students-3bae97d9bb23?source=collection_archive---------5-----------------------

学习数据概念的前 10 篇 ML 和统计文章

是时候进行一些精选了!以下是我给学生写的 10 篇最好的文章。如果你发现自己对写作很感兴趣,试着跟随文章中的链接——它们几乎总是来自同一个博客。我尽量让事情不那么无聊,让你开心。

尽情享受吧!

#1 了解数据

[## 什么是数据?

关于信息、内存、分析和分布的思考

bit.ly](http://bit.ly/quaesita_hist)

#2 向孩子(或你的老板)解释监督学习

[## 向孩子(或你的老板)解释监督学习

既然知道了什么是机器学习,那就来认识一下最简单的那种。我的目标是让各种各样的人…

towardsdatascience.com](/explaining-supervised-learning-to-a-kid-c2236f423e0f)

#3 无监督学习去神秘化

[## 无监督学习去神秘化

无监督学习听起来像是“让孩子们自己学习不要碰热烤箱”的一种奇特方式,但是…

hackernoon.com](https://hackernoon.com/unsupervised-learning-demystified-4060eecedeaf)

#4 数据科学简史

[## 自动灵感

在 19 世纪,医生可能会为情绪波动开出水银处方,为哮喘开出砷处方。它可能没有…

bit.ly](http://bit.ly/quaesita_history)

#5 机器学习——皇帝穿衣服了吗?

[## 机器学习——皇帝穿衣服了吗?

深入了解机器学习的工作原理

medium.com](https://medium.com/@kozyrkov/machine-learning-is-the-emperor-wearing-clothes-928fe406fe09)

#6 一句话的统计推断

[## 一句话的统计推断

每一个假设测试——从 STAT101 到那些最可怕的博士资格考试——都可以归结为一句话。这是…

hackernoon.com](https://hackernoon.com/statistical-inference-in-one-sentence-33a4683a6424)

#7 TensorFlow 已死,TensorFlow 万岁!

[## 张量流死了,张量流万岁!

如果你是一个人工智能爱好者,你没有看到这个月的大新闻,你可能只是打了个盹…

hackernoon.com](https://hackernoon.com/tensorflow-is-dead-long-live-tensorflow-49d3e975cf04)

#8 统计学家证明统计很无聊

[## 统计学家证明统计很无聊

统计学词汇的基础知识

towardsdatascience.com](/statistician-proves-that-statistics-are-boring-4fc22c95031b)

#9 用小狗解释 p 值

[## 用小狗解释 p 值

你会发现 p 值潜伏在数据科学(以及其他科学)中。如果你选了 STAT101…

hackernoon.com](https://hackernoon.com/explaining-p-values-with-puppies-af63d68005d0)

#10 什么是决策智能?

[## 什么是决策智能?

人工智能时代领导力的新学科

towardsdatascience.com](/introduction-to-decision-intelligence-5d147ddab767)

额外收获 1:刻薄的统计学 YouTube 课程

Catch the rest of the playlist here.

奖金 2:娱乐性机器学习课程

如果你正在寻找一门为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:

Enjoy the entire course playlist here: bit.ly/machinefriend

喜欢作者?与凯西·科兹尔科夫联系

让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格联系。

影响数据科学的 10 大最佳实践

原文:https://towardsdatascience.com/10-best-practices-for-data-science-with-impact-d5f4e0525d9f?source=collection_archive---------23-----------------------

或者…如何不在数据科学上失败

Photo by Vlad Hilitanu on Unsplash

Gartner 在 2018 年预测,到 2022 年,85%的数据科学项目将会失败。这种类型的统计数据不是唯一的。经济学家发表了一项研究,该研究得出结论,尽管 70%的企业高管认为分析“非常”或“极其重要”,但只有 2%的人表示他们已经取得了“广泛的积极成果”。

预期和现实之间的这种差异的三大报告原因是:

1.难以定义或框定要解决的问题。

2.提出解决方案或设计的困难。

3.无法将数据科学见解转化为真正改变业务执行方式的行动。

要在数据科学领域取得成功,维护从数据到分析、洞察到行动的链条非常重要。

为了帮助企业弥合从见解到行动的差距,我们专注于一项使命,不仅帮助企业 成功 ,而且帮助企业 在数据科学和人工智能领域引领

这些见解基于与 100 多家客户的合作,涵盖了从金融、能源、医疗保健等几乎所有行业。

这些客户处于其旅程的任何阶段,无论他们是建立数据科学实践、培养和提高其数据科学能力,还是对已经成熟的数据科学组织进行现代化和创新。通过这次经历,我学到了在数据科学领域取得成功的 10 大基本最佳实践。

最佳实践 1:从快速成功的用例开始,以获得业务认同

什么类型的用例会带来快速的成功?是当你设想一个数百万美元的机会时,还是当你有万亿字节的数据,你怀疑有隐藏的金块要发现时?两者都不是——要在 6–12 周内获得立竿见影的效果,您需要针对具有 3 个基本特征的用例:

1。愿意拥有成功的商业冠军。支持者对于验证用例的业务意义,以及从更广泛的业务和执行层面获得认同至关重要。

2。明确 KPI 以衡量结果的业务影响。这些对于向业务涉众展示你的项目的可测量的前后业务影响是必不可少的。

3。可用、可访问和干净的数据。速赢必须快速展示业务成果,以保持业务兴趣—如果您的数据存在质量或可用性问题,您就有可能将速赢变成数据清理工作。

最佳实践 2:创建有效的数据科学组织和团队

虽然有几种数据科学组织结构是可能的,但我们已经看到了轴辐式模型的大量成功。在这里,该中心由首席数据官领导的中央数据科学卓越中心(CoE)组成。辐条是卫星数据科学团队,位于各种业务职能部门,如营销、财务等。在这种结构中,中央 CoE 有创新的自由,同时与辐条合作,为相关的业务用例将新的创新引入市场。

高效的数据科学团队拥有跨职能的人才和赞助商。项目负责人不仅来自数据科学卓越中心,还来自业务线和 IT 部门。我们看到的最大错误之一是在数据科学项目所有权中忽视 IT——早期 IT 参与是避免陷入概念验证(POC)困境的关键。有效的数据科学团队倾向于为项目分配小组,组长是经验丰富的数据科学家或工程师,小组成员由数据科学家、数据工程师、可视化专家、架构师和数据科学故事讲述者组成。如果你有一个初出茅庐的数据科学组织,根据需要外包以补充你的团队,从而获得最大的影响。

最佳实践 3:选择合适的工具和指标来匹配工作

计划您是否需要用于编码的工具,或者可视化建模,或者两者都需要——如果您的团队刚刚起步,可视化工具可能更合适,但是如果您有高级数据科学家,他们可能更喜欢使用 Python 等语言。或者,也许您的团队需要在单一环境中涵盖这两个群体的工具。规划一个适合您公司战略的基础架构,例如,您是需要一个多云基础架构还是留在防火墙后面。规划您需要扩展的数据量和速度,或者所需的计算能力。思考适合您要实现的目标的方法和算法——例如,您需要自定义算法,还是现成的就足够了?

就指标而言,选择正确的指标将数据科学结果与业务目标联系起来非常重要。例如,预测算法的性能通常以均方根误差(RMSE)来衡量,但是根据相关的业务目标,对数均方根误差的度量可能会获得更好的结果。另一方面,对于优化算法,指标通常是业务 KPI,如成本或收入。

将数据科学指标转化为业务指标并估算投资回报(ROI)非常重要。许多数据科学家犯了一个错误,他们根据数据科学指标向高层报告了他们的成功。告诉你的商业利益相关者你的算法的 RMSE 提高了 50%,对那个人来说是没有意义的。相反,请确保将此转化为业务 KPI,如对成本、利润或客户服务水平的影响。

最佳实践 4:尽早构建业务利益相关者 POC 仪表板

尽早构建业务利益相关方 POC 仪表板是获得业务认同的关键。要做到这一点,让商业利益相关者参与到设计思维研讨会中来开始你的项目。在此会议期间,就项目产生的仪表板而言,围绕对他们有意义的内容勾画想法并进行头脑风暴。然后,快速构建 POC 仪表板,它不需要是最“设计”或最复杂的仪表板,即使可视化技能有限的人也可以使用现有的无代码仪表板工具来实现这一目的。在你的仪表盘中,一定要包括业务投资回报的视觉效果,以及 之前与 之后的情景分析。

最佳实践 5:广泛而频繁地沟通

通过频繁的项目进度审查建立持续的业务认同。在这些回顾中,让你的商业利益相关者来引导陈述。避免展示代码,而是使用 POC 仪表板以业务语言展示结果。

或者,创建可分享的故事,用商业语言向更广泛的企业宣传项目的目的和愿景。像 Scrollytelling 这样的方法对此特别有效。

最佳实践 6:使用敏捷方法

为了确保持续的进展,实施敏捷数据科学方法。这意味着至少要将你的项目分成 2-3 周的冲刺阶段,在每个冲刺阶段结束时进行冲刺评审,展示所取得的成果,以及敏捷任务计划。邀请所有风险承担者参加冲刺评审和冲刺计划,以减少不确定性,管理风险,获得共识,并控制项目的范围。

最佳实践 7:提前规划灵活的基础设施

数据科学概念验证未能进入现实世界的一个主要原因是,当需要扩展时,所需的基础架构不可用。然后,POC 被束之高阁,直到基础设施被收购,这通常意味着无限期,或者到 POC 被遗忘的时候。因此,请务必尽早让 IT 部门参与进来,以计划您的 POC 将如何在生产中扩展。例如,考虑弹性计算能力、备份环境和提高灵活性的多云方法。

最佳实践 8:在 POC 阶段询问运营问题

在 POC 过程中,找到操作问题的答案,例如您将如何调用您的模型(例如,实时还是批处理)、模型需要调整的频率、数据接收的速率(例如,流式作业还是计划作业)、生产中的数据量以及所需硬件的大小。还要关注最终用户体验,例如确定需要执行建议操作的人员、他们舒适的工作环境,并开始解决任何变更管理需求。

最佳实践 9:制定实施概念验证的计划

从第一天开始就计划如何将 POC 投入生产,并在最终的 POC 冲刺评审中包括生产计划。在 POC 期间,您可能会处理一部分数据—要将 POC 部署到现实世界中,您还需要考虑其他相关的数据要求,例如治理、容量和数据管理员的角色。在 POC 期间,您可能会使用所需基础架构的一个子集。例如,在公共云环境中构建的 POC 可能需要在生产环境中的私有云中运行—通过灵活的环境为这种过渡做好计划。在 POC 阶段,实际工作可能主要涉及数据科学家和数据工程师,而将 POC 投入运行需要开发人员、业务用户和分析师的更多投入。从一开始就让这个扩展团队参与 POC 流程,以获得他们的早期认同。

最佳实践 10:超越洞察和预测,优化行动

传统的商业智能工具提供了对业务状态的洞察,但它们不会帮助您了解未来可能发生的事情,为此,您需要预测性分析。反过来,预测分析可以帮助您了解未来可能发生的事情,但它不会帮助您获得关于如何应对的建议-为此,您需要规定性分析。说明性分析和决策优化的秘方(该术语描述了用于决策解决方案的数学编程和约束编程方法)。这是唯一一种能够考虑成千上万(如果不是数百万的话)同时发生的可能性和业务限制之间的多种权衡的技术,并且能够推荐未来的下一个最佳行动或计划。

举一个简单的例子来说明这一点,考虑一家公用事业公司更好地规划其运营的决策,无论是与发电、市场动态还是其分销网络有关。在可再生能源的情况下,预测分析将根据可用容量和天气模式通知他们可以产生多少能量。它不会推荐他们应该产生多少能量——为此他们需要决策优化。预测分析将告知他们市场价格可能如何演变,但它不会建议他们 应该 通过合作伙伴购买或出售多少能源——这来自决策优化。预测分析将告知他们能源需求可能如何随时间演变,但不会建议他们 应如何 规划其基础设施,以应对不断变化的需求和气候变化的不确定性——为此,他们再次需要决策优化。

要真正从洞察、预测到更好的决策,探索决策优化能为您的企业带来什么。

您 应用了哪些最佳实践来从您的数据科学工作中获得更多?请评论!

指导你在新加坡寻找数据科学工作的 10 张图表

原文:https://towardsdatascience.com/10-charts-to-guide-your-search-for-a-data-science-job-in-singapore-e4e3be9f1135?source=collection_archive---------13-----------------------

银行薪酬最高,大多数职位都在其中。雇主大多在寻找有经验的雇员。

Top technical skills requested by employers hiring for data science jobs in Singapore. The size of the boxes in this simple tree map is proportional to the number of times these key words appear in job requirements posted by employers.

数据科学相关的职位是目前市场上谈论最多的工作之一,这是由行业内的传言和各种公司不断增长的需求推动的。

以下是 812 份最近的招聘启事告诉我们新加坡的雇主想要什么,以及求职者应该期待什么。

背景

2019 年 4 月 27 日,作为课堂作业的一部分,我刮了政府的就业银行 MyCareersFuture 。这是我的项目回购的链接,但请注意,有些链接可能已经过期,因为职位发布有一个有限的保质期。

在剔除了离群值和在网络搜索中发现的奇怪角色后,我将数据集缩减到 812 个职位条目,这并不总是精确的。几家公司也公布了年薪数据,我把这些数据转换成了月薪。

摘要

简而言之,雇主主要寻找有经验的数据科学专业人员,他们也了解业务需求,并能领导团队。这些高级职位薪酬较高,尤其是在银行业和 IT 行业。

经验丰富的数据专业人士——尤其是高级数据科学家——将从当前的就业市场前景中获得最大收益,而那些几乎没有或根本没有经验的人应该降低他们的期望。入门级和初级数据专业人员的月薪预计不到 5000 新元。

担任高级数据职位的薪酬中值超过 8000 新元,尽管有些公司愿意为顶级人才支付更高的薪酬。让我们仔细看看主要趋势。

一、工作在哪里(以及高薪):

1.月薪中位数:6750 新元

在某些情况下,一些希望填补高级职位空缺的雇主准备支付超过 2 万新元。但数据专业人士的月薪中值更低,为 6750 新元。大约三分之一(35%)的公司提供的平均工资在 4,50 至 7,500 新元之间。

2.IT 行业银行薪酬最高,数据工作最多

银行和金融部门的数据工作提供最好的中等工资,而大多数空缺职位(40%)在 IT 部门(也提供有竞争力的工资)。

The middle “line” in each box represents the median value for that category. For a good explanation on how to interpret box plots, see: https://www.wellbeingatschool.org.nz/information-sheet/understanding-and-interpreting-box-plots

在招聘数据职位的公司中,星展银行提供的薪酬中位数最高,紧随其后的是安永会计师事务所和印度尼西亚旅游预订网站 Traveloka。

如果你对工作地点很挑剔,那么,你会很高兴地知道,CBD 和滨海湾的热门办公地点是一些薪酬最高的数据工作的所在地。

那些有合适技能并准备去西部稍远一点的科学园大道的人会发现默克公司和强生公司提供的两个高薪职位。

二。雇主在寻找什么:

1.招聘:数据科学家,数据工程师

这是 812 份招聘启事中最常见的两个职位,尽管它们只占启事的 10%。这主要是因为在这个行业中,描述同一个角色的头衔有各种各样的混乱方式。

2.经验、商业知识、管理技能

“数据”是公司描述潜在雇员职责时最常用的词。

但在那之下,最常用的关键词是:业务、团队工作(显示为两个独立的词)、管理、解决方案、团队等。这与业内人士的非正式反馈是一致的,即公司不仅仅想要数据专家,还想要那些能够将他们的专业知识转化为业务需求的人。

当谈到工作要求时,雇主最常使用的词是“经验”,其次是“技能”和“知识”。

这对新来者来说可能是一个潜在的绊脚石,尽管在一个非科技或 STEM 行业出身的人大量交叉的行业,“经验”可以有某种程度的宽泛解释。

3.技术要求:Python,SQL,计算机科学背景,工程技能

令人惊讶的是,用来描述技术技能的术语并不在十大需求之列。它们只出现在数据科学角色工作要求中使用的前 20 个关键词列表中。在我的数据集中,“工程”是最顶级的技术技能术语,其次是“Python”、“分析学”、“计算机科学”和“SQL”。

引用更高级技能的术语,如“机器学习”和“大数据”,出现在列表的更靠后的位置,尽管仍在职位要求描述中最常用的 50 个词之列。“深度学习”不在关键词的前 50 名之列,这反映了它在新加坡就业市场的相对利基地位。

A side-by-side comparison of the top words used to describe job responsibilities and desired technical skills in data roles.

求职者应该知道的:

1.经验是你的主要财富

很明显,那些有更多经验的人会要求更高的报酬。但是有经验和没有经验的雇员之间的工资差距的视觉确认和感觉总是好的:

2.对那些“处于中间”的人来说,良好的工作流动性

处于中间位置的数据专业人员——有一些年的经验,但还不被认为是老手——会为大多数空缺职位(几乎 74%)都是中级职位而欢呼。这将为初级数据专业人员提供晋升的机会,对于那些已经处于中间类别的人来说,他们可以在不同的部门之间横向移动,或者晋升到高级职位。

3.如果你是新人,管理你的期望

上面的两张图表显示了为什么新人需要对他们的求职和薪水期望持现实态度。在 812 个数据职位空缺中,只有 90 个(11%)是初级或入门级职位。工资中位数自然也是最低的,每月不到 5000 新元。

4.实习和临时工作安排很少

数据专业人员需要处理大量的敏感数据。这可能是为什么绝大多数职位空缺都是永久性的,而实习或临时工作的机会很少的一个原因。但很有可能是公司没有正式为这些职位做广告。

这里是这些图表的数据集和我的 Jupyter 笔记本的链接。

为了这个项目,我还必须建立一系列机器学习模型,试图预测的高薪,以及招聘信息中提供的职位的资历。

这项练习有助于磨练我构建和评估机器学习模型的技能,尽管我不认为数据集足够大或足够细,可以产生远远超出我们从这些图表中所能辨别的主要见解。但是将这些模型应用到一个更大的数据集会很有趣,如果我将来能得到一个的话。

同时,祝你找工作好运!

源链接:

Github 回购

原始数据来源

11 场数据科学竞赛让你磨练 2020 年的技能

原文:https://towardsdatascience.com/10-data-science-competitions-for-you-to-hone-your-skills-for-2020-32d87ee19cc9?source=collection_archive---------5-----------------------

这里有一个网站列表,供您练习数据科学技能并参加在线黑客马拉松和竞赛

Photo by Max Duzij on Unsplash

数据科学家大多从事理论工作,并亲自对数据进行实验。在现实世界中处理数据之前,他们很少有机会实践。数据科学竞赛和平台为数据科学爱好者提供了一个在解决现实生活问题时进行互动和竞争的平台。

数据竞赛有多种用途。最大的好处之一是,它们是学习最佳实践、积累工作反馈和提高技能的绝佳场所。他们也可以作为解决问题和集思广益的渠道,探索大问题的众多众包解决方案。

此外,数据竞赛是一个在各种数据相关领域的最优秀和最聪明的人中拓展边界和鼓励创造力的机会。您获得的经验非常宝贵,有助于您了解寻找大数据可行解决方案的过程。

这里有 10 个数据竞赛供您尝试,从数据可视化到数据分析,以及介于两者之间的一切。

1.Bitgrit

Bitgrit 是去年 8 月推出的数据科学竞赛领域的新成员。该平台由日本初创公司 Bitgrit Inc. 牵头,已经在全球积累了超过 25,000 名数据科学家的社区。

自成立以来,Bitgrit 已经举办了几场人工智能比赛,包括一场预测外汇汇率的比赛和另一场为一款匹配个人资料的移动应用程序优化算法的比赛。他们还有一个工作委员会,专注于为各种全球客户提供数据科学工作机会。

有关他们的竞争和行业更新的更多信息,请查看他们的在线数据科学出版物。

2.卡格尔

Kaggle 是一个伟大的,如果不是最好的数据科学平台的话。它让每个人都有机会进入世界上最大的数据科学社区。

Kaggle 使数据科学家和其他开发人员能够托管数据集,参与机器学习竞赛,并编写和共享代码。这是一个众包平台,旨在吸引、培养、培训和挑战来自世界各地的数据科学家,以解决数据科学、机器学习和预测分析问题。

Kaggle 上发布的数据科学问题的类型可以是任何东西,从试图通过检查患者记录来预测癌症的发生,到分析电影评论引起的情绪以及这如何影响观众的反应。在 Kaggle 上举办的竞赛产生了深远的影响,例如加强和实现了最先进的艾滋病毒/艾滋病研究,并改善了交通预测。从根本上说,Kaggle 为公司提供了从世界上最好的数据科学家那里寻求解决方案的机会,并让外部的眼睛来看待他们试图解决的问题。

如果你之前从未参加过任何数据科学竞赛,我强烈推荐你从 Kaggle 开始。对于刚刚尝试进入数据科学领域的初学者来说,这是一个绝佳的地方。现在就上 Kaggle,参与发人深省的项目,并与行业领袖和博学的专家进行富有洞察力的讨论。

3.国际数据分析奥林匹克竞赛(爱达荷州)

IDAO 是高等经济学院和 Yandex 举办的年度比赛。本次活动对所有团队和个人开放,无论他们是本科生、研究生还是博士生、公司员工、研究人员或新数据、科学家。

目的是弥合机器学习模型日益增长的复杂性和行业性能瓶颈之间的差距。参与者不仅要努力提高预测的质量,还要设计资源高效的算法。

这将是一场团队机器学习比赛,分为两个阶段。第一阶段将在网上进行,向所有参与者开放。第二阶段将是线下现场决赛,来自线上的30 强表演团队将在 Yandex 莫斯科办公室展开角逐。

在线比赛将于 2020 年 1 月 15 日至 2 月 11 日开始,请在您的日历上做好标记,并在此注册!

4.驱动数据

DrivenData:社会公益数据科学竞赛是一项在线挑战,通常持续 2-3 个月。在这里,全球数据科学家社区竞相提出最佳统计模型,以解决困难的预测问题,从而有所作为。

DrivenData 为一些世界上最大的社会挑战和承担这些挑战的组织带来了数据科学和众包方面的前沿实践。他们举办机器学习竞赛,帮助非营利组织、非政府组织、政府和其他社会影响组织使用数据科学为人类服务。

DrivenData 的部分使命是让数据科学家和非营利组织能够从这些竞赛中所做的工作中学习。为此,获胜者提交的代码在开源许可下发布,供其他人学习、使用和修改。

在他们的博客上阅读更多关于 DrivenData 的信息。

5.顶部编码器

Topcoder 是一个全球性的、随需应变的设计师和技术专家网络的所在地。他们帮助各种规模的企业快速设计和构建令人惊叹的数字解决方案。

Topcoder 类似于 Coda Lab,因为它也是编译代码测试和研究的合作成果。他们在自己的主网站上面临着各种各样的挑战和竞争,从数据科学到编码再到网页设计。其中许多提供了不错的奖励,尽管有些只是为了挑战。

最吸引人的是一年一度的 Topcoder 公开赛,即“终极编程和设计锦标赛”它的特点是一系列的比赛,如算法,开发,用户界面设计和质量保证。最初的比赛是在线的,获胜者可以获得积分,从而获得额外的奖品和一次在美国举办的 TCO 总决赛之旅。

TCO 也有更小的地区性活动,让更多人参与竞争。这些活动只有一两天,但提供了更多参与国际活动的机会。

点击了解更多关于 TCO 2020 的信息。

6.Codalab

用于计算研究的开源平台。举办竞赛是为了合作研究和代码测试。虽然他们不提供有声望的奖励,但他们一起工作来创造更有效和可复制的代码。Coda Lab 的主要特点是数据的编程和代码构建,可以成为你涉足合作项目和挑战的好方法。

7.DataHack 和 DSAT

DataHack 是由 Analytics Vidhya 创建的一个平台,它是机器学习、人工智能和数据科学爱好者的最大社区之一。如果你还不知道,他们的博客对新手和专家来说都是惊人的。从学习路径到在线课程,它应有尽有。

这个平台基本上允许您在现实生活的数据科学问题上与世界上最好的人竞争,通过解决现实世界的问题来学习,展示您的专业知识并被顶级公司聘用,建立您的个人资料,并在竞争中名列前茅并赢得丰厚的奖励。

AV 中另一个很酷的平台是数据科学能力倾向测试( DSAT )。它测试 ML 算法的实践知识技能、Python 和其他 DS 工具的编程技能、神经网络架构、对统计和常用概念(如概率分布、人口统计、抽样方法等)的理解、定量能力——处理数字的能力、对业务问题规模的快速估计、线性代数等。和沟通技巧,这些问题可以测试你的书面沟通,并提供具体的反馈。

8.机器黑客

Machine Hack 是一个机器学习竞赛的在线平台。他们处理最棘手的商业问题,现在可以在机器学习&数据科学中找到解决方案。

在 Machine Hack,你可以测试和练习你的 ML 技能。在这个平台上,您有机会通过我们行业策划的黑客马拉松与数百名数据科学家竞争。另一个好处是,公司可以发现和评估有才华的数据科学家,这意味着如果你表现出色,公司将雇用你。还有一个论坛供你分享你的想法和寻求专家的帮助。

此外,如果你觉得自己还没有完全准备好接受挑战,Machine Hack 有一个专门的地方供你练习 ML 技能。它还有一个社区贡献部分,超过 10,000 名数据科学家和机器学习开发人员在这里写下他们的经验、教程、黑客和演练,以帮助这个不断增长的社区。

9.铁即

Iron Viz 是一个数据可视化竞赛,让你有机会与来自世界各地的数据明星竞争。一系列资格赛的获胜者将晋级冠军赛,这是一场在 Tableau Conference Europe 或 Tableau Conference 举行的现场比赛。在新奥尔良举行的 2018 Tableau 会议上,重温 Iron Viz 锦标赛的精彩比赛。

它的工作原理是参与者必须下载 Tableau 桌面,并用它来创建您的可视化。然后,通过 Tableau 公共配置文件,他们可以使用美联社提供的数据集发布他们的可视化效果,并可以选择与您选择的任何公共数据集相结合。这个比赛需要使用 Tableau 环境,这是鼓励人们使用它的一个很好的方式。

阅读这篇博客这里了解更多!

10.数据科学挑战

数据科学挑战是一项挑战,旨在寻找数据科学领域最聪明的头脑,帮助政府应对巨大挑战,并通过彻底改变我们思考世界问题的方式来保护人民的安全。

想象一场正在出现的人道主义危机,比如埃博拉病毒或毁灭性的地震;一个外国国家的稳定和安全在下降。通过识别、映射和跟踪关键数据,人们可以预测事件将如何发展,并获得人们应该如何反应的关键洞察力。

随着气候变化逼近人类,数据科学也将在开发尖端灵丹妙药方面发挥重要作用。通过参与他们的数据科学挑战,您将为让世界变得更美好做出贡献。不仅如此,您还将与数据科学社区斗智斗勇,与有代表性的国防数据玩游戏,甚至赢得奖品。

在此注册了解数据科学挑战的更新和新闻

11.天池大数据竞赛

天池是一个由全球数据科学家组成的众包社区,举办各行业的大数据竞赛。这个大数据竞赛有百万美元的奖金池和真实的业务测试案例。你有机会与来自世界各地的人工智能精英竞争。

天池也有 TC Lab 可以让你在 3 秒钟内创建自己的 TC Lab,它提供在线编辑和共享,以及免费的计算资源。技术中心在技术中心回答你关于人工智能的问题,你可以得到各个领域专家的互动回答。提供数据集,帮助您探索不同的行业和应用场景。这是唯一一个拥有公共数据共享服务的阿里巴巴平台。

我会说,这次大数据竞赛非常强调电子商务和人工智能领域的消费者行为。举例来说,服装关键点检测-挑战基线、重复购买者预测-挑战基线、阿里云基于行为的恶意软件检测只是平台中活跃的竞争的几个例子。

从这里开始并在 Twitter 上关注他们的更新。

如果你对数据科学竞赛有其他建议,请在下面的评论中留下。感谢阅读,上帝保佑!

在 LinkedIn 和 Twitter 上与我联系。

如果你喜欢你所读的,看看我的数据科学系列!

[## 如何“超级学习”数据科学—第 1 部分

这是一个简短的指南,基于《超学习》一书,应用于数据科学

medium.com](https://medium.com/better-programming/how-to-ultralearn-data-science-part-1-92e143b7257b) [## 数据科学简介

什么是数据科学、大数据、数据、数据科学流程及其应用。

towardsdatascience.com](/the-data-scientists-toolbox-part-1-c214adcc859f)

这里有一些很棒的数据科学资源!

[## 2020 年你应该订阅的 25 大数据科学 YouTube 频道

以下是你应该关注的学习编程、机器学习和人工智能、数学和数据的最佳 YouTubers

towardsdatascience.com](/top-20-youtube-channels-for-data-science-in-2020-2ef4fb0d3d5) [## 机器学习和数据科学的 20 大网站

这里是我列出的最好的 ML 和数据科学网站,可以提供有价值的资源和新闻。

medium.com](https://medium.com/swlh/top-20-websites-for-machine-learning-and-data-science-d0b113130068) [## 开始数据科学之旅的最佳书籍

这是你从头开始学习数据科学应该读的书。

towardsdatascience.com](/the-best-book-to-start-your-data-science-journey-f457b0994160) [## 数据科学 20 大播客

面向数据爱好者的最佳数据科学播客列表。

towardsdatascience.com](/top-20-podcasts-for-data-science-83dc9e07448e) [## 关于人工智能和大数据的 20 大电影。

这里有一些人工智能和大数据电影,你应该在新冠肺炎封锁期间在家观看。

towardsdatascience.com](/top-20-movies-about-machine-learning-ai-and-data-science-8382d408c8c3)

联系人

如果你想了解我的最新文章,请通过媒体关注我。

其他联系方式:

  • 领英
  • 推特
  • GitHub
  • Reddit

黑客快乐!

10 天成为谷歌云认证专业数据工程师

原文:https://towardsdatascience.com/10-days-to-become-a-google-cloud-certified-professional-data-engineer-fdb6c401f8e0?source=collection_archive---------4-----------------------

最近参加了更新的 Google Cloud 认证专业数据工程师考试。为考试而学习是用谷歌云学习数据工程过程的一个很好的方法。

如果你想使用谷歌云产品并且:

  • 是一名数据工程师
  • 想成为一名数据工程师
  • 想建立一家科技公司
  • 是一名数据科学家,希望了解整个数据管道

在这篇文章中,我将分享什么,为什么,以及如何帮助你在考试中尽最大努力。🎯

Aim for the apple.

为什么

让我们先解决为什么的问题。我决定参加谷歌云认证专业数据工程师考试有两个原因。首先,我想了解更多关于数据工程和机器学习的谷歌云产品。第二,我想通过考试,证明我已经掌握了信息。😃

出于几个原因,我选择了谷歌考试,而不是 AWS 和微软 Azure。首先,谷歌在机器学习和人工智能方面是领先的云提供商。如果我要在这个领域创办一家公司,它们也是我会使用的平台。

与其他主要云服务相比,谷歌拥有最清晰的帮助文档和最好的 UX。他们也有最低价格的GPU和最强大的机器用于训练深度学习模型。

此外,谷歌考试有很好的学习材料,我们将在下面深入探讨。这也是一个专业水平的考试,这意味着它很难,但通过意味着最高水平的掌握。最后,专业数据工程师考试在 2019 年 3 月更新,所以我认为它应该比一个更老的,未更新的考试更相关。

如果你是一名数据人员,并且更喜欢 AWS,请参加机器学习和大数据 专业证书考试。每本 300 美元,外加每次模拟考试 40 美元。

如果你对微软 Azure 感兴趣,他们有两个考试必须通过才能获得认证:Azure 数据工程师助理称号。Azure 考试的修改日期是 2019 年 6 月 21 日。

学习计划

作为背景,我使用过许多谷歌云产品,但在开始准备考试之前,我不知道 BigQuery 和 Bigtable 之间的区别。我也没有做过多少数据工程工作。

这不是一两天就能应付的考试。我怀疑几乎没有人不好好学习就准备参加这个考试;谷歌产品及其选项的数量变化如此之快。

以下是我用来准备考试的资源。下面的格式是受丹尼尔·伯克的有用帖子的启发,我用它来指导我的学习计划。

Linux 学院

乐于助人 : 7.5/10

Linux 学院的谷歌云认证专业数据工程师课程内容不错。这门课程有视频、测验、一本清晰图表电子书和一次期末考试。Linux 学院提供免费的 GCP 实践时间。它还有一个有用的社区 Slack 频道。

我在学习的时候记了很多笔记——其中大部分来自 Linux 学院的视频。

A legal pad before studying.

截至 2019 年 6 月初,该课程没有针对新考试进行更新,因此它没有发挥应有的作用。导师表示,这些资料可能会在 2019 年 6 月下旬全部更新。

Linux Academy 期末考试从谷歌官方实践考试中抽取了一些问题。如果你在 2019 年 6 月中旬参加考试,不要太相信最终的考试结果。测试没有完全更新,实际的考试问题感觉更难。

总的来说,UX 还不错,但是有一些小问题(例如,视频不是全屏就是太小)。

一句话:Linux Academy 是一个很好的基础,但是你可能想等到他们的培训材料更新后再开始为考试学习。

Linux Academy 每月 49 美元,按月付费,7 天免费试用。

Qwicklabs 实验室

乐于助人:5.5/10

快速实验室练习的重点不是考试。我发现这对整体学习来说很好,但如果你想弄清楚你需要为考试学习什么,那就没什么帮助了。

和 Linux Academy 一样,Qwicklabs 提供了一个 Google Cloud 沙盒用于练习。Qwicklabs 在沙盒中检查你的进度,这很好。它没有视频。

UX 没问题。每节课的倒计时有点分散注意力和压力——然而实际的谷歌考试也有倒计时。Qwicklabs 计时器很大——如果它会分散注意力,我建议将窗口的这一部分移到屏幕之外。

Qwicklabs countdown timer example

在做互动练习时,我建议并排设置你的窗口——一个用于教学,一个用于你在 GCP 的工作。

Qwicklabs 的课程可以购买学分。你可以每月花 55 美元购买无限制的 Qwicklabs 套餐。折扣代码可以在 sathish vj 的帖子这里获得。

我建议先做 Linux Academy,然后用 Qwicklabs 多练习。

乌德米

乐于助人:5.5/10

本资源由三个 50 题的带计时器的模拟考试组成。实践考试有一些更新的问题,但仍然有旧的案例研究问题。他们使用了与 Linux academy 相同的 Google 官方实践考试题。几个问题有语法问题。此外,现在有几个问题是不正确的。比如现在有一个 BigQuery ML K-means 算法。

我确实通过考试和复习答案学到了东西。答案是详细的,并链接到源文档。只是不要太相信分数。真正的考试感觉难多了。😄

总的来说,这些考试不是很好,但我发现它们值得花时间和金钱,因为没有什么好的选择。

一次性购买 9.99 美元(价格可能会有变化——我先看到的是 10.99 美元)。

Coursera

谷歌推荐参加 GCP 专业的 Coursera 数据工程、大数据和机器学习。这个专业包括五门 Coursera 课程。我决定不参加,因为它看起来好像没有为修订后的考试更新过——它参考了旧的考试案例。事后看来,我会选择这些课程,因为它们看起来相当全面。

官方实践考试

乐于助人:5.5/10

谷歌官方实践考试在网上是真实考试的迷你版。问题是最相关的;我只是希望有更多这样的人。如上所述,其他一些人也在他们的模拟考试中使用这些问题。

你必须填一张表格来参加模拟考试,但是它是免费的。

其他好资源

这里是我用来准备考试的小抄、博客帖子和其他资源。

  • 特立独行的林的小抄在这里很好,但是在三月考试前刷新。
  • 广 X 的这里的是预更新的考试。
  • Dmitri Lerko 的帖子这里反映了更新后的考试。
  • Chetan Sharma 的帖子这里也反映了更新的考试。
  • 官方的谷歌云文档内容丰富。你肯定想花些时间给他们做笔记。不是所有的最新材料都在考试中,但学习这些都很有好处。😃例如,下面是 BigQuery 文档。
  • 谷歌云官方博客是这里。值得花一些时间来帮助你理解你可能会觉得有挑战性的话题。

So many things learn!

你还有其他有用的资源吗?请在评论中分享或在 Twitter @discdiver 上发给我。

我发现一件不必要的困难是确定学习材料的更新程度。为了让这变得更容易,我向谷歌建议,他们应该对他们的认证考试进行版本化——就像大多数软件遵循语义版本化一样。像 1.1 这样的版本标签可以使培训材料提供者很容易地指出他们的材料与哪个测试版本相匹配。这可以节省考生的时间,避免挫败感。如果你认为这是一个好主意,请告诉谷歌。你可以发推特给他们 @ GCPcloud 。😃

不管怎样,我一般都考得很好,并且对自己自学的能力很有信心。如果你不喜欢自学,并且你的预算允许,你可能想参加面授课程。

现在让我们转向测试。

考试

考试由 50 道选择题组成。你有两个小时来完成它。您可以标记问题供以后查看,并在提交测试之前重新查看所有问题。

有传言说你需要 70%左右的正确率才能通过考试。然而,没有官方公布的及格分数。谷歌称:

1.并非所有问题都可以评分。

在任何给定的时间,我们考试中的一小部分问题可能是未评分的。这些是新开发的问题,正在对其有效性进行评估。这是测试行业的标准做法。

2.通过考试所需的分数是保密的。

每次考试的及格分数是保密的。它由内部和外部主题专家小组按照行业公认的标准制定流程确定。及格分数平等地适用于所有考生。当考试内容发生变化时,会重新评估。

你永远不知道你的分数,只知道你是否及格。如果你通过了测试,你的认证有效期为两年。

考试将花费你 200 美元。如果你没有通过,你可以在 14 天后再花 200 美元参加考试。如果你第二次没有通过,你需要等 60 天,然后再付钱。

下面是官方测试概述。

What do you see in the crystal?

如何知道自己准备好了?

如果你决定学习谷歌云认证专业数据工程师考试,很难知道你什么时候准备好参加考试。这很棘手,因为很少有好的测试模拟,你甚至不知道你需要通过什么!

就像生活中的大多数事情一样,练习增加了你表现出色的机会。尽可能多地参加模拟考试,并查看结果。您希望确信自己了解概念、陷阱和最佳实践。

本来打算学习一个月左右,但是决定硬推。第六天我试图报名参加第二天的考试,但是考点已经被预订了。我决定多花几天时间学习,并在周末与家人一起度过。

我结束了 10 天相当紧张的学习,中间休息了几天。我觉得考试那天准备得还不错。我没有记住每个资源的每个 IAM 角色,但是我对关键产品的最佳实践有很好的理解。

测试体验

你在考试中心的电脑上参加考试。你必须把你的电话和其他个人物品交给监考人。测试过程中你会被录像。其他人可能会在同一个房间参加其他考试。

提供耳塞、草稿纸和铅笔。这听起来很傻,但是如果你不戴耳塞,你可能想提前练习一下。我建议你不要按开始,直到他们牢牢地在你的耳朵里。

Ears.

我已经知道考试会很难。这比我想象的要难多了。这感觉是我参加过的最难的考试,我参加过 SAT、ACT、GMAT、GRE、LSAT 和几个认证考试。不管怎样,这是我第一次参加云提供商的考试。

测试很难,原因有几个:

  • 材料的广度是巨大的。谷歌有很多产品,每个产品都有很多潜在的问题,它们是如何协同工作的。有超过 200 个谷歌云 API。这个考试没有涵盖全部,但是涵盖了一堆。
  • 该考试还测试您对与 Google 产品相关的几个 Apache 开源产品的了解。
  • 甚至不清楚到底有多少谷歌产品会参加考试,因为新产品总是在增加,产品总是在变化。
  • 问题通常是多行的,需要考虑多个变量和高度集中。
  • 有些问题需要多个答案(如果需要多个答案,则指定答案的数量)。
  • 很多回答都有些正确。你需要选择最佳答案。

考试将在多个方面测试你。当我参加考试时,我只是努力保持注意力集中,不让自我怀疑的声音进入我的脑海。

在我第一次做完这些问题后,我还有大约 30 分钟的时间。我标记了七个答案来复习。复习完后,我有 10 分钟的空闲时间。我点击了提交知道我已经尽了最大的努力,筹码会落在他们可能落的地方。

Poker chips.

在下一个屏幕上,我看到我已经暂时通过了。😃我从学监那里拿了我的东西,然后出去了。

第二天我收到了谷歌发来的邮件,我已经正式通过了。它包括一些免费赠品的代码。我本来更喜欢一个不太贵的测试,但现在我感到有些尴尬。

我计划在未来的一篇文章中写关于 Google 工具的数据摄取、处理、存储和机器学习。跟随 me 确保你不会错过。现在我来提一下考试上没看到的。

我没看到的是

  • 我想问多少问题就问多少。各种模拟考试都有一堆。
  • 关于确切产品成本的问题。只要知道什么是有意义的,如果你对成本更敏感或不太敏感。
  • Firestore 问题。
  • AI Hub 提问。
  • 很多 ML 概念题。我参加测试时比谷歌数据库产品更了解 ML 概念,所以这也许解释了为什么测试的这一部分对我来说并不重要。
  • 许多关于代码示例的问题。

包装

如果你想更多地了解谷歌的数据科学和工程产品,并且你有时间投入其中,那么为这个考试而学习是有意义的。这个考试不需要你编写实际的查询或清理数据,所以你需要到别处去发展这些技能。

如果你还不是 GCP 的专业人士,我保证如果你花时间为考试而学习,你会学到很多东西。

在我看来,如果你通过了测试,很好。如果没有,也没关系。不管怎样,你都会学到很多,这是最重要的。😃

It’s the climb.

说到学习,希望这篇文章对你的学习有帮助。如果你有,请分享到你最喜欢的社交媒体频道。👍

我帮助人们了解云计算、数据科学和其他技术主题。如果你对这些感兴趣,可以看看我的其他文章。

学习愉快!📙

11 个免费工具,让您轻松、快速地开始数据可视化。

原文:https://towardsdatascience.com/10-free-tools-to-instantly-get-started-with-data-visualisation-d7fadb5f6dce?source=collection_archive---------0-----------------------

使用这些简单直观的工具,直接进入数据可视化流程。

Photo by rawpixel.com from Pexels

#编辑:自 2020 年 10 月起,MyHeatMap 和 OpenHeatMap 不再有效。

不要单纯的展示数据,用数据讲一个故事!

是的,我们有数据和见解,现在怎么办?显然,下一步将是与人们交流这些发现,以便他们能够采取必要的行动。传达 数据的最有效方式之一就是通过讲故事。但是要成为有效的故事讲述者,我们需要把事情简单化,而不是复杂化,这样分析的真正本质才不会丢失。

当谈到讲故事和观想时,有许多工具可供选择。有些是免费的,有些是付费订阅的。有些简单直观,但缺乏交互性,而有些复杂,需要一点努力才能开始。

如果你刚刚开始数据可视化,没有艺术或图形设计经验,不想编码,想立即开始制作图表或地图,那么这篇文章就是为你准备的。除了 Tableau Public、PowerBI 和 Google Charts 等在数据科学生态系统中非常常用的流行工具之外,本文还试图揭示其他工具。

因此,这里有11 个免费可用的工具,让初学者立即开始构建漂亮的视觉效果。

所有这些数据可视化工具都是免费的,但如果你想升级和访问更多选项,尤其是云服务,可能需要一个高级版本。

1.数据包装器

Datawrapper 使创建图表&地图变得容易。只需点击鼠标,您就可以轻松创建 choropleth、符号或定位器地图。同样,您也可以根据自己的数据创建图表。这些图表是交互式的,可响应的,可嵌入你的网站。该工具的免费版本面向单个用户,支持每月 10,000 次图表查看。

Datawrapper 主要是为记者构建的,也是由记者构建的。全世界的新闻编辑室都使用 Datawrapper 来构建图表和地图。然而,它对任何人来说都是非常有用的,谁想要可视化伴随他们的文章。该网站还托管了他们名为 CHARTABLE 的博客,在那里他们定期撰写关于数据可视化的最佳实践。

过程

只需从 Excel 或谷歌工作表中复制您的数据。您还可以上传 CSV 文件或链接到 URL 以实时更新图表。只需一次点击,即可从多种图表和地图类型中进行选择。定制和注释图表,使其更加有效。将现成的嵌入代码复制到您的 CMS 或网站中,或将图表导出为图像或 PDF 进行打印。

演示

2.草图

RAWGraphs 是一个开放的网络工具,可以在令人惊叹的 T2 D3 . js T3 库的基础上创建基于矢量的可视化。

RAWGraphs 主要是为设计师和 vis 极客设计的工具,旨在提供电子表格应用程序(如 Microsoft Excel、Apple Numbers、Google Docs)和矢量图形编辑器(如 Adobe Illustrator、Inkscape 等)之间缺少的链接。

RAWGraphs 是高度可定制和可扩展的,接受用户定义的新的定制布局。关于如何添加或编辑布局的更多信息,请访问他们的网站。

过程

RAWGraphs 处理表格数据(例如电子表格和逗号分隔值)以及从其他应用程序(例如 Microsoft Excel、TextWrangler、TextEdit 等)复制和粘贴的文本。基于 SVG 格式,可视化可以很容易地用矢量图形应用程序进行编辑,以便进一步细化,或者直接嵌入到网页中。

只需在 RawGraphs 中插入原始数据,在各种可视化模型中进行选择,然后调整创建的图表并浏览数据。

使用 RAWGraphs 最简单的方法是访问官方应用页面上的最新版本。然而,RAWGraphs 也可以在您的机器上本地运行。按照 G ithub repo 上的说明进行安装。

演示

3.记录

Charted 让您可视化数据并自动创建漂亮的图表。它是由 Medium 的产品科学团队开发的。Charted 被刻意保持简单和易于使用。它不存储、操作或转换数据,因此它不是一个格式化工具。但是,它有几个强大的核心功能:

  • 在所有尺寸的屏幕上都能很好地渲染,包括监视器
  • 每 30 分钟重新获取数据并更新图表
  • 将数据系列移动到单独的图表中
  • 调整图表类型、标签/标题和背景

过程

提供数据文件的链接,Charted 返回一个漂亮的、交互式的、可共享的数据图表。当前图表支持。csv、. tsv. google 电子表格和 dropbox 共享链接。还可以生成 HTML 代码,然后嵌入到网站中。

演示

下载 repo 并运行npm install来安装依赖项。之后就可以跑npm start了。这将在 localhost:3000 上启动一个服务器。或者,也可以在 charted.co 的试用。

4.图表工作室

Chart Studio 是 Plotly 强大的基于网络的在线图表创建工具。它是创建 D3.js 和 WebGL 图表的最复杂的编辑器之一。它有一个免费使用的基本版本。此外,还有付费的企业版和云版。任何人都可以将源代码集成到他们的应用中。

过程

要么拖放数据文件,要么通过 Falcon SQL 客户端连接到 SQL。然后,只需玩提供的选项,并立即获得交互式图表。

演示

5.快速图表

FastCharts 是来自金融时报 DataViz 团队的产品。他们最近软推出了一个公共版本的内部浏览器制图工具,供人们工作和提供反馈。

该工具可用于:
通过简单地将数据直接粘贴到浏览器中制作折线图、条形图和面积图
为图的点和/或区域添加注释
下载 png 和可编辑 SVG

虽然这个工具是为内部使用而设计的,但 FastCharts 也在该业务的其他部分赢得了声誉,因为他们为演示文稿创建图表——这是一个比 Excel 或 Google Sheets 更简单的工具,为用户提供了更专业的带有 FT 品牌的图表。

过程

CSV 或 TSV 格式的任何数据都可以用来创建图表,然后可以根据用户的喜好进一步定制。

演示

这里有一个展示如何在一分钟内制作图表的演示 GIF:

https://fastcharts.io/

6.帕拉弟奥

Palladio 是一款免费的数据驱动工具,旨在轻松可视化复杂的历史数据。该项目旨在理解如何设计基于人文探究的图形界面。帕拉第奥位于历史和设计的交汇处。

使用 Palladio 可以创建四种类型的可视化:

  • 地图视图:将坐标数据转换为地图上的点。
  • 图表视图:让您可视化数据的任何两个维度之间的关系
  • 列表视图:可以排列数据的维度来制作定制的列表。
  • 图库视图:数据可以显示在网格设置中,以便快速参考

过程

任何可以用表格/电子表格格式表示的信息集合都可以使用 Palladio,唯一的要求是所有数据都用包括逗号、分号和制表符在内的分隔值表示。

我们可以粘贴、上传或提供数据链接,以创建新的 Palladio 项目。

演示

7.Openheatmap(不再受支持)

Opeheatmap 是一个非常简单的工具,可以立即将电子表格转换成地图。从绘制一个街区的房价到 twitter 关注者,openheatmap 可以将所有这些转化为交互式可视化,而不涉及任何复杂性。

过程

只需上传你的电子表格或提供谷歌硬盘的链接。如果数据没有问题,接下来您就可以查看您的地图了。您的电子表格应该有一列用于您要映射的位置,一列用于值,如果您想要动画地图,还可以选择一列用于每行的时间。例如:

Source: http://www.openheatmap.com/upload.html

演示

让我们使用 openheatmap 绘制'伦敦地铁站'的地图。

8.我的热图(不再受支持)

MyHeatMap 是另一个可以交互查看地理数据的工具。然而,免费版本只允许用户创建最多只有 20 个数据点的公共地图,这实际上非常少。Myheatmap 输出颜色编码的热图,目标受众非常容易理解。地图上没有杂乱的标记、旗帜、等高线或生长的斑点。此外,使用 myheatmap 创建的热点图完全可以与平移和缩放功能进行交互。

过程

用户只需上传 CSV 格式的地理数据。该文件应包含一个标题行,其中至少有三个字段。其中两个字段必须命名为“纬度”和“经度”,它们对应的列必须包含以纬度和经度表示的地理坐标。

演示

9.图表生成器

Chartbuilder 是一个前端图表应用程序,可以方便地创建简单漂亮的图表。Chartbuilder 是用户和导出界面。Chartbuilder 支持在 Quartz 开发的制图平台 Atlas 上创建所有图表。Chartbuilder 不是数据分析或数据转换工具。它只是以一致的预定义样式创建图表。

过程

将 csv 或 tsv 格式的数据粘贴到 chartbuilder 中,并导出代码以绘制移动友好响应图表或静态 SVG 或 PNG 图表。对于那些对定制图表风格不感兴趣的人来说,托管版本:【http://quartz.github.io/Chartbuilder】就可以了,否则也可以下载并在本地安装。

演示

10.Timeline.js

TimelineJS 是一个开源工具,它使任何人都能够构建视觉上丰富的交互式时间线。初学者只需使用谷歌电子表格就可以创建一个时间表。专家可以利用他们的 JSON 技能创建定制安装,同时保持 TimelineJS 的核心功能。

TimelineJS 可以从各种来源获取媒体。Twitter,Flickr,YouTube,Vimeo,Vine,Dailymotion,Google Maps,Wikipedia,SoundCloud,Document Cloud 等等!

过程

创建时间表是一个简单的过程。提供了一个电子表格模板,需要填写,然后简单地发布内容。然后,所生成的链接可以被嵌入到媒体中或任何网站上需要时间线的地方。该网站有一个很好的 i ntroductory 视频来开始使用 Timeline JS。

演示

时间线将如何在中型博客/网站中呈现的示例。

曼德拉:有目标的一生

[## 嵌入时间线

嵌入时间线

Embedcdn.knightlab.com 时间线](http://cdn.knightlab.com/libs/timeline/latest/embed/index.html?source=0AmNxBKGzRxw8dE9rbThJX0RCUmxheW1oOUMxWEdLd3c&font=Georgia-Helvetica&maptype=TERRAIN&lang=en&height=650)

11.Canva 图形生成器

Canva Graph maker是一款多功能工具,可让您立即轻松地创建漂亮的数据可视化。与其他在线图表制作者不同,Canva 既不复杂也不耗时。没有学习曲线—您将在几分钟内获得一个漂亮的图表,将原始数据转化为既直观又易于理解的东西。

过程

本质上,在 Canva 中创建图表只需 5 个简单的步骤:

  • 选择图形或图表模板
  • 添加您的数据或信息
  • 从我们的库中添加图标或插图
  • 更改颜色、字体、背景等
  • 下载、打印或共享

对于任何类型的用例,都有大量可用的图表类型。有面积图,条形图,比较图,饼状图和其他各种你可以在他们的网站上探索。

演示

这里有一个演示 GIF,展示了如何用 Canva 轻松制作一个非常基本的图表。自己尝试构建更专业、更美观的图表。

结论

数据可视化并不一定很困难或昂贵。编码无疑给了你更多的选择来创建和定制图表,尤其是在数据混乱的时候,但是这些工具在即时数据可视化方面提供了很好的选择。这不是一个详尽的列表,我一直在寻找更多的工具来简化其他人的可视化过程。

你应该知道的 10 个 Git 命令

原文:https://towardsdatascience.com/10-git-commands-you-should-know-df54bea1595c?source=collection_archive---------1-----------------------

使用 Git 节省时间的技巧

在本文中,我们将讨论作为开发人员、数据科学家或产品经理应该知道的各种 Git 命令。我们将看看如何用 Git 检查、移除和整理。我们还将介绍使用 Bash 别名和 Git 编辑器配置来避免 Vim 和节省时间的方法。

如果您对基本的 Git 命令不太熟悉,在阅读本文之前,可以看看我以前的一篇关于 Git 工作流的文章。

[## 学会足够有用的东西

GitHub 项目的 4 个基本工作流程

towardsdatascience.com](/learn-enough-git-to-be-useful-281561eef959)

这里有 10 个需要了解的命令和它们的一些常见标志。每个命令都链接到该命令的 Atlassian 位存储桶指南。

检查东西

让我们先来看看检查变更。

  • [**git diff**](https://www.atlassian.com/git/tutorials/saving-changes/git-diff) —在本地查看所有文件更改。可以附加文件名以仅显示一个文件的更改。📂
  • [**git log**](https://www.atlassian.com/git/tutorials/git-log) —查看所有提交历史记录。也可用于带有git log -p my_file的文件。输入q退出。📓
  • [**git blame my_file**](https://www.atlassian.com/git/tutorials/inspecting-a-repository/git-blame) —在我的文件中查看谁在何时更改了什么。👉
  • [**git reflog**](https://www.atlassian.com/git/tutorials/rewriting-history/git-reflog) —显示本地存储库头的更改日志。有利于寻找丢失的作品。🔎

用 Git 检查东西并不令人困惑。相比之下,Git 为删除和撤销提交和文件更改提供了大量选项。

撤销事情

git resetgit checkoutgit revert用于撤销对您的存储库所做的更改。这些命令可能很难保持正确。

git resetgit checkout可以用于提交和单个文件。git revert仅用于提交级别。

如果您只是处理您自己的本地提交,而这些提交还没有合并到协作远程工作中,那么您可以使用这些命令中的任何一个。

如果您正在协同工作,并且需要中和远程分支中的提交,那么git revert就是您的工具。

这些命令中的每一个都有不同的选项。以下是常见的用法:

  • [**git reset --hard HEAD**](https://www.atlassian.com/git/tutorials/resetting-checking-out-and-reverting) —放弃自最近一次提交以来已暂存和未暂存的更改。

指定一个不同的提交而不是HEAD来放弃自该提交以来的更改。--hard指定丢弃暂存和未暂存的更改。

确保您没有放弃来自您的合作者所依赖的远程分支的提交!

  • [**git checkout my_commit**](https://www.atlassian.com/git/tutorials/undoing-changes) —丢弃自 my_commit 以来未暂存的更改。

HEAD通常用于my_commit来放弃自最近一次提交以来对本地工作目录的更改。

checkout最适合用于本地撤销。它不会弄乱您的合作者所依赖的远程分支的提交历史!

如果使用分支而不是提交来使用checkout,那么HEAD会切换到指定的分支,并且工作目录会更新以与之匹配。这是checkout命令更常见的用法。

  • [**git revert my_commit**](https://www.atlassian.com/git/tutorials/undoing-changes/git-revert)—撤销 my_commit 中更改的效果。revert 在撤销更改时进行新的提交。

revert对于协作项目是安全的,因为它不会覆盖其他用户分支可能依赖的历史。

revert is safe

有时,您只想删除本地目录中未被跟踪的文件。例如,您可能运行了一些代码,这些代码创建了许多不同类型的文件,而您不希望这些文件出现在您的 repo 中。哎呀。😏你可以在一瞬间清理它们!

  • [**git clean -n**](https://www.atlassian.com/git/tutorials/undoing-changes/git-clean)—删除本地工作目录中未跟踪的文件。

-n标志用于不删除任何内容的试运行。

使用-f标志实际删除文件。

使用- d标志删除未跟踪的目录。

默认情况下,不跟踪文件。gitignore 不会被删除,但是这种行为可以改变。

现在您已经知道了在 Git 中撤销事情的工具,让我们再看两个命令来保持事情有序。

整理东西

  • [**git commit --amend**](https://www.atlassian.com/git/tutorials/rewriting-history#git-commit--amend) —将您的暂存更改添加到最近的提交中。

如果没有暂存任何内容,此命令只允许您编辑最近的提交消息。仅当提交尚未集成到远程主分支时,才使用此命令!⚠️

  • [**git push my_remote --tags**](https://www.atlassian.com/git/tutorials/syncing/git-push)—将所有本地标签发送到远程 repo。有利于版本变更。

如果你正在使用 Python 并对你构建的包进行修改, bump2version 会自动为你创建标签。一旦你推送了你的标签,你就可以在你的新闻稿中使用它们了。这是我制作你的第一个 OSS Python 包的指南。跟随 me 确保你不会错过版本控制的部分!

救命,我卡在 Vim 里出不来了!

使用 Git,您可能偶尔会发现自己被扔进了 Vim 编辑器会话。例如,假设您试图在没有提交消息的情况下提交—除非您更改了 Git 的默认文本编辑器,否则 Vim 会自动打开。如果你不知道 Vim,这种情况很糟糕——参见上的 4000+up 投票以及如何摆脱这种情况的答案。😲

Freedom!

下面是您用保存的文件逃离 Vim 的四步计划:

  1. 按下i进入插入模式。
  2. 在第一行键入您的提交消息。
  3. 按下退出键— esc
  4. 输入:x。别忘了冒号。

瞧,你自由了!😄

更改默认编辑器

为了完全避免 Vim,您可以在 Git 中更改您的默认编辑器。以下是带有常用编辑器命令的文档。下面是将默认值更改为 Atom 的命令:

git config --global core.editor "atom --wait"

如果您喜欢 Visual Studio 代码:

git config --global core.editor "code --wait"

假设您已经安装了文本编辑器,现在您可以在其中解决 Git 问题了。耶!👍

我应该注意到 VSCode 有很多很棒的 Git 功能。详情见此处的文档。

为 Git 命令创建快捷方式

如果您在 macOS 上为您的终端使用 Bash,您可以通过向您的添加以下别名来创建 Git 命令的快捷方式。bash_profile

alias gs='git status '
alias ga='git add '
alias gaa='git add -A '
alias gb='git branch '
alias gc='git commit '
alias gcm='git commit -m '
alias go='git checkout '

您可以调整以上内容,为您喜欢的任何 Git 命令创建快捷方式。

如果你没有一个. bash_profile ,你可以用下面的代码在 macOS 上创建一个:

touch ~/.bash_profile

然后打开它:

open ~/.bash_profile

查看更多关于的信息。bash_profile 这里这里。

现在,当你在终端中输入gs时,它和输入git status是一样的。请注意,您可以在您的终端中输入快捷方式后的其他标志。

您也可以创建 Git 别名,但是这需要您在快捷命令前键入git。谁需要这些额外的按键?😉

包装

在本文中,您已经看到了一些关键的 Git 命令,并配置了您的环境以节省时间。现在你有了 Git 和 GitHub 的基础。准备好下一步了吗?

  • 查看这篇 Bitbucket Git 教程以深入了解。
  • 探索这个交互式指南来 Git 分支。分支可能会令人困惑,所以绝对值得一看。🔎
  • 去玩,去学习,去给别人解释不同之处。

我希望这篇 Git 和 GitHub 介绍对你有用。如果你有,请分享到你最喜欢的社交媒体渠道,这样其他人也可以找到它。👏

我写了如何有效地使用 Python、Docker 和其他编程和数据科学工具。如果你对此感兴趣,请关注我,在这里阅读更多。

去干掉他们!😁

一年来训练甘的 10 个教训

原文:https://towardsdatascience.com/10-lessons-i-learned-training-generative-adversarial-networks-gans-for-a-year-c9071159628?source=collection_archive---------1-----------------------

训练生成性对抗网络很难:让我们把它变得简单一些

介绍

一年前,我决定开始我的旅程,进入生成性对抗网络(GANs)的世界。自从我开始对深度学习感兴趣以来,我就一直对它们感兴趣,主要是因为它们可能产生的令人难以置信的结果。当我想到人工智能这个词时,GAN 是我脑海中首先出现的词之一。

Faces generated by GANs (StyleGAN)

但只有当我第一次开始训练它们时,我才发现这种有趣算法的两面性:训练对来说非常困难。是的,在我尝试之前,我从报纸和其他在我之前尝试过的人那里知道这一点,但我一直认为他们夸大了一个本来很小但很容易克服的问题。

我错了。

当我试图创造出不同于传统的 MNIST 例子的东西时,我发现了影响甘斯的巨大的不稳定性问题,随着花在寻找解决方案上的时间增加,这个问题变得极其令人讨厌

现在,在花了无数天研究已知的解决方案并试图提出新的解决方案后,我终于可以说,我至少对我的 GAN 项目中融合的稳定性有了更多的控制,你也一样。我不能承诺给你 10 分钟的解决方案,让你的每个项目都达到完美的收敛(或者用博弈论的话说,纳什均衡),但是我很乐意给你一些提示和技巧,你可以遵循,让你的 GAN 之旅变得更容易一点,不那么耗时,最重要的是,不那么烦人。

甘斯的现状

自从生成敌对网络及其稳定性问题诞生以来,已经进行了大量的研究。现在我们有大量的论文提出稳定收敛的方法,除此之外还有冗长而困难的数学证明。此外,一些实用技术和启发浮出了深度学习世界:我注意到,这些未经证实、背后没有数学思维的技巧往往非常有效,一定不能丢弃。

随着稳定性的提高,生成的图像真实感也有了重大飞跃。你可以看看英伟达的 StyleGAN 和谷歌的 BigGAN 的结果,就能真正了解 GANs 已经走了多远。

Images generated by BigGAN

在阅读并尝试了文献和实践中的许多技巧后,我整理了一份你在训练 GANs 时应该考虑和不应该考虑的建议清单,希望能在这个复杂且有时乏味的主题上拓展你的视角。

1.稳定性和容量

当我开始我的第一个独立 GAN 项目时,我注意到在训练过程中的某个早期点,鉴别器对抗损耗总是变为零,而发电机损耗非常高。我立即得出结论,一个网络没有足够的“容量”(或参数数量)来跟上另一个网络:所以我急忙改变生成器的架构,为卷积层添加更多的滤波器,但令我惊讶的是,什么都没有改变

在进一步探索了网络容量变化对训练稳定性的影响后,我没有发现任何明显的相关性。肯定有某种联系,但它并不像你刚开始时想的那么重要。

因此,如果你发现自己的训练过程不平衡,而且你没有任何网络在能力方面明显超过对方,我不会建议你添加或删除过滤器作为主要解决方案。

当然,如果您非常不确定您的网络容量,您可以查看一些在线架构示例,这些示例用于与您类似的情况。

2.提前停止

你在 GANs 训练中可能遇到的另一个常见错误是,一旦你看到发电机或鉴频器损耗突然增加或减少,就停止训练。我自己也这样做过无数次:在看到损失上升后,我立即认为整个训练都毁了并且归咎于一些不完美的超参数。

后来我才意识到,损失经常随机上升或下降,这并没有什么错。当发电机损耗比鉴频器损耗高得多时,我获得了一些很棒很真实的结果,这是完全正常的。因此,当你在训练过程中遇到突然的不稳定时,我建议让训练进行得更久一点,在训练过程中关注生成图像的质量,因为视觉理解通常比一些损失数字更有意义。

3.损失函数选择

当面对选择用来训练我们的 GAN 的损失函数时,我们应该选择哪个

这个问题在最近的一篇论文中得到解决,在这篇论文中,所有不同的损失函数都进行了基准测试和比较:出现了一些非常有趣的结果。显然选择哪个损失函数并不重要:没有哪个函数绝对胜过其他函数,GAN 能够在每种不同的情况下学习。

Results from the paper: no loss is superior

因此,我的建议是从最简单的损失函数开始,留下一个更具体的“最先进的”选项作为可能的最后一步,因为我们从文献中知道,你很可能以更差的结果结束

4.平衡发生器和鉴别器重量更新

在许多 GAN 的论文中,尤其是一些早期的论文中,在实现部分看到作者对鉴别器的每次更新使用了生成器的两次或三次更新的情况并不罕见。

在我的第一次尝试中,我注意到,在不平衡训练的情况下,几乎每次网络超过另一个时,鉴别器都会出现(损失大幅减少)。因此,读到即使是著名论文的作者也有类似的问题,并实施了一个难以置信的简单解决方案来克服它,给了我信心,让我相信我所做的是正确的。

不幸的是,在我看来,通过不同的网络权重更新来平衡训练是一个非常短视的解决方案。几乎从未改变生成器必须更新其权重的频率,最终成为稳定我的训练的最终解决方案:它有时可以推迟“不稳定性”,但永远无法解决它,直到收敛。当我注意到这个技术的无效时,我甚至试图使它更动态,根据两个网络丢失的当前状态改变权重更新时间表;只是后来我发现,我不是唯一一个试图走这条路的人,和许多其他人一样,我没有成功克服不稳定性。

我只是后来才明白,其他的技巧,稍后在文章中解释,对提高训练稳定性有更大的效果。

5.模式崩溃和学习率

如果你在和 GANs 打交道,你肯定会知道什么是模式崩溃。它包括发生器“折叠”,并且总是为作为输入的每个可能的潜在向量生成单个图像。这是 GAN 训练中一个相当常见的障碍,在某些情况下,它会变得非常烦人

Mode Collapse example

如果你发现自己处于这种情况,我推荐的最直接的解决方案是尝试调整 GAN 的学习速率,因为根据我的个人经验,我总是可以通过改变这个特定的超参数来克服这个障碍。根据经验,当处理模式崩溃时,尝试使用较低的学习速率,并从头开始训练。

学习率是最重要的超参数之一,如果不是最重要的话,因为在训练过程中,即使很小的变化也会导致的剧烈变化。通常当使用更大的批量时,你可以允许更高的学习率,但是根据我的经验,保守一点几乎总是一个安全的选择。

还有其他方法来对抗模式崩溃,如特征匹配迷你批次鉴别,我从未在自己的代码中实现过,因为我总是找到另一种方法来避免这种特殊的麻烦,但如果需要的话,可以随意给予它们一点关注。

6.添加噪声

众所周知,加大鉴别器的训练难度有利于整体稳定性。增加鉴别器训练的复杂性的一个最公知的方法是将噪声添加到真实和合成数据(例如由生成器生成的图像)中;在数学世界中,这应该是可行的,因为它有助于给两个竞争网络的数据分布带来一定的稳定性。这确实是一个简单的解决方案,我推荐尝试它在实践中可以很好地工作(即使它不能神奇地解决你可能遇到的任何不稳定的问题),同时只需要最小的努力来设置。也就是说,我开始使用这种技术,但过了一段时间后就放弃了,转而使用其他一些我认为更有效的技术。

7.标签平滑

实现相同目标的另一种方法是标签平滑,它更容易理解和实现:如果真实图像的标签集是 1,我们将其更改为更低的值,如 0.9。这个解决方案阻止了鉴别者对其分类过于自信,或者换句话说,阻止了依靠非常有限的一组特征来确定图像是真是假。我完全赞同这个小技巧,因为它在实践中表现得非常好,而且它只需要改变你代码中的一两个字符。

8.多尺度梯度

当处理不太小的图像时(比如 MNIST 的图像),你必须查看多尺度渐变。这是一个特殊的 GAN 实现,由于两个网络之间的多个跳跃连接,使得梯度从鉴别器流向生成器,类似于传统上用于语义分割的 U-Net 中发生的情况。

MSG-GAN architecture

多尺度渐变论文的作者能够训练 GAN 直接生成高清 1024x1024 图像,而没有任何特殊障碍(模式崩溃等),而在此之前,只有渐进增长的 GAN 才有可能(Nvidia 的 ProGAN)。我已经在我的项目中实现了,我注意到了更稳定的训练和令人信服的结果。查看文件了解更多细节,并进行尝试!

9.TTUR

当我说两个时标更新规则或 TTUR 时,你可能会认为我指的是 GAN 培训中采用的复杂而清晰的技术,你可能完全错了。它只包括为发生器和鉴别器选择不同的学习速率就这样。在首次引入 TTUR 的论文中,作者提供了收敛到纳什均衡的数学证明,并表明使用不同的学习速率实现著名的 gan(DCGAN,WGAN-GP)实现了最先进的结果。

但是当我说“使用不同的学习率”时,实际上我真正的意思是什么?一般来说,我建议为鉴别器选择一个较高的学习率,为生成器选择一个较低的学习率:这样,生成器不得不做出较小的步骤来欺骗鉴别器,并且不会选择快速、不精确和不现实的解决方案来赢得对抗游戏。举一个实际的例子,我经常选择 0.0004 作为鉴别器,0.0001 作为生成器,我发现这些值在我的一些项目中工作得很好。请记住,使用 TTUR 时,您可能会注意到发电机的损耗较高。

10.光谱归一化

在许多论文中,例如在 SAGAN(或自我关注 GAN)的论文中,显示了谱归一化,一种应用于卷积核的特殊类型的归一化,可以极大地帮助训练的稳定性。最初只在鉴别器中使用,后来证明如果也用在生成器的卷积层中也是有效的,我完全赞同这个决定!

我几乎可以说,在我的 GAN 中发现并实现频谱归一化改变了我的 GAN 之旅的方向,坦率地说,我看不出有任何理由不亲自使用它:我几乎可以保证它将带您进入一个显著更好和更稳定的训练,同时让您专注于深度学习项目的其他更有趣的方面!(详见本文。)

结论

大量的其他技巧、更复杂的技术和架构有望终结 GANs 的训练问题:在这篇文章中,我想告诉你我个人发现并实施的克服我遇到的障碍的方法。

因此,如果你发现自己在了解这里介绍的每种方法和技巧时遇到了困难,那么还有很多材料需要研究。我只能说,在花了无数个小时研究和尝试每一种可能的方法来解决我的 GAN 相关问题之后,我对我的项目更有信心了,我真的希望你也能这样做。

最后,我想真诚地感谢阅读并关注这篇文章,希望你能带着有价值的东西走出去。

非常感谢,祝甘历险记愉快!

每个数据科学家都应该知道的 10 种机器学习方法

原文:https://towardsdatascience.com/10-machine-learning-methods-that-every-data-scientist-should-know-3cc96e0eeee9?source=collection_archive---------0-----------------------

现实世界中的数据科学

快速启动您的数据科学技能

Photo by chuttersnap on Unsplash

机器学习是研究和行业的热门话题,新的方法一直在发展。这个领域的速度和复杂性使得即使对专家来说,跟上新技术的步伐也很困难——对初学者来说更是势不可挡。

为了揭开机器学习的神秘面纱,并为那些不熟悉核心概念的人提供一条学习之路,让我们来看看十种不同的方法,包括每种方法的简单描述、可视化和示例。

机器学习算法也称为模型,是一种数学表达式,表示问题(通常是业务问题)上下文中的数据。目的是从数据到洞察力。例如,如果一家在线零售商希望预测下一季度的销售额,他们可能会使用机器学习算法,根据过去的销售额和其他相关数据来预测这些销售额。类似地,风车制造商可能会对重要设备进行视觉监控,并通过训练有素的算法提供视频数据,以识别危险的裂缝。

所描述的十种方法提供了一个概述,以及一个在您磨练机器学习知识和技能时可以建立的基础:

  1. 回归
  2. 分类
  3. 聚类
  4. 降维
  5. 集成方法
  6. 神经网络和深度学习
  7. 迁移学习
  8. 强化学习
  9. 自然语言处理
  10. 单词嵌入

在我们开始之前还有最后一件事。让我们区分机器学习的两个一般类别:有监督的和无监督的。当我们有一份想要预测或解释的数据时,我们应用监督 ML 技术。我们通过使用以前的输入和输出数据来预测基于新输入的输出。例如,您可以使用监督 ML 技术来帮助服务企业预测下个月将注册该服务的新用户数量。相比之下,无监督 ML 着眼于在不使用目标变量进行预测的情况下关联和分组数据点的方法。换句话说,它根据特征来评估数据,并使用特征来形成彼此相似的项目聚类。例如,您可以使用无监督学习技术来帮助零售商对具有相似特征的产品进行细分,而不必事先指定要使用哪些特征。

回归

回归方法属于监督最大似然法的范畴。它们有助于根据一组先前的数据来预测或解释特定的数值,例如,根据类似物业的先前定价数据来预测物业的价格。

最简单的方法是线性回归,我们使用直线的数学方程( y = m * x + b )来模拟数据集。我们通过计算直线的位置和斜率来训练具有许多数据对 (x,y) 的线性回归模型,该直线使所有数据点和直线之间的总距离最小化。换句话说,我们计算最接近数据中观察值的直线的斜率( m )和 y 截距( b )。

让我们考虑一个更具体的线性回归的例子。我曾经使用线性回归来预测某些建筑的能源消耗(以千瓦时为单位),方法是收集建筑的年龄、楼层数、平方英尺和插墙设备的数量。由于有多个输入(年龄、平方英尺等),我使用了多变量线性回归。原理与简单的一对一线性回归相同,但在这种情况下,我创建的“线”发生在基于变量数量的多维空间中。

下图显示了线性回归模型对建筑实际能耗的拟合程度。现在想象一下,你可以访问一栋建筑的特征(年龄、平方英尺等),但你不知道它的能耗。在这种情况下,我们可以使用拟合线来估算特定建筑的能耗。

请注意,您还可以使用线性回归来估计对最终能耗预测有贡献的每个因素的权重。例如,一旦你有了一个公式,你就可以确定年龄、体型还是身高是最重要的。

Linear Regression Model Estimates of Building’s Energy Consumption (kWh).

回归技术涵盖从简单(如线性回归)到复杂(如正则化线性回归、多项式回归、决策树和随机森林回归、神经网络等)的所有领域。但是不要陷入困境:从学习简单的线性回归开始,掌握技术,然后继续前进。

分类

另一类监督 ML,分类方法预测或解释类值。例如,它们可以帮助预测在线客户是否会购买产品。输出可以是或不是:买方或不是买方。但是分类方法不限于两类。例如,分类方法有助于评估给定图像中包含的是汽车还是卡车。在这种情况下,输出将是 3 个不同的值:1)图像包含汽车,2)图像包含卡车,或者 3)图像既不包含汽车也不包含卡车。

最简单的分类算法是逻辑回归——这使它听起来像一种回归方法,但它不是。逻辑回归基于一个或多个输入估计事件发生的概率。

例如,逻辑回归可以将一个学生的两个考试分数作为输入,以估计该学生被特定大学录取的概率。因为估计值是一个概率,所以输出是一个介于 0 和 1 之间的数字,其中 1 表示完全确定。对于这个学生,如果估计的概率大于 0.5,那么我们预测他或她会被录取。如果估计概率小于 0.5,我们预测他或她将被拒绝。

下面的图表显示了往届学生的分数以及他们是否被录取。逻辑回归允许我们画一条代表决策边界的线。

Logistic Regression Decision Boundary: Admitted to College or Not?

因为逻辑回归是最简单的分类模型,所以它是分类的好起点。随着您的进步,您可以深入非线性分类器,如决策树、随机森林、支持向量机和神经网络等。

使聚集

使用聚类方法,我们可以进入无监督最大似然分类,因为它们的目标是对具有相似特征的观察结果进行分组或聚类。聚类方法不使用输出信息进行训练,而是让算法定义输出。在聚类方法中,我们只能使用可视化来检查解决方案的质量。

最流行的聚类方法是 K-Means,其中“K”表示用户选择创建的聚类数。(注意,有各种选择 K 值的技术,例如肘法。)

大致来说,K-Means 对数据点的作用是:

  1. 在数据中随机选择 K 个中心。
  2. 将每个数据点分配给随机创建的最近的中心。
  3. 重新计算每个聚类的中心。
  4. 如果中心没有变化(或者变化很小),这个过程就结束了。否则,我们返回步骤 2。(为了防止在中心不断变化的情况下陷入无限循环,请预先设置最大迭代次数。)

下一个图将 K-Means 应用于一组建筑物数据。图中的每一列表示每栋建筑的效率。这四项测量与空调、插入式设备(微波炉、冰箱等)、家用燃气和供暖燃气有关。我们选择 K=2 进行聚类,这样可以很容易地将其中一个聚类解释为高效建筑群,而将另一个聚类解释为低效建筑群。左边你可以看到建筑的位置,右边你可以看到我们用作输入的四个维度中的两个:接入设备和加热气体。

Clustering Buildings into Efficient (Green) and Inefficient (Red) Groups.

在探索聚类时,您会遇到非常有用的算法,例如基于密度的带噪声应用程序空间聚类(DBSCAN)、均值偏移聚类、凝聚层次聚类、使用高斯混合模型的期望最大化聚类等。

降维

顾名思义,我们使用降维从数据集中删除最不重要的信息(有时是冗余的列)。在实践中,我经常看到具有数百甚至数千列的数据集(也称为特征),因此减少总数至关重要。例如,图像可能包含数千个像素,但并非所有像素都对您的分析有影响。或者在制造过程中测试微芯片时,您可能需要对每个芯片进行数千次测量和测试,其中许多会提供冗余信息。在这些情况下,您需要降维算法来使数据集易于管理。

最流行的降维方法是主成分分析(PCA),它通过寻找最大化数据线性变化的新向量来降低特征空间的维度。当数据的线性相关性很强时,PCA 可以显著地降低数据的维数,而不会丢失太多的信息。(事实上,您还可以测量信息丢失的实际程度,并做出相应的调整。)

另一种流行的方法是 t-随机邻居嵌入(t-SNE),它进行非线性维数约简。人们通常使用 t-SNE 进行数据可视化,但你也可以将其用于机器学习任务,如减少特征空间和聚类,仅举几例。

下一幅图显示了对 MNIST 手写数字数据库的分析。MNIST 包含数以千计的从 0 到 9 的数字图像,研究人员用这些图像来测试他们的聚类和分类算法。数据集的每一行都是原始图像的矢量化版本(大小为 28 x 28 = 784)以及每个图像的标签(零、一、二、三、…、九)。请注意,我们因此将维度从 784(像素)减少到 2(我们可视化的维度)。投影到二维可以让我们把高维的原始数据集可视化。

t-SNE Iterations on MNIST Database of Handwritten Digits.

集成方法

假设你决定造一辆自行车,因为你对商店和网上的选择不满意。你可以从找到你需要的每个部分的最佳部分开始。一旦你组装所有这些伟大的部分,最终的自行车将胜过所有其他选项。

集成方法使用相同的想法,将几个预测模型(监督 ML)结合起来,以获得比每个模型单独提供的预测质量更高的预测。例如,随机森林算法是一种集成方法,它结合了用数据集的不同样本训练的许多决策树。因此,随机森林的预测质量高于用单个决策树估计的预测质量。

将集成方法视为减少单个机器学习模型的方差和偏差的一种方式。这很重要,因为任何给定的模型在某些条件下可能是准确的,但在其他条件下可能是不准确的。对于另一个模型,相对精度可能是相反的。通过结合这两个模型,预测的质量被抵消了。

绝大多数卡吉尔比赛的冠军都使用某种合奏方法。最流行的集成算法有随机森林、 XGBoost 和 LightGBM 。

神经网络和深度学习

与被认为是线性模型的线性和逻辑回归相比,神经网络的目标是通过向模型添加参数层来捕获数据中的非线性模式。在下图中,简单的神经网络有三个输入、一个具有五个参数的隐藏层和一个输出层。

Neural Network with One Hidden Layer.

事实上,神经网络的结构足够灵活,可以构建我们熟知的线性和逻辑回归。术语深度学习来自具有许多隐藏层的神经网络(见下图),并封装了各种各样的架构。

跟上深度学习的发展尤其困难,部分原因是研究和行业社区已经加倍努力进行深度学习,每天都在产生全新的方法。

Deep Learning: Neural Network with Many Hidden Layers.

为了获得最佳性能,深度学习技术需要大量数据和大量计算能力,因为该方法可以在庞大的架构内自我调整许多参数。很快就清楚了为什么深度学习实践者需要用 GPU(图形处理单元)增强的非常强大的计算机。

特别是,深度学习技术在视觉(图像分类)、文本、音频和视频领域取得了极大的成功。深度学习最常见的软件包有 Tensorflow 和 PyTorch 。

迁移学习

让我们假设你是一名在零售业工作的数据科学家。你已经花了几个月的时间训练一个高质量的模型来将图像分类为衬衫、t 恤和 polos。您的新任务是构建一个类似的模型,将服装图像分类为牛仔裤、工装裤、休闲裤和礼服裤。能否将构建在第一个模型中的知识转移并应用到第二个模型中?是的,你可以,使用迁移学习。

迁移学习是指重新使用以前训练过的神经网络的一部分,并使其适应新的但类似的任务。具体来说,一旦您使用某项任务的数据来训练神经网络,您就可以转移一部分已训练的层,并将它们与一些可以使用新任务的数据来训练的新层相结合。通过增加几层,新的神经网络可以学习并快速适应新的任务。

迁移学习的主要优势在于,你需要更少的数据来训练神经网络,这一点尤为重要,因为深度学习算法的训练在时间和金钱(计算资源)方面都很昂贵——当然,找到足够的标记数据来进行训练通常非常困难。

让我们回到我们的例子,假设衬衫模型使用一个有 20 个隐藏层的神经网络。在运行了几个实验之后,您意识到您可以转移 18 个衬衫模型层,并将它们与一个新的参数层相结合,以在裤子的图像上进行训练。因此,裤子模型将有 19 个隐藏层。这两个任务的输入和输出是不同的,但是可重用层可以汇总与两者相关的信息,例如布料的各个方面。

迁移学习已经变得越来越受欢迎,现在有许多可靠的预训练模型可用于常见的深度学习任务,如图像和文本分类。

强化学习

想象一只老鼠在迷宫中试图找到隐藏的奶酪块。我们把老鼠暴露在迷宫中的次数越多,它就越容易找到奶酪。起初,老鼠可能会随机移动,但一段时间后,老鼠的经验有助于它意识到哪些动作会让它更靠近奶酪。

鼠标的过程反映了我们用强化学习(RL)来训练系统或游戏的过程。一般来说,RL 是一种帮助代理从经验中学习的机器学习方法。通过记录行动并在设定的环境中使用试错法,RL 可以最大化累积奖励。在我们的例子中,鼠标是代理,迷宫是环境。鼠标可能的动作有:向前、向后、向左或向右移动。奖励是奶酪。

当你对一个问题只有很少甚至没有历史数据时,你可以使用 RL,因为它不需要预先的信息(不像传统的机器学习方法)。在 RL 框架中,您可以边走边从数据中学习。毫不奇怪,RL 在游戏方面尤其成功,尤其是像国际象棋和围棋这样的“完全信息游戏。有了游戏,来自代理和环境的反馈很快就来了,允许模型快速学习。RL 的缺点是,如果问题很复杂,可能需要很长时间来训练。

就像 1997 年 IBM 的深蓝打败了人类最好的棋手一样,2016 年基于 RL 的算法 AlphaGo 打败了最好的围棋手。目前 RL 的先驱是英国 DeepMind 的团队。更多关于 AlphaGo 和 DeepMind 的信息请点击这里。

2019 年 4 月,OpenAI Five 团队是第一个击败电子竞技 Dota 2 世界冠军团队的人工智能,这是一个非常复杂的视频游戏,OpenAI Five 团队选择它是因为当时没有能够赢得它的 RL 算法。击败 Dota 2 冠军人类队的同一个 AI 团队也开发了一种可以重新定向街区的机器人手。点击阅读更多关于 OpenAI 五人组的信息。

你可以看出强化学习是一种特别强大的人工智能形式,我们肯定会看到这些团队取得更多进展,但也值得记住这种方法的局限性。

自然语言处理

世界上很大一部分数据和知识是以某种人类语言的形式存在的。你能想象在几秒钟内阅读和理解成千上万的书籍、文章和博客吗?显然,计算机还不能完全理解人类的文本,但我们可以训练它们完成某些任务。例如,我们可以训练我们的手机自动完成我们的短信或纠正拼写错误的单词。我们甚至可以教机器与人类进行简单的对话。

自然语言处理(NLP)本身不是一种机器学习方法,而是一种广泛使用的为机器学习准备文本的技术。想想各种格式的大量文本文档(word、在线博客等等)。).这些文本文档中的大多数都充满了需要过滤掉的错别字、漏字和其他单词。目前,最流行的文本处理软件包是由斯坦福大学的研究人员开发的 NLTK(自然语言工具包)。

将文本映射成数字表示的最简单方法是计算每个文本文档中每个单词的频率。想象一个整数矩阵,其中每行代表一个文本文档,每列代表一个单词。词频的这种矩阵表示通常被称为词频矩阵(TFM)。从那里,我们可以创建另一个流行的文本文档矩阵表示,方法是将矩阵中的每个条目除以每个单词在整个文档集内的重要性权重。我们将这种方法称为术语频率逆文档频率(TFIDF ),它通常更适合机器学习任务。

单词嵌入

TFM 和 TFIDF 是文本文档的数字表示,它们仅考虑频率和加权频率来表示文本文档。相比之下,单词嵌入可以捕获文档中单词的上下文。通过单词上下文,嵌入可以量化单词之间的相似性,这反过来允许我们对单词进行算术运算。

Word2Vec 是一种基于神经网络的方法,它将语料库中的单词映射到一个数字向量。然后,我们可以使用这些向量来查找同义词,对单词执行算术运算,或者表示文本文档(通过取文档中所有单词向量的平均值)。例如,让我们假设我们使用足够大的文本文档语料库来估计单词嵌入。我们还假设单词国王王后男人女人是语料库的一部分。假设向量('字')是表示字'字'的数值向量。为了估计向量(‘女人’),我们可以对向量执行算术运算:

向量('国王')+向量('女人') 向量('男人')~向量('女王')

Arithmetic with Word (Vectors) Embeddings.

单词表示允许通过计算两个单词的矢量表示之间的余弦相似性来找到单词之间的相似性。余弦相似性度量两个向量之间的角度。

我们使用机器学习方法来计算单词嵌入,但这通常是应用机器学习算法的前一步。例如,假设我们可以访问几千名 Twitter 用户的推文。还假设我们知道这些 Twitter 用户中的哪一个买了房子。为了预测 Twitter 新用户买房的概率,我们可以将 Word2Vec 与逻辑回归结合起来。

你可以自己训练单词嵌入,或者获得一组预训练(迁移学习)的单词向量。要下载 157 种不同语言的预训练单词向量,请看一下 FastText 。

摘要

我试图涵盖十种最重要的机器学习方法:从最基础的到最前沿的。很好地学习这些方法并充分理解每一种方法的基础可以作为进一步研究更高级的算法和方法的坚实起点。

当然,还有大量非常重要的信息需要涵盖,包括质量度量、交叉验证、分类方法中的类别不平衡以及过度拟合模型等,仅举几例。敬请关注。

这个博客的所有可视化都是使用沃森工作室桌面完成的。

特别感谢史蒂夫·摩尔对这篇文章的大力反馈。

推特:@ castan LinkedIn:@jorgecasta

本年度 10 大医学创新…是谷歌和微软领先吗?

原文:https://towardsdatascience.com/10-medical-innovation-in-the-current-year-is-google-and-microsoft-taking-the-lead-327d43a89506?source=collection_archive---------15-----------------------

在不久的将来,我们可以期待看到什么样的医学创新?

介绍

2019 年已经过去了将近一半,我希望每个人都度过了美好的一年,没有任何人出现任何严重的健康问题。让我们继续讨论,让我们谈谈医疗行业。

医疗行业总体来说是一个有趣的领域。有许多政府法规和私营企业试图“介入”这一行动以获取利润。那么 2019 年医疗行业有哪些最有前景的技术正在发生?一些科技巨头正在做什么来利用这个行业并渗透到这个领域呢?

为了找到这些问题的答案,我们需要关注克利夫兰诊所的医疗创新峰会,简称 MIS。因为他们刚刚公布了十大医学创新。最后,对于技术部分,我们需要看看谷歌的 2018 年 I/O 峰会,以及来自微软的 Ellie Patient Engagement 和 Care Management。

从列表开始

从底部开始,我们有:

  1. 基于 RNA 的疗法
  2. 二尖瓣和三尖瓣经皮置换和修复(心脏修复)→是的,我不知道这是什么,简单搜索后是关于无创心脏手术的,所以我们就叫它心脏修复。
  3. 机器人手术的创新(机器人手术)
  4. 院前卒中诊断面罩(卒中面罩)
  5. 用于医学教育的虚拟和混合现实(虚拟现实/混合现实)
  6. 通过 3D 打印实现的患者专用产品(3D 打印)
  7. 癌症治疗免疫疗法的进展免疫疗法(利用人体自身的免疫系统来对抗癌症)。
  8. 急性卒中干预的扩展窗口
  9. 人工智能在医疗保健中的出现 ( 人工智能)→ 我是一个超级人工智能迷,所以我对这项创新非常兴奋。
  10. 疼痛的替代疗法:对抗阿片类药物危机→这是一个相当大的问题,我将有一个单独的部分来讨论这个主题。

技术

这个榜单有意思的是,在十大创新中,有五项与技术创新有很强的关联。更具体地说,机器人、人工智能、3D 打印、VR/AR 和遮阳板。

所有这些设备都有一个共同点——它们增强了医生帮助病人的能力。人工智能可以用来直接辅助决策过程。VR/AR 和 3D 打印等其他工具可以用来加快医生的教育过程。

想想上面列举的例子,难怪谷歌和微软等科技巨头会感兴趣。让我们具体看看这些公司计划如何利用这些机会赚钱。现在请注意,虽然我无法涵盖这些公司在医疗保健行业所做的一切,但我希望能让您大致了解一下他们正在开发的产品。

谷歌

从谷歌开始,从他们的 2018 谷歌大会我们知道他们一直在研究一个人工智能系统。人工智能系统基本上是一个从视网膜眼底照片中检测糖尿病视网膜病变的分类器。

这些图像看起来像这样:

这是非常有趣的东西,特别是考虑到这些模型可以部署在农村地区,那里没有足够的医生。今年,谷歌已经表明他们的算法可以执行类似甚至更好的视网膜专家,这在我看来是非常惊人的。

微软

虽然微软在医疗保健行业有多种产品,但我想介绍一种我认为特别有趣的产品。

该产品名为“埃莉患者参与和护理管理”,我将简称为埃莉。虽然 Ellie 是由另一家名为“Get Real Health”的公司构建的,但它是使用微软云技术构建的,因此它确实植根于微软。

这款软件产品与谷歌产品的不同之处在于,它不是一款基于人工智能的产品,而更像是一款面向医生的数据管理软件。现在,我不是说这个产品不会有人工智能的成分。我相信在不久的将来,一些人工智能组件将会出现,因为他们正在收集数据。但目前来看,我认为这不是他们的主要卖点。

当您观看“获得真正健康”的产品视频时,您会意识到他们的卖点是远程患者管理、与患者协作以及增加医疗机构的收入。

虽然我不确定数据隐私是如何得到保护的,但这似乎是一个非常有前途的方向。然而,与数据隐私安全相关的医疗保健法律极其复杂,因此我们将看到该产品如何在未来几年生存下去。

类鸦片

当我们想到阿片类药物危机时,我们倾向于认为这完全是美国的问题。但是根据许多不同的消息来源,阿片类药物过量显然是一个全球性的现象。

例如,我们可以看看加拿大政府发布的关于阿片类药物的联邦行动:

我们可以看到不列颠哥伦比亚省因使用不同药物而死亡的人数最高。虽然我不知道为什么不列颠哥伦比亚省的死亡率最高,但这个省似乎比看上去的要多。

丹麦、挪威和瑞典等欧洲国家似乎也面临着类似的问题。这方面有很多不同的资源,所以对于对这个主题感兴趣的人,我强烈建议他们自己做研究。

关闭

那么哪个创新最让你兴奋呢?你在医疗行业的哪个领域工作?这些创新如何影响你的职业?请在下面留言,我会很感兴趣的。

我个人对医疗行业的 AI 创新感到非常兴奋。如果你们想让我介绍其他话题,请在下面留言。

参考

  1. MIS2018:“十大”医疗创新:2019。(2019).YouTube。检索于 2019 年 7 月 18 日,发自 https://www.youtube.com/watch?v=yVIbfQFlPv0t = 3251s
  2. 克利夫兰诊所公布 2019 年十大医疗创新。(2018).咨询 QD。检索于 2019 年 7 月 18 日,来自https://consult qd . clevelandclinic . org/Cleveland-clinic-unveils-top-10-medical-innovations-for-2019/
  3. 克利夫兰诊所公布 2019 年十大医疗创新。(2018).咨询 QD。检索于 2019 年 7 月 18 日,来自https://consult qd . clevelandclinic . org/Cleveland-clinic-unveils-top-10-medical-innovations-for-2019/

图像

  1. 加拿大不列颠哥伦比亚省。(2019).Flickr。检索于 2019 年 7 月 23 日,来自https://www . Flickr . com/photos/152977080 @ N03/32736012704/in/photostream/
  2. 文件:正常左 eye.jpg 的眼底照片。(2012).Commons.wikimedia.org。检索于 2019 年 7 月 23 日,来自https://commons . wikimedia . org/wiki/File:眼底 _ 照片 _ 正常 _ 左眼. jpg
  3. 文件:克利夫兰诊所 logo.svg —维基共享。(2018).Commons.wikimedia.org。检索于 2019 年 7 月 23 日,来自https://commons . wikimedia . org/wiki/File:Cleveland _ Clinic _ logo . SVG
  4. 克利夫兰诊所公布 2019 年十大医疗创新。(2018).咨询 QD。检索于 2019 年 7 月 23 日,来自https://consult qd . clevelandclinic . org/Cleveland-clinic-universes-top-10-medical-innovations-for-2019/
  5. 推特。(2019).Twitter.com。检索于 2019 年 7 月 23 日,来自https://Twitter . com/Cleveland clinic/status/1055099130001924096
  6. 图片来自 Pixabay 的罗宾·希金斯
  7. 来自 Pexels 的 Vidal Balielo Jr. 照片
  8. 来自 Pexels 的 Alexander Krivitskiy 的照片
  9. 病人右眼的照片显示没有糖尿病视网膜病变的视神经萎缩。沃尔夫拉姆·syndrome.jpg。(2009).Ru.m.wikipedia.org。检索于 2019 年 8 月 4 日,来自https://ru . m . Wikipedia . org/wiki/% D0 % A4 % D0 % D0 % B0 % D0 % B9 % D0 % BB:Photographic _ image _ of _ the _ patient _ right _ eye _ showing _ optic _ atrophy _ without _ diabetic _ retinopathy _ Wolfram _ syndrome . jpg
  10. Pixabay 上的免费图片——微软、微软、Logo、商业。(2019).Pixabay.com。检索于 2019 年 8 月 10 日,来自https://pix abay . com/vectors/Microsoft-ms-logo-business-windows-80658/
  11. 来自 Pexels 的【JESHOOTS.com】T2 的照片

录像

  1. 由 Pexels 的 Suzy Hazelwood 制作的视频
  2. 免费视频-家庭,图片,绘画,儿童。(2019).Pixabay.com。检索于 2019 年 7 月 23 日,来自https://pix abay . com/videos/family-picture-drawing-children-11283/

gif

  1. 狗,我不知道我在做什么。(2019).吉菲。检索于 2019 年 7 月 23 日,来自https://giphy . com/gifs/dog-mechanic-I-have-no-idea-im-do-vxcpgzwep 7 f1 ec

关于网络抓取的 10 个误区

原文:https://towardsdatascience.com/10-myths-about-web-scraping-34824beb5dba?source=collection_archive---------20-----------------------

Photo by Amel Majanovic on Unsplash

许多人对网络抓取有错误的印象。这是因为有人不尊重互联网上的伟大作品,并通过窃取内容来使用它。网络抓取本身并不违法,但是当人们在没有网站所有者的许可和无视 ToS(服务条款)的情况下使用它时,问题就来了。根据该报告,有 2%的在线收入可能会由于通过网络抓取误用内容而损失。尽管网络抓取没有明确的法律和条款来解决其应用,但它包含在法律法规中。例如:

2。网页抓取和网页抓取是一样的

网络抓取涉及对目标网页的特定数据提取,例如,提取关于销售线索、房地产列表和产品定价的数据。相比之下,网络爬行是搜索引擎做的事情。它扫描和索引整个网站及其内部链接。“爬虫”在没有特定目标的情况下浏览网页。

3。可以刮任何网站

经常有人要求搜集电子邮件地址、脸书帖子和 LinkedIn 信息。根据一篇题为“网络抓取合法吗?”在进行网页抓取之前,请务必注意以下规则:

  • 需要用户名和密码的私人数据不能废弃。
  • 遵守明确禁止网页抓取行为的 TOS(服务条款)。
  • 不要复制受版权保护的数据。

一个人可以根据几项法律被起诉。例如,一个人收集了一些机密信息,并将其出售给第三方,而无视网站所有者发出的终止信。此人可能会受到侵犯动产、违反数字千年版权法(DMCA)、违反计算机欺诈和滥用法(CFAA)和盗用等法律的起诉。

这并不意味着你可以利用 Twitter、脸书、Instagram 和 YouTube 等社交媒体渠道。它们对遵循 robots.txt 文件规定的抓取服务很友好。对于脸书,在进行自动数据收集行为之前,您需要获得其书面许可。

4。你需要知道如何编码

网络抓取工具(数据提取工具)对于非技术专业人士非常有用,如营销人员、统计人员、金融顾问、比特币投资者、研究人员、记者等。Octoparse 推出了同类功能之一——网络抓取模板,这是一种预格式化的抓取工具,涵盖 30 多个网站的 14 个类别,包括脸书、推特、亚马逊、易贝、Instagram 等。您只需在参数处输入关键字/URL,无需任何复杂的任务配置。使用 Python 进行 Web 抓取非常耗时。另一方面,网页抓取模板可以高效方便地抓取你需要的数据。

5。您可以将抓取的数据用于任何事情

如果你从网站上收集数据并用于公共消费分析,这是完全合法的。但是,如果你为了利益而抓取机密信息,这是不合法的。例如,未经许可收集私人联系信息,并将其出售给第三方以获取利润是非法的。此外,不贡献源代码就把抓取的内容重新打包成你自己的也是不道德的。你应该遵循没有垃圾邮件,没有抄袭,或根据法律禁止任何欺诈性使用数据的想法。

6。刮网器是多功能的

如果你有过偶尔改变布局或结构的特殊网站的经历。如果你遇到这样的网站,而你的刮刀第二次没有阅读,不要沮丧。原因有很多。这并不一定是因为你是一个可疑的机器人。这也可能是由不同的地理位置或机器访问造成的。在这种情况下,在我们设置调整之前,web scraper 无法解析网站是正常的。

7。可以很快的速度刮

你可能已经看过 scraper 的广告,说他们的爬行器有多快。这听起来不错,因为他们告诉你他们可以在几秒钟内收集数据。然而,如果造成损害,你是将被起诉的违法者。这是因为快速的可伸缩数据请求将使 web 服务器过载,这可能导致服务器崩溃。在这种情况下,根据“侵犯动产”法(Dryer and Stockton 2013),该人应对损害负责。如果你不确定网站是否可刮,请询问网络刮除服务提供商。Octoparse 是一家负责任的网络抓取服务提供商,将客户的满意度放在首位。对于 Octoparse 来说,帮助我们的客户解决问题并取得成功是至关重要的。

8。API 和网页抓取相同

API 就像一个通道,将您的数据请求发送到 web 服务器并获取所需的数据。API 将通过 HTTP 协议返回 JSON 格式的数据。比如脸书 API,Twitter API,Instagram API。然而,这并不意味着你可以得到你所要求的任何数据。网络抓取可以可视化这个过程,因为它允许你与网站互动。Octoparse 有网页抓取模板。对于非技术专业人员来说,通过用关键字/URL 填充参数来提取数据就更加方便了。

9。刮出的数据只有经过清理和分析后才能为我们的业务服务

许多数据集成平台可以帮助可视化和分析数据。相比之下,数据搜集看起来对商业决策没有直接影响。网络抓取确实提取了网页的原始数据,这些数据需要被处理,以获得像情感分析这样的见解。然而,有原始数据在金矿工人手中可能是极其宝贵的。

用 Octoparse Google 搜索网页抓取模板搜索一个有机的搜索结果。你可以提取信息,包括你的竞争对手的标题和元描述,以确定你的搜索引擎优化策略;对于零售行业,网络抓取可用于监控产品定价和分销。例如,亚马逊可能会在“电子”目录下抓取 Flipkart 和 Walmart,以评估电子商品的性能。

10。网页抓取只能在业务中使用

网页抓取广泛应用于各个领域。除了销售线索生成,价格监控,价格跟踪,市场分析业务。学生们也可以利用谷歌学者网络抓取模板进行论文研究。房地产经纪人能够进行住房研究并预测住房市场。你将能够找到 Youtube 有影响力的人或 Twitter 的传播者,以推广你的品牌或你自己的新闻聚合,通过抓取新闻媒体和 RSS 源,涵盖你想要的唯一主题。

来源:

干燥器,A.J .和斯托克顿,J. 2013。“互联网‘数据搜集’:咨询客户入门”,《纽约法律期刊》。从 https://www.law.com/newyorklawjournal/almID/1202610687621取回

原载于 2019 年 7 月 30 日【https://www.octoparse.com】

我从 fast.ai v3 中学到的 10 件新事情

原文:https://towardsdatascience.com/10-new-things-i-learnt-from-fast-ai-v3-4d79c1f07e33?source=collection_archive---------3-----------------------

参加课程 3 周后的学习要点

2022 年 1 月 12 日—修正错别字并提高清晰度

E 每个人都在谈论 fast.ai 大规模开放在线课程(MOOC),所以我决定试一试他们 2019 年的深度学习课程程序员实用深度学习,v3 。

我一直知道一些深度学习的概念/想法(我在这个领域已经有一年左右了,主要是处理计算机视觉),但从来没有真正理解过一些直觉或解释。课程导师杰瑞米·霍华德、瑞秋·托马斯和西尔万·古格(在推特上关注他们!)都是深度学习领域有影响力的人(Jeremy 有很多 Kaggle 比赛的经验),所以我希望从他们那里获得直觉,新的见解,以及一些模型训练的技巧和诀窍。我有很多东西要向这些人学习。

所以我在看了 3 周视频后(我没有做任何练习🤫🤫🤫🤫)写这篇文章是为了把我学到的新东西与你分享。当然,有些事情我一无所知,所以我对它们做了一些研究,并在这篇文章中提出了它们。最后,我还写了我对这门课程的感受(剧透:我喜欢❣️).

免责声明 : 不同的人聚集不同的学习点,看你的深度学习背景。这篇文章不推荐给深度学习的初学者,也不是课程内容的总结。相反,这篇文章假设你有神经网络、梯度下降、损失函数、正则化技术和生成嵌入的基础知识。有以下方面的经验也很好:图像分类、文本分类、语义分割和生成对抗网络。

我组织了我的 10 个学习点的内容:从神经网络理论到架构,到与损失函数相关的事情(学习率、优化器),到模型训练(和正则化),到深度学习任务,最后是模型可解释性。

内容:我学到的 10 件新事情

  1. 普适逼近定理
  2. 神经网络:设计&架构
  3. 了解亏损情况
  4. 梯度下降优化器
  5. 损失函数
  6. 培训
  7. 规范化
  8. 任务
  9. 模型可解释性
  10. 附录:关于模型复杂性的杰瑞米·霍华德&规范化

0.Fast.ai &迁移学习

“如果可以的话,使用迁移学习(来训练你的模型)总是好的。”—杰瑞米·霍华德

Fast.ai 是转移学习和在短时间内取得巨大成果的同义词。这门课程名副其实。迁移学习和实验主义是杰瑞米·霍华德强调要成为高效机器学习实践者的两个基本理念。

1.通用逼近定理

Photo by Vincentiu Solomon on Unsplash

通用逼近定理说你可以在前向神经网络中仅用一个隐藏层来逼近任何函数。由此得出结论,你也可以对任何更深层次的神经网络实现同样的近似。

我是说,哇!我现在才知道这件事。这个就是深度学习的根本。如果你有一堆仿射函数(或矩阵乘法)和非线性函数,你最终得到的东西可以任意接近任何函数。这就是仿射函数和非线性的不同组合竞赛背后的原因。这是架构越来越深入的原因。

2.神经网络:设计与架构

本节将重点介绍课程中引人注目的架构,以及融入最先进(SOTA)模型(如 dropout)的具体设计。

  • 相当于 SOTA;因此,您通常会使用它来完成许多与图像相关的任务,如图像分类和对象检测。这种架构在本课程的 Jupyter 笔记本中被大量使用。
  • 对于图像分割任务来说,U-net 是非常先进的。
  • 对于卷积神经网络(CNN ),步长=2 的卷积是前几层的标准
  • DenseNet 使用串联作为构建块中的最终操作,而 ResNet 使用加法操作。
  • 随意退出
    ,我们扔掉激活。直觉:因此没有激活可以记忆输入的任何部分。这将有助于过度拟合,其中模型的某些部分学习识别特定的图像,而不是特定的特征或项目。还有嵌入丢失、但这只是简单地提到了一下。
  • 批量规格化(BatchNorm)
    BatchNorm 做两件事:(1)规格化激活和(2)为每个规格化激活引入缩放和移动参数。但是,事实证明(1)没有(2)重要。在论文中,批处理规范化如何帮助优化?,提到“[BatchNorm]重新参数化潜在的优化问题,使其景观显著平滑[er]。”直觉是这样的:因为现在不那么颠簸了,我们可以使用更高的学习率,因此收敛更快(见图 3.1)。

3.了解损失情况

Fig 3.1: Loss landscapes; the left landscape has many bumps, and the right is smooth. Source: https://arxiv.org/abs/1712.09913

损失函数通常有凹凸不平和平坦的区域(如果你在 2D 或 3D 图中可视化它们)。请看图 3.2。如果你最终处于一个崎岖不平的区域,这个解决方案可能不太适用。这是因为你在一个地方找到了很好的解决方案,但在另一个地方却不是很好。但是如果你在一个平坦的区域找到了一个解决方案,你可能会概括得很好。那是因为你找到了一个解决方案,它不仅适用于某一点,也适用于整个问题。

Fig. 3.2: Loss landscape visualised in a 2D diagram. Screenshot from course.fast.ai

上面的大部分段落都引自杰瑞米·霍华德。如此美丽而直白的解释。

4.梯度下降优化器

我学到的新东西是 RMSprop 优化器充当了一个“加速器”。直觉:如果你的梯度在过去的几步中一直很小,你现在需要走快一点。

(关于梯度下降优化器的概述,我写了一篇名为 10 梯度下降优化算法的文章。)

5。损失函数

学习了两个新的损失函数:

  1. 像素均方误差(像素 MSE )。这可以用在语义分割中,语义分割是课程内容之一,但不在本文中讨论。
  2. 特征丢失🤗。这可以用于图像恢复任务。请参见任务:图像生成。

6。培训

Photo by Victor Freitas from Pexels

本节研究了针对的调整组合

  • 重量初始化
  • 超参数设置
  • 模型拟合/微调
  • 其他改进

转移学习
模型权重既可以(I)随机初始化,也可以(ii)在称为转移学习的过程中从预先训练的模型转移。迁移学习利用预先训练的权重。预训练的重量
有有用的信息
。**

适用于迁移学习的常见模型是这样工作的:训练更接近输出的权重,并冻结其他层。

对于迁移学习来说,使用与预训练模型应用的相同的统计数据是至关重要的,例如,使用特定偏差校正图像 RGB 值。****

❤️1 周期政策❤️ 这确实是我在这个课程中学到的最好的东西。我很抱歉一直认为学习率是理所当然的。找到一个好的学习率是至关重要的,因为我们至少可以为我们的梯度下降提供一个学习率的有根据的猜测,而不是一些可能是次优的直觉值。

杰瑞米·霍华德一直在他的代码中使用lr_finder()fit_one_cycle()——这让我很困扰,它工作得很好,我不知道为什么它会工作。于是我看了莱斯利·史密斯的论文和西尔万·古格的博文(推荐阅读!),这就是1 周期的工作方式:

1.执行 LR 范围测试:以从小数值(10e-8)到大数值(1 或 10)的(线性)递增学习率训练模型。绘制一个损失与学习率的关系图,如下所示。

Fig 6.1: Loss vs learning rate. Source: https://sgugger.github.io/how-do-you-find-a-good-learning-rate.html

2.选择最小和最大学习率。要选择最大学习率,请查看图表,选择一个足够高的学习率,并给出较低的损失值(不要太高,也不要太低)。这里你会选择 10e-2。选择最小值可以低十倍左右。这里应该是 10e-3。有关确定这些值的更多信息,请参见博客文章。

3.通过周期学习率的周期数拟合模型。一个周期是你的训练经历从最小到最大,然后回到最小的学习率。

Source: https://sgugger.github.io/the-1cycle-policy.html

那么,我们为什么要这样做呢?整个想法如下。在亏损的情况下,我们想跳过它的突起(因为我们不想被困在某个沟里)。所以,在开始时增加学习率有助于模型跳出那个沟,探索函数曲面,并试图找到损失低且区域不均匀的区域(因为如果是,它又会被踢出去)。这使我们能够更快地训练模型。我们也倾向于以更一般化的解决方案结束。

Fig. 6.2: Screenshot from course.fast.ai

预训练模型的判别学习率 用超低学习率训练前面的层,用较高的学习率训练最后的层。这个想法是不要剧烈改变几乎完美的预训练权重,除了极少量的,并且更积极地教导输出附近的层。在 ULMFiT 中引入了判别学习率。

一个幻数除数

在 1 周期拟合中,为获得最小学习率,用 2.6⁴.除以最大值这个数字适用于 NLP 任务。更多信息见 https://course.fast.ai/videos/?lesson=4 33:30。

用于超参数搜索的随机森林 提到了随机森林可用于搜索超参数。

使用默认值 使用库或实现论文的代码时,使用默认的超参数值和“不要逞英雄”。

预训练模型的模型微调

我注意到了杰里米的风格:训练最后几层,解冻所有层,训练所有重量。然而,这一步是实验性的,因为它可能会也可能不会提高准确性。如果没有,我希望你已经保存了你最后一次训练的重量😅。

渐进式调整大小 这最适用于与图像相关的任务。使用较小版本的图像开始训练。然后,使用更大的版本进行训练。为此,使用迁移学习将训练的权重移植到具有相同架构但接受不同输入大小的模型。天才。

混合精度训练

7。正规化

Photo by Rosemary Ketchum from Pexels

使用幻数 0.1** 进行重量衰减。如果你使用太多的权重衰减,你的模型将不会训练得足够好(拟合不足)。如果太少,你会倾向于过量,但没关系,因为你可以提前停止训练。**

8.任务

请注意,此处并未提及本课程涵盖的所有任务。

  • 多标签分类
  • 语言建模
  • 表列数据
  • 协同过滤
  • 图象生成

a)多标签分类

我一直想知道你如何执行一个标签数量可变的[n 图像]分类任务,即多标签分类(不要和多类分类/多项式分类混淆,它的同胞是二分类)。

没有详细提到损失函数如何用于多标签分类。但是谷歌了一下,发现标签应该是多热点编码的向量。这意味着每个元素必须应用于最终模型输出中的 sigmoid 函数。损失函数是输出和地面实况的函数,使用二进制交叉熵来计算,以独立地惩罚每个元素。

b)语言建模

对于这个语言建模任务,我喜欢“语言模型”的定义(重新措辞):

语言模型是学习预测句子的下一个单词的模型。为此,你需要了解相当多的英语和世界知识。

这意味着你需要用大量的数据来训练模型。这就是本课程介绍 ULMFiT 的地方,这是一个可以基于预训练(换句话说,迁移学习)重用的模型。

c)表格数据

这是我第一次使用深度学习处理带有分类变量的表格数据!我不知道你可以这样做?无论如何,我们能做的是从分类变量中创建嵌入。如果我没有选这门课,我不会想到这些。稍微搜索了一下,我就找到了 Rachel Thomas 关于表格数据深度学习介绍的帖子。****

那么,如何将(a)连续变量的向量和(b)分类变量的嵌入结合起来呢?课程没有提到这方面的任何东西,但是这篇 StackOverflow 帖子强调了 3 种可能的方法:

  1. 两种型号–一种用于(a),一种用于(b)。让他们合奏。
  2. 一个模型,一个输入。这个输入是(a)和(b)之间的连接。
  3. 一个模型,两个输入。这两个输入是(a)和(b)。您在模型本身中将这两者连接起来。

d)协同过滤

协同过滤是当你的任务是预测一个用户会有多喜欢一个特定的项目(在这个例子中,假设我们使用电影评级)。课程介绍了使用嵌入来解决这个问题。这是我第一次遇到使用深度学习的协同过滤(好像我一开始就对协同过滤很有经验)!

目标是为每个用户和项目创建大小为 n 的嵌入。为此,我们随机初始化每个嵌入向量。然后,对于一部电影的每个用户评级,我们将其与他们各自嵌入的点积进行比较,例如使用 MSE。然后我们执行梯度下降优化。

e)图像生成

以下是我学到的一些东西:

  • 可根据我们的期望生成数据。我只是喜欢这个被创造出来的术语。
  • 生成敌对网络(GANs) 讨厌 气势,所以设置为 0。
  • 看亏损很难知道模型表现如何。人们必须不时亲自看到生成的图像(尽管对于鉴别器和发生器来说,最后的损耗应该大致相同)。
  • 提高生成图像质量的一种方法是在我们的损失函数中包含感知损失(在 fast.ai 中也称为特征损失)。通过从网络中间某处的张量中取值来计算特征损失。

9。模型可解释性

Photo by Maria Teneva on Unsplash

在其中一堂课上,杰瑞米·霍华德展示了一幅图像的激活** 热图用于图像分类任务。该热图显示了“激活”的像素。这种可视化将帮助我们理解图像的哪些特征或部分导致了模型的输出👍🏼。**

10.附录:杰瑞米·霍华德关于模型复杂性和正则化

Photo by NEW DATA SERVICES on Unsplash

我转录了课程的这一部分(第五课),因为直觉是如此令人信服❤️.在这里,Jeremy 首先召集了那些认为增加模型复杂性不可取的人,重塑他们的观点,然后将他们带到 L2 规则

哦,我是统计部的,所以他让我措手不及😱。

所以如果你们中的任何一个人不幸被统计学、心理学、计量经济学或任何这类课程的背景所洗脑,你必须放弃你需要更少参数的想法,因为你需要意识到的是你将会适应你需要更少参数的谎言,因为这是一个方便的虚构,真实的事实是你不希望你的函数太复杂。拥有更少的参数是降低复杂性的一种方式。

但是如果你有 1000 个参数,其中 999 个是 1e-9 呢?或者如果有 0 呢?如果是 0,那么它们就不存在。或者如果他们是 1e-9,他们几乎不在那里。

如果很多参数都很小,为什么我不能有很多参数呢?答案是你可以。所以这个东西,计算参数的数量是我们限制复杂性的方式,实际上是非常有限的。这是一部存在很多问题的小说,对吗?所以,如果在你的头脑中,复杂性是通过你有多少参数来评分的,那你就大错特错了。适当评分。

那么我们为什么要在乎呢?为什么我要使用更多的参数?

因为更多的参数意味着更多的非线性,更多的相互作用,更多的弯曲位,对吗?现实生活充满了曲折。现实生活不是这样的[温饱线]。但是我们不希望它们比必要的更弯曲,或者比必要的更互动。

因此,让我们使用大量的参数,然后惩罚复杂性。

好的,惩罚复杂性的一个方法是,就像我之前建议的,让我们总结一下参数的值。因为有些参数是正的,有些是负的,所以这不太适用,对吧?那么如果我们对参数的平方求和。

这确实是个好主意。

让我们实际创建一个模型,在损失函数中,我们将添加参数的平方和。现在有一个问题。也许这个数字太大了,以至于最好的损失是将所有参数设置为 0。这可不好。所以实际上我们想确保这不会发生。因此,我们不仅要将参数的平方和加到模型中,还要乘以我们选择的某个数字。我们在斋戒中选择的数字叫做wd

你可能也想看看我是如何在我的文章L1 和 L2 正则化的直觉中使用梯度下降解释这两种正则化技术的。

结论

我喜欢这门课。以下是一些原因:

  • 他们给出直觉和易于理解的解释。
  • 他们用丰富的资源补充功课。
  • 他们鼓励你将深度学习应用到各自的领域来构建东西。
  • 他们似乎总是与令人兴奋的和新颖的出版物保持同步,然后在适当的时候将它们整合到 fastai 图书馆中。
  • 他们也对深度学习做了很多研究(阅读:ULMFiT)。
  • 他们围绕 fastai 图书馆建立了一个社区;因此你会很快得到支持。
  • 他们的技巧和诀窍对 Kagglers 和精度驱动的建模很有帮助。

我期待着课程的下一部分!

如果你喜欢这篇文章,请给我一两个掌声:)如果你看到任何错误,请突出显示并告诉我。另外,看看我写的关于深度学习的其他文章:

通用

统计深度学习模型中的参数数量

语言

RNN、LSTM 和 GRU 的动画

经办人:图文并茂的注意事项

图文并茂:自我关注

逐行 Word2Vec 实现(由我的朋友 Derek 完成)

计算机视觉

分解平均平均精度(图)(朋友任杰写的)

神经架构搜索

图文并茂:高效的神经架构搜索

优化

随机梯度下降线性回归分步指南

10 种梯度下降优化算法+备忘单

关注我上Twitter@ remykarem 或者LinkedIn。你也可以通过 raimi.bkarim@gmail.com 联系我。欢迎访问我的网站remykarem . github . io**

你应该知道的 10 种 Python 文件系统方法

原文:https://towardsdatascience.com/10-python-file-system-methods-you-should-know-799f90ef13c2?source=collection_archive---------6-----------------------

用 os 和 shutil 操作文件和文件夹

您可以编写 Python 程序来与文件系统交互,做一些很酷的事情。如何做到这一点并不总是非常清楚。

本文是当前和有抱负的开发人员和数据科学家的指南。我们将重点介绍 10 个基本的 osshutil 命令,这样您就可以编写脚本来自动化与文件系统的交互。

Like a file system

文件系统有点像房子。假设你正在进行大扫除,你需要把笔记本从一个房间搬到另一个房间。

Directories are like boxes. They hold things.

这些盒子就像目录。他们拿着东西。在这种情况下,笔记本。

笔记本就像文件一样。你可以给他们读和写。你可以把它们放在你的目录箱里。

明白吗?

在本指南中,我们将看看来自 osshutil 模块的方法。 os 模块是用于与操作系统交互的主要 Python 模块。 shutil 模块也包含高级文件操作。出于某种原因,你用 os 创建目录,但是用 shutil 移动和复制它们。去想想。😏

更新:pathlib 讨论于 2019 年 2 月 16 日添加

在 Python 3.4 中, pathlib 模块被添加到标准库中,以改进文件路径的工作,从 3.6 开始,它与标准库的其余部分配合得很好。与我们将在下面讨论的方法相比, pathlib 方法为解析文件路径提供了一些好处——即 pathlib 将路径视为对象而不是字符串。虽然 pathlib 很方便,但是它没有我们将要探索的所有底层功能。此外,在未来几年的代码中,你无疑会看到下面的 osshutil 方法。所以熟悉他们绝对是个好主意。

我打算在以后的文章中讨论 pathlib ,所以跟着我确保你不会错过。现在要了解更多关于 pathlib 模块的信息,请看这篇文章和这篇文章。

在我们深入研究之前,还需要知道其他一些事情:

  • 本指南是为 Python 3 设计的。2020 年 1 月 1 日之后将不再支持 Python 2。
  • 您需要将 osshutil 导入到您的文件中才能使用这些命令。
  • 我的示例代码可以在 GitHub 上找到。
  • 用你自己的论点代替下面引号中的论点。

现在我们已经了解了上下文,让我们开始吧!这里列出了你应该知道的 10 个命令。

10 种文件系统方法

下面的列表遵循这种模式:

方法—描述—等效 macOS Shell 命令

获取信息

  • **os.getcwd()** —以字符串形式获取当前工作目录路径— pwd
  • **os.listdir()** —以字符串列表的形式获取当前工作目录的内容— ls
  • **os.walk("starting_directory_path")** —返回当前目录和所有子目录中的目录和文件的名称和路径信息的生成器—没有完全等效的简短 CLI,但ls -R提供子目录名称和子目录中文件的名称

改变事物

  • **os.chdir("/absolute/or/relative/path")** —改变当前工作目录— cd
  • **os.path.join()**—创建路径供以后使用—没有等效的简短 CLI
  • **os.makedirs("dir1/dir2")** —制作目录— mkdir -p
  • **shutil.copy2("source_file_path", "destination_directory_path")** —复制文件或目录— cp
  • **shutil.move("source_file_path*"*, "destination_directory_path")** —移动文件或目录— mv
  • **os.remove("my_file_path")** —删除文件— rm
  • **shutil.rmtree("my_directory_path")** —删除一个目录以及其中的所有文件和目录— rm -rf

大家讨论一下。

获取信息

**os.getcwd()**

os.getcwd()以字符串形式返回当前工作目录。😄

**os.listdir()**

os.listdir()以字符串列表的形式返回当前工作目录的内容。😄

**os.walk("my_start_directory")**

os.walk()创建一个生成器,可以返回当前目录和子目录的信息。它遍历指定起始目录中的目录。

os.walk()为其遍历的每个目录返回以下项目:

  1. 字符串形式的当前目录路径
  2. 字符串列表形式的当前目录中的子目录名称
  3. 字符串列表形式的当前目录中的文件名

它对每个目录都这样做!

使用带有 for 循环的os.walk()来遍历目录及其子目录的内容通常很有用。例如,下面的代码将打印当前工作目录的目录和子目录中的所有文件。

import oscwd = os.getcwd()for dir_path, dir_names, file_names in os.walk(cwd):
    for f in file_names:
        print(f)

这就是我们获取信息的方式,现在让我们看看改变工作目录或移动、复制或删除文件系统的命令。

改变事物

**os.chdir("/absolute/or/relative/path")**

此方法将当前工作目录更改为提供的绝对或相对路径。

如果您的代码随后对文件系统进行了其他更改,那么最好处理使用 try-except 方法时引发的任何异常。否则,您可能会删除不想删除的目录或文件。😢

**os.path.join()**

[os.path](https://docs.python.org/3/library/os.path.html#module-os.path)模块有许多常用的路径名操作方法。您可以使用它来查找有关目录名和部分目录名的信息。该模块还有检查文件或目录是否存在的方法。

os.path.join()通过将多个字符串连接成一个漂亮的文件路径,创建一个可以在几乎任何操作系统上工作的路径。😄

以下是来自文档的描述:

智能地连接一个或多个路径组件。返回值是路径和**路径*的任何成员的串联,每个非空部分后面都有一个目录分隔符(*os.sep*),最后一个除外…

基本上,如果您在 Unix 或 macOS 系统上,os.path.join()会在您提供的每个字符串之间添加一个正斜杠(“/”)来创建一个路径。如果操作系统需要一个“\”来代替,那么 join 知道使用反斜杠。

os.path.join()也向其他开发者提供了清晰的信息你正在创造一条道路。一定要用它来代替手动的字符串连接,以免看起来像个菜鸟。😉

**os.makedirs("dir1/dir2")**

os.makedirs()制作目录。mkdir()方法也创建目录,但是它不创建中间目录。所以我建议你用os.makedirs()

**shutil.copy2("source_file", "destination")**

在 Python 中有很多复制文件和目录的方法。shutil.copy2()是一个很好的选择,因为它试图尽可能多地保留源文件的元数据。更多讨论见这篇文章。

Move things

**shutil.move("source_file*"*, "destination")**

使用shutil.move()改变文件的位置。它使用copy2作为引擎盖下的默认。

**os.remove("my_file_path")**

有时你需要删除一个文件。os.remove()是你的工具。

**shutil.rmtree("my_directory_path")**

shutil.rmtree()删除目录以及其中的所有文件和目录。

Remove things

小心删除东西的函数!您可能希望使用 print() 打印将要删除的内容。然后在您的 remove 函数中运行 substitute forprint()当您确定它不会删除错误的文件时。向 Al Sweigart 致敬,他在中提出了用 Python 自动完成枯燥工作的想法。

这是完整的名单。

10 个文件系统方法概述

下面的列表遵循这种模式:方法—描述—等效的 macOS Shell 命令

获取信息

  • **os.getcwd()** —以字符串形式获取当前工作目录路径— pwd
  • **os.listdir()** —以字符串列表的形式获取当前工作目录的内容— ls
  • **os.walk("starting_directory_path")** —返回包含当前目录和所有子目录中的目录和文件的名称和路径信息的生成器—没有完全等效的简短 CLI,但ls -R提供子目录名称和子目录中文件的名称

改变事物

  • **os.chdir("/absolute/or/relative/path")** —改变当前工作目录— cd
  • **os.path.join()**—创建路径供以后使用—没有等效的简短 CLI
  • **os.makedirs("dir1/dir2")** —制作目录— mkdir-p
  • **shutil.copy2("source_file_path", "destination_directory_path")** —复制文件或目录— cp
  • **shutil.move("source_file_path*"*, "destination_directory_path")** —移动文件或目录— mv
  • **os.remove("my_file_path")** —删除文件— rm
  • **shutil.rmtree("my_directory_path")** —删除一个目录以及其中的所有文件和目录— rm -rf

包装

现在您已经看到了在 Python 中与文件系统交互的基础。在您的 IPython 解释器中尝试这些命令以获得快速反馈。然后向其他人解释它们来巩固你的知识。你会比在你的房子里搬动一箱箱笔记本时更少疼痛。🏠但是锻炼会很好,所以现在你可以去健身房了。🏋️‍♀️😉

如果你想学习用 Python 读写文件,请查看 打开函数。记得像这样使用上下文管理器: with open(‘myfile’) as file:。😄

我希望这篇 Python 文件系统操作的介绍对您有用。如果你有,请分享到你最喜欢的社交媒体渠道,这样其他人也可以找到它。

我写关于 Python、Docker、数据科学等等的文章。如果你对此感兴趣,请阅读更多此处并关注我的 Medium。

感谢阅读!👏

让你的工作更有效率的 10 个技巧

原文:https://towardsdatascience.com/10-python-pandas-tricks-that-make-your-work-more-efficient-2e8e483808ba?source=collection_archive---------0-----------------------

有些命令您可能已经知道,但可能不知道它们可以这样使用

Photo from https://unsplash.com/

Pandas 是一个广泛用于结构化数据的 Python 包。有很多很好的教程,但在这里我还是想介绍一些读者以前可能不知道的很酷的技巧,我相信它们是有用的。

阅读 _csv

每个人都知道这个命令。但是您试图读取的数据很大,尝试添加这个参数: nrows = 5 以便在实际加载整个表之前只读取表的一小部分。那么你可以通过选择错误的分隔符来避免这个错误(它可能不总是用逗号分隔)。

(或者,您可以使用 linux 中的' head '命令检查任何文本文件中的前 5 行: head -n 5 data.txt (感谢 Ilya Levinson 在这里指出了一个拼写错误))

然后,可以通过使用df.columns.tolist()提取所有列来提取列列表,然后添加 usecols = ['c1 ',' c2 ',…]【T10]参数来加载需要的列。此外,如果您知道一些特定列的数据类型,您可以添加参数 dtype = {'c1': str,' c2': int,…} ,这样它会加载得更快。这个参数的另一个优点是,如果您有一个既包含字符串又包含数字的列,那么将它的类型声明为 string 是一个很好的做法,这样当您试图使用这个列作为键来合并表时就不会出现错误。

select_dtypes

如果数据预处理必须在 Python 中完成,那么这个命令会节省您一些时间。读入表后,每列的默认数据类型可以是 bool、int64、float64、object、category、timedelta64 或 datetime64。您可以首先通过以下方式检查分布

df.dtypes.value_counts()

要了解数据帧的所有可能的数据类型,那么

df.select_dtypes(include=['float64', 'int64'])

选择只有数字特征的子数据帧。

复制

如果您还没有听说过,这是一个重要的命令。如果您执行以下命令:

import pandas as pd
df1 = pd.DataFrame({ 'a':[0,0,0], 'b': [1,1,1]})
df2 = df1
df2['a'] = df2['a'] + 1
df1.head()

你会发现 df1 变了。这是因为 df2 = df1 不是制作 df1 的副本并将其分配给 df2,而是建立一个指向 df1 的指针。所以 df2 的任何变化都会导致 df1 的变化。要解决这个问题,您可以

df2 = df1.copy()

或者

from copy import deepcopy
df2 = deepcopy(df1)

地图

这是一个很酷的命令,可以进行简单的数据转换。首先定义一个字典,其中“键”是旧值,“值”是新值。

level_map = {1: 'high', 2: 'medium', 3: 'low'}
df['c_level'] = df['c'].map(level_map)

举几个例子:真,假到 1,0(用于建模);定义级别;用户定义的词汇编码。

申请还是不申请?

如果我们想创建一个新列,并以其他几列作为输入,apply 函数有时会非常有用。

def rule(x, y):
    if x == 'high' and y > 10:
         return 1
    else:
         return 0df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]})
df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis =  1)
df.head()

在上面的代码中,我们定义了一个具有两个输入变量的函数,并使用 apply 函数将其应用于列“c1”和“c2”。

但是“应用”的问题是它有时太慢了。比方说,如果你想计算两列“c1”和“c2”的最大值,你当然可以这样做

df['maximum'] = df.apply(lambda x: max(x['c1'], x['c2']), axis = 1)

但是您会发现它比这个命令慢得多:

df['maximum'] = df[['c1','c2']].max(axis =1)

要点:如果你可以用其他内置函数完成同样的工作,就不要使用 apply(它们通常更快)。例如,如果要将列' c '舍入为整数,请执行 round(df['c'],0)df['c']。round(0) 而不是使用应用函数:df.apply(lambda x: round(x['c'], 0), axis = 1)

值计数

这是一个检查值分布的命令。例如,如果您想检查“c”列中每个单独值的可能值和频率,您可以

df['c'].value_counts()

这里有一些有用的技巧/论据:
A. normalize = True :如果你想检查频率而不是计数。dropna = False :如果你也想在统计数据中包含丢失的值。
C. df['c'].value_counts().reset_index():如果您想将统计表转换成熊猫数据帧并对其进行操作
D. df['c'].value_counts().reset_index().sort_values(by='index'):在‘c’列中显示按不同值排序的统计数据,而不是计数。

(更新 2019.4.18 —针对上面的 d,郝洋指出了一个更简单的办法,没有。reset_index(): df['c'].value_counts().sort_index()

缺失值的数量

构建模型时,您可能希望排除缺少太多值的行/缺少所有值的行。你可以用。isnull()和。sum()计算指定列中缺失值的数量。

import pandas as pd
import numpy as npdf = pd.DataFrame({ 'id': [1,2,3], 'c1':[0,0,np.nan], 'c2': [np.nan,1,1]})
df = df[['id', 'c1', 'c2']]
df['num_nulls'] = df[['c1', 'c2']].isnull().sum(axis=1)
df.head()

选择具有特定 id 的行

在 SQL 中,我们可以使用 SELECT * FROM … WHERE ID in ('A001 ',' C022 ',…)来获得具有特定 ID 的记录。如果你想对熊猫做同样的事情,你可以做

df_filter = df['ID'].isin(['A001','C022',...])
df[df_filter]

百分位组

您有一个数字列,并且想要将该列中的值分组,比如前 5%归入第 1 组,5–20%归入第 2 组,20%-50%归入第 3 组,后 50%归入第 4 组。当然,你可以用熊猫来做。切,但我想在这里提供另一种选择:

import numpy as np
cut_points = [np.percentile(df['c'], i) for i in [50, 80, 95]]
df['group'] = 1
for i in range(3):
    df['group'] = df['group'] + (df['c'] < cut_points[i])
# or <= cut_points[i]

运行速度更快(不使用应用函数)。

to_csv

同样,这是每个人都会使用的命令。这里我想指出两个窍门。第一个是

print(df[:5].to_csv())

您可以使用这个命令准确地打印出将要写入文件的前五行。

另一个技巧是处理混合在一起的整数和缺失值。如果一个列同时包含缺失值和整数,数据类型仍然是 float 而不是 int。导出表格时,可以添加 float_format='%.0f' 将所有浮点数四舍五入为整数。如果您只想要所有列的整数输出,就使用这个技巧——您将去掉所有烦人的“. 0”

让数据分析更快的 10 个 Python 熊猫技巧

原文:https://towardsdatascience.com/10-python-pandas-tricks-to-make-data-analysis-more-enjoyable-cb8f55af8c30?source=collection_archive---------5-----------------------

Photo by Vashishtha Jogi on Unsplash

1.式样

在 Jupyter 笔记本上做.head()的时候,你有没有抱怨过表格输出看起来很无聊?有没有办法不显示索引(尤其是已经有 ID 列的时候)?有办法解决这些问题。

A .突出显示数据帧中的所有负值。(示例修改自https://pandas . pydata . org/pandas-docs/stable/user _ guide/style . html)

import pandas as pd
def color_negative_red(val):
    color = 'red' if val < 0 else 'black'
 return 'color: %s' % colordf = pd.DataFrame(dict(col_1=[1.53,-2.5,3.53], 
                       col_2=[-4.1,5.9,0])
                 )
df.style.applymap(color_negative_red)

B .隐藏索引。试试df.head().style.hide_index()
C .添加悬停效果。(示例修改自https://pandas . pydata . org/pandas-docs/stable/reference/API/pandas . io . formats . style . styler . set _ table _ styles . html)

df = pd.DataFrame(np.random.randn(5, 3))
df.style.set_table_styles(
[{'selector': 'tr:hover',
  'props': [('background-color', 'yellow')]}]
)

D .更多 CSS 样式。你可以使用 CSS 来改变表格的外观。

df = pd.DataFrame(
dict(departure=['SFO', 'SFO', 'LAX', 'LAX', 'JFK', 'SFO'],
     arrival=['ORD', 'DFW', 'DFW', 'ATL', 'ATL', 'ORD'],
     airlines=['Delta','JetBlue','Delta',’AA','SouthWest',  
               'Delta']),
columns=['airlines', 'departure','arrival'])df.style.set_table_styles(
[{'selector': 'tr:nth-of-type(odd)',
  'props': [('background', '#eee')]}, 
 {'selector': 'tr:nth-of-type(even)',
  'props': [('background', 'white')]},
 {'selector': 'th',
  'props': [('background', '#606060'), 
            ('color', 'white'),
            ('font-family', 'verdana')]},
 {'selector': 'td',
  'props': [('font-family', 'verdana')]},
]
).hide_index()

2.熊猫选项

读者在使用.head(n)检查数据帧时可能会遇到以下问题:
(1)数据帧中的列/行太多,中间的一些列/行被省略。
(2)包含长文本的列被截断。
(3)包含浮动的列显示的数字太多/太少。

人们可以设定

import pandas as pd 
pd.options.display.max_columns = 50  # None -> No Restrictions
pd.options.display.max_rows = 200    # None -> Be careful with this 
pd.options.display.max_colwidth = 100
pd.options.display.precision = 3

来解决这些问题。

3.使用多个聚合进行分组

在 SQL 中,我们可以像这样进行聚合

SELECT A, B, max(A), avg(A), sum(B), min(B), count(*)
FROM table
GROUP BY A, B

在熊猫身上,这可以通过.groupby().agg()来实现:

import pandas as pd
import numpy as np 
df = pd.DataFrame(dict(A=['coke', 'sprite', 'coke', 'sprite',
                          'sprite', 'coke', 'coke'],
                       B=['alpha','gamma', 'alpha', 'beta',
                          'gamma', 'beta', 'beta'],
                       col_1=[1,2,3,4,5,6,7],
                       col_2=[1,6,2,4,7,9,3]))tbl = df.groupby(['A','B']).agg({'col_1': ['max', np.mean],
                                 'col_2': ['sum','min','count']})# 'count' will always be the count for number of rows in each group.

结果会是这样的:

行和列都是多索引的。将其更改为没有多索引的数据帧的快速解决方案是

tbl = tbl.reset_index()
tbl.columns = ['A', 'B', 'col_1_max', 'col_2_sum', 'col_2_min', 'count']

如果您想让列重命名过程自动化,您可以执行tbl.columns.get_level_values(0)tbl.columns.get_level_values(1)来提取每个级别中的索引并组合它们。

4.列切片

你们中的一些人可能对此已经很熟悉了,但是我仍然发现它在处理包含大量列的数据帧时非常有用。

df.iloc[:,2:5].head()             # select the 2nd to the 4th column
df.loc[:,'column_x':].head()   
# select all columns starting from 'column_x'

5.向每个组添加行 ID /随机行 ID

要通过 A、B 为每个组添加行 ID /随机行 ID,可以首先将 ID /随机 ID 附加到所有行:

import numpy as np
# df: target dataframe np.random.seed(0)   # set random seed
df['random_ID_all'] = np.random.permutation(df.shape[0])
df['ID_all'] = [i for i in range(1, df.shape[0]+1)]

要为每个组添加一个随机 ID(通过 A、B),可以这样做

df['ID'] = df.groupby(['A', 'B'])['ID_all'].rank(method='first', ascending=True).astype(int)df['random_ID'] = df.groupby(['A', 'B'])['random_ID_all'].rank(method='first', ascending=True).astype(int)

得到

6.列出组中所有唯一的值

有时,在执行 group by 后,我们希望将目标列中的值聚合为唯一值的列表,而不是 max、min 等。这是怎么做的。

df = pd.DataFrame(dict(A=['A','A','A','A','A','B','B','B','B'],
                       B=[1,1,1,2,2,1,1,1,2],
                       C=['CA','NY','CA','FL','FL',     
                          'WA','FL','NY','WA']))tbl = df[['A', 'B', 'C']].drop_duplicates()\
                         .groupby(['A','B'])['C']\
                         .apply(list)\
                         .reset_index()# list to string (separated by commas) 
tbl['C'] = tbl.apply(lambda x: (','.join([str(s) for s in x['C']])), axis = 1)

如果您想保存结果,不要忘记将分隔符更改为逗号以外的任何内容。

7.将行总计和列总计添加到数字数据框架中

这是另一种常见的数据操作。你需要的只是.apply()

df = pd.DataFrame(dict(A=[2,6,3],
                       B=[2,2,6], 
                       C=[3,2,3]))df['col_total']     = df.apply(lambda x: x.sum(), axis=1)
df.loc['row_total'] = df.apply(lambda x: x.sum())

8.检查内存使用情况

.memory_usage(deep=True)可用于 Pandas 数据帧,查看每一列使用的内存量(以字节为单位)。这在构建机器学习模型时很有用,因为在训练中可能需要大量内存。

9.累积和

有时,当您生成一些统计结果时,需要累积和。干脆做df['cumulative_sum'] = df['target_column'].cumsum()

10.交叉表

当您需要统计由 3 个以上特征组成的组的频率时,pd.crosstab()可以让您的工作变得更加轻松。

感谢阅读!如果你发现了错误/更好的解决方案,请在下面评论。

10 个问题,你一直想问一个 AI 颠覆者,却一直没有!

原文:https://towardsdatascience.com/10-questions-you-always-wanted-to-ask-an-ai-disruptor-but-never-did-5203a6d31aa4?source=collection_archive---------24-----------------------

Prof. Alexiei Dingli Vs Ms Rachel Falzon

Alexiei Dingli 教授在过去的二十年里一直致力于人工智能(AI)的研究。在这个由两部分组成的采访的第一部分,人力资源顾问雷切尔·法尔松女士问他,那些被技术干扰的人可能一直想问什么,但可能从来没有勇气或机会这样做。在本文的第二部分,角色互换了。他就颠覆性技术对人们和工作文化的影响采访了她,同时深入探讨了工作实践如何受到影响。

Photo by Adeolu Eletu on Unsplash

  1. 你能用最简单的术语定义人工智能吗?

人工智能是一个寻求创造智能机器的多学科研究领域。人工智能这个术语是由两个词组成的,人工和智能。人工简单的说就是人类创造的东西。智力的定义有点复杂,因为对于它是什么还没有一个普遍的共识。然而,当我们看到智能行为时,我们往往会立即识别出来。正因为如此,我们倾向于用联想来定义智力。事实上,我们认为一台机器是智能的,如果它能完成只有一个智能有机体(如人类)或一群有机体(如蜜蜂)才能完成的功能。总而言之,人工智能是创造出具有智能行为机器的研究领域。

2。AI 有什么好处/能力?

人工智能的好处是多方面的,它的能力影响深远。它可以像协调汽车中的气候控制一样简单,也可以像自动管理核电站一样简单。正因为如此,人工智能被认为是一个水平的研究领域,可以很容易地改变几乎任何其他领域的研究。人工智能的好处包括各种功能的自动化、不同流程的优化以及对未来事件的准确预测,在大多数情况下,这比任何人都要好得多。

3。它能给组织带来什么价值?有什么缺点吗?

人工智能可以给任何组织带来很多附加值。如果组织坐在一堆数据上,人工智能可以轻松处理这些数据,分析这些数据,提取模式并识别问题。在人工流程的情况下,人工智能可以帮助自动化重复的任务,这些任务可能太单调乏味,在某些情况下,对人类的健康有害。人工智能系统在工作中是精确的,它不会感到厌烦,不会感到疲劳,能够预见未来的趋势,并且能够处理比一个人能够管理的多得多的数据。这种系统的缺点首先是财务上的,因为任何人工智能都需要初始资本投资,然而,一旦它启动并运行,它几乎不需要维护。其次,人工智能系统的部署很可能会影响在组织中工作的人。他们中的一些人可能会失业。其他人需要重新掌握技能,以便学习如何在人工智能系统的帮助下执行不同的任务。

4。最近有很多关于人工智能的炒作,但我们知道它已经存在了大约 70 年。你能举一些我们日常生活中实际应用的例子吗?

正如你正确指出的,人工智能是一项非常成熟的技术。今天,我们几乎可以在我们使用的任何设备中找到它。人工智能的唯一问题是,使用人工智能的系统通常不承认这一事实,因此,人们不知道他们在日常生活中使用的所有不同的人工智能系统。让我给你举几个例子。当一个人在谷歌上搜索时,实际上是人工智能在筛选数百万份文件,以便找到你需要的信息。如果有人去脸书,是人工智能决定用户可以看到的帖子。车内的气候控制由人工智能系统管理。根据烹饪内容自动调节烹饪温度的烤箱都由人工智能系统管理。你的电子邮件客户端的垃圾邮件过滤器是由人工智能驱动的。当然,这个清单可以一直列下去。重要的是要记住,人工智能就在我们周围,并且会一直存在。

Photo by Jehyun Sung on Unsplash

5。你预测人工智能将在多大程度上取代工作?已经开始发生了吗?

准确地说,人工智能不一定会取代整个工作,但它肯定会接管特定的任务。人工智能已经开始取代这些任务,这将在未来几年继续加速。事实上,根据世界经济论坛,在 5 年内,自动化将占现有任务的 50%以上。我个人认为有四种情况我们应该考虑;

  1. 有些工作像护理工作(护士等)。),创造性的工作(艺术家等)不会受到 AI 的太大影响,因为 AI 仍然不太擅长这些任务。
  2. 一些工作将会被淘汰。这些人包括司机(因为自动驾驶汽车的兴起)、工厂工人(因为自动化)和许多其他人。
  3. 将会创造一些新的就业机会。这些工作甚至不是我们发明的。它可能包括像器官创造者这样的工作,人们将被要求创造新的器官(如新的心脏、肾脏或肝脏)来取代有缺陷的器官。
  4. 大部分工作都会改变。它们将被人工智能技术增强。这将产生巨大的影响。它可能小到帮助超市的堆垛机使用增强现实识别过期产品,大到在手术中协助外科医生。

Photo by Ross Findon on Unsplash

6。通常,在一个组织中实施人工智能时,要遵循什么流程?

人工智能转换过程遵循许多明确定义的步骤。首先,重要的是开始教育人们什么是人工智能。教育活动必须从最高层开始,向下到组织层级的所有级别。第二,执行人工智能准备情况审计,以确定组织在采用人工智能方面的状态。一旦完成,与所有利益相关者进行协商,以确定可以实施的潜在人工智能案例研究。然后,根据可行性、投资和潜在回报,与管理层一起订购这些案例研究。一旦项目被分类,然后管理层决定实施哪些项目。它们是在内部实施还是外包,实际上取决于复杂性和组织中可用的专业知识。人工智能专家将在那里管理和监督项目的运行。当一个项目完成后,另一个更雄心勃勃的项目被选择和执行。如此循环下去,直到组织设法用人工智能来增强其流程。

7。实施过程大约需要多长时间?

长短真的要看项目。你必须记住,在这样的项目中有许多变量,例如:什么数据可用、数据质量、可用数据量、使用哪种算法、识别部署这种系统的最佳方法、需要什么培训等。一个初始项目可能需要六个月到三年的时间。然后循环重复。

8。您需要内部人才来实施它吗?需要哪些技能?

这实际上取决于组织的规模。小企业没有内部人才,而且很可能不值得雇佣一些。较大的组织可能有一些人,但他们需要指导。最好的技能是人工智能毕业生。然而,如果这是不可用的,一个人工智能专家监督软件开发人员应该这样做。聘请人工智能专家的主要好处不仅是因为他的专业知识,而且因为人工智能是一个快速发展的领域,他将能够使用最前沿的技术来指导你。这是非常重要的,无论是谁从事理解人工智能和有经验的人工智能系统,因为这些程序不同于正常的软件。主要元素是学习部分,它超出了可用的数据,但它试图概括,以涵盖看不见的例子。然而,许多人不理解这一部分,认为 AI 只是另一个程序。这将是一个巨大的错误和灾难。

9。你认为人工智能将如何影响未来的工作?

将来的工作可能会大不相同。我们所做的大部分事情都将被人工智能所增强。它将在后台帮助我们有效地解决问题。最有可能的是,计算机将变得更加无处不在。大型台式机将会消失,处理器将会集成到日常设备中。尽管信息现在被限制在屏幕上,但在未来,它将在桌子或墙壁等表面上漫游。任务将在服务之间无缝迁移,从而使工作无处不在。数据操作将变得轻而易举,所有东西都将通过物联网(IOT)设备连接在一起。未来是一个互联的未来,由人工智能驱动,但以人为中心。

10。你会给那些还没有开始研究人工智能的 CEO 们什么建议?

马尔科姆·Ⅹ曾经说过,“未来属于今天为它做准备的人”。有些人已经在梦想和设计明天的解决方案。技术已经成熟,我们拥有了处理能力,也终于有了拥抱人工智能革命的政治意愿。它接管只是时间问题。你还在等什么?迈出第一步,了解 AI。如果你有疑问,和人工智能专家聊聊,你可能会惊讶于人工智能能给你的组织带来的巨大节约。

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

Rachel Falzon 女士拥有雷丁大学亨利商学院人力资源专业的 MBA 学位。她曾担任过研究总监、业务发展和沟通经理、人力资源战略顾问,直到最近,她还担任过四大会计师事务所之一的顾问经理。她最近独自拓展业务,成为了员工绩效顾问。她的目的是培养学习型组织,提供核心技能和领导力培训、战略性人力资源/业务合作、变革管理、设计思维研讨会促进,以培养创新和创造性的方式看待人力资源问题和指导,从而增强个人面向未来的组织面对现代挑战和持续的数字破坏的能力。

10 个你一直想问的关于组织如何准备人工智能颠覆的问题,但是从来没有!

原文:https://towardsdatascience.com/10-questions-you-always-wanted-to-ask-those-organisations-disrupted-by-ai-but-never-did-aed0c361d074?source=collection_archive---------37-----------------------

Ms Rachel Falzon Vs Prof. Alexiei Dingli

雷切尔·法尔松女士是一名人事绩效顾问。她曾担任研究总监、业务发展和沟通经理、战略人力资源顾问,直到最近,她还担任四大会计师事务所之一的咨询经理。在第二部分,人工智能专家 Alexei Dingli教授从人类的角度询问了她关于数字颠覆的问题。这是第一篇讨论人工智能造成的破坏的文章。

Photo by Markus Spiske on Unsplash

  1. 在这个快速变化的世界里,你如何有效地应对变化?

我认为这是一个整体评估的问题,如何以及为什么商业前景发生了如此巨大的变化。我们谈论的是一个 VUCA 世界(不稳定、不确定、复杂和模糊),在这个世界中,人类和机器将越来越多地并肩工作,技术不断被破坏。从现在开始,商业就变得不同寻常了——我们需要永远处于学习、适应和创新的状态。这在很大程度上是在组织的各个层面培养一种成长心态,发展彼得·圣吉所说的“学习型组织”。没有固定思维模式的空间——我们都需要提高技能来应对不断变化的工作场所的需求,职业的概念正在消失。

2。在当今的数字世界,有哪些受追捧的技能?

例如,除了技术设计、编程、编码和数据分析等技术技能之外,核心技能,有时被称为“软”技能,将越来越受欢迎。这些人类的、更可转移的技能是不可替代的,我们的工作变得越自动化,人际交往、情商和自我意识将在工作场所发挥越重要的作用。根据 Linked-In 所做的调查,公司在候选人身上最看重的 5 种技能是创造力、说服力、协作能力、适应能力和时间管理能力。

3。这种转变就一定意味着人们会失业吗?

有些工作,尤其是有重复性任务的工作,将全部或部分实现自动化。然而,新的工作会被创造出来——因此提高技能和学习很重要。我们仍然非常重视工作角色和工作描述。展望未来,我预计我们将招聘技能人才,而不是“工作”。需要对员工和新员工的硬技能和“软”技能进行描述,以及他们在未来可能为组织带来最大价值的领域的技能提升。我认为,这将是一个招聘更具流动性的理想技能档案的问题,而不是一个工作“角色”。

Photo by Austin Chan on Unsplash

4。数字化转型是面向所有人的吗?

我不认为所有的组织都为变革做好了准备,当然也有一些变革失败了(据说 70%的变革都失败了)。从更以人为中心的角度来看,缺乏适当的变革管理技能,将“变革”视为一个不考虑人的因素(如抵制变革)而实施的项目,可能是原因之一。当然,还有技术能力。没有合适的团队和必要的技能,无论是内部的还是通过外部人工智能顾问外包的,适当的数据和能力,转型都不会成功。

5。你如何评估一个组织是否为数字化转型做好了准备,你倡导的流程是什么?

首先,我会评估组织的变革准备情况和内部能力,并确定是否有所需的变革管理技术能力来推动和完成转型。首先,我要确保有必要的基础,并从一开始就让所有利益攸关方参与这一进程。沟通、适当的利益相关者管理和透明度是关键。

6。这个过程需要多长时间?

这将取决于目标最终结果、变化的性质程度。如果我们着眼于更深层次的转型,这将意味着目标的转变,重新定义组织的使命和宗旨,并对商业模式、文化、结构和流程进行重大变革。这还需要改变的思维方式的行为方式——这种转变需要时间。我们正在考虑两到三年的时间,这取决于组织的规模。另一方面,如果是通过人工智能自动化一个简单的过程,这种变化应该更直接,不一定涉及审查底层文化和商业模式。

Photo by Proxyclick on Unsplash

7。如今的职场应该有多灵活?

我会说非常灵活和适应性强。劳动力的性质已经发生了变化,我们现在有 Z 世代和婴儿潮一代,自由职业者,零工或合同工和全职员工在同一支劳动力队伍中工作。个人越来越寻求灵活的工作条件、自主权和合理的工作量。雇主和雇员都需要考虑他们是否真的在改变他们“已知的”工作方式来适应新的现实。那些没有重新审视自己屡试不爽的做法的雇主,以及那些没有准备好提升技能、接受更具成长性的思维模式的员工,将会面临严峻的挑战。

8。谁在推动变革/转型,人力资源在其中将扮演什么角色?

通常,转型被视为自上而下的计划,其中变革的方向和启动是一项战略任务。然而,也有成功的自下而上或“紧急”举措,将责任转嫁给员工。事实上,直接的自上而下的方法可能不会获得正确的承诺和认同。这就是为什么英雄领导者作为唯一决策者和推动者的概念正在变得过时,并被一种更具共享性的领导和参与模式所取代,这种模式让更广泛的群体参与到共同创造的决策过程中。创新和变革可以来自组织的所有层级,但高级管理层和组织结构图需要支持这一点。

人力资源的作用至关重要。随着未来劳动力的不断发展,人力资源的角色也在不断发展,以满足转型和变革的需求。例如,即使是人力资源也需要在获取变革管理技能、基于正确的学习和发展、战略性劳动力规划、促进设计思维研讨会以实现共同创造等方面提高技能。我认为这个角色在面向未来的组织中会变得更加重要。可悲的是,我仍然在组织中看到许多例子,人力资源没有被给予所需的权力和预算来实施所需的变革。

9。你建议什么样的培训能让员工适应未来?

最初,我会推荐基于未来的情景规划,以便能够设想你的组织在 5 年后会处于什么位置。接下来,组织应该预测需要什么样的技能组合(在更技术性的“硬”技能和核心“人”技能方面)来提供竞争优势并推动组织前进。

推动所需行为变化并对业务产生积极影响的学习和发展(如采用更多的成长思维或发展情商和自我意识)不会在一夜之间发生,需要周期性的学习干预、辅导和指导。一旦你在目标技术和核心技能方面建立了一个基线,这就是一个为员工提供学习机会和发展动力以弥补技能差距的问题。有许多有效的学习解决方案,但您需要有人来推动学习和发展计划,并确保它能够带来所需的行为变化,从而对业务产生积极影响。

10。如果一个人决定开始这样的转变,第一步是什么?

我认为这将是分析和理解转型的性质和程度、所需的能力以及这将如何影响整个业务。此外,还要规划如何推广,是缓慢渐进的推广,还是因为情况紧急而需要更“大爆炸”的方法?

雷切尔·法尔松 女士拥有雷丁大学亨利商学院人力资源专业的 MBA 学位。她曾担任研究总监、业务发展和沟通经理、战略人力资源顾问,直到最近,她还担任四大会计师事务所之一的顾问经理。她最近独自拓展业务,成为了员工绩效顾问。她的目的是培养学习型组织,提供核心技能和领导力培训、战略性人力资源/业务合作、变革管理、设计思维研讨会促进,以培养创新和创造性的方式看待人力资源问题和指导,从而增强个人面向未来的组织面对现代挑战和持续的数字破坏的能力。

阿列克谢·丁力教授 是马耳他大学的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。

数据科学家开始使用商业模型的 10 个阅读材料

原文:https://towardsdatascience.com/10-reads-for-data-scientists-getting-started-with-business-models-78e6a224fd66?source=collection_archive---------14-----------------------

Photo by Andrew Gook on Unsplash

弥合技术技能和业务之间的差距

如果您刚开始接触数据科学,您可能会将注意力主要集中在统计和编码上。这没有错,事实上,这是正确的举措——这些是你需要在旅程早期培养的基本技能。

话虽如此,但在我的数据科学之旅中,我遇到的最大知识缺口并不涉及这两个领域。相反,在开始我的第一份全职数据科学家工作时,我惊讶地意识到,我并不真正了解业务。

我怀疑这是一个共同的主题。如果你在大学里学习了某个技术领域,或者通过在线课程学到了一些东西,那么你就不太可能有任何理由去深入研究商业概念,比如模型、战略或者重要的指标。除此之外,我真的没有遇到过对这种理解进行压力测试的数据科学采访。他们中的许多人试图获得产品直觉的感觉,但我发现它很少超越这一点。

事实是,在数据科学社区中,业务理解并没有被教授或传播到实际应用的程度。这篇文章的目标是通过分享一些我发现最有帮助的资源来帮助弥合这一差距,因为我已经了解了企业是如何从内到外运作的。

16 个创业指标

如果你试图熟悉一个企业中出现的大量指标和首字母缩写词,无论它是否是一家初创企业,那么来自的安德森·霍洛维茨的这篇文章是一个很好的起点。总的来说,他们的帖子质量一贯很高,几乎总是值得你花时间。如果你有更大的胃口,查看他们关于 16 个更多指标的后续帖子和下面的帖子,了解更多关于指标的技巧。

Some helpful tips on misleading metrics

30 种成功的商业模式

作为一个全面的可靠资源,FourWeekMBA 上的文章在某种程度上是值得探究的。我特别推荐这本书,因为它是对所有不同商业模式的概述。不学点新的东西,很难从中解脱出来。为了更实际地探究商业模式,我还发现这篇文章讲述了 Slack 如何让金钱变得有趣。

聚集理论

这个比前两个密一点,但是真的很优秀。Stratechery 中不容错过的 Ben Thompson 讲述了市场是如何运作的,以及为什么某些公司主宰着他们的行业。这篇文章的要点是,市场有三个组成部分,能够垄断其中两个的公司通常会大获全胜。想想网飞。

为什么投资者不投资相亲

到目前为止,我们看到的很多都是概念性的,所以让我们来看一个具体的模型,并分析它为什么可行和不可行。我最喜欢的商业作家之一,陈楚翔关注约会行业以及为什么大多数投资者不觉得它有吸引力。这位风险投资家的其他优秀文章通常会涵盖诸如增长和指标等内容。

Why Investors Don’t Fund Dating

数据工厂

更多来自本·汤普森,这是他的另一篇伟大的文章。这一次是关于大公司,尤其是脸书和谷歌,如何将数据从原始形式处理成有独特价值的东西。该报告于 2018 年秋季发布,为我们现在看到的所有数据隐私和监管问题的商业方面提供了一个良好的早期视角。

LTV 公式的危险诱惑

如果你不熟悉 LTV(终生价值),那么你可能必须在某个时候熟悉它。关于这个指标有很多资源,但这可能是我最喜欢的关于这个主题的方法。它清楚地解释了如何计算 LTV,以及为什么你应该在没有上下文的情况下盲目买入之前三思。

打造 1 亿美元企业的五种方法

这篇短文主要关注 SaaS(软件即服务)商业模式。下图简单地描述了基本的想法,但是我仍然建议你花时间阅读完整的文章。Christoph Janz 在解决复杂问题并将其分解方面做得非常出色。他最近还在的新帖中更新了图表。

Five Ways to Build A $100 Million Business

战略信 V

StackOverflow 的联合创始人和前首席执行官 Joel Spolsky 在这里强调了一个重要的半商业半经济学的教训:聪明的公司试图将他们产品的补充物商品化。他们是否成功是一个非常不同的故事,这里有大量的例子。

如何通过捆绑销售获得商业成功

我们讨论了公司赚钱的几种方式,但是这个资源采用了最简单的(也是最准确的)方法。这一切都是从吉姆·巴克斯代尔在一次贸易展览会上开始的。当他出门赶飞机时,他在离开前给观众留下了最后一颗智慧之珠,它很好地总结了这篇文章。

"先生们,我知道的赚钱方式只有两种:捆绑销售和非捆绑销售."

MBA 案例研究

最后但同样重要的是,如果你想更进一步,我推荐案例研究。你可以从顶尖大学找到很多,比如斯坦福大学、T2 大学和哈佛大学,价格很便宜,或者经常是免费的。一旦你掌握了基本原理,这是继续补充你的学习的极好方法。这就是我目前的处境——我已经挑战自己,整个夏天每两周进行一次案例研究。和我一起上路吧!

包扎

列表就这样了。我知道以上所有的链接真的帮助了我,我希望你花时间去探索它们。您可能已经注意到,并非所有这些都与数据科学家的日常生活息息相关,这是有意的。

我在我的上一篇文章中说过,我将再说一遍——数据科学家是思想家。当我们了解我们周围的系统时,我们的工作做得最好。这种理解为我们设置了很酷的东西:探索性分析、机器学习和数据可视化。先打基础,后收获收益。这就是它的意义所在。

以上选取的资源深受《Squarespace》的 SVP、安德鲁·巴塞洛缪的 阅读清单 的影响。

感谢阅读!请随意查看下面我的一些类似文章,并订阅我的时事通讯中有趣的链接和新内容。

  • 新的和有抱负的数据科学家建议汇编
  • 数据科学家的入职应该是什么样的?
  • 面向数据科学家的 13 份重要新闻简报:重新制作

你可以在 Medium 上关注我更多类似的帖子,也可以在 Twitter 上找到我。更多关于我和我在做什么,请查看我的网站。

区块链技术成为趋势的 10 个原因

原文:https://towardsdatascience.com/10-reasons-why-blockchain-technology-in-trend-97c947735897?source=collection_archive---------29-----------------------

为什么区块链将成为最热门和最受欢迎的技术?

技术进步不是很快吗?作为互联网的第一批用户,我们知道确实如此。它走过了漫长的道路。从我们最初使用的拨号上网,我们现在有千兆位的网速。选择如此之多,速度如此之快,以至于你最终会困惑于应该选择哪一个频谱束。或者任何互联网服务提供商。

Blockchain Technology | Source

所以如果你还在编辑 Java 代码,用 PowerBuilder 工作,我们会说你还活在过去!现在事情发生了革命性的变化,如果你跟不上步伐,你就会被甩在后面。

这些革命性技术之一是区块链技术。现在是了解它的时候了,因为它还处于起步阶段。无论你是渴望成为一名用户、开发者还是投资者,让我们来讨论一下为什么区块链可以提供一个更好、更安全的未来。

区块链是一项有前途的技术的 10 大理由

  1. 尖端技术。

2.需求高。

3.促进通用基础设施。

4.预计投资。

5.数字身份和数据安全。

6.依赖区块链的行业。

7.与新时代技术的结合。

8.链条中的绝对中断。

9.这个时代的转折点。

10.薪水更高的工作。

我们来讨论一下吧!

1.尖端技术

你知道吗,根据一项调查,目前世界上只有 0.5%的人在使用区块链。因为我们相信这项技术有如此大的潜力,我们有机会成为第一批学习它的人。你真正需要做的是:

收集所有有用的资源,并开始有效地运用它们。

尽可能多地学习区块链相关技能。

了解区块链技术的工作原理。

应用所有这些获得的知识来构建分散的应用程序。

高需求

谁不想要新的机会?尤其是当新技术席卷全球的时候!区块链无疑是一个蓬勃发展的领域。如果你掌握了它,你会发现无数的机会。区块链就像一个趋势性的浪潮,一个革命性的平台,将改变一切。由你来决定你是否有合适的技能在这个领域找到你的运气。如果是的话,你将会发现大量的机会。

促进通用基础设施

DLT(分布式账本技术)和区块链本质上连接在一起,形成了一种全新的基础设施。这种基础设施将是通用的,并将集成到现有的流程和系统中。

因此,我们谈论的是单一解决方案设施和基础设施。不仅让事情变得更简单,而且在现有系统中的整合也会很顺畅。

计算投资

如果你了解所有区块链相关概念,你最终会做出更明智的投资和交易决策。在投资一种加密货币之前,你需要了解所有加密货币背后的技术。而那个技术就是区块链!

数字身份和数据安全

数据泄露是一件普遍的事情。它们经常发生。说我们的机密信息很容易受到攻击并不为过。这适用于信用卡号码、位置跟踪、各种档案的活动和密码,等等。

但是你猜怎么着!区块链基础设施完全消除了保存和存储个人数据的需求。也包括你!当区块链有能力解决所有这些安全问题时,难道不值得学习吗?

依赖区块链的行业

谈到市场上的技术,区块链正在发挥主导作用。如果说银行业是唯一会受到上述技术影响的行业,那就错了。相反,超市、医疗保健、投票、能源资源和许多其他行业将在未来融入区块链。这意味着学习一门有如此多依赖行业的技术将为你打开许多门路。

与新时代技术的整合

这项技术渴望改变世界。我们已经讨论过各种行业,这些行业会整合区块链。但是物联网肯定是这个名单中最大的候选者。不必担心用户数据的真实性,为了建立一个自主协作的安全基础设施,很容易发挥创造力。

链条中的绝对中断

这项技术将提高有关各方之间的忠实度和信任度。它降低了价值链,打破了工作流程。这加快了所有相关过程的速度。反过来,将会重新关注价值链的某些参与者。因此,将会有大量的工作机会。为什么?因为玩家将估量未来的位置,经理将重新评估价值链!

这个时代的转折点

世界已经到了一个转折点,这将改变我们做生意的方式。原因是区块链!甚至金融机构也承认区块链的颠覆性。预测表明,到 2024 年,区块链将达到临界质量。趁着还不晚,还是赶紧去冲浪这股潮流吧!

报酬较高的工作

对于区块链爱好者来说,就业市场看起来不可思议。这适用于老牌公司和加密初创公司。这个部门的就业机会将在未来几年成倍增长。我们可以期待的一些职位是加密货币高级软件工程师、加密货币开发人员、加密货币交易员、加密货币分析师等等。

简而言之,就像你在订阅之前尽可能多地了解频谱互联网套餐一样,你必须了解区块链技术。这将是你的优势!

用 Python 加速数据分析的 10 个简单技巧

原文:https://towardsdatascience.com/10-simple-hacks-to-speed-up-your-data-analysis-in-python-ec18c6396e6b?source=collection_archive---------0-----------------------

Source

提示和技巧,尤其是在编程领域,非常有用。有时候一点小技巧既能节省时间又能挽救生命。一个小的快捷方式或附加功能有时会被证明是天赐之物,可以成为真正的生产力助推器。所以,这里有一些我最喜欢的技巧和窍门,我用它们汇编成了这篇文章。有些可能是相当有名的,有些可能是新的,但我相信,下次你从事数据分析项目时,它们会非常方便。

1.描绘熊猫数据帧

剖析是一个帮助我们理解数据的过程,而Pandas Profiling是一个 python 包,它正好可以做到这一点。这是对熊猫数据框架进行探索性数据分析的一种简单而快速的方法。熊猫df.describe()df.info()functions通常被用作 EDA 过程的第一步。但是,它只是给出了数据的一个非常基本的概述,对于大型数据集没有太大的帮助。另一方面,Pandas Profiling 函数使用df.profile_report()扩展了 pandas DataFrame,以便进行快速数据分析。它用一行代码显示了大量信息,在交互式 HTML 报告中也是如此。

对于给定的数据集,pandas profiling 包计算以下统计数据:

Statistics computer by Pandas Profiling package.

装置

pip install pandas-profiling
or
conda install -c anaconda pandas-profiling

使用

让我们使用古老的 titanic 数据集来演示多功能 python 分析器的功能。

#importing the necessary packages
import pandas as pd
import pandas_profiling#Pandas-Profiling 2.0.0
df = pd.read_csv('titanic/train.csv')
df.profile_report()

在 Jupyter 笔记本中显示数据分析报告只需要这一行代码。这份报告非常详细,必要时还附有图表。

该报告也可以用下面的代码导出到一个交互式 HTML 文件中。

profile = df.profile_report(title='Pandas Profiling Report')
profile.to_file(outputfile="Titanic data profiling.html")

更多细节和示例请参考文件。

2.给熊猫情节带来互动性

Pandas 有一个内置的.plot()函数作为 DataFrame 类的一部分。然而,用这个函数呈现的可视化效果不是交互式的,这使得它不那么吸引人。相反,也不能排除用pandas.DataFrame.plot()功能绘制图表的方便性。如果我们不用对代码进行大的修改就能绘制出像熊猫图表那样的交互式图表,会怎么样?嗯,实际上你可以借助 袖扣 库**来做到这一点。**

袖扣库将plottly的力量与熊猫的灵活绑定,方便出图。现在让我们看看如何安装这个库,并让它在 pandas 中工作。

装置

pip install plotly # Plotly is a pre-requisite before installing cufflinks
pip install cufflinks

使用

#importing Pandas 
import pandas as pd
#importing plotly and cufflinks in offline mode
import cufflinks as cfimport plotly.offline
cf.go_offline()
cf.set_config_file(offline=False, world_readable=True)

是时候看看泰坦尼克号数据集的神奇之处了。

df.iplot()

******

df.iplot() vs df.plot()**

右边的可视化显示了静态图表,而左边的图表是交互式的,更加详细,所有这些都没有在语法上做任何重大改变。

点击此处 查看更多示例。

3.一丝魔力

Magic commands 是 Jupyter 笔记本中的一组便利功能,旨在解决标准数据分析中的一些常见问题。在%lsmagic的帮助下,你可以看到所有可用的魔法。

List of all available magic functions

魔术命令有两种: 行魔术 ,以单个%字符为前缀,对单行输入进行操作;以及 单元格魔术 ,与双%%前缀相关联,对多行输入进行操作。如果设置为 1,魔术函数无需输入初始%即可调用。

让我们看看其中一些在常见数据分析任务中可能有用的工具:

  • % pastebin

%pastebin 上传代码到 Pastebin 并返回 URL。Pastebin 是一个在线内容托管服务,在这里我们可以存储像源代码片段这样的纯文本,然后可以与他人共享 URL。事实上,Github gist 也类似于 pastebin ,尽管有版本控制。

考虑具有以下内容的 python 脚本file.py:

#file.py
def foo(x):
    return x

使用 Jupyter 笔记本中的 %pastebin 生成一个 pastebin url。

  • %matplotlib 笔记本

%matplotlib inline函数用于呈现 Jupyter 笔记本中的静态 matplotlib 图。尝试用notebook 替换inline部分,轻松获得可缩放的&可调整大小的图。确保在导入 matplotlib 库之前调用该函数。

%matplotlib inline vs %matplotlib notebook

  • %运行

%run函数在笔记本中运行一个 python 脚本。

%run file.py
  • % %写文件

%%writefile将单元格的内容写入文件。这里,代码将被写入一个名为 foo.py 的文件,并保存在当前目录中。

  • % %乳胶

%%latex 函数将单元格内容呈现为 latex。这对于在单元格中书写数学公式和方程式非常有用。

4.查找和消除错误

交互式调试器也是一个神奇的功能,但是我给了它一个自己的类别。如果在运行代码单元时出现异常,在新的一行中键入%debug并运行它。这将打开一个交互式调试环境,将您带到发生异常的位置。您还可以检查程序中分配的变量值,并在此执行操作。点击q退出调试器。

5.印刷也可以很漂亮

如果您想要生成美观的数据结构表示,那么 pprint 是您需要的模块。它在打印字典或 JSON 数据时特别有用。让我们看一个同时使用printpprint来显示输出的例子。

****

6.让音符突出。

我们可以在您的 Jupyter 笔记本中使用提醒/笔记框来突出显示重要的事情或任何需要突出显示的内容。注释的颜色取决于指定的警报类型。只需在需要突出显示的单元格中添加以下任意或所有代码。

  • 蓝色警告框:信息
<div class="alert alert-block alert-info">
<b>Tip:</b> Use blue boxes (alert-info) for tips and notes. 
If it’s a note, you don’t have to include the word “Note”.
</div>

  • 黄色警告框:警告
<div class="alert alert-block alert-warning">
<b>Example:</b> Yellow Boxes are generally used to include additional examples or mathematical formulas.
</div>

  • 绿色警告框:成功
<div class="alert alert-block alert-success">
Use green box only when necessary like to display links to related content.
</div>

  • 红色警告框:危险
<div class="alert alert-block alert-danger">
It is good to avoid red boxes but can be used to alert users to not delete some important part of code etc. 
</div>

7.打印单元格的所有输出

考虑包含以下代码行的 Jupyter Notebook 的一个单元格:

In  [1]: 10+5          
         11+6Out [1]: 17

只有最后一个输出被打印出来,这是单元格的正常属性,对于其他输出,我们需要添加print()函数。事实证明,我们可以通过在笔记本顶部添加以下代码片段来打印所有输出。

from IPython.core.interactiveshell import InteractiveShell  InteractiveShell.ast_node_interactivity = "**all**"

现在所有的输出都一个接一个地打印出来了。

In  [1]: 10+5          
         11+6
         12+7Out [1]: 15
Out [1]: 17
Out [1]: 19

要恢复到原始设置:

InteractiveShell.ast_node_interactivity = "**last_expr**"

8.使用“I”选项运行 python 脚本。

从命令行运行 python 脚本的典型方式是:python hello.py.然而,如果在运行相同的脚本时添加一个额外的-i ,例如python -i hello.py,它会提供更多的优势。让我们看看怎么做。

  • 首先,一旦程序结束,python 不会退出解释器。因此,我们可以检查变量值和程序中定义的函数的正确性。

  • 其次,我们可以通过以下方式轻松调用 python 调试器,因为我们仍然在解释器中:
import pdb
pdb.pm()

这将把我们带到发生异常的位置,然后我们可以处理代码。

原文 出处 的 hack。

9.自动注释掉代码

Ctrl/Cmd + /自动注释掉单元格中选中的行。再次点击该组合将取消对同一行代码的注释。

10.删除是人性,恢复神性

你曾经不小心删除了 Jupyter 笔记本中的单元格吗?如果是,那么这里有一个可以撤消删除操作快捷方式。

  • 如果您删除了单元格中的内容,您可以通过点击CTRL/CMD+Z轻松恢复
  • 如果您需要恢复整个删除的单元格,请点击ESC+ZEDIT > Undo Delete Cells

结论

在本文中,我列出了我在使用 Python 和 Jupyter 笔记本时收集的主要技巧。我相信这些简单的技巧会对你有用,你会从这篇文章中受益匪浅。直到那时快乐编码!。

使用云服务安排脚本的 10 步指南(免费)

原文:https://towardsdatascience.com/10-step-guide-to-schedule-your-script-using-cloud-services-7f4a8e517d81?source=collection_archive---------5-----------------------

credit: https://www.pexels.com/photo/bandwidth-close-up-computer-connection-1148820/

为什么我不能在我的笔记本上运行它?

嗯…,你可以在本地运行它,我相信如果你是 Windows 用户,很多人可能知道任务调度功能。我们设置触发时间和条件,脚本将根据我们预定义的标准运行。然而,这样做的缺点是,你需要让你的电脑在预定的时间“开机”(如果不是一直开机的话)。

当我想运行我的小脚本来检索每天早上的天气预报时,我遇到了这个问题。让我的笔记本电脑一直开着,只是为了每天运行这个简单的任务,这对我来说是不现实的。

请将此视为带笔记本仪表板的免费指南:第三天 / 第四天。这完全归功于雷切尔博士和 Kaggle 团队。感谢他们在原创内容上的努力,他们还在这里发布了直播录制的。

本文旨在帮助那些不是核心程序员并且不熟悉 Bash 和云服务中的文件系统的人。因此,我在这里包括了很多截图和详细的解释。

使用 Kaggle 和 PythonAnywhere 云服务调度 Python/R 脚本

  1. Kaggle account ,我们将使用内核来托管和运行我们的 Python 脚本。
  2. PythonAnywhere account ,我们将使用任务调度来触发我们托管在 Kaggle 上的脚本。

我们需要做什么?

  1. 设置 Kaggle 账户,进入“内核”标签,然后点击“新内核”。您可以选择脚本或笔记本。

它将重定向到控制台,带有设置选项卡。在这里,您可以上传数据,选择语言(Python/R /RMarkdown),添加自定义包,还可以在这里为您的脚本设置 GPU/Internet 选项。

You can customize your settings here, in my case, I changed option to “Internet connected”. I also added some packages, you can select your “Docker” as well.

保存并提交您的代码,然后返回内核页面,您将在这里看到您的工作。在这个例子中,我的内核名是‘weather alert FB’。

‘WeatherAlertFB’ script

现在,你的剧本准备好了…

2.转到您的用户配置文件的“帐户”选项卡,向下滚动直到您找到“创建 API 令牌”。这将下载kaggle.json,一个包含您的 API 凭证的文件。更多关于 Kaggle API 的细节请点击。

用记事本打开你的kaggle.json文件。

在你的结尾加上一行"proxy": "http://proxy.server:3128"。json 文件。应该是这样的。

{“username”:”[KAGGLE USERNAME]”,”key”:”[API KEY]",”proxy”: “http://proxy.server:3128"}

3.到的处登记。在您的仪表板页面的“新控制台:”部分,单击$ Bash。您将看到创建了新的 Bash 控制台。运行命令pip install kaggle --user来安装 Kaggle API。

上传您的kaggle.json文件。通过运行ls检查您的文件是否已经上传。您应该看到列出了kaggle.json

You can also inspect your json file by typing **cat kaggle.json**

4.制造。kaggle 目录;

mkdir --parents /home/[Your_Python_Anywhere_Username]/.kaggle

通过运行命令移动kaggle.json文件;

mv kaggle.json /home/[Your_Python_Anywhere_Username]/.kaggle/kaggle.json

kaggle -h will show the help commands.

5.通过运行以下命令将您的凭据设为私有;chmod 600 /home/[Your_Python_Anywhere_Username]/.kaggle/kaggle.json

6.你可以通过运行来搜索你的内核,根据你最近运行它们的时间来排序;kaggle kernels list --user [YOUR KAGGLE USERNAME HERE] --sort-by dateRun

kaggle kernels list — user ekapope — sort-by dateRun

通过运行以下命令获取内核的副本:kaggle kernels pull [AUTHOR'S KAGGLE USERNAME]/[KERNEL SLUG FROM URL] -m

正在运行ls。您应该看到笔记本文件和元数据文件都在您当前的工作目录中。

kaggle kernels pull ekapope/world-bank-eda-for-dashboard -m

7.通过运行kaggle kernels push推送您的笔记本

该命令将重新运行脚本,并在 Kaggle 上提交新版本。

It shows that ‘Kernel version 8’ successfully pushed.

Check on Kaggle log, pushed successful. No errors.

8.使用任何文本编辑器创建新的文本文件,将下面的代码放入其中。

#!/usr/bin/env bash
kaggle kernels pull pull [KAGGLE USERNAME]/[KERNEL SLUG] -m
kaggle kernels push -p /home/[Your_Python_Anywhere_Username]

另存为' run_kernel.sh ',然后上传到 PythonAnywhere。

run_kernel.sh file

Checking your files in the root directory.

You should have 3 new files by now.

9.运行命令chmod u+x run_kernel.sh

然后通过运行./run_kernel.sh来运行您的脚本。这应该会更新您在 Kaggle 上的内核。

10.转到 PythonAnywhere 上的 Task 选项卡来计划您的脚本。

时间是 UTC,而不是您当地的时区。输入您的文件路径。sh 脚本。/home/[Your_Python_Anywhere_Username]/run_kernel.sh,点击“创建”按钮。

然后…完成了!您的脚本将在每天指定的 UTC 时间运行。

请注意,对于免费层,您的脚本将在一个月后停止运行,除非您手动续订,所以要小心。

感谢您的阅读。请尝试一下,玩得开心,并让我知道你的反馈!与我联系讨论你的鼓舞人心的项目。

如果你喜欢我的做法,可以考虑在 GitHub 、 Medium 和 Twitter 上关注我。😛

成为数据科学家的 10 个步骤

原文:https://towardsdatascience.com/10-steps-to-become-a-data-scientist-6c8e7ac6288e?source=collection_archive---------33-----------------------

立即学习数据科学。

即使对于最优秀的工程师来说,成为一名数据科学家也并不容易。然而,这对任何学生来说都不太难,而且有一些事情你应该事先知道。本文将对它们进行研究,为您提供在数据科学领域取得成功的清晰路线图。

Become a data scientist in 10 steps. Learn Data Science.

1.你需要做什么

  • 设定目标小时数
  • 为了编写代码,计划你需要知道/经历的事情
  • 为一个能提供好建议的聪明人冒一点时间的风险
  • 选择一个感兴趣的数据集并执行搜索
  • 承认最大的挑战在开始
  • 忘记二元分类:交叉验证和贝叶斯算法将帮助你成为一名真正优秀的数据科学家
  • 了解如何在数据科学面试中提出正确的问题

2.问题陈述

对于每个问题,用简单的英语写下问题陈述。我已经写了一篇关于制作可读数据科学问题的帖子。

这也是一个很好的机会来看看一些真实的公司在数据科学过程中遇到的问题的技术示例。

3.写一些代码

编写代码并运行它。面试官会看一下代码,然后回答问题(见下文)。

  • 估计你需要多少时间来准备数据
  • 你的团队中解决这个问题的平均人数应该是多少
  • 什么会出错?这可能是一个提示,为任务 3 选择一个更容易使用的工具
  • 写下你将用来解决问题的工具

4.准备并评估你的答案

确保有有效的解决方案,既简洁又有创意。

写下你对这些问题的回答。

5.检查您的答案

提炼你的答案,问问你自己为什么不利用一些现有的框架或工具

这将帮助你确定你需要学习更多的领域,并说服自己为将来的面试写一些材料。

6.展示你对这个问题的解决方案

作为奖励,准备并向第三方展示你的解决方案,他们将帮助你与面试应聘者的机构取得联系

准备一个笔记本,记下你所有的解决方案,这样你就可以和你的团队讨论你的解决方案

7.确定假设

定义你认为你的面试官在公司的假设和你将要处理的任务。不要在这些假设上妥协,因为这是将你从人群中分离出来的好方法

8.确定解决方案

确定满足团队期望和任务的解决方案。当你有时间的时候,回顾你的团队的期望和工具。

9.运用帕累托原则

使用帕累托分布定律,这是统计学中的一个概念。在这种情况下,分布描述了任何一对独立事件中最好的一个会给出的最可能的结果。考虑以下值作为数据样本。

10.建立一个模型

每个问题都有一个可能的答案,它符合你所拥有的数据。花时间定义一个强大的解决方案,应用它,并在未来的面试中证明它

编程经验对数据科学至关重要:你必须执行代码,在没有任何代码的情况下发现错误。在这种情况下,没有代码比没有代码更糟糕。如果要求你重写代码和修复 bug,你可以找数据科学家试试。

编程语言的差异没有文化差异重要。两组的学习曲线可以帮助你确定你需要坚持的地方,以获得最好的机会。

如果你很紧张,你也可以在面试中问一些问题,比如如何组织你的代码以适应公司的结构,以及如何跟踪未来几周你需要做什么工作。

结论

每个公司都重视数据科学;他们不太可能雇佣没有足够技能的人。如果你进入这家公司时已经相信自己是这家公司最好的数据科学家,这可能是一个不利因素。

然而,值得记住的是,有些团队并不真的关心或找到优秀的候选人。作为一名数据科学家,你将不得不在面试过程中就你的工资、工作时间和许多其他事情进行谈判。

成为工程师需要很长时间;成为伟大的数据科学家所需的时间更短。

Data Science Job

最后,如果你想了解成为一名数据科学家意味着什么,那么看看我的书数据科学工作:如何成为一名数据科学家,它将指导你完成这个过程。

成功设置 Python 项目的 10 个步骤

原文:https://towardsdatascience.com/10-steps-to-set-up-your-python-project-for-success-14ff88b5d13?source=collection_archive---------4-----------------------

如何添加测试、CI、代码覆盖率等等

在本指南中,我们将通过添加测试和集成来加速开发并提高代码质量和一致性。如果你没有一个基本的 Python 包,可以看看我的构建指南,然后在这里见面。

[## 构建您的第一个开源 Python 项目

工作包的逐步指南

towardsdatascience.com](/build-your-first-open-source-python-project-53471c9942a7)

酷毙了。以下是本文的十步计划:

  1. 安装黑色
  2. 创造。pycache
  3. 安装 pytest
  4. 创建测试
  5. 注册 Travis CI 并配置
  6. 创建. travis.yaml
  7. 测试 Travis CI
  8. 添加代码覆盖率
  9. 添加工作服
  10. 添加 PyUp

本指南适用于使用 Python 3.7 的 macOS。截至 2019 年初,一切正常,但事情变化很快。

我们有工作要做。让我们开始吧!🐸

第一步:安装黑色

您的包代码应该遵循通用的样式约定。 Black 是一个 Python 包,它自动为你格式化你的代码,使之符合 PEP 8 。Black 相对较新,已经有超过一百万的下载量。使用它很快成为 Python 编码中的最佳实践。这里有一个很好的黑色指南。

我使用 Atom 作为我的编辑器,所以我给 Atom 添加了 Python-Black 包— 安装信息在这里是。现在,当您保存文件时,Atom 将重新格式化您的代码。

现在,让我们为我们的合作者将 Black 添加到开发环境中。最终,任何参与该项目的人都将遵循相同的风格指南,否则他们的拉请求将不会被接受。😦

black==18.9b0添加到 requirements_dev.txt 的下一个空行,并运行pip install -r requirements_dev.txt

黑色使 88 个字符成为默认的最大行长度。有些指南和程序需要 79 个字符,例如斯芬克斯风格指南。在黑色原子包中,你可以设置最大长度。

既然我们已经开始节省编写代码的时间,那么让我们节省将应用程序推送到 PyPI 的时间。

第二步:创建。pypirc

当我们使用 twine 将我们的构建推送到 TestPyPI 和 PyPI 时,我们需要手动输入我们的登录信息。如果你对麻线不熟悉,请看我之前的文章。让我们自动化这个过程。

Twine 将查找名为的文件。pypirc 在我们的主目录中。它会在上传文件时获取我们的 url、登录名和密码。

创建您的。您的主目录中的 pypirc 文件,包含:

touch ~/.pypirc

将以下内容添加到您的中。pypirc 文件:

[distutils]
index-servers =
    pypi
    testpypi

[testpypi]
repository: https://test.pypi.org/legacy
username = your_username
password = your_pypitest_password

[pypi]
username = your_username
password = your_pypi_password

替换为您的用户名和密码。确保将该文件保存在您的主目录中,而不是当前的工作目录中。如果要确保您机器上的其他用户不能访问该文件,您可以从命令行更改其权限:

chmod 600 ~/.pypirc

现在,您可以使用以下命令将您的包上传到 TestPyPI:

twine upload -r testpypi dist/*

使用以下命令上传到真实的 PyPI:

twine upload dist/*

不再需要输入用户名和密码。这不是很好吗?😄

现在让我们添加一些测试来确保我们的包能够工作。

步骤 3:安装和配置 pytest

Pytest 是测试 Python 代码的最流行、最容易使用的库。在这个例子中,我们将向我们的项目添加简单的测试。如果你想了解 pytest,这里有一个很好的介绍教程。另一个很好的指南是 Brian Okken 的书 Python 测试与 Pytest 。

使用以下命令将 pytest 添加到 requirements_dev.txt 文件中

pytest==4.3.0

运行pip install requirements_dev.txt

然后运行以下命令,以便 pytest 可以找到您的包:

pip install -e .

如果您停用您的虚拟环境,您将需要再次运行两个 pip 命令来运行您的测试。

步骤 4:创建测试

在项目的顶层添加一个测试文件夹。在其中添加一个名为test_your_package_name.py的文件。我的文件命名为test_notebookc.py。以test_开头的文件可以让 pytest 自动发现它。

test_notebookc.py中,我添加了以下测试来检查正确的名称是否作为函数输出的一部分打印出来。修改以适合您自己的文件名和函数名。

这是怎么回事?

我们首先导入我们的模块。然后我们用test_my_function_name创建一个函数。这个命名约定对其他人和我们即将添加的代码覆盖包很有帮助。

然后我们调用我们的函数, convert ,用“Jill”作为参数。然后我们捕捉输出。提醒一下,我们的 convert 函数非常基本——它接受参数 my_name 并输出一行:

print(f”I’ll convert a notebook for you some day, {my_name}.”)

Pytest 检查输出中是否有字符串“Jall”。它不应该存在,因为我们传入了“Jill”。参见 pytest 文档中关于捕获输出的内容。

通过在命令行输入pytest来运行您的测试。您的测试应该失败,并显示红色文本。

确保您的测试在应该失败的时候失败是一个很好的实践。不要只是写他们,所以他们马上是绿色的。否则,您的测试可能不会测试您认为它们是什么。😉

在测试失败后,我们可以将预期输出从Jall更改为 Jill,我们的测试应该以绿色通过。

是的,都很好。现在我们有了一个测试,确保当有人向我们的函数传递一个字符串值时,该字符串被打印出来。

让我们添加一个测试来检查是否只有一个字符串被传递给了我们的函数。如果传递了字符串之外的任何内容,则应该引发 TypeError。这里有一个关于 Python 中异常和错误处理的好指南。

当我们在编写通过测试的代码之前编写测试时,我们正在进行测试驱动开发(TDD)。TDD 是一种行之有效的方法,可以编写错误更少的代码。这里有一篇关于 TDD 的好文章。

这次让我们尝试一些不同的东西。作为练习,添加您自己的测试和代码,以确保只有一个字符串可以作为参数传递给convert()。提示:整数、列表和字典被类型转换成字符串。在 Twitter @discdiver 上关注我,我会在那里发布解决方案。

在我们通过测试后,我们准备好将我们的包与 CI 服务集成。

步骤 5:注册 Travis CI 并进行配置

Travis CI 是一个“托管的、分布式的持续集成服务,用于构建和测试软件项目”。它最近被 Idera 收购。还有其他 CI 选项,但是 Travis CI 很受欢迎,是免费的开源软件,并且有很好的文档记录。

Travis CI 更容易确保只有通过测试和标准的代码才被集成到项目中。点击了解更多关于 Travis CI 的信息,点击了解更多关于持续集成的信息。

在https://travis-ci.org/注册账户。从您的 Travis CI 档案页面点击查看并添加您的授权组织链接。系统会提示您输入 GitHub 密码。点击贵组织访问权限旁边的授予

我必须将我的notebook 帐户同步到所有以显示为一个组织,并显示 notebookc 存储库。数据开始流动通常需要一分钟或更长时间。然后将你的回购切换到的

点击设置。您可以选择是否希望 Travis 基于推送请求和/或推送分支进行构建。

现在我们需要在本地配置一个文件,以便 Travis 为每个 pull 请求构建。

步骤 6:创建. travis.yml

在项目文件夹的顶层,添加一个包含以下内容的. travis.yml 文件:

dist: xenial
language: python
python: 3.7.2
install:
  - pip install -r requirements_dev.txt
  - pip install -e .
script:
  - pytest

需要dist: xenial来指定 Travis 应该为其虚拟环境使用 Ubuntu Xenial 16.04。必须指定 Xenial 来测试 Python 3.7 代码。更多信息点击这里。

可以指定不同版本的 Python 进行测试。我们将在以后的文章中讨论这个主题。跟着我确保不要错过!

install部分确保我们的开发包被安装。pip install -e .将您的软件包作为轮子安装到 Travis 的虚拟环境中。然后 Travis 会在运行 pytest 时找到您的包。

步骤 7:测试 Travis CI

提交你的修改,推送到 GitHub,做一个公关。Travis 应该会在几秒钟内开始自动运行。

特拉维斯是这么做的。

From travis.ci

如果你的公关失败了,特拉维斯会告诉你的。

请注意,如果拉请求失败,您可以推送到同一个分支,Travis 会自动重新运行。

去 Travis 上你的回购页面看看吧。崔维斯有很多关于你身材的信息。您将来可能会经常访问这个站点,试图找出您的构建没有通过的原因。😄

假设一切都是绿色的,你就可以走了!

如果您没有看到任何红色或绿色,请点击更多选项菜单,并从下拉菜单中选择请求。如果您看到红色,请查看错误消息。如果您看到错误构建配置文件是必需的,那么 Travis 没有在 GitHub 上找到您的. travis.yml 文件。确保它在您的 GitHub repo 中。😉

Travis 会向您发送电子邮件,让您知道何时构建失败以及何时失败的构建已被修复。

请记住,您可以继续将您的提交推送到一个开放的 PR,Travis 将自动重新运行。

让我们看看我们的代码有多少测试覆盖率。

步骤 8:添加代码覆盖率

代码覆盖率报告向您展示了多少百分比的代码至少具有一些测试覆盖率。我们将添加 pytest-cov 包来创建一个报告。

将下面一行添加到 requirements_dev.txt 中:

pytest-cov==2.6.1

pytest --cov=my_project_name运行

我对pytest --cov=notebookc的输出是这样的:

太好了,我们所有的代码都被覆盖了!当你只有几行的时候,那就不算高了。😄但是我们不需要告诉全世界——让我们向他们展示我们已经覆盖了!

第九步:添加工作服

工作服为全世界提供了您的代码覆盖率的历史。

前往https://coveralls.io/用你的 GitHub 证书注册一个账户。添加您的组织,并在 repo 出现时打开它。

requirements_dev.txt 中增加coveralls==1.6.0。你的 requirements_dev.txt 现在应该是这样的:

pip==19.0.3
wheel==0.33.0
twine==1.13.0
pytest==4.3.0
pytest-cov==2.6.1
coveralls==1.6.0

修改您的 .travis.yml 文件,如下所示(替换您的包名):

dist: xenial
language: python
python: 3.7.2
install:
  — pip install -r requirements_dev.txt
  — pip install -e .
script:
  — pytest --cov=my_package_name
after_success:
  — coveralls

现在,当 Travis 构建您的项目时,它将安装必要的包,运行您的测试,并创建一个覆盖报告。然后它将覆盖范围报告发送给工作服。

提交,推送到 GitHub,看看奇迹发生。您的覆盖率报告可能需要几分钟才能完成,请耐心等待。

现在工作服显示在你的公关支票上。酷!

在工作服的网页上,我们应该显示 100%的覆盖率。

好吧,让我们在腰带上再加一件工具。

步骤 10:添加 PyUp

PyUp.io 让你知道什么时候包依赖过期或者有安全漏洞。它会自动发出一个 pull 请求来更新 GitHub 上的包。

前往https://pyup.io/,通过 GitHub 注册,连接您的组织。

当你添加你的回购,我建议你切换到每周更新时间表。如果你有一堆包依赖,你就不会收到很多拉请求。

这里有一个 PyUp 上的存储库的例子,展示了一些过时的包。

现在你会知道一个包什么时候更新——知道是成功的一半。自动拉取请求必须是另一半,对吗?😏

包装

在本文中,您学习了如何添加和配置 Black、pytest、Travis CI、连体工作服和 PyUp。我们已经为更安全的代码和更一致的风格做好了准备。那是相当甜蜜的!

在以后的文章中,我们将看看如何配置和构建您的文档,包括阅读文档、添加徽章、管理发布等等。跟着我确保你不会错过。

我希望这个指南对你有用。如果你有,请分享到你最喜欢的社交媒体渠道,这样其他人也可以找到它。👏

我撰写关于 Python、Docker、数据科学和其他技术主题的文章。如果你对此感兴趣,请关注我,在这里阅读更多。

感谢阅读!

教好数据科学的 10 个步骤

原文:https://towardsdatascience.com/10-steps-to-teaching-data-science-well-322966188323?source=collection_archive---------15-----------------------

数据科学教师资源。

Image source: https://broadlygenderphotos.vice.com

随着对数据科学家需求的增加,公司和教育机构内教授数据科学的培训项目也在平行增长。除了专注于满足工作需求之外,讲师还需要更多资源来推动数据科学课堂。以下是当前和未来数据科学教师的十个步骤,以确保他们为学生创造最佳的学习环境。

与一位伟大的老师在一起的一天胜过一千天的勤奋学习。

——日本谚语

1。确保你班上的每个人都乐意参与

创建一个包容性的学习环境,确保每个人都感觉自己属于课堂,并能够参与其中,无论是在所有人面前回答问题,还是一对一地接近讲师。评估课堂参与率时,优先考虑有色人种、女性、LGBTQIA+和残疾人。

2。确保没有技术背景的学生跟上。

您课堂上的学生在数据科学方面的专业知识水平各不相同。在一堂课上,花点时间确定是否所有学生都跟上了材料。这可以通过要求简单的点头来实现,如果是在线授课的话,也可以通过对投票的回应来实现。如果学生觉得自己落后了,鼓励他们向你伸出援手。

3。做一个有魅力的演讲者。

数据科学不是一个容易理解的话题,因为这类工作涉及到所有的编码、数学和分析。在讲授数据科学课程时,请确保您是一位迷人而自信的演讲者。放慢语速,清晰地说话。确保你的学生参与到你的材料中,并很好地理解你的过程中的每一步。

4。从问题集的答案开始上课。

数据科学提供了一套工具来回答和分析现实生活中的问题。有时这些工具会变得过于复杂,在解释一个概念的过程中很容易失去学生。总是从你提出的数据科学问题的答案开始课程。例如,如果问题集是关于预测结果的,那么从展示预测结果可能是什么开始。如果学生们清楚地理解为什么他们进行每一步,那么他们就更容易跟上数据科学过程的细节。

5。将数字输出和数据可视化翻译成清晰的句子。

这一步与上一步相似,但重点在于你如何陈述你的结论。始终将代码的数字输出和数据可视化翻译成清晰的句子。你计算的数字意味着什么?你的数据可视化揭示了你的数据的什么?回到你最初的数据科学问题,清楚地陈述答案。

6。在单独的单元中引入新的和/或替代的编码方法。

大多数数据科学课程使用 Jupyter 笔记本进行教学。如果你展示了编码一个概念的多种方法或者如果你正在编辑一个改变输出的原始代码块,使用一个新的单元格。不要一直迭代一个代码块并在一个单元格内改变输出。逐步教授您的代码,并在新的单元格中展示代码的变体。

7。将以前的课程与当前的课程联系起来。

引入新概念时,演示当前课程与学生已学内容的联系,并将其融入情境中。一种方法是通过使用像思维导图这样的工具来说明主题是如何相互关联的。这使学生能够利用上下文和工具来交流他们到目前为止所学的内容。

8。使用包容性数据集。

数据科学是一个强大的工具,有助于发现隐藏的真相和世界上未知的故事。利用数据科学的潜力探索被忽略的数据集。例如,如果你使用体育数据来说明一个概念,为什么不使用 WNBA 的数据集来代替 NBA 呢?要确定数据集的包容性,请列出您在整个教学过程中使用的所有数据集。您的数据集代表谁和什么?谁和什么没有被表现出来?

9。使用真实数据集。

当我们谈到数据集的话题时,请确保在你的课程中使用真实的数据集。是的,使用虹膜、葡萄酒、乳腺癌和波士顿玩具数据集仍然非常有用。然而,只要有可能,用实际的和可获得的数据集来补充你的教学材料。让学生习惯于使用课堂以外的真实世界的数据来回答现实生活中的问题。有很多地方可以获得你可以使用的开源数据。

10。玩得开心!

创造一个有趣的学习环境!这可能是教好数据科学最重要的一步。在你的教室里享受乐趣,无论是面对面还是远程环境。数据科学是一个激动人心的革命性话题,值得学习和分享。作为一名教师,你应该为自己能够将知识大众化并让所有感兴趣的学生都能接触到数据科学而感到自豪。

这篇文章也出现在 女性资料 中。

Jasmine Vasandani 是一名数据科学家和研究员。她热衷于在数据领域建立包容性社区。Jasmine 感谢今天教她数据科学的老师。

你可以在这里了解更多茉莉:https://www.jasminev.co/

实现你自己的公司人工智能项目的 10 个步骤

原文:https://towardsdatascience.com/10-steps-to-your-very-own-corporate-a-i-project-ced3949faf7f?source=collection_archive---------31-----------------------

管理者、领导者、思想家和梦想家的非技术性指南

像世界其他地方一样,人工智能有 1%的问题。

虽然(非常)大的公司受益于他们可以获得的大量数据,以及商业、技术和监管专业知识的结合,但大多数中小企业没有这样的运气。

然而,这不应该阻止那些寻求踏上数据科学之旅的勇敢者和大胆者。虽然没有捷径,但要开始一个人工智能项目还是有明确的步骤,我在下面列出了这个项目,希望它能消除一些围绕创造“智能”算法的神秘主义。

请注意,这并不意味着是一个技术指南,为了简洁起见,定义将保持在最低限度。

1。制定执行战略

在考虑人工智能之前,一些关键问题必须由各种关键的公司高管来回答:他们想通过创造一种不同类型的价值主张来扰乱他们的市场吗?他们是否寻求成为“班上最好的”?也许他们的目标是在竞争激烈的市场上保持平衡?或者甚至追到现任领导?

在任何人工智能项目启动之前,这些问题都必须得到回答。否则,运营团队将只能漫无目的地挖掘数据,寻找故事来讲述。然而,鉴于大多数行业的性质,它们将追逐一个移动的目标,随着数据的到来改写历史。是的,数据很有趣。是的,很有趣。但是它本身没有任何意义。从它开始,而不是明确的目标,只会产生寻找问题的解决方案。

提示:一个好的策略始于心中不满的客户,而不是技术。

2。识别并优先考虑想法

当然,决策并不仅仅停留在战略的制定上;策略只回答“我是谁”这个问题。“我在干什么?”是一个完全不同的问题,需要通过识别用例来更好地回答。

假设一家公司的长期战略是成为其行业中最“值得信赖”的参与者。It 可以通过确保正确无误地回答所有客户的问题、快速回答客户的问题、让所有打电话的人都受到人而不是机器人的问候来实施这一战略……可以(应该)在研讨会或小型咨询活动中系统地识别、评估、分组、优先排序和讨论数百个这样的想法( woo!)。

有些会直接去销售、营销、会计、人力资源…可能会使用传统的运营/统计方法处理;其中一些将被认为适合作为人工智能的解决方案,以多种形式中的一种。我建议从三个具体问题入手:

  • 瓶颈:公司内部存在能力,但没有得到最佳分配。
  • 扩展:公司内部有能力,但是使用它们的过程耗时太长、太贵或者无法扩展。
  • 资源:该公司收集的数据超过了现有资源目前可以分析和应用的数据量大约 55%的公司收集的数据没有被使用。

提示:对公司来说,通过商业能力而不是技术来看待人工智能更有成效。

3。询问关于数据的正确问题

在一个机器学习项目(“机器学习”这个术语比“人工智能”更准确)被认为在操作上合理、技术上可行之后,数据问题立即出现。或者,我应该说,数据问题…

需要什么类型的数据?

从技术上讲,没有很多不同类型的数据:它可以是数字(由于其表格的性质,历史上最容易使用)、文本、图像、视频、声音...任何可以被记录的东西都可以被认为是数据。最终,计算机不知道你给它们的输入是什么类型;对他们来说都只是数字。

需要多少数据?

没有具体数量的数据点可以规定,因为项目与项目之间差异很大;但一个刚刚起步、客户不超过 300 人的初创企业,可能天生就没有启动 ML 项目的资源。此外,注意数据可以由许多数据点(“大 N”)、每个数据点的许多细节(“大 D”)或两者构成。两者都是最好的。

我们有这些数据吗?

数据要么是“可用”的,要么是“要收集的”(是的,我过分简化了,告我吧)。收集可以在内部完成,这可能非常耗时(我们正在谈论几个月和重大重组),也可以通过外部来源收集(例如,预测雨伞需求将使用所有人都可以免费获得的天气数据)。

提示:创造有价值的人工智能解决方案的是独特的数据,而不是尖端的模型。

4。执行必要的风险评估

任何自尊的项目都需要持续的风险评估,以便在问题出现之前解决问题( PMO 101 )。这应该在项目的早期进行,并在项目的整个生命周期中彻底和持续地完成。下面是 10 个问题,你可以先问一下:

  • 我有没有一个 智能目标 :“别人都在做”是进入 A.I 游戏的可怕理由。
  • 我有足够的数据吗?如果不敏锐地意识到过去,算法根本不可能理解现在和未来。
  • 我的数据集 有错误吗?:垃圾进,垃圾出。
  • 我的数据集是 d*ck 吗?:数据必须代表现实,避免反映现实存在的偏见。
  • 我有能让这一切发生的人吗?全球目前只有 22,000 名博士级专家能够开发前沿算法。
  • 我需要改变我的层级结构吗?:如果项目的所有员工都向不同公司分支机构的不同经理负责,那么很可能会出现不同的目标。
  • 我的员工会成为勒德分子吗?:“它会取代乔布斯吗?”以及“我必须接受培训吗?”是需要答案的有效问题。
  • 我有合适的架构吗?:算法存在于依赖数据收集、工作流管理、 IaaS …本身是由API、数据存储、网络安全构成的更大生态系统的一部分…
  • 有监管障碍吗?当前位置不仅要查看当前的法规,还要了解正在讨论的法规,这一直是企业界的关键,并将继续如此。
  • 我有时间吗?如果一家公司正处于时间敏感的紧要关头,人工智能可能不是答案。

提示:风险评估最好由外部人员执行。

5。选择相关方法&型号

一旦以上所有问题都解决了(如果没有,返回步骤 1 ),就该选择技术上最合适的解决方案来解决之前确定的问题了。

在这个过程的后期做这件事可能看起来很奇怪,但当人们意识到下面的技术是高度适应性的,并且只从一个方面开始只会缩小可能性的范围时,这是完全有意义的。在任何情况下,任何在这方面有一些经验的人都会想到在项目的前几个步骤中使用正确的工具。

下面是对机器学习的 7 个主要类别的浅见。具体的例子将在后面的文章中给出,但同时在网络上也可以找到:

监督机器学习

  • 线性算法:基于自变量的 LAs 模型预测。它主要用于找出变量和预测之间的关系,并且在稳定环境中很好地进行预测。→更多详情:线性回归、逻辑回归、 SVM 、岭/套索……
  • 集成方法:集成学习是一种基于许多不同模型进行预测的系统。通过组合单个模型,集合模型趋向于更加灵活(偏差更小)和对数据更不敏感(方差更小)。→更多详情:随机森林、梯度提升、AdaBoost……
  • 概率分类:概率分类器能够在给定输入观测值的情况下,预测一组类别的概率分布,而不是仅输出该观测值最可能属于的类别。→更多详情:朴素贝叶斯、贝叶斯网络、MLE……
  • 深度学习:对于有监督的学习任务,深度学习方法通过将数据转化为数据的紧凑中间表示来提高精度,从而使耗时的特征工程任务变得无关紧要(思考类别)。它非常适合分类、处理和基于非数字数据进行预测。→更多详情: CNN,RNN,MLP , LSTM …

无监督机器学习

  • 聚类:“聚类”是将相似的数据点分组在一起的过程。这种无监督机器学习技术的目标是找到数据点中的相似性,并将相似的数据点自动分组在一起。→更多详情: K-means,DB 扫描,层次聚类……
  • 降维:降维,又名降维,是通过获得一组主变量来减少所考虑的随机变量的数量的过程。它还能制作非常漂亮的图形。→更多详情: PCA , t-SNE …
  • 深度学习:对于无监督的学习任务,深度学习方法允许对未标记的数据进行分类。任何更多的细节都会大大增加这篇文章的篇幅。→更多细节:强化学习,自动编码器, GANs ...

提示:所有的模型都是错误的,但有些是有用的。

6。做出 BBP 的决定

如前所述,很少有公司能够完全开发自己的算法,并在没有帮助的情况下大规模部署它们。不幸的 99%的人不得不做出复杂的选择,是投资成功几率低的大量资金,还是投资成功几率高但与供应商/合作伙伴关系非常密切的少量资金。

没有简单的答案。只是艰难的选择。以下是几个选项:

建设

  • 通过各种技术投资和招聘,进一步提高公司内部现有的分析能力。
  • 通过认知应用增强现有应用。
  • 使用众多可用的开源算法中的一种,以及少数企业家员工。

购买

  • 使用来自已知提供商(如 Oracle、Microsoft、AWS 等)的现有现成软件。
  • 雇佣一个现有的提供商来完全开发一个算法(但是具体的开发意味着完全依赖于该提供商。不好了

伙伴

  • 基于公司数据和初创公司技术的双赢关系。然而,这种关系可能是复杂的,而且很少是可持续的,因为各种行为者很少有相同的短期/长期目标。

提示:BBP 的选择在很大程度上取决于公司的执行策略和所属行业。

7。运行性能检查

一个最近构建的算法不能未经测试就发布到野外。事实上,大多数机器学习系统都是作为“黑箱”运行的(再次强调,这是一种有用的过度简化,由于各种原因,可能对一组训练数据有效的东西可能对另一组数据无效(如果有效的话)。令人欣慰的是,一些工具已经被设计出来,以确保模型按预期工作:

  • 分类准确度:正确预测的数量与做出的预测的数量
  • 对数损失:惩罚数据错误分类的公式
  • 混淆矩阵:类似于准确性,但更直观
  • 曲线下面积:随机选择的正面例子比随机选择的负面例子排名更高的概率
  • F1 得分:兼顾精度和鲁棒性
  • 平均绝对误差:原始值和预测值之差的平均值
  • 均方误差:同上,但更容易计算梯度

只要允许团队告知预先准备好的记分卡,以上所有内容都很重要。外部团队在这里也是有用的,因为他们不会因为项目已经投入的成本而产生偏见。

提示:小心“急于下结论”。

8。部署算法

考虑到投入的资源,人工智能项目的部署阶段可能是最关键的。事实上,从原型到生产系统的过渡可以预期是昂贵和耗时的,但是如果风险分析做得适当,至少应该不会遇到重大问题(这是很少的情况)。

除了高效的项目管理团队之外,没有很多方法可以确保部署顺利进行。两种主要技术如下:

  • 静默部署:不要与“静默安装”混淆,静默部署意味着与历史解决方案并行运行算法,以确保它匹配或改进其发现。
  • A/B 测试:也称为“分割测试”或“桶测试”,它要求只在一部分人身上测试新的解决方案,而另一组人继续使用以前的解决方案。

此外,尽管我会鼓励所有首次项目进展缓慢,避免打破常规,但留意扩展潜力往往是未来成功的关键。

提示:不要害怕围绕新解决方案重新设计工作流。

9.交流成功和失败

是时候“把属于凯撒的东西渲染给凯撒”了,和全世界一起分享机器学习算法构建的成功。如果这一努力不成功,也值得讨论,哪怕只是作为整个组织的一次学习机会。

应该让几个关键群体了解成功和失败,原因多种多样:

  • 投资者/股东:在一个流行语可以成就或扼杀股票的时代,分享人工智能的成功故事会让投资者高兴,并有可能增加公司的价值,特别是如果该项目使开发新的、有用的、能产生长期影响的能力成为可能。
  • 政府机构:这当然取决于行业和所用工具的性质,但考虑到当前围绕道德和数据管理的讨论,通过透明获得公共部门的信任可能是明智之举。
  • 客户:客户需要 a)了解解决方案能为他们做什么,b)成为改进服务或产品的大使,从而创造光环效应。
  • 候选人:候选人需要意识到公司可能会发生变化,他们的技能可能需要在未来适应这些变化。许多候选人也认为在一家有人工智能能力的公司工作是一件积极的事情,可能会增加申请人的数量。
  • 员工:最重要的是,员工需要知道正在做什么,这会如何影响他们,以及他们的日常生活是否会改变。人们天生反对改变,让自动化的谣言四处传播是毁掉一个好项目的最可靠的方法。

提示:宣传不足往往比宣传过度更有成效。

10.跟踪

我有坏消息。好消息是。

坏消息是这项工作永远不会结束。好消息是这项工作永远不会结束。

事实上,让一个算法在投入生产后不受检查地运行很长一段时间是愚蠢的。世界在变,人和他们的习惯也在变,导致他们的数据也在变。几个月内,用于训练算法的初始数据可能不再相关。

这里的挑战是,一开始可能很难注意到该算法不再代表世界,需要使用在构建该算法 1.0 版本期间获得的专业知识进行返工。谈一个永无止境的任务

提示:世界变化比你想象的要快得多。而算法看不到这一点。

结论

数据驱动项目的本质是它不能是通用的。这意味着花费时间和金钱来创造一些独特的东西,以跨越早期采用者创造的护城河。但是,由于人工智能能力在大公司内部往往以指数速度增长,护城河只会越来越宽。这是许多公司现在面临的挑战,也是为什么他们需要一个坚实的过程来开始:他们的误差范围正在迅速缩小。

因此,我有一些最后的建议:

  1. 从小处着手。
  2. 从试点项目开始。
  3. 设定现实的期望。
  4. 专注于速赢。
  5. 循序渐进地工作。

祝你好运。

参加一项运动

本文最初是为《T2 时报》撰写的,这是一份对当今技术挑战进行深入分析的在线杂志。T5 点击此处进入 T7。

选择最佳集群数量的 10 个技巧

原文:https://towardsdatascience.com/10-tips-for-choosing-the-optimal-number-of-clusters-277e93d72d92?source=collection_archive---------2-----------------------

Photo by Pakata Goh on Unsplash

聚类是最常见的无监督机器学习问题之一。使用一些观测值间距离度量或基于相关性的距离度量来定义观测值之间的相似性。

有 5 类聚类方法:

+层次聚类
+划分方法(k-means,PAM,CLARA)
+基于密度的聚类
+基于模型的聚类
+模糊聚类

我写这篇文章的愿望主要来自于阅读关于 clustree 包、 dendextend 文档以及由 Alboukadel Kassambara 写的 R 书中的聚类分析实用指南facto extra包的作者。

数据集

我将使用来自集群包的一个不太为人所知的数据集: all .哺乳动物. milk.1956 ,一个我以前没有看过的数据集。

这个小数据集包含 25 种哺乳动物及其乳汁成分(水、蛋白质、脂肪、乳糖、灰分百分比)的列表,来自 John Hartigan,Clustering Algorithms,Wiley,1975 。

首先让我们加载所需的包。

library(tidyverse)
library(magrittr)
library(cluster)
library(cluster.datasets)
library(cowplot)
library(NbClust)
library(clValid)
library(ggfortify)
library(clustree)
library(dendextend)
library(factoextra)
library(FactoMineR)
library(corrplot)
library(GGally)
library(ggiraphExtra)
library(knitr)
library(kableExtra)

现在加载数据。

data("all.mammals.milk.1956")
raw_mammals <- all.mammals.milk.1956# subset dataset
mammals <- raw_mammals %>% select(-name) # set rownames
mammals <- as_tibble(mammals)

让我们探索并可视化这些数据。

# Glimpse the data set
glimpse(mammals)Observations: 25
Variables: 5
$ water   *<dbl>* 90.1, 88.5, 88.4, 90.3, 90.4, 87.7, 86.9, 82.1, 81.9, 81.6, 81.6, 86.5, 90.0,...
$ protein *<dbl>* 2.6, 1.4, 2.2, 1.7, 0.6, 3.5, 4.8, 5.9, 7.4, 10.1, 6.6, 3.9, 2.0, 7.1, 3.0, 5...
$ fat     *<dbl>* 1.0, 3.5, 2.7, 1.4, 4.5, 3.4, 1.7, 7.9, 7.2, 6.3, 5.9, 3.2, 1.8, 5.1, 4.8, 6....
$ lactose *<dbl>* 6.9, 6.0, 6.4, 6.2, 4.4, 4.8, 5.7, 4.7, 2.7, 4.4, 4.9, 5.6, 5.5, 3.7, 5.3, 4....
$ ash     *<dbl>* 0.35, 0.24, 0.18, 0.40, 0.10, 0.71, 0.90, 0.78, 0.85, 0.75, 0.93, 0.80, 0.47,...

所有的变量都用数字表示。统计分布呢?

# Summary of data set
summary(mammals) %>% kable() %>% kable_styling()

# Historgram for each attribute
mammals %>% 
  gather(Attributes, value, 1:5) %>% 
  ggplot(aes(x=value)) +
  geom_histogram(fill = "lightblue2", color = "black") + 
  facet_wrap(~Attributes, scales = "free_x") +
  labs(x = "Value", y = "Frequency")

不同属性之间有什么关系?使用' corrplot()'创建相关矩阵。

corrplot(cor(mammals), type = "upper", method = "ellipse", tl.cex = 0.9)

当您有以不同尺度测量的变量时,缩放数据是有用的。

mammals_scaled <- scale(mammals)
rownames(mammals_scaled) <- raw_mammals$name

降维有助于数据可视化( PCA 方法)。

res.pca <- PCA(mammals_scaled,  graph = FALSE)# Visualize eigenvalues/variances
fviz_screeplot(res.pca, addlabels = TRUE, ylim = c(0, 50))

这些是捕获了 80%方差的 5 件。scree 图显示 PC1 捕获了约 75%的方差

# Extract the results for variables
var <- get_pca_var(res.pca)# Contributions of variables to PC1
fviz_contrib(res.pca, choice = "var", axes = 1, top = 10)# Contributions of variables to PC2
fviz_contrib(res.pca, choice = "var", axes = 2, top = 10)# Control variable colors using their contributions to the principle axis
fviz_pca_var(res.pca, col.var="contrib",
             gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),
             repel = TRUE # Avoid text overlapping
             ) + theme_minimal() + ggtitle("Variables - PCA")

从这些图像中可以明显看出,水和乳糖会一起增加,蛋白质、灰分和脂肪也会一起增加;这两组是反向相关的。

朴素(K 均值)方法

分区聚类方法,如 k-means 和 Medoids 分区(PAM ),要求您指定要生成的聚类数。

k-means 聚类可能是最著名的划分方法之一。k-means 聚类背后的思想包括定义聚类的总的类内变化,其测量最小化的聚类的紧密度。

我们可以用 kmeans() 函数计算 R 中的 k 均值:

km2 <- kmeans(mammals_scaled, centers = 2, nstart = 30)

上面的例子将数据分成两个集群,中心= 2** ,并尝试多个初始配置,报告最佳配置。例如,由于该算法对群集质心的初始位置敏感,所以添加 nstart = 30 将生成 30 个初始配置,然后对所有质心结果进行平均。**

因为在我们开始之前需要设置簇的数量( k ),所以检查几个不同的 k 值是有利的。

kmean_calc <- function(df, ...){
  kmeans(df, scaled = ..., nstart = 30)
}km2 <- kmean_calc(mammals_scaled, 2)
km3 <- kmean_calc(mammals_scaled, 3)
km4 <- kmeans(mammals_scaled, 4)
km5 <- kmeans(mammals_scaled, 5)
km6 <- kmeans(mammals_scaled, 6)
km7 <- kmeans(mammals_scaled, 7)
km8 <- kmeans(mammals_scaled, 8)
km9 <- kmeans(mammals_scaled, 9)
km10 <- kmeans(mammals_scaled, 10)
km11 <- kmeans(mammals_scaled, 11)p1 <- fviz_cluster(km2, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 2") 
p2 <- fviz_cluster(km3, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 3")
p3 <- fviz_cluster(km4, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 4")
p4 <- fviz_cluster(km5, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 5")
p5 <- fviz_cluster(km6, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 6")
p6 <- fviz_cluster(km7, data = mammals_scaled, frame.type = "convex") + theme_minimal() + ggtitle("k = 7")plot_grid(p1, p2, p3, p4, p5, p6, labels = c("k2", "k3", "k4", "k5", "k6", "k7"))

尽管这种视觉评估告诉我们在聚类之间的何处发生了描绘,但是它没有告诉我们最优的聚类数目是多少。

确定最佳聚类数

在文献中已经提出了多种评估聚类结果的方法。术语聚类验证用于设计评估聚类算法结果的程序。有三十多种指标和方法可以用来确定最佳集群数量,所以我在这里只关注其中的几种,包括非常简洁的 clustree 包。

“肘”法

可能是最广为人知的方法,即肘形法,在该方法中,计算每个聚类数的平方和并绘制图形,用户寻找从陡到浅的斜率变化(肘形),以确定最佳聚类数。这种方法不精确,但仍有潜在的帮助。

set.seed(31)
# function to compute total within-cluster sum of squares
fviz_nbclust(mammals_scaled, kmeans, method = "wss", k.max = 24) + theme_minimal() + ggtitle("the Elbow Method")

肘形曲线法很有帮助,因为它显示了增加聚类数如何有助于以有意义的方式而不是边际方式分离聚类。弯曲表示超过第三个的其他聚类没有什么价值(参见[ 此处的 ]以获得该方法的更精确的数学解释和实现)。肘方法是相当清楚的,如果不是一个基于组内方差的天真的解决方案。间隙统计是一种更复杂的方法,用于处理分布没有明显聚类的数据(对于球状、高斯分布、轻度不相交的数据分布,可以找到正确数量的 k )。

差距统计

缺口统计量将 k 的不同值的总体组内变异与数据的零参考分布下的预期值进行比较。最佳聚类的估计将是最大化间隙统计的值(,即,其产生最大的间隙统计)。这意味着聚类结构远离点的随机均匀分布。

gap_stat <- clusGap(mammals_scaled, FUN = kmeans, nstart = 30, K.max = 24, B = 50)fviz_gap_stat(gap_stat) + theme_minimal() + ggtitle("fviz_gap_stat: Gap Statistic")

gap stats 图按聚类数( k )显示统计数据,标准误差用垂直线段绘制,最佳值 k 用垂直蓝色虚线标记。根据这一观察 k = 2 是数据中聚类的最佳数量。

剪影法

另一种有助于确定最佳聚类数的可视化方法称为剪影法。平均轮廓法计算不同 k 值的观测值的平均轮廓。最佳聚类数 k 是在一系列可能的 k 值上使平均轮廓最大化的聚类数。****

fviz_nbclust(mammals_scaled, kmeans, method = "silhouette", k.max = 24) + theme_minimal() + ggtitle("The Silhouette Plot")

这也表明 2 个集群是最佳的。

平方和法

另一种聚类验证方法是通过最小化类内平方和(衡量每个类紧密程度的指标)和最大化类间平方和(衡量每个类与其他类的分离程度的指标)来选择最佳的类数。

ssc <- data.frame(
  kmeans = c(2,3,4,5,6,7,8),
  within_ss = c(mean(km2$withinss), mean(km3$withinss), mean(km4$withinss), mean(km5$withinss), mean(km6$withinss), mean(km7$withinss), mean(km8$withinss)),
  between_ss = c(km2$betweenss, km3$betweenss, km4$betweenss, km5$betweenss, km6$betweenss, km7$betweenss, km8$betweenss)
)ssc %<>% gather(., key = "measurement", value = value, -kmeans)#ssc$value <- log10(ssc$value)ssc %>% ggplot(., aes(x=kmeans, y=log10(value), fill = measurement)) + geom_bar(stat = "identity", position = "dodge") + ggtitle("Cluster Model Comparison") + xlab("Number of Clusters") + ylab("Log10 Total Sum of Squares") + scale_x_discrete(name = "Number of Clusters", limits = c("0", "2", "3", "4", "5", "6", "7", "8"))

根据这一测量,似乎 7 个集群将是合适的选择。

NbClust

NbClust 包提供了 30 个指数,用于确定相关的聚类数,并从通过改变聚类数、距离度量和聚类方法的所有组合获得的不同结果中向用户建议最佳聚类方案。

res.nbclust <- NbClust(mammals_scaled, distance = "euclidean",
                  min.nc = 2, max.nc = 9, 
                  method = "complete", index ="all")factoextra::fviz_nbclust(res.nbclust) + theme_minimal() + ggtitle("NbClust's optimal number of clusters")

这表明聚类的最佳数目是 3。

克鲁斯特里

上面统计方法产生一个分数,该分数每次只考虑一组聚类。 clustree R 软件包采用了另一种方法,即考虑样本如何随着聚类数量的增加而改变分组。这有助于显示哪些聚类是独特的,哪些是不稳定的。它没有明确地告诉你哪一个选择是最优集群,但是它对于探索可能的选择是有用的。

让我们来看看 1 到 11 个集群。

tmp <- NULL
for (k in 1:11){
  tmp[k] <- kmeans(mammals_scaled, k, nstart = 30)
}df <- data.frame(tmp)# add a prefix to the column names
colnames(df) <- seq(1:11)
colnames(df) <- paste0("k",colnames(df))# get individual PCA
df.pca <- prcomp(df, center = TRUE, scale. = FALSE)ind.coord <- df.pca$x
ind.coord <- ind.coord[,1:2]df <- bind_cols(as.data.frame(df), as.data.frame(ind.coord))clustree(df, prefix = "k")

在该图中,每个节点的大小对应于每个聚类中的样本数,并且箭头根据每个聚类接收的样本数来着色。一组独立的箭头,透明的,称为输入节点比例,也是彩色的,显示了一个组中的样本如何在另一个组中结束——聚类不稳定性的指标。

在这个图中,我们看到,当我们从 k=2 移动到 k=3 时,来自观察者左侧群集的许多物种被重新分配到右侧的第三个群集。当我们从 k=8 移动到 k=9 时,我们看到一个节点具有多个传入边,这表明我们过度聚集了数据。

将这个维度覆盖到数据中的其他维度上也是有用的,特别是那些来自降维技术的维度。我们可以使用 clustree_overlay() 函数来实现:

df_subset <- df %>% select(1:8,12:13)clustree_overlay(df_subset, prefix = "k", x_value = "PC1", y_value = "PC2")

我更喜欢从侧面看,显示 x 或 y 维度中的一个相对于分辨率维度。

overlay_list <- clustree_overlay(df_subset, prefix = "k", x_value = "PC1",
                                 y_value = "PC2", plot_sides = TRUE)overlay_list$x_sideoverlay_list$y_side

****

这表明,我们可以通过检查边缘来指示正确的聚类分辨率,并且我们可以通过过多的信息来评估聚类的质量。

选择合适的算法

如何选择合适的聚类算法? cValid 包可用于同时比较多个聚类算法,以确定最佳聚类方法和最佳聚类数。我们将比较 k-means、层次聚类和 PAM 聚类。

intern <- clValid(mammals_scaled, nClust = 2:24, 
              clMethods = c("hierarchical","kmeans","pam"), validation = "internal")# Summary
summary(intern) %>% kable() %>% kable_styling()Clustering Methods:
 hierarchical kmeans pam 

Cluster sizes:
 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 

Validation Measures:
                                 2       3       4       5       6       7       8       9      10      11      12      13      14      15      16      17      18      19      20      21      22      23      24

hierarchical Connectivity   4.1829 10.5746 13.2579 20.1579 22.8508 25.8258 32.6270 35.3032 38.2905 39.2405 41.2405 45.7742 47.2742 50.6075 52.6075 55.8575 58.7242 60.7242 63.2242 65.2242 67.2242 69.2242 71.2242
             Dunn           0.3595  0.3086  0.3282  0.2978  0.3430  0.3430  0.4390  0.4390  0.5804  0.5938  0.5938  0.8497  0.8497  0.5848  0.5848  0.4926  0.9138  0.9138  0.8892  0.9049  0.9335  1.0558  2.1253
             Silhouette     0.5098  0.5091  0.4592  0.4077  0.4077  0.3664  0.3484  0.4060  0.3801  0.3749  0.3322  0.3646  0.3418  0.2650  0.2317  0.2166  0.2469  0.2213  0.1659  0.1207  0.1050  0.0832  0.0691
kmeans       Connectivity   7.2385 10.5746 15.8159 20.1579 22.8508 25.8258 33.5198 35.3032 38.2905 39.2405 41.2405 45.7742 47.2742 51.8909 53.8909 57.1409 58.7242 60.7242 63.2242 65.2242 67.2242 69.2242 71.2242
             Dunn           0.2070  0.3086  0.2884  0.2978  0.3430  0.3430  0.3861  0.4390  0.5804  0.5938  0.5938  0.8497  0.8497  0.5866  0.5866  0.5725  0.9138  0.9138  0.8892  0.9049  0.9335  1.0558  2.1253
             Silhouette     0.5122  0.5091  0.4260  0.4077  0.4077  0.3664  0.3676  0.4060  0.3801  0.3749  0.3322  0.3646  0.3418  0.2811  0.2478  0.2402  0.2469  0.2213  0.1659  0.1207  0.1050  0.0832  0.0691
pam          Connectivity   7.2385 14.1385 17.4746 24.0024 26.6857 32.0413 33.8913 36.0579 38.6607 40.6607 42.7869 45.7742 47.2742 51.7242 53.7242 56.9742 58.7242 60.7242 62.7242 64.7242 66.7242 69.2242 71.2242
             Dunn           0.2070  0.1462  0.2180  0.2180  0.2978  0.2980  0.4390  0.4390  0.4390  0.4390  0.4390  0.8497  0.8497  0.5314  0.5314  0.4782  0.9138  0.9138  0.8333  0.8189  0.7937  1.0558  2.1253
             Silhouette     0.5122  0.3716  0.4250  0.3581  0.3587  0.3318  0.3606  0.3592  0.3664  0.3237  0.3665  0.3646  0.3418  0.2830  0.2497  0.2389  0.2469  0.2213  0.1758  0.1598  0.1380  0.0832  0.0691

Optimal Scores:

             Score  Method       Clusters
Connectivity 4.1829 hierarchical 2       
Dunn         2.1253 hierarchical 24      
Silhouette   0.5122 kmeans       2

连通性和轮廓都是连通性的度量,而邓恩指数是不在同一聚类中的观测值之间的最小距离与最大聚类内距离的比率。

提取聚类的特征

如前所述,很难评估聚类结果的质量。我们没有真正的标签,所以不清楚如何在内部验证方面衡量"它实际上有多好。但是,集群是一个很好的 EDA 起点,可以用来更详细地探索集群之间的差异。把聚类想象成制造衬衫尺寸。我们可以选择只做三种尺寸:小号中号大号。我们肯定会削减成本,但并不是每个人都会非常适应。想想现在的裤子尺码(或者有很多尺码的衬衫品牌(XS、XL、XXL、等)。你有更多的类别(或集群)。对于某些领域,最佳集群的选择可能依赖于一些外部知识,如生产 k 个集群以满足客户的最佳需求的成本。在其他领域,如生物学,你试图确定细胞的准确数量,需要一个更深入的方法。例如,上面的许多试探法在群集的最佳数量上互相矛盾。请记住,这些都是在不同数量的 k 处评估 k 均值算法。这可能意味着 k 均值算法失败,并且没有 k 是好的。 k-means 算法不是一个非常健壮的算法,它对异常值非常敏感,而且这个数据集非常小。最好的办法是在其他算法的输出上探索上述方法(例如 clValid 建议的层次聚类),收集更多的数据,或者如果可能的话花一些时间为其他 ML 方法标记样本。**

最终,我们想回答这样的问题:“是什么让这个集群与众不同?”以及“彼此相似的集群是什么”。让我们选择五个集群,并询问这些集群的特征。

# Compute dissimilarity matrix with euclidean distances
d <- dist(mammals_scaled, method = "euclidean")# Hierarchical clustering using Ward's method
res.hc <- hclust(d, method = "ward.D2" )# Cut tree into 5 groups
grp <- cutree(res.hc, k = 5)# Visualize
plot(res.hc, cex = 0.6) # plot tree
rect.hclust(res.hc, k = 5, border = 2:5) # add rectangle

# Execution of k-means with k=5
final <- kmeans(mammals_scaled, 5, nstart = 30)fviz_cluster(final, data = mammals_scaled) + theme_minimal() + ggtitle("k = 5")

让我们提取聚类并将它们添加回初始数据,以便在聚类级别进行一些描述性统计:

as.data.frame(mammals_scaled) %>% mutate(Cluster = final$cluster) %>% group_by(Cluster) %>% summarise_all("mean") %>% kable() %>% kable_styling()

我们看到仅由兔子组成的簇 2 具有高灰分含量。由海豹和海豚组成的第 3 组脂肪含量高,这在如此寒冷的气候下有着苛刻的要求,而第 4 组含有大量的乳糖。

mammals_df <- as.data.frame(mammals_scaled) %>% rownames_to_column()cluster_pos <- as.data.frame(final$cluster) %>% rownames_to_column()
colnames(cluster_pos) <- c("rowname", "cluster")mammals_final <- inner_join(cluster_pos, mammals_df)ggRadar(mammals_final[-1], aes(group = cluster), rescale = FALSE, legend.position = "none", size = 1, interactive = FALSE, use.label = TRUE) + facet_wrap(~cluster) + scale_y_discrete(breaks = NULL) + # don't show ticks
theme(axis.text.x = element_text(size = 10)) + scale_fill_manual(values = rep("#1c6193", nrow(mammals_final))) +
scale_color_manual(values = rep("#1c6193", nrow(mammals_final))) +
ggtitle("Mammals Milk Attributes")

mammals_df <- as.data.frame(mammals_scaled)
mammals_df$cluster <- final$cluster
mammals_df$cluster <- as.character(mammals_df$cluster)ggpairs(mammals_df, 1:5, mapping = ggplot2::aes(color = cluster, alpha = 0.5), 
        diag = list(continuous = wrap("densityDiag")), 
        lower=list(continuous = wrap("points", alpha=0.9)))

# plot specific graphs from previous matrix with scatterplotg <- ggplot(mammals_df, aes(x = water, y = lactose, color = cluster)) +
        geom_point() +
        theme(legend.position = "bottom")
ggExtra::ggMarginal(g, type = "histogram", bins = 20, color = "grey", fill = "blue")b <- ggplot(mammals_df, aes(x = protein, y = fat, color = cluster)) +
        geom_point() +
        theme(legend.position = "bottom")
ggExtra::ggMarginal(b, type = "histogram", bins = 20, color = "grey", fill = "blue")

****

ggplot(mammals_df, aes(x = cluster, y = protein)) + 
        geom_boxplot(aes(fill = cluster))ggplot(mammals_df, aes(x = cluster, y = fat)) + 
        geom_boxplot(aes(fill = cluster))ggplot(mammals_df, aes(x = cluster, y = lactose)) + 
        geom_boxplot(aes(fill = cluster))ggplot(mammals_df, aes(x = cluster, y = ash)) + 
        geom_boxplot(aes(fill = cluster))ggplot(mammals_df, aes(x = cluster, y = water)) + 
        geom_boxplot(aes(fill = cluster))

# Parallel coordiante plots allow us to put each feature on seperate column and lines connecting each columnggparcoord(data = mammals_df, columns = 1:5, groupColumn = 6, alphaLines = 0.4, title = "Parallel Coordinate Plot for the Mammals Milk Data", scale = "globalminmax", showPoints = TRUE) + theme(legend.position = "bottom")

如果你觉得这篇文章有用,请随意与他人分享或推荐这篇文章!😃

一如既往,如果您有任何问题或意见,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

作为一名新毕业的数据科学家,在 FAANG 找到工作的 10 个技巧

原文:https://towardsdatascience.com/10-tips-on-landing-a-job-at-faang-as-a-new-grad-data-scientist-ac72a4e8eeef?source=collection_archive---------14-----------------------

作为一名新毕业生,我旅途中的小贴士

我找工作的漫长旅程

今年夏天,我作为一名数据科学家在脸书实习,我将返回硅谷。两年前当我进入研究生院时,我从未想过我能在美国找到工作,更不用说在 FAANG 了。

Photo by MD Duran on Unsplash

我在中国度过了成长的前 20 年,一切都是那么顺利和按计划进行。高中的时候,那么多人跟我说“现在努力高考,大学就自由了”。这是我唯一的目标,难怪我在选择专业时会惊慌失措,即使我通过了考试。在大学里,我主修统计学,花了两年时间探索自己的兴趣,但仍然不知道自己想做什么。2016 年夏天,我在加州大学伯克利分校上了一门生物统计学课程,故事就是从那时开始的。我仍然记得有一天,当我们经过敦巴顿桥穿过海湾后,优步的司机指给我看脸书的校园和“竖起大拇指”的标志。大三的时候,我遇到了当时和现在的导师,他告诉我实习的重要性。在我大四参加威斯康辛州为期一年的访问项目之前,我做过两次数据分析师的实习,之后又做过一次数据科学家的实习。我甚至不知道如何用 Python 编程,直到我去了麦迪逊,那时我决定加入南加州大学的工程学院。我甚至在开学前就开始找工作了,并在 10 月份签了一份聘书。今年的全职求职比去年的实习求职容易多了,因为我学到了一些经验。

我一直在指导几名本科生和一年级硕士生。我知道大部分的招聘都需要几年的工作经验,也知道作为一名应届毕业生找到一份工作有多难。这里有一些有用的提示。

1.早点开始

重要的事情先来。我无法充分说明这一点。“早点开始,早点结束。开始晚了,你可能永远也完成不了。”这是我一直告诉我的学员的。“早起的鸟儿有虫吃”。如今,一些公司在夏季开放下一年的实习岗位。当它被填满的时候,它们会关闭开口。你知道实习可以带来全职工作。没有准备不是拖延的借口。没有人会有所准备。

Photo by You X Ventures on Unsplash

2.积极努力地练习

成就感,儿时的梦想,助学贷款,不管是什么,找到能激励你的东西。设定目标,粉碎目标。

去年我安排了对脸书的第一次采访后,我没有和朋友出去玩,直到采访结束。因为你知道机会有多珍贵,你不想浪费它们。作为应届毕业生,获得面试机会比获得面试机会更难。

确保每天练习面试题。请朋友或专业人士帮你做一次模拟面试,并寻求反馈。你可能会发现一些意想不到的东西,你可以工作。

3.找一个导师

我感谢所有帮助过我的人,尤其是我的导师。行业专家是指出你的错误并为你指路的最佳人选。在非常早期的阶段,他们不一定是你的确切角色,但必须熟悉这个行业,并愿意帮助你。

4.选择一首曲目

我知道看不同的角色很有诱惑力,但请记住,当你专注于一件事时,它更容易完成。当人们告诉我这是在美国找工作最简单的方法时,我曾经考虑转到软件工程。也有人告诉我,无论你选择哪条职业道路,最终都会看到光明。我很困惑,但后来我意识到他们不是我。我是最了解我的人。虽然有更多的机会,但转行 CS 并不一定是一条更容易的路。我应该坚持走我更有信心和经验的路。

其次,数据科学可以是很多东西。商业智能可以是数据科学,机器学习也可以是数据科学。你的兴趣是什么?确保你符合招聘启事中的要求。

5.不要把自己封闭起来

在我有史以来的第一次实习中,我的日常工具是 Excel 和 photoshop(是的。我知道)。当我准备 SQL 的时候我很害怕,我在滴滴出行的第二份工作中经常用到 SQL。但那又怎样?当我知道今年夏天我需要为我的项目做数据工程和 UI 时,我实际上把它看作是一个学习新东西的好机会。谁说数据科学家不能更进一步?在你的舒适区之外多学习总是好的,有时机会会因此而选择你。

6.网络很重要

Photo by Brooke Cagle on Unsplash

在脸书和许多其他公司,需要表明这个人是如何认识他们所指的人的。这是有道理的,因为人们倾向于雇佣他们更熟悉和信任的候选人。公司也对那些主动并对他们表现出更多激情的候选人更感兴趣。

如果你还没有注册 LinkedIn,就注册吧。保持您的个人资料更新和专业。Headline 在 newsfeed 帖子中介绍你,你肯定希望这些帖子能吸引读者,让他们点击来了解你。浏览您的个人资料,就像它不是您的一样。标题对你有吸引力吗?体验描述详细吗?

除了与招聘人员或你梦想中的公司的员工联系,人际关系网还包括参与社区活动。和处境相同的人在一起,互相鼓励。

7.利用资源

在互联网时代,你几乎可以在网上找到所有的东西。但是没人会把它交给你。在我的校园里,就业中心每周都会邀请公司进行讲座和信息发布会,但只有少数学生到场。这与 2 号提示相关。只要你有上进心,你也是渴求资源的。

8.拥有数据科学产品组合

简历不是作品集。

Python、SQL、Tableau,一个数据科学家简历上列出的一些最常见的技能。是什么让你脱颖而出?好吧,展示你的项目并“证明”你有能力胜任数据科学家的角色。没有工作经验或其他证据,你的投资组合说明了一切。别担心,如果你对网络编程一无所知,使用网站生成器是完全没问题的。最后但同样重要的是,推广你的投资组合。我在简历后面加了两个二维码,一个加到我的作品集,一个加到我的 LinkedIn 个人资料。

9.跟踪这个过程

我使用 OneNote 跟踪我申请的每份工作、参加的每场面试和参加的每场职业活动。面试后,写下你做得好的地方,你可以做得更好的地方,以及对你来说是新的东西。不要为错误责怪自己,继续前进。

"从过去中学习,活在现在,为未来做准备."

―奥黛丽·法瑞尔

10.现在祈祷吧

找工作有时需要一点运气。一切都是如此。作为一个数据迷,我认为这是一个概率游戏。朝着你的目标努力,把“n”和“p”都增加,永不放弃!

Photo by Steve Halama on Unsplash

改善绘图的 10 个技巧

原文:https://towardsdatascience.com/10-tips-to-improve-your-plotting-f346fa468d18?source=collection_archive---------13-----------------------

因为在现实生活的数据科学中,绘图确实很重要

我必须诚实地告诉你:当我学习数据科学时,我完全低估了绘图的重要性。没错,那时候一切都是一团糟:在从头开始学习 Python、思考所有可能的算法和理解一切背后的数学之间,绘图是我的最后一个问题。

为什么不应该呢?我们总是在策划同样的事情。你知道:pairplots、distplots、QQ plots……你在可视化数据时使用的那些图表是理解它的唯一方式。非常有用的图表。但也是非常通用和默认的图表。于是复制粘贴一堆代码成了我那几天最好的朋友。

对于我的项目来说,可交付成果总是一个模型。希望能得到一些合理的分数,这要归功于数小时的清理和功能工程。我是参与我的项目的唯一一个人,我的教授们自从把数据给我之后,已经知道了所有关于这些数据的事情。那么我会为谁策划呢?我自己?拜托…没必要!对吗?我比任何人都清楚我每一步想要达到的目标。我不需要向任何人解释任何事情。

但是除了这一切,说实话,密谋一点都不花哨。任何人都可以策划。我 60 岁的父亲只用 Excel 就能从帽子里变出一些图表。如果每个人都能做到,当然,这就是不花哨的定义。因为在这里,我的朋友们,我们正在做数据科学和机器学习。大多数人甚至不知道那是什么。正如《哈佛商业评论》杂志所言,这就是为什么我们都如此酷和性感。

问题是 peeps-如果你还没有发现我的过度讽刺,这不是真正的生活是如何工作的。我相信这可能是我沉浸在数据科学中最大的失败:没有足够重视可解释性和可解释性的重要性。你可能是个天才,但是如果你不能向第三方解释你是如何以及为什么会得到那些美妙的预测,那么你可能什么都没有。例如,在 Ravelin Technology ,我们提供基于机器学习的防欺诈解决方案。想象一下,告诉一个客户,我们正在阻止 X%的交易,因为机器学习模型是这样说的,但完全不知道为什么要这样做。对于任何试图最大化转化和销售的电子商务来说,这肯定不是很有吸引力,对吗?想象一下,现在在医疗保健等其他敏感领域也出现了同样的情况……灾难就在眼前。

现在,除了与业务相关的问题,甚至除了从法律角度或从你的业务可能只关心预测的事实来看——无论你如何获得它们,理解算法实际上是如何工作的都会有所帮助。不仅是为了更好地向客户解释结果,也是为了更好地协调数据科学家和分析师的活动。

因此,在现实世界中,情况与我从事学术数据科学项目时的情况完全不同:我从来不是项目中的唯一参与者,我的同事和/或客户通常不太了解我使用的数据。那我现在会为谁策划呢?听起来还没必要吗?大概不会。能够向人们解释你的思维过程是任何数据相关工作的关键部分。这就是为什么复制和粘贴图表是不够的,图表个性化变得非常重要。

Te Fight Club

在这篇文章的剩余部分,我想和你分享 10 个基本的、中级的和高级的工具,我发现它们在现实生活中非常有用,可以用来解释你的数据。

我将在下面几行中引用的库是:

  • Seaborn | From: 将 Seaborn 作为 sns 导入
  • matplotlib | From:matplotlib . py plot as PLT

此外,如果您愿意,您可以设置一种风格和您喜欢的格式,如:

plt.style.use(‘fivethirtyeight’)%config InlineBackend.figure_format = ‘retina’%matplotlib inline

说到这里,让我们直接跳到工具:

1。绘制多幅图

你可能会想在一张图中画出几样东西,我们会简单介绍一下。但是其他时候,您可能希望在同一行或同一列中显示不同的图表,相互补充和/或显示不同的信息。

为此,我们将看到一个非常基本却又必不可少的工具:支线剧情。怎么用?很简单。matplotlib 中的图表是使用以下内容构建的:

  • 图形:用于绘制图表的背景或画布
  • 坐标轴:我们的图表

通常,这些东西是在我们的代码的背景上自动设置的,但是如果我们想要绘制几个图,我们只需要以下面的方式创建我们的图形和轴对象:

fig, ax = plt.subplots(ncols=number_of_cols, nrows=number_of_rows, figsize=(x,y))

例如,如果我们设置 ncols = 1,nrows = 2,我们将创建一个大小为 x,y 的图形,只有两个图表,分布在两个不同的行中。剩下的唯一事情就是使用“ax”参数从 0 开始指定不同绘图的顺序。例如:

sns.scatterplot(x=horizontal_data_1, y=vertical_data_1, **ax=ax[0]**);sns.scatterplot(x=horizontal_data_2, y=vertical_data_2, **ax=ax[1]**);

2.轴标签

这可能看起来没有必要,或者不是很有帮助,但是你无法想象如果你的图表有些混乱,或者看到它的人不太熟悉数据,你会被问多少次 X/Y 轴上有什么。按照我们前面的两个图的例子,如果我们想为我们的轴设置一个特定的名称,我们必须使用下面的代码行:

ax[0].set(xlabel=’My X label’, ylabel=’My Y label’)ax[1].set(xlabel=’My second X label’, ylabel=’My second and very creative Y label’)

3.设置标题

如果我们向第三方展示我们的数据,另一个基本但关键的工具是使用标题,它的工作方式与我们之前的轴标签点非常相似:

ax[0].title.set_text(‘This title has to be very clear and explicative’)ax[1].title.set_text(‘And this title has to explain what’s different in this chart’)

4.注释图表中的内容

通常情况下,仅将 y 轴放在图表的右边或左边本身并不清楚。无论是因为所有值之间非常接近,还是因为精度对于被分析的事物非常重要。无论是哪种情况,在图上标注值对增加澄清和自我解释非常有用。

假设现在我们使用支线图,所以我们有几个图表,其中一个是在 ax[0]位置的 Seaborn 柱状图。在这种情况下,获取每个条上的注释的代码有点复杂,但非常容易实现:

for p in ax[0].patches:ax[0].annotate(“%.2f” % p.get_height(), (p.get_x() + p.get_width() / 2., p.get_height()),ha=’center’, va=’center’, fontsize=12, color=’white’, xytext=(0, -10), textcoords=’offset points’)

对于图表中的每个“小块”或条形,代码直到“ha”参数获得条形的位置、高度和宽度,以将值标注放在正确的位置。以类似的方式,我们也可以指定注释的对齐方式、字体大小和颜色,而“xytext”参数指示我们是否希望在某个 x 或 y 方向上移动注释。在上面的例子中,我们将在 y 轴上向下移动文本。

5.使用不同颜色区分标签

在某些情况下,在一段时间或一个数值范围内,我们可能会测量不同种类的对象。例如,假设我们在 6 个月内测量了狗和猫的体重。在期末,我们要画出每只动物的体重,但是分别用蓝色和红色来区分狗和猫。为此,在大多数传统绘图中,我们可以使用参数“hue”来提供元素的颜色列表。

举以下例子:

weight = [5,4,8,2,6,2]month = [‘febrero’,’enero’,’abril’,’junio’,’marzo’,’mayo’]animal_type = [‘dog’,’cat’,’cat’,’dog’,’dog’,’dog’]hue = [‘blue’,’red’,’red’,’blue’,’blue’,’blue’]sns.scatterplot(x=month, y=weight, hue=hue);

6.更改散点图中的点的大小

使用上面的同一个例子,我们可能还想在图表中添加动物体重的大小,使用从 1 到 5 的范围。将此额外指标添加到图中的一个好方法是修改散点图的大小,通过“大小”参数将大小分配给新的附加向量,并使用“大小”来调整它们之间的关系:

size = [2,3,5,1,4,1]sns.scatterplot(x=month, y=weight, hue=hue, **size=size, sizes=(50,300)**);

顺便说一下,如果像上面的图表一样,图例使情节更难阅读,而不是有所帮助,你总是可以通过设置“legend”参数等于 False 来删除它;)

7.包括一条线来显示数据中的阈值

在现实生活中的许多情况下,数据高于或低于某个阈值可能是问题的信号或错误的警告。如果我们想在图上清楚地显示这一点,我们可以使用以下命令添加一条线:

ax[0].axvline(32,0,c=’r’)

其中:

  • ax[0]将是我们要插入线条的图表
  • 32 将会是画这条线的数值
  • c='r '用红色绘制

如果我们正在处理支线剧情,就像在上面的例子中给相应的轴添加一条轴线一样简单。然而,如果我们不使用支线剧情,我们应该做以下事情:

g = sns.scatterplot(x=month, y=weight, hue=hue, legend=False)**g.axvline(2,c=’r’)**plt.show()

8.多 y 轴绘图

这可能是最简单的,但也是最有用的提示之一。

有时,我们只需要在聊天中添加更多信息,除了在图的右侧 y 轴上添加一个新指标之外,没有其他办法:

ax2 = ax[0].twinx()

现在,您可以添加任何您想要的图表,将“ax”参数指向“ax2”

sns.lineplot(x=month, y=average_animal_weight, ax=ax2)

注意,这个例子再次假设你正在处理支线剧情。如果你不是,你应该遵循与上一点相同的逻辑:

g = sns.scatterplot(x=month, y=weight, hue=hue, legend=False)g.axvline(2,c=’r’)**ax2 = g.twinx()**sns.lineplot(x=month, y=average_animal_weight, **ax=ax2**, c=’y’)plt.show()

请注意,要做到这一点,您应该在两个图表中为 x 轴设置相同的数据。否则,它们不会匹配。

9.重叠的地块和变化的标签和颜色

在同一个轴上重叠图表很容易:我们只需要为我们想要的所有绘图编写代码,然后,我们可以简单地调用' plt.show()'来将它们绘制在一起:

a = [1,2,3,4,5]
b = [4,5,6,2,2]
c = [2,5,6,2,1]sns.lineplot(x=a, y=b, c=’r’)
sns.lineplot(x=a, y=c, c=’b’)plt.show()

然而,有时重叠会导致混乱,所以我们可能希望个性化我们的图表,使吃得更清楚。

例如,假设您想在同一个图中重叠两个不同样本的身高分布:一个来自您的同事,另一个来自您当地的篮球队。这将是很好的个性化的东西,如两个地块的颜色,并添加一个说明哪个是哪个的图例,对不对?嗯,很简单:

  • 设置“颜色”标签我们可以为每个标签设置特定的颜色。请注意,有时该参数可以简单地更改为“c”
  • 使用' label '参数,我们可以通过简单地在' x.legend()'之后调用来为它们指定任何要显示的文本

举以下例子:

g = sns.distplot(workmates_height, color=’b’, label=’Workmates’)sns.distplot(basketball_team, color=’r’, ax=g, label=’Basket team’)g.legend()plt.show()

10.在条形图中为轴设置订单

最后,一个非常特别的工具,如果你喜欢使用条形图,你可能会遇到这样的问题:你的条形图没有按照你想要的顺序排列。在这种情况下,有一个简单的解决方法,将一个包含您想要的特定顺序的列表传递给“order”参数:

a=[‘second’,’first’,’third’]b=[15,10,20]sns.barplot(x=a,y=b,order=[‘first’,’second’,’third’]);

绘图本身就是一个世界,根据我的经验,提高技能的最好方式就是练习。但是我希望当现实世界的数据科学像发生在我身上一样打击你时,这些工具和技巧能帮助你:)

最后,别忘了看看我最近的一些文章,比如我在训练测试分割中犯的 6 个业余错误,或者 5 分钟内完成的 T2 网页抓取。所有这些都可以在我的个人资料中找到。另外,如果你想直接在你的邮箱里收到我的最新文章,只需 订阅我的简讯 😃

回头见!

Python 中级程序员应该知道的 10 个高级概念

原文:https://towardsdatascience.com/10-topics-python-intermediate-programmer-should-know-3c865e8533d6?source=collection_archive---------1-----------------------

想成为一名专业的 python 开发者,请阅读这篇博客,了解 python 中的 10 个高级概念。

  1. Python 中的 Everything Object 是怎样的?
  2. 理解(多重和嵌套)
  3. 扩展关键字参数(*args,**kwargs)
  4. 闭包和装饰器
  5. 生成器和迭代器协议
  6. 上下文管理器
  7. @staticmethod 和@classmethod
  8. 继承和封装
  9. 运算符重载
  10. Python 包和程序布局

我会逐一解释所有的话题。

python 中的一切都是对象吗?

字符串是对象。列表是对象。函数是对象。甚至模块也是对象。任何东西都是对象,因为它可以被赋给一个变量或者作为一个函数的参数传递。

在 Python 中,任何可以(合法地)放在等号右边的东西都是(或创建)一个对象。

> def hello():
      print("say hello")> hi = hello()> hi()
"say hello">hello()
"say hello"

对象:

  1. 一个身份
  2. 一个值(可变或不可变)

Mutable: 当您更改项目时,id 仍然不变。字典,列表

不可变:字符串,整数,元组

理解

创建集合和可迭代对象的简写语法。

  • 列表理解:
[ expr(item) for item in iterable ]
  • 设定理解:
{ expr(item) for item in iterable }
  • 字典理解:
{ key_expr:value_expr for item in iterable }
  • 生成器理解:
( expr(item) for item in iterable)
  • 用 If-从句理解:
[ expr(item) for item in iterable if predicate(item) ]
  • 多重理解:
[(x,y) for x in range(10) for y in range(3)]
  • 嵌套理解:
[[y*3 for y in range(x)] for x in range(10)]

扩展关键字参数

当在 Python 中调用函数时,你经常不得不在使用关键字参数或位置参数参数之间做出选择。关键字参数经常可以用来使函数调用更加明确。当我们使用关键字参数时:我们经常会忽略参数的默认值。

Def function_name(arg1, arg2=1.0,):
    BODYArg1 => Positional ArgumentArg2 => Keyword Argument
  • 扩展的形式参数语法:

自变量在功能 定义端。

**How we use print, format function?**Ex: 
> print(“one”)> print(“one”, “two”)We are passing any number of argument in print statement.

扩展参数的数据类型:

*args => tuple
**kwargs => dict**these arguments should be pass in sequence.**Def func(arg1, arg2, *args, kwarg1, **kwargv):
    print(type(*args))
    print(*args)
    print(type(**kwargv))
    print(**kwargv)
  • 扩展实际参数语法

自变量在函数 调用方

> print_args(*t)
  1
  2
  (3, 4, 5)

关闭和装饰

在开始闭包之前,我们应该了解局部函数。

  • 局部功能:

函数内部的函数是局部函数。

  • 适用于专门的一次性功能
  • 有助于代码组织和可读性
  • 类似于 lambdas,但更通用
  • 它可能包含多个表达式
  • 可能包含语句

通过 LEGB 规则进行范围解析:
在 Python 中, LEGB 规则用于决定在范围解析中搜索名称空间的顺序。
范围按照层级排列如下(最高到最低/最窄到最宽):

  • Local(L):在函数/类内部定义
  • Enclosed(E):在封闭函数内部定义(嵌套函数概念)
  • 全局(G):在最高层定义
  • 内置(B):Python 内置模块中的保留名称
def func():    
    def local_func():
        a = 'hello, '
        b = 'world'
        return a + b
    x = 1
    y = 2
    return x + y
  • 返回功能:
def outer():
    def inner():
        print('inner')
    return inner> I = outer()
> I()
"inner"
  • 闭包:

维护对早期作用域中对象的引用。

def outer(x):
    def inner(y):
        return x+y
    return inner
> add_plus3= outer(3)
> add_plus3(2)
  5

我们可以使用 closure 来验证函数是否是闭包。

i = outer()  
> i.__closure__
  • 装修工:

修改和增强功能而不改变它们定义。实现为接受并返回其他可调用函数的可调用函数。

decorator workflow

我们也可以创建作为装饰者的类和作为装饰者的实例。

发生器和可迭代协议

  • Iterable : 对象可以传递给内置的 iter()函数得到一个迭代器。
  • 迭代器 : 对象可以传递给内置的 next()函数来获取下一项。
iterator = iter(iterable)item = next(iterator)
  • 发电机:

Python 生成器是一种创建迭代器的简单方法。我们上面提到的所有开销都是由 Python 中的生成器自动处理的。

一个生成器是一个函数,它返回一个我们可以迭代的对象(迭代器)(一次一个值)。

如果一个函数包含至少一个 yield 语句,它就成为一个生成器函数。

不同之处在于,当 return 语句完全终止一个函数时,yield 语句暂停该函数并保存其所有状态,然后在后续调用中继续执行。

为什么在 Python 中使用生成器?

  • 易于实施
  • 内存高效
  • 表示无限流
  • 流水线发电机
def PowTwoGen(max = 0):
    n = 0
    while n < max:
        yield 2 ** n
        n += 1

上下文管理器

上下文管理器是一个设计用于 with 语句的对象。

上下文管理器确保资源得到正确和自动的管理。

with context-manager:
    context-manager.begin()
    Body
    context-manager.end()

context manager workflow

_ _ 回车 __()

在进入 with 语句体之前调用

绑定到变量的返回值

可以返回任何类型的值

通常返回上下文管理器本身

_ _ 出口 __()

当 with 语句体存在时调用

exit(self,exc_type,exc_val,exc_tb)

@staticmethod,@classmethod

class attributes versus instance attributes:Class A:
    CLASS_ATTRIBUTE = 1
    Def __init__(slef, instance_attribute):
        Self.instance_attribute = instance_attribute

如果需要访问函数中的类属性,最好使用@classmethod。

如果你不需要使用 cls 对象,那么使用@static 方法。

与其他语言不同,在 python 中,静态方法可以在子类中被覆盖。

继承和封装

  • 传承 :

继承是一个类获取另一个类的属性的机制。例如,一个孩子继承了他/她父母的特征。通过继承,我们可以重用现有类的字段和方法。因此,继承促进了可重用性,并且是 OOPs 的一个重要概念。

  • 单一继承 :

子类将拥有基类的所有功能,它还可以修改和增强。

子类初始化器想要调用基类初始化器来使整个对象初始化有意义。

class SubClass(BaseClass):

调用其他类初始化器:

  • 其他语言自动调用基类初始化器
  • Python 对待 init()就像对待任何其他方法一样
  • 如果被覆盖,则不调用基类 init ()
  • 使用 super()调用基类 init()

isinstance (实例,类):判断一个对象是否属于指定的类型。

Issubclass ( 子类,基类):确定一个类型是否是其他类型的子类。

  • 多重继承:

定义具有多个基类的类。

Class SubClass(Base1, Base2, …):

python 怎么知道应该调用哪个基类函数?

Python 使用方法 Resolution Order 和 super 来做到这一点。

__bases__ => a tuple of base classes
__mro__ => a tuple of mro ordering

方法解析顺序

确定方法名查找的顺序

  • 通常被称为“MRO”
  • 方法可以在多个地方定义
  • MRO 是继承图的一种排序
  • 其实很简单

MRO workflow

  • 封装:封装:

请参考本文,了解关于封装的更多细节。

[## python——封装存在吗??

封装是将数据和对数据进行操作的功能打包到一个组件中,并限制…

medium.com](https://medium.com/@manjuladube/encapsulation-abstraction-35999b0a3911)

操作员超载

Python 运算符适用于内置类。但是同一个操作符对不同的类型表现不同。例如,+运算符将对两个数字执行算术加法,合并两个列表并连接两个字符串。

Examples of operator overloading

Python 包和程序布局

是一个可以包含其他模块的模块。

modules and packages

sys . pathPython 搜索模块的目录列表。

PYTHONPATH 列出添加到 sys.path 的路径的环境变量。

minimal package

1.包是包含其他模块的模块。

2.包通常被实现为包含特殊

init。py 文件。

3.init。py 文件在导入包时执行。

4.包可以包含自己实现的子包

init。目录中的 py 文件。

5.包的模块对象具有 path 属性。

绝对导入: 使用完整路径导入模块。

from test.test import Tester

相对导入: 使用相对路径导入同一个包中的模块。

from .test import Tester

all: 通过模块导入*导入的属性名称列表

Recommended project structure

如果你喜欢这篇文章,欢迎你来关注,这样你就不会错过未来的新更新。

数据科学家使用 Jupyter 笔记本的 10 个技巧

原文:https://towardsdatascience.com/10-tricks-for-data-scientists-using-jupyter-notebooks-f28387f73f77?source=collection_archive---------5-----------------------

5 分钟:提高效率 x 简单性 x 生产力

当我开始使用 Python 进行数据分析时,我很快发现 Jupyter 笔记本是一个很好的工具,可以为我的代码提供更好的结构。然而,有些事情仍然很烦人。如果我为了更好的可读性而使用标题,较大的笔记本会很快变得混乱。如果我在一个单元格中计算多个值,我只会收到最后一个变量的输出,以此类推…
但是,我们使用的是 Python,其他人也遇到了同样的问题,并找到了很好的解决方案。我想分享其中的一些。

目录:

1.两个数据集并排
2。打印特定单元格
3 的每个输出。改变屏幕宽度
4。Jupyter 扩展
4.1 代码折叠
4.2 可折叠标题
4.3 执行时间
4.4 便笺式存储器
4.5 内核空闲
4.6 Zenmode
4.7 表格美化器

1.两个数据集并排

有时我想并排比较两个较小的数据帧。使用下面的 css 代码片段,您可以调整输出:

CSS = """
.output {
flex-direction: row;
}
"""HTML('<style>{}</style>'.format(CSS))

现在,您可以在一个 Jupyter 单元格中对多个数据帧使用display(df):

2.打印特定单元格的每个输出

假设您在一个单元格中计算两个变量(即使这不是最佳实践😉).通常只显示最后一个结果:

只需添加以下语法,每个结果都将被打印出来:

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

3.调整屏幕尺寸

按照标准配置,Jupyter 笔记本电脑可覆盖 60%的屏幕。用一个简短的 css 命令你可以调整宽度(这里是 80%):

from IPython.core.display import display, HTML
display(HTML("<style>.container { width:80% !important; }</style>"))

在下面的屏幕截图中,您可以看到结果:

4.Jupyter 扩展

现在我们来到一个非常有趣的话题:Jupyter 扩展。正如我已经提到的,很多人编写扩展来优化笔记本。我将向您展示一些真正有用的数据科学扩展。如果您使用的是 conda,只需键入:

conda install -c conda-forge jupyter_contrib_nbextensions

之后你就可以使用 Jupyter 扩展了。在您通常启动笔记本的菜单中,您也可以选择现在的扩展(红色标记的区域)。我将向您展示 7 个有用的扩展(绿色标记的区域)。您可以通过单击复选框来激活它们:

4.1 代码折叠

如果你写了很多代码,过一会儿读起来会很混乱。使用Codefolding你可以隐藏缩进的代码

如果你激活扩展Codefolding,一个小三角形会出现在每个单元格的左上角。你可以点击它,缩进的代码将被最小化。

4.2 可折叠标题

可折叠的标题将使每个项目可读性更好。之前的扩展帮助你构建单元格的内容。有了这个扩展,你可以给整个笔记本一个更好的结构:

在截图中,您可以看到我为本文创建的笔记本的第一部分。第一个标题由#创建,第二个标题由##创建。类似于Codefolding扩展,你可以使用左上角小三角形的Collapsible heading。你可以点击它,一个标题后的所有内容都会被隐藏:

这是一个分层系统,如果您单击 h1 标题的三角形,h2 标题也会被隐藏:

4.3 执行时间

一旦您熟悉了用于数据分析的 Python 包,您就会希望提高代码的性能。Jupyter magic 命令%% timeit对于获取一个单元的执行时间非常有用,因为它将被执行 100 或 1000 次,以获取执行时间的有效平均值。对于更快的检查,扩展Execution time非常有用,因为它将始终显示每个输出单元中所需的时间:

4.4 草稿栏

有时候想尝试笔记本里的东西。通常,我创建一个单元格,然后删除它。但是在更大的项目中,我有时会忘记删除一些垃圾,我的笔记本中会出现不必要的命令。更好的做法是使用Scratchpad。这个扩展允许创建“抛弃式”代码片段:

一旦你激活扩展,你就可以用右下角的小三角形打开你的Scratchpad

4.5 内核空闲

较大的脚本有时需要几分钟甚至几小时来执行。使用扩展Kernle idle,当执行完成时,您将收到来自浏览器的通知:

您可以禁用通知或在笔记本顶部更改时间。如果您将时间更改为 30,您将只收到执行时间超过 30 秒的脚本的通知。

4.6 Zenmode

在下面的截图中,你可以看到一个干净的笔记本,没有不必要的菜单。我非常喜欢这个外观,您可以通过激活zenmode模式来获得它:

4.7 餐桌美化师

我认为学习 Python 代码是很重要的,并且我认为用语法记录你所做的一切总是更好。使用Table beautifier,您可以通过点击它来对列或索引进行排序。对于快速检查,这非常有用:

结论

Jupyter 笔记本非常适合分析,但仍有潜力让它们变得更好。作为数据科学家,有一些真正有用的 css 片段和扩展,让您的工作更加舒适。我希望你喜欢这篇文章。如果你知道任何其他有用的扩展,欢迎发表评论。

如果您喜欢中级和高级数据科学,并且还没有注册,请随时使用我的推荐链接加入社区。

每个数据科学家都应该知道的 10 种可视化

原文:https://towardsdatascience.com/10-viz-every-ds-should-know-4e4118f26fc3?source=collection_archive---------5-----------------------

现实世界中的数据科学

一张图胜过一千句话

Photo by Willian Justen de Vasconcellos on Unsplash

在对世界上被茂密丛林或巨大森林覆盖的地区进行多年调查后,有时会发现古代遗迹。考古学家在发现那一刻的感觉为科学家在通过可视化方式查看数据时经常拥有的感觉提供了一个窗口,这种感觉澄清了分析的一个关键方面。

对两者来说,这是一个 突然发现 的时刻!

数据可视化扮演两个关键角色:

1.向普通观众清楚地传达结果。

2.组织数据视图,提出新的假设或项目中的下一步。

毫不奇怪,大多数人更喜欢视觉效果,而不是大量的数字表格。这就是为什么带有有意义解释的清晰标记的情节总是出现在学术论文的前面。

这篇文章着眼于你可以对数据进行的 10 种可视化处理——无论你是想让更广阔的世界相信你的理论,还是打开你自己的项目并采取下一步行动:

  1. 直方图
  2. 条形图/饼图
  3. 散点图/线图
  4. 时间序列
  5. 关系图
  6. 热图
  7. 地理地图
  8. 三维绘图
  9. 更高维的图
  10. 单词云

直方图

让我们从直方图开始,它给我们一个感兴趣的数值变量的所有可能值的概述,以及它们出现的频率。简单而强大,直方图有时被称为数据分布。

从视觉上来说,我们绘制了一个频率表,其中感兴趣的变量被分成 x 轴上的多个范围,我们在 y 轴上显示每个范围中的值的频率。

例如,想象一下,一家公司通过提供因邮政编码不同而异的折扣,使其智能恒温器对消费者更具吸引力。恒温折扣直方图有助于理解其值的范围,以及每个值的频率。

Histogram of Thermostatic Rebates in USD

请注意,大约一半的恒温器折扣在 100 美元到 120 美元之间。只有极少数的邮政编码有超过 140 美元或低于 60 美元的折扣。

数据来源此处。

条形图和饼图

条形图(和饼图)对于分类变量就像直方图对于数值变量一样。条形图和饼图最适用于只能取固定数量值的变量分布,如低/正常/高、是/否或常规/电动/混合。

酒吧还是馅饼?重要的是要知道条形图在视觉上经常是不准确的。人类的大脑并不特别擅长处理饼状图(在这篇文章中阅读更多关于这方面的内容)。

太多的类别会导致条形图或饼图淹没视觉效果。在这种情况下,考虑选择最高的 N 值,并且只可视化那些值。

下一个例子显示了病人血压的条形图和饼图,按类别分为低、正常和高。

Bar and Pie Charts for Patient’s Blood Pressure

数据来源此处。

散点图和折线图

最简单的图表可能是散点图。它们在笛卡尔平面上显示数据的二维(x,y)表示,对于检查两个变量之间的关系特别有帮助,因为它们让查看者可以直观地探索任何相关性。折线图是散点图,但用一条线连接所有的点(当变量 y 连续时经常使用)。

例如,假设您想要研究房子的价格与其面积之间的关系。下图显示了一个散点图,y 轴表示房价,x 轴表示面积。请注意该图如何显示变量之间的线性相关程度,一般来说,平方英尺越多,价格越高。

我特别喜欢散点图,因为你可以用颜色和大小来扩展它们的维度。例如,我们可以根据每栋房子里卧室的数量给这些点上色,从而增加一种立体感。

将散点图扩展到 3 维或 4 维的一个简单方法是使用气泡的颜色和大小。例如,如果最后一个图中的每个泡泡都用每栋房子的房间数来着色,那么我们在图表中就有了第三个维度。

这里的数据源是。

时间序列图

时间图是散点图,时间范围在 x 轴上,每个点形成一条线的一部分——提醒我们时间是连续的(尽管计算机不是)。

时间序列图非常适合直观地研究数据随时间变化的趋势、跳跃和转储,这使它们特别受金融和传感器数据的欢迎。

这里举个例子,y 轴代表 2015 年到 2017 年特斯拉股票的每日收盘价。

Time Series Plot of Tesla Stock Close Price from 2015–2017

数据来源此处。

关系图

如果您的目标是开发一个全面的假设,那么直观地表示数据中的关系会特别有帮助。假设你是一家医疗保健公司的常驻科学家,从事一个数据科学项目,帮助医生加快他们的处方决策。假设有四种药物(A、C、X 和 Y ),医生给每个病人开一种且只有一种药物。您的数据集包括患者处方的历史数据,以及患者的性别、血压和胆固醇。

关系图是如何解读的?数据集中的每一列都用不同的颜色表示。图表中线条的粗细表示两列值之间的关系有多重要(频率计数)。我们来看例子深入解读一下。

药物处方的关系图提供了一些见解:

所有高血压患者的处方药物 A 和 y 大致相同。

药物 C 仅适用于低血压患者。

  • 开了 X 药的病人没有一个表现出高血压。

有了这些有趣的见解,你可以开始制定一套假设,并开始新的研究领域。例如,机器学习分类器可能会准确地预测药物 A、C 以及 X 的用法,但由于药物 Y 与所有可能的特征值相关,因此您可能需要其他特征来开始进行预测。

Patient Drug Prescription Relationship Chart

数据来源此处。

热图

另一种给二维图带来额外维度的酷而有趣的方法是通过热图,它在矩阵或地图显示中使用颜色来显示频率或浓度。大多数用户觉得热图特别直观,因为色彩浓度会引出趋势和特别感兴趣的区域。

下图显示了 IMDB 数据库中电影标题之间的 Levenshtein 距离。每部电影的片名离其他片名越远,它在图表中出现的颜色就越暗,例如(以 Levenshtein 距离计算)超人永远的蝙蝠侠远,但接近超人 2

这一伟大的想象归功于迈克尔·扎格姆。

Heat Map of Distances Between Movie Titles

地图

像大多数人一样,我喜欢地图,可以花小时在使用地图可视化有趣数据的应用程序上:谷歌地图、Zillow、Snapchat 等等。如果您的数据包含经度和纬度信息(或另一种按地理位置组织数据的方式(邮政编码、区号、县数据、机场数据等)。)地图可以为您的可视化带来丰富的背景。

考虑前面直方图部分的恒温器折扣示例。回想一下,返点因地区而异。由于数据包括经度和纬度信息,我们可以在地图上显示折扣。一旦我指定了从最低折扣(蓝色)到最高折扣(红色)的色谱,我就可以将数据放到州地图上:

Thermostats Rebates in USD

数据来源此处。

单词云

大量可供研究的数据以简单自由文本的形式出现。作为数据的第一步,我们可能希望可视化语料库中的词频,但直方图和饼状图确实最适合数字而非文字数据中的频率。所以我们可以转向单词云。

对于自由文本数据,我们可以从过滤掉像“a”、“and”、“but”和“how”这样的停用词开始,并将所有文本标准化为小写。我经常发现,根据您的目标,需要做额外的工作来清理和调整数据,包括删除变音符号、词干等等。一旦数据准备好了,很快就可以使用单词云可视化来了解语料库中最常见的单词。

在这里,我使用大型电影评论数据集为正面评论和负面评论分别绘制了一个词云。

Word Cloud From Positive Movie Reviews

Word Cloud From Negative Movie Reviews

三维绘图

通过向散点图添加第三维来可视化三维数据变得越来越普遍。这些图表通常受益于交互性,因为旋转和调整大小可以帮助用户获得有意义的数据视图。下一个示例显示了一个二维高斯概率密度函数,以及一个用于调整视图的控件面板。

2D Gaussian Probability Density Function

这里的数据源是。

更高维的图

对于高维数据,我们希望将四个、五个或更多特征的影响可视化。要做到这一点,我们可以首先利用前面提到的任何可视化技术,投影到二维或三维空间。例如,想象一下在我们的恒温器折扣图上添加第三维,其中每个点延伸成一条垂直线,指示该位置的平均能耗。这样做将得到四个维度:经度、纬度、折扣金额和平均能耗。

对于高维数据,我们经常需要使用主成分分析(PCA)或 t-随机近邻嵌入(t-SNE)来降低维数。

最受欢迎的降维技术是 PCA,它基于找到使数据的线性变化最大化的新向量来降低数据的维度。当数据的线性相关性很强时,主成分分析可以在几乎不损失信息的情况下显著降低数据的维数。

相比之下,t-SNE 是一种非线性降维方法,它降低了数据的维度,同时近似保留了原始高维空间中数据点之间的距离。

考虑一下 MNIST⁴手写数字数据库的这个小样本。该数据库包含数千幅从 0 到 9 的数字图像,研究人员用这些图像来测试他们的聚类和分类算法。这些图像的大小是 28 x 28 = 784 像素,但是通过 t-SNE,我们可以将 784 个维度减少到两个:

t-SNE on MNIST Database of Handwritten Digits

数据来源此处。

这里有十种最常见的可视化类型,每一种都有有意义的例子。这篇博客的所有可视化都是使用沃森工作室桌面完成的。除了 Watson Studio Desktop,一定要考虑像 R、Matplotlib、Seaborn、ggplot、Bokeh 和 plot.ly 这样的工具——仅举几例。

祝您好运,让您的数据成真!

[1]斯蒂芬很少。(2007 年 8 月)。“把馅饼留着当甜点”。https://www . perceptual edge . com/articles/visual _ business _ intelligence/save _ the _ pies _ for _ dessert . pdf

[2]迈克尔·扎加姆和豪尔赫·卡斯塔尼翁(2017 年)。基于物理学的数据科学协作方法。中等岗位

[3]安德鲁·马斯、雷蒙德·戴利、彼得·范、黄丹、安德鲁·吴和克里斯托弗·波茨。(2011).学习用于情感分析的词向量。 计算语言学协会第 49 届年会(ACL 2011)。

[4] Yann LeCun 和 Corinna Cortes。(2010). MNIST 手写数字数据库。在 http://yann.lecun.com/exdb/mnist/有售

特别感谢史蒂夫·摩尔对这篇文章的大力反馈。

推特:@ castan LinkedIn:@jorgecasta

机器学习将影响你生活的 10 种方式。

原文:https://towardsdatascience.com/10-ways-machine-learning-will-affect-your-life-522889a72c8?source=collection_archive---------13-----------------------

机器学习的兴起:我们的日常生活正在发生怎样的变革?

过去,机器体验是一种拖累。按一个按钮,拉一个杠杆,然后完成任务。几十年后,随着随后的计算创新,机器已经转变为超智能、自我学习、自动化的版本,正在席卷人类的景观。

重塑机器以个性化人类体验的底层技术是机器学习(ML),这是人工智能的一个分支,也是当今数字优先世界的一个热门词汇。本质上,它是关于编程机器通过利用大数据来注入自我学习的能力。分析从各种接触点提取的信息,并用于预测可操作情报的意图。

好消息是,的最新技术正在不断进步,彻底改变我们日常生活的方方面面。当语音控制的个人助理——亚马逊的 Echo 和 Alexa——推出时,人类第一次接触到了机器学习。随着智能家居趋势的加快,这些设备成为了一种新常态。无人驾驶汽车是典型的科幻幻想,但现在并不是遥远的未来。这些新时代的车辆旨在减少人类劳动,并在世界各地测试其效用。

最初,智能机器的想法是荒谬的。代表人类行动的机器并不常见。然而,随着机器学习在我们日常生活中的实现和发展,人类的景观正在发生根本的变化,以及如何变化。

下面,我们提到了机器学习正在彻底改变我们生活的 10 种方式。让我们开始吧。

健康

目前,机器学习被应用于快速患者诊断和加速医疗保健服务。尽管这些机器受到了“不够人性化”的审查,但它们提供的准确度和精确度是无与伦比的。

从管理、记录保存到成熟的诊断和治疗,ML 有能力分析即将到来的危机,并将其与众多其他方案进行比较,以获得正确的治疗和程序。这种比较节省了时间,并为决定性的医疗方法铺平了战略道路。

此外,机器学习可以使手术机器人在医疗程序中帮助医生,同时确保最小的侵入和高精度。这一成就可以提高外科手术的成功率,加快周转时间,降低成本。在医疗保健领域,ML 可以成为高效诊断、研究和治疗的关键推动者,从而强调该领域的整体转型。

根据麦肯锡的一份报告,制药业的停滞将会结束,医疗保健行业将开始转型之旅,仅在美国就可以节省 1000 亿美元。

交通

今天的交通行业受机器学习的影响很大。该技术通过部署传感管理和自动化,在消除鲁莽驾驶带来的威胁方面发挥了重要作用。这使得车辆能够理解周围的参数,并在需要时采取预防措施,以确保乘客的安全。

中国正在测试其城市的无人驾驶公交车,而谷歌和劳斯莱斯已经合作设计并在 2020 年前推出世界上第一艘无人驾驶船只。这艘船将利用谷歌的云机器学习引擎来了解大海和周围的物体。这将实现船舶的远程控制,并最终减少运输中涉及的资源。

除了车辆,机器学习很快可以用于交通管理和防止道路交通拥堵。目前,中国和新加坡正在引领创新,创造可以帮助司机选择畅通路线的算法。

BFSI —银行和金融服务业

几家银行和金融机构正在使用基于 ML 的复杂算法来分析和预测贷款风险,并评估应用程序的质量,从而帮助他们做出明智的决策。它还有助于通过分析检测欺诈和诈骗。

其他传统行业青睐机器学习,以缓解其转型瓶颈,并为利益相关者(包括客户)创造更好的用户参与。语音识别、聊天机器人和预测分析正在帮助弥合金融机构和潜在客户之间的差距。如今,客户可以在一天中的任何时间联系企业,并对聊天机器人的即时、实时回复感到放心。这不仅节省了时间,还改善了组织的客户体验。

例如,JP 摩根大通投资于技术,并在最近采用了一种内部元素-合同情报(COiN)平台,该平台用于"分析法律文件并提取重要数据点和条款"。这是机器学习如何影响金融集团目前工作方式的众多例子之一。

教育

诚然,机器人无法取代教师,但机器学习可以从整体上为他们的教学和教育方法提供多样性,这肯定可以帮助他们。多元智能能力用于评估孩子的学术理解,分析他/她感知知识的方式,并创建定制的学术计划,以帮助关注特定学生的健康属性。

这些算法分析测试结果,并创建一个独特的评分系统,可以节省教师的时间,并帮助完善儿童教育模块。更不用说,ML 对有残疾和学习差距的学生有极大的帮助。

除了教学之外,ML 还简化了管理职责,并通过其自动响应、定制软件等帮助教育机构创建一种有组织的方法来管理学生和员工。这一切都是为了打破流程,减轻组织机构的负担。

定律

律师仍然很忙。因此,自动化他们的日常活动可以将他们从多余的任务中解放出来,并帮助他们专注于为手头的案件创建可靠的解决方案。

机器学习带来了这种自动化,并给传统行业带来了新的变化。它增强了文件、它们的处理,并且还分析它们以用于证明和研究,这可以帮助律师提取相关信息,而不必花费时间在书籍和法律文件上。他们还可以帮助系统化的运作任务,如保持与听证会并驾齐驱,并注意即将到来的日期。

曼梯·里可以策划律师如何审查他们的案件,并有希望加快案件,否则需要几个月甚至几年才能解决。

机器学习与未来

简而言之,机器学习正在解决所有行业的复杂性,如果我们根据大量统计数据,几乎所有行业都将接受基于算法的工作并简化其处理过程,这是非常合理的。机器学习是未来,那些选择跳过这一进化元素的人可以确信他们即将衰落。

弄乱数据的 10 种方法

原文:https://towardsdatascience.com/10-ways-to-mess-up-your-data-804b0e27ff5?source=collection_archive---------30-----------------------

或者:如何惹恼你的数据分析师/科学家,即使那就是你

至少一半的数据分析工作是清理、争论和整理——实际上有点像为人父母。当您真正需要完成真正的工作时,仅仅以可用的形式存储数据就可以使事情变得更加顺利。另一方面,把基本要素搞错会导致很多令人头疼的事情。

不要做这些事情:

不要:在一列中组合数据类型

最常见的是:“51 (22%)”。停下来。为百分比制作第二列,或者将它们放在另一个表中,或者在需要时即时计算它们。不要把这些东西混在一起,因为你永远无法对它们执行操作。

感叹:随机改变列命名约定

如果一个表显示“单价”,另一个表就不应该显示“单价”。另一个常见的犯罪者:随意使用缩写,或者不使用,或者使用不同的缩写,即“学生入学”或“Stu Adm”或“StdAdmiss”。请停下来。

帮助:随机更改大写和大小写规则

如上,不要在“单价”、“单价”、“单价 _ 单价”和“单价.单价”之间切换。挑一件事,坚持下去。

请不要:在列名中使用空格和奇怪的字符

没有括号,没有斜线,没有散列。看在上帝的份上,不要逗号或制表符。理想情况下,避免任何空白,这样我就不必引用每个列名。

为什么?用“新”或“旧”标记一列

有人在某个时候认为这是个好主意。他们也可能认为他们会在一年后回来,并摆脱旧列。现在为时已晚,因为已经使用“boss_custom_roi_formula_new”为关键报告编写了 50 个查询。明年会发生什么?" boss _ custom _ ROI _ formula _ new 2 updated "。

如果重要的话,用一个具体的日期。使用一些其他版本或控制代码。或者更新旧的计算并适当地调整元数据。别这么做。

呻吟:去掉 NAs,因为它们很丑

在计数数据中,从缺失数据中估算出一个零是常见且合理的。但是在大多数情况下,数据确实是未知的,必须进行特殊处理。在一些计算中,他们会被包括在内,在一些计算中不会;现在不要在数据阶段做出决定,让以后的用户,包括您自己,适当地处理 NAs。你把他们剥光不是在帮他们的忙。

Ugh:在数据列中放置百分比符号或单位符号

那么它们就不会被当作数字来处理,以后你必须把它解析成两个值。将 50%编码为 0.5,以此类推。

新手提示:忘记指定单位

以上并不意味着你应该完全忽略单位。例如,您可能有一个“长度”列。什么长度?米?英寸?语境总不能告诉你,三年后你也不会记得。将其存储在另一列或元数据中。

停止:创建重叠和模糊的垃圾箱

假设您导出直方图的数据并对数据进行绑定,如下所示:

箱 1:1–10
箱 2:10–20
箱 3:20–30

现在 20 进了什么鬼地方?二号箱还是三号箱?我不知道!指定准确的包含值,或左/右利手,或使用括号符号。

倒数第一:丢掉数据然后跑

我的意思是,不要在某个地方保存一个随机的带有一些值的平面文件,不要标明它是什么,它来自哪里,是谁制作的,或者将来如何更新。

你需要文档,可能是元数据的形式。某处应该有一些指示:

  • 数据源。不仅仅是负责数据的实体,还包括您访问数据的方式和时间。这种接触可以采取各种形式。你对某人有特殊要求吗?它发表在标准报告中了吗?还是运行了 SQL 查询?如果你运行了那个查询,它在哪里?
  • 描述哪些假设、限制和定义适用于这些数据。至少找出任何可能让其他人犯错的模糊之处。例如,数据显示“销售”,但表格只显示了东部地区的销售情况,这一点要非常清楚。
  • 记录数据的时间(与访问数据的时间分开)。用户数量是记录在日历年的年末,还是年初?你做调查的时候。财政年度结束?这可能因数据类型的不同而有所不同,并且可能会在以后产生影响!

这是数据治理的最基本层面。但是避免这些“不要”会节省很多沮丧和浪费的时间——就像确保第一次就把尿布穿好,而不是在凌晨 2 点。

人工智能 100 天

原文:https://towardsdatascience.com/100-days-of-artificial-intelligence-3a38c75b6a5d?source=collection_archive---------29-----------------------

Photo by @davidclode

100 天内每天写一篇关于人工智能的文章

100 天前,我决定在 500 天内每天写一篇关于人工智能的文章。因为这是第 100 天,我现在已经完成了目标的五分之一。我写的东西比以前任何时候都多,并且能够专注于一个主题。这是一次非常令人羞愧的经历。这一点的亮点远远超出了写作,在这篇文章中,我将提到大声思考的好处;我写作中的一些线索的总结;以及我将要写的东西。我已经达到了一个里程碑,我很自豪我成功地朝着更好地理解人工智能迈出了这一小步。

大声思考你关心的话题

我经常写作的直接好处是成为一名更好的作家。现在我已经有规律地写作 100 天了,但我绝不认为这是我得到的最大的好处。中国有一句话,在这方面让我产生了共鸣。

请教别人一次是 5 分钟的傻子,从不请教别人是一辈子的傻子— Qǐngjiào biérén yīcì shì 5 fēnzhōng de shǎzi, cóng bù qǐngjiào biérén shì yībèizi de shǎzi

问问题的人是五分钟的傻瓜;不问问题的人永远是傻瓜。

然而,我不认为一个人永远是个傻瓜——倾听很重要。然而,在学习社会科学领域不同学科的编程时,我开始对这种技术发展提出如此广泛的问题,这让我觉得不那么愚蠢了。

读书和做事时大声思考有明显的好处。我将列举几个以我的经验对学习过程有帮助的例子:

  1. 朋友、教授和同事给我发来与我感兴趣的主题相关的文章链接。
  2. 被一系列来自不同背景的人问及关于你当前想法的关键问题。
  3. 接近文本可能意味着被不同身份的其他作者接近,以便与另一个受众进行对话或写作。
  4. 挑战自己可以激发他人通过写作来表达自己,这可能会揭示你尚未发现的精彩方面。
  5. 回顾过去和现在来判断你的写作,回顾在某个特定的时刻你是谁,你现在是什么。

想要成为一名更好的作家,不仅仅是语法正确或文字华丽。写作是对你是谁的诠释,是别人对你所想的解读。文字能传达你的意图,因为它在阅读之外连接到读者。我是如此幸运和幸运地体验到写作可以超越我的直接期望,为此我很感激。

感觉人工智能

当你面对两个词‘人工智能’时,很难知道从何说起。我花了前 50 天考虑人工智能的一般方法,写下我能找到的一切。接下来的 50 天,我一直专注于人工智能安全,试图将这一领域的想法与气候危机联系起来。一路走来,毫无疑问,我好几次觉得自己一无是处,或者像个傻瓜一样,有时只是路过。

如果我继续探索这个领域,这个过程很可能会重复。我必须拥抱未知,才能了解我不知道的东西——或者在未知的未知中我不知道的东西。当我写作的时候,缺乏清晰的发现让我每天都很兴奋,不确定性在某种意义上是确定的。只要我继续成长,我不需要长得很快。

不怕慢, 就怕停 — bù pà màn, jiù pà tíng

不怕成长慢,就怕停滞不前。

理解需要时间,我还没说完。我还有 400 天的时间,但是在这之后还有一辈子。我遇到过几个研究人工智能的研究人员,他们几乎从我出生之前就开始研究人工智能,或者一直在积极地编程。我所欣赏的学者和专业人士将他们的知识传授给了我,我将尽我所能发扬光大,尽我所能为社会做贡献。尽我所能。

因此,为了总结我在 50 天内探索的两个主题,我想说以下内容。

  • 人工智能(AI) 是一个让人又爱又恨的概念,一个与人类或非人类毫无关系的模糊词。一个人不仅仅是一系列程序化的行为,然而我们也是这样。随着机器学习新技术的出现,人工智能的可持续性也出现了问题。不负责任地使用技术会加剧气候危机,尤其是当大型技术公司自我监督或自我评估时。
  • 人工智能安全必须超越网络安全和可能存在的威胁。此外,它还关注机器学习技术的扩散和数据量的增长带来的环境后果、外部性或后果。我们在技术背景下狭义地谈论安全,通常没有这些观点或治理。当一些公司从“用户”转向“公民”焦点时,这种对话的变化至关重要。我们必须开发新的方法、法规和实践,以适当的方式解决这些问题。

试图将 100 篇文章缩减为两段是很奇怪的,但我尽了最大努力,我希望这对你有价值。你可以通读全部 100 篇文章,但是我不认为大多数人有机会或时间这样做。我正在做一个小项目,将这些知识整理成一个更好的格式,很快就会公布。如果你愿意以任何方式提供帮助,我恳请你的耐心和帮助。

我从这里去哪里或者写什么?

我告诉自己,我应该每天做更多的编程,并把它与我的写作联系起来。因此,在接下来的 100 天里讲述 Python,这种最著名的编程语言之一,对我来说是有意义的。100 天致力于使用定性和定量方法的社会科学家的机器学习,听起来像是一个有趣的挑战,我想接受。

100 天的 Python 和数学的确挑战了我的极限,事实上是在推动它们。我对用 Python 导航、写关于 Python 的文章或用 Python 编程一点也不舒服。因此,在我看来,这是最好的着手方式之一。在接下来的 100 天里,每天探索代码库和浏览一些 Python 代码不会让我成为一个伟大的程序员,但是它会让我成为一个稍微好一点的程序员。

如果你在这种情况下对我的写作感到失望,我的文章没有达到你认为必要的水平,我道歉。我想问一下,如果你读了这本书,你能帮助我理解和学习会不会更好。

写作时什么最重要?

写作时最重要的是:不要太执着。正如你可能已经猜到的,我不能说我完全生活在这条线上,或者它与我目前的行为一致。然而,我认为这是我在这个特殊时刻所能想到的最重要的方面。

你可以纠结于你的错误,担心每个人都会注意到你有多糟糕。你可能会纠结于自己对某个话题缺乏了解,几乎可以肯定有人在说你的写作不好。一旦一篇文章最终出版,你可能会纠结于你应该写些什么,然后再回去没完没了地修改。这一切都很好。

然而最重要的是,你可以沉迷于写作而不是爱情。

这是所有与写作相关的困扰中最具毁灭性的。当你在键盘上打字的时候,你看到你爱的人想要你的注意。对于一个作家来说,忽视爱情是最大的罪过。

忘记为你爱的人感到骄傲,并通过你的行动告诉他们他们有多棒,这是不对的。在所有这些问题上,我都是有罪的,如果我要继续写 100 或 400 天,这是我必须改变的事情。

当达到一个里程碑时,习惯上要感谢某人,有很多人让这种学习经历有了回报。

我想首先对我的妻子说一声谢谢,她总是理解我,并且有着我无法理解的耐心。我要感谢我的家人,感谢他们通过如饥似渴地阅读我的文章来支持我。我要感谢我的同学挑战我的假设,感谢我的教授质疑我想法的基础。最后,我的朋友们,你们给了我分享和挑战自我的信心:谢谢你们。

这是#500daysofAI 的第一个 100 天。

人工智能 100 天

1。定义 AI—# 500 days ofai:
https://medium . com/@ alexmoltzau/500-days-of-artificial-intelligence-1-191 CB 486921 b?source = friends _ link&sk = 887 e 8744 ed 51 e 477458 AE 60d 2859 dbad

2。一篇关于应用人工智能和可持续城市的论文: https://medium . com/@ alexmoltzau/an-Essay-On-Applied-Artificial-Intelligence-and-Sustainable-Cities-463 FAE 866 d77?source = friends _ link&sk = 23 a53 C2 db 129 bdda 4 f 243 BD 1c ee 9188 a

3。人工智能资助的一些当前问题: https://medium . com/@ alexmoltzau/some-Current-Issues-In-Funding-of-ethical-Artificial-Intelligence-a7be 9 ca 1a 178?source = friends _ link&sk = 70ba 1570388643 fc 8334 f 305 D4 EBD 706

4。人工智能领域专利: https://medium . com/@ alexmoltzau/patents-In-The-Field-of-The-Artificial-Intelligence-2019-52 db 9 b 03 Abe 6?source = friends _ link&sk = effdefe9c 85481794 fedad 27d 053990 e

5。AI for Good 与 AI for Bad —发表于创业: https://medium . com/swlh/AI-for-Good 与 ai-for-bad-71627e3d7849?source = friends _ link&sk = 7ed 4065 FD 7913 db8b 71354 f 3480 F2 b 25

6。阿根廷和乌拉圭的 AI 治理: https://medium . com/swlh/AI-Governance-in-Argentina-and-Uruguay-aeb 68417 db 93?source = friends _ link&sk = d 352 D3 f 641 fcafc 9 b 45649 a 9035 cf 15b

7。AI 领域的三位作家: https://medium . com/@ alexmoltzau/three-Writers-In-The-Field-of-AI-44 f14 c0e 3402?source = friends _ link&sk = 3610 e 4980 c 85 f 65d 70 e 791d 5 af 082248

8。斯堪的纳维亚 AI 策略 2019 —发表于《成为人类: https://medium . com/@ alexmoltzau/斯堪的纳维亚-AI-Strategies-2019-16 ecec 9f 17 DC?source = friends _ link&sk = 46 ECB 92 fa 21 edd 4a 3268037 c 7 FD 7 b 926

9。社会科学家与 AI —发表于 AI 社会研究: https://medium . com/AI-Social-Research/Social-Scientists-and-AI-1d9d 97 a 5246?source = friends _ link&sk = fb29 f 5178 E3 C4 b 34 b 7 EC 56082 bfc 3 e 47

10。10 对 AI 的思考:
https://medium . com/@ alexmoltzau/10-thinks-on-artificial-intelligence-e94c 6c 533270?source = friends _ link&sk = 1d 9868554318868 DCE 78 D1 d 7 e 973 e 58 c

11。Spacemaker AI 的崛起与崛起——发表在《走向数据科学:
https://towardsdatascience . com/the-Rise-and-Rise-of-space maker-AI-5c 800 a 001 CAA?source = friends _ link&sk = f 820 a 79 f1 d 7 e 5 a3 a9 b 6708099 e 31 c 363

12。不等式与 AI —发布于创业: https://medium . com/@ alexmoltzau/inequalities-and-AI-255 c28 a 706d 4?source = friends _ link&sk = 540641 BD 952 b 87 C2 F7 b 8672 ACC 70 ca 0b

13。人工智能与宗教:
https://medium . com/@ alexmoltzau/artificial-Intelligence-and-Religion-7 aebd 77 f 95 f 1?source = friends _ link&sk = e 765 EB 857 cc 905410 EFA 1884433 db 94d

14。AI 上下文感知引擎: https://medium . com/@ alexmoltzau/AI-Contextual-Awareness-Engine-283 cfbf 2280?source = friends _ link&sk = 64d 482122 c 97895 a 68 EB 57 f 679935 fab

15。A Noob 在批判我的算法: https://medium . com/@ alexmoltzau/a-Noob-Is-criticing-My-Algorithm-7c 0 BF 585758 f?source = friends _ link&sk = ce 1165 e 59 AEC 6 f 8665 b 246 A8 be 177 ee 9

16。 虹膜。AI 你的科学助手—发表于初创: https://medium . com/swlh/iris-AI-Your-Science-Assistant-60 eefd 3628 ab?source = friends _ link&sk = ade 9119 c 43 DD 4634 E1 f 10 ca 37 EFE 4b 15

17。数字不安全:
https://medium . com/@ alexmoltzau/ai-网络安全-区块链和气候危机-a10880046cd?source = friends _ link&sk = D1 a7 ff 36975422 c8 aa 05 b 0 E1 DD 293496

18。瑞士的人工智能: https://medium . com/@ alexmoltzau/artificial-Intelligence-in-Switzerland-a 2d 6391 b 7 c 4?source = friends _ link&sk = 4f3de 129 c 60 EEC 480 a6f 632008524980

19。水与人工智能
https://medium . com/@ alexmoltzau/水与人工智能-a7cf2ac23c17?source = friends _ link&sk = bfb 2c 3 e 8 c 81 a 558023 f 3232 e 46473 e 74

20。人工智能与音乐:
https://medium . com/@ alexmoltzau/artificial-Intelligence-and-Music-f3f3b 1421529?source = friends _ link&sk = BC 218 c8 f 48 FB 7 ea 3c a 43962 b5 DCD 3473

21。# 500 daysofai 20 天后: https://medium . com/@ alexmoltzau/500 daysofai-after-20-days-99 daf 69 a8f 02?source = friends _ link&sk = AFA 3992 D5 e 96 befd 4c 318 E3 f 6 EFE 48 c 2

22。日常生活与微预测: https://towardsdatascience . com/daily-Life-and-micro prediction-f76c 1721872 a?source = friends _ link&sk = a5ae 0 af 21348 e 80 b 0 cf 482 fc 30856 a 73

23。偏向香蕉?🍌 https://medium . com/zero-equals-false/biased-bananas-957 f 335 ec2?source = friends _ link&sk = 2 ACD 54689734 e 95 DCD 50022 DC 40 beffe

24。AI 与九种智能形式
https://towardsdatascience . com/AI-and-Nine-Forms-of-Intelligence-5cf 587547731?source = friends _ link&sk = 62970 b5 ed8c 29279 e 1069657304 c526 b

25。利用人工智能提高生活质量的多模态老年护理系统: https://medium . com/@ alexmoltzau/multimodal-animal-Care-Systems-Using-Artificial-Intelligence-to-Improve-Quality-of-Life-992 de 2980787?source = friends _ link&sk = ed 622 b 591d 2445 FB 0 DBE 39 Fe 9 B4 ebb 7

二十六。来自古德温的故事 https://medium . com/@ alexmoltzau/tales-From-goodwind-d 4403 C1 da 48 b?source = friends _ link&sk = 7b 59 cf 627 b 8 cabc 3 df 0476 CD 09285 c 23

27。人工智能研究中心(CAIR) https://medium . com/@ alexmoltzau/the-Centre-for-Artificial-Intelligence-Research-cair-5 C1 F4 a 0 a 440d?source = friends _ link&sk = 33 E3 b 01d 9d 180 a1 de 8 F2 E0 b 605 c 09968

28。定性数据科学家
https://towards Data science . com/the-Qualitative-Data-Scientist-E0 EB 1 FB 1c EB 9?source = friends _ link&sk = 816 b5 c 2278239 Abd 478346 ec5f 3023 af

29。实体产品设计中的 AI https://medium . com/@ alexmoltzau/AI-in-Physical-Product-Design-e 67 c 02 A8 C2 c 1?source = friends _ link&sk = 9 fcad 1 f 438 c 0 BF dcb 082622786925 e37

30。非常人造的诗
https://medium . com/@ alexmoltzau/非常人造的诗-1e690f8f097?source = friends _ link&sk = c 36 e 9 f 4 E1 f 226d 966 b 918 b 97913 b 1222

31。人工智能 30 天
https://medium . com/@ alexmoltzau/30-Days-of-Artificial-Intelligence-96b 56 b 1966 e 6?source = friends _ link&sk = 2ed 9253d 507 be 094357 DD 4c 0 c 07 B3 Fe 5

32。AI 与冒名顶替综合征
https://towardsdatascience . com/AI-and-The-Imposter-Syndrome-BF 66 E1 daf 8d 8?source = friends _ link&sk = 8e 168 Fe 5d 71 b 939 D5 f0ac 43557883623

33。新锐中文创业智能音箱 Startup Maybe
https://medium . com/@ alexmoltzau/the-New-Chinese-Smart-Speaker-Startup-Maybe-3b 290 D6 cc 5c 3?source = friends _ link&sk = 80389 Fe 70 DFA 8 b 0 e 500 b 724 c 80 f 892 e 7

34。人工智能物联网
https://medium . com/@ alexmoltzau/artificial-Intelligence-of-Things-97278 f 810 d8a?source = friends _ link&sk = 592 b 357 a 75d 3 e 76 DC 0 c 0 adcc 2 Fe 81760

35。数据白
https://towardsdatascience.com/databaiting-d26cad4c49ca?source = friends _ link&sk = DD C5 a5 ed 46 c 4947 FB 1010 e 50 c 112d

36。AI 即服务
https://towardsdatascience . com/AI-as-a-Service-b 465 DDC 0 c 7 e 0?source = friends _ link&sk = CD 53 b7a 877301333 D4 f 7671540 c8 e 910

37。数字暴力与 AI
https://medium . com/@ alexmoltzau/digital-Violence-and-AI-8300 dee 795 c 9?source = friends _ link&sk = BCA 08914176 ab b5 c8 c 983 cc 408 c 1486

38。以艾的名义住手!
https://medium . com/forward-artificial-intelligence/stop-in-the-name-of-ai-490 B1 CDA 26 b?source = friends _ link&sk = DBF 7 cdd 8 b 35 da 8 b 06 a3 FD 9b 31762 ed 37

39。Google AI 和半监督学习的发展
https://towardsdatascience . com/Google-AI-and-Developments-in-Semi-Supervised-Learning-5b 1 a4 ad 29d 67?source = friends _ link&sk = DDC 7 B1 d 106980109 b 8699 b 187 ee 39191

40。无监督增强数据半监督学习的进步
https://towardsdatascience . com/advances-in-Semi-Supervised-Learning-with-Unsupervised-Data-augmentation-fc 1 fc 0 be 3182?source = friends _ link&sk = cbac 033 D5 f 98 b5 ff 54 daf 4547 a 3d 0 ace

41。半监督学习中静悄悄的革命是如何改变行业的?
https://towardsdatascience . com/how-is-the-quiet-revolution-in-semi-supervised-learning-changing-the-industry-4a 25 f 211 ce 1 f?source = friends _ link&sk = 5d 489 e 00953626 AC 206 eceee 8 AC 3c 5 fc

42。40 天伴随 500 天的 AI
https://medium . com/@ alexmoltzau/40 天伴随-500 天的 ai-a05167e9ac69?source = friends _ link&sk = 364 ef 2e 465d 53 cf 076 c 0 ba 9 FB 4079 c 64

43。用警句拯救野生动物 AI
https://medium . com/zero-equals-false/saving-Wildlife-with-警句-ai-32db125e4e22?source = friends _ link&sk = 08d 4 ab 5 ab 4c 951519 e8d 7 fa 5519 f 01 f 9

44。Google Federated Learning and AI
https://towardsdatascience . com/Google-Federated-Learning-and-AI-64c 6 E4 e 4 e 22 f?source = friends _ link&sk = 45176 a2f 883275 f 562669 a 7931190 cf1

45。人工智能与养老
https://medium . com/swlh/artificial-Intelligence-and-Pension-f 94c 6 f 4915 ee?source = friends _ link&sk = 2d ca 013 AE 1 ee 10728 ab3b 6771 E0 d0a 8 f

46。使用 FaceApp 进行数据绑定
https://medium . com/zero-equals-false/data baiting-with-face app-1d 810089 f 61d?source = friends _ link&sk = e 034427 c 03 a 753 FDD 2 b 88 fbf 03877d 4

47。走向社会数据科学
https://towardsdatascience . com/走向-社会-数据-科学-f90c5c020855?source = friends _ link&sk = 2c 86 ddf 5 dcdef 6 f 055843 D3 f 01771 bed

48。脸书 vs 欧盟人工智能与数据政治
https://towardsdatascience . com/Facebook-vs-EU-Artificial-Intelligence-and-Data-Politics-8 ab 5b a4 Abe 40?source = friends _ link&sk = 756 BBC 8 cf 12 D7 Bab 4c 83 f 6b 802 abdf 9 e

49。人工智能与公平
https://medium . com/@ alexmoltzau/artificial-Intelligence-and-Fairness-75c 2490 e8d 57?source = friends _ link&sk = 32fc 4151778 EDB 664 EB 79 DD 57e 712118

50。极右翼极端主义和 AI
https://medium . com/@ alexmoltzau/极右翼极端主义-和-ai-ef93d55c6dee?source = friends _ link&sk = 64 f 67 ba 00148 ddfd 563 ad 14 af 37d 57 c8

51。走向人工通用智能
https://medium . com/data series/open ai-or-closedai-FAE 7 BDD 0 fcff?source = friends _ link&sk = 4b 572783 e9ff 49 add 07 E4 AEF 3 ded 34 c 3

52。辩论 AI 安全辩论
https://towards data science . com/distribution-the-AI-Safety-Debate-d93e 6641649d?source = friends _ link&sk = 55e 9229 db 0464 a 53 C5 b 27d 715 c 79 B1 fa

53。脸书如何定义与人工智能相关的恐怖主义:
https://towardsdatascience . com/Artificial-Intelligence-and-Terrorism-in-social-media-cf 166 adaf 78 e?source = friends _ link&sk = 2bd 40d 725 ee 8 f 99 a 91181272 BF 20 cfde

54。人工智能中的避免副作用和奖励黑客
https://towards data science . com/avoiding-Side-Effects-and-Reward-Hacking-in-Artificial-Intelligence-18c 28161190 f?source = friends _ link&sk = b71f 8915 DC 595 Fe 44 CBD eeb 2 f 7 d0a 735

55。AI 安全与气候危机
https://medium . com/swlh/AI-Safety-and-the-Climate-Crisis-DD 232 af 145 a 2?source = friends _ link&sk = 6f 039 ba 378 b 8269 CAD 8276 F3 cf 7858 f 0

56。用机器学习缓解气候变化
https://towardsdatascience . com/用机器学习缓解气候变化-197f09c00fac?source = friends _ link&sk = 22 C6 f 39 C3 fbf 7 fa 34 a 12 ab 91 fbb 42 CB 7

57。用机器学习适应气候变化
https://medium . com/@ alexmoltzau/adaptation-to-Climate-Change-with-Machine-Learning-47421 CD 04387?source = friends _ link&sk = 91 aed 82 ad 9 c 85320 c 179633 ef 900184 c

58。AI 安全与社会数据科学
https://towardsdatascience . com/AI-Safety-and-Social-Data-Science-527 C2C 576 a 98?source = friends _ link&sk = 23c 6 f 786 de 9571012 aeec 56d 9 ad CFF 74

59。人工智能与挪威性别配额
https://medium . com/swlh/artificial-Intelligence-and-Norwegian-Gender-Quotas-11d 8d 9 BF 114 a?source = friends _ link&sk = 1217743d 41 CBF C1 DD 4 efad 588143769 a

60。AI +安全与 DNV-GL
https://towardsdatascience . com/AI-Safety-with-DNV-GL-826500 a401a 7?source = friends _ link&sk = a5d 372109d 613 BAE 39 ABC 3a 4486 e 4248

61。人工智能&旁观者
https://medium . com/@ alexmoltzau/人工智能-旁观者-8185ed9367b7?source = friends _ link&sk = 770916644 EC 3 feb 299 e 2512 AC 1852 a 20

62。AI 安全到底考虑不考虑工作安全?
https://becoming human . ai/does-ai-safety-consider-job-safety-or-not-f 21af 695824 e?source = friends _ link&sk = e5e 9 a 69612 afae 433 e 31571 BC E0 ba 412

63。斯坦福大学 AI 安全中心
https://medium . com/data series/center-for-AI-Safety-at-Stanford-University-FCE 999 f 12 BC 8?source = friends _ link&sk = 00 BF 743 b 0 aed 34d 57 B3 c 9829 be 33125 c

64。非常人造诗# 2
https://medium . com/@ alexmoltzau/非常人造诗-2-f0f2fde5450a?source = friends _ link&sk = 6 fc 0 be 6733 f 236 ab 6179 C4 ACC 0032d 99

65。人工智能伦理与世界统治
https://towardsdatascience . com/artificial-Intelligence-Ethics-vs-World-Domination-7 cf2a 5734151?source = friends _ link&sk = 43 D1 f 42 DC 31 c 89 d3b 4410 C3 a3 A0 de 271

66。人工智能与近期十亿美元投资 2019
https://medium . com/data series/artificial-Intelligence-and-Recent-Billion-Dollar-Investments-2019-759 e 78 b 042 ad?source = friends _ link&sk = 698504869969768 DD 65 CEC 8 BC 8 cf 8306

67。人工智能与信任
https://becoming human . ai/artificial-Intelligence-and-Trust-e 2 BC 1 AC 548?source = friends _ link&sk = 301 a1 D6 d 95 f 8660 f 48 b 8d 9 e 576d 55d 73

68。安全人工通用智能
https://towardsdatascience . com/safe-Artificial-General-Intelligence-29 CB 4 ad 0814 e?source = friends _ link&sk = 3827586 b 6571324 e19f 63177 FD 5022 FB

69。关于高级 AI 的顶级神话
https://medium . com/@ alexmoltzau/the-Top-Myths-About-Advanced-AI-9961 eb1 f 6987?source = friends _ link&sk = 7 fc 705 f 4096 addfc 059513067 dffe 383

70。AI 安全与设计理解人类真正想要什么
https://medium . com/@ alexmoltzau/AI-Safety-and-design-to-Understand-What-Humans-Want-adcd 3455 d0c 0?source = friends _ link&sk = 905 ACF 0832 aa 754280 ABC 3c 47 a9 b 277 b

71。人工智能 70 天
https://medium . com/@ alexmoltzau/70-days-of-Artificial-Intelligence-d 2522 f 209 EC 7?source = friends _ link&sk = ca a3 f 87d 22504 c 7d 37 b 466 DD 147 a19 e 1

72。人工智能与 UNDP
https://towardsdatascience . com/artificial-Intelligence-and-the-UNDP-779 b 50 de 9 ACD?source = friends _ link&sk = 15b 4720 FB 4210392 b 6 e 79 aab 48 fac 223

73。艾元素
https://medium . com/@ alexmoltzau/elements-of-AI-b 68 FFB 60526 a?source = friends _ link&sk = 391 dee 2 b 6b 14 ce 1 e 2751 dbb 664 c 40 a 64

74。AI 安全——你如何防范对抗性攻击
https://towards data science . com/AI-Safety-How-Do-You-Prevent-Adversarial-Attacks-ede 17480 a24d?source = friends _ link&sk = 6412985 e 912 CB 5 e33 a 407490d 342991 a

75。人工智能领域内的解决方案有多安全?source = friends _ link&sk = 6 D3 FEC 62 c 29 bb 188 BAF 42 b 98974 c 3d 43

76。AI 安全与法律技术
https://medium . com/data series/artificial-intelligence-and-law tech-4d 7181 a 03202?source = friends _ link&sk = 034 ca 8 e 79398847 BF 9 CAC 61 c 2 Fe 53 f 46

77。人工智能与生物技术
https://medium . com/datadriveninvestor/artificial-Intelligence-and-Biotechnology-c 787 c 02 f 4d 62?source = friends _ link&sk = 3 f 276 dab 183 c 40 aa 2087 cc 3 e 558 b 85 e 9

78。评测人工智能
https://medium . com/@ alexmoltzau/evaluating-Artificial-Intelligence-5ca 22 e 9 f 9 BDB?source = friends _ link&sk = 671 d0 f 39 ee 1 fa 7 f1 dfed de 982 ed 0 a 714

79。AI 与集体行动
https://towardsdatascience . com/AI-and-Collective-Action-ce2c 15632911?source = friends _ link&sk = 19 a68a 623 FB 02 B3 ACD 04 f 8758 ff 9 ea 26

80。塞伦盖蒂的 AI 安全
https://medium . com/zero-equals-false/AI-Safety-in-the-the-Serengeti-8 a2 c 9 DCF 174 a?source = friends _ link&sk = 20 af 45 a 84 ab 409407 cd5d 9587 DC 937 af

81。英国与人工智能
https://medium . com/@ alexmoltzau/United-Kingdom-and-Artificial-Intelligence-1a 97 ad 37 AC 17?source = friends _ link&sk = CFD 651518 c8 d9 ba 43 C6 e 30300 DFB 8 CD 5

82。80 天人工智能
https://medium . com/@ alexmoltzau/80-days-of-Artificial-Intelligence-3dc 55749 d6e 6?source = friends _ link&sk = 00 CBF cc 1225 b 2 b 8 e 8 ce 88d 891d 604681

83。DeepMind 联合创始人请假
https://towardsdatascience . com/deep mind-联合创始人-请假-59730259f2a4?source = friends _ link&sk = e 25 DDB 5 E8 e9 b 928418 b8ee 077320 fc9 f

84。人工智能与可持续发展
https://medium . com/@ alexmoltzau/artificial-Intelligence-and-be-Sustainable-c 963 e 10 e 8 a 49?source = friends _ link&sk = 378 AC 80312 c6b 6894 b 288419 DD 48968

85。AI 安全与智债
https://medium . com/datadriveninvestor/AI-Safety-and-Intellectual-Debt-f3c 6380 BD 0a 8?source = friends _ link&sk = 494787995 FD 43 de 6 dbb 0 a 7 a 5 ecadb 811

86。每个计算机科学学位都应该要求开设网络安全课程吗?
https://medium . com/@ alexmoltzau/should-every-computer-science-degree-require-a-course-in-cyber-security-b79ec 4948 e 69?source = friends _ link&sk = 32 BF 4 BC 918 e 63379176 f 812d 7d 4d f1 e 0

87。埃隆·马斯克和马云在 2019 年 8 月上海世界人工智能大会上的辩论:
https://medium . com/@ alexmoltzau/elon-Musk-and-Jack-MAS-Debate-at-World-Artificial-Intelligence-Conference-in-Shanghai-2019-8-c1d 8970 fac 05?source = friends _ link&sk = 3329262 f 86 e5a 152 aa 2722 c 369 ACF 90 e

88。探索 AI 上的伙伴关系:
https://medium . com/@ alexmoltzau/exploring-the-Partnership-on-AI-9495 ff 845 a 39?source = friends _ link&sk = a3b 87883 bb 0975978 bc3a 8615 c 85 DC 73

89。人工智能与非营利组织:
https://towardsdatascience . com/artificial-Intelligence-and-non-profit-E6 cdaaae 166 f?source = friends _ link&sk = 3d 8b 684 c 139 ebb 42 f 342 BD 49334 CD 92d

90。参与式规划中的人工智能:
https://medium . com/ai-social-research/artificial-Intelligence-in-participant-Planning-5934 c 8779 e 93?source = friends _ link&sk = b 911 da 08 ce 85 f 969 b 39438 a 076 b5 BD 49

91。代码的投机执行:
https://medium . com/@ alexmoltzau/speculative-Execution-of-Code-FD 06 c 20 BBB 8?source = friends _ link&sk = 72243 ab 0 CD 7 BC 39 e 79808 af B4 a 6 a3 ea 9

92。人工智能与森林管理:
https://medium . com/odsc journal/artificial-Intelligence-and-Forest-Management-50f 480 b 56325?source = friends _ link&sk = a 50 D1 af 97210032739 f 34 c 318d 9711 f 2

93。什么是迁移学习:
https://medium . com/@ alexmoltzau/what-is-Transfer-Learning-6 ebb 03 be 77 ee?source = friends _ link&sk = fc 1 af 22d 1877 D7 f 566 f 93 D8 c8 CFB 149 e

94。在社会科学和计算机科学之间:
https://medium . com/ai-Social-research/in-Between-Social-Science-and-Computer-Science-532383 de 9 f 73?source = friends _ link&sk = c 865 dbfe 1529745 E1 cbda 964 DC 266 c 01

95。非常人造诗# 3:
https://medium . com/@ alexmoltzau/非常人造诗-4-8f 87 b 6 CFG 408?source = friends _ link&sk = 81a 062 CB 3 bad 63 F5 a55a 826282909388

96。为什么是数字孪生?
https://medium . com/@ alexmoltzau/why-digital-twin-4f 5796795 a0d?source = friends _ link&sk = 7012 f 0 EB 5 db 69d 4 e 632 b 45933 f 7 b5 DC 3

97。Google 的 AI for Social Good:
https://medium . com/@ alexmoltzau/Googles-AI-for-Social-Good-ab 88 b 5 BCF 1 b 3?source = friends _ link&sk = d6c 8 D2 fc 35760 fc 42045 b 98d 352 ce 106

98。人工智能与理解时间:
https://medium . com/swlh/artificial-Intelligence-and-understand-Time-735711777072?source = friends _ link&sk = 65e 48365 c 00041 E4 ce 368 e 139 edd 1d 8d

99。人工智能与数据公民权:
https://medium . com/@ alexmoltzau/artificial-Intelligence-and-Data-Citizenship-a 1602 BD 3b 31 c?source = friends _ link&sk = b 861805177 ac6b 06275d 926 a4 e 16 ee7a

100。人工智能 100 天(今天)

如果你对中国人感到好奇,那是因为我正在学习普通话,而且我对中国的历史、政治和文化有浓厚的兴趣。

这是第 500 天的第 100 天。我目前第 100-200 天的重点是 Python 编程。如果你喜欢这篇文章,请给我一个答复,因为我确实想提高我的写作或发现新的研究,公司和项目。

数据扩充速度提高 1000 倍

原文:https://towardsdatascience.com/1000x-faster-data-augmentation-b91bafee896c?source=collection_archive---------11-----------------------

有效学习数据扩充策略以提高神经网络性能。

Effect of Population Based Augmentation applied to images, which differs at different percentages into training.

在这篇博客文章中,我们介绍了基于人口的增强(PBA),这是一种快速有效地学习最先进的方法来增强神经网络训练数据的算法。PBA 与之前在 CIFAR 和 SVHN 上的最佳结果相匹配,但使用的 比计算 少一千倍,使研究人员和实践者能够使用单个工作站 GPU 有效地学习新的增强策略。你可以广泛使用 PBA 来提高图像识别任务的深度学习性能。

我们讨论来自我们最近论文的 PBA 结果,然后展示如何在 Tune 框架中的新数据集上轻松运行 PBA。

为什么您应该关注数据增强?

深度学习模型的最新进展在很大程度上归功于近年来收集的数据的数量和多样性。数据扩充是一种策略,使从业者能够显著增加可用于训练模型的数据的多样性,而无需实际收集新数据。裁剪、填充和水平翻转等数据扩充技术通常用于训练大型神经网络。然而,用于训练神经网络的大多数方法仅使用基本类型的增强。虽然已经对神经网络体系结构进行了深入研究,但是很少关注发现强类型的数据扩充和捕获数据不变性的数据扩充策略。

An image of the number “3” in original form and with basic augmentations applied.

最近,谷歌已经能够通过一种新的自动化数据增强技术 AutoAugment 在 CIFAR-10 等数据集上推动最先进的准确性。自动增强已经表明,先前的工作仅使用一组固定的变换,如水平翻转或填充和裁剪,会在桌面上留下潜在的性能。AutoAugment 引入了 16 种基于几何和颜色的变换,并制定了一个增强策略,该策略在特定幅度级别选择最多两种变换应用于每批数据。这些更高性能的增强策略是通过使用强化学习直接在数据上训练模型来学习的。

有什么蹊跷?

自动增强是一种非常昂贵的算法,它需要训练 15,000 个模型来收敛,以便为基于增强学习的策略生成足够的样本。样本之间没有共享计算,学习 ImageNet 增强策略需要花费 15,000 英伟达特斯拉 P100 GPU 小时,学习 CIFAR-10 策略需要花费 5,000 GPU 小时。例如,如果使用谷歌云按需 P100 GPU,发现一个 CIFAR 策略将花费大约 7500 美元,发现一个 ImageNet 策略将花费 37500 美元!因此,在新的数据集上进行训练时,一个更常见的用例是转移预先存在的已发布策略,作者显示这种方法效果相对较好。

基于人口的增长

我们的数据增强策略搜索公式,基于人口的增强(PBA ),在各种神经网络模型上达到类似的测试精度水平,同时利用三个数量级的较少计算。我们通过在 CIFAR-10 数据上训练一个小模型的几个副本来学习增强策略,这需要使用 NVIDIA Titan XP GPU 五个小时。当在较大的模型架构上使用 CIFAR-100 数据从零开始进行训练时,该策略表现出很强的性能。

相对于训练大型 CIFAR-10 网络收敛所需的几天时间,预先运行 PBA 的成本是微不足道的,并且显著提高了结果。例如,在 CIFAR-10 上训练金字塔网络模型需要在 NVIDIA V100 GPU 上超过 7 天,因此学习 PBA 策略仅增加 2%的预计算训练时间开销。对于 SVHN 来说,这个开销甚至会更低,不到 1%。

CIFAR-10 test set error between PBA, AutoAugment, and the baseline which only uses horizontal flipping, padding, and cropping, on WideResNet, Shake-Shake, and PyramidNet+ShakeDrop models. PBA is significantly better than the baseline and on-par with AutoAugment.

PBA 利用基于群体的训练算法来生成增强策略时间表,该时间表可以基于当前的训练时期进行调整。这与独立于当前纪元编号应用相同变换的固定增强策略形成对比。

这允许普通工作站用户容易地试验搜索算法和增强操作。一个有趣的用例是引入新的增强操作,可能针对特定的数据集或图像模态,并能够快速产生定制的高性能增强时间表。通过消融研究,我们发现学习的超参数和调度顺序对于良好的结果是重要的。

增强计划是如何得知的?

我们使用基于群体的训练,对 16 个小型广域网络模型进行群体训练。群体中的每个工人将学习不同的候选超参数计划。我们从零开始转移最佳执行时间表来训练更大的模型,从中我们得到我们的测试误差度量。

Overview of Population Based Training, which discovers hyperparameter schedules by training a population of neural networks. It combines random search (explore) with the copying of model weights from high performing workers (exploit). Source

在感兴趣的目标数据集上训练群体模型,从所有设置为 0 的增强超参数开始(不应用增强)。在频繁的间隔中,“利用-探索”过程通过将高绩效工作者的模型权重复制给低绩效工作者来“利用”高绩效工作者,然后通过干扰工作者的超参数来“探索”。通过这个过程,我们能够在工人之间大量共享计算,并在不同的训练区域瞄准不同的增强超参数。因此,PBA 能够避免为了达到高性能而训练数千个模型来收敛的成本。

示例和代码

我们利用 Tune 内置的 PBT 实现来简化 PBA 的使用。

我们用自定义探索函数调用 Tune 的 PBT 实现。这将创建我们的 ResNet-40–2 模型的 16 个副本,并对它们进行时间复用训练。每个副本所使用的策略时间表被保存到磁盘上,并且可以在终止后被检索以用于训练新的模型。

您可以按照以下位置的自述文件运行 PBA:https://github.com/arcelien/pba。在 Titan XP 上,只需要一个小时就可以在 SVHN 数据集上学习一个高性能的增强策略时间表。在自定义数据集上使用 PBA 也很容易:只需定义一个新的数据加载器,其他一切就都就绪了。

非常感谢 Eric Liang、Richard Liaw、Daniel Rothchild、Ashwinee Panda、Aniruddha Nrusimha、Daniel、Joseph Gonzalez 和 Ion 在撰写本文时提供的有用反馈。请随时在 Github 上与我们联系!

[1]何大一,梁,杨,阿比尔,陈曦,,《基于人口的增强:增强政策时间表的高效学习》 (2019),机器学习国际会议(ICML) 2019

没有 Python 多重处理,并行 Python 速度快 10 倍

原文:https://towardsdatascience.com/10x-faster-parallel-python-without-python-multiprocessing-e5017c93cce1?source=collection_archive---------0-----------------------

更快的 Python,无需重构代码

虽然 Python 的多重处理库已经成功地用于广泛的应用程序,但在这篇博客文章中,我们发现它在几个重要的应用程序类别中表现不佳,包括数值数据处理、有状态计算和带有昂贵初始化的计算。有两个主要原因:

  • 对数字数据的低效处理。
  • 缺少有状态计算的抽象(例如,无法在独立的“任务”之间共享变量)。

Ray 是一个快速、简单的框架,用于构建和运行解决这些问题的分布式应用。关于一些基本概念的介绍,请看这篇博文。Ray 利用 Apache Arrow 提供高效的数据处理,并为分布式计算提供 task 和 actor 抽象。

这篇博客文章对三个不容易用 Python 多处理表达的工作负载进行了基准测试,并比较了 Ray 、Python 多处理和串行 Python 代码。请注意务必始终与优化的单线程代码进行比较。

在这些基准测试中,比串行 Python快 10–30x, 比多处理快 5–25x,比大型机器上的这两个快 5–15x**。****

On a machine with 48 physical cores, Ray is 9x faster than Python multiprocessing and 28x faster than single-threaded Python. Error bars are depicted, but in some cases are too small to see. Code for reproducing these numbers is available below. The workload is scaled to the number of cores, so more work is done on more cores (which is why serial Python takes longer on more cores).

基准测试使用 m5 实例类型在 EC2 上运行(m5.large 用于 1 个物理内核,m5.24xlarge 用于 48 个物理内核)。运行所有基准测试的代码可从这里获得。缩写片段包括在这篇文章中。主要区别在于,完整的基准测试包括 1)计时和打印代码,2)预热 Ray 对象存储的代码,以及 3)使基准测试适应较小机器的代码。

基准 1:数字数据

许多机器学习、科学计算和数据分析工作负载大量使用大型数据阵列。例如,一个数组可能代表一个大型图像或数据集,应用程序可能希望有多个任务来分析该图像。高效处理数字数据至关重要。

下面 for 循环的每一遍使用 Ray 花费0.84 秒,使用 Python 多处理花费7.5 秒,使用串行 Python 花费24 秒(在 48 个物理核上)。这种性能差距解释了为什么可以在 Ray 上构建像 Modin 这样的库,而不能在其他库上构建。

用射线看代码如下。

Code for a toy image processing example using Ray.

通过调用ray.put(image),大数组被存储在共享内存中,并且可以被所有工作进程访问,而无需创建副本。这不仅适用于数组,也适用于包含数组的对象(如数组列表)。

当工人执行f任务时,结果再次存储在共享内存中。然后当脚本调用ray.get([...])时,它创建由共享内存支持的 numpy 数组,而不必反序列化或复制值。

这些优化之所以成为可能,是因为 Ray 使用了 Apache Arrow 作为底层数据布局和序列化格式,以及 Plasma 共享内存对象存储。

使用 Python 多重处理的代码如下所示。

Code for a toy image processing example using multiprocessing.

这里的区别是 Python 多处理在进程间传递大型对象时使用 pickle 来序列化它们。这种方法要求每个进程创建自己的数据副本,这增加了大量的内存使用和昂贵的反序列化开销,Ray 通过使用 Apache Arrow 数据布局和零副本序列化以及等离子存储来避免这种情况。

基准 2:有状态计算

需要在许多小工作单元之间共享大量“状态”的工作负载是对 Python 多处理提出挑战的另一类工作负载。这种模式非常常见,我在这里用一个玩具流处理应用程序来说明它。

On a machine with 48 physical cores, Ray is 6x faster than Python multiprocessing and 17x faster than single-threaded Python. Python multiprocessing doesn’t outperform single-threaded Python on fewer than 24 cores. The workload is scaled to the number of cores, so more work is done on more cores (which is why serial Python takes longer on more cores).

状态通常封装在 Python 类中, Ray 提供了一个 actor 抽象,这样类就可以在并行和分布式环境中使用。相比之下,Python 多处理并没有提供并行化 Python 类的自然方法,因此用户经常需要在map调用之间传递相关状态。这种策略在实践中可能很难实现(许多 Python 变量不容易序列化),而且当它起作用时可能会很慢。

下面是一个玩具示例,它使用并行任务一次处理一个文档,提取每个单词的前缀,并在最后返回最常见的前缀。前缀计数存储在 actor 状态中,并根据不同的任务而变化。

这个例子用 Ray 的 3.2s ,Python 多处理的 21s ,串行 Python 的 54s (在 48 个物理核上)。

射线版本如下图。

Code for a toy stream processing example using Ray.

Ray 在这里表现得很好,因为 Ray 的抽象符合当前的问题。这个应用程序需要一种在分布式环境中封装和改变状态的方法,而 actors 符合这个要求。

多重处理版本如下。

Code for a toy stream processing example using multiprocessing.

这里的挑战是pool.map执行无状态函数,这意味着在一个pool.map调用中产生的任何变量,如果您想在另一个pool.map调用中使用,都需要从第一个调用中返回,并传递给第二个调用。对于小对象来说,这种方法是可以接受的,但是当需要共享大的中间结果时,传递它们的成本是令人望而却步的(注意,如果变量是在线程之间共享的,这就不正确了,但是因为它们是跨进程边界共享的,所以必须使用像 pickle 这样的库将变量序列化为一个字节串)。

因为它必须传递如此多的状态,多处理版本看起来非常笨拙,最终只实现了比串行 Python 小的加速。实际上,您不会编写这样的代码,因为您不会使用 Python 多重处理进行流处理。相反,您可能会使用专用的流处理框架。这个例子表明 Ray 非常适合构建这样的框架或应用程序。

有一点需要注意,使用 Python 多处理有很多方法。在这个例子中,我们与Pool.map进行比较,因为它给出了最接近的 API 比较。在这个例子中,通过启动不同的进程并在它们之间设置多个多重处理队列,应该可以获得更好的性能,但是这导致了复杂而脆弱的设计。

基准 3:昂贵的初始化

与前面的例子相反,许多并行计算不一定需要在任务之间共享中间计算,但无论如何都会从中受益。当状态初始化代价很高时,甚至无状态计算也可以从共享状态中受益。

下面是一个例子,我们想从磁盘加载一个保存的神经网络,并用它来并行分类一堆图像。

On a machine with 48 physical cores, Ray is 25x faster than Python multiprocessing and 13x faster than single-threaded Python. Python multiprocessing doesn’t outperform single-threaded Python in this example. Error bars are depicted, but in some cases are too small to see. The workload is scaled to the number of cores, so more work is done on more cores. In this benchmark, the “serial” Python code actually uses multiple threads through TensorFlow. The variability of the Python multiprocessing code comes from the variability of repeatedly loading the model from disk, which the other approaches don’t need to do.

这个例子用 Ray 的 5s ,Python 多处理的 126s ,串行 Python 的 64s (在 48 个物理核上)。在这种情况下,串行 Python 版本使用许多内核(通过 TensorFlow)来并行化计算,因此它实际上不是单线程的。

假设我们已经通过运行以下代码创建了模型。

Code for saving a neural network model to disk.

现在,我们希望加载模型,并使用它来分类一堆图像。我们分批进行,因为在应用程序中,图像可能不会同时可用,图像分类可能需要与数据加载并行进行。

射线版本如下。

Code for a toy classification example using Ray.

加载模型非常慢,我们只想做一次。Ray 版本通过在 actor 的构造函数中加载一次模型来分摊成本。如果模型需要放在 GPU 上,那么初始化会更加昂贵。

多处理版本较慢,因为它需要在每次 map 调用中重新加载模型,因为映射的函数被假定为无状态的。

多重处理版本如下。请注意,在某些情况下,可以使用initializermultiprocessing.Pool的参数来实现这一点。然而,这限于这样的设置,其中初始化对于每个过程是相同的,并且不允许不同的过程执行不同的设置功能(例如,加载不同的神经网络模型),并且不允许不同的任务针对不同的工作者。

Code for a toy classification example using multiprocessing.

我们在所有这些例子中看到的是,Ray 的性能不仅仅来自于它的性能优化,还来自于拥有适合手头任务的抽象。有状态计算对许多应用程序都很重要,将有状态计算强制转换成无状态抽象是有代价的。

运行基准测试

在运行这些基准测试之前,您需要安装以下软件。

**pip install numpy psutil ray scipy tensorflow**

然后上面所有的数字都可以通过运行这些脚本来重现。

如果你安装psutil有困难,那么尝试使用 Anaconda Python 。

最初的性能指标评测是在 EC2 上运行的,使用的是 m5 实例类型(1 个物理内核使用 m5.large,48 个物理内核使用 m5.24xlarge)。

为了使用正确的配置在 AWS 或 GCP 上启动一个实例,您可以使用射线集群启动器并运行以下命令。

**ray up config.yaml**

这里提供的就是一个config.yaml的例子(用于启动一个 m5.4x 大型实例)。

关于雷的更多信息

虽然这篇博客文章关注的是 Ray 和 Python 多处理之间的基准测试,但是苹果之间的比较是具有挑战性的,因为这些库不是非常相似。差异包括以下几点。

  • Ray 是为可伸缩性而设计的,可以在笔记本电脑和集群上运行相同的代码(多处理只能在单台机器上运行)。
  • Ray 工作负载会自动从机器和进程故障中恢复。
  • Ray 是以一种与语言无关的方式设计的,并且初步支持 Java 。

更多相关链接在下面。

  • GitHub 上的代码库。
  • 射线文档。
  • 在雷论坛上提问。
  • Ray 包括用于缩放强化学习、缩放超参数调整、缩放模型服务和缩放数据处理的库。
  • Ray 包括一个集群发射器用于在 AWS 和 GCP 上发射集群。
  • 雷网页。

数据科学家应该熟悉的 11 个评估指标——来自高级 Kagglers 新书的教训

原文:https://towardsdatascience.com/11-evaluation-metrics-data-scientists-should-be-familiar-with-lessons-from-a-high-rank-kagglers-8596f75e58a7?source=collection_archive---------8-----------------------

《赢得 Kaggle 的数据分析技术》一书

是关于损失函数的,对吗?不,不是的。

Photo by Andreas Wagner on Unsplash

这是一本新书“赢得 Kaggle 的数据分析技术”中介绍的技巧,由三位高级 Kaggle 作者撰写(不包括我自己,因此这不是个人推广!😃 )

这本书的完整目录见我的其他帖子。

目录:

评估指标与损失函数

回归任务中使用的评估指标

#1 — RMSE(均方根误差)

#2 — RMSLE(均方根对数误差)

#3 —平均绝对误差

#4 — R 平方(R )

用于二进制分类任务中 0/1 预测的评估指标

#5 —准确度和误差率

# 6——精度和召回

#7 — F1 分数和 Fbeta 分数

#8 — MCC(马修斯相关系数)

#9 —平衡精度

#10 —对数损失(或交叉熵或负对数似然)

#11 — AUCROC(受试者工作特性曲线下面积)

评估指标与损失函数

评估指标,这个帖子的一个主题,对于 ML 初学者来说,是一个与另一个相关但独立的概念损失函数有些混淆的概念。它们在某种意义上是相似的,当我们足够幸运时,它们可能是相同的,但这不会每次都发生。

评估度量是通过建模过程“我们想要”最小化或最大化的度量,而损失函数是通过模型训练“模型将”最小化的度量。

Photo by AbsolutVision on Unsplash

举一个简单逻辑回归的例子:

  • 损失函数是模型将在训练中最小化的量。它也被称为成本函数或目标函数。逻辑回归的非常基本的版本使用负对数似然作为损失函数。搜索模型的参数以最小化负对数似然性是在训练模型时完成的事情。
  • 评估指标是我们希望模型最大化的指标。它独立于模型培训流程,并且理想情况下,评估指标应该反映我们的业务需求。根据业务应用,我们可能希望最大化 AUC ,或者我们可能关心召回有多好。

损失函数与模型紧密相关,通常模型具有损失函数候选的限制性列表,例如,逻辑回归的[ 负对数似然、带惩罚项的负对数似然][],因为损失函数的选择是模型算法创建者核心决定的一部分。

另一方面,评估指标可以是我们想要设置的任何值。最终,我们可以将“1”用于任何模型,尽管使用通用的“1”作为评估指标从来没有意义。评估指标有多高通常由训练中未使用的数据来衡量,如折叠外数据或测试数据。

评估分数广泛用于超参数调整,但对于更有经验的数据科学人员来说,理解损失函数和评估度量的区别的最有用的案例之一是提前停止。早期停止是一种通常用于确定何时停止训练的技术,以避免在增强类型的模型或神经网络类型的模型中过拟合。

[提前停止]

当模型基于损失函数的最小化来调整参数时,检查一次迭代对评估度量的改善程度,如果没有更多改善,则停止学习。

在 Kaggle 中,比赛参与者按“排行榜分数”进行排名。排行榜分数有两种类型,公开和私人,但这是另一个故事。排行榜分数可以归类为竞赛主持人为满足其业务目标或需求而设定的评估指标。

那么,了解评价得分,以及如何通过模型训练使其最大化,应该是赢得 Kaggle 比赛的一条道路。

所以,现在你明白了评价指标和损失函数的区别。接下来,我们将进一步了解常见的评估指标及其属性。

Photo by Tierra Mallorca on Unsplash

回归任务中使用的评估指标

#1 — RMSE(均方根误差)

(用于 Kaggle 比赛【Elo 商家类别推荐】 )

Formula of RMSE

  • 当假设误差是正态分布时,RMSE 有相当于最大似然法的解。因此,当 y 的分布在一些基础结构周围是正态分布时是有利的。
  • RMSE 对异常值很敏感。因此,预先裁剪或移除异常值是很重要的。

#2 — RMSLE(均方根对数误差)

(用于 Kaggle 竞赛中的 招募餐厅访客预测)

Formula of RMSLE

  • 当 y 具有长尾分布,或者我们对真实值和预测值的比值感兴趣时,使用 RMSLE。
  • 当 y 为零时,增加 1 以避免发散。

#3 —平均绝对误差

(用于 Kaggle 竞赛中) Allstate 索赔严重程度)

Formula of MAE

  • 与 RMSE 相比,对异常值稳健。
  • 在真 y =预测 y 处不是二阶可微的,因此 xgboost 等一些算法不允许 MAE 作为损失函数。
  • 代替 MAE,诸如“公平函数”或“伪 Huber 函数”的近似函数可能是可用的。

Fair Function

Pseudo-Huber Function

另见这张由 Ioannis Dassios 发布的 MAE 与 Fair 函数和 Pseudo-Huber 函数的对比图。

#4 — R 平方(R)

(用于 Kaggle 比赛】 奔驰更环保制造)

Formula of R-Squared

  • 0≤R ≤1(通常情况下,但在一些最坏的情况下,您会看到负值),R 越高越好,这意味着预测更接近数据。
  • 分母不依赖于预测,并且一旦设定数据就固定不变。因此,最大化 R 等价于最小化 RMSE

Photo by Riccardo Pallaoro on Unsplash

二元分类任务中 0/1 预测的评价指标

#5 —精确度和误差率

(用于 Kaggle 竞赛中的 文字规范化挑战——英语)

Formula of Accuracy and Error Rate

在这里,两个字母的字母表当然来自混淆矩阵。

Confusion Matrix

  • NG 用于不平衡数据因为预测一切为正或为负的非常糟糕的模型很容易破解不平衡数据中的高精度。
  • 对于不平衡数据,使用 F1-score、Fbeta-score、MCC 或稍后介绍的平衡精确度

#6 —精确度和召回率

Formula of precision and recall

  • 精确度和召回率分别表示混淆矩阵中第一水平行或第一垂直列上 TP 的比例。
  • 介于 0 和 1 之间,越高越好。
  • 当截止点(=根据概率确定预测是 0 还是 1 的阈值)移动时,精确度和召回率会向相反的方向移动。
  • 与正负互换是不对称的,这意味着当我们改变哪个称之为“正”(无论 y=1 还是 0)时,精度和召回率都会改变。

#7 — F1 分数和 Fbeta 分数

(用于 Kaggle 比赛中) Quora 言不由衷问题分类)

Formula of F1-Score and Fbeta-Score

  • 它被称为精确度和召回率的“调和平均值”。
  • 介于 0 和 1 之间,越高越好。
  • Fbeta-score 可以改变查全率和查准率之间的平衡,当 β < 1 加权到查准率,β > 1 加权到查全率。当我们更喜欢一个而不是另一个时,可能会有用,就像医学诊断通常更喜欢假阳性而不是假阴性,因为前者只会带来额外的成本,而后者会带来晚期治疗并可能导致死亡。
  • 同样,这些对于正负互换来说是不对称的,就像精度和召回也不是一样。

#8 — MCC(马修斯相关系数)

(用于 Kaggle 竞赛的 博世生产线性能)

Formula of MCC

  • 取-1 和 1 之间的值,越高越好。0 表示预测等同于随机。
  • 最后,这是对称正反互换!

#9 —平衡的精度

平衡精度是可用于二元分类和多类分类的度量。

Formula of balanced accuracy

其中,M:类别数,n_m:数据大小属于类别 M,r_m:准确预测属于类别 M 的数据数。

这里,如果问题是二进制分类,

Balanced accuracy when binary classification

  • 适用于多类分类和二类分类。
  • 介于 0 和 1 之间的值,越高越好。
  • 对较小类别的准确预测赋予较高的权重,因此适用于不平衡数据

Photo by Denys Nevozhai on Unsplash

二元分类任务中概率预测的评价指标

#10 —对数损失(或交叉熵或负对数可能性)

(用于 Kaggle 比赛中的 Quora 问题对)

Formula of logloss

  • 分类中常见的嫌疑人。
  • 这是损失并且越高越糟糕。
  • 当 p_i 较低而 y_i=1 时,意味着不是好的概率预测,或者相反,logloss 变高。
  • 在许多模型的损失函数中也很常见。

#11 — AUCROC(受试者操作特征曲线下的面积)

(用于 Kaggle 竞赛中) 家庭信用违约风险)

这通常也称为 AUC,但为了避免与 AUCPR(精确召回曲线下面积)混淆,我坚持使用 AUCROC。

Illustration of AUCROC and ROC

  • 从 0 到 1 的值。0.5 表示预测相当于随机的。
  • 分类中的另一个常见疑点,但只针对二元分类而非多类分类。
  • 与基尼系数的关系如下。AUCROC 的最大化相当于基尼系数的最大化。

Relation with Gini and AUCROC

  • 可以用以下形式等价地表示:

Alternative representation of AUCROC

  • 因此,只有预测概率的顺序与有关,这意味着当四个记录的概率为[0.1,0.3,0.7,0.9]或[0.01,0.02,0.3,0.99]时,AUCROC 是相同的,只要顺序保持不变。
  • 与原始定义相比,这种替代表示更容易知道模型预测改进对分数改进有多大贡献。
  • 在不平衡数据的情况下(例如,正数据是小类到负数据),正小类数据的概率始终很高对于 AUCROC 很重要,而负大类数据的概率对噪声不敏感。

ROC curve and AUCROC visualized by code

Photo by Kelly Sikkema on Unsplash

结论

在 Kaggle 内部和外部,评估指标有许多可能的选择。每个评估指标都有它们的属性,当我们优化它们或者选择正确的评估指标时,理解它们的行为是很重要的。

在另一篇帖子中,我将讨论我们在多类分类和推荐中使用的评估指标,我们还将找到优化评估指标的技巧,同时通过最小化损失函数来调整模型。

生产质量数据科学代码的 12 个步骤

原文:https://towardsdatascience.com/12-steps-to-production-quality-data-science-code-35ae2f868003?source=collection_archive---------8-----------------------

有一个呆伯特漫画,呆伯特告诉他的老板,他不能接管一个同事的软件项目,除非他花一周时间唱衰这个同事的现有代码。如果你曾经接手维护过别人的代码,你会立刻发现其中的真相。

没有人喜欢接手维护或处理别人的代码。在最好的情况下,你会面临几个小时或几天的时间试图弄清楚前一个程序员在做某些决定时在想什么——即使代码被很好地注释了。

在最坏的情况下,你最终会盯着糟糕的代码看,以至于你开始考虑换一份职业来逃避它。

有一次,我从一位最近退休的同事那里继承了一段 40 多页的 SAS 代码,其中有太多的死角、不必要的变量,并且注释掉了一些垃圾,当我清理完之后,最终的代码还不到两页长。五年过去了,我仍然没有完全从那次经历中恢复过来。

我怀疑编写没有人会抱怨的代码是不可能的。然而,有可能将代码中人们可以抱怨的事情的数量保持在最少。

数据科学家甚至需要写好代码吗?

如果你的代码要投入生产,那么它应该是“生产质量”的。

进入“生产”的含义因工作而异,但是为了本文的目的,让我们将生产代码定义为一项工作的最终版本,它将使用真实数据在生产服务器上运行,或者作为一项分析的证据。

根据这一定义,以下是生产代码的所有示例:

  • 包含在 Jupyter 笔记本最终版本中的代码详细描述了一项分析;
  • 用于生成自动化月度报告或执行自动化数据提取/争论的代码;
  • 用于运行机器学习管道或位于管道顶部的应用程序的最终版本的代码;和
  • 用于以编程语言(如 Python 或 r)创建包的代码。

这些都是数据科学家经常需要执行的任务的示例,尽管大多数数据科学家并不参与软件工程,并且都是数据科学家生成的代码通常需要在未来共享和维护的情况。

因此,代码的最高质量是非常重要的。即“生产-质量”。

生产质量代码应该是:

  • 可读;
  • 没有错误;
  • 对异常具有鲁棒性;
  • 高效;
  • 有据可查;和
  • 可复制。

如果您想查看生产质量代码的示例,请查看您最喜欢的 Python 包的 GitHub 存储库(例如, scikit-learn 或 NumPy )。但是,如何让您的代码达到产品质量标准呢?

下面是我在开发自己的 Python 包 mlrose 时使用的 12 个步骤。

第一步:确定你想要达到的目标

在你写一行代码之前,先弄清楚为什么你要写这些代码。你希望实现什么?也就是你的代码的目标是什么?

如果你正在进行一项分析,你试图回答什么研究问题?

如果你正在建立一个机器学习模型,你希望产生什么样的输出,一旦你得到它们,你打算用它们做什么?

如果你正在为一种编程语言编写一个包,你希望这个包有什么功能?

一旦你得到了这个问题的答案,让你可能与之合作的任何客户或利益相关者来运行它,以确保每个人都在同一页上,并且你不会花费你生命中的几天/几周/几个月来生产实际上不想要的东西。

当每个人(或者至少是大多数人)都同意的时候,就是开始的时候了。

步骤 2:构建一个最小可行的产品

编写一段代码,实现您在步骤 1 中确定的目标。不要管它长什么样,也不要管它有没有效率。你的目标只是产生一段工作代码,做你想让它做的事情。您将在这个过程的后续步骤中提高代码的质量。

如果在实现第一步目标的过程中有任何问题,在你对代码投入太多时间之前,这是你想要识别它们(并解决它们)的地方。

第三步:减少重复

将 DRY(不要重复你自己)软件开发原则应用到你的代码中。

DRY 原则的目标是最大限度地减少代码中的重复,以使代码更具可读性,更易于维护,并降低出错的风险。

实践中应用 DRY 原理的最常见方式是通过函数的创建。如果您不止一次地编写本质上相同的代码段,请将其转换为一个或多个函数(理想情况下,每个函数应该只做一件事)。

例如,应用 DRY 原则,您可以重写:

import math 
area2 = math.pi*2**2 
area5 = math.pi*5**2 
area7 = math.pi*7**2 
area10 = math.pi*10**2

作为:

import math def circle_area(radius): 
    return math.pi*radius**2 area2 = circle_area(2) 
area5 = circle_area(5) 
area7 = circle_area(7) 
area10 = circle_area(10)

函数名和变量名可以重复多次。这是你不想重复的功能背后的逻辑。

步骤 4:创建单元测试

对于代码中的每个函数,编写一个或多个测试,以确保它在一系列不同的环境下做它应该做的事情。这样的测试被称为“单元测试”,它们可以像你希望的那样简单或复杂。

当编写我自己的单元测试时,我通常会想出足够简单的例子,我可以用手/计算器/Microsoft Excel 确定函数输出,然后围绕它们编写单元测试。

例如,对于步骤 3 中给出的 circle_area()函数,这可能涉及检查 circle_area(2)实际上是否输出 12.56637,以及 circle_area(0)是否输出 0。

在 Python 中,可以使用 unittest 包来自动化这些测试。

若要通过 unittest 包运行单元测试,请创建一个类,并将单元测试编写为位于该类中的方法(即函数)。例如,要测试 circle_area()函数,您可以编写:

import unittest class TestFunctions(unittest.TestCase): 
    def test_circle_area2(self): 
        assert abs(circle_area(2) - 12.56637) < 0.0001 def test_circle_area0(self): 
        assert circle_area(0) == 0 unittest.main(argv=[''], verbosity=2, exit=False)

在这个例子中,我将我的测试类命名为“TestFunctions”,但是如果这个类有 unittest,您可以随意命名它。TestCase 作为其父类。

在这个类中,我创建了两个单元测试,一个测试 circle_area()对半径 2 的作用,另一个测试半径 0 的作用。这些函数的名称并不重要,除了它们必须以 test_ 开头并带有参数 self。

代码的最后一行运行测试。

假设所有的测试都通过了,您的输出看起来会像这样,每一个已经通过的测试的顶行上都有一个点。

..
------------------------------------------------------------------
Ran 2 tests in 0.000sOK

或者,如果您的一个测试失败了,那么输出的顶行将为每个失败的测试包含一个“F ”,并且将提供进一步的输出,给出失败的细节。

F. ====================================================================FAIL: test_circle_area0 (__main__.TestFunctions) 
--------------------------------------------------------------------Traceback (most recent call last): 
    File "D:/Documents/Unit_Test_Examples.py", line 13, in test_circle_area0 
    assert circle_area(0) == 1 
AssertionError --------------------------------------------------------------------Ran 2 tests in 0.000s FAILED (failures=1)

如果您使用 Python 脚本编写代码(即。py 文件),理想情况下,您应该将您的单元测试放在一个单独的测试文件中,将它们与您的主代码分开。但是,如果您使用 Jupyter 笔记本,您可以将单元测试放在笔记本的最后一个单元格中。

一旦你创建了你的单元测试并让它们工作,每当你对你的代码做任何(显著的)改变时,重新运行它们是值得的。

第五步:处理异常

当你写一个函数的时候,你通常期望函数参数只取某一类型或某一范围内的值。例如,在前面描述的 circle_area()函数中,隐含地假设参数输入将是非负整数或浮点数。

但是如果有人试图使用不属于预期类型或者不在预期范围内的参数值来运行函数,该怎么办呢?

最好的情况是,您的代码会出错,但是错误消息可能不清楚。

最坏的情况是,您的代码将运行并产生一个无意义的结果,您当时可能没有意识到这是无意义的,从而导致后续的流动问题。

为了解决这个问题,您可以在函数中添加异常测试,以检查参数输入是否符合预期,如果不符合,则输出定制的错误消息。

例如,我们可以扩展 circle_area()函数,以包含异常测试来验证 radius 的值是整数还是浮点数(第一个 if 语句)以及非负数(第二个 if 语句)。

def circle_area(radius): 
    if not isinstance(radius, int) and not isinstance(radius, float): 
        raise Exception("""radius must be an integer or float.""") if radius < 0: 
        raise Exception("""radius must be non-negative.""")    return math.pi*radius**2

如果某个参数值未通过异常测试,将打印异常消息(作为 exception()的参数给出),代码将停止。

第六步:最大化效率

仅仅拥有可读且没有错误的代码是不够的(尽管,这是一个好的开始),您还希望它在时间和空间上都是高效的。毕竟,如果你的代码运行 27 年都没有错误,或者占用的空间超过了你电脑的内存,这真的有关系吗?

因此,有必要检查一下你的代码,看看有没有什么方法可以让它运行得更快或者占用更少的空间。

就 Python 而言,已经有很多关于性能优化的文章。然而,根据我的经验,简单地检查代码并使用 NumPy 对任何 for 循环进行矢量化,就足以显著提高代码的时间效率。这是因为很多 NumPy 是用 C 编写的,而且 C 是一种比 Python 快得多的语言。

例如,考虑对包含十亿个 1 的向量求和的问题,我们尝试用两种不同的方法来解决这个问题,第一种方法使用 For 循环,第二种方法使用 NumPy sum()函数。

import numpy as np 
import time x = np.ones(1000000000) # For loop version 
t0 = time.time() total1 = 0 for i in range(len(x)): 
    total1 += x[i] t1 = time.time()

print('For loop run time:', t1 - t0, 'seconds') # Numpy version 
t2 = time.time() total2 = np.sum(x) t3 = time.time() print('Numpy run time:', t3 - t2, 'seconds')

使用 for 循环,这个问题需要 275 秒(超过 4 . 5 分钟)才能解决。然而,使用 NumPy sum 函数,运行时间减少到 15.7 秒。也就是说,for 循环花费的时间是 NumPy 求和的 17.5 倍。

For loop run time: 275.49414443969727 seconds 
Numpy run time: 15.738749027252197 seconds

第七步:让名字有意义

你有没有读过这样的代码,其中每个变量都有一个类似“x”或“temp”的名字(更糟糕的是,变量名在整个代码中被重新定义和重用,只是为了最大限度地混淆)?

我见过这样的代码,我被迫猜测变量的定义,然后保留这些定义的手写列表,以便遵循代码。这并没有说明代码的可读性。

您可以通过检查您的代码并用更具描述性的替代名称替换任何无意义的变量或函数名称来解决这个问题。

例如,您可以重写:

def area(l, w):
    return l*w

作为:

def rectangle_area(length, width): 
    return length*width

第八步:对照风格指南进行检查

编码风格指南是一个文档,它列出了特定编程语言的所有编码约定和最佳实践。在 Python 中,风格指南是PEP 8——Python 代码风格指南,其中包括以下建议:

  • "将所有行限制在 79 个字符以内;"
  • 函数名应该小写,单词之间用下划线分隔,以提高可读性和
  • “谨慎使用行内注释……行内注释是不必要的,事实上,如果它们陈述的是显而易见的事情,会分散注意力。”

PEP 8 是一个 27 页的文档,所以确保你的代码符合每一项可能是一件苦差事。幸运的是,有一些工具可以帮助你做到这一点。

如果您将代码编写为 Python 脚本,flake8 包将检查是否符合 PEP 8。

安装这个包(使用 pip install flake8)后,只需导航到包含您要检查的代码的文件夹,并在命令提示符下运行以下命令:

flake8 filename.py

输出将告诉您代码不符合的确切位置。

例如,此输出告诉我们 Python 脚本 Production_Examples.py 包含 8 个不合规的实例。第一个实例位于第 2 行第 1 列,其中包“numpy”已导入但未使用:

Production_Examples.py:2:1: F401 'numpy as np' imported but unused Production_Examples.py:66:1: E302 expected 2 blank lines, found 1 Production_Examples.py:76:14: E261 at least two spaces before inline comment 
Production_Examples.py:76:15: E262 inline comment should start with '# ' 
Production_Examples.py:79:1: E302 expected 2 blank lines, found 1 Production_Examples.py:86:1: W293 blank line contains whitespace Production_Examples.py:93:1: W293 blank line contains whitespace Production_Examples.py:96:1: E305 expected 2 blank lines after class or function definition, found 1

在 Jupyter 笔记本中,有几个扩展可以确保符合 PEP 8,包括 jupyterlab-flake8 和 jupyter-autopep8 。

第九步:确保再现性

再现性意味着不同的东西,这取决于你试图执行的任务。

如果你开发的代码是定期由他人运行的(例如,定期报告或机器学习管道背后的代码),那么可再现性就意味着建立一个你可以维护和他人可以利用的代码的主副本。例如,为您的项目创建一个 GitHub 存储库。

但是,如果您正在执行一项分析,那么您希望他人能够复制的不仅仅是您的分析背后的代码,还有您的分析的确切结果,这样您基于该分析做出的任何声明都可以得到独立的验证。

许多统计和机器学习过程涉及某种程度的随机化。例如,将数据集随机分成训练和测试子集,或者许多机器学习算法的随机优化方面。

这意味着每次重新运行这些流程时,即使输入数据完全相同,也会产生稍微不同的输出。

通过在程序开始时设置随机种子(例如,在 Python 中可以使用 NumPy np.random.seed()函数),或者在任何涉及随机化的算法中作为参数(例如,许多 Python scikit-learn 函数为此包含可选的 random_state 参数),可以避免这种情况。

这将保证,只要程序的输入保持不变,输出将总是相同的。

步骤 10:添加注释和文档

为所有函数、类和方法编写 docstrings,并添加块注释或行内注释(即以#开头的注释),以澄清代码中用途不明显的部分。

大多数程序员已经熟悉并使用了块注释和行内注释,如下例所示:

# This is a block comment 
def test_function(x): y = x + 5 # This is an inline comment 
    return y

但是,docstrings 不太常用。

docstring 是一个函数(或类或方法)的概要,用三重引号括起来。它通常包括以下内容(尽管最后两项是可选的):

  • 对该功能的简要描述(一行);
  • 每个函数参数的描述(包括它们的预期类型和任何默认值);和
  • 每个函数输出的描述(包括类型)。

例如,我们的 circle_area()函数的 docstring(为了便于说明,我对它做了一些修改)可能如下所示:

def circle_area(radius=1): 
    """Calculate the area of a circle with a given radius. 
    Parameters 
    ---------- 
    radius: float, default: 1 
        The radius of the circle. Must be non-negative.     Returns 
    ------- 
    area: float 
        The area of the circle. 
    """ 
    area = math.pi*radius**2     return area

这个 docstring 示例中使用的格式约定是特意选择来与 Python sphinx 包集成的。

Sphinx 通常用于创建 Python 包的文档,并且已经用于创建许多流行包的文档,包括 NumPy、NLTK 和 scikit-learn),并且可以将文档字符串转换成各种格式的文档,包括 HTML、pdf 和 ePub。

下面是一个使用 sphinx 创建的文档示例:

它还与 GitHub 和 ReadtheDocs (一个文档托管平台)集成,这样每当您的代码更新被推送到 GitHub 时,您的文档就会自动重建,确保您的文档始终保持最新。

步骤 11:请求代码评审

如果你和其他程序员在一个环境中工作,那么在部署你的工作之前,你应该总是要求进行代码审查。除了能够发现代码中可能存在的任何错误之外,您还可以就各种问题向审阅者寻求反馈,包括:

  • 你的文档有多清晰;
  • 单元测试的覆盖率;
  • 他们是否能看到你可能忽略的效率提升空间;和
  • 你的代码是否达到了你最初的目标。

但是,如果你还处于职业生涯的早期,还没有在编程团队中工作,该怎么办呢?

您可以采用一些替代方法来审查您的代码,包括:

  • 与处于类似或更高级编程生涯阶段的朋友分享你的代码,并要求他们评审你的代码(潜在地,作为交换,你在将来的某个时间评审他们的代码);
  • 利用在线论坛,用户可以从其他用户那里请求代码反馈,包括代码评审栈交换和评审子条目: /r/codereview/ 、 /r/reviewmycode/ 和/r/critiquemycode/;或者
  • 如果你真的绝望了,没有其他选择,把你的代码放在一边一段时间(比如一个月),然后当你有时间忘记更好的细节时再回来,进行你自己的回顾。

这一步是开发过程中最重要的部分之一,因为通过代码评审,你将学会成为一名更好的程序员。

步骤 12:部署

一旦您完成了前面的所有步骤,您的代码就可以部署了。这并不意味着你的代码不会再次改变。这仅仅意味着你创作了一部作品,它的水准足以让你自豪。

事实上,一旦人们开始使用你的代码,或者它的输出,几乎可以肯定他们会带来你从未想过的改进,或者检测出你完全忽略的错误。

预计到这一点,现在安排一段时间到未来的一到六个月,在那里您将再次回顾您的代码,并整合您在部署后不可避免地收到的任何反馈。

一位名叫约翰·f·伍兹的智者曾经说过:

“总是把维护你的代码的人当成一个知道你住在哪里的暴力精神病患者来编码。”

我之前从其他不知道如何编写产品级代码的程序员那里继承了代码,对此我完全同意。但是,即使你的生活不依赖于你的代码质量,产生高质量的代码也应该是一件值得骄傲的事情。

就像你不会把自己写的充满拼写或语法错误的报告交给老板或同事一样,你也不应该分享一段不符合某些最低编码标准的代码。

这就是成为一名专业数据科学家的意义所在。

Genevieve Hayes 博士是数据科学家、教育家和人工智能及分析专家,拥有Genevieve Hayes Consulting。你可以在LinkedIn或者Twitter上关注她。她还是 价值驱动数据科学 的主持人,这是一个每月两次的播客,面向希望最大化其数据和数据团队价值的企业。

想要发掘企业数据的价值,但不知道从哪里开始?**下载免费的数据科学项目发现指南。

我作为机器学习工程师的第一年学到的 12 件事

原文:https://towardsdatascience.com/12-things-i-learned-during-my-first-year-as-a-machine-learning-engineer-2991573a9195?source=collection_archive---------0-----------------------

成为你自己最大的怀疑者,尝试不可行的事情的价值,以及为什么沟通问题比技术问题更难。

The workstation, the home office and the art studio. Photo by the author.

机器学习和数据科学都是广义的术语。一位数据科学家的工作可能与另一位大相径庭。机器学习工程师也是如此。常见的是利用过去(数据)了解或预测(建立模型)未来。

为了将下面的观点放在上下文中,我将解释我的角色是什么。

我们有一个小型的机器学习咨询团队。从数据收集到操作,从模型构建到服务部署,你能想到的每个行业,我们都做到了。所以每个人都戴着许多帽子。

过去时是因为我已经离开了我作为机器学习工程师的角色,开始从事自己的业务。我为此制作了一个视频。

我的一天是什么样子的

上午 9 点,我会走进去,说早上好,把我的食物放在冰箱里,倒一杯咖啡,走到我的办公桌前。然后我会坐下来,看着前一天的笔记,打开松弛的部分。我会阅读消息,打开团队分享的论文或博客帖子的链接,会有一些,这个领域发展很快。

一旦信息被清除,我会浏览报纸和博客帖子,阅读那些留下的。通常有一些事情可能对我正在做的事情有所帮助。阅读需要一个小时,有时更长,这取决于它是什么。

为什么这么久?

阅读是终极元技能,如果有更好的方法来做我正在做的事情,我可以通过学习和实施它来节省时间和精力。

现在是上午 10 点。

如果截止日期临近,阅读会被缩短以推进项目。这是一天中最大的一块去了。我会回顾前一天的工作,检查我的记事本记录下接下来的步骤。

我的记事本是流动的日志。

“我已经将数据处理成正确的形状,现在我需要在模型中运行它,我将在开始时保持简短的训练,然后在取得进展时加快训练。”

如果我被困住了。

“出现了数据不匹配的情况。下一步将是在尝试新模式之前,修复组合匹配并获得基线。”

大部分时间都在确保数据处于可以建模的形式。

下午 4 点左右,是时候开始放松了。收尾工作包括清理我创建的混乱代码,使其清晰易读,添加注释,重组。如果别人不得不读这个呢?这是我想问的问题。通常是我。令人惊讶的是,一连串的想法很快就被遗忘了。

到了下午 5 点,我的代码出现在 GitHub 上,第二天的笔记出现在我的记事本上。

这是理想的一天,但不是每天。有时候,在下午 4:37,你会有一个美好的想法突然出现在你的脑海中,并遵循它。

现在你已经对每天发生的事情有了一个大概的了解,我们来具体说说。

1.它总是关于数据

如果你熟悉一些数据科学的基本原则,这似乎是老生常谈了。但令人惊讶的是我经常会忘记。太多时候,你会专注于构建一个更好的模型,而不是改进你正在构建的数据。

建立一个更大的模型和使用更多的计算能力可以提供令人兴奋的短期结果。然而,走了足够多的捷径,你最终会走捷径。

当第一次参与一个项目时,要花大量的时间来熟悉数据。我说不正常,是因为通常你不得不把你的第一次估计乘以 3。从长远来看,这会节省你的时间。

这并不意味着你不应该从小处着手。我们会谈到这一点。

对于任何新的数据集,你的目标应该是成为主题专家。检查分布,找到不同种类的特征,异常值在哪里,为什么是异常值?如果你不能讲述一个关于你正在处理的数据的故事,你怎么能期望你的模型呢?

An example exploratory data analysis lifecycle (what you’ll do every time you encounter a new dataset). More on this in A Gentle Introduction to Exploratory Data Analysis.

2.沟通问题比技术问题更难

我遇到的大多数主要障碍都不是技术性的,而是交流性的。当然,总会有技术挑战,但解决技术挑战是工程师的职责。

永远不要低估内部和外部沟通的重要性。没有什么比解决一个错误的技术挑战更糟糕的了。

这是怎么发生的?

从外部来看,这是客户所追求的与我们能提供的不匹配,而是机器学习能提供的不匹配。

在内部,由于许多人身兼数职,很难确保每个人都有相同的目标。

这些挑战并非独一无二。机器学习看起来很神奇。在某些情况下的确如此。但如果事实并非如此,承认这一点很重要。

你如何修理它?

触底。定期。你的客户明白你能提供什么吗?你了解你客户的问题吗?他们明白机器学习能提供什么,不能提供什么吗?你可以用什么有用的方式来交流你的发现?

内部呢?

你可以根据试图解决内部沟通问题的软件工具的数量来判断这个问题有多难。Asana,吉拉,Trello,Slack,Basecamp,周一,微软团队。

我发现的最有效的方法之一是在一天结束时在相关的项目频道中进行简单的消息更新。

更新:

  • 3-4 分
  • 关于我所做的
  • 为什么

接下来:

  • 基于以上,我下一步要做的是

完美吗?不。但它似乎起作用了。这给了我一个机会,让我反思自己做了什么,想做什么,还有公开的额外好处,这意味着如果我的工作看起来不成功,可能会受到批评。

无论你是一名多么优秀的工程师,你保持和获得新业务的能力都与你传达你的技能及其带来的好处的能力相关。

3.稳定>最先进(总体而言)

我们有一个天生的语言问题。将文本分类成不同的类别。目标是让用户向服务发送一段文本,并让它自动分类到两个类别中的一个。如果模型对预测不自信,将文本传递给人类分类器。负载大约是每天 1000-3000 个请求。不庞大,也不小。

伯特曾是今年的热门人物。但是如果没有 Google scale compute,用 BERT 训练一个模型来做我们需要的事情需要太多的按摩。这还是在投入生产之前。

相反,我们使用了另一种方法, ULMFiT,,这种方法在理论上不是最先进的,但仍然产生了足够多的结果,而且更容易操作。

运送有用的东西比坐在你努力追求完美的东西上提供更多的价值。

4.机器学习的两个缺口

将机器学习付诸实践有两个缺口。从课程工作到项目工作的差距,以及从笔记本中的模型到生产中的模型(模型部署)的差距。

在互联网上搜索机器学习课程会返回大量结果。我用它们中的许多创造了我自己的人工智能硕士学位。

但即使在完成了许多最好的课程之后,当我开始成为一名机器学习工程师时,我的技能也是建立在课程的结构化主干之上的。事实上,项目不是结构化的。

我缺乏具体的知识。课程中无法教授的技能。如何质疑数据,探索什么与利用什么。

特定知识:不能在课程中教授但可以学习的技能。

解决方法是什么?

我很幸运能和澳大利亚最优秀的人才在一起。但我也愿意学习,愿意犯错。当然,犯错不是目标,但是为了正确,你必须找出错在哪里。

如果你正在通过一门课程学习机器学习,那么继续学习这门课程,但是通过在自己的项目中工作将你所学的东西付诸实践,用特定的知识武装自己。

部署呢?

我还是不擅长这个。但是我注意到了一个趋势。机器学习工程和软件工程正在融合。有了像塞尔顿、库伯弗洛和库伯内特斯这样的服务,机器学习很快就会成为堆栈的另一部分。

在 Jupyter 笔记本上建立一个模型是一回事,但是你如何让成千上万甚至数百万人使用这个模型呢?从最近在云原生事件上的演讲来看,大公司之外没有多少人知道如何做到这一点。

5.20%的时间

我们有一个规则。20%的时间。这意味着我们 20%的时间可以用来学习。事物是一个松散的术语,意思是机器学习世界中的事物。有很多。

这不止一次被证明是非常宝贵的。超过 BERT 的 ULMFiT 使用率是 20%时间的结果。

20%的时间意味着 80%将花在核心项目上。

  • 80%在核心产品上(机器学习专业服务)。
  • 20%用于与核心产品相关的新事物。

它并不总是像这样分裂,但它是一个很好的目标。

如果你的商业优势是在你现在做的事情上做到最好,那么未来的商业取决于你继续在你做的事情上做到最好。这意味着不断学习。

6.十分之一的论文被阅读,很少被使用

这是一个粗略的指标。但是探索任何数据集或现象,你很快就会发现它无处不在。是齐夫定律或者普赖斯定律,其中一个,都和我差不多。普莱斯定律表明,一半的出版物来自所有作者数量的平方根。

换句话说,在每年成千上万的投稿中,你可能会有 10 篇开创性的论文。在这 10 篇开创性的论文中,有 5 篇可能来自同一个机构或同一个人。

外卖?

你不可能跟上每一个新的突破。最好是把基本原理的基础打牢,并加以应用。这些经历了时间的考验。原始突破新突破指的是。

但是随之而来的是探索与开发的问题。

7.做你自己最大的怀疑者

你可以通过成为自己最大的怀疑者来处理探索与开发的问题。

探索与利用的问题是在尝试新事物和重新应用已有成果之间的两难选择。

剥削

很容易运行一个你已经使用过的模型,得到一个高精度的数字,然后作为一个新的基准向团队报告。但是如果你得到了一个好的结果,记得检查你的工作,一次又一次,让你的团队也这样做。你成为工程师兼科学家是有原因的。

探测

20%的时间有助于此。但 70/20/10 可能效果更好。也许你花 70%在核心产品上,20%在构建核心产品上,10%在兼职上,这些事情可能不会(也可能不会)奏效。

我从未在我的角色中练习过这个,但这是我正在努力的方向。

8.玩具问题第一件事起作用

玩具问题管用。尤其是为了帮助理解一个新概念。建造一些小东西。它可能是您的数据的一个小子集,也可能是不相关的数据集。

在一个小团队中,诀窍是让一些东西发挥作用,然后快速迭代。

9.橡皮鸭

罗恩教我这个。如果你困在一个问题上,坐着盯着代码可能会解决它,但可能不会。相反,与队友用语言交流。假装他们是你的橡皮鸭。

“罗恩,我试图循环这个数组,在循环另一个数组的同时跟踪状态,然后我想把这些状态组合成一个元组列表。”

“循环中的循环?你为什么不把它矢量化呢?”

“我能做到吗?”

“让我们看看。”

10.从头开始构建的模型正在衰落(或者至少你不需要它们开始)

这又回到了机器学习工程与软件工程融合的问题上。

除非您的数据问题非常具体,否则许多主要问题都非常相似:分类、回归、时间序列预测、建议。

谷歌和微软的 AutoML 等服务正在让世界一流的机器学习对每个可以上传数据集和选择目标变量的人开放。时间还早,但它们的势头正在迅速增强。

在开发人员方面,你有像 fast.ai 这样的库,可以用几行代码提供最先进的模型,还有各种模型动物园(一个预建模型的集合),像 PyTorch hub 和 TensorFlow hub 提供同样的服务。

这意味着什么?

仍然需要了解数据科学和机器学习的基本原理。但是知道如何将它们应用于您的问题更有价值。

现在,你的基线没有理由不接近最先进的水平。

11.数学还是代码?

对于我处理的客户端问题,我们都是先编写代码的。所有的机器学习和数据科学代码都是 Python 编写的。有时我会通过阅读一篇论文并复制它来涉猎数学,但是 99.9%的时间,现有的框架已经涵盖了数学。

这并不是说数学是不必要的,毕竟,机器学习和深度学习都是应用数学的形式。

至少知道矩阵操作,一些线性代数和微积分,特别是链规则对从业者来说已经足够好了。

请记住,我的目标不是发明一种新的机器学习算法,而是向客户展示机器学习对他们的业务有(或没有)的潜力。

边注:在这篇文章的美好时机,fast.ai 刚刚发布了一门新课程,从基础开始的深度学习,它从头开始讲述深度学习的数学和代码。它是为像我这样熟悉应用深度学习和机器学习,但缺乏数学背景的人设计的。为了解决这个问题,我正在浏览它,它立即被添加到我最喜欢的机器学习和数据科学资源列表中。有了坚实的基础,你可以建立自己的艺术状态,而不是重复以前的。

12.你去年做的工作明年可能会无效

这是已知的。并且由于软件工程和机器学习工程的融合而变得更加如此。

但这是你报名参加的。

什么保持不变?

框架会变,库会变,但底层的统计、概率、数学,这些东西没有截止日期(新的 fast.ai 课程甚至更好的时机)。

最大的挑战仍然是:你如何应用它们。

现在怎么办?

可能有更多,但 12 个足够了。

在 Max Kelsen 工作是我做过的最好的工作。问题很有趣,但人们更好。我学到了很多。

离开不是一个容易的选择,但我决定用我学到的东西来检验自己。你会发现我站在健康、科技和艺术的十字路口,并在 YouTube 上直播。

如果您有任何问题,我的 Twitter DM 已开通或订阅我的时事通讯,了解我的最新动态。

数据科学家的 13 份重要简讯:重制

原文:https://towardsdatascience.com/13-essential-newsletters-for-data-scientists-remastered-f422cb6ea0b0?source=collection_archive---------9-----------------------

你会想要这种数据科学和人工智能为重点的内容

Source: Unsplash

如果你和我一样,你会订阅时事通讯。很多时事通讯。就像,太多的时事通讯。我控制不住自己。如果做得好,时事通讯是一种很好的内容管理形式,可以帮助你用最少的努力向你传递有趣和有见地的信息。幸运的是,数据通讯也不例外。

在这篇文章中,我将概述为什么我认为时事通讯是数据科学持续发展的一个如此棒的工具。更重要的是,我会列出我一周中最期待的数据科学和人工智能时事通讯。

同样值得注意的是,这篇文章是由之前的一篇文章翻拍而来的。更具体地说,我增加了更多的时事通讯,用一个小广告详细阐述了每一篇,并清理了一些结构性的东西。

为什么是时事通讯?

回顾一下当我开始数据科学的时候,我做的第一件也是最有价值的事情之一就是寻找大量的数据简讯。这迫使我时刻关注不断变化的数据科学领域的最新消息。

它帮助我学习技巧和技术,向我介绍新的概念和学习资源,否则我不会知道,并在有网络机会、公开技术讲座和工作机会时通知我。最重要的是,它每周都会这样做。

在我们当前充斥着点击诱饵标题和假新闻的世界里,持续交付的内容监管是无价的。外面的信息量太大了。时事通讯通过为你区分信号和噪音来帮助解决这个问题。当别人乐意为你做的时候,为什么要花时间从成千上万的帖子中筛选出最好的呢?

下面收集的新闻通讯就是一个很好的例子。从数据科学到机器学习再到人工智能,这些内容策展人提供的链接可以作为一名数据科学家的持续发展的游戏规则改变者。

那么让我们进入列表,排名不分先后。

Source: Unsplash

名单

数据科学周刊

《数据科学周刊》绝对是粉丝的最爱,这是有原因的。该时事通讯始于 2013 年,自那以来已经连续出版了 276 期。它从一个编辑器选择部分开始,然后快速移动到列出一堆数据科学文章和视频。此外,它还包括一个职位空缺、教程和书籍的部分。每周四发送,这封信非常值得你花时间。查看最近一期的。

奥雷利数据通讯

你可能以这样或那样的方式听说过奥赖利媒体。就我个人而言,我的书桌上一直放着他们的藏书。他们还出版电子书,主持会议,并提供其他学习解决方案。他们专注于数据的时事通讯每周提供 10 个链接,从新闻到教程到白皮书。

数据药剂

Data Elixir 采用了类似的方法,将事情分解为广泛的每周新闻、见解、工具和技术、资源和数据可视化的集合。这份简讯发给 29,000 多名订户,每周二发送。查看最近的一期。

数据玛奇纳

《数据玛奇纳》是一份技术性更强的时事通讯,按技术细分链接,涉及从 R 到区块链到算法的主题。这里真的什么都有一点。我订阅免费版,每两周发送一次,但是如果你愿意的话,你可以付费每周接收一次时事通讯。看看最近的一期。

分析派

Mode 提供了许多企业数据解决方案,但他们每周还会发布一份相当不错的数据简报。他们主要关注社区中吸引他们眼球的文章,但也包括特色数据工作的部分。查看最近一期的。

机器学习

正如你可能已经猜到的,机器学习主要关注人工智能和人工智能新闻。我特别喜欢棒的不棒的部分,如果你赶时间的话,它们会给出一些小新闻。其他人似乎也很喜欢它,因为该时事通讯拥有 40,000 多名订户。查看最近的一期。

数据科学综述

另一份已经发行了一段时间的时事通讯《数据科学综述》迄今已出版了 177 期,拥有超过 7000 名订户。这份时事通讯采用了更简洁的方法,每周提供 5 个左右的链接,每篇文章都有深刻的反思。查看最近的一期。

黑客新闻文摘

不是数据科学时事通讯本身,但仍然是一个有价值的资源。像大多数科技界人士一样,我喜欢黑客新闻。然而,我很难跟上它,直到我发现了这个。你可以根据每个帖子的投票数来决定发送给你的链接的频率和数量。

卡格尔通迅

这篇时事通讯包含了所有人最喜欢的机器学习竞赛网站 Kaggle 的最新博客文章、采访或新闻。它还包括社区中的链接、资源、聚会和职位空缺。我找不到这一个的订阅链接,非常肯定 Kaggle 自动订阅你当你做一个帐户。

每日更新

Stratechery 的每日更新与其他网站略有不同,因为它是付费的每日会员。这些报告不是传统的数据科学时事通讯,而是专注于技术战略思考。它会让你每月花费 10 美元左右,如果你按年付费的话会少一点。这是少数几个我乐意为书面内容付费的地方之一,媒介是另一个。网站上也有很多免费的文章。查看这篇文章和其他文章,感受一下。

导入 AI

进口人工智能严重依赖技术机器学习和人工智能资源,通常是白皮书和最近的研究成果。这些问题还包括大量的分析。即使这些都不是你喜欢的,也要确保阅读最后的科技故事部分,这是一个永远有趣的未来故事。查看最近的一期。

中的野周

与 Import AI 类似,这份时事通讯涵盖了技术机器学习和 AI 教程、项目、研究论文和新闻。《人工智能中的狂野一周》虽然发布得有些零散,但它已经有超过 17000 名订阅者,如果这能说明它的内容的话。看看最近的一期。

数据是复数

Data Is Plural 每周发布一次,只关注你感兴趣的数据集,供你在下一个副业项目中探索或使用。还有一个非常棒的 Google doc 作为所有这些可追溯到 2015 年的数据集的存档。查看最近一期的。

TDS 每周精选

最后但同样重要的是,的数据科学团队每周和每月都会发布出版物上最受欢迎帖子的摘要。你可以通过接受 TDS 的信件来接收这些电子邮件,如果你去他们主页上的下拉菜单。查看最近一期。

包装

这就结束了我们的列表,至少现在是这样。我会留意更多有价值的数据科学时事通讯。请随意用我可能错过的其他必备数据简讯点亮评论区。

我知道这些简讯在我的数据科学家之旅中给了我巨大的帮助,并在今天继续帮助我成长和提高。我希望他们也能为你提供一些价值。

感谢阅读!请随意查看下面我的一些类似文章,并订阅我的时事通讯中的以接收任何新内容。

  • 启发您下一个数据科学项目的 5 种资源
  • DS/ML 面试资源大单
  • A 型数据科学家的颂歌

你可以在 Medium 上关注我更多类似的帖子,也可以在 Twitter 上找到我。更多关于我和我在做什么,请查看我的网站。

非数学家多臂 Bandit 问题的 13 种解决方案

原文:https://towardsdatascience.com/13-solutions-to-multi-arm-bandit-problem-for-non-mathematicians-1b88b4c0b3fc?source=collection_archive---------9-----------------------

非数学家(比如我)多臂 bandit 问题的简单解决方案。

GIF from this website

简介

问题很简单,我们有一个有 n 个手臂的老丨虎丨机。我们对哪只手臂可以拉的试验次数有限,我们也不知道哪只手臂会给我们最多的钱。

假设概率分布不随时间变化(意味着这是一个平稳问题)…

我们应该拉哪只胳膊?我们应该拉过去给我们最多奖励的那只手臂,还是应该探索,希望得到更好的手臂?

这个问题有多种解决方案,通常,人们衡量后悔是为了给每个解决方案排名。(遗憾==简单地说,我们因为没有拉最佳臂而得到的惩罚量。).因此,为了减少遗憾,我们只需拉起最有可能给我们奖励的手臂。

但我想看看额外的测量,具体来说,我还会考虑每个算法对每个臂的概率分布估计得有多好。(他们给我们奖励的概率)。在更小的范围内,我们只有 12 只手臂,在更大的范围内,我们有 1000 只手臂。

最后,这篇文章的目的是为非数学家(比如我)提供每个解决方案的简单实现。因此,理论保证和证明没有讨论,但我提供了不同的链接,为人们谁希望更深入地研究这个问题。

下面是我们将要比较的方法列表…..

1)矢量化
2)贪婪
3)e-贪婪
4)衰变 e-贪婪
5)线性奖励不作为(追踪方法)
6)线性奖励惩罚(追踪方法)
7)置信上限
8)置信上限调谐
9)汤普森采样(贝塔分布)
10)汤普森采样(均匀分布)
11)神经网络
12)玻尔兹曼探索(Softmax)【12】

1.矢量化

请注意,这个方法实际上不是一个解决方案。多臂土匪问题背后的想法是如何在勘探和开发之间取得最佳平衡。

在这里,我们只是计算每只手臂能得到多少奖励,然后除以我们拉每只手臂的次数。(因此直接计算获得奖励的百分比。)

我只是想展示一个简单的方法来估计概率分布。

2. 贪婪

在这里,我们的策略是拉给我们最大回报的手臂。但是,最开始的问题是,我们不知道每个手臂的概率是如何分布的。

所以我决定通过从均匀分布初始化我们的估计分布来给出一些“信息性的”先验。(我猜这可能与“最佳初始化方案”有点关系,但这不是我的意图,在全零之前初始化我们也可以。).

3.贪婪的

类似的概念,贪婪的方法,但有一些概率ε,我们探索和选择一个随机土匪,而不是选择手臂,我们认为有最高的概率。

4.腐败贪婪

与 e-Greedy 方法的想法完全相同,但我们在这里慢慢降低ε。(我们探索的概率)。因此,随着时间的推移,这种方法将完全相同的贪婪方法。

5.线性奖励无为(追求法)

追踪方法背后的一般思想是保持对盗匪的明确策略,并使用经验方法更新它们。开始时,概率分布是统一初始化的(意味着每个手臂都有同等的机会被选中),但随着时间的推移,分布会发生变化。

因为对于追踪方法,估计值被归一化为和为 1,所以为了公平比较,重新调整可能是合适的。

6.线性奖励惩罚(追踪法)

线性奖励惩罚扩展了线性奖励不作为背后的思想,在某种程度上,如果我们没有得到奖励,我们也在惩罚手臂。

对于线性奖励惩罚和不作为,我的朋友迈克尔写了一篇更详细的博文。

7. 置信上限 1

简而言之,UCB 遵循一个简单的原则,即“乐观面对不确定性”。理解这个概念的另一种方式是更喜欢拉得不太频繁的那只手臂,因此我们对那只手臂不太确定。(更多信息请阅读这篇博文或观看这段视频。).

这种方法很有吸引力,因为它有强有力的理论保证。

8.置信上限 1 已调整

在他们提出 UCB1 的同一篇论文中,Auer,Cesa-Bianchi & Fisher 提出了 UCB1-Tuned 算法。有趣的是,这个算法给出了更好的经验结果,但是作者自己不能给出理论上的后悔界限。

9. 【汤普森抽样(贝塔分布)

这种方法是一种贝叶斯推理方法,在这种方法中,我们在每条臂上都有一组先验分布,当我们观察到我们从每条臂获得了多少奖励时,我们就更新我们的后验分布。

有关此方法的更多信息,请点击此处或此处。

10.汤普森抽样(均匀分布)

请注意,这种方法纯粹是为了娱乐。均匀分布不是在伯努利分布到之前的共轭分布。我只是想尝试一下这种方法,总的来说,与贝塔分布相比,均匀分布倾向于探索更多。

11.神经网络

这种方法也是为了娱乐目的,它没有任何理论上的保证。看了这篇博文,很受启发。不同的是,我使用了 KL 散度作为目标函数,并使用了 Adam 优化器。

12. 【玻尔兹曼探索(Softmax)

Softmax 方法以与其平均奖励成比例的概率挑选每只手臂。因此,如果一只手臂给予较大的奖励,它被选中的概率就较高。

与这种方法相关的一个有趣的想法是,我们有一个控制探索程度的温度参数。

13.渐变强盗

梯度土匪使用梯度上升,以找到最佳的手臂拉。简而言之,我们有一个称为平均奖励的变量,它跟踪奖励的平均值,直到某个时间 t。如果我们拉的强盗给出的奖励高于平均值,我们就增加武器被选中的概率,反之亦然。

实验/讨论

执行两组实验
1)小:12 个强盗,20 集,每集 1000 次迭代
2)大:1000 个强盗,500 集,每集 1500 次迭代

小的

左图 →每种方法一段时间后的遗憾
右图 →每种方法一段时间后的累计奖励

当方法的后悔在对数时间内增长时,它被认为是对 bandit 问题的一种解决方案。从上面的图中,我们可以看到 UCB1 优化后的结果是最佳的。

然而,当我们查看地面真实概率分布之间的相关矩阵时,我们可以看到 e-greedy 和 softmax 策略具有一对一的相关性。(向量方法不被认为是一种解决方案。).

大的

从上面可以看到一个非常令人惊讶的结果,我们可以马上注意到简单的方法,如贪婪和衰减贪婪方法能够胜过更先进的解决方案。(取样方法要花很多时间。)

看到神经网络方法表现良好,我感到非常惊讶。

但是当涉及到估计 1000 个臂的概率分布时,我们可以看到 softmax 和 UCB1 方法给出了最精确的估计。

无论是在大型实验还是小型实验中,衰减贪婪方法似乎都是整体最优的解决方案。

交互代码

要获取更小实验的代码,请点击这里或这里。

要访问更大实验的代码,请点击此处或此处。

最后的话

这个简单的问题仍在研究中,因此,存在许多更先进的解决方案,如需进一步阅读,请阅读这篇博文。

从这篇论文中还可以看出,在传统的多臂 bandit 问题中,简单的策略(如 e-greedy 方法)可以胜过更先进的方法,并且在现实生活的临床试验中也能给出有竞争力的结果。

虽然理论上的保证非常重要,但令人惊讶的是,观察到其他更简单的方法也能得到更好的结果。

更多文章请访问我的网站。

参考

  1. (2019).Www-anw.cs.umass.edu。检索于 2019 年 1 月 13 日,来自http://www-anw . cs . umass . edu/~ barto/courses/cs 687/Chapter % 202 . pdf
  2. 翁,L. (2018)。多臂土匪问题及其解决方案。lilian Weng . github . io . 2019 年 1 月 13 日检索,来自https://lilian Weng . github . io/lil-log/2018/01/23/the-multi-armed-bandit-problem-and-its-solutions . html
  3. 用多臂 Bandit 进行强化学习。(2018).ITNEXT。检索于 2019 年 1 月 13 日,来自https://it next . io/reinforcement-learning-with-multi-arm-bandit-decf 442 e 02d 2
  4. 多臂 Bandit 强化学习(下)。(2018).ITNEXT。检索于 2019 年 1 月 13 日,来自https://it next . io/reinforcement-learning-with-multi-arm-bandit-part-2-831 a 43 f 22 a 47
  5. ankonzoid/LearningX。(2019).GitHub。检索于 2019 年 1 月 13 日,来自https://github . com/ankonzoid/learning x/blob/master/classic _ RL/MAB/mab . py
  6. 迈克尔·帕切科。(2019).Michaelpacheco.net。检索于 2019 年 1 月 13 日,来自https://www.michaelpacheco.net/blog/RL-multi-armed-bandit-2
  7. 迈克尔·帕切科。(2019).Michaelpacheco.net。检索于 2019 年 1 月 13 日,来自https://www.michaelpacheco.net/blog/RL-multi-armed-bandit-3
  8. 多武装匪徒。(2013).数据折纸。检索于 2019 年 1 月 13 日,来自https://data origami . net/blogs/nappin-folding/79031811-multi-armed-土匪
  9. 多臂土匪实现。(2019).peterroelants . github . io . 2019 年 1 月 13 日检索,来自https://peterroelants . github . io/posts/multi-armed-bandit-implementation/
  10. (2019).Cs.mcgill.ca 检索于 2019 年 1 月 13 日,来自https://www.cs.mcgill.ca/~vkules/bandits.pdf
  11. 用多臂 Bandit 进行强化学习。(2018).ITNEXT。检索于 2019 年 1 月 13 日,来自https://it next . io/reinforcement-learning-with-multi-arm-bandit-decf 442 e02d 2
  12. ankonzoid/LearningX。(2019).GitHub。检索于 2019 年 1 月 13 日,来自https://github . com/ankonzoid/learning x/tree/master/classical _ RL/MAB
  13. 迈克尔·帕切科。(2019).Michaelpacheco.net。检索于 2019 年 1 月 13 日,来自 https://www.michaelpacheco.net/blog/RL-multi-armed-bandit-3
  14. 试用编辑器 3.6 版(2019)。W3schools.com。检索于 2019 年 1 月 13 日,来自https://www.w3schools.com/html/tryit.asp?filename = try html _ lists _ intro
  15. bgalbraith/土匪。(2019).GitHub。检索于 2019 年 1 月 13 日,来自https://github . com/bgalbraith/bottoms/blob/master/bottoms/policy . py
  16. (2019).Www-anw.cs.umass.edu。检索于 2019 年 1 月 13 日,来自http://www-anw . cs . umass . edu/~ barto/courses/cs 687/Chapter % 202 . pdf
  17. bgalbraith/土匪。(2019).GitHub。检索于 2019 年 1 月 13 日,来自https://github . com/bgalbraith/bottoms/blob/master/bottoms/policy . py
  18. 脱落神经网络(带 ReLU)。(2019).要点。检索于 2019 年 1 月 14 日,来自https://gist.github.com/yusugomori/cf7bce19b8e16d57488a
  19. NumPy . minimum—NumPy 1.15 版手册。(2019).Docs.scipy.org。检索于 2019 年 1 月 14 日,来自https://docs . scipy . org/doc/numpy-1 . 15 . 1/reference/generated/numpy . minimum . html
  20. matplotlib.pyplot,h .,& P,B. (2011 年)。如何用 matplotlib.pyplot 改变图例大小.堆栈溢出?检索于 2019 年 1 月 14 日,来自https://stack overflow . com/questions/7125009/how-to-change-legend-size-with-matplotlib-py plot
  21. seaborn . heat map-seaborn 0 . 9 . 0 文档。(2019).Seaborn.pydata.org。检索于 2019 年 1 月 14 日,来自https://seaborn.pydata.org/generated/seaborn.heatmap.html
  22. error,h .,& Cunningham,P. (2015)。热图 Seaborn fmt='d '错误。堆栈溢出。检索于 2019 年 1 月 14 日,来自https://stack overflow . com/questions/31087613/heat-map-seaborn-fmt-d-error
  23. 皮奥特博士和洛杉矶大学(2017 年)。pivot 中 seaborn 热图的数据顺序。堆栈溢出。检索于 2019 年 1 月 14 日,来自https://stack overflow . com/questions/43694368/data-order-in-seaborn-heat map-from-pivot
  24. 热图公司(2017 年)。自动调整 seaborn 热图中的字体大小。堆栈溢出。检索于 2019 年 1 月 14 日,来自https://stack overflow . com/questions/33104322/auto-adjust-font-size-in-seaborn-heat map
  25. (2019).Homes.di.unimi.it 于 2019 年 1 月 14 日检索,来自https://homes.di.unimi.it/~cesabian/Pubblicazioni/ml-02.pdf
  26. 共轭先验。(2019).En.wikipedia.org。检索于 2019 年 1 月 14 日,来自https://en.wikipedia.org/wiki/Conjugate_prior
  27. 强盗算法。(2018).强盗算法。检索于 2019 年 1 月 14 日,来自http://banditalgs.com/

深度学习游戏的第 9 名解决方案/方法/旅程:计算机视觉黑客马拉松

原文:https://towardsdatascience.com/13th-place-solution-approach-journey-for-game-of-deep-learning-computer-vision-hackathon-1d39fd16099e?source=collection_archive---------21-----------------------

由 Analytics Vidhya 主办

Photo by Vidar Nordli-Mathisen on Unsplash

问题陈述

船舶或船只探测在海事安全、渔业管理、海洋污染、国防和海事安全、防止海盗、非法移民等领域具有广泛的应用。

牢记这一点,政府海事和海岸警卫队机构正计划部署基于计算机视觉的自动化系统,以仅从测量船拍摄的图像中识别船舶类型。你被聘为顾问,为这个项目建立一个高效的模型。

需要检测的船只分为以下 5 类:

数据集描述

在训练中有 6252 幅图像,在测试数据中有 2680 幅图像。数据集中的船舶类别及其对应的代码如下-

Categories of ships and their corresponding codes

  • 提供了三个文件,即 train.zip、test.csv 和 sample_submission.csv,其结构如下。

Variable Definition

  • train.zip 包含对应于训练集和测试集的图像,以及 train.csv 中训练集图像的真实标签

评估指标

本次比赛的评估标准是加权 F1 分数。

公私分离

公共排行榜基于随机选择的 30%的测试图像,而私人排行榜将基于剩余的 70%的测试图像进行评估。

方法

我为这次黑客马拉松的准备工作在它被宣布为计算机视觉黑客马拉松的 3 周前就开始了。我想复习一下深度学习,特别是计算机视觉,所以我在网上搜索了最好的 DL 教程,无意中发现了一个金矿, fastai

我花了整整 3 周的时间才完成了这 7 节长达 2 小时的课,在我上班的 2 小时通勤时间里,我试图零零碎碎地看着它们,中间的 2 个周末几乎没有练习。

黑客开始-1/3

黑客攻击的第一周是为了更深入地理解fastai API 中的细微差别。

我从内置的resnet50架构开始,用预先训练好的ImageNet权重来训练一个模型,很快就要实验各种内置的resnetdensenet模型。在查看了fastai中可用的各种模型架构的性能后,我决定使用内置的resnet152densenet161架构来构建初始模型。

仔细查看 get_transform 函数后,将默认值改为get_transforms(max_lighting=0.4, max_zoom=1.2, max_warp=0.2, max_rotate=20, xtra_tfms=[flip_lr()]))。我提交的作品从0.929770.96650不等。第一周结束时,我轻松进入了前 15 名。

黑客攻击加剧——2/3

在黑客生涯的第二周,我学到了很多,也收获了很多。我正在浏览 2018 年fastai 课程的讲义,了解了TTA, lr_find()learn.recorder.plot(suggestion=True)功能以及渐进式图像大小调整技术,令人惊讶的是,这些在 2019 年版本的课程中没有涉及。使用这些新技巧,我可以获得一个最好的0.974822分数的densenet161模型。

我意识到我们可以使用这个伟大系列中预先训练好的模特,fastai中的https://github.com/Cadene/pretrained-models.pytorch,并使用这个教程来了解fastai 模特的头部和身体结构。但是当我想使用模型架构,比如使用 Kaggle 内核的senet154, se_resnet152, polynet时,我就用完了 GPU 内存。了解了learn.to_fp16()技巧,但它在 Kaggle 内核的 Tesla K80 上没有用,因为它没有张量内核来利用混合精度训练。

我决定创建一个 GCP 账户,使用更快的具有张量核的 GPU Tesla V100,并遵循这个教程。处理 GPU 配额增加请求大约需要 3 个小时。我在混合精度训练的帮助下运行了senet154, se_resnet152 模型。

到现在为止,我有大约 17 个模特,我决定让她们合奏。由于 output category 列中有离散的类,所以我对所有的提交使用了一个简单的模式,mode(df, axis=1)[0]给出了一个得分0.980409,帮助我突破了 0.98 分。

到第二周结束时,我已经建立了一个 GCP 环境,可以更快地探索更大的模型,在公共 LB 上排名第八,但几乎已经没有主意了。

黑客高潮——3/3

在比赛的第三周也是最后一周的一个清新的周一早上,在我浏览黑客新闻和数据科学网站的日常工作中,我看到 ImageNet 数据集上有一个新的 SOTA 模型,即 EfficientNet。我很快搜索了 Pytorch 的实现,发现了这个惊人的 GitHub repo ,里面有 B0-B3 的预训练模型。我还发现了这篇文章关于英特尔场景分类挑战赛第一名获胜者的方法。

我可以很快意识到我错过了混合增强技术和消除混乱图像的技术,这对于参与者达到最高点非常有帮助。所以在我的代码中加入了这些变化,当我在fastai文档页面上阅读mixup()的时候,我了解到了ResizeMethod.SQUISH的方法,它不是像224*224,那样将图像居中裁剪成特定的大小,而是将整个图像压缩成所需的大小。然后修剪了训练集中大约 100 幅最容易混淆的图像,并通过添加valid_pct=0.1来扩大训练集。

下面是我最后的 get_data 函数,

get_data.py

下面是fastai,中的高效网络 B3 模型

model.py

我用这条代码管道运行了 B0、B1、B2 和 B3 模型,其中 B3 的一个最佳模型在公共 LB 上给出了0.981322。取了这些模型给出的模式0.98224。使用resnet152densenet161运行此管道,并使用公共 LB 上给出0.979470的最佳单 B3 模型来获取这些提交的模式。然后最终提交的让我在公众 LB 排名第五的是到目前为止的 3 个顶级提交的模式,给出的分数是0.988798

最终的提交严重超过了公共 LB,把我排在了私人 LB 的第 9 位。我提交的resnet152, densenet161efficientnet-b3模式在私人 LB 上表现最好,本可以让我获得第四名。这里是链接到二等兵 LB。

Best Public and Best Private submissions

然而,这次黑客马拉松对我来说是一次非同寻常的经历。感谢团队 AV 举办了如此精彩的黑客马拉松。希望在 DataHack 峰会 2019 与大家见面。✌️

更新:使用 FastAI 训练 EfficientNet 的代码发布此处 。如果你觉得 Kaggle 内核有用,请投上一票。

感谢阅读!如果你喜欢这篇文章,请随时通过 LinkedIn 或 Twitter 联系我。

你应该知道的 15 个 Docker 命令

原文:https://towardsdatascience.com/15-docker-commands-you-should-know-970ea5203421?source=collection_archive---------0-----------------------

第 5 部分学会足够有用的 Docker

在这篇文章中,我们将看看你应该知道的 15 个 Docker CLI 命令。如果你还没有,看看这个系列的其余部分,关于 Docker 概念、生态系统、Docker 文件和保持你的图像苗条。在第 6 部分中,我们将使用 Docker 探索数据。我也有一系列关于 Kubernetes 的作品,所以请关注我,确保你不会错过有趣的内容!

大约有十亿个 Docker 命令(大约十亿个)。Docker 文档很广泛,但是当你刚刚开始的时候,会让人不知所措。在本文中,我将重点介绍运行 vanilla Docker 的关键命令。

Fruit theme

冒着让贯穿这些文章的食物隐喻线索走得太远的风险,让我们使用一个水果主题。蔬菜在关于减肥的文章中提供了营养。现在,当我们学习 Docker 命令时,美味的水果会给我们提供营养。

概观

回想一下,Docker 映像是由 Docker 文件+任何必要的依赖项组成的。还记得 Docker 容器是一个栩栩如生的 Docker 图像。要使用 Docker 命令,您首先需要知道您处理的是图像还是容器。

  • 码头工人形象要么存在,要么不存在。
  • Docker 容器要么存在,要么不存在。
  • 现有的 Docker 容器要么正在运行,要么没有运行。

一旦你知道你在做什么,你就能找到合适的命令。

命令共性

以下是关于 Docker 命令需要了解的一些事情:

  • Docker CLI 管理命令以docker开头,然后是一个空格,然后是管理类别,然后是一个空格,然后是命令。例如,docker container stop停止一个容器。
  • 引用特定容器或映像的命令需要该容器或映像的名称或 id。

例如,docker container run my_app是构建和运行名为 my_app 的容器的命令。在整个示例中,我将使用名称my_container来指代通用容器。同样的道理也适用于my_imagemy_tag等。

我将单独提供这个命令,然后在适用的情况下提供公共标志。前面有两个破折号的旗子是旗子的全名。带有一个破折号的标志是完整标志名称的快捷方式。例如,-p--port旗的简称。

Flags provide options to commands

我们的目标是帮助您记住这些命令和标志,并将本指南作为参考。本指南适用于 Linux 和 Docker 引擎版本 18.09.1 以及 API 版本 1.39 。

首先,我们将看看容器的命令,然后我们将看看图像的命令。卷将在下一篇文章中讨论。这里列出了 15 个需要知道的命令,外加 3 个额外的命令!

容器

使用docker container my_command

create —从图像创建容器。
start —启动现有容器。
run —创建一个新的容器并启动它。
ls —列出正在运行的容器。
inspect —查看关于容器的大量信息。
logs —打印日志。
stop —优雅地停止运行容器。
kill—突然停止容器中的主进程。
rm —删除已停止的集装箱。

形象

使用docker image my_command

build —建立形象。
push —将映像推送到远程注册表。
ls —列出图像。
history —见中间图像信息。
inspect —查看大量关于图像的信息,包括图层。
rm —删除图像。

混杂的

docker version —列出关于您的 Docker 客户端和服务器版本的信息。
docker login —登录 Docker 注册表。
docker system prune —删除所有未使用的容器、未使用的网络和悬挂图像。

容器

集装箱起点

术语创建、启动和运行在日常生活中都有相似的语义。但是每个都是创建和/或启动容器的单独的 Docker 命令。让我们先看看如何创建一个容器。

**docker container create my_repo/my_image:my_tag** —从图像创建容器。

在本文的其余部分,我将把my_repo/my_image:my_tag 缩短为my_image

有很多可能的标志可以传递给create

**docker container create -a STDIN my_image**

-a--attach的简称。将容器附加到 STDIN、STDOUT 或 STDERR。

现在我们已经创建了一个容器,让我们开始吧。

**docker container start my_container** —启动现有容器。

请注意,可以通过容器的 ID 或容器的名称来引用容器。

**docker container start my_container**

Start

现在您已经知道了如何创建和启动容器,让我们转到可能是最常见的 Docker 命令。它将createstart合并成一个命令:run

**docker container run my_image** — 创建一个新的容器并启动它。它也有很多选项。我们来看几个。

**docker container run -i -t -p 1000:8000 --rm my_image**

-i--interactive的简称。即使未连接,也保持 STDIN 打开。

-t--tty的简称。分配一个伪终端,它将您的终端与容器的标准输入和标准输出连接起来。

您需要指定-i-t,然后通过终端外壳与容器交互。

-p--port的简称。港口是与外界的接口。1000:8000将 Docker 端口 8000 映射到机器上的端口 1000。如果你有一个向浏览器输出内容的应用程序,你可以将浏览器导航到localhost:1000并查看它。

--rm停止运行时自动删除容器。

再来看一些run的例子。

**docker container run -it my_image my_command**

sh是一个可以在运行时指定的命令。sh将在您的容器内启动一个 shell 会话,您可以通过您的终端与之交互。对于高山图像,shbash更好,因为高山图像没有安装bash。键入exit结束交互式 shell 会话。

请注意,我们将-i-t合并成了-it

**docker container run -d my_image**

-d--detach的简称。在后台运行容器。允许您在容器运行时使用终端执行其他命令。

检查容器状态

如果您有正在运行的 Docker 容器,并想知道与哪个容器进行交互,那么您需要列出它们。

**docker container ls** —列出正在运行的容器。还提供了有关容器的有用信息。

**docker container ls -a -s**

-a-all的简称。列出所有容器(不仅仅是运行中的容器)。

-s--size的简称。列出每个容器的尺寸。

**docker container inspect my_container** —查看大量关于集装箱的信息。

**docker container logs my_container** —打印集装箱日志。

Logs. Not sure how virtual logs are related. Maybe via reams of paper?

容器结尾

有时候你需要停止一个正在运行的容器。

**docker container stop my_container** —正常停止一个或多个正在运行的容器。在关闭容器以完成任何进程之前,默认设置为 10 秒。

或者如果你不耐烦:

**docker container kill my_container** —突然停止一个或多个正在运行的容器。就像拔掉电视插头一样。大多数情况下首选stop

d**ocker container kill $(docker ps -q)** —杀死所有运行中的容器。

docker kill cockroach

然后,使用以下命令删除容器:

**docker container rm my_container** —删除一个或多个容器。

**docker container rm $(docker ps -a -q)** —删除所有未运行的容器。

这是 Docker 容器的八个基本命令。

概括地说,首先创建一个容器。然后,您启动容器。或者把那些步骤和docker run my_container结合起来。然后,您的应用程序运行。耶!

然后,你用docker stop my_container停止一个容器。最终你用docker rm my_container删除容器。

现在,让我们转到神奇的容器生产模具称为图像。

形象

以下是使用 Docker 图像的七个命令。

显影图像

**docker image build -t my_repo/my_image:my_tag .** —从位于指定路径或 URL 的 Docker 文件构建一个名为 my_image 的 Docker 映像。

-t是 tag 的简称。告诉 docker 用提供的标签标记图像。在这种情况下我的 _ 标签。

命令末尾的.(句号)告诉 Docker 根据当前工作目录下的 Dockerfile 构建镜像。

Build it

一旦你建立了一个映像,你想把它push到一个远程注册表,这样它就可以被共享,并在需要的时候被下载。假设你想使用 Docker Hub ,进入你的浏览器并创建一个账户。它是免费的。😄

下一个命令不是图像命令,但是在这里看到它很有用,所以我会提到它。

**docker login** —登录 Docker 注册表。出现提示时,输入您的用户名和密码。

Push

**docker image push my_repo/my_image:my_tag** —将图像推送到注册表。

一旦你有了一些图像,你可能想要检查它们。

检查图像

Inspection time

**docker image ls** —列出您的图片。也向您显示每个图像的大小。

**docker image history my_image** —显示图像的中间图像及其大小和创建方式。

**docker image inspect my_image** —显示图像的大量细节,包括构成图像的图层。

有时你需要清理你的图像。

移除图像

**docker image rm my_image** —删除指定的图像。如果图像存储在远程存储库中,该图像在那里仍然可用。

**docker image rm $(docker images -a -q)** —删除所有图像。小心这个!请注意,已经被推送到远程注册中心的图像将被保留——这是注册中心的好处之一。😃

现在你知道最基本的 Docker 图像相关命令。我们将在下一篇文章中讨论与数据相关的命令。

Commands are like fruit — nutritious and delicious. Err. Yeah. — Image by silviarita from Pixabay

混杂的

**docker version** —列出关于您的 Docker 客户端和服务器版本的信息。

**docker login** —登录 Docker 注册表。出现提示时,输入您的用户名和密码。

在下一篇文章中出现。推特和红迪网上的读者建议加入这个列表会很好。我同意,所以我在补充。

**docker system prune**—删除所有未使用的容器、未使用的网络和悬挂图像。

**docker system prune -a --volumes**

-a--all的简称。删除不用的图片,不只是悬空的。

--volumes移除未使用的卷。我们将在下一篇文章中更多地讨论卷。

2019 年 2 月 7 日更新:管理命令

在 CLI 1.13 中,Docker 引入了经过逻辑分组和一致命名的管理命令名称。旧的命令仍然有效,但是新的命令使 Docker 更容易上手。这篇文章的原始版本列出了老名字。我已经更新了文章,根据读者的建议使用管理命令名。请注意,这一更改只引入了两个命令名的更改——在大多数情况下,这只是意味着在命令中添加了containerimage。命令的映射是这里是。

包装

如果您刚刚开始使用 Docker,这是三个最重要的命令:

**docker container run my_image** —创建一个新容器并启动它。你可能需要一些旗子。

**docker image build -t my_repo/my_image:my_tag .** —建立形象。

**docker image push my_repo/my_image:my_tag** —将图像推送到远程注册表。

以下是基本 Docker 命令的较大列表:

容器

使用docker container my_command

create —从图像创建容器。
start —启动现有的容器。
run —创建一个新的容器并启动它。
ls —列出正在运行的容器。
inspect —查看一个容器的大量信息。
logs —打印日志。
stop —优雅地停止运行容器。
kill—突然停止容器中的主进程。
rm —删除停止的容器。

形象

使用docker image my_command

build —建立形象。
push —将映像推送到远程注册表。
ls —列出图像。
history —见中间图像信息。
inspect —查看图像的大量信息,包括图层。
rm —删除一幅图像。

混杂的

docker version —列出关于您的 Docker 客户端和服务器版本的信息。
docker login —登录一个 Docker 注册表。
docker system prune —删除所有未使用的容器、未使用的网络和悬挂图像。

要在使用 Docker 时查看 CLI 参考,只需在命令行中输入命令docker。你可以在这里看到 Docker 文档。

现在你真的可以用 Docker 构建东西了!正如我女儿可能会用表情符号说的:🍒 🥝 🍊 🍋 🍉 🍏 🍎 🍇。我想可以翻译成“酷!”所以去和 Docker 一起玩吧!

如果您错过了本系列的早期文章,请查看它们。这是第一个:

[## 学习足够的码头工人是有用的

第 1 部分:概念景观

towardsdatascience.com](/learn-enough-docker-to-be-useful-b7ba70caeb4b)

在本系列的最后一篇文章中,我们将讨论 Docker 中的数据。跟着我,保证你不会错过!

我希望这篇文章对你有所帮助。如果你有,请在你最喜欢的社交媒体频道上给它一些爱。

我写关于数据科学、云计算和其他技术的东西。关注我,在这里阅读更多。

码头上!👏

构建神经网络的经验法则

原文:https://towardsdatascience.com/17-rules-of-thumb-for-building-a-neural-network-93356f9930af?source=collection_archive---------5-----------------------

在本文中,我们将获得一个构建初始神经网络的起点。我们将学习经验法则,例如隐藏层数、节点数、激活等。,并查看 TensorFlow 2 中的实现。

<了解深度学习,了解更多> >

Photo by Dewang Gupta on Unsplash

深度学习提供了各种各样的模型。有了它们,我们可以建立极其精确的预测模型。然而,由于设置参数种类繁多,要找到一个起点可能会令人望而生畏。

在本文中,我们将找到一个构建神经网络的起点,更具体地说是一个多层感知器的例子,但它的大部分是普遍适用的。

这里的想法是回顾经验法则来建立第一个神经网络模型。如果第一个模型的性能合理(最低可接受的精度),则对其进行调优和优化。否则,最好从问题、数据或不同的方法中寻找。

在下面,我们有,

  • 构建神经网络的经验法则,以及
  • 它们在 TensorFlow 2 中用于二进制分类的实现代码。

神经网络

神经网络随着 CNN、RNNs 等有了巨大的进步。随着时间的推移,每种疾病又发展出几种亚型。随着每一项发展,我们都成功地提高了我们的预测能力。

但与此同时,我们成功地让寻找模型构建的起点变得更加困难。

每个模型都有自己的天价索赔。周围有这么多广告牌,很容易分心。

在接下来的内容中,我们将通过使用一些经验法则来构建第一个模型。

经验法则

我们有各种各样的神经网络。其中,一个多层感知器就是深度学习的“hello world”。因此,当你学习或开发深度学习的新模型时,这是一个很好的起点。

以下是建造 MLP 的经验法则。然而,它们中的大多数在其他深度学习模型上是适用的。

  1. 层数:从两个隐藏层开始(不包括最后一层)。
  2. 中间层的节点数(大小):来自 2 的几何级数的数,如 4,8,16,32,…第一层应该是输入数据要素数量的一半左右。下一层的大小是上一层的一半。
  3. 用于分类的输出层的节点数(大小):如果是二进制分类,则大小为 1。对于多类分类器,大小是类的数量。
  4. 回归输出层的大小:如果是单个响应,则大小为 1。对于多响应回归,大小是响应的数量。
  5. 中间层激活:使用relu激活。
  6. 输出层激活:使用sigmoid进行二元分类,softmax进行多类分类器,使用linear进行回归。对于自动编码器,如果输入数据是连续的,最后一层应该是linear,否则,对于二进制或多级分类输入应该是sigmoidsoftmax
  7. Dropout layers: 在除输入层(如果单独定义输入层)以外的每一层后添加 Dropout。将辍学率设置为 0.5 。辍学率> 0.5 是适得其反的。如果您认为 0.5 的比率会正则化太多的结点,则增加图层的大小,而不是将辍学率降低到 0.5 以下。我更喜欢不在输入层设置任何下降。但是如果你觉得必须这么做,把辍学率设为 0.2。
  8. 数据预处理:我假设您的预测值 X 是数值型的,并且您已经将任何分类列转换为 one-hot-encoding。在使用数据进行模型定型之前,请执行数据缩放。使用sklearn.preprocessing中的MinMaxScaler。如果这样做效果不好,请将StandardScaler放在同一个库中。回归中的 y 需要缩放。
  9. 分割数据至训练,有效,测试:使用sklearn.model_selection中的train_test_split。参见下面的例子。
  10. 类别权重:如果您有不平衡的数据,那么设置类别权重以平衡您的model.fit中的损失。对于二元分类器,权重应为:{ 0:1 的数量/数据大小,1:0 的数量/数据大小}。对于极度不平衡的数据(罕见事件),类权重可能不起作用。谨慎添加。
  11. 优化器:使用默认学习率的adam
  12. 分类丢失:对于二元分类使用binary_crossentropy。对于多类,如果标签是一个热编码,使用categorical_crossentropy,否则如果标签是整数,使用sparse_categorical_crossentropy
  13. 回归损失:使用mse
  14. 分类标准:使用accuracy显示正确分类的百分比。对于不平衡数据,还包括tf.keras.metrics.Recall()tf.keras.metrics.FalsePositives()
  15. 回归度量:使用tf.keras.metrics.RootMeanSquaredError()
  16. 历元:从 20 开始,查看模型训练是否显示损失减少和精度提高。如果 20 个时代没有最小的成功,继续前进。如果你取得了一些微小的成功,把 epoch 设为 100。
  17. 批量:从 2 的几何级数中选择批量。对于不平衡的数据集有更大的值,如 128,否则从 16 开始。

高级从业者的额外费用很少

  1. 振荡损耗:如果你在训练时遇到振荡损耗,那么就有收敛问题。尝试降低学习率和/或更改批量大小。
  2. 过采样和欠采样:如果数据不平衡,使用[imblearn.over_sampling](https://imbalanced-learn.readthedocs.io/en/stable/api.html#module-imblearn.over_sampling)中的SMOTE
  3. 曲线移动:如果你必须进行移动预测,例如早期预测,使用曲线移动。下面显示了一个实现curve_shift
  4. 自定义度量:不平衡二进制分类的一个重要度量是误报率。如下面的class FalsePositiveRate()实现所示,您可以构建这个以及类似的其他定制指标。
  5. 卢瑟激活 : selu激活被认为优于所有其他现有激活。我并不总是注意到这一点,但是如果你想使用selu激活,那么就使用kernel_initializer=’lecun_normal’AlphaDropout。在AlphaDropout中使用速率为 0.1,AlphaDropout(0.1)。示例实现如下所示。

TensorFlow 2 中的多层感知器(MLP)示例

我已经在我以前的文章中使用的纸张断裂数据集上实现了 MLP 神经网络(参见使用 Keras 中的自动编码器进行极端罕见事件分类)。

在这个实现中,我们将看到我们在上面的经验法则中提到的元素的例子。

实现在 TensorFlow 2 中完成。如果还没有迁移到 TensorFlow 2,我强烈推荐迁移到 tensor flow 2。它具有 Keras 的所有简单性和显著更好的计算效率。

按照分步指南安装 Tensorflow 2 进行安装。

在下文中,我并不试图找到最佳模式。想法是学习实现。为了简洁,没有跳过任何步骤。相反,这些步骤是冗长的,以帮助读者直接应用它们。

图书馆

%matplotlib inline
import matplotlib.pyplot as plt
import seaborn as snsimport pandas as pd
import numpy as np
from pylab import rcParamsfrom collections import Counterimport tensorflow as tffrom tensorflow.keras import optimizers
from tensorflow.keras.models import Model, load_model, Sequential
from tensorflow.keras.layers import Input, Dense, Dropout, AlphaDropout
from tensorflow.keras.callbacks import ModelCheckpoint, TensorBoardfrom sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, precision_recall_curve
from sklearn.metrics import recall_score, classification_report, auc, roc_curve
from sklearn.metrics import precision_recall_fscore_support, f1_scorefrom numpy.random import seed
seed(1)SEED = 123 #used to help randomly select the data points
DATA_SPLIT_PCT = 0.2rcParams['figure.figsize'] = 8, 6
LABELS = ["Normal","Break"]

要测试您是否使用了正确的 TensorFlow 版本,请运行以下命令,

tf.__version__

读取和准备数据

在这里下载数据。

'''
Download data here:
[https://docs.google.com/forms/d/e/1FAIpQLSdyUk3lfDl7I5KYK_pw285LCApc-_RcoC0Tf9cnDnZ_TWzPAw/viewform](https://docs.google.com/forms/d/e/1FAIpQLSdyUk3lfDl7I5KYK_pw285LCApc-_RcoC0Tf9cnDnZ_TWzPAw/viewform)
'''
df = pd.read_csv("data/processminer-rare-event-mts - data.csv") 
df.head(n=5)  # visualize the data.

将分类列转换为一次性编码

hotencoding1 = pd.get_dummies(df['x28'])  # Grade&Bwt
hotencoding1 = hotencoding1.add_prefix('grade_')
hotencoding2 = pd.get_dummies(df['x61'])  # EventPress
hotencoding2 = hotencoding2.add_prefix('eventpress_')df=df.drop(['x28', 'x61'], axis=1)df=pd.concat([df, hotencoding1, hotencoding2], axis=1)

曲线移动

这是一个时间序列数据,其中我们必须提前预测事件(y = 1)。在此数据中,连续的行相隔 2 分钟。我们将把列y中的标签移动 2 行,进行 4 分钟预测。

sign = lambda x: (1, -1)[x < 0]def curve_shift(df, shift_by):
    '''
    This function will shift the binary labels in a dataframe.
    The curve shift will be with respect to the 1s. 
    For example, if shift is -2, the following process
    will happen: if row n is labeled as 1, then
    - Make row (n+shift_by):(n+shift_by-1) = 1.
    - Remove row n.
    i.e. the labels will be shifted up to 2 rows up.

    Inputs:
    df       A pandas dataframe with a binary labeled column. 
             This labeled column should be named as 'y'.
    shift_by An integer denoting the number of rows to shift.

    Output
    df       A dataframe with the binary labels shifted by shift.
    '''vector = df['y'].copy()
    for s in range(abs(shift_by)):
        tmp = vector.shift(sign(shift_by))
        tmp = tmp.fillna(0)
        vector += tmp
    labelcol = 'y'
    # Add vector to the df
    df.insert(loc=0, column=labelcol+'tmp', value=vector)
    # Remove the rows with labelcol == 1.
    df = df.drop(df[df[labelcol] == 1].index)
    # Drop labelcol and rename the tmp col as labelcol
    df = df.drop(labelcol, axis=1)
    df = df.rename(columns={labelcol+'tmp': labelcol})
    # Make the labelcol binary
    df.loc[df[labelcol] > 0, labelcol] = 1return df

上移两行,

df = curve_shift(df, shift_by = -2)

现在删除时间列。从这里开始就不需要了。

df = df.drop(['time'], axis=1)

将数据分为训练、有效和测试

df_train, df_test = train_test_split(df, test_size=DATA_SPLIT_PCT, random_state=SEED)
df_train, df_valid = train_test_split(df_train, test_size=DATA_SPLIT_PCT, random_state=SEED)

把 X 和 y 分开。

x_train = df_train.drop(['y'], axis=1)
y_train = df_train.y.valuesx_valid = df_valid.drop(['y'], axis=1)
y_valid = df_valid.y.valuesx_test = df_test.drop(['y'], axis=1)
y_test = df_test.y

数据缩放

scaler = MinMaxScaler().fit(x_train)
# *scaler = StandardScaler().fit(x_train)*
x_train_scaled = scaler.transform(x_train)
x_valid_scaled = scaler.transform(x_valid)
x_test_scaled = scaler.transform(x_test)

MLP 模型

自定义指标:false position verate()

我们将开发一个FalsePositiveRate()指标,用于下面的每个模型。

class FalsePositiveRate(tf.keras.metrics.Metric):
    def __init__(self, name='false_positive_rate', **kwargs):
        super(FalsePositiveRate, self).__init__(name=name, **kwargs)
        self.negatives = self.add_weight(name='negatives', initializer='zeros')
        self.false_positives = self.add_weight(name='false_negatives', initializer='zeros')

    def update_state(self, y_true, y_pred, sample_weight=None):
        '''
        Arguments:
        y_true  The actual y. Passed by default to Metric classes.
        y_pred  The predicted y. Passed by default to Metric classes.

        '''
        # Compute the number of negatives.
        y_true = tf.cast(y_true, tf.bool)

        negatives = tf.reduce_sum(tf.cast(tf.equal(y_true, False), self.dtype))

        self.negatives.assign_add(negatives)

        # Compute the number of false positives.
        y_pred = tf.greater_equal(y_pred, 0.5)  # Using default threshold of 0.5 to call a prediction as positive labeled.

        false_positive_values = tf.logical_and(tf.equal(y_true, False), tf.equal(y_pred, True)) 
        false_positive_values = tf.cast(false_positive_values, self.dtype)
        if sample_weight is not None:
            sample_weight = tf.cast(sample_weight, self.dtype)
            sample_weight = tf.broadcast_weights(sample_weight, values)
            values = tf.multiply(false_positive_values, sample_weight)

        false_positives = tf.reduce_sum(false_positive_values)

        self.false_positives.assign_add(false_positives)

    def result(self):
        return tf.divide(self.false_positives, self.negatives)

自定义性能绘图功能

我们将编写两个绘图函数来可视化损失进度和准确性度量。我们将在下面构建的模型中使用它们。

def plot_loss(model_history):
    train_loss=[value for key, value in model_history.items() if 'loss' in key.lower()][0]
    valid_loss=[value for key, value in model_history.items() if 'loss' in key.lower()][1]fig, ax1 = plt.subplots()color = 'tab:blue'
    ax1.set_xlabel('Epoch')
    ax1.set_ylabel('Loss', color=color)
    ax1.plot(train_loss, '--', color=color, label='Train Loss')
    ax1.plot(valid_loss, color=color, label='Valid Loss')
    ax1.tick_params(axis='y', labelcolor=color)
    plt.legend(loc='upper left')
    plt.title('Model Loss')plt.show()def plot_model_recall_fpr(model_history):
    train_recall=[value for key, value in model_history.items() if 'recall' in key.lower()][0]
    valid_recall=[value for key, value in model_history.items() if 'recall' in key.lower()][1]train_fpr=[value for key, value in model_history.items() if 'false_positive_rate' in key.lower()][0]
    valid_fpr=[value for key, value in model_history.items() if 'false_positive_rate' in key.lower()][1]fig, ax1 = plt.subplots()color = 'tab:red'
    ax1.set_xlabel('Epoch')
    ax1.set_ylabel('Recall', color=color)
    ax1.set_ylim([-0.05,1.05])
    ax1.plot(train_recall, '--', color=color, label='Train Recall')
    ax1.plot(valid_recall, color=color, label='Valid Recall')
    ax1.tick_params(axis='y', labelcolor=color)
    plt.legend(loc='upper left')
    plt.title('Model Recall and FPR')ax2 = ax1.twinx()  # instantiate a second axes that shares the same x-axiscolor = 'tab:blue'
    ax2.set_ylabel('False Positive Rate', color=color)  # we already handled the x-label with ax1
    ax2.plot(train_fpr, '--', color=color, label='Train FPR')
    ax2.plot(valid_fpr, color=color, label='Valid FPR')
    ax2.tick_params(axis='y', labelcolor=color)
    ax2.set_ylim([-0.05,1.05])fig.tight_layout()  # otherwise the right y-label is slightly clipped
    plt.legend(loc='upper right')
    plt.show()

型号 1。基线。

n_features = x_train_scaled.shape[1]
mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, activation='relu'))
mlp.add(Dense(16, activation='relu'))
mlp.add(Dense(1, activation='sigmoid'))
mlp.summary()mlp.compile(optimizer='adam',
            loss='binary_crossentropy',
            metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
           )history = mlp.fit(x=x_train_scaled,
                  y=y_train,
                  batch_size=128,
                  epochs=100,
                  validation_data=(x_valid_scaled, y_valid),
                  verbose=0).history

查看模型拟合损失和精确度(召回和 FPR)进度。

plot_loss(history)

plot_model_recall_fpr(history)

型号 2。等级权重。

根据经验法则定义类别权重。

class_weight = {0: sum(y_train == 1)/len(y_train), 1: sum(y_train == 0)/len(y_train)}

现在,我们将训练模型。

n_features = x_train_scaled.shape[1]mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, activation='relu'))
mlp.add(Dense(16, activation='relu'))
mlp.add(Dense(1, activation='sigmoid'))mlp.summary()mlp.compile(optimizer='adam',
            loss='binary_crossentropy',
            metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
           )history = mlp.fit(x=x_train_scaled,
                  y=y_train,
                  batch_size=128,
                  epochs=100,
                  validation_data=(x_valid_scaled, y_valid),
                  class_weight=class_weight,
                  verbose=0).historyplot_loss(history)

plot_model_recall_fpr(history)

型号 3。退学正规化。

n_features = x_train_scaled.shape[1]mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, activation='relu'))
mlp.add(Dropout(0.5))
mlp.add(Dense(16, activation='relu'))
mlp.add(Dropout(0.5))
mlp.add(Dense(1, activation='sigmoid'))mlp.summary()mlp.compile(optimizer='adam',
            loss='binary_crossentropy',
            metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
           )history = mlp.fit(x=x_train_scaled,
                  y=y_train,
                  batch_size=128,
                  epochs=100,
                  validation_data=(x_valid_scaled, y_valid),
                  class_weight=class_weight,
                  verbose=0).historyplot_loss(history)

plot_model_recall_fpr(history)

型号 4。过采样-欠采样

使用 SMOTE 重采样器。

from imblearn.over_sampling import SMOTE
smote = SMOTE(random_state=212)
x_train_scaled_resampled, y_train_resampled = smote.fit_resample(x_train_scaled, y_train)
print('Resampled dataset shape %s' % Counter(y_train_resampled))

n_features = x_train_scaled.shape[1]mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, activation='relu'))
mlp.add(Dropout(0.5))
mlp.add(Dense(16, activation='relu'))
mlp.add(Dropout(0.5))
mlp.add(Dense(1, activation='sigmoid'))mlp.summary()mlp.compile(optimizer='adam',
            loss='binary_crossentropy',
            metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
           )history = mlp.fit(x=x_train_scaled_resampled,
                  y=y_train_resampled,
                  batch_size=128,
                  epochs=100,
                  validation_data=(x_valid, y_valid),
                  class_weight=class_weight,
                  verbose=0).historyplot_loss(history)

plot_model_recall_fpr(history)

模型 5。卢瑟激活。

我们使用selu激活,这种激活因其自规范化特性而流行起来。

注意:

  • 我们用了一个kernel_initializer=’lecun_normal’
  • 作为AlphaDropout(0.1)辍学。
n_features = x_train_scaled.shape[1]mlp = Sequential()
mlp.add(Input(shape=(n_features, )))
mlp.add(Dense(32, kernel_initializer='lecun_normal', activation='selu'))
mlp.add(AlphaDropout(0.1))
mlp.add(Dense(16, kernel_initializer='lecun_normal', activation='selu'))
mlp.add(AlphaDropout(0.1))
mlp.add(Dense(1, activation='sigmoid'))mlp.summary()mlp.compile(optimizer='adam',
            loss='binary_crossentropy',
            metrics=['accuracy', tf.keras.metrics.Recall(), FalsePositiveRate()]
           )history = mlp.fit(x=x_train_scaled,
                  y=y_train,
                  batch_size=128,
                  epochs=100,
                  validation_data=(x_valid, y_valid),
                  class_weight=class_weight,
                  verbose=0).historyplot_loss(history)

plot_model_recall_fpr(history)

结论

  • 凭借深度学习提供的所有预测建模能力,开始也可能会令人不知所措。
  • 本文中的经验法则提供了构建初始神经网络的起点。
  • 由此构建的模型应该进一步调整以提高性能。
  • 如果用这些经验法则构建的模型性能没有一些最低性能。进一步调优可能不会带来太大的改善。尝试另一种方法。
  • 本文展示了在 TensorFlow 2 中实现神经网络的步骤。
  • 如果您没有 TensorFlow 2,建议迁移到它,因为它带来了(keras)实施的简易性和高性能。参见此处的说明,安装 Tensorflow 2 的分步指南。

阅读我的其他文章以获得更深入的学习理解、模型和实现

使用 Keras 中的自动编码器进行极端罕见事件分类。

理解辍学背后的简化数学。

LSTM 用于 Keras 极端罕见事件分类的自动编码器。

逐步了解 LSTM 自动编码器图层。

构建正确的自动编码器——使用 PCA 原理进行调整和优化。第一部分。

构建正确的自动编码器——使用 PCA 原理进行调整和优化。第二部分。

19 个实体对应 104 种语言:NER 的新时代

原文:https://towardsdatascience.com/19-entities-for-104-languages-a-new-era-of-ner-with-the-deeppavlov-multilingual-bert-1bfa6d413ea6?source=collection_archive---------4-----------------------

世界数据科学界几乎没有人不同意 BERT 的发布是 NLP 领域最激动人心的事件。

对于那些还没有听说过的人来说:BERT 是一种基于 transformer 的技术,用于预处理上下文单词表示,能够在各种自然语言处理任务中实现最先进的结果。伯特论文被公认为最好的长篇论文👏计算语言学协会北美分会颁发的年度大奖。Google Research】发布了几个预训练的 BERT 模型,包括多语言、中文和英文的 BERT。

我们开发了DeepPavlov——一个对话式人工智能框架,包含了构建对话系统所需的所有组件。在 BERT 发布之后,我们惊讶于它可以解决的各种各样的任务。

我们决定将 BERT 集成到三个流行的 NLP 任务的解决方案中:文本分类,标记和问题回答。在本文中,我们将详细告诉你如何在 DeepPavlov 中使用基于 BERT 的命名实体识别(NER)。

NER 简介

命名实体识别 ( NER) 是自然语言处理中最常见的任务之一,我们可以把它表述为:

给定一个标记序列(单词,可能还有标点符号),为序列中的每个标记提供预定义标记集中的一个标记。

下面带标签的句子是我们的演示中 NER 的输出,其中蓝色代表人物标签,绿色代表位置,黄色代表地理位置,灰色代表日期时间。

DeepPavlov NER 模型支持 19 个标签:ORG(组织)、GPE(国家、城市、州)、LOC(位置)、EVENT(命名的飓风、战役、战争、体育赛事)、DATE、CARDINAL、MONEY、PERSON 等。迪普巴洛夫的 NER 模型在命令行中处理的句子如下所示。

>> Amtech , which also provides technical temporary employment services to aerospace , defense , computer and high - tech companies in the Southwest and Baltimore - Washington areas , said its final audited results are due in late November .
['B-ORG', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-LOC', 'O', 'B-GPE', 'O', 'B-GPE', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'B-DATE', 'I-DATE', 'O']

为了区分具有相同标签的相邻实体,使用生物标记方案,其中“B”表示实体的开始,“I”代表“内部”并且用于组成该实体的除第一个词之外的所有词,而“O”表示不存在实体。

NER 有各种各样的商业应用📈。例如,NER 可以通过从简历中提取重要信息来帮助人力资源部门评估简历。此外,NER 可用于识别客户请求中的相关实体,如产品规格、部门或公司分支机构的详细信息,以便对请求进行相应分类并转发给相关部门。

如何在 DeepPavlov 中使用基于 BERT 的 NER 模型

任何预先训练的模型都可以通过命令行界面(CLI)和 Python 进行推理。在使用该模型之前,请确保使用以下命令安装了所有必需的软件包:

python -m deeppavlov install ner_ontonotes_bert_multpython -m deeppavlov interact ner_ontonotes_bert_mult [-d]

其中 ner_ontonotes_bert_mult 表示配置文件的名称。

您可以通过 Python 代码与模型进行交互。

此外,DeepPavlov 包含一个基于 RuBERT 的模型,用于处理俄语数据。总的来说,基于 BERT 的模型比基于 bi-LSTM-CRF 的模型有实质性的改进。在这里,您可以看到基于英语和俄语的模型的性能。

The performance of the DeepPavlov’s NER models.

多语言零镜头传输

多语言 BERT 模型允许执行从一种语言到另一种语言的零转换。模型 ner_ontonotes_bert_mult 在 ontonotes 语料库(英语)上训练,该语料库在标记模式中具有 19 种类型。您可以在不同的语言上测试模型。

在德语、俄语、汉语和越南语的四个 NER 测试集上评估了多语言模型的性能。这些是转让的结果。

The performance of the Multilingual model while tested on four test sets

如何为 NER 配置 BERT

DeepPavlov NLP 管道在 config/faq 文件夹下的单独的配置文件中定义。配置文件由四个主要部分组成:数据集 _ 读取器数据集 _ 迭代器链接器训练器

所有基于 BERT 的模型的公共元素是配置文件的链接器部分中的 BERT 预处理器(在 ner 的情况下是 bert_ner_preprocessor 类)块。未处理的文本(即“Alex goes to Atlanta”)应该被传递到 bert_ner_preprocessor 用于标记化成子标记,用它们的索引编码子标记,并创建标记和段掩码。 tokens 参数本身包含一个语句记号列表( ['Alex ',' goes ',' to ',' Atlanta ']【T11]), subword_tokenstokens 带特殊记号( ['[CLS]',' Alex ',' goes ',' to ',' Atlanta ','[SEP]'] 【T19)。 subword_tok_ids 包含记号 id, subword_masks 是一个列表,0 表示特殊记号,1 表示句子的记号([0 1 1 1 1 0】)。**

{
 "class_name": "bert_ner_preprocessor",
 "vocab_file": "{BERT_PATH}/vocab.txt",
 "do_lower_case": false,
 "max_seq_length": 512,
 "max_subword_length": 15,
 "token_maksing_prob": 0.0,
 "in": ["x"],
 "out": ["x_tokens", "x_subword_tokens", 
         "x_subword_tok_ids", "pred_subword_mask"]
 }

所以,这就是我们想告诉你的关于我们多语言的伯特 NER 的一切。我们希望这是有帮助的,你会渴望使用迪普帕洛夫 NER 模型😃你可以在这里阅读更多关于他们的信息。也可以使用我们的演示来测试我们基于 BERT 的模型。别忘了 DeepPavlov 有一个论坛——只要在这里问我们任何关于框架和模型的问题,我们会尽快与您联系。敬请期待!

19 种在各种领域使用信息可视化的创新方法

原文:https://towardsdatascience.com/19-innovative-ways-to-use-information-visualization-across-a-variety-of-fields-edba0613136d?source=collection_archive---------14-----------------------

当大量的数据以数字的形式出现在电子表格中时,在房间里听到呻吟声并不罕见。如果有大量的变量和时间框架,情况会更糟。

信息可视化可以带来巨大的不同。

将数字、百分比、统计、差异、比率和其他类型的无聊的数字数据转化为创造性的可视化数据,可以立即使任何信息看起来更有趣。

在本文中,您将找到一系列创造性的可视化信息,如图表、图表、图解、地图和其他用于您的下一个项目的想法。

1.流图

流图是堆积面积图的变体。

但是这些值不是沿着直轴,而是沿着中心线移动,该中心线随着值的形状而变化。它的目的是可视化不同类别的数据。

Image Source

数值的不同形状和大小使图形看起来像一条流动的河流。注意每个值或溪流是如何用不同的颜色来使图表更容易阅读的。

上面的蓝色和蓝绿色流图显示了 iPad 发布后的一个周末。这一可视化结果发表在《哈佛商业评论》上,它很好地展示了推文中使用的每个词的价值,并更好地理解了用户的反应。

这种信息可视化的第二个例子是有史以来最大的流图之一。这是一个发表在《纽约时报》上的互动可视化。

Image Source

这个流图中的数据是根据电影上映日期从票房收入中提取的。它是交互式的,所以用户可以点击哪怕是最小的溪流,看看它们代表什么。

点击这里体验一下。

何时使用流图

由于流图没有固定的 x 轴,过多的数据会使事情变得复杂。它们最适合有限的类别,因此重叠不会影响数据的可读性。

使用对比色或互补色,让图表看起来更漂亮。如果你能增加互动性,那就去做吧!这将使你的流图更加有趣和有效。

请记住,流图是用来可视化随时间变化的数据的。如果你经营一家电子商务公司,你可以使用流图来显示一种款式的服装在一年中特定时间的销售情况。

你可以使用像 Displayr 这样的工具来创建一个流图或者雇佣一个数据设计师。

2.桑基图

桑基图用于可视化定量流及其相互之间的比例。线条的粗细取决于流量的大小。

这些可以被视为箭头或线条,当它们穿过图表时,可以根据它们前进的方向分开或合在一起。

Image Source

你可能认识这种风格的图表,因为它在你的谷歌分析中使用。Google Analytics Sankey 图直观地显示了访问者如何在你的网站中移动,以及他们停留在哪些页面上。

桑基图对于可视化用户、金钱或能量所走的路径非常有用。它可以被创建为一个大图或一组小图。

以下是桑基图的更多例子。

第一个是概念仪表板,使用 Sankey 图来可视化电子邮件驱动的导航。这个 Sankey 概念有不同的部分,指定不同的电子邮件流程。

Image Source

点击此链接查看设计师如何解释读图的正确方法。如果您有一个 Tableau 帐户,您可以使用此工作簿创建自己的桑基图。

另一个交互式桑基图的例子是用来自【2018 年福布斯 NFL 估值的数据创建的。下面可以快速看一下。

点击此处查看互动版。

何时使用桑基图

就像其他类型的信息可视化一样,如果有太多的数据需要显示,桑基图会非常混乱。知道你是否需要桑基图的最好方法是分析你的数据是关于一个过程还是价值流。

例如,它将用于可视化预算或利润如何再投资。您还可以选择使用 Sankey 图来可视化机场中的乘客活动数据。

创建 Sankey 图有几种不同的工具,Tableau 就是其中之一。但是您也可以尝试使用桑基图生成器为自己创建一个。

3.弦图

和弦图用于可视化不同组之间的相互关系。

组或实体的值组织在一个圆中,它们之间的关系用不同颜色的曲线创建和显示。

Image Source

弦图有利于可视化大量数据,但是如果有太多的变量,就会在视觉上变得混乱。这可以通过使用交互性来最小化,交互性允许观众选择变量或区域,使所有其他变量或区域消失或设置在覆盖图后面。

上面的和弦图是我们最喜欢的艺术家之一 Nadieh Bremer 的例子。它可视化了一大群荷兰国民以及他们选择智能手机的相关数据。

连接曲线显示了从一个手机品牌到另一个品牌的变化,而小山则表示没有任何变化。点击此处查看和弦图如何工作以及她是如何创建这个和弦图的。

何时使用和弦图

和弦图通常看起来很漂亮,但对于不理解复杂数据可视化的人来说可能会感到困惑。只有当你能够解释它是如何工作的,以及你的观众如何阅读和理解它时,你才应该选择这种类型的信息可视化。

一如既往,使用交互性是实现这一点的好方法。对于上面的例子,Nadieh 围绕可视化创建了一个故事,以便观众可以更好地理解正在发生的事情。

如果你想让你的数据看起来很漂亮,就使用弦图。

请记住,这些图表是关于组或实体之间的相互关系。一组关于一段时间内某样东西是如何被使用的数据在弦图上是不起作用的。

4.等值区域图

choropleth 是与地图中的区域相关的数据的地理信息可视化。

choropleth 地图上显示的区域可以代表您想要的任何东西,如国家、县、城市或社区。这完全取决于需要可视化什么。

Image Source

这些颜色被设置为相同色调或不同颜色的渐进性颜色强度。如果颜色太醒目或令人不快,数据将难以理解。

上面的 choropleth 地图是由 Mike Bostock 根据 2016 年美国的失业率数据制作的。颜色部分由每个州内的县定义。他只使用白线来分隔各州,这样就不会使可视化更加拥挤。

何时使用 choropleth 地图

当您需要可视化地理数据时,请使用 choropleth 地图。用于这种类型的信息可视化的最准确的数据类型应该是标准化的,而不是原始的。

例如,与其简单地用每个地区的人口数量,不如用每平方公里的人口密度来代表每个地区。

Choropleth 地图也最好与适用于所有地区的单一类型的值一起使用。如果使用不同的数据值,choropleth 可能不是最好的可视化方式。

您可以使用地图引擎用 Visme 制作一个 choropleth。

在 Visme 中,只需选择需要可视化的区域,插入数据并自定义颜色。您也可以从 Excel 或 Google 工作表导入数据,然后调整颜色和标签。

看看这个关于在 Visme 中制作交互式地图的视频。

或者使用本指南更好地了解如何创建令人惊叹的 choropleth 地图。

5.十六进制地图

六边形地图类似于 choropleth,但是这些区域在视觉上变成了六边形。目的是均衡区域的大小,这样就不会有区域看起来比其他区域更重要。

Image Source

保持你正在观察的主要区域的原始形状是很重要的,这样观众才知道他们在看什么。

何时使用十六进制地图

使用 choropleth 的原因同样适用于使用十六进制映射。用于这种可视化的最佳数据集应该简单且没有变量。

每个区域应该只显示一个值,这将赋予它特定的颜色。

您可以将多种类型的值应用于地理区域,这意味着十六进制地图可以极大地丰富您的内容。

6.交互式多边形地图

地理数据信息可视化的另一种创新形式是交互式多边形地图。不同之处在于,这一个在每个区域可以有三个值。

它遵循六边形贴图的前提,在六边形贴图中,每个区域都是一个形状,并且大小都相同。不同之处在于形状是三维的,每条边代表一个值。

Image Source

另一个区别是,所使用的值既不是百分比也不是标准化值,而是设置描述性的值,如上例所示。

上面的例子是由 David Velleca 创建的,是 Tableau 中的一个公共工作簿。他设计它来可视化每个州最常见的姓氏,使用前三个作为显示在形状两侧的值。

地图下方是一个条形图,显示地图中包含的所有姓氏。您可以使用他的工作簿创建交互式多边形地图来可视化您自己的数据。

点击这里体验互动版。

何时使用交互式多边形地图

当您有大量的值,但希望显示每个地区的三个主要值时,可以使用这种信息可视化样式。

正如我们之前提到的,用于多边形地图的数据类型应该设置为描述性值,而不是整体的百分比。

例如,您可以使用“前三名”或“最少三名”这样的值增加交互性只会让阅读和理解地图变得更加愉快。

7.脊线图

Rigdeline 地块过去被称为“joyplots ”,因为它们类似于 1979 年 Joy Division 专辑《未知的快乐》中的插图。这个术语后来被改成了“山脊线地块”,因为 Joy Division 最初用他们的名字“T1”来指代它。

撇开音乐和纳粹历史不谈,脊线图是一种密度图。它的主要目的是显示一段时间内几个组的值的分布。

Image Source

脊线中的“脊”重叠,从而产生脊线效果。用于这种可视化风格的最佳数据是在特定时期具有高值的数据。

上面的例子是一个山脊线图,显示了 2016 年内布拉斯加州林肯市的气温。根据数值变量而不是类别给脊着色。要查看更多具有其他颜色变化的脊线图,请单击下图旁边的链接。

何时使用脊线图

使用脊线图的最佳时机是希望数据易于阅读且视觉效果丰富的时候。

山脊线图是非常直观的图表,其目的并不完全独特。其他图表可以很好地显示相同的数据。山脊线的独特之处在于它看起来有多酷。

但要让它看起来像这样,数据必须以某种方式排序,这样最终结果乍一看是可以理解的。这是因为有些值隐藏在前面的脊后面。

在轴的特定部分需要有高值数据点,以便形成脊。如果数据变量少于六个,视觉效果就不会那么强烈。在这种情况下,最好选择另一种类型的密度图。

8.箱形图

箱线图是一种可视化数据分布和可变性的图表。箱线图有不同的部分,代表数据集的特定部分。这是一个箱线图的例子。

Image Source

实际方框代表两个部分的四分位数范围。

两个四分位之间的线是中间值。中位数左边是第 25-50 百分位,右边是第 50-75 百分位。

从盒子中延伸出来的是触须,它将上下四分位数中的变量可视化。胡须边缘的线条是数据集的最小值和最大值。如果有任何异常值,它们将被标绘为最小值和最大值之外的点。

请记住,箱形图可以是水平的,也可以是垂直的。选择使用哪一个将取决于您需要可视化多少数据集。

何时使用箱线图

如果您必须可视化数据分布和可变性,箱线图是一个不错的选择。如果你想为一个统一的主题比较不同的数据集,它是完美的。

此外,箱线图以一种显示数据是对称还是偏斜的方式来可视化数据。它在以一种容易理解的方式显示异常值方面也做得很好。

9.交互式决策树

拥有大量信息的网站有时会让人不知所措。使用交互式决策树可以帮助你的访问者决定他们需要从你的内容中得到什么。

决策树基本上是一个流程图,但与其静态对应物略有不同。决策树的独特之处在于它是完全交互式和直观的。

下面是一个交互式决策树的例子。

Image Source

上面的例子显示了 Viz 网站的数据中的交互决策树。Data to Viz 是一个关于数据可视化的在线百科全书,交互式决策树帮助用户为他们的项目选择正确的信息可视化。

点击这里查看交互式决策树的运行。

何时使用交互式决策树

交互式决策树的最佳用途是让别人更容易浏览您的数据。这些数据需要用关键词和描述来索引。

例如,考虑一个关于一个国家不同地区的水健康的复杂实验室实验。结果和研究可以被索引,以便学生或读者可以根据水体或另一个值(如一种细菌)来浏览数据。

10.树形图

树形图是一种分层图表,用于显示不同类别中事物的值。这些值被可视化为较大矩形内的正方形和矩形。

Image Source

最大值放在左上角,递减值按时钟方向显示,最小值放在右下角。

这是另一个更复杂的树形图设计的例子。

Image Source

何时使用树形图

树状图是一种有用的信息可视化类型,可以包含在文章、博客帖子、年度报告和其他关于给定数据集的长篇出版物中。

正如你在上面的树状图中所看到的,它们与颜色搭配起来会更好。用像 Vizzlo 这样的树状图制作工具制作树状图很容易。

11.圆形包装

圆形包装可视化类似于树形图,因为它显示分层关系。

较大的圆圈包含较小但相关的值。在每一部分内,圆圈由大到小按顺时针螺旋排列。

Image Source

圆圈的大小代表一个值,但可能发生的情况是,实际的数值无法从完整的可视化中辨别出来。圆形包装更像是一种解释性的层次可视化,而不仅仅是一种数字数据可视化。

上面的圆形包装示例显示了世界人口在 250 个国家的重新分配。它首先按洲,然后按地区,最后按国家来划分国家。

点击这里体验互动版。

何时使用圆形包装可视化

当您需要演示一组具有强层次值的数据时,请使用圆形包装可视化。如果有大量的值需要可视化,那么让图表具有交互性是个不错的主意。圆圈的大小取决于数据的数值。

您可以使用 Visme 轻松创建圆形包装可视化。如果有必要,您还可以为其添加交互性,甚至一些音频旁白。以下是你如何做到这一点。

在编辑器中,简单地添加不同大小的圆形。然后,用特定的颜色对它们进行定制,并根据数据进行排列。你可能需要做一些数学计算来知道圆圈的确切大小。完成后,添加互动链接和悬停效果。

12.三维散点图

散点图是沿 y 轴和 x 轴显示相关数据的常用可视化工具。3D 散点图通过添加 z 轴更进一步。

Image Source

如果点有颜色,那么另一个值也可以添加到数据中。这种类型的信息可视化最适合交互,因此您可以从不同的角度查看图表。

上面的例子是用人工智能工具创建的交互式 3D 散点图的屏幕截图。这个链接会带你去数据示例,你可以用它来制作你自己的数据示例。

何时使用三维散点图

3D 散点图最适用于包含大量变量的大量数据集。

请记住,与散点图一样,用于 3D 散点图的数据需要是相关数据。当数据有两个或三个以上的相关值时,使用三维散点图。

13.网络图

网络图有时被称为网络图,但我们不要把它与计算机功能图相混淆。网络图信息可视化的目的是借助节点和链接来显示事物之间的联系。

Image Source

需要仔细计算节点和链接的数量。如果太多,图表将开始看起来像一个毛球,变得无法阅读。

像其他类型的可视化一样,这种方式在交互时效果最好。

上面的网络图是研究人员如何出现在其他研究人员的科学论文中的可视化。研究人员是节点,线是相互联系的纽带。

点击此处了解更多关于这个可视化项目的信息。

何时使用网络图

当您想要显示不同类别中的事物之间的联系以及这些类别如何相互联系时,请使用这种类型的信息可视化。

例如,您可以使用网络图来显示文学人物之间的联系,或者像迪士尼皮克斯世界中的人物那样更有趣的东西。

14.小提琴情节

小提琴图类似于箱线图,但可以更深入地理解变量的分布。在这种类型的数据可视化中,每个“小提琴”代表一个组或变量,小提琴的形状显示了该特定变量中数据点的密度。

这里有一个小提琴情节的例子。

Image Source

上面的例子显示了小鸡体重和饲料类型之间的关系。你可以在这里找到更多关于小提琴的情节和这个特定的。

箱线图和小提琴图的主要区别在于,后者显示了更多的信息,例如几个组或变量的分布和排名。

何时使用小提琴情节

尽管小提琴图比箱线图显示更多的信息,但它并不常用。

当您处理非常大的数据集并需要可视化单个观察值和分布时,这种类型的信息可视化特别有用。

Violin 图可以垂直和水平形状创建,这取决于您的数据类型和数据集的大小。

15.实时跟踪器

实时可视化数据是为任何项目增添活力的好方法。任何类型的正在进行的数据都可以通过实时跟踪器可视化。

天气模式、空气质量、体育比分、列车时刻表延误和交通状况是一些可以使用实时跟踪器可视化的数据类型。

Image Source

上面的例子是一个实时追踪器,显示了泰国曼谷市的空气质量和污染指数。每个住在曼谷的人都使用这个追踪器来查看他们那天是否真的需要外出,以及他们可能需要使用哪种类型的呼吸面罩。

在 177 分的一天,学校取消室外体育课,有呼吸问题的人被建议留在室内。

点击这里查看这个交互式实时追踪器。

何时使用实时追踪器

实时追踪器非常适合为公众提供服务的实用应用和网站。它非常适合显示不断变化的数据,这些数据会影响决策和结果。

Visme 图形引擎有许多图表、图形和数据小部件,可以可视化实时数据。尝试一个,看看对你的项目有没有帮助。

您可以使用 Visme 编辑器中的任何数据图表创建实时信息可视化。只需从 Excel 或 Google 工作表中上传您的数据,并展示实时或现场数据。你可以把它用在图表上,甚至是地图上。

16.视觉年度报告

如果你的公司有一个强大的创意团队,那么你可能已经在发布可视化的年度报告了。但是,如果你每年都发布一大堆螺旋装订的电子表格和冗长乏味的文本,也许是时候改变一下了。

下面的视觉年度报告是由凤凰传媒为透明媒体设计的。

Image Source

每年最好的视觉年度报告通常由创意人员和惊讶的客户在网上发布。有些甚至赢得了设计奖。现在,这是一个营销渠道,我敢打赌,你甚至没有想到!

上面的年度报告获得了一个通信设计红点奖。他们使用激光切割方法,重建了一个剧院舞台,将公司的愿景和价值观可视化。

制作自己的可视化年度报告

一份出色的可视化年度报告可以遵循一本书或一本电子书的经典格式。

使用 Visme,您可以创建许多不同种类的视觉丰富的图表和图形,以包括在您的年度报告中。尝试在有趣的形状作物和彩色字体中加入摄影。

在 Visme 中创建可视化年度报告不需要成为设计师。但是如果真的没有时间自己做,也可以请设计师或者设计机构帮你做。

Visme 有许多漂亮的年度报告模板,你可以为自己的公司定制。在演示文稿、信息图表和可打印文档之间进行选择。只需将您的内容插入到模板中,您就可以获得一份直观且富有创意的年度报告!

17.亲笔文件

2014 年,微软创建了一个交互式数字表格,其屏幕可以以 3D 形式显示数据。

它非常类似于全息投影的样子,但仍然显示在 2D 表面上。这种类型的可视化仍在增长,并将在未来几年继续增长。

从 2014 年的第一批全息桌子开始,微软现在有了 Hololens,这是一套 VR 护目镜,让用户以全息形式看到数据。

在下面的视频中,你已经看到了全息桌子的作用。如你所见,它适用于许多类型的数据,从地图到星球大战纪念品。

何时使用全息可视化

作为博物馆展览的一部分,全息摄影桌将是令人惊讶的,让参观者发现数据。关于科学、地理或医学的教育项目也可以使用这种类型的可视化。

对于小数据集或者如果你需要一篇文章的视觉效果,它可能不是合适的工具。这种类型的信息可视化绝对适用于大规模的情况。

18.虚拟现实

另一个将数据可视化的创新想法是使用虚拟现实。几乎每一种信息可视化都可以变成虚拟现实体验。

看看这个由 Ogilvy CommonHealth Worldwide 和 Patient Connect 合作创建的很酷的虚拟现实可视化患者数据。

何时使用虚拟现实可视化

在会议和研讨会上,虚拟现实仍然很受欢迎。不管你在哪个领域,给你的客人一副虚拟现实护目镜和一个指针,炫耀你的数据。

让他们发现你的信息,让他们惊叹这一切看起来有多神奇!

19.增强现实

增强现实是这些年来悄悄进入我们生活的东西之一。

虚拟现实和现实生活的混合,增强现实所做的是将你的周围环境和数字信息混合在一起。这可以通过特殊的 AR 护目镜实现。

这是一位艺术家对增强现实将如何发展的描绘。

Image Source

有人试图让这成为一种趋势,比如几年前的谷歌眼镜。实际上,新的谷歌眼镜现在使用人工智能,并开始融入增强现实。

可视化和增强现实之间的联系是,可以显示用户正在查看的任何数据。想法和用途真的是无穷无尽的。从超市货架上展示的即时饮食信息到查看公交车时的交通和天气信息。

微软最近发布了 Hololens,这是一套看起来像巨大太阳镜的 AR 镜头,适用于需要一次显示大量数据的大企业,就像在工厂车间一样。

Image Source

点击此处了解更多关于微软 Hololens 的信息。

我们迫不及待地想看到所有这些技术如何发展,这样我们就可以用它来创建更好的数据可视化!

何时使用增强现实可视化

随着增强现实越来越受欢迎,大多数大公司应该考虑将它纳入他们的剧目。由于几乎任何类型的数据都可以使用增强现实来显示,所以首先需要弄清楚可以创建什么来帮助消费者。

增强现实可视化是作为应用程序创建的,然后加载到 AR 镜头上。

例如,一个艺术画廊可以创建关于展出艺术品的增强现实可视化。显示的数据可以是历史性的、信息性的或娱乐性的。一幅名画可以展示艺术家的原始草图来展示创作过程。

你是如何使用信息可视化的?

信息可视化的使用是多种多样和创造性的。

有这么多不同的选择,很难做出选择。我们希望这篇文章已经帮助你看到了新的和创新的方法来可视化你的数据和信息。

上面的许多信息可视化想法都可以用 Visme 中的工具来创建。试试地图引擎、图形引擎或者直观数据小工具。可以免费报名!

我们错过了任何类型的创造性信息可视化吗?我们希望收到您的来信!请在下面的评论区告诉我们您的建议、反馈和问题。

本帖 原版 最早出现在 Visme 的 视觉学习中心

19 岁的计算机视觉研究工程师——怎么做?

原文:https://towardsdatascience.com/19-year-old-senior-machine-learning-engineer-how-8d2e45dc845e?source=collection_archive---------15-----------------------

Not ML related, but fun stuff!

我从高中不及格到简历研究工程师的旅程!

我是谁?

当我在高中的时候,我是一个不及格的人。我的平均绩点刚刚超过 1.8,我无法专心学习一门学科,这让我的老师和学术顾问非常反感。三个学期的英语,两个学期的自然科学,两个学期的西班牙语,以及更多不足的分数将永远留在我的记录上。

在大二的最后一个学期,我发现自己对解决问题和数学有着特别的兴趣,在代数 2 中我获得了第一个 A,这让我的热情像滚雪球一样越滚越大。不必记忆各种琐事或花费数小时阅读,仍然能够理解我在课堂上学到的数学技术,这在我心中点燃了一股从未有过的火。

快进到我大三的开始,我重新发现了我一直以来最喜欢的游戏之一:《我的世界》。是的,那个《我的世界》。足以说,我把我的公平份额的时间;然而,真正引起我兴趣的是编程方面。在我来的时候,服务器开发社区已经很好地建立起来了,但至少在我迟到的时候,它是受欢迎的。我构建了几个小型服务器插件,在我经常光顾的论坛上引起了一些注意,我甚至为几个非常大的服务器做了一些(付费)工作,最终帮助并领导开发团队构建满足他们特定需求的核心插件。现在,我 19 岁,在家一家人工智能创业公司做计算机视觉研究工程师

开辟成功之路

我提到我糟糕的学术表现和《我的世界》发展的原因是,1)即使是钻石也曾经是煤(这绝对是一个双关语),2)你能获得的任何经验对你在科技行业的成功都是必不可少的,无论是你在业余时间制作的游戏,你为了好玩制作的网络刮刀,甚至是《我的世界》mod。当然,除了上面列出的,我还做了大量与软件相关的事情(我已经成为业余爱好者/自由程序员大约 3 年了),但这些是最不为人知的。

我建议,如果你已经对某些特定的技术驾轻就熟,就对像 Upwork.com 这样的网站上的一些零工出价低一些,如果不是,你肯定应该学习一些。当我说技术时,我指的不仅仅是一种编程语言,我指的是某种特定的框架、库、API,任何对项目开发来说有些专门化和有用的东西。任何人都可以拿起 Python 或 JavaScript,说自己是软件开发人员,但学习 Angular(用于 web 开发)或 TensorFlow(用于机器学习)等特定应用程序需要一些勇气、天赋和动力。

即使你遇到一个职位名称含糊不清的“JavaScript 工程师”或“软件开发人员”,他们也很可能会欣赏一个拥有使用不同技术实际开发应用程序的经验的候选人,而不是一个只花时间在 CodeWars 或 CodeFights 上解决算法问题的人——这不会让我误解,是一种提高编程技能的惊人方法,但它缺乏实用性。

我熟悉的一个有用的框架是谷歌 Chrome 扩展开发 API 。我并不是因为觉得开发一个 Chrome 扩展会很酷而随意选择的,我这么做是因为我遇到了一个问题:为什么我不能用我的 Xbox 控制器在我的电脑上做更多有用的事情?

我四处搜索了一下,没有一款简单易用的软件可以从你的游戏控制器上给你的电脑添加远程功能。所以我做了一些研究,最终决定我想把这个功能整合到 Chrome 扩展中。所以我这么做了,在过去的 13 个月里(从写这篇文章开始),我一直是 Chrome 控制器的唯一开发者

链接现在是 404,因为 Chrome 控制器死了!它已从谷歌网上商店中删除。虽然源代码还是可以找到的,链接这里。—未来的戴尔兰:(

它是开源的,在 Google 网络商店上免费提供,拥有 3000 多名活跃用户。这个项目对我来说就像是精华,每次我和招聘人员或想测试我能力的人谈话时,我都会提到这个问题。

可以说,你应该有自己的 Chrome 控制器,这是你花了几个月时间开发的东西,有东西可以展示。坦率地说,没有招聘人员会关心你启动和放弃的 10 个项目,或者你的 FizzBuzz 实现。如果你真的想脱颖而出:打造一些你可以推销的东西,并投入其中,你可以自豪地向招聘人员宣布——至少可以说,你未来的自己会非常感激。

社区

我职业发展的另一个重大举措是成为志同道合者社区的一员,并为之做出贡献。《我的世界》是一个肯定,但是,它是非常中介。我有幸参与的最有影响力的项目是sharpes minds,这也让我很快找到了工作(成为我的导师仅 6 周)。它们是为有抱负的数据科学家、机器学习工程师、数据分析师等量身定制的导师计划。

我怎么强调都不为过 Edouard Harris (创始人之一)在与我合作时是多么的乐于助人和热情好客,甚至直接与我进行视频通话,并提供与我的特定子领域兴趣相关的完全精选的潜在导师。他让这个过程变得愉快且易于消化,最终让我向我即将成为导师的乔爸爸提交了一份建议书。

Joe 专攻信号处理,这是一个与机器学习有很多交叉的数学子领域。他给我回了信息,我们安排了一个电话,剩下的就是历史了!他看到了我身上的潜力,这是我所没有的,并真正促使我对自己的能力充满信心。我们曾计划从事与他的专业相关的各种项目,然而,爱德华和乔都催促我马上申请不同的公司。由于参与了招聘过程的双方,他们对如何优化我自己的营销有一些惊人的见解,我将这些直接归功于我今天的成就。

你的下一步

既然你已经听了我的故事,是时候去创造你自己的故事了。当人们谈到想进入软件行业时,我总是告诉他们,你 真的可以 。如果你瞄准软件开发的一个狭窄领域,无论是机器学习、web 开发、嵌入式系统等等,只要你充满激情、始终如一并设定目标,你最终达到你的目标。然而,这并不意味着它会很容易。

坚持下去

已经有几个星期,我觉得我没有更接近我的目标,甚至我最亲密的家人都告诉我,我只是在浪费时间“玩游戏”和“在电脑上乱搞”,但只要你知道你要去哪里,并采取正确的步骤,这不是你是否会成功的问题,而是你何时会成功的问题。

给初级数据科学家的两个问题

原文:https://towardsdatascience.com/2-questions-for-a-junior-data-scientist-47d355b87023?source=collection_archive---------9-----------------------

source: https://pixabay.com/en/question-mark-pear-think-idea-2010012/

在我看来,雇佣一名数据科学家通常是一个困难的过程。有很多人来自各种不同的背景、学位水平和经验。不同的公司对“数据科学家”的要求大相径庭。除此之外,我们看到越来越多的人每天都在他们的 LinkedIn 个人资料中添加一个标语“数据科学家”。评估有经验的数据科学家的个人资料是否适合某项工作可能相对更容易,但我们如何评估初级/入门级数据科学家的个人资料呢?

在过去的几个月里,我采访了几个应届毕业生/证书项目毕业生/实习生候选人,花了一些时间思考这个问题。我觉得在面试过程中有两个重要的问题要问。这篇文章是关于这两个问题和我问它们的理由。

让我从给它们加标题开始。

  1. 解决同一问题的不同方法
  2. 广义理解或具体知识

解决同一问题的不同方法

我来一个匿名化的真实面试经历。我不得不面试一个拥有非常好的学术证书的候选人,并且在学生时代就有令人印象深刻的一系列项目。其中一个项目涉及使用强化学习来解决自然语言处理领域的一个问题 X。这是一场 Kaggle 竞赛(据我所知),候选人是 XXX 名参与者中的佼佼者。我觉得他们很好地解释了自己的所作所为。

这时,我问道——“如果有人告诉你不要使用强化学习,你会怎么做?”。候选人似乎对这个问题感到惊讶。经过一番沉思,他们说:“深度学习”。我问——“深度学习是什么?”。他们:“可能是 RNNs。”我:“好吧,假设我们已经决定不能使用深度学习。你能想到别的解决办法吗?”他们:(一脸茫然)。

在这种情况下,我们正在讨论的问题的一个流行算法(在教科书中也可以找到)使用正则表达式和简单的启发式算法!现在,有人可能会问,在这个时代问这个问题有什么意义?三个原因:

  • 在行业项目中,建立一个快速的 MVP 或一个简单的解决方案,获得一些反馈并迭代它通常是有意义的。因此,考虑几个不同的选项来解决一个问题并评估哪一个可以快速构建是很有用的。
  • 强化学习,或者深度学习,或者正则表达式,都只是解决问题的“方法”。不管问题如何,它们本身不应该是解决办法。
  • 这也将告诉我候选人是否只是在他们的课程中遵循了强制性项目的描述,或者实际上理解并思考了解决问题的方法

所以,我的观点是:当我们开始的时候,不要停留在一个解决方案上,想想“还有什么其他的解决方法”是很有用的。这也是我们在现实工作中通常会做的事情。我们在给定的约束条件下寻找最优解。虽然对于一个刚刚起步的人来说,了解所有的事情是很困难的,但这也是常识的一部分。当有人突然问你一个替代方案时,你应该在面试中有答案。随着数据科学家的成长,这将非常有用。

广义理解还是具体知识

让我再举一个我的匿名采访经历。一个刚从大学毕业的候选人的简历上有一堆典型的项目——垃圾邮件分类、MNIST 数据集数字识别、情感分析等等。在其中一张照片上,这位候选人还声称自己是 Kaggle 排行榜上的前 10 名。虽然这令人印象深刻,但这与现实世界的项目场景相差甚远。那么,我该怎么办呢?

我没有对这些众所周知的数据集和项目的细节提出问题,而是稍微修改了一下我的“问题描述”。我向候选人提出了一些解决问题的问题,比如:“假设我经营一家网上企业,我经常收到客户发来的抱怨邮件。我只有三个客户支持部门:订单和账单,退货和退款,其他。我想要一个机器学习解决方案,将客户的电子邮件路由到这三个部门之一。”—如果有人了解他们在上面做的项目,他们会将此映射到一个分类问题,可能类似于垃圾邮件或情感分类。即使在初级阶段,看不到这种联系对我来说也是一个危险信号。

我对这个问题有两个观点:

  • 如果你能展示的所有数据科学项目都是标准数据集和 kaggle 竞赛,这完全没问题(几个月前,我怀疑这是否有用,但我现在改变了看法)。但是,人们需要知道如何将这些知识推广到新的问题。例如,如果您以前处理过一个文本分类问题,您需要能够识别另一个文本分类问题,并逐步完成解决它的一些步骤。
  • 在这里,我的第二点与问题 1 相似。这告诉我候选人是否真正理解他们所做的,或者只是按照指示,或者按照在线教程。

总而言之,当申请数据科学工作时,入门级候选人需要考虑他们的项目,而不仅仅是他们所做的事情——寻找其他可能的解决方案,以及现实应用中类似问题的例子。

当然,这一切都是我个人的看法,并不一定能在天底下的每一次数据科学访谈中找到!

开发人员避免编写测试的两个原因

原文:https://towardsdatascience.com/2-reasons-why-developers-avoid-writing-tests-7e55515776e9?source=collection_archive---------11-----------------------

Photo by Kevin Ku on Unsplash

编写测试代表了软件开发中经常被忽视的几个阶段之一,尽管它可能是最重要的阶段之一。开发人员提到它,通常要么不舒服,不喜欢为他们的代码编写测试,要么有很多借口根本不编写测试。

Therac-25 放射治疗机中的一个软件错误导致五名患者在接受大剂量 X 射线照射后死亡。骑士资本在半小时内损失了 5 亿美元,原因是一个软件漏洞允许计算机在无人监管的情况下买卖数百万股股票。

这些和其他许多故事讲述了看似不重要的错误实际上如何导致如此多的悲剧灾难。

当我们知道有多少计算机程序正在广泛地成为我们生活的每一个领域的一部分,并且它们的安全性、稳定性和正确性在我们的生活中具有至关重要的意义时,问题就出现了:为什么开发人员仍然避免编写测试?

测试是一个开发领域,其中软件的特定功能根据设定的标准进行测量。可能有很多原因可以解释为什么不强调写作,尤其是在小项目中,但是我们会提到两个最常见的原因。

1.只是太花时间了

编写测试似乎比直接进入实现部分花费了太多的时间,尤其是当你应用测试驱动开发(TDD)的时候。这在短期内是正确的,但是如果我们考虑到你可能需要的时间来修复所有可能通过编写测试来避免的错误,那么编写测试实际上可以节省时间甚至金钱。

测试不能消除错误,但是可以极大地减少错误。它们甚至让您更有信心,因为您最近的更改和您必须做的重构不会破坏任何现有的功能。

您还节省了时间,并且保护了您现有的实现免受最近加入您的团队的没有经验的程序员的影响,仅仅因为他们的更改可能导致测试失败。当测试失败时,你就会意识到出了问题。

没有编程相关背景的项目经理,以及对可能突然出现的编程复杂性了解不多的项目经理,往往对他们团队中的开发人员有很高的期望。他们想要快速的实现和快速的生产就绪代码,并且认为推迟严格的截止日期是不合理的。

尽管这些情况可能会让你陷入在遵循最佳实践或经历快速且肮脏的模式之间的艰难境地,但你应该尝试一些无论如何都要坚持的专业原则。你应该尽最大努力让你的经理相信良好实践的重要性,以及从长远来看它们是如何带来回报的。如果他不服气,那么你可以考虑随时换个工作场所。

2.写测试的恐惧

毫不奇怪,软件开发人员将大部分工作时间花在阅读、写作或讨论如何通过代码解决问题上。因此,他们对它有着非常强烈的情感依恋,更愿意把它当作自己的宝贵财产。

他们相信自己已经有了足够的经验,能够不费力地应对各种可能的情况。然而,他们通常可能有内在的不安全感,这困扰着他们编写测试。他们很快将他们的代码更改推到主分支,因为他们想通过快速完成任务在经理面前看起来像一个有生产力的员工,现在担心编写测试实际上可能会暴露他们代码中的错误。他们害怕被暴露为不能写出无错误代码的普通 T2 程序员。

你不应该让这种自我意识命令你放弃编写测试。虽然你可能会觉得不舒服,不聪明,以及所有那些怕丢脸的混账感觉,但最终,你还是要为自己的工作负责。这是避免无数病毒的唯一方法,这些病毒可能会夺走数百万人的生命,并导致其他大规模的 havocs。

测试允许您快速地对代码进行大的修改,因为您确信一切都正常工作。当你习惯于为你的代码编写测试时,你通常能够更快地完成你的工作,因为当你看到红灯时,你会有即时的视觉反馈。因此,你也能写出更好的代码,感受到更少的压力,并最终得到提升,因为你正在做的工作带来了更多的价值。

编写测试并不意味着您必须编写两倍的代码。这通常意味着你只是在反复检查每件事情是否正常工作,而不是让客户发现边缘情况的错误。

你应该有勇气克服你对写测试的恐惧,改变你对这个非常重要的过程的情绪。你应该充满热情和活力,仅仅因为你正在遵循软件开发的一些最佳实践,并帮助你的团队构建稳定的项目。

腾出时间进行测试

可能有些项目不需要测试,但是在大多数情况下,测试是非常受欢迎的。

当你在编写好的测试时,你也在为你的代码准备好文档。

不要误解我的意思:有很多开发人员编写测试,仔细分析并确保他们覆盖了每一种边缘情况。这篇文章的目的是提高意识,并邀请更多的开发人员使用他们自己的测试工具。此外,我希望它能让项目经理们大开眼界,他们经常忽视推迟代码实现中人力不可能达到的最后期限的需要。

虽然编写测试可能不是避免每个软件错误出现的最终方法,但它仍然是增加拥有更稳定软件项目的机会的一个非常强大的方法。

感谢您抽出时间阅读。

请关注我的 推特

2 年后——创建她的+数据

原文:https://towardsdatascience.com/2-years-on-founding-her-data-14989747b12e?source=collection_archive---------29-----------------------

2017 年 2 月,我创建了HER+Data——一个为女性或那些认为自己是女性并热爱数据的人服务的社区。我的目标是把从事数据工作或喜欢从事数据工作的女性聚集在一起——互相支持和促进,分享经验和知识,谈论数据。我渴望创造一个空间,让从事分析、数据科学和机器学习的女性能够建立真正有意义的联系,并相互激励。

这个社区已经发展到在都柏林有 600 名注册会员,在 T4 曼彻斯特有一个欣欣向荣的姐妹分会,由出色的 Rachael Ainsworth 组织。我们与都柏林一系列优秀的公司合作举办了 13 场精彩的活动,并与 36 位鼓舞人心的女性进行了交谈!

Our inspiring HER+Data Speakers to date — Note the title(s) above may not represent the current role/company for some of the speakers.

有人多次问我当初为什么创建这个社区,我对其他社区建设者有什么建议,特别是关于他们如何吸引更多女性参与者和演讲者参加他们的活动。

以下是我个人对这段旅程的一些反思!

#1 从任务开始

在外生活了 8 年后,我回到了爱尔兰,在都柏林,我注意到了科技领域的一个缺口。虽然有很多与数据相关的聚会,但很少有人关注女性,而那些关注女性的聚会都是围绕编码展开的。这就是她+数据的最初想法的来源。

我想创建一个专注于彼此分享经验和知识的社区。在我的职业生涯中,我一直抽出时间与他人联系、学习和分享经验,我总是惊讶于倾听他人如何解决问题和应对挑战的力量。

我还想创建一个社区,帮助解决数据科学行业面临的一些多样性挑战。作为技术领导者和数据团队的构建者,我非常关心多样性。研究一次又一次地表明,多元化的团队更具创新性,更聪明,他们最终导致更好的表现。然而,据估计,只有 15%-25%的数据科学家是女性。

分析、数据科学和机器学习正被用于推动战略业务决策、推动行动以及构建跨各种领域的创新产品和解决方案。然而,在绝大多数情况下,女性并没有发挥重要作用。我愿意帮助改变那个

所以我的目标是创建一个社区,在那里从事数据工作的女性可以真正地相互联系和学习;一个真正支持和提升分析和数据科学领域女性的社区;一个有望鼓励更多女性从事数据相关职业的社区。

请注意,虽然 HER+Data 的核心目标是提升女性在数据科学和分析领域的地位,但我们也欢迎任何支持我们事业的人,无论性别或技术背景如何。

#2 选择一个包容的名字

当我第一次创建 HER+数据社区时,我称之为 XX+数据,其中“XX”是一个生物学参考。我选择这个名字是因为它短小精悍,而且我认为它听起来很巧妙。我没有意识到我无意中选择了一个没有完全包含所有女性的名字。

感谢社区和潜在成员的反馈,我意识到 XX+Data 是一个排斥跨性别的名字,对我们的跨性别盟友是一种伤害。虽然我们的核心使命是关注女性,但我希望它能包容所有女性,因此我们决定将社区更名为 HER+Data。

如果你正在考虑建立一个本地社区或聚会,你会想“名字有什么意义?”,答案是很多。名字很重要,如果你的核心目标是创造一个包容的空间,有一个包容的、代表你的事业的名字是很重要的。

#3 设定基调,让人们感到舒适

当我建立她的+数据时,我承诺会有很棒的内容、笑声和一屋子来自不同背景的数据女性。我希望我们的活动是有趣的、非正式的、受欢迎的和吸引人的。我希望人们真正期待这些活动,我希望他们回来。主要是我希望与会者感到舒适。

我们决定首先将重点放在由不同的演讲者分享他们鼓舞人心的职业故事的简短演讲上。我热衷于强调,进入数据相关职业有多种途径,通常是非线性的。

我们在 2017 年 5 月的第一次活动充满了兴奋、笑声和交谈。我们的演讲者组合——一些人处于职业生涯的早期,另一些人处于终身职位——似乎真的引起了共鸣,我们的演讲者分享的各种故事似乎真的触动了我们社区的神经。

在第一次活动和之后的每一次活动中,我都努力做一些事情来帮助设定基调,为每个人创造一个舒适的环境。

  • 我欢迎大家。我自我介绍。我对别人有真正的兴趣。
  • 我们倾向于提供饮料和小吃,所以像任何一个好的主人一样,给人们指出正确的方向,并鼓励人们自己动手是一个很好的起点!
  • 我重复社区的核心使命和历史,以便参与者知道我们在努力做什么。
  • 除了坚定的使命之外,我们还有一套行为准则来帮助阐明对社区成员的期望。网上有很多精彩的行为准则。我们使用一个改编自 Plone Foundation 并在知识共享署名-同样分享 3.0 非授权许可下授权的软件。这同样有助于为你的活动和社区定下基调。
  • 我提醒与会者,如果他们有建议;愿意以任何方式贡献、主持或帮助;或者如果想在未来的聚会上发言,请联系我们或在活动结束后与我们交流。
  • 最后,我试着做我自己,我试着展示我对社区的热情。如果你心不在焉,人们会看出来的。

#4 记住,这需要一支军队

第一次 HER+Data 活动上发生了两件事,都同样史诗!

(1)Rachael ains worth——当时是都柏林高级研究所的博士后研究员——参加了我们的启动仪式。她非常喜欢这个活动,所以她渴望参与其中。关键是她在几周内就搬到了曼彻斯特,在 Jodrell Bank 天体物理中心从事射电天文学的研究助理。雷切尔和我决定边喝咖啡边见面,把事情谈清楚。喝完那杯咖啡后,雷切尔主动提出在曼彻斯特领导并组织一个名为“她+数据”的姐妹分会。

Rachael 于 2017 年 9 月在曼彻斯特科学园举办了第一届 HER+Data MCR 活动。15 次聚会和近 600 名会员之后,曼彻斯特分会继续壮大。

我能说的就是谢谢你,雷切尔,你太棒了!

HER+Data MCR 1 Year Anniversary Event in Sep 2018 — hosted @intechnica — Rachael invited me to give a talk at the 1 year anniversary event 😃 Witnessing what she’s has built in Manchester and the impact she’s had on others was really inspiring!

(2)Martina Naughton——Zalando 的高级数据科学家和团队负责人——欣然同意在我们的 HER+Data 启动活动上做一次演讲,并很快同意与我共同领导和组织 HER+Data 都柏林社区!

我们坚持举办活动,每 1 或 2 个月举办一次,每次聚会通常会有 3 位新的演讲者。组织和协调这些活动需要时间和精力:寻找场地、赞助商和新的发言人、传播活动信息和发展社区。我一个人做所有这些会非常困难,而且我们会冒着缺乏多元化视角和技能的风险,以使社区和我们的活动取得成功。我非常幸运有像 Martina 这样的人在她的+数据上合作。非常感谢 Martina——你太棒了!

除了出色的联合组织者,我们还得到了主办和赞助我们活动的公司的大力支持,包括 Intercom、Zalando、Groupon、埃森哲、脸书、谷歌、Statestreet、微软和 Sky Ireland。Intercom 和 Zalando 实际上已经举办了多次活动!没有这样的公司,像 HER+Data 这样的社区是不可能的,所以非常感谢我们的盟友。

#5 寻找演讲者是一项挑战

后来有 36 位出色的女性演讲者,我希望我可以说这变得更容易了,但总的来说,我认为找到优秀的演讲者是她+数据中最具挑战性的部分之一。以下是我发现的一些有用的东西:

  • 我亲自接触潜在的演讲者,与他们分享我们的使命,并告诉他们为什么我对让他们发言感兴趣。
  • 我有明确的目标和期望。在我们的情况下,我们的会谈很短(10 分钟),我们的活动是非正式的,所以我强调这一点。在我们的活动开始之前,我会给所有的演讲者发一封电子邮件,给他们一组示例主题来帮助启发他们。
  • 我利用每次聚会/活动提醒与会者,我一直在寻找发言人,如果有人愿意自愿,请来找我。我在每个事件的开始和结束时都会提到这一点。
  • 我伸出手,依靠我的专业网络推荐潜在的演讲者。
  • 我一定要感谢那些在活动前后都做志愿者的了不起的演讲者
  • 我在社交媒体——Twitter 和 LinkedIn——上分享详细信息,以帮助宣传和提升那些友好地同意在我们的活动中发表演讲的演讲者。

#6 最后,会有高潮和低谷。

工作确实忙的时候。当我累了或者有压力的时候。当我蹒跚学步的孩子拒绝睡觉时。或者平衡一切感觉不可能的时候,我有时候会质疑她的+数据是不是我花时间去做的正确的事情。

但是后来我们有了另一个活动,我认识了更多了不起的女人。我可以联系、学习和分享。我看到熟悉的面孔回来参加另一个活动。我第一次见到新来的人,想知道会发生什么。对话开始了,嗡嗡声开始了,我准备好了!

我们收到了来自社区的积极反馈,这真的很有帮助——知道她的+数据促进了联系,帮助女性找到了自己的路,并鼓励更多女性追求或推动数据职业真的很有价值。

所以我的建议是——随遇而安:)

非常感谢所有帮助她实现+数据的人们。特别是我的协办单位 玛蒂娜 、HER+Data MCR 章节导语Rachael、主办我们活动的优秀公司以及 36 位出色的演讲者!

Karen 是 Intercom 的产品分析&数据科学总监,她领导着一个由产品分析师、数据科学家和数据工程师组成的团队,帮助设计、开发和衡量我们的产品是否成功。她的团队使用数据来推动战略决策,为产品路线图提供信息,并构建新的数据产品。在 Intercom 之前,Karen 在工业研究实验室(湾区的雅虎研究和巴塞罗那的 Telefonica 研究)工作了 8 年,在移动人机交互(HCI)、数据科学和应用机器学习的交叉领域进行了一系列科学研究。Karen 拥有 Dublin 大学(UCD)的计算机科学博士学位和 Blanchardstown 理工学院(ITB)的理学学士学位。她是 WiDS 都柏林大使兼HER+Data创始人。

2020 年的 20 个数据趋势

原文:https://towardsdatascience.com/20-data-trends-for-2020-f08ee4164a42?source=collection_archive---------27-----------------------

虽然我们无法预知未来,但我们可以根据趋势做出预测。阅读来自 20 位思想领袖的 2020 年关键数据趋势。

JT·科斯特曼 —全球网络犯罪疫情(每年 6T 美元)和不断扩大的数据隐私/保护立法字母汤将越来越多地要求数据科学家接受作为数据受托人的双重责任。随着网络攻击的数量、速度、多样性、病毒式和恶性程度无情地增加,人工智能解决方案将越来越成为弥补 180 万网络安全专业人员预计短缺的唯一方式,否则需要这些专业人员来打击日益复杂和坚定的对手——并让公司高管免于出庭。

Cassie Kozurkov —我们可以期待看到数据科学工具的改进,因为更多的用户体验设计师对作为用户的数据科学家感兴趣。随着相机不仅仅是捕捉记忆的一种方式,而是朝着用户与应用程序互动的更自然的方式发展,图像数据的重要性将会增加。我最喜欢的这种趋势的例子是谷歌镜头中的产品搜索和翻译。

本·洛里卡——强化学习(RL)开始在企业应用中崭露头角。RL 的工具变得越来越容易获得:恰当的例子是,RISELab 的 Ray 框架有一个 RL 库(RLlib ),在从业者和开发人员中很受欢迎。这开始转化为企业用例。JD.com、网飞、谷歌和脸书描述了他们是如何将强化学习整合到产品推荐系统中的。在商业过程优化和模拟中也有 RL 的早期应用,这两个领域都是 RL 在企业中有前途的领域。

Kirk Borne——2020 年,我们可以期待对三大趋势的强化关注:(1)自动化机器学习(AutoML)工具和培训,为公民数据科学家的多样化团队提供支持;(2)对数据监管活动(数据搜寻、收集、清理、标记、索引、联合、融合和编排)的重新投资,以推动企业规模的 ML 和 AI 培训、部署和持续运营;以及(3)组织内各级工作人员在数据和数字素养领域的再培训和技能提升工作。

伯纳德·马尔 :以下是我对 2020 年人工智能/数据科学的三大趋势:我认为 2020 年将是大数据、物联网和人工智能领域继续融合的一年,优化的人工智能芯片和 5G 将实现惊人的创新。这将意味着:人工智能即服务将使任何企业都能利用机器学习。
增强分析将使分析师和数据科学家今天所做的更多工作自动化。
人工智能将走向边缘,进入日常设备,这反过来将带来事物的智能。

Jordan Morrow —数据和分析的世界正在扩张,随着公司注意到数据素养的需求,2020 年的趋势将继续成为数据素养的一个关键方面:数据知情决策和决策科学。能够建立一个伟大的数据即,分析和读取数据是一回事,但它必须转化为明智的决策。基于数据的决策将是 2020 年的一个主要趋势,在决策科学中,我们将数据和人的因素结合在一起以创造成功。

Matt Dancho —展望 2020 年,有三件事很清楚—组织需要数据科学、云和应用。软件和数据科学正越走越近。这是由数据驱动决策民主化的业务需求驱动的。要跟上,我们(数据科学家)需要学习 ML + Cloud + Apps。

安德烈·布尔科夫——在“超越基准”方面,我预计语言建模神经网络模型 BERT 在 2019 年提高了 NLP 在几乎所有任务上的质量,在 2020 年将更加闪耀。今年,谷歌开始使用它作为相关性的主要信号之一——多年来最重要的更新。在技术方面,在我看来,关键趋势将是 PyTorch 在行业中的更广泛采用,对更快的神经网络训练方法的更多研究以及在便利的硬件上快速训练神经网络。

Andreas Kretz—2020 年,我们将见证许多数据科学项目的失败,因为公司正在努力将他们的证明概念转化为实际业务。

—2020 年,新的趋势将是向企业解释和传达 ML 模型。人们一直在谈论“数据翻译”的角色,而不是关注当前 DS/ML 从业者的职业发展,但这是一个真正的需求。很大比例的机器学习项目未能被采用,部分原因是缺乏对这些“黑箱”模型的商业理解。

本·泰勒: 2020 年将是 autoML 成为主流的一年,来自谷歌、亚马逊、数据机器人、H2O 和许多其他公司的竞争日益激烈,他们努力让自己的产品成为标准工具包的一部分。我们将看到的另一个趋势是数据集复杂性的增加,其中融合模型(结构化+非结构化数据)变得更加常见。我们还将看到围绕深度学习技术讲故事的改进,以及我们解释见解和学习主题的能力。

Carla Gentry :我的预测- > 2020 年是一些人最终会意识到的时候,机器学习是一个漫长而艰巨的旅程,需要大量的数据和持续的调整(最终是“设置好就忘了它”?)—2019 年最被炒作的是人工智能,为了在 2020 年取得成功,“黑匣子”的日子必须结束!可解释的人工智能是“人类人工智能”的一个重要组成部分。

法维奥瓦兹奎 :数据科学正在成为一个严肃的领域。我们将看到关于数据科学及其朋友的重要在线和离线教育的增加。希望我们会对我们所做的和我们如何做更有信心。语义技术、决策智能和知识数据科学将在未来几年成为我们的伴侣,因此我建议人们开始探索图形数据库、本体和知识表示系统。

黛博拉·贝雷比切兹 :数据科学繁琐而初级的步骤会被各种软件自动化;允许数据科学家从事数据驱动的决策制定的更复杂方面的工作。我认为我们正在经历一个不确定的时期,在世界范围内的经济和政治上,人们感到害怕,因为他们看到了很多变化,未来似乎不确定。大多数人,当他们想到人工智能时,他们实际上想到的是我们所说的人工通用智能(AGI),这是一种可以像人类一样执行任何认知功能的人工智能。这种技术还没有出现。远非如此。今天,在 IBM Watson、Siri、Alexa 和其他应用程序中,我们拥有的被称为狭义人工智能。AGI 和狭义人工智能的主要区别在于自主性和目标设定。也就是说,Siri 只有在有人问它问题的情况下才起作用;它不能自动询问天气。这并不意味着 AGI 将来不会在这里。我们必须接受世界在变化,但不要害怕。当然,当我们不能再依赖伴随我们成长的制度和规则时,害怕是很自然的——尤其是老一辈。但不要让恐惧引领你走向未来,让好奇心引领你走向未来!

莉莲皮尔森——就 2020 年人工智能趋势而言,有两个领域真正引起了我的注意。这些问题是:(1)随着面部识别技术的进步,人们和地方政府将更加努力地抵制侵犯他们隐私的行为。(2)随着 5G 的采用稳步增加,我们将看到 5G、物联网和人工智能之间的融合领域出现更多令人兴奋的举措。

Rachel Stuve——异常检测将是 2020 年的一个关键趋势。检测潜在的欺诈、客户流失、医疗索赔拒绝和采购重叠(仅举几例)是人工智能将用来帮助组织主动解决可能问题的一个领域。再加上独特的客户交付(即品牌化和差异化的用户体验),这将是人工智能在 2020 年产生影响的关键领域。

伊萨克·费伯博士——数据科学正在沉淀的过程中。就像一栋房子的地基已经建好。有两个主要的阵营;专注于业务的数据科学家和专注于开发人员的数据科学家。前者已经失去了一些对后者的关注,主要是由于深度学习和机器学习的宣传。我想今年这种情况会稍微稳定下来。深度学习有时会被认为是必要的,但不足以提供实际的商业价值。人工智能领域的杰出玩家将是解决无聊问题的人。不断增长的机器人过程自动化(RPA)行业可能会悄悄地获取大部分价值。很可能最初的几个 10 亿美元的人工智能公司会出现在 RPA 或者类似的领域。****

Vin Vashishta —深度学习将会遇到关于偏见的棘手问题。企业决策者和政府监管者都将关注细节,而不仅仅是承诺和去偏见化的言论。

凯文·陈(Kevin Tran)——我认为第四次工业革命即将到来。人工智能正在发展,谷歌已经声称量子优势。量子计算是当今计算机科学的惊人突破。如果这项技术成熟,它将使许多不可行的复杂计算变得可行,这意味着我们整个数字世界将被改变。与此类似的是从骑马升级到开车!

Kate strach Nyi——我们可以期待在 2020 年看到的是向自动化数据分析/数据科学任务的持续转变。数据科学家需要能够扩展和解决更多问题的工具。这种需求将导致跨越数据科学过程几个阶段的自动化工具的开发。例如,一些数据准备和清理任务是部分自动化;然而,由于公司的独特需求,它们很难完全自动化。自动化的其他候选包括特征工程、模型选择等等。

如果你在这篇文章中发现了价值,请与你的网络分享🙂

原载于****

20 个流行的机器学习指标。第 1 部分:分类和回归评估指标

原文:https://towardsdatascience.com/20-popular-machine-learning-metrics-part-1-classification-regression-evaluation-metrics-1ca3e282a2ce?source=collection_archive---------1-----------------------

介绍评估分类、回归、排名、视觉、NLP 和深度学习模型的最重要指标。

注: 本帖分两部分。在第一部分(当前帖子)中,我将谈论 10 个广泛用于评估分类和回归模型的度量标准。在第二部分中,我将谈论用于评估排名、计算机视觉、NLP 和深度学习模型的 10 个指标。

介绍

在评估机器学习(ML)模型时,选择正确的指标至关重要。提出了各种度量来评估不同应用中的 ML 模型,我认为在这里提供流行度量的总结可能会有所帮助,以便更好地理解每个度量以及它们可以用于的应用。在一些应用程序中,查看单个指标可能无法提供您正在解决的问题的全貌,您可能希望使用本文中讨论的指标的子集来对您的模型进行具体评估。

在这里,我总结了 20 个用于评估机器学习模型的指标。我根据这些指标主要用于的 ML 模型/应用将它们分成不同的类别,并涵盖了在以下问题中使用的流行指标:

  • 分类指标(准确度、精确度、召回率、F1 分数、ROC、AUC 等)
  • 回归度量(MSE,MAE)
  • 排名指标(MRR、DCG、NDCG)
  • 统计指标(相关性)
  • 计算机视觉指标(PSNR、SSIM、IoU)
  • NLP 指标(困惑度,BLEU 评分)
  • 深度学习相关指标(初始得分、Frechet 初始距离)

不需要提及的是,在一些应用程序中使用了各种其他度量(FDR、FOR、hit@k 等。),这里我就跳过了。

作为旁注,同样值得一提的是度量不同于损失函数。损失函数是显示模型性能的度量的函数,并且用于训练机器学习模型(使用某种优化),并且通常在模型的参数中是可微分的。另一方面,度量用于监控和测量模型的性能(在训练和测试期间),并且不需要可区分。然而,如果对于某些任务,性能度量是可微分的,那么它既可以用作损失函数(可能添加了一些正则化),也可以用作度量,例如 MSE。

这里讨论的一些指标可能非常琐碎,但是为了本文的完整性,我决定涵盖它们。因此,请随意跳过你熟悉的内容。没有任何进一步的原因,让我们开始我们的旅程。

分类相关指标

分类是各种工业应用中机器学习中最广泛使用的问题之一,从人脸识别、Youtube 视频分类、内容审核、医疗诊断到文本分类、Twitter 上的仇恨言论检测。

支持向量机(SVM)、逻辑回归、决策树、随机森林、XGboost、卷积神经网络、递归神经网络等模型是一些最流行的分类模型。

有各种各样的方法来评估一个分类模型,下面我将介绍一些最流行的方法。

1-混淆矩阵(不是一个指标,但知道它很重要!)

让我们首先确保我们知道分类问题中使用的基本术语,然后再详细了解每个指标。如果你已经熟悉这些术语,你可以跳过这一节。

分类性能中的一个关键概念是混淆矩阵(又名误差矩阵),它是模型预测与真实标签的表格可视化。混淆矩阵的每一行代表预测类中的实例,每一列代表实际类中的实例。

让我们用一个例子来说明这一点。让我们假设我们正在构建一个二元分类来将猫图像与非猫图像进行分类。假设我们的测试集有 1100 张图片(1000 张非猫图片,100 张猫图片),混淆矩阵如下。

Figure 1. A sample confusion matrix

  • 在 100 张猫图片中,模型已经正确预测了其中的 90 张,并且错误分类了其中的 10 张。如果我们将“猫”类称为阳性,将非猫类称为阴性,那么预测为猫的 90 个样本被认为是真阳性,预测为非猫的 10 个样本是假阴性
  • 在 1000 张非猫图片中,模型已经正确分类了其中的 940 张,并且错误分类了其中的 60 张。940 个正确分类的样本称为真阴性,60 个称为假阳性

如我们所见,该矩阵的对角线元素表示不同类别的正确预测,而非对角线元素表示错误分类的样本。

现在我们对混淆矩阵有了更好的理解,让我们进入实际的度量。

2-分类准确性

分类准确度也许是人们能想象到的最简单的度量,它被定义为正确预测的数量除以预测的总数,再乘以 100 T2。因此,在上述示例中,1100 个样本中的 1030 个被正确预测,导致分类准确度为:

分类准确率=(90+940)/(1000+100)= 1030/1100 = 93.6%

三精度

在许多情况下,分类精度并不是模型性能的良好指标。其中一种情况是当你的班级分布不平衡时(一个班级比其他班级更频繁)。在这种情况下,即使您将所有样本预测为最频繁的类,您也会获得很高的准确率,这根本没有意义(因为您的模型没有学习任何东西,只是将所有东西预测为顶级类)。例如,在我们上面的猫与非猫分类中,如果模型预测所有样本都是非猫,则结果将是 1000/1100= 90.9%。

因此,我们还需要查看特定于类的性能指标。精度是这样的度量之一,它被定义为:

精度=真 _ 正/(真 _ 正+假 _ 正)

上述示例中的 Cat 和非 Cat 类的精度可以计算如下:

Precision _ cat= #样本正确预测 cat/#样本预测 cat = 90/(90+60) = 60%

Precision _ NonCat = 940/950 = 98.9%

我们可以看到,与猫相比,该模型在预测非猫样本时具有更高的精度。这并不奇怪,因为 model 在训练中看到了更多非猫图像的例子,这使得它能够更好地对该类进行分类。

4-召回

召回是另一个重要的指标,它被定义为模型正确预测的一类样本的比例。更正式地说:

召回=真 _ 正/(真 _ 正+假 _ 负)

因此,对于我们上面的例子,猫和非猫类的召回率可以被发现为:

Recall_cat= 90/100= 90%

Recall _ NonCat = 940/1000 = 94%

5- F1 分数

根据应用的不同,您可能希望给予更高的召回或精度优先级。但是在许多应用中,召回率和精确度都很重要。因此,很自然会想到将这两者结合成一个单一指标的方法。一个结合了精确度和召回率的流行指标被称为 F1 分数,它是精确度和召回率的调和平均值,定义为:

F1-得分= 2 精度召回/(精度+召回)

因此,对于我们在图 1 中使用混淆矩阵的分类示例,F1 分数可以计算为:

F1 _ cat = 2 * 0.6 * 0.9/(0.6+0.9)= 72%

F-score 的通用版本定义如下。正如我们所看到的 F1-score 是 F_ℬ的特例,当时ℬ=为 1。

值得一提的是,在模型的精确度和召回率之间总是有一个权衡,如果你想让精确度太高,你最终会看到召回率下降,反之亦然。

6-敏感性和特异性

灵敏度和特异性是医学和生物学相关领域中最常用的另外两个流行指标,定义如下:

敏感度=召回率= TP/(TP+FN)

特异性=真阴性率= TN/(TN+FP)

7- ROC 曲线

绘制了接收器工作特性曲线,其显示了二元分类器的性能作为其截止阈值的函数。它本质上显示了不同阈值下的真阳性率(TPR)与假阳性率(FPR)的对比。再来解释一下。

许多分类模型是概率性的,即它们预测样本是猫的概率。然后,他们将输出概率与某个截止阈值进行比较,如果它大于该阈值,则他们预测其标签为 cat,否则为 non-cat。例如,您的模型可以预测 4 个样本图像的以下概率:【0.45,0.6,0.7,0.3】。然后根据下面的阈值,您将获得不同的标签:

截止值= 0.5:预测标签= 0,1,1,0
截止值= 0.2:预测标签= [1,1,1,1]
截止值= 0.8:预测标签= [0,0,0,0]

如你所见,通过改变阈值,我们将得到完全不同的标签。可以想象,这些场景中的每一个都会导致不同的精确度和召回率(以及 TPR、FPR)。

ROC 曲线基本上找出了各种阈值的 TPR 和 FPR,并绘制了 TPR 对 FPR 的曲线。图 2 显示了一个样本 ROC 曲线。

Figure 2. A sample ROC curve.

从这个例子中我们可以看出,阳性类别的截止阈值越低,越多的样本被预测为阳性类别,即更高的真阳性率(召回)和更高的假阳性率(对应于该曲线的右侧)。因此,在召回率可能有多高与我们希望限制错误的程度之间有一个权衡(FPR)。

ROC 曲线是一种流行的曲线,用于查看整体模型性能并为模型选择一个好的截止阈值。

8- AUC

曲线 (AUC)下的面积是二元分类器在所有可能的阈值上的性能的综合测量值(因此它是阈值不变的 )

AUC 计算 ROC 曲线下的面积,因此它介于 0 和 1 之间。解释 AUC 的一种方法是将模型对随机正例的排序高于随机负例的概率。

Figure 3. The gray area in this ROC curve denotes the AUC.

在高层次上,模型的 AUC 越高越好。但有时独立于阈值的度量并不是您想要的,例如,您可能关心您的模型召回,并要求它高于 99%(尽管它有一个合理的精度或 FPR)。在这种情况下,您可能希望调整您的模型阈值,使其满足您对这些指标的最低要求(即使您的模型 AUC 不太高,您也可能不在乎)。

因此,为了决定如何评估您的分类模型性能,您可能希望很好地理解业务/问题需求以及低召回率与低精确度的影响,并决定优化什么指标。

从实践的角度来看,输出概率的分类模型优于单个标签输出,因为它提供了调整阈值的灵活性,从而满足您的最低召回率/精确度要求。然而,并不是所有的模型都提供这种很好的概率输出,例如,SVM 不提供简单的概率作为输出(虽然它提供了可用于调整决策的余量,但它不像具有输出概率那样直接和可解释)。

回归相关指标

回归模型是另一类机器学习和统计模型,用于预测连续的目标值。它们具有广泛的应用,从房价预测、电子商务定价系统、天气预报、股票市场预测到图像超分辨率、通过自动编码器的特征学习和图像压缩。

线性回归、随机森林、XGboost、卷积神经网络、递归神经网络等模型是一些最流行的回归模型。

用于评估这些模型的度量应该能够处理一组连续的值(具有无限的基数),因此与分类度量略有不同。

9 毫秒

“均方误差”可能是回归问题中最常用的度量标准。它实际上找到了预测值和实际值之间的平均平方误差。

假设我们有一个回归模型来预测西雅图地区的房价(用ŷᵢ来表示),假设我们有每栋房子的实际售价(用 yᵢ).来表示)则 MSE 可计算如下:

有时人们使用 RMSE 来得到一个以标度为目标值的度量,它本质上是 MSE 的平方根。

看看房价预测,RMSE 基本上显示了你的模型预测房价与目标值(房屋售价)的平均偏差。

10 月中旬

平均绝对误差(或平均绝对偏差)是另一个度量标准,用于计算预测值和目标值之间的平均绝对距离。MAE 定义如下:

众所周知,MAE 比 MSE 对异常值更稳健。主要原因是,在通过平方误差的 MSE 中,异常值(通常比其他样本具有更高的误差)在最终误差中得到更多的关注和支配,并影响模型参数。

同样值得一提的是,在 MSE 和 MAE 指标背后有一个很好的最大似然(MLE)解释。如果我们假设特征和目标之间的线性相关性,那么通过分别假设模型误差的高斯和拉普拉斯先验,MSE 和 MAE 对应于模型参数的 MLE。

内层比率指标:

还有另一个用于评估回归模型的指标,称为 inlier ratio,它实际上是预测误差小于某个界限的数据点的百分比。该指标主要用于 RANSAC⁴模型及其扩展(稳健估计模型家族)。

摘要

在这篇文章中,我们介绍了用于评估分类和回归模型性能的 10 个流行的 ML 指标。在这篇文章的下一部分,我们将介绍用于评估排名、统计、计算机视觉、NLP 和深度学习模型性能的 10 个更高级的指标。

参考

[1]伊恩·古德费勒,约舒阿·本吉奥和亚伦·库维尔。”《深度学习》,麻省理工出版社,2016 年。

[2] Christopher M. Bishop,《模式识别与机器学习》, springer,2006。

[3]杰罗姆·弗里德曼、特雷弗·哈斯蒂和罗伯特·蒂布拉尼。《统计学习的要素》,斯普林格统计丛书,2001。

[4] Tilo Strutz,“数据拟合和不确定性:加权最小二乘法的实用介绍及其他”, Vieweg 和 Teubner,2010 年。

在营销中实施数据科学的 20 种实用方法

原文:https://towardsdatascience.com/20-practical-ways-to-implement-data-science-in-marketing-e10da4a6d0b2?source=collection_archive---------6-----------------------

在过去的十年中,由于万维网的广泛普及,在线信息消费急剧上升。据估计,目前有超过 60 亿台设备连接到互联网。每天都会产生大约 250 万 TB 的数据。到 2020 年,对于每一个人来说,每秒将会产生 1.7 MB 的数据。

对于营销人员来说,这些惊人的数据是一座金矿。如果能够对这些数据进行适当的处理和分析,它可以提供有价值的见解,营销人员可以利用这些见解来锁定目标客户。然而,解码大量数据是一项艰巨的任务。这就是数据科学可以提供巨大帮助的地方。

数据科学是一个从数据中提取有意义的信息并帮助营销人员识别正确见解的领域。这些洞察可以是各种营销方面的,如客户意图、体验、行为等,这将帮助他们有效地优化其营销策略并获得最大收益。

让我们来看看数据科学在营销中的 20 种实用方法:

1。营销预算优化

营销人员总是处于严格的预算之下。每个营销人员的主要目标是从分配的预算中获得最大的投资回报。实现这一点总是棘手且耗时的。事情并不总是按照计划进行,也没有实现有效的预算利用。

通过分析营销人员的支出和采购数据,数据科学家可以构建一个支出模型,帮助更好地利用预算。该模型可以帮助营销人员在地点、渠道、媒介和活动之间分配预算,以优化他们的关键指标。

2。向合适的受众营销

一般来说,营销活动分布广泛,与地点和受众无关。因此,营销人员很有可能超出预算。他们也可能无法实现任何目标和收入目标。

然而,如果他们使用数据科学来正确分析他们的数据,他们将能够了解哪些位置和人口统计数据给他们带来了最高的 ROI。

3。识别正确的通道

数据科学可用于确定哪些渠道给营销人员带来了足够的提升。使用时间序列模型,数据科学家可以比较和识别各种渠道中看到的提升类型。这可能是非常有益的,因为它准确地告诉营销人员哪个渠道和媒体正在提供适当的回报。

4。将营销策略与客户相匹配

为了从他们的营销策略中获得最大价值,营销人员需要将他们与正确的客户相匹配。为此,数据科学家可以创建一个客户终身价值模型,根据客户的行为对其进行细分。营销人员可以将该模型用于各种用例。他们可以向他们的最高价值客户发送推荐代码和返现优惠。他们可以对可能离开客户群的用户应用保留策略等等。

5。销售线索锁定

营销人员可以使用数据科学来锁定销售线索,并了解他们的在线行为和意图。通过查看历史数据,营销人员可以确定他们的业务需求以及过去一年中与他们相关的品牌类型。

6。高级线索评分

营销人员获得的每一条线索都不会转化为顾客。如果营销人员能够根据客户的兴趣准确地对其进行细分,将会提高销售部门的业绩,最终增加收入。

数据科学使营销人员能够创建预测性销售线索评分系统。这个系统是一个算法,能够计算转换的概率和分割你的线索列表。该列表可以分为以下几类:热切的客户、好奇的潜在客户和不感兴趣的客户。

7。客户角色和描述

在营销产品/服务时,营销人员着眼于创建客户角色。他们不断建立特定的目标潜在客户名单。有了数据科学,他们可以准确地决定哪些人物角色需要成为目标。他们可以计算出人物角色的数量以及创建客户群所需的特征种类。

8。内容策略创建

营销人员总是必须提供相关的有价值的内容来吸引他们的客户。数据科学可以帮助他们获取受众数据,这反过来又有助于为每位客户创造最佳内容。例如,如果客户通过谷歌搜索某个关键词,营销人员将知道在他们的内容中更多地使用该关键词。

8。情绪分析

营销人员可以利用数据科学进行情感分析。这意味着他们可以更好地了解客户的信念、观点和态度。他们还可以监控客户对营销活动的反应,以及他们是否参与了他们的业务。

9。产品开发

数据科学可以帮助营销人员收集、汇总和综合几种不同人群的产品数据。根据这些数据提供的见解,他们可以开发产品,并针对目标人群开展针对性很强的营销活动。

10。定价策略

数据科学可以帮助营销人员改进定价策略。通过关注单个客户偏好、他们过去的购买历史和经济形势等因素,营销人员可以准确地确定是什么推动了每个产品细分市场的价格和客户的购买意图。

11。客户沟通

通过正确分析数据,营销人员可以确定与潜在客户和客户沟通的正确时间。例如,他们可能能够理解客户阅读和回复电子邮件,但不太接受短信。这种洞察力可以帮助营销人员了解正确的沟通时间和渠道。

12。实时互动营销

数据科学可以产生关于实时事件的信息,并允许营销人员利用这些情况来锁定客户。例如,酒店公司的营销人员可以实时使用数据科学来确定航班延误的旅客。然后,他们可以通过将广告活动直接发送到他们的移动设备来锁定他们。

13。使用数据改善客户体验

提供丰富的客户体验一直是取得营销成功的重要因素。借助数据科学,营销人员可以收集用户行为模式,预测谁可能想要或需要特定产品。这使他们能够有效地营销,并为客户提供丰富的体验。

14。客户忠诚度

忠诚的顾客是那些帮助维持生意的人。它们比获得新客户更便宜。数据科学可以帮助营销人员改善对现有客户的营销,从而提高他们的忠诚度。例如,Target 利用数据科学,根据孕妇在怀孕前的购物情况,获得她们的个人资料。然后,该公司在这些客户怀孕期间向他们提供产品。就购买量和公司忠诚度而言,这一营销策略取得了巨大成功。

15。社交媒体营销

如今,客户在脸书、LinkedIn 和 Twitter 等社交媒体网站上非常活跃。营销人员可以使用数据科学来了解哪些潜在客户正在浏览他们的社交媒体页面,他们点击了哪些内容等等。有了这样的认识,他们可以制定一个合适的社交媒体参与策略。

16。社区分组

数据科学可用于针对特定的社交媒体群体获取客户反馈。这是通过帮助营销人员根据关键词频率确定最常讨论的话题来实现的。

17。超越文字云

为了分析社交对话,营销人员总是依赖于词云。然而,当有高水平的社会活动时,单词云是有用的。如果社交活动水平较低,营销人员通常会使用不相关的关键词。借助数据科学和自然语言处理算法,他们可以通过将单词用法置于上下文中并提供有意义的见解来超越单词云。

18。广告产品

营销人员可以使用数据科学来专门针对客户投放广告,并测量点击量和活动结果。它可以确保合适的人看到横幅广告,并提高被点击的机会。

19。电子邮件活动

数据科学可以用来计算哪些电子邮件吸引哪些客户。这些邮件多久被阅读一次,什么时候发出,什么样的内容能引起客户的共鸣,等等。这种洞察力使营销人员能够发送情境化的电子邮件活动,并为目标客户提供合适的优惠。

20。数字营销平台

数字营销平台因数据而繁荣。营销人员可以通过向这些平台提供精确的数据来获得更好的洞察力。数据科学可以通过提供正确的数据来改善数字营销平台,从而使营销人员能够确定他们必须做些什么来实现他们的营销目标。

书籍推荐:

“人工智能对你的业务意味着什么?阅读本书了解: 预测机器:人工智能的简单经济学https://amzn.to/2UG063p”—哈尔·瓦里安,首席经济学家,谷歌人工智能。****

零到专家:

您还可以阅读以下书籍,了解更多关于将数据科学用于营销的信息:

1. 营销数据科学:https://amzn.to/2EkFLaJ

2. 手握数据科学做营销:https://amzn.to/2ROM6DB

3. 营销分析数据科学:https://amzn.to/2YLQswD

关于 2020 年软件发展趋势的 20 个预测

原文:https://towardsdatascience.com/20-predictions-about-software-development-trends-in-2020-afb8b110d9a0?source=collection_archive---------0-----------------------

云、容器、编程、数据库、深度学习、软件架构、Web、App、批处理、流、数据湖、字节码、无代码

Photo by h heyerlein on Unsplash

再过几周,2019 年就要结束了,我们将迎来新的一年 2020 。对于软件开发行业来说,2019 年是伟大的一年,因为软件和数字化正在影响每个行业。这一趋势将持续下去,并将在 2020 年对世界产生更大的影响。

预测未来是困难的。预测软件开发的未来更加具有挑战性和风险性。我没有水晶球。但是我可以用我的人类学习来预测 2020 年的软件发展趋势。

我将预测软件开发最重要的栈:从云到字节码

1.基础设施:条条大路通云

Photo by Patrick Tomasso on Unsplash

2019 年对于云厂商来说是很棒的一年。不仅初创公司在使用云,保守和关注安全的公司,如政府组织、医疗保健、采矿、银行、保险甚至五角大楼也在向云迁移。这一趋势将持续到 2020 年,各种规模和类型的公司都将迁移或至少计划迁移到云。 Gartner 最近发布了以下 2020 年的数据:

Source: Gartner

因此,如果你是一名决策者仍在考虑向云迁移,也许你应该重新考虑你的策略。如果你是个人开发者,还没有尝试过云计算,2020 年将是一个尝试的绝佳时机。大多数大型云提供商(亚马逊、微软、谷歌)都提供免费积分,让用户体验云计算。谷歌在这方面最为慷慨:它提供一年 300 美元的免费信用额度。

Google Cloud Free Tier

2.云:AWS 很棒,但其他人会赶上来的

作为第一家云提供商,亚马逊 AWS 统治了 2019 年。凭借最广泛的服务组合,亚马逊 AWS 也将在 2020 年继续占据统治地位。正如科纳仕公司公布的 2019 年第三季度数据:大型云提供商( AWS、Azure、GCP )占有 56%的市场份额,而 AWS 一家占有 32.6%的市场份额:

Source: Canalys

但其他云提供商也在积极计划缩小与 AWS 的差距。微软专门针对大型企业。最近,微软击败了亚马逊,从五角大楼获得了 100 亿美元的云项目“ JEDI ”。这笔交易可以提高 Azure 的声誉,并同样削弱 AWS 的装甲:

Source: Marketwatch

谷歌正在推动云本地计算基金会标准化云操作。谷歌的长期目标是让云迁移变得更容易,以便公司以后可以从 AWS 迁移到 GCP。 IBM 最近斥资 360 亿英镑收购了 RedHat ,以期在云市场占有一席之地:

Source: TechCrunch

2020 年将会看到更多的收购和合并。此外,许多初创公司会带来新的想法和创新,例如多云服务。在云供应商的激烈竞争中,公司只能从降低价格和更多创新中获利。

3.集装箱化:库伯内特斯将会更凉爽

在容器编排领域,曾经有过 Kubernetes、Docker Swarm、Mesos 之间的争斗。Kubernetes 已经成为这场斗争的明显赢家,并且变得更加强大。Cloud 是分布式系统,Kubernetes 是 it 操作系统(分布式 Linux )。在 kube con+CloudNativeCon North America 2019 中,有 12000 名与会者参加,与 2018 年的同一活动相比,增长了 50%。以下是 Kubecon + CloudNativeCon 在过去四年中的指数增长:

Source: CNCF/Linux Foundation

在不久的将来, Kubernetes 不会减速,只会在 2020 年变得更强。你可以在 2020 年将 Kubernetes 作为云原生运动的中坚力量。顺便提一下, Docker Enterprise 最近被出售给 Mirantis ,交易金额未披露:

Source: Migrantis

仅在几年前,它是所有关于 Docker,但现在它是所有关于 Kubernetes。Docker 在其全盛时期未能赚钱,几年后当该行业已经离开时,它试图赚钱。另一个例子是,在现代科技世界中,时间就是一切。

4.软件架构:微服务将成为主流

在软件架构范式中,向微服务架构的转变在 2019 年继续,如谷歌趋势所示:

Google Trends: Microservices

随着行业在 2020 年及以后向云发展,微服务架构将更加占据主导地位。微服务架构兴起的主要原因之一是它与云原生的快速软件开发完美契合。在之前的一篇博文中,我解释了微服务架构的基本原理及其优缺点:

[## 微服务架构:简要概述以及为什么您应该在下一个项目中使用它

微服务架构的背景以及微服务架构相对于整体架构的优势

towardsdatascience.com](/microservice-architecture-a-brief-overview-and-why-you-should-use-it-in-your-next-project-a17b6e19adfd)

我认为还会有一种回归单片软件架构的趋势,因为对于许多用例来说,微服务架构是多余的,设计微服务架构具有挑战性。设计微服务架构的最佳实践是什么?我之前在博客上写过一篇总结,可能会有帮助:

[## 有效的微服务:10 个最佳实践

正确实施微服务架构的 10 个技巧

towardsdatascience.com](/effective-microservices-10-best-practices-c6e4ba0c6ee2)

5.编程(整体):Python 将吃掉世界

Photo by Sharon McCutcheon on Unsplash

无论是机器学习、数据分析、数据处理、Web 开发、企业软件开发还是拍摄黑洞 的 照片:Python 无处不在。

此外,流行编程语言排名网站 TIOBE 将 Python 列为继 Java 和 C 之后的第三大流行编程语言:

Source: TIOBE

更有意思的是,2019 年 Python 的热度翻了一番(从 5%到 10%)。我知道 TIOBE 索引有很多限制和缺陷,但它是最广泛接受的编程语言排名。我写过一篇文章,列出了十大热门编程语言,Python 名列榜首:

[## 2020 年最受欢迎的 10 种编程语言

针对求职者和新开发人员的顶级编程语言的深入分析和排名

medium.com](https://medium.com/@md.kamaruzzaman/top-10-in-demand-programming-languages-to-learn-in-2020-4462eb7d8d3e)

Python 的崛起将在 2020 年继续,它将缩小与 Java 和 c 的差距,另一种无所不在的编程语言 JavaScript 正面临下滑趋势(JavaScript 疲劳?).为什么 Python 会出现这样的热潮?它降低了编程的门槛,拥有优秀的社区,深受数据科学家和新一代开发人员的喜爱。

6.编程(企业):Java 和 JVM 将占统治地位

By 22Kartika — Java Island, Source: Wikipedia

如前一段的 TIOBE 索引所示,Java 仍然是这个星球上最占主导地位的编程语言,并将在 2020 年占据主导地位。Java 的运行时, JVM 是软件工程中最好的部分之一,为 Java 提供了坚实的基础。许多流行的语言如 Kotlin、Scala、Clojure、Groovy 都使用 JVM 作为它们的运行时。最近,Oracle 更改了 JVM 的许可证:

Source: Infoworld

许可证的改变意味着所有使用 Java、Kotlin、Scala 或任何其他 JVM 语言的公司都将受到影响,需要支付巨额订阅费。幸运的是,有 OpenJDK 倡议,它仍将保持 JVM 免费。几家公司将为 JVM 提供企业支持:

Source: Java Code Geeks

由于它的大小和速度,JVM 语言并不适合今天的无服务器计算。甲骨文正在推动“ GraalVM ”计划,让 Java 变得灵活、快速,更好地适应无服务器世界。由于除了 Java 没有其他替代品能提供企业级的稳定性和信任,它将在 2020 年及以后继续统治。

7.Java 企业:春天来了

Source: spring.io

曾几何时,在企业软件开发中有一场 Spring 框架和 Java 企业版(JavaEE) 的巨大竞争。但是甲骨文在 JavaEE 中的不活跃让它在竞争中轻而易举。这引发了“ 微概要 ”倡议的形成,并最终形成了JakartaEE其中 Oracle 开源了其 Java EE 源代码。****

当所有的政治和运动都围绕着 JavaEE 发生的时候, Spring Framework 凭借非常活跃的开发和对不断变化的环境(例如云原生支持)的快速反应赢得了 JVM Enterprise framework 大战。同样在 2020 年, Spring 框架将成为 JVM 生态系统中的头号框架

两个非常有吸引力的项目正在开发中,它们将使 Java 变得更小更灵活,从而使 Java 成为无服务器计算的好选择。

一个框架是 Micronaut :

Source: Micronaut

另一个框架是 Quarkus:

Source: Quarkus

Micronaut 和 Quarkus 的目标都是使用 GraalVM ,并将在 2020 年吸引更多的 Java 社区。

8.编程:Rust,Swift,Kotlin,TypeScript 将会取得突破

在 2000 年,编程语言领域出现了停滞。大多数人认为不需要新的编程语言,因为 Java、C、C++、JavaScript 和 Python 已经满足了所有的需求。谷歌通过创造 Go 打开了新编程语言的大门。在过去的十年里,出现了许多有趣的编程语言,如 Rust、Swift、Kotlin、TypeScript 。这种发展的一个原因是现有的编程语言通常无法利用硬件的最新变化(例如多核、更快的网络、云)。另一个因素是现代语言特别关注开发人员人机工程学,即更快更容易的开发。在 Stackoverflow 开发者调查中,大部分现代语言占据榜首位置( Rust 连续 4 年占据首位):

Source: Stackoverflow

在另一篇博文中,我深入讨论了为什么值得学习 Rust、Go、Kotlin、TypeScript、Swift、Julia、Dart 等现代编程语言,以及它们如何为现有编程语言提供更好的替代方案:

** [## 现在要学习的 7 大现代编程语言

Rust、Go、Kotlin、TypeScript、Swift、Dart、Julia 如何促进您的职业发展并提高您的软件开发技能

medium.com](https://medium.com/@md.kamaruzzaman/top-7-modern-programming-language-to-learn-now-156863bd1eec)

最近,微软宣布他们正在大力探索 Rust 编程,以开发如下所示的安全软件:

Source: Techbeacon

此外,亚马逊最近宣布他们正在赞助 Rust:

Source: Techbeacon

随着谷歌宣布在 Android 中正式支持 Kotlin,编程语言 Kotlin 也成为 Java 在 JVM 世界中的主要竞争对手:

Source: Android

Angular 支持将 TypeScript 作为主要的编程语言,而不是使用普通的 JavaScript。其他 JavaScript 框架,例如 React 和 Vue 也开始为 TypeScript 提供更多支持。

这种趋势将在 2020 年继续,许多其他可能正在深入研究新一代编程语言的大公司,如 Rust、Swift、TypeScript、Kotlin 将站出来公开宣布支持他们。

9.Web: JavaScript 将继续占据主导地位

Photo by Pankaj Patel on Unsplash

曾几何时, JavaScript 不是一种足够强大的编程语言,前端主要是使用后端框架开发的,如 JSF、Ruby on Rails、Django、Laravel 并从服务器呈现。自从《T4》在 2014 年上映后,情况就永远改变了。从那以后,出现了更多的 JavaScript Web 框架 (Angular 2+,React,Vue.js,meteor . js)JavaScript 是现在主流的 Web 开发框架。随着 JavaScript 框架的大量创新和微服务架构的兴起,JavaScript 框架将在 2020 年主导前端开发

10.JavaScript Web 框架:反应岩石

虽然是在 AngularJS 之后,但在过去十年里, React 对网络发展的影响最大,并且在与 Google+ 的斗争中拯救了脸书。React 为前端开发带来了一些新鲜和创新的想法,例如事件源、虚拟 Dom、单向数据绑定、基于组件的开发等等。它对社区的影响如此严重,以至于谷歌放弃了 AngularJS,并通过借鉴 React 的想法彻底重写了 Angular2+。React 是迄今为止最占优势和最稳定的 JavaScript Web 框架,如下图 NPM 下载统计所示:

Source: npm trends

最近,脸书宣布了 React-Fiber 项目,完全重写 React 核心算法,以获得更好的并发性和用户体验:

Source: Github

同样在 2020 年,React 应该成为你新项目的首选网络框架。在另一篇文章中,我对 JavaScript 前端框架进行了深入分析,React 成为第一名:

[## 2020 年前端开发的五大热门 JavaScript 框架

为前端开发人员、求职者和其他人提供的顶级 JavaScript 框架的深入分析和排名

medium.com](https://medium.com/@md.kamaruzzaman/top-5-in-demand-javascript-frameworks-for-front-end-development-in-2020-a59c4340d082)

其他前端 Web 框架比如 Angular (Angular2+)Vue 呢?Angular 还是一个特别适合企业的可靠的 Web 开发框架。我确信谷歌将在未来几年大力投资 Angular。Vue 是另一个非常受欢迎的网络框架,由社区和几个中国大公司支持。如果你已经在用 Angular 或者 Vue,2020 年不需要迁移反应

11.应用开发:面向企业的原生应用

Photo by Rodion Kutsaev on Unsplash

在移动应用程序开发方面,围绕混合应用程序开发或跨平台原生应用程序开发的宣传已经有所放缓。混合应用开发/跨平台原生应用开发给了更快的开发速度,因为你只需要一个团队,而不是两个。但是原生应用给了更好的用户体验和更好的性能。此外,在混合/跨平台应用程序开发中,应用程序总是需要调整以拥有高级功能。对于企业来说,原生应用程序开发仍然是首选的解决方案,这一趋势将在 2020 年继续。 Airbnb 发表了一篇详细的博文,解释了他们放弃领先的混合应用开发平台“React Native”的原因:

[## 日落反应自然

由于各种技术和组织问题,我们将日落反应原生和把我们所有的…

medium.com](https://medium.com/airbnb-engineering/sunsetting-react-native-1868ba28e30a)

尽管脸书正在努力改进原生应用(React Native ),谷歌也在努力推进自己的应用开发平台(Flutter ),但它们主要适用于原型应用、概念验证应用、MVP 应用或特色应用,而原生应用开发将在 2020 年继续占据主导地位。

原生应用开发中一个有趣的事实是谷歌正在推广 Kotlin,而苹果正在推广 Swift 作为主要的编程语言,因为这些语言具有开发人员友好和现代化的特点。谷歌最近重申了对 Kotlin 的支持,这对 Kotlin 的采用者来说是个好消息:

Source: Phoronix

12.混合/跨平台应用程序开发:React Native

在许多用例中,混合/跨平台应用是一个实用的选择。在这个领域,有许多选择:已经存在的 Xamarin、Ionic 和更新的 React Native、Flutter。脸书基于非常成功和成熟的 Web 框架 React 建立了 React Native。像它的 Web 对应物一样, React Native 也是混合/跨平台应用程序开发中的主要框架,如下所示:

Source: Google Trends

由于 React Native 和 React 共享相同的基础,它们提供了高度的代码可重用性,并提供了选项:“编写一次,到处运行”。使用 React Native(或其他脸书框架)的另一个额外优势是脸书使用 React Native 开发自己的移动应用。谷歌在这个领域起步较晚,但去年凭借自己的跨平台原生应用框架获得了巨大的吸引力。Flutter 提供了更好的性能,但需要另一种尚未成为主流的编程语言 Dart 。考虑到 React 生态系统中发生的所有变化,React Native 也将在 2020 年继续在该领域占据主导地位。

13.API:安息吧

Image by S. Hermann & F. Richter from Pixabay

REST 就像是 API 领域中 800 磅的大猩猩。在基于 API 的服务间通信中,这是事实上最广泛使用的技术。在这个领域还有一些其他的选择。如果你已经仔细阅读了这篇文章,你可能已经猜对了:来自谷歌的 gRPC 和来自脸书的 GraphQL。

它们都是有趣的技术,但是提供不同的功能。谷歌已经开发了 gRPC ,作为远程过程调用技术(例如 SOAP)的再生,但是基于类固醇。它使用 Protobuf 而不是 JSON 作为消息格式。另一方面,脸书开发了 GraphQL 作为聚合层,以避免喋喋不休和频繁的 REST 调用。gRPC 和 GraphQL 都取得了成功,并在它们适合的地方表现出色。同样在 2020 年,REST 将成为最主要的 API,而 GraphQL 和 gRPC 将作为补充技术。

14.人工智能:Tensorflow 2.0 将占据主导地位

Image by Gerd Altmann from Pixabay

同样在深度学习/神经网络领域,谷歌和脸书是主要玩家。谷歌给了我们 TensorFlow ,它基于一个流行的深度学习框架the no。它迅速成为深度学习/神经网络计算的主库。谷歌甚至推出了一款特别设计的 GPU ( TPU )来加速张量流的计算。

脸书在深度学习领域并不落后,因为他们可能拥有最大的图像和视频集合。脸书发布了深度学习库 PyTorch ,它基于另一个流行的深度学习库 Torch 。这两个框架的工作方式有一个微妙的区别。 TensorFlow 使用静态图进行计算,而 PyTorch 使用动态图进行计算。使用动态图的优点是它可以动态地自我修正。此外,PyTorch 对 Python 更加友好,是数据科学中的主要编程语言。

随着 PyTorch 越来越受欢迎,谷歌在 2019 年 10 月发布了 TensorFlow 2.0 ,它使用了动态图形,对 Python 更加友好:

Source: TensorFlow

2020 年,TensorFlow 2 和 PyTorch 将并肩作战。考虑到 TensorFlow 更大的社区,我假设 TensorFlow 2 将成为深度学习的主导库。

15.数据库:SQL 至高无上,但分布式 SQL 将是圣杯

在 NoSQL 大肆宣传的日子里,许多人嘲笑 SQL 并指出它的局限性。许多帖子都在解释 NoSQL 如何变得更好,并将取代 SQL。但是宣传结束后,人们很快意识到这个世界离不开 SQL 数据库。以下是最受欢迎的数据库排名:

Source: DB Engines

从上图中我们可以看到, SQL 数据库保存了 t op 4 点。SQL 占主导地位的原因是它提供了可持续的跨国保证,这是业务应用程序最基本的需求。NoSQL 数据库提供水平扩展,但代价是损害了 ACID 保证。

网络规模的公司正在寻找“主数据库”,即像 SQL 数据库一样提供 ACID 保证,并像 NoSQL 数据库一样提供横向扩展的数据库。此时此刻,有两个解决方案部分满足了“主数据库”的要求:亚马逊的 Aurora谷歌的 Spanner。Aurora 提供了几乎所有的 SQL 特性,但没有水平写入扩展,而 Spanner 提供了水平写入扩展,但不支持许多 SQL 特性

在 2020 年,这两个数据库将有望更加接近,或者其他人将提出一个“分布式 SQL ”。如果发生这种情况,他可能会获得图灵奖。

16.数据湖:MinIO 将崛起

Photo by Tom Gainor on Unsplash

如前所述,现代数据平台是复杂的。公司通常有 OLTP 数据库(SQL)来支持 ACID 事务,有 OLAP 数据库(NoSQL)用于分析目的。此外,企业还有其他类型的数据存储,例如用于搜索(Solr,弹性搜索)或计算(Apache Spark)的。公司基于数据湖构建其数据平台,即数据从 OLTP 数据库复制到数据湖。所有其他类型的数据应用程序(例如 OLAP、搜索)都使用数据湖作为它们的黄金来源。****

Hadoop 分布式文件系统(HDFS) 是事实上的数据湖,直到亚马逊推出对象存储 S3 。可扩展且廉价,S3 很快成为许多公司事实上的数据湖。唯一的问题是使用 S3 将数据平台与亚马逊 AWS 云紧密绑定。虽然微软 Azure 有 Blob 存储,谷歌有类似的对象存储,但它们与 AWS S3 不兼容。

一种新的笔源——S3 兼容的对象存储 MinIO——可能会拯救许多公司。MinIO 提供企业级支持,专为云原生环境打造,可提供云中性数据湖:

Source: MinIO

微软最近在 Azure Marketplace 中宣布了 MinIO,口号是:“为 Azure Blob 存储服务提供亚马逊 S3 API 兼容的数据访问”。如果谷歌 GCP 和其他公司也提供 MinIO,那么这可能是促进多云化的一大进步。

17.大数据计算:火花将继续闪耀

Image by Gerd Altmann from Pixabay

在现代,企业通常需要在他们的大规模数据集上运行一次计算,这需要分布式批处理作业。Hadoop Map-Reduce 是第一个分布式批量计算平台。最近 Apache Spark 已经取代 Hadoop 成为批处理之王。Apache Spark 如何提供比 Hadoop 更好的性能?我之前写过一篇博文,对现代数据平台进行了深入分析:

** [## 控制数据密集型(大数据+快速数据)框架的编程语言。

大数据框架概述

towardsdatascience.com](/programming-language-that-rules-the-data-intensive-big-data-fast-data-frameworks-6cd7d5f754b0)

Spark 专门针对 Hadoop Map-Reduce 的限制,即在每次代价高昂的操作后处理内存中的所有内容,而不是将数据保存在存储中。尽管 Spark 使用 CPU 和内存饥渴的 JVM 进行批处理,但它将在 2020 年及以后统治批处理框架。我希望有人能用 Rust、开发一个更高效的批处理框架,它可以取代 Spark 和节省公司的巨额云账单

18.大数据流:面向未来的链接

Photo by Hendrik Cornelissen on Unsplash

几年前,实时流处理是不可能的。通常,像 Spark Streaming 这样的微批处理框架被用来给提供“近”实时流处理。然而, Apache Flink 通过提供实时流处理功能改变了这一局面。

直到 2019 年,Apache Flink 都无法获得足够的牵引力,因为它无法与 Spark 的营销竞争。2019 年 1 月,中国科技巨头阿里巴巴收购 Data Artisan(Apache Flink 背后的公司)后,情况发生了转变:

Source: TechCrunch

如果一家公司想在 2020 年及以后处理实时流处理,Flink 应该是第一选择。虽然 Flink 也和 Spark 一样,通过使用 CPU 饥渴的重量级 JVM,把一大笔云账单交给它的用户来承受。

19.字节码:WebAssembly 将被大量采用

Photo by Mārtiņš Zemlickis on Unsplash

我是从 JavaScript 的创造者布兰登·艾希的采访中得知 WebAssembly 的。现代 JavaScript(在 es5 之后)是一种优秀的编程语言。但是和其他语言一样,它也有局限性。JavaScript 的最大限制是速度慢,因为 JavaScript 引擎需要读取、解析和处理 JavaScript 文本“抽象语法树”。JavaScript 的另一个问题是单线程,无法利用现代硬件(例如多核、GPU)。因此,许多计算密集型应用程序(如游戏、3d 图形)无法在浏览器上运行。

几家公司(以 Mozilla 为首)开发了 WebAssembly,这是浏览器的低级字节码格式,可以在 Web 上运行任何支持的编程语言。web assembly MVP 发布,支持近金属编程语言(如 C++,Rust ):

Source: WebAssembly

WebAssembly 使游戏和 Autocad 等计算密集型应用程序能够在浏览器上运行。web assembly 的目标甚至更大,并且要在浏览器之外运行。WebAssembly 还提供固有的安全性和沙箱,因为它支持 Web。这也意味着 WebAssembly 可以用在以下“浏览器外的”场景中:

  • 移动设备上的混合本地应用。
  • ****无服务器计算没有冷启动问题()
  • 不可信代码的服务器端计算( CDN )

在我的预测中,2020 年可能是 WebAssembly 的突破之年,许多大公司(包括 T2 的云供应商)和社区将会接受它。

20.编码:低编码/无编码将获得动力

Source: pixabay

快速的数字化和工业 4.0** 革命意味着软件开发商的供需缺口巨大。因此,许多人或公司因为缺乏开发人员而无法实现他们的想法。为了降低软件开发的门槛,人们试图用无代码(无代码)或最少代码(低代码)进行软件开发。这一努力被称为 LCNC(低代码无代码),并在 2019 年取得了一些成功:**

Source: no code

这个运动的目标是任何人都可以开发软件,如果他/她有一个很酷的想法,没有编码经验。

尽管我仍然对在生产中使用 LCNC 框架持怀疑态度,但是它们可以为其他框架奠定基础。像亚马逊,谷歌这样的公司可以在这个基础上建立一个坚实的产品(就像 AWS Lambda 在谷歌应用引擎的基础上蓬勃发展一样)。

值得一看的是 LCNC机芯,它将在 2020 年获得更大的牵引力。****

如果你觉得这很有帮助,请在你最喜欢的论坛(Twitter、脸书、LinkedIn)上分享。高度赞赏评论和建设性的批评。感谢阅读!**

结论:

现代软件开发是相当大的、复杂的和多样化的。我的预测清单绝不是包罗万象的。我只是试图预测我最不擅长的领域的趋势,我认为这些领域非常重要。此外,在许多情况下,决策的余地是最小的,我可能在 2020 年底被证明是错误的。此外,技术堆栈的选择总是取决于用例。因此,如果你想选择一个特定领域的技术堆栈,那么请做你自己的分析,不要从字面上理解我提到的要点。

我的目标是简要概述 2020 年的软件发展趋势。我希望你有一个成功和充满乐趣的 2020 年。

如果你觉得这很有帮助,请分享到你最喜欢的论坛 (Twitter,LinkedIn)。

如果你对软件发展趋势感兴趣,你也可以阅读以下文章:

**** [## 2020 年最受欢迎的 10 种编程语言

针对求职者和新开发人员的顶级编程语言的深入分析和排名

medium.com](https://medium.com/@md.kamaruzzaman/top-10-in-demand-programming-languages-to-learn-in-2020-4462eb7d8d3e) [## 现在要学习的 7 种现代编程语言

Rust、Go、Kotlin、TypeScript、Swift、Dart、Julia 如何促进您的职业发展并提高您的软件开发技能

towardsdatascience.com](/top-7-modern-programming-language-to-learn-now-156863bd1eec) [## 2020 年前端开发的五大热门 JavaScript 框架

为前端开发人员、求职者和其他人提供的顶级 JavaScript 框架的深入分析和排名

medium.com](https://medium.com/javascript-in-plain-english/top-5-in-demand-javascript-frameworks-for-front-end-development-in-2020-a59c4340d082)******

2019 年和 2020 年:数据科学中的事实和期望

原文:https://towardsdatascience.com/2019-and-2020-facts-and-expectations-in-data-science-9788531eae85?source=collection_archive---------30-----------------------

KDNuggets 的编辑问了我以下问题:

2019 年人工智能、数据科学、深度学习和机器学习的主要发展是什么,你预计 2020 年有哪些关键趋势?

答案摘要发表在:《人工智能、分析学、机器学习、数据科学、深度学习研究 2019 年主要进展及 2020 年主要趋势》

以下是我的延伸回答。

— — — — — — — — — — -

2019 年主要进展

2019 年是人工智能稳定的一年。机器已经开发了自己的语言并实现了自己的偏见,这种不太可能的说法将把这个位置留给数百万有能力的数据科学家的日常工作。

所以,数据科学的第一个主要发展,在我看来,是 2019 年获得的民主化的高水平。不仅开源工具的普及降低了数据科学领域的准入门槛,而且大学和电子学习平台上的无数课程正在塑造全新一代的数据科学家。虚拟和真实的数据科学社区到处都在涌现,相互支持和教育,提供论坛讨论、教程和博客帖子。

过去一年的另一个有希望的成就是采用了主动学习、强化学习和其他半监督学习程序。事实上,过去几年在各种平台上积累(收集)数据的努力现在应该有回报了。然而,这些数据大部分就在那里。没有人检查过,更不用说贴标签了。即使在当前状态下,半监督学习程序也可能提供尝试这些数据的希望。

最后,数据科学领域成熟的第三大进步是在 autoML 概念中用“引导的”来修正“auto”一词。全自动数据科学解决方案虽然极具吸引力,但已被证明仅适用于简单的问题,即数据集被标记、干净、平衡等。对于已经稍微复杂一些的问题,专家干预似乎是不可或缺的。因此,概念已经从全自动解决方案转变为具有灵活数量的集成触点的“引导”解决方案。

2020 年的主要趋势

新一代数据科学家将于 2020 年参加 2019 年参加的课程,他们将立即开始解决现实世界的问题。他们将需要快速的解决方案来实现简单模式部署,恒定模式监控,以及灵活模式管理。真正的商业价值将来自数据科学生命周期的这三个最终部分。

人工智能算法的更广泛采用和数据的更广泛使用将在安全安全隐私方面带来关键问题;这些问题本应在 2019 年得到解决,但尚未接近任何解决方案。假新闻问题、保护用户隐私、防范来自世界各地的黑客和小偷,这些问题一如既往地现实,并将在整个 2020 年再次得到解决。

深度学习将继续享受又一年的惊人人气。然而,今年将是用户决定深度学习解决方案何时值得工作,只是效率低下,或者显然不适合的一年。

最后,我相信深度学习黑盒的更广泛使用将会提出机器学习可解释性 (MLI)的问题。我们将在 2020 年底看到 MLI 算法是否能够应对彻底解释深度学习模型闭门造车背后发生的事情的挑战。

就此,我祝愿你们所有人度过一个充实而精彩的 2020 年!

2019 年即将结束。AI 的下一步是什么?

原文:https://towardsdatascience.com/2019-is-coming-to-an-end-whats-next-for-ai-3a4cd45f70aa?source=collection_archive---------46-----------------------

深度学习和人工智能伦理的限制垄断了对人工智能未来的讨论

AI Now and AI Index 2019 Reports

2019 年即将结束,两份最着名的人工智能研究报告-《人工智能 2019 年报告》《人工智能指数 2019-已经出炉。他们对人工智能的技术水平有什么看法?AI 下一步走向何方?我会试着在这篇短文中总结一下。

先说 AI Index 2019,由斯坦福大学以人为中心的人工研究所开发。作为今年的一个新事物,人工智能指数首次包括了两个强大的数据可视化工具:

  • 全球人工智能活力工具 ,允许您在包括 R & D、经济、包容性在内的三个指标下比较各国围绕人工智能的活动。

Ai Vibrancy Dashboard example

  • ArXiv Monitor,一个全论文搜索引擎,跟踪 ArXiv 上发表的人工智能论文的指标。

ArXiv Monitor search engine

通过使用这些工具,任何人都可以深入了解有关国家或学科人工智能状况的详细信息,但我将尝试在这里列出一些我认为更有趣的报告要点,同时将它们与一些个人想法或我与该领域一些专家分享的想法进行交叉:

  • 中国现在每年发表的人工智能论文和欧洲一样多,已经在 2006 年超过了美国。
  • 出席人工智能会议的人数继续大幅增加。例如,2019 年 NeuIPS 的与会者超过 13,000 人,比 2018 年增加了 41%(相对于 2012 年增加了 800%)。
  • 2012 年后,人工智能计算能力每 3.4 个月翻一番。也就是说,该报告还提到“在一些广泛的自然语言处理分类任务上,如 SuperGLUE 和 SQuAD2.0 基准测试中所捕获的,进展非常迅速;在一些需要推理的 NLP 任务上,性能仍然较低,例如 AI2 推理挑战,或者人类水平的概念学习任务,例如 Omniglot 挑战。

在与一些专家讨论这些数字时,他们得到的感觉是:

  • 纸张原稿量明显减少
  • 大量的论文现在只关注通过调整模型,甚至通过应用蛮力(都包括数据集规模或计算能力)来展示对先前工作的微小改进

我个人认识的专家似乎没有指出那个方向,正如你在这篇文章中看到的,Yoshua Bengio 警告说“进展正在放缓,巨大的挑战仍然存在,简单地将更多的计算机投入到一个问题中是不可持续的”。其他文章,比如来自麻省理工科技评论的这篇文章进一步暗示深度学习的时代可能会结束

还有,就像我在我的文章《深度学习是不是太大太失败了?“看起来深度学习模型变得越来越庞大,而规模准确性却没有从中受益太多

另一个寻求进步的有趣领域是教育。虽然人工智能培训(传统大学和在线)的报名人数正在增长,但我仍然发现两个令人担忧的领域。其中一个在 AI Index 2019 报告要点中提到,另一个没有提到:

  • 人工智能的多样性仍然是一个问题。特别是性别的多样性,女性在 2018 年新聘教师或人工智能博士获得者中所占比例不到 20%。
  • 虽然该报告对人工智能人才给予了大量关注,但另一个相关主题却被忽略了,即政府和公司如何培训他们的非技术人才为人工智能做准备。实际上,AI Now 2019 报告的执行摘要明确指出“算法管理技术在工作场所的传播正在增加工人和雇主之间的权力不对称。人工智能不仅威胁到不成比例地取代低收入者,而且威胁到降低工资、工作保障和其他对那些最需要的人的保护。

最后,人工智能指数报告强调指出了一个在过去几个月中非常明显的趋势。人工智能伦理正变得与可解释性和可解释性非常相关,成为最常提到的伦理挑战。这让我想到了第二份报告, AI Now 2019 报告,该报告重点关注道德问题。让我来总结一下我认为第二份报告中最相关的几点。首先,一些执行要点:

  • 人工智能的伦理压力主要来自社区、记者和研究人员,而不是公司本身。
  • 虽然正在努力监管人工智能,但政府对监控的采用超过了他们
  • 人工智能投资在气候变化(注意之前提到的计算能力增长率)以及地缘政治和不平等加剧方面有着深远的影响

其次,关于建议,作者明确表示,像影响识别或面部识别这样的技术应该被禁止或不使用,同时在可能影响人们生活和获得机会的敏感环境中不受管制。关于偏见,作者指出,研究应该超越技术修正以解决更广泛的政治后果。

虽然我同意,但我真诚地认为还有另一件重要的事情需要考虑,那就是偏倚控制应该从研究转向商业实施,将这与论文的另一项建议联系起来,即让数据科学家对与他们的模型和数据相关的潜在风险和危害负责

当然,报告涉及更多的主题,我将非常乐意讨论你感兴趣的任何相关方面。对你来说,这两份报告的亮点是什么?

2019 年:伯特之年

原文:https://towardsdatascience.com/2019-the-year-of-bert-354e8106f7ba?source=collection_archive---------7-----------------------

自然语言处理中深度迁移学习的兴起

当我们结束 2019 年时,反思语言机器学习领域最近的主要趋势很有意思。2019 年是 NLP 具有里程碑意义的一年,从阅读理解到情感分析,各种重要任务都创造了新纪录。突出的关键研究趋势是 NLP 中迁移学习的兴起,它指的是使用大量预先训练的模型,并根据你特定的语言相关任务对它们进行微调。迁移学习允许您重用以前构建的模型中的知识,这可以提高性能和泛化能力,同时需要更少的标签化训练数据。

预训练模型,然后针对特定任务进行微调的想法本身并不新鲜——计算机视觉从业者经常使用在 ImageNet 等大型数据集上预训练的模型,在 NLP 中,我们多年来一直在通过重用单词嵌入来进行“浅层”迁移学习。

但是在 2019 年,通过像 BERT 这样的模型,我们看到了向更深层次的知识转移的重大转变,即将整个模型转移到新的任务中——本质上是使用大型预训练语言模型作为可重复使用的语言理解特征提取器。

这在去年被称为“ NLP 的 ImageNet moment ”,在 2019 年,研究继续建立在这一趋势上。 BERT 在使自然语言处理中的迁移学习变得容易方面非常出色,并且在这个过程中,以最小的适应性为 11 个句子级和单词级的自然语言处理任务产生了最先进的结果。从实用的角度来看,这是令人兴奋的,但 BERT 和相关模型可能更有趣,因为它们推进了我们对如何向计算机表示语言的基本理解,以及哪些表示最能让我们的模型解决具有挑战性的语言问题。

新出现的范式是:当你可以重用 BERT 对语言的扎实掌握时,为什么要不断地从零开始学习语言语法和语义?

这一核心概念,加上简单的微调程序和开源代码,意味着 BERT 迅速传播开来-最初于 2018 年底发布,BERT 在 2019 年变得非常受欢迎。直到我试图收集去年发表的与 BERT 相关的论文,我才意识到它有多受欢迎。我收集了 169 篇与 BERT 相关的论文,并手动将这些论文标注到几个不同的研究类别中(例如,构建特定领域版本的 BERT,理解 BERT 的内部机制,构建多语言 BERT,等等)。).

这是所有这些文件的图表:

A collection of BERT-related papers published between November 2018 and December 2019. The y axis is the log of the citation count (as measured by Google Scholar), but with a floor of 0. The majority of these papers were found by searching for BERT in the title of arXiv papers.

这类信息通常具有更好的交互性,所以这里有一个 GIF。你也可以查阅 Jupyter 笔记本自己玩剧情,原始数据这里。

Mousing over a mass of BERT papers.

现在有很多伯特论文。此图的一些注释:

  • 观察 2018 年 11 月原始论文发表和 2019 年 1 月左右论文泛滥之间的(相当短的)滞后是很有趣的。
  • 第一波 BERT 论文倾向于关注核心 BERT 模型(红色、紫色和橙色点)的直接扩展和应用,如将 BERT 用于推荐系统、情感分析、文本摘要和文档检索。
  • 然后,从 4 月份开始,一系列探索 BERT 内部机制的论文**发表了(绿色),比如理解 BERT 如何模拟层级语言现象以及分析注意头之间的冗余。特别有趣的是论文BERT 重新发现了经典的 NLP 流水线,其中作者发现 BERT 的内部计算反映了传统的 NLP 工作流程(首先进行词性标注,然后进行依存解析,然后进行实体标注等)。).****
  • 9 月份左右,一批集中于压缩 BERT 的模型尺寸的论文被发布(青色),像 DistilBERT 、 ALBERT 和 TinyBERT 论文。例如,HuggingFace 的 DistilBERT 模型是 BERT 的压缩版本,参数数量减少了一半(从 1.1 亿减少到 6600 万),但在重要的 NLP 任务上性能却提高了 95%(参见 GLUE 基准)。最初的 BERT 模型并不完全是轻量级的,这在计算资源不充足的地方(比如手机)是一个问题。
  • 这个伯特论文列表很可能是不完整的。如果与 BERT 相关的论文的真实数量是我的两倍,我也不会感到惊讶。作为一个粗略的上限,引用原始 BERT 论文的论文数量是目前超过 3100 篇。
  • 如果你对其中一些模型的名字感到好奇,自然语言处理研究人员基本上被芝麻街的角色弄得晕头转向。我们可以责怪埃尔默论文让整个事情开始,这使得后来的模型像伯特和厄尼是不可避免的。我急切地等待一个大鸟模型——让我们称压缩版为小鸟?

伯特文学的几点启示

通过查阅这些文献,出现了一些一般性的概念:

  • ****开源机器学习模型的价值。作者免费提供了 BERT 模型和相关代码,并提供了一个简单的、可重复使用的微调过程。这种类型的开放对于加速研究至关重要,如果作者不那么直率,我怀疑这种模式会如此受欢迎。
  • ****认真对待超参数调整的重要性。RoBERTa 的论文引起了轰动,它提出了一种更具原则性的训练 BERT 的方法,包括优化的设计选择(如改变训练任务)和更广泛的超参数调整。这种更新的训练机制,加上在更多数据上对模型进行更长时间的训练,再次将性能推至各种 NLP 基准的破纪录水平。
  • ****关于模特身材的思考。最初的 BERT 作者很感兴趣地观察到,简单地增加模型的大小可以显著提高性能,即使是在非常小的数据集上。也许这意味着在某种意义上你“需要”数以亿计的参数来代表人类语言。2019 年的其他几篇论文发现,简单地扩大 NLP 模型的规模就能带来改善(著名的是 OpenAI 的 GPT-2 模型)。而且有新的技巧来训练大得离谱的 NLP 模型,比如 NVIDIA 的 80 亿参数庞然大物。但也有证据表明,随着模型规模的增加,回报会减少,类似于计算机视觉研究人员在添加更多卷积层时遇到的问题。关于模型压缩和参数效率的论文的成功表明,可以从给定大小的模型中获得显著更高的性能。

Our NLP models are getting bigger and bigger. From DistilBERT paper.

伯特到底是什么?

让我们后退几步,讨论一下伯特到底是什么。 BERT (来自变形金刚的双向编码器表示)是谷歌研究人员建立的一个预先训练好的语言模型** (LM)。语言模型在激励模型学习对语言的深刻理解的任务上被训练;LMs 的一个常见训练任务是下一个单词预测(“猫坐在 __”上)。**

BERT 基于一种相对较新的神经网络架构——变形金刚,它使用一种叫做自我关注的机制来捕捉单词之间的关系。在变形金刚中没有卷积(如在 CNN 中)或递归运算(如在 RNNs 中)。已经有一些 优秀的 教程发表讲解变形金刚和自我关注,这里就不多赘述了。但简单来说:

  • 自我关注是一种序列到序列的操作,它通过将每个单词的上下文烘焙到其表示中来更新输入令牌嵌入。这使得它可以同时对所有输入单词之间的关系进行建模——与 RNNs 形成对比,在 RNNs 中,输入标记被依次读入和处理。自我关注使用点积计算单词向量之间的相似性,并且所得到的关注权重通常被可视化为关注权重矩阵
  • 注意力权重捕捉单词之间关系的强度,我们允许模型通过使用多个注意力头来学习不同类型的关系。每一个注意力头往往捕捉到一种特定类型的词与词之间的关系(带有一些冗余)。其中一些关系可以直观地解释(比如主语和宾语的关系,或者跟踪相邻的词),而一些则相当难以理解。你可以将注意力头视为类似于卷积网络中的过滤器,其中每个过滤器从数据中提取特定类型的特征——无论哪个特征都将最有助于神经网络的其余部分做出更好的预测。
  • 这种自我关注机制是《变形金刚》中的核心操作,但只是把它放在上下文中:变形金刚最初是为机器翻译开发的,它们有一个编码器-解码器结构。转换器编码器和解码器的构建模块是一个转换器模块,它本身通常由一个自我关注层、一定量的标准化和一个标准前馈层组成。每个模块对输入向量执行这一系列操作,并将输出传递给下一个模块。在变压器中,深度是指变压器块的数量。

使用这个转换器设置,BERT 模型在 2 个无监督的语言任务上被训练。关于 BERT 训练最重要的一点是,它只需要未标记的数据——任何文本语料库都可以使用,不需要任何特殊的标记数据集。BERT 论文使用维基百科和一本书的语料库来训练模型。与“正常”语言模型一样,数据很便宜,这是一个巨大的优势。

伯特是怎么训练的?

但是伯特接受了哪些任务的训练来鼓励它学习如此好的、普遍有用的语言理解呢?未来的工作调整了学习策略,但是最初的论文使用了两个任务:

  1. ****假面语言模型(MLM)任务。这项任务鼓励模型学习单词级和句子级的良好表征(因为句子是单词表征的总和)。简而言之,一个句子中 15%的单词是随机选择的,并用<掩码>标记隐藏(或“屏蔽”)。该模型的工作是预测这些隐藏单词的身份,利用<掩码>之前和之后的单词——因此,我们试图从损坏的输入中重建文本,并且左右上下文都用于进行预测。这允许我们建立考虑所有上下文的单词表示。BERT 同时学习其双向表示,与 ELMo(一种基于 RNN 的语言模型,用于生成上下文感知的单词嵌入)等方法相反,在 ELMo 中,从左到右和从右到左的表示由两个语言模型独立学习,然后连接。我们可以说 ELMo 是一个“浅层双向”模型,而 BERT 是一个“深层双向”模型。
  2. 下一句预测(NSP)任务。如果我们的模型将被用作语言理解的基础,那么对它来说,拥有一些句子间连贯性的知识将是有益的。为了鼓励模型学习句子之间的关系,我们添加了下一个句子预测任务,在这个任务中,模型必须预测一对句子是否相关,即一个句子是否有可能出现在另一个句子之后。正训练对是语料库中真实的相邻句子;从语料库中随机抽取负训练对。这不是一个完美的系统,因为随机抽样的配对实际上可能是相关的,但这已经足够好了。

该模型必须学会同时做这两项任务,因为实际的训练损失是这两项任务的损失的组合(即它是平均 MLM 和 NSP 可能性的总和)。

如果你发现了掩蔽方法的一点问题:你是对的。由于在一个片段中随机有 15%的单词被屏蔽,你很可能有多个出现。这很好,但是 BERT 将这些屏蔽的令牌彼此独立地对待,这有点限制,因为它们很容易相互依赖。这是 XLNet 论文提出的观点之一,有些人认为这是 BERT 的继任者。

微调伯特

一旦训练了基本的 BERT 模型,通常可以分两步进行微调:首先,继续对未标记的数据进行“无监督的”训练,然后通过添加额外的层和对新目标进行训练来学习实际任务(使用不太多的标记示例)。这种方法源于谷歌的戴&乐【2015 年的 LM 论文。

BERT 微调实际上会更新模型的所有参数,而不仅仅是新任务特定层中的参数,因此这种方法不同于完全冻结转移层参数的技术。

在实践中,使用 BERT 转移学习,通常只有经过训练的编码器堆栈会被重用,您可以砍掉模型的解码器部分,而只使用编码器转换块作为特征提取器。因此,我们不关心转换器的解码器部分会对它最初被训练的任何语言任务做出的预测,我们只是对模型已经学会在内部表示文本输入的方式感兴趣。

BERT 微调可能需要几分钟或几小时,这取决于您的任务、数据大小和 TPU/GPU 资源。如果你有兴趣尽快尝试 BERT 微调,你可以在 Google Colab 上使用这个现成的代码,它提供了一个免费的 TPU。

伯特之前有什么?

原创 BERT 论文写得很好,推荐去看看;以下要点总结了本文对语言模型预训练和微调领域先前主要方法的描述:

  • ****无监督的基于特征的方法(如 ELMo),使用预先训练的表示作为输入特征,但使用特定于任务的架构(即,它们为每个新任务改变模型的结构)。所有你喜欢的单词嵌入(word2vec to GLoVe to FastText)、句子嵌入和段落嵌入都属于这一类。ELMo 还提供单词嵌入,但是是以上下文敏感的方式进行的— —标记的嵌入/表示是从左到右和从右到左语言模型隐藏状态向量的串联。
  • ****无监督微调方法(类似于 OpenAI 的 GPT 模型),这些方法对受监督的下游任务的所有预训练参数进行微调,并且仅通过引入一些特定于任务的参数来最小程度地改变模型结构。预训练是在未标记的文本上进行的,学习任务通常是从左到右的语言建模或文本压缩(就像自动编码器一样,它将文本压缩成矢量表示,并从矢量中重建文本)。然而,这些方法对上下文建模的能力受到限制,因为它们通常是单向的、从左到右的模型——对于给定的单词,没有能力将所有后来的单词合并到它的表示中。
  • ****从监督数据中转移学习。在转移从具有大量训练数据的监督任务中学习到的知识方面也有一些工作,例如,使用来自机器翻译模型的权重来初始化不同语言问题的参数。

问题或需要考虑的事情

  • 计算机视觉的一些工作表明,预训练和微调最有助于加快模型收敛。

结论

我希望这篇文章提供了对 BERT 现象的合理概括,并展示了这个模型在 NLP 中变得多么流行和强大。该领域正在快速发展,我们现在从最先进的模型中看到的结果甚至在 5 年前都是不可信的(例如问答中的超人表现)。最近 NLP 进展的两个关键趋势是迁移学习和变形金刚的兴起,我很想看看这些在 2020 年将如何发展。

Happy holidays!

Welocalize 是自然语言处理和翻译技术的行业领导者。要与我们团队中的某个人谈论你的 NLP 项目,请发电子邮件给 david.clark@welocalize.com 的戴夫。

用卷积神经网络对引力波进行分类

原文:https://towardsdatascience.com/2020-how-a-i-could-help-astronomers-sorting-big-data-811571705707?source=collection_archive---------32-----------------------

Python 和 Keras 信号处理实用指南。

在这篇文章中,我们展示了机器学习如何帮助天文学家对太空探索中记录的大数据进行排序。实践策略和可行的 Python 代码在从太空运来的真实数据集上提供了现场体验。具体来说,我们训练一个卷积神经网络来识别来自太空的引力波。

2020 太空年:人工智能如何帮助天文学家整理大数据

gravitational waves generated by binary neutron stars

我们都在一些常见的图像数据集(如 MNIST 或 CIFAR10)上构建、训练、评估和检查了神经网络。类似的人工智能技术已经被用于识别 YouTube 频道上的猫视频,检测癌症肿瘤或理解气候变化如何影响事物。

现在是时候在太空探索的真实世界数据集上尝试机器学习了。

我们邀请你考虑使用来自两个探测器的图像将图像分类为引力波或非探测事件的问题。

什么是引力波?

引力波是空间的拉伸和压缩,因此可以通过测量两个物体之间的长度变化来发现。

[## 引力波解释了

一种在电磁波谱之外观察宇宙的新方法。

medium.com](https://medium.com/swlh/gravitational-waves-explained-83ce37617ab2)

LIGO(激光干涉引力波天文台),世界上最大的引力波天文台,能够极其精确地记录它们。目前,数据归档保存了超过 4.5 的数据。预计它将以每年 800 的速度增长。我们得到了两个包含 NumPy 对象形式的数据的文件,由pav los proto papas教授的团队准备:

  • GW_aug.npy(关于 1568 次引力波事件的数据)
  • ND_aug.npy(关于 1216 个未检测事件的数据)

每个事件由 39 个频率分量描述。每个频率分量进一步由 100 个时间分量表示。时间分量代表在给定时间给定频率分量的归一化功率,记录在两个位置:LIGO 汉福德(H1)和 LIGO 利文斯顿(L1)。

一个事件看起来像是在 H1 和 L1 记录的信号的照片或图像。这是因为频谱图不仅在 Y 轴上绘制频率,在 X 轴上绘制时间,而且还使用颜色在 Z 轴上传达信号强度,颜色越亮,信号能量越高。因此,声谱图解释了信号强度如何分布在信号中的每个频率上。

Spectrograms of gravitational waves

Spectrograms of non-gravitational waves

如上所示,如果我们将位置视为光谱图图像的通道,分类器在处理同一事件的不同特征时应该不会有太多问题。事实上,它们可以是互补的,就像 RGB 图像中的通道一样。

用 Keras 分类引力波

每天处理 4.5 千兆字节的数据,并从非引力波中整理出引力波是一个有趣的挑战。在本节中,我们构建一个卷积神经网络(CNN)来自动将事件分类为 GW 或 ND。

CNN 的一个强大的方面是它允许图像堆叠或附加,这样网络读取汉福德数据(H1),紧接着是利文斯顿数据(L1)。下面,在组合我们的数据集后,我们创建一个数值响应变量,GWs 为 1,nd 为 0。我们还将数据分为训练集和测试集。

我们发现,使用与分类 MNIST 或 CIFAR-10 类似的网络架构也能提供可接受的结果。下面我们创建一个灵活的 CNN 架构:

  • Conv2D 添加了一个具有可变数量的过滤器和过滤器大小的卷积层。
  • L2 正则化用于避免过拟合。这意味着在每次更新之前,大的权重被罚以略小于 1 的因子。
  • 批量标准化将小批量的平均活化度保持在接近 0,活化度标准偏差保持在接近 1,以解决内部协变量偏移。这使得我们的网络能够更快地融合。
  • MaxPooling2D 图层对要素地图进行下采样,以识别最重要的要素。
  • Dropout 的工作原理是随机忽略一些节点,并强制剩余的节点学习其他功能。这提高了我们网络的泛化能力。

验证准确性是确保模型运行良好的重要方法。经过短暂的训练,CNN 模型对未知事件的分类准确率已经达到了 79.54%。

结论

2020 年将会看到中国和其他国家竞相前往火星,包括 T2、美国和 T3。这是欧洲和俄罗斯的联合行动,也是阿拉伯联合酋长国的首次火星任务。所有的希望都寄托在将人工智能作为现场天才研究助理的等价物上。

NASA Just Unveiled Its 2020 Mars Rover

在本文中,我们通过说明探索性数据分析和深度学习技术如何应用于天文学,使空间探索更接近数据科学家。我们用 LIGO 探测器记录的引力波事件训练了一个卷积神经网络。该网络能够正确识别与中子星或黑洞相关的事件,准确率接近 80%。

想要更多吗?你可以参考下面我们关于深度学习和计算机视觉基本工作机制的文章。

[## 深度学习为什么有效:解决一个农民的问题

在开始是神经元:梯度下降,反向传播,回归,自动编码器,细胞神经网络…

towardsdatascience.com](/why-deep-learning-works-289f17cab01a)

感谢阅读。

2020 年即将到来:获得第一份数据工作的实用技巧

原文:https://towardsdatascience.com/2020-is-coming-practical-tips-for-landing-your-first-data-job-13f77aab1333?source=collection_archive---------22-----------------------

Source: Pixabay at Pexels — free stock images

办公时间

记住 5 件重要的事情

数据科学是一个非常广阔的领域。一开始,数据科学家是一个包罗万象的职位。你必须了解工程和机器学习。做一个优秀的数据分析师,对云很流利。作为开发人员,编写 SQL 和一些编程语言。或者更好,做一个合适的开发者!这是压倒性的。随着领域的发展,所有这些需求都获得了各自的角色。

当我们谈论该领域的扩展时,请记住,我们不是指商业智能和统计的合并。关于这一点已经说了很多,尽管人们常说数据科学是从领域知识、统计和商业智能的融合中诞生的,但我个人认为不同,可能是我见过的最好的图形解释来自博客 Upside :

这张图片本身非常清晰,显示了商业智能和数据科学是两个完全不同的领域,因此后者的扩展来自不同角色下任务的个性化,而不是从商业智能职位到数据科学角色的某种转换。如今,你可以在数据工程师、数据科学家或数据分析师等职位上找到相同数量的职位。之后还在全面扩展中扮演其他角色,如机器学习工程或数据翻译。

所有这些都让来自不同领域的人——比如我——被对越来越多专业人士的指数级需求所吸引,也因为有机会涉足一个相对较新的领域。如果你一直喜欢数据和与数字打交道,并且喜欢试图理解事情发生的原因,这将是一个非常令人兴奋的事情。

如果你对上面的描述感同身受,并且你正在考虑进入数据科学行业,或者也许你已经走了一半,在下一篇技巧文章中,我将尝试与你分享一些我从自己的经历中学到的东西,那时我不久前决定完全进入这条道路。如果你想在 2020 年进入数据科学领域,希望它对你也有用🙂。

1.了解你自己

随着这个领域的成长,角色的多样化使得人们更容易进入这个行业,在所有可用的角色下工作。所以要做的第一件重要的事情是了解我现在已经准备好扮演哪种角色,以及几年后我想扮演哪种角色。

现在网上比较常见的三个角色可能是:

  • 数据科学家:通常负责构建机器学习模型的家伙,通常包括它要使用的大部分功能。他们负责不断改进模型的性能,并尝试新的模型以改进预测。
  • 数据工程师:这家伙可能更擅长编程和计算机科学。他们负责所有的数据流,以便从数据科学家构建的模型中获取数据。
  • :数据分析师的工作可能是这个领域中最容易被误解和混淆的工作。当我在找工作时,不断发现招聘数据分析师的职位,要求只知道和使用 Excel,不需要任何统计或数学知识,要求为商业或管理团队找到、描述和可视化见解。理想的自动化过程。这些角色我的朋友,以我的理解,是商业智能的位置。同样,在我看来,数据分析师是一个不断进行特别分析的人,对分布、概率或代数等概念有着深刻的理解,定期探索模式,以改善机器学习模型和整个公司对它们如何工作的理解。有时为数据工程设计需要哪些数据以及如何获得这些数据。

作为一名数据科学家、工程师或分析师,如果有人觉得上面的一些描述不准确,请不要怪我🙃。正如我所说的,这个领域发展得太快了,以至于无法跟上,所以可能会有一些组合,以相同或不同的角色名称出现。

如果你现在还不清楚哪一个应该是你现在和未来的角色,不要担心,我花了很长时间来理解地雷。比如我自称是数据分析师,会做机器学习。这两样我都喜欢,但我知道我现在能为数据分析师这个角色提供更多。我将来会成为全职数据科学家吗?谁知道呢。另一方面,你可能有很强的计算机科学和编程背景,能够从数据工程师做起,但知道自己最终想成为数据科学家。以我的理解,场内学习和枢转的可能性非常高。

实用提示:

  • 制定个人品牌宣言。这听起来可能很傻,但是用文字写下你的职业历程、你的主要技能、你的成就、目标以及为什么你会对公司有价值,这对了解你自己会很有帮助。是的,我确实说了 4 行或者 5 行。我知道这很少,但这种约束有助于你只追求最重要的东西。
  • 写下你的职业经历:因为对专业人士的需求很大,所以提供的机会也很大。意味着你将和一些充满激情的小伙子们竞争。因此,如果你和我一样,或者你可能来自不同的行业或有着不同的经历,一定要能够解释你的职业故事,以及你是如何和为什么进入数据科学的。

2.准备找工作:最重要的工具

之前我开始找工作,当我在找工作的时候,我听说了几个网站和一些我需要牢记在心才能成功的东西。然而,在实践中,我发现这些工具中很少是真正需要的,对我找工作有用的。更重要的是,在每天至少 6 个小时全身心投入找工作的过程中,我发现为了应对一切,在头脑中记住有限的事情是非常重要的。

天佑王者 LinkedIn :不仅是找工作的最佳地点,根据工作岗位的数量和寻找员工的人的活跃程度来看,它也是一个建立关系网和展示自己的好地方。

Source: geralt at Pixabay — free stock images

我想给刚入门的人的主要建议是:

  • 建立你的个人资料:漂亮的照片、完整的职业经历和教育背景,以及良好的拼写/语法是最基本的。从那里你可以定制你的网址——而不是使用 LinkedIn 给你的默认网址,选择一个合适的背景图片,写下一个漂亮的标题,显示你更新的联系信息,包括一个好的和可靠的总结(可以来自你的品牌声明),并尽可能填写 LinkedIn 包括的所有其他部分,如技能,成就或推荐。
  • 保持活跃:努力在网络中保持活跃,向你的数据科学相关内容的联系人展示自己,同时不断添加和跟进该领域的人员,以增加你的人脉。如果他们发布任何机会,或者在他们工作的一些公司找到工作,他们可能会有用。
  • 调整您的设置:当您的个人资料 100%完成时,就该打开“让招聘人员知道您是开放的”选项,以及使用 Premium 的免费试用。顺便说一下,就我个人而言,这是我全力推荐的东西,因为它给了你更多搜索和跟踪的机会。接下来几周,你可能会在 LinkedIn 上做得最多的两件事。
  • 接触合适的受众:与你所在城市的人联系,最好是在你感兴趣的特定行业。不要浪费时间添加来自高级组织的首席技术官或首席执行官。这些人甚至不会接近你感兴趣的招聘过程。相反,添加高级数据科学家、领导甚至人力资源部门的人员,他们可能会根据您的个人资料更多地参与流程。最后但同样重要的是——这可能是我在找工作时收到的最好的建议,加上目前在该领域工作的贵校校友。他们已经经历了这一切,他们中的许多人会很乐意帮助你推荐,或者至少是一条好的建议。

这是我在 LinkedIn 上的简介,如果你想看的话。

注意你的 Github:Github 不仅仅是一个在线分享和个人项目的地方,它也展示了你的一些东西。它显示了你有多活跃,你如何编码,你喜欢做的事情以及对你自己的基本描述。一定要推广各种各样的项目,展示不同的技能和兴趣。此外,理想情况下,尽可能频繁地推送至 GitHub。在数据科学领域寻找第一份工作的一部分就像学习一项运动:你不能暂时停止这项运动,否则,你会忘记东西。所以一定要坚持不懈地推进你的日常工作,这样你才能显示出你的积极和提高你的技能。例如,这是我的简介。

我自己在 GitHub 上的活动面板的例子。

****你的简历很重要:如今,简历仍然非常重要,尽管我不会给出关于风格和设计的建议,因为这可能非常主观,但我会给你一些我听过的最好的建议:

  • 保持简短:理想情况下 1 页,最多 2 页。即使你有 8 年的工作经验和博士学位。人们只是不读更多。
  • 联系方式:包含你所有的联系方式,并且要包含正确。仔细检查你的电话、电子邮件和所有网址。
  • 介绍自己:开头的个人简历很重要。人力资源人员和招聘经理会收到数百份求职简历。给他们一个快速的理由继续阅读你的全部课程。
  • 包含你的技能:不要让别人从你以前的工作描述和教育中解读你的整套技能,让他们更容易明白这些技能。此外,一些公司使用软件来识别课程中的关键词并进行过滤。所以确保重要的东西在你的简历中至少被提到一次。
  • 细节很重要:好的拼写、文本对齐、可扫描性、你要发送的文件的名称……所有这些都是关于你自己的。所以要比以前更整洁。

3.去哪里找

我们的任务是尽可能有效地利用我们的时间。很多招聘网站甚至在开始搜索和申请他们的职位之前就要求你填写一份很长很长的简历。此外,许多公司会在几个地方发布招聘信息,所以你看到的许多工作岗位会在不同的站点之间重复出现。所以,明智地利用你的时间,不要花几个小时在几个求职网站上寻找工作岗位,而是选择几个并关注它们。

对我来说,前面提到的主要工作板块是 LinkedIn。第二个可能取决于你住在哪里或者你感兴趣的公司类型。在英国,玻璃门或的确都是不错的选择。但如果你想加入一家初创公司,安吉尔可能是你的选择。

不过最重要的一点是:不要浪费时间。每天你应该用不到 50%的专属求职时间寻找合适的职位,其余的时间去申请,包括填写大量公司简介的数据和写漂亮的求职信。这听起来可能需要很多时间,但请记住,你还应该做一些兼职项目,在 LinkedIn 上保持活跃,最终准备面试,还要有自己的生活,所以你可以明白为什么我们不想浪费任何时间,如果不值得工作的话。

4 应用策略并跟踪所有

找一份全职工作可能比人们通常认为的压力更大。这就是为什么保持条理对你来说很重要:

  • 从分解你的一周开始。周一和周五通常是申请或接触他人的糟糕日子。所以,利用这些日子做你的兼职项目,写求职信,学习一些东西或者寻找周围的人。
  • 应用,应用,应用。当我在找工作时,学校的人告诉我们要争取每周提交 10 到 20 份申请。不知道这个数字是从哪里来的,但是在实践中,这感觉像是一个激进而迫切的目标,但是完全可行且富有成效。
  • 记录每件事。你发申请了吗?在 LinkedIn 上加了个人?给在聚会上认识的人写了封邮件?不管是什么事情,找一个你觉得舒服的工具或方法,并把它写下来。在我的例子中,这个工具是一个简单的谷歌表单。每次我联系某人或申请职位时,我都会写下我联系的人、我是如何联系的、发生的日期以及一些对我自己更有用的数据。这一点尤其重要,如果我到那时还没有得到通知的话,会在整整一周之后跟进每个行动。不要害怕这样做,人们通常不会太在意。****
  • 多做一点。无论你是通过求职公告板还是公司网站申请职位,一定要在之后写好封面(简短而甜蜜:两段……一段关于你,一段关于机会和公司),最好通过电子邮件或 LinkedIn 直接发给公司里的某个人。而你在后者没有溢价,不用担心,一条用词恰当的短信会比什么都没有强。

关于求职信已经说了很多,但是以我的经验来看,即使没人看,如果你花时间完整地写了一些关于你申请的机会的东西,它也显示了你的一些东西。

5.准备你的面试

Source: Startup Stock Photos at Pexels — free stock images

不为面试做准备就像根本不去一样。在我看来,这些是你总是需要准备的主要东西:

  1. ****技术问题:数据科学领域有一系列基本问题,尤其是在初次面试时会被问到。我们不会一一列举这个故事,但是我推荐 Nitin Panwar 的这个故事,你可以很容易地在谷歌上找到几个列出所有这些问题的网站。
  2. ****能力问题:这更多的是关于你自己……以前的经历、教育、技能、优势、劣势、动机等。同样,许多在线网站都有这些问题的例子供你准备,尽管我发现这个网站特别好。
  3. 公司和角色:雇主希望员工积极主动,对公司感兴趣,所以一定要尽可能多地研究,并在面试中展示你的知识

如前所述,所有这些观点和建议试图总结我在自己求职过程中发现的所有有用的东西,但也是从我的几个同学的求职中发现的。然而,我敢肯定,许多其他人可能对我在这篇文章中提到的一些事情有不同的体验,或者他们可能有一些额外的东西添加到我在这里试图编译的求职工具包中。如果是这样的话,请一定要在评论中分享你的经验,这样我们都可以从中学习!

请记住,数据科学是一个不断变化的领域。在过去的一年里,它发生了很大的变化,你可以肯定,在未来的几年里,它将继续变化。所以继续前进!听播客,参加聚会,尽可能多的阅读书籍,不断学习新的东西,当然,在 Medium 中保持关注…这是一个让你保持消息灵通的神奇来源。

如果你喜欢这个故事,别忘了看看我最近的一些文章,比如 9 本与数据科学相关的书向圣诞老人索要圣诞礼物和一篇 NLP 介绍和 5 个提高游戏技巧。在我的媒体简介中可以找到所有这些和更多🙂。

还有如果你想直接在你的邮箱里收到我的最新文章,只需** 订阅我的简讯 😃**

感谢您的阅读,媒体上见!

您可以使用的 21 种最流行的实时聊天软件解决方案

原文:https://towardsdatascience.com/21-of-the-most-popular-live-chat-software-solutions-you-can-use-f0c5c53ec77e?source=collection_archive---------39-----------------------

您知道吗,使用实时聊天软件的企业中有 49%的企业在实施两年内转化率有所提高。

此外,使用它不到一年的 30%的企业声称,由于他们的实时聊天软件,收入增加了 5-10%。这些统计数据凸显了实时聊天对企业日益增长的重要性。

它有助于客户获得对其查询的即时响应。此外,企业主可以将他们的 CRM 数据库与他们的实时聊天软件相集成,以了解客户行为。这反过来可以帮助他们做出更明智的商业决策。总体来说,这是一个双赢的局面。

最佳实时聊天软件

如果你还没有利用实时聊天软件,是时候加入了。毕竟,你想比你的竞争对手更胜一筹。为了帮助你做出明智的决定,我整理了一份最好的实时聊天软件清单,你应该看看。

直播聊天软件#1: 直播聊天

LiveChat 的客户遍布 150 个国家的 27,000 多家公司,显然非常受欢迎。它最大的优点在于简单。

它干净、整洁、易于使用。您可以将它与 130 多种工具无缝集成,包括 Shopify、WordPress、MailChimp 等。因此,您可以在同一个平台上与潜在客户聊天,同时将他们的详细信息添加到您的 CRM 软件中。

根据所提供的功能,它们的价格从每月 16 美元到 50 美元不等。

图片 via LiveChat

直播聊天软件#2: Olark

Olark 面向那些希望利用数据来了解客户行为的人。它允许你参与并认同那些看起来最有希望的线索。

这款实时聊天软件提供定制的聊天前调查、实时聊天记录、自动消息传递、访客洞察和详细报告等功能。

Olark 的另一个有趣的特性是,它允许你调整你的实时聊天框的外观,以匹配你的品牌颜色。他们的计划从每月 12 美元开始,一直涨到 17 美元。

图像通过 Olark

直播聊天软件#3: 对讲机

想要在您的实时聊天中增加乐趣吗?使用表情符号和 gif。

Intercom 的现代实时聊天旨在引发对话,帮助您与目标受众建立联系,同时保持轻松。它允许您自定义实时聊天,还可以为 web、Android 和 iOS 配置不同的设置。

这款实时聊天软件的定价较高。从 87 美元开始,根据你选择的计划,价格可以超过每月 150 美元。

图像通过 对讲机

实时聊天软件#4: 伽椰子

如果提供实时聊天支持是你的最终目标,伽椰子是最好的方式。您可以轻松地将实时聊天功能添加到您的移动应用程序、网站或帮助中心。

即使您的团队离线,伽椰子也允许客户发送他们的问题。另一方面,如果客户走开了,错过了你的信息,这个软件会自动向他们发送一封电子邮件,这样你就可以继续交谈。

他们的计划从每月 15 美元到 60 美元不等。

图片经由 伽椰子

实时聊天软件#5: 获取

实时聊天完全是为了延长即时客户服务。有时,通过文本聊天可能还不够。在这种时候,Acquire 的视频和语音通话功能就派上了用场。它可以创造奇迹,提高你与客户的转换质量。

Acquire 的基本月套餐起价为每月 40 美元。他们还为企业制定了单独的计划,附带了许多额外的功能,如支持机器人、视频录制、智能建议等。

图像通过 采集

实时聊天软件#6: LiveHelpNow

LiveHelpNow 旨在通过其实时聊天服务、常见问题仪表板、短信支持和其他无缝集成的工具来简化客户支持。

最棒的是,你可以用一个账户支持无限数量的品牌。因此,您可以从一个平台管理您的所有网站。

他们的聊天、支持票和 FAQ 服务每个月都要花费 21 美元。对于电话管理,他们每月收费 9 美元。

图片通过LiveHelpNow

实时聊天软件#7: Tawk

要让这个实时聊天软件工作,你所要做的就是复制一个简单的 Javascript 行,并将其粘贴到你的网站的 HTML 中。不到一分钟,它就开始运行了。

最棒的是 Tawk 是完全免费的。如果你不想自己回答客户的问题,你可以从他们那里雇一个聊天代理,每小时 1 美元。

图像经图克

直播聊天软件#8: OCC 直播帮助

OCC 是在线聊天中心的缩写。他们的软件旨在迎合所有层次的网站所有者。对于刚创业的人,他们有一个运营商一个网站的免费基础聊天。

这个免费的包允许你监控访问,无限制聊天,上传自定义聊天图标,邀请访问者聊天,等等。对于更高级的功能,他们也有每月 5 美元和 50 美元的其他计划。

图像通过OCCLiveHelp

实时聊天软件#9: 用户型

Userlike 的最终目的是帮助你与客户建立关系。使用该软件,您可以使用粘性聊天创建个性化消息。

它的作用是,如果客户第二次回来聊天,他们会将他们连接到之前交谈过的接线员。通过这种方式,他们想在谈话中建立一种连贯性。

他们有一个基本的免费计划,但对于高级功能,你可以选择从€29 到€299 不等的计划。

图片经由 用户喜欢的

实时聊天软件#10: 我的实时聊天

想免费和你的网站访问者聊天吗?使用我的 LiveChat 的浮动聊天按钮。要在你的网站上获得它,你只需要插入一个 HTML 代码。它不会干扰你的网站设计,所以你不需要为此烦恼。

其他计划每月从 19 美元开始,直到 99 美元。

图片 via 我的 LiveChat

实时聊天软件#11: 谁的

谁知道千篇一律的实时聊天软件并不适用于所有人。因此,他们为那些需要一个适合他们需求的软件的人提供了一个解决方案。他们经验丰富的团队可以帮助你应对你面临的任何挑战。

使用 WhosOn,您可以在内部保存您的聊天数据,并在不同品牌之间定制您的聊天。他们的基本计划是免费的,而最高级的计划每月收费 46 美元。

图片 via WhosOn

直播聊天软件#12: 纯聊天

Pure Chat 的免费实时聊天软件包括可定制的小工具、原生 iOS 和 Android 应用程序、无限制聊天和强大的操作员仪表板等功能。他们允许在这个套餐中免费提供 3 个运营商。

你也可以使用他们免费的自动聊天机器人来捕捉线索、安排约会和完成支付。

图片经由 纯聊天

实时聊天软件#13: Comm100

Comm10 允许您通过传统的消息、音频、视频联系客户,还提供共同浏览和远程浏览器控制。为了更快地解决问题,你还可以在它的平台上共享URL和文件。

他们的套餐价格从 29 美元起,超过 49 美元。

图片经由 Comm100

实时聊天软件#14: JivoChat

这种一体化的业务管理器确保您可以在所有可能的平台上与您的客户取得联系。您可以在一个屏幕上接收电话、电子邮件和聊天。

它还可以选择与 Weebly、Wix、 BigCommerce 等平台集成。你可以免费使用基础版,而专业版每月收费 30 美元。

图片经由JivoChat

精选的相关内容:

  • 人工智能在数字营销中的未来

实时聊天软件#15: 新鲜事

转化、支持或入职——无论你的目标是什么,Freshworks 都有适合你的东西。通过所有阶段,Freshworks 实时聊天选项可以确保客户体验的连贯性。

虽然他们的基本型号是免费的,但最高级的每月费用超过 70 美元。

形象经由新鲜出炉

实时聊天软件#16: REVE Chat

这款全渠道实时聊天软件允许您使用共同浏览功能与客户进行互动和协作。

它们还允许屏幕共享以及语音和视频通话,以确保客户获得最佳体验。标准套餐每月 13.50 美元,而企业套餐每月 45 美元。

图像通过 查看聊天

实时聊天软件#17: ZaZaChat

使用 ZaZaChat,您可以向您的客户发送基于行为的消息。不要等他们问你问题,你可以根据他们的行动直接发出信息。

甚至在开始聊天之前,您就可以使用他们的预表单功能来收集他们的联系信息。

他们的基本包对所有人都是免费的,而其他的价格范围是每月 14-59 美元。

图片经由ZaZaChat

实时聊天软件#18: Zoho SalesIQ

Zoho SalesIQ 相信在客户支持方面采取积极主动的方法。因此,他们的实时聊天功能允许你甚至在访问者键入查询之前就向他们发送消息。基于他们的聊天知识库,你可以嵌入链接到流行的常见问题或其他文章。

当你的员工不在的时候,佐霍会代替你。您可以设置一个离线代理为您处理问题。

图片经由 Zoho

实时聊天软件#19: LiveAgent

LiveAgent 让您可以轻松地在多个平台上与客户取得联系。在其实时聊天软件上,你可以为你的社交媒体提及、电子邮件、聊天和电话创建一个通用收件箱。

其他功能包括强大的票务系统、呼叫中心和支持中心。他们的套餐价格在每月 15-39 美元之间。

图片 vialive agent

20 号实时聊天软件: Happyfox

Happyfox 很容易安装,只需几分钟就能安装完毕。一旦完成,你就可以将其与你的品牌审美相匹配。你不需要成为编码专家。这是一个简单的过程,需要你遵循几个步骤。

对于那些想要使用实时聊天来获得支持的人和那些想要使用它来增加销售的人,它们有不同的功能。他们的月计划从 29.99 美元到 99.99 美元不等。

图像通过happy fox

直播聊天软件#21: Netrox SC

Netrox SC 是为那些想要使用实时聊天来提高销售额的人准备的。他们的实时聊天有一个独特的功能,叫做“聊天区”,允许你跟踪你的网站访问者,对他们进行分类,并开始与他们交谈。

他们的精简版是免费的,而专业版每月收费 14 美元。

图片 vianet rox SC

结论

实时聊天可以让您的客户支持更上一层楼。它可以让您在几秒钟内回复客户的查询。在某些情况下,你可以在他们问你之前主动给他们一个答案。

不仅如此,还能提高客户满意度,让你获得更多的转化。我希望你能从上面提到的工具中找到最适合你业务的实时聊天软件。

本文发表在 谢恩巴克 的博客上。

关于作者

谢恩·巴克是内容解决方案和礼品公司的创始人兼首席执行官。你可以在推特、脸书、 LinkedIn 、 Instagram 、 iTunes 上和他联系。

绝对初学者的 21 熊猫操作

原文:https://towardsdatascience.com/21-pandas-operations-for-absolute-beginners-5653e54f4cda?source=collection_archive---------2-----------------------

先决条件:Python 和 NumPy 基础。

Source: https://pandas.pydata.org/

介绍

Pandas 是一个易于使用并且非常强大的数据分析库。像 NumPy 一样,它将大多数基本操作矢量化,即使在 CPU 上也可以并行计算,从而提高计算速度。这里指定的操作是非常基本的,但是如果你刚刚开始接触熊猫,那么这些操作就太重要了。您需要将 pandas 作为“pd”导入,然后使用“pd”对象来执行其他基本的 pandas 操作。

  1. 如何从 CSV 文件或文本文件中读取数据?

CSV 文件以逗号分隔,因此为了读取 CSV 文件,请执行以下操作:

df = pd.read_csv(file_path, sep=’,’, header = 0, index_col=False,names=None)**Explanation:**‘read_csv’ function has a plethora of parameters and I have specified only a few, ones that you may use most often. A few key points:a) **header=0** means you have the names of columns in the first row in the file and if you don’t you will have to specify header=Noneb) **index_col = False** means to not use the first column of the data as an index in the data frame, you might want to set it to true if the first column is really an index.c) **names = None** implies you are not specifying the column names and want it to be inferred from csv file, which means that your header = some_number contains column names. Otherwise, you can specify the names in here in the same order as you have the data in the csv file. 
**If you are reading a text file separated by space or tab, you could simply change the sep to be:**sep = " " or sep='\t'

2。如何使用预先存在的列或 NumPy 2D 数组的字典创建数据框?

使用字典

# c1, c2, c3, c4 are column names. 
d_dic ={'first_col_name':c1,'second_col_names':c2,'3rd_col_name':c3} df = pd.DataFrame(data = d_dic)

使用 NumPy 数组

np_data = np.zeros((no_of_samples,no_of_features)) #any_numpy_arraydf = pd.DataFrame(data=np_data, columns = list_of_Col_names)

3。如何可视化数据框中顶部和底部的 x 值?

df.head(num_of_rows_to_view) #top_values
df.tail(num_of_rows_to_view) #bottom_valuescol = list_of_columns_to_view df[col].head(num_of_rows_to_view)
df[col].tail(num_of_rows_to_view)

4。如何重命名一列或多列?

df = pd.DataFrame(data={'a':[1,2,3,4,5],'b':[0,1,5,10,15]})new_df = df.rename({'a':'new_a','b':'new_b'})

重要的是将返回的数据帧存储到新的数据帧#中,因为重命名不是原位的。

5。如何获取列表中的列名?

df.columns.tolist()

如果您只想遍历名称,不使用 tolist()函数也可以做到这一点,但它会将所有内容作为索引对象返回。

6。如何求一个数列中值的出现频率?

df[col].value_counts() #returns a mapper of key,frequency pairdf[col].value_counts()[key] to get frequency of a key value

7。如何重置现有列或其他列表或数组的索引?

new_df = df.reset_index(drop=True,inplace=False)

如果你做 inplace=True ,就没有必要把它存储到 new_df。此外,当您将索引重置为 pandas RangeIndex()时,您可以选择保留旧索引或使用' drop '参数将其删除。您可能希望保留它,特别是当它最初是列之一,并且您临时将其设置为 newindex 时。

8。如何删除列?

df.drop(columns = list_of_cols_to_drop)

9。如何更改数据框中的索引?

df.set_index(col_name,inplace=True)

这会将 col_name col 设置为索引。您可以传递多个列来将它们设置为索引。inplace 关键字的作用和以前一样。

10。如果行或列有 nan 值,如何删除它们?

df.dropna(axis=0,inplace=True)

axis= 0 将删除任何具有 nan 值的列,这可能是您在大多数情况下不需要的。axis = 1 将只删除任何列中具有 nan 值的行。原地同上。

11。在给定条件下,如何对数据帧进行切片?

您总是需要以逻辑条件的形式指定一个掩码。
例如,如果您有年龄列,并且您想要选择年龄列具有特定值或位于列表中的数据框。然后,您可以实现如下切片:

mask = df['age'] == age_value 
or
mask = df['age].isin(list_of_age_values)result = df[mask]

具有多个条件:例如,选择高度和年龄都对应于特定值的行。

mask = (df['age']==age_value) & (df['height'] == height_value)result = df[mask]

12。给定列名或行索引值,如何对数据框进行切片?

这里有 4 个选项:at、iat、loc 和 iloc。其中“iat”和“iloc”在提供基于整数的索引的意义上是相似的,而“loc”和“at”提供基于名称的索引。

这里要注意的另一件事是“iat”,在为单个元素“提供”索引时,使用“loc”和“iloc”可以对多个元素进行切片。

Examples:a) 
df.iat[1,2] provides the element at 1th row and 2nd column. Here it's important to note that number 1 doesn't correspond to 1 in index column of dataframe. It's totally possible that index in df does not have 1 at all. It's like python array indexing.b)
df.at[first,col_name] provides the value in the row where index value is first and column name is col_namec)
df.loc[list_of_indices,list_of_cols] 
eg df.loc[[4,5],['age','height']]
Slices dataframe for matching indices and column namesd)
df.iloc[[0,1],[5,6]] used for interger based indexing will return 0 and 1st row for 5th and 6th column.

13。如何对行进行迭代?

iterrows() and itertuples()for i,row in df.iterrows():
    sum+=row['hieght']iterrows() passess an iterators over rows which are returned as series. If a change is made to any of the data element of a row, it may reflect upon the dataframe as it does not return a copy of rows.itertuples() returns named tuplesfor row in df.itertuples():
    print(row.age)

14。如何按列排序?

df.sort_values(by = list_of_cols,ascending=True) 

15。如何将一个函数应用到一个系列的每个元素上?

df['series_name'].apply(f) where f is the function you want to apply to each element of the series. If you also want to pass arguments to the custom function, you could modify it like this.def f(x,**kwargs):
    #do_somthing
    return value_to_storedf['series_name'].apply(f, a= 1, b=2,c =3)If you want to apply a function to more than a series, then:def f(row):
    age = row['age']
    height = row['height']df[['age','height']].apply(f,axis=1)
If you don't use axis=1, f will be applied to each element of both the series. axis=1 helps to pass age and height of each row for any manipulation you want.

16。如何将函数应用于数据框中的所有元素?

new_df = df.applymap(f)

17。如果一个序列的值位于一个列表中,如何对数据帧进行切片?

使用掩码和 isin。要选择年龄在列表中的数据样本:

df[df['age'].isin(age_list)]

要选择相反的情况,年龄不在列表中的数据样本使用:

df[~df['age'].isin(age_list)]

18。如何按列值分组并在另一列上聚合或对其应用函数?

df.groupby(['age']).agg({'height':'mean'})

这将按系列“年龄”对数据框进行分组,对于高度列,将应用分组值的平均值。有时,您可能希望按某一列进行分组,并将其他列的所有相应分组元素转换为一个列表。您可以通过以下方式实现这一目标:

df.groupby(['age']).agg(list)

19。如何为特定列的列表中的每个元素创建其他列的副本?

这个问题可能有点混乱。我实际上的意思是,假设你有下面的数据帧 df:

Age Height(in cm)20  180
20  175
18  165
18  163
16  170

在使用列表聚合器应用 group-by 后,您可能会得到如下结果:

Age Height(in cm)
20  [180,175]
18  [165,163]
16  [170]

现在,如果您想通过撤消上一次操作返回到原始数据框,该怎么办呢?你可以使用熊猫 0.25 版本中新引入的名为 explode 的操作来实现。

df['height'].explode() will give the desired outcome.

20。如何连接两个数据帧?

假设您有两个数据帧 df1 和 df2,它们具有给定的列名、年龄和高度,并且您想要实现这两个列的连接。轴=0 是垂直轴。这里,结果数据帧将具有从数据帧追加的列:

df1 --> name,age,height
df2---> name,age,heightresult = pd.concat([df1,df2],axis=0)

对于水平连接,

df1--> name,agedf2--->height,salaryresult = pd.concat([df1,df2], axis=1) 

21。如何合并两个数据框?

For the previous example, assume you have an employee database forming two dataframes likedf1--> name, age, heightdf2---> name, salary, pincode, sick_leaves_takenYou may want to combine these two dataframe such that each row has all details of an employee. In order to acheive this, you would have to perform a merge operation.df1.merge(df2, on=['name'],how='inner')This operation will provide a dataframe where each row will comprise of name, age, height, salary, pincode, sick_leaves_taken. how = 'inner' means include the row in result if there is a matching name in both the data frames. For more read: [https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html?highlight=merge#pandas.DataFrame.merg](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html?highlight=merge#pandas.DataFrame.merge)e

总结

作为初学者,对于任何数据分析项目,您可能需要非常了解这些操作。我一直认为 Pandas 是一个非常有用的库,现在你可以集成各种其他数据分析工具和语言。在学习支持分布式算法的语言时,了解 pandas 的操作甚至会有所帮助。

接触

如果你喜欢这篇文章,请鼓掌并与其他可能会发现它有用的人分享。我真的很喜欢数据科学,如果你也对它感兴趣,让我们在 LinkedIn上联系或者在这里关注我走向数据科学平台。

适用于初学者的 27 种数字操作

原文:https://towardsdatascience.com/27-things-that-a-beginner-needs-to-know-about-numpy-edda217fb662?source=collection_archive---------10-----------------------

初学者的数据操作。

Source: scipy-lectures.org

简介

在我之前的一篇关于 21 熊猫绝对初学者操作的文章中,我讨论了一些重要的操作,可以帮助新手开始数据分析。这篇文章应该为 NumPy 提供类似的目的。简单介绍一下,NumPy 是一个非常强大的库,可以用来执行各种操作,从寻找数组的平均值到快速傅立叶变换和信号分析。从这个意义上说,它非常类似于 MATLAB。

您需要将 NumPy 作为“np”导入,然后使用它来执行操作。

操作:

  1. 将列表转换为 n 维 NumPy 数组
numpy_array = np.array(list_to_convert)

2。np.newaxis 和 np.reshape 的使用

np.newaxis 用于创建大小为 1 的新维度。例如

a = [1,2,3,4,5] is a list
a_numpy = np.array(a)

如果你打印a_numpy.shape,你会得到(5,)。为了使其成为行向量或列向量,可以这样做

row_vector = a_numpy[:,np.newaxis] ####shape is (5,1) now
col_vector = a_numpy[np.newaxis,:] ####shape is (1,5) now

类似地,np.reshape 可以用来整形任何数组。例如:

a = range(0,15) ####list of numbers from 0 to 14
b = a.reshape(3,5) 
b would become:
[[0,1,2,3,4],
 [5,6,7,8,9],
 [10,11,12,13,14],
 [15,16,17,18,19]]

3。将任何数据类型转换为 NumPy 数组

用 np.asarray .作 eg

a = [(1,2), [3,4,(5)], (6,7,8)]
b = np.asarray(a)
b::
array([(1, 2), list([3, 4, (5, 6)]), (6, 7, 8)], dtype=object)

4。得到一个 n 维的零数组。

a = np.zeros(shape,dtype=type_of_zeros)
type of zeros can be int or float as it is required
eg.
a = np.zeros((3,4), dtype = np.float16)

5。获取 1 的 n 维数组。

类似于 np.zeros:

a = np.ones((3,4), dtype=np.int32)

6。np.full 和 np.empty

np.full 用于用一个特定值填充数组,而 np.empty 通过用随机值初始化它们来帮助创建数组。例如。

**1.** np.full(shape_as_tuple,value_to_fill,dtype=type_you_want)
a = np.full((2,3),1,dtype=np.float16)a would be:
array([[1., 1., 1.],
       [1., 1., 1.]], dtype=float16)**2.** np.empty(shape_as_tuple,dtype=int)
a = np.empty((2,2),dtype=np.int16)
a would be:array([[25824, 25701],
       [ 2606,  8224]], dtype=int16) The integers here are random.

7。用 np.arrange 和 np.linspace 得到一个等间距值的数组

两者都可以用于排列,以创建元素间距均匀的数组。

林空间:

np.linspace(start,stop,num=50,endpoint=bool_value,retstep=bool_value)**endpoint specifies if you want the stop value to be included and retstep tells if you would like to know the step-value.'num' is the number of integer to be returned where 50 is default Eg,**np.linspace(1,2,num=5,endpoint=False,retstep=True)This means return 5 values starting at 1 and ending befor 2 and returning the step-size.output would be:
(array([1\. , 1.2, 1.4, 1.6, 1.8]), 0.2) ##### Tuple of numpy array and step-size

阿兰格:

np.arange(start=where_to_start,stop=where_to_stop,step=step_size)

如果只提供了一个数字作为参数,它被视为一个停止,如果提供了两个,它们被假定为开始和停止。注意这里的拼写。

8。寻找 NumPy 数组的形状

array.shape

9。知道 NumPy 数组的维数

x = np.array([1,2,3])
x.ndim will produce 1

10。寻找 NumPy 数组中元素的个数

x = np.ones((3,2,4),dtype=np.int16)
x.size will produce 24

11。获取一个 n 维数组所占用的内存空间

x.nbytesoutput will be 24*memory occupied by 16 bit integer = 24*2 = 48

12。查找 NumPy 数组中元素的数据类型

x = np.ones((2,3), dtype=np.int16)x.dtype will produce
dtype('int16')It works better when elements in the array are of one type otherwise typecasting happens and result may be difficult to interpret.

13。如何创建 NumPy 数组的副本

使用 np.copy

y = np.array([[1,3],[5,6]])
x = np.copy(y)If,
x[0][0] = 1000Then,
x is
100 3
5 6y is
1 3
5 6

14。获取 n-d 数组的转置

使用 array_name。T

x = [[1,2],[3,4]]
x
1 2
3 4x.T is
1 3
2 4

15。展平 n-d 数组得到一维数组

使用 np.reshape 和 np.ravel:

np.reshape:这真是一个又好又甜的把戏。在整形时,如果您提供-1 作为维度之一,那么它是从元素的数量中推断出来的。例如,对于一个大小为(1,3,4)的数组,如果它被整形为(-1,2,2),,那么第一维的长度被计算为3。所以,

If x is:
1 2 3
4 5 9
Then x.reshape(-1) produces:
array([1, 2, 3, 4, 5, 9])

np .拉威尔

x = np.array([[1, 2, 3], [4, 5, 6]])x.ravel() produces
array([1, 2, 3, 4, 5, 6]) 

16。改变 n-d 数组的轴或交换维度

使用 np.moveaxis 和 np.swapaxes。

x = np.ones((3,4,5))
np.moveaxis(x,axes_to_move_as_list, destination_axes_as_list)
For eg.x.moveaxis([1,2],[0,-2])This means you want to move 1st axis to 0th axes and 2nd axes to 2nd last axis. So,the new shape would be.(4,5,3)

转换没有到位,所以不要忘记将它存储在另一个变量中。

np.swapaxes。

x = np.array([[1,2],[3,4]])x.shape is (2,2) and x is
1 2
3 4np.swapaxes(x,0,1) will produce
1 3
2 4If x = np.ones((3,4,5)), and
y = np.swapaxes(0,2)
y.shape will be
(5,4,3)

17。将 NumPy 数组转换为列表

x = np.array([[3,4,5,9],[2,6,8,0]])
y = x.tolist()
y will be
[[3, 4, 5, 9], [2, 6, 8, 0]]

NumPy 文档提到,如果 x 是一维数组,使用list(x)也可以。

18。更改 NumPy 数组中元素的数据类型。

使用 ndarray.astype

x = np.array([0,1,2.0,3.0,4.2],dtype=np.float32)x.astype(np.int16) will producearray([0, 1, 2, 3, 4], dtype=int16)x.astype(np.bool) will produce 
array([False,  True,  True,  True,  True])

19。获取非零元素的索引

使用 n-dim_array .非零()

x = np.array([0,1,2.0,3.0,4.2],dtype=np.float32)
x.nonzero() will produce(array([1, 2, 3, 4]),) It's important to note that x has shape (5,) so only 1st indices are returned. If x were say,x = np.array([[0,1],[3,5]])
x.nonzero() would produce (array([0, 1, 1]), array([1, 0, 1]))So, the indices are actually (0,1), (1,0), (1,1). 

20。排序 NumPy 数组

使用 NP . ndarray . sort(axis = axis _ you _ want _ to _ sort _ by)

x = np.array([[4,3],[3,2])
x is
4 3
3 2x.sort(axis=1) #sort each row3 4
2 3x.sort(axis=0) #sort each col3 2
4 3

21。将 NumPy 数组与值进行比较

比较将产生布尔类型的 n 维数组。例如

x = np.array([[0,1],[2,3]])x==1 will produce
array([[False,  True],
       [False, False]])

如果你想数 x 中的数字 1,你可以这样做

(x==1).astype(np.int16).sum()

它应该输出1

22。将两个数字矩阵相乘

使用 numpy.matmul 获取二维矩阵的矩阵乘积:

a = np.eye(2) #identity matrix of size 2
a
1 0
0 1b = np.array([[1,2],[3,4]])
b
1 2
3 4np.matmul(a,b) will give
1 2
3 4

如果我们提供一个一维数组,那么输出可能会非常不同,因为将使用广播。我们将在下面进行讨论。此外,还有另一个名为np.multiply的函数,它执行元素到元素的乘法。对于前两个矩阵,np.multiply(a,b)的输出为。

1 0
0 4

23。两个数组的点积

np.dot(矩阵 1,矩阵 2)

a = np.array([[1,2,3],[4,8,16]])
a:
1 2 3
4 8 16b = np.array([5,6,11]).reshape(-1,1)b:
5
6
11np.dot(a,b) produces
38
160
Just like any dot product of a matrix with a column vector would produce.

行向量与列向量的点积将产生:

if a is array([[1, 2, 3, 4]])
and b is:

array([[4],
       [5],
       [6],
       [7]])np.dot(a,b) gives:array([[60]])a's shape was (1,4) and b's shape was (4,1) so the result will have shape (1,1)

24。获取两个 numpy 向量的叉积

从物理学上回忆向量叉积。它是关于一点的力矩的方向。

x = [1,2,3]
y = [4,5,6]z = np.cross(x, y)z is:
array([-3,  6, -3]) 

25。获取数组的梯度

使用 np.gradient. NumPy 使用泰勒级数和中心差分法计算梯度。你可以在这篇文章中读到更多。

x = np.array([5, 10, 14, 17, 19, 26], dtype=np.float16)np.gradient(x) will be:
array([5\. , 4.5, 3.5, 2.5, 4.5, 7\. ], dtype=float16)

二十六。NumPy 数组怎么切片?

For single element:
x[r][c] where r,c are row and col number of the element.For slicing more than one element.x:
2 4 9
3 1 5
7 8 0and you want 2,4 and 7,8 then dox[list_of_rows,list_of_cols] which would bex[[0,0,2,2],[0,1,0,1]] producesarray([2, 4, 7, 8])If one of the rows or cols are continuous, it's easier to do it:x[[0,2],0:2] producesarray([[2, 4],
       [7, 8]])

二十七。广播

任何关于 NumPy 的文章如果不包括广播都是不完整的。这是一个重要的概念,有助于 NumPy 向量化操作,从而加快计算速度。理解一些规则将有助于你更好地剖析广播。

来自 NumPy 文档:

当操作两个数组时,NumPy 按元素比较它们的形状。它从尾部维度开始,向前推进。在以下情况下,二维是兼容的

1.他们是平等的,或者

2.其中一个是 1

另一件要记住的事情是,

如果尺寸匹配,输出将具有每个尺寸的最大长度。如果其中一个维度的长度为 1,则该维度中的值将重复

假设有两个数组 A 和 B,维度分别为**(3,4,5)****(4,1)** ,你想把这两个数组相加。由于它们没有相同的形状,NumPy 将尝试广播这些值。它开始比较最后一个维度的长度:5 和 1,这两个值不相等,但因为其中一个是 1,所以它将重复,最终输出在最后一个维度的长度为 5。

两者的倒数第二个尺寸具有相同的长度4

A 中倒数第三个维度或第一个维度的长度为3,而 B 没有任何长度。当一个向量中缺少一个维度时,NumPy 会在向量前加 1。于是,B 变成了**(1,4,1)** 现在,长度匹配为 3 和 1,值在 b 中重复 3 次。最终输出将具有形状**(3,4,5)**

a :3 5 8
4 5 6
9 7 2b :b = [2,3,4]a's shape: (3,3)
b's shape: (3,)Last dimension has same length 3 for the two and then 1 is prepended to the the dimension of b as it doesn't have anything in that dimension. So, b becomes [[2,3,4]] having shape (1,3). Now, 1st dimension match and values are repeated for b. Finally, b can be seen as2 3 4
2 3 4
2 3 4So, a+b produces5 8 12
6 8 10
11 10 6

查看更多广播上的这些帖子:第一和第二

总结

感谢您的阅读。希望这篇文章对需要入门 NumPy 的人有所帮助。我发现这些操作非常有用,把它们放在我们的提示中总是好的。这些操作非常基本,在 NumPy 中可能有不同的方法来实现相同的目标。除了一些其他的帖子,我大部分时候使用 NumPy 文档作为参考,这些帖子的链接已经提供了。此外,如果你有兴趣,可以看看我关于绝对初学者的 21 熊猫操作和 Spark 装置的帖子。

接触

如果你喜欢这篇文章,请分享给其他可能会觉得有用的人。我真的很喜欢数据科学,如果你也对它感兴趣,让我们在 LinkedIn 上联系,或者在这里关注我走向数据科学平台。

2D 还是 3D?用于心脏图像自动分割的卷积神经网络的简单比较

原文:https://towardsdatascience.com/2d-or-3d-a-simple-comparison-of-convolutional-neural-networks-for-automatic-segmentation-of-625308f52aa7?source=collection_archive---------1-----------------------

卷积神经网络(CNN)已经显示出对大量计算机视觉任务的承诺。这些应用中包括自动分割。医学成像的分割在研究环境中用于计算建模、定量研究和基于人群的分析的发展。此外,医学成像分割在从诊断到患者专用设备开发的行业中都有应用。根据应用的不同,单个扫描体积的手动分割可能需要几个小时。另一方面,训练有素的 CNN 可以在几秒钟内准确地分割扫描的结构。因此,CNN 有可能补充传统的医学成像工作流程,降低相关成本。

用于分割的 CNN 可以基于所使用的卷积核的维度来分类。2D CNN 使用 2D 卷积核来预测单个切片的分割图。通过一次对一个切片进行预测,对整个体积的分割图进行预测。2D 卷积核能够利用切片的高度和宽度来进行预测。然而,由于 2D CNN 采用单个切片作为输入,它们本质上无法利用来自相邻切片的上下文。来自相邻切片的体素信息对于分割图的预测可能是有用的。

2D CNNs predict segmentation maps for MRI slices in a single anatomical plane.

3D CNNs 通过使用 3D 卷积核对扫描的体积块进行分割预测来解决这个问题。利用片间上下文的能力可以提高性能,但是由于这些 CNN 使用的参数数量增加,因此会带来计算成本。

3D CNNs use 3D convolutional kernels to predict segmentation maps for volumetric patches of an MRI volume.

那么,3D CNNs 到底好到什么程度,值得付出额外的代价吗?在这篇文章中,我通过一个简单的实验来探究这个问题。我在心脏成像数据集上比较了 2D 和 3D CNNs 的性能。由此产生的度量产生关于这两种类型的 CNN 之间的性能差距的直觉。

2D 和 3D CNNs 被训练用于从磁共振成像(MRI)中自动分割心脏的任务。来自[1]的数据集被用于此。该数据集包含 33 名患者的磁共振成像,其中每名患者与 20 个不同的体积相关联,在不同的时间步骤拍摄。前 25 名患者用于训练(5920 个轴向切片)。剩余的扫描被保留用于测试(2060 个切片)。数据集提供了心内膜和心外膜的注释轮廓。这些注释用于创建具有 3 个类别的分割图:背景、心肌和内腔。

Original slice, annotated contours, and resulting ground truth segmentation map used in the experiments.

一个完全卷积的 2D CNN [2]被训练用于扫描的分段。切片保持原始分辨率(256×256 像素),并且使用 8 的批量大小来训练模型。使用完整的 2D 切片来训练该模型。

一个 3D CNN [3]被训练来完成同样的任务。用于训练 2D CNN 的设置对于 3D CNN 保持相同,除了输入大小和批量大小。3D CNN 在来自训练集的尺寸为 256×256×8、批量为 1 的 3D 面片上进行训练。

这两个 CNN 在训练期间都增加了两个辍学层[4]和深度监督[5],我几乎总是用它来训练深度学习模型,不管应用程序如何。模型训练 50k 次迭代,学习率 5e-6;每种模式都需要大量的训练。没有使用数据扩充。

通过在每个测试扫描上取分割预测的平均骰子相似性系数(DSC ),在测试扫描上评估模型。这有助于将 DSC 视为“准确性”的更具鉴别力的版本。2D 有线电视新闻网通过扫描每一片进行推断,一次一片。利用 3D CNN 的推断是通过从扫描中迭代采样 3D 片来执行的,直到扫描中的所有体素都具有与其相关联的预测。

Classwise and overall DSC results for each CNN

当查看 DSC 时,它有助于检查分割图上较小结构(即,非背景)的特定于类别的 DSC,因为 DSC 度量对于类别频率不是不变的。看起来 3D CNN 的表现更好。这两种型号之间的性能差距比我预期的要大得多。以下是预测的一些定性结果。确实有一些 3D CNN 明显更胜一筹的例子。

Some qualitative results: Original slice (top row), 2D CNN predictions (middle), 3D CNN predictions (bottom). Notice the first two columns, where the 3D CNN performed much better.

有一些考虑要讨论。2D CNN 在单个 1080 Ti GPU 上训练,批量大小为 8 个切片,尺寸为 256x256。另一方面,3D CNN 需要 2 个 GPU,批量大小为 1,面片尺寸为 256x256x8。此外,我最初使用更小的补丁(94x94x8)来训练 3D CNN,以便在训练期间增加批量大小,但这导致了非常差的结果。因此,当训练 3D CNNs 时,在切片平面上保持大视野可能是有益的。训练的速度是另一个考虑因素。2D CNN 的训练迭代每次耗时约 0.5 秒(我在实际训练步骤的同时执行了所有批处理预处理)。3D CNN 的训练步骤持续 3 秒钟;大约 6 倍长!这就是训练一个神经网络一天和训练一个神经网络差不多一周的区别!另一个注意事项:因为 3D 面片的深度为 8,而 3D CNN 的输出步幅为 16,所以最大池层会有一些复杂情况。对于最大池层,我对高度和宽度维度使用了步幅 2,但对深度维度保持了步幅 1。如果不这样做,批的深度尺寸将在正向传递过程中变为零。

那么 3D CNNs 值得努力吗?在我看来,是的!但是要放聪明点。如果你是第一次处理一个新问题,从 2D CNN 开始,这样你就可以快速重复实验。在你认为你已经把所有的旋钮都调好之后,再升级到 3D CNNs。此外,对于您的 3D CNNs,您可以通过使用更小的补丁或下采样训练实例来开始训练,以便在训练结束时微调到所需的分辨率之前加快训练步骤!

Source

想聊聊深度学习?在 LinkedIn 上联系我或者在下面留言。

参考文献

[1] Andreopoulos A,tsos JK。用于心脏 MRI 分析的形状和外观的有效且可概括的统计模型。

[2] Ronneberger O,Fischer P,Brox T. U-net:用于生物医学图像分割的卷积网络。

[3]米莱塔里·F·纳瓦卜·N·艾哈迈德·萨 V-net:用于体积医学图像分割的全卷积神经网络。

[4] Srivastava N,Hinton G,Krizhevsky A,Sutskever I,Salakhutdinov R. Dropout:防止神经网络过拟合的简单方法。

[5]李振宇,谢,张,涂.深度监督网.

面向数据科学家的 3 个高级 Python 函数

原文:https://towardsdatascience.com/3-advanced-python-functions-for-data-scientists-f869016da63a?source=collection_archive---------8-----------------------

Python 可以带来很多乐趣。重新发明一些你一开始不知道存在的内置函数并不是一件困难的事情,但是为什么你会想这么做呢?。今天,我们来看看其中的三个函数,我每天或多或少都会用到它们,但在我的数据科学职业生涯中,有很长一段时间我都没有意识到。

Photo by Drew Beamer on Unsplash

虽然它们可能不会节省大量的时间(,如果你理解背后的逻辑),你的代码看起来会干净得多。也许对你来说这听起来没什么大不了的,但是未来你会感激的。

几周前,我发布了一篇关于一些基本纯 Python 技能的文章,,这篇文章涵盖了一些其他很酷的内置函数,所以一定要看看:

[## 数据科学家的 3 项基本 Python 技能

你不需要图书馆做所有的事情。纯 Python 有时候是绰绰有余的。

towardsdatascience.com](/3-essential-python-skills-for-data-scientists-b642a1397ae3)

事不宜迟,就从第一个开始吧!

地图()

map() 是一个内置的 Python 函数,用于将一个函数应用于一系列元素,如列表或字典。这可能是对数据进行某种操作的最干净、最易读的方式。

在下面的例子中,目标是对列表中的数字求平方。首先,必须声明这样做的函数,然后我将展示在有和没有 map() 函数的情况下如何实现,因此是以非 python 化python 化的方式。

nums = [1, 2, 3, 4, 5]# this function will calculate square
def square_num(x): 
    return x**2 **# non-pythonic approach**
squares = []
for num in nums:
    squares.append(square_num(num))

print('Non-Pythonic Approach: ', squares) **# pythonic approach**
x = map(square_num, nums)
print('Pythonic Approach: ', list(x))

输出基本上是一样的,但是花一点时间来体会一下python 式方法看起来有多干净。也不需要循环。

zip()

zip() 是我的最爱之一。它使你能够同时遍历两个或更多的列表。这在处理日期和时间时会派上用场。

例如,当我有一个属性表示某个事件的开始时间,第二个属性表示该事件的结束时间时,我每天在工作中使用它。为了进一步分析,几乎总是需要计算它们之间的时间差,而目前为止最简单的方法就是使用 zip 来完成。

在这个例子中,我创建了两个包含数字的列表,任务是对相应的元素求和:

first = [1, 3, 8, 4, 9]
second = [2, 2, 7, 5, 8]# Iterate over two or more list at the same time
for x, y in zip(first, second):
    print(x + y)

如此简单干净。

过滤器()

filter() 函数类似于 map() —它也将函数应用于某些序列,不同的是 filter() 将只返回那些被评估为 True 的元素。

在下面的例子中,我创建了一个任意的数字列表和一个函数,如果数字是偶数,该函数将返回 True。我将再次演示如何以非 python 化python 化的方式执行操作。

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# Will return true if input number is even
def even(x):
    return x % 2 == 0**# non-pythonic approach**
even_nums = []
for num in numbers:
    if even(num):
        even_nums.append(num)

print('Non-Pythonic Approach: ', even_nums)**# pythonic approach**
even_n = filter(even, numbers)
print('Pythonic Approach: ', list(even_n))

再说一次,python 式的方式要干净得多,可读性也更好——这是你将来会喜欢的。

在你走之前

在 Python 中有更多类似于 3 的函数,但是我不认为它们在数据科学中有太多的适用性。实践这三条,当你在工作或大学中面临任何挑战时,记住它们。重新发明轮子太容易了,但是没有意义。

你日常使用的内置函数有哪些?随意分享。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

实现预测分析现代化的 3 种方法

原文:https://towardsdatascience.com/3-approaches-to-modernizing-predictive-analytics-7ed38b5250d3?source=collection_archive---------36-----------------------

各行各业各种规模的公司都在想方设法利用大数据的力量做出更好的决策。为了提供有价值的见解并满足预期,数据科学团队长期以来一直求助于预测分析,或使用历史数据对问题进行建模,并揭示过去产生特定结果的关键因素,以对未来进行预测。预测分析已经存在多年了;然而,在机器学习之前,这项技术不容易实时采用或扩展。

机器学习正在使预测分析现代化,为数据科学家提供了通过更多实时洞察来增强其工作的能力。得益于混合云基础架构机遇,现在可以快速高效地在几乎任何业务应用中嵌入和扩展预测分析。

实时处理大量数据的能力可以带来更准确的预测,从而做出更好的商业决策。然而,预测分析的现代化并非没有挑战。这里有一些公司可以现代化部署其遗留预测模型的方法,以及这些流行方法的优缺点。

在新框架上重建模型

组织可以采用现有的训练和验证数据集,并在最新的技术框架内重建它们,从而实现现代预测模型。例如,公司可以使用类似的算法(例如,使用 H2O.ai 或 scikit-learn)重建他们的预测模型,并将其与传统模型结果进行比较。

-赞成

在新框架中简单地重建预测模型的主要优势在于,组织可以重用现有的数据集、代码和以前成功的算法。在一个新的框架中重建模型是一个相对简单的过程,并且允许公司在实现时理解完整的建模生命周期——不需要太多额外的工作。

-缺点

在新框架中重建预测分析模型的一个缺点是,一旦投入生产,很难立即知道新模型是否会优于旧模型。用新框架更新预测分析模型是使用更多数据驱动模型的好机会。然而,如果公司只是重复使用相同的训练和验证数据集,那么他们可能会错过用新的数据源、功能、算法等更新数据集的机会。

在新框架上重建预测分析模型也只是第一步。下一步是将模型引入生产环境并部署它们,这可能是一个耗时、复杂的过程,具体取决于所使用的框架和生产平台。总的来说,在新框架上部署旧模型的投资回报率可能很低。

在云环境中部署模型

当由于数据隐私法规、行业标准等原因,组织的部分数据和基础架构需要保留在公司防火墙之后时,内部私有环境是必要的。然而,许多企业正在转向云环境或混合云环境来部署预测模型。这种方法有它自己的优缺点。

-赞成

大数据行业正在围绕三个公共云提供商进行整合——谷歌云平台、微软 Azure 和亚马逊网络服务。因此,企业正在迁移到这些服务,以便更灵活地选择和定制他们的环境,并更快地部署预测模型和应用程序。将现有模型迁移到云环境有许多优势,其中包括在已建立的平台和更全面的管理工具上加速测试的能力。

-缺点

过渡到云环境的一个挑战是,许多传统预测分析提供商尚未利用云环境的优势,这使得数据科学团队难以在这一新环境中引入新的算法、框架和应用。公司还需要解决数据将存放在哪里的问题,以及当一切都迁移到第三方云环境时,谁将监控模型和应用程序。

公共云环境正在成为各行各业首选的分析平台;但是,在进行任何更改之前,考虑在另一个环境中部署现有模型的 ROI 和真正的业务挑战和好处是很重要的。

使用 Quickpath 部署模型

对许多公司来说,将预测模型移植到生产环境中是一个关键挑战。需要将模型注入到现有系统中,并在不中断业务活动的情况下高效、经济地执行。与现有的数据分析基础架构无缝协作,因此无论公司位于何处,都可以充分利用其选择的数据和分析工具。

预测分析现代化通常包括将内部系统迁移到云平台,整合历史上分散的数据源,从批处理迁移到实时或流数据接收,以及为用于报告和模型开发目的的单一真实来源设置数据虚拟化层。

借助 Quickpath,数据科学团队可以从传统分析系统转移到现代、高效且可扩展的平台上进行部署。遗留模型可以导出到 Quickpath 平台,而无需重新构建它们。它们可以在新的基础设施中运行,甚至可以与现代机器学习模型并行,用于冠军挑战者测试、集合模型或任何基于人工智能的决策。从本质上讲,公司可以充分利用前两种现代化方法,无需重建遗留模型或将所有运营数据迁移到新环境中。Quickpath 在提供这些功能并利用现代数据科学的最新数据解决方案的同时,将这些环境联系起来。公司可以按照他们的时间表进行现代化,并专注于提供最高 ROI 的工作。

Quickpath 平台具有将人工智能和预测模型投入生产所需的四项关键功能,包括:

通用模型管理 —所有模型和决策的中央存储库。企业可以跟踪每个模型、结果和用于决策的数据,还可以访问报告和分析,以及主动漂移和异常检测。

实时决策 —实时部署模型、数据和规则,以提出最具商业价值的建议。

集成能力 —支持预测分析的人员、流程和技术的集成,以及连接和集成相关系统的开放式架构。

弹性运行时环境 —配置和扩展弹性运行时环境以在任何地方运行。

大数据分析市场正在发生巨大变化。事实上,该市场预计将以 29.7%的复合年增长率(CAGR)增长,到 2023 年将达到 406 亿美元。预测分析的现代化意味着组织最终将走出试验阶段,不仅可以做出更快、更明智的决策,还可以从部署中实现真正的商业价值。

图像来源

原载于 2019 年 6 月 5 日【https://www.quickpath.com】

针对每个数据集的 3 种出色的可视化技术

原文:https://towardsdatascience.com/3-awesome-visualization-techniques-for-every-dataset-9737eecacbe8?source=collection_archive---------4-----------------------

同时学习一些关于足球的知识

可视化很棒。然而,一个好的视觉化很难实现。

此外,向更多的观众展示这些可视化效果需要时间和精力。

我们都知道如何制作条形图、散点图和直方图,然而 我们却不太注意美化它们。

这伤害了我们——我们在同事和经理中的信誉。你现在感觉不到,但它确实发生了。

此外,我发现重用我的代码是必要的。每当我访问一个新的数据集时,我需要重新开始吗?一些 图形的可重用思想可以帮助我们快速找到有关数据的信息。

在这篇文章中,我还将谈论 3 个很酷的视觉工具:

  • 与图形的分类相关,
  • 配对图,
  • 使用 Seaborn 的群集图和图形注释。

简而言之,这个帖子讲的是有用的、像样的图。

我将使用 FIFA 19 完整球员数据集中的数据,这些数据来自于ka ggle——在最新版本的 FIFA 19 数据库中注册的每个球员的详细属性。

由于数据集有许多列,我们将只关注分类列和连续列的子集。

Player Data

这是一个格式很好的数据,但是我们需要对工资和价值列做一些预处理(因为它们是欧元并且包含字符串),使它们成为数字,以便我们进行后续分析。

与图形的分类相关性:

简单来说,相关性是衡量两个变量如何一起移动的指标。

例如,在现实世界中,收入和支出是正相关的。如果一个增加,另一个也会增加。

学习成绩和电子游戏使用率呈负相关。一个因素的增加预示着另一个因素的减少。

因此,如果我们的预测变量与我们的目标变量正相关或负相关,这是有价值的。

当我们试图理解我们的数据时,不同变量之间的相关性是一件很好的事情。

我们可以很容易地使用 Seaborn 创建一个很好的相关图。

Where did all the categorical variables go?

但是你注意到什么问题了吗?

是的,这个图形只计算数字列之间的相关性。

如果我的目标变量是 ***Club*** 或者 ***Position?***怎么办

我希望能够获得三种不同情况之间的相关性,我们使用以下相关性指标来计算它们:

1.数字变量

我们已经有了这种形式的皮尔逊相关,它是两个变量如何一起移动的度量。范围从[-1,1]

2.分类变量

我们将使用克莱姆的 V 来表示分类-分类案例。它是两个离散变量的相互关系,用于具有两个或多个层次的变量。这是一个对称的度量,因为变量的顺序无关紧要。克莱姆(A,B) ==克莱姆(B,A)。

例如:在我们的数据集中,ClubNationality一定有某种关联。

让我们使用堆积图来检查这一点,这是理解分类变量与分类变量之间分布的一种极好的方式。我们使用数据的子集,因为在这个数据中有很多国籍和俱乐部。

我们只保留最好的球队(保留波尔图只是为了样本更加多样化)和最常见的国籍。

俱乐部偏好在很大程度上说明了国籍:了解前者有助于预测后者。

我们可以看到,如果一名球员属于英格兰,他更有可能在切尔西或曼联踢球,而不是在巴塞罗那或拜仁慕尼黑或波尔图。

这里有一些信息。克莱姆的 V 也捕捉到了同样的信息。

如果所有俱乐部都有相同比例的每个国籍的球员,克莱姆的 V 就是 0。

如果每个俱乐部都偏好单一国籍克拉默的 V ==1,比如所有英格兰球员都在曼联踢球,所有德国人都在拜仁慕尼黑等等。

在所有其他情况下,其范围为[0,1]

3.数字和分类变量

对于分类连续的情况,我们将使用相关比率。

在不涉及太多数学知识的情况下,这是一种离散度的度量。

给定一个数字,我们能找出它属于哪一类吗?

例如:

假设我们的数据集中有两列:SprintSpeedPosition:

  • GK: 58(德基)、52(库尔图瓦)、58(诺伊尔)、43(布冯)
  • 68(D. Godin),59(V. Kompany),73(S. Umtiti),75(M. Benatia)
  • 91(C 罗),94(G .贝尔),80(S .阿圭罗),76(R .莱万多夫斯基)

如你所见,这些数字很好地预测了他们所处的阶段,因此相关率很高。

如果我知道冲刺速度超过 85,我绝对可以说这个玩家在圣

这个比率的范围也是从[0,1]

完成这项工作的代码取自 dython 包。我不会写太多代码,反正你可以在我的 Kaggle 内核中找到。最终结果看起来像这样:

Categorical vs. Categorical, Categorical vs. Numeric, Numeric vs. Numeric. Much more interesting.

是不是很美?

光看这些数据,我们就能了解足球这么多。例如:

  • 球员的位置与运球能力高度相关。你不会在后面打梅西。对吗?
  • 与运球相比,价值与传球和控球的相关性更高。规则是总是传球。内马尔,我在看着你。
  • 俱乐部和工资有很高的相关性。意料之中。
  • 体型和喜欢的脚高度相关。这是否意味着如果你很瘦,你很可能是左撇子?没多大意义。可以进一步调查。

此外,我们可以从这个简单的图表中找到很多信息,这些信息在没有分类变量的典型相关图中是看不到的。

我把它留在这里。人们可以更多地观察图表,找到更有意义的结果,但关键是,这使得寻找模式变得更加容易。

配对图

虽然我谈了很多关于相关性的内容,但这是一个变化无常的指标。

为了理解我的意思,让我们看一个例子。

Anscombe 的四重奏由四个数据集组成,这四个数据集具有几乎相同的相关性 1,但具有非常不同的分布,并且在绘制时显得非常不同。

Anscombe Quartet — Correlations can be fickle.

因此,有时绘制相关数据变得至关重要。并单独查看分布情况。

现在我们的数据集中有许多列。把它们都画出来会很费力。

不,这只是一行代码。

非常好。我们可以在这张图表中看到很多。

  • 工资和价值高度相关。
  • 大多数其他值也是相关的。然而,潜力与价值的趋势是不寻常的。我们可以看到,当我们达到一个特定的潜在阈值时,值是如何呈指数增长的。这些信息有助于建模。可以用一些势的变换使它更相关。

警告:没有分类列。

我们能做得更好吗?我们总是可以的。

如此多的信息。只需添加参数hue作为分类变量Club

  • 波尔图的工资分配太偏向下层了。
  • 我没有看到波尔图球员价值的陡峭分布。波尔图的球员会一直寻找机会。
  • 看看很多粉红色的点(切尔西)是如何在潜在工资图表上形成一个集群的。切尔西有很多高潜力球员,但工资较低。需要更多的关注。

我已经知道了工资/价值支线剧情的一些要点。

工资 500k 的蓝点是梅西。此外,比梅西更有价值的橙点是内马尔。

虽然这个技巧仍然没有解决分类问题,但是我有一些很酷的东西来研究分类变量的分布。虽然单独来说。

群集图

如何看分类数据和数值数据的关系?

进入图片群情节,就像他们的名字。为每个类别绘制的一群点,在 y 轴上有一点分散,使它们更容易看到。

他们是我目前最喜欢的策划这种关系的人。

Swarmplot…

为什么我不用箱线图?中值在哪里?我能画出来吗?显然。在顶部覆盖一个柱状图,我们就有了一个看起来很棒的图表。

Swarmplot+Boxplot, Interesting

非常好。我们可以看到图表上的单个点,看到一些统计数据,并明确了解工资差异。

最右点是梅西。然而,我不应该在图表下面的文字中告诉你。对吗?

这张图表将会在演示中出现。你的老板说。我想在这个图上写梅西。进入图片注释

Annotated, Statistical Info and point swarm. To the presentation, I go.

  • 看那边的波尔图。用这么少的工资预算和巨头竞争。
  • 皇马和巴萨有这么多高薪球员。
  • 曼彻斯特市的工资中位数最高。
  • 曼联和切尔西相信平等。许多球员聚集在同一工资等级附近。
  • 我很高兴,虽然内马尔比梅西更受重视,但梅西和内马尔的工资差距很大。

在这个疯狂的世界里一种正常的表象。

结论

概括一下,在这篇文章中,我们讨论了计算和读取不同变量类型之间的相关性,绘制数值数据之间的相关性,以及使用群集图绘制数值数据与分类数据之间的相关性。我喜欢我们如何在 Seaborn 中将图表元素相互叠加。

此外,如果你想了解更多关于可视化的知识,我想从密歇根大学调出一门关于 数据可视化和应用绘图 的优秀课程,它是一个很好的 数据科学专业的一部分,Python 本身就是其中之一。一定要去看看

如果你喜欢这篇文章,请鼓掌。这将有助于增加这个职位的覆盖面。将来我也会写更多初学者友好的帖子。在 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系

你也可以看看我在 Seaborn 上的另一篇帖子,在那里我创建了一些更简单的可重用图形。

这个 kaggle 内核中的这篇帖子的代码。

参考

  1. 对分类相关性的搜索
  2. Seaborn Swarmplot 文档
  3. Seaborn Pairplot 文件

原载于 2019 年 4 月 19 日https://mlwhiz.com

重温神经网络和深度学习中的 3 个基本概念

原文:https://towardsdatascience.com/3-basic-concepts-in-neural-net-and-deep-learning-revisited-7f982bb7bb05?source=collection_archive---------29-----------------------

准备你的第一次人工智能面试

Outskirts of Tokyo! (Source: Saptashwa)

在这篇文章中,我想重温深度学习的一些非常基本的问题/概念;你可能已经问过自己这些问题,或者,你很有可能在你的第一次人工智能面试中遇到这些问题。所以,没有任何延误,让我们这样做吧!

1.线性激活有问题!那为什么用 RELU?或者说,RELU 如何表现非线性?

你可能已经知道为什么(通常)不使用线性激活函数,但是,如果你仍然需要浏览这个概念,这里有一个简短的回顾。

没有激活函数的神经网络本质上是一个线性回归模型。因此,使用线性激活函数将始终线性映射输入,无论有多少层。让我们通过一个简单的演示来看看:

这里,我们考虑一个简单的具有 1 个隐藏层的神经网络。如果您扩展最终方程(将给出输出),它将始终是输入的线性函数,即使您添加更多具有线性激活函数的层。因此,所有的隐藏层都可以用线性激活的单一层代替。

但是,现在出现了第二个问题。经过整流的线性单位(RELU)怎么能代表非线性?这是一个有点棘手的问题。首先,我们来看看一次函数的定义。函数 f: A→ B 是线性的,如果对于域 Af 中的每个 xy 具有以下性质

f(α x + β y) = α f(x) + β f(y) …。(1)并且,这个方程更简化的版本是 f(x+y) = f(x) + f(y)…。 (2) RELU 定义为 f(x) = max(0,x)。正如你所看到的,RELU 不满足这两个方程,所以它是一个非线性函数。然而,很难想象一个在一半输入域为零而在另一半输入域为线性的函数如何能表示复杂的非线性!在这里,我将向您展示一个简单的逐步添加线性输入的例子,看看 RELU 如何帮助我们将线性输入映射到非线性输出(例如:y=x)。

如图所示,只需将 RELU 激活的线性输入相加,我们就可以得到 y=x 的一个很好的表示。让我们在下图中验证这一点

Intuition for how RELU represents non-linearity (Here true function is y=x²).

从这里,希望你可以了解 RELU 如何帮助我们用深度神经网络发现数据中的非线性。

2.为什么交叉熵而不仅仅是简单的二次成本?

我经常做语义分割任务,我们试图将图像的每个像素分类到特定的类别标签中。在这类任务中,以及在大多数深度学习问题中,你处理的是概率。因此,通常会得出结论(与线性回归任务相比),均方误差不是您想要最小化的函数。

类似于我们在逻辑回归问题中使用误差函数开始起作用。但是,问题是我们为什么首先使用这样的误差函数?在这里,你可以说带有逻辑回归假设的均方误差(MSE)成本函数将导致一个非凸函数,然后很有可能陷入局部最小值而不是全局最小值。现在如何知道一个函数是否凸?给定一个单变量函数(两次可微),如果二阶导数是非负的,则该函数是凸的。对于多变量函数,二阶导数将形成一个称为海森矩阵的矩阵。这个 Hessian 矩阵需要是半正定的,函数才是凸的。让我们做一些数学运算来证明对数损失成本函数确实是一个凸函数。

如果您使用逻辑回归假设和 MSE 函数,那么对 w.r.t θ进行两次微分不会得到所有 x. 的非负项

关于神经网络,使用这种对数损失成本函数有一个更微妙的原因。通常神经网络的最后一层会有 sigmoid 作为激活函数,使用 MSE 会导致严重的学习减速。让我们看一个非常简单的例子

由于在( w,b 的导数中存在 sigmoid 函数的导数,这些参数的学习速率变得非常慢。如果我们不使用 MSE,而是使用交叉熵代价函数,那么我们可以解决这个问题。让我们通过几个步骤的计算来看看这个—

我们不仅能够移除 sigmoid 函数的导数(这会导致学习速度变慢),还使用交叉熵作为成本函数,使得可训练参数的学习速度与输出中的误差成比例。您也可以检查偏差项。尽管这是针对单个神经元示出的(等式(4)中的求和超过了训练示例的数量),但是结论对于许多神经元、多层网络仍然有效。太好了!让我们进入下一个概念。

3.对正则项和减少过拟合有什么直觉吗?

机器学习中的过度拟合也被称为高方差,即,当您的模型在训练数据上表现非常好,但无法用测试数据集复制时。为了减少过度拟合,可以采取的一个初步措施是增加训练数据的数量。下一步可能是减少网络的深度,即减少一些层。另一种减少过度拟合的方法是在成本函数中增加一个额外的项。该项是网络所有权重的平方和乘以正则化参数。于是新的代价函数就变成了-新的代价=旧的代价+ λ/2 ∑w,这也被称为 L2 正则化,也用于岭回归。如果你使用 TensorFlow,这个 L2 正则化可以通过调用tf.nn.l2_loss与你的成本函数相加,这个项的作用是告诉网络惩罚大权重项。现在,由于权重不再那么大(如果λ很大),即使网络非常深,许多隐藏单元对训练模型的影响也会小得多。

我发现了另一种方法,根据激活函数,为吴恩达讲座中的正则化项和高方差减少建立直觉。让我们想想 tanh 激活函数—

因此,降低权重会减少 tanh(z) ,迫使其位于线性区域,从而降低网络模拟复杂非线性的能力,并有助于减少方差。

希望这篇文章已经帮助你重温了一些旧的概念,也许在这个过程中你学到了一些新的东西。

保持坚强和快乐,干杯!

3 个美丽的现实生活相关性

原文:https://towardsdatascience.com/3-beautiful-real-life-correlations-fed9e855da52?source=collection_archive---------20-----------------------

统计学和哲学

用这三个现实生活中的相互关系来改变你的看法。

什么是相关性?

相关性是两个变量之间关联的度量。你可以在宇宙中找到积极的,消极的,没有关联的。

相关性是数据科学家在日常生活中要处理的事情。让我们开始吧!

相关性 1:花在会议上的时间与你在工作中的价值

Deciding the future (Photo by You X Ventures on Unsplash)

如果你大部分工作时间都在开会,那么很可能你对你的公司非常有价值。可能不是每次都是这样,但我是在一般意义上说的。会议旨在提出影响公司未来的想法、策略和决策。所以这里不是玩乐的地方。所以,如果你被邀请参加公司几乎所有的会议,你可以肯定你的公司信任你的沟通技巧和创造性的投入——你对你的公司真的很有价值。

因此,我们可以说,你花在会议上的时间和你在公司的价值之间存在正相关关系。

含义

Where you stand… (Photo by Danka & Peter on Unsplash)

你可以分析一下,与另一家公司中与你职位相同的人相比,你的价值有多大。你可以每周分析一次,你的会议时长是上升还是下降,还是几乎保持不变——这意味着,公司对你的看法有任何变化;积极还是消极?同样,你也可以用相反的方式,如果你知道自己在公司的价值,你可以预测接下来一周或一个月的会议持续时间。更进一步,你甚至可以根据他们开会的时间来预测你公司或其他公司的某个人的头衔(价值)。

相关性 2:水的沸点与时间的关系

Is it pure? ( Photo by Tim Marshall on Unsplash)

水是一种化学物质,沸点是它的性质之一,告诉我们它在什么温度开始沸腾。有一种东西叫做 依数性——溶剂的性质会受到其中所含溶质的影响。纯水(不是指蒸馏水,而是含有天然矿物质的水)会有特定的沸点。同时,随着水开始变得越来越不纯净,即更多的杂质开始进入饮用水中,水的沸点升高,这种现象称为沸点升高,是依数性之一。如果你家附近一条河里的水的沸点比你昨天测得的要高,那么你就可以开始怀疑这条河的水质了。

由于饮用水应该具有一致的质量,其化学性质(在这种情况下是沸点)应该显示恒定的沸点,或者水的沸点与时间应该没有相关性。

含义

Pollution ( Photo by Brian Yurasits on Unsplash)

沸点和经过的时间之间的正相关将是非常惊人的,因为它是包含杂质的指示——在这一点上,你必须调查原因。也许当地一家工厂正在向河里倾倒未经处理的工业废料。通过比较每个国家之间的相关值,您可以找到最关心其河流或水体的地方或国家-相关性最小的国家获胜,因为他们采取了大量管理措施来长期保护水质。

相关性 3:智慧 vs 高估

Power of Wisdom ( Photo by Toa Heftiba on Unsplash)

最后,我们都听说过这句谚语“随着年龄的增长,智慧也随之而来”,弗兰克·德金领导的一项研究证明了这一点。在那项研究中,参与者被要求估计一座山的倾斜度,研究表明,年长的参与者比年轻的参与者给出了更好的估计——即使一些年长的参与者没有任何关于山的具体知识。因此,正如研究证明的那样,年长的人比年轻的人更善于评估,他们将其归因于与年轻的人相比,成年人的经验知识(或)。同样,应该注意的是,几乎所有较年轻的参与者和一些较年长的参与者(离群值)给了过高的估计

因此,我们可以说智慧与高估成负相关,也就是说,你拥有的智慧越多,做出错误决定或估计的可能性就越小。

含义

Reward of Wisdom (Photo by Miguel Bruna on Unsplash)

智慧水平和高估程度之间的负相关关系证明,当你年纪很大的时候,你会更准确地做出决定。但这里有一个好消息,根据你想要的精度(或者相应的高估程度),你可以从回归线中知道你需要获得的相应的智慧水平。如果智慧只是老年人的特征,那么我们将不会在全球范围内看到任何有影响力的年轻领导人。这表明年轻人也可以获得和成年人一样的智慧。这是什么意思?对年轻人来说,这意味着你会比同龄人做出更少的错误决定,而且相对于同龄人来说,你会在短时间内取得成功,因为你非常擅长判断事物,这是因为你最近获得了高水平的智慧。请注意,缩短时间并不适用于付出的努力——事实上,这将是一件巨大的事情,因为老实说,你的目标是实现非凡的成就,所以决心和激情应该是你最好的朋友。还记得那句谚语吗,“不劳无获”?

所以,看看回归线,找到你需要获得的智慧水平,开始获得它。但是怎么做呢?

尽可能多地阅读,探索不同的知识领域,解释你的经历,讨论你的想法,辩论你的观点。

Just a beginning ( Photo by Jukan Tateisi on Unsplash)

基本上,你所见证的是统计学中一个简单概念的力量。我将很快以最简单的方式探索更强大的功能。敬请期待!

如果你觉得这篇文章对你有帮助,请分享这篇文章,让有需要的人也能得到启发。

参考

[1]【李,z .和杜尔金,F. H .,“地面上感知距离的两种理论的比较:角度扩展假说和内在偏差假说”(2012),i-Perception,第 368–383 页

3 机器学习中常见的技术债以及如何规避

原文:https://towardsdatascience.com/3-common-technical-debts-in-machine-learning-and-how-to-avoid-them-17f1d7e8a428?source=collection_archive---------13-----------------------

本文概述了机器学习中的 3 个常见技术债务以及如何避免它们。如果你读这篇文章有困难,可以考虑在这里订阅中级会员!

技术债务 是实施代码时所做的权宜决策的持续成本。正是技术决策中的所有捷径或变通办法在早期软件版本和更快的上市时间中带来了短期利益。这个短语是沃德·坎宁安在 1992 年创造的,他试图向非技术产品利益相关者解释我们称之为“重构”的必要性。

人工智能(AI)和机器学习(ML)系统具有增加技术债务的特殊能力。具体来说,它具有常规代码的所有问题,加上系统级的 ML 特定问题。本文讨论了您在生产过程中可能遇到的三个技术债务。

Fig. 1 — AI/ML system is not everything

1.隐藏的反馈循环

从整体来看,人工智能系统通常是更大的数据机器的一部分。这意味着它的输入和输出依赖于大型机器中的其他组件(见图 1)。作为其周围环境的结果,真实世界系统经常最终影响它们自己的训练数据。

这可能以令人惊讶的方式发生,例如,你运行一个视频流平台,你的后端团队开发了一个推荐引擎,根据观众过去的观看历史和个人资料向他们推荐新频道。该引擎还包括那些被观众否决或忽略的频道。然后你启动这个功能,并庆祝推荐的视频每周都有越来越多的点击。事情看起来很好,但好得难以置信。

您忽略的是,前端团队实施了一个修复来隐藏低置信度(例如,低于 50%)的推荐视频,因为潜在的不良视频不应被推荐。随着时间的推移,以前置信度为 50–60%的建议现在可以推断出小于 50%的置信度。这形成了一个强大的反馈循环,刺激了你的指标(如收视率),这是一个危险。您现在不知不觉地陷入了一个陷阱,总是向用户推荐相同类型的内容,削弱了您的系统推荐用户可能感兴趣的新内容的能力。

Because you bought a vacuum, you need to buy more!

最终,这变成了一个问题,您的度量增加了,但是系统的质量没有增加。更糟糕的是,你可能不知道这正在发生。找到并修复循环是一个更加困难的问题,需要跨团队的努力。

减轻

退一步,以更全面的方式研究你试图解决的问题。避免视野狭窄,停留在人工智能工程师/科学家的舒适区,在那里你只想提高你自己的指标。

寓意:你不仅应该开发人工智能,也应该允许它去探索。此外,定期检查你的衡量标准,重新思考你如何衡量成功——不要只看数字。

2.管道丛林

人工智能系统通常由一系列工作流管道组成。这些管道负责一系列以特殊顺序运行的复杂作业。它们可能是由不同的人建造的,他们对全局有不同的认识,这就是灾难发生的地方。

通常,由于时间的压力,一条管道只是为了满足某个要求而仓促搭建。它可以由用不同语言编写的不同胶水代码和用于管理管道的特殊语言组成。它们可以从数据准备、抓取、清理、连接、验证、提取特征、在训练/测试集中分割数据、检查点、监控性能和推向生产等。这意味着它更容易以一个意大利面条系统结束,并陷入混乱!

在管道丛林中,你可能还会惊讶地发现未申报的消费者。如果没有访问控制,这些消费者中的一些可能是下游系统,它们悄悄地将您的模型的输出作为另一个系统的输入。未声明的消费者既昂贵又危险,尤其是当它与您的 AI 系统的输出紧密耦合时。

减轻

通过从更大的角度看待系统,并认真对待数据收集和特征提取等任务,可以避免管道丛林。解决这个问题的一个方法是投入一些投资来清理管道,以大幅减少前进的阻力。对于复杂系统,可能值得将这项工作分成更小的部分,并让外部顾问来完成,因为重构可能需要几个月或几年的时间。

保持子系统的所有组件一致需要额外的努力。管道丛林往往会滚雪球般变成一个更大的问题,所以在为时已晚之前做好清理工作。哦,我提到管理依赖关系了吗?

3.数据相关性

在一个典型的软件工程项目中,依赖关系指的是你导入的所有模块、包和库,这些模块、包和库有助于在不重新发明轮子的情况下构建某些功能。在一个人工智能系统中,也有数据依赖,并且它具有类似的构建债务的能力。更糟糕的是,它可能更难被发现。

数据相关性不一致

数据质量的不一致可能导致输入信号不稳定,因为数据可能会随着时间的推移而发生定性或定量的变化。这些输入数据可以从另一个 ML 系统生成,并且可以随时间更新以产生用于另一个系统的嵌入或语义映射(例如,图像嵌入、TF/IDF)。上游系统的静默更新会破坏下游预测系统。

数据相关性中未使用的功能

随着时间的推移,新的功能会使旧的功能变得多余,而这种变化不会被发现。例如,匆忙拼凑起来的遗留的、相关的或捆绑的特性会卡在模型中,永远留在那里。最终,这些特征会导致(多重)共线性,并削弱模型的统计能力。

减轻

使用嵌入/语义映射的冻结副本,并允许原始副本随着时间的推移而改变。仅在审查和验证后部署新映射。此外,未使用或未充分利用的特征可以通过彻底的留一特征评估来检测。定期运行这些检查以删除这些不必要的功能。

寓意:代码依赖可以通过使用编译器和链接的静态分析来识别。确定数据相关性需要检查数据如何转化为信号,从数据中去除噪声并提取清晰的信号。

结论—偿还技术债务

在这个快速发展的世界里,快速行动和打破常规可能是新的发展口号。然而,通过在开发过程中询问一些有用的问题,可以将技术债务保持在最低限度。我们应该问自己:

  1. 我们是否确切地知道一个新的模型或更新的模型将如何影响整个系统?我们在哪里以及如何衡量这种变化的影响?
  2. 我们衡量成功的标准是什么?它与商业目标一致吗?
  3. 我们是否跟踪了整个系统的所有依赖、生产者和消费者?当我们需要的时候,我们有一个系统的方法来识别错误吗?

注:本文首发于https://derekchia . com/3-common-technical-debts-in-machine-learning-and-how-to-avoid-them/。请在 twitter 上关注我,DerekChia 获取更多更新!

参考资料:

  1. 机器学习系统中隐藏的技术债务https://papers . nips . cc/paper/5656-hidden-Technical-Debt-in-Machine-Learning-Systems . pdf
  2. 你的 ML 测试分数是多少?大规模生产系统规则https://ai.google/research/pubs/pub45742
  3. 机器学习:技术债的高息信用卡【https://ai.google/research/pubs/pub43146 T2

优化超参数的 3 种不同方法(交互式 Python 代码)

原文:https://towardsdatascience.com/3-different-ways-to-tune-hyperparameters-interactive-python-code-87548d7f2365?source=collection_archive---------20-----------------------

Photo by chuttersnap on Unsplash

优化和调整超参数的交互式指南

H 超参数(HP)是机器或深度学习算法无法通过训练学习的那些参数。这些参数的值需要在训练过程之前设置,它可以控制算法如何从数据中学习。超参数(HP)可以是神经网络的层数或一层中的节点数,可以是神经网络可以使用的学习速率或优化器类型。获得正确的超参数可能是反直觉的,它更像是一个试错过程。因此,我们需要找到一种方法来自动调整这些参数,以获得最佳组合,最大限度地提高 ML 模型的性能。

在本文中,我将讨论一些优化和调整超参数(HP)的方法,以最大化或最小化客观指标(当指标是准确性时最大化,而当指标是 RMSE 或任何其他损失函数时最小化)。

但是,在我们深入研究超参数优化部分之前,让我们先了解一些重要的概念:

目标函数:

机器学习可以简单地定义为从经验中学习行为。这里的学习,我们的意思是随着时间的推移,在某些特定的任务上变得更好、更有进步。但是什么是进步呢?

为了开发一个函数来判断改进,我们需要有模型好坏的正式度量。在机器学习中,我们称这些为“目标函数”。最常见的目标函数是平方误差,它基本上是预测值和实际地面真相之间的差异。如果该值较大,则精确度较低。我们优化超参数的目标是最小化这个目标函数。获得模型超参数的正确组合可以极大地提高模型的性能,让我们看看如何调整这些参数以最小化目标函数:

一维网格搜索:

调整超参数的一种方法是为每个 HP 定义一个相等的范围,并让计算机尝试所有可能的参数值组合。这可能是获得最佳 HPs 组合的一个很好的方法。它的工作原理是把你想要调优的 HPs 放在一个 n 维网格中,然后在这个网格中尝试每一种组合。您可以使用嵌套循环来实现这一点,也可以使用一些现成的库,如 Scikit Learn — GridSearchCV。让我们看看它是如何工作的,下面的示例将尝试找到超参数(C、Gamma 和 Kernel)的最佳组合来为 MNIST 数据集构建分类器:

(互动代码——点击播放按钮自行运行代码)

上面的代码将强力尝试这三个超参数的每一种可能的组合,然后打印出最佳组合。

  • 优点:这种方法会得到最好的超参数。
  • 缺点:这是一个详尽的操作。如果超参数范围或数量很大,可能性可能有数百万,这将需要很长时间才能完成。它也遵循一个序列,不考虑过去的经验。

2-随机搜索:

顾名思义,它将尝试随机选择预定义数量的超参数组合,这将给出最佳超参数的一些指示。现在,让我们看一些代码:

(互动代码——点击播放按钮自行运行代码)

正如您在代码中看到的,您可以定义想要选择一组随机超参数的次数或迭代次数,然后尝试它们并获得最佳组合。

优点:比网格搜索法快多了。

缺点:可能不会返回能够返回最佳精度的最佳超参数组合。它也不考虑过去的评估,不管结果如何,它都将继续迭代。

3-贝叶斯优化:

在上面的例子中,我们有一个客观的指标,即精度,我们还有一个目标函数,试图最大化指标和最小化损失。贝叶斯优化方法试图通过基于目标度量的过去评估结果建立概率模型来找到最小化目标函数的值。它试图在探索包含最佳超参数的最佳区域和利用该区域来最大化/最小化客观度量之间找到平衡。

优化超参数的问题是,评估一组 HPs 的性能是一个昂贵的过程,因为我们必须在每次迭代中建立相应的图或神经网络,然后我们必须训练它,最后,我们必须评估性能。优化过程可能需要几个小时或几天,但在这个例子中,我们将只训练 3 个时期,以便您可以看到最好的 HPs,然后使用这些来训练更多的时期。

让我们看看下面的示例,该示例使用贝叶斯优化来调整 MNIST 数据集的神经网络。我们将使用 scikit-optimize 库来执行 HPO。它是实现了贝叶斯优化算法的库之一:

(交互式代码—点击播放按钮自行运行代码)

结论:

优化机器学习模型的超参数对于机器学习模型的性能至关重要,并且调整 HPs 的过程不是直观的,并且可能是复杂的任务。上面的文章展示了三种自动调整这些参数的流行方法。我们还探索了 scikit-optimize ( skopt)库,在撰写本文时它仍在开发中,但它是一个非常强大的工具。它有一个非常简洁的贝叶斯优化方法的实现,大大优于网格搜索和随机搜索,特别是当涉及到复杂的任务和大量的超参数时。

每个数据科学家都应该知道的 3 个距离

原文:https://towardsdatascience.com/3-distances-that-every-data-scientist-should-know-59d864e5030a?source=collection_archive---------3-----------------------

无论您是刚开始接触数据科学,还是已经在该领域工作了很长时间,如果不了解以下 3 个距离,您将无法生存:

1.欧几里德距离(或直线距离)

欧几里德距离是最直观的:当有人要求我们进行距离测量时,我们都会直观地测量它。

欧几里得距离是使用 x 和 y 坐标的两点之间的直线距离:例如,我们可以通过给出两个坐标(纬度和经度)在世界地图上找到一个城市。

欧几里德距离测量直线距离。

假设我们想在图中所示的市中心地图上测量 A 点到 B 点的直线距离。

The Euclidean Distance from a Point A to a Point B is the straight-line distance, computed with Pythagoras.

有了欧几里德距离,我们只需要两点的(x,y)坐标,就可以用毕达哥拉斯公式计算距离了。

请记住,毕达哥拉斯定理告诉我们,当我们知道水平边和垂直边的长度时,我们可以计算直角三角形的“对角线”的长度(斜边),使用公式 a + b =c。

Computation of the Euclidean distance from Point A to Point B.

2.L1 距离(或城市街区距离)

L1 距离,也称为城市街区距离、曼哈顿距离、出租车距离、直线距离或蛇形距离,不是直线距离,而是街区距离。

L1 距离测量城市街区距离:仅沿直线的距离。

这幅图直接说明了发生了什么:L1 距离只允许我们做直线运动!

The L1 distance from Point A to Point B is the City Block Distance, also called Manhattan Distance.

从图中的 A 点到 B 点有多种最短路径:我们可以向上走两个街区,然后向右走三个街区,或者我们可以向右走三个街区,然后向上走三个街区,等等。

但是 L1 距离是一个距离,所以实际的轨迹并不重要。我们需要知道的是,总的来说,我们必须向东走一定距离 x ,向北走一定距离 y 。两者之和就是从 A 点到 b 点的 L1 距离

Compute the L1 (City Block) Distance from Point A to Point B.

3.切比雪夫距离(或棋盘距离)

切比雪夫距离也称为棋盘距离或 L 无穷远距离。对切比雪夫距离最直观的理解就是棋王在棋盘上的移动:它可以向任何方向(上、下、左、右、垂直)走一步。

In the Chebyshev distance, a diagonal step is as large as a vertical step.

它不同于 L1 距离,因为在切比雪夫距离中,我们将垂直运动计为一步,而在城市街区距离中,我们将垂直运动计为两步(向左一步和向右一步)。

它也不同于欧几里德距离,因为欧几里德距离中的一个垂直移动,其距离为 sqrt( x + y ) 正如我们之前看到的。

Comparison of the Euclidean Distance, L1 Distance, and Chebyshev Distance.

切比雪夫距离是棋盘距离。

切比雪夫距离的一个直观例子是一架无人机,它有两个独立的电机:一个电机向前,一个电机侧向。两台电机可以同时运行,并且可以同时达到最大速度。

这样做的结果是,无人机在对角线方向上的速度可以和它在水平方向上的速度一样快:只要让两个电机都以最大速度运行。

回到切比雪夫距离城市地图的图片,这意味着在步骤 1 中,两个电机同时运行,在步骤 2 中,两个电机也同时运行,但在步骤 3 中,不再需要向前移动,只有横向电机仍在运行。

因此,切比雪夫距离被定义为一个轴上的最长距离。

Computing the Chebyshev Distance from point A to point B.

我希望这篇文章能提高你对未来距离的理解,我真诚地感谢你阅读我的内容。祝你在练习中应用距离时好运!

赢得黑客马拉松所需的 3 个关键人物

原文:https://towardsdatascience.com/3-essential-persons-needed-to-win-a-hackathon-71391a084df0?source=collection_archive---------32-----------------------

团队组成是赢得黑客马拉松的一个非常关键的因素。由于黑客马拉松是一种要求非常高的比赛,通常在 48 小时内,参与者需要提交一个像样的演示文稿和一个可用的原型。所以,要更有效地完成任务,你需要背景多元化的队友。理想情况下,每个团队至少要有 1 个程序员,1 个商人,1 个设计师。

Photo by Vlad Hilitanu on Unsplash

如前所述,有四种主要类型的黑客马拉松,本文中提到的黑客马拉松指的是第三种。如果你有兴趣知道常见的黑客马拉松类型之间的区别,请阅读我以前的文章。

Photo by cyda

1。程序员:开发解决方案的核心

程序员是一个非常宽泛的术语,它可以进一步分为前端开发人员、后端开发人员和数据科学家。取决于主题,一个团队可能需要不止一种类型的程序员。

对于前端开发者来说,他们主要是配合设计师将线框转化为真实的应用。这群人必须熟悉至少 1 种前端开发语言,如 CSS 和 HTML,用于网站开发。前端开发人员无疑也需要与后端开发人员携手工作,因为他们的工作部件应该能够相互通信。您的团队可能需要半天以上的时间来解决兼容性问题。

后端开发人员的角色是构建原型的核心功能。为什么你需要在最终陈述中有一个可行的原型,因为它是告诉评委你的解决方案在技术上可行的最有效的证据。对于数据科学家来说,大数据现在是一个非常热门的话题,在提供数据集的黑客马拉松中,它也希望参与者建立一个模型或从数据中获得见解。同样,与前端开发人员一样,这两类人也是专家,对编程语言或相关软件(如 JavaScript、R 和 Python)有扎实的知识。

Photo by Fabian Grohs on Unsplash

然而,只有程序员不能使解决方案吸引陪审团。所以才需要设计师。

2。设计师:美化样机外观

第一印象非常重要,尤其是在简短的陈述中。黑客马拉松的投球时间很短,通常在 4 到 8 分钟左右。这很像速配,美女或帅哥很容易引起别人的兴趣和他们聊天。同样的逻辑在黑客马拉松中,风格化的界面更有可能吸引观众的兴趣去了解更多。除此之外,不是每个人都能像设计师那样思考。让设计师与众不同的是他们的创造力,因此团队中有一名设计师可以在创意头脑风暴中添加创新元素,使解决方案具有颠覆性并脱颖而出。

Photo by Clint Bustrillos on Unsplash

3。商人:说服法官你的解决方案是最好的

团队中的业务人员应该是最优秀的销售人员,是最体面的人,并且具有很强的说服他人的谈话技巧。他或她将负责思考资料和演示流程中包括的内容。由于黑客马拉松的大部分评委都有商业背景,有一个来自商业世界的人可能会更好地知道评委们想在演讲中听到什么。商业计划、成本效益分析和竞争对手分析可能是一个商业人士可以立即想到要包括在幻灯片中的一些基本组成部分,但如果你让一组程序员制作 PowerPoint,他们可能会在幻灯片中放很多公式或代码,演示将是一个非常技术性的讲座。这就是一个团队需要一个商人的主要原因,这是为了有一个翻译来以一种更外行的方式解释技术知识,并帮助观众消化解决方案中使用的先进技术。

Photo by Austin Distel on Unsplash

如果你有兴趣参加黑客马拉松,留意你的邻居,找到你需要的合适的伙伴。如果你想知道在哪里可以找到黑客马拉松,请继续关注我的黑客马拉松系列

如果你觉得我的文章有用,请在我的 linkedIn 页面上为我的技能背书,鼓励我写更多的文章。

最初发表于cydalytics.blogspot.com

[## 欢迎来到黑客马拉松的世界

学生应该加入黑客马拉松的 5 个理由

medium.com](https://medium.com/series/welcome-to-the-world-of-hackathon-81d194abbec4)

数据科学家的 3 项基本 Python 技能

原文:https://towardsdatascience.com/3-essential-python-skills-for-data-scientists-b642a1397ae3?source=collection_archive---------9-----------------------

学习熊猫很棒。 Numpy 也非常有趣。但是你可能很早就开始使用图书馆了吗?也许你还没有意识到 pure Python 所提供的一切。

如果这听起来像你,你会喜欢这篇文章。

Photo by fabio on Unsplash

本文将介绍我在日常数据科学工作中最常用的一些非常酷的纯 Python 功能。我在整个数据准备阶段都在使用它们(大量用于数据清理),甚至后来在绘图前汇总数据。

我希望你也能把这些融入到你的项目中。虽然没有运行时速度或性能方面的好处,但是当您从头开始实现这个逻辑时,您将节省大量时间。那么事不宜迟,让我们跳入第一点!

By GIPHY

λ函数

Lambda 函数非常强大。是的,当您必须以相同的方式清理多个列时,您不会使用它们——但这不是我经常遇到的事情——通常情况下,每个属性都需要自己的清理逻辑。

Lambda 函数允许你创建'匿名函数。这基本上意味着您可以快速创建特定的函数,而不需要使用 pythondef来正确定义函数。

话虽如此,请记住,lambdas 主要被设计成一行程序——因此应该用于更简单的东西。对于更复杂的逻辑,你需要使用常规函数。

好了,说的够多了,我现在给你看两个具体的例子,通过它们你可以看到在你的下一个项目中,仅仅通过不为每件事定义一个函数,你可以节省多少时间。第一个例子可能不会在现实世界中经常用到,但是值得一提。一切都是为了平方数字。

# regular function
def square_number(x):
    res = x ** 2
    return res# lambda function
square = lambda x: x ** 2# results
print('square_number(4): {}'.format(square_number(4)))
print('square lambda: {}'.format(square(4)))**>>> square_number(4): 16
>>> square lambda: 16**

上面的代码片段以常规方式和 lambda 方式包含了相同逻辑的实现。显然,结果是一样的,但是看看这个一行程序的美妙之处吧!

第二个例子将涵盖检查数字是否偶数的过程:

# regular function
def is_even(x):
    if x % 2 == 0:
        return True
    else:
        return False

# lambda function
even = lambda x: x % 2 == 0# results
print('is_even(4): {}'.format(is_even(4)))
print('is_even(3): {}'.format(is_even(3)))
print('even(4): {}'.format(even(4)))
print('even(3): {}'.format(even(3)))**>>> is_even(4): True
>>> is_even(3): False
>>> even(4): True
>>> even(3): False**

同样的逻辑以两种方式实现。你决定你喜欢哪一个。

列出理解

用最简单的方式解释,列表理解允许你使用不同的符号创建列表。你可以认为它本质上是一个建立在括号内的单行 for 循环。

在做特征工程的时候,我经常使用列表理解。例如,如果我正在分析垃圾邮件检测的电子邮件标题,我很好奇问号是否更经常出现在垃圾邮件中。这是一个用列表理解完成的非常简单的任务。

也就差不多了,不需要进一步的理论解释。例子是最重要的。

我选择声明一个常规函数,它将检查列表中以某个字符开始的条目,在本例中是' a 。一旦实现,我会做同样的事情,但用列表理解。猜猜哪一个会写得更快。

lst = ['Acer', 'Asus', 'Lenovo', 'HP']# regular function
def starts_with_a(lst):
    valids = []

    for word in lst:
        if word[0].lower() == 'a':
            valids.append(word)

    return valids

# list comprehension
lst_comp = [word for word in lst if word[0].lower() == 'a']# results
print('starts_with_a: {}'.format(starts_with_a(lst)))
print('list_comprehension: {}'.format(lst_comp))**>>> starts_with_a: ['Acer', 'Asus']
>>> list_comprehension: ['Acer', 'Asus']**

如果你第一次看到这个,语法可能会有点混乱。但是当你每天写它们的时候,它们开始吸引你,让你看看你能把多少复杂性放进去。

活力

这是我在实践中很少见到的许多内置 Python 方法之一。从数据科学家的角度来看,它使您能够同时迭代两个或更多列表。这在处理日期和时间时会派上用场。

例如,当我有一个属性表示某个事件的开始时间,第二个属性表示该事件的结束时间时,我每天在工作中使用它。为了进一步分析,几乎总是需要计算它们之间的时间差,而 zip 是迄今为止最简单的方法。

例如,我决定比较一些虚构公司和虚构地区的一周销售数据:

sales_north = [350, 287, 550, 891, 241, 653, 882]
sales_south = [551, 254, 901, 776, 105, 502, 976]for s1, s2 in zip(sales_north, sales_south):
    print(s1 — s2)>>> -201
    33
    -351
    115
    136
    151
    -94

看看这有多简单。您可以应用相同的逻辑来同时迭代 3 个数组,您只需要在括号中添加' s3 '和其他一些列表名。

最后的话

纯 Python 就是这么厉害。确保你知道它的能力。你不需要一个专门的库来处理所有的事情。我的意思是这很有帮助,但是这会让你成为更好的程序员

练习这些技能,掌握它们,并把它们应用到你的日常工作中,不管是为了娱乐,为了大学,还是为了工作。你不会后悔的。

你有什么想法?你认为纯 Python 之外的东西对数据科学家来说是必不可少的吗?让我知道。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

金融科技初创公司数据新闻实习生的 3 课

原文:https://towardsdatascience.com/3-lessons-from-a-data-journalism-intern-at-a-fin-tech-startup-c765817f3299?source=collection_archive---------21-----------------------

现实世界中的数据科学

了解我在一家金融科技初创公司实习时学到的经验,这家公司正在利用机器学习来彻底改变信贷承销行业。

The Data Science Team at ZestFinance (I’m on the upper left corner!)

随着我们进入秋季,我想我应该花时间反思一下我在加利福尼亚州洛杉矶 Zest Finance 担任数据记者的 14 周暑期实习。

如果你不熟悉我的背景,我目前是一名硕士研究生,正在进入研究生院的最后一年,学习计算机科学。我是怎么在 ZestFinance 结束的?我在网上申请,招聘人员发现我的经历很有趣,经历了面试过程,最终接受了邀请,作为 12 名实习生之一去他们的办公室过暑假。

我的目标是分享我从这次难忘的经历中学到的一些重要经验。

什么是 ZestFinance?

该公司的使命是让每个人都能获得公平透明的信贷。根据公司网站:

数万亿美元的贷款行业仍然依赖陈旧的评分技术,这种技术过于简化了对借款人财务状况的看法。结果,数百万本应得到贷款的人总是被拒绝。大约 4600 万美国人要么是“信用隐形人”,在三大信用机构之一没有档案,要么是“不可记录的人”,没有足够的信息来产生信用评分。这是现代信用体系的失败。

基于机器学习的信贷模型可以通过从更多数据中获取更深入的见解,特别是银行已经拥有的未使用的数据,来产生更有利可图的承保。ZestFinance 是首批部署机器学习模型进行借贷的公司之一,我们知道它是可行的。

Zest 的自动化机器学习(ZAML)

更具体地说,我整个夏天都在研究 Zest 专有的自动化机器学习平台 ZAML。ZAML 使贷方能够分析非传统数据,包括他们内部已经拥有的数据,如客户支持数据、支付历史和购买交易。该平台还可以考虑传统的信用信息和非传统的信用变量,如客户如何填写表格,他们如何浏览贷款人的网站等。虽然黑盒问题减缓了机器学习在消费金融中的应用,但 ZAML 能够全面解释数据建模结果,衡量业务影响,并符合监管要求。

作为一名数据记者,我是数据科学团队中值得骄傲的一员。更具体地说,我的职责包括:(1)从大型和小型数据集挖掘趋势和见解,以讲述数据故事,(2)利用内部和外部数据源进行分析、建模和可视化,并将它们转化为主题叙述、报告和白皮书,以及(3)宣传数据科学研究计划,同时与营销团队跨职能合作,以量化其不断增长的影响和相关性。

现在你对团队和我的角色有了更多的了解,让我们深入了解一下我从这次实习中获得的一些主要见解。

最小可行分析

这个概念来自康纳·杜威的一篇优秀文章,我整个夏天都在回想这个概念(查看我对他的采访!)。这篇文章谈到了最小可行分析的概念,这意味着数据科学家可以取得渐进的进展,不要假设利益相关者需要最复杂的可用解决方案。

产生 MVA 的过程非常简单:(1)清楚地理解手头的业务问题,(2)产生快速和肤浅的见解来解决问题,(3)将结果反馈给利益相关者并获得他们的想法,以及(4)总结分析或深入挖掘。

通过记住这个框架,我能够为我当时工作的数据故事/技术报告/博客文章做出许多不同的迭代。在我的案例中,利益相关者是团队中的其他数据科学家以及不同职能部门的几位高管。

认知多样性

我非常幸运能够与来自多个职能部门的同事交流,包括数据科学、营销/设计、法律、商业分析、产品管理和软件工程。这让我能够利用我所谓的认知多样性——观点或信息处理风格的差异。换句话说,它是个人如何思考和处理新的、不确定的和复杂的情况。

给定一个实现机器学习模型来确定贷款/信贷申请人是被拒绝还是被批准的假设示例,这里有几个心智模型来解决这个问题:

  • 数据科学家关心的是如何设计完美的实验来实现最佳性能的模型。
  • 软件工程师关心如何建立合适的基础设施来将模型投入生产。
  • 营销人员关心的是如何向公众传达模特使用的独特功能。
  • 法律顾问关心如何解决与模型结果相关的潜在风险和合规性。
  • 业务分析师关心如何计算模型对客户的业务影响。
  • 产品经理非常关心上面提到的所有事情。

如果有一个收获是我真正感激的,那就是我能够开发的大量心智模型。通过学习倾听不同的意见,并以同事理解的方式用他们的语言说话/写作,我磨练了多侧面思考的能力——通过不太明显的推理,使用间接和创造性的方法解决问题的能力。

领域知识

在 ZestFinance 实习之前,我对信用担保几乎一无所知。但是夏天过后,我对这个古老的行业有了更多的了解:

  • 大约 2600 万美国人被联邦消费者金融保护局认为是“信用隐形人”,因为他们在三个信用机构中没有任何记录。另外 1900 万人没有足够的档案数据被贷款系统认为是可计分的。数以百万计的人在他们的信用档案的某个阶段有严重的错误被纠正。这 4500 多万美国人面临着真正的后果:更高的拒绝率、更高的贷款费用、劣质的金融产品——尽管其中许多产品实际上可能具有很高的信誉。
  • 信用评分是 20 世纪最大的经济催化剂之一,但它已经跟不上今天的消费者了。可用于更准确和公平地对人评分的数据源的激增不能被传统的评分技术轻易或容易地消耗。
  • 贷款人开始转向人工智能和机器学习承销,这些技术通过复杂的算法处理更多数据,可以处理杂乱或有缺陷的数据。机器学习信用模型从数百万次交互中得出结论,并使用比传统技术多 10 至 100 倍的变量。使用机器学习的银行和贷款机构报告了更高的批准率或更低的违约率,有时两者兼而有之,这是通过找到传统技术遗漏的好借款人(并拒绝可能已经获得批准的坏借款人)。
  • 新的机器学习评分算法的制造商必须确保他们的模型不会延续当前贷款系统中存在的偏见。事实上,ZestFinance 的 ZAML 工具可以“去偏向”信贷和其他受监管行业的模型。

在实习过程中,我获得了大量的领域知识,包括银行和金融机构如何对信贷申请人做出决策,他们如何采用机器学习,如何在模型设计中建立可解释性和公平性,以及如何确保模型的预测性能与其对企业客户的 ROI 值之间的相关性。

最重要的是,我真的很喜欢 ZestFinance 的使命驱动型文化,即建立一个让更多人获得信贷机会的世界。我对这家公司只有温暖的感觉,强烈建议你看看他们的博客和空缺寻找新的内容和工作机会。

收尾

实习肯定重申了我对人工智能/机器学习的热情,我很感激我的工作确实为未来的工作留下了一些动力。快速分析和迭代实验阶段,与不同的利益相关者交谈所需的沟通技巧,解决各种商业领域问题的巨大潜在应用,都促成了我对这一领域的兴趣。

Me and fellow interns at the Wisdom Tree on top of Hollywood!

我非常感激有机会在这个夏天利用数据新闻为一个新兴行业的不可思议的产品创造价值。我完成了很多,犯了很多错误,最重要的是,由于一个令人敬畏的团队和一群多元化的导师,我学到了比我预期更多的东西。我希望我至少成功地向你们传达了一些教训。感谢您的阅读。

如果你喜欢这个作品,你可以在 https://jameskle.com/的*找到更多我的作品和项目。你也可以在Twitter上关注我,在GitHub,* 上查看我的代码,直接发邮件给我 在 LinkedIn 上找我。 注册我的简讯 就在你的收件箱里接收我关于数据科学、机器学习和人工智能的最新想法吧!

作为一名没有经验的数据科学研究生,我学到了 3 个教训。

原文:https://towardsdatascience.com/3-lessons-i-learned-as-a-first-year-data-science-grad-student-with-no-experience-86449c90a5ff?source=collection_archive---------12-----------------------

即使有了大学,研究生院也有它自己的一系列挑战。

Photo by Japheth Mast on Unsplash

去年,我开始攻读数据科学硕士学位。除了在 Khan Academy 上了一堂 SQL 课和大学里的几堂数学课,我没有任何学科知识。关于数据和分析,我只知道我在那个部门工作,因为我在大学里做过兼职。话虽如此,以下是我在课外学到的一些经验。

1.重要的是学习技能,而不是等级。自从我们开始上学,我们就被告知,在周末,我们会因为表现出色而获得一张金色贴纸(后来变成了分数,学校失去了一点阳光)。即使现在在研究生院,我发现自己在课堂上想要一个 A,这不是一件坏事,但会分散我们对真正学习技能的真正目标的注意力。为了得到一个好成绩,它被深深地印在我们的脑海中,以至于我们忘记了我们应该学些什么。这就是我决定挂科重考编程课的原因。完全公开——即使我没有通过,我的雇主也会支付课程费用,这也是我选择这门课程的另一个原因。当事情进展顺利的时候,我正在学习编程入门,在那里我学习 Python 直到我们进入函数。由于某种原因,我不能用脑子思考函数,当我们开始上课时,我跟不上了。在这一点上,即使我的作业分数很低,我也通过了这门课,但是,我意识到这是 Python 的基础,如果不能完全理解这门课的这一组成部分,我的基础就会出现漏洞。所以我走了一条不寻常的路,故意不及格,以便重修这门课。当我完全意识到我做了什么时,我的大脑吓坏了,特别是当我看到我的成绩单时,但我知道从长远来看会更好,因为我将拥有成为伟大的数据科学家所需的基础。大多数人并不像他们那样幸运,因为这门课要上两次以上,所以我的建议是在你的空闲时间(或者真的,指定一个时间)回去深入研究你不熟悉的领域。当你看到其他人都在继续前进时,不要害怕重新开始,因为重要的是有一个没有任何裂缝的基础!

2.求助!参加在线课程有其挑战性,尤其是当课程不提供任何讲座,我需要 YouTube 视频之外的帮助时。我开始问我已经有编程经验的朋友,我向不同的人寻求帮助,这样我就不会用问题淹没同样的朋友。我反复查看我的清单,甚至得到了已经获得计算机科学学位的实习生的帮助。起初,当最近的大学毕业生帮我做作业时,这有点刺痛了我的自尊心,但我很快就克服了,因为我迫切需要一个人的帮助,而不仅仅是 3 分钟的视频。这个故事的寓意——不要让你的自负阻止你获得帮助!我们都需要团结😉。另外,你不知道一路上会遇到谁。

Image by Wokandapix from Pixabay

3.别紧张,这太难了!!当我开始学习第一种编程语言时,我非常紧张,甚至在开始之前就把自己搞得一团糟。我会先发制人地担心我无法理解家庭作业,因为我阻碍了我的大脑实际学习。我最大的教训/我想让每个人都知道的是,是的,编程是有挑战性的,会有更多的日子你想知道你为什么报名参加这个,但这就是我如何知道我正在把自己推出我的舒适区,当你反思你在哪里时,你会意识到你已经走了多远。;)

即使只有一门课完成了,一门课不及格,还有一门课还在进行中,我在不到一年的时间里从这个项目中学到的东西比我过去几年的工作中学到的还要多。所以坚持下去吧!我认为秘诀是坚持不懈,一旦你解决了问题,当你感到兴奋时,你就不想停下来了!此外,搞清楚事情并创造新东西的兴奋感是成为数据科学家最棒的部分!

Photo by Japheth Mast on Unsplash

数据科学家告诉自己的 3 个谎言

原文:https://towardsdatascience.com/3-lies-data-scientists-tell-themselves-8d29af9ccdf2?source=collection_archive---------19-----------------------

如果你浏览 r/MachineLearning 的话,你可能已经在过去几周看到了一些关于 Siraj Raval 的帖子,Siraj Raval 是 YouTube 上一位致力于为自己树立在线数据科学教育家名声的人物。他最近因抄袭、夸大其技能以及利用数据科学炒作赚快钱而受到抨击。

虽然 Siraj 的罪行清单是多种多样的,但我认为有一个自我欺骗的潜在主题。对自己说善意的谎言并不新鲜,数据科学也不例外;事实上,这个领域的某些方面可能会让它变得更加普遍。我思考了我的职业生涯——我所看到的——三种类型的谎言很突出。

谎言 1:执行代码相当于理解方法论

在数据科学(和一般的计算机科学)中,业余和理解之间的区域可能相当灰色。举个例子,如果有人复制了一个回购,创建了一个识别手写数字的模型,是不是说明他们懂计算机视觉?我不这么认为;事实上,他们可能连 GitHub 都不懂。

那么,在什么时候我们可以说我们真正了解了一些东西——当我们已经编码了它,将它应用于不同的场景,或者研究了潜在的数学?什么时候我们对一个话题足够了解,可以把它放在简历上,申请工作,或者收费让别人向我们学习?

我 7 岁女儿的数学课很好的框定了这个问题。学生们使用自我评估将他们的能力分为三组:我可以在别人的帮助下完成我可以自己完成我可以教别人。它的数据科学版本可能是我可以克隆它我可以编码它我可以派生它

那么你需要达到什么样的程度才能声称自己拥有一项技能呢?大多数人可能会说在编码派生之间。这是不是意味着,如果你能导出 OLS,你就只能得到做回归的许可?看情况。如果你在为一个 Kaggle 比赛做模型,那么就开始吧:毕竟,这是你将要学习的方式。但是,假设您的结果是一家制造公司的人类安全项目的一部分。你最好对你的方法论的数学和假设有一个坚实的理解。切尔诺贝利是一个强有力的例子,说明有些人认为他们知道自己在做什么,但却没有很好地理解其中的机制。同样,我们可以很容易地合理化我们执行代码的能力等同于我们的理解,但这不是真的。

谎言 2:如果是在网上,那就是公开招标

如果你像我一样,堆栈溢出已经使你习惯于简单地复制、粘贴、测试,然后继续前进。然而,堆栈溢出和 GitHub 之间有着天壤之别,即版权法。我认为有一个常见的误解,即如果代码在公共回购中,那么它就在公共领域中。然而,仅仅因为你可以在公共图书馆买到《哈利·波特》,你就没有权利在车库外出售它的影印版。数据科学家需要了解版权级别和使用他人代码的常见惯例。

那么在使用别人的代码之前应该怎么做呢?首先你需要弄清楚回购是在什么样的许可下进行的。对于大多数回购,这通常是在许可证文件中,尽管我注意到 scikit-learn 回购将它们存储在一个名为 copy 的文件中。无论你在哪里找到它,这基本上是自述文件的合法版本。在那里,您应该可以看到所选择的项目许可以及适用的条件。GitHub 通常会在大多数许可文件的顶部有一个很好的可视化效果。

好吧,如果回购没有许可证,然后呢?GitHub 上的许可页面声明如下:“你没有义务选择许可。但是,如果没有许可证,将适用默认的版权法,这意味着您保留对您的源代码的所有权利,任何人都不得复制、分发或从您的作品创建衍生作品。”因此,即使是看似没有公开许可的回购也仍然受到严格的版权保护。

我强烈推荐 MattyMeck 的文章一个数据科学家的开源许可指南给任何想了解更多的人。

谎言三:人气相当于同行评议

围绕我们领域的大肆宣传意味着我们可以从几乎任何来源找到验证。有了这样源源不断的崇拜,我们很容易成为不穿衣服走来走去的皇帝,以为自己的工作无可挑剔。

社交媒体往往会加剧这种效应。比如,我有 LinkedIn 上的背书,这些人从未见过我,更不用说见过我的作品了。你可以制作一个在 Reddit 上获得好评的数据可视化,一个获得浏览量的 YouTube 视频,或者一篇获得阅读量的文章,但这种反馈并不总是与你的内容准确一致。

突击测验。哪位科技领袖被提名为财富年度商业人物、时代全球最具影响力人物之一、以及福布斯最具影响力人物之一?你可能会猜测史蒂夫·乔布斯或埃隆·马斯克,但答案其实是 Theranos 公司的伊丽莎白·霍姆斯。炒作和关注并不等同于你所生产的产品的质量和价值。

我们如何保持诚实?

Siraj 的受欢迎程度盖过了其他伟大的创作者和教育工作者,这很可悲。我最喜欢的两个学习 TensorFlow 的 YouTubers 是 Morvan 和 DanDoesData 。可悲的是,他们俩都不再制作视频了。DanDoesData 尤其伟大;他会记录这些长达一小时的工作会议,你可以看到他遇到问题,并与错误作斗争。在他的主页视频中,他说,“我想体验安装东西的痛苦!”我喜欢这种观点:困难的事情有一种真实性。引用艾米莉·狄金森的话“我喜欢痛苦的样子,因为我知道这是真的;

所有这些都是一个很好的提醒,让我们放慢脚步,尽职尽责,不要被炒作分心。我们很容易被这个领域的激动人心所吸引。但是当兴奋变成夸张时,我们就知道我们没有朝着正确的方向前进。

3 本机器学习书籍帮助我提高了水平

原文:https://towardsdatascience.com/3-machine-learning-books-that-helped-me-level-up-a95764c458e3?source=collection_archive---------16-----------------------

Source: Pixabay

There is a Japanese word, tsundoku (積ん読), which means buying and keeping a growing collection of books, even though you don’t really read them all.

我觉得我们开发者和数据科学家特别容易掉进这个陷阱。就我个人而言,我甚至收藏书签:我手机的 Chrome 浏览器有太多打开的标签,计数器被替换成了“😄”表情符号。

在我们大多数人经历的那种对阅读和学习的热情中,我们通常会以失去而告终,不知道下一本书该拿哪本。这就是为什么今天我会给你一个非常的短列表:就 3 本机器学习的书,这样你就不会把它标上书签就忘了。

在我作为一名数据科学家的职业生涯的不同阶段,每本书都给了我很大的帮助,尤其是在我担任机器学习工程师的时候。

书来了!

O'Reilly:使用 Python 从零开始研究数据科学

我对这本书有很深的个人感情,因为这本书让我找到了工作。没错!在拿起这本书之前,我对数据科学几乎一无所知,甚至不知道什么是数据科学。

我确实有很强的概率和统计背景,并且知道足够多的 Python 来保护自己。然而,我错过了它实用的一面。

这本书为我做了很多事情。它:

  • 向我展示了如何用 Python 高效而优雅地处理数据(遵循 Python 的良好实践)。
  • 教我如何从零开始实现最简单的机器学习算法
  • 向我展示了数据科学家的日常工作可能是什么样的。
  • 教我如何清晰地向他人传达我的结果

如果您是数据科学社区的新手,我衷心推荐您使用它。它将为您提供成为一名高效数据科学家所需的大多数主题的清晰概述。

它还将展示 Python 最常用的库,并向您展示大量的惯用代码,这总是一个优点。

下面是亚马逊上 数据科学从头开始 的链接。

斯普林格:统计学习导论

这本书是我目前为止找到的最全面的机器学习书籍。我从中学到了很多,从无监督学习算法,如 K 均值聚类,到监督学习算法,如提升树。

如果你已经在这个领域工作了,第一章可能会感觉有点太入门了(至少我的经验是这样)。然而,他们也总结了许多你以前可能没有以如此有条理的方式学到的东西。

然而,后面的章节是我认为这本书真正闪光的地方。它对随机森林、提升树和支持向量机的解释非常准确。

以下是您可以从统计学习简介中学到的一些主题:

  • 回归监督学习算法:从线性回归SVM基于树的方法。
  • 无监督学习技术:尤其是聚类,包括 K-Means 算法。
  • 抽样方法和其他通用机器学习核心概念
  • 指标准确度、召回率、精确度等的含义、优缺点。

我认为这本书是我今年迄今为止最好的一本书,它使我成为一个更全面的数据科学家。如果你有更多的经验,但是想要打磨你的棱角,我推荐你。这也是一本非常好的参考书,放在你的书架上。

还展示了一切在 R 中的实现,我没发现特别有用,但也没什么坏处。您可能会从 SciKit learn 中导入大部分代码。

和以前一样,这里有一个亚马逊上的斯普林格统计学习介绍的链接。

Goodfellow,Bengio 等人的深度学习。

这本书每次打开都让我神魂颠倒。我会第一个承认我没有真正从头到尾读过它。还没有。
它在列表中垫底的唯一原因是因为它非常具体的范围:人工神经网络深度学习

然而,它的第一章,概述了深度学习的前身及其不同之处,然后解释了深度学习如何工作,非常精彩。

它甚至从解释你在学习深度学习之前需要知道的一切开始,整个章节都致力于线性代数概率信息论以及数值计算方法。

接下来的几章,我只是读了一部分,当你需要更深入地研究一个特定的神经网络架构时,它们会成为一个很棒的参考。

它们包括对卷积神经网络和递归神经网络的深入解释,以及许多正则化或优化方法。

第三部分也是最后一部分,围绕着尖端技术,解释了生成模型、自动编码器和许多其他有趣的算法。将它们添加到您自己的工具包中可能会给您带来很大的提升!

这本书的作者是目前机器学习领域的摇滚明星。他们中的一个人甚至最近获得了图灵奖,所以我想不出更好的人来教这个学科。

如果你对深度学习这本书感兴趣,这里有一个亚马逊链接。

结论

我从一个广泛的,介绍性的书到一个先进的,具体的书。

这些机器学习书籍中的每一本都对我的职业生涯产生了深远的影响,在某种程度上,也影响了我看待世界的方式。

我真的希望至少其中一些能对你的生活产生同样的积极影响!

如果你已经读过,或者正在读,请在评论中告诉我你对它们的看法!我很乐意进一步讨论它们中的任何一个,尤其是深度学习这本书。

如果你有兴趣,我们也可以在 Twitter 、 dev.to 的 Medium 上讨论。
想听听大家的意见!

(小免责声明:所有这些链接都是亚马逊附属链接,这意味着如果你买了这些书,我会得到一小笔佣金。然而,我只会回顾我真正读过的书,并且在现实生活中真诚地向人们推荐过的书)

原载于 2019 年 4 月 28 日https://striking loo . github . io

Spark 中的 3 种并行化方法

原文:https://towardsdatascience.com/3-methods-for-parallelization-in-spark-6a1a4333b473?source=collection_archive---------2-----------------------

Source: geralt on pixabay

提升数据科学任务的速度

Spark 非常适合扩展数据科学任务和工作负载!只要您使用 Spark 数据框架和操作这些数据结构的库,您就可以扩展到分布在集群中的大规模数据集。然而,在某些情况下,库可能无法用于处理 Spark 数据帧,因此需要其他方法来实现 Spark 的并行化。本文讨论了在 PySpark 中实现并行化的三种不同方式:

  1. 原生 Spark: 如果您使用 Spark 数据帧和库(例如 MLlib),那么您的代码将由 Spark 进行并行化和原生分发。
  2. 线程池:多处理库可以用来运行并发 Python 线程,甚至可以用 Spark 数据帧执行操作。
  3. Pandas UDF:Spark 中的一个新特性,支持在 Spark 环境中对 Pandas 数据帧进行并行处理。

我将使用 Boston housing 数据集作为样本数据集,提供在 PySpark 中实现并行性的每种不同方法的示例。

入门之前,it;在 Spark 中区分并行和分布是很重要的。当一个任务在 Spark 中被并行化时,这意味着并发任务可能在驱动节点或工作节点上运行。如何在集群中的这些不同节点之间分配任务取决于您使用的数据结构和库的类型。Spark 中有可能没有分布的并行,这意味着驱动程序节点可能执行所有的工作。这种情况发生在我下面讨论的 scikit-learn 线程池的例子中,如果可能的话应该避免。当一个任务分布在 Spark 中时,这意味着被操作的数据分散在集群中的不同节点上,并且任务是并发执行的。理想情况下,您希望创作并行和分布式的任务。

本教程中给出的例子的完整笔记本可在 GitHub 上获得,笔记本的渲染图可在这里获得。我使用 Databricks 社区版编写了这个笔记本,之前在我的 PySpark 介绍文章中也提到过使用这个环境。

单线程

在展示 Spark 中的并行处理之前,让我们从基本 Python 中的单节点示例开始。我使用波士顿住房数据集建立了一个回归模型,使用 13 种不同的特征来预测房价。下面的代码显示了如何加载数据集,并将数据集转换为 Pandas 数据框。

Loading the Boston housing data set

接下来,我们将数据集分成训练组和测试组,并将每个组的特征从标签中分离出来。然后,我们使用 LinearRegression 类来拟合训练数据集,并为测试数据集创建预测。下面代码片段的最后一部分显示了如何计算实际房价和预测房价之间的相关系数。

Building a regression model with scikit-learn

我们现在有一项任务需要并行处理。对于本教程,并行化任务的目标是同时尝试不同的超参数,但这只是使用 Spark 可以并行化的任务类型的一个例子。

天然火花

如果您使用 Spark 数据帧和库,那么 Spark 将本机并行化和分布您的任务。首先,我们需要将 Pandas 数据框转换为 Spark 数据框,然后将要素转换为 MLlib 所需的稀疏矢量表示。下面的代码片段显示了如何对住房数据集执行这项任务。

Converting the data frame from Pandas to Spark and creating the vector input for MLlib

一般来说,在将数据转换成 Spark 之前,最好避免将数据加载到 Pandas 表示中。而是使用 spark.read 等接口将数据源直接加载到 spark 数据框中。

既然我们已经准备了 Spark 格式的数据,我们可以使用 MLlib 来执行并行拟合和模型预测。下面的代码片段显示了如何实例化和训练一个线性回归模型,并计算估计房价的相关系数。

Building a regression model with MLlib

在 Databricks 环境中对 Spark 数据框进行操作时,您会注意到单元格下方显示了一个任务列表。该输出表明任务正在被分配给集群中的不同工作节点。在单线程示例中,所有代码都在驱动程序节点上执行。

Spark jobs distributed to worker nodes in the Cluster

我们现在有一个并行的模型拟合和预测任务。然而,如果我们还想同时尝试不同的超参数配置呢?您可以手动完成这项工作,如下两节所示,或者使用在 Spark 中本地执行这项操作的 CrossValidator 类。下面的代码显示了如何使用交叉验证来尝试不同的弹性网络参数,以选择性能最佳的模型。

Hyperparameter tuning using the CrossValidator class

如果 MLlib 拥有构建预测模型所需的库,那么通常可以直接并行化任务。但是,您可能希望使用不包含在 MLlib 中的算法,或者使用不直接处理 Spark 数据框的其他 Python 库。这就是线程池和熊猫 UDF 变得有用的地方。

线程池

不使用 Spark 数据帧而在 Spark 中实现并行的方法之一是使用多处理库。该库提供了一个线程抽象,您可以使用它来创建并发执行线程。但是,默认情况下,所有代码都将在驱动程序节点上运行。下面的代码片段显示了如何创建一组并行运行的线程,它们是随机森林的不同超参数的返回结果。

Using thread pools for parallelizing hyperparameter tuning

这种方法通过在线程池上使用 map 函数来工作。map 函数将 lambda 表达式和值的数组作为输入,并为数组中的每个值调用 lambda 表达式。一旦所有线程完成,输出显示每个线程的超参数值( n_estimators )和 R 平方结果。

[[10, 0.92121913976894299],  
 [20, 0.92413752558900675],  
 [50, 0.92705124846648523]]

以这种方式使用线程池是危险的,因为所有的线程都将在驱动程序节点上执行。如果可能的话,在使用线程池时最好使用 Spark 数据帧,因为这样操作将分布在集群中的工作节点上。使用线程池的 MLib 版本如下例所示,它将任务分配给工作节点。

Using thread pools with MLLib

熊猫 UDF

Spark 中支持并行处理的新特性之一是 Pandas UDFs。使用此功能,您可以将 Spark 数据框划分为较小的数据集,这些数据集被分发并转换为 Pandas 对象,在这些对象中应用您的函数,然后将结果合并回一个大的 Spark 数据框。本质上,Pandas UDFs 使数据科学家能够使用基本的 Python 库,同时获得并行化和分布的好处。我在我的 PySpark 介绍帖子中提供了这个功能的例子,我将在 2019 年 Spark 峰会上展示【Zynga 如何使用功能。

下面的代码显示了使用 scikit-learn 时如何执行并行化(和分布式)超参数调整。该脚本的第一部分获取波士顿数据集并执行交叉连接,从而创建输入数据集的多个副本,并向每个组附加一个树值( n_estimators )。接下来,我们定义一个 Pandas UDF,它将一个分区作为输入(这些副本中的一个),并作为结果转换一个 Pandas 数据帧,指定被测试的超参数值和结果( r 平方)。最后一步是执行并行计算的 groupby 和 apply 调用。

Parallelizing scikit-learn with Pandas UDFs

使用这种方法,结果类似于使用线程池的方法,但主要区别在于任务分布在工作节点上,而不是只在驱动程序上执行。示例输出如下:

[Row(trees=20, r_squared=0.8633562691646341), 
 Row(trees=50, r_squared=0.866335129308371), 
 Row(trees=11, r_squared=0.8257884742588874)]

结论

将 PySpark 用于数据科学时,有多种方法可以实现并行。如果可能,最好使用本地库,但是根据您的用例,可能没有可用的 Spark 库。在这种情况下,可以使用线程池或 Pandas UDFs 在 Spark 环境中并行化您的 Python 代码。只是要小心你如何并行化你的任务,如果可能的话,试着分配工作负载。

本·韦伯是 Zynga 的首席数据科学家。我们正在招聘!

在数据科学面试中不应该犯的 3 个错误

原文:https://towardsdatascience.com/3-mistakes-you-should-not-make-in-a-data-science-interview-9dc37752c8d0?source=collection_archive---------3-----------------------

Pixabay

我作为面试官的经验教训

人们问我很多关于如何找到数据科学工作的问题?或者如何转行或者如何为工作面试而学习?

我的回答大多是做一些mooc,创建一些项目,参与 Kaggle,尝试进入一家初创公司,不要放弃。

但是,每个人都应该了解一些关于数据科学工作的事情。

数据科学工作涉及大量的来回沟通,并涉及许多人的处理技能。因此,即使你没有意识到,你也会在无意中被测试这些技能。

有时候你可能会觉得——我是一个程序员,让我平静地编码吧。或者我的行为有什么关系?关键是确实如此。

这篇文章解释了人们在数据科学面试中犯的一些最严重的错误,这样你就不会重复这些错误。

1.失去你的权利

这就是我在数据科学中常说的生存偏差

所以,你想成为一名摇滚明星数据科学家。也许在蓬勃发展的行业找份工作。HBR 确实说过将会出现数据科学家短缺的情况,而你觉得你正是这份工作的合适人选。

我现在确实接受了很多采访,我看到很多人遭受生存偏见。

就在不久前,我面试了一个已经在这个领域有一些经验的人。让我们叫他安迪。我问了安迪一个简单的数学问题。 这是一个数据科学的面试,所以我猜他应该早就料到了。对吗?

他的回答是——

我们有做所有这些的软件包。

我忽略了这点。让它一次性过去。

当被问到一个不同的问题时,他说为什么我要问数学问题?

这件事告诉我,安迪觉得自己有资格。仅仅因为安迪看到很多人进入数据科学,他认为他也应该进入。

安迪不明白的是,对于每一个成功的数据科学家来说,都有很多人没有成功。

安迪看到的都是幸存者。这是一个错误。

2.过度自信效应

所以,我最近也面试了 Chris 的数据科学职位。

我从询问他的项目和过去的工作开始。

他自信地解释了他的项目。我们在前 30 分钟谈论了他的各种项目,我非常确信他在团队中有一席之地。

到目前为止,我还没有问太多的技术问题,这就是我开始怀疑的地方。事情是这样的,克里斯会非常自信地解释我问的任何问题,尽管是错误的 。他会试着向我解释他不懂的概念。

我觉得他好像认为我可能不知道自己问题的答案。所以他说什么都行。

而这种情况在面试中出现了两三次。

现在不要误解我的意思,自信是好的。健康的饮食是必要的。但是 自信错了,你就拼了灾难。

我能信任克里斯处理业务吗?如果他对企业犯了错误,或者提出了崇高的主张,但后来没有实现,会发生什么?

过度自信被称为所有认知偏见中最“普遍且具有潜在灾难性”的,人类会成为这些偏见的受害者。它因诉讼、罢工、战争、股市泡沫和崩溃而备受指责。—维基百科

事实上,我更喜欢一个不自信和错误的人。至少那样我会知道去核实我的事实。

3.关键词填充

关键词填充是指在简历中过多地填入他们可能不知道的技能。

这样做的典型借口是— 很多人都这样做。HR 可能不会选我。系统只能这样运作。

你可以称之为不可避免的邪恶。我会称之为你给自己设置了一个失败。

当你这样做时,你可能会偶尔接到面试电话;你的胜算很小,因为我会在你的简历上拷问你。我希望你能很好地了解它。

如果马克把决策树放在他的简历里,马克应该会想到一个围绕它的问题。

或者如果马克说他已经从零开始实现了一个机器学习算法,我期待马克解释算法的本质细节也不会错。

关键是,如果你不知道所有的事情也没关系。从来没有人知道。但是在你的简历上撒谎,你让我的工作变得更容易,因为这种谎言很容易被识破。

结论

在写这篇文章之前我想了很多,因为在这篇文章中我可能听起来有点刺耳。但是我想让人们知道他们的错误是必要的。

在这里,有些人会不同意我如何从这样的小错误中判断一个人。

我想说,面试就是在有限的时间内对一个人做出判断。

此外,许多公司现在除了常规的数据科学轮次之外,还进行行为轮次,而有独创性、有资格或过于自信显然对你没有帮助。

所以,我想说的是,尊重和友善是一个长期的过程,你应该在生活中以此为目标,而不仅仅是在面试室。

这样,你也得到很多练习,你也成为一个更好的人。

PS:所有使用的名称只是占位符,这些是我个人的观点。

网飞、Spotify 和家得宝赢得了 2018 年 Tableau 大会

原文:https://towardsdatascience.com/3-must-see-recorded-sessions-on-data-analytics-75ae83ffe550?source=collection_archive---------20-----------------------

将 TC18 的三个最佳数据分析演示集中在一起。

Gary Killian Vectors; Shutterstock

经过 439 场会议的筛选,我找到了 Tableau Conference 2018 (TC18)中我最喜欢的三场演讲。网飞、Spotify 和家得宝是我的赢家!在这篇文章中,我将深入每个演示并提供关键要点。

Tableau 是领先的数据可视化商业智能工具,他们每年都举行会议庆祝一切数据。我认为大部分会议都属于两种情况之一。1)教你如何更好的做 Tableau。2)一家分享他们如何在数据分析领域取得惊人成就的公司。

在这篇文章中,我们将关注第二个方面——公司数据故事。我做了很多很多演示,为你提供最好的。所以你可以残酷地对待你的时间,不要把它浪费在尿壶演示上(见文章结尾)。

此外,为了提高帖子的强度,我会给各种公司颁发假奖。

网飞

主持人:布莱克·欧文 |科学经理&分析

最佳狂欢演讲奖

YouTube 浏览量:932 |时间:54 分钟(包括问答)

Binging on Data: Enabling Analytics at Netflix; TC18; YouTube

他们不仅用他们的原创杀死它,网飞倾向于可靠地上演一场伟大的会议。对于一家不愿分享高水平观众人数的公司来说,他们肯定喜欢在 TC 拉开帷幕。

要点 1: 网飞是大数据重量级冠军,但他们仍然对自己面临的挑战保持谦逊。

Binging on Data: Enabling Analytics at Netflix; TC18; YouTube

以我的经验来看,Tableau 在你能够提取数据的时候是最好的。人们不能简单地提取 300 的数据并开始构建仪表板。他们涵盖了许多处理大数据的方法,包括一个名为 druid 的开源产品和一个让员工运行 SQL 查询的内部解决方案,该查询将输出作为 Tableau 数据提取推送到服务器。

对大多数人来说,网飞拥有的数据量绝对是惊人的。有趣的测试——在书上做标记,25 年后给人们看这张幻灯片——可能会像软盘上的空间一样可笑。

尽管他们在大数据方面做得很好,但他们也承认遇到了瓶颈,仍然必须在速度和规模之间做出选择。

关键要点 2: 网飞生活在重数据的初创企业文化中。

测量和实验是这家公司的支柱。大约 10%的员工在专门的数据分析团队工作。大约 50%的员工(5,000 人中的 2,574 人)访问过 Tableau 仪表盘。这是他们的数据分析堆栈和分析生态系统:

Binging on Data: Enabling Analytics at Netflix; TC18; YouTube

Binging on Data: Enabling Analytics at Netflix; TC18; YouTube

Lumen 和大数据门户是内部解决方案。该演示在大数据门户中占有重要地位(将在下面详细讨论)。

我发现有趣的是,他们所有的数据都是从 AWS 开始的。

关键要点 3: 网飞暗地里是数据治理的忍者

在每一次 Tableau 会议上,都有 50 多个类似于的故事:“每个人都在使用 Excel,然后我们引入了 Tableau,现在公司变得更好了。”TC 的叙述已经变得如此乏味,我几乎决定忽略这些介绍。然而,今年我确实注意到了第二种说法,即“我们的公司是封闭的,每个人都在做自己的事情,到处都是数据和报告,却不知道该相信什么。”**

布莱克提到了用数据解放企业的双刃剑。结果是许多许多的报告和表格。它们像兔子一样繁殖。然而,通过他们的内部解决方案、大数据门户和其他各种努力,他们似乎在这个问题上遥遥领先。

大数据门户允许用户首先搜索公司中所有现有的项目和表格,以查看他们正在寻找的内容是否已经存在。如果没有,他们可以进入第二步,开始编写查询或构建项目。

Spotify

演讲者:斯凯勒·约翰逊 |数据可视化设计师

最佳数据故事奖

YouTube 浏览量:433 |时间:28 分钟

This is Not a Love Song | How Spotify uses Tableau Public; TC18; YouTube

要点 1: Spotify 正在做更多公司需要做的事情。与公众分享很酷的数据故事。

斯凯勒强调了 Spotify 分享的一些很酷的故事,比如当真正的月食经过时,人们会播放关于该地区月食高峰期的歌曲。

关键要点 2: 文本和语言处理需要始终考虑包括表情符号。它们现在是我们语言的一部分。

你知道哪些表情符号最常与你最喜欢的艺术家联系在一起吗?Spotify 将艺术家发布在他们平台上的表情符号转化为游戏。你能猜出这些十大表情横排的艺术家吗?

没有答案

Spotify Interests; Tableau Public

带答案

Spotify Interests; Tableau Public

是的,我是有争议的,包括 R·凯利。只是觉得表情符号太离谱了。

关键要点 3: 激情胜过多年经验。

对斯凯勒来说,做自己热爱的事情帮助他在 Spotify 找到了梦想中的工作。斯凯勒热爱音乐。斯凯勒在业余时间使用公开的 Spotify API 讲述了惊人的数据故事。最终,Spotify 把他招进了公司,让他成为一名员工。他在演讲开始时提到,他使用 Tableau 才三年。然而,他在 Tableau 公共平台上拥有一些最受欢迎的数据可视化。

家得宝

主讲人:大卫·贝利 |商业智能领袖& 蔡斯·齐曼 |分析和数据科学领袖

最佳规范分析和双关语同时使用奖

YouTube 浏览量:307 |时间:57 分钟(带问答)

Not Tooling Around; YouTube

要点 1: 加强业务关系或反馈回路的一个好方法是通过仪表板。

家得宝拥有一家名为Blinds.com的公司。Blinds.com 实际上并不生产百叶窗。他们的产品有很多供应商。为了建立更好的关系和反馈回路,他们向供应商提供了一个 Tableau 仪表板。

这里的一个要点是,他们提到他们的供应商并不总是最懂技术的。他们有意将 Tableau 仪表板设计成可以轻松地推送到静态 PDF 并像传统记分卡一样共享的东西。显然,能够与一个活动的仪表板进行交互是首选,但是,不能总是期望观众以这种方式与仪表板互动。

关键要点 2: 如果你有一个网站,你应该从你的点击流数据中建模。

Blinds.com 将这个数据集与他们已经知道的关于客户的一切联系起来。这些算法能够指出并发现网站、客户体验的改进机会,或者客户自己是否容易犯错误。

关键要点 3: 归根结底,判断一个模型不是看它的准确性,而是看它对公司的影响。

当该算法选择要审查的订单、预计会有问题的订单时,它会根据业务的预期成本对它们进行排序。

Chase 提到,你可以通过许多不同的 KPI 来判断一个模型,但该模型最重要的事情是降低成本,帮助公司做得更好——所以他们通过再订购概率乘以预期再订购成本来判断他们的模型。这为他们提供了一个业务可以利用的可行指标。

结论

这是我最喜欢和最值得花时间的三次会议。我想继续下去,并删除链接,所以如果你想,你可以探索剩下的 436 个会议。

Tableau 大会 2018 届库

另外,由于我看了很多这样的视频,我想分享一些其他公司的会议,这些会议被考虑但没有通过(但仍然值得一个假奖)

未入围奖项:

强生|最佳实施累奖,《我们比 Excel 电子表格更好》故事

Google-Nest |每个人都希望会议被记录下来,但却没有

脸书|在比赛中获得第一名“我来是为了留下深刻印象,但我却看到了小便池的幻灯片(他们是唯一一个参赛的)

波音|最美丽和最丑陋仪表板奖

阿尔伯塔健康|最积极使用停车灯配色方案奖

运行迪士尼|最佳深入挖掘平庸数据奖

波特兰开拓者队|将球队色彩融入每一个可能的场景的奖项

构建数据素养的三个必须

原文:https://towardsdatascience.com/3-musts-for-building-data-literacy-e8a9bb67bc9c?source=collection_archive---------26-----------------------

担任数据分析主管几个月后,Alan 和他的团队清楚地看到整个组织缺乏数据驱动的思维。他们向领导者提出发展团队的需求,这些领导者沉浸在数据中,却没有任何处理数据的技能。

但艾伦遇到了领导者和经理的抵制,他们不认为分析和数据驱动的技能是他们责任的一部分。他们认为,分析和见解应该只来自艾伦和他的团队,并认为领导的角色是见解的消费者。此外,实际上,该组织正在努力实现数字化转型目标,而领导者现在不愿意投入时间进行培训。艾伦和他的团队将不得不等待追求他们的愿景。

但是领导们同意给团队一个机会。Alan 会就使用数据分析解决业务问题的优势和基础知识进行短期培训。每个人都将参与其中,然后有机会确定他们将使用数据分析解决的问题。

培训结束后,一些员工有兴趣学习新的分析技能。但对大多数人来说,培训只是造成了领导者的期望与实现期望所需技能之间的不匹配。

员工们在谈论另一种“浪费时间的培训”。

那些在 L&D 的人知道“意识培训”经常被用来获得认同。但是,说实话,这通常只会让人们感到困惑,并对培训产生负面的看法。

发展组织能力或提高绩效没有捷径可走。构建您的数据分析能力也不例外。L&D 领导人需要用正确的方法来引导他们的组织。

以下是构建数据分析“人”能力的三个关键

# 1a学习战略与业务重点,找到大石块****

2017 年 Gartner 报告 显示,60%的数据分析项目失败,因为项目与业务战略不一致或缺乏合适的人才。

了解业务的发展方向,识别大石块,并调整学习结果。高管们希望看到收入、产品和服务以及员工生产率和保留率的提高。

与数据分析领导者合作,将高优先级业务问题分配给可以开始应用数据分析来解决它们的团队。在这些团队中,您会发现渴望学习的早期采用者。您可以与这些团队合作,确定培训需求和结果,并在完全投入某个策略或课程之前进行试验,看看什么最有效。

#2 设计能力本位学习

设计 学习:创造一种体验,让学习者有两个目标——展示表现和展示能力**

研究清楚地表明“成功的关键是有效利用能力(Sanberg,2009) 个人属性和专业技能与技术数据分析技能一样重要,甚至更重要。(桑德伯格和帕蒂尔,2013 年)。随着您的培训计划的发展,为数据分析能力和趋势改进的早期培训队列设定基准。

间隔式学习:设计一种学习体验,让人们在接受培训的过程中使用他们所学的知识,并将其应用到实际问题中。间隔学习让人们在两次会议之间有时间体验使用新技术并获得反馈。它还创造了空间来强化经常被遗忘或误解的知识和概念。

成熟的框架:大部分解题方法都有框架。DMAIC 是流程改进的好例子。对于数据分析来说, BADIR 是一个优秀且经过验证的框架 。它为学习者提供了解决问题的路线图、通用语言和通用工具。它还需要有效的团队合作,这是数据分析中一项关键的个人属性能力。

#3 让它坚持下去:用自己的冲力持续下去

成功孕育成功。但是,每个组织都是不同的,有一些其他策略可以帮助推动和维持大型变更管理工作。

激励员工:徽章或证书形式的认可是很好的激励方式。但是职业发展的潜力才是人们真正想要的。如果“数据分析经验”被列为核心数据分析团队之外的更高级别职位的资格,员工将会注意到这一点,并更有可能在本质上受到激励来培养自己的能力。

衡量成功:度量计划应该从最重要的目标开始,并从那里迭代。培训完成率并不能说明问题。跟踪项目的绩效影响。按功能跟踪能力渗透率。始终讲述培训数据背后的故事,并鼓励组织中的人员贡献他们的故事。

如果您已经准备好开始,请不要错过我们在L&D 领导者的行动手册上的实时分析咖啡馆聊天,以推动内部数据分析能力。

与陷阱避免……

不要把重点放在工具上:“有工具的傻子还是傻子”。教 Tableau 和给一个统计考试是好的。但是要看到结果,人们需要练习和重复。这只能通过解决现实世界中的问题来实现。

不要使用 Pinterest: 有一种快速行动的诱惑,比如策划一些免费的 MOOC 课程,或者让内部分析团队一起吃午餐和学习。它最终看起来像一个 Pinterest 板。它缺乏一种连贯的方法,在 48 小时内,人们会忘记 70%他们所听到的,并且从来没有付诸实践。

不要让内部专家负担过重:使用内部专家进行在职辅导,没有考虑到通过更严格的学习来形式化技能的必要性。此外,它不具有可伸缩性。我见过内部专家离开,因为他们花太多时间在失败的培训工作上,而没有足够的时间解决业务问题。

为了成功实现数字化转型,L&D/培训领导者需要推动以能力发展为核心的数据分析学习战略。与您的数据分析主管合作,在培训和业务战略之间建立一致性。设计一种引人入胜的基于能力的培训体验,激发能够自我成长和维持的变革。从小处着手,快速行动,看看什么有效,并使用您自己的数据分析来指明方向。

  • Sanberg,J. 2000,理解工作中的人的能力,管理学院杂志,2000,43.1:9–25**
  • 帕蒂尔,T. H .,,达文波特,D. J. (2012)。数据科学家:21 世纪最性感的工作。哈佛商业评论**

企业界关于数据科学的 3 个神话

原文:https://towardsdatascience.com/3-myths-about-data-science-in-the-corporate-world-1321c48c4a40?source=collection_archive---------27-----------------------

如何在没有成本、风险或痛苦的情况下将数据科学整合到您的项目中

虽然我们可能同意数据科学只是一个朗朗上口的术语,但其潜在的概念有着坚实的基础。数据科学包括用于处理、分析和从信息中提取有用知识的所有方法和技术,主要通过统计学、机器学习和人工智能的手段。虽然现在的重点是机器学习和人工智能,但实际上它作为一种统计分析工具的基本用法让普通用户感兴趣。

早在 50 年代计算机时代开始时,数据分析就已经存在(计算机的第一个非科学应用与人口普查分析和统计有关),并且在过去的 20 或 30 年中得到广泛应用。如果数据分析是商业和企业界的老玩家,为什么它现在如此重要?原因是,现在技术可用性、成本和工具的组合已经收敛到一个可以真正被每个人采用的点。

让我们举一个技术的例子。自 1981 年索尼推出索尼 Mavica 以来,数码相机就一直存在。但直到 90 年代末,数码相机的成本、可用性和可靠性才让大众可以使用它们。

这个转折点已经发生在数据科学上,因为现在这种技术可以以经济高效的方式应用。就工具的成本和可用性而言,当前的技术水平简化了开发和使用,直到采用它是有利可图的。

这些要点乍看起来可能并不明显,人们通常认为数据科学是为复杂和前沿的环境保留的。在你对这个领域有所了解之前,我可以列举三个最常见的误解。

误解一:我的项目/团队不需要数据科学

我们可以发现不同的部门和团队在极其不同的背景下处理和分析数据。不管是销售、营销、工程、运营还是物流。每个人都需要分析他们的数据,从中提取知识,分享和交流这些发现,以改善业务运营。

大多数情况下,使用简单的电子表格来分析数据(这绝对不是正确的工具,尤其是当您处理大量数据时)。拥有计算技能和资源的团队和部门有时可以使用更复杂的工具,如定制编程。

在与技术无关的纯业务部门,一些数据挖掘和商业智能工具一直应用于公司报告的数据。数据分析并不新鲜,它在商业和公司世界中被不断地应用。

数据科学改变了这种方法。现在有了像 Jupyter 笔记本电脑这样的技术,任何计算机技能有限的人都可以有效地处理大量数据。数据展示和图表也更容易生成,曾经为技术含量高、资金充足的部门保留的总成本已经下降到适合每个预算的程度。

焦点不再是报告,而是从数据中获取有用的知识,让团队提供价值而不是报告。

误解二:数据科学是我所在行业不需要的前沿技术

Python 和 Jupyter 笔记本带来的是数据分析的极大简化。Jupyter 笔记本减少了定制分析的所有痛苦,任何具有基本开发技能的人都可以使用更好的环境来分析数据。实际上,使用任何其他方法,包括 BI 工具,都要复杂和昂贵得多。

Jupyter 笔记本大大降低了与数据分析相关的复杂性和成本。在短短几年内,它们已经成为事实上的标准和数据科学的通用语言。

如果在您的团队或项目中,您经常使用电子表格来分析数据,那么很有可能存在整合数据科学的空间。这不仅仅是选择一个新工具的问题,它实际上可以帮助您提供比标准电子表格和商业智能工具更多的价值。

经常发现的一个障碍是,数据科学似乎是专家的专利。媒体充满了复杂的解释和算法,但对于一般的商业用户来说,将简单的统计数据纳入大型数据集并获得探索和操作数据的灵活性的可能性,比更复杂的人工智能算法具有更大的价值。

数据科学对新人来说可能是令人生畏的,尤其是在企业界,但在现实中,它只是一种处理和分析数据的更智能的方法,可以有效地克服所有电子表格在灵活性和性能方面的限制。数据可视化也得到了极大的改善,因为 Jupyter 笔记本在图形方面的灵活性令人震惊,这要归功于 Matplotlib 图形库。

确实,您的团队需要获得一些新技能,但是这些实际上并不比预先使用电子表格中使用的宏和脚本语言难太多。转型后的回报是巨大的。

误解三:我需要建立基础设施,实施和维护成本高昂

现实是,你不需要基础设施(实际上你应该避免它)。虽然您可以在员工电脑或公司服务器上部署本地 Jupyter 笔记本电脑,但这并不是开始数据科学项目的最佳方式。您正在创造一个需要实施、维护和支持的薄弱环境,所有这些都意味着成本。内部部署也无助于专注于核心业务。

SaturnCloud.io provides scalable cloud infrastructure for Python DataScience in one click

如上所述,本地部署会带来隐性成本,更糟糕的是,它们不会促进团队合作、协作和数据共享。不要犯错,数据分析是为了迭代,在团队中工作,探索不同的方法来分析和理解数据。这完全是关于协作和迭代。

协作和敏捷性是数据科学项目成功的关键。基础设施必须保持在最低水平。云解决方案非常适合。项目必须是小型的,并且有团队共享的具体目标。

集中部署肯定是可能的(所有涉及的技术都是开源的),但在实施和维护方面,这将带来更大的隐性成本。安全性和备份等问题也需要考虑。我在过去已经这样做了,虽然它是可行的,但它实际上变成了“另一种服务”来维护。

实施数据科学项目的一个更聪明的方法是利用现有的云服务,如 SaturnCloud.io 。我喜欢这项云服务的一点是,只需一次点击就可以部署基础设施,它从零开始促进协作,并允许扩大和缩小我们的项目,这是内部解决方案难以实现的。云服务还消除了处理软件和库依赖、更新、安全和备份的需要。

笔记本可以通过链接共享,甚至可以与第三方、合作者、客户甚至普通大众共享。如果您的项目增长,并且您想要使用您的私有云,您也可以这样做。

云再次让事情变得更简单、更便宜、更快速,因为您可以避免内部基础架构和服务部署的零附加值活动,同时提供一个易于维护的实时环境,这也有助于协作。我非常支持尽可能减少拥有的基础设施,因为经验表明,使用专业基础设施比拥有它更容易、更便宜。

摘要

让您的项目和团队具备数据科学能力比您想象的要容易得多。你不需要基础设施,也不会被互联网上许多文章的复杂性和理论性所吓倒。数据科学就是分析数据,只需使用简单的统计数据就能获得出色的结果。

考虑在你的团队中拥有合适的技能组合,并确保促进协作。Jupyter 笔记本促进迭代,在迭代中,数据被逐步分析,许多不同的线可以被探索和共享。使用云服务将降低隐性成本,确保可用性和灵活性,最重要的是,将从第一天起促进任何数据分析活动所需的协作环境。

尤达宝宝上的 3 次 Numpy 图像变换

原文:https://towardsdatascience.com/3-numpy-image-transformations-on-baby-yoda-c27c1409b411?source=collection_archive---------16-----------------------

互联网已经失去了对小尤达的集体意识,这是有充分理由的。我是说…看看他。

我最近在帮助我的一些学生准备他们的 Python 期末考试,并认为在流行的 Python 库 Numpy 中学习一些基本的图像处理会很有趣,使用 baby Yoda 作为我们的源材料。

使用 Numpy 读取图像

首先,我们如何使用 Numpy 读取图像?事实证明,这很简单!假设您的工作目录中有一个名为 baby_yoda.jpg 的文件,下面是您需要的代码。

Read and show an image in Python

我们应该看看我们的小尤达:

但是 Python 是如何表示图像的呢?

现在,为了真正理解我们将要做的五种图像转换,我们应该对图像如何在 Python 中表示有一个基本的概念。

一幅图像基本上是一个 大、像素为矩形网格的 。并且,每个像素完全由三个值定义:红色、绿色和蓝色(RGB)。这些值中的每一个都是 0 到 255 之间的整数。该值越高,图像中的颜色就越多。

在一个极端,我们有一个 RGB 值(0,0,0)的像素,这意味着该像素中绝对没有颜色,也就是黑色。在另一个极端,我们有一个具有最大 RGB 值(255,255,255)的像素,这意味着图像中有尽可能多的颜色,也就是白色。你能想象到的每一种颜色都介于两者之间。

如果您的图像大小为 100 像素乘 200 像素,Python 会将整个图像编码成一个三维 Numpy 数组,其尺寸为 100 乘 200 乘 3 。3 对应的是我们之前提到的三个颜色通道。通过发挥这个三维数字阵列的创造性,我们可以对我们的图像进行各种各样的酷的变换!

1.灰度

首先,我们将把小尤达的彩色图像转换成灰度图像。请注意,我们称之为“灰色”的所有颜色都是简单的 RGB 组合,其中红色、绿色和蓝色的值正好是相同的。例如,RGB (60,60,60)是一种灰色,而(200,200,200)是另一种灰色。

嗯……我们如何将一个 RGB 值为(60,100,200)的像素转换成一个灰色像素?一个基本的想法是取三个数字的平均值,然后选择三个数字都是这个平均值的灰色阴影。因此,对于像素(60,100,200),平均值为 120,因此我们将其映射到灰色像素(120,120,120)。

让我们看看如何用代码实现这个结果!

为了解释这里的一些微妙之处:

  • 对于三维数组,有多种方式来解释“取平均值”。例如,我们可能打算对数组中的每个数字取平均值,得到一个数字。我们可能指的是每行的平均值、每列的平均值或每个像素的平均值。因此,我们需要使用“axis”关键字来指定我们想要的平均值。在这种情况下,它是像素的平均值。
  • 一旦我们得到了平均值,我们就需要将这些平均值“堆叠”起来,以创建灰度图像。另一种思考方式是,我们希望将每个像素的红色、绿色和蓝色值设置为该像素的平均值。
  • 注意,任何像素的 RGB 值的平均值可能不是整数,但是 Numpy 希望图像中是整数,所以我们将简单地将灰度图像转换回整数。

而且…如果一切顺利,我们应该会得到仍然可爱的灰度豹宝宝尤达:

2。水平/垂直翻转

我们可能还想水平或垂直翻转我们的小尤达。后退一步,让我们看看如何反转一个普通的数字列表。

如果我有list _ of _ num,它们是[1,2,3,4,5],运行以下命令:

数字列表[::-1]

会产生相反的列表:[5,4,3,2,1]。

解释一下 [::-1] ,它是 [0:len(list_of_nums),-1]【T9]的简写,上面写着:

“遍历我的整个列表,步长为-1”,更简单的意思是“向后遍历我的列表”

我们也可以使用这种方便的符号来翻转整个图像。下面是垂直翻转的代码:

Vertically flip an image in Python

由于行是我们的图像(这是一个三维数组)的第一个轴,我们可以简单地对整个图像使用相同的 [::-1] 变换,我们将颠倒所有行的顺序。颠倒行的顺序与垂直翻转图像是一样的,会产生颠倒的婴儿尤达:

水平翻转我们的图像也很简单,使用下面的代码:

哇哦。混乱的语法是怎么回事: [:,::-1] 。这也是 [0:numRows,0:numCols:-1] 的简写,意思是“遍历我的所有行,并以相反的顺序遍历我的所有列”。这具有保持行原样的效果,但是翻转列,导致水平翻转:

3.模糊图像

最后,让我们来看看一个稍微复杂一点的变形,模糊。

对于图像来说,模糊是一个非常直观的概念。当你的相机没有对准焦点,或者有东西移动得太快,相机无法准确捕捉时,就会发生这种情况。事实证明,我们可以对我们的小尤达图像进行变换,以创造这种模糊效果。

首先,让我们看看数学上“模糊”一个像素是什么意思。在下图中,我们有一个红色的中心像素。我们在像素周围创建一个小方框,用蓝色标出。为了“模糊”中心像素,我们将取较大的蓝色框中所有像素的平均值,并将该平均值设置为等于中心像素的新值。

对婴儿尤达图像中的每个像素进行这种变换(除了边界上的像素,因为我们不能创建这些方框),我们使每个像素都包含了附近像素的信息。因此,像素不再是独立的,而是彼此“模糊”在一起。

让我们来看看实现这一点所需的代码。

看起来有点吓人!希望这些评论能有所帮助,但总体想法是:

  • 在我们制作的婴儿尤达的灰度版本上工作(为了简单起见)
  • 对于图像中的每个像素,在像素周围定义一个小方框
  • 取该框中所有像素的平均值,并将该值设置为新的像素值
  • 通过将三张模糊图像叠加在一起来重建图像

结果是:

有点模糊,但还是很可爱。如果你仔细看,你可以看到图像周围的小边界没有受到模糊的影响。

就是这样!希望你在 Numpy 中学到了一些关于图像处理的知识,并再次爱上了小尤达。

~祝你好运!

你应该更经常使用的 3 个熊猫功能

原文:https://towardsdatascience.com/3-pandas-functions-you-should-be-using-more-often-696b41e8d7ca?source=collection_archive---------3-----------------------

不可否认,熊猫是一个强大的图书馆。如果您是 Python 的日常用户,它可能是您最喜欢的用于数据分析和一些快速可视化的库。

Photo by Stan W. on Unsplash

也就是说,人们很容易习惯于熊猫的一些核心概念,而忽略了对其功能的进一步探索。我的意思是,谁没有重复发明轮子的罪过?虽然这不一定是一件坏事(因为你确切地知道你的代码应该做什么),但通常有更聪明的方法来达到同样的目的。

今天,我想和你们分享 3 个功能,到目前为止,我没有尽可能多地使用它们,我还想向你们展示我所说的“重新发明轮子”的确切含义。几周前,我写过一篇类似的文章,只与纯 Python 相关。如果你是一个经常重复发明轮子的人,请不要犹豫去看看:

[## 面向数据科学家的 3 个高级 Python 函数

不要重复发明轮子,让你的代码更干净,更易读。

towardsdatascience.com](/3-advanced-python-functions-for-data-scientists-f869016da63a)

好了,说够了,让我们开始研究熊猫吧。

使用的数据集

正如我的许多文章一样,我将使用著名的泰坦尼克号数据集。我相信您知道如何导入它,所以在继续之前,您应该准备好以下内容:

我们在同一页吗? 好,我们开始吧。

1.idxmin()和 idxmax()

简而言之,这些函数将返回所需条目的 ID ( 索引位置)。在泰坦尼克号的例子中,也许你想找到最年轻/最年长的人的索引位置。让我们更进一步,你只对那个人的名字感兴趣。

一个典型的程序员方法是重新发明轮子,因为你不知道 idxmin()idxmax() 的存在。这里有一种方法:

您基本上是为所需的属性设置子集并返回值。不是最干净的代码,但可能更糟。下面是如何利用前面提到的功能来实现这一点:

是的,很明显,结果是一样的,但是代码更短,更清晰。让我们进行下一个。

2.切割()

用最少的话来说,当你想把值装入离散区间时,你应该使用 cut() 。比如泰坦尼克号数据集有这个 年龄 属性,是连续的。在您的分析中,您可能希望计算某个年龄组的存活/死亡比率,而不是作为标量值的年龄。

我甚至不会尝试用这个函数来重新发明轮子,让我们直奔主题。其思路是将 bin列分成 5 个桶:

不喜欢那些股票标签? 不成问题:

或者你根本不在乎标签什么的,想要简单的整数表示:

无论您选择哪一个,您都可以将整个表达式分配给数据框架中的一个新列,并继续您的分析。

3.数据透视表()

数据透视表创建一个电子表格样式的数据透视表作为数据框架。如果你以前使用过 Excel ,我毫不怀疑你使用过它们。不用说,它们可以毫不费力地用 Python 实现。

假设你想知道第三类男性的平均存活率。您可以使用默认的 Pandas 及其过滤功能来获取这些信息:

但是如果你想找到男性和女性的平均存活率呢?在所有三种乘客级别中?数据透视表拯救世界。您可以简单地将索引设置为 性别 ,列设置为 Pclass (乘客类),值设置为 幸存 ,然后使用您想要的任何聚合函数,但是让我们坚持使用的含义:

嗯,那很简单。还有一点需要注意,您还可以为总计添加额外的一行:

在你走之前

这三个功能应该会让你走上正轨。最终的目标是花更多的时间去思考什么是最佳的做法,而不是花太多的时间在实现本身上。

每当你觉得你的代码比它应该的要长,使用谷歌来寻找是否有一个更短的方法。很可能已经有一个功能可以做你需要的事情,但是你没有意识到它的存在。

感谢阅读。欢迎在下面分享你的想法和评论。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

* [## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)*

数据科学家可以使用 3 种 Python 工具编写高质量的代码

原文:https://towardsdatascience.com/3-python-tools-data-scientists-can-use-for-production-quality-code-604a5e0acf9a?source=collection_archive---------9-----------------------

仅仅因为你是数据科学家,并不意味着你不应该写好代码

我对编码的第一次体验是作为一名本科统计学学生使用 S-Plus(R 的前身)。我们的讲师是一位有几十年经验的教授,他教我们如何通过在 S-Plus 控制台上一次一行地键入代码来拟合回归模型。

如果您希望能够在将来的某个时间点重新运行您的代码,您可以将其保存在一个文本文件中,然后剪切并粘贴到控制台中。

直到几年后,在我毕业后的第三份工作中,在完成统计学博士学位后,我才第一次发现编程脚本,以及好代码实际上是什么样子的。

回想起来,我对这种情况的发生感到震惊。然而,通过与我的数据科学家朋友交谈,特别是那些没有软件开发背景的朋友,我的情况似乎并不独特。

不幸的是,许多数据科学家不知道如何编写生产质量的代码。

生产质量代码是这样的代码:

  • 可读;
  • 没有错误;
  • 对异常具有鲁棒性;
  • 高效;
  • 有据可查;和
  • 可复制。

生产它不是火箭科学。

任何足够聪明,能够理解神经网络和支持向量机的人(即大多数数据科学家)肯定能够学习良好的编码实践。

问题是,大多数数据科学家甚至没有意识到,编写生产质量的代码是他们可以也应该学习的事情。

如何编写高质量的代码

在我的文章生产质量数据科学代码的 12 个步骤中,我详细描述了一个简单的过程,数据科学家可以遵循这个过程来准备他们的代码生产。

总之,这些步骤是:

  1. 确定你想要达到的目标;
  2. 构建最小可行产品;
  3. 利用干燥原理减少重复;
  4. 创建并运行单元测试;
  5. 处理异常情况;
  6. 最大化时间和空间效率;
  7. 使变量名和函数名有意义;
  8. 对照样式指南检查您的代码;
  9. 确保再现性;
  10. 添加注释和文档;
  11. 要求进行代码审查;和
  12. 展开。

对于其中的许多步骤,没有真正的捷径可走。例如,构建最小可行产品的唯一方法就是卷起袖子开始编码。然而,在少数情况下,工具的存在可以自动化繁琐的手动过程,使您的生活更加轻松。

在 Python 中,由于 unittest、flake8 和 sphinx 包,这就是步骤 4、8 和 10 的情况。

让我们一个接一个地看一下这些包。

用 unittest 自动化你的错误检查

单元测试用于确保在一系列不同的环境下,组成代码的函数正在做它们应该做的事情。

如果您的代码只包含少量相对简单的函数,那么您可能只需要少量的单元测试,您可以手动运行和检查这些测试。

然而,随着代码规模和复杂性的增加,为了确保广泛的覆盖范围,您需要的单元测试的数量也会增加,手动测试导致的人为错误的风险也会增加。这就是 unittest 包的用武之地。

unittest 包是专门为自动化单元测试而设计的。要通过 unittest 包运行单元测试,只需创建一个类,并将单元测试编写为位于该类中的方法(即函数)。

例如,考虑一个在给定半径的情况下计算圆面积的函数:

为了检查这个函数是否按预期工作,您可以创建单元测试来确保这个函数为两个不同的半径值(比如 2 和 0)产生正确的输出。

使用 unittest 包,您可以自动执行这些检查,如下所示:

在这个例子中,我把我的测试类称为“TestFunctions”,但是你可以把它称为任何东西,只要这个类有 unittest。TestCase 作为其父类。

在这个类中,我创建了两个单元测试,一个测试 circle_area()适用于半径 2 (test_circle_area1),另一个测试半径 0 (test_circle_area2)。这些函数的名称并不重要,除了它们必须以 test_ 开头并带有参数 self。

代码的最后一行运行测试。

假设所有的测试都通过了,输出看起来会像这样,每一个通过的测试在最上面一行都有一个点。

或者,如果您的一个测试失败了,那么输出的顶行将为每个失败的测试包含一个“F ”,并且将提供进一步的输出,给出失败的细节。

如果您使用 Python 脚本编写代码(即 py 文件),理想情况下,您应该将您的单元测试放在一个单独的测试文件中,将它们与您的主代码分开。然而,如果您使用的是 Jupyter 笔记本,您可以将单元测试放在笔记本的最后一个单元格中。

一旦你创建了单元测试并使它们工作,无论何时你对你的代码做了任何(显著的)改变,重新运行它们都是值得的。

检查 PEP8 是否符合 flake8

编码风格指南是一个文档,它列出了特定编程语言的所有编码约定和最佳实践。在 Python 中,转到样式指南是用于 Python 代码的 PEP 8 样式指南。

PEP 8 是一个 27 页的文档,所以确保你的代码符合每一项可能是一件苦差事。幸运的是,有一些工具可以帮助你做到这一点。

如果您将代码编写为 Python 脚本,flake8 包将检查是否符合 PEP 8。

安装此软件包后,只需导航到包含要检查的代码的文件夹(filename.py ),并在命令提示符下运行以下命令:

flake8 filename.py

输出将告诉您代码不符合的确切位置。

例如,此输出告诉我们 Python 脚本 2019 08 18 _ Production _ examples . py 包含 6 个不合规的实例。第一个实例在第 1 行第 1 列,其中包“math”已导入但未使用:

在 Jupyter 笔记本中,有几个扩展可以确保符合 PEP 8,包括 Jupyterlab-flake8 和 jupyter-autopep8 。

使用 sphinx 创建专业外观的文档

有没有想过 Python 包的创造者,比如 NumPy 和 scikit-learn,是如何让他们的文档看起来这么好的?

答案是 sphinx,这是一个 Python 包,可以将文档字符串转换成各种格式的文档,包括 HTML、pdf 和 ePub。

它还与 GitHub 和 ReadtheDocs (一个文档托管平台)集成,这样每当您的代码更新被推送到 GitHub 时,您的文档就会自动重建,确保您的文档始终保持最新。

我在编写 Python 包 mlrose 时使用了 sphinx,下面是这个包中包含的一个函数的摘录。注意这个函数顶部的 docstring 被格式化的特殊方式。

对这段代码运行 sphinx 会生成以下格式良好的文档:

开始使用 sphinx 可能有点困难,但是可以在这里找到关于该主题的优秀教程。

大多数数据科学家不知道如何产生生产质量的代码,但如果你想脱颖而出,那么你就不应该像大多数数据科学家一样。

通过遵循一个简单的 12 步流程并将一些简单的工具集成到您的工作流程中,有可能对您正在生成的代码的质量做出巨大的改进。

您可能永远不会让您的代码达到没有人会抱怨的程度,但至少,您不会因为试图在 S-Plus 控制台中一次一行地拟合一个回归模型而让自己尴尬。

Genevieve Hayes 博士是数据科学家、教育家和人工智能及分析专家,拥有Genevieve Hayes Consulting。你可以在LinkedIn或者Twitter上关注她。她还是 价值驱动数据科学 的主持人,这是一个每月两次的播客,面向希望最大化其数据和数据团队价值的企业。

想要发掘企业数据的价值,但不知道从哪里开始?**下载免费的数据科学项目发现指南。

训练 ML 模型的 3 个快速技巧

原文:https://towardsdatascience.com/3-quick-tips-for-training-ml-models-2a7a95960dbf?source=collection_archive---------28-----------------------

Not good.

对于机器学习中每一个胜利的结果,都有数百个不收敛的错误模型。

暴涨的损失函数。异常验证损失。可疑的低培训损失。这些都说明出事了。

有一些漂亮的参考资料可以帮助彻底诊断问题,但这里有三个候选资料会立即浮现在脑海中并不断弹出。

注意:这尤其适用于面向图像的任务,但对于一般的 ML 任务仍然有很大的价值。

1.调整频道数量

特征映射是卷积层中的通道数,出现在各种应用中。这将改变单层中使用的内核数量。拥有太多的特征地图会导致过度拟合,因此找到正确的平衡是一件困难的事情。

A convolutional layer with two output channels (see here).

2.好好把握学习速度

最初的学习率为训练定下了基调。开始的时候太大,你会反复无常,永远不会安定下来。从小事做起,你将永远不会在第一时间找到任何东西。这当然取决于应用,但在许多情况下,初始学习率为 0.001 或 0.01 都很好。

2a。改变整个学习的速度

研究使用一个时间表来改变整个培训的学习速度。随着时间的推移降低学习速度通常是一个好主意。考虑振荡,指数衰减,三角形衰减。

Learning Rate over Training Iterations (source here).

3.看数据

这真的应该是第一条也是唯一一条建议,但这似乎只是常识。看数字和摆弄超参数只会做这么多;你得看数据。如果您正在生成输出,请查看输出。

即使您将图像的像素值打印到命令行,仍然会发现有问题。在规范化、裁剪、旋转和移动的各个阶段之间,很可能有些事情没有按预期进行。

求你了。看数据。每次都很痛苦但很值得。

我放弃 SSIS 转投 Python 的 3 个原因

原文:https://towardsdatascience.com/3-reasons-why-im-ditching-ssis-for-python-ee129fa127b5?source=collection_archive---------1-----------------------

Photo by Chris Ried on Unsplash

十多年来,我一直在使用微软的 SQL Server 技术堆栈,虽然我一直非常看好它,但最近我改变了对它的一个关键组件的看法,即SQL Server Integration Services,简称 SSIS。SSIS 是一个非常强大的工具,可以对数据执行提取、转换和加载(ETL)工作流,并且可以与几乎任何格式进行交互。虽然我主要是在将数据加载到 SQL Server 或从 SQL Server 中加载数据的上下文中看到它,但这肯定不是它的唯一用途。

这些年来,我已经编写了很多 SSIS 软件包,虽然我仍然觉得它是您的武库中的一个巨大的工具(在许多情况下,它可能是对技术使用有严格标准的大型企业中唯一可用的工具),但我现在已经决定,出于我将在下面概述的原因,我更喜欢使用 Python 来满足大多数(如果不是全部)ETL 需求。尤其是当 Python 与两个专门为大规模操作和分析数据而设计的模块结合时,即 Dask 和 Pandas 。

Python 是免费和开源的

Python 是一种完全开源的语言,由 Python 软件基金会维护。它和它的大量软件包都是完全免费的,如果你发现一个错误或者需要一个特性,你可以很容易地贡献出底层的源代码。例如,Dask 和 Pandas 在 GitHub 上总共有超过 25,000 次提交和 9,000 次分叉。两者都是非常活跃的项目,背后都有大型的、分布式的、活跃的社区。此外,Python 可以使用其他开源包与几乎任何数据源对话;从 CSV 文件,到卡夫卡,到抓取网站。Python 作为一个整体非常受欢迎并且不断增长,在 Stack Overflow 的 2019 开发者调查中从第七位跃升至第四位。

另一方面,SSIS 要求您许可任何运行它的机器,就像您许可任何其他运行 SQL Server 完整实例的机器一样。因此,如果您想遵循良好的实践,将 ETL 处理卸载到不同于 SQL Server 实例的机器上,那么您必须全额支付该机器的许可费用。假设您能够成功地完成 SQL Server 的复杂许可,请考虑一下:许多 ETL 工作负载都是批处理操作,这意味着它们往往在一天中的预定时间运行,否则就会闲置。你真的想为一天用一次或有时用得更少的东西支付(有时是一大笔)钱吗?虽然 SSIS 是可扩展的,但我还没有看到你在 Python 上看到的那种广泛的开源工具集。

使用像 Dask 这样的工具,Python 天生具有水平可伸缩性

Dask 是专门为处理数据集太大而无法在单个节点的内存中容纳的问题而设计的,并且可以在许多节点上扩展。因此,您可以使用您的组织可能已经使用的工具(如 Kubernetes )根据您的需求轻松扩展您的数据处理环境的规模,而无需编写复杂的代码来跨节点分发数据。我个人用它在我的笔记本电脑上处理了数十亿字节的数据,只使用了内置的本地分布式模型,并且我没有改变我编写数据处理代码的方式。

至少据我所知,SSIS 没有内在的方法在多台计算机上分配处理,至少没有复杂的解决方案,就像在这个 ServerFault 线程上提出的。虽然自 SQL Server 2017 起,SSIS 确实具有横向扩展功能,但这更多地是为了在任务级别分配工作(例如,以分布式方式运行包的各个部分),因此,如果这些单个任务中的任何一个处理大量数据,您仍然会受到限制。

Python 代码本质上是可测试的

正如我的好朋友 Nick Hodges 最近写的那样,对你的代码进行单元测试是很重要的。在处理 ETL 工作流时也是如此;在没有某种人工观察的情况下,您如何确保您的 ETL 过程在给定预期输入的情况下产生正确的输出(或者同样重要的是,当它获得意外数据时如何处理事情)?

Python 有很多有用的单元测试框架,比如 unittest 或者 PyTest 。通过将您的 ETL 过程分解成可消耗的代码单元,您可以轻松地确保预期的行为并进行更改,而不必担心无意中破坏了某些东西。

相比之下,SSIS 没有任何简单的方法来编写单元测试,最常被提及的两个框架要么是不活跃的,要么似乎已经很大程度上转变为专有产品。

底线是:在这个狂热的 SQL Server 粉丝看来,如果你正在开发新的 ETL 工作流,更好的选择是 Python 而不是 SSIS。请注意,SSIS 仍然非常强大,如果您有一个强大的现有团队支持它,并且在 SQL Server 许可方面投入了大量资金,那么当然没有理由对所有这些进行改造。正如我在开始所说的,在许多大型组织中,SSIS(或者 Informatica,举另一个非常流行的专有 ETL 工具的例子)是事实上的标准。尽管如此,鉴于 Python 的爆炸性增长,它显然应该获得一席之地。

作为一名(有抱负的)数据科学家,你应该写博客的 3 个理由

原文:https://towardsdatascience.com/3-reasons-why-you-should-be-blogging-as-an-aspiring-data-scientist-99741da62cbe?source=collection_archive---------27-----------------------

众所周知,博客和内容创作对你的职业生涯有益。在今天的帖子中,我想和你分享我开始写博客后发生了什么变化,以及为什么我在不久的将来不会回头看。

Photo by Art Lasovsky on Unsplash

尽管这只是我的观点,我不能说这些观点会因人而异——因为这些只是拥有博客的一些一般好处。

我渴望听到你的想法,所以请在下面分享你的想法和观点。事不宜迟,我们开门见山吧。

1.你会学得更快

一些数据科学主题可能很难理解。当你周围有一些学习资源,并花几天时间浏览这些材料时,你会形成一些基本的理解。如果这是一个与编码相关的主题,不用说,你应该在阅读理论资源的同时编写代码。

接下来发生的是,你跳到下一个感兴趣的话题,随着时间的推移,完全忘记你在第一个话题中学到了什么。 真扫兴。幸运的是,写博客是解决这个问题的好方法。

这个想法是,你给自己几天的时间让一切都完全消化。然后,拿起一张纸(或者笔记本电脑,如果你更喜欢),试着用一种非技术性的方式解释这个话题。有些时候不会完全可能,但尽量避免混淆‘大词’。

问自己以下问题: 如果 a 对这个话题一无所知,我希望别人如何向我解释?

这有两个直接的好处:

  1. 你在帮助你的社区 ( 这将在文章的第二部分讨论)。
  2. 你再给自己一次机会重温这个话题。

这是阿尔伯特·爱因斯坦的一句名言:

"如果你不能简单地解释,那就是你理解得不够好."

这就是为什么你在写博客的时候应该避免使用大的技术词汇。即使你不理解,也很容易用专业术语来包装你的文章。这很诱人,你认为你会看起来很聪明,但是你的读者很可能会立即关闭他的网络浏览器。

2.伟大的声誉建立者

你知道在你把你的简历发送到一些公司后会发生什么吗?

他们会用谷歌搜索你。

由于周五晚上出了问题,在你躺在公园里不省人事的照片之前,确保有一些有价值的东西出现。好吧,也许我有点反应过度了,但你明白了。

当你写博客的时候,你立刻比拥有相同知识但不写博客的人更有价值。你增加了价值。另一个人没有。在大胆断言一种技术或一种方法比另一种更好的时候,要小心谨慎。它可以是一把双刃剑。

即使你对全职工作不感兴趣,写博客也能帮你获得更多的自由客户。这总是一个双赢的局面,除了在那些罕见的情况下,当你写的东西你一无所知。

3.兼职赚钱

这是一件大事。我不会告诉你我写博客赚了多少钱,因为这些信息与你无关。这取决于你住在哪里。 你会用美元赚取,问题是你会用哪种货币消费?

如果你住在美国,收入可能够支付一个月的房租,如果住在其他地方,可能是几个月的房租。还是新的笔记本电脑,由您决定!

最令人惊奇的事情不是有人愿意为你的观点付费——最令人惊奇的事情是在某种程度上,你被付费来学习你感兴趣的东西。你怎么能拒绝呢?

在你离开之前

我的观点是你应该从今天开始写博客。即使你不擅长,也没有比直接投入学习更好的地方了。如果过了一段时间,你觉得它不适合你,没关系,至少你尝试过了。

如果这篇文章的 10 个读者开始写博客,我绝对肯定至少有 7 或 8 个会在几个月后继续写下去。

如果你担心要花多少时间,我会说大约每周5-7 小时写 3 篇高质量的博客文章。这里不包括学习时间——你会学到与你是否写博客无关的东西,对吗?

给自己几天时间考虑你在这里读到的东西,让一切都沉淀下来。然后做出决定——我相信你会做出正确的决定。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

3 数据科学自学资源

原文:https://towardsdatascience.com/3-resources-for-data-science-self-study-b01e5ac983a1?source=collection_archive---------29-----------------------

Photo by freddie marriage on Unsplash.

数据科学是当今最热门的领域之一。数字革命创造了成吨成吨的数据。公司、行业、组织和政府每天都在产生大量的数据。对高技能数据科学家的需求只会继续增长。这是投入时间学习数据科学基础知识的最佳时机。

即使你对成为一名数据科学家不感兴趣,学习数据科学的基础知识也是你通过学习一项新技能来重塑自我的绝佳方式。谁知道获得数据科学技能后会有什么机会。要思考的问题是:当数据科学的机会来敲你的门时,你准备好了吗?将具备所需的技能。

对学习数据科学感兴趣的个人经常面临这样的问题:通过自学学习数据科学有哪些资源?

在本文中,我将讨论 3 个可以帮助您掌握数据科学基础的资源。我认为学习数据科学的推荐方式是从在线课程开始。然后,在建立一些背景知识之后,可以开始学习数据科学书籍,以获得更深入和精炼的知识。

本文将讨论的 3 种资源与我在成为数据科学家的过程中使用的资源相同。由于我使用这些资源获得的技能,今天我是出版物 走向 AI 的顶级数据科学作家。我还是一名数据科学教育工作者和顾问。

1。海量开放在线课程(mooc)

edX、Coursera、Udemy、DataCamp 等平台上有那么多数据科学 MOOCs。如果你打算参加这些课程中的一门,请记住,有些 MOOCs 是 100%免费的,而有些则需要你支付订阅费(每门课程可能从 50 美元到 200 美元不等,甚至更多,因平台而异)。请记住,获得任何学科的专业知识都需要大量的时间和精力。所以不要着急。确保如果你决定注册一门课程,你应该准备好完成整个课程,包括所有的作业和家庭作业。一些测验和家庭作业将会很有挑战性。然而,请记住,如果你不挑战自己,你将无法增长你的知识和技能。

我自己已经完成了这么多数据科学 MOOCs,下面是我最喜欢的 3 个数据科学专业。

(一)数据科学专业证书(HarvardX,通过 edX):【https://www.edx.org/professional...

包括以下课程,全部使用 R 教授(您可以免费旁听课程或购买认证证书):

  1. 数据科学:R 基础;
  2. 数据科学:可视化;
  3. 数据科学:概率;
  4. 数据科学:推理和建模;
  5. 数据科学:生产力工具;
  6. 数据科学:扯皮;
  7. 数据科学:线性回归;
  8. 数据科学:机器学习;
  9. 数据科学:顶点

(二)【https://www.edx.org/micromasters...】分析:基本工具和方法(Georgia TechX,通过 edX):

包括以下课程,全部使用 R、Python 和 SQL 讲授(您可以免费审计或购买经过验证的证书):

  1. 分析建模导论;
  2. 数据分析计算导论:
  3. 商业数据分析。

(三)应用数据科学与 Python 专业化(密歇根大学,通过 Coursera):https://www.coursera.org/special...

包括以下课程,全部使用 python 教授(您可以免费旁听大多数课程,有些课程需要购买认证证书):

  1. Python 中的数据科学导论;
  2. 应用 Python 绘图、制图和数据表示;
  3. Python 中的应用机器学习;
  4. Python 中文本挖掘的应用:
  5. Python 中的应用社会网络分析。

为什么我认为上述 3 个 MOOCs 专业是最好的

a. Python 和 R 被认为是大多数数据科学工作清单中提到的前 2 大技术技能(数据科学家最需要的技能)。上面讨论的 3 个专业使用 Python 和 r 教授数据科学。这为您提供了能够使用这两种语言学习和实现数据科学任务的机会。

b. 这些专业化涵盖了相当深度的、以职业为导向的课程,将帮助您发展所需的技能,使您能够应对现实世界的数据科学挑战。你会学到 Python、R、统计学&概率、数据处理、数据转换、数据工程、数据可视化、机器学习、模型建立、模型测试与评估、应用等方面的技能。

c. 这些专业由具有不同背景的数据科学领域的专家教授,如信息系统、生物统计学、计算科学与工程、系统与工业工程、计算机科学和商业分析。这为你提供了一个学习各种方法的好机会。比如 HarvardX 专业证书数据科学专业就是 P rof 教的。Rafael Irizarry 是哈佛大学的生物统计学教授,所以他的课程非常丰富。与此同时,乔治亚理工学院的系统和工业工程教授 Joel Sokol 教授正在讲授 Georgia TechXAnalytics:Essential Tools and Methods****,因此他深入研究了数据科学在航空、医疗保健、体育、能源部门、人力资源管理等领域的大量应用。

2。从教科书中学习

从教科书中学习提供了比你从在线课程中获得的更精炼和更深入的知识。这本书对数据科学和机器学习提供了很好的介绍,代码包括:“Python 机器学习”,作者 Sebastian Raschka 。作者以一种非常容易理解的方式解释了机器学习的基本概念。此外,代码也包括在内,因此您实际上可以使用提供的代码来练习和构建您自己的模型。我个人认为这本书在我作为数据科学家的旅程中非常有用。我会向任何数据科学爱好者推荐这本书。你所需要的是基本的线性代数和编程技能,以便能够理解这本书。还有许多其他优秀的数据科学教科书,如韦斯·麦金尼的《 Python for Data Analysis 》,库恩·约翰逊的《应用预测建模》,伊恩·h·威滕的《数据挖掘:实用的机器学习工具和技术》,艾贝·弗兰克&马克·a·霍尔的《数据挖掘:实用的机器学习工具和技术》等等。

3.中等

Medium 现在被认为是增长最快的数据科学学习平台之一。如果您有兴趣使用该平台进行数据科学自学,第一步将是创建一个中型帐户。您可以创建一个免费帐户或会员帐户。对于免费帐户,每月可以访问的会员文章数量是有限制的。会员账户需要 5 美元或 50 美元/年的月订阅费。从这里了解更多关于成为中等会员的信息:【https://medium.com/membership】。有了会员帐号,你将可以无限制地访问媒体文章和出版物。

媒体上排名前两位的数据科学出版物是面向数据科学的和面向人工智能的。每天都有新的文章发表在 medium 上,涵盖数据科学、机器学习、数据可视化、编程、人工智能等主题。使用 medium 网站上的搜索工具,您可以访问大量文章,这些文章涵盖了从基础到高级概念的各种数据科学主题。****

总之,我们已经讨论了数据科学自学的 3 个重要资源。根据个人背景的不同,学习数据科学基础知识的旅程可能会有所不同,但本文中讨论的 3 种资源将帮助数据科学领域的任何新手掌握基础知识。

以下是一些可能对您有用的附加资源:

从事数据科学职业前需要考虑的 10 个问题

机器学习必备的数学技能

数据科学 101 —包含 R 和 Python 代码的中型平台短期课程

人工智能研究即将遇到麻烦的 3 个迹象

原文:https://towardsdatascience.com/3-signs-that-ai-research-is-about-to-hit-trouble-cb3b29d63d40?source=collection_archive---------17-----------------------

Source: Florent Darrault

尽管取得了一些令人印象深刻的成就,以及对未来令人窒息的预测,但感觉人工智能的世界可能有些不对劲。不,这不是另一个关于“我们新的硅胶大师”的帖子。事实上,让我夜不能寐的恰恰相反:

如果你认为人工智能研究的功能是制造智能机器,那么你认为“智能”和“解决问题的能力”是一回事也是情有可原的。软的东西:善良、爱、同情、直觉;可以说是定义真正智力的东西,当然也是让我们保持诚实的东西,并没有得到太多的关注。至少目前,他们在“太难”的篮子里。

我一直认为语言理解领域可以为我们提供两个世界之间的桥梁:完整情感景观的一小部分,但具有有形的意义单元。看看他们遇到的麻烦就知道了。

1.一切都变得太大了

几年来,IBM 一直在享受“沃森”的成功,他们的问答超级计算机赢得了著名的“危险!”2011 年。令人印象深刻,是的,但是你有没有想过这个东西的大小?给你个提示:它放不进你的口袋。

当时,“沃森”实际上是一个由 90 台服务器组成的集群,每台服务器都有 8 个并行运行 4 个线程的内核和 16tb 的内存(是的,内存)。对于外行人来说,这大约是 360 台高规格笔记本电脑和大量额外内存的组合。它也没有运行 Android:专门的硬件必须为它的任务专门编程——在这种情况下,是一个智力竞赛节目。它也有一间卧室那么大。

的确,从那时起,IBM 已经做出了重大改进。沃森现在可以放在你冰箱的底部。但真正的问题是:经过这么多年的研究和数不清的数百万美元,它仍然只做一件事

Jameson Toole 的关于这一点的伟大媒体文章确实让我明白了:就语言理解而言,我们已经到达了收益递减曲线的平坦部分。诚然,正如他所说,改进和效率是可以实现的,但就你和我而言,这些仍然只是为你找到餐馆(如果你幸运的话)或解决简单理解难题(如“谁对谁做了什么”)的机器。

这和我们人类使用语言的方式之间的鸿沟是巨大的。我们真的想象增加更多内核、更多输入、更多层、更多数据和更多能力(让环境见鬼去吧!)就行了?即使我们能做到,如果这项技术被限制在谷歌或 IBM 的服务器机房里,我们怎么能让它变得有用呢?我们一定遗漏了什么。

2.不再有摩尔定律

你可能会认为解决尺寸问题的办法就是等一等,直到我们有了更大、更快的芯片。几年前,你可能是对的。摩尔定律表明,计算能力(以每个芯片上的晶体管数量来衡量)每两年就会翻一番,但是证据是它不再有效。低于一定的尺寸限制,在晶片上安装足够的晶体管变得非常困难,而且没有利润。

Moore’s Second Law — the cost to produce smaller transistors also increases exponentially Source: IBS

别忘了,要让人工智能系统赚钱,它们需要广泛可用。是的,GPU 和 TPUs、3D 堆叠等专业技术将允许大玩家继续发展一段时间,但从现在起几年后,这个问题[将开始向便携式设备市场渗透](http://impact of moores law slowing on portable device market),这是赚大钱的地方。

事实上,最大的影响可能是摩尔定律曾经对行业产生的那种“心跳”功能——在两年周期内监管软件、硬件、零售和设计行业的创新。如果开发人员不确定他们需要的硬件是否符合规格,他们可能不太愿意冒险。

3.我们不理解我们试图解决的问题

问自己一个问题:“为什么有些笑话很好笑?”。我也不知道。它有一些规则:时机等等,但真的,就像在晚上画风景一样,喜剧可能有点黑暗的艺术。

假设你想建立一个喜剧人工智能。在当前的范式中,你可能会通过建立几个神经网络来实现这一点,在一周左右的时间里,向它们投掷数十亿人类标记的有趣和不有趣的语句,然后将它们配对成一个“生成对抗网络”。在超级计算机上再训练一周左右,它甚至可能会工作(类似)。

问题是,即使它知道,它也只能从你给它的数据中学习。喂它巨蟒,它会跟你谈论灌木林和死鹦鹉,给它看几集《宋飞正传》,你会得到虚无主义和存在主义焦虑。否则就完全不灵活了。如果你想让它适应一个新的环境、背景或受众,你就必须重新开始。

我们也不要忘记,幽默只是我们使用语言的一个方面。如果你想要一个“有同情心”的机器人,它也会面临类似的限制。一次两个?好吧,目前来看,这是疯狂的。

然而,作为人类,我们自然会这样做。我们似乎有一种在这种或那种情况下如何使用语言的本能,却不知道如何使用或为什么使用。我的猜测是,这不仅仅是我们以前见过的事情的重复,而是存在某种真正的自发创造,但深度神经网络的架构不允许这样做。

感觉很重要

在目前的形式下,人工智能对于各种事情来说都是一个非常强大的工具,但语言的使用——尤其是情感语言——不是其中之一。

情感,比如同情和善良,非常重要。他们是将我们凝聚在一起的粘合剂。随着强大的思维机器变得越来越常见,并且更经常地负责决策,我们真的希望它们没有感觉吗?

事实上,事情的现状,这是一个学术问题。我们拥有的最先进的技术还远远不够,而且已经遇到了问题。

我们可能会在这里呆一会儿。

3 个简单的 Python 效率技巧

原文:https://towardsdatascience.com/3-simple-python-efficiency-tips-f7c35b511503?source=collection_archive---------23-----------------------

在这篇文章中,我将分享 3 个 Python 技巧,它们可能会给你的代码带来性能提升。

我们开始吧!

source

1.在实体记录中搜索

考虑这样一个场景,我们有一个记录列表,我们需要将 id 的子集与这些寄存器匹配。例如:

records = [
  {"id": 1, "name": "John", "surname": "Doe", "country": "ES"},
  {"id": 2, "name": "Alice", "surname": "Bond", "country": "IT"},
  ...
  {"id": 1000, "name": "Foo", "surname": "Bar", "country": "IN"}
]ids = [1, 2, 50, 70, 87]

我们需要获得由特定 id 识别的不同人的信息。

解决这个问题的一个简单方法是使用嵌套循环:

for id in ids:
  for r in records:
    if id == r[’id’]:
      print(r)

考虑到“records”有 n 个元素,“ids”有 m 个元素,我们正在处理一个 O(m ^ n)时间复杂度的解决方案。此外,假设“ids”表示“记录”中可用的 IDs 的子集(即,m <= n),我们获得 O(n)的最坏情况时间复杂度。

使用以下方法,可以将该解决方案的时间复杂度大大提高到 O(n) + O(m) = O(n):

records = {r['id']: r for r in records}
for id in ids:
  print(records.get(id))

所提出的解决方案对记录列表进行一次迭代,以便创建一个字典,使我们能够在 O(1)时间内检索数据。

2.成员资格检查

当我们想要检查一个元素是否属于一个列表时,另一种常见的情况就会出现。例如,我们想检查 70 是否包含在“ids”中。在 Python 中解决这一问题的常用方法如下:

70 in ids

这种解决方案简洁美观,但效率不高。这个解决方案的时间复杂度是 O(n ),因为它在列表上进行线性搜索。通过将列表转换为集合,我们可以实现 O(1)时间复杂度的成员检查。

sids = set(ids)
70 in sids

请注意,将列表转换为集合需要 O(n)时间,因此如果您只需要执行一次成员资格检查,您可能不会从中受益。但是,如果您需要对多个元素执行这个操作,那么考虑到每个后续操作将花费 O(1)时间,您将获得立竿见影的效果。

3.改进计数器回路

我们通常会发现的第三种情况是需要计算记录列表中某个字段出现的次数。例如,我们可以获取第一个性能提示的记录列表,并尝试计算每个国家的人数。

最直观的方法如下所示:

c = {}
for r in records:
  if r['country'] not in c: c[r['country']] = 0
  c[r['country']] += 1

总而言之,我们将检查当前国家是否已经包含在计数字典中,如果没有,就包含它并用 0 初始化它。然后,我们总是将当前国家的计数器加 1。

但是,请注意,对于每个国家,if 语句只被评估为 True 一次。换句话说,这种情况会一直被评估,并且通常没有任何用处。因此,我们可以采用以下策略:

c = {}
for r in records:
  try:
    c[r['country']] += 1
  except KeyError:
    c[r['country']] = 1

在第二种方法中,我们试图将国家计数器直接加 1。但是,如果这是我们第一次发现这样的国家,就会产生一个 KeyError,因为它不在计数器字典中,执行 except 块的指令。在这种情况下,我们优先考虑最常见的情况,减少执行指令的总数。

用熊猫处理大量数据的 3 种简单方法

原文:https://towardsdatascience.com/3-simple-ways-to-handle-large-data-with-pandas-d9164a3c02c1?source=collection_archive---------4-----------------------

熊猫喜欢吃数据

Pandas love eating data

想获得灵感?快来加入我的 超级行情快讯 。😎

熊猫已经成为最受欢迎的数据科学图书馆之一。它易于使用,文档非常棒,功能非常强大。

然而,无论使用什么库,大型数据集总是带来额外的挑战,需要小心处理。

你开始遇到硬件障碍,因为你没有足够的内存来保存所有的数据。企业公司存储高达数百甚至数千 GB 的数据集。

即使你碰巧买了一台有足够内存来存储所有数据的机器,只是把它读入内存也是非常慢的。

但是熊猫图书馆将再次帮助我们。本文将讨论 3 种可以用来减少大型数据集的内存占用和读入时间的技术。我将这些技术用于大小超过 100GB 的数据集,将它们压缩到具有 64 GB(有时是 32GB)RAM 的机器上。

让我们检查一下!

(1)将你的数据分块

CSV 格式是一种非常方便的数据存储方式,既易于书写,又易于阅读。此外,还有一个很好的 pandas 函数read_csv()用于加载以 CSV 格式存储的数据。

但是当你的 CSV 大到内存不足的时候会发生什么呢?

有一个非常简单的熊猫技巧来解决这个问题!我们不会试图一次性处理所有数据,而是将数据分成几部分来处理。通常,这些块被称为

一个块只是我们数据集的一部分。我们可以随心所欲地将这一大块变大或变小。这取决于我们有多少内存。

然后,该过程如下进行:

  1. 整体阅读
  2. 处理大块
  3. 保存块的结果
  4. 重复步骤 1 到 3,直到我们得到所有的块结果
  5. 合并块结果

我们可以使用一个叫做 chunksizeread_csv()函数的便利变量来执行上述所有步骤。chunksize 指的是熊猫一次将读取多少 CSV 行。这当然取决于你有多少内存和每行有多大。

如果我们认为我们的数据有一个非常容易处理的分布,比如高斯分布,那么我们可以一次对一个数据块进行我们想要的处理和可视化,而不会损失太多的准确性。

如果我们的分布有点像泊松分布那样复杂,那么最好在行进之前过滤每个块并将所有的小块放在一起。大多数情况下,您最终会删除许多不相关的列或缺少值的行。我们可以对每个数据块都这样做,使它们变得更小,然后将它们放在一起,在最终的数据帧上执行我们的数据分析。

下面的代码执行所有这些步骤。

(2)丢弃数据

有时,我们会马上知道我们要分析数据集的哪些列。事实上,经常会出现这样的情况,有几个或几个我们并不关心的列,如姓名、账号等。

在读入数据之前直接跳过列可以节省大量内存。Pandas 允许我们指定想要阅读的栏目:

丢弃包含无用信息的列将是您最大的内存节省之一。

我们可以做的另一件事是过滤掉任何缺少值或 NA 值的行。使用dropna()功能最简单:

有几个真正有用的变量我们可以传递给dropna():

  • 如何:这将允许您指定“any”(如果某一行的任何列是 NA,则删除该行)或“all”(仅当某一行的所有列都是 NA 时,才删除该行)
  • thresh: 设置一个阈值,确定一行需要删除多少 NA 值
  • subset: 选择检查 NA 值时要考虑的列的子集

您可以使用这些参数,尤其是 threshsubset 来具体确定哪些行将被删除。

Pandas 没有像对列那样在读取时实现这一点的方法,但是我们可以像上面那样在每个块上实现这一点。

(3)为每一列设置具体的数据类型

对于许多初学数据的科学家来说,数据类型并没有被考虑太多。但是一旦开始处理非常大的数据集,处理数据类型就变得至关重要。

标准的做法是读入数据帧,然后根据需要转换列的数据类型。但是对于一个大的数据集,我们真的需要注意内存空间。

在我们的 CSV 中可能会有一些列,比如浮点数,它们会占据比实际需要更多的空间。例如,如果我们下载了一个预测股票价格的数据集,我们的价格可能会保存为 32 位浮点!

但是我们真的需要 32 浮动吗?大多数时候,股票是以两位小数指定的价格买入的。即使我们想做到真正的精确,float16 已经足够了。

因此,我们不是用列的原始数据类型读入数据集,而是指定我们希望 pandas 在我们的列中使用的数据类型。这样,我们就不会用完超过实际需要的内存。

这很容易通过使用read_csv()函数中的 dtype 参数来完成。我们可以指定一个字典,其中每个键都是数据集中的一列,每个值都是我们希望使用该键的数据类型。

这里有一个熊猫的例子:

我们的教程到此结束!希望这三个建议能帮你节省很多时间和内存!

喜欢学习?

在 twitter 上关注我,我会在那里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上与我联系!

用简单的英语讲述人工智能项目的 3 个阶段

原文:https://towardsdatascience.com/3-stages-of-an-ai-project-in-plain-english-a4975c007cb5?source=collection_archive---------27-----------------------

本文讨论了人工智能项目的技术阶段。它展示了一个可行的过程来建立成功的团队,包括雇佣谁以及何时雇佣。它假设没有先验知识,并旨在尽可能用简单的英语编写。

在你开始第一步之前,你应该确保你的组织追求人工智能是值得的。听到你需要使用人工智能来保持相关性对于最初的动机来说是好的,但它永远不应该成为最终的理由。

相反,考虑定义用例,陈述它解决的问题,估计潜在的 ROI,并评估对人才和资源的访问。成功还取决于组织的认同创造合适的环境。

如果你决定前进,有 3 个主要阶段。这些阶段按编号顺序出现,尽管实际上各阶段之间有重叠。你甚至可能需要回到之前完成的步骤来做得更好。

现在让我们想象一下,我们正在一起启动一个人工智能项目。

1.获得高质量的数据

我们从收集一种珍贵的资源开始:数据。

获得高质量的数据是我们整个项目中最重要的一步。而且往往是最被忽视的。

如果我们的组织还没有数据,我们开始收集一些。数据来源包括互联网、我们的用户和传感器。收集通常从一次性事件开始,随着时间的推移,它会定期完成。

一旦我们得到一些数据,很可能就是垃圾。关于人工智能的一个常见说法是“垃圾进来,垃圾出去。”我们的结果受到数据质量的限制。

来自现实世界的数据是杂乱的。它是不完整的。里面有错误。它经常被复制。在继续前进之前,我们必须处理好这些问题。我们首先要把垃圾数据清理成高质量的数据。

在这个阶段,你需要像数据分析师 T1 或数据科学家 T3 这样的人。如果您想定期收集数据,可以添加一名软件工程师和一名数据库管理员。

2.进行实验

我们永远不知道什么会起作用,直到它起作用。

我们可以猜测特定类型的人工智能将为我们的数据工作,然后它未能提供我们想要的结果。我们可以猜测,不同的类型不会工作得很好,它的表现超出了我们最疯狂的梦想。

关键是理论和直觉只能到此为止。我们需要亲自动手看看实际上什么是有效的。幸运的是,很容易在几个小时到几天内尝试许多不同的类型。

当前 best 的表现确实有限。有时候目前的最好还不够好,无法前进。在开始第三步的繁重工作之前,最好先弄清楚这一点。将此阶段视为消除投资风险。

随着时间的推移,随着研究人员发明新类型的人工智能,结果自然会变得更好。一旦我们得到了很好的结果,我们就准备进入下一步。

在这个阶段,我们需要像机器学习工程师或数据科学家这样的人。理想情况下,这应该是负责第一步的同一个人,因为在第一步和第二步之间有来回。通过进一步清理我们的数据,我们可能会获得更好的结果。

3.为现实世界而建

我们通过将有用的东西投入现实世界来创造价值。

到目前为止,我们的实验是一次性的。这种方法适用于快速测试,但不适用于多次重复。我们通常希望我们的人工智能定期重复一些任务。

解决方案是建立能够处理大碰撞、意外错误和恶意攻击的基础设施。这个过程是严肃的工作。我们现在肯定需要一个团队,而前两步可能由个人完成

首先要考虑的应该是防御攻击者。从 AI 中创造价值的组织通常拥有敏感数据。一次数据泄露可能毁掉一个较小的组织,或者永久损害其客户的信任。这是一场持续的战斗:随着攻击者学习更多的攻击方式,防御者也必须学习更多的防御方式。因此,防御措施必须由像安全工程师或安全分析师这样的人定期更新。

如果说网络安全构成了防御,那么管道就是基础设施的主干。它们像水管一样把数据从一个地方带到另一个地方。偶尔,管道可能会开始泄漏或堵塞。我们需要数据工程师来确保数据通过管道顺畅流动。

我们还需要一个地方来存储所有这些通过管道传输的数据。我们可能想要对旧数据进行新的实验,或者我们可能想要定期收集新数据。数据库提供了一种存储数据以备将来使用的可靠方法。数据库管理员确保所有的数据都被计算在内并被正确存储。

另一个主要部分是把人工智能放在可以使用的地方。这可能是把它放在一个云服务器上,可以通过像 Chrome 这样的互联网浏览器使用。或者它可能位于像 Microsoft Word 这样安装的软件应用程序中。这取决于用例。网络开发人员最适合前者,软件工程师最适合后者。

最后,我们需要一种方法来查看人工智能的结果。想象一下像网站、仪表板或应用程序这样的媒介。一个 UX 设计师确保产品让用户感到愉悦,不管是什么媒介。网站和仪表盘可以使用前端开发者。应用需要移动开发者。

请记住,随着时间的推移,所有基础设施都需要维护。就像汽车随着时间的推移会坏掉而不修理一样,人工智能基础设施也是如此。前期维护投资可保持项目平稳运行,最大限度地减少中断。

我们可能会找到一个身兼数职的候选人,至少在构建基础设施的初期是这样。例如,软件工程师通常可以担任数据库管理员。随着项目的成熟,引入专门维护数据库的人可能是有意义的。

摘要

首先,确保你的组织值得追求人工智能。如果你准备向前迈进,请评估你目前所处的阶段:

  1. 尽可能多地收集高质量的数据
  2. 进行实验,看看什么样的有效,什么样的无效
  3. 通过基础设施将有用的东西投入现实世界

每个阶段需要不同的专业知识。根据你的组织目前所处的阶段进行适当的招聘。

准备好维护基础设施,就像维护一辆爱车一样。定期检查,投资维修,防止以后出现更昂贵的问题。

用熊猫清理数据集的 3 个步骤

原文:https://towardsdatascience.com/3-steps-to-a-clean-dataset-with-pandas-2b80ef0c81ae?source=collection_archive---------14-----------------------

想获得灵感?快来加入我的 超级行情快讯 。😎

数据科学不全是花哨的图表!这是一套工具,我们用它来清理、探索和模拟数据,以便提取现实世界中有意义的信息。获取真实世界的信息首先需要真实世界的数据——真实世界的数据是肮脏的。

想想大公司和小公司会如何收集他们的数据。这通常是由非专家完成的;有时是公司的某个人,但通常是公司产品用户的客户。他们将通过用户界面输入数据,其中许多字段是可选的。用户也可以用许多不同的风格和格式输入他们的数据。所有这些都会导致脏数据!

在我们可以通过机器学习模型运行我们的数据之前,我们需要稍微清理一下。以下是我们清理数据集需要采取的 3 个最关键的步骤。

(1)删除特征

当经历我们的数据清理过程时,最好以由粗到细的方式执行我们所有的清理。从最突出的问题开始,深入到本质细节。基于这种方法,我们要做的第一件事是删除任何无关或不相关的功能。

对数据集进行快速浏览,以确定哪些要素与您想要预测的输出不高度相关。您可以通过几种方式来实现这一点:

  • 对特征变量进行相关性分析
  • 检查每个特征变量缺少多少行。如果一个变量丢失了它的 90%的数据点,那么把它们一起丢掉可能是明智的
  • 考虑变量本身的性质。从实用的角度来看,使用这个特征变量真的有用吗?只有当你非常确定它不会有帮助时,才放弃它

以下是如何在熊猫身上做这些事情:

(2)处理缺失值

我们已经删除了丢失值百分比很高的特征变量。现在我们想处理那些我们确实需要但也有缺失值的特征变量。我们还有几个选择:

  • 用任意值填充缺失的行
  • 用从数据统计中计算出的值填充缺失的行
  • 忽略缺失的行

如果你知道一个好的缺省值应该是多少,那么第一种方法是可行的。但是如果你能从某种统计分析中计算出一个值,这通常是非常可取的,因为它至少有一些数据支持。如果我们有足够大的数据集,可以放弃一些行,那么可以选择最后一种方法。但是,在您这样做之前,请务必快速浏览一下数据,以确保这些数据点不是非常重要。

(3)格式化数据

收集数据集时,用户通常会以纯文本的形式输入数据。这可能导致数据格式复杂化。比如以加州的州名进入有很多种方式:CA,C.A,California,Cali 这些都需要标准化成一个统一的格式。此外,可能存在这样的情况,即数据是连续的,而我们希望它是离散的,反之亦然。

  • 标准化数据格式,包括缩写、大写和风格
  • 离散化连续数据,反之亦然

让我们在熊猫身上这样做:

喜欢学习?

在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!

构建数据科学产品组合的 3 个步骤

原文:https://towardsdatascience.com/3-steps-to-build-a-data-science-portfolio-1c5dc59854f?source=collection_archive---------10-----------------------

最终得到你梦想中的工作

几个月前,我写了一篇文章— 如何进入数据科学?回答大多数数据科学初学者面临的一些最常见的问题和挑战。

在文章中,我简要地谈到了 什么样的 投资组合可以帮助你在数据科学或机器学习领域获得第一份工作。但是我没有详细介绍 如何 首先构建数据科学投资组合。

快进到现在,在文章发表后,我开始收到许多有抱负的数据科学家的消息,他们都有共同的目标— 成为数据科学家(或至少进入数据科学相关领域),并带着同一个问题— 如何建立数据科学组合?

Messages received from LinkedIn

我曾经是一个没有工作的人,除了一张写着三个闪亮的字的纸什么都没有——科学学士。我曾经是一个漫无目的的千禧一代,对我的职业和生活毫无方向感,尽管外面有大量的机会,似乎在等待我去发现。

所以,我无法告诉你这些留言让我产生了多大的共鸣。我感受到了获得实习机会的艰难;我觉得让雇主注意到你的个人资料是一个挑战;我对构建您的数据科学投资组合感到沮丧,因为您不知道从哪里开始。

我们都知道,单凭简历不足以让你在数据科学领域找到工作。我们也知道建立数据科学组合非常重要,尤其是在我们的求职过程中。

现在的问题是:怎么做?如何建立数据科学投资组合?

这也正是为什么这篇文章将我之前在学习过程中的所有经验浓缩为 3 个最重要的步骤,为您构建数据科学组合。

—注释—

就数据科学而言,我们在这里对组合的定义是指你的数据科学技能的公开证明(由 DataCamp 首席数据科学家大卫·罗宾逊在模式分析博客上定义)。

话虽如此,但本文不会谈论如何构建你的简历。我认为简历不是一个作品集,而是作品集的一部分。

在接下来的部分,我们将直接进入我个人使用的核心 3 个步骤(仍在进行中!)在尽可能短的时间内建立我的数据科学组合。这三个步骤是我曾经使用过的(并在此过程中进行了微调)对我有效的方法,我相信它们对你也有效。

在这篇文章的最后,我希望让你更好地理解如何建立你的数据科学投资组合,并指导你最终在数据科学领域找到理想的工作。

所以…让我们开始吧!

构建数据科学产品组合的 3 个步骤

(Source)

1。数据科学实习(或同等学历)

是的。数据科学相关的实习。

我们说的不仅仅是数据科学家实习,还包括数据分析师、数据工程师、商业智能或分析师、研究工程师等相关实习。

重要的一点是:只要实习要求你做某种形式的数据收集、分析、模型构建或可视化,学到的技能就可以高度转移到市场上的任何数据科学工作中。

因此,获得数据科学相关的实习是第一步。但是为什么呢?

因为雇主往往会寻找有一些数据科学工作经验的学生或应届毕业生。最重要的是,他们想雇佣一个只需很少的培训时间就能开始实际工作的人,因为在企业界,时间就是金钱。

此外,有一个数据科学实习是对你的投资组合和简历的一个很大的提升。不管你的学术背景如何,有这个实习机会表明你是 认真的 并且对此充满热情。这表明你不仅仅是另一个有抱负的数据科学家,他说,“我对数据科学非常有热情,并希望了解更多。”

不要光说不练。表现出来。

如果你读过我的第一篇文章——我从物理到数据科学的旅程,我谈到了我是如何开始数据科学实习的。在完成我的第一次研究实习后,我寻找了一份数据分析实习,并在试图应对我的学业的同时做了一份兼职实习生。

这一时期并不容易。我甚至更进一步,提前一个学期完成了学业,这样我就可以继续实习,成为全职数据科学家实习生。

我的朋友和家人完全糊涂了。他们不知道为什么我决定毕业后去实习而不是全职工作。因为我清楚地知道我想要什么,所以我的决定是不可动摇的。在我内心深处,我选择了这条不平凡的道路,因为我相信我的长期目标,而不是追逐短期的满足。

我为什么要和你分享这个故事?

在追求目标的过程中,你会面临许多质疑你的激情、能力和目标的内在和外在的怀疑和挑战。期待它,拥抱它,做任何你认为正确的事。

做正确的事总是正确的

——加里·维纳查克

2。项目

获得数据科学实习是第一步。但是,如果您刚刚起步,对数据科学工作一无所知,该怎么办?当你没有机会获得经验时,你是如何获得经验的?

答案是通过做项目。我认为有两种类型的项目——学校项目和个人项目。我肯定会推荐后者。

让我们对自己坦诚一会儿。想想目前竞争激烈的就业市场。在求职者的海洋中,我们只是另一个有共同目标但有不同经历的候选人。

问题归结为:在被选中参加面试之前,我们如何在众多候选人中脱颖而出?换句话说,我们怎么能成为雇主容易接收的信号而不是噪音呢?

为什么是个人项目——而不是学校项目

这就是个人项目的力量发挥作用的地方。

我不是说学校项目没用。学校项目只能在一定程度上展示你的能力,并不足以让雇主相信你有足够的激情和能力。

你看。学校项目通常在引导的环境中完成,并分配给学生进行团队合作。问题通常都有很好的框架,最后通常会给出解决方案。这绝对没有错。学生当然可以从这些项目中学到一些东西。

如果你在做别人都在做的事情,你就会得到别人都得到的东西

这里的问题是:学校项目无法展示您对数据科学的热情,因为您只是做了分配给您的事情。学校项目不能展示你的全部能力,因为雇主不能把你和同一个团队中的同龄人区分开来。

另一方面,个人项目在课程之外完成。有你的副业——完全由你完成的副业项目。

个人项目能够展示你在数据科学领域的激情和能力,以及在学校课程之外的经验。现在你与众不同了——你是一个言行一致的人;你是这样一个人,他会付出更多的努力,做你喜欢做的事,并且不惜一切代价。

你能做什么个人项目?

Kaggle & Hackathon

参加 Kaggle 比赛。这可以说是各种数据科学项目和竞赛最受欢迎的平台。Kaggle 上的社区充满活力,愿意互相帮助和学习。

如果你是数据科学的初学者, Kaggle Learn 可以指导你一些通用编程语言(Python & R)、数据分析和可视化工具以及机器学习。

你不仅会从 Kaggle 比赛中学到很多东西,你在比赛中的 Kaggle 个人资料和排名也可以展示你在数据分析和模型开发以及使用不同机器学习技术进行优化方面的熟练程度。同样的事情也适用于其他公司不时组织的黑客马拉松。

然而,这里有一个误解。光是 Kaggle 和黑客马拉松还不足以让你成为一名数据科学家。他们只能增加经验,扩大你的投资组合,以及补充其他项目。

现实世界的数据是一团乱麻。你在竞赛中表现出色只是整个数据科学工作流程的一部分。这就是为什么下一个个人项目很重要——找到并做你自己的项目。

找到并做自己的项目

找到你关心和热爱的事情。确定一个你想解决的问题。收集数据(开源、从不同来源自行收集的数据,或通过网络搜集)。将您的知识应用于数据,并在旅途中学习。

我最喜欢的一篇文章——冷启动问题:如何建立你的机器学习组合。在文章中,作者谈到了两个候选人如何从收集数据开始全力以赴(这花费了他们几天到几周的时间!),做数据清洗到构建一些很酷的机器学习模型来解决有趣的问题。看看这篇文章,你就会知道为什么我认为他们的方法是疯狂的,但对雇主来说非常特别和引人注目。不用说,其中一名候选人吸引了雇主的注意,其他候选人甚至在完成项目之前就被录用了。

志愿免费帮助非政府组织或公司

这只是我建立投资组合的方法之一。这里的主要目的是:建立你的投资组合,不管它是有偿还是无偿的。

有时候我们需要的只是一个机会。一个学习和帮助其他非政府组织和公司同时使用数据解决问题的机会。

好处是双重的——你可以学习和建立你的投资组合,同时增加你的价值来为组织解决问题。谁知道呢?项目完成后,你可能会被考虑成为全职员工。

3。社交媒体

想象一下,现在你有一个坚实的数据科学实习和参与各种项目的投资组合。

在经历了无数小时的实习和兼职项目后,你知道你已经准备好了知识和经验,这可能会让你在数据科学领域找到一份工作。但是除了一张纸——简历,你没有地方展示你的能力和投资组合。

我不想这么说,但现实是:一份简历只能让你在很少或根本没有社交活动的情况下走这么远。如今,申请工作的典型方式是通过在线求职门户网站(【求职街】、玻璃门、 事实上等)。)——同样是通过社交媒体平台。

因此,拥有你的在线个人资料实际上是你的投资组合的一部分,可以引起招聘经理的注意。

现在你可能会有一个问题:如果每个人都在社交媒体上有自己的在线投资组合,那么是什么让你脱颖而出?我的回答——个人品牌

个人品牌不是仅仅为了打动招聘经理或雇主而伪造自己的品牌和经历。这不是个人品牌的意义所在。

个人品牌是关于做你自己——真实的自己,带着你的信念、你自己的故事和经验,在你的领域展示专业知识和权威。

换句话说,你需要知道自己热爱什么,找到自己的定位。你需要知道如何定位自己,如何利用社交媒体营销你的个人品牌,并让它为你说话。你需要为他人提供价值,同时创造和分享你所热爱的东西。

就我个人而言,我有三个在线平台来发展我的个人品牌和社交存在——Medium、LinkedIn 和 GitHub——这对我的数据科学职业生涯有很大帮助。再次,我分享我所做的和对我有用的,希望对你也一样。

你可能在 Instagram、Twitter 或 Pinterest 上很活跃,正在那里建立自己的社交关系。只要你以正确的方式使用社交媒体,这完全没问题。

中等

如果你一直在关注我的工作,我写了关于为什么我写数据科学。在最后一部分我提到了一个词——机遇

这与个人品牌密切相关。个人品牌带来机遇。就这么简单。

通过在媒体上写作,我已经能够通过分享我的经验和指导数据科学领域有抱负的数据科学家来接触许多人的生活。通过在媒体上写作,各种各样的出版物、杂志和公司找我为他们写作。通过在 Medium 上写作,我已经能够与众多数据科学和专业人士中的杰出人士建立联系,并向他们学习。

日复一日,周复一周,月复一月……我不断地写作,通过文字建立我的作品集。在某个时候,我几乎要放弃了,因为我觉得我没有什么可以分享的。但是我坚持不懈。我尽可能地坚持写作。

因为我相信我们每个人都有独特的声音可以分享,没有人比我们自己更了解我们的故事。所以,当你下次有疑问时,保持专注,知道你为什么要做你正在做的事情。重新获得动力和动力,并保持一致。

每当你不知道该写些什么的时候,就看看大卫·罗宾逊的建议。

这里有一些你可以写的话题:

  1. 记录你的学习历程,分享你的错误和收获
  2. 用更简单的方式向他人解释技术概念
  3. 获取一些开源数据并进行分析。然后用吸引人的视觉效果和学习之旅传达您的结果
  4. 您是否面临过某些常见的挑战?分享挑战是什么,以及你是如何解决的。因为如果你遇到这些困难,其他初学者也可能面临同样的情况

写作是关于你的思考过程。它可以训练和提高你向他人解释的沟通技巧,这是在数据科学领域取得成功的最重要的技巧之一。

商务化人际关系网

如果我们看一下基于 2018 年 12 月数据的LinkedIn 职位统计,有 94%的招聘人员使用 LinkedIn 审查候选人,48%的招聘人员使用 LinkedIn 进行社交拓展。

那么这些数据告诉了我们什么呢?LinkedIn 上有 5 亿用户,这是巨大的。

LinkedIn 不再仅仅是一个求职平台。事实上,远不止如此。如果你走出去,在 LinkedIn 上建立自己的投资组合,机会是非常多的。分享您的知识,并从 LinkedIn 上紧密联系的数据科学社区中学习。

随着 LinkedIn 上招聘人员和猎头的增多,你的分享会越来越受欢迎,你的个人资料会在你不知不觉中被他们注意到。这就是为什么在社交媒体上建立投资组合如此重要,但它仍然是大多数求职者低估的渠道。

现在,我正在 LinkedIn 上推动共享学习环境的民主化,在世界各地有抱负的数据科学家、数据科学家和其他数据专业人士中发起各种数据科学话题的讨论。我真的相信教育就是分享你学到的东西,并通过有意义的讨论和对话向他人学习。

如果你没有 LinkedIn 个人资料,我强烈建议你创建一个。如果你已经有了 LinkedIn 个人资料,来 LinkedIn 上和我一起参与数据科学社区。相信我,你会被这个充满活力和乐于助人的社区所震撼。

GitHub

GitHub 简介是展示您作为数据科学家的能力的有力方式。

学习如何使用 Git,因为这是大多数(如果不是全部)开发人员和数据科学家在现实世界中合作进行项目的方式。理解 git 工作流程并学习正常的 git 命令(提交、推送和拉取请求等)。).

花些时间学习如何使用 README.md 在 GitHub 上记录你的项目。这使得你的代码对其他人来说更具可复制性和解释性,至少对招聘经理来说是这样。此外,一个在 GitHub 上有代码的记录良好的项目表明,你能够与公众交流结果,你能够与他人合作。

乍一看,这对你来说似乎微不足道。但是当你将来与他人合作或试图与其他利益相关者交流结果时,你会开始看到它的重要性。此外,通过阅读你在 GitHub 上的文档,招聘经理将能够了解你如何处理和解决问题的思维过程。

最后的想法

Biking with my friend Darshan in Interlaken, Switzerland

唷!这是继我第一篇最长的文章——如何进入数据科学之后的又一篇长文。

如果你一路走到这一步。感谢您的阅读。

我一直想写这篇文章,因为我觉得这对试图建立数据科学组合的其他人会有所帮助。我希望通过分享我的经验和我个人用来建立投资组合的步骤,能够帮助你建立自己的投资组合,并最终获得拥有大量机会的梦想工作。

请在下面留下您的评论,让我知道这篇文章是否对您有用。

一如既往,如果您有任何问题,请随时在下面留下您的反馈,或者您可以随时通过 LinkedIn 联系我。在那之前,下一篇文章再见!😄

关于作者

阿德蒙德·李 目前是东南亚排名第一的商业银行 API 平台 Staq 的联合创始人/首席技术官。

想要获得免费的每周数据科学和创业见解吗?

你可以在 LinkedIn 、 Medium 、 Twitter 、脸书上和他联系。

**** [## 阿德蒙德·李

让每个人都能接触到数据科学。Admond 正在通过先进的社交分析和机器学习,利用可操作的见解帮助公司和数字营销机构实现营销投资回报。

www.admondlee.com](https://www.admondlee.com/)****

保证无经验数据科学工作的 3 个策略

原文:https://towardsdatascience.com/3-strategies-to-guarantee-a-data-science-job-with-no-experience-68d85b345f21?source=collection_archive---------3-----------------------

独家 TDS 采访

TDS 采访了 DoorDash 的 Jeff li,他分享了为没有计算机科学或数学学位的数据科学应用评分的重要资源。

面试官: Haebichan Jung ,数据科学家| TowardsDataScience.com 项目负责人。

受访者:door dash 的数据科学家(机器学习)Jeffrey Li 。

你是如何成为数据科学家的?

我并没有真正来自进入数据科学的传统背景。实际上,我大学毕业后的第一份工作就是从技术咨询开始我的职业生涯。虽然这是一份不错的第一份工作,但我不认为这是一份适合我的长期工作。所以在工作之外,我对快速学习很感兴趣,我尝试了很多不同的技能,我的一个更大的项目是试图通过玩扑克谋生。

我当时的目标是把扑克玩得足够好,以便能够维持我的生活方式。然而,有一次当我玩扑克的时候,我输掉了所有的钱。对我来说,如果我要在一项技能上投入大量金钱或情感能量,我还不如把它投入到一项能为他人创造价值的技能上,而不是像玩扑克那样从别人身上获取价值。所以我想继续走概率统计这条路。因此,我最终从那里进入了数据科学领域。三年后,我现在是 DoorDash 的一名数据科学家。

你是如何从扑克生涯过渡到 DoorDash 的数据科学领域的?

最初,我自学了不少。我自己写了很多代码。我在大学里上过几门统计学课,所以我对线性回归、决策树和随机森林有一些了解。我大概花了六到九个月的时间纯粹学习。

然后,我在一家名为 Dataquest 的初创公司找到了第一份工作,这是一家广告技术公司。我在为我们的营销团队设计课程和做分析。但我想真正发展我的机器学习技能,我认为,根据你进入的公司,将需要机器学习或实验分析。DoorDash 有一个特定的机器学习团队,我最终加入了这个团队。

Jeffrey’s tutorials on Dataquest.io

你在 DoorDash 接什么项目?

在 DoorDash,我们有三个与数据科学相关的不同团队。我们有分析数据科学家,他们专注于实验分析,也专注于构建仪表板和进行支持特定业务的分析。

然后,我们有机器学习工程师,他们正在建立更多的基础设施,进行大量的建模,以及模型的大量生产。我的团队是数据科学机器学习团队,我们位于这两个端点之间的中间。因此,我们正在构建许多专注于业务影响的模型。我们也帮助进行实验分析,也做一些数据工程和商业分析。

Three data science teams at DoorDash

特别是对我来说,我一直在从事一些项目,如推荐系统,增加新功能以向您显示最相关的餐厅,建立管道以将推荐信息纳入我们的电子邮件,以及营销归属和营销细分。我们还建立了一个预测销售的模型。

三个数据团队是否相互协作?

在很大程度上,这取决于你正在做的项目。当我的项目更侧重于工程时,比如建立管道以使事情变得更快,就不需要在业务方面加入一些人。这主要是我和工程团队作为一个工程为重点的项目。

然而,有一些项目,比如新特性的实验分析,我们需要了解它的影响。这将要求我们与工程部门进行更紧密的合作,因为他们将帮助执行实验,还要求我们与业务部门进行更紧密的合作,因为他们希望了解这一新功能将如何影响我们的业务。

所以看起来 DoorDash 的申请者应该非常清楚这些不同的角色,以及他们如何利用自己的优势。

我认为这是利用你认为自己擅长的东西和你拥有的经验的结合。我还是想说,如果你是在实验分析方面非常有经验的人,并且你想在建模方面做得更多,一定要记住这一点。我认为,一般来说,在科技公司,如果你能清楚地说出你想要什么,并利用你想要的创造价值,那么你就可以进入任何角色。

一个例子是,你非常擅长统计和分析实验,但你想做更多的机器学习。最好的方法是,你可以在公司内部找到商业问题,而机器学习是解决这个问题的最好方法。如果你能向你的经理证明这个解决方案将对业务产生重大影响,你的经理很可能会允许你这样做。

door dash 的申请流程一般是怎样的?

因此,与大多数科技公司相比,申请流程并没有太大不同。如果你去我们的职业网站,你可以看到具体的一步一步的过程。我们将与招聘人员进行初次通话。接下来,你会有一个带回家的作业,根据你建立机器学习模型并经历端到端过程的能力进行评分。如果看起来不错,我们会打一个回顾电话,我们会问你几个关于你的技术的问题,并了解你为什么做出某些决定的思维过程。如果看起来不错,你可以来现场,在那里我们会对你的业务、机器学习、编码和价值观进行测试。

在 DoorDash,你自己也有机会参与这个招聘过程吗?

是的,我做了大量的回顾,带回家和回顾电话。根据我在评分带回家的经验,我在市场上看到的大多数数据科学家的最大陷阱或最大弱点是能够将机器学习模型与商业影响联系起来。所以很多非常非常聪明的人建立了这个非常复杂的五层神经网络,它能做出很好的预测,得分很高。但是,当我们深入研究特定模型的业务影响时,他们通常很难回答这个问题。最终,我们需要机器学习对业务产生影响。这非常重要。

那么,当这些问题与业务影响相关时,应用程序应该如何准备呢?

我认为第一步应该是思考商业方面的行为。问问你自己:“所以我建立了这个模型。现在,这对业务有什么实际影响?”这会让你想到,“嗯,企业可能有某些度量标准来衡量企业的健康状况”。这可以是收入、盈利能力、成本等。如果你不太熟悉这些业务术语,我建议你阅读一下公司衡量的关键业务指标。

我还建议无论你面试的是什么,都要更深入一步。假设是营销分析职位。你会说,“好吧。什么是营销分析师?营销人员在日常工作中关心什么?嗯,营销关心获得更多用户,他们关心留住他们的用户,他们关心通过能够用更少的钱获得更多的用户来减少广告支出”。

所以你说,“好吧,我知道他们关心什么。所以,如果我建立这个模型,这实际上会对他们关心的事情产生什么影响?”如果很难想通这个差距,那么这可能是一个信号,需要更多地研究它如何对业务的这个特定方面更有价值,或者它可能没有价值。

最后,我通常会提醒数据科学家要同情业务方面的人,确保你从他们的角度理解事情,因为他们不知道集合、参数调整或 95%的 AUC 意味着什么。因此,尝试从他们的角度理解事情,能够将这种模式转换为他们关心的事情是非常有用的。

作为一名数据科学家,你成功进入 DoorDash 的策略是什么?

我使用三种主要策略,分别针对一般数据科学招聘的不同阶段。1)我给招聘人员和招聘经理发了一封冷冰冰的邮件。2)我使用了拉米特·塞西称之为公文包技术的东西。3)我利用我创建的数据分析来优化我应该如何为工作申请的不同部分分配时间。

要详细、细致地了解 Jeff 为其应用成功而创建和战略性部署的三个文档,请观看视频。下一节将只介绍这三份文件的重要性。

第一份文件:转换分析电子表格

Sample Conversion Analytics Spreadsheet Link: https://docs.google.com/spreadsheets/d/1TmveoOBwRWO7lsQ7z78wkGK4oMOUHWwC_uRaKFeBI84/edit?usp=sharing

这份文件有什么重要性?

举个例子,当我经历求职过程时,我遇到的最大挑战之一是:如何最好地利用我的时间(面试、申请、练习代码、回答问题等)。)?我不知道如何最好地利用我的时间。所以我想做的是使用分析/数据科学来解决这个问题,以便在数据科学领域找到工作。由于我已经经历了多次求职过程,我有足够的数据点来绘制地图,并能够得出一些见解。

这张电子表格是我整理出来的,用来绘制我的求职面试流程的漏斗图。前半部分描绘了面试过程的每个部分。最后一部分列出了我用来获得更多采访的不同类型的渠道。

在申请过程中利用这个分析电子表格有什么好处?

像很多数据科学问题一样,这也像一个优化问题;优化有限的资源,使我们的收益最大化。如果你对这个话题感兴趣,我建议你去看看线性编程。我没有使用任何机器学习模型,因为数据点非常小,而且你必须获得足够的数据来获得这些见解。

但我认为这非常有利于最大限度地提高你的时间效率。在数据科学中,你可以学习统计学、机器学习、编码,你可以花时间回家做功课,但问题是:我如何知道哪个对我最有价值?这个电子表格肯定解决了这个问题。

例如,假设我有三个小时为面试学习或为找工作做准备。我如何有效地分配时间,使我最大限度地获得工作机会?您可以通过电子表格来解决这个问题。

第二份文件:直接招聘人员电子邮件

Sample Direct Recruiter Email Link: https://docs.google.com/document/d/16RXFT71tZJ3BUFPuDTnEke4yNsm9fiRZQlHztVDkToA/edit

这封信背后的战略要点是什么?

这封信深入探讨了更多关于理解人类心理和理解一般写作的技巧,以将收件人钩入信中。

第一段:想法是首先真正尊重某人的时间,并提及这一点(即使在我这边,我也收到相当多的信息和电子邮件,要求我做些什么)。然后确定你是如何找到它们的,以及你为什么要发邮件给它们。

第二段:建立你的证书;为什么你很适合这个角色。突出你的技能中让你与众不同的部分。

第三段:展示工作之外的自己。这样,有人谁正在阅读这份文件,读者可以理解,申请人有技术技能和沟通技巧,并非常致力于成为一个更好的人。每个人都有与众不同的因素。对于那些想要使用这个模板的人,请深入思考是什么让你与众不同。

第四段:使用黄金线。使用黄金线实际上会让读者更快地回复你的邮件。这显示了对他们优先事项的考虑,你可以从他们的角度理解事情。

第三份文件:公文包文件

Sample Briefcase document link: https://docs.google.com/document/d/1HTmC-hu9upge8vnNDe65OnrX0a7hRoIcNX2YkkJYfzc/edit

什么是公文包文档,申请人如何才能最好地使用它?

这个想法是,当你经历面试过程并进行一次愉快的谈话时,你在面试结束时要做的是说,“等一下。我花了些时间思考你的一些问题。我为你准备了一些东西”。然后,你戏剧性地拿出你的公文包,向招聘经理展示你已经理解了他们的痛点,并给出了解决这些具体痛点的详细方案。

从招聘经理的角度来看,他们垂涎三尺,因为他们在想:“如果我雇用这个申请人,这个人会带着这些问题来,他们会解决我的问题”。

因此,公文包技术是一份概述公司痛点以及你提出的解决这些具体痛点的想法和项目的文件。这些项目非常详细,比如你将要使用的资源,你认为这将需要的时间,以及你认为你将要进行的项目的大纲。所以在细节层面上,很容易实现这些想法。

我应该提到的是,每当我在现场展示这份文件时,我每次都收到了工作邀请。

换个话题,你为 TowardsDataScience.com 写的火绒文章是什么?

[## M2M 第 90 天——我如何使用人工智能来自动化 Tinder

这篇文章是 Jeff 为期 12 个月的加速学习项目“掌握一个月”的一部分。对于三月,他是…

towardsdatascience.com](/m2m-day-89-how-i-used-artificial-intelligence-to-automate-tinder-ced91b947e53)

我想了解卷积神经网络和深度学习是如何工作的。我学习的方法是找到我想用我现有的技能解决的问题。

在这种情况下,我觉得约会应用程序占用了太多时间。我认为建立 CNN 更容易,它实际上会对我喜欢和不喜欢的个人资料进行分类。通过这个过程,我了解了神经网络是如何工作的,不同 dnn 之间的差异以及其他挑战,如调整。

这篇文章对招聘过程有影响吗?

影响更加间接。当我在那封邮件中向招聘人员推销时,这给了我一个很好的卖点。对于非技术性的招聘经理和招聘人员来说,理解我做了什么以及我构建这个项目的思维过程是非常重要的。

最后一个问题:你对 TDS 的观众在整个招聘过程中有什么建议吗?

当我玩扑克时,有一个概念,你可以在扑克中做出正确的举动,但你仍然可能会输钱。这个概念适用于生活中的一切。在我们的日常生活中,总是有随机的机会。有时我们可能做了正确的事情,但对我们来说可能不是积极的结果。这直接适用于招聘。在招聘中,有太多的变量,涉及太多的随机机会,很难控制这些事情。

因此,我想说的是,在招聘时,只需专注于你能做的、在你控制范围内的事情,并专注于做出正确的举动。他们可能每天发送 3 封冷冰冰的电子邮件。总是发一封感谢邮件。做这个公文包技术。这些都是你能控制的事情。但是请记住,有时会有很多随机的运气,事情可能不会如你所愿。

如果你还有任何问题,不要犹豫,看看我的网站:http://www.jefflichronicles.com/。

如果你有兴趣申请 DoorDash,点击这里:https://www.doordash.com/careers/

[## Haebichan Jung - Medium

阅读容格在媒介上的作品。项目负责人@TDS |数据科学家@ Recurly…

medium.com](https://medium.com/@haebichan)

提高 Python 代码速度的 3 种技巧

原文:https://towardsdatascience.com/3-techniques-to-make-your-python-code-faster-193ffab5eb36?source=collection_archive---------6-----------------------

你甚至不会流汗

source

在这篇文章中,我将分享你在日常脚本中可能用到的 3 种 Python 效率技巧,以及如何衡量 2 种解决方案之间的性能提升。我们开始吧!

我们如何比较两个候选解决方案的性能?

性能可能指解决方案中的许多不同因素(例如,执行时间、CPU 使用率、内存使用率等)。).不过,在本文中,我们将重点关注执行时间。

新解决方案在执行时间上的改进可以像除法一样简单地计算出来。也就是说,我们将旧的(或未优化的)解决方案的执行时间除以新的(或优化的)解决方案:tell/Tnew。这个指标通常被称为加速。例如,如果我们的加速因子为 2,我们改进的解决方案将花费原始解决方案一半的时间。

为了比较我们函数的性能,我们将创建一个函数来接收这两个函数,计算它们的执行时间,并计算获得的加速比:

import timedef compute_speedup(slow_func, opt_func, func_name, tp=None):
  x = range(int(1e5))
  if tp: x = list(map(tp, x)) slow_start = time.time()
  slow_func(x)
  slow_end = time.time()
  slow_time = slow_end - slow_start opt_start = time.time()
  opt_func(x)
  opt_end = time.time()
  opt_time = opt_end - opt_start speedup = slow_time/opt_time
  print('{} speedup: {}'.format(func_name, speedup))

为了获得有意义的结果,我们将使用一个相对较大的数组(100.000 个元素),并将其作为参数传递给两个函数。然后,我们将使用时间模块计算执行时间,并最终交付获得的加速。

请注意,我们还传递了一个可选参数,允许我们更改列表元素的类型。

1.避免用+运算符连接字符串

您可能会发现的一种常见情况是必须用多个子部分组成一个字符串。Python 有一个方便的+运算符,允许我们以如下方式轻松地连接字符串:

def slow_join(x):
  s = ''
  for n in x:
    s += n

尽管对我们来说这是一个干净的方法,Python 的字符串是不可变的,因此不能被修改。这意味着每次我们使用+操作符时,Python 实际上是基于两个子字符串创建一个新字符串,并返回新字符串。考虑一下,在我们的例子中,这个操作将被执行 100.000 次。

这种方法显然是有代价的,我们可以使用 join() 找到一个更便宜的解决方案,如下例所示:

def opt_join(x):
  s = ''.join(x)

这个解决方案采用子字符串数组,并用空字符串分隔符将它们连接起来。让我们检查一下我们的性能改进:

compute_speedup(slow_join, opt_join, 'join', tp=str)

我得到了 7.25 倍的加速系数!考虑到实现这项技术所需的少量工作,我认为还不错。

2.使用地图功能

当我们需要对列表中的每个元素进行操作时,我们通常可以这样做:我们应用生成器理解并处理当前元素。然后,我们可以在必要时迭代它:

def slow_map(x):
  l = (str(n) for n in x)
  for n in l:
    pass

然而,在许多情况下,您可能更喜欢使用 Python 的内置映射函数,它对 iterable 中的每个元素应用相同的操作并产生结果。它可以简单地实现如下:

def opt_map(x):
  l = map(str, x)
  for n in l:
    pass

是时候检查一下我们在执行时间上提高了多少了!如下运行我们的 compute_speedup 函数:

compute_speedup(slow_map, opt_map, 'map')

我获得了 155 的加速。可能有人会说理解更易读,但是我会说,适应 map 的语法也不需要什么,至少在简单的场景中是这样(例如,不需要 iterable 上的任何条件)。

3.避免重新评估函数

每当您发现自己在循环块中的元素上重复使用相同的函数时,例如:

y = []
for n in x:
  y.append(n)
  y.append(n**2)
  y.append(n**3)

…或者只是在循环块中使用一次这样的函数,但是是在一个很大的列表上,例如下面的情况:

def slow_loop(x):
  y = []
  for n in x:
    y.append(n)

…您可以利用另一种优化技术。

如果您以前将函数作为变量保存,并在循环块中重用它,则可以节省重新计算函数的成本。以下片段显示了这种行为:

def opt_loop(x):
  y = []
  append = y.append
  for n in x:
    append(n)

注意,如果需要将当前元素添加到不同的列表中,就必须为每个列表的 append 函数创建一个新变量。

让我们使用 compute_speedup 来检查加速:

compute_speedup(slow_loop, opt_loop, 'loop')

在这种情况下,我获得了 2.07 的加速比!同样,我们不需要做任何重大的改变来获得这样的改进。

想要更多提高效率的技巧吗?看看这些文章吧!

3 个简单的 Python 效率技巧

在 Python 中寻找性能瓶颈

3 个建立纪律的绝妙策略

原文:https://towardsdatascience.com/3-terrific-tactics-to-build-discipline-215ad1bdb2c2?source=collection_archive---------25-----------------------

似乎从未达到您的 KPI?专注基础,成为一名优秀的工程师。

Video Version

我故意用“战术”这个词。著名的战争战术家和哲学家孙子经常引用的一句话是:

没有战术的战略是最慢的胜利之路。没有战略的战术是失败前的噪音。

但是这实际上是什么意思呢?你可以把战略看作是任何涉及全局的事情,并告知决策“我要去 b 点”。相比之下,战术是把你从 A 点带到 b 点的具体行动。

区分这一点很重要,因为下面是对一些策略的快速回顾,你可以将这些策略融入到你为自己设定的几乎任何任务、议程或策略中。下面的目标读者是软件工程师同事,但是这些基本策略可以适用于任何人。理论到此为止。让我们言简意赅,言简意赅。

说话之前一定要听

现在,我已经在这个地方,我甚至有时会感到内疚。但事实是:你并不知道一切。

你可能是一名软件工程师。电气工程师。计算机工程师、生物工程师或核工程师。所有工程形式的共同点是什么?嗯,对于所有不同风格的工程师来说,这些都包括与和其他人一起工作。与他人和团队合作的美妙之处在于,每个人都走到一起,为团队贡献自己独特的天赋。当这种情况发生时,你必须意识到你可能期望的并不是你需要构建的现实。

所以,在你开始说话之前,一定要确保你在听周围的人说话。而且如果你不懂,问问题也没关系。你听到了吗?

提问是可以的。

事实上,你问的问题越多,特别是如果你和一个团队一起工作,你作为一名工程师就会越好。

确保你真正理解为什么你要写代码。为什么你要做你正在做的事。根据您的角色,始终与您的项目经理、团队经理、技术主管或您自己保持同步。

提问是可以的。如果 act,你问的问题越多,特别是如果你和一个团队一起工作,作为一名工程师你会做得越好。

每天表演 30 分钟代码形

并在同一天回顾它

有时候,尤其是如果你在一家 500 强公司,你可能会开始忘记一些 CS 基础知识。我是说,上一次我必须检查二叉查找树中是否存在给定的子序列是什么时候?

别担心!你可以通过表演代码形来解决这个问题。这些有时间限制的编码练习被称为“形”,这个术语最初用于日本武术,甚至用于训练武士。它只是指训练基本的位置或姿势。在软件工程的上下文中,您通过完成时间封闭的编码练习并检查它们来执行形。通过这样做,你将完成作为一名工程师个人发展的三个步骤:

  • 更新您的知识基础
  • 在你的技能工具箱里磨一磨你可以用于工作项目的工具
  • 练习专注的艺术

如果你还不明白,可以去看看我今年早些时候写的代码。(https://towards data science . com/code-kata-robot-sensing-reduce-branching-and-cyclomatic-complexity-Fe 290 b 3050d 1)

吃你的青蛙

现在,我知道这听起来很奇怪,但是吃你的青蛙并不意味着真的吃你的青蛙。事实是,我们想探索解决你讨厌的问题或任务的概念。早上第一件事就是做这件事。要吃你的青蛙,只要遵循这一个指示。

在你一天工作的开始安排一个 90 分钟的窗口来完成你最难的任务。

通过这样做,你增强了将你希望的目标转化为你完成的习惯的能力。否则,如果你一直拖到最后一分钟,或者一天的最后一刻,那么你第二天就会不得不去做那项任务。美国在线前首席执行官斯蒂芬·凯斯说的话是有道理的:

没有执行的愿景是幻觉。

想想吧。

在最好的情况下,在这 90 分钟里,你将会完成这个你一直讨厌的任务。你将完成你需要做的所有事情。多棒啊。

在最坏的情况下,你可能会产生更多的问题,遇到更多的障碍。但是,如果你在一天中第一件事就做,特别是如果你和一个团队一起工作,那么你可以那些问题。这难道不深刻吗?是的,这听起来很简单。然而,我们中的许多人(包括我自己)都有懒惰和拖延的倾向。我也要吃我的青蛙。

嘿,还记得我之前提到过,当你留出 90 分钟的专用时间并吃掉你的青蛙时,你会增强你将你希望的目标转化为你完成的习惯的能力吗?好奇想知道这是怎么做到的细节吗?

最近的一份出版物披露,这是通过加强眶额叶皮质(OFC)与背侧纹状体之间的联系来实现的,这对于目标导向的行动控制是必要的。更多详情请查看:https://www . cell . com/neuron/full text/s 0896-6273% 2816% 2930157-X

你知道的越多。

你认为最重要的纪律习惯是什么?请在下面的评论中留下你的想法。

每个有抱负的数据科学家在第一份工作之前应该知道的 3 件事

原文:https://towardsdatascience.com/3-things-every-aspiring-data-scientist-should-know-before-their-first-job-4b1559d3162?source=collection_archive---------30-----------------------

指导你职业准备的知识

From Pexels

随着人工智能的普及和炒作,希望从事数据科学家工作的人数也在增加。这导致许多大学提供新的数据科学学位和在线平台,以增加更多与该主题相关的 MOOCs。不久前,我还是一名试图进入数据科学世界的学生。在我转型成为一名数据科学家后,我回头看,意识到我做了一些正确的事情,还有一些事情我完全不明白。在这些事情中,有三个对我来说最突出。

1.技术技能是容易的部分

在大学里,我花了很多时间想知道什么课程最能为我在数据科学领域的职业生涯做准备。现在回想起来,我对我认为最有价值的课程感到相当惊讶。大部分都不是教我 python 或者线性回归的课。我认识到,花一点时间学习和练习,技术技能似乎很容易获得。让我受益最大的课程是那些推动我独立学习和思考的课程,不管主题是什么。

一旦你离开学校,就不会再有课程教你工作所需的技能。在这一点上,学会如何学习变得非常重要。如果你能拿起一篇关于一项新技术的最新研究论文,理解它,并从中学习如何实现某些东西,你就为任何事情做好了准备。最重要的是,自学的自然动力对潜在雇主来说很有吸引力。

我还认为,在劳动力中,技术技能比解决问题能力强的人要多得多。如果你在进入职场之前有任何机会练习这些批判性思维技能,无论是通过课堂还是个人项目,这很可能比知道多一个模型如何工作更能让你受益。

2.作为一名数据科学家,需要大量数据和一点科学知识

在钻研数据科学之前,你还应该知道你将进入什么领域。数据科学家的日常工作不是构建人们称赞你名字的辉煌模型。它通常包括筛选数据、思考问题、将代码从 Jupyter 笔记本转移到可读性更强的地方,以及实现自动化。总的来说,机器学习是数据科学的工具,而不是一个人的工作。

我建议每个有抱负的数据科学家在准备开始找工作时问自己一个问题。“什么类型的行业对我来说足够有趣,以至于清理大量数据不会那么糟糕?”每个行业都在探索人工智能,选择一个你感兴趣的对你在数据科学领域的长期幸福很重要。没有一份工作总是充满乐趣,数据科学也不例外。因此,找到一个行业,你可以通过无聊的东西,使之成为可怕的是非常重要的。

3.AI 不能解决一切

第一次有人告诉我,我们可能无法用人工智能解决问题时,我震惊了。这似乎是对上帝的亵渎。人工智能应该解决公司的一切问题。

人工智能实际上受到工业中许多不同事物的限制。数据、计算能力或问题复杂性等因素都可能限制我们使用人工智能解决的问题。有时候你会构建一些不起作用的东西,这没什么。它通常说的不是你,而是人工智能的局限性。

理解人工智能的极限实际上是非常有价值的。它有助于了解什么项目值得追求,以及项目应该何时完成。它可以帮助设定现实的目标和对人工智能如何帮助公司前进的期望。

结论

为进入数据科学领域做好准备有很多事情要做。我只提到了三件学生在校期间通常不会想到的事情。虽然这些不是对你应该做什么的直接建议,但希望它们可以帮助指导你的一些决策。如果你想获得关于如何准备数据科学职业的更直接的建议,你可以查看我写的另一篇文章。

[## 如何在第一份数据科学工作之前获得数据科学经验

找机会和某人合作写一篇学术论文是获得以下经验的好机会

link.medium.com](https://link.medium.com/wlwq74rQW0)

我在第一次 Dev 会议中学到的 3 件事

原文:https://towardsdatascience.com/3-things-i-learnt-at-my-first-dev-conference-4947e73a8ac?source=collection_archive---------32-----------------------

以及为什么你也应该参加会议

This was the first thing you see when you arrive at the conference. The display on the left is made out of mobile phones — cool! Images from @seoyeon.leeeeee.

本周,我第一次以数据科学家的身份参加了开发者大会。这是一次很棒的经历,认识了很多人,接触了新的想法,增加了我继续学习的动力。我想分享我的经历以及我学到的一些东西。

我参加的大会是 LINE 开发者日 2019。它于 11 月 20 日和 21 日在东京举行。对于亚洲以外的人来说,LINE 是日本、泰国和台湾最大的信息平台。他们每月有 2 亿活跃用户。你可以对比一下 Whatsapp 的 15 亿。虽然它没有那么大,但肯定是在同样的规模上,并且有效地拥有他们的核心市场。

遇见人

首先,会议是结识志同道合者的好方法。抛开社交压力,接近人们并开始和他们谈论有趣的话题是很容易的。例如,我参加了各种关于推荐系统的讲座,之后我和我认识的人聊天。听听他们应用了什么技术以及他们经历了怎样的挣扎是很有趣的。与会者来自亚洲各地,因此你可以接触到在你的常规国内市场可能看不到的新想法。我不仅能感同身受,还发现了一些我从未想过的有趣问题。

例如,LINE 使用时间线帖子的推荐系统(类似于脸书或 Instagram),由于他们的数据非常稀疏(< 0.00001% !) they can’t apply regular embedding techniques like SVD or ALS, instead they use some interesting and innovating tricks to get there. In my daily job our sparsity is closer to 0.1% so I’m lucky enough to be able to apply the standard techniques but it’s great to see that you can break away from the norm.

I also did my best to get the contact details of anyone who was facing similar problems. I believe it’s great to keep in contact with fellows in the industry, as you would see in academia, so that you can continually bounce ideas of each other and grow together.

Speaking with Speakers

Aside from chatting with other attendees, I did my best to talk with the speakers. For some reason, at this conference the speakers were almost exclusively left unattended at the end of their talks. I took this opportunity to ask as many questions as I could (I stole 30 mins of one speaker!). There are all the benefits discussed above but a few more.

Talking with the speakers I found out that ),即使他们中的许多人没有发布结果,他们也确实在研究有趣和前沿的技术。数据共享限制、市场竞争或单纯的业务等问题通常会阻止他们尽可能多地共享数据。这是意料之中的事,但这也指出了参加这样的演示来了解这些技术的价值。

接下来,另一个很大的好处是能够发现论文背后更多的东西。数据科学研究受到重复性问题的困扰,这意味着很难将某人在论文中发表的工作应用到你自己的工作中。通过参加会议和直接与出版商交谈,你可以补充一些你不理解的、原始论文中遗漏的细节,或者询问他们如何得到论文中的结果。

例如,其中一位演示者向我们介绍了图像识别深度学习网络的 CutMix 技术。演示结束后,可以问他们各种细粒度的问题,比如他们是如何得出论文中的结果的,他们尝试了哪些技术,但失败了。

Image from @LINE.

查找员工

这个会议不会便宜的。成千上万的人,一个提供午餐和晚餐的豪华酒店,他们肯定花了很多钱。但我认为这是值得的。如果你考虑到招聘人员平均收取员工起薪的 30%左右,那么你看到的是每个员工 3 万英镑。虽然像这样的会议将花费几十万美元,但如果他们能从会议中雇用 10 名新员工,或大约 0.5%的与会者,这笔成本将很容易收回。

当然,像 LINE 这样的公司对员工(有经验的和应届毕业生一样)已经有了很强的吸引力,他们有一个内部招聘部门,这意味着招聘的实际成本更低,但经济效益可能仍然很好。

因此,对于组织者来说,这是一个巨大的招聘潜力,但作为一名与会者,你可以利用这一点。如上所述,在结识不同的人的同时,你也可以寻找下一个最优秀的同事或员工。这是一个舒适的环境,很容易投入到技术讨论中,没有面试的压力。

玩得开心

最后,会议只是娱乐,我们都需要偶尔来点娱乐。我相信参加会议有助于点燃我学习数据科学的热情。那是因为想法令人兴奋。与处理同样问题的人交谈会给你强烈的肯定,你正在做的工作是好的。

当然,津贴也不错。住在一家豪华酒店里,设施很棒,食物也很美味!他们甚至在会后派对上将定制标签印在啤酒上——哇!

还有其他赠品,包括标准的会议 t 恤、笔记本电脑贴纸(或者编码员认为的徽章)和一些小奖品。

Lots of bounties to be had at the conference. Note the LINE branded beers in the bottom right! Photos from @line_creative and @tweety.

下次

总之,这对我来说是一次宝贵的经历。我遇到了很多聪明人,能够向从事前沿技术的人提问,增加了我成为数据科学家的热情和动力。

如果你曾经怀疑过参加会议的价值,要知道如果你愿意付出一点努力,就会有丰厚的回报。进行调查,询问你的老板你是否能参加你所在地区的下一次会议!

You can find out more about the LINE Developer Day from the website at https://linedevday.linecorp.com/jp/2019/ or with #linedevday.

训练前你需要知道的 3 件事——试分裂

原文:https://towardsdatascience.com/3-things-you-need-to-know-before-you-train-test-split-869dfabb7e50?source=collection_archive---------0-----------------------

Photo Illustration. Photo by Lucca Lazzarini on Unsplash

你做的一切都是对的。从选择一个很酷的预处理步骤到一个全新的损失和一个整洁的准确性度量。但是嘣!您的验证或测试结果比您预期的要差得多。那么是拟合过度,还是你的模型错了,还是亏损了?

有时,我们会忽略一些简单的事情,比如将数据集分成训练集和测试集。除非数据集带有预定义的验证集,否则您肯定至少已经这样做过一次。这很可能是你在网上任何数据科学教程中遇到的第一件事。很有可能你做错了。

分层

假设您正在进行多类分类,并且有一个包含 5 个不同类的不平衡数据集。你做了一个简单的训练测试分割,这是一个随机分割,完全不考虑类别的分布或比例。在这个场景中发生的事情是,您最终得到一个具有完全不同的数据分布的训练和测试集。在与测试集完全不同的数据分布上训练的模型将在验证时表现不佳。现在我们来看看,好吗?

我们从这场 Kaggle 竞赛中获取烹饪数据集。数据集有 20 个类(烹饪类型),非常不平衡。我们选择了三个班级(意大利,韩国和印度)进行我们的小实验。

现在让我们试试 scikit-learn 所有著名的 train_test_split 函数。首先,我们做一个普通的分割。让我们检查结果。

我们可以看到分布的变化。虽然这里很小,但对于更小和更不对称的数据集来说,它很容易就足够大了。这个问题的解决方案是所谓的分层,它将锁定训练和测试集中类的分布。让我们再次进入 train_test_split 函数的文档页面。

在这里。最后一个参数。为了获得相似的分布,我们需要根据类值对数据集进行分层。因此,我们将我们的类标签部分数据传递给这个参数,并检查发生了什么。

瞧啊。你有相同的分布。因此,你的模型不会面临对不平衡测试集进行验证的问题,也不会让你对它的实际性能产生错误的感觉。下一个!

按索引拆分

对于一个定义明确的数据集,我们手头并不总是有一个简单明了的问题。作为数据科学家,现实往往相反。可能会发生这样的情况,您需要将 3 个数据集分成训练集和测试集,当然,拆分应该是相似的。你可能面临的另一种情况是,你手头有一个复杂的数据集,也许是一个 4D 数数组,你需要在第三个轴上拆分它。

这两个问题都有一个很好的解决方案。我们只需要按照数据集的索引进行拆分,这样我们就可以分别获得训练集和测试集的索引。这样做其实很容易。让我们再次使用以前的美食数据集。

注意:在多个数据集之间进行类似拆分的任务也可以通过在 train_test_split 的参数中固定随机种子来完成。但是下面只能这么做了。

我们采用 4D numpy 阵列,并且我们打算通过在它的第三维上分裂来将它分裂成训练和测试阵列。最简单的解决方法是利用我们刚刚学到的知识。

正如你所看到的,训练和测试阵列的形状与我们想要的一模一样。

预处理

好吧,这和数据集的分割无关。但这很重要。这一点的基本要点是:

您不应该使用适用于整个数据集的预处理方法来转换测试或定型数据。

如果您这样做,您就无意中把信息从训练集带到了测试集。让我们在 cuisines 数据集上使用 Tf-Idf 矢量器作为预处理器来对配料列进行矢量化,以检验这一点。

这里发生的事情是,我们在整个数据集上安装矢量器,并用它来转换训练集和测试集。会有一些词只存在于训练集中,一些只存在于测试集中。但是因为我们在矢量化之后进行了拆分,所以所有的单词都被矢量化,并包含在上图所示的 1921 tf-idf 特征中。

纠正这种情况的方法是在向量化之前进行训练测试分割,矢量器或这方面的任何预处理器应该只适合训练数据。下面是正确的做法:

可以预料,tf-idf 的特征数量比以前少了,因为有一些独特的词只存在于测试集中。因此,这些词在矢量器中不被考虑,这确保了测试集的真实的 、不可见的 性质。

所以下一次你分割或拆分数据集时,你可能会暂停一秒钟,以确保你做得是否正确。

顺便说一句,如果你也对深度学习感兴趣,这里有我的两个帖子:

[## 2020 年成为计算机视觉专家的 4 步指南

我在过去 2-3 年的旅程中学到了什么

towardsdatascience.com](/the-4-step-guide-to-becoming-a-computer-vision-expert-in-2020-8e821514e2a7)

在这篇文章中,我将讨论一个新手如何进入计算机视觉领域,以及如何成长为一名专家。

[## 梯度积累:克服深度学习中的记忆限制

它是什么,如何实现

towardsdatascience.com](/gradient-accumulation-overcoming-memory-constraints-in-deep-learning-36d411252d01)

在本文中,我将讨论如何利用梯度累积技术在较小的 GPU 上运行较大的批处理。

干杯!

创建更有效运营报告的 3 个技巧

原文:https://towardsdatascience.com/3-tips-for-effective-operational-reports-5a0c5123bfde?source=collection_archive---------34-----------------------

Photo by Austin Distel on Unsplash

使用这些技巧来提高你的报道技巧

报表对业务来说并不陌生,它们是一项基本需求。报告帮助用户回答问题非常重要,这样他们才能成功。

如果做得好,报告可以回答问题,并迅速将公司推向数据驱动的方向。当管理层理解数据的价值时,他们会更快地走向分析的成熟。

这里有一些关于如何改进你的报道的建议。

报告目的是什么?

在开始使用任何数据之前,您必须确定需要回答什么问题以及为什么要问这个问题。通常,业务问题可能不是一个实际的问题,而是一个难题。

通常,业务用户不会谈论统计术语;他们只陈述自己的工作目标。倾听那些表明他们需要知道什么或他们需要什么来推动业务的话语。

这些问题中有许多可以归结为“我的团队工作出色吗?”

你的工作是将企业的问题和顾虑转化成有用的格式。

例如,一位客户服务经理表示,客户抱怨响应速度慢。你怎么知道顾客说的是不是真的?

你可以在每个阶段测量门票的年龄。如果公司承诺在七天内关闭故障票证,报告将显示超过六天的未结票证。如果结果显示 100 张票中只有 95 张符合标准,你可以认为它们符合要求。

然而,如果反过来,公司需要测试是否有足够的资源来管理这项工作,或者目标是否无法实现。事实证明客户是正确的!

有效运营报告的技巧

我们经常讨论创建数据故事或仪表板,您必须了解您的目标受众。在这里,目标是经理。

一份有用的报告的关键是揭示企业是如何追踪目标的。报告的最佳实践包括以下特征:自动生成,在一个中心位置可用,并具有标准格式。

技巧 1:使用自动化批处理来保持一致性

大多数报告都是从数据库生成的。我们通过称为批处理的自动化流程来创建报告。

批处理是在非工作时间运行的一系列程序。在批处理过程中,我们从源中提取数据,将其转换为有用的信息,然后将其放入报告中。

即使使用实时数据,仍然需要清理过程。数据很少能以原始状态显示。这使得实时报告如此具有挑战性。业务或计数规则必须在显示数据的同时尽快应用。

技巧 2:向下钻取路径应该有一个快速的结尾

设计摘要报告时,要考虑如何访问详细信息。用户从汇总数据到详细信息的途径称为信息路径。

您的用户从条形图开始。用户单击单个条来显示该行中记录的数量。那么用户应该在路径的最后一步,即单独的数据行。最佳做法是将点击限制在详细数据。

在三次点击之内,用户应该得到可操作的信息。

研究你的信息路径,确保用户不会无休止地点击!你的工作是带领他们找到他们想要的答案。

提示 3:提供计数规则的链接

用户必须了解哪些数据支持一个报告,这样他们才能了解报告显示的是什么信息。现代报告有数字格式。请确保您添加了计数规则的链接,这些规则解释了数据收集方法、数据过滤器、公式以及使值呈红色或绿色的原因(以显示负趋势或正趋势)。

用户并不总是了解数据库中的哪些信息为报告提供了素材。

有些人不知道他们的工作习惯会如何影响过程结果。例如,如果报告衡量更新的及时性,员工必须根据需要更新记录。如果员工没有这样做,他们的详细报告上的红色列可能会令人震惊。

计数规则还有第二个用途。他们为新工人提供培训。他们能够理解企业想要实现的目标。

额外提示:使用交通信号灯来集中用户的注意力

交通信号灯通常用于显示流程何时失控。这个概念是基于标准的交通信号。红色代表停止!(或对麻烦的警告),而绿色意味着去或好。近年来,这种方法受到了批评。许多使用这种方法的报表构建者用所有的颜色创建了一个马戏团的外观。

最新的方法是使用性能信号。在这种方法中,如果表格单元格符合要求,则用灰色突出显示。越界度量显示为红色边框。

这个方法在不隐藏数据的情况下吸引用户的注意力,如下例所示。

报告是你的第一步

报告是分析成熟的开始。虽然有些人认为这项任务很简单,但它对企业的最终成功至关重要。

最初出版于 https://www.zencos.com。

改善数据科学工作流程的 3 个技巧

原文:https://towardsdatascience.com/3-tips-to-improving-your-data-science-workflow-71a6fb8e6f19?source=collection_archive---------13-----------------------

这些简单的技巧是根据我自己的学习经验设计的,应该可以帮助你提高数据科学工作、项目管理以及与他人分享时的成果。

1.笔记本和降价

近年来,用于编写代码的笔记本变得越来越流行,尽管许多人仍然喜欢在更传统的 IDE 环境中编写代码。重要的区别在于你什么时候想分享你的作品;当把你的作品发给同事或同学时,利用代码单元与减价交织的笔记本格式是非常宝贵的。

我使用任何笔记本的目的都是让人们在没有任何项目知识的情况下拿起它,并完全理解分析、决策和最终结果的含义。

为此,我通常遵循以下规则:

  • 标题和介绍应该清楚地定义分析的目的
  • 各部分之间应该有所区别
  • 任何使用的方法都应该在一个标格中介绍、解释或引用,用 LaTeX 格式正确书写数学
  • 输出图表应正确标注清晰的标题、轴标签和图例标签
  • 代码单元应该有明确定义名称的变量和注释,用于根据需要解释更小的步骤

例如:

2.跟踪代码的进度

你刚刚编写了处理数据的代码,你按下运行按钮,坐在那里等待你的代码块旁边的星号变成一个数字,等待…等待…

这听起来熟悉吗?当我刚开始学习编码时,这种事情发生得太频繁了。有几个解决方案,但我发现最简单的是在循环中使用打印函数来跟踪代码完成了多远。

下图中的代码准确地显示了如何跟踪 iPython 笔记本中任何循环的当前进度。更详细的写上去可以在这里找到

这意味着我现在知道我是否有时间去喝杯茶,或者需要让代码通宵运行,同时专注于另一项任务。它也有助于在需要完成工作所需的时间范围内更新同事,因为我可以估计在更大范围内应用时所需的时间。

3.高效优化参数

当我第一次开始学习应用机器学习时,我会逐个手动更改参数输入,并记录下最终输出的结果。虽然这有助于我对参数的理解,但这很费时间,而且效率很低。

随着时间的推移,我凭直觉开发了三种方法(尽管我不认为我是第一个提出这些方法的人),它们极大地改进了我的参数调整:

  1. 利用循环自动测试参数输入
  2. 在循环内部迭代构建输出表,为图表或发布做好准备
  3. 用互动动画演示参数的影响

第一种方法似乎有些显而易见,使用一个简单的循环来增加每个间隔的参数,并输出该增量的值或图形,而不是手动逐个更改输入。这甚至可以用于网格搜索参数测试,我们基本上是在多个输入的可能参数范围内进行强力检查,如下所示。

为了进一步改进这一点,一个好的方法是形成一个数据框,在应用每个增量时添加其输出,而不是简单地打印输出。

做到这一点的一种方法是通过以下方式:

  • 引入一个空的熊猫数据框
  • 测试循环内的参数输入
  • 应用 append 函数向引入的数据帧添加一行,其中包含每次循环迭代的输出

下面的完整代码显示了这一点,其中每一行都被整齐地格式化为一个数据帧,以添加到前面的输出中。这也使得创建任何摘要图变得容易,并且可以很容易地用作准备发布的普通表格。

最后,虽然大多数项目可能不需要,但是使用交互式动画来显示参数变化的输出。我在这里写了一份关于如何做这件事的完整指南,并在本笔记本的中使用,以更好地说明改变参数对输出稳定性的影响。

我希望这些对你有用,并能帮助你提高数据科学的成就。

谢谢

哲学(philosophy 的缩写)

业务分析师需要学习的 3 种报告类型

原文:https://towardsdatascience.com/3-types-of-reports-that-business-analysts-need-to-learn-4e02f2f7e48e?source=collection_archive---------3-----------------------

日常工作中,涉及到制作表格或者图表或者数据分析,基本都会选择 Excel。但我也看到很多人对 Excel 深度学习的难度,以及在大数据处理上的低效感到困惑。实际上,专业的商业分析师应该熟练使用各种报表工具(Excel/QlikView/Tableau/FineReport),以及制作不同报表的技巧。今天,我将告诉你我在做数据分析时使用的 3 种报告,以帮助你提高业务效率。

由于我经常使用的工具是 FineReport ,所以我采用 FineReport 的分类方法。针对不同的需求,我把报表分为以下三种。

  • 一般报表:明细报表、分组报表、交叉表报表、列报表、查询报表、数据录入报表等。
  • 汇总报表:各种不规则报表,如复杂单据
  • 仪表盘报表:基于业务指标显示的多维分析可视化报表

这三类报表基本解决了各种业务需求。接下来让我们来看看它们。

1.一般报告

1.1 特点

常规报告是 FineReport 中最常用的报告类型。他们使用类似 Excel 的设计模式,支持行和列的无限扩展、多个表和跨表计算等等。用户可以使用通用报表进行参数查询、数据录入、图表设计等。而一般报表又可以分为明细报表、分组报表、交叉表报表、列报表、查询报表、数据录入报表等。

1.2 业务场景

通用报表可以取代企业中用 Excel 制作的各种传统报表,大大减少制作时间。由于采用了 B/S(浏览器/服务器)结构,可以在网上查看报告。

通过 FineReport 的通用报表,用户可以从不同类型的业务数据库中提取数据,制作财务报表,销售报表,生产报表,人力资源报表以及其他与经营业绩相关的报表。此外,用户可以随时随地在 PC 或移动设备上访问报告、查询数据和编辑报告。

有三种典型的报告类型。

1)基本报告

基本报表分为明细报表、分组报表、交叉表报表和其他基本表样。它们支持灵活的公式计算,如同比、环比、排名、比例以及打印和导出离线文件。

分组统计:

YoY、MoM 等财务统计:

列卡:

可折叠树:

发票:

2)查询报表

在大多数情况下,我们并不需要一个报表来呈现数据库中的所有数据,而是根据一些条件筛选出我们想要的数据,这就是所谓的参数查询。

FineReport 提供了多种控件类型,可以在各种场景下灵活使用实现条件过滤查询,同一个报表可以支持多个参数。

查询报告:

3)数据输入报告

传统意义上的报表是解决数据呈现的问题,即将数据从数据库中取出,以各种格式显示出来,并将显示的结果导出或打印出来。

然而,在企业的实际操作中,业务人员不仅需要查看数据,还需要进行一些编辑操作,如添加、修改和删除一些数据。这种报告被称为数据输入报告。

基于以上展现/查询报表,FineReport 提供了多种控件样式,支持数据录入和 Excel 数据在线导入,可以满足不同场景下的数据编辑录入需求。

基本填写:

查询、添加和删除:

批量删除:

2.汇总报告

2.1 特点

聚合报告是指包含多个模块的报告,每个模块类似于单个报告或图表。各模块相对独立,互不影响。所以可以解决制作不规则大报表的问题。

2.2 业务场景

传统报表(如 Excel 报表)的一个大问题是,如果您调整单元格的行高或列宽,它所在的整行或整列中的其他单元格都会受到影响。这种情况下,我们很难做出表格样式不规则,或者单元格行高不一致的复杂报表。虽然在某些情况下,这可以通过不断合并或分裂单元来实现,但工作量实在太大了。

FineReport 中的聚合报表就是为了解决这样的问题。不同的表格块组合成一个复杂的大报表,块之间的展开、行高、列宽互不影响,大大提高了制表的灵活空间。

下面的上海轨道交通日常状态报告是汇总报告的一个典型例子。

特别是当我们需要制作复杂的账单类型的报表时,用传统的 Excel 电子表格进行设计确实令人头疼。但是使用聚合报告,您可以很容易地设计这样一个表。

3.仪表板报告

3.1 特点

仪表板报表是为解决业务决策问题而开发的。与一般报表的表格界面不同,仪表板报表采用了类似画布的操作界面。通过简单的拖放操作,就可以构建一个功能强大、功能全面的“管理驾驶舱”。不同的数据可以整合在同一个页面上,显示各种业务指标,实现数据的多维度分析。

仪表板报告有许多功能。

  • 适用于各类显示屏:PC、平板电脑、手机、电视、大屏幕等各类终端。
  • 更多视觉元素:有许多视觉组件,如表格、图形、控件等。,可以自由搭配,做成各种报表。
  • 组件链接分析:可以链接组件进行分析。只要你点击一个组件,关联的组件就会自动触发数据加载。
  • 数据监控和定期刷新:后台可以智能检测和比对数据,前台可以及时更新数据。
  • 自动轮播:仪表板报表支持同一位置不同图表样式的轮播和多个标签页的轮播。

3.2 业务场景

在传统的报表设计界面中,自由搭配不同的表单、图形、控件等是很繁琐的。在一页上。仪表板报告为设计和快速构建业务仪表板提供了一种简单有效的方法。

仪表板报告的一个典型应用是领导管理仪表板。

由于仪表板报告可以适应多种终端,管理员可以随时随地在浏览器、应用程序等上监控关键指标数据。

再比如,公司的战略指挥中心、监控中心,或者会议室,经常使用大屏幕实时查看关键绩效指标,或者宣传企业实力、企业形象。

终于

我只是展示了这三类报表的一些功能,还有很多细节没有提到。如果您充分利用 FineReport 的三种报表设计模式,您可以满足大多数简单或复杂的报表需求,轻松实现各种业务分析。

您可能也会对…感兴趣

2019 年你不能错过的 9 款数据可视化工具

制作销售仪表板的分步指南

数据可视化中的 10 大地图类型

人工智能帮助数字化转型的 3 种方式

原文:https://towardsdatascience.com/3-ways-ai-aids-digital-transformation-4a5965708c45?source=collection_archive---------22-----------------------

数字化转型和人工智能/机器学习已经成为技术领域最热门的词汇;一些组织非常热情地接受了这些。根据国际数据公司(IDC)的一份报告,2022 年,全球在实现数字化转型的技术和服务上的支出可能达到 1.97 万亿美元。同样, Gartner 的首席信息官调查发现,在过去的四年里,人工智能的实施增长了 270%。

然而,组织往往没有意识到,当数字化转型和机器学习携手并进时,它们可以帮助实现完全的数字化转型。对于寻求实现数字化转型的组织来说,机器学习可能极具价值。采取互补的方法有几个好处。

印度 IT 巨头印孚瑟斯(Infosys)一份名为企业中的人力放大的调查报告发现,使用人工智能支持的活动来推动数字化转型的受访者中,98%的人报告称,它为他们的组织创造了额外的收入,并将他们的底线提高了至少 15%。该报告指出,最大的影响来自机器学习,因为它帮助大幅减少了执行日常活动所花费的平均时间,并帮助做出更明智的决策,减少了出错的空间。

因为 ML 可以帮助分析复杂的数据,并根据这些数据做出准确的决策,所以它是实现完全数字化转型过程中的一个有价值的盟友。

Photo by Markus Spiske on Unsplash

“业务中使用的任何技术的第一条规则是,应用于高效运营的自动化会放大效率。第二是自动化应用于低效率的操作会放大低效率。”

比尔·盖茨

数字化转型和机器学习都有携手并进的主张,组织有时可能会考虑跳过整个数字化转型。然而,这不是一个明智的想法,而且充满了问题。对于任何成功实现完全数字化转型的公司来说,一定程度的数字化成熟度是一个基本要求。尽管公司和政府机构正在思考如何转变他们提供现有产品和服务的方式,并创造新的产品和服务,但人工智能可以在优化过程中伸出援手,并获得可能有助于提高他们底线的见解。

以下是一些数字转换与机器学习相结合可以产生最佳结果的应用。

动态分析

我们知道,获得正确的数据和分析工具可以极大地增强决策。机器学习可以实时处理数十或数千个数据点,无需任何人工干预。例如,在网上购物的顾客只会得到与他们当时搜索的内容相关的报价。因此,给他们更个性化的体验。

机器学习使组织能够建立具有预测分析的模型,这些模型可以比人类更快地测试和重新测试它们。它可以在数字优化过程中带来很大的效率,特别是当涉及到自动化的数据科学能力时。

推动规模经济

鉴于机器学习算法可以从现有的模式和数据中快速学习,机器学习可以帮助扩展流程,这在纯人类团队中是不可能的。数据分析师可能需要几个月才能完成一个模型,而 ML 平台只需几分钟就能完成。

更快的进程

因为机器学习有能力分析比人多得多的数据,这也是一种优越的方式,它可能有助于简化和加快许多数字过程。此外,机器学习还可以帮助发现数据集中的各种关系,甚至可以帮助企业找到新的收入机会。

实际上,鉴于人工智能有潜力推动大规模流程并帮助任何企业做出明智的决策,它可以成为数字化转型过程中的一个重要工具。当然,无论是数字化转型还是机器学习,仍然存在的一个基本规则是,业务用例和目标必须明确。不清楚的商业案例会使任何组织瘫痪,不管一个组织可能带来的技术实力如何。一旦清楚了这一点,数字化转型和机器学习就能一起创造奇迹。

关于我们

在 Mate Labs,我们已经构建了 Mateverse,一个全自动的机器学习平台,在这里你可以构建比 快 10 倍的 定制的 ML 模型,而无需编写一行代码 。我们利用专有技术、复杂管道、大数据支持、自动化数据预处理(使用 ML 模型的缺失值插补、异常值检测和格式化)、自动化超参数优化等,让分析师和数据科学家的工作变得更加轻松。

为了帮助您的企业采用机器学习的方式,而不会浪费您的团队在数据清理和创建有效数据模型方面的时间,请在此处注册,我们将与您联系。

深度学习和编程技巧的 3 种创新方式

原文:https://towardsdatascience.com/3-ways-to-create-your-own-art-and-have-fun-using-deep-learning-and-programming-c4324145f0f0?source=collection_archive---------24-----------------------

A dreamy computational photograph created by Daniel Ambrosi.

作为一名数据科学家/数据分析师,通常意味着你主要使用你的编码技能来争论和建模数据。然而,你可以用你的技能做许多其他真正有趣、美丽和有影响力的事情。当谈到运用你的创造力时,天空是无限的。

格兰特·桑德森创作了一个视频系列,其中他用编程动画精彩地解释了数学。Nadieh Bremer 离开了她在一家四大公司的数据科学家的工作,成为一名自由职业的数据可视化设计师和艺术家。有些人利用人工智能算法创作出漂亮的艺术品,或者甚至成名并设法以可观的价格出售他们的作品。所有这些人都在某种程度上走出了熟悉的道路,为自己找到了一条“非传统”的道路,并启发了其他人。

你永远不应该把我们的兴趣局限在今天的炒作上,而是要看得更深,探索你的技能和个性的不同组合,让你创造独特、有趣的东西,带来价值并激励他人。

你为什么要这么做?

体验:你尝试新事物时激动人心的小“灵光一现”时刻对你的健康有益。此外,你可以获得新的技能,锻炼你的创造力和解决问题的能力。

发现你真正的兴趣:有时我们倾向于跟随别人正在做的事情,别人告诉我们的“下一件大事”。这样做,你就失去了自己的声音。尝试新事物是一种找到真正让你兴奋的方式。它可能会成为你的一个爱好,一个兼职项目,甚至可能是你下一步的职业发展。对我来说,玩数据很有趣,但我也喜欢创造美学上有趣的东西,这可能源于我的绘画爱好。听到太多关于人工智能/机器学习的流行语和空洞的对话让我厌烦透了。但是坐下来实际创造程序让我兴奋。

吸引人的切实成果:有一次,我向同事们做了一个演示,解释神经网络是如何工作的。我用自己的绘画风格加入了一个神经风格转移的例子。我真的很惊讶其他人对我的“人工智能”生成的图片如此热情。作为一个额外的奖励,这些小发明可以在你和新朋友甚至你未来的雇主的谈话中成为一个很好的破冰工具。

潜在业务:如果你创造的足够好,你甚至可以把你的创意变成真正的业务。有些人在网上出售用深度学习创作的艺术品。有些人成为成功的数据,即自由职业者。还有,很多 patreons 愿意花钱让你做一些很酷的事情,即使他们没有直接从中受益。

应该如何开始?

以下是我们创造性努力的一些想法:

1.用 P5.js 创建数字艺术作品

P5.js 是一个用于创造性编码的免费开源 JavaScript 库。它有完整的绘图功能。你可以把整个浏览器页面想象成你的草图,而不是在纸上画草图!有了各种各样的形状和功能,你可以画出任何你能想象的东西。您可以创建像这样的小游戏和交互式数字作品(我玩这个玩得很开心!):

Sun rise scene with mouse interaction — you can view the code here.

这是我用 p5.js 创作的一个小小的“De stijl”艺术作品。 De stijl (荷兰语为“风格”)是一个荷兰现代抽象运动,它将视觉构图简化为垂直和水平,只使用黑色、原色。

A “De stijl” art piece I created with p5.js

2.数据可视化

数据可视化是每个与数据打交道的人的基本技能。如果您想要创建高度交互和定制的数据可视化, d3.js 是您不应该错过的 JavaScript 库之一。

在我和我的同事参加的一次黑客马拉松中,我制作了下面这张力量布局图。我们建立了一个 NLP 模型来识别证人陈述中实体之间的相互联系,这有助于刑事法庭更快地分析案件。

Visualizing relationships between entities in witness statements.

虽然 D3 是一个强大的库,但它也有一个相当陡峭的学习曲线。但是,如果你已经知道一些 HTML,CSS 和一些基本的 JavaScript,你应该准备好拿起 d3。如果你是新来的,第一次想看看它能做什么,请访问 d3 画廊。如果你想更有条理地学习 d3,我会推荐阿米莉娅·沃特伯格的网站和书,这个网站。

3.创建人工智能生成的艺术与神经风格转移

我把画水彩画作为业余爱好。有一天,我想出了一个“绝妙”的主意,用神经风格转移来创造更多我喜欢的绘画风格的艺术(我是一个多产的艺术家!).使用预训练的 VGG16 网络,仅 10 次迭代,我得到了以下结果:

Using neural style transfer to turn a photo into your own style

结论

解决当今世界的问题不仅需要知识和技能,还需要创造力。

我觉得创造力在我们的投资组合中有时被低估了。我希望通过这篇文章,你会更有动力去尝试你脑海中的想法。不管他们有多幼稚和疯狂,你一定会学到新的东西。

感谢您的阅读!

3 种更有效的调试方法

原文:https://towardsdatascience.com/3-ways-to-debug-more-effectively-64be0edb0bc3?source=collection_archive---------20-----------------------

将改进代码调试方式的基本操作

A video version of this article, if you’re more of a visual learner 😃

大家好,我是 Sean,今天我将和大家讨论一些更好地调试代码的方法。

这里有谁因为遇到了错误而失去了学习如何编码或继续软件开发之旅的动力?我知道我肯定有。事实上,让我跟你分享一个小故事。

2012 年 3 月初的一个深夜,我正在为麻省理工学院的一门课写代码,这门课叫做 6.01:电子工程与计算机导论。32 号建筑:Stata 中心,由获奖建筑师弗兰克·盖里建造。我和一个密友在一起,他后来爱上了密码学,这个东西对他来说很自然。与此同时,我感觉自己越来越笨,社会比较偏见的倾向让我对自己的感觉加倍糟糕。我花了五个小时把头往墙上撞,当我意识到我在告诉我的代码去访问一个根本不存在的变量时,我感到非常愚蠢…

快进 7 年,我几乎每天都在写或读代码。我不能说我喜欢调试,但是实践并没有像以前那样激活这个不完善的电路。回想起来,真希望有个人让我知道发生这种事,不知道怎么解决 bug 是正常的,给我点提示。所以今天,在 2019 年的最后一个星期五,我总结了 3 种方法来帮助你更有效地调试代码,并在你进入软件工程的过程中帮助你。

读取堆栈跟踪

第一步是弄清楚如何实际读取堆栈跟踪。现在,当我还是一名初露头角的软件工程师时,如果我遇到一个错误,我会经常感到沮丧,并且肯定会觉得自己非常愚蠢。然后,在抱怨了一小会儿之后,我会读取我的堆栈跟踪。所以别说了!一旦您收到或看到一个错误,只需阅读堆栈跟踪。现在,我知道我已经说过三遍了,但我甚至不能开始强调解决问题的许多秘密就在你面前。

在 Python 中,三种最常见的错误类型是:

a.属性错误

b.输入误差

c.索引错误

现在假设您有一个属性错误。那是什么意思?好吧,让我们打个比方。假设我们有一个属性“猫”猫的属性是什么?它们有皮毛,有胡须。但是水下呼吸的特点呢?好吧,除非你有一只非常稀有的人鱼猫,否则你不可能真正找到那种属性。所以,你的程序将会对你感到非常失望,并返回 AttributeError,因为典型的对象“猫”没有这个特性!

你遇到的第二个错误是输入错误。这个很简单。基本上,这意味着你的程序不能加载你指定的模块。这通常可以通过使用“brew”、“pip install”在本地下载这些模块来解决,或者仔细检查您是否已经导入了代码体中使用的所有必需的包。

第三个问题是,指数误差。想象你有一本书,但它只有 5 页。但是,我告诉我的程序去寻找第 8 页。我的程序会生气的。为什么?因为书里只有 5 页。这是大致的想法。您只能搜索到最大值。你不能超越或超出索引。

当然,这些错误只是发生的三个最常见的 Python 错误的快照,它们的整个动物园可能就在你面前。一旦你确定了你的错误是什么,那么是时候进入第二步了。

深穿透焦点

Photo by Stefan Cosma on Unsplash

我建议的第二个行动是进行深度的、不间断的专注,持续至少 20 分钟不间断的注意力。通常,这是人们最难接受的部分,尤其是如果你有一个疯狂的猴子思维,倾向于思考随机的狗屎。我不希望你们这么做。如果你真的仔细检查你的代码,你会发现它通常会告诉你错误来自哪一行,以及模块和其他哪些依赖项有问题。当你这样做时,在 20 分钟内,你应该能够开始拼凑出你的错误是什么,你的错误是如何出现的,以及你如何修复它。

如果驾驭意志的力量对你来说太难了,那么我建议你在手机或者浏览器里设置一个计时器(谷歌计时器有一个特别烦人的闹铃)。唯一的规则是你只能思考这个 bug 20 分钟。对于那些生产力黑客来说,这是番茄工作法在调试艺术中的应用。现在,如果你已经投入了 20 分钟的不间断的、不可分割的注意力,那么这就引出了我们的第三个也是最后一个改进你的调试过程的建议。

利用社区的力量。

这个社区有两种形式。如果你和一个面对面的团队一起工作,你周围就有一个社区,还有一个指尖轻触就能接触到的社区。

现在,让我们假设你从事企业软件工作。如果你真的不知道如何解决 bug,那为什么不寻求帮助呢?例如,坐在你旁边的那个女孩可能会为你无法获得的难懂的 API 而争吵,这比你上个月从星巴克买一杯冰的大杯黑咖啡还要频繁!真的,我是认真的。

现在,这个通过指尖触摸就能进入的社区怎么样了?我指的是进入全球软件社区。你会想先看看两个关键网站: GitHub Issues,和 StackOverflow 。这些社区的好处是,你可以寻求帮助,通常在 24 小时内得到回应。同样,通过回顾人们过去遇到的类似错误和问题,您通常可以找到答案。这个故事的要点是,我们可以利用社区的集体力量,无论是直接在我们周围还是在线全球社区。

TL;用于调试的灾难恢复:

  1. 实际读取堆栈跟踪
  2. 全神贯注 20 分钟
  3. 向全球和在线社区寻求建议。

现在的问题是,如何更有效地调试?

优化和导出在线服务 BERT 模型的 3 种方法

原文:https://towardsdatascience.com/3-ways-to-optimize-and-export-bert-model-for-online-serving-8f49d774a501?source=collection_archive---------19-----------------------

Image taken from Google AI Blog

今天的主题是关于优化和导出 BERT 模型,以便根据字符串列表的预测在线提供服务。与我之前的教程不同,我将保持这篇文章简短。

本文包含以下几个部分:

  1. 问题陈述
  2. 减小微调 BERT 模型的大小。
  3. 将模型导出到 pb 文件中。
  4. 从字符串列表进行预测
  5. 结论

[第 1 部分]问题陈述

如果你一直在关注我的上一篇关于针对多分类任务微调 BERT 模型的文章,你会注意到以下问题:

  1. 输出模型比原始模型大 3 倍(适用于 BERT-Base 和 BERT-Large)。
  2. 输出模型是 ckpt 文件。你可能需要一个 pb 文件。
  3. 该代码是基于读取一个输入文件和输出概率到输出文件。您可能需要单个输入文本,而不是单个概率输出。

通过阅读这篇文章,你将学会解决上述问题。说到这里,本文不涉及以下内容:

  1. 如何使用导出的 pb 文件?
  2. 如何加快推断时间?
  3. 如何在线上为模特服务?

[第 2 节]减小微调 BERT 模型的大小

根据来自 BERT 团队的一名成员提供的响应,由于每个权重变量包含了亚当动量方差变量,微调后的模型比分布式检查点大 3 倍。暂停和恢复训练都需要这两个变量。换句话说,如果您打算在没有任何进一步训练的情况下服务于您的微调模型,您可以移除变量和,大小将或多或少类似于分布式模型。创建一个 python 文件,并在其中键入以下代码(相应地进行修改):

由于内存问题,建议在终端/命令提示符下运行它,而不是在 jupyter notebook 中运行(如果遇到无法加载张量的错误,只需通过 cmd 运行它)。

您应该得到如下 3 个 ckpt 文件(取决于您在 saver.save 过程中设置的名称):

  1. model . ckpt . data-00000/00001
  2. 模型.检查点.索引
  3. model.ckpt.meta

[第 3 节]在 pb 文件中导出模型

对于那些喜欢 pb 图的人来说,从下面的链接下载 py 文件(功劳归于原创者)。将它放在您选择的目录中,并在终端中运行以下命令:

CUDA_VISIBLE_DEVICES=0 python model_exporter.py --data_path=./bert_output/ --labels_num=3 --export_path=./model_export/pb_graph/

您需要修改三个参数:

  1. data_path :包含三个 ckpt 文件的微调模型的路径。我把所有的文件都放在 bert_output 文件夹里。
  2. 标签:你拥有的标签数量。我有三节课。
  3. 导出路径:输出模型的路径。它将被自动创建。如果遇到与输出路径相关的错误。请从目录中删除输出路径。

完成后,您应该有一个包含以下文件的 pb_graph 文件夹:

  1. 保存 _ 模型. pb
  2. 变量

在下面的 github 链接中,主人做了一个脚本,可以用来训练一个多标签分类的 BERT 模型。基于当前模型,我们只能执行多分类任务,即来自所有类别的单个标签。如果您打算从所有的类中预测多标签,您可以尝试使用这个脚本。在我写这篇文章的时候,我还没有测试过它,但是你可以自己探索它。

[第 4 节]从字符串列表预测

本节是关于对字符串列表执行推理,而不是从文件中读取。在与 run_classifier.py 相同的目录中创建另一个 py 文件,并键入以下内容:

该函数接受字符串列表作为参数。让我们看看函数的每一行:

  1. 使用列表理解遍历列表中的每个元素,并将其转换为功能转换所需的适当格式。
  2. 根据标签、最大序列长度和标记化将其转换为预测所需的特征。稍后我们将初始化所需的变量。
  3. 创建一个要传递给 TPUEstimator 的 input_fn 闭包。
  4. 基于输入要素执行预测。

转换时间通常很长,这取决于你的内存和 GPU。如果您打算进一步优化它,请检查convert _ examples _ to _ featuresinput_fn_builder 。供您参考,上面提到的两个功能消耗的时间和内存最多。

我们现在将初始化所需的变量。继续添加以下代码:

完成后,最后一部分是调用 getListPrediction 函数,将一个列表作为参数传递:

pred_sentences = ['I am a little burnt out after the event.']result = list(getListPrediction(pred_sentences)))

您需要将结果转换为列表才能查看。您应该能够获得以下结果(3 个类的示例):

[{'probabilities': array([2.4908668e-06,
       2.4828103e-06, 9.9996364e-01], dtype=float32)}]

结果表示每个标签的概率,最高的是预测标签。您可以简单地使用输出结果并将其映射到相应的标签。

[第五节]结论

正如我前面提到的,这是一篇相当短的文章,为了在线服务,它解决了一些与 BERT 相关的问题。如果你有兴趣通过 GPU 优化加快推理时间,敬请查看以下链接。请记住,来自 BERT 的团队成员之一已经冻结了存储库,以防止任何代码失败。然而,将来可能会有一个单独的存储库,其中包含 GPU 优化的代码。请继续关注更多关于编程和人工智能的文章!

伯特相关的故事

  1. 针对多分类任务的 BERT 初学者指南

参考

  1. https://towards data science . com/beginners-guide-to-Bert-for-multi-class ification-task-92f 5445 c2d 7 c
  2. https://github.com/yajian/bert
  3. https://github.com/google-research/bert/issues/99
  4. https://github.com/google-research/bert/issues/63
  5. https://github.com/google-research/bert/issues/146
  6. https://github.com/google-research/bert/pull/255

通过数据讲述的 3 个温网故事

原文:https://towardsdatascience.com/3-wimbledon-stories-told-through-data-d127fe61584c?source=collection_archive---------23-----------------------

我们创建了一个交互式数据 viz 工具来比较各个国家的网球成功率

大满贯网球比赛的统计数据为无数的数据故事提供了弹药。通过观察不同时期国家的成功,男子和女子比赛的区别;四个不同比赛之间的比较。

我们创造了这个工具来更容易地获取大满贯赛事的大量可用数据——正好赶上温布尔登。

首先,如何使用我们的工具“大满贯统计”

点击这里的大满贯统计链接:【https://jpvsilva88.github.io/tennis/

创建自己的图表来浏览数据很简单。点击上面的链接,然后从以下选项中选择:

  • 女子或男子网球;
  • 四大满贯赛事;
  • 一次最多来自五个国家;和
  • 第一轮 128 名参赛者将角逐年度冠军

然后,您的选择将在您刚刚创建的图表上方显示为一个方便的摘要。

为了获得灵感,这里有三个我们在探索工具时发现的温网故事。所以买些草莓和奶油,继续读下去。

法国现在比英国拥有更多的温布尔登男子选手

邻居之间的角色互换

英国(上图中橙色部分)长期以来一直是其主场大满贯赛事的最大亮点,有大量男性参加了首轮 128 场比赛。东道主在一定程度上得益于东道国允许向没有直接进入锦标赛的球员发放的通配符数量。在整个 70 年代和 80 年代,英国经常有超过两倍的法国人(蓝色),即使其数量在下降。

但在 1991 年,法国首次超过了英国。自那以后,随着新一代法国球员加入这项运动,如 2003 年的盖尔·蒙菲尔斯和 2007 年的乔-威尔弗雷德·特松加,法国仅 5 次落后于英国,自 2000 年以来从未落后过。

许多美国女选手开始从温布尔登的颓势中恢复过来

威廉姐妹的成功掩盖了美国人数的急剧下降

上图关注的是通过第一轮的女性。许多年来,这个舞台明显被美国玩家(蓝色)的绝对数量所主导。尽管塞雷娜·威廉姆斯(Serena Williams)和维纳斯(Venus)在 2000 年代和 2010 年代初赢得了最多的温布尔登冠军,但这掩盖了美国女性的整体数量在这一时期完全崩溃的故事。2013 年,美国被捷克共和国(orange)超越,该国在当年的 64 轮比赛中拥有最多的女选手。

这种趋势不只是在温布尔登,而是在所有大满贯比赛和美国男子比赛中。但与男性不同的是,在过去几年中,美国女选手的数量开始回升。所以也许这只是一个暂时现象,美国不应该太担心没有威廉姆斯姐妹的未来?

今年表现出色的俄罗斯女性都去哪里了?

俄罗斯女性不再填补美国女性在温布尔登留下的空白

在 21 世纪初,当美国女性人数下降时,后苏联时代的俄罗斯(橙色)开始在温布尔登填补这一空白。正如第二张图表所提到的,俄罗斯超过了美国,在一段时间内是表现最好的国家——2008 年有 9 名女性进入第三轮 32 人。但自 2000 年代末达到峰值后,数量有所减少。

尽管今年温布尔登有 11 名女性参赛,但这是自 1995 年以来俄罗斯首次在 32 强赛中没有女性参赛。相比之下,这是中国(蓝色)第一次在这个阶段比俄罗斯更成功,张帅和王蔷进入了 32 强。

找到自己的趋势:【https://jpvsilva88.github.io/tennis/】T2

我们如何创建我们的数据,即?

我的搭档若昂是一个狂热的网球迷,他做了所有繁重的工作来创造这个工具。这些数据可以在杰夫·萨克曼的 GitHub 账户上找到。React 用于处理数据并设计了工具,使用漂亮的 recharts 作为图表库。它是在 GitHub 上托管的,我们会手动添加新的温布尔登结果。

喜欢你看到的吗?以下是若昂在推特上的网球#dataviz:

奥利弗·卡林顿&若昂·席尔瓦公司

30 个有用的 Python 片段,你可以在 30 秒内学会

原文:https://towardsdatascience.com/30-helpful-python-snippets-that-you-can-learn-in-30-seconds-or-less-69bb49204172?source=collection_archive---------1-----------------------

Photo by Jantine Doornbos on Unsplash

Python 代表了最流行的语言之一,许多人在数据科学和机器学习、web 开发、脚本、自动化等领域使用它。

这种流行的部分原因是它的简单性和易学性。

如果你正在阅读这篇文章,那么很有可能你已经在使用 Python 或者至少对它感兴趣。

在本文中,我们将简要地看到 30 个简短的代码片段,您可以在 30 秒或更短的时间内理解和学习。

1.全部独一无二

下面的方法检查给定的列表是否有重复的元素。它使用 set() 的属性从列表中删除重复的元素。

2.字谜

这个方法可以用来检查两个字符串是否是字谜。变位词是通过重新排列不同单词或短语的字母形成的单词或短语,通常使用所有原始字母一次。

3。内存

这个片段可以用来检查一个对象的内存使用情况。

4.字节大小

这个方法以字节为单位返回字符串的长度。

5.打印一个字符串 N 次

这个代码片段可以用来打印一个字符串 n 次,而不必使用循环来完成。

6.首字母大写

这个代码片段简单地使用了方法 title() 来大写字符串中每个单词的首字母。

7.矮胖的人或物

这个方法将一个列表分成指定大小的更小的列表。

8.小型的,紧凑的

该方法通过使用 filter() 从列表中删除虚假值(False、None、0 和" ")。

9.按...计数

这个片段可以用来转置一个 2D 数组。

10.链式比较

您可以在一行中使用各种运算符进行多重比较。

11.逗号分隔

该代码片段可用于将字符串列表转换为单个字符串,列表中的每个元素用逗号分隔。

12.获取元音

此方法获取在字符串中找到的元音(' a ',' e ',' I ',' o ',' u ')。

13.取消资本化

这个方法可以用来把给定字符串的第一个字母变成小写。

14.变平

下列方法使用递归展平潜在的深度列表。

15.差异

该方法通过只保留第一个 iterabless 中的值来找出两个 iterable 之间的差异。

16.差异由

以下方法在给定函数应用于两个列表的每个元素后,返回两个列表之间的差异。

17.链式函数调用

您可以在一行中调用多个函数。

18.有重复

下面的方法通过使用 set() 只包含唯一元素的事实来检查列表是否有重复值。

19.合并两本词典

下面的方法可以用来合并两个字典。

在 Python 3.5 及更高版本中,您也可以像下面这样做:

20.将两个列表转换成字典

下面的方法可以用来将两个列表转换成一个字典。

21.使用枚举

这个代码片段显示了您可以使用 enumerate 来获取列表的值和索引。

22.花费的时间

这个代码片段可以用来计算执行特定代码所花费的时间。

23.试试别的

您可以将 else 子句作为 try/except 块的一部分,如果没有抛出异常,就会执行该子句。

24.最频繁

该方法返回列表中出现最频繁的元素。

25.回文

这个方法检查一个给定的字符串是否是回文。

26.不带 if-else 的计算器

下面的代码片段展示了如何编写一个简单的计算器,而不需要使用 if-else 条件。

27.洗牌

这个代码片段可以用来随机化列表中元素的顺序。注意,shuffle 在原地工作,并返回 None

28.传播

这个方法类似于[]地展平列表。JavaScript 中的 concat(…arr)。

29.交换值

这是一个真正快速的交换两个变量的方法,不需要额外使用一个变量。

30.获取缺失键的默认值

这个代码片段展示了在字典中没有您要查找的键的情况下,您如何获得一个默认值。

这是一个简短的清单,你可能会发现在你的日常工作中有用的片段。它高度基于这个 GitHub 库,在这里你可以找到许多其他有用的代码片段,包括 Python 和其他语言和技术。

感谢您抽出时间阅读。

请关注我的 推特

机器学习初学者的 30 个袖珍术语

原文:https://towardsdatascience.com/30-pocket-sized-terms-for-machine-learning-beginners-5e381ed93055?source=collection_archive---------33-----------------------

我先声明一下这篇文章不是是什么,然后我再提一下这篇文章能为做什么。

这篇文章并不是你必须知道的机器学习术语的全面列表。这篇文章并没有充斥着伴随着数学符号和公式的教科书定义。现在这个问题已经解决了。往好的方面想。

这篇文章一个以简单方式定义的术语列表,便于回忆。在你去面试的路上,可以随意使用这个列表来更新关键词和定义。或者,也许你已经是一名血统数据科学家或机器学习专家,但你想重温你的基础。或者你想打发时间。

与任何需要这篇文章的人分享这篇文章。还有,在评论区多加一些定义,帮助别人,炫耀自己的技能。

神经元:在深度学习和机器学习的世界中,神经元可以被描述为一个处理单元,它是神经网络的基本构建模块之一。

权重:这些是神经元间连接的强度。它们是神经网络中存储知识的关键元素。

神经网络:神经元(处理单元)的集合,能够保持知识。它们也可以被描述为并行分布式处理器。

机器学习:是实现计算机算法或指令的科学,这些算法或指令被编排成从数据中学习,其中算法被用于与它从其学习的数据相关的任务。

深度学习:这是机器学习的一个领域,算法利用几层神经网络从输入数据中提取更丰富的特征。深度学习技术的例子是卷积神经网络(CNN)和递归神经网络(RNN)

监督学习:这是用标注了标签的数据来训练机器学习算法。数据的注释通常由专家系统提供,例如人或外部系统。分类任务是监督学习任务的一个例子。

无监督学习:为处理这种类型的学习而设计的算法具有内置的自组织特性。这些算法根据在数据中检测到的模式自我组织数据,而不需要专家系统的参与。

半监督学习:半监督的机器学习算法由未标记和标记的训练数据组成。与未标记的训练数据相比,在训练数据集的分布中标记数据的频率通常在较小的规模上。

强化学习:这是一种机器学习技术,涉及被称为代理的已定义程序。这些代理人被放置在一个环境中,并受通过与环境的相互作用来增加奖励这一概念的支配。代理的目的是尽可能积累奖励。还有负面奖励或惩罚的形式。代理人的任务是改善其管理系统,随着时间的推移收集奖励,并避免处罚。

批量学习:这是一种向机器学习算法的网络呈现训练数据的方法。累积的训练数据被一次全部馈送到机器学习算法,并且一旦所有训练数据被前馈,就对被训练的网络的偏差和权重进行改变。

在线学习:这种向网络呈现训练数据的方法是以增量方式进行的。训练数据被分成称为小批量的组,并且一旦小批量已经通过网络馈送,就对网络的权重和偏差进行更新,然后向前馈送另一个小批量。重复该过程,直到所有小批量通过网络。

一般化:机器学习算法和模型可以基于对它们在看不见的数据上的性能的测量来分类。

模型:这可以描述为在数据集中观察到的一般化模式的数学表示。

基于实例的学习(基于记忆的学习):机器学习系统可以基于对在训练阶段呈现给算法的训练数据内的模式的观察来进行归纳。这些模式(实例)可用于通过基于在测试期间呈现的新实例计算一些相似性度量分数来提高机器学习算法的泛化能力,其中新实例用于训练。据说该算法可以根据训练过程中以前的观察实例对新实例进行预测。

基于模型的学习:与基于实例的学习相反,实现可以概括的系统的另一种方法是使用基于数据集生成模型,并使用该模型来处理诸如预测之类的任务。

数据集:这是包含相关元素的信息集合,机器学习算法可以将这些相关元素视为单个单元。

特征:这是一个对象、观察或数据集的可测量的决定性特征。

训练数据集:这是我们用来直接训练神经网络的数据集组。在使用卷积神经网络进行分类的任务中,网络将学习训练集数据的图像和标签关系。这些是网络在训练中看到的数据集组。

验证数据集:这是我们的一组数据集,在训练期间用来评估我们的网络在训练期间各个阶段的性能。这组数据集是必不可少的,因为它是网络模型过拟合和欠拟合等问题的指示器。

测试数据集:在训练阶段完成后,我们利用这组数据集来评估我们网络的性能。

欠拟合:当机器学习算法无法学习数据集中的模式时,就会出现这种情况。可以通过使用更适合该任务的更好的算法或模型来修复欠拟合。还可以通过识别数据中的更多特征并将其呈现给算法来调整欠拟合。

过拟合:这个问题涉及算法预测呈现给它的模式的新实例,过于基于它在训练期间观察到的模式的实例。这可能导致机器学习算法无法准确地推广到看不见的数据。如果训练数据没有准确地表示测试数据的分布,则会发生过度拟合。可以通过减少训练数据中的特征数量以及通过各种技术降低网络的复杂性来修复过拟合。

正则化:在机器学习中,正则化是一种通过使网络的权重仅取小值或具有小数量级的值来降低网络复杂性(从而防止过度拟合)的技术。通过对网络中权值的限制,我们可以使网络更简单,从而降低复杂性。在权重值高于某个数字的情况下,通过将成本/惩罚应用于损失函数,在网络内实现正则化。我们通过应用正则化来减少大值权重对网络的贡献,这可以减轻过拟合。

超参数:这些是在网络训练开始之前定义的值;它们被初始化以帮助引导网络达到积极的训练结果。它们的作用在机器/深度学习算法上,但不受算法影响。他们的价值观在训练中不会改变。超参数的例子是正则化值、学习率、层数等。

网络参数:这些是我们网络的组件,不是手动初始化的。它们是嵌入的网络值,由网络直接操纵。网络参数的一个例子是网络内部的权重。

地面实况:这是一个数据集内的元素,通过观察进行注释。在机器学习中,通过比较算法提供的推理结果和基本事实中包含的观察结果,基本事实数据被用于测量算法预测的准确性。

混淆矩阵(误差矩阵):提供了对分类器结果的基本事实注释的匹配或不匹配数量的可视化说明。混淆矩阵通常以表格形式构造,其中行用来自地面实况的观察结果填充,列用来自分类器的推断结果填充。

Precision-Recall: 这些是用于评估分类算法、视觉搜索系统等的性能指标。以评估可视化搜索系统(基于查询图像查找相似图像)为例,precision 捕获返回的相关结果的数量,而 recall 捕获数据集中返回的相关结果的数量。再读一遍。

采样偏差:这可能发生在数据采集过程中。抽样偏倚可以描述为在一个数据集中特定成员或子群的有限代表性的出现。数据集可以说是以一个子集在数量上对另一个子集有意义的方式分布的。随机抽样技术可以防止抽样偏差。

反向传播:一种算法,其目的是通过有效地计算使网络成本函数最小化的梯度,在神经网络内实现学习能力。

阅读这篇文章了解计算机视觉的介绍。

前列腺癌在 PROSTATEx-2 上的 3D CNN 分类

原文:https://towardsdatascience.com/3d-cnn-classification-of-prostate-tumour-on-multi-parametric-mri-sequences-prostatex-2-cced525394bb?source=collection_archive---------19-----------------------

多参数磁共振序列的三维 CNN

内容

本文描述了在多参数 MRI 序列上使用 3D CNN 对前列腺癌进行显著或不显著的分类。内容如下:

  • 数据集描述
  • Dicom 到 Nifti 文件格式的转换
  • 不同磁共振成像序列的配准
  • 围绕损伤中心裁剪并调整大小至 30 毫米乘 30 毫米
  • 二元标签提取
  • 训练-验证分割
  • 3D CNN 架构
  • 结果

数据集描述

使用的数据集取自前列腺素-2 — SPIE-AAPM-NCI 前列腺素 MR Gleason 等级组挑战赛。数据集由 162 名患者组成,其中 99 名患者作为训练案例,63 名患者作为测试案例。MRI 序列由一系列 2D 扫描组成,这些扫描以 3D 形式描绘了身体的一部分。每位患者有五种 MRI 序列模式:

(left) demonstration of MRI sequences, (middle) demonstration of views, (right) five modes of MRI in PROSTATEx-2 dataset

  • T2 加权横向序列
  • T2 加权矢状序列
  • ADC 横向序列
  • DWI 横向序列
  • Ktrans 横向序列

由于 T2 横切面、ADC、DWI、KTrans 都是前列腺的横切面视图,所以它们被一起用于对前列腺病变进行分类。没有使用 T2 矢状序列,这是前列腺的侧视图。

每个患者在他或她的 MRI 序列中可能有一个以上的病变发现。在随附的 CSV 文件中,每个病灶都标有:

  • 格里森等级组(GGG)1-5(1 为最有利,5 为最不利),
  • 以及图片中病变中心的 X、Y、Z 坐标。

Dicom 到 NIFTI 文件格式的转换

T2、ADC、DWI 序列采用 Dicom 文件格式,KTrans 采用 MHD 文件格式。所有的 DICOM 文件和 MHD 文件首先使用 MRIcoGL(【https://www.nitrc.org/projects/mricrogl/】)转换成 NIFTI 文件,MRIcoGL 使用 dcm2niix 将 Dicom 转换成 NIFTI。

提示:打开 MRIconGL.exe=>Import= >将 Dicom 转换为 NIFITI,将数据集的根文件夹转储到白色窗口空间,并等待转换完成,这将需要一段时间。然后用 python 脚本组织你的 Nii 文件(不是最好的方法)。或者,您可以尝试使用 dicom2nifti python 包用 python 脚本进行转换。

不同磁共振成像序列的配准

由于不同的横向 MRI 模式具有不同的尺度和不同的位置,因此需要配准步骤来对准不同的模式。仿射变换用于将 ADC 序列、DWI 序列和 Ktrans 序列与 T2 序列对齐。然后这四种模式作为一个 NumPy 阵列相互堆叠。堆叠式 NumPy 阵列类似于三通道图像文件,其中红色、蓝色和绿色通道对应于 T2、ADC 和 DWI。然而,还有第四个渠道,即 Ktrans。

(top row) unregistered T2, ADC, DWI images, (btm row) co-registered T2, ADC, DWI, depicted as three channels of an image file. Ktrans is left out only in this depiction but it is used and will be shown later on.

import nibabel as nib
import os
from dipy.align.imaffine import AffineMappatients = os.listdir("D:\ProstateX2")
stack = []
for i in patients:
 directory = “D:\\ProstateX2\\” + i
 s = os.listdir(directory)
#Load T2.nii file
 t2 = nib.load(“D:\\ProstateX2\\” + i+ “\\” + s[7])
#Load ADC.nii file
 ADC = nib.load(“D:\\ProstateX2\\” + i+ “\\” + s[3])

 t2_static = t2.get_data()
 t2_static_grid2world = t2.affine

 ADC_moving = Diff1.get_data()
 ADC_moving_grid2world = ADC_moving.affine
 identity = np.eye(4) ADC_affine_map = AffineMap(identity, t2_static.shape,         t2_static_grid2world, ADC_moving.shape, ADC_moving_grid2world)

 transformADC = ADC_affine_map.transform(ADC_moving)

 out= np.stack([static.transpose(2,0,1), transformADC.transpose(2,0,1) axis=-1)

 stack += [patient]

围绕病变中心裁剪并调整大小至 30 毫米乘 30 毫米

columns: stacked mode (comprising T2, ADC, DWI, Ktrans), T2 mode, ADC mode, DWI mode, KTrans mode; rows: ProstateX-0000 co-registered, ProstateX-0000 cropped and resized, ProstateX-0199 co-registered, ProstateX-0199 cropped and resized

由于每个病变在序列中都有 x、y、z 坐标标签,因此可以识别病变中心,并用蓝色圈出。每个军团病例将有 30 毫米乘 30 毫米的真实世界长度,以病变为中心。由于 T2 序列的分辨率对于所有患者都不相同,所以图像的每个像素代表真实世界长度中的不同毫米。要裁剪的像素数将由公式给出:30/pixel_spacing其中pixel_spacing是在附带的 CSV 文件中给出的每个像素代表的毫米数。在病变中心裁剪所需数量的像素后,所有裁剪的图像都被调整到 60X60 分辨率,这是裁剪后最常见的分辨率。

此外,将只保留病变中心 z 坐标上下的 2 个切片。因此,裁剪和调整大小将导致 5X60X60X4 分辨率的立方体被馈送到 3D CNN 模型。最后一个通道 4 对应于每个像素上的堆叠通道(T2、ADC、DWI、Ktrans)。裁剪到较小的立方体大小将会有更集中的感兴趣区域,这将有助于模型更好地分类。

标签提取

给出的标签是每个病变发现的 GGG(1-5)。当 GGG 为 1 时,病变发现可进一步分组为无临床意义,当 GGG 大于 1 时,可进一步分组为有临床意义。当比较 PRSTATEx2 和 PROSTATEx 的结果时可以看出这一点,因为它们具有相同的病例。然后,根据基于 GGG 发现的它们是否具有临床意义,将每个损伤病例重新标记为真或假。对于二元标记,未来的任务是对病变是否具有临床意义进行二元分类。

训练-验证分割

该数据集由 99 名患者的 MRI 序列组成,但是每个患者在他或她的 MRI 序列中可能有一个以上的病变发现。如预处理步骤中所述,总共呈现和提取了 112 个发现。这 112 项发现分为 78 项用于培训的发现和 34 项用于验证的发现。

3D CNN 架构

3D CNN architecture

建议的架构如图所示。输入形状是 Batch_SizeX5X60X60X4。输入通过一系列 1x3x3 和 3x3x3 内核,然后是 Maxpool3D 层和另一系列 1x3x3 内核来扩展特性空间。然后,扩展的特征空间被展平,通过 64 个密集节点,最后通过 SoftMax 激活 2 个密集节点。交叉熵用于 SoftMax 输出的损失函数。

结果

验证集上的混淆矩阵和度量分数如下:

Confusion Matrix on the validation set

真阳性、假阴性、真阴性和假阳性打印在左侧。结果显示,虽然很难单独从每种模式中分辨出病变应该是阳性还是阴性,但是当应该是阳性(真阳性和假阴性)时,堆叠模式显示的白色多于灰色,而当应该是阴性时,堆叠模式显示的灰色多于白色。这可能是一个明显的迹象,表明多参数 MRI 可能比单一模式的 MRI 扫描更好地对前列腺癌进行分类。

3d 打印。人工智能:走向超越智能的开源、大规模 3d 打印

原文:https://towardsdatascience.com/3dprint-ai-towards-open-source-large-scale-3dprinting-beyond-intelligence-1c692d0ac324?source=collection_archive---------24-----------------------

第一/二部分:理论部分

这篇文章是圣乔治·德拉孔泰迪斯在巴特利特建筑学院正在进行的研究的一部分,研究集群 I (RCI),2019 年。

Figure 1. AI matrix.

“数字之后还有更多数字,要么我们喜欢,要么不喜欢”(Carpo,2018)

摘要

在制造业数字化革命的门槛上,增材制造等新兴技术极大地改变了设计和制造(Gershenfeld,2015)。然而,当前增材制造在成本、时间和质量方面的局限性限制了其未来的发展,尤其是其大规模实施。从上述问题产生了本论文的假设,即机器学习算法的技术进步和开源社区的开放创新有可能彻底改变大规模增材制造,使其能够塑造制造的未来。为了检验这一假设,本文引入了 3Dprint。AI 是一个用于大规模增材制造的开源机器学习框架,旨在以可持续和负担得起的方式在建筑规模上让用户和技术参与增材制造的应用。

3d 打印。人工智能有两种工作模式,手动和自动。它包括以下步骤:I)打印时的视频记录和对象识别,ii)对机器人的自适应反馈,iii)所有打印设置和结果的文档,以及 iv)通过 google sheet 文件(手动模式)或通过在线分布式网络分发这些设置,以使机器学习算法能够使用它们来进行预测(自动模式)。3Dprint.AI 在高质量挤出机的设计和开发中实施,这需要在手动模式下集成上述步骤。进行印刷测试以创建数据集,用于预测挤出结果和训练社区的机器学习算法。论文最后建议将软件开发作为上述开源框架的附加操作,这可以节省计算能力并为社区赚取收入。

关键词:机器人 3d 打印,增材制造,人工智能,开源,创新,区块链,大规模制造

内容

01|简介

  • 1.2 假设
  • 1.1 定义
  • 1.3 方法
  • 1.4 步骤
  • 1.5 预期捐款

02|背景

  • 2.1 问题陈述
  • 2.2 历史和社会背景
  • 2.3 关于主旨的辩论
  • 2.4 大规模 AM、设计制造中的机器学习、开源社区中的轨迹

03 |打印。面向大规模增材制造的开源机器学习框架 AI

  • 3.1 一般描述
  • 3.2 技术规范:步骤
  • 3.3 社区和数据的组织
  • 3.4 问题和挑战

04|执行:手动模式

  • 4.1 挤压机
  • 4.2 实施步骤
  • 4.3 评估和进一步措施

05|结论

  • 5.1 贡献
  • 5.2 结束语

参考书目

图片来源

……………………………………………………………………………………….

1|简介

Figure 2. Robots, production line.

1.1 定义

“机器学习(ML)是使用算法来解析数据、从中学习并做出决定或预测的实践。机器使用大量数据和算法进行“训练”。’(Copeland,2016)。

增材制造(AM)是将材料连接在一起,根据三维模型数据制造物体的过程,通常是一层又一层,与减材制造方法相反(Wohlers Associates,
2010 年)。

机器人 AM 是一种使用工业机器人的附加制造工艺,因为工业机器人具有高速度、高精度和多轴运动自由度以及
大规模。在本文中,术语“大规模 AM”完全指机器人 AM。

1.2 假设

Gershenfeld (2012 年)宣称制造领域将迎来一场新的数字革命,而 Bitonti (2016 年)则否认了这一说法,称 AM 等技术的全部潜力才刚刚开始被发现。尽管 AM 有着明显的前景,但它的局限性仅限于原型规模。Bitonti (2016)指出,尽管 AM 具有大规模应用的
潜力,但由于其局限性,行业仅将其用作原型技术。

Anderson (2102)证明了硬件和软件的开放式创新可以在全球制造商的框架内增强现有技术的能力,如 AM。然而,即使计算能力和算法的可用性使机器学习的应用充满希望,它仍然是一个概念和技术挑战。为了克服这些障碍,本文引入了 3Dprint。AI,一个用于大规模增材制造的开源机器学习框架,可以加速其发展,并最大限度地减少其局限性。3d 打印。人工智能框架是在 AM 在取得实质性进展以强烈和决定性地挑战所有其他减法制造技术时面临众多限制的时候创建的。

本论文的动机是通过创建一个在线平台,让用户和实验室可以交换关于大规模实施 AM 的硬件和软件的数据和
知识,从而将 AM 带入架构规模。然而,本文的目的不是创建平台,而是研究平台运行的框架所带来的挑战。

Figure 3. MX3D robot prints steel bridge.

1.3 方法
针对大规模 AM 的机器学习框架的提议借鉴了几个相关领域的研究。本文将开放硬件和软件中的 DIY 文化、数字设计中的机器学习趋势以及机器人技术在数字制造中的应用结合在一起,提出了一个框架,该框架通过挑战行业的现状,有可能将 AM 提升到建筑规模。

论文的分析轴围绕以下问题——开源创新和机器学习算法能否推进大规模 AM?

本文的批评视角集中在大规模 AM 开放社区是否可能的问题上。除了阻止用户参与的技术问题之外,还有任何道德问题吗?用户会信任区块链网络来分发数据或参与社区所需的高技能,但仍然保持一定程度的不可访问性吗?如何有效地满足社区的财政需求?

作为寻找这些问题答案的书目研究的替代方法,在提出并详细讨论本论文的想法后,在 2019 年 Autodesk 大学会议上进行了两次民意调查,一次是关于“制造的未来”,另一次是来自 Bartlett 学生的民意调查。尽管由于参与人数有限,民意调查的结果不可能完全客观,但对民意调查的回应表明了机构群体潜在成员的想法。

最后,大部分的 3Dprint。人工智能操作使用为第一研究组的所有学生开发的挤压机手动执行。在研讨会上,使用其他组的挤压机结果创建社区受到了批评。挤出机的上述设计被提供给了其他学生,他们在有益的智力环境中迅速获得了空间印刷的技能,并在车间中交换了设计和数据。

1.4 步

论文按以下步骤展开:

第二章将对论文的内容进行历史性的架构,同时讨论该架构的主要观点。大规模 AM、机器学习和开源社区中的轨迹将被分析和批评。

第三章将介绍 3d 打印。人工和自动模式下的人工智能框架。它将分析社区和数据的组织。它将提出技术和伦理挑战,并分析其经济效率的计划。

第 4 章将介绍挤出机,该挤出机是为 RC1 开发的,以手动模式实现了框架的大部分步骤。它将评估巴特利特的 B 制作工作室的经验,在那里所有的设计都给了来自其他集群的学生。

第五章将对本文所描述的研究进行评价和批评,最后为框架的未来发展指明道路。

1.5 预期捐款

这项研究旨在吸引三类不同的读者。对于建筑师——设计研究人员,旨在质疑数字制造的现有限制,并说明创建开源社区的潜力,以便在 AM 中应用机器学习,推动设计和制造超越当前的限制。对于人工智能领域的研究人员和程序员来说,本论文旨在让他们了解人工智能的问题,并激励他们在人工智能中实现机器学习算法,从而实现人工智能的革命。对于制造商和思想家来说,它旨在展示一个使用机器人 AM 大规模制造东西的框架,同时明确强调它的挑战、危险和前景。

02|背景

Figure 4.Detail of Daedalus Pavilion, Ai build 2016.

2.1 问题陈述

文章的问题陈述是基于大规模 AM 实现中历史上一直存在的问题;尽管它在原型规模上不断获得动力。与此同时,根据 Carpo (2017)的说法,机器学习算法已经得到发展,并成功应用于从数字设计到制造的许多不同领域。此外,Anderson (2012)认为开源社区已经彻底改变了代码和系统,用户之间的在线交互可以带来巨大的创新。因此,本文研究了开放式创新和人工智能算法能否应用于大规模敏捷制造并加速其发展的问题。

2.2 关于框架主旨的辩论

一方面,可以假设后数字时代的计算能力和算法创新可以导致使用 AM 的巨大创新。然而,另一方面,希伯伦(2016)指出,机器学习算法需要更深入地探索,因为根据研究人员的说法,它们仍处于原始阶段。

此外,尽管 AM 往往是创新的来源,但成本和过程的复杂性阻止了人们对其进行实验(Rayna,Striukova 和 Darlington,2015)。事实上,学习使用 3d 打印机或机器人所需的技能往往既耗时又费力。因此,用户往往很快对这种机器失去兴趣,宁愿不使用它们。然而,数字平台可以帮助克服这些困难,因为大多数时候,它们使用户之间能够进行多次互动,就特定问题交换知识和想法,并快速获得技能(斯尔尼塞克,2017)。许多数字公司,如谷歌,服务初创公司如优步,以及制造业,如西门子,已经开始使用平台向客户介绍他们的服务和产品,指导他们,使他们的服务和产品更容易被人们接受(斯尔尼塞克,2017)。

此外,用于大规模 AM 的开源机器学习框架往往是技术复杂且计算密集的过程。因此,在其创建过程中的每一步都可能出现的技术问题会使框架不起作用,只是浪费时间和精力。然而,Pearson (2016)指出,开源社区内部的治理可以将解决技术问题的责任分配给社区用户,以便将概念转换为功能模型,因为开源环境的灵活性使系统的修改变得简单而快速。

然而,可以假定,在开源社区中,由于知识产权的丧失而出现的伦理问题,它所产生的系统的不可靠性和易腐败性,以及用户缺乏伦理-经济回报,正在成为吸引社区更广泛参与的严重障碍。此外,以意想不到且通常非法的方式使用技术的可能性——例如未经授权开发枪支——会危及公共安全。然而,Pearson (2016)认为,在开源环境中,有特定的等级规则、数据保护和用户评估,以确保社区的道德和法律方面。

03 |打印。大规模增材制造的开源机器学习框架。

Figure 4. 3Dprint.AI framework.

3.1 一般描述

3d 打印。人工智能是作为一个概念框架引入的,它使用机器人手臂进行打印,从技术上讲,它具有实际实施的潜力。3d 打印的想法。AI 于 2019 年 6 月在 Autodesk 大学会议上发表,下面介绍的讲座观众投票是对论文论点的反馈。

作为一个开源框架,3Dprint。AI 旨在连接实验室、机构、公司、初创企业,甚至是单一的、经过验证的用户。在世界各地的大学和工业中,从事大规模 AM 实验的实验室感到缺乏专注于该技术的框架是转换 3Dprint 的障碍。人工智能变成了有前途的
和技术上可行的技术。

3d 打印。AI 工作在两种模式下——使用机器学习算法的全自动模式和人工模式(图 6)。这些模式被合并到以下步骤中:I)打印时的记录和对象识别过程,ii)自适应反馈过程,iii)打印设置的文档,以及 iv)通过 Google sheets-手动模式或区块链网络-自动模式保存-分发数据。保存后,可以通过机器学习算法或人工对数据进行批判性研究,对数据进行处理,以改进设置并进行预测。手动模式可以在社区开始时使用,此时有少量数据,并且还没有编写和测试适当的算法。像大多数开源社区一样,3Dprint。AI 足够灵活,可以根据 3Dprint 未来实施的需要添加或删除步骤。

如上所述,其真正的创新在于实时识别印刷错误并预测未来结果,同时所有信息均可用于社区。成员可以向社区贡献数据,同时他们也可以测试算法做出的预测。通过这种方式,经过多次迭代后,社区将有可能开发一种使用机械臂进行空间挤压的软件,填补该领域的现有空白,并使用户更容易使用空间挤压。

框架所需的工具是一个机械臂、一个挤压机和一台计算机。一开始,机械臂可以是 6 轴机器人。挤压机可以由社区制作,供所有成员共享使用。使用相同的硬件,以避免冲突。过程的每一步都很重要,需要高精度的设置和工具,因为每一个可能的错误都会导致不同的结论和决定。下面讨论这个框架的技术、组织和伦理问题。

Figure 6. The 3dprint.AI framework.

3.2 技术规范:步骤

I)打印记录和对象识别

安装在机械臂挤压机附近的摄像机用于近距离记录所有过程。在自动模式下,相机将所有记录发送到本地计算机,计算机使用对象识别程序将打印模型与数字模型进行比较。该算法扫描打印模型的每一层(网格),将其与照片进行比较,找出特定的打印错误。印刷错误,如包装材料,过度挤压蚀刻是众所周知的社会和非常容易找到他们的照片。

摄像机还可用于向机器人用户实时传输该过程,以便有经验的用户可以手动执行该过程,从而识别许多挤压错误,而无需使用软件。

II)适应性反馈过程

当本地计算机识别出打印错误时,它会搜索可能的打印错误的数据库,以找到该错误的匹配项,并建议纠正该错误的步骤。计算机向机器人发送反馈以改变其 g 代码,g 代码可以控制从机器人运动到温度控制的大多数打印过程。

大多数情况下,印刷错误是由于高速或温度误差造成的。这些参数可以很容易地改变,以改善印刷效果显着。尽管这一步看起来过于复杂,但在打印过程中会逐渐产生效果。通过机器人的官方操作软件如 RobotStudio 改变机器人的 g 代码,或者通过机器人的手动控制停止进程以改变 g 代码的参数,可以手动实现相同的过程。

III)记录打印设置、问题和解决方案

一旦打印结束,用户必须保存该过程的所有设置,如电机速度、温度蚀刻以及打印过程中出现的错误。如果他们设法纠正了错误,他们必须记录他们为纠正错误所采取的措施。他们还必须拍下模型的照片,尤其是出错的地方。如果用户无法修复错误,它将被记录为未解决的问题,并在社区中公布。随着用户贡献解决方案,大量数据积累起来。对于每一个可能的错误,每个用户可以贡献不同的解决方案,其中最佳的一个可能被使用。文档可以在 excel-google sheet 文档中完成,该文档可供社区的所有成员使用。每次打印迭代的数据表可以从打印软件自动获得,也可以由用户手动创建。

IV)保存数据并分发给社区

在文档化之后,用户可以使用社区的区块链网络来分发他们的数据(图 36)。通过机器学习,可以对现有数据进行分析,以精确地确定需要进行哪些进一步的测试,以使预测模型更加自信(Zelinski,2018)。然而,训练机器学习系统往往是一个高度计算密集型的过程,这通常不切实际,甚至不可能在单台消费级机器上执行(希伯伦,2016)。由于这个原因,社区的一些用户将被指定实现所有的计算,以向用户提供现成的解决方案。

Figure 7. Private blockchain network of 3Dprint.AI community.

3.3 社区和数据的组织

治理和层级结构

Pearson (2016)表明,治理和等级制度在开源社区中都是必不可少的,尽管开源社区的组织在许多方面都很民主,但与传统的软件开发公司没有太大的区别。在 3d 打印中。AI 框架中,上述特征往往是至关重要的,因为在将用户提交的数据添加到数据库之前对其进行评估和确认对于系统的可靠性是至关重要的。此外,在组织新项目、解决问题和回答社区提出的问题,甚至击败病毒攻击和恶意软件时,治理对于在用户之间分配特定的角色和职责是必要的。

斯尔尼塞克(2017)已经证明了这样的开源社区,即使他们有治理和规则;使用户能够以意想不到的方式行动。事实上,Pearson (2016)批评说,无论用户何时以及如何互动和参与在线社区,都是层次结构使社区变得灵活,并随着用户数量的增加而促进其分成许多子系统。

根据 Pearson (2016)的说法,开源社区具有紧密的垂直层级结构。金字塔的底部是开发一小部分工作的贡献者,其次是组织项目较大部分并评估贡献者工作的维护者,顶部是收集和组装项目所有不同部分的项目领导者(Pearson,2016)。

至少需要一名维护者来启动 3Dprint.AI。维护者将通过邀请更多用户开始,随着社区的扩展,维护者将成为项目领导者,而其他用户将成为维护者和贡献者。每个新用户都是贡献者,并向维护者交付工作。用户必须向社区证明技术技能、意愿和责任,才能成为维护者(图 35)。

项目负责人将负责 1)评估他们的贡献者,2)对他们小组的未来研究方向做出战略决策。例如,他们将决定测试哪种印刷材料,哪种挤压方法蚀刻。维护者的主要角色是:I)评估贡献者发送并提交给网络的切片设置,ii)根据其领导者的计划向社区公布需要解决的新打印问题,iii)在贡献者之间分配进行特定测试的工作。3d 打印。AI 贡献者将 I)运行打印测试和记录切片设置,ii)与其他贡献者或维护者讨论他们在打印时面临的问题,iii)向社区提供关于硬件和软件的各种升级的可行的创造性想法。在 3d 打印中。人工智能社区,声誉将通过贡献获得,而领导力将通过贡献和经验获得(Pearson,2016)。

Figure 8. Hierarchy of 3Dprint.AI community.

3.3.2 通过区块链网络分发数据

根据 Rosic (2019)的说法,集中式数据集过去很容易成为黑客的目标,他们想窃取有价值的信息或破坏系统。Laurence (2017)指出,区块链网络往往难以被攻击,敏感的用户信息可以通过加密算法得到保护。

在 3d 打印中。AI 框架,使用专用的区块链网络。事实上,由贡献者发送并由维护者评估的每一个数据表都将被存储起来,供社区中的每个人查看。但是,一旦数据存储在区块链中,就没有人能够对其进行更改。因此,社区开发的机器学习算法可能会被社区用于运行多次迭代和进行预测。然后,一个或多个贡献者可以测试预测,如果证明是正确的,维护者可以将它们添加到区块链网络中。因此,添加到区块链的数据可能被视为有效、安全并被社区使用。

为了更好地组织和更方便地访问,区块链中的数据将分为三个不同的组(图 9),第一组,打印设置和挤出时发生的错误的文档。第二,机器学习算法做出的预测。第三,有经验的用户手动实现的预测。所有的组将被公布给社区,每个组将根据他们提到的打印错误被分类为子组。

数据的分类

上述三组数据的分类将基于一些重要的印刷参数,例如速度、几何形状的复杂性、印刷温度、材料、校准和多重误差。机器学习算法将仅与前两组中的信息一起使用,因为第三组仅包含来自用户共享的建议。上述分类将有助于更好地组织数据,使其易于为学习系统所理解(希伯伦,2016)。而 3Dprint。随着人工智能的发展,可能会添加更多的类别,而其他一些类别会因过时而被删除或排除使用。

Figure 9. Categorization of data of the community.

数据类别的另一个重要用途是在分析中,它可以揭示趋势、错误之间的关系,甚至做出预测,以确定社区未来的研究方向。建立小组和子小组将有助于更好地分配人力资源,以实现社区的特定目标和任务。数据分析可以说明印刷误差及其相互关系,以便于人工和算法预测。

3.4.问题和挑战

Figure 10. Robot thinking.

技术

一.适当的数据集

3Dprint 的主要问题。人工智能使用的是训练数据。希伯伦(2016)断言,给定数据集的质量与完整性、准确性、一致性和及时性等特征有关。的确,在一定时间框架内,不完整、不准确、不一致、不同时代或不近期的数据集可能会因为大量过时的信息处理而导致不适当的决策。在 AM 中,导致一个问题的原因通常不止一个,即使是有经验的用户也很难识别所有的原因。因此,数据集不仅不能解决一个问题,还会产生更多问题,导致打印过程中出现更多故障。因此,希伯伦(2016)指出,不可靠的数据集比没有数据集更糟糕,因为计算能力被浪费了。然而,这个问题可以通过多次重复错误来最小化,直到在仔细评估投稿人提供的数据后找到最佳解决方案并记录在在线数据库中。

二。g 代码的更改

工业机器人在运行过程中更改 g 代码可能非常具有挑战性,因为任何错误都可能严重损坏其机械装置。更具体地说,一个 6 轴机械臂的每一个运动都由沿着它的每一个轴的许多小的子运动组成。为了避免在其环境中的这种损坏和进一步的故障,这些运动中的每一个变化都应该在机器人的安全轴限制内。然而,用于机器人的现有软件例如 RobotStudio 或者甚至当前机器人的手动控制器都配备有这样的功能。同时,挤出机的参数(例如温度和步进电机速度)独立于机器人的参数(例如机器人速度),这使得改变变得容易和安全。因此,在团体的开始,框架的目标可以被设定为保持机器人处于稳定的速度,而挤出机的所有其他独立参数可以被改变以实现具有最小风险的最佳结果。

三。适当的文件

所有设置的正确记录是一个至关重要的问题,因为它会影响机器学习算法的预测。应验证通过 excel 文件进行的手动文档编制,以便对机构群体有用。然而,在社区开发的后期阶段,文档,至少是关于打印参数的部分,可以从打印软件自动输出给社区的维护者。为了避免混乱和错误,维护者给贡献者的指令必须集中。事实上,贡献者可以在特定范围内改变打印参数,而不是测试随机变化。同样,相同的测试可能由不同的贡献者实现,用于检查提交给维护者的参数。不同机器人产生的相同参数的打印结果的比较也可以用于测试贡献者的硬件的可靠性。

四。相同的机器人和挤出机

社区中的制造商可能会使用不同的机器人,建造不同的挤出机,使用不同的切片软件,这可能会使供应成为一个通用的解决方案,这将是非常具有挑战性或不可能的。在这个步骤中,可能会出现许多错误,因为硬件的差异可能会误导制造商。为了避免这些问题,3Dprint。AI 必须首先指定一个机器人模型、一台挤压机和一种特定的挤压材料,以便可以向用户提出安全的解决方案。后来,当社区准备好大量数据用于其算法时,可以添加各种硬件来为用户提供更广泛的选择。

动词 (verb 的缩写)打印时的环境条件

根据 Leonidou (2019)的说法,关于打印质量和一致性的最重要因素之一是打印机运行的环境条件,也就是说,具有相同机器、挤出机和切片设置的用户可能会面临不同的故障,例如。附着力不好;如果他们在不同的环境条件下操作设备,例如不同的温度。这个问题可以通过在几乎相同的环境条件下进行挤压来解决,这些环境条件是在一个封闭空间或房间内控制的,并且环境的特殊性取决于文件。

不及物动词过程的复杂性

计算密集型过程的复杂性仍然是框架中的一个关键问题。在桌面 3d 打印中,挤压板大部分时间达到 30cm,几乎所有的打印问题,如材料碰撞、层分离蚀刻,都可以通过 3d 模型的适当切片和优良的加工来解决。然而,列奥尼多
(2019)表明,在大规模挤压中,各种其他参数,如环境条件往往会影响印刷结果。

同时,在大规模上,消耗的成本、时间和精力要重要得多。然而,尽管打印时的相机记录和对象识别是计算密集型的,但它们提供了对过程进行连续监督的优势。然而,在简单或容易挤出的几何形状中,用户可以不使用相机记录和自适应反馈过程,而仅仅记录发生的设置错误,以便为社区开发的机器学习算法产生训练数据。

道德规范

Figure 11. AI Ethics.

尽管存在技术上的挑战,但 3Dprint 的运营过程中也出现了许多伦理问题。AI 社区。下面对最重要的问题进行了批判性的讨论,并给出了两个调查结果(图 12)。更具体地说,在大会投票期间 Autodesk 应用程序出现问题后,80 个答案中只有 10 个被记录下来,这使得结果不可靠。为此,还举行了针对巴特利特学生的第二次民意调查,收到了 70 份答案。尽管由于参与人数有限,这两项民意调查都不能完全客观,但它们可以说明可以加入 3Dprint 的人们的想法和观点。未来的 AI 社区。

从整体趋势来看,两项民意调查都显示了对 3Dprint 的积极反馈。以“是”或“可能是”作为主要答案的人工智能社区。然而,将近 10 %的反馈可能是否定的,这些争论在下面的讨论中会被考虑进去。

Figure 12.Polls answers. Generally, answers are supportive of the idea of 3Dprint.AI community.

一.作者身份和所有权问题

随着数字文化的发展,诸如“协作”、“开源”和“开放创新”等流行语越来越流行(Picon2016)。这些流行语暗示了作者身份等基本问题。按照芮(2016)的说法,主张署名权的根本要求是原创性。对于一个通过版权获得财产权的作品,它应该是原创的,否则,它只是其他原创作品的副本(芮,2016)。但是,在 open 3Dprint 这样的框架中。AI,不清楚谁拥有数据的著作权,谁有权使用这些数据。换句话说,所有权是不确定的,因此正成为一个越来越重要的问题(Fok 和 Picon,2016)。

芮(2016)指出,所有版权法的基础是作者身份产生对所创作作品的所有权的想法。芮也批评了版权的显著观点,即只有作品的创作者才拥有复制该作品的专有权。此外,他还证明了即使是像罗兰·巴特和哈罗德·布鲁姆这样的文学批评家也曾有力地论证过,声称任何创造性作品的完全原创性是不可能的。然而,在 21 世纪,利用数字技术,许多类型的合作创造性工作的所有权已经成为可能,人类刚刚开始预见这一趋势的后果(Picon,2016)。

因此,在 open 3Dprint 中。在人工智能框架中,当许多用户参与创建训练数据集时,为了避免法律纠纷和争论,所有用户都必须接受预定义的条款和条件。事实上,他们必须就数据集的权威性和用途达成一致;其完整的作者身份可以重新,因为开始,一所大学或研究所,如巴特利特。然而,根据 Pearson (2016)的说法,当社区变得受欢迎时,它可以转变为一个具有特定法律结构的组织,将所有权利和义务移交给其成员。

二。访问限制

根据 Gershenfeld (2012)的说法,在数字制造中,当制造商有权复制设计时,总是存在窃取知识产权的威胁。Anderson (2012)认为,开源环境中的复制问题可能是创造性的,因为当它发生时,它是成功的标志,因为从复制开始的东西可能会在改进后成为真正的创新。然而,Gershenfeld (2012)澄清说,只有一些设计应该与在线社区共享,而其他设计,包括专利,应该受到保护。

AM 工具的自由使用带来的另一个重要威胁是枪支的生产(Gershenfeld,2012)。事实上,设计和制造的民主化提出了关于所有人自由使用这些工具的重要问题。更具体地说,人类倾向于以自己的方式思考和决定技术。因此,当技术是应用于大规模 AM 的人工智能时,为了保护公共安全,对它的访问应该仅限于经过验证的用户是不言自明的。

因此,3Dprint。AI 可以开始运行,并允许大学、研究机构、行业、公司、初创企业、工厂实验室和其他选定和验证的用户访问其数据集。它不能是对所有人开放的开源框架数据,因为必须避免使用它对个人和社会可能产生的所有负面后果。

三。对系统的信任

根据 Schneier (2019)的说法,区块链未能实现采用,因为总是保护其敏感数据的企业不信任它。另一方面,Anderson (2012)认为,像谷歌这样的个人和公司正在参与开源平台,共享他们的数据并信任这些社区,因为他们渴望结识更多的人,并将创新过程加速到远远超过传统开发所能达到的速度。

此外,Schneier (2019)批评说,在区块链网络中,信任正在从人类转移到技术,如果被黑客攻击,丢失所有数据的用户将没有追索权。然而,Laurence (2017)已经表明,对分散的区块链网络进行攻击所需的高计算能力成本违背了黑客攻击的目的。事实上,在我写这篇文章的时候——2019 年——整个区块链网络从未被成功黑客攻击过。

此外,Schneier (2019)指出,无论一个技术系统——区块链——多么可靠,总是存在危险和威胁,尤其是当它扩大规模时。因此,许多公司只使用他们创建和控制的区块链。相反,Laurence (2017)指出,区块链开发人员已经发明了一些工具和子系统,当网络规模扩大时,这些工具和子系统可以为数据提供额外的安全性。劳伦斯认为,这些安全系统使得现有的区块链网络更难被黑客攻击或中断,尤其是当这些网络是私有的时候。

因此,依托以上专家意见和民调结果,3Dprint。AI framework 将使用一个私人区块链网络来保护其数据免受黑客攻击,同时允许社区成员访问。这样,即使是数据敏感的公司和个人也可以加入社区,并保证只有成员才能访问数据,黑客无法窃取数据。

四。社区的参与

Anderson (2012)给出了许多个人和组织参与开源社区的理由,例如通过它们获得新的技能和声誉。另一方面,Carpo (2017)认为,尽管有许多开源环境,但大规模协作尚未在设计中发生,因为设计专业人员拒绝了这种潜力,并倾向于保护他们的特权。然而,Anderson (2012)将创客运动描述为一种趋势,它将在未来几年内演变,并在开源环境中吸引更多的人。

在 3d 打印中。AI 框架中,社区的参与是一个至关重要的问题,应该针对不同人群的具体特点分别进行研究。Anderson 认为(2012 年),可以假设制造商和公司对推进大规模 AM 的兴趣、世界范围内大量的实验室和当前的开源趋势共同创造了动力,至少一些制造商或实验室会有动力参与 3Dprint。AI 社区。

然而,出于以下原因无法访问 3D.print.AI 正在成为一个主要的争论点。首先,对于人来说,与机器人一起进行大规模 AM 既困难又耗时。其次,必须有人向潜在成员传授基本技能,并能够进一步发展这些技能,因为大多数用户可能不熟悉工业机器人。

由于这些原因,奖励和付款,无论是道德上的还是经济上的,都可以激励技术高超的制造者与社区的其他成员分享他们的知识,并与他们建立相互信任。作为维护者,用户的层次结构可以为这个目标做出贡献,他们可以分配任务,教导贡献者完成任务,并监督他们的工作。还有,会员在社区可能获得的优质技能,可以吸引用户加入。

公司和初创企业也可以加入,因为他们可以快速获得知识,他们可以认识新的人,甚至在社区中开发他们的一些项目。专用的区块链网络可以保证他们数据的安全。公司将继续参与进来,从免费提供且不断增长的硬件和软件中获益。他们可以用它来解决他们的印刷问题,否则,他们必须付费。

3.4.3.社区的经济效率

根据 Pearson (2016)的说法,当开源社区积累了大量成员时,希望保护他们的财产并在经济上生存下来的人会转变为像 Linux 这样的组织。通过这种方式,他们可以从捐助者那里获得资金,同时附加的咨询委员会确保社区保持活力。Pearson (2016)发现,咨询委员会在技术、社会和政治问题上指导社区,并检查这些问题以防止它们成为问题。Kumar
( 2015)已经表明,开源社区通过向社区外的公司提供支持、销售产品或在其网站或应用上做广告来获得资金。Pearson (2016)观察到,美国的此类组织享受低税率以确保其存在。

如前所述,3Dprint。人工智能可以在像 Bartlett 和 connect 实验室、公司、初创企业这样的机构中开始运作;和用户。它可以通过上述所有方式接收资金。这个框架的经济效率是至关重要的,因为它既开发了硬件挤压机,又开发了关于大规模 AM 的软件。它需要一些初始投资来开始运作,建造挤出机,并支付一些用户,他们花时间在社区组织项目或教授贡献者 AM 技能。该基金可以通过众筹或机构的研究拨款筹集,甚至可以通过首批用户的自筹资金筹集。财务是一个至关重要的问题,会影响参与的人数。

在注册了一些成员并创建了可靠的数据集后,社区成员可以开发用于切割 3d 模型和制定刀具路径策略的软件,如 Cura 或 AIsync,然后可以将这些软件出售给没有参与进来的公司、行业和实验室,为社区赚取收入。Kumar (2016)表明,即使像微软和谷歌这样的大公司也发现,向 Linux 这样的开源社区支付创建代码的费用比自己创建代码要便宜。3d 打印可能会出现这种情况。人工智能通过与公司和行业交流他们未来的研究议程和 AM 和 AI 的最新发展。

Figure 13. General diagramme which illustrates the feedback the idea of the framework and the framework itself.

下一部分(II/II):该理论在机器人中的应用、研究贡献和未来计划。

AI+3d printing+open source = 3d print。艾

文献学

  • Ai-build (2019)。人工智能建造技术。[在线]可在:https://ai-build.com/technology.html[于 2019 年 5 月 2 日获得]。
  • 安德森(2012 年)。创客:新工业革命。第一版。纽约:皇冠商务,第 83,101,102 页。
  • Autodeskresearch.com(2019)。捕梦网项目。【在线】可在:https://autodeskresearch.com/projects/Dreamcatcher【2019 年 5 月 19 日获取】。
  • f . biton ti(2016 年)。当物质成为媒介。在:A .皮肯和 w .福克,编辑。,数字财产:开源架构,AD 卷 86,第 5 期。霍博肯:约翰·威利父子公司,第 101-104 页。
  • Brasseur,V. (2018 年)。用开源打造未来。第一版。北卡罗来纳州罗利:实用主义书架,第 23–43 页。m . carpo(2017)。第二次数字化转向:超越智能的设计。伦敦:麻省理工学院出版社,第 6132 页。
  • m . carpo(2017)。第二次数字化转向:超越智能的设计。伦敦:麻省理工学院出版社,第 6,132 页。
  • m . carpo(2018)。马里奥·卡波说,后数字时代将更加数字化。见:https://www . metropolis mag . com/ideas/post-digital-will-be-more-digital/【访问时间:2018 年 7 月 7 日】
  • Copeland,M. (2016 年)。AI、机器学习、深度学习的区别?|英伟达博客。[在线 NVidia 官方博客,可从https://blogs . NVidia . com/blog/2016/07/29/whats-difference-artificial-intelligence-machine-learn-获得
  • ing-deep-learning-ai/[2019 年 5 月 2 日访问]。
  • Fablabhouse.com。(2019).私人实验室。[在线]可在 http://www.fablabhouse.com/en【2019 . 7 . 4 访问】。
  • 格申菲尔德,N. (2012 年)。“如何制造几乎任何东西:数字制造革命”,《外交事务》,第 43-45 页,第 55-57 页。
  • Gershenfeld,N. A. (2015) Fab: 即将到来的桌面革命——从个人电脑到个人制造。基础书籍,第 3-17 页。
  • 希伯伦,P. (2016 年)。面向设计师的机器学习。第一版。塞瓦斯托波尔:奥莱利媒体公司,第 7、21、47、48、51、55、59 页。
  • Hermann,m .,Pentek,t .和 Otto,B. (2016 年)。工业 4.0 场景的设计原则。载于:第 49 届国际系统科学会议。华盛顿 DC:IEEE 计算机学会,第 3928–3935 页。
  • 约翰逊,J. (2019)。火箭计划:3d 打印如何开启新的太空竞赛。【在线】福布斯。可从以下网址获取:https://www . Forbes . com/sites/Jennifer Johnson/2018/05/16/rocket-plan-how-3-d-printing-is-unlock-a-new-space-race/【2019 年 6 月 15 日获取】。
  • 基廷,S. (2014 年)。超越 3D 打印:添加制造的新维度。在福利特,乔纳森(编辑。),为新兴技术设计:基因组学、机器人学和物联网的 UX(379–405)。奥莱利媒体,第 380,383–388,393,401 页。
  • Kumar,A. (2015)。开源公司,程序员怎么赚钱?【在线】微软:Windows 俱乐部。可从以下网址获得:https://www . the windows club . com/open-source-companies-programmersmake-money【2019 年 6 月 8 日获取】。
  • 兰萨德,M. (2019)。2019 年最佳 3D 打印论坛、脸书团体和社区。[在线]阿尼瓦。可访问:https://www . ani waa . com/best-3d-printing-3d-scanning-forums-Facebook-groups-and-communities/【2019 年 7 月 1 日访问】。
  • t .劳伦斯(2017)。假人区块链。第 1 版。霍博肯:约翰·威利父子公司,第 19、21 页。
  • Leonidou,L. (2019)。设计细胞。AiBuild TechBlog。见:https://medium . com/ai build-tech blog/engineering-the-ai cell-e 65 a4 deb-0f3c【2019 年 5 月 19 日访问】。
  • Matejka,j .,Glueck,m .,Bradner,e .,Hashemi,a .,Gross-man,t .和 Fitzmaurice,G. (2018 年)。梦镜:大规模生成设计数据集的探索和可视化。 In: 2018 智大会。多伦多: Autodesk Research,第 3 页
  • MX3D。(2019). MX3D 大桥。【在线】可在:【https://mx3d.com/projects/bridge-2/】T4【2019 . 6 . 15 访问】
  • 皮尔森,B. (2016)。开源社区的共同特征——当今的开源。【在线】开源今日组织。可从以下网址获取:http://open source today . org/common-characters-open-source-community/[2019 年 5 月 26 日获取]。
  • 皮肯和福克(编辑。) (2016).数字财产:开源架构。公元 86 卷第 5 期。
  • 霍博肯:约翰·威利父子公司,第 7、8 页。
  • a . picon(2016 年)。从著作权到所有权。载于:A. Picon 和 W. Fok,编辑。,数字财产:开源架构,AD 卷 86 期第 5 期。霍博肯:约翰·威利父子公司,第 37、38 页。
  • Rayna、l . Striukova 和 j . Darlington(2015 年)。共同创造和用户创新:在线 3D 打印平台的作用。工程与技术管理杂志,37(0923–4748),第 90–102 页。
  • 相对论空间。(2019).相对论空间|星际之门——相对论空间。[在线]可在:https://www.relativityspace.com/stargate【2019 年 7 月 1 日获取】。
  • Rosic,A. (2019)。什么是区块链技术?初学者循序渐进指南。[在线]街区极客。可从以下网址获取:https://block geeks . com/guides/what-is-区块链-technology/【2019 年 5 月 26 日获取】。
  • 芮博士(2016)。服务、拥有、创作。载于:A. Picon 和 W. Fok,编辑。,数字财产:开源架构, AD 第 86 卷第 5 期。霍博肯:约翰·威利父子公司,第 18-21 页。
  • 施奈尔,B. (2019)。没有充分的理由相信区块链技术。【在线】连线。可在:https://www . wired . com/story/theres-no-good-reason-to-trust-区块链-technology/【2019 年 6 月 8 日访问】。
  • 北卡罗来纳州斯尔尼塞克(2017 年)。平台资本主义。第一版。英国剑桥:政治出版社,第 46、47 页
  • Tamke,m .,Nicholas,p .和 Zwierzycki,M. (2018)“建筑设计的机器学习:实践和基础设施”,国际建筑计算杂志,16(2),第 123–143 页. doi: 10.1177/1478077118778580。
  • 巴特利特建筑学院。(2019).建筑设计进行曲。【在线】可在:https://www . UCL . AC . uk/bartlett/architecture/programs/graduate/March-architectural-design【2019 年 7 月 8 日访问】。
  • 沃勒律师事务所(2019 年)。什么是增材制造? |沃勒联合公司。[在线]可在:https://wohlersassociates.com/additive-manufacturing.html[2019 年 5 月 2 日访问]。
  • 泽林斯基,P. (2018)。AM 遇到 AI 的地方。增材制造,第 7 卷,第 1 期,第 25 页。
  • Chaillou,S. (2019 年)。建筑 AI 的来临,一个历史的视角。波士顿:哈佛设计研究生院,第 2-15 页。
  • n .内格罗蓬特(1972)。架构机。剑桥马萨诸塞州。:麻省理工学院出版社,第 1–20 页。

图像制作者名单

  • 图一。作者:平面设计,图片来源:【在线】http://hdqwalls.com/matrix-5k-wallpaper【5 月 2 日访问。2019].
  • 图二。图片来源:[在线]https://www . day translations . com/blog/2019/01/10-trends-that-will-change-the-制造业-工业-13371/【5 月 2 日访问。2019].
  • 图 3。图片来源:【在线】https://mx3d.com/projects/bridge-2/【5 月 2 日获取。2019].
  • 图 4。图片来源:[在线]https://ai-build.com/
  • daedalus.html[5 月 2 日访问。2019].
  • 图 5。作者:平面设计,图片来源:[在线]http://her anet . info/projects/hera-2009-人文作为创造力和创新的源泉/电子文学作为创造力和创新实践的模型/[7 月 5 日查阅。2019].
  • 图 6。作者。
  • 图 7。作者。
  • 图 8。作者。
  • 图 9。作者。
  • 图 10。图片来源:[在线]http://www.gizmodo.cz/?tag=ethics【7 月 5 日获取。2019].
  • 图 11。图片来源:[在线]https://emerj . com/ethics-and-regulatory/establishing-ai-ethics-public-and-private-sector/
    【7 月 5 日访问。2019].
  • 图 12。作者:平面设计,民调:[在线]https://live.eventbase.com/polls?event=autodeskuniversi ty 2019 & session = 1180201908[7 月 11 日访问。2019].& &[在线]https://docs . Google . com/spreadsheets/d/1 oflqycmy 1 PTX 1 MH 8v 76-9 jrw _ dgfb 2 MK 3 uqrbnjjuni/编辑?usp =共享
  • 图 13。作者。

入门级程序员成功的 3P 战略

原文:https://towardsdatascience.com/3p-strategy-to-be-successful-for-entry-level-programmers-bbf5dbbcb981?source=collection_archive---------45-----------------------

我给初级程序员的建议是,坚持下面我制定的 3P 策略,它真的在我的职业生涯中帮助了我。

毅力

“毅力不是一场长跑;这是一个又一个的比赛。”—沃尔特·埃利奥特

一开始,对于大多数学习者来说,编码似乎总是一种负担,他们只是看到所涉及的永无止境的主题列表,并且一看到似乎无法解决的错误或艰难的编码挑战就想放弃。这不仅适用于编程,也适用于我们的现实生活。我们不能忘记,我们比我们可能面临的暂时问题更大,通过不断的努力和坚持,事情会得到解决。所以对自己有信心,在你需要的时候从你的同伴那里得到帮助,继续努力。你能行的!

练习

“不是每个季节都有收获。有浇水的季节,播种的季节,拔草的季节,给土地施肥的季节。”—乔尔·奥斯坦

没错,除了练习,练习,练习,直到你做对为止。编程就是让你的双手变脏,继续写代码,直到你对概念有了深刻的理解,并在链接各种概念以提出可靠的解决方案方面领先一步。开始的时候确实需要花费大量的时间和精力,但是一旦你看到技能的提高,编程就会变得轻而易举。练习你的编码技能将真正让这些概念深入你的记忆,以至于你会感到肾上腺素激增,想出应对业务挑战的解决方案,并将我们每天做的单调任务自动化。

项目工作

"你说话的声音太大了,我听不见你说什么。"-拉尔夫·瓦尔多·爱默生

就像没有人相信一个摄影师是好的,除非他有一个好的作品集来展示他的作品,程序员也一样。从一开始就记住基于项目的方法,并不断构建小项目,这些小项目可以方便地自动化手动任务,只是为了好玩。这真的让你从一开始就参与进来,并让你有信心在稍后阶段与他人分享你的旅程,讲述你所面临的挑战以及你是如何克服这些挑战的。在您的编程旅程中参与项目将帮助您创建一个侧面的个人资料,以展示您的才华,并让人们看到您在编程方面的熟练程度。'

这三件事确实有助于培养你最好的一面。我希望这个建议真的能帮助初露头角的程序员在他们的旅程中充分利用它。

我将以引用亨利·大卫·梭罗的话来结束这篇文章。

"成功通常会降临到那些太忙而没有时间去寻找成功的人身上!"

帕夫内特·辛格

模型驱动投资的 4 个替代数据源

原文:https://towardsdatascience.com/4-alternative-data-sources-for-model-driven-investing-ec140da4c97d?source=collection_archive---------10-----------------------

机器学习中超越股票价格的视角

Photo by Rabie Madaci on Unsplash

机器学习的前所未有的崛起已经将其应用到许多行业,从航空旅行到医疗保健,从电子商务到物流,从保险到气象,甚至农业。投资领域也不例外,因为投资者所处的环境拥有丰富的数据。最近在金融预测中利用机器学习的许多尝试都集中在对时间序列价格数据采用复杂的深度学习技术,如(及其许多变体),简单地说,这种方法使用过去的价格来预测未来的价格。没有对市场效率的先入为主的看法,这似乎是有道理的。价格是最可见和最容易获得的数据集之一,特别是对于股票,递归神经网络(RNNs)是专门设计来处理顺序数据的。然而,这种看似合适的结合很少产生样本外的预期结果。但是为什么呢?

价格数据中的信噪比低得令人难以置信,由于其可用性和普遍性,它长期以来一直被市场参与者所忽视。投资中有一个完整的子学科( 技术分析 ),致力于在价格历史图表中寻找模式的深奥艺术。尽管这些方法不像 RNNs 那么复杂,但任何唾手可得的果实仍然会被套利掉。但这并不意味着量化投资完全没有用,如果机器学习模型是预测的引擎,那么数据只是它的燃料,如果价格不再足以作为合适的媒介,我们可以寻找其他来源来实现它的功能。如果你愿意努力寻找,仍然有许多免费的替代数据来源。

去哪里找

Photo by Mamihery Razafindramamba on Unsplash

如果你是一个数据驱动的非机构投资者,无法访问彭博终端,但你想从雅虎导出价格时间序列升级到 csv!金融,下面的列表可能会引起你的兴趣:

1.圣路易斯美联储银行

Source:FRED, BEA

作为组成美国中央银行系统的 12 家地区储备银行之一,圣路易斯联邦储备银行始终掌握着美国经济的脉搏。除了在制定货币政策方面的重要作用,它还是宏观经济研究的中心。为了促进这项研究,它编制了美联储经济数据数据库,该数据库在一个地方汇集了 50 多万个不同的时间序列数据集。虽然该数据库主要存储国内和国际宏观经济数据,但它仍在不断扩展,新增加的内容包括比特币/加密货币价格指数。这里可以找到。****

最近,为了协助实证研究,圣路易斯联邦储备银行发布了包含 100 个关键指标的月度和季度“大数据”数据库 弗雷德-MD 和弗雷德-QD 。这可能为你的财务预测问题提供了一个很好的起点。

2.卡格尔

Photo by Osman Rana on Unsplash

Kaggle 是世界上最大的在线数据科学社区,它也是一个机构发布数据相关问题的平台,让有抱负和经验证的数据科学家以类似竞赛的形式解决这些问题。用户不仅可以访问数据,而且顶尖的完成者通常会在结束后在网站博客上发布他们的方法、方法论和代码的详细说明。之前的获奖者包括 Geoffrey Hinton(通常被称为深度学习的教父)和他的学生。网站上有许多有趣的帖子,包括可用于数据驱动投资的替代数据。其中一个数据集来自著名的量化对冲基金 Two 适马 最近举办的一场比赛,在比赛中,你可以从汤森路透(Thomson Reuters)获得新闻报道,目的是预测股票价格。

3。Quandl

Photo by Sam Beasley on Unsplash

Quandl 的 目标客户群是大大小小的投资者。凭借有趣的非传统指标,如前一周特定汽车的销量或苹果上个月的运营支出,Quandl 无疑提供了一种独特的产品。一些较难获得的数据集是收费的,但该平台确实免费提供大型市场和国际经济数据库。这可以通过 Excel、R 和 Python 的许多插件/API 来访问,因此可以很容易地集成到任何工作流中。

4.网页抓取

Photo by Christopher Burns on Unsplash

Web 抓取指的是从网页中提取数据,可以说这是可用的原始和非结构化数据的最大来源。有了像 R 中的 Rvest 和 Python 中的 Beautiful Soup 这样的自动化网页抓取库的易用性和可访问性,只需四行代码就可以快速捕获、处理和存储网页的任何元素。正在使用的这种技术的有用例子包括 Lucca 和 Trebbi 2009 ,其中来自美国国家经济研究局的作者在谷歌搜索中将美联储 FOMC 声明中的句子与“鹰派”和“鸽派”(用于表明央行对利率的立场的术语)结合起来,并捕获了返回结果的数量。这些结果随后被用来预测未来的利率轨迹。另一项相关的研究是 Preis、Moat 和 Stanley 2013 的研究,他们使用谷歌趋势分析来搜索特定的搜索词,以揭示股市不利波动的早期预警信号。还有许多其他的实际例子,但是你如何应用它以及在哪里应用它只受到浩瀚的互联网的限制。

结论

虽然我已经列出了 4 个可能有助于帮助你制定投资相关的机器学习问题的替代数据来源,但重要的是要注意,我们不能完全放弃价格的使用。最终回报是我们所追求的(至少对我们大多数人来说),这是价格的函数。然而,在这种情况下,我们应该用价格来衡量结果,而不是投入的特征。从直觉上讲,这是有道理的,因为过去的价格不是影响股票的唯一因素,股票本质上是公司,而公司受制于其经营的商业和经济环境。

参考文献

卢卡博士和特雷比博士(2009 年)。测量中央银行沟通:应用于 FOMC 报表的自动化方法。 SSRN 电子杂志

Preis,Moat h .和 Stanley h .(2013 年)。使用谷歌趋势量化金融市场的交易行为。科学报道,3(1)。**

免责声明:本帖纯属个人观点和看法的表达。它不代表任何建议,也不反映我的雇主的观点。

使用 Keras 可以做 4 件了不起的事情,以及实现它所需的代码

原文:https://towardsdatascience.com/4-awesome-things-you-can-do-with-keras-and-the-code-you-need-to-make-it-happen-858f022eec85?source=collection_archive---------12-----------------------

想获得灵感?快来加入我的 超级行情快讯 。😎

Keras 是最广泛使用的深度学习框架之一。它非常容易使用,但在性能方面仍然与更复杂的库如 TensorFlow、Caffe 和 MXNet 不相上下。除非你在一个应用程序中需要一些非常低级和复杂的代码,否则 Keras 会给你最好的回报!

但是 Keras 并不像看上去那样简单。今天,我们分享一些鲜为人知但很棒的事情,以及实现这些事情所需的代码。这些将帮助您直接在 Keras 中编写所有自定义的东西,而不必切换到其他那些更乏味和复杂的库。

(1)自定义度量和损失函数

Keras 带有许多内置的度量和损失函数,在许多情况下非常有用。然而有些遗憾的是,只有最常见的指标和损失被内置。

所有的度量标准基本上都是某种形式的百分比准确度;损失确实有很多选择,但从最新的最先进的研究来看并不多。如果你想要尖端的东西,你需要实现你自己的。

我们可以这样做!所有 Keras 损失和度量都以与具有两个输入变量的函数相同的方式定义:地面真实值和预测值;这些函数总是返回度量值或损耗值。你真正需要注意的唯一一件事是,矩阵上的任何操作都应该与 Keras 或 TensorFlow Tensors 兼容,因为这是 Keras 一直期望从这些自定义函数中得到的格式。这可以通过坚持使用 Python math、Keras 或 TensorFlow 操作来实现。

似乎很容易!下面是如何创建和应用自定义损失和自定义指标的示例。

对于度量标准,我实现了 PSNR 函数,它通常用于测量图像质量。对于损失函数,我实现了 Charbonnier,它比 L1 或 L2 损失对异常值更稳健。一旦函数编写完成,我们只需将它们传递给我们的模型编译函数!

(2)自定义图层

类似于度量和损失函数,如果您想使用标准卷积、池化和激活函数之外的东西,您可能会发现自己需要创建一个自定义层。在这种情况下,您可以按照我下面给出的代码示例来实现它!

根据 Keras 文档,我们需要实现的两个最重要的是:

  • 这是层的逻辑所在。除非您希望您的层支持遮罩,否则您只需关心传递给call的第一个参数:输入张量。
  • get_output_shape_for(input_shape):如果你的层修改了它的输入的形状,你应该在这里指定形状转换逻辑。这允许 Keras 进行自动形状推断。

在我的情况下,我想有一个层,可以自动调整图像到任何大小。为此,我需要使用 blinear,双三次,或最近邻调整大小。

call()函数的第一个输入被定义为x,它是图像张量,第二个输入(可选)被定义为method,它指的是要使用的调整大小的类型。调整尺寸比例在初始化函数__init__中定义。

确保坚持 TensorFlow 操作(所以我们总是使用 Keras 或 TensorFlow tensors),我们根据整数舍入比例调整图像大小并返回图像。在get_output_shape_for()函数中,计算并返回输出张量的完整形状

既然我们已经为自定义层编写了代码,假设我们的图像张量被定义为image,我们所要做的就是将它与函数式 API 一起使用,就像这样调用它:

image _ 2 = resize _ layer(scale = 2)(image,method= "双线性")

(3)内置预处理

Keras 配备了几个内置模型和 ImageNet 上预先训练好的权重,开箱即可使用。但是,如果你想直接使用这些模型,你需要事先调整你的图像大小,因为最后完全连接的层强制输入大小是固定的。

例如,Xception 模型使用 299x299 的图像裁剪进行训练,因此您的所有图像都必须设置为该大小以避免错误。除此之外,可能还有一些其他类型的模型预处理或后处理,您希望在向其传递图像时自动应用这些预处理或后处理。

不要再看了!

我们可以使用 Keras 的 Lambda 层对模型进行任何种类的数学或预处理操作!lambda 将简单地定义您想要应用哪个操作。

完整层允许你将功能完全融入到你的模型中。查看下面的代码,了解我们如何在模型中内置调整大小和异常预处理功能!

(4)用于重复块的函数

如果我们想编写一个大的模型,比如说 50 层甚至 100 层的东西,代码会变得非常混乱。当您必须定义那么多层,并且在所有剩余的或密集的连接之上时,您将到处都是代码!

相反,我们实际上可以在函数式 API 中做一个聪明的把戏,将重复的代码块定义为函数。例如,一个 ResNet 有许多重复的残差块,这些残差块有相同的基本成分:批量归一化、激活函数和卷积。因此,我们可以简单地将这些操作一起定义为函数中的一个块,从而大大简化我们的代码。

查看下面的代码,它实现了 ResNet 和 DenseNet 块,并向您展示了如何使用它们!

喜欢学习?

在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!

增强 Jupyter 笔记本的 4 个绝妙技巧

原文:https://towardsdatascience.com/4-awesome-tips-for-enhancing-jupyter-notebooks-4d8905f926c5?source=collection_archive---------3-----------------------

扩展、主题等等!

想获得灵感?快来加入我的 超级行情快讯 。😎

Jupyter 笔记本已经成为所有希望分享他们工作的开发者的一个很棒的工具。它们提供了一种简单的共享笔记本的方式,即文本、代码和图形的组合,旨在增强我们向受众传达信息的方式。它们被广泛用于数据分析和数据科学等领域。

然而,我们中的大多数人实际上只是在触摸 Jupyter 笔记本的表面。我们使用编写 Python 代码和显示图表的基本功能。但是您知道吗,Jupyter 中有许多可定制的功能可以增强其功能。!可以让您的笔记本书写更高效、演示更有效的酷炫选项。

这里有 4 个增强 Jupyter 笔记本的绝妙技巧!

(1)执行外壳命令

技术/编程环境中的外壳是一种与计算机进行文本(使用文本)交互的方式。最流行的 Unix shell 是 Bash ( Bourne 再 SHell )。Bash 是任何 Linux 机器上终端的默认 shell。

使用 Python 时,经常会在编写 Python 代码和使用 shell 之间来回切换。例如,您可能想使用 Python 从磁盘读取某个文件,因此需要检查其确切名称。你通常只需在终端上输入 ls 就可以得到当前目录下所有文件和文件夹的列表。来来回回可能会非常乏味和低效

真正酷的是,Jupyter 能够执行 shell 命令,而无需离开浏览器。您所要做的就是在 shell 命令前加一个感叹号**!**, Jupyter 会将其解释为 Bash。任何在命令行运行的命令都可以在 Python Jupyter 笔记本中使用,只需在前面加上**!**字符。

# Listing folder contents
>>> !ls
mynotebook.ipynb stuff.txt# Getting the current directory
>>> !pwd
/home/george/github/project_1# Printing from Bash 
>>> !echo "Pizza is delicious!"
Pizza is delicious!

我们还可以将 shell 命令的输出分配给 Python 变量,如下面的代码所示。

# Getting the current directory. 
# The variable "X" now contains ["/home/george/github/project_1"]
X = !pwd

(2)改变主题

许多文本编辑器和编程 ide 都有可定制的主题。amoung 开发的最喜欢的一个是较暗的主题,如 monaki,因为当你整天看着屏幕时,眼睛会更舒服。幸运的是,Jupyter 有一个允许主题选择的插件。

要安装插件,只需在终端中运行 pip 命令:

pip install jupyterthemes

您可以像这样列出可用的主题:

jt -l

在撰写本文时,可以使用以下主题:

chesterish
grade3
gruvboxd
gruvboxl
monokai
oceans16
onedork
solarizedd
solarizedl

看看下面的几个例子。许多伟大的颜色选择!

solarizedd (left) | gruvboxl (middle) | grade3 (right)

(3)笔记本扩展

Jupyter 笔记本扩展— nbextensions 是 JavaScript 模块,可以用来增强笔记本的功能和用途。这些扩展实质上修改了 Jupyter UI,使其功能更加强大。

我们将从通过 pip 安装 nbextensions 开始:

pip install jupyter_contrib_nbextensions 
jupyter contrib nbextension install

安装完成后,启动 Jupyter。你会看到一个名为 NBextensions 的新标签。一旦你选择它,你会看到许多 Jupyter 笔记本扩展选项!

你可以通过快速的谷歌搜索来查找这些扩展,看看它们做了什么。我在下面突出了一些最有用的。

(1)目录

顾名思义,目录会根据笔记本中标签#创建的标题自动为您的笔记本生成一个目录。例如,我在下面的示例图像中创建的标题是:

# This is a super big title
## This is a big title
### This is a medium title
#### This is a small title

目录在左边很好地生成了。表格中的每个标题都有一个链接,双击该链接可以直接转到该部分。当你的笔记本开始变大,并且你有许多分区时,这是非常方便的!

(2)腹地

代码完成是大多数 ide 中非常常见的特性,尤其是 Python 的 PyCharm。开发人员喜欢它,因为它使他们的工作变得非常容易,不必记住每一个命令,因为他们知道他们的 IDE 会为他们清理东西。

heartback 支持 Jupyter 笔记本中的代码自动完成。当你打字的时候,建议就展现在你面前。这在您从外部库搜索命令时最为明显,如下例所示。超级方便!

(3)分裂细胞

拆分单元格允许您并排查看 2 个单元格。当你有两个相关的单元格时,这是非常方便的,比如一个描述和它所指的视觉化。

(4)使用 Qgrid 探索数据框架

我们的最后一站是 Qgrid——一个让你无需任何复杂的熊猫代码就能探索和编辑你的数据框架的工具。

Qgrid 以互动的方式在你的 Jupyter 笔记本中呈现熊猫数据帧。通过这种呈现,您可以进行直观的控制,如滚动、排序和过滤,还可以通过双击所需的单元格来编辑数据框。

让我们从安装 Qgrid 开始:

pip install qgrid
jupyter nbextension enable --py --sys-prefix widgetsnbextension

要使用 Qgrid 呈现数据帧,只需导入它,然后将数据帧传递给show_grid函数,如下所示:

import qgrid
qgrid_widget = qgrid.show_grid(df, show_toolbar=True)
qgrid_widget

这样做将显示带有许多交互选项的数据框:

  • 添加和删除行
  • 筛选行
  • 编辑单元格

通过向show_grid函数传递更多的参数,还可以启用更多的交互式选项。你可以在官方 GitHub 页面上阅读更多关于 Qgrid 全部功能的细节。

结论

所以你有它!4 个增强 Jupyter 笔记本的绝妙技巧。

如果你想吃更多,不用担心!还有更多 Jupyter 小部件和扩展可供使用。作为推荐阅读,官方的 Jupyter 笔记本文档是一个很好的起点。

喜欢学习?

在推特上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也请在 LinkedIn上与我联系!

4 种在 Google Colab 中加载 ML 数据的好方法

原文:https://towardsdatascience.com/4-awesome-ways-of-loading-ml-data-in-google-colab-9a5264c61966?source=collection_archive---------9-----------------------

🤖深度学习

用各种 API 和包在 Google Colab 中加载数据。

The ocean of data! Source

Google Colaboratory 或 Colab 已经成为 ML 初学者和研究人员最喜欢的开发环境之一。这是一款基于云的笔记本电脑,一定有什么很棒的方法可以将机器学习数据从你的本地机器上传到云端。

我们将讨论一些避免你直接点击“上传”按钮的方法!

1)从 GitHub repo 获取数据

Source

如果你正在做一个项目,它有自己的数据集,如任何对象检测模型,分类模型等。然后我们将直接从 GitHub 中提取数据集。

如果数据集在存档文件中(。拉链还是。焦油),我们可以把它记在我们的笔记本上,

  1. 打开 GitHub repo,从“查看原始数据”文本中复制 URL。

The “View Raw” option gives us a downloadable link to the file.

注意:您复制的 URL 应该以?raw=true标签结尾。只有这样,requests模块才会提取 ZIP 文件。

此外,您可以随时克隆整个回购协议,

!git clone <repo_url>

2.仅此而已!现在使用requestszipfile软件包,我们可以将数据直接下载到笔记本电脑中。

import requests, zipfile, io#The copied URL goes here ->
r = requests.get( 'https://www.github.com/shubham0204/...' ) z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()

这种方法会有一些限制。我们不能在 GitHub 上推送任何大于 100 MB 的文件。因此,对于较小的自定义数据集,这种方法可能是一种变通方法。

2)直接使用 wget Linux 命令

Google Colab 运行在基于 Linux 的主机上。所以我们可以直接在上面运行 Linux 命令。这很简单,而且降低了下载速度。

!wget <dataset_url>

如果是 ZIP 文件,我们可以用unzip命令解压,

!unzip images.zip /content/images/

详细用法见此处。

3)安装你的谷歌硬盘

Source

如果你正在做一个个人项目,并且在 Google Drive 上存储文件对你来说并不乏味,那么我们总是可以安装 Google Drive 。

from google.colab import drivedrive.mount('/gdrive')

一个好处是,如果我们正在训练一个像预训练 VGG 或盗梦空间这样的大型模型,保存的 Keras 模型(. h5)的大小会达到大约 500 MB,甚至权重也有大约 100–200 MB 的大小。当我们挂载 Google Drive 时,模型可以直接保存在你的云存储桶中。

当运行时重新启动或修改时,您不需要上传/下载已训练的模型。

4)将数据集上传到 Kaggle

Source

你可以上传非常大的数据集到 Kaggle.com。我们可以启用“私有数据集选项来保护隐私。Kaggle 提供了大量现成的数据集,所以你应该考虑使用 Kaggle API 。

我们可以使用 Colab 中的 API,

!echo '{"username":"<username_here>","key":"<key_goes_here>"}' > /root/.kaggle/kaggle.json!kaggle datasets download -d nltkdata/movie-review!unzip /content/movie-review.zip -d review

我的帐户生成 API 令牌- > API

Click “Create New API Token”.

将下载一个包含用户名和令牌密钥的文本文件。将它们复制到上面的代码中。然后你就可以在 Google Colab 中使用 Kaggle 了!

等等,还有…

就这样

希望这些方法有助于将您的数据加载到 Google Colab。在你的脑海中有不同的方式?在评论中分享它们,让它们被添加到这里!

4 种常见的黑客马拉松

原文:https://towardsdatascience.com/4-common-types-of-hackathons-7daba7296ae1?source=collection_archive---------17-----------------------

正如上一篇文章中提到的,并不是只有一种比赛叫做黑客马拉松。近年来,黑客马拉松不仅面向精通技术的人,还需要技术人员、设计师和商人之间的合作。根据我自己的经验,我将黑客马拉松分为四个主要类别。我将从技术含量更高的开始,转到商业元素更多的部分。你可以根据自己的能力和兴趣决定加入哪一个。

Photo by cyda

1。编码比赛

黑客马拉松(Hackathon),看这个“黑客”加“马拉松”的词,你马上就能把它和密集的编码竞赛联系起来。事实上,这是 1999 年由 OpenBSD 组织的首届黑客马拉松的真实性质。那时,黑客马拉松大多是线下形式,技术专家聚集在一个地方,夜以继日地为一个编程项目工作。现在,随着技术的提高,许多编码竞赛被放到了网上,因此没有边界限制,参赛者可以在家里或任何他们喜欢的时间完成任务。就持续时间而言,在线比赛可能持续 1 个月到 3 个月甚至半年,可能包括几轮提交或半决赛,而线下比赛可能只举行 1 天到 1 周,可能在黑客日之前有一个参与者选择过程。除了线下和线上,还有两者的结合。其中一个著名的例子是 Google Code Jam (查看链接了解更多)。参与者将解决一系列在线算法问题,决赛选手将被邀请参加在某地举行的世界决赛。

不管是哪种格式,都有一个共同的目标,那就是找出以最有效的方式(速度)编写的程序和/或能给出最准确的结果(准确性)。有一个非常明确的判断标准,可能是 log loss 函数,也可能是组织者定义的非常复杂的逻辑。不管你用了什么方法论,简单的还是先进的,只要你的算法能得最高分,你就能打败其他竞争对手。

Photo by Max Duzij on Unsplash

2。数据通

Datathon 是编码竞赛的一个子集,它也有在线和离线版本,为什么我把它放在另一个类别中是因为这种竞赛有一个焦点,它的名字就是数据。Datathon 可能不是一个常用的名称(其他人简单地称之为黑客马拉松),但我将使用它来描述提供数据集的黑客马拉松,参与者需要根据数据开发算法。一个完美的例子就是 Kaggle 竞赛。除了作为一个托管数十个 datathons 的平台之外,它还是一个非常好的获取开放数据集和向他人学习的网站。一些参与者会公开他们的笔记本,这样即使你不参加比赛,你也可以查看他们的代码。因此,如果你是数据科学领域的初学者,我强烈推荐你访问 Kaggle,探索你感兴趣的话题,你可以找到很多资源和笔记本例子。

Photo by Goran Ivos on Unsplash

3。黑客马拉松

大多数名为黑客马拉松的普通比赛不太受技术驱动,或者我会说他们在评判标准中有商业元素的权重。不像前两个只适合程序员或数据科学家,这种类型的黑客马拉松需要演示和原型演示,因此,除了技术人员,还需要营销人员和 UI/UX 设计师。具体来说,业务人员应该也是最有形象的人,他们将负责业务计划的演示和思考,以使解决方案在经济上合理,而设计师将负责用户体验,并使原型足够花哨,以吸引观众的注意。最后但并非最不重要的是,技术人员可能是程序员或数据科学家,这取决于主题(有时需要两者),将是制作功能性原型的核心人员,以说明解决方案的技术可行性。关于角色的更多细节将在的下一篇文章中讨论。

Photo by Kaleidico on Unsplash

4。商业案例竞赛

有时,你会发现商业案例竞赛也使用黑客马拉松这个名字,因为组织者可能希望包含更多的技术成分。因此,在这种类型的竞赛中,参与者可能需要解释他们在解决方案设计中使用的技术,但他们可能不需要制作嵌入了上述技术的原型。如果你是一个商务人士,可能不知道如何做建模,你可能会喜欢这种比赛,但你如何区分这种和其他三个类别。看规则就知道了。与通常的案例竞赛类似,参与者需要在演示日之前提交一份提案或演示文稿来说明解决方案。如果您在规则中看到这种情况,很可能这是一个商业案例竞争。

Photo by Campaign Creators on Unsplash

希望你能找到最适合自己的。享受黑客马拉松的乐趣。如果你想了解更多关于黑客马拉松的信息,请继续关注我的黑客马拉松系列;)

如果你觉得我的文章有用,请在我的 linkedIn 页面上为我的技能背书,鼓励我写更多的文章。

最初发表于 cydalytics.blogspot.com 的

[## 欢迎来到黑客马拉松的世界

学生应该加入黑客马拉松的 5 个理由

medium.com](https://medium.com/series/welcome-to-the-world-of-hackathon-81d194abbec4)

分析模型的 4 个组成部分

原文:https://towardsdatascience.com/4-components-of-an-analytics-model-b087797f9a7a?source=collection_archive---------16-----------------------

每个对实践数据科学感兴趣的人都必须熟悉分析模型的基本组件。本文将讨论分析模型的 4 个主要组成部分,即:1)数据部分,2)算法部分,3)现实世界部分,以及 4)伦理部分。

来自数据科学培训课程的知识对于获得组件 1 和 2(数据组件和算法组件)的技能是必要的。组件 3 和 4(真实世界组件和道德组件)中的技能主要通过真实世界数据科学项目获得。在构建分析模型时,重要的是要记住,模型必须产生现实生活中有意义和可解释的结果。这就是人类经验的来源。人类(合格的数据科学专业人员)必须检查算法和计算机产生的结果,以确保在推荐部署模型之前,结果与真实世界的情况一致。

现在让我们讨论分析模型的 4 个基本组成部分。

分析模型的 4 个基本组成部分

1.数据成份

该组件包含有关数据的所有内容,包括以下内容:

I)数据来源

本节涉及所有数据来源,例如

a)收集数据的实验或调查设计

b)从挖掘和存储大型数据集的组织购买数据

c)开放数据集的使用

d)模拟原始数据以将其与实际采样数据相结合

ii)数据准备和转换

它处理预处理原始数据,将其转换为可用于分析或模型构建的形式,包括以下主题

a)处理缺失数据

b)数据插补

c)编码分类数据

d)预测器特征和目标特征的识别

e)数据缩放,例如特征标准化或规范化

f)特征选择和降维

g)先进的数据转换方法,如 PCA 和 LDA

可用于数据准备和转换的软件包括

  • 熊猫套餐
  • 擅长
  • 稀有
  • 计算机编程语言

2.算法组件

这些是应用于数据的算法,目的是从数据中获取有用且有洞察力的信息。这些算法可以分为描述性的、预测性的或规范性的。

I)用于描述性分析的算法

其中包括可应用于可视化数据的软件包,例如生成柱状图、线图、直方图、散点图、配对图、密度图、QQ 图等的算法。一些最常见的描述性分析包包括

a) Matplotlib

b) Ggplot2

c) Seaborn

ii)预测分析算法

这些是用于建立预测模型的算法。一些最常见的预测分析包包括

  • Sci-kit 学习包
  • 插入符号包
  • 张量流

预测分析算法可以进一步分为以下几组:

a)监督学习(连续变量预测)

  • 基本回归
  • 多元回归分析
  • 正则回归

b)监督学习(离散变量预测)

  • 逻辑回归分类器
  • 支持向量机分类器
  • k 近邻(KNN)分类器
  • 决策树分类器
  • 随机森林分类器

c)无监督学习

  • Kmeans 聚类算法

iii)用于说明性分析的算法

这些算法可用于根据从数据中获得的见解来指定活动的疗程。一些规定的分析算法包括

a)概率建模

c)优化方法和运筹学

c)蒙特卡罗模拟

3.真实世界组件

请记住,你可能非常擅长处理数据以及构建良好的机器学习算法,但作为一名数据科学家,现实世界的应用才是最重要的。每一个机器学习模型都必须产生现实生活中有意义和可解释的结果。预测模型必须根据实际情况进行验证,才能被认为是有意义和有用的。因此,人类的输入和经验对于理解算法产生的结果总是必要和有益的。

为了在现实世界中胜任,一个人必须获得超出数据科学和机器学习学术培训计划所提供的技能。仅仅从课程工作中获得的技能不会让你成为数据科学家。合格的数据科学家必须能够证明成功完成真实世界数据科学项目的证据,该项目包括数据科学和机器学习问题工作流中的所有阶段,如问题框架、数据获取和分析、模型构建、模型测试、模型评估和模型部署。现实世界的数据科学项目可以通过以下方式获得:

a) Kaggle 项目

b)实习

c)来自访谈

从事真实世界的数据科学项目将使您加深对模型构建工作流程的理解,从问题框架到数据分析、模型构建和测试以及模型应用。它还会帮助你获得额外的基本技能,例如

  • 通讯技能
  • 团队合作技能
  • 演示技巧
  • 商业头脑

4.伦理成分

作为实践数据科学家,这是维护高道德标准的组成部分。作为一名数据科学家,理解项目成果和发现的含义是很重要的。对自己诚实。避免操纵数据或使用有意造成结果偏差的方法。从数据收集到分析、模型构建、测试和应用的所有阶段都要符合道德规范。避免为了误导或操纵你的听众或主管而捏造结果。在解释你的数据科学项目的发现时要合乎道德。

总之,我们已经讨论了分析模型的 4 个基本组成部分。每个对实践数据科学感兴趣的人都必须熟悉分析模型的基本组件。

4 数据处理的设计原则

原文:https://towardsdatascience.com/4-design-principles-for-data-processing-964d6a45cb7c?source=collection_archive---------7-----------------------

设计模式的实践在面向对象编程(OOP)中最受欢迎,这在 Erich Gamma 和 Richard Helm 的经典著作《设计模式:可重用面向对象软件的元素》中得到了有效的解释和总结。下面是维基百科对设计模式的定义:

“一个软件设计模式是一个通用的、可重用的解决方案,用于解决软件设计中给定上下文中经常出现的问题。它不是一个可以直接转化为源代码或机器码的成品设计。这是一个关于如何解决问题的描述或模板,可以在许多不同的情况下使用。设计模式是形式化的最佳实践,程序员可以用它来解决设计应用程序或系统时的常见问题

对于数据科学,可能很多人都问过同样的问题:数据科学编程有设计模式吗?我会说是的。然而,为了将它们与 OOP 区分开来,我称之为数据科学的设计原则,这本质上意味着与 OOP 的设计模式相同,但是在更高的层次上。受 Robert Martin 的书《干净的体系结构》的启发,这篇文章关注数据处理和数据工程的 4 个顶级设计原则。我的下一篇文章将讨论优化性能的通用设计原则。在这两个领域中,都有可重复使用的解决方案和最佳实践,它们已经被证明:

  1. 缩短整体开发周期;
  2. 使数据过程更容易维护(无论使用哪种编程语言或数据准备工具);
  3. 使系统更加开放,易于操作;
  4. 从一开始就确保数据质量。

设计原则 1:始终从数据集和数据实体的设计开始

每个数据处理都有 3 个最基本的组成部分:输入数据、输出数据和其间的数据转换。无论何时设计数据流程,首先要做的是明确定义输入数据集和输出数据集,包括:

  • 所需的输入数据集和参考数据
  • 要创建的输出数据集
  • 每个数据集中的数据字段
  • 每个字段的数据类型,如文本、整数、浮点、列表等,
  • 确定每个记录唯一性的字段
  • 每个字段的预期数据模式,包括它是否可以有缺失值和不同的值列表
  • 数据集与组织中其他现有数据集的关系

这类似于应用于数据库的所谓数据建模,有时被称为“数据库逻辑设计”。这里的关键词是“逻辑”,因为它应该发生在实现决策之前。数据集可以写入磁盘并永久存储在公司内部,最终将成为其他流程和应用程序访问或使用的真正资产。因此,它确实很重要,应该准确、清晰地定义,并采用数据治理驱动的最佳实践和策略。特别是,应该根据业务需求或下游组件或流程的需求来定义输出数据集。输入数据集的定义应该与其来源保持一致,这样就可以很容易地跨不同的系统追踪数据谱系。

在逻辑设计之后,给定数据集的物理位置和数据结构可以作为系统设计的一部分来确定。物理结构可能与逻辑设计不同,这种情况经常发生。一个典型的例子是,逻辑设计中的字段名应该有正常的单词,使其更有意义和可读性,而物理字段名必须考虑系统或软件的限制。例如:

  • 逻辑字段名称:员工姓名
  • 物理字段名(不能有空格,并且有字符数限制):emp_nm

当组织中的数据平台改变时,逻辑定义不应改变,而数据集的物理表示可以根据系统需求和功能重新设计。

如果流程流需要多个步骤,则还需要定义中间数据集的内容,这可以用于不同的目的:

  • 用于数据质量检查
  • 提供流程检查点和阶段,以便流程在失败时不需要总是从头重新运行
  • 作为另一个子流程的输入,或者可供其他系统或用户使用

与数据处理逻辑的代码相比,数据实体需要花费更长的时间和更多的精力来进行影响更大的更改,主要是因为它已经保存了数据,并且可以被其他处理使用。另一方面,一旦定义了输入、中间和输出数据集,数据处理本身的框架就就位了。我们经常看到数据工程师在没有明确定义输出的情况下就开始构建流程。这很容易导致两个后果:1)当输出改变时,更大的改变或者甚至是过程的修补;2)使输出依赖于处理逻辑,因此,错过了一些需求或定义不清。因此,在开始设计技术流程之前,一定要先定义数据集。事实上,处理逻辑很大程度上取决于输入和输出的数据定义。

数据集和数据实体的逻辑设计也与最初的业务需求收集、数据发现和数据治理过程紧密相关,以遵循组织标准。此外,仔细的逻辑设计应该考虑组织内的数据共享,如果一个字段或数据已经存在于公司的其他地方,则避免重复的数据集(参见我的文章:主数据管理:数据策略的基本部分)。最后,具有良好治理的数据集的清晰逻辑设计是从一开始就确保数据质量的关键步骤(参见我的文章:确保和维持数据质量的 7 个步骤)。

设计原则 2:将业务规则与处理逻辑分离

在罗伯特·马丁的《干净的架构》一书中,原则之一是从软件的角度,特别是 OOP 功能的角度,将业务规则与插件分离。然而,在数据工程中,存在类似的原则,而业务规则具有更广泛的含义。首先,业务规则由不同的类型组成,例如,营销、财务、安全或法规遵从性方面的特定方法。在许多情况下,数据清理和标准化的规则也可以由业务部门驱动,因此,被认为是业务规则。业务规则通常有 3 个特征:

  1. 需要由业务组织或业务分析师审查
  2. 可能经常改变,需要快速周转
  3. 如果配置或执行不当,会导致严重的影响和后果

业务规则的管理和执行对于数据流程的成功至关重要。一个好的设计应该考虑以下几个方面:

  1. 模块化

相同类型的规则应该在相同的数据流程、模块或函数中处理。另一方面,不同类型的规则不应该驻留在同一个进程、模块或函数中。否则,管理业务规则变化的影响会变得很困难,并且流程会变得更加难以维护。

让我们举一个处理客户调查数据的小例子,您需要清理原始数据,将其标准化,然后将标准化的数据加载到数据库表中。这里的输出是标准的数据库表,您的调查数据是原始输入。有两种建立流程的方法:

数据清理的规则不同于字段映射的规则:数据清理规则基于输入数据的值,而字段映射基于输入和输出的数据结构。鉴于此,选项 1 更好,因为它允许数据清理规则独立于字段映射规则进行更改,因此与选项 2 相比,更加灵活和简单,并且对规则修改的影响更小。换句话说,不同类型的规则的清楚分离导致更好的规则管理,而对其他类型的规则以及其他处理逻辑的影响最小。此外,专注于一种类型的业务规则的特殊功能或模块可以在需要时成熟为独立的服务,然后可以针对其他用例单独轻松地进行更改或增强。

2。业务规则的元数据存储

只要有可能,经常改变的业务规则部分应该被抽象出来,并存储在与编程代码本身分离的存储库(例如,数据库)中。有了这种分离,就可以在其上构建应用程序或 API,业务分析师和/或业务用户可以通过它们来检查和修改业务规则。在处理方面,引擎只是在执行时从存储库中读取规则,并将规则应用于输入数据,而不需要将任何业务逻辑硬编码到流程本身中。

3。业务规则版本化和日志记录

在元数据存储库中单独存储和管理业务规则之后,进一步的版本控制和日志记录功能变得非常强大,使用户能够在新版本中更改规则,并在批准或发布更改之前将结果与以前版本的结果进行比较。此外,记录每个业务规则之前和之后的结果对于控制规则执行的准确性和确保从规则引擎创建的输出数据的质量是至关重要的。

设计原则 3:从一开始就构建异常

数据永远不可能是完美的,因此,我们首先永远不要假设输入数据是完美的。在初始设计中,应考虑数据异常处理,如下所示:

  • 数据集是否具有预期的格式?
  • 输入数据集的记录数是否正确,或者是否为空?如果文件为空,许多编程语言不会失败—需要显式捕获空文件异常。
  • 每一列都有正确的数据类型吗?同样,当一些记录中的少数值具有错误的格式时,一些程序可能会悄无声息地失败。
  • 定义应该引发异常的条件:1)在流程可以继续时应该有警告,还是应该流程失败;2)谁会收到警报?

首先,处理数据异常对于确保数据质量至关重要。一个设计良好的流程应该预先定义所有这些异常,并在流程中捕获这些异常。这些异常不仅会导致实时警报,还会被反馈到集中式数据质量报告和仪表板中。

设计原则 4:使用标准输入和输出易于集成

如何才能让一个数据流程易于集成?一个重要的原则是创建标准化的输入和输出层来“封装”主流程。如下图所示,标准化输入数据的过程应该与主过程分离和分离,主过程的输出是主过程的标准输入数据集。将来,如果有多一种类型的输入数据,可以建立和集成单独的标准化流程,而不改变主流程。这也适用于输出-当需要生成可能不同格式的输出时,应首先生成标准输出图层。这允许通过构建一个单独的流程从标准输出生成未来的输出,而不需要改变主流程。显然,标准的输入和输出数据集在连接点上起作用,这样其他流程可以很容易地与主流程集成。

结论

本文总结了数据处理和工程的 4 个设计原则。这些原则不仅应该被数据架构师用于设计大型系统,还应该被数据科学家和数据工程师用于较小的过程。如果这些原则以一种有纪律的方式被采用,一个设计良好的数据过程将使它更容易维护,更有效地被改变而对系统的其他部分影响更小,并且最后提供比那些不遵循上述原则的更好的数据质量。

提高机器学习代码性能的 4 个简单步骤

原文:https://towardsdatascience.com/4-easy-steps-to-improve-your-machine-learning-code-performance-88a0b0eeffa8?source=collection_archive---------9-----------------------

我想向你展示 4 个简单的步骤,这将帮助你,在没有任何优化知识的情况下,至少将你的代码加速两次,并使它更有效和可读。

每天有多少新的机器学习库和模型被创建出来,这真的令人震惊。但令人失望的是,它们中的大部分都没有经过适当的设计。实际上,有时背后有好想法的好东西只是没有被使用,因为它没有被很好地记录,有困难或不直观的 API,或者只是因为它没有很好地执行并且对于生产环境来说太慢。一个很好的例子就是我在上一篇文章中提到的库— normalize 。这是一个美丽的想法,它产生的结果确实可以在一些 nlp 任务中产生影响,但其中有一些意想不到的错误,API 不够灵活。好吧,你说,这两件事并不重要,实际上,你可以挺过去。但是你不能忍受的是它的性能很糟糕,它只是,所以不能在生产环境中使用。

我想鼓励每个人,那些创建机器学习库或只是展示自己的可重用代码片段的人,尽可能地优化它。因为每个人,或多或少都想有所作为或让这个世界变得更好一点,帮助其他人缩短他们走过的路,并立即获得更好的结果。我想向你展示 4 个简单的步骤,这将帮助你,在没有任何优化知识的情况下,至少将你的代码加速两次,并使它更有效和可读。

高效地计算你的数学

船长明显说:“使用你的工作与图书馆的数学函数或只是使用 numpy,你会一直没事”。他是对的,因为在大多数情况下,库的作者在某种程度上优化了所有的函数,使他的代码尽可能的快。但是几乎每个 python ML 库都是基于 numpy 的。Numpy 官方网页上写着:

NumPy 是使用 Python 进行科学计算的基础包。除其他外,它包含:

一个强大的 N 维数组对象

复杂的(广播)功能

集成 C/C++和 Fortran 代码的工具

有用的线性代数、傅立叶变换和随机数功能

实际上,在 ML 中我们只是不断地做一些矩阵运算。Numpy 使用你能想到的所有可能的最先进的优化技术来提高所有这些操作的效率。所以规则一:

用 numpy 代替 python math,用 numpy 数组代替 python 数组。

如果你遵循这第一条简单的规则,你很快就会感觉到不同。

向量化您的函数

如何摆脱恼人的 for 循环,它只是在一组输入上应用相同的函数?把这个函数矢量化就行了!Numpy 允许您向量化一个函数,这意味着新创建的函数将应用于列表输入并产生一个函数结果数组。根据这篇帖子,它可能会让你的计算速度提高至少两倍。我强烈推荐阅读它,因为作者展示了 forloops 和 numpy 矢量化的漂亮对比,并展示了测量结果,证明 numpy 矢量化工作更快!让我们来看一些简单的代码片段,来展示它是如何工作的:

import numpy as np
from math import sin, cos, gammadef func(x):
    if x > 10 * sin(x) * cos(x):
        return sin(x) * cos(x)
    elif x**100 < (x-1)**101:
        return x**89
    elif x**100 - gamma(x) < (x-1)**101 * gamma(x):
        return gamma(x)
    else:
        return x**56arr = np.random.randn(10000)# FoorLoop method
res = []for i in arr:
    res.append(func(i))# Numpy Vectorizationfunc_vect = np.vectorize(func)
res_vet = func_vect(arr)

在这种情况下,Numpy 矢量化代码的运行速度提高了 2 倍!矢量化不仅有助于加快代码速度,还能使代码更加整洁。例如,使 nltk 中的词干处理在所有令牌上运行,而不是只在一个令牌上运行:

import numpy as np
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenizetokens = word_tokenize(text)
porter = PorterStemmer()# vectorizing function to able to call on list of tokens
stem_words = np.vectorize(porter.stem)tokens_stems = stem_words(tokens)

它看起来比一个看起来更好的选择:

import numpy as np
from nltk.stem import PorterStemmer
from nltk.tokenize import word_tokenizetokens = word_tokenize(text)
porter = PorterStemmer()def stem_words(tokens):
    stems = []
    for t in tokens:
        stems.append(porter.stem(t))
    return stemstokens_stems = stem_words(tokens)

总之,矢量化是一种非常强大的机制,它不仅可以帮助您加快代码速度,还可以让代码看起来更整洁。

sklearn 中的 n_jobs

现在几乎每台计算机都有不止一个内核。不使用所有的,如果你付了钱,对我来说是一种犯罪。事实上,你必须从你的电脑上拿走它能给你的一切。对于 ML 开发者来说,他的计算机不必是一个漂亮和花哨的东西,首先,它是一个勤奋的矿工,必须像苏联的 Stakhanov 一样分三班工作。你只需要从你的电脑上拿走它能给你的一切,如果你仍然不明白为什么,只要记住一件简单的事情:“你已经为此付出了代价”。ML 开发者在他的管道中使用更多内核的最简单方法就是不要忘记在他使用的每个 sklearn 模型中设置 n_jobs 参数。 n_jobs 告诉 sklearn 并行运行多少个作业来拟合和预测模型。大多数 sklearn 模型支持并行训练和转换。这将有助于您在大型或高维数据集上搜索最佳参数或训练模型时节省大量时间。注意不要将 n_jobs 设置为 -1 ,因为并行化节省的是你的时间,而不是 RAM。是的,实际上并行化可能会占用大量内存,但是使用至少 2 个作业而不是 1 个作业已经可以帮助您优化模型训练和预测性能。

MapReduce

维基百科说:

MapReduce 是一种编程模型和相关实现,用于在集群上使用并行分布式算法处理和生成大数据集。

看起来很复杂,就像只能在大型集群或大型数据集上使用的东西,对吗?但是这很简单,我将用几句话和一个例子来解释。

MapReduce 分为两部分:

  1. map——函数,它以某种方式将输入修改为输出。这个函数在每个需要处理的数据样本上被调用。这一步是并行的,因为对于每个样本,事实上,你做同样的操作。
  2. Reduce 函数,聚合 map 函数的所有输出。这一步通常是连续的。

例如,您必须计算一组数据的平方和。顺序实施看起来像这样:

arr = [1, 2, 3, 4, 5]result = 0
for i in arr:
    result += i**2

让我们将这个任务转换成 MapReduce:

  1. 地图—计算数字的平方
  2. 减少-计算地图结果的总和

python 中的顺序实现:

from functools import reducearr = [1, 2, 3, 4, 5]map_arr = map(lambda x: x**2, arr)
result = reduce(lambda x, y: x + y, map_arr)

如前所述,map 部分将被并行化,reduce 将保持顺序。让我们看一下并行化实施:

import multiprocessing as mp
from functools import reducedef pow2(x):
    return x**2arr = [1, 2, 3, 4, 5]# count of avaliable cores, of course you can use less for computations
cores = mp.cpu_count()
pool = mp.Pool(cores)map_arr = pool.map(pow2, arr)
result = reduce(lambda x, y: x + y, map_arr)pool.close()
pool.join()

所以现在对于这个任务,你使用你的计算机的所有力量!。map 池对象的方法假设 map 函数只有一个参数,有一个等价的。星图其中假设了不止一个自变量的星图函数,这些函数的完整描述你可以在这里找到。值得一提的是,两者都是。映射。starmap 按照与输入参数相同的顺序返回映射值。

有时,不仅在一个样本上,而且在一批样本上计算 map 函数更有效。如果计算任务足够简单和快速,多处理计算的主要开销将是在进程间传输数据,这会大大降低进程速度。在我的帖子的前一部分,我们讨论了 sklearn 模型的 n_jobs 参数,让我们创建 base transformer 的通用代码片段,它可以并行化其转换过程,在这种情况下,批处理将是最佳选择。

下面是 pandas 在基本 sklearn 转换器中应用并行化的代码片段,您可以在以后的管道中使用它:

import multiprocessing as mp
from sklearn.base import TransformerMixin, BaseEstimatorclass ParallelTransformer(BaseEstimator, TransformerMixin):
    def __init__(self,
                 n_jobs=1):
        """
        n_jobs - parallel jobs to run
        """
        self.variety = variety
        self.user_abbrevs = user_abbrevs
        self.n_jobs = n_jobs def fit(self, X, y=None):
        return self def transform(self, X, *_):
        X_copy = X.copy() cores = mp.cpu_count()
        partitions = 1

        if self.n_jobs <= -1:
            partitions = cores
        elif self.n_jobs <= 0:
            partitions = 1
        else:
            partitions = min(self.n_jobs, cores)

        if partitions == 1:
            # transform sequentially
            return X_copy.apply(self._transform_one)

        # splitting data into batches
        data_split = np.array_split(X_copy, partitions)

        pool = mp.Pool(cores)

        # Here reduce function - concationation of transformed batches
        data = pd.concat(
            pool.map(self._preprocess_part, data_split)
        )

        pool.close()
        pool.join() return data def _transform_part(self, df_part):
        return df_part.apply(self._transform_one) def _transform_one(self, line): # some kind of transformations here
        return line

我来总结一下这段代码。确定是并行还是顺序处理数据集。如果是并行的,将所有数据分成 n_jobs 批并并行转换,然后连接回数据集的转换批。仅此而已!我希望这个代码片段能够帮助您提升您的转换管道。

我希望你喜欢我的帖子,如果你有进一步的问题,请在评论中提问,我很乐意回答。期待您的反馈!

附言:如果你是一个有经验的开发人员,想要为开源做贡献,你可能的任务之一就是帮助好的但未优化的库变得更快并准备好生产。如果不知道,从哪里入手,可以帮助规格化库,优化其性能。我和这个库的作者没有任何联系,他们不付我钱,它也不是一个广告。只是另一个图书馆,需要你的帮助;)

使用 cuGraph 为数据科学家提供 4 种强大的图形算法

原文:https://towardsdatascience.com/4-graph-algorithms-on-steroids-for-data-scientists-with-cugraph-43d784de8d0e?source=collection_archive---------10-----------------------

Networks are everywhere. Photo by Anastasia Dulgier on Unsplash

GPU->Rapids->Cugraph->可扩展图形分析

作为数据科学家,我们已经对 Pandas 或 SQL 或任何其他关系数据库驾轻就熟。

我们习惯于以行的形式看到用户,以列的形式看到他们的属性。但是现实世界是这样的吗?

在一个互联的世界中,用户不能被视为独立的实体。它们彼此之间有一定的关系,我们有时希望在构建机器学习模型时包括这种关系。

现在,虽然在关系数据库中,我们不能在不同的行(用户)之间使用这种关系,但在图形数据库中,这样做相对来说比较简单。

现在,正如我们所知,Python 有一个很棒的包Networkx来做这件事。但问题是它不可扩展。

GPU 凭借其众多内核和并行性,可以帮助我们解决可扩展性问题。这就是 RAPIDS.ai CuGraph 的用武之地。

RAPIDS cuGraph 库是一个图形分析集合,用于处理 GPU 数据帧中的数据——参见 cuDF 。cuGraph 旨在提供一个数据科学家熟悉的类似 NetworkX 的 API,因此他们现在可以更容易地构建 GPU 加速的工作流。

在这篇文章中,我将谈论一些你应该知道的最基本的图算法,以及如何用 Python 和 cuGraph 实现它们。

装置

要安装 cuGraph,您可以根据您的系统和配置,使用从 rapids.ai 中选择的简单命令。

我使用的命令如下,并且我使用了夜间构建(推荐):

conda install -c rapidsai-nightly -c nvidia -c numba -c conda-forge -c anaconda cudf=0.10 cuml=0.10 cugraph=0.10

1.连接的组件

我们都知道聚类是如何工作的?

你可以用非常通俗的术语把连通分量看作是一种硬聚类算法,它在相关/连通数据中寻找聚类/孤岛。

举个具体的例子: 假设你有连接世界上任意两个城市的道路的数据。你需要找出世界上所有的大洲以及它们包含的城市。

你将如何实现这一目标?来吧,考虑一下。

我们使用的连通分量算法是基于 BFS/DFS 的一个特例。我不会在这里谈论它是如何工作的,但是我们将看到如何使用NetworkxcuGraph来启动和运行代码。

应用程序

从零售的角度来看:比方说,我们有很多客户使用很多账户。使用连通分量算法的一种方法是在数据集中找出不同的族。

我们可以基于相同的信用卡使用、相同的地址或相同的手机号码等假设客户之间的边(道路)。一旦我们有了这些连接,我们就可以在相同的上运行连接组件算法来创建单独的聚类,然后我们可以为这些聚类分配一个家族 ID。

然后,我们可以使用这些家庭 id 根据家庭需求提供个性化建议。我们还可以使用这个家族 ID,通过创建基于家族的分组特征来推动我们的分类算法。

财务角度:另一个用例是使用这些家庭 id 来捕获欺诈。如果一个帐户在过去进行过欺诈,则关联的帐户很可能也容易受到欺诈。

可能性只受到你想象力的限制。

密码

我们将使用 Python 中的Networkx模块来创建和分析我们的图表。

让我们从一个用于我们目的的示例图开始。包含城市和它们之间的距离信息。

Graph with Some random distances

我们首先创建一个边和距离的列表,我们将添加边的权重:

edgelist = [['Mannheim', 'Frankfurt', 85], ['Mannheim', 'Karlsruhe', 80], ['Erfurt', 'Wurzburg', 186], ['Munchen', 'Numberg', 167], ['Munchen', 'Augsburg', 84], ['Munchen', 'Kassel', 502], ['Numberg', 'Stuttgart', 183], ['Numberg', 'Wurzburg', 103], ['Numberg', 'Munchen', 167], ['Stuttgart', 'Numberg', 183], ['Augsburg', 'Munchen', 84], ['Augsburg', 'Karlsruhe', 250], ['Kassel', 'Munchen', 502], ['Kassel', 'Frankfurt', 173], ['Frankfurt', 'Mannheim', 85], ['Frankfurt', 'Wurzburg', 217], ['Frankfurt', 'Kassel', 173], ['Wurzburg', 'Numberg', 103], ['Wurzburg', 'Erfurt', 186], ['Wurzburg', 'Frankfurt', 217], ['Karlsruhe', 'Mannheim', 80], ['Karlsruhe', 'Augsburg', 250],["Mumbai", "Delhi",400],["Delhi", "Kolkata",500],["Kolkata", "Bangalore",600],["TX", "NY",1200],["ALB", "NY",800]]

现在我们想从这个图表中找出不同的大陆和它们的城市。

首先,我们需要创建一个带边的cudf数据框。现在,我正在创建一个熊猫数据帧,并将其转换为cudf数据帧,但在现实生活中,我们将从边缘的csv文件中读取。

import cugraph
import cudf
import pandas as pd# create a pandas dataframe of edges
pandas_df = pd.DataFrame(edgelist)
pandas_df.columns = ['src','dst','distance']# create a pandas dataframe of reversed edges as we have a undirected graph
rev_pandas_df = pandas_df.copy()
rev_pandas_df.columns = ['dst','src','distance']rev_pandas_df = rev_pandas_df[['src','dst','distance']]# concat all edges
pandas_df = pd.concat([pandas_df,rev_pandas_df])

现在我们的pandas df 包含两个方向的边。而我们在srcdst列中的节点名是str格式的。显然,cuGraph不喜欢这样,只使用整数节点 id。

# CuGraph works with only integer node IDs
unique_destinations = set()
for [src,dst,dis] in edgelist:
  unique_destinations.add(src)
  unique_destinations.add(dst)# create a map of city and a unique id
city_id_dict = {}
for i, city in enumerate(unique_destinations):
  city_id_dict[city]=i# create 2 columns that contain the integer IDs for src and dst
pandas_df['src_int'] = pandas_df['src'].apply(lambda x : city_id_dict[x])
pandas_df['dst_int'] = pandas_df['dst'].apply(lambda x : city_id_dict[x])

现在是我们应该关注的主要部分:

cuda_g = cudf.DataFrame.from_pandas(pandas_df)# cugraph needs node IDs to be int32 and weights to be float
cuda_g['src_int'] = cuda_g['src_int'].astype(np.int32)
cuda_g['dst_int'] = cuda_g['dst_int'].astype(np.int32)
cuda_g['distance'] = cuda_g['distance'].astype(np.float)G = cugraph.Graph()
G.add_edge_list(cuda_g["src_int"],cuda_g["dst_int"] , cuda_g['distance'])***cugraph.weakly_connected_components(G)***

最后一次调用的输出是一个cudf数据帧。

正如我们所看到的,标签对应于连接的组件 ID。

2.最短路径

继续上面的例子,我们得到一个图表,上面有德国的城市以及它们之间的距离。

****你想找出如何从法兰克福(起点)到慕尼黑的最短距离

我们用来解决这个问题的算法叫做 Dijkstra 。用 Dijkstra 自己的话说:

一般来说,从鹿特丹到格罗宁根的最短旅行方式是什么:从一个城市到另一个城市。是最短路径的算法,我大概二十分钟就设计好了。一天早上,我和我年轻的未婚妻在阿姆斯特丹购物,累了,我们坐在咖啡厅露台上喝一杯咖啡,我在想我是否可以这样做,然后我设计了最短路径的算法。正如我所说,这是一个 20 分钟的发明。事实上,它是在三年后的 59 年出版的。该出版物仍然可读,事实上,相当不错。它如此漂亮的原因之一是我没有用铅笔和纸来设计它。我后来才知道,不用铅笔和纸进行设计的一个好处是,你几乎是被迫避免所有可以避免的复杂性。最终,令我大为惊讶的是,这个算法成了我成名的基石之一。

— Edsger Dijkstra,在与 Philip L. Frana 的访谈中,ACM 通讯,2001【3】

应用程序

  • Dijkstra 算法的变体在谷歌地图中被广泛用于查找最短路线。
  • 你在沃尔玛超市。你有不同的过道和过道之间的距离。您希望为顾客提供从通道 A 到通道 d 的最短路径。

  • 你已经看到 LinkedIn 如何显示一级关系,二级关系。幕后发生了什么?

密码

我们已经有了之前的图表。我们可以找到从一个源节点到图中所有节点的最短距离。

# get distances from source node 0
distances = cugraph.sssp(G, 0)# filter infinite distances
distances = cugraph.traversal.filter_unreachable(distances)distances

现在,如果我们必须找到节点 0 和 14 之间的路径,我们可以使用距离cudf

# Getting the path is as simple as:path = []dest = 14
while dest != 0:
   dest = distances[distances['vertex'] == dest]['predecessor'].values[0]
   path.append(dest)# reverse the list and print
print(path[::-1])
-------------------------------------------------------
[0, 11, 9]

3.Pagerank

这是长期以来为谷歌提供动力的页面排序算法。它根据输入和输出链接的数量和质量给网页打分。

应用程序

Pagerank 可以用在任何我们想要评估任何网络中节点重要性的地方。

  • 它已经被用于通过引用来寻找最有影响力的论文。
  • 已经被谷歌用来对网页进行排名
  • 它可以用来对 tweets 进行排序——用户和 Tweets 作为节点。如果用户 A 关注用户 B,则在用户之间创建链接;如果用户发推文/转发推文,则在用户和推文之间创建链接。
  • 推荐引擎

密码

在这个练习中,我们将使用脸书的社交网络数据。

# Loading the file as cudffb_cudf = cudf.read_csv("facebook_combined.txt", sep=' ', names=['src', 'dst'],dtype =['int32','int32'])# adding reverse edges also
rev_fb_cudf = fb_cudf[['dst','src']]
rev_fb_cudf.columns = ['src','dst']
fb_cudf = cudf.concat([fb_cudf,rev_fb_cudf])

创建图表

# creating the graph
fb_G = cugraph.Graph()
fb_G.add_edge_list(fb_cudf["src"],fb_cudf["dst"])

FB User Graph

现在我们想找到具有高影响力的用户。

直观地说,Pagerank 算法会给一个有很多朋友的用户更高的分数,而这个用户又有很多 FB 朋友。

# Call cugraph.pagerank to get the pagerank scores
fb_pagerank = cugraph.pagerank(fb_G)
fb_pagerank.sort_values(by='pagerank',ascending=False).head()

4.链接预测

继续我们在脸书的例子。您可能已经在您的脸书帐户中看到了推荐的朋友。如何才能创建我们的小推荐器呢?

我们可以根据当前的边来预测未来哪些边会被连接吗?

一种简单快速的方法是使用 Jaccard 系数。

应用程序

链路预测可能有许多应用。我们可以预测

  • 那些打算在一个引用网络中建立合作关系的作者
  • 谁会成为社交网络中的朋友?

想法

我们计算两个节点 I 和 j 之间的 Jaccard 系数如下:

其中,分子是 I 和 j 的共同邻居的数量,分母是 I 和 j 的不同邻居的总数。

因此,在图中,一半红色和一半绿色的节点是 A 和 b 的共同邻居,它们总共有 5 个不同的邻居。所以 JaccardCoeff(A,B)是 2/5

密码

我们首先用所有可能的节点组合创建一个cudf_nodes cudf。

max_vertex_id = fb_pagerank['vertex'].max()
data = []
for x in range(0,max_vertex_id+1):
  for y in range(0,max_vertex_id+1):
    data.append([x,y])
cudf_nodes =cudf.from_pandas(pd.DataFrame(data))
cudf_nodes.columns = ['src','dst']cudf_nodes['src'] = cudf_nodes['src'].astype(np.int32)
cudf_nodes['dst'] = cudf_nodes['dst'].astype(np.int32)

然后,我们可以计算节点之间的 Jaccard 系数,如下所示:

jaccard_coeff_between_nodes = cugraph.link_prediction.jaccard(fb_G,cudf_nodes["src"],cudf_nodes["dst"])
jaccard_coeff_between_nodes.head()

但我们仍未完成。 我们需要去掉source==destination处的边和图中已经存在的边。我们将使用简单的连接和过滤操作来实现这一点,这些操作与 pandas 非常相似。

jaccard_coeff_between_nodes=jaccard_coeff_between_nodes[jaccard_coeff_between_nodes['source']!=jaccard_coeff_between_nodes['destination']]
fb_cudf.columns = ['source', 'destination']
fb_cudf['edgeflag']=1
jaccard_coeff_joined_with_edges = jaccard_coeff_between_nodes.merge(fb_cudf,on= ['source', 'destination'],how='left')
# We just want to see the jaccard coeff of new edges
new_edges_jaccard_coeff = jaccard_coeff_joined_with_edges[jaccard_coeff_joined_with_edges['edgeflag']!=1]

这是我们最终排序的数据帧,带有未连接节点之间的 Jaccard 系数。我们知道向我们的平台用户推荐什么样的朋友。

new_edges_jaccard_coeff.sort_values(by='jaccard_coeff',ascending=False)

基本网络统计

关于你的网络,有很多你想知道的基本措施。

以下是你如何让他们进入你的社交网络

print("Number of Nodes",fb_G.number_of_nodes())
print("Number of Edges",fb_G.number_of_edges())
------------------------------------------------------
Number of Nodes 4039 
Number of Edges 176468

您还可以计算每个节点的 indegree 和 outdegree。

在有向图中,这对应于追随者的数量和追随者的数量。

fb_G.degrees().head()

性能基准

如果我不为不同的算法添加特定的基准,我就不能公正地对待这篇文章。

在我的基准研究中,我使用了斯坦福大学大型网络数据集集合中的三个数据集,按规模递增的顺序排列。

  1. 自我-脸书:来自脸书的无向图,有 个 4 K 节点和 88 K 条边
  2. 自我推特:有向图,有 81 K 个节点和 1.7 米 条边
  3. ego-Gplus :来自 Google+的带有 107 K 个节点和 13.6 M 条边的有向图

下面是我在 NVIDIA 特斯拉 V100 32 GB GPU 上进行的实验结果。感谢 NVIDIA 的 Josh Patterson 和 Walmart Labs 的 Richard Ulrich 为我做的安排。所有时间都以毫秒为单位:

我没有在结果中添加 Jaccard 系数,因为它甚至不能在使用 networkX 的 facebook 上运行。对于 cuGraph,它有毫秒级的延迟。

让我们想象一下这些结果:

Scales well for Weakly Connected Components compared to NetworkX

cuGraph is pretty good with shortest paths. As you can see, the algorithm takes negligible time compared to networkX

It is on PageRank that cuGraph truly shines. NetworkX is not at all viable for PageRank when compared with cuGraph.

警告

Rapids cuGraph是一个优秀的图形分析库,但是我感觉还缺少一些东西。也许我们会在下一个版本中得到它们。

  • 有点不方便,我们只能使用数据类型为 int32 的编号节点。重新编号有助于解决这个问题。查看我的笔记本中的基准以获得准确的代码。检查函数cugraph.symmetrize_df来创建无向图。
  • 有些算法还没有实现。例如,我找不到 MST、中心性度量等。
  • 需要更多示例笔记本来记录最佳实践。我可能会去做其中的一些。
  • 库中没有可视化组件。我必须去networkx绘制图表。

但尽管如此,我还想补充一点,用 GPU 提供图形分析的想法太棒了,我可以忍受这些小问题。 以及他们让 API 与pandasnetworkx如此相似的方式增加了它的价值。

我记得以前用 GPU 需要很多代码。RAPIDS 的目标是让 GPU 无处不在,这是一个了不起的创举。

结论

在这篇文章中,我谈到了一些改变了我们生活方式的最强大的图形算法,以及如何用 GPU 来扩展它们。

我喜欢 Rapids AI 一直致力于让典型的开发人员/数据科学家能够访问 GPU 的方式,并且认为我们直到一年前才听说过它。他们已经走了很长的路。

此外,这里是最新的 0.9 版本的文件为[cuDF](https://docs.rapids.ai/api/cudf/stable/)[cuGraph](https://docs.rapids.ai/api/cugraph/stable/)

你可以在这个 Google Colab 笔记本中获得运行代码,在我的 Github 存储库中获得带有基准的代码,因为 Google Colab 在基准测试时缺乏资源。

继续学习

如果你想阅读更多关于图算法的内容,这里有一个由 UCSanDiego 在 Coursera 上开设的大数据图分析课程,我强烈推荐你学习图论的基础知识。

谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。

此外,一个小小的免责声明——在这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。

大学需要教授的关于数据科学/分析的 4 件重要事情

原文:https://towardsdatascience.com/4-important-things-universities-need-to-teach-about-data-science-analytics-6ab5988639ca?source=collection_archive---------27-----------------------

从数据收集、预处理到非技术交流,这些都是专业人员处理数据的重要技能。

Photo by Pang Yuhao on Unsplash

如果你在阅读这篇文章时遇到任何困难,你可以通过下面的链接访问我的网站,绕过 Medium 的付费墙

[## 鲍比·马尔乔诺

数据分析师

www.bobbymuljono.com](https://www.bobbymuljono.com/)

尽情享受吧!

问题是

我记得我在本科时做的分析和机器学习项目,教授们希望我们通过在学期的最后几周实施课堂上教授的统计和机器学习概念来制作演示文稿和科学报告。这些项目有一个共同点:我们要选择容易获得的数据集。通常来自卡格尔。不要误会我的意思。Kaggle 是一个极好的公共数据来源,也是一个展示数据科学技能的竞赛网站。但这些数据是为您准备的,只需要最少的预处理,更多的是为了完善您的算法,以达到排行榜中的前 N 分。在数据科学/分析领域寻找工作的应届毕业生最有可能具备扎实的编程技能,也许有一些实习和多个在校项目经验。他们写了一份简短而甜蜜的简历,更新了他们的 Linkedin,可能还有他们的 Github 知识库,开始像发传单一样发出去,参加了几次面试,却收到了多次拒绝。

对于任何积极找工作的人来说,被拒绝是再正常不过的事情了。但是他们需要反思这些拒绝,并从中成长。为此,我向你们展示了邓宁-克鲁格效应。

邓宁-克鲁格效应是不言自明的,但请允许我把它放在数据科学和分析的背景下,以帮助那些在这个领域寻找工作的人比其他人更有优势。

数据收集

所有数据科学家和分析师都受雇于各自的公司,提供统计见解和商业智能。有些公司会有一大堆 excel 电子表格,里面有成千上万的观察数据,随时可以为你提供任何形式的可视化或预测性分析。有些人对他们想要的东西有明确的要求,但有些人没有。问题是:

许多学校没有训练我们制定与数据相关的业务问题,并为现有产品或服务提供解决方案。我们如何提出从头开始解决业务问题的数据收集方法?

Photo by Milan Seitler on Unsplash

想象一下,你被告知你的客户对你公司的服务感到不满意已经有一段时间了。你打算如何解决这个问题?解决你的问题需要哪些数据?你打算怎么跟你的老板说?这是应届毕业生的问题。我们太习惯于被填鸭式地提供现成的数据,以至于我们往往会忽略作为数据分析师/科学家的一个最重要的部分:能够从零开始制定多个变量,并提出收集方法来帮助您的数据后处理工作。这个例子有很多角度。从简单的以自然语言处理(NLP)的自由文本形式收集客户反馈,到多个定量变量,如评级、投诉时间、客户年龄等。

在数学专业,重点在于你对统计测试或模型拟合的理解。因此,提供被设计成具有一些高度相关的变量以便于推断的数据是有意义的。

以曾经流行的波士顿房价数据集为例。它们让您感到满意,因为您的模型具有很高的预测能力。

我的建议:开始一个自己的小型个人项目,包括为自己收集数据。也许你对通过提取多个航班的价格来预测机票价格感兴趣这里。也许您对使用 NLP 将您自己的电子邮件收件箱分成多个类别感兴趣。您可以将数据科学应用到日常生活中,这有无限的可能性。不要局限于你学校提供的材料。现实世界的问题需要现实世界的数据。最后但同样重要的是,与公众分享你的项目!你永远不知道潜在的雇主是否会挖走你的工作!(附:我正在做一个涉及数据科学的个人项目!敬请关注!)

数据预处理

假设您可以访问公司的数据集市,将数据作为数据帧导入 R 或 Python 脚本。你有 X 个变量,由你决定执行任何你想要的分析或机器学习。在学校,分析要求很可能已经为你准备好了,数据不需要任何预处理。学生们如此习惯于被提供学习资料,以至于他们可能没有意识到真实世界的数据是多么不完善。人类收集的数据可能会出现错误。某些缺失条目是不可避免的。自由文本中必然会出现拼写错误。来自不同数据源的日期可能采用不同的格式。不胜枚举!

你的数据对于分析或机器学习的价值取决于它的质量。删除那些异常值,根据您的判断删除/替换那些丢失的数据,创建您认为可能对您的项目有帮助的新变量,确保数据集在需要时是标准化的,等等。始终假设您最初看到的数据需要清理!

我的建议:【Kaggle 的某些公共数据源提供尽可能原始的数据集。以波士顿 Airbnb 数据为例。他们有一个包含 95 个变量的 csv 文件!有些缺少数据,有些变量看起来没有用,这取决于你要回答的是什么样的商业问题。因此,将该数据集作为预处理练习,同时磨练您的商业意识!

数据管道

如果您的代码以下列开头:

# For python
import pandas as pd
df = pd.read_csv(“dataset.csv”)# For R
df <- read.csv("dataset.csv")

然后——就像我一样,您从数据集市中手动提取数据,并在脚本中完成所有的数据处理/转换。这是对数据分析师的基本要求。当您需要从多个来源检索数据时,从数据集市中手动提取 CSV 文件的任务可能会令人望而生畏。

数据科学家超越了仅仅读取 CSV 文件的概念,他们不仅在脚本中花费了大部分数据预处理时间,而且还与数据工程师一起建立了一个可靠的 ETL 数据基础架构,用于从多个来源高效导入干净和标准化的数据。

Traditional ETL Process (Source: Panolpy)

一个好的 ETL 基础设施的重要性是如此重要,以至于数据库系统的知识和 SQL 数据库查询的熟练程度对数据科学家来说是如此重要,也许对他们的机器学习知识同样重要。

Deeper look in the ETL Process (Source: Panolpy)

学校通常有关于数据库系统的独立课程,这为学生提供了一个很好的机会来磨练他们的 SQL 技能,并用基本的关系数据库概念设计数据库系统。但是同样,设计数据库的场景是在任务或项目中提供的,对“客户”想要什么有明确的要求。在现实世界中,有时候提出问题比解决问题更难。您的业务或客户需求可能非常模糊,设计符合他们需求的数据库取决于您的创造力。这个表模式需要哪些变量?数据库系统需要哪些表来满足客户的需求?哪些变量需要清理和标准化?我如何将我的脚本与数据库集成,以提供移动分析和机器学习解决方案?

从您自己的数据库中检索数据可能不是您需要做的唯一导入工作。学习如何从 API 中检索数据是非常重要的,因为这是解决任何业务问题所必需的。

只是一个简短的免责声明,我不是一个有经验的数据科学家来提供关于数据管道的准确信息,所以我为这部分的任何错误信息道歉。

我的建议:即使你刚开始是一名数据分析师,也要掌握一些关系数据库和 SQL 技能,这样你就可以跳过为项目手动打开 CSV 文件的过程。我受过这方面的正规教育,但我建议任何 SQL 新手和希望掌握这一技能的人去 Coursera 或 Udemy。我目前注册了 Udemy 的 完整的 SQL 训练营 课程,只要我想为任何即将到来的项目更新我的基本 SQL 知识。最重要的是,问问自己如何将脚本与 SQL 数据库集成,以实现无缝数据导入。

沟通

不管你是数据分析师还是数据科学家。如果别人看不到你的工作的价值,你的工作就几乎毫无意义。在学校,我们被教导通过 p 值来解释假设检验的重要性。如果你在进行假设检验后的第一反应是:“由于 p 值小于 0.05,我们拒绝零假设并得出结论,那么不管你是在进行卡方检验、克鲁斯卡尔沃利斯检验、威尔科森符号秩检验还是任何其他假设检验。”,那你就有坏消息了。事实是,如果你的顶头上司没有技术倾向,他/她就不会关心 p 值或假设检验。他/她不在乎你使用什么统计测试或机器学习算法,只要你能够用正确的推理回答他们的商业问题。

Photo by You X Ventures on Unsplash

是的,他们可能会感谢你通过使用你的统计和机器学习工具箱所付出的努力,但如果他们不理解你的解释的意义或看到你的发现中的任何价值,他们可能不会充分利用你的工作来改善他们现有的产品或服务。

如果你能揭开你的工作的神秘面纱,让一个十几岁的孩子能够理解它的意义,那么很有可能你的顶头上司也会这么做。

让我们看一个简单的例子。假设您的任务是确定商场 X 中商店 A 和商店 B 之间的顾客流量,这两家商店都专营运动服装。自然,您会想要确定流量的分布并检查其正态性,然后对您的假设进行适当的统计测试。现在你要向你的顶头上司汇报你的发现。

统计学专业的应届毕业生可能会说:“我发现商店 A 和 B 的客流量呈正态分布,在进行了 5%显著性的简单 t 检验后,我得出结论,两家商店的平均客流量不同。看条形图,A 店客流量比 b 店高。”

另一方面,一位经验丰富的分析师将简化调查结果,并进一步增加陈述的价值,“从统计上来说,商店 A 在大多数时间比商店 B 有更高的流量。但是,我们需要理解为什么 A 店比 b 店吸引更多的顾客,是鞋子的设计吗?是店铺的室内设计还是提供比 B 店更有吸引力的促销优惠?我们和市场部讨论一下这件事,收集一下他们的想法。或许他们能给我们一些启示,告诉我们如何将 A 店的某些成功之处融入到我们的产品中。”

看出区别了吗?一个有经验的分析师知道如何根据产品经理想要听到的来说话,而不是用技术术语来迷惑他们。许多产品经理希望对你的发现有简短但有价值的见解。如果需要,只解释你的工作流程。

我的建议是:尽可能在工作之外以课程的形式学习沟通方面的软技能。如果你还是大学生,找些销售工作或者教书的工作。这些工作需要你把信息咀嚼成小块,这样你的客户/学生才能理解你的解释。

结论

邓宁·克鲁格效应是一个真实的现象,不管他们学的是什么专业,在应届毕业生中普遍存在。你的学校为你进入职场提供了充足的资源。然而,你的学习并没有在你大学生活的最后几天停止。参加外部会议,参加在线课程,与志同道合的人交流。你会惊讶自己有多不知道!

这可能是为什么大多数数据科学家的职位要求至少有硕士学位和至少 5 年的工作经验。

保持对知识的渴望!

从潜在数据战略家身上学到的 4 条经验

原文:https://towardsdatascience.com/4-lessons-learned-from-a-prospective-data-strategist-166c2e522596?source=collection_archive---------20-----------------------

数据科学的革命总是基于数据作为战略决策者的力量。有趣的是,无论我盯着我的 SQL 表看多长时间,它都听不到它告诉我该做什么。这打破了一个基本的误解,即数据本身是某种能够告诉我们需要做什么和如何做的先知。

对于任何普通的数据科学家、统计学家或工程师来说,这似乎很直观。尽管如此,许多期待消费基于数据的信息的人对其价值做出了许多错误的假设。虽然这些假设通常是无害的,但当数据本身被视为权威来源时,它们会产生焦虑。这种考虑忽略了一个事实,即数据的解释者和传播者与数据本身同样相关,如果不是更相关的话,并产生了一种错误的精神气质,认为结果是“数据驱动的”,而不是由那些使用数据的人驱动的。

事实是,数据本身就是信息。数据是“背景现实”的表示,它解释了在观察环境的背景中的环境的某些因素。数据之所以有价值,是因为它帮助我们做出更明智的决策,因为我们对决定“好决策”的因素有了更好的理解。

最终,不是数据告诉我们该做什么,而是那些解释和交流数据以及从中得出的见解的人。换句话说,数据具有潜力,最终必须由数据战略家来发掘。分析背后人的因素的重要性吸引我开始了数据分析师和数据战略家的职业生涯。在这个过程中,我有机会成为公司战略、咨询和投资管理方面的分析师。

随着我探索从大学水平的实习和合作到数据分析职业的跳跃,我试图更好地理解什么是完整和有效的数据战略家。以下是我发现对数据战略家来说很有价值的技能和特质:

1。理解你的分析中的数学可以大大提高它。

数学在加强特定分析方面有着巨大的效用。从简单地应用膨胀和缩放数据到理解两个变量之间的理论关系,理论数学在揭示关系方面提供了背景和效用,否则很难发现和找到更有见地的方法来呈现数据。能够理解与您正在执行的特定分析相关的数学有双重好处:提高分析的质量,并显示对行业特定因素的深入了解。例如,理解资产价格的一阶和二阶衍生追踪工具的效用可以帮助开发领先指标,并在向经理演示时,从财务和行为角度展示对购买/出售压力和资产价值之间关系的深刻理解。此外,深入理解分析中潜在的数学知识有助于你以一种没有数学专业知识的人也能理解和欣赏其用途的方式来解释它。

2。考虑你的研究的战略意义,使它独立存在。

每个潜在的数据战略家在开始一个项目时都相信知道结果最终会带来战略利益。困难的部分是在整个项目中保持对潜在利益的清晰认识。在任何具有战略效用的项目中,观察结果可以用于行动和后续步骤,无论是直接行动还是收集更多信息。能够预见这些行动和你的发现的潜力,让你有动力超越数据和分析,想象更大的图景。在你的工作潜力中找到令人兴奋的地方可以激发你想得更大,这通常会让你产生更有影响力和相关性的工作。毕竟,如果你不相信自己工作的重要性,你怎么能指望你的经理相信呢?然而,另一方面是知道什么时候你的结果不再导致不能转化为行动的观察。很难不过度依赖,但能够认识到效用是生产与瘫痪的区别。有什么比展示一个项目,而你的唯一反应是“那又怎样?”?

3。提供基于上下文的解释为那些消费你的分析的人产生更多的价值。

当我第一次开始为雇主做严肃的数据分析项目时,我尽最大努力保持我看待数据的客观性。我努力尝试把数据点当作数据点,忽略我的变量运行的环境。在这样做的时候,我认为我可以以某种方式分离出这些变量之间真实的、量化的关系,而不是追逐预期的关系。我很快发现,描述真空中的变量的抽象术语对于那些打算将结果转化为对变量代表什么的全面理解的人来说毫无用处(这些方面正是我努力忽略的)。我认识到,最终,相关性和趋势之类的东西只对那些观看我的作品的人重要,因为我的作品为他们提供了更多关于他们所处理的因素的知识。我面对的现实是,数据分析的能力取决于它所提供的背景知识,反过来,我变得更善于迫使自己将自己的工作与某人的观点联系起来,这些人将我的结果视为有关财务和企业战略的信息来源,而不是有关抽象描述的数据点的信息。

4。在交流结果和建议时掌握热门话题可以提高你的可信度。

在大多数分析项目的结尾,是时候展示结果和建议了。我已经提到了提供背景、解释战略观点以及解释分析中使用的数学和分析概念的重要性。但是,我学到的东西(我没有提到)是我对我正在分析的主题的了解,无论是债券、公司、公司战略、投资等等。,决定我的分析在我要介绍的人眼中的合法性。简单来说,如果我不能展示出对听众话题的把握,听众会怀疑我对分析的把握。虽然不幸,但这是有道理的。听众的目的是评估你作为演讲者的可信度,对他们来说,最简单的方法就是评估你对他们专业领域的理解。这巩固了第 2 课和第 3 课的重要性,因为研究和学习意味着上下文和战略理解,呈现出专业知识的光环。

虽然我对数据分析和策略职业的尝试才刚刚开始,但我发现这些课程对我作为分析型思考者的成长和发展是最重要的。我当然希望继续学习,并不断完善我未来从事的每个项目的方法。

感谢阅读!

4 从向领导层展示指标中吸取的经验教训

原文:https://towardsdatascience.com/4-lessons-learned-from-presenting-metrics-to-leadership-5d2d060a090a?source=collection_archive---------26-----------------------

促使领导层采取行动

风险投资公司红杉资本(Sequoia Capital)在他们在媒体上的数据科学出版物中,将数据科学定义为“一门使用数据提取知识和见解的科学和求真学科。没有定义和跟踪好的度量标准,很难获得有意义的见解。然而,“s 意味着只有统一的标准是不够的。如何使用它也同样重要。它必须由高层领导部署,以确定并告知哪些目标和指标是重要的。换句话说,指标需要是可操作的。

但是我不想写另一篇关于创建可操作的度量而不是虚荣度量的文章。相反,我打算分享我个人在展示指标方面的进步,让领导层相信数据,并对他们做出基于数据的决策感到放心(甚至自信)。

Photo by You X Ventures on Unsplash

为什么要做出基于数据的决策?我们都有自己的偏见,而偏见让我们的直觉不那么值得信任。你的直觉很容易出错,在很多情况下,它并不比随机选择好多少。如果没有能力做出基于数据的决策,我们通常会选择最响亮的(或最具表现力的,或最资深的,或最有经验的,或最顽固的,等等)意见。)房间里的人,这相当于从一顶装满所有潜在决策的帽子里随机抽出一个决策。

以下是我学到的四条重要经验,可以让领导得出有意义的见解,做出基于数据的决策。

TL;博士

  1. 数字很难;许多数字令人震惊
  2. 指标是时间序列数据
  3. 没有目标,度量就没有洞察力
  4. 没有细节的见解是不可行的

第一课——数字很难;很多数字让人应接不暇

A snapshot of my initial list of metrics. So many numbers…

我从每个企业客户的结果列表(当时只有 60 个)这一理论出发,开始了我的度量工作,这是一个很好的起点,可以精确定位有流失风险的客户。当我向产品、客户成功和领导部门的代表展示结果电子表格时,我认为每个人都会快速地对电子表格进行排序和过滤,以评估哪些客户做得“很差”。然而,现实情况是,从来没有人打开过这个电子表格。

我个人认为度量是迷人的,并喜欢思考它们如何代表业务或产品性能。事实证明,大多数人并不认同我的观点。我的同事想听一个容易理解的故事,并指出任何已经发现的缺陷,而一个充满数字的电子表格不能提供这一点。

因此,在我下一次演讲之前,我做了一些调整:

  1. 我从电子表格转换到数据可视化来交流结果。
  2. 我将尽可能多的指标转换成百分比,使数字更直观。

第 2 课-指标是时间序列数据

This metric is 80%. Cool story bro. 🤷

在我的第二个演示中,我升级到了一个在臭名昭著的环形图中显示为整体的一部分的指标。您可以看到上面的指标产生了 80%的值,但是该指标中包含了哪些数据呢?这是否代表了过去的一周、一个月或一年?例如,即使你知道数据覆盖了过去一个月,如果不与其他结果进行比较,一个结果本质上是没有意义的。领导层需要了解指标是如何随着时间的推移而变化的。该指标应随时间绘制,以便了解每日、每周、每月、每季度或每年的变化。

此外,应该尽可能接近实时地呈现数据。如果你计算这些数字,然后在两周后提交给领导层,你的见解很可能已经过时且不相关。自动化数据流和实时仪表板的开发解决了这个问题,但请记住,仪表板的创建非常耗时,并且需要维护以确保数据管道不会中断。

第三课——没有目标的衡量标准是没有洞察力的

My data visualization displaying the metric’s quarterly change. But no goal…

现在,我有了一个图表,显示了过去一年各季度指标的变化情况。太好了!但是这些结果是好是坏呢?随着时间的推移,这一比例似乎在下降——我们应该恐慌还是庆祝?

为了从这些结果中获得洞察力,利益相关者需要就该指标的目标达成一致。对于这一指标,我们一致认为目标应该是超过 60%。这意味着我们去年在 Q1、Q2 和第三季度成功实现了目标,但最近几个季度(第四季度和 Q1)的表现远低于我们的目标,需要采取行动。这是一个很好的见解!

第四课——没有细节,洞察力是不可行的

This chart demonstrates that Type 2 and Type 3 are specifically not meeting the goal to exceed 60%.

我们现在了解了最近几个季度的指标绩效没有达到目标的事实,但是我们如何知道要采取什么措施来提高整体指标呢?将指标数据分解成类别、存储桶或组有助于确定需要重点改进的特定领域。上面的可视化演示表明,将指标分解为子类型(类型 1、类型 2 和类型 3)揭示了类型 1 每个季度都达到了目标,类型 2 没有达到目标,而类型 3 远低于目标。有了这些额外的细节,领导层就可以将精力集中在某个特定的小组上,以提高整体的指标绩效。

请注意,我还在图例中包含了样本大小,以了解每种类型在总体指标中的权重。

结论

总之,度量是没有用的,除非它们向领导层揭示了当前的不足。为了揭示缺陷,度量标准应该以简单的数据可视化形式显示,显示随时间的变化以及目标是否达到。度量标准应该分成小组,以确定需要改进的具体领域。

使用 Python 的 4 种机器学习技术

原文:https://towardsdatascience.com/4-machine-learning-techniques-with-python-ceee451b0085?source=collection_archive---------4-----------------------

4 使用 Python 的机器学习技术

机器学习技术与算法

虽然本教程致力于使用 Python 的机器学习技术,但我们很快就会转向算法。但是在我们开始关注技术和算法之前,让我们看看它们是不是一回事。

T2 技术是解决问题的一种方式。这是一个非常通用的术语。但是当我们说我们有一个算法时,我们的意思是我们有一个输入,我们希望从它那里得到一定的输出。我们已经清楚地定义了实现这一目标的步骤。我们会不厌其烦地说,一个算法可以利用多种技术来获得输出。

既然我们已经区分了这两者,那就让我们来了解更多关于机器学习的技术。

使用 Python 的机器学习技术

Python 机器学习技术有 4 种类型,我们来讨论一下:

a.机器学习回归

字典会告诉你,倒退就是回到以前的状态——一个通常不太发达的状态。在统计学书籍中,你会发现回归是一个变量的平均值和其他值的对应值如何相互关联的度量。但是让我们谈谈你将如何看待它。

Python 机器学习技术—机器学习回归

一.回归均值

查尔斯·达尔文的同父异母的表兄弗朗西斯·高尔顿观察了几代人的香豌豆大小。他的结论是,顺其自然会产生一系列的尺寸。但是如果我们有选择地培育大小合适的香豌豆,它会变得更大。随着时间的推移,大自然掌握着方向盘,甚至更大的豌豆也开始产生更小的后代。我们有不同的豌豆大小,但我们可以将这些值映射到特定的直线或曲线。

二。另一个例子——猴子和股票

1973 年,普林斯顿大学教授伯顿·马尔基尔在他的书中提出了一个主张。畅销书《漫步华尔街》坚持认为,一只被蒙住眼睛的猴子在选择投资组合时,可以像专家一样出色,向报纸的金融版面投掷飞镖。在这样的选股比赛中,猴子打败了专业人士。但这只是一两次。事件足够多,猴子的表现就会下降;它回归到平均值。

Python 机器学习技术——猴子和股票

三。什么是机器学习回归?

在该图中,直线最符合由点标记的所有数据。使用这条线,我们可以预测 x=70 的值(有一定程度的不确定性)。

使用 Python 的机器学习技术——什么是机器学习回归

作为一种机器学习技术,回归在监督学习中找到了基础。我们用它来预测一个连续的数字目标,并从我们已经知道的数据集值开始工作。它比较已知值和预测值,并将预期值和预测值之间的差异标记为误差/残差。

四。机器学习中的回归类型

我们通常观察到两种回归-

  • 线性回归-当我们可以用直线表示目标和预测值之间的关系时,我们使用线性回归-

y=P1x+P2+e

  • 非线性回归——当我们观察到目标和预测值之间的非线性关系时,我们不能将其表示为直线。

b.机器学习分类

一、什么是机器学习分类?

分类是一种数据挖掘技术,让我们预测数据实例的组成员。这使用预先标记的数据,属于监督学习。这意味着我们训练数据,并期望预测它的未来。“预测”是指我们将数据分类到它们所属的类别中。我们有两种属性-

  • 输出属性-又名依赖属性。
  • 输入属性-又名独立属性。

二。分类方法

  • 决策树归纳——我们从标记为元组的类中构建一棵决策树。它有内部节点、分支和叶节点。内部节点表示对属性的测试,分支表示测试结果,叶节点表示类标签。涉及到的两个步骤是学习和测试,这些都很快。
  • 基于规则的分类——这种分类基于一组 IF-THEN 规则。规则表示为-

如果条件,则结论

  • 通过反向传播进行分类-神经网络学习,通常称为连接主义学习,建立连接。反向传播是一种神经网络学习算法,是最流行的算法之一。它反复处理数据,并将目标值与要学习的结果进行比较。
  • 懒惰学习者-在懒惰学习者方法中,机器存储训练元组并等待测试元组。这支持增量学习。这与早期学习者的方法形成对比。

三。ML 分类示例

我们举个例子。想想我们在这里教你不同种类的代码。我们向您展示 ITF 条形码、Code 93 条形码、QR 码、Aztecs 和数据矩阵等。一旦完成了大部分的例子,现在轮到你来识别我们展示给你的代码的种类了。这是监督学习,我们使用两者的部分例子——训练和测试。注意每种类型的一些恒星是如何在曲线的另一边结束的。

使用 Python 的机器学习技术— ML 分类示例

c.使聚集

聚类是一种无监督的分类。这是一个探索性的数据分析,没有可用的标记数据。通过聚类,我们将未标记的数据分成有限且离散的数据结构集,这些数据结构集是自然且隐藏的。我们观察到两种聚集现象

  • 硬集群——一个对象属于一个集群。
  • 软聚类——一个对象可能属于多个聚类。

在聚类中,我们首先选择特征,然后设计聚类算法,然后验证聚类。最后,我们解释了结果。
a .示例
回想一下 b.iii 节中的示例。您可以将这些代码组合在一起。二维码,阿兹特克,和数据矩阵将在一组,我们可以称之为 2D 代码。ITF 条形码和 Code 39 条形码将归入“1D 代码”类别。这是星团的样子-

使用 Python 的机器学习技术——聚类

d.异常检测

异常是偏离其预期路线的东西。有了机器学习,有时,我们可能想要找出一个离群值。一个这样的例子是检测牙医每小时 85 次补牙的账单。这相当于每个病人 42 秒。另一种方法是只在周四找到特定的牙医账单。这种情况会引起怀疑,异常检测是突出这些异常的好方法,因为这不是我们要特别寻找的东西。

所以,这都是关于 Python 的机器学习技术。希望你喜欢我们的解释。

结论

因此,在本教程中,我们学习了 Python 的四种机器学习技术——回归、分类、聚类和异常检测。此外,如果您有任何疑问,请随时在评论框中提问。

你也可以参考-

  • Python ML —应用
  • Python ML —算法

我在用 Firebase 远程配置运行 A/B 测试时犯的 4 个错误

原文:https://towardsdatascience.com/4-mistakes-that-i-made-while-running-a-b-tests-with-firebase-remote-config-f7b17f18b34a?source=collection_archive---------6-----------------------

大约一年半以前,我学习了 Firebase 远程配置和实验,并开始在我当前的产品 CricPlay 中使用它,一旦我们达到了有意义的 A/B 测试的适当规模。Firebase 提供了一个健壮的低成本(免费使用,但开发人员需要花费一些时间来设计远程配置的应用程序)框架,以在实际用户的生产应用程序中测试您的假设。根据代码定制的级别,它可以处理相当简单(CTA 颜色、复制)到复杂(备选业务逻辑)的用例。

十几次实验之后,我列出了我的一些错误(这样你就不会犯这些错误了)。

这篇文章假设一个初学者到中级平台的理解。如果你刚刚开始使用 Firebase 进行 A/B 测试,你应该浏览这个视频系列来开始:https://www.youtube.com/playlist?list = PLl-k 7 zzesylnt 1-3 lfiy 89 ytafqzlzo-O

1.目标不正确

Firebase 是一个移动应用套件。处理新的配置值需要对应用程序进行更改。如果您重新设计了应用程序商店屏幕,以便从远程配置中读取购买按钮的颜色,则需要更新应用程序。当运行一个实验时,重要的是只针对那些实际处理被测试的配置值的应用程序版本。这很重要,因为在总共 100 个用户中,可能只有 20 个更新到了最新版本。

在 20 个用户的基础上可能具有统计显著性的%改善(或恶化)对于更大的基础可能显得无关紧要。

统计显著性表示 2 个变异体(或更多)的转化率之间的差异不是由于随机机会而出现的可能性。在 A/B 测试中,我们执行的是零假设测试。零假设表明变化对转化率没有影响。除非有证据表明事实并非如此,否则它被认为是真实的。如果一个结果不能用零假设来解释,并且需要另一个假设,那么这个结果就具有统计学意义。

在上面的例子中,替代假设适用于 20 个用户,但是零假设适用于其他 80 个用户——配置值的变化对以前的版本没有影响。

此外,如果新更新的采用速度较慢,则实验需要运行更长时间,以便获得足够大的样本来代表总体基础。更重要的是,快速更新到最新版本的现有用户可能会表现出与一两周后更新的用户略有不同的行为。

除了应用程序版本,Firebase 还支持其他几个目标标准。用户可以通过受众细分、属性、地理和语言来定位。如果设计了一个实验来优化多语言应用程序的英文行动号召,它必须针对设备语言设置为英语的用户。

要了解所有可用的瞄准功能,请参考文档。

2.不使用激活事件

激活事件是针对实验的正确部分的扩展。考虑一个旨在优化游戏入门体验的实验,以便让更多用户参与游戏(通过事件“游戏性”捕获)。为了获得有意义的见解,实验应该仅限于新用户。设置激活事件有助于这一点。

与目标定位不同,它不会在采样时过滤用户。在测试样本中,测试变量既提供给新用户,也提供给现有用户。然而,将“注册”设置为激活事件确保了只有新用户(执行“注册”事件的用户)被分析用于实验。
不设置激活事件会稀释结果,因为现有用户也会触发“游戏性”事件。

3.仅依靠 Firebase Analytics 来分析结果

Firebase 控制台提供了许多关于正在运行的实验的见解:关于实验状态的摘要,对主要目标事件以及其他实验目标的影响的概述,以及对每个变体相对于任何目标的性能的详细理解。

对于大多数简单的实验(UI 更改,添加新功能),仅控制台结果就足以验证假设并推出最佳变体。但是,复杂的问题可能需要额外的分析,而 Firebase 控制台可能无法做到这一点。

其中一个实验是为了了解“欢迎奖金”对游戏经济的影响。欢迎奖金使用户能够在注册时获得一些虚拟货币,以体验“高级”功能。对虚拟货币的高需求通过 IAP 和奖励广告推动了货币化。因此,受欢迎的奖金应该会在短期内减少新用户的收入,目的是让更多的用户迷上优质功能,以促进长期的货币化。

在 Firebase 控制台中,很难分析一个在游戏中到处都是水龙头和水槽的经济体,尤其是在事件模式设计得不太好的情况下。

这个问题有两个解决方案:

使用 BigQuery 进行分析

通过将 BigQuery 链接到 Firebase,可以访问所有与 A/B 测试相关的分析数据。对于每个变体,Firebase 都添加了一个用户属性 firebase_exp_ <实验号> ,值为 <变体索引> ,可以用来跟踪在 BigQuery 中暴露给每个变体的用户。

将实验数据传递到其他分析平台/您的数据库

这可以通过创建一个虚拟配置值来实现(比如说 firebaseExperimentId )。默认值是一个空字符串。应用程序被配置为如果为空则忽略该值,并在用户配置文件更新时传递非空值。在配置实验变量时,这个虚拟值用于将变量信息传递给应用程序。

这个用户配置文件值可用于创建漏斗、分析屏幕流以及在分析工具(在我的例子中是 CleverTap)中为变量执行高级分段。它有助于利用您的高级分析工具的功能(相对于免费的 Firebase analytics)。

作为扩展,这个虚拟值也可以用于实现服务器端实验。应用程序将该值作为 API 头传递。API 可以根据远程配置值提供备选业务逻辑。

4.管理重新安装和多个设备

这也是 Firebase 实验的局限性之一。如果您的应用程序有很多重新安装和/或用户从多个设备访问同一个帐户,那么同一个用户可能会接触到一个实验的两个测试变量。A/B 测试使用 Firebase SDK 生成的实例 ID 来识别唯一的设备/用户。如果用户卸载应用程序并再次安装,SDK 将生成一个新的实例 ID,因此将该用户视为新用户。如果同一用户在不同的设备上登录应用程序,也是如此。

同样,对于大多数简单的实验,如 UI 优化或测试新功能,这并不重要。然而,对于复杂的任务,比如测试可选的业务逻辑,它可能会影响结果,或者更糟的是会让一些用户感到困惑。特别是在像印度这样的市场,很高的重新安装率是很常见的。

解决方案是要么切换到另一个 A/B 测试解决方案,要么构建一个相同的定制实现。两者都有其局限性——添加另一个工具并传递所有事件以执行有意义的分析的成本,与开发统计模型以对用户进行采样并分析实验结果的成本。

也可以有一条中间道路(我选择了这条道路)。它需要在应用程序的后端创建远程配置值和实验的副本,并通过 API 公开它们。这可以用来针对登录用户“锁定”远程配置值,即使 Firebase 在稍后阶段(重新安装后或从另一个设备访问)为同一用户提供了不同的值。当实验结束,获胜者被推出时,建立一个解锁机制是很重要的。

重要的是要注意,根据重新安装或多个设备的百分比,这可能会导致 Firebase 控制台上的实验结果出现显著差异。Firebase 不知道应用程序正在覆盖这些用户的远程配置值。因此,需要在 BigQuery 或其他分析工具中通过传递被覆盖的配置值来分析结果。

不是最佳的解决方案,但是有效!如果您正在管理一个分析平台,请将此视为一个功能请求。

你从 Firebase 实验或 A/B 测试中学到了什么?请在评论中告诉我。

2020 年作为首席信息官要避免的 4 个错误

原文:https://towardsdatascience.com/4-mistakes-to-avoid-as-a-cio-in-2020-c804190eddfc?source=collection_archive---------45-----------------------

您是否在考虑迁移到云、实现定制应用的现代化以及投资数据科学计划?

作者:蒙特·兹韦本,赛义德·马哈茂德

首席信息官们正在最终确定他们 2020 年的战略计划,这些计划不可避免地涉及到向云迁移、定制应用的现代化以及对数据科学计划的投资,这里列出了在这一过程中需要避免的失误。

  1. 没有明确的计划,不要迁移到云。

Cloud migrations can be disappointing

作为一名首席信息官,如果您没有迁移到云的计划,您可能会感到错失良机。毕竟,云是未来的潮流,它承诺企业可以更快地将其应用程序上线,而不必担心建设数据中心的资本支出。通过迁移到云,您的组织还将能够灵活地调整他们消耗的计算资源,包括按需和独立调整,因为云架构允许存储和计算分离。这是双赢,对吗?。不完全是这样,这取决于您通过将基础架构迁移到云来实现的目标。

首先,要意识到一旦你迁移到了云端,计价器就会一直运转。冲向云的公司完成了项目的第一阶段,并意识到他们的运营费用增加了,因为人工操作员的节省被通常在线的应用程序的云计算资源的成本超过了。过去在内部部署时会被资本化的资源现在会进入云中的 P&L。通常这个数字要高得多。

这让我们想到了您的组织试图通过迁移到云来实现的目标。如果您的目标是通过整合新的数据源(如传感器、物联网设备和社交媒体)或向其中注入人工智能和机器学习来丰富您的任务关键型应用程序,那么仅仅迁移到云是不够的。这是因为集成各种技术以构建统一平台的重担仍然落在 IT 部门的肩上。在这种情况下,构建一个集成的横向扩展基础架构(可以利用不同的数据源并在云中使用机器学习(ML)做出智能决策)所需的工作与在内部构建基础架构没有明显的不同。换句话说,简单地将您的基础设施迁移到云中不会使您的遗留应用程序变得敏捷、可伸缩和智能。云是获得敏捷性的一个很好的举措——但还不足以获得一个更好的可以利用数据和使用 ML 的应用程序。

2。不要从头开始重写您的遗留应用程序。

Rewriting applications is unnecessarily destructive

您面临着来自企业的压力,要求您对一些任务关键型应用程序进行现代化。根据您所在的行业,这些应用可能是核保或欺诈检测、需求规划或预防性维护。这些曾经是公司皇冠上的宝石的应用程序现在已经成为“遗产”它们变得缓慢是因为需要处理的数据量急剧增加。此外,它们从未被设计为对正在成为规范的多样化和非结构化数据进行操作,包括从传感器、物联网设备和社交媒体生成的数据。最重要的是,在线交易的数量和速度要求这些应用程序是智能的,并在没有人工干预的情况下实时采取智能行动。

毫无疑问,考虑到业务对敏捷性、可伸缩性和智能性的要求,您认为除了在现代平台上完全重写这些应用程序之外别无选择。如果你采取这种行动,你就部分正确了。是的,您确实需要在一个平台上重新构建这些应用程序,该平台可以随着数据量的增长而横向扩展,能够存储和分析各种数据,并可以将人工智能注入到应用程序中,但您不必重写应用程序本身。在这种情况下,一个恰当的类比是旧金山的维多利亚时代的老房子,它们对所有者的价值与遗留应用程序对企业的价值相同。为了保护这些房屋免受地震,他们必须根据最新的建筑技术进行改造,包括提升房屋并用螺栓将其固定在地基上。通过这样做,土木工程和建筑公司保存了房屋的建筑外观和历史,同时保护它免受地震破坏。

A database migration can be as effective as an earthquake retrofit

同样,通过保持应用程序完好无损并将其置于现代基础之上,您将保留熟悉的界面和业务逻辑,这是您公司的秘密武器,同时适应大数据的数量和多样性,并通过人工智能和机器学习使应用程序变得智能。通过采用这种方法,您还可以使您的组织免于着手一个昂贵、冗长且有风险的项目。

3。不要为了 NoSQL 数据库而放弃 SQL 应用程序。

The power of SQL is clear as NoSQL systems rush to put in SQL layers

许多首席信息官已经考虑使用 HBase、Cassandra、Dynamo 和 MongoDB 等 NoSQL 数据库构建他们的下一代运营应用程序。这种方法的主要理由是现代应用程序必须管理的数据的数量、多样性和速度。DB2、Oracle、SQL Server、Postgres、MySQL 等传统 SQL 数据库在 web 应用程序、物联网设备和传感器生成数据的环境中苦苦挣扎。这些数据库没有提供扩展或存储半结构化或非结构化数据的实用方法。

但是,您应该认识到,当用 NoSQL 数据库替换后端 SQL 数据库来更新应用程序时,您可能会招致巨大的风险和项目范围的扩大。NoSQL 数据库缺乏完整的 SQL 支持,这使得大量的应用程序代码需要重写。此外,找到具备所需 NoSQL 专业知识的开发人员比大量已经精通 SQL 的开发人员要难得多。另一个增加 NoSQL 数据库平台迁移风险的因素是数据模型经常需要完全重新设计。修改后的数据模型会导致显著的数据反规范化和重复,这需要公司编写大量的新代码来确保重复的数据在其所有定义中保持一致。最后,NoSQL 数据库的性能可能无法与传统数据库相媲美。NoSQL 系统通常擅长短期运行的操作查询,但是它们在分析查询上的性能通常很差,不能满足应用程序的需求。

出于上述考虑,如果您正在考虑在 NoSQL 数据库上移植一个遗留应用程序,请考虑市场上现有的一些横向扩展的分布式 SQL 平台。这些平台提供了 NoSQL 数据库的好处,但不存在上面讨论的问题。

4。不要将数据科学归为幕后活动。

Break the silos on projects and include the business

数据科学是数学家和统计学家的领域,他们构建了凡人难以理解的复杂算法。数据科学家目前花费大量时间等待数据工程师从大量内部和外部数据源获取数据。然后,数据科学团队会经历一个严格的实验阶段,创建可能包含预测信号的功能集,并对这些功能进行分析。这种培训和测试工作流程冗长而复杂,需要跟踪应用程序来帮助数据科学家组织和审核他们的实验。一旦模型被构建和训练,它就被移交给一个应用程序开发团队,以注入到一个应用程序中,并将其投入生产。这就是问题所在,组织目前有一个“数据科学团队”、“数据工程团队”和“应用程序开发团队”,但每个团队本身都没有准备好完成从定义业务需求到将应用程序部署到生产中的工作。数据科学、数据工程和应用程序开发团队根本没有足够深入的业务知识。数据科学是一项团队运动,需要来自数据科学家、数据工程师和应用程序开发人员的代表,与了解业务流程的人员并肩工作,构建能够交付切实业务成果的智能应用程序。

如果将人工智能和机器学习作为任务关键型应用程序的一部分进行操作是您的首要任务,那么您必须打破组织孤岛,建立由数据工程师、应用程序开发人员、数据科学家和主题专家组成的多学科团队,以构建能够推动业务发展的应用程序。

要了解有关如何在 2020 年实现业务转型的更多信息,请下载我们关于应用现代化的白皮书以及 it 在数字化转型中的重要作用。

每个 Python 初学者都应该学习的 4 个 NumPy 技巧

原文:https://towardsdatascience.com/4-numpy-tricks-every-python-beginner-should-learn-bdb41febc2f2?source=collection_archive---------4-----------------------

Python 初学者

编写可读代码的技巧

Photo by Pierre Bamin on Unsplash

NumPyPython 中最流行的库之一,鉴于它的优点,几乎每个 Python 程序员都用它来进行算术计算。Numpy 数组比 Python 列表更紧凑。这个库也非常方便,许多常见的矩阵运算以非常高效的计算方式实现。

在帮助同事和朋友解决数字问题后,我总结了 4 个数字技巧,Python 初学者应该学习。这些技巧会帮助你写出更加整洁和可读的代码。

在学习 numpy 技巧之前,请确保您熟悉以下文章中的一些 Python 内置特性。

[## 我希望我能早点知道的 5 个 Python 特性

超越 lambda、map 和 filter 的 Python 技巧

towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4)

1.参数函数—位置

对于数组arrnp.argmax(arr)np.argmin(arr)np.argwhere(condition(arr)),分别返回最大值、最小值和满足用户定义条件的值的索引。虽然这些 arg 函数被广泛使用,但我们经常忽略函数np.argsort(),它返回对数组排序的索引。

我们可以使用np.argsort根据另一个数组对数组的值进行排序。下面是一个使用考试成绩对学生姓名进行排序的示例。排序后的名称数组也可以使用np.argsort(np.argsort(score))转换回原来的顺序。

它的性能比使用内置 Python 函数sorted(zip())更快,并且更具可读性。

Photo by Kamen Atanassov on Unsplash

2.广播-形状

广播是一个初学者可能无意中尝试过的事情。许多 numpy 算术运算在逐个元素的基础上应用于具有相同形状的数组对。广播对数组操作进行矢量化,而不会产生不必要的数据副本。这导致了高效的算法实现和更高的代码可读性。

例如,您可以使用arr + 1将数组中的所有值递增 1,而不考虑arr的维度。还可以通过arr > 2检查数组中的所有值是否都大于 2。

但是我们怎么知道两个数组是否兼容广播呢?

Argument 1  (4D array): 7 × 5 × 3 × 1
Argument 2  (3D array):     1 × 3 × 9
Output      (4D array): 7 × 5 × 3 × 9

两个数组的每个维度必须是等于,或者其中一个是 1 。它们不需要有相同的维数。上面的例子说明了这些规则。

3.省略和新轴——维度

分割 numpy 数组的语法是i:j,其中 i,j 分别是起始索引和停止索引。比如上一篇文章中提到的——5 个我希望早点知道的 Python 特性,对于一个 numpy 数组arr = np.array(range(10)),调用arr[:3]给出[0, 1, 2]

Photo by Daryan Shamkhali on Unsplash

当处理高维数组时,我们使用:来选择每个轴上的所有索引。我们也可以使用选择多个轴上的所有指标。展开的轴的确切数量是从推断出来的

另一方面,如上图所示使用np.newaxis在用户定义的轴位置插入一个新轴。此操作将数组的形状扩展一个单位的维度。虽然这也可以通过np.expand_dims()来完成,但是使用np.newaxis可读性更好,也更优雅。

4.屏蔽阵列—选择

数据集是不完美的。它们总是包含缺少或无效条目的数组,我们经常想忽略那些条目。例如,由于传感器故障,气象站的测量值可能包含缺失值。

Numpy 有一个子模块numpy.ma,支持带有掩码的数据数组。被屏蔽的数组包含一个普通的 numpy 数组和一个掩码指示无效条目的位置

np.ma.MaskedArray(data=arr, mask=invalid_mask)

Photo by Nacho Bilbao on Unsplash

数组中的无效条目有时用负值或字符串标记。如果我们知道屏蔽值,比如说-999,我们也可以使用np.ma.masked_values(arr, value=-999)创建一个屏蔽数组。任何以掩码数组作为参数的 numpy 操作都会自动忽略那些无效的条目,如下所示。

相关文章

感谢您的阅读。你可以注册我的时事通讯来接收我的新文章的更新。如果您对 Python 感兴趣,以下文章可能会有用:

[## 我希望我能早点知道的 5 个 Python 特性

超越 lambda、map 和 filter 的 Python 技巧

towardsdatascience.com](/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4) [## Python 3.8 中针对 Python 新手的 6 项新特性

请做好准备,因为 Python 2 不再受支持

towardsdatascience.com](/6-new-features-in-python-3-8-for-python-newbies-dc2e7b804acc)

最初发表于edenau . github . io

4 个参数查询功能,使您的数据可视化互动

原文:https://towardsdatascience.com/4-parameter-query-functions-to-make-your-data-visualization-interactive-bbd84dd6bafb?source=collection_archive---------16-----------------------

在数据可视化中,除了可视化的呈现,还有一个核心要素就是人机交互。

对于高维多元数据可视化系统,交互是必不可少的元素之一。这体现在两个方面。一是高维多元数据导致的数据过载,使得有限的可视化空间无法呈现所有数据,也难以表达高维复杂结构。所以需要交互技术来弥补。第二,交互是操作者与操作界面之间的交流,用户可以有选择地获取自己想要的信息。对用户理解数据,发现模式很有帮助。

比如想查看每个月的销售额,一般的方法是每个月做一个报表,然后放在一起对比。但是查找和对比数据很麻烦,很容易出错。如果使用交互式可视化,可以使用过滤功能随意查询数据,非常方便。

但是我们如何在图表或仪表板中实现可视化交互呢?这时,我们需要使用参数查询。接下来我给大家介绍四个基本的参数查询功能以及它们可以适用的交互场景。

(注:本文所有图表均采用 FineReport 制作,个人下载完全免费。这个可视化工具本身就有很多参数查询功能,不需要写代码。所以我用 FineReport 创建了一些图表,向大家展示如何用参数查询实现交互可视化。)

1。参数过滤

它是交互式可视化的基本功能,即可以根据不同的条件过滤不同的数据。

例如,在下面的存货核算表中,在点击该报表中的“查询”按钮之前,系统会根据参数的默认值检查并显示数据。在此报告中,仓库复选框的默认选择是仓库 1 和仓库 3。我们可以自由选择时间段和仓库来查询我们想要的数据,也就是多值查询。

当然,在使用参数过滤时,也可以将表格改为图表。

在下面的图表中,您可以很容易地查询任何月份和年份的每个客户的销售额、每个雇员的销售额或每个销售人员的销售额。

又如,通过下图所示的交互式图表设计,管理人员可以及时了解每个分公司每月的人员变动情况。可见参数过滤在交互式可视化中的应用非常广泛。

2。参数联动

链接两个或多个组件,实现数据之间的自动关联,即关联图表。

如下图,左上角的图表显示了不同销售区域的分店数量和利润贡献率。使用图表链接功能,当您单击第一个柱形图中的一个区域时,接下来的三个图表将显示所选区域的客户订单帐户、订单历史记录和季度订单预测。

下面是 10 大销售人员的数据分析报告。

很抱歉,我写的一些报告是中文的。我给你简单解释一下。只看参数联动的效果。

单击第一个直方图中的任何销售人员姓名,以及订单金额、销售额、客户质量等。会自动与员工的数据相关联。

此外,参数联动还可以用于产品分析报表、现金流量表等多种场景。

3。下钻联动

这是动态图表的一个共同特点,主要是实现数据在无限多个图层上的扩展,查询更高维度的明细数据。

简单的钻孔功能如下图所示。在此图中,我们钻取从国家到省以及从省到市的销售。我们还可以根据右边的滑块过滤数据。

现在我们在地图下钻的基础上增加联动功能。只需点击左侧的一个区域,该区域的详细表格和图表数据就会显示在右侧。地图目录链接到相应的级别。

下钻联动也广泛应用于交互式可视化,常见于旅游信息展示、商场财务分析等。

Tour Information Display

Analysis of Comprehensive Indicators of Shopping Malls

Analysis of the Financial Management of Stores

4。参数面板的动态显示

在很多情况下,当我们使用参数查询功能时,某些查询条件只有在满足一定要求的情况下才会显示出来。例如,在下面的报告中,当您在该报告中选择“按天”时,它将显示“开始日期”和“结束日期”。如果选择“按月”,将隐藏日期控件,显示“年”和“月”。如果选择“按年”,只会显示“年”。

那么,通过这篇文章,你学会了一些交互可视化的技巧了吗?请记住,让您的表格或图表动态化并在不同的图表之间创建关系是非常重要的。

您可能也会对…感兴趣

制作销售仪表板的分步指南

数据可视化中的 16 大图表类型

初学者如何设计酷的数据可视化?

仪表板设计的 4 个原则

原文:https://towardsdatascience.com/4-principles-of-dashboard-design-8ad4387c305a?source=collection_archive---------31-----------------------

设计仪表板似乎是一件容易的事情。通常,它将从将数据导入可视化工具开始。然后,将挑选出精美的图表,看看它们是否与数据相符。经过几分钟的反复试验,我们希望我们能从随机选择的图形中得到启发。不,你不会得到你想要的洞察力。

从我的观察来看,如果你不知道想象什么,你最终将从你的仪表板上什么也得不到。这意味着您需要首先从数据中提取洞察力。构建仪表板是数据分析的最后一个阶段。

如前所述,构建一个好的仪表板是一个将数据扔进可视化工具并希望魔法出现的过程。

这是我构建一个好的仪表板的框架。

1)用户

首先,你需要了解你的用户是谁。为了深入了解用户的真正需求,我们将应用设计思维的概念。设计思维的关键概念是理解用户的需求和洞察力。设计思维鼓励我们超越用户需要什么,进入用户为什么需要它。

我们需要深入了解用户或者“为什么”这个问题。那么,用户为什么需要仪表盘呢?

我对此的回答是,他们希望使用仪表板来执行某个操作;例如,做出决策、监控业务绩效等等。

你的工作是了解用户将如何使用仪表板。一旦你真正理解了它们,你就会更好地知道仪表盘上应该显示什么。

Icons made by Freepik from www.flaticon.com is licensed by Creative Commons BY 3.0

2)内容

您需要确定哪些度量和维度最能支持您的用户。度量和维度是我们希望向您的用户显示的内容,以便他们发现问题、确定问题的原因并采取措施解决问题。

度量是您想要分析的关键数字。

维度是分类字段,用于将度量值分解成更小的细节。

应该选择一些措施来方便用户处理信息。我发现许多仪表板要求用户计算总数的百分比、比率或总计。如果用户显然需要这些信息,应该在仪表板上显示出来。

3)演示

清楚地定义了所有重要的度量和维度后,选择正确的图表类型至关重要。根据我的观察,图表是根据熟悉程度来选择的。应根据数据类型选择图表。例如,折线图适用于呈现时间序列数据。

饼图被认为是无效的可视化差异,尤其是当差异是微不足道的。此外,饼图不应有超过 5 个切片,因为。阅读和理解会很困难。

4)导航

最后,将图形和图表结合在一起创建一个仪表板涉及到位置和定位。具有相同数据集或相似主题的图表应放在一起。仪表板不应该要求用户在图表之间来回跳转。

此外,图表应该基于它们的视觉层次来定位。显示概览数据的图表应位于顶部。详细信息通常显示在下面的区域。

良好的导航将允许用户从仪表板中提供的图表构建一个故事。

这一原则提供了作为仪表板设计基础的主要组件,旨在帮助将仪表板用于实际操作。它强调需要了解开发 dashboard 的整个过程,从使用用户移情技术了解真实用户的需求,到选择和放置具有正确组合的图表。

人工智能路线图的 4 个产品驱动步骤

原文:https://towardsdatascience.com/4-product-driven-steps-to-an-ai-roadmap-c30d1096aa86?source=collection_archive---------10-----------------------

如何教会产品做决策

人工智能到底有什么变革性?

人工智能(AI)正在定期开辟新的领域,从 DeepMind 的 AlphaGo Zero 自学围棋并击败人类冠军,到文本生成算法如此强大,以至于它们在 OpenAI 的创造者因担心恶意使用而决定不公开发布它们。

虽然这些成就理所当然地产生了巨大的轰动,鼓舞了企业家和投资者,但其中大多数都缺乏具体的商业应用。如果人工智能事实上是一项变革性的技术,这就提出了一个大问题:你的公司如何利用人工智能创造实际的商业价值今天

大多数人工智能商业应用侧重于自动化和个性化。但是自动化什么?如何个性化?技术已经使许多以前的劳动密集型过程自动化了。AI 的特别之处在哪里?

要理解这个问题,首先要回答一个更根本的问题:有了 AI 你能造出什么样的产品,而没有它你就造不出来?

答案很简单。有了 AI,你就可以造出做决策的产品。

决定,决定

很多产品都是用规则来做决策。但是规则只是其他人做出的让产品遵循的决定。这没什么错,尽管随着时间的推移,许多基于规则的产品变得越来越令人沮丧:你试过给航空公司或银行打电话吗?

大多数有意义的决策都不能用一套简洁的规则来概括。人工智能产品很特别,因为它们可以做出如此复杂的决定。以下是一些例子:

  • “警报:安全摄像头检测到可疑物体”
  • “尽管信用评分低于正常要求,我还是建议批准这笔贷款”
  • “这是根据您的目标和近期表现制定的今天健身课程计划”

这里的变革性部分是,没有人工智能,产品无法做出这些决定,所以人类必须做出这些决定。这意味着它不是一种产品,而是一种服务。上面的例子分别是保安、信用分析师和健身教练提供的服务。

你如何在实践中将这一点应用到你的公司中?自然,任何人工智能产品都涉及许多技术方面,包括数据收集、处理和建模,这些都是数据科学和机器学习专家的领域。但是构建一个人工智能产品的商业和产品管理方面同样重要,也同样棘手。这里有四个步骤来指导你完成这个过程。

1.绘制决策图

因为人工智能产品是关于决策的,所以从围绕你的产品的决策开始。它们是由规则制定的还是由人类制定的?制作它们需要哪些信息?产品自己做出这些决定的价值是什么?

还要考虑当前而非正在做出的决策。这些都是产品平等对待的情况,即使可能有个性化或细微差别的空间。

这些考虑将引导你对你的人工智能机会有一个面向产品的理解。

2.制定自动化计划

接下来,考虑你可以用 AI 自动化哪些决策,自动化到什么程度,按照什么顺序。同样,虽然这些问题取决于许多技术方面,但让我们把重点放在产品方面。

想想获得决策权的另一个过程:职业成长。一线厨师如何成为行政总厨?当然不是某天宣布他们是厨师。同样,你也不能部署一个开箱即用的人工智能解决方案,然后期望拥有一个“智能产品”。

另一方面,一个厨师不会因为擅长切生菜而成为一名厨师,即使你让他们决定切得多细。同样,如果你的人工智能用例局限于一些增量的、孤立的应用,你将不会从人工智能中实现有意义的价值。

开发人工智能路线图就像为你的产品规划学徒期。它应该描绘出一个中间地带,从做出或支持简单的决定开始,逐渐发展到更复杂的决定。

3.实现成功的人工智能学徒

任何成功的学徒都需要导师来树立榜样。人工智能应用还需要大量的例子,包括各种决策及其完整的背景。理解如何捕获这些示例是数据获取和管理的产品方面,这在许多组织中可能是一个重大的痛点。

一个好的导师会以理性的方式做出决定,即使这些决定无法用简单的考虑或规则来完全解释。人工智能也是如此。举个例子,一个人工智能解决方案可以自动化员工的一些工作。如果一个繁琐的过程可以迫使员工做出错误的决定或采取措施回避它,结果将是糟糕的或部分的数据和不成功的人工智能产品。这是一个常见的挑战,需要在开发人工智能解决方案之前更新流程和工作流,无论您当前有多少数据。

4.为错误和不确定性留出空间

学徒期最重要的部分是犯错误并从中吸取教训的能力。人工智能产品还必须通过实现工作流和缓解措施来处理糟糕的决策,从而为错误和个人决策质量的不确定性留出空间。

更广泛地说,尤其是在企业组织中,这一原则适用于商业文化:企业能否容忍人工智能转型道路上的一些增长阵痛?例如,当你的人工智能出错时,一些重要的性能指标最初可能会下降。你的组织能处理吗?你能解释一下为什么这是一个值得冒的风险吗?

底线

认识到人工智能允许产品做出决策有助于指导你的人工智能路线图:在你的产品中映射决策,并用产品思维来思考它们。而且,虽然这是开发成功的人工智能产品的一个要求,但这种方法实际上并不需要任何人工智能。事实上,对于任何产品经理来说,它都是一个有用的工具。训练自己识别决策,建立工作流程以改进决策,减少错误并从中学习。

本文一个版本先前出现在 头脑产品

更好的数据可视化的 4 个快速技巧

原文:https://towardsdatascience.com/4-quick-tips-for-better-data-visualization-abac05b842f8?source=collection_archive---------36-----------------------

数据可视化是任何数据科学家工具箱中最重要的技巧之一。我们的大脑是视觉化的:当我们把数据视觉化时,我们让它更容易消化——对我们自己,对决策者和利益相关者都是如此。因此,它是 EDA(探索性数据分析)和演示的重要工具。

这里有 4 个快速简单的技巧来提高数据可视化。

1.使用 KDE 图进行密度检查

这是 Seaborn 的一个被大大低估的特性。KDE 代表核密度估计,而 KDE 图相当独立地解决了无法看到密集散点图的问题。考虑这个例子,有一个华盛顿州金县房价的数据集…

plt.figure(figsize=(9, 9))
plt.title("Price vs Square Feet", fontsize=32)
plt.xlabel("Square Feet", fontsize=20)
plt.ylabel("Price (in $1000s)", fontsize=20)
plt.scatter(df["sqft_living"], df["price"]/1000);

正如你所看到的,100 万到 200 万美元的购房者几乎和下图一样多——但是直觉上,很明显,我们知道这不是真的。对于这种情况,通常的权宜之计是应用 alpha 透明度——它有时会起作用——但它在这里对我们没有太大帮助。

plt.figure(figsize=(9, 9))
plt.title("Price vs Square Feet", fontsize=32)
plt.xlabel("Square Feet", fontsize=20)
plt.ylabel("Price (in $1000s)", fontsize=20)
plt.scatter(df["sqft_living"], df["price"]/1000, alpha=0.1);

我们的数据现在很难看到,但至少我们可以更好地告诉它的密度。100 万到 200 万美元的买家似乎不再那么多了,但 100 万美元左右的买家似乎和其他价位的买家一样普遍。但是再一次,KDE 的阴谋独自解决了这个问题。

plt.figure(figsize=(9, 9))
plt.title("Price vs Square Feet", fontsize=32)
plt.xlabel("Square Feet", fontsize=20)
plt.ylabel("Price (in $1000s)", fontsize=20)
sns.kdeplot(df["sqft_living"], df["price"]/1000, shade=True);

通过绘制一系列颜色梯度而不是所有单个数据点,KDE 图向我们展示了数据的密度估计。现在,我们终于可以看到我们一直以来都知道的事实:绝大多数买家购买的是 2000 平方英尺以下的房屋。英尺和 50 万美元。在我们没有预先了解我们的数据的情况下,这种洞察力将是无价的,也是非常容易被忽略的。现在,如果我们通过在代码中添加plt.ylim(1000)来放大…

plt.figure(figsize=(9, 9))
plt.title("Price vs Square Feet", fontsize=32)
plt.ylim(1000)
plt.xlabel("Square Feet", fontsize=20)
plt.ylabel("Price (in $1000s)", fontsize=20)# Setting the ylim oddly flips the axis upside down 
# in this case, so we have to flip it back. 
ax = sns.kdeplot(df["sqft_living"], df["price"]/1000, shade=True)
ax.invert_yaxis();

经过所有这些变化,我们现在能够更清楚地了解数据内部的情况。

2。给你的坐标轴贴上标签,让它们可读

我的一位非常明智的导师曾经建议说,如果你要和另一位数据科学家约会,而你不是那种会给你的 x 轴和 y 轴贴标签的数据科学家,约会不会很顺利。推而广之,毫无疑问,用极小的字体标注坐标轴会导致平庸的日期。抛开厚脸皮的幽默不谈,让别人清楚地看到你实际想象的 是非常重要的。接下来的两个数字很好地说明了应该做什么:

始终标记您的轴并设置您的fontsize

3.整理你的输出

这只是生活质量的一个小问题,但是如果你像我一样热衷于细节,那么你可能会非常欣赏它。当你在 Jupyter 笔记本或实验室中使用 Matplotlib 和 Seaborn 时,不言而喻,你希望你的图形出现在你实际的笔记本中;然而,直到第二次运行第一个图形单元时,它们才开始工作。这是因为 Matplotlib(以及 Seaborn 的扩展,因为它是一个 Matplotlib 包装器)并不是专门针对 Jupyter 的,所以它不确定您是想在不同的窗口中查看图形,保存它,还是什么。所以你要明确。加入这行代码(最好是在您的导入中的某个地方),然后再也不用担心它了:

%matplotlib inline

此外,无论何时运行绘图功能,都会得到一个非常多余的小读数,如下所示:

<matplotlib.collections.PathCollection at 0x1a23ccacf8>

这里有一个有趣而鲜为人知的事实,Python 有分号!它们完全是可选的,但是如果你愿意(出于某种原因),你可以像在 Java 等其他语言中一样使用它们。如果您在任何绘图单元格的最后一行代码的末尾添加 1,读数就会消失。瞧啊。

4.使用小提琴图和箱线图进行分布检查

直方图对于了解单个变量的分布非常有用,但是如果您想要比较多个变量呢?或者更精确地了解数据的中位数和百分位数分布?在这些情况下,盒子情节和小提琴情节是你的朋友!

plt.figure(figsize=(15, 8))
plt.title('Distributions of Scores by Genre', fontsize=32)
sns.set(font_scale=2)
sns.boxplot(x='genre', y='score', data=genre_scores)
plt.tight_layout();

该图描绘了各种风格歌曲的 Pitchfork 评论分数的分布。genre_scores是一个只有两列的数据帧:每首歌曲的数字分数,以及由分类字符串变量表示的流派(例如:"jazz")。通过方框图,您可以很容易地看到中位数(彩色方框中心的线)、第 25 个和第 75 个百分位数(彩色方框的边界)以及每个分布的尾部。甚至离群值也被描绘出来!

但是,虽然箱线图非常精确地显示了这些界限,但我们在查看每个点的数据的确切分布时却失去了粒度。不仅如此,每当出现长尾和/或大量离群值时,我们的可视化就会变得混乱。小提琴的剧情解决了这两个问题,做的时候看起来很惊艳。

plt.figure(figsize=(15, 8))
plt.title('Distributions of Scores by Genre', fontsize=32)
sns.set(font_scale=2)
sns.violinplot(x='genre', y='score', data=genre_scores)
plt.tight_layout();

水平部分越宽,y 轴上出现的特定值就越多。更重要的是,中间带点的黑色粗线为我们做了之前盒状图所做的事情:向我们显示中间值以及第 25 和第 75 百分位标记。小提琴的情节是我最喜欢的视觉化作品之一:它们很美,并且在一张图片中告诉你很多东西。然而,它们可能有点难以完全消化,所以有时像箱线图这样更简单的替代方法实际上仍然有很多价值。有时候少即是多。

结论

我希望这些提示能在您探索数据和解释发现时对您有所帮助。感谢阅读!

开始参与数据科学黑客马拉松的 4 个理由

原文:https://towardsdatascience.com/4-reasons-to-start-participating-in-data-science-hackathons-5d95d01a662d?source=collection_archive---------15-----------------------

我的黑客马拉松参与之路始于大约一年半前。我设法参加了 20 多个不同规模和主题的活动,这些活动分别在莫斯科、赫尔辛基、柏林、慕尼黑、阿姆斯特丹、苏黎世和巴黎举行。在所有这些事件中,我一直从事各种形式的数据分析。我喜欢访问新的城市,建立新的联系,提出新的想法,快速实施旧的想法,以及在演讲和结果宣布时感受肾上腺素。

这篇文章是三篇文章中的第一篇,专门讨论黑客马拉松话题。我要告诉你关于黑客马拉松的概念,以及参加黑客马拉松的原因。第二个帖子将显示组织者的错误及其进一步的结果。第三篇文章将提供关于黑客马拉松最受欢迎的问题的答案。

什么是黑客马拉松?

黑客马拉松持续几天,它的目标是解决某些问题。通常,黑客马拉松解决几个问题,每个问题都是一个单独的赛道。发起公司提供任务描述、成功指标(指标可以是主观的,如新颖性和创造性,也可以是客观的,如延迟数据集上的分类准确性)和实现成功的资源(API、硬件、数据集)。参与者应阐明问题,提出解决方案,并在一定时间内展示他们的产品原型。最佳解决方案将同时获得奖项和进一步合作的机会。

黑客马拉松赛段

一旦宣布了任务,黑客马拉松参与者就被团结成团队:每个孤独者都得到一个麦克风,并谈论所选择的任务、他的背景、想法以及他需要合作来实现它的专家。有时一个团队可能只由一个人组成,这个人能够在足够高的水平上独立完成所有的工作。这与数据分析黑客马拉松相关,但对于产品活动来说,这通常是被禁止或不被推荐的——活动组织者旨在公司中进一步的项目开发延续;与那些希望独自创造产品的参与者相比,之前组建的团队有几个优势。最佳团队成员数量为 4 人,即一名前端、一名后端、一名数据科学家以及一名商人。

最佳团队成员数量为 4 人,即一名前端、一名后端、一名数据科学家以及一名商人。

顺便说一下,数据科学/产品黑客马拉松的区分非常简单——数据科学黑客马拉松意味着有一个具有明确指标和排行榜的数据集,或者有机会通过 Jupiter 笔记本中的代码获胜,而产品一则意味着所有其他内容,即需要它来制作一个应用程序、网站或其他有吸引力的东西。

通常,该项目在周五晚上 9 点开始,而截止日期是周日上午 10 点。应该留出一定的时间睡觉(睡觉是强制性的,连续 30 个小时编码肯定会失败,我亲自检查了一下),这意味着参与者开发高质量产品的时间太少了。公司的代表和导师可以帮助参与者。

睡眠是强制性的,连续编码 30 小时肯定会失败,我亲自检查过。

项目运作始于与公司代表的沟通,因为他们更好地认识到任务的细节、标准,并且很可能会对你完成的工作做出判断。当前的沟通目标是认识到哪些领域是最相关的,以及要关注的主要方面。

一个黑客马拉松设定了以下任务:对一个有表格数据、图片和清晰指标——RMSE——的数据集进行回归。当我与该公司的数据科学家交谈时,我意识到他们需要一个分类,而不是一个回归——事实是有人认为最好的问题解决方案是那个。此外,它们需要分类,以便在做出决策时认识到哪些参数是最重要的,然后手动处理它们,而不是获得货币指标的增长。即初始任务(用 RMSE 回归)变为分类;评估优先级从获得的准确性变为结果解释机会。这拒绝了使用堆叠和黑盒算法的机会。简单的对话节省了我很多时间,也增加了我获胜的机会。

简单的对话节省了我很多时间,也增加了我获胜的机会。

一旦你清楚地认识到任务,一定要着手工作。您需要设置检查点,即完成任务所需的时间;此外,继续与公司代表和技术专家等导师交流也是一个好主意,因为这有助于在项目开发期间及时做出修正。重新审视这个问题可能会提出一个有趣的解决方案。

组织者过去经常举办讲座和大师班,因为许多新人都参加黑客马拉松。像往常一样,讲座的数量为 3 个,即关于产品形式中自己想法演示方式的讲座,关于技术主题的讲座(例如,在机器学习中使用 open APIs 以避免自己的 speech 2 文本开发两天,但使用现有的代替),关于推销的讲座(介绍自己产品的方式,如何在公开演讲时使用自己的手以避免观众感到厌烦)。有各种方法鼓励参与者,即练习瑜伽、乒乓球和网球或游戏机。

有各种方法鼓励参与者,即练习瑜伽、乒乓球和网球或游戏机。

你需要在周日早上向陪审团提供你的手术结果。好的黑客马拉松意味着一切从专业技术开始,不管你声称的东西真的有用吗?当前的测试目标是将那些只得到漂亮演示而不是真实产品的团队与那些真正成功开发出东西的团队分开。不幸的是,并非所有的黑客马拉松都意味着技术专长,这有时会导致那些获得超过 12 张幻灯片演示而不是真实产品的团队获胜。这样的先例并不常见,但因为它们最容易被记住,这导致了一个事实,即许多人确信一个好的演示是黑客马拉松 99%的胜利。事实是陈述,相当重要,但其贡献不超过 30%。

事实是陈述,相当重要,但其贡献不超过 30%。

一旦参与者发言完毕,评审团将决定授予获奖者。那么,正式的黑客马拉松部分就完成了。

参与黑客马拉松的动机

1.经验

就获得的经验而言,黑客马拉松是一项非常独特的活动。事实上,有几个地方可以在两天内实现自己的想法,并获得即时反馈。批判性思维、团队合作技能、时间管理、在压力下工作的能力、以可理解的形式展示自己的运营成果、演示技能以及其他许多方面都在黑客马拉松中得到了提高。因此,对于有理论知识的人来说,黑客马拉松是一个获得真正有价值经验的好地方。

2.奖赏

通常情况下,黑客马拉松奖金第一名约为 15k-10k 欧元(在俄罗斯为 10-30 万卢布)。可以使用一个简单的公式来计算预期的参与值:

**EV = Prize * WinRate + FutureValue — Costs**

其中**Prize**是奖金的大小(我们假设只有一个奖金);

**WinRate** —胜利概率(新手团队的当前值上限为 10%,有经验的团队超过 50%;我遇到过这样的人,他们每次参加黑客马拉松都会获奖,但这是个例外,因为他们的胜率低于 100%)。

**FutureValue**是展示未来参与收益的一种:它既可以从已获得的经验形式中获利,也可以从已建立的关系、收到的信息等中获利。当前值几乎不可能准确确定,但必须记住;

**Costs** —交通费、住宿费等。

是否参加的决定是在 hackathon EV 和 activity EV 比较的基础上作出的,这是你想做的,而不是 hackathon:如果你打算整天躺着看电视,那么你应该参加 hackathon;但你的计划是花时间和你的父母或女朋友在一起,然后可能成为你的团队参加黑客马拉松(开玩笑,你自己决定),如果你打算做自由职业者——只要比较一下美元-小时。

根据我自己的计算,我可以肯定地说,参加俄罗斯黑客马拉松与普通初级-中级数据科学家通常工作日的货币利润是相称的,但是有一些重要的特征(团队规模、黑客马拉松类型、奖金等。).因此,今天的黑客马拉松可能会令人愉快地增加你的个人预算,但不是一个真正的黄金机会。

3.在公司和网络工作

黑客马拉松是公司招聘新员工的方式之一。这是一个很好的方式来表明你是一个合格的人,并且知道如何在黑客马拉松上工作,这与在黑板上旋转二叉树的面试形成对比(这并不意味着它对应于你在工作时要完成的任务,但传统必须得到尊重)。这样的战斗条件测试可能会取代整个测试日。

由于参加了黑客马拉松,我找到了第一份工作。我展示了一个从数据中获取更多资金的绝佳机会,以及我将采取的方式。所以,我赢了,然后继续实施那个项目,同时在赞助公司工作。那是我人生中的第四次黑客马拉松。

4.唯一数据集

对于数据科学黑客马拉松来说,这是非常重要的一点,但不幸的是,并不是每个人都意识到它的重要性。通常,赞助公司会在活动期间提供真实数据集。目前的数据是私人的,受到 NDA 的保护,这并不妨碍在真实的数据集而不是玩具泰坦尼克号上展示概念证明。这样的结果将极大地有助于申请某家公司、竞争对手公司的工作,或证明未来类似项目的合理性。显而易见,在其他条件相同的情况下,完成项目并获得积极反馈是一件好事。总的来说,这种实施的项目与 Kaggle 上的奖牌和地位起着类似的作用,但它们对行业的价值更明显。

技巧

参与黑客马拉松是一个相当多样化的背景,很难制定规则列表。不过,在这里我想提供观察清单,能够帮助一个新人:

即使你没有背景或团队,也可以参加黑客马拉松。想想能带来什么好处。也许你有一个有趣的想法或者你精通某个领域?你有一个很好的机会在阐述一个问题的时候运用你的领域知识,并找到有价值的解决方案。或者你可以谷歌一下最好的?如果你能在 GitHub 中找到现成的实现,你的技巧将会节省很多时间。还是你很擅长 Lightgbm 参数调优?在这种情况下,一定要在 Kaggle 比赛中证明这一点,而不是参加黑客马拉松。

战术比机动更重要。黑客马拉松设定了解决问题的任务。有时,为了解决问题,需要揭示问题。检查你发现的问题是否真的与公司相关。请务必检查您的解决方案是否符合问题,并问问自己解决方案的最优性。在评估您的决策时,紧急性问题和建议的解决方案的充分性是最重要的。你的神经网络架构不重要。

尽可能多地参加黑客马拉松,但不要参加组织得不好的活动。

将你的 hackathon 操作结果添加到你的简历中,并随意公开写下它。

Very true for hackathons Minimum Viable Product (MVP)

作为数据科学家在科技公司和银行工作的 4 个理由

原文:https://towardsdatascience.com/4-reasons-to-work-in-tech-firms-vs-banks-as-a-data-scientist-8306af11ade?source=collection_archive---------4-----------------------

Photo by Franki Chamaki on Unsplash

小心你的愿望。

我们都知道数据科学是当今的热门话题。每个人都想成为数据科学家,一旦有机会,他们就会投身其中。如果你正在读这篇文章,很可能你正在寻找/对这个领域感兴趣,并且仍然在寻找那个可能有一天
“改变世界”的完美数据科学角色。好吧,让我告诉你一个小秘密,它可能没有你想的那么有趣。

大数据就像青少年性行为:每个人都在谈论它,没有人真正知道如何去做,每个人都认为其他人都在做,所以每个人都声称自己在做。— 克里斯·林奇,Vertica 系统公司

根据一篇数据科学文章,几乎 20%的数据科学家在金融行业工作,而 37%的数据科学家受雇于科技行业。金融行业报酬丰厚,我们中的一些人被它所吸引,但金融行业真的充分利用了他们拥有的数据吗?

在完成你的学位/训练营/工作后,是时候开始实践并决定机会了。如果你像我一样雄心勃勃(并且不顾一切),只是想把你的脚放在门里,你会抓住任何可能呈现给你的机会,只要它有名字数据在里面。

我今天的工作,就是在为时已晚之前阻止你。

Hold Up

作为一名数据科学家,我今天将重点关注银行与科技公司,因为我可以从个人经验出发。随着各地与数据相关的职位空缺的增加,我在这里分享我的一些经验、角色、环境,以及为什么我认为作为一名数据专业人员,从事科技行业比银行更好。

(免责声明:我仅从个人经验来说,每个人的情况可能不同。我也仅代表我国马来西亚发言。我知道许多外国银行正在充分利用他们的数据。)

你是说科技公司的世界

是真的。目前,我在一家科技公司(不具名)工作,我们在那里运营一个网站/应用程序,连接人们买卖东西。我必须说,他们非常珍惜他们的数据,我们(数据团队)被视为数据的守门人。以下是我头顶的几点:

  • 每个部门做出的所有决定都必须有某种数据支持
  • 数据是新产品/功能的主要驱动力
  • 数据访问仅限于数据团队。因此,我开始与所有其他团队沟通,了解他们如何处理他们请求的数据。

最高管理层通常也关心数据及其使用方式。请记住,这是非常重要的,因为它决定了你将得到什么样的任务。一家拥有数据驱动型管理的数据驱动型公司可以带来惊人的成就,例如:

  • 想出各种方法将你拥有的数据货币化
  • 探索如何利用数据改进他们的网站/产品/应用程序的可能性(比如数据产品)
  • 鼓励你在他们要求的数据中提供见解和建议,他们认为这是你的技能之一
  • 探索机器/深度学习的正确用例

此外,我还负责将多个来源的数据加载到我们的数据库中。当我的代码被部署来获取最终在一天结束时用于分析和支持的数据时,我感觉我实际上是在让世界运转,让公司活着。我们曾经有一周没有将数据加载到我们的仓库中,公司的大多数人都感到很痛苦。他们仍然在运作,但是他们没有一个安全网来支持。

Photo by Ben White on Unsplash

对面的可以说是银行。我在两家不同的银行工作了 7 个月。第一个是数据团队的实习生职位,另一个是数据团队的数据分析师(或者他们称之为决策管理)。请注意,我工作过的银行中,有一家在我所在的国家的行业中占有最大的市场份额。换句话说,我在我国最大的银行之一工作过。

首先,您不需要根据收到的数据请求提供任何额外的内容。

你找到有意义的东西了吗?一个想法?或者某种改进他们产品的建议?他们并不在乎。

他们只要求你做报告,通常,你只报告已经自动生成的 excel 数字,你只需要在那里仔细检查它。他们甚至不需要图表、可视化或你的输入。

只是摘录。不要想。

有几次我觉得受到了挑战,那就是当这些数字与其他部门的一些数字不匹配时,那时我必须进入脚本并修改一些代码。但即使那样,我最后也只是报了正确的数字,没有人真正关心我做了什么。

你可能会说,你是一个新手。因为你是新来的,他们不会把更重的任务交给你。嗯,我独自全权负责个人贷款&分期付款购买组合。我也和我的同事谈过这件事,他们提到他们在做类似的事情,但形式不同。基本上,你会学到更多的是银行知识,而不是数据,这不是一件坏事,只是这不是我想要的。

我遇到的最有趣的任务是由我的上司提出的,是对一个人购买某种产品的概率进行统计。基本上,它是这样的——收入高于 X 美元的顾客购买该产品的可能性增加 X%。我发现这在当时非常有意义。然而,回想起来,我甚至没有机会执行这样的任务。此外,与我现在为公司所做的贡献相比,它似乎没有那么大的影响力。

在我看来,我认为这仅仅是因为银行业务的性质。他们的商业模式的设计方式限制了他们产品的改进/创新。贷款和存款总是贷款和存款,没有任何令人兴奋的产品要实现(或者有吗?).由于这是一个稳定的业务,我们大多数人都会以这样或那样的方式遇到银行,他们并不真正认为有必要实施高端人工智能/机器学习模型/探索性分析来帮助他们开展业务。只是不值得他们花费时间和精力。

对你们有些人来说可能不同,但在马来西亚,我可以代表大多数银行。

与一家不断想方设法改进其产品的科技公司相比,无论是推荐算法、图像和语音识别、预测趋势的机器学习模型,还是实时数据产品,我觉得成为那个世界的一部分更令人兴奋。

Photo by Riccardo Annandale on Unsplash

科技公司鼓励创新

数字时代。

让我们想一想,公司是如何获得他们的数据的。这是通过技术——网站、应用程序、本地程序。如果没有它们,我们将会把所有的数据都存储在储藏室的纸堆上,当我们需要的时候就翻翻它们。

关于技术的事情是——它总是在进化。

随着大量新网站和应用程序的开发,人们迷失在数据中。坦率地说,他们不知道该拿它怎么办。对于少数这样做的人来说,他们可能只是触及了表面。这是许多利益相关者不敢投资数据科学的原因之一,他们不信任数据科学。

谷歌、facebook 和 twitter 等几家最大的科技公司正在引领我们了解数据能做什么,以及它有多强大。这鼓励了一些较小的科技公司跟随他们的脚步,试图在数据领域实施最新技术。并非所有的公司(尤其是非科技公司)都有勇气(或头脑)去探索新技术,他们只是专注于用传统的商业模式盈利。

在我工作的公司,我们将数据存储在谷歌云中, bigquery 。这可能比你想象的更重要。如果你的公司正在花钱投资他们数据中的好技术,这意味着你有机会探索/实现仅限于你能学到的新东西。

这里有一个例子,我的公司最近从 redshift 迁移到了 bigquery,因此他们需要数据工程将所有数据管道从之前的位置迁移到 bigquery。经过多次讨论,该公司已经决定使用由 Google Cloud Composer 管理的Apache air 流来创建管道。由于这是谷歌的一个相对较新的软件,除了它擅长做什么之外,互联网上没有太多关于这个产品的信息。以此为契机,我跳进了气流,以最快的速度学习一切,并向我的上级展示了管道。一件事导致另一件事,部署到 airflow 上每天获取数据的生产代码确实是由您的编写的。

我也是每小时数据提取的先驱。在我之前,该公司只实施日常提取。

这是巨大的。

不是每个人都有这样的机会。这很说明问题。我为公司做出了巨大的贡献,在未来的努力中,我也有一个项目要展示(这让我胜过了我的竞争对手)。公司也更看重我,因为当管道出现问题/需要改进时,我是关键人物(看我为什么提到我是个大人物?).总而言之,在一家科技公司,每天都会有新的东西要学。如果你跑得快,这就是展示你的技能的地方,也许作为回报,你会得到你一直渴望的好的评价。

另一方面,银行也是如此。

在我工作的第一家银行(也是我国最大的银行),甚至连计算机都是古老的。他们仍然使用电脑显示器作为他们的显示器,而我现在在工作中使用 Macbook Pro。他们的数据存储在 prem 和 SAS 代码中,这使得迁移到其他技术更加困难。你还会注意到,管理层没有兴趣投身于深度/机器学习领域。他们在没有这些技术的情况下也取得了成果,如果他们看不到潜在的收益,他们也不会改变。如果当前的系统已经在运行,没有人愿意做出改变。

你在银行学得慢的原因之一是,他们限制了你的互联网。努夫说。
你不能登录 Youtube。
您无法登录 Udemy。
你不能登录任何东西。如果我甚至不能进入堆栈溢出,我该如何调试我 Python 代码呢?我不能。这对员工学习新技能、创新和创造任何变化都是一个巨大的障碍。在我现在的公司,我们有一个 Udemy 的公司账户,允许我登录 Udemy 并免费注册任何课程。

你想从一个著名的付费课程学习 Python 吗?你可以在这里。

另一个需要注意的重要事情是,如果你在银行工作了 3-4 年,你必然会学习 SAS 作为你的主要数据编程语言。据我所知,SAS 广泛应用于银行和保险行业。技术行业主要使用 Python 和 R 来处理数据,因为它们是开源的(免费的),易于阅读,并且与许多技术兼容(AWS,Google 等)。他们也不使用 SAS,因为它非常昂贵。因此,你有可能把自己锁在 SAS 的世界里。

如果你喜欢也可以。但是仔细想想。

如果你要为一家科技公司招聘,你会选择一个有 4 年 Python 经验和成熟项目的人,还是一个有 SAS 知识的银行业的人,记住你的公司不会购买 SAS 许可证。答案很明显。

你可能会说,既然你对 python 感兴趣,你可以通过一些个人项目来学习 python。但这不是重点。如果你那么聪明,有那么多时间,你可能会从科技行业开始。然而,如果你的梦想是从在银行工作开始,那么你可能应该忽略这篇文章。

科技公司有更好的工作环境

Photo by Nastuh Abootalebi on Unsplash

一个工作场所的文化,一个组织的价值观、规范和实践对我们的幸福和成功有着巨大的影响。—亚当·格兰特

你曾经梦想过在传说中的谷歌工作空间工作吗?免费的食物和饮料,了不起的人,舒适的椅子,你明白了。嗯,我们这里没有。

但是我们已经很接近了。

首先,我工作的公司有一个开放的空间环境,在那里我可以随时找到任何人,问任何我想问的问题。这对你来说可能没那么重要,但相信我,它很重要。一旦你开始热身,你就会和来自不同背景和团队的人交往。工作也完成得更快。例如,营销团队经常从我这里请求数据,用于他们的运营。如果我愿意,我可以直接走到他们面前,问他们这些数据是做什么用的。作为回报,他们会从头到尾向我解释这些数据的背景和用途。

这提高了我工作的质量和效率,因为我确切地知道他们想要什么。

在银行,我们通常通过电话来做这件事。你可能会争辩说这没多大关系。这是我给你的另一个例子。

我最近启动了一个个人项目,利用实时数据来支持公司网站上的一个产品。既然是个人项目,就没人知道这件事。在我完成基础工作后,我有许多问题要问。

  • 产品经理对我的项目有什么看法?比如实时是怎么定义的?他想要几秒钟吗?还是分钟/小时?这一点很重要,因为它越实时,网站的负载就越高,数据的价值就越小(例如,在过去的 10 秒钟里,有 X 个人访问了你的网站)。这需要经验。
  • 我如何在网站和应用程序上实现我的实时数据?我是数据分析师/工程师,不是网站开发者。
  • 我的项目可能吗?它给公司带来了显著的价值吗?对于带来的价值,执行这个的时间和精力值得吗?观点在这里很重要。

我个人希望在我向我的上级和利益相关者陈述任何事情之前,这些问题能够得到解答。我意识到任何改变都是通过团队来实现的,而不是个人。我可能有这个想法,但是我需要帮助来执行它。因此,我不想提出一个想法,只是发现它不可能在我们现有的堆栈上实现。

当我和同事见面时,我显然需要解释我的项目背后的概念。在这种情况下,我坚持面对面交流,因为任何印象/困惑/信心都可以立即被发现,这反过来又能更快地完成工作。

这里的环境也更有活力。没有严格的工作时间,人们穿着时髦的便装,我们偶尔会有免费的食物。这个地方光线很好,充满了绿色植物,员工们在墙上绘有丰富多彩的有意义的引言。基本上,所有的东西都布置好了,这样你会在你的工作空间感到舒适,因为你一天要在这里呆 8 个多小时。

我们都同意,银行的工作空间不是最好的,尤其是对我国而言。如果你没有去过银行的办公室,让我告诉你吧。你必须每天准时,一分不差。根据你所在的部门,你也会晚下班。如果你准时离开,所有其他员工都会像往常一样盯着你。每天都需要正装,工作空间相当沉闷。我认为这很正常,直到我研究了其他国家的其他公司。还是那句话,我不反对,我只是不喜欢。

科技公司有更好的公司层级结构

Photo by Edvard Alexander Rølvaag on Unsplash

这不是秘密。

银行有复杂的企业金字塔结构供你攀爬。每个人都想成为经理,但是你需要多久才能做到呢?从初级,高级主管,助理经理,经理,如此这般。任务严格按照员工的头衔分配。例如,一个高级主管不会接受像管理一个落入经理手中的项目这样的任务。另一方面,我现在工作的地方要开放得多。如果你能证明你有这个能力,你可以建议自己对某些事情负责。我发起的气流项目就是一个最好的例子。

银行的性质也使得这座金字塔更难攀爬。你只需要遵从上级的指示。没有创新,你将获得的大多数任务的本质都是重复的。没有创新,就无法真正给公司带来有意义的贡献。据说,如果你想加薪或升职,你必须为公司带来价值。

但是,如果其他人都做出了类似的贡献,你带来的东西又有什么价值呢?

银行通常也会将你工作的时间视为经验,这有助于确定你的薪酬。这与行业中缺乏创新和任务的重复性高度相关。因此,你很快就会注意到,即使你比别人更聪明或者效率是别人的两倍,你也只需在银行工作最少几年就能获得经理这样的头衔。这样,你还会注意到同事之间的薪酬非常标准。例如,对于工作了 5 年的人来说,工资通常是 RM X。

在科技领域,经验取决于你所取得的成就。你能展示的项目、个人项目、副业将极大地有助于公司决定你的头衔和薪水。例如,如果你已经做了 10 年的数据分析师,但你没有机器/深度学习方面的经验,你就不会在这里获得“数据科学家”的头衔。因此,众所周知,个人投资组合对从事技术工作的人来说非常重要。这是为了让他们在申请新公司或在当前公司要求晋升时,能够展示自己的工作。当你对自己的成就感到满意时,你可以通过利用你对公司的贡献,在评估期间协商调整你的薪酬。顺便说一下,我说的不是定期捐款,而是非同寻常的捐款。那些让你在公司不可替代的人。

回到等级制度,科技通常有更平金字塔。在我工作的地方,我直接向公司的首席财务官汇报。同样,这里更加开放,为了更好的效率,任何形式都被跳过。如果我有什么要说或建议,我通常会直接向他提出来。我更喜欢这样。

Photo by Randalyn Hill on Unsplash

我希望这能给你一个大概的了解。

对我个人来说,我不认为我的日常工作是朝九晚五。我想喜欢我的工作,我想让它点燃我的激情,这样我每天都能保持动力。

我完全理解有些人没有我幸运。有些人几乎无法迈出第一步。为此,我感激我现在所拥有的。就我所担任的角色而言,我了解我们所拥有的基础、工作方式、位置和可能性。我能够探索新技术,并使用适当的用例来实现它们。我真的相信我所做的,我相信我给公司带来的价值。

如果我想让你从这件事中吸取什么的话,那就是对你所做的事情充满信心和热情。如果你所在的公司阻碍了你的发展,你应该离开它,因为在那里你不会有任何效率。祝你一切顺利。

只是我的两分钱。下次见!

你的机器学习代码可能不好的 4 个原因

原文:https://towardsdatascience.com/4-reasons-why-your-machine-learning-code-is-probably-bad-c291752e4953?source=collection_archive---------18-----------------------

你当前的 ML 工作流程可能会将几个线性执行的功能链接在一起。虽然很快,但它可能有许多问题。与其线性链接函数,不如将数据科学代码编写为一组任务,它们之间存在依赖关系。也就是说,您的数据科学工作流应该是一个 DAG。

您当前的工作流程可能将几个功能连接在一起,如下例所示。虽然很快,但它可能有许多问题:

  • 随着复杂性的增加,它无法很好地扩展
  • 您必须手动跟踪哪些函数是用哪些参数运行的
  • 您必须手动跟踪数据保存的位置
  • 其他人很难阅读
import pandas as pd
import sklearn.svm, sklearn.metricsdef get_data():
    data = download_data()
    data.to_pickle('data.pkl')def preprocess(data):
    data = clean_data(data)
    return data# flow parameters
do_preprocess = True# run workflow
get_data()df_train = pd.read_pickle('data.pkl')
if do_preprocess:
    df_train = preprocess(df_train)
model = sklearn.svm.SVC()
model.fit(df_train.iloc[:,:-1], df_train['y'])
print(sklearn.metrics.accuracy_score(df_train['y'],model.predict(df_train.iloc[:,:-1])))

该怎么办呢?

与其线性链接函数,不如将数据科学代码编写为一组任务,它们之间存在依赖关系。也就是说,您的数据科学工作流应该是一个 DAG。

https://github.com/d6t/d6tflow 是一个免费的开源库,可以让你轻松构建高效的数据科学工作流。

我们没有编写这样的函数:

def process_data(df, parameter):
    df = do_stuff(df)
    data.to_pickle('data.pkl')
    return dfdataraw = download_data()
data = process_data(dataraw)

您可以编写可以作为 DAG 链接在一起的任务:

class TaskGetData(d6tflow.tasks.TaskPqPandas): def run():
        data = download_data()
        self.save(data) # save output dataclass TaskProcess(d6tflow.tasks.TaskPqPandas): def requires(self):
        return TaskGetData() # define dependency def run(self):
        data = self.input().load() # load input data
        data = do_stuff(data) # process data
        self.save(data) # save output datadata = TaskProcess().output().load() # load output data

这样做的好处是:

  • 不管你的工作流程有多复杂,所有的任务都遵循相同的模式
  • 你有一个可伸缩的输入requires()和处理功能run()
  • 您可以快速加载和保存数据,而不必硬编码文件名
  • 如果输入任务没有完成,它将自动运行
  • 如果输入数据或参数改变,该功能将自动重新运行
  • 其他人阅读和理解工作流要容易得多

机器学习 DAG 示例

下面是一个机器学习流程的程式化示例,用 DAG 表示。最后,您只需要运行 TaskTrain(),它就会自动知道要运行哪些依赖项。完整示例见https://github . com/d6t/d6t flow/blob/master/docs/example-ml . MD

import pandas as pd
import sklearn, sklearn.svm
import d6tflow
import luigi# define workflow
class TaskGetData(d6tflow.tasks.TaskPqPandas):  # save dataframe as parquet def run(self):
        data = download_data()
        data = clean_data(data)
        self.save(data) # quickly save dataframeclass TaskPreprocess(d6tflow.tasks.TaskCachePandas):  # save data in memory
    do_preprocess = luigi.BoolParameter(default=True) # parameter for preprocessing yes/no def requires(self):
        return TaskGetData() # define dependency def run(self):
        df_train = self.input().load() # quickly load required data
        if self.do_preprocess:
            df_train = preprocess(df_train)
        self.save(df_train)class TaskTrain(d6tflow.tasks.TaskPickle): # save output as pickle
    do_preprocess = luigi.BoolParameter(default=True) def requires(self):
        return TaskPreprocess(do_preprocess=self.do_preprocess) def run(self):
        df_train = self.input().load()
        model = sklearn.svm.SVC()
        model.fit(df_train.iloc[:,:-1], df_train['y'])
        self.save(model)# Check task dependencies and their execution status
d6tflow.preview(TaskTrain())'''
└─--[TaskTrain-{'do_preprocess': 'True'} (PENDING)]
   └─--[TaskPreprocess-{'do_preprocess': 'True'} (PENDING)]
      └─--[TaskGetData-{} (PENDING)]
'''# Execute the model training task including dependencies
d6tflow.run(TaskTrain())'''
===== Luigi Execution Summary =====Scheduled 3 tasks of which:
* 3 ran successfully:
    - 1 TaskGetData()
    - 1 TaskPreprocess(do_preprocess=True)
    - 1 TaskTrain(do_preprocess=True)
'''# Load task output to pandas dataframe and model object for model evaluation
model = TaskTrain().output().load()
df_train = TaskPreprocess().output().load()
print(sklearn.metrics.accuracy_score(df_train['y'],model.predict(df_train.iloc[:,:-1])))
# 0.9733333333333334

结论

将机器学习代码编写为一系列线性函数可能会产生许多工作流问题。由于不同 ML 任务之间复杂的依赖关系,最好将它们写成 DAG。https://github.com/d6t/d6tflow 让这变得非常容易。或者,你可以使用 luigi 和 airflow ,但是它们更适合 ETL 而不是数据科学。

2020 年进军数据科学的 4 个步骤

原文:https://towardsdatascience.com/4-steps-to-break-into-data-science-in-2020-4750418c726c?source=collection_archive---------15-----------------------

2020 年就要到了,这意味着一年中的这个时候,你需要拿出一张纸,列出下一年你想要完成的目标。

Photo by Jude Beck on Unsplash

这没什么错,但是你可能知道很容易列出一个几乎不可能的、耗时的目标,这只会让你感到不知所措,并且很可能没有动力——因为有太多事情要做。

如果你打算明年注册数据科学,我会说你做了一个伟大的决定。这个领域被广泛接受,到处都有工作,薪水很高,甚至管理层也在慢慢明白为什么需要数据科学。

但是在我们开始之前,让我稍微打消你(是的,这是必要的)——一年的时间不足以学习整个领域。

不要误解我的意思,1 年的时间足以让你找到第一份工作,但很可能你不会在一年内从 0 成为数据科学团队的领导者(如果你成功做到了,请在评论区分享你的故事)。

话虽如此,让我们探索一下你需要的所有技能以及如何学习足够的技能让你起步。

1.复习数学技能

你很可能听说过数据科学苛刻的数学先决条件。你需要知道的数学知识量会因工作角色的不同而有很大差异,但作为开始工作时你需要多少数学知识的一般答案,我会说:比你想象的要少。

By GIPHY

推理会随之而来。深入每一个有点相关的领域很有诱惑力——比如微积分、线性代数、概率或统计——但是你需要知道什么时候该停下来。

不要误会我的意思,如果你有世界上所有的时间,请成为我的客人,成为上述领域的专家,否则,请确保你没有浪费时间。要想作为初级数据科学家进入这个领域,你需要了解数学,但更多的是直觉层面。你需要知道在某些情况下该怎么做——这就是直觉的作用——但是我不会花太多时间手工解决复杂的数学问题。

如果你擅长直觉,知道如何编码,那就足够了。找到工作后,你有足够的时间深入学习数学——不需要事先学习所有的东西。

如果你还没有高等数学学位,我不建议你花超过 2-3 个月的时间来温习数学技能。

2.编程呢?

是的,编码技能对数据科学至关重要。如果你在这个行业找到了一份工作,而你的编码技能很缺乏,很可能你会知道你需要做什么,但你不会知道如何去做。你很可能会患上 SOCPS ( 栈溢出复制粘贴综合症),甚至可能没有阅读问题和答案。

By GIPHY

在网上寻找更优雅的解决方案没有错,但你应该知道如何自己写一个基本的解决方案。

如果你以前从未写过一行代码,从小处着手,读一本关于 Python 或 R 以及它们在数据科学中的作用的书(以获得完整的图片)。然后深入研究语法。不要担心记住所有的东西,只要确保知道当你卡住的时候去哪里找就行了。

如果你已经读过一本书或者完成了一门编程课程,并且你知道语法,但是不知道如何处理这个问题,花一些时间学习算法和数据结构。还要回答最常见的编码面试问题,因为这些问题会激发你的创造力(或者让你生气)。

你对自己的编程技能满意吗? 太牛了!现在花一些时间在分析库上——比如 Numpy 和 Pandas。

你花在编码上的时间也会有很大不同。对于完全的初学者,或者只是需要图书馆知识的人来说就不一样了。我认为对于完全的初学者来说,3-4 个月足够了,如果你只是学习分析库,大约 1 个月。

3.数据库?

您正在分析的数据很可能来自某种数据库。这就是典型的工作环境与书本或在线课程不同的地方——你不会得到一个格式良好的 CSV 文件。通常情况下,你需要一个领域知识(或拥有领域知识的人),以及大量的 SQL 知识。

如果你要用 Python 或 R 之类的编程语言做分析,那么不要花太多时间学习 SQL 分析函数、PLSQL/T-SQL 和所有那些更高级的东西。在这种情况下,您的 SQL 工作将主要依赖于连接两个表来执行分析。

你会在这里花多少时间取决于你使用它们的方式和之前的知识,但是对于初学者来说,不要在这里花超过一个月的时间。

4.现在让我们学习一些数据科学

By GIPHY

如果你遵循了上面的每一步,并且你没有一些先验知识,那么现在可能是 2020 年 8 月或 9 月。很多时间过去了,但是你已经具备了找到第一份工作的所有先决条件。

嗯,准确的说不全是

您正在寻找数据科学方面的工作,到目前为止,我们只讨论了先决条件。我建议在接下来的两个月中,您应该熟悉基本的数据分析和可视化库,比如:

  • Numpy
  • 熊猫
  • Matplotlib
  • Scipy
  • 统计模型

也就是说,如果你还没有学过的话(你可能已经学过了,但是不清楚为什么需要它们会很无聊)。
不要只是浏览教程,从网上下载一些数据集进行可靠的分析。然后上网看看别人在同一个数据集上做了什么,看看哪里可以改进。

在这两个月的时间里,你还应该熟悉一些机器学习算法,比如:

  • 线性回归
  • 逻辑回归
  • 分类和回归树
  • KNN
  • 朴素贝叶斯
  • SVM

也许你在实践中不会用到其中的一些,但是它们会为你提供一个基础,让你以后学习更高级的算法,比如 XGBoost神经网络

像分析库一样,确保不要一个教程接一个教程地学习,而是自己完成高质量的工作。如果你喜欢,试着在 Numpy 中从头开始实现算法——但这不是强制性的。

下一步是什么?

2020 年只剩下几个月了,创建一个 GitHub 账户,上传 3-5 篇你最好的分析/ML 文章给潜在雇主看。另外,制作一份漂亮的简历和求职信。

如果你真的喜欢,以在线博客的形式记录你的学习历程。在线展示只能帮助你的职业发展,也就是说,如果你不每天发布无意义的内容——但我相信你的判断。

就这样,开始给你想去的公司投简历吧——没有别的办法了

真心希望 2020 年是你的一年。去粉碎它。

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。

[## 通过我的推荐链接加入 Medium-Dario rade ci

作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…

medium.com](https://medium.com/@radecicdario/membership)

高级特征工程和预处理的 4 个技巧

原文:https://towardsdatascience.com/4-tips-for-advanced-feature-engineering-and-preprocessing-ec11575c09ea?source=collection_archive---------11-----------------------

特征工程

创建新要素、检测异常值、处理不平衡数据和估算缺失值的技术。

https://www.analyticsvidhya.com/blog/2018/11/data-engineer-comprehensive-list-resources-get-started/

显然,开发机器学习模型的两个最重要的步骤是特征工程预处理。特征工程包括创建特征,而预处理包括清理数据。

折磨数据,它会承认任何事情。—罗纳德·科斯

我们经常花费大量时间将数据提炼为对建模有用的东西。为了使这项工作更有效,我想分享 4 个技巧和诀窍,可以帮助你工程和预处理这些功能。

我应该注意到,尽管这可能是老生常谈,领域知识可能是工程特性中最重要的东西之一。通过更好地理解您所使用的功能,它可能有助于您防止欠拟合和过拟合。

你可以在这里找到带分析的笔记本。

1.重采样不平衡数据

在实践中,您经常会遇到不平衡的数据。如果你的目标只是有轻微的不平衡,这不一定是个问题。然后,您可以通过使用适当的数据验证措施来解决这个问题,例如平衡精度精确召回曲线F1 得分

不幸的是,情况并非总是如此,您的目标变量可能会非常不平衡(例如,10:1)。相反,您可以使用称为击打的技术对少数目标进行过采样,以引入平衡。

重击

SMOTE 代表合成少数过采样技术,是一种用于增加少数类样本的过采样技术。

它通过查看目标的特征空间并检测最近的邻居来生成新的样本。然后,它简单地选择相似的样本,并在相邻样本的特征空间内随机地一次改变一列。

实现 SMOTE 的模块可以在不平衡学习包中找到。您可以简单地导入包并应用 fit_transform:

Original data (LEFT) versus oversampled data (RIGHT).

如您所见,该模型成功地对目标变量进行了过采样。使用 SMOTE 进行过采样时,您可以采取几种策略:

  • **'minority'**:只对少数类重新采样;
  • **'not minority'**:对除少数类以外的所有类进行重新采样;
  • **'not majority'**:对除多数类以外的所有类进行重新采样;
  • **'all'**:对所有类进行重采样;
  • **dict**时,按键对应目标类别。这些值对应于每个目标类所需的样本数。

我选择使用字典来指定我想要对数据进行过采样的程度。

附加提示 1 :如果您的数据集中有分类变量,SMOTE 可能会为那些不可能发生的变量创建值。例如,如果有一个名为 isMale 的变量,它只能取 0 或 1,那么 SMOTE 可能会创建 0.365 作为值。

相反,您可以使用考虑到分类变量性质的 SMOTENC。该版本也可在不平衡学习包中获得。

附加提示 2: 确保在创建训练/测试分割后进行过采样,以便只对训练数据进行过采样。您通常不希望在合成数据上测试您的模型。

2.创建新功能

为了提高模型的质量和预测能力,通常会从现有变量中创建新的特征。我们可以在每对变量之间创建一些交互(例如,乘或除),希望找到一个有趣的新特征。然而,这是一个漫长的过程,需要大量的编码。幸运的是,这可以通过使用深度特征合成来实现自动化。

深度特征合成

深度特征合成(DFS)是一种算法,使您能够快速创建具有不同深度的新变量。例如,您可以将多对列相乘,但也可以选择先将 A 列与 B 列相乘,然后再将 c 列相加。

首先,让我介绍一下我将在这个例子中使用的数据。我选择使用人力资源分析数据,因为这些功能很容易理解:

简单地基于我们的直觉,我们可以将**average_monthly_hours**除以**number_project**识别为一个有趣的新变量。然而,如果我们只遵循直觉,可能会错过更多的关系。

包确实需要理解它们对实体的使用。但是,如果您使用单个表,您可以简单地遵循下面的代码:

第一步是创建一个**entity**,如果需要的话,可以从它创建与其他表的关系。接下来,我们可以简单地运行**ft.dfs**来创建新的变量。我们用参数**trans_primitives**指定如何创建变量。我们选择了数字变量相加或者相乘。

The output of DFS if verbose = True

正如你在上面的图片中看到的,我们只用了几行代码就创建了额外的 668 个特性。创建的功能的几个示例:

  • **last_evaluation** 乘以**satisfaction_level**
  • **left** 乘以**promotion_last_5years**
  • **average_monthly_hours** 乘以**satisfaction_level** 加上**time_spend_company**

附加提示 1: 注意,这里的实现比较基础。DFS 的伟大之处在于它可以从表之间的聚合创建新的变量(例如,事实和维度)。参见此链接的示例。

附加提示 2: 运行**ft.list_primitives()**以查看您可以执行的聚合的完整列表。它甚至处理时间戳、空值和经度/纬度信息。

3.处理缺失值

和往常一样,没有处理缺失值的最佳方式。根据您的数据,简单地用某些组的平均值或模式填充它们可能就足够了。然而,有一些先进的技术可以使用已知的数据部分来估算缺失值。

一个这样的方法叫做iterative inputr这是 Scikit-Learn 中的一个新包,它基于流行的 R 算法,用于输入缺失变量 MICE。

迭代估算器

尽管 python 是开发机器学习模型的一种很好的语言,但仍有相当多的方法在 R 中工作得更好。一个例子是 R 中完善的插补包:missForest、mi、mice 等。

迭代估算器由 Scikit-Learn 开发,将每个缺失值的特征建模为其他特征的函数。它以此作为估算值。在每一步,选择一个特征作为输出y,所有其他特征作为输入X。然后在Xy上安装一个回归变量,用于预测y的缺失值。对每个特征都这样做,并在几轮插补中重复。

让我们看一个例子。我使用的数据是众所周知的泰坦尼克号数据集。在这个数据集中,列Age有我们想要填充的缺失值。代码一如既往地简单明了:

这种方法的好处在于它允许你使用自己选择的估计量。我使用了一个 RandomForestRegressor 来模拟 r 中常用的 missForest 的行为。

附加提示 1: 如果您有足够的数据,那么简单地删除缺失数据的样本可能是一个有吸引力的选择。但是,请记住,这可能会在您的数据中产生偏差。也许丢失的数据遵循一种你错过的模式。

附加提示 2 :迭代估算器允许使用不同的估算器。经过一些测试,我发现你甚至可以使用 Catboost 作为一个估算器!不幸的是,LightGBM 和 XGBoost 不起作用,因为它们的随机状态名不同。

4.离群点检测

如果对数据没有很好的理解,离群值是很难发现的。如果您非常了解数据,您可以更容易地指定数据仍然有意义的阈值。

有时这是不可能的,因为很难实现对数据的完美理解。相反,你可以利用离群点检测算法,比如流行的隔离森林

隔离森林

在隔离森林算法中,关键字是隔离。本质上,该算法检查样本分离的难易程度。这将产生一个隔离数,该隔离数通过在随机决策树中隔离样本所需的分裂数来计算。然后对所有树的隔离数进行平均。

Isolation Forest Procedure. Retrieved from: https://donghwa-kim.github.io/iforest.html

如果算法只需要做几次分裂就能找到一个样本,那么它更有可能是一个离群值。分割本身也是随机分割的,从而为异常产生更短的路径。因此,当所有树的隔离数较低时,该样本极有可能是异常。

为了展示一个例子,我再次使用了我们之前使用过的信用卡数据集:

额外提示 1 :有一个扩展版本的隔离森林,它改进了一些缺点。然而,T4 的评论褒贬不一。

感谢您的阅读!

如果你和我一样,对人工智能、数据科学或心理学充满热情,请随时在 LinkedIn 上添加我,或者在 Twitter 上关注我。

有代码的笔记本可以在这里找到。

任何反馈和意见,一如既往,非常感谢!

在下一个 Python 项目中使用 PyCharm 的 4 个理由

原文:https://towardsdatascience.com/4-tips-to-get-the-best-out-of-pycharm-99dd5d01932d?source=collection_archive---------6-----------------------

如何使用编辑器的特性来帮助您在大型项目中跟踪 Python 代码

The PyCharm Logo from jetbrains.com/pycharm

PyCharm 是最常见的 Python 编辑器,仅次于 Spyder。当我几年前开始使用它时,我正在为我的毕业设计编写一个推荐系统。我只是听从了我的项目教练的建议,完全不知道编辑器的优点是什么。我知道它与 Anaconda 集成在一起,这让我的生活稍微轻松了一些,但仅此而已。老实说,当时我也不太了解版本控制。3 年过去了,我还在坚持 PyCharm,但这一次,我有我的理由。

当您只是简单地尝试机器学习或为不需要复杂的文件夹结构或模块中组织的脚本的短项目编码时,编辑器的选择通常并不重要。当项目变得更大,有几个脚本、模块、测试和程序员在同一个脚本上协作时,问题和偏好通常会出现。我相信,这就是 PyCharm 的额外特性对任何 Python 程序员都有很大帮助的地方。

我只是提到社区版的功能,而不是专业版的。因此,任何人都应该能够在该软件的免费版本中使用这些功能。

我将描述 PyCharm 的 4 个特性,它们在我上一个 Python 项目中产生了真正积极的影响:

  • 寻找瓦尔多:如何在大型项目中轻松导航
  • Git 集成:版本控制变得简单,包括快速解决冲突!
  • 窗口分割:为了在开发时更好地了解代码。
  • 调试:如何避免不计其数的打印语句!

“寻找沃尔多”的情况

任何程序员都知道,当他们可以看到代码中使用的函数,但在任何地方都找不到它的定义时,是多么痛苦。他们知道它的名字,也知道它的样子。这个“Waldo”函数似乎在做一些至关重要的事情,但是当脚本数量众多和/或相当长时,要找出这个函数最初是在哪里定义的可能会很麻烦。

PyCharm 有一个非常好的特性,允许在项目中的任何地方查找某个关键字的出现。它类似于 CTRL-F,但更好。

在路径中查找功能

位置:编辑>查找>在路径或**中查找使用快捷键 CTRL-Shift-F**

The Find in Path window in PyCharm

当我需要查找变量或函数的第一个引用时,Pycharm 中的" Find in Path "特性非常方便。如果我想包括库或者只包括某个模块,它也有几个选项来改变我的搜索范围!另一个方便的特性,“路径中的替换”,也是同样的工作方式。它可以自动替换我的项目/模块/范围中出现的所有关键字。

我喜欢这个功能,因为我很懒,也很不耐烦。人们总是可以判断出函数是否被导入,进入文件夹找到正确的模块(如果函数在其中),然后滚动脚本直到找到函数定义。但是时间和耐心往往是稀缺的,所以当谈到轻松导航大型项目时,任何帮助都是受欢迎的。

一点小小的警告…

值得一提的是,如果你一直给你的函数或变量起相同的无意义的名字,比如“x,y,z”,“result”和“df”,这个特性就变得毫无用处。我建议在项目变得更大之前,给变量和函数取一个有意义的名字,这也是为了下一批可能要从事这项工作的程序员。

没有理由不使用版本控制!

使用版本控制可以理解版本控制的重要性。幸运的是,py charm非常容易与 Git 一起使用。无论您喜欢使用命令行还是 GUI,选项都在那里。您可以使用 PyCharm 中的选项,在版本控制下提交和推送到您的分支,恢复到您脚本的前一个版本,以及比较分支(尽管我不经常使用那个)。你也可以很容易地在屏幕的右下角看到你在哪个分支。

解决冲突功能(我的最爱!)

地点: VCS >吉特>解决冲突

Resolve Conflict window from jetbrains.com

PyCharm 的“解决冲突”特性仍然是有史以来最好的特性(我甚至没有夸张)。当我不得不解决几个脚本中的多个冲突时,它让我省去很多麻烦。当在本地合并一个分支后发生冲突时,PyCharm 将以红色显示所有有冲突的文件。在上面提到的位置打开“解决冲突”窗口后,PyCharm 在一个窗口中显示我的分支版本、合并的版本和我试图合并的分支版本。对于每个变更或冲突,我可以决定在合并的脚本中采用冲突代码的哪一部分。当几个程序员在同一个项目上工作时,合并冲突经常发生,所以我非常喜欢 PyCharm 的这个特性。

我们需要更多的窗户!

位置:右击我的脚本名>向右移动

Move Right option

当我在写一个新的脚本或者更新一个现有的脚本时,我经常需要在不同的脚本之间来回切换。经常需要查看我们使用的代码约定,在另一个脚本中定义的函数名,或者我以前编写代码的方式。皮查姆也接手了这个案子。它允许您拆分和移动窗口,以便在您当前正在处理的脚本旁边显示一个或多个脚本。如果你还想在代码的工作方式和外观上保持某种一致性,这会很有帮助。

压扁虫子!

当我在一个大项目中工作时,调试可能是一项非常痛苦的任务,并且输出中有些东西不正确。要找出我的数据帧为什么和在哪里得到一些重复值,可能需要在我的代码中的几个地方使用无数不同的 print 语句,我可能会迷失在输出窗口中打印的变量和数据帧的数量中。

调试器

位置:右击我的脚本名>调试‘测试’

My extremely poor attempt at highlighting the important tools of the debugger.

通过使用断点和调试器模式,你可以很容易地在你代码的任何地方评估你的变量。任何时候你的代码在断点处停止,调试窗口将显示每个变量的值,它允许你查看数据帧内部。你也可以点击小计算器,在临时变量上写表达式。如果你通过使用我(试图)突出显示的箭头来浏览代码,你也可以看到你的变量的内容是如何逐行演变的。要了解更多细节,你还可以找到一个非常清晰的教程,教你如何在jetbrains.com上使用调试器。

感谢阅读!

我最近与数据科学相关的故事:

[## 一个数据科学家需要了解多少数据工程?

&他/她不需要知道多少。

towardsdatascience.com](/how-much-data-engineering-does-a-data-scientist-need-to-know-93afe7fab40c) [## 从销售代表到数据科学家

我从销售专员到数据科学家的转变&最大的挑战是什么。

towardsdatascience.com](/from-being-a-sales-rep-to-being-a-data-scientist-4bb1da79ba3f)