TowardsDataScience 博客中文翻译 2020(五百七十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Kaggle 基础知识:我的第一个数据科学挑战演练

原文:https://towardsdatascience.com/kaggle-basics-walkthrough-of-my-first-data-science-challenge-9bf898dc0182?source=collection_archive---------48-----------------------

初学者的 Kickstarter 包!

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

罗纳尔多·德·奥利维拉在 Unsplash 上的照片

新冠肺炎·疫情的爆发迫使全世界都不得不改变他们的生活方式,整天呆在室内。有了从通勤和郊游中节省下来的所有额外时间,我决定去追求一些我以前不可能去做的事情。其中一个是卡格尔

在我之前的所有项目中,我都做过视觉数据集,所以想尝试一些不同的东西。我想了解完整的流程,从数据清理开始,到各种转换,到特征选择,最后是机器学习建模。为了做到这一点,我拿起了一个带有大量数据集的初级挑战: 房价:高级回归技术 **。**我设定了低于 1k 的目标(~前 20%)。

正如预期的那样,我 90%的时间花在了数据清理和特征工程上,剩下的 10%花在了将机器学习模型应用于这些方面。我明白了**“了解你的数据”有多重要**。在没有任何数据工程的情况下,盲目地把它喂给 SOTA 模型只会让你走得更远。我不得不阅读许多博客和 Kaggle 笔记本,但我虔诚地遵循的是 [this](https://www.kaggle.com/agodwinp/stacking-house-prices-walkthrough-to-top-5) 。在这一篇中,我将用非常简单的词语和例子来概述我所遵循的过程,以便像我这样的初学者可以知道从哪里开始。

作为参考,这是我的笔记本,里面有完整的代码,这样你就可以跟着解释走了

数据清理和特征工程:https://github . com/Shikhargupta/ka ggle _ house _ pricing/blob/master/Feat _ engg . ipynb

特征重要性和建模:https://github . com/Shikhargupta/ka ggle _ house _ pricing/blob/master/ensemble . ipynb

埃姆斯住宅数据集

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

Unsplash 上由 Breno Assis 拍照

在进入这个过程之前,让我们先了解一下正在讨论的数据集。它有 80 列(特征),每一列描述房子的一个特定方面(例如,邻居、公用设施、屋顶类型等)。)在决定其价格(目标变量)时可能起作用,也可能不起作用。它由总共 2920 个观察值组成,其中 1460 个将用于拟合(训练数据),其余的用于确定你的模型执行得有多好(测试数据)。我们的目标是通过考虑特征(可能不是全部)来尽可能准确地预测房屋的销售价格。我建议你通过数据描述来习惯每个字段的含义。评估的标准是预测值的对数和观察销售价格的对数之间的 均方根误差(RMSE) 。分数越低,你的模型预测越好!

数据清理(异常值和 NAN)

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

Unsplash创意交流的照片

首先,我们将清理数据集,以避免在将它输入到模型中时出现任何错误或差异。

永远记住,最终目标是训练我们的机器学习模型,数据应该以同样的方式准备。请注意我们执行的任何操作最终可能会提高或降低回归器/分类器的效率。

例如,一个 NAN 字段的出现可能会使训练例程抛出一个错误。我们预测的另一个杀手可能是一个 离群值 。我们的住房数据是手工收集和存储的,很容易出现人为错误。一个明显的大(20 间卧室)或小(10 平方。制成 LotArea)的观察可能会使我们的模型向错误的方向摇摆,从而影响我们的分数。我们要么需要去掉这些数据点,要么适当地估算这些值。

就 Ames Housing 数据集而言,我们在离群值方面做得很好。作者已经在论文中指出了可疑的异常值,我已经在这个图中显示出来了

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

带有 GrLivArea > 4000 的数据点是异常高销售价格和 LivArea 的异常值,应被删除。虽然没有提到其他任何东西,但我发现“GarageYr”这一特征有一处不一致,它描述了车库在房子中建造的年份。这个值是 2027 ,这是一个遥远的未来。我没有摆脱观察,而是把它归因于模式。在此之前,我通过检查“GarageType”属性来确保房子有车库。在做出任何改变之前,了解你的数据是很重要的,所以要注意这些微小但重要的方面。

对于南,我绘制了一个图表,显示了至少具有其中一个特征的所有特征。然后我逐一分析它们,并决定如何处理丢失的值。他们中的大多数都被那个特征的模式所取代,但是也有一些特殊的情况,就像这样-

在没有地下室的情况下,我们可以将地下室平方英尺的缺失值估算为 0

特征工程

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

照片由 Isaac SmithUnsplash 上拍摄

这无疑是这个过程中最重要也是最耗时的部分。我的方法是一次拿一个。)并应用变换。这听起来可能很麻烦,但是请相信我,这将大有帮助。我的方法是用不同的图表将形象化(seaborn 给了你漂亮的图表!)并以此为基础做出我的决定(放弃或保留它们以及任何更改)。这将是运用你分析能力的好时机。这里没有火箭科学,数据集非常直观(卧室数量越多,价格越高)且符合逻辑。我将用几个大类的例子来解释我所做的。

多项式

如果你计划回归一个巨大的数据集,线性不应该是唯一的方法。某些特征可能与目标变量有某种关系,这种关系不能用单一程度来表示。因此,我精心挑选了 10 个最相关的变量(从相关矩阵中),创建了它们的平方、立方和平方根版本,并将其添加到数据集。

连续特征

这些是像 LotArea、GarageArea、1stFlrSF 等具有连续值的。对于这类特性,我的策略是用销售价格(我们的目标变量)绘制它们的分布图和散点图。这是“空地”的一个片段

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

左图:分布图;右图:销售价格散点图

散点图显示,地段面积对销售价格的影响可能不太显著,但它确实存在,我们会保留它。左图显示了这种特征分布的正偏斜程度。*永远记住,分布越接近正态,你的预测模型表现得越好。*所以,总是尝试转换你的数据,使其更正常-y. 通常用来这样做的技术是——对数转换和宁滨。我要在这里找根木头。

一些特征可能看起来是连续的,但是当转换成分类的时候会更适合。例如,与年份相关的特征(房屋建造的年份、房屋改造的年份等。).此外,其他不可或缺的功能,如卧室的数量,游泳池的数量,车库可以容纳的汽车。如果转换成绝对的,它们都会更有意义,我也是这样做的。

分类特征

所有非连续变量都是分类变量。我在这里遵循的做法是使用带状图和每个类别的平均销售价格来可视化特征。让我们以加热质量控制(加热质量)为例:

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

左:Stripplot 右:平均

第一个让我看到每个类别中房屋的数量,并指出任何差异(我们将在后面看到如何做到)。第二个帮助我决定是否将它作为一个有序的特征(用一个整数替换每个类别)或者创建虚拟变量。这个例子很明显是有序的(例如最高的评级和最高的平均价格等等),所以我们将用有序的整数来代替它们。 箱线图 也是可视化数据的有效方法。

掉落(无用)特性

我们希望保持我们的特征空间尽可能密集,以从我们的模型中获得最大的效率。因此,我们试图去掉那些我们认为对目标变量贡献不够大的特征。我遇到了一些,这里有一些例子。

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

街道:通往物业的道路类型

带状图显示,大多数房屋的街道类型为“ Pave ”,而“ Grvl 的数量可以忽略不计。这一特征在所有房价中几乎保持不变,因此对目标贡献不大。我们可以放弃这个功能。

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

公摊面积:公摊面积平方英尺

类似地,对于 PoolArea ,大多数观察值为 0(几乎所有的房子都没有游泳池),因此在预测中对我们没有太大帮助。我们可以放弃。

特征重要性

即使在对所有特征进行了广泛的分析之后,一些多余的特征也可能会被肉眼所忽略。我们将使用 XGBoost 内置的 feature importance 函数来进一步识别无关紧要的列,并在拟合我们的模型之前删除它们。让我们首先获得转换后所有 324 个特性的索引。

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

与销售价格相关的功能的重要性。相当一部分是零。

我们可以看到,我们的许多功能对确定销售价格没有贡献,因此我们将删除它们。删除得分为 0 的特性后,我们的数据集从 324 列减少到 218 列!

机器学习建模

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

奥马尔·弗洛雷斯在 Unsplash 上拍摄的照片

最后,我们开始这一切的部分。坦率地说,我们 90%的工作已经完成。如果你有一个结构良好的密集数据集,建模将是一件轻而易举的事。我准备了一个最著名的回归模型的列表,我想用这些模型来拟合我的数据(在本节的后面列出)。然后,我将测试数据分成测试集和验证集。我在测试集上训练模型,并对验证进行评估。这有助于我直观地看到哪个型号的性能更好。这里是 XGBoost 回归器的一个例子。

如果你注意到,我对销售价格进行了对数变换,因为它给出了更好的分布。在得到结果的同时,我通过取值的指数将价格转换回原来的比例。

参数调谐

每个回归模型都有自己的一组参数,这些参数对它所依据的数据集高度敏感。如果你想要高度优化的结果(你做到了!),那么必须有一组性能最佳的参数。传统的方法是使用 GridSearchCV 进行网格搜索,但这需要相当大的计算能力。如果你无法访问 GPU,最好避免使用它(我的 MacBookPro 花了 7 个多小时进行 XGBoost,仍然可以完成搜索)。另一种方法是做一个“参数扫描,其中我们通过改变一个参数来评估我们的训练,而保持其他参数不变。这要求人们对可能适合我们正在扫描的参数的值的范围有一个公平的想法。下面是一个为 RidgeRegressor 求α的例子。

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

alpha~75 给出了最低的 RMSE,并且是该数据集的最佳可能值

合奏

所以到目前为止,我们有来自个体回归模型的分数。但是,如果我们可以权衡所有模型的预测,并得到一个综合结果,这不是更好吗?每个型号都有自己的特色。有些人更擅长从数据中提取某些信息,有些人更容易受到其他信息的影响。如果我们“咨询”各种模型,然后得出最终预测,那就更好了。这被称为组装。在这种情况下,我们通过训练数据训练我们的所有模型,并在预测时合并结果。这种组合可以是任何值—所有值的平均值、加权平均值等。我使用了加权平均值选项,并根据各个模型在验证集上的表现来决定权重。这是代码。

结论

虽然在表面上试验不同的模型可能会给你好的结果,但重要的是要理解背后的数学,以便将来你可以通过推理选择回归变量。此外,我的方法肯定不是解决房价问题的最佳方法,你可以设计你自己的方法,所以,继续努力吧!

Kaggle 发布了 CORD-19——新冠肺炎上的人工智能挑战

原文:https://towardsdatascience.com/kaggle-released-cord-19-an-ai-challenge-on-the-covid-19-50d657378ff4?source=collection_archive---------26-----------------------

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

图片来自 PixabayVektor Kunst

找出人工智能在这场国际危机中可以帮助解决的关键任务。

由新型冠状病毒(即新型冠状病毒)引起的冠状病毒疾病 2019,通常缩写为新冠肺炎,在过去 3 个月里已经成为疫情,蔓延到国际上超过 100 个地方,包括许多欧洲国家和美国。截至今天(2020 年 3 月 17 日),美国有超过 4000 例病例和 75 例死亡,预计这些数字在接下来的一周左右会上升,使这种呼吸系统疾病的预防和治疗成为国家层面的首要任务。

为了帮助解决这个问题,来自领先人工智能研究所的研究人员和领导者,包括艾伦人工智能研究所微软,以及联邦政府机构(即国家医学图书馆)进行了广泛的合作,结果发布了关于新冠肺炎、新型冠状病毒和其他种类冠状病毒的学术文献的新冠肺炎开放研究数据集(CORD-19)。

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

CORD-19 数据组件的主要合作者

Kaggle & CORD-19

这个数据集可以在 Kaggle 的网站上找到,任何人工智能研究人员都可以通过下面的链接公开访问。人工智能领域的研究人员不会对 Kaggle 感到陌生——这是一个由数据科学家和机器学习研究人员组成的在线社区。

