NBA 的 10 个独特形象
体育分析
一种数据科学的方法来处理丢失篮球
篮球,快回来。(照片由 TJ 德拉戈塔在 Unsplash 上拍摄)
我想念 NBA。
由于新冠肺炎疫情事件,NBA 暂停比赛,这只是当今世界的一个小插曲。但和很多其他体育爱好者一样,我怀念观看体育直播的那种刺激感。
所以我处理了它,就像任何热爱数据的篮球爱好者会做的一样:我进入了统计数据,并建立了一些图表。
我使用 Tableau (我最近才学会如何使用,但已经绝对喜欢上了)来构建这些情节,以及我在 Kaggle 上找到的一个数据集,其中包含了从 1996-97 赛季到 2019-20 赛季在 NBA 打球的所有球员的信息。
在我开始之前,没有创建一个单独的图表,我立即发现了我的第一个有趣的见解:
自 1996 年以来,NBA 只有 2235 名独特的球员。
对于 24 年的篮球生涯来说,这是一个非常低的数字。而这也是为什么我们不断听到专家说进入 NBA 就像“中彩票”一样。
在 NBA 之前
大学篮球是 NBA 典型的招募点,大多数球员在成功的大学篮球生涯后都会转为职业球员。像 NCAA 疯狂三月这样的比赛非常受欢迎,在这些比赛中表现出色的球员吸引了 NBA 招聘人员的目光。
1.就让球员进入 NBA 而言,最成功的大学是哪几所?
每所大学参加过 NBA 的球员人数
这些是美国前 20 名进入 NBA 打球的大学。
排名前三的大学是肯塔基大学、杜克大学和加州大学洛杉矶分校,它们是最成功的大学,有 168 名球员继续在 NBA 打球。
球员通常是在不同的选秀轮中从大学中挑选出来的。成为首轮选秀权,意味着你是精英中的精英。
2。但是选秀会影响球员每个赛季参加多少场比赛吗?
选秀轮 vs 每个赛季的平均比赛场次(颜色表示每个赛季的平均分数)
未必。
第一轮选秀权只打第三多的比赛,而第七轮和第三轮选秀权平均每个赛季打更多的比赛。
但就每个赛季的平均分数(图中的颜色)而言,第一轮选秀权贡献的分数最高。这可能是因为第一轮选秀权得到了更多的休息,以便在对球队至关重要的比赛中更有效地得分吗?
另一个有趣的见解,未被选秀帮助你比被第四、第六或第八轮选上打更多的比赛。令人惊讶。
最大的最大的
所以球员被选中了。他很有可能又高又壮。NBA 以拥有最高最强壮的球员而闻名,他们是真正的运动员。
事实上,自 1996 年以来,球员的平均身高和体重分别为 200.8 厘米(6 英尺 5 英寸)和 100.6 公斤(221.7 磅)。
3.他们中最大的玩家是谁?
NBA 最大的球员,身高(厘米)和体重(公斤)(颜色代表国家)
由于 NBA 的大多数球员都来自美国,所以一些大牌球员也来自美国也就不足为奇了。
但看起来有史以来最大的球员之一是来自加拿大的西姆·布拉尔,他身高 2.26 米(7 英尺 5 英寸),体重 163 公斤(359 磅)。
沙奎尔·奥尼尔 ,被誉为 NBA 最好的“大个子”之一,身高 2.15 米(7 英尺 1 英寸),体重 145 公斤(319 磅)。姚明 (图中未标注的橙色图标)也是最好的“大个子”之一,身高 2.29 米(7 英尺 6 英寸),体重 141 公斤(310 磅)
最重要的团队统计数据?
团队可以用许多不同的方式来衡量,每种方式都会带来不同的见解。但可以说,其中最重要的是“净评级”。净评分是指球队每 100 分的得分差异。
4.哪支球队的净评分最好和最差?
自 1996 年以来所有团队的平均净评分(颜色表示团队的平均年龄)
事实证明,圣安东尼奥马刺队自 1996 年以来平均净得分最高,为+3.24 ,这意味着平均每 100 分,他们领先 3 分。只有另外两个队有积极的净收视率,迈阿密热火队和俄克拉荷马雷霆队。最差的球队是现已解散的温哥华灰熊队,负 8.39 分。
另一个令人惊讶的发现是圣安东尼奥马刺队也是所有赛季中平均年龄最大的球队。经验,以拥有一个更老的团队的形式,真的有用吗?这可能是另一个分析的基础。
最佳进攻球员
(免责声明:这些统计数据是从 1996 年开始的,所以这里只记录了迈克尔·乔丹职业生涯的一半,他不在这些的名单上,但是有了一个更大的数据集,你可以肯定他会在那里。)
有太多的指标可以用来衡量单个球员。对于一个进攻球员,负责创造尽可能多的篮筐的球员,使用和分析最多的指标是得分和助攻。
5.哪些球员得分和助攻最多?
总积分 vs 总助攻(颜色表示比赛总次数)
勒布朗·詹姆斯,在一个完全属于他自己的联盟中,一个完全的异类,以惊人的 34,027 分和 9,280 次助攻远远超过其他人。科比·布莱恩特(瑞普·曼巴)是唯一一个能以 33633 分和 6319 次助攻接近 LBJ 的人。(我用谷歌搜索了迈克尔·乔丹的完整数据,他以 32292 分和 5633 次助攻排在第三位左右)
名单上其他值得注意的球员有德克·诺维茨基,他得到 31,561 分和 3,667 次助攻;以及阿伦·艾弗森,他在这张图表上出场次数最少,在 914 场比赛中得到 24,380 分和 5,622 次助攻。(相比之下,勒布朗打了 1256 场,科比打了 1346 场,德克打了 1522 场)。
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
用不同的方式使用得分和助攻可以带来更多的见解。使用球员的总投篮效率和球员在场上的助攻百分比,一组完全不同的球员出现了。
6.哪些球员的投篮效率和助攻率最高?
得分效率% vs 助攻贡献百分比(颜色表示每个赛季的平均比赛场次)
约翰·斯托克顿看起来几乎像一个异类,有着很高的投篮效率和很高的平均助攻率。但是图中某些球员的重复出现,比如斯蒂芬·库里、詹姆斯·哈登、勒布朗·詹姆斯和克里斯·保罗,展示了他们出众的投篮能力。同样更年轻的是,像本·西蒙斯和尼古拉·约基奇这样的现役球员无疑正在上升,并且很快会以稳定的表现主导这些统计数据。
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — —
游戏使用百分比是一个球员在场上使用团队游戏的百分比估计值。通常,当游戏使用百分比增加时,玩家的得分效率降低。真正的超级明星球员是那些能够保持这两个数字的人,他们变成了非常高效的射手。
7。谁是最有效的射手?
得分效率%与游戏使用率% (颜色表示每个赛季的平均游戏次数)
乔尔·恩比德的平均播放使用率最高,而博班·马扬诺维奇*的平均命中率最高。*
*但是最有效的超级射手似乎是**凯文·杜兰特、詹姆斯·哈登和勒布朗,*詹姆斯,因为他们运用战术的能力全面,投篮效率高。
紧随其后的是安东尼·戴维斯、沙奎尔·奥尼尔和斯蒂芬·库里。
最佳防守队员
尽管通常被忽视,防守球员是那些做大部分繁重工作并积极为团队的成功做出贡献的人。如果没有一个伟大的防守球员,不管你有多少伟大的进攻球员,你最终都会陷入更糟糕的境地。
篮板是另一个衡量防守球员效率的重要指标。抢篮板球指的是球员在错过投篮或罚球后把球捡回来。
篮板有两种类型,进攻型和防守型。一个超级防守球员在理想状态下会有很多这两种类型的篮板。
8.就篮板而言,谁是防守最好的球员?
平均进攻篮板% vs 平均防守篮板% (颜色表示每个赛季的平均出场次数)
平均每个赛季至少打 10 场比赛,至少 2 个赛季,他们是篮板最多的 10 名防守球员。
最佳防守篮板手是克里斯·鲍彻,最佳进攻篮板手是吉登斯和特雷耶·布拉格斯。
但是一个后卫最重要的是他们的全面能力,在进攻和防守篮板方面最好的球员是丹尼斯·罗德曼和安德烈·德拉蒙德。
双重麻烦
另一个经常使用的指标是“双双”,当一个球员在以下指标中的两个指标上超过 10 分:得分、助攻、篮板、抢断和盖帽。
大多数双打双打通常由得分、助攻和篮板组成,我在这里称之为“最常见的双打”。
9.哪些球员有最多的赛季场均“最普通”的两双?
平均“最常见”双双的赛季数
德怀特·霍华德(14 个双双赛季)以微弱优势超过蒂姆·邓肯(13 个双双赛季),成为“最常见”双双的最高赛季数。
安东尼·戴维斯,一个更年轻的现役球员,也在这个名单上,这表明经过几个伟大的赛季,他有很好的机会在这个名单上上升。
令人惊讶的是,克里斯·保罗也出现在这张图中,展示了他出色的投篮能力和全面的能力。
进化中的游戏?
有很多关于这项运动如何随着时间的推移而改变的讨论。许多人认为攻击性和强度已经随着时间的推移而下降,而另一些人认为游戏已经演变成一种更优雅和更具观赏性的形式。
可以说,到目前为止,一些最重要的指标是得分、助攻和篮板。
10.随着时间的推移,这些重要的指标(得分、助攻、篮板)实际上改变了多少?
1996-97 年至 2019-20 年的得分、篮板和助攻
赛季总助攻和赛季总篮板在很大程度上看起来不变*,有略微增加的趋势。*
每赛季总积分,另一方面大幅增加*。1996-97 赛季的总积分为 3540 分,而 2018-19 赛季的总积分为 4565 分。即使是不完整的 2019-20 赛季也已经有 4434 分,有望超过 2018-19 赛季,成为有史以来得分最高的赛季(无论赛季何时恢复)。得分的增加可以归功于三分球革命的兴起,现在的三分球得分比以往任何时候都多。这也可能是因为现在比以前有更多的高得分比赛。*
结论
我希望你能从这些图表中得到一些启示,因为我确实做到了。这只是表明最好的学习方法是实践的另一种方式。
我欢迎对这些可视化的任何类型的建议或修改,或新的想法。如果你认为合适的话,一定要在篮球对话和争论中使用它们。
我希望这有助于填补目前缺乏运动留下的空白。(早点回来,正常生活)
随时联系我LinkedIn,或者查看我的GitHub我做过的其他项目。
人工智能改善分销和供应链的 10 种方式
在世界各地,人工智能正在让供应链变得更快、更可靠、更有利可图。
图片来源: Unsplash
在世界各地,人工智能正在让供应链变得更快、更可靠、更有利可图。
人工智能是当今企业最有前途的技术之一。麦肯锡对 2000 多名参与者的研究发现, 58%的受访者至少在一个流程中使用 AI 。这一令人印象深刻的采用率也不是毫无根据的,因为人工智能可以在几个方面改善供应链管理等领域。
物流是一个快速发展的重要行业,也是许多其他行业赖以运转的行业。因此,它将受益于全面而及时的数据分析。AI 让这一切成为可能。
一些人工智能技术已经在物流领域得到广泛应用,而一些则刚刚出现。以下是人工智能改善供应链的 10 种方式。
1.更快的数据分析
数据分析对现代供应链至关重要。物流公司需要分析大量信息,找出效率低下的地方和潜在的改进方法。这个过程不需要人工智能,但速度要快得多。
手动梳理信息以建立有见地的联系会花费很多时间。在像物流这样对时间敏感的行业,这可能是个问题。由于人工智能系统可以一次分析多个数据集,它们可以在很短的时间内给出供应链结果。
2.预估需水量
管理库存通常不像你想象的那么简单。如果一个仓库错误地估计了未来的需求,它可能会以产品过少或过多而告终。这两种情况都可能造成巨大的金钱损失,但 AI 提供了一个解决方案。
通过预测分析,人工智能系统可以利用过去的趋势和市场信号来预测需求。仓库经理可以使用它们来查看他们需要储存或多或少的物品。然后,他们可以避免盈余和赤字,保持一贯的准备行动。
亚马逊在其供应链的几乎每个层面都使用人工智能,尤其是在仓库。它对客户需求的人工智能预测是它如何在电子商务行业保持领先地位的一部分。这有助于它比大多数竞争对手(如果不是全部的话)更快地完成订单。
3.工序自动化
亚马逊几乎在供应链的每个层面都使用人工智能,尤其是在仓库。它对客户需求的人工智能预测是它如何在电子商务行业保持领先地位的一部分。这有助于它比大多数竞争对手(如果不是全部的话)更快地完成订单。
一般来说,人工智能系统往往比人类更擅长数据繁重、单调的工作。将这样的任务分配给 AI 不仅节省了时间,还节省了资金。当人工智能处理这些行政工作时,它将人类员工解放出来,同时从事其他项目。
像手动归档文件这样的任务会让企业每年花费 6500 个小时,这是一个巨大的时间损失。想象一下,一家公司如果增加 6000 多个小时的工作时间,可以完成多少事情。这种生产率优势对物流企业来说太有利了,不容忽视。
4.更可靠的发货更新
许多公司使用 RFID 标签等技术来跟踪供应链中的产品。然而,有时,物品运输时没有这些标签或事件会导致它们不可读。通过使用人工智能,企业仍然可以向客户提供货运更新。
当跟踪技术失败时,人工智能可以计算交付量,因此公司仍然可以提供估计。这些程序可以分析像平均运输时间和天气模式这样的事情,以提供准确的结果。然后,供应链可以了解他们的进展,并保持客户满意度。
5.自动化仓库管理
无数其他因素影响着供应链运行的效率,但管理不善的仓库从一开始就阻碍了成功。尽管情况紧急,只有 20-30%的仓库在尽可能有效地运转。使用人工智能来管理运营可以有所帮助。
自动化仓库管理系统(WMS)可以通过数据分析发现低效之处。由于人工智能通常更擅长在数据点之间建立有见地的联系,这可以消除管理中的人为错误。全面的小改变可以导致效率的大幅度提高。
6.优化路线规划
供应链需要充分利用运输来按时交付产品。通常,这意味着规划从 A 点到 b 点的最快、最安全的方式。在预测分析的另一个应用中,人工智能也非常适合这项工作。
人工智能系统可以观察交通模式和天气,以确定最佳行动方案。由于诸如此类的因素是动态的,最佳路线可能每天都在变化。因此,供应链需要像 AI 这样的工具,可以快速分析数据和规划路线。
自 2012 年以来,UPS 已经使用一个名为 ORION 的系统来优化其路线。从那以后,这个人工智能每年为该公司节省了 1 亿英里和 1000 万加仑的燃料。
7.监控产品质量
自 2012 年以来,UPS已经使用一个名为 ORION 的系统来优化其路线。从那以后,这个人工智能每年为该公司节省了 1 亿英里和 1000 万加仑的燃料。
供应链管理不仅仅是确保产品准时到达。物流公司还需要确保货物完好无损地到达,这对于一些物品来说是一个挑战。人工智能可以确定敏感产品的寿命和风险因素,帮助企业确保产品质量。
如果有任何不可预见的延误,人工智能系统可以确定他们是否需要重新调整路线以保护一些产品。如果一批货物包含食物或植物,他们可能需要改变路线,先运送这些。没有人工智能,公司可能不知道如何即时做出这些改变。
8.明智的供应商选择
对于一些供应链经理来说,选择合适的产品供应商可能是一场赌博。如果他们不能提供一致的质量,或者容易出现丑闻和道德问题,这可能会损害物流公司的公众形象。然而,在人工智能的帮助下,他们可以更好地了解每个企业的历史和潜在风险。
人工智能系统可以确定与一家公司做生意是否会有财务或公共关系风险。然后,供应链可以就供应商选择做出明智的决策。
9.改进的客户支持
人工智能最常见的应用之一是聊天机器人,最常见的是客户支持角色。在过去的一年里,大约有 40%的美国消费者使用过聊天机器人。它们使供应链能够提供全天候的客户支持。
通过人工智能处理客户参与,物流公司将员工解放出来,专注于其他任务。不仅客户支持得到改善,整体效率也得到提高。这些人工智能也让顾客更容易获得信息。
DHL 允许客户通过 Alexa 检查他们的订单状态,给他们快速、可靠的答复。除了作为一个快速、免提的信息网关,智能扬声器已经出现在许多家庭中。习惯使用这些技术的人将会很高兴能够通过它们了解他们的订单。
10.自主航运
这些人工智能也让顾客更容易获得信息。
DHL 允许客户通过 Alexa 检查他们的订单状态,给他们快速、可靠的答复。除了作为一个快速、免提的信息网关,智能扬声器已经出现在许多家庭中。习惯使用这些技术的人将会很高兴能够通过它们了解他们的订单。
随着人工智能技术的进步,它最终将实现完全自主的航运。人工智能是自动驾驶汽车的关键,无人驾驶交付将缩短运输时间。自动驾驶卡车不需要停下来休息,所以他们可以在更短的时间内行驶更长的路程。
这项技术还不可用,但研究人员正在接近成功。它将随着人工智能的进一步采用而改进,从而导致更快的开发和实现。
完全自主的航运可能现在还不是现实,但几家公司正在努力。2017 年,劳斯莱斯与谷歌合作开发自动驾驶货船。虽然这项技术还不可用,但随着人工智能的进一步采用,它将得到改善,从而加快开发和实施。
数据驱动的物流链
以数据为中心的供应链管理对于改善物流行业至关重要。人工智能与此密切相关,因为它允许公司充分利用数据的潜力。随着 AI 在这一领域的广泛采用,该行业将继续改善。
供应链是许多行业的支柱。当物流公司采用人工智能时,它会产生效益的连锁反应,并改善该部门的功能。
部署和服务人工智能模型进行预测的 10 种方法
探索 Flask、云巨头、小众玩家、AutoML 和其他部署 AI 的方式。
克里斯汀·休姆在 Unsplash 上拍摄的照片
创建模型只是通往现实世界人工智能之旅的一步。部署意味着将您的模型——无论是 Jupyter 笔记本还是某处的. py 文件——转化为可用的服务。
简化的 AI 管道。由作者创建。
我不会深入讨论容器,它们与部署和服务模型是分开的。像 Docker 和 Kubernetes(托管 Docker 容器)这样的容器系统就像是模型的盒子,可以创建可复制、可伸缩和隔离的环境,您可以在其中设置依赖关系,这样模型就可以在任何执行环境中工作。
以下是部署、托管和服务人工智能模型进行预测的 10 种方式。
1.Flask 的内置服务器
首先,Flask 的内置服务器不是生产级的,因为它不能扩展。尽管如此,由于它的易用性,它是一个方便的工具,用于快速实验和快速建立并运行您的模型。
要在 Flask 上部署,请遵循以下一般步骤:
- 安装烧瓶
- 序列化你的 AI 模型(例如用 Pickle 或 joblib
- 创建另一个。py 文件与上面的序列化模型在同一个目录中,它将用于在 Flask 中创建 web 服务
- 运行。来自终端的 py 文件
- 检查您的本地主机地址,看看它是否工作
- 使用输入数据进行 http POST 调用以接收预测
这篇关于数据科学的文章展示了一个使用 Flask API 部署 Sklearn 模型的示例。
2.云中的烧瓶
在云中运行 Flask 将让您获得更大的可伸缩性,尽管这比使用内置服务器更复杂。
这里有一些你可以使用的云服务器:
这篇 FreeCodeCamp 文章非常详细地介绍了如何在云中部署带有 Flask 的模型。
3.AutoML 解决方案
AutoML 越来越受欢迎。尽管与 AI 部署不是同一个概念,但是大多数 AutoML 解决方案都允许在其核心 AutoML 功能之上进行简单的模型部署。
AI 部署解决方案和 AutoML 解决方案的重叠。由作者创建。
以下是一些 AutoML 解决方案,可以实现简单(甚至是一次点击)的模型部署:
- Cloud AutoML (这允许您使用提供的 REST API 生成预测)
- Azure AutoML (这将生成一个
.pkl
文件,其中包含您可以在 Azure 中部署的模型) - Apteo (这是一个无代码的解决方案,允许您在浏览器中或通过 API 生成预测)
这些解决方案提供的不仅仅是人工智能部署,还可以大幅提高数据科学团队的效率。
AutoML 越来越受欢迎。这就是事情的变化。
towardsdatascience.com](/will-automl-be-the-end-of-data-scientists-9af3e63990e0)
4.Azure 机器学习
Azure ML 专注于提供企业级云服务,尽管使用微软的服务器显然会让你付出代价。
通过 Azure ML 部署任何模型有 5 个主要步骤:
- 收集先决条件(Azure ML 工作区、Azure CLI、工作区中经过培训的 ML 模型)
- 通过创建推理配置来准备部署
- 使用 Model.package 创建一个 Docker 映像
- 将图像部署为 web 应用程序
- 通过向 URL 提交数据并显示响应来使用 web 应用程序
5.GCP
在 GCP 部署有三个主要步骤:
像 Azure 一样,GCP 提供了企业级的可扩展性和安全性,尽管它需要广泛的技术专长才能运行。
6.AWS SageMaker
AWS SageMaker 为您的模型提供了一个 HTTPS 端点,利用它在三个步骤中提供推理:
- 在 SageMaker 中创建模型,包括相关的 S3 路径和 Docker 注册路径
- 为 HTTPS 端点创建端点配置
- 创建 HTTPS 端点
7.IBM Watson ML
虽然 AWS、GCP 和 Azure 是在云中部署人工智能的三大巨头,但 IBM 的 Watson ML 提供了一个更适合的解决方案,允许您动态地重新训练模型并自动生成 API。
IBM 为其服务提供了一份很好的白皮书,它更广泛地扩展到 ML 服务器和管道。
8.Oracle 数据科学平台
Oracle 的数据科学平台允许团队构建、管理和部署具有可再现性、高安全性和全面的模型构建环境的模型。
[## Oracle 云数据科学平台
AgroScout 和 Oracle——利用新一代技术战胜饥饿“这一愿景的成功依赖于管理……
www.oracle.com](https://www.oracle.com/dk/data-science/cloud-infrastructure-data-science.html)
9.阿里云
阿里云通过其弹性算法服务(EAS)提供了几种部署模型的方法,包括:
- 将模型上传到控制台
- 使用 PAI Studio 部署模型
- 使用 DSW 部署模型
- 使用 EASCMD 客户端部署模型
人工智能机器学习平台(PAI)的弹性算法服务(EAS)与 PAI Studio 和
www.alibabacloud.com](https://www.alibabacloud.com/help/doc-detail/126312.htm)
10.提供;给予
Render 是这个列表中比较容易使用的工具之一,因为它直接从 GitHub 或 GitLab 部署你的模型。你需要做的就是像平常一样推送你的代码。
很快。AI 为在 Render 上部署模型提供了一个有用的指南,展示了它是多么简单。
这是一个快速指南,只需点击几下鼠标,就可以在 Render 上部署训练好的模型。它附带了一个启动回购…
course.fast.ai](https://course.fast.ai/deployment_render.html)
结论
部署和服务人工智能模型的解决方案越来越多。
如果您的需求很简单,您可能会坚持使用 Flask,而如果您需要企业级的可伸缩性(并且拥有企业级的专业知识和资源),您可能会选择 AWS、Azure 或 GCP。
如果你有更多的小众需求,你可能会选择甲骨文,IBM,或者阿里巴巴。如果您想要一个没有太多麻烦的端到端解决方案,您可能会选择 AutoML 工具。
你怎么看——你会在这个列表中添加任何部署工具吗?
10 家使用 Python 的世界级公司
Python 正被 IT 界的一些巨头积极使用
编写 Python 代码的乐趣应该在于看到短小、简洁、易读的类,这些类用少量清晰的代码表达大量的动作——而不是让读者厌烦得要死的大量琐碎代码。
——吉多·范·罗苏姆
在现代,每一个其他公司都使用数字工具来管理他们的运营,并保持一切顺利运行。企业总是努力在可用资源的范围内实现最大效率。提供软件即服务的公司一直在寻找最佳和最有效的技术来采用。
Python 一直在证明其作为全能编程语言的实力,并为企业面临的众多挑战提供解决方案,无论是与人工智能、统计中的数字处理、开发还是访问数据库有关。这使得 Python 成为业内一些顶级公司首选的编程语言。
根据 StackOverflow 的说法,Python 是发展最快的主流编程语言。
每个月,大约有 5000 万人访问 Stack Overflow 来学习、分享和建立他们的职业生涯。我们估计 21…
insights.stackoverflow.com](https://insights.stackoverflow.com/survey/2019)
Python 能做什么?
Python 是一种强大的编程语言,支持过程化、面向对象和函数式编程,并且是世界上最常用的五种编程语言之一。
由吉多·范·罗苏姆于 1991 年发布的 Python 已经成为发展最快的编程语言之一,并随着时间的推移超越了许多其他语言。Python 不仅仅是应用程序和网站开发,它还可以用于各种领域,例如:
●数据库
●图像处理
●数据分析
● 机器学习
● 人工智能
●科学计算
●网页抓取
●还有更多
Python 之所以如此具有竞争力,是因为它支持 REST APIs、详尽的库和框架集合、跨平台兼容性,并且对程序员非常友好,易于调试和使用,这使它成为企业的有利选择。
Python 兴趣随时间推移— 谷歌趋势
使用 Python 的顶级公司
●谷歌
由 Rajeshwar Bachu 在 Unsplash 上拍摄的照片
“Python 从一开始就是 Google 的重要组成部分,并且随着系统的成长和发展而保持不变。如今,数十名谷歌工程师使用 Python,我们正在寻找更多掌握这种语言的人。”
- 彼得·诺维格
谷歌是世界上最大的科技公司之一,因为他们参与了数十项在线服务,如搜索、安卓、 Youtube 、 Stadia 等等。对于这种规模的公司,其技术堆栈包括不止一种核心语言,即 Python 、 Java 和 Golang ,Python 在这些语言中获得了更多的支持和参与。
Google 在早期采用了 Python,并一直使用到今天,这是因为它简单的特性和相对快速的维护,允许在其许多领域快速部署。服务,如部分搜索引擎,YouTube,以及实施机器学习,人工智能以及机器人项目。
事实上,根据《 In the Plex》的作者史蒂文·利维(Steven Levy),的说法,“谷歌的第一个网络爬行蜘蛛最初是用 Java 1.0 编写的,因为太难了,所以他们把它重写为 Python。
谷歌大量使用 Python,这仅仅是一个品味问题还是给了他们竞争优势?
stackoverflow.com](https://stackoverflow.com/questions/2560310/heavy-usage-of-python-at-google/2561008#2561008)
●脸书
作为有史以来第一个挑起竞争并升至榜首的社交媒体平台,脸书已经发生了重大变化,这背后的部分原因是在其技术栈中采用了 Python。脸书在几个领域使用了许多 Python 包,例如:
● TORconfig、FBOSS、FBAR、Cyborg、machinechecker,用于生产工程
●作业引擎、fbpkg、FBTFTP、渗透,用于平台服务
●配置器,用于服务配置管理
● MySQL 池扫描器,slowroll orchestrator,用于管理运营效率
脸书还积极参与 Python 的开发,定期为该平台提供错误修复和增强性能的附加功能。脸书的技术栈中使用的其他语言包括 PHP 和 C++。
Instagram 是一个非常受欢迎的照片和视频共享平台,它使用 Python 来实现最大的运营效率,使用了著名的 Python 框架、 Django 。被认为是 Django 迄今为止最大的实现,其背后的动机是框架的简单性和可靠性。
Instagram 的开发人员在选择他们首选的基线编程语言时,似乎更喜欢 Python 而不是 PHP,因为 PHP 带来的性能提升不够令人信服。
该公司甚至在长达 10 个月的时间内将 从 Python 2 切换到 Python 3 ,这清楚地表明 Instagram 对 Python 印象深刻。
Instagram 的一名软件工程师这样描述他们对 Python 的生产使用
“我们最初选择使用 Python 是因为它简单实用的名声,这与我们‘先做简单的事情’的理念非常吻合。”
[## 使用 Python 提高 Instagram 的 Web 服务效率
Instagram 目前拥有世界上最大的 Django web 框架部署,它完全是用…
instagram-engineering.com](https://instagram-engineering.com/web-service-efficiency-at-instagram-with-python-4976d078e366)
● Spotify
Spotify 是数百万人的首选音乐流媒体应用,这是因为它的广泛可用性和适合所有情绪的惊人音乐收藏。Spotify 广泛使用 Python 的原因有很多,包括数据分析、使用 ZeroMQ 的服务间通信等等。
凭借丰富的数据,Spotify 使用 Hadoop 管理其收集的海量数据的推荐系统,并结合 Luigi 进行处理,这是一个用于批处理作业的 python 包。采用 Python 的另一个原因是快速的开发流程和服务之间的无缝操作。
本周末我们在 PyCon 上听到的最常见的问题是,我们如何在 Spotify 上使用 Python。希望这篇文章…
engineering.atspotify.com](https://engineering.atspotify.com/2013/03/20/how-we-use-python-at-spotify/)
● Quora
图片来源— Quora
Quora 是一个流行的问答平台,每天都有数百个问题被张贴出来,从一些最聪明的人那里获得回复。Quora 采用 Python 是因为它高效、快速的特性,以及易用性的额外好处。Quora 使用了Tornado 框架pypypy,以及更多的 python 库。Quora 通过编写全面的单元测试来规避 Python 的类型检查缺点。
诸如减少开发时间、增强可伸缩性、更好的代码可读性的开发人员友好性以及大量库的可用性等好处保证了他们将注意力从其他两个潜在候选语言(包括 C#、Java 和 Scala)转向 Python。
●网飞
广受欢迎的视频流媒体巨头网飞特别喜欢 Python,并试图尽可能多地使用它。从早期开始,网飞就对他们如何使用 Python 和其他库 非常开放。几乎在每个子系统中都可以找到 Python 的实现,例如:
**● **安全性:一套名为 Simian Army 的工具模拟故障,测试系统的可靠性,帮助计划系统故障的恢复措施。
**● **警报:中央警报网关将所有警报传达给合适的团队。
**● **数据分析:像 NumPy、SciPy 这样的库来执行数值数据分析。
现在有一只混乱的猴子在 AWS 中运行,破坏了网飞的服务器。但是不要惊慌!都是…
talkpython.fm](https://talkpython.fm/episodes/show/16/python-at-netflix) [## 数据科学如何助推网飞
当有效使用时,数据可以神奇的方式改变您的业务,并将它带到新的高度。
towardsdatascience.com](/how-data-science-is-boosting-netflix-785a1cba7e45)
● Dropbox
图片来源— 朝九晚五谷歌
Python 是在线文件共享和存储公司 Dropbox 背后的生命力,为其大部分服务和桌面客户端提供支持。Dropbox 对 Python 的印象非常深刻,他们设法从谷歌和 Dropbox 团队那里得到了 Python 的创造者吉多·范·罗苏姆的帮助来改进他们的平台。
虽然是专有的,但该公司也向开发者提供 Python SDK,希望将其集成到他们的 Python 应用程序中,让你知道他们在该平台上投入了多少。Dropbox 的开发人员也证实,大部分服务器端代码都是用 Python 编写的。
[## Dropbox 是如何扩展到 1.75 亿用户的?一位前工程师详述了早期的日子
女士们先生们,我们中断了关于疯狂的企业家和更疯狂的风投的正常节目,为你们带来一个…
techcrunch.com](https://techcrunch.com/2013/07/11/how-did-dropbox-scale-to-175m-users-a-former-engineer-details-the-early-days/) [## 抄本第 30 集 Dropbox 上的 Python 社区和 Python-[与我谈论 Python 播客]
00:00 是否意味着成为 Python 社区的领导者?这意味着你为开源项目做贡献吗?你…
talkpython.fm](https://talkpython.fm/episodes/transcript/30/python-community-and-python-at-dropbox)
Reddit 被认为是最大的微博网站之一,自称是互联网的第一页,如果你想收集关于任何事情的信息,它是你的地方,拥有数百万用户和数十亿主题。
Reddit 从 Python 及其广泛的库集合中获得了很多灵感,通过逐步实现每个被采用的库的高度定制的变体。在其核心,Reddit 使用以下库来保持其服务运行:
● 底板. py: 作为 Python 中的核心服务框架
●***rolling pin:***方便更快的部署到各种服务器
●***pywebpush:***Python 中的 webpush 数据加密
●***aws-MFA:***用于管理 AWS 多因素认证
● 监视器: 监视所有操作
●***gevent:***管理基于协程的并发
●django-裤衩: 整合 django 到裤衩的帮手
●以及更多的库
据其联合创始人:
它极具表现力、可读性和可写性。这让生活保持平稳。
●亚马逊
布莱恩·安杰洛在 Unsplash 上拍摄的照片
在线市场的顶级玩家之一 Amazon 在其平台的多个领域使用 Python。在产品和交易推荐系统中实现,其中,通过人工智能和机器学习,亚马逊分析客户的购买和习惯,并推荐产品。
随着亚马逊处理海量数据,需要管理这些数据的技术,这就是 Python 凭借其高可伸缩性和与 Hadoop 等其他技术无缝协作的能力发挥作用的地方。
亚马逊使用 Python 的另一个例子是用于各种用例的 Jupyter 笔记本,甚至涉及 AWS 资源中的机器学习和自动化。
●优步
查尔斯·德鲁维奥在 Unsplash 上拍摄的照片
优步是一家跨国公司,它可以让你预订去你喜欢的目的地的旅程,它在较低层次上使用 Python 和 Node.js、Java 和 Go。面向其用户的大多数服务仍然由 Python 提供,包括业务逻辑和所有发生的计算,包括中间层和顶层,如计算 ETA、乘车费用、计算地理位置以及需求和供应。
优步声称将 Tornado 与 Python 一起使用,但经常与 Go 交换,以在并发性方面实现更好的吞吐量。优步还开发了 Python、R 和 Shiny 使用的可视化框架,并使用 Jupyter 笔记本完成所有数据分析任务。
更新:本文讨论堆栈的下半部分。其余的,见第二部分:边缘和超越。优步的…
eng.uber.com](https://eng.uber.com/tech-stack-part-one-foundation/)
结论
Python 正被 IT 界的一些巨头积极使用,这使它成为完成各种事情的最佳编程语言之一,修补 Python 的能力使它更加诱人。更容易的学习曲线、大量的库、高可伸缩性和框架,包括 Python 的快速开发和对开发人员友好的特性,被证明是公司使用它的令人信服的理由。
如果您对 Python 在当今数字时代的受欢迎程度和作用感兴趣,我们强烈建议您参加一两门课程,深入 Python 的世界,因为它带来了大量的创新机会。
更多有趣的阅读—
我希望这篇文章对你有用!以下是一些有趣的读物,希望你也喜欢
看看吧,你为什么要读它们?
towardsdatascience.com](/machine-learning-books-you-must-read-in-2020-d6e0620b34d7) [## 面向所有人的顶级谷歌人工智能工具
使用谷歌人工智能中心将想法变为现实
towardsdatascience.com](/top-google-ai-tools-for-everyone-60346ab7e08) [## 数据科学家的最佳数据科学工具
数据科学工具,使任务可以实现
towardsdatascience.com](/best-data-science-tools-for-data-scientists-75be64144a88) [## 用于自然语言处理的 Python 库
用于自然语言处理的流行 python 库概述
towardsdatascience.com](/python-libraries-for-natural-language-processing-be0e5a35dd64) [## 选择 PyTorch 进行深度学习的理由
PyTorch 可以为深度学习程序员提供很多东西
towardsdatascience.com](/reasons-to-choose-pytorch-for-deep-learning-c087e031eaca)
关于作者
克莱尔丁。是Digitalogy**—的内容制作者和营销人员,这是一个技术采购和定制匹配市场,根据全球各地的特定需求,将人们与预先筛选的&顶尖开发人员和设计师联系起来。在 Linkedin , Twitter , Instagram 上连接 Digitalogy 。
使用 Cygym,强化学习环境速度提高 100%
使用 cygym 更快地替代健身房环境
我们可以用更快的环境来加速强化学习吗?图片来源
任何至少涉足强化学习的人都可能会告诉你他们已经使用了 OpenAI 的健身包(链接如下),而且理由充分!这是一个易于使用、可扩展且支持良好的包,它减少了设置 RL 项目的大部分开销。
然而,当用最少的资源进行一个大规模的项目时,从多次运行的代码中挤出每一滴性能是很重要的。在从事一个 RL 项目时,我浏览了一下经典控制环境的源代码,这些环境通常用于对 RL 代理进行基准测试,看看我们是否可以获得一些廉价的速度增益。
我注意到所有的 gym 代码都是用纯 Python 编写的,所以我大脑中的生产代码部分立即想到:“将这些环境进行 cythonizing 以提高速度怎么样?”
Cython 快速介绍
Cython 是 Python 的一个超集,支持将解释的 Python 代码编译成速度极快的 C 扩展。这样做的好处是,我们实际上不必编写任何 C 代码,只需对我们的 Python 脚本做一些小的修改!根据不同的用例,有时您会发现 Python 代码的速度提高了 1000 倍以上。健身房环境的方法看起来是一个很好的选择,因为它在游戏的每一帧都被调用一次,这在训练 RL 代理时会出现数百万次。
cygym 简介
我最近发布了一个公共存储库,其中包含一个名为 cygym 的 Python 包,它包含了原始 gym 包中经典控制环境的 cythonized 版本。原始环境代码的所有功劳都归于这些脚本的作者,但我确实引入了一些小的优化,并利用一些 Cython 魔术来获得比原始实现高达 100%的速度提升。希望这个数字只会随着我们扩展代码库和获得更多贡献者而上升。
安装和导入
cygym 的安装和设置非常容易,只需克隆公共包存储库并使用 pip 安装即可!
git clone https://github.com/gursky1/cygym
cd cygym
pip install -e .
Pip 应该处理软件包所需的所有设置,但是如果您对这种方式的安装有问题,您可以自己手动构建软件包,并使用setuptools
以另一种方式安装:
python setup.py build_ext --inplace bdist_wheel
pip install dist/(wheel file here).whl
如果您仍然遇到问题,请随时打开问题或直接联系我!
快速启动
Cygym 几乎是 OpenAI gym 的一个完整插件,你所要做的就是导入环境类并开始!
开始使用 cygym
Cygym 也应该兼容任何和所有的 OpenAI 健身房包装器。我们现在正在做的一个功能是让 cythonized 类与 OpenAI gym 注册表兼容,但由于 Cython 的原因,这不是非常简单的。
一些初始速度比较
我们可以执行的第一个速度测试是比较两种最常见的健身房方法.reset()
和.step()
在健身房和 cygym 中运行经典控制问题所需的时间。
当我们初始化一个环境时,.reset()
被调用,而.step()
被调用来应用一个动作并获得下一帧。与环境交互的大部分运行时间是在.step()
中度过的,所以我们将更加重视这种比较:
gym 和 cygym 在初始化环境时的绝对和相对速度比较
不幸的是,cythonizing 似乎只给使用.reset()
的初始化环境带来了适度的速度提升,有时甚至会减慢它的速度!但是不用担心,这个方法每集只调用一次,所以这些结果对于我们的下一个比较来说是次要的:
gym 和 cygym 在迭代环境中的绝对和相对速度比较
哇!使用我们的 cythonized 变体,我们可以看到迭代环境的速度提高了六倍!请注意,我们的大部分环境交互时间都在这里,这意味着我们的整体模型训练时间应该较少依赖于环境!
用随机动作测试两种常见的方法都很好,但是 cygym 在实际训练代理方面做得如何呢?让我们来看看…
具有稳定基线的 RL 代理培训
Stable baselines 是原始 OpenAI baselines 包的优秀分支,它包含了许多 RL 算法的实现,如 Deep-Q、TRPO、SAC、PPO 等等。我不会深入研究这个包,但我们将利用 Stable-Baseslines 中可用的矢量化环境以及我们的 gym 和 cygym 环境来训练实际的 RL 代理,并查看为 100k 帧训练我们的模型需要多长时间:
使用 Cygym 培训稳定基线代理的示例
现在,我们将进行与前面部分类似的比较,查看我们所有的经典控制环境,看看使用 cygym 可以获得什么样的速度提升:
gym 和 cygym 训练 RL 代理的绝对和相对速度比较
又来了,哇!看起来 cygym 总是比 gym 快,火车时间减少了 50%!当尝试构建新模型架构的原型或进行超参数搜索时,这可能是一个巨大的差异。
未来版本
在未来,我们计划看看与 OpenAI gym 的进一步兼容性,例如在我们的 cythonized 环境中使用gym.make()
,以及可能的快速渲染(目前还不支持)。
我们还计划研究一下 cythonizing 更复杂的任务,比如最初 gym 包的 box2d 和算法模块中的任务。
结论
我们已经证明,使用 cygym 进行简单的 cythonization 可以大幅减少 RL 代理培训时间,这意味着等待时间更少,分析结果的时间更多!我们正在积极寻找 cygym 的贡献者和维护者,所以如果你有 Cython 包开发和优化的经验,请联系我们!
资源
Cygym:快速 gym 兼容经典控制 RL 环境
这个存储库包含 OpenAI Gym classic 控制环境的 cythonized 版本。注意是这个包…
github.com](https://github.com/gursky1/cygym)
OpenAI Gym:强化学习环境的多功能包
状态:维护(期待 bug 修复和小更新)OpenAI Gym 是一个开发和比较…
github.com](https://github.com/openai/gym)
cy thon:Python 语言的编译超集
[## cy thon:Python 的 C 扩展
Cython 是一个针对编程语言和扩展 Cython 编程语言的优化静态编译器…
cython.org](https://cython.org/)
稳定基线:OpenAI 基线的一个分支
稳定基线是一组基于 OpenAI 基线的强化学习算法的改进实现…
github.com](https://github.com/hill-a/stable-baselines)
面向数据专业人员的 100 篇开源大数据和 ML 架构论文(续)
作者图片
介绍
在过去十年中,大数据技术极具颠覆性,开源在塑造其发展过程中发挥了主导作用。它已经导致了一个复杂的生态系统,新的框架、库和工具几乎每天都在发布,在技术人员努力理解系统的复杂性时造成了混乱。2015 年,我试图通过揭开这个空间的神秘面纱来解决这个问题。过去 5 年发生了很多变化,Spark 和 Flink 等新生态系统颠覆了第一代系统,人工智能和 ML 的进步以及云提供商产品的成熟。觉得这是拍续集的好时机。
这一次,我试图用一个由 3 部分组成的系列来解开这个复杂性。第一部分(当前文章)从开源生态系统的角度概述了该架构。第二篇将从云提供商的角度介绍架构的实现,而第三篇将从一些正在大规模处理数据的领先技术公司的角度介绍架构的实现。
如果你是一个大数据爱好者或技术专家(或挠头),花一些时间深入理解关键系统的架构以了解其演变是很重要的。理解架构组件和微妙之处也将帮助您为您的用例选择和应用合适的技术。在我过去十年的旅程中,一些文献帮助我成为一名受过更好教育的数据专家。我在这里的目标不仅是分享文献,也是利用这个机会让开放源码系统的迷宫变得更加清晰。
需要注意的是,大部分参考文献都非常倾向于提供一个深入的架构概述(在大多数情况下,它指的是原始的研究论文)。
架构层
1.数据基础服务
作者图片
a)协调——这些系统用于跨分布式数据系统的协调和状态管理,都是从 Paxos 中获得灵感的。
- Zookeeper——灵感来自于 Chubby 虽然是一个一般的协调服务,而不仅仅是一个锁定服务。
- Raft 一种在多个现代数据库中使用的共识算法,例如 CockroachDB MongoDB 和 InfluxDB。
b)资源管理器 —虽然第一代 Hadoop 生态系统始于 YARN 之类的单片调度器,但进化发生在分层调度器(Mesos)上,这些调度器可以跨不同类型的计算范式管理不同的工作负载,以实现更高的利用率和效率。
- YARN —是一个资源管理和作业调度框架。
- Mesos —在多个不同的集群计算框架之间进行调度。
- Peloton是由优步构建的统一资源调度器,运行在 Mesos 之上,支持不同的工作负载——I)具有长期运行服务的无状态作业 ii)有状态作业长期运行的服务,如来自 Cassandra、MySQL 和 Redis 的服务,它们具有状态,iii)批处理作业或 iv)守护程序作业。
这些与 Hadoop 调度程序松散耦合,Hadoop 调度程序的主要功能是基于调度策略/配置来调度作业。比较流行的有容量调度和公平份额调度(此处背景)。
c)引擎— 是执行运行时,为运行不同种类的计算提供环境。两种最常见的引擎是
● Spark —在蓬勃发展的生态系统中广受欢迎和广泛采用。
● 弗林克——很像火花;优于火花的优势在于恰好一次流处理。
d)消息传递 — Kafka 是最广泛使用的数据处理消息传递系统。
e)安全
● Hadoop 安全设计——抓住 Hadoop 设计关键方面的开创性论文。可以在这里找到这些项目的概述。
● 阿帕奇密特隆 -是一个网络安全应用框架,为安全监控和异常检测提供一个集中的工具,具有日志聚合、完整数据包捕获索引、存储、高级行为分析和数据丰富的功能,同时将最新的威胁情报信息应用于安全遥测。
●Apache Knox——是 Hadoop 的 Web/REST API 网关解决方案。它通过 REST 提供了访问所有 Hadoop 资源的单一访问点。它充当虚拟防火墙,对入站请求强制执行身份验证和使用策略,并阻止所有其他内容。
● Apache Ranger —是一个用于 Hadoop 集群的策略管理工具。它包括一组广泛的管理功能,包括审计、密钥管理和跨 HDFS、Hive、YARN、Solr、Kafka 和其他模块的细粒度数据访问策略。
● Apache Sentry -对存储在 Apache Hadoop 中的数据进行细粒度授权。在 Hadoop 中跨多个数据访问路径实施一组通用策略。Apache Sentry 与 Apache Ranger 重叠,因为它也处理授权和许可。
f)可操作性 —操作框架提供了管理工作负载的指标、基准和性能优化功能。
- OpenTSDB —一个建立在 HBase 之上的时间序列度量系统。
- Ambari —是一个用于收集、聚合和提供 Hadoop 和系统指标的系统。
- Helix—LinkedIn 开发的一个通用集群管理系统。
- 螳螂 —螳螂平台建于网飞,提供可观察性以帮助快速识别问题,触发警报,并应用弹性以最小化或完全避免停机时间。
2.数据存储服务
作者图片
a)文件系统— 分布式文件系统提供存储、容错、可伸缩性、可靠性和可用性。
- Google 文件系统——分布式文件系统的开创性工作,塑造了 Hadoop 文件系统。
- Hadoop 文件系统-HDFS 发展的历史背景/架构。
- Ceph 文件系统—HDFS 的替代方案,融合了块、文件和对象存储。
- Alluxio 公司。超光速粒子-一种内存存储系统,用于处理现代低延迟数据处理。
b)文件格式— 文件系统也经历了文件格式和压缩技术的发展。面向列与行存储很好地概述了数据布局、压缩和物化。一篇比较和对比它们的好的综述论文可以在这里找到。一篇详细的论文在这里是。一个相关的主题是压缩技术及其在 Hadoop 生态系统上的比较。
- Avro——围绕protocol buffers——谷歌推广的语言中立序列化格式——为 Hadoop 生态系统建模。它是基于行的格式。
- 在 Google 的 Dremel 的论文中首次提到了面向列的拼花格式。
- orc file—Hive 使用的一种改进的面向列的格式。
- 箭头 —一种内存中独立于语言的列格式,用于平面和分层数据,还支持零拷贝读取,用于闪电般快速的数据访问,而没有序列化开销。
c)表格式— 最近,一组现代的表格式,如 Delta Lake、胡迪、Iceberg ( 比较)正试图通过 ACID 合规性、快照隔离、安全模式演化和对 CRUD 操作的高性能支持来解决事务性保证。
- Delta Lake —使用压缩成 Apache Parquet 格式的事务日志来提供 ACID 属性和时间旅行。
- Apache Iceberg —最初由网飞开发,提供事务保证、快照隔离、列投影和谓词下推。
- 阿帕奇胡迪 (Hadoop Upserts 删除和增量)——最初在优步开发,再次带来了数据湖的 ACID 合规性。
3.数据管理服务
作者图片
a)数据查询— 数据查询工具的范围从 SQL 这样的声明性语言到 Pig 这样的过程性语言。
- Pig —很好地概述了 Pig 拉丁语,而 Pig 则介绍了如何使用 Pig 构建数据管道。
- Hive —提供 Hive 的介绍,而 Hive 另一篇好文章试图分享 Hive 在脸书背后的动机。
- 凤凰—h base 上的 SQL。
- Spark SQL—Spark 上的关系数据处理。
- 方解石 —提供对异构数据源的优化查询处理,并嵌入到多个大数据系统中。
b)可视化
- 超集 —由 AirBnb 开发,是一款针对大数据的数据探索和数据可视化工具。
c)数据集成— 数据集成框架提供了在大数据系统之间接收和输出数据的良好机制。
- Sqoop——在 Hadoop 和关系数据存储之间移动数据的工具。
- Flume —面向流的数据流,从所有指定的服务器收集日志,并将其加载到中央存储。
- Goblin —最初由 LinkedIn 开发,简化了大数据集成的常见方面,如流数据和批量数据生态系统的数据摄取、复制、组织和生命周期管理。
- 马尔马拉——优步研发,支持摄食和扩散。
d)流程编排— 工具帮助构建数据管道
- 阿帕奇 Nifi -数据分发与处理系统;提供了一种将数据从一个地方移动到另一个地方的方法,并在移动过程中根据需要做出路由决策和转换。
- Apache air flow——最初由 AirBnb 开发,帮助创作、安排和监控工作流程。
- Oozie —管理 Hadoop 作业的工作流调度系统。
- 阿兹卡班——LinkedIn 开发的工作流管理器。
- Genie —网飞开发的数据管道框架。
e)元数据工具 —提供一个中心位置来接收新数据源、发现数据集和见解、浏览元数据、探索原始或相当未处理的数据以了解数据谱系、创建和共享见解以及查看数据质量监控&异常检测。
- 地面 —管理所有告知数据使用的信息的系统。
- Apache Atlas —数据治理平台,旨在与 Hadoop 堆栈中的其他工具和流程交换元数据、跟踪血统。
- DataHub —由 LinkedIn 开发,提供元数据发现和数据门户的完整解决方案。
- Amundsen —由 Lyft 开发,提供数据发现和元数据管理。
- Metacat —由网飞开发,提供统一的元数据探索 API 服务。
4.数据处理服务
作者图片
数据处理框架可以根据处理的模型和延迟大致分类。
a)Batch—MapReduce—来自 Google on MapReduce 的开创性论文。
b)流式传输
- Apache Beam 受 Google Dataflow 和 Millwheel 的启发,它统一了定义批处理和流数据并行处理流水线的模型。
- Flink — Flink 为编程模型和执行引擎中的实时分析、连续流和批处理提供了统一的模型。使用异步屏障同步处理状态。
- Spark Streaming —引入了连接传统批处理和交互处理的微批处理架构。
- Twitter Heron——公开了与 Storm 相同的 API 接口,但是在它的基础上进行了改进,具有更高的可扩展性、更好的可调试性、更好的性能,并且更易于管理。
- Samza—LinkedIn 的流处理框架。
c)互动
- Dremel——谷歌关于其如何处理交互式大数据工作负载的论文,该论文为 Hadoop 上的多个开源 SQL 系统奠定了基础。
- 脸书开发的开源 MPP SQL 查询引擎,可以快速处理大型数据集。
- Impala — MPI 风格的处理使 Hadoop 能够应对交互式工作负载。
- Drill—Dremel 的开源实现。
- Tez —使用 YARN 的得律阿德斯的开源实现。
d)实时
e)迭代
- Pregel——谷歌关于大规模图形处理的论文。
- Giraph —围绕 Google Pregel 建模的大规模分布式图形处理系统。
5.ML 服务
作者图片
ML 服务为机器学习开发人员、数据科学家和数据工程师提供基础,使他们的 ML 项目从构思到生产和部署,快速且经济高效。
a) ML 生命周期 —典型的 ML 生命周期始于数据准备,随后是(特征)发现、开发和训练模型、测试、部署,最后使用模型进行推理或预测。数据准备通常与获取、导出和清理足够的训练数据以馈入 ML 算法相关联。特征发现和提取识别对业务领域最重要的关键数据属性。部署包括可观察性、可调试性、监控和生产化。现代 ML 生命周期中有几个挑战(见科技债务)ML 生命周期系统正在试图解决。
著名的开源软件有(很好的概述这里):
- 来自 Databricks 的 MLFlow 的一个关键原则是开放接口设计,科学家和数据工程师可以将他们的模型引入到结构化环境中。
- 米开朗基罗由优步打造,允许大规模无缝构建、部署和操作机器学习解决方案。
- Metaflow 是网飞大学使用的一个 python 库,用于构建和部署数据科学工作流。
b)分布式处理框架— 在构建分布式深度学习框架方面有很多进展,这里可以找到很好的介绍其中比较流行的是谷歌的 GPIPE ,优步的 Horovard 和 DeepMind 的 TF-Replicator 。
特征存储库(Feature Stores)—特征存储库允许不同的团队管理、存储和发现用于机器学习项目的特征。它充当数据工程和数据科学之间的 API,实现改进的协作。这里有一个很棒的介绍,这里有列出的特色店列表。几个受欢迎的是来自谷歌的盛宴和一些背景这里的,来自 Logicalclocks 的 HopsWorks ,来自 LinkedIn 的 Frame 和来自 Airbnb 的 ZipLine 。
d) ML 库 — ML 开发人员通常希望尝试每一种可用的算法来构建最精确的模型,一个从事活动项目的团队可能会尝试多个处理库,常见的有 MxNet 、 TensorFlow 、 Clipper 、 Caffe 、 PyTorch 、 Theano 和Chainer
6.数据服务系统
作者图片
广义地说,分布式数据存储根据底层模式和支持的数据结构分为列、键值、文档、图形、搜索、关系和内存中。
a)面向列的商店
- BigTable—Google 关于分布式面向列的数据存储的开创性论文。
- HBase —虽然没有明确的论文,但这提供了该技术的一个很好的概述。
- Hypertable——围绕 BigTable 建模。
b)关键值商店
- Dynamo —关于键值分布式存储系统的开创性论文。
- 卡珊德拉——灵感来自迪纳摩;面向多维键值/列的数据存储。
- 伏地魔——另一个受迪纳摩启发,在 LinkedIn 开发的。
- RocksDB —由脸书开发,是一种日志结构数据库引擎,针对闪存驱动器和高速磁盘驱动器等快速、低延迟存储进行了优化。
c)文档存储
- CouchDB —一种流行的面向文档的数据存储。
- MongoDB —对 MongoDB 架构的很好介绍。
d)图形存储
- Neo4j —最流行的图形数据库。
- 泰坦—Apache 许可下的图形数据库。
e)搜索商店
f)时间序列
- TimeScaleDB —可伸缩的时间序列数据库。
- InfluxDB —另一个流行的时间序列数据库(差异)。
g)关系
- cocroach db——仿照谷歌的扳手。
- MySQL —广泛使用的关系数据库。
- 另一个非常流行的数据库。
h)内存中
附录
一些一般性的论文可以为您提供关于 NoSQL、数据仓库规模计算和分布式系统的背景知识。
- 分布式系统基础
- 作为计算机的数据中心–为仓库规模计算提供了很好的背景。
- 最终一致性–分布式系统不同一致性模型的背景。
- CAP 定理 —一个关于 CAP 及其演化的很好的背景及其评论。
- λ-典型数据管道的既定架构。
- Kappa–一种将处理向上游移动到流层的替代架构。
摘要
我希望这些文件在你开始或加强你的旅程时有用。在第二部分,我们将从云提供商的角度来看架构,而在第三部分,我们将了解一些领先的技术公司如何使用这些(或开发了类似的技术)来解决他们的业务问题。
最初发表于T5【https://www.linkedin.com】。
Pyspark 超参数搜索框架速度提高 100 倍
闪电力量。 Pixabay
现成的、可重用的、快速的代码
最近我在为一个巨大的机器学习模型调整超参数。
手动调整不是一个选项,因为我必须调整很多参数。 Hyperopt 也不是一个选项,因为它是连续工作的,也就是说,一次只能制造一个模型。所以训练每个模特要花很多时间,而我的时间很紧。
如果我要赶上最后期限,我必须想出一个更好更有效的方法。因此,我想到了在许多这样的场景中帮助我们数据科学家的一件事— 并行化。
我可以并行化我的模型超参数搜索过程吗?
你可能已经猜到了,答案是肯定的。
这篇文章是关于使用 scikit-learn/xgboost/lightgbm 和 pySpark 为数据科学建立一个超参数调优框架。
网格 vs 随机化?
在我们开始实现超参数搜索之前,我们有两个选项来设置超参数搜索——网格搜索或随机搜索。
从一个 3×3 的参数网格开始,我们可以看到随机搜索最终会对重要参数进行更多的搜索。
上图给出了为什么随机搜索更好的明确答案。
假设我们必须为我们的机器学习模型调整两个超参数。一个不重要,一个很重要。在网格搜索中,我们查看重要参数的三个设置。在随机搜索中,我们在 9 个设置中搜索重要参数。我们花的时间是一样的。
因为随机化搜索更彻底地搜索整个空间,并为我们提供更好的超参数,所以我们将在我们的示例中使用它。
树立我们的榜样
在我的工作场所,我可以访问一个有数百个节点的非常大的集群。这是数据科学家的梦想。但是在这篇文章中,我将使用 Databricks 社区版免费服务器和一个玩具示例。如果你想为自己设置这个小服务器进行练习,请查看我在 Spark 上的帖子。
您可以选择使用 Spark 加载数据,但是在这里,我首先创建我们自己的分类数据,以建立一个我们可以使用的最小示例。
X,y = datasets.make_classification(n_samples=10000, n_features=4, n_informative=2, n_classes=2, random_state=1,shuffle=True)train = pd.DataFrame(X)
train['target'] = y# Convert this pandas Data to spark Dataframe.
train_sp = spark.createDataFrame(train)# Change the column names.
train_sp = train_sp.toDF(*['c0', 'c1', 'c2', 'c3', 'target'])
train_sp
spark 数据集看起来像:
这个想法——复制和应用
现在我们在 Spark 中有了我们的训练数据集。我们想在这个数据框架上运行多个模型。
Spark 天生擅长键值对。也就是说,具有特定密钥的所有数据都可以发送到一台机器。我们可以对这些数据应用函数。
但是我们需要每台机器上的所有数据。我们如何做到这一点?
我们复制我们的数据 n 次,并给我们的数据添加一个 replication_id,这样每个键都有所有的数据。
好了,现在我们可以使用 replication_id 上的 groupby 将整个数据发送到多台机器。但是我们如何使用熊猫和 scikit 来学习这些数据呢?
答案是:我们用 pandas_udf。这个功能是在 Spark 版本 2.3.1 中引入的。这让你可以利用 Spark 的熊猫功能。
如果您还不理解这一点,请查看代码,因为有时理解代码更容易。
代码
在这里,我们首先通过将cross_join
与包含 1–100replication_id
的列的数据帧一起使用,将我们的训练数据帧复制 100 次。
# replicate the spark dataframe into multiple copiesreplication_df = spark.createDataFrame(pd.DataFrame(list(range(1,100)),columns=['replication_id']))**replicated_train_df = train_sp.crossJoin(replication_df)**
每一行都用不同的 replication_id 复制 100 次
我们还定义了一个函数,该函数将 pandas 数据帧作为输入,使用 python random 模块获取随机超参数,对数据运行模型(这里我训练的是 scikit 模型,但您也可以用任何模型(如 XGBoost 或 Lightgbm)替换它),并以 Pandas 数据帧的形式返回结果。一定要看看函数和注释。
这里不需要(太多)火花。该函数将熊猫数据框作为输入。
我们现在可以将这个pandas_udf
函数应用于我们复制的数据帧,使用:
results = replicated_train_df.groupby("replication_id").apply(run_model)
上面的代码所做的是将具有相同复制 id 的所有数据发送到一台机器上,并将函数run_model
应用到数据上。上面的调用是延迟发生的,所以在运行下面的操作调用之前,您无法看到结果。
results.sort(F.desc("Accuracy")).show()
我们的超参数搜索结果
对于这个玩具示例,精度结果可能看起来非常接近,但在嘈杂的真实世界数据集的情况下,它们会有所不同。由于这 100 个模型都是在不同的节点上并行运行的,所以我们在做随机超参数搜索的时候可以节省很多时间。
加速因子当然取决于集群中有多少节点。对我来说,我有 100 台机器可供我使用,所以我获得了大约 100 倍的加速。
你可以从这个数据砖笔记本中获得完整的代码,或者从我的 GitHub 仓库中获得,我在那里保存了我所有帖子的代码。
继续学习
如果你想了解更多关于实用数据科学的知识,请看看 Coursera 的 【如何赢得数据科学竞赛】 课程。我从卡格勒教授的这门课程中学到了很多新东西。
谢谢你的阅读。将来我也会写更多初学者友好的帖子。在 媒体 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。
此外,一个小小的免责声明——在这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
幸运的是,10 倍数据科学家不是“一件事”,让我们共同努力保持这种状态
我们真的不需要那种废话
嘎嘎(摄影:兰迪·欧)
这个周末,Medium 的拜占庭式文章推荐算法决定给我推荐一篇关于成为“10x 数据科学家”的文章。我的第一反应是“绝对 f-?”。我没有链接到它,因为这将奖励一个自我夸大的傻瓜的不良行为(在开放的互联网上宣布自己是 10 倍的任何东西,这需要一个全新的傲慢水平)。如果你必须阅读,搜索并使用谷歌缓存。
我后来意识到,这篇文章发表于 2019 年 10 月,谢天谢地不是最近,但距离写这篇文章还不到 5 个月。这也是 7 月份“10 倍工程师”首次病毒式增长的几个月后。在谷歌上搜索这个词,实际上在互联网上出现了相对少量的使用这个词的帖子,分散在过去 3 年左右。这多少让人松了一口气。它并没有在社区中广泛传播,只是一些博主试图获得廉价的点击率。
按照 2019 年时代精神的理解,整个 10 倍工程师神话是软件工程中可能存在的有毒刻板印象的结晶,我们需要将这种垃圾从数据科学中剔除。如果愚蠢的神话像病毒一样传播开来,并在这个领域之外占据主导地位,比如未来的学生、招聘人员和招聘人员,我们都会因此而遭受损失。
对于那些不熟悉 10x 的人来说,我们将在本文的后面介绍历史和细节。它的要点是,一些非常古老的研究发现,一些程序员在一些指标上比其他人表现得好几个数量级,如编写代码的执行速度、生成的代码行数等。在接下来的研究中,这个观察结果被简化为大约“10 比 1 ”,高性能者产生的代码量是最差性能者的 10 倍。
就其本身而言,观察到在一群人中有更高和更低的表现者并没有特别的争议,幂律分布是一毛钱一打。让整个事情像病毒一样传播的是这个概念是如何与“比其他人都好的孤独的混蛋程序员”的漫画联系在一起的。更糟糕的是,有人宣称这些“10x 工程师”是值得雇佣的,应该积极寻找。从那以后事情就变得疯狂了。
瓦特?!
故意找出有毒人格的核心概念是因为他们可以更好地编码,同时有效地让他们周围的每个人牺牲各种事情,这足以令人难以置信。在数据科学的背景下,这甚至更没有意义,因为这个领域是如此荒谬地跨职能。一个典型的数据人员将直接与整个组织中的所有人一起工作,通常是上下多层。你绝对不需要让一个拥有如此广泛影响力的人成为一个有毒的个体。在一个相对孤立的开发团队中强加这样的人已经是一种暴行,理论上你可以把他们封闭在一个 1 人的团队中。但是让他们和整个组织保持密切联系?还不如在开放式办公室计划里扔个炸弹。
需要说明的是,最初的 10x 概念的基本事实是,工程师(和数据科学家)之间的表现存在巨大的个体差异,这一点并没有真正的争议。有些人的表现不可避免地会比你想衡量的任何指标中表现最差的人好一个数量级。
互联网抓住并拒绝了这样一种观点,即组织中的每个人都应该忍受这些更有生产力的个人带来的任何有害垃圾,仅仅因为他们是高产的。
提示:有些高效的人不是混蛋,去雇佣他们吧。
数据社区非常棒,保持这种状态是我们的共同责任
数据社区是我所知道的最包容和积极的社区之一。我们有来自各行各业的人参加,从博士到高中生。艺术、社会科学和硬科学都有代表。有核心工程师,核心研究人员,各行各业的人,周末散客和学生,他们都对用数据来理解世界感兴趣。看看 datahelpers.org 的上的所有伟人吧。
Twitter 上的数据人群总体上是令人惊讶和开放的。几乎在这个领域的任何地方,你都可以很容易地与人交谈。有很多善意的玩笑,论文和话题的链接和讨论。
还有更广阔的精彩社区。围绕 R 建立了一个巨大的社区,包括用户组、meetup 组和会议。我甚至不知道如何真正使用 R,但仍然高度评价那个社区中的了不起的人。记得 2019 年 R-Ladies 在揭露巨大的数据营丑闻中发挥了重要作用。我们团结一致,大声疾呼,站出来说我们不会接受这种行为,这是社区的荣誉。
这也不是说一切都很完美,但你很难找到一个更好的技术团队。仍然有很多看门人看起来更感兴趣的是宣布什么是“真正的”数据科学,而不是对任何人有所帮助。我还确信,在这个巨大而丑陋的世界的某个地方,粗略的骚扰问题正在发生,没有任何独特的情况允许 DataCamp 丑闻像病毒一样传播。
我们有责任大声明确地说出什么是不可接受的。社会规范是一个社会保持稳定控制和自我节制的最佳方式之一。我们得到了一件好事,不能想当然。这东西分解得很快。
现在,来看看整个 10 倍的事情
对 10x 工程师概念的引用似乎要归因于 Sackman、Erikson 和 Grant 在 1968 年发表的一篇论文,“比较在线和离线编程性能的探索性实验研究”。(美国计算机学会通讯,1968 年 1 月)这是一篇相当短的论文,你必须把你的大脑包裹在历史背景中。简介中给出的研究的主要动机是这样的:关于传统的批处理或分时系统是否更好存在激烈的争论。当程序员可以一直使用电脑,在更昂贵的支持在线访问的硬件上反复调试代码时,他们会变得更懒吗?难道他们不应该在提交程序之前先在纸上手工推理出他们的代码吗?
“现在的孩子!”—最终每个人
这篇论文描述了分时系统是如何工作的,这对更现代的计算机用户来说听起来是非常基本的:
用户程序存储在磁带或磁盘文件存储器中。当用户希望操作他的程序时,他就去几个电传控制台中的一个;这些控制台是 Q-32 的直接输入/输出设备。他通过电传打字机指示计算机装入并启动他的程序。然后,系统将程序从磁盘文件或磁带装入活动存储磁鼓存储器。所有当前运行的程序都存储在磁鼓存储器中,并依次一次一个地传送到磁心存储器中进行处理。在 TSS(分时系统)的调度控制下,每个程序被处理一小段时间(通常是几分之一秒),然后被替换到活动存储器中,等待下一次处理。一个程序只有在需要处理时才被转移到核心;否则,该轮将被拒绝。因此,用户可以花尽可能多的时间来思考下一步做什么,而不会浪费机器的计算时间。
实验是一个 2×2 的设计。受试者(12 名经验丰富的程序员)被要求编写和调试两个问题——一个是“代数”问题,你要编写一个程序来解决输入到电传打字机中的代数方程;另一个是“迷宫”问题,他们必须编写一个程序来打印出通过 20x20 网格迷宫的单条路线。所有的受试者都“参考了公开发表的资料,以获得解决代数问题的可行逻辑建议”。
这些问题是在调试的“在线”条件下给出的,在这种情况下,他们使用 TSS 系统,可以完全访问系统上的所有内容。还有一个模拟的“离线”条件,使用相同的 TSS 系统,但用户必须成批提交他们的工作,并等待 2 小时,等待他们的工作返回。该研究指出,2 小时比典型的批处理系统短,但足够长,大多数受试者抱怨延迟。六名受试者在“在线”条件下接受代数问题,然后在“离线”条件下接受另一个问题,剩下的六名受试者接受在线迷宫。
测试结果表明,分时系统有利于减少用于调试的工时。有趣的是,在线代数问题的平均时间为 34.5 小时(30.5 SD),而调试问题的平均时间为 50.2 小时(58.9 SD)。平均 35 个人- 小时来解决一个棘手的问题!还要注意巨大的标准差。
这是那篇论文中的表 III,它将播下最初的种子,这将导致 10 倍的废话:
据观察,最好的程序员和最差的程序员之间的差别可能是巨大的。就花在调试代数问题上的时间而言,高达 28 比 1。研究人员还发现,在对简单问题进行类似实验的情况下,9 名“见习”程序员之间存在类似的巨大个体差异。
然后在“快速发展中,史蒂夫·麦康奈尔在 1996 年说了如下的话:
“自 20 世纪 60 年代末以来,一项又一项研究发现,经验水平相似的程序员的生产率确实相差至少 10 比 1 (Sackman,Erikson 和 Grant 1968,Curtis 1981,Mills 1983,DeMarco arid Lister 1985,Curtis 等人 1986,Card 1987,Valett 和 McGarry 1989)。”
这本书本身正面地强调了10 比 1 的理念,试图让读者相信他们也可以将他们的软件开发团队从 1 倍生产力的团队向 10 倍生产力的方向发展。这本书存在的全部原因是教读者(大型软件项目的经理)如何管理他们的团队,使其不像 1x 团队,并表现得更好。
最近引用的来自该段落的论文 McConnell,Valett 和 McGarry,1989 ,查看了 NASA 工程师为各种项目收集的大量项目数据,并显示(大致)最差者和最佳者之间存在 10 倍的差异。但是请注意,以今天的标准来看,这个指标是相当粗略的:源代码行数**/小时**。所以,总而言之,人们发现一些工程师可以像另一个工程师一样粗制滥造出 10 倍数量的代码。我将在以后的文章中更深入地研究这个 SLoC 度量的历史,因为它太大了,无法在这里涵盖。
整个 10x 的历史比我所能理解的还要曲折,因为研究人员 30 多年来发表了一篇又一篇论文。你可以点击这里,点击这里,为了获得更多的综述和引用,我最初把它们作为我的出发点。
从枯燥的学术/管理概念到荒谬的模因
自 2010 年以来(根据谷歌趋势),短语“10 倍工程师”不时会出现,这不是一个非常流行的术语。我想它只是静静地在软件管理文献中飘来飘去,并没有走出去。
Knowyourmeme 链接到许多关于 10x 工程师概念的文章或文章。见鬼,我找到一篇文章,说 10x 工程师的概念正在(令人高兴地)消失……发表于 2014 年。
直到 2019 年 7 月 11 日某个决定命运的一天:
一位投资者在推特上说,创业公司应该雇用 10 倍的工程师,以增加成功的几率……你如何找到这位 10 倍的工程师?显然你正在寻找某种 90 年代反社会的技术专家的卡通素描:讨厌开会,工作时间奇怪,使用黑屏背景(?!),知道产品中的每一行代码,拥有完整的堆栈,可以在几个小时内写出代码,很少使用文档,学习新的框架/语言,是糟糕的导师,不黑东西,很少换工作……这几乎够疯狂的了,它会认为这是讽刺,除了没有任何迹象表明这条推文不是认真的。
讽刺和嘲笑 回复来得又快又猛。然后火继续燃烧,因为 Shekhar 弯下腰:
博主们当然无法抗拒争议,开始写他们自己对 10x 工程师的看法,一些人进入了历史等等。很快它就传播开来,在黑客新闻等网站上找到了它的位置。
这种情况现在已经冷却下来,变成了一个彻底被嘲笑的迷因。但即使是现在,这个概念也存在于更广阔的世界中。缺乏经验和信息的人,不了解迷因的人仍然会问一些关于迷因的问题。过去一个月,我在 Quora 上搜索帖子,仍然有几个 10 倍的工程师问题:
数据科学有机会从情境中学习。我们真的应该听听。
这篇文章最初出现在 Randy 的 Counting Stuff 时事通讯上。通过https://counting.substack.com免费订阅这些文章,并直接放入你的收件箱
如果你因为冠状病毒而被锁在家里,11 堂最好的数据科学课
不用花一分钱就可以开始你的职业生涯
如果你在家的时间太多,为什么不投资在你的技能上呢?照片由 Unsplash 上的 Grzegorz Walczak 拍摄
S 哈克斯佩雷在隔离期间写了李尔王。牛顿在隔离期间为他的运动定律奠定了基础。人们在隔离期间制造有趣的迷因。
你能做什么?永远改变戏剧世界或彻底改变物理世界——我认为这个标准太高了。但你可以提高你在数据科学方面的技能,并在疫情结束后启动你的职业生涯。
我用来自学数据科学的 4 个工具没有花一美元
towardsdatascience.com](/how-i-went-from-zero-coding-skills-to-data-scientist-in-6-months-c2207b65f2f3)
这并不是所有职业的完整指南。如果你做一个简单的谷歌搜索,你会发现你一辈子都拿不完的东西…
相反,这是我和其他人发现特别有用的类的概要。哪些课程适合你取决于你目前的编程和统计技能水平。尽管在实践中编程和统计之间的界限是模糊的,但本指南将这两个学科分开,以便于浏览。
编程方面,三种语言必不可少:Python、R 和 shell 脚本。后者往往被初学者低估。但如果你是一名数据科学家,这是你的饭碗。您还会想了解一两件关于 Git 和 GitHub 的事情。
是时候编码了。马库斯·斯皮斯克在 Unsplash 上的照片
关于 Python 和 R,您可能只需要深入了解其中一个就可以了。这取决于你以后想在哪里工作。
你还需要一些关于数据库的知识。(你想成为一名数据科学家,对吗?SQL 是最先进的语言,所以我建议你在开始申请工作之前开始使用它。
在统计学方面,任何关于数据科学的普通课程都可以。其中许多还介绍了最重要的语言和技术环境。但我还是建议你也去上专门的语言课。因为。编程。是。重要!
由于我们中的许多人都面临着工作和预算的不安全感,我决定只列出免费资源。毕竟,对你的进步来说,你的纪律比你投资的金钱重要一千倍。
编程类
根据您当前的技能,您可能需要这里列出的部分或全部课程。我特意为每种语言只列出了一个,最多两个类,以避免混淆哪一个最适合你。
如果你是一个绝对的初学者,我建议你在继续下面列出的数据科学课程之前遵循所有这些。
1.计算机编程语言
learnpython.org的材料是一个很好的起点。这一切都是交互式的,不需要安装任何东西——你可以直接在浏览器中键入你的代码。
几个小时后,你可能会发现你可以摆弄它了。花几天时间,你就能编写自己的 basic 程序了。
迟早,你需要能够安装 Python 和相关的包。如果你觉得已经准备好了,你可以试试 Python 的官方资源。然而,我不鼓励你这样做,如果你以前没有编码经验,因为这可能是相当令人生畏的。
如果你有一些钱可以花,你可以通过 DataCamp 访问 Python 类。你可以以每月 25 美元的价格学习大多数课程,这些课程也是浏览器代码课程。然而,对于大多数目的来说,来自 Python 和 learnpython.org 的免费资源已经足够了。
2.稀有
哈佛大学的 edX 课程将为你提供开始学习 r 所需的一切。该课程为期 8 周,但你每周只需投入 1-2 小时。所以,即使你的日程很忙,这也是可行的。
如果你想多付出一点努力,获得更深层次的知识,还有约翰霍普金斯大学的 coursera class 。它长达四周,第一周花费 25 小时,之后每周花费 10-12 小时。本课程还包括安装,并为您提供一些背景知识。
使用数据科学中第二常用的编程语言 R 进行端到端的数据分析。
towardsdatascience.com](/getting-started-with-r-programming-2f15e9256c9)
3.结构化查询语言
虽然数据集在 Python 中很容易管理,但 SQL 是处理大数据量的好方法。w3schools.com 的教程涵盖了几乎所有的基础知识。
本教程包含大量浏览器代码示例,非常适合初学者。大约需要 10-15 个小时才能完成。
如果你更喜欢视频课程,你也可以试试可汗学院的课程。这里有更具挑战性的浏览器文本示例,但整个课程的时间会更短,你需要花 5-10 个小时来完成。
4.命令过程
一个很好的开始方式是艰难地学习代码的书。它非常系统,没有任何花哨的 UI。但这正是它的好处所在——稍后,您还将坐在命令行上,没有通常的图形颤音。
学习这门课需要一些纪律。但是值得。完成这个过程需要 5-10 个小时,取决于你潜水的深度。
5.开源代码库
如果你以前从未使用过 GitHub,我建议你阅读并遵循 Anne Bonner 的指南。它在这里:
Git 和 GitHub 基础知识,供好奇和完全困惑的人使用(加上最简单的方法来为您的第一次公开…
towardsdatascience.com](/getting-started-with-git-and-github-6fcd0f2d4ac6)
这是一个 18 分钟的阅读,但我建议你至少花几个小时开始。这是一个好主意,当你阅读指南的时候把所有的东西都准备好,因为你会一遍又一遍地需要这些东西。
如果你已经略知一二,那么 GitHub 的指南可以帮你填补空白。
那些统计数据不会自己掌握。由马库斯·斯皮斯克在 Unsplash 上拍摄的照片
数据科学和统计课程
如果你已经掌握了一些编程技巧,你可以利用这些课程来加深你在统计学方面的知识。参加一两门课就足够了——什么最适合你取决于你的时间预算和你喜欢的语言。
6.约翰·霍普金斯大学/ coursera:数据科学专业
时间:~200 小时(或 8 个月每周 6 小时),自定进度
语言:R,但 Python 是先决条件
这个课程是最值得推荐给有抱负的数据科学家的课程之一。它由 10 个子课程组成,你可以随意混合搭配。但是如果你想获得一个证书给你未来的雇主看,你必须做所有的事情。
7.哈佛工程学院:CS109 课程材料
时间:~100 小时(或每周 8 小时,共 13 周),自定进度
语言:Python
这是哈佛大学约翰·a·保尔森工程和应用科学学院教授的一堂真实的课。尽管它不像 coursera、edX 等网站上的在线课程,但浏览这些丰富的资料是一种享受。
8.哈佛大学/ edX:统计和研究
时间:8-16 小时(或每周 2-4 小时,共 4 周),自定进度
语言:R,基本编程是先决条件
鉴于时间有限,这门课涵盖了数据科学的基础知识。它更侧重于数据分析和可视化。如果你时间不多,但仍想学些东西,这是一个选择。
9.udacity:数据科学导论
时间:~100 小时(或 2 个月每周 10 小时),自定进度
语言:Python
这门课涵盖了从数据采集、分析到可视化的所有内容。小时数和互动形式可能是那些此刻被困在家里的人的理想选择。如果你以更高的强度工作,你可以在几周内完成!
10.德克萨斯大学/ edX:数据分析基础
时间:18-36 小时(或每周 3-6 小时,共 6 周),自定进度
语言:R,基本编程是先决条件
这门课程将自己定位为一门典型的本科统计学课程,并加入了建模元素。然而,由于投入的时间很少,我认为这更像是对统计学和建模的介绍。
11.密歇根大学/ coursera:应用数据科学
时间:~120 小时(或 4 个月每周 8 小时),自定进度
语言:Python
本课程的构成与 6 号课程相似,但实际操作性更强。它由 5 个子课程组成,你可以随意混合搭配。如果你已经知道你想从事什么行业,这可能会特别有用。例如,该课程的两个令人兴奋的部分是机器学习和社交网络分析。
是时候学习新东西了。安妮·斯普拉特在 Unsplash 上拍摄的照片
额外收获:统计学入门
6 到 11 级可能对数据科学有点陌生,也许你想先在你的基础上建立。在这种情况下,coursera 上有两个免费的课程,侧重于统计学的基础知识。选择哪一种(或者两者都选)取决于你更喜欢哪种语言。
密歇根大学/coursera:Python 专业统计学
时间:~56 小时(或 2 个月每周 7 小时),自定进度
语言:Python
适中的时间量使得这个过程非常适合典型的电晕锁定。它由三个子模块组成,包括理解和可视化数据、推理统计分析和拟合统计模型。
杜克大学/coursera:R 专业统计学
时间:~140 小时(或 7 个月每周 5 小时),自定进度
语言:R
这个类比 Python 中的同类类要长一点,因为它需要你完成更多的数学基础。它的五个子模块包括推理统计、线性回归和建模以及贝叶斯统计。如果你想建立一个坚实的数学基础,并享受 R,这是给你的。
最后一点:运用你的领域知识。你的网络呢
所有这些课程对所有能上网的人都开放。因此,虽然他们可能会给你打下良好的基础,但他们不会成为将你与其他候选人区分开来的优势。
想想是什么让你成为一名独一无二的数据科学家?你以前在哪些领域工作过——健康、数学、生物、化学、物理或完全不同的领域?
你需要改变你的心态
towardsdatascience.com](/9-reasons-why-youll-never-become-a-data-scientist-c8c5b75503cf)
你的关系网中谁能给你一个好的介绍?谁认识认识数据科学领域其他人的人?让你的人脉发挥作用。
最后,接受建议。不要相信我,相信其他已经转型为数据科学家的人。阅读《走向数据科学》中的故事是一个很好的起点。
但是你的目标也应该是与你所敬仰的人直接接触并安排非正式的面试。这样,你可以直接从他们的经历中学习。
对于那些被隔离的人,我希望这个指南有助于让你保持理智和知情。不管是否被隔离,我希望我们都能利用这些时间来建立一个更光明的未来。学习新的东西只是开始。
我是如何在不到 6 个月的时间里获得数据科学工作机会的
towardsdatascience.com](/the-ultimate-guide-to-getting-started-in-data-science-234149684ef7)
编辑 2020 年 3 月 23 日:正如Mark M所指出的,本文中没有统计 101 课程。我现在在统计中增加了一个带引子的奖励部分。
掌握熊猫分组功能的 11 个例子
在 EDA 过程中使用的最佳函数。
马库斯·斯皮斯克在 Unsplash 上的照片
Pandas Groupby 函数是一个多功能且易于使用的函数,有助于获得数据的概览。这使得探索数据集和揭示变量之间的潜在关系变得更加容易。
在本帖中,我们将通过 11 个不同的例子来全面理解 groupby 函数,并看看它在探索数据时如何有用。
我将使用客户流失数据集作为示例。第一步是将数据集读入熊猫数据帧。
import pandas as pd
import numpy as npdf = pd.read_csv("/content/Churn_Modelling.csv")df.head()
我们有一些关于银行客户及其产品的特征。这里的目标是预测客户是否会使用提供的功能流失(即退出= 1)。
从机器赚的角度来说,这是一个分类问题。Groupby 函数可用于探索特性如何相关或如何对目标变量产生影响(“Exited”)。
下图是 groupby 函数的逻辑和工作原理。
Groupby 函数(图片由作者提供)
让我们从例子开始。
第一个是检查性别对客户流失是否有影响。
#example 1
df[['Gender','Exited']].groupby('Gender').mean()
我们获取了数据帧的一个子集,它由性别和退出列组成。然后,我们根据性别列中的值(男性和女性)对行进行分组。最后,应用一个集合函数。结果是女性和男性的平均流失率。
除了平均值之外,您可能还想了解数据集中有多少男性和女性。如果存在极端的不平衡,检查平均值可能会导致错误的假设。
解决方案是将 mean 和 count 都用作聚合函数。
#example 2
df[['Gender','Exited']].groupby('Gender').agg(['mean','count'])
女性和男性的数量接近,所以不存在很大的不平衡。平均而言,女性的流失率高于男性。
你可能会觉得只根据性别来做比较太笼统了。在这种情况下,我们可以通过向 group by 函数传递一个列列表来按多个列进行分组。
#example 3
df[['Gender','Geography','Exited']].groupby(['Gender','Geography']).mean()
在我们的数据集中,这三个国家的女性流失率较高。
我们也可以对结果进行排序。
#example 4
df[['Gender','Geography','Exited']].groupby(['Gender','Geography']).mean().sort_values(by='Exited')
结果按升序排列,但我们可以使用升序参数进行更改。
#example 5
df[['Gender','Geography','Exited']].groupby(['Gender','Geography']).mean().sort_values(by='Exited', ascending=False)
我们还可以基于另一个特征中的组来检查多个特征。让我们来看看不同国家的年龄和任期是如何变化的。
#example 6
df[['Geography','Age','Tenure']].groupby(['Geography']).agg(['mean','max'])
在这三个国家中,年龄和任期列的平均值和最大值非常接近。
让我们也将“Exited”列添加到示例 6 中。
#example 7
df[['Exited','Geography','Age','Tenure']].groupby(['Exited','Geography']).agg(['mean','count'])
我们可以根据任何列对结果进行排序。但是,由于它是一个多索引,我们需要向 sort_values 函数传递一个元组。
#example 8
df[['Exited','Geography','Age','Tenure']].groupby(['Exited','Geography']).agg(['mean','count']).sort_values(by=[('Age','mean')])
结果按(“年龄”、“平均值”)列排序。
groupby 函数中的变量作为结果数据帧的索引返回。我们可以通过将 as_index 参数设置为 false 来改变它。
#example 9
df[['Exited','IsActiveMember','NumOfProducts','Balance']].groupby(['Exited','IsActiveMember'], as_index=False).mean()
groupby 函数中的每一列都用一个列表示。每个类别组合都有一行。
默认情况下,groupby 函数会删除缺少的值。我们的数据集没有任何缺失值。让我们添加一些缺失的值,看看如何使用 dropna 参数。
#example 10
df['Geography'][30:50] = np.nandf[['Geography','Exited']].groupby('Geography').mean()
尽管我们在 geography 列中缺少值,但它们被忽略了。我们可以通过将 dropna 参数设置为 false 来更改它。
#example 11
df[['Geography','Exited']].groupby('Geography', dropna=False).agg(['mean','count'])
如您所见,还有另一类缺失值。
注意:为了使用 groupby 函数的 dropna 参数,你需要有 pandas 版本 1.1.0 或更高版本。
我们可以多样化的例子,但基本的逻辑是相同的。Groupby 函数可用作探索性数据分析过程的第一步,因为它让我们了解数据集中变量之间的关系。
感谢阅读。如果您有任何反馈,请告诉我。
掌握 Python 列表理解的 11 个例子
如何有效地使用列表理解?
图片由皮克斯拜的 Gerd Altmann 提供
List 是 Python 中内置的数据结构,方括号中是数据点的集合。列表可用于存储任何数据类型或不同数据类型的混合。
在这篇文章中,我们将通过 11 个例子介绍 python 中的列表理解。我试图根据它们的复杂程度(在我看来)对例子进行排序。
列表理解基本上是基于现有的可重复项创建列表。它还可以被描述为用更简单、更吸引人的语法来表示 for 和 if 循环。列表理解相对来说比循环要快。
Python 列表理解
所以我们迭代一个 iterable 并做一些事情(可选!),然后将它们放在一个列表中。在某些情况下,我们只取符合特定条件的项目。
让我们从例子开始。
#example 1
import numpy as npa = [4,6,7,3,2]b = [x for x in a if x > 5]
b
[6, 7]
我们迭代一个列表(iterable)并获取大于 5 的元素(condition)。
for 循环的等价形式是:
b = []
for x in a:
if x > 5:
b.append(x)
b
[6, 7]
在将项目放入新列表之前,我们还可以对其进行一些处理:
#example 2
import numpy as npa = [4,6,7,3,2]b = [x*2 for x in a if x > 5]
b
[12, 14]
我们将符合条件的项目乘以 2,然后放入一个列表中。
第三个示例是字符串列表:
#example 3
names = ['Ch','Dh','Eh','cb','Tb','Td']new_names = [name for name in names if name.lower().startswith('c')]new_names
['Ch', 'cb']
条件是 string 以字母“c”开头。因为我们既有大写字母也有小写字母,所以我们首先将所有字母转换成小写字母。
iterable 不一定是列表。它可以是任何 python 可迭代的。例如,我们可以迭代一个二维 NumPy 数组,它实际上是一个矩阵。
#example 4
import numpy as np
A = np.random.randint(10, size=(4,4))
A
array([[1, 7, 4, 4],
[5, 0, 0, 6],
[7, 5, 8, 4],
[1, 3, 2, 2]])max_element = [max(i) for i in A]
max_element
[7, 6, 8, 3]
我们迭代矩阵 A 中的行并取最大值。
列表可以存储任何数据类型。我们来做一个列表列表的例子。
#example 5
vals = [[1,2,3],[4,5,2],[3,2,6]]
vals_max = [max(x) for x in vals]
vals_max
[3, 5, 6]
我们在每个列表中创建一个最大值列表。
在列表理解中,我们可以有多个条件。
#example 6
names = ['Ch','Dh','Eh','cb','Tb','Td','Chb','Tdb']new_names = [name for name in names if
name.lower().endswith('b') and len(name) > 2]new_names
['Chb', 'Tdb']
我们得到以字母“b”结尾并且长度大于 2 的字符串。
我们可以用其他逻辑运算符组合多个条件:
#example 7
names = ['chb', 'ydb', 'thd', 'hgh']new_names = [name for name in names
if name.endswith('b') | name.startswith('c')]new_names
['chb', 'ydb']
我们也可以有更复杂一点的嵌套列表理解。它们表示嵌套的 for 循环。
考虑下面的列表列表:
vals = [[1,2,3],[4,5,2],[3,2,6]]
我们希望从嵌套列表中取出每个元素,因此期望的输出是:
vals = [1,2,3,4,5,2,3,2,6]
下面是执行此操作的嵌套列表理解:
#example 8
vals = [[1,2,3],[4,5,2],[3,2,6]]vals_exp = [y for x in vals for y in x]vals_exp
[1, 2, 3, 4, 5, 2, 3, 2, 6]
语法可能看起来不太直观。与等效的 for 循环相比,这一点就很清楚了。
对于循环和列表理解(图片由作者提供)
我们将嵌套 for 循环的块放入一个列表理解中。
注:例 7 中有一个更简单的操作方法,就是熊猫的爆炸功能。我使用列表理解只是为了显示结构。可以使用分解功能完成,如下所示:
pd.Series(vals).explode()
它返回一个熊猫系列,但是你可以很容易地把它转换成一个列表。
我们也可以在嵌套列表理解中添加条件。考虑下面的字符串列表。
text = [['bar','foo','fooba'],['Rome','Madrid','Houston'], ['aa','bb','cc','dd']]
我们只需要长度大于 3 的嵌套列表中的字符串。
#example 9
text_1 = [y for x in text if len(x)>3 for y in x]text_1
['aa', 'bb', 'cc', 'dd']
我们将条件放在嵌套列表上,而不是放在单个元素上。因此,等效的嵌套 for/if 循环语法如下。
我们也可以对单个元素设置条件。
#example 10
text_2 = [y for x in text for y in x if len(y)>4]text_2
['fooba', 'Madrid', 'Houston']
我们现在有超过 4 个字符的字符串。因为条件是在单个元素上,所以等价的嵌套 for/if 循环:
我们可能还需要在嵌套列表和单个项目上设置条件。
#example 11
text_3 = [y.upper() for x in text if len(x) == 3 for y in x if y.startswith('f')]text_3
['FOO', 'FOOBA']
我们在长度为 3 的嵌套列表中获取以字母“f”开头的项目,然后将所选项目的所有字母转换为大写。
等效的 for/if 循环:
**提示:**当你不确定并且找不到理解列表的语法时,试着用 for/if 循环来构建。然后,你可以通过在列表理解中添加单独的循环块,将其转换为列表理解。
额外收获:何时不使用列表理解
列表理解将整个输出列表加载到内存中。这对于小型或中型的列表来说是可以接受的,甚至是可取的,因为它使操作更快。然而,当我们处理大型列表(例如 10 亿个元素)时,应该避免理解列表。这可能会导致您的计算机崩溃,由于内存需求的极端数额。
对于这种大型列表,更好的替代方法是使用一个生成器,它实际上不会在内存中创建大型数据结构。生成器在使用项目时创建项目。物品用完后,生成者会将它们扔掉。使用生成器,我们可以请求 iterable 中的下一项,直到到达末尾,每次存储一个值。
感谢您的阅读。如果您有任何反馈,请告诉我。
简单解释 11 种最常见的机器学习算法
常用机器学习算法综述。
圣地亚哥·拉卡尔塔在 Unsplash 上拍摄的照片
近年来,由于高需求和技术进步,机器学习的流行程度已经大大增加。机器学习从数据中创造价值的潜力使其对许多不同行业的企业具有吸引力。大多数机器学习产品都是用现成的机器学习算法设计和实现的,只做了一些调整和微小的更改。
有各种各样的机器学习算法,可以分为三个主要类别:
- 监督学习算法在给定一组观察值的情况下,对特征(独立变量)和标签(目标)之间的关系进行建模。然后,该模型被用于使用这些特征来预测新观察的标签。根据目标变量的特性,可以是分类(离散目标变量)或回归(连续目标变量)任务。
- 无监督学习算法试图在无标签数据中找到结构。
- 强化学习基于行动奖励原则工作。一个代理通过迭代计算其行动的回报来学习达到一个目标。
在这篇文章中,我将讨论前两类中最常见的算法。
注:虽然深度学习是机器学习的一个子领域,但我不会在本帖中包含任何深度学习算法。我认为深度学习算法由于复杂性和具有明显的动态性,应该单独讨论。此外,我不想把这篇文章写得太长,让读者感到厌烦。
我们开始吧。
1。线性回归
线性回归是一种监督的学习算法,它试图通过将线性方程拟合到数据上来模拟连续目标变量和一个或多个独立变量之间的关系。
线性回归是一个好的选择,自变量和目标变量之间需要有线性关系。有许多工具可以探索变量之间的关系,如散点图和相关矩阵。例如,下面的散点图显示了自变量(x 轴)和因变量(y 轴)之间的正相关关系。一个增加,另一个也增加。
线性回归模型试图将回归线拟合到最能代表关系或相关性的数据点。最常用的技术是普通最小二乘法 (OLE)。使用这种方法,通过最小化数据点和回归线之间距离的平方和来找到最佳回归线。对于上面的数据点,使用 OLE 获得的回归线看起来像:
2.支持向量机
支持向量机(SVM)是一种监督的学习算法,主要用于分类任务,但也适用于回归任务。
SVM 通过画一个**决定边界来区分阶级。**如何绘制或确定决策边界是 SVM 算法中最关键的部分。在创建决策边界之前,在 n 维空间中绘制每个观察值(或数据点)。“n”是使用的特征数量。例如,如果我们使用“长度”和“宽度”来对不同的“细胞”进行分类,则观察值被绘制在二维空间中,而决策边界是一条线。如果我们使用 3 个特征,则判定边界是三维空间中的平面。如果我们使用 3 个以上的特征,决策边界就变成了一个超平面,很难可视化。
2D 空间中的决策边界是一条线
以到支持向量的距离最大化的方式绘制决策边界。如果决策边界离支持向量太近,会对噪声高度敏感,不能很好地泛化。即使独立变量非常小的变化也可能导致错误分类。
数据点并不总是线性可分的,如上图所示。在这些情况下,SVM 使用核技巧,它测量高维空间中数据点的相似性(或接近度)以使它们线性可分。
核函数是一种相似性度量。输入是原始特征,输出是新特征空间中的相似性度量。这里的相似性是指接近的程度。将数据点实际转换到高维特征空间是一个代价很高的操作。该算法实际上并不将数据点转换到新的高维特征空间。内核化 SVM 根据高维特征空间中的相似性度量来计算决策边界,而不实际进行变换。我想这也是为什么又叫内核绝招的原因吧。
SVM 在维数大于样本数的情况下特别有效。当寻找决策边界时,SVM 使用训练点的子集,而不是所有点,这使得它的记忆效率。另一方面,对于大型数据集,训练时间会增加,这会对性能产生负面影响。
3。朴素贝叶斯
朴素贝叶斯是一种用于分类任务的监督学习算法。因此,它也被称为朴素贝叶斯分类器。
朴素贝叶斯假设特征相互独立和特征之间没有相关性。然而,现实生活中并非如此。这种特征不相关的天真假设是这种算法被称为“天真”的原因。
朴素贝叶斯算法背后的直觉是贝叶斯定理:
p(A|B):给定事件 B 已经发生的概率
p(B|A):给定事件 A 已经发生,事件 B 发生的概率
p(A):事件 A 的概率
p(B):事件 B 的概率
朴素贝叶斯分类器计算给定一组特征值(即 p(yi | x1,x2,…,xn))的类的概率。把这个输入到贝叶斯定理中:
p(x1,x2,…,xn | yi) 表示给定类别标签的特定特征组合(数据集中的一个观察值/行)的概率。我们需要非常大的数据集来估计所有不同特征值组合的概率分布。为了克服这个问题,**朴素贝叶斯算法假设所有特征都是相互独立的。**此外,分母(p(x1,x2,…,xn))可以被移除以简化方程,因为它仅归一化给定观察值的类的条件概率的值(p(yi | x1,x2,…,xn))。
一个类的概率(p(yi))很容易计算:
在特征相互独立的假设下, p(x1,x2,…,xn | yi) 可以写成 :
给定类标签(即 p(x1 | yi))的单个特征的条件概率可以更容易地从数据中估计出来。该算法需要独立地存储每个类别的特征的概率分布。例如,如果有 5 个类别和 10 个特征,则需要存储 50 个不同的概率分布。
将所有这些加起来,对于朴素贝叶斯算法来说,计算观察一类给定值的特征的概率( p(yi | x1,x2,…,xn) ) 变得很容易
所有特征都是独立的假设使得朴素贝叶斯算法比复杂算法更快。在某些情况下,速度优先于更高的精度。另一方面,相同的假设使得朴素贝叶斯算法不如复杂算法准确。速度是有代价的!
4。逻辑回归
逻辑回归是一种监督学习算法,主要用于二元 分类问题。虽然“回归”与“分类”相矛盾,但这里的重点是“逻辑”一词,指的是在该算法中执行分类任务的逻辑函数**。逻辑回归是一种简单但非常有效的分类算法,因此它通常用于许多二元分类任务。客户流失、垃圾邮件、网站或广告点击预测是逻辑回归提供强大解决方案的一些领域的例子。**
逻辑回归的基础是逻辑函数,也称为 sigmoid 函数,它接受任何实数值并将其映射到 0 到 1 之间的值。
假设我们要求解以下线性方程:
逻辑回归模型将线性方程作为输入,并使用逻辑函数和对数比值来执行二元分类任务。然后,我们会得到著名的逻辑回归 s 形图:
我们可以“原样”使用计算出的概率。例如,输出可以是“此电子邮件是垃圾邮件的概率是 95%”或“客户点击此广告的概率是 70%”。然而,在大多数情况下,概率被用来分类数据点。例如,如果概率大于 50%,则预测为正类(1)。否则,预测为负类(0)。
并不总是希望为所有高于 50%的概率值选择正类。关于垃圾邮件的情况,为了将一封邮件归类为垃圾邮件,我们必须几乎确定。由于被检测为垃圾邮件的电子邮件会直接进入垃圾邮件文件夹,我们不希望用户错过重要的电子邮件。除非我们几乎确定,否则电子邮件不会被归类为垃圾邮件。另一方面,当健康相关问题的分类需要我们更加敏感时。即使我们有点怀疑一个细胞是恶性的,我们也不想错过它。因此,作为正类和负类之间的阈值的值取决于问题。好的一面是,逻辑回归允许我们调整这个阈值。
5.k 最近邻(kNN)
k-最近邻(kNN)是一种监督的学习算法,可用于解决分类和回归任务。kNN 背后的主要思想是,数据点的值或类是由其周围的数据点决定的。
kNN 分类器通过多数表决原则确定数据点的类别。例如,如果 k 设置为 5,则检查 5 个最近点的类。根据多数类进行预测。类似地,kNN 回归取 5 个最近点的平均值。让我们看一个例子。考虑以下属于 4 个不同类别的数据点:
让我们看看预测类如何根据 k 值变化:
确定最佳 k 值是非常重要的。如果 k 太低,模型太具体,不能很好地概括。它对噪音也很敏感。该模型在训练集上实现了高精度,但是在新的、以前看不到的数据点上将是差的预测器。因此,我们很可能以一个过度拟合的模型而告终。另一方面,如果 k 太大,则该模型太一般化,并且在训练集和测试集上都不是好的预测器。这种情况被称为欠适配。
kNN 简单且易于解释。它不做任何假设,因此可以在非线性任务中实现。随着数据点数量的增加,kNN 变得非常慢,因为模型需要存储所有的数据点。因此,它也不是内存高效的。kNN 的另一个缺点是它对异常值很敏感。
6.决策树
决策树建立在反复询问问题以划分数据的基础上。用决策树的可视化表示来概念化分区数据更容易:
这代表了预测客户流失的决策树。第一次拆分基于每月费用金额。然后算法不断提问分离类标签。随着树越来越深,问题也越来越具体。
决策树算法的目标是在每次分区时尽可能提高预测性,以便模型不断获得有关数据集的信息。随机分割要素通常不会让我们对数据集有有价值的了解。增加节点纯度的分割更能提供信息。节点的纯度与该节点中不同类的分布成反比。要问的问题是以增加纯度或减少杂质的方式选择的。
我们要问多少问题?我们什么时候停止?什么时候我们的树足以解决我们的分类问题?所有这些问题的答案将我们引向机器学习中最重要的概念之一:过拟合。模型可以一直提问,直到所有节点都是纯的。然而,这将是一个过于具体的模型,不能很好地概括。它在训练集上实现了高精度,但在新的、以前看不到的数据点上表现不佳,这表明过拟合。树的深度由 scikit-learn 中决策树算法的 max_depth 参数控制。
决策树算法通常不需要归一化或缩放特征。它也适用于处理混合的要素数据类型(连续、分类、二进制)。消极的一面是,它容易过度拟合,需要集合才能很好地概括。
6.随机森林
随机森林是许多决策树的集合。随机森林是用一种叫做装袋的方法建立的,在这种方法中,决策树被用作并行估计器。如果用于分类问题,结果基于从每个决策树接收的结果的多数投票。对于回归,叶节点的预测是该叶中目标值的平均值。随机森林回归取决策树结果的平均值。
随机森林降低了过度拟合的风险,并且准确性比单个决策树高得多。此外,随机森林中的决策树并行运行,因此时间不会成为瓶颈。
随机森林的成功高度依赖于使用不相关的决策树。如果我们使用相同或非常相似的树,总体结果将不会比单个决策树的结果有太大的不同。随机森林通过自举和特征随机性实现不相关的决策树。
bootstrapping是从带有替换的训练数据中随机选择样本。它们被称为 bootstrap 样本。
自举样本(图源)
特征随机性通过为随机森林中的每个决策树随机选择特征来实现。随机森林中每棵树使用的特征数量可以通过 max_features 参数控制。
特征随机性
随机森林是许多不同问题的高度精确的模型,不需要标准化或缩放。但是,与快速线性模型(即朴素贝叶斯)相比,它不是高维数据集(即文本分类)的好选择。
7.梯度推进决策树(GBDT)
GBDT 是一种集成算法,使用 boosting 方法来组合个体决策树。
Boosting 是指将一个学习算法串联起来,从许多顺序连接的弱学习器中实现一个强学习器。在 GBDT 的例子中,弱学习器是决策树。
每棵树都试图最小化前一棵树的错误。boosting 中的树是弱学习器,但是连续添加许多树,并且每个树集中于前一个树的错误,使得 boosting 成为高效且准确的模型。与装袋不同,增压不涉及自举取样。每次添加新树时,它都适合初始数据集的修改版本。
由于树是按顺序添加的,boosting 算法学习起来很慢。在统计学习中,学习速度慢的模型表现更好。
损失函数用于检测残差。例如,均方误差(MSE)可用于回归任务,对数损失(log loss)可用于分类任务。值得注意的是,当添加新的树时,模型中现有的树不会改变。添加的决策树符合当前模型的残差。
学习率和 n_estimators 是梯度推进决策树的两个关键超参数。学习率,表示为α,简单地表示模型学习的速度。每个新的树修改整个模型。修改的幅度由学习速率控制。 n_estimator 是模型中使用的树的数量。如果学习率低,我们需要更多的树来训练模型。然而,我们需要非常小心地选择树的数量。使用太多的树会产生过度适应的高风险。
与随机森林相比,GBDT 在分类和回归任务上都非常高效,并且提供了更准确的预测。它可以处理混合类型的特征,并且不需要预处理。GBDT 要求仔细调整超参数,以防止模型过度拟合。
GBDT 算法非常强大,已经实现了许多升级版本,如 XGBOOST、LightGBM、CatBoost。
关于过度配合的注意事项
随机森林和梯度推进决策树之间的一个关键区别是模型中使用的树的数量。增加随机森林中的树木数量不会导致过度拟合。在某个点之后,模型的准确性不会因为添加更多的树而增加,但是也不会因为添加过多的树而受到负面影响。由于计算原因,您仍然不希望添加不必要数量的树,但是没有与随机森林中的树的数量相关联的过度拟合的风险。
然而,梯度提升决策树中的树的数量在过度拟合方面非常关键。添加太多的树会导致过度拟合,所以在某个时候停止添加树是很重要的。
8。k-均值聚类
聚类是一种对一组数据点进行分组的方法,将相似的数据点分组在一起。因此,聚类算法寻找数据点之间的相似或相异之处。聚类是一种无监督的学习方法,因此没有与数据点相关联的标签。聚类算法试图找到数据的底层结构。
聚类不是分类。
分类任务中的观察值(或数据点)有标签。根据一些测量值对每个观察值进行分类。分类算法试图对观测值的测量值(特征)和它们的指定类别之间的关系进行建模。然后,模型预测新观察的类别。
K 均值聚类旨在将数据划分为 K 个聚类,使得同一聚类中的数据点相似,而不同聚类中的数据点相距较远。因此,它是一种基于划分的聚类技术。两点的相似性由它们之间的距离决定。
K-means 聚类试图最小化一个类内的距离,最大化不同类之间的距离。K-means 算法不能确定聚类数。我们需要在创建 KMeans 对象时定义它,这可能是一项具有挑战性的任务。
考虑以下数据集的 2D 可视化:
它可以分为以下 4 个不同的集群:
现实生活中的数据集要复杂得多,其中的聚类没有明显的区分。但是,算法的工作方式是一样的。K-means 是一个迭代过程。它基于期望最大化算法。确定集群数量后,它通过执行以下步骤来工作:
- 为每个簇随机选择质心(簇的中心)。
- 计算所有数据点到质心的距离。
- 将数据点分配给最近的聚类。
- 通过取聚类中所有数据点的平均值,找到每个聚类的新质心。
- 重复步骤 2、3 和 4,直到所有点收敛并且聚类中心停止移动。
K-Means 聚类相对较快且易于解释。它还能够以一种智能的方式选择初始质心的位置,从而加快收敛速度。
k-means 的一个挑战是必须预先确定聚类的数量。K-means 算法无法猜测数据中存在多少个聚类。如果数据中存在非线性结构来分隔组,k-means 将不是一个好的选择。
9。层次聚类
分层聚类意味着通过迭代分组或分离数据点来创建聚类树。有两种类型的分层聚类:
- 凝聚聚类
- 分裂聚类
分层聚类的优点之一是我们不必指定聚类的数量(但是我们可以)。
聚集聚类是一种自下而上的方法。每个数据点首先被假定为一个单独的聚类。然后迭代地组合相似的聚类。
上图称为树状图,这是一个表示基于树的方法的图表。在层次聚类中,树状图用于可视化聚类之间的关系。
层次聚类的优点之一是我们不必预先指定聚类的数量。但是,将所有数据点合并到一个聚类中是不明智的。我们应该在某个时候停止组合集群。Scikit-learn 为此提供了两个选项:
- 达到一定数量的簇后停止( n_clusters )
- 设置联动的阈值(距离 _ 阈值)。如果两个聚类之间的距离超过阈值,这些聚类将不会被合并。
分裂聚类在现实生活中并不常用,所以我将简单地提到它。简单而清晰的解释是分裂集群是凝聚集群的反义词。我们从一个包含所有数据点的巨大集群开始。然后数据点被分成不同的簇。这是一种自上而下的方法。
分层聚类总是生成相同的聚类。k-均值聚类可能会产生不同的聚类,这取决于质心(聚类的中心)是如何开始的。然而,与 k-means 相比,它是一种较慢的算法。分层聚类需要很长时间来运行,尤其是对于大型数据集。
10。数据库扫描聚类
基于分区和层次聚类技术对于正常形状的聚类非常有效。然而,当涉及到任意形状的聚类或检测异常值时,基于密度的技术更有效。
任意形状的簇
任意形状的簇
DBSCAN 代表den sity-basssclustering ofa应用与 n oise。它能够找到任意形状的聚类和带有噪声的聚类(即异常值)。
DBSCAN 背后的主要思想是,如果一个点靠近来自该簇的许多点,则该点属于该簇。
DBSCAN 有两个关键参数:
- eps :指定邻域的距离。如果两点之间的距离小于或等于 eps,则认为这两点是相邻的。
- minPts: 定义一个聚类的最小数据点数。
基于这两个参数,点被分类为核心点、边界点或异常点:
- **核心点:**如果一个点在其半径为 eps 的周围区域内至少有 minPts 个数的点(包括该点本身),则该点为核心点。
- **边界点:**如果一个点可以从一个核心点到达,并且其周围区域内的点数少于 minPts,那么这个点就是边界点。
- 离群点:如果一个点不是核心点,并且从任何核心点都不可达,那么这个点就是离群点。
DBSCAN 不需要预先指定簇的数量。它对异常值是鲁棒的,并且能够检测异常值。
在某些情况下,确定适当的邻域距离(eps)并不容易,这需要领域知识。
11。主成分分析
PCA 是一种降维算法,它基本上从现有的特征中获得新的特征,同时尽可能多地保留信息。PCA 是一种非监督学习算法,但它也广泛用作监督学习算法的预处理步骤。
PCA 通过查找数据集中要素之间的关系来获取新要素。
注 : PCA 是一种线性降维算法。也有非线性方法可用。
PCA 的目的是通过使用较少的特征(或列)尽可能多地解释原始数据集中的差异。新的衍生特征称为**主成分。**主成分的顺序是根据它们所解释的原始数据集的方差分数来确定的。
主成分是原始数据集特征的线性组合。
PCA 的优点是使用比原始数据集少得多的特征保留了原始数据集的大量差异。主成分是根据它们解释的方差大小排序的。
感谢您的阅读。如果您有任何反馈,请告诉我。
掌握 Python 列表的 11 个必知操作
附有示例的综合实践指南。
List 是 Python 中内置的数据结构。它表示为方括号中的数据点集合。列表可用于存储任何数据类型或不同数据类型的混合。
列表是可变的,这也是它们被广泛使用的原因之一。然而,在某些情况下,可变性需要格外小心。
在本帖中,我们将介绍 11 个非常重要的操作,几乎涵盖了你需要了解的关于 Python 列表的所有内容。
1.从列表中删除元素的三种方法
第一种方法是 del 函数。我们刚刚经过了要删除的元素的索引。
a = [1, 2, 'x', 4, 5]
del(a[0])
print(f'a is {a}')a is [2, 'x', 4, 5]
我们可以使用 remove 函数来查找要删除的值。
a = [1, 2, 'x', 4, 5]
a.remove('x')
print(f'a is {a}')a is [1, 2, 4, 5]
第三种方法是 pop 函数,默认情况下它删除列表的最后一个元素。与其他两个函数不同,pop 返回被删除的值。因此,我们可以选择将它赋给不同的变量。
a = [1, 2, 'x', 4, 5]
b = a.pop()
print(f'a is {a}')
print(f'b is {b}')a is [1, 2, 'x', 4]
b is 5
Edit : Pop 常用于弹出(或移除)列表的最后一个元素。但是,它也可以通过提供索引来删除任何元素。感谢 Keethesh 在评论中的提醒。
a.pop(-1) #removes the last element
a.pop(2) #removes the third element
注意:列表有两种索引方式:
- 从开始到结束:0,1,2,3
- 从结束到开始:-1,-2,-3
a = ['x','y','z','t','u','v']print(a[-1])
vprint(a[2])
z
2.追加 vs 扩展 vs 插入
Append 用于将项目添加到列表中。
a = [1, 2]
a.append(3)
a
[1, 2, 3]
无论你在列表中添加什么,它都将成为列表中的一项。
a = [1, 2]
b = [3, 4, 5]
a.append(b)
a
[1, 2, [3, 4, 5]]
列表 b 成为列表 a 的第三个项目。如果您想要创建一个列表,该列表是 a 和 b 中的项目的组合([1,2,3,4,5]),您需要使用 extend 函数或“+”运算符。
a = [1, 2]
b = [3, 4, 5]a.extend(b)
a
[1, 2, 3, 4, 5] # a + b will give the same result
insert 函数也用于向列表中添加元素。但是,它允许指定新元素的索引。例如,我们可以在列表的开头添加一个新元素(index=0)。
a = [1, 2, 3, 4, 5]
a.insert(0, 'a')
a
['a', 1, 2, 3, 4, 5]
第一个参数是索引,第二个参数是值。
3.通过“=”复制列表
我们可以复制一个列表并创建一个新的变量。
a = [1, 2, 3]
b = a
创建于 pythontutor (图片由作者提供)
然而,新变量“b”只是指向“a”的值的指针。因此,a 的任何变化也会改变 b。让我们通过给 a 加一个值来确认。
a.append(4)
print(f'a is {a}')
print(f'b is {b}')a is [1, 2, 3, 4]
b is [1, 2, 3, 4]
4.使用索引复制列表
我们可以通过选择列表的所有索引来复制列表。
a = [1, 2, 3]
b = a[:]
创建于 pythontutor (图片由作者提供)
新列表 b 包含与 a 相同的值,但是在不同的存储位置。如果我们改变 a,b 不会受到影响。
a.append(4)
print(f'a is {a}')
print(f'b is {b}')a is [1, 2, 3, 4]
b is [1, 2, 3]
使用 copy 函数复制列表的工作原理与复制索引相同。
a = [1, 2, 3]
b = a.copy()
a.append(4)print(f'a is {a}')
print(f'b is {b}')
a is [1, 2, 3, 4]
b is [1, 2, 3]
5.使用 sort()和 sorted()对列表进行排序
sort 和 sorted 函数都可以用来对列表进行排序:
- sort():对列表进行排序,但不返回任何内容。
- sorted():返回列表的排序副本,但不对原始列表进行排序。
a = [2, 0, 4, 3]
b = a.sort()
print(f'a is {a}')
print(f'b is {b}')a is [0, 2, 3, 4]
b is None
创建于 pythontutor (图片由作者提供)
让我们用排序函数做同样的例子。
a = [2, 0, 4, 3]
b = sorted(a)
print(f'a is {a}')
print(f'b is {b}')a is [2, 0, 4, 3]
b is [0, 2, 3, 4]
创建于 pythontutor (图片由作者提供)
6.通过复制创建嵌套列表
当通过复制创建嵌套列表时,我们需要小心修改。原始列表中的任何更改都会更改复制的列表。
a = [1, 2]
b = [4, 5, 6]
c = [a, b]a.append(3)
b.pop()
列表 c 由列表 a 和 b 组成。我们通过添加和删除一个元素更新了列表 a 和 b。结果,列表 c 也被更新。
print(f'a is {a}')
print(f'b is {b}')
print(f'c is {c}')a is [1, 2, 3]
b is [4, 5]
c is [[1, 2, 3], [4, 5]]
创建于 pythontutor (图片由作者提供)
7.在迭代过程中修改列表
列表是可迭代的对象,所以在循环中使用它们是很常见的。迭代是基于索引的,所以如果我们在迭代时更新列表,我们需要小心。
考虑下面的代码。如果项目也在列表 b 中,则它从列表 a 中移除项目。
a = ['x', 'y', 'z', 't']
b = ['x', 'y', 'u', 'v']for item in a:
if item in b:
a.remove(item)
当代码被执行时,我们期望列表 a 变成[‘z ‘,’ t’]。让我们看看实际发生了什么。
print(f'a is {a}')
print(f'b is {b}')a is ['y', 'z', 't']
b is ['x', 'y', 'u', 'v']
虽然’ y ‘存在于列表 b 中,但它仍然在列表 a 中。原因是当第一个项目(’ x ')从列表 a 中移除时,索引也会更新。下一项 a[1]变成了‘z ’,但它应该是‘y’。因此,for 循环每隔一项进行比较。
下面是从列表 a 中删除第一项的步骤:
创建于 pythontutor (图片由作者提供)
这是下一个比较的项目。如你所见,它是“z ”,所以“y”永远不会被比较。
创建于 pythontutor (图片由作者提供)
8.列出理解
列表理解基本上是基于现有的可重复项创建列表。它以更快的方式实现了 for 循环所能实现的功能。列表理解的语法也比 for 循环的语法更简单、更吸引人。
列表理解的语法(图片由作者提供)
我们来做一个简单的例子。
a = [1, 2, 4, 5, 7, 9, 11]
b = [x for x in a if x % 2 == 0]print(b)
[2,4]
列表 b 仅包含列表 a 的偶数元素。使用 for 循环可以完成相同的操作,如下所示:
for item in a:
if item % 2 == 0:
b.append(item)
如你所见,列表理解更简单。
注意 : List comprehension 将整个输出列表加载到内存中,这比 for 循环更快。在处理小型或中型列表时,最好使用列表理解。然而,当我们处理大型列表(例如 10 亿个元素)时,应该避免理解列表。这可能会导致您的计算机崩溃,由于内存需求的极端数额。
9.列出修改元素的理解
我们还可以对列表理解中的每一项进行操作。考虑下面的列表 a:
a = ['john', 'emily', 'julia']
我们想要创建一个列表 b,其中包含以字母“j”开头的名字。我们还想大写的名字。
b = [item.capitalize() for item in a if item.startswith('j')]print(b)
['John', 'Julia']
10.嵌套列表上的列表理解
我们可以在列表理解中迭代嵌套列表。考虑下面的列表列表:
vals = [[1,2,3],[4,5,2],[3,2,6]]
我们希望从嵌套列表中取出每个元素,因此期望的输出是:
vals_exp = [1,2,3,4,5,2,3,2,6]
以下是完成这项任务的理解列表:
vals_exp = [y for x in vals for y in x]
vals_exp
[1,2,3,4,5,2,3,2,6]
如果你对语法不清楚,先用 for 循环试试。然后,您可以将 for 循环块移动到列表理解中。下图将帮助你理解我的意思:
对于循环和列表理解(图片由作者提供)
11.Len、reverse 和 count
这些都是非常简单却非常有用的操作。
- len:返回列表的长度(项目数)
- 反转:反转列表中项目的顺序
- count:统计特定项目在列表中出现的次数
(图片由作者提供)
奖金
在例 10 中有一个更简单的方法来完成这个任务。这涉及到熊猫的爆炸功能。
我们需要将嵌套列表(val)转换为 Pandas 系列,然后应用 explode 函数。为了将它转换回列表,我们可以使用 list 函数。
import pandas as pd
list(pd.Series(vals).explode())[1, 2, 3, 4, 5, 2, 3, 2, 6]
感谢您的阅读。如果您有任何反馈,请告诉我。