TowardsDataScience-博客中文翻译-2021-四十五-

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

TowardsDataScience 博客中文翻译 2021(四十五)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

毕业后立即找到一份数据科学家的工作有多容易?

原文:https://towardsdatascience.com/how-easy-is-it-to-find-a-job-as-data-scientist-right-after-your-graduation-bea5a98c10df?source=collection_archive---------17-----------------------

办公时间

简答:没那么容易!

照片由来自 Pexels 的 Pixabay 拍摄

我们都有过这样的经历:被数据科学家职位的众多职位空缺以及称之为 21 世纪最性感工作的时髦词汇弄得眼花缭乱。那么,这种宣传达到预期了吗?

让我分享一下我在这方面的想法和经验,因为我最近刚从机器学习硕士学位毕业,并且我积极参与了几个月的求职工作。经过一番挣扎和几次拒绝之后,我的申请终于得到了一些肯定的答复。我会谈谈那几个月紧张的求职过程,以及我是如何找到工作的。

声明:这些是我的个人观点,可能反映也可能不反映实际情况。写这篇文章的目的是分享我的故事以及一些可能让你找工作更容易的提示和技巧。

早点开始。

照片由像素的 Pixabay 拍摄

我给出的第一条建议是尽早开始,最好是毕业前 3-4 个月。这不是必须的,但它帮助我没有太大的压力,因为我确保我有足够的时间准备我的简历、求职信和其他相关的博客。

我在法国获得了硕士学位,因为这是一个物价昂贵的国家,毕业后失业对我来说是不可持续的。可能不是每个阅读这篇文章的人都这样,但是尽早开始通常是个好主意。动手吧!

我在 2021 年 7 月底毕业,所以我早在 4 月中旬就开始准备我的简历和其他文件。我在五月初开始申请工作。

不要在求职信上睡觉。

joo ferro在 Unsplash 上拍摄的照片

我相信求职信和一份好的简历一样重要。确保你花了大量的时间来准备它。保持求职信相对简短,易于阅读。首先简单介绍一下你自己,然后用一段开场白说明你如何适合这个职位。然后你可以继续解释你有什么技能,以及这些技能(还有你的成就)如何让你非常适合这份工作。

当你写简历的时候,确保你没有任何拼写错误,并且在谈论你的教育背景之前从工作经历/实习经历开始。此外,在简历中添加一些你在机器学习方面的著名项目,不要忘记提到你是否参加过任何 Kaggle 比赛。

像你硕士项目中的成绩一样突出你的成就是一个好主意。请随意把你的爱好写在简历里,简历会简要介绍你的个性。由于招聘人员以不会在简历上花太多时间而闻名,所以你最好把简历的长度控制在一页以内。

一致性是关键。

在我找工作的过程中,我发现在不同的平台上拥有一个一致的和最新的总体概况是必要的。我的意思是,当你在简历中提到你的 LinkedIn 和 GitHub 个人资料时,确保用你在简历中使用的相同信息更新它们。

其实你可以在你的 LinkedIn 和 GitHub 里面对项目和实习做更多的阐述。有一些 CV 制作网站会让你选择在你的项目旁边添加超链接,这将带你到相应的 GitHub 库。我真的很喜欢这个功能。

对工作职位进行调查。

来自 Pexels 的创业股票照片

更多地了解工作角色和公司会给你在面试中带来很大的优势,你可以很容易地用你的准备给他们留下深刻印象。

此外,你还可以利用该职位的职位描述来微调你的简历和求职信。例如,如果工作是 NLP,你可以用这些信息在简历中突出你的 NLP 项目和你的技能。这一点很重要,因为考虑到一页简历的空间限制,这种微调会让招聘人员关注他们感兴趣的项目。

这似乎是显而易见的,但我见过许多学生使用通用简历和求职信来申请各种职位。

利用远程面试成为你的优势。

来自 Pexels 的 Vanessa Garcia 的照片

自从疫情以来,许多面试都是通过视频会议进行的,如果你仔细想想,你实际上可以利用这一点进行有效的面试。

用你在简历中提供的所有信息准备一些关于你自己的幻灯片/演示。你可以使用屏幕共享选项来展示幻灯片,并向面试官解释你的技能。我尝试了多次,面试官对这个想法印象深刻,他们更愿意和我交谈。

以前,我会做一个关于我自己的口头介绍,并希望面试官在我谈论我的技能时看一下我的简历。随后,面试官会在某个时候失去注意力,因为我很自然地兴奋地详细解释了我的实习工作。事先准备一些有趣的幻灯片,帮助我解决了这个问题,实际上你可以用这个来创新。比如,添加一些额外的信息,告诉你如何利用你的机器学习技能来改善公司的服务或产品。同样,你需要对公司做一些研究来实现这一点。

扩大你的搜索范围。

安娜·涅克拉舍维奇摄于佩克斯

根据你的兴趣、优势以及特定主题的背景,你可以从公司通常发布的不同职位中进行选择。不要把自己局限于一个普通的数据科学家角色,花一些时间去理解不同数据科学角色的细微差别,这些角色通常有许多重叠。这样的例子包括数据科学家、数据工程师、机器学习工程师、数据分析师等等。问题是,这些角色没有严格的界限,他们分享许多相互重叠的技能。

根据我的观察,公司喜欢在他们为数据科学家发布的工作邀请中包括数据工程师的职责。(这可能是因为公司不希望为多个职位雇佣多人,而是希望由一个人来处理。在我看来在创业公司中更常见)。此外,也有公司提供数据科学家的职位,但工作描述更倾向于数据分析师的职责。

我的硕士课程更侧重于对机器学习算法的详细理解,而不仅仅是应用它们来解决问题,并对其进行了研究。所以在找工作的过程中,我的目标是数据科学家、ML 工程师等适合我的职位,以及一些基于研究的职位。拥有更广泛的选择增加了我获得这份工作的机会。

我还观察到,应用程序的成功取决于您的目标领域。假设你有银行业的机器学习实习经验,那么你在类似领域的工作申请将有更高的机会被选中。再说一遍,这是一个显而易见的问题,只是把它放在那里。

理想情况下,仔细思考你的个人资料,了解哪种数据科学角色更适合你。互联网上有几篇文章可以帮助你了解不同数据科学职位所需的技能。

跨国公司与初创企业

我曾想过哪种公司会更好地对待你的申请,并给你一个快速的回复。在我找工作的过程中,我在跨国公司和创业公司都有过糟糕的经历,我从未收到他们的回复(甚至没有一封拒绝邮件!).

但有时我会得到一家跨国公司和一家初创公司的快速回应。我想这取决于你的简历对目标公司的吸引力。以我的情况来说,我也申请了研究实验室,也给了我很好的回应。

我找工作时用的工具。

照片由卡伊奥从派克斯拍摄

这可能是这篇文章最吸引眼球和最有趣的部分。以下是我在求职申请中使用过的一些工具和网站:

  1. 简历:(【https://novoresume.com/】T2)这是我常用的简历制作网站,如果你只是在制作一页纸长度的简历,它是免费的,对我来说非常完美。此外,您可以在项目中添加超链接,这很方便。我发现任何一份简单的简历都可以胜任这份工作,你所要关注的就是你要放进去的内容。
    记住,招聘人员不会花太多时间阅读精心制作的简历,而且你必须在接到面试电话前浏览 ATS 软件。
  2. 求职信:我浏览了网上的几封求职信。我的建议是,使用这些信件只是为了信件的结构和内容,你应该根据你的个人资料制作一封个性化的信件。你可以遵循我在求职信中提到的建议。
  3. 求职门户网站:起初我在 LinkedIn 上申请,但后来我开始使用一些选项,比如 Indeed、Glassdoor 和我大学的就业中心(在 JobTeaser 上)。如果你有兴趣申请基于研究的工作,EURAXESS 是一个很好的选择。我的大部分求职都以欧洲为中心,更侧重于法国。
  4. 编码和概念 : YouTube 是在很短的时间内重温机器学习概念的救星。我用 Kaggle,HackerRank 和 LeetCode 来练习我的编码技巧。也许我之前提到过这一点,但是保持你的 GitHub 档案的更新,用你在简历中展示的相关项目的整洁文档。
  5. 动力和健康:只是一个友好的提醒,要注意你的健康,不要压力太大(我知道说起来容易做起来难,但是是的!).

一些激励的话。

照片由 Prateek Katyal 从 Pexels 拍摄

我只是想在找工作的过程中加入一些“BTS”时刻。在我申请工作的头两个月,我甚至连面试的机会都没有。我相信大多数时候我的申请都没有通过 ATS 软件。我反复修改了我的简历和求职信很多次,增加了质量。

我经常收到这样或那样的电子邮件,内容如下:

"虽然你的经历给我们留下了深刻的印象,但我们真诚地感到遗憾,我们现在不能录用你。"

随意询问你被拒绝的原因(如果你有可能的话),以了解你应该关注你的申请的哪一部分。我在狩猎快结束时意识到了这一点。哦好吧:')

有一段时间,我不得不接受 3 次面试,还做了一个案例研究,结果却收到了一封拒绝邮件。这一次,我记得就这个决定征求反馈意见,结果公司完全无视了我。像这样的事情可能会发生,所以我觉得最好将你的期望保持在最低水平,享受这个过程,而不是专注于结果。迟早有一天,你会挖到金子。耐心点!

随着我的毕业日期越来越近,尽管压力很大,我还是尝试制作高质量的应用程序(根据我几个月来收集的所有经验),最终,我成功地找到了一个非常适合我的资料的数据科学家职位。

最后,我很高兴与社区分享我的经验。我目前是一个写作中等帖子的初学者,但我希望我的每个新帖子都能提供高质量的内容。

如果你已经看到了这篇文章,感谢你的阅读和关注。我希望你觉得这篇文章内容丰富,如果你有任何问题,请随时通过 LinkedIn 、 Twitter 或 GitHub 联系我。

使用基于 MATLAB 的小波分析进行信号去噪的效果如何?

原文:https://towardsdatascience.com/how-effective-is-the-signal-denoising-using-the-matlab-based-wavelet-analysis-9a90ed236f1d?source=collection_archive---------26-----------------------

我们检验了用小波分析滤除时间序列数据中噪声的可行性。

斯蒂芬·克拉克莫在 Unsplash拍摄的照片

小波分析可视为傅立叶分析的一般形式。傅立叶变换常用于信号去噪。尽管如此,这种方法最大的缺点是信号需要稳定。我们现实世界中的大多数测量都不是静态的。此外,在基于傅立叶的去噪中,我们应用低通滤波器来去除噪声。然而,当数据具有高频特征时,如信号中的尖峰或图像中的边缘,低通滤波器会将其平滑掉。

这里,基于小波的方法可能有一些优点。小波查看多分辨率窗口中的信号。它将信号中的特征定位到不同的尺度。我们可以利用这一点,保留重要信号,消除不均匀噪声。我已经在之前的文章中介绍了使用小波进行多分辨率分析的基础知识。

小波去噪

当我们对时间序列进行小波变换时,它将信号特征集中在几个大的小波系数中。一般而言,数值较小的系数被视为噪声。理论上,我们可以缩小这些系数,或者干脆去掉它们。

获取真实世界的信号

在这种情况下,我将下载记录大地震的地震时间序列。我将使用Obspy模块从 IRIS 下载数据。有关如何使用 Obspy 下载波形的详细信息,请参见我的上一篇文章。我将下载位于(北纬 38.1689,西经 117.8497)的任意选定事件“2020-05-15 Mww 6.5 Nevada”的波形。

这将 mseed 数据保存到脚本目录以及“流”的绘图中。我还对信号进行了高通滤波,以获得时间序列的高频部分。

内华达 2020 年 5 月 15 日 Mww 6.5 II-PFO 垂直分量波形(图片由作者提供)

将 mseed 转换为 mat 格式

现在,我们想让数据 MATLAB 可读。我写了一个实用程序来将任何 mseed 格式的数据转换成 mat 格式。我将在这种情况下使用它。

使用 MATLAB 的 2020 年 5 月 15 日 Mww 6.5 Nevada II-PFO 垂直分量波形(图片由作者提供)

基于非抽样小波变换的信号去噪

我将使用 Matlab 函数wdenoise通过sym4db1小波将信号降噪到 9 级。wdenoise使用带有柯西先验的经验贝叶斯方法对信号降噪。

使用 sym4 对地震时间序列进行降噪处理(图片由作者提供)

在上面的代码中,我通过设置名称-值对“DenoisingMethod”、“BlockJS”,使用级别 9 使用块阈值对地震时间序列进行降噪。我用了小波sym4

与原始时间序列相比,信号强度的最终差值为82.5786

此外,我使用不同的小波db1尝试相同的过程。

使用 db1 的去噪地震时间序列(图片由作者提供)

这使得信号强度与原始时间序列相比的差值为34.5294。因此,我们发现小波sym4中的差异是显著的。我们还可以使用其他几个参数,包括级别。

对于“sym4”小波,我尝试将级别更改为 2、5、10,并得到 SNR 分别为 82.7493、82.5789、82.5786。不同电平的 SNR 之间的微小差异可能表明,在这种情况下,高频噪声量并不过量。让我们尝试使用有噪声的合成数据来验证这一假设(在这种情况下,我们将拥有完全的控制权)。

基于四级近似的小波重构(图片由作者提供)

完整的 MATLAB 代码

clear; close; clc;
wdir='./';

fileloc0=[wdir,'II-PFO-BHZ'];
fileloc_ext = '.mat';
fileloc = [fileloc0 fileloc_ext];

if exist(fileloc,'file')
    disp(['File exists ', fileloc]);
    load(fileloc);

    all_stats = fieldnames(stats);
    all_data = fieldnames(data);

    for id=1
        %% read data and header information
        stats_0 = stats.(all_stats{id});
        data_0 = data.(all_data{id});

        sampling_rate = stats_0.('sampling_rate');
        delta = stats_0.('delta');
        starttime = stats_0.('starttime');
        endtime = stats_0.('endtime');
        t1 = datetime(starttime,'InputFormat',"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        t2 = datetime(endtime,'InputFormat',"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
        datetime_array = t1:seconds(delta):t2;

        %% Plot waveforms
        fig = figure('Renderer', 'painters', 'Position', [100 100 1000 400], 'color','w');
        plot(t1:seconds(delta):t2, data_0, 'k-')
        title([stats_0.('network'),'-', stats_0.('station'), '-', stats_0.('channel')])
        axis tight;
        print(fig,[fileloc0, '_ts', num2str(id),'.jpg'],'-djpeg')
        data_double = double(data_0);

        %% Using sym4
        [XDEN,DENOISEDCFS] = wdenoise(data_double,9,'Wavelet','sym4','DenoisingMethod','BlockJS');
        close;

        fig2=figure('Renderer', 'painters', 'Position', [100 100 1000 400], 'color','w');
        plot(data_double,'r')
        hold on;
        plot(XDEN, 'b')
        legend('Original Signal','Denoised Signal')
        axis tight;
        hold off;
        axis tight;
        print(fig2,['denoise_signal_sym49','.jpg'],'-djpeg')

        snrsym = -20*log10(norm(abs(data_double-XDEN))/norm(data_double))

        %% Using db1
        [XDEN_db1,DENOISEDCFS2] = wdenoise(data_double,9,'Wavelet','db1','DenoisingMethod','BlockJS');
        close;

        fig3=figure('Renderer', 'painters', 'Position', [100 100 1000 400], 'color','w');
        plot(data_double,'r')
        hold on;
        plot(XDEN_db1, 'b')
        legend('Original Signal','Denoised Signal')
        axis tight;
        hold off;
        axis tight;
        print(fig3,['denoise_signal_db1','.jpg'],'-djpeg')

        snrdb1 = -20*log10(norm(abs(data_double-XDEN_db1))/norm(data_double))

    end
end

含噪合成数据的小波去噪

这个例子是从 MATLAB 的例子中派生出来的。在上述情况下,对于相同的数据,我得到 sym4 和 db1 小波的 SNR 分别为 9.6994 和 9.4954。这也显示了 sym4 的显著差异。请注意,“sym4”在大多数情况下都能很好地工作,这可能是它被采用为缺省值的原因。

MATLAB 生成的合成数据小波去噪(图片由作者提供)

结论

我们已经了解了如何从 mseed 下载地震波形,将其转换为 mat 格式,然后使用小波分析进行去噪。我们首先对高频地震时间序列进行小波去噪,但重构后,视觉上差别并不明显。但是从信噪比上,我们可以看出区别。我们还绘制了不同尺度下的小波系数。此外,我在一个合成时间序列上展示了小波去噪的工作原理。

参考

1. Wu, W., & Cai, P. (n.d.). Simulation of Wavelet Denoising Based on MATLAB — 《Information and Electronic Engineering》2008 年 03 期. Retrieved May 18, 2021, from https://en.cnki.com.cn/Article_en/CJFDTotal-XXYD200803017.htm
2. MATLAB

原载于 2021 年 5 月 18 日 http://www.earthinversion.comhttps://www.earthinversion.com/techniques/how-effective-is-the-signal-denoising-using-the-matlab-based-wavelet-analysis/

企业应用程序用户界面需要如何改变以适应机器学习的可能性

原文:https://towardsdatascience.com/how-enterprise-app-user-interfaces-need-to-change-to-accommodate-machine-learning-probabilities-cbe35bbd9df4?source=collection_archive---------37-----------------------

我的计划是让人工智能变得简单,而不是复杂,让数百万商业软件用户学会与会思考的机器和软件机器人共存。

自从我 21 年前开始从事技术工作以来,商业软件看起来几乎没有什么变化。字段一个挨着一个,一些表格里有所有的数据。和按钮来做一些事情。

不可否认,从基于客户端的应用到网络已经有了转变——但是对用户体验的真正影响仍然主要是表面的。只要看看下面,我相信你知道我在说什么。这些大家都看了一遍又一遍。

我自己公司的会计系统 Netvisor 的新发票视图的截图看起来像所有其他的企业应用程序。(作者截图。)

我们经历了比我职业生涯中经历过的更剧烈的变化。甚至比诺基亚的灭亡还要严重,这在我的祖国显然是一件大事。

迄今为止,一个商业应用中的一个字段几乎只有两种状态:填充的和空的。看看下面的例子,这个字段有值或者没有值。****

这是田地的样子。(作者插图)

没有介于两者之间的东西,也没有办法指出可能的东西,但不能 100%确定。不确定性。或者概率。你可能会问,为什么这很重要!

照片由 Hitesh Choudhary 在 Unsplash 上拍摄

进入机器学习。

这不是一篇关于人工智能给企业带来的机会的文章,因为你肯定已经阅读了关于这个主题的文章。我说的是所有商业应用的用户界面的根本变化,不管是什么用例。它可以是 SAP、Salesforce、QuickBooks 或 Basware。

企业越来越多地采用技术,如 RPA 或智能自动化,以利用人工智能的力量实现流程自动化。这些过程通常表现为上述业务软件中的一系列动作。例如,读取来自供应商的发票,根据主数据映射其数据,决定一些会计参数(如我在前面的示例字段中的 GL 代码),审查/批准内容,并将发票输入 ERP 系统。

我已经参与了多个这样的自动化项目,并且出现了一个共同的问题。当使用机器学习来预测过程中需要的一些值时,商业应用程序中没有“本机”方式来表明这些值带有不确定性。

自动化与人类用户一起工作,因为不可能有 100%的无接触自动化。关键概念是 信心阈值:ML 对自己的结果有多确定,以及组织设定的“足够确定”的界限是什么。

例如,软件机器人可能使用机器学习来预测发票最可能的总账代码,结果可能是"该发票应计入总账代码 GL-4100100;置信度为 0.78。“在这种情况下,如果公司将自动化进程的阈值设置为 0.8,而无需人工审查,那么这种特殊情况最终会被应付账款部门的人员查看。

股票摄影师显然没有认真对待他们的应付账款工作。Mikhail Nilov 摄于 Pexels 。

现在,在大多数企业应用程序界面中,没有办法向用户传达预测值的置信度。次优的解决方案通常是 RPA 工程师最终将额外的机器学习输出数据写入一些注释或评论字段,用户需要在那里寻找它们。

如果我们真的构建用户界面来适应一些字段由用户填写,一些由 ML 填写的事实,并创建一种方法来表明字段中的置信度,会怎么样?

让我通过一些例子来阐述这一点。请记住,我不是一个用户界面设计师,所以下面的插图仅仅是概念。我希望它们能引发设计师的兴趣,让它们有一天成为现实!

人类填充值与 ML 预测

无论是软件机器人还是 API 在预测后操纵值,今天,结果看起来就像有血有肉的用户会输入它一样。就像你在上面的例子中看到的那样。

人类操作员将受益于字段中值的来源的即时视觉提示。在我下面的例子中,机器预测的字段显示为蓬松的灰色粗笔画,而人类输入的“事实”保留标准的实心黑色笔画。

机器 vs 人类填充的领域。(作者插图)

置信度和阈值的指示

在自动化工作流中,置信度阈值决定了哪些值是自动使用的,哪些值是由用户检查的。

我发现信心和门槛一般不太好理解。所以我们的工作就是让它们变得容易理解。

**问题来自于这样一个事实,即各个领域的正确阈值可能大相径庭。总帐代码与利润中心不同。因此,显示任意的置信度值,如 0.92214340.732123,对用户来说并没有太大的意义,但这是你在评论栏中最常看到的。

如果我们用简单的交通灯来表示自信会怎么样?

信心和门槛的红绿灯。(作者插图)

所提出的方法故意省略了实际值;它只显示颜色:绿色表示置信度大于所选阈值,黄色表示接近阈值,红色表示远低于阈值。

通过将阈值配置移动到由自动化专业人员控制的设置,他们能够调整过程值,而最终用户不会看到任何变化。

接受和拒绝预测值

让我们假设进行了上述 GL 代码预测,并且置信度低于阈值。所以我们的案子需要重审。在当前的模型中,机器和人输入的字段是相等的,没有直接和简单的指示已经做了什么。也许用户需要手动编写审计跟踪,这很容易扼杀自动化的整个想法!

查看接受/拒绝按钮。(作者插图)

我建议应该有一种简单的方法,只需点击一下鼠标就可以接受或拒绝该值,并将其更改为“已审核”状态。这种方法没什么用处。首先,现在可以安全地将低置信度值写入字段来帮助我们人类。辅助自动化带来了好处,因为通常即使是较低置信度的预测也可能是正确的。第二,评论“点击”可以作为新的训练数据点立即反馈给机器学习。

可解释的人工智能—已解释。

这一特定 GL 代码预测背后的因素是什么?为什么总是出错?下一个最佳选择是什么?有时候,比字段值更多的信息是有意义的。

对于那些时刻,我们需要一个工具提示(到现在为止,我已经用尽了我所有的设计技巧😬).

可解释性的工具提示。(作者插图)

像 Aito.ai 这样的机器学习平台为预测背后的主要因素提供了一个简单的视图——哪些特征具有积极的升力和消极的升力。

然而,我们不应该陷入这样一个陷阱,即认为应付账款部门的用户重视科学方法。我们需要一些可以理解的东西,如上图所示,加号和减号来表示预测的主要贡献者。

类似地,工具提示可以容纳下一个最佳预测,可以很容易地将该值转换到字段中。可能性是无限的!

我在上面提议的不仅仅是 UI 上的小改动。我认为可用性和可理解性是更广泛使用人工智能的基本因素。

作为这些系统的设计者和创造者,我们有责任确保我们不会增加更多的复杂性,而是利用这个机会来简化工作,让每天使用这些系统的数百万人更加愉快。

我希望在这一点上你和我是一致的!

自从 1999 年以来,我一直从事企业软件工作。目前,我是位于芬兰赫尔辛基的一家名为 Aito.ai 的智能自动化公司的执行董事长兼 CPO。

脸书、Airbnb 和优步如何从复杂的数据环境中做出数据驱动的决策

原文:https://towardsdatascience.com/how-facebook-airbnb-and-uber-make-data-driven-decisions-from-complex-data-landscapes-a98b370d0f99?source=collection_archive---------34-----------------------

大型科技公司的数据发现方法

莉娜·席尔瓦诺娃在 Unsplash 上的照片

许多大型科技公司做出非常重要的决策,决定如何通过数据为客户提供最佳服务。随着这些公司规模的增长,其数据环境的复杂性也在增长,导致它们变得越来越难以驾驭。

数据发现是在这些环境中找到相关的高质量数据的过程。

在本文中,我们将了解脸书、Airbnb 和优步如何定义其业务环境中的数据发现问题,以及他们如何通过自己的内部平台独特地解决这些问题。

这些公司都在其平台上发表了一篇文章。如果您对某个特定的方法感兴趣,我建议您阅读整篇文章,因为它们有关于其实现和方法的更多细节,这超出了本文的范围。

脸书定义了数据发现

https://engineering.fb.com/2020/10/09/data-infrastructure/nemo/

脸书为数十亿依赖高质量服务的人提供服务。为了确保有意义的体验,团队需要高效地找到相关和准确的信息。发现问题由此产生:

  1. 相关的表可能有一个晦涩难懂或无法描述的名称
  2. 不同的团队有重叠的数据集

不同的团队知道他们想用数据展示什么,并且数据在某处是可用的。数据发现平台帮助这些团队尽快找到正确的数据。

脸书的解决方案:尼莫

为了以简单快捷的方式解决这些问题,脸书开发了一个名为 Nemo 的平台。

“每次我们需要做出决策时,都要通过数据专家来查找必要的数据,这是不可扩展的。所以我们建立了 Nemo,一个内部数据发现引擎。Nemo 允许工程师快速发现他们需要的信息,并对结果的准确性充满信心。”

凭借超过 12 种不同类型的数据工件,Nemo 极大地减轻了脸书数据工程师寻找高质量数据的痛苦,并将他们的数据搜索成功率提高了 50%以上。随着数据类型的多样性增加了近三倍,查询数量增加了一倍,该系统已经能够扩展。

新系统利用了脸书的系统 Unicorn 来有效搜索社交图,以帮助提高平台的可扩展性。Nemo 还允许通过过滤表的使用、隐私限制和数据的新近性来进行更精细的搜索。此外,引擎可以通过向工程师提供相关的数据表来解析和回答问题。最后,系统基于数据质量、新近性、使用和沿袭对表进行排名。

由瑞秋·希斯科在 Unsplash 上拍摄的照片

Airbnb 定义了数据发现

https://medium.com/airbnb-engineering/democratizing-data-at-airbnb-852d76c51770

与脸书类似,Airbnb 在过去几年中经历了数据量和数据格式多样性的巨大增长。

“我们已经看到了数据量和内部数据资源数量的爆炸式增长:数据表、仪表盘、报告、指标定义等。”

他们指出,虽然这是一个增长的信号,表明他们在基于数据的决策方面的大量投资,但这也带来了新的挑战。具体来说,数据源在质量、复杂性、相关性和可信度方面各不相同。很难找到优化所有这些参数的数据。

Airbnb 对导致其数据环境中的主要痛点的两个主题进行了分类:

  1. 数据环境太难驾驭,经常需要用户询问其他人在哪里可以找到合适的资源
  2. 由于缺乏上下文和元数据,很难相信数据。

这些问题导致用户避开资源并创建自己的额外资源,从而导致更加混乱的数据环境。

Airbnb 的另一个问题是数据被本地化到特定的团队。这使得团队对数据缺乏全局背景的短视观点。这导致了缺少上下文的更糟糕的下游可视化。许可规则阻碍了数据的共享和理解,使问题变得更加严重。

“对整个数据生态系统的理解,从事件日志的生成到其在可视化中的使用,比其各个部分的总和提供了更多的价值。”

Airbnb 的解决方案:Dataportal

“数据门户的首要目标是使数据民主化,并通过帮助数据探索、发现和信任,使 Airbnb 员工能够了解数据。”

Dataprotal 的目标是为所有员工提供一个框架,让他们能够轻松地找到数据,并确信这些数据是可信的,并且与他们的问题相关。

数据门户有 4 个组件:

  1. 搜索
  2. 上下文和元数据
  3. 以员工为中心的数据
  4. 团队为中心的数据

搜索功能允许员工搜索日志模式、数据表、图表、仪表板、员工和团队。该平台利用所有可用的元数据来建立上下文和信任。该平台还使用 PageRank 和数据生态系统的网络表示来提供高度相关的搜索结果。

正如问题公式中提到的,Airbnb 认为,对于交付高质量的数据发现平台来说,上下文极其重要。数据门户允许用户查看谁创建了资源,谁使用了资源,以及资源是何时创建和/或更新的。

该平台还包括所有员工的用户资料。任何员工都可以搜索由任何其他员工创建、使用或喜爱的表。

团队有自己的类似于员工的页面,显示他们正在交互和创建的数据。

这种方法很有趣,它将数据发现平台视为一个社交网络。这个平台对于 Airbnb 来说是必要的,因为他们扩大了规模,并大大减少了数据环境的混乱。

美国宇航局在 Unsplash 拍摄的照片

优步定义了数据发现

https://eng.uber.com/databook/

与 Airbnb 类似,优步高度重视数据的背景,以做出更好的数据驱动型决策。

“然而,大数据本身不足以利用洞察力;为了高效和有效地使用,优步规模的数据需要环境来做出业务决策和获得洞察力。”

随着优步每天的出行量增长到 1500 万次,全球每月有 7500 万活跃乘客和 18000 名员工,他们的数据也变得越来越复杂。优步在 2015 年开始建立一个数据发现平台,使用手动维护的静态 HTML 表格。这显然是不可扩展的。

“在这种规模和增长速度下,一个用于发现所有数据集及其相关元数据的强大系统不仅仅是一件好事:它对于让数据在优步变得有用是绝对不可或缺的。”

优步的解决方案:数据手册

Databook 自动生成关于表的元数据,以提供关于数据质量和数据含义的上下文。该平台强调四个组成部分:

  1. 可扩展性:易于向表中添加新的元数据、存储和实体
  2. 可访问性:所有元数据都可以通过编程方式访问
  3. 可伸缩性:支持大量并发读取请求
  4. 电源:支持跨多个数据中心的读写请求。

Databook 从接收多个来源作为输入开始(包括 Cassandra、Hive、Vertica 等。),存储元数据,并通过可通过 Databook UI 访问的 RESTful APIs 输出信息。

Databook 利用了用户不需要实时查看元数据变化的事实,并将元数据存储在 Databook 体系结构本身中。这为用户提供了更快的读取吞吐量(该平台的主要目标之一)。

他们还以模块化的方式设计了系统,将请求服务层和数据收集层分离开来,这样它们就可以单独计算。

有两种方法可以通过 Databook 访问元数据,RESTful API 和可视化界面。

优步决定使用 Elasticsearch 作为 Databook 的搜索功能。它们允许用户在许多不同的维度上进行搜索,如名称、所有者、列等。

托拜厄斯·菲舍尔在 Unsplash 上的照片

结论

随着许多顶级科技公司继续高度重视做出数据驱动的决策,并继续扩大规模,数据发现平台变得越来越必要。在这些公司的规模下是无法手工输入信息的。

虽然脸书、Airbnb 和优步对这个问题采取的方法略有不同,但它们都强调几个方面:

  1. 数据的上下文对于整个过程非常重要。
  2. 数据发现平台是大规模做出基于数据的决策所必需的。
  3. 数据的可信度、相关性和新近性都是在数据搜索排名中应该考虑的重要因素。

看到表现最佳的企业如何处理如此大规模的数据问题是非常有趣的。如果你觉得这些信息有趣或有用,还有大约 13 篇文章描述了大型科技公司如何处理数据发现问题这里(除了其他机器学习和数据科学主题)。

感谢您阅读这篇文章。

我们离开发真正的智能还有多远?

原文:https://towardsdatascience.com/how-far-are-we-from-developing-real-intelligence-c087071603cc?source=collection_archive---------21-----------------------

关于人工智能进展的发人深省的信息

Mo 在 Unsplash 上的照片

人工智能的发明理念是机器将模仿人类大脑的认知功能,即大脑学习和解决问题的能力。图灵测试被用来确定计算机是否能像人类一样思考。经过几十年的人工智能发明(20 世纪 50 年代),我们已经做到了吗?人工智能的当前状态是什么?为了实现这个目标,我们还需要做什么?继续阅读,找到这些问题的答案。

人工智能进化

我们可以认为纽厄尔和西蒙在 1955 年开发的程序是第一个人工智能程序。第一个人工神经网络,称为感知器,是由心理学家弗兰克·罗森布拉特于 1958 年发明的。为什么这么多年来我们没有看到人工智能惊人的进步?这主要是因为缺乏人工智能程序所需的处理能力和内存。

当我们有足够的处理能力和内存时,我们看到了 IBM 的深蓝在 1977 年压倒国际象棋冠军的演变。这主要归功于记忆和计算能力,当然不是因为学习。此后,在 2011 年,我们看到 IBM Watson 战胜了人类世界冠军 Jeopardy。这也减少了对学习的依赖。2017 年,阿尔法戈人工智能赢得了一个三场比赛的系列赛,对手是世界上最好的围棋手。在 AlphaGo 中,创作者将深度学习的直觉力量与 GOFAI(传统人工智能)的逻辑力量结合在一起。)所以,你可能会说,有了深度学习,人工智能至少有了一些学习过程。

所以,现在让我们试着理解我们所说的学习是什么意思。

什么是学习?

你有没有想过一个孩子是如何学会接住抛向空中的球的?如果我要求你为这种活动开发一个人工智能模型,你的方法大多是数学方法,即计算抛射体的轨迹路径。你认为孩子的大脑会做所有这些数学运算吗?事实上,这个孩子从来没有学过抛射体方程。关于孩子如何学习的问题,我们有答案吗?

现在,让我们考虑一下人工智能模型,它们已经向我们展示了在现实世界中做一些好的预测的辉煌成功,并且理解它们的局限性。

https://medium.com/subscribe/@profsarang

少数人工智能成功案例

我们已经在经典的人工智能和人工神经网络/DNN 细分市场中看到了许多人工智能的成功案例。我现在将引用一些故事来衡量人工智能发展的当前水平。

估计房价

这是一个在机器学习教学中广泛使用的例子。我们将这个模型建立在回归的基础上——一个被充分研究过的统计问题。这个模型所做的推论并不比人类的能力更好,只是它做预测的速度比人类快得多。

计算机视觉

人工智能在计算机视觉中最公认的成功是对象检测,我们使用预先训练的 DNN 模型来检测各种对象。然而,这种模型可以检测的对象列表仍然非常有限。作为一个人,你注意到了电脑桌上的车钥匙和餐桌上的可乐罐。我们的物体探测人工智能模型不具备这些能力。他们不能探测到任何任意的物体,而人脑却能轻易做到。

考虑人脸检测。今天的人工智能模型可以将一个以前认识的人(该模型是为其训练的)识别到新的集体照片中。一个人每天看到很多人,还记得他们——“嘿,我以前见过你。”这些人工智能模型可以将一个只看过一次的人的图像与面前的人联系起来吗?

语音识别

这是我们看到人工智能技术取得巨大成功的另一个领域。我们在日常生活中使用 Alexa 和 Siri,在与外国人交谈时使用谷歌翻译应用程序。语音合成和文本到语音转换现在已经不是问题了。一个人在听了一次一个人的声音后,会把这个声音和这个人联系起来,即使他离得很远,过了很多很多天也是如此。我们的语音识别模型有这种能力吗?

因此,今天的人工智能模型还不够通用。因此,我们引入一般智能。

人工通用智能(AGI)

我们今天实践中的人工智能模型被训练来解决一个特殊的问题。打败 AlphaGo 棋手的模型不知道棋局是怎么下的。我们称这个 AI 弱 AI 或者狭义 AI 。弱人工智能是指任何只能解决一个问题的程序。这没有一般的认知能力,也不体验人类心灵的意识。现在,新名词来了——AGI。这个术语仍然是假设性的。这是创造一个智能代理的概念,它可以理解和学习任何人类可以执行的智力任务。我们也称 AGI 为强 AI 或者全 AI 。那么,我们离发展 AGI 还有多远?

人脑模拟器

蓝色大脑是 2005 年 5 月启动的一个项目,该项目使用基于 IBM 蓝色基因设计的超级计算机来理解对人类认知的见解,并根据神经元的突触连接来模拟神经元的行为。

到 2013 年,日本和德国的研究人员使用当时第四快的超级计算机模拟了 1%的人脑。该模拟模型包括由 10.4 个突触连接的 17.3 亿个神经细胞。该程序使用了 82,944 个处理器,花了 40 分钟在真实的生物时间内完成了 1 秒钟的神经活动模拟。

2013 年,欧盟资助了人类大脑项目(HBP),这是一项为期 10 年的研究计划,在欧洲各地雇用了 500 名科学家,从事神经信息学、大脑模拟、HPAC(高性能分析和计算)、医学信息学、神经形态(大脑启发)计算和神经机器人学方面的工作。

总结想法

考虑到以上所有事实,我们可以得出结论,我们离开发真正的智能还很远。问题是,我们是否完全理解了“智力”这个词的含义?根据 Gartner 2021 年对人工智能的炒作周期显示 AGI 处于创新触发水平。所以,AGI 仍然领先很多很多年。在开发出具有完全人类智能的机器人之前,我们只能拭目以待。因此,让我们不要害怕机器人接管人类,至少在不久的将来。

https://medium.com/@profsarang/membership

熊猫读拼花文件(带箭头)vs. CSV 多快?

原文:https://towardsdatascience.com/how-fast-is-reading-parquet-file-with-arrow-vs-csv-with-pandas-2f8095722e94?source=collection_archive---------4-----------------------

理解大数据

重点研究使用 PyArrow 读取拼花文件与使用 Pandas 读取相同 CSV 文件的速度比较

图片来源: Pixabay

为什么用拼花地板代替 CSV?

因为你可能希望读取大数据文件的速度比熊猫的内置函数快 50 倍!

逗号分隔值(CSV)是一种广泛用于数据分析的平面文件格式。它操作简单,在中小型数据环境中运行良好。然而,当您处理较大文件的数据时(也许还要为基于云的存储付费),有一些很好的理由转向使用 列数据存储原则 的文件格式。

阿帕奇拼花地板是这些类型中最受欢迎的一种。下面的文章讨论了其中的一些优势(相对于使用传统的基于行的格式,例如平面 CSV 文件)。

https://blog.openbridge.com/how-to-be-a-hero-with-powerful-parquet-google-and-amazon-f2ae0f35ee04

简言之,

  • 由于是面向列的,Parquet 将所有高效的存储特性(例如,块、行组、列块)都带到了表中
  • Apache Parquet 是使用 Google 的分解和组装算法从头开始构建的
  • Parquet 文件的设计考虑到了复杂的嵌套数据结构。
  • Apache Parquet 支持非常高效的压缩和编码方案。可以使用各种巧妙的方法来压缩一个 parquet 文件,例如(a)字典编码,(b)位打包,(c)游程编码。

图片来源:作者出品(自有版权)

当您必须从磁盘或云存储中存储和读取大型数据文件时,Parquet 文件是一个很好的选择。对于用 Python 进行数据分析,我们都广泛使用熊猫。在本文中,我们将展示在读取大文件的内容时,与使用 CSV 文件和 Pandas 相比,使用 Parquet 文件和 Apache Arrow 会给您带来令人印象深刻的速度优势。特别是,我们将讨论,

  • 文件大小
  • 正在读取的列数
  • 文件的稀疏性(缺少值)

阅读用箭头

PyArrow 是 Apache Arrow 框架的 Python 绑定(API)。根据他们的网站——Apache Arrow 是 内存分析 的开发平台。它包含一系列技术,使大数据系统能够快速处理和移动数据。它为平面和分层数据指定了一种标准化的 语言无关的列内存格式 ,为现代硬件上的高效分析操作进行了组织

这些特性使得 Apache arrow 成为增长最快的分布式内存数据分析框架之一。首先,它是一个理想的内存传输层,用于读取或写入 Parquet 文件中的数据。

对 Parquet 文件使用 PyArrow 可以在读取大型数据文件的速度方面带来令人印象深刻的速度优势,并且一旦读取,内存中的对象可以很容易地转换为常规的 Pandas 数据帧。

要了解更多关于 PyArrow 的完整特性,请参考 Apache 文档。

py arrow/拼花组合有多快?

这篇文章的代码是 在我的 Github repo 这里。

各种尺寸的 CSV 和拼花文件

首先,我们创建各种填充了随机生成的浮点数的 CSV 文件。我们还将它们转换成压缩的拼花文件。所有文件都有 100 列,但行数不同,因此文件大小也不同。

完成此过程后,目录可能看起来像这样。

在大型数据文件的读取速度方面,对 Parquet 文件使用 PyArrow 可以带来令人印象深刻的速度优势

熊猫 CSV vs. Arrow 拼花阅读速度

现在,我们可以编写两小段代码来使用 Pandas read_csv和 PyArrow 的read_table函数读取这些文件。我们还监控读取文件所需的时间,并以比率的形式对它们进行比较。结果如下所示,

尽管趋势有所起伏,但很明显,PyArrow/Parquet 组合在较大的文件中表现出色,即随着文件大小的增长,以 Parquet 格式存储数据并使用 PyArrow 读取会更有利/更快。

对于一个 100 MB 的文件,该比率增长到大于 10,即读取速度比快 10 倍!对于 GB 大小的文件,优势可能更大。

使用 Arrow 读取少量列要快得多

接下来,我们展示更酷的东西。通常,我们可能不需要从列存储文件中读取所有的列。例如,我们可以对数据应用一些过滤器,并只选择选定的数据进行实际的内存处理。

现在,对于 CSV 文件或常规 SQL 数据库,这意味着我们从所有数据中选择特定的行。然而,对于列数据库,这实际上意味着选择特定的列。

让我们看看,当我们只从 Parquet 文件中读取一小部分列时,我们是否在读取速度方面增加了优势。这是我们分析的结果,

当我们读取很小一部分列时,比如说< 10 out of 100, the reading speed ratio becomes as large as > 50,即**,与常规的 Pandas CSV 文件读取**相比,我们获得了 50 倍的加速。对于大部分列,加速逐渐减弱,并稳定在一个稳定的值。

当我们只从 Parquet 文件中读取一小部分列时,我们在读取速度方面增加了优势

PyArrow(拼花)读取速度随文件的稀疏性而变化

接下来,我们看看稀疏性对 Parquet 文件读取速度的影响。在许多情况下,数据可能非常稀疏,即没有记录任何值。这在传感器驱动的数据分析中很常见,例如,各种传感器以不同的频率和间隔记录数据,并且数据矩阵的大部分被 NaN 值填充。

在我们的分析中,我们人为地将 Numpy NaN 值注入到一个固定大小的文件中,以 Parquet 格式保存它们,并使用 PyArrow 读取它们。结果如下所示。显然,稀疏文件被 PyArrow 读取的速度要比密集数据文件快得多。根据我们可能遇到的数据类型,这种行为可以为我们所用。

摘要

在本文中,我们重点分析了 Pandas/CSV 和 Apache Arrow/Parquet 组合的阅读速度。

我们展示了 Apache Arrow 如何在读取速度上比 Pandas CSV 有显著优势,以及这如何随着数据集的大小而变化。

我们还展示了对于这种类型的面向列的文件格式,读取一小部分列本来就更快。

最后,我们还通过 Apache 箭头展示了稀疏性对读取速度的影响。越稀疏的文件读取速度越快。

喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果你使用下面的链接, ,我会收到你的一部分会员费,而不会对你产生额外的费用

https://medium.com/@tirthajyoti/membership

特征选择如何提升高维数据的性能

原文:https://towardsdatascience.com/how-feature-selection-can-boost-the-performance-of-high-dimensional-data-720f617bb2f7?source=collection_archive---------31-----------------------

选择最佳性能特征的降维基本指南

图片由格尔德·奥特曼来自皮克斯拜

特征选择是端到端数据科学模型开发管道的重要组成部分。数据科学家需要特别关注用于训练健壮的数据科学模型的功能集。数据越多,模型越健壮,但这适用于实例的数量,而不适用于特征的数量。

原始数据集包含许多需要从训练数据集中排除的冗余要素。对文本特征进行矢量化后,模型的维数增加了很多。处理高维数据集会导致维数灾难的问题。有多种技术可以降低数据集的维度,或者只选择对给定问题陈述表现最佳的最佳特征集。

在我之前的一篇文章中,我讨论了 7 种选择最佳性能特性的技巧。

在本文中,我们将讨论如何在一行 Python 代码中使用统计技术来选择性能最佳的特性。

想法:

Scikit-learn 带有一个**feature_selection**模块,提供各种功能来执行特性选择。一些特征选择功能是:

  • 【SelectFromModel】:基于权重重要性选择特征的元变换器。
  • Select kbest:根据评分函数的 k 个最高分选择特征。
  • Select percentile:根据得分函数中最高分的百分位数选择特征。

还有很多。

**SelectKBest****SelectPercentile** 选择重要特征的原理是一样的,但是**SelectKBest** 取输入参数,如顶部特征的数量来选择,而**SelectPercentile**取特征的百分位数来保留。

用法:

**SelectKBest****SelectPercentile** 根据要保留的特征的数量或百分比选择性能最佳的特征。使用诸如卡方或任何其他统计测试的评分函数来计算表现最佳的特征。

卡方函数是一种统计技术,用于计算具有非负特征值的独立要素与目标类之间的卡方得分。现在可以使用**SelectKBest****SelectPercentile** 功能使用卡方得分来选择顶级特征。

我将使用一个带有二进制目标类的样本文本数据集。使用 Tf-Idf 矢量器将文本特征矢量化成具有 21,156 个特征的稀疏矩阵。

我们可以使用**SelectKBest****SelectPercentile** 函数降低稀疏矩阵的维数,使用**chi2**作为评分函数。

(作者代码)

使用百分位参数为 10 的**SelectPercentile** 函数拟合具有 21,156 个特征的 Tf-Idf 矢量化数据后,特征的数量减少到 2,115 个特征。

现在的问题是,如果我们使用上面讨论的技术降低数据的维度,我们是否必须对模型的性能做出妥协。我们来比较一下同一个机器学习模型在不同百分位值(特征选择后的特征数)下的性能。

(图片由作者提供),在具有不同数量的特征的特征选择管道之后,数据集的模型性能图。

从上面的图中,我们可以观察到,对于 7,500 个特征之后的数量,我们得到了几乎相似的性能指标(AUC-ROC 得分、精确度和召回率)。对于近 5 到 10 个减少的特征,我们获得了高精度和 AUC-ROC 分数(在图中的黑框中突出显示)。

使用管道自动选择特征:

人们可以在端到端的模型开发管道中实现特征选择组件,以自动化特征选择工作流。

(作者代码)

结论:

特性选择是 scikit-learn 包中的一个方便的函数,它可以在一行 Python 代码中执行特性选择。也可以改变评分函数(chi2 测试)作为**SelectKBest****SelectPercentile** 函数的参数。

可以对 scikit-learn 管道实现特性选择功能,以自动化特性选择工作流程。

参考资料:

[1] Scikit-learn 文档:https://sci kit-learn . org/stable/modules/feature _ selection . html

喜欢这篇文章吗?成为 中等会员 继续无限制学习。如果你使用下面的链接,我会收到你的一小部分会员费,不需要你额外付费。

https://satyam-kumar.medium.com/membership

感谢您的阅读

傅立叶变换如何加速 CNN 的训练

原文:https://towardsdatascience.com/how-fourier-transform-speeds-up-training-cnns-30bedfdf70f6?source=collection_archive---------15-----------------------

深度学习实践者如何受益于 200 年前的一项发现

介绍

如果你学过泰勒级数,你就会明白用一个有限的简单项级数来逼近一个复杂函数是多么有用。傅立叶级数是将一般函数分解为正弦波叠加(振幅/时间→安培/频率)的另一个例子,这使其特别适合物理时间序列、信号处理和其他波形数据。

尽管图像看起来不完全像“波形”,但傅立叶变换仍然在深度学习最有价值的创造之一——卷积神经网络中找到了重要的应用。

定义

考虑一个复杂的 2π周期函数 f(x ),其中 f(x+2π)=f(x ),我们的目标是将其分解为周期正弦曲线的总和,同时保持 f 的周期性,这是信号数据的一个关键特征。我们知道 cos x 的周期为 2π,但类似于所有功率的单项式如何以不同的位移和幅度组合在一起,我们可以对不同周期和幅度的正弦项进行同样的处理。具体来说,我们将对以下形式进行加权求和

其中每个正弦波的周期为 2π/n,失调为δn,傅里叶分析的目标是发现这些系数。要深入探究为什么它会收敛,请点击这里查看我的完整报告(https://michaelsuntech.files.wordpress.com/2020/11/wim.pdf)。

探测

给定一个在有限区间[t1,T2]上的复杂周期函数 g,它可以表示一个(周期)噪声信号,傅立叶级数理论允许我们把它分解成有限 N 项的和,其形式为

然而,每个“纯”信号都有固定的幅度、偏移和频率,分别由 a_n、δ_n 和 n 得出,n 越高,频率越高。

g 在[-π,π]上的傅里叶变换,定义为

其中 f 代表频率,在分解产生高振幅的频率处产生强有力的尖峰。使我们能够将其应用于现实生活问题的结果是 g 和 hat(g)之间的双射,这使我们能够对 hat(g)进行手术,并仍然恢复原始 g,这在上下文中可能是从歌曲中编辑出单个频道。这个的时间复杂度是多少?

实际上,g 将以固定的采样率产生,并产生一个矢量

离散傅立叶变换是

这可以通过矩阵乘法 hat(g)(x)=Wx 来简洁地概括,使得

在实践中,执行矩阵乘法具有复杂性 O(N ) ,这是一个昂贵的过程,但它可以通过快速傅立叶变换极大地简化为 O(N log N) (传说它首先由高斯发现用于心算,但直到一百年后才发表)。我来演示一下!设 N = 2N’。假设我们想计算

观察

我们分开的地方

事实上,在所有 k 上的这个操作可以以矩阵块的形式计算,

在哪里

因此

让上面写为

我们确实可以证明,WLOG 0≤ i ≤N'-1

回想一下对角矩阵——向量乘法只取 O(N),所以将 T(N)表示为计算 W_N g(x)所需的计算量,我们可以建立递归关系 T(N)= O(N)+2T(N’)+O(N)= O(N)+2T(N’),通过主定理,这足以得出 T(N)=O(N log N) 。FFT 运算的一个惊人特征是它的几乎同义的逆运算,

我们可以展示

凭借事实 w^=1,因此

w^=1 当且仅当 l=k,所有其他 l 的和为 0,这是傅立叶级数中的一个常见技巧。表示这种相反

作为“傅立叶算子”,我们有

这里还有一些我们可以用傅立叶算子做的技巧。

等同于

其中(Rx)k=x。现在,我们将看到 FFT 在机器学习中的应用。如果我们让∙,*表示卷积

当表示 a=F_N(x),b=F_N(y)时,我们有

这个操作,看起来只是一个噱头,显示了 x 和 y 在傅立叶域内的点积是 x 和 y 的傅立叶域的卷积。毫不奇怪,当 x,y∈ℝ^{N× N}表示样本图像和滤波器以执行卷积步骤 x*y 时,这一属性在 2D 中也成立,这是训练 CNN 的重要计算步骤,CNN 是深度学习最新进展背后的模型架构。

图 1:花费 O(N K),一个昂贵的操作(来源)

在 2D,傅立叶运算的开销为 O(N log N )=O(N log N)。通常,滤波器 w∈ℝ^K× K 是图像上的一个滑动窗口,总共 N (K,k)个卷积,花费 O(N K)。然而,通过将 w 填充为大小 N× N 并计算

图 2:前后(编辑自来源

其中∙的成本为 O(N),整个操作现在只需要 O(N log N)!

结论

得益于此,机器学习研究人员报告了训练时间的显著减少( 55s→ 0.4s???)具有改进的 O(N K )→ O(N log N)卷积步骤,我们要感谢大约 200 年前的傅立叶发现。

流行的疯狂动物城迷因

参考

https://michaelsuntech.files.wordpress.com/2020/11/wim.pdf

【https://sites.math.washington.edu/~morrow/464_12/fft.pdf

https://arxiv.org/pdf/2003.12621.pdf

https://predictive programmer . com/namespace-convolatile-neural-network-architectures-1/(图 1)

https://docs.gimp.org/2.8/en/plug-in-convmatrix.html(图二)

甘如何学习:一个简单的介绍

原文:https://towardsdatascience.com/how-gans-learn-a-simple-introduction-6d21081773bd?source=collection_archive---------35-----------------------

深度学习基础

生成对抗网络的学习、理论和应用

作者图片

简介

在我以前的文章中,我谈到了一般的生成方法,以及是什么让生成器网络如此强大。在这篇文章中,我想更深入地研究生成性对抗网络(GANs)的内部运作。为了确保您完全理解它们,我将浏览 GANs 论文的原始伪代码并解释 GANs 的损失函数,然后我将向您展示我自己实现的结果。最后,我将解释如何通过 DCGANs 论文的建议来改进 GANs,这是该研究领域的一篇关键论文。

甘斯人如何学习

生成方法是一个非常强大的工具,可以用来解决许多问题。他们的目标是生成可能属于训练数据集的新数据样本。生成方法可以通过两种方式做到这一点,通过学习数据空间的近似分布,然后从中采样,或者通过学习生成可能属于该数据空间的样本(避免近似数据分布的步骤)。

作者图片

上面你可以看到 GANs 的架构图。GANs 由两个网络(生成器和鉴别器)组成,这两个网络本质上是相互竞争的;这两个网络有对立的目标。

生成器试图最大化欺骗鉴别器的概率,使其认为生成的图像是真实的。鉴别器的目标是正确地将真实数据分类为真实的,将生成的数据分类为假的。这些目标用网络的损失函数来表示,这些损失函数将在训练期间被优化。

在 GANs 中,发电机的损失函数最小化,而鉴别器的损失函数最大化。生成器试图最大化鉴别器的误报样本数,鉴别器试图最大化其分类精度。

伪代码由伊恩·j·古德菲勒等人编写, 生成对抗网络【1】

在上面的伪代码中,对于每个时期,对于每个批次,计算鉴别器和发生器的梯度。鉴别器的损失由真实数据集的正确分类样本数的对数和虚假数据集的正确分类样本数组成。我们希望最大化这一点。生成器的损失函数由鉴别器正确分类假图像的次数组成,我们希望最小化这一点。

目标自然是相反的,因此用于训练网络的梯度也是如此。这可能会成为一个问题,我将在后面讨论这个问题。

一旦训练结束,发电机就是我们唯一关心的了。生成器能够接收随机噪声向量,然后它将输出最可能属于训练数据空间的图像。请记住,即使这有效地学习了随机变量(z)和图像数据空间之间的映射,也不能保证两个空间之间的映射是平滑的。gan 不学习数据的分布,他们学习如何生成类似于属于训练数据的样本。

应用

让我们来看一个简单 GAN 的应用。训练数据由来自 MNIST 数据集的手写数字组成。假设我需要更多的手写数字来训练其他机器学习/统计模型,那么可以使用 GANs 来尝试生成更多的数据。

作者图片

看看这个训练数据。正如你所看到的,有些数字对人类来说甚至很难读懂。机器真的很难处理非结构化数据(典型的例子:图像和文本)。计算机只看到像素值,很难教会它一个手写数字是什么排列顺序组成的。

生成随机样本

作者图片

如您所见,生成的数据看起来像手写的数字。该模型已经学习了手写数字图像中的一些模式,并由此能够生成新的数据。

我们可以在模型学习时查看生成的样本的 GIF(GIF 可能不会在 medium 应用程序上显示,所以我建议使用浏览器来查看)。

作者 GIF

生成器模型从随机权重开始,生成的图像看起来像随机噪声。随着损失函数的优化,生成器在欺骗鉴别器方面变得越来越好,最终产生的图像看起来更像手写数字,而不是随机噪声。

图像间采样

可以做的一件有趣的事情是拍摄两张生成的图像,并对它们之间的空间进行采样。这两个生成的图像具有两个相应的随机向量,这两个随机向量已经被馈送到生成器。我可以将这两个向量之间的空间离散化,本质上通过这两个向量之间的分布画一条线。然后我可以对这条线进行采样,并将这些点输入到我的生成器中。

作者图片

在这里,我看到了一个生成的“4”和一个生成的“8”之间的空间。开始的数字是左上角的“4 ”,这个数字实质上会转化为右下角的“8”。

尽管生成器不能保证在输入空间和数据空间之间产生平滑的映射(我们生成的样本不逼近密度函数),但您可以看到两幅图像之间的过渡仍然非常平滑。有趣的是,在“4”变成“8”之前,它首先转变为“9”,这意味着在数据空间中,数字“9”位于“4”和“8”之间。

作者图片

这是另一个例子,这次数字“6”变成了“3”。您可以简单地看到生成的样本看起来像一个“5”。

甘斯的弊端

作者图片

GANs 的一个主要缺点是,如前所述,鉴别器和发生器具有相反的目标,因此具有相反的符号梯度。可以看出,当优化 GAN 时,将不会达到最小值。相反,优化算法将在鞍点结束。

GANs 的另一个常见问题是,在训练这些模型时,鉴别器很容易压倒生成器。鉴别器只是变得太好太快,生成器无法学习如何生成欺骗鉴别器的图像。直觉上这是有意义的,分类任务总是比生成器学习如何生成新样本的任务更容易。

DCGANs 和消失渐变

深度卷积 gan 是解决这一问题的一种方法。第一个主要建议是使用 LeakyReLU 作为鉴别器的激活函数。这有助于解决渐变消失的问题。当训练任何种类的神经网络时,都会出现消失梯度问题,如果梯度太小,它们可能会“陷入”这种消失状态,并且由于它们接近于零,因此很难在训练中使用它们。LeakyReLU 通过始终更新模型的权重来减少这种情况的发生,即使激活很小。

作者图片

DCGANs 论文中的其他技巧已经成为训练神经网络时的常见做法,例如在卷积层之后使用批量归一化层,以及避免使用过多的密集层,而使用卷积层。

结论

在这篇文章中,我介绍了 GANs 如何工作以及他们如何学习的理论。然后,我展示了用 python 实现 GANs 的简单结果。最后,我强调了 GANs 的一些缺点,以及如何解决这些缺点。

支持我

希望这对你有所帮助,如果你喜欢它,你可以跟随我!

您也可以成为 中级会员 使用我的推荐链接,访问我的所有文章以及更多:https://diegounzuetaruedas.medium.com/membership

你可能喜欢的其他文章

可微发电机网络:简介

傅立叶变换:直观的可视化

参考

[1] Goodfellow,I .、Pouget-Abadie,j .、Mirza,m .、Xu,b .、Warde-Farley,d .、Ozair,s .、a .和 Bengio,y .,2014 年。生成性对抗网络。康乃尔大学https://arxiv.org/abs/1406.2661 T2。

你的宏基因组宁滨结果有多好?

原文:https://towardsdatascience.com/how-good-are-your-metagenomic-binning-results-1ebb229db5f2?source=collection_archive---------22-----------------------

实践教程

评估宏基因组宁滨结果的策略和工具

自然环境,如湖水、土壤和人体的生态位(肠道、皮肤等)。)是数万亿微生物的家园。这些微观社区是复杂多样的,我们可以通过研究它们的组成和相互作用来了解它们的影响。如果你看过我的关于软件工具用于宏基因组的无参考宁滨的文章,你可能知道在过去的几十年中有不同的方法被开发来执行宏基因组宁滨,其中你将序列放入对应于不同分类组(种、属等)的箱中。).

我们如何评价宏基因组宁滨工具产生的结果?

在这篇文章中,我将介绍一些工具和技术来评估从无参考宁滨工具获得的宁滨结果。这些工具很受欢迎,因为它们提供了识别尚未在可用参考数据库中发表的新物种的优势。

聚类分析

宏基因组宁滨工具使用不同的聚类方法,您可以使用以下流行的评估指标来评估最终的宁滨结果。

  1. 精确
  2. 回忆
  3. f1-分数
  4. 调整后的兰德指数

你可以从我的评估聚类结果中阅读更多关于如何计算这些标准的细节。

与其自己想出评估脚本,还不如用已经发布的流行软件工具和软件包来评估宏基因组宁滨的结果。让我们浏览其中的几个,并详细了解如何安装和运行它们。

琥珀

宏基因组分箱评估(AMBER)【1】是一个用来评估和比较从宏基因组基准数据集重建的基因组的软件包。AMBER 要求用户提供与宁滨结果一起入库的序列的基本事实注释。AMBER 可以接收来自不同工具的多个宁滨结果,并提供各种评估指标的可视化,包括完整性、纯度、F1 值、ARI、污染(可视为与纯度相反)、准确度和分级分数。

琥珀怎么安装?

琥珀可以在 https://github.com/CAMI-challenge/AMBER 的GitHub 上免费获得。您可以使用以下命令下载代码。

git clone [https://github.com/CAMI-challenge/AMBER.git](https://github.com/CAMI-challenge/AMBER.git)

你也可以按照https://github.com/CAMI-challenge/AMBER#steps提供的步骤安装 AMBER。

如何经营琥珀?

在运行 amber 之前,你必须根据 CAMI 宁滨生物箱格式格式化地面实况注释和宁滨结果。你可以按照https://github.com/CAMI-challenge/AMBER#input的指示格式化你的结果。

例如,如果您在 FASTA 文件中有每个箱的宁滨结果,那么您可以运行以下命令来根据 CAMI 宁滨生物箱格式进行格式化。

AMBER/src/utils/convert_fasta_bins_to_biobox_format.py *.fa -o my_bins.tsv

准备好文件后,您可以运行 AMBER。

amber.py -g amber_ground_truth_1000_bins.tsv maxbin2_bins.tsv metawatt_bins.tsv concoct_bins.tsv solidbin_bins.tsv busybee_bins.tsv -l "MaxBin2, MetaWatt, CONCOCT, SolidBin, BusyBee Web" -o AMBER_Result

注意:您可以在普通的台式机上运行 AMBER,内存为 8–16 GB,没有任何问题。

琥珀色输出

在您的输出文件夹AMBER_Result中,您可以找到评估结果的最终报告(index.html),如图 1 所示,对应于我们之前使用的示例命令。

图 1:琥珀色结果示例(作者截图)

如果你点击Plots标签,你可以看到不同的图,如图 2 所示。

图 axample 琥珀色结果的不同图(作者截图)

CheckM

CheckM [ 2 ]是一种用于评估从宏基因组学分析中回收的基因组质量的工具。与 AMBER 不同,CheckM 不需要任何基础事实注释作为输入,因此可以用于分析真实世界的宏基因组数据,其中实际的分类组成未知。CheckM 使用单拷贝标记基因来评估宁滨结果的完整性、污染性和异质性。

如何安装 CheckM?

您可以遵循 CheckM wiki(https://github.com/Ecogenomics/CheckM/wiki)上为安装提供的步骤。

你还必须从 https://data.ace.uq.edu.au/public/CheckM_databases/[下载 CheckM 数据库。](https://data.ace.uq.edu.au/public/CheckM_databases/)

成功安装 CheckM 后,您可以在宁滨结果中提供 bin 的 FASTA 文件,并按如下方式运行 CheckM。

checkm lineage_wf -t 56 -x fasta path/to/bins path/to/outputcheckm analyze -t 56 -x fasta checkm_data_2015_01_16/hmms/phylo.hmm path/to/bins path/to/outputcheckm qa -t 56 --out_format 1 -f path/to/output/result.txt checkm_data_2015_01_16/hmms/phylo.hmm path/to/output

CheckM 输出

在您的输出文件夹中,可以在文件result.txt中找到 CheckM 输出。这个文件将如图 3 所示。

图 3:示例 CheckM 输出(作者截图)

注意:根据我在大型宏基因组数据集上运行 CheckM 的经验,我发现在一台 16 GB 内存的普通桌面计算机上运行 CheckM 是一个挑战。所以我建议把它安装在至少有 64 GB 内存的机器上。

GTDB-Tk

基因组分类数据库工具包(GTDB-Tk) [ 3 ]允许用户获得细菌和古细菌基因组的分类任务。GTDB-Tk 可用于获得基于每个箱中最丰富的分类组(达到物种水平)的宁滨结果的分类注释。与 CheckM 类似,您只需要向 GTDB-Tk 提供 bin。

如何安装 GTDB-Tk?

https://github.com/Ecogenomics/GTDBTk[的 GitHub 上免费提供 GTDB-Tk。你可以遵循](https://github.com/Ecogenomics/GTDBTk)https://ecogenomics.github.io/GTDBTk/的维基中提供的安装步骤。

如何经营 GTDB-Tk?

我将使用classify_wf命令将每个 bin 分类到一个分类组。您可以从https://eco genomics . github . io/GTDBTk/commands/classify _ wf . html中了解有关该命令的更多信息。

gtdbtk classify_wf --genome_dir path/to/bins --extension fasta --cpus 56 --out_dir path/to/output

注意:安装和构建 GTDB 数据库需要大量内存。根据我安装 GTDB-Tk 并在大型宏基因组数据集上运行它的经验,我建议将其安装在至少有 256 GB 内存的服务器上。

GTDB-传统知识产出

成功运行classify_wf命令后,您将获得一个.tsv文件,其中包含每个 bin 的分类注释。

最后的想法

AMBER、CheckM 和 GTDB-Tk 是宏基因组学分析中用来评估宁滨结果有多好的一些流行工具。AMBER 需要基础事实注释来进行评估,而 CheckM 和 GTDB-Tk 不需要这样的基础事实注释。琥珀更适合模拟或模仿数据集,其中地面真相是可用的。然而,CheckM 和 GTDB-Tk 可以用来评估模拟和真实数据集。

希望这篇文章对你有用,尤其是对那些刚接触宏基因组学的生物信息学领域的人。您可以试用这些工具并观察它们的输出。

感谢您的阅读!

干杯!

参考

[1]迈耶等人。铝,琥珀:评估宏基因组 BinnERs(https://doi.org/10.1093/gigascience/giy069)

[2]帕克斯等人阿尔·切克姆:评估从分离物、单细胞和宏基因组中回收的微生物基因组的质量(【https://doi.org/10.1101/gr.186072.114】T2

[3]肖梅尔等人。阿尔,GTDB-Tk:用基因组分类数据库对基因组进行分类的工具包(【https://doi.org/10.1093/bioinformatics/btz848】T4)

你可能也会发现这些文章很有趣。

https://medium.com/computational-biology/software-tools-for-reference-free-binning-of-metagenomes-f2d26b27eef2 https://medium.com/computational-biology/metagenomics-who-is-there-and-what-are-they-doing-9ea71f03eeee https://medium.com/computational-biology/marker-genes-and-gene-prediction-of-bacteria-5fa4cb7802f3

你的 NLP 模型到底有多好?

原文:https://towardsdatascience.com/how-good-is-your-nlp-model-really-b5ef2c0857ed?source=collection_archive---------36-----------------------

如何评价亚马逊 SageMaker 为拥抱脸的变形金刚模型处理工作的 NLP 模型

安托万·道特里在 Unsplash 上拍摄的照片

这是怎么回事?

NLP 项目(或任何 ML 项目,就此而言)的管道由几个步骤组成,包括数据处理、模型训练和部署。在模型培训和部署之间应该涉及的另一个步骤是模型评估。只有在评估了新训练的模型之后,我们才应该考虑下一步,这可能涉及注册和/或部署模型,或者,如果模型性能很差,则使用不同的/更多的数据对其进行重新训练:

NLP 项目管道(图片由作者提供)

亚马逊 SageMaker 最近推出了拥抱脸处理作业,这是专门为拥抱脸的变形金刚模型设计和优化的。加工作业可用于各种任务:数据预处理或后处理、特征工程、数据验证和模型评估。

在这篇博文中,我们将深入探讨列表中的最后一项任务——模型评估。我们将了解模型评估的挑战,以及我们如何利用 SageMaker 处理作业来克服这些挑战。

为什么这很重要?

NLP 模型评估可能是资源密集型的,尤其是对于从 GPU 加速中受益匪浅的 Transformer 模型。因此,如果我们在没有 GPU 的机器上运行,评估可能需要几个小时,尤其是在测试数据集很大的情况下。事实上,我们将确切地看到在我的笔记本电脑(没有 GPU)上进行模型评估需要多长时间。相比之下,我们将看到,我们可以加快这一进程高达 267(!)次通过使用 SageMaker 的拥抱脸处理作业。

这些处理作业不仅通过使用按需计算资源实现了更快的模型评估,而且 SageMaker 生态系统中的紧密集成也允许将这一步骤无缝集成到端到端的 NLP 管道中。

先决条件

本教程的 Github repo 可以在这里找到。它包含一个用于与 SageMaker 处理作业交互的笔记本,以及两个评估脚本—一个用于评估本地机器(如个人笔记本电脑)上的模型,另一个用于 SageMaker 处理作业。

我们还需要一个经过训练的 Transformer 模型和一个相应的测试数据集。理想情况下,您可以使用自己的模型和测试数据,但是如果您没有现成的模型和测试数据,您也可以在 Github repo 中找到模型和测试数据。

(回购中的模型是一个基于 DistilBERT 的二元分类模型,已经过微调,可以检测电影评论中的正面和负面情绪。数据集格式为 HuggingFace 的数据集 。)

如何使用培训师 API 评估变压器模型

拥抱脸的教练 API 通常用于训练模型,但它也使评估一个已经训练好的模型变得非常简单和直接。我们只需要用我们想要评估的模型调用训练器 API,指定测试数据,以及我们想要计算的度量的定义来评估模型:

局部评估模型

通过使用 Github repo 中的脚本evaluate-local-HF . py,我们现在可以在任何我们想要的地方评估模型。事实上,我在我的笔记本电脑(没有 GPU)上运行了这个脚本,看看需要多长时间。但是:测试数据由大约 15K 条记录组成,在 NLP 项目中的记录数量很容易达到数百万条的今天,这实际上并不算多。然而,它仍然足以让我的笔记本电脑忙碌几个小时。因此,我没有使用整个测试数据集,而是将其精简到只有 100 条记录:

100 条记录的运行时间(图片由作者提供)

结果表明,处理 100 条记录大约需要 68 秒,每批 8 条记录大约需要 5.3 秒(或每条记录 0.66 秒)。将此推断到 15K 记录的整个数据集意味着模型评估将在我的笔记本电脑上花费大约 3 小时。

Sagemaker 为拥抱脸处理作业

SageMaker 处理允许我们按需配置 GPU 机器,并且只在评估模型所需的时间内配置。为此,我们使用稍微修改的评估脚本,它可以与处理作业交互。这一次,我们将对整个测试数据集进行评估,即大约 15K 条记录。

为了设置模型评估,我们使用 SageMaker Python SDK 来设置处理作业:

我们还需要告诉处理器在哪里可以找到模型和测试数据:

然后我们可以开始模型评估:

一旦运行完成,我们可以在 S3 的指定输出文件夹中的 JSON 文件中找到评估结果(在我们的例子中,该文件将被称为 evaluation.json ):

对 S3 的评价结果(图片由作者提供)

打开这个文件为我们提供了我们在 compute_metrics() 方法中指定的评估指标,以及来自处理作业的一些其他指标:

评估指标(图片由作者提供)

事实上,评估结果告诉我们,处理作业每秒运行 177 个样本。如果您还记得,我的笔记本电脑每秒运行 0.66 个样本,这意味着处理工作比我的笔记本电脑快 267 倍!我们还可以通过查看处理作业的日志来确认这一点:

SageMaker 上的运行时间(图片由作者提供)

正如我们所看到的,在一个大约有 15K 记录的数据集上评估该模型只需要 85 秒的处理工作。

结论

在这篇博文中,我们学习了如何使用 Amazon SageMaker 处理作业来评估基于 Hugging Face 的 Transformer 模型的 NLP 模型。我们看到,在 SageMaker 上按需使用 GPU 计算基础设施非常简单,并且显著加快了模型评估的速度。

下一步可能是捕获整个 NLP 项目生命周期,包括端到端管道中的模型评估,并将其自动化,从而为 NLP 任务构建可扩展的 CI/CD 管道。

格陵兰有多绿?

原文:https://towardsdatascience.com/how-green-is-greenland-cabbe516de04?source=collection_archive---------56-----------------------

我花了一天时间学习使用 Python 进行卫星图像分析的基础知识

我想在一天内完成的事情:

1.了解如何从免费资源下载数据

2.哪些 python 库可用于卫星影像分析

3.熟悉词汇

4.对下载的数据运行真实场景。在这种情况下,我们将使用 NDVI 检查格陵兰岛的绿色植被。

我一直在与一个潜在的油气能源客户互动,我为他开发了一个关于在石油钻井现场使用声音数据的概念验证。下周我还有一次会议,会上将讨论卫星图像数据的使用案例。因此,我决定今天花点时间快速学习 GIS 数据分析的基础知识,这样我就不会在下周的会议中触及皮毛。

美国地质勘探局在 Unsplash 上拍摄的照片

当我想到卫星图像分析时,一系列复杂的预建软件浮现在我的脑海中,需要一些培训研讨会才能掌握,但我只想投资一天,不想花任何不必要的钱。于是,我调用了我的两个朋友——鸭鸭 Go + Python。

下载数据

有许多免费资源,人们可以很容易地从那里下载数据。我试过 https://scihub.copernicus.eu/dhus/的[和 https://earthexplorer.usgs.gov/的](https://scihub.copernicus.eu/dhus/#/home)。

在这两个网站中创建您的帐户,并准备好下载数据。这两种工具的基本原理是相同的:

  1. 在您想要分析的地理区域上创建您选择的多边形。
  2. 选择需要感测数据的日期间隔。
  3. 根据云量进一步过滤(低于 10%是理想的)
  4. 选择卫星——我用的是 Sentinel2

与其让我喋喋不休地谈论如何下载数据,不如看看这个 YouTube 视频,她在引导你开始方面做得很好。

作者提供的图片(哥白尼中心,我只选择了 Sentinel 2 作为数据并过滤了日期)

在我看来,Copernicus Open Access Hub 在下载数据方面要快得多,因为地球探测器即使下载一个 1GB 的小文件也要花很长时间(肯定与他们的 FTP 设置有关)。

一旦你下载了数据并解压后,你会看到。蒂芙还是。JP2 的文件在你的文件夹里。这些是您将使用的主要文件。

作者图片

上面是下载数据的文件夹树,R10m、R20m、R60m 是文件夹,其中. jp2 和。tif/。tiff 文件将被定位。(请注意,我已经在这里将文件夹重命名为 Nuuk,将被下载的文件夹将有一些长的字母数字名称,指示卫星、观看周期等)

稍微讲一下哨兵-2

Sentinel 2 由欧洲航天局于 2015 年发射,主要关注植被、土地覆盖和环境监测。

Sentinel-2 的数据是多光谱的,有可见光、近红外(NIR)和短波红外光谱(SWIR)的 13 个波段。Sentinel-2 数据是免费的,刷新频率很高,每 5 天刷新一次,这使它成为环境相关学术工作的理想和最新资源。

  • 10 米处的 4 个波段:蓝、绿、红和近红外。
  • 20 米处的 6 个波段:4 个窄带用于植被表征(705 纳米、740 纳米、783 纳米和 865 纳米),2 个较大的 SWIR 波段(1,610 纳米和 2,190 纳米)用于雪/冰/云检测或植被水分胁迫评估等应用。
  • 60 米处的 3 个波段:主要用于云筛选和大气校正(443 纳米用于气溶胶,945 纳米用于水蒸气,1375 纳米用于卷云探测)。

来源-美国地质勘探局(https://custom-scripts . sentinel-hub . com/custom-scripts/sentinel-2/bands/)

问题陈述

丹麦的自治领土格陵兰岛大部分时间都被冰覆盖着;大多数人口居住在首都努克附近。在夏季,一些植物以绿色覆盖物的形式出现。在这项工作中, 我们将选取整个努克地区,分析夏季的绿色植被。

写入

一旦我们有了数据,我们需要一些可以帮助我们阅读它们的库。Python 提供了一些不错的库来帮助完成这项工作: Earthpy、Rasterio、ArcGIS、Satpy、Fiona、GDAL 等等

在本案例研究中,我们将使用 rasterio 和 earthpy。

#Importsimport rasterio
from rasterio import plot
%matplotlib inline
import matplotlib.pyplot as plt
from glob import glob
import numpy as np
import earthpy.plot as ep
import earthpy.spatial as es

给出 IMG 数据/R60m 文件夹的路径,并使用 glob 读取文件。

path = "Nuuk/Granule/Nuuk/IMG_DATA/R60m/"
bands = glob(path+"/*B?*.jp2")
bands.sort()
bands
len(bands) # This will yeild 11 in this case.

按作者分类的图片(Sentinel 数据中所有 jp2 文件的列表)

Earthpy 提供了一些快速技巧,可以帮助我们可视化数据中的所有波段。

array_stack, meta_data = es.stack(bands, nodata=-9999)titles = ['Aerosol', 'Blue', 'Green', 'Red', 'Vegetation Red Edge_0.70', 'Vegetation Red Edge_0.74','Vegetation Red Edge_0.78', 'Water Vapour', 'SWIR_1.6', 'SWIR_2.1', 'NIR']

上面的“标题”列表与波段在我们的波段对象中出现的顺序一致。

让我们画出所有的哨兵波段

ep.plot_bands(array_stack, cmap = "terrain", title = titles)

按作者分类的图像(数据中出现的所有 11 个波段)

这里不同的图像肯定是有区别的,有几个比较亮,有几个比较暗。

条带包含红色、蓝色、绿色数据;我们可以创建一个 RGB 图像来看看它是什么样子的。

ep.plot_rgb(array_stack, rgb=(3, 2, 1), stretch=True, str_clip=0.2, figsize=(10, 16))

Nuuk 的 RGB(图片由作者提供)

band2, band3, band4 = array_stack[1:4]def plot_mult_axis():
    fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(12, 4))
    plot.show(band2, ax=ax1, cmap='Blues')
    plot.show(band3, ax=ax2, cmap='Greens')
    plot.show(band4, ax=ax3, cmap='Reds')
    fig.tight_layout()plot_mult_axis()

b、G 和 R 绘制在单个轴上。(R 看起来像橙色)图片作者

NDVI ( 归一化差异植被指数)

NDVI 是一种基于植物如何反射不同光波的植物健康指标。这是通过测量植物强烈反射的近红外线和吸收的红光之间的差异来实现的。NDVI 的范围总是从-1 到+1。

由于植物的表面反射特性,NDVI 度量可以用于识别地形中的绿色斑块。

NDVI 接近 1 可能意味着密集的植被,而-1 可能意味着水,冰或一些噪音。

我们数据中的波段 4 对应于红色,波段 8 对应于 NIR。

band4 = rasterio.open(path+"T22WDS_20200831T150809_B04_60m.jp2")
band8 = rasterio.open(path+"T22WDS_20200831T150809_B8A_60m.jp2")red = band4.read(1).astype('float64')
nir = band8.read(1).astype('float64')
ndvi=np.where(
    (nir+red)==0.,
    0,
    (nir-red)/(nir+red))

让我们创建一个空的 tiff 图像,并将 NDVI 数据保存在其中。

ndviImage = rasterio.open('ndvi.tiff','w',driver='Gtiff',
                          width=band4.width,
                          height = band4.height,
                          count=1, crs=band4.crs,
                          transform=band4.transform,
                          dtype='float64')
ndviImage.write(ndvi,1)
ndviImage.close()

是时候分析 NDVI 的形象了

ndvi = rasterio.open('ndvi.tiff')
fig = plt.figure(figsize=(15,10))
plot.show(ndvi, cmap="RdYlGn")

作者图片(NDVI 为格陵兰首都努克创作)

这看起来不错。这些照片是在 7 月拍摄的,当时努克周围的冰正在融化,黄色的是海洋,红色的是内海或残留的冰——这是正确的描述。

同样,我们可以查看修正的归一化差异水指数。

 MNDWI = (SWIR - GREEN)/(SWIR + GREEN)

它可以像 NDVI 一样容易地计算出来。

band3 = rasterio.open(path+"T22WDS_20200831T150809_B03_60m.jp2")
band11 = rasterio.open(path+"T22WDS_20200831T150809_B11_60m.jp2")green = band3.read(1).astype('float64')
swir = band11.read(1).astype('float64')
mndwi=np.where(
    (green+swir)==0.,
    0,
    (swir-green)/(swir+green))#Create an empty TFF file and write the data of mndwi object to itmndwi_Image = rasterio.open('mndwi.tiff','w',driver='Gtiff',
                          width=band3.width,
                          height = band3.height,
                          count=1, crs=band3.crs,
                          transform=band3.transform,
                          dtype='float64')
mndwi_Image.write(mndwi,1)
mndwi_Image.close()# Open the filemndwi = rasterio.open('mndwi.tiff')
fig = plt.figure(figsize=(15,10))
plot.show(mndwi)

MNDWI for Nuuk(图片由作者提供)

图片左边的海水是绿色的,内陆的水颜色较深,用紫色表示。

许多其他指数可以计算,如粘土指数,亚铁指数,水分指数等;我没有计算它们,因为它们不会给这个博客增加任何价值。

这项工作的数据和代码可以在我的 Github 这里获得。

格陵兰看起来很绿

我开始分析的所有问题都已经得到了回答。

1。了解如何从免费资源下载数据

有很多方法可以下载卫星图像数据,如哥白尼中心,地球探索,谷歌地球引擎等。

2。卫星影像分析有哪些 python 库可用?

如果您想使用 python,有许多独立维护的库可以帮助您入门卫星影像分析领域。我会推荐使用 Rasterio,Earthpy,GDAL 作为开始。

3。熟悉词汇

每个领域都有一个学习曲线,这个领域也是如此,还有一个密集的领域,但没有一个领域像火箭科学双关语:D一样

4。对下载的数据运行真实场景。在这种情况下,我们将使用 NDVI 检查格陵兰岛的绿色植被。

在尝试了几个小时后,我找不到任何可以覆盖整个格陵兰岛的多边形,这是有意义的,因为格陵兰岛不是一个可以在一张照片中捕捉到的小岛。我发现一个多边形覆盖了整个努克和一些周边地区。这足以让我对数据分析有所了解。

我们能够进行端到端的分析,包括下载数据、读取数据、处理数据、使用数据生成我们想要的功能。

我认为上述工作的一个直接应用是测量几年来 NDVI 季节的差异,并了解冰川和冰的融化是如何为植被提供新的牧场的。在这一点上,我们已经意识到了气候变化和相关的问题,但是如果有人是一个不相信的人,并且想要自己检查一下,那么上面描述的道路将是一条合适的道路。

请让我知道任何意见和反馈。

参考资料:

https://earthobservatory.nasa.gov/features/MeasuringVegetation

Python Pandas 与 R 数据表的分组方式

原文:https://towardsdatascience.com/how-grouping-works-with-python-pandas-vs-r-data-table-bc9990bc46e0?source=collection_archive---------25-----------------------

举例说明

在 Unsplash 上特蒂亚娜·什希金娜的照片

美国不同城市的平均房价是多少?一家店不同产品组的总销售额是多少?不同公司的平均工资是多少?

只要我们有适当的数据,所有这些问题都可以通过分组操作来回答。大多数数据分析库和框架都实现了一个函数来执行这样的操作。

在本文中,我们将比较两个最流行的数据分析库在涉及分组的任务方面的差异。第一个是 Python 熊猫,第二个是 R 数据表。

我们将使用 Kaggle 上提供的墨尔本房屋数据集作为示例。我们首先导入库并读取数据集。

# pandas
import pandas as pd
melb = pd.read_csv("/content/melb_data.csv")# data.table
library(data.table)
melb <- fread("datasets/melb_data.csv")

前 5 行数据(图片由作者提供)

让我们从找到每种房屋类型的平均房间数开始。Pandas 提供了groupby函数,用于对观察值(即行)进行分组。

# pandas
melb[["Type","Rooms"]].groupby("Type").mean() Rooms
Type
h    3.405189
t    2.944260
u    2.061948

我们选择“类型”和“房间”列,并根据“类型”列对房屋(即行)进行分组。因为在 type 列中有 3 个不同的值,所以我们最终有 3 个组。最后,我们对每组应用均值函数,得到房间的平均数。

如果我们不选择列并直接应用groupby函数,Pandas 会计算所有数字列的平均值。有一个更实际的方法来解决这个问题,我们将在下面的例子中讨论。

下面是我们如何对数据表进行同样的操作:

# data.table
melb[, .(mean(Rooms)), by=Type] Type       V1
1:    h 3.405189
2:    t 2.944260
3:    u 2.061948

直觉是一样的,但语法是不同的。by参数用于选择用于分组的列。数据表可以用逗号分隔不同类型的操作。例如,如果我们需要传递一个条件来过滤行,我们把它放在方括号内的第一个逗号之前。

对于第二个示例,我们计算每个地区的平均房价,并为聚合列指定一个名称。

# pandas
melb.groupby("Regionname", as_index=False).agg(
    avg_house_price = ("Price", "mean")
)

(图片由作者提供)

这次我们使用了命名聚合,因此我们不必选择任何列。聚合的类型和要聚合的列在agg函数中指定。我们还可以为聚合列指定一个定制的名称。

as_index参数用于为组创建一个列。否则,它们将被表示为数据帧的索引。

下面是数据表版本:

# data.table
melb[, .(avg_house_price = mean(Price, na.rm = TRUE)), by=Regionname]

(图片由作者提供)

数据表语法变化不大。我们刚刚添加了na.rm参数,因为 price 列中缺少值。我们需要在计算平均值之前去掉它们。否则,所有聚合值都变成 NA。

这两个库都允许嵌套分组,因此我们可以基于多个列对观察结果进行分组。让我们找出每个地区每种类型的平均房价。

# pandas
melb.groupby(["Regionname", "Type"], as_index=False).agg(
   avg_house_price = ("Price", "mean")
)[:5]

(图片由作者提供)

我们使用一个列表将多个列传递给groupby函数。代码末尾的 5 限制了要显示的行数。

# data.table
melb[, .(avg_house_price = mean(Price, na.rm = T)), .(Regionname, Type)][1:5]

(图片由作者提供)

您可能已经注意到,我们不一定要使用by关键字。数据表的标准结构语法允许它知道哪些列用于分组。

就像我们可以按多个列分组一样,我们可以为每个组计算多个聚合。此外,它们不必是相同类型的聚合。

例如,我们可以计算每种房屋类型的平均房间数量,并计算每组中的房屋数量。

# pandas
melb.groupby("Type", as_index=False).agg(
   avg_number_of_rooms = ("Rooms", "mean"),
   number_of_houses = ("Rooms", "count")
)

(图片由作者提供)

# data.table
melb[,
     .(avg_number_of_rooms = mean(Rooms), number_of_houses = .N)
     , Type]

(图片由作者提供)

让我们以一个稍微复杂一点的例子来结束。我们首先根据条件过滤观察值(即行),然后应用分组操作。最后,我们基于聚合列对结果进行排序。

# pandas
melb[melb.Price > 1000000].groupby("Type").agg(
   avg_distance = ("Distance", "mean"),
   number_of_houses = ("Distance", "count")
).sort_values(by="avg_distance")

(图片由作者提供)

# data.table
melb[Price > 1000000,
     .(avg_distance = mean(Distance),
       number_of_houses = .N)
     , Type][order(avg_distance)]

(图片由作者提供)

过滤是预期的第一个操作。sort_valuesorder函数分别对熊猫和数据表进行排序。默认情况下,它们都按升序排序。为了按降序排序,我们可以将熊猫的参数ascending设置为 false。如果我们在列名前添加一个减号,数据表将按降序排序。

结论

根据列中不同的值或类别对观察值进行分组,然后应用一些聚合,这对探索性数据分析至关重要。

因此,数据分析和操作库提供了灵活的功能来处理这些操作。我们已经做了几个例子来演示如何用 pandas 和数据表库进行分组。

感谢您的阅读。如果您有任何反馈,请告诉我。

黑客和人工智能研究是如何联系在一起的

原文:https://towardsdatascience.com/how-hacking-and-ai-research-are-related-55427bab6543?source=collection_archive---------32-----------------------

为什么成为一名优秀的黑客马拉松参赛者会有助于研究事业

图片来自 Alex Kotliarskyi 在 Unsplash

起初,黑客马拉松和人工智能研究似乎没有什么相似之处,主要是它们都与 CS 和人工智能相关。然而,经过一年多的参与,我已经学会了使用黑客马拉松来提高我的研究技能,反之亦然(类似于多任务学习的工作方式)。虽然研究是一项真正的职业,而不是在黑客马拉松中竞争,但这两者之间有许多可移植的技能,值得强调。这两者现在基本上都成了我高中之外的生活,所以我一直在深入分析这两者是如何的相似,以及为什么我似乎如此享受这两者。

我写这篇文章的灵感来自最近的新闻。本周,宣布我入选了大联盟黑客 2021 年 50 大黑客,这是黑客马拉松社区中最成功和最有影响力的黑客的荣誉。在我的简介中,我被要求描述我未来想做什么,当我写关于研究的写作时,我意识到黑客马拉松教会了我多少可以转移到人工智能研究的技能。在这篇文章中,我将谈论两者之间共享的硬技能和软技能,以及为什么它们对成为一名成功的研究人员很重要。

我的黑客档案(图片由作者提供)

硬技能

显然,从编程的角度来看,黑客马拉松和研究分享了很多硬技能。我的大部分黑客马拉松项目都是基于 AI 的,我在团队中的角色就是构建和训练 AI 模型。因此,对于使用 PyTorch 这样的框架来说,黑客马拉松是很好的实践。在黑客马拉松中,我也有更多的机会练习数据处理和其他对研究用人工智能模型编码至关重要的技能。

一个重要的区别是,对于黑客马拉松,我经常发现自己使用 Tensorflow,因为模型要简单得多,而且不一定是高性能的。在我看来,Tensorflow 对初学者更友好,当我不必编写复杂的训练循环时,Tensorflow 的工作效率更高。然而,对于研究,需要编写高级训练循环和构建复杂的模型,因此 PyTorch 提供的多功能性和技术优势使其成为我最喜欢的 ML 框架。然而,我无法给出哪个更好的最佳分类,所以请阅读这篇文章。

正在进行的关于 PyTorch 和 Tensorflow 的争论(图片来自这里

黑客马拉松教会我的另一项硬技能是演示和写作技能。关于黑客马拉松,一个经常被忽视的事实是,获胜的关键是写一份关于它的有效报告,并正确地展示它。该项目可以是活动中技术最先进的项目,但如果你没有恰当描绘它的演示技巧,你就不会获胜。同样,对于研究来说,你所进行的研究仅仅取决于你如何展示它。在论文中,你必须做一个适当的文献综述,解释方法和所有相关术语,并以一种可理解的方式呈现结果。由于我们必须完成的时间有限,我最近的论文实际上与其中的一些问题做了斗争。虽然评论者称赞我们方法的新颖性,但因为它不是非常清晰地呈现,所以它获得了负面的评论。黑客马拉松不仅帮助我发展了面向外行人的演示技巧,也帮助我发展了面向技术裁判的演示技巧,总体上让我成为了一名更强的研究人员。

展示你的研究是研究过程的基础(图片来自此处

从硬技能的角度来看,黑客马拉松在研究方面教会我的最好的事情是人工智能如何在各种领域工作,如 NLP、机器人和音频。我第一次学习 NLP 是通过一个黑客马拉松项目,因为在一个低任务周末对代码和数据进行实验让我了解了 NLP 的基础知识,并探索了它的潜在应用。由于黑客马拉松只是一个周末,它们让你可以在一个新的领域里冒险,同时学到很多东西。上周末,我决定探索音频神经网络,在这个过程中,我阅读了许多关于人工智能音频处理的研究论文,使我能够确定这是否是我未来的潜在研究领域。黑客马拉松自由流动的特性极大地帮助了研究工作。

除了列出的这些,还有许多其他明显的硬技能是黑客马拉松和研究共享的,但这些是我认为值得注意的。然而,更重要的是黑客马拉松与研究共享的软技能。

软技能

我想讨论的第一个软技能是能够在压力下工作。黑客马拉松是为了产生压力而建立的。24-48 小时是非常少的,所以构建一个完整的原型应用程序需要惊人的效率和大量的快速思考。要成为一名伟大的黑客,你必须能够快速编码,构建 MVP,并快速从挫折中恢复。在研究中,也有必须满足的硬性期限。虽然会议提交可能需要 3-4 个月才能完成,但与完整的研究论文所需的工作量相比,这与黑客马拉松项目每周的工作量相当。因此,你还必须能够快速编码,如果你没有一个完全指定的深度学习装备,如何同时训练大量模型,并及时撰写论文。在我最初的几个研究项目中,进行黑客马拉松确实帮助了我进行时间管理,而且找到像黑客马拉松这样时间如此紧张的活动是罕见的,这意味着它对你的效率的影响是独特的。

黑客和研究都需要深夜编码来满足最后期限(图片来自 Unsplash 上的áRPád Czapp)

另一个重要的技能是能够从错误中恢复。不出所料,总会有失败和错误,但能够从这些错误中恢复是我从黑客马拉松中学到的一项巨大技能。因为某些参数设置不正确而能够重构错误编写的代码或重新训练模型是我学到的重要能力,它们在研究领域非常重要,因为运行适当的实验和创建可重复的代码需要很高的精度和注意力。它还教授团队合作和沟通,因为研究和黑客马拉松都需要你经常与他人合作。一个项目的工作总是由多人分担,为了成功,你必须是一个好的沟通者,并且知道你在团队中的角色。

然而,最重要的是,黑客马拉松帮助我培养了一个有创造力和创新精神的头脑。每周,黑客马拉松都迫使我制定一个对这个领域来说新颖的新项目,因为独特性是评判的一个重要标准。然而,这些想法通常不能是古怪的,但需要是对人们有帮助的真实解决方案,以及对当前解决方案的改进。同样,在人工智能研究中,每篇论文都提出了一种完成任务的新方法,通常是对以前工作的改进,对我来说幸运的是,黑客马拉松改变了我的思维方式,让我有望在未来的职业生涯中成为一名伟大的人工智能研究人员。

老实说,很多这些软技能可以在其他活动或工作中找到,但与黑客马拉松提供的硬 CS 和 AI 技能相结合,成为一名黑客肯定可以积极影响研究生涯。软技能是一个很好的补充。

最后的想法和我的职业规划

黑客马拉松给了我软件工程技能,一旦我进入大学,我有望在未来几年加入一个研究实验室。到目前为止,我从黑客马拉松中学到的硬技能和软技能都在我的研究生涯中帮助了我,我希望一旦我进入大学并更多地参与研究,它会继续帮助我。

我思考过的一个主要困境是,我是想去谷歌这样的研究所,去他们的人工智能或 DeepMind 实验室,还是去一所大学。看起来像谷歌或脸书这样的公司很难被雇佣,但是在计算机视觉领域,许多顶尖的突破都来自公司,我很乐意参与其中。但是,大学研究似乎与其他学科的联系更紧密,合作和影响更大,这也是需要考虑的重要因素。目前,我是斯坦福医学放射科学实验室的实习生,在那里我发表了多篇将计算机视觉技术应用于医学成像任务的论文。将我的知识应用于去噪或图像质量评估等特定任务,对其潜力和影响有了更清晰的看法,但一般计算机视觉研究所围绕的理论方法无疑吸引了我。虽然我有很多时间来决定,但我越早决定,我的职业生涯就越容易。

我梦想中的工作场所(图片来自此处

在接下来的几年里,我想把研究范围缩小到一个领域。目前,我在两个主要领域进行研究:医学成像和普通计算机视觉。根据我在这些领域的成功以及未来的机会,我认为自己会更多地参与行业研究和通用计算机视觉,因为这更吸引我。我目前的背景和兴趣表明我更适合一般的计算机视觉领域,但医学成像仍然对我有吸引力,所以如果我了解更多关于我工作的生物学背景,我想我会比现在更感兴趣。尽管如此,我对明年的大学经历感到兴奋,并希望我继续参加黑客马拉松,同时参与研究,以便我在这两方面都继续提高。如果你们对此有任何想法或建议,请告诉我!感谢阅读。

数据分析师有多幸福?分析师薪酬调查的可视化

原文:https://towardsdatascience.com/how-happy-are-data-analysts-visualization-of-analyst-salary-poll-422c1c50a027?source=collection_archive---------43-----------------------

俄语分析如何估计他们的工资率

信息技术专家之间的工资差距很大。这可以用多种因素来解释:某个人的硬技能和软技能、他们在公司中的位置、所述公司的位置等等。我们使用社交网络质疑来自俄罗斯和其他国家的数据分析,然后可视化 Power BI 中获得的信息,这使我们能够发现相关数据并做出相应的结论。

在本文中,我们关注数据可视化和结果解释,而没有相关统计计算的细节。我们还演示了通过 Power BI 中的可视化工具接收数据的可能性。

研究详情

我们准备了一份谷歌形式的调查问卷,并提供给我们的受访者。问卷的 4 个要点包含了关于他们的年净工资范围、他们自己相对于市场的工资评估、他们在公司中的位置和公司位置的问题。大约 500 名分析师参加了投票,其中大多数来自俄罗斯和独联体国家,一些来自美国、澳大利亚和马达加斯加。结果没有预期的那么明显。

可视化细节

带有可视化答案的仪表板的最终版本如图 1 所示。

图一。可视化 Power BI 中接收的数据

首先,我们在堆积柱形图中展示了年净工资(图 2)。工资范围分为七组,从低于 7,000 美元到高于 32,000 美元不等。我们还计算了净推介值(NPS ),并将其添加到该图表中。

一般来说,NPS 表明消费者向他人推荐某个组织/服务的可能性有多大[1]。在这项研究中,我们使用 NPS 作为衡量薪酬水平满意度的指标。

图二。用 NPS 趋势线显示净薪金范围的堆积柱形图

以下是受访者对其相对于市场的薪资水平的估计,分为三个级别:较低、中等和较高。漏斗图说明了一个人在公司的职位(总监、部门主管、专家)。(漏斗是一个有用而简单的工具,只需点击它就可以改变每个仓位的信息)。

图 3 堆积条形图和漏斗图显示了受访者对薪资水平及其在公司中的职位的估计。

下面的地图和柱状图显示了俄罗斯联邦公民与其他国家公民之间的比例,以及居住在首都和各地区的公民之间的比例。点击这些条,我们可以看到净工资率的比较。

图 4。显示受访者位置的地图和堆积条形图

它还显示了受访者的总数和一个链接,该链接可作为参与我们调查的邀请(仪表板的上部)。

讨论

在当前的研究中,我们询问了大约 500 名数据分析专业人士。其中 86%在俄罗斯工作,其他人在独联体国家工作。居住在各地区和首都的人口比例几乎相等:49%对 51 %。7 %担任首席执行官,22%担任不同部门的主管,其余 70%是专家。超过一半的人(57%)认为他们的净工资在劳动力市场上处于平均水平。另外 43%的人分为认为自己净收入低于平均水平(27%)和高于平均水平(16%)的人。

在我们的研究中,三个净工资范围是被引用最多的。20%的受访者年收入在 1.3 万到 1.6 万美元之间,17 %的人年收入在 9000 到 1.2 万美元之间,16%的人年收入在 0 到 8000 美元之间。值得注意的是,只有 9%的受访者年收入超过 34,000 美元。

然而,工资在 26000-36000 美元范围内的分析人员有正的 NPS。这意味着只有 20%的受访者对自己的收入水平感到满意。

看看 CEO 们,我们发现,在我们的研究中,34%的高管年薪超过 32,000 美元。他们认为自己的薪酬与市场相关,或者高于平均水平,并且对自己的薪酬水平普遍感到满意。然而,不到 1%的人认为他们的收入低于平均水平。(据统计,收入低于 2.3 万美元的人对自己的收入不满意)。下图显示了 CEO 的薪酬水平和 NPS 系数。

图 5。首席执行官年薪净额指标

就部门主管而言,他们的工资范围比首席执行官的分布更均匀,如下图所示。其中 6 %的人年收入不到 7,000 美元,14%的人处于分布曲线的中间(16,000 美元/19,000 美元),16 %的人年收入超过 34,000 美元。据 NPS 称,可以预见的是,只有最后一组人对自己的净收入感到满意。与此同时,13%的部门主管声称他们的净工资在市场上是足够的,6 %的人认为低于平均水平。

图 6。部门主管的年薪净额指标

专家组的结果与前两次的结果有很大不同。图 7 中的工资分布曲线显示,收入低于 7000 美元的分析师、收入在 9000-12000 美元的分析师和收入在 13000-16000 美元的分析师人数几乎相等。大概是 20%。12%的人年收入超过 24,000 美元。40%的人认为他们的净收入在平均水平之内,而 21%的人认为低于平均水平,10%的人认为高于平均水平。

NPS 的数据显示,年薪超过 2 万美元的专家中,有 23%对自己的薪酬水平感到满意。

图 7。专家年净工资指标。

比较在地区和首都工作的受访者,我们可以看到 34%的专家、25%的部门主管和 7%的首席执行官居住在地区。图 8 显示,净工资低于 7,000 美元的仅限于来自各地区的专家(占所有受访者的 28%)。有趣的是,NPS 指数显示,居住在地区的专家比居住在首都的专家对自己的薪酬更满意。地区分析师对高于 1.2 万美元的薪酬感到满意,而来自首都的同行对超过 2.4 万美元的收入感到满意。

图 8。首都和地区年净工资比较。

结论

我们研究的目的是发现俄罗斯联邦和独联体国家的数据分析如何估计他们的工资率。在这方面,考虑了三种不同的职位——首席执行官、部门主管和专家。一般来说,56%的受访者认为他们的工资与市场平均水平一致,28%的受访者对自己的工资不满意,因此希望赚更多的钱,而 16%的受访者认为他们的收入高于平均水平。

另一个重要的发现是,2%的首席执行官对他们的薪酬不满意,年薪不到 7,000 美元,而一些专家(4%)的年薪超过 32,000 美元,他们认为自己的收入高于平均水平。这反映了劳动力市场上 IT 专家的现状:好的 IT 专家有更高的工资,有时会超过市场上的平均水平。虽然通常会考虑多种因素,但有一些专家(不是首席执行官或部门主管)的工资可能会远远高于平均水平。

另一个普遍趋势是俄罗斯和独联体国家的资源集中化。首都和地区之间的生活水平差异很大,这项研究进一步证实了这一点。尽管地区平均净工资较低,但人们对这一比率比大都市的同行更满意,即使后者的收入更高。

所有结果都使用 Power BI 可视化。地图、条形图和漏斗图等基本的交互式工具使数据处理变得更加容易和快速。

参考文献

1.Reichheld,F. F. (2003 年)。你需要增加的一个数字。哈佛商业评论,81 年,46-54 页。

女王的策略如何影响了在线象棋的流行?

原文:https://towardsdatascience.com/how-has-the-queens-gambit-impacted-the-popularity-of-online-chess-43594efe5a98?source=collection_archive---------17-----------------------

实践教程

chess.com 新老玩家分析

由阿列克斯·福维特在 Unsplash 上拍摄的照片

源代码: GitHub

介绍

女王的棋 网飞秀描绘了国际象棋神童贝丝·哈蒙(Beth Harmon)与毒瘾抗争,征服了男性主导的国际象棋世界。众所周知,《女王的策略》在全球的成功引起了人们对国际象棋的兴趣。我自己也是受害者之一,重新受到启发,开始玩网上象棋。不可避免地,这已经滚雪球般变成了一种困扰,我在过去的一个月里在 T21 玩了 375 场快速游戏,并在我最近的生日收到了 4 本国际象棋书。这种国际象棋热的影响也蔓延到了我的社交圈,关于国际象棋的对话从独白变成了对话,几个朋友打开了他们有史以来第一次在线国际象棋游戏的大门。

这让我想知道还有多少人被女王的策略所感染,尤其是在线象棋的流行会如何反映这一点。我希望这可以通过下面的指标来识别。加入在线象棋网站的新玩家数量增加。
2。现有用户玩的游戏数量增加。

在这里,我试图用来自chess.com的数据来检验这些假设,这个互联网最大的象棋社区拥有超过 2800 万会员。

新玩家数量

《女王的策略》于 2020 年 10 月 23 日在英国上映。为了了解这对加入在线象棋的用户数量的影响,我将使用 chess.com 的API下载 10 月 23 日前后 4 个月内加入的英国玩家。为了节省时间(这里有> 200,000 名英国玩家,查询每个档案需要大约 0.5s),我已经随机选择了 5000 名英国玩家**。值得注意的是,这种方法受到在女王的策略发布后的一段时间内,用户的旗帜如何准确地反映用户的居住国的限制。**

女王的策略英国发布后(用红色虚线标出),加入 chess.com 的用户数量急剧增加。需要进一步观察才能确定,但看起来注册用户的爆炸式增长至今仍在继续。

因此,与之前相比,在《女王的策略》发布后的 4 个月内,总共有**~ 7 倍**的人加入了 chess.com!

网飞节目的上映日期因国家而异。这让我们能够探索加入 chess.com 的用户的增加是否与《女王的策略》在该特定国家的发布日期相关。基于非官方的网飞在线全球搜索,我选择了 3 个不同发布日期的国家和 1 个网飞不可用的国家:

  1. 英国:2020 年 10 月 23 日
  2. 意大利:2020 年 11 月 28 日
  3. 哥伦比亚:2021 年 1 月 12 日
  4. 中国:网飞不在

似乎还不清楚女王的策略的确切发布日期是否标志着每个国家加入的用户数量分别开始增加。也就是说,我们可以观察到,在哥伦比亚这个发布日期最近的国家,用户加入的峰值向更晚的日期转移。有趣的是,从 2020 年 10 月 23 日起**,所有 4 个国家加入 chess.com 的玩家数量都有所增加**。这可能是由于虚拟专用网和其他非官方方法的可用性,这些方法允许人们在居住国之外访问网飞的节目。中国在线国际象棋的增长率要低得多,而且似乎比其他国家更早达到稳定,这可能是因为那里存在更大的在线限制。

现有用户玩的游戏数量

尽管《女王的策略》作为一个娱乐性的电视节目受到了公众的欢迎,但它在现有的棋迷中更受欢迎。就连目前的世界冠军芒努斯·卡尔森也为它的游戏代言。

上面,我们探讨了加入在线象棋的新玩家的数量。在这里,我们转而关注现有用户如何通过女王的策略重新点燃他们对国际象棋的兴趣。为了解决这个问题,我将继续使用上面获得的 5000 名随机英国用户。为了确保这一分析不会被加入的新玩家数量的增加所混淆,我只评估了在 2020 年 9 月之前加入的用户(即,他们在女王的策略发布之前已经成为 chess.com 的一部分至少一个月)。然后,在 2020 年 9 月至 2021 年 1 月的 5 个月时间里,我将获得每个用户每月玩的游戏数量。

从 10 月份开始,每位玩家的平均游戏次数稳步上升。值得一提的是,由于这一分析没有按照时间控制(如子弹、闪电战、快速等)进行划分,这一结果有可能是因为用户转向了时间控制更快的游戏。

通过将每个用户在 5 个月内的游戏数量标准化,我调查了个人玩家是如何增加他们玩游戏的相对数量的。从 11 月到 1 月,玩家们逐渐增加了下棋的频率,这表明女王的策略已经激励现有用户玩更多的在线象棋。

甚至那些暂时离开国际象棋的人也被劝说回来。通过特别关注那些在九月或十月一场比赛都没有参加的玩家,我们可以锁定那些正在经历象棋干旱期的人群。这些玩家中超过 55%的人在 11 月到 1 月回来打了至少 10 场比赛!这表明,大多数不活跃的玩家在观看了女王的策略后,至少被赶回 chess.com 玩了几场游戏。

结论

《女王的策略》作为一部网飞电视节目已经在国际上取得了成功,现在已经在超过 25 个国家播出。在这里,我证明了该节目的发布导致了在线象棋受欢迎程度的飙升,其中既包括开始象棋之旅的新人,也包括受到激励重返在线象棋或更频繁地玩游戏的现有玩家。

尽管观察了《女王的策略》的发布和在线象棋统计数据之间的这些趋势,质疑这两者之间的因果关系还是很重要的。很可能仅仅看比赛并不能直接解释在线象棋受欢迎程度的整体提高;许多其他因素也可能在起作用。目前的 COVID 情况让许多人在家工作,有人认为在线象棋已经作为一种出口获利。此外,国际象棋本质上是一种多人游戏,用户可以通过自己的社交网络将他们新发现的兴趣传播给其他人。最后,在所分析的时间范围内,还发生了其他国际象棋事件。例如,2020 年 5 月,chess.com 举办了第一届使用流行彩带的 PogChamps 锦标赛,这很可能扩大了人们的认识,并为在线象棋赢得了吸引力。

不管起源如何,我喜欢最近国际象棋受欢迎程度的上升。除了提醒我喜欢下棋之外,在我与下棋有关的漫步中,打哈欠的次数也明显减少了。我认为,在某种程度上,这要归功于女王的策略引发了一股国际象棋热潮,这股热潮已经蔓延到了全球,包括新老玩家。

我如何在一个没有预处理的文本分类问题上达到 90%的准确率

原文:https://towardsdatascience.com/how-i-achieved-90-accuracy-on-a-text-classification-problem-with-zero-preprocessing-6acfa96e8d2e?source=collection_archive---------7-----------------------

使用 Spark NLP 充分利用 BERT 句子嵌入的能力

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

在之前的帖子中,我展示了不同的单词嵌入(GloVe,ELMo,BERT)如何用于文本分类任务。我们看到了捕捉上下文对于最大化准确性的重要性。

我们还探索了几种预处理文本以改善结果的方法。与此同时,我们想象了每一步是如何改变我们的原始文本的。

今天我们把一切都扔出窗外!我将演示如何在没有任何预处理的情况下达到 90%的分类准确率。你准备好了吗?我想保持这一个简短和甜蜜,但你可以在这里找到我的完整笔记本。

数据集

我选择使用 AG news 基准数据集。我从约翰·斯诺实验室的中恢复了训练测试测试(所有 NLP 的东西都必须看参考)。该数据集分为四个平衡的类别,共有 120,000 行,如下所示。

数据集被格式化为两列,类别和描述。

如何在没有预处理的情况下获得 90%的准确率

因为我希望这是一个简洁的帖子,所以我会让你参考我以前的文章来了解如何在 Colab 中使用 Spark NLP。这只是几段代码。或者,你可以在这里查看我关于那个项目的笔记本。

作为一个简短的回顾,为了将句子嵌入放在有多酷的环境中,考虑下面我用于 GloVe、ELMo 和 BERT 单词嵌入的预处理步骤的概要:

  • 将原始文本转换为文档
  • 将文档标记化以将其分解成单词
  • 规范化标记以删除标点符号
  • 删除停用词
  • 将剩余的单词简化为它们的引理
  • 然后我可以创建单词嵌入

使用 BERT 句子嵌入,唯一需要的步骤是将原始文本转换成文档。完整的管道可以在下面看到。在第一个块中,您可以看到描述列中的文本被使用*文档组装器转换为文档这个文档列然后被用作 BERT 句子嵌入的输入。最后,这些嵌入被用作分类器的输入。*就是这样!

结果

下面,您将找到一个示例,展示该模型如何在文本子集上执行。类别列有标签,而结果列有预测类别。

然后,我们可以使用 scikit-learn 来计算我们的指标。如下图所示,总体准确率为 90%

我们今天学了什么?

我想和你分享一个简单而强大的工具来添加到你的 NLP 工具包中。没有任何预处理,这可能是相当耗时的,BERT 句子嵌入用于获得我们的 4 个类别的优秀分类。

我把这个保持简短,只是为了向你介绍句子嵌入的力量。试试看,让我知道你的想法!

我是如何在 LinkedIn 上吸引招聘人员的

原文:https://towardsdatascience.com/how-i-became-a-recruiter-magnet-on-linkedin-2dc6264d1137?source=collection_archive---------20-----------------------

14 个月的实验归结为可行的建议

由 Unsplash 上的 inlytics 拍摄

如果你一直在关注我在其他文章中所说的,请在下节课中随意跳到建议部分。

不过,如果你没有,我通常会提供一些背景信息——我会在我的职业变化和突出技能文章中更广泛地谈论它——本质上可以归结为以下几点:我最近成为了一名全职软件工程师,之前从事了 12 年的商业/数据科学&分析、战略规划和报告工作。近十年前,我拿到的是商科学位,而不是技术学位,除了自己做过的事情,我在这个领域几乎没有相关经验。

现在你已经明白了,关键是:昨天我签署了三份工作邀请中的一份,这是一份 6 位数薪水的高级后端工程师的工作。从任何角度来看,这都是我职业生涯中收入最高的工作。

请注意,我不认识招聘人员或招聘经理。我和那家公司的任何人都没有私人关系。不,我也没有挟持任何人。一个猎头找到了我,我在两天内参加了两次面试,最后在第三天被录用了。

在大约 14 个月的时间里,我尝试了求职信、简历、LinkedIn 以及其他一些能让我足够引人注目的东西,让那家猎头公司带我去淘金。最终,被寻找比申请更能有效地找到工作,LinkedIn 就是为我找到工作的工具。

请记住,当我瞄准数据科学和软件开发职位时,这种方法对我有效,对我有效的一些方法可能是面向行业的,但对其他人也可能有效。

重要的是:从我的经历来看,你的行动会产生结果。你的个人资料将会改变,但你最有可能在 2-4 周内看到效果。

我如何模仿我的 LinkedIn

这绝对是最重要的。如果你没有 LinkedIn 个人资料,对于招聘人员来说你就不存在。如果你在 LinkedIn 上的个人资料很差,那就相当于你也没有。

现在的问题是,我们如何优化它?说实话,我不知道。我可以告诉你的是,以前每六个月有不超过两个招聘人员联系我,现在我一周有 8-9 个。一天之内已经有人联系我 12 次了。也许这些对于经验丰富的开发人员来说是新手数字,但对我来说这是巨大的。

这些联系人很难保证他们会有趣或符合你的兴趣,但他们通常会准确地告诉你想去哪里。以下是主要方面:

一个描述性的标题和一个主题。

好吧,主题只是让招聘人员“感觉”到你。

不过,当他们搜索职位描述时,会立刻看到你的标题。我曾经把*“全栈开发人员|软件工程师|数据科学背景&分析】*,这产生了相当多的点击量。但是当我把我工作过的技术包括进来的时候,大量的联系方式开始冲击我的收件箱。

如果你是一个开发者,提及你的主要堆栈。如果你是一名数据科学家,提及你的主要专长(如计算机视觉),但不要忘记宽泛的术语,如“机器学习工程师”)。如果你从事金融工作,一定要提到 Tableau 这样的工具。你明白了。

连接,连接,连接

不要引用我的话,但是根据我在其他地方读到的,如果你和招聘者有共同的联系,你很可能在搜索中处于更高的位置。

试着和这个领域的人联系。我可以保证的是,建立一点人际关系网绝对没有坏处。

描述性角色头衔

叫我书呆子吧——我确实是,但是我认为代码是美丽的。当我第一次尝试把一个按钮放在中间的时候,我对制作一个 API 同样兴奋。这就是为什么我使用更通用的头衔,如“开发人员”和“软件工程师”——我对全栈、前端或后端持开放态度。没关系。

但是,如果对你有影响,确保你的头衔是一致的。不言而喻,但也不要撒谎。只要确保你的头衔能很好地代表你想做什么和你的工作是什么,因为这也会出现在招聘人员的搜索中。

让自己敞开心扉去工作

您可以在您的个人资料页面的“打开”按钮下找到它。你申请的头衔和地区都是相关的。不幸的是,LinkedIn 不提供“仅远程”,但如果你是一名开发人员,它最有可能是它。

你可以给自己设定最多 5 个职位和 5 个你愿意工作的地点。曾经有一个字段,你可以向对你感兴趣的招聘人员显示一条短消息,但现在已经没有了。

表现出一点个性

那些描述自己的人,限制自己。

大约 20 年前,在脸书热之前,这个被称为 Orkut 的社交网络曾经在巴西用户中流行过。

相信一个人局限于他们写的关于自己的东西不仅是一种非常天真的行为,而且在找工作时也非常非常适得其反。或者,在这种情况下,正在找工作。

当你遇到一个人,你会想知道这个人是做什么的,他们是什么样的。我把我的“关于”部分变成了这个样子。你会发现一页又一页的人用 JavaScript 编码,但是如果有机会我会因为是一个奇怪地被天体物理学认证的开发者而被记住(尽管我几乎不记得课程中的很多内容),那就这样吧。奇怪的是,这很能说明我是一个怎样的人,因此也是一个专业人士。

我不想把我的“关于”部分作为一个美学参考,但我相信我成功地传递了这个信息。

展示一些技巧

现在,当我写这篇文章的时候,我意识到我的技能已经完全过时了(比如专注于我以前的职业)。虽然我仍然有那些,我想展示新的。我使用的主要技能都在前三名,所以我想那也算。不知道你的资料里有没有说这个的功效,但还是那句话,它不会伤害到你。

帮助自己变得有条理

这并不是对 LinkedIn 本身的改变,但我不断得到反馈,说它让招聘人员很高兴(也让我的生活轻松了很多)。大多数招聘人员一开始都会说几乎相同的话:

“我有一个我认为你很适合的职位,把你的电话号码发给我,这样我们可以进一步讨论。”

当我几乎没有接触时,这曾经是令人兴奋的,但一旦它成为现实,这对于我的全职工作来说显然是不可能处理的。根据经验,任何介绍电话都不会少于 20 分钟。乘以十几个招聘人员,你将不得不每周花 4 个小时来筛选机会。

很多时候,招聘人员认为 Java 和 JavaScript 是一回事。或者他们认为“嘿,这是一个 IT 人。也许他想在公司层面上修理打印机。”不,我没有。不能,但那是另一个话题,我不想花整整半个小时来告诉你。

于是我走了两步。

首先,我注册了一个议程服务。我不会到处宣传它们,但它们就在那里。你将它们与你的谷歌/Outlook 日程整合,当有人与你预约时间时,它会为给定的时间段生成一个会议/团队/缩放链接,并自动阻止你的日程安排。太美了。

第二,我写了一条简单的信息,我会发送给所有这些非描述性的联系人。大致是这样的:

嗨,(招聘人员姓名)。

谢谢你伸出援手。我的主要堆栈是 JavaScript (React,Node)和 Python,我对完全远程的全职机会感兴趣,报酬大约每月 X,XXX 美元。如果需要,我愿意使用/学习其他技术。

如果这符合您的要求,请通过此议程链接随意安排时间。它会自动创建一个 Google Meet 链接,但如果你喜欢其他联系方式,请随时将邀请转发给 me@myprovider.com,或者告诉我你是否想要我的电话号码。

谢谢你,

我自己。

包扎

我从来不敢就这个特定的话题写“如何做”。我的建议是带给你一种个人体验,而不是一个好的个人资料的科学。请注意,所有的经历都是不同的,我正在分享一些对我很有用的东西。我希望其中一些也能为你带来积极的结果。

我会更多地谈论我如何制作我的简历,我如何在面试中保持平衡,处理技术挑战等等。,但是这些将在另一篇文章中讨论,所以这篇文章不会错过它的主要目的。

不过,我不能保证下一个标题会如此吸引人。

我是如何闯入数据科学的🚀

原文:https://towardsdatascience.com/how-i-broke-into-data-science-d7dcbde912ed?source=collection_archive---------9-----------------------

闯入数据科学

👨‍🔬一名化学工程师的数据职业之旅👨‍💻

现在是 2013 年 6 月,我即将高中毕业。激动人心的时代;大四日落,毕业,毕业派对!我真的非常喜欢数学和化学;两科都拿了 AP,成绩不错。因此,我选择了化学工程作为我的专业。我对此感到兴奋,并于 2015 年在犹他大学大一开始上工程课。(注意,我曾在耶稣基督后期圣徒教会担任了两年的传教士。

高中最后一年的我(来自作者)

当我开始上大学的时候,我爸爸(一个炒股的家伙)曾经提到过我应该学习这个叫做“机器学习”的东西。他给我发了一个 YouTube 链接,让我观看(见下面的视频)。我不是很懂,所以我做了所有好儿子都会做的事,无视他们的爸爸!几乎忘了学过这方面的任何东西。

谷歌解释机器学习的视频

大学第一学期;如此美好的时光。我上大学课,认识新朋友,住宿舍;生活是美好的。但是,我想在“我的领域”找一份工作。我甚至不确定“我的领域”是什么,但我想在工程或科学或其他方面找份工作。

我了解到大学教授不仅教书,还做研究,并让学生在他们的实验室工作。我认为这已经足够接近“我的领域”,并决定进一步探索。我花了几个小时在网上筛选,寻找机会,找到了大约 20 位教授,他们从事某种类似工程的研究。然后,我发现了他们的邮件。我给他们发了一封冷冰冰的邮件,问他们的实验室是否有空缺。

这是我发的一封真实的邮件,这封是给孙博士的。

给职业的冷邮件(来自作者)

二十个人中只有三个人回答。一个说他们满了。一个是数据分析职位,但他们告诉我我没有足够的经验(现在非常讽刺)。第三个是冶金工程教授孙博士,他给我回了邮件,要我的高中成绩单。记住,这是我大学的第二个月,所以我还没有任何大学成绩。我回答说我找不到我的高中成绩单,但这里有一些成绩单和过去老师的推荐信。我猜这对他来说已经足够了,因为他奇怪地回答道,“艾弗里,你的学习成绩很好,我有兴趣让你开始实习。“不久后,我开始了《我的领域》的实习。

一个博士后在管理实验室,他是我的老板。他告诉我,我将有 3 个月没有工资,直到我接受培训,然后开始赚钱。我只是对获得经验感到兴奋。在接下来的 3 个月里,我每周花大约 5-10 个小时进行实验,采集样本,并免费打扫铁开发实验室。这项研究旨在开发一种更智能、更坚固的铁材料。

经过三个月的训练,我终于得到了第一份薪水,这让我兴奋不已。我给经理发了一封电子邮件,询问我如何才能把直接存款的事情都办好。他回复并建议我从夏天开始向大学申请研究基金。那是二月?我很困惑,我应该得到报酬。他基本上继续解释说,实验室不会支付我,如果我想得到报酬,我必须从普通大学获得资金,从现在开始 4 个月。

我感到沮丧和失望。

随机地,我遇到了我年轻时的一个老童子军领队,我们聊起了我正在做的事情。我解释了整个实验室的情况,他说:“你知道我在校园里经营一个实验室吧?”我很震惊。我不知道他是做什么的。原来他帮忙经营了一家生物工程系的子公司。我参加了这家公司的面试,最终得到了一份实验室技术员的工作,每小时 12 美元。我很兴奋。每小时 12 美元对我来说是世界上最大的一笔钱。我要继续做科学家!

这家公司叫做 Vaporsens,他们制造了令人难以置信的化学传感器,基本上是为了取代狗的鼻子。他们能嗅出毒品,能嗅出炸弹。他们太不可思议了。公司很小,包括我在内只有 12 名员工。但是他们有一个全职的数据科学家。这位数据科学家解释说,他的工作是创建算法,这些算法接收传感器信号,并将其转换为存在什么化学物质以及存在多少化学物质。听起来很酷也很难。

解释 Vaporsens 技术的视频

我大部分时间都呆在实验室里(想想试管和烧杯)。我制作了传感器,并用它们进行实验。我在帮助回答一些问题,比如,“这个传感器能找到这个炸弹吗?”或者,“这个传感器对这种化学物质有什么反应?”我生成了大量数据供数据科学家查看。这很有趣,也很新鲜,所以我很喜欢。

但是在我开始工作大约两个月后,这位数据科学家辞职了。他在东部找到了一份收入更高的工作。作为一家公司,我们花了接下来的六个月时间试图寻找一名新的数据科学家。它们价格昂贵,需求量大,而且很难找到。

与此同时,我继续进行实验并生成数据。数据越积越多。我们一直在说,“等不及让数据人员看看这个了”。我仍然在修我的核心化学工程课,比如过程、热力学和有机化学。你猜怎么着?我讨厌他们。我对它们没那么感兴趣。在我的脑海里,我一直在想我是否应该换专业,但不确定该换什么。

2016 年末的一天,我厌倦了等待这个新的数据人来拯救我们的数据灾难。我厌倦了生成数据,却得不到洞察力。在这一点上,我已经上过一些编程和数学课,我想,“我可能会想出一些程序来做一些分析。”

所以我打开电脑,在工作的“空闲”时间,在实验间隙,我开始编程。当时我在用 MATLAB,最后我做了一个工具,对数据进行一些自动化分析。我给我老板看了,他很喜欢。他鼓励我继续开发它。我很兴奋,因为这个工具每天为我节省了大约一个小时的工作量。

我花了几个小时阅读复杂的数学课本,看了一个又一个 YouTube 视频,读了我能找到的每一个数据博客。我把每一秒空闲时间都用来学习数据科学和机器学习。

我着迷了,上瘾了,坠入了爱河。

我再也没有回头。三个月后,我停止了实验室工作,专注于 Vaporsens 的数据。

但我仍然没有这个头衔。我是做数据科学的,不是数据科学家。

我想在这里暂停一下,强调一下,学习如何做数据科学真的让我受益匪浅。在 Vaporsens 期间,我学到了大部分关于数据科学的知识。我边走边想。这就是目标,把你的脚放在门里,然后付钱去学习。 不付费学习,付费学习!

我为 Vaporsens 的所有项目做了分析,其中包括一些相当大的组织和名称。大多数项目工作涉及数据自动化、数据清理、数据可视化,当然还有机器学习。我们运行了许多分类算法以及一些回归模型。

我最终在 Vaporsens 做了大约一年半的数据科学,然后停下来与化学工程系的一位教授一起做应用数据科学研究。我们设计了一种算法,帮助工厂知道什么时候出了问题,以及如何修复它。

此时,我的简历上已经有了 Vaporsens 和数据研究。我很幸运,在优化团队的研究部门获得了巨头埃克森美孚公司的实习机会。我在那里度过了 2018 年夏天,处理数据科学问题,并收到了超过六位数的全职报价。我甚至创建了一个算法的原型,最终得到了十亿,是的,十亿美元的评估。

我整个高三都在兴奋地回到埃克森美孚全职工作。但为了支付账单,我回到 Vaporsens 继续领导数据计划。毕业后,我回到埃克森美孚,在那里我花了两年时间为公司解决与数据相关的问题。我做了很多回归分析,研究了一些有趣的供应预测问题,甚至制作了一个仪表板来监控公司的差旅支出。

在全职工作的同时,我利用晚上和周末的时间兼职做数据项目,并获得了佐治亚理工学院在线数据分析的硕士学位。

乔治亚理工学院的在线分析硕士

在埃克森,我不喜欢公司文化,也不喜欢我被分配的项目。当我的客户名单增长到一定程度时,我意识到我可以经营自己的分析公司赚同样多的钱。于是 2021 年初一辞职,开始了雪数据学。

Snow 数据科学徽标

那么,这个故事中的哪些原则帮助我走到了今天?

N **袅一:**编造自己的经历。我不是让你对你以前的经历撒谎。恰恰相反,我是在告诉你自己去创造。不要等待它发生在你身上。如果我不愿意免费工作三个月,我永远不会成为 Vaporsens 的实验室技术员。我没有资格,也没有经验。免费工作 3 个月创造了经验,也让我有了工作机会。我在 Vaporsens 做了同样的事情,我没有资格成为“数据人”,但我用自己的时间和主动性创造了第一个工具,向我的老板证明了我可以交付结果。如果你没有这方面的经验,那就用你自己的时间去做,并建立一些可以证明你的成果的东西。在我们建立投资组合时,这将是本课程的关键。

第二:人脉才是王道。老实说,Vaporsens 甚至没有实验室技术员的职位描述。我刚遇到一个老朋友,他看到了我的热情和技能,认为这可能是一个很好的搭配。我将永远感激他,感激我努力重新联系他。人际关系网将打开你甚至不知道存在的大门。

第三:承担可计算的风险:在我实习的三个月里没有挣到任何钱是有风险的。在 Vaporsens 开发一个我的老板没有要求我做的工具是有风险的。独自出去创业是有风险的。信不信由你,现在我不那么喜欢冒险了。然而,我一生中所冒的大多数风险都以这样或那样的方式解决了。我不认为我们中的许多人在临终前会后悔我们所冒的风险,而是那些我们没有冒的风险困扰着我们。

这就是我的故事,关于我如何成为一名数据科学家以及帮助我成功的三个原则。我知道这三个原则也会对你的数据职业生涯有所帮助。

如果您对您的数据职业或进入该领域有任何问题,您可以随时来我的免费开放办公时间,在那里您可以问我任何您想问的问题。我每周二东部时间晚上 8 点在 LinkedIn/YouTube 上主持他们。更新见https://www.datacareerjumpstart.com/AskAveryRegister。

此外,如果你想要一个更结构化的途径和课程来进入数据科学,你可以看看我在 2021 年秋季推出的名为数据职业快速起步(https://www.datacareerjumpstart.com)的训练营。

另外,如果你想看视频,我制作了一个 YouTube 视频来讲述这个故事。

祝你好运!希望你找到自己的路!

我如何在一周内构建端到端数据科学项目

原文:https://towardsdatascience.com/how-i-build-end-to-end-data-science-projects-in-a-week-69c10ca145ee?source=collection_archive---------4-----------------------

“让我们谈谈你迄今为止参与的项目”

来源: Unsplash

在不断扩大的数据科学领域,领先和生存的竞争比以往任何时候都更加激烈。世界各地正在进行的尖端项目只会让数据科学家难以跟上。

无论你是在学校为一份出色的简历或个人资料而工作,还是在职业生涯中期或出于兴趣而重塑自我;不管项目的目的是什么,你选择的问题陈述会对项目及其进度产生影响。

在我读研期间,每上一堂新课,我都会兴奋地着手处理新的数据问题陈述,最大的挑战是完成这些项目。在我研究生项目的前两个学期,我会在一个月内确定 36 个项目,开始其中的 12 个,但一个也没完成。

但是,为什么从事数据科学项目如此重要?

如果你现在在学校,你可能正在为你上的每一堂课做一个项目。如果你是一名在职专业人士,你不会担心找工作的困难——为什么要关心数据科学项目呢?

  • **你在学校:**你的许多同学会提到你在班上做过的同一个项目,在你意识到这一点之前,已经有 38 份简历看起来像你的
  • **POV 你是一名在职的专业人士:**数据科学是不断发展的,因为企业面临的问题也在不断发展,这使得即使是专业人士也必须与数据科学的最新和最棒的技术保持同步(有什么比一个周末一个周末的项目来保持更新更好的呢)

为数据科学项目的重要性设定了前提后,下面是一种方法(经过尝试、测试和成功)来处理数据科学项目,而不会无法完成它们。

1.遵循 3 步流程

  1. 确定数据利基
    数据科学项目可以包括一系列技能,如数据探索、数据可视化、时序预测、Tableau 仪表盘或聚类和分类
  2. 如果你对一个商业领域充满热情,那么就为这个行业做问题陈述,或者为每个行业创建一个平衡的项目(这在求职时对你的简历特别有用。你可以根据你申请的职位和公司来切换你的项目。从金融、医疗保健、体育、媒体和通信、软件和 IT 服务或其他行业中进行选择
  3. 设定目标
    你想从这个项目中实现什么?

2.确定项目的类型

对我来说,一旦我确定了数据科学生命周期中我想亲自学习的部分和业务领域,我就可以确定我的流程是什么样的:

  1. 结果已知: 你知道预期的结果,应用什么数据模型
  2. 分析决定接下来的步骤: 处理随机数据集,执行数据分析,并从数据中揭示隐含的洞察力

其他类型的项目:

  1. 描述性分析 ( 销售团队希望根据客户、性别、年龄、地域、地区、市场等人口统计数据来查看销售额)
  2. 预测分析 ( 使用客户人口统计数据,销售团队希望预测店内与网上的购买行为)
  3. 规定性分析 ( 确定最佳销售和营销策略——什么类型的产品搭配得好,定价和折扣策略,以促进销售)
  4. 情感分析 ( 可包括客户支持分析或客户反馈分析,以确定客户对产品/品牌的亲和力)
  5. 检测项目 ( 检测产品销售异常)
  6. 深度学习或神经网络( 预测下一年 x 种产品在每个不同商店的销售
  7. 聚类和分类 ( 什么客户最有可能或不太可能购买某个产品 X )

一年前,我将我的项目分为以上几类,并确定了其后的复杂程度。话虽如此,今天进行的项目应该反映你的思维过程,而不是局限于上述任何一种。

3.制定行动计划

现在你已经锁定了我想做的项目类型,我会为接下来的几天做这个项目制定一个行动计划。这让我的生活变得多么轻松,我怎么强调都不为过。

*完全披露:*下面的步骤看起来有点费力,但如果是时候为你的个人资料或 GitHub 记录你的项目,你会感谢我的。

  1. 收集需求 —哪种代码编辑器最适合(Python、R、Visual Studio),确定您需要的数据源和/或数据集成(API、开发人员权限)
  2. 预测项目风险 —抛开范围蔓延的行话,预测技能&资源等挑战,业务案例变得过时、延迟或难以获得知识产权(研究供参考)
  3. 记录假设和约束 —我们生活在不完美的世界中。每个项目都有自己的一套假设、约束和依赖
  4. 所需工具 —在所需版本(Python 3.0 或以上等)中设置环境。),更新并安装所需的软件包和库

随着时间的推移,我会从在纸上可视化项目开始,并建立一个包含我的目标、要求、预期结果的愿景板,我意识到-数据科学项目最好在工作时受到检查,就像你向高管提交项目提案并遵循既定路径一样。

4.以数据科学项目生命周期发誓

来源:作者

  1. **设定研究目标:**为需要解决的问题确定目标
  2. **提出假设:**提出相关问题,并通过分析数据,就你定义的问题提出假设
  3. **收集和准备数据:**收集和搜集项目所需的数据,修复数据中的不一致,如处理缺失值和高度多重共线性
  4. 测试假设 —选择重要的变量并构建更有意义的变量来证明你开始的假设(训练和测试机器学习模型)
  5. 分析您的结果 —评估模型的性能并使用它们进行预测
  6. 完善假设(如果需要)
  7. 展示结果 —使用图表、交互式可视化和报告将调查结果传达给合适的渠道

5.记录每天的进展

在每一步之后,你都要回到愿景板上去验证,那里有你成功的时刻。

当你在做项目的时候,记录你的项目也使得在你的技术档案上展示更容易 GitHub 的 READ.me 页面或你的投资组合的项目描述,生活变得容易!

一段时间以前,我按照上面的所有步骤做了一个项目,这就是现在项目描述的样子!该项目链接如下:https://github . com/rashidesai 24/Analyzing-Twitter-Trends-On-新冠肺炎-疫苗接种

你可以像我一样在你的目标计划中做笔记,或者使用项目管理工具,比如 JIRA、阿特拉斯、阿萨纳,或者简单的谷歌文档。

这就是我的博客的结尾。感谢您的阅读!请在评论中让我知道你目前正在从事什么数据科学项目,以及你是否也在遵循你的项目流程!

如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑使用这个链接注册成为一名媒体会员(我可以赚取一小笔佣金,不需要你额外付费!)

数据帐篷快乐!

Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造富有洞察力的故事来传达商业见解。她是一名全职的医疗保健数据分析师,在周末喝一杯热巧克力,写关于数据的博客……

我如何用 Python 在两个周末构建了一个冠状病毒仪表板

原文:https://towardsdatascience.com/how-i-built-a-coronavirus-dashboard-over-2-weekends-using-python-1e01339b4fa9?source=collection_archive---------19-----------------------

提示:我使用了 Streamlit

粘土堤在 Unsplash 上拍摄的照片

我们相信上帝;所有其他人必须带来数据——威廉·爱德华兹·德明

概观

在下面的文章中,我将演示如何使用 Streamlit 创建漂亮的数据 web 应用程序。

Streamlit 是一个 Python 库,用于在没有任何前端语言/框架知识的情况下构建快速 web 应用程序。该项目旨在帮助数据科学从业者轻松展示他们的数据科学项目。

数据

用于构建仪表板的数据来自约翰霍普金斯大学在 Github 上的新冠肺炎知识库。

结构

如上所述,Streamlit 为构建前端应用程序提供了极大的便利。例如,要创建这样的登录页面:

您需要做的就是编写下面这段代码:

所有 Streamlit 应用程序都可以使用本机 CLI 运行。假设您有一个使用 Streamlit 的名为app.py的脚本。您可以在终端上使用以下命令运行它:

我们可以看到 Streamlit 库有许多内置的方法,可以显示文本、解析标记语言样式和构建 UI 小部件。因此,它能够为您的 web 应用程序无缝地创建布局。

例如,st.radio方法允许我们创建用于与用户交互的单选按钮。您可以将可供选择的值列表作为参数传递给该方法。

st.radio类似,可以使用多种方法在 Streamlit 上创建小部件。其中一些是:

  • st.button
  • st.checkbox
  • st.slider
  • st.selectbox

请注意,st.sidebar方法可以用来设计侧边栏,方法与应用程序主体相同。

上传图像

与所有其他功能一样,Streamlit 使用户能够轻松嵌入图像:

为了说明这一点,我在网上找到了一张蒙娜丽莎戴着面具的照片,我把它用在了我的网络应用程序的主页上:

Web 应用主页

显示数据帧

根据文档,st.write属性是 Streamlit 的“瑞士军刀”,因为它以不同的方式处理不同的对象。

在前面的代码片段中,我们使用了st.write方法来编写一些文本。这一次,我们将使用它来显示我们的数据。

在这种情况下,该方法为我们查看数据提供了以下漂亮的输出:

显示图表

Streamlit 与 Python 中大多数流行的数据可视化库的互操作性使得显示可视化信息变得非常容易。

例如,使用以下代码行,您可以在 Streamlit 上绘制 Plotly 图形:

st.plotly_chart一样,Streamlit 也有通过其他图形库如st.pyplotst.altair_chartst.vega_lite_chartst.bokeh_chart等创建图表的方法。

因此,您可以看到利用 Streamlit 强大的 API 和构建 web 应用程序来展示您的数据科学项目是多么容易。

在 2021 年,人们不需要知道复杂的前端库来创建 web 应用程序。我怀疑 Streamlit 和其他类似的应用程序在未来几年只会越来越受欢迎。

我希望你喜欢这篇文章!😃下次见。✋

链接:

https://github.com/Sayar1106/covid-dashboard

参考资料:

https://docs.streamlit.io/en/stable/api.html

我如何为 AWS 数据湖构建数据发现 API

原文:https://towardsdatascience.com/how-i-built-a-data-discovery-api-for-aws-data-lake-5d2813f794bf?source=collection_archive---------15-----------------------

这个简单的 FastAPI 服务将帮助您在数据湖中找到数据

照片由 nine koepfer 在 Unsplash | 品牌内容披露上拍摄

阿塔湖提供了无数的好处。它们是数据不可知的,不需要你预先定义一个模式。但是,如果没有合适的结构,找到您需要的数据可能会很困难。在本文中,我们将通过创建一个 FastAPI 抽象来解决这个问题,它允许我们查询 AWS Glue 元数据目录。

目录

为什么 FastAPI 用于数据发现服务?
我们如何开始?
怎么才能把这个翻译成 Python 代码?
实现:FastAPI MVP
如何规模化服务这个 API?
∘AWS lambda
∘API 网关
∘ 让 API 安全可追踪
我们如何监控我们的数据发现服务?
结论

为什么 FastAPI 用于数据发现服务?

如果我们将它实现为一个 Python 包,我们会假设每个人都知道足够多的 Python 来使用它。但是,您的公司可能有其他开发人员(Java、C#、JavaScript、Go 等)需要访问数据湖中的数据。通过为数据发现构建一个 REST-ful 服务,你为每个人提供了一个与编程语言无关的接口。这种 API 优先的方法还有进一步的好处:

  • 如果您后来决定为业务用户构建一个 UI ,您的任务将变得容易得多,因为您已经有了一个以 JSON 形式提供数据的 REST API。
  • 您可以在一个单一服务中组合用于此目的的所有功能。
  • 如果您需要添加新的方法或更改现有的方法,您可以通过创建一个新的 API 版本(比如说,api_url/v3)来更容易地部署更改,而不会破坏任何依赖于当前版本的工作负载。
  • 您可以扩展功能以包括实时数据流、非结构化数据,并允许查询访问日志以确定哪些数据最常被哪些用户使用。

我们如何开始?

我们可以从列出所有可能对数据发现有用的方法开始:

  • 列出所有数据库或模式
  • 列出特定模式的所有,
  • 过滤带有特定前缀后缀的表名,
  • 对表名进行全文搜索(比如,与orderscustomers有关的所有表),
  • 对表注释进行全文搜索(例如,如果我们想找到任何与物流相关的栏目,
  • 显示一个完整的表定义 ( 所有列、数据类型和列注释),
  • 显示特定表的分区
  • 在特定分区下显示来自 S3 的所有文件,
  • 显示带有特定注释的所有列,
  • 显示包含特定列名的所有表格,
  • 最后,数据发现的最佳方式是查看整个表的前 X 行

我们如何将这些翻译成 Python 代码呢?

我们有三个选择:要么使用低级别的 AWS SDKs,在 Athena 的information_schema上进行查询,要么利用awswrangler。最后,我们可以将它们结合起来,以满足上一节的要求。

#1.要列出所有数据库(即模式)和表格,我们可以使用 awswrangler 包,尤其是模块wr.catalog

作者图片

#2.要过滤带有特定前缀后缀的表名,我们也可以使用wr.catalog.tables。检索表定义并对这些定义进行全文搜索也是如此:

作者图片

#3.列出特定表的所有分区:

作者图片

#4.显示表格的 DDL:

作者图片

#5.列出 S3 目录路径或者根据文件类型显示具体对象( ex。拼花文件)和最后修改日期:

作者图片

#6.查询列注释找到你需要的数据集:

作者图片

#7.描述雅典娜表定义:

作者图片

#8.搜索特定的列名:

作者图片

上述方法构成了数据发现服务的基本 MVP。它允许查询模式、表、列、列注释(又名数据字典),显示数据预览,以及探索底层文件、目录和分区。

通过利用 AWS X-Ray 和 Lake Formation 等服务,我们可以添加查询使用访问模式的方法,并确定使用最多和最少的数据集。

**补充说明:**如果您不想在每个 API 方法中单独附加您的boto3_session,您可以使用:

boto3.setup_default_session(region_name="us-east-1")

实现:FastAPI MVP

这个 MVP 的完整代码可以在 Github 库中找到。我们简单讨论一下其中的一些细节。

在下面的演示中,我们可以看到 Kaggle 的巴西电子商务数据集上应用的所有端点。

上面的截屏演示了我们如何使用这个 API 来发现和查询存储在 S3 数据湖中的电子商务数据。最终用户可以确定他们需要的表或模式。通过深入底层文件,数据科学家和分析师可以在交互式笔记本或他们选择的其他工具中探索这些数据。使用awswrangler从 S3 读取特定的 parquet、CSV、Excel 或 JSON 文件非常简单:

作者图片

我们如何大规模地提供这个 API?

部署 REST API 有几种选择。如果你已经使用了 AWS,你可能会发现利用专门为构建弹性和可伸缩 API 而构建的无服务器服务很有用: AWS LambdaAPI Gateway

使用名为mangum的优秀包,将我们的 FastAPI 转换为 Lambda 处理程序就像导入这个包( from mangum import Mangum )并添加一行代码:handler = Mangum(app=app)一样简单。

将 API 部署到 AWS Lambda 的 docker 文件如下所示:

作者图片

我们在 Python 3.8 中使用官方 Python Lambda 镜像,并且安装所有需要的。然后,我们复制剩余的 API 代码,并指定将用作容器入口点的 Lambda 处理程序

最后,我们必须将容器推送到 ECR — AWS 容器注册中心。要复制此演示,请用您的 AWS 帐户 ID 替换123456789,并调整您的 AWS 地区名称。如果你想知道:dda是我对data-discovery-api的缩写。

作者图片

自动气象站λ

容器映像被部署到 ECR。现在,我们需要创建一个λ函数。我们选择容器图像选项,并选择我们的 ECR 图像。

作者图片

由于查询一些表可能比 Lambda 的默认超时三秒更长,我们可以将其延长到三分钟。

作者图片

最后,我们需要附加 IAM 策略来授予我们的 Lambda 函数权限,以便从 AWS Glue、Athena 和 S3 中检索数据(当然,我们应该对生产使用更细粒度的权限)。

作者图片

API 网关

在用我们的容器映像配置了 Lambda 函数之后,我们可以在 API 网关控制台中创建新的 API。我们需要选择 REST API 并指定一个名称。

作者图片

然后,我们可以添加一个方法和资源来配置 Lambda 代理集成。

作者图片

一旦所有这些都设置好了,我们就可以部署 API 并开始服务它了。

为了一步一步地了解它,这里有一个演示 API 网关配置、部署和测试 API 的截屏:

确保 API 的安全性和可追踪性

要了解如何额外配置 API 键来确保 API 安全,请查看我以前的文章。它还展示了如何使用 AWS X-Ray 配置分布式跟踪,以便更好地控制 AWS 上的 FastAPI 服务:

我们如何监控我们的数据发现服务?

想象一下,您在自己的公司部署了一个类似的服务,并且获得了巨大的成功。现在你需要确保它保持健康,可以很容易维护,并且运行没有错误。此时,您可以:

  1. 手动关注(不推荐),
  2. 通过使用 AWS CloudWatch 和相关服务,自己构建一个可观察性仪表板
  3. 使用观察工具,如 Dashbird 。

每个选项的含义:

  • 对于选项 1,你可能会发疯。
  • 对于选项#2,您将不得不花费额外的时间来构建 CloudWatch 仪表板,在几个 CloudWatch 日志和多个 AWS 控制台选项卡之间切换,以修复任何潜在的错误。
  • 使用选项#3,您只需登录您的 Dashbird 帐户——它会自动扫描所有无服务器资源,并为您提供跟踪 API 和微服务健康状况所需的可视化功能。然后可以随意(强烈推荐!)结合 API Gateway 和 Lambda 资源构建项目仪表盘,失败设置预警

作者图片

在上图中,我们可以看到 Dashbird 是如何指出 3 秒后超时的任务的(默认 Lambda 超时)。它还揭示了 Lambda 函数何时经历了冷启动,并显示了每个 API 调用的持续时间。

对于 API 网关,我们可以看到平均延迟、API 请求的数量以及我们在 API 初始测试中遇到的不同类型的错误。

作者图片

结论

在本文中,我们研究了如何为数据发现构建 REST-ful 服务。通过利用 Python 库,如 FastAPI、awswrangler、boto3 和 Mangum,我们可以在几个小时而不是几周内构建有用的 API。此外,通过将该服务部署到 API Gateway 和 Lambda,我们可以大规模地提供该 API,而不会遇到运营难题。最后,通过利用 Dashbird ,您可以为您的无服务器资源添加可观察性,而无需安装任何 CloudWatch 代理、提取日志或构建任何仪表板。

感谢您的阅读!如果这篇文章有用, 关注我 看我下一篇帖子。还有,看看相关文章:

  • FastAPI + AWS =健壮的 API(第一部分)
  • 用 Docker 容器部署 AWS Lambda:我尝试了一下,这是我的评论
  • 您应该考虑数据湖(和事件驱动的 ETL)的 7 个理由

我如何使用谷歌健身数据建立自己的健身追踪器

原文:https://towardsdatascience.com/how-i-built-a-google-spreadsheet-to-keep-track-of-google-fit-fitness-data-a0887a59f730?source=collection_archive---------17-----------------------

我如何快速构建了一个可以在电子表格中跟踪健身数据的应用程序

照片来自 Unsplash

最近,我在 Fiverr 上签约了一项自由职业任务,为一位瑞士客户从谷歌 Fit API 中提取数据。具体来说,我的任务是检索 3 个关键字段:每天行走的步数、每天消耗的卡路里和行走的距离(以公里为单位),在这篇文章中,我将通过这些步骤来交付这个项目。

关于 Google Fit:

Google Fit 是谷歌自己的服务,用于跟踪你的健康数据。它集成了许多不同类型的手表和健身追踪器,并将您的数据聚集在一个地方。它可以记录你走的步数、体重和心率。它有一个很好的界面,很容易使用。它只能作为移动应用程序使用。

当我浏览 Google Fit API 的文档时,我看到 Google 有关于这个 API 的大量文档和大量代码示例。

API 设置:

以下是如何正确设置应用程序的说明:

启用 API 调用的步骤

此外,虽然 Google 的文档非常详细,但它没有具体说明如何用特定的编程语言调用 API。因为我是在 Google Sheets 中构建我的应用程序,所以我必须使用 JavaScript 来调用和显示数据。

当我在谷歌搜索时,我发现了一篇关于如何使用谷歌 Fit API 的精彩文章,我正在计划如何有效地完成这项任务。像这样详细的博客和教程是我喜欢互联网上的社区的原因。

这个博客叫做“我以为他和你一起来的”,是一个极好的资源——我鼓励你查看这里的链接。文章的作者给出了取回 3 个字段的代码。我需要 3 个不同的领域;具体来说,我需要

(1)每天的步数

(2)每天消耗的卡路里和

(3)以公里为单位的行走距离。代码是在 Google 脚本编辑器中编写的,如下所示:

Google API 的请求正文

需要进一步处理才能在 Google 表单中正确打印响应。最终产品看起来很漂亮:

哒哒!过去 9 天的 API 响应

除了简单的跟踪之外,这些数据的潜在用途:

正如我们所看到的,这是一个非常丰富和有趣的数据源。通过锻炼分析,可以绘制出各种与特定日期何时以及为何达到特定健身参数相关的洞察。

也有可能使用这些数据来创建一个关于健康水平的个人评分系统。一个跑步者可能想要记录每天、每周或每月跑的英里数,并使用这个方便的 API 自动调用 Google Fit。举重运动员可以记录每天锻炼的时间。骑自行车的人可以记录骑行的英里数。

此外,这些数据可以用来记录体重,作为减肥计划的一部分。最终,您需要一个非常具体的用例,希望在 Google sheet 中以表格格式保存这些数据,而不是在 Google Fit 应用程序中。

照片来自 Unsplash

结论:

今天,我们看到与锻炼相关的应用程序激增。然而,正如我在这里展示的那样,利用一点灵感和电子表格中的一些代码创建自己的锻炼数据应用程序是可能的——访问和使用锻炼数据可以帮助建立更健康的人,从而带来更健康的世界。

我如何用 Streamlit 建立一个机器学习平台

原文:https://towardsdatascience.com/how-i-built-a-machine-learning-playground-with-streamlit-3cddb7368ba9?source=collection_archive---------31-----------------------

从浏览器中修改模型

动力赖在 Unsplash 上拍照

我已经在工作中使用 Streamlit 几个星期了,我必须说这是一个神奇的工具。将您的 ML 代码作为原型进行运输和部署从未如此简单。

在对这个库进行实验时,我决定用它来创建一个附带项目,从浏览器上玩机器学习模型,这纯粹是出于教育目的,也是为了让机器学习经验较少的人熟悉模型。

在我的笔记本上构思设计的两个晚上后,游乐场诞生了。

作者 Gif

PS:由于我最近开始在 Youtube 上录制一些教程,你可以观看这个视频,了解更多关于我如何构建和部署这个应用的细节*

作者视频

PS*:代码在*Github上有。随意派生、克隆它,在本地运行它或者为你的任何项目重新利用它

*PS * * :app 直播。在这里检查一下https://share.streamlit.io/ahmedbesbes/playground/main/app.py并试用一下。

现在让我们看看这个应用程序是怎么回事😉

什么是游乐场?

Playground 是一个 Streamlit 应用程序,允许您直接从浏览器中修改机器学习模型。

因此,如果你是数据科学从业者,你绝对应该尝试一下😉

这个 app 的灵感来源于伟大的张量流 游乐场 。这里唯一的区别是,它解决了经典的机器学习模型。

它是如何工作的?

使用操场很简单

1 — 🗂️从预定义的列表中选择并配置数据集。您可以设置:

  • 样本数量
  • 列车上的噪声和测试数据

2— ⚙️您选择一个模型并设置其超参数。你可以从逻辑回归、决策树、随机森林、梯度推进、神经网络、朴素贝叶斯、KNNs 和 SVM 中选择一个模型

3 — 📉该应用程序会自动显示以下结果:

  • 训练和测试数据模型的决策边界
  • 训练和测试数据的性能指标(准确性和 F1 分数)
  • 模型的训练时间
  • 基于数据集定义和模型超参数生成 python 脚本以再现模型训练

4 — 对于每种型号,Playground 都提供了一个官方文档的链接以及一个技巧汇编列表

奖励点:该应用还提供了通过添加多项式特征来执行特征工程的能力。这被证明有助于线性模型,如非线性问题的逻辑回归。

你能从游乐场学到什么?

如果你是机器学习的新手,玩这个应用可能会(并且希望😄)让你熟悉基本概念,帮助你建立第一直觉。它不会取代教科书:它只是为了补充你的知识。就这样吧。

1.决策边界将(部分地)告诉你模型是如何运作的

通过检查决策边界,您将对每个模型的工作方式有更多的了解。出于教育目的,playground 将处理仅具有 2 个要素的数据集(但是在降维后,可以在多维数据集上获得相同的结果)

例如,您将看到逻辑回归用一条线(或一般情况下的超平面)分隔数据

线性回归—作者图片

而决策树根据特征值的连续条件对数据进行分类,其决策边界由水平线和垂直线组成。

决策树—作者图片

有趣的是,随机森林是多个决策树的集合,其决策边界看起来与决策树相似,但更平滑:这是随机森林使用的投票机制的结果。

随机森林——作者图片

2.你会感受到每个型号的速度

给定相同的数据集,您可以比较每个模型的速度,并获得哪个更快的感觉。在前面的图中,逻辑回归和决策树分别花费了 0.0040.001 秒进行训练,而随机森林花费了 0.154 秒。

尝试一个神经网络,它有 4 层,每层 100 个神经元:花费 0.253 秒。

神经网络——作者图片

3.特征工程可以有所帮助

在月球数据集上使用逻辑回归不会给你一个完美的 F1 分数,因为它是非线性的。

然而,通过添加多项式特征来增加维度会有所帮助:当使用逻辑回归时,尝试将多项式次数增加到 3,并注意决策边界是如何彻底改变的。

逻辑回归+特征工程—作者图片

4.一些模型比其他模型对噪声更鲁棒

*您可以通过在测试数据上设置更高的噪声来进行实验,**从而使其偏离列车分布。*针对此问题,梯度推进等一些模型比其他模型更稳定。

5.尝试不同的超参数组合

学习和验证你的直觉的一个很好的方法是实验,这就是这个应用程序的目的:它允许你修改一系列超参数(树深度、估计器数量、层数等),并立即看到决策边界、指标以及执行时间的结果。

去试试吧,希望你能从中有所收获!

在本地运行应用程序

要在本地运行这个应用程序,你必须确保你已经用 Python 3 安装了 pip。

  • 安装管道
*pip install pipenv*
  • 进入项目的文件夹并安装依赖项
*pipenv install*
  • 运行应用程序
*streamlit run app.py*

这将打开一个本地服务器,您可以通过 http://localhost:8051 访问该服务器

代码的结构

代码遵循以下结构:

  • app.py:启动 app 的主入口点
  • ui.py一组 UI 函数,用于显示应用程序的不同组件
  • functions.py:数据处理、模型训练和绘图功能列表
  • models/:定义每个模型的超参数选择器

请注意,ui.pyfunctions.py位于utils文件夹内。

如果你想了解代码,推荐看我上面的视频。

感谢阅读!🙏

如果你已经做到了这一步,非常感谢你的阅读!

Playground 是开源的,我希望随着时间的推移它会变得更好。因此,如果你想贡献自己的一份力量,请随时打开一个拉取请求或一个问题,如果你想在应用程序中看到一个功能。

我现在能想到的是:

  • 添加其他非线性数据集
  • 添加更多型号
  • 实施复杂的特征工程(正弦特征,交互项?)
  • 实现一个具有降维功能的自定义数据集读取器,这样您就可以检查您的数据
  • 添加要素重要性图和模型可解释性

但是如果你有其他的想法,我很乐意听听。

我如何建立一个人工智能文本到艺术的生成器

原文:https://towardsdatascience.com/how-i-built-an-ai-text-to-art-generator-a0c0f6d6f59f?source=collection_archive---------0-----------------------

一篇关于我如何建设 Text2Art.com 的详细、循序渐进的文章

text 2 生成艺术画廊[图片由作者提供]

概观

这篇文章是关于我如何在一周内建造了 Text2Art.com 的。Text2Art 是一个基于 VQGAN+CLIP 的 AI 驱动的艺术生成器,可以仅从文本输入生成各种艺术,如像素艺术、绘图和绘画。文章跟随我的思维过程,从尝试 VQGAN+CLIP,用 Gradio 构建简单的 UI,切换到 FastAPI 为模型服务,最后使用 Firebase 作为队列系统。请随意跳到您感兴趣的部分。

你可以在 text2art.com的尝试一下,这里是的源代码(随意启动回购)

Text2Art 演示(更新:我们现在有 15k+用户)

概述

  • 介绍
  • 它是如何工作的
  • 用 VQGAN+带代码的剪辑生成艺术
  • 用 Gradio 制作用户界面
  • 用 FastAPI 供应 ML
  • 基于 Firebase 的排队系统

简介

不久前,生成艺术和 NFT 风靡全球。这是在 OpenAI 在文本到图像生成方面取得重大进展后才成为可能的。今年早些时候,OpenAI 发布了一款功能强大的文本到图像生成器,效果非常好。为了说明 DALL-E 工作得有多好,这些是 DALL-E 生成的图像,带有文本提示“一个专业的高质量长颈鹿龙奇美拉插图”。模仿龙的长颈鹿。龙做的长颈鹿”。

DALL-E 制作的法师在得到文字提示“一个专业高质量的长颈鹿龙奇美拉插图”时。模仿龙的长颈鹿。龙做的长颈鹿。”[图片由拥有麻省理工学院许可证的 OpenAI 提供]

不幸的是,DALL-E 没有向公众发布。但幸运的是,DALL-E 魔术背后的模型 CLIP 反而出版了。剪辑或对比图像语言预训练是一个结合文本和图像的多模态网络。简而言之,CLIP 能够评估图片与标题的匹配程度,反之亦然。这对于引导生成器生成与文本输入完全匹配的图像非常有用。在 DALL-E 中,CLIP 用于对生成的图像进行排序,输出得分最高的图像(最类似于文本提示)。

片段评分图像和说明的示例[按作者分类的图像]

在 DALL-E 公布后的几个月,一个名为 VQGAN (矢量量化 GAN)的新变形金刚图像生成器发表了。将 VQGAN 与 CLIP 相结合,可获得与 DALL-E 相似的质量。自预先训练的 VQGAN 模型公开以来,社区已经创造了许多令人惊叹的艺术。

多船城市港口夜景画,战争中的难民画。[图片由作者生成]

我真的对结果感到惊讶,并想与我的朋友分享这一点。但由于没有多少人愿意钻研代码来生成艺术,我决定创建 Text2Art.com,一个任何人都可以简单地输入提示并快速生成他们想要的图像而不用看任何代码的网站。

它是如何工作的

那么 VQGAN+CLIP 是如何工作的呢?简而言之,生成器将生成图像,剪辑将测量图像与图像的匹配程度。然后,生成器使用来自剪辑模型的反馈来生成更“准确”的图像。这种迭代将进行多次,直到剪辑分数变得足够高,并且生成的图像与文本匹配。

VQGAN 模型生成图像,而 CLIP 指导这个过程。这是通过多次迭代完成的,直到生成器学会产生更“精确”的图像。【来源: T 何插图 VQGAN 作者:LJ Miranda

我不会在这里讨论 VQGAN 或 CLIP 的内部工作原理,因为这不是本文的重点。但是如果你想深入了解 VQGAN、CLIP 或 DALL-E,你可以参考我找到的这些令人惊叹的资源。

  • LJ Miranda 的插图 VQGAN:用很棒的插图解释 VQGAN。
  • Charlie Snell 解释的 DALL-E:从基础开始的伟大 DALL-E 解释
  • Yannic kil cher 的回形针讲解视频:回形针讲解

X +剪辑

VQGAN+CLIP 是一个简单的例子,说明了将图像生成器与 CLIP 相结合可以实现的功能。然而,你可以用任何类型的生成器替换 VQGAN,它仍然可以很好地工作,这取决于生成器。X + CLIP 的许多变体已经出现,如 StyleCLIP (StyleGAN + CLIP)、 CLIPDraw (使用矢量艺术生成器)、BigGAN + CLIP 等等。甚至有音频剪辑使用音频而不是图像。

使用 StyleCLIP 编辑图像[Source: StyleCLIP Paper

用 VQGAN+带代码的剪辑生成艺术

我一直在使用 dribnet 的 clipit 资源库中的代码,这使得使用 VQGAN+CLIP 生成艺术变成了简单的几行代码(更新: clipit 已经迁移到了 pixray )。

建议在 Google Colab 上运行,因为 VQGAN+CLIP 需要相当多的 GPU 内存。这里有一本 Colab 笔记本你可以跟着看。

首先,如果你在 Colab 上运行,确保你把运行时类型改成使用 GPU。

将 Colab 运行时类型更改为 GPU 的步骤。[图片由作者提供]

接下来,我们需要首先设置代码库和依赖项。

**from** **IPython.utils** **import** io
**with** io.capture_output() **as** captured:
  !git clone https://github.com/openai/CLIP
  *# !pip install taming-transformers*
  !git clone https://github.com/CompVis/taming-transformers.git
  !rm -Rf clipit
  !git clone https://github.com/mfrashad/clipit.git
  !pip install ftfy regex tqdm omegaconf pytorch-lightning
  !pip install kornia
  !pip install imageio-ffmpeg   
  !pip install einops
  !pip install torch-optimizer
  !pip install easydict
  !pip install braceexpand
  !pip install git+https://github.com/pvigier/perlin-numpy

  *# ClipDraw deps*
  !pip install svgwrite
  !pip install svgpathtools
  !pip install cssutils
  !pip install numba
  !pip install torch-tools
  !pip install visdom

  !pip install gradio

  !git clone https://github.com/BachiLi/diffvg
  %cd diffvg
  *# !ls*
  !git submodule update --init --recursive
  !python setup.py install
  %cd ..

  !mkdir -p steps
  !mkdir -p models

(注:“!”是 google Colab 中的一个特殊命令,这意味着它将在 bash 而不是 python 中运行该命令”)

一旦我们安装了库,我们就可以导入clipit并运行这几行代码来用 VQGAN+CLIP 生成你的艺术作品。只需随意更改文本提示。此外,您还可以给clipit一些选项,如迭代次数、宽度、高度、生成器模型、是否要生成视频等等。您可以阅读源代码以获得更多关于可用选项的信息。

使用 VQGAN+CLIP 生成艺术作品的代码

一旦你运行代码,它将生成一个图像。对于每次迭代,生成的图像将更接近文本提示。

基于“水下城市”较长迭代的结果改进。[图片由作者提供]

更长的迭代

如果您想生成一个更长的迭代,只需使用iterations选项,并将其设置为您想要的长度。例如,如果您希望它运行 500 次迭代。

clipit.add_settings(iterations=500)

生成视频

因为我们无论如何都需要为每次迭代生成图像,所以我们可以保存这些图像,并创建一个关于人工智能如何生成图像的动画。为此,您可以在应用设置之前简单地添加make_video=True

clipit.add_settings(make_video=True)

它将生成以下视频。

生成的“水下城市”GIF[图片由作者提供]

自定义图像大小

您也可以通过添加size=(width, height)选项来修改图像。例如,我们将生成一个分辨率为 800x200 的横幅图像。请注意,更高的分辨率将需要更高的 GPU 内存。

clipit.add_settings(size=(800, 200))

生成 800x200 图片,提示“幻想王国# art station”[图片由作者提供]

生成像素艺术

还有一个在 clipit 中生成像素艺术的选项。它在场景后面使用 CLIPDraw 渲染器,通过一些工程来强制像素艺术风格,例如限制调色板颜色、像素化等。要使用像素艺术选项,只需启用use_pixeldraw=True选项。

clipit.add_settings(use_pixeldraw=True)

生成的图像带有提示“盔甲骑士#pixelart”(左)和“中国奇幻电子游戏世界#pixelart”(右)[图片由作者提供]

VQGAN+剪辑关键字修改器

由于 CLIP 中的偏差,在提示中添加某些关键字可能会对生成的图像产生一定的效果。例如,在文本提示中添加“虚幻引擎”往往会生成逼真或高清的样式。添加某些网站名称,如“deviantart”、“artstation”或“flickr”,通常会使结果更加美观。我最喜欢的是使用“艺术站”关键字,因为我发现它产生最好的艺术。

关键词对比[ 图片由 kingdomakrillic

此外,您还可以使用关键字来调节艺术风格。例如,关键字“铅笔素描”,“低聚”,甚至艺术家的名字,如“托马思·金凯德”或“詹姆斯格尼”。

Artstyle 关键字比较。[ 图片由 kingdomakrillic 提供

要了解更多关于各种关键词的效果,您可以查看 kingdomakrillic 的完整实验结果,它显示了使用相同 4 个主题的 200 多个关键词的结果。

用 Gradio 构建 UI

我部署 ML 模型的第一个计划是使用 Gradio 。Gradio 是一个 python 库,它将 ML 演示的构建简化为几行代码。使用 Gradio,您可以在不到 10 分钟的时间内构建一个演示。此外,您可以在 Colab 中运行 Gradio,它将使用 Gradio 域生成一个可共享的链接。您可以立即与您的朋友或公众分享此链接,让他们试用您的演示。Gradio 仍然有一些限制,但我发现当你只想演示一个函数时,它是最合适的库。

gradio UI[图片由作者提供]

这是我为 Text2Art 应用程序编写的简单 UI 代码。我认为代码是不言自明的,但是如果你需要更多的解释,你可以阅读 Gradio 文档。

构建 Gradio UI 的代码

一旦你在 Google Colab 或 local 中运行它,它将生成一个可共享的链接,使你的演示可以公开。我发现这非常有用,因为我自己不需要像 Ngrok 一样使用 SSH 隧道来分享我的演示。此外,Gradio 还提供托管服务,您可以永久托管您的演示,每月仅需 7 美元。

Gradio 演示的可共享链接。[图片由作者提供]

然而,Gradio 仅适用于演示单一功能。创建一个带有额外功能的自定义站点,比如图库、登录,甚至只是自定义 CSS,都是相当有限的,或者根本不可能。

我能想到的一个快速解决方案是创建一个独立于 Gradio UI 的演示站点。然后,我可以使用 iframe 元素在站点上嵌入 Gradio UI。我最初尝试了这种方法,但后来意识到一个重要的缺点,我不能个性化任何需要与 ML 应用程序本身交互的部分。例如,输入验证、自定义进度条等功能在 iframe 中是不可能实现的。这是我决定建立一个 API 的时候。

用 FastAPI 服务 ML 模型

我一直使用 FastAPI 而不是 Flask 来快速构建我的 API。主要原因是我发现 FastAPI 写起来更快(代码更少),而且它还自动生成文档(使用 Swagger UI ),允许我用基本 UI 测试 API。另外,FastAPI 支持异步函数,据说比 Flask 更快。

通过在 URL 中添加/docs/来访问 Swagger UI

在 Swagger UI 中测试 API 图片由作者提供]

下面是我编写的代码,它将我的 ML 函数作为 FastAPI 服务器。

API 服务器的代码

一旦我们定义了服务器,我们就可以使用 uvicorn 运行它。此外,因为 Google Colab 只允许通过 Colab 接口访问他们的服务器,所以我们必须使用 Ngrok 向公众公开 FastAPI 服务器。

运行和公开服务器的代码

一旦我们运行了服务器,我们就可以进入 Swagger UI(通过在生成的 ngrok URL 上添加/docs)并测试 API。

使用 FastAPI Swagger UI 生成“水下城堡”

在测试 API 时,我意识到根据质量和迭代次数的不同,推断可能需要大约 3-20 分钟。对于 HTTP 请求来说,3 分钟本身已经被认为很长了,用户可能不想在站点上等待那么长时间。由于推理时间较长,我认为将推理设置为后台任务并在结果出来后给用户发电子邮件可能更适合这个任务。

既然我们决定了计划,我们首先将编写发送电子邮件的函数。我最初使用 SendGrid 电子邮件 API 来完成这项工作,但在用完免费使用配额(100 封电子邮件/天)后,我改用 Mailgun API,因为它们是 GitHub 学生开发包的一部分,允许学生每月发送 20,000 封电子邮件。

下面是使用 Mailgun API 发送带有图像附件的电子邮件的代码。

使用 Mailgun API 发送电子邮件的代码

接下来,我们将修改我们的服务器代码以使用 FastAPI 中的后台任务,并在后台通过电子邮件发送结果。

有了上面的代码,服务器将很快用“任务在后台处理”消息来回复请求,而不是等待生成过程完成,然后用图像来回复。

一旦该过程完成,服务器将通过电子邮件向用户发送结果。

图像和视频结果通过电子邮件发送给用户。[图片由作者提供]

现在一切似乎都正常了,我建立了前端,并与我的朋友们分享了这个网站。然而,我发现在对多个用户进行测试时存在并发问题。

当第二个用户在第一个任务仍在处理时向服务器发出请求,第二个任务会以某种方式终止当前进程,而不是创建一个并行进程或队列。我不确定这是什么原因造成的,可能是在 clipit 代码中使用了全局变量,也可能不是。我没有花太多时间调试它,因为我意识到我需要实现一个消息队列系统。

在消息队列系统上谷歌搜索了几下后,大多数都推荐 RabbitMQ 或者 Redis。然而,我不确定 RabbitMQ 或 Redis 是否可以安装在 Google Colab 上,因为它似乎需要sudo的许可。最后,我决定使用 Google Firebase 作为队列系统,因为我想尽快完成这个项目,而 Firebase 是我最熟悉的一个。

基本上,当用户试图在前端生成一个艺术时,它会在一个名为queue的集合中添加一个条目来描述任务(提示、图像类型、大小等)。另一方面,我们将在 Google Colab 上运行一个脚本,该脚本持续监听queue集合中的新条目,并逐个处理任务。

处理任务并持续监听队列的后端代码

在前端,我们只需在队列中添加一个新任务。但是确保你已经在你的前端做了一个合适的 Firebase 设置。

db.collection("queue").add({
        prompt: prompt,
        email: email,
        quality: quality,
        type: type,
        aspect: aspect,
        created_at: firebase.firestore.FieldValue.serverTimestamp(),
})

完成了!现在,当用户试图在前端生成 art 时,它会在队列中添加一个新任务。Colab 服务器中的 worker 脚本将逐个处理队列中的任务。

你可以查看 GitHub 回购来查看完整的代码(随意开始回购)。

在前端队列中添加新任务[图片由作者提供]

Firebase 中的队列内容[图片由作者提供]

如果你喜欢我的文章,看看我的其他文章!

也可以在 Linkedin 上和我联系。

https://www.linkedin.com/in/mfathyrashad/

参考

[1]https://openai.com/blog/dall-e/

https://openai.com/blog/clip/

[3]https://ljvmiranda 921 . github . io/notebook/2021/08/08/clip-vqgan/

https://github.com/orpatashnik/StyleCLIP

[5]https://towards data science . com/understanding-flask-vs-fastapi-we b-framework-Fe 12 bb 58 ee 75

我如何在完全没有机器学习的情况下构建一个图像分类器

原文:https://towardsdatascience.com/how-i-built-an-image-classifier-with-absolutely-no-machine-learning-1480d77d9d3f?source=collection_archive---------19-----------------------

实践教程

你并不总是需要先进的 ML/DL 算法来达到 93.75%的准确率

来自 Pexels 的照片

“这个解决方案看起来很有希望,但是让我们回到您的问题上来。部署此解决方案的投资可能有点太高了。”

我很失望。我们都知道那最终意味着什么。

我们怎么会没想到呢?我们过分关注解决方案的准确性和性能,忽略了基础设施成本。

那时,我意识到我需要学习和应用传统的图像处理技术,这些技术不像高级机器学习方法那样需要大量的计算和基础设施成本,但仍能提供可接受的性能水平。

那么我们如何使用传统的图像处理来解决问题呢?我不是计算机视觉专家,但我学到了一些东西,我将与你分享。

作品集项目:昼夜图像分类器

出于显而易见的原因,这与我之前谈到的问题不同,但我们可以说它有些相似。

我们建立了一个简单的分类器,给定一幅图像,它可以正确地识别这是白天还是夜晚的图像。大多数基于现实世界视觉的系统都需要区分白天和黑夜。

将此作为我的项目组合之一后,我不断收到面试官对基本思维过程的积极回应。我相信你会从你的投资组合中受益。

这个项目的数据是从 AMOS 数据集(许多室外场景的存档)中提取的 400 张图像。这些是 RGB 颜色的,包含 200 个白天和晚上的课程——感谢 Udacity 在他们的计算机视觉纳米学位中整合了这个项目。

白天还是晚上?我们来问一下分类器。(像素上的图像像素)

接下来的代码,包括数据集,可以在 GitHub 库中找到。分支存储库将会给你所需要的一切。

我采取了 5 个步骤的方法,对每一步都有清晰的解释。到本文结束时,您将对这个项目所采用的计算机视觉管道有一个深入的了解。

我们开始吧?

步骤 1:加载并可视化数据。

我们在目录中有一组图像。我们的任务是以常规方式加载它和它们的标签,以便它可以用于可视化并在以后构建分类器。

在 Python 中,glob 模块用于检索与指定模式匹配的文件/路径名。使用 matplotlib 的图像模块,我们可以将图像读入内存。

我们需要可视化来更好地理解数据。将相关目录传递给上面的函数将加载数据,使用 matplotlib 的imshow()函数,我们可以将图像可视化。对数据有一个正确的理解只会对你有所帮助。

# Load training data
IMAGE_LIST = load_dataset(image_dir_training)# Select an image and its label by list index
image_index = 49
selected_image = IMAGE_LIST[image_index][0]plt.imshow(selected_image);

作者图片

  • 注意到这些图像之间的任何可测量的差异了吗?这有助于以后分离图像类别。
  • 注意到不同的图片有不同的大小了吗?当您想要应用任何图像处理(或深度学习)时,这并不理想。

第二步:数据预处理。

对于各种视觉问题,预处理至关重要。由于拍摄图像时光线水平和其他因素的变化,图像通常不均匀,难以提取特征。

让我们开始基本的预处理工作,比如标准化图像大小和编码图像标签。

代码是不言自明的。我们将所有图像的尺寸调整为标准尺寸(1100,600)。不一定要选择这个形状,但是无论选择哪个形状,都需要在整个项目中保持不变。

大多数分类问题要求我们用数字格式表示目标类。我们可以使用编码来实现这一点——一个简单的一键编码,其中 1 用于白天图像,0 用于夜晚图像。

我们将encode()standardize_input()函数包装成preprocess()函数,并用它来标准化我们的图像。既然我们已经加载并预处理了我们的图像,我们就可以从图像中提取特征了(管道中有趣的部分!).

第三步:提取特征。

为了从图像中提取特征,我们需要了解图像的一些基本属性。

我们需要提取能够区分白天图像和夜晚图像的特征。当你面临分类挑战时,你可能会问自己:我如何区分这些图像?

我想到的一个特点是,大多数白天的照片都有明亮的蓝天,而且通常更加明亮。在夜间图像中,唯一的光源是一些人造光,背景相对较暗。

我们可以利用这个特性,看看我们是否可以测量它,使它成为一个可以区分阶级的特征。

平均亮度作为一个特征

为了量化图像的平均亮度,我们首先需要了解**色彩空间。**第一次听说这个概念的时候,我很迷茫,所以请慢一点,更用心的看完这个。

图像视为数字网格是许多图像处理技术的基础。图像中的每个像素只是一个数值,我们也可以改变这些像素值。这些像素只有一种颜色,由颜色空间表示。

最常见的色彩空间是 RGB ,代表红色、绿色和蓝色三个通道。因此,图像中的每个像素都可以用 RGB 颜色空间中的这 3 个数字来表示。但是也有其他有用的颜色空间。

例如,另一个颜色空间是HSV——代表色调、饱和度和值。这三个分量随着图像各种事物而变化:

  • 色调在阴影下甚至高亮度下保持一致。
  • 在不同的光照条件下变化最大。
  • 饱和度描述特定颜色的灰色量。

有了这些信息,我们现在可以回去推导平均亮度。怎么会?以下是我们将遵循的步骤。

  1. 将图像转换到 HSV 颜色空间(正如我们上面解释的,值通道是亮度的近似值)
  2. 将值通道中所有像素的值相加
  3. 将亮度总和除以图像面积,图像面积就是宽度乘以高度。

这给了我们一个值:图像的平均亮度。这是一个可测量的值,可以用作手头分类问题的一个特征。让我们在一个函数中实现这些步骤。

我们可以创建更多的特性,但是对于这个例子,让我们保持简单。现在我们有了一个特性,我迫不及待地想和你一起构建分类器。

步骤 4:构建分类器。

我们已经如此习惯于先进的机器学习算法;我们忘记了分类器的主要功能。就是把两个班分开。我们定义了一个特征,我们需要一种基于该特征来分离图像的方法。

分类器可以像条件语句一样简单,它检查平均亮度是否高于某个阈值(T17),然后将该图像标记为 1(白天),如果不是,则标记为 0(夜晚)。

让我们实现这个功能,好吗?

不过,有一个问题,什么是可接受的阈值?通常我们寻求领域专家的建议来理解这些值,但是这里因为我们有足够的训练图像,我们可以用它们来估计一个。

我们的下一个任务是调整阈值,理想情况下在 0–255 的中间。我尝试了不同的值,并用各种训练图像进行检查,看看我是否正确地对图像进行了分类。最终,我勉强接受了 99。

现在我们已经建立了一个分类器,让我们看看如何评估模型?

步骤 5:评估分类器。

每个模型都需要根据看不见的数据进行评估。还记得我们为测试保留的数据吗?我们需要通过分类运行测试图像,并评估模型的准确性。

为了找到模型的准确性,我们需要找到错误分类图像的数量。这样做相当简单。我们编写了一个函数,它获取带有真实标签和阈值的图像,使用分类器预测标签,并将其与实际标签进行比较。

既然我们已经编写了函数,我们需要确保测试图像的预处理方式与训练图像相同。

你知道我得到的最终精度值吗?**惊人的 93.75%!**根据您之前选择的阈值,该值可能会波动,因此可以随意调整参数并进行试验。

对此的改进是从图像中创建更多的特征,并将它们添加到分类器中,以进行更鲁棒的分类。

现在我知道这是一个小得多的数据集的简单问题;然而,这表明我们仍然可以在不使用昂贵的高级机器学习算法的情况下解决计算机视觉问题。有时传统的图像处理是你所需要的。

最后的想法

我们在计算机视觉管道中寻找日夜分类器的投资组合项目。我们在整个流程中使用了一步一步的方法来构建这个分类器。

  • 加载和可视化数据
  • 数据预处理
  • 提取特征
  • 构建分类器
  • 评估分类器

我们在整篇文章中实现了代码,编译后的版本可以在 GitHub 库中的获得。

感谢您一直关注这篇文章;如果你有任何问题或反馈,欢迎在 LinkedIn 上打招呼。

该项目的重点是展示传统方法的价值,并认识到先进的机器学习并不总是可行的。

这是对我们自己的现实检查,我们倾向于采用高级机器学习方法,因为它通常会带来更高的性能,但往往是以昂贵的计算能力为代价的。

现在,我探索各种方法,并在开发产品之前评估可解释性、基础设施、性能和成本之间的权衡。

从那以后我再也没有听到过客户说不。

想了解更多关于进入数据科学、有趣的合作和指导的有用见解,请考虑 加入我的电子邮件好友私人列表

我如何在 AWS 上为 Apache Airflow 中的数据管道构建 CI/CD

原文:https://towardsdatascience.com/how-i-built-ci-cd-for-data-pipelines-in-apache-airflow-on-aws-aae029fe557e?source=collection_archive---------11-----------------------

现代数据工程需要自动化部署流程

来自 Pexels | 品牌内容披露

A pache Airflow 是构建数据工程工作负载的常用平台。部署气流的方式如此之多,以至于很难提供一个简单的答案来说明如何建立一个持续的部署过程。在本文中,我们将重点关注作为“DAG 存储”的 S3,并演示一种实现健壮的 CI/CD 管道的简单方法。

目录

在 AWS 上创建 Apache Airflow 环境
Git 存储库
为数据管道构建简单的 CI/CD
在 Airflow 中测试数据管道的 CI/CD 流程
我们如何让 CI/CD 管道在生产中更加健壮?
Buddy 如何处理代码的变更?
数据管道自动化部署流程的优势
如果您使用不同于 Apache Airflow 的工作流编排解决方案会怎样?
结论

演示:在 AWS 上创建 Apache 气流环境

自 2020 年 12 月起,AWS 为阿帕奇气流提供名为 MWAA 的全面托管服务。在本演示中,我们将构建一个 MWAA 环境和一个持续交付流程来部署数据管道。如果您想了解更多关于 AWS 上的托管 Apache 气流的信息,请阅读下面的文章:

我们从在 AWS 管理控制台中创建一个气流环境开始。整个过程是自动化的,你只需要点击一个按钮来部署一个 CloudFormation 堆栈,它将创建一个 VPC 和所有相关的组件,然后填充一些关于你想要构建的实际环境的细节。环境类,工人节点的最大数量)。

在自动气象站上配置 MWAA 气流环境—图片由作者提供

一旦创建了环境,我们就可以通过构建一个连续的交付流程来开始部署我们的数据管道,该流程会自动将 Dag 推送到适当的 S3 位置。

Git 储存库

对于这个演示,我们将使用一个简单的设置,它将只包括开发和主分支。这样,在推送到dev分支时,我们可以自动部署到我们的 AWS 开发环境。

演示 Git 存储库—作者图片

为数据管道构建简单的 CI/CD

要在短短五分钟内构建一个 CD 进程,我们将使用 Buddy 。如果你想试试,自由层允许最多五个项目。

#1.创建一个新项目并选择您的 Git 托管提供商。对我们来说,是 Github:

在 Buddy 中构建 CI/CD 管道—作者图片

#2.添加一条新管道。这表明在同一个项目中可以有几个管道。例如,您可以有一个部署到开发(dev) 的管道,一个部署到用户验收测试(uat) 的管道,以及一个部署到生产(prod) 环境的管道。

在 Buddy 中建立 CI/CD 管道—图片由作者提供

#3.配置管道应触发。对于这个演示,我们希望代码在每个dev分支时被部署到 S3。

在好友中构建 CI/CD 管道—图片由作者提供

#4.新增一个动作。在这里,我们可以为部署流程添加所有构建阶段。对于这个演示,我们只需要一个将代码上传到 S3 桶的过程,但是你可以从各种动作中选择来包含额外的单元和集成测试等等。现在,我们选择动作*“将文件传输到 Amazon S3 bucket”*,并配置从 Git 文件夹dags对 Python 文件的任何更改都应该触发到我们选择的 S3 bucket 的部署。

配置“操作”将代码上传到 S3 —图片由作者提供

#5.配置附加的**“选项”**以确保正确的文件类型将被上传到正确的 S3 子文件夹。对于此演示,我们希望我们的 DAG 文件将部署到文件夹dags中,如下所示:

S3 位置—作者图片

通过使用相同的动作,转到右侧的**“选项”**选项卡,在 S3 上配置远程路径:

在 Buddy 中构建 CI/CD 管道—图片由作者提供

选择适当的 S3 路径后,我们可以测试并保存动作。

可选地,我们可以指定忽略特定的文件类型。例如,我们可能想要排除单元测试( test* )和文档降价文件( *)。md ):

在 Buddy 中建立 CI/CD 管道—图片由作者提供

#6.这一步是可选的,但是如果在部署过程中出现问题,通知是很有用的。我们可以配置几个动作,如果 CI/CD 管道出现问题,就会触发这些动作。

在好友中建立 CI/CD 管道—图片由作者提供

我们选择在行动失败时通过电子邮件获得通知:

在好友中发送失败通知——图片由作者提供

在气流中测试数据管道的 CI/CD 过程

我们现在准备将一个示例数据管道推到我们的环境中。我们可以看到,最初,我们没有 Dag。

气流 image 图片作者

我们现在将两个新文件推送到dev分支——其中一个是 DAG 文件,另一个是应当排除的 markdown 文件

测试 CI/CD 管道的初始推送—图片由作者提供

因为我们是分别提交和推送的,所以我们可以看到,每次 Git 推送都会触发一次管道:

在好友中触发的 CI/CD 管道—图片由作者提供

我们可以确认只有 Python 文件被推送到 S3:

AWS 上气流数据管道的 CI/CD 管道—图片由作者提供

AWS 上的 MWAA 气流环境自动选择了来自 S3 的 DAG:

AWS 上气流数据管道的 CI/CD 管道—图片由作者提供

我们的演示到此结束。

我们如何让 CI/CD 渠道在生产中变得更加强大?

如果您想在您的管道中包含一个额外的批准步骤,您可以在代码被推送到 S3 之前,在 Buddy 中添加一个相应的**“等待批准”**动作。为了更方便,我们还可以添加一个动作给负责生产环境的高级开发人员发送一封关于构建过程的电子邮件。然后,代码只有在事先批准后才能部署。

添加两个附加操作来通知构建过程,并添加手动批准步骤—按作者分类的图像

Buddy 如何处理代码的更改?

你可能会问:Buddy 是如何处理代码变更的?每次我们对存储库进行任何更改时,它会重新上传您的所有 Dag 吗?答案是否定的。初始 CI/CD 管道的执行将从指定的存储库路径上传所有文件。然而,每个后续的执行都使用**“git diff”**来创建变更集。基于diff,在 S3 中只有被添加、修改或删除的文件才会被更改。

删除是一个特例,Buddy 允许我们配置在 Git 中删除一个文件是否也应该删除远程服务器(S3)上的代码。对于这个演示,我们选择删除文件,以确保所有东西(包括 Dag的删除)都通过 Git。但是您可以根据自己的意愿自由配置它。

如何处理 Git 存储库中删除的文件——作者图片

数据管道自动化部署流程的优势

由于 Apache Airflow 在撰写本文时不提供 DAG 版本控制,这种 CI/CD 管道方法允许您通过 Git 提交历史记录跟踪对 DAG 所做的任何更改。此外,您还获得了一个标准化的、可重复的流程,该流程消除了手动部署中的人为错误,并确保除非在您的 Git 存储库中进行了版本控制,否则不会部署任何东西。

如果您使用不同于 Apache Airflow 的工作流编排解决方案会怎样?

如果您喜欢使用开源工作流编排工具而不是 Airflow,您也可以使用 Buddy 来管理这些数据管道的构建过程。例如,Prefect 或 Dagster 都利用 GraphQL 并支持容器化环境,这使得自动化数据工程工作负载的部署变得简单。

结论

本文研究了如何在 Apache Airflow 中为数据管道构建 CI/CD 流程。现代数据工程需要自动化部署流程。始终使用版本控制系统来管理您的代码并基于您的 Git 工作流自动化构建过程是一个很好的实践。

感谢您的阅读!如果这篇文章有用, 关注我 看我下一篇帖子。

我如何构建我的 ML 工作站🔬

原文:https://towardsdatascience.com/how-i-built-my-ml-workstation-f799c1de0341?source=collection_archive---------5-----------------------

关于构建定制 ML 工作站的完整故事。从零件挑选到软件安装和使用。

我试图打开工作站部件

Kaggle 内核和 Google Colab 都很棒。

如果这篇文章不是关于构建一个定制的 ML 工作站,我会在这里放下话筒。

总有一些“但是”让我们的生活更加艰难。当你开始处理接近现实生活的问题时,你会看到数百亿字节的大型数据集,你的直觉开始告诉你,你的 CPU 或 AMD GPU 设备不足以做有意义的事情。我就是这样来到这里的。

我正在参加 Kaggle 上的人类蛋白质图谱(HPA)——单细胞分类比赛。HPA 数据集包含近 150Gb 的 8 位 4 通道蛋白质图像。数据集的 16 位变体可容纳 350Gb。

以下是我手头的资料:

  • MacBook Pro 2019(英特尔酷睿 i9 和英特尔 UHD 显卡 630 1536MB 和 16GB DDR4)
  • Kaggle 内核每周约 30 小时 GPU 和/或约 30 小时 TPU 时间

听起来不错。我认为我将能够在本地制作原型,然后在云 GPU 上执行笔记本。什么会出错?

没有 GPU 的生活

事实证明,在提到的工作流程中有很多摩擦。

首先,我的解决方案源代码很快就变成了一个拥有大量源代码和依赖项的完整项目。我使用诗歌作为包管理器,并决定每当我对项目进行有意义的更改时生成一个可安装的包,以便在云中测试它们。我把这些可安装的包上传到一个私有的 Kaggle 数据集,这个数据集又被安装到一个笔记本上。笔记本正在调用包中的类和函数。

这种方法原来有水下石头。Kaggle 笔记本安装项目包后随机抛出怪异错误。我认为这与依赖版本不匹配有关,我发现了类似“在包 Y 中找不到方法 X”等错误。自动加载没有帮助。连续几个早晨,我开始了一天的工作,处理新的和新的突然出现的神秘问题。

在比赛期间,我从 Keras 转到 PyTorch。PyTorch 在 CPU 上比 TensorFlow 或者 Keras 慢很多。甚至对我最近的更改进行开发运行都非常耗时。然而,PyTorch 在学术和其他 ML 相关的社区中有突出的支持,这意味着一堆(几乎)最新技术的阅读使用范例。

此外,当你在云中运行你的代码时,你不能轻易试验。你必须计划好你要试验的东西,并事先让这些地方变得可配置。

总而言之,这次经历令人沮丧。我清楚地意识到,如果我想做更复杂的深度学习实验和项目,那么我只需要全天候访问任何类型的 GPU。

调查

我从未对定制 PC、硬件或游戏感兴趣。所以我花了一段时间才明白我做一台定制机花了多少钱。

有很多关于构建游戏电脑的资源。虽然构建深度学习工作站听起来像是一项类似的任务,但为了构建一台具有成本效益和 ML 兼容性的机器,应该考虑一些细微差别。

我发现了一些有用的博客帖子,它们帮助我迅速掌握了这个话题。特别是,我可以强调来自 Tim Dettmers 的两个帖子:

  • 深度学习全硬件指南
  • 深度学习用哪个(哪些)GPU:我在深度学习中使用 GPU 的经验和建议

在他的博客中,Tim 详细解释了 ML 工作站的每个 PC 部件的重要性,并提供了选择它们的一般建议。在这里,我将提到对我有帮助的信息以及 Tim 没有关注的细节。

此外, PCPartsPicker 的 Builder 在规划 PC 期间非常有用。它建议了可能的组件兼容性以及在订购列表之前需要检查的内容。这有助于克服我一直以来的恐惧,我可能会买一些不能一起工作的东西。

ML 构建的零件

在构建深度学习机器(或任何定制 PC)时,有 8 个部分应该考虑:

  • GPU
  • 主板(又名 MoBo)
  • CPU
  • 闸板
  • 存储
  • 电力系统单元(PSU)
  • 冷却
  • 电脑案

以下是一个概述:

国家政治保卫局。参见 OGPU

GPU 是任何 ML 工作站的关键组件。它被设计成并行地对大块数据(吞吐量优化)执行计算,这使得它非常适合真正需要的模型训练或推理(细节在此)。

首先要考虑的是,我们只需要 NVIDIA 显卡用于深度学习。不幸的是,ML 框架世界存在垄断。大多数流行的和生产就绪的框架(TensorFlow、PyTorch、Keras)都是为支持 CUDA 的设备设计和优化的。CUDA 是 NVIDIA 拥有的用于并行计算的专有平台和 API 集。这就是我们在 ML 环境中谈论 GPU 时使用“CUDA 卡”的原因。

稍微深入一点简化的 CUDA 架构是有意义的。现代 GPU 基于张量核**,能够在一次运算中乘以 4x4 矩阵,速度极快。尽管如此,张量核需要数据来进行计算。为了有效地加载数据,数据通过以下方式传递:**

  • 从 RAM 到全局 GPU 内存。CPU 线程将预处理批处理加载到完全独立的 GPU 设备内存中(不要与 PC RAM 混淆)。设备内存是 GPU 中最慢的一种内存。
  • 从全局 GPU 内存到共享内存。共享内存比全局 GPU 内存快10-50 倍**,但它也小得多(通常是数百 kb)。这种内存完全可用于流多处理器(SM ),它是 GPU 架构中 CPU 内核的模拟。数据存储在所谓的瓦片中。**
  • 从共享内存到张量核心注册表。流式多处理器并行操作其张量核,并将部分切片上传到张量核注册表中。

因此,数据加载流程中的任何瓶颈都将导致张量核的次优利用,无论您的 GPU 中有多少个张量核。

CUDA 硬件架构(来源,附图片作者权限)

也就是说,这些大致是对 ML 任务重要的主要 GPU 特性:

  • 全局 GPU 内存 —定义在训练期间可以使用的批量大小,或者在计算机视觉方面可以使用的样本质量
  • 内存带宽 —设备内部传输数据的速率
  • 建筑 —越新的建筑越好。较新的架构在共享内存大小、功能集(如混合精度计算)方面可能更好,在每有效计算瓦特数指标方面可能更高效。

此外,您应该考虑这些因素:

  • 单位成本性能
  • GPU 散热
  • GPU 瓦数

谢天谢地,你可以在 Tim 的文章中找到更多的信息。

母板

主板集成了大多数组件,还提供:

  • 大多数 I/O 端口(如 USB、以太网等)
  • 带 BIOS 的芯片组
  • WiFi、蓝牙适配器

主板提供其他接口为你的东西供电。其中,最重要的一个是 CPU 插座。主板分为不可互换的 AMD 和 Intel 兼容插座。因此,你需要确保你选择的 CPU 与你的主板兼容。

PCI 端口的数量是另一个需要考虑的事情。由于 PCI 端口用于连接 GPU,因此您需要提前规划您的构建和升级空间(例如,为了能够在将来添加更多的卡)。另外,请注意,图形卡实际上占用了不止一个插槽的空间。我们希望卡之间有尽可能多的空间,以便更好的空气冷却**。**

此外,我很肯定你会很高兴有内置的 WiFi 适配器。否则,连接 PC 的唯一方法是通过以太网电缆,这并不总是很方便(或者只需购买外部适配器)。

中央处理器

CPU 是 GPU 的“左右手”。在 ML 版本中,CPU 用于:

  • 预处理数据集
  • 将批次载入 RAM
  • 将批处理从 RAM 传输到 GPU 全局内存
  • 运行 GPU 设备中的功能

所以 CPU 频率高其实没什么帮助。尽管如此,能够有效地并行执行小任务还是很重要的。换句话说,线程和内核的数量是 ML 机器的重要属性。

随机存取存储

说到 RAM,内存容量才是最重要的。如果有足够的内存来运行模型训练而不退回到交换**,那就完美了。更大的容量将允许运行更大批量的数据和执行更多的数据加载器,以减少 GPU 的等待时间。**

RAM 在数据处理和特征工程中也很有帮助。因此,内存越大,对你越好。

储存;储备

在深度学习中,存储用于持久化数据集**。因为现在数据集是以千兆字节来衡量的,所以至少有几兆字节的空闲磁盘空间是很好的。一般来说,人们安装 SSD 是为了满足操作系统的需求和当前正在使用的数据集。硬盘仍然很有帮助,因为它比固态硬盘便宜,而且更容易负担存储其他数据集的 TB 空间。**

在固态硬盘中,你可以在市场上找到使用更快连接协议的 NVMe 固态硬盘。如果你买得起的话,我更喜欢这种固态硬盘。

电力系统单元

PSU 让你的电脑充满活力。为了选择你的 PSU,你需要计算你的产品的瓦数消耗。通常有两个最耗电的组件: CPU 和 GPU。如果您将它们的功耗相加,并在此基础上再加上 10–15%的功耗(对于其他组件、超频等),您将大致估算出您的功耗需求。我还使用 PCPartpicker Builder 来估算我的电脑功率。

除此之外,您应该考虑 PSU 提供的插槽和连接器的数量。

这是你可以提前计划的地方。考虑到功耗和连接器,只需包括您将来想要购买的潜在 GPU。

冷却

随着巨大的能量而来的是巨大的冷却责任需求。

通常,你需要一个空气冷却系统。确保 GPU 之间有足够的空间是一个很好的冷却系统的无开销方法。它在 1–2 个 GPU 设置中特别好。水冷是 3+GPU 设置的好选择。

CPU 可能会很快变热。所以它们通常和基本的冷却器一起出售。如果你能在热凝胶安装过程中避免大量气泡,这就足够了。如果你想换一个更好的冷却器,确保新的冷却器支持你的 CPU 插座。

电脑机箱

计算机机箱保护所有组件免受外部环境的影响。此外,它还可以提供:

  • 附加系统冷却器
  • 附加 I/O 端口 (USB、C 型等)
  • 电缆管理
  • GPU 垂直插槽
  • 【SATA 磁盘插槽
  • 很酷的设计和外观(嗯,这可能很重要)

最重要的考虑之一是容纳所有冷却系统和 GPU 的能力。如果你的案子太小,可能会有问题。

我的零件清单

创建多 GPU 集群不在我的列表中。然而,我仍然希望有改进的空间。因此,我从 Tim 的模板中选择了2-GPU 准系统作为我的工作站的基础,并对其进行了一些调整,以匹配我在当地市场上可以找到的东西。这是我最后的组件列表:

  • GPU: 千兆 GeForce RTX 3070 8Gb Aorus Master
  • 数学板: MSI x470 游戏升级版
  • CPU: AMD 锐龙 5 3600
  • RAM: G.Skill Ripjaws V 系列 32Gb (2 x 16Gb)
  • 存储:三星 970 Evo 500 GB m . 2–2280 NVME
  • 散热:酷派大师 Hyper 212 黑色版
  • PSU: EVGA G2 750W 80+金
  • 电脑机箱: NZXT H510
  • 无线适配器: TP-Link 阿彻 T2U Plus

相同的列表可以在 PCPartsPicker 上找到。

关于我的列表与原始准系统相比的一些不同之处。根据 Reddit 用户的建议,我更换了准系统的 PSU 和冷却器,他们说改变的部分更现代。

还有,我只能买到 750W 版本的 EVGA G2。我估计的瓦数是 420W,所以 650W 的版本应该够用了。然而,更强大的 PSU 在进一步的部件更新方面提供了更大的灵活性。

GPU 的情况要复杂得多。这是 GPU 短缺的开始(2020 年底-2021 年初),GPU 价格飙升了两倍甚至三倍。在这段时间里,比特币跃升至近 6 万美元,以及影响供应链和增加 GPU 需求的其他因素(主要是全球新冠肺炎锁定)。

GPU 价格动态:2020 年底-2021 年初。狂野时光(图片作者

我已经密切关注价格更新 3 个月了。情况并没有真正改变。我在等的时候情况变得更糟了。

考虑到蒂姆的建议和疯狂的 GPU 价格,我拍摄 RTX 3070。RTX 2080 Ti 也非常适合,但市场很快就卖完了。

原来有很多厂商生产 RTX 3070 卡。

基本上,主要区别在于:

  • 马克斯·鲍威尔极限 —影响 GPU 性能。
  • 卡冷却系统的质量 —冷却卡并长时间保持性能的能力。
  • 风扇噪音(Fan Noise)——运行有噪音的卡很烦人(尤其是当你在一个有其他人工作或生活的地方工作时)。

硬件安装

我花了几周时间收集所有零件。

电脑零件到了。我想我可以用这些盒子建一座新房子。请继续关注更多更新(作者的图片)

在拆箱之前,请记住以下几点:

  • 您需要释放手上的静电**。静电会损坏您的组件,尤其是您的主板。幸运的是,这很容易做到。你需要定期触摸任何金属物体,如电脑机箱、加热器或文件柜。如果你觉得偏执,有专用腕带给你。**
  • 安装或连接组件时要小心。零件和电缆设计为易于连接。如果你发现自己按得太多**,这很可能是一个信号,让你重新审视你试图连接的东西以及如何连接。例外发生了,因为你可能会买一些从来没有联系过的新东西。**

现在是我们动手的时候了!

母板

主板是一个核心组件。于是我开始从中拆箱。

主板拆箱(作者图片)

它有许多端口,我们将在本节中进一步使用。

主板。详细视图(作者图片)

安装组件时,MoBo 指令很有用。一定要看一看!

中央处理器

现在让我们打开 CPU。CPU 盒包含一个 CPU 芯片本身和一个基本的 CPU 冷却器,它实际上占据了盒子中的大部分空间。

CPU 拆箱(作者图片

我们将把中央处理器安装到移动电话上的专用中央处理器插座上。它在我的设置中有 AM4 格式。

CPU 插座(图片作者

对 CPU 管脚要超级小心。它们非常有形。请注意,其中一个边上还有一个金色的小箭头。

CPU 引脚(图片作者

它可以指导你如何连接你的 CPU。只有一种方法可以将引脚安装到插座中。当金色箭头带状边缘位于 CPU 固定板的左下角时。****

向下向外推动固定拉杆,松开 CPU 固定板,并按上述方式放置 CPU。

已安装的 CPU ( 图片作者)

将固定拉杆推回,牢固安装 CPU 芯片。

(同 solid-statedisk)固态(磁)盘

NVMe 固态硬盘比它们的 SATA 朋友小得多。它只是一个放在盒子里的小飞机。

M.2 SSD 拆箱(图片作者)

要连接这种固态硬盘,需要使用 M.2 插座。我的 MoBo 有两个。每个都配有一对螺钉和一个安装螺钉。MoBo 有几个不同长度的固态硬盘安装柱。

NVMe 固态硬盘安装。M.2 螺丝(图片由作者提供)

只需选择一个与您的 SSD 大小相对应的安装柱,在那里安装一个安装螺钉,并用剩余的螺钉固定 SSD。

随机存取存储

RAM 板也很容易安装。

RAM 拆箱(作者图片)

解锁你的 RAM 插槽,并对齐你的 RAM 板与插槽。有也只有一种方法可以牢固地安装木板。

RAM 安装(图片作者

请注意,您的 MoBo 指令可能会为不同数量的 ram 指定推荐位置。遵循这些建议!

冷却器

人们建议在安装冷却系统之前,避免给 CPU 通电**。CPU 可能会过热或变弱。**

我的冷却器设计用于英特尔和 AMD 处理器。因此,冷却器盒实际上包含更多的螺钉和其他细节,比我在这个特定的建设需要。这就是为什么它的背板有如此怪异的形状。

冷却器拆箱(作者图片

安装冷却器的第一步是卸载库存背板。

卸载库存 CPU 背板(图片作者

这个背板将被另一个随您定制的冷却器一起提供的背板所取代。在我的情况下,我必须以 AMD 兼容的方式组装背板。

冷却器背板(图片作者)

翻转主板,将新背板上的螺钉与主板匹配。

安装冷却器背板(图片由作者提供)

为了最终完成背板安装,您需要安装安装螺钉,实际的冷却系统将连接在这些螺钉上。

接下来,你可以组装冷却系统。它通常需要连接较冷的腿,并将其拧紧到背板上。组装后,尝试匹配您的安装螺钉,以确保您的冷却器腿安装正确。

在安装冷却器之前,最后一步是安装散热膏。我使用了下面视频中解释的“撒尿”方法。

当使用热凝胶时,您需要尽可能地覆盖 CPU 芯片区域,以便更好地去除 CPU 热量。在这个过程中可能出现的气泡会造成伤害。

最后,你可以把你的冷却器安装在 CPU 的顶部。按下 CPU 一点,以分配你的热凝胶在表面上。

此外,请确保凝胶停留在 CPU 上,因为它可能会损坏您的 MoBo。

最后,您可以将冷却器电源线连接到 MoBo 上标记为 CPU_FAN 的最近端口。

PSU 和电脑机箱

PSU 盒包括电源单元模块和各种电缆。

电源拆箱(图片作者

电脑机箱只是一个金属盒子,在盒子的相对两侧有两个可移动的面板。

没有玻璃面板的电脑机箱(图片作者

在盒子的顶部,您可以看到盒子的前面板。你可以有更多的端口和电源按钮。

电脑机箱前面板(图片作者

首先,将主板附带的主 I/O 端口盖安装到电脑机箱中。令人惊讶的是,重要的是要确保盖子侧面的所有小插销都完全安装好,并在翻盖上可见。否则,他们可能会阻止你拧紧你的主板。

I/O 端口盖顶部的三个小金属闩锁。你应该在所有的边上都可以看到它们(作者的图片)

主 I/O 端口(图片由作者提供)

然后,您可以尝试将主板拧紧到机箱安装位置。

接下来,您需要连接三根电缆来为系统供电:

  • 主板电源线
  • CPU 电源线
  • 前面板电源线

如何连接 CPU 和主板电源线非常简单。但是,第一次连接前面板电缆可能会有挑战性。下面的视频对我很有帮助:

如何将前面板电源接入 JFP 端口?

可能还有一些剩余的电缆可以连接到 MoBo。在我的情况下,我有 USB,音频和 C 型电源线。前两个我可以连接,而最后一个需要一个适配器,因为我的 MoBo 没有 C 型端口。所以我把它断开了。对了,PCPartsPicker 可以提前警告你这样的问题。

主板安装到电脑机箱中(图片由作者)

此外,您可能需要连接电脑机箱附带的冷却器。

此时,你可以试着给你的电脑加电,但是在你安装显卡之前,你将得不到视频信号。

国家政治保卫局。参见 OGPU

GPU 盒子包括一个卡本身和一个指令。

RTX 3070 显卡(图片作者)

我的 GPU 有两个插槽,所以我需要匹配输出盖,用实际的 GPU I/O 端口替换它们。

电脑机箱上的显卡盖(图片作者)

GPU 端口是 HDMIs 和 DPs,带有 mocks 以保护它们免受灰尘的影响。在 I/O 钢板的左侧,您可以看到两个有助于安装显卡的齿。

确保使用其中一个端口连接您的显示器**。主板上的 HDMI 端口可能无法正常工作。**

显卡上的端口(作者图片)

电脑机箱有专门的插槽来安装这些牙齿。如果您发现您的 GPU 齿无法安装**,您很可能遇到了主板安装的一些问题。尝试重新安装主板以匹配插槽。**

图形卡齿已安装(图片由作者提供)

技嘉 Aorus Master RTX 3070 需要两根 VGA 电缆来供电。确保电缆末端牢固地安装在 GPU 和 PSU 中。否则主板可能找不到 GPU。

显卡通电(图片作者)

硬件故障排除

如果你把你的第一台定制电脑组装起来,很有可能第一次尝试就不成功。在我的情况下,工作站根本就没有打开。在将零件退回给供应商之前,您需要仔细检查几件事情:

  • 前面板电源连接正确。回到前面板电源线安装并再次检查是否安装正确。例如,这就是为什么我的电脑不能工作的原因。
  • 闸板杆安全就位。尝试重新安装您的内存棒。RAM 端口机制应该锁定它们。
  • 电源电缆连接牢固。确保您的电源线两端完全连接。我对此也有一些问题。每个连接器都有一个塑料锁定装置,可以将电缆固定在端口内。检查是否所有的锁都被激活。
  • ****主板安装在支架上。有些情况下会提供一个特殊的支座螺钉,主板应安装在其上。支架抬高主板,保护它不接触金属托盘,这可能会导致短路。

我想回顾的另一个症状是您的电脑开机,但在启动过程中过一会儿就关机了**。在这种情况下,可能存在阻止您的 PC 版本运行的故障组件。我发现了一个诊断这类问题的好策略:**

  • 尝试拔下所有“不必要”的组件,如第二块硬盘或机箱冷却器,并在问题仍然存在时仔细检查。
  • 保持不相关的事情,直到你的问题不再存在。
  • 最后一个未连接的部件可能是问题的原因。试着再连接一次来证明假设。

以下视频展示了实际故障排除过程:

如何诊断有故障的 PC 组件?

此外,您的主板可能有调试指示灯,指示系统中哪些组件未找到。在这种情况下,您需要再次检查发出信号的组件是否通电并正确安装。

最后,一段时间后,您将能够在屏幕上看到视频信号,系统正在寻找可引导设备。

电脑开机和背面的情况下,电缆管理部分(图片由作者

这是安装 PSU 并利用电脑机箱提供的电缆管理系统的好时机。

登上 PSU ( 图片作者)

软件安装

我考虑了 Ubuntu 20.10 和 Windows10 + WSL2 设置。Linux 安装现在更加稳定和简单。然而,WSL2 听起来也是一个非常可行的方法。下次再告诉你更多。

我手头只有 macOS,所以用UNetBootIn 应用烧了一个 Linux 可引导 USB。我更喜欢用 BitTorrent 下载 Ubuntu 20.10 镜像。

注意,一些 Linux 发行版(比如 Kali)抱怨说 UNetBootIn 不是编写可引导 USB 的最可靠方式。幸运的是,我似乎对此没有异议。然而,我不得不买一个新的 u 盘,因为我的旧 u 盘似乎有问题。每次我试图安装操作系统时,由于文件损坏,从旧 u 盘安装都失败了。

有了新的 u 盘后,我可以毫无问题地安装 Ubuntu 了。

WiFi 适配器驱动程序

遗憾的是,微星 X470 MAX Gaming Plus 主板不支持 WiFi 开箱即用。我不想乱用以太网电缆,所以我买了一个 TP-Link 阿彻 T2U WiFi 适配器。问题是 Ubuntu 不支持它,需要额外的驱动程序。

好消息是 TP-Link 设备在 Linux 社区有很好的支持,所以我很快就找到了需要的驱动程序。也就是我安装了RTL 8812 au 驱动。要安装这些驱动程序,你需要有互联网连接,因为它们依赖于 DKMS 软件包,令人惊讶的是,这个软件包并没有安装在普通的 Ubuntu 中。按照驱动程序存储库中提供的说明进行安装。确保sudo make dkms_install命令没有错误。

此外,您可能想要重新启动您的机器,以便仔细检查驱动程序在这种情况下的工作情况。如果没有,请跟随 stack overflow 上的这个答案。此外,我不得不第二次运行sudo make dkms_install命令,最终在重启后让驱动程序工作。

CUDA 设置

利用我的新 GPU 资源需要配置 CUDA。

CUDA 是 NVIDIA 的并行计算平台,允许充分利用支持 CUDA 的显卡的优势。一般来说,安装过程可以分为 3 个部分:

  • 安装显卡驱动。在 Ubuntu 中安装 NVIDIA 驱动的推荐方式是通过软件&更新应用。

Ubuntu 中的 NVIDIA 驱动安装(图片作者)

  • 安装 CUDA 工具包。NVIDIA 有一个可爱的向导可以为你的系统生成安装命令。执行它提示你的所有命令。
  • 安装 cuDNN 。cuDNN 是一个 GPU 加速的库,具有用于深度学习的原语。您需要在 NVIDIA 开发者计划中注册才能访问该库。最后,你会进入一个页面,在那里你可以下载 cuDNN 运行时和开发者库以及代码样本和用户指南**。我把这三个都下载成 deb 包并安装了。**

下载 cuDNN 页面(访问在此 ) ( 图片作者)

这里是来自 NVIDIA 的官方安装指南。

到目前为止,我已经在 PyTorch 项目中测试了我的设置。可能还有另一件事会困扰你。为了利用我的 GPU 设备,我不得不重新安装我的 PyTorch 库。这一次 PyTorch 有一个平稳安装向导可以帮助你。

最后,如果你使用 PyTorch Lightning ,这是一个为你的训练器实例改变GPU 配置的问题,它将在训练或推断期间使用你所有的 GPU 资源。

工作流程

目前,我正在使用基于 sFTP 连接到我的机器的最简单的工作流,并且改变了 PyCharm Professional 的自动上传特性。

为了连接我的深度学习工作站,我在那里安装了 OpenSSH 服务器。我喜欢禁用密码验证,而使用 SSH 密钥。此外,将默认的 22 端口更改为其他端口也是一个好主意。

一旦 SSH 连接就绪,就可以在 PyCharm 实例中设置部署主机,并在 ML 工作站上安装项目。这是项目第一次设置时需要的,通过运行git clonepoetry install命令可以很方便地完成。Rsync是一种将数据集上传到机器的快捷方式。

你在 PyCharm 里做的大部分改动都会自动同步到深度学习机器上。当您准备好测试您的更改时,您可以在 ML 工作站中通过 SSH 运行一个命令来执行您的项目。

通过这种工作流程,您仍然可以在 MacBook 上工作,同时在 GPU 加速的计算机上运行代码。

摘要

看到我手上有一些 GPU 资源的小想法是如何在整个项目中成长的,真是太棒了!

我的深度学习工作站 1.0 ( 图片作者)

希望这篇文章对你搭建自己的深度学习工作站有所帮助。一定要在下面的评论里让我知道这是不是真的!

在接下来的几周里,我很可能会尝试其他的工作流程和当前的设置,看看它们如何为我工作,所以请保持关注,祝你好运,建造你自己的 ML beasts。

本帖原载于我的网站。

参考

  • 深度学习的全硬件指南
  • 深度学习用哪个(哪些)GPU:我在深度学习中使用 GPU 的经验和建议
  • PCPartPicker 上的深度学习准系统

我如何构建自己的约会应用程序算法

原文:https://towardsdatascience.com/how-i-built-my-own-dating-app-algorithm-2f6def15feb1?source=collection_archive---------3-----------------------

为成千上万的用户编写一个简单的匹配算法

照片由 Unsplash 上的 Prateek Katyal 拍摄

答现在市场上几乎所有的约会应用都有某种形式的约会算法。然而,这些算法通常不公开供公众审查。此外,他们背后的公司可能不希望他们的秘密配方暴露给竞争对手。但是,我们仍然可以尝试找出一个潜在的日期算法是如何制作的。

过去,我曾无数次深入研究过这个问题。我甚至使用机器学习聚类算法构建了一个简单的约会应用程序:

使用无监督的机器学习是一个很好的练习,产生的约会算法也不算太差!这是一次很棒的经历,但我认为还需要一些改进。

在本文中,我不会严格使用机器学习,而是选择一种更简单的方法,使用数据科学工具和一些推荐系统技术。这种算法的逻辑很简单——它将基于群体智慧的理念。这意味着该算法将找到和你一样的用户,聚集那些志同道合的用户的互动,然后最终根据志同道合的用户的意见和互动推荐你可能喜欢的个人资料。

我将向你展示我是如何主要使用 Python 和 Pandas 创建这个约会算法的。但在我开始之前,我必须列出这个约会算法的几个先决条件和假设:

  • 这种定年算法是在一个已经建立的平台下工作的。意味着用户和用户交互已经存在。
  • 这个建立的平台向用户提供了一个快速简单的问卷。类似于在约会档案上填写问题。
  • 该平台的工作原理类似于其他流行的约会应用程序,通过左右滑动来表示个人资料之间的喜欢。
  • 直男直女将是这个平台目前唯一的用户。其他偏好可能会在以后添加。

就是这样!我们现在可以继续进行编码方面的工作,如果你想创建自己的约会算法,可以随意编码。

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

捏造用户和用户行为

由于我们的约会算法只适用于已经建立的数据集,我们需要用随机值来制造数据。我们可以制作更复杂的数据集来模拟真实世界的约会档案,但现在还没有必要。

创建数据框架

首先,让我们导入以下库:

import pandas as pd
import random
import numpy as np

对于该算法,将有 3 个数据表或数据帧。一张桌子给男人,一张桌子给女人,还有一张桌子展示他们是如何互动的。男性和女性的表格将包含 5 列,代表“个人资料调查表”中的问题和答案以及他们的用户 id。问题和答案将被表示为一个简单的“Q1 到 Q5”,而答案被表示为“A 到 E”。

创建一组简单数据集的代码

评级或互动表将显示 3 个不同的值。这些值代表 M 和 W 用户之间的交互结果:

  • 1 表示导致成功匹配的两个用户之间的相应右击。
  • 0 表示来自任一用户的左击导致不匹配。
  • “看不见”表示两个用户还没有看到彼此。

从左至右:男士桌、女士桌和比赛/互动桌

制作年代算法

现在我们有了可以玩的数据,我们可以继续有趣的部分——构建约会算法。该日期算法将按以下顺序工作:

  1. 找一个还没看过很多 W 简介的 M 用户。
  2. 根据所选择的 M 个用户的约会简档答案,找到其他相似的 M 个用户。
  3. 从最相似到最不相似排列相似的 M 个用户。
  4. 包括最相似的 M 个用户。在我们的例子中,它将是前 10 个最相似的。
  5. 获取我们选择的 M 用户尚未见过的所有 W 用户的前 10 个交互。
  6. 合计前 10 名的交互值,以找到累积值。
  7. 使用这些累积值来预测看不见的 W 用户和我们选择的 M 用户之间的潜在交互。

之后还有一些额外的步骤,比如对每个 W 用户的累积值进行排序,但现在这并不太重要。上述序列将是我们匹配算法的蓝图。同样,这个序列也可以应用于 W 用户。

找到一个拥有许多“看不见的”价值的 M 用户

现在我们有了蓝图,让我们开始编码吧。为了找到评级表中具有最多“看不见”值的 M 用户,运行以下代码:

m_user = ratings.T.apply(pd.Series.value_counts).T.sort_values(
    by="unseen", 
    ascending=False
).iloc[0]

接下来,我们将找到并保存这个 M 用户尚未看到的所有 W 用户的列表:

m_nrate = ratings.T[ratings.T[m_user.name]=="unseen"].index

查找前 10 个相似的 M 用户

现在我们可以使用上面创建的变量找到所有相似的 M 个用户。但是首先,我们必须做一些简单的数据预处理。我们需要对男士表格中的答案进行分类,这样我们就可以使用它们相应的数值来计算相关性:

n_men = men.apply(lambda x: x.cat.codes)

产生变换的数据帧:

将答案转换为相应的数值

有了这个表,我们就可以计算与熊猫的相关分数。

m_sim = n_men.T.corrwith(
    n_men.T[m_user.name]
).sort_values(
    ascending=False
)[1:11]

运行这段代码将导致左边的表格显示与我们选择的 M 用户最相似的用户。最相似的用户具有 1.0 的相关性分数,最不相似的用户将具有 0 的分数。默认情况下,熊猫使用“ 、皮尔森 ”方法来计算相关性。

前 10 个匹配值

知道了前 10 个相似的用户,让我们找出我们选择的 M 用户还没有见过的 W 用户的交互值:

msim_rate = ratings.loc[list(m_sim.index)][m_nrate]

指数:前 10 名相似用户。列:我们选择的 M 用户尚未看到的 W 用户。

因此,即使有前 10 名相似用户,仍然有一些“看不见的”价值。这可能是一个未来的问题,可以通过添加比前 10 名更多的类似用户来解决。然而,为了这个项目的目的,我们将继续我们所拥有的。

汇总前 10 名的值

我们现在可以合计这些值,找出每个 W 用户的总价值。为此,我们有多种方法可以计算累积值。让我们保持简单,只找到平均值、频率和中间值结果:

# Man predictions
m_predict = pd.DataFrame()# Replacing the unseen values with NaNs for calculation purposes
msim_rate.replace(
    "unseen", 
    np.nan, 
    inplace=True
)# Average
m_predict['avg'] = msim_rate.mean()# Frequency
m_predict['freq'] = msim_rate.mode().T[0]# Median
m_predict['median'] = msim_rate.median()

在左边,您应该可以看到前 10 个交互值的累积值的 DF。

从这里,我们可以选择哪种计算最能代表前 10 名相似用户的总体情绪—平均值、频率或中值?

平均值似乎是最好的,因为它的数值范围很大。我们可以用这个对 W 个用户进行排序,找出前 10 名中最受欢迎的用户。它还可以作为我们选择的 M 用户的匹配/兼容性分数。例如:

假设你是被选中的用户。如果该值为 0.80,则有 80%的可能性您会喜欢此档案,因为与您最相似的 10 个用户中有 8 个喜欢此档案。

决定使用平均值后,我们现在已经完成了约会算法!在这种情况下,我们只将该算法应用于现有用户。但是,我们如何将它应用于平台上的新用户呢?

处理新用户

现在我们已经为我们的约会算法设计好了代码,让我们把它应用到一个新用户身上!这个新用户将与现有用户使用相同的调查问卷。所以我们基本上只是将它们添加到现有的数据集中。

我已经构建了一个函数,它使用了我们最近创建的约会算法的代码和序列:

假设我们的新用户将通过回答几个问题被介绍给平台,我们将对他们使用随机答案。之后,我们将运行上述函数,然后我们的新用户将能够看到他们最有可能匹配的用户:

ans = ['A', 'B', 'C', 'D', 'E']# Randomly picking answers
new_man_answers = random.choices(ans, k=5)# Running the function
recs = matchMan(
    men, 
    women, 
    ratings, 
    new_man_answers, 
    num_sim=10
)# Finding the top 20 most potentially compatible
recs[:20]

运行上面的函数并使用与以前相同的表,将向新用户呈现这些推荐的 W 个用户,这些用户按平均分排序。我们可以看到分数在列表中进一步下降,这意味着算法正在工作。

现在可以向这些 W 用户显示分数,以通知新的 M 用户他们潜在的匹配兼容性。或者,他们可以不显示分数,新用户将只看到这些配置文件作为他们的最佳推荐匹配。这些 W 用户如何呈现的决定,最终还是要由婚恋交友平台的负责人来决定。

结束语

我们已经成功构建了一个简单的约会算法,而没有使用任何机器学习模型。然而,我们可以采取一些步骤来潜在地改进这种年代测定算法。例如,我们需要通过比较现有用户的预测分数和实际分数来验证我们的结果。在此基础上,我们可以对算法进行改进,比如将更多的相似用户包括在内,而不仅仅是前 10 名,或者甚至对交互值进行加权。

我已经在 Github 上完成了我的代码中的一些基本验证过程— 参见下面的。然而,这里所做的任何验证都是没有意义的,因为我们现有的数据集都是随机的。

另一个需要注意的潜在问题是规模。当平台上的用户数量(甚至入职问题)增加到算法开始变慢的时候会发生什么?我们该如何补偿呢?这些是我们在改进这个算法时需要考虑的事情。

总而言之,构建这个算法是对编码和利用一些推荐系统技术的一次很好的锻炼。如果您希望继续改进这个现有的算法,请随时查看我在 Github 上的代码。我希望你喜欢这篇文章,如果你愿意,可以看看我的其他文章!

资源

https://github.com/marcosan93/Medium-Misc-Tutorials/blob/main/Dating-Algo.ipynb

我如何构建 ELTEA17 数据集

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

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

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

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

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

用例

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

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

情感分类学

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

数据集构建

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

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

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

数据收集

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

推特数据

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

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

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

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

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

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

过滤

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

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

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

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

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

注释

句子级

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

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

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

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

令牌级

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

情感关键词

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

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

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

情感原因

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

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

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

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

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

情感持有者

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

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

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

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

情感目标

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

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

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

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

训练数据集格式

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

不同层次的例句生物注释

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

数据统计

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

语料库摘要

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

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

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

注释工具

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

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

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

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

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

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

后续步骤

  • 敬请关注了解我是如何结合 CRF 和 CNN 进行情感分类的
  • 请随意探索 ELTEA17

进一步参考

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

就这样,让我们开始吧

什么是技术面试?

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

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

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

技术面试是如何进行的?

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

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

你的行动计划

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

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

沟通

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

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

让我给你举个例子。

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

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

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

科技面试有多难?

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

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

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

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

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

准备

非常了解你的工具

准备时间表

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

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

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

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

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

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

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

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

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

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

微笑

祈祷,冷静,表演

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

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

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

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

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

复杂性

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

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

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

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

这些术语可能对你有用:

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

数据结构

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

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

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

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

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

算法

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

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

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

样题

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

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

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

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

结论

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

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

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

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

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

索利·德奥·格洛丽亚

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

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

关于作者

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

使用的 JAR 依赖项有:

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

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

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

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

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

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

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

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

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

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

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

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

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

办公时间

对于有效的数据故事呈现

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

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

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

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

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

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

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

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

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

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

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

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

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

作者图片

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

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

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

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

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

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

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

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

作者图片

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

作者图片

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

作者图片

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

作者图片

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

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

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

作者图片

作者图片

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

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

保持一切简单。

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

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

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

摘要

就是这样!

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

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

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

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

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

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

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

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

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

希腊假新闻数据集

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

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

spaCy Python 库

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

简化框架

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

开发 Web 应用程序

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

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

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

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

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

结论

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

参考

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

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

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

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

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

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

实时预测你演讲的情绪

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

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

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

想法:

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

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

语音识别器:

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

安装:

**pip install SpeechRecognition**

使用 TextBlob 的情感分析器:

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

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

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

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

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

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

实施:

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

(作者代码)

结论:

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

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

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

感谢您的阅读

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

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

内部源代码

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

介绍

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

机器学习模块开发

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

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

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

机器学习模块的工作流程

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

1.Twitch 聊天功能

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

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

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

2.运动特征

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

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

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

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

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

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

3.声音特征

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

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

4.元模型!

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

元模型使用的所有特性

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

supervise.ly 视频标注界面截图

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

元模型使用的数据集示例

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

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

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

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

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

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

不影响模型结果的特征:

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

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

实施细节

应用架构

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

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

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

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

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

结论

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

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

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

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

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

混合动力在 Unsplash 上拍照

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

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

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

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

首先,我们导入 spaCy 和 TextBlob。

import spacyfrom spacytextblob.spacytextblob import SpacyTextBlob

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

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

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

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

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

{'score': 0.85}

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

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

Flask RESTful API 概念回顾

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

烧瓶是什么?

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

什么是 API?

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

  • cryptanator:加密货币汇率
  • 开放式气象:天气预报
  • icanhazdaddjoke:随机老爸笑话

什么是 RESTful API?

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

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

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

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

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

虚拟环境和安装库

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

$ py -m venv env

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

$ python3 -m venv env

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

$ .\env\Scripts\activate

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

$ source env/bin/activate

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

$ pip install Flask
$ pip install flask-restful

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

$ pip install gunicorn

编写我们的 app.py

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

from flask import Flask
from flask_restful import Resource, Api

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

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

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

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

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

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

api.add_resource(HelloWorld, '/')

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

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

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

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

$ python app.py

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

作者图片

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

$ curl http://127.0.0.1:5000/

您应该得到以下输出:

{
    "hello": "world"
}

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

作者图片

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

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

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

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

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

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

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

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

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

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

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

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

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

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

api.add_resource(PredictSentiment, '/predict')

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

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

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

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

作者图片

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

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

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

将 API 部署到 Heroku

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

web: gunicorn app:app

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

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

pip freeze > requirements.txt

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

$ git init

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

env/
__pycache__/

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

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

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

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

$ heroku login

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

$ heroku create

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

$ git push heroku main

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

作者图片

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

作者图片

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

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

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

结论

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

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

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

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

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

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

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

实践教程

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

戴恩·托普金在 Unsplash 上的照片

1。简介

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

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

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

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

2。TFX(张量流扩展)

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

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

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

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

  • 数据来源

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

  • 数据谱系

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

  • [计]元数据

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

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

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

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

  • 管道
  • 成分
  • 图书馆

2.1 管道

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

2.2 组件

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

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

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

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

2.3 库

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

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

3。实验跟踪和管理

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

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

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

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

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

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

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

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

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

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

4。顶点 AI + TFX 管线

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

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

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

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

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

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

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

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

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

5。监控

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

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

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

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

6。CI/CD

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

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

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

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

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

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

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

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

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

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

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

7。结论

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

8。参考文献

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我造了一个推特机器人

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

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

我学到了什么

我学会了三件事:

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

Plotly 仪表板

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

我学到了什么

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

推文的情感分析

情感分析(按作者)

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

我学到了什么

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

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

画面可视化

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

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

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

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

我学到了什么

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

从 PDF 文件中收集数据

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

我学到了什么

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

对熊猫使用复杂的 Excel 表格

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

我学到了什么

熊猫很棒。不多不少。

免费提供数据和可视化

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

我学到了什么

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

(我的)结论

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

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

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

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

照片由 Unsplash 上的 Mantas Hesthaven 拍摄

介绍

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

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

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

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

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

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

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

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

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

背景

Susan Q Yin 在 Unsplash 上拍摄的照片

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

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

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

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

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

第一项分析工作

由 Unsplash 上的新数据服务拍摄

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

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

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

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

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

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

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

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

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

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

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

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

攻读数据科学硕士学位

由 Unsplash 上的 Matese Fields 拍摄

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

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

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

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

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

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

第一份数据科学家工作

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

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

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

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

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

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

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

结论

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

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

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

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

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

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

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

从编码训练营到编码工作

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

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

在 Unsplash 上由 Austin Distel 拍摄的照片

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

我如何找到一份工作?

我是何时何地毕业的?

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

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

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

毕业后

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

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

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

求职过程

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

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

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

继续前进

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

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

写文章

照片由丹参赞在 Unsplash 上拍摄

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

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

文章和项目

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

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

与我的文章联网

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

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

带文章链接的消息传递

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

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

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

从文章到工作面试

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

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

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

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

走向

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

给自由数据科学家写文章

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

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

自由职业者和合作

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

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

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

工作邀请

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

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

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

现在的工作

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

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

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

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

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

照片由 Unsplash 上的思想目录

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

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

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

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

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

由 Unsplash 上的absolute vision拍摄

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

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

写一篇独特的文章

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

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

*

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

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

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

为乐趣而写作&带着激情

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

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

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

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

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

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

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

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

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

科技职业

适合我的可能也适合你

陈虎在 Unsplash 上拍照

我的数据故事

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

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

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

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

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

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

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

所以你不必重复错误。

在 Unsplash 上 Kea Mowat 拍摄的照片

为什么你应该关心

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

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

原因如下。

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

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

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

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

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

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

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

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

秘诀 1:把阅读当成呼吸

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

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

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

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

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

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

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

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

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

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

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

邻近学习

  • 编程
  • 数据工程

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

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

想象一下:

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

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

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

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

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

但是,它没有伸缩性。

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

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

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

熟能生巧

  • 弄脏你的手

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

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

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

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

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

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

成为社区的一部分

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

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

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

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

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

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

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

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

阿尔伯特·爱因斯坦

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

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

外卖食品

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

喜欢读这本书吗?

请在 LinkedIn和 Youtube 上找到我。

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

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

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

行业笔记

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

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

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

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

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

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

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

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

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

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

  • 2021/05/09更新:我把原来的谷歌表单链接换成了一个谷歌表单的 PDF 打印件,这样你就能马上有个大概的了解。
  • 谷歌工作表
  • 谷歌数据工作室报告

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

我喜欢谷歌表单的三点:

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

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

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

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

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

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

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

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

作者图片

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

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

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

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

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

作者图片

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

作者图片

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

作者图片

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

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

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

作者图片

作者图片

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

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

欢迎任何想法和问题!

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

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

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

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

介绍

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

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

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

领域和问题表示

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

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

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

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

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

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

PDDL 适配器

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

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

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

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

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

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

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

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

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

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

规划图:数据结构

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

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

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

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

计算动作

这是指这一步:

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

它由两部分组成:

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

计算动作(作者代码)

计算前提条件

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

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

这一步非常简单:

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

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

计算操作互斥

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

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

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

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

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

计算先决条件互斥

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

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

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

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

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

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

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

搜索算法:GraphPlanner

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

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

  • 计划
  • 提取
  • 搜索

提取和搜索

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

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

下一部分是 搜索() :

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

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

算法流程(作者图片)

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

这是我们用 Python 写的:

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

主程序

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

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

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

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

主算法(作者代码)

包扎

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

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

https://github.com/debbynirwan/planning_graph

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

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

破解数据科学访谈

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

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

介绍

我的求职季在一个绝对糟糕的时间开始:

  • 一个致命的疫情出乎所有人的意料;
  • 全球经济进入恐慌模式;
  • 公司冻结了新员工。

作为一名应届毕业生,我不得不在努力保持健康(大部分时间与外界隔绝)和完成博士课程的同时,在找工作的旅途中游刃有余。这是一次如此孤独的旅程,我敢打赌,你们很多人都会有同感。

一次又一次的面试,一次又一次的拒绝。

自我怀疑和犹豫开始出现,我的信心开始动摇。

日以继夜,我过去 5 年多的努力什么时候会有回报?

我于 2020 年 9 月正式开始找工作,并于 2021 年 7 月在沃尔玛全球科技获得了一份工作。这是一个数据科学家/统计学家的联合职位,我可以在实验平台 Expo 利用我在机器学习和因果推理(实验)方面的背景。

非常适合!

此外,总的薪酬方案非常有竞争力,我根本不需要谈判。在付出了这么多努力之后,老实说,这是一种甜蜜的泪水、热情和彻底疲惫的混合感觉。

在今天的帖子中,我想记录下我的求职之旅,并分享这个过程中的好、坏、丑。我按照面试漏斗中的步骤来组织这篇文章:如何获得面试机会,确定技术回合,以及破解现场面试。

背景

首先,我是加州大学圣巴巴拉分校政治学的应届博士候选人,拥有统计学硕士学位。此外,我在实验、因果推断和数据分析方面有 5 年以上的研究经验。

自然,研究和行业经验之间有差距,但这并不意味着博士候选人是书呆子,不能去企业工作。事实证明,这是业内高级学位持有者的一个普遍假设。我通过展示可转移的技能、将他们的业务问题转化为可研究的问题、理解并做出实际的权衡等方式,在面试环节尽早解决这个问题。

关于做出实际权衡的快速说明:企业领导人必须平衡速度和数据质量。如果我们能够以一种快速的方式提供一个合理有效的解决方案,这在行业中已经足够好了!这是许多博士候选人挠头想知道的时候:

为什么我们不试着找到完美的解决方案呢?

简单的回答是,企业等不了那么久。如果他们必须在 6 个月内等待一个完美的解决方案,他们可能会破产。

展示你对必要权衡的理解可以提高你在面试中对成熟和专业的认知。

鉴于我的教育背景和研究经验,我不敢想象如此可怕的面试过程。

事实证明,我大错特错了。

博士找工作一直很有挑战性,因为我们要求更好的薪酬待遇,但就业市场却很小。疫情让情况变得糟糕 10 倍。在 Covid 开始后的最初几个月,公司陷入恐慌,停止招聘新人。

菲尔·科夫曼在 Unsplash 上的照片

步骤 0:准备面试

我在业内的数据朋友在找工作之前安排了几轮模拟面试,这帮助我迅速意识到差距,并发现我需要发展的技能。两项技能名列前茅:Python 和 SQL。虽然,在我看来,学术界使用 R 的频率要高得多,也不用担心大数据。

为了准备面试,我花了很多时间掌握数据结构和算法、时间和空间复杂性,以及编程的所有细节。我在我的电脑上创建了 50 多个 Jupyter 笔记本,在 Medium 上创建了 20 多个编程帖子。在不到一年的时间里,我在 LeetCode 上已经有了 2600+的提交,解决了 322 个编程问题。

2021 年 8 月自己的截图

与此同时,我联系了很多人,并经常安排信息采访。具体来说,我记下了我想知道的最重要的问题,例如他们作为数据科学家的日常工作,他们试图解决的典型问题,每个项目的持续时间等。

我个人最喜欢的问题是关于他们工作中最具挑战性的部分。这个问题让我站在他们的角度,培养他们对自己责任的第一人称视角。安排信息面试是培养同理心和沟通技巧的捷径。

最佳实践

  • 积极主动,向人们伸出援手。

这是关键的第一步。你真的需要在踏入赛场之前感受一下水温。如果你没有达到职位描述中列出的最低要求,最好停止面试,发展所需的技能。这并不意味着你必须在开始面试循环之前做好充分准备;退一步说,这意味着你应该对工具/技能有所了解。

  • 成为社交媒体的大师,了解它们的不同工作方式。

在媒体和 LinkedIn 上的技术写作对我帮助很大。如果没有这些平台,我的求职之旅会困难得多。 LinkedIn 是一个基于人脉的职业网络,我的人脉构成了该领域的商业领袖和数据科学家。他们最迫切的需求是有什么解决方案可以解决他们的业务问题。因此,我对我的帖子进行了修改,以满足这些需求,并提供一站式解决方案。查看 LinkedIn上的这篇文章,获取一个简单的例子:

https://www.linkedin.com/posts/leihuaye_womanday-data-abtesting-activity-6774769825265909760-fxbR

相比之下,我在 Medium 上的追随者是热切的数据学习者,他们希望了解如何实现该方法。因此,我详细阐述了技术细节,并特别关注代码实现。

一个快速更新,我已经开始了一个新的 YouTube 频道致力于统计学、研究设计、职业发展、数据科学、实验和因果推理。这个视频解释了我在渠道背后的想法,以及它如何能让你受益。此外,我在技术部门工作的几十个朋友已经同意来这个频道,分享他们的生活经历和职业发展技巧。

凯尔·科特雷尔在 Unsplash 上的照片

第一步:如何获得面试机会

第一步总是最难的。我的大部分职业网络都在学术界,走出我的舒适区并不是一件容易的事情。不管怎样,我开始申请,运气不好,接受了几次面试。然后,拒绝。我当时觉得挺正常的,没想太多。我提交了更多的申请,一次又一次被拒绝。有一次,我运气不好,不再接受任何采访。

出事了!

为什么我得不到任何面试机会?

我当时目光短浅,没有评估自己应用策略的有效性。我愣了一会儿,毫无头绪。

幸运的是,我很快意识到专业社区的重要性,并通过直接与行业领导者联系,将我的在线内容“货币化”。如第 0 步所述,我在媒体和 LinkedIn 上运用不同的写作策略来适应受众。每一个帖子和分享都会带来新的联系。

很快,一家顶级科技公司的招聘人员伸出手来,想要打电话更好地了解我。这是一系列后续请求的开始。

事实证明,内容写作是建立联系和获得面试机会的最有效方式。我会向新朋友介绍我的背景和专业领域,并询问他们是否在招聘。

最佳实践

  • 挑个利基。

我们都想成为“全栈”数据科学家,但现实是,如果你专注于自己最强的领域,你会更好。数据科学主要有三条职业轨迹: 算法分析推理 。作为一名社会科学家和统计学家,我最强的优势在于推理轨道,具体来说就是因果推理。因此,我的整个面试策略建立在这样一个假设之上:如果我在推理领域找不到数据科学的职位,我就不可能在其他两个领域找到工作。

  • 与领域保持同步。

公司希望招聘内部人员,即了解其商业模式的技术人员。如果你是一名有能力的数据科学家,下一步就是展示你理解他们的痛点,并准备好在第一天就为团队做出贡献。阅读公司的技术博客是保持更新的最好方式。

查看这份中等清单,了解顶尖公司的数据科学团队目前正在做什么: A/B 测试正在进行

常见陷阱

  • 蛮力和原始应用。

这是新毕业生的通病。这是浪费时间,是行不通的。即使在与理想的候选人签订了合同之后,公司还是会继续刊登招聘广告。

  • 努力成为通才,心中没有重点。

几年工作经验后大概可以申请不同赛道的职位。然而,我的建议是在开始时利用你最强的力量,在转向其他人之前进入大门。

不要做那个想让太平洋升温的人。

照片由 Petalz_R 在 Unsplash 上拍摄

第二步:如何通过技术轮面试

恭喜你。你已经走出了自己的舒适区,获得了面试机会。嗯,我们应该记住:这只是一次面试,不是一份工作邀请!

我应该说:还没有。

在得到工作机会之前,还有两到三轮面试。

技术回合主要关注脚本编程、商业案例或行为问题。根据我过去的经验,公司在技术回合中会问所有这些类型的问题,所以要做好准备。他们会在最后的现场面试中再次问你这些问题,但会有意识地问。

经过大量的训练,我毫无问题地通过了几乎所有的技术面试,并被邀请进入最后一轮。这并不容易。最疯狂的几周,我几乎每天都做技术面试。

如果几轮面试都没通过,不要对自己太苛刻。最好的策略是从失败中学习,磨练你需要的技能。一开始,我不能用 Python 写一个简单的 for 循环。现在,我在教别人如何编码。

最佳实践

  • 编码,编码,编码!

数据科学家的一个基本职责是有效地编码。了解如何用 SQL 和 Python 编码。练习 LeetCode 问题,发展你的软件工程技能。

我的编程秘诀叫做深思熟虑的练习:专注于一个领域(例如 Python 中的字典),彻底理解底层逻辑。我遵循了这种类型的实践计划,从一个 Python 新手变成了一个(自称的)编程大师。

一些例子请参考这个编程列表: 破解数据科学访谈

  • 把编程当成语言。

归根结底,Python 或 SQL 是一种与计算机对话的编程语言。语法与人类语言非常相似。我的诀窍是把它当成一门语言,理解底层逻辑。当然,学习数据结构和算法很有帮助。

在这篇文章中,我分享了数据科学家如何开发编码技能:

  • 沟通,沟通,沟通。

公司正在寻找能够清晰表达自己观点并与团队有效沟通的人。所以,我们应该把面试视为双向对话,而不是单向独白。

以下是我对一个编码问题的逐步分解:

  1. 再次阅读问题提示,并确保您理解它的底层逻辑。
  2. 然后,如果你有什么不清楚的地方,要求澄清,必要时收集进一步的信息。我经常把问题反馈给面试官,确保我的思路是正确的。
  3. 先给出一个整体的答案,再用 Python/SQL 进行编码。比如你可以说这个问题要求求斐波那契数,我首选的算法是递归,它有两个部分:基条件和递归条件。这也叫做在你的思维过程中走一遍。
  4. 编码完成后,我会测试它,看看算法是如何工作的。通常,在我们第一次运行任何算法时,它会抛出一些错误,主要是因为缺少边缘情况。解决问题并再次运行。
  5. 到目前为止,我有一个可以运行的暂定解决方案,但这并不意味着工作已经完成。还没有。尝试讨论时间和空间复杂性以及不同算法之间的权衡。如果可能,提供任何可以提高模型性能的更好的算法或解决方案。学习大 O 符号。

一些例子请参考这个编程列表: 破解数据科学访谈

  • 要自信!

每个人都会偶尔被卡住。积极主动地寻求暗示。实际上,面试官希望你被卡住,他们已经准备好给出暗示了。试着自信一点。

常见陷阱

  • 玻璃门不是你的朋友。

科技公司有很多面试问题,但人们喜欢在谷歌上搜索最近的面试问题。首先,这是一种不被认可的做法,因为求职者需要签署一份 NDA。其次,公司很可能不会一遍又一遍地问同样的问题。这是浪费时间。第三,它让你在心理上消沉。你可能会想,“会包括在我的面试中吗?”除了焦虑和失眠,它没有创造任何价值。

  • 沟通不够。

一些人在没有沟通的情况下就开始编码,一旦他们陷入困境或错过了边缘案例,他们就开始恐慌。但是,你知道,解决技术问题不仅仅是关于技术部分;也是关于良好的沟通。

照片由在 Unsplash 上放大的

第三步:如何破解现场面试

干得好。你和梦想中的工作只有最后一英里了。与前几轮相比,现场比赛需要一整天的时间,是一场智力和体力的考验。它包括 4 到 5 次单独的面试,面试中有两个主要目标:

1.进一步测试候选人的技术技能:Python、SQL 和机器学习(以技术为基础)。

2.了解你将如何融入团队(更多基于行为)。

至于编码问题,我建议遵循上面列出的相同步骤。为了破解行为回合,我遵循了一种SituationTaskAactionRresult(STAR)的方法:

  • 简单描述一下情况。有什么问题?为什么重要?
  • T 提问:描述你的角色以及为了解决问题而委派给你的任务。
  • T4:为了解决这个问题,你们采取了哪些具体措施?为什么选择这一步,而不是其他?描述给定情况下的权衡。
  • 结果:你取得了什么成就?你彻底解决问题了吗?如果可以再来一次,你会有哪些不同的做法(提升空间)?

在整个面试过程中,我坚持使用明星法。这很有帮助。

最佳实践

  • 明星是你的朋友。

反思你过去的经验,并思考如何应用 STAR 框架。

  • 准备好谈论你的简历。

如果你在简历上写了什么,面试官很可能会问你。所以,回忆一下细节。我得到了这个教训。作为一名研究人员,我在简历中加入了几个项目,但已经有一段时间没看了。所以,当面试官想了解更多的时候,一些技术细节就变得模糊了。

  • 在任何面试结束时提问。

这是你更多了解团队、他们的痛点和未来方向的机会。我总是问他们最具挑战性的部分和解决方案的相关问题。

常见陷阱

  • 不应用 STAR。

对于行为问题,新毕业生可能会漫谈他们过去的经历,无法给出明确的答案。同样,这是一个很大的危险信号。

此外,他们漫谈和重复自己,一个大的拒绝。

相反,在开始之前,要求一些时间来整理你的想法,记下几行笔记。

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

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

外卖食品

  • 不要让拒绝让你沮丧。我知道你花了这么多精力准备面试,但还是被拒绝了,这是什么感觉。我经历过,理解那种感觉。从过去的经历中学习,成长。
  • 有成长的心态 。数据科学是一个如此广阔的领域,什么都知道是不现实的。如果职位描述包括 Python 和 SQL,我们可以学习编程;我们可以通过阅读和研究来培养商业意识。我们可以在学完数据结构和算法之后,和软工程师讨论时间和空间的复杂性。为了 100%透明,我一开始对编程知之甚少,没有商业意识,也没听说过 DSA。刻意的训练和自我教育把我带到了这里。
  • 稍事休息但绝不放弃 。我知道这是毫无头绪的漫长一天,你只想放弃。但是相信我:你可能只需要几行代码和练习就能得到你梦想中的工作。不要让任何人告诉你“不可能是你。”可以是你!

喜欢读这本书吗?

请在 LinkedIn 和 Youtube 上找到我。

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

我是如何学习数据科学的线性代数、概率和统计的

原文:https://towardsdatascience.com/how-i-learned-linear-algebra-probability-and-statistics-for-data-science-b9d1c34dfa56?source=collection_archive---------3-----------------------

我是如何没能学好数据科学的数学,以及我是如何理解线性代数、概率、贝叶斯定理、概率密度函数和基本统计的

蒙帕纳斯火车站事故,来源:维基媒体

背景

这正是一年后我的数据科学之旅的样子。

是的,新年快乐:-)

说到为数据科学学习数学,一切都以失败开始和结束。我相信我并不孤单,许多从数据科学起步的人都有同样的经历。如果要用一个词来形容我为数据科学学习数学的努力,那就是:

作者图片

没有学到你需要的东西,尤其是当没有明确的数据科学道路时,会导致挫败感。至少我明确了我的目标:

  1. 学习我需要的数学知识,仅此而已
  2. 我的背景是什么,我有什么经验,或者缺乏什么,都无关紧要。如果我只是渴望学习数据科学的数学,那么我应该能够做到
  3. 更多地关注行为特征,特别是态度坚持,而不是掌握某个特定的数学题目。

数学是一门可怕的学科。我们人类有情感和欲望,而数学是基于逻辑和方法的。有了人工智能,也许有可能给机器注入一些情感,但数学没有它们的位置。我们的头,我们的感情在学习数学的时候受伤了。至少这是我对数学的一贯看法。一件古老而可怕的事情。

当我们不懂数学,没有天才般的智商时,我们该怎么办呢?我们做这些事情:

  1. 买一本书
  2. 开始 MOOC
  3. 努力工作
  4. 如果你失败了,你会更加努力
  5. 如果你再次失败,你会更加努力
  6. 你一次又一次地失败。你越来越努力地工作,耗尽了你的意志力,有一天你开始相信自己不是“数学型”的人

我做到了。

更加努力的工作导致了更多的失望,更多的挫折,最终导致愤怒****自卑。当谈到数据科学的数学时,我为我需要学习的每个主题重复了这个故事,线性代数,统计,概率,线性回归和梯度下降。这就是“我学习数学的故事”。直到现在。

对于一个完全的初学者来说

如果你是一个完全的初学者,那么根据我的经验,我建议你按以下顺序进行:

  • 学习 Python 编程
  • 学习惯用的 pythonic 方法(例如,列表理解、生成器等。)
  • 学习熊猫
  • 使用熊猫清理和争论一些数据集
  • 学习 Matplotlib
  • 绘制一些数据集
  • 结合你对熊猫和 Matplotlib 的了解。争论数据集并绘制它们
  • 对于机器学习,做 2-3 个小项目,如 Iris flower、Boston housing、wine classification 和 Titanic dataset 等。

你看,开始学习数据科学不需要数学。

这将花费你 3-4 个月的时间(有些人可以在一个月内完成,但我和树懒是朋友)

一只树懒(Bicho-pre guia 3)由丹妮拉·马拉希洛拍摄,来源:维基媒体

数据科学不需要很多数学知识

我猜一个人的经历应该不足以让你相信我们不需要太多数据科学的数学。

因此,我找到了一篇由夏普视觉实验室的乔希·埃布纳撰写的不错的博文。他解释了初级和高级数据科学家之间的区别,数据科学基础技能所需的数学知识,数据科学理论和实践之间的区别,等等。你应该读一下:

https://www.sharpsightlabs.com/blog/math-for-data-science/

蒂姆·霍普的一点建议怎么样?在成为数据科学家之前,他是一名数学专业的学生,也是一名数学博士。他当然知道数据科学需要多少数学知识。简答:不多,不到 10%:

https://tdhopper.com/blog/how-i-became-a-data-scientist/

这是他在 YouTube 上的演讲。

不,你不需要太多的数学,你需要一些,只是某些特定的主题。你可以每周在这里做一个要点:

  • 学习基础代数(仅特定主题)
  • 学习概率(仅限特定主题)
  • 学习统计学(仅限特定主题)
  • 学习线性代数(仅限某些专题)
  • 学习线性回归

Rebecca Vickery 列出了数据科学领域需要学习的数学主题:

https://medium.com/vickdata/maths-and-statistics-a-complete-roadmap-for-learning-data-science-part-3-e1ec585195cf

这就是这篇文章的什么。接下来,我们将谈论为什么如何

线性代数

我学会了如何用熊猫清理数据集。我学会了如何使用 matplotlib 创建可视化。然后我做了 Iris 和波士顿住房项目,然后我没有选择机器学习,而是直接开始了面向程序员的实用深度学习,这是一本非常棒的书。我决定一遍又一遍地阅读这本书,并将永远追随。我喜欢实用的学习方法,不浪费时间,也不指望你能记住研究生院的教学大纲。杰瑞米·霍华德以这种实用的方式授课。在成功 10 天后,我带着这本书建立了熊探测模型,并将其部署在 binder 上,当我遇到这个问题时,我遇到了一个障碍:

(train _ x[0]*权重。t)。sum() +偏差

那是什么**。T** ?

这是我的第一反应。我在 Fast AI 论坛上发布了同样的内容,并得到了一个很好的回复。向量是垂直堆叠的,但它需要处于水平位置。这应该解决了我的问题,但是当我搜索向量的时候,事情变得更复杂了。通常,当我们需要一个矢量时,我们只需这样做:

将 numpy 作为 np 导入

np.array([1,2,3])

我得到了一个矢量,很简单。对吗?

没有。

我查了一个向量在数学中是怎么呈现的,很奇怪。那天,我几乎所有关于“数学中的向量”的搜索都显示了一个向量,看起来像这样:

来自维基百科的矩阵

你可以在这里亲眼看到。现在,这击中了我的头。我想,如果这是向量在数学中默认的样子,那么我们为什么不在计算机科学中默认地做同样的事情。为了获得数学的默认外观,我为什么要这样做:

np.array([1,2,3])。整形(3,1)

下一个问题:为什么这个创建一个矢量,那个创建 ***。**t长得一样?*究竟什么是转置?为什么大多数向量在 math 中是垂直堆叠的,而在编程库中却不是?

我也不知道如何做矩阵乘法。因此,我决定先学习什么是转置、矩阵乘法等,然后再继续学习,而不是在接下来的章节中费力地阅读这本书。数据科学所需的所有线性代数都可以从这些好地方学到:

  1. 线性代数从瑞奇伽
  2. 线性代数从潜入深度学习
  3. 来自帕布鲁·卡塞雷斯的线性代数。(最全。我做了 70%,因为我想学习某些主题。它有很多理论,我认为它包含了你需要知道的足够多的东西,即使是深度学习)
  4. 来自深度学习书籍的线性代数

第四个是我卡住的地方。对我来说太高级了。所以,我留着以后用。

机器学习失败

数据科学作为一个领域还不成熟,因此还没有直接通向数据科学的道路。这与计算机编程、软件工程和 web 开发等领域形成了对比。这三个领域都相当成熟,如果你在任何一个领域需要帮助来建立自己的事业,那么这里有足够的帮助。你需要做的就是去寻找它。数据科学还没有那么发达。一个人必须通过阅读文章、博客和观看视频来不断更新自己。我也一样。也正因为如此,我才知道,在你理解机器学习之前就做深度学习,可能会导致一场“等待发生的灾难”。你需要理解 b/w 线性回归和逻辑回归的区别,以及为什么对于一个特定的问题你会选择其中的一个。如果你不知道,就不要去构建深度学习模型。对我来说很有意义。

于是,我开始了机器学习。

来源:维基媒体

我开始学习线性回归,然后被统计数据重创。我无法把题目的不同部分联系起来。就像 SQL 一样,我已经学习了五遍什么是“模式”和什么是 A/B 测试,然后又忘记了同样的五遍。我参加了宾夕法尼亚州立大学在线的统计,当我试图从其他地方学习更多的统计数据时,我又被一个叫做…

我对概率的感觉

概率是现实生活中用得非常多的东西(就像统计学一样)。而概率思维是不容易得来的。2020 年,我三次尝试学习贝叶斯定理,但三次都放弃了。我花了日日夜夜和周末试图理解贝叶斯定理,但它就像一个我永远无法解开的谜。这一次我更饿了,因为一切都取决于它:

  • 我从程序员实用深度学习开始,在卡住了。T
  • 学习线性代数
  • 开始机器学习,陷入线性回归
  • 统计学是答案,这让我陷入了概率
  • 概率令人沮丧(想想贝叶斯定理)
  • 回到我开始的地方。看不懂数学。冰冻的

5 名建筑工人在 10 天内建造了一堵 10×10 英尺的墙。假设 3 名工人花了 7 天时间把它漆成黄色,那么柏林的西红柿价格与斯德哥尔摩的价格完全相同的概率是多少?

杨淼在 Unsplash 上拍照

是的,每当我失败时,我就是这样看待贝叶斯定理的。当挫折没有被赋予一个授权的意义时,它会让你变得愚蠢。哈里森·简斯马的博客文章拯救了我。我强烈推荐你阅读他的博客文章。他准确地描绘了一个智力一般的人试图自学数据科学的心理状态:

新方法

所以你看,我背着所有的包袱。我需要更多的渴望和动力来打破所有这些“学不会数学”和“我总是陷入贝叶斯定理”等等的枷锁。我看到的唯一方法就是挑战我的能力极限。在人工智能时代,个人生活和职业生活之间的界限已经模糊。无论我们在其中一个做什么,都会对另一个产生你无法想象的影响。我需要新的思维,新的学习方法。我需要给学习赋予新的意义。**我希望数据科学学习的每一个方面都是一次愉快的经历,一次我可以在未来珍藏为美好回忆的经历。**我问自己:

在我的个人生活中,最后几个月我是如何自娱自乐的?我在哪里找到了快乐?

我喜欢看《纸牌屋》、《套装》、《龟壳里的幽灵》、《亿万富翁》、《星球大战》。我疯狂地看了许多季/卷。我决定用整整一周的时间,从周一到周日,疯狂地看,疯狂地读,疯狂地练习概率。但在此之前,我想看看能不能同时一起学统计和概率。这就是我如何得到…

Udacity 体验

我开始了 Udacity 的《统计学导论》免费 MOOC 课程,因为它拥有人们需要的所有统计学和概率。它看起来短小精悍,符合数据科学家的数学方法。这很好,但在第 16 章(33%)之后,我放弃了。问题是,尽管这种 MOOC 切中要害,但它假定了一种自然的数学直觉。尽管 Udacity 说这是一个初级 MOOC,但我发现一个人需要非常聪明,并且有非常好的数学直觉才能通过它。就像我一开始说的,我不是天才,我只是你在街上找到的另一个人。因此,对于 MOOC 的每个部分,我都不得不花两倍或四倍的时间从 MOOC 之外的多种资源中搜索和学习。这是促使我产生“狂看”想法的经历之一。无论如何,你可以试试 MOOC,它的理论更少,而且在每个视频的结尾都有一些很好的问题需要解决。如果可以的话,我强烈建议你去做

适应我的新方法

我想到了一个新计划:

我不会看数学课本我也不会做任何 MOOC】。原因是:这两者都来自于为研究生学习(3+年)设计的学术标准。学术界的人已经是他们学科的专家了,他们已经教授这些学科很多年了,因此关于这些学科的 MOOCs 书籍至少需要一两个学期。如果一个人对这些科目一无所知,也没有一两个学期来学习,那该怎么办?

在第四次工业革命中,我们所有人都试图进入数据科学领域。我们时间紧迫,我们没有 3 年时间。我们需要尽快起床开始生产东西(我上一份工作已经过去一年了)。这就是为什么我们必须想出新的学习方法来满足 21 世纪的商业需求。卡梅隆·沃伦在他的博客文章《不要做数据科学》中对此做了更好的解释:

老实说,我非常尊重学术界。一些最伟大的发现来自学术机构。事实上,我仍然渴望成为学术界的一名研究人员,主要是因为它不是由商业利益操纵的。我想读硕士,然后读机器学习的博士(甚至可能是两个博士)。我认为人类的发展依赖于学术界,正如它依赖于企业带来技术来解决问题一样。也就是说,每件事都有时间和地点,现在我需要的是快速但基本的学习。

不要追随你的激情

我不追随我的激情。我花了很多年试图找到我的激情。经历了一次又一次的失败后,我明白了一个人不能纯粹基于自己的激情来选择职业。这是一个艰难而痛苦的教训,它与通常的激励帖子和常识背道而驰。那你接下来要做的。阅读卡梅隆·沃伦所说的:

https://medium.com/@camwarrenm/how-to-figure-out-what-your-passionate-about-a23d59c0163d

我是如何学习的

  1. 如果我对一个地方的东西不了解,我就辞职去第二个地方。我不会花几个小时在同一篇文章、博客或视频上努力工作,而是专注于手头的主题,这让我变得灵活。我使用一个又一个资源,直到我有了概念/想法。
  2. 我练题。我们不能通过阅读和理解来学习数学。我们需要把它应用到问题上。mathisfun.com 的有一个问题列表和答案。这是我用来练习贝叶斯定理的

42Mbartelsm的回答,来源:维基媒体

我想我找到了我的 42 。这个方法对我很有效。它可能对你有效,也可能对你无效,但除非你尝试一周,否则你不会知道。我读过数百篇关于如何学习数据科学的数学的博客文章,其中许多不起作用,但也有一些起作用。最终,我找到了自己的路。我没有通过思考找到我的学习之路。我尝试了很多次,失败了很多次。所以,你必须不断尝试,直到你成功。给一个新方法几天或更长的时间,而不是几周或几个月。一周没问题。

可能性

我从贝叶斯定理开始,但最终我沉迷于观看、阅读和实践许多统计学和概率的概念。以下是我用来学习条件概率和贝叶斯定理的资源:

  1. 艾迪·吴的离散随机变量。总共 3 个视频(这包括预期值)
  2. 来自艾迪·吴的排列组合
  3. 来自马里奥数学辅导的排列组合
  4. 来自数学的贝叶斯定理很有趣
  5. 条件概率、贝叶斯定理和其他来自 Investopedia
  6. 来自 zedstatistics 的概率分布(用梯度来解释)
  7. 来自的概率密度函数(PDF)由 Michael 解释(用代数和图形解释)
  8. 迈克尔解释的中的累积分布函数(CDF)
  9. 来自杰森·吉普森的mathtutordvd.com的离散概率分布(关于什么是离散概率分布的最佳视频)
  10. 一篇关于 PDF vs PMF 的出色的 StackExchange 帖子
  11. Math insight 链接关于 PDF 的想法来自我上面提到的 StackExchange 帖子
  12. 麻省理工开放式课程PDF 讲座(在 StackExchange 帖子中提到)

现在我可以用费曼技术解释所有关于 PDF 的内容了:-)。

我不是唯一一个理解这个学习原则的人。肯·吉在他的 YouTube 视频中提出了一个类似的计划:

YouTube 上的肯·吉

如果您正在开始您的数据科学之旅,这是一个非常好的视频。可能会让你少受几个月的折磨。继续,看它,然后回到这里

统计和线性回归

最后,当我在圣诞节假期写这篇博客的时候,我也疯狂地看了 StatQuest 的的统计基础的文章。

他的线性回归和线性模型播放列表就是我现在正在看的。这个家伙很擅长解释东西,他不浪费任何时间,他让事情切中要害,并确保在前进之前进行审查,所有这些几乎没有任何代码。他力求清晰和基本,这是学习任何东西的全部意义。到目前为止,Josh 对对数和线性回归的介绍是我见过的最好的。你会喜欢他的鼓、小鼓和三鼓:-)

提醒你一下,统计学习介绍提到线性回归是前提条件。所以我想在我拿起这本书之前读完它是个好主意。那本书几乎被称为机器学习算法的圣经。

战胜对数学的恐惧

这是一件大事。有很多学习者害怕数学。即使我们不需要知道很多数学知识,但是对数学的恐惧仍然不让我们理解和掌握我们需要学习的任何主题。他们认为自己没有数学头脑。成为像乔治·康托(Georg Cantor)这样的天才和创建数学实体以及能够理解并使用数学作为解决问题的工具/模型是两件非常不同的事情,前者是来自宇宙(或上帝)的礼物,而后者是一套技能。我明白我们都不是天才,也不是优秀的哈佛或牛津毕业生。这个限制我们也无能为力。毫无疑问,我们可以在“态度”和“能力”方面做些什么,以获得数学技能。我们可以反复灌输数学思维作为我们性格的一部分。看看这些视频,改变你对数学以及你能学什么或不能学什么的看法:

列表 A:

数学魔法师的任意 10 个你喜欢的视频(我看过 30+)。从这些开始:

  1. 自学数学的三个技巧
  2. 6 个鲜为人知的理由为什么自学是数学成功的关键
  3. 为什么有些人学数学这么快
  4. 如何克服数学失败

列表 B:

  1. 学数学需要什么?去生活吗?米洛斯拉夫·洛夫里奇
  2. 一旦掌握了最好的学习技巧,任何人都可以成为数学人
  3. 你如何擅长数学,以及其他关于学习的令人惊讶的事实
  4. 我们教育系统的有趣故事

只有当你有兴趣了解印度的教育系统是如何运作的时候,才看最后一个。这就是我所研究的,所以我有一点偏见把它包括在这里。顺便说一下,这是一个有趣的视频。

列表 C:

拿起一个你一直想学的数学题目,去数学很有趣阅读它,完成所有的练习。相信我,通过这样做,你会立刻消除一半的恐惧。这些解释如此简单、容易和基本,以至于不管你的年龄或背景如何,你都能看穿数学。

如何不忘记你所学的东西

当你通过阅读、观察和解决问题来学习上述所有内容时。在一周左右的时间里,你会很快忘记其中的 80-90%。使学习永久化的唯一方法是:

  1. 每天在工作中使用它
  2. 按照固定的时间表复习

而#1 可能不太可能,因为您正忙于构建数据科学项目。我可以对第二点说同样的话。是的,你可以像我在学生时代制定的固定时间表一样复习:

  • 在周末之前复习本周所学的内容
  • 每周修改+前几周
  • 在月底复习你学过的东西
  • 每月修订+前几个月

这在学校行得通,但现在在专业工作环境中却行不通。现在唯一对我有效的方法是方法 1。自学成为数据科学家的魔咒是,学的东西都用不上。于是我只好想出方法三利用 的费曼手法

  • 一旦你学会了一个话题。接下来使用费曼技巧
  • 将主题的标题放在列表中
  • 在周末,检查你的清单,用费曼技巧解释清单上的所有话题

图片由来自皮克斯拜的约翰·海恩拍摄

我认为你不需要每月修改。

这种方法的好处

这种狂欢-* +费曼技巧的方法有几个好处:

  • 你不需要等很久。你节省了很多时间,因为你不需要阅读整本数学书或进行 MOOC,这两者都需要几个月的时间。
  • 你只学习你需要的东西。数据科学不是数学。不要忘记行业、商业价值、投资组合准备、GitHub 存在、商业利益相关者以及使用数据讲故事。你不能用“全面学习数学”来代替那些。
  • 你的重点仍然是真正的工作
  • 你学会了如何解释。这是一项非常有用的技能,可以让你在工作场所表达自己的观点,同时尊重你周围的每个人。这在面试中也是有益的。
  • 既然你已经掌握了某些数学主题背后的基本概念,你就可以在空闲时间探索和学习细节,如果你没有时间紧迫的话。就业后,如果微积分激发了你的好奇心,或者你的领域需要这方面的专业知识,你甚至可以制定一个 3 年或 5 年的计划来掌握微积分。

这些好处看起来微不足道,但却是决定你是否会成功的主要因素。

图片来自蒙塔纳苏弗拉格蒂,来源:维基媒体

收场白

祝你学习顺利,希望你继续坚持。数据科学很难,但肯定是你力所能及的。这可能需要时间,但所有有价值的职业都需要时间。

2020 年将作为疫情年、封锁和面具年、动摇全球各国基石的一年载入史册。它没有放过任何人,无论是雇员还是雇主,无论是政府还是公众,无论是黑人还是白人,无论是热爱上帝的人还是无神论者。这是我有生以来第一次在国际层面上看到如此的恐惧和浩劫。这让我想起了一句中国古话“天下一家”。我们突然被抛进了一个的黑暗时代。就好像一些反乌托邦的科幻小说正在变成现实。

虽然这是一幅暗淡的画面,但历史上第一次,这样一个黑暗的事件将全世界的科学家团结在一个统一战线之下:将人类从这一危险中拯救出来。全球无数科学家孜孜不倦地研发疫苗。最后,已经生产了不止一种而是两种疫苗,2021 年还会有更多。如果我们有能力承受并走出这个疫情,那么对数学的恐惧只是人类大脑能力所能处理的一件小事。让我们带着*“我将打破学习数据科学的任何障碍”*的信念迈进 2021 年。你需要拥有这个。这个世界上没有什么事情是不可能的,学习数据科学的数学,磨练你的软技能,以及制作一个令人印象深刻的数据科学投资组合都不在其中。 愿原力与你同在

我如何创建我的第一个 R 函数

原文:https://towardsdatascience.com/how-i-made-my-first-r-function-776f57e2ec7b?source=collection_archive---------27-----------------------

以及如何也能做到:一个真实世界的例子。

学习 R 是一件非常痛苦的事情——学习曲线很陡,可能会让人不知所措。让我回到这个令人谦卑的旅程的是这样一种能力:只需要为某件事做一次,然后根据需要重复做多次。我热爱效率,所以我坚持不懈。今天我遇到了一个乏味的烦恼,通过创建一个函数,我可以在几分钟内解决它。

形势

我正在寻找一个新的公寓,并试图比较价格。幸运的是(谢谢,COVID),一些单位正在提供一两个月的免费(!)的租金。这是一个极好的消息,但是很难比较价格。

我在做什么

当我看到有打折租金的房源时,我会打开我的计算器应用程序,然后:

  1. 免费月数(折扣)*月租金(基本租金)
  2. 最短租赁期限(通常为 12 个月)*月租金(基本租金)
  3. 从#2 中减去我从#1 中得到的,然后除以最短租期要求

由凯利·西克玛在 Unsplash 上拍摄

如果我这样做一次,甚至两次,也不会那么糟糕。但是当我第三次尝试时,我开始感到沮丧。我知道我每次想要执行的确切步骤,但是我不得不手动执行每一个步骤——讨厌!

救援功能!

r 函数基础

第一次用 R 写函数时,我真的很害怕,但这有助于一点一点地分解它。请记住,函数会很快变得复杂,但我们会尽可能保持简单。

在最基本的情况下,R 中的函数具有这样的结构:

创造于碳。

不太吓人吧?功能实际上只是:

  1. 您的函数(myfunction)的名称
  2. 输入或执行您的功能所需的数据(输入)
  3. 您希望完成的步骤

函数的一个例子是 mean()。当你想计算平均值时,R 知道把所有的数字相加,然后除以有多少个数字。我们可以直接使用均值函数,而不必自己将数字相加,然后进行除法运算。因为我也有每次都想重复的固定步骤,所以函数是一个很好的解决方案。

我的 R 函数

让我们回到我的租赁示例,确定输入和要完成的步骤。

我需要计算我的有效租金的输入是基本租金、折扣(提供的免费月数)和期限(通常为 12 个月)。

我希望完成的步骤是:将基本金额乘以期限长度减去基本金额乘以折扣。然后我想用它除以期限,看看在应用折扣后,每个月我将有效支付多少。

我将调用这个函数 myrent,并告诉它我们需要三个输入:基本租金(base)、免费月数(discount)和租赁期限(term)。

我们还没有告诉 R 这些输入(基数、折扣和期限)是什么意思。我们也可以使用 x,y,z,我们现在所做的就是告诉它,我们将需要这三条信息,然后我们将对它们做些什么。

现在是步骤。我们将友好地告诉我们的朋友(我笑了)我们想要完成的步骤,并把它们放在内。

事情进展顺利!最后一步,我们需要让 R 告诉我们,在完成我们指定的步骤后,它计算了什么。所以我们要让 R 打印(baseterm-basediscount)/term 的答案“result”。

瞧,我们已经准备好使用我们的功能了!!!比方说,我看到了一套月租 2000 美元的公寓(是的,我也很难过,DC 房产真是个混蛋),他们提供 12 个月的免费租赁。

既然我们已经创建了函数,我们要做的就是使用“myrent”调用它,并输入每个输入(基本、折扣和期限)。

就这样,我们信任的伙伴给了我们[1] 1833.333.

这意味着,如果固定租金是每月 2000 美元,并且有两个免费月的折扣,我将在 12 个月内每月支付 1833.33 美元。我现在可以很容易地将它与每月 1920 美元的公寓进行比较,该公寓提供一个月的免费折扣。神奇!

继续用你的头撞墙,这样会好很多!

作者: 詹娜·伊格尔森我的背景是工业组织心理学,我在人物分析中找到了自己的家。数据使我的作品变得生动。我主要使用 Power BI,但我也喜欢涉足其他工具。我很想听到更多关于你的旅程!在此评论或在推特上评论联系我。

如何使用 AWS Secrets Manager 在 Python 中管理凭证

原文:https://towardsdatascience.com/how-i-manage-credentials-in-python-using-aws-secrets-manager-1bd1bf5da598?source=collection_archive---------3-----------------------

在 Python 中访问凭证的平台无关方式

照片由 Kat Jayne 从 Pexels | 品牌内容披露

E 尽管 AWS 通过 IAM 角色实现了细粒度的访问控制,但有时在我们的脚本中,我们需要使用与 AWS 无关的外部资源的凭证,如 API 密钥、数据库凭证或任何种类的密码。有无数种方法可以处理这种敏感数据。在本文中,我将向您展示一种使用 AWS 和 Python 来管理它的极其简单而有效的方法。

目录:

管理凭证的不同方式
描述用例
实现— PoC 展示此方法
∘ 创建 API 密钥
∘AWS secrets manager
∘使用 awswrangler
∘ 使用检索到的凭证获取股票市场数据
∘ AWS AWS 机密管理器的好处
与 AWS 机密管理器的潜在风险
结论

管理凭据的不同方式

根据您的执行平台 m (Kubernetes、本地服务器、分布式云集群)或版本控制托管平台( Github、Bitbucket、Gitlab、Gitea、SVN……),您可以使用不同的方法来管理机密访问数据。以下是我到目前为止听到的处理凭据的最常见方法的列表:

  • 环境变量,
  • 作为 CI/CD 部署的一部分接收凭证,
  • 利用开发工具中的特定插件。无服务器凭证插件,摄取 Pycharm 中运行/调试配置中的环境变量,
  • 在工作流程编排解决方案中存储凭据。气流连接或提督秘笈,
  • 将凭证存储为 Kubernetes 或 Docker secrets 对象
  • 利用工具,如 HashiCorp Vault 。

以上所有解决方案都是完全可行的,但是在本文中,我想通过利用 AWS Secrets Manager 来演示一个替代解决方案。该方法将是安全的(使用 AWS KMS 加密),并且无论您是在本地、在 AWS Lambda 中还是在独立服务器上运行 Python 脚本,只要您的执行平台被授权访问 AWS Secrets Manager,该方法都将以相同的方式工作。

我们的使用案例

我们将执行以下步骤:

  • 在 Alpha Vantage 平台上创建一个 API key ,这样我们就可以从这个 API 中获取股市数据。
  • 将 API 密钥存储在 AWS Secrets Manager 中,
  • 仅使用两行 Python 代码,在我们的脚本中检索这个 API 键
  • 使用该键获取最新的苹果股票市场数据
  • 构建 AWS Lambda 函数,并在那里测试相同的功能。

实施—展示此方法的概念验证

创建 API 密钥

如果你想跟进,去https://www.alphavantage.co/拿你的 API 密匙。

Alpha Vantage —作者图片

AWS 机密管理器

首先,确保您为 AWS CLI 配置了能够与 AWS Secrets Manager 交互的 IAM 用户。然后,您可以在您的终端中使用以下简单命令存储秘密:

要查看它是否有效,您可以使用以下命令列出您帐户中的所有秘密:

如果你的证书以后发生变化( ex。如果您更改了密码,更新凭证就像下面的命令一样简单:

使用awswrangler检索凭证

AWS Secrets Manager 允许将凭证存储在一个 JSON 字符串中。这意味着一个单独的秘密可以保存您的整个数据库连接字符串,即您的用户名、密码、主机名、端口、数据库名称等。

awswrangler 包提供了一种方法,将这些数据反序列化到一个 Python 字典中。当与**kwargs结合使用时,您可以将字典中的所有凭证直接解包到执行身份验证的 Python 函数中。

我的 requirements.txt 如下(使用 Python 3.8 ):

然后,要检索使用 AWS CLI 存储的秘密,您只需要这两行:

使用检索到的凭证来获取股票市场数据

有一个方便的 Python 包叫做 pandas_datareader ,它允许轻松地从各种来源检索数据并将其存储为 Pandas dataframe。在下面的例子中,我们正在检索过去两天的苹果股票市场数据(当天)。请注意,我们正在从 AWS Secrets Manager 传递 API 密钥,以便与 Alpha Vantage 数据源进行认证。

这是我得到的一个数据框架:

苹果股票市场数据——图片由作者提供

使用凭据的 AWS Lambda 函数

既然我们能够在本地机器上访问凭证,下一步就是在 AWS Lambda 中做同样的事情,以证明这个方法是平台不可知的,并且可以在任何可以运行 Python 的环境中工作。

**边注:**我正在使用一种新的替代方式,用一个 Docker 容器映像来打包 AWS Lambda 函数。如果你想了解更多,可以看看我之前的文章中更详细的讨论。

我使用以下 docker 文件作为我的 AWS Lambda 函数的基础:

src 目录中的脚本 lambda.py 如下所示:

为了构建代码并将其打包到 Docker 容器中,我们使用以下命令:

最后,我们构建一个 ECR 存储库,并将映像推送到 ECR:

**注意:**用您的 AWS 帐户 ID 替换 123456789。此外,相应地调整您的 AWS 区域——我使用的是 eu-central-1

我们现在准备在 AWS 管理控制台中构建和测试我们的 AWS Lambda 函数。

使用 AWS Secrets Manager 为 API 密钥检索部署 AWS Lambda 图片由作者提供

了解我们的 Lambda 函数

如果您正在运行多个 Lambda 函数工作负载,那么考虑使用一个可观察性平台是有益的,它将帮助您保持所有无服务器组件的概览。在下面的例子中,我使用 Dashbird 来获得关于上面执行的 Lambda 函数的附加信息,例如:

  • 每个特定函数调用的执行持续时间,
  • 寒冷开始了,
  • 内存利用率,
  • 调用次数和错误百分比,
  • …还有更多。

使用 Dashbird 调试并了解 AWS Lambda 函数调用——图片由作者提供

你可以在上面的图像中看到,第一个函数执行有一个冷启动。第二个用了 100%的内存。这些见解帮助我通过增加分配的内存来优化资源。在随后的调用中,我的函数运行得更快了,并且没有用尽总内存容量。

AWS Secrets Manager 的优势

希望您可以看到使用这个 AWS 服务存储和检索您的敏感数据是多么容易。以下是这种方法给你带来的好处:

  • 安全性 —使用 AWS KMS 对凭证进行加密
  • 一个集中存放所有凭证的地方 —如果您决定将所有凭证存放在这里,您将获得一个存放所有凭证的地方。获得授权后,您还可以在 AWS 管理控制台中查看和更新机密。
  • 可访问性&独立于平台的凭证存储 —我们可以从本地机器、无服务器功能或容器、甚至本地服务器访问机密,前提是这些计算平台或进程被授权访问 AWS Secrets Manager 资源。
  • 跨编程语言的可移植性 — AWS 为各种语言提供 SDK,这样你就可以使用 Java、Node.js、JavaScript、Go、C++、。NET 等等。
  • AWS CloudTrail 集成 —当启用 CloudTrail 跟踪时,您可以跟踪谁在何时访问了特定凭证,这为您提供了关于资源使用情况的审计跟踪。
  • 访问控制的粒度 —我们可以轻松地将特定凭证的权限授予特定用户,从而更容易了解谁可以访问什么。

AWS Secrets Manager 的潜在缺点

我有一个政策,总是不加粉饰地提供任何技术的利弊。这些是我到目前为止看到的在企业范围内使用此服务管理凭据的风险或缺点:

  • 如果您将所有凭证存储在一个位置,并且您没有根据最小特权原则授予访问权限,即某个超级用户可以访问所有凭证,那么当该超级用户的凭证被泄露时,您就有暴露所有机密的风险。这是唯一正确的,如果你不恰当地使用服务,但是为了完整起见,我还是想把它包括进来。
  • 费用——由于你每月为每个秘密付费,你必须意识到,如果你使用该服务存储大量凭证,价格可能会增加。
  • 信任 —仍然很难让一些 it 经理相信云服务在正确配置的情况下会比本地资源更安全。话虽如此,许多 IT 经理仍然不信任任何云供应商,不会向他们吐露秘密。
  • 您的执行平台必须能够访问秘密管理器本身。这意味着您要么需要配置一个 IAM 角色,要么需要以其他方式存储这个秘密。这并不是一个真正的缺点或风险,而是简单地说,您需要意识到对 Secrets Manager 的访问也需要以某种方式进行额外的管理。

结论

在本文中,我们研究了用 Python 脚本管理凭证的 AWS Secrets Manager。我们可以看到使用 AWS CLI 来放置、更新或列出秘密是多么容易。然后,我们看了看如何使用 Python,通过包 awswrangler 只用两行代码就能访问这些凭证。此外,我们将脚本部署到 AWS Lambda 来证明这个方法是平台无关的。作为一个额外的部分,我们研究了如何使用 Dashbird 为我们的 Lambda 函数增加可观测性。最后,我们讨论了 AWS Secrets Manager 作为一种企业级凭证管理方式的优缺点。

我如何将我的数据科学博客从 Pelican 迁移到 Hugo

原文:https://towardsdatascience.com/how-i-migrate-my-data-science-blog-from-pelican-to-hugo-732e4feb3c43?source=collection_archive---------23-----------------------

你也可以!

卡尔·海尔达尔在 Unsplash 上拍摄的照片

动机

鹈鹕的问题

我使用 Pelican 作为我的数据科学博客的框架已经有一段时间了。它对我很有效,尽管总有一些小故障让我感觉不稳定。它从来没有让我感到完整和满足。以下是一些重要的例子:

小社区和小众定位

鹈鹕的群体比雨果小得多。它有 10.4k 颗星星,而 GitHub 上有 51.4k 颗星星。在静态站点生成器社区上,Pelican 是一个利基。已经知道 Python 的人可能想试试(像我!),但是具有更好理解和编程技能的其他人可能更喜欢其他选项。如果你遇到一些奇怪的问题,一个更小的社区会有更少的主题,更少的插件,更少的支持。这正是我的经历。

缺乏令人满意的主题

很难找到我目前的主题既美观又实用。首先,没有多少选择。

难以解决的小故障

我花了相当大的力气才让一切都运转起来。谷歌分析,Disqus,Jupyter 笔记本支持,目录,阅读时间等。在这个过程中,我几乎没有得到任何帮助,因为根本没有多少人使用它。所以我必须深入研究源代码来解决一个小问题。这并不是说这个过程不值得花时间(对我这个程序员来说,这个过程很有挑战性,也很有教育意义),而是为什么我必须在可以照料花朵的时候挖出石头?

速度,速度,速度

当谈到编程语言的速度时,Python 坐在“最慢”的一端,而 Go(几乎)在顶端。我能告诉你的是:它确实显示了现场发电速度。Pelican 需要几秒钟来渲染我所有的文章(20+),而 Go 只需要几毫秒。Go 的另一个好处是,它可以实时更新网站,而 Pelican 会稍微落后一些。当你做了一个小的改动,需要重新生成整个站点才能看到更新的版本时,这一点就更明显了。我们的时间太宝贵了,不能浪费,即使是几秒钟也会积累很多。

为什么是雨果

照片来自https://gohugo.io/

并发和速度

H ugo 自诩为“世界上最快的网站建设框架”,我完全明白这是为什么。Golang 由 Google 开发,用于解决他们的代码效率问题,并以其强大的并发能力而闻名。这对雨果来说很适用。Hugo 站点的标准构建时间是 100 毫秒,而另一个静态站点生成器是 10 秒。如果你关心速度,那么你一定会喜欢雨果。

良好的社区支持

Hugo 在 GitHub 上的开源项目目前显示的是 54.4k 的星星。这是一个相当大的数字。许多人使用 Hugo 作为个人/商业博客的首选框架。这意味着当有疑问时,更容易搜索类似的问题。此外,Hugo 官方论坛的回应时间相对较短,因为你的问题框架非常精确。Hugo 也有很好的文档,如果你实现了一个新特性,你可以很容易地找到你想要的。

曝光完毕

Golang 作为一种服务器端语言,在过去几年里越来越受到后端开发人员的青睐。这是一门值得花时间学习的语言。与 Hugo 合作不可避免地会让你接触到围棋,当你建立自己的网站并开始学习围棋时,你可能会学到一些东西。

主题,很多主题

不用再看官方的雨果主题网站。这些是免费的。也有一些网站提供付费的高级主题,你可以决定是否值得。无论是免费的还是付费的,Hugo 主题社区都非常活跃,有很多选项可供选择。

平滑学习曲线

一些静态站点生成器,比如 Gatsby,你需要对 React 有很深的理解才能使用它。对雨果来说,你真的不必先学习围棋,尽管知道一些围棋会让你更顺利地加快速度。

我的第一个 Hugo 网站

照片来自https://themes.gohugo.io/hugo-theme-stack/

E 理论制造的充足。让我们开始讨论细节。我将按时间顺序组织这一部分,以展示通常是如何完成的流程,我遇到的一些问题,以及我如何解决它们。

从快速入门开始

最简单也是最好的(至少对我来说)开始迁移的方法是按照官方的快速启动从零开始建立一个新站点。它相对容易遵循,甚至没有很多步骤。如果你知道一点命令行和 Git 会有帮助,但不是必需的。Hugo 自带强大直观的 CLI 界面,即使不太懂命令行,也能毫不费力地完成教程。例如,建立站点仅仅是:

快速启动将为您选择一个主题(anake)您可以稍后轻松地将其更改为您自己的选择。最终的网站看起来会像这个这个。

选择一个主题

选择主题大多是主观的。选择你想要的任何东西。一些看起来对你有吸引力并满足你所有实用需求的东西将是一个好的开始。只是不要花太多时间来确定你的“完美伴侣”,有这么多选择,你可能会在确定一个你真正感到舒服的之前转换多次。我的是栈。对于你的第一个站点,一定要看一下主题文档,因为你肯定需要多次阅读来根据你的喜好进行调整。

配置和调整

有趣的部分来了,修修补补!对一些人来说,调整一个主题让它为你工作是令人畏惧的,但是对我来说,这是令人畏惧和令人兴奋的。感觉就是解谜。你从主题文档、Hugo 文档、YouTube 视频和 stack overflow 中获得线索,然后把所有的片段放在一起。完成后,你会自我感觉良好!

克隆、子模块和配置

首先,git 将主题克隆到本地驱动器:

这有助于将主题添加为子模块。这样使用 Git 更容易管理。如果你想把你的站点放在 Netlify 上,你将需要它用于将来的部署。一旦主题文件夹安全地放在你的本地驱动器上,你只需要对配置文件做一些小的调整就可以了。有两种方法可以做到这一点。一个简单的方法是改变你当前的config.toml文件:

但是如果你阅读了主题文档,建议的是简单地从主题示例站点复制config.yaml文件,因为还有其他部分的配置你需要得到正确的,从主题默认配置文件开始更容易。一旦完成,你的简单网站将开始看起来像这样:

来自 https://themes.gohugo.io/hugo-theme-stack/[的照片](https://themes.gohugo.io/hugo-theme-stack/)

电影《阿凡达》

现在,为了让主题为你所用,你需要解决一些小细节。首先引起我注意的是醒目的占位符“150x150”头像:

图片来自https://themes.gohugo.io/hugo-theme-stack/

必须先处理掉它!查看文档,头像需要放在网站根目录下assets文件夹下的某个地方(我放在img子文件夹下)。然后换config.yaml告诉 Hugo 去哪里找:

网站自动重新加载,头像更新到我不太好看的照片:

作者照片

Favicon

当你拥有它时,你永远不会注意到它。但是如果它不在那里,它的缺失会永远抓住你。让我们直说吧。我的网站还没有图标,所以我需要创建一个。一个快速的方法是使用 favicon.io 。它可以让你用一张图片、几个字符或者你喜欢的表情符号来生成你的 favicon。为了简单起见,我决定用我的名字。如果不满意,你可以随时修改。用户界面如下所示:

图片来自 favicon.io

下载完 favicon 资源文件后,下一步是确定将它们放在哪里。查看主题文档,没有提到它应该放在哪个文件夹下。如果官方文档不足,查找信息的最佳方法是什么?当然是 GitHub!通常,人们会抱怨开源项目的 GitHub 缺乏信息,并提交问题。让我们看看是否能在那里找到任何线索。经过一番搜索,主题的 GitHub 页面可以找到这里在回购内搜索“favicon”,啊哈,我们有 12 个与之相关的问题:

照片来自https://github.com/CaiJimmy/hugo-theme-stack

圈出的问题(虽然是中文的)是我们需要的,它指引我们到/static文件夹来放置图标。我把它放在/static/img/下面。然后更新config.yaml:

重新装弹,有效!

作者照片

前页

前事是你帖子的元数据。它包含您可以使用的各种预定义变量,或者如果您愿意,您可以自定义自己的变量。这一切都非常灵活。其中,titledatedescriptioncategoriestagsimage最为重要。categoriestags也决定了如何组织你的内容。

内容组织和特征图像

主题允许两种方式来组织你的内容:类别和标签。要做到这一点,只要把它们包含在你的前面就行了,就像这样:

image: 9-things-i-learned-from-blogging-on-medium-for-the-first-month.jpeg
title: “9 Things I Learned from Blogging on Medium for the First Month “
description: “Why Medium is a good platform to exchange ideas”
slug: 9-things-i-learned-from-blogging-on-medium-for-the-first-month
date: 2019–10–04T20:56:10.704Z
categories: Machine Learning
tags: 
- “Machine Learning”
- “Blogging”
- “Medium” 

该主题将收集你所有文章中定义的所有类别/标签,并将它们放在相关的“类别”和“标签”页面中。您还可以为每个类别或标签提供一个特征图像。只需在/content/下创建categoriestags文件夹,在每个文件夹中,为每个类别或标签创建一个子文件夹,在子文件夹下放入_index.md文件和一张图片(比如说ML.jpg)。在_index.md文件中,放一个前置事件变量image并指向图像ML.jpg。像下面这样:

作者照片

配置完成后,它应该如下所示:

照片来自https://themes.gohugo.io/hugo-theme-stack/

短代码—图像标题

通常情况下, Markdown 文件中的图像应该是这样的:

![Image]{URL}

但不幸的是,这对于图像标题来说效果不佳。经过几次尝试和错误之后,我发现 Hugo shortcode figure工作得很好:

看起来是这样的:

作者照片

既然重要的部分都已经完成了,是时候写一个脚本将我的基于 Pelican 的 Markdown 文件转移到基于 Hugo 的文件了。

编写从鹈鹕到雨果的迁移脚本

阿文已经想出了制作这个主题的所有细节,现在是时候把我为鹈鹕量身定做的帖子转移到更适合雨果的地方了。这可以通过一些 Python 脚本轻松完成。我使用了来自 GitHub repo 的代码作为基础,并根据我的需要进行了修改。代码非常简单明了。它读取旧 Markdown 文件的每一行,使用 regex 搜索短语,并需要相应地更新和修改每一行,主要是前端内容、图像和视频链接。

值得注意的几点:

  1. 该脚本将删除输出文件夹(Hugo 内容文件夹)中的所有内容,并从源文件夹中重新生成它们。
  2. 前事:大量使用正则表达式替换元数据。例如从“标题”到“标题”,“副标题”到“描述”,日期格式等。
  3. 图片:提取 Medium CDM URL,下载图片,放在 post 子文件夹下,这样特征图片就可以工作了。为了更好的字幕,其他图像被放入了一个 Hugo shortcode。
  4. YouTube :提取视频 ID,放入{{youtube}} Hugo shortcode。它非常有效。

将我的新媒体帖子转移到 Hugo markdown

我有一些中型职位尚未转移到我的鹈鹕博客,所以需要另一个脚本。不用自己写。我使用了来自 GitHub repo 的 Python 脚本。你需要使用 Medium 的导出服务将你所有的帖子放入一个 zip 文件,然后使用脚本将它们转换成 Hugo markdown。由于帖子不多,我做了一些手动调整,为每篇文章创建子文件夹,这样特写图像就可以工作了。

来自 https://github.com/chamilad/medium-to-hugo[的照片](https://github.com/chamilad/medium-to-hugo)

在 Netlify 上切换回购

最后,我们得到了我们需要的一切,现在是时候把网络生活从鹈鹕变成雨果了。激动人心!首先,我为 Hugo 网站创建了一个回购,这里。然后,登录我的网络生活账户,进入我的网站,点击SIte Settings:

图片来自 netlify.com

选择Build & Deploy选项卡,然后点击Edit Settings,像这样:

图片来自 netlify.com

选择Link to a different repository->,会出现一个向导屏幕,在这里你可以选择你的 Hugo 库。这样做,并做一些基本的构建设置。其中,注意构建命令只是简单的hugo。值得注意的一点是雨果版本。Netlify 上的默认 Hugo 版本不够高,无法正确构建我的站点,我遇到了许多奇怪的错误。我找到了在我的站点根目录下添加一个netlify.toml的解决方案,并在其中分配 Hugo 版本。你可以在找到参考指南。完成所有设置后,新的构建将生成新的站点。

总体感觉

哦,这是一篇很长的帖子。我很感激能走到这一步的人。我希望这篇长文对你的雨果之旅有所帮助。最后,我想分享一下我对整个过程的总体感受:

  1. 这并不难,但需要烫平一些皱纹。(也是好玩的部分?)
  2. 主题采用需要最长的时间。文档会有所帮助,但通常并不完整。GitHub 问题帮助很大。
  3. 有很多非常善良的人写了脚本来自动化迁移。使用它们,但是不要犹豫根据你的需要修改它们。一点点编程大有帮助,尤其是当你有很多文章的时候。

加成

YouTube 系列 我用来学习 Hugo 基础知识的,都是一口大小的。

觉得这篇文章有用?在 Medium 上关注我(wayofnumbers.com)或者你可以在 Twitter @lymenlee 或者我的博客网站上找到我。你也可以看看我下面最受欢迎的文章!

我如何监控与 Prometheus 和 Grafana 的 SSH 会话

原文:https://towardsdatascience.com/how-i-monitor-active-ssh-sessions-with-prometheus-and-grafana-f4811da0a8cc?source=collection_archive---------16-----------------------

这是时间的问题,而不是事情是否会发生。最好做好准备。

照片由西格蒙德在 Unsplash 拍摄

如果尽管采取了所有安全措施,如高级配置、非对称加密和端口敲门,但攻击者还是获得了对我的一台云服务器的访问权限,该怎么办?

我如何以及何时才能发现?难道我不想尽早知道我的一个服务器被入侵了吗?

我不断地问自己这些问题,并决定用 Prometheus 和 Grafana 创建一个监控活跃用户会话的解决方案。我的目标是在我的一台服务器上创建了一个新的用户会话(例如 SSH)时,立即收到通知。当然,这不会阻止攻击者访问系统,但至少会暴露他们的活动。

你可以在下图中看到最终的结果。这是我的 Grafana 实例的截图。每当我登录到我的系统时,该图显示一条红线,因为触发了一个警报,在我注销后显示一条绿线。每一个状态变化都会触发一个电子邮件通知。

显示数据库服务器上活动用户会话的 Grafana 面板

这是我开源软件家族的最新成员的故事。为 UNIX 系统上的活跃用户提供的 Prometheus exporter。

如果你已经熟悉普罗米修斯和格拉法纳或者想直接跳转到导出器的实现细节, 点击这里

问题是

我们公司大约在四年前(2017 年)开始采用弹性计算。我很幸运地成为了我们的第一批用户——当时——破坏了在日常业务中使用云基础设施的计划。直到我建立了自己的私有云服务器,我才最终意识到,是的,公共云服务器往往是公开的——对互联网上的任何人都是公开的。

这在工作中没什么大不了的,因为消费服务不同于提供服务。我不必担心我们工作中的虚拟机的安全性,因为有另一个团队负责它。亚马逊网络服务(AWS)显然在很久以前就了解了这一点,并发布了它所谓的共享责任模型。这个模型是关于 AWS 和它的客户在一个亚马逊乐于提供其服务器和服务的世界中的责任。虽然 AWS 负责对服务器的物理访问,但客户必须负责对存储在其虚拟机上的数据的虚拟访问

现在,由于显而易见的原因,我们无法物理访问 AWS 的服务器并插入以太网电缆,因此我们使用 SSH 等工具和协议通过公共互联网访问我们的云服务器。尽管有办法在 AWS 或 Azure 等云提供商上创建私有和混合网络,但这些功能可能只是愿意花费时间和金钱来构建此类网络的企业客户的一种选择。

作为一名热爱软件开发的软件架构师,我决定在去年夏天的这个时候开始开发我的第一个软件即服务(SaaS)产品。由于对维护物理硬件不感兴趣,我也决定购买一些云服务器。

因此,我阅读了几篇关于配置 OpenSSH 和 fail2ban 的文章,以丢弃来自尝试使用 OpenSSH 登录但失败的 IP 的所有流量。然而,我仍然对我的服务器的暴露有不好的感觉。因此,我计划长期接收某种形式的电子邮件通知,只要用户通过 SSH 登录。但是监控系统还没有到位。

对于每个有全职工作的人来说,兼职的时间是有限的,你可能也经历过这种情况。所以直到今年 3 月,我才最终能够用 Prometheus 和 Grafana 搭建起监控基础设施。

解决方案

**Prometheus 和 Grafana 是用于监控和警报的开源工具的经典组合,抽象出存储和可视化指标的复杂性。**两个系统一起可以从服务(Prometheus)收集和接收指标,并可视化指标、聚合和派生(Grafana)的当前和历史状态。此外,这两个系统实际上都可以定义某些阈值和条件,这些阈值和条件将通过电子邮件、Slack、Discord 等方式触发通知。他们需要提供的功能是数据

数据提供者可以是配备有 Prometheus 库的应用程序,也可以是 Prometheus 生态系统中的导出器。导出器是一个独立的应用程序,它从另一个工具甚至主机上收集指标,并通过 HTTP 端点公开这些指标。

因为我想从操作系统中收集指标,所以编写一个导出器是可行的方法。缺失的部分是一个 UNIX 命令,它返回当前登录用户的一些信息。快速的谷歌搜索会产生各种各样的命令,如 w 、 who 和 users 。

在这些命令中,我发现w 命令最有吸引力,因为它不仅返回当前登录用户的名称,还返回每个用户的名称

  • IP 地址,
  • 登录的时间,
  • 当前进程的名称。

对于我想要实现的目标和最后一个缺失的拼图,这是一些非常有用的信息。因此,为了在用户登录我的服务器时收到来自监控系统的通知,我需要

  • 调用 w 命令并解析输出,然后
  • 使用简单的服务器应用程序通过 HTTP 导出指标。

实施

正如普罗米修斯本身就是用围棋打造的一样,很多出口商也是用围棋打造的。然而,我更熟悉 NodeJs,所以我选择用 NodeJs 实现这个导出器。

解析w命令的输出就像遍历输出的每一行,并将每一列的值与标题行的对应列进行匹配一样简单。您可以在下面看到的函数期望以字符串的形式接收命令的输出,并返回一个数组,该数组包含每个登录用户的零个或多个对象。

为了提取每个用户的活动会话数,我进一步将数组简化为一个对象。一个对象,包含每个活动用户名的键,值为与该用户关联的所有会话。

为了向 Prometheus 服务器公开收集的指标,我选择使用open telemetry Prometheus-exporter包。这个包已经包含了一个PrometheusExporter服务器实现、一个 HTTP 端点和一个MeterProvider来创建度量并更新它们的值。

然后我必须把所有的部件粘在一起

  • 出口服务器,
  • 配置和命令行选项,
  • 并将收集和解析的w命令输出到位。

您可以在这里查看最终结果:

https://github.com/stfsy/prometheus-what-active-users-exporter/blob/master/lib/index.js

收尾工作

在我对云机器的第一次测试中,我意识到我没有足够关注一个重要的方面。时间

我在上面提到过,Prometheus 通常从已知的服务器、服务和导出器收集指标。它通过为每个作业调用配置的指标端点来实现这一点。因此,一个作业配置必须至少包含

  • 目标机器的主机名,
  • 目标应用程序的端口,
  • 和指标端点的路径。

此外,用户可以配置刮擦间隔,该间隔定义 Prometheus 从已配置的端点获取指标的频率。默认情况下,该间隔为一分钟。

我还在导出器中使用了一个可配置的时间间隔。这个时间间隔定义了导出器调用w命令并解析其输出的频率。此外,还有每个活动用户会话的持续时间。

为了捕获尽可能多的用户会话,**导出器和 Prometheus 本身的抓取间隔需要尽可能小。**理想情况下,也可以流式传输w命令的输出,以便在新结果可用时立即获取,而不是轮询它。

我决定做以下事情:

  • 降低导出程序的默认抓取时间间隔,以捕捉持续时间超过五秒的用户会话。
  • 将每个收集的用户会话缓存 60 秒(忽略用户注销的时间),以便 Prometheus 有足够的时间从导出器获取指标。

仅此而已。我已经在生产中使用该导出器几周了,它工作得很好。活动的 SSH 会话——目前为止只有我发起的会话——确实会产生电子邮件通知。

你可以在这里查看导出器的源代码。如果你对使用导出器感兴趣,请查看库的自述文件以获得安装说明。导出器的每个版本都包含 Linux 和 Alpine Linux 的可执行文件以及各自的 SHA256 校验和。

即使我用 NodeJS 实现了导出器,您也不必担心安装和更新运行时。相反,您可以从的最新版本下载二进制文件并立即使用,因为我将导出器编译成了适用于 Linux 和 Alpine Linux 的单一可执行文件。

判决

几天的工作,但值得花时间来获得更多关于我的云服务器上的活动的透明度。我将导出器添加到我所有的云服务器中,并在我的 Grafana 仪表板中为它们创建了一个面板和一个警报。当我把它编译成一个可执行文件时,在 UNIX 系统上安装它只需要几行代码。

我在我的 GitHub 帐户上发布了源代码和二进制文件,请随意查看。

https://github.com/stfsy/prometheus-what-active-users-exporter/

感谢阅读。如果您有任何反馈或进一步的想法,您可以通过 Twitter @stfs y 联系我

我,一个卑微的工程师,如何处理冒名顶替综合症

原文:https://towardsdatascience.com/how-i-one-humble-engineer-deal-with-imposter-syndrome-6075ee2b10a8?source=collection_archive---------21-----------------------

作者图片

办公时间

让我在这篇文章的开始说,冒名顶替综合症已经被大量详细地讨论过了,我可能没有什么新的东西可以添加到讨论中,所以让我在这里停下来,感谢您的阅读,很抱歉浪费了您的时间。

阿克汉姆。虽然已经有很多克服冒名顶替综合症的建议,但我发现它通常属于以下两类:

  1. 你!冒名顶替者?!不会吧!别再这么想了!
  2. 假装直到你成功。如果你保持自信,总有一天你会的。

第一个角度显然是无用的,第二个,我认为,既不可能也不可取。

热门话题:你无法成功假装自信。不是说可以就没用了。研究表明,在让人们认为你知道自己在做什么的时候,自信比实际能力更有说服力。过分自信会让你在生活中走得更远。但是同样的研究表明,仅仅假装自信是不够的。你必须真的相信它——你必须“诚实地过度自信”在为《大西洋》杂志撰写的一篇精彩文章中,凯蒂·凯和克莱尔·希普曼写下了他们对信心研究员卡梅隆·安德森的采访:

真正的过度自信不仅仅是虚张声势。安德森认为,极度自信的人不会疏远他人的原因是他们没有假装。他们真诚地相信自己是好的,这种自信就是他们所遇到的。他告诉我们,虚假的自信是行不通的。[……]大多数人在一英里外就能看出虚假的自信。

"大多数人在一英里之外就能看出虚假的自信。"这是在实验室里得到证实的结果,也是我在自己的生活中无数次验证的结果。

如果你以写软件为生,那么你可能会花很多时间与那些狂热地争论最佳键盘快捷键的人打交道,你会认为他们是在为自己的博士论文辩护。最重要的是,如果你是一名女性,你可能还会花很多时间让人们相信你真的知道如何编码。结合这两点和编程实际上很难的事实,难怪我们很多人都觉得自己是骗子。我第一次知道这种感觉的名字是在 2013 年,当时我是一名大学二年级学生,我拿到了脸书·首席运营官·雪莉·桑德伯格的新书《向前一步》。多亏了那本书,我(和许多其他人)开始问自己,“问题是我是个冒名顶替者,还是我有冒名顶替综合症?”

对我来说,很难举出一个女性软件工程师不经常对此感到惊讶的(当然许多男性也是这样——但我发现这种情况更少)。但这就是事情变得复杂的地方,因为当你知道自己可能患有冒名顶替综合症时,你会觉得有必要消除它。你得出的结论是,你内心的不安是错误的——你内心的不安全感是一种错觉——你不应该再让你的直觉来指导你的行动。取而代之的是,你启用手动覆盖,以你认为一个自信的人会做的方式行动。您可以通过列出您的凭据来开始对话;你找一切机会给你的母校起名;你在社交媒体上发布你的所有荣誉。(我对所有这些事情都感到内疚。)这感觉像是在吹牛,但很难说,因为这不正是患有冒名顶替综合症的人会想的吗?

但我认为这种自我推销听起来很空洞。与此同时,在我们丢证书的过程中,我们经常无法在那些确实会影响人们对我们看法的情况下表现出自信。例如,我倾向于给出一个观点,然后马上用“但是我不知道我在说什么”和“但是你绝对应该谷歌一下。”这种顶嘴绝对会让我看起来不太称职。

换句话说,当我们强迫自己忽略“错觉”,即骗子综合症时,我们最终会表现得不像人类——对其他人来说也不真实。同时,我们未能解决问题的根源。

那么解决办法是什么呢?对我来说,答案是专注于获得“真正的自信”——我的大脑和我的直觉都认为我应该拥有的那种自信。我做到这一点既不是通过每天对自己重复肯定“你在 Python 开发方面很棒”,也不是通过回到学校攻读博士学位。但以下是对我有效的方法。

校准你自己

关于舞蹈家弗雷德·阿斯泰尔,鲍勃·瑟夫斯有一句名言:

当然他很棒,但是不要忘记金格尔·罗杰斯做他做的每一件事,向后,穿着高跟鞋。

这很可能是真的,不管你有多合格,如果你没有合适的条件——如果你不够高,不够男性,不够自信,不够有魅力——你必须加倍努力才能让人们意识到这一点。如果他们意识到的话。

但是我们大多数人不会一夜之间从笨手笨脚变成金格尔·罗杰斯。我们什么都不知道就开始了我们的职业生涯,最初几年像新手一样挣扎,最终学到足够的东西称自己为专家。然而,我们很少知道在任何时候我们属于那个光谱(此外,专业知识是相对的,不是吗?).

这让我想到,我们所有人肯定都在暗自思考:“有些认为自己是骗子的人实际上是骗子!我怎么能确定我不是他们中的一员?”

所以我的第一条建议是,如果可以的话,试着以某种客观的方式回答这个问题:与我的同龄人相比,我有多能干?这种问题不会出现在任何关注健康的自助书籍中,但对我来说,它非常有帮助(并不是因为我是某个了不起的 10 倍程序员)。

疯狂分析的软件开发领域有工具可以做到这一点。我认识的一个工程经理有一个仪表板,分析所有团队成员的代码提交,并计算他们的相对生产率(我很高兴他不是我的经理)。我并不是建议你用这个奥威尔式的标准来衡量你的自我价值,但是如果你至少有一些客观衡量你地位的方法,你可以更好地识别你的不安全感是来自想象的还是真实的表现差异。这一点非常重要,尤其是在科技领域,因为不客观的衡量标准比比皆是。

要成为一名成功的程序员,你不需要有计算机科学的大学学位,但走传统的大学路线确实给了我一个不可替代的视角:亲眼看到我看待自己的方式与我的同学——他们最终会成为我的同事——看待和谈论自己的方式之间的差异。

大二转到计算机科学,我已经“落后”了。我的很多同学从子宫里就开始编码了。这个领域很广阔,我不知道人们大部分时间都在谈论什么:Arch Linux?λ函数?emacs?神经网络?让我害怕的不仅仅是行话。也是因为我的同学有如此强烈的意见!为什么我放弃 Macbook Pro 而选择一台操作系统不能休眠或播放音频的电脑如此重要?为什么我必须在 70 年代建造的没有图形用户界面的文本编辑器中编写代码?我不知道,但我确信这是合法程序员所做的。

“你没有意识到的是,”我的朋友雷蒙德说,他是一个比我大两岁的早熟的程序员,“他们把所有的时间都花在争论他们一无所知的事情上。”我花了三年的 CS 教育才意识到,我的许多同学确实是在随便地胡说八道,而且真的没有任何好的理由用 emacs 写代码。(#vim4life)

和你一起通宵学习的同学比和你的同事更容易成为好朋友。正因为如此,我一次又一次地看到这种模式:一个朋友详细而权威地谈论量子计算,但进一步询问后发现他们的全部背景知识归结为四条推特。他们对于为了争论一个话题而必须了解多少的标准比我低得多。这给我的印象是比实际情况“落后”得多。

轶事的复数形式不是数据,但数据确实支持这种跨越性别界限的“信心差距”。在实验室中,女性认为她们在考试中的表现比男性差,即使她们的分数相同。在一项研究中,女性只有在认为自己符合 100%的工作条件时才会申请晋升;男性在 60 岁时申请。这种现象是心理学中最容易重复的结果之一。

我永远记得大三申请实习的时候,我当时的男朋友找到我,沮丧地告诉我他申请 Android 开发人员的职位被拒绝了。

“但是弗兰克*,”我说,“你对 Android 开发一无所知。”

对此他回答道:

"没有这份工作,我怎么学习?"

当我的女同事被问及是否能完成一项任务时,我看到了另一种常见的变体。在一次会议上,一位项目经理问(我们团队中唯一的另一位)女工程师,她是否能开发出一个功能。

“也许吧?我不知道…我从来没有做过这样的工作。我得问问我的经理。”

我一生中从来没有听到一个男同事说过这样的话。这并不是说我的男同事声称他们可以做任何事情。只是他们通常把责任推到其他地方——复杂的软件或不称职的同事——而不是他们自己。但更多的时候,他们只是说是,认为无论他们不知道什么,他们都可以在工作中学习。

不幸的是,我不能给你一个确切的公式来学习如何积累,但我会说我做过的最有用的“校准练习”是成为一名面试官。在 OkCupid 的第一份工作中,我经常查看求职者的简历,他们列出了“大规模训练和部署神经网络”或“从零开始构建编译器”等成就,但当手指敲击键盘时,他们无法编写一个for循环来拯救自己的生命。

换句话说,如果你让你对别人的看法被那些能说会道的人左右,你很容易觉得自己比实际情况落后了很多。这样,找到一个更具体的衡量标准——无论是代码行的提交、绩效评估,还是与你的经理的坦诚对话——都会很有用。也许没有一个衡量标准是完美的,但它们合在一起可以描绘出一幅更清晰的画面。

当然,在这个校准练习的最后,你可能会学到一些你不喜欢的东西。也许这意味着你需要花时间积累经验或努力学习来提升你的技能。没什么丢人的。这是一个可行的见解。如果你发现你真的不擅长某件事,尽管你很努力,那也没关系。我从来没有对自己不擅长的工作感到开心过。但是我在这些角色上呆的时间比我应该呆的时间长,因为我花了太多的时间去思考我只是得了冒名顶替综合症。对我来说,正确的做法一直是转向更适合我优势的东西。或者,当然,你可以简单地说去他妈的竞争——你喜欢你所做的工作,这才是最重要的。

言之凿凿

将你的能力与你的同行进行对比是很重要的,这不仅是为了让你知道你有多“好”,也是为了让你了解你的同行(有时是你的竞争对手)是如何表现自己的。不,你不会想在简历上撒谎说你是 C#专家,而你所写的只是“你好,世界”但与此同时,如果就业市场上的每个人都把自己列为只有一年经验的有经验的 C#开发人员,难道你不应该把这作为自己的标杆吗?事实上,如果你不这样做——如果你把自己放在一个更高的标准上——你可能会无意中误导人们认为你没有实际能力,因为你使用了不同的尺度。

作者图片

过度推销自己的能力是不明智的,而且让人感觉“恶心”但是当你真正理解像你这样有能力的人是如何表现自己的时候,你会发现你说话自然会更自信,因为你觉得这是你应得的。

关于说话的话题,这里有另一个建议:不要不必要的贬低自己。如上所述,我永远不会建议某人试着让自己听起来比实际上更有知识。但这并不意味着你应该刻意去抹杀自己的可信度。

我经常感到内疚,因为我太害怕被“发现”,所以当我说这样的话时,

“我有 8 年的 Python 经验,”

我还加上一句:

“但我对 Flask 或 Django 或如何创作 pip 包一无所知,也不知道 Python 3 和 Python 2 的区别,而且我从未使用过collections包,有时当我笑得太厉害时,我会有点尿裤子。”

我的未婚夫曾经向他的父亲寻求建议,约一个“配不上他”的女孩出去他的父亲回答道:

“让她自己去想吧。”

对我和我交谈过的许多女性来说,我们非常害怕说出一些最终被证明是错误的话,以至于我们愿意一开始就牺牲自己的可信度来避免这种可能性。这是不必要的。如果你说错了,有人会查出来纠正你,也可能不会。了不起。只是不要在 Twitter 上尝试这个。

你很聪明,即使你不知道 Kubernetes

也许这是最重要的提示。

在这篇文章的大部分时间里,我建议了一些让你感觉不那么像骗子的方法——改变你对自己的看法,以及你向他人展示自己的方式。但是当然,人们对你的看法有很多是你无法控制的,尤其是涉及到偏见的时候。作为一名从事技术工作的女性,我总是努力让人们相信我有能力,而他们的反应总是让我感觉不那么好。此外,抛开性别歧视不谈,科技行业充斥着很多混蛋,还有更多人不是混蛋,但偶尔说话像他们一样。我不知道如何改变这一点。

但我确实认为,当你在和一个混蛋说话时,认识到这一点是有价值的,这样你就不会把这当成自己的一个缺点。你不可能理所当然地走到 TCP/IP 的发明者温顿·瑟夫面前,期望就网络协议进行一场你无法完全理解的辩论。但是不管你对一个主题了解多少,你总是值得像一个聪明人一样被谈论。当我想知道一个同事是否在用高人一等的口气和我说话时,我会问自己,“如果我是理查德·费曼,这个人会这样和我说话吗?”因为理查德·费曼不知道库伯内特,但你永远不会像他是一个倒霉的傻瓜一样向他解释一些事情。

当然,当你发现自己被人以高人一等的姿态说话时,你就没什么可做的了。但是有时候识别出你不能改变的事情会给你更多的时间去关注你能改变的事情。

但是我知道什么?

非常感谢萨拉·罗宾逊和阿努·斯里瓦斯塔瓦,我的两位聪明又体贴的同事对这篇文章的反馈。

【https://daleonai.com】原载于 2021 年 3 月 9 日https://daleonai.com/my-take-imposter-syndrome-tech**。关注*dale quark @了解更多。*

我是如何通过 2023 年更新的 AWS 认证机器学习专业的

原文:https://towardsdatascience.com/how-i-passed-the-aws-certified-machine-learning-specialty-e70f5e60e41e?source=collection_archive---------18-----------------------

我参加 2020 年 AWS 认证的动机和经历,更新至 2023 年

照片大卫·库伯

我为什么要开始机器学习教育?

AWS 认证的机器学习专业不是我第一次接触机器学习。为了找出为什么我认为让自己通过这些艰难的考试会很有趣,看看我之前关于机器学习和深度学习的文章。本文是关于 AWS 机器学习专业,我的学习路径和考试。本文包括 2023 年关于成长思维在 AWS 考试准备中的重要性以及常见挑战和解决方案的更新。

AWS 机器学习专业是我参加过的最具挑战性的考试之一,也是最有收获的考试。这很艰难,所以当你经过的时候这是一种奇妙的感觉。根据最近的技术进步,比如 ChatGPT 和 DALL-E 2,反思我的成就,我为自己的成就感到自豪。随着尖端人工智能创新以似乎不可能停止的速度出现,我们正在进入一个创造力和商业创新的新时代。

机器学习正在被各种行业采用,比如金融服务,数字银行利用机器学习来改善服务,创造更个性化的银行体验。然而,将使用这些技术的人的需求和经验放在首位是至关重要的。通过整合以人为本的设计原则,我们可以确保机器学习创新能够提高使用机器学习的人们的生活和体验。

https://medium.com/swlh/how-to-build-a-bank-a99a7f346f0d

成长心态在 AWS 考试准备中的重要性

像 AWS 机器学习专业这样具有挑战性的考试需要技术和心理准备。这里有一些小技巧可以帮助你自信地、有韧性地进行考试准备。

  • 接受挑战:不要回避困难的话题。挑战提供了学习和成长的机会。与其因失败而气馁,不如把它当作一个从错误中学习并改进方法的机会。
  • 接受反馈:反馈是学习和成长的有用工具。乐于接受他人的反馈,包括同龄人和导师。使用反馈来确定需要改进的地方并调整您的方法。
  • 保持动力:设定可实现的目标,将你的学习计划分解成可管理的部分,并跟踪你的进展,可以帮助你保持动力。我使用 Trello 板和白板来跟踪我在考试领域的进展,并完成课程中具有挑战性的部分。
  • 练习,练习,练习:熟能生巧,你练习得越多,考试那天你就会感觉越舒服和自信。使用在线资源、模拟考试和实践经验来巩固你的知识和技能。我参加了多次模拟考试,直到我确信我已经掌握了主题。此外,我挑战自己建立一个从记忆到实践的机器学习管道。

每个人的学习历程都是独一无二的;对一个人有效的不一定对另一个人有效。所以要大胆尝试不同的途径和方法,直到找到最好的。

我为什么选择 AWS 平台?

我选择 AWS 是因为我已经很熟悉它了。我曾在大型企业中使用 AWS 将工作负载迁移到云中,并在初创企业中从头开始构建云原生银行。我在 FastAI、斯坦福和 Coursera 的课程中使用过 SageMaker 这样的产品。然而,似乎 AWS 应该是我的第一个特定于平台的认证。

你需要学习哪些课题?

用亚马逊的话说,AWS 认证的机器学习——专业认证“验证候选人针对给定业务问题设计、实施、部署和维护机器学习(ML)解决方案的能力。”为了涵盖所有这些,考试分为四个领域。百分比是考试中该领域所占的比重。

领域 1 是数据工程 20%:这涵盖了 AWS 大数据堆栈;包括流数据工具(Glue & Kinesis)、存储(S3 & RDS)和分析(Kinesis & Athena)。该领域展示了这些组件如何适应 Sagemaker 生态系统。

领域 2 是探索性数据分析 24%:这包括如何为建模、特征工程和数据分析准备数据,如何处理缺失值、不平衡数据和标准化。这不是 AWS 特有的,需要更广泛的探索性数据分析知识。

领域 3 建模 36%:这是考试中最重要的部分,需要对 SageMaker 模型和 AWS 机器学习产品有广泛的了解。这个领域包括为业务问题选择合适的模型、训练模型、超参数调整、模型演化等等。

领域 4 是机器学习实施和操作 20%:这涵盖了使用 SageMaker 的解决方案的安全性、部署和优化。

我是如何学习这些话题的?

由于我以前有过机器学习的经验,我的偏好是找到一些课程,帮助我专注于我需要温习的 AWS 领域以及任何需要填补的空白。而不是从头学起。我发现的最好的方法是弗兰克·凯恩的实践课程,链接在评论部分。我以前上过弗兰克的课,我喜欢他脚踏实地的风格。他在 AWS 和 IMBD 有职业生涯,很容易将机器学习概念与现实世界的例子联系起来。如果你没有任何机器学习知识,这将是一个挑战。弗兰克在他的讲座中证实了这一点。

与实际的考试领域相似,Frank 的课程分为四个部分。还有几个实验室,您可以亲自试用这些工具。与其他学习平台不同,您需要一个 AWS 帐户。AWS 免费层将有助于最小化成本,但请记住关闭并删除您启动的任何构建。如果你用 GPU 创建一个机器学习训练环境,如果你忘记关闭环境,这可能会非常昂贵。

弗兰克也有单独的模拟考试。这有助于证明你的知识,并对问题的格式有所了解。除了 Frank 的模拟考试,还有 Abhishek Singh 在 Udemy 上的两个模拟考试值得参加。这些都是很方便的工具,可以帮助我找出知识上的差距,突出需要更多学习的地方。无论你从事哪种学习,模拟考试都是一个很好的资源。

除了课程之外,为了更深入地了解产品,我建议阅读 AWS 文档,观看 AWS 视频,并在 AWS 上创建自己的环境。有大量内容涵盖 SageMaker、机器学习管道、数据分析等。

常见挑战和解决方案

在学习 AWS 认证机器学习专业考试时,克服技术困难的最佳方法之一是从入门课程或教程开始。在我以前关于机器学习和深度学习的文章中,我为希望在这些概念上建立强大基础的初学者分享了一些很好的资源。机器学习起步。深度学习起步。

备考学习时的另一个挑战是资源成本,主要是在使用 AWS 机器学习产品时。为了帮助最小化这些成本,仔细计划你的学习方法并有效地使用 AWS 免费层是一个好主意。此外,您可以考虑使用替代的开源工具来完成特定的任务。例如,我创建了一个 Lambda 作业来每隔几个小时关闭 AWS Sagemaker 实例,以避免它们长时间运行。

通过对 AWS 认证机器学习专业考试的学习方法进行战略性和深思熟虑,你可以克服这些挑战,并在这个令人兴奋和快速增长的领域取得成功。

考试是如何格式化的?

考试本身长达 3 小时,由 65 道题组成。许多是基于场景的。比如说。你在一家医疗保健公司工作,需要调整一个机器学习模型。什么参数会帮助你做到这一点?另一个例子是,您正在开发一个金融服务领域的欺诈系统。你将如何评估一个模型的有效性?最后一个例子是什么样的 AWS Kinesis 产品组合将允许您流式传输数据和创建可视化。与所有 AWS 考试一样,总有两个答案看起来很合适,请确保您仔细阅读了它们。我花了整整 3 个小时完成考试。考试技巧 101,总是标出你不确定的问题,这样你就可以很容易地回到这些问题上,并给自己时间在最后检查它们。利用你所有的时间。没有直接的编码问题,但是您可能必须选择何时使用正确的库。比如 Scikit-learn,MLlib 或者 TensorFlow。

我在家监考的经历。

由于英国的封锁,考试是在家监考的。该软件监测您的计算机的桌面,网络摄像头的视频和音频。我不确定一个人是否能坐完整场考试,但确实有人在聊天中出现了。稍后会详细介绍。考试期间,不能有任何食物、饮料、计算器、纸或笔。考试软件中有一个白板,我最初担心没有计算器是没有根据的。

因为这是我的第一次家庭监考,有一个学习曲线,它不是没有问题。几天前进行一次测试,检查摄像头、麦克风和操作系统的性能。我的第一个挑战是固定的 iMac 网络摄像头。不可能为了检查工作空间而移动它,所以我买了一个便宜的独立网络摄像头。第二个挑战是 Wi-Fi。我有很好的 Wi-Fi,但在一次尝试中似乎失败了。建议是把你的电脑和宽带连接起来。一旦我解决了技术问题,监考系统运行良好,我更喜欢这种考试方式,而不是去考试中心。

一旦考试完成,你将在几分钟内知道你是否通过。请注意,通过或失败屏幕并不是考试的结束!!记得在庆祝之前合上最后一页,假设你通过了。庆祝前我没有合上最后一页,这是一个相当焦虑的监考突然出现在聊天室指示我这样做。

可解释的人工智能

可解释的人工智能(XAI)是机器学习的一个新兴趋势,专注于使机器学习模型更加透明和可解释。通过提供对人工智能模型如何工作及其输出背后原因的见解,XAI 需要为机器学习模型提供透明度和可解释性,确保它们产生合乎道德和无偏见的结果。AWS 提供了几个 XAI 工具,如亚马逊 SageMaker Clarify,以帮助用户识别和减轻机器学习模型中的偏见和其他道德问题。此外,通过了解人工智能模型如何做出决策以及促成这些决策的因素,用户可以就其人工智能模型的部署和使用做出更明智的决策。

艾伦理学

关于在商业环境中实施机器学习的伦理考虑和挑战的更深入的资源,请参考我以前的文章,名为开始深度学习。

链接到 Credly 上的徽章。

总结

回顾我获得 AWS 认证机器学习专业认证的历程,我可以自信地说,这是一次具有挑战性但又有益的经历。通过这个过程,我对 AWS 产品和服务有了深入的了解,并扩展了我的机器学习知识,同时提高了我的 python 编码技能。三个小时的考试很紧张,但这是一个检验我所有技能的绝佳机会。

在通过考试后的两年里,我继续在各种场合应用我的知识,这在我的职业发展中证明了难以置信的价值。我很感激这段经历,从那以后,我一直在追求其他的认证,这些认证进一步扩展了我的知识和技能。

追求 AWS 机器学习专业认证是对我个人和职业发展的重大投资。我向所有对提升机器学习知识和技能感兴趣的人强烈推荐它。

您准备好通过满足客户的需求和员工的期望来释放更大的价值了吗?保持联系,重新引入数字化创新和增长的人际关系、体验和需求。

请在这里联系我大卫·库伯或者在这里给我发邮件david@davidkolbconsultancy.com

我是如何通过 GCP 专业 ML 工程师认证的

原文:https://towardsdatascience.com/how-i-passed-the-gcp-professional-ml-engineer-certification-47104f40bec5?source=collection_archive---------4-----------------------

Billy Huynh 在 Unsplash 上拍摄的照片

如果你遵循这个学习计划,你也能做到

介绍

2020 年,谷歌云平台发布了其最新认证:专业 ML 工程师认证

当 2021 年开始时,我决定试一试,尽管谷歌建议在参加考试前有 3 年以上的实践经验,而且我实际上从未在现实生活中与 GCP 共事过。但是为什么要这么做呢?嗯,不考虑证书本身,我真的认为准备工作本身会让我了解 GCP 如何工作以及如何在其上进行机器学习的许多细节。此外,由于我每天都在使用 ML,我认为这只是一个让它适应 Google 平台的问题。

尽管我花了近 3 个月的时间来准备,我可能可以在更短的时间内完成,但我最终比考试所需的时间更长,做了大量的 MOOCs 和 Qwiklabs,还通过一本书进行了学习。

我只是告诉你我个人的故事来表明,即使你没有太多的 GCP 经验,仍然有可能在合理的时间内学会它,至少足以通过认证考试。我会建议一个短得多的学习路线,然后展示我做的额外的东西,我认为这些东西对获得认证是不必要的,但如果你只是对学习 GCP 感兴趣,那可能会有用。

学习轨迹

基础知识

  1. 快速浏览一下考试指南和样题,以便在学习的时候知道要找什么。
  2. 这个关于机器学习的速成班,如果你需要复习的话
  3. 参加这个课程是为了理解主要的 GCP 工具以及如何将它们应用到 ML 问题中(如果你已经熟悉 GCP,跳过这个)
  4. 参加本课程以了解张量流的基础知识(如果您熟悉张量流,请跳过本课程)

进入细节

  1. 阅读文档(不要关注代码,而是更多地关注何时使用哪个工具)。阅读整个 GCP 文档可能需要很长时间,因此,请关注以下特定领域:
  • ML API—视觉、自然语言、视频和语音转文本(了解他们每个人能做什么,也了解他们不能做什么)
  • AutoML (了解何时应该使用 AutoML 而不是 ML APIs)
  • AI 平台(这是最重要的部分。重点关注如何提高性能、如何使用 TPU 和 GPU 等加速器、如何进行分布式培训和服务以及不同的可用工具,如假设工具)
  • 推荐 AI (有 3 种型号类型。了解何时使用它们)
  • TPU(知道何时以及如何使用它们)
  • TensorFlow (不背代码,但是如何提高性能)
  • BigQuery ML (了解所有可用的算法)

额外的东西

所有这些都是可选的,特别是如果你已经熟悉 GCP 的话。如果你不是,而且你有时间,它可能会帮助你学习一些额外的细节,但我不会说这是至关重要的。

  1. 课程 MLOps 基础学习更多关于人工智能平台管道和 Kubeflows 的知识
  2. 课程GCP tensor flow 端到端机器学习
  3. 本书谷歌云平台上的数据科学提供一些动手编程的经验

如果你经历了所有这些,你可能已经涵盖了大部分考试内容,应该可以开始了。现在,让我们来看一些额外的提示,它们可能会帮助你专注于正确的事情。

额外提示和注意事项

一般

  • 用于数据的典型大数据管道:

发布/订阅- >数据流- >大查询或云存储

  • 批量数据的典型大数据管道:

发布/订阅- >云运行或云功能- >数据流- >大查询或云存储

  • 默认使用通用 API(视觉、视频智能、自然语言……)。仅当您有自定义需求(自定义标签等)时才使用 AutoML。)
  • 要去除敏感数据,您可以使用 BigQuery、云存储、数据存储或数据丢失保护(DLP)进行编辑、标记或哈希处理
  • TensorBoard 和 TensorFlow 模型分析之间的差异:前者在训练期间基于小批量进行评估,而后者在训练之后进行评估,可以在数据切片中进行,并且基于全部数据
  • AI 解释:有了表格数据,你可以对大的特征空间使用有形状的或综合的成分;对于图像,可以使用集成渐变进行像素级解释,或者使用 XRAI 进行区域级解释。
  • 什么时候在 TFX 上空使用库伯气流?当您需要 PyTorch、XGBoost 或者您想要对流程的每一步进行 dockerize 时
  • Keras:默认使用顺序 API。如果您有多个输入或输出、图层共享或非线性拓扑,请更改为函数式 API,除非您有 RNN。如果是这种情况,Keras 子类代替
  • 优化张量流流水线的 3 种方法:预取、交错和缓存
  • 写这篇文章的时候发现这个网站有 5 个例题,有些是我考试的时候看到的。由于这是一个相当新的认证,除了谷歌提供的问题之外,不容易找到其他问题的例子,但随着时间的推移,应该会变得更容易

大查询 ML

  • 它支持以下类型的模型:线性回归、二元和多元逻辑回归、k 均值、矩阵分解、时间序列、提升树、深度神经网络、AutoML 模型和导入的张量流模型
  • 使用它进行快速简单的建模、原型制作等。

储存;储备

选择用于分析的存储:

  • 结构化数据:毫秒级延迟的 Bigtable,秒级延迟的 BigQuery
  • 非结构化:默认情况下使用云存储,移动设备使用 Firebase 存储

催速剂

  • 在 CPU、TPU 和 GPU 之间选择:

对于快速原型、简单/小型模型或如果您有许多 C自定义操作,请使用 CPUs 如果你有一些定制的 C操作和/或中大型模型,使用 GPU 使用 TPU 进行大型矩阵计算,无需定制张量流运算和/或训练数周或数月的超大型模型

  • 要提高 TPU 上的性能:如果数据预处理是一个瓶颈,则作为一次性成本离线进行;选择适合内存的最大批量;保持每个内核的批处理大小不变

神经网络

反向传播中的常见陷阱及其解决方案:

  • 消失渐变->使用 ReLu
  • 分解渐变->使用批量标准化
  • ReLu 层正在消亡->学习率降低

对于多类分类,如果:

  • 标签和概率是互斥的,使用soft max _ cross _ entropy _ with _ logits _ v2
  • 标签是互斥的,但不是概率,使用sparse _ soft max _ cross _ entropy _ with _ logits
  • 标签不是互斥的,使用sigmoid _ cross _ entropy _ with _ logits

结论

我希望这篇文章能帮助你以更有效的方式准备认证,重点放在什么是重要的。显然,只有认证是不够的,你实际上必须知道如何在实践中使用 GCP 的 ML。因此,一旦你获得了你的认证,我建议你尝试一些 Qwiklabs 或平台上的一些个人兼职项目,以获得实践经验(但我向你保证,准备好考试将会产生巨大的差异)。

如果你正在准备 GCP ML 工程师认证,你可能会发现阅读这篇关于特征工程的文章很有用:

你只需花 7 分钟就能读完整本书,最终,你会对特性工程的基础有一个清晰的理解,这真的能帮助你获得认证。

如果你想进一步讨论,请随时在 LinkedIn 上联系我,这将是我的荣幸(老实说)。

我如何通过 Python 将我的 PL SQL 程序发布为 REST API

原文:https://towardsdatascience.com/how-i-published-my-pl-sql-program-as-rest-api-through-python-e2225f0457cb?source=collection_archive---------30-----------------------

关于 Python、基于令牌的身份验证和 REST API,您需要知道的一切

费尔南多·巴西在 Unsplash 上的照片

Sudha 是一名 IT 专业人员,在 SQL、PLSQL、数据库和 ERP 应用程序方面拥有数十年的经验。她一直享受着开发新应用程序和增强本地应用程序的生活。然而,它即将改变。

她的雇主正在将一些应用程序迁移到基于云的应用程序中。随着这种转变的进行,一些本地应用程序将不得不与基于云的应用程序进行近乎实时的交互。虽然有中间件可以使本地 API 与基于云的 REST API 进行交互,但 Sudha 在想,为什么她不能将本地机器上的经典程序发布为 REST API。

这可能发生在 Sudha 身上:应用程序开发人员或机器学习专业人员:参与集成不同的系统。

如果你有同样的困境,这篇文章是给你的。

在本文中,我将解释什么是 REST API,以及如何将一个经典的 PLSQL 程序转换成 REST API。虽然本文讨论的是 PLSQL 程序,但是这里解释的步骤和概念可以用于任何其他程序。

好吧,让我们从基础开始!

数据编码

你看过电影美丽心灵吗?

在这部电影中,主角解码了敌人的加密电讯信息。敌人发来的信息以这样一种方式被解码,它对任何非预期的接收者都没有任何意义。但是消息的预期接收者将知道破译它的算法,并从中获得真正的含义。

我们举个例子。考虑编码的消息是“Byoot fqtsbyq”。你能理解它的意思吗?除非您知道消息已经使用下面的映射表进行了编码。

(图片由作者提供)

现在你可以很容易地将信息解码为“你好兄弟”。

计算机在通信(以及安全存储数据)的同时,也使用特定的算法对数据进行编码。数据编码有以下优点

  • 它保证了传输的安全性。
  • 一些算法可以减小原始消息的大小。编码信息比原始信息小得多,易于传输。

代币

令牌是编码数据。基于令牌的安全在当代安全体系结构中非常流行。虽然有几种基于令牌的安全技术,但我将带您了解开放标准和流行的技术 Json Web Tokens (JWT)。

JWT 编码和解码数据的方式很有趣。但在我去之前,我想问你一个问题。

计算机使用预先定义的算法对数据进行编码。这些算法被很好地发表。如果黑客闯入通信网络并访问正在传输的令牌,他/她可以使用相同的算法解码令牌并改变令牌。计算机如何保护令牌?

你有什么建议?

好吧,这里有一个选项可以使这种基于令牌的通信变得安全。

  • 包括用于对令牌内的数据进行编码的算法的名称:由于存在成千上万种公开的算法,所以不可能对令牌进行解码,除非你知道用于对令牌进行编码的算法,或者拥有尝试使用所有这些算法对令牌进行解码的超高速计算机。
  • 添加签名:随着主要内容添加一个独特的签名。只有发送和接收计算机知道签名。这样,即使令牌被黑客攻击和更改,签名也不会匹配,接收方计算机将理解令牌被修改,并且不会处理数据。

这两个特点是 JWT 的关键因素。JWT 令牌包含三个部分。顾名思义,每个部分都包含 JSON 格式的数据。

  • 头:头包含算法的名称和令牌类型的类型。
  • 有效载荷:有效载荷包含要传输的数据。您可以在有效载荷部分自由添加想要传输的数据。
  • 签名:此部分包含一个唯一的签名。在客户端和服务器通信的情况下,服务器向客户端分配唯一的签名并通知客户端。客户端必须将此签名添加到它发送给服务器的每个令牌中,否则,服务器将不会接受该令牌。

令牌还可以包含像到期时间这样的附加信息,这将使令牌在到期后无效。

基于令牌的通信

既然已经了解了令牌的基本知识,那么让我们来了解基于令牌的通信是如何在客户机和服务器之间发生的。

下图显示了客户端和服务器通过 JWT 进行通信的步骤。

客户端和服务器之间基于 JWT 的通信(图片由作者提供)

  1. 客户端通过用户 id、密码和任何其他此类身份验证机制来访问服务器。
  2. 服务器验证用户凭证。
  3. 服务器为通过身份验证的客户端创建一个带有特定签名(也称为密钥)的令牌。
  4. 服务器将令牌发送给客户端。
  5. 此后,客户机将令牌包含在对服务器的任何未来请求中。服务器在处理任何客户端请求之前验证令牌。

这是对客户机和服务器之间基于令牌的通信如何工作的高级描述。

让我们看看它现在工作。

上面的代码将创建一个 JWT 令牌

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJIZWxsbyBXb3JsZCBKV1QiOiJGaXJzdCBQYXlsb2FkIn0._Ah6WeQCLy2DwhzcBjv6tmT2aZNinZ2Ikxm_fe1ePFI

请注意,令牌由三部分组成,用“.”分隔如果你复制这个令牌并粘贴到 jwt.io 网站上的编码框中,它会将其解码为相同的消息。

jwt.io 上的 JWT 示例

注意,上面写着“无效签名”。键入 Secretkey123:此令牌的密钥和消息无效签名将被替换为已验证签名。

现在它说“签名验证”。这就是客户端和服务器之间通信的安全方式。

下面是解码相同编码令牌的 Python 代码。

REST API

既然您已经了解了基于令牌的通信是如何工作的,那么是时候了解 REST API 了。

和之前一样,我会从一个问题开始。你是怎么找到这篇文章的?

你在 Medium.com 找到的。这里 medium.com 是域名。你可以认为这是存储这篇文章的计算机的地址。如果你输入 www.medium.com/…和文章细节,你就会看到这篇文章。

在计算机之间的通信中发生了以下步骤。

  1. 您在计算机浏览器(客户端)上输入了网址。
  2. 当您的计算机连接到互联网时,调制解调器开始寻找具有www.medium.com域信息的计算机
  3. 您的计算机(客户端)连接到 medium.com 计算机(服务器),并在您的浏览器中打开请求的页面。

现在,假设你正在编写一个调用网址的程序,不是在浏览器中,而是直接在程序中。假设,你有一个 python 程序,你写 http://www.medium.com,程序直接连接到服务器(步骤 3)。

这就是表述性状态转移(REST)的工作方式。在这种情况下,服务器将只允许某些页面(例如/thisarticle)给某些经过身份验证的用户,甚至允许特定的经过身份验证的用户修改某些页面上的某些信息。

REST API 中通信的一个关键方面是方法。该方法可以被认为是指示通信目的的参数。

  • GET:客户端正在从服务器获取信息。
  • POST:客户端正在向服务器添加新数据。
  • PUT:客户机正在修改服务器上的现有数据。
  • 删除:客户端正在删除服务器上的现有数据。

让我们建造它!

既然您已经理解了基于令牌的身份验证和 REST API 的基础知识,那么是时候从 PLSQL 程序和 Python 开发 REST API 了。

如果你想了解 PLSQL、Oracle 数据库和 Python 是如何协同工作的,我推荐你阅读我下面的文章。

Python 和 Oracle 数据库。没有数据科学家能做到的组合… |作者 Sanjay Singh |走向数据科学

Python 有一个用于连接 Oracle 数据库的内置库 cx_Oracle。下面的代码片段显示了如何使用 cx_Oracle 库连接 Oracle 数据库。用您的数据库详细信息替换下面代码中的 userid、密码、主机、端口和服务名。

PLSQL 是 SQL 的过程扩展。我有一个简单的 PLSQL 函数 EMPFUNCT。它将年龄作为参数,并返回年龄大于所提供参数值的雇员人数。

可以通过数据库连接游标中的 callfunc 方法在 Python 应用程序中调用 PLSQL 程序,如下面的代码片段所示。

在上面的代码 PLSQL 函数中,使用参数值 20 调用 EMPFUNCT。它返回 21,表明 EMP 表包含 21 名年龄超过 20 岁的雇员。

如何发布这个和 REST API 一样的 PLSQL 函数?

cx_Oracle 库方便了 Python 程序与 Oracle 数据库及其对象如 PLSQL 程序的连接。然而,要将 PLSQL 程序发布为 REST API,需要将其公开为 web 服务器上的服务。

如果你想知道什么是网络服务,这里有一个来自维基百科的简短解释

web 服务是运行在计算机设备上的服务器,通过网络监听特定端口的请求,提供 Web 文档(HTML、JSON、XML、Images),并创建 Web 应用服务,用于解决 web (www、internet、HTTP)上的特定领域问题。

Python 有一个非常有用的框架 Flask,这是一个 web 服务开发框架。如果您使用的是 Anaconda 发行版,Flask 已经为您安装好了。

下面的代码片段展示了如何使用 Flask 框架将同一个 PLSQL 函数 EMPFUNCT 发布为 REST API。

执行上面的代码将显示下面的结果

如果你打开浏览器,输入http://127 . 0 . 0 . 1:5002/empageenq?empage=20 您将获得与调用参数值为 20 的 EMPFUNCT 函数相同的结果。

调用 REST API get 方法

现在,PLSQL 函数 FUNCT 被公开为 REST API,任何其他系统都可以像其他 REST API 一样调用它,只要它可以访问发布该 API 的系统,并且提供访问的方法之一是通过 Python JWT 令牌。

结论

一个 PLSQL 程序可以通过 Python 库 cx_Oracle 和 Flask 框架发布为 REST API。在本文中,我已经向您介绍了将简单的 PLSQL 程序发布为 REST API 的步骤,可以通过 GET 方法访问 REST API。使用相同的步骤,您还可以将 PLSQL 函数增强为 POST 和其他 REST API 方法。

期待大家的建议,也很乐意回答大家的问题。

参考文献:

Python+SQL+Oracle

PyJWT PyPI

JSON Web 令牌— jwt.io

JSON Web Token 教程及 Python-DEV 社区中的示例

REST API 101:什么是 REST API,它是如何工作的?|邮差博客

如何在 Python 中使用 API(初学者指南)【Python API 教程】(rapidapi.com)

通过四个简单步骤将机器学习模型部署为 REST API |迈向数据科学

通过四个简单步骤将机器学习模型部署为 REST API |迈向数据科学

我如何在第一次 Kaggle 比赛中名列前 25%

原文:https://towardsdatascience.com/how-i-ranked-in-the-top-25-on-my-first-kaggle-competition-9ea53499d58d?source=collection_archive---------26-----------------------

Boris Stefanik 在 Unsplash 上拍摄的照片

写这篇文章的动机

这篇文章中分享的学习是从我的第一次 Kaggle 比赛表格游乐场系列中排名前 25%(在 1728 名参与者中排名# 447)中收集的——2021 年 1 月。我的表现远远超出了我最初的预期。这是一个惊喜,因为 a)我 6 年前就停止了以写代码为生,b)从我开始学习数据科学的旅程到现在仅仅 5 个月。

这篇文章是我反思成功经验的结果。我想和其他早期的 Kaggle 人分享这些经验,这样你就可以提高你在 ka ggle 比赛中的表现。

关于你

我相信你会从中获益匪浅

  1. 您正在开始您的数据科学之旅,并且已经花了一些时间学习在线课程,例如这和这
  2. 你已经报名参加了一些 Kaggle 比赛,并正在寻找提高你的排名的具体技巧

另一方面,如果你正在寻找 Kaggle 竞赛入门的基础知识,我在这里找到了有用的资源。

提高高尔夫比赛成绩的四点建议

  1. 了解数据集
  2. 从一个简单的模型开始
  3. 到处学习。开放
  4. 运用科学方法

本文的其余部分包含了对这四个建议的详细解释,以及我在 2021 年 1 月的 Kaggle 竞赛表格游戏系列中的截图和代码片段。参加竞赛、下载数据集并在阅读过程中尝试代码片段会很有启发性。

建议 1:了解数据集

在 Kaggle 竞赛中取得成功的第一步是对数据集有一个很好的理解。需要注意的是,学习数据集的来龙去脉是一个持续的过程,当您尝试不同的模型时,您的知识会随着时间的推移而增加。然而,即使在训练第一个模型之前,执行某种形式的初步数据分析以了解您正在处理的数据仍然是至关重要的。

无需编写任何代码,理解数据集的最快方法是导航到 Data 选项卡。在这里,您可以看到哪些变量是连续的或分类的,查看每个变量的分布并研究数据描述(平均值、标准差、最小值、最大值等)。

Kaggle 竞赛空间中的数据选项卡。图片是来自 kaggle.com 的截图

无需编写任何代码,理解数据集的最快方法是导航到 Data 选项卡。

从这个数据集中可以看出以下三点

  1. 该数据集中的所有要素都是连续的
  2. 所有特征似乎都经过了最小-最大归一化,即最小值接近 0,最大值接近 1。由于特征已经被缩放,这将节省我们一些时间
  3. 特征 cont5 的分布非常向左倾斜。这可能有助于检查我们的性能在应用了一个能量转换(比如 Box-Cox 方法)之后是否有所提高

该数据集中的所有要素都是连续的。图片是来自 kaggle.com 的截图

特征 cont5 的分布向左倾斜。图片是来自 kaggle.com 的截图

理解数据集的更全面的方法是执行探索性数据分析(EDA)。有很多令人难以置信的资源,如这个、这个和这个深入研究这个主题。然而,利用 Kaggle 竞赛中的数据部分来获得对数据集的初步理解的方法,对于像我们这样的初学者来说,即使不是更好,也是同样好的第一步。这是因为数据部分已经包含了非常丰富的数据信息。

建议 2:从简单的模型开始

现在我们对数据集有了初步的了解,让我们来训练一个简单的模型。从简单模型开始有以下好处

  1. 更简单的模型更容易理解和解释
  2. 更简单的模型可以作为很好的基线模型。点击此处阅读更多关于基准模型的信息。当在后期阶段训练更复杂的模型时,我们可以确定相对于基线模型,增加的复杂性层是否会提高准确性
  3. 更简单的模型可以让我们省去超参数%20are%20derived%20via%20training.&text=Given%20these%20hyperparameters%2C%20the%20training,the%20parameters%20from%20the%20data.)调整的麻烦,而无需完全理解数据集的细微差别以及模型如何与之交互。更复杂的模型往往包含几个超参数选择。直接进入这些复杂模型的一个大挑战是,它很难(如果不是不可能的话)确定观察到的结果是由糟糕的模型选择还是次优超参数选择引起的

更简单的模型更容易理解,并作为良好的基线模型来更好地为自己定位。

以下部分包含两个简单的初步模型的详细信息——决策树和随机森林,在表格游乐场系列——2021 年 1 月数据集上训练。

简单模型#1:决策树

下面的部分训练了一个决策树,其停止标准为:最大叶子节点数= 4。它计算误差并可视化树。

from sklearn.tree import DecisionTreeRegressor#Creating a Decision tree -- with stopping criteria (max leaves = 4)m = DecisionTreeRegressor(max_leaf_nodes=4)
m.fit(X_train, y_train);#Creating a function to check the root mean squared error of the model (m_rmse)def r_mse(pred,y): 
    return round(math.sqrt(((pred-y)**2).mean()), 4)def m_rmse(m, xs, y): 
    return r_mse(m.predict(xs), y)

让我们打印均方根误差

print ("training error", m_rmse(m, X_train, y_train))
print ("test error", m_rmse(m, X_test, y_test))

作者图片

训练集上的 RMSE 误差是 0.728172。测试集上的误差是 0.725077。我们可以将此视为基线模型的性能。

让我们将决策树(我们的基线模型)可视化,以了解哪些列/特性是重要的

最大叶节点数= 4 的决策树。作者图片

从上面的树形图可以清楚地看出,cont3、cont2 和 cont7 是最重要的 3 个特性。

简单模型#2:随机森林

现在我们已经训练了一个基线模型,并且在测试集上建立了一个基线性能 0.725077,让我们进入一个稍微复杂一点的模型。在本节中,我们将训练一个随机森林模型。随机森林算法是一个集合或一组更小和不太精确的决策树。随机森林模型使用一种称为打包的技术来组合这些不太准确的决策树(也称为弱学习器)。fast . ai MOOC 的第 7 课对随机森林算法背后的概念和实现进行了出色而实用的深入探讨。

**在数据集上实现随机森林模型的预期行为:**由于随机森林是更复杂的模型,我们应该期望看到更低的错误,即相对于决策树模型而言,性能有所提高

from sklearn.ensemble import RandomForestRegressordef rf(xs, y, n_estimators=40, max_samples=50000,
       max_features='sqrt', min_samples_leaf=5, **kwargs):
    return RandomForestRegressor(n_jobs=-1, n_estimators=n_estimators,
        max_samples=max_samples, max_features=max_features,
        min_samples_leaf=min_samples_leaf, oob_score=True).fit(xs, y)mrf = rf(X_train, y_train)

现在让我们打印随机森林模型的均方根误差

作者图片

**观察到的行为:**我们注意到该模型的测试误差为 0.706288,低于决策树算法的测试误差(0.725077)。因此,我们观察到的行为与预期行为一致。

让我们想象一下随机森林模型认为重要的特性。

#visualising the importance of the features def rf_feat_importance(m, df):
    return pd.DataFrame({'cols':df.columns, 'imp':m.feature_importances_}
                       ).sort_values('imp', ascending=False)def plot_fi(fi):
    return fi.plot('cols', 'imp', 'barh', figsize=(12,7), legend=False)plot_fi(fi[:14]);

按重要性排序的特征-随机森林算法。作者图片

有趣的是,随机森林和决策树算法一致认为 cont3 和 cont2 是最重要的两个特征。

建议三:处处学习,开放

在投入时间了解数据集并训练简单模型后,我们现在准备评估更复杂的模型在我们的数据集上的表现。

参加 Kaggle 竞赛最有收获的一个方面是有机会向其他参与者学习。代码和讨论部分(下面的截屏)提供了可能的解决方案的代码遍历和关于应该遵循什么方法的高级建议。它们是产生新想法的不可思议的资源,这些新想法是关于选择哪些模型以及哪些超参数选择是可用的。

Kaggle 竞赛空间中的代码和讨论部分。图片是来自 kaggle.com 的截图

讨论区的许多帖子都是由经验丰富的 Kagglers 和经验丰富的数据科学家撰写的。因此,阅读这些帖子并尝试解决方案将会给你的时间带来很好的投资回报。我发现非常有帮助的两个帖子是加布里埃尔·普雷达T4 的提高你排行榜位置的技巧和高拉夫·拉杰什·萨哈尼的用 LightGBM 详述 eda。后者是一个 Python 笔记本,可以在代码部分找到。它启发我在数据集上尝试 LightGBM 模型。

Kaggle 竞赛空间中的代码和讨论部分是产生新想法的极好资源,有助于决定接下来要尝试哪些模型

在尝试任何新模式之前,对其工作原理有一个初步的了解是有益的。一个对我很有用的方法是从官方文档开始阅读,直到它不再有意义。在这一点上,我会暂停阅读官方文档,尽可能多地阅读对概念和实现提供良好解释的文章。然后我会回到官方文档来完善我的理解。

现在,我们将在数据集上实现一个 LightGBM 模型。

**预期行为:**由于 LightGBM 模型比我们的基线决策树更复杂,我们应该可以看到通过 RMSE 误差测量的改进性能

import lightgbm as lgbLGB = lgb.LGBMRegressor(random_state=33, n_estimators=5000, min_data_per_group=5, boosting_type='gbdt',
 num_leaves=246, max_dept=-1, learning_rate=0.005, subsample_for_bin=200000,
 lambda_l1= 1.07e-05, lambda_l2= 2.05e-06, n_jobs=-1, cat_smooth=1.0, 
 importance_type='split', metric='rmse', min_child_samples=20, min_gain_to_split=0.0, feature_fraction=0.5, 
 bagging_freq=6, min_sum_hessian_in_leaf=0.001, min_data_in_leaf=100, bagging_fraction=0.80)m_LGB = LGB.fit(X_train, y_train)

让我们打印 LightGBM 模型的均方根误差

print ("training error", m_rmse(m_LGB, X_train, y_train))
print ("test error", m_rmse(m_LGB, X_test, y_test))

作者图片

**观察到的行为:**我们注意到 LightGBM 模型的测试误差为 0.694172,低于决策树算法的测试误差(0.725077)。因此,我们观察到的行为与预期行为一致。

让我们想象一下 LightGBM 模型认为重要的特性。

#view the importance of the featureslgb.plot_importance(m_LGB, ax=None, height=0.2, xlim=None, ylim=None, 
                      title='Feature importance', xlabel='Feature importance', ylabel='Features', 
                      importance_type='split', max_num_features=None, 
                      ignore_zero=True, figsize=None, dpi=None, grid=True, precision=7)

作者图片

有趣的是,cont3 和 cont2 并不属于 LightGBM 模型的最重要特性。

这一部分的关键是,通过开放和从不同来源(如 Kaggle 论坛、官方文档和博客帖子)学习,你可以提高你在竞赛排行榜上的排名

建议 4:运用科学的方法

数据科学领域在不断发展。实现预期结果的方法可能有无数种。在这种情况下,当可能性无限时,很容易迷失在细节中,看不到主要目标,在我们的情况下,主要目标是提高我们在竞赛排行榜上的排名,同时增加我们的知识。解决这类歧义的一个有用方法是将科学方法应用到我们的工作中。我们从一个假设开始,对我们的模型进行测试以证明/否定它,得出结论并记录结果。需要注意的重要一点是一次测试一个假设。这将有助于我们更清楚地评估变革的影响。

下一节将进一步阐述这一点。我们将把科学方法应用于一个基于我们对 cont5 列的观察的假设。

假设:对特征 cont5 应用变换会提高我们模型的性能吗?

在这篇文章的前面,我们观察到 cont5 特性的分布非常偏向左边。一种可能性是数据的底层分布可能是正常的,但是为了帮助公开它,可能需要转换。

这是 box-cox 方法可能派上用场的一个领域。这是一种数据变换方法,可以执行一系列幂变换,如取观察值的对数或平方根,以使分布更正态。这是进一步阅读关于转换数据以符合正态分布的极好资源。

现在,我们将使用 box-cox 方法转换列 cont5,并将其用作 LightGBM 模型的一个特性。

**预期行为:**由于 Cont5 是 LightGBM 模型中第二重要的列,对其进行转换以使其分布更加正常可能会提高性能。

from scipy.stats import boxcoxtrain_df['cont5'] = boxcox(train_df['cont5'], 0)target = train_df.pop('target')X_train, X_test, y_train, y_test = train_test_split(train_df, target, train_size=0.80)#remove the id columns
X_train.pop('id')
X_test.pop('id')import lightgbm as lgbLGB = lgb.LGBMRegressor(random_state=33, n_estimators=5000, min_data_per_group=5, boosting_type='gbdt',
 num_leaves=246, max_dept=-1, learning_rate=0.005, subsample_for_bin=200000,
 lambda_l1= 1.07e-05, lambda_l2= 2.05e-06, n_jobs=-1, cat_smooth=1.0, 
 importance_type='split', metric='rmse', min_child_samples=20, min_gain_to_split=0.0, feature_fraction=0.5, 
 bagging_freq=6, min_sum_hessian_in_leaf=0.001, min_data_in_leaf=100, bagging_fraction=0.80)m_LGB_box_cox = LGB.fit(X_train, y_train)

让我们打印模型的均方根误差

作者图片

变换特征后的误差 cont5 为 0.695321。这略高于未变换的 LightGBM 模型的误差 cont5 (0.694172)。因此,我们可以得出结论,在列 cont5 上使用 box-cox 方法不会提高我们模型的性能。虽然这种方法没有提高我们模型的性能,但我们确实学到了一些有价值的新东西。

从这一部分学到的关键是,遵循科学方法将有助于我们保持纪律性,从而增加我们成功的几率。这种方法的关键原则是一次测试一个变化,以便我们可以清楚地评估我们的假设对性能的影响,从而评估我们在排行榜上的位置。

下面是我在比赛过程中跟踪进度的截图。我维护了一个电子表格,其中记录了所有的更改以及模型在训练和测试数据集上的性能。此外,我跟踪了提交后收到的分数。这有助于我保持在正确的轨道上,并清楚地评估什么有效,什么无效。

作者图片

我希望这篇文章对你有用。快乐的旅行!

代码和确认

你可以在这里查看的完整代码。

感谢萨米尔·马德哈万、萨普塔里什·达塔和达薇亚·约瑟夫的宝贵反馈。

与我联系

领英:https://www.linkedin.com/in/anandkumarravi/

GitHub:https://github.com/Anandravi87

推特:https://twitter.com/Anand_1187

我如何将 100 多个 ETL 重新设计到 ELT 数据管道中

原文:https://towardsdatascience.com/how-i-redesigned-over-100-etl-into-elt-data-pipelines-c58d3a3cb3c?source=collection_archive---------1-----------------------

提升您的数据管道!

作者图片

大家:数据工程师是做什么的?我:我们建造管道。
大家:你是说像水管工?

类似的东西,但不是水通过管道流动,数据通过我们的管道流动。

数据科学家构建模型,数据分析师向利益相关者传达数据。那么,我们需要数据工程师做什么?

他们不知道,没有数据工程师,模型甚至不会存在。不会有任何数据需要交流。数据工程师建立仓库和管道,让数据在组织中流动。我们把这些点联系起来。

数据工程师是 2019 年增长最快的工作,同比增长 50%,高于数据科学家的工作增长,达同比 32%

因此,我在这里介绍数据工程师的一些日常任务。数据管道只是其中之一。

ETL/ELT 管道

ETL —提取、转换、加载
ELT —提取、加载、转换

这些是什么意思,它们之间有什么不同?

在数据管道世界里,有一个和一个目的地。在最简单的形式中,源是数据工程师获取数据的地方,目的地是他们希望数据加载到的地方。

通常情况下,在这两者之间的某个地方需要对数据进行一些处理。这可能是由多种原因造成的,包括但不限于

  • 数据存储类型的差异
  • 数据的目的
  • 数据治理/质量

数据工程师将数据处理称为转换。这是他们施展魔法将各种数据转换成他们想要的形式的地方。

ETL 数据管道中,数据工程师在将数据加载到目的地之前执行转换。如果表之间存在关系转换,那么这些转换发生在数据源内部。在我的例子中,来源是一个 Postgres 数据库。因此,我们在源中执行关系连接以获得所需的数据,然后将其加载到目标中。

ELT 数据管道中,数据工程师将数据加载到目的地 raw 中。
然后,它们在目的地内部执行任何关系转换。

在本文中,我们将讨论我是如何将我组织中的 100 多条 ETL 管道转换成 ELT 管道的,我们还将讨论我这样做的原因。

我是如何做到的

最初,管道是使用 Linux cron 作业运行的。Cron 作业就像传统的任务调度程序,它们使用 Linux 终端进行初始化。它们是最基本的编排节目的方式,没有任何功能,比如—

  • 设置依赖关系
  • 设置动态变量
  • 建立联系

作者图片

这是第一件要做的事情,因为它引起了太多的问题。我们需要扩大规模。要做到这一点,我们必须建立一个适当的工作流程管理系统。

我们选择了阿帕奇气流。我都写在这里了。

气流最初是由 Airbnb 的家伙们创建的,开源的。它也被像 Twitter 这样受欢迎的公司用作他们的管道管理系统。你可以阅读上面所有关于气流的好处。

解决这个问题后,我们必须改变提取数据的方式。团队建议**将我们的 ETL 管道重新设计成 ELT 管道。**更多关于我们为什么后来这么做的信息。

作者图片

这是重新设计前的管道示例。我们处理的来源是一个 Postgres 数据库。因此,为了以预期的形式获得数据,我们必须在源数据库中执行连接。

Select 
a.user_id,
b.country,
a.revenue
from transactions a 
left join users b on
a.user_id = b.user_id

这是在源数据库中运行的查询。当然,我已经将示例简化为最简单的形式,实际查询超过 400 行 SQL。

查询结果保存在一个 CSV 文件中,然后上传到目的地,在我们的例子中是一个 Google Bigquery 数据库。这是它在阿帕奇气流中的样子—

这是 ETL 管道的一个简单例子。它按预期工作,但是团队已经意识到将其重新设计成 ELT 管道的好处。稍后会详细介绍。

作者图片

这是重新设计后的管道示例。观察桌子是如何被带到目的地的。在成功提取了所有的表之后,我们在目的地执行关系转换。

--transactions
Select 
*
from transactions --
Select
*
from users

这是在源数据库中运行的查询。大多数提取都使用没有任何连接的“Select ”语句*。对于追加作业,我们包括 where 条件以正确分离数据。**

类似地,查询结果保存在 CSV 文件中,然后上传到 Google Bigquery 数据库。然后,我们通过**在 Apache Airflow 中设置依赖关系,为转换作业创建了一个单独的 dag。**这是为了确保在运行转换作业之前,所有提取作业都已完成。

我们使用**气流传感器设置相关性。**你可以在这里读到它们。

我为什么这么做

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

现在你已经理解了我是如何做到的,我们继续讨论为什么
为什么我们要将所有的 ETL 重新写入 ELT 管道?

费用

运行我们的旧管道耗费了我们团队的资源,特别是时间、精力和金钱。

为了理解事情的成本方面,你必须理解我们的源数据库(Postgres)是在 2008 年建立的一台古老的机器。它是在内部托管的。它还运行旧版本的 Postgres,这使得事情变得更加复杂。

直到最近几年,组织才意识到需要用于数据科学家和分析师的集中式数据仓库。这是他们开始在 cron jobs 上建立旧管道的时候。随着作业数量的增加,它耗尽了机器上的资源。

以前的数据分析师编写的 SQL 连接也随处可见。在一些管道中,单个查询中有超过 20 个连接,我们接近 100 多个管道。我们的任务在午夜开始运行,通常在下午 1-2 点结束,这相当于大约 **12 个多小时,**这是绝对不能接受的。

对于那些不知道的人来说,SQL 连接是需要运行的最耗费资源的命令之一。随着连接数量的增加,查询的运行时间会成倍增加。

作者图片

自从我们迁移到 Google Cloud,这个团队就明白 Google Bigquery 在计算 SQL 查询方面的速度非常快。你可以在这里 阅读所有关于它的

https://cloud.google.com/blog/products/bigquery/anatomy-of-a-bigquery-query

因此,关键是在源代码中只运行简单的“Select *”语句,并在 Google Cloud 上执行所有的连接。

这使得我们的数据管道的效率和速度提高了一倍多。

可量测性

昆腾·德格拉夫在 Unsplash 上的照片

随着企业规模的扩大,他们的工具和技术也在扩大。
通过迁移到谷歌云,我们可以轻松扩展我们的机器和管道,而不用太担心。

Google Cloud 利用云监控,这是一个收集 Google Cloud 技术(如 Google Cloud Composer、Dataflow、Bigquery 等)的指标、事件和元数据的工具。您可以监控各种数据点,包括但不限于—

  • 虚拟机的成本
  • 谷歌大查询中每个查询的成本
  • Google Bigquery 中运行的每个查询的大小
  • 数据管道的持续时间

这让我们的监控变得轻而易举。因此,通过在 Google Bigquery 上执行所有转换,我们能够在扩展时准确地监控查询大小、持续时间和成本。

即使我们增加我们的机器大小、数据仓库、数据管道等,我们也完全了解随之而来的成本和收益,并在需要时完全控制其开启和关闭。

这已经并将会使我们免除许多令人头痛的事情。

结论

费尔南多·巴西在 Unsplash 上拍摄的照片

如果你一直读到这里,你一定对数据情有独钟。
应该的!

我们已经做了 ETL 和 ELT。谁知道在未来我们会建造什么样的管道?

在这篇文章中,我们谈到了—

  • 什么是 ELT/ETL 数据管道?
  • 我如何重新设计 ETL 来实现 ELT 管道
  • 我为什么这么做

像往常一样,我引用一句话作为结束。

数据是新的科学。大数据掌握着答案—彼得·盖尔辛格

订阅我的时事通讯,保持联系。

你也可以通过 我的链接 注册一个中等会员来支持我。你将能够从我和其他不可思议的作家那里读到无限量的故事!

我正在撰写更多关于数据行业的故事、文章和指南。你绝对可以期待更多这样的帖子。在此期间,你可以随时查看我的其他 文章 来暂时填补你对数据的饥渴。

感谢 的阅读!如果你想和我联系,请随时通过 nickmydata@gmail.com 联系我或者我的 LinkedIn 个人资料 。你也可以在我的Github中查看之前写的代码。

我如何加快我的功率 BI 报告 5 倍

原文:https://towardsdatascience.com/how-i-speed-up-my-power-bi-report-5x-b9de603e8df?source=collection_archive---------11-----------------------

你的 Power BI 报告很慢?检查如何通过应用一些简单的技巧来显著加快速度,同时保留原始的报告外观

你能看出下面两份报告的不同之处吗?

作者图片

是啊,我也不能!

但是,这两份报告有很大的不同!如果我告诉你右边的报告比左边的快 5 倍呢?你会相信我吗?没有吗?然后继续读下去,我会告诉你这怎么可能…

这一切是如何开始的…

我正在读 Chris Hamill 的一篇很棒的博文,他解释了如何在保持相同视觉效果的同时替换报告中的一些视觉效果。因此,我立即尝试将类似的技术应用到我之前创建的一个报告中。

您在上图左侧看到的报告页面显示了一些与客户支持中心绩效相关的数字。有一大堆与聊天、调查、电话、电子邮件等相关的指标。

然而,这个报告页面需要大量的时间来渲染和加载。罪魁祸首是大量的卡牌视觉效果(总共 21 张)。由于 Power BI 背后的公式引擎是单线程工作的,正如在这篇文章中详细解释的那样,对于每一个卡片视觉,一个新的查询正在生成,并且直到前一个查询完成后才能执行!

性能分析器捕获的时间最好地反映了这一点。Performance Analyzer 是 Power BI 中一个非常强大的内置特性,它让您能够很好地了解幕后发生的事情。您还可以使用外部工具来获取报告指标,比如 DAX Studio。

让我们打开性能分析器,看看在原始报告版本中到底发生了什么:

作者图片

这个报告页面花了 3 秒多的时间来渲染!对于不太大的数据量来说,这是不可接受的。让我们按总时间降序排列各个计时,看看是什么使我们的报告变慢:

作者图片

您可以看到,我们的两个显卡分别以 3238 和 3149 毫秒保持领先。然而,一旦我们展开来看这些数字的细节,我们可以注意到视觉的“其他”部分几乎占了总时间的 99%!

那个“其他”甚至是什么意思?!

“Other”显示了特定的 visual 在执行该 visual 的 DAX 查询之前必须在执行队列中等待多长时间!因为我的报告包含 30 多个视觉效果,其中 21 个是卡片视觉效果,所以其中一些必须等待其他人完成才能执行任何操作。

因此,DAX 查询在这里不是问题,正如您所看到的,这两个视图执行 DAX 查询只花了 4 毫秒。即使我按 DAX 查询对时间排序,我也能看到最长的 DAX 查询只用了 34 毫秒:

作者图片

优化报告

关注 Power BI 社区中所有伟大专家的博客并尽可能多地向他们学习是多么重要,这一点我怎么强调都不为过。

克里斯·哈米尔的博客给了我灵感,让我试图优化我的原始报告。出发点是试图减少我的报告页面上的视觉效果。因为我确认 DAX 查询不是问题,所以我的想法是减少“其他”计时。

用形状创建背景

我做的第一件事是从报告中删除我所有的形状(矩形等)。).你如何实现这一点?您可以简单地在 PowerPoint 中创建您的背景布局,并将其保存为图像!

作者图片

这是我在 PowerPoint 中创建的布局,用来“模仿”原始页面的外观。将其存储为图像:

作者图片

并将此图片作为您报告的背景图片!就这么简单!

作者图片

魔法来了…

现在最有趣的部分来了…我们如何替换现有的卡片视觉效果,同时保持原始版本的“外观和感觉”?

这就是克里斯的戏法登上舞台的地方。我只是把我的计算放在矩阵视觉中,用一个单独的矩阵视觉代替单独的卡片视觉。并且,经过一些调整和格式化,得到了(几乎)相同的报告外观!

您应该做的第一件事是将样式设置为“无”,删除列标题和行标题的轮廓,并关闭自动调整列宽:

作者图片

“格式”窗格下的“字段格式”属性中需要关键格式,您应该在其中设置适当的颜色、字体、字体大小等。按照原始报告的模式。

作者图片

您也不应该忘记拉伸单个矩阵字段,以取代它们在“卡片”形状中的位置。

系好安全带!

现在,让我们检查一下最重要的事情——不要忘记,我们开始整个过程是为了提高我们报告的性能。

因此,我将再次打开 Performance Analyzer,现在打开我修改后的报告,并检查指标:

作者图片

哦,我的天啊!我的报告中两个最慢的视觉效果现在需要大约 0.6 秒才能显示出来! 相比原版的 3 秒,快了 5 倍!!!

现在,你可以注意到“其他”计时从大约。3000 ms 到 300 以下!最后,我们的报告中的视觉效果的数量通过将它们移动到用 PowerPoint 创建的背景图像中而显著减少。

但是,这里的关键接管是:我们实际上没有改变报告的原始外观——我们只是显著地改进了底层流程!因此,对于我们的用户来说,一切都是一样的,只是他们现在会更快地看到数字!您知道当您的用户更快地获得结果时意味着什么——“用户会喜欢您”:)

结论

这里有两个主要的收购:

  • 如果您的报告运行缓慢,有多种方法可以检查原因:使用 Performance Analyzer 或 DAX Studio 来确定是否可以应用一些额外的步骤来改进报告
  • 关注 Power BI 专家的博客和视频。那里有太多的东西要学,你总能找到自己作品的灵感

最后一点:如果你需要对垂直放置的卡片视觉效果进行类似的改进, Chris Hamill 的博客也解释了如何实现这一点。

感谢阅读!

成为会员,阅读媒体上的每一个故事!

我如何教我的空调一些希伯来语

原文:https://towardsdatascience.com/how-i-taught-my-air-conditioner-some-hebrew-81192e11065?source=collection_archive---------14-----------------------

思想和理论

故事时间-不是你通常的“如何做”的文章

谁能想到空调能学会语言?(图片:pixabay.com)

这是我在教另一个神经网络如何绘画时的一个附带项目。我刚刚收到一个闪亮的新智能家居传感器作为礼物,承诺它应该在我下班或从健身房回来时打开我家的空调。

这是一个很棒的玩具,有一个非常时尚的应用程序可以从我的手机上控制它。但是我发现主要的缺点是我总是忘记在开车回家之前按下“开”按钮。作为一个懒惰的人,我从来不会在高速公路边停下来按那个按钮。所以我就在想:“如果我只是教那个空调识别我的语音呢”?

Sensibo IoT 传感器可以让你从手机上切换与空调有关的任何事情。(图片:截图,在合理使用下)

通过查阅这些 Sensibo 家伙的公开文档,我能够大致了解他们的传感器是如何工作的。当用户点击应用程序中的按钮时,手机会向远处的 Sensibo 服务器发送一个所谓的 HTTP 请求。当你想看最新的 Instagram 或在 YouTube 上发表新评论时,你的浏览器也会为你发送同样的信息。然后,服务器通过第二个 HTTP 请求命令传感器向空调发送匹配的命令,这是通过使用与遥控器中相同的红外线发射器来完成的。以上所有这些意味着我只需要编写自己的“按钮点击”应用程序,而不是等待我的手指点击,它会听我的声音来切换空调。

我开始设计一个能让我做到这一点的系统。过去一年练习机器学习让我明白,我要训练一个自己的模型。但我也需要手机上的那个模型。我不打算付钱给任何人把它存储在云中,并收取高昂的费用来访问它,所以投票很快就投给了本地部署的模型。问题是,我的手机是一个 5 年的老古董,即使在我买它的时候,它的硬件也被认为是薄弱的一面。所有那些在巨型 GPU 上运行的具有数十亿参数的新的花哨模型在这里都不会工作。我需要简单的东西。所以我开始阅读所有我能找到的文献。

事实证明,很大比例的语音识别模型会听用户说话,并尝试将语音分类为完整的单词。但是任何一种语言的单词量总是一个很大的数字。为什么不用更小的语音单位呢?我在想音素。音位是构成人类语言的最基本单位之一。每一个独特的声音都被认为是一个音素,不管你有多少种拼写方法。例如,英语估计有 171,000 个单词,但只有 42 个音素。

为了从这一点上跟随我,你需要知道一些数学知识。最后一段的意思是,如果一个模型想要对一个英语单词进行分类,输出层(分类层)需要至少 171,000 个不同的输出。想想权重矩阵的大小和输出向量的维数。如果用同样的模型来分类音素,这个数字会减少到 42。记住,简单的矩阵乘法的时间复杂度是 O(n3),想想音素分类器比单词分类器快多少。

接下来:似乎很多处理语音的模型更喜欢从频谱图中学习,而不是从原始音频中学习。最近有一些成功的模型在没有光谱图的情况下也能工作(例如,查看脸书的 wav2vec 2.0),但这些仍然是模型大小和推理时间的顶级优势。如果用户在空调做任何事情之前等了太久,他只会停好车,然后点击正常按钮。

本质上,频谱图是原始音频信号上的变换函数的结果,该变换函数创建矩阵,其中每个列向量表示原始信号的特定帧内的离散频率仓的幅度。如果上面这段话对你来说是中文(直到最近对我来说是),你不必太担心。当我们说话时,我们的声带振动空气产生声音。手机麦克风将这些振动转换为电振幅读数(振幅=我们刚才说话的声音有多大),并将其存储在一个数组中。创建一个光谱图将阵列转换成图像。为什么这对我们有好处?原始音频只给我们振幅,而频谱图也给我们信号的频率。更好的是——由于光谱图是矩阵,它们也可以显示为图像。这意味着我们可以使用图像处理领域的方法来分析我们的声音。整洁!

同一声谱图的三种不同振幅和音高的再现(图片由作者提供)

当涉及到机器学习时,这些方法中最重要的一种叫做卷积层。用于编写模型的现代编程库将它们分解成层。层就像乐高积木模型一样。卷积图层使用同名的数学运算(不完全相同,但很相似)来分析影像数据。它们的力量来自一种叫做“不变性”的数学属性。卷积对于图像特征的位置是不变的。这意味着无论我们试图预测或分析什么样的图像,它在图像中的位置对最终结果的影响都很小。卷积层可以找到一只狗,无论它位于图像中的什么位置。在我们的例子中,它可以找到一个音素,不管它在声谱图中的位置。

这对我们有好处,因为我们会找到所有的音素,但不是最好的,因为我们不知道它们的顺序。卷积对位置的不变性意味着它们不能有效地确定音素顺序,这使得“poultry”(pl-tri)和“triple”(tri-pl)可以有效地互换。为了克服这一点,我们用一种叫做“递归神经网络”的东西对卷积输出进行序列建模。递归神经网络(RNNs)通常要么读取一系列输入,要么产生一系列输出(有时两者都有)。它们的优势来自一个简洁的设计特征,即先前的输入影响下一个输出。这与标准神经网络形成对比,在标准神经网络中,每个输入独立于序列的其余部分。这一特点使他们在过去 35 年的研究中非常突出,显示出非常好的结果。

最近的研究试图将两者结合起来。当应用于这个项目时,它的工作方式如下:我们获取卷积层的输出,它是一个与输入频谱图维数相同的矩阵,并将其拆分为一系列列向量。每个列向量按顺序被馈送到 RNN 层,该层应该使用它们来以正确的顺序输出音素。结合卷积层和递归层的模型被称为卷积递归神经网络(CRNNs)。

还有其他一些构建模块用于构建模型,即注意模块、序列间 RNNs 和门控递归单元(GRUs),但这些实际上只是描述上述组件的更好实现的术语。如果你真的对它们感兴趣,你可以谷歌一下这些术语,这可能会为你提供大量的资源。这也是分享完整模型的地方,对于那些技术导向的人来说,可以通过以下链接获得一个 Google Collaboratory 笔记本:

对于那些没有打开 Colab 笔记本链接的人来说,这是模型的层图。(图片由作者提供)

既然我们已经设计了模型,我们需要训练它。问题是,希伯来语没有太多公开的语音数据。这就是音素再次派上用场的地方:即使在一个小的语音数据集中,我们将一种给定语言的每个单词记录一次,整个音素集将重复一百次。事实上,我们也许可以用一个足够小的数据集来工作,我们可以自己创建。

三天来,我在房子里走来走去,录下自己重复同样的语音命令,让周围的人都抓狂。对于我的研究来说,这已经足够了,尽管对于任何严肃的项目,你肯定希望一些朋友添加他们自己的录音(这有助于模型推广到未知的声音)。这产生了大约 45 分钟的音频,我按照发音(同一个文件中的相同单词)进行了分组,并相应地进行了标记。然后,我编写了一些代码,从文件中提取语音命令,将它们转换为频谱图,并将其分组为训练集和测试集。当添加一些背景噪声的频谱图(以教导模型将语音与静音分开)时,这产生了大约 3450 个用于训练的频谱图。如果你以前训练过一个模型,你会知道这不是很多数据。

然后是训练。我尝试了许多我认为很酷的增强,但最终只是降低了模型的准确率。最后,我只是在未扩充的数据集上训练了 1200 个时期,只花了不到半个小时。这意味着我可以快速尝试新的配置、数据集和超参数,并检查哪些最适合我。一旦我选择了我最喜欢的,我就计算科学家用来检查他们的模型是否健康的所有指标数据,一旦指标给我开了绿灯,我就开始编写移动应用程序。

检查指标是否正常对于模型的健康很重要。在这张图片中:一个称为混淆矩阵的度量,显示了模型在测试集中犯最多错误的地方。理想的混淆矩阵是全黑的,除了主对角线是全白的。(图片由作者提供)

如果你记得从这篇文章开始,我的手机是一个机器人。这意味着应用程序需要用 Java(或 Kotlin)编写。问题是,几乎整个数据科学生态系统都是围绕 Python 构建的。模型是用 python 写的,预处理管道是用 Python 写的,科学编程方法和线性代数例程是用 C 写的,带有 Python 包装器,所有的东西都是用 Python 写的——而这些在 Java 中都没有。

我不得不花数周时间从头开始写所有的东西。大多数程序员只会在 GitHub 或 Maven central 中搜寻别人编写的包和库。但是从我的经验来看,它们从来没有像你自己的代码那样运行得那么快,那么无缝。

我写的应用程序实际上只是一个语音激活的按钮应用程序。它通过手机的麦克风收听,检测语音,将其转换为声谱图,并通过模型转发。如果输出是可理解的,一个适当的 HTTP 请求将被发送到 Sensibo 服务器,然后激活我的物联网传感器,就像他们自己的应用程序一样。

在对本文描述的整个过程进行了大量的微调和一些技巧之后,我成功地将语音转换为音素的时间减少到了 1810 毫秒以下。在较新的手机(不是我的古董设备)上,预测时间要好得多(通常不到 1 秒),这对任何实际需要来说都绰绰有余。

所有的语音处理都是在本地进行的,这与普通的语音识别助手不同,后者会将你的声音发送到服务器并等待回答。而且真的管用!助手们从来不擅长识别我的声音,现在我终于有了一个专门为我调整的应用程序,用我的母语。最后,检查 APK 的细节(这是每个 Android 应用程序的文件扩展名),结果整个东西只有 35 MB 重,其中模型只有 1217 KB。多酷啊。

最终 APK 的文件组成。(图片由作者提供)

我的项目绝对只是一个展示,而不是一个商业化的产品。我认为在这个领域做一些进一步的研究会很好,因为我仍然有一些公开的问题想要回答。模型的伸缩性如何?你能教它多少不同的命令?一旦我们增加更多的扬声器,对准确度会有什么影响?还可以应用哪些巧妙的技巧来减少模型的内存和磁盘空间需求?有没有任何数据扩充可以用于这种模型,而不会显著损害实时准确率?在准确度损失太大而无法进行正确的语音识别之前,我们可以将训练集和测试集的大小减少多少?

许多问题要回答,还有许多工作要做。但是在过去的几个月里,和我的朋友开玩笑真的很有趣,我正忙着教我的空调说希伯来语:)

来自 Android 应用程序的截图(图片由作者提供)

欢迎在下面的评论中问我任何问题。如果你对所有无聊的细节感兴趣,实际上有一篇我写的研究论文和附带代码,你可以在那里查看。当然,如果你读到这里,感谢你阅读我的故事!

我如何自学 Tableau

原文:https://towardsdatascience.com/how-i-taught-myself-tableau-f4aab862b695?source=collection_archive---------35-----------------------

Tableau 是一款世界一流的数据分析和可视化软件,让您轻松查看和理解您的数据。

我是一名质量分析师,后来成为了数据分析师。几年前,在组织的一次重组中,工作中出现了一个利用现有数据分析质量的机会,我不假思索地抓住了这个机会。

接下来我所知道的是,由于我作为测试人员的产品知识,我能够很好地使用一次性数据转储并在 Google sheets 中使用它构建仪表板。在看到我的进展后,我问我的主管我是否可以拥有 Tableau 许可证密钥和对我们组织的数据仓库的读取权限,以便我可以接触到公司中更广泛的受众,并标准化使用 google sheets 构建的仪表板。他同意了。

就在那里。我自学了如何编写合适的 SQL 查询来获取数据,并从 Tableau 仪表板开始。我记得我想在他们的网站上使用画面教程,顺便说一句,非常详细和有用,但是我从来没有找到专门的时间。

下面是一些实际上帮助我自学使用 Tableau 的数据可视化艺术的东西。

1。使用可用/预先存在的 Tableau 仪表盘

在尝试使用现有仪表板进行分析时,我经常需要理解底层数据并添加新的过滤器来进一步剖析趋势。所以,我从服务器上下载了一份拷贝,试图理解原作者是如何组织它的。

这确实有助于我理解计算字段、筛选器类型和显示筛选器的不同选项。

如果您没有访问任何仪表板的权限,您可以通过从 Tableau Public 下载仪表板来实现这一点(稍后将详细介绍)。

2.Tableau 在线社区

每当我想用我不知道的数据做一些事情,无论是混合不同的来源,使用选择性过滤器,动作过滤器,LOD 表达式,我都在 Tableau 论坛上搜索。我会说我总能找到那个问题。因此,要么我会使用答案来了解如何做我想要做的事情,要么我会知道它不被支持,以及实现类似结果的变通办法。我在论坛上问过问题,论坛上的人真的很有帮助。以下是社区论坛的链接:

3.实践

当时我参与了一项相当激烈的活动,每周与首席执行官和副总裁开会,介绍我的发现。由于我还不知道任何其他分析数据的方法,我尝试了很多东西。我指的是很多。有时,即使在今天,当我看着那时候的旧仪表板时,我也会印象深刻。当然,所有东西都在 NDA 名下,所以我不能在网上任何地方发表,但这仍然让我感到自豪。

4.Tableau 公共

最初的几个月后,我迷上了 Tableau。我喜欢用交互式数据可视化来讲故事。因此,我一直在寻找新的和酷的方法来可视化数据。Tableau 有一个公共画廊,来自世界各地的作家在这里发表他们的作品。这是一个学习使用 tableau 可以完成什么的好方法。我仍然记得第一个让我惊讶并激起我好奇心的是《泰坦尼克号》中的克里斯·洛夫。这是,即。

还有很多更棒的可视化技术。你可以在这里关注那些定期发表作品的作者,并向专家们学习这门手艺。

5.舞台表演比赛

从公众画廊中的一个 viz 下的演职员表中,我开始了解改头换面星期一。这是一个由 vizwiz 组织的竞赛,你得到一个数据集,你需要构建可视化来发现洞见。全球各地的人们都参与其中,你会看到很多可以从中获得灵感的作品。

6.其他资源

有一个叫#datafam 的 Twitter 群组句柄。这个组合太棒了。你一定要跟随他们来获取你每天的灵感,并了解数据可视化世界中正在发生的事情。

VizWiz 的创始人 Andy Kriebel 也有一个 youtube 频道,他在那里发布视频来提高你在 tableau 的职业生涯。你可以关注他的 youtube 频道了解更多信息。

https://www.youtube.com/c/AndyKriebel/featured

我希望这些信息有助于你学习 Tableau,并有一天成为一名数据分析师。

感谢阅读,快乐学习!

如果你喜欢你刚刚读到的,请看看我的其他文章。也可以考虑在Twitter或者 T ableau 公众 上关注我。

我是如何过渡到数据科学的&在一次数据科学职位面试中获得了纽约时报、Capital One、Linkedin、Twitter、脸书、埃森哲、政治和其他人的关注。

原文:https://towardsdatascience.com/how-i-transitioned-into-data-science-got-the-attention-of-the-ny-times-capital-one-linkedin-912d58aafec3?source=collection_archive---------4-----------------------

办公时间

在 Unsplash 上由Christina @ wocintechchat.com拍摄的照片

在我上面提到的公司中,我和每家公司的招聘人员都进行了交谈,其中一半的公司我进行了编码练习,这意味着我和招聘经理进行了面试,还有一些公司进入了最后一轮面试。在获得数据科学硕士学位后,在所有这些面试之后,我得到了两份工作邀请,并获得了大幅加薪。自从我作为 Python 初学者在 上写了我的第一篇中型博客文章以来,已经过去了 3.5 年,我从哪里开始 ?尽管我知道我的学习永远不会停止,有时我觉得我还有很多要走,但回头看看我在过去的 3.5 年里走了多远还是很好的。我决定写一写过去几年的事情,以举例说明我是如何从营销职业过渡到数据科学的。

当你阅读这篇文章时,请记住这是我的旅程,不是每个人看起来都一样,但希望这将帮助任何试图向数据科学过渡的人。你不必做我做的每一件事,但我希望这有助于描绘一幅画面,或激励你做一些能帮助你脱颖而出的事情。我将坚持两个主题,而不是步骤:可信度和曝光度。他们也可以按顺序进行,因为我发现,一旦你建立了一些信誉,你就更有信心建立关系网,并从那里开始创造(甚至被要求这样做)一些曝光。

可信度

人们会雇用你,要么是因为你已经完成了类似的任务,要么是因为你有能力和理解力快速学习完成规定的任务。在我的职业生涯中,有几次我被聘用到一个我从未做过的领域工作,但由于我的分析思维和快速学习能力,我得到了信任。但是,有一些经验会让你脱颖而出。我说的不是在一些荒谬的职位描述中看到的一些入门级职位所需的 5-10 年经验。如果你能展示出你有能力完成这些任务,即使你需要一些指导或脱离以前的例子,这对公司来说是非常有吸引力的。然而,有些公司需要的不仅仅是这些。在数据科学中,我们应该在建立一些可信度之后才肩负起解释、编码和咨询的责任,如果不是的话就叫 与统计数字 (这是一本书)。数据科学角色旨在帮助解决复杂的问题,这些问题有时(如果不是一直)会对公司及其客户产生一些财务影响,而我们这些数据科学家有责任确保我们向公司和数据本身提出正确的问题。

我做了以下几件事来建立一些可信度:

  • 编码训练营:我在 2018 年的大会上做了一个数据科学训练营,我所在的创业公司同意支付一半的费用。我认为这激发了他们开始他们的职业发展预算,因为在他们为自己的职业发展提供 1000 美元后不久。如果你的公司能为此买单,那就太好了!我知道不是每个人都有能力自己支付,特别是在开始的时候,学生贷款是我们国家的一种疾病……这就引出了我的第二点,如果你有能力的话:
  • 一些课程作业,甚至可能是文凭。我今年完成了数据科学硕士学位,这对建立信誉和建立关系网有很大帮助。如果你负担不起重返学校的费用,我会在社区大学上一些课,或者在 Coursera 或 Udemy 上一些课程,这些课程更便宜,更偏远,而且可以自定进度。钱可能是一个障碍,但你必须利用你所拥有的,图书馆的书是免费的。在学校,他们会教你你编写的模型背后的理论和数学,而我发现这些在新兵训练营里是没有的。显然,新兵训练营可以更短,更便宜,你必须投入更多的时间去读研。最后,如果你知道模型背后的数学,你可以很容易地解释为什么使用数学来展示支持向量机可以处理数据中的异常值,而逻辑回归却不能。这就是我回到学校的原因,我想了解黑匣子在做什么,并能够评估输出,而不是猜测为什么 KNN 在较小的数据和大量 K 邻居的情况下表现如此糟糕,因为维数灾难。或者为什么线性回归是一个非常有偏差的模型,我应该在大多数情况下用它来进行推断而不是预测。
  • 认证。我是 AWS 机器学习认证的。在公司,我现在他们给人们一点小奖励,并支付参加认证考试的费用。
  • 一份书面记录。或者在这种情况下是数字文件记录。我三年前开始写作,我不像我的数据科学朋友 Nicole 那样经常发表文章,并且在媒体上有超过 1K 的追随者。然而,在上面提到的其中一家公司的一次面试中,招聘经理说他读了我关于评估 NLG 推文的马尔可夫模型与 GPT-2 模型的博文,他们很高兴能采访我。这不是一个采访,但也展示了如何写在媒体上让许多人找到你的工作,甚至通过谷歌搜索。当我使用 Google Sheets API 时,一位 Google 产品经理在阅读了我的一篇早期博客文章后,想和我谈谈。现在,在写了几篇文章后,与其他文章相比并不多,但我有几篇文章定期从谷歌获得 SEO 流量,并有超过 5000 的浏览量。
  • 创造。我记得在阿里·斯皮特尔的博客中的一篇博文上看到了布鲁姆的分类学链接。她是我尊敬的人,也是我学习的最佳参考。就像在布鲁姆的分类法中,她应用了许多更高的支柱来达到知识。她不断地创造,这是学习的最高形式。当我在纠结一个新概念的时候,我会努力记住这个框架。在研究生院,我会做笔记,为金字塔底部的考试制作抽认卡,但是我的项目和交付成果帮助我进入了金字塔的中间。有时我会创造一些东西来展示我对手头问题的理解程度。无论是一篇研究论文,一个编码笔记本,甚至是建立一个模型并评估它,都帮助我获得了关于我的领域的知识。我强烈推荐在你的 Github 上展示你创造甚至评估的东西。我有几个项目和代码,但我在 2021 年剩下的时间里的主要目标是有几个带有适当文档和可再现性的编码项目。

范德比尔特大学教学中心的照片https://CFT . Vanderbilt . edu/guides-sub-pages/blooms-taxonomy/

  • Linkedin 个人资料上的关键词。显然,你不应该在 Linkedin 上谎报你的技能,但你必须聪明地选择词汇。在阅读了一些工作描述后,你可能会有一个想法,如果你试图区分自己是数据科学家还是数据工程师,你会使用像建模评估还是数据管道这样的东西。作为一名数据科学家,你可能被期望做一些数据工程,但是如果你想要专注于数据科学的角色,你希望使用比 ETL 更多的数据科学关键词。参见我在 上的帖子,你应该在数据科学面试中问他们的问题 才能知道区别。随着数据科学行业开始发展,一些角色,如机器学习工程师与数据科学家重叠。特别是如果一个公司使用 Auto ML,他们可能只需要一个懂一点统计学和数学的软件工程师来做数据科学。

一旦我开始从我投入的工作中,从阅读文章、书籍和上学中,对自己的可信度有了一点信心;我准备开始做一些曝光。

  • 口语/教学。*古训,谓那些不能的人;“,*教显然是错误的。为了教会你必须知道你在做什么。没有人指望你成为任何方面的专家,但是如果你能教别人你所学的东西,不仅能巩固知识,还能帮助缓解骗子综合症。我记得当我学习所有不同的 Python 或 R 包时,如使用 Pandas 或 DPLYR 进行数据挖掘和转换,或使用 Matplotlib/Seaborn/gg plot/Plotly 进行可视化(有如此多的数据 viz 库和现在的交互式仪表板,如 Bokeh、Dash 和 Shiny),web 抓取(Beautiful Soup 或 Rvest),这一切都感觉势不可挡。为了加强我的学习,我会立即报名参加一个编写 Python 代码的女性聚会,并自愿去教书。这包括创建一个 PowerPoint 和代码,让其他人亲自跟随和调试。我还必须用语言引导人们。这对我的冒名顶替综合症真的很有帮助,这是我写的第一批帖子之一。几年后,我仍在苦苦挣扎,我知道很多有才华的人,比如高端公司的数据科学经理,比如我面试过的那些公司,有时也很痛苦。
  • 推荐。我的一份兼职数据科学工作来自一份给招聘经理的推荐信。推荐人是我志愿教授编码社区的一个人。这让我想到了你为获得曝光率而做的下一件事,每个人都喜欢的词;网络。在你们一起工作或保持联系后,人际关系网可以让你获得推荐。在我工作过的这家初创公司,高管团队在招聘过程中是透明的,尽管推荐人约占招聘来源的 10%,但他们至少占他们提供的人员的 1/3。在 Capital One,他们每天收到数百份申请,直到一位老同事向我推荐,一位招聘人员才伸出手来开始面试(我很高兴地告诉大家,我进入了最后一轮,那是一场历时 5 小时的艰苦面试;最后,它没有工作,但我认为这是最好的。
  • 出版物。这有点难以实现,所以这不是一个要求,但它不仅有助于建立信誉,而且有利于曝光,因为有时你在会议上介绍你的工作,如果你的工作很好,许多人会传阅你的工作。我目前正试图发表一些我在研究生院期间作为研究助理所做的工作。
  • 成为一个机构的董事会成员或研究员。我两者都是;我的研究生院要求我成为一名数据科学研究员,最近我被邀请加入一个我非常珍视的组织的董事会,该组织鼓励女孩在年轻时编写代码,名为布尔女孩。

我希望这有助于任何考虑过渡到数据科学的人,甚至有助于过渡到不同职业的框架。有哪些相似之处或你做的不同之处?

我如何使用人工智能来帮助我朋友的 YouTube 频道

原文:https://towardsdatascience.com/how-i-used-ai-to-help-my-friends-youtube-channel-b450b5ed15e0?source=collection_archive---------31-----------------------

https://youtu.be/5VJkvx70iBQ

利用深度学习优化 YouTube 缩略图

最近,我有机会拜访了迈克尔·彭斯瑞克和他的家人。这让我开发了一个优化 YouTube 缩略图的人工智能工具,目标是超越 YouTube 算法。

关于这是如何发生的,迈克尔经营着一个非常成功的 YouTube 频道,名为自己动手,跟踪他的家人和朋友在城堡和园丁小屋的翻新进展。迈克尔邀请我去帮助装修,作为回报,他们会让我住在城堡的一个房间里。这是一次不可思议的经历,我非常感谢迈克尔邀请我和他的家人作为如此伟大的东道主,我想尽我所能帮助他们。这激励我尝试将我的数据科学背景应用到 Michael 的 YouTube 频道中。他很友好地与我分享了他的分析数据,我最终深入研究了他的渠道覆盖范围、参与度和受众统计数据。

这个过程涉及到对 YouTube 算法的大量研究,它是如何工作的,以及它如何与迈克尔的内容和他的订户群进行交互。YouTube 已经创建了一个由内容创作者组成的复杂生态系统和一个先进的推荐系统,所以我知道我很难为迈克尔的频道增加价值,因为他已经是自己内容和 25 万订户感兴趣的内容的专家。

【https://www.youtube.com/c/DoingItOurselvesOfficial

尽管如此,我还是想试着提供一些建议,虽然我不会涵盖我在这个过程中发现的所有细节,但我想谈谈要点;这涉及到 YouTube 算法的总体特征,以及我通过评估迈克尔的 YouTube 分析学到的一些更好的细节。最后,我将谈谈这是如何导致我提到的人工智能工具的发展的。

众所周知,YouTube 视频成功的主要衡量标准是浏览量。作为一名数据科学家,我喜欢优化单值指标,因为这让我更容易专注于一个非常复杂的问题。我们所要做的就是探索影响视图计数的不同变量。

首先,我想看看流量来源数据;观众从哪里来?对我来说,作为一个小型内容创作者,我的频道mindoftata有一个关于用人工智能制作音乐的相对流行的视频,标题中有一个知名的开源软件,大约 66%的观看次数是由搜索该软件的人驱动的,即 YouTube 搜索。然而,对于像迈克尔这样已经建立了订户基础的内容创作者来说,他的大多数观点将来自“浏览功能”类别,在那里他的新视频会出现在人们的主页上。这将主要包括他的订户,但也可以包括过去喜欢过他的内容或类似内容的其他人。

mindoftataYouTube Analytics。图片作者。

因为这是最大的一个类别,所以我想集中我的大部分精力。它也回答了我们第一个关于如何获得更多浏览量的问题:获得更多浏览量的方法是让 YouTube 在主页上向更多人展示你的视频。只要你有一个适度有趣的缩略图和标题,那么凭借 YouTube 上的大量用户,一些人最终会点击它。这让我们把研究问题缩小到:

我们如何说服 YouTube 算法向更多人展示一个视频?

这让事情变得有点复杂。这相当于问 YouTube 的算法是如何工作的,有很多人已经花了很多时间来弄清楚这个问题。关于算法的复杂性和它是如何工作的,整本书都可以被创作出来,但是我想对这个据我所知还没有被探索的领域做出独特的贡献。因此,我将进一步缩小研究问题的范围,并专注于算法的一个特定方面:印象点击率。那么是什么说服一个人去点击一个特定的视频呢?这是 YouTube 成功的一个必不可少的要素,因为拥有高点击率只是算法用来确定一个视频是否好,是否值得推送给更多人的因素之一(显然,以平均观看时长衡量的内容质量也是一个重要的指标)。点击率还具有几乎完全取决于 6 个因素的优势:

  1. 缩略图
  2. 标题
  3. 视频长度
  4. 视图的数量
  5. 这段视频是最近发布的
  6. 人们对频道内容和质量的现有看法

这些功能作为一个整体构成了一个相当复杂的变量集,使其不可能优化,但我们可以专注于这些变量中的一个,这最终给了我我的人工智能项目的想法…在这一点上,缩略图是说服某人点击视频的主要因素,这是相当普遍的知识。大红色箭头、圆圈、人脸、重叠文本以及缩略图中引人入胜的内容描述等特征都对人们是否决定点击视频产生了巨大影响。我还想到,神经网络可以识别所有这些特征,我既有缩略图,也有来自迈克尔 YouTube analytics 的印象点击率数据,所以我为什么不建立一个工具,将迈克尔的缩略图作为输入,并学习预测点击率?这样一个项目的结果将是一个模型,可以区分具有高“可点击性”和低“可点击性”的缩略图。

所以我开始研究这个模型。我从“自己动手”频道的页面上抓取了 YouTube 的缩略图,并确保图像标题被恰当地标注,这样我就可以将它们映射到 YouTube analytics 的点击率上。

我发现的第一件事是因为我开始使用主分析页面的平均点击率,但我注意到许多迈克尔最受欢迎的视频的点击率实际上低于预期。所以我调查了一下,结果发现如果一个视频的点击率很高,那么 YouTube 算法就更有可能更大力地推送该视频,直到该视频达到向所有对其感兴趣的人显示的饱和点,点击率开始下降。在这一点上,该算法决定向人们推荐更多相关的视频。所以实际上,我最终调出了点击率时间序列数据,并分离出峰值率,这通常发生在视频发布的第一天或前几天。

YouTube 分析点进时间序列。图片作者。

使用 FastAI,我编写了一个模型,仅从缩略图预测峰值点击率;我没有在模型中加入任何其他变量,部分原因是我想保持它作为一个简单的概念证明,但也因为用有限的数据训练一个关于标题“可点击性”的模型是困难的。即使是缩略图,在我的模型开始识别“可点击”的特征和误差达到合理水平之前,我必须在 20 个时期内进行训练。这意味着模型建成后将大量修改,特别是做自己风格的缩略图。

我把误差降到了 2.90%,考虑到平均峰值点击率约为 12%正负 5%的标准差,这似乎相当不错,而且我也没有纳入标题数据或其他因素。这个错误百分比也来自验证集,因为数据有限,我无法保留一个重要的测试集。然而,我在迈克尔最近的几幅缩略图上测试了这个模型,到目前为止,它似乎对峰值点击率给出了相当可靠的预测。在让这个模型达到一个相当不错的程度后,我围绕它建立了 widget 应用程序功能,并通过 Heroku 发布了一个公共版本。所以你可以在这里查看这个应用程序:http://thumbnailpredict.herokuapp.com/如果你有兴趣的话。

最好的情况是,这个工具可以给一些人一点优势,让他们了解如何开发“可点击”的缩略图。如果您正在为一个视频的两个或多个缩略图争论不休,它会特别有帮助。它肯定不会神奇地为你制作一个伟大的缩略图,或者一个伟大的标题。我认为这种人工智能应用程序可以观看你的内容,并开发出一个会引起很多关注的缩略图和标题,这是完全可行的,但需要几个月的时间来开发,并需要访问更多的 YouTube 数据。

在这个过程中,我学到了一些非常重要的东西;缩略图和标题确实很重要,但是一个好的缩略图和一个普通的缩略图之间的差异(假设你仍然准确地表示了内容)在视图中占大约 25%的差异。显然,这个值的范围很大,只是一个粗略的估计,但关键是,尽管 25%的浏览量差异非常显著,但它表明 YouTube 增长的秘密不只是一个好的缩略图和标题那么简单。事实上,从我的研究来看,潜在的最关键因素是人们对频道的看法和内容的质量。这绝不是一个简单的理解和预测的指标。这需要对 YouTube 生态系统有相当的了解;营销、媒体、粉丝参与,以及其他各种未提及的有助于 YouTube 增长的因素。

[1]:迈克尔·彭斯瑞克(2021 年 11 月)。 自己动手 YouTube Analytics。

释放数据的力量,找到完美的度假目的地

原文:https://towardsdatascience.com/how-i-used-data-for-choosing-my-next-holiday-destination-21b3519fe995?source=collection_archive---------31-----------------------

使用数据分析的力量来决定你下一步要去哪里旅行!

由 Unsplash 上的 Karsten Winegeart 拍摄

有了 COVID 疫苗和更好的卫生措施,事情在大多数方面都开始“恢复正常”,各国都在大力投资旅游部门的激励措施,特别是在欧洲部分地区,疫情的控制力略强一些。

虽然个人安全和健康是最重要的,但很快就能回去旅行和参观新的地方将是令人惊讶的。所以,如果你像我一样喜欢旅行和数据分析,留下来,我会告诉你我如何使用天气数据来决定我的下一个旅行目的地,剧透一下,这应该是一个温暖而美丽的地方。让我们开始吧!

我是如何做到的

我尝试应用我在所有数据分析过程中使用的大致相同的方法,特别是对于面向地理的数据,并且可以自由地做我想做的事情,因为没有一个假设要测试,也没有一个类要预测。当然,这不是一个严格的项目,团队或公司依赖于它的结果,但仍然,设定清晰的目标并使用领域的知识来获得有用的结果是很好的。

至于我们将使用的数据,如你所知,天气可以定义你享受休闲旅行的程度虽然完美天气的定义可能因你问的人而异,但温和的气温和无雨无雾构成了享受那些渴望已久的假期的完美环境。我将使用 R 和 GSODR 包,它从世界各地的气象站检索天气每日数据。

这个项目有 5 个主要阶段:

  1. 缩小区域范围,获取数据
  2. 缩小日期范围,过滤数据
  3. 定义标准
  4. 可视化和比较地点
  5. 显示结果并选择一个或多个地点

做完这些,剩下的唯一一步就是打包行李走人了!😎

  1. 该地区

我当时就知道我想去意大利,所以把范围缩小到一个国家既简单又有用。作为十九世纪去巴西的意大利人的后裔。对许多令人惊奇的地方做一点研究,可能会发现我有足够的理由。因此,意大利,我们走吧!

但不要这么快,让我们先检查我们的可用数据。我们的数据中有 308 个气象站,遍布意大利。这是一件很棒的事情,有更多的数据来找到完美的地点。

意大利的全天候气象站[图片由作者提供]

并不是所有的站点都有当前的数据,我们只想要最近的信息来确定最佳的观赏地点——你知道,气候变化是一个问题,所以旧的数据可能会与最近几年的数据非常不同。

Obs:有很多方法可以找到离某个城市或景点最近的气象站,比如说,可以同时比较巴塞罗那、罗马、巴黎和米兰的天气。做起来很简单。

2.日期

你可能有一周的假期,你可能在一家廉价航空公司找到了很多机票,或者你在日期范围上有一些灵活性。下一个合乎逻辑的步骤是过滤您获得的历史数据,这些数据完全基于您可用的天数或周数,以便更好地了解过去几年的天气情况。

我的日期现在相当灵活,所以我决定检查 10 月的整个月。该月的一小部分数据如下所示:

获得的数据中最感兴趣的字段的快照[图片由作者提供]

我们将使用这些字段来确定好天气的感觉:

  • PRCP:那天的降雨量
  • I_FOG: "1 "如果当天有雾
  • 最低和最高:最低和最高温度

3.对你来说好天气是什么感觉?

通过风、温度、雾、雨和雪等属性,我们可以使用大量因素来确定天气最适宜的城市。在这里做自己的事,选择自己最喜欢的。我有四个条件:

  • 无雨
  • 没有雾
  • 最低气温超过 10 摄氏度
  • 最高温度可达 30 摄氏度。

4.比较和分析位置

根据上面的标准,让我们根据 Belokurows 系数,找出拥有最佳天气天数最多的城市(气象站)。😅

天气最好的意大利城市[图片由作者提供]

上表中的数字显示了过去 10 月 3 个月中平均满足每个条件的天数。根据我的标准,这些是过去 3 年里 10 月份天气最好的 10 个城市。在意大利地图上绘制城市,我们得到这样的结果:

根据我的看法,意大利十大天气城市[图片由作者提供]

不足为奇的是,大多数城市都位于沿海,而且更靠南,靠近巴里、巴勒莫和那不勒斯等天堂般的地方。

5.选择最佳城市

根据汇总的数据和前 10 名的排名,我选择了周围基础设施良好的城市,即靠近大城市的城市,这意味着更实惠的住宿地点和交通方式。较小的夏卡、克罗托内、卡坦扎罗、安科纳和格罗塔格里被过滤掉了,然后我会仔细看看另外 5 个。

看看巴勒莫、巴里和迪森萨诺,这里的气温变化很大,尤其是巴勒莫的高温和迪森萨诺的低温。

三个城市十月的天气[图片由作者提供]

虽然所有进入前十的城市都很棒,但很难找到不喜欢左边两个城市(车站)及其周围地区的地方。

天气最好的两个城市[图片由作者提供]

Civitavecchia 是我分析得最透彻的城市中天气最稳定的城市,虽然它主要是作为一个邮轮港口,但它有博物馆、一座 16 世纪的堡垒和令人惊叹的古代遗迹可供参观。它靠近罗马也没有坏处,这使它成为那些通过意大利首都到达意大利的人的一个好去处。

现在,女士们,先生们,我敢说你有任何关于 T2 卡普里岛 T3 的坏话。这是一个因其高档酒店和购物而闻名于世的岛屿,更棒的是,它还有铁蓝色的海水和崎岖的地貌(见下图)。我想对于像我这样预算紧张的人来说,住在这里可能有点贵(更不用说破产的 AF 了),但它周围的那不勒斯地区肯定会提供更多实惠的选择和许多值得一看的好地方。

莱蒂齐亚·阿戈斯塔在 Unsplash 上的照片

希望你喜欢这篇文章。我很快会在 Github 上分享代码和数据,如果你有任何问题,请告诉我。

到目前为止,我是如何(不正确地)使用朴素贝叶斯的——第 1 部分

原文:https://towardsdatascience.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-1-4ed2a7e2212b?source=collection_archive---------7-----------------------

这篇文章旨在帮助你更好地理解朴素贝叶斯。

图片和编辑归我姐姐(https://www.instagram.com/the_snap_artistry/)

就像朴素贝叶斯做了一个天真的假设,我们给模型的特征是独立的,我也做了几个关于 NB 如何工作的天真假设。

  • 我假设多项式函数适用于任何给定的数据。(无论我有什么数据,我都用这个)→ 在下面的帖子中详细解释了为什么这是一个不好的做法。
  • 高斯朴素贝叶斯假设特征是高斯的。→ 不假设特征为高斯分布,而是假设似然概率遵循高斯分布。
  • 在多项式和分类中,似然概率的计算是相同的。在多项式中,分母是特定类别中的单词总数,而在分类中,分母是特定类别中数据点的总数。
  • 用 python 从头开始实现朴素贝叶斯非常困难。→ 实现多项式朴素贝叶斯只需要 15 行代码。

以下是据我所知的事情,可以让你深入了解朴素贝叶斯:

如果你是朴素贝叶斯的新手或者想要快速复习,请查看我的笔记开始。

1。为什么在朴素贝叶斯中我们假设特征是条件独立的?

。Sklearn 有 GaussianNB,MultinomialNB,CategoricalNB,BernoulliNB →给定的数据有类别,数值,二元特征你会选择哪个模型?**

3。如何对文本数据从头实现多项式朴素贝叶斯,并用 Sklearn MultinomialNB 匹配结果?

4。如何对分类数据从头实现分类朴素贝叶斯,并用 Sklearn CategoricalNB 匹配结果?

5.如何对数值型数据从零开始实现高斯朴素贝叶斯,并用 Sklearn GaussianNB 匹配结果?

6。朴素贝叶斯的训练和测试→时间和空间复杂度有哪些?

7。朴素贝叶斯是否受到不平衡数据的影响,如果是,如何解决?

8。离群值是如何影响朴素贝叶斯的?

9。朴素贝叶斯可解释吗,我们能说出哪些特征帮助我们预测了一个特定的类吗?

10.朴素贝叶斯是线性分类器吗,它能解决非线性的决策边界吗?

11。如何避免朴素贝叶斯中的过拟合或欠拟合问题?

在这篇文章中,你会找到前 4 个问题的所有答案(粗体),因为文章越来越长,我把这些问题移到了第 2 部分,你可以在这里查看链接。

https://gautigadu091.medium.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-2-d31feff72483

我们开始吧,

1。为什么在朴素贝叶斯中我们假设特征是条件独立的?

这是朴素贝叶斯方程,用于计算给定输入 X 的目标值的后验概率(不假设任何条件独立性)

假设您有三个特征,那么为了计算可能性概率,您必须遵循以下步骤。

假设您的训练数据只有三个数据点(0,1,0),(1,0,0)和(1,0,1),目标值分别为 0,0 和 1。现在让我们在假设和不假设条件独立的情况下计算似然概率

如果没有条件独立性,我们得到的似然概率为零——但是为什么呢?

因为我们没有足够的数据组合来帮助我们计算可能性。

那么,你至少需要多少个数据点呢?

假设我们正在求解二元分类,并且输入也是二元要素。假设我们有 3 个特征,那么输入 X 的所有可能值可以有 222 = 8 个组合,我们需要这 8 个组合用于每个类 8*2 = 16。

对于 d 维数据,我们需要有 2^(d+1)数据点。如果 d = 30,则接近 5000 亿个数据点。这实际上是不可行的。

有了条件独立,这就变成了 2d 组合。仅通过一个简单的假设,时间复杂度显著降低。

2。Sklearn 有 GaussianNB,MultinomialNB,CategoricalNB,BernoulliNB →给定的数据有类别,数值,二元特征你会选择哪个模型?

这是我忽略的一点,我通常在给定任何类型的数据时应用多项式 NB,但当我了解每种算法时,我明白每种算法都需要不同类型的数据。

高斯 B →当你有连续的特征。

当你有分类数据时。

多项式 lNB →应用于文本数据。

那么,假设您的数据具有连续特征、分类特征和文本数据,您将使用什么算法?

每个算法的基本假设是,它假设特征是有条件独立的。拟合 categoricalNB 上的分类特征、GaussianNB 上的连续特征和 MultinomialNB 上的文本数据,获得每个模型的似然概率(对于每个数据点,现在我们将有 3 个似然概率),并将它们相乘以获得总体似然概率。

注意:你必须将先验概率乘以最终似然概率,才能得到最终后验概率

3。如何对文本数据从头实现多项式朴素贝叶斯,并用 Sklearn MultinomialNB 匹配结果?

步骤:

  1. 使用 BOW 将数据转换成矢量。
  2. 根据类别计算计数。
  3. 计算所有的似然概率。
  4. 计算先验概率。
  5. 计算后验概率。

让我们取一个样本数据:

  1. 使用计数矢量器将文本转换成弓形:

这是简单明了的。

2。基于类别计算计数

  • 首先,对目标值进行一次性编码。我在这里使用 LabelBinarizer。检查以下代码中的示例输出。
  • 现在 y 的形状将是(n_classesn_datapoints),X 的形状是(n_datapointsn_features)。

要获得基于类的计数,将 y 的转置与 x 相乘就足够简单了。

对 count_matrix 的工作方式感到困惑,让我们举个例子来说明一下:

希望上面的例子是清楚的,如果不是的话,试着在一张纸上做来理解矩阵乘法。

3。计算概率:

例如,为了计算 P('are'/y='question '),我们使用下面的公式。添加拉普拉斯平滑以避免零概率情况。

计算特征对数概率的步骤:

  1. 我们已经有了计数→只需给它们加上α进行拉普拉斯平滑。
  2. 现在,对这个按行计算总和,以获得特定类中的单词数。

当α= 1 时:

  1. 将 count_matrix 中的所有值加 1。
  2. 计算逐行求和。根据分母的公式,我们必须加上 21*alpha (21 个唯一的单词),我们这样做了吗?

是的,在每个值的分子中,我们都添加了 alpha,所以当我们做 sum 时,我们基本上是在做 row sum (count_matrix)+ 21*alpha。

4.计算先验概率:

这是算法中最简单的一步,下面的代码不言自明。

4。预测功能:

现在,我们有了概率和一个查询点。我们可以简单地用矩阵乘法计算概率和查询点的加权和。

包装所有的代码,

最终输出

让我们将我们的结果与 sklearn 的实现进行比较

显示我们的结果与 Sklearn 多项式匹配的输出

只用了 15 行代码,我们就实现了“朴素贝叶斯分类器”。

4.如何对分类数据从头实现分类朴素贝叶斯,并用 Sklearn CategoricalNB 匹配结果?

  1. 对数据进行预处理。
  2. 基于类别计算每个特征的计数/存在。
  3. 计算似然概率。
  4. 计算先验概率。
  5. 计算给定查询点的后验概率→预测函数

在这个练习中,我采用简单的分类数据:

Dataframe 对象的头。

数据预处理:

  • 使用顺序编码将分类数据转换为数字形式。这些特征被转换为有序整数。这将为每个要素生成一列整数(0 到 n _ categories-1)。
  • 对目标值应用一键编码(就像我们在多项式 NB 中所做的那样)
X,y,classes = preprocess()
X.shape, y.shape

编码后的输出形状为:X →((18,3),y → (18,2))

2。基于类别计算每个特征的计数/存在。

下面是一个例子,我们将努力实现每一个功能。

我们在这一部分的主要目的是为每个特征生成这个计数矩阵。

  • 对于每个要素-从数据中提取该列-X _ feature
  • 对于一个类→确定该类在哪里为零,在哪里为一,并将其转换为布尔值。
  • 现在屏蔽你的输入特征,做简单的计数。

Count_matrix 将以这种方式给出输出,对于 2D 数组的每个特征(第一行对应于 No,第二行对应于 Yes)。

3。计算可能性概率:

这类似于我们在这里为多项式 b 所做的

  • 对于每个特征,如果提供的话,我们将增加 alpha(拉普拉斯平滑)。
  • 进行逐行求和,如上图所述。
  • 求对数-概率-对数(数/数)→对数(数)-对数(数)。

4。计算先验概率:

这与多项式 inb 非常相似,是算法中最简单的一步。

5.计算后验概率:

  • 从每个特性中获取相应的 log_probs。
  • 将这些概率与先验概率相加,得到最终的后验概率。

根据 category_id 提取单元格

比较 Sklearn 和我们手工实现的结果。

答对了。!

对于剩余的问题,请查看下面链接中的第 2 部分:

https://gautigadu091.medium.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-2-d31feff72483

非常感谢你💖阅读这篇文章,我希望你对朴素贝叶斯的工作原理有一个清晰而深刻的理解。

你可以在这个 GitHub 链接中找到完整的代码。你也可以在 LinkedIn 上和我联系。

参考资料:

  1. https://scikit-learn . org/stable/modules/naive _ Bayes . html # naive-Bayes
  2. 应用人工智能课程

到目前为止我是如何(不正确地)使用朴素贝叶斯的——第 2 部分

原文:https://towardsdatascience.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-2-d31feff72483?source=collection_archive---------14-----------------------

这篇文章旨在帮助你更好地理解朴素贝叶斯

图片和编辑归我姐姐(https://www.instagram.com/the_snap_artistry/)

这是第 1 部分的继续,

https://gautigadu091.medium.com/how-i-was-using-naive-bayes-incorrectly-till-now-part-1-4ed2a7e2212b

在这篇文章中,我将讨论以下内容(粗体)。如果你是朴素贝叶斯的新手或者想要快速复习,请查看我的笔记开始。

1。为什么在朴素贝叶斯中我们假设特征是条件独立的?

2。Sklearn 有 GaussianNB,MultinomialNB,CategoricalNB,BernoulliNB →给定的数据有类别,数值,二元特征你会选择哪个模型?

3。如何对文本数据从头实现多项式朴素贝叶斯,并用 Sklearn MultinomialNB 匹配结果?

4。如何对分类数据从头实现分类朴素贝叶斯,并用 Sklearn CategoricalNB 匹配结果?

5。如何对数值型数据从头实现高斯朴素贝叶斯,并用 Sklearn GaussianNB 匹配结果?

⑥。朴素贝叶斯的训练和测试→时间和空间复杂度有哪些?

7。朴素贝叶斯是否受到不平衡数据的影响,如果是,如何解决?

8。离群值是如何影响朴素贝叶斯的?

9。朴素贝叶斯可解释吗,我们能说出哪些特征帮助我们预测了一个特定的类吗?

10。如何避免朴素贝叶斯中的过拟合或欠拟合问题?**

让我们开始吧,

5。如何对数值型数据从头实现高斯朴素贝叶斯,并用 Sklearn GaussianNB 匹配结果?

  1. 预处理数据。
  2. 基于类别计算每个特征的均值和方差。
  3. 计算后验概率。

数据预处理

  • 我正在对目标变量进行一次性编码,就像我们在 MultinomialNB 和 CategoricalNB 实现中所做的那样。

基于类计算每个特征的均值和方差。

  • 首先,提取特定类别的数据点,然后计算每个特征的平均值和方差。
  • 我也在计算目标变量的数量,我们将很快用它来计算先验概率。

假设您正在对数据进行二元分类,以下是计算类 0 中要素 fj 的均值和方差的过程

基于目标值计算特定特征的数据点的均值和方差。

计算后验概率

在高斯朴素贝叶斯中,似然性被假设为来自高斯分布,这意味着似然概率遵循以下等式。

ref:https://sci kit-learn . org/stable/modules/naive _ Bayes . html # Gaussian-naive-Bayes

当我们在两侧应用对数时,我们得到以下关系:

将我们的结果与 Sklearn 进行比较:

上述代码的输出

答对了。!—结果匹配,您可以找到概率的最大值来获得预测类值。

5。朴素贝叶斯的训练和测试时间和空间复杂度是多少?

对于训练—我们需要计算 count_matrix 并存储所有可能的组合。在最坏的情况下,假设在 n 个数据点中,我们有 n 个类别(每个数据点有一个唯一的类别)、d 维以及 c 类。

那么时间复杂度是 O(ndc),空间复杂度也是一样的 O(ndc)我们要在内存中存储那些很多的组合。

在测试中,时间复杂度是 O(d*c ),只需获取并乘以每个类的所有 d 维表。

7。朴素贝叶斯是否受到不平衡数据的影响,如果是,如何解决?

是的,朴素贝叶斯受到不平衡数据的影响。

尽管似然概率在某种程度上是相似的,但是后验概率受到先验概率的严重影响。在上面的例子中,+ve 类的先验概率是-ve 类的 9 倍,朴素贝叶斯的这种差异造成了+ve 类的偏差。

一个简单的解决方案是忽略先验概率。(或)可以欠采样或过采样。

还有一个叫做 ComplementNB 的高级朴素贝叶斯,它是专门为处理不平衡数据而设计的,它也有一个 sklearn 实现。此外,检查这个研究论文。

8。离群值是如何影响朴素贝叶斯的?

在类别中 NB →如果在测试数据中,如果我们得到了训练数据中没有的新类别。因此,这一类别将没有可能的概率,结果为零。为了避免这种零概率问题,我们做拉普拉斯平滑。

在高斯 B →中,剔除异常值是很重要的,一个异常值会影响均值和方差,因此,所有的似然概率都会受到影响。

在多项式中,最好删除出现频率非常低的单词,因为可能性概率非常小。

但是我在很多地方读到,如果你在文本数据中找到一个新单词,那么这个概率是零。

但是,当您将文本转换为矢量时,基本上是对训练数据执行 vectorizer.fit _ transform(),对 CV 和测试数据执行 vectorizer.transform()。因此,基本上 CV 和 test 的向量是使用训练的词汇生成的。那么,这种新词出现在文本数据中的情况是不可能的。测试数据的向量长度将与训练数据的向量长度完全相同。

9。朴素贝叶斯可解释吗,我们能说出哪些特征帮助我们预测了一个特定的类吗?**

根据似然概率,我们可以解释模型,似然概率越高,越有助于我们对其进行分类。

10。如何避免朴素贝叶斯中的过拟合或欠拟合问题?

NB 中唯一的超参数是 alpha →较高的 alpha 将给出几乎相同的概率→这是欠拟合,较低的 alpha 值将使模型欠拟合。(查看注释中的示例)

11。朴素贝叶斯是线性分类器吗,它能解决非线性的决策边界吗?

根据这篇研究论文,朴素贝叶斯是一个线性分类器,但是在对数尺度上。关于这一点的直觉解释如下:

参赛作品:https://people.csail.mit.edu/jrennie/papers/icml03-nb.pdf

但是我试着用一个玩具数据集来验证这一点。

我用高斯朴素贝叶斯拟合模型并绘制等高线,得到了一个清晰的非线性决策边界。

下面是相同的输出,但使用对数标度。我甚至尝试使用 base-e,但是没有得到我期望的结果。

对数标度输出

如果你们中的任何人对此有什么要分享的,请在这个帖子下评论。

非常感谢你💖阅读这篇文章,我希望你对朴素贝叶斯的工作原理有一个清晰而深刻的理解。

你可以在这个 GitHub 链接中找到完整的代码。你也可以在 LinkedIn 上和我联系。

参考资料:

  1. https://scikit-learn . org/stable/modules/naive _ Bayes . html # naive-Bayes
  2. 应用人工智能课程

我是如何在开源开发中浪费了两年时间

原文:https://towardsdatascience.com/how-i-wasted-two-years-in-opensource-development-9be71491ce62?source=collection_archive---------19-----------------------

让我成长的副业失败的故事

我是一个开源的爱。我在 2006 年开始开发一个开源项目,这是我职业发展的秘密。感谢我在这次旅行中所做的实验,我现在是一个更好的开发者,并且我对社区有所回报——几乎我希望如此。

我在这里写了我对开源作为公司和开发者成长的驱动力的看法,但那是另外一个故事了😄

在这篇文章中,我想谈谈我在一个名为 RawCms 的开源低代码平台上,从 2018 年开始的经历。

善良好奇的在 Unsplash 上的照片

项目的失败

该项目最初是一个辅助项目,旨在改进即将推出的 Asp.net 核心 3.1,并探索利用非结构化数据加速开发过程的机会。

在此期间,我遇到了许多挑战,最终我实现了一个可行的 POC。这是一个巨大的成果,我必须多次感谢伊曼纽·布卡雷利、吉拉尔登戈以及所有其他二十多位贡献者。我们克服了所有的技术限制,并让它发挥作用。一些话题处于边缘,这让我参加了最重要的欧洲。网络会议来解释我们所学的知识。

此外,当我们意识到没有机会让它成长为一个真正的产品(没有赞助,也没有太多的社区支持)时,我们决定将这个项目存档,我开始回想我们已经做了什么。

我认为并且仍然认为这里的 t 不是产品定义中的漏洞。RawCms 的目标是做开发者将来真正需要的事情,但这太难理解了。解决了我们在这个过程中发现的所有的复杂性是伟大的,但是我们需要复杂性来对抗复杂性。这使得每个人都很难进入应用程序逻辑并做出贡献。

所有这些复杂性吓到了即将到来的开发者。

这可能就是为什么我们对这个项目的兴趣消失了,我们放弃了这个项目。如果一个开源项目的时间非常痛苦,那就很难向它捐赠。

在这一点上,在忘记这个项目之前,我想回顾一下,想想什么可行,什么不可行。

最后的结论是,我们选择了最差的技术来满足我们的需求。

为了说服我内心拒绝真相的那个人,我从头开始重新实施这个项目。我用 Symfony 而不是。Net 和我已经有了一个可用的 POC。还没有相同的特性集,但是我很确定在新的设置中,我们不会再发现任何问题。那教会了我很多。

我怎么能在两天内完成两年的事情呢?

这个问题的答案吓了我一大跳,我在想我错在哪里了。在接下来的部分,我会告诉你我犯了什么错误,以及我如何做得更好。

正确工作的工具

我不是最后一个到达的。Net 技术。我从 2005 年开始从事 it 工作,交付了许多大型企业项目,并受邀参加了许多会议来分享我的经验。但是我只是拿错了工具。我仍然认为。Net framework 可能是企业应用程序的最佳框架,在生产率和开发经验方面,C#语言没有对手。**问题是我选择它只是因为这是一个让我更有信心的框架。**对我来说,. Net 解决方案是最有机会成功的。我错了。自从我开始这个项目,我必须管理一些功能。Net 本身不支持,我不得不克服任何一个问题。我说的是管理非类型化数据(特别是在数据库映射和 GraphQL 中),拥有一个可插拔的架构并在其上嵌入一个模块化的 SPA。顺便说一下,当我试图用 Symfony 做同样的事情时,我发现它已经可以使用了。提到的每一个问题都是框架中包含的一个特性,所以我只需要把事情放在一起,而不是发明任何东西。为这项工作选择错误的工具是我的第一个错误。

坚持下去是邪恶的

犯错是人之常情,但坚持犯错却是恶魔之举!当我试图让事情运转起来时,我以自己的代价学到了这一点。这对我来说是一个巨大的教训。在巨大的困难面前,放弃并不总是一种软弱,有时也是聪明的证明。我没有在困难面前止步,我战胜了野兽,但是后来呢?完成这项工作的成本是巨大的,这意味着大量的时间和的努力毫无意义,除了一次美妙的经历和能力,让我(虚拟地)周游世界讲述我的故事。

我在这里学到的是,我们从来没有在一个问题面前投降,但当你是世界上唯一一个面对这种复杂性的人…

问问你自己问题出在哪里,是你自己还是你正在解决的事情?

在源代码之前传播愿景

我在这个项目中遇到的另一个大问题是,参与这个项目的学习曲线非常长。这对我来说非常痛苦,因为我必须花很多时间帮助贡献者建立他们的环境,理解如何实现任务,并在实现过程中帮助他们。问题是,在大多数情况下,他们不知道自己在做什么。他们大多是年轻开发人员学生,面对所有这些复杂性,他们迷失了方向。他们可能也不会理解为什么他们被要求做任何改变,最终的结果是很多第一次贡献者,我花了很多时间来介绍这个项目,但只完成了几个小任务。如果我们有一个更简单的系统,基于像 Symphony 这样的流行框架,并有一个他们可以找到答案的社区,这种情况就不会发生。所以,我从这个项目中学到的是分享你的愿景,并很好地解释项目的目标是什么。有贡献者是很好的,但是如果他们不能提供帮助,这个项目将会留在你的肩上,你工作的唯一成果就是培训人们去做一些他们很快就会放弃的事情。

带什么回家

为开源世界做贡献对我来说仍然很美好。想到我在 RawCMS 项目上浪费的时间,我一点也不觉得这是浪费。如果我想到切实的结果,是的,它是失败的。我花了很多时间,我只有一个没有用户的半工作项目。我没有赚到钱,也没有人对我所做的表示感谢。

这似乎是失败者的游戏,但我认为不是。我仍然相信开源贡献的价值。

我从这次经历中获得的真正价值是:

  • 学到了新的东西(非常前沿的话题),这将使我作为专业人士更有价值
  • 我被邀请参加许多国际会议来解释我所学到的东西
  • 帮助您的开发人员开始他们的开发之旅
  • 我遇到了很多像我一样相信开源精神的伟大的人
  • 回馈社会

嗯,看着所有这些无形的结果,我真的很高兴浪费了两年的业余时间来创建一个失败的项目!

参考

  • RawCMS,失败的项目,https://github.com/arduosoft/RawCMS
  • 养蜂场,用交响乐做的新项目,【https://github.com/zeppaman/api-farm
  • 我作为开源爱好者对开源的愿景https://better programming . pub/from-open-source-to-open mind-cb61ce 05593 a

我是如何从学术顾问变成数据分析师的

原文:https://towardsdatascience.com/how-i-went-from-an-academic-advisor-to-a-data-analyst-e7a50742fe2?source=collection_archive---------29-----------------------

从大学零数学课到数据科学职业生涯

安德鲁·尼尔在 Unsplash 上拍照

有时候有人问我,我是如何从学术咨询职业转向数据分析的。在这篇文章中,我解释了我的职业生涯和数据之旅——包括我寻找的机会和我偶然发现的机会。

编程开端

在过去的几周里,我一直在反思我是如何开始这个编程和数据分析师之旅的,以及我选择学习的工具和原因。在我开始概述这篇博文之前,我认为我在 2017 年首次编写了任何东西。但是现在,我回忆起 2015 年的时候,我涉足了一些编程。我甚至不记得我用的是哪种语言(可能是 Java),只记得是通过一个自我指导的在线程序。我知道我想获得技术技能,但不知道我最终想如何应用这些技能,我相信我的编程工作只持续了几周到几个月。虽然我不太记得当时我为什么放弃了编程,但我可以想象如果我的工作成果不与具体的项目或目标相关联,我将很难继续下去。在那个时候,学习的结果与任何具体的东西都没有联系——只是与我想编程的短暂想法有联系。当我还是一名学术顾问的时候,这种“想要编程的事情”就发生了。经过几年的学术咨询和一两年成为程序员的渴望,我被提升为项目协调员。

由奥莱娜·谢尔坚科在 Unsplash 拍摄的照片

攻读数据分析学位

当我在 2015 年开始担任项目协调员时,我确实发展了一些技术数据技能——主要是使用 Excel 作为我的工具。我学了不同的 Excel 函数。我学习了数据透视表。虽然我仍然讨厌在 Excel 中创建可视化效果,但我也学会了如何创建它们。我最终参与的数据团队举办了几次 Excel 研讨会,我也参加了。尽管我所做的项目协调员工作不需要统计数据,但在给出一些令人信服的理由说明这些技能最终会对我的部门有用后,我被允许使用一些专业发展基金参加为期一周的统计会议。

但是,即使在学习和应用某些基本技术技能以及获得统计学概念的简短介绍(或再介绍)时,我知道我只是触及了我能从数据中做什么和学到什么的皮毛。我在 2017 年开始了一个统计证书项目,希望学习我在数据职业生涯中需要学习的东西。我最初的目标是完成应用统计学的四门课程证书。我的目标是每学期上一门课,慢慢地完成我的课程。对我来说重要的是,我可以保持我的常规爱好,并保持我的大部分日常事务不变。我的新课程必须适应我的生活,我不想做太多事情来适应我的课程生活。为了实现这一点,对我来说很重要的是,该计划是在线的,但在这种交付模式下有着稳固的声誉。

当我三门课程进入四门课程证书时,我觉得我有了这个伟大的工作-生活-学校平衡,我想继续学习。我计算了在数据领域获得硕士学位的潜在投资回报率,并决定继续攻读更高的学位——仍然每学期只上一门课(这是我做过的最好的事情!).当我选择研究生学位时,我有两个项目可以选择,我的证书课程可以转到:统计学硕士或数据分析硕士。我决定攻读数据分析硕士学位有两个主要原因。数据分析选项侧重于商业环境中的数据,包括预测分析和数据挖掘;这就是我感兴趣的。此外,从实践的角度来看,对于统计学项目,我必须修三门微积分课程。说白了就是‘不’和‘谢谢’。我记得在高中,在微积分预科之后,我可以选择微积分或者统计学,我选择了统计学。我也相信,是的,我本可以上三门微积分课,并且学得很好,因为我现在知道了我在高中时不知道的事情——我不能简单地通过潜移默化来学习东西,如果有些事情不容易,并不意味着那件事情不适合我。但尽管如此,我还是不想上三门微积分课,那样会耽误我拿到学位。

在 Unsplash 上由 Carlos Muza 拍摄的照片

我的第一份数据分析师工作

在这些分析课程中,我使用了各种工具——包括 Minitab、SAS、KNIME 和我心爱的 r。虽然我使用了各种工具,但我只是触及了它们有用性的皮毛。直到我被提升为公司的数据分析师,我才开始深入了解一些技术工具,主要是 R 和 SQL。

事后看来,我组建团队的时机非常好。在我加入之前,该团队仅使用商业智能来提取数据。然而,在我加入团队前不久,我获得了直接从 SQL 数据库中提取数据的许可。该团队最近使用了这个数据库,这意味着可以访问比商业智能工具更多的数据。团队也是第一次学习 SQL。此外,该团队过去主要使用 SAS,但最近雇佣了一个懂 Python 的人,发现他们并不真正关心我们使用哪种编程语言或工具——至少对于特别分析来说是这样。所以我可以自由地使用 R——我已经在程序中熟悉了它——并乐于学习 SQL——除了 SELECT、FROM 和 WHERE 之外,我对 SQL 一无所知。

和我一起工作的数据团队非常棒,他们专注于打造一个强大的团队。和我一起工作的团队的第一个主管会问我,“你有什么想做的吗?”回答了这个问题,我开始了文本分析,在一些重要的,但以前从未涉及的定性数据中寻找主题。我从未从事过分析文本的工作,即使我把它作为一个项目提出来,但我从整洁的角度从整洁的文本挖掘中学到了文本分析。我从团队中一位更资深的成员对我的第一个数据项目的具体反馈中学到了如何讲述一个数据故事。我有机会自动化一些以前的手动流程。我也有机会管理一个出色的实习生。在管理实习生的过程中,我必须学会如何管理一个项目和一个人,让项目保持在一定范围内并向前发展。而且,通过阅读我的实习生的代码和我们互相交流想法,我学到了更多的技术技巧和选择。和我的实习生一起,我建立了一个预测模型。

随着时间的推移,我们作为一个数据团队在使用 SQL 方面变得更加成熟。我们开始创建有意义的 SQL 视图,这些视图可以连接到我们面向最终用户的商业智能工具。这些视图通常用于运营和跟踪关键指标。我们开始召开关于数据质量的会议,开发代码标准和代码库。我们通过午餐和学习非正式和正式地分享知识。

由 Charles Deluvio 在 Unsplash 上拍摄的照片

自我导向学习

但是我也喜欢在业余时间学习。我参加了关于 R 和 SQL 的免费和便宜的在线自学课程。我看了教程。我不怕尝试。当我想不通的时候,我不认为我是一个失败者。嗯,有时候我可能确实认为自己是个失败者,但我坚持下来了。我要么找到一种不同的方法来做某事,要么阅读文档,要么在第二天早上神奇地修复它(如果可能的话,不要在午夜之后编码)。不管那是什么东西,最终能工作是一件非常愉快的事情。当我终于让我的第一个 R 闪亮仪表板开始工作时,凌晨 1 点我的客厅里一片欢腾。

四年后我获得了数据分析硕士学位。不久之后,我开始在 GitHub 上建立自己的个人项目组合,这样我就可以展示我在预测分析和使用代码提高效率方面的技能。

新工作和新知识

也许,部分是因为我在 GitHub 上的项目,我发现自己在另一个伟大的数据团队中,一个优先考虑学习和知识共享的团队。现在我正在学习其他伟大的工具,包括 Python 和 dbt。我对数据工程有了更深的理解,对一个数据分析师来说,在软件开发原则的框架下工作意味着什么。我也在学习和欣赏预测的概率方法。我也被挑战去更多地检查我的假设,去思考我的想法可能是错误的。在一个全新的行业——医疗保健技术——我正在学习做好这份新工作的重要背景。

我最近的个人项目融合了我正在学习的东西,包括 Python、测试和预测的概率方法。

即使我“了解”R 和 SQL,我仍然会定期学习一些新东西。

照片由基兰伍德在 Unsplash 上拍摄

没有什么是神奇的/你可以学到任何东西

虽然我认为在我开始编码之前,我可能已经在智力上知道‘没有什么是神奇的’,甚至可能是它让我认为学习编程是可能的,但在过去三年多的时间里学习这些不同的编程语言和工具让我从骨子里相信了这一点。我知道我并不总是相信我能学到任何东西。但我现在知道,如果我读足够多的书或看足够多的教程,那么我就能知道一些东西。如果我阅读,参加会议,再阅读同样的东西,那么我会知道得更多一点。因为没有什么是魔法。是的,如果我想学东西,我可以,因为我可以学任何东西。而且,如果你想学点什么,那么你可以学,因为你也可以学任何东西。

我已经提到了各种工具,任何看我的 Twitter 的人都会知道我对 R 的热爱根深蒂固。我确实认为与其他语言相比,这门语言有一些非常优雅的地方;例如,比起熊猫,我更喜欢 dplyr 套餐。然而,我相信所有的语言都有各自的长处和短处。不过,我最喜欢 R 的地方与语言本身无关。我喜欢 R 的热情社区,我相信 RStudio 的开发者为社区和语言的发展指明了方向,这是其他语言社区所缺乏的。也就是说,客观地说,了解 Python 可能会打开更多的职业机会——尽管我认为这取决于你在寻找什么类型的数据工作。

我认为建立和了解好的编程原则是对时间的最好利用,即使你并不总是在盛怒之下应用每一个原则。我认为 Python 的禅很好地确立了这些原则,并且适用于大多数语言。

如果你订阅了语言相对论,用某种语言说话或编程可能会让你以某种方式思考。想象一下,你可以用 R、Python 和 Julia(或其他语言)来解决一个问题。这创造了灵活性,并可能在解决问题的过程中培养一些创造力。事实是,就工具而言,特别是就 R 或 Python 而言,如果你幸运的话,最终可能会是 R、Python 和 SQL。

所以,如果你曾经想知道一个人如何从学术顾问变成数据分析师和数据开发员,这就是我如何做到的。

原载于 2021 年 5 月 8 日https://Whitney Michelle . netlify . app

我是如何从一名销售工程师成为深度学习/计算机视觉研究工程师的

原文:https://towardsdatascience.com/how-i-went-from-being-a-sales-engineer-to-deep-learning-computer-vision-research-engineer-8882272a1a6?source=collection_archive---------6-----------------------

当我的职业生涯转向 DL/ML/CV 时,我希望得到的指导、提示和建议。

亚历山大·奈特在 Unsplash 上拍照

随着当前深度学习/机器学习的热潮,越来越多的人希望改变自己的领域,进入这个令人兴奋的领域。然而,对于任何不是来自这个领域的人来说,迈出第一步都是令人畏惧的。这就是为什么我想分享我作为深度学习/计算机视觉研究工程师从西门子医疗保健公司的大客户经理到成为辉固全球创新团队一员的历程。我先简单介绍一下我自己的背景,然后是我走到这一步的步骤。如果您想滚动并跳到您感兴趣的部分,下面是目录。

  • 介绍
  • 我从技术销售角色中学到的前 5 点
  • 硕士学位是转行的踏脚石
  • 编码/编程熟练程度
  • 学习触摸打字[可选但推荐]
  • 获取知识的在线大学课程或 MOOCs
  • 想获得一些实践经验
  • 谷歌 Colab 训练你的模型
  • 深度学习(计算机视觉)的库很少
  • 求职技巧
    ♀简历
    ♀LinkedIn
    ♀弥补经验差距
    ♀求职门户
    ♀直接在公司网站上申请
  • 结论

介绍

我在孟买大学获得了电子和电信工程学士学位。我是一个懂技术的人,热爱技术。在那些日子里,我对嵌入式系统充满热情,并与微控制器、传感器和致动器一起工作来构建东西。创建我自己的印刷电路板,焊接元件,编程控制器,与计算机接口等。对我来说超级刺激。我创建了一个关于微控制器和电子的博客,并且喜欢写关于概念和项目的技术文章。

毕业后很想加入行业做技术专业,做研发。然而,我没有在校园安置之外寻找工作。我得到了 TCS 的一份工作,但作为一家梦想中的公司,我得到了参加西门子校园招聘的机会。我设法通过了面试。虽然我已经表明我想做 R&D,他们没有为这种情况招聘。我得到了一份毕业实习工程师的工作,并接受了。它表示,最终发布将基于业务需求。

这个角色是一个技术销售角色,我完全惊呆了,因为我做梦都没想到会是这样。我仍然收到了 TCS 的邀请,并在考虑转行。然而,我最终还是加入了西门子。我必须说,事实证明这是一个好决定。这段经历让我在职业和个人方面都有所成长。我觉得每个人在职业生涯中都应该重点关注这五点。

我从技术销售角色中学到的前 5 点

  1. 软技能比你想象的更重要。口头和书面沟通技巧同等重要。你可能是个天才,但除非你能把自己的想法连贯地传达给人们,否则成功将极具挑战性。(这就是现实。)
  2. **无论你是哪个领域的专家。**无论你属于哪一个垂直领域,无论是商业、工程、研究还是任何其他领域,精通和了解你的工作都会让你脱颖而出。对你所做的事情充满激情在这里大放异彩,因为它让你在享受旅程的同时提升自己的技能。
  3. 不要害怕说出你的想法。如果你有想法,就说出来吧。
  4. 准时、尊重、专业和礼貌。
  5. 建立联系,拓展人脉。这是成长为专业人士的精髓。

尽管在一家很好的跨国公司有一份稳定的工作,我仍然渴望从事技术工作。我对机器学习很着迷,在 Coursera 上学习吴恩达的 ML 课程,同时学习诊断成像技术是如何工作的,这是我工作的一部分!我认为 masters 是运营商变革的逻辑路径。

硕士学位是转行的踏脚石

这是一个非常受欢迎的选择,全球各地的人都选择(我也选择)改变职业生涯,并转移到一个新的国家,那里有更多的机会。但是,在执行此操作时要非常小心。如果你刚刚完成本科课程,我建议你在攻读硕士学位之前先获得 1 到 2 年的软件开发经验,因为这会让找工作变得容易一些。和软件开发经验将有助于你了解这个行业是如何运作的。我在滑铁卢大学获得了硕士学位,因为那里的创新、研究和创业精神。你应该记住的几件事如下。

  • 不要以为你有一个硕士或硕士学位,公司就会蜂拥而至。

  • 至少在 DL/CV/ML 领域,试着做一个基于论文的硕士而不是一个基于正常项目/课程的硕士,因为这将允许你从事一个大项目。你在论文工作期间获得的经验远胜于任何课程项目(几乎在所有情况下)。**大学会支付你学习的费用。如果你要搬到一个新的国家,货币兑换可能会减少你的存款,你可能没有足够的资金,基于论文的硕士学位是你的带薪学习机会。据我所知,所有的 MASc 项目都是在加拿大资助的。这里列出了加拿大的一些实验室/教授(排名不分先后),你可以在决定攻读硕士学位时参考一下。

    【https://uwaterloo.ca/vision-image-processing-lab/】
    https://mila.quebec/en/
    https://www.trailab.utias.utoronto.ca/
    https://uwaterloo . ca/autonomous-vehicle-research-intelligence-lab/
    https://kimialab.uwaterloo.ca/kimia/
    https://www.cs.utoronto.ca/~fidler/
    https://www.gwtaylor.ca/**

  • 当你在攻读硕士学位时,请确保为你所学的每一门课程做一个项目。并且确保您正确地记录了它,并将其与代码一起放在您的 GitHub 个人资料中。如果您没有 GitHub 帐户,请立即创建。这就是公司寻找的东西。因为在见你之前或者在给你在线测试之前,它是你编程能力的一个很好的指示器。这些带有相应 GitHub 库的项目将会很好地融入你的简历,让你印象深刻。

  • 不要因为想要好成绩就去上简单的课程。参加你觉得与毕业后想做的工作相关的课程。挑战性的课程会让你有机会在有限的时间内成长和学到很多东西,这是我们在攻读硕士学位时获得的。舒适区里长不出什么有用的东西。

  • **在会议或期刊上发表关于你工作的论文。(不要求,但是如果可以的话请做。)**你可以先在 arXiv 上发布。因为如果你的作品很好,人们会开始引用你,你会利用这段时间直到出版。(注意:一些会议/期刊不接受在 arXiv 中发表的论文,因此请确保您事先了解您的目标出版物。)

编码/编程熟练程度

如果你想进入软件世界,编程技能是至关重要的。你需要精通解决编码挑战,因为每个公司都会扔给你一个。如果你是学生,你需要在毕业前的一个学期把你的数据结构和算法整理好。开始在竞争性编码网站上解决日常问题(下面列出了几个)。

事情就是这样。你需要能够在 windows 记事本或谷歌文档、白板上解决编码难题,并能够在整个面试过程中大声思考和有效沟通。这个步骤本身就有专门的书籍。因此,我不打算在本文中介绍如何做到这一点,因为这超出了它的范围。

通常,编程语言是你的选择,但是如果你的角色要求你必须精通某种语言,比如 C++,你将被要求用那种语言编程。

这一步需要时间、耐心、奉献、承诺、毅力和动力。请从今天开始,给自己一个良好的开端。

以下是一些你可以用来准备的资源。

  1. 破解编码采访
  2. https://www.hackerrank.com/——这是初学者友好型的。
  3. https://leetcode.com/—对 FAANG(脸书、亚马逊、苹果、网飞和谷歌)是强制性的
  4. 面向极客的计算机科学门户网站
  5. 技术招聘的编码测试和评估|编码信号
  6. https://www . coursera . org/specializations/data-structures-algorithms
  7. https://www.codechef.com/
  8. 【https://github.com/qiyuangong/leetcode 【LeetCode Python 解决方案】
  9. https://github.com/haoel/leetcode[leet code c++解决方案]
  10. https://github.com/keon/algorithms【各种算法的 Python 实现】

学习触摸打字[可选但推荐]

如果你用笔记本电脑或计算机工作,你将不得不使用键盘。这种技能可以让你专注于内容而不是敲击键盘,从而让你的生活变得更加轻松。如果你在打字时不必寻找按键,你将能够更快地编码。有几个这样的网站,但我将分享几个我自己用过的。

  1. https://www.typingclub.com/——学习触摸打字的绝佳选择。
  2. https://10fastfingers.com/typing-test/english——获得速度
  3. http://keybr.com/——学习触摸打字
  4. http://typeracer.com/——获得速度

获取知识的在线大学课程或 MOOCs

网上有数不清的课程,你可能会在选择时感到困惑。然而,记住一个好的项目比在线课程更有价值。但是,为了开始,你需要初始知识。我建议使用以下资源,但还有很多。随意探索互联网。(排名不分先后。)

  1. https://www.coursera.org/specializations/deep-learning——我向任何想在深度学习领域开始职业生涯的人推荐这个专业。通过吴恩达,他很好地解释了事情。
  2. https://www.coursera.org/learn/machine-learning——如果你想了解机器学习。
  3. https://www.youtube.com/playlist?list = pl 3 fw 7 Lu 3 i5 j vhm 8 ljyj-zlfqr F3 EO 8 syv—如果你想利用深度学习打入计算机视觉。
  4. 【https://atcold.github.io/pytorch-Deep-Learning/ —深度学习 NYU 课程(乐村)
  5. 【https://www.youtube.com/playlist? list = ploromvodv 4 rohcuxmzknm 7j 3 fvwbby 42 z—如果你想了解 NLP
  6. https://keras.io/examples/——如果你想从 Keras 开始,直接举例。快速原型化并了解不同的算法。**然而,请注意,由于其抽象程度,它在行业中(tf1 时代)是不被认可的。**一定要对至少 TensorFlow 或 PyTorch 感到舒服。
  7. https://py torch . org/tutorials/初学者/py torch _ with _ examples . html—py torch 的牛逼教程,他们官网还有很多。

这个列表可以一直列下去,GitHub 上有很多列表,这只是给你一些初步的指导。请记住,一旦你完成一门课程,就要自己建立一些项目或处理一些数据集。那是唯一有效的主动学习的方法。

想获得一些实践经验

https://www.kaggle.com/是一个将你新获得的深度学习技能应用于实际数据集的绝佳平台。有几种挑战可供你尝试并获得实践经验。您可以在内核上运行代码,这样您就不会受到硬件的限制。

谷歌 Colab 训练你的模型

训练深度学习模型需要 GPU,而https://colab.research.google.com/notebooks/intro.ipynb是一个获得免费计算资源的非常好的地方。你可以免费使用 GPU 和 TPU 内核。

深度学习(计算机视觉)的库很少

如果你想在这个领域工作,这些是你需要精通的典型库。

  1. https://pytorch.org/—深度学习
  2. https://www.tensorflow.org/—深度学习
  3. https://numpy.org/—使用矩阵的数值计算
  4. https://opencv-python-tutro als . readthedocs . io/en/latest/py _ tutorials/py _ tutorials . html—图像处理与计算机视觉
  5. 【https://pandas.pydata.org/】T4—处理表格数据
  6. https://matplotlib.org/——制作图表
  7. https://scikit-learn.org/stable/—机器学习算法

现在让我们假设你已经完成了上面所有的步骤,并准备去市场。下一步是找工作,这可能会让人望而生畏。由于我从销售角色转换到了研究工程师角色,我想我应该与你分享一些技巧。

求职技巧

如果你是一名新毕业生,这一步可能会感觉有点奇怪,因为你可能不知道它是如何工作的。概括地说,这将是以下几个方面。

  1. 获取知识,做项目,编码实践,通过实习,黑客马拉松,自由职业,为开源项目做贡献来获取经验。
  2. 打造你的简历
  3. 开始通过 LinkedIn 等在线门户网站搜索工作,并在线申请
  4. 一旦你接到电话,有几个步骤:(为了更深入的解释,我鼓励你阅读《破解编码面试》一书。)
    ·介绍/筛选电话——这将由人力资源部门来了解你。在这一步之后,您可能会遇到一个编码挑战。
    ·技术筛选——通常是编码挑战。可以离线、在线、随叫随到。
    ·技术面试——与技术团队的面试。可以是多轮。人力资源面试——与人力资源的最后一次面试。没有什么技术性的,只是交谈。薪资谈判到此结束。
    ·签署要约并加入!:)

让我们来看看我希望大家关注的几点。

简历

我怎么强调你简历的重要性都不为过。这是你得到面试电话的原因。请花些时间打造一份高质量的简历。写简历时需要考虑的几件事。(同样,网上有大量的文章告诉你怎么做。我只是给出最初的指导)

1.确保你绝对不要在简历中仅仅在你的经历部分陈述职位描述。

2.在你的经历描述中使用行动词汇、衡量标准和结果。类似于“我在项目 X 中做了这件事,导致 y%相对于度量标准 z 的直接改进,”提及你做了什么。不要写这是我们做的,写你的贡献。

3.请确保你的简历中没有错别字(有时我们会忘记基础)格式正确,字体大小易读。

4.我不知道业界对简历的长度有什么共识,但我遵循了 1 页的限制,采用了两栏的格式。

5.清楚地解释你的项目。保持简短,足以激发兴趣。一旦你和公司谈好了,就可以做详细的解释。

6.提供一个链接,链接到你的 LinkedIn、GitHub 个人资料以及你拥有的任何其他作品集、博客或网站。

我用过这个 LaTeX 模板:https://www . over leaf . com/LaTeX/templates/deedy-cv/bjryvfsjdyxz。随意使用 Word 或任何你觉得舒服的东西。

我分享我的简历以供参考,它给我带来了来自高通、AMD、华为和其他几家公司的电话。(我不是说这是一份模范简历。)

来源:作者

商务化人际关系网

请今天创建一个https://www.linkedin.com/个人资料,如果你还没有的话。这是非常重要的一步。正确填写您的个人资料。搜索如何制作一个令人印象深刻的 LinkedIn 个人资料,并让你的个人资料令人敬畏。并且开始联系你所在行业的人。对于乔布斯,我大量使用 LinkedIn。也许我可以成为你的第一个联系人?(我的 LinkedIn 个人资料

你可以直接在 LinkedIn 上联系人事经理、招聘经理或团队领导。不是每个人都会回复,但是觉得你的简介有趣的人一定会回复。不要低估这一步的力量。如果你发现一个招聘信息,就去找这家公司,找到潜在的招聘经理,然后和他谈谈。这是让你的个人资料受到关注的好方法。这表明你很感兴趣,并且付出了额外的努力。

不要害怕被拒绝,因为成功就在后面。为了找到适合我的工作,我已经参加了将近 15 次面试(也被拒绝了很多次)。所以继续努力吧!你能行的!

弥补缺乏经验的差距

你可能会想,如果我没有任何经验,我该如何开始呢?你可以采取以下步骤来获得经验。

  1. 实习:带薪(由你去实习[我猜这是在印度]或给你做实习)或不带薪,可以帮助你获得行业经验。下面是一个列表,你可能会找到一个。

    https://www . Forbes . com/sites/susanadams/2015/01/30/the-10-best-websites-for-finding-an-interstitution/?sh=25e96e8d1b44

  2. 参加黑客马拉松:这是获得经验、参与项目并有可能赢得奖金的好方法。有可能你会遇到赞助商的人并获得面试机会。
    https://mlh.io/seasons/na-2020/events

  3. 为开源项目做贡献:
    https://github . com/freeCodeCamp/how-to-contribute-to-open-source

  4. 自由职业者:
    https://www.upwork.com/

  5. 找写着新人/初学者的角色。如果你有另一个领域的经验,换个工作,你很可能需要重新开始。

工作门户

除了 LinkedIn 之外,这里还有几个门户网站可以帮助你找到工作。

  1. https://angel.co/jobs【创业公司】
  2. http://indeed.com/
  3. https://www.glassdoor.com/index.htm
  4. 【https://www.monster.com/】
  5. https://www.meetup.com/topics/job-search/

直接在公司网站上申请

所有公司都有职业页面。你可以直接在他们的网站上申请你感兴趣的职位。比如https://www.fugro.com/careers、https://careers.google.com/d/、https://www.amazon.jobs/en/等。

结论

我们已经大致了解了你可以向深度学习/机器学习领域进行职业转变的步骤。这里要记住的最重要的一点是,无论你想做什么,都要“相信自己,相信自己有能力在任何情况下取得成功”。继续朝着你的目标努力,每天都朝着目标前进。你会成功的!如果你需要指导,请随时联系 LinkedIn,我很乐意与你聊天。

我是如何赢得吴恩达首届以数据为中心的人工智能竞赛的

原文:https://towardsdatascience.com/how-i-won-andrew-ngs-very-first-data-centric-ai-competition-e02001268bda?source=collection_archive---------8-----------------------

“数据增强”技术最具创新奖

推特上的公告

介绍

在过去的几个月里,我有巨大的机会参加了吴恩达的首届以数据为中心的人工智能竞赛。我很高兴也很感激能分享我是如何因为我的“数据提升”技术获得最具创新性的奖项的。

这场竞赛确实是独一无二的,不同于传统的人工智能竞赛,因为它严格地专注于如何改进数据,而不是模型,根据我自己的经验,模型通常是改进人工智能系统的最佳方式。

鉴于开源机器学习模型库的丰富性(包括预先训练的深度学习模型),模型方面或多或少是大多数商业应用程序的已解决问题。我们需要的是新的工具和创新技术来系统地改进数据,Andrew 将其称为烹饪一顿饭的高质量原料(训练一个模型)。

这篇博文的其余部分将由三个主要部分组成:

  1. 比赛概述
  2. 我的“数据提升”技术解决方案
  3. 这项技术的动机以及它如何推广到不同的应用

比赛概述

在这个竞赛中,参与者被给予从 1 到 10 的手写罗马数字的~3K 图像,我们的任务是优化模型在罗马数字分类中的性能。我们还得到一本包含 52 幅图像的标签书,作为我们自己实验的小测试集。本标签簿不用于最终评估。

模型结构保持固定(截止 ResNet50)并训练 100 个时期,而模型权重基于验证集的准确性在时期中选择。

虽然模型和训练过程是固定的,但我们可以自由地改进数据集,改变训练和验证数据的分割。我们也可以添加新的图像,但提交必须少于训练和验证分裂的 10K 图像组合。

在提交我们改进的数据集后,参与者将根据一组隐藏的测试图像进行评估。

给定训练数据集中的示例

鉴于只允许少于 10K 图像的关键约束,参与者必须专注于在缺乏“大数据”的情况下获得“好数据”,根据 Andrew 的说法,这在更传统行业(例如,制造业、农业和医疗保健)的人工智能应用中非常常见。

点击此处了解竞赛规则的全部详情。

我的“数据提升”技术解决方案

在进入我的解决方案的关键之前,我做的第一件事是遵循修复标签和删除坏数据的常见做法。

为了简化这个工作流程,我编写了一个 Python 程序来评估一个给定的数据集(在将它输入到固定模型和训练过程中之后),并生成一个电子表格,其中包含每个图像的记录指标。

该电子表格包含每个图像的给定标签、预测标签(使用固定模型)和损失,这对于隔离不准确和边缘情况非常有用。下面的例子。

Python 生成的数据评估电子表格示例,用于简化以数据为中心的人工智能工作流

我最初使用这个电子表格来识别错误标记的图像和明显不是从 1 到 10 的罗马数字的图像(例如,在原始训练集中有一个心脏图像)。

现在来看一下**“数据增强”**技术。以下是高级步骤:

  1. 从训练数据中生成一个非常大的随机增强图像集(将这些图像视为“候选”图像源)。
  2. 训练初始模型并在验证集上进行预测。
  3. 使用另一个预训练模型从验证图像和增强图像中提取特征(也称为嵌入)。
  4. 对于每个错误分类的验证图像,使用提取的特征从增强图像集中检索最近的邻居(基于余弦相似性)。将这些最近邻增强图像添加到训练集中。我将把这个过程称为“数据提升”。
  5. 使用添加的增强图像重新训练模型,并在验证集上进行预测。
  6. 重复步骤 4-6,直到我们达到 10K 图像的极限。

参见下图中的迭代程序:

将来自训练集的增强图像作为来源的候选的“数据提升”过程

在上面的过程中需要注意一些事情:

  • 虽然我在这次比赛中使用了增强图像,但实际上我们可以使用任何大型图像集作为来源。
  • 我从训练集中生成了大约 100 万张随机增强图像,作为候选来源
  • 数据评估电子表格用于跟踪不准确性(错误分类的图像)和注释数据。或者,我也用 PostgreSQL 后端创建了一个 Label Studio 的实例,但是由于不必要的开销,我决定不在这次比赛中使用它。
  • 对于预训练的模型,我使用了在 ImageNet 上训练的 ResNet50。
  • 我使用了骚扰包来执行近似最近邻搜索。
  • 每个错误分类验证图像要检索的最近邻的数量是一个超参数。

从图像中提取特征的一个很酷的事情是,我们可以在 2D 用 UMAP 将它们可视化,以更好地理解训练和验证集的特征空间。在下面的可视化中,我们可以看到有趣的是,给定的训练数据分布与给定的验证数据不匹配。在特征空间的左下角有一个区域,我们没有验证图像。这表明,在运行上面的“数据提升”过程之前,有机会对训练和验证数据拆分进行重新洗牌。

由 ImageNet 上预训练的 ResNet50 提取的特征(又名嵌入)的 UMAP 2D 可视化

这项技术的动机以及它如何推广到不同的应用

举个例子,我的方法是由四件事激发和启发的:

  1. 我在的原创工作这篇博文来自 2019 年,在那里我通过从关键词标签中提取电影嵌入,并使用余弦相似性来找到彼此相似的电影,从而构建了一个电影推荐系统。
  2. 我之前使用预先训练的深度学习模型将图像表示为嵌入的经验。
  3. Andrej Karpathy 的演讲在 2019 年,他描述了如何有效地从特斯拉车队收集大量数据,并对其进行标记,以解决经常是边缘情况(分布的长尾)的不准确性。
  4. 我想开发一种以数据为中心的推进算法(类似于梯度推进),其中模型预测中的不准确性在每一步中通过自动获取与这些不准确性相似的数据来迭代解决。这就是为什么我称这种方法为“数据提升”。

当我最初考虑这种“数据提升”方法时,我需要弄清楚如何自动生成大量新的候选图像作为来源。我决定尝试随机扩充原始训练数据,以生成一大组扩充图像作为来源候选。

下一步,我利用预先训练的模型提取图像嵌入,用于计算图像之间的余弦相似性,以自动获取与验证集中错误分类的图像相似的增强图像。

这里,使用预训练模型进行一般特征提取是一种类型的迁移学习方法。我假设,通过以这种方式获取增强图像,我们可以提高模型从分布的长尾中学习模式的机会。正如 Andrej Karpathy 在 2019 年特斯拉自主日的演讲中所指出的:

“这都是关于长尾的”

幻灯片由安德烈·卡帕西

此外,由于比赛有 10K 图像的数据大小限制,这种“数据增强”方法是一种在给定限制的情况下确定哪些随机增强图像最好包括在训练集中的方法。

我可以看到这种技术被推广到机器学习的不同应用中,我们可以访问:

  1. 预训练模型,用于提取实体的嵌入内容(例如图像、文本文档)
  2. 可供选择的大量候选数据(例如,特斯拉车队、网络上的大量文本、合成数据)

例如,我可以想象将这种技术推广到文本分类,其中我们使用预先训练的转换器模型(例如 Bert)来提取文本的嵌入。然后,我们可以从特定领域的验证集中找到与不准确相似的文本(假设在线上有大量可用的语料库)。

展望未来

我希望这篇博文能说服你加入这场以数据为中心的人工智能运动。未来有许多令人兴奋的工作来推动人工智能的更广泛采用,我相信对人工智能系统数据管理的一致关注将使我们实现这一目标。

如有任何问题或希望合作,请随时联系我们。你可以在 LinkedIn 或者 Twitter 上找到我。

特别感谢传奇吴恩达发起本次比赛。

如果我必须重新开始,我将如何学习数据科学的 Python

原文:https://towardsdatascience.com/how-i-would-learn-python-for-data-science-if-i-had-to-start-over-83fc40ab93ba?source=collection_archive---------0-----------------------

入门

另外 3 个技巧可以帮助你避免犯同样的错误

由内森·齐曼斯基在 Unsplash 上拍摄的照片

我伸手去抓我的红牛又喝了一口。

我的眼睛因长时间盯着屏幕而布满血丝。

我筋疲力尽。但我必须这么做,我必须想清楚。

所以我翻了一页。

然后在我的笔记本上又写了几行。

‎….我又做了一次。

………………再来一遍。

…………………..再次。

我已经在悉尼科技大学 11 号楼黑暗的角落里坐了 9 个小时了。

我面前的 MacBook。

Python 速成班在我右边。

在 Chrome 中打开了大约 87 个不同的标签

拼命想掌握 Python。

我太想得到它了。我想快速地学习它(不可否认,比可能的实际速度要快)。

我在研究我的硕士学位,并试图在工作中给我的客户带来一些硕士学位。却不知道自己到底在做什么。谈到数据科学和 ML,要学的东西实在太多了,更不用说 Python 了。

一定有更好的方法。

不幸的是,那时候,我什么都不知道。

三年过去了,有很多事情我会用完全不同的方式去做。在那段时间里,我成功地建立了大量的模型,启动(和崩溃)了一家初创公司,并成为了 IBM 的一名数据科学家,与一些令人惊叹的客户一起工作。

但是我总是回想起我花在自学编程上的那些周末。现在回想起来,是的,这是值得的…但我本可以用更有效的方式去做。

这正是我今天想和你谈的。

如果我必须重新开始的话,我会再次使用这个策略来学习机器学习和数据科学的 Python。

如果你更喜欢视频,我还做了一个 5 小时左右的速成课程,把所有这些都浓缩下来,但请继续关注我,我希望我能分享一些金块。

我认为,在开始学习之前,有 3 个关键因素是很重要的。

首先是 CRUD。

1.了解 CRUD

来源:尼古拉斯·雷诺特

CRUD 代表创建、读取、更新和删除。这是一个通常与 SQL 联系在一起的概念。它指的是处理数据库记录所必需的核心操作。

然而!

同样的概念在编程时也很有用。如果你能理解如何用 Python 创建、读取、更新和删除一个对象,你就已经很好地理解了这个组件。我对此的唯一反对意见是,理解如何循环遍历组件也很重要,所以也许 CRUDL 是更好的初始化?我跑题了。

理解 CRUD 很重要,因为它为您应该能够应用于 Python 中的组件的操作奠定了基础。比方说,你想对列表应用 CRUD。

我们知道我们可以使用方括号中的序列创建列表。

# Creating a list
names = [‘neil armstrong’, ‘buzz aldrin’, ‘sally ride’, ‘yuri gagarin’, ‘elon musk’]

我们可以使用索引或打印功能阅读

# Printing a list
print(names)# Reading the first value
names[0]# Slicing a range
names[1:3]

为了让更新,你可以重新赋值,使用 insert 方法或者 append 方法。

# Update a single value
names[-1] = 'nicholas renotte'# Update by adding to the end of the list
names.append('elon musk')# Update by inserting at the start of the list
names.insert(0, 'richard branson')

最后但同样重要的是,它有助于理解如何删除

# Delete components from a list
**del** names[-2]

理解 CRUD 为您应该理解的每种数据类型的组件建立了一个心理框架。

2.习惯使用 Jupyter

当我刚开始用 Python 编程时,有很多 IDE 可供选择。但我希望我知道的一件事是,Jupyter 笔记本可能是开始时使用的最佳界面,尤其是在数据科学工作负载方面。

为什么?

它们为您提供了一个交互式环境来构建、探索和建模您的数据。我要大胆地说,没有什么比得上。还有其他选择,但 Jupyter 让它变得简单得可笑。

我发现为 Jupyter 提供一个稳定的操作环境的最简单的方法是使用 Anaconda 。

来源:Anaconda

Jupyter 也有很多风格,它们都提供了相似的工作界面,但也有一些优缺点。为了一个允许你使用 GPU 和 TPU 的免费环境。看看谷歌 Colab :

来源:谷歌

但是,当你最终得到那份甜蜜的数据科学工作时,也要做好灵活变通的准备。许多企业组织正在转向数据科学平台。我在日常工作中使用的是沃森工作室。

来源:IBM

3.在你认为自己准备好之前就开始做项目

太容易掉进教程陷阱了!

做辅导,一次又一次辅导,但从来没有真正开始做建筑材料。

我去过那里。你去过那里。我们都经历过!

打破常规的最好方法是开始用 Python 制作和打破东西。找一个简单到超出你技能范围的教程,试一试。

我一直想在无障碍领域做点什么,并决定在我的旅程中尽早尝试解决手语识别问题。

我觉得我还没到那一步。也就是说,处理超出你技能范围的事情会比其他任何事情都更有助于你加速!

好了,说够了“提示”。让我们来看本质。

你应该学什么?

下面的代码块突出显示了每个子主题的关键组件。在 YouTube 视频和这个 GitHub 报告中,它们都有大量的细节解释!

变量

将变量视为值和数据的占位符。它们使得在整个代码中重复引用可能需要的数据或值变得容易。

数据类型

Python 中有许多不同的数据类型。了解它们的属性有助于您 1)设置正确的数据类型,2)导航其属性,3)利用附加的方法。

条件和循环

条件是重要的,它们允许你运行你的数据通过门和检查,以确定值是否满足某些条件。循环帮助您遍历序列,以便您可以重复执行某些操作。

数学运算符

理解基本的数学运算符是很有用的,但是请注意,您会发现自己使用的许多常见的包(例如 Numpy 和 Pandas)也有本地数学运算符。

功能

将你的代码包装在一个函数中允许你将事情模块化,这意味着你不需要经常重写相同的代码。我发现自己写了很多函数,尤其是在数据预处理工作流方面。

班级

老实说,在我的日常工作中,我并不需要用到太多的类。然而,我发现在构建定制神经网络模型和层时,它们几乎无处不在,尤其是那些具有多个输入和预测头的模型和层。

模块和包

啊,模块和包。*这些允许你利用全世界 Python 开发者的集体智慧。*你会发现自己使用的一些最常见的包是请求、熊猫、 Numpy 、 Scikit-Learn 、 TensorFlow 和 NLTK 。

文件和错误处理

将数据写到磁盘或将数据保存到文件中尤其有用,尤其是在自然语言处理领域。错误处理在任何地方都很方便,尤其是在编写生产级代码的时候。

感谢阅读

仅此而已。

我祈祷你会发现这很有用,如果你有任何关于学习 DS、ML 或 DL 的建议,我很乐意听听!关键是开始,不要害怕迈出第一步。

我每周都会在我的 YouTube 频道上发布一些新的 ML 和 DS 内容,希望能和你们大家联系。

我如何克服对数学的恐惧来学习数据科学

原文:https://towardsdatascience.com/how-im-overcoming-my-fear-of-math-to-learn-data-science-b71838461c43?source=collection_archive---------9-----------------------

办公时间

恐惧不是不追求激情的理由,尤其是如果恐惧只是你的幻觉

照片由来自 Pexels 的山姆·里恩拍摄

作为一个高中数学不及格的人,我觉得自己特别有资格写这篇文章。

我对数据科学世界了解不多,直到我偶然发现了 Medium 并发现了《走向数据科学》出版物。从我读的第一篇文章开始,我就被迷住了。

数据科学将我所热爱的技术与科学、商业、医学、工程以及你能想到的任何其他领域结合在一起。作为一个试图进入环境咨询领域的人,我知道数据科学可能是我达成交易的箭筒中的一支箭。

我知道我至少要尝试一下数据科学。

然而,有一件事抑制了我的兴奋:对数学的深刻理解和/或自学高级微积分、线性代数和统计学的能力的要求。

正如我上面提到的,我高中数学不及格。我一开始就没有做好。

当我浏览列出成为一名数据科学家需要多少数学知识的文章时,我开始不知所措。一般来说,这些文章列出了微积分,微积分,多变量微积分,三角学,线性代数,微分方程和统计学。

关于我的一个奇怪的事实是,我并不是天生数学不好。我只是不擅长不实用或不实用的数学。出现在统计、物理、化学或微积分中的数学,我处理起来没有问题。老实说,我真的很擅长这个。但是涉及到更抽象的应用,比如数论和微分方程,我就搞砸了。

正因为如此,我害怕成为这位全能的数据科学家应该学习的数学。

直到我看到这篇文章:

https://www.sharpsightlabs.com/blog/math-for-data-science/

这个发现。

当我第一次读到这个标题时,我认为它是亵渎神明的。当时,我认为任何声称数据科学不需要太多数学知识的人只是在寻找那些 clickbait 视图。

这篇文章怎么可能宣扬与我读过的所有这些广受欢迎的文章完全相反的东西呢?我读到的一切都是错误的信息吗?

当我继续阅读这篇文章时,我注意到作者做了一个我读过的关于这个主题的任何其他文章都没有做的区分:理论数据科学和实践数据科学之间是有区别的。

简而言之,的文章解释了理论数据科学(通常由学者实践)与实践数据科学(通常由行业专业人士实践)之间的巨大差异。一般来说,学术界使用的数据科学比行业中使用的数据科学更注重数学。

虽然的作者承认,你需要的数学水平将取决于你作为数据科学家的资历水平(初级还是高级),但更有说服力的因素之一是你将在学术界还是工业界工作。当然,根据你将要进入的行业,你可能需要比其他行业更多的数学知识。然而,这种数学水平仍然比你在学术界工作时要低得多。

作者进一步解释了基础数据科学技能,包括数据操作、数据可视化和探索性数据分析,实际上并不需要太多数学知识。收集和清理数据并制作散点图或直方图的过程几乎不需要高级水平的数学,甚至可以使用你在高中学到的数学技能来完成(在作者看来)。

当谈到数据科学的基石之一机器学习时,作者解释了如何存在一种误解,即优秀的机器学习实践者必须对数学有高级的理解。这种误解是不真实的,因为作者描述了他个人知道的几位机器学习从业者没有受过高等数学培训,但仍然在苹果和美国银行等大公司工作。那些从业者在理论知识上的不足,通过他们应用数学技术的能力来弥补。

此外,与其他数据科学应用一样,您打算在上练习机器学习的设置也有所不同。在学术界或工业界工作将影响你创建成功的机器学习模型所需知道的数学量。

作者使用了阅读学术机器学习论文与查看由行业专业人士创建的机器学习模型的结果的例子。机器学习论文将包括大量的高级数学,而实际模型可能只涉及基本的统计学、线性代数和微积分——也就是你在大学本科阶段可能学到的数学水平。

通过大胆地声明数据科学和机器学习实践不需要多年密集的专业数学学习,作者为像我这样的后起之秀数据科学从业者敞开了大门,否则他们可能会因为害怕数学而另眼相看。

那么,要开始学习并成为一名称职的数据科学家,你实际上需要哪些数学技能呢?作者推荐了五个简单的数学领域,让你集中精力学习:

  1. 基本图表和图形。
  2. 功能。
  3. 基础代数。
  4. 基本统计。
  5. 基本数学符号。

对于有抱负的初级数据科学家来说,这个数学能力列表足以解决你将遇到的任何问题。我读过很多次有经验的数据科学家如何重视回归基础,使用最简单的解决方案来解决问题。这些简单的解决方案可能涉及使用 Excel 电子表格和一些简单的算法来产生结果。换句话说,并不是每个数据科学问题都需要微分方程、复杂的机器学习模型和人工智能。

这将如何改变我学习数据科学的方式。

回到 2020 年 12 月,我发表了一篇文章,强调了我在 2021 年学习数据科学的新年决心。在那篇文章中,我强调了我为自己创建的学习课程。当时,我对数据科学的理解是由顶级高级数据科学家撰写的文章推动的,这些文章包括数学能力的洗衣单,每个人如果想成为数据科学家,都应该知道这些能力。

现在,读完那篇文章后,我更倾向于重组我的课程,专注于更实用的技能,特别是描述性和推断性统计、基础微积分和基础数据科学能力。简而言之,我的课程中的数学部分看起来会更像这样:

数学

  • 有限数学
  • 描述和推断统计
  • 结石
  • 算法/技术:线性回归、逻辑回归、支持向量机、决策树、神经网络、正则化和主成分分析

此外,我将专注于直接学习不同的数据科学和机器学习算法。虽然知道为什么某样东西会起作用很重要,但我在过去的数学教育中也学到,只要理解某样东西如何起作用就可以了。因此,我不会陷入几个月的数学学习中,而是将重点放在如何使用特定的算法、何时使用它,以及它将产生的结果上。这种实用的数学学习方法将减少噪音,简化我对最重要细节的理解。在某个时候,是时候学习为什么要学习这个算法了,但是在那之前,我只要知道如何正确地应用这个算法就可以了。

基本上,我把我的注意力集中在最重要的概念上。我想专注于清理和操作数据、可视化数据以及执行探索性数据分析。通过专注于四项基础数据科学技能,我将在行业领域具有竞争力,不是作为一名数据科学家,而是作为一名能够应用数据科学原理解决问题的人。

最后的想法。

作为一个之前因为对数学能力缺乏信心而害怕从事专业的人,我觉得从各个角度看待任何学科都很重要。

就数据科学而言,每个人都如此痴迷于在“数据科学家”的头衔下工作,以至于他们试图学习复杂的数学,让自己陷入了痛苦的世界。事实上,大多数害怕数学但希望成为从业者的人应该更多地关注于学习该行业的实践方面,然后将其应用于“数据科学家”领域之外的角色。事实一次又一次地证明,学习技术技能的人会在工作中获得加薪,只是因为他们能够实际应用他们所学的知识,为公司带来好处。

因此,也许我们这些害怕数学的人的目标是成为数据科学的实践者,能够在我们给定的专业背景下清理、操作、可视化和分析数据的人,并且不必在我们无法经常理解的主题中经历数月的培训。通过了解数据科学的基本方面,我们可以产生影响,不管我们是否会微分方程。

朱莉娅如何完善多重派遣

原文:https://towardsdatascience.com/how-julia-perfected-multiple-dispatch-16675db772c2?source=collection_archive---------19-----------------------

让我们看看 Julia 语言是如何让多重调度变得完美的

(图片由作者提供)

介绍

虽然 Julia 编程语言是新的,而且不太受欢迎,但至少现在,这并不妨碍该语言取得一些相当惊人的成就。Julia 编程语言比许多用户或观众所理解的要独特得多,因为它有自己的范例。在我看来,这种范式棒极了,我真的爱上了编程语言中奇妙的类型系统和参数多态性。朱莉娅计算公司称这种模式为

“多种调度模式”

好吧,这不是最有创意的命名,但有很多很好的理由使用这种范式,以及随之而来的 Julia 编程语言。对我来说,多重分派是一种非常自然的编程方式,尤其是在科学计算方面。除此之外,这种语言还做了几件事情,使得多重分派比以前任何语言都要好。在我们进入多重分派之前,还有一件事;本文中的所有示例都来自我目前正在发布的一个包,它是一个面向对象的 DataFrames 包,在 Julia 中的 DataFrames.jl 和 Pandas.py 等选项之间架起了一座桥梁。如果您想了解更多关于这个包的信息,贡献或支持它(谢谢),您可以在这里查看这个包:

https://github.com/ChifiSource/OddFrames.jl

关于多重分派的更多信息

在我们讨论 Julia 语言全面扩展并与多重分派协同工作的伟大之处之前,让我们先来了解一下多重分派到底是什么。多重分派是一个通用的编程概念,最初是为了解决函数式编程范例中的一个问题而引入的。这个问题就是有太多的方法名,当方法不是我们正在处理的类型的私有方法时,我们必须对每种类型有一个单独的调用,即使这些函数做同样的事情。

例如,假设我们有自己的函数式编程语言,我们想得到一个可迭代数组的长度,我们可以调用:

length(array)

现在让我们假设我们也想获得字符串中字符的长度——因为函数式编程主要关注声明式编程,更重要的是——全局编程,我们只能有一个长度的定义。因为我们已经在阵列上使用了这个定义,所以我们需要更改这个函数的别名:

length_str(string)

不用说,在方法调用中指定要传递什么类型只是程序员、方法和类型之间一种单调乏味的交互。这就是多重调度的用武之地。对于多重分派,可以专门定义方法来处理所提供的参数类型,就像我们前面的例子一样:

length(array)
length(string)

我们需要做的就是将我们要写入的特定类型添加到我们的方法定义中,以便于实现这一点。如果你想更多地了解为什么多重派遣如此酷,以及关于这个主题的更多技术细节,我有一篇更详细的文章,你可以在这里阅读:

此外,那是两年前发表的——为什么。

单行定义

一行定义无疑使多重分派变得很方便。在 Julia 中,功能键是可选的。每当我们在别名后面加上括号时,Julia 就能看出我们在调用一个方法,例如

example()

如果我们运行这个函数,我们会得到与没有括号时相同的错误,但是会有一个堆栈跟踪,因为 Julia 编译器现在已经注意到我们不一定是在全局范围内工作,因为它已经评估出我们是在使用一个有自己范围的函数。这是一个有趣的区别,看看这个:

(图片由作者提供)

所有这些不仅可以在一行中快速创建函数,还可以在一行中更改函数调用。考虑 OddFrames.jl 中的以下示例,其中定义了将成为我们的类型的子代的函数:

head(x::Int64) = _head(labels, columns, coldata, x)head() = _head(labels, columns, coldata, 5)# Dropdrop(x) = _drop(x, columns)drop(x::Symbol) = _drop(x, labels, columns, coldata)drop(x::String) = _drop(Symbol(x), labels, columns, coldata)dropna() = _dropna(columns)dtype(x::Symbol) = typeof(coldata[findall(x->x == x, labels)[1]][1])dtype(x::Symbol, y::Type) = _dtype(columns[findall(x->x == x,labels)[1]], y)

在许多这样的例子中,我们看到论点从第一个到第二个定义发生了变化。在第一个实例中,我们将数据从类型提供给函数,同时提供值。在第二个实例中,我们为 x 提供了一个默认值,所以没有输入参数。这些例子的可贵之处在于,在我们实际提供它们之前,有些输入参数甚至需要更改。例如,考虑 dtype()函数。

dtype(x::Symbol) = typeof(coldata[findall(x->x == x, labels)[1]][1])

在这个例子中,如果我们简单地提供符号来获取数据类型,我们将会遇到一个巨大的问题。因为我们需要的符号不仅在不同的数据数组中,而且我们也不知道在哪个数组中!幸运的是,我们可以在一行中完成所有的编写工作,最终的代码看起来非常干净!

构造器

在 Julia 编程语言中,我最喜欢的多重分派实现可能是 dispatch。考虑我们的不可变 OddFrame 的构造函数(我选择它是因为它要短得多。)

struct ImmutableOddFrame <: AbstractOddFramelabels::Array{Symbol}columns::Array{Any}coldata::Array{Pair}head::Function

这就是所谓的外部构造函数。我们可以直接调用这个外部构造函数,返回的将始终是 ImmutableOddFrame 类型。但是,为了进行这样的调用,我们需要提供

  • 标签
  • 科尔达塔

全靠我们自己。我们到底该怎么做?特别是考虑到 head()是一个函数。为了使用这种类型,我们真的要编写自己的函数吗?当然不是。此外,这种类型内部的数据本质上只供实际模块以这种方式使用,而不是供最终用户使用。最终用户只需要提供一些更高级的声明性数据。例如,他们希望从中加载数据的文件的文件路径:

function OddFrame(file_path::String)# Labels/Columnsextensions = Dict("csv" => read_csv)extension = split(file_path, '.')[2]labels, columns = extensions[extension](file_path)

这都是通过分派完成的,内部构造函数和外部构造函数的调用本质上是相同的——只是传递的类型不同。不用说,这将构造函数带到了一个全新的水平!如果你想了解更多关于构造函数的知识,你可以阅读这篇文章或者观看这个视频:

结论

不用说,Julia 已经完全改变了游戏,不仅仅是在软件的多个调度应用程序的小得多的世界里,而且是在整个编程的世界里!多分派范式确实将多分派编程带到了一个全新的水平。随着构造者能力的提高,这一概念得到了极大的发展。从整篇文章来看,在这里影响最大的可能是构造函数。非常感谢你的阅读,它对我来说真的很重要!我希望这篇文章有意思,并让您对多分派范例有更多的了解——这太棒了!

知识图如何解决机器学习问题

原文:https://towardsdatascience.com/how-knowledge-graphs-solve-machine-learning-problems-d2f0da031cd5?source=collection_archive---------20-----------------------

人脑使用的概念和知识图是一样的,它的名字就是一个参照系

哈尔·盖特伍德在 Unsplash 上拍摄的照片

**数据表示和数据本身是成功设计和运行机器学习模型的主要前提。**作为基于人工智能的系统的输入的数据,例如非基于人工智能的系统的输入信号,通常与其他数据元素相关。不正确的数据收集和表示类似于从数据中提取错误的特征,这就是为什么 AI 项目作为一个产品没有达到成熟的状态。一个很好的例子是从自动驾驶汽车的各种传感器收集的数据,这些数据在时间或空间域中彼此相关,对这些数据的分析有助于更精确地预测人工智能组件中可能发生的事件。

什么是知识图?

图包含由边连接的节点,它是网络的可视化表示。图通过边来描述节点之间的关系。图形使网络形象化;例如,互联网是以用户计算机为节点,以网络协议交互为边的网络。另一个例子是像脸书这样的社交网络,其中节点是人,边是他们之间的友谊。

知识图以图形的形式表示知识。一个知识图使用一个图形结构的数据模型或拓扑来整合人工智能领域知识表示和推理中的数据。基于知识的人工智能( KBAI )有助于使人工智能算法的学习过程更加高效和有效。知识图通过收集信息并将其集成到图形化结构拓扑中来生成新知识。来自不同来源的所有数据被链接并呈现,以更快地解决一个新问题。

知识图的典型应用

像谷歌这样的搜索引擎是知识图表最常见的用途之一,它有一个知识引擎来回答你的问题或提供可能回答你的问题的链接。

另一个应用是像 Alexa 或 Siri 这样的对话式 AI,它回答你的问题比聊天机器人更高级,旨在回答特定的问题。

像 Linkedin 这样的社交网络将职业世界中不同属性的人或公司联系在一起。此类网络中节点的属性或能力会影响图中节点之间的关系。

知识图提供的新知识是什么?

一个知识图可以组合许多数据源;例如, KBpedia 是一个开源的知识图,结合了维基百科、维基数据等七个不同的数据源。知识图的一个重要属性是给出数据的上下文。将以某种方式相互关联的不同数据类型组合起来,并将其集成到一种表示形式中,可以为算法提供新的信息,从而做出更好的决策和预测。

**许多统计分析可以应用到知识图上,以发现新的有用信息。例如,找到图中最有影响力的节点会影响其他节点,是网络中的关键参与者。**许多分析的中心性,如“中间中心性”,它决定了网络中玩家将采取的最短路径,或“特征向量中心性”,它决定了连接到许多其他玩家的连接节点的程度,可以在知识图上进行调查。

视觉化的表现提供了对关系以及网络如何在知识图中发展的更好理解。可视化有助于分析图形中不同的聚类如何相互关联,以及图形如何在时域中发展。我们可以在时间域中跟踪图表演变背后的故事,如果有必要,采取正确的行动来影响图表。

JJ 英在 Unsplash 上拍照

知识图是机器学习模型训练过程中的一个重要因素

向数据添加上下文:

当我们提供应用程序需要的所有相关数据作为模型的输入时,机器学习模型的性能就会提高。给数据一个上下文作为知识图最重要的特征增加了提供给模型的收集数据的信息价值。仅仅给机器学习算法喂数据还不足以成就一个成熟的产品。自动驾驶项目中的许多要求只能通过人工智能解决方案来满足,因为人类的感知在自动驾驶汽车中不再可用。人工智能需要理解可靠感知算法的背景,而不仅仅是获得关于在很短时间内发生的单个场景的信息作为输入。

整合一切可用资源:

在谷歌引入知识图之前,搜索是基于字符串搜索算法的,这意味着你必须输入所有文本、数字和符号的组合才能找到你想要的结果。但是现在,谷歌搜索 AI 引擎根据你之前的搜索和知识图中可用和链接的有价值信息来预测你的需求。

知识融合:

为训练 AI 应用程序而收集的数据有不同的类型和存储格式。我们应该首先将同一上下文中彼此相关的各种数据集成到一个数据库中,以便以有意义的方式访问它。知识融合是强制性的,因为您有多个数据源,例如,合并两个数据元素,一个是布尔类型,另一个是文本。应用各种来源的数据对于理解人类智能至关重要。

参考帧:

**杰夫·霍金斯在他的书《一千个大脑》中介绍了一种新的人类智力理论;人类为周围的世界创造了一个参照系,并通过运动不断更新。这个理论完全符合知识图的概念。**人脑的行为就像一个知识图谱。人作出新的决定是从参考新大脑皮层中已经创建的知识图开始的。构建像人类一样有能力的智能的第一步是为 AI 系统提供正确的数据,并定期更新它作为人类的参考框架,以确保所需应用程序的所有相关数据的可用性。

**https://medium.com/@bhbenam/membership **

学习奖励功能是如何出错的

原文:https://towardsdatascience.com/how-learning-reward-functions-can-go-wrong-6e794e42f4fc?source=collection_archive---------16-----------------------

从人工智能安全的角度看强化学习主体学习奖励函数的风险

强化学习(RL)是人工智能最有前途的子领域之一,其应用范围从自动驾驶汽车到股票交易,不一而足。RL 方法的一个众所周知的弱点是,研究人员必须定义一个对应于代理目标的奖励函数。对于复杂的目标,这可能很难,错误的奖励不仅会导致糟糕的表现,还会导致不安全的行为。因此,从 Google 的 DeepMind over OpenAI 到斯坦福大学的 CHAI,各种组织都致力于将奖励功能作为学习过程的一部分,而不是在训练前指定的超参数。然而,仅仅因为学习了一个目标并不意味着它与人类的意图一致。

本文将总结一些目前关于奖励函数学习过程及其安全性的研究。我将首先回顾一下指定报酬函数的传统方法的已知风险和局限性。然后,我将简要介绍一些通过学习奖励函数来克服这些挑战的方法。随着这些预备工作的进行,我将讨论学习奖励函数是如何出错的,并解释学习奖励函数过程的理想属性,这些属性是由 FHI、MIRI 和 DeepMind 的研究人员在最近的工作中定义的。随后,我将把这样的过程称为“奖励学习过程”。

本文假设读者对强化学习有基本的了解。如果你是这个领域的新手,可以在 OpenAI 的 Spinning Up【1】上找到一个很好的介绍。

1.动机:规范游戏

特别是在机器学习和强化学习(RL)中,解决问题的典型工作流包括两个阶段。首先,程序员定义目标。然后,优化算法试图找到最佳可能的解决方案。在 RL 的情况下,目标和解决方案由奖励函数和策略给出。这种方法带来的风险是,目标的定义可能无法准确地捕捉人的意图。这可能会导致一个满足目标的人工智能系统以不良的方式行为,即使训练它的算法实现得完美无缺。在人工智能安全社区,这样的系统会被称为“错位”。

根据奖励函数得分很高但与程序员的意图不一致的代理行为通常被称为“规范游戏”[14]。规范博彩【9】有许多著名的例子。在的一个例子,OpenAI 的研究人员在关于摩托艇比赛的游戏《CoastRunners》上训练了一个 RL 代理。在一个错误指定奖励的教科书例子中,游戏不奖励沿着轨迹前进的代理人,而是奖励击中沿着轨迹布置的目标。代理人利用了这一点,找到了一种在不完成比赛的情况下达到目标的策略。

规范游戏不仅是性能问题,也是安全问题,因为模型误解人类意图是人工智能对齐问题的核心。

2.奖励学习

至少从 90 年代开始,随着逆向强化学习【15】的引入,研究人员已经在寻求更好的方法来指定目标。就像一般的人工智能研究一样,自 2010 年代初以来,人工智能研究正在经历复兴,对学习奖励功能的探索也是如此。最近获得大量关注的一大类方法利用了“人在回路中”的思想。潜在的想法很简单:评估观察到的行为是否正确(大概)比明确指出正确的行为看起来像什么更容易。因此,有理由预期,由人类对代理行为的评估比由奖励函数对代理行为的评估更不容易出错。此外,可以在训练过程中使用人的反馈来调整目标,而不是在训练过程之前且独立于训练过程的阶段中指定目标。

多个研究议程集中在这个想法的不同的、更具体的实现上。在 DeepMind 的奖励模型【13】研究方向中,目标采取奖励模型的形式。这个模型是用人工评估代理行为的监督学习来训练的。奖励模型的早期成功之一包括使用 900 条人类反馈训练一个代理做后空翻。

一个训练有素的代理人使用人类反馈和奖励模型做后空翻。来源:【2】

从长远来看,DeepMind 希望能够以一种迭代放大【7】的形式递归应用奖励模型。这个想法是重复使用在之前的迭代中训练过的模型和人类反馈来训练一个更好的模型。

其他研究调查了代理人和人类之间更复杂的相互作用。除了接收人类的反馈,代理可能被允许提问,或者人类可能展示期望的行为。允许这种互动的形式主义的一个例子是合作逆向强化学习【12】。这里的目标是一个奖励函数,关键是,只有人知道,而代理人不知道。反过来,人类被建模为环境的一部分,代理可以与它进行交互,以做出关于奖励的推断。代理保持一定程度的不安全感,这种不安全感只能通过与人类互动来降低。因此,代理人被激励采取减少不确定性的行动,如询问澄清性问题,避免可能伤害人类或导致低回报的鲁莽行动。

将所有这些研究方向与传统培训范式区分开来的因素是,不再有两个截然不同的阶段:首先指定目标,然后优化以解决它。相反,有各种各样的互动模式:对环境起作用的时期可能穿插着调整目标的行动,如提问或观察人类行为。柴创造了一个统称为“辅助游戏”的术语,用来描述允许这种交互模式的问题公式。

人工智能标准模型中的交互模式。来源:【10】

辅助游戏中可能的互动模式。来源:【10】

3.学习奖励函数的风险

当然,辅助游戏并不是解决人工智能定位问题的灵丹妙药。在 DeepMind 的《从人类偏好中学习》一文中,研究人员发现,智能体可能会学习只在人类观察者看来正确的行为。例如,一个应该学会抓住一个物体的智能体反而学会了把它的手臂放在相机和物体之间,这样它就看起来只是在抓住它【2】。

一个特工学会了看起来像是在抓一个物体。来源:【2】

研究人员通过添加视觉线索来帮助人类确定物体是否被抓住,从而解决了这个问题。然而,一般来说,代理人操纵他们的奖励学习过程的结果的可能性仍然是一个问题。问题归结为一个简单的事实,即代理人必须从它可以操纵的环境中推断出它的回报函数。正如人工智能安全研究员斯图亚特·阿姆斯特朗所说,将奖励功能作为学习过程的一部分是一个巨大的变化,类似于从“如果你不知道什么是对的,就在这个只读列表中查找”到“如果你不知道什么是对的,就在这个读写列表中查找”【5】。

我们如何更正式地推理奖励学习的风险?理想情况下,我们希望有一个通用的数学模型,用学习奖励函数的过程来扩展普通 RL 框架。幸运的是,这正是阿姆斯特朗等人在他们 2020 年的论文“在线学习奖励函数的陷阱”[3]中所做的。最简单的形式是,他们的形式主义将奖励学习过程建模为一个简单的函数,从行为和状态的历史到奖励函数的概率分布。换句话说,一个奖励学习过程给出了一个规则,通过这个规则,代理形成了它对正确的奖励函数的信念,给定了它已经采取的行动和迄今为止它已经观察到的关于环境的情况。阿姆斯特朗等人谈到“在线”学习,因为奖励功能是在学习策略的同时学习的,就像在援助博弈框架中一样,而不像传统的范式。利用他们的形式主义,他们得出了学习过程的两个重要性质:“可触发性”和“影响性”。

可装配性

可触发性的概念来自于我们不希望代理能够影响学习过程的结果。代理人影响学习过程的结果意味着什么,可以用“父母职业指导游戏”的例子来说明。在这个游戏中,代理人扮演一个决定走哪条职业道路的孩子的角色。要做到这一点,它可以要求它的母亲或父亲告诉它要么成为一名银行家或医生。有两个潜在的奖励函数:R[B]将奖励代理成为银行家,R[D]将奖励它成为医生。代理可以采取行动 M 询问母亲或 F 询问父亲。对于父母中的任何一方,环境决定了他们告诉代理人是医生(状态 D)还是银行家(状态 B)。反过来,这会使代理人采用相应的奖励函数。换句话说,历史 MD 和 FD 将使代理 100%确定 R[D]是正确的奖励函数,而历史 MB 和 FB 导致对 R[B]的 100%信任。如果代理人不能影响它对奖励函数的最终信念,这个博弈就是可触发的。然而,正如许多读者所注意到的那样,他们可能在孩童时期就有操纵父母的行为,但事实可能并非如此。作为一个简单的例子,考虑这样一种情况,即母亲总是回答 B,父亲总是回答 d。代理人的行动将导致对其奖励功能的不同最终信念。形式上,回报函数 R 的期望值取决于代理采取的行动 a:E[R | a = M]= R[B]和 E[R | a=F] = R[D]。对于可装配性,我们希望这种期望独立于代理的策略。

“职业指导”游戏中学习过程的可能结果。来源:作者生成

如果期望得到的奖励函数独立于代理的策略,那么奖励学习过程是不可触发的。

值得注意的是,奖励函数的期望值与代理人的信念有关。最终,代理人将根据其对奖励函数的信念采取行动。如果智能体不能将自己的信念推向 R[B]或 R[D],那么学习过程就是不可触发的。

但是不可质疑就足够了吗?一个主体能影响一个学习过程而不操纵他对奖励函数分布的最终信念吗?事实证明它可以,这就是为什么我们需要更强的不可波动性!

影响力

和以前一样,我将用一个例子来解释影响的概念。在“国际象棋游戏”中,一个代理人将学习下一盘棋,并且必须弄清楚它希望白棋还是黑棋赢。对于它的奖励函数,代理可以采用 R[W]或 R[B],分别奖励白棋和黑棋的胜利。通过投掷一枚偶数硬币来决定代理人站在哪一边。如果结果是正面(状态 H),则代理玩黑色,否则(状态 T)它玩白色。此外,在掷硬币之前,代理可以选择采取相反的行动 INV。如果它不采取相反的行动,那么在抛硬币之后,奖励函数就像人们所期望的那样:如果代理人出白牌,奖励函数为 R[W],如果代理人出黑牌,奖励函数为 R[B]。然而,如果它采取了相反的行动,那么奖励是反向的:代理人在玩黑色时将有奖励函数 R[W],反之亦然!只要我们假设硬币是偶数,这并不改变对奖励函数的期望:不管代理人是否拿了 INV,都有 50%的机会得到任一奖励函数。然而,采用 INV 将导致代理更容易满足的奖励函数,同时不会导致期望的行为。学习过程是可以影响的。

“棋局”的可能结果。来源:作者生成

如果代理人的行为对产生的奖励函数没有因果影响,奖励学习过程是不受影响的。奖励函数只取决于环境——取决于“世界上的事实”。

更正式地说,要使奖励学习过程不受影响,它必须以如下方式工作:主体对它所处的环境有初始信念(先验)。它还对奖励函数的形状有信念,这取决于它对环境的信念。给定历史,代理可以更新其关于环境的信念(产生后验分布)。这些更新的信念又可以用于计算关于奖励函数的更新的(后验)信念。因此,奖励函数不再是历史的直接函数,而是环境的函数。

从可触发到不可影响

显然,不可波动性和不可聚合性是奖励学习过程的理想属性。因此,很自然地要问它们是如何相关的,以及我们是否能从那些缺乏这些属性的过程中创造出不可影响或不可触发的过程。

幸运的是,这篇论文的一些主要结果是关于可触发过程和不可影响过程的关系。例如,他们证明了每个不可影响的偏好学习过程也是不可触发的。此外,一个不可触发的学习过程是否不可影响取决于它对进一步信息的反应【4】。

一个重要的结果是,通过使用反事实的方法,即使是可触发的学习过程也可以变得不受影响。例如,如果代理人的正确奖励是“一小时内在这张纸上写了什么”,那么这是有影响的:代理人本身可以在纸上写任何值。如果我们把奖励指定为“如果我们没有让你兴奋,一个小时内这张纸上会写些什么”,那么学习过程就变得不可影响。让一个人明白这是如何正式运作的并不是一件小事,我计划写一篇后续文章解释反事实方法的细节

不可流动性的极限

不可影响的学习过程可以总结为迫使主体真正了解外部世界。然而,这并不意味着使每个学习过程不受影响就解决了对齐问题。当设计一个学习过程时,你应该记住两个限制。

首先,仅仅因为一个学习过程不受影响并不意味着它是好的。举一个简单的例子,如果一个学习过程是恒定的,并且总是返回相同的回报函数,这将使它不受影响。此外,你可以对一个合理的不可影响的学习过程应用某些排列,从而获得一个仍然不可影响但远不如人意的学习过程。因此,如果“弄清楚人类想要什么并去做”是不可改变的,那么“弄清楚人类想要什么并做相反的事情”也是如此。

相反,学习过程可能是好的,但不可能不受影响。这就是对齐税的概念发挥作用的地方,它描述了在使人工智能安全和健壮以及经济竞争力之间的权衡。在尊重人工智能安全最佳实践的同时改进当前最先进的人工智能技术可能是不可行的。例如,任何涉及人类反馈的东西通常都是可触发的。这包括我们前面讨论的“人在循环中”的方法!那么,为什么我在不可挑战性和不可波动性上花了这么多时间,而这些概念似乎并不适用于奖励学习中一些最有前途的方法呢?这是因为即使我们可能永远无法实现学习过程的完全不受影响,这个概念也不是没有价值的。如果进一步的研究侧重于量化和控制操纵,这将有助于减少对准税,并使人工智能研究人员处于更好的位置,使他们的人工智能既有竞争力又安全。

[1]阿奇姆·乔希,RL 中的关键概念,OpenAI Spinning Up,2018,https://Spinning Up . open ai . com/en/latest/Spinning Up/RL _ intro . html

[2] Amodei 等人,从人类偏好中学习,OpenAi,2017 年 6 月 13 日,https://open ai . com/blog/deep-reinforcement-Learning-from-Human-Preferences/

[3] Armstrong 等人,在线学习奖励函数的陷阱,Arxiv,2020 年 4 月 28 日,https://arxiv.org/abs/2004.13654

[4]阿姆斯特朗·斯图尔特,为什么不可质疑几乎意味着不可影响,LessWrong,2021 年 4 月 9 日,https://www . less wrong . com/posts/lpjjwdbxr 88 gzcyk 2/learning-and-manipulating-learning

[5]阿姆斯特朗·斯图尔特,奖励函数学习:价值函数,LessWrong,2018 年 4 月 24 日,https://www . less wrong . com/posts/55 hjdq 5y 7 dv 3s 4h 49/Reward-function-Learning-The-value-function

[6]克里斯蒂安诺·保罗,保罗·克里斯蒂安诺:人工智能校准中的当前工作,有效利他主义论坛,2020 年 4 月 3 日,https://Forum . Effective al truism . org/posts/63 STB tw 3 waw 6k 45 dy/Paul-Christiano-Current-work-in-AI-alignment

[7] Christiano Paul & Amodei Dario,用迭代放大学习复杂目标【OpenAI.com ,2018 年 10 月 22 日,https://openai.com/blog/amplifying-ai-training/

[8] Clark Jack & Amodei Dario,野外的错误奖励功能,OpenAi.com,2016 年 12 月 21 日,https://openai.com/blog/faulty-reward-functions/

[9] Davidson Russel,规范 AI 中的游戏:主列表,https://Russell-Davidson . arts . mcgill . ca/e706/Gaming . examples . in . AI . html

[10]Flint Alex,我们对柴 1500 字以下研究议程的看法,AlignmentForum,2020 年 6 月 17 日,https://www . alignment forum . org/posts/qpoa 5a zsediva 4x ja/Our-take-on-CHAI-s-research-agenda-in-under-1500 字

[12]Arxiv.org,2016 年 6 月 9 日,https://arxiv.org/abs/1606.03137,哈德菲尔德-梅内尔·迪伦等,合作逆强化学习

[13]雷科 1 月,通过奖励建模的可扩展代理对齐,DeepMind 安全研究@Medium,2018 年 11 月 20 日,https://deepmindsafetyresearch . Medium . com/Scalable-agent-alignment-via-reward-modeling-BF 4 ab 06 DFD 84

[14] Krakovna 等人,*规范游戏:人工智能独创性的另一面,*DeepMind.com,2020 年 4 月 21 日https://deep mind . com/blog/article/Specification-gaming-the-flip-side of-AI-injury

[15] Russel Stuart,*逆向强化学习算法,*第十七届机器学习国际会议论文集,2000,https://ai.stanford.edu/~ang/papers/icml00-irl.pdf

线性回归的实际工作原理——理论和实现

原文:https://towardsdatascience.com/how-linear-regression-actually-works-theory-and-implementation-8d8dcae3222c?source=collection_archive---------33-----------------------

我们推导出最大似然估计并实现它

一条符合某些数据的直线,同时也显示了不确定性。图片作者。

内容

这篇文章是我将要发表的一系列文章的一部分。你可以通过点击这里在我的个人博客上阅读这篇文章的更详细版本。下面你可以看到该系列的概述。

1.机器学习导论

  • (一)什么是机器学习?
  • (b)机器学习中的模型选择
  • (c)维度的诅咒
  • (d)什么是贝叶斯推理?

2。回归

  • (a)线性回归的实际工作原理
  • (b)如何使用基函数和正则化改进您的线性回归

3.分类

  • (a)分类器概述
  • (b)二次判别分析(QDA)
  • (c)线性判别分析
  • (d)(高斯)朴素贝叶斯

设置和目标

在这篇文章中,我们将学习线性回归,这对于很多机器学习来说是必不可少的**,因此理解起来会非常有益。**

给定一个具有相应目标变量 tN 输入变量 x 的训练数据集,线性回归的目标是构造一个函数 h ( x ),该函数为 x 的新值产生 t 的预测值。

用于回归的最简单的线性模型被称为线性回归,其中的预测是由

第一项通常称为截距偏差参数,并允许 h 适应数据中的固定偏移。如果我们引入 1 作为每个输入变量 x 的第一个元素,我们可以用向量符号重写(1)

在本系列的第一篇文章中,我们回顾了带有一维输入变量的多项式回归。现在,我们只是做线性回归(不是多项式),但我们允许我们的输入变量是 D 维的,因此它成为一个向量,而不是一个标量。然而,为了直观起见,让我们坚持使用同一个示例数据集:

import numpy as npx = np.array([-1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1])
t = np.array([-4.9, -3.5, -2.8, 0.8, 0.3, -1.6, -1.3, 0.5, 2.1, 2.9, 5.6])N = len(x)

因为我们的输入变量是一维的,我们的参数向量 w 是二维的,因为它有一个偏差权重和一个输入变量权重。

为了确保我们也能找到偏差参数,我们必须在 x 中引入一列 1。我们可以通过下面的代码片段做到这一点

X = np.column_stack([np.ones(N), x])

衍生和培训

那么,**我们如何训练模型呢?**我们将研究两种不同的方法来推导训练该模型的方法。

回想一下训练(或学习)指的是估计我们模型的参数的过程,所以当我们问如何训练模型的时候,就和问如何估计 w 的值是一样的。

普通最小二乘法

就像我们在第一篇文章的中所做的那样,我们定义了一个目标函数,它根据误差来计算我们的模型的性能,然后我们根据我们的参数来最小化这个误差。

这意味着我们会找到导致误差最小的参数。我们将使用相同的目标函数,误差平方和(SSE),定义为

我们希望找到使 E 最小的 w 的值

注意(2)是参数 w 的二次函数。因此,它相对于 w 的偏导数在 w 中是线性的,这意味着存在唯一的最小值。这是凸函数的一个性质。

如果我们评估网格中参数 w 的值的目标函数,那么我们可以用等高线图说明我们的目标函数具有唯一的最小值。如下所示。

十字位于我们的目标函数的最小值——这个坐标对应于为我们的数据集产生最小 SSE 的参数值。图片作者。

但是我们如何找到最小的 T2 呢?

我们通过求导,设置导数等于 0,并求解函数变量来找到函数的最小值。为了便于记法,让我们所有的输入变量都用 X 表示,具有 N 行(每个输入变量一行)和 D +1 列(每个特征一行,偏差一行),即,

并且让 t 表示我们的目标变量的列向量。我们现在可以将(2)改写为

如果我们现在对 w 求导,我们得到

将这个值设为 0,我们就可以解出 w

这是我们对参数的估计值

最大概似法

然而,选择 SSE 作为目标函数似乎有点武断——例如,为什么不直接选择误差的总和呢?为什么我们要把它们弄成方形?

为了说明为什么这是一个好的选择,以及为什么这个解决方案是有意义的,我们将从概率的角度使用最大似然估计(MLE) 导出同样的解决方案

为了做到这一点,我们假设目标变量 t 是由我们的函数 h ( xw )加上一点噪声给出的

其中我们假设 ϵ 正态分布,均值为 0,标准差 σ

这就让我们说,给定一个输入变量 x ,对应的目标值 t 正态分布,均值 h ( xw ),标准差 σ ,即:

让我们花点时间了解一下到底是怎么回事。

下图说明了(3)告诉我们的内容。我们正在估计一些参数 w ,因此我们的目标变量 t 遵循围绕 h 输出值的正态分布。

目标变量如何遵循估计函数周围的正态分布的图示。图片作者。

我们现在可以使用整个数据集, Xt ,通过假设我们的数据点是独立于(3)得出的,来写出似然函数。然后,对于所有输入和目标变量对,似然函数变成(3)的乘积,并且是 wσ 的函数

现在我们想要最大化可能性,这意味着我们想要确定使(4)最大化的参数 wσ 的值。这看起来很难,但是我们可以用一个小技巧让它变得更简单。由于对数是单调递增的函数,对数似然性最大化等价于似然性最大化

取可能性的对数给了我们

现在很明显为什么 SSE 目标函数是一个好的选择——( 5)的最后一项是唯一依赖于 w 的部分,并且与 SSE 相同。

由于第一项不依赖于 w ,我们可以省略它,并且由于关于 w 的似然函数的最大值不会随着正常数的缩放而改变,那么我们看到最大化似然等价于最小化 SSE 目标函数

因此, w 的最大似然估计与我们之前的推导相同

我们可以使用 w 的最大似然解的结果来找到噪声参数 σ 的值。如果我们在对数似然中插入对 w 的最大似然估计,求导数,并将其设为 0,那么我们可以求解 σ

Python 实现

因为我们现在有了一个概率模型,我们做出的预测是在 t 上的概率分布,而不仅仅是点估计。这是通过将最大似然解中的 wσ 代入(3)来完成的

我们可以用下面的代码片段找到 wσ

w = np.linalg.inv(X.T @ X) @ X.T @ t
sigma_sq = sum((t - X @ w)**2) / len(t)

下面是我们根据 w 以及不确定性参数 σ估算的直线图。

由我们的估计参数和不确定性生成的线图。图片作者。

摘要

  • 我们可以通过普通最小二乘法最大似然估计找到线性回归的参数。
  • 通常在线性回归中,我们有一个不与输入相乘的标量参数,称为截距偏差
  • 估计参数的值的过程被称为训练或学习过程。
  • 由于对数是一个单调递增的函数,因此最大化似然函数与最大化对数似然函数相同。

Python 中的列表如何在内部优化以获得更好的性能

原文:https://towardsdatascience.com/how-lists-in-python-are-optimised-internally-for-better-performance-847c8123b7fa?source=collection_archive---------13-----------------------

python 内部实现及其优化的精确指南

由洛杉矶复活节在 Unsplash 拍摄的照片

本文为合著,Muhammad Abutahir为*,你可以在*LinkedIninsta gram上找到他。

名单!python 编程语言中最常用的数据类型之一,也是每个 Python 爱好者最喜欢的数据类型之一。Python 列表的操作极其简单,而且本质上非常灵活。

Python 列表不像数组那样严格,列表是异构的,这意味着你可以在列表中存储不同数据类型的元素。列表的内部实现被设计成一种程序员友好的数据类型。原因是列表的可变性,因为它允许你对它们执行任何操作,比如添加单个元素、添加多个元素、删除操作等等!

列表在内部是如何工作的?

列表在后台使用可变长度数组,可变长度数组是数组的变体,其大小最初没有指定,或者其长度或大小是在运行时设置的,您也可以将它们称为自动数组。

这个实现是在 CPython 中完成的。还有其他变体,如 JPython 和 IronPython。就性能而言,它们之间可以有些许的差异,但是我要说的是 CPython。

让我们看看 CPython 中列表的基本结构。

这里的PyObject **ob_item;是指向列表元素的指针。这向我们解释了列表在内部存储指向元素的指针,而不是元素本身!这反过来又向我们解释了名单的异质性。也就是存储不同数据类型的元素,比如列表中的列表、字符串、数字以及任何你想到的东西。

如果我问你一个问题,比如‘空列表的大小是多少?’。最常见的答案是零!但是记住,大小和长度是两回事。如果我们检查一个空列表的大小,我马上会给你们看,结果是 40。这可能有多种原因,如变量的初始大小、垃圾收集选项的内存、内置函数的内存,尽管在调用它们时在堆栈内存中给了它们空间,但仍然有一些变量,等等。

创建一个名为 list 的空列表并检查其大小

这与我们使用内置的list()创建空列表的情况相同。__sizeof__()是一个以字节为单位返回对象大小的函数。

现在,如果我们通过将元素放在[]中直接创建一个列表,我们得到的大小是 8 个字节乘以元素总数,记住PyObject **ob_item;每次存储占用 8 个字节。这与您存储的元素的数据类型无关。

创建一个空列表和第二个列表来显示大小比较

在上面这段代码中,我创建了一个包含两个元素的列表,一个是数字,另一个是字符串,但是我们得到的是 56,即 40+8+8。抽象地说,我们可以想象上面的代码是如何在内存中演示的,如下图所示。

由作者 Muhammad Abutahir 创建的图像:显示列表的内存分配

然而,当我们尝试使用用于向列表添加单个元素的append()时,会发生一些不同的事情。看看这个。

在过度分配期间创建一个空列表并填充以显示大小

哇!72?所以我们只是添加了一个元素,它必须是 48 **40+8!**但为什么是 72?那就像 **40+32。**这个我们赶紧了解一下。

列表中的性能优化

CPython 实现了过度分配的概念,这仅仅意味着如果您使用append()extend()insert()向列表中添加元素,它会给您 4 个额外的分配空间,最初包括指定元素的空间。我们称之为列表的调整大小,它发生在运行时。最初分配了 4 个空间,包括用于元素的空间,并以模式 8、16、25、35…等等继续。这样调整大小是为了提高性能。稍后我将向您展示如何通过这样做来提高性能。

由作者 Muhammad Abutahir 创建的图像:显示列表中的超额分配

参考前面的代码,我们在其中使用append()向列表添加了一个元素。这是我们如何可视化 CPython 的过度分配概念。我已经展示了不可访问的浅绿色方框,虽然它们仍然存在,但是我们可以在__sizeof__()的帮助下看到内存,这就是我们得到 72 的原因,即 40+8+8+8+8!

现在,当我们追加更多的元素时,首先填充分配的空间,然后根据特定的模式调整大小。让我们看看同样的extend().

创建一个空列表并填充它以显示已填满的过量分配的内存

正如你所看到的,我添加了 3 个元素,但大小仍然是 72。这是因为已经分配的空间被填满了。

由作者 Muhammad Abutahir 创作的图片:展示如何填补过度分配

这种过度分配是有原因的。当使用内置函数将新元素添加到列表中时,函数list_resize()被隐式调用,该函数在 CPython 中实现,每次添加新元素时都必须调用该函数,为了避免调用太多次,指定了一个调整大小模式,该模式以1.125 * new_size +3的方式计算,当元素多于 9 个时,数字 3 增加到 6。

现在,如果你试图在列表中添加一个新元素,列表会再次被过度分配,你会得到一个新的大小,请看下面的代码。

附加的最后一个值根据大小模式增加大小

如您所见,前面的空间被填满了,当您创建一个新元素时,大小从 72 增加到 104。因此,通过避免重复调用list_resize(),我们降低了堆栈内存和时间方面的成本,因此这很重要。

结论

在本文中,我深入讨论了 Python 中列表的内部实现和优化。非常聪明的是,程序员在我们需要的地方使用惊人的想法来提高性能,因为 python 与其他编程语言相比非常慢,因此采取这些类型的步骤可以减少程序员的大量痛苦。

说完这些,感谢大家阅读本文, 快乐学习!

LSTM & T-CNN 真正能记住的依赖长度是多少?

原文:https://towardsdatascience.com/how-long-dependencies-can-lstm-t-cnn-really-remember-7095509afde8?source=collection_archive---------12-----------------------

提示和技巧

免责声明:本文假设读者拥有 LSTM 和 CNN 神经网络的模型直觉和架构背后的初步知识。

LSTMs 是广泛用于顺序建模任务的技术,例如语言建模和时间序列预测。这样的任务通常有长期模式和短期模式,因此学习这两种模式对于准确的预测和估计是很重要的。基于变压器的技术正在兴起,这种技术有助于对长期依赖关系进行建模,远远优于 LSTMs。然而,由于数据密集型培训要求和部署复杂性,变压器无法用于所有应用。在这篇文章中,我将比较 LSTM 和 T-CNN 在长期信息学习方面的差异。

让我们开始…

技术 TLDR

LSTM 是一种长短期记忆神经网络,广泛用于学习序列数据(NLP,时间序列预测等..).由于递归神经网络( RNN )存在消失梯度问题,阻碍网络学习长时间尺度相关性,而 LSTM 通过引入遗忘门、输入门和输出门来减少这一问题。有了这些门,它就有了代表长期记忆的细胞状态,而隐藏状态则代表短期记忆。遗憾的是,LSTM 仍然不是保留长期信息的完美解决方案,因为遗忘之门倾向于从之前的步骤中移除这样的模式(信息衰减)——如果模式对于 50 步来说不重要,我为什么要保留它?

香草 LSTM。作者图片

幂律遗忘门控 LSTM (pLSTM) 是最近由英特尔和约翰·霍普斯金的研究人员开发的。尽管 LSTM 有所改进,但遗忘机制表现出信息的指数衰减,限制了他们捕捉长时间信息的能力。可以阅读 论文 进行详细讲解。总之,由于信息衰减遵循 LSTM 的指数模式, pLSTM 给遗忘门增加了一个衰减因子 p,这使得 LSTM 可以控制信息衰减速率,帮助它更好地学习长期依赖关系。

pLSTM。图像 src

时间 CNN (T-CNN) 是简单的 1D 卷积网络,可以应用于时间序列数据而不是图像数据。已知这些层具有时间属性,以学习数据中的全局和局部模式。卷积层还有助于改善模型延迟,因为预测可以并行化,不需要按顺序进行。由于 CNN 可能是因果性的,这意味着每个预测只能依赖于它以前的预测,因此没有来自未来的泄漏。使用深度神经网络和扩张卷积的组合,TCN 构成非常长的有效历史大小。T-CNN 有几种变体,如基于注意力的 CNN,将 LSTM 与 CNN 结合起来,融合其他类型的架构,然而,在这篇文章中,我将坚持使用普通的 T-CNN,以使它对我的读者简单,TCNN 的变体本身可以是一篇单独的博客文章。可以阅读 论文 进行详细解释。

因果卷积与标准卷积构成了 T-CNN 的基础。作者图片

合成数据

让我们从一个简单的加法函数开始:

y = f(xⁿ)+ f(x)

人们可以设计他们自己的功能,但是现在,让我们用这个。我们的假设是,序列越长,LSTM 应该越难记住 X⁰值,例如,具有 2 的序列是第 1 和第 2 个元素的相加,而 100 的序列是第 1(0)和第 100(或-1)个元素的相加。序列越大,LSTM 需要携带信息的步骤就越多。

按作者分类的数据生成器

LSTM 模型建筑

我创建了一个香草 LSTM 架构,并用超参数和堆叠 LSTM 层进行实验,以验证我们的假设

香草 LSTM 建筑和作者培训

CNN 模型架构

我创建了一个普通的 T-CNN 架构,并用超参数如内核大小、过滤器和卷积数来验证我们的假设

作者的香草 T-CNN 架构和培训

模型性能结果

MSE 是评估非偏斜数据的一个很好的方法,但是不太容易解释(除了数学家可以!).为了简化,我们可以看一下当 X 中的一个改变时,Y 的百分比变化。由于合成函数是相加的,将 X 中的一个改变 N 个百分点,应该会有 y 的 N/2 个百分点的变化,其次我们可以看看 致盲 。当我们将任一个 X 设为 0 时,我们可以测量 Y 是否等于非零 X 的 MSE。理论上,MSE 应该是 0.0

按作者的度量

结果和结论

我分别对 X[0]和 X[-1]应用了 50%的变化,以了解 Y 中的变化,并计算第 0 个变化列和第-1 个变化列。高达 68 个序列长度 LSTM 能够记住从时间序列开始的先前信息,但最终在第 69 个序列长度时忘记,而 CNN 仍然能够做出准确的预测,这仅仅是因为我增加了内核大小,以便它有机会查看序列的初始和结束值。盲法显示了相同的结果。当序列长度 69 的第 0 个值设置为 0 时,MSE 跳到 0.251%。总的来说,LSTM 似乎对-1 的变化比对 0 的变化更敏感。[ 这些结果会随着不同的数据大小和函数而变化,但信息是明确的“LSTMs 并不真的长!”]

按作者列出的结果

这些结果与 pLSTM 作者在他们的信息衰减部分描述的路径相同

pLSTM 的信息衰减作者

在本文中,我没有与 pLSTM 进行比较,因为目前还没有可用的开源实现,不过,我将在下一篇博客中跟进我自己的 pLSTM 实现。

** 在这里 ,你可以找到**链接 的完整代码。

预测范围应该有多长?

原文:https://towardsdatascience.com/how-long-should-the-forecast-horizon-be-2f24a6005b89?source=collection_archive---------10-----------------------

作为需求计划员,您只能关注有限的预测范围。应该是多长时间?

预测只能帮助你做出正确的供应链决策。

来源:https://commons . wikimedia . org/wiki/File:Conquistadores _ 654 . jpg

让我们假设你是一名供应计划员。您的主要供应商向您报价 3 个月的提前期,而您每月都下订单。

从技术上讲,你在当月的第一天下订单(这里是 M1)。订单接收发生在月初(它们不能用于履行前一个月的订单)。换句话说,你将在 M1 的第一天下订单,在 M4 的第一天收到订单。

你希望供应链的需求规划人员通过提供有用的需求预测来支持你。

你是否应该要求他们关注以下内容:

  • 预测 M+1?
  • 预测 M+2?
  • 预测 M+3?
  • 预测 M+4?
  • 预测 M+1 到 M+3?
  • 预测 M+1 到 M+4?
  • 预测 M+1 到 M+6?

我在 LinkedIn 上做了一个调查,得到了这些答案:

我同意 38%的投票者的观点:你应该着眼于 5 个月的时间范围(可能稍微长一点)。我想这个答案对许多规划者来说是违反直觉的,因为 34%的人只对 M3 最大值感兴趣。

为了解释我对地平线的选择(M1 对 M5),让我们先来看看这个理论,然后用一个例子来说明它。

理论:库存优化、交付周期和审查周期

库存优化理论告诉我们,定期库存补充策略应该在 L+R(提前期+审查期)的风险范围*内得到保护。

*风险范围:收到订单(来自供应商)所需等待的最长时间。在此期间,您的库存有被耗尽的风险。在定期补货政策中,我们有风险期=提前期+审查期。我在我的书库存优化中介绍了这个概念。

我们之前的例子是 4 个月:3 个月的交付周期加上 1 个月的评审期。

交付时间、审查期和风险范围

这是一个违反直觉的答案。大多数供应计划员会关注 M+3 预测或累计 M+1 到+3 预测,而不是累计 M+1 到+4 预测。

例子

让我们举个例子。我们稍后将讨论 M5 和 M6。

让我们想象一下下图中突出显示的订单和需求计划。绿色表示即将收到的订单,红色表示需求预测。在下订单时(就在 M1 刚开始的时候),我们的库存水平是 150 件。

订单和需求计划

假设我们希望在收到新订单之前,每月以 100 件的库存水平完成。通过这样定义我们的库存目标,它将对应于安全库存的定义。

**举个例子。**在 M1 结束时,我们预计库存为 150–50 = 100 件(=起始位置-预期需求)。然后我们会收到之前 40 台的订单,达到 140 台,开始在 M2 生产。

查看下图,我们计算出,到 M3 结束时,我们预计库存为 70 件。这比我们 100 件的目标低了 30 件。

由于 3 个月的交付周期,订单 1(我们现在正在制作)将无法及时到达,无法在接下来的 3 个月内改变任何事情。我们唯一能影响的是 M4 年末的股票水平。

如下图所示,现在订购 80 件,我们将确保 M4 期末的库存为 100 件(起始= 70+80;消费= 50;剩余库存= 100)。

我们现在需要订购 80 台才能达到 M4 年底的库存目标。

哪个预测最重要?

看上面的图,我们意识到改变 M1 到 M4 的预测将会改变我们应该订购的数量。

**示例:**如果您的需求计划员通过将预期需求从 75 件更改为 100 件来更新 M2 预测,您也应该做出反应,将订单增加 25 件。

这意味着从 M1 到 M4 的任何时期对确定您的订单金额都同样重要。

展望未来

让我们回顾一下到目前为止的故事。

我们需要向我们的供应商发出月度订单,供应商的报价是提前 3 个月。我们意识到,为了决定现在订购多少,我们必须关注未来 4 个月的需求预测。

但是,实际上,这并不是全部情况。

最佳服务水平和风险

库存优化科学告诉我们,我们需要根据盈利能力和风险来优化服务水平。基本上,你需要平衡库存过多和不足的风险和成本。

让我们想象两个简单(极端)的场景:

  • 案例# 1:M5 的预期需求为 1000 件。
  • 方案# 2:M5 的预期需求为 0 件。

场景 1 和 2(看看 M5)

我们最初假设我们希望以 100 件的安全库存完成 M4。显然,如果我们不希望在 M4 之后有任何销售(场景 2),以 100 件的库存结束 M4 将不是一个明智的决定。另一方面,如果我们预计在 M5 销售 1000 件(场景 1),我们可以为 M4 留出更大的安全边际(因为过时或长期剩余的风险较低)。

合作

通过向您的供应商提供更长远的观点,您可以帮助他们缩短交货时间、降低成本并增加库存。

更进一步#1:提前期的概率预测

在最近的一篇文章中,我展示了概率预测比点预测(更)相关和有用。

  • 点预测:将未来与单一预期结果联系起来,通常是一个平均预期值(不要与最有可能的结果混淆)。我们预测下个月会卖出 1000 件。
  • 概率预测:分配不同事件发生的概率。

如果你想正确评估你需要多少库存(并优化安全库存和服务水平),你需要得到一个在这个风险范围内会发生什么的概率视图。

基本上,我们应该着眼于 L+R 上的需求分布,而不仅仅是 L+R 上的点预测。

请注意,M1 到 M4 的需求分布通常不同于 M1、M2、M3 和 M4 的需求分布之和。但那是后话了。

更进一步#2:销售损失与延期交货

延期交货的库存策略(所有超额需求都保留到有存货可用)不同于销售损失的策略(所有超额需求都损失)。

  • 销售损失:当你缺货时,你的客户(通常)会取消订单。你需要注意风险范围内可能发生的任何短缺。所以你需要对每个月的期间可能发生的事情有一个详细的了解(除了对整个地平线有一个好的预测之外)。

销售损失:如果 M1 需求增加 150 件(至 200 件),对订单的影响只是增加+75 件,因为失去了 M1 和 M2 的过剩需求。

销售损失在 B2C/快速消费品中很常见,这使得需求规划者很难估计真实需求。

  • 延期交货:在库存短缺的情况下,你的客户会保留他们的订单,等待再次有货。在这种情况下,如果您错过了风险范围内的任何库存,对订单需求没有影响:总需求不会受到影响。然后,您可以关注从 M1 到 M4 的累计预测,而不是每个月的单独预测。

延交订单:如果 M1 需求增加 150 件(达到 200 件),对订单的影响是增加+150 件(80+150=230),因为所有的过剩需求都延交了。

  • 在大多数供应链中,一些客户会保留他们的订单(或再订购),而一些会直接去竞争。为了优化您的订单数量,您必须估计在风险范围内发生销售损失的可能性。

结论

总之,最佳实践是专注于在风险范围(交付周期加审查周期)加上几个周期内预测需求(以了解库存过多/过少以及与供应商合作的风险)。

行动呼吁

如果您正在管理需求规划流程,我建议您修改您正在跟踪的预测 KPI。单纯看 M+1 或 M+2 是不够的。

👉我们在 LinkedIn 上连线吧!

感谢

斯蒂芬·德·科克

关于作者

icolas Vandeput 是一名供应链数据科学家,擅长需求预测和库存优化。他在 2016 年创立了自己的咨询公司 SupChains ,并在 2018 年共同创立了 SKU 科学——一个快速、简单、实惠的需求预测平台。尼古拉斯对教育充满热情,他既是一个狂热的学习者,也喜欢在大学教学:自 2014 年以来,他一直在比利时布鲁塞尔为硕士学生教授预测和库存优化。自 2020 年以来,他还在法国巴黎的 CentraleSupelec 教授这两门课程。他于 2018 年出版了 供应链预测的数据科学(2021 年第 2 版)和 2020 年出版了 库存优化:模型与模拟

机器学习如何为你推荐电影

原文:https://towardsdatascience.com/how-machine-learning-recommends-movies-for-you-6f418f26bcb2?source=collection_archive---------21-----------------------

以实用的方式介绍人口统计过滤、基于内容的过滤和协作过滤

图片由 Unsplash 上的 Thibault Penin 拍摄

在本文中,我们来讨论一个项目,该项目阐述了机器学习算法如何通过使用推荐系统来推荐你可能想要观看的下一部电影。这种方法不仅可以用于电影内容,还可以用于为每个用户特别选择的其他数字对象,例如,书籍、网页、音乐、消息、产品、约会偏好,当然还有已经被几家公司广泛执行以改善其数字平台内的客户体验的电影。

本项目将实施三种类型的推荐系统,分别是:

  • 人口统计过滤为具有相似人口统计背景的用户提供相似的电影,这些电影受欢迎且评价良好,而不考虑类型或任何其他因素。因此,由于它没有考虑每个人的个人爱好,所以它提供了一个简单但易于实现的结果。
  • 基于内容的过滤考虑对象的内容,在电影的情况下,可以是演员、导演、描述、流派等。所以会给用户更贴近个人喜好的电影推荐。
  • 协同过滤关注用户的偏好数据,并在此基础上通过与其他用户具有相似偏好的历史电影进行匹配来推荐电影,并且不需要电影元数据。

在了解了推荐系统的机制之后,让我们使用 TMDB 的电影数据集来启动我们的第一个推荐系统项目,该数据集可以通过 Kaggle 这里下载。这个数据集包含两组文件,分别是演职员表文件和电影文件。演职员表文件大小为 38MB,具有 4 个特征,即电影 ID、标题、演职人员姓名(屏幕成员)和工作人员姓名(后台成员)。另一方面,大小为 5.4MB 的电影文件包含更多功能,即电影的预算、类型、主页、ID、关键字、原文、原标题、制作公司、制作国家、上映日期、收入、运行时间(分钟)、状态(已上映或传言)、标语、标题、平均投票和投票计数。

像往常一样,首先,我们需要导入几个启动库,如下所示:

import numpy as np
import pandas as pd

如果你正在使用 Google Colab,不要忘记将电影和演职员表文件上传到 Colab,如下所示:

from google.colab import files
uploaded = files.upload()

然后使用 Pandas 的 read 函数将这些文件分配给变量,并读取它们的大小:

credits = pd.read_csv('tmdb_5000_credits.csv')
movies = pd.read_csv('tmdb_5000_movies.csv')
print(credits.shape)
print(movies.shape)

正如我们在下面看到的,两个文件都有 4803 个数据,其中 4 个特征用于演职员表文件,20 个特征用于电影文件。

因为有两个文件,我们应该根据它们的电影 ID 合并这些文件。但是在合并之前,让我们将演职员表文件的“电影 ID”列更改为“ID ”,因此,当合并时,它们将具有相同的“ID”特征,然后检查新合并文件的大小。

credits.columns = ['id','tittle','cast','crew']
movies= movies.merge(credits,on='id')
print(movies.shape)

现在,我们新的合并文件包含 23 个特征,如下所示:

人口统计过滤

据我们所知,人口统计过滤是最简单的推荐系统之一,它只为用户提供最好的评级和最受欢迎的电影。然而,虽然这可能很简单,但我们仍然需要适当的公式来计算最佳评级的电影,因为有些电影有 9.0 评级,但只有 5 票,所以对于其余评级略低但票数多得多的电影来说,这是不公平的。

IMDB 提供了计算电影分级的最佳公式,在这里有明确的表述。它基本上考虑了投票数、需要考虑的最低投票数、平均投票数和平均评分,最终得出一个公式如下:

其中:

  • W =加权评级
  • v =电影的投票数
  • m =需要考虑的最低票数
  • R =电影评分的平均数
  • C =总体数据的平均票数

因此,我们需要确定这些元素中的每一个,以便获得 w。数据集中已经提供了投票数(v)和平均投票数(R ),因此,我们不需要进一步计算这些变量。接下来,我们需要找出 C,它是所有投票的平均值,可以通过以下函数确定:

C= movies['vote_average'].mean()

如果我们试着打印出 C 的值,我们会得到 6.092..如下所示:

接下来,我们需要确定 m,这是一部电影被认为是推荐所需的票数。我们可以将其设置为任何数字,但是,假设在我们的算法中,我们将它设置为 85%作为我们的截止值,这意味着要被考虑,该电影需要有超过整体电影 85%的票数。让我们来看看:

m= movies['vote_count'].quantile(0.85)

正如我们在下面看到的结果,为了让一部电影被推荐,它必须至少有 1301 票。

通过使用 m 的值,我们可以如下消除评级数量低于 1301 的电影:

demograph_movies = movies.copy().loc[movies['vote_count'] >= m]

现在我们可以看到 4803 部电影中只有 721 部的票数超过 1301。

找出所有元素后,让我们通过定义其函数来创建 IMDB 加权评级公式,如下所示:

def weighted_rating(a, m=m, C=C):
  v = a['vote_count']
  R = a['vote_average']
  return (v/(v+m) * R) + (m/(m+v) * C)

然后,我们可以通过创建一个名为“score”的新特性,将 IMDB 公式的结果插入到人口统计推荐文件中

demograph_movies['score'] = demograph_movies.apply(weighted_rating, axis=1)

之后,我们需要根据加权评分对电影进行降序排序。

demograph_movies = demograph_movies.sort_values('score', ascending=False)

现在,让我们通过使用我们刚刚构建的 IMDB 公式,根据我们的人口统计推荐算法来看看前 10 部电影是什么:

demograph_movies[['title', 'vote_count', 'vote_average', 'score']].head(10)

结果《肖申克的救赎》高居榜首,紧随其后的是《搏击俱乐部》和《低俗小说》。他们确实是伟大的电影,然而,这个推荐系统适用于所有人,不管用户的类型或其他因素偏好,因此,它被认为是远非完美的。

基于内容的过滤

与人口统计过滤不同,基于内容的过滤在向用户推荐电影之前会考虑电影中的每个元素,如电影的描述、类型、演员、工作人员等。这样,用户将更有可能收到与他们喜爱的电影更一致的推荐。

基于电影描述的推荐

让我们从提供具有相似描述的电影推荐开始,在电影数据集中,存储在“概览”功能中的数据可以通过这里找到:

movies['overview'].head(10)

因为我们在这里处理句子,所以采用一种叫做 TF-IDF 的 NLP(自然语言处理)技术是更明智的,TF-IDF 是术语频率-逆文档频率的简称。TF-IDF 所做的是,通过使用以下公式查找 TF 和 IDF 来分析每个单词的重要性:

然后 TF-IDF 可以通过简单地将 TF 和 IDF 的结果相乘得到,因此:

TF-IDF = TF*IDF

TF-IDF 计算由 Scikit-Learn 库提供,可通过以下代码导入:

from sklearn.feature_extraction.text import TfidfVectorizer

在执行 TF-IDF 之前,我们需要执行必要的 NLP 预处理任务,例如通过分配一个新变量来删除停用词(没有意义的词,例如,“a”、“the”、“but”、“what”、“or”、“how”和“and”)。

tfidf = TfidfVectorizer(stop_words='english')

我们还需要用一个空字符串替换 NaN:

movies['overview'] = movies['overview'].fillna('')

然后,我们可以将 TF-IDF 矢量化应用于电影概览,并检查其大小:

tfidf_overview = tfidf.fit_transform(movies['overview'])
tfidf_overview.shape

正如我们在上面看到的,在“概览”功能中有超过 20,000 个单词用于描述 4803 部电影。

因为我们已经为概览的句子计算了 TF-IDF 矢量化,所以我们现在可以找出两部电影之间的相似性,这实际上有几种方法,如欧几里德、皮尔逊相关和余弦相似性。但是考虑到简单性,我们会使用余弦相似度,余弦相似度可以通过使用 sklearn 库中的 linear_kernel()函数获得。

首先,我们需要从下面的 sklearn 导入线性内核:

from sklearn.metrics.pairwise import linear_kernel

然后我们可以通过它找出余弦相似度。

cos_sim = linear_kernel(tfidf_overview, tfidf_overview)

通过这种方式,我们发现了电影描述之间的相似性。然而,在我们创建一个基于描述的相似性返回电影推荐的函数之前,我们需要如下设置每个标题中的索引:

indices = pd.Series(movies.index, index=movies['title']).drop_duplicates()

然后,我们可以根据他们的描述开始构建电影推荐功能,如下所示:

def des_recommendations(title, cos_sim=cos_sim):
    idx = indices[title]
    sim_scores = list(enumerate(cos_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:16]
    movie_indices = [i[0] for i in sim_scores]
    return movies['title'].iloc[movie_indices]

在上面的基于描述的推荐算法中,首先,我们根据电影的标题获得电影的索引,然后收集具有相似余弦相似性结果的电影,然后按照降序对电影进行排序,然后将结果的数量设置为 15,然后获得推荐电影的索引,最后,根据所述方法向我们展示前 15 部电影。

来试试小黄人的电影推荐:

des_recommendations('Minions')

我们得到以下卡通/儿童电影作为推荐:

如果我们尝试黑暗骑士:

des_recommendations('The Dark Knight')

我们得到的推荐大多是另一部蝙蝠侠电影:

我认为这种类型的推荐系统将能够提供比人口统计过滤系统更相关的推荐。

协同过滤

与基于内容的过滤不同,基于内容的过滤只根据其他电影的元素为我们推荐电影,协同过滤将为用户提供更多的个人体验,因为它将用户的评级考虑在内。在继续之前,我们首先需要了解两种类型的协同过滤,即基于用户的过滤和基于项目的过滤。正如我们从他们的名字中看到的,基于用户的过滤基于用户评估评分的相似性,另一方面,基于项目的过滤基于项目评估他们评分之间的相似性。此外,用户和项目之间的相似性可以根据皮尔逊相关和余弦相似性公式来计算。

因此,CF 可以预测用户对某部电影的喜欢程度,即使用户尚未对其进行评级。接下来,为了开始 CF 项目,我们需要从 Kaggle 这里的下载另一个数据集,特别是“ratings_small.csv”数据集,因为之前的数据集不包含用户 ID 功能,而这在 CF 项目中是必不可少的。

ratings = pd.read_csv('ratings_small.csv')

我们还需要导入 scikit-surprise 库来利用它的 SVD 和其他功能。如果你还没有安装惊喜,你可以运行下面的代码:

pip install surprise

然后,我们可以导入惊喜库:

from surprise import Reader, Dataset, SVD
from surprise.model_selection import cross_validate

因为我们正在处理大量基于用户和产品的数据,所以我们需要通过实施奇异值分解(SVD)来降低可扩展性和稀疏性问题的可能性,我们将能够通过评估 RMSE(均方根误差)和平均绝对误差(MAE)来检查数据集性能。注意:RMSE 和 MAE 的值越低,表明数据集的性能越好。

reader = Reader()
data = Dataset.load_from_df(ratings[['userId', 'movieId', 'rating']], reader)
svd = SVD()
cross_validate(svd, data, measures=['RMSE', 'MAE'], cv=5)

我们可以看到,实施奇异值分解后,MAE 和 RMSE 的结果都小于 1,在可接受的范围内:

既然它表现不错,那我们就来训练一下我们的数据:

train = data.build_full_trainset()
svd.fit(train)

让我们检查用户 ID 为 1:

ratings[ratings['userId'] == 1]

让我们用电影 ID 302 对用户 ID 1 进行预测:

svd.predict(1, 302, 3)

我们得到了 2.87 的评估评级预测

结论

人口统计、基于内容和协作是非常不同的推荐系统,它们通过考虑不同的元素来操作,然而,人口统计被认为是其他推荐系统中最简单的,但是基于内容和协作给出更个性化的电影推荐。

谢谢你的阅读,我希望你喜欢它。

家庭——有什么比拥有两辆电动汽车更好?

原文:https://towardsdatascience.com/how-many-electric-cars-should-a-family-own-aa7c146ebae4?source=collection_archive---------25-----------------------

我们展示了一个家庭如何优化 CO₂排放和车队的日常可用性。解决方案出人意料。

Denys Nevozhai 在 Unsplash 上拍摄的照片

已经有大量研究比较了电动汽车(也称为“BEV”)和内燃机汽车(ICE)的温室气体排放和成本。对于需要两辆车的社区(例如家庭或住户)的问题的优化研究较少。

为了填补这一空白,也出于自身利益,我们为这项研究详细模拟了一个现实场景

我们优化以下两个标准以达成一个平衡可行的解决方案:

  • 气候足迹。在整个生命周期中(包括汽车和电池生产、燃料供应等),CO₂的排放量应降至最低。).
  • 日常可用性。充电和加油意味着时间和物流的损失。因此,我们的解决方案应该只需要每年几天的时间,就可以每天给车辆充电/加油一次以上。

由于整个研究有点复杂,我们将从头开始:首先是结果和影响,然后是假设和模拟的细节。

内容

  • 研究结果
  • 模拟:假设
  • 模拟:细节
  • 模拟:结果
  • 胜利者
  • 总结和展望

研究结果

正如所承诺的,我们从结果开始。细节和假设将随后。以下是主要发现:

  • 在现实假设下,一个家庭/住户的最佳使用一辆电动车和一辆柴油车
  • 如果每天的距离很短或者如果一次充电最多可以覆盖的距离,那么电动车应该总是首选用于日常使用。
  • 由于电池是 CO₂-intensive 生产的,电动车应该有而不是小电池(例如 45 千瓦时)。
  • 与使用两辆电动汽车相比,如果其中一辆汽车有内燃机,一天内第二次加油/充电的需求会大大减少**(减少到百分之一)。**

如果电动汽车主要用于短距离和中距离,大多数充电可以在家中自己的车库中进行。这样可以节省时间和金钱。对于私人光伏(PV)系统的所有者来说,CO₂可以降低得更多。

另一个有趣的发现是:

  • 使用两辆电动汽车,都有一个大电池,导致我们的场景相当差的碳足迹。

夏洛特·斯托在 Unsplash 上的照片

你对我们如何得到这些结果感到好奇吗?接下来的部分将让您深入了解细节…

模拟:假设

对于我们的模拟,我们必须做一些假设。假设的一部分是基于文献研究,第二部分是关于被调查情景的定义。在任何情况下,仿真模型可以快速且容易地适应变化的参数。

为了获得可比较的结果,我们将我们的分析建立在紧凑型车的基础上。该级别还包括目前在欧洲占据最大市场份额的车型(大众高尔夫,大众 ID.3)。

我们已经为模拟程序编写了一些代码。将来更改参数可以不费吹灰之力。照片由阿诺·弗朗西斯卡在 Unsplash 拍摄

所以让我们一个一个地检查假设:

每单位能源的 CO₂排放量

  • 每度电 0.468 千克 CO₂。
  • 每升汽油含 3.140 千克 CO₂。
  • 每升柴油含 3.310 千克 CO₂。

第一个假设基于欧洲电力组合“eu 2014”(1)。由于电动汽车在行驶过程中不会排放任何温室气体,因此排放的气体完全是用于提供能源的废气。为了公平的比较,这些不能被忽略。

在燃料生产过程中,内燃机的排放量也因 CO₂负荷而增加,以计算总排放量(2)。

汽车生产和处置的 CO₂排放

根据(1),生产小型汽车的温室气体排放量如下:

  • 一辆电动汽车(bev)8,110 公斤 CO₂。
  • 汽油车 7,425 千克 CO₂
  • 柴油车为 7,609 千克 CO₂

对于电动汽车,每千瓦时的电池尺寸增加了一个额外的 145 公斤 CO₂。因此,容量为 50 千瓦时的电池需要额外的 7,250 千克 CO₂用于生产和处理电池。

消费

对于油耗值,为了保持一致,我们使用了相同的来源(1)。以下是假设,通常单位为升或千瓦时每 100 公里:

根据 ifeu 模型(1),紧凑型车辆的消耗量。电动车= BEV。混合类别对应于 30%的城市、40%的郊区和 30%的公路。

将每千瓦时或每公里的排放量数据乘以消耗量就可以得出每公里的 CO₂排放量。这样就可以很容易地比较不同使用领域的车型(“道路类型”):

不同车辆类别和道路类型的每公里 CO₂排放量。

场景的定义

我们模拟的场景大致代表了一个家庭典型的日常流动性。我们假设每年有几次长途旅行(如假期)和大量的短途旅行。

下表定义了这方面的详细信息。道路类型下面的数字就是所谓的“汽车日”。“城市”下方第一个单元格中的数字 100 被解释为每年有 100 天需要一辆行驶总距离为 5-10 公里的汽车,主要是“城市”。

每个路线区域和道路类型一年内的出行次数。例如,假设在 5 天内完成 200-300 公里的旅程,主要是在高速公路上。

总的来说,这意味着每年 385 个“汽车日”行驶 27,625 公里。如果无车日的数目作为进一步的参数被给定为 20,则恰好一辆车或两辆车都在使用的日子分别是 325 和 40。

快速检查显示正确:20 x 0+ 325 x 1 + 40 x 2= 385。

对于我们的模拟,我们当然可以根据需要调整该部分中的所有参数。

模拟:细节

为了得到可靠的结果,我们使用了所谓的“蒙特卡罗”模拟。基本上,在 10 年的时间里,我们每天随机确定是否有 0、1 或 2 辆车在使用,以及哪些日常路线必须行驶。

使用编程语言 R ,这可以通过使用:

## Decide on 0, 1, 2-car days by Monte Carlo. 
nDays = 365 * years
dayType = sample(
 0:2, size=nDays, replace=TRUE, 
 prob=carDayDistribution[c("zeroCarDays","oneCarDays","twoCarDays")]
)

例如,所谓的 2 辆车一天所需的日工作量可能如下所示:

  • 路线 A: 7 公里,市区。
  • B 路线:980 公里,高速公路。

“随机”是指平均而言,场景部分中显示的表的分布是复制的。然而,10 年后,高速公路或城市出行仍然会更多甚至更少。

根据模拟运行的 2 种汽车类型(BEV、汽油、柴油),将在一天内选择使用其中一种汽车。
我们的决策标准(每天)如下:

  • 如果只有一条路可走,我们选择 CO₂排放量最低的车。假设每天最多可以行驶 1 次充电/加油。
    否则,我们选择行驶里程更长的车辆。
  • 如果有两条路线要行驶,我们选择的路线要使汽车每天的 CO₂排放量最小。如果其中一辆车需要充电或加油不止一次,我们会为行驶里程较长的车辆分配较长的距离。

顺便说一句,我们并不假设充值发生在 0%,但在 20%;)同样,我们使用矢量化代码:

**## 1-Car-Days.**
nOneCar = sum(dayType == 1) 
# Get n tracks as a data.frame including driveType and km. 
tracks = getTravelRequests(nOneCar, carDaysData) 
CO2_carA_track1 = CO2_per_km[tracks$driveType,fuelTypeA] * tracks$km
CO2_carB_track1 = CO2_per_km[tracks$driveType,fuelTypeB] * tracks$km
...
selected_car = ifelse(
  (CO2_carA_track1 <= CO2_carB_track1) & (tracks$km<=rangeA), "A", 
  ifelse(
    (CO2_carB_track1 <= CO2_carA_track1) & (tracks$km<=rangeB), "B",
    ifelse(
      rangeA >= rangeB, "A", 
      "B"
    )
  )
)**## 2-Car-Days.**
nTwoCars = sum(dayType == 2)
... 

因此,该规则是确定性的,并且相对简单。正如你所看到的:CO₂最小化的组合,但避免了“连续加油日”。

由于电池大小是决定性的,我们使用以下 5 种汽车类型:

  • 45 千瓦时的 BEV
  • 60 千瓦时的 BEV
  • 85 千瓦时的 BEV
  • 55 升油箱的汽油
  • 带 55 升油箱的柴油发动机

顺便说一句,内燃机的油箱大小并不真正影响结果。

模拟:结果

对于两种车型的每种组合(甚至是两次相同的车型),进行了 50 次持续时间为 10 年的模拟。该模拟为我们提供了车辆生产、使用和处置过程中 CO₂总消耗量的详细信息。它还给出了单次充电/加油不够用的“汽车日”数。

CO₂消耗量(整个汽车寿命)的表格有些令人惊讶。很明显 2 款汽油车表现很差(69.5t)。但是 2 个 2 个大电池的 bev 也远远落后(66.7t):

各种车辆组合的 CO₂排放量,单位为千克(50 次模拟的平均值,每次 10 年)。绿色表示 4 个最佳值(低于 60 吨 CO₂),橙色表示 2 个最差值(高于 65 吨 CO₂).

如果电池容量保持较小(60 千瓦时,45 千瓦时更好),那么 2 个 bev 的组合是环保的。但是,即使一辆 45 千瓦时的柴油 BEV 仍然低于 60 吨 CO₂.

但是哪些组合适合日常使用呢?这就是下表告诉我们的。实际上,包括至少一个柴油或汽油发动机的所有组合将在 10 年内管理最多一次需要不止一次充电/加油的行程:

需要多次充电/加油的行程次数(平均 50 次模拟,每次 10 年)。如果<10, in orange if > 150 显示为绿色。

如果你选择两杯饮料,情况就完全不同了。在这种情况下,需要更频繁地充电,在 10 个模拟年内平均 100 到 200 次,也就是说每年 10 到 20 次。

获胜者

我们的获胜者就这样被确定了。两个表中只有一个组合显示绿灯:

如果你正在寻找一个实用的解决方案,你的车队中应该有一辆带小电池(例如 45kWh)的 BEV 以及一辆内燃机** 车辆(例如柴油)。**

为了获得最佳值,BEV 的范围足够的所有路线当然应该用 BEV 驱动。

对于获胜的解决方案,我们自然希望更详细一些,并给出 50 次模拟运行之一的额外关键数字。在下表中,第 1 行显示了汽车“A”(BEV)的汇总,第 2 行显示了汽车“B”(diesel)的汇总。

“成功解决方案”的详细信息。汽车类型,燃料类型,总公里数,汽车天数,平均。每辆车每天行驶的公里数,燃油消耗量和燃油产量的 CO₂,最大行驶天数。1 充电/燃料,CO₂用于汽车生产,CO₂用于电池生产,CO₂总排放量。

可以看出,BEV 行驶了 3293 次,行程 40.6 公里,而 diesel 平均行驶了 530 次,行程 242 公里。

BEV 产生 8.1 吨 CO₂用于汽车生产,6.5 吨用于电池,11.0 吨用于能源供应。总计25.7 吨
柴油则需要 7.6t CO₂用于汽车的生产,尾气和能源供应共 24.0t,总计 31.5t

两个值之和甚至低于 50 次模拟的平均值(59.7t)。这是因为模拟的本质也考虑了散射。

瑞尼尔·卡尔在 Unsplash 上拍摄的照片

摘要

我个人从这项研究中的收获是:

  • 就气候平衡和日常使用的适宜性而言,电动和柴油车辆的组合为我们的场景实现了最佳结果。
  • 100%电动或 100%内燃机都不会产生好的结果。
  • 必须批判地看待大电池的趋势。如果你拥有一个不止一辆车的车队,你有很多优化的选择。装有小电池的 BEV 通常能显著改善气候平衡。

观点

许多参数,如使用的电力组合、燃料消耗等。,可以快速改变。我们不排除在不久的将来用修改的参数更新现有模拟的可能性。

我们还考虑将模拟在线作为一个小型网络应用程序,这样每个人都可以模拟他们自己的场景——从而为他们自己和环境得出最佳的行动建议。

来源

(1)Agora Verkehrswende(2019):Klimabilanz von elektroautoos。einflussfaktoren und Verbesserungspotenzial。

(2) Auke Hoekstra,innovationorigins (2020 年):汽油和柴油的二氧化碳排放量将增加

一个神经网络有多少个神经元?

原文:https://towardsdatascience.com/how-many-neurons-for-a-neural-network-2107627f7869?source=collection_archive---------28-----------------------

让我们看看如何找到神经网络的最佳神经元数量

作者图片

神经网络是机器学习的一个迷人领域,但它们有时很难优化和解释。事实上,他们有几个超参数。要调整的最常见的超参数是隐藏层中神经元的数量。让我们看看如何为我们的数据集找到神经网络的最佳神经元数量。

什么是神经网络?

神经网络是一种特殊的模型,它试图捕捉特征和目标之间的相关性,根据神经元层转换数据集。有几本书是围绕神经网络写的,给你一个这种模型的完整概述不在本文的范围之内。我只能说,神经网络是由几层神经元组成的。每个神经元获得一些输入,转换它们并返回一个输出。一个神经元的输出可以成为下一层神经元的输入,以此类推,构建越来越复杂的体系结构。

第一层称为输入层,由神经元构成,它返回特性本身的值。然后,第一层的每个神经元与隐含层的所有神经元相连,隐含层负责网络的学习能力。隐藏层之后可以是其他几个隐藏层,这是典型的深度学习网络。最后,将最后一个隐藏层的输出提供给给出结果(即目标变量的值)的输出层。

从最简单的形式来看,神经网络只有一个隐藏层,如下图所示。

作者图片

输入层的神经元数量等于特征的数量。根据目标变量定义输出层的神经元数量。这就出现了为隐藏层找到正确数量的神经元的问题。

少数可能会产生欠拟合,因为网络可能无法正确学习。高数值可能会产生过度拟合,因为网络从训练数据中学到了太多东西,而没有进行归纳。因此,必须有一个中间数量的神经元来确保良好的训练。

如何优化神经元的数量

程序非常简单,它使用交叉验证:

  • 设置若干神经元
  • 在 k 倍交叉验证中计算某些性能指标的平均值
  • 用不同数量的神经元重复这个过程
  • 选择在 k 倍交叉验证中使平均值最大化的神经元数量

交叉验证很重要,因为使用它我们可以确保模型不会过拟合或欠拟合。

这个过程非常类似于超参数调整,因为隐藏层中的神经元数量实际上是要调整的超参数。

现在让我们看看如何在 Python 中应用这个过程。

Python 中的示例

在这个例子中,我将展示如何使用 scikit-learn 库优化 Python 中的神经元数量。在现实生活的例子中,您可能会使用 Keras 来构建您的神经网络,但概念是完全相同的。你可以在我的 GitHub 库中找到代码。

我将使用 scikit-learn 中包含的乳腺癌示例数据集。

首先,我们来导入一些有用的库。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.metrics import roc_auc_score

然后,我们可以加载数据集,并将其分成训练集和测试集。

X,y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

现在,我们必须定义我们的模型。对于这个例子,我将使用一个简单的多层感知器,只有一个隐藏层。为了简单起见,构造函数的所有参数都保持标准值。我只是设置了随机状态,以保证结果的重现性。

在将数据集提供给神经网络之前,不要忘记缩放您的要素。为了简单起见,我将使用 scikit-learn 中的 Pipeline 对象,然后应用标准化。关于缩放技术的更多信息,你可以参考我之前的博客文章和我的预处理课程。

model = Pipeline([
                  ('scaler',StandardScaler()),
                  ('model',MLPClassifier(random_state=0))
])

现在,我们必须通过搜索最佳数量的神经元来优化我们的网络。请记住,我们会尝试几种可能的数字,并在交叉验证中计算绩效指标的平均值。最大化这样一个值的神经元的数量就是我们正在寻找的数量。

为此,我们可以使用 GridSearchCV 对象。由于我们正在处理一个二元分类问题,我们要最大化的度量是 AUROC。我们将以 2 为步长从 5 个神经元跨越到 100 个神经元。

search = GridSearchCV(model,
   {'model__hidden_layer_sizes':[(x,) for x in np.arange(5,100,2)]},
   cv = 5, scoring = "roc_auc", verbose=3, n_jobs = -1

)

最后,我们可以搜索神经元的最佳数量。

search.fit(X_train, y_train)

搜索结束后,我们得到最好的平均分数,即:

search.best_score_# 0.9947175348495965

神经元的最佳数量是:

search.best_params_# {'model__hidden_layer_sizes': (75,)}

最后,我们可以在测试数据集上计算这种模型的 AUROC,以确保我们没有过度拟合我们的数据集。

roc_auc_score(y_test,search.predict_proba(X_test)[:,1])# 0.9982730973233008

我们获得的值仍然很高,因此我们非常确定优化的模型已经从它携带的信息中学习了训练数据集。

结论

优化神经网络可能是一项复杂的任务。在本文中,我解释了一种优化神经元数量的可能方法,但同样的概念甚至可以应用于其他超参数(如激活函数、最小批量、时期数、学习速率)。请记住,超参数的数量越多,优化速度越慢。

如果你想了解更多关于神经网络的知识,加入我的 Python 在线课程监督机器学习。

原载于 2021 年 5 月 10 日 https://www.yourdatateacher.com**的

你需要多少样品?

原文:https://towardsdatascience.com/how-many-samples-do-you-need-simulation-in-r-a60891a6e549?source=collection_archive---------23-----------------------

R 中的模拟

在水产养殖中,实验是在装有鱼的水槽中进行的。这些鱼是单独测量的,这是一项乏味而又紧张的工作。我被要求计算一个人需要采集多少鱼的样本才能维持相当于一个完整样本实验的能量

为了检测整体效果,我使用了来自 ANOVAF 值。从这种模型中获得的任何 p 值表明,在包含多个处理的实验中,任何处理之间是否存在任何'显著性'差异。“显著性”的极限通常设置为 0.05,这意味着我们接受每 20 次重复试验中 1 次的 5%1 型错误假阳性率(这里不深入探讨 Frequentist 理论)。

为了尝试回答最初的问题,我收到了一个数据集,其中包含了对各种处理的每缸鱼的观察结果。根据频率理论,我们知道获得显著 p 值的能力——如果真的存在的话——取决于均值、标准差和样本大小。平均值和标准差用于计算处理内的变异系数,以及处理间的效应大小。在这个例子中,效果大小是处理之间的差异,通过标准偏差进行校正。

对于这个练习,我使用了 R 编程语言,但它可以很容易地在 SASPython 或任何其他选择的编程语言中复制。

让我们加载我认为我会需要的库。

然后,让我们导入数据并查看一下。

在这里,您可以看到按治疗和按坦克划分的数据分布。下面的代码显示每个容器包含 35 个观察值。

# A tibble: 12 x 2
   Tank  no_rows
   <fct>   <int>
 1 120        35
 2 121        35
 3 122        35
 4 123        35
 5 125        35
 6 126        35
 7 127        35
 8 128        35
 9 129        35
10 132        35
11 133        35
12 137        35

用于测试当前功率(事后)的模型和度量分别是 ANOVA 和 f 检验。f 检验寻找所有处理之间的差异,以说明在给定假阳性率的情况下,它们是处理之间的差异。

结果、显著性和 F 值显示在下面的代码中。

Call:
lm(formula = gain ~ Diet, data = ARCdata)Residuals:
     Min       1Q   Median       3Q 
-204.067  -48.865   -4.894   45.291 
     Max 
 213.933Coefficients:
            Estimate Std. Error
(Intercept) 290.7048     6.9934
DietB       -12.6381     9.8901
DietC       -15.9836     9.9139
DietD         0.2087     9.9139
            t value Pr(>|t|)    
(Intercept)  41.569   <2e-16 ***
DietB        -1.278    0.202    
DietC        -1.612    0.108    
DietD         0.021    0.983    
---
Signif. codes:  
  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05
  ‘.’ 0.1 ‘ ’ 1Residual standard error: 71.66 on 414 degrees of freedom
  (2 observations deleted due to missingness)
Multiple R-squared:  0.01037, Adjusted R-squared:  0.003198 
F-statistic: 1.446 on 3 and 414 DF,  p-value: 0.2289[1] 0.2288678
[1] 1.445967

为了获得事后功耗分析,我需要查看获得有效 p 值的概率(p < =0.05)。我应用了 bootstrapping(替换重采样)来估计总体均值和标准差(sd)。一旦我有了总体均值和标准差,我就可以模拟 1000 次试验,并观察总体中达到的“功效”。

在下面的代码中,您可以看到总体均值标准差与样本均值和标准差之间的差异结果。这通常被称为“偏差”,给出了样本数据对模拟有用程度的一个很好的近似值。

 120          121          122          123          125 
 0.020574286 -0.086813862  0.085062857 -0.243245714  0.185080000 
         126          127          128          129          132 
-0.052434286  0.195677143 -0.005534286 -0.153240000  0.114102857 
         133          137 
 0.044703253  0.031260000 120       121       122       123       125       126       127 
-1.318715 -1.472052 -1.720122 -1.763247 -1.601380 -1.356375 -1.600663 
      128       129       132       133       137 
-1.624573 -1.583112 -1.250887 -1.307703 -1.889067

然后,我开始模拟 10k 新试验,使用总体均值和标准差,寻找每罐使用 35 个样本时的功效。

apply(x, 2, FUN = power)
V1                39.21

正如你所看到的,结果并不是很好,根据人口值显示了 39%的事后权力。这意味着,在当前实验中发现的效应大小不允许每个鱼缸取样少于 35 条鱼。不会,除非我们能增加差异的影响大小。

为了模拟这种情况,我们需要使用总体平均值、标准偏差、变异系数,并通过增加单次治疗的平均值来扩大效应大小。在这里,我选择了治疗 D(及其坦克 121,126,129)。

print(popcv<-(popsd/popmean))
      120       121       122       123       125 
0.2036404 0.2273521 0.2912939 0.2887722 0.2576816 
      126       127       128       129       132 
0.2100662 0.2421316 0.2734029 0.2557708 0.2290366 
      133       137 
0.2546334 0.2381327

上面的代码很难理解,但是我主要做的是让 R 创建一个数组,在这个数组中,当改变一个效果大小和每个鱼缸中鱼的数量的矩阵时,F 值和 p 值被存储。

上面是一些数据争论,以产生我想要的图表,使用变量'权力',' N ',和' es '。下面是生成图表的代码,如果您看到图表,它应该是不言自明的。

显示模拟结果的图表。变化的变量是影响大小和鱼的数量。曲线并不平滑,因为仅使用了 1000 个样本,这在 i7 上花费了大约 60 分钟。

上图清楚地显示了功效是效果大小和鱼样本数量的函数。为了达到 80%的力量,你需要有一个特定的效果大小,没有多少鱼可以抵消这一点。因此,当设计一个实验时,你需要尽你所能创造必要的效果来从噪音中检测信号。

数学如何帮助控制流行病

原文:https://towardsdatascience.com/how-mathematics-can-aid-in-controlling-epidemics-1dfe986fa806?source=collection_archive---------22-----------------------

分室模型

来源:Fusion Medical Animation 的 Unplash

这总是一个不确定性。我们总是在传染病轮盘赌桌上(威廉·沙夫纳博士)

有了现在的 Covid 19 疫情,我们可以看到沙夫纳博士的上述引用是多么准确。不确定我们什么时候会处于疫情。自古以来,人们就知道传染病会使人虚弱和死亡。霍乱、麻疹、疟疾、埃博拉、登革热和当前的 Covid 19 只是几个例子。

虽然一些疾病可以通过药物、疫苗、减少病媒数量或行为改变来治疗,但找到正确的控制策略来控制问题同样至关重要。当科学家不知疲倦地努力寻找治疗方法时,数学可以在各种情况下提供帮助。了解疾病的传播并控制它是这些领域之一。

本文的重点将放在一个非常基本的模型上,它被称为 SIR。SIR 模型是一种描述传染病动力学的房室模型。

背景

根据维基百科,对房室模型的研究始于二十世纪初,Ross 和 Hudson(1916-17)、Kermack 和 McKendrik (1927)以及 Kendall (1956)在该领域做了大量的关键工作。

与任何其他数学模型一样,在开发基础模型时使用了假设和限制。看到如何从数学上描述这种差异,并用来理解面临约束时的差异,这很有意思。正如我之前所说,这是一个基本模型,许多其他科学家和研究人员在 SIR 的基础上创建了复杂的架构模型,使限制更接近现实。然而,要理解其他模型,需要对这种范式有一个基本的理解。

数学建模

整个种群首先被分成三个部分,称为“可接受的”、“不传染的”、“不传染的”、“被发现的”,这也是这个模型名字的由来。假设该人口规模稳定,没有出生、死亡或移民等事件。

资料来源:作者- SIR 模型

  • 所有可能被这种疾病感染的人。通常在开始的时候,每个人都会受到影响。
  • I 易感染者:
    所有被疾病感染并有能力感染易感者的人。这些人会在特定的时期内康复
  • 发现:
    这些人对疾病产生了免疫力,不再易感。免疫力是由康复的人获得的,他们没有再次脆弱的前景。

我们先定义一些变量。

  • s,I,R :
    分别在易感、感染和恢复隔室中的个体数量
  • a : a > 0
    一个参数,表示一种疾病可以通过一个感染者传播到什么程度。这可以使用诸如接触的可能性、疾病传播的可能性等因素来计算。
  • b : b >0
    一个参数,表明个人在给定的时间范围内,从给定的疾病中恢复的程度。

因为人口在任何给定的时间都是固定的,我们可以说三个隔间里的总人数等于时间 t 时的人口数量。

S(t) + I(t) +R(t) = N

为了更好地了解疾病的动态,正在检查每个房室的变化速度。三个简单的微分方程可以用来表达这一点。

  1. dS/dt = -aSI 因此,我们将 S 乘以 I ,然后乘以上述反映感染率的正常数 a。这个术语变成了负面的,因为随着时间的推移,人们会被感染,S 区会缩小。
  2. dI/dt = aSI — bI 这里增加了从易感人群中以 a 的比率转移出来的新感染者,当他们康复后,由于不能再传染他人而离开感染区。受感染人数越多,离开隔离室的人就越多,所以我们用常数 b 乘以 I,该常数描述了恢复率。当它们离开感染区室时,第二项为阴性。
  3. dR/dt = bI

来源:作者图片:疾病动态图解

如果我们用图表来检验,我们可以观察到,在开始时,每个人都属于易感群体。然后,当他们被感染时,黄色图形开始变淡,红色图形表示受感染人数开始增加。随着人们从感染进展到康复,随着易感人数的减少,感染人数曲线开始下降。

如上所述,疾病传播的动力学可以用数学方法解释和描述。现在让我们来看看在了解动力学之后我们可以推导出的一些信息。

新出现的感染会在人群中传播吗?

答案在第二个等式中,

dI/dt = aSI — bI

为了阻止扩散,第二隔间中的人数应该随着时间的推移而减少。这意味着随着时间的推移,离开第二隔间的人数应该高于进入第二隔间的人数,这意味着即使新的一群人被感染,他们也应该很快离开系统。

来源:作者——传染性是会增强还是减弱

如图所示,如果传染性要降低,ℛ0 应该小于 1。如果不这样,感染将会在人群中传播,人们将不会很快康复。

此外,如果随着时间的推移,易感人群的人数没有减少,疾病就有可能爆发。让我们将易感人群的数量定义为常数 S0。然后,

来源:作者

当微分方程如上求解时,将显示感染计数随着时间呈指数增长。那么这种疾病爆发的可能性很大。

基本复制号

我们上面讨论过的ℛ0,实际上被称为基本再生产数。

**ℛ0 = as/b;**其中 a —传输速率,b —恢复速率

在易感人群中,它被定义为受一个感染者影响的预期人数。因此,如果 R0 小于 1,疾病将不复存在;否则,可能会爆发疾病或流行病。R0 越低越好。

根据 ℛ0 如何采取行动控制疫情

根据上述方程,ℛ0 与传播率和人群中易感个体的数量成正比,但与恢复率成反比。因此,为了保持ℛ0 <1 either a or S should be reduced or b should be increased.

  1. Reducing the transmission rate (a)
    ,假设某种疾病的传播是通过与感染者的密切接触而发生的,并且没有适当的消毒方法。因此,为了控制ℛ0,易感人群必须与其他人保持安全距离,进行适当的消毒活动,或者当局必须隔离感染者或封锁城市以限制传播率。
  2. 减少易感个体的数量
    如果一种药物或疫苗能够产生免疫力,通过增加这些和减少易感人群,就可以减少ℛ0。
  3. 提高采收率(b)
    这是一个较难调整的参数,但通过适当的措施,如果人们继续活着,采收率提高,ℛ0 也可以降低。

拉平曲线

理解疾病动态的另一个关键好处是,如果监控正确,它将防止医疗系统负担过重。如果作出适当的努力来限制感染室的增加,医院床位和 ICU 可以得到有效的控制。如果操作不当,回收率(b)可能会降低,ℛ0 可能会增加。

来源:作者-拉平曲线

当传播率降低时,如通过封锁或任何其他适当的干预,人群中的感染者数量减少,如上图所示。因此,卫生保健行业随时都有资源来应对这一问题。它还将高峰期推迟,让医疗服务提供者有更多的时间做准备。

群体免疫

如果通过适当的干预可以减少 s 室,并且足够多的人对这种疾病免疫,ℛ0 将得到控制,对这种疾病将有抵抗力。当高比例的人口获得免疫时,群体免疫就实现了,使得疾病在人与人之间的传播极其罕见,因此保护了整个人口。

摘要

如上所述,房室模型可用于更好地理解疾病动态,并且当适当建模和改进时,可用于采取适当的行动。在某些情况下,假设群体是封闭的,或所有成员都是易感的,或当恢复时,不会是易感的,可能是不现实的。除了文献中的微分方程之外,还有许多基于此的模型,以及许多其他用于建模疾病的方法。

最重要的是,在将每种方法应用于特定案例或将其用作更全面分析的合适起点之前,要了解每种方法的优势和局限性。

参考

  1. https://www . mayo clinic . org/diseases-conditions/coronavirus/in-depth/herd-immunity-and-coronavirus/art-20486808
  2. https://scipython . com/book/chapter-8-scipy/additional-examples/the-sir-epidemic-model/
  3. https://en . Wikipedia . org/wiki/compartment al _ models _ in _ epidemiology
  4. https://intermountainhealthcare . org/blogs/topics/live-well/2020/04/what-the-difference-a-a-疫情-an-epidemic-地方病-an-outbreak/

微学习如何帮助您在每天不到 10 分钟的时间内提高数据科学技能

原文:https://towardsdatascience.com/how-microlearning-can-help-you-improve-your-data-science-skills-in-less-than-10-minutes-per-day-6499348228d7?source=collection_archive---------5-----------------------

这种电子学习趋势可用于高效满足您的数据科学目标

斯里兰卡在 Unsplash 拍摄的照片

现在,赞美某人的注意力像金鱼一样集中是合理的。

人类曾被认为是注意力持续时间为 12 秒的优等种族,过去 15 年的研究显示人类的平均注意力持续时间下降到了 8.25 秒。

金鱼的注意力持续时间是 9 秒。

人类平均每小时查看收件箱 30 次,每周拿起手机超过 1500 次(每天使用 3 小时 16 分钟),平均只阅读网页上 28%的单词,可以肯定地说,作为一个物种,我们很容易分心。

这种容易分心的性质很难转化为对复杂主题的研究,例如与数据科学相关的主题。

传统的学习方式不再是一种选择。进入小额学习。

什么是微学习?

微学习是一种电子学习和教学设计趋势,指的是一种教育方法,它使用小型学习单元来提供学习者实现目标所需的适量信息。

微学习是一种有效的转变,它远离了整天的课程和枯燥的 PowerPoint 演示,这些课程和演示会让参与者在头两分钟就打瞌睡。相反,我们的目标是提供小型课程,仅涵盖 1-2 个主题,可在 10 分钟内完成。

根据发表在《应用心理学杂志》上的一项研究,微学习比传统学习方法效率高 17%。这种提高的效率来自于学习者只需要消化小块的信息,这提高了主题的记忆和理解。

由软件咨询进行的一项研究发现,微学习还创造了 50%以上的学习参与度。这种参与度的提高来自于与人类注意力持续时间相匹配的学习课程的实施。

微学习的使用对数据科学学习体验有何益处?

简而言之,数据科学的研究是一个漫长而艰巨的过程。再加上需要成为一个拥有编程、数学、机器学习、人工智能、商业头脑等技能的全面发展的个人,通往数据科学的旅程往往没有被看透。

数据科学就像高尔夫。你可以花一生的时间去掌握它,但你只会触及皮毛。

因此,学习过程必须尽可能地快速和有效。不,这并不意味着走捷径,在你的知识中留下基础漏洞,以便更快地找到“好”的东西。这意味着将复杂的主题分解成小的课程,在这一天结束时,你已经学习了 1-2 个主题,产生了 4-5 个收获。

小额学习适合谁,不适合谁。

对于使用微学习来研究数据科学,有一点需要注意。

对于那些已经具备数据科学技能基础的人来说,微学习是一种有益的学习工具。为什么?因为使用微学习方法学习数据科学的基础需要几十年的时间。那些希望过渡到数据科学的人通常会在给定的时间内这样做(通常是在他们的安全网耗尽之前)。因此,每天只花 10 分钟学习概念会让你在 6 个月的学习后只知道数据科学的基本框架。

**这种学习方法适用于:**已经具备数据科学基础知识,并且希望通过学习更复杂的主题来提高技能的人。这些人已经可以进行基本的数据分析,可以编写代码,并可以应用他们的发现来解决业务问题。对于专业人士来说,这种学习方法是一种很好的方式,可以在不中断日常工作的情况下,每天抽出 10 分钟来提高他们在特定主题上的技能。

**这种学习方法不适合:**完全是数据科学新手的人。这种学习方法可以与更传统的学习方法一起使用,以补充更复杂的主题。

如何利用微学习提高数据科学技能?

为自己建立微学习模块可能比登录 MOOC 或观看 Youtube 视频需要更多的时间,但结果可以在更短的时间内产生巨大的改善。

如何设置您的个性化小额学习模块:

  1. 留出专门的时间来计划你的内容:要想成功地制定一个小额学习计划,你需要在这个过程中投入时间。几个小时就能决定你想学什么,以及你打算怎么学。
  2. **列出你想学的概念:**这个列表将为你的模块设定框架。例如,如果你想学习 NLP,列出所有与 NLP 相关的概念。将它们分解成单独的部分,或者将它们组合成小的逻辑模块。
  3. **确保微学习过程适合每个概念:**有时,微学习不足以学习深入的概念。例如,通过微学习无法学习完整的基本统计数据,因为需要更深入和长期的研究。测试一个概念是否适合小额学习的一个好方法是确定你认为学习这个概念需要多长时间。如果花费的时间超过 1 小时,可能不是为了小额学习。
  4. 削减脂肪:微学习就是在短时间内学习少量的信息。这意味着你必须把内容精简到最低限度。包括你需要的一切,没有你不需要的。
  5. 确保每个模块或课程都有一些要点,并且只涵盖 1-2 个目标。想要把所有东西都加入到课程中会变得很容易,尤其是当它涉及到你感兴趣的话题时。然而,这些必须保持微经验,以确保你得到微学习的全部效果。如果你的课回答了 1-2 个问题,那太好了!如果它回答更多,尝试进一步分解内容。
  6. **如果没有效果,不要把自己局限在 10 分钟的课程中:**有时候,不管你减掉多少脂肪,一个概念不会浓缩成 10 分钟的课程。在这种情况下,不要限制自己。如果课程长度少于 20 分钟,请按原样完成,或者考虑分成两节课。
  7. **利用多媒体让事情变得有趣:**看课本很无聊。看个视频就不是了。选择有趣的媒体,让你参与其中,增加学习体验。
  8. **使用微评估来评估你的进步:**小测试和小测验是评估你在学习这些主题方面的进步的好方法。简单测试的例子包括但不限于在 HackerRank 或 Kaggle 上完成一个编码挑战,或者花 10 分钟写下你对某个主题的所有了解,并将你写的内容与你对该主题的笔记进行比较。

微观学习之后是微观实践。

没有微观实践,微观学习就什么都不是。

采用新技能需要实践,而不是简单的死记硬背。使用微学习来学习数据科学概念也不例外。

诀窍是将微学习模块与微实践课程配对,微实践课程使用在更实际的情况下学到的确切技能。例如,如果您刚刚完成了 NLP 中关于标记化的微学习模块,那么您应该完成一个微练习,在该练习中,您获取一个运行文本的数据集,并将其分割成句子和单词,也称为标记。

微实践可以简单到在 HackerRank 或 Kaggle 上完成一个编码挑战,也可以复杂到在你自己的个人项目中实现你的新技能。

无论是哪种类型的实践,10 分钟的微观实践会议应该在完成微观学习模块后进行,以巩固你的新知识。

最后的想法。

当谈到学习数据科学时,必须使用书中的每一个技巧才能取得成功。这意味着利用一切可能的学习形式,确保你充分利用时间,学习必要的概念,以便在这个以结果为导向的行业中变得更加有效和有影响力。

通过探索不同的学习方法,你会有最好的机会掌握一个无法掌握的知识领域。

对于一个注意力跨度比金鱼还小的物种来说,我们需要所有我们能得到的帮助。

《扫雷》如何让我们以不同的方式思考数据

原文:https://towardsdatascience.com/how-minesweeper-can-make-us-think-differently-about-data-439b31db8cc6?source=collection_archive---------22-----------------------

我们生活在一个不确定和信息不完善的世界

资料来源:矿业(LTS Ubuntu 18.04)

业余时间经常喜欢下棋扫雷(对,别笑)。

这两款游戏中,我一直觉得扫雷比较难懂,游戏规则一直显得很不透明。

然而,后一个游戏更类似于现实世界中的情形。这就是它与数据科学相关的原因。

完美信息与不完美信息

相比之下,在国际象棋中,不管一个人的游戏能力如何,所有的玩家在任何时候都有完美信息

一个人总是可以看到棋盘上的每一个棋子,而且任何一方都不拥有相对于另一方的任何信息优势(除了从玩游戏的经验中获得的潜在知识)。

出于这个原因,人工智能被广泛用于训练计算机在国际象棋中获胜。这在 1997 年被证明是成功的,当时一台 IBM 超级计算机被训练击败特级大师加里·卡斯帕罗夫。

从这个例子很容易推断出,人工智能模型可以被训练来潜在地解决这个世界上呈现给我们的任何给定问题。然而,事实并非如此——因为人们总是在一个信息不完全的世界里工作

当一个人考虑扫雷游戏时,不完善的信息总是围绕着我们。总的来说,在某些方格中有一系列的地雷。点击地雷意味着玩家自动输掉游戏。当开始游戏时,没有办法知道哪些方块是可疑的,哪些不是。一个人必须简单地点击一个给定的方块,然后期待最好的结果。

假设一个人继续玩游戏,某些方格会给出一个指示,指出哪里可能有地雷**。例如,一个数字为 1 的方块表示在原来的方块周围有一个有地雷的方块。然而,没有人知道这是哪一个方块。**

在这方面,《扫雷》是一款比国际象棋等游戏更能反映真实世界的游戏。

无论收集了多少数据,都不可能收集到 100%的数据来解释结果变量的变化。

即使这是可能的,解释这种变化的参数在未来也总是会改变的。就这一点而言,昨天非常有效的模式明天可能就不那么有效了。

所以,当面对不完美的信息时,每个决定都归结为一个概率。我们无法确切知道在决定一个特定的结果时会发生什么,但我们可以给它分配一个概率。****

例如,围绕数字 1 的方块比围绕数字 3 的方块风险小——现在后一个方块周围有三个地雷。最好避免点击那些方块!

强化学习

有趣的是,强化学习在过去曾被用来试图训练人工智能在扫雷中获胜。sdlee94 的一个例子在这里。

虽然我不太熟悉算法如何工作的细节,但作者确实指出,任何被归类为猜测的举动都会得到负面奖励,因为目标是训练计算机通过逻辑和概率揭示安全方块。

也就是说,根据结果,神经网络仍然需要超过 60,000 场训练才能达到 10%以上的胜率。

当涉及到不确定性时,即使深度神经网络在做出正确预测的能力上似乎也是有限的。即使负面结果(在这种情况下,落在一个正方形上)发生的概率很低——只要尝试足够多,它仍然会发生。

概率的重要性

在这点上,我怀疑数据科学将逐渐发展,更少依赖准确性**,更多依赖**概率。****

例如,训练模型的经典方法包括训练-测试分离,即首先使用训练数据训练和验证模型,然后通过测试集来测量准确性。

但是,较高的验证和测试分数仅表明该模型在这两个数据集上显示出较高的预测准确性。即使使用了交叉验证——该模型在能够表明它与新信息的配合程度方面仍然是有限的。

模拟分析

由于这个原因,我预见更多的重点将放在模拟分析上。例如,假设有人试图预测一家公司一段时间内的收入。正在讨论的时间序列有一个固定的均值和标准差。

我们对这个时间序列进行 10,000 次模拟,同时人为增加标准差,怎么样?在这种情况下,先验模型有多准确?

从这个角度来看,人们将会更好地了解模型在什么情况下可以表现良好,在什么情况下表现不佳。

事实上,人们可以进一步发展这一想法,用不同的参数通过模拟数据训练几个模型。根据企业可能面临的潜在情况,可以在概率基础上配置不同的模型,以便在不同的环境中进行预测。

事实上,这正是贝叶斯分析的基础,我怀疑这一领域会越来越受欢迎。

结论

尽管可以访问的数据比以往任何时候都多,但重要的是要记住现实世界是不确定的、易变的和不完美的。

当面对不完美的信息时,我们唯一能做的就是利用我们仅有的一点点信息来给不同的结果分配概率。

不仅在扫雷游戏中如此,在我们面临的几乎所有复杂的现实世界场景中也是如此。

ML 与 AI 的关系

原文:https://towardsdatascience.com/how-ml-relates-to-ai-95a4f2e2c9cf?source=collection_archive---------25-----------------------

迈克尔·泽兹奇在 Unsplash 上的照片

机器学习(ML)如何融入人工智能(AI)的奇妙世界?

人工智能

让我们从陈述 AI 到底是什么的简单定义开始:

表现 的计算机智能地 自主地 ,与计算机做它们被告知的事情

几十年来,软件工程师一直在构建专家系统:严格约束的、基于规则的软件解决方案,能够很好地完成单一任务。

这没什么不好!在许多情况下,这是正确的答案。考虑更新电视的固件。你可以通过设置菜单按需寻找它,或者让电视偶尔寻找它,但这是一个最好用传统技术解决的问题。它不需要智力

现在想想开着车在大城市转悠:那个需要智能!在人工智能兴起之前,我们在无人驾驶汽车方面进展缓慢。

人工智能的类型

那么 AI 的类型有哪些呢?有三个。

第一种是 窄 AI :思考高度集中。苹果 iPhone 上的 Siri 对与电话相关的任务很有帮助,但你可以试着问它“为什么我的伴侣今天对我很生气?”。不会有太大帮助。

垃圾邮件与垃圾邮件过滤器:你上一次设置垃圾邮件规则是什么时候?你没有,AI 本质上已经解决了那个问题。

脸书的人脸识别——非常专注,非常准确——但如果你试图用它来驾驶无人机,底层的 ML 实现将毫无用处。

这就是 狭义 的意义所在:在有限的环境中提供极具性能的人工智能解决方案。

下一个类型是 一般 AI——想想那种可以媲美人类能力的智能。现在还不存在。

人类适应眼前挑战的能力强调了我们智力的敏捷性和灵活性。如果你和我需要学开叉车,我们可以。如果我们需要掌握驾驶无人驾驶飞机,我们可以。这种可以针对各种各样任务的广义智能在 AI 中还没有实现。

最后一类 AI 是 超级 AI——现在我们说的是那种我们只能推测的智能,既然超过了我们自己。

一般的人工智能必须首先在这种类型之前实现——对这可能需要什么的猜测导致了许多激动人心的科幻书籍和电影。

底线:我们没有想法。我们不会创造它——一般的人工智能计算机会。

机器学习适合在哪里?

作者图片

因此,如果我们有 3 种类型的人工智能,机器学习在哪里?

机器学习是一种类型的 狭义的AI:它是专门打造的*,专注于相对小范围的任务。*

记住: 狭义AI是目前仅存的类型的 AI,我们沉浸其中的所有技术奇迹都是机器学习带给我们的。**

为什么是机器学习?

因为它解决了传统方法无法解决的问题

正如我们已经讨论过的,传统的软件技术已经无法破解某些难题。这些往往是机器学习大放异彩的领域。

ML 不是所有问题的解决方案——但它经常是以前的技术失败或不足的解决方案。

记住这句格言:“对拿着锤子的人来说,每个问题看起来都像钉子”。不要选择 ML——在很多领域,传统技术是正确的答案——并且将继续是正确的答案。

什么是机器学习?

大数据+算法=模型

通过筛选堆积如山的数据进行学习并让更智能*完成任务的功能是机器学习模型**。这个训练过的模型然后可以被部署,并在它暴露给新的数据时发挥作用。***

传统软件不是这样的——它不会随着暴露给更多数据而进化——它只是盲目地遵循设计时的规则。

例如,在机器学习中,你可以神经网络(这是一种类型的算法)提供大量的狗和猫的图像,然后获取该模型并将其部署到云**(如微软 Azure、谷歌云平台 GCP 或亚马逊网络服务 AWS)——然后向该模型呈现一张新的图片,并询问它是否看到了一只狗或猫。使用以前的技术,这种功能本质上是无法解决的。**

机器学习擅长什么?

替换需要大量微调或涉及一长串规则的现有系统

如果你有一个现有的软件系统,它需要不断的调整或者涉及到一系列的规则——你可能会有一个好的候选人。当维护系统的持续成本很高时,这可能是 ML 可能更适合的良好指示。

复杂的问题(想语音识别、缺陷识别等。)传统解决方案已经失败

有许多传统技术无法解决的现实世界问题。机器学习填补了这些缺口*,为我们正在经历的惊人进步提供了动力。***

动态、波动的环境需要不断适应新数据

根据定义,处于高度变化状态的问题(想想不断发布的需要分类的新图片)通常最适合 ML 解决方案。

从大量数据中洞察复杂关系

当数据很小时,数据模式很明显(想象一个有 100 行的电子表格)。随着数据量的增长(想象一下有一百万行的电子表格),很快就不可能发现模式或趋势。ML 技术在这个领域表现出色。

ML 的三个主要分支

作者图片

回到我们关于狗和猫图像的例子——这将是一个属于 监督 学习的 ML 模型:算法是用数据训练的*,数据被给出正确的答案(因此得名监督)。*

无监督 学习涉及算法筛选没有答案的数据。网飞使用的推荐系统是这种 ML 实现的一个很好的例子——算法正在查看观众的流媒体习惯,并识别相似性,通过这些相似性他们可以做出未来的推荐。因此,他们将用户聚集在一起,并根据历史流媒体习惯提出明智的建议。

强化 学习在游戏界众所周知:一个在环境中运行的软件代理**进行观察*,采取动作,并接收反馈(可能是正面的或负面的)。目标是随着时间的推移,通过反复试验学会最大化正向反馈。现实世界中的应用比比皆是:游戏(当然)、机器人、智能家居设备(比如 Nest 恒温器)和自动股票交易——这只是其中的几个例子。*

结论

到目前为止,您应该对以下主题的电梯演讲感到满意了:

  • 什么是 ML?
  • 你为什么要在乎?
  • 它和人工智能有什么关系?

您的 Google Analytics 仪表盘中丢失了多少数据?

原文:https://towardsdatascience.com/how-much-data-is-missing-from-your-google-analytics-dashboard-20506b26e6d?source=collection_archive---------30-----------------------

利用自托管分析平台发现缺失数据。

米利安·耶西耶在 Unsplash 上拍摄的照片

随着许多网站采用更智能的广告方法,广告拦截器变得越来越突出。2020 年 Q2 的一项研究表明各年龄段超过 40%的互联网用户使用某种形式的广告拦截器。

广告拦截器不仅可以拦截广告,还可以通过拦截脸书和谷歌分析等跟踪标签来保护用户的隐私。uBlock Origin 等应用程序默认情况下会启用跟踪保护,而 AdBlock Plus 等其他应用程序可以轻松打开该设置。这给希望分析和理解用户数据的开发人员带来了一个潜在的问题,因为他们可能没有看到全貌。

测量缺失数据

我目前维护着两个基于网络的应用程序,每个都有超过 5000 个月的用户,我将用它们来测试丢失的数据。在这个实验中,我用一个名为 Umami 的自托管分析解决方案建立了一个并发分析服务。这是一个私有的、开源的 Google Analytics 的替代品,你可以在这里了解更多。由于鲜味是自托管的,广告拦截器不会阻止收集分析。这将为我们提供数据的完整视图。我用一些最流行的广告拦截软件测试了这一点,并确认它们都没有阻止鲜味记录数据。

在 Vercel 和 Digital Ocean 上设置了我的鲜味实例并离开网站一个月后,我比较了这两个服务报告的数据。

比较结果

在查看报告的数字之前,了解这两个网站的流量背景会有所帮助,因为广告拦截软件的受欢迎程度因人群而异。

网站#1

要分析的第一个网站是一个基于 web 的 Reddit 客户端,它使用了媒体接口。根据谷歌分析,该网站大约 95%的流量来自有机搜索。这可能是因为用户想要浏览 Reddit,但更喜欢不同的界面。

图片作者。第一个网站 Reddium 的每周页面浏览量和用户数据

从页面浏览量、用户和跳出率来看,我们发现这两种服务之间存在差异。Umami 的每周用户数增加了 19%,每周页面浏览量增加了 23%。这是一个明显的差异,不能仅仅归因于不同的方法,导致开发人员对他们看到的分析体验到不同的流量负载。

为了证实这种差异,我们可以尝试比较两种服务的人口统计数据。由于桌面广告拦截器的流行和 Firefox 上增强的跟踪保护,我们可以预期在 Google Analytics 上看到更少的桌面和 Firefox 用户。

图片作者。第一网站的用户设备数据

从设备数据来看,很明显,桌面用户是我们的谷歌分析数据中缺失的用户。数字也显示了这一趋势,移动用户的数量在这两种服务中保持不变,而桌面用户的数量则高出 40%。

图片作者。第一个网站的 Umami(左)和 Google Analytics(右)用户浏览器数据

在浏览器数据中,我们可以看到,在谷歌分析和 Umami 之间,Firefox 用户几乎增加了两倍,而其他浏览器略有增加。这证实了这两种服务之间的数量差异可能归因于广告拦截器。

网站#2

第二个网站是一个与你的 Spotify 账户相关的音乐测验。根据 Google Analytics,流量获取在直接、推荐、有机搜索和社交之间平分秋色,每个来源各占 20-25%

图片作者。第一个网站:Whisperify 的每周页面浏览量和用户数据

用户和页面浏览量数据显示了与第一网站相同的趋势,Umami 记录的页面浏览量和用户数多了约 30%。页面浏览量的差异遵循类似的模式,我们可以看到设备和浏览器数据进一步证实了这一点。

图片作者。Umami(左)和 Google Analytics(右)的用户设备和浏览器数据

观察

我们的比较表明,谷歌分析丢失了 15%到 25%的有价值的用户数据。随着越来越多的人熟悉跟踪保护,这一比例在未来可能会增加,但在收集用户数据时,这是一个需要记住的好数字。

当然,这只是一小部分有特定目标受众的网站。这两个网站都与社交应用相关,如 Reddit,其目标人群可能会使用广告拦截器,因此针对普通公众的网站的缺失数据可能比我们观察到的要少。

针对不同平台的网站也会影响谷歌分析中丢失的数据量。如果你的目标人群是移动用户,那么与针对使用 Firefox 的桌面用户的网站相比,你可能只丢失了少量的数据。

摘要

在这篇文章中,我们:

  1. 找到了谷歌分析的自主替代方案
  2. 比较两个网站的两个分析服务之间的分析数据
  3. 已确定的用户群更有可能从 Google Analytics 中消失(桌面和 Firefox 用户)
  4. 查看了观察中的潜在偏差,以及谷歌分析可能拥有更完整数据的情况

结果提供了相当多的信息。在大多数情况下,谷歌分析应该能够报告大约 80%用户的趋势。但是,在某些情况下,可能会收集更多或更少的数据。随着广告拦截器越来越受欢迎,像 Umami 这样的自托管替代产品可能是一条出路,因为它可以收集所有可用的数据,并让您更好地控制自己的数据。

资源

  • 谷歌分析
  • 鲜味

奥运会要花多少钱?

原文:https://towardsdatascience.com/how-much-do-the-olympics-cost-ef0170bc71f7?source=collection_archive---------16-----------------------

迄今为止最昂贵的奥运会是 2014 年索契奥运会。东京 2020 将改变这一点

亚历山大·布齐尔和丹尼尔·伦恩

来自 Pixabay 的大卫·马克的图片

下表 1 显示了 1960-2016 年奥运会的实际体育相关费用,以及每届奥运会的赛事数量和运动员人数。在 1960 年至 2016 年的 30 届奥运会中,有 25 届获得了产出成本数据。应当提及的是,在编制表格时,2016 年里约夏季奥运会尚未举行。因此,这些比赛使用了初步数据。*

来源:作者,https://bit.ly/2ZBaQSI

迄今为止最昂贵的夏季奥运会是 2012 年伦敦奥运会,耗资 150 亿美元。最昂贵的冬季奥运会,2014 年索契冬奥会耗资 219 亿美元

迄今为止最昂贵的夏季奥运会是 2012 年伦敦奥运会,耗资 150 亿美元,1992 年巴塞罗那奥运会耗资 97 亿美元。对于冬奥会来说,索契 2014 年冬奥会耗资最大,为 219 亿美元;2006 年都灵冬奥会耗资 44 亿美元,位居第二。成本最低的夏季奥运会是 1964 年东京奥运会,耗资 2.82 亿美元;最便宜的冬季奥运会,1964 年因斯布鲁克冬奥会,2200 万美元。必须提及的是,这些数字中不包括城市和交通基础设施的更广泛的资本成本,而这些成本通常是巨大的。

1960 年至 2016 年夏季奥运会的平均成本为 60 亿美元。同期冬奥会的平均成本为 31 亿美元。冬奥会平均成本和中值成本之间的巨大差异主要是由索契 2014 年冬奥会 219 亿美元的异常值造成的。事实上,即使与夏季奥运会相比,2014 年索契冬季奥运会也是有史以来最昂贵的奥运会。这是非同寻常的,因为冬季奥运会的成本通常比夏季奥运会低得多,冬季奥运会的平均成本不到夏季奥运会平均成本的一半。

冬季奥运会的成本通常比夏季奥运会低得多,冬季奥运会的平均成本不到夏季奥运会平均成本的一半

图 1 显示了 1960 年至 2016 年成本的发展情况。趋势线表明,游戏的成本随着时间的推移而增加。然而,这种明显的增加在统计上并不显著。因此,从统计角度来看,我们可以说成本不会随着时间的推移而增加或减少,这可能会随着东京 2020 年奥运会成为有史以来最昂贵的奥运会而改变..

图 1:1960 年至 2016 年的奥运成本时间序列

来源:作者,【https://bit.ly/2ZBaQSI

表 2 显示了 1960 年至 2016 年的每项赛事成本和每位运动员的成本(以 2015 年美元计)。这些数据适用于 1960 年至 2016 年的 30 场比赛中的 25 场。夏季奥运会每项赛事的平均成本为 2240 万美元(中位数为 1970 万美元)。冬季奥运会为 3920 万美元(中位数为 2950 万美元)。—2012 年伦敦奥运会的每项赛事费用最高,为 4950 万美元,其次是巴塞罗那,为 3770 万美元。对于冬季奥运会,索契的每项费用最高,为 2.234 亿美元,其次是 2006 年都灵冬奥会,为 5200 万美元。我们再次看到 2014 年索契冬奥会是一个异数。最低的单项成本是 1964 年东京夏季奥运会的 170 万美元和 1964 年因斯布鲁克冬季奥运会的 60 万美元。

来源:作者,【https://bit.ly/2ZBaQSI】T4

就每位运动员的成本而言,我们发现冬季奥运会的成本大约是夏季奥运会的两倍。夏季奥运会每位运动员的平均费用为 70 万美元(中位数为 60 万美元),冬季奥运会为 130 万美元(中位数为 100 万美元)。然而,这种差异在统计学上并不显著。夏季奥运会每位运动员的最高花费是 2012 年伦敦奥运会的 140 万美元,其次是 1980 年莫斯科奥运会的 120 万美元。冬奥会每位运动员的最高费用是索契 2014 年冬奥会的 790 万美元和都灵 2006 年冬奥会的 170 万美元。1964 年东京夏季奥运会的运动员人均费用最低,为 55,000 美元,1964 年因斯布鲁克冬季奥运会为 20,000 美元。

夏季奥运会运动员人均花费最高的是 2012 年伦敦奥运会,为 140 万美元冬奥会是 2014 年索契冬奥会,每位运动员 790 万美元

图 2 显示了每个运动员的花费与时间的关系。我们看到了一个趋势的转变,从夏季运动员的人均成本通常高于冬季奥运会,直到 20 世纪 80 年代中期,冬季奥运会在人均成本方面变得比夏季奥运会更昂贵。我们还看到,从 20 世纪 80 年代中期到 21 世纪初,夏季奥运会每位运动员的成本普遍下降,此后,夏季和冬季奥运会每位运动员的成本一直在上升,主要受 2012 年伦敦奥运会和 2014 年索契奥运会的推动。然而,总的来说,无论是夏季奥运会、冬季奥运会还是所有的奥运会,随着时间的变化在统计上都是不显著的。

图 2:1960 年至 2016 年奥运会运动员人均体育相关成本的时间序列,包括和不包括索契 2014 年奥运会

来源:作者,https://bit.ly/2ZBaQSI

— — — —

*)有关完整的故事,包括参考资料和注释,请参见 Flyvbjerg、Bent、Alexander Budzier 和 Daniel Lunn,2021 年,“回归尾部:为什么奥运会吹了”,环境与规划 A:经济与空间,第 53 卷,第 2 期,第 233-260 页。免费 pdf 在这里:【https://bit.ly/2ZBaQSI

你在咖啡上真正花了多少钱?

原文:https://towardsdatascience.com/how-much-do-you-really-spend-on-coffee-9f1edebc8ef8?source=collection_archive---------27-----------------------

这是我的故事,关于使用数据分析和可视化来证明我丈夫是错的

自从我们结婚以来,我丈夫和我就一直在为他在菲尔茨咖啡的开销争论不休。不要误解我,菲尔茨咖啡非常棒,但我们正在进行的辩论需要解决。为了解决这场争论,我求助于数据。

作者图片

首先,我必须通过菲尔兹咖啡应用获取我丈夫的菲尔兹咖啡应用使用数据(当然要经过他的允许!).根据《加州消费者隐私法》,加州人可以在使用移动应用程序时要求收集数据。请求数据后,大约需要 30 天才能返回带有数据集的请求。返回的数据集包含 2018 年 5 月至 2021 年 10 月的用户数据。

然后,我将数据集加载到 R-studio 中,看看当用户通过应用程序点咖啡时,应用程序会收集什么样的信息。通过应用程序收集的信息类型包括商店位置、订单时间/日期、提货时间/日期和总交易金额。数据集还包括两个单独的税和小费列,但这些列返回 0,并且税和小费值已经包含在总交易金额中。

原始数据集格式和列标题

我还想使用订单时间/日期和提货时间/日期列,按商店位置分析我丈夫等待咖啡的平均时间。然而,这被证明是困难的,因为该应用程序允许将提货时间设置为未来更晚的时间。例如,可以在上午 8:00 下订单,在上午 10:00 提货。这将显示为订单时间和提货时间之间的两小时“等待时间”,并不一定反映订单的准确“等待时间”。因此,我决定从这个分析中排除这些列。

我首先通过安装几个包来执行数据清理,包括' tidyr ',' dyplr '和' tidyverse '。

### INSTALL PACKAGES AND LOAD LIBRARIES
install.packages("readr")
library(readr)
install.packages("tidyverse")
library(tidyverse)
install.packages("dplyr")
library(dplyr)
install.packages("tidyr")
library(tidyr)

我删除了与分析计划无关或为空的行,重命名了列标题以更好地描述列中的内容,并删除了任何包含缺失值的行。我还将包含数值的字符列重新格式化为数字列。

# Drop row 1 through 6 and 116
df <- (df %>% slice(-c(0:6,121)))# Rename column headers
colnames(df) <- (c("Store", "OrderCreationDate", "ReservedPickUpTime","Status","Subtotal", "Tip", "Taxes"))# Drop first row with column names and relabel column headers with column names
df <- (df %>% slice(-c(1))) # Remove rows with missing values 
df <- na.omit(df) # Change variable from character to numeric
df$Subtotal <- as.numeric(df$Subtotal)

出于这个项目的目的,我非常依赖于商店位置列、总支出列和订单日期列。在原始数据集中,日期和时间信息存储在一个单元格中。我将这些数据分成两个单独的列,一列是日期,另一列是时间戳。我这样做是因为出于前面提到的原因,我不会依赖时间信息来进行分析。

# Split date and time into two columns
df$OrderCreationDate <- data.frame(do.call("rbind", strsplit(as.character(df$OrderCreationDate),' ', 2)))

我还创建了一个新列,将每个商店位置与其各自的邮政编码关联起来。这个额外的列将有助于在地理上映射商店位置,以便在地图上可视化数据。

最后,我将清理后的数据集放入 Google Data Studio,创建一个仪表板来可视化数据。该控制面板具有向下钻取功能,允许用户按位置或日期对数据进行切片和切块。完整的交互式仪表盘可在这里找到。

点击此处通过 Google Data Studio 访问完整的交互式仪表盘。Dashboard 是实时的,可能不会反映这篇静态博客文章中的内容。

这个项目的一个关键发现是,从 2021 年 1 月 1 日到 2021 年 10 月 26 日,我丈夫在菲尔茨咖啡消费了 523.95 美元。数据证实,菲尔茨库比蒂诺大街是和菲尔茨一起放松的首选地点。

这开始于一场关于我丈夫的 Philz 支出和我证明他是错的动机的辩论。而是变成了一个有趣的数据分析和可视化项目。由于他将继续成为菲尔茨的常客,我希望收集足够的数据点来建立对他未来行为的预测模型。那段未完待续…

要查看我的原始数据集、Rstudio 代码和清理后的数据集,请查看我在 GitHub 上的 Philz Coffee 数据报告。

语言模型的参数中可以包含多少知识?—摘要

原文:https://towardsdatascience.com/how-much-knowledge-can-you-pack-into-the-parameters-of-a-language-model-a-summary-fed633a092b6?source=collection_archive---------22-----------------------

理解“存储”在语言模型中的隐性知识

TL;博士;医生

语言模型已经显示出从用于预训练的数据中隐含地记住信息的能力。Roberts 等人(2020)的这篇论文试图对其进行量化,并展示了隐性知识的规模如何随模型大小和训练时间而变化。

非常感谢 Sundeep Teki 的反馈,以及帮助我写这篇博客!

介绍

Patroni 等人(2019)最近的工作显示了语言模型如何从用于预训练的数据中构建内部知识库。在 Roberts 等人(2020)的论文中,作者试图通过“*闭卷问答”来理解这一现象。*与最近在问答(QA)领域的工作不同,作者没有向模型共享任何上下文或外部知识源来回答问题(因此得名——闭卷问答)。在本文中,作者着重于使模型查找它们的参数,以获得预训练时存储的信息。此外,作者还探索了这种行为在缩放模型大小(参数数量)或训练数据(这两者都已被证明可以提高下游任务的性能)时如何变化。

T5 模型和预训练/微调阶段。在这里,本文作者让 T5 从其知识中回答问题*!(* 来源 )

背景

**问题回答:**通常为模型提供外部信息源,以查找与问题相关的细节。这些问题可以是历史事实、可以从外部来源解释的信息等。这种问答被称为“开卷问答”。在这个过程中,期望模型输出文本的跨度(范围/坐标)或文本本身。

这个任务的一个更简单的版本是,代替一个完整的“外部知识源”,模型也提供有一个特定的上下文输入。这里,模型可以学习从输入的上下文中“查找”答案,而不是在庞大的外部语料库中搜索。这个版本的问答被称为阅读理解。

在这篇论文中,作者针对一组他们称为*闭卷问答的更具挑战性的问题。*在这里,模型应该学会在自身内部寻找答案的记忆内容,而不是作为上下文或大型外部语料库的甲骨文文本。

**迁移学习:**大规模语言模型在大型无标签数据语料库的预训练帮助下,表现有所提高。这种预训练步骤被认为是以无人监管的方式为模型提供语言信息或某些“世界知识”。最近流行的迁移学习模型是从 Transformers (Vaswani 等人,2017 年)衍生而来的,一种特殊的仅编码器的 Transformers(类似于 BERT (Devlin 等人,2018 年))在问答系统中很受欢迎。这是由于这样一个事实,即通常使用上下文输入或外部知识库来尝试问题回答,其中编码器模型被期望预测将具有答案的单个标记。

虽然,这对于闭卷问答来说是不可能的,因此作者使用了一个称为 T5(文本到文本转换转换器)的框架,该框架将每个问题建模为文本到文本的问题(Raffel 等人,2019)。也就是说,模型不是提取信息,而是生成信息。

实验

**数据集:**该研究着眼于 3 个数据集,即——自然问题(科维亚特科夫斯基等,2019);网络提问(Berant 等人,2013 年);TriviaQA (Joshi 等人,2017 年)。论文只利用了数据集中的问题,而*忽略了附带的匹配文档。*此外,TriviaQA(拥有私有测试集)的所有结果都是通过提交给排行榜获得的。

**训练:**作者利用 T5 模型(Raffel et al .,2019);T5 没有在问答数据集上进行预训练。此外,性能是作为模型大小的一个因素来衡量的——基础模型、大型模型、3B 模型和 11B 模型。此外,还基于 T5.1.1 检查点报告了结果,这些检查点仅根据未标记的数据进行了预训练。验证是在数据集的预留 10%上完成的,其中使用了从 90%的训练中获得的最佳性能检查点。通过在每个时间步选择最可能的标记来选择模型的预测。

**显著跨度掩蔽(SSM):**Guu 等人(2020)提出的掩蔽较长短语(包括命名实体、日期等)的方法已证明可在基于 BERT 的模型中实现更好的性能。在本文中,作者以类似的方式用 100k 个额外步骤微调 T5 模型。

**结果:**这项研究的主要收获是

  1. 随着型号尺寸从基本型号增加到 11B 型号,性能也随之提高。
  2. SSM 战略大大提升了业绩。
  3. 内存和计算成本显著降低,因为与查找大型知识语料库的典型开放领域问答模型不同,本文描述的模型只查看自身“内部”。
  4. 该模型也击败了多答案任务中的最佳基线,尽管与 SOTA 模型相比,在召回率上落后。

**人工评估:**由于模型使用自由形式的答案生成,评估中有多个假阴性。这是因为,如果在基本事实和输出之间没有精确的匹配,尽管它们在语义上是相同的,这将被认为是错误的输出预测。作者查看了 150 个随机抽样的例子进行评估,他们可以注意到 20 个被错误分类为错误,20 个被标注为错误,17 个无法回答。忽略评估中无法回答的问题,该模型给出了 57.8 分。

通过微调 T5 在开放领域自然问题(NQ)、网络问题(WQ)和 TriviaQA (TQA)任务上获得分数。除了 Ling 等人(2020 年)和 Févry 等人(2020 年)之外,所有模型都使用昂贵的数据查找。此外,我们可以看到 T5 型号的性能随着规模的扩大而提高。(来源)

结论

在本文中,作者展示了在非结构化数据上预先训练的大型语言模型在“封闭领域”问答中可以获得显著的结果。这需要许多有趣的工作,以及制定资源约束(较小的模型)以模拟较大模型的性能,查看模型可解释性的“知识”,更重要的是,了解模型是否“学习”事实作为基于最大似然损失的预训练的结果。

你的 ML 代码消耗了多少内存?

原文:https://towardsdatascience.com/how-much-memory-is-your-ml-code-consuming-98df64074c8f?source=collection_archive---------7-----------------------

了解如何通过一行命令快速检查机器学习功能/模块的内存占用。生成一个好的报告。

图片来源: Pixabay

为什么要分析内存使用情况?

假设你已经编写了一个很酷的机器学习(ML)应用程序,或者创建了一个闪亮的神经网络模型。现在,您希望在某个 web 服务或 REST API 上部署这个模型。

或者,您可能已经基于来自制造工厂的工业传感器的数据流开发了该模型,现在您必须将该模型部署在一台工业控制电脑上,以便根据持续输入的数据做出决策。

“很高兴开发出闪亮的 ML 模型”。图片来源: Pixabay

作为一名数据科学家,你可能期望工程/平台团队提出的一个极其常见的问题是“ ”你的模型/代码有多少内存占用?在给定的数据负载下运行时,您的代码的内存使用峰值是多少?

这是很自然的,因为硬件资源可能是有限的并且一个单独的 ML 模块不应该占用系统的所有内存。对于边缘计算场景来说,这一点尤其正确,即 ML 应用可能在边缘上运行,例如在工业 PC 上的虚拟化容器内。

此外,您的型号可能是运行在该硬件上的数百种型号中的一种,您必须对内存使用峰值有所了解,因为如果大量型号同时出现内存使用峰值,可能会导致系统崩溃。

这让你很好奇,不是吗?

图片来源: Pixabay

…硬件资源可能是有限的,单个 ML 模块不应该占用系统的所有内存。对于边缘计算场景来说,尤其如此……

不要犯这个根本性的错误

注意,我们讨论的是整个代码的运行时内存配置文件(一个动态量)。这与您的 ML 模型的大小或压缩无关(您可能已经将它作为特殊对象保存在磁盘上,例如 Scikit-learn Joblib dump ,一个简单的 Python Pickle dump,一个 TensorFlow HFD5 ,等等)。

Scalene:一个小巧的内存/CPU/GPU 分析器

这里有一篇文章介绍了一些与 Python 一起使用的旧内存分析器。

在本文中,我们将讨论Scalene——您可以一站式回答工程团队提出的这些问题。

根据其 GitHub 页面 , " Scalene 是一个用于 Python 的高性能 CPU、GPU 和内存分析器,它可以做许多其他 Python 分析器不能做的事情。它的运行速度比其他分析器快几个数量级,同时提供更详细的信息。

它是由马萨诸塞大学开发的。查看此视频,了解全面的介绍。

安装

毕竟是 Python 包。所以,通常安装,

**pip install scalene**

目前,仅适用于 Linux 操作系统。我没有在 Windows 10 上测试它。

在 CLI 或 Jupyter 笔记本中使用

不等边三角形的使用非常直接,

**scalene <yourapp.py>**

或者,您可以在 Jupyter 笔记本中使用这个神奇的命令,

**%load_ext scalene**

示例输出

下面是一个输出示例。我们将很快对此进行更深入的研究。

特征

以下是 Scalene 的一些很酷的特性。大多数都是不言自明的,可以从上面的截图中判断出来,

  • 行或函数:报告整个函数和每个独立代码行的信息
  • 线程:支持 Python 线程。
  • 多重处理:支持使用multiprocessing
  • Python 与 C 的时间对比 : Scalene 显示了 Python 与本机代码(如库)的时间对比
  • 系统时间:区分系统时间(如睡眠或执行 I/O 操作)
  • GPU :它还可以报告花费在 NVIDIA GPU 上的时间(如果有的话)
  • 复制量:报告每秒复制的数据量
  • 检测泄漏 : Scalene 可以自动查明可能导致内存泄漏的线路!

一个具体的机器学习代码示例

让我们言归正传,将 Scalene 用于内存分析标准机器学习代码。我们将研究两种不同类型的 ML 模型——原因将很快阐明。我们将对所有三个模型使用 Scikit-learn 库,并利用其合成数据生成功能来创建我们的数据集。

  • 多元线性回归模型
  • 具有相同数据集的深度神经网络模型

所有三个模型的建模代码都遵循完全相同的结构。下图中还显示了外部 I/O 操作,因为我们将看到,根据型号的类型,它们可能会也可能不会主导内存配置文件。

图片来源:作者出品(拥有版权)

线性回归模型

代码文件在我的 GitHub repo 中的。

我们使用标准导入和两个变量NUM_FEATURESNUM_SMPLES来做一些实验。

我们没有展示数据生成和模型拟合代码。它们相当标准,可以在这里看到。我们将拟合的模型保存为一个 pickled dump,并加载它和一个用于推理的测试 CSV 文件。

为了清晰起见,我们在一个main循环下运行所有东西,执行和报告都是不规则的(你很快就会明白)。

当我们运行该命令时,

$ scalene linearmodel.py --html >> linearmodel-scalene.html

我们得到这些结果作为输出。注意,这里我使用了 **--html** 标志,并将输出传输到一个 HTML 文件中,以便于报告

那么,这个结果有什么惊人之处呢?

内存占用几乎完全由外部 I/O(如 Pandas 和 Scikit-learn estimator 加载)控制,少量内存用于将测试数据写入磁盘上的 CSV 文件。

实际的 ML 建模、Numpy 或 Pandas 操作以及推理根本不会影响内存!

当模型和数据缩放时会发生什么?

我们可以调整数据集大小(行数)和模型复杂性(要素数),并运行相同的内存分析来记录各种操作在内存消耗方面的表现。结果如下所示。

这里的 X 轴表示一对的特征数量/数据点数量。请注意,此图描绘的是百分比而非绝对值,以展示各种类型操作的相对重要性。

图片来源:作者出品(拥有版权)

所以,对于线性回归模型…

从这些实验中,我们得出结论,Scikit-learn 线性回归估计器非常有效,并且不会为实际的模型拟合或推断消耗太多内存。

然而,就代码而言,它确实有一个固定的内存足迹,并且在加载时会消耗那么多内存。然而,随着数据大小和模型复杂性的增加,代码占用的百分比总体上是下降的。

因此,如果您正在使用这样一个小型线性模型,那么您可能想要关注数据文件 I/O 来优化您的代码以获得更好的内存性能。

深度神经网络会发生什么?

如果我们用一个 2 隐藏层的神经网络(每个隐藏层有 50 个神经元)运行类似的实验,那么结果看起来如下。代码文件在这里。

图片来源:作者出品(拥有版权)

显然,神经网络模型在训练/拟合步骤消耗大量内存,不像线性回归模型。但是,对于少量要素和大数据量,拟合占用的内存量很少。

您还可以试验各种架构和超参数,并记录内存使用情况,以获得适合您的情况的设置。

遵循实验方法

如果您使用相同的代码文件重复实验,结果将会根据您的硬件、磁盘/ CPU/ GPU/内存类型而有很大差异。本文的目的不是关注实际值,甚至不是关注趋势。我想让你拿走为你自己的代码做内存分析实验的方法。

一些重要的建议

  • 最好在你的代码中编写专注于一个单一任务的小函数
  • 保留一些自由变量,比如特性的数量和数据点的数量,这样当数据/模型扩展时,您可以运行相同的代码文件进行最小的修改来检查内存配置文件
  • 如果你正在比较一个 ML 算法和另一个,试着保持结构和整个代码的流程尽可能的一致以减少混乱。更好的是,只需更改估计器类并比较内存配置文件。
  • 根据您的建模场景,数据和模型 I/O (导入语句,模型在磁盘上的持久性)在内存占用方面可能令人惊讶地占主导地位。做优化的时候千万不要忽略它们。
  • 出于上述同样的原因,考虑比较来自多个实现/包的 same 算法的内存配置文件(例如 Keras vs. PyTorch vs. Scikit-learn)。如果内存优化是您的主要目标,那么您可能需要寻找一种内存占用最少但能够令人满意地完成工作的实现,即使它在功能或性能方面不是绝对最好的。
  • 如果数据 I/O 成为瓶颈,探索更快的选项或其他存储类型,例如用拼花文件和 Apache Arrow 存储替换 Pandas CSV。查看这篇文章,

使用 Scalene 可以做的其他事情

在本文中,我们刚刚讨论了最低限度的内存分析,重点是规范的 ML 建模代码。您可以利用 Scalene CLI 的其他选项,

  • 仅分析 CPU 时间,不分析内存
  • 仅使用非零内存占用量减少分析
  • 指定 CPU 和内存分配最小阈值
  • 设置 CPU 采样率
  • 多线程并检查差异

最终验证有时是必要的

对于资源不足的情况,托管一个验证环境/服务器将是一个好主意,它将接受给定的建模代码(当开发时)并通过这样的内存分析器运行它以创建运行时统计信息。如果它通过了预先确定的内存占用标准,那么只有建模代码才会被接受用于进一步的部署。

图片来源:作者出品(拥有版权)

如果内存优化是您的主要目标,那么您可能需要寻找一种具有最小内存占用量但又能令人满意地完成工作的实现。

摘要

在本文中,我们讨论了对 ML 代码进行内存分析的重要性,以便与将代码部署到服务/机器上的平台/工程团队进行顺畅、轻松的交互。剖析内存还可以向您展示基于您正在处理的特定数据和算法优化代码的惊人方法。

我们展示了一个典型的 ML 建模代码示例,它是用一个强大而轻量级的 Python 库 Scalene 进行剖析的。我们用线性回归和神经网络模型展示了一些有代表性的结果,并提供了一些一般性的建议。

希望您在使用这些工具和技术将您的 ML 代码实现和部署到产品中时获得更多的成功。

L 喜欢这篇文章?成为 中等成员 继续 无限制学习 。如果你使用下面的链接,我会收到你的一部分会员费, 而不需要你额外付费

https://medium.com/@tirthajyoti/membership

用 R 的简化处理缺失值

原文:https://towardsdatascience.com/how-much-money-did-we-make-again-using-simputation-to-balance-the-books-f8e5c7b74f51?source=collection_archive---------20-----------------------

我们数据集中的漏洞可以通过在线性模型中进行智能推理来解决

休伊·费恩·泰

和格雷格·佩奇一起

上图:一个游乐园; 图片来自 Pixabay 吉姆·威灵顿

推断是在证据和推理的基础上得出结论。

在文学中,这是通过上下文线索来完成的。像“…你有一张二月的脸,充满了霜、风暴和多云…”这样的比喻告诉我们,一个人是阴郁的,因为二月在北半球仍然是一年中寒冷的时候。

同样,在数据科学中,智能猜测可以基于我们的领域知识、线性建模或仅仅是常识来做出。

为了说明这一点,我将使用缅因州一个名为龙虾王国的虚构游乐园作为例子。

假设您在 Lobster Land 担任常驻数据分析师。一天,老板发现电子表格中缺少一些条目,要求你“解决问题”。如果手头只有一个数据转储,并且不知道上下文,您会从哪里开始呢?

第一步:确定数据缺失问题的严重程度。

我们首先在 r 中安装 visdat() 包。对原始数据应用 vis_miss() 函数使您能够可视化数据集中的漏洞。

下图显示了两类洞:降水黄金地带降水变量表示特定一天的降雨量,单位为英寸。以美元计算的 GoldZoneRev 变量表示龙虾王国的室内博彩区产生的收入,人们在这里赢得可以用来兑换礼物的黄金券。

幸运的是, GoldZoneRev 中的缺口只影响了该变量数据的 5.66%。此外,下面的图表告诉我们,*“降水”*列中有 3.77%的数据丢失。

第二步:确定哪些因素影响黄金区域的收入

正如我在以前的文章中所写的,最后一次观察结转 (LOCF)是我们可以用来处理缺失值的一种方法。在先前的观察可能提供关于缺失值的重要线索的情况下(如在一个气候季节性变化的地方的每日天气数据),它可以很好地工作。然而,在这种情况下,LOCF 并不适合应对眼前的挑战,因为游乐园景点的收入会受到多种因素的影响。一周中的某一天可能很重要,就像某一天公园游客的总量一样。我们没有理由假设我们可以通过简单地使用前一天的总数来对这个变量进行合理的估算。

相关矩阵将告诉我们数据集中的其他变量之间是否存在关系,以及这些关系的强度。

为了创建矩阵,我们使用了 cor() 函数。同时,我们告诉 R 只使用归类为“数值”的数据,而忽略缺失的值。这些是防止命令失败的必要说明。最后,我们将结果四舍五入到两位小数。

在下面显示的矩阵中,圆圈的大小对应于相关性的强度。较暗的蓝色表示正相关,而较暗的红色表示负相关。在这种情况下,售出的一日通票数量、小吃店的收入以及龙虾馆员工的工作时间是影响黄金区一天收入的三个最重要的因素。

第三步:根据黄金区与一个或多个变量的关系,估算黄金区当天的收入

为了简单起见,在这个例子中,我们将尝试基于一个因素来估计黄金区域在那些丢失的日子中的收入——售出的日通票的数量。

相关矩阵告诉我们,在龙虾之乡卖出的一日游越多,我们在黄金区赚的钱就越多。换句话说,这两个因素之间有一种强烈的、积极的、线性的关系(见下图)。

因为我们缺少的 GoldZoneRev 的值在我们现有数据的范围内,所以我们可以通过查看当天卖出了多少张一日通票来推断当天的收入。为此,我们使用 R 的 simputation 包中的 impute_lm() 函数。

为了根据售出的一日通票数量对一天的收入进行智能猜测,我们可以运行以下代码:

在上面的代码中,我们首先告诉 R 在“rawdata”数据集中查找。然后我们添加一个名为 is_missing 的列来跟踪最初为空的单元格。接下来,我们调用 impute_lm() 函数。在该函数中,我们将 GoldZoneRev 表示为 DayPass 的函数。

第四步:验证结果

第 13 天是黄金区每日总收入缺失的第一个实例。

我们的线性模型告诉我们,当卖出 4151 张一日通票时,当天的收入是 30914 美元。这一估计是合理的,因为它仅略低于我们在第 7 天的收入,当时售出了 4412 张一日通票,黄金区产生了 33163 美元。

所以留给我们两个问题。我们可以根据多个因素预测黄金地带收入的减少吗?是的,但这违反了简约原则——因为 DayPassGoldZoneRev 之间的线性关系非常强,没有必要通过添加其他输入变量来引入额外的复杂性。

最后,我们是否可以使用类似的线性模型来预测'*降水'*列中的缺失值?答案是否定的。Rain 不依赖于一周中的某一天、售出的龙虾卷的数量或我们数据集中存在的任何其他变量,因此没有任何合适的方法使用 impute_lm() 来填充我们数据集中的这些漏洞。

NumPy 为您节省了多少时间?

原文:https://towardsdatascience.com/how-much-time-does-numpy-save-you-5ec04e5f5b9f?source=collection_archive---------27-----------------------

洞察 NumPy 函数的速度优势

照片由弗洛里安·斯特丘克在 Unsplash 上拍摄

NumPy 是一个非常著名的用 python 进行数学计算的库。它尤其适用于数据科学和机器学习领域。

NumPy 给了你很多数学函数和算法。这为您节省了大量的开发时间,因为您不必自己实现它们,但是使用这个库是否也节省了计算时间呢?这篇文章包括一些小的算法实验,可以帮助我们回答这个问题。

让我们开始吧!

NumPy 数组与列表

让我们从研究 NumPy 数组开始,并将它们与普通 python 列表进行比较。

列表和 NumPy 数组都可以用来表示向量。

import numpy as np
list_a = [1, 2, 3, 4]
array_a = np.array([1, 2, 3, 4])

然而,这两种不同的数据结构具有非常不同的行为。例如,当对它们应用函数时。

list_a + list_a
>> [1, 2, 3, 4, 1, 2, 3, 4]array_a + array_a
>> array([2, 4, 6, 8])

两个普通列表加在一起会产生一个新列表,它是两个列表的串联。而将两个数组相加在一起会应用加法元素。

这在下面的例子中也很明显:

list_a + 5
>> TypeError: can only concatenate list (not "int") to listarray_a + 5
>> array([6, 7, 8, 9])

其中,试图向列表中添加 5 会引发一个TypeError,因为它试图将一个整数连接到列表中。另一方面,当向数组中添加 5 时,它适用于每个元素,从而返回一个新数组,其中前一个数组的所有元素都增加了 5。

这些是列表和 NumPy 数组之间的一些基本区别,当决定在您的用例中使用什么时,了解这些区别很重要。

速度比较

点积计算
接下来,让我们更深入地了解在阵列上使用 NumPy 函数而不是使用手动实现的函数时可以获得的速度优势。

使用 NumPy 的randn函数,我们可以用 100 个随机数快速填充一个数组。

使用datetime.now(),我们可以在运行手动实现的函数 100,000 次之前和之后获得当前时间。

在使用 NumPy 的dot()函数时,我们使用相同的方法。

最后,我们将两个时间之间的差异打印为一个比率,我们可以看到手动实现的函数比 NumPy 慢 65 倍。

我已经运行了这个代码片段几次,结果在 55 和 65 之间略有不同。如果你喜欢,我鼓励你自己尝试一下。

矩阵乘法 再来看看另一个速度对比。这次我们将分析矩阵乘法。

在下面的代码片段中,您会发现我实现了一个矩阵乘法算法,就像前面的例子一样,它将与 NumPy 中内置的dot函数进行比较。

代码遍历
单元格 1:
导入必要的库。

单元格 2: 创建 3 个不同的矩阵。a 是一个 3x2,B 是一个 2x3,C 是一个 5x2 的矩阵。

单元格 3: 定义矩阵乘法函数。

单元格 4: 检查手动实现的函数是否返回与 NumPy 相同的结果。

单元格 5: 对一个 2×3 矩阵与一个 3×2 矩阵点 100,000 次时的函数进行计时,求它们之间的比值。

单元格 6: 用一个 2×3 矩阵点一个 5×2 矩阵 100,000 次时的函数计时,求它们之间的比值。

结果

A点缀的C使用 NumPy 函数大约快 49 倍。这个观察还表明,当矩阵的大小增加时,使用 NumPy 节省的时间也增加了一个很大的系数。

正如这些结果所揭示的,使用 NumPy 有相当大的时间优势。你可能正在使用它。如果你和我一样是一个好奇的人,那么你可能很享受这个小实验,并且了解到你最喜欢的 python 数学库甚至比你想象的还要好。

功劳归于懒惰的程序员,因为正是通过他的材料,我意识到了这一点。

感谢阅读!

音乐如何让我成为更好的数据科学家

原文:https://towardsdatascience.com/how-music-made-me-a-better-data-scientist-b2069c874a63?source=collection_archive---------31-----------------------

办公时间

我的音乐和数据科学之旅告诉我,个人成长源于对更大图景的更好理解。

照片由马克西姆·法维尔在 Unsplash 上拍摄

我仍然记得 11 年前在德克萨斯州一个炎热的夏天,我挑选了我的第一把电吉他。这是一个不起眼的乳白色挡泥板压扁器,有轻微生锈的字符串,但我迫不及待地把它带回家。当我这么做的时候,我向成为一个粉碎领主迈出了第一步。我学会了我的音阶,调高了失真,并训练我的手指越来越快地移动。我被 70-80 年代摇滚令人敬畏的吉他独奏深深吸引,以至于我不太想学其他东西。节奏、和弦或音调的空间很小;我只想玩得又快又炫。

一两年后,我可以结结巴巴地演奏出相当数量的著名吉他独奏,所以我觉得自己已经准备好加入乐队了。我开始和我高中的一些朋友一起即兴演奏,我们尝试创作原创音乐。我认为这是一个机会来写吉他部分,尽可能展示我的吉他技巧。在一次灾难性的即兴演奏中,我的朋友们开始演奏一段即兴重复片段,让人想起 21 世纪初绿日(Green Day)或眨眼 182(Blink 182)等乐队的摇滚,他们让我加入一段主吉他部分。回想起来,这首曲子需要一首简单、充满活力、旋律优美的吉他独奏。相反,我漫无目的地放大缩小五声音阶。音乐一停,我的朋友温和地告诉我,虽然我的独奏令人印象深刻,但与乐队演奏的内容“不相符”。这个反馈无疑让我措手不及——在我看来,令人印象深刻的吉他部分就是好的吉他部分。

在那次事件之后的几年里,我开始向更有经验的吉他手和老师学习。这些导师一次又一次地强调“为歌曲服务”的重要性这意味着音乐家的主要精力应该放在创作与听众产生共鸣的音乐上,而乐器只是辅助这一努力的工具。有时演奏这首歌需要精湛的独奏,有时需要演奏一些简单的曲子,有时则完全不需要演奏。这种范式的转变从根本上改变了我的惯例。最近几年,我更加注重培养自己的时间感、音高感以及和声感——所有这些都让我更加意识到自己的角色在大局中的位置。服务歌曲也鼓励合作,因为音乐家必须协调编写有效互动的部分。

那么这和数据科学有什么关系呢?嗯,我在数据科学方面的旅程在很多方面反映了我在音乐方面的旅程。当我开始学习数据科学时,我迷恋上了复杂的机器学习算法,并将它们视为一名成功的数据科学家的核心能力。现在我有了更多的经验,我比以前更加重视其他技能——比如编写产品质量的代码、商业意识和沟通。换句话说,我知道了作为一名数据科学家为歌曲服务的价值。在专业数据科学项目中,“歌曲”通常是一个产品或一个决策,数据科学家必须学会根据他们对这些努力的贡献来量化他们的成功。这种心态极大地提高了数据科学家的就业能力。作为一名招聘人员,我更希望看到一份简历上写着“建立了一个降低 10%维护成本的模型”,而不是“建立了一个准确率达 95%的模型”。

明确一点,很多快速吉他独奏是为歌曲服务的,很多前沿的机器学习模型是为产品改进的。最重要的是,要理解什么能提供价值,什么不能。我欣赏的吉他手会在适当的时候演奏精湛的独奏,但当歌曲需要时,他们会随意弹奏和弦。当我面试数据科学申请者时,我通常会问一个开放式的问题,关于为基本的二元分类问题选择初始模型。我发现,建议从简单的逻辑回归模型开始的候选人能够详细解释更复杂的模型是如何操作的。具有讽刺意味的是,一些建议从更复杂的模型开始的候选人无法清楚地解释这些模型是如何操作的。在音乐和数据科学中,技术上最熟练的从业者通常认识到,许多情况并没有从他们工具包中最先进的技术中受益。

回想起来,作为一名吉他手,我对快速演奏的过分强调来自于玩电子游戏《吉他英雄》。在这个游戏中,玩家每弹奏一个正确的音符就可以获得分数,因此有很多音符的快歌是获得高分的理想选择。虽然我仍然喜欢《吉他英雄》,并认为它让我对吉他产生了最初的热情,但它的激励让我忽略了与他人一起演奏实际乐器的重要方面。我想知道 Kaggle 竞赛对一些有抱负的数据科学家是否有类似的影响。这些竞赛当然推进了这个领域,并且对学习很有帮助,但是我担心它们会导致一些人过分强调构建性能模型,而不强调产生商业价值。

有时候,在模型的性能和它的价值之间实际上有一个折衷。这种权衡通常是由于时间限制。在一些项目中,我面临着这样的决定:是把时间花在制作更有性能的模型上,还是花在制作更有 T2 影响力的模型上。使模型更具性能包括诸如特征工程、评估不同模型和构建集合模型的任务。另一方面,使模型更有影响力包括在生产环境中部署它、配置它以发送自动通知以及改进它的文档等任务。性能和影响之间的权衡有时也会出现在模型选择中。线性回归等简单模型比深度神经网络或随机森林更容易向非技术风险承担者解释。利益相关者更有可能相信并最终根据他们理解的模型结果采取行动。因此,在某些情况下,为了实现价值最大化,牺牲一些性能是可取的。一个成熟的数据科学家的一个标志是能够从那些需要更严格方法的情况中辨别出这些情况。

最终,我的音乐和数据科学之旅告诉我,个人成长源于对个人贡献如何融入大局的更好理解。在这两种努力中,我曾经相信卓越仅仅包括掌握困难和复杂的技能。虽然这些技能很有用,但我现在认识到优秀是“为歌曲服务”的能力

成为数据科学家后,我的学习道路发生了怎样的变化

原文:https://towardsdatascience.com/how-my-learning-path-changed-after-becoming-a-data-scientist-13afba909aff?source=collection_archive---------6-----------------------

我一直在学习,但方式不同

由 Unsplash 上的卡斯滕·沃思拍摄的照片

我对数据科学的热情始于大约两年半前。我在做一份与数据科学无关的工作。转行对我来说是一个很大的挑战,因为我有很多东西要学。

经过两年的学习和奉献,我终于找到了第一份工作,成为一名数据科学家。当然,我的学习之旅并没有停止。作为一名数据科学家,我在工作期间学到了很多新东西。

学习部分不变。然而,我学习的内容和方式发生了巨大的变化。在这篇文章中,我将详细阐述这些变化。如果你正在努力成为一名数据科学家,你可能会有同样的经历。

需要强调的是,成为一名数据科学家需要不断学习。数据科学仍在发展,你需要时刻保持新鲜感。我认为数据科学还不是一个成熟的领域,所以新的技术和概念正在被频繁引入。

数据的大小

1000 万行对于现实生活中的问题来说并不算多。

对我来说,最显著的变化是数据的大小。当我独自学习时,我用最多有 10 万行的数据集进行练习。我现在认为它是一个小数据集。数据的大小取决于您正在处理的领域和问题。一般来说,1000 万行对于现实生活中的问题来说并不算多。

处理大型数据集有其自身的挑战。首先,我需要学习新的工具来处理这样的数据集。在我开始做数据科学家之前,熊猫对我来说已经足够了。但是,对于大规模数据,它不是一个高效的工具。

允许分布式计算的工具更受欢迎。Spark 是最受欢迎的一款。它是一个用于大规模数据处理的分析引擎。Spark 允许您将数据和计算分布在集群上,以实现显著的性能提升。

幸运的是,可以在 Python 代码中使用 Spark。PySpark 是 Spark 的 Python API。它结合了 Python 的简单性和 Spark 的高效性。

云计算

另一个重大变化是从本地环境转向云环境。当我在学习的时候,我在我的电脑里做所有的事情(即在本地工作)。这足够练习和学习了。

然而,一家公司在当地经营的可能性极小。大多数公司都在云中工作。数据存储在云中,计算在云中完成,等等。

为了高效地完成工作,全面了解云工具和服务非常重要。有各种各样的云提供商,但主要是 AWS、Azure 和谷歌云平台。我必须学会如何使用他们的服务和管理存储在云中的数据。

在 Unsplash 上扣球拍摄的照片

饭桶

作为数据科学家,我经常使用的另一个工具是 git 。我在学习的时候学习了基本的 git 命令。但是,在生产环境中工作时就不同了。Git 是一个版本控制系统。它维护对代码所做的所有更改的历史记录。

Git 允许协同工作。你可能会作为一个团队参与项目。因此,即使你在一家小公司工作,git 也是一项必备技能。项目是用 git 开发和维护的。

Git 比外表看起来要复杂一些。然而,在做了几个项目之后,你就习惯了。

不仅仅是工具!

在我的学习旅程中,工具不是唯一改变的东西。我处理数据的方式也发生了变化。当您处理一个现成的数据集时,在清理和处理数据方面您能做的不多。例如,在机器学习任务的情况下,您可以在几个简单的步骤后应用模型。

在你的工作中情况会有所不同。项目的很大一部分花费在准备数据上。我的意思不仅仅是清理原始数据。这也是重要的一步。然而,探索数据中的底层结构并理解特征之间的关系是至关重要的。

如果您正在处理一个新问题,那么定义数据需求也是您的工作。这是另一个需要特殊技能的挑战。领域知识是其中重要的一部分。

特征工程比机器学习模型的超参数调整重要得多。超参数调整所能达到的效果是有限的,因此您可以在一定程度上提高性能。另一方面,一个信息丰富的特征有可能极大地改进模型。

在我开始作为数据科学家工作之前,我专注于理解机器学习算法以及如何调整模型。我现在大部分时间都在准备数据。

我所说的就绪包括许多步骤,例如

  • 清理和处理数据
  • 重新格式化数据
  • 探索和理解数据

统计知识对这些步骤非常重要。因此,我强烈建议提高你在这方面的知识。对你的数据科学生涯会有很大帮助。

结论

学习数据科学有大量的资源。您可以使用它们来提高您在任何数据科学领域的技能。然而,这些资源不能提供真实的工作经历。没毛病。当你找到第一份工作时,你要做好准备学习一套不同的材料。

感谢您的阅读。如果您有任何反馈,请告诉我。

我母亲是如何开始用 CNN 来报道她的植物的

原文:https://towardsdatascience.com/how-my-mother-started-using-cnn-for-her-plants-f0913e5548db?source=collection_archive---------12-----------------------

在 Unsplash 上 veeterzy 拍摄的照片

她的植物状况不佳;Python、Streamlit 和机器学习拯救了我们

禁闭激发了人们的许多技能;一些人转向烹饪,一些人转向乐器,还有一些人尝试种植植物。我们家属于最后一批。在成长过程中,我们在花盆中种植了常见的圣罗勒、芦荟和偶尔生长的金盏花,但现在是时候扩大品种了。于是开始在亚马逊和当地苗圃寻找盆栽土、花盆和其他用具。

我的国家幅员辽阔,不仅在文化、人民和食物方面,而且在动植物和土壤类型方面都是多样化的。根据产品运输的地点,可能会有差异,尤其是当产品是土壤时。有冲积,粘土,红色,红土,黑色,泥炭和更多类型的土壤在该国。不用说,不同土壤的化学和物理性质是不同的,只有某些种类的植物适合每种土壤。

问题陈述

长话短说,我的母亲在每种类型的土壤中种植一切,并补充一些厨房垃圾肥料,但树苗的生长要么很慢,要么植物会在它们身上留下一些下垂的叶子。此外,鸽子——会飞的老鼠——在任何大城市都是威胁。我母亲可以做三件事:

1.确定土壤类型,只在其中种植相关的种子。

2.尽早发现任何疾病并采取纠正措施。

3.照顾鸽子(邪恶的笑声)😈

她花了几个小时在 YouTube 上,试图找到照顾某些植物的方法,说实话,在互联网上寻找信息可能会很难。我想过帮助她,但我的植物学知识很可笑,所以我决定召唤机器学习。

识别土壤类型

资料组

第一个问题是找到土壤的数据。正如我提到的,由于这个国家不同的气候和地理环境,土壤的种类太多了。就在我考虑转向基于土壤特性的更多数值分析时,我发现了一个土壤数据集。它有冲积土、粘土、红色和黑色土壤的图像。看起来足够好了。

完美!让我们开始分析。

系统模型化

在构建了一些卷积网之后,我创建了一个模板,用来为模型设置基线。很多时候,我们需要对超参数做一点小小的调整,就能得到不错的结果。

我使用 split-folders 包将数据(包含子文件夹)分成训练集、测试集和验证集。在定义了训练、测试和验证数据之后,我形成了一个简单的 CNN 模型,其中有一系列卷积层和最大池层,中间有漏失。模型的后几层由激活 softmax 的“展平”和“致密”组成。

我可以看到,在这些纪元中,我获得了令人尊敬的验证准确性。让我们绘制各个时期的准确度和损失。

跨时代的模型准确性和模型损失。验证集和训练集的模型损失迅速下降(图片由作者提供)

看起来不错!现在,我将评估测试数据上的模型,并绘制一个混淆矩阵来检查错误分类。对于一个好的模型,大部分的观察值应该位于对角线上。

对于测试数据的混淆矩阵,大多数观察值是沿着对角线的(图片由作者提供)

看起来我们对问题的第一部分很满意。

识别疾病

资料组

像往常一样,我没有数据集,所以我求助于互联网,快速搜索将我带到了植物村疾病分类挑战,它有 38 个不同类别的图像数据集。诚然,数据集中的许多植物都不在我家生长,但至少有总比没有好。

数据集有大约 100k 张图像,在我简陋的机器上运行它会有些过分,所以我决定使用 Kaggle 的 GPU 功能。此外,数据出现在 Kaggle 上,因此将其导入模型会简单得多。这种数据有许多内核,但我发现有些奇怪的是,大多数人使用训练和验证数据来训练模型,为了测试的目的,他们使用“已经消费”的验证数据。我在这里看到了一个根本性的问题,决定建立自己的模型。

在开始之前,我将训练数据分成训练集和验证集;已经有了一个测试集,所以我设置了三个必需的数据集——训练、测试和验证

系统模型化

在开始建模之前,我记得我的母亲将不得不在现实生活中使用这些模型,而且大多数时候 Keras 的模型都很重~300 MB,这增加了 Heroku 应用程序的 slug 大小。这是一个应该在建模过程中缓解的问题。

我决定使用 MobileNet,经过编译和训练后,它的体积会非常小。

跨时代的准确性和损失看起来很有希望。

植物病害的模型精度和模型损失。(图片由作者提供)

我有一点信心,测试集上的预测不会真的很差,我是对的。

我不能在 Matplotlib 中打印混淆矩阵,因为这里的类的数量是 38,因此这将是一个巨大的矩阵(图片由作者提供)

你可以看到矩阵的对角线由很多数字组成,F1 分数(精确度和召回率的调和平均值)在大多数类别中接近 0.9,我认为这是一个足够好的模型。

现在怎么办?

该模型的主要用户是我的母亲,我不希望她使用笔记本电脑来使用该模型,所以我必须让事情变得简单一些。

进入细流!

在开发 UI 之前,我知道我有两个模型——一个用于土壤分类,另一个用于植物病害。第二个非常小(12 MB ),但前者(300 MB)需要转换以兼容物联网设备。谢天谢地,TensorFlow 让我们这样做。

现在,我们已经准备好在 Streamlit 上部署应用程序。

部署

Streamlit 应用程序非常容易构建,我所要做的就是在一个文件夹中创建 app.py、setup.sh、requirements.txt、Procfile、models 和其他我正在使用的东西。请看这里的 GitHub 回购。

如果你的 GitHub repo 中有所有文件,那么你可以轻松地使用 Streamlit 共享服务(免费),指定你的 app.py,如果一切顺利,你将拥有一个你可以在任何地方从访问的应用(不知道专制国家)。

请查看这里部署的 app—https://share . streamlit . io/prashantmdgl 9/soil-analysis/main/app . py

或者在https://soil-analyser.herokuapp.com/

资源

编辑资源列表以便于访问。

  1. 土壤数据集出现在这里。
  2. 患病叶片数据集出现在这里。
  3. 部署的应用程序可以在这里 (Streamlit)和这里 (Heroku)访问。
  4. 部署的应用程序的 GitHub 是这里的(Streamlit)和这里的(Heroku)。
  5. 训练土壤模型的代码在这里 (GitHub)。
  6. 训练叶子模型的代码出现在这里 (Kaggle)。

我母亲的反馈

  1. 她的手机拍摄高分辨率照片,每当她拍摄照片并上传到应用程序时,应用程序就会崩溃。我错过了它,因为测试图像的尺寸非常小。我可以通过设置更高的递归限制来缓解这个问题。
sys.setrecursionlimit(10000)

2.她喜欢这个应用程序提供建议,告诉她应该在土壤中种植什么类型的植物。

其中一个分类结果的快照(图片由作者提供)

3.她对植物疾病模型的结果并不感到兴奋,因为根据它,几乎所有她的植物都需要手术室,我完全理解这一点。

我错误地认为病叶可能看起来有些相似。这种假设似乎很牵强,因为叶子上可能有特征斑点。

迫切需要用她种植的植物来更新这个数据集。目前,她可以在这个应用程序的帮助下照顾小番茄植物。如果叶子是绿色的,它将被分类为健康的,并且在许多情况下,很少有黑星病、锈病、枯萎病、霉变将被正确分类。对于那些身上有自然斑点、黄线、棕色斑点的物种,我需要随时更新数据。

就目前而言,如果因为这种努力,甚至有一些植物得到了正确的治疗,那就“不错”了!

资料来源:Giphy

网飞元流如何帮助我们建立真实世界的机器学习服务

原文:https://towardsdatascience.com/how-netflix-metaflow-helped-us-build-real-world-machine-learning-services-9ab9a97cdf33?source=collection_archive---------9-----------------------

基于真实世界用例的元流快速介绍。

斯塔基·贾在 Unsplash 上的照片

这篇文章生活在:

  • 中等
  • 开发到
  • 走向数据科学

简介:

两年前,我作为一名软件工程师加入了 future demand,去年我和我的团队一直在使用 Metaflow,在这篇文章中,我想总结一下我们使用它的经验。

该框架最初是在网飞开发的,它有一个活跃的社区。由于这个框架仍然相对较新,我决定写一篇文章来描述什么是元流,以及它如何适应产品开发过程的全貌。

尽管 Metaflow 有非常好的文档,但我认为基于真实世界的用例来编写我们的经验会有所帮助,并且更容易掌握。

为了快速了解未来需求,我们与活动组织者(体育、音乐和娱乐活动)合作,通过从他们已有的数据中提取知识来提高他们的门票销售。我们根据人们的真实兴趣,而不是社会和人口统计特征,使用味觉群集的概念来定位人们。例如,基于音乐品味的定位基本上是推动古典音乐领域销售的因素,而不是其他任何特征。

什么是元流?

Metaflow 是一个框架,帮助数据科学家在生产环境中管理、部署和运行他们的代码。它通过跟踪数据科学家所做的实验来加速开发过程。

前置元流:

在我加入公司时,数据科学团队已经开发了他们的模型。他们的代码是 python 脚本,在本地机器上运行以交付最终结果。

回到过去,这段代码最初是在 Jupyter 的笔记本上写的。然后,我们的团队对其进行提取和重构,使其作为自动化的纯 python 脚本运行。

作为工程师,对我们来说,重点是部署和管理这些代码,如何实现自动化,以及将这些脚本投入生产。

元流开始发挥作用:

那时,我们的机器学习代码可以被描述为 DAG(有向无环图)。

简而言之,DAG 是工作流的数学表示,它描述了处理和转换数据的步骤,基本上,它是数据管道的抽象

线性非循环图—图片由 Metaflow 官方文档提供— Apache License 2.0

分支无环图—图片由 Metaflow 官方文档提供— Apache License 2.0

我们自己管理工作流没有任何优势,所以我们决定使用一个框架来为我们运行和管理代码。使用框架可以在很多方面帮助我们。例如自动化、并行化、编排、故障转移(在特定步骤失败后恢复)等。

在做一些研究时,我们发现了许多选项,如(Luigi,Airflow,Metaflow,MLflow),由于 Metaflow 和 AWS 之间的高度集成给我们留下了深刻的印象,我们决定使用 Metaflow。

元流术语:

元流流量:

流是 Metaflow 中的主要概念,它是一段描述要执行的步骤以及这些步骤的执行顺序的代码。

让我们考虑下图中提供的 DAG:

Metaflow 官方文档提供的图片— Apache 许可证 2.0

基本上,这个流程可以使用 python 来实现:

并且该流程可以如下容易地执行:

在本地运行元流-按作者分类的图像

元流运行:

元流运行的概念——至少对我来说——是一个新的和聪明的东西。
基本上,每次您或任何其他团队成员在本地或 AWS 上运行流程时,所有连接到流程的元数据都会自动存储在中央数据库或 S3 上,以备后用。

例如:

  • 你分配给 自身 的任何东西都会被保存。
  • 行刑的时间。
  • 已执行的代码版本。
  • 元数据(输入参数、状态、执行流程的用户)。
  • 数据科学工件(模型、特征集、训练数据快照)

元流服务:

正如我在上一节中提到的,Metaflow 的每次运行都会被跟踪,但是这是怎么发生的呢?
简而言之,有一个客户端 API 服务器在运行(在 AWS 上)。
我们称之为元流元服务,每次流被执行时(本地或 AWS 上),所有关于您运行的元数据都将被传输到一个中央数据库——使用元服务。

元流用例:

我将提到一些我们可以从 Metaflow 中受益的用例,以及它如何使我们的开发和部署过程变得更加容易:

跟踪和版本控制:

在开发模型时,我们的数据科学家必须进行实验,并选择能够提供最佳模型的最佳特性集。基本上,他们使用 excel 文件来存储哪个特性集给出哪个结果。

应该有更好的方法来做这件事, 对吗?

答案是肯定的,Metaflow 将存储您或任何其他团队成员所做实验的所有数据,您可以轻松检查所有历史运行,以比较和选择您的模型的最佳结果。

检查您的历史运行非常简单,可以使用下面的代码片段来解释:

检查历史运行

在这个代码片段中,我们对一个流的所有历史运行进行迭代,并从每次运行中读取一些数据。除了做实验,我们的模型还在不断变化的训练数据上接受训练。迭代历史运行帮助我们理解这是如何影响我们的模型的,这是我们可以使用 Metaflow 轻松跟踪的。

扩展和云集成:

我们的另一个用例是,我们希望在本地训练我们的模型,但是有些步骤需要太多的时间和资源来执行。

我们发现,即使我们在本地运行流程,我们也可以很容易地将特定步骤切换为在 AWS 上作为批处理作业执行——这可以使用 batch decorator 来完成:

使用 AWS 批处理作业扩展我们的资源

在最后一个代码片段中,通过对步骤 a 使用批处理装饰器,我们使用请求的内存和 CPU 资源在 AWS 上强制执行这个步骤,同时仍然使用我们的 ide 来运行代码。

在本地运行元流,并强制一些步骤作为批处理作业在 AWS 上运行——图片由作者提供

部署:

部署是元流的另一个有用的方面。我们第一次讨论如何部署和自动化重新训练我们的模型的过程时,我们考虑了将我们的代码归档,以及选择哪个服务最适合运行代码,等等…

后来我们发现使用 Metaflow 部署过程再简单不过了。
基本上,通过执行一个命令,我们可以将本地流反映为 AWS 上的阶跃函数状态机,我们可以使用 lambda 函数或手动触发它。

这是一个例子:

将元流部署为 AWS 上的阶跃函数状态机—图片由作者提供

这个流程在 AWS 上反映为一个阶跃函数状态机:

AWS 上的阶跃函数状态机—图片由作者提供

我们习惯于在 AWS 上手动触发它们,并使用 lambda 函数安排日常运行。

这是我们的流的阶跃函数在 AWS 上的样子:

触发 AWS 上的流量—图片由作者提供

后来,我们构建了一个简单的部署管道,并将其附加到我们的代码库中。每当有人将新的变更推送到特定的分支时,所有的变更都会直接反映在相关的 step 函数上。

机器学习的持续交付:

在其中一个用例中,我们在 rest API 后面使用了一个数据科学模型,以服务于前端并给出事件建议,正因为如此,我们的模型需要每天进行训练,以包含新的事件。我们使用 Metaflow 在后端加载模型的最新版本,步骤如下:

  • 从 Metaflow 的最近一次成功运行中在后端加载模型。
  • 使用加载的模型对服务进行健全性测试,只有当它通过测试时,我们才使用新的模型。
  • 如果健全性测试失败,我们返回到更早的元流运行,从模型中加载一个可以通过我们测试的旧版本。

这完全可以在没有 Metaflow 的情况下完成,但对我们来说,使用 Metaflow 来为我们版本化和存储所有数据科学工件要简单得多。

调试和恢复失败的流程:

另一个有用的用例是恢复失败步骤的能力。
有时,计划在 AWS 上每天运行的步进功能会失败。由于数据不断变化,重现错误变得更加困难,因此,我们希望能够使用相同的数据集恢复失败的步骤。
通过使用 Metaflow,我们可以轻松地检查我们机器上的流,查看导致错误的数据,从失败的步骤恢复流执行,并调试哪里出错了。

最后…

总之,在某些方面,使用 Metaflow 对我们来说和使用 Git 对代码本身一样重要。它让我们的数据科学家有可能在代码的整个生命周期中对其进行管理。同时,这也给了我们(工程师)更多的时间去关注系统的其他部分。

在你走之前…

感谢 的阅读!我希望你喜欢这篇文章……如果你想与我取得联系,请随时通过 ahmad.hori@gmail.com 联系我,或者通过我的 LinkedIn 个人资料也可以通过 关注我的媒体 了解更多故事。

神经网络如何学习

原文:https://towardsdatascience.com/how-neural-networks-learn-5ded46a13546?source=collection_archive---------65-----------------------

反向传播的数学指南

本文的目的是通过开发一个框架来分析权重和偏差的变化如何影响成本函数,从而提供对神经网络的 学习 过程的数学理解。一旦理解了这一点,我们将能够确定如何使用像 Adam 这样的优化算法,使非常小 改变这些变量中的,可以降低成本函数。

来源

神经网络,或者具体地说是人工神经网络,是一系列模仿动物神经系统的节点,产生类似于大脑的信息处理能力。这些节点之间的连接由在训练过程中学习的权重指定。这些网络背后的基本思想可以追溯到艾伦·图灵在 1948 年发表的题为智能机器的论文中,他将它们称为 B 型无组织机器,即从初始组成来看相当无组织,但能够学习如何执行特定任务的机器。今天,这些神经网络构成了深度学习算法不可或缺的组成部分,本文旨在阐明它们到底是如何学习的。

让我们从想象一个相当简单的神经网络开始。让我们想象一个由 L 层组成的网络,但是每一层只有一个神经元,如下图所示。

现在,让我们将我们的分析限制在最后一层和倒数第二层之间的连接,下面显示了这两层的关联权重()和偏差( b )。

激活的神经元 LL-1 分别是 a^(L)a^(L−1) 。如果最后一层的期望输出为 y ,则误差或代价函数变为c _ o =(a^(l)−y)。这也称为均方误差,可能是所有可用选项中最简单也是最广泛使用的。成本函数中的下标表示这是第一个训练图像/数据点的成本,并且整个训练过程将需要对训练数据集中的所有 N 个图像进行训练。这里的层 L 的激活可以表示为:

其中**【b^(l】是层 Lσ 是上面讨论的激活函数。学习包括使用合适的优化算法(通常是梯度下降的某种变体)来达到最小化【C20】【ω^(l】和【b^(l】**的最优值。我们通过检查成本函数对偏差和权重的小扰动的敏感度来做到这一点,即通过使用链式法则计算以下偏导数:

上述等式右侧的偏导数可以计算如下:

将上面导出的偏导数代入等式 1 和 2

这两个偏导数有助于量化重量和偏差的变化如何影响成本。

现在让我们添加另一层到我们的神经网络,如下所示。

除了我们刚刚计算的两个偏导数之外,为了充分研究权重和偏差变化对成本函数的影响,对于该网络,我们还必须计算倒数第二层的以下两个偏导数

上述两个方程所需的偏导数可以计算如下:

代入这些值,我们得到与层 L-1 相关的权重和偏差变化的成本函数变化率的以下表达式

*这应该能让我们了解反向传播是如何工作的。首先,我们根据层 LL-1 的激活情况,确定成本相对于层 L 的重量和偏差的偏导数。然后,我们推导出该相同成本函数相对于层 (L-1) 的权重和偏差的导数,作为层 **L、L-1、**和 **L-2 的激活的函数。*这些激活又被表达为各自权重和偏差的函数。我们可以遵循相同的过程,直到整个网络的第一个神经元,以确定所有的权重和偏差如何影响成本函数。

在我们的分析中,到目前为止,我们还没有解决单层中有一个以上神经元的情况。事实证明,向一层中添加更多的神经元只需要一些额外的指标来跟踪。下面显示的是一个两层的神经网络,但每层都有许多神经元。这里,我们引入两个新的指数来跟踪每一层上的神经元,k 用于层 L-1,j 用于层 L。

这种情况下的成本函数将是输出层 L 中每个神经元的成本之和

层 L 中每个神经元的激活将是层 L-1 中所有神经元的激活的加权和

成本相对于层 L 的重量和偏差的偏导数可以如前所述

上述方程所需的偏导数可以像以前一样计算。

将这些代入等式(1)和(2)

上面的等式是用于具有两层但每层有许多神经元的神经网络。我们可以类似地计算具有许多层和每层许多神经元的神经网络的偏导数。我不包括这个方程,因为它们本质上涉及与上面讨论的相同的逻辑。

如何不成为数据科学家

原文:https://towardsdatascience.com/how-not-to-become-a-data-scientist-433715671abf?source=collection_archive---------16-----------------------

什么“不要做”也很重要

由 Unsplash 上的 Karsten Winegeart 拍摄

数据科学是近年来最受欢迎的工作之一,吸引了各行各业的无数人。这些人,包括我自己,花费大量的时间成为一名数据科学家。

在河的另一边,有人帮助或指导那些试图成为数据科学家的人。书籍、个人博客、Youtube 视频、MOOC 课程是帮助有抱负的数据科学家过河的一些工具。

由于这种受欢迎程度和需求,有大量关于“如何成为数据科学家”的资源。我还写了几篇文章,试图让数据科学学习之旅更加实用和高效。

在这篇文章中,我打算从一个不同的角度来看这个话题。这里的重点是“如何不成为数据科学家”,所以我将尝试解释在学习数据科学时应该避免或不应该做什么。

我花了大约两年时间找到了我的第一份工作,成为一名数据科学家。在这漫长的旅途中,我做了一些我不该做的事情。因此,我对“不要做”很有经验。

读,看,读,看,…

大多数资源以书面材料或视频的形式出现。总的来说,学习一项新技能,观察比阅读更受欢迎,因为这样更省力。

当我读一些东西时,我觉得我的大脑比看同一主题的视频更关注这个主题。

然而,就所需的主动学习而言,阅读和观看都是不够的。尤其是在学习软件工具或编程语言的时候。

当我阅读或观看时,我觉得我学得很好。然而,真正发生的是我理解了题目,而不是学会了。

正如尼克·达姆在这篇文章中所说,“对于大脑中发生的学习来说至关重要的神经连接的变化,在学习经历不活跃时似乎不会发生。许多研究表明,积极参与是大脑变化的先决条件。毫不奇怪,仅仅听一场演示或讲座不会带来学习。”

在 Youtube 上看视频类似于听讲座。如果没有实践或实践经验的支持,你很可能会失败。

不要做:不要只是阅读和观看。尽量多练。实践经验在学习数据科学中至关重要,尤其是在学习软件工具或编程语言时。

学这个学那个

数据科学的范围是巨大的。金融、零售、图像识别、自然语言处理只是你可能作为数据科学家工作的一些领域。

虽然基本原理是相同的,但每个领域都有特殊的技术和概念需要学习。

除此之外,数据科学中还有丰富的工具可供选择。你将有许多编程语言、库、软件工具的选择来学习和执行典型的任务。

让我说清楚。如果你试图全部学会,你会失败的。

你应该做的是缩小你的关注范围。例如,一种编程语言和几个库就足够了。与其把很多东西学到一定程度,不如试着掌握一门。这肯定也会增加你找到工作的机会。

让我们关注一个更具体的例子。Matplotlib,Seaborn,Altair 是 3 个流行的 Python 数据可视化库。所有的都学没有意义。每一个都有一些优点和缺点,但这不是你在学习过程中应该关心的事情。

同样,你应该试着决定你想在哪个领域工作。例如,如果你决定从事金融工作,你应该掌握时间序列分析,这不是自然语言处理的要求。

一旦你真正开始作为一名数据科学家工作,你就可以转换领域。然而,最好是选择一个特定的领域,并努力掌握所需的技能。这会让你的简历或作品集脱颖而出,增加你找到工作的机会。

不要做:不要试图学习每一个主题和工具。一开始尽量用最少的。

承诺过多和兑现不足

我碰到过很多帖子,标题都是“x 个月学会数据科学”。“x”通常为 3 或更小。这绝对是一个过度承诺。这需要 3 个多月的时间。事实上,学习数据科学是一个持续的过程,所以即使在你开始作为数据科学家工作后,你也会继续学习。

当然,设定目标是件好事,但你不应该从这种过度承诺开始。3 个月的时间结束后,这将是一个动力断路器。你会意识到有更多的东西需要学习,这可能会让你认为自己不适合成为一名数据科学家。

学习数据科学,我们需要的是一个有现实里程碑的结构良好的计划。需要多长时间取决于你的技能和知识,以前的工作经验,以及你目前的计划。请记住,我们不是在进行短跑比赛。

不要做:不要过度承诺。你可以设定你的目标,但要现实一点。学习数据科学不是几个月就能完成的任务。它需要时间、奉献和更长时间的努力。

结论

我花了将近两年时间找到了我的第一份工作,成为一名数据科学家,我很高兴我做到了。这是一次有趣但富有挑战性的旅程。

如果你有决心和时间,你将会实现成为一名数据科学家的目标。避免我刚刚在这篇文章中提到的情况,将有助于你的学习之旅更加高效和顺利。

感谢您的阅读。如果您有任何反馈,请告诉我。

如何(不)在数据科学项目中失败

原文:https://towardsdatascience.com/how-not-to-fail-at-your-data-science-project-7e8c84305aa8?source=collection_archive---------25-----------------------

行业笔记,商业科学

可能破坏投资回报和影响的 4 个设计选择

照片由乔·什切潘斯卡在 Unsplash 拍摄

自新冠肺炎疫情开始一年多以来,数据科学家仍在努力让他们的模型恢复原状。大约每周,我都会看到另一篇文章哀叹过去一年的混乱对机器学习模型产生了负面影响。许多组织已经不再试图适应,只是希望等待,直到我们“恢复正常”。

当他们最终意识到不存在正常这种东西时,他们将会大吃一惊。

我们所有在数据科学领域工作的人都需要认识到导致这些模型崩溃的失败,并以新的方式处理我们的算法设计。我们不必继续犯同样的错误。

数据科学中这 4 个常见的项目设计选择让你很容易失败。这是你实现模型漂移、最小影响和低投资回报率的路线图(或者,更好的是,4 件让你走向成功的事情)。

1.隔离您的项目

回想一下您最近的几个数据科学项目。希望它们不要太相似,这样你就可以挑战自己并保持有趣。但是,即使它们是具有相反目标的非常不同的项目,代码和机器学习基础仍然非常相似。现实情况是数据科学家有一个特殊的工具箱并且经常重复方法来实现不同的目标。

尽管如此,数据科学家倾向于创建与其他数据科学家和其他项目隔离的项目孤岛。我们最终会浪费大量时间重复自己的话,做类似的分析。甚至在同一家公司的团队也是如此!

整个数据世界是一个集成的全球系统;打破这些联系只会限制你的回报。

所有数据、见解和中间结果应在整个分析中共享,以最大化其影响。由于您的大多数项目处理相似的操作,隔离只是浪费时间。

当你在一个 项目孤岛 上时,你往往会为了收益而错过关键领域。你看到了所有的水,却忽略了底下的东西。将您的项目与其他数据科学项目隔离会让您面临失败,因为您必须重新学习过去的所有经验教训,并从头开始重新创建所有最好的代码。孤立的数据、方法和代码让你容易犯错。与其重新创建代码,不如将时间和精力用于设计您的分析。你会得到更好的结果。

**资料荒岛。**图像演职员表:兰道尔·门罗、xkcd 。

2.从工具出发,而不是从目标出发

作为一名数据科学爱好者,我和其他人一样对使用新工具和新类型的分析来改进我的结果感到兴奋。很难抗拒全新战略的吸引力,尤其是因为数据科学的最新进展通常会提供大量增长机会

这是一个普遍的问题。在最近一期的麻省理工学院斯隆管理评论中,他们讨论了一名技术娴熟的数据科学家受聘改进印度一家大型金融公司的投资定位算法的案例。他迷上了 k-最近邻算法,并投入大量时间和精力将其应用到分析中。

收获甚微。事实上,该算法的建议并不比任何专业人士在没有任何正式统计分析的情况下通过查看数据给出的建议更好: 所有开发该工具的努力,却一无所获。

K-最近邻 算法。 图片演职员表: E. M. Mirkes,维基媒体

为什么?如果你知道关于 k-最近邻算法的任何事情,它看起来会有很大的潜力。您可以使用健壮的聚类快速对数据进行聚类,以找到看似噪声的模式和相似性。它应该工作,对不对?

这个问题要追溯到最开始。我们的目标是看看一个特定的算法能做什么,而不是改进 KPI。确切的项目设计是有缺陷的。在有效的数据科学项目中(我喜欢称之为商业科学),必须有一个精确的目标,以获得想要的结果。

太多时候,数据科学家带着“让我们应用这个方法,看看我们有什么发现”的心态来建立项目。有时这能带来令人印象深刻的结果,但通常表现不佳。

成功的数据科学项目只回答一个问题:我如何改进这个 KPI?

实验可能有它的位置,尤其是在大学里,但一旦你试图实现可预测的增长和最大化的结果,方法必须是不同的。从工具出发,而不是从目标出发,将永远无法实现投资回报最大化。最佳实践是从业务需求出发,找到实现目标的最佳统计方法 —即使它并不花哨,也不是数据科学领域的最新趋势。

如果你专注于方法或工具,而没有深入到为什么,你会让自己失败。

3.优先考虑错误的 KPI

当然,即使你把目标放在第一位,只有当目标是正确目标时,你才能获得最佳结果。

你的努力的影响主要取决于你选择优先考虑的 KPI。例如,在零售业,我们经常看到人们以牺牲更有价值的洞察力为代价来提高需求预测的准确性。如果你花费数周时间开发完美的工具,将预测准确度提高 2 个百分点,如果数据科学家忽略供应链或定价中的突出问题,这可能不会产生太大影响。优化这些关键绩效指标带来的收益将更加显著。

KPI 优先顺序 至关重要,也极具挑战性。没有一个硬性的规则告诉你你的目标应该是什么,但是两个简单的准则可以使决策过程更容易管理:

1。 你的 KPI 应该对底线有重大影响。

2。 你的 KPI 应该有增长的潜力。

第一条规则很简单。你的目标应该带来切实的回报。例如,一家连锁杂货店将从只能优化牛奶价格的算法中获得最小的好处。它将从能够最大化整体收入的算法中获得更大的好处。这通常要复杂一点,但原理是一样的。

一个简单的测试?在您选择的 KPI 中添加“等等……”:即,我们正在优化额外的利润增长,等等,这将使我们能够在短时间内大幅提高底线收入。这个练习把你带出经常导致这个设计缺陷的技术思维模式。你可以交付具有更大影响力的业务可消化的产出。

**了解正确的 KPI 并非易事。**图片致谢: Evo 定价 (CC 带归属)

第二条准则更难实现。有时,很难从表面上评估特定 KPI 的改进潜力。然而,你通常可以通过识别关键痛点、资源消耗或浪费领域来找出最大潜力所在。消除这一点大有帮助。

您的目标成果最终决定了您的数据科学项目的成败。所以要慎重选择。

4.选择错误的分析深度

设计数据科学项目的最后一个致命缺陷?选择错误的分析级别

作为数据科学家,我们可以利用四个基本的分析级别:描述性、诊断性、预测性和规范性。所有这些都有其目的,但对于大多数大规模数据科学项目来说,只有规定性分析才会产生最大的影响

**价值与分析难度。**图片来源: Evo 定价 (CC 带归属)

只有规定性分析才能推动,而不是分析或预测结果。它提供了最佳的预见性,并且是优化您选择的 KPI 的最佳设计。通过规范性分析实现的灵活性使您能够实现您的目标,而不管前进道路上的干扰或障碍

在建立新项目时,很容易默认使用预测分析。毕竟,预测是大多数非数据科学家要求从他们的数据中学习的东西。另外,指令性的方法更难!但作为专家,我们应该更清楚。优化几乎总是我们的真正目的。这要求我们站出来拥抱更艰难但更有回报的成功之路

在过去的一年里,在新冠肺炎危机面前,导致人工智能模型崩溃的干扰是普遍存在的——但不是规范模型中的。他们在处理模式变化时更加敏捷,并且能够调整。

如果您想在自己的项目中避免这种失败,请仔细考虑一种规范的方法。

明确地说,描述性、诊断性和预测性分析仍有价值。但是他们永远不会让你的数据价值最大化。除非您的项目范围仅限于事后诸葛亮,仅仅是为了及时捕捉快照或以其他方式限制规模,否则您将在说明性分析方面取得更大的成功。项目难度会增加,但影响也会增加

为数据科学的成功干杯!

Guille 阿尔瓦雷斯在 Unsplash 上拍摄的照片

这可能看起来过于简单,但是简单地从你的项目设计中消除这些错误将会显著增加你在数据科学中的成功率。这是我们这个领域迫切需要的。根据 Gartner 2017 年的一项研究, 85%的数据科学项目都失败了。我认为这一数字在过去 5 年中有所改善,部分原因是人工智能和机器学习的巨大进步,但几乎没有变化的迹象。

就我们所知,为什么?

这可以归结为我们设计这些项目的核心缺陷。

最终,有缺陷的不是技术;它是实现—和我们。幸运的是,这意味着我们有能力为此做些什么。有了集成、规范的方法和正确的目标来指导您的设计,建立一个失败的数据科学计划将会困难得多。

我不能保证这四个考虑会消除你未来的所有失败,但它们会避免最持久的缺陷。这是朝着正确方向迈出的一大步。

PS 更多商业科学来自我的写作:

Monthly Business Science in your inbox, new software, and University-level learning:[**Free access**](https://evouser.com/register)Questions? Please reach out on [Linkedin](https://www.linkedin.com/in/fabrizio-fantini/)

如何不使用 Python 列表

原文:https://towardsdatascience.com/how-not-to-use-python-lists-d06cbe8e593?source=collection_archive---------4-----------------------

理解 Python 中的可变对象。

由 Sarah Kilian 在 Unsplash 上拍摄的照片

我记得几年前当我从使用 R 转换到使用 Python 时,我必须习惯的一件事是可变对象——这在 R 中并不算什么。

可变对象是创建后可以修改的对象。Python 中可变对象的一些例子是列表、字典和集合。在下面的例子中,我们在创建之后扩展了y

y = [1, 2, 3]
id(y)
Out[7]: 4831904704y.extend([4, 5, 6])
y
Out[10]: [1, 2, 3, 4, 5, 6]
id(y)
Out[11]: 4831904704

我们可以看到它保持了其唯一的标识号(由id函数给出)——这意味着我们仍然在使用同一个对象。

另一方面,不可变对象不能被修改。一些例子是元组、字符串、整数、布尔等。正如你在下面的例子中看到的,一旦我们改变了x的值,它的身份就改变了——我们已经将x重新分配给了2

x = 1
id(x)
Out[3]: 4564694112x = 2
id(x)
Out[5]: 4564694144

如果您不习惯可变对象,那么编写具有…的代码是相当容易的。意想不到的后果。

让我们来看几个例子(在大多数情况下,不要做什么)。

列表作为默认参数?

假设您正在编写一个类来帮助跟踪每个人的朋友。所以你要做以下事情。

*class* FriendBook:
    *def __init__*(self, *name*, *friends*=[]):
        self.name = *name* self.friends = *friends

    def* add_new_friend(self, *friend*):
        *if friend not in* self.friends:
            self.friends.append(*friend*)

然后你开始为不同的人创建友谊书。

person_a_friendbook = FriendBook(name='Person A')
person_b_friendbook = FriendBook(name='Person B')person_c_friendbook = FriendBook(
  name='Person C', 
  friends=['Person E'],
)person_a_friendbook.add_new_friend('Person D')

现在,我们希望 B 在这一点上没有朋友。但是,事实并非如此。

person_a_friendbook.friends
Out[3]: ['Person D']person_b_friendbook.friends
Out[5]: ['Person D']person_c_friendbook.friends
Out[7]: ['Person E']

这是因为我们的默认参数friends=[]只被创建一次,在我们创建类的时候。我们可以通过使用比较它们的身份的is操作符来验证这一点。

person_a_friendbook.friends is person_b_friendbook.friends
Out[8]: True

我们可以看到person_a_friendbook.friendsperson_b_friendbook.friends的身份是一样的。任何时候你回过头来使用friends的缺省值,你都将使用同一个列表——这意味着这个列表将被所有使用缺省参数实例化的对象共享。这很少(很可能永远不会)是我们想要的。大多数 ide 会警告你。

PyCharm 试图将我们从可变的默认参数中拯救出来。图片由作者提供。

解决办法很简单。

*class* FriendBook:
    *def __init__*(self, *name*, ***friends*=None**):
        self.name = *name* **self.friends = friends or []** *def* add_new_friend(self, *friend*):
        *if friend not in* self.friends:
            self.friends.append(*friend*)

这样,我们为每个对象都获得了一个新的空列表。

但我只是修改了函数内部的列表?

继续下一个我们可能会搞砸的方式。

x = [1, 2, *None*, 4, 5, *None*]

*def* fill_none(*data*, *fill_value*):
    n = len(*data*)
    *for* i *in* range(n):
        *if data*[i] *is None*:
            *data*[i] = *fill_value

    return data* y = fill_none(data=x, fill_value=100)

上面的函数越过data并用fill_value替换None值。

y
Out[1]: [1, 2, 100, 4, 5, 100]

y的值是我们所期望的。你能猜出x现在是什么吗?如果你认为它和y一样,那么你是正确的。

x
Out[2]: [1, 2, 100, 4, 5, 100]

当我们将一个可变对象作为参数传递给一个函数时,我们给了这个函数修改它的权力。现在,我们可以用两种方法来解决这个问题。第一个是清楚地表明,如果我们真的想这样的话,函数会修改列表。在我看来,我们可以通过删除return语句并添加一个 docstring 来实现。

x = [1, 2, *None*, 4, 5, *None*]

*def* fill_none(*data*, *fill_value*):
    '''
    Replace None values with the fill_value. Modifies data in-place.
    '''
    n = len(*data*)
    *for* i *in* range(n):
        *if data*[i] *is None*:
            *data*[i] = *fill_value* fill_none(data=x, fill_value=100)

第二种选择是在函数中使用列表的副本。

x = [1, 2, *None*, 4, 5, *None*]

*def* fill_none(*data*, *fill_value*):
    data = data[:]  # make a copy of data
    n = len(*data*)
    *for* i *in* range(n):
        *if data*[i] *is None*:
            *data*[i] = *fill_value* *return data*y = fill_none(data=x, fill_value=100)

现在xy不一样了。

y
Out[13]: [1, 2, 100, 4, 5, 100]
x
Out[14]: [1, 2, None, 4, 5, None]

你确定元组是不可变的吗?

如果你记得,在这篇文章的开始,我们说过元组是不可变的,它们是不可变的,它们没有允许我们改变它们的方法。你可能想知道的一件事是“我能在里面放一个列表吗?”然后“我能改变元组内部的列表吗?”。答案是“是”和“是”。

my_list = [1, 2, 3]
my_tuple = ('a', 'b', my_list)my_tuple
Out[1]: ('a', 'b', [1, 2, 3])my_list.append('surprise')my_tuple
Out[2]: ('a', 'b', [1, 2, 3, 'surprise'])

为什么会这样?嗯,tuple 是不可变的意味着我们在创建它之后不能改变它包含的对象(但是如果它们是可变的,我们可以修改其中的对象)。事实上,即使在我们修改了列表之后,my_tuple仍然包含相同的三个元素,它们在我们创建它的时候都有相同的身份。这不一定是“搞砸了”或你想做的事情,但如果你没有意识到这一点,可能会令人困惑。

结论

在这篇文章中,我们讨论了 Python 中的可变和不可变对象。我们关注了可变对象,更具体地说是列表,如果不知道它们是如何工作的,会导致意想不到的后果。

  • 订阅 邮件更新
  • 成为 媒体的会员,获得所有故事的全部访问权限。你的会员费直接支持你读的作家。

更多来自同一作者。

https://medium.com/analytics-vidhya/calculating-using-monte-carlo-simulations-337cff638ac5

你撞头的频率取决于你离北极有多近

原文:https://towardsdatascience.com/how-often-you-bang-your-head-depends-on-how-close-you-are-to-the-north-pole-665980f2e80e?source=collection_archive---------23-----------------------

詹尼弗·拉特珀里萨-安德森在 Unsplash 上拍摄的照片

此外,还有一堂关于 Altair python 可视化的课

这是一种古老的技术。这叫权力姿态。你拥有宇宙,所以举起你的岩石酒杯;为摇滚的人干杯。现在微笑点头,让我看看你的眼珠子,好像有什么不对劲。

你听起来熟悉吗?

在一个过去 15 年来小心存放的外置硬盘中,我发现了电影、连续剧、照片、视频和其他随身物品。它有我过去常听的歌曲的 mp3 快速一瞥,我看到了范·海伦,金属乐队,梅加迪思,以及其他艺术家。我打开了其中的几个文件,但大多数都无法播放,或者比特率太低,我甚至无法欣赏它们。这就是时间对你的影响!

说实话,我从来都不是一个狂热的金属追随者,但硬摇滚亚流派正好符合我的兴趣。我原以为我的 Spotify 的大部分播放列表会被《摇滚但男人》占据。我还能错得更离谱吗?我还是会定期听很多经典,还是会点点头。检查完硬盘后,我花了几个小时听老音乐,后来在网上搜索相关数据集,看看摇滚学校发生了什么;很快,我找到了一个,但它是为金属乐队而不是摇滚。

哦好吧!这不是关于敲打头部,而是关于猛烈地摇晃它。

我们走吧!🤘

寻找重金属

我在 Kaggle 上找到了一个数据集,你也可以在这里访问它。它包含了从这个摇滚子类开始(即 1964 年)的金属乐队的信息。你也可以使用从金属档案里刮来的关于死亡金属的这里。

在丢弃了复制品和那些没有任何原产国的乐队后,我前进到观想。放心吧!所有那些掉下来的都不流行,因为他们只有很少的粉丝(变量之一)。

没心情用 matplotlib,plotly,bokeh,seaborn,就用 Altair 吧。

谁最摇滚?

我知道的许多著名乐队来自美国和英国,但北欧和斯堪的纳维亚也不甘落后。我们来调查一下。

使用 Altair 相当容易;我推荐看杰克·范德普拉斯(Jake VanderPlas)的前 40 分钟视频。

你提到你的数据框架作为“源”,并使用其中的属性来构建你的图。您可以在字段中使用诸如“排序”之类的选项,并且可以获得想要的效果。无需专门更改数据集。

作者图片

不出所料,美国和英国有很多金属乐队,斯堪的纳维亚国家也名列前茅。

但这是清晰的画面吗?美国、英国和德国人口众多,所以也许我们需要找出人均金属乐队的数量。

人均摇滚现场

该图表很容易制定,我需要创建一个临时数据框架,将国家的人口作为一个属性,可用于进行更准确的分析。

作者图片

法罗群岛?他们在黑色安息日和金属乐队是不是用药过量了?嗯,他们有 5 个频段,代表 5 万人口,所以每 1 万人就有一个频段,如图所示。此外,法罗岛紧挨着丹麦和瑞典,所以它得到了感应效应。

如果梵蒂冈城只有一个乐队,它会让所有其他国家感到羞愧(梵蒂冈人口约 800 人)。

那么,是什么亚类让它们滴答作响呢?

金属世界中最受欢迎的分支是什么?我猜这将是重金属,鞭打,黑色。

作者图片

请注意,我们到目前为止所做的所有图表都是条形图,所以上面的代码只做了微小的改动。

要在笔记本、VSCode 或 Atom 中呈现这些图形,请使用:

我又对了!

黑色、死亡和沉重的统治。黑暗之神一定很高兴。

金属正在消亡吗?

每年有多少个金属乐队成立?

作者图片

这些年来,乐队的数量似乎在减少。这是否意味着金属正在消亡?

仅仅因为你没在听它,并不意味着它遇到了它的创造者。找到每年形成和分裂的波段,以找到每年活跃波段的数量,这是公平的。

作者图片

金属是摇滚的一个分支,它比硬摇滚更刺耳,硬摇滚在大众和广播中都有听众。你不会在收音机里听到金属歌曲,你必须自己去寻找。如果你不去尝试,你永远也找不到它,并且会认为它是一种正在消亡的文化。

给那些让我们头大的人

每个国家最受欢迎的金属乐队有哪些?

作者图片

这是一个有趣的图表,因为条形标有。你可以选择任何颜色,你只需要指定十六进制代码,并不限于特定库的样式表。通过使用(图表+文本)来查看单个图表中的效果,您可以制定图形的单个元素,并可以像上面一样绑定它们。

词源学视角

我最终将我的数据框架与金属档案中的数据合并,因为它很好地包含了乐队的主题信息。一个简单的词云就能说明很多:)

作者图片

哦好吧!你在期待什么?

世界观

作者图片

这是一个使用 leav 创建的图表,只是条形图的另一种表示。

裁决是明确的。

格陵兰岛、冰岛、瑞典、挪威和芬兰似乎摇摆得很厉害;离北极越近,头撞得越厉害!:)

你可以在我的 GitHub 上找到创建图表的代码。和往常一样,你可以在 Twitter (@prashantmdgl9)上找到我,或者在 LinkedIn 上大喊一声。我很想知道你会用这些数据创造出什么样的视觉效果。

后来添加的东西

摇滚、硬摇滚、金属都经历了时间的考验;那些不认为它们是真正的音乐的人并不喜欢它们,即使是现在,人们也经常拿它们与老派的古典音乐相比较,这是不公平的。但是只要你喜欢,谁会在乎呢!

还有,我不明白为什么一个人要把自己的音乐品味限制在这样或那样的形式上?我可以像喜欢罗伯特·普兰特的音乐一样喜欢卡切里(古典卡纳蒂克音乐家的集会)。

那么为什么要选择呢?

毕竟,这都是音乐,始于大约 45000 年前有人将两块石头撞在一起。

我从这篇文章中学到的是付了我将近一年的房租

原文:https://towardsdatascience.com/how-one-article-has-paid-my-rent-for-nearly-a-year-4c8937e58136?source=collection_archive---------2-----------------------

如果你有自己的观点,大胆地说出来

安德鲁·尼尔在 Unsplash 上拍照

在我攻读理学硕士期间,我的一位教授说了一句话,完全改变了我对自己表达思想方式的看法:“你必须让自己与众不同;你得是个异教徒。”

以人工智能领域的研究规范在过去十年中的变化为例:多年来,人工神经网络被认为是一个失败的事业,一个死胡同。涉及神经网络(NN)的文章受到了怀疑,它们的作者试图隐瞒他们的论文研究 NN 相关属性的事实。

然后,Geoffrey Hinton、Yann LeCun 和 Yoshua Bengio 为我们带来了深度学习,这是一场现在主导该领域的革命,为他们赢得了 2018 年的图灵奖,并为应用程序开发者和用户开辟了新的可能性。深度学习是几十年来坚持反对人工智能研究范式的结果。

"未来取决于某个对我所说的一切深感怀疑的研究生。"杰弗里·辛顿。

因此,我决定听从这个建议,触及我所在领域的一个几乎是禁忌的话题。我有我的想法,我需要把它表达出来。文章的主题其实并不重要,也不是本文的重点。这不是一篇关于如何写故事在媒体上传播的文章。我没有那个食谱。但是,如果你好奇的话,它是关于微软和 Linux、公司和开源世界之间的“激烈战争”,以及如何在一个系统下统一一切以完成工作。

当我完成这篇文章并把它提交给一家媒体时,没有任何东西能预测接下来会发生什么。这篇文章是在早上发布的,直到下午晚些时候,它似乎没有什么特别之处。它有几百个浏览量,我没有在任何社交媒体或相关论坛上发布链接;没有自我推销。

然后,发生了一些事情,每次我刷新 Medium stats 页面时,这篇文章都会获得数百次浏览。直到今天,我不确定是谁推动了它,但它以超过七千的浏览量结束了这一天。第二天又拿了 16 万,第三天又加了 10 万。

我继续在你能想象到的每个论坛或脸书小组中发现这篇文章。一开始,如果辩论不是用英语进行的,我不得不通过谷歌翻译来搜索评论,以获得讨论的要点。最终,这是不可维护的或者没有效率的,所以我就让它这样吧。

最终,这篇文章获得了超过 50 万的浏览量,7.5K 的掌声,超过 1000 小时的会员阅读时间,以及 60 多条评论,其中大多数都指责我贿赂;我告诉过你这个话题在我的领域几乎是一个禁忌,所以如果你表达了一个不受欢迎的观点,那是要付出代价的。然而,我认为 7.5K 的掌声远远补偿了那些没有根据的评论。另外,这是我第一篇被翻译成多种语言的文章。

余波

差不多一年过去了,我仍然收到这篇七分钟长的文章的评论、掌声、提及和关注。但是我得到的不仅仅是中等收入。更多:

  • 我找到了今天的工作
  • 图书代理商的兴趣
  • 这个平台和其他平台上的关注者继续支持我的工作
  • 我的时事通讯越来越多的订户
  • Twitter 上有影响力的追随者,他们欣赏强烈的观点

我以前写过一两篇像病毒一样传播的文章,之后也写过几篇,但都没有达到那个规模。简而言之,在过去的一年里,单是这篇文章就已经支付了我很大一部分费用。但这不是你应该从这个故事中隐瞒的。

如果你有意见,就需要表达出来

在我开始在 Medium 上写作之前,我没有写博客的经验。去年二月我发表了我的第一篇文章。这是一篇展示我开发的编程库的教程文章。

从那天起,我决定发表我对所阅读的东西的笔记。我研究一些新的东西,做笔记,把它们转化成一篇文章,发表在媒体上。

那篇被广泛传播的文章正是如此。我关于如何统一 Windows 和 Ubuntu 的笔记。这是我遇到的一个实际问题的解决方案。但是还有更多:这也是一篇固执己见的文章。

我没有试图卖任何东西。我没有承诺改变任何人的生活,我没有撒谎,当然,微软也没有资助我。我表达了我的观点,并有证据支持,而这个观点碰巧不受欢迎。我是个异教徒。我睡着了,醒来,成千上万的人在争论这件事。这就是未知因素。这篇文章让人反应过来,支持我的观点,反推,甚至留下可恨的评论。

这篇文章的目的不是给你提供一个写文章的清单,也不是告诉你如何在媒体上致富。然而,你永远不知道谁会读你记下的东西。你永远不知道你会影响谁,谁会参考你的作品。在这个互联的世界里,只需要一个人。

所以,如果你有自己的观点,就要与众不同。人们不需要另一篇文章来宣扬一种已经很流行的观点。你不需要被所有人喜欢,你当然也不需要认同所有人。如果你有自己的观点,大声说出来,大胆提出,拿出证据,做一个异端。

Learning Rate 是为那些对 AI 和 MLOps 世界好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。在这里订阅!

关于作者

我叫 Dimitris Poulopoulos ,我是一名为 Arrikto 工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。你可以在 Medium 、 LinkedIn ,或者@ james2plTwitter 上关注我。

PagerDuty 如何应用 DevOps 最佳实践来实现更可靠的大规模数据

原文:https://towardsdatascience.com/how-pagerduty-applies-devops-best-practices-to-achieve-more-reliable-data-at-scale-67fa6ba75242?source=collection_archive---------28-----------------------

数据可观察性 101

以下是这家开创事件管理先河的公司如何防止数据停机

图片由 Shutterstock 上的 Michael V 提供,可供拥有标准许可的作者使用。

page duty帮助 90 个国家的 16,800 多家企业通过其数字运营管理平台实现正常运行时间 SLA,支持随叫随到管理、事件智能、分析和事件响应。

那么,PagerDuty 是如何在自己的组织内处理特定于数据的事件管理的呢?最近,我与数据平台和分析高级总监 Manu Raj (被恰当地命名为 DataDuty 团队)进行了交谈,以了解他的团队在防止“数据宕机”和相关消防演习方面的更多信息。

PagerDuty 的数据前景

PagerDuty 的业务数据平台团队有一个明确的任务:随时随地为客户提供可信的数据,这些数据易于理解,并能实现高效的决策。

“其中最关键的部分是数据治理、数据质量、安全性和基础设施运营,”Manu 说。该团队的客户包括“几乎所有的部门,包括财务、行政、客户成功、工程、销售和营销。”

就他们的平台本身而言,DataDuty 团队用的是 page duty——“我们绝对要吃自己的狗粮”——还有数据仓储用的雪花,数据科学用的 Fivetran,Segment,Mulesoft,AWS,Databricks。

该团队最近还将他们的堆栈与 ML 驱动的 数据可观察性 集成在一起,使他们能够通过监控、跟踪和排除管道每个阶段的数据事件,全面了解数据系统的健康状况。

寻呼机工作中的数据挑战

像大多数 SaaS 公司一样,PagerDuty 使用大量 SaaS 云应用程序(想想 Salesforce、Marketo 和 Netsuite ),并吸收大量内部和第三方数据。结构化数据、非结构化数据、不同节奏的数据以及不同粒度的实时批处理数据都是 PagerDuty 整体数据生态系统的一部分。

DataDuty 团队的主要挑战是确保数据质量满足最终用户的期望,使他们能够基于准确的数据做出更快的决策。

Manu 表示:“业务的动态本质是推动数据挑战的原因。“业务数据需求每个季度都在不断变化,必须快速做出准确的决策。一切都是数据驱动的,所以我们必须保持敏捷。”

使用 DevOps 最佳实践来扩展数据事件管理

为了完成他们雄心勃勃的任务,DataDuty 团队对其数据管道实施了大量的 DevOps 事件管理最佳实践。

最佳实践#1:确保您的事件管理涵盖整个数据生命周期。

图片由 PagerDuty 提供。

在 PagerDuty,数据工程师的事件管理属于他们所谓的数据操作,这是 DevOps 的扩展。它包括对数据和管道问题的跟踪、响应和分类。

一旦数据进入仓库,一直到出现在面向客户的报告中,都有可能出现各种类型的数据宕机,从丢失数据到错误模型。DataDuty 团队监控数据质量问题,包括异常、新鲜度、模式更改、指标趋势等。

数据可观察性 对于监控和确保数据仓库中的数据质量尤为重要。您可以通过 ETL 工具进行定制的数据质量检查,在数据管道级别进行干预,但是随着时间的推移,管理逻辑、脚本和数据生态系统的其他元素会变得很麻烦。此外,正如 Manu 指出的,数据趋势的问题无法通过管道质量检查来识别。

最佳实践#2:事故管理应包括噪音抑制

图片由 PagerDuty 提供。

在实施数据监控和异常检测时,数据噪音是一个主要问题,在企业范围内,您每天都会收到各种各样的“警报”,其中许多警报表明您的数据发生了变化,但不一定是全新的“问题”数据团队需要能够在客户、企业所有者之间进行分类,并及时响应这些警报,同时对数据产品本身委派明确的所有权。

Manu 的 DataDuty 团队使用 PagerDuty 事件智能来识别类似的数据事件警报,抑制包含多个数据问题的一个事件的多个警报。这样,他的团队成员就不会被警报淹没,可以专注于修复手头数据问题 的 根本原因。

最佳实践#3:对数据资产和事件进行分组,以智能地发送警报

图片由作者提供。

Manu 表示,数据可观察性是任何数据事件管理步骤(包括事件响应和上报)发生之前的第一步。毕竟,与异常趋势或指标相比,“我的数据没有刷新”是一个完全不同的问题。团队需要能够识别这种数据问题随着时间的推移而存在。

当 DataDuty 团队开始在他们自己的数据平台上集成数据可观察性和 page duty时,他们遵循了 DataOps 的最佳实践,包括将数据问题分组在一起,以便基于 360 度视图实现更轻松的路由和警报,包括:

  1. 将类似的数据管道问题与数据可观察性组合在一起,并在此工作流之上实施 page duty,确保这些警报被正确发送给 DataDuty 团队。由于他们使用气流进行调度,团队也通过 PagerDuty 接收气流警报。
  2. 识别公司最关键的数据资产,包括管理层报告和财务报告层面的数据。现在,与这些资产相关的警报通过带有升级策略的 PagerDuty 发出,并自动发送给其他利益相关者和商业智能团队。
  3. 利用事件警报和可观察性来监控 BI 指标的运行状况,如客户数量、客户流失率、账户数量和数据事件数量。然后,这些警报被发送给商业智能团队,以便他们能够进行监控并根据需要采取措施。

凭借这些最佳实践,PagerDuty 的平台团队通过从 DevOps 的角度来处理数据事件管理,实现了他们的使命,这与数据可观察性的 原则 完全一致。

作为集成合作伙伴,我们的平台协同工作,帮助企业识别和解决数据事件,使领导者能够快速自信地做出数据驱动的决策。

好奇一些最优秀的团队是如何开创数据可观测性的?RSVP for IMPACT 2021!

百分比近似值的工作原理(以及为什么它比平均值更有用)

原文:https://towardsdatascience.com/how-percentile-approximation-works-and-why-its-more-useful-than-averages-67a5c7490d88?source=collection_archive---------26-----------------------

实践教程

图片由马克西姆·霍普曼在 Unsplash 上拍摄

初步了解百分位数近似值,为什么它们对分析大型时间序列数据集有用,以及我们如何创建百分位数近似值超函数来提高计算效率、可并行化,并与连续聚合和其他高级时标 DB 功能一起使用。

在我最近发表的关于时间加权平均的文章中,我描述了我早期的电化学职业生涯如何让我认识到时间加权平均的重要性,这塑造了我们如何将它们构建成时标超函数。几年前,在我开始学习更多关于 PostgreSQL 内部的知识后不久(查看我的聚合和两步聚合帖子来亲自了解它们!),我在一家广告分析公司做后端工作,在那里我开始使用 TimescaleDB。

像大多数公司一样,我们非常关心确保我们的网站和 API 调用在合理的时间内为用户返回结果;我们的分析数据库中有数十亿行数据,但我们仍然希望确保网站响应迅速且有用。

网站性能和商业结果之间有直接的关联:如果用户不得不等待太长时间才能得到结果,他们会感到厌烦,从商业和客户忠诚度的角度来看,这显然是不理想的。为了了解我们网站的表现并找到改进的方法,我们跟踪了 API 调用的时间,并将 API 调用响应时间作为一个关键指标。

监控 API 是一个常见的场景,通常属于应用程序性能监控(APM)的范畴,但是在其他领域也有很多类似的场景,包括:

  1. 工业机器的预测性维护
  2. 航运公司的船队监控
  3. 能源和水使用监控和异常检测

当然,分析原始(通常是时间序列)数据只能帮到你这么多。您希望分析趋势,了解您的系统相对于您和您的用户的期望表现如何,并在问题影响生产用户之前捕捉和修复问题,等等。我们构建了 TimescaleDB hyperfunctions 来帮助解决这个问题,并简化开发人员处理时序数据的方式。

作为参考,hyperfunctions 是一系列 SQL 函数,可以用更少的代码行更容易地操作和分析 PostgreSQL 中的时序数据。您可以使用超函数来计算数据的百分比近似值,计算时间加权平均值,缩减采样和平滑数据,并使用近似值执行更快的COUNT DISTINCT查询。此外,超函数“易于”使用:您可以使用您熟悉和喜爱的相同 SQL 语法来调用超函数。

我们与社区成员交谈以了解他们的需求,我们的初始版本包括一些最常被请求的功能,包括百分点近似值(参见 GitHub 功能请求和讨论)。它们对于处理大型时间序列数据集非常有用,因为它们提供了使用百分位数(而不是平均值或其他计数统计数据)的好处,同时计算速度快、空间效率高、可并行化,并且对于连续聚合和其他高级 TimescaleDB 功能非常有用。

我从七年级数学中忘记的事情:百分位数与平均值

我可能在七年级的数学课上学到了平均值、中间值和众数,但是如果你和我一样,它们可能会周期性地迷失在“我曾经学过并认为我知道的东西,但实际上,我并不像我想象的那样记得很清楚。”

在我研究这篇文章的时候,我发现了一些很好的博客帖子(参见来自 Dynatrace 、 Elastic 、 AppSignal 和 Optimizely 的人们的例子),关于平均值对于理解应用程序性能或其他类似的事情来说并不太好,以及为什么使用百分位数更好。

我不会在这上面花太多时间,但我认为提供一点背景知识是很重要的,这是关于为什么百分位数如何帮助我们更好地理解我们的数据。

首先,让我们考虑百分位数和平均值是如何定义的。为了理解这一点,我们先来看一个 正态分布 :

正态分布(或称高斯分布)描述了落在给定值附近的许多真实世界的过程,其中找到远离中心的值的概率降低。对于正态分布,中值、平均值和众数都是相同的,它们落在中心的虚线上。作者图片

正态分布是我们在思考统计时经常想到的;这是入门课程中最常用的方法之一。在正态分布中,中值、平均值(也称为均值)和众数都是相同的,尽管它们的定义不同。

中值是中间值,一半数据在上面,一半在下面。均值(又名平均值)定义为总和(值)/计数(值),而模式定义为最常见或最频繁出现的值。

当我们看到这样的曲线时,x 轴代表值,而 y 轴代表我们看到给定值的频率(即,y 轴上“较高”的值出现的频率更高)。

在正态分布中,我们看到一条以最频繁值为中心的曲线(虚线),随着距离最频繁值越远,看到值的概率越小(最频繁值是众数)。请注意,正态分布是对称的,这意味着中心左侧和右侧的值出现的概率相同。

中位数或中间值也称为第 50 个百分位数(100 个百分位数中的中间百分位数)。这是 50%的数据小于该值,50%大于该值(或等于该值)时的值。

在下图中,一半的数据在左边(蓝色阴影),另一半在右边(黄色阴影),第 50 个百分位直接在中间。

描述了中位数/第 50 百分位的正态分布。作者图片

这就引出了百分位数:百分位数被定义为 x %的数据低于该值的值。

例如,如果我们称之为“第 10 个百分位数”,我们的意思是 10%的数据小于该值,90%的数据大于(或等于)该值。

描述了第 10 百分位的正态分布。作者图片

第 90 个百分位数是 90%的数据小于数值,10%大于数值:

描绘了具有第 90 百分位的正态分布。作者图片

为了计算第 10 个百分位数,假设我们有 10,000 个值。我们取所有的值,从最小到最大排序,并确定第 1001 个值(其中 1000 或 10%的值低于它),这将是我们的第 10 个百分位数。

我们之前注意到,在正态分布中,中位数和平均数是相同的。这是因为正态分布是对称的。因此,值大于中值的点的大小和数量是完全平衡的(在大小和小于中值的点的数量上)。

换句话说,在中间值的两边总是有相同数量的点,但是平均值考虑了点的实际值。

为了使中值和平均值相等,小于中值的点和大于中值的点必须具有相同的分布(即,必须有相同数量的点稍微大一些、稍微小一些、大得多和小得多)。(**更正:**正如在黑客新闻中向我们指出的那样,从技术上来说,这仅适用于对称分布,不对称分布可能适用,也可能不适用,你可能会遇到不对称分布相等的奇怪情况,尽管可能性较小!)

**为什么这很重要?**正态分布中中位数和平均数相同的事实会造成一些混淆。因为正态分布通常是我们首先学习的东西之一,所以我们(包括我自己!)可以认为它适用于比实际更多的情况。

人们很容易忘记或没有意识到,只有中值保证 50%的值会在上面,50%在下面——而平均值保证 50%的加权值会在上面,50%在下面(即,平均值是质心,而中值是中心)。

在正态分布中,平均值和中值是相同的,它们将图形精确地分成两半。但是它们的计算方式不同,表示的内容也不同,在其他分布中也不一定相同。作者图片

🙏向在 Desmos 的人们大声欢呼,感谢他们伟大的图形计算器,它帮助制作了这些图形,甚至允许我制作这些概念的互动演示!

但是,为了脱离理论,让我们考虑一些现实世界中更常见的东西,比如我在广告分析公司工作时遇到的 API 响应时间场景。

长尾、异常值和真实效应:为什么百分位数比平均值更好地理解你的数据

我们看了平均值和百分位数的不同之处,现在,我们将使用一个真实的场景来演示使用平均值而不是百分位数是如何导致错误警报或错失机会的。

为什么?平均值并不总是给你足够的信息来区分真实的影响和异常值或噪音,而百分位数可以做得更好。

简而言之,使用平均值会对数值的报告方式产生巨大的(和负面的)影响,而百分位数可以帮助你更接近“真相”

如果您在查看类似 API 响应时间的东西,您可能会看到一个类似于下面这样的频率分布曲线:

API 响应时间的频率分布,峰值为 250 毫秒(所有图表未按比例绘制,仅用于演示目的)。作者图片

我以前在广告分析公司工作时,我们的目标是让大多数 API 响应调用在半秒内完成,很多比这短得多。当我们监控我们的 API 响应时间时,我们试图理解的最重要的事情之一是用户如何受到代码变化的影响。

我们的大多数 API 调用在半秒钟内完成,但是有些人使用系统在很长的时间内获得数据,或者有奇怪的配置,这意味着他们的仪表板响应速度有点慢(尽管我们试图确保这些情况很少发生!).

由此产生的曲线类型被描述为长尾分布,其中我们在 250 ms 处有一个相对较大的峰值,我们的许多值都在该峰值之下,然后响应时间以指数方式减少。

我们之前讨论过如何在对称曲线中(像正态分布),但是长尾分布是一个不对称曲线。

这意味着最大值比中间值大得多,而最小值与中间值相差不远。(在 API 监控的情况下,您永远也不会有响应时间少于 0 秒的 API 调用,但是它们可以花费的时间是没有限制的,所以您会得到较长 API 调用的长尾效应)。

因此,长尾分布的平均值和中值开始偏离:

标有中值和平均值的 API 响应时间频率曲线。图表未按比例绘制,仅用于演示目的。作者图片

在这种情况下,平均值明显大于中值,因为长尾理论中有足够多的“大”值使平均值更大。相反,在其他一些情况下,平均值可能小于中值。

但是在广告分析公司,我们发现平均值没有给我们足够的信息来区分我们的 API 如何响应软件变化的重要变化和只影响少数人的噪音/异常值。

在一个案例中,我们对有新查询的代码进行了修改。该查询在暂存中运行良好,但是在生产系统中有更多的数据。

一旦数据“热了”(在内存中),它就会运行得很快,但第一次运行时非常慢。当查询投入生产时,大约 10%的调用的响应时间超过了一秒。

在我们的频率曲线中,大约 10%的呼叫的响应时间超过 1 秒(但不到 10 秒),导致我们的频率曲线出现第二个较小的峰,如下所示:

频率曲线显示了当 10%的呼叫花费 1 到 10 秒之间的适度时间时发生的偏移和额外峰(图表仍未按比例绘制)。作者图片

在这种情况下,平均值变化很大,而中位数略有变化,但影响较小。

您可能认为这使得平均值比中值更好,因为它帮助我们识别问题(太长的 API 响应时间),并且我们可以设置我们的警报,以便在平均值变化时发出通知。

让我们想象一下,我们已经做到了这一点,当平均值超过 1 秒时,人们就会采取行动。

但是现在,我们有一些用户开始从我们的用户界面请求 15 年的数据…这些 API 调用需要很长时间。这是因为 API 并不是真正为处理这种“标签外”使用而构建的。

这些用户打来的几个电话就轻松地让平均时间超过了我们的 1s 阈值。

为什么?平均值(作为一个值)可能会受到像这样的异常值的显著影响,即使它们只影响一小部分用户。平均值使用数据的总和,因此异常值的大小会产生巨大的影响,而中位数和其他百分位数则基于数据的排序。

我们的曲线有一些异常值,其中不到 1%的 API 调用响应超过 100 秒(响应时间有一个断点,表示异常值会偏右,否则,该图仍未按比例绘制)。作者图片

关键是,平均值并没有给我们一个区分异常值和真实影响的好方法,当我们有长尾或非对称分布时,它会给出奇怪的结果。

为什么理解这一点很重要?

好吧,在第一个案例中,我们有一个问题影响了 10%的 API 调用,这可能是 10%或更多的用户(它怎么可能影响超过 10%的用户呢?嗯,如果一个用户平均进行 10 次调用,10%的 API 调用受到影响,那么,平均来说,所有用户都会受到影响…或者至少大部分用户会受到影响。

我们希望对这种影响大量用户的紧急问题做出快速响应。我们建立了警报,甚至可能让我们的工程师在半夜起床和/或回复一个更改。

但是在第二种情况下,“标签外”用户行为或小错误对一些 API 调用有很大影响,这种情况要好得多。因为受这些异常值影响的用户相对较少,所以我们不想让我们的工程师在半夜起床或者恢复一个更改。(识别和理解离群值仍然很重要,无论是对于理解用户需求还是代码中的潜在错误,但是它们通常不是紧急事件

除了使用平均值,我们可以使用多个百分点来理解这种类型的行为。请记住,与平均值不同,百分位数依赖于数据的排序,而不是受数据的大小的影响。如果我们使用第 90 百分位,我们知道10%的用户的值(在我们的例子中是 API 响应时间)大于它。

让我们看看原始图表中的第 90 个百分位数;它很好地捕捉了一些长尾行为:

我们最初的 API 响应时间图显示了第 90 个百分点、中间值和平均值。图未按比例绘制。作者图片

当我们有一些由运行超长查询的少数用户或影响一小组查询的 bug 引起的异常值时,平均值会发生变化,但第 90 个百分点几乎不受影响。

异常值影响平均值,但不影响第 90 百分位或中位数。(图未按比例绘制。)作者图片

但是,当尾部由于影响 10%用户的问题而增加时,我们看到第 90 个百分位非常显著地向外移动——这使得我们的团队能够得到通知并做出适当的响应:

但是,当有“真正的”影响超过 10%用户的响应时,第 90 个百分位会发生显著变化(图未按比例绘制。)图片由作者提供。

这(希望)让您更好地了解百分位数如何以及为什么可以帮助您识别大量用户受到影响的情况——但不会给您带来误报的负担,误报可能会唤醒工程师并让他们感到疲劳!

那么,现在我们知道了为什么我们可能想要使用百分位数而不是平均值,让我们来谈谈我们是如何计算它们的。

PostgreSQL 中百分点的工作原理

为了计算任何一种精确的百分位数,你取所有你的值,对它们进行排序,然后根据你试图计算的百分位数找到第 n 个值。

为了了解这在 PostgreSQL 中是如何工作的,我们将展示我们广告分析公司的 API 跟踪的一个简化案例。

我们将从这样一个表格开始:

CREATE TABLE responses(
	ts timestamptz, 
	response_time DOUBLE PRECISION);

在 PostgreSQL 中,我们可以使用[percentile_disc](https://www.postgresql.org/docs/current/functions-aggregate.html#FUNCTIONS-ORDEREDSET-TABLE) 聚合来计算列response_time的百分比:

SELECT 
	percentile_disc(0.5) WITHIN GROUP (ORDER BY response_time) as median
FROM responses;

这看起来和普通的聚合不一样;WITHIN GROUP (ORDER BY ...)是一种不同的语法,它作用于称为有序集聚合的特殊聚合。

在这里,我们将我们想要的百分位数(0.5 或中位数的第 50 个百分位数)传递给percentile_disc函数,我们要评估的列(response_time)放在 order by 子句中。

当我们了解了引擎盖下发生的事情后,就会更清楚为什么会发生这种情况。百分位数保证 x %的数据将低于它们返回的值。为了计算这个值,我们需要对一个列表中的所有数据进行排序,然后挑选出 50%的数据低于这个值,50%的数据高于这个值。

对于那些读过我们上一篇文章中关于 PostgreSQL 聚合如何工作的部分的人来说,我们讨论了像 T5 这样的聚合是如何工作的。

当它扫描每一行时,转换函数更新一些内部状态(对于avg,它是sumcount,然后一个最终函数处理内部状态以产生一个结果(对于avg,将sum除以count)。

一个 GIF 展示了如何在 PostgreSQL 中计算 avg,其中 sum 和 count 是处理行时的部分状态,而 final 函数在我们完成后将它们相除。作者 GIF。

有序集合聚合,如percentile_disc,工作方式有些类似,但有一点例外:状态不是一个相对较小的固定大小的数据结构(如sumcount代表avg,它必须保留所有已处理的值,以便对它们进行排序并在以后计算百分位数。

通常,PostgreSQL 通过将值放入一个名为[tuplestore](https://github.com/postgres/postgres/blob/c30f54ad732ca5c8762bb68bbe0f51de9137dd72/src/backend/utils/sort/tuplestore.c)的数据结构中来实现这一点,该数据结构很容易存储和排序值。

然后,当调用最后一个函数时,tuplestore将首先对数据进行排序。然后,根据输入到percentile_disc中的值,它将遍历排序数据中的正确点(中值数据的 0.5 倍)并输出结果。

使用“percentile_disc”有序集合聚合,PostgreSQL 必须将它看到的每个值存储在一个“tuplestore”中,然后当它处理完所有行时,对它们进行排序,然后转到排序列表中的正确位置提取我们需要的百分位数。

许多人发现,近似百分位数计算可以提供“足够接近”的近似值,而不需要在非常大的数据集上执行这些昂贵的计算**…这就是我们引入百分位数近似超函数的原因。**

百分位数近似值:它是什么以及为什么我们在时标超函数中使用它

根据我的经验,人们经常使用平均值和其他汇总统计数据,而不是百分位数,因为它们在大型数据集上的计算在计算资源和时间上都明显“便宜”。

正如我们上面提到的,在 PostgreSQL 中计算平均值有一个简单的二值聚合状态。即使我们计算一些额外的相关函数,如标准差,我们仍然只需要少量固定的值来计算函数。

相反,为了计算百分比,我们需要一个排序列表中的所有输入值。

这导致了一些问题:

  1. 内存占用:算法必须将这些值保存在某个地方,这意味着将值保存在内存中,直到它们需要将一些数据写入磁盘,以避免使用过多的内存(这就是所谓的“溢出到磁盘”)。这会产生很大的内存负担和/或大大降低操作速度,因为磁盘访问比内存慢几个数量级。
  2. 并行化带来的有限好处:即使算法可以并行排序列表,并行化带来的好处也是有限的,因为它仍然需要将所有排序列表合并成一个单独的排序列表,以便计算百分位数。
  3. **高网络成本:**在分布式系统中(比如 TimescaleDB 多节点),所有的值都必须通过网络传递到一个节点,才能做成一个单一的排序列表,速度慢,成本高。
  4. 没有真正的部分状态:部分状态的具体化(例如,对于连续的聚集)是没有用的,因为部分状态仅仅是它下面的所有值。这可以节省列表排序的时间,但是存储负担会很高,回报会很低。
  5. 无流式算法:对于流式数据,这是完全不可行的。您仍然需要维护完整的值列表(类似于上面的部分状态具体化问题),这意味着算法本质上需要存储整个流!

当您处理相对较小的数据集时,所有这些都是可以管理的,而对于大容量、时序工作负载,它们开始变得更成问题。

但是,如果您想要 精确的 百分位,您只需要完整的值列表来计算百分位。对于相对较大的数据集,您通常可以接受一些准确性折衷,以避免遇到这些问题。

上述问题,以及对权衡是使用平均值还是百分位数的权衡的认识,导致了多种算法的发展,以在大容量系统中近似百分位数。大多数百分位数近似方法涉及某种修改的直方图以更紧凑地表示数据的整体形状,同时仍然捕捉分布的大部分形状。

在设计超功能时,我们考虑了如何获得百分位数的好处(例如,对异常值的稳健性,与现实世界影响的更好对应性),同时避免计算精确百分位数带来的一些缺陷(如上)。

百分位数近似值似乎非常适合处理大型时间序列数据集。

结果是一整个家族的百分位近似超函数,内置于时标 DB 中。调用它们最简单的方法是使用[percentile_agg](https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/percentile_agg/) 集合和 https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/approx_percentile/ [approx_percentile](https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/approx_percentile/) 访问器。

此查询计算大约第 10、50 和 90 个百分点:

SELECT 
    approx_percentile(0.1, percentile_agg(response_time)) as p10, 
    approx_percentile(0.5, percentile_agg(response_time)) as p50, 
    approx_percentile(0.9, percentile_agg(response_time)) as p90 
FROM responses;

(如果您想了解更多关于聚合、访问器和两步聚合设计模式的信息,请查看我们的 PostgreSQL 两步聚合入门书。)

与正常的 PostgreSQL 精确百分位数相比,这些百分位数近似值有许多好处,尤其是在用于大型数据集时。

内存占用

当计算大型数据集的百分位数时,我们的百分位数近似值限制了内存占用(或者需要溢出到磁盘,如上所述)。

标准百分位数会产生内存压力,因为它们会在内存中建立尽可能多的数据集…然后在被迫溢出到磁盘时会变慢。

相反,超函数的百分位数近似值基于其修改后的直方图中的存储桶数量具有固定的大小表示,因此它们限制了计算它们所需的内存量。

单节点和多节点时标并行化 b

我们所有的百分位数近似算法都是可并行化的,因此它们可以在单个节点中使用多个工人来计算;这可以提供显著的加速,因为像percentile_disc这样的有序集合聚合在 PostgreSQL 中是不可并行化的。

并行性为单节点时标数据库设置提供了加速——这在多节点时标数据库设置中更加明显。

为什么?要使用percentile_disc有序集聚合计算多节点 TimescaleDB 中的百分比(不使用近似超函数的标准方法),必须将每个值从数据节点发送回访问节点,对数据进行排序,然后提供输出。

在 TimescaleDB 多节点中计算精确的百分比时,每个数据节点必须将所有数据发送回访问节点。接入节点然后排序并计算百分位数。图片作者。

“标准”方式的成本非常非常高,因为所有的数据都需要通过网络从每个数据节点发送到接入节点,这又慢又贵。

即使在访问节点获得数据之后,它仍然需要在将结果返回给用户之前对所有数据进行排序和计算百分比。(注意:有可能每个数据节点可以单独排序,而访问节点只执行合并排序。但是,这不会否定通过网络发送所有数据的需要,这是最昂贵的步骤。)

通过近似百分位超函数,更多的工作可以下推到数据节点。可以在每个数据节点上计算部分近似百分位数,并通过网络返回固定大小的数据结构。

一旦每个数据节点计算了它的部分数据结构,访问节点就组合这些结构,计算近似百分位数,并将结果返回给用户。

这意味着可以在数据节点上完成更多的工作,最重要的是,通过网络传输的数据要少得多。对于大型数据集,这可以大大减少在这些计算上花费的时间。

使用我们的百分位数近似超函数,数据节点不再需要将所有数据发送回接入节点。取而代之的是,它们计算一个部分近似值,并将其发送回接入节点,然后接入节点将部分近似值合并,并产生一个结果。这节省了大量网络调用时间,因为它在数据节点上并行执行计算,而不是在访问节点上执行大量工作。图片作者。

连续集合体的物化

TimescaleDB 包括一个名为连续聚合的特性,旨在使大型数据集上的查询运行得更快。

TimescaleDB continuous 聚合在后台连续并增量地存储聚合查询的结果,因此当您运行该查询时,只需要计算已更改的数据,而不是整个数据集。

不幸的是,使用percentile_disc的精确百分位数不能存储在连续的聚合中,因为它们不能分解成部分形式,而是需要在聚合中存储整个数据集。

我们设计的百分位数近似算法可用于连续聚合。它们具有固定大小的部分表示,可以在连续聚合中存储和重新聚合。

与精确百分位数相比,这是一个巨大的优势,因为现在您可以在更长的时间内进行基线和警报等操作,而不必每次都从头开始重新计算。

让我们回到 API 响应时间的例子,假设我们想要识别最近的异常值来调查潜在的问题。

一种方法是查看前一小时高于 99%的所有数据。

提醒一下,我们有一张表:

CREATE TABLE responses(
	ts timestamptz, 
	response_time DOUBLE PRECISION);
SELECT create_hypertable('responses', 'ts'); -- make it a hypertable so we can make continuous aggs

首先,我们将创建一个一小时的聚合:

CREATE MATERIALIZED VIEW responses_1h_agg
WITH (timescaledb.continuous)
AS SELECT 
    time_bucket('1 hour'::interval, ts) as bucket,
    percentile_agg(response_time)
FROM responses
GROUP BY time_bucket('1 hour'::interval, ts);

注意,我们不在连续聚合中执行访问器函数;我们只是执行聚合功能。

现在,我们可以找到最近 30 秒内大于第 99 百分位的数据,如下所示:

SELECT * FROM responses 
WHERE ts >= now()-'30s'::interval
AND response_time > (
	SELECT approx_percentile(0.99, percentile_agg)
	FROM responses_1h_agg
	WHERE bucket = time_bucket('1 hour'::interval, now()-'1 hour'::interval)
);

在广告分析公司,我们有很多用户,所以我们每小时会有成千上万的 API 调用。

默认情况下,我们的表示中有 200 个桶,因此通过使用连续聚合,我们可以大大减少存储和处理的数据量。这意味着它将大大加快响应时间。如果没有足够多的数据,您会希望增加存储桶的大小或降低近似的保真度,以大幅减少我们必须处理的数据。

我们提到,我们只在连续聚合视图定义中执行了聚合步骤;我们没有在视图中直接使用我们的approx_percentile访问函数。我们这样做是因为我们希望能够使用其他访问器函数和/或[rollup](https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/rollup-percentile/) 函数,您可能还记得这是我们选择两步聚合方法的主要原因之一。

让我们来看看这是如何工作的,我们可以创建一个每日汇总,并得到第 99 个百分位数,如下所示:

SELECT 
	time_bucket('1 day', bucket),
	approx_percentile(0.99, rollup(percentile_agg)) as p_99_daily
FROM responses_1h_agg
GROUP BY 1;

我们甚至可以使用[approx_percentile_rank](https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/approx_percentile_rank/)访问函数,它会告诉您一个值将落入哪个百分点。

百分位数排名是百分位数函数的倒数;换句话说,如果你问,第 n 百分位的值是多少?答案是一个值。

对于百分位等级,您会问这个值会在哪个百分位?答案是百分位数。

因此,使用approx_percentile_rank可以让我们看到最近 5 分钟到达的值与前一天的值相比排名如何:

WITH last_day as (SELECT   time_bucket('1 day', bucket),      
        rollup(percentile_agg) as pct_daily 
    FROM foo_1h_agg 
    WHERE bucket >= time_bucket('1 day', now()-'1 day'::interval) 
    GROUP BY 1)  
SELECT approx_percentile_rank(response_time, pct_daily) as pct_rank_in_day 
FROM responses, last_day 
WHERE foo.ts >= now()-'5 minutes'::interval;

这是连续聚合有价值的另一种方式。

我们在一天内执行了一次rollup,它只是结合了 24 个部分状态,而不是对 24 小时的数据和数百万个数据点执行完整的计算。

然后,我们使用rollup来查看它如何影响最后几分钟的数据,让我们了解最后几分钟与过去 24 小时相比的情况。这些只是一些例子,说明百分位数近似超函数如何给我们一些漂亮的结果,让我们相对简单地进行复杂的分析。

百分位数逼近深度探讨:逼近方法,它们如何工作,以及如何选择

你们中的一些人可能想知道 TimescaleDB hyperfunctions 的底层算法是如何工作的,所以让我们开始吧!(对于那些不想进入杂草中的人,可以跳过这一点。)

近似方法及其工作原理

我们实现了两种不同的百分位数近似算法作为时标 DB 超函数: UDDSketch 和 T-Digest 。每一个在不同的场景中都是有用的,但是首先,让我们了解它们是如何工作的一些基础知识。

两者都使用修正的直方图来近似分布的形状。直方图将附近的值分成一组,并跟踪它们的频率。

您经常会看到这样绘制的直方图:

直方图表示与上面的响应时间频率曲线相同的数据,您可以看到图形的形状与频率曲线是如何相似的。不按比例。图片作者。

如果您将它与我们上面展示的频率曲线进行比较,您可以看到它如何提供 API 响应时间与频率响应的合理近似值。从本质上来说,直方图有一系列的存储桶边界和落入每个存储桶的值的数量。

要计算大约百分位数,比如说第 20 个百分位数,首先要考虑代表它的总数据的分数。对于我们的第 20 百分位,这将是 0.2 * total_points

一旦有了这个值,就可以从左到右对每个桶中的频率进行求和,找出哪个桶的值最接近 0.2 * total_points

当存储桶跨越感兴趣的百分比时,您甚至可以在存储桶之间进行插值,以获得更精确的近似值。

当您想到直方图时,您可能会想到类似上面的直方图,其中所有的桶都是相同的宽度。

但是选择存储桶宽度,特别是对于变化很大的数据,会变得非常困难,或者会导致存储大量额外的数据。

在我们的 API 响应时间示例中,我们可以拥有从几十毫秒到十秒或数百秒的数据。

这意味着第 1 百分位的良好近似(例如 2 毫秒)的正确桶大小将比第 99 百分位的良好近似所需的小得多。

这就是为什么大多数百分点近似算法使用带有可变桶宽的修正直方图。

例如,UDDSketch 算法使用对数大小的桶,可能如下所示:

修改后的直方图显示了像 UDDSketch 算法使用的对数存储桶仍然可以表示数据。(注意:我们需要修改图来绘制频率/桶宽,以便比例保持相似;然而,这仅用于演示目的,并未按比例绘制)。图片作者。

UDDSketch 的设计者使用了这样的对数桶大小,因为他们关心的是相对误差

作为参考,绝对误差定义为实际值与近似值之差:

图片作者。

要获得相对误差,将绝对误差除以以下值:

图片作者。

如果我们有一个恒定的绝对误差,我们可能会遇到如下情况:

我们要求第 99 百分位,算法告诉我们是 10 秒+/-100 毫秒。然后,我们要求第 1 个百分位数,算法告诉我们是 10ms +/- 100ms。

第一百分位的误差太高了!

如果我们有一个恒定的相对误差,那么我们会得到 10ms +/- 100 微秒。

这要有用得多。(10s +/- 100 微秒可能太紧了,如果我们已经达到 10s,我们可能真的不在乎 100 微秒。)

这就是 UDDSketch 算法使用对数大小的桶的原因,其中桶的宽度与底层数据的大小成比例。这允许算法在整个百分点范围内提供恒定的相对误差。

因此,您总是知道百分位数的真实值将落在某个范围[v_approx *(1-err), v_approx * (1+err)]内。

另一方面,T-Digest 使用大小可变的存储桶,这取决于它们在分布中的位置。具体来说,它在分布的两端使用较小的桶,在中间使用较大的桶。

因此,它可能看起来像这样:

修改后的直方图显示了在极端情况下较小的可变大小存储桶(如 TDigest 算法所使用的存储桶)仍然可以表示数据(注意:出于说明目的,未按比例绘制。)图片由作者提供。

这种具有可变大小桶的直方图结构针对不同于 UDDSketch 的东西进行了优化。具体来说,它利用了这样一个想法:当你试图理解分布时,你可能更关心极值之间的细微差别,而不是范围的中间值。

例如,我通常非常关心区分第 5 百分位和第 1 百分位或者第 95 百分位和第 99 百分位,而我不太关心区分第 50 百分位和第 55 百分位。

中间的区别不如极端的区别有意义和有趣。(注意:TDigest 算法比这个要复杂一点,它没有完全捕捉到它的行为,但是我们试图给出一个大概的要点。如果你想了解更多信息,我们推荐这篇论文。

在时标超函数中使用高级近似方法

到目前为止,在这篇文章中,我们只使用了通用的percentile_agg集合。它使用 UDDSketch 算法,对于大多数用户来说是一个很好的起点。

我们还提供了单独的[uddsketch](https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/percentile-aggregation-methods/uddsketch/)[tdigest](https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/percentile-aggregation-methods/tdigest/)以及聚合,以实现更多的可定制性。

每个都将桶的数量作为它们的第一个参数(这决定了内部数据结构的大小),并且uddsketch也有一个关于目标最大相对误差的参数。

我们可以使用正常的approx_percentile访问函数,就像我们使用percentile_agg一样,因此,我们可以像这样比较中值估计:

SELECT 
	approx_percentile(0.5, uddsketch(200, 0.001, response_time)) as median_udd,
	approx_percentile(0.5, tdigest(200, response_time)) as median_tdig
FROM responses;

他们两个也和我们上面讨论的approx_percentile_rank机能亢进一起工作。

如果我们想知道 1000 在我们的分布中会落在哪里,我们可以这样做:

SELECT 
	approx_percentile_rank(1000, uddsketch(200, 0.001, response_time)) as rnk_udd,
	approx_percentile_rank(1000, tdigest(200, response_time)) as rnk_tdig
FROM responses;

此外,每个近似都有一些访问器,这些访问器只对基于近似结构的项起作用。

例如,uddsketch提供了一个error访问器函数。这将告诉您基于uddsketch看到的值的实际保证最大相对误差。

UDDSketch 算法保证最大相对误差,而 T-Digest 算法不保证,所以error只和uddsketch一起工作(和percentile_agg因为它在引擎盖下使用了uddsketch算法)。

这个误差保证是我们选择它作为缺省值的主要原因之一,因为误差保证对于确定你是否得到一个好的近似是有用的。

另一方面,Tdigest提供了min_val & max_val访问器函数,因为它将其存储桶偏向极端,并且可以提供精确的最小值和最大值,而不需要额外的成本。Uddsketch无法提供。

您可以像这样调用这些其他的访问器:

SELECT 
	approx_percentile(0.5, uddsketch(200, 0.001, response_time)) as median_udd,
	error(uddsketch(200, 0.001, response_time)) as error_udd,
	approx_percentile(0.5, tdigest(200, response_time)) as median_tdig,
	min_val(tdigest(200, response_time)) as min,
	max_val(tdigest(200, response_time)) as max
FROM responses;

正如我们在上一篇关于两步聚合的帖子中所讨论的,对所有这些聚合的调用都会被 PostgreSQL 自动删除重复数据并进行优化,因此您可以用最少的额外成本调用多个访问器。

它们都有为它们定义的[rollup](https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/rollup-percentile/)函数,所以当它们用于连续聚合或常规查询时,您可以重新聚合。

(注意:tdigest rollup 与直接在底层数据上调用tdigest相比,会引入一些额外的错误或差异。在大多数情况下,这可以忽略不计,通常相当于更改底层数据的接收顺序。)

我们在这里提供了算法之间的一些权衡和差异,但是我们在文档中有一个更长的讨论,可以帮助你选择。您也可以从默认的percentile_agg开始,然后在您的数据上试验不同的算法和参数,看看什么最适合您的应用。

包装它

我们简要概述了百分位数,它们如何比更常见的统计总量(如平均值)提供更多信息,为什么存在百分位数近似值,以及它们通常如何工作以及在时间范围内如何超函数。

如果您想立即开始使用https://docs.timescale.com/api/latest/hyperfunctions/percentile-approximation/?utm_source=tds&utm_medium=blog&utm_campaign=hyperfunctions-1-0-2021&utm_content=docs-percentile-approx****—以及更多功能,请创建一个完全托管的时标服务**:创建一个账户免费试用 30 天。(Hyperfunctions 预装在每个新的数据库服务中,所以在你创建一个新的服务后,你就可以使用它们了)。**

如果您喜欢管理自己的数据库实例,您可以 下载并在 GitHub 上安装 [**timescaledb_toolkit**](https://github.com/timescale/timescaledb-toolkit) 扩展 ,之后您将能够使用百分点近似值和其他超函数。

我们相信时间序列数据无处不在,理解它对于各种技术问题都至关重要。我们构建了超函数,让开发人员更容易利用时序数据的力量。

我们一直在寻找关于下一步构建什么的反馈,并且很想知道您如何使用超函数、您想要解决的问题,或者您认为应该或者可以简化的事情,以便更好地分析 SQL 中的时序数据。(要提供反馈,请在 GitHub 的未决问题或讨论主题中发表评论。)

原载于 2021 年 9 月 14 日https://blog.timescale.com

图片结构的相似性如何促进你的计算机视觉项目

原文:https://towardsdatascience.com/how-pictures-structural-similarity-can-boost-your-computer-vision-projects-3dbb721a0fa?source=collection_archive---------39-----------------------

了解为什么这个 skimage 函数比 MSE 更强大,以及它如何在训练深度学习网络时帮助您加速图片分类并避免目标泄漏。

罗斯·乔伊纳在 Unsplash 上的照片

如果您以前从事过图像识别或计算机视觉项目,您会知道拥有一个正确分类的数据集是最重要的!

我这里说的不是“现成的数据集”,如 CIFAR 或 MNIST,而是真实的原始图片,你必须在进行任何训练之前手动排序。

我最近在研究一个新的计算机视觉项目,发现图片之间的“结构相似性”(SSIM)可以帮助加快排序过程,并避免一些常见的陷阱。

让我们开始吧!

你应该总是质疑伟大的准确性

我知道这是不寻常的,但我会从最后开始…我完成了深度学习网络训练,并对它达到的接近 100%的准确率感到非常自豪。

有时生活给了你柠檬…但有时你也会收到非常干净和清晰的图像,总是从同一个角度拍摄,易于察觉!该模型唯一的预测误差也受到了专家们的争论,因为一些类别之间的界限非常模糊。

在与另一位数据科学家讨论这一成功成果时,他问我是否绝对确定没有目标泄露?我使用了适当的“训练/测试/有效”分割,但是在“训练”和“有效”数据集中有可能存储相似的图片吗?

经过一番思考,我意识到这是有可能发生的…

原因是这些图片是从一个不断重复的工业过程中提取出来的。每一批从 X 到 Y 到 Z…然后再回到 X。由于过程(粉末灌装)的随机性,一个批次不可能与另一个批次完全相同,但有些状态可能看起来非常相似,如下图所示:

图片摘自一个工业用例—图片作者
(*出于保密原因,图片经过了大量像素化处理!)

于是我只好想办法对比他们之间的图片,寻找“差不多”的双胞胎!

比较图片的最好方法是什么?MSE 还是 SSIM?

我将假设您熟悉图片如何被转换成 Numpy 数组。如果你对这个概念不清楚,你应该看看这篇文章:

我的第一直觉是,一个简单的数学运算可能会提供一个很好的“双胞胎检测系统”。例如,由于所有图片都是从同一个角度拍摄的,因此每个像素之间的差异总和可能很好:

通过累加不同像素的数量来比较图片—图片由作者提供

但是这在复杂的图片上不起作用,我会解释为什么!

对于本文的其余部分,我们将使用与本文中提供的数据集相同的数据集:

让我们处理下图,这是从数据集中随机抽取的样本。如果我们增加原始图片的亮度,相应阵列的值将显著改变,并且这个新的更亮的图片将具有比右边的图片(19)更高的 MSE (27),然而它在视觉上更接近:

图片与 MSE 的比较—图片由作者提供

那么有没有比 MSE 更好的度量来比较两张图片呢?

结构相似度 指数(下面的公式)可能是我能建议的最佳选项,因为比较是在 NxN 滑动窗口上执行的,而不是逐像素差异:

来源维基百科

我们之前分析的三张图片的相应输出是什么?

与 MSE 和 SSIM 的图片比较—图片由作者提供

结构相似性指数(SSIM)具有(0,1)的范围,1 是 100%相同的结构。

我们可以观察到,我们的视觉感知确实与分析相匹配:较亮的图片的指数(0.75)高于第二张图片(0.40)。

我现在能够准确地比较“训练”和“有效”数据集了!幸运的是,尽管图片之间有一些相似之处,没有实际的目标泄漏,但它值得检查!😃

SSIM 能帮你分类图片吗?

手动分类图片可能是一项无聊的任务,但“某人”或“某物”必须做这件事!

在这两种情况下(我最初的工业项目和本文中使用的冬季延时),这些照片都是从相同的角度拍摄的,这使它们成为 SSIM 的一个非常好的候选。

如果 SSIM 如此擅长比较图片,有没有可能用它来对图片进行预分类?

让我们从数据集中随机抽取 27 张照片:

随机的一批 27 张图片——图片由作者提供

我们只需要建立一个“简单”的算法,它是这样进行的:

1.我们计算所有图片的 SSIM 矩阵:

SSIM 矩阵继承自 27 张随机图片—图片由作者提供

2.我们先从“图像 0”中找出最接近的图片:“图像 19”(0.80),然后从“图像 19”(排除图像 0 为一种可能):“图像 10”(0.76)中找出最接近的图片,重复这个过程,直到所有图片都排序完毕:

27 张随机图片的相似链—图片由作者提供

结果非常有趣,可以快速识别图片中的一些趋势(无雪/绿色、雪/白色天空、雪/蓝色天空等)。).显然,我们可能会优化“链接”过程,以获得更准确的集群,但这似乎是一个良好的开端!

根据结构相似性排序的 27 张随机图片——图片作者

因此,SSIM 可能是运行某种“无监督”排序的好选择,前提是它们是“静态”图片(不同角度和/或环境的图像,结果可能不太准确)。

因此,当下一批图片将被交付时,SSIM 索引将帮助我对这些新图像进行排序,并确保没有相似的图片被引入不同的数据集!

像往常一样,我希望你喜欢这首曲子😉!

如果你想试一试,相应的笔记本可以在 Google Colab 的这里找到。

https://pl-bescond.medium.com/pierre-louis-besconds-articles-on-medium-f6632a6895ad

你的名字有多受欢迎?微型数据即 R 中的挑战

原文:https://towardsdatascience.com/how-popular-is-your-name-mini-data-viz-challenge-in-r-1dc31f6a22dc?source=collection_archive---------44-----------------------

这是一个快速简单的项目,在 R 中使用 ggplot2 练习数据可视化,同时找出美国人名的流行程度

Pablo Gentile 在 Unsplash 上拍摄的照片

我涉足 R 已经好几年了,但直到最近才开始受到关注。当我试图学习 R 时,我一直遵循同样的模式:看到令人印象深刻的利用率,获得学习的新能量,变得不知所措。

因为它能做这么多,R 是一个神奇的工具,但学习起来也令人生畏。对于那些开始 R 学习之旅的人,我鼓励你从学习 R 中的一件事情开始。你的事情可以是学习如何将两个数据集合并在一起,或者如何有效地计算描述性统计。对我来说,这是学习如何做数据可视化。虽然我仍然(经常)感到沮丧,但我发现当我更新代码时,能够立即直观地看到增量变化更令人满意。

所以,对于那些想尝试用 R 语言可视化数据的人,欢迎!您可以跟随我一步一步地自己编写代码,也可以直接跳到底部,复制并粘贴我的代码。你所需要做的就是添加你感兴趣的名字!

  1. 安装并加载软件包
  2. **地块所有名称(**gg Plot 简介 )
  3. 地块“您的”名称( 迷你项目的开始 )
  4. 把你的名字和所有的名字标在一起
  5. 剧情多个名字比较( 加成即 )

步骤 3、4 和 5 中创建的每个地块的完整代码。

** * 本文假设你已经安装了 R and R 工作室。如果你还没有, 这里有一个很棒的教训 。如果你还没有准备好进行这样的跳跃, 这是一个有趣的教程 ,它会遍历我们将在下面使用的相同数据集,并允许你从你的浏览器做任何事情——不需要安装!

事不宜迟,让我们开始视觉化!

步骤 1:安装和加载软件包

# If you haven't used the packages before, you will need to install them first#
install.packages("tidyverse")
install.packages("babynames")# Load packages
library(tidyverse)
library(babynames)

babynames 包有一个由社会保障管理局提供的数据框,其中包含:年份、性别、姓名、n(实例数)和属性(该年中给定姓名和性别的实例数除以申请人总数)。可惜这个数据只有二元男/女作为性别选项。这个数据集包括至少有 5 个实例的每个名字!哇!

第二步:画出所有的名字

当在 data viz in R 中开始时,您最有可能使用 ggplot 包开始。一旦你理解了这个结构,你就可以很快地改变你想要的情节了!

%>% ggplot() + (mapping = aes())

让我们一步一步来看:

%>%

您将用正在使用的数据框的名称替换“数据”。babynames 包已经为您创建了一个数据框,但是如果您正在使用自己的数据,则需要创建一个数据框公式。" %>% "被称为管道运算符,但也可以读作" then "因此,我可能会阅读第一行,并对自己说“好的,我们将采用“数据”数据框,然后我们将……”

%>% ggplot() +

现在我们从 ggplot 包中添加 ggplot()函数。这告诉 R 你想要创建一个可视化。你可以试着跑一会儿,你会发现只有一个空白的长方形。我们还没有告诉 R 我们希望事情如何发展。因此,“我们将采用“数据”数据框,然后我们将创建某种绘图。”

babynames %>%
  ggplot()

不,这不是错误。我们希望第一个图是空白的。

所以这可能不是我们所期待的有趣的 vizzies,但是和我呆在一起!

%>% ggplot() + (mapping = aes())

现在事情越来越有趣了!我们现在要选择我们想要的几何函数。有许多预制的 geom_functions,可以快速轻松地创建您选择的地块。比如:geom_point()添加点的图层,geom_bar()添加条形图,geom_line()创建线图等等。点击查看所有可用的几何图形。

最后,你要描绘出你的审美,这是事情开始变得有条理的地方!您将替换为设置 x 和 y 变量,以及设置颜色和大小等内容。

babynames %>%
  ggplot() +
  geom_point(mapping = aes(x = year, y = n))

请记住,这是一个巨大的数据集,因此可能需要一些时间来完全绘制。

男性和女性名字的每一年都有一个点。

第三步:我的名字呢?

现在我们可以看到所有的名字,但是只看到我们的名字(或者任何我们感兴趣的名字)呢?

为此,我们可以用我们感兴趣的名称创建一个变量。我们还可以指定是只查看男性还是女性。我将使用我的名字(詹娜)和女性(“F”),但请随意替换成你感兴趣的!

myname <- "Jenna"
mysex <- "F"babynames %>%
  filter(name == myname, sex == mysex) %>%
  ggplot() +
  geom_point(mapping = aes(x = year, y = n))

一个圆点代表每年被命名为“珍娜”的女性指定性别的人数。

就这样!我们已经完成了我们的使命!这就是你在 r 中开始创作情节所需要的全部。你可以得到各种各样的花哨和夸张的定制,但你也不必这样做。当你第一次开始,庆祝这些胜利!你想制造一个阴谋,你制造了一个阴谋。干得好。

但是,如果你是那些喜欢额外学分的孩子之一,让我们看看我们还能做些什么。

第四步:把我们的名字和所有的名字对应起来

我们将再次绘制整个数据集,因此在运行时,可能是煮点咖啡或倒点酒的好时机。

mynameis <- "Jenna"
mysexis <- "F"

myname <- babynames %>%
  filter(name == mynameis, sex == mysexis)

mynameminyear <- min(myname$year)-5
maxyear <- max(babynames$year)

babynames %>%
  filter(year > mynameminyear) %>%
  ggplot() +
  geom_point(mapping = aes(x = year, y = prop), alpha = 0.2, color = "gray") +
    geom_point(data = myname, mapping = aes(x = year, y = prop), alpha = 0.8, color = "#013175") +# the below is just formatting, not required!  
theme_minimal() +
 theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(),
        axis.title = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank()) +
  ggtitle(paste("Popularity of the name ", mynameis, " from ", mynameminyear, " to ", maxyear))

名字詹娜和性别女性密谋反对所有其他的名字。

第五步:画出多个名字进行比较

因为没有什么比竞争更能激发学习兴趣了,你可以一次突出多个名字,看看你是如何比较的。我会把三个名字放在一起,但你可以随意添加更多!

首先为你想比较的三个人选择一个名字和性别。我做了我自己,我的伙伴,和我的兄弟。记住名字应该用引号括起来,你可以选择“M”或“F”来表示性别。

name_one <- "Jenna"
sex_one <- "F"name_two <- "Melissa"
sex_two <- "F"name_three <- "Jeffrey"
sex_three <- "M"

好了,我们已经设置了变量,是时候绘图了!

firstname <- babynames %>%
  filter(name == name_one, sex == sex_one)

secondname <- babynames %>%
  filter(name == name_two, sex == sex_two)

thirdname <- babynames %>%
  filter(name == name_three, sex == sex_three)

legendcolors <- c("name_one" = "#219EBC", "name_two" = "#FB8500", "name_three" = "#023047")babynames %>%
  ggplot() +
  geom_point(mapping = aes(x = year, y = prop), alpha = 0.1, color = "gray") +
  geom_point(data = firstname, mapping = aes(x = year, y = prop, color = "name_one"), alpha = 0.8) +
  geom_point(data = secondname, mapping = aes(x = year, y = prop, color = "name_two"), alpha = 0.8) +
  geom_point(data = thirdname, mapping = aes(x = year, y = prop, color = "name_three"), alpha = 0.8) +

# The below is formatting and not required!
theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(), panel.background = element_blank(),
        axis.title = element_blank(),
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank()) +
  ggtitle(paste("Who has the most popular name?")) +
  scale_color_manual(name = "Name", values = legendcolors)

我们做到了!该死的,就总体受欢迎程度而言,看起来我(name_one)是失败者,尽管看起来我可能在 2000 年代初击败了其他两人。Melissa females (name_two)已经存在了很长时间,并在 20 世纪 90 年代大受欢迎。

现在,你有无尽的方式来完全定制这个视觉效果,让它成为你自己的。选择自己的冒险!一些有趣的尝试:

  • 改变使用的颜色(这里有一个在 ggplot 中定制颜色的指南
  • 突出显示其他姓名
  • 在图上标注不同的点

完整代码

选项 1:只有一个名字

选项 2:一个名称对所有名称

选项 3:比较三个名字与所有名字

我迫不及待地想看看你们都想出了什么!继续用你的头撞墙,这样会好很多!

詹娜·伊格尔森我的背景是工业组织心理学,我在人物分析中找到了自己的家。数据使我的作品变得生动。我主要使用 Power BI,但偶尔也会使用 Tableau 和其他工具。我很想听到更多关于你的旅程!通过在此评论或在TwitterLinkedin联系我。

你在脸书的帖子有多积极?

原文:https://towardsdatascience.com/how-positive-are-your-facebook-posts-47a7b05c661b?source=collection_archive---------48-----------------------

使用 Python 和 R 的基于规则的情感分析

作者图片

概观

为什么要进行情感分析?

NLP 是语言学、计算机科学和人工智能的子领域,你可能会花上几年的时间来研究它。

然而,我想快速了解一下自然语言处理是如何工作的,我们将通过情感分析来完成,按照极性对文本进行分类。

我们不禁感到有动力看到关于我们自己的社交媒体帖子的见解,所以我们将转向一个众所周知的平台。

脸书对我们了解多少?

为了搞清楚,我下载了 14 年的帖子来应用文字情绪分析。我们将使用Python来读取和解析来自脸书的json数据。

我们将在 Python 的自然语言工具包NLTK的帮助下执行诸如标记化和规范化等任务。然后,我们将使用Vader模块(休顿&吉尔伯特,2014)进行基于规则的(词典)情感分析

最后,我们将把我们的工作流程转移到Rtidyverse来进行数据操作可视化

获取数据

首先,您需要通过以下方式下载您自己的脸书数据:设置&隐私>设置>您的脸书信息>下载您的信息>(选择)帖子。

下面,我把我的文件命名为your_posts_1.json,但是你可以改变这个。我们将使用 Python 的json模块读入数据。我们可以用typelen来感受一下数据。

import json# load json into python, assign to 'data'
with open('your_posts_1.json') as file:
    data = json.load(file)type(data)     # a list
type(data[0])  # first object in the list: a dictionary
len(data)      # my list contains 2166 dictionaries

以下是我们在本帖中使用的 Python 库:

import pandas as pd
from nltk.sentiment.vader import SentimentIntensityAnalyzer# OPTIONAL (more relevant for individual words)
from nltk.stem import LancasterStemmer, WordNetLemmatizer from nltk.corpus import stopwords
from nltk.probability import FreqDist
import re
import unicodedata
import nltk
import json
import inflect
import matplotlib.pyplot as plt

自然语言 Tookkit 是一个流行的 Python 平台,用于处理人类语言数据。虽然它有超过 50 个词汇资源,但我们将使用 Vader 情感词汇,即专门针对社交媒体中表达的情感。

正则表达式(正则表达式)将用于删除标点符号。

Unicode 数据库将用于删除非 ASCII 字符。

JSON 模块帮助我们从脸书读入 JSON。

屈折帮助我们将数字转换成单词。

Pandas 是一个强大的数据操作和数据分析工具,用于我们将文本数据保存到数据框中并写入 csv。

在我们得到数据后,我们将挖掘以获得实际的文本数据(我们的帖子)。

我们将把它存储在一个列表中。

注意:键data偶尔会返回一个空数组,我们想通过检查if len(v) > 0跳过这些。

# create empty list
empty_lst = []# multiple nested loops to store all post in empty list
for dct in data:
    for k, v in dct.items():
        if k == 'data':
            if len(v) > 0:
                for k_i, v_i in vee[0].items():  
                    if k_i == 'post':
                        empty_lst.append(v_i)print("This is the empty list: ", empty_lst)
print("\nLength of list: ", len(empty_lst))

我们现在有了一个字符串列表。

作者图片

标记化

我们将遍历我们的字符串列表(empty_lst ),用nltk.sent_tokenize()来标记每个句子。我们想把这篇课文分成单独的句子。

作者图片

这会产生一个 list 列表,我们将对其进行展平:

# list of list, len: 1762 (each list contain sentences)
nested_sent_token = [nltk.sent_tokenize(lst) for lst in empty_lst]# flatten list, len: 3241
flat_sent_token = [item for sublist in nested_sent_token for item in sublist]
print("Flatten sentence token: ", len(flat_sent_token))

规范化句子

对于本节中使用的函数的上下文,请查看 Matthew Mayo 关于文本数据预处理的文章。

首先,我们将删除非 ASCII 字符(remove_non_ascii(words)),包括:#-'?,等等。然后我们会小写(to_lowercase(words)),去掉标点(remove_punctuation(words)),替换数字(replace_numbers(words)),去掉停用词(remove_stopwords(words))。

停用词的例子有:你的、你的、你自己、你们自己、他、他的、他自己等等。

这让我们每个句子都处于平等的竞争环境中。

# Remove Non-ASCII
def remove_non_ascii(words):
    """Remove non-ASCII character from List of tokenized words"""
    new_words = []
    for word in words:
        new_word = unicodedata.normalize('NFKD', word).encode(
            'ascii', 'ignore').decode('utf-8', 'ignore')
        new_words.append(new_word)
    return new_words # To LowerCase
def to_lowercase(words):
    """Convert all characters to lowercase from List of tokenized words"""
    new_words = []
    for word in words:
        new_word = word.lower()
        new_words.append(new_word)
    return new_words # Remove Punctuation , then Re-Plot Frequency Graph
def remove_punctuation(words):
    """Remove punctuation from list of tokenized words"""
    new_words = []
    for word in words:
        new_word = re.sub(r'[^\w\s]', '', word)
        if new_word != '':
            new_words.append(new_word)
    return new_words # Replace Numbers with Textual Representations
def replace_numbers(words):
    """Replace all interger occurrences in list of tokenized words with textual representation"""
    p = inflect.engine()
    new_words = []
    for word in words:
        if word.isdigit():
            new_word = p.number_to_words(word)
            new_words.append(new_word)
        else:
            new_words.append(word)
    return new_words# Remove Stopwords
def remove_stopwords(words):
    """Remove stop words from list of tokenized words"""
    new_words = []
    for word in words:
        if word not in stopwords.words('english'):
            new_words.append(word)
    return new_words# Combine all functions into Normalize() function
def normalize(words):
    words = remove_non_ascii(words)
    words = to_lowercase(words)
    words = remove_punctuation(words)
    words = replace_numbers(words)
    words = remove_stopwords(words)
    return words

下面的屏幕截图让我们了解了语句规范化非规范化之间的区别。

作者图片

sents = normalize(flat_sent_token)
print("Length of sentences list: ", len(sents))   # 3194

:词干化和词条化的过程对于单个单词(超过句子)更有意义,所以我们在这里就不用了。

频率

您可以使用FreqDist()功能获取最常见的句子。然后,您可以绘制一个折线图,直观地比较最常用的句子。

虽然简单,但是计算频率可以产生一些洞察力。

from nltk.probability import FreqDist# Find frequency of sentence
fdist_sent = FreqDist(sents)
fdist_sent.most_common(10) # Plot
fdist_sent.plot(10)

情感分析

我们将使用来自NLTKVader模块。维德代表:

化合价、意识、字典和情感推理器。

我们正在采用基于规则/词典的方法进行情感分析,因为我们有一个相当大的数据集,但缺乏标记数据来建立一个强大的训练集。因此,机器学习对于这项任务来说不是理想的。

为了直观地了解Vader模块是如何工作的,我们可以访问 github repo 来查看vader_lexicon.txt ( 来源)。这是一本经过经验验证的字典。情感评级由 10 名独立的人类评分者提供(经过预先筛选、培训并检查评分者之间的可靠性)。

分数范围从(-4)极负到(4)极正,0 为中性。比如《死》的评分是-2.9,而《尊严》的评分是 2.2。更多详情请访问他们的(回购)。

我们将创建两个空列表来分别存储句子和极性得分。

sentiment捕捉每个句子和sent_scores,T5 初始化nltk.sentiment.vader.SentimentIntensityAnalyzer计算每个句子的 polarity_score (即阴性、中性、阳性)。

sentiment2捕获元组列表中的每个极性和值。

下面的屏幕帽应该让您了解我们的产品:

作者图片

在我们附加了每个句子(sentiment)和它们的极性分数(sentiment2,负、中性、正)之后,我们将创建数据帧来存储这些值。

然后,我们将数据帧写入 CSV 以转换到R。注意,在保存为 CSV 格式时,我们将 index 设置为 false。Python 从 0 开始计数,而R从 1 开始计数,所以我们最好在R中将索引重新创建为一个单独的列。

注意:我在这里做的事情有更有效的方法。我的解决方案是保存两个 CSV 文件,并将工作流转移到R进行进一步的数据操作和可视化。这主要是个人对在R中处理数据框和可视化的偏好,但是我应该指出这个可以用pandasmatplotlib来完成

# nltk.download('vader_lexicon')sid = SentimentIntensityAnalyzer()sentiment = []
sentiment2 = []for sent in sents:
    sent1 = sent
    sent_scores = sid.polarity_scores(sent1)
    for x, y in sent_scores.items():
        sentiment2.append((x, y))
    sentiment.append((sent1, sent_scores))
    # print(sentiment)# sentiment
cols = ['sentence', 'numbers']
result = pd.DataFrame(sentiment, columns=cols)
print("First five rows of results: ", result.head())# sentiment2
cols2 = ['label', 'values']
result2 = pd.DataFrame(sentiment2, columns=cols2)
print("First five rows of results2: ", result2.head())# save to CSV
result.to_csv('sent_sentiment.csv', index=False)
result2.to_csv('sent_sentiment_2.csv', index=False)

数据转换

从现在开始,我们将使用Rtidyverse进行数据操作和可视化。RStudio是这里的首选 IDE。我们将创建一个R Script来存储我们所有的数据转换和可视化过程。我们应该在用pandas创建上述 CSV 文件的同一个目录下。

我们将加载我们保存的两个 CSV 文件和tidyverse库:

library(tidyverse)# load data
df <- read_csv("sent_sentiment.csv")       
df2 <- read_csv('sent_sentiment_2.csv')

我们将创建另一个与第一个数据框的索引相匹配的列。我把它保存为df1,但是如果你愿意,你可以覆盖原来的df

# create a unique identifier for each sentence
df1 <- df %>%
    mutate(row = row_number())

然后,对于第二个数据帧(sent _ perspective _ 2 . CSV),我们将创建另一个匹配索引的列,但是也使用来自tidyr包的pivot_wider注意:你首先需要group_by标签,然后使用mutate创建一个唯一的标识符。

然后,我们将使用pivot_wider来确保所有极性值(负、中性、正)都有自己的列。

通过使用mutaterow_number()创建一个惟一的标识符,我们将能够按行连接(left_join)。

最后,我将操作保存到df3,这允许我为可视化创建一个全新的数据帧。

# long-to-wide for df2
# note: first, group by label; then, create a unique identifier for each label then use pivot_widerdf3 <- df2 %>%
    group_by(label) %>%
    mutate(row = row_number()) %>%
    pivot_wider(names_from = label, values_from = values) %>%
    left_join(df1, by = 'row') %>%
    select(row, sentence, neg:compound, numbers)

形象化

首先,我们将分别可视化所有 3194 个句子的正负极性得分(您的数字会有所不同)。

以下是积极得分:

作者图片

以下是消极得分:

作者图片

根据Vader(Valance Aware Dictionary and perspective Reasoner),当我将积极和消极得分相加得到一个比率时,它大约是 568:97,即积极比消极多 5.8 倍。

Vader模块将接收每一个句子,并分配一个从-1(最消极)到 1(最积极)的配价分数。我们可以将句子分类为pos(肯定)neu(中性)neg(否定)或复合(compound)得分(即归一化加权复合得分)。更多详情,请参见维德-情感文档。

这里有一个图表,看正反两个分数加在一起(正=蓝色,负=红色,中性=黑色)。

作者图片

最后,我们还可以使用histograms来查看句子中消极情绪和积极情绪的分布:

作者图片

非标准化数据

事实证明Vader模块完全能够分析带有标点符号、词形(大写以示强调)、俚语甚至 utf-8 编码的表情符号的句子。

因此,为了看看如果我们在没有标准化的情况下实施情感分析是否会有任何不同,我重新运行了上面所有的分析。

这里有两个版本的数据进行比较。顶部代表正常化,底部代表非正常化。

作者图片

虽然预期会有细微的差别,但它们只是细微的差别。

摘要

我下载了脸书 14 年的帖子,使用PythonR进行基于规则的情绪分析,并可视化结果。

我喜欢在这个项目中使用这两种工具,并试图发挥它们的优势。我发现用 Python 直接解析 JSON,但是一旦我们转换到数据框架,我就渴望回到 r。

因为我们缺乏标记数据,使用基于规则/词典的方法进行情感分析是有意义的。现在我们有了价分数的标签,也许有可能采用机器学习的方法来预测未来帖子的价。

参考

  1. 休顿,C.J .和吉尔伯特,E.E. (2014 年)。VADER:基于规则的社交媒体文本情感分析的简约模型。第八届网络日志和社交媒体国际会议。密歇根州安阿伯,2014 年 6 月。

关于数据科学、机器学习、R、Python、SQL 等更多内容,在 Twitter 上找到我。

PostgreSQL 聚合如何工作,以及它如何启发了我们的 hyperfunctions 设计

原文:https://towardsdatascience.com/how-postgresql-aggregation-works-and-how-it-inspired-our-hyperfunctions-design-bb063cc874ee?source=collection_archive---------39-----------------------

乔希·穆勒在 Unsplash 上的图片

获得关于 PostgreSQL 聚合的初级读本,PostgreSQL 的实现如何启发我们构建 TimescaleDB 超函数及其与高级 TimescaleDB 功能的集成,以及这对开发人员意味着什么。

在时间尺度上,我们的目标是始终关注开发人员的体验,我们非常小心地设计我们的产品和 API,使其对开发人员友好。我们相信,当我们的产品易于使用,并能为广大开发人员所用时,我们就能让他们解决各种不同的问题,从而构建解决大问题的解决方案。

这种对开发人员体验的关注是我们在设计 TimescaleDB 的早期就决定在 PostgreSQL 之上构建的原因。我们当时相信,就像现在一样,建立在世界上增长最快的数据库上将给我们的用户带来许多好处。

也许这些优势中最大的是开发人员的生产力:开发人员可以使用他们了解和喜欢的工具和框架,并带来他们所有的 SQL 技能和专业知识。

如今,有近 300 万个活跃的 TimescaleDB 数据库运行着各行各业的任务关键型时序工作负载。时间序列数据来得很快,有时每秒产生数百万个数据点(阅读更多关于时间序列数据的信息)。由于信息量大,速度快,时间序列数据很难查询和分析。我们构建了 TimescaleDB 作为专门为时间序列构建的关系数据库,以降低复杂性,使开发人员可以专注于他们的应用程序。

因此,我们以开发人员体验为核心,并不断发布功能来推进这一目标,包括连续聚合、用户定义的操作、信息视图,以及最近的time scale db hyperfunctions:time scale db 中的一系列 SQL 函数,使得用更少的代码行在 PostgreSQL 中操作和分析时间序列数据变得更加容易。

为了确保我们在规划新的 hyperfunctions 功能时始终关注开发人员的体验,我们建立了一套“设计约束”来指导我们的开发决策。遵循这些准则可确保我们的 API:

  • 在 SQL 语言中工作(没有新语法,只有函数和集合)
  • 对于新的和有经验的 SQL 用户来说非常直观
  • 仅对几行数据有用,对数十亿行数据具有高性能
  • 很好地使用所有的 TimescaleDB 特性,理想情况下,让它们对用户更有用
  • 使基本的事情变得简单,使更高级的分析成为可能

这在实践中是什么样子的?在这篇文章中,我解释了这些约束如何使我们在整个 TimescaleDB hyperfunctions 中采用两步聚合,两步聚合如何与其他 TimescaleDB 特性交互,以及 PostgreSQL 的内部聚合 API 如何影响我们的实现。

当我们谈到两步聚合时,我们指的是以下调用约定:

我们有一个内在的集合调用:

和一个外部访问器调用:

我们选择了这种设计模式,而不是更常见(似乎更简单)的一步聚合方法,在这种方法中,一个函数封装了内部聚合和外部访问器的行为:

请继续阅读,了解为什么一步聚合方法在您开始做更复杂的事情(如将函数组合成更高级的查询)时会很快失效,以及几乎所有的 PostgreSQL 聚合都是如何执行两步聚合的。您将了解 PostgreSQL 实现如何启发我们构建 TimescaleDB 超函数、连续聚合和其他高级功能,以及这对开发人员意味着什么。

PostgreSQL 聚合入门(通过图片)

当我五六年前开始学习 PostgreSQL 时(我是一名电化学专家,处理大量的电池数据,正如我在上一篇关于时间加权平均值的文章中提到的),我遇到了一些性能问题。我试图更好地了解数据库内部发生了什么,以提高其性能——这时候我通过图片找到了布鲁斯·莫姆坚关于 PostgreSQL 内部的演讲。Bruce 因其深刻的演讲(和他对领结的嗜好)而在社区中众所周知,他的会议对我来说是一个启示。

从那以后,它们成了我理解 PostgreSQL 如何工作的基础。他把事情解释得非常清楚,当我能想象出正在发生的事情时,我总是学得最好,所以“通过图片”的部分真的帮助了我——并让我坚持下来。

所以下一点是我试图通过图片解释一些 PostgreSQL 的内部原理来引导 Bruce。系好你的领结,准备学习吧。

作者向 Bruce Momjian 致敬(看起来对自己相当满意,因为他第一次尝试就成功地打了一个领结)。作者大卫科恩的 GIF。

PostgreSQL 聚合与函数

我们已经写了关于如何使用定制函数和集合来扩展 SQL 的文章,但是我们还没有解释它们之间的区别。

SQL 中聚合函数和“常规”函数的根本区别在于,聚合从相关行的中产生一个结果,而常规函数为每行的产生一个结果:

在 SQL 中,聚合从多行产生一个结果,而函数每行产生一个结果。作者图片

这并不是说一个函数不能有来自多个列的输入;他们必须来自同一排。

另一种思考方式是,函数通常作用于行,而聚合作用于列。为了说明这一点,让我们考虑一个有两列的理论表foo:

CREATE TABLE foo(
	bar DOUBLE PRECISION,
	baz DOUBLE PRECISION);

只有几个值,所以我们可以很容易地看到发生了什么:

INSERT INTO foo(bar, baz) VALUES (1.0, 2.0), (2.0, 4.0), (3.0, 6.0);

函数greatest()将为每行产生列barbaz中的最大值:

SELECT greatest(bar, baz) FROM foo; 
 greatest 
----------
        2
        4
        6

而聚合max()将从每一列中产生最大值:

SELECT max(bar) as bar_max, max(baz) as baz_max FROM foo;

 bar_max | baz_max 
---------+---------
       3 |       6

使用上面的数据,这里有一个当我们聚合一些东西时会发生什么的图片:

“max()”聚合从多行中获取最大值。作者图片

该聚合从多行中获取输入,并生成一个结果。这是它和函数的主要区别,但是它是怎么做到的呢?让我们看看它在引擎盖下做什么。

聚合内部:逐行

在后台,PostgreSQL 中的聚合是逐行工作的。但是,聚合如何知道前面的行呢?

好吧,一个聚合存储一些它以前看到的行的状态,当数据库看到新的行时,它更新内部状态。

对于我们一直在讨论的max()集合,内部状态就是我们迄今为止收集到的最大值。

让我们一步一步来。

当我们开始时,我们的内部状态是NULL,因为我们还没有看到任何行:

作者图片

然后,我们进入第一行:

作者图片

由于我们的状态是NULL,我们将其初始化为我们看到的第一个值:

作者图片

现在,我们得到第二行:

作者图片

我们看到 bar 的值(2.0)大于我们当前的状态(1.0),所以我们更新状态:

作者图片

然后,下一行进入聚合:

作者图片

我们将其与当前状态进行比较,取最大值,并更新我们的状态:

作者图片

最后,我们没有更多要处理的行,所以我们输出结果:

作者图片

所以,总结一下,每一行进来,与我们当前的状态进行比较,然后状态被更新以反映新的最大值。然后下一行进来,我们重复这个过程,直到我们处理完所有的行并输出结果。

最大聚集聚集过程,用 gif 表示。作者图片

处理每一行并更新内部状态的函数有一个名字: 状态转换函数 (或者简称为“转换函数”)。)聚合的转换函数将当前状态和传入行中的值作为参数,并生成一个新状态。

它是这样定义的,其中current_value表示来自传入行的值,current_state表示在前面的行上构建的当前聚合状态(如果我们还没有得到任何值,则为 NULL),而next_state表示分析传入行后的输出:

next_state = transition_func(current_state, current_value)

聚集内部:复合状态

因此,max()聚合有一个简单的状态,只包含一个值(我们见过的最大值)。但并不是 PostgreSQL 中的所有聚合都有这样简单的状态。

让我们考虑一下平均值的总数(avg):

SELECT avg(bar) FROM foo;

为了刷新,平均值定义为:

\ begin avg(x)= \ frac { sum(x)} { count(x)} \ end

为了计算它,我们将总和和计数存储为我们的内部状态,并在处理行时更新我们的状态:

“avg()”聚合过程,用 gif 表示。对于“avg()”,转换函数必须更新更复杂的状态,因为 sum 和 count 在每个聚合步骤都是分开存储的。作者图片

但是,当我们准备输出avg的结果时,我们需要将sum除以count:

对于某些聚合,我们可以直接输出状态,但是对于其他聚合,我们需要在计算最终结果之前对状态执行操作。作者图片

聚合内部还有另一个函数执行这个计算:最终函数。一旦我们处理完所有的行,最后一个函数就会获取状态,并做任何需要的事情来产生结果。

它是这样定义的,其中final_state表示转换函数处理完所有行后的输出:

result = final_func(final_state)

并且,通过图片:

平均总量是如何工作的,用 gif 来表示。这里,我们强调最后一个函数的作用。作者图片

总结一下:当一个聚集扫描行时,它的转换函数更新它的内部状态。一旦聚合扫描了所有的行,它的最终函数就会产生一个结果,并返回给用户。

提高聚合函数的性能

这里要注意一件有趣的事情:transition 函数被调用的次数比 final 函数多得多:每一行调用一次,而 final 函数每行调用一次。

现在,在每次调用的基础上,转换函数本身并不比最终函数更昂贵,但是因为通常进入聚合的行数比出来的行数多几个数量级,所以转换函数步骤很快成为最昂贵的部分。当您以高速率摄取大量时间序列数据时,尤其如此;优化聚合转换函数调用对于提高性能非常重要。

幸运的是,PostgreSQL 已经有了优化聚合的方法。

并行化和组合功能

因为转移函数是在每一行上运行的,一些有进取心的 PostgreSQL 开发人员问:如果我们并行化转移函数计算会怎么样?

让我们重温一下我们对转移函数和最终函数的定义:

next_state = transition_func(current_state, current_value)

result = final_func(final_state)

我们可以通过实例化转换函数的多个副本并将行的子集传递给每个实例来并行运行。然后,每个并行聚合将在其看到的行子集上运行转换函数,产生多个(部分)状态,每个并行聚合一个状态。但是,由于我们需要聚合整个数据集,我们不能分别在每个并行聚合上运行最终函数,因为它们只有一些行。

所以,现在我们已经陷入了一点困境:我们有多个部分聚合状态,而 final 函数只对单个最终状态起作用——就在我们将结果输出给用户之前。

为了解决这个问题,我们需要一种新型的函数,它采用两个部分状态并将它们合并成一个状态,这样最终的函数就可以完成它的工作。这被(恰当地)称为 合并功能

我们可以对并行化聚合时创建的所有部分状态迭代运行 combine 函数。

combined_state = combine_func(partial_state_1, partial_state_2)

例如,在avg中,组合功能会将计数和总和相加。

并行聚合如何工作,用 gif 讲述。这里,我们突出显示了 combine 函数(我们添加了几行来说明并行聚合。)作者图片

然后,当我们从所有并行聚合中获得组合状态后,我们运行最终函数并获得结果。

重复数据删除

并行化和组合函数是降低调用聚合成本的一种方法,但不是唯一的方法。

降低聚合成本的另一个内置 PostgreSQL 优化出现在如下语句中:

SELECT avg(bar), avg(bar) / 2 AS half_avg FROM foo;

PostgreSQL 将优化该语句,只对avg(bar)计算求值一次,然后使用该结果两次。

并且,如果我们有不同的聚集,有相同的转移函数,但是不同的最终函数呢?PostgreSQL 通过在所有行上调用转换函数(昂贵的部分),然后执行两个最终函数来进一步优化!相当整洁!

现在,这不是 PostgreSQL 聚合所能做的全部,但这是一次很好的旅行,足以让我们今天到达我们需要去的地方。

时标超函数中的两步聚合

在 TimescaleDB 中,我们为聚合函数实现了两步聚合设计模式。这概括了 PostgreSQL 内部聚合 API,并通过我们的聚合、访问器和汇总函数将其公开给用户。(换句话说,每个内部 PostgreSQL 函数在 TimescaleDB hyperfunctions 中都有一个等价的函数。)

作为复习,当我们谈论两步聚合设计模式时,我们指的是下面的约定,其中我们有一个内部聚合调用:

和一个外部访问器调用:

内部聚合调用返回内部状态,就像 PostgreSQL 聚合中的转换函数一样。

外部访问器调用获取内部状态并将结果返回给用户,就像 PostgreSQL 中的 final 函数一样。

我们还为每个聚合定义了特殊的rollup函数,其工作方式非常类似于 PostgreSQL 组合函数。

PostgreSQL 内部聚合 API 及其 TimescaleDB hyperfunctions 的等效项。图片作者。

为什么我们使用两步聚合设计模式

我们向用户公开两步聚合设计模式,而不是将其作为内部结构,有四个基本原因:

  1. 允许多参数聚合重用状态,从而提高效率
  2. 清楚地区分影响聚合和访问器的参数,使性能含义更容易理解和预测
  3. 在连续聚合和窗口函数(我们对连续聚合最常见的要求之一)中实现易于理解的汇总,并获得逻辑一致的结果
  4. 随着需求的变化,允许更容易的追溯分析连续聚合中的缩减采样数据,但是数据已经消失了

这有点理论性,所以让我们深入解释每一个。

重用状态

PostgreSQL 非常擅长优化语句(正如我们在本文前面看到的,通过图片🙌),但是你要用它能理解的方式给它东西。

例如,当我们谈到重复数据删除时,我们看到 PostgreSQL 可以“发现”一个语句在查询中出现多次的情况(即avg(bar)),并且只运行该语句一次以避免重复工作:

SELECT avg(bar), avg(bar) / 2 AS half_avg FROM foo;

这是可行的,因为avg(bar)出现多次而没有变化。

然而,如果我以稍微不同的方式写这个等式,并将圆括号内的除法移到圆括号内,这样表达式avg(bar)就不会那么整齐地重复,PostgreSQL 就不能想出如何优化它:

SELECT avg(bar), avg(bar / 2) AS half_avg FROM foo;

它不知道除法是可交换的,也不知道这两个查询是等价的。

对于数据库开发人员来说,这是一个需要解决的复杂问题,因此,作为 PostgreSQL 用户,您需要确保以数据库能够理解的方式编写查询。

数据库不理解的等价语句导致的性能问题是相等的(或者在您编写的特定情况下相等,但在一般情况下不相等),这可能是用户需要解决的最棘手的 SQL 优化问题。

因此,当我们设计 API 时,我们试图让用户很难无意中编写低性能代码:换句话说,默认选项应该是高性能选项

对于下一点,将一个简单的表定义为以下内容会很有用:

CREATE TABLE foo(
	ts timestamptz, 
	val DOUBLE PRECISION);

让我们看一个例子,看看我们如何在百分位数近似超函数中使用两步聚合来允许 PostgreSQL 优化性能。

SELECT 
    approx_percentile(0.1, percentile_agg(val)) as p10, 
    approx_percentile(0.5, percentile_agg(val)) as p50, 
    approx_percentile(0.9, percentile_agg(val)) as p90 
FROM foo;

…被视为等同于:

SELECT 
    approx_percentile(0.1, pct_agg) as p10, 
    approx_percentile(0.5, pct_agg) as p50, 
    approx_percentile(0.9, pct_agg) as p90 
FROM 
(SELECT percentile_agg(val) as pct_agg FROM foo) pct;

这种调用约定允许我们使用相同的聚合,因此,在后台,PostgreSQL 可以对相同聚合的调用进行重复数据删除(因此速度更快)。

现在,让我们将其与一步聚合方法进行比较。

PostgreSQL 在这里无法对聚合调用进行重复数据删除,因为approx_percentile聚合中的额外参数会随着每次调用而改变:

因此,即使所有这些函数都可以对所有行使用相同的近似值,PostgreSQL 也无法知道。两步聚合方法使我们能够构建我们的调用,以便 PostgreSQL 可以优化我们的代码,并且它使开发人员能够了解什么时候东西会更贵,什么时候不会。具有不同输入的多个不同聚合的成本会很高,而对同一个聚合的多个访问器的成本会低得多。

清楚地区分聚合/访问器参数

我们还选择了两步聚合方法,因为我们的一些聚合本身可以接受多个参数或选项,并且它们的访问器也可以接受选项:

SELECT
    approx_percentile(0.5, uddsketch(1000, 0.001, val)) as median,--1000 buckets, 0.001 target err
    approx_percentile(0.9, uddsketch(1000, 0.001, val)) as p90, 
    approx_percentile(0.5, uddsketch(100, 0.01, val)) as less_accurate_median -- modify the terms for the aggregate get a new approximation
FROM foo;

这是一个uddsketch的例子,一个的高级聚集方法,用于百分点近似值,可以采用自己的参数。

想象一下,如果这些参数混杂在一个集合中:

-- NB: THIS IS AN EXAMPLE OF AN API WE DECIDED NOT TO USE, IT DOES NOT WORK
SELECT
    approx_percentile(0.5, 1000, 0.001, val) as median
FROM foo;

很难理解哪个参数与功能的哪个部分相关。

相反,两步方法非常清楚地将访问器的参数与聚合的参数分开,其中聚合函数定义在最终函数输入的括号中:

SELECT
    approx_percentile(0.5, uddsketch(1000, 0.001, val)) as median
FROM foo;

通过明确哪个是哪个,用户可以知道,如果他们改变聚集的输入,他们将获得更多(昂贵的)聚集节点,而访问器的输入改变起来更便宜。

所以,这是我们公开 API 的前两个原因——以及它允许开发人员做的事情。最后两个原因涉及连续聚集以及它们如何与超功能相关,所以首先,快速复习一下它们是什么。

两步聚合+时标连续聚合 b

TimescaleDB 包括一个名为连续聚合的特性,旨在使大型数据集上的查询运行得更快。TimescaleDB continuous 聚合在后台连续并增量地存储聚合查询的结果,因此当您运行该查询时,只需要计算已更改的数据,而不是整个数据集。

在上面对组合函数、的讨论中,我们介绍了如何在每行上计算转换函数,并在多个并行聚合上拆分行,以加快计算速度。

TimescaleDB 连续聚合做一些类似的事情,除了它们将计算工作分布在时间上,而不是在同时运行的并行进程之间。连续聚合对过去某个时间插入的行子集计算转换函数,存储结果,然后在查询时,我们只需要计算最近一小段时间的原始数据,我们还没有计算这些数据。

当我们设计 TimescaleDB hyperfunctions 时,我们希望它们能够在连续聚合中很好地工作,甚至为用户开辟新的可能性。

假设我从上面的简单表格中创建了一个连续聚合,以 15 分钟为增量计算总和、平均值和百分比(后者使用了一个超函数):

CREATE MATERIALIZED VIEW foo_15_min_agg
WITH (timescaledb.continuous)
AS SELECT id,
    time_bucket('15 min'::interval, ts) as bucket,
    sum(val),
    avg(val),
    percentile_agg(val)
FROM foo
GROUP BY id, time_bucket('15 min'::interval, ts);

如果我回来后想将数据重新聚合到小时或天,而不是 15 分钟,或者需要聚合所有 id 的数据,该怎么办?我可以为哪些集合这样做,哪些不可以?

逻辑一致的汇总

我们希望通过两步聚合解决的一个问题是,如何向用户传达何时可以重新聚合,何时不可以。(所谓“好的”,我的意思是从重新聚合的数据中得到的结果与直接在原始数据上运行聚合得到的结果是一样的。)

例如:

SELECT sum(val) FROM tab;
-- is equivalent to:
SELECT sum(sum) 
FROM 
    (SELECT id, sum(val) 
    FROM tab
    GROUP BY id) s;

但是:

SELECT avg(val) FROM tab;
-- is NOT equivalent to:
SELECT avg(avg) 
FROM 
    (SELECT id, avg(val) 
    FROM tab
    GROUP BY id) s;

为什么重新聚合对sum可以,对avg不行?

从技术上讲,在以下情况下重新聚合在逻辑上是一致的:

  • 聚合返回内部聚合状态。sum的内部聚集状态是(sum),而对于平均而言,是(sum, count)
  • 集合的组合和转移函数是等价的。对于sum(),状态和操作相同。对于count(),状态与状态相同,但是转换和组合功能对它们执行不同的操作sum()的 transition 函数将传入的值添加到状态中,它的 combine 函数将两个状态相加,或者相加。相反地,count() s 转换函数为每个输入值增加状态,但是它的组合函数将两个状态相加,或者是计数的和。

但是,您必须对每个聚合的内部有深入的(有时甚至是晦涩的)了解,才能知道哪些符合上述标准,从而知道哪些可以重新聚合。

使用两步聚合方法,当聚合允许时,我们可以通过公开组合函数的等价物来传达重新聚合在逻辑上是一致的。

我们称这个函数为rollup()Rollup()从聚合中获取多个输入,并将它们组合成一个值。

我们所有可以组合的聚合都有rollup函数,该函数将组合来自两组不同行的聚合输出。(从技术上讲,rollup()是一个聚合函数,因为它作用于多行。为了清楚起见,我将它们称为 rollup 函数,以区别于基本聚合)。然后就可以在组合输出上调用访问器了!

因此,使用我们创建的连续聚合来获得我们的percentile_agg的 1 天重新聚合变得简单如:

SELECT id, 
    time_bucket('1 day'::interval, bucket) as bucket, 
    approx_percentile(0.5, rollup(percentile_agg)) as median
FROM foo_15_min_agg
GROUP BY id, time_bucket('1 day'::interval, bucket);

(正是因为这个原因,我们实际上建议您在不调用访问器函数的情况下创建连续聚合。然后,您可以在上面创建视图或将访问器调用放入您的查询中)。

这就引出了我们的最后一个原因。

使用连续总量的回顾性分析

当我们创建一个连续的聚合时,我们定义了一个我们的数据视图,然后我们可能会坚持很长一段时间。

例如,我们可能有一个在 X 时间段后删除底层数据的数据保留策略。如果我们想要返回并重新计算任何东西,即使不是不可能,也是具有挑战性的,因为我们已经“丢弃”了数据。

但是,我们知道在现实世界中,你并不总是提前知道你需要分析什么。

因此,我们设计了使用两步聚合方法的超功能,因此它们可以更好地与连续聚合集成。因此,用户将聚集状态存储在连续聚集视图中,并修改访问器函数*,而不需要*要求他们重新计算可能难以(或不可能)重建的旧状态(因为数据被存档、删除等)。).

两步聚合设计还为连续聚合提供了更大的灵活性。例如,让我们来看一个连续聚合,其中我们执行两步聚合的聚合部分,如下所示:

CREATE MATERIALIZED VIEW foo_15_min_agg
WITH (timescaledb.continuous)
AS SELECT id,
    time_bucket('15 min'::interval, ts) as bucket,
    percentile_agg(val)
FROM foo
GROUP BY id, time_bucket('15 min'::interval, ts);

当我们第一次创建聚合时,我们可能只想得到中位数:

SELECT
    approx_percentile(0.5, percentile_agg) as median
FROM foo_15_min_agg;

但是后来,我们决定也想知道第 95 百分位。

幸运的是,我们不必修改连续集合;我们只需修改原始查询中访问器函数的参数,以从聚合状态返回我们想要的数据:

SELECT
    approx_percentile(0.5, percentile_agg) as median,
    approx_percentile(0.95, percentile_agg) as p95
FROM foo_15_min_agg;

然后,如果一年后,我们也想要第 99 百分位,我们也可以这样做:

SELECT
    approx_percentile(0.5, percentile_agg) as median,
    approx_percentile(0.95, percentile_agg) as p95,
    approx_percentile(0.99, percentile_agg) as p99
FROM foo_15_min_agg;

那只是触及表面。最终,我们的目标是提高开发人员的工作效率,增强 PostgreSQL 和 TimescaleDB 的其他功能,如聚合重复数据删除和连续聚合。

两步聚合设计如何影响 hyperfunctions 代码的示例

为了说明两步聚合设计模式如何影响我们对超函数的思考和编码,让我们看看时间加权平均函数族。(我们的什么是时间加权平均值,为什么你应该关心这个问题帖子为下一点提供了很多背景知识,所以如果你还没有阅读它,我们建议你阅读它。你也可以暂时跳过这一步。)

时间加权平均值的计算公式如下:

\ begin time \ _ weighted \ _ average = \ frac { area \ _ under \ _ curve } \ end

正如我们在上述的表中所指出的:

  • time_weight()是 TimescaleDB hyperfunctions 的聚合,对应于 PostgreSQL 内部 API 中的 transition 函数。
  • average()是访问器,对应 PostgreSQL final 函数。
  • rollup() for re-aggregation 对应于 PostgreSQL 的 combine 函数。

time_weight()函数返回一个集合类型,该集合类型必须可供该系列中的其他函数使用。

在这种情况下,我们决定使用一个TimeWeightSummary类型,它是这样定义的(用伪代码):

TimeWeightSummary = (w_sum, first_pt, last_pt)

w_sum是加权和(曲线下面积的另一个名称),而first_ptlast_pt是进入time_weight()聚合的行中的第一个和最后一个(时间,值)对。

下面是这些元素的图形描述,它建立在我们的如何导出时间加权平均理论描述的基础上:

我们存储在“TimeWeightSummary”表示中的值的描述。图片作者。

因此,time_weight()聚合在接收我们图表中的每个点时进行所有的计算,并为它“看到”的第一个和最后一个点之间的时间段(δT)构建一个加权和然后输出TimeWeightSummary

average()访问器函数执行简单的计算,从TimeWeightSummary返回时间加权平均值(在伪代码中,其中pt.time()从该点返回时间):

func average(TimeWeightSummary tws) 
	-> float {
		delta_t = tws.last_pt.time - tws.first_pt.time;
		time_weighted_average = tws.w_sum / delta_t;
		return time_weighted_average;
	}

但是,当我们构建time_weight hyperfunction 时,确保rollup()函数按预期工作变得更加困难——并且引入了影响我们的TimeWeightSummary数据类型设计的约束。

为了理解 rollup 函数,让我们使用我们的图形示例,想象一下time_weight()函数从不同的时间区域返回两个TimeWeightSummaries,如下所示:

当我们有多个“TimeWeightSummaries”代表图形的不同区域时会发生什么?图片作者。

rollup()函数需要接受并返回相同的TimeWeightSummary数据类型,以便我们的average()访问器能够理解它。(这反映了 PostgreSQL 的 combine 函数如何从 transition 函数接收两个状态,然后返回一个状态供最终函数处理)。

我们还希望rollup()的输出与我们对所有底层数据计算time_weight()的输出相同。输出应该是代表整个区域的TimeWeightSummary

我们输出的TimeWeightSummary还应考虑这两个加权和状态之间的间隙面积:

小心空隙!(在一个“TimeWeightSummary”和下一个之间)。图片作者。

差距区域很容易获得,因为我们有最后 1 个点和前 2 个点,这与我们通过对它们运行time_weight()聚合获得的w_sum相同。

因此,整个rollup()函数需要做这样的事情(其中w_sum()TimeWeightSummary中提取加权和):

func rollup(TimeWeightSummary tws1, TimeWeightSummary tws2) 
	-> TimeWeightSummary {
		w_sum_gap = time_weight(tws1.last_pt, tws2.first_pt).w_sum;
		w_sum_total = w_sum_gap + tws1.w_sum + tws2.w_sum;
		return TimeWeightSummary(w_sum_total, tws1.first_pt, tws2.last_pt);
	}

从图形上看,这意味着我们将以一个代表整个区域的TimeWeightSummary结束:

合起来TimeWeightSummary。图片作者。

这就是两步总体设计方法最终如何影响我们的时间加权平均超函数的现实世界实施。上面的解释有点浓缩,但是它们应该让您更具体地了解time_weight()聚合、average()访问器和rollup()函数是如何工作的。

总结一下

现在,您已经了解了 PostgreSQL 聚合 API,它是如何启发我们开发 TimescaleDB hyperfunctions 两步聚合 API 的,以及它在实践中如何工作的几个示例,我们希望您亲自尝试一下,并告诉我们您的想法:)。

如果你想马上开始使用 hyperfunctions, 启动一个完全托管的 TimescaleDB 服务并免费试用 。在时标 Forge 上,每个新的数据库服务都预装了 Hyperfunctions,所以在你创建一个新的服务之后,你就可以使用它们了!

如果你喜欢管理自己的数据库实例,你可以 下载并在 GitHub 上安装 timescaledb_toolkit 扩展 ,之后你就可以使用time_weight和所有其他的超功能了。

如果您对这篇博客文章有任何问题或评论, 我们已经在 GitHub 页面上开始了讨论,我们希望收到您的回复

我们喜欢在公共场合进行构建,你可以在 GitHub 上查看我们即将发布的路线图,以获得提议的功能、我们当前正在实现的功能以及今天可以使用的功能的列表。作为参考,两步聚集体方法不仅仅用在这里讨论的稳定超函数中;它也用于我们的许多实验功能,包括

  • stats_agg()使用两步聚合使简单的统计聚合,如平均值和标准差,更容易在连续聚合中工作,并简化滚动平均值的计算。
  • [counter_agg()](https://github.com/timescale/timescaledb-toolkit/blob/main/docs/counter_agg.md)使用两步聚合来提高计数器的工作效率和可组合性。
  • [Hyperloglog](https://github.com/timescale/timescaledb-toolkit/blob/main/docs/hyperloglog.md)将两步聚合与连续聚合结合使用,为用户提供更长时间内更快的近似COUNT DISTINCT汇总。

这些功能将很快稳定下来,但我们希望在 API 仍在发展的时候收到您的反馈。什么会让它们更直观?比较好用?提出问题或开始讨论!

原载于 2021 年 8 月 4 日 https://blog.timescale.comhttps://blog.timescale.com/blog/how-postgresql-aggregation-works-and-how-it-inspired-our-hyperfunctions-design-2/

Postman 如何修复我们数据堆栈中缺失的层

原文:https://towardsdatascience.com/how-postman-fixed-a-missing-layer-in-our-data-stack-783f113bab56?source=collection_archive---------28-----------------------

在我们大规模现代数据系统的现代化和民主化过程中,哪些成功了,哪些失败了

图片由 Postman 提供,最初出现在 Postman 博客上。

一年多前,当我加入邮差的数据团队时,我们的数据对我来说还是一个谜。每天,我都会在 Slack 上发布问题,比如“我在哪里可以找到我们的 MAU(每月活跃用户)?”有人会告诉我在哪里得到它,但随着我的深入挖掘,我会在其他地方找到 MAU 数据。有时不同的地点相互矛盾。

随着时间的推移,我学会了如何浏览 Postman 的大量数据——哪些表有相同数据的不同版本,或者不同的过滤器,或者同步问题。但这并没有随着我而停止。随着数据团队在一年内扩大了近五倍,每个新成员都会一次又一次地遇到这个问题。

当时,Postman 的数据系统相当简单。我们有一组数据表,关于这些表的信息存在于我们早期数据团队成员的头脑中。当公司及其数据很小时,这种方法很有效,但当我们开始呈指数级增长时,这种方法就跟不上了。

Postman 目前拥有分布在四大洲的数百名团队成员,以及来自 500,000 家公司的超过 1,700 万用户使用我们的 API 平台。

从一开始,Postman 的联合创始人兼首席技术官安基特·索布提就想确保数据的民主化。他曾经说过,数据团队很难日复一日地坐着发表见解。相反,他坚定地认为,公司的每个人都应该能够访问我们的数据,并从中获得见解。这一点在 2020 年变得尤为重要,因为在新冠肺炎疫情期间,Postman 在完全远程化的同时继续扩大规模。

为了解决这个问题,去年我和数据团队决定将 Postman 的数据系统作为一个项目。我们的目标是让 Postman 的数据更容易访问和理解,无论是对数据团队的新员工还是整个公司的员工。

大规模数据系统的现代化和民主化是一个巨大的挑战,我们肯定不是唯一一家试图攻克这一难题的公司。因此,希望我们的经验可以帮助其他人应对同样的挑战,我现在想分享一下我们是如何进行这个项目的,什么可行,什么不可行,以及我们到目前为止学到了什么。

我们的起点——邮差数据堆栈的挑战

在 Postman,我们实现了一个现代化的数据堆栈。数据工程师将数据带入亚马逊的云数据仓库红移。然后我们的分析师用我们的 SQL 引擎 dbt 转换数据,并在 Looker 上创建仪表板和 Explore 。

目前,Looker 每周约有 170 名活跃用户。这对一家大约 400 人的公司来说是一个很大的数字,但这还没有达到我们让每个人都能使用我们数据的目标。

我们面临的一个主要问题是在提供数据上下文时缺乏一致性,这使得上下文成为我们数据堆栈中缺失的一层。随着 Postman 的成长,每个人都很难理解,更重要的是,很难相信我们的数据。

我们一直在根据整个公司的要求创建仪表板和可视化:无论人们需要什么,我们都设计。然而,这些仪表板上的指标经常重叠,所以我们无意中创建了相同指标的不同版本。当不清楚每个指标有何不同时,我们失去了人们的信任。(俗话说:建立信任很难,但失去信任很容易——只需要犯一个错误。)

数据团队的空闲频道被其他团队的问题填满,这些问题问我们“数据在哪里?”以及“我应该使用什么数据?”

我们经验丰富的数据分析师每周花费数小时来回答新员工提出的这些问题。当然,这对所有参与者来说都是令人沮丧的。但我们也意识到有一个更大的问题——如果我们的任何分析师离开公司,那将是一场灾难,因为他们的头脑中存储了如此多的信息。

在我们的数据团队的 sprint 回顾中,我们意识到 Postman 的数据系统需要帮助,所以我们开始了一个项目来民主化我们的数据并修复可发现性。我们的目标是为我们的团队创造更多时间,并在公司内部赢得更多信任。

解决方案 1:用 Confluence 记录我们的数据

我们没有对我们的数据系统进行大规模的检查,而是决定从小处着手,快速实施一个解决方案,看看我们能从中学到什么。Postman 已经在使用 Atlassian,所以我们从创建一个 Confluence 文档开始。

以前,我们所有的数据问题和答案都存储在 Slack 中。Slack 可能很难导航和搜索,所以人们会一遍又一遍地问同样的问题。在 Slack 上回答一两个问题很容易,但是 20 个或者 100 个呢?它就是不可扩展。

展望未来,我们的目标是让我们新的 Confluence 文档成为一个单一的、可搜索的事实来源。

每当某个东西在 Slack 上出现多次,我们就把它放到 Confluence 上。比如当有人问“你是怎么计算 MAU 的?,”我们在文档中添加了表格和计算。当许多人向我们询问相同的指标时,我们也添加了这些统计数据和图表。

解决方案 2:用 Google Sheets 创建一个数据字典

我们的 Confluence 文档是一个良好的开端,但是像 Slack 一样,单个文档无法像我们一样快速扩展。

我们的下一个想法是在 Google Sheets 中创建一个数据字典。

这似乎相当简单。我们首先将所有的表、模式和列名放在一个地方。然后,在几次冲刺中,我们指派数据团队中的每个人记录五个表。每个人都留出几个小时,在谷歌表单上写下他们所知道的关于数据表的一切。

我们还在这个过程中加入了评论。每个人记录完他们的表格后,数据团队中的其他人会通读他们的工作。如果天气晴朗,他们会说可以走了。

这是一个好主意,但我们在执行时遇到了挑战:

  • **低质量的文档:**当时,我们的数据团队有近 20 人,但其中只有三四个人在 Postman 工作了一年多。这些经验丰富的团队成员无法记录我们所有的数据,所以每个人都参与进来。然而,一些记录我们数据的人实际上对此并不了解。他们没有设置数据,也不是数据表的所有者。我们的新团队成员会添加他们理解的任何内容,但它并不总是给出数据表的完整图片。
  • **新的数据字典在规模上也有问题:**我们有近 20 名数据团队成员试图处理这个文档。这么多人同时写作、编辑和评论,很快就变得难以用一个谷歌表单来处理。这还只是数据团队。我们希望最终向整个公司开放数据字典,但我们不知道如何让数百名用户保护我们的文档安全和防篡改。

解决方案#3:使用 Atlan 实现预构建的数据工作空间

在两次尝试构建我们自己的解决方案后,我们开始寻找我们可以采用的现有产品。就在那时,我们发现了 Atlan ,一个现代化的数据工作空间,它似乎是我们数据发现问题的一个清晰的解决方案。

在 Atlan 上,我们已经能够对我们所有的数据进行编目和记录,它的编目充当了我们数据的单一真实来源。该目录包括针对数据团队内外不同类型用户的多级权限,因此每个人都可以搜索和访问数据,而不必向数据团队发送消息。

结果呢?每个人都能够找到适合他们用例的数据,并且所有访问它的数据都是一致的。

最明显的结果是,每个人最终都在谈论同样的数字,这有助于我们重建对数据的信任。如果有人说我们的增长是 5%,那就是 5%。

我们的新数据工作区非常成功,因为它界面简洁,功能强大,提供文档、所有权信息和使用情况以及数据发现。

超越数据发现

在 Postman,我们需要解决围绕数据发现和上下文的问题,因为随着我们规模的扩大,它们成为了主要问题。但是,随着我们解决这些问题,我们意识到我们无意中让自己面临更大的数据挑战。

例如,现在我们已经建立了一个系统来跟踪我们的数据,我们可以使用它来了解我们的数据血统,包括每个数据资产来自哪里,以及它们如何相互连接。

数据血统非常有用,原因有几个。首先,了解我们的数据是如何连接的有助于我们更快地解决日常问题。

其次,我们发现,随着我们数据团队的成长,拥有单一的真实数据来源有助于我们的数据团队。每次我们更改或添加新的东西时,检查它将如何影响我们数据系统中的其他东西是很重要的。我们不需要在 Slack 上发布问题,而是可以检查数据血统,找到我们需要更改或更新的一切。

随着我们改进了记录和编目数据的方式,沿袭只是我们看到的一个开放的途径。

我们还采取措施在工具间保持更一致的数据描述,提高我们的数据质量,等等。

从长远来看,我们认为改进数据发现的工作是整个公司数据民主化的基础。拥有一个可靠的数据基础,人们可以找到并理解我们所有的数据,这为每个人都参与分析数据提供了可能性。这将使我们整个公司变得更加数据感知和数据驱动,这是当今任何大公司的目标。

我们从去年学到了什么

当我回顾我们为改进数据堆栈所做的努力时,有几条经验非常突出——一些我们第一次就设法做对了的事情,还有一些我希望我们当初做得不一样的事情:

  • 从小处着手,构建更大的解决方案:当您面临大数据挑战时,很容易想到同样大的解决方案,这些解决方案需要大量资源或资金。然而,从更小、更快的解决方案开始有助于我们更好地了解什么对我们有用,什么对我们没用。然后,当我们冒险进入一个更全面的付费解决方案时,我们确切地知道我们在寻找什么功能。
  • 关注规模:我们的前两个解决方案是很好的想法,但是当我们扩大规模时,它们跟不上我们的团队和数据。这就是为什么考虑数据产品将如何随着您的公司和数据的扩展而扩展非常重要。如果您的数据在一年内增长 100 倍,它还能跟上吗?它能处理大量需求和访问级别不同的用户吗?
  • 一项改进开启其他改进:修复数据堆栈的一部分,为更大的改进奠定基础。数据编目和文档编制并不特别“有趣”,但对于您可能想用数据做的任何其他事情来说,它们是至关重要的。毕竟,如果你不了解你的数据,你就不能接受 ML、AI 和其他最新的数据术语。

你觉得这篇博文有趣吗?如果是这样,你可能也会对在邮递员工作感兴趣。了解加入邮差团队 这里

精确度和召回率如何影响反 COVID 度量

原文:https://towardsdatascience.com/how-precision-and-recall-affect-the-anti-covid-measures-38d625de61d9?source=collection_archive---------31-----------------------

从统计角度看我们如何抗击疫情

埃德温·胡珀在 Unsplash 上的照片

考还是不考,这是一个统计学问题。

在这场与疫情的全球斗争中,台湾在保护其公民安全和健康方面表现出色,迄今为止(2021 年 17 月 1 日)总共只有 850 例确诊病例和 7 例死亡。作为一个与病毒发源地中国仅一海峡之隔的小岛,这个数字简直令人难以置信。除了比世界其他地区更早承认疫情之外,台湾从未对国际入境者强制进行新冠肺炎检测。事实上,没有几个国家实行这项政策。

为什么我们不测试所有到达的人?难道通用检测不能让我们在患者入境前识别他们,从而防止本地传播和社区传播吗?如果检测结果为阴性,为什么我仍然需要进行自我隔离?你可能会问。

这篇文章旨在回答你的问题。

来自 Pixabay 的openclipbart-Vectors图片

为了理解这一决策背后的基本原理,我们首先需要理解两个统计指标,精确度和召回率。这是两个广泛使用的准确性指标。他们在很多决策中扮演着重要的角色。

混淆矩阵

在深入研究这两个指标是什么以及它们如何影响通用测试的实施之前,我必须先向您介绍一下**‘混淆矩阵**’。

混淆矩阵

对于每一种二元测试,无论是积极的还是消极的,结果只会落入四个网格中的一个。如果结果是正确的,这意味着测试结果与真实情况匹配,它将落入左上角的网格(您有 COVID,您被测试为阳性)或右下角的网格(您没有 COVID,您被测试为阴性)。否则,它将落入右上角或左下角的网格中。

但只称结果正确或错误是不够精确的。有多正确?怎么错了?所以我们必须给每个网格起一个名字,以便更好地理解结果。命名为***‘结果的对(真)或错(假)’+‘测试结果(阳性或阴性)’***。

  1. 真正的阳性:你有新冠肺炎,你测试呈阳性。
  2. 真阴性:你没有感染新冠肺炎病毒,测试结果呈阴性。
  3. 假阳性:你没有感染新冠肺炎病毒,但你的检测结果呈阳性。
  4. 假阴性:你感染了新冠肺炎,但检测结果呈阴性。

将它们放入表格中,你会得到统计世界中最突出的表格之一:

混淆矩阵

各种测试或筛查都旨在最大限度地减少 FN 和 FP。最佳测试工具将具有 0 FN 和 0 FP。不幸的是,这种完美的、100%准确的、0 错误的测试工具还不存在(还没有?).

准确(性)

现在我们理解了混淆矩阵,然后我们可以进入如何评估测试结果。为了便于说明,我将使用下面的场景作为例子。

本能地,人们会认为准确性是正确的结果/总的结果。所以我们的准确率是(90+1)/(90+1+1+8)=91%。哇,真令人印象深刻!一个 95%准确率的测试工具!好吧,从技术上来说,这种说法没有错,但是你可能会通过查看混淆矩阵发现它有点奇怪。

从矩阵中,我们知道事实上有 9 个人是积极的,91 个人是消极的。大多数人持否定态度。现在想象一下,有一个测试工具,它会给每一个被测试者一个否定的结果。因此,这个测试工具仍然可以获得 91%的准确率。高吗? 真是高得要命! 要不要在医院用这个检测工具? 肯定不是!

那么我们应该如何验证测试工具呢?

从这个例子中,我们知道仅仅准确性不足以评估结果。必须引入新的度量标准。这就是精度召回的用武之地。数学上,这两个指标定义为:

精度= TP / (TP+FP) = 1/ (1+1) = 0.5

召回= TP / (TP+FN) = 1/ (1+8) = 0.11

如果我们观察这两个指标,性能会急剧下降,尤其是在召回方面。为什么会这样?测试工具有什么问题?

看着公式,在这里暂停 10 秒钟。你可能已经有了精确和回忆的概念。

精确

如果你看得足够近,你可以发现精度实际上是计算为 真正/总分类正 。没错!精度是指在测试结果为肯定的情况下测量的准确度。换句话说,如果你被检测为阳性,这有多准确。

精度反映正面分类实际正确的比例。

如果你被这个测试工具测试为阳性,有 50%的可能性你实际上没有感染病毒。那是相当高的!你可能不想用这样精确的棉签。

当 FP 的成本很高时,精度是有用的。例如,如果我们的新冠肺炎测试精度低,这意味着有很多健康人被诊断为阳性。这些人会被错误地送到医院,接受他们没有的疾病的治疗。这不仅完全浪费了我们的卫生保健资源,还将健康的人暴露在危险的环境中,因此可能会产生更多的病人。这种恶性循环会在很短的时间内使医疗保健系统崩溃。这在某种程度上解释了为什么大多数国家不把检测呈阳性的人送到医院。

回忆

另一方面,召回计算为 真阳性/总实际阳性 。它衡量我们在所有阳性病例中实际识别出多少阳性病例。

召回表示正确识别的实际阳性病例的比例。

在这个场景中,总共有 9 个阳性案例,但是,这个测试工具只识别了其中的 1 个,也就是 11%。这很危险!你肯定不希望仅仅因为他们的检测结果是阴性,就看到很多新冠肺炎患者在街上晃荡!

FN 成本高的时候召回更重要。例如,癌症检测或信用卡欺诈检测。如果某人患有癌症,但测试呈阴性,患者将错过治疗的最佳时机。后果可能很严重。同样,如果信用卡发行商的欺诈检测算法召回率低,它可能会经常错误地将交易识别为欺诈否定(不是欺诈)并让其通过,这可能会使其客户损失大量金钱。

记住何时使用回忆的一个好方法是,当你的分类器的目标是识别一件'坏事',比如癌症或身份盗窃。错过识别那些'*坏事'*极有可能导致严重后果。我们希望在这类检测中召回率尽可能高。

敏感性和特异性

在医学上,回忆也被称为*。还有另一个度量, 特异性 ,与灵敏度相反。它测量被正确识别的实际阴性病例的比例。计算方法为TN/(TN+FP)= 90/(90+1)= 0.9*

敏感等于回忆。特异性代表正确识别的实际阴性病例的比例。

当记者向学者或官员询问专业意见时,你可能会在新闻中更多地看到这两个术语。

这些和通用测试有什么关系?

现在我们终于可以进入主题了,所有这些指标是如何影响是否对国际抵达者实施普遍测试的决定的?

想象一下,我们有一个测试工具,可以达到 85%的灵敏度和 95%的特异性。以伦敦为例,目前的患病率约为 0.7%。了解这些指标的含义后,我们可以从每 100,000 次测试中得出以下矩阵:

假阳性的人

我们需要注意的数字是假阳性和假阴性。有 4965 个假阳性,他是健康的,但被检测为阳性。从前面提到的例子中,我们已经知道这些人将会浪费我们的医疗资源,并且很有可能使整个系统崩溃。

假阴性的人

另一方面,有 105 名假阴性者感染了新冠肺炎病毒,但测试呈阴性。这些人不知道他们真的会传染。他们像往常一样被送回家,很容易放松他们的预防措施,因为他们认为他们是健康的。不戴口罩,不跟别人混。最终,他们会在不知情的情况下传播病毒。社区传播通常就是这样开始的。

即使敏感性和特异性更高,大量的测试仍然会导致大量的 FP 和 FN。测试的数量越多,FP 和 FN 的人数就越多。

结论

我们已经看到一些对国际入境者实施强制检测的国家,要么几乎摧毁了他们的医疗体系,比如德国,要么出现了爆炸性的社区传播,比如冰岛。对所有国际入境者进行强制检测似乎不是战胜病毒的最佳方式。

当然,在政府起草和执行政策时,情况要复杂得多。我不是流行病专家,这只是整体情况的一个方面。不过,当我们讨论应否实施普及检查时,与其责备政府不要做任何事,倒不如说一些简单的概念可以让我们有一个更理性的论点。

我希望这个故事能帮助你理解一些统计概念,以及我们如何将它们应用到现实世界的问题中。

参考:

准确度、精密度、召回率还是 F1?

精确度、召回率、灵敏度和特异性。

分类:精度和召回率。

伦敦冠状病毒数据

灵敏度和特异性

量子退火如何解决最难的计算问题|绝热量子计算 2

原文:https://towardsdatascience.com/how-quantum-annealing-solves-the-hardest-computational-problems-adiabatic-quantum-computation-2-e16d062dfeff?source=collection_archive---------27-----------------------

量子退火可能价值数十亿美元或彻底失败,在此阅读它如何改变世界

Johannes W 在 Unsplash 上的照片。退火的另一个用途是通过加热然后冷却来强化金属或玻璃,这不是今天使用的定义😏。

本系列文章

  1. 绝热量子计算 1:绝热定理和基础

2.这个!

预先注意:Medium 不允许数学方程的原生渲染,因此它们被强制为图像。这个里面链接的笔记本!允许打开本文末尾显示的代码,以及看到格式良好的数学。

上周,我们在绝热定理中学习了绝热量子计算的基本原理,关键要点是

  • 绝热定理;如果一个量子态处于系统的基态,那么系统的任何足够慢的变化都会使量子态保持在基态
  • 我们可以利用这一点得到一个通用的算法来寻找一个给定系统的基态。

该算法具有以下步骤

1.将状态初始化为一个易于设置的系统的基态,我们称之为 H_i 系统

2.构造一个基态解决问题的目标系统 H_t

3.从 H_i 慢慢演化到 H_t,读出基态。

本周,我想把重点放在算法的第二部分,并演示一个“最难”的计算问题的构造。

量子计算机到底擅长什么?

在我们完全投入之前,我想谈谈量子计算机有望帮助解决的一类困难的计算问题,以及为什么。

一般来说,一个问题是很难解决的,甚至很难找到一个好的解决方案,如果:

  1. 可能的组合数量非常大,或者可能是无限的
  2. 没有办法从当前状态转移到更好的状态。

当我们考虑具有数千个参数的参数化机器学习模型时,我们肯定会有第一个条件,即具有难以想象的大量可能设置。然而,训练过程完全取决于这样一个事实,即我们可以求导,或者有一些其他的机制,允许我们更新参数,使它们得到改善。在神经网络的情况下,可微性(求导的能力)完全取决于神经网络参数是连续的这一事实,而在决策树的情况下,数据集的变量可以排序。无论哪种情况,都不一定会是这样。

特别是在组合优化问题的情况下,对我们没有任何帮助。组合优化问题的一个例子是旅行推销员问题,其解决方案每年在供应链优化中价值数十亿美元。

简单的计算复杂性论证

当涉及到量子退火时,从计算复杂性理论中可以学到一个极其重要的教训。这是因为这些组合优化问题中的许多是 NP 完全的(并且是 NP 困难的),这意味着它们至少和任何其他计算问题一样困难(在 NP 中)。这意味着,如果有可能用量子计算机有效地解决这些问题中的任何一个,那么就有可能有效地解决所有这些问题,因为一个问题可以有效地转化为另一个问题。

这之所以如此重要,是因为它允许我们从复杂类 NP-Complete 中研究一个特定的简单问题。在本文中,我使用最大割问题。类似地,如果一个算法对这些问题中的一个有效,那么它应该对所有这些问题都适用。

一个合理的一般问题公式:二次无约束二元优化问题。

二次无约束二元优化(曲波)问题有一个听起来比实际可怕得多的名字。具体来说,它们是优化数学方程(成本函数)的问题

曲波成本函数

其中 x_i=0,即 x_i 是一个二进制变量。它被称为曲波,因为它是二次的,因为它的最高阶项是 x_i x_j,它取决于两个变量,无约束,因为 w_i,w _ j 可以取任何值,二进制,因为 x_i 是一个二进制变量,最优化,因为我们试图在成本函数上最小化。

最大割问题。

最大割问题涉及将数学图的节点分成两组,让我们称它们为 AB ,使得最大条边将组 A 的一个节点连接到组 B 。考虑下图,其中显示了三个不同的分区。显然,更右的分割是最佳的。然而,事实证明,要在计算上解决这个问题,没有有效的解决方案可以避免枚举每一个可能的分区。因为有 nn n 个节点,每个节点可能有 2 种可能的状态,这意味着通过 2^n 可能的组合进行强力搜索。

这个 5 节点图的三种可能的切割,右边的显然是最佳的。作者图片

我们可以很容易地把最大割问题转化为曲波问题。我们可以说每个节点都是一个二元变量 x_i,0 表示它是有色的(A 组),1 表示它是白色的(B 组)。如果 x_i≠x_j,则一条边计数为最大值。将此改写为二元运算,我们需要

我们可以立即认出这就是异或运算。这个等式(很容易通过替换来检查其正确性)是

因此,就曲波问题而言,成本函数是简单的

其中 edges 是这样的边的集合,使得(1,2)将节点 1 连接到节点 2。注意到这是一个最大化,如果我们想把它公式化为一个最小化问题,我们可以简单地取负数。

这和量子有什么关系?

所以我刚刚做了很多随机的,复杂的技术阐述,要把它和量子联系起来,我们只需要再做一次飞跃。我真的很难从这一段中删除一些术语,如果有你不明白的地方,并且对“获得要点”至关重要,请评论,我们可以在评论中进一步讨论。在量子计算中,我们实际上没有取二进制值 0 或 1 的比特。相反,我们有量子位。事实上,这些量子位实际上是自旋 1/2 系统,这意味着它不是取值 0 和 1,而是取值 1/2 和 1/2。我们还知道量子位可以同时呈现多个值*,这就是量子叠加的力量。因此,为了“检查”该值,我们对它应用一个操作,根据它的状态将它发送到 1/2 或 1/2。让我们把做这个的操作叫做^,这里我们的帽子意味着它是一个对量子对象的操作。*

所以,要把曲波语言的问题转化成量子语言的问题,我们有一个直接的翻译

那么最后,什么是量子退火?

量子退火是绝热量子计算,它有特定的限制

  • 最初的系统是

其中 X hat 只是另一个量子算符

  • 目标系统是

知道了我们的翻译,我们现在可以立即将任何曲波问题,如 MaxCut,转化为量子退火问题。对于那些喜欢行话的人来说,这被称为2-局域伊辛模型*。*

所以让我们写点东西吧!

我将使用我为自己的荣誉【https://github.com/milanleonard/QuantumAnnealers编写的一个包来简化这里的代码。这是一个名为 QuTip 的量子模拟库的简单包装。

万岁!我们的量子退火机得到了正确的答案

通过简单地枚举每一个可能的状态,这对于只有 5 个节点的情况来说是足够容易的,我们可以看到我们已经成功地获得了正确的节点分配和正确的值。

关键要点

  1. 理解量子退火本质上和曲波问题讲同一种语言
  2. 组合优化问题真的很难,这里展示的一个特定的曲波问题是组合优化问题最难形式的一个例子
  3. 量子退火也许能解决这些问题。

我下周要讲的内容

第三份外卖里的“可能”其实还是挺大的“可能”。下周我想讨论量子退火的一些未知和挑战,并评估我对它们是否可行的看法。我将特别谈到

  1. 理论上量子加速是否可能
  2. 我们是否已经看到了它的实验证据,以及对 D 波量子退火装置的一般性讨论
  3. 一些内在的难题,最重要的是量子位连接

如果您有任何问题或意见,请告诉我。我真的想尽我所能让这篇文章对读者有更多的信息和更多的用处,我得到的反馈越多,我就越能为你量身定做!

量子技术如何开启新领域

原文:https://towardsdatascience.com/how-quantum-tech-can-unlock-new-frontiers-b68c2cce07dc?source=collection_archive---------41-----------------------

科学家们正在寻找暗物质。如果没有量子技术,搜索可能需要一万年——真的。

在某些领域,量子计算已经超过了经典计算机。作者图片

A A 差不多一个世纪前,荷兰天文学家雅各布斯·卡普坦首先提出暗物质的存在。他一直在研究星系中恒星的运动——一个星系可以粗略地描述为一堆恒星、气体和尘埃围绕一个共同的中心旋转——并注意到有些东西不对劲。星系外层的恒星旋转得太快,不符合万有引力定律。Kapteyn 的假设是,一些看不见的大质量物质可能存在于星系中和星系周围,使外层恒星达到观察到的速度。

从 20 世纪 60 年代到 80 年代,薇拉·鲁宾、肯特·福特和肯·弗里曼收集了更多的证据来支持这一假设。他们最终表明,大多数星系包含的不可见质量是可见恒星、气体和尘埃的六倍。

其他有利于暗物质的观察随之而来,比如宇宙微波背景中的引力透镜和各向异性。引力透镜是一种光束在大质量物体周围弯曲的现象;宇宙微波背景是宇宙的外层,如果没有暗物质,它将是非常均匀的,但实际上是相当不均匀的。

与此同时,无数的智囊团已经设计出理论并设计出实验来追踪暗物质。然而,到目前为止,没有人真正看到过暗物质粒子。这就是为什么,即使在今天,高级科学家,以及像我这样的博士生,仍然在进行暗物质的研究。似乎发现暗物质还需要几个世纪,甚至几千年。

然而,随着量子计算的最新进展,暗物质物理学可能会经历一次巨大的推动。寻找两种类型的暗物质——科学家们实际上不知道它们是否都存在,但他们正在试图弄清楚——可能会从量子技术中受益。第一种是轴子,它的存在可以解释为什么如果你翻转一个粒子的电荷和宇称,强核力不会改变。另一种是暗光子。这些粒子的行为类似于光的粒子光子,当然,除了暗光子根本不是光。

寻找轴子

根据理论,轴子应该以特定的频率在时空中摇摆。唯一的问题是理论学家无法预测这个频率会是多少。因此,研究人员只能扫描大范围的频率,一次一个小频段。

就像旧的无线电接收器将无线电波转换成声音一样,轴子探测器将轴子波转换成电磁信号。然而,这个过程变得更加复杂,因为轴子同时以两种不同的频率振荡。

你可以想象这看起来有点像一个喝醉的人试图从聚会上回家:他们可能向右走三步,然后向左走三步,然后再向右走。那是一个频率,在“左-右”频谱上。因为它们也有严重的打嗝,不过,它们可能会在每次打嗝时跳到空中!,每四步发生一次。这是“上下”频谱上的第二个频率。

Axions 可能比喝醉的人更复杂一点,但他们也有两个频率,就像聚会上喝多了一杯的人一样。

从数学上讲,可以通过平方相加将这两个频率放在一起。也就是说,将第一个频率乘以自身,将乘以自身的第二个频率相加,然后求平方根。

在我们的酒鬼的例子中,对于第一频率,三步乘以自身等于九步的平方,对于第二频率,四步乘以自身等于十六步的平方,并且我们一起得到九步的平方加上十六步的平方的平方根是五步。在我们的例子中,这五个步骤被称为电磁场正交。

量子系统的特性使它们在寻找轴子时更有效率。作者图片

现在,通常需要在很大的频率范围内(比如 1 到 200 步)检查一个很小的频段(在我们的例子中相当于一步)。实际上,这更难。轴子频率 T3 可能在 300 赫兹到 3000 亿赫兹之间。这是一个很大很大的范围!以我们目前的方法运行的速度,覆盖这个范围可能需要长达一万年,因为我们一次只能测试一个小的带宽。

这个带宽受到所谓的测不准原理的限制。所以,回到我们聚会的例子,观察者自己可能喝醉了,因此错算了两个频率。他们可能会错过两步,计算 1 的平方加上 2 的平方的平方根,大概是两步。或者他们可能会计算 5 的平方加上 7 的平方的平方根,大概是八步。这是六个步骤的带宽。因此,如果观察者想要扫描 1 到 200 步的范围,他们必须测量 33 次。然而,带宽越大,他们测量频率的频率就越低。

谢天谢地,通过一种叫做量子压缩的过程,这个带宽可以被扩大。直接从量子计算机借用超导电路,人们可以重新分配不确定性,使得一个频率比另一个频率受影响更大。

在我们的例子中,喝醉的观察者可能能够很好地计算上下频率,达到一步的精度,但他可能会错过三步左右的频率。因此,他可能会测量 0 的平方根加 1 的平方(一个步长)到 6 的平方根加 5 的平方(大约八个步长)之间的任何值。带宽因此增加了一个步长,观察者只需要测量 28 次而不是 33 次。

由耶鲁大学、加州大学伯克利分校、劳伦斯伯克利国家实验室和科罗拉多大学博尔德分校的研究人员组成的 HAYSTAC 合作组织已经完全实现了这一协议。通过量子压缩,他们已经将之前 1 万年的观测时间缩短了一半。随着进一步的改进,他们相信他们可以将寻找轴子的速度提高 10 倍。

科学家们正在集中他们的技能来更快地发现暗物质。作者图片

让暗光子穿过墙壁

在费米实验室,科学家们正在研究,加速对暗光子的搜索。为了这一研究,他们用光子填充一个超导微波腔,并尽可能保持另一个为空。根据理论,这些光子中的一小部分应该会自发地变成暗光子。由于暗光子可以穿过墙壁(是的,野生动物),其中一些将最终进入科学家设置的第二个空腔。这些暗光子中的一小部分会变回普通光子,然后科学家可以探测到。

然而,这些光子探测器有两个问题。首先,它们经常会返回误报。也就是说,他们表明他们发现了一个光子,尽管实际上,没有光子在陷阱里!第二,当一个光子进入探测器时,它就消失了。这意味着不可能检查阳性结果是假阳性还是真阳性。

量子测量避开了这两个问题。它们保存光子,这意味着它们可以重复测量,直到光子的自然寿命结束。并且通过反复测量,可以消除假阳性结果。如果那里没有光子,但探测器显示为阳性,那么在随后的测量中显示为阴性的可能性很高。这是因为当周围有光子时,探测器显示阳性的几率比周围没有光子时(理应如此)要高,所以显示一连串的假阳性是不太可能的。

此外,费米实验室在建造空腔方面的专业知识通过延长光子的寿命而获得了回报。本质上,在低质量的腔中,光子很快消失。然而,在费米实验室的空腔中,它们存活了很长时间。这种耐用性使得重复测量变得更加容易。

通过结合腔和量子测量方面的专业知识,这种技术的灵敏度比量子极限(即常规量子测量的基准)高 36 倍。如果没有量子技术,探测暗光子甚至是不可能的。

搜索正在升温

物理学家已经在暗物质上花了将近一个世纪的时间,而且没有迹象表明这个谜会很快被解开。尽管如此,搜寻工作还是取得了进展。

特别令人兴奋的是,量子技术,无论是量子压缩,量子测量,甚至可能是量子计算,都被应用于这些搜索中。仍处于初级阶段的探测方法正被用于寻找迄今为止最难以捉摸的粒子。为了找到看不见的粒子,科学家们正在使用和发展未来的技术。

暗物质已经有了漫长而丰富的历史。你可以花半辈子的时间来研究这个,从最初的概念到几十年的实验都没有发现它。但是科学家们不愿意再增加一两章,甚至 10 章,这可能会比前几章更令人兴奋。也许尖端的量子技术将最终打破这个谜团。

本文原载于 建于

居民如何减少 90%的数据问题

原文:https://towardsdatascience.com/how-resident-reduced-their-data-issues-by-90-64c4fc9f2658?source=collection_archive---------27-----------------------

行业笔记

一家初创公司获得更可靠数据的旅程,从 BigQuery 到 Looker

图片由作者购买的 Shutterstock 根据标准许可条款提供给 WindAwake 。

许多数据领导者告诉我们,他们的数据科学家和工程师花费 40%或更多的时间来解决数据问题,而不是从事那些真正有意义的项目。

不一定非要这样。下面是直接面向消费者的家具品牌 Resident 的数据工程团队如何利用 大规模数据可观察性 将数据事件减少 90%。

在讨论数据驱动型公司时,直接面向消费者的床垫品牌可能不是第一个想到的类别。但是Resident的数据工程主管 Daniel Rimon 将他们在技术、数据和营销方面的投资归功于他们最近的成功:2020 年,Resident 实现了 100%的增长,总销售额超过 5 亿美元,并获得了 1.3 亿美元的新一轮融资。

“当你听到床垫时,它不一定会告诉你数据或技术,但这就是我们公司的全部,”丹尼尔说。她目前是一个数据团队的成员,该团队有四名分析师和三名工程师,由一名数据副总裁领导。

Resident 依靠数据来推动营销决策和支出,20 多个营销连接支持线索和客户跟踪、细分和零售分析。Daniel 和她的团队现在管理 BigQuery 中的 30,000 多个表,并利用包括 Google 云平台、Airflow 和 Rivery 在内的数据技术堆栈,进行实验并使企业能够实时根据数据做出决策。

“我们有很多数据,”丹尼尔说。“这让事情变得非常复杂,很难追踪。如果支持我们运营的任何数据丢失或损坏,或者这些管道中的某些东西损坏,都会给整个业务带来非常严重的问题。”

挑战:连接不同的数据源并理解数据资产之间的关系

2019 年,当丹尼尔加入公司时,Resident 一直在使用 BigQuery 分析有关广告绩效的数据,跟踪营销支出,商品成本和销售额。

“我们有复杂的查询,许多重复,不一致的逻辑——这是相当混乱,”丹尼尔说。“我们知道我们丢失了很多数据,希望通过谷歌分析和谷歌标签管理器更好地跟踪我们的网站。我们没有任何监控,没有关于客户成功的信息,并且发现我们与许多营销来源没有联系。”

该公司饱受不可靠数据和团队间紧张关系的困扰。

“利益相关者和高管无法访问他们做出决策所需的最新数据,”Daniel 说。“它还对业务部门之间的关系产生了负面影响。例如,如果你从事数据工程,这可能会让你与商业智能或分析团队的关系变得紧张。”

除了公司的内部关系,客户体验也受到了伤害,糟糕的数据导致客户收到与他们无关的电子邮件。

当时,丹尼尔和她的团队试图手动处理数据问题。

她说:“我们将把我们的战略建立在记忆、一些基本工具以及来自分析师或同事的很多希望和帮助的基础上。”手工工作导致了重复的视图和流程,并且团队对哪些字段或表会影响下游数据消费者没有清晰的了解。他们设置的唯一通知是基本的故障警报。

丹尼尔说:“我的早晨,或者我老板的早晨,会从打开每个主要仪表板开始,寻找错误或没有意义的东西。”"它非常原始,非常低效,令人沮丧."

丹尼尔回忆道,有时候,在将数据注入到团队的大型查询中的后端过程中,会出现一些问题。除非她手动检查仪表板,否则她不会知道。“但有时公司的首席执行官会让我和我的老板放松一下,然后问,‘这是怎么回事?“我们没有销售额吗,”这就是我的噩梦——收到一条“数据已关闭”的消息。数据坏了。”没有上下文,我不知道从哪里开始,所以你必须调查并了解它的核心…这令人沮丧。当你刚到公司时,就没那么有趣了。“以色列的数据团队和他们在美国的同事之间的时差对事情没有帮助。

Daniel 的老板知道情况必须改变,因此要求 Daniel 从头开始构建一个完整的数据性能流程。现有的平台没有得到很好的维护,并且很难调试,这是一项具有挑战性的工作。

“我告诉我的老板,‘我希望有一个地方,我可以拿一张桌子,看看它连接的一切,”丹尼尔说。我可以知道,它影响这个和这个,但不是这里,这是它最终到达的仪表板。我需要一张很大的地图。肯定有这样的东西!"

解决方案:数据可观察性

随着 Daniel 和她的团队开始了解他们需要什么,而不是建立一个定制的系统,Resident 开始使用数据可观测性来处理实时监控和警报,以及 lineage-Daniel 告诉她的老板她需要的大数据关系图。

结果:通过实时监控和警报,在数据问题影响到数据消费者之前将其解决

图片由作者提供。

Data Observability 使用机器学习来自动设置表的警报参数,捕捉所有居民表的新鲜度或量的异常,Daniel 估计这些表约占其警报的 90%。

现在,Daniel 和她的团队不再收到 CEO 发来的惊慌失措的消息,而是在 Slack 中收到诸如表更新行数少于预期,或者没有在预期时间更新等问题的警报。他们是第一个知道问题的人,工程师可以轻松更新问题状态以跟踪进度。

Daniel 还可以定义自定义警报,例如她为一组特别敏感的流程设置的警报,这些流程依赖于 Google Analytics 在每天的特定时间向他们的仓库交付数据。“它通常在以色列时间晚上 7 点左右到达,但并不一致。而且我必须安排特定的过程在之后发生,但是如果我错过了,我必须从头再来。我在晚上 8 点开始我的过程,第一步是知道谷歌分析更新发生了。如果它丢失了,我会收到一条松弛警告消息,这样我就可以停下来,找出发生了什么,并修复它。我不得不在 MC 之前手动检查这个,这真的很烦人。我花了 20 秒钟就设置好了这个提醒,而且非常简单。”

结果:通过自动化沿袭防止“数据灾难”

图片由蒙特卡洛提供。

自动化血统对丹尼尔和她的团队来说是一个巨大的优势。

“保持这种血统不需要我付出任何代价。如果我想要一些高级监控,我可以定义它,但是我不需要任何东西来获得这种级别的血统。这是我的梦想。”

为了创建沿袭图,Data Observability 自动从 BigQuery 的查询日志中解析出 SQL,并通过一个连接器将沿袭扩展到 Looker 和 Github。随着数据的发展,谱系会自动更新。

图片由蒙特卡洛提供。

Daniel 最喜欢的用例是一个名为“Admin Orders”的表,其中包含了关于订单的所有信息。

“这是我最喜欢的表,我可以看到许多关于它的行为的信息,就像为它提供信息的其他表和视图一样。”

她能理解过去发生了什么变化。她还可以看到将受到管理订单更改影响的下游视图,以及哪些 Looker 仪表板最终连接到她的表,因此她可以与她的分析师和工程师合作,以了解任何更改的影响。

“因为是他们建立了那些观点——而不是我,”丹尼尔说。“我们可以共同协作,确保在数据灾难发生之前就预防它们。”

结果:在管道的每个阶段信任数据

自从实施数据可观察性以来,Resident 的数据团队发现数据问题减少了 90%。随着管理层和利益相关方对数据信任的恢复,居民计划构建越来越多的数据产品,并进一步丰富他们的数据。丹尼尔的团队是公司未来不可或缺的一部分:

“公司的任何流程都离不开我们。人们信任和相信我们的数据,因为它可靠而且很好。即使它很复杂,我们也有工具来实时监控它,并使它更加可靠。”

驻地的数据信任

除其他优势外,数据可观察性还通过以下方式对居民产生了积极影响:

  • ****自动化手动流程以便数据团队可以将时间和精力集中在创新和改进上,而不是救火
  • 通过自动和定制的警报缩短数据问题出现时的检测时间
  • 通过自动化传承和改进的协作防止下游中断
  • 通过确保高管拥有推动业务发展所需的准确信息,实现更好的决策

“在数据可观察性出现之前,我一直在观察,担心自己遗漏了什么,”丹尼尔说。“我现在无法想象没有它的工作。我们有 10%的事故发生在一年前。我们的团队超级可靠,人们都依赖我们。我认为每个数据工程师都必须有这种级别的监控,才能高效地完成这项工作。”

有兴趣了解数据可观察性如何帮助您恢复信任并回收宝贵的时间吗?伸手 蒙特卡洛

对数据的可观测性感到好奇,但不确定从哪里开始?报名参加 我们的现场演示2021 年 4 月 28 日星期三。

罗氏如何利用 TypeDB 发现新的潜在基因靶点

原文:https://towardsdatascience.com/how-roche-discovered-novel-potential-gene-targets-with-typedb-9fb7029d7610?source=collection_archive---------34-----------------------

国家癌症研究所拍摄的照片

类型系统如何为药物研发渠道带来速度和新颖性

听取来自 Vaticle 社区讲座的汇报——由罗氏系统生物学科学家 David Dylus 主讲。这个演讲是四月份在轨道 2021 上虚拟发表的。

药物发现的核心是寻找在疾病机制中重要的靶标。然而,目前,所有已知的目标都经过了缓慢的尝试和测试。在这个项目中,大卫和他的团队设计了一个规则系统来推断和发现目标和疾病之间的隐藏联系。

在接下来的故事中,David 介绍了他在 Roche 的团队是如何识别出那些未被开放靶标识别为高排名的潜在新靶标的。这是通过 TypeDB 实现的,他的团队用它来存储相关数据,然后为这些新目标找到潜在的生物学证据。

使用了哪些数据集?

对于这个项目,使用了三个数据集: [STRING、Oma 和 DisGeNET](http://needs to be linked) 。

STRING 是已知和预测的蛋白质-蛋白质相互作用的数据库。相互作用包括直接(物理)和间接(功能)关联;它们来源于计算预测、有机体之间的知识转移以及从其他(主要)数据库聚集的相互作用。这不仅包括文献,还包括蛋白质与其他蛋白质相互作用的实验证据。这意味着我们可以寻找只有实验证实的蛋白质相互作用的蛋白质。

Oma 用于插入基因家族,即视差基因,即功能保守的相似基因,在基因组上是重复的,可能彼此具有相似的功能。

最后,基因被用来提供变异信息,这使他们能够将突变与基因联系起来:例如,如果你的基因组上有一个突变,如果这个突变与一个基因有关,如果这个基因与一种疾病有关,我们可以将疾病与这个突变联系起来。托马斯在他的“轨道 2021”演讲中也提到了这个数据库。

这就导致我们提出一个问题,例如:

有这种突变的人是否也有某种特定疾病的患病率?

要回答这个问题,我们应该检查特定的突变与基因有多接近,然后认定这个变异以某种方式调节了那个基因。这可以解释为什么我们会看到这种类型的疾病表型。

如何建模和查询洞察力

首先,该团队查看了开放目标数据库中的现有目标,并选择了那些已经排名很高且已知具有高关联分数的目标——由于罗氏内部知识产权,不幸的是,他们不能具体提及哪些目标;为了便于理解,对它们进行了重命名。

David 将从开放靶标billionDollarTargetbestTarget中提取的排名较高的靶标称为关联得分较高的靶标,换句话说,它们与 David 团队感兴趣的疾病紧密相关。下面我们将看到如何使用 TypeDB 来寻找在开放靶标上排名不高,但仍间接调节疾病的靶标,因此是潜在的高价值靶标。

为此,David 在 TypeQL 中构建了一套规则和模式。下面是如何对这些数据进行建模的一小段摘录,摘自 BioGrakn-Covid ,这是一个由 Konrad Mysliwiec (罗氏数据科学软件工程师)领导的 Vaticle 社区项目。请注意,这是一个选定的架构;完整的模式可以在 BioGrakn-Covid 模式文件中找到。

define
gene sub fully-formed-anatomical-structure,    
  owns gene-symbol,       
  owns gene-name,      
  plays gene-disease-association:associated-gene;
disease sub pathological-function,    
  owns disease-name,    
  owns disease-id,    
  owns disease-type,    
  plays gene-disease-association:associated-disease;
protein sub chemical,    
  owns uniprot-id,    
  owns uniprot-entry-name,    
  owns uniprot-symbol,    
  owns uniprot-name,    
  owns ensembl-protein-stable-id,      
  owns function-description,    
  plays protein-disease-association:associated-protein;
protein-disease-association sub relation,    
  relates associated-protein,    
  relates associated-disease;
gene-disease-association sub relation, 
  owns disgenet-score,    
  relates associated-gene,    
  relates associated-disease;

插入正确的模式、规则和数据后,我们可以编写第一个查询。下面的关系被大卫的团队称为gene-disease-inference,属性order:1表示这是一个直接关系。该查询如下所示:

match
$d isa disease, has disease-name "Disease";
$r ($gene, $d) isa gene-disease-inference, has order 1;
get $r, $d, $gene;

结果如下,我们可以看到billionDollarTargetbestTargetyouWillNeverGuessTarget链接到了Disease。我们也看到这三个目标是order: 1,这表明疾病和基因之间有直接的和先前已知的联系。然而,目标是找到新颖的目标。

为此,他们编写了如下所示的查询。这寻找通过与order 2gene-disease-inference关系连接的疾病和基因,但是明确排除那些已经与order:1gene-disease-inference关系连接的疾病和基因:

match
$d isa disease, has disease-name "Disease";
$r ($gene, $d) isa gene-disease-inference, has order 2;
**not {($gene, $d) isa gene-disease-inference, has order 1;};**
get $r, $d, $gene;

这个查询返回一个完全不同的基因列表:whatCouldIBeTargetawesomeTargetthatTarget。这些都是通过带有order:2gene-disease-inference连接到Disease的目标。

如果您不熟悉 TypeDB 工作库,可以右键单击其中一个推断关系,并在下拉列表中选择“解释”。这将解释那些推论,并告诉你这些目标是如何通过目标所扮演的角色与我们的疾病联系在一起的。

如果我们解释链接deadTarget的推断关系,我们会看到这个目标与youWillNeverGuessTargetorder: 1属于同一个基因家族。这种推断是通过一条规则实现的,这条规则允许我们根据现有数据推断新数据。在这种情况下,我们发现了两个目标之间以前未知的间接相互作用。

给出这个推论的规则背后的逻辑分解如下:

什么时候:

基因靶标与疾病相关联

并且该靶标也与已经被鉴定为与疾病具有强相关性的另一靶标在同一基因家族中

然后:

这个基因靶点和疾病应该通过一个基因-疾病-推理的关系联系起来

对于其他新的目标,awesomeTargetbestTarget,我们看到这些推论是基于蛋白质间的相互作用,这与whatCouldIBeTarget有关。如果我们解释这种关系,我们会看到它通过一个gene-disease-associationbillion-dollar Target相连,可能与疾病有相同的变异。

尽管awesomTargetthatTarget出现在感兴趣疾病的开放目标数据库中,但它们的排名非常低。这意味着他们与那种疾病有一些联系,但不是很强。TypeDB 发现了新的证据,表明这些目标可能排名更高。

这就是罗氏的大卫团队如何能够利用 TypeDB 的推理引擎来找到使用标准方法或更直接的方法可能会错过的新目标。

也就是说,生物学是一个非常复杂的领域,并且在不断进化。过去正确的数据集今天可能不正确。我们一直在处理新的混淆因素,不同的方法,生物学中固有的噪音。目标是用强有力的生物学证据找到控制疾病的新方法。

发现一个新的目标并不一定意味着这是一个解决方案或者可以进行试验。然而,开始挖掘其调节特定疾病的功效是一个伟大的假设,无论是找到治愈方法还是为患者提供更好的治疗方法。

从这里我们能去哪里?

通过整合蛋白质复合物和途径等额外信息,可以实现更高级的靶向,而不是靶向单个蛋白质。例如,我们可以寻找属于同一途径的几个基因。如果一种药物不能充分调节单个靶点,使患者的状态发生积极变化,那么我们可以考虑在同一途径上靶向多个位点。

大卫还提到,他考虑扩展规则,例如,寻找高阶关系,以便能够检查特定疾病的三阶、四阶或五阶联系。除了蛋白质-蛋白质相互作用之外,还有扩展的空间,并加入非常具体的查询约束。例如,我们可以过滤,我们希望基因 X 和 Y 是同一途径的一部分,在同一细胞类型中表达,在疾病表达中显示上调或下调,等等。这样,就像边界条件一样,我们可以提高我们的目标优先级,并使其对我们的过程非常有价值。

特别感谢 David 的工作,他对社区的贡献,以及他为工作带来的快乐。

所有幻灯片均经许可使用。你可以在 Vaticle YouTube 频道点击找到完整的演示文稿。

SAS 用户应该如何看待 Python

原文:https://towardsdatascience.com/how-sas-users-should-think-about-python-fc91f2b2cd65?source=collection_archive---------16-----------------------

让你的思想正确,让你的代码正确

有相当多的资源可以帮助 SAS 用户开始编写一些 Python 代码。但是对于我们这些把 SAS 作为第一语言的人来说,切换到 Python 不仅仅是翻译代码行。这是世界观的改变。以下是如何看待世界的一个 Pythonista。采用这种观点不仅有助于你复制你的 SAS 工作。这将有助于拓展你的视野,让你了解编程语言能为你做些什么。

尼克·里克特在 Unsplash 上的照片

首先,这不是一篇 SAS vs Python 的文章。我非常尊重这两种生态系统。它们可以单独使用,也可以无限组合在一起使用。我想我们都是成年人了,您已经做了尽职调查,并提出希望为您的业务添加一些 Python 功能。这篇文章会给你一个心理工具包,帮助你从这个决定中获得最大收益。如果你和我一样,你出发的时候至少会有这一套问题。让我们浏览一遍,让您了解 Python 世界。

为什么每次打喷嚏都要装新库?

由劳伦·麦科纳奇在 Unsplash 拍摄的照片

Python 的强大功能..最大的痛苦是它的图书馆系统。除非你想从头开始复制经典的计算机科学算法,比如冒泡排序,否则你可能需要为你写的每个程序导入至少两个库。这曾经是非常痛苦的。有些库安装起来会有问题,并且经常会破坏一些相关的库!对你来说幸运的是,Python 中的 conda 和 pip 社区现在已经使这变得非常干净了。除了 TensorFlow 的 GPU 安装,这里的事情会进行得相当顺利。

仍然存在发生灾难性错误的小风险。为了管理这一点,创建一个虚拟环境来隔离您的项目。第一天不用担心。但是当你开始认真对待 Python 时,总是为一个项目使用一个新的 venv ,这样你就有了一套不会与其他项目冲突的新的库。您可以将这个库列表保存到一个需求文件中,然后在一行代码中构建一个新的 venv 。【https://docs.python.org/3/library/venv.html

为什么他们不把 pandas 和 numpy 这样的流行库添加到核心 python 中,然后就完事了呢?嗯,这种分散式开发意味着你很早就能获得最先进的强大功能,比如 Python 中的强化学习。尽管您可能仍然希望为某些生产需求购买商业软件,但您至少可以用 Python 来组装 NLP、ML、graph、深度学习、模拟或计算机视觉项目的所有启动工具,每种工具都有两行代码:一个用于 pip install 的 shell 命令;和一个导入语句。在许多情况下,可用的功能会将您一直带到企业部署。

图书馆系统是非凡的,它将为你在数据分析和数据科学方面的创新提供动力,不需要任何成本,只需要你的汗水。

Python 中数据科学最好的入门库和资源有哪些?

我不会在这里赘述一般情况。有很多关于使用 Python 进行数据科学研究的资源。它已经成为该领域事实上的语言。但是这里有一些注意事项,特别是对你的 SAS 用户。

照片由杰伊·温宁顿在 Unsplash 上拍摄

熊猫数据框架是数据集的等价物。你可以操纵它们,例如旋转,衍生新的领域,总结,连接和计算到你的心的内容都在熊猫。Proc merge 在 df.merge 中有对应的功能,排序和重命名都是非常标准的。我发现的唯一问题是,熊猫虽然很强大,但相当啰嗦。重命名一个列是一个通过花括号和方括号的旅程!继续阅读,了解在 Python 中哪里也可以切换到普通的旧 SQL 进行标准查询和转换。

如果你是一个 SAS IML 用户,并且对矩阵做了大量的工作,请直接进入 Numpy。您将在这里获得所有的线性代数功能,并拥有强大的省时功能,如广播。如果你想和很酷的 Python 数据科学家一起玩,就把你的矩阵叫做“张量”吧!

对于机器学习来说,Python 中没有相当于 SAS Enterprise Miner 的开源。这实际上是关于 scikit-learn、TensorFlow、PyTorch 或 Keras 中的编码。好的一面是这些都是很棒的图书馆。如果你确实想走 GUI 的道路,你可以在 AutoML、RapidMiner、DataRobot 或更多上面花点钱。或者继续使用 Enterprise Miner 作为您的 GUI ML。

数据保存在哪里?

在 Unsplash 上由Duan veverkolog拍摄的照片

(好吧,我在想哪种动物如此执着……乌龟。不知道我能让动物主题持续多久,但是让我们看看!)

在 sas 中,我们传统上处理位于文件系统中的. sas7bdat 文件——每个表(或者使用 SAS 术语的数据集)一个文件。如果您通过 ODBC 或本地连接连接到 Teradata 或 SQL Server 之类的数据库,您也可以访问这些关系数据库模式。如果您是 SAS BI 用户,您还可以访问 OLAP 数据存储。

Python 呢?嗯,Python 是一种语言,而 SAS 是一个垂直集成的系统,所以最终 Python 并不关心那么多。它将支持任何东西。但实际上,数据分析师和数据科学家通常将数据存储为文件,如。磁盘上的 csv,至少在 R&D 模式下是这样。csv 的好处在于它相当通用。它不保存数据类型或其他元数据。您可以根据需要在导入时指定字段的数据类型。因此,您可以毫无问题地在软件之间传递 csv。另一面是..您必须在导入时定义您的数据类型。这可能是一大堆管道代码。祝您在寻找格式错误时好运,尤其是日期。(日期在任何语言中都是一场噩梦!)

因此,如果数据类型对您的程序真的很重要,您可以考虑 parquet,这是一个二进制文件,它很容易导入和导出,但它为您提供了标准的数据类型。

现在,如果您已经创建了一个非常酷的 Python 对象,比如带有多索引或多维数组甚至 ML 模型的 pandas dataframe,会怎么样呢?那么在这里,joblib 图书馆来拯救。你可以简单地用一行程序把你的对象保存到磁盘,然后在你喜欢的地方重新导入它。

如果你真的想连接到一个数据库,有很好的支持。例如,SQLAlchemy 允许您用几行代码和一个库导入连接到大多数数据库格式。一旦连接上,您就可以像 pandas 表一样处理数据,将结果保存回数据库,或者在代码中直接针对数据库本身编写 SQL。

如何在内存中保存数据?

Geran de Klerk 在 Unsplash 上拍摄的照片

Python 支持你可能会想到的所有基本数据结构——变量、列表和集合。可能最方便的额外工具是字典,一个简单的键-值对映射,经常会派上用场。我不确定我是否写过不使用字典的 Python 程序。由于您的值可以采用任何数据类型,一个很好的用例是拥有一个名为 pandas 数据帧的字典。这允许您遍历这组表,将数据转换一次自动应用到整个集合。在 SAS 中,你可以通过一个宏循环来完成。相信我,Python 的方式要简单得多,也更易读。

在做数据科学时,我们通常将更复杂的数据保存在更高层次的数据结构中,如 pandas dataframes 和 numpy 数组。

一旦您的需求变得更加定制化,就像在任何复杂的程序中一样,您就可以自由地创建自己的类来存放数据。Python 有一个名为 dataclass 的特殊类,允许您简洁地创建这些。然后,具有可组合性和继承性的 OO 的力量允许您创建一个复杂的数据模型,可以在内存中轻松地对其进行编程。

如果您经常处理数据库,您可能希望使用对象关系模型工具包(如 SQLAlchemy)来创建内存中的关系模式。这将为用查询、连接和更新遍历数据模型提供许多方便的功能。

回到主题,Python 在一个程序中组合如此多不同数据结构的能力也可能成为令人头疼的问题。与动态类型相结合,它会产生各种副作用和代码模糊性。好的模块化或面向对象设计,注意命名约定和类型提示可以解决大部分问题。

我能找到相当的企业指南吗?

照片由埃利奥特·范·布根豪特在 Unsplash 拍摄

我可以在这里拐弯抹角,想出一些选择,但是……答案只是‘不’。你不会找到的。开源世界中更少的指南。这是更勇敢的数据科学家的地方!

开源世界是非常以程序员为中心的。你不会找到一个免费的基于 Python 的工具,允许你操作和连接数据,运行模型,获取统计数据,将模块构建成流等等。一般来说,你可以在一个强大的用户界面中做任何你想做的事情。与 Enterprise Miner 一样,这是 SAS 真正的亮点。如果不想编码,就坚持使用 EGuide。或者查看一些商业替代品,如用于数据工作的 SnowFlake 和上面列出的用于建模的 ML GUI 提供者。

我需要开始写面向对象的代码吗?

不,你不知道。但是你应该掌握干净的模块化代码。虽然 SAS 正在向函数方向发展,但大多数代码库都是围绕着 datastep 编写的,其中宏用于可重用的部分。Python 以函数、模块和包的形式组织,更易于维护和阅读。如果你学会了这些基础知识,你将会开始编写更简洁、更易维护的代码。

对于某些用例,面向对象确实胜过模块化。当你的程序增长超过一定的复杂度时,你就开始陷入混乱,函数调用的函数很难跟踪。其中一个迹象是,当你需要通过 10 个函数传递一堆数据时,才使用它。

从面向对象开始。无论您的模块化方法看起来有什么缺陷,都可以考虑为一组数据创建一个类,该类需要一组公共函数。看一看基本的 UML 和 OO 模式,你将很快开始构建值得软件工程师使用的程序。

为什么创建可视化需要这么多代码?

在 Unsplash 上由 Carlos Muza 拍摄的照片

一旦您开始使用 matplotlib 和 seaborn,您将会看到 Python 在数据分析方面的真正威力。但是随着强大的力量而来的是巨大的复杂性。每次创建哪怕是最简单的图表,我还是得去谷歌一下。

如果你是一个图形迷,就一头扎进去吧。这里对你来说太多了。Seaborn 补充 matplotlib。散景、dash、streamlit 等将带您体验互动。如果你像我一样是个图形白痴,那就坚持用熊猫吧。他们已经将所有的基础知识嫁接到了这个库中,所以大胆猜测一下,在 dataframe 中添加类似. plot.bar()的东西可能会给你一些合理的东西。

对于 dashboarding,可以考虑像 Superset 这样的开源工具集,以节省许多代码行,并获得一些漂亮的交互式功能。如果你想对这个过程有更多的控制,Bokeh 和 Streamlit 这两个工具可以让你创建交互式的 web 应用程序,而不用太深入 web 应用程序设计。但是最终,就像 EGuide 和 EMiner 一样,开源世界并没有像商业机构那样做这种用户友好的软件。通过坚持使用 SAS BI 或检查 Tableau/PowerBI/Qlik(至少对于企业级仪表板),您可能会省去很多麻烦。

我如何分享我的工作?

在 Unsplash 上由米米·蒂安拍摄的照片

SAS 和其他垂直集成的商业数据系统的一个很大的优势是,它们支持围绕工件共享的客户机-服务器类型的安排。Python 中有几个选项。首先,对于开发者之间的协作,托管的 Jupyter 服务,如 https://tljh.jupyter.org/en/latest/[的最小的 Jupyter hub](https://tljh.jupyter.org/en/latest/)是共享代码和数据的好方法。

为了与业务用户共享结果,上面提到的仪表板解决方案是受欢迎的选择。但是对于一个更具凝聚力的企业数据分析系统,您将希望回到商业世界,使用 SAS 或替代产品(如雪花)来支持常见的数据消费和生产工作流。

我需要担心 Git 和版本控制吗?

由 Roman Synkevych 在 Unsplash 上拍摄的照片

你不需要担心它,但你应该使用它。并不是说 SAS 用户从来不用 Git。但是他们不愿意。我们在版本控制和没有版本控制的发布上陷入了可怕的混乱。Git 正在彻底改变软件构建的方式,使得程序维护和更新更加干净和没有错误。它还为 CICD(持续集成持续部署)铺平了道路,允许大型团队可靠而快速地推送代码。

Git 的问题在于它并不容易。像 Python 生态系统中的其他东西一样,它是为最大功能而设计的。你可以用它做任何事情,但有时似乎你不能用它做任何事情。作为一个新手,你将不可避免地陷入合并、存储和重置的可怕困境。Windows 用户可以选择一个漂亮的图形用户界面来简化事情。

但是命令行值得学习。把你的痛苦看作是一次性的。一旦你接受了它,你就离不开它了。不再有周一早上的会议问‘我的代码去哪了?“我可以看到科林清理数据的新程序,但我们似乎没有生成任何……数据!”

应该用什么 IDE 写代码?

阿姆扎·安德烈在 Unsplash 上拍摄的照片

如果你是从 SAS 世界出来的,我认为你更可能是一名数据科学家,而不是一名经过培训的计算机科学家。CS 的小伙子和姑娘们总是回避这个问题,并声称使用 Vi 或 vim 来编写代码,就像我们的祖先那样。我们这些重视理智的人将使用现代编辑器来帮助捕捉错误,提供自动完成功能,并访问许多其他便利功能,如数据库查询、降价呈现等等。

现在所有酷小孩都花大量时间在 Jupyter 笔记本上写 Python。当你在一个“单元”中运行一个代码片段时,这是一个非常方便的方法来编写带有快速反馈的代码片段序列。安装相当容易,并且您可以在浏览器中工作。

然而,一旦一个程序达到了几百行代码,你认为你可能需要重用它(提示:你会重用它!),我发现更传统的 ide 是必不可少的。

使用 VSCode、PyCharm、Spyder 和其他工具,您可以更容易地创建包含包和模块的应用程序结构,并了解程序实际上是如何调用的,而不仅仅是按照编写的顺序。关于这一点有无止境的争论,但是请将 Jupyter 和成熟的 ide 视为互补,并根据您的需求进行选择。

我是一个 VSCode 用户,对它说不出足够多的好话。Python 调试器让我摆脱了很多麻烦,pytest、flask 和其他集成是创建我的生产应用程序的关键。我听说皮查姆一样好,如果不是更好的话。

我能找到类似 Proc SQL 的东西吗?

照片由 Sunder Muthukumaran 在 Unsplash 拍摄

是的,你可以!它叫做 pandasql,工作起来就像做梦一样。您可以将 sql 写成一个字符串,并针对任何 Pandas 数据帧或数据帧集运行它。我已经使用它毫无问题地构建了完整的 ETL 管道。对于使用规范化的数据,它提供了一个更干净、更易读的代码库,您会喜欢回头再看。

但是对于涉及复杂的可重用函数、多维索引或时间序列的重型 ETL,Python 和 Pandas 会给你更大的马力。(流行的数据库系统通常求助于围绕 SQL 的过程化语言,比如 PSQL 或 PL/SQL。)在企业级,您可以开始使用一些很棒的框架,比如 Prefect for orchestration 和 Great Expectations for schema validation。

你现在是皮托尼斯塔了

Patrick Beznoska 在 Unsplash 上的照片

嗯,也许先写点 Python 代码吧!但是现在您已经将您的 SAS 概念和需求翻译成了 Pythonese,我希望您能够看到您已经采用的这种奇怪的新语言的一些可能性。享受旅程!

卖鞋如何让我成为更好的数据分析师

原文:https://towardsdatascience.com/how-selling-shoes-made-me-a-better-data-analyst-2095854f1a19?source=collection_archive---------21-----------------------

尽管看似毫无关联,但在当地一家跑步用品店工作对我作为数据分析师的工作方式产生了重大影响

高二的时候,我开始在当地一家跑步用品店打工。我是越野队和田径队的成员,在跑步装备方面我是一个痴迷的书呆子,所以只有找到一份兼具两者的工作才有意义。在店里,我大部分时间都在一对一地与顾客打交道,帮助他们试穿鞋子,偶尔还会挑选各种服装。

当我说我是一个痴迷跑步装备的书呆子时,我是真心的。我可以告诉你每双鞋的堆叠高度,组成鞋底的化学化合物,并且一度可以记住 50 多种型号的每种颜色代码。我大部分时间都在工作时穿 2-3 双不同的鞋子,对模特进行“产品测试”,以便以后能和她们交流。

作者图片

在一家经营中的商店工作带来了各种各样的顾客。有许多高中和大学的跑步者,已经跑了一段时间的老年人,尝试第一双鞋的跑步新手,以及许多其他种类的人。鉴于顾客群的多样性,我参与了许多不同的互动,结果,真正磨练了我销售鞋子的能力。

我卖鞋时的心态是,我从来不会特别在意一个人是否买了鞋。现在,这听起来可能违反直觉,但这是有原因的。我的重点是为人们找到一种产品,在他们和跑步之间创造积极的体验。强迫某人买鞋不符合他们的最佳利益,因此也不符合我的利益。

所以不要问“我怎么才能卖出这只鞋?”问题是“我如何为这个人找到合适的产品?”。这就是事情变得有趣的地方。

与客户合作时,了解你的受众很重要。如果我和一个有经验的、有竞争力的跑步者一起工作,和我和一个第一次买鞋的人一起工作时,对话会非常不同。在第一种情况下,我可能会深入一些技术规格,解释重量差异,材料风格,以及它们如何影响跑步。在后一种情况下,对话通常会有所不同。我不是解释工程网、EVA 泡沫等之间的区别,而是经常在更高的层面上解释事情,将鞋子比作枕头和弹簧。

传达的基本信息仍然相同,但格式不同了。知道你在和谁说话是销售的一个重要方面,能够在一次舒适的谈话中使用技术语言会让你更容易解决手头的问题。

那么,这些与数据分析有什么关系呢?

嗯,在数据分析中遇到的问题与在一个运转的商店中遇到的问题非常相似。在数据中,你可以得到你想要的技术(或者非技术),构建从饼图到神经网络的任何东西。但是,您最终得到的解决方案取决于…

  1. 谁是你的观众?
  2. 他们真正需要的是什么?

在许多情况下,只有当你得到观众的认同时,展示的信息才是重要的。如果你的老板来自一个非技术背景,而你抛出了 t 检验、ANOVA 分析和超参数调整的幻灯片,你会很快失去它们。如果他们不接受,那么你正在做的工作就真的无关紧要,因为它永远不会离开你的办公桌。

就像我卖鞋一样,我现在不得不卖数据分析。

虽然能够进行良好的数据分析并对所需的技术技能有很强的了解很重要,但同样重要(或更重要)的是能够销售和交流这种分析。归根结底,如果你周围的人不愿意购买使用数据,世界上所有的分析都是没有意义的。

当处理数据时,想想你会如何把它卖给别人。它带动了什么好处?它如何满足他们的需求?有多容易理解?

处理数据中的问题就像卖鞋子一样。你必须了解客户的背景,以决定如何向他们展示信息。你需要能够将这些技术信息翻译成可以理解的有意义的东西。有时这意味着用散点图、自相关图和模型参数表进行深入的统计分析。其他时候,它意味着条形图。虽然事先可能看起来传达了更多的信息,但只有当你的观众理解它并能将其与问题联系起来时,它才会这样做。

如果客户不能理解,堆积如山的信息并不比单一的事实更好。

人们很容易被数据的魅力所吸引,认为分析师的素质来自于他们工作的深度。许多(年轻的)分析师经常没有意识到的是,与学校不同,在学校里你经常被要求进行几页的分析,现实世界关注的是影响,而影响与理解相关联。

考虑到这一点,您将如何“出售”您的数据?

数据科学家应该如何应对不确定性?

原文:https://towardsdatascience.com/how-should-data-scientists-tackle-uncertainty-5c2b487432ae?source=collection_archive---------19-----------------------

商业利益相关者、决策者和外行人都向数据科学家寻求清晰的、基于数据的建议。事实上,数据往往是杂乱的,科学和艺术之间的分界线可能(也确实)变得模糊不清。

本周,我们分享了一系列优秀的帖子,这些帖子以这样或那样的方式处理了不确定性问题,以及如何以清醒的头脑、开放的心态和足够的好奇心来处理这个问题。

  • 学习如何在神经网络中建模不确定性 。我们从卷起袖子开始:当你看到“当我们用完全相同的设置多次重复相同的实验时,结果会出现不可预测的差异”时,你会怎么做?亚历山大·莫拉克的教程向我们介绍了任意不确定性,并提出了一种使用张量流概率来解决它的方法。
  • 我们如何减轻气候对经济的影响?恶劣天气对供应链和经济行为的影响可能是极端的,随着气候变化,这种影响变得越来越明显。王博士向我们介绍了她的团队发起的“将恶劣天气影响的昂贵混乱转化为准确的影响数据”的过程,重点是快餐和零售需求。

杰西卡·鲁斯切洛在 Unsplash 上拍摄的照片

  • AI 能否适应快速增长的环境担忧?“人工智能灵活性”可能是答案吗?
  • 仔细看看不确定性的本质 。在行业数据科学家的日常工作中,建议和发现经常围绕着概率。正如弗洛伦特·比森建议的,这些对话应该有更多的细微差别;他认为过度依赖 p 值会产生次优决策,并建议使用 Bootstrap 置信区间。
  • 在选择模型特征时,我们应该考虑哪些因素? 根据他丰富的行业经验, Conor O'Sullivan 深入探讨了特性选择的过程。他坚持认为,我们应该超越预测能力——消除不确定性的关键因素——而采取更全面的方法,考虑可解释性、稳定性和道德等因素。
  • 用 AI 伦理塑造用户体验 。还是在工业领域,最近的 TDS 播客节目邀请了主持人 Jeremie Harris 和 Shopify 的工程和数据科学总监 Wendy Foster。Wendy 的人工智能伦理和产品设计方法不是引导用户走上预定的道路,而是依靠不确定性,为用户提供清晰的选择和权衡,并使他们能够做出明智的决定。

感谢您加入我们又一周的大数据科学写作。感到鼓舞支持我们作者的工作?考虑成为中等会员。

直到下一个变量,
TDS 编辑

我们策划主题的最新内容:

入门

  • 商务人士所说的细分实际上寻找的是什么姚文玲
  • 在将 AI 引入您的项目之前要问的七个问题作者 Aliaksei Mikhailiuk
  • Irene Chang使用 Spotify API 创建一个 Flask-Heroku 情绪跟踪器网络应用

实践教程

  • 由 Khuyen Tran 与提督一起用 Python 编排一个数据科学项目
  • 英语到印地语的神经机器翻译作者马哈尔什·罗伊
  • 如何在谷歌分析中衡量用户互动克洛伊·摩根
  • 用 Spark + R 分析巴西的紧急财政援助作者 Cleiton Rocha

深潜

  • 1 毫秒延迟下的抱脸变压器推断作者Michal benesy
  • AI 状态报告:2021 年摘要作者丹尼尔·伯克
  • 通过 Klas Leino 训练可证明健壮的神经网络

思想和理论

  • Asset2Vec:将 3D 物体转化为矢量并返回作者 Jonathan Laserson 博士
  • 可解释的人工智能(XAI)。但是,为谁?作者卡洛斯·穆根
  • 时间序列的傅立叶变换作者约奥斯·科尔斯坦杰
  • 机器学习时代的稳健决策作者傅鹏程

组织应该如何组织他们的数据?

原文:https://towardsdatascience.com/how-should-organizations-structure-their-data-c19b66d629e?source=collection_archive---------1-----------------------

意见

三种流行的数据仓库技术综述

高效的数据基础设施造就高效的数据科学家。组织如何构建数据会对创新、员工效率和整体数据文化产生巨大影响。

图 1:作者图片— src img via unsplash 和 idea credit 。

自 90 年代计算兴起以来,在最佳数据结构化技术之间一直存在激烈的争论。然而,有两种思想占据了主导地位——比尔·恩门和拉尔夫·金博尔的思想。两者都定义了 ETL 管道,将各种来源的数据带到同一个位置,供组织内的利益相关者访问。

然而,在 21 世纪初,Dan Linstedt 发明了另一种数据管道结构,称为数据仓库。

在本帖中,我们将回顾一篇来自 2021 论文的比较,该论文概述了每种方法并解释了每种方法的优缺点。请注意,每个主题都很复杂,所以我们只涉及最基本的内容——更多资源在文章和评论中有链接。

事不宜迟,我们开始吧。

技术 TLDR

有三种感兴趣的数据仓库结构。

  1. Inmon:一种稳定的仓储策略,其中数据一致性是最高优先级。所有面向用户的数据集市都建立在健壮和规范化的数据仓库之上。
  2. Kimball:一种动态仓库策略,其中快速开发有用的数据结构是最高优先级。所有面向用户的数据都建立在星型架构之上,星型架构存储在多维数据仓库中。
  3. Data Vault:一种快速异步的仓储策略,其中敏捷开发是最高优先级的。所有面向用户的数据都需要另一个中间层,比如星型模式结构。

好的,但是我应该使用哪一个,为什么?

让我们慢一点来讨论数据仓库的目的,并更好地理解上面的每一种方法。

1.为什么数据结构很重要?

几乎每个大中型公司都非常依赖数据。数据可以用来构思产品,决定组织的策略,并支持 A/B 测试。

如果您的组织利用数据,数据结构会非常有影响力。它决定了你要花多少钱来存储和访问你的数据,你能多快得到这些数据,它有多准确,它有多一致,等等。

此外,由于数据科学家是组织数据的主要消费者之一,我们高度依赖良好的数据工程。

在本帖中,我们将讨论一种特定的数据存储策略— 数据仓库。

2.数据仓库的主要类型是什么?

从定义开始,数据仓库用于在一个位置存储来自各种来源的数据。就像仓库一样,它们通常有一个组织结构,但可以容纳各种不同的对象。

人们已经提出了许多组织数据仓库的方法,但是自 20 世纪 90 年代以来,有两种主要的方法:Inmon 和 Kimball。我们将在列表中添加第三个更现代的结构,称为数据库。让我们依次看一看每一个。

2.1。英蒙

Inmon 的数据仓库将数据的准确性和一致性放在高于一切的位置。由于对一致性的强调,往往会有大量的前期工作,但是随后的修改和添加是非常有效的。

让我们看看数据流实际上是什么样子的…

图 2: Inmon 数据仓库结构。图片作者。

在图 2 中,数据流非常线性。我们从各种数据源(1)开始,清理它们(2),然后将它们插入一个结构化和有组织的数据仓库(3)。从那里,我们预测业务用例,并将不同团队的某些信息存储到数据集市中(4)。最后,我们添加了一个可视化层(5 ),它允许人们不用写代码就能访问这些数据。

2.2。金博尔

Kimball 的数据仓库采用结构化程度较低的方法,这加快了初始开发周期。然而,未来的迭代需要相同的工作量,如果您不断地更新仓库,这可能会很昂贵。质量检查也很少——我们甚至不包括清洁步骤。

图 3: Kimball 数据仓库结构。图片作者。

数据流如图 3 所示。我们从各种数据源(1)开始,并立即将它们存储在一个数据仓库(2)中,该数据仓库利用了一个星型模式,我们将在下面讨论这个概念。最后,我们允许非技术人员通过可视化层(3)访问这些信息。

Kimball 方法受欢迎的一个原因是数据仓库中的数据是如何结构化的——它利用了星型模式…

图 Kimball 数据仓库利用的星型模式的例子。图片作者。

在图 4 中,我们的数据源在逻辑上被组织成更小的表,每个表中都有连接键。因此,如果我们需要获取给定用户的设备信息,我们可以简单地使用 CRM 表(蓝色)、设备表(红色)和事件日志表(黑色)来创建一个包含所有必要信息的更大的连接表。

2.3。数据保险库

最后,我们最新的竞争者是数据库。数据保险库希望通过保持最大的灵活性来解决前两种方法的一些弱点。这使得它实现起来高效,(相对)快速,并且高度动态。然而,由于非结构化的性质,建议在构建报告工具之前利用星型模式。

图 5:数据仓库仓库结构。图片作者。

在图 5 中,我们可以看到数据仓库的简化流程。和上面的方法一样,我们从各种数据源开始(1)。接下来,我们将这些数据源放入一个数据湖(2 ),这是所有先前数据源的非结构化存储。所有数据都在一个位置后,我们将这些数据移动到 staging(3 ), staging(3)支持各种数据“移动”操作,如批处理和流处理。接下来,我们进入数据库(4 ),它以下面讨论的集线器-链路-卫星结构存储所有原始数据。最后,当组织中有人需要这些数据时,我们添加一个可视化层(5)。请注意,通常最好在 4 和 5 之间添加一个结构,以便于访问。

但是数据仓库中的数据是如何构建的呢?嗯,有三个主要组成部分:

  1. **枢纽:**枢纽是企业感兴趣的实体。它们只包含一个不同的业务键列表和关于每个键首次加载的时间和位置的元数据。
  2. **链接:**链接连接集线器,并且可以记录集线器之间的事务、组合或其他类型的关系。
  3. **卫星:**卫星连接到集线器或链路,存储关于数据何时从哪里加载的元数据。它们非常适合版本管理和历史分析。

这种结构使它具有高度的动态性,因此如果业务逻辑发生变化,数据基础设施可以很容易地适应。

3.哪种方法最好?

和大多数复杂的主题一样,没有简单的“最佳”解决方案。因此,让我们来看看几个潜在的评估标准,并在每个标准中选出我们的获胜者。

3.1。准确性/一致性

**在数据准确性类别中,Inmon 是明显的赢家。**在最初开发 dat 仓库时,我们花了大量时间清理脚本,并进行强大的质量检查。从那里,所有输入到我们的数据仓库的数据都“保证”符合我们的数据质量标准,这使我们可以依赖我们的数据仓库作为单一和通用的事实来源。

Kimball 和 data vaults 在如何定义指标方面有很大的可变性。Kimball 比 data vault 更早开始这个过程,但是两者都缺乏通过下游表的标准化。

3.2。开发时间

关于开发时间,我们没有明确的赢家——这取决于在开发周期的什么时候你想花费你的资源。Inmon 涉及大量的前期工作,但是一旦数据标准化代码到位,未来的迭代相对于其他两种方法要简单得多。

在另一个极端,数据仓库本身的开发时间可能是最短的。然而,要使数据可访问,您必须添加一个 Kimball(创建者推荐)或 Inmon 结构。因此,vault 本身的开发速度更快,但是还需要下游的工作。

Inmon 是一个中间地带,设置起来非常快,但是我们没有创建太多样板代码或健壮的结构,所以每个额外的更改都需要做同样多的工作。

3.3。查询速度

Kimball 目前拥有最快的查询速度。这使得它成为数据分析师和产品经理的热门选择。如图 4 中的星型模式图所示,我们所有的表都会变得非常小,所以如果我们要查找特定的信息,智能设计的 Kimball 结构会非常有效。

英蒙可能排在第二位。数据集市是由报告工具访问的结构层,但是在转换到数据集市时通常没有太多的数据重组。仓库和数据集市之间的主要区别在于,后者是特定业务功能的子集,而前者存储所有业务信息,而不考虑团队或主题。

最后,如前一节所述,不建议直接查询数据保险库——相反,我们希望在保险库之上构建结构,从而使查询速度取决于我们选择的最终结构。

4.答案

使用上述信息和其他一些要点,这里有一些选择数据仓库结构时的基本经验法则。

如果…使用 Inmon

  • 数据准确性是您的仓库最重要的特征
  • 你有时间/资源做大量前期工作

如果…使用金博尔

  • 如果您的业务需求定义明确且稳定
  • 您经常查询大量数据

使用数据库如果…

  • 你的商业目标经常改变
  • 您需要在基础设施中内置版本控制

现在你知道了!我们分解了三种主要的数据仓库技术,并快速讨论了为什么每种技术都有价值。

最后,我做了很多 ETL,但我不是数据工程师,所以如果有错误或者你同意/不同意以上建议,请留下评论。

感谢阅读!我会再写 23 篇文章,把学术研究带到 DS 行业。查看我的评论,链接到这篇文章的主要来源和一些有用的资源。

SQL 初学者如何使用 BigQuery 了解全局疫情

原文:https://towardsdatascience.com/how-sql-beginners-use-bigquery-to-understand-global-pandemic-9f11c0332bc0?source=collection_archive---------14-----------------------

无需预装,使用浏览器分析新冠肺炎公共数据集

沃洛季米尔·赫里先科在 Unsplash 上的照片

无论你是准备数据分析师面试,学习 SQL,还是仅仅对通过数据分析解决业务挑战感兴趣。面临这样的挑战是很常见的:我了解数据库是如何工作的,但不知道去哪里找项目?试题库很多,但都不是业务问题,知识和实践经验有差距。

在本文中,我将带您了解如何使用公共数据集来体验数据分析之旅。以 BigQuery 中的新冠肺炎公共数据集为例。

一年多来,许多国家都在不同阶段谈论新冠肺炎。一些国家已经解除了戴口罩的禁令,但其他国家仍处于封锁状态。这个数据集帮助我们回答这样的问题:A 国的回收率是多少?或者哪些国家和这个疫情打交道最好?

  • 挑战
  • 解决办法
  • 步伐
  • 思想
  • 限制
  • 结论

挑战

这些是我们学习 SQL 时面临的挑战

  • 计算不同语法的练习是什么
  • 缺少场景
  • 缺乏实践
  • 缺乏数据
  • 缺乏端到端的体验
  • 缺失数据
  • 缺乏商业意识和对指标的理解,如保留率或转换率

解决办法

谈到 SQL、商业智能和 ETL,有许多选择。在本文中,我将使用 BigQuery。

什么是 BigQuery,我为什么选择它?

BigQuery 是谷歌云平台上一个流行的数据分析解决方案。它无需服务器,高度可扩展。最重要的是,它有许多公共数据集可以使用。

关于数据集

数据集的来源来自不同的组织,包括纽约时报、欧洲疾病预防和控制中心、谷歌、世界银行的全球健康数据、OpenStreetMap 等。在 2021 年 9 月之前,它可以免费用于教育或研究目的。

数据大小为 6.9GB,并且还在不断增长。超过 1.2 亿行 700 多列的数据。它包含确诊病例数、死亡、性别、年龄和恢复等数据。

步伐

步骤 1:将数据加载到 BigQuery

准备一个 GCP 账户或在 Qwiklab 上开始免费试用,然后使用这个数据集。

当你看到下面的截图时,你已经准备好了。

BigQuery Web 界面(按作者)

步骤 2:数据清理

我推荐保持的一个好习惯是在任何分析之前总是检查重复。您可以通过运行下面的查询来实现它。

SELECT COUNT(*) AS num_duplicate_rows, 
FROM `the_table_you_want_to_check` 
GROUP BY column1,column2,column3
HAVING num_duplicate_rows > 1;

步骤 3:练习您的 SQL 技能

是时候练习您的 SQL 技能了。

下面是一个例子,找出 2020 年 5 月 10 日哪个国家的回收率最好。

WITH cases_by_country AS (  
SELECT    
country_name AS country,    
sum(cumulative_confirmed) AS cases,   
sum(cumulative_recovered) AS recovered_cases  
FROM    bigquery-public-data.covid19_open_data.covid19_open_data  WHERE    
date = '2020-05-10'  
GROUP BY    
country_name ), recovered_rate AS 
(SELECT  country, cases, recovered_cases,  (recovered_cases * 100)/cases AS recovery_rate
FROM cases_by_country)SELECT 
country, 
cases AS confirmed_cases, 
recovered_cases, 
recovery_rate
FROM 
recovered_rate
WHERE cases > 50000
ORDER BY recovery_rate desc
LIMIT 10

查询结果显示答案是法国。

BigQuery Web 界面(按作者)

第四步:视觉化

最后,不要忘记将它形象化,因为这有助于我们更好地与观众沟通。点击“探索数据”并链接到谷歌的报告解决方案 Data Studio,从不同角度展示结果。

Data Studio 界面(由作者提供)

思想

使用高质量的数据,这样您就可以专注于最重要的事情:数据分析

就食物的质量而言,配料就是一切。数据分析可以是类似的,因为分析师不再需要担心数据的完整性或一致性。由于您可能没有高质量的数据,开放数据集将是一个不错的选择。

值得注意的是,云计算的一个优势是数据集保存在数据湖中。需要时,我们打开水龙头,数据流入 BigQuery 等服务。没有必要等待传输中的数据。

一路发展你的商业理解

预测销售预测时的关键特征是什么?评估政策影响的关键指标是什么?即使解决了数百个 SQL 挑战,这些问题仍然没有答案。这就是为什么使用上下文(如场景和用例)进行练习是必不可少的,因为它可以帮助我们将查询与现实世界的问题联系起来。

头脑风暴展示你掌握一项技能的另一种方法

用一种方法来应对挑战是很好的,但是想出另一种方法怎么样?

我和一个在数学方面很有天赋的朋友聊天。他在大学入学考试中名列前茅。一开始我以为他只是练了很多题。令人惊讶的是,他并没有大量练习题型。相反,他会考虑第二种甚至第三种方法来解决同样的问题。这个提示在我学习新东西的时候启发了我。也许我们不应该试图解决过去考试中的那么多问题。相反,思考一种新的方法来解决同样的问题!

限制

活动跟踪有时不起作用。

如果你正在使用 GCP 提供的 Quest 进行练习,它会在你完成实验的各个部分时使用活动跟踪来监控你的工作。有时,它只计算特定的列或值。例如,我在一个查询中使用了 country_code 来计算确诊病例数,但没有得到要点。最后,我发现我应该用 country_name 来代替。想法是一样的,但是我们需要适应这个机制。

数据的详细程度因国家而异

美国数据的粒度是最好的。例如,您可以按每个州检查案例。但是在其他国家找不到相同级别的粒度。

这个项目不是为面试准备而设计的

如果你正在寻找面试准备材料,Leetcode 或 Hackerrank 将是更好的选择,因为这些平台可以专注于某项具体技能的提高。

我对分析数据以找到解决方案很感兴趣,并且一直在寻找高质量的数据集来探索。我发现 BigQuery 提供的公共数据集很有帮助。我会推荐使用平台体验整个过程,从数据到结论。无论您是在寻找一个项目来练习您的 SQL 技能,好奇云计算是如何工作的,还是仅仅对解决问题感兴趣,这都是一个很好的起点。

**免责声明:**这是用 BigQuery 完成对数据的洞察后的一篇综述。如果你需要更多的细节,请随时参考我的问题。

保持联系

  • 在 Medium 上关注我,了解更多类似的故事
  • 在 LinkedIn 上连接

技术如何影响数据建模

原文:https://towardsdatascience.com/how-technology-is-impacting-data-modelling-fe3a7f697e7c?source=collection_archive---------15-----------------------

行业笔记

数据建模已经存在了 40 多年。对于不同类型的用户和系统应该如何对数据进行建模,有一些既定的方法。但毫无疑问,技术在 40 年里发生了巨大的变化,过去 5-10 年在数据领域尤为重要。这些方法今天仍然适用吗?

截图来自 Codd 的论文

多了解一点历史

【E. F. Codd 博士在 1970 年 6 月发表了论文,“大型共享数据库的数据关系模型”。Codd 的模型现在被接受为关系数据库管理系统(RDBMS)的最终模型。结构化英语查询语言(SEQUEL)是由 IBM 公司开发的,使用 Codd 的模型。SEQUEL 后来变成了 SQL。1979 年,Relational Software,Inc .(现在的 Oracle)推出了第一个商用 SQL 实现。今天,SQL 被接受为标准的 RDBMS 语言。

如你所料,在那之后发生了一些事情。

在 20 世纪 90 年代,出版了两本关于数据仓库的主要书籍——一本由比尔·恩门于 1992 年出版,另一本由拉尔夫·金博尔于 1996 年出版。在数据仓库建模中,它们成为建模存储数据的层的两个众所周知的竞争选项。要么你根据 Ralph Kimball 的模型,用事实表和符合的维度(作为星形模式),要么你根据比尔·恩门的模型,用数据库标准化。

2000 年, Dan Linstedt 发布了数据保险库建模,作为 Inmon 和 Kimball 的替代方案,为来自多个操作系统的数据提供长期历史存储,重点是跟踪、审计和对源数据模型变化的弹性。data vault 模型实际上提供了一个“基于图形”的模型,其中包含关系数据库世界中的中心和关系。

在 2010 年代,Apache Hadoop 和围绕它的生态系统被开发出来并流行起来。这些技术与关系数据库非常不同,尽管其中一些允许使用 SQL 查询数据。读取模式允许按原样加载数据供以后查询——因此不需要前期数据建模。当处理数据以备后用时,方法是将所有内容“连接在一起”成一个大范围的非规范化文件。数据存储不再是问题,但是“数据连接”在计算上非常昂贵。

现在是 2021 年,一种新型的数据技术正在不断被采用,特别是采用 MPP(大规模并行处理)架构的云原生列数据仓库,如雪花、亚马逊红移或谷歌大查询。

使用 20 世纪 90 年代的方法对数据建模有意义吗?现在,新的数据或分析工程师应该花时间学习它们吗?

数据仓库 vs 传统 vs 消除垃圾

我最近看到了一个视频,视频中一组数据专家讨论了这些问题。

https://www.greatdataminds.com/insights/data-vault-vs-traditional-vs-flatten-that-crap-out/

这是一个漫长而有趣的讨论,如果你选择不看,这里是我的总结。

最终,没有单一的答案—不同的使用案例和工作负载需要不同的方法。传统方法之所以被称为传统方法是有原因的——它们经过了时间的考验,而且行之有效。有时,在单一架构中有一个空间可以容纳所有这些方法。

任何解决方案都应该是专门构建的,以下是一些常用的选项(只是一些示例):

  • 即席分析—星型模式(Kimball)
  • 数据科学—平面表
  • 具有跟踪和审计需求的企业数据仓库—Data vault
  • 操作数据库— 第三范式(3NF)

现代数据堆栈提供的强大功能可以克服许多设计缺陷,即使没有最佳的建模选择,查询也可以执行得很好。然而,除了查询速度之外,还有维护成本,或者所谓的技术债务,如果使用次优技术,这个成本可能会高得不必要。

事实上,当我们谈论速度时,我们应该考虑几个不同的因素:

  • 查询的速度或性能
  • 交货速度
  • 变化的速度(换句话说,敏捷性,或者我们对数据模型中需求变化的响应速度)

利用云弹性的现代数据工具,结合良好的开发实践,如自动化数据质量测试和 CI/CD(我在这里写了和),允许我们在开发过程中更加敏捷,并在需求出现时进行迭代。当交付和变更的速度很快时,您可以从简单开始,首先专注于交付业务价值,然后不断改进。或者,一些数据模型被设计为对变化具有弹性(data vault),这在某些场景中可能是更好的方法。

另一个重要的考虑因素是数据管理。当我们查看数据时,我们需要知道它是什么,它来自哪里,以及它是如何组合在一起的。好的数据模型对此有所帮助,但是帮助跟踪数据血统、数据质量、数据字典等的工具也是如此。如果数据的建模和文档记录都很糟糕,那么很容易以巨大的数据混乱而告终。

最后的想法

我是一名数据工程师,我的典型用例是即席分析、BI 和数据科学。我喜欢将我处理的数据视为事实和维度(即使它是平面的),并且更喜欢在有意义的时候以类似 Kimball 的风格对数据建模。我发现星型模式很容易理解,商业用户通常也喜欢它。这些天来,我总是以这种方式对数据进行物理建模吗?号码

如果需求允许,数据模型可以是“逻辑的”而不是物理的,并且可以随着需求的改变而改变。在某些情况下,可以完全跳过前期建模,或者根据需要尽量少建模。*我必须在这里强调,当交付速度和变化速度很快的时候,当数据管理到位的时候,它是有效的。*当然,假设数据仓库中的原始数据是以原始形式存在的,因此最终模型总是可以重建的,这是当今不关心数据存储的常见做法,通常称为 ELT(提取—加载—转换)。

例如,在过去,当我在 MS SQL Server 中为我的数十亿行事实表添加列和选择数据类型时,我必须非常小心,因为当选择 int 而不是 bigint 时,每条记录节省 4 个字节意味着总共节省 10-20gb,这对于 10 年前的中档本地服务器来说意义重大。如今,我可以将 json 日志直接保存到 blob 存储中,通过 schema-on-read 在 Snowflake 的 SQL 视图中直接读取它们,然后在其上构建一个仪表板——所有这一切都在几天内完成,无需预先考虑模式或数据类型。然后,在几天内,当它变得有价值时,它可以被重新设计成具有引用完整性的星型模式。

答案是什么?

那么,使用 20 世纪 90 年代的方法对数据建模有意义吗?

您不必对 Kimball 的方法或这里提到的任何其他方法持教条主义态度,但是了解经典的设计模式和常见的陷阱通常是有帮助的,特别是当您试图解决一些棘手的设计挑战而没有明显的答案时。数据建模已经有 40 多年的历史了——所以这个棘手的问题很可能已经有了答案。

我在哪里可以了解更多信息?

如果你今天想读 Kimball 的“数据仓库工具包”,我强烈推荐这篇文章(以及其他关于 holistics.io 的数据建模资源),它解释了哪些章节仍然相关,哪些章节你可以安全地跳过。

https://www.holistics.io/blog/how-to-read-data-warehouse-toolkit/

我没有使用 data vault 的实践经验(它似乎更适合企业数据集成),但如果你想了解更多,我发现这篇评论很有趣。

TechStyle 如何使用敏捷 Sprints 部署现代数据平台

原文:https://towardsdatascience.com/how-techstyle-used-agile-sprints-to-roll-out-a-modern-data-platform-c0fc92cc397c?source=collection_archive---------21-----------------------

行业笔记

TechStyle 由 50 名成员组成的分析团队通过 Snowflake、Atlan 和 Tableau 尝试并测试了部落知识民主化的方法

Fabletics,TechStyle 旗下品牌之一。(图片由 TechStyle 提供。)

推出新的数据平台绝非易事。尽管有遗留的后台,几乎全新的团队,以及突然转向在家工作,但还是要这样做…这是一个巨大的挑战。但这正是 TechStyle 在 2020 年初开始做的事情。

TechStyle 时尚集团 成立于 2010 年,是一家拥有五个品牌组合的时尚零售商——Fabletics、Savage X Fenty、JustFab、FabKids 和 ShoeDazzle。通过将数据科学和个性化与会员模式相结合,该公司已经发展成为世界上最大的会员制时尚公司之一(拥有 550 万会员,年收入超过 7.5 亿美元)。

TechStyle 围绕在其运营中嵌入数据建立了自己的商业模式。想想它网站上的个性化客户体验,植根于预测分析的数字供应链,以及运行在物联网设备上的仓库。

为了处理这些数据,TechStyle 使用了一种“轴辐式分析模型”。TechStyle 的每个品牌都有自己的嵌入式分析团队。然而,每个团队创造自己的技术是没有意义的,所以这就是数据平台团队的用武之地。它的作用是通过创建和管理通用数据系统来支持每个职能分析团队。它运行公司的核心数据平台以及数据工程、集成、架构和治理。

2020 年 3 月,TechStyle 开始着手改革这些通用系统并推出新的数据仓库,由 Danielle Boeglin (数据&分析副总裁)和 Rachana Mukherjee (数据平台团队的数据分析总监)带头。在这个过程中,Danielle 和 Rachana 需要解决一个困扰公司多年的问题——让每个人都可以发现和理解数据,而不仅仅是长期团队成员。

作为 TechStyle 在该计划中使用的统一数据工作空间 Atlan 的联合创始人,我近距离目睹了他们新数据仓库的发展。从头开始设置文档和元数据可能会很困难,所以我认为与其他希望建立更好的数据系统的现代数据团队分享他们的过程是有价值的。

通过与 Danielle 和 Rachana 的一系列对话,我撰写了这篇文章,深入了解 TechStyle 如何构建其现代数据仓库和数据分析团队的幕后过程。它还解释了他们通过敏捷 sprints 记录多年部落知识的过程,以及民主化部落知识和支持数据管理的重要性。

为整个公司的可访问数据奠定基础

2020 年初,TechStyle 决定将其系统迁移到雪花数据仓库。尽管这是一项重大工程,但这个项目给了公司一个重新定位和规划未来的机会。

TechStyle 已经倾向于传统的 EDW 设计。但是对 Rachana 来说,毫无疑问,新的雪花系统应该避免传统的数据仓库模式。

“传统的数据仓库非常昂贵和耗时。它确实延长了洞察的时间。因此,当您交付洞察力时,对业务来说可能已经太晚了。我们需要适应。”

–Rachana Mukherjee,TechStyle

然而,选择一条更好的前进道路是一个更难的问题。“现在事情进展得太快了……”她说。“我认为,对于很多处于我们这种位置的人来说,很难说,‘好吧,这是我们应该做的事情’,因为现在市场上没有任何指导。我们只能靠自己的设备。”

相反,TechStyle 选择了 ELT 风格的数据工程,他们从数据源加载数据。一旦加载了原始数据,TechStyle 就使用一种混合方法来建模任何需要建模的东西,并愉快地保持其余部分不变。

Rachana 说:“你不必总是为数据建模。例如,对将来将被重用的对象(如历史表)进行建模、处理,然后存储起来以备不时之需。但是对于有很多未知的领域,没有必要经历过早建模的麻烦。

数据到知识的差距

从这个项目一开始,TechStyle 就知道数据的可发现性是重中之重。

“不幸的是,知识上存在着巨大的差距,”Rachana 说。“我们正在招聘分析师,但他们效率不高,因为他们不理解数据。“Danielle 补充道,“有了我们的软件和代码,我们在 Git 中的工作流程让这一切变得非常简单。我们真的需要一个对等的数据。”

数据平台团队从公司内部的上游系统获取数据,例如他们自己开发的仓储和电子商务系统。这些系统已经有十多年的历史了,所以它们有着以某种方式管理和使用的悠久历史。

然而,这些系统的文档通常是有限的或不存在的。Danielle 说:“以前,我们的数据文档只记录表中的列。"文档与我们的日常工作流程脱节。"

不属于 TechStyle 中央数据团队的数据源的增长加剧了这一问题。随着公司将技术资源直接扩展和嵌入到每个品牌团队中,团队开始创建自己的数据源。虽然这些是由单个品牌团队管理的,但它们经常在整个组织中使用。Danielle 说:“这导致了谁拥有和认证数据的混乱和复杂性。

这个文件问题在 2020 年初达到了顶点。当时,数据平台团队中有两个人已经在 TechStyle 工作了很长时间,每人都超过了 7 年。但是团队中的其他人,包括 Rachana,都是新手。通常,新的团队成员会逐渐加入到办公室的这些遗留系统中。但是在 2020 年 3 月,因为新冠肺炎,每个人都开始远程工作。

突然之间,在办公室中正常工作的非正式信息流停止了,两位老成员成为了向新成员传递知识的瓶颈。拉查纳说:“有点令人沮丧。"我们想加快步伐,但我们做不到,因为我们在这里的时间还不长……简而言之,这并不理想。

结果,数据文档从一开始就成了 TechStyle 新数据仓库的重点。从头开始记录他们的整个数据系统将是一项艰巨的任务,但是花费时间和精力是值得的。

“这基本上是由对敏捷性的需求驱动的。敏捷被打破了。人们在公司变得有效率需要更长的时间,因为所有这些部落知识在任何地方都不存在。”

–Rachana Mukherjee,TechStyle

实施 Atlan 以实现更好的数据记录和可见性

作为数据和分析副总裁,Danielle 亲自参与为 TechStyle 选择合适的工具。

她说:“我们一直在寻找一种产品,这种产品能让我们的数据更容易民主化,并且不太依赖于某个人一次性回答每个分析师的问题”。“我们在市场上探索的许多数据目录都是针对 IT 或单个数据管理团队拥有数据的传统系统和方法定制的。我们选择 Atlan 是因为它与我们的现代分析堆栈(如雪花和 Tableau)相集成,并为采购文档创造了协作体验。”

在决定继续推进 Atlan 后,数据平台团队迅速将其与 TechStyle 的新现代数据堆栈整合在一起— 雪花、 Tableau 、阿帕奇气流和 Git 。

“我们所有的数据源在第一天就开始流动。用户界面使我们能够快速轻松地上手,并允许我们在整个组织内协作获取数据文档。”

丹尼尔·伯林,技术风格

接下来是困难的部分——组织和记录他们的数据资产。是时候让 TechStyle 开始构建一个知识管理流程,作为新数据仓库展示的一部分了。

Rachana 没有自上而下地创建这个新文档,而是与数据平台团队的其他成员有机地协作展开。Rachana 说:“这是一个既有规范性又让团队来推动的混合体。

Atlan 的元数据词汇表,帮助用户记录和理解数据资产。(图片由 Atlan 提供。)

通过敏捷、迭代的实验创建可复制的文档过程

对于优秀的文档来说,最大的挑战是创建易于整个团队采用的标准。

TechStyle 团队明智地处理了这个问题。他们没有从一个漫长的、自上而下的战略过程开始,而是选择了一个用例作为他们在 Atlan 上的初始原型。然后,他们利用学到的知识快速创建和验证新的全公司文档标准。

这是 TechStyle 用来从头开始构建他们的文档的过程:

  1. 选择一个 MVP :为一个用例,EDW,推出一个数据治理和文档工具(Atlan)。
  2. 测试几个案例:选择几个简单的表格,让团队成员记录下来。
  3. 从结果中学习:比较并从最初的结果中学习,以创建通用的文档标准。
  4. Sprint 和 refine :执行一系列 Sprint,继续为 EDW 中的其他表和列构建新的文档,同时完善文档标准。

从 MVP 开始寻找模式并创建指导方针

数据平台团队知道 TechStyle 的 EDW 主数据库中有 718 列,每一列都需要对其含义和/或来源进行清楚的解释。Rachana 从如何记录这些列开始。

他们的第一步是将挑战分解成更小的部分,而不是试图一次解决所有的问题。首先,该团队解决了几个简单的例子。他们列出了所有表格的清单,确定了容易摘到的果子,然后通过指派最有背景的分析师来记录每个表格中的列,进行了划分和征服。

tech style 元数据文档的一个例子。(图片由 TechStyle 提供。)

接下来,他们作为一个团队回到一起,比较他们的结果,并为未来的文档创建指导方针。“有些很简单……我最初确实看到数据中有许多自然模式,”拉查纳说。

在 TechStyle 创建数据文档标准

团队最终决定了数据文档的基本卫生标准。例如,以下是他们的一些基本规则:

  • 所有文档都应该语法正确。
  • 列描述的第一个字母应该始终大写。
  • 结尾不应该有句号。

该团队还解决了特定问题类型的规则。例如,他们决定布尔需要一个前缀“is”(例如“is_live”)和一个标准描述(“1 =真/ 0 =假”)。

tech style 的一些文档规则。(图片由 TechStyle 提供。)

他们还能够为数据中明确的列创建规则。例如,团队中的每个人都知道“Address_Key”和“Address_ID”列是什么意思。(键是他们在数据仓库中分配或创建的人工键,而 ID 是上游源系统中自然存在的字段。)所以他们决定如何同样地记录任何地址键或 ID 列,不管数据源或写它的人是谁。

随着他们处理更多的表和出现更多的模式,团队能够自信地创建指导方针并提前做出决策。

“我们选择最好的东西,然后做出决定。我们没有在真空中做决定。”

–Rachana Mukherjee,TechStyle

使用敏捷 sprints 围绕数据文档建立一种文化

使这个迭代过程成为可能的一件事是使用敏捷 sprints 来快速实验、记录和推进学习。

Rachana 一加入 TechStyle,就将数据平台团队纳入了敏捷团队。“我们正在做的所有工作都是在这两周的冲刺阶段预先计划好的,”她说。“我们有一个 Scrum 流程,在这个流程中,你可以看到团队正在做的所有工作。”

数据平台团队的冲刺板。(图片由 TechStyle 提供。)

为了让文档成为日常工作的一部分,团队在每个 sprint 中都添加了文档任务。例如,每个 sprint 将包含一个需要记录的新表或列的列表。

这些冲刺还包括对新文档的质量检查。为了确保团队遵守他们制定的规则,有一个批准过程。团队指定了一名审批人来审核新的意见并将其推送到 Atlan。

TechStyle 的数据平台前景如何?

TechStyle 已经超越了这个新数据仓库的推出,展望了公司内部数据的未来。

"数据科学是一个巨大的时髦词,人们经常谈论数据科学。但是几乎没有人支持数据管理方面,”Rachana 说。“我认为数据平台在未来会变得更具战略性。我希望变得更具战略性,与企业合作并创造价值,而不仅仅是维护和管理数据。”

在 TechStyle 内部,数据平台团队扮演着关键角色,他们是幕后专家,帮助每个人更好地利用数据进行合作。

他们非常清楚,数据协作是一个主要的痛点。但是,有了合适的平台和优秀的文档,这是一个宝贵的机会来创建一个共享的工作空间,在这里,不同团队或品牌的数据和业务可以无缝地合作,以解决任何业务问题。

非常感谢 TechStyle、Danielle Boeglin 和 Rachana Mukherjee 为本文提供时间和支持!❤️

觉得这个内容有帮助?在我的时事通讯《元数据周刊》上,我每周都写关于活动元数据、数据操作、数据文化和我们的学习建设的文章。 在此订阅。

TF-IDF 的工作方式和原因

原文:https://towardsdatascience.com/how-tf-idf-works-3dbf35e568f0?source=collection_archive---------10-----------------------

简要介绍 TF-IDF 如何定义术语重要性。

在 Unsplash 上由 Waldemar Brandt 拍照

您希望用数字来表示一个单词在一组文档中的重要性。也许你想根据刚刚写的几篇文章使用这种表示来总结当前事件,或者你想对 Yelp 评论进行情感分类。经过一些谷歌搜索,你已经找到了 TF-IDF,及其数学定义。它是如何工作的,为什么工作?

数学定义

图片作者。TF-IDF 的数学定义

  • t=学期
  • d=文档
  • D=套单据

TF-IDF 通过考虑某个术语在单个文档中的重要性来定义该术语的重要性,并通过其在所有文档中的重要性来对其进行缩放。

文档中术语的重要性(词频):tf(t,d)

术语频率回答了这样的问题,*在所有单词在本文档中出现的次数中,该单词在本文档中出现了多少次?*换句话说,这个词对这个特定的文档有多重要?

图片作者。术语频率的数学定义

给定一个只包含句子的文档:

猫在盒子里。

你会说‘房子’这个词在文档中出现的 6 个单词中出现了 0 次,或者说TF(‘房子’,文档 1)=0/6=0

同样,在包含一个句子的不同文档中:

是的,猫在房子里的盒子里。

单词“house”在文档中出现的所有 11 个单词中出现 1 次,即 tf('house ',document2)=1/11。

一个术语在所有文档中的重要性(逆文档频率):idf(t,D)

逆文档频率回答了这个问题,这个单词在我所有的文档中有多常见(或不常见)?

图片作者。逆文档频率的数学定义

此时,我们有两个文档。单词“house”的逆文档频率由IDF(‘house’,D)=log(2/1) 表示,因为它出现在我们的集合中的 2 个文档中的 1 个中。

类似地,单词‘the’的逆文档频率由IDF(‘the’,D)=log(2/2) 表示。您可能会有以下问题:

对于 IDF,我们为什么要取逆?为什么我们使用对数标度?为什么要乘以 TF?

由*(总文档数)/(包含该单词的文档数)*创建的比率被反转,以给在所有文档中不太常见的单词更高的值。例如,在上面的例子中,“house”在所有两个文档中更不常见,因为它出现在一个文档中而不出现在另一个文档中,因此值为 2/1 或 2(而不是 1/2)。单词“The”在所有两个文档中更常见,因为它出现在所有文档中,因此值为 2/2 或 1。如果这些值没有反转,“the”将被视为“更重要”,因为它将具有更高的值(1 > 1/2)。这就是 IDF 对整个计算很重要的原因,因为它通过给它一个较低的 IDF 值来“照顾”英语中自然出现的单词,如“the”。我稍后会补充“小心”的其他含义。

将这些值输入对数标度,使其与频率项处于“同一标度”上:

图片作者。对于每个术语:术语在文档中的频率,未应用对数标度的 IDF,应用对数标度的 IDF

如果 IDF 不是对数标度,高 IDF 将对 TF-IDF 值产生天文效应。假设一个术语的 IDF 为 2,另一个术语的 IDF 为 4。现在,想象一下同样的条件,但是它们现在分别有 2000 万和 4000 万的 IDF。他们得出的 TF-IDF 值将非常不同。具有较高 IDF 的术语肯定会压倒其他术语。另一个术语可能根本不被认为是重要的。使用对数标度,IDF 值的影响是“平滑的”:

图片作者。算术标度(上)与对数标度(下)

这样,TF-IDF 值就处于一个更加平等的竞争环境中。

回到较低的 IDF 值如何“照顾”英语中自然出现的单词。IDF 为 1 意味着一个术语出现在我们集合中的每一个 文档中,因为*# documents in our collection = # documents 该术语出现在*。这可能发生在像“the”这样的术语中。在 log(1)=0 的情况下,该术语被赋予零值,因此通过将其作为术语重要性的候选项移除而得到“照顾”。

TF-IDF 是一种用于为 NLP 任务加权术语的流行方法,因为它根据术语在文档中的重要性为术语赋值,并根据其在语料库中所有文档中的重要性进行缩放,这在数学上消除了英语中自然出现的单词,并选择了更能描述文本的单词。因此,诸如文本摘要、信息检索和情感分类之类的 NLP 任务是利用 TF-IDF 的强大加权操作的一些任务。既然你已经理解了它是如何工作的,为什么要工作,那就试试这些任务吧!

云将如何帮助(或不帮助)您的业务

原文:https://towardsdatascience.com/how-the-cloud-will-help-or-not-your-business-42b72f4e51b3?source=collection_archive---------48-----------------------

了解云的主要优势和劣势

由 Unsplash 上的 Pero Kalimero 拍摄的照片

在本文中,我们将稍微改变一下上下文。在上一篇文章中,我们讨论了数据管理、数据质量的重要性以及业务分析。这一次,我非常兴奋地向大家宣布,在接下来的几周内,我们将探索一个当前的趋势,这个趋势将影响我们所处的十年中的所有公司:云。我知道云这个主题非常广泛,因为它有很多概念,所以我们将重点关注云中的数据。

我想到现在为止,我们都已经听说过云及其功能,但是,您知道它的所有好处和影响吗?在这第一篇文章中,我想和你一起探索云的基本概念,并在接下来的几周里,陪你一起探索如何利用云资源找到相关的见解。

首先,我想让你明白为什么这个帖子是给你的。所以,如果你是…

👤个人,无论你是从事商业还是科技,你都需要理解这些概念,以及云是如何改变游戏规则的。

🏢一个公司,你必须有云战略。我们不是说明天就将您的工作负载 100%迁移到云,但是您应该有未来几年的路线图。

什么是云计算?

至此,我想定义一下什么是云计算。自 2017 年以来,社交网络上发布了无限量的声明,称:

云计算只是别人的电脑。

这种错误的想法已经在互联网上传播开来。我必须承认,几年前我的笔记本电脑上有一张贴纸,上面写着这句口号。但事实是如果你这么说,你就没有很好地理解什么是云计算。诚然,简化到最低限度,云计算就是从其他人那里租用计算能力来满足你的需求,这种想法带来了无限的可能性,对公司的所有组织层面都有影响。

先说优点

🌍规模经济

众所周知,今天一切都是大规模进行的,尤其是当我们谈论数据世界的时候。因此,当我们大规模地做事时,我们必须能够以更低的成本和更高的效率运作。云利用了规模经济,允许我们的业务增长,并在增长的同时获得更多利润。

💸现收现付

云计算的另一个优势是影响财务水平,因为它改变了支出模式。您应该很好地理解这些支出模型,以了解为什么它是云的优势。

  • 资本支出(CapEx):它们包括对固定资产的投资,然后随着时间的推移从你的税单中扣除这笔费用。属于这一类别的资产示例可能是建筑物、设备,或者更具体地说,当您购买服务器或数据中心(内部)时。
  • 运营支出 (OpEx):可以理解为业务运营所必需的费用。你可以从同年的税单中扣除这笔费用。没有前期费用,你为你所使用的付费。

运营费用启用现收现付定价模式,让您的公司降低成本并获得灵活性。

⏰缩短上市时间

由于有了云,新产品的上市时间或现有产品的增长都缩短了。

如果你的公司,无论规模大小,想要尝试一种新产品,有了云,你将能够更加灵活地完成,因为它允许你以更快、更精确的方式分配资源。

另一方面,如果你已经有一个产品在运行,并想让它在其他国家发展,云将让你更有效地做到这一点。

📈可扩展性、弹性和可靠性

云的另一个优势与现收现付模式密切相关。在这种情况下,我们谈论的是可伸缩性和弹性,这允许您的业务不断适应需求。这有两个方面:一方面,它防止您在浪费基础架构时产生额外的成本,另一方面,它允许您的业务随着需求的增长而增长,从而保证服务质量。

此外,云允许您通过灾难恢复策略、数据复制或备份来提高技术的可靠性。

🔍专注于业务

借助云提供商的共同责任模式,您可以从某些责任中解脱出来,将更多精力放在业务发展上。有不同的云模型,我们将在下面看到,但我预计根据您选择的模型,责任的分配会有所不同。

不是无忧无虑的问题。使用技术总是伴随着巨大的责任,许多方面必须始终牢记在心,尤其是当我们谈论数据时。然而,在任何云模型中,总会有一方委托给提供商,这将使您或多或少地从业务中重复出现的高成本任务中解脱出来。

🔐安全性

我认为安全性应该总是有一个单独的部分。与规模经济密切相关,安全解决方案在大规模部署时更便宜,云利用了这一点。安全性是当今的一个关键因素,是许多像您这样的客户的一个独特优势。这种需求使得云提供商特别关注安全性。

最后,与共享责任模式相关的是,根据实施的解决方案,云提供商通常会承担某些维护责任,例如安装更新、应用安全补丁或在基础架构级别实施安全,因此您不必担心这些任务。

但是为什么没有人谈论风险呢?

凡事都有两面性。我们已经讨论了这些优势,我相信很多人,如果不是所有人,都已经知道了。我希望在这一点上,无论您是小型、中型还是大型公司,您都已经认识到云为您提供了巨大的机会。

为什么很少有人谈论风险?没有完美的解决方案,所以我认为知道好处和谈论风险一样重要。当你有了所有的信息,你就可以用一个比只看零件更客观的标准来做决定。

🧲提供商依赖性

当您使用任何技术时,都会在您的业务和该技术之间建立一个链接。这就产生了一种依赖关系,这种依赖关系可能更高或更低,取决于技术和 it 在您的业务中的功能。这种依赖性给了云提供商更大的议价能力,因为转换成本增加了,而这在以前是不存在的。例如,如果我们在云中使用会计软件或 CRM,转换成本非常高,因为它们在您的业务中执行非常核心的功能。

基础设施也是如此,如果您的所有技术基础设施都依赖于特定的云提供商,那么该提供商将获得更大的控制权。例如,如果云提供商决定改变价格,并且您的所有基础架构都由该提供商托管,您有两个选择:要么接受这些改变,要么承担基础架构迁移的成本。

🛠并非所有的服务在任何地方都可用

并非所有的云提供商都提供相同的服务,来自一个提供商的相同服务也并非在全球范围内都可用。您可能需要使用某个提供商在您感兴趣的地理区域提供的服务。现在,如果您需要扩展到其他地理区域,该服务可能不可用,您的行动能力将受到限制。

另一方面,与前一点相关,您使用某个提供商的特定服务并不意味着当您需要更换提供商时,您可以这样做,因为并非所有提供商都有相同的服务目录。

正如您所看到的,云为您的企业带来了巨大的潜力,因为它使您能够获得灵活性、缩短上市时间并优化成本,而对于内部解决方案来说,这要困难得多。然而,除了优点之外,你必须时刻记住主要的缺点,因为以前不存在的依赖性和变更成本很可能会出现。

在这个关于云中数据系列的第一篇文章中,我们介绍了什么是云计算以及它的主要优点和缺点。在接下来的几周里,我们将深入探讨这个主题,讨论可以实施的不同云类型和解决方案,但始终关注数据。

感谢阅读!🤗

数据科学市场如何发展

原文:https://towardsdatascience.com/how-the-data-science-market-is-evolving-99ce9bbf3c59?source=collection_archive---------23-----------------------

公司正在回归基础

来源:来自 Pixabay 的免费照片

我记得有一次我和一个新客户的对话。

我刚刚加入了一个新的数据科学项目,客户问我的背景。

他特别问我的一个问题是,“你认为自己更像一个统计学家还是一个程序员?”。

我花了一点时间思考这个问题,然后回答:“统计学家。我的背景是经济学和计量经济学,在最初使用 SPSS 和 STATA 等统计软件包后,我随后转而使用 R 和 Python 进行分析,R 是我的第一语言。”

他的回应?

“哦,太棒了。我发誓——如果我再看到一篇这样的机器学习文章……”

我强烈怀疑持这种观点的不止他一个人。

数据科学是一个非常宽泛的术语,坦率地说,它正被过度使用。虽然数据科学本身的许多方面并不新鲜,但迄今为止,围绕机器学习一直有一种特殊的热潮。

除了新奇因素,机器学习的部分吸引力在于自动化的潜力。与必须在深层次上理解统计概念相反,机器学习模型可以以黑盒的方式使用,通过这种方式,数据被简单地输入到模型中,正确的见解和预测就会以某种方式神奇地产生。

然而,事实证明并非如此,越来越多的公司开始认识到这一点。

公司在寻找什么?

有时候,在查看数据科学家的职位描述时,我会在电子表格中记下公司希望精通的特定语言。

对于我在 2019 年记录的一些角色,下面是公司似乎在寻找的技能的细分——百分比表明了公司寻找这种技能的比例:

来源:作者的计算

以下是 2021 年不同角色的调查结果。

来源:作者的计算

不出所料,排名前三的语言仍然是 PythonRSQL 。然而,与 2019 年相比,有一些有趣的变化。

  • 虽然 2019 年有 33%的角色在需求技能中宣传 TensorFlow,但 2021 年只有不到 6%的角色这样做。
  • 同样,2019 年对 Spark 的需求为 38%,而 2021 年已降至 11%。
  • 有趣的是,对 R 的需求从 2019 年的 41%大幅增长到 2021 年的 72%。

请注意,在进行这项分析时,我在 2019 年选择了一系列主要求职网站(例如 LinkedIn)的 20 个角色,在 2021 年选择了另外 20 个角色。

因此,上述分析绝非详尽无遗,每个公司都有自己的要求。例如,如果一家公司正在招聘图像识别或 NLP 技能人员,那么对 TensorFlow 技能的需求可能会高得多。

此外,作为一名统计学家,我承认任何人工选择的样本都可能存在选择偏差!然而,总的趋势似乎是更少关注机器学习,而更多关注理解统计数据并从中获得有用的见解。

林迪效应

虽然预测未来可能是一件徒劳的事情,但一个有用的启发可能会让我们这样做,那就是所谓的林迪效应。从本质上来说,林迪效应表明技术和其他非人类实体会反向老化。

例如,如果一项技术已经存在了五年,我们可以预期它还会存在五年。然而,如果一项技术已经存在了 20 年,我们可以预期它还会存在 20 年。这都是关于什么能经受住时间的考验——一些已经存在多年的东西可能会继续存在下去。

我们举一个 R 对 TensorFlow 的例子。哪一个更有可能在 2050 年出现?

虽然 R 经常被认为不如其他编程语言(严格来说,它不是编程语言),但事实是 R 自 1993 年以来一直在使用,而 TensorFlow 自 2015 年以来一直存在。如果让我打赌三十年后人们会用什么,我会选择前者。

就此而言,Python 最初发布于 1991 年,而 SQL 则可以追溯到 1974 年。世界继续在数据库上运行——在这个领域,没有任何语言能够取代 SQL。

还有一个鲜为人知的事实是,SQL 本身也可以用于分析——SQL 数据库不仅仅是为了将数据导入 Python 或 r 而存在的。事实上,在 SQL 中进行简单的分析(例如简单的回归)是一种确定结果是否有意义和值得进一步分析的好方法。人们经常浪费宝贵的时间和资源,用 Python 和 R 进行更深入的分析,却发现结果是虚假的。

沟通是关键

公司雇佣数据科学家的一个主要原因是理解数据。所谓有意义,我们是指能够清晰地传达与数据相关的发现。

当我们开始从事数据科学时,我们经常会犯错误——就像我自己一样——把错误的事情放在优先位置。

例如,初学者的思维方式通常是获取一组数据,并试图建立一个能够产生最高预测准确性的模型。

抛开这种准确性是否确实可靠的问题不谈——这种做法实际上给公司带来了什么价值

例如,假设您构建了一个模型,该模型能够高度准确地预测汽车租赁公司的销售额。你能解释一下为什么这款车型表现如此之好吗?那家汽车租赁公司销售的最大驱动因素是什么?根据你分析的信息,公司可以采取哪些步骤来进一步增加销售额?

如果不能回答这些问题,那么获得高精度的指标是没有意义的。即使没有数据分析,行业专家仍然会对这个特定行业的季节性销售波动有很好的了解。

释放数据科学价值的关键是能够将模型的发现转化为可操作的见解。计算机可以在自动化模型计算中取代人类——但它们永远无法取代人类创造性思维和逻辑分析信息的能力。

结论

在“数据科学”这个术语出现之前,统计能力、解决问题的能力和领域知识等技能早已存在。很久以后它们还会存在。

企业开始认识到这一点,并越来越重视聘用数据科学家,他们不仅能理解统计和编程元素,还能创造性地思考,并以有意义的方式利用模型洞察力。

从个人的角度来看,这意味着我将继续扩展我在统计和概率等领域的知识——特别强调在打开代码编辑器之前确保我理解每种方法背后的理论。

其次,在决定使用一个模型之前,我会更严格地评估它。虽然我在技术上可以使用 XGBoost 进行时间序列预测,但是这些数据适合这样的预测吗?ARIMA 模式会做得更好吗?

在我们的核心,数据科学家基本上是问题解决者。比起成为一名优秀的程序员,公司更看重这种技能,并相应地调整他们的招聘方式。

免责声明:本文是在“原样”的基础上编写的,没有任何担保。它旨在提供数据科学概念的概述,不应被解释为专业建议。本文中的发现和解释是作者的发现和解释,不被本文中提到的任何第三方认可或隶属于任何第三方。作者与本文提及的任何第三方无任何关系。

数据科学家的角色将如何演变

原文:https://towardsdatascience.com/how-the-data-scientist-role-could-evolve-36a6ef5c24fd?source=collection_archive---------30-----------------------

面对不断变化的技术,数据科学家能学到什么

照片由布伦丹·丘奇在 Unsplash 上拍摄

什么威胁着数据科学家的工作?

随着计算机越来越快,数据科学工具越来越好,数据科学家的工作将不再专注于优化传统的 ML 模型(非神经网络模型)。许多公司都在追求能够针对各种问题执行大量特征工程和模型优化的 AutoML 框架。所有主要的云提供商(和一群初创公司)都为计算机视觉提供现成的迁移学习模型,许多公司还为表格和 NLP 模型提供 AutoML 服务。在这些服务中,你可以上传你的数据,在你点击“训练”后,最好的模型就会被剔除。具有讽刺意味的是,应该创造 ML/AI 的数据科学家发现这些新工具正在自动化他们自己工作的一部分。

一个数据科学家除了 ML 还擅长什么?

作为一名数据科学家,我花了很多时间思考,如果有一天我的工作高度自动化,我可以做些什么。我的结论是,虽然有许多非 ML 数据科学任务,但我的核心技术能力——编写 ML 模型,解释它们,部署它们,监控和更新它们——可能需要多样化。那么,除了这些技能,我和大多数其他数据科学家还擅长什么呢?Python 和函数式编程。如果你不知道,函数式编程强调编写函数,而不是编写面向对象的代码。面向对象编程(OOP)的兴起是因为人们倾向于根据对象及其相互关系来思考。因为许多 OO 代码没有定义的执行顺序,所以关注对象的行为是最重要的。大量的时间花在设计软件上,人们已经把描述设计模式作为整个职业。另一方面,函数式编程旨在关注函数,在函数中,我们可以更清楚地看到作为输入结果的输出。我认为大多数数据科学家都认识到,当他们编写代码时,他们是在类定义之外进行的,并且通常旨在对输入进行一组一致的可验证操作。函数式程序的目标应该是达到数学函数的精度水平。f(x) = 4x + 3 和一段代码一样有效,因为它是一个数学函数。这个函数很容易验证,而 OO 代码可能会以难以重新创建和调试的状态结束。

我们的技能组合对什么有用?

我相信很多数据科学家认为自己不能因为懂 python 就成为软件工程师。要理解 OOP、软件设计、前端开发、应用的托管、扩展和部署,还有很多工作要做。也就是说,在无服务器的环境中,我认为数据科学家是编写代码的优秀候选人。无服务器代码在很大程度上依赖于云,并部署特定的功能以用作 API 或在其他操作时触发,这就是为什么它们经常被称为功能即服务(FaaS)。我(作为一名数据科学家)曾经写过这样的例子:在网上购物车中添加/删除商品,根据时间表从数据库中收集 KPI,在商店中指派一名工作人员将新送到商店的商品放好并添加到数据库中。由于其他系统非常复杂,许多初创企业和大型企业都在这个架构上运行。学习如何开发 OOP 并在后端运行它会有很多令人头痛的问题,解决 bug 也很困难。无服务器代码通常与业务逻辑联系非常紧密,更容易调试,部署和监控工作量也更少。考虑到 jupyter 笔记本运行的几乎是功能性的过程,数据科学家使用数据库的能力,以及对业务成果的关注,我认为它们是将来编写这样的代码的完美候选。

我们如何为这样的角色做准备?

大多数无服务器代码都是事件触发的。当有人对数据库进行写操作时,这将是触发您的无服务器代码的事件。这些事件经常与 NoSQL 数据库相关,所以我建议从 MongoDB 这样的流行数据库开始复习。

其次,我认为创建自己的功能来部署到云是一个很好的开始。如果你愿意,这个函数还可以包含 ML,但是我会从一个狭窄的用例开始。无论您选择什么样的云提供商,您的代码的整体软件架构都将非常相似,但是有些功能对于经理来说会比其他的稍微简单一些。以下是您将在主要云提供商上创建的内容:

  • IBM 公共云:云功能

对于 IBM Cloud 函数,您可以非常快速地编写和测试代码,如下所示。连接的触发器包括写入云对象存储、Cloudant 数据库、Kafka 事件流和自定义触发器(当特定 HTTP 端点收到 POST 时激活)。

创建新的 IBM 云功能

  • 谷歌云平台:云功能
  • AWS: Lambda
  • 微软 Azure:无服务器功能
  • Cloudflare: Cloudflare 工人

最后,我建议学习另一种语言。云功能成本由执行时间、消耗的数据量和使用次数决定。因为 python 是一种相对较慢的语言,使用 Go 或 C++等更快的语言可以节省成本。学习另一种语言的额外好处是,它可以帮助你学习如何优化你的母语。

邓宁-克鲁格效应如何解释为什么你的数据科学提议没有被接受

原文:https://towardsdatascience.com/how-the-dunning-kruger-effect-can-explain-why-your-data-science-proposals-dont-get-buy-in-f625ab37c94?source=collection_archive---------38-----------------------

考虑一下邓宁-克鲁格效应,让你的提议得到重视

许多出色的数据科学提案从未超出论文的范围

由蒂姆·高在 Unsplash 上拍摄的照片

简介

我想先给你画一幅画。

假设你是一名经验丰富的数据科学家。你在一家小公司工作,向领导公司并负责所有决策的董事团队汇报。只有得到他们认可的提议才能实施。

上个月,你一直在研究工作中效率低下的数据流程,现在你终于有了解决方案。它简单、优雅,实现起来不需要任何成本。您对自己的解决方案很有信心,但是您通过了其他数据科学家进行的一些必要的感觉检查。让你高兴的是,他们都在船上,现在你充满了信心。

你简直迫不及待地想把这个拿到导演面前;你写一篇论文,在下次委员会上提出来。你对你的新解决方案很满意,你觉得这应该是一个不需要动脑筋的问题,“他们肯定会同意吗?”—你心里想。

委员会日到了,你提交了你的论文,这个报告完美无缺,因为你认真排练了。完成后,你在脑海中回放演示文稿。你的一部分感觉房间里没有人真正理解这个问题或解决方案。你可以发誓你已经尽可能简单地把它表达出来了,但是你无法从你的想法中摆脱那些空白的脸、抓头和打哈欠。

会议结束时,你会收到一封来自你的一位主管的电子邮件,感谢你的工作。遗憾的是,他们已经决定不采用你的解决方案。你感到失望,并努力理解哪里出了问题。你觉得根本没人听你说话。

如果这曾经发生在你身上,你可能会发现自己在责怪办公室政治,甚至是你自己。但你有没有想过,这里可能起作用的是邓宁-克鲁格效应?

什么是邓宁-克鲁格效应?

邓宁-克鲁格效应是心理学家大卫·邓宁和贾斯汀·克鲁格创造的心理学观察。他们提出了经验/知识和自信之间的关系。

作者生成的图像

**愚笨山的高处:**这是一种极乐的无知状态。在这里,你站在世界之巅,过于自信。在数据科学术语中,你可能刚刚用一些玩具数据建立了你的第一个线性回归。你自信满满,相信几个月后你就能成为所在领域的顶尖数据科学家。

**下降到绝望的山谷:**在愚蠢山高高地骑了几个星期或几天之后,你开始有所领悟。当你试图用真实世界的数据建立你的第一个模型时,或者当你遇到你在 MOOC 中没有见过的问题时,它击中了你。你开始意识到你“知识”的局限性。这种感觉最初会爬上你的身体,但你会感觉到它越来越深。为了解决这个问题,你读更多的书,参加更多的课程,做更多的项目。令你绝望的是,这口井比你想象的要深。

这确实是很多人会放弃的地方。在绝望的山谷中,事情进展缓慢,动力不足,挫败感侵蚀着你。毕竟,你的自信心空前低落,因为你的自尊心受到了打击。

你终于发现你不知道自己有多无知。更糟糕的是,你还有很长的路要走。

**开悟之坡:**在黑暗中徘徊了漫长的时间后,你看到了一丝曙光。一个你努力去领会的想法变成了你的直觉。你现在已经有了几个项目,并且可以看到你遇到的大多数问题的解决方案。你不知道什么时候或者怎样,但是有一天事情开始变得明朗起来。你的坚持终于有了回报,你看着自己每天都在能力上成长。学习变得有趣和令人兴奋,你张开双臂欢迎它。

智慧:现在你真正胜任你的工作。你领域内的其他人认可你的专业知识,而你有工作组合来支持它。你可以从高层次看待问题,你的经验会引导你相对容易地找到最佳解决方案。

你不会吹嘘你已经获得的知识,并认识到总有新的东西要学。在这种新的自信水平下,你获得了开始时没有的东西——对过程和旅程的尊重。

邓宁-克鲁格效应在起作用

在开头概述的场景中,我让您想象自己是一名经验丰富的数据科学家。很可能你会处于智慧的一端,或者至少接近它。

作为专家,你经历了整个过程。你会遇到存在于邓宁-克鲁格曲线所有点上的领导者,你的工作是知道如何作为专家接近他们中的每一个。如果你想让别人听到你的声音并认真对待你的提议。

以下是我的建议:

不要接近愚蠢山山顶的领导者

你必须现实一点,愚蠢山上的人们高估了他们对某个领域的知识。你可能无法让他们相信他们是无知的。在这种情况下,我看到了三种现实的选择。

**方案一:**你可以耐心等待。

如果你和愿意学习的人打交道,最终他们会陷入绝望的深渊。在这里,他们可能更愿意认可你的专长,也许你可以和他们一起工作。

这种方法的缺点是,有些人很固执,不愿意学习,你会等这样的人很长时间。

选择 2: 只向这些类型的领导者提出你专业领域的基本问题。

他们可能足够了解这些问题,愿意倾听你的意见。你必须小心,这个问题实际上是初级的,尽管在商业中,问题往往更加复杂。

这里的缺点是,您可能会对只能在工作中实现基本解决方案感到愤怒。

我在工作中一次又一次地看到这种情况。这样做的人经常感觉他们的职业停滞不前,并发现他们缺乏有意义的项目。

**选择三:**止损换工作。

如果你的领导满足于呆在愚蠢的山上,那么你做的事情不会让他们明白。不要浪费你的时间和精力去说服那些不想被说服的人。

明智而谨慎地接近绝望之谷的领导者

绝望之谷的领导者可能会不知所措,有防御心理和压力,所以你需要在这里熟练地导航。你需要谦逊地接近他们,表现出对他们处境的同情。与他们分享你的经历,帮助他们理解你也经历过同样的过程,会给他们额外的安慰。你的目标不是变得微不足道,而是给他们理解和认可你的提议所需要的东西。这需要耐心。

对于绝望之谷的领导者来说,最困难的事情是发现他们。不像愚蠢山上的人,他们不骄傲也不过度自信。他们明白他们不知道,有时这可能意味着他们因为羞愧而隐瞒这一点。

识别这类领导人的一个方法是倾听他们提出的问题。有些问题显示出对该主题缺乏了解,只有 it 专家才能意识到这一点。

好消息是,这个阶段的领导者非常乐于学习。如果你谨慎行事,你可能会成为他们在你专业领域成长的催化剂。他们将体验到开悟斜坡的回报,并开始因此认可和欣赏你。

如果你足够幸运,走到了这一步,你会发现你的提议得到了很多支持(前提是它们真的很好)。你的领导团队会对你有信心,可能会给你很多机会。

最终想法

在我从事金融服务的时候,我多次看到这样的故事。我见过有人试图一次又一次地将同样伟大的提议推进门外,但却徒劳无功。希望这篇文章能指导你不要犯同样的错误。

还没提到的是自我意识。最重要的是,你要认识到你在任何领域的邓宁-克鲁格曲线上的位置。意识到你在哪里会引导你适当地行动。例如,当你意识到自己站在愚蠢的山上时,你会控制自己的“自信”。

自我意识到你在曲线上的位置将会提高你识别你的领导在哪里的能力,从而运用策略与他们合作。

请记住不要自大。你的领导可能不是数据科学方面的专家,但他们可能是非常有经验的专业人士,并且在其他领域处于智慧曲线的末端。

最后,人类心理学非常复杂,但我发现这个简化的框架帮助我成功地指导我的工作。

https://www.linkedin.com/in/john-adeojo/

信息经济学领域如何为攻击性数据计划提供更大回报

原文:https://towardsdatascience.com/how-the-field-of-infonomics-provides-a-greater-return-on-offensive-data-initiatives-e853ef166816?source=collection_archive---------28-----------------------

照片由像素上的元素 5 数字拍摄

我开始这篇文章的原因是,在数据领域工作了这么多年,我意识到在数据科学等进攻性数据计划上的大量投资只能提供一点点回报,而且回报越来越少。我认为,信息经济学领域是解决这一现象的关键手段之一。在本文中,我将讨论 a .为什么攻击性数据计划的回报正在减少,b .为什么会出现这种情况,以及 c . Infonomics &首席数据官如何提供帮助。

其中一个主要原因是,对于我们投入数据计划的所有运营支出和资本支出,我们没有可靠而严格的评估模型。然后就变成了瞎猜/有根据的猜测/感觉/“经验”的练习。正因为如此,我们很容易陷入这样一个陷阱,即通过购买和应用复杂的高级分析或“酷东西”来缩小数据集,而不是对为您提供最高价值差距的数据进行更简单的分析,从而获得收益递减。正因为如此,我们没有一个系统的或可证伪的方法来使用信息评估来确定信息投资的优先次序。其推论如下:a .很难证明数据治理工作的合理性,b .这使得发现机会和扩大经济效益的工作更加困难。

我认为,信息经济学领域和首席数据官(CDO)的角色是解决这一难题的关键。

什么是信息经济学?

信息经济学是数据和信息的领域和学科。这是任何数字业务的基础。在大数据时代和新常态下,任何企业都是数字化企业。

《信息经济学》一书的作者道格拉斯·b·兰尼(Douglas B. Laney)说,“信息经济学是断言信息的经济重要性的理论、研究和学科。它为企业将信息作为实际资产来货币化、管理和衡量提供了框架。”

CDO 如何提供帮助

从业务流程到功能甚至是业务模式的数字化和数字化创造了一个大数据环境,这带来了数据价值的上升、数据速度的加快和数据种类的增加。这在复杂的企业或公司环境下会产生大量数据。然而,它给企业提供了一个独特的机会来将其货币化,同时也给企业带来了巨大的挑战。为了驾驭这个复杂的环境,协调各方,引导他们朝着正确的方向前进,我们需要 CDO。

这个角色越来越受欢迎,也越来越重要。现在经常可以看到,CDO 向首席运营官、CFO 甚至 CEO 汇报工作。我们还可以看到,就重要性而言,这一角色与首席人力资源官(CHRO)、首席营销官(CMO)和首席技术官(CTO)的角色具有相同的轨迹。

CHRO 这个角色直到 1980 年才那么受欢迎。CMO 的角色在 1990 年开始成为主流。首席技术官也是如此。它直到 1980 年到 1990 年才开始流行。美国政府于 2009 年设立了首位首席技术官,这一事实证明,一个新角色从构思到实现需要时间。历史不会重演,但它有自己的节奏。

本·麦克在 Pexels 上的照片

CDO 如何利用信息经济学来提高数据计划的回报和业务相关性?

CDO 可以利用信息经济学的三个部分来实现这一目标。

货币化 :
它是关于为什么信息提供了直接和间接货币化的机会。这也是关于如何做的问题。CDO 可以通过以下方式推动信息货币化:a . I
n 增加客户获取,b .创造补充收入流,c .引入新的业务线,d .进入新的市场,e .实现竞争差异化,f .以物易物,g .以物易物获得有利的条款和条件,h .支付成本或 I .降低维护成本。

管理 *:
是从组织和角色的角度讲如何管理内外部信息。*CDO 不需要多此一举。我们可以从各种行业的现有实践中借鉴许多管理框架,例如,会计、可持续发展、供应链管理、人力资源管理和财务管理。

Measure: 它提供了一套衡量各种收益和成本的信息工具。它为成本效益分析提供了一个可证伪的框架。“不衡量就管不了”。

道格拉斯·b·兰尼在《信息经济学》一书中开发的一些模型提供了一个很好的开端:

信息的内在价值(IVI) =有效性完整性* ( 1 —稀缺性)生命周期

信息的商业价值(BVI) =每个业务流程或功能的相关性有效性完整性及时性*

信息绩效值(PVI) =知情组 KPI/受控组 KPI

信息成本值(CVI) =流程的年化成本流程费用部分*

信息的市场价值(MVI) =独家价格许可数量/溢价*

信息的经济价值(EVI) =知情组收入—控制组收入—费用

照片由 Pexels 上的 Pixabay 拍摄

如果您想得更深一点,在每个数据/信息价值链中有 2 个价值差距。上述模型是您缩小这些差距的工具。第一个差距是绩效差距,这是您的短期期望和当前能力。第二个差距是愿景差距,即你的短期期望和长期愿景之间的距离。上述模型的组合有助于您缩小这些差距。例如,使用 EVI(有助于计算数据的经济效益)和 BVI(有助于计算数据的业务相关性)来识别具有高潜在业务相关性的信息,这些信息可能会带来更多的经济效益。(用 BVI 找业务关联度高的数据域,用 EVI 找经济效益低的数据域。将这两个数据域相交可以给出答案)

我想用两句名言来总结这一部分:“每个模型都是错的,但有些是有用的”和“你不能管理你不度量的东西”。

CDO 应该利用这些模型来提高他们组织的效率和创造价值的能力。他们应该严格而有纪律地对待和利用信息。信息经济学提供了一个实用的框架,CDO 和所有信息职业都可以在此基础上发展。

再说一遍,历史不会重演,但它是有节奏的。我看到了 CDO 的蓬勃发展,以及对信息和数据行业的更多信任,就像我们过去在人力资源、营销和技术领域看到的那样。信息经济学在未来将是一个更值得信赖的领域,CDO 将利用它来帮助企业创造更多价值,并真正释放数据和信息的价值。

LSTM 如何改善 RNN

原文:https://towardsdatascience.com/how-the-lstm-improves-the-rnn-1ef156b75121?source=collection_archive---------10-----------------------

持续流动。杰里米·毕晓普在 Unsplash 上的照片

实践教程

早在 1997 年,长短期记忆(LSTM)网络相对于其他递归网络的优势来自一种反向传播误差的改进方法。Hochreiter 和 Schmidhuber 称之为“恒定误差反向传播”[1]。

但是“不变”是什么意思呢?为了回答这个问题,我们将浏览 LSTM 的架构,并理解它是如何向前和向后传播的。在此过程中,我们将与递归神经网络(RNN)进行一些比较。如果你不熟悉 RNN,你可能想在这里阅读一下。

然而,我们应该首先了解 RNN 要求 LSTM 提出的解决方案的问题是什么。这个问题是来自反向传播步骤的梯度的爆炸消失

消失和爆炸渐变

反向传播是从预测到权重和偏差的误差传播。在像 RNN 和 LSTM 这样的循环网络中,这个术语也被创造了通过时间的反向传播 (BPTT),因为它通过所有时间步长传播,即使权重和偏差矩阵总是相同的。

具有两个时间步长的典型 RNN 的一部分。作者图。

上图描绘了具有两个输入的典型 RNN 的一部分。绿色矩形表示使用双曲正切(tanh)函数对净输入及其隐藏状态激活进行前馈计算。前馈计算在所有时间步骤中使用相同的一组参数(权重和偏差)。

典型 RNN 一部分的前向传播路径(蓝色)和后向传播路径(红色)。作者图。

红色的是 BPTT 路。对于较大的序列,可以看到计算的叠加。这很重要,因为它产生了一个指数因子,这个因子很大程度上取决于我们的权重值。每当我们后退一个时间步,我们需要在当前梯度和权重矩阵之间做一个内积。

我们可以想象我们的权重矩阵是一个标量,假设绝对标量在 0.9 或 1.1 左右。此外,我们有一个长达 100 个时间步长的序列。通过将这些值乘以 100 倍而产生的指数因子将产生 0.9 的消失梯度问题:

0.9 ⁰⁰ = 0.000017(…)

以及 1.1 的爆炸渐变问题:

1.1 ⁰⁰ = 13780.61(…)

本质上,最后一个时间步的 BPTT 计算类似于以下内容:

请注意,尽管该表示并不完全准确,但它给出了具有 n 个输入的 RNN 的 BPTT 中权重矩阵的指数堆叠的好主意。 W_h 是 RNN 最后一个线性层的权重矩阵。

接下来,我们将把这些值的一部分添加到权重和偏差矩阵中。你可以看到,我们要么几乎没有改善参数,要么试图改善太多,以至于适得其反。

既然我们理解了消失和爆炸渐变的概念,我们可以继续学习 LSTM。让我们从它的向前传球开始。

LSTM 正向传播

尽管存在差异,使 LSTM 成为比 RNN 更强大的网络,但仍有一些相似之处。它包含一对一、多对一、一对多和多对多的输入和输出配置。此外,人们可以选择使用堆叠配置。

LSTM 细胞的表现。作者图。

上面我们可以看到 LSTM 细胞内的向前传播。它比简单的 RNN 要复杂得多。它包含四个由 sigmoid 函数(σ)或 tanh 函数激活的网络,每个网络都有自己不同的参数集。

这些网络中的每一个,也称为门,都有不同的用途。他们将用应该传递到下一个时间步的相关信息来转换时间步 t ( c^t )的单元状态。橙色圆圈/椭圆是它们之前的矩阵的元素转换。盖茨镇是这样做的:

忽略栅极层(f) :使用在 0 和 1 之间调节信息的σ函数,决定从单元状态中忽略哪些信息。它会忘记所有为 0 的东西,记住所有为 1 的东西,中间的东西都是可能的候选者。

输入门层(i) :这也可以是一个记忆门。在σ函数的帮助下,它决定哪些新候选项与该时间步相关。

新的候选门层(n) :创建一组新的候选门,存储在单元状态中。这些新候选的相关性将通过与输入门层的逐元素乘法来调制。

输出门层(o) :决定输出单元状态的哪些部分。单元状态通过双曲正切函数归一化,并通过输出门逐元素相乘,输出门决定隐藏状态应该输出哪个相关的新候选。

在左边,你可以看到在 LSTM 细胞内进行的计算。最后两个计算是一个外部前馈层,用于获得预测和某个损失函数,该损失函数采用预测和真实值。

整个 LSTM 网络的架构旨在处理三个时间步长的输入序列,并预测未来的时间步长,如下图所示:

具有三个输入和一个输出的 LSTM 的表示。作者图。

将输入和参数转换成向量和矩阵形式有助于理解计算的多维性。注意,我们使用四个权重和偏差矩阵,它们有自己的值。

这是 LSTM 的正向传播。现在是时候了解网络如何反向传播,以及与 RNN 相比它是如何发光的了。

LSTM 反向传播

LSTM 的改进学习允许用户使用具有数百个时间步长的序列来训练模型,这是 RNN 很难做到的。

在解释门时没有提到的是,它们的工作是决定存储在单元和隐藏状态中的信息的相关性,以便在单元之间反向传播时,传递的误差尽可能接近 1。这可以确保渐变不会消失或爆炸。

理解这一过程的另一种更简单的方式是,单元状态用稳定错误传播的信息连接单元内部的层,有点像 ResNet 所做的那样。

让我们通过反向传播计算来看看误差是如何保持恒定的。我们将从线性输出图层开始。

现在我们将讨论 LSTM 细胞的反向传播。但是首先让我们来看一下在一个单元格内我们必须走的路径。

LSTM 细胞内的完全反向传播(红色箭头)。作者图。

正如你所看到的,路径是非常复杂的,这使得计算量大于 RNN。

下面你可以看到 LSTM 细胞的两种输出的反向传播,细胞状态和隐藏状态。你可以参考我在前面展示的方程来更好地理解我们正在经历的方程。

可以看到,通过单元状态向前传输的信息现在被 tanh’调制后反向传输。注意σ'和 tanh '中的撇(')代表这两个函数的一阶导数。

在接下来的步骤中,我们将返回每个门的参数。

输出门:

新候选门:

输入门:

忘门:

我们已经计算了单元内所有参数的梯度。然而,我们需要保持反向传播,直到最后一个细胞。让我们看看最后的步骤:

你可以看到,从单元状态 c 到状态 c 的信息很大程度上取决于输出门和遗忘门的输出。同时,输出和遗忘梯度取决于先前存储在单元状态中的信息。这些交互应该提供恒定的误差反向传播。

进一步回到全局输入(X ),我们将来自所有四个门的输入相加。

最后,我们从全局输入向量中分离出隐藏状态,遍历剩余的单元,并且将所有单元中关于参数的所有梯度加在一起。

结束语

这个故事的目的是理解为什么 LSTM 能够通过在细胞间的反向传播中保持恒定的误差流来处理比 RNN 更复杂的问题。

我们探讨了由于 RNN 对复杂序列处理不当而产生的问题,从而导致了爆炸和消失梯度。

然后我们通过探索 RNN 的梯度流来了解这些问题是如何发生的。

最后,我们介绍了 LSTM 及其正向传递,通过解构其反向传递,我们了解到单元状态受两个门单元的影响,这两个门单元负责确保恒定的误差回流。

值得一提的是,随着用 LSTM 进行的实验越来越多,这个网络停止学习的地方就有了一定程度的复杂性。一般来说,在它发生之前会有上千个时间步骤,这已经很好了。

这将导致 LSTM 的逐步淘汰,因为问题变得更加雄心勃勃,有利于一种新的网络,称为变压器或 BERT。你可能也听说过用于自然语言处理的 GTP-3。这些都是非常强大的网络,具有巨大的潜力。

然而,LSTM 肯定有它的影响,它是用独创性创造的,今天仍然有用。

感谢阅读!

参考

[1] Sepp Hochreiter 和 Jürgen Schmidhuber,《神经计算中的长短期记忆》,1997 年,DOI: 10.1162/neco.1997.9.8.1735

策略设计模式如何帮助您快速评估备选模型

原文:https://towardsdatascience.com/how-the-strategy-design-pattern-can-help-you-quickly-evaluate-alternative-models-66e0f625016f?source=collection_archive---------54-----------------------

开发与各种模型无缝合作的机器学习实验。

图片由来自 Pixabay 的 Felix Mittermeier 拍摄

动机

本文解释了机器学习实践者如何应用策略设计模式,以有效和可重用的方式评估模型的替代方案。

介绍

当解决应用机器学习问题时,考虑多种建模技术是常见的(也是明智的)。在定义了问题之后,习惯上要头脑风暴出一个“候选模型”的入围名单。在许多情况下,基线建模技术包括在这个列表中,以论证一种新方法的优势。

在应用机器学习项目中,实践者经常利用可信赖的开源包(例如 scikit-learn、TensorFlow、PyTorch)中可用的模型实现或组件。为了执行机器学习调查工作流中的典型活动,有必要独立地与这些库中的每一个进行交互。例如,序列化 TensorFlow 中定义的神经网络分类器不同于序列化 scikit-learn 中定义的随机森林分类器。在 TensorFlow 中,你会调用TF . keras . models . save _ model(模型,路径);而在 scikit-learn 中,建议使用内置的 Python 包“joblib”,调用 joblib.dump(model,path) 。类似地,性能指标的计算涉及对可用于指标计算的 API 的不同调用。根据我的经验,用不同的候选模型构建更大的实验是相当麻烦的,这些模型需要不同的函数调用来完成相同的任务。

我们将看到一种称为“策略”的软件设计模式如何有助于实现可重用的机器学习实验,提高模型评估过程的效率。

战略设计模式

软件设计模式是为经常遇到的软件设计问题定义一种优雅方法的结构。它们是一类问题的简洁解决方案的蓝图,促进良好的设计实践,例如模块化和可重用性。面向对象的设计模式描述了类之间的成员和关系。策略设计模式是一种行为设计模式,它涉及到一系列算法的定义,这些算法可以被客户互换地调用[1]。客户端程序可以决定使用家族中的任何算法,因为它可以通过相同的接口与任何算法进行交互。下图展示了 Strategy 的基本思想——多个“具体的”算法实现了一个抽象接口。因此,客户端可以通过相同的接口与任何具体的算法进行交互。每个具体的算法对同一问题实现不同的解决方案,保持相同的接口。

描绘策略设计模式的 UML 图。作者图片。

候选模型是不同的策略

那么这种设计模式与评估候选机器学习模型有什么关系呢?我邀请你考虑一下,如果每个不同的建模方法都被封装成一个具体的策略,我们能做些什么。那么每一个“模型策略”对象都将拥有相同的接口,而不管它们实现中使用的方法或库。我们可以编写代码来与模型交互,而不考虑定义它们的技术。也许我可以在一个循环中遍历所有的模型类型,用同一行代码开始一个训练实验。

假设我们定义了一组对原型机器学习模型至关重要的核心操作。下面提出了这种操作的示范(非穷举)列表:

  • 定义底层模型
  • 在某些数据集上拟合模型
  • 根据一些数据评估模型,计算性能指标
  • 模型保存到永久存储器中,以备后用
  • 从持久存储中加载模型

我们可以定义一个包含这些方法的抽象基类,强制所有的子类用一个期望的签名实现这些方法。在 Python 中,我们可以使用ABC包将抽象合并到我们的类实现中。

***from** abc **import** ABCMeta, abstractmethod
from datetime import datetimeclass ModelStrategy(object):
   '''
   An abstract base class for defining models. The interface,
   to be implemented by subclasses, define standard model 
   operations
   '''
    __metaclass__ = ABCMeta def __init__(self, name):
      self.name = name
      self.target = 'y'
      self.train_date = datetime.now().strftime(**'%Y%m%d-%H%M%S'**) 

   [@abstractmethod](http://twitter.com/abstractmethod)
   def define_model(self):
      # Abstract method for model definition
      pass [@abstractmethod](http://twitter.com/abstractmethod)
   def fit(self, dataset):
      # Abstract method for model fitting
      pass [@abstractmethod](http://twitter.com/abstractmethod)
   def evaluate(self, dataset):
      # Abstract method for model evaluation
      return None [@abstractmethod](http://twitter.com/abstractmethod)
   def save(self, save_dir):
      # Abstract method for serializing the model
      return None [@abstractmethod](http://twitter.com/abstractmethod)
   def load(self, model_path):
      # Abstract method for restoring the model
      return*

从上面的代码片段中可以观察到,我们的抽象基础模型类 ModelStrategy 包含了对 define_model()、fit()、evaluate()、save()load() 的抽象定义。从 ModelStrategy 继承的所有类都必须实现这些方法。注意 name 属性的存在——所有子类都必须在其构造函数中接收该字段的值。现在,我们可以为我们希望评估的所有模型创建类,每个类都扩展了 ModelStrategy 基类。

为了说明的目的,假设我们的候选模型列表包括普通最小二乘(OLS)线性回归(特别是stats models实现)。让我们看看如何定义一个执行线性回归的具体策略类,同时符合上面指定的抽象接口。下面的代码片段演示了这个想法。

**class LinearRegressionModel(ModelStrategy):
   '''
   An ordinary least squares (OLS) linear regression model
   ''' def __init__(self, hparams):
      self.fitted_model = None
      name = 'LinearRegression'
      super(LinearRegressionModel, self).__init__(hparams, name) def define_model(self):
      return None     # Need data to initialize this model def fit(self, dataset):
      '''
      Fit the OLS model
      :param dataset: preprocessed data to fit the model on
      '''
      self.model = sm.OLS(dataset[self.target],
                   dataset[dataset.columns[:-1]])
      self.fitted_model = self.model.fit() def evaluate(self, dataset):
      '''
      Calculate performance metrics on the test set
      :param dataset: preprocessed data to test the model on
      :return: Dict containing performance metrics and fit data
      '''
      test_df = dataset.copy()
      preds = 
          self.fitted_model.predict(test_df[test_df.columns[:-1]])
      metrics = {}
      metrics['MAE'] = mean_absolute_error(test_df[self.target],
                       preds)
      metrics['MSE'] = mean_squared_error(test_df[self.target],
                       preds, squared=True)
      metrics['RMSE'] = mean_squared_error(test_df[self.target],
                       preds, squared=False)
      return metrics def save(self, save_dir):
      '''
      Saves the model to disk
      :param save_dir: Directory in which to save the model
      '''
      if self.fitted_model:
         model_path = os.path.join(save_dir, 
                      self.name + self.fit_date + '.pickle')
      self.fitted_model.save(model_path) def load(self, model_path):
      '''
      Loads the model from disk
      :param model_path: Path to saved model
      '''
      if os.path.splitext(model_path)[1] != '.pickle':
         raise Exception('Path must have ".pickle" extension.')
      self.model = sm.load(model_path)
      return**

**我们在 OLS 的实现相当简单。在 fit() 调用中,我们通过调用 sm 来初始化 OLS 模型对象。OLS() ,将我们的数据集作为参数传递。我们将模型保存为一个名为 self.model 的类属性。事实上,实际的 OLS 模型是我们线性回归的具体策略类的一个属性。请注意,在 evaluate(),中,我们计算了一些标准的性能指标,将我们的模型预测与传递的数据集中的真实目标进行比较。

一个简单的例子

到目前为止,我们已经讨论了如何使用策略设计模式来创建代表我们的候选模型的不同对象,每个对象都符合相同的接口。现在让我们看一个例子,如何在实践中使用 Strategy 来编写代码,以便不可思议地评估我们的候选模型。

考虑下面的类图。它是策略设计模式的实现,包含几个具体的模型策略,具有更复杂的关系。

一个 UML 类图,描述了一组候选模型的策略设计模式的实现。图片作者。

和以前一样,我们有直接从模型策略基类继承的线性回归模型。我们也有一个神经网络模型的具体策略类。请注意, NeuralNetworkModel 类的属性对应于神经网络训练中使用的一些常见超参数。神经网络本身可以在 TensorFlow、PyTorch 或 scratch 中实现——这对客户端来说无关紧要(在上面被称为“训练实验”)。

**读者可能会注意到上图中的一个特点。一个名为 SKLearnModel 的抽象类直接继承自基类,然而它有三个自己的子类。这就是面向对象编程的魅力所在。 DecisionTreeModel、RandomForestModel、GradientBoostingModel 类都是使用 scikit-learn 包定义的。因此,它们在 ModelStrategy 中核心方法的实现是相同的。为什么要在每个具体的策略类中为这些方法重写代码呢?通过在 SKLearnModel 抽象基类中捕获这些共性,它的子类必须仅仅定义是什么使它们独特。参见下面定义了 RandomForestModel 类的代码片段,并陶醉于它的简单性。

**class RandomForestModel(SKLearnModel):
   '''
   A random forest regression model
   ''' def __init__(self, hparams):
      name = 'RandomForest'
      self.n_estimators = int(hparams.get('N_ESTIMATORS', 100))
      self.loss = hparams.get('LOSS', 'mse') if hparams.get('LOSS',
                  'mse') in ['mse', 'mae'] else 'mse'
      super(RandomForestModel, self).__init__(hparams, name) def define_model(self):
      return RandomForestRegressor(n_estimators=self.n_estimators,
                                   criterion=self.loss) def fit(self, dataset):
      super(RandomForestModel, self).fit(dataset)**

根据我的经验,具体模型策略类的属性对应于模型的超参数。例如,上面的随机森林实现对于决策树估计器的数量( n_estimators )和损失函数的选择( loss )具有超参数。通常,我选择将超参数作为字典传递给具体模型类的构造函数。我经常在一个. yml 文件中维护这些字典的序列化,在运行训练实验时调整它们。另一个(不太灵活的)选择是将这些超参数硬编码为构造函数中的属性,避免将它们传递给构造函数。

当实现训练实验时,策略设计模式的真正力量变得显而易见。任何具体的模型策略都可以通过相同的 API 进行初始化和实验。查看适合模型的示例代码,而不管模型类型如何。调用者传递模型名和一个配置字典 cfg 。我通常从一个. yml 文件创建一个路径和超参数的可配置字典。通过定义从模型名称到类名的映射(下图中的模型 _DEFS ,我们可以与任何模型交互,只要我们指定它的名称。或者,我们可以遍历我们定义的模型的所有名称,并对它们进行实验(例如,简单训练、交叉验证、超参数优化)。

**# Map model names to class definitions
MODELS_DEFS = {
 'LINEAR_REGRESSION': LinearRegressionModel,
 'RANDOM_FOREST': RandomForestModel,
 'DECISION_TREE': DecisionTreeModel,
 'GRADIENT_BOOSTING': GradientBoostingModel,
 'NEURAL_NETWORK': NeuralNetworkModel
}def fit_experiment(cfg, model_name):
   '''
   Fit a model and assess it on a test set.
   :param cfg: Project config
   :param model_name: Identifier of model to train
   :return: Results of model evaluation (includes performance
            metrics, other important model parameters)
   ''' # Define the model
   model_def = MODELS_DEFS.get(model_name.upper(), lambda: 
      "Invalid model name specified.")
   hparams = cfg['HPARAMS'].get(model_name.upper(), {})
   model = model_def(hparams) # Load data and split into training and test sets
   preprocessed_df = pd.read_csv(cfg['PATHS']['PREPROCESSED_DATA'])
   train_df, test_df = train_test_split(preprocessed_df,
                               test_size=cfg['TRAIN']['TEST_SPLIT']) # Train and evaluate model
   model.fit(train_df)
   test_metrics = model.evaluate(test_df) # Save the model object
   model.save(cfg['PATHS']['MODELS'])
   return test_metrics**

实验者现在可以编写快速代码来实验任何已定义的建模技术,而不必担心与不同实现相对应的特定 API 的细节。要将另一个模型添加到花名册中,实验人员只需对基本模型策略进行子类化。

以这种方式实现建模备选方案的最后一个好处是,它们可以在未来的项目中重用。虽然最初可能会投入时间来开发每个模型的类,但可以通过提高后续内部应用机器学习项目的生产率来实现回报。

结论

本文建议使用策略设计模式作为工具,以便快速评估一组候选模型。我写这篇文章是因为我发现这是在我自己的工作中评估多种建模方法的有效策略(双关语)。我希望你也能意识到它提供的节省劳动力和组织的好处。

参考

[1] E. Gamma,R. Helm,R. Johnson,J. Vlissides,设计模式:可重用面向对象软件的要素 (1994),皮尔森教育。

世界上最大的公司如何设计机器学习驱动的应用程序

原文:https://towardsdatascience.com/how-the-worlds-biggest-companies-design-machine-learning-powered-applications-701f4114e089?source=collection_archive---------4-----------------------

认为机器学习可能对你的项目有帮助?这是最好的方法。

ML 代码只是拼图的一小部分。

经常有人问我:“我应该从事什么样的机器学习项目?”

我通常会回答“跟随你的好奇心”

为什么?

因为机器学习是实验性的,所以通过修补来解决问题对你最有利。通过尝试一些可能行不通的事情。

然而,机器学习项目不再是魔法作品。你正在阅读这篇文章的设备可能以你不知道的几种不同方式使用机器学习(见下面苹果的隐式机器学习)。

话虽如此,本期 ML 月刊(2021 年 4 月版)收集了世界范围内使用机器学习的公司的不同设计最佳实践。

通读之后,你会开始注意到事情的处理方式有很多重叠。这是好事。因为重叠部分可以用于您自己的项目。

随着模型和机器学习代码变得越来越可复制,你会注意到这里的一个首要主题:机器学习是一个基础设施问题

这是你一直都知道的,“我如何以最快、最有效的方式将数据从一个地方转移到另一个地方?”

如果你正在考虑从事自己的机器学习项目,请通读下面的每一条指导方针,并尝试了解更多部分中的材料,但请记住,这些都不会取代你从自己的实验中获得的知识(指导方针、指南)。

注: 我在整篇文章中交替使用了机器学习和人工智能(AI)这两个术语。你可以把“机器学习系统”读作“AI 系统”,反之亦然。

苹果的机器学习人机界面指南

我在图书馆的苹果 MacBook 上写下这些文字,在那里我可以看到至少 6 个其他的苹果标志。今天早上,我看到我前面的两个人用他们的 iPhones 支付他们的咖啡。

苹果设备无处不在。

它们都以许多不同的方式使用机器学习,以增强照片,延长电池寿命,通过 Siri 进行语音搜索,为快速输入提供建议。

苹果的机器学习人机界面指南分享了他们如何思考以及他们如何鼓励开发者考虑在他们的应用程序中使用机器学习。

他们从两个高层次的问题开始,并在此基础上进行分解:

  1. 机器学习在你的应用中有什么作用?
  2. 什么是输入和输出?

对于机器学习在你的应用中的作用,他们继续问,它是关键的(需要具备)还是补充的(最好具备)?是私立的还是公立的?是看得见还是看不见?动态还是静态?

对于输入和输出(我非常喜欢这种类比,因为它类似于 ML 模型的输入和输出),他们讨论一个人将向你的系统输入什么,你的系统将向他们展示什么。

一个人会给一个模型明确的反馈吗?比如,他们会告诉你的模型是对还是错吗?还是你的系统收集了隐性反馈(除了使用应用程序,不需要用户做任何额外工作的反馈)?

当询问机器学习在你的应用/功能中扮演什么角色时要考虑的问题。来源 : 苹果的机器学习人机界面指南。

谷歌的人和人工智能研究(一对)

谷歌的人工智能设计原则可以在他们的人与人工智能研究(PAIR)指南中找到。

结对指导手册还附带了一个很棒的词汇表,里面有你在这个领域会遇到的许多不同的机器学习术语(有很多)。它把设计一个人工智能项目分成六个部分。

用户需求+定义成功

  • 人工智能的能力和使用你的服务的人的需求的交集在哪里?
  • 你应该自动化(去掉一个痛苦的任务)还是用人工智能增强(改进)?
  • 理想的结果是什么?

数据收集+评估

  • 把一个人的需求变成数据需求(一切从数据开始)
  • 你的数据从哪里来?(是否负责任地采购?)
  • 构建、拟合和调整您的模型(好的模型始于好的数据)

心智模型(设定期望)

  • 一个人相信你的 ML 系统能实现什么?

可解释性+信任

  • AI 系统是基于概率的(可能会给出奇怪的结果),这怎么解释?
  • 一个人应该了解 ML 模型如何做决策的哪些信息?(信心水平,“我们向您展示这个*,因为*您喜欢它…”)

反馈+控制

  • 一个人如何提供反馈来帮助你的系统改进?

错误+优雅的失败

  • 什么是“错误”,什么是“失败”?(无人驾驶汽车在绿灯时停下可能是一个错误,但闯红灯可能是一个失败)
  • ML 系统并不完美,你的系统最终会失败,当它失败时你会怎么做?

每个部分都有一张练习你所学内容的工作表。

通读指南(尤其是 PAIR)后,你会注意到一个趋势是设定期望值。坦率地说出您的系统的能力。如果一个人期望你的系统是神奇的(就像 ML 经常被描绘的那样),但是没有意识到它的局限性,他们可能会失望。

微软的人机交互设计指南

微软的人机交互设计指南分四个阶段解决这个问题:

  1. 最初(一个人第一次使用你的系统应该知道什么?)
  2. 互动期间(当一个人在使用你的服务时会发生什么?)
  3. 出错时(你的系统出错了会怎么样?)
  4. 随着时间的推移(随着时间的推移,你的系统如何改进?)

你会注意到微软的指导方针带你走进一个穿着你的 ML 系统的鞋子的人。我们再次看到一种趋势。

问题→创建解决方案(ML 或不 ML)→设定期望→允许反馈→有一个机制,当它是错误的时候→随着时间的推移改进(回到开始)。

微软的人机交互卡指南,从初始阶段开始,直到随着时间的推移,一个人与你的机器学习系统交互时该做什么。来源: 微软的人机交互指南。

脸书机器学习领域指南

虽然以前的资源已经采取了整体 ML 系统的方法,但脸书的机器学习领域指南更侧重于事物的建模方面。

他们的视频系列将机器学习建模项目分为六个部分:

  1. 问题定义 —你想解决什么问题?
  2. 数据 —你有什么数据?
  3. 评价 —什么定义成功?
  4. 特征 —数据的哪些特征最符合您对成功的衡量标准?
  5. 模型 —什么模型最适合您的问题和数据?
  6. 实验——你如何在前面的步骤上重复和改进?

但是,随着机器学习中建模方面的事情变得更容易获得(由于预先训练的模型、现有的代码库等),记住机器学习的所有其他部分是很重要的。

我使用脸书的机器学习领域指南作为零到精通数据科学和机器学习课程的大纲。你也可以在我的博客上阅读这些步骤的扩展版。

Spotify 设计 ML 驱动产品的 3 条原则

你如何建立一个为全球 2.5 亿用户提供音乐的服务?

在你变魔术之前,你从手动开始(原则 3),你不断地问正确的问题(原则 2)来识别使用你的服务的人在哪里面临摩擦(原则 1)。

上面这句话是对 Spotify 设计机器学习驱动产品的三大原则的文字游戏。

原则 1:识别摩擦并自动消除

在任何地方,一个人在使用你的服务时努力追求他们的目标都可以被认为是摩擦。

想象一下,一个人在 Spotify 上搜索新音乐,却找不到任何符合自己口味的东西。这样做可能会伤害某人的体验。

Spotify 意识到了这一点,并使用基于机器学习的推荐系统创建了 Discover Weekly(我目前正在听的),这是一个每周都会更新新音乐的播放列表。

在我的情况下,看起来他们必须坚持他们的其他两个原则,同时建立它,因为这些轨道我听的是 bangers。

原则 2:问正确的问题

问吧。问吧。问吧。如果你不知道,你可能会在错误的方向设计产品。

就像上面的许多其他指导步骤挑战你从使用你的服务的人的角度思考一样,这是问正确问题的目标:找出你的客户有什么问题,看看你是否可以使用机器学习来解决它们。

原则 3:在使用魔法之前先使用手册

找到了摩擦源?

不用机器学习能解决吗?

从启发式(事情应该如何工作的想法)开始怎么样?

就像如果你是 Spotify,并试图建立一个某人感兴趣的新音乐的播放列表,你如何将一些东西归类为新的?

您的起始启发式规则可能是任何超过 30 天的内容都不会被归类为新内容。

在测试了多种启发和假设(一个手动过程)之后,你可以再次评估机器学习是否有帮助。因为你的实验,你会从一个非常消息灵通的角度这样做。

吴恩达《从大数据到好数据》

吴恩达在 Scale 最近的会议上发表了一篇关于 ML 系统从大数据到好数据的移动的演讲。 Roboflow 对要点做了一个很好的总结——所有这些都与我们上面讨论的内容有关。

我最喜欢的包括:

  • 开始部署是一个起点而不是终点(缩小概念验证和生产差距)
  • 从大数据到好数据 (MLOps 最重要的任务是确保 ML 项目生命周期所有阶段的高质量数据,并非所有公司都能访问大数据)
  • 冻结你的代码库,迭代你的数据(对于许多问题来说,模型是一个已解决的问题,数据是所需要的)

吴恩达谈到思考好数据和大数据的重要性。来源: 吴恩达在 Scale's Transform conference 上的《从大数据到好数据》演讲。

了解更多信息

以上都是关于如何考虑构建 ML 驱动系统的指导方针。但是他们不一定向你展示工具或者如何去做。

以下是我推荐的额外资源,可以填补上面留下的空白。

选择一个并通读/研究所有的材料/实验,同时构建你自己的 ML-powered 项目。

  • 机器学习的工程最佳实践(软件工程 4 机器学习) —关于使用机器学习组件开发软件系统的全面指南。
  • 安德烈·布尔科夫的《机器学习工程》一书——上面讨论的许多指导方针和步骤的一站式商店,我把这本书放在我的桌子上,用作参考。
  • CS329s:机器学习系统设计——一门完整的斯坦福课程,涵盖了设计机器学习驱动的系统的所有步骤。由来自许多不同机器学习公司的工程师的 Chip Huyen 带领嘉宾演讲(包括一个来自你的真实)。
  • 全栈深度学习 —机器学习并不是一个模型一旦建立起来就停止的(而且看了上面你就知道模型是整个系统的一小部分)。全栈深度学习引入了许多围绕模型构建的步骤,如数据存储、数据操作、数据版本化(注意对数据的强调)、模型部署以及实现它们的不同工具。
  • 用 ML 制作的 MLOps 课程 — MLOps =机器学习操作。由悟空莫汉达斯以学徒的风格制作了“我将如何构建一个 ML 驱动的服务,你也可以如何做”。
  • LJ Miranda 关于数据科学家软件工程技能的杰出博客——如果我要写一篇关于从构建模型(在笔记本上)到编写全栈代码的博客,那就是这篇了。

PS 你可以在 YouTube 上看到这篇文章的视频版本。

[这篇文章最初出现在 2021 年 4 月的机器学习月刊上,这是我写的一份月度时事通讯,包含机器学习领域的最新和最棒的(但不总是最新的)。]

世界上最大的公司如何利用人工智能让系统变得智能

原文:https://towardsdatascience.com/how-the-worlds-biggest-companies-use-artificial-intelligence-to-make-systems-smart-6ef6bec40751?source=collection_archive---------38-----------------------

用户体验很重要,所以公司比以往任何时候都更重视人工智能

照片由克里斯蒂娜·莫里洛 : 派克斯拍摄

智能系统为我们提供了更好的生活体验,因此它们将在未来继续发展。从智能手机到智能家居,我们依赖它们。但是是什么让这些大脑驱动的产品有别于普通产品呢?AI 如何帮助改善你的生活?

当你想到人工智能时,你可能会想起天网和机器统治地球的戏剧性终结者场景。但这不是我们现在拥有的。人工智能不是人类的威胁。

人工智能是一台聪明的机器,让你的生活变得更加简单和方便。所以你可能会为此感到高兴。

“从阿里巴巴到亚马逊,世界上所有的科技巨头都在竞争成为人工智能的世界领导者。”——福布斯杂志的伯纳德·马尔

让我们看看人工智能如何帮助科技巨头们想出更聪明的方法来做他们需要的一切。AI 帮助从业务优化开始,到客户支持辅助。

无论你是企业主还是不懂技术的消费者,这篇文章都将帮助你探索智能系统的好处。

机器学习基金会

你过去常常把人工智能与自动驾驶汽车或机器人等大项目联系在一起。所有这些智能产品的 AI 来源被称为机器学习 (ML)。

什么是机器学习?简单来说就是一套技术,不用显式编程,计算机也能学习。机器学习是一种使用数据进行推断的能力,这种推断没有被编入计算机程序。

例如,当你用智能手机去 Hotels.com 时,你可能会看到一个喜达屋酒店及度假村喜来登积分奖励计划的小广告出现在你的屏幕上。广告是由一个根据你的浏览历史投放广告的网络提供的。

“这就是机器学习的价值,利用数据向客户提供个性化体验。”

—马修·科尔,喜来登奖励酒店的技术主管。

但是喜达屋是如何利用 AI 做到这一点的呢?这一切都是基于浏览历史来预测客户想要什么。如果你在纽约,这个程序会提供一种类型的广告,如果你在旧金山,它会提供另一种类型的广告。它跟踪你的交通模式,天气和其他数据。

人工智能的主要目标是根据你的个人数据创造独特的用户体验。

当你寻找特定的产品或服务时,搜索引擎会提供你输入的准确信息。之后搜索引擎会根据排名给你数据。但是你没有个人偏好。

在人工智能的帮助下,今天的搜索过程变得更加独特。AI 不会推荐不相关的产品,而是分析你的口味,并给出你真正想要的最佳选择。

公司知道他们能提供更好的用户体验,他们会得到更多的消费者。这就是为什么他们越来越多地使用 AI。

消费者数据改变游戏规则

消费者数据对于启动你的创业、发展你的业务或改进产品是极其重要的。今天,研究人员和 UX 设计师在分析用户行为方面做得很好,并使产品变得更好。

但如果 AI 可以替代开发后的产品更新,不断提升用户体验呢?这已经发生了。

人工智能让公司和消费者之间的力量平衡变得更好。结果是提高了速度和准确性,这对公司来说是一个巨大的游戏规则改变者。

这些改进让科技巨头能够为消费者提供更多定制化的产品。这是所有公司都想拥有的目标——人工智能驱动的用户体验。

人工智能的人性化还体现在它能够帮助公司完成的客户旅程。此外,人工智能将展示客户如何思考、行动以及他们如何重视产品互动。公司对消费者了解得越多,它提供的产品就越好。

亚马逊使用人工智能的另一种创新方式是,在你考虑购买之前,会把东西送到你手中。

— 福布斯的伯纳德·马尔

作为最好的快递巨头,[亚马逊的业务](http://Amazon's business is based on product sales)是基于产品销售。他们需要了解消费者及其偏好。这就是他们做的事情。

如果你在使用亚马逊,它会根据你的购买习惯收集你的数据。当你想买新东西时,应用程序会给你最好的选择。

人工智能根据你的购买偏好分析这些选项。把亚马逊想象成你的私人购物者,向你推荐你可能需要的东西。另一种思考亚马逊人工智能的方式是预测或预言。

当你开始浏览一个要购买的商品,不知道具体选什么的时候,亚马逊会帮你。

亚马逊的另一个独特的人工智能应用是亚马逊商店。我们过去常常挑选产品,将它们放入购物篮,结账,然后等待送货上门。

与传统的购物体验不同,Amazon Go 不需要结账。你需要走进商店,选择你的产品,然后拿起它。

一旦你选择了一个项目,付款就会自动发生。因此,你可以拿起你需要的商品回家,而不是把时间花在结账上,这是一种快速、方便、独特的购物体验。

最初推出 Amazon Go 时,并没有多少人准备使用它。但 Amazon Go 变得广泛流行,因为人们了解它方便的用户体验和购物速度。亚马逊推出了一种新的购物方式。

人工智能与心理学

人工智能越发达,人们创造的有趣产品就越多。如果语音助手,如 Alexa,是几年前的新事物,今天,它是你使用的常见产品。

当人们使用产品时,他们想要的不仅仅是搜索和智能预测。人们希望与人工智能交流。

一旦一家名为 Replica 的初创公司开发出他们的产品,这一切就变成了现实。这是你每天可以聊天的个人数字朋友。以前,我们有聊天机器人,人们试图和他们交谈。但是交流经历很糟糕。

现在,公司希望提供人工智能与人类交流的。这真的很棒。意思是 AI 被开发的这么强,可以代替一个人类,在没人在附近的时候支持你。

“据well mind, 称,只有大约 25%的美国成年人认为,他们似乎对什么让他们的生活变得有意义有了明确的目标感,新的情感人工智能和技术可能会开始以我们从未想象过的方式提供可访问的个性化解决方案。”

——福布斯杂志上的 NJ Falk

随着人工智能的进步,心理学家将能够更好地理解人类的思想和感情。这将允许创建个性化的治疗和对个体患者的更好理解。

如果你过去认为人工智能是聊天机器人或机器人,你仍然停留在过去。今天,人工智能甚至可以取代爱情。这已经是在日本的真实体验了。

这个国家孤独的人比例很高。他们甚至还有一个孤独部长。日本人需要爱情有一个虚拟的伴侣来应对孤独。日本的这项新服务叫做“全息男友”。

这些都是纯全息图,AI 给了没有人倾诉的日本人陪伴。这是应对孤独的好方法,你可以为你的数字伴侣选择一种性格类型。

人工智能将带领我们走向未来。这个未来将给人类一个选择他们的生活方式和与他人关系的选项。心理学家将能够观察到新环境下人们心理健康的变化。

AI 变得越来越好,但与此同时,它变得更像人类,因为我们不想让它取代我们,而是补充我们的生活。

最后的想法

人工智能对社会产生了难以置信的巨大影响,尤其是在我们各自的领域。亚马逊等公司使用人工智能来改善他们的搜索功能。复制品提供了独特的人类体验。

人工智能就是开发能够像人类一样思考和行动的机器。与神经科学以外的任何其他领域相比,这是一个相对较新的领域,它将人工智能引向了人类体验。

这正是人工智能有潜力做到的。人工智能已经在让机器比人更聪明,它的进步在这十年里只会加速。

这个“人造梦”程序是如何工作的,以及你如何用它创造你自己的艺术作品

原文:https://towardsdatascience.com/how-this-artificial-dreaming-program-works-and-how-you-can-create-your-own-artwork-with-it-387e5fb369d9?source=collection_archive---------19-----------------------

此工具从提示“计算机”和“绘画”中画出的“艺术品”。作者 Luciano Abriata 图。

你不需要知道任何编程-只要有一个谷歌帐户。这里有一篇直截了当的文章,回顾了关于这个主题的几个关键故事和学术论文

我收到了一些电子邮件和一些评论,询问如何/在哪里运行我用来创建这些快照故事中的图片的神经网络程序:

https://medium.com/snap-shots/screen-shots-of-art-generated-by-a-dreaming-artificial-intelligence-program-72c5e9eb0876 https://medium.com/snap-shots/screen-shots-of-art-generated-by-a-dreaming-artificial-intelligence-program-part-2-8ffbc1c2ff53

以下是答案。虽然已经有一些关于这方面的文章,但我在这里着重于(I)回顾它是如何工作的,链接到基础论文和其他人的故事中的一些很好的解释,以及(ii)关于如何调整程序生成的输出的实用技巧,再次链接到除我自己之外的其他人的故事。

首先,这一切是如何运作的?

简单来说,这是两种神经网络架构的结合:VQGAN 和 CLIP。VQGAN 网络从输入数字生成图像,CLIP 测量输入文本和输入图像之间的相似性。更准确地说,VQGAN 是 arXiv 预印本中描述的类型的生成性对抗网络,两个竞争网络进行无监督学习。它的主要描述在这个 arXiv 预印本中,也由其作者(P. Esser,R. Rombach,B. Ommer) 在这个 blo g 中呈现。同时,CLIP 以一种受自然语言监督和多模态学习网络启发的方式将文本转换为图像。它的主要描述可以在这个 arXiv 预印本和这个博客中找到。其作者(a .拉德福德、J.W .金、c .哈勒西、a .拉梅什、g .高、s .阿加瓦尔、g .萨斯特里、a .阿斯克尔、p .米什金、j .克拉克、g .克鲁格、I .苏茨基弗)发现,将字幕与图像匹配的简单训练是一种高效且可扩展的学习图像表示的方法,这样自然语言就可以用来引用所学的视觉概念。

这个令人惊叹的“艺术梦想”工具的开发者( K. Crowson 和 R. Murdoch )以这样一种方式耦合了两个网络,即 CLIP 引导搜索 VQGAN 的输入,试图匹配文本提示。这个过程以你在我(和许多其他人)的帖子上看到的“艺术”方式慢慢混合了对应于输入单词的图像。而且由于过程中涉及到随机数,所以不同运行的结果是不一样的。

人类艺术家可以如何以及在多大程度上调整程序的输出?

作为使用此工具的艺术家,您可以通过以下方式控制网络输出:

  • 调整输入单词,你甚至可以指定比例(例如,如果你想让足球银河吉他的比例为 2:1:2,以强调足球吉他超过银河,那么你可以输入“足球足球银河吉他”。
  • 选择网络运行时将从中撤回目标的图像库。
  • 当你看到结果足够好或不变时,停止做梦过程(网络运行涉及迭代,原则上可以是无限的,但通常在几百个周期后开始收敛)。
  • 是继续做一个梦,还是因为你不喜欢正在制作的东西而停止它——然后重新开始,可能还会改变一些参数。

正如 Hannah Johnston 在她的伟大故事中所说,从这些工具中获得你喜欢的东西远不只是选择单词和点击运行。您需要进行一些实验性的参数调整,当然还需要多次运行,才能得到您所期望的结果。有时候你永远不会满足。正如她所说,这就是为什么你会对最终结果产生某种依恋感,并把它视为带有实质性个人成分的东西。我在自己的快照故事中也说过同样的话。

现在,你如何以及在哪里可以自己运行这个网络来创作你自己的艺术作品?

这些网络的基本运行极其容易的,你甚至不需要懂任何编程。你可以简单地打开许多实现它的 Colab 笔记本中的一个,调整你想要使用的参数(至少是提示梦境的关键字)并点击 Run,然后等着看会产生什么。

如果我没看错的话,Colab 笔记本原版西班牙语是这个:https://Colab . research . Google . com/drive/1g o6 ywmfe 5 MX 6 XM 9 TV-cnqistu 50n 9 eet

但是已经翻译成英文:https://colab . research . Google . com/drive/1 _ 4j l0 a 7 wijeqy 5 ltjpjfzowmzopg 5 c-W?usp =共享

需要注意的是,无论你用什么语言运行 Colab 笔记本,输入的单词都必须是英文的!

我建议你去玩笔记本。但是如果你想要更多的细节…

下面是安格斯·拉塞尔的一步一步的精彩指导。他的方法 1 是使用谷歌的 Colab 笔记本:

https://medium.com/nightcafe-creator/vqgan-clip-tutorial-a411402cf3ad

回顾进一步的相关阅读材料+额外的链接

  • 详细的手册(西班牙文):

https://tuscriaturas.miraheze.org/wiki/Ayuda:Generar_im%C3%A1genes_con_VQGAN%2BCLIP

→这里谷歌翻译的英文版本:https://translate.google.com/translate?hl=&sl = es&TL = en&u = https % 3A % 2F % 2ft uscriaturas . miraheze . org % 2f wiki % 2f ayuda % 3 generar _ im % C3 % a1 genes _ con _ VQGAN % 2b clip

  • 网络如何共同产生艺术,作者 Alexa Steinbrück ,比我上面的解释更深入,但比完整的 arXiv 预印本更简单:

https://alexasteinbruck.medium.com/vqgan-clip-how-does-it-work-210a5dca5e52

  • 关于机器学习艺术的未来的非常有趣的想法,作者汉娜·约翰斯顿:

https://medium.com/@hannahj/the-future-of-art-with-machine-learning-6f839575481

  • 关于 VQGAN 的学术论文:

https://arxiv.org/abs/2103.00020

  • 关于 CLIP 的学术论文:

https://arxiv.org/abs/2012.09841

喜欢这篇文章,想给我提示?[Paypal]-谢谢!

我是一个自然、科学、技术、编程、DIY 爱好者。生物技术专家和化学家,在潮湿的实验室和计算机里。我写我广泛兴趣范围内的一切。查看我的 列表 了解更多故事。 成为媒介会员 访问我和其他作家的所有故事, 订阅通过邮件获取我的新故事 (平台原创附属链接)。

如何加速昂贵的算法

原文:https://towardsdatascience.com/how-to-accelerate-expensive-algorithms-aa497631abbd?source=collection_archive---------29-----------------------

通过记忆提高递归函数的性能

作者:爱德华·克鲁格和道格拉斯·富兰克林。

照片由 Florian Krumm 在 Unsplash 上拍摄

什么是记忆化?

记忆化是一种缓存类型,用于存储确定性函数的结果。更具体地说,记忆化是一种优化技术,用于通过存储函数调用的结果并在出现冗余输入时返回缓存的结果来加速程序。

换句话说,记忆防止程序两次运行相同的计算。

让我们用一个人为缓慢的 Python 函数来看看这种行为。

慢速 _ 函数. py

当我们运行slow_func.py时,我们得到以下输出:

请注意,有两个多余的计算;每增加一秒我们的执行时间。现在让我们编写这个函数的新版本来说明记忆化。

memoized_slow_func.py

在第三行,我们添加了一个空字典作为缓存。现在,在第 7–8 行,我们检查缓存以查看slow_func之前是否已经看到它的当前输入,如果存在则返回结果。第 13 行存储任何新的数字,它在缓存中是平方。

现在,当我们运行memoized_slow_func.py时,我们的输出如下所示:

注意,对于两个冗余输入,计算步骤已经被跳过,有效地将我们的运行时间减少了一半。现在你已经理解了记忆化的目的,让我们继续看一些更复杂的例子。

什么是斐波那契数列?

Paul Milasan 和 Aaron Burden 在 Unsplash 上拍摄的照片

斐波那契数列是一系列数字:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …

下一个数字是通过将它前面的两个数字相加得到的。

f(n) = f(n-1) + f(n-2)

该序列的一个重要特征是,序列中任何一个数字与前一个数字之间的比率都趋向于一个明确定义的值:1.618……这就是黄金分割率或黄金分割率φ (Phi),它经常自然出现。

观察植物、花或果实的几何形状,很容易识别重复结构和形式的存在。例如,斐波那契数列在叶序中起着至关重要的作用,叶序研究植物中叶子、树枝、花或种子的排列。

就我们的目的而言,斐波那契数列非常重要,因为它可以递归计算。随着输入大小的增加,递归函数的计算开销会变得非常大。

Python 中的斐波那契

斐波纳契数可以通过迭代计算**:**

迭代计算

或者递归:

递归计算

迭代计算将从斐波那契数列的开头开始,向上计数,直到到达输入索引。

递归计算模仿数学符号,这样做时,递归地调用自身。这意味着对于传递给fibo_rec的每个值,都要调用两次函数。这些调用还会产生更多对该函数的调用。因此,这是一个昂贵的计算。

让我们看看在有记忆和没有记忆的情况下,迭代和递归函数是如何执行的。

比较计算速度

我们在本节中使用的计时和跟踪装饰器(@tracefunc 和@timefunc)可以在本文中找到。

在我们深入研究每个函数的性能之前,让我们回顾一下与渐近时间复杂性相关的语言。

渐近复杂性

渐近计算复杂性是使用渐近分析来估计算法和计算问题的计算复杂性,通常与“big-O”符号相关联。

换句话说,使用渐近分析,我们可以根据输入大小了解算法的性能。在这样做的时候,我们应该找到运行时间和输入大小之间的关系,用“O”表示。

我们的斐波纳契计算是 O(n)和 O(2^n).

渐近复杂性或 Big-O 符号

递归斐波那契

回想一下,这是我们的昂贵计算。它的渐近复杂性是 O(2^n).

这里有一个traced_fibo_rec(8)的痕迹。注意有多少冗余输入,以及必须完成多少次函数调用才能返回一个输出。O(2^n)指的是 2⁸或 256 个打给fibo_rec的电话。

跟踪 fibo _ rec→大量计算

通话fibo_rec(8)计算在千分之一秒多一点。

递归函数的问题:回忆深度

当你给 Python 中的递归函数提供大的输入时,你会得到一个错误。这是为了避免堆栈溢出。Python 解释器限制了递归限制,从而避免了无限递归。

值得一提的是,您可以用sys模块改变最大递归深度限制。

记忆递归斐波那契

现在让我们将记忆应用到我们昂贵的计算中。

这里是cached_fibo_rec(8)的轨迹。

更少计算

注意对函数的调用减少了多少!这导致了更快的执行时间。

有了缓存,递归 Fibonacci 计算的速度提高了 133 倍。这是因为我们的函数只需要计算每个输出值一次。当出现冗余输入时,该函数从缓存中提取输出,而不是生成另一个深度递归堆栈!

通过给这个函数添加记忆化,我们把它的 big-O 符号从 O(2^n)改成了 O(n)。这是算法性能的巨大提高。

迭代斐波那契

这个函数 O(n)的渐近复杂度。这是因为它在斐波纳契数列中从 0 到 n 循环。

我们可以看到,调用fibo_iter(8)的计算时间不到万分之一秒。这个函数的运行速度与我们记忆化的递归版本基本相同,因为它们具有相同的渐近复杂度。

值得注意的是,由于前面提到的最大递归深度限制,迭代 Fibonacci 算法可以计算比递归算法更大的序列号。

记忆迭代斐波那契

最后,让我们将记忆化应用到迭代函数中,看看性能是否有变化。

对于这个算法,无论有没有缓存,我们看到的执行时间基本上是相同的。这表明记忆化对于快速函数(具有更好的 O 符号的函数)可能是无用的。也许对于这样的函数,计算输出的计算成本与访问缓存值的计算成本相同。对于非常快的函数,缓存访问甚至比计算冗余值还要慢!

结论

内存化是一种有用的缓存方法,可以优化具有冗余输入的昂贵函数调用的性能。在某些情况下,记忆化可以提高算法的渐近复杂性,这在递归或动态编程算法中很常见。例如,当我们将记忆化应用于具有 O(2^n 复杂度的递归算法时,我们看到了巨大的性能提升。在这种情况下,访问缓存比重复计算要快得多。

记忆化允许我们使用递归斐波那契算法。不过迭代计算还是比较优越的。

如何使用 Pandas 从 Python 访问 Google Sheets

原文:https://towardsdatascience.com/how-to-access-google-sheets-from-python-using-pandas-fe7669b73986?source=collection_archive---------11-----------------------

让我们看看如何在不使用奇怪的集成的情况下从 Python 访问 Google Sheets

作者图片

Google Sheets 是一个非常强大的(免费的)创建电子表格的工具。我几乎已经用工作表取代了 LibreOffice Calc,因为它使用起来非常舒适。有时,数据科学家不得不将一些数据从 Google 工作表中提取到 Python 笔记本中。在这篇文章中,我将向你展示如何用熊猫来做这件事。

首先要做的是创建一个 Google Sheet。对于本例,它将只包含 2 列,其中一列(年龄)缺少一个值。

这是我们将要使用的数据集。

现在我们必须让它在互联网上可见。为此,我们只需进入文件->发布到 web。

让我们选择“Microsoft Excel(。xlsx)”并使窗口看起来像这样:

当我们点击“发布”时,我们将能够复制如下所示的 URL:

这是 Google Sheet 创建的 URL,使我们的工作表可以以 Excel 格式下载。

我们现在可以转移到像 Google Colaboratory 这样的 Python 终端,并使用 Pandas 库来获取工作表的内容。我们可以简单地使用 URL 作为 Pandas 的 read_excel 函数的第一个参数的值。

这就是结果

如您所见,数据已经正确地注入到我们的数据框架中。我们还有一个与丢失值相关的 NaN。我们不需要担心数据类型,因为它们是直接从 excel 格式中读取的。

有了特定的论点,我们可以阅读特定的表,跳过一些行和其他东西。

通过这种简单的方式,我们可以直接从 Python 连接到 Google Sheet,而无需使用特定的 API 集成。很明显,Google Sheet 生成的 URL 将工作表公开,所以当你把它给任何人时都要小心。

如何 Ace ML 面试问题

原文:https://towardsdatascience.com/how-to-ace-ml-interview-questions-ae826387b583?source=collection_archive---------22-----------------------

在顶级公司的 ML 面试中,回答你被问到的问题不会让你得到工作机会

由 vector juice-www.freepik.com 创建的抽象向量

假设你接到你梦想中的公司招聘人员的电话,你已经申请了 ML 工程师的职位。你已经确定了日期,并开始准备像这种或类似的 ML 学习指南。在面试当天,你能够回答所有的问题,并有信心进入现场阶段。然而,你接到招聘人员的电话,说他们已经决定不进了。怎么会这样呢?

光回答问题是不够的,因为面试官想看到的是你对题目/问题的深刻理解。我喜欢把它想成类似于软件工程编码面试:如果你被要求在一个排序列表中搜索一个元素,一个正确但低效的答案是线性搜索列表中的每一项,然而,一个更好的答案是使用二分搜索法。同样,如果您被问及逻辑回归或线性回归对于分类任务更好,那么正确但不太好的答案就是简单地说逻辑回归,然而,更好的答案是添加分类任务违反线性回归假设的原因。这可能看起来有点矫枉过正,但当你在顶级公司面试时,你可以肯定所有到场的候选人都知道逻辑回归用于分类,但没有多少人会进一步解释为什么。

对于理论性的 ML 问题,通常会问你一个主要问题,面试官会根据主要问题提出 1-4 个跟进问题。回答时,正如我们之前所说的,仅仅陈述答案是不够的,你应该扩展它。扩展你的答案可以采取多种形式,例如陈述利弊,谈论替代模型/算法,写一个方程,甚至建议如何生产你的模型。这些额外的回答会让你从一个普通候选人变成一个“强有力的雇佣”候选人。

让我们看看下面的几个例子,以便更好地理解我们应该如何回答 ML 面试问题。

线性回归问答示例

由 vector juice-www.freepik.com 创建的抽象矢量

问题

假设你是一组医疗专业人员中的 ML 专家。他们正在进行的项目是确定病人的预期寿命。这将有助于他们完成下游任务。其中一位医疗保健专业人士建议,你可以使用线性回归。这种方法在这里合适吗?

候选人 1:

是的,可以使用线性回归,因为输出是一个实数(患者的预期寿命)。

候选人 2:

线性回归比较合适,因为我们预测的是一个连续值。

为了确认线性回归确实合适,必须遵循以下 4 个假设:

1。线性:这意味着自变量和因变量之间的关系必须是线性的。

2。同方差:残差(误差)有恒定的方差。

3。独立性:自变量(观测值)相关性不高,换句话说,它们是相互独立的。

4。正态性:对于我们观察的任何固定值,因变量是正态分布的。

需要记住的一点是,大多数公司会给应聘者打 1-5 分(或类似的分数),要想被录用,你需要让面试官认为你是一个更强的应聘者(4/5 分),要做到这一点,你需要彻底回答问题,而不是回答表面上的问题——这是你需要学习的技能。看上面的例子,候选人 1 可能得到 2/3 的评分,而候选人 2 得到 5 的评分。两个候选人都回答了这个问题,但是第二个候选人表现出他们对线性回归有更强的理解。

让我们来看看上述问题的后续问题:

假设你获得的特征是:一个人出生的年份、身体质量指数、出生的国家、每周饮酒量和出生时的国籍。但是,这些功能有一个问题,是什么?

候选人 1:

问题是出生时国家和出生时国籍之间存在共线性。这意味着它们高度相关。

候选人 2:

问题是出生时的国家和出生时的国籍之间存在共线性。这意味着它们高度相关:出生时的国家可以预测出生时的国籍,反之亦然。这成为一个问题,因为我们失去了可解释性,因为我们将无法区分两个共线变量的个别影响,这违反了线性回归的假设之一(独立性)。

我们可以通过使用方差膨胀因子(VIF)来识别共线性。VIF 给每个独立变量打分,这个分数表明它被其他独立变量解释得有多好。分数高于 5 通常被认为表示共线性。我们通常可以通过移除其中一个要素或线性组合两个要素来解决共线性问题。由于两者都是分类价值观,取消出生时的国家或出生时的国籍将是最佳选择。

通常情况下,当您收到一个关于问题可能是什么的问题时,您应该始终考虑分两部分回答这个问题:

  1. 确定问题
  2. 提供解决问题的方法(这第二部分表明你是一个强有力的候选人)。

同样,候选人 1 回答了问题,但他们没有表现出对该主题的专业知识,可能会得到 2/3 的评分,而候选人 2 表现出对该主题的精通(共线性),因此会得到 5 分。通过这种方式回答问题,你向面试官展示了你是一个强有力的候选人,会比面试这个职位的其他候选人排名更高。

如何赢得 ML 工程师带回家的面试练习

原文:https://towardsdatascience.com/how-to-ace-the-ml-engineer-take-home-interview-exercise-daf5ba590de4?source=collection_archive---------9-----------------------

办公时间

每个 ML 工程师都应该完成的最重要的第一轮

JESHOOTS.COM 在 Unsplash 上的照片

这篇文章的灵感来自 Tessa Xie ,她最近写了一篇关于数据科学(DS) 带回家练习的文章,她在文章中分享了 DS 带回家练习的为什么如何以及应该如何进行。

在过去几个月的面试中,我最近获得了一份在https://dictionary.cambridge.org/dictionary/english/decacorn十日学校担任 ML 工程师的工作,我认为分享我在做 ML 工程课后练习时学到并应用的东西是有益的。

首先,简单介绍一下我自己…

  • 在新加坡出生、长大和工作
  • 2017 年毕业,经济学和金融学学士,加入一家日本投行
  • 边磨边 2020 年初转行 AI/ML(此处 了解更多 !)
  • 在月底的十月转换到一个新的 ML 工程职位

接下来,快速免责声明…

我并不自称是这方面的专家,但我想分享一下过去几个月我做这些工作时对我有用的东西。此外,根据你所申请职位的资历,这些收入可能会有所不同。

我们开始吧!

在过去的几个月里,我申请了(大部分)职位名称为“ML 工程师”的初级-中级职位(下面的示例职位描述截图*)。*

典型机器学习工程师的示例 JD

当然,有些公司没有任何带回家的评估(在我看来,这已经被证明是这些公司的一个危险信号!)而那些提供这些信息的公司通常会在第一轮面试前提供这些信息。这些回合的典型结构如下:

招聘人员/人力资源电话筛选→带回家的评估→技术筛选(1 到 3 轮)→行为筛选(即适合/酒吧老板类型的面试)

在我做过的这些带回家的评估中,它们有许多共同点,通常有以下要求:

  1. 🗺探索性数据分析
  2. 🧑🏼‍💻系统模型化
  3. 🤖API 服务
  4. 🪵伐木公司
  5. 🧪单元和集成测试
  6. 🐳集装箱化
  7. 📙证明文件

在我分解之前💡外卖和⚠️抓住了上述 7 项要求,在处理自己的带回家评估时,记住以下几点非常重要

  • 留出时间集中评估。这些带回家的申请通常会给你一到两周的时间来完成,但是申请通常是在滚动的基础上完成的(,也就是说,你完成得越快,你的面试就能进行得越快*)。记住,你也在和很多其他候选人竞争!力争在 48 小时内完成评估,这样你几乎可以保证进入下一轮(假设提交的材料很好),你也给面试官留下了一个好印象,因为这表明你熟悉这些要求。*
  • 优先!对评估中陈述的要求保持高度警觉*。有些评估甚至可能不包括所有的服务器需求,而有些评估可能更多地关注某些需求,而较少关注其他需求。48 小时是完成所有七项要求的非常短的时间——根据您收到的评估中所述的重点对它们进行优先排序。*
  • 保持简单,笨蛋(吻)。带回家的评估应该在很短的时间内完成,因为面试官不想浪费应聘者太多的时间。不要把它当成一个机会,在一个简单的玩具问题上炫耀你过于复杂的技术。过度工程是绝对不允许的。
  • 像工程师一样编码。你在“ML 工程师”里看到“工程师”这个词了吗?是的,你应该很好地编写代码,并遵循最佳实践。这意味着没有死代码,良好的代码格式,模块化的代码,遵守相应的语言风格指南(例如 PEP8 )等等。是的,这里也需要好的文件夹结构。

记住这一点,让我来分解这 7 项要求。

探索性数据分析

每个数据集都有自己的细微差别。理解所提供的数据集背后的细微差别将允许您选择正确的模型来解决问题。此外,面试官“修改”数据集是很常见的,因为他们想看看你是否能找到他们有意注入到数据集中的“错误”。

需要注意的常见事项(非详尽):

  • 缺失数据(选择插补方法或删除数据)
  • 离群值(以及如何处理它们)
  • 相关特征
  • 完全没有意义的数据

💡要点:理解并整理你正在处理的数据集。始终对重要的决策选择提供清晰的解释(例如,放弃还是指责)。从单变量图开始,然后转移到双变量和多变量图,同时提供清晰的洞察力

⚠️ 明白了:避开自动化 EDA/绘图工具。它一般不会给评审者留下好印象。

系统模型化

建模对于 ML 工程师来说不太重要,因为创建和调整这些模型通常是 DS 的工作。无论你选择哪种型号,都要确保你了解它是如何工作的。

💡要点:选择一个适合问题陈述的模型。线性模型通常就足够了(除非需求中另有说明)。

⚠️ 明白了:不要选择你不了解或者过于复杂的模型(即需要很长时间训练)。

API 服务

每个 ML 工程师的面包和黄油。随着模型越来越普遍地被部署为 API 微服务,知道如何为端点提供服务是至关重要的。

构建 API 端点时需要注意和理解的事项:

  • 模型加载/重新加载
  • 每个端点的延迟要求
  • 方法类型
  • RESTful API
  • 每个路由器的文件夹结构

💡要点:在设计 API 端点时使用最佳实践——确保您理解何时应该使用路径或查询参数。必要时使用模式定义响应和数据库模型*。独立的输入处理和端点逻辑。永远测试你的端点!*

⚠️ 明白了:请记住,API 服务通常会在带回家的评估中进行测试,但它不是唯一的微服务架构。消息传递也非常常用(但很难作为带回家的东西包括在内)。在这里阅读更多。

测井

这个要求起初可能看起来不太重要,但它将初学者与业余爱好者和专家区分开来。在生产环境中,日志记录是至关重要的,因为它通知维护人员代码在哪个点被执行,以及随之而来的严重程度。本质上,这些消息应该通知您应用程序的健康状况。

💡要点:包括登录你的模块。如此简单却经常被忽视的需求。

单元和集成测试

测试经常被新手程序员忽视,因为他们可能没有足够的经验来了解测试的真正价值。通过编写有效的测试,您可以向评审者证明您理解它的重要性以及测试如何适应软件生命周期。

集装箱化

随着微服务架构成为规范, Docker 也成为了容器的同义词。您可能会期望使用 Docker 来封装您的应用程序。

💡外卖:在封装你的应用程序时展示最佳实践。根据经验,总是创建一个尽可能短暂的容器。记住— 少即是多

证明文件

总是要有好的函数和模块文档。此外,记得在README中或者使用文档生成器(例如 Sphinx )记录其他高层决策。这包括以下内容:

  • 回购为何以某种方式构建
  • 模块使用
  • 代码的设置和运行
  • 为什么选择某些模型(算法)
  • 模型评估指标
  • 模型结果可解释性
  • 需要更多时间才能实现的改进

💡要点:你的代码大部分应该是自文档化的。专注于记录你的代码没有解释的设计选择。

恭喜你晋级下一轮!现在怎么办?

为后续技术回合做准备与第一回合一样重要。这些后续回合通常会询问与带回家评估相关的后续问题,例如:

  • 解决您可能忽略/遗漏的一些需求
  • 可用于解决问题的替代模型(及其利弊)
  • 如何纵向扩展 API 服务(例如横向和纵向扩展)
  • 如何提高 API 服务的效率(例如,内存缓存、数据库索引、使用消息队列等)
  • 设计选择的替代方案

结束语

ML 工程师带回家的评估可以采取多种形式,但我发现以上是典型的“ML 工程师”的反映。如果你的带回家的评估更倾向于 EDA 和建模,你的角色可能更倾向于数据科学家的职位。在这种情况下,我建议看看这篇文章。

再次感谢您阅读我的文章。如果你对 ML 工程带回家练习有任何想法,请留下你的评论!:)

支持我! —如果你喜欢我的内容并且没有订阅 Medium,请考虑支持我并通过我在这里的推荐链接订阅 ( 注意:你的一部分会员费将作为推荐费分摊给我)。

如何用“旧的、新的、借来的”赢得下一次数据科学面试

原文:https://towardsdatascience.com/how-to-ace-your-next-data-science-interview-with-something-old-something-new-something-borrowed-ba1e84d2cf22?source=collection_archive---------30-----------------------

在数据科学评估中,当面试官或招聘人员要求你对一个众所周知的玩具数据集“给出一些见解”时,该怎么办

伊恩·施耐德在 Unsplash 上拍摄的照片

事业就像婚姻——我们在 20 多岁的时候探索我们的选择,然后在 30 多岁的时候和我们爱的人稳定下来(理想状态下)。接近 30 岁时,我终于意识到作为一名数据科学家从事自由职业将是我的长期职业。我将向你们展示我是如何在第一次面试中胜出的。

今年早些时候,当我申请一个数据科学家的职位时,我被要求“使用假设检验来对波士顿房价数据集给出一些见解”。我只花了几个小时就完成了,我的面试官说我的数据科学评估是他迄今为止看到的最好的评估,他确实学到了一些新东西。

我是怎么做到的?我将从三个方面来阐述我的投稿:旧的东西、新的东西、借的东西。我提交的全部内容也可以在这里找到。

旧的东西

你可能会想,既然每个候选人都在同一个数据集上工作,你必须立刻从人群中脱颖而出。但是请记住,面试官或招聘人员想要雇用的人可以做数据科学家的日常工作,这些工作几乎总是由简单的数据清理和简单的统计组成。你的提交应该表明你拥有这样的技能。

描述性统计和数据清理

总是从数据清理开始——即使它是一个肯定结构良好的玩具数据集。你做这一步是为了向你的面试官或招聘人员证明,一旦你进入公司,你可以对实际数据这样做。在我的提交中,我只是检查是否有任何数据丢失:

df.isna().sum()

然后你可以计算描述性统计:平均值、标准差、四分位数、众数、最小值和最大值等。

df.describe() df.mode()

我没有太多的数据清理工作要做,没有一个值是空的,并且大多数特征实际上没有显示任何异常的最小值或最大值。但我很快注意到房价有一个不正常的最高值——最高价为 5 万美元,而平均值和上四分位数都不到 3 万美元。所以我很快查了一下房价频率表:

df.target.value_counts()

我看到 506 个样本中有 16 个样本的房价都是 50.0 英镑(以 1000 美元计),这似乎是在没有数据的情况下的虚拟值。所以我决定筛选出那些样本。

df = df[df.target < 50]
print('No. of samples left:', len(df))

两行代码筛选掉不需要的样本,并检查剩余的样本数。在继续之前,一定要确保仔细检查,以确保您的代码完全符合您的要求。

从描述性统计数字中,我看到“住宅用地的地段比例”和“非零售商业的比例”都主要为零。“人均犯罪率”也有一个平均值等于它的上四分位数。所以我们已经可以预期他们有正偏态分布。我们必须充分了解我们的统计数据,甚至在绘制数据之前就知道会发生什么。

最后但同样重要的是,我绘制了所有特征的直方图:

hist = df.hist(figsize=(20,20))

数据集中所有要素的直方图(按作者分类的图像)

大多数分布都不是正态分布。我决定记下这一点,以后再讨论这个问题。

相关性分析和数据可视化

如果您的要素和目标是数值型的,那么您必须首先执行相关性分析,以了解数据的双变量属性。最常用的方法应该是皮尔逊相关。然而,我决定用相关性分析对做点新的,这将在下面的中进一步讨论。

值得一提的是,我花了相当多的时间来弄清楚如何最好地可视化 14x14 的互相关矩阵。显示 196 个没有任何注释的数字会让我的观众非常困惑。我最终决定使用热图来可视化相关系数:

*# plot heatmap of correlation coefficients*
fig, ax = plt.subplots(figsize=(20,20))
im = ax.imshow(corr.correlation, cmap='twilight_shifted')

ax.set_xticks(np.arange(nf+1))
ax.set_yticks(np.arange(nf+1))
*# ... and label them with the respective list entries*
ax.set_xticklabels(df.columns)
ax.set_yticklabels(df.columns)

*# Rotate the tick labels and set their alignment.*
plt.setp(ax.get_xticklabels(), rotation=45, ha='right',rotation_mode='anchor')

*# annotate correlations on top of figure*
idx = 0
for i **in** range(nf+1):
    for j **in** range(nf+1):
        if i!=j: *# omit diagonal*
            text = ax.text(j, i, str(corr.correlation[i, j].round(3))+''+str(p_sig[idx]), ha='center', va='center', color='w') *#rounding to 3 decimals*
        idx += 1
ax.set_title('Spearman\'s correlation')
fig.tight_layout()
fig.colorbar(im)
plt.show()

互相关矩阵的可视化(图片由作者提供)

一定要解释你的图形的含义和每种颜色的定义。此外,评论你能看到的任何模式,并尝试给出一些解释。

特征选择

为了测试每个变量的单独影响,我使用一个线性模型,将每个变量作为回归变量,并按照 p 值的降序将输出很好地格式化到一个表格中以供查看:

f_regr = sklearn.feature_selection.f_regression(X, y, center=True)
f_regr_df = pd.DataFrame()
f_regr_df['Feature'] = data['feature_names']
f_regr_df['F score'] = f_regr[0]
f_regr_df['p value'] = f_regr[1]
f_regr_df.sort_values(by='p value')

我还进行了基于 L1 的特征选择以及递归特征消除。

有许多功能选择方法可供选择。数据科学评估的关键是给出基本原理,并为您选择的方法提供支持。面试官希望看到你的数据科学沟通技能,而不是在不现实的玩具数据集上的最佳特征选择方法。

线性模型

线性模型应该是大多数数据科学任务的首选工具。如果线性模型对您的数据表现良好,那么您可能没有必要探索需要更多超参数调整和计算资源的非线性模型。

在我的提交中,我从最基本的线性回归开始作为我的基线模型。然后我应用了正则化技术来看看它们是否能提高模型的性能。我确保在提交的材料中解释了每种正则化方法的效果。

新的东西

假设你已经做了其他候选人可能会做的所有事情,那么是时候坚持一英里了。想想你能做些什么不同寻常的事情。考虑可以替代更流行技术的技术。也就是说,重要的是确保你提供了这样做的基本原理,并且你选择的技术有益于模型。

选择斯皮尔曼相关性而不是皮尔逊相关性

我做的第一件事是使用斯皮尔曼相关,而不是更常见的皮尔森相关。Spearman 相关性更广为人知的可能是应用于顺序变量,但它也有很大的优势应用于连续的数字数据,因为对它们的分布没有任何假设。相反,皮尔逊相关系数假设两个变量都是正态分布的,它们之间的关系是线性的。

我的数据集中的变量既是有序的又是连续的,直方图告诉我它们并不都是正态分布的。基于这些观察,我使用了 Spearman 的相关性,并在我的提交材料中解释了我的选择以及这一选择带来的优势。

Yeo-Johnson 电力变换

我在上面提到过,我记下了我的大部分变量不是正态分布的事实。经过一番研究,我找到了一个解决方案,我想把它展示给我的面试官,那就是 Yeo-Johnson 权力转换。

由于这可能是我的面试官从未听说过的事情,我额外努力解释了我们为什么需要 power transform — 因为许多常见的模型都假设变量是正态分布的。我还通过重新绘制所有直方图来可视化转换的结果:

Yeo-Johnson 幂变换后的直方图(图片由作者提供)

直方图显示并非所有的转换都是成功的。但是我们可以看到一些变量变得更加正常了。然后,我将根据原始数据训练的一些模型重新应用到新转换的数据上,以查看模型性能是否有任何变化。

展示你更高级的机器学习技能,即使数据集可能不需要它

在我的报告接近尾声时,我展示了一些更高级的机器学习技巧,通过交叉验证应用了随机森林回归器

rf = RandomForestRegressor(random_state=1)

random_grid = {
    'bootstrap': [True, False],
    'max_depth': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, None],
    'max_features': ['auto', 'sqrt'],
    'min_samples_leaf': [1, 2, 4],
    'min_samples_split': [2, 5, 10],
    'n_estimators': [200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000]
}

rf_random = RandomizedSearchCV(estimator = rf, param_distributions = random_grid, n_iter = 100, cv = 3, verbose=2, random_state=1, n_jobs = -1)
*# Fit the random search model*
rf_random.fit(train_X, train_y.ravel())
rf_random.best_params_

以及支持向量回归(SVR)与 RBF 核。

svr = SVR()

random_grid = {
    'C': [0.1, 1, 10, 100],
    'gamma': ['scale', 'auto']
}

svr_random = RandomizedSearchCV(estimator = svr, param_distributions = random_grid, cv = 3, verbose=2, random_state=1, n_jobs = -1)
*# Fit the random search model*
svr_random.fit(train_X, train_y.ravel())
svr_random.best_params_

我也趁机解释了为什么没有用更复杂的深度学习方法:

该数据集的样本量很小。因此,许多深度学习方法可能不适用,或者我们可能会冒过度拟合数据的风险。

最后,我让面试官知道如果给我更多的时间,我还能做些什么:

理想情况下,我们希望迭代每个模型的不同特征选择方法。由于时间限制,这里没有这样做,所以许多模型只是使用一种基于直觉的特征选择方法。

借来的东西

首先,不要抄袭。尽管称之为“借用”,但我并不意味着你应该只是看看其他人对相同数据集做了什么,然后把它放到你的提交中。

当你接到任务,只有 XX 个小时来完成时,你可能很想马上开始,一头扎进数据集。尽管查看数据集和任务的描述是一个好主意,但还是要花时间进行研究。以下是一些你可以遵循的基本步骤:

  1. 确定您的任务是分类、回归还是其他非结构化/无监督的任务。
  2. 转到你最喜欢的软件包,在我的例子中是 scikit-learn ,并检查他们为你的任务提供的可用功能,例如这个关于监督学习的页面。你可能知道很多其他的软件包或算法,但坚持使用最常用的可以确保你的面试官或招聘人员可以复制你的结果,你不需要重新发明轮子。
  3. 转到 Kaggle Notebooks ,在精确的数据集上搜索笔记本(如果您的数据集是众所周知的),或者搜索与您的数据集相关的关键词,例如“预测房价”。不要抄袭别人的代码,但是要浏览足够多的笔记本来了解你的提交中必须包含的内容。这将是你的“旧东西”。
  4. 此时,您可能可以开始编程了。从描述性统计和一些初步分析开始,您可能会发现数据集的特殊属性。(在我的例子中,非正态分布。)记下你的数据集的这些特征,因为这些将是你的“新事物的基础。
  5. 为你的“新事物”做研究。设计一个好问题,这样简单的谷歌搜索就能给你想要的结果。在我的例子中,我搜索“如何转换非正常数据 sklearn ”,第二个结果是我需要的 Scikit-Learn 文档上的教程页面。

外卖食品

每个数据科学练习都不同。在这种情况下,我被要求做一个简单的回归任务,而你可能被要求做一个分类或自然语言处理(NLP)任务。这篇文章的关键不是技术细节,而是你可以应用到自己的评估中脱颖而出的整体结构。

除了向你的招聘人员或面试官展示你知道所有的东西,确保你给他们一些新东西,这样他们就知道你与所有其他候选人不同。最后但同样重要的是,在开始评估之前,研究一下其他人的工作是值得的。借用他们的知识,而不是他们的工作。

祝你下次求职面试成功。或者我应该说,祝你好运,找到一份你想在余生从事的职业。

关于作者:我是一名自由数据科学家和 ML 工程师。我为贵公司的数据科学和机器学习需求提供定制解决方案。更多信息请访问www.CathieSo.com

实际预测新冠肺炎

原文:https://towardsdatascience.com/how-to-actually-forecast-covid-19-778cce27b9d6?source=collection_archive---------4-----------------------

一个关于预测新冠肺炎的完整教程,包含 Python 代码

作者图片

这是一个关于预测新冠肺炎的全面而现实的教程,用 Python 代码来实现你自己的。

为什么要听我说的话?嗯,我是这篇论文的作者:多病毒株的流行病建模:新型冠状病毒 B.1.1.7 在莫斯科的案例研究。这个任务的复杂性让我头疼了几个月,现在我想帮你省去这个麻烦。

Jupyter 笔记本附带教程代码。

另一个新冠肺炎预测教程?

有大量预测新冠肺炎的材料。在 2021 年 1 月的头几天,我听说了英国的冠状病毒株,以及美国第四波的预测。我很好奇:这是否会在我的城市莫斯科引发新的浪潮?于是我踏上了新冠肺炎模特之旅。我期望它在两周内完成。新冠肺炎肯定是目前研究最多的东西,肯定有人开发了一个我可以使用的模型,对吗?

不对。旅程花了三个月。事实证明,几乎没有任何关于建立流行病学模型的充分信息。大多数教程和论文都忽略了重要的细节,比如:

  • 为什么要选择特定的型号?
  • 参数究竟是如何优化的?
  • 如何测试模型?它的预测效果好吗,还是仅仅符合训练数据?
  • 该模型与基线相比如何?比仅仅预测前一天的情况更好吗?
  • 模型是否推广到多个流行病波?不同地区?

最热门的发现:大多数关于模拟新冠肺炎的顶级出版物的作者没有使用训练测试分割。也就是说,他们从来没有检查模型是否真的预测,他们只是检查产生的曲线看起来很像历史数据。

我花了好几个星期试图找出有效的方法,并想:“希望有人能写清楚这一点!”。那会节省我几周的时间。这篇教程是我试图成为那个人,并节省你几个星期的修补。

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

在莫斯科为新冠肺炎做模特

首先,我们需要关于感染、死亡和康复的历史数据。莫斯科的数据可以在本页免费获得。我使用了 2020 年 3 月 10 日至 2021 年 3 月 23 日的时间框架。

初始数据集覆盖了整个俄罗斯,但流行病模型最适合封闭人群,所以我们只选择莫斯科的数据。

数据的输入通常有一些滞后,所以让我们添加所有列的移动平均平滑版本,以便以后使用。

因此,我们的数据集包含以下各列及其平滑版本:

  • 每天感染病例数—给定日期的新确诊病例数,
  • recovered_per_day —给定日期的新康复患者,
  • 每天死亡人数—给定日期的死亡人数(因感染),
  • total_infected —确诊病例总数,每天累计的感染总数。
  • total _ dead 死亡总数,每天死亡的累计总数。
  • total_recovered —已恢复的患者总数,每天已恢复的累计总数。

数据集预览,按作者分类的图像

基本模型:SEIR

让我们从流行病模型之父开始吧,先生。 SIR 是一个模拟疫情在时间上发展的简单模型。它将人群分为三组:易感人群、感染人群和未感染人群。

爵士的想法解释得很简单:

  • 有一个封闭的人群和一个初始的感染人数。
  • 每一天,每个感染者都有一定的概率感染易感人群中的某个人。
  • 感染组中的某个人在疾病期结束后康复,并转移到恢复组。
  • 这种算法会持续很多天。

SIR 没有对潜伏期和死亡进行建模,这意味着我们应该直接跳到扩展部分,SEIRD。塞德的工作方式和爵士一样;但是,它增加了两个组:

  • 暴露——受感染的人正在经历潜伏期。他们不会传播病毒。
  • 死者——死于病毒的人。

为什么选择 SEIRD 作为基础型号?不是最强的机器学习模型,其实很简单。应该使用 SEIRD 的原因有三个。首先,它不是一个黑匣子:SEIRD 的参数仅仅是疾病的特征。我们可以根据新冠肺炎作为一种疾病的医学研究来估计它们。第二,该模型很容易修改,这就是我们很快将通过增加隔离措施、不完全统计和第二个菌株来做的事情。值得一提的是,尽管 SEIRD 有缺点,但迄今为止最好的新冠肺炎预测模型是一个改进的 SEIR 模型。对于一些高中水平的微分方程来说很酷,对吧?

让我们更深入地了解塞德。以下微分方程定义了人口组每天的变化:

作者图片

看起来很吓人,但是请原谅我:这是高中的算术。

以第三个等式为例。它描述了 I 组每天的变化。第一项意味着来自组 E 的每个人以概率 δ 完成他们的潜伏期并移动到组**I,因此****【δE(t)****被添加到 I 。其他术语描述了每天有多少人离开被感染的群体。组 I 的每个人恢复或死亡一个概率 γ 并移动到组 RD 。参数 α、 即感染致死率 决定一个人是否死亡并转到组 **或恢复并转到组

总而言之,随着人们离开潜伏期,受感染的人数每天都在增加,同时,康复的和死亡的个体也离开了受感染的群体。

模型的参数:

α —病死率。

β —每天一个病人感染的人数。

—1 除以潜伏期的平均持续时间。

y — 1 除以平均病程。

R0 = β/y —基本复制数。在疾病的整个持续时间内被一个病人感染的人数。

经典 SEIRD 的实现

要实现 SEIRD,我们只需将微分方程转换成代码。这是实现,我们马上会详细介绍它的细节:

代码太多了,让我们看看这里发生了什么。

方法 get_fit_params 初始化参数。我们为此使用了优化库 lmfit,但是我们还没有优化参数。现在,我们使用结构 lmfit。参数作为高级字典。我用了一个新冠肺炎特性的元分析来预定义参数的范围,这对优化帮助很大。

参数epidemic _ started _ days _ ago允许设置第一个感染者出现的日期。据我推测,这件事发生在 2020 年 3 月 2 日。

方法步骤是模型的核心,它包含了模型的微分方程。它实现了一天组的更新。作为输入,它接收天数 t 和所有组的初始大小作为元组 initial_conditions 。它返回所有组中的更改。

方法 predict 接收初始值和数组 t_range 作为输入数据。它所做的就是使用我们的方法步骤应用 scipy.integrate.odeint 。它对 t_range 中的天数的微分方程进行积分,并输出所有天数的组大小。本质上,它是运行我们模型的方法。

最后,方法 get_initial_conditions 从第一个感染病例在epidemic _ started _ days _ ago天出现开始建模,并返回初始组大小。

让我们运行我们的模型,并将它的预测与现实进行比较:

由经典 SEIRD 模型预测的累积死亡人数(图片由作者提供)

Woops,模型预测大家都死了或者痊愈了,疫情就已经结束了。结果非常糟糕,但并不出人意料:我们没有优化任何参数,而且这个模型对新冠肺炎来说太简单了。

为了验证后一种说法,我们来看看所有赛德尔集团的动态:

SEIRD 模型的完整输出(图片由作者提供)

模型描述的只是一次感染波,之后几乎所有人都康复,获得群体免疫,疫情告一段落。即使我们选择了最好的参数,这个模型也不是为了描述多重感染波而设计的。我们应该改变方程组以获得更好的结果。

添加隔离措施

**出现新浪潮的原因之一是检疫措施。假设措施日减少【R0】的病乘的百分之。因此,可以计算在某种检疫措施作用下的繁殖数:**Rt = R0—R0 * q(t)每天。从中我们可以计算出 β(t) = Rt * y 并在方程中使用。

最后要考虑的是函数 q(t) 。在我的研究中,我使用了一个基本的阶跃函数。我们将整个日期范围分成 60 天的间隔。对于每个时间间隔,我们都在给定的时间间隔内设置了一定级别的隔离措施。从一个间隔到另一个间隔的过渡应该是平滑的(例如,通过使用 sigmoid 函数)。否则,函数将不会平滑,我们将无法优化参数。

这是一个带有 sigmoid 转换的逐步函数的实现,带有一个玩具示例:

平滑逐步隔离级别函数的玩具示例(图片由作者提供)

要将此添加到我们的 SEIRD 模型中,我们应该采取以下步骤:

  1. 将检疫乘数添加到 get_fit_params 中。最初,隔离级别为零;但是,它在其他区间的级别由优化定义。此外,我们添加了一个新的超参数,它设置了时间间隔的长度: stepwise_size ,默认值为 60 天。
  2. 添加一个新方法 get_step_rt_beta ,该方法使用一个阶跃函数计算*【t】*Rt
  3. 在方法步骤中使用 get_step_rt_beta

这样,我们的模型就能够考虑隔离措施了。但这就够了吗?不完全是。

不完整的统计数据

众所周知,并非所有的感染病例都记录在官方统计中。许多人没有住院,其他人携带疾病却没有症状。我们必须在我们的模型中考虑这些事实,因为经典的 SEIRD 模型从表面上看数据集,并不期望它是不完整的。

让我们改变模型的分组,将案例分为统计数据中记录的案例和我们看不见的案例:

  • 【Iv(t)—传播病毒,在统计中有记录。
  • I(t) —传播病毒,不在统计记录中。
  • —从病毒中恢复,记录在统计中。
  • 【t】—从病毒中恢复,未记录在统计中。
  • 【Dv(t)—死亡,统计中有记录。
  • D(t) —死了,统计中没有记载。

其他组, SE 保持不变。

此外,我们添加了两个新参数:

  • pi —被感染病例被统计记录的概率。基本上概率能进 Iv 组。
  • pd —统计中记录死亡的概率,即使感染病例没有被记录。来自组 Iv 的被感染个体总是去组 Dv

最后,我们有下面的模型方案,其中图的顶点是组,箭头决定人们如何在组之间移动:

SEIRD-H 原理图。有点像太空船,这很好。(图片由作者提供)

该模型被命名为 SEIRD-H: SEIRD with hidden states。更详细的实现在这里给出。

参数优化

模型准备好了。剩下的唯一事情是找到参数的最佳值,以便通过使用最小二乘优化的方法,由模型生成的 Iv(t)、Rv(t)和 Dv(t)对应于真实数据。

让我们使用 lmfit.minimize 。此函数接收一个可调用的作为输入,它返回一个残差列表并选择参数以最小化它们的总和。默认算法 Levenberg-Marquardt 方法非常适合该任务,但必须知道不能优化离散参数。例如,它不能为我们选择 stepwise_size 。这就是我们必须平滑隔离功能的原因。

让我们看一下代码:

主旨很简单。在间隔 t_vals 中的每一天,我们都会收到预测的感染病例、死亡病例和康复病例。此外,计算并存储预测值与真实值的偏差。

之后,我们需要一些技巧。首先,新感染病例和新死亡病例的范围不同。在某一天看到一千个新病例,而同一时间只有一个人死亡,这是司空见惯的事。因此,如果我们只使用绝对残差,优化将只由感染病例的残差来定义。让我们使用函数 smape_resid_transform 将所有残差转换为相对误差,从而将它们重新调整到[0,1]范围。

其次,有理由认为死亡统计数据比感染和康复病例数据更可信。为了将这个假设添加到优化中,让我们用自身权重中的值来加权残差。在我们的情况下,死亡残差为 0.5,其他为 0.25 似乎效果最好。

模特培训

现在有了隔离措施和隐藏状态,我们都准备好了!让我们在平滑的系列上训练 SEIRD-H 模型。

获得的参数:

获得的模型参数(图片由作者提供)

通过第三代 H 模型对训练数据的累积死亡预测(图片由作者提供)

比早先获得的经典 SEIR 结果好得多!参数表明,根据我们的优化,几乎一半的死亡没有在统计中登记。对于感染病例,只有大约五分之一的病例有记录。

这是学习的隔离功能:

模型学习的隔离功能,以及它如何影响 Rt(图片由作者提供)

人们应该小心 SIR 模型:一个模型可以显示关于死亡的真实预测,同时预测比现实多十倍的恢复病例,或者以其他方式作弊。查看模型的所有预测组件是有帮助的:每天的死亡、康复和感染病例。

SEIRD-H 在训练数据上的完整输出(图片由作者提供)

完美,一切看起来都很好。模型当然会出错。重要的是,它似乎抓住了主要趋势。

交叉验证的模型验证

训练数据上的好数字没有告诉我们任何关于真实数据上的预测。我们必须验证这个模型的预测能力。在关于模拟新冠肺炎的出版物中,模型质量是通过预测累计死亡人数来评估的,所以我们也使用它。

我们将使用时间感知交叉验证。验证过程是这样的。从训练数据中选择几个日期,例如,每 20 天,对于每个日期:

  • 使用给定日期之前的所有数据来训练模型。
  • 预测未来 30 天的累计死亡人数。
  • 计算预测误差。

最后,计算模型的平均误差,并与基线持续性模型进行比较,基线持续性模型只是预测最后一个训练日。

时间感知交叉验证的例子(图片由作者提供)

结果:

  • 基线平均绝对误差:714。
  • 模型平均绝对误差:550。
  • 模型对称平均绝对百分比误差:4.6%

模型击败基线,误差在 5%左右。

最后的话

这就是了。我们实现了经典的 SEIR 模型,我们通过添加隔离措施和隐藏组来处理不完整的数据,我们优化了参数。并使用时间感知交叉验证来验证最终模型。准确度没那么令人印象深刻,但是问题真的很难。从这一点出发,我们可以通过改进模型、重新运行评估过程和检查错误来进行迭代。一个很酷的特点是,该模型不是特定于数据集的:它可以用于其他地区和其他疾病。

感谢您的阅读,我希望您发现本教程有用!

放弃

这里表达的想法和观点仅是我个人的,不代表任何机构的观点。本出版物具有教育性质,不应被视为医疗建议。

如何找到一份数据科学的工作

原文:https://towardsdatascience.com/how-to-actually-land-a-data-science-job-b43e8f4187b2?source=collection_archive---------20-----------------------

办公时间

最大化你成功机会的 5 个步骤

在 Unsplash 上由Christina @ wocintechchat.com拍摄的照片

我收到的最常见的问题是我如何真正进入数据科学领域?很多人想在数据科学领域开始职业生涯,但很难迈出第一步。

而且我不会说谎,这是一个步。

你在与公司和招聘者竞争,他们总是想要有经验的候选人,而你却在寻找开始积累行业经验的机会。那么——你打算怎么办?

虽然我不能保证你成功,但我可以给你一个可以遵循的过程,尝试并最大化你获得第一份数据科学工作的机会。当我第一次进入这个领域时,我自己也使用了这个过程,它也包含了我发现其他人用来迈出第一步的重要步骤。我希望这 5 个步骤至少可以帮助你感觉到自己正在取得真正的进步,朝着获得第一份数据科学工作的目标前进。

你想要什么样的角色?

作者图片

数据科学面临的挑战之一是,它实际上不是一个领域,而是一个由许多不同类型的工作组成的领域。在开始工作时,考虑你喜欢什么样的角色以及在什么样的公司工作是很重要的。我看到了 3 个非常常见的角色:

  • 分析师 —通常专注于从数据中创建可操作的情报。这通常可以通过仪表板、报告、统计和数据挖掘来实现。
  • 数据科学家 —通常创建能为公司创造价值的预测模型。例如,数据科学家可以创建一个模型来预测哪些客户会流失。
  • 研究科学家 —专注于推动最先进技术的发展。通常是做研究和在会议上发表论文。

花些时间对这些角色以及您在数据科学领域看到的其他潜在角色进行更深入的研究。如果你能缩小你想从事的职业范围,找工作会变得容易得多。例如,如果你决定要成为一名研究科学家,你需要的技能和经验与分析师有很大不同。

此外,不同的角色可能更难获得。我倾向于发现分析师角色是最容易的,然后是数据科学,最后是研究科学家角色。这主要是因为对这些角色的需求。如今,几乎每个公司都以某种形式雇佣分析师,但没有多少公司雇佣真正的研究科学家。

在考虑了角色的类型之后,现在考虑你想去的公司的类型。你可以在很多轴上思考公司。例如,规模、行业和地理位置等等。公司的类型很重要,因为不同类型的公司雇佣不同的数据角色。大公司往往有一个非常严格的流程,大多数候选人都必须通过,而在小公司,通常主要根据推荐或关系进行招聘。

你的第一个任务是考虑你想在什么类型的公司工作。在这上面花点时间,写下你的想法。保持密切联系,因为它会影响所有后续步骤。

开始建立你的人际网络

在 Unsplash 上 veeterzy 拍摄的照片

既然你已经知道自己想要什么样的角色,在什么样的公司工作,你就需要开始建立关系网了。

你听过这句谚语吗?

"种树的最佳时间是 20 年前。第二个最好的时机就是现在。”

同样的原则也适用于网络。

最糟糕的时候是你需要的时候。到了那个时候,可能就太晚了,但是如果你发现自己处于那种情况,你所能做的就是立即开始建立关系网。但是要意识到,就像一棵新栽的树,一个新发展的网络是脆弱的,不要指望它能结出多少果实。相反,集中精力尽你所能发展和滋养你的人际网络,当它更加稳固的时候,期待它结出果实。

但是你到底是如何发展一个网络的呢?

我最好的建议是开始和你遇到的每个人交往。与人交往的最好方式是真正有兴趣去了解他们。下次你在商店的时候,问你的收银员,“你一天中最美好的时光是什么?”这是一个引发人们思考和回应的问题。然后这种反应可能会导致更深入的对话,也可能不会。没关系。你正在做的是学习如何与人交往,并更多地了解你周围的人。

把这个想法延伸到 LinkedIn。下次你在帖子上看到有趣的对话时,去参与吧!

将这个想法延伸到你参加的下一次聚会或会议。与你周围的人交往,多了解他们。

你会发现你开始认识很多人!许多这样的联系会在第一次谈话后结束,但其中一些会找到更深的根源,保持并继续发展成友谊。继续滋养他们。偶尔联系一下,看看他们过得怎么样,有什么新鲜事,有没有你能帮忙的。

我能给出的关于人际关系的最大建议是专注于给予。帮助别人不仅感觉很棒,而且还能建立一个强大的基础,所以当你需要帮助的时候,你的关系网会在那里等着你。而且不会觉得别扭!你不会向陌生人寻求工作,而是向想帮忙的朋友寻求帮助。

建立这种类型的网络需要时间,所以现在就开始吧!今天就想办法和新的人交往吧!

更好地理解你的目标

好的——现在是时候收集一些数据了,这样你就可以更好地理解你面前的道路。

你的第一站是求职栏。对公司发布你在第一步中确定的职位类型的前三个网站做一些研究。这可以像 LinkedIn 或 Glassdoor 这样的大网站一样简单,也可以是 YC 就业委员会这样的小众网站。我还建议你去看看你梦想中的公司的求职页面。

研究这些招聘信息,并开始将你发现的数据制成表格。

他们有没有提到 Python,R,SQL,或者 Spark?

深度学习或者强化学习怎么样?

可能会出现一些工程原则,如单元测试或持续部署。

你的目标是开始了解你梦想角色的核心技能是什么。根据你对你想要的角色的理解程度,这个过程可能只是确认你已经知道的东西。但你也可能会发现令你惊讶的共同主题。

下一步——在 LinkedIn 上搜索已经得到你想要的工作的人。

他们似乎有什么技能?他们的背景和经历如何?

将你学到的知识添加到你从招聘信息中收集的数据中。此时,你应该有一个电子表格,上面有一长串技能和经验,每个技能和经验旁边都有一个数字,说明它在你的研究中出现的频率。将你的表格分类,让最常用的技能放在最上面。拥有这份经过排序的技能列表至关重要,因为数据科学是一个非常大的领域。基本不可能对每一个可能的面试科目都做好准备。我们将在下一步中使用您的列表来集中我们的努力。

夯实你的基础

由拍摄的科尔顿鲟鱼在 Unsplash

现在——在你的清单上选出 5 项最重要的技能。这些都是你需要尽可能扎实掌握的技能。

这也是你需要对自己诚实的地方,你的时间线是什么。如果你发现你对所需的 5 大技能知之甚少,但你现在需要一份工作,你应该把你目前的努力重新集中在一份更容易实现的工作上,花时间为你梦想的角色做准备。

但同时,也不要对自己所处的位置过于悲观。如果你正在努力衡量自己的技能,看看你是否能接触到你不断发展的人际网络中与你职位相似的人,给你一些关于你的优点和缺点的反馈。

写下你的前 5 条,花些时间让自己对这些主题感到舒服。

以下是常见数据科学主题领域的一些资源:

  • 机器学习:使用 Scikit-Learn 和 TensorFlow 进行动手机器学习
  • 线性代数:吉尔伯特·斯特朗
  • 统计:做贝叶斯数据分析;统计学习介绍,思考统计
  • 分析:用于数据分析的 Python

一旦你对这 5 项技能有了足够的了解,在你的清单上选择下一个 5 项技能,确保你至少对这些领域有一个基本的了解。

在这一点上,你应该觉得你已经为你想要的工作所需的核心技能打下了坚实的基础。这个基础会在你开始面试时给你巨大的帮助。

但是,不幸的是,有时成为一名优秀的数据科学家并不意味着你会通过面试。你需要专门为面试问题做准备。

使用谷歌帮助您准备:

  • “如何赢得数据科学面试”
  • “常见数据科学面试问题”

这些搜索会给你大量的资源来练习实际的面试问题。每天练习提问,尽量把注意力集中在你认为与你已经确定的顶级技能最相关的问题上。

到处适用

招聘过程是相当不完整的,所以不要相信它总能做对。你不能控制一个公司是否有不好的流程,但你可以控制你申请了多少工作。所以一定要申请好一切。

我认为重要的是要有这样一种心态,即在申请前筛选自己并不是你的工作。很明显,如果你根本不能胜任一个职位,你就不应该申请。但是如果你在边缘,那就去做吧!尤其是如果你认为自己非常适合这份工作,但可能比这份工作“要求”的经验少几年。公司在这个过程中了解到他们的一些要求过于严格,最终根据他们收到的申请人的情况有所放松,这种情况并不少见。

如果你没有得到面试机会,这里有一些建议:

  • 向你的人际网络寻求推荐。
  • 优化简历!确保使用通用的简历格式,便于招聘人员浏览。此外,具体来说,提及招聘信息中要求的技能,以确保机器人不会将你过滤掉。突出你与工作最相关的工作经历。
  • 让朋友或同事审阅你的简历,并给你重要的反馈。

这是你工作漏斗的开始,所以一定要花时间优化它。如果你不得不申请数百份工作,却只有几次面试机会,你会很快耗尽申请的工作或继续申请的精力。

我建议一开始申请 20 份工作,然后等一等,看看你的回复率如何。如果你发现它真的很低,对你的简历做一些调整,并尝试另一个 20。不断迭代,希望能提高你的接受率。

你有它!我的 5 个步骤有望帮助你找到一份数据科学的工作。这肯定是一个过程,而且不是特别容易。所以——坚持下去,努力在工作漏斗中的每一步都不断进步。

想要更多关于获得数据科学工作的建议吗?看看这个免费课程。