[## 新冠肺炎开放研究数据集挑战(CORD-19)

AI2 大学、CZI 大学、MSR 大学、乔治城大学、美国国家卫生研究院和白宫的人工智能挑战

www.kaggle.com](https://www.kaggle.com/allen-institute-for-ai/CORD-19-research-challenge)

作为谷歌公司的一部分,Kaggle 因组织各种机器学习和数据科学挑战而闻名,包括当前的一项——新冠肺炎开放研究数据集挑战,或简称为 CORD-19 挑战。

CORD-19 数据集包含超过 29,000 篇文章,其中 13,000 篇有全文。所有这些文章都与冠状病毒的研究有关,如病例报告、传播途径、环境因素和治疗策略探索。然而,并非所有这些文章都不是机器可读的,因此很难利用人工智能工具来提取有用的信息,以帮助我们抗击这种传染病。

幸运的是,艾伦人工智能研究所的研究人员努力工作,帮助人工智能研究人员将这一庞大文献的内容转化为机器可读的形式*,这使得使用机器学习方法进行数据和文本挖掘成为可能。*

关键科学问题

美国 NASEM 和世卫组织的新兴传染病和 21 世纪健康威胁常设委员会确定了应对这场国际危机至关重要的 10 个科学问题。

这些问题包括研究病毒的传播和潜伏,感染新冠肺炎的风险因素,病毒的起源,以及治疗这种疾病的正确医疗方法。

挑战任务的完整列表可以在 Kaggle 的网站上找到。

每项任务的获胜者将获得 1000 美元的奖金。获胜的提交材料是根据评估标准得分最高的材料。

结束语

这个 CORD-19 已经吸引了 122,000 次浏览和超过 3,000 次下载。70 多名研究人员为这一挑战做出了贡献。尤其是最新的日下载量已经超过 2000。

我希望更多的人工智能研究人员能够帮助应对这一挑战。

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

CORD-19 挑战的当前活动

SQL 中的巨大竞争

原文:https://towardsdatascience.com/kaggle-titanic-competition-in-sql-78ae3cd551ce?source=collection_archive---------42-----------------------

探索性数据分析和特征工程

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

介绍

没有什么比通过简单的行动来学习新的东西或使一项技能更上一层楼更强大的了。在本文中,我将使用 SQL (Postgres)进行探索性分析,并为我的机器学习模型创建一个转换后的特征训练集。

虽然 Python 或 R 是当前数据科学和机器学习的事实语言,但拥有 SQL 的坚实基础有时会帮助您更快地迭代,并允许您快速浏览您的数据。归根结底,我们处理的大部分数据都存在于关系数据库中。能够流畅地编写 SQL 查询将允许您轻松地处理数据,并快速开始您的分析。

目标

虽然 Python 将是我的首选方法,但我想看看我是否能在 SQL 中完成所有的探索性分析和特性工程。我的目标是展示 SQL 对于一个人的工作流是多么强大和补充。尽管 SQL 的一个明显限制是数据的本地可视化能力,但是您仍然可以通过快速编写查询和输出结果来获得巨大的收益。我们开始吧!

我的设置

  • macOS Mojave 版本 10.14.6
  • PostgreSQL 12.2
  • pgAdmin 4.21 (SQL web 查询工具)
  • psql (终端访问数据库和表格)

在我的后续文章中,我用 Python 完成了我的监督分类模型,并分享了我在 Kaggle 的公共领导力板上获得的最高分。看看这里!

[## Kaggle 泰坦尼克号竞赛:Python 中的模型构建和调优

最佳拟合模型、特征和排列重要性以及超参数调整

towardsdatascience.com](/kaggle-titanic-competition-model-building-tuning-in-python-12f4f74436b5)

探测

我对泰坦尼克号沉没的研究表明,在运送乘客上救生艇时,妇女和儿童比其他人更优先。这个概念将在我如何分组和分析 Kaggle 数据集的过程中发挥重要作用。

此外,还讨论了是将训练和测试数据集分开,还是将它们结合起来用于特征工程和选择。在大多数情况下,前者有助于避免数据泄露。

通常的做法是将测试数据集放在一边,忘记它,只使用训练数据集来估算和设计特征。对于这个练习,我决定将训练和测试结合起来,这样我就有更多的数据来预测存活率。这是一个固定的宇宙,我们不期望新的数据流入预测管道。

首先,我从 Kaggle 下载了 train.csv 和 test.csv 文件,并将这些文件导入到我在 Postgres 数据库中创建的两个表中。接下来,我将这两个表结合起来,创建了我的第一个工作表(titanic_train_test_raw)。

为了将记录插入到我的表中,我在终端上通过键入“ *psql postgres”打开 psql。*这是 PostgreSQL 命令行工具。我运行了以下两个 psql 复制命令,将 CSV 文件插入到我的表中。

\copy titanic_train_raw from ‘file/path/train.csv’ delimiter ‘,’ csv HEADER;\copy titanic_test_raw from ‘file/path/test.csv’ delimiter ‘,’ csv HEADER;

为了更好地理解数据,我计算了训练集中每个可用特性的 survival_rate。我没有在这里分享整个输出,因为我将在整篇文章中一点一点地分享它们。然而,这让我对哪些特性值得深入挖掘,以及每个特性的相对重要性有了一个清晰的认识。

1。缺失值

让我们更仔细地看看丢失的值,看看哪些潜在的特性需要估计,或者由于稀疏性而被丢弃。缺失值的计算是通过组合训练和测试数据来完成的。因为测试数据没有幸存目标特征,所以组合的幸存列有 31.93%的值缺失。还有年龄、舱位、票价、上船分别少了 20.09%、77.46%、0.08%、0.15%。

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

2。总体存活率

从训练数据集中,我计算了存活百分比和未存活百分比。在训练数据中的 891 名乘客中,只有 38.38%的人幸存。此外,这个分析让我看到目标类并不是太不平衡——大约是 60%/40%的比例。

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

3。按性别和年龄分列的存活率

与男性乘客相比,女性乘客生还的可能性最高。仅从性别来看,培训数据告诉我们,女性的存活率约为 74.2%,而男性为 18.89%。

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

使用纯 SQL,我创建了 10 个 bin(age _ cohort)来对不同的年龄进行分组。我不打算对年龄组进行任何精确的划分,因此容器的数量是任意的,但是创建足够多的容器来查看相关的模式。最关键的信息之一从这个观点中浮现出来。虽然在所有年龄组中女性的存活率仍然很高,但 9 岁或更小的男性的存活率接近 60%(数据输出中的第 9 行)。单就性别而言,男性的存活率低于 20%,但通过对年龄组的数据进行切片,我们看到男性的一个亚组具有相对较高的存活率——儿童。

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

4。按票价和每位乘客的平均票价生存

为了快速了解与生存相关的票价,我使用了一个窗口函数,将乘客平均分成 6 个箱,并创建了统计数据以进行更仔细的检查。这是一种快速且不实用的宁滨方法,因为相同的票价金额可能会落入不同的箱中,如 fare_min 和 fare_max 所示。

乍一看,随着票价变得更贵,存活率似乎会上升。与此同时,fare_mean 和 fare_stddev 从 bin 5 跳到 bin 6。最高的 fare_max 价格为 512.3292 美元,最低的 fare_min 价格为 0 美元。票价栏有些杂音。持续持有的是,女性存活率远高于男性。基于 fare_grouping 属性,女性存活率比男性高 2 倍—9 倍(survival_ratio)。

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

我很快发现票价代表的是机票的总成本,而不是每位乘客的票价。比如机票 PC 17755,有四个乘客。卡德扎是一个富裕的家庭,和他们的两个雇员沃德小姐和勒苏雷先生一起乘坐头等舱旅行。

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

为了了解每张机票的成本,我用每张机票上的乘客总数除以票价金额,并按 Pclass 对平均值进行分组。在检查票证功能时,我看到了家庭、混合组和附加到单个票证的个人。因此,使用每张机票上的乘客人数产生了较小的标准差,并给了我信心,这将提供相对更准确的每位乘客的平均票价,而不是使用其他 Kaggle 人常用的[SibSp(兄弟姐妹和配偶)+ ParCh(父母和子女)+ 1 (PassengerId)]。

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

平均而言,头等舱每位乘客的票价约为 32 美元,二等舱约为 12 美元,三等舱约为 8 美元。这种平均去除了原始票价特征中的相当多的噪声。并且 fare_mean 看起来与 Pclass 高度相关。因此,Pclass 和 fare_per_passenger 这两个特性可能是多余的。稍后,我们可能希望在模型构建期间删除其中的一个。

5。基于来自原始名称特征的标题的生存

有 17 个独一无二的称号,有的存活率很高;然而,大多数都不常见。训练数据中只有两个乘客的标题是少校,一个乘客的标题是 Sir。为了使每个分组对建模具有相关性和影响力,我将不常用的头衔分成四类——先生、夫人、小姐和主人——从而创建了一个 title_grouping 特性。比如 Mlle,是 Mademoiselle 的缩写,卷成 Miss。

题主之所以有意思,是因为它的存活率比较高,而且在训练数据中也有不少。在此期间,男孩被授予这一头衔,直到他们成年。现在我们有了一种方法,当所有的女孩和女人都被归入“夫人”或“小姐”时,我们可以使用“头衔分组”来识别男孩。

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

我按每个标题 _ 分组计算了存活率,数字很能说明问题。通过把男孩从男性群体中分离出来,男性的存活率下降了。相比之下,男生的存活率将近 60%。在最终的训练数据集准备工作中,我将把这个特性编码成数值。

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

6。基于是女人还是孩子的生存

我偶然看到克里斯·德奥特的文章,是关于他基于用姓氏和头衔对乘客进行分组而创建的一个名为“女人-孩子-团体”的功能。本质上,它关注的是群体生存。考虑到这一点,我创建了一个二元特征来标记每位乘客是男是女。is_woman_child = 1 表示所有妇女和儿童,而 is_woman_child = 0 表示所有成年男子。对于 title_grouping 来说,这个标志可能是多余的,并且可能导致模型过拟合,但是让我们看看这是如何实现的。

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

7。基于舱室水平面(又名甲板)的生存

我为此做的一些读数显示,大多数三等舱乘客位于 F 和 g 舱层。因此,更仔细地查看客舱层是有意义的,尽管 77%的值丢失了。我假设较低的客舱高度会降低乘客的生还几率。

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

RMS泰坦尼克号船中部剖面图

在做了一些分析后,我观察到当乘客属于较低阶层和较低客舱等级时,存活率会下降。我使用 Pclass 和 apollowed 创建了一个逻辑来近似每个乘客的客舱级别,我将在特性工程部分对此进行更深入的探讨。

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

单独着手不会告诉你一个生存的故事,如下所示,但我相信它可以用来创建新的功能,将具有相对更高的预测能力。泰坦尼克号最初停靠在英国的南汉普顿,然后前往法国的瑟堡。最后,在驶往纽约之前,在爱尔兰的皇后镇停留。

顺便提一下,有两名乘客丢失了上船值,但我查找了这些乘客,他们都在英格兰的南汉普顿登船。

我假设登船位置和船舱所在的甲板(船舱级别)之间存在关联。换句话说,每个登机地点都有一组特定的客舱,并且有某种组织形式,根据登机地点,客舱将首先被填满。因此,举例来说,如果你有一张以 F 开头的三等舱船票,F 代表船舱所在的甲板,你最有可能从英国的南汉普顿登船。

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

特征转换和工程

现在,我已经了解了原始的训练特征,并对乘客存活率有了更好的了解,是时候巩固我们的发现,并开始整合优化的训练数据集以进行模型拟合了。

1。is _ one _ family/is _ mix _ group/is _ alone

**假设:**我假设同一个票号定义了一起出行的乘客。此外,我还假设,如果一个人是一张机票上的唯一乘客,那么这个乘客就是一个单独的旅行者,同时可能有其他家庭成员或亲戚乘坐不同的机票旅行。因此,我根据从原始姓名特征中提取的票号和姓氏对乘客进行分组。

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

这种假设是有代价的,但是我假设这包含了大多数的团队场景。以这种方式划分组的主要目的是概括船上的人口。

  • 如果给定的机票有多个乘客的单个姓氏,则认为是一个家庭,其中 1 为真,0 为假(is_one_family)。这主要是为了标记一起旅行的家庭。因此,如果乘客是单个机票系列的一部分,则该标志被标记为 1。
  • 如果给定的机票有多个姓氏和多个乘客,这将被标记为混合组(is_mix_group)。例如,票号 1601 有 7 个不同的姓氏。总共有 67 张票附有两个或两个以上的姓氏。我这里只展示前 12 名的门票。

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

  • 如果给定的机票只有一个姓和一个乘客,这是一个单独旅行的乘客(is_alone)。仔细看看男性人口,单独旅行的成年男性乘客的存活率最低(15.57%),相比之下,有家庭的成年男性(17.46%)和有家庭的男孩(57.5%)。

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

一眼看去,没有家庭或属于混合群体的成年男性乘客生还几率最低。我们确实在这个输出中看到了一些有趣的模式。和家人一起旅行的男性乘客存活率最高。最有可能的是,这些男性乘客是男孩。下面我来验证一下。

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

当我把男孩从男性人口中分离出来时,情况就清楚多了。男孩的存活率比成年男子高。

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

2。家庭规模

为了确定每个乘客的家庭规模,添加 SibSp、ParCh 和当前乘客(+1)是合乎逻辑的。然而,根据机票号码和姓氏来确定最大家庭规模比在乘客层面定义更有意义。

我坚持家庭一起旅行的假设,在这种情况下,在同一张机票上。因此,SibSp、ParCh 和 current passenger 的总和(表示家庭规模)与一个票号和姓氏相匹配。我创建了一个映射 SQL 子查询,其中如果您有相同的机票号码和姓氏,那么家庭规模(SibSp + ParCh + 1)将被映射到乘客。

一旦把逻辑放在一起,我就按照家庭规模和 Pclass 来看平均存活率。相对较大的家庭存活率较低。可以大致推断,如果你是一个大家庭的一员,你就死了。还有,你一个人就死了。由于四人或四人以上的机票屈指可数,很难一概而论大团体的生存。然而,根据现有的数据,值得看看家庭规模在预测存活率方面是否有一定的相对重要性。

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

3。建立第一个合并特征表:titanic_train_test_raw_v2

我现在正在整理我的第一个基于以上所有发现的合并表。在这一步中,我将加入新的特性并转换现有的特性,以便更好地使用模型。以下是所有新增内容和增强功能的列表。

  • 将性别特征编码为女性= 1,男性= 0
  • 从姓名特征中提取姓氏
  • 添加标题分组功能,我在前面分享过
  • 添加 is_woman_child 要素
  • 从客舱特征中提取客舱级别(甲板)
  • 将装载特征编码为 S = 0,C = 1,Q = 2
  • 添加基于票号和姓氏的 family_size 特征
  • 添加 is_one_family、is_mix_group 和 is_alone 特征
  • 通过将票价除以在每张票上找到的乘客 Id 的数量,添加 fare_per_passenger 功能

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

4。建立第二个合并特征表:titanic_train_test_raw_v3

使用前面创建的一些特性,我创建了第二个统一表(v3 ),以添加更多特性并进行额外的更改。在使用 SQL 时,最好以这种方式构建多个表,因为它有助于保持事物的有序性,并通过使用更小的块使 SQL 更具可读性。

  • **年龄缺失值:**填写缺失的年龄值(第 11 行&第 44–52 行)。我按照 Pclass、性别和 title_grouping 对数据进行分组,计算每个分组的平均年龄。我选择了平均值,而不是中间值,因为两组数字是相似的。我还计算了平均值的标准差来检查可变性。
  • 另外,我创建了一个名为 Age_bucket 的特性(第 12 行)。我决定将连续的年龄变量放入 7 个容器中。由于年龄要素包含估计平均值,因此最好将其转换为分类要素,以最大限度地减少连续要素中的噪声。
  • **Fare_bucket &票价缺失值:**在我的探索性分析中,我计算了每个乘客每个舱位等级的平均票价,很明显,价格与舱位等级密切相关。我用与每个乘客的 Pclass 相关联的 fare_per_passenger 来填充缺失的票价值。同时,我创建了 5 个箱来创建分类特征。
  • Title_grouping: 该特性中的四个文本字符串标签被转换为数值。(主机= 0,夫人= 1,小姐= 2,先生= 3)
  • **Cabin_level&Cabin level missing values:**我填充缺失的 cabin_level 值的方法是通过 Pclass、Embarked 和 Cabin _ level(其中 Cabin 不为空)来计算所有乘客。接下来,我将附属于 Pclass、Embarked 和 cabin_level 的乘客数量按降序排列,对于 Pclass + Embarked 的每个组合,我将抓取附属于它的乘客数量最高的 cabin_level。

这是构建 titanic_train_test_raw_v3 表的子查询。

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

如果 Pclass = 1,apolled = 0,那么 cabin_level = C.

如果 Pclass = 1 且 Embarked = 1,则 cabin _ level = c。

如果 Pclass = 1,apolled = 2,那么 cabin _ level = c。

如果 Pclass = 2 且 Embarked = 0,则 cabin _ level = f。

如果 Pclass = 3 且 Embarked = 0,则 cabin _ level = g。

以此类推!

5。构建“妇女-儿童-群体”修改逻辑

我继续尝试用 SQL 做一些修改来重新创建克里斯·德奥特的特征。我将回顾我所做的,在我的后续文章中,我将测试该特性的影响和重要性。

  • 首先,每个乘客的头衔被标为男人、女人或男孩。与此同时,所有男性头衔都被贴上了“非群体”的标签,因为女性和儿童被赋予了生存的优先权。

  • 接下来,我计算了每个乘客的姓氏频率。此频率查看整个数据集,而不是票证级别。并且任何姓氏频率为 1 或更少的乘客(如果有的话)被标记为“noGroup”因此,家庭中的妇女和儿童优先于独自旅行的妇女。

  • 在这个阶段,基于更新的姓氏特征,使用训练数据的幸存目标特征来计算幸存概率。在这一点上,大多数姓氏已经改变为“noGroup”,因此,所有乘客的生存将使用这个更新的姓氏特征来概括。

  • 最后,使用标题和姓氏 _ 生存,我创建了一个新的二进制标志,标题 _ 姓氏 _ 生存。当最终的训练和测试数据集被创建时,这个逻辑被合并。我创建了两个表来捕捉每一个——titanic _ train _ ml _ features _ v 0 和 titanic_test_ml_features_v0。

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

  • ML 训练数据集:titanic_train_ml_features_v0

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

  • ML 测试数据集:titanic_test_ml_features_v0(与训练数据集相同,只是缺少幸存特征。)

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

摘要

这篇文章提供了相当多的信息。我使用纯 SQL 进行了探索性分析和特性工程。我利用 GROUP BY、窗口函数、聚合函数、子查询、WITH 子句、HAVING 子句和其他 SQL 技术来分割数据。

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

约书亚·阿拉贡在 Unsplash 上拍摄的照片

下一步是导出最终的训练和测试数据集,以便使用 Python 进行分析。在我的后续文章中,我将使用 Python 测试不同的 ML 模型,了解特性的重要性,并使用 RandomizedSearchCV 和 GridSearchCV 调优所选的模型。最后,我会将我的预测提交给 Kaggle,看看我在其他条目中的排名如何!

以下是我在后续文章中所涉及内容的概述:

标题:《Kaggle 泰坦尼克号大赛:模型搭建&Python 中的调优】

  • 导入库
  • 准备训练和测试数据帧
  • 相关系数矩阵
  • 创建辅助函数:输出模型统计信息
  • 多重拟合模型和最佳拟合模型
  • 创建助手功能:输出 RF 特征重要性排序
  • 具有随机森林特征重要性、排列重要性和层次聚类的特征选择
  • 随机森林分类器
  • GridSearchCV:随机森林分类器
  • 结论:最新结果和最终想法

如果您有任何问题、意见或反馈,请告诉我。谢谢!

Kaggle 泰坦尼克号竞赛:Python 中的模型构建和调优

原文:https://towardsdatascience.com/kaggle-titanic-competition-model-building-tuning-in-python-12f4f74436b5?source=collection_archive---------24-----------------------

最佳拟合模型、特征和排列重要性以及超参数调整

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

保罗·比昂迪在 Unsplash 上的照片

背景

我用 SQL 进行了初步的探索性分析和特性工程。在我的上一篇文章中,我展示了 SQL 在研究关系数据库中的数据时是多么强大。对于更多的上下文,可能值得在阅读本文之前检查一下,尽管这不是必需的。你可以在这里找到文章!

[## SQL 中的巨大竞争

探索性数据分析和特征工程

towardsdatascience.com](/kaggle-titanic-competition-in-sql-78ae3cd551ce)

我将使用之前在*“Kaggle Titanic Competition in SQL”*文章中准备的训练/测试数据集来预测乘客存活率。

概观

  • 导入库
  • 准备训练和测试数据帧
  • 相关系数矩阵
  • 创建辅助函数:输出模型统计信息
  • 多重拟合模型和最佳拟合模型
  • 创建助手功能:输出 RF 特征重要性排序
  • 具有随机森林特征重要性、排列重要性和层次聚类的特征选择
  • 随机森林分类器
  • GridSearchCV:随机森林分类器
  • 结论:最新结果和最终想法

导入库

import numpy as np 
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inlinefrom sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC, LinearSVC
from sklearn.naive_bayes import GaussianNBfrom sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import RandomizedSearchCV, GridSearchCV
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import confusion_matrix
from sklearn.metrics import precision_score, recall_score, roc_auc_score

准备培训和测试数据帧

使用 Pandas,我将 CSV 文件作为数据帧导入。如果你读过我的“Kaggle Titanic Competition in SQL”一文,train_df.info()的结果集应该看起来很熟悉。对于模型训练,我从 15 个特征开始,如下所示,不包括 Survived 和 PassengerId。

train_df = pd.read_csv(‘file/path/data-train.csv’)
test_df = pd.read_csv(‘file/path/data-test.csv’)

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

相关系数矩阵

作为第一步,我使用 Pandas 和 Seaborn 中内置的 corr 函数创建了一个成对相关矩阵来可视化数据。它以默认方法计算皮尔逊 相关系数(线性关系)。我还使用了 SpearmanKendall 方法,这两种方法在 pandas.DataFrame.corr 中都有

所有的结果看起来都差不多。相对而言, 斯皮尔曼的 等级-顺序相关性 方法,其测量单调关系,在这里可能是最好的,而无需深入研究不同类型特征的相关性和关联性的概念。一个警告是, Spearman 将把名词性特征视为序数特征。

只是作为一个旁注,在这一点上,我所有的特征都已经转化为由二进制(二分法)、序数(分类和有序)、名词性(分类和不有序)和连续特征组成的数值。我想快速了解哪些特征是相互关联的,以及明显特征之外的重要程度。

如果我要更深入地探究这个练习的细节,那么我们还需要讨论分类特征之间的关联以及二元和连续特征之间的相关性。在测量两个标称特征之间的关联时,我们将不得不深入到 克莱姆氏 V皮尔森的 卡方检验。然而,在我看来,这应该是获得初始基线读数的足够好的方法。如果我错过了什么,请随时告诉我。

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

你可以在这里找到

我生成了相关系数热图,并注意了 0.8 到 1.0 相关范围内的绝对值。这些相关性阈值是任意的,稍后我将查看各种阈值来确定什么最有效。

train_corr = train_df.drop(columns=["survived", "passengerid"]).corr(method='pearson')
plt.figure(figsize=(18, 12))
sns.set(font_scale=1.4)
sns.heatmap(train_corr, 
            annot=True, 
            linecolor='white', 
            linewidth=0.5, 
            cmap='magma');

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

皮尔逊

在使用 0.8 作为我的皮尔逊相关阈值对这些数字进行深入研究后,我发现了这些对(如下所示;df_corr 的输出)是高度相关的。稍后,我将利用 Spearman 和其他方法为我的最终模型选择重要的特性。

# Pearson’s correlation analysis using an arbitrary correlation threshold (absolute values)corr_threshold = 0.8
train_corr_abs = train_corr.abs()feature_1 = []
feature_2 = []
corr_coeff = []
for col in train_corr_abs:
    for idx, val in enumerate(train_corr_abs[col]):
        if ((val >= corr_threshold) and (val < 1)):
            feature_1.append(col)
            feature_2.append(train_corr_abs[col].index[idx])
            corr_coeff.append(val)df_corr = pd.DataFrame({‘feature_1’: feature_1, 
                        ‘feature_2’: feature_2, 
                        ‘corr_coeff’: corr_coeff})
df_corr

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

来自 df_corr 的结果;输出包含重复项。

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

重复项被删除,剩下六个高度相关的配对。

识别出高度相关的对后,这种分析将有助于以后处理任何回归或线性模型。高度多重共线性会导致要素或系数估计值对模型中的微小变化变得敏感。这也会影响非线性模型

底线是多重共线性特征可能会创建一个无效的模型,并且对特征重要性的理解可能会有偏差。我不打算把精力放在具有轻度多重共线性的配对上。现在,我将暂时搁置这个问题,到时候再直接解决这个问题。

train_corr = train_df.train_df.drop(columns=["survived",       "passengerid"]).corr(method='spearman')
plt.figure(figsize=(18, 12))
sns.set(font_scale=1.4)
sns.heatmap(train_corr, 
            annot=True, 
            linecolor=’white’, 
            linewidths=0.5, 
            cmap=’magma’)

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

斯皮尔曼

train_corr = train_df.drop(columns=["survived", "passengerid"]).corr(method='kendall')
plt.figure(figsize=(18, 12))
sns.set(font_scale=1.4)
sns.heatmap(train_corr, 
            annot=True, 
            linecolor=’white’, 
            linewidths=0.5, 
            cmap=’magma’)

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

肯德尔

创建辅助函数:输出模型统计信息

首先,我通过拟合 X_train 和 y_train 来训练九个不同的模型。为了加快我的工作流程,我创建了一个输出模型性能和诊断指标的函数,以快速查看数字并确定哪个模型可能工作得最好。这些度量在函数的 docstring 中列出。

此外,我定义了一个管道对象(下面的第 27 行),其中包含一个缩放器和一个估算器的实例。在使用随机森林的少数情况下,我不会缩放 X_train 和 X_test,因为没有必要这样做。

多重拟合模型和最佳拟合模型

助手函数有三个参数。首先,它需要一个字典,将模型的名称(字符串)作为键,将模型类实例化作为值。其次,它需要特征训练数据集(X_train ),最后需要目标类数据(y_train)。让我们检查结果!

随即,随机森林和决策树以 98.54%的准确率脱颖而出。我知道决策树倾向于过度拟合,所以我并不太惊讶。另一方面,随机森林是决策树的集合,旨在通过采用要素和行的随机子集来创建决策树森林并对预测结果进行投票,从而最大限度地减少过度拟合。这个随机过程产生了一个更好的模型,具有更高的偏差和更低的方差。

仔细观察,使用 Kfold 为 10 的交叉验证的准确性分数对于随机森林和决策树产生了 84.07%和 81.3%的更真实的分数。其他脱颖而出的模型还有 KNN、SVM、逻辑回归和线性 SVC,都获得了可观的分数。高标准偏差表明模型可能无法用新数据很好地概括,所以我也注意到了这一点。

让我们仔细看看精度和召回。在这种情况下,最大限度地提高精确度和召回率是有意义的,F1 的高分就表明了这一点。虽然有一个精度-召回权衡,相对较高的精度[TP/(TP+FP)]给了我正面预测的准确性。相比之下,相对较高的召回率[TP/(TP+FN)]给出了模型正确检测到的实际阳性率的%。回忆也称为真阳性率(TPR)和敏感度。此外,我想要 ROC 曲线下的高 AUC。结果,我把列表缩小到四个模型——随机森林、KNN、逻辑回归和线性 SVC。

最终,我选择了 random forest,尽管其他模型的分数稍好一些。在我看来,这些细微的差别可以忽略不计。目标是在特征选择过程中利用随机森林的基于杂质的特征重要性和排列重要性。

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

创建助手功能:输出 RF 特征重要性排序

为了使用随机森林快速输出特性重要性排序,我创建了一个助手函数来完成这项工作。它输出一个 Pandas 数据框,其中包含按等级顺序排列的要素名称及其对应的要素重要性分数。

具有 RF 特征重要性、排列重要性和层次聚类的特征选择

迭代 1

回到相关系数矩阵,有五对标记为高度相关或彼此关联。使用 X_train 和 X_test 定义的所有特性,如下所示,我检查了 RF 的特性和排列重要性的结果。我还使用了层次聚类和 Spearman 的相关矩阵来辅助特征选择。

X_train = train_df.drop([“survived”, “passengerid”], axis=1)
y_train = train_df[“survived”]
X_test = test_df.drop([“passengerid”], axis=1)rf_base = RandomForestClassifier(n_estimators=100, random_state=0)
rf_base.fit(X_train, y_train)n = len(X_train.columns)
importance_scores = rf_base.feature_importances_
rf_feature_ranking(n, importance_scores)

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

随机森林特征重要性

RF 的特性重要性是衡量什么特性是重要的一个坚实的开端,但并不总是给出一个明确的重要性视图,并且可能会产生误导。RF 特征重要性的潜在机制是有偏差的。它往往高估了某些特征的重要性,例如连续或高基数分类特征。简而言之,对决策树森林中的每个特征的杂质减少进行平均,然后基于该平均值对特征进行排序。这里有一个好的这个和这个这个

共线特征也将是一个问题。因此,仅利用基于杂质的特征重要性的 RF 平均下降不会显示全貌,必须是更好地理解特征重要性的许多工具之一。

在这一点上,我关心的是共线特征。因此,我利用排列重要性和层次聚类来确定哪些特性是相关的。从概念上讲,在排列重要性中,它使用验证集计算要素的基线精度。接下来,它置换单个列/特征的所有值,并使用测试数据集测量相对于基线精度的变化。这将对每个特征重复。

在我的研究中,我在 Scikit-Learn 的网站上看到了一篇关于这个特定主题的内容丰富的文章。我将利用这里找到的代码,完成我的特性选择过程。此外,我将依靠领域知识引导试错法来看看什么样的特性组合会有最好的结果。

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

排列重要性相对来说比特征重要性更可靠,尽管前者也会受到共线特征的影响,并会增大受影响特征的重要性。来自两个初始视图的一个令人满意的建议是,is_alone、is_mix_group 和 is_one_family 不会给模型增加太多价值。

对于层次聚类,树状图上的 y 轴代表接近度或相异度。随着它越来越接近 0,聚类特征之间的距离越来越近,表示相关性/关联性。在这次迭代中,我检查了所有低于 1.5 的聚类——这是一个任意的阈值。这里使用的代码块也可以在 S cikit-Learn 的网站上获得。

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

左边是树状图,右边是斯皮尔曼相关矩阵

使用树状图,我仔细观察了具有两个特性(例如,pclass 和 cabin_level)的较小集群,并试探性地确定了哪些特性可能需要删除。我决定放弃 age,因为它与 age_bucket 高度共线,是一个连续的特性。此外,我决定去掉 sex 和 fare,因为它们的相关特征对模型的贡献是一样的。因此,在下一次迭代中总共删除了 7 个特征——年龄、性别、票价、单身、组合和家庭

计算特征和排列重要性

生成层次聚类和 Spearman 相关矩阵

迭代 2

让我们来看看更新后的结果。在这个迭代中,我使用了 9 个特性,它们代表了新的 X_train 和 X_test。

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

X_train.info()

我使用了 output_model_stats 函数来比较性能指标和原始随机森林指标。迭代 2 指标附加到“rf_base —迭代 2”索引。总的来说,该模型的性能比具有所有功能的模型稍差。最有可能的是,第一个随机森林模型是过度拟合的(相对较低的偏差和较高的方差),在此阶段不应引起关注。

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

记住 X_train 只包含 9 个特性,如上图。

基于更新的特征和排列重要性排序,apollowed 在两者中都非常接近于零。我决定在下一次迭代中放弃这个特性。

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

我决定放弃 fare_bucket 和 age_bucket。在我看来,用于创建票价桶的平均每位乘客票价计算很可能没有足够的数据来很好地概括,并且票价异常值在训练数据中挥之不去。

在使用排列重要性观察了 age_bucket 相对于 pclass 和 is_woman_child 的排名后,类似的逻辑思维落到了 age _ bucket 上。同时,fare_bucket 和 age_bucket 相互关联。我的直觉告诉我,保留这些特征最有可能减少偏差,增加方差。因此,模型的泛化能力会降低。

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

如树状图所示,0.5 下左起的第一个集群由 pclass 和 cabin_level 组成。pclass 和 cabin_level 之间的距离非常近,Spearman 的相关矩阵显示这些是相关的。我犹豫要不要放弃 pclass 或 is_woman_child,因为在我的探索性分析中,这两个特征都显示出与乘客存活率高度相关。

随机森林的随机性创建根节点和分裂以创建内部节点和叶节点会减少共线要素的影响,但不会完全减少。在我看来,在这个使用随机森林的场景中同时使用这两个共线的特征并没有坏处。

迭代 3

在这个阶段,更新的 X_train 和 X_test 数据集包含 5 个特征,我推断这 5 个特征是最相关的。

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

X_train.info()

接下来,我输出了性能指标(“rb_base —迭代 3”),并将它们与早期的结果进行了比较。accuracy_cv_score 高于前两次迭代。精确度提高了很多,这意味着在模型检测到的所有阳性(TP + FP)中发现了更多的真阳性(TP)。这是一个好迹象。正如预期的那样,召回率略有下降,这意味着该模型在实际真阳性(TP + FN)中检测真阳性(TP)的能力有所下降。F1 评分从第 2 次迭代开始改善,ROC 曲线下的 AUC 上升至新高。

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

在仔细研究了特性重要性、排列重要性和 Spearman 相关矩阵的树状图之后,我决定用这些特性来生成我的第一个 Kaggle 提交文件。此时,我并不关心一对相关的特性。

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

我用带 X_test 的训练好的模型输出预测的 y_test (y_pred_base)。我创建了我的提交文件,并提交给 Kaggle。我可以用这个提交获得 80.382%的准确率。我认为这是一个相当可观的分数。

rf_base = RandomForestClassifier(n_estimators=100, random_state=0)
rf_base.fit(X_train, y_train)
y_pred_base = rf_base.predict(X_test)df_output = pd.concat([test_df[‘passengerid’], y_pred_df], axis=1, sort=False)
df_output = df_output.rename(columns={“passengerid”: “PassengerId”})
df_output.to_csv(‘gender_submission.csv’, index=False)

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

随机森林分类器

在 Scikit-Learn 的文档页面中可以找到对 RandomizedSearchCV 的很好的解释。了解 Python 面向对象的方法很好。Scikit-Learn 中的模型类对象包含参数、属性和方法。

用于应用这些方法的估计器的参数通过对参数设置的交叉验证搜索来优化。

与 GridSearchCV 相反,不是所有的参数值都被尝试,而是从指定的分布中采样固定数量的参数设置。尝试的参数设置的数量由 n_iter 给出。

如果所有参数都以列表形式显示,则进行无替换取样。如果至少有一个参数作为分布给出,则使用替换抽样。强烈建议对连续参数使用连续分布。"

我主要关注 rs_grid 变量下面列出的 6 个超参数。关于所有参数的详细概述,文档页面包含了大量信息。

随机森林超参数

  • n_estimators: 这代表了森林中决策树的数量。默认值设置为 n_estimators=100。
  • **标准:**该功能测量分割的质量。例如,年龄是可以作为根节点的特征。基于分裂标准,它分裂成内部节点和叶节点,直到当一个分支达到最低 gini 杂质时树停止生长(缺省设置为 gini,第二个选项是信息增益的熵)。
  • max_features: 寻找最佳分割时要考虑的随机特征子集的数量。
  • max_depth: 树的最大深度。如果没有,则扩展节点,直到所有叶子都是纯的,或者直到所有叶子包含少于 min_samples_split 样本。
  • min_samples_split: 拆分内部节点所需的最小样本数。
  • min_samples_leaf: 一个叶节点所需的最小样本数。任何深度的分裂点只有在左和右分支的每一个中留下至少 min_samples_leaf 训练样本时才会被考虑。

随机搜索 CV 参数

  • **估计器:**模型类实例化,用于对最佳参数进行随机搜索。
  • param_distributions: 以参数名(str)为关键字的字典,以及要尝试的分布或参数列表。
  • n_iter: 被采样的参数设置的数量。
  • cv: 决定交叉验证的拆分策略。
  • **详细:**控制详细程度;详细度越大,输出/日志消息越长。
  • random_state: 伪随机数生成器状态,用于从可能值列表中随机均匀采样,而不是从 scipy.stats 分布中随机均匀采样。
  • n_jobs: 并行运行的作业数量。除非在[joblib.parallel_backend](https://joblib.readthedocs.io/en/latest/parallel.html#joblib.parallel_backend)上下文中,None表示 1。-1指使用所有处理器。

随机搜索用了大约 5 分钟,使用了我所有的处理器能力(n_jobs=-1)。param_distributions 包含 8,232 种设置组合(72277*6)。对于我的随机搜索,我将 cv 设置为 5,这等于分层折叠的数量。因此,如果我从 GridSearchCV 开始,总共将尝试 41,160 个参数设置或拟合。这将需要很长时间来运行。然而,使用 RandomizedSearchCV,它从所有可能的设置中采样 n_iter=200,从而在这种情况下将任务或拟合的数量降低到 1000。以下是这次随机搜索的最佳超参数值。

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

RandomizedSearchCV 的最佳参数属性

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

通过设置 verbose=3,您会得到一个关于正在发生的事情的很好的输出。

让我们比较一下我之前的测试结果。accuracy_cv_score 增加了大约 1.1%,accuracy_cv_stddev 下降到大约 4%。准确率也有所提高(91.47%),而召回率有所下降。F1 的整体成绩有所提高。AUC 分数稳定在 89%。利用我目前所学的知识,目标是在一个较小的设置集上运行网格搜索,并测量增量

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

GridSearchCV:随机森林分类器

GridSearchCV 类似于 RandomizedSearchCV,除了它将基于定义的模型超参数集(GridSearchCV 的 param_grid)进行穷举搜索。换句话说,它将从上面经过所有的 41,160 次拟合。然而,我正在利用以前的经验,减少每个超参数的值列表。关于 GridSearchCV 参数的详细概述,请看文档

“用于应用这些方法的估计器的参数通过在参数网格上的交叉验证网格搜索来优化。”

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

GridSearchCV 中的 best_params_ attribute

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

详细=3

总的来说,除了 AUC 略有上升之外,没有太大的改善。无论如何,这证明了调整正确的超参数集和覆盖广泛的设置可以提高模型预测。因此,学习利用 RandomizedSearchCV 和 GridSearchCV 成为机器学习工作流的重要部分。但是,您还需要知道您希望在调优过程中投入多少时间和精力,因为增益可能很小。

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

作为最后一步,我生成了更新的提交文件并提交给 Kaggle。即使进行了超参数调优,对于这组特性和这组优化的超参数,我的分数仍然保持在 80.382%。

结论

最新结果

通过反复试验和扩展超参数设置,我达到了当前 80.861%的站立得分,根据 Kaggle 的说法,这属于前 6%。在我看来,这是一个相当坚实的分数。

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

最后的想法

  • 这个项目强化了特征工程是强大的观点。用于预测存活率的六个特征中有五个是工程特征,它们捕捉了原始特征不能捕捉的信息。
  • 此外,对主题有足够的背景知识(阅读关于泰坦尼克号的内容)是有帮助的,这在探索性分析阶段很有帮助。
  • 花足够的时间探索(切片和切块)数据有助于建立直觉,这有助于特征工程、聚合和分组数据集。
  • 当这些部分就位后,网格搜索和随机搜索等技术有助于逐步改进模型。
  • 最后,我相信我们不能轻易忽视领域知识和机器学习中的引导试错法的重要性。这些可以被创建成输入,并且模型可以帮助量化它们的重要性。

请随时分享您的意见、反馈和/或问题。如果你对探索性分析和特性工程感兴趣,可以看看我的第一篇文章——“SQL 中的ka ggle Titanic Competition”感谢阅读!

[## SQL 中的巨大竞争

探索性数据分析和特征工程

towardsdatascience.com](/kaggle-titanic-competition-in-sql-78ae3cd551ce)

资源

如果你正在寻找关于机器学习、数据分析和提高 Python 编程技能的好参考书,我推荐这三本书。

Kaggle 用户调查仪表板-2019 年

原文:https://towardsdatascience.com/kaggle-user-survey-2019-326e187ff207?source=collection_archive---------11-----------------------

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

仪表板主页[Image [0]]

使用 R、Flexdashboard 和 Highcharter 库制作的仪表板,用于分析 Kaggle 在 2019 年进行的用户调查。

当我们告别 2019 年时,我想探索和分析数据科学生态系统的状态,特别是女性在数据科学中的参与以及长期的 R vs Python 辩论。那时我偶然发现了 Kaggle 在 2019 年 10 月进行的一项调查,他们在这里提供了。这是最大的调查之一,有 19,717 份回复。

在这个仪表板中,我试图分析两个主要主题——

  1. STEM 中的女性。
  2. 数据科学中的 R vs Python。

这篇博文分为三个不同的部分——主页、STEM 中的女性和 R vs Python。我将在这里介绍主要的发现。

主页

在大约 19 000 名受访者中,大多数是男性。

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

性别分布[图片[1]]

大多数受访者拥有硕士学位。

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

教育分布[图片[2]]

25-29 岁是受访者中最常见的年龄组。

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

年龄分布[图片 3]

印度的受访者人数最多,其次是美国。

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

地理分布[图片[4]]

数据科学家和软件工程师是最常见的职业。

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

名称分布[图片[5]]

STEM 中的女性

人口统计、教育、职称和工资

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

人口统计、教育、职位和薪水图[Image [6]]

见解

  • 接近 50%参与调查的人拥有硕士学位。
  • 47%的女性受访者拥有硕士学位,而男性为 43%。
  • 数据科学和软件工程师是两个最受欢迎的职业。接受调查的学生人数几乎等于数据科学家的人数。
  • 24%的学生是女性,而男性为 20%。
  • 与男性相比,更多的女性是学生、统计学家、产品/项目经理、数据分析师和研究科学家。
  • 与女性相比,更多的男性是数据科学家、软件工程师、DBA/DB 工程师和数据工程师。
  • 女性失业率为 6.87%,男性失业率为 4.46%。

工作中的机器学习

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

工作中的机器学习图[图片[7]]

见解

  • 大多数受访者正在探索 ML 模型,并可能在工作中的某一天将模型投入生产。紧随其后的是在过去的两年里将模型投入生产的人数。
  • 与男性(18%)相比,更多的女性(20.22%)在工作中不使用 ML。
  • 与女性(16.05%)相比,更多男性(19.69%)在工作中拥有成熟的管理团队方法的团队中工作。
  • 大多数受访者在规模为 1-2 或 20+ ie 的数据科学团队中工作。要么是小型探索团队,要么是羽翼丰满的团队。
  • 与男性(23.08%)相比,更多的女性(24.48%)在 20 人以上的团队中工作。
  • 与女性(19.44%)相比,更多男性(22.47%)在 1-2 人团队中工作。

数据科学中使用的工具和技术

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

数据科学图中使用的工具和技术[Image [8]]

见解

  • MySQL 和 PostgresSQL 是使用最多的 RDBMS 产品。
  • 使用 MySQL 的女性(23.51%)多于男性(22.28%)。使用 PostgresSQL 的男性(15.73%)多于女性(13.42%)。
  • Scikit-learn 是迄今为止最受欢迎的 ML 框架,被近 50%的受访者使用。Keras 在受欢迎程度上紧随其后。
  • 与男性(22.98%)相比,更多的女性(25.32%)使用 Python 中的 scikit-learn。与男性(2.72%)相比,更多女性(3.52%)使用 Caret(R 中的 ML 库)。
  • 男性比女性使用 PyTorch、Tensorflow、Keras 等深度学习框架。
  • Matplotlib 和 Seaborn 是最流行的数据可视化库。第三个是 ggplot2 库。
  • 使用 matplotlib 图书馆的男性(34.11%)多于女性(31.47%)。与男性(12.71%)相比,更多的女性(17.41%)使用 ggplot2 图书馆。
  • Jupyter notebook/lab 是最受欢迎的编辑器,被超过 50%的受访者使用。VScode 和 RStudio 紧随其后。
  • Kaggle 内核和 Google Colab 是最受欢迎的托管笔记本服务。

ML(自然语言处理和计算机视觉)中使用的算法

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

ML (NLP 和计算机视觉)图中使用的算法[图片[9]]

见解

  • 单词嵌入是最流行的 NLP 技术,其次是编码器解码器模型。
  • 自动模型选择是最常用的工具,其次是数据扩充技术。
  • 图像分类是最常用的计算机视觉方法。

编码经验和建议

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

编码体验和建议图[图片[10]]

见解

  • 近 50%的受访者花了 0-2 年时间编写代码来分析数据。
  • 在编写代码以分析数据方面,女性(28.88%)比男性(23.79%)拥有不到 1 年的经验。与女性相比,有超过 1 年编写代码经验的男性更多。
  • Python 是最流行的编程语言,其次是 SQL 和 r。
  • Python 是迄今为止最推荐给初学者的语言,超过 50%的受访者推荐它。r 紧随其后。
  • 与女性(73.38%)相比,更多男性(79.8%)推荐 Python。而与男性(8.94%)相比,更多的女性(11.4%)建议进行 R。

数据科学媒体和课程平台

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

数据科学媒体和课程平台[Image [11]]

见解

  • Kaggle 是最受关注的数据科学媒体来源,其次是博客,如走向数据科学。
  • 与男性相比,更多的女性使用 Kaggle 和博客内容。
  • Coursera、Kaggle、Udemy 和 University 是最受欢迎的通过课程学习数据科学的来源。
  • 通过大学课程学习的女性(13.55%)多于男性(10.77%)。

R vs Python

哪些是最流行的编程语言?

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

流行编程语言 plot [Image [12]]

见解

  • Python 是最流行的编程语言,其次是 SQL 和 r。
  • 与使用 r 相比,更多的人只使用 Python。

R/Python 用在哪里?

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

R/Python 世界地图[Image [13]]

见解

  • 美国和印度是使用 R 和 Python 最多的国家。
  • 美国有更多的 R 用户,而印度有更多的 Python 用户。

谁在用 R 和 Python?

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

R/Python 人口统计图[Image [14]]

见解

  • 25-29 岁年龄段的人使用 R/Python 最多。
  • 与其他名称相比,数据科学家使用 R 和 Python 最多。软件工程师比 R 用户更多地使用 Python。
  • Python 用户在所有工资范围内都一致地获得更多工资。
  • 与 Python 相比,更多的统计学家使用 R。
  • 更多有 1-2 年编码经验的人使用 Python,而更多有 3-5 年编码经验的人使用 r。
  • 与所有其他教育学位相比,拥有硕士学位的人更多地使用 Python 和 R。

ML 中使用的算法(NLP、AutoML 和计算机视觉)

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

ML (NLP、AutoML 和计算机视觉)图中使用的算法[Image [15]]

见解

  • 深度学习算法主要由 Python 用户使用。
  • NLP 和计算机视觉领域的大部分工作都是用 Python 完成的。

感谢您的阅读。欢迎提出建议和建设性的批评。:)你可以在 LinkedInTwitter *找到我。*您可以在这里查看仪表盘

你也可以在这里查看我的其他博客文章。

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

Kaggle 的微型课程——我最喜欢的数据科学介绍

原文:https://towardsdatascience.com/kaggles-micro-courses-my-favorite-introduction-to-data-science-f0cc6aeb024c?source=collection_archive---------46-----------------------

这就是为什么 Kaggle Learn 是数据科学最友好的入门

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

照片由 Fotis FotopoulosUnsplash 上拍摄

截至本月,Kaggle 拥有超过 500 万注册用户,是世界上最大的数据科学和机器学习社区。该平台提供了大量可供公众下载的数据集、资源、数据科学项目和竞赛,可以让您轻松入门。我最喜欢的资源是他们的 Kaggle Learn

Kaggle Learn 是一套 14 门微型课程,由 Kaggle 营销为“获得独立数据科学项目所需技能的最快方法”这些课程通过让你体验一系列的主题,提供了该领域的一些最好和最快的介绍。该平台从 Python、机器学习、数据可视化、SQL、深度学习、自然语言处理(NLP)和强化学习等方面对这些话题进行了精彩的阐释。

但是为什么我认为这是你能得到的最友好、最有趣的数据科学介绍呢?这些迷你课程的一个很大的特点是,它们给你一个尝试各种事情的机会;从用 python 写基本函数,到用 SQL 写高级查询,构建自己的视频游戏机器人。即使你只触及表面,你也可以马上尝试各种各样的主题!

Python

这个迷你课程让你有机会对 Python 语言及其语法有一个基本的了解。

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

照片由 Hitesh ChoudharyUnsplash 上拍摄

每个迷你课程被分成更小的章节,然后是编码练习题。在本课程中,您将学习函数、布尔、条件、列表、循环、列表理解、字符串和字典的基础知识。这些足以让您快速(但也是实用的)领略这种最著名的数据科学语言。

机器学习入门中级机器学习

事实上,这是两门课程。这两个微型课程,像他们系列的其他课程一样,都写得非常好,非常吸引人。它们简明扼要,并有丰富的实例。

第一门课程向你介绍机器学习中使用的不同类型的模型。其余的章节探索了模型验证、欠拟合、过拟合、随机森林和一个新增加的关于 AutoML!

第二个课程让你准备好处理缺失值、分类变量、管道、交叉验证和数据泄漏。

数据可视化

这个迷你课程探索各种可视化技术,并教你如何以及何时使用折线图、条形图、热图、散点图和密度图。它还讨论了发行版以及选择正确可视化的方法。

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

照片由粘土堤Unsplash 上拍摄

我个人非常喜欢好的数据可视化课程。我一次又一次地看到,人们用太杂乱、太复杂而无法阅读或完全脱离上下文的可视化方式来可视化他们数据中的某些指标、属性或见解。这个小课程用基本术语解释了每种可视化类型应该在哪里使用。

熊猫

这个迷你课程可以快速有效地建立最基本的熊猫工具。它从教你如何创建、读取和写入数据开始。然后,它将转移到您作为数据科学家每天都会使用的技术,进行任何类型的数据清理。这些包括:索引,选择,合并,排序,重命名,分配,分组和各种清理黑客,你将不得不做清理你的数据和准备你的数据集。本课程也再次讨论了缺失值的处理问题。

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

帕斯卡·米勒Unsplash 上的照片

特色工程

是时候改进你的模型了!在这个小型课程中,您将学习创建基线模型、对分类数据进行编码、生成特征以及选择最适合您的模型的特征。

深度学习

令人惊讶的是,这些课程让你很快就能尝试像深度学习和 NLP 这样的东西,即使是非常基础的水平!

本课程探索了各种章节和技术。你先快速总结一下深度学习和计算机视觉的基础知识。然后,您将学习如何从卷积构建模型,如何在 TensorFlow 和 Keras 中编程,如何使用迁移学习构建高度精确的模型,以及如何使用数据扩充为模型训练提供更多数据。

SQL 简介高级 SQL

想了解 SQL 查询是如何工作的?简介课程通过让您熟悉使用最常见的关键字(如 SELECT、FROM、WHERE、GROUP BY、HAVING、COUNT、ORDER BY、AS 和 WITH)来解释如何编写各种基本的 SQL 查询。

顾名思义,高级微课通过引入连接和联合以及解释分析函数、嵌套数据和重复数据来更深入地研究 SQL。

地理空间分析自然语言处理游戏 AI 和强化学习

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

照片由阿曼达·达尔比约恩Unsplash 上拍摄

在地理空间分析课程中,您将学习如何使用 GeoPandas 创建您的第一张地图,以及制作交互式地图和 choropleth 地图。在第三和第四章中,除了邻近分析的基础知识之外,您还将学习如何操作地理空间数据。

自然语言处理课程是简短和初级的(适合这种小型课程)。它以一个非常简短的 NLP 介绍开始,介绍文本分类,最后以一章关于单词向量结束。

迷你课程系列的最后一门课程是关于游戏人工智能和强化学习的。这个课程很有趣,也是入门系列的一个很好的总结。在这里,你将编写你的第一个游戏代理,实现一些技巧使你的代理更聪明,最终你将使用极大极小算法使你的代理更聪明。

我认为这一系列迷你课程是让有抱负的数据科学家对该领域更加感兴趣的一种奇妙方式。通过让初级数据科学家尝试各种各样的主题,Kaggle 完全击中了要害!

感谢 Kaggle 团队精彩的 Kaggle Learn 迷你课程系列!

10 分钟后卡格尔的泰坦尼克号比赛|第一部分

原文:https://towardsdatascience.com/kaggles-titanic-competition-in-10-minutes-part-i-e6d18e59dbce?source=collection_archive---------25-----------------------

机器学习教程| 第二部分→ | 第三部分→→

使用决策树分类器|机器学习教程,用不到 20 行代码完成您的第一场 Kaggle 竞赛

既然你正在阅读这篇文章,我确信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . Yal n—Linkedin

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

Florian OlivoUnsplash 上拍摄的照片

如果你对机器学习感兴趣,你可能听说过 Kaggle 。Kaggle 是一个平台,在这里你可以用 Python 和 R 学习很多关于机器学习的知识,做数据科学项目,还可以(这是最好玩的部分)参加机器学习竞赛。比赛会随着时间的推移而改变和更新。目前,《泰坦尼克号:机器从灾难中学习》是平台上的初学者比赛。在这篇文章中,我们将用不到 20 行 Python 代码创建一个准备好上传的提交文件。为了能够做到这一点,我们将使用 PandasScikit-Learn 库。

泰坦尼克号和臭名昭著的事故

皇家邮轮泰坦尼克号开始服役时是水上最大的船只,1912 年 4 月 15 日,它在第一次前往美国的航行中与冰山相撞后沉没。航行中有 2224 名乘客和船员,不幸的是,其中 1502 人死亡。这是 20 世纪和平时期最致命的商业海上灾难之一。

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

图一。维基百科泰坦尼克号 RMS 的灰度照片

伤亡人数如此之高的主要原因之一是乘客和船员没有足够的救生艇。虽然运气在事故中幸存下来起了一定作用,但一些人,如妇女、儿童和上层阶级的乘客比其他人更有可能幸存下来。我们将计算这种可能性,以及特定特征对存活可能性的影响。我们将用不到 20 行代码来完成这个任务,并准备好一个提交文件。 …让我们开始吧!

下载数据

Titanic 数据集是一个开放的数据集,你可以从许多不同的存储库和 GitHub 帐户访问它。然而,从 Kaggle 下载肯定是最好的选择,因为其他来源可能有稍微不同的版本,可能不提供单独的训练和测试文件。因此,请访问此链接下载数据集(Train.csv 和 Test.csv)开始。

通常我们的 Train.csv 文件在 Excel 中是这样的:

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

表 1。CSV 格式的训练数据集

在将它转换成 Excel 中的表格(数据->文本到列)后,我们得到这样的视图:

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

表二。文本到列操作后的定型数据集

好多了,对吧!现在,我们可以清楚地看到,我们有 12 个变量。虽然“幸存”变量表示特定乘客是否在事故中幸存,但其余的是关于该乘客的基本信息。以下是变量的简要说明:

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

表 3。关于训练数据集特征的信息

加载并处理培训数据

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

图二。照片由印尼 UXUnsplash 上拍摄

我假设您已经安装了 Python 环境。不过,如果你的电脑上没有 Python,你可以参考这个链接用于 Windows,参考这个链接用于 macOS。在确保您的系统上安装了 Python 之后,打开您最喜欢的 IDE,并开始编码!

Note that using a [Google Colab Notebook](http://colab.research.google.com) is another option, which does not require local Python3 installation. To have access to the Google Colab Notebook with the full code, consider signing up to [the Newsletter](https://subscribe.to/ogyalcin/) using the slider below.

首先,我们将加载训练数据进行清理,并为训练我们的模型做好准备。我们将(I)加载数据,(ii)删除具有空值的行,(iii)选择“Survival”列作为我的响应变量,(iv)删除目前不相关的解释变量,(v)将分类变量转换为哑变量,我们将用 7 行代码完成所有这些:

创建模型并训练

为了揭示生存变量和其他变量(或者特征,如果你愿意)之间的关系,你需要选择一个统计机器学习模型,并用处理后的数据训练你的模型。

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

图 4。泰坦尼克号案例的简化决策树模式(图片由作者提供)

Scikit-learn 为此提供了几种算法。我们将选择决策树分类器,这是一个基本但强大的机器学习算法。得到这个:我们只需要 3 行代码来揭示生存(表示为 y)和选择的解释变量(表示为 X)之间的隐藏关系

进行预测并保存结果

在揭示了存活率和所选解释变量之间的隐藏关系后,我们可以为预测阶段准备我们的测试数据。Test.csv 文件与 Train.csv 文件略有不同:它不包含“Survival”列。这是有意义的,因为如果我们知道所有的答案,我们可以伪造我们的算法,并在手写后提交正确的答案(等等!有些人已经这样做了。).无论如何,我们的测试数据在预测阶段需要几乎相同的清理、修饰、准备和预处理。我们将用 5 行代码来实现这一点:

现在我们的测试数据是干净的,并为预测做好了准备。最后,对给定的测试文件进行预测,并将其保存到内存中:

这么容易,对!在保存这些预测之前,我们需要获得适当的结构,以便 Kaggle 可以自动对我们的预测进行评分。还记得吗,我们将 PassengerId 列作为一个单独的数据集保存到内存中(如果您愿意,可以称之为 DataFrame)?现在,我们将把预测数据集分配(或附加)给 PassengerIds(注意,它们都是单列数据集)。最后,我们将从内存中获取数据,并将其保存为 Kaggle 要求的 CSV(逗号分隔值)格式。

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

图 5。彼得罗·马蒂亚在 Unsplash 上拍摄的照片

现在您可以访问 Kaggle 的泰坦尼克号比赛页面,登录后即可上传您的提交文件。

你能爬到顶端吗?

肯定不是!我们试图实现一个简单的机器学习算法,让你能够参加一场纸牌游戏比赛。随着您对这些基本代码的改进,您将能够在接下来的提交中获得更好的排名。

订阅时事通讯获取完整代码

在本教程的第 2 部分和第 3 部分,我们将实现更高级的方法来提高我们的精度性能。如果你想获得 Google Colab 上的教程代码和我的最新内容,可以考虑订阅邮件列表:✉️

立即订阅

更新!

该系列的第二部分已经出版,请查看:

[## 10 分钟后卡格尔的泰坦尼克号比赛|第二部分

改进我们的代码,以获得更好的结果,为 Kaggle 的大赛与数据分析和可视化和…

towardsdatascience.com](/kaggles-titanic-competition-in-10-minutes-part-ii-3ae626bc6519)

该系列的第三部分已经出版,请查看:

[## 10 分钟后卡格尔的泰坦尼克号比赛|第三部分

在 Kaggle 的泰坦尼克号比赛|机器中使用自然语言处理(NLP)、深度学习和 GridSearchCV

towardsdatascience.com](/kaggles-titanic-competition-in-10-minutes-part-iii-a492a1a1604f)

喜欢这篇文章

如果你喜欢这篇文章,可以考虑看看我的其他文章:

[## 使用 MNIST 数据集在 10 分钟内完成图像分类

利用 TensorFlow 和 Keras |监督深度学习使用卷积神经网络来分类手写数字

towardsdatascience.com](/image-classification-in-10-minutes-with-mnist-dataset-54c35b77a38d) [## 使用卷积自动编码器在 10 分钟内降低图像噪声

在时尚 MNIST 的帮助下,使用深度卷积自动编码器清洁(或去噪)有噪声的图像

towardsdatascience.com](/image-noise-reduction-in-10-minutes-with-convolutional-autoencoders-d16219d2956a) [## 利用生成性对抗网络在 10 分钟内生成图像

使用无监督深度学习生成手写数字与深度卷积甘斯使用张量流和…

towardsdatascience.com](/image-generation-in-10-minutes-with-generative-adversarial-networks-c2afc56bfa3b) [## TensorFlow Hub & Magenta 在 5 分钟内实现快速神经风格转换

利用 Magenta 的任意图像风格化网络和深度学习,将梵高的独特风格转移到照片中

towardsdatascience.com](/fast-neural-style-transfer-in-5-minutes-with-tensorflow-hub-magenta-110b60431dcc)

10 分钟后卡格尔的泰坦尼克号比赛|第二部分

原文:https://towardsdatascience.com/kaggles-titanic-competition-in-10-minutes-part-ii-3ae626bc6519?source=collection_archive---------17-----------------------

←第一部分 |机器学习教程| 第三部分→

改进我们的代码,通过数据分析和可视化以及梯度推进算法为 Kaggle 的大赛获得更好的结果

在本教程的第一部分中,我们开发了一个不到 20 行的小 python 程序,让我们得以参加第一届 Kaggle 比赛。

[## 10 分钟后卡格尔的泰坦尼克号比赛|第一部分

使用决策树分类器|机器学习,用不到 20 行代码完成您的第一次 Kaggle 竞赛…

towardsdatascience.com](/kaggles-titanic-competition-in-10-minutes-part-i-e6d18e59dbce)

然而,由于我们没有进行良好的数据探索和准备来更好地理解数据和构建模型,因此该模型的表现不是很好。在教程的第二部分,我们将使用 SeabornMatplotlib 来探索数据集。此外,新的概念将被引入和应用于一个更好的执行模式。最后,我们将在第二次提交中增加我们的排名。

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

图一。皇家邮轮泰坦尼克号维基百科上的海试

使用 Jupyter 或 Google Colab 笔记本

对于您的编程环境,您可以选择以下两个选项之一: Jupyter NotebookGoogle Colab Notebook :

Jupyter 笔记本

正如在第一部分中提到的,您需要在系统上安装 Python 来运行任何 Python 代码。还有,需要安装 Numpy、Pandas、Matplotlib、Seaborn 等库。此外,您需要一个 IDE(文本编辑器)来编写代码。当然,您可以使用自己选择的 IDE。不过我强烈推荐安装 Anaconda 发行的 Jupyter 笔记本。Jupyter Notebook 利用了 iPython ,它提供了一个交互式外壳,为测试你的代码提供了很多方便。所以,如果你还没有使用它,你一定要检查一下。

谷歌 Colab 笔记本

Google Colab 建立在 Jupyter 笔记本之上,并为您提供云计算功能。不需要完成以上所有步骤,你可以创建一个 Google Colab 笔记本,它预装了这些库。所以,它更加流线型。比起 Jupyter,我更推荐 Google Colab,但最终还是要看你自己。

探索我们的数据

为了能够创建一个好的模型,首先,我们需要探索我们的数据。 Seaborn ,一个统计数据可视化库,非常方便。首先,让我们记住数据集的样子:

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

表 1。我们培训数据的前 5 行(按作者列出的表格)

这是你在上面看到的变量的解释:

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

表二。对变量的解释(表格由作者提供)

所以,现在是时候探索这些变量对生存概率的影响了!

我们的第一个猜想是,一个人的性别(男-女)和他/她的生存概率之间存在相关性。为了能够理解这种关系,我们根据存活和非存活标签创建了男性和女性类别的条形图:

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

图二。男性和女性的存活数(按作者分列)

正如你在图中看到的,女性比男性有更大的生存机会。因此,性别必须是我们模型中的一个解释变量。

其次,我们怀疑乘客等级和存活率之间也有关联。当我们绘制 Pclass 对抗 Survival 时,我们得到下面的图:

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

图 3。不同乘客等级的幸存人数(作者提供的数字)

正如我们所怀疑的,乘客级别对一个人的生存机会有很大的影响。看来,如果有人乘坐三等舱旅行,那么他很有可能无法生还。所以 Pclass 对生存概率肯定是有解释力的。

第三,我们还怀疑船上兄弟姐妹的数量(SibSp)和船上父母的数量(Parch)在解释生存机会方面也很重要。因此,我们需要绘制 SibSp 和 Parch 变量与存活率的关系图,我们得到如下结果:

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

图 4。基于船上兄弟姐妹和父母的幸存人数(作者提供数据)

因此,我们得出这样的结论:随着船上兄弟姐妹数量或船上父母数量的增加,生存的机会也会增加。换句话说,和家人一起旅行的人有更高的生存机会。

我们模型的另一个潜在解释变量(特征)是上船变量。当我们着手对抗生存的阴谋时,我们获得这样的结果:

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

图 5。基于装载港口的生存统计(作者提供的数据)

很明显,登上南安普敦港的人没有其他人那么幸运。因此,我们也将在我们的模型中包括这个变量。

到目前为止,我们检查了 5 个分类变量(性别、Plclass、SibSp、Parch、apollowed),似乎它们都在一个人的生存机会中发挥了作用。

现在是时候研究我们的数字变量票价和年龄了。首先,我们希望看到年龄对生存机会的影响。因此,我们绘制年龄变量(seaborn.distplot):

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

图 6。存活率与年龄的关系图(作者提供的数据)

我们可以看到,18 岁以下的儿童存活率较高,而 18 岁以上、35 岁以下的人,这个比率较低。年龄在生存中起着作用。

最后,我们需要看看票价是否有助于解释生存概率。因此,我们绘制票价变量(seaborn.distplot):

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

图 7。幸存者与票价的关系图(作者提供的数据)

总的来说,我们可以看到,随着乘客支付的车费增加,生存的机会也增加,正如我们所预料的那样。

我们将忽略三列:Name、Cabin、Ticket,因为我们需要使用更高级的技术将这些变量包含在我们的模型中。为了说明如何从这些变量中提取特征:您可以对乘客的姓名进行标记,并派生出他们的头衔。除了先生和夫人之类的头衔,你还会发现其他头衔,如主人或女士等。当然,这在那天晚上拯救谁的问题上起了作用。因此,您可以利用给定的名称列以及客舱和机票列。

检查数据中的空值

空值是我们的敌人!在泰坦尼克号数据集中,我们有一些缺失值。首先,我们将在删除训练数据集的幸存列后合并这两个数据集。

我们需要得到关于空值的信息!有两种方法可以完成这个任务:。info() 功能和热图(更酷的方式!).为了能够检测到空值,我们可以使用 seaborn 的热图,代码如下:

这是结果。黄线是缺失的值。

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

图 8。空值的热图(作者提供的图)

有很多遗漏的年龄和客舱值。“已装船”列中缺少两个值,而“票价”列中缺少一个值。让我们先处理这些。或者,我们可以使用。 info() 功能以文本形式接收相同的信息:

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

图 9。联合泰坦尼克号数据的空值信息(作者提供的图表)

读取数据集

由于在第一部分中已经涉及到,我们将不再讨论数据集的细节。使用下面的代码,我们可以导入 Pandas & Numpy 库并读取 train & test CSV 文件。

从上面我们知道,在训练集和测试集中我们都有空值。我们需要估算这些空值,并分别为模型拟合和预测准备数据集。

输入空值

解决数据集中缺失值问题有两种主要方法:丢弃或填充。放弃是简单而天真的出路;虽然,有时它实际上可能表现得更好。在我们的例子中,我们将填充它们,除非我们决定完全删除整个列。

我们的数据集的初始外观如下:

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

表 3。训练数据集的初始外观(按作者排列的表格)

我们将进行几次插补和转换,以获得完全数字化的干净数据集,从而能够用以下代码拟合机器学习模型(它还包含插补):

清理训练数据集的 Python 代码

在训练数据集上运行此代码后,我们得到了以下结果:

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

表 4。训练数据集的干净版本(按作者列出的表)

没有空值、字符串或类别会妨碍我们。现在,我们可以将数据分成两部分,特征(X 或解释变量)和标签(Y 或响应变量),然后我们可以使用 sklearntrain_test_split() 函数在训练数据集中进行训练测试拆分。

**Note:** We have another dataset called *test*. This isn’t very clear due to the naming made by Kaggle. We are training and testing our model using the train dataset by splitting it into *X_train*, *X_test*, *y_train*, *y_test* DataFrames, and then applying the trained model on our test dataset to generate a predictions file.

创建梯度推进模型和训练

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

图 10。梯度推进算法的可视化(图片由作者提供)

在第一部分中,我们使用了一个基本的决策树模型作为我们的机器学习算法。另一个众所周知的机器学习算法是梯度提升分类器,由于它通常优于决策树,我们将在本教程中使用梯度提升分类器。下面分享的代码允许我们导入梯度提升分类器算法,基于它创建一个模型,使用 X_trainy_train DataFrames 拟合和训练模型,最后在 X_test 上进行预测。

现在,我们有了预测,也知道了答案,因为 X_test 是从列车数据帧中分离出来的。为了能够衡量我们的成功,我们可以使用混淆矩阵和分类报告。您可以通过运行以下代码来实现这一点:

这是输出结果:

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

图 11。混淆矩阵和分类报告我们的结果(图由作者)

我们获得了大约 82%的准确率,这可以被认为是非常好的,尽管仍有改进的空间。

为卡吉尔比赛创建预测文件

现在,我们有了一个训练有素的工作模型,可以用来预测 test.csv 文件中乘客的生存概率。

首先,我们将使用以下代码清理和准备数据(与我们清理训练数据集的方式非常相似)。请注意,在以“ids”的名称删除 PassengerId 列之前,我们将它保存为一个单独的 dataframe。

最后,我们可以预测测试数据帧的存活值,并根据需要使用以下代码写入 CSV 文件。

这样你就有了一个新的更好的 Kaggle 竞赛模型。我们在代码中做了一些改进,提高了大约 15–20%的准确性,这是一个很好的改进。正如我上面提到的,仍然有一些改进的空间,准确率可以提高到 85–86%左右。然而,在我看来,记分牌的分数并不十分可靠,因为许多人使用了不诚实的技术来提高他们的排名。

这个迷你系列的第三部分

在第三部分中,我们将使用更先进的技术,如自然语言处理(NLP)、深度学习和 GridSearchCV,以提高我们在 Kaggle 的泰坦尼克号比赛中的准确性。

[## 10 分钟后卡格尔的泰坦尼克号比赛|第三部分

在 Kaggle 的泰坦尼克号比赛|机器中使用自然语言处理(NLP)、深度学习和 GridSearchCV

towardsdatascience.com](/kaggles-titanic-competition-in-10-minutes-part-iii-a492a1a1604f)

既然您正在阅读这篇文章,我相信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过Linkedin来连线吧!请不要犹豫发送联系请求!Orhan g . Yal n—Linkedin

订阅时事通讯获取完整代码

如果你想获得 Google Colab 上的教程代码和我的最新内容,可以考虑订阅我的 GDPR 兼容 时事通讯 !✉️

现在就订阅

10 分钟后卡格尔的泰坦尼克号比赛|第三部分

原文:https://towardsdatascience.com/kaggles-titanic-competition-in-10-minutes-part-iii-a492a1a1604f?source=collection_archive---------30-----------------------

←第一部分 | ←第二部分 |机器学习教程

在 Kaggle 的泰坦尼克号竞赛|机器学习教程中使用自然语言处理(NLP)、深度学习和 GridSearchCV

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

图一。正在 Unsplash 上建造的泰坦尼克号

如果你关注了我关于 Kaggle 的泰坦尼克号比赛(Part-I 和 Part-II)的教程系列,或者已经参加了比赛,你就对整个故事很熟悉了。如果你不熟悉,既然这是后续教程,强烈推荐你去看看这个教程系列的比赛页面或者 Part-IPart-II 。在该系列的第三部分(最终版)中,(I)我们将使用自然语言处理( NLP )技术来获取乘客的头衔,(II)创建一个人工神经网络(ANN 或 RegularNet)来训练模型,以及(III)使用网格搜索交叉验证来调整 ANN,以便我们获得最佳结果。

开始吧!

背景

教程第一部分

在这个系列教程中,我们试图保持事情简单,慢慢地清晰地发展故事。在本教程的第 1 部分,我们学习了用不到 20 行代码编写一个 python 程序来参加 Kaggle 的竞赛。事情尽可能保持简单。我们清理了非数字部分,处理了空值,使用 train.csv 文件训练了我们的模型,在 test.csv 文件中预测了乘客的存活情况,并将其保存为 csv 文件以供提交。

[## 10 分钟后卡格尔的泰坦尼克号比赛|第一部分

使用决策树分类器|机器学习,用不到 20 行代码完成您的第一次 Kaggle 竞赛…

towardsdatascience.com](/kaggles-titanic-competition-in-10-minutes-part-i-e6d18e59dbce)

教程第二部分

由于我们在第一部分中没有适当地研究数据集,所以我们在第二部分中使用 Matplotlib 和 Seaborn 重点研究数据研究。我们通过使用聚合函数来估算空值而不是丢弃它们,更好地清理数据,并最终从分类变量中生成哑变量。然后,我们使用 RandomForestClassifier 模型代替 LogisticRegression,这也提高了精度。与第一部分中的模型相比,我们实现了大约 20%的精度提升。

[## 10 分钟后卡格尔的泰坦尼克号比赛|第二部分

改进我们的代码,以获得更好的结果,为 Kaggle 的大赛与数据分析和可视化和…

towardsdatascience.com](/kaggles-titanic-competition-in-10-minutes-part-ii-3ae626bc6519)

教程的第三部分

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

图二。具有一个隐藏层的人工神经网络图(由作者提供)

我们现在将使用 Name 列来导出乘客的头衔,这在他们的生存机会中扮演了重要的角色。我们还将使用 Keras 创建一个人工神经网络(ANN 或 RegularNets)来获得更好的结果。最后,为了调整 ANN 模型,我们将使用 GridSearchCV 来检测最佳参数。最后,我们将生成一个新的 CSV 文件进行提交。

准备数据集

就像我们在第一部分和第二部分中所做的那样,我将开始清理数据并输入空值。这一次,我们将采用一种不同的方法,并结合两个数据集进行清理和输入。我们已经讨论了为什么我们用第二部分的方法估算空值;因此,我们会直接给你代码。如果你觉得有些操作没有意义,你可以参考第二部分或者下面的评论。然而,由于我们在第二部分中看到 18 岁以下的人有更大的生存机会,我们应该增加一个新的特征来衡量这种影响。

数据清理和空值插补

使用 NLP 导出乘客标题

我们将删除不必要的列,并从上面的分类变量中生成虚拟变量。但是首先,我们需要从“名称”列中提取标题。为了理解我们在做什么,我们将从运行下面的代码来获取前 10 行 Name 列值开始。

命名前 10 行的列值

这是我们得到的结果:

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

图 3。前 10 行的名称列值(按作者排序)

名称列值的结构如下:

因此,我们需要根据点和逗号分割这些字符串,并提取标题。我们可以通过下面的代码来实现这一点:

拆分名称值以提取标题

一旦我们运行这段代码,我们将有一个标题列,其中包含标题。为了能够看到我们有什么样的标题,我们将运行:

对标题进行分组并获得计数

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

图 4。唯一书目数量(按作者分列)

似乎我们有四大群体:'先生,'夫人,'小姐,‘老爷’,以及其他。然而,在将所有其他标题归类为其他标题之前,我们需要注意法语标题。我们需要用下面的代码将它们转换成相应的英文标题:

法语到英语标题转换器

现在,我们只有军官和皇家头衔。把他们组合成其他人是有意义的。我们可以通过下面的代码实现这一点:

将所有非主要头衔合并为其他头衔(包括军官和皇家头衔)

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

图 5。最终唯一书目数量(按作者统计)

数据准备的最后一笔

现在我们的标题更易于管理,我们可以用下面的代码创建虚拟列并删除不必要的列:

数据准备的最后一笔

创建用于训练的人工神经网络

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

图 6。具有两个隐藏层的人工神经网络图(由作者提供)

使用标准定标器标准化我们的数据

为了得到好的结果,我们必须使用 Scikit Learn 的标准定标器来定标我们的数据。标准缩放器通过移除平均值并缩放至单位方差(即标准化)来标准化要素,这与最小最大缩放器不同。标准化和规格化之间的数学差异如下:

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

图 7。标准化与规范化(作者提供的图表)

我们将选择 StandardScaler()来缩放数据集,并运行以下代码:

扩展训练和测试数据集

建立人工神经网络模型

将我们的数据标准化后,我们可以开始构建我们的人工神经网络。我们将创建一个输入层(密集),一个输出层(密集),和一个隐藏层(密集)。在每一层之后,直到输出层,我们将应用 0.2 的正则化下降来对抗过拟合。最后,我们将使用 Keras 分类器建立模型,将 GridSearchCV 应用到这个神经网络上。因为我们有 14 个解释变量,所以我们的 input_dimension 必须等于 14。由于我们将进行二进制分类,因此我们的最终输出图层必须为幸存或未幸存分类输出单个值。中间的其他单元是“试一试值,我们选择了 128 个神经元。

用 Keras 分类器构建人工神经网络

网格搜索交叉验证

在构建人工神经网络之后,我们将使用 scikit-learn GridSearchCV 来找到最佳参数,并调整我们的人工神经网络以获得最佳结果。我们将使用下面的代码尝试不同的优化器、时期和 batch _ sizes。

基于 Keras 分类器的网格搜索

运行这段代码并打印出最佳参数后,我们得到以下输出:

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

图 8。最佳参数和精确度

请注意,我们没有在 GridSearchCV 中激活交叉验证。如果您想在 GridSearchCV 中添加交叉验证功能,请在 GridSearch 中选择一个 CV 值(例如,cv=5 )。

用最佳参数拟合模型

既然我们找到了最佳参数,我们可以用最佳参数值重新创建分类器,并用以下代码拟合我们的训练数据集:

用最佳参数拟合

既然我们获得了预测,我们就可以进行最后的操作来准备提交。需要注意的一点是,我们的人工神经网络给出了生存概率,这是一个连续的数字变量。然而,我们需要一个二元分类变量。因此,我们还使用下面的 lambda 函数进行必要的操作,将连续值转换为二进制值(0 或 1 ),并将结果写入 CSV 文件。

创建提交文件

恭喜

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

图 9。深度学习与旧算法(作者图)

你创造了一个人工神经网络来分类泰坦尼克号乘客的幸存者。只要有大量数据,神经网络就被证明优于所有其他机器学习算法。由于我们的数据集仅由 1309 行组成,一些机器学习算法如梯度提升树或具有良好调谐的随机森林可能优于神经网络。但是,对于具有大量数据的数据集,情况并非如此,如下图所示:

我会说,泰坦尼克号数据集可能位于旧算法优于深度学习算法的交叉点的左侧。然而,我们仍将达到高于 80%的准确率,大约在自然的准确率水平。

订阅时事通讯获取完整代码

既然你正在阅读这篇文章,我相信我们有着相似的兴趣,并且现在/将来会从事相似的行业。那么我们就通过 Linkedin 来连线吧!请不要犹豫发送联系请求!Orhan g . yaln—Linkedin

如果你想获得 Google Colab 上的教程代码和我的最新内容,可以考虑订阅我的 GDPR 兼容 时事通讯 !✉️

现在就订阅

软件工程师用卡尔曼滤波器

原文:https://towardsdatascience.com/kalman-filters-for-software-engineers-3d2a05dee465?source=collection_archive---------8-----------------------

深入探讨卡尔曼滤波器,有史以来最广泛和最有用的算法之一。

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

照片由克莱姆·奥诺杰霍Unsplash 拍摄

在和我的朋友交谈时,我经常听到:“哦,卡尔曼滤波器……我通常研究它们,理解它们,然后我就什么都忘了”。好吧,考虑到卡尔曼滤波器(KF)是世界上最广泛的算法之一(如果你环顾你的房子,你拥有的 80%的技术可能都有某种 KF 在里面运行),让我们试着一劳永逸地弄清楚它们。

在这篇文章结束时,你将对 KF 的工作原理、背后的想法、为什么需要多种变体以及最常见的变体有一个直观而详细的了解。

状态估计

KFs 是所谓的状态估计算法的一部分。什么是状态估计?想象你有一个系统(姑且把它当做一个黑盒)。这个黑匣子可以是任何东西:你的风扇,一个化学系统,一个移动机器人。对于这些系统中的每一个,我们可以定义一个状态。状态是我们想要知道的变量的向量,它可以描述系统在特定时间点所处的“状态”(这就是为什么它被称为状态)。“能描述”是什么意思?这意味着,如果你知道在时间k的状态向量和给系统的输入,你就可以知道(使用一些系统工作的知识)系统在时间k+1的状态。

例如,假设我们有一个移动的机器人,我们关心知道它在空间的位置(我们不关心它的方向)。如果我们将状态定义为机器人位置(x, y)及其速度(v_x, v_y),并且我们有一个机器人如何移动的模型,这将足以精确定位机器人在哪里以及下一个时刻它将在哪里。

所以状态估计算法估计系统的状态。为什么要估计呢?因为在现实生活中,系统的真实状态是外部观察者永远无法了解的。通常,有两种情况:您可以测量状态,但测量受到噪声的影响(每个传感器只能产生一定精度的读数,这可能对您来说不够)或者您无法直接测量状态。例如,使用 GPS 计算上述移动机器人的位置(我们决定将位置作为状态的一部分),这可能会产生高达 10 米的测量误差,这对于您能想到的任何应用来说可能都不够。

通常,当您进行状态估计时,您可以安全地假设您知道系统的输入(因为它是您给出的)和输出。由于输出是测量的,因此也会受到一定测量噪声的影响。由此,我们将状态估计器定义为一个系统,它接收你想要估计其状态的系统的输入和输出,并输出系统状态的估计。
传统上用x表示状态,用yz表示输出,u为输入,tilde_x为估计状态。

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

系统和状态估计器框图。

卡尔曼滤波器

您可能已经注意到,我们已经讨论了一些错误:

  • 您可以测量系统的输出,但传感器会产生测量误差
  • 你可以估计状态,但是作为一个估计,它有一定的可信度。

除此之外,我说过你需要系统的某种知识,你需要知道系统“行为”的模型(后面会有更多),你的模型当然不是完美的,所以你会有额外的误差。

在 KFs 中,您使用高斯分布处理所有这些不确定性。高斯分布是一种很好的表示不确定事物的方式。你当前的信念可以用分布的均值来表示,而标准差则表示你对自己的信念有多自信。

穿着 KF:

  • 您的估计状态将是一个具有特定均值和协方差的高斯随机变量(这将告诉我们算法有多“信任”其当前估计)
  • 您对原始系统输出测量的不确定性将用一个均值为 0 的随机变量和一个特定的协方差来表示(这将告诉我们对测量本身的信任程度)
  • 你的系统模型的不确定性将由一个均值为 0 的随机变量和一个特定的协方差来表示(这将告诉我们有多信任我们正在使用的模型)。

我们举几个例子来理解这背后的想法是什么。

  1. 坏模型,好传感器
    让我们再次假设你想跟踪一个机器人的位置,你在传感器上花了很多钱,它们给你厘米级的精度。另一方面,你对机器人一点也不感兴趣,你谷歌了一下,发现了一个非常基本的运动模型:随机行走(基本上是一个运动仅由噪声给出的粒子)。很明显,你的模型不是真的好,不能真的被信任,而你的测量是真的好。在这种情况下,您可能会用非常窄的高斯分布(小方差)来模拟测量噪声,而用非常宽的高斯分布(大方差)来模拟不确定性。
  2. 坏的传感器,好的模型
    相反,如果你有坏的传感器(例如 GPS ),但你花了很多时间来为你的系统建模。在这种情况下,您可能会用非常窄的高斯分布(小方差)来模拟模型不确定性,而用非常宽的高斯分布(大方差)来模拟测量噪声。

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

宽方差与小方差高斯分布。

估计的状态不确定性呢?KF 会根据评估过程中发生的事情来更新它,你唯一要做的就是将它初始化为一个足够好的值。“足够好”取决于你的应用,你的传感器,你的模型,等等。一般来说,KF 需要一点收敛到正确的估计。

KF 是如何工作的?

正如我们所说,为了让 KF 工作,你需要对系统有“一些了解”(一个“不确定的”,也就是不完美的模型)。尤其是 KF,你需要两种型号:

  • 状态转换模型:给定某时刻k的状态和输入,给出某时刻k+1的状态的函数。

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

  • 测量模型:给定某一时刻的状态k,给出同一时刻的测量值的函数

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

稍后,我们将看到为什么我们需要这些函数,让我们先看一些例子来理解它们的含义。

状态转换模型
这个模型告诉你你的系统如何随时间演化(如果你还记得的话,之前我们提到过一个状态必须足够描述性才能推断出系统随时间的行为)。这很大程度上取决于系统本身以及你对系统的关注程度。如果你不知道如何为你的系统建模,一些谷歌搜索会有所帮助。对于移动的物体(如果以适当的采样率测量),可以使用恒速模型,假设物体以恒定的速度移动,对于车辆,可以使用独轮车模型等。让我们假设,以某种方式,我们得到了一个模型。我们在这里做了一个重要的假设,这是 KF 工作所必需的:你当前的状态仅仅依赖于先例。换句话说,系统状态的“历史”浓缩在前一个状态中,也就是说,给定前一个状态,每个状态都独立于过去。这也被称为马尔可夫假设。如果这不成立,你就不能仅仅用先例来表达当前的状态。

测量模型
测量模型告诉你输出(可以测量的)和状态是如何联系在一起的。直觉上,您需要这个,因为您知道测量的输出,并且您想要在估计期间从它推断状态。同样,这种模式因情况而异。例如,在移动机器人示例中,如果您关心位置,并且您有 GPS,则您的模型是身份函数,因为您已经在测量状态的噪声版本。

每个步骤的数学公式和解释如下:

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

那么 KF 实际上是如何工作的呢?该算法分两步工作,称为预测和更新。让我们假设我们在时间k并且我们在那个时间有我们估计的状态。首先,我们使用状态转换模型,我们使估计的状态发展到下一个时刻(1)。这相当于说:给定我当前对状态的信念、我拥有的输入和我对系统的了解,我期望我的下一个状态是这样的。这是预测步骤。

现在,由于我们也有了输出和测量模型,我们实际上可以使用真实的测量来“校正”预测。在更新步骤中,我们取期望状态,计算输出(用测量模型)(2),并与实际测量输出进行比较。然后我们以一种“聪明的方式”使用两者之间的差异来修正我们对状态(3)的估计。

通常,我们用顶点-表示,在校正之前,来自预测步骤的状态估计。 K 称为卡尔曼增益。这才是真正的聪明之处: K 取决于我们对度量的信任程度,我们对当前估计的信任程度(这取决于我们对模型的信任程度),并根据这些信息 K “决定”用度量对预测的估计进行修正的程度。如果我们的测量噪声与我们对来自预测步骤的估计的信任程度相比是“小”的,我们将使用测量来大量校正估计,如果相反,我们将最小程度地校正它。

注意:为了简单起见,我写方程时就好像我们在处理正态变量,但是你必须考虑到,在每一步我们都在处理随机高斯变量,因此我们需要通过函数传播变量的协方差,而不仅仅是均值。

举个例子吧。让我们想象一下,我们正在(再次)跟踪一个机器人的位置。真实位置以灰色显示,在时间k我们认为机器人处于绿色位置,估计协方差表示为椭圆(如果您不熟悉这种表示,请看这里的)。粗略地说,从椭圆的形状可以看出,与向前运动方向上的定位相比,我们的滤波器在这一步对横向定位更有信心。在预测步骤之后,我们使用状态转换模型让系统进化,我们认为新的位置是红色的。由于椭圆在横向方向上变得更大,我们现在对新的估计位置不太确定(例如,因为我们不太信任模型)。然后我们读取我们的全球定位系统,我们得到了黑色的位置。利用更新步骤,实际位置估计将是深绿色虚线。如果我们更信任模型(与测量噪声协方差相比更低的协方差),则估计将更接近红色,或者如果我们更信任测量(与模型不确定性相比更低的噪声测量协方差),则估计将更接近测量。

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

KF 算法每一步的实际位置和估计的例子。

KFs 家族

根据 KFs 使用的模型类型(状态转换和测量), KFs 可以分为两大类:如果模型是线性的,就有线性卡尔曼滤波器,而如果模型是非线性的,就有非线性卡尔曼滤波器。

为什么有区别?假设你的变量是高斯型的,当通过线性函数时,高斯型变量仍然是高斯型变量,如果通过非线性函数,这就不成立。这打破了卡尔曼假设,因此我们需要找到修复它的方法。

历史上,人们发现了两种主要的方法:用模型作弊和用数据作弊。如果你在模型中作弊,你基本上是将当前估计值周围的非线性函数线性化,这样你就把自己带回了工作的线性情况。这种方法被称为扩展卡尔曼滤波器 ( EKF )。这种方法的主要缺点是你必须能够计算出f()h()的雅可比矩阵。或者,如果你用数据作弊,你使用你的非线性函数,但是然后你试着“高斯化”(如果这个词存在的话)你做的非高斯分布。这是通过一种称为无味变换的智能采样技术实现的。这种变换允许您用均值和协方差来描述(近似地)分布(只有高斯分布才由前两个矩完全描述)。这种方法叫做无迹卡尔曼滤波 ( UKF )。理论上,UKF 优于 EKF,因为与线性化模型得到的近似相比,无迹变换给出了结果分布的更好近似。在实践中,你必须有相当大的非线性,才能真正看到大的差异。

KF 在行动

既然说了这么多关于一个带 GPS 的移动机器人,我就针对这个案例做了一个简短的演示(想玩的话可以在这里找到代码)。使用独轮车模型生成机器人运动。用于 KF 的状态转换模型是一个恒速模型,其状态包含 x 和 y 位置、转向角及其导数。

机器人正在及时移动(黑色显示的真实位置),在每一步你都会得到一个非常嘈杂的 GPS 测量,它会给出xy(红色)并估计位置(蓝色)。您可以尝试不同的参数,看看它们如何影响状态估计。如你所见,我们可以进行非常嘈杂的测量,并得到真实位置的良好估计。

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

KF 在行动:一个机器人的真实路径(黑色)是用来自噪音测量(红色)的 KF(蓝色)跟踪的。

奖励:卡尔曼增益的直观意义

让我们看看线性 KF 情况下的卡尔曼增益公式,并尝试更深入地了解增益是如何工作的。

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

其中P_k是当前估计状态的协方差(我们对估计有多有信心),C是测量模型的线性变换,使得y(k) = Cx(k)和 R 是测量噪声的协方差矩阵。请注意,分数符号并不真正正确,但它使可视化发生的事情更容易。

根据等式,如果 R 变为 0,则我们有:

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

代入我们定义的算法步骤(3),我们可以看到,我们将完全忽略预测步骤结果,并且我们使用测量模型的逆变换来获得仅来自测量的状态估计。

相反,如果我们非常信任模型/估计,P_k将趋向于 0,给出:

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

因此,我们有一个与预测阶跃输出相同的最终估计。

需要注意的是,我交替使用了“信任模型”和“信任当前估计”。它们并不相同,但它们是相关的,因为我们对预测步骤的估计的信任程度是我们对模型的信任程度的组合(因为预测步骤是仅使用模型完成的),加上我们对先前过滤步骤的估计的信任程度。

额外收获 2:图书馆

有很多很好的在线计算 KFs 的库,这里是我最喜欢的一些。

作为一名围棋爱好者,我将从这个非常好的围棋库开始,它有几个预先实现的模型:

[## 罗塞姆斯利/卡尔曼

为具有非均匀时间的连续时间索引模型实现卡尔曼滤波和平滑的软件包…

github.com](https://github.com/rosshemsley/kalman)

对于 Python,可以看一下https://pykalman.github.io/

结论:我们深入了解了什么是状态估计,卡尔曼滤波器如何工作,它们背后的直觉是什么,如何以及何时使用它们。我们介绍了一个玩具(但现实生活中的)问题,并看到了如何用卡尔曼滤波器解决它。然后,我们更深入地了解了卡尔曼滤波器的实际功能。

干杯!

空手道俱乐部一个用于图形表示学习的 Python 库

原文:https://towardsdatascience.com/karate-club-a-python-library-for-graph-representation-learning-e70857112476?source=collection_archive---------25-----------------------

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

空手道俱乐部是一个无监督的机器学习扩展库,用于 NetworkX Python 包。

空手道俱乐部 由最先进的方法组成,对图形结构化数据进行无监督学习。参见此处的文档简单来说就是小规模图挖掘研究的瑞士军刀。首先,它提供了节点和图级别的网络嵌入技术。第二,它包括多种重叠和非重叠社区检测方法。实施的方法涵盖了广泛的网络科学 (NetSci,Complenet) 、数据挖掘 (ICDM,CIKM,KDD) 、人工智能 (AAAI,IJCAI) 和机器学习 (NeurIPS,ICML,ICLR) 会议、研讨会和著名期刊的文章。

一个简单的例子

空手道俱乐部让现代社区探测技术的使用变得相当容易(参见这里的附带教程)。下面的代码片段在合成图上使用了重叠社区检测算法

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

设计原则

当我们创建空手道俱乐部时,我们使用了面向 API 的机器学习系统设计观点,以便制作一个终端用户友好的机器学习工具。这种面向 API 的设计原则需要一些简单的想法。在本节中,我们将通过适当的示例详细讨论这些想法及其明显的优势。

封装的模型超参数和检查

通过使用适当的 Python 对象的构造器来创建无人监管的空手道俱乐部模型实例。这个构造函数有一个默认的超参数设置,允许合理的开箱即用模型使用。简单地说,这意味着最终用户不需要非常详细地理解内部模型机制就可以使用我们框架中实现的方法。我们设置这些默认的超参数来提供合理的学习和运行时性能。如果需要,这些模型超参数可以在模型创建时用构造函数的适当参数化来修改。超参数存储为公共属性,以允许检查模型设置。

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

我们通过上面的代码片段演示了超参数的封装。首先,我们想用标准的超参数设置为一个由 NetworkX 生成的鄂尔多斯-雷尼图创建一个嵌入。构建模型时,我们不改变这些默认超参数,我们可以打印尺寸超参数的标准设置。第二,我们决定设置不同数量的维度,因此我们创建了一个新模型,并且我们仍然可以公开访问维度超参数。

类的一致性和不扩散

空手道俱乐部中的每个无监督机器学习模型都是作为一个独立的类来实现的,它继承了 估计器类 。在我们的框架中实现的算法具有有限数量的公共方法,因为我们不假设终端用户对与特定技术相关的算法细节特别感兴趣。通过使用****fit()*方法来拟合所有模型,该方法采用输入(图形、节点特征)并调用适当的私有方法来学习嵌入或聚类。节点和图嵌入由get _ embedding()*公共方法返回,集群成员通过调用 get_memberships() 检索。

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

在上面的代码片段中,我们创建了一个随机图,以及带有默认超参数的模型,我们使用 publicfit()方法拟合这个模型,并通过调用 publicget _ embedding()方法返回嵌入。通过更改模型导入和构造函数,这个示例可以被修改为创建一个walk lets嵌入,只需很少的工作—这些修改导致了下面的代码片段。

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

看这两个片段, API 驱动设计 的优势是显而易见的,因为我们只需要做一些修改。首先,必须改变嵌入模型的导入。第二,我们需要改变模型结构,默认的超参数已经设置好了。第三,由 DeepWalkWalklets 类提供的公共方法行为方式相同。用 fit() 学习嵌入,并由 get_embedding()返回。 当用于特征提取的上游无监督模型表现不佳时,这允许对代码进行快速和最小的改变。

****标准化数据集摄取我们将空手道俱乐部设计为在模型拟合时使用标准化数据集摄取。实际上,这意味着具有相同目的的算法使用相同的数据类型进行模型训练。详细地说:

  1. 基于邻域和结构节点嵌入技术使用单个 网络 x 图 作为 fit 方法的输入。
  2. 属性节点嵌入过程以一个 NetworkX 图 作为输入,特征表示为一个 NumPy 数组 或一个 SciPy 稀疏矩阵 。在这些矩阵中,行对应于节点,列对应于特征。
  3. 图级嵌入方法和统计图指纹以 NetworkX 图 的 列表作为输入。
  4. 社区检测方法使用一个 NetworkX 图 作为输入。

高性能模型力学

图形挖掘算法的底层机制是使用广泛可用的 Python 库实现的,这些库不依赖于操作系统,并且不需要其他外部库的存在,如 TensorFlowPyTorch 的存在。空手道社内部的图形表示使用 NetworkX 。密集线性代数运算用 NumPy 完成,它们的稀疏对应使用 SciPy 。隐式矩阵分解技术利用 GenSim 包,依赖图形信号处理的方法使用 PyGSP。

标准化输出生成和接口

空手道俱乐部 的标准化输出生成确保了用于相同目的的无监督学习算法总是以一致的数据点排序返回相同类型的输出。这个设计原则有一个非常重要的结果。当某种类型的算法被相同类型的算法替换时,使用上游无监督模型的输出的下游代码不必改变。具体来说,使用我们的框架生成的输出使用以下数据结构:

  1. 节点嵌入算法 (邻域保持、属性化和结构化)调用*get _ embedding()*方法时,总是返回一个 NumPy 浮动数组 。数组中的行数是顶点数,行索引总是对应于顶点索引。此外,列数是嵌入维数。
  2. 全图嵌入方法 (谱指纹,隐式矩阵分解技术)返回一个 Numpy 浮动数组*get _ embedding()*方法被调用。行索引对应于单个图形在输入图形列表中的位置。同样,列表示嵌入维度。
  3. 社区检测程序 返回一个 字典*get _ memberships()方法被调用时。节点索引是关键字,对应于关键字的值是顶点的社区成员。某些图聚类技术创建节点嵌入,以便找到顶点聚类。当调用get _ embedding()*方法时,这些返回一个 NumPy 浮点数组 。该数组的结构类似于节点嵌入算法返回的数组。

我们通过下面的代码片段演示了标准化的输出生成和接口。我们创建随机图的聚类,并返回包含聚类成员的字典。使用外部社区库,我们可以计算这些集群的模块性。这表明标准化的输出生成使得与外部图形挖掘和机器学习库的接口变得容易。

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

限制

空手道俱乐部目前的设计有一定的局限性,我们对输入进行假设。我们假设 NetworkX 图是无向的,由单个 强连通分量 组成。所有算法都假设节点是用整数连续索引的,起始节点索引为 0。此外,我们假设图不是多部分的,节点是同质的,边是不加权的(每条边有一个单位权重)。**

在整个图形嵌入算法的情况下,图形集中的所有图形必须修改先前列出的关于输入的要求。基于 Weisfeiler-Lehman 特征的嵌入技术允许节点具有单个字符串特征,可以使用 特征 键访问该特征。如果没有这个关键字,这些算法默认使用度中心性作为节点特征。

人工智能时代的卡尔·马克思

原文:https://towardsdatascience.com/karl-marx-in-the-ai-age-a586b4cf4d30?source=collection_archive---------51-----------------------

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

Robynne Hu 在 Unsplash 上的照片

人工智能会验证卡尔·马克思吗?

如果一个自由社会不能帮助许多穷人,它就不能拯救少数富人。——约翰·肯尼迪

人工智能的短期影响取决于谁来控制它,而长期影响则取决于它是否能被控制。——斯蒂芬·霍金

人类即将迎来人类历史上最重大的发展之一。人工智能算法和机器人技术已经对人类努力的几乎每一个领域进行了革命性的变革。但是机器人和算法会取代我们所有的工作吗?

迄今为止,卡尔·马克思的预言被证明是错误的。在发达经济体中,共产主义革命尚未发生,无产阶级专政尚未建立,资本主义也没有崩溃。但是新技术的出现可能会在 21 世纪证明马克思是正确的。

马克思的预言

arx 的预言基于几个前提。第一个是永久失业阶层的形成,即“劳动力后备军”,这是由于资本家引入了节省劳动力的技术,在竞争的压力下,他们不得不通过削减工资或采用新技术来降低生产成本。工业后备军的存在对就业者的工资施加了向下的压力,从而降低了工人的生活质量。马克思认为,由于技术进步,永久失业阶层的规模随之扩大,苦难和剥削也随之增加。

马克思主义分析的第二个假设是市场集中度上升,因为较弱的公司被较强的公司取代。

对马克思来说,垄断和“技术失业”人数的增加导致了不平等和人民贫困化的快速增长,然后人民开始革命并推翻政府。(这是对马克思预言的粗略概述:我不会在这里关注理论本身的缺陷。)

因此,马克思预测的正确性取决于技术对就业市场的影响。这反过来又取决于人性的基本方面。

我们无法预测即将到来的变化的确切时间、速度和范围;然而,因为这些结果取决于人类,我们可以勾勒出潜在的最终结果:要么新技术将完全取代人类,要么一些工作将留给我们来完成。在后一种情况下,适当的措施可以防止重大的社会动荡,并帮助我们过渡到一种新的社会。在前一种情况下,人类将逐渐失去价值,超级智能算法的出现将标志着进化史的转折点。

几千年来,关于现实本质的问题,虽然在哲学上很重要,但在现实世界中几乎没有用处。但是现在我们人类的未来取决于答案。

现实的本质

如果宇宙是一元论的,计算机可以有意识并且有能力在就业市场上完全取代人类。拜伦·里斯在《第四时代》中指出,如果是二元论,一些工作将留给人类,因为我们与人工机器的性质不同。

一元论(也称为唯物主义物理主义)认为物质和精神、身体和精神之间没有区别:只有一种终极物质。一元论者认为,我们只是以各种方式相互作用的原子群。我们没有自由意志。换句话说,人类是机器:无生命物质和有生命物质之间没有区别,因为我们都是由原子组成的。一元论者否认灵魂的存在。DNA 的共同发现者弗朗西斯·克里克在他的评论中总结了一元论的观点,“你,你的快乐和悲伤,你的记忆和你的野心,你的个人认同感和自由意志,实际上只不过是神经细胞及其相关分子的巨大集合的行为。”

相比之下,二元论认为某种东西区分了人和无生命的物体,人和动物,物质和精神。我们是活的物体,而不是死的机器:我们不仅仅是一堆原子。在我们身上有一些至今无法理解和辨认的东西,我们可以称之为灵魂意识

二元论最著名的支持者之一是哲学家弗兰克·卡梅伦·杰克逊,他设计了玛丽的房间思想实验。玛丽是一位才华横溢的科学家,她知道关于颜色的一切,包括光子的性质,它如何触发大脑对世界的感知,哪些波长刺激视网膜的特定反应等。然而,她一生都呆在黑白房间里,从灰色屏幕上学习颜色。如果她走出房间,看到真实的世界,她会学到新的东西吗?如果是这样的话,经历一些事情和了解一些事情是不同的,在这个世界上有一些事情是科学无法解释的——这证明了这个世界是二元论的。

一元论的结果

斯蒂芬·霍金赞同一元论的观点,他认为,“生物大脑所能达到的和计算机所能达到的并没有很大的区别。因此,从理论上来说,计算机可以模仿人类的智力,甚至超越它。”

如果宇宙是一元论的,机器人和算法迟早会在就业市场上完全取代人类。因为,如果人类是没有灵魂或意识的机器,随着技术的进步,算法将逐渐超过我们,并执行目前由人类执行的所有任务:从在工厂工作和提供食物到创作艺术作品和写书。

正如尤瓦尔·赫拉利在 21 世纪的 21 个教训中所写的,“从长远来看,没有一个工作会绝对不受自动化的影响”,包括那些涉及情感的工作,比如艺术,因为“情感不是某种神秘的现象——它们是生化过程的结果”。

根据一元论的推理,技术已经超越了我们的身体能力,取代了许多简单的机械工作。现在它开始侵入认知能力的领域:例如,算法已经能够比人类更好地检测出癌症。因此,随着技术变革步伐的加快,越来越多的人将会失业。如果我们不采取行动,不可能的共产主义革命可能会成为现实。

在没有政府干预的情况下,不平等性无疑将大幅上升,绝大多数人口的生活水平将下降。由于人工智能行业的垄断趋势,行业竞争者也将减少(领先公司从用户那里获得更多数据,从而改进算法,使产品更好,吸引更多用户,等等)。).这符合马克思的预测,即新技术的引入导致永久失业阶层的形成和更高的不平等。

此外,预计人口将在未来几十年开始下降,从长远来看——比如说,几个世纪后——人类物种可能会灭绝,为由算法统治的世界秩序铺平道路。

二元论的结果

这是最悲观的情况。但是,如果我们假设宇宙是二元论的,那么算法将承担大部分工作,但需要复杂身体能力或社交技能的工作将留给我们。

在这种情况下,可能会有大量的失业人员,一支工业后备军,但只有一些工作会自动化,而不是像一元论范式中的所有工作。

二元论者声称,机器不具备同理心、创造力或批判性思维。二元论者也可能认识到,即使科学揭穿了灵魂、自由意志等的存在。,将人类置于与机器相同的水平,科学或人类思维使用传统的科学方法所能理解和研究的东西是有限的。

弗里德里希·尼采认为,“不可理解的……不一定是不聪明的”,因为可能存在“一个逻辑学家被放逐的智慧王国”我们人类无法从整体和复杂性上把握世界,这就是为什么我们求助于使用理论结构,其中最重要的是语言、数学、逻辑、理性和科学。这些都是认识现实的具体方法。

但是,会不会有一些理论结构无法捕捉的东西,一些将人类与宇宙中其他物体区分开来的东西?毕竟,我们首先是一个善于思考的物种;我们思考这些关于我们存在的基本问题的事实本身可能就是我们不是机器的证据。正如一个老笑话所说,如果我们只是一群原子,那么研究原子的科学家只是一堆原子在研究其他原子。但也许人类不仅仅是一群原子:也许有一些东西让我们与众不同——无论是创造力、灵魂还是意识——科学还无法掌握,而“一堆原子”由于其简单性也永远无法理解。但是,套用 E. M. Pugh 的话来说,如果我们大脑的设计简单到足以让我们理解它,那么我们的大脑就太简单了,无法破译我们的内部运作。因此,我们永远无法确定我们完全了解自己。

因为,正如纳西姆·塔勒布所言,“没有证据并不等于没有证据”:我们所能理解的是有限的,而且,如果我们用生物化学过程来解释生命,这并不一定意味着我们的存在完全由生物化学决定。如果我们不知道某件事,这并不一定意味着某件事(灵魂或意识)不存在。

自由市场能拯救我们吗?

T2:二元论并不像一元论那样描绘出一幅黯淡的未来图景。根据二元论观点,如果没有外部力量,我们将面临技术领域的失业,但不会有大规模的就业,让我们 99.99%的人缺乏资源。

在二元情景中,有两种可能性:自由市场的力量将抵消自动化的负面影响,只需要最少的政府干预(例如,对一些工人进行再教育或在他们转向新工作时提供临时社会福利);或者,实质性的政府干预(某种形式的普遍基本收入)将变得必要。

有理由认为,自由市场可以在政府干预最少的情况下消除技术革命的负面影响。

自动化不是零和游戏。即使我们失去了很多工作,由于我们的多才多艺和创造力,我们可以创造出无限的新工作。纵观历史,新技术不断被引入,并预计会导致大量失业,但从长远来看,就业率一直保持相当稳定。我们从来没有失业,因为人们总是想出新的事情来做。正如约翰·肯尼迪所说,“如果人们有能力发明新的机器让人们失业,他们就有能力让这些人重新工作。”

世界经济论坛的这项研究预测,到 2022 年,人工智能将创造约 1.33 亿个工作岗位,并消除约 7500 万个工作岗位,净增加 5800 万个工作岗位(该研究没有解决长期后果)。

我们是否会面临大规模失业还远未确定,因为通过降低消费者成本,新技术将让公民有能力在其他商品和服务上花更多的钱,从而推高总需求并鼓励生产者扩大生产从而创造更多就业。

新技术的效应将更加平均地传播,每个人都将有机会相对容易地向社会阶梯的顶端移动。

拜伦·里斯(Byron Reese)认为,我们不会面临令人担忧的高技能劳动力缺乏和大量低技能失业工人的局面。比方说,如果对人工智能工程师的需求上升,但收银员被机器人取代,我们就不必将收银员重新培训为人工智能工程师。相反,大学教授可以成为人工智能工程师;博士候选人可以填补教授的工作;博士生的工作可以由高中教师来完成;中学或小学教师可以从事中学教师的工作,等等。最后,我们的收银员,经过一番努力,可以在小学教编程,让机器人去执行单调、枯燥、不人道的收银员工作。由于科技的发展,每个人都可以提升社会地位,并看到收入的增加。这是看不见的手在起作用。

此外,由于莫拉维克悖论,新技术不会只影响蓝领工人。

莫拉维克原理指出,出于进化的原因,机器人革命的步伐将比人工智能革命的步伐慢,因为我们很难复制机器人经过数十万年进化磨练的能力,如感觉运动技能,而我们最近开发的能力,如抽象和数学推理,更容易重现。这就是为什么算法已经击败了国际象棋冠军,并比人类更好地检测癌症,而机器人仍然无法在人类的水平上踢足球。正如李开复在《人工智能的超能力》中所说,“人工智能擅长思考,但机器人不擅长移动手指。”正如汉斯·莫拉维克写道:“让计算机在智力测试或玩跳棋时表现出成人水平的表现相对容易,但在感知和移动方面,让它们拥有一岁儿童的技能却很难或不可能。”

蓝领工作需要体力劳动,这使得机器人很难取代他们,而许多低技能的白领工人(职员、办公室辅助人员、股票经纪人等。)已经被算法取代了。因此,至少在机器人革命获得动力之前,我们不应该期望不相关的阶层(如果它形成的话)仅仅由低工资工人组成。

麦肯锡的研究证实了莫拉维克悖论。据麦肯锡称,到 2030 年,对“办公室支持”工作(金融和 IT 工作者、行政助理)的需求将下降 20%,而对“不可预测的体力工作”(机械安装、维修和农业田间工作)的需求预计将增长 6%。

由于机器人革命将比人工智能革命慢,工人阶级将而不是受到人们可能预期的严重打击。关键的挑战将不是工作稀缺,而是需要对人们进行再培训和再教育。

然而,自由市场是否能够独自抵消自动化的负面影响,这是有争议的。技术迟早会在大多数技能上超过我们,取代大多数工作。自由市场可能会在短期内帮助我们,但从长期来看,工作岗位将会越来越少,政府需要采取行动来抵消负面影响。

让我粗略总结两种潜在的未来情景:

一元论:所有工作都将自动化。要么(a)算法将创造一个新的后人类世界秩序,要么(b)人类将利用人工智能和生物技术来升级自己,在算法统治的时代生存下来。

二元论:绝大多数工作将会自动化,但有些会留给我们。要么(a)需要政府采取重大行动,要么(b)由于自由市场,政府干预将是有限的,甚至是不必要的。

自由市场资本主义及其敌人

道德马克思主义者可能会援引新技术的出现以及由此导致的大规模技术失业,作为将生产手段集中在国家手中的理由。例如,Y. Varoufakis 建议我们必须“撕毁生产资料私有制的旧观念,并强制进行变革,这必须包括机器、土地和资源的社会所有权。”

但是,即使我们面临大规模失业,对生活在贫困线以下的人征收负所得税或全民基本收入也没有理由不能解决这个问题。新技术将如此富有成效,以至于即使是适度的累进税也能为那些受到新技术负面影响的人提供资助。生产手段的国有化对于解决技术带来的问题并不重要。

马克思的预言不会在二十一世纪实现。卡尔·马克思相信“政治的无能”和政府无力改变体制。但是,在十九世纪和二十世纪,发达国家政府采纳了社会主义计划的精华部分,从而使共产主义变得无关紧要(比如,德国总理奥托·冯·俾斯麦向西方引入了政府资助的社会计划体系)。

这场革命并非不可避免,只要我们解决这个体系的缺陷。即使马克思的预测在我们今天最接近实现,但由于人工智能行业的垄断趋势和由此产生的技术失业,如果我们采取正确的步骤,马克思的“历史命运的必然规律”将不会实现,就像过去一样。

与此同时,威权主义者认为,在经济规划中实施人工智能将消除对自由市场的需求。他们说,供求力量在决定产品的内在价值方面非常强大,但通过分析有关经济、人们的需求和偏好的数据,算法可以用来模拟价格机制。弗里德里希·哈耶克(Friedrich Hayek)认为,由于关于世界的知识分散在许多参与者中,无法获得这些知识的中央计划者将在商品和服务的定价和分配上做出错误的决策。但是多亏了人工智能 T2,中央计划者能够获得和使用这样的信息。正如阿里巴巴创始人马云所说,“大数据将使市场变得更加智能,并使计划和预测市场力量成为可能,从而使我们最终实现计划经济。”

然而,问题是,尽管人工智能驱动的中央计划和对公民的极权控制可能擅长决定消费者的欲望,从而决定产品的真实价格,但它仍然缺乏资本主义制度的创新,正如本文指出的那样。因为消费者如何告知人工智能规划师他们对尚不存在的产品的渴望?正如史蒂夫·乔布斯的名言,“消费者不知道他们想要什么,直到我们向他们展示。”

打破过去的模式并在旧知识的基础上创造全新的东西是不可能的:进步的产生要归功于那些敢于挑战传统智慧的人打破旧习惯。如果人工智能驱动的中央规划者将他们的经济决策建立在过去的数据基础上,那么由此产生的经济将不会是创新的:创新大多(尽管不总是)来自独立的发明家——像托马斯·爱迪生、詹姆斯·瓦特、莱特兄弟、亚历山大·贝尔、比尔·盖茨、史蒂夫·乔布斯、埃隆·马斯克和马克·扎克伯格——而不是来自政府资助的项目。

集中计划还会消除许多市场参与者之间的竞争所带来的优势。国家对经济的控制通常会导致经济停滞和缺乏创新。自由推动创造力和非传统思维,鼓励伟大的头脑追求未知,拓展我们理解的边界。自由市场并不完美,在某些情况下,应该由有限的政府干预来补充——但是,即使在人工智能时代,它们仍将是继续我们技术进步的最佳方式。我们不应该成为专制辩护者的牺牲品,他们声称算法会让自由市场过时。

寻找意义

任何工作都是如此没有人性和危险,以至于出于人道的原因,我们应该愿意把它们交给机器人和算法。正如比尔·盖茨所说,“技术正在释放我们对人类同胞与生俱来的同情心。”技术将帮助我们发现我们是谁,并使我们能够从事真正适合人类的活动,从而促进我们发现自己的真实本性。在 AI 接管大多数任务并授权我们追求让我们真正成为人类的东西之后,我们最终将不再纠结于不断优化和满足我们的物质需求。

对卡尔·马克思来说,社会的最终状态可以用“各尽所能,按需分配”的原则来定义新技术可以提供我们所有的个人需求,同时让我们从事我们选择的努力。

马克思认为,在社会发展的某个阶段,当新技术的生产力足以满足每个人的需求时,共产主义是可能的。我们不应该否认人工智能和机器人技术可以提供这种技术的可能性。然而,尽管看起来很矛盾,但马克思在某种意义上是一个自由意志主义者,因为他厌恶国家,并将一个无国家的社会想象为我们的最终目的地,拥有足够的资源最终让人类获得马克思所认为的真正自由——摆脱物质必要性和国家庇护和压迫的自由,以及自由从事非物质追求的能力。

为未来做准备

如果人工智能和机器人开始对我们现有的社会体系构成根本性挑战,我们不应该反对有限和合理的国家干预。采取教条式的自由放任态度既是妄想,也是危险的。正如 Friedrich Hayek 在通往奴役之路中所写的,“自由主义者的论点是支持尽可能充分地利用竞争的力量,作为协调人类努力的一种手段,而不是作为让事情保持原样的论点。”

在自由民主国家,政治制度的存在是为了确保弱者和少数人受到保护,免受多数人的暴政统治。无限制的自由违背了它自己的目的,因为对一个人如何行使自己的自由缺乏限制常常导致侵犯他人的权利。

因此,在经济学中,就像在政治中一样,绝对不受限制和约束的自由放任政策是不可取的。正如国家对社会和政治自由的行使加以限制,以确保自由不会弄巧成拙,为了确保公平和捍卫正义,国家应调控经济,并对人民的经济自由加以某些限制,以维护其他人的权利和自由,因为“如果一个自由社会不能帮助许多穷人,它就不能拯救少数富人。”因此,经济干预主义不是限制,而是保护人民的自由。

人工智能时代将带来历史上最全面的发展,我们不应屈服于开放社会敌人的思想的常年吸引力。人工智能时代将给我们的文明带来相当大的压力,但我们不应该屈服于压力,而是应该永远记住,正如丹尼尔·德德尼和 g .约翰·伊肯伯里所说的那样,“对自由民主问题的补救措施是更自由的民主,自由主义包含着自我救赎的种子。”认识到自己的易错性,愿意与他人进行理性的对话以试图更接近真相,将真相置于意见之上,通过承认所有群体利益的两党共识来解决社会弊病——这些都是捍卫我们社会的工具。

我们创造了这个世界:我们不能将我们的责任外包给历史命运的法则。即使存在这样的规律,它们也是我们自己思考的产物:如果我们想证明错误,证明马克思的悲观预测再次错误,我们就必须准备采取必要的措施。

历史不会朝着一个特定的方向前进,但是人们会并且能够改变自己的进程。正如卡尔·波普尔所说,“虽然历史没有终点,但我们可以把我们的终点强加给它;虽然历史没有意义,但我们可以赋予它意义。”

原载于 Areo 杂志

保持 Jupyter 笔记本运行,即使浏览器关闭

原文:https://towardsdatascience.com/keep-jupyter-notebook-running-even-after-browser-is-closed-9a1937b7c615?source=collection_archive---------5-----------------------

保持 Jupyter 笔记本运行的方法及其缺点

连续几天打开浏览器标签来运行 Jupyter 笔记本文件并不是最令人兴奋的工作。可能会很麻烦。以下是我找到的一些解决问题的方法。每种解决方案都有其优点和缺点,所以不再多说,让我们开始探索每一种解决方案吧!

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

安德鲁·尼尔Unsplash 上拍照

使用 Google Colab

协作实验室,或简称为“Colab”,允许我们在没有配置和计算资源(如 GPU / TPU)的情况下运行 Python 代码。使用它,我们甚至可以通过在 CLI 命令前添加前缀%来运行一些 bash 命令。这种方法的好处是它是免费的,允许从 Drive 或 Github 导入文件/数据集。它与 Google Drive 很好地集成在一起,我们可以编写代码来自动从 Drive 加载一些数据集,并将网络/结果保存到 Drive。

然而,它有几个缺点。首先,它有有限的计算使用量。一旦达到限制,它将停止运行代码,不久之后,文件/变量值将丢失。然而,极限并不是限制性的。我发现这对于在一些数据集上训练神经网络来说已经足够好了,比如叶子分类数据集。此外,如果您需要更大的计算使用/资源,可以连接到一个本地运行时

另一个缺点是你不能关闭浏览器标签太长时间,也就是超过 90 分钟。根据我的经验,这可以通过连接到一个本地运行时来延长。

最后,当选项卡关闭时,它可能会丢失写入的日志。当您需要将所有日志都写入 Jupyter 笔记本文件时,这可能是一个问题。处理这种情况的一些方法是将输出记录到另一个文件中,或者使用特定的记录器。

将其作为 python 脚本运行

有多种方法可以将 Jupyter 笔记本文件作为 python 脚本运行。

1。将其转换成 python 文件

最简单的方式是在浏览器中打开 Jupyter 笔记本文件,点击文件>下载为> Python(。py)。之后,我们可以像运行典型的 python 文件一样运行输出文件:

python file_name.py

但是,记录在 Jupyter 笔记本上的文件会丢失。

2。直接使用命令提示符运行

另一种方法是直接使用 CLI 运行 jupyter 笔记本。它将允许我们在整个执行过程中将所有日志记录打印在 jupyter 笔记本文件中。为此,有两种程序可供选择, runipynbconvert 。要安装 runipy 或 nbconvert,我们可以使用 pip/conda

# Using pip
pip install ipython
# Using conda
conda install ipython

如果我们使用 runipy 并安装了它,要运行 jupyter 笔记本,我们可以键入:

runipy MyNotebookFileName.ipynb

要将每个单元格的输出保存回笔记本文件,请运行:

runipy MyNotebookFileName.ipynb

如果我们使用并安装了 nbconvert,要运行 jupyter 笔记本,我们可以键入:

jupyter nbconvert --to notebook --execute mynotebook.ipynb

对于 runipynbconvert ,在这两个站点中还可以找到其他几个配置选项,如超时、报告生成和输出文件生成。

为了保持这个命令在远程服务器上运行,即使我们与远程服务器断开连接,我们可以配置 screentmux ,并在其中任何一个中运行 Jupyter 的命令。

然而,我发现这种方法的一个缺点是缺少向用户显示的日志记录。因此,即使脚本会错误地停止执行,也很难跟踪代码的进度。当我使用这种方法时,我利用 nvidia-smihtop bash 命令来尝试猜测程序的当前状态。

使用远程桌面到服务器

这是迄今为止我最喜欢的方法。TLDR,它处理了以前方法的所有缺点。它允许我看到代码的进度以及每个单元的输出。即使当我断开连接时,脚本也保持运行。

1。在服务器上配置远程桌面

如果服务器已经配置了远程桌面,您可以跳过此步骤。这一步可能是所有步骤中最棘手的一步,尤其是当服务器的操作系统版本过时时。

a.通过 SSH 连接到服务器

b.安装一些软件包

sudo apt update
sudo apt install -y ubuntu-desktop xrdp

PS:如果你在服务器上没有 sudo 权限,或者,你可以使用wget从 Github 安装这个包,然后从源代码编译它。如果下载的xrdp版本有一些错误或者与操作系统不兼容,你可能也需要这样做来降级xrdp的版本。

c.在服务器上编辑 RDP 配置文件/etc/xrdp/xrdp.ini。最低配置可能如下所示:

[globals]
bitmap_cache=yes
bitmap_compression=yes
port=3389
crypt_level=low
channel_code=1
max_bpp=24

[xrdp1]
name=sesman-Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=ask-1

请注意所写的端口,这对于建立连接非常重要。此外,如果您的服务器是 EC2 实例,我们需要适当地编辑安全组,以允许端口3389中的入站 TCP 连接。

d.重新启动 xrdp

sudo service xrdp restart

e.为 RDP 连接安装窗口管理器。这包括更改用户的.xsession文件的内容。

sudo apt install -y xfce4 xfce4-goodies
echo xfce4-session >~/.xsession

**您已经准备好连接了!**💃🏽💃🏽

2。在您的计算机中设置远程桌面客户端

这一步将允许您的计算机连接到服务器。根据您电脑的操作系统,操作方法会有所不同。

对于 Linux,安装 vinagre 并打开。输入服务器的 IP 地址、用户名和 RDP 端口。然后,单击连接。

对于 Windows 或其他系统,可以使用远程桌面查看器完成上述步骤。

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

我的 Kali Linux 计算机上的远程桌面查看器

对于 Mac,我使用的是微软远程桌面。正确填写表格,然后单击添加。

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

Mac 版微软远程桌面。

之后,系统会提示您输入凭据。让港口保持原样。

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

xrdp 登录表单

一旦你通过认证,你应该会看到你的桌面。

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

远程桌面!

3。在服务器的浏览器中运行 jupyter 笔记本

这可以通过在终端中键入jupyter notebook来完成,这将打开一个浏览器。然后,在浏览器中导航到相应的 jupyter 笔记本文件并将其打开。

单击工具栏上的单元格>全部运行。

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

然后关闭远程桌面客户端应用程序。切记不要关闭浏览器!😉😉

全部完成!现在,您可以让浏览器在远程桌面上运行,并随时断开连接。您也可以通过重新连接来检查程序的进度。

保持数据科学项目的正常运行

原文:https://towardsdatascience.com/keep-the-clock-running-on-your-data-science-project-dac26f8f0f69?source=collection_archive---------59-----------------------

办公时间

速赢如何为突破赢得时间

你的数据科学项目时间不多了,你还没有取得突破。预测建模充满了不确定性,但企业不理解这一点,或者更糟的是,不在乎。你需要传递一些东西,而且要快。你有什么选择?

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

凯文·KuUnsplash 上拍摄的照片

他们称之为数据科学是有道理的

数据科学工作是实验性的。很多在规划阶段看起来可行的项目,最终都会失败。也许输入数据的预测性不如预期。或者目标变量不一致且定义不当。或者你不能得到你想要的数据。项目可能会因为超出您控制的原因而失败,因为没有人会预料到数据问题。

但是其他项目失败是因为你在取得改变游戏规则的突破之前没有时间了。

如何不去追逐突破

你担心如果你的模型不够好,它将永远不会出现。这使得用复杂模型追逐突破变得很有诱惑力。

最近就中了这个圈套。我的团队试图根据一系列记录和损失信息来预测保险索赔何时结束。尝试使用简单的文本表示以及最新的损失信息快照未能产生可接受的模型。所以我尝试用伯特向量来特征化文本,并通过一个递归神经网络来传递损失信息的完整时间序列。这是一个死胡同。我对此并不后悔,但它耗费了一个多月的开发时间。

增值

交付增值是敏捷软件开发的核心原则。现在,我已经听到了无数反对在数据科学团队中使用敏捷的观点。我将把我的反驳留到下一天,但是增量价值的这个方面是解决我们的小突破-最后期限困境的关键。

我将分享一些你可以交付给企业的速赢,这些速赢可以为你赢得宝贵的时间,直到实现突破。

快速成功案例

部署基准模型

你的模型的第一个版本不需要完美。一个天真的或者基准模型通常比什么都没有对用户更有价值。下面是一些可能有用的基准模型的例子。

  • 均值或中值模型—对于回归任务,一个始终预测均值或中值的简单模型可能比没有要好。你甚至可以通过预测组内的平均值来加强它。
  • 过去等于未来—对于预测任务,考虑发布一个简单的模型,预测过去将完全等于未来。这个基准很难被超越。
  • 最受欢迎—对于推荐任务,很难比预测所有用户最受欢迎的商品更好的了。先考虑出货这个基准。
  • 发挥创造力——您能为您的任务想出一个可能部分解决客户问题的基准模型吗?

当然,如果您决定发布一个基准模型,设定对业务的期望是很重要的。验证模型的第一个版本中的低客户信任不会有长期的影响也很重要。

解决一个子问题

你最终要解决的问题可能层次很高或者范围很广。在这种情况下,逐步解决和交付问题的组成部分是可能的。

让我们回到前面提到的保险索赔问题。预测索赔何时结束实际上范围很广。有许多不同类型的索赔和许多不同的原因,每种索赔都会比预期的时间长。例如,有律师参与的索赔肯定会比没有律师参与的索赔耗时更长。因此,如果我们可以将问题的范围限制在预测律师参与的风险,建模工作将变得更加容易处理,并且仍然为客户提供价值。

做一些工程

在一天结束时,你必须展示你和你的团队正在为客户创造价值。如果上面的快速胜利对你来说不是一个选项,考虑通过贡献代码或任何类型的数据到产品中来展示你是一个多么有团队精神的人。即使在最好的时期,数据科学和软件或数据工程之间的界限也可能是模糊的。如果你认为这能给你带来足够的善意和空间,让你最终取得突破,那就好好利用这一点。

这可能意味着挑选一些与部署模型或创建数据管道相关的票证。或者这可能意味着对自己的业务逻辑的更大承诺,每个人都知道这应该属于工程,但他们没有时间来构建(我在两家不同的公司看到过这种情况,所以我假设这是常见的)。

明智地追求突破

现在,您已经为产品带来了一些立竿见影的效果,并为自己赢得了几个月的时间。去追求突破,明智地使用你辛苦挣来的时间。

通过数据测试保持数据整洁

原文:https://towardsdatascience.com/keep-your-data-clean-with-data-testing-b84b4f789fa1?source=collection_archive---------34-----------------------

对您的数据进行测试,并满怀期望地提高您的管道质量

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

Unsplash科学高清拍摄的照片

在软件工程中,用特定于语言的框架编写测试是减少错误和提高代码质量的最佳实践。然而,在数据科学和数据工程的世界中,您正在构建的管道和模型的质量不仅仅取决于编写的代码,它主要取决于您正在使用的数据。在本文中,我们将看到如何为我们的输入数据编写测试,以避免不愉快的意外。因此,我们可以保证我们的机器学习模型或建立在这些数据上的 ETL 管道的正确行为。

在本文中,我们将关注 Python 代码,并使用 great-expectations 包进行测试。我们将专注于 Pandas 数据帧,但是 PySpark 和其他工具的测试也受到了 great-expectations 的支持。

测试示例数据集

对于这个例子,我决定使用来自约翰·霍普金斯大学系统科学与工程中心(CSSE)的新冠肺炎数据

为什么是这个数据集?我使用这个数据集是因为它由几个批次组成。有一个。自 Covid 19 开始以来每天的 csv 文件。数据的质量和信息量随着时间而变化。因此,我们可以在特定日期可用的数据子集上构建我们的测试。随后,我们可以将这些测试应用于新的、看不见的数据,并确保数据内容符合预期。

首先,让我们创建一个所有文件的列表,这些文件是我们希望稍后在管道中加载和使用的:

我们将首先只检查最旧的文件和最新的文件,而不是立即加载所有文件。因此,我们可以看到列的外观,并评估数据质量。

这个仅仅关于列名的概述已经表明随着时间的推移发生了巨大的变化。添加了几个额外的列,并更改了一些列的命名。这意味着我们不能加载所有。csv 文件并连接它们,无需任何额外的预处理步骤。

基于获得的信息,我们可以编写第一个测试来检查我们以后使用的所有列是否都出现在每个文件中:

这里,我们首先用 great_expectations dataset 对象包装了最新数据文件的 DataFrame 对象。这仍然像一个熊猫数据帧,但带来了一些额外的功能。然后,我们用 expect_column_to_exist() 方法创建了第一个测试,称为期望。我们将这种方法应用于 DataFrame 列的定义列表,以确保这些列确实存在。在本例中,我们创建了 5 个期望(5 个不同列的一种期望)。最后,我们创建了一个 expect-config 对象来描述所创建的测试。这个对象可以作为 JSON 文件保存和加载。

到目前为止,我们只创建了这些测试,并将它们保存在一个配置文件中。现在,让我们对我们的两个数据文件应用这些测试,看看它们是否成功:

ge.read_csv() 方法是对应的 Pandas 方法的包装器,并提供了定义期望套件的机会,该套件是我们的配置对象,应该用于数据验证。我们可以用 validate() 应用已定义的测试,并用 success() 检查它们是否成功。结果显示,对最后一个数据文件的测试成功,但对第一个文件的测试失败。这个输出和预期的一样,第一个文件的测试失败了,它有一个不同的列命名。我们可以使用以下命令查看更多详细信息:

在这里,我们迭代每个单独的期望,并检查它是否成功。如果没有,我们将附加信息打印到控制台。输出告诉我们,数据集中没有必要的列“Country_Region”、“Last_Update”和“Active”。我们可以通过简单的列重命名来解决前两个问题。如果缺少“活动”列,则必须进行计算。

必要的数据清理和数据验证可以总结为一个功能:

这个函数做必要的数据准备,如果其中一个定义的测试失败了,就会引发一个错误。否则,它返回有效的 DataFrame 对象。

现在,在成功地检查了基础知识之后,我们可以考虑对各个列进行一些更高级的测试。例如,我们可以检查“确认”、“死亡”和“恢复”列。我们知道这些列都应该是整数类型并且是正数。此外,如果没有有效的“Country_Region”或“Last_Update”条目,则整个数据行将毫无价值。所以我们也应该测试这个。

因为我们已经对最新的数据文件应用了这些测试,所以我们立即发现“Active”列有问题,它包含负值。我们应该在额外的预处理步骤中处理这些情况。

额外的数据清理似乎足以在所有定义的测试中获得成功。现在,我们可以加载所有文件并开始使用它们,而不用担心输入数据中的任何意外行为。

最终注释

Great-expectations 是一个强大的工具,可以帮助您检查数据源的一致性并保证数据质量。有许多预定义的期望,您可以轻松定义自己的期望。本例中显示的内容只是演示基础知识。Great-expectations 提供了很多更有趣、更强大的特性,比如 Data Docs,它可以为您的验证结果创建漂亮的 HTML 结果。查看教程和文档以了解更多信息:

[## 远大的期望

永远要知道从你的数据中能得到什么。远大前程通过数据帮助数据团队消除管道债务…

github.com](https://github.com/great-expectations/great_expectations)

似乎有几种方法可以生成和应用具有很高期望的测试。因为这些技术对我来说也很新,请告诉我,是否有比上面代码中应用的方法更高级的方法。

感谢阅读!

请保持距离

原文:https://towardsdatascience.com/keep-your-distance-please-a-case-for-social-distancing-in-troubling-times-ff979f8e91a8?source=collection_archive---------40-----------------------

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

来自 PexelsAnna Shvets 的照片

乱世中保持社交距离的一个例子

免责声明:这篇文章无意引起恐慌。无论是流行病学还是数学建模,我都不是专家。下面采用的方法充满了已知的和潜在的假设。这意味着推动社会距离和自我隔离。这是一篇观点文章,而不是公共政策的建议。

2019 年 11 月:在中国湖北省一个经常被遗忘的城市武汉,人们在潮湿的市场上做着一天的生意,对即将在世界上爆发的浩劫知之甚少。

快进到 2020 年 3 月。

新的一年来了又去,随之而来的是来自中国的关于一种新病原体的第一个故事,这种病原体是世界前所未见的:新冠肺炎。

席卷中国大陆,现在已经遍布全球,几乎就像取自反乌托邦小说。

当它到达我居住的国家印度的海岸时,我不禁感到有点害怕和担心。来自受影响国家的故事是可怕的、沉闷的和绝望的。就在昨天(2020 年 3 月 20 日),意大利经历了最糟糕的一天,一天之内就有近 700 人死于这种可恶的病毒。

我必须承认,我没有把这种威胁当回事,就像我这个年龄段的许多人一样。在午餐时,在走廊的谈话中,以及在 Whatsapp 上,我们经常听到下面的观点。

“哦,如果它感染了很多人,那又怎么样……只有 2%的人死亡。这比中东呼吸综合征或 H1N1 甚至普通流感都要低得多。我们为什么要担心这个?”

事后看来,争论中通常被忽视的是受害者的年龄严重混淆了这一点。

统计理论告诉你要小心数字。请谨慎使用这些数字。对数字要有耐心。

总是需要哄着数字给出见解。

年龄越大,死亡率越高。且在 65 岁以上显著增高。

新冠肺炎是婴儿潮一代杀手。

就像 20 多岁的普通印度人一样,我童年的大部分夏天都是在祖父母家度过的,我对那些夏天有很多珍贵的记忆。很长一段时间,因为他们的持续存在,我确信他们是不可战胜的。他们会一直在那里。现在,我第一次害怕了。

我非常害怕。

以至于在过去的一周左右,我一直在温习流行病学理论。从梅在 1982 年的论文中引入了基本的再生数 Rₒ,到迪克曼、奥多、汉斯·黑斯特比克和汤姆·布里顿最近的工作,他们形式化了 Rₒ.的定义和性质

这篇文章着眼于采用一种疾病模型,让我们深入了解社会距离和隔离是如何有所帮助的。

确实如此,相当明显。

模拟新冠肺炎:疾病不可能(或者是?)

由于这个系统的数学本质,下面的部分可能会很枯燥。我会尽我所能,尽量保持内容简洁。然而,并不是所有的数学都可以被过滤,所以请原谅我。

在这一部分中,我们将尝试为德国共享的数据拟合模型。同样的分析可以在其他国家进行,只要数据是公开的,不用担心抽样偏差和代表性偏差。

在这个关键时刻,重申以下事实是至关重要的,即这一分析和研究结果绝不是对现实的准确描述,仅仅因为各种假设在现实生活中变得无效。

最终,这一分析应该会促使读者呆在家里。为做出这样的决定感到骄傲和满意。

在模拟新冠肺炎时,我们不是在模拟个人可能性。我们没有足够的公开数据。我们正在尝试的是在传染病的行为下建立人口模型。

虽然有各种各样的模型( R: earlyR,EpiEstim ),但我们将实现的模型是其中最简单的。模型越复杂,内部工作的假设就越多;在当前疫情肆虐、威胁生命的情况下,我不会做出任何我不完全理解的假设。

我们采用的模型称为 SIR 模型。1927 年在《皇家统计杂志》上首次讨论,它是一个动态模型,将人口/军政府分成三大组:

  • 易感:任何没有被感染但可能被感染的人都被认为是易感者
  • 受感染:任何感染并传播疾病的个人都被认为是受感染的
  • 移除:任何因康复、隔离或死亡而不在感染或易感类别的个人被视为移除

这个模型的一个关键假设是感染保证了未来的免疫力。所以像流感这样的疾病不能用 SIR 框架来建模,而水痘和麻疹可以。截至目前,新冠肺炎还没有表现出任何康复病人复发的行为。

此外,我们不做任何假设人口的生命。这些是出生率,以及由新冠肺炎病毒以外的原因导致的死亡率。

从一个群体到另一个群体的运动受一组微分方程支配。

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

SIR 模型下的状态运动

这些方程很重要,因为它们求解的参数。

β、γ是该模型中最重要的两个元素。

  • β控制着接触率,即每个感染者每天被感染的平均接触次数
  • γ控制每天的清除率或恢复/死亡/隔离人员的比例

在最近的公共政策术语中,

  • β是控制你的社交距离的参数(β越低,联系越少)
  • γ控制你的自我隔离策略(γ越高,传染期越短)
  • 总的来说,rₒ=(β/γ)∞每个原发病例对应的继发病例数

如果在这篇文章的结尾有什么是你应该记住的,那就是这个。

降低你的贝塔系数,增加伽玛系数。句号。

解了这些方程,你就能理解疾病是如何发展的。

现在,我可以听到你说“够了,理论…真正的模特在哪里?

我们提取了德国的数据,因为他们的数据似乎是维护得最好的(由罗伯特·科赫研究所),通过运行一个简单的 python 脚本,从他们的维基百科页面提取数据。其他被考虑的国家有意大利和美国。

注:印度的数据不完整,人们担心该国的测试是否充分。西班牙某些天的数据不完整。

抛弃时间序列索引,我们采用从第一天开始的天数表示法。让我们绘制数据。

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

使用 Python 的**scipy** 模块,我们求解常微分方程,得到β和γ的估计值。

def SIR(y, t, N, beta, gamma):
    S, I, R = y
    dSdt = -beta * S * I / N
    dIdt = beta * S * I / N - gamma * I
    dRdt = gamma * I
    return dSdt, dIdt, dRdt

def loss(parameters, data, method='l2'):
    size = len(data)
    beta, gamma = parameters
    init_conditions = S_0, I_0, R_0
    t = np.arange(0, size)
    ret = odeint(SIR, init_conditions, t, args=(N, beta, gamma))
    S, I, R = ret.T
    if method == 'l2':
        return np.sqrt(np.mean((I - data) ** 2))
    elif method == 'l1':
        return np.mean(abs(I - data))
    elif method == 'RSS':
        return np.sum((I - data) ** 2)

# optimization using the L-BFGS bounded optimizer
optimal = minimize(
    loss,
    [0.5, 0.5],
    args=(df.total_confirmed_cases.values, 'l2'),
    method='L-BFGS-B',
    bounds=[(0, 1), (0, 1)]
)

在对未来 50 天(总计 80 天)做出预测后,让我们评估模型的拟合度。

我们得到的 RMSE 为 625, **MAPE(平均百分比误差)**为 23%。

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

考虑到模型拟合不算太差,我们能看出什么?

  • Rₒ = 1.9 ≈ 2
  • β = 0.65
  • γ = 0.35

这与世卫组织估计的 2 比 2.5 略有出入。
德国监测传染病的联邦公共卫生组织罗伯特·科赫研究所(Robert Koch Institute)估计,新冠肺炎的基本生殖数在 2.4 到 3.3 之间。

常规疾病研究认为,如果 Rₒ > 1,那么这种疾病应该被认为是一种流行病。()

那现在怎么办?

如何控制 Rₒ?

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

照片来自像素吴的生活

如果你还记得上一节提到的,有两种方法可以减少 Rₒ:

  • β必须减少。这更容易分析和模拟。
  • γ必须增加。这更难做到,因为你在和疾病的传染期玩游戏。

但在探讨为什么我们必须降低 Rₒ之前,让我们先画一条大家都很熟悉的曲线。

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

是的,臭名昭著的珠穆朗玛峰从现在常见的“平坦曲线”的讨论。

让我们评估一下,如果我们采取一种简单的策略来疏远自己,会发生什么。比方说,今天在德国进行了一些社交距离干预,在接下来的 n 天中,联系率降低了 50%,之后,更谨慎地降低了 20%。换句话说

  • β = βₒ if t < 21st March, 2020
  • β = 0.5βₒ if t ≥ 21st March, 2020 and t < n days from 21st March
  • β = 0.8βₒ if t ≥ n days from 21st March

Now, we can change n 对于各种配置如:7 天,14 天。

当我运行这个模拟时,模型的行为方式让我大吃一惊。

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

曲线变平了!

如今,这些干预措施中争论最激烈的部分之一是时机。在上述模拟中,我们从当天(即 2020 年 3 月 21 日)开始将联系率降低 50%。在图上,这是第 26 天。

如果这发生在疫情高峰期,比如说第 40 天,接近 2%的人口被感染,会发生什么?

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

瞧啊。

2%可能看起来不多,但这是针对整个德国人口的。可怜的 2%相当于 160 万人。

因此,在新冠肺炎问题上,早期干预是有益的。

从上面的可视化中可以注意到一点,随着干预的进行和感染人数的下降,易感人数仍然很大。这意味着一旦干预结束,就要更加谨慎。正如上面模拟的那样,β值的轻微下降也会导致感染的显著增加。

这是一个相当简单的策略,只取决于时间。
如果可以获得不同年龄的数据,可以形成针对年龄组和人口统计细分的策略,并以模拟的形式进行测试。

摘要

总而言之,

  1. 社交距离是好的,但是越早越好。
  2. 隔离自己是好的,但是越早隔离越好。
  3. 以上两项在当前至少 14 天内都是必须的,以减轻医疗保健系统的压力。

在局势得到控制之前,不值得冒险与人交往。

最后一点,重要的是要指出这个分析纯粹是说明性的。当然,我们使用了实际数据,并使模型与之相适应。但是疾病建模有如此多的细微差别,我没有这方面的专业知识。此外,鉴于此次疫情,考虑到检测的频率,人们对数据的质量提出了质疑。

这些是影响样本的偏差因素,我们必须认识到这一点。

本文中使用的简单 SIR 模型有许多局限性。然而,在我们现在谈论的大规模爆发中,这种简化似乎是可以接受的。

此外,它假设个体之间是同质混合的,这太简单了。例如,我们可以将人口按照他们的位置分成不同的年龄组,并对他们之间的相互作用进行建模。这可能会更真实地反映人口是如何形成的。

同样,为了使曲线变平的效果可视化,我认为一个简单的模型是可以的。

从这里得到的启示并不是模型已经预测了一切,我们都在劫难逃。没有一个模型是正确的。

相反,关注社交距离有多重要。关注自我隔离能有什么帮助。拉平曲线。

呆在家里,注意安全。

文献和参考资料:

  1. 迪克曼、奥多、汉斯·黑斯特比克和汤姆·布里顿。2013.理解传染病动力学的数学工具。普林斯顿大学出版社。
  2. W. O .科马克和 A. G .麦肯德里克。1927."对流行病数学理论的贡献."英国皇家学会学报,A 辑 115:700–721。

编者按: 走向数据科学 是一份以数据科学和机器学习研究为主的中型刊物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值