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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

为什么我们必须谈论第一类错误和第二类错误?

原文:https://towardsdatascience.com/programming-journal-4-why-do-we-have-to-talk-about-type-1-error-and-type-2-error-41b3ae68bb96?source=collection_archive---------54-----------------------

艰难的教训,真正的秘诀

从模型评估到商业决策…

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

Unsplash 上由 nousnou 岩崎拍摄的照片

你听说过 1 型错误和 2 型错误吗?还是假阳性,真阴性等?当我们研究假设检验时,通常会引入这些概念。这是推断统计学中的一个基本概念。然而,每个人都应该理解这一点,因为当我们想要评估使用哪个模型来进行更好的业务决策时,这也是至关重要的。我想告诉你为什么。

因为解释这个直截了当的概念有点枯燥,所以我将在这里使用一个类比来添加一些果汁,这样你就永远不会忘记这个概念🤓

想想你的男朋友/女朋友/想象中的伴侣。在一段关系中,我们知道有不同类型的谎言。其中一种是善意的谎言,意思是你问了一些信息,但是你的伴侣告诉了你一些不真实的事情,因为他/她想让你感觉更好。另一种谎言是隐藏信息。你询问一条信息,但你的伴侣只是否认。

对于这个类比,你可以把算法想象成测谎仪。与另一种类型的谎言相比,一些算法更擅长检测一种类型的谎言。我们需要知道这种算法擅长检测哪种类型的谎言。为什么?因为不同类型的谎言或者同一类型的谎言,在不同的情境下,会有不同的代价。

比如,对于善意的谎言来说,“我爱你做的菜”的谎言和“我爱你”的谎言不知道的代价是完全不同的(当然对于骗子来说,两个谎言被识破的后果也是很不一样的)。所以在第二种情况下,你会想要使用能够最好地检测善意谎言的算法!因为这个谎言会让你付出很大代价。

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

来源:makeameme.org

隐藏信息也一样。你的伴侣隐瞒了他/她吃了一个培根芝士汉堡的事实,而你们两个承诺一起节食,这和隐瞒他/她看到另一个人也就是欺骗你的事实有着不同的代价。因此,为了检测这一点,你需要选择一种对这类谎言特别敏感的算法。

现在你已经理解了不同类型的谎言以及它们的重要性。我们把技术术语带回来,连起来。

在一个模型中,我们有预测值(我们的模型给我们的值)和实际值(或观察值,我们从现实中观察到的值)。衡量我们的模型有多好的最直接的方法是看他们对实际值的正确次数。当实际值为时,我们希望我们的预测说,当它为时,我们希望我们的预测说因此,有两种类型的准确答案,模型也有两种出错的方式。

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

来源: mrzepczynski ,经由 blogspot.com

对于假阳性、真阴性等术语,如果你觉得它们难以记忆,可以这样想:如果这是一个错误的预测,那么这个术语将以“假”开头,如果它是正确的预测,则以“真”开头。

联系到我们在关系中撒谎的类比,我想把“假阴性”理解为否认事实,因为它是否认,把“假阳性”理解为善意的谎言,因为这个人主动给了我一条新的信息。

现在我们知道了技术术语。让我们来谈谈为什么我们需要在商业环境中谈论它们。

原因是一样的,因为在不同的情况下,与每种错误相关的成本是不同的。

例如,上周,我谈到了如何使用逻辑回归来预测哪些客户更有可能沿着漏斗向下移动,以便您可以集中精力锁定最有可能的客户。我们的逻辑回归有 98%的准确率,我们有 1000 个潜在客户。因此,200 个客户会有错误的分类,换句话说,我们的模型“欺骗”了我们。

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

比方说,我们有一些营销材料要邮寄给我们的潜在客户,我们只发送给那些我们希望重点锁定的客户,因为每份材料的制作成本为 100 美元。因此,如果所有的 200 名客户从未对我们感兴趣,但我们的模型告诉我们他们会感兴趣(假阳性:说谎让我们感觉更好),我们将材料邮寄给他们,那么公司的成本将是 20,000 美元。另一方面,如果所有 200 个错误分类的客户都是假阴性(对我们隐藏信息),换句话说,我们没有对那些本来会对我们感兴趣的客户采取任何行动,财务成本将是 0 美元。

尽管如此,尽管其中一个成本更高,但这并不一定能让一个比另一个更好。我试图反复强调这种情况的重要性,因为成本不仅仅是数字上的,我们还有机会成本和其他隐性成本。例如,如果你是一家 B2B 公司,与 B2C 公司相比,你的考虑应该是不同的,因为每笔交易的规模可能不同,所以损失 20,000 美元意味着不同的东西;或者对你的公司来说,首先很难让客户感兴趣,或者你通常每年只有 50 个客户,或者每个漏斗的成功率不同,等等。等。

如果你用谷歌搜索 1 型和 2 型错误,许多材料使用癌症检测来证明为什么知道类型会有所不同。该示例的重点是显示与不同类型相关的不同成本。明确地说,治疗一个健康病人的成本与不知道某人患有癌症的成本。在这里,我想强调在不同的情况下,即使是同一类型的错误也会产生不同的影响。

这里的要点是,记住同一类型的谎言在不同的情况下会有非常不同的代价。做生意也是一样。同一类型的错误对于不同类型的企业来说,成本是不同的,更不用说不同类型的错误了。

所以下一次,当你的数据团队向你展示一个模型和准确性时,问问他们,这个模型对哪种类型的错误更敏感?然后,在选择模型之前,了解与您的业务问题相关的成本!

我这边每周更新一次:

我选择这个主题来写这个星期,因为我花了大部分时间在模型评估、选择和特征工程上。我意识到,数据工程师的职位需要对业务和公司试图解决的业务问题有非常透彻的理解。我也开始怀疑在工作场所,许多公司将数据收集员(其他部门)、数据工程师和数据科学家的职位分开,这种设置有多容易引发问题。

我还在做上周帖子中提到的客户流失率项目。我希望在下面的帖子中,我可以完成这个项目,并以它作为一个真实的例子来演示两个模型如何具有相同的准确性,但由于不同类型的误差,对业务产生非常不同的影响。

在非技术方面。我申请了一些工作。我意识到我焦虑和缺乏信心的原因是由于缺乏这方面的经验,这直接影响了我的工作效率。

例如,我不确定我现在拥有的技术技能是否足以胜任数据分析师或数据工程师的工作;与其他候选人相比,我有竞争力吗?我可以花更多的时间准备、自学、做项目,直接开始做数据科学家吗?所有知识的缺乏让我不安,因为我觉得我没有足够的针对性。

所以,我决定向人们伸出援手,找到答案,而不是坐在那里,用我的想象力让自己冷静下来。我总结了我最关心的三个问题,并对它们的优先级进行了排序。我也愿意参加一般性的谈话,这样我可以更好地了解整个领域的生态系统,并对我的职业发展道路有一个想法。你可以看下面的截图。

我给每个问题都涂了颜色,这样在我列出我打算联系的人的其他页面上,我可以在他们的名字旁边加上不同的颜色。因此,对我来说,识别缺少哪种颜色是很容易的。

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

我最初是通过我学校的校友网络在 LinkedIn 上找人的。然而,因为我的学校是一所商学院,符合我条件的人非常有限。猜猜我做了什么?我开始通过 向数据科学 筛选人哈哈。

我的结论是,在 TDS 上写作的人更有可能是喜欢分享的人,这将给我一个更好的机会去结识那些非常规进入这个领域的人。我已经确认了下周的两个电话!

我真的很感激有陌生人帮助我。我等不及有一天我会成为帮助别人的人了!

向梅致以最美好的祝愿!希望这个月一切都会变好:)

参考:

  • 教务长,福斯特,1964-和汤姆。Fawcett,*【关于数据挖掘和数据分析思维,你需要知道什么】。*加利福尼亚州塞瓦斯托波尔:2013 年,奥赖利。

量子信息编程

原文:https://towardsdatascience.com/programming-quantum-information-8f251ec6770?source=collection_archive---------46-----------------------

奇点研究

使用 Python 和 Qiskit 的熵

在本文中,我们要来看看如何使用 Python 和 IBM 的免费开源量子计算软件 Qiskit 来理解量子系统中的信息的概念。我们将看看熵的经典版本,以展示它与量子熵或冯诺依曼熵的关系。我们会提供代码,最后会有一些免费的交互式 Jupyter 笔记本的链接,你可以在你的浏览器中运行,以更好地理解概念。

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

量子电路

概率分布

在信息研究中,我们首先遇到的概念之一是概率分布。有限概率分布是一个函数,

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

概率分布

从某个有限集𝑋到区间[0,1]。𝑥2,…,𝑥𝑛} 𝑋={𝑥1 的有限集通常被认为是可能发生的事件的集合,值𝑓(𝑥𝑖)∈[0,1]是𝑥𝑖事件发生的相关概率。函数𝑓必须满足以下条件

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

概率之和必须为 1

所以所有的概率总和为 1。举个例子,如果我们有一枚硬币可以抛,我们可以把事件集合定为𝑋={ℎ,𝑡} (" 正面"或"反面"),概率是𝑓(ℎ)=1/2 和𝑓(𝑡)=1/2.显然𝑓(ℎ)+𝑓(𝑡)=1,所以函数𝑓:𝑋→[0,1]是集合𝑋.上的概率分布如果我们有一个六面骰子,我们可以把事件集合看作是𝑌={1,2,3,4,5,6},概率是

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

六面骰子的概率

函数𝑔:𝑌→[0,1]也是一个概率分布(在事件集𝑌).上现在,我们可以有联合概率分布,它是由像(𝑓×𝑔):𝑋×𝑌→[0,1].)这样的函数描述的在这种情况下,我们可以写出概率表

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

联合概率分布

在这种情况下,𝑋X 组的结果与𝑌Y.组的结果在本质上是独立的。掷硬币对掷骰子没有影响,掷骰子对掷硬币也没有影响。然而情况并非总是如此。有时我们有相互依赖的联合概率。在这种情况下,我们有条件概率,其中𝑦∈𝑌事件发生的概率取决于𝑥∈𝑋.事件

香农熵

在教科书中,可能发生的𝑋X 事件集通常被称为随机变量**。香农熵给出了我们通过学习随机变量的值平均获得多少信息的精确定义。𝑋的定义了在得知结果值之前,我们对𝑋的不确定性。因此,假设我们有一些有限的事件集(或随机变量)𝑋={𝑥1,…,𝑥𝑛},相关的概率分布𝑓:𝑋→[0,1]取值{𝑓(𝑥1),…,𝑓(𝑥𝑛)}.香农熵定义为**

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

香农熵

这里,对数以 2 为底。每个概率都是一个 0≤𝑓(𝑥𝑖)≤1.值让我们来看看抛硬币的例子。在这种情况下,香农熵就是

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

抛硬币的香农熵

现在,让我们看看六面骰子的情况。这种情况下的香农熵为

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

六面模具的香农熵

为了计算这一点(以及其他),让我们用 Python 导入一些东西。首先,运行以下命令导入必要的库。

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

Python 导入

我们可以很容易地在 Python 中得到-log(1/6)的十进制近似值,如下所示。

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

Python 中的计算日志(1/6)

作为另一个例子,让我们以随机变量𝑋为例,它可以取值{𝑥1,𝑥2,𝑥3,𝑥4}.设相关的概率分布为

{𝑓(𝑥1)=1/8, 𝑓(𝑥2)=1/4, 𝑓(𝑥3)=1/8, 𝑓(𝑥4)=1/2}.让我们用 Python 来定义这些概率。

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

用 Python 定义概率

现在,让我们计算香农熵。

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

X 的香农熵

冯·诺依曼熵

香农熵测量与经典概率分布相关的不确定性。我们在之前的笔记本中讨论过密度算子。回想一下,密度算符是一种描述量子系统可能状态的方式,或者等效地说,是一种描述可能测量结果的方式,与概率分布非常相似。量子态ρ(其中ρ是密度矩阵)的冯诺依曼熵定义为

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

冯·诺依曼熵

这里的对数现在是一个矩阵对数,也取为底数 2。如果我们让{𝜆𝑘}是矩阵ρ的特征值的全集,那么我们也可以将冯诺依曼熵定义为

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

冯·诺依曼熵

使用scipy.linalg.logm()可以在 Python 中计算矩阵对数。我们已经从 SciPy 导入了linalg作为la。让我们看一个例子。拿着矩阵

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

密度矩阵

在 Python 中,我们可以使用下面的代码来定义密度矩阵,

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

Python 中的密度矩阵

为了得到合适的基数 2,我们需要使用一个转换,

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

对数的底数变化

所以,我们真正需要的是,

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

矩阵对数

我们可以使用这个矩阵的迹来计算冯·诺依曼熵,如下所示,

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

冯·诺依曼熵

正如所料,这是一个 1×1 矩阵,即标量值。让我们为密度矩阵定义一个计算冯·诺依曼熵的函数。

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

Python 中的冯诺依曼熵函数

现在,让我们在矩阵rho上测试这个函数。

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

测试功能

状态演化

在量子物理学中,状态很少保持不变。在量子计算的电路和门模型中,状态根据酉矩阵运算演化,状态向量的演化相当于线性代数。在其他模型中,我们可以使用哈密顿量来模拟状态的演化。有两种重要的状态叫做混合态和纯态。纯状态总是可以表示为状态向量与其自身的“外积”。混合状态通常表示为正交状态向量的和。在纯态的情况下,冯·诺依曼熵总是零。在混合态的情况下,熵可以是整个范围的值。让我们看一个例子,一个系统从纯态演化到混合态,然后又回到纯态。我们将看到冯·诺依曼熵逐渐增大,然后减小回到零。首先,我们来定义自旋向上和自旋向下的状态向量,以及外积给出的纯态。

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

定义纯态

我们可以使用下面的代码来绘制进化图,

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

情节演变

我们得到的图表如下,

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

我们可以将其与经典的香农熵进行比较

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

香农熵

看到它们实际上是一样的。

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

香农熵图

使用 Qiskit

在 Qiskit 中,我们可以对下面的量子电路进行编程,

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

GHZ 状态

接下来,我们可以使用 Qiskti 的Statevector()函数来打印状态向量。这将有助于使用 Qiskit 中的函数entropy()计算相应密度矩阵的冯诺依曼熵。

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

状态向量

接下来,我们使用 Qiskit 的DensityMatrix()函数,将上面定义的GHZ_state ket-vector 传递给它。

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

Qiskit 中的密度矩阵

现在我们可以使用 Qiskit entropy()函数来计算熵。我们可以通过StatevectorDensityMatrix。在第二种情况下,我们得到有效的零熵,在第一种情况下,我们得到精确的零熵。这是有意义的,因为态是纯态,密度矩阵是按𝐷=|𝜓⟩⟨𝜓|.计算的

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

齐斯基特中的冯·诺依曼熵

最后,让我们使用 Qiskit 函数random_density_matrix()生成一个随机密度矩阵𝜌ρ。该函数的第一个参数是所需密度矩阵的维数,它不必是 2 的幂。然而,在具有量子位的量子电路的情况下,我们手动做出这种限制是很重要的。当然还有更一般的系统,包括像“ qudits 这样的东西,它们可能产生任意维的密度矩阵。

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

随机密度矩阵

我们可以使用 Qiskit entropy()函数来计算熵。

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

冯·诺依曼熵

让我们画出从 GHZ 态的密度矩阵𝐷给出的态演化到密度矩阵ρ描述的系统的熵。

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

绘图熵

我们得到的情节是,

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

如果你想了解更多,可以考虑支持 Github 。有超过 20 个免费的,关于量子计算和量子机器学习的交互式笔记本,你可以在你的浏览器中运行。有关熵的笔记本请点击链接。如果你想为这个项目做贡献,或者如果你需要在你正在做的事情中加入量子计算方面的咨询,请联系

thesingularity.research@gmail.com

一定要包括“黑客宇宙”这个主题,这样邮件才不会丢失。

使用 tqdm 的 Python 的进度条

原文:https://towardsdatascience.com/progress-bars-for-python-with-tqdm-4dba0d4cb4c?source=collection_archive---------9-----------------------

使用智能进度条跟踪 Python 迭代的执行

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

Unsplash 上由zdenk macha ek拍摄的照片

在我开始从事 Python 中的机器学习项目后不久,我遇到了需要很长时间才能运行的计算密集型任务。通常这与某种可重复的过程有关。我立即想到的两个例子是:( 1)在 p、d 和 q 订单上运行网格搜索,以在大型数据集上拟合 ARIMA 模型,以及(2)在训练机器学习算法时网格搜索超参数。在这两种情况下,您可能会花费数小时(或更长时间!)等待您的代码运行完毕。我迫切需要某种指标来显示这些任务的进展,于是我找到了 tqdm

什么是 tqdm?

tqdm 是一个 Python 库,允许你通过环绕任何 iterable 来输出一个智能进度条。一个 tqdm 进度条不仅显示了已经过去的时间,还显示了可迭代的估计剩余时间。

安装和导入 tqdm

由于 tqdm 是 Python 包索引( PyPI )的一部分,因此可以使用 pip install tqdm 命令进行安装。

我倾向于经常在 IPython/Jupyter 笔记本上工作,而 tqdm 为此提供了出色的支持。要开始在笔记本上玩 tqdm ,您可以导入以下内容:

例子

为了清楚起见,我不会在这篇文章中进行计算密集型的网格搜索——相反,我将使用几个简单的例子来演示 tqdm 的用法。

For-loop 进度

假设我们想在跟踪结果的同时模拟投掷一枚硬币 100,000,000 次,我们还想看看这些迭代在 Python 中运行需要多长时间。我们可以围绕 iterable(范围(100000000))包装 tqdm 函数,这将在 for 循环运行时生成一个进度条。我们也可以使用 desc 关键字参数给进度条指定一个名称。

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

产生的 tqdm 进度条为我们提供信息,包括任务完成百分比、完成的迭代次数、经过的时间、估计的剩余时间以及每秒完成的迭代次数。

在这种情况下, tqdm 允许通过使用 trange(100000000) 代替 **tqdm(范围(10000000))**进行进一步优化。

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

嵌套 for 循环进度

如果您遇到需要嵌套 for 循环的情况, tqdm 允许您在多个层次上跟踪这些循环的进度。例如,让我们以抛硬币为例,但这次我们想玩三个独立的 10,000,000 次抛硬币的“游戏”,同时跟踪结果。我们可以为“整体进度”创建一个 tqdm 进度条,以及三个游戏中每一个的进度条。

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

熊猫集成

tqdm 的一个稍微不同的实现涉及到与 熊猫 的集成。 tqdm 可以为提供额外的功能。应用()方法的一个熊猫数据帧。熊猫。必须首先使用下面的代码向 tqdm 注册 progress_apply() 方法。然后,是**。使用 progress_apply()** 方法代替传统的**。apply()** 方法——不同之处在于,我们现在在方法的输出中包含了一个智能进度条。

Processing Dataframe: 100%|██████████| 1000/1000 [00:02<00:00, 336.21it/s]

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

其他 tqdm 集成

除了与 IPython/Jupyterpandastqdm 提供与 Keras 和实验模块的集成,用于 itertools并发不协调电报这篇文章仅仅触及了 tqdm 功能的表面,所以请务必查看文档以了解更多关于如何在 Python 代码中包含智能进度条的信息!

参考

[## tqdm/tqdm

tqdm 源自阿拉伯语 taqaddum (تقدّم),意思是“进步”,是“我如此爱你”的缩写

github.com](https://github.com/tqdm/tqdm/tree/f4b172f7ec7598d75df094eb713c5be5370033bc#ports-to-other-languages) [## tqdm 文档

tqdm 在阿拉伯语(塔卡杜姆,تقدّم)中是“进步”的意思,在西班牙语中是“我非常爱你”的缩写(特…

tqdm.github.io](https://tqdm.github.io/)

渐进神经网络:解释与实现

原文:https://towardsdatascience.com/progressive-neural-networks-explained-implemented-6f07366d714d?source=collection_archive---------25-----------------------

学习使用 PyTorch 和 Doric 库创建渐进式神经网络。

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

目录

• [Introduction & Background](#b575)
    ∘ [Transfer Learning](#2f8f)
    ∘ [Progressive Neural Networks](#0d70)
• [Doric](#a6bc)
• [Simple Example](#a1b0)
• [Complex Example](#9e99)
    ∘ [Autoencoders & VAEs](#4b35)
    ∘ [Experimental Design](#50ba)
    ∘ [Results](#4088)
    ∘ [Analysis](#81c7)
• [Conclusion](#b78d)
• [Acknowledgments](#5f5d)
• [Links & References](#8e8d)

简介&背景

学习新的东西需要你建立在你已经知道的基础上。就像一把简单的锤子可以被用来将金属塑造成更加动态和复杂的工具一样,先前的知识可以成为形成想法和创造新知识的基础。研究只不过是这种想法一遍又一遍地应用于自身。

迁移学习是指将在一项任务中学到的知识应用到另一项相关任务中。许多神经网络转移学习技术已经被成功地使用。然而,网络的拓扑通常是固定的,旧任务中使用的参数很可能被破坏性地覆盖。这些不需要的品质由渐进式神经网络解决,这种网络可以扩展其拓扑结构——用它来传输重要的知识——同时保留原始参数供以后使用。

本文将讨论迁移学习、灾难性遗忘和渐进式神经网络。在这本书中,我们将学习使用 Doric 库和 PyTorch 来创建程序网;以及遍历它背后的代码,并检查它如何实现渐进式神经网络论文中讨论的功能。最后,我们将使用 Doric 运行两个 prognet 实验,并分析它们的结果,以更好地理解使用渐进式神经网络进行迁移学习的好处和缺点。

转移学习

国际象棋是一种有趣而复杂的游戏,像许多伟大的游戏一样,它的复杂性可能需要花一生的时间来掌握——然而它的基本机制可以在一个下午就被教授和理解。每个象棋新手最终都会遇到类似下图的情况,他们会很快学会白棋的最佳走法:移动骑士同时攻击黑棋的两个车。

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

通过同时威胁两个目标,白棋迫使一个有利的交易。

这种策略被称为“叉”,将黑方置于两败俱伤的境地,他们必须用自己的一辆车交换白方的骑士。熟练的棋手将会知道迫使对手下叉是非常有利的。

国际象棋并不是唯一出现这种简单战术的游戏。Connect-4 是一种游戏,其中两名玩家将瓷砖扔进一个 6×7 的直立网格中,目标是在对手之前完成 4 个瓷砖。下图是一个 connect-4 板。红色有机会以这样一种方式连接三个瓷砖,蓝色只能阻止一边的运行,让红色在下一轮获胜。

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

Connect-4 战略在很大程度上基于这一策略。

国际象棋和 Connect-4 是非常不同的游戏,但它们都包括从两个方向同时进攻的相同策略,迫使敌人陷入无赢的局面。事实上,叉子战术可以在许多游戏中找到。通过学习叉子的概念,并通过不同游戏的机制应用该概念,我们能够跨不同领域传递知识。学象棋可以教我们一些关于 Connect-4 的知识。

亲爱的读者,这就是迁移学习的本质。

迁移学习是将从一项任务中获得的知识应用到另一项独立但相关的任务中的过程。近年来,迁移学习在语言和图像处理领域得到了广泛的应用。在自然语言处理中,预训练的嵌入模型如埃尔莫伯特GPT-2 已经成功地学习了英语的基本结构,从而可以应用于许多任务。在这种情况下,模型通常被冻结,优化只在连接到嵌入器头部的任务模型上执行。虽然这种方法对于语言任务来说是理想的,但它依赖于遵循语言结构的一致输入。在图像处理中,完全训练卷积神经网络来完成复杂的任务已经变得罕见。相反,通才预训练网络,如 ResNet-50GoogLeNetVGG-19 会根据新数据进行再训练。这个过程被称为微调。虽然微调是使网络适应新数据的有效方法,但它也不是没有缺点。

灾难性遗忘是一种有害事件,在微调过程中可能发生在经过训练的神经网络中。当网络中的重要参数被更改以适应新数据时,就会发生这种情况,从而损害网络处理旧数据的能力。理想情况下,网络可以通过在很少使用的参数中编码新信息,或者通过改变重要参数以推广到其他任务而不是完全切换到其他任务,来保持其在先前任务中的能力。使用标准的基于梯度的学习方法,这通常是不可能的。已经提出了许多对抗灾难性遗忘的方法,但这里讨论的算法不止于此:它完全消除了灾难性遗忘,同时仍然允许有效的一般迁移学习。

渐进神经网络

渐进神经网络(prognets)是 Deepmind 在他们的论文 渐进神经网络 (鲁苏等人,2016)中开发的一种神经算法。程序网是一种简单、强大和创造性的迁移学习的解决方案——引用论文摘要,它们“不会遗忘,并且可以通过与先前学习的特征的横向连接来利用先前的知识”。

程序网开始存在时只有一个单列的神经网络,它将在一个初始任务上被训练。每列由 L 个块组成,每个块包括一层神经元 W ,一组用于每个父列的侧神经元 U ,以及一个激活函数 f 。由于初始列没有传入的横向连接,它将与标准神经网络的行为相同。这第一列学习任务 1,然后它的参数被冻结。对于任务 2,将生成一个新列,并添加横向连接。这些横向连接将所有先前列中的先前块的输出作为输入。然后将侧层添加到主层上,最后进行活化。

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

k 的块 I 的方程。

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

第一列(k = 0)。

下面是一个 prognet 的插图,在 progressive neural nets 论文中发现了 K = 3 个任务和 L = 3 个块。请注意,任何给定的块都是其自身参数、其自身列中的前一个块的输出以及所有先前列中的前一个块的输出的函数。

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

渐进式神经网络

理解程序网的另一种方式是把每个程序块看作一个计算的黑盒,它需要决定哪些信息源对完成它的任务最有效。例如,在上图中, output₃ 可以访问先前的隐藏层 h₂ 。但是,它还可以访问每个父列的 h₂ 层,并可以使用其横向参数在本地微调它们的输出。如果 output₃ 模块发现 h₂ 拥有它需要的所有信息,它可以“清零”其他输入。如果它发现 h₂h₂ 各自提供了所需的部分信息,它可以忽略 h₂ ,充当 h₂h₂ 的函数。通过建立这些横向连接,我们允许网络轻松地在任务之间传递信息,同时也允许它忽略不重要的信息。

作者在一组强化学习环境中测试了他们的算法,包括 pong 变体、迷宫变体和 Atari 游戏。他们对各种基线模型进行了测试,发现程序网优于每种基线。在发表之后,其他几篇论文已经展示了跨不同领域的程序网的成功使用;例如, 渐进式神经网络用于情感识别中的迁移学习 (Gideon et al .,2017)发现,在给定一组积木式任务的情况下,渐进式神经网络可用于情感检测。类似地, 用渐进网络 (鲁苏等人,2018)从像素学习的模拟到真实机器人表明,渐进神经网络可以用于在不完美的机器人模拟和真实硬件之间进行转换。

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

用机械手将 Sim 传送到机器人。

虽然上述渐进式神经网络出版物在各种强化学习任务上测试其算法时产生了令人信服的结果,但程序网并不是迁移学习的灵丹妙药。主要是它们是参数浪费的:每个侧化的块需要一个完整的侧层用于它从中提取的每个父列。目前形式的程序网也仅限于对每个记录都有相应任务标签的数据起作用。为了允许冻结,每个任务必须按顺序学习,而顺序会极大地影响最终网络的质量。这通常只是一个较小的限制,但仍然是一个限制。此外,由于冻结,如果任务改变,程序就不灵活。因此,这意味着色谱柱应该在冻结前非常熟练地完成任务。

总之,渐进式神经网络不受灾难遗忘的影响,因为它们冻结了每个完成的列,但它们也允许通过与新列的横向连接进行有效的迁移学习。他们牺牲了增加的模型复杂性(即,在每个额外的列中训练更多的参数)和改变任务的灵活性来实现这一点。许多先前的出版物和实验支持这种算法作为有效的迁移学习平台的可信度。

多利安

Doric 是我开发的工具,用于实现和扩展渐进式神经网络。这是一个建立在 PyTorch 之上的免费开源库。在本文的剩余部分,我们将遍历 Doric 背后的代码,用它运行一个简单的实验来分析正在训练的 prognet,最后,在一组困难的图像处理任务上测试 Doric。

注意:这里显示的 Doric 版本是简化的。完整版带示例代码这里

首先,我们的库需要块的定义。每个块必须包含一个激活函数,一个充当块的主层的模块,以及一个实现 U 参数的横向层列表。Doric 使用下面的抽象类。

通过扩展这个类和实现未实现的方法,用户可以很容易地为任何可以想象的用途创建他们自己的程序块。再补充几个简单的。

现在我们有了简单密集层、批量标准化密集层和 2D 卷积层的模块。注意,在我们的对象中,任何包含 PyTorch 模块的列表都被实现为 nn.ModuleLists,这是因为它允许 PyTorch 正确地注册这些子模块。另外值得注意的是,因为 ProgBlocks 是 nn 的一个子类。模块,它们可以像任何其他 PyTorch 模块一样运行。但是,我们没有在它们上面实现 forward 方法,所以我们仍然需要调用 runActivation 和 runBlock。

tensor([
[0.0000, 0.0000, 1.8789, 0.0000, 0.0000],
[0.0138, 0.0000, 2.9942, 0.0000, 0.0000],
[1.5449, 0.0000, 2.8891, 0.0000, 0.0000]], 
grad_fn=<ReluBackward0>)

现在我们有了一个 block 对象,我们需要将它们组织成列网络。每次指定新任务时,都需要添加这些列网。然而,由于我们有一个很好的可扩展的块结构,我们不需要依赖用户来实现单独的列——至少不直接。

最后,我们需要整个渐进式神经网络。该对象将包含一个列网列表,并将运行每个必要的列,以产生给定任务的结果。

有几件重要的事情需要注意。首先,在 addColumn 中,Doric 允许用户直接传递列网,或者用户可以通过扩展 ProgColumnGenerator 类来创建列生成器。

这允许用户在 generateColumn 方法中定义每个列的体系结构,这样 prognet 就可以添加列,而无需传递列。msg 参数还允许用户通过 addColumn 方法传递信息来生成 Column。

第二件特别重要的事是向前的方法。这实际上是渐进神经网络算法的核心。prognet 按顺序运行每一列,直到到达与给定任务相关联的列。这允许后面的列访问每个分支的输入。

就其本身而言,这足以为任何简单的顺序体系结构创建渐进式网络,但当我们需要更复杂的体系结构时,它就会崩溃。举个例子,这张 Q 函数评论家网络图是我在另一个项目中作为 DDPG 代理的一部分而写的:

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

为这样的网络设计渐进式系统的最简单方法是允许使用多通道模块。这些砌块还必须允许某些非横向通道上的直通通道。

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

除此之外,我们还需要解决 Doric 的一个特性:惰性和 lambda 块。惰性块是可以被侧化的块——不在初始列中,也不在第一行中——但是故意不被侧化。这些允许我们在我们的网络中包括特殊的操作,或者减少那些没有从迁移学习中受益的块中不必要的参数。

要实现这两个更改,我们只需要定义它们,并对我们的列网络类做一些小的更改。

仅此而已。截至本文发表时,这是 Doric 的(简化的)核心功能。使用这些工具,我们可以将大多数神经网络架构实现为一个 prognet。

简单的例子

对于第一个 Doric 示例,我们将创建一个双任务 prognet。具体来说,我们将教会我们的列模拟 xor 和 nand 函数。回想一下,xor 和 nand 的真值表如下。

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

在这个简单的实验中,我们的第一篇专栏文章将解决 xor 任务,第二篇将利用第一篇文章解决 nand 问题。要明确的是,这不是一套需要迁移学习的任务。具有这种结构的单柱网络可以毫不费力地解决任一任务。这个实验的价值在于,它将允许我们深入分析这些网络,并观察横向连接如何传递知识。这是我们将在实验中使用的代码。

运行该程序后,我们会收到这些结果。

Testing Xor.
Input: [0, 0].  Target: 0\.  Predicted: 0\.  Error: 0.
Input: [0, 1].  Target: 1\.  Predicted: 1\.  Error: 0.
Input: [1, 0].  Target: 1\.  Predicted: 1\.  Error: 0.
Input: [1, 1].  Target: 0\.  Predicted: 0\.  Error: 0.Testing Nand.
Input: [0, 0].  Target: 1\.  Predicted: 1\.  Error: 0.
Input: [0, 1].  Target: 1\.  Predicted: 1\.  Error: 0.
Input: [1, 0].  Target: 1\.  Predicted: 1\.  Error: 0.
Input: [1, 1].  Target: 0\.  Predicted: 0\.  Error: 0. Xor and Nand params:
columns.0.blocks.0.module.weight
Parameter containing:
tensor([[-3.2474,  3.2474],
        [-2.0008,  2.0429],
        [-0.5795,  0.0801]])
columns.0.blocks.0.module.bias
Parameter containing:
tensor([-1.7442e-05,  2.0007e+00, -3.0051e-01])
columns.0.blocks.1.module.weight
Parameter containing:
tensor([[ 4.5644, -3.4079,  0.1078]])
columns.0.blocks.1.module.bias
Parameter containing:
tensor([3.0512])
columns.1.blocks.0.module.weight
Parameter containing:
tensor([[-0.2739, -0.1766],
        [ 0.5853,  2.8434],
        [-0.6689,  0.3338]], requires_grad=True)
columns.1.blocks.0.module.bias
Parameter containing:
tensor([-0.3227, -0.5853, -0.3339], requires_grad=True)
columns.1.blocks.1.module.weight
Parameter containing:
tensor([[-0.1367, -2.9894, -0.4210]], requires_grad=True)
columns.1.blocks.1.module.bias
Parameter containing:
tensor([1.9972], requires_grad=True)
columns.1.blocks.1.laterals.0.weight
Parameter containing:
tensor([[1.9479, 0.2868, 0.1236]], requires_grad=True)
columns.1.blocks.1.laterals.0.bias
Parameter containing:
tensor([1.8058], requires_grad=True)

这些日志显示网络学习了 xor 和 nand 功能,但是如果我们想知道它是如何完成的,我们需要更仔细地观察。让我们从 xor 列开始。在一个图形结构上绘制出所有的参数后,我们可以构建下图。

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

注意事项:

  • 最右边的神经元将总是输出 0。这意味着学习这个函数是不必要的。
  • 如果 X1 和 X2 相同,它们将抵消,并且偏移参数将确定隐藏层的输出。结果是 sigmoid(-3.6),或~0.02。
  • 如果 X1 是 1,X2 是 0,隐藏层输出[0,0,0]。结果是 sigmoid(3.2),或~0.96。
  • 如果 X1 是 0,X2 是 1,隐藏层输出[3.2,4,0]。结果是~0.98。

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

所有这些都是值得了解的,但也不足为奇。让我们看看当我们添加 nand 列时会发生什么。

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

现在,我们列举所有的输入组合。

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

X = [0,0]

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

X = [0,1]

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

X = [1,0]

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

X = [1,1]

需要注意的事项:

  • 这一次,两个隐藏层神经元被置零。这是因为 nand 比 xor 容易得多(nand 是线性可分的)。
  • 隐藏层中仍然活跃的神经元将输出 0、2.8 或 2.2。
  • 当主动隐藏神经元输出 2.2 时,外侧层出现尖峰,以补偿非外侧输入的-4.6 值。
  • 如果横向层被归零,给定[0,1]输入,答案将是不正确的。
  • 当给定输入为[0,0]或[1,1]时,分支输出相同的值。对于这些输出,分支并不重要。

复杂示例

自动编码器&阀门

自动编码器是一种功能强大的架构,可以应用于许多任务并产生良好的结果(尤其是图像处理任务)。它们也是演示渐进式网络的理想选择。这有两个原因:

  1. 编码器部分的任务之间可能有很多共享信息。
  2. 自动编码器通常是非常深的网络,这一特性允许我们展示一个具有大量分支的网络。

可变自动编码器(VAEs)是自动编码器的一种变体,其中网络学习数据的平均值和标准偏差的抽象,而不是数据本身。这给了解码器部分强大的生成能力!这篇文章很长,没有深入解释自动编码器和 VAEs,所以我推荐阅读 Irhum Shafket 撰写的这篇关于数据科学的文章。

实验设计

对于这个实验,我们将使用 Doric 构建一个渐进变分自动编码器。该网络将能够在图像处理领域执行四种不同的任务。下面列出了这些操作。

  1. 简单重构—将输入重构为输出,通过瓶颈层保留重要信息。
  2. 去噪-从输入中移除椒盐噪声。
  3. 着色-向输入的灰度版本添加颜色。
  4. 修复—在图像中被随机游走的黑色像素遮挡的部分进行绘画。

我们将使用名人数据集进行实验,这是一个大规模的名人脸部图像集。这个数据集适合我们实验的参数,因为它的大小,难度,以及容易注意到人脸的不一致。

运行这个实验的完整代码可以在示例目录中的 Doric 存储库中找到。

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

我们的图像处理 VAE 柱的结构。

结果

下面是进步 VAE 的三个实验柱的结果。所有格式都是原始/输入/输出。列 0(简单重建)未显示,因为它不包含分支。

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

第 1 列(去噪)

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

第 2 列(着色)

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

第 3 列(修复)

分析

为了开始我们对结果的分析,我认为首先解决 autoencoder 的奇怪之处是很重要的——虽然有些图像翻译得很好,但有些却不是。然而,当 VAE 失败时,它很少通过创建错位或不现实的人脸来实现。相反,它过度概括,创造了一个新的人类面孔,更类似于以前见过的面孔。这些种类的错误,以及其他奇怪的错误,都不是由 prognet 引起的,在独立的 VAE 中也会发生。

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

在这张图片中,网络做了很好的重建工作,甚至匹配了大部分被随机行走覆盖的头发梯度。

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

另一方面,这个人完全被取代了。也有很多照片中的脸没有被替换,但是眼镜被拿掉了。

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

背景极有可能变得模糊,因为 VAE 知道背景并不重要。

也就是说,我们可以开始分析与 prognet 相关的结果。从降噪专栏开始,我们看到了我们对任何正常的 VAE 降噪师的期望。网络在去除噪声和保持图像质量方面做得很好(模糊是可以预料的,因为瓶颈只有 128)。值得注意的是训练时间;如果您运行代码,您可能会发现,作为一个 prognet,网络学习去噪要比作为一个独立的网络快得多。

在彩色栏中,我们可以看到结果又一次和我们预期的一样。更值得注意的任务是由第三列执行的修复。在之前专栏知识的帮助下,我们能够得到惊人的结果。即使图像的一小部分通过掩模被损坏的像素曝光,网络也可以重建图像,几乎与简单的重建一样好。

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

由于只能看到她嘴的一小部分,VAE 能够重现她口红的颜色。

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

即使重要的面部特征被遮挡,VAE 也能够利用现有的信息重建出合理的相似度。

生成高质量的结果图像对 prognet 来说是一个好兆头,但要了解横向参数的影响,我们需要找到一些方法来测试它们如何影响结果。一种方法是在移除横向参数的情况下运行正向通道。如果结果仍然是可识别的,分支没有做太多。如果结果是明亮的但不可识别的,则分支与主网络参数一起工作来创建结果。如果结果是暗的或完全黑的,则该列仅使用或主要使用分支进行计算。这是那次向前传球的结果。

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

无侧边去噪。

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

无侧边着色。

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

无侧边修补。

这些结果表明,在列 1 和列 2 中,大部分计算是由分支完成的。在最后一栏中,几乎所有的工作都是由分支完成的。这是迁移学习正在发生的一个强有力的标志。

结论

渐进神经网络是迁移学习和连续学习的有力工具。虽然它们受到浪费内存使用、需要标记和明确定义的任务以及无法适应先前学习的任务变化的限制,但它们完全不受灾难性遗忘的影响,并且它们为持续学习神经系统的宽度方向增长提供了新的模板。在 progressive neural net 论文中进行的实验,以及其他论文和本文中提出的实验,显示了强有力的证据,表明 prognets 是迁移学习的可行工具。

同样,Doric 是一个用于程序开发和实验的有用的轻量级库。借助用户创建的模块以及多通道模块和惰性模块,几乎任何标准架构都可以作为渐进式网络实施。

感谢

感谢 Case Wright 在开发 Doric 和编写我们所有的 autoencoder 测试中的帮助,感谢 David Stucker 的帮助编辑,感谢 Gustavo Rodriguez-Rivera 博士的指导和学术支持,感谢 Purdue 大学。

链接&引用

除非另有说明,所有图片和其他版权材料均由作者创作。

数据科学家基于项目的学习

原文:https://towardsdatascience.com/project-based-learning-for-data-scientists-df6a8f74e4a1?source=collection_archive---------9-----------------------

成为一名数据科学家变得简单多了

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

要成为一名数据科学家,需要学习很多东西。一个真正优秀的数据科学家候选人不仅要具备良好的技术技能,还要能够批判性地思考和解决业务相关问题,以指导业务决策。

从本质上说,培养如何解决不同业务问题的敏锐感觉,会让你在面试过程中从潜在雇员中脱颖而出。

那么,如何才能培养你的数据直觉?在本文中,我将与您分享我最喜欢的培养关键批判性思维技能的策略之一,通过基于项目的学习,让您走上发展数据直觉的道路。

什么是基于项目的学习?

基于项目的学习(PBL)是通过实际工作和应用来发展你的技能。在数据科学的背景下,这意味着使用您已经掌握或正在掌握的各种技能对许多不同种类的数据进行数据分析。本质上,要发展你的数据感觉和直觉,你需要练习使用它们。

但是怎么做?

随着您处理越来越多的数据分析,或项目,您将会接触到越来越多来自不同领域的数据,这些数据将会有独特的业务相关问题需要您去寻找和解决。

你能够完成的项目越多,你接触不同种类的数据、业务问题和发展数据感觉的机会就越多。

不仅如此,这里还有一些基于项目的学习的额外好处:

  • 练习编写复杂的代码来解决与特定行业数据相关的特定问题
  • 当不同的错误出现时,发展你解决问题的技巧(也就是成为一个更好的谷歌人)
  • 练习/学习你从未接触过的技能
  • 增强对自己作为数据科学家能力的信心
  • 你可以把个人项目放在简历上展示给雇主看

听起来很棒,对吧?让我告诉你如何开始。

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

建立你的第一个数据科学项目

  1. 选择您的数据集

这里有一个免费的数据集存储库列表,你可以仔细阅读并下载你喜欢的数据集。我会选择你真正感兴趣的主题的数据集,而不是你认为雇主想看到的。

*不确定选哪个?*新手的话从 Kaggle 开始。您将可以访问其他用户的笔记本,这样您就可以获得灵感开始工作。

2。你想解决什么问题?

选择数据后,您需要将其加载到 Python 中,并执行探索性数据分析(EDA)来了解您的数据。如果你以前从未做过 EDA,或者需要复习,请随意参考这本方便的书

完成 EDA 后,问问自己“如果一家公司带着这些数据来找我,他们可能想了解更多什么?我可以找到哪些关键信息来帮助公司改进?”

例如,如果你有亚马逊这样的在线零售公司的时间序列数据,寻找季节性趋势可能是个好主意。也许你的数据有很多连续变量。创建一个相关矩阵来开始研究数据中不同变量之间可能存在的不同关系可能是明智的。

3。你有足够的数据吗?

根据您在分析中提出的问题,您可能需要找到更多的数据添加到您的分析中,以获得更多的见解。您可能还需要获得额外的数据集来扩展原始数据的时间范围。

例如,Airbnb 的公共数据集只能以 1 个月为增量。这并不坏,是一个开始的地方,但是如果你有几年的数据,你可能能够创建一个更彻底的分析。

4。开始你的项目

组织你的项目来回答你在步骤 2 中提出的各种问题,并从你所拥有的数据中提取尽可能多的有意义的信息。

这就是奇迹发生的地方。您现在处于真实的实践场景中,需要解决数据和重要的行业相关问题。你可以访问万维网,获得大量的资源来帮助你,你得到了这个。

这是你学习新技能和加深对他人理解的绝佳机会。当你遇到错误和其他问题时,Google 和文档将成为你最大的资产。您还可以访问网络上许多数据科学家论坛,如 Stackoverflow数据科学堆栈交流

随着您创建和完成越来越多的项目,作为一名真正的数据科学家,您将获得越来越多的真实世界实践。这将缓慢但肯定地让你的数据感觉成长为数据杀手的本能。

5。写下你的发现,并与观众分享

在我看来,一份关于你的项目的好的期末报告是展示你的沟通和写作技巧的好方法。通过你的分析,你发现了哪些真知灼见?你会建议客户/经理做哪些事情?

对于你放在简历上的任何项目来说,最后的总结都是必须的。这让招聘经理有机会快速审视你的技能和思维方式,看看你是否适合这个团队。你肯定会想包括不同的视觉效果和你使用的统计模型,并仔细解释你的业务问题是什么,以及你的工作如何解决这些问题。

但是,唉,这将是另一天的话题:)

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

你的第一个项目和第十个项目会是什么感觉:)

基于项目的学习是培养你的数据意识以及技术和沟通技能的最有效的方法。有些技能你只能在工作中学习,而基于项目的学习将让你掌握这些关键的数据意识。

非常感谢您花时间阅读我的文章,如果您有任何问题,请随时联系我。下次见!

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

我叫 Kishen Sharma,是一名数据科学家,在旧金山湾区工作。我的使命是教授和激励全世界有抱负的数据科学家。

请随时在 Instagram 上与我联系,并在这里查看我的附加内容。你也可以在这里查看我的其他文章

数据科学中的项目管理

原文:https://towardsdatascience.com/project-management-in-data-science-11d059bcb265?source=collection_archive---------10-----------------------

来自前项目经理的建议,告诉你如何在事情出错时也能让自己保持在正轨上

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

Unsplash 上插入佩佩·西尔维娅来自《费城永远阳光灿烂》的 meme 照片由阿尔瓦罗·雷耶斯拍摄

当讨论转向数据科学家应该具备的辅助技能时,项目管理有时会被当作一种不错的软技能。但是关于如何将项目管理技术具体应用于数据科学的资源很少,并且建议通常是油嘴滑舌的。每当这个问题出现时,“只要看看现有的项目管理资源”就是标准答案。

作为公司范围内数百万美元项目的项目经理,我可以从经验中告诉你,项目管理不仅仅是制定一个计划和在清单上打勾。任何实际参与过数据科学项目的人都知道,由于不可预见的情况,您的计划经常被搁置。事情花费的时间比预期的长,出现了意想不到的问题。事实上,丹尼尔·卡纳曼和阿莫斯·特沃斯基为这种低估完成任务所需时间的倾向创造了术语“计划谬误”。

项目管理实际上是关于解决交付中人的易犯错误。这就是为什么我想根据有效的项目管理技术给出坦率的建议——而不是列出昂贵的软件工具,也不是概述 CRISP-DM 流程的每一步要花多长时间。

为什么要使用项目管理工具?

有大量的项目经理工具用于监控和报告项目进展。虽然这些工具的存在似乎只是为了创造忙碌的工作,并证明项目经理的薪水是合理的,但事实并非如此!您不仅可以使用这些工具来让高级管理层了解信息,还可以帮助您和您的利益相关者记录假设和项目依赖关系。

敏捷宣言说我们应该总是优先考虑人和交互,而不是过程和工具。同样,对于一个数据科学项目,你应该优先回答业务问题,而不是无关紧要的华而不实的东西。虽然你可以说项目管理工具是附带的,但你会惊讶于这些工具是如何帮助你以一种结构化的方式处理和思考问题的。

正如敏捷宣言所坚持的,这些工具的使用和形式化应该与项目规模成比例。因此,举例来说,如果你只是在为你的投资组合做一个周末数据科学项目,你不需要创建一个花哨的甘特图。但是创建一个 RAID 日志(风险、假设、问题和依赖性)可能是值得的,以便在您进行建模时将您的假设放在心上。即使在项目结束后,几个月或几年后继续提醒你你的假设也是一个很好的资源。所以当你继续读下去的时候,请记住你可以并且应该根据你的需求扩展这些工具。

数据科学项目管理工具的类型

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

你的项目管理工具包里有什么工具?…由托德·夸肯布什Unsplash 上拍摄的照片

  1. 结构化思考问题:RAID 日志 — RAID 代表 R isks、 A 假设、 I 问题、 D 依赖。RAID 日志不是我们倾向于想到的用于项目管理的第一类工具,但是我认为它们是最重要的。不管项目大小如何,我都建议保留一个 RAID 日志。每当你着手解决一个问题时,当你制定方法时,总会有一些假设。当你制定收集数据的计划时,可能会有风险阻碍你的计划。当你列出你需要做的事情的步骤时,依赖关系可以帮助你计划处理项目的顺序。将这些记录在一个地方是消息灵通和看起来对你的项目一无所知的区别。
  2. 确定你需要做什么:WBS — WBS 代表WworkB分解 S 结构。它本质上是一个花哨的术语,指需要完成的所有任务的列表。虽然数据科学流程框架(如 CRISP-DM、KDD 和 OSEMN)总结了数据科学项目中的步骤,但将这些框架应用于您的问题非常重要。例如,在 OSEMN 框架中(Ob ain, S crub, E xplore, M odel,I N terpret),你期望做什么样的数据擦洗?你打算使用什么样的模式——如果第一种模式不起作用,你随后会尝试什么样的模式?如果你和团队一起工作,WBS 甚至可以帮你分配任务。
  3. 计划每个任务或阶段的顺序和持续时间:甘特图 —结合 RAID 日志中的依赖关系和 WBS 中的任务,甘特图有助于计划任务的时间和顺序。它可以相当详细——在 WBS 上绘制出每个单独的任务——或者它可以是高层次的,以便只绘制高层次的流程。在这种情况下,它通常被称为“路线图”,是与高级管理层沟通的最佳方式之一。

RAID 日志

RAID 日志的创建是反映业务问题、评估您的数据科学问题是否能解决业务问题的一种方式,并让您与利益相关方保持联系以解决问题。

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

假设日志示例。在 techno-pm.com 找到更多的例子和模板

思考业务问题

从记录项目的风险、假设和依赖性开始。我强烈建议在收到利益相关者的业务问题后,尝试将它转化为数据科学问题,并思考如何回答它。这自然会引出问题和假设,您可以记录下来,然后与业务部门一起审查。

假设

假设通常是那些隐藏的、没有说出来的东西,让我们认为一个项目会比它实际上要简单。可以从多个方面进行假设,包括:

  1. **数据:**作为数据科学家,我们最容易出错的地方——尤其是考虑到数据清理经常被认为是数据科学家 80%的工作。您可能会对数据做出一些假设,包括我们希望数据如何格式化,我们可以使用哪些功能,数据的范围有多广,某个功能作为某种事物的代理的适用性,等等。
  2. **模型:**所有的模型都有自己的假设。例如,K-均值聚类假设聚类内的方差本质上是球形的,并且聚类的大小是相同的。我们的模型可以强加给我们的另一个假设是没有空值,这可能需要我们在 WBS 中包括一个插补步骤。这些假设和任何违反假设的情况都必须记录下来,以确保我们完全理解使用任何模型的利弊(并在 WBS 中包括满足假设的任何必要步骤)。
  3. **工作流或数据管道:**虽然我们倾向于不去想在部署我们的模型后事情会发生变化,但是如果将来发生变化,记录关于工作流的假设是很重要的。例如,我们可能假设地理位置仅作为一个分类城市/州可用,但我们的数据管道可能会在未来改变以获取纬度/经度数据,并导致我们在生产中调整我们的模型。

属国

依赖性可以是数据科学项目自然遵循的顺序,例如在尝试任何建模之前完成数据清理。依赖关系还可以说明一些团队欠其他团队什么,例如数据工程师向数据分析师或机器学习团队提供的干净数据文件。这可以让你跟踪项目可能被延迟的原因,而不是把它归咎于最后一个接触项目的团队。

风险

风险可能难以识别,并且经常与其他 RAID 日志项目混淆。假设和依赖有助于揭示风险所在。风险通常是实际问题的前兆(事实上,如果意识到风险,它可以被关闭,新的问题应该在它的位置打开)。

问题

记录问题是一个只有在项目开始后才能完成的步骤。那么,为什么要这么做呢?项目管理不仅仅是项目规划,还包括持续的监控和文档记录。这看起来像是在浪费时间,但是就像任何好的实践一样(咳咳评论代码),它在未来会有回报。了解在过去的项目中遇到了什么问题——特别是对于一个数据基础设施不经常改变的公司——可能是低估潜在工作和准确估计项目时间表和收益的区别!

利益相关方联系人

最佳实践是让您的利益相关者定期签署 RAID 日志。或者,如果这看起来太官僚主义,只要检查任何新的项目或变化就可以让每个人都了解情况并负责任。您的 IT 和业务利益相关者可以轻松地确认假设或风险,他们的意见将有助于您保持正确的方向。

工作分解结构(WBS)

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

带有预计任务持续时间的工作分解结构示例。在pmwares.com了解更多关于使用 Microsoft Project 创建 WBS 的信息

WBS 将项目从主要的可交付成果分解成越来越小的组成部分,直到你达到单个任务级别。列出你的个人任务有很多好处:

头脑风暴一下你需要做什么

在我们对实际解决问题的过度热情中,我们可能低估了我们的任务,没有为我们的项目分配足够的时间。或者,更糟糕的是,我们可以跳过简单但必要的步骤(检查和输入丢失的值!标准化数字特征!一次性编码分类变量!)而没有意识到我们的模型结果表明了基本的特征转换问题。通过强迫自己将高级数据科学项目阶段分解成任务,你开发了一个标准的、可重复的方法。

最棒的是,你可以在未来的项目中重用 WBS 的一部分。还有一个问题可以通过集群解决吗?只需从上一个集群项目中抽出 WBS,它已经列出了必要的步骤和检查!

估计每一步需要多长时间

WBS 是计算一个项目需要多长时间的好方法。因为你已经列出了每一个单独的任务,添加一个时间估计是很简单的。与高层次估计时间表不同(例如,数据清理需要 2 天),如果发现某项任务没有必要,或者违反了模型的假设,表明它不太适合您的数据,您可以立即确定节省的时间。

由于我们很难估计事情需要多长时间,所以最好用历史作为例子。如果您记录了过去项目中每项任务实际花费的时间,就可以更好地预测未来项目的时间长度。

确定依赖关系

虽然一些任务之间的依赖关系很明显(在通过特定的机器学习模型运行您的要素之前对空值进行插补),但还有其他一些更微妙的依赖关系。特别是当我们考虑到数据科学过程可以在特征工程和建模步骤中迭代时,仔细考虑任务之间的依赖关系可以帮助您有效地规划模型管道。

例如,您可能希望对刚刚标准化的要素运行线性回归模型,然后您可能会回过头来查看各种变换如何影响模型结果。因此,虽然标准化可能是线性回归两次迭代的依赖项,但对数转换可能只在第二次迭代中需要。记录任务之间的顺序和依赖关系可以帮助您创建一个可重用和干净的管道。

线条图

甘特图是一种将 WBS 可视化的方式。通常情况下,任务是垂直列出的,时间是水平跨越的,一个水平条显示每个任务跨越多长时间。任务也可以分组到工作流中,特别是当项目很大并且跨越整个组织中的许多功能组时。

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

更高层次的甘特图,也可以称为“路线图”图片来源:如何在 Powerpoint 中制作甘特图

确定粒度级别

这是一个项目管理工具,如果你正在做一个单独的项目,你可以跳过它。但是如果你在一个组织中,我认为高层次的“路线图”是有用的。我认为更多的人是视觉学习者,而不是我们所认为的那样。或者至少,事情变得有意义更快当我们看到它们的时候。这就是为什么手头上有一个项目进展的路线图这样的视觉图像——特别是在一个长期项目中——可以帮助减轻高级管理层的恐惧,并让他们继续投资。

一个需要大型组织中不同团队参与的项目很容易在较低的任务级别上创建甘特图。但通常在这种情况下,会有一个专门的项目经理来监控和管理项目。

结论

虽然在您的下一个数据科学项目中使用这些工具可能无法防止意外延迟,但持续使用这些工具可以让您更好地感知风险,帮助您更好地估计任务的持续时间,并迫使您与利益相关者保持更密切的联系。我建议在您的下一个项目中实施这些工具的简单版本,看看您如何处理和规划您的数据科学项目,以及如何改进!

在我的下一篇博客文章中,我将带你看看我的个人项目中没有按计划进行的例子。

TL;博士

在项目正式开始之前和项目进行过程中,使用 RAID 日志来确定假设、依赖性、风险和问题。根据项目的复杂程度和规模,在 WBS 中列出所有必要的任务,包括预期的开始和结束日期、任务之间的相关性以及任务负责人。甘特图采用工作分解结构,并用图表显示每项任务或工作流预计需要多长时间。高级甘特图也被称为项目路线图,可用于让高级管理层了解进展情况。虽然你可以使用花哨的软件来应用这些工具,但好的 Excel 或 Google Sheets 可以做到这一点。

[1]:规划谬误,https://en.wikipedia.org/w/index.php?title=Planning_fallacy&oldid = 914560670(2019 年 11 月 18 日最后一次访问)。

每个数据科学家都应该知道的项目管理工作流

原文:https://towardsdatascience.com/project-management-workflows-every-data-scientist-should-know-89bbf0d625e4?source=collection_archive---------52-----------------------

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

Jo Szczepanska 在 Unsplash 上拍摄的照片

管理数据科学项目的主要流程以及为什么您应该了解它们

介绍

我们中的许多人开始自学数据科学,参加 Kaggle 比赛和在线阅读教程。即使我们最终在编码和算法方面学到了很多,但在开始时,我们对处理数据所需要的其他东西了解不多,比如项目管理。

即使你不是经理,了解公司采用的不同方法也很重要,因为你可能会发现自己被迫在这些框架中的一个框架内工作。在这篇文章中,我将为您介绍主要的几种。

瀑布

尽管瀑布是最传统的项目管理方法之一,但由于它的线性方法,通常不适合数据科学。

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

来源:微软

它的名字来源于它生成的甘特图,类似瀑布并说明了它的线性。

它通常从定义最终产品要求和详细步骤开始,以线性时间表组织,其中任务通常取决于前面的任务,并附属于负责执行任务的人。所以,当你开始一个项目时,你希望确切地知道它什么时候结束,最终产品是什么。

将这种方法应用于数据科学项目的问题是,它假设项目需求在未来不会改变,这可能是一些其他类型项目的情况,但通常不会在数据中发生,在数据中,随着我们在执行中的进步,我们会积累知识,初始需求可能会发生很大变化。

混乱

根据 Scrum 的说法,“Scrum 本身是一个简单的框架,用于复杂产品的有效团队协作”。

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

资料来源:Scrum.org

它是一个敏捷框架,广泛用于软件开发,有时也用于数据项目,尤其是当数据团队以某种方式被插入开发团队时。

团队从一个产品待办事项清单开始,这是要做的事情的列表,根据它们的重要性排序。从这个列表中,构建了一个新的列表:T2 sprint planning T3,其中包含了将在下一个 sprint 中处理的高优先级项目。顺便说一下,一个冲刺,是团队专注于冲刺计划中列出的任务的一小段时间。因此,每隔 2-4 周,团队会聚在一起设定下一次会议之前要完成的目标,在下一次会议期间,还会有一个 sprint 回顾,参与者会回顾上一次 sprint 的目标,看看已经实现了什么,还没有实现什么,以及为什么。

它倾向于面向产品的项目,这并不总是数据项目的最佳选择,因为数据科学有时由长时间的探索性分析组成,这不一定会转化为产品特性或需求。另一方面,Scrum 可能会将这些分析推向一个更加面向结果的道路,减少有时浪费在智力分歧上的时间。

CRISP-DM

数据挖掘的跨行业标准流程,也称为 CRISP-DM,自 1996 年以来一直存在,是数据挖掘流程中使用最广泛的模型之一。它不像瀑布模型那样是线性的,瀑布模型为每一步之间的迭代增加了很多灵活性。

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

肯尼斯·詹森

它始于业务理解步骤,在这里你开始系统地阐述你想要回答的问题,第一假设,等等。一旦你有了这些,你就开始寻找你需要的数据,进入数据理解阶段,在那里你检查你有什么样的可用数据,寻找异常值、缺失值等等。下一阶段是数据准备,您将决定如何处理那些缺失值和异常值,如何导入和清理您的数据,等等。一旦完成,你将开始建模,尝试不同的算法,然后评估它们以及它们的表现,通常与基线进行比较。最后一步是部署选定的模型,将其投入生产。

请注意,虽然这些步骤是以线性顺序呈现的,但在此过程中,您通常会在它们之间移动很多次。例如,在建模阶段,您可能需要更改准备数据和处理要素的方式,具体取决于您使用的模型。一旦你评估了你的模型,有时结果可能不令人满意,促使你去理解为什么,也许回到第一步,重新思考你理解业务问题的方式。

IBM 人工智能工作流

IBM 对于 AI 项目的工作流程基本上是受设计思维的启发,所以每一步都与一个设计思维流程步骤相关。它也是基于迭代的思想,每一步都可以导致下一步,但也可以让你回到以前的步骤,这取决于你的结果。

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

来源:交互设计基金会

数据收集 ( 移情),是数据科学家与最接近数据的人交谈,以阐明商业机会,并将其转化为可测试的假设。它包括定义时间表、成本、可行性等。最后,您继续为项目收集数据。

探索性数据分析 ( 定义)是您尝试可视化您的数据、检查缺失值(并决定如何处理它们)以及潜在测试假设的地方。

然后您移动到转换 ( ideate )步骤,这里的目标是转换您的数据,以便它可以被模型使用。这是所有特性工程魔法发生的地方。

建模 ( 原型)是下一步,在这里您定义一个评估标准,并针对您的问题比较不同的模型。从简单的模型开始,然后逐步建立。

最后一步是测试,这里的目标不仅仅是对你的代码进行单元测试,还包括批评你之前所做的选择,如果需要的话再回去(通常是这样)。它以所选解决方案的部署而告终,这也要经过测试:即使是运行的模型也要经过审查和持续的性能测试。

顺便说一下,IBM 在 Coursera 上有一个专门研究这种方法的项目,我强烈推荐这个项目。

结论

每种方法都有自己的优点和缺点,正确的方法取决于你的公司、你的团队以及项目的规模和范围。瀑布式工作流最适合范围已经明确的项目,比如改进已经实现的模式,而当项目涉及更多的数据工程而不是数据科学时,Scrum 会工作得更好,并且最终的可交付物本身就是一个产品。CRISP-DM 和 IBM AI 工作流在需要不断迭代和彻底探索性分析的项目中工作得更好。

更新

要进行回顾和更深入的分析,可以查看海王星博客的文章2021 年的数据科学项目管理。他们概述了这里没有提到的一些其他方法,这些方法也可以作为您处理数据科学项目的参考。

项目:用回归机器学习算法预测红酒成分的完美比例

原文:https://towardsdatascience.com/project-maximizing-red-wine-profits-with-regression-machine-learning-algorithms-8caad2a10a08?source=collection_archive---------52-----------------------

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

来源

目录

**1。简介:**场景&目标,特性&预测器

**2。数据争论:**缺失值,用 Z 值检测/处理异常值

**3。探索性数据分析:**相关性、配对图、特征工程、核密度估计(KDE)、回归联合图、条形图、小提琴&盒图

**4。机器学习+预测分析:**为建模准备数据,建模/训练,R 值,预测,k 重交叉验证‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍ ‍

5。结论

1。简介

场景:

你走进 T21 北部的一家酒吧。你点了伏特加,并对坐在你旁边的人说你是一名数据科学家。酒吧的老板,碰巧是一个葡萄酒商,让你知道他正在雇佣一名数据科学家。他说他正在失去顾客 &需要帮助为他的红酒系列想出一个新配方。葡萄酒商把这些数据交给你,让你进行数据分析预测配料的完美比例最大化他的利润

目标:

  • 预测红酒配料的完美比例。这是一个数值连续的结果
  • 用各种回归模型&探索,看哪个产生最大精度
  • 检查我们数据中的趋势 & 相关性
  • 确定哪些特性品质红酒品质重要

:由于我们是预测一个数值连续值,我们将训练各种回归模型。回归分析监督学习的子领域。

特征和预测:

我们的预测器 (Y,葡萄酒质量)由 11 个特征 (X)决定:

1.固定酸度(g/L)——大多数与葡萄酒有关的酸或固定的或不挥发的(不容易挥发)
2。**挥发性酸度(**g/L)——乙酸的含量(含量过高会导致不愉快的醋味)
3。柠檬酸(摩尔/升)——少量存在的柠檬酸可以增加葡萄酒的“新鲜度”和风味
4。残糖(克/升)——发酵停止后剩余的糖量
5。氯化物(克)—盐量
6。游离二氧化硫(mg/L)——游离形式 SO 存在于分子 SO(溶解气体)和亚硫酸氢根离子
7 之间的平衡。总二氧化硫( mg/L ) —游离态和结合态 SO 的量
8。**密度(**克/厘米 ) —水的密度接近于水的密度,取决于酒精和糖的百分比含量
9。pH——描述葡萄酒的酸性或碱性程度,范围从 0(非常酸性)到 14(非常碱性);大多数葡萄酒在 3–4
10 之间。硫酸盐(g)——可增加二氧化硫气体(SO)水平的添加剂,作为抗菌剂
11。酒精——酒精含量百分比

:我们的数据只有一种数据:****(#);这是可以测量的定量数据

**import** **numpy** **as** **np**
**import** **pandas** **as** **pd**
**import** **matplotlib** **as** **plt**
**import** **seaborn** **as** **sns**
**import** **matplotlib.pyplot** **as** **plt**

2.数据争论

**filePath = '/Users/jarar_zaidi/Downloads/wineQuality.csv'

data = pd.read_csv(filePath)

data.head()**

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

帮助我们了解我们正在处理的数据。

**print("(Rows, columns): " + str(data.shape))
data.columns**

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

显示行数和列数。以及列名

**data.nunique(axis=0)** *# returns the number of unique values for each variable.*

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

返回每个变量的唯一值的数量。

*#summarizes the count, mean, standard deviation, min, and max for numeric variables.*
**data.describe()**

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

汇总数字变量的计数、平均值、标准差、最小值和最大值。

平均质量为 5.6,其最大 ( 最佳质量得分)为 8.0 &其最小 ( 最差质量得分)为 3.0。现在,让我们看看是否有任何缺失值需要处理。

缺少值

*# Display the Missing Values*

**print(data.isna().sum())**

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

显示每列缺失值的数量。幸运的是我们没有。

使用 Z 分数检测/处理异常值

一个 Z 值是对位置的测量,它表示一个数据值偏离平均值标准偏差的数量。任何 z 分数小于 -3大于 3 ,都是异常值**。******

:从经验法则我们看到我们数据的 99.7% 应该在均值的 3 个标准差以内。

**from scipy import stats
import numpy as np
z = np.abs(stats.zscore(data))
print(z)**

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

获取 Z 分数

接下来,我们想要获取 Z 值大于 3 的行和列。这些被认为是异常值。

**threshold = 3
print(np.where(z > 3))**

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

第一个数组号&的列表第二个数组异常值对应的号。例如,第一个异常值在第 13 行第 9 列。一旦我们计算出Z 值 Z 值,我们就可以移除离群值清理我们的数据,方法是执行下面的操作。

**Newdata = data[(z < 3).all(axis=1)]
Newdata**

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

我们现在已经成功地 移除了 148+ 行,这些行是异常值

注意:其他异常值指标也可以使用,如 IQR 得分散点图箱线图

让我们看看我们的新清理的数据。

**Newdata.describe()**

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

3.探索性数据分析

相关

相关矩阵又名热图 -让你看到所有变量之间的相关性

内,你可以看到某件事是还是 与我们的预测器(目标)相关。****

*# calculate correlation matrix*

**corr = Newdata.corr()
plt.subplots(figsize=(15,10))
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))
sns.heatmap(corr, xticklabels=corr.columns,
            yticklabels=corr.columns, 
            annot=True,
            cmap=sns.diverging_palette(220, 20, as_cmap=True))**

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

我们可以看到在酒精我们的预测因子之间有一个 相关。事实上,这是我们数据集中最相关的特征,其值为 0.5

注意:我们的酒精特征是饮料中的酒精含量百分比。对于购买红酒的顾客来说,酒精含量的百分比越高就会产生越大的满意度**!**

接下来,我们可以看到第二** 最强的正相关0.39硫酸盐 &我们的质量预测值。似乎当饮料中添加了添加剂时,人们对质量的评价会更高。硫酸盐 充当抗菌剂。**

最后,负相关性最强的挥发酸度**,相关性为 -0.35 !这是意料之中的,因为过高的醋酸含量会导致令人不愉快的 T42 醋味道!**

配对图

成对图也是一种很好的方式,可以让立即看到所有变量之间的相关性

因为我们有 11 特征,所以让我们只选择关联到我们的预测显著特征,以进一步检查它们在配对图上的相关性

**subData = data[['volatile acidity','citric acid','sulphates','alcohol']]
sns.pairplot(subData)**

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

该图支持热图中所述的相关性**。**

:选择制作一个较小的配对图,其中只有最强的预测值,以便深入关系中。这也是一个很好的方法来看看他们的关系是还是 相关

特征工程

我们现在将进行特征工程的一种形式,其中我们创建一个新的 根据其质量分数进行分类!****

这个新列将是一个二进制分类数据**,其中 01 表示该葡萄酒是否被认为是“美味的”。**

**Newdata['tasty'] = [0 if x < 6 else 1 for x in Newdata['quality']]**

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

我们现在有一个新列带有011s。

核密度估计(KDE)

一个核密度估计(KDE)** 估计一个连续随机变量的**概率密度函数(PDF)****

**g = sns.jointplot("quality", "volatile acidity", data=Newdata,
           kind="kde", space=0, color="red")**

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

一个内核密度估计允许我们可视化数据在连续区间上的分布**。从这个图中,我们可以得出结论:质量较低的红酒是严重倾向于挥发酸度水平较高的**。这正如我们所料因为,大量醋酸产生难闻的醋味!****

回归联合图

**g = sns.jointplot(x= 'fixed acidity',y= 'pH', data=Newdata,
             kind = 'reg',height=15,color='blue')

plt.xlabel('Fixed acidity',size=30)
plt.ylabel('pH',size=40)
plt.title('Fixed acidity vs. pH',size=30)**

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

从上面解释的回归联合图中,我们可以看到 pH 水平&固定酸度之间存在强负相关**。换句话说,当其中一个增加时,另一个减少。根据热图,这两个特性有一个相关性系数 -0.71 !**

条形图

**sns.catplot(x="quality", y="volatile acidity", hue="tasty", kind="bar", data=Newdata);

plt.title('Tasty & Non-Tasty Wine with Volatile Acidity Level',size=19)
plt.xlabel('Wine Quality',size=16)
plt.ylabel('Volatile Acidity Level',size=16)**

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

这幅图说明了高挥发性酸度水平产生一款糟糕的品酒。这正如我们所料,因为大** 醋酸产生一种难闻的醋味!**

小提琴和盒子图

显示框&小提琴图的优点在于它显示了基本数据的统计**,以及其 分布 。这些图通常用于比较给定变量在某些类别中的分布。**

显示的是中位**、 IQR 、&图基的栅栏。(最小值、第一个四分位数(Q1)、中值、第三个四分位数(Q3)和最大值)。此外,它可以为我们提供数据中的异常值。**

**plt.figure(figsize=(12,8))
sns.boxplot(x="quality", y="sulphates", hue="tasty", data=Newdata )
plt.title("Tasty & Non-Tasty Wine with Sulphate Level", fontsize=20)
plt.xlabel("Wine Quality Level",fontsize=16)
plt.ylabel("Sulphate Level", fontsize=16)**

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

接下来,我们检查这个方框图**,这有助于进一步得出结论,即好喝的红酒显示出硫酸盐水平的中位数升高。******

如果我们回想一下我们的化学课,我们记得硫酸盐是一种添加剂,可以增加二氧化硫气体(SO)的水平,这是一种抗菌剂!

:一种抗菌剂是一种杀死微生物 & 阻止其生长 h 的药剂。****

我们现在明白了为什么这些高硫酸盐含量会增强顾客的偏好!

**plt.figure(figsize=(12,8))
sns.violinplot(x="quality", y="alcohol", hue="tasty", inner='quartile',data= Newdata )
plt.title("Tasty & Non-Tasty Wine with Percent alcohol content",fontsize=20)
plt.xlabel("Wine Quality Level", fontsize=16)
plt.ylabel("Percent alcohol content ", fontsize=16)**

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

分析完这个小提琴剧情我们可以得出好酒&不好酒的整体形态& 分布差异巨大**。好喝的红酒显示出一个剩余中值为百分比酒精含量&因此他们的数据的一个大分布在 10 & 13 之间,而不好喝的红酒由一个低中值酒精含量在 9.5 & 11 之间。**

L et 的比较好喝&不好喝红酒之间的平均值****

**yummy = Newdata[Newdata['tasty']==1]
yummy.describe()**

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

**notYummy = Newdata[Newdata['tasty']==0]
notYummy.describe()**

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

**print("(Tasty Wine Sulphates level): " + str(yummy['sulphates'].mean()))
print("(Non-Tasty Wine Sulphates level): " + str(notYummy['sulphates'].mean()))**

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

更美味的葡萄酒表现出更高的硫酸盐水平

**print("(Tasty Wine Alcohol content level): " + str(yummy['alcohol'].mean()))
print("(Non-Tasty Wine Alcohol content level): " + str(notYummy['alcohol'].mean()))**

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

更好喝的葡萄酒表现出更高的酒精含量水平

**print("(Tasty Wine Total Sulfur Dioxide level): " + str(yummy['total sulfur dioxide'].mean()))
print("(Non-Tasty Wine Total Sulfur Dioxide level): " + str(notYummy['total sulfur dioxide'].mean()))**

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

更好喝的葡萄酒展示了更低的二氧化硫水平

L 很快,好喝&与不好喝之间的平均值相差极大****。例如,美味的红葡萄酒包含总量二氧化硫最小化水平。此外,美味的红葡萄酒含有的硫酸**&酒精水平要高出很多**。********

如果我告诉葡萄酒商每种成分的完美比例能让最大化他的红酒销量,我会告诉他包括低水平的二氧化硫和高水平的 T11 硫酸盐酒精 T15。************

4.机器学习+预测分析

为建模准备数据

为建模准备数据,只需记住 ASN ( 赋值、拆分、规格化)。

AT22 将 11 个特征赋值给 X,&最后一列给我们的预测值,y

**X = df.iloc[:, :-1].values
y = df.iloc[:, -1].values**

SSplit:数据集分为训练集和测试集

**from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.2, random_state = 1)**

N 标准化:标准化数据将转换数据,使其分布的平均值为 0,标准差为 1。

**from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)**

建模/培训

现在,我们将在训练集&上训练各种回归模型,看看哪个产生最高的精确度。我们将比较的准确性 多元线性回归 多项式线性回归 SVR(支持向量回归) 决策树回归 随机森林这些都是监督学习模型,用于预测连续值。**

:对于回归模型,有几个度量用于测量精度,如均方根误差(RMSE)残差标准差(RSE)平均绝对误差(MAE) 。但是我们将用 R . 来测量我们的模型

模型 1:多元线性回归

*# Train model on whole dataset*
**from** **sklearn.linear_model** **import** **LinearRegression
regressor = LinearRegression()
regressor.fit(x_train,y_train)**

*#Predicting Test Set Results*
**y_pred = regressor.predict(x_test)** 
*# Evaluating Model Performance*
**from** **sklearn.metrics** **import** **r2_score
r2_score(y_test,y_pred)**

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

准确率 75%

模型 2:多项式线性回归

**from sklearn.model_selection import train_test_split x_train2, x_test2, y_train2, y_test2 = train_test_split(X2,y2,test_size = 0.2, random_state = 1)****from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression poly_reg = PolynomialFeatures(degree = 4) x_poly = poly_reg.fit_transform(x_train2) lin_reg_2 = LinearRegression() lin_reg_2.fit(x_poly,y)****y_pred2 = lin_reg_2.predict(poly_reg.transform(x_test2))****from sklearn.metrics import r2_score r2_score(y_test2,y_pred2)**

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

准确率 80%

模型 3: SVR(支持向量回归)

*#assign*
**X3 = df.iloc[:, :-1].values
y3 = df.iloc[:, -1].values**

*#split*
**from** **sklearn.model_selection** **import** **train_test_split
x_train3, x_test3, y_train3, y_test3 = train_test_split(X3,y3,test_size = 0.2, random_state = 1)**

**from** **sklearn.svm** **import SVR
regressor3 = SVR(kernel='rbf')
regressor3.fit(x_train3,y_train3)** *# replace by x_train , y_train if we split*

**regressor3.predict(x_test3)

from sklearn.metrics import r2_score
r2_score(y_test3,y_pred3)**

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

准确率 74%

模型 4:决策树回归

*# Assign*
**X4 = df.iloc[:, :-1].values
y4 = df.iloc[:, -1].values**

*# Split*
**from** **sklearn.model_selection** **import** **train_test_split
x_train4, x_test4, y_train4, y_test4 = train_test_split(X4,y4,test_size = 0.2, random_state = 4)**

**from** **sklearn.tree** **import** **DecisionTreeRegressor
regressor4 = DecisionTreeRegressor(random_state = 0)
regressor4.fit(x_train4,y_train4)** *# replace by x_train , y_train if we split*

**y_pred4 = regressor4.predict(x_test4)** 
**from** **sklearn.metrics** **import** **r2_score
r2_score(y_test4,y_pred4)**

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

准确率 74%

模型 5:随机森林回归🏆

*# Assign*
**X5 = df.iloc[:, :-1].values
y5 = df.iloc[:, -1].values**

*# Split*
**from** **sklearn.model_selection** **import** **train_test_split
x_train5, x_test5, y_train5, y_test5 = train_test_split(X5,y5,test_size = 0.2, random_state = 6)** 

**from** **sklearn.ensemble** **import RandomForestRegressor
regressor5 = RandomForestRegressor(n_estimators = 10, random_state=0)
regressor5.fit(x_train5,y_train5)** *# replace by x_train , y_train if we split*

**y_pred5= regressor5.predict(x_test5)**

**from** **sklearn.metrics** **import r2_score
r2_score(y_test5,y_pred5)**

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

准确率 83%!🏆

83%,的一个 R 揭示了数据83% 符合回归模型

型号 6: XGboost

**from** **xgboost** **import** XGBClassifier

**model7 = XGBClassifier(random_state=1)
model7.fit(x_train, y_train)
y_pred7 = model7.predict(x_test)
from sklearn.metrics import r2_score
r2_score(y_test5,y_pred7)**

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

准确率 82%

解释 R 值

R (又名拟合优度决定系数)是统计测量数据与拟合回归线的接近程度。R ,比好**。最佳 R 值为 1.0**

通过比较 6 个回归模型,我们可以得出结论:模型 5:随机森林回归产生的精度最高,其精度的 83%🏆

注意:一个好的经验法则是任何高于 70%的精度都被认为是好的,但要小心,因为如果你的精度极高,它可能好得不真实(过度拟合的一个例子)。因此,83%是理想的精确度!

预言

S cenario :让我们预测一家公司酿造的一款红酒的质量是根据其每种成分比例。我们现在将输入每种成分比例到我们的机器学习算法中。

红酒的成分由…

7.9 g/L固定酸度

0.59 克/升挥发酸度

柠檬酸的 0.004 摩尔/升,

发酵停止后残糖1.9g/L

0.062 克氯化物盐

49.0 毫克/升游离二氧化硫

33.0 毫克/升总二氧化硫

密度为 0.9915 克/厘米的水,

pH3.21 (酸性),

0.53 克硫酸盐

8.9 %酒精含量

根据这些信息,你能预测这款红酒质量分数吗?

**print(regressor5.predict(([[7.9,0.59,0.004,1.9,0.062,49.0,33.0,0.99513,3.21,0.53,8.9,1]])))**

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

产量红酒质量分数6.5

P.S 。如果你看不出来,我以前是 生物专业 ,转行之前是 数据科学

k 倍交叉验证

K 倍交叉验证是一种统计方法,确保我们对我们的模型性能有更好的测量。我们在数据的不同子集上运行我们的建模过程,以获得模型质量的多个度量**。我们我们的数据除以特定的数量的。**

K 重交叉验证允许原始数据集中的每个观察值出现在我们的训练&测试集中。

当我们创建 20 个不同的测试折叠时,我们降低了获得幸运 风险最终 精度我们得到的将是平均值20 倍测试

**from sklearn.model_selection import cross_val_score
accuracies = cross_val_score(estimator = regressor5, X = x_train5, y = y_train5, cv = 20)**
**print("Accuracy: {:.2f} %".format(accuracies.mean()*100))** *# float w 2 decimals after comma*
**print("Accuracy: {:.2f} %".format(accuracies.std()*100))** *# float w 2 decimals after comma*
*# the 20 accruaceis lie within  % , we have a high std.* 
*#(Mean - Std, Mean + Std)*

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

20 个准确度位于**(80.44–4.48,80.44+4.48)%** = (75.96,84.92)%置信区间内。我们有一个高标准差,这意味着我们的数字展开的。

结论

  1. 在我们研究的 11 个特征中,帮助葡萄酒商酿造美味红酒的前 3 个重要特征是低水平的二氧化硫和高水平的硫酸盐&酒精。
  2. 我们的随机森林算法产生了最高的 R 值,83%!任何超过 70%的 R 都被认为是好的,但是要小心,因为如果你的精确度非常高,它可能好得不真实(过度拟合的一个例子)。因此,83%是理想的精确度!
  3. 我们的机器学习算法现在可以根据成分比例预测红酒的质量。通过检测这些重要的特征,我们可以防止我们的葡萄酒商倒闭或损失任何利润!生产一种没有人会喜欢的葡萄酒成本很高,会给我们公司带来收入损失。这是非常强大的,因为现在我们可以正确地看到人们更喜欢葡萄酒的哪些成分&,从而最大化我们的利润!

这里是从我的 GitHub 页面对数据集 & 代码访问:

[## jzaidi 143/Project-用回归机器学习预测红酒成分的完美比例…

预测红酒成分的最佳比例。这是一个数字离散结果。探索各种…

github.com](https://github.com/jzaidi143/Project-Predicting-the-Perfect-Ratio-of-Red-Wine-Ingredients-with-Regression-Machine-Learning-Algor)

https://archive.ics.uci.edu/ml/datasets/wine+quality

欢迎推荐和评论!

承认

页(page 的缩写)科尔特斯、塞德伊拉、阿尔梅达、马托斯和雷伊斯。
通过物理化学特性的数据挖掘建立葡萄酒偏好模型。在决策支持系统中,爱思唯尔,47(4):547–553,2009。

项目潘德雷肯+唐克斯:农业命运大订单的多任务特征提取

原文:https://towardsdatascience.com/project-pendragon-tonks-multi-task-feature-extraction-for-farming-fate-grand-order-af077b7aafd2?source=collection_archive---------60-----------------------

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

不写数据科学博客时,我在一家名为 ShopRunner 的电子商务公司担任高级数据科学家。在过去的一年里,我们的团队一直在构建大型多任务深度学习集成,以使用图像和文本来预测我们产品目录中产品的相关时尚属性和特征。最近,我们的团队开源了我们内部构建的主要培训管道和框架,以在一个名为 Tonks 的包中培训我们的多任务学习者。Tonks 可以安装在 pypi 上,源代码可以在 GitHub 这里获得。

在我们讨论开源 Tonks 的过程中,我意识到一个潜在的早期用例可能是升级我的一个辅助项目,我正在构建一系列强化学习(RL)代理来玩手机游戏《命运大订单(FGO)》,我给它起了个绰号叫“潘德雷肯项目”。

潘德雷肯项目有两个主要部分,特征提取管道,它将输入发送到 RL 代理,这些代理做出决策并将命令发送回游戏。虽然我扮演 FGO 的 RL 代理已经反复升级,但我的特征提取管道基本上还在一年前的位置。

这篇文章将介绍我如何替换我的原始特征提取管道,该管道使用三个大型卷积神经网络(两个 ResNet 50 和一个 ResNet 34),并用一个用多个数据集训练的 Tonks 多任务 ResNet 50 替换这三个模型。

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

早期版本的多个 RL 代理通过多任务网络从 FGO 手机游戏中提取信息来玩 FGO 内容。

唐克斯

我们的 ShopRunner 团队构建了基于 PyTorch 的 Tonks 库,帮助我们使用图像和文本构建大型多任务网络集合。在大多数用例中,我们关心的是能够根据提供的图像、描述、标题和其他信息返回产品的相关属性。

当你培养多任务学习者时,你通常是抱着这样的心态来解决问题的,即在一个任务中学到的特性可能对另一个任务有益。对于电子商务领域的我们来说,像这样的两个任务可能是服装长度和袖子长度,其中两个单一的任务模型可能会学习寻找线条和长度,而不担心颜色、图案和背景。当任务满足这些标准时,这意味着我们可以将任务组合成多任务网络,在 tanks 中,我们通过拥有一个核心模型(如图像的 ResNet 或文本的 Bert 模型)来实现这一点,并将这些核心模型的输出连接到我们各自的任务头

当你的任务都在同一个领域时,多任务学习是有用的,因为它让你建立和维护一个单一的模型,而不是使用多个单一任务的学习者。在我目前的管道中,我训练和使用 3 个大型 CNN,在那里我为以前的每个任务建立了定制的数据集。Tonks 旨在处理您使用定制数据集进行个别任务训练的情况,因此它可以帮助我减少需要维护的模型数量,并让我使用以前使用的数据集进行训练。

在构建多任务模型时要考虑的一点是,当任务不在相似的域内时,多任务模型可能会遭受破坏性干扰、,其中来自不同任务的冲突信号将模型拉向不同的方向。关于如何处理这种破坏性干扰的讨论可能是一个很好的后续帖子或讲座,但超出了本文的范围。对于我的 FGO 用例,我的直觉是这个问题是相当可行的,因为所有的任务都使用了 FGO 截图、类似的文本、调色板等等。所以我可能不会有破坏性干扰的问题。

更多关于唐克斯的细节请看我们的发布会帖子

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

首先,CNN 检测到攻击按钮,Python 向它发送了一个点击。在下一个屏幕上,另一个 CNN 检测到 5 种命令卡类型,RL 机器人根据该输入做出决定。

潘德雷肯项目

2018 年秋天,我开始制作一些基本的机器人来玩 FGO,但在我进入机器人的细节之前,我会快速概述一下 FGO 到底是什么。命运大令是一个回合制手机游戏,你可以选择 3 到 6 个不同属性和能力的角色。然后你用这支队伍去对抗一波又一波的敌人,直到所有的敌人或队伍被击败。

我建造这些机器人的主要动机是,作为 FGO 常规活动的一部分,玩家经常被要求数十次(如果不是数百次的话)重复游戏关卡。在最近的一次活动中,我在一周的时间里进行了 100 次农业操作,每一关花费 3-5 分钟(总共 5-8 小时)。因此,考虑到这一点,我认为建立一个机器人能够为我做这个重复性的任务将是一个伟大的附带项目!这个曾经简单的“副业”已经变成了一个有趣的分分合合长达一年的兔子洞,增加了许多有趣的东西,如多个强化学习代理和各种定制游戏环境。

尽管对围绕机器人的代码库以及如何做出决定进行了许多升级,但我真的没有接触过我的特征提取管道来为我的 RL 游戏机器人获取信息。

特征提取器一:现在轮到谁了?

FGO 是一个回合制游戏,为了让机器人玩这个游戏,我需要能够检测到什么时候该轮到他们了。我决定检测机器人何时开始行动的方法是在挑选指挥卡之前寻找出现在主战斗屏幕上的“攻击”按钮。

下面是一个主战斗界面的例子,攻击按钮在右下角突出显示。

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

右下角的攻击按钮,高亮显示。

我把这个网络分成两类,“攻击”和“不攻击”,基本上就是说这个网络被训练来检测攻击按钮是否出现在游戏屏幕的那个部分。如果是,那么这意味着轮到机器人了,你可以做一些有用的事情,比如在当前屏幕上采取行动/使用技能,或者继续前进,调出命令卡屏幕,在那里你可以选择 5 张卡中的哪一张来玩。

挑选指挥卡是 FGO 的主要战斗技巧。因此,一旦我能够检测到该轮到谁了,就该构建一个分类器来帮助我识别那一轮发了什么命令卡。我的第一批机器人使用这些信息进行算法上的游戏,而后来的机器人通过强化学习来训练选择要玩的牌,但作为特征提取过程的关键部分,它们都需要能够识别哪些牌已经被处理。

特征提取二:发了什么命令牌?

FGO 的主要战斗机械师在你的回合中挑选“指挥卡”。有三种类型的牌:“艺术”、“克星”和“快速”,每种类型的牌做的事情略有不同。每回合发 5 张牌,玩家必须从其中选择 3 张来玩该回合。下面是展示的 5 张卡片和挑选的 3 张卡片的样本。

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

样本命令卡和正在挑选的卡。特征提取模型预测 5 张卡中每一张的类型。这些预测随后被发送到一个“拣卡者”模型,该模型决定玩哪一个 3。

虽然我可以构建一个检测器来在幕后找到卡的位置,但我找到了一个更简单的解决方案。这些屏幕相对一致,卡片放在同一个位置,所以我选择做的是硬编码五个命令卡的位置,并从命令卡屏幕的截图中裁剪出来(见下面的示例)。然后,我将五张卡中的每一张都通过一个经过 PyTorch 训练的 CNN 来确定卡的“类型”。

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

彩色部分是发出的 5 张命令牌。

然后,可以将这些牌类型分类提供给各种 RL 代理,并用于决定在给定的回合中使用哪些牌。很长一段时间,这两个网络(攻击按钮和卡类型检测器)是我的第一个 FGO 强化机器人的核心特征提取器,昵称为潘德雷肯·阿尔特。他们让我做了一个机器人,可以在 FGO 进行主要的战斗,也可以以自动化的方式玩完整个游戏。从这一点开始,我真的只需要考虑玩游戏还需要哪些信息,以及如何从游戏中提取这些信息。

特征提取器三:我们在敌人的哪一波?

我添加到我的框架中的最后一个网络实际上是一个波计数器,我用它作为我的几个不同版本的机器人的输入。我添加这个的原因是 FGO 等级几乎总是有 1 到 3 个回合的敌人,你必须通过战斗,一个代理人可能想采取的行动可能取决于回合。例如,第一波敌人可能相对较弱,但第三波可能相当强,所以为第三波保留技能通常是一个好策略。

我在下面截图的顶部用红色突出显示了圆形柜台。

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

回合计数器显示当前回合和总回合数

虽然我可以使用某种光学字符识别来获得数字,但我真正关心的是告诉它是第 1 轮、第 2 轮还是第 3 轮,所以我训练 CNN 将三个类别映射到这些数字,每次检测到攻击按钮时,我都会检查当前是哪个回合数。

这三个网络实现了我需要的基本特征提取,但需要同时运行三个大型 CNN 会增加相当多的 GPU 或 CPU 计算开销和额外的存储(2 个 Resnet 50s 约为 220MB,1 个 Resnet 34 约为 84Mb)。

唐克斯培训管道

我们的 Tonks 管道遵循 Fastai 建立的通用框架,其中管道被组织成数据加载器、模型和学习器。我们最终使用各种帮助记账的字典来管理多个任务和多个数据集。

以下部分将显示出现在下面链接的培训笔记本中的代码片段,并讨论其中发生的事情。

我培训用的笔记本放在这里

Tonks 数据集和数据加载器

我们的自定义 Tonks 数据集(第 26 行)FGOImageDataset 遵循相当标准的 PyTorch 数据集布局,其中我们需要提供一种方法来索引适当的值,作为数据生成器的一部分(第 58-59 行),应用变换(第 61 行),并返回图像数据和标签(第 65 行)。

第 11–24 行的应用取决于我们是否在查看验证集的训练。我喜欢以这种格式保存转换,但这只是个人偏好。

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

fgo_tonks 笔记本的 14 号单元格

一旦我们创建了自定义的 Tonks 数据集类,我们就可以开始为我们的三个任务创建训练和验证数据集。流程的这一部分也非常类似于标准的 PyTorch 培训管道,您必须将培训和验证分割放入数据集,然后最终放入数据加载器。这里唯一的区别是我们有三个数据集,而不是普通的一个。

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

第 1–26 行显示了我们如何为这三个任务中的每一个准备训练和验证分割。第 28–37 行显示了我们如何创建一个数据加载器字典,我们将在接下来的步骤中使用它来创建 Tonks 的多任务多数据集数据加载器。

在上面这段代码中,我们使用我之前展示的自定义数据集类为每个类创建训练和验证数据集。这包括指定 x 和 y 输入(图像及其标签的文件路径)以及我们想要应用的转换。在这个管道中,我只是在训练集中使用了 ImageNet 标准化的随机裁剪,在验证集中只使用了标准化。一旦创建了数据集,我们就创建了一个基本 PyTorch 数据加载器的字典,其中键是任务的名称,值是与这些任务相关联的数据加载器。这里的想法是,我们可以跟踪我们应该为哪个数据集生成批次,作为我们多数据集训练管道的一部分。

下面的代码片段显示了我们如何将 PyTorch 数据加载器的两个字典放入两个 Tonks MultiDatasetLoaders 中。这些 Tonks 数据加载器是我们用来集成我们的多任务多数据集培训管道的。

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

Tonks 多数据集加载器

Tonks 网络架构示例

管道的下一个主要部分是模型。虽然我们提供了一些示例图像和文本模型架构,但是根据您的需求定制这些架构可能是有意义的。对我来说,我只是做了一个简单的基于 ResNet50 的架构,并将其连接到各个任务层。在 Tonks 中,我们用两个 PyTorch 模块指令来处理这一部分,称为pretrained_classifiersnew_classifiers。我们在这里的想法是,第一次训练网络时,我们将任务发送到new_classifiers字典,当我们保存训练好的网络时,这些任务将被移动到pretrained_classifier字典进行保存。然后在随后的运行中,我们可以将预先训练的任务头加载到pretrained_classifier字典中。这有助于我们跟踪在哪里应用学习率(因为您可能希望根据任务头之前是否进行过微调来获得不同的学习率)

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

加载 Tonks 模型

当我们加载一个 Tonks 模型的实例时,主要的输入在task_dictionary中。有两个潜在的选项:第一个是new_task_dict,这是您第一次训练模型时应该使用的选项,而第二个是pretrained_task_dict,这是您可以将任务放置在已经存在 Tonks 预训练权重的位置。对于我们在 ShopRunner 的人来说,这很有用,因为我们现在可以轻松地向现有模型添加新任务。

对于这个 FGO 的例子,我有三个全新的任务。我将把一个包含任务名称和每个任务中类别数量的字典放入一个名为new_task_dict的字典中,并在初始化模型类时将其输入到模型类中。这告诉 Tonks 模型创建三个任务头,每个任务头有一定数量的节点。

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

培养

一旦我们初始化了模型,在开始训练之前,我们需要做的就是为各种任务定义一个损失函数,指定一个优化器,分配学习率,创建我们的学习器,并调用 fit 函数。

对于这个管道,每个任务都是一个多类问题,所以我们使用交叉熵损失。当我们指定学习率时,我们可以为模型的不同部分指定不同的学习率。对于主要的 ResNet 部分,我们指定一个低的1e-4学习率,但是对于新的部分,我们指定一个更积极的1e-2学习率。这背后的主要思想是,我们并不真的想大幅改变 ResNet50 核心模型中的 ImageNet 权重,但由于新的分类器层是随机初始化的,所以我们可以更积极地调整它们。然后我们定义了一个调度器来降低每两个时期的学习率。

一旦完成,我们可以使用 Tonks MultiTaskLearner类定义我们的学习者。该类包含我们训练模型所需的所有功能,并接受我们之前加载的模型架构、训练和验证 Tonks 数据加载器以及任务字典,后者包含我们所有任务的映射,用于从我们的数据加载器中检索批处理。

最后,我们可以在我们的学习器上调用fit()。关于不同论点的细节,你可以查看我们的阅读文件

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

结果

一旦我完成了三任务 Tonks 网络的训练,我就必须用新的多任务网络替换我的项目潘德雷肯回购中的三个网络。由于 Tonks 是建立在 PyTorch 之上的,为了使用一个模型,您需要跟踪的只是模型架构和权重文件,因此您不一定需要安装 Tonks 及其所有依赖项来在新项目中使用经过训练的模型。

Tonks 模型在所有任务中表现强劲,到目前为止,我在 FGO pendragon 游戏界面的部署中没有遇到任何问题。在我继续改进我的 RL 代理人时,我一直在用 Tonks 模型进行我最近的其他开发。最近的部分是让代理使用协调的策略。

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

代理协调清除困难的内容。代理和机器人的特征提取基于这里训练的多任务 tonks 模型。

因此,虽然这个基于手机游戏的例子很可爱,但是在这里使用 Tonks 这样的框架的原因与我们研究工业规模问题的原因是一样的。它消除了我维护多个单一任务学习者网络的需要,并且我能够快速轻松地进行训练,因为我能够使用我之前构建的三个现有数据集。

Tonks 是一个库,我们的 ShopRunner 数据科学团队一直在使用它来构建工业规模的多任务深度学习集成,使用经过多个数据集训练的图像和文本。对我们来说,这使得我们的团队创建多任务模型来满足新的和变化的需求变得相对简单。由于培养多任务学习者是一个非常现实的需求,但目前还没有得到支持,我们开源了我们的工作,以帮助回馈数据科学社区。

项目:用分类机器学习算法预测心脏病

原文:https://towardsdatascience.com/project-predicting-heart-disease-with-classification-machine-learning-algorithms-fd69e6fdc9d6?source=collection_archive---------5-----------------------

你刚刚被聘为数据科学家

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

来源

目录

**1。简介:**场景&目标,特性&预测器

2。数据角力

**3。探索性数据分析:**相关性,小提琴&箱线图,按阳性&阴性心脏病患者筛选数据

**4。机器学习+预测分析:**为建模准备数据,建模/训练,混淆矩阵,特征重要性,predictions‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

5。结论

1.介绍

场景:

你刚刚被一家医院聘为数据科学家,这家医院有数量惊人的患者报告各种心脏症状。心脏病专家测量生命体征&将数据交给进行数据分析预测某些患者是否患有心脏病。我们想做一个机器学习算法,在那里我们可以训练我们的 AI 学习&从经验中改进。因此,我们想将患者分为心脏病阳性或阴性。

目标:

  • 预测病人是否应该被诊断为心脏病。这是一个二元结果。
    (+)= 1,患者诊断为心脏病
    阴性 (-) = 0,患者未诊断为心脏病
  • 用各种分类模型** &做实验,看看哪一个产生最大的精确度。**
  • 检查我们数据中的趋势** & 相关性**
  • 确定哪些特征对阳性/阴性心脏病诊断最重要****

特征和预测:

我们的预测因子** (Y,心脏病的阳性或阴性诊断)是由 13 个特征 (X)决定的:**

1.年龄 (#)
2。性别 : 1=男,0=女(二进制 )
3。( cp )胸痛类型(4 值- 序数):值 1:典型心绞痛,值 2:不典型心绞痛,值 3:非心绞痛性疼痛,值 4:无症状
4。( trestbps )静息血压(#)
5。( chol )血清胆固醇以毫克/分升计(#)
6。( fbs )空腹血糖> 120 mg/dl( 二进制 )(1 =真;
0 =假)7。( restecg )静息心电图结果(值 0,1,2)
8。( thalach )达到的最大心率(#)
9。( exang )运动诱发心绞痛(二元 ) (1 =是;
0 =否)10。( oldpeak ) =运动相对于休息诱发的 ST 段压低(#)
11。最大运动 ST 段的(斜率)(序数)(值 1:上坡,值 2:平,值 3:下坡)
12。( ca )透视着色的主要血管数(0–3,序数)13。( thal )达到的最大心率— ( 序数 ): 3 =正常;6 =修复缺陷;7 =可逆缺陷

注:我们的数据有 3 种类型的数据:

****(#):可以测量的定量数据

顺序数据:有顺序的分类数据(0,1,2,3 等)

二进制数据:其单元只能呈现两种可能状态的数据(0 & 1)

2.数据争论

**import** **numpy** **as** **np**
**import** **pandas** **as** **pd**
**import** **matplotlib** **as** **plt**
**import** **seaborn** **as** **sns**
**import** **matplotlib.pyplot** **as** **plt**filePath = '/Users/jarar_zaidi/Downloads/datasets-33180-43520-heart.csv'

data = pd.read_csv(filePath)

data.head(5)

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

帮助我们了解我们正在处理的数据。

**print("(Rows, columns): " + str(data.shape))
data.columns**

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

显示行数和列数。以及列名

**data.nunique(axis=0)***# returns the number of unique values for each variable.*

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

返回每个变量的唯一值的数量。

*#summarizes the count, mean, standard deviation, min, and max for numeric variables.*
**data.describe()**

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

汇总数字变量的计数、平均值、标准差、最小值和最大值。

*# Display the Missing Values*

**print(data.isna().sum())**

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

显示每列缺失值的数量。幸运的是我们没有。

让我们看看在我们的正&负二元预测器之间是否有一个好的比例。****

**data['target'].value_counts()**

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

看起来我们在两个二进制输出之间有一个很好的平衡。

3.探索性数据分析

相关

相关矩阵 -让我们看看所有变量之间的相关性

几秒钟之内,你就能看出某样东西与我们的预测器(目标)是正相关还是负相关。

*# calculate correlation matrix*

**corr = data.corr()
plt.subplots(figsize=(15,10))
sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))
sns.heatmap(corr, xticklabels=corr.columns,
            yticklabels=corr.columns, 
            annot=True,
            cmap=sns.diverging_palette(220, 20, as_cmap=True))**

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

我们可以看到胸痛(cp) &目标值(我们的预测值)之间存在正相关**。这是有道理的,因为胸痛越严重,患心脏病的几率就越大。Cp(胸痛),是具有 4 个值的顺序特征:值 1:典型心绞痛,值 2:不典型心绞痛,值 3:非心绞痛性疼痛,值 4:无症状。**

此外,我们发现运动诱发的心绞痛(exang) &与我们的预测因子呈负相关**。这是有道理的,因为当你运动时,你的心脏需要更多的血液,但狭窄的动脉会减缓血液流动。**

Pairplots 也是一种很好的方式,可以立即看到所有变量之间的相关性。但是你会看到我只用我们的数据中的连续列来制作它,因为有这么多的特征,很难看到每一个。因此,我将制作一个只有连续特征的配对图。

**subData = data[['age','trestbps','chol','thalach','oldpeak']]
sns.pairplot(subData)**

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

选择用连续的变量制作一个较小的 pairplot,以便更深入地研究这些关系。这也是一个很好的方法来看看他们之间是正相关还是负相关!****

**sns.catplot(x="target", y="oldpeak", hue="slope", kind="bar", data=data);

plt.title('ST depression (induced by exercise relative to rest) vs. Heart Disease',size=25)
plt.xlabel('Heart Disease',size=20)
plt.ylabel('ST depression',size=20)**

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

ST 段压低的发生是因为当心室处于静止状态并因此复极时。如果 ST 段中的迹线异常地低于基线,此可导致此心脏病。这支持了上面的图表,因为低 ST 段抑郁会使人们有更大的患心脏病的风险。而高度 ST 段压低被认为是正常的&健康的。斜率色调,指运动 ST 段峰值,取值:0:上升,1:平缓,2:下降)。两个阳性&阴性心脏病患者都表现出 3 个斜率类别的均等分布**。**

小提琴和盒子图

显示方框&图的优点是显示基本数据的统计,以及其分布。这些图通常用于比较给定变量在某些类别中的分布。

它显示了中值,IQR,&图基的栅栏。(最小值、第一个四分位数(Q1)、中值、第三个四分位数(Q3)和最大值)。

此外,它可以为我们提供数据中的异常值。

**plt.figure(figsize=(12,8))
sns.violinplot(x= 'target', y= 'oldpeak',hue="sex", inner='quartile',data= data )
plt.title("Thalach Level vs. Heart Disease",fontsize=20)
plt.xlabel("Heart Disease Target", fontsize=16)
plt.ylabel("Thalach Level", fontsize=16)**

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

我们可以看到,阴性和阳性患者的总体形状和分布差别很大**。阳性患者表现出较低的 ST 段压低水平中位数&,因此他们的数据分布在 0 & 2 之间,而阴性患者在 1 & 3 之间。此外,我们看不出男性&女性目标结果之间有多大差异。**

**plt.figure(figsize=(12,8))
sns.boxplot(x= 'target', y= 'thalach',hue="sex", data=data )
plt.title("ST depression Level vs. Heart Disease", fontsize=20)
plt.xlabel("Heart Disease Target",fontsize=16)
plt.ylabel("ST depression induced by exercise relative to rest", fontsize=16)**

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

阳性患者表现出增高的 ST 段压低水平中位数,而阴性患者的水平较低。此外,我们看不出男性&和女性**的目标结果有什么不同,除了男性的 ST 段下降幅度稍大。**

按阳性和阴性心脏病患者过滤数据

# Filtering data by POSITIVE Heart Disease patient
**pos_data = data[data['target']==1]
pos_data.describe()**

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

# Filtering data by NEGATIVE Heart Disease patient
**pos_data = data[data['target']==0]
pos_data.describe()**

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

**print("(Positive Patients ST depression): " + str(pos_data['oldpeak'].mean()))
print("(Negative Patients ST depression): " + str(neg_data['oldpeak'].mean()))**

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

**print("(Positive Patients thalach): " + str(pos_data['thalach'].mean()))
print("(Negative Patients thalach): " + str(neg_data['thalach'].mean()))**

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

对比阳性和阴性患者我们可以看到在我们的 13 特征的很多手段上有巨大的差异。通过检查细节,我们可以观察到阳性患者的最大心率增加,达到了** (thalach)平均值。此外,阳性患者表现出运动诱发的 ST 段压低相对于静息(oldpeak)约 1/3 的量。**

4.机器学习+预测分析

为建模准备数据

为建模准备数据,只需记住 ASN(赋值,拆分,规格化)。

AT22 将 13 个特征赋值给 X,&最后一列给我们的分类预测值,y

**X = data.iloc[:, :-1].values
y = data.iloc[:, -1].values**

SSplit**:数据集分为训练集和测试集**

**from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.2, random_state = 1)**

N 标准化:标准化数据将转换数据,使其分布的平均值为 0,标准差为 1。

**from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)**

建模/培训

现在,我们将在训练集&上训练各种分类模型**,看看哪个产生最高的准确度。我们将比较逻辑回归、K-NN(K-最近邻)、SVM(支持向量机)、Naives Bayes 分类器、决策树、随机森林和 XGBoost 的准确性。**

注:这些都是监督学习模型**。**

模型 1:逻辑回归

**from** **sklearn.metrics** **import** classification_report 
**from** **sklearn.linear_model** **import** LogisticRegression

**model1 = LogisticRegression(random_state=1)** *# get instance of model*
**model1.fit(x_train, y_train)** *# Train/Fit model* 

**y_pred1 = model1.predict(x_test)** *# get y predictions*
**print(classification_report(y_test, y_pred1))** *# output accuracy*

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

准确率 74%

模型 2:K-NN(K-最近邻)

**from** **sklearn.metrics** **import** classification_report 
**from** **sklearn.neighbors** **import** KNeighborsClassifier

**model2 = KNeighborsClassifier()** *# get instance of model*
**model2.fit(x_train, y_train)** *# Train/Fit model* 

**y_pred2 = model2.predict(x_test)** *# get y predictions*
**print(classification_report(y_test, y_pred2))** *# output accuracy*

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

准确率 75%

模型三:SVM(支持向量机)

**from** **sklearn.metrics** **import** classification_report 
**from** **sklearn.svm** **import** **SVC**

**model3 = SVC(random_state=1)** *# get instance of model*
**model3.fit(x_train, y_train)** *# Train/Fit model* 

**y_pred3 = model3.predict(x_test)** *# get y predictions*
**print(classification_report(y_test, y_pred3))** *# output accuracy*

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

准确率 75%

模型 4: Naives 贝叶斯分类器

**from** **sklearn.metrics** **import** classification_report 
**from** **sklearn.naive_bayes** **import** GaussianNB

**model4 = GaussianNB()** *# get instance of model*
**model4.fit(x_train, y_train)** *# Train/Fit model* 

**y_pred4 = model4.predict(x_test)** *# get y predictions*
**print(classification_report(y_test, y_pred4))** *# output accuracy*

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

准确率 77%

模型 5:决策树

**from** **sklearn.metrics** **import** classification_report 
**from** **sklearn.tree** **import** DecisionTreeClassifier
 **model5 = DecisionTreeClassifier(random_state=1)** *# get instance of model*
**model5.fit(x_train, y_train)** *# Train/Fit model* 

**y_pred5 = model5.predict(x_test)** *# get y predictions*
**print(classification_report(y_test, y_pred5))** *# output accuracy*

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

准确率 69%

****模式六:随机森林🏆

**from** **sklearn.metrics** **import** classification_report 
**from** **sklearn.ensemble** **import** RandomForestClassifier

**model6 = RandomForestClassifier(random_state=1)***# get instance of model*
**model6.fit(x_train, y_train)** *# Train/Fit model* 

**y_pred6 = model6.predict(x_test)** *# get y predictions*
**print(classification_report(y_test, y_pred6))** *# output accuracy*

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

****准确率 80%!🏆

型号 7: XGBoost

**from** **xgboost** **import** XGBClassifier
 **model7 = XGBClassifier(random_state=1)
model7.fit(x_train, y_train)
y_pred7 = model7.predict(x_test)
print(classification_report(y_test, y_pred7))**

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

准确率 69%

通过比较这 7 个模型,我们可以得出结论:模型 6:随机森林产生的精确度最高**。准确率高达 80%。🏆**

精度、召回、F1-得分支持:

精度:是“该类中有多少被正确分类”

回想一下:“你在这个类的所有元素中找到了多少个这样的元素”

F1-得分:调和表示精度和召回值的
F1 得分在 1 时达到最佳值,在 0 时达到最差值。
F1 得分= 2 x((精度 x 召回)/(精度+召回))

支持:响应的样本数,即位于该类中。**

制作混淆矩阵

**from sklearn.metrics import confusion_matrix, accuracy_score
cm = confusion_matrix(y_test, y_pred6)
print(cm)
accuracy_score(y_test, y_pred6)**

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

注意:一个好的经验法则是任何高于 70% 的精度都被认为是好的,但是要小心,因为如果你的精度非常高,它可能好得不真实(一个过度拟合的例子)。因此,80%是的理想精度!****

如何解读混淆矩阵:

21 是我们数据中真阳性的数量,而 28 是真阴性的数量。****

9 和 3 是错误的数量。

有 9 个类型 1 错误(假阳性)** -你预测阳性,它是假的。**

有 3 个类型 2 错误** 【假阴性】——你预测阴性,是假的。**

因此,如果我们计算准确度**,它的#正确预测/ #总数。
换句话说,其中 TP、FN、FP 和 TN 代表真阳性、假阴性、假阳性和真阴性的数量。**

精度 = (TP + TN)/(TP + TN + FP + FN)。
精度=(21+28)/(21+28+9+3)= 0.80 =80%精度

特征重要性

特性重要性提供了一个分数,表明每个特性在我们的模型中有多有用

特征得分越高,用于做出关键决策的特征越多&因此越重要。****

*# get importance*
**importance = model6.feature_importances_**

*# summarize feature importance*
**for i,v in enumerate(importance):
    print('Feature: %0d, Score: %.5f' % (i,v))**

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

**index= data.columns[:-1]
importance = pd.Series(model6.feature_importances_, index=index)
importance.nlargest(13).plot(kind='barh', colormap='winter')**

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

从上面的特征重要性图中,我们可以得出结论,前 4 个显著特征分别是胸痛类型( cp )、达到的最大心率( thalach )、主要血管数量( ca )以及运动相对于休息诱发的 st 段压低( oldpeak )。

预言

S cenario :一个病人出现心脏症状&你把他的生命体征输入机器学习算法。

他是一名 20 岁男性,胸痛值2**(非典型心绞痛),静息血压**110。****

此外,他的血清胆固醇水平为 230 毫克/分升。

他是空腹血糖> 120 mg/dl。****

他有一个 1 的静息心电图结果。****

**患者达到的最大心率**是 140。

还有,他是运动诱发的心绞痛。****

他的运动诱发的 ST 段压低**相对于休息值为 2.2。**

峰值运动 ST 段的坡度平**。**

他的没有透视着色的大血管**,此外他的达到的最大心率是可逆的缺陷。**

根据这些信息,你能这个心脏病患者分类吗?

**print(model6.predict(sc.transform([[20,1,2,110,230,1,1,140,1,2.2,2,0,2]])))**

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

****输出二进制 1 - >意为阳性心脏病诊断

预测测试集结果:

第一个值**代表我们的 预测值第二个值代表我们的实际值。

如果值匹配,那么我们正确预测了*。*****

*****y_pred = model6.predict(x_test)
print(np.concatenate((y_pred.reshape(len(y_pred),1), y_test.reshape(len(y_test),1)),1))*****

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

可以看到我们的结果非常准确(80%)****

结论

1。在我们检查的 13 个特征中,有助于我们在阳性&阴性诊断之间进行分类的前 4 个显著特征是胸痛类型(cp)、达到的最大心率(thalach)、主要血管数量(ca)和运动相对于休息诱发的 st 段压低(oldpeak)。

2。我们的机器学习算法现在可以对心脏病患者进行分类。现在我们可以正确地诊断病人,给他们康复所需的帮助。通过早期诊断和检测这些特征,我们可以防止以后出现更糟糕的症状。

3。我们的随机森林算法产生最高的准确率,80%。任何超过 70%的准确度都被认为是好的,但是要小心,因为如果你的准确度非常高,可能好得不像真的(过度拟合的一个例子)。因此,80%是理想的准确度!

以下是从我的 GitHub 页面获得的数据集和代码:

https://github . com/jzaidi 143/Project-Predicting-Heart-Disease-with-class ification-Machine-Learning-Algorithms

欢迎推荐和评论!

致谢

创作者:

  1. 匈牙利心脏病研究所。布达佩斯:医学博士安朵斯·雅诺西
  2. 瑞士苏黎世大学医院:威廉·斯坦布伦医学博士
  3. 瑞士巴塞尔大学医院:马蒂亚斯·菲斯特勒医学博士
  4. 弗吉尼亚医疗中心,长滩和克利夫兰诊所基金会:罗伯特·德特拉诺,医学博士,哲学博士。

捐赠者:
大卫·w·阿哈(阿哈’ @ ’ ics.uci.edu)(714)856–8779

数据科学编码练习项目报告

原文:https://towardsdatascience.com/project-report-for-data-science-coding-exercise-9a9c76a09be8?source=collection_archive---------13-----------------------

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

Benjamin O. Tayo 的图片

数据科学带回家的编码挑战问题的示例项目报告

一.导言

带回家的挑战问题或编码练习是数据科学家面试流程中最重要的一步。这通常是一个数据科学问题,例如机器学习模型、线性回归、分类问题、时间序列分析等。一般来说,面试团队会给你提供项目方向和数据集。

一些编码挑战问题会指定一个正式的项目报告与一个 Jupyter 笔记本或 R 脚本文件一起提交。这篇文章将提供一些关于如何为带回家的编码挑战问题写一份正式的项目报告的指南。

本文组织如下。在第二部分中,我们描述了项目陈述和项目目标。在第三章中,我们描述了一个问题的示例解决方案,包括数据集、代码和输出。在第四部分,我们提交了一份关于带回家挑战问题的项目报告样本。一个简短的总结结束了这篇文章。

二。项目说明

在这个问题中,你将预测贷款组合的结果。每笔贷款计划在 3 年内偿还,结构如下:

  • 首先,借款人收到资金。这个事件被称为起源。
  • 然后,借款人定期还款,直到发生以下情况之一:

(i)借款人在 3 年期限结束前停止付款,通常是由于财务困难。这一事件被称为销账,然后贷款被称为已销账。

(ii)借款人继续还款,直到发放日之后 3 年。至此,债务已全部还清。

在附加的 CSV 中,每行对应一笔贷款,列的定义如下:

  • 标题为“自发起以来的天数”的列表示发起和数据收集日期之间经过的天数。
  • 对于在收集数据之前已经销账的贷款,标题为“从发起到销账的天数”的列表示发起和销账之间经过的天数。对于所有其他贷款,此栏为空白。

目标 :我们希望您估计这些贷款在全部 3 年期限结束时将会被冲销的比例。请包括你如何得到你的答案的一个严格的解释,并且包括你使用的任何代码。你可以做出简化的假设,但是请明确地陈述这些假设。 请随意以您喜欢的任何格式提交您的答案;特别是 PDF 和 Jupyter 笔记本都不错 。此外,我们希望这个项目不会占用您超过 3-6 个小时的时间。

三。项目数据集、代码和示例输出

这个问题的数据集和建议的解决方案(包括代码和输出)可以从下面的链接下载:

贷款状况的蒙特卡洛模拟

: 以上给出的建议解决方案是我对该问题的解决方案版本。请记住,数据科学或机器学习项目的解决方案不是唯一的。欢迎你自己尝试这个问题,提出你自己的预测模型。

四。项目报告

完成项目的编码部分后,是时候整理一份正式的项目报告了。下面是该项目的样本报告。

利用蒙特卡罗模拟预测贷款状况

**摘要:**使用所提供的数据集,我们建立了一个简单的模型,使用蒙特卡罗(MC)模拟来预测贷款在 3 年期限后违约的比例。对于 N = 1000 个数据集复制副本的蒙特卡洛模拟,我们的模型显示了 14.8% ± 0.2%的 95%置信区间。

关键词:贷款状态、贷款发放、贷款核销、蒙特卡洛模拟、预测分析

**引言:**预测贷款的状况是风险评估中的一个重要问题。银行或金融机构在向客户发放贷款之前,必须能够估计所涉及的风险。数据科学和预测分析技术可以用来预测贷款违约的概率。在本项目中,我们获得了包含 50000 个数据点的loan _ timing . CSV数据集。每个数据点代表一笔贷款,提供两个特征如下:

  • 标题为“自发起以来的天数”的列表示从发起到收集数据的日期之间经过的天数。
  • 对于在收集数据之前销账的贷款,标题为“从发起到销账的天”的列表示发起和销账之间经过的天数。对于所有其他贷款,此栏为空白。

**项目目标:**这个项目的目标是使用数据科学的技术来估计这些贷款在所有三年期限结束时已经注销的部分。

**探索性数据分析:**数据集在 R 中很重要,使用 R 进行计算。我们绘制了下图:

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

图 1 :当前贷款自发放以来的天数直方图。

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

图 2 :违约贷款销账天数柱状图。

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

图 3 :违约贷款发放以来天数柱状图。

图 1 显示了当前(活跃)贷款的直方图,该直方图具有很好的近似性,自发放以来在几天内均匀分布。

图 2 中,我们看到从发放到核销的贷款比例随着天数的增加而减少。这说明越年轻的贷款违约概率越大。它还显示,100%的贷款在自发放日起的 2 年内(730 天)违约。

图 3 显示了从发放贷款到收集贷款状态数据期间的违约贷款分布情况。违约贷款中有很大一部分(71%)是一年或一年以上的贷款。

我们进行了蒙特卡洛模拟,以研究违约贷款的核销天数和发放后天数之间的关系,并将结果与原始样本数据进行比较,如图图 4 和 **5 所示。**由于贷款核销存在随机性(随机过程),我们看到蒙特卡罗模拟为违约贷款的分布提供了合理的近似。

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

图 4 :违约贷款的核销天数与发放后天数的关系图。

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

图 5 :违约贷款的核销天数与发放后天数的蒙特卡洛模拟。

**模型选择:**我们的数据集只有 2 个特征或预测因子,并且避开了流行性问题:93%的贷款具有活跃(当前)状态,而 7%具有违约状态。使用线性回归来预测 3 年贷款期限后将被注销的贷款部分,将产生一个偏向于活跃贷款的模型。

图 45 表明,可以使用蒙特卡罗方法模拟违约贷款的核销天数和发放后天数之间的关系。因此,我们选择蒙特卡洛模拟作为我们预测贷款违约比例的模型。

**预测:**由于我们已经证明,在最初 2 年(即 0 至 730 天)中,可以使用蒙特卡罗模拟来近似计算待核销天数和自发放以来的天数之间的关系,因此我们可以使用相同的方法来预测在所有 3 年期限结束时将被核销的贷款比例。

我们数据集中冲销贷款的总数是 3,305。这意味着目前有 46,695 笔贷款处于活跃状态。在这些活跃的贷款中,一定比例的贷款将在 3 年内违约。为了估计违约贷款的总比例,我们模拟了涵盖整个贷款期限(即 0 至 1095 天)的冲销和自发放以来的天数的违约贷款,然后通过适当的缩放,我们计算了将在 3 年期限(即 1095 天)后冲销的贷款比例。

通过创建 1000 个随机试验,我们获得了 3 年贷款期限内违约贷款比例的以下分布(见图 6 ):

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

图 6 :使用 N = 1000 个样本的 3 年期后冲销贷款比例直方图。

根据我们的计算,3 年贷款期限后将被冲销的贷款部分的 95%置信区间相应地为 14.8% ± 0.2%。

**结论:**我们提出了一个基于蒙特卡罗模拟的简单模型,用于预测在 3 年贷款期限结束时将违约的贷款比例。可以使用不同的模型,例如逻辑回归、决策树等。这将是一个好主意,尝试这些不同的方法,看看是否结果是可比的蒙特卡洛模拟结果。

附录:用于执行数据分析的 R 代码

***# R CODE FOR PREDICTING LOAN STATUS*** *#author: Benjamin O. Tayo
#Date: 11/22/2018****# IMPORT NECESSARY LIBRARIES*** library(readr)
library(tidyverse)
library(broom)
library(caret)***# IMPORTATION OF DATASET*** df<-read_csv("loan_timing.csv",na="NA")
names(df)=c("origination","chargeoff")***#partition dataset into two: default (charged off ) and current*** index<-which(!(df$chargeoff=="NA"))
default<-df%>%slice(index)
current<-df%>%slice(-index)***# EXPLORATORY DATA ANALYSIS*****# Figure 1: Histogram of days since origination for current loans**current%>%ggplot(aes(origination))+geom_histogram(color="white",fill="skyblue")+ xlab('days since origination')+ylab('count')+ ggtitle("Histogram of days since origination for current loans")+ theme(plot.title = element_text(color="black", size=12, hjust=0.5, face="bold"),axis.title.x = element_text(color="black", size=12, face="bold"),axis.title.y = element_text(color="black", size=12, face="bold"),legend.title = element_blank())***# Figure 2: Histogram of days to charge-off for defaulted loans***default%>%ggplot(aes(chargeoff))+geom_histogram(color="white",fill="skyblue")+ xlab('days to charge-off')+ylab('count')+ ggtitle("Histogram of days to charge-off for defaulted loans")+ theme(plot.title = element_text(color="black", size=12, hjust=0.5, face="bold"), axis.title.x = element_text(color="black", size=12, face="bold"), axis.title.y = element_text(color="black", size=12, face="bold"), legend.title = element_blank())***# Figure 3: Histogram of days since origination for defaulted loans***default%>%ggplot(aes(origination))+geom_histogram(color="white",fill="skyblue")+ xlab('days since origination')+ylab('count')+ ggtitle("Histogram of days since origination for defaulted loans")+ theme(plot.title = element_text(color="black", size=12, hjust=0.5, face="bold"),axis.title.x = element_text(color="black", size=12, face="bold"),axis.title.y = element_text(color="black", size=12, face="bold"), legend.title = element_blank())***# Figure 4: Plot of days to charge-off vs. days since origination for defaulted loans***default%>%ggplot(aes(origination,chargeoff))+geom_point()+ xlab('days since origination')+ylab('days to charge-off')+ ggtitle("days to charge-off vs. days since origination")+ 
theme( plot.title = element_text(color="black", size=12, hjust=0.5, face="bold"), axis.title.x = element_text(color="black", size=12, face="bold"), axis.title.y = element_text(color="black", size=12, face="bold"),legend.title = element_blank())***# Figure 5: Monte Carlo Simulation of Defaulted Loans***set.seed(2)
N <- 3*365 ***# loan duration in days***
df_MC<-data.frame(u=round(runif(15500,0,N)),v=round(runif(15500,0,N)))
df_MC<-df_MC%>%filter(v<=u)
df_MC<-df_MC%>%filter(u<=730 & v<=730) ***#select loans within first 2 years***df_MC[1:nrow(default),]%>%ggplot(aes(u,v))+geom_point()+ xlab('days since origination')+ylab('days to charge-off')+ ggtitle("MC simulation of days to charge-off vs. days since origination")+ theme(plot.title = element_text(color="black", size=12, hjust=0.5, face="bold"),axis.title.x = element_text(color="black", size=12, face="bold"),axis.title.y = element_text(color="black", size=12, face="bold"),legend.title = element_blank())***# Predicting fraction of these loans will have charged off by the time all of their 3-year terms are finished***set.seed(2)
B<-1000
fraction<-replicate(B, {
df2<-data.frame(u=round(runif(50000,0,N)),v=round(runif(50000,0,N))) df2<-df2%>%filter(v<=u) 
b2<-(df2%>%filter(u<=730 & v<=730))
total<-(nrow(df2)/nrow(b2))*nrow(default)
100.0*(total/50000.0)})***# Figure 6: Histogram for fraction of charged off loans after 3-year term using N = 1000 samples***fdf<-data.frame(fraction=fraction)
fdf%>%ggplot(aes(fraction))+geom_histogram(color="white",fill="skyblue")+ xlab('fraction of charged off loans after 3-year term')+ylab('count')+ ggtitle("Histogram of total fraction of charged off loans")+ 
theme( plot.title = element_text(color="black", size=12, hjust=0.5, face="bold"),axis.title.x = element_text(color="black", size=12, face="bold"),axis.title.y = element_text(color="black", size=12, face="bold"),legend.title = element_blank())***# Calculate Confidence Interval for Percentage of Defaulted Loans After 3-year Term***mean<-mean(fraction)
sd<-sd(fraction)
confidence_interval<-c(mean-2*sd, mean+2*sd)

动词 (verb 的缩写)摘要

总之,我们已经描述了如何撰写数据科学带回家挑战的项目报告。一些数据科学家的工作面试会要求申请人提交一份正式的项目报告以及一个 Jupyter 笔记本或 R 脚本文件。这里提供的指导方针可以用来为带回家的编码练习准备正式的项目报告。

参考

  1. 贷款状况的蒙特卡洛模拟
  2. 数据科学家编码练习
  3. 数据科学家面试流程——个人经历。

数据科学初学者项目时间表

原文:https://towardsdatascience.com/project-timeline-for-data-science-beginners-83b7106e44e1?source=collection_archive---------33-----------------------

并回答这个问题:我该从哪里开始呢?我如何进步???

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

布鲁克·卡吉尔Unsplash 拍摄的照片

整整两个月前,我决定开始我的编码之旅。我发现很少有文章给出初学者友好的编程管道。是时候分享了!

如何利用数据分析来回答棘手的问题?

在这篇文章中,你会发现:

  • 从哪里开始?用于编程的编码平台/环境
  • **初学者项目哪里找灵感。**如何从每个项目中学习而不被卡住
  • 当我们遇到卡住时该怎么办

如果您还不是会员,请在此获得您的中级会员资格!

人们实际上在哪里编码?

在线课程很少提到数据科学过程中第一步也是最关键的一步。**想开始编码的时候下载哪些工具!**为此,我推荐两种可能的集成开发环境(ide):

皮查姆

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

Pycharm: 计算机编程中使用的集成开发环境,专门针对 Python 语言。它是由捷克公司 JetBrains 开发的。

Pycharm 太棒了!有很多视频解释如何设置软件和运行代码。对于初学者来说,这个 IDE 提供了您需要的一切,而不会使用户界面过于复杂。随着你越来越有经验,它提供了专业人员将用于机器学习、模型训练等的所有功能。

显然,生活中没有免费的东西。该软件允许 30 天的试用期,对学生完全免费。你不会因为尝试而失去任何东西,如果你在几个项目后看到了编码的未来,那么这是你可能做出的最好投资

朱皮特

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

Jupyter:一个开源的网络应用程序,允许你创建和分享包含实时代码、公式、可视化和解释文本的文档。用途包括:数据清理和转换,数值模拟,统计建模,机器学习等等。

Jupyter 很容易使用,对初学者友好,但当你尝试做更高级的事情时,它不会为你工作。然而,这是一个很好的起点。现在好消息来了,它完全免费了!

去哪里找项目的灵感?

作为一个完全的初学者,很难评估一个项目的难度。许多东西会使项目变得更加困难:函数、库、数据集或弃用。你怎么知道该去做哪个项目?

选择适合您的项目:

  1. 选择一个你感兴趣的话题,比如电影收视率,离婚率,销售,流浪狗…任何事!
  2. 找一个数据集(真正好的网站包括 KaggleDataWorld 等等)
  3. 找一个做过类似项目的人
  4. 复制项目,对其进行改进,并使用类似的数据集进行同样的尝试。

你可以在 Kaggle 上的内核标签下找到好的示例项目。Medium 的走向数据科学出版物拥有数百名作家,他们分享他们的项目,并带你走过每一步。

当心几件可能让你的生活变得困难的事情:

  • **导入的库数量:**单个项目中超过 6 或 7 个库可能对初学者不友好。库允许我们为特定的数据类型或数学应用程序使用函数和执行子程序。例如 Seaborn 执行绘图, xlrd 处理 excel 文件, Numpy 允许数学计算等。库越多,你需要学习/理解的东西就越多,项目就越复杂。
  • 带注释的代码:写代码的时候,注释会添加关于代码的信息,让代码更容易理解。如果别人的项目得到了很好的评论,他们会花时间解释和思考每一行代码,然后再把它发布到互联网上。
  • **发布年份:**寻找不超过现在 2 年的项目实例。函数、库和编程语言每隔几年就会更新或被弃用,你需要确保你使用的是最新的。

面向初学者的数据分析项目时间表:

1.探索性数据分析和可视化:

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

酒评

学到的技能:熊猫数据集

这个示例项目将向您介绍如何在编码环境中创建和导入数据集。然后,它将引导您完成探索性数据分析的早期阶段。完全新手的绝佳起点!

每个城市的婚姻数量

已学技能:绘图入门

这个项目将以非常详细和初学者友好的方式向你介绍绘制条形图。这些数据来自电视节目《一见钟情》的数据集,它是数字和分类数据的健康组合。

《权力的游戏》收视率

学到的技能:更多的初学绘图技术

这个数据集提供了从 IMDb 网站提取的信息,包括每集的名称,收视率,观看次数和值得注意的人物死亡数。该项目示例将带您浏览条形图和散点图。

美国致命枪击案(2015–2020)

所学技能:探索性数据分析(EDA)

这个项目示例将让您对深度探索性数据分析有一个很好的了解。变量,如年,天,种族,年龄,地区,性别,背景进行了比较和对比,以得出关于美国致命枪击事件的见解。

新西兰战胜冠状病毒

学到的技能:首先浏览一个 数据集

谷歌移动性报告发布了世界所有国家的数据,跟踪药店、零售店、公园和办公室的访问量。这个项目使用的数据集特别大,可以让你解决诸如速度效率等问题。按国家、地区或日期过滤将是针对该数据集使用的主要工具。

澳大利亚房地产价格

学到的技能:地理空间绘图(很酷的地图!)和高级图表

这个项目将向你介绍一个基于澳大利亚房地产价格的非常大的数据集。它将向你介绍空间绘图(非常令人兴奋!)等高级剧情使用了强大的 Seaborn 库。

2.回归模型

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

回归是一种用于金融、投资和其他学科的统计方法,试图确定一个因变量(通常用 Y 表示)和一系列其他变量(称为自变量)之间关系的强度和特征。

温度影响啤酒消费吗?

学到的技能:你的第一个回归模型项目

该数据集收集了巴西圣保罗学生社区的天气和啤酒消费变化。

所有的绘图基础都包括在这个项目中,包括小提琴图,饼图,线图和条形图一步一步地解释。这个例子中还包含了一个非常简单的线性回归模型,使用著名的 sklearn 库来预测啤酒消费量。

Strava 活动追踪应用

学到的技能:完整的机器学习项目工作流程

对于那些想看看完整的 ML 管道的人来说,这是一个很好的项目。使用的数据来自应用程序“Strava ”,它记录体育活动并与社区共享。它使用均方根误差(rmse)来设置回归模型的参数。

这个项目比较了多个模型的表现,并选择了最适合的模型来回答这个问题:我们能预测一项锻炼将获得的点赞数吗?

普查收入数据

学到的技能:主成分分析

降维是将数据从高维空间转换到低维空间。使得分析更快更容易。主成分分析(PCA)是一种用于主成分分析的方法。

这个非常详细记录的项目将带你通过清洁和减少过程。

医疗保险费用

学到的技能 : 高级绘图和线性回归

这个项目将为您提供先进的绘图可视化的例子,也将提供另一个线性回归模型的例子。最终目标是准确预测病人的医疗费用。此回归模型使用了 RandomForestRegressor 算法。

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

自然语言处理

自然语言处理是语言学、计算机科学、信息工程和人工智能的一个分支,涉及计算机和人类语言之间的交互,特别是如何对计算机进行编程以处理和分析大量自然语言数据。

WhatsApp 聊天分析

学到的技能:自然语言处理(NLP)数据清理。

非常适合从未接触过文本文件的初学者。在这个项目中,您将导入您的 WhatsApp 对话,并执行深入的数据清理。这是数据分析中至关重要的一步,尤其是当我们谈论“语言数据”的时候。在计算机的眼里,单词和数字是非常不同的…

姜懿翔·川普发推文

学到的技能:全面的自然语言处理项目

自然语言处理初学者的一个非常好的项目。该工作流将引导您完成数据清理和探索。然后,它会使用“【nltk】【自然语言工具包】 库,这将允许你应用机器学习来训练唐纳德·特朗普的推文模型。

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

网络

莎士比亚戏剧

学到的技能:网络可视化

这个项目将引导你在绘制和可视化莎士比亚剧目中的戏剧和角色网络之前,进行深入的数据探索。这是一个很好的网络介绍,也是戏剧爱好者的理想选择!

利用网络,它会找到最有影响力的人物以及这些人物拥有的联系数量。

爱尔兰天气每小时数据

学到的技能:数据随季节变化

该数据集包含来自爱尔兰 15 个县的 25 个站点的数据。从开始记录到 2018 年底,这些气象站可以获得每小时的数据。所有数据来源于爱尔兰气象局。该数据集可与自行车使用数据集结合使用。

当我们陷入困境时该怎么办

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

  • 检查您的数据:确保您正在分析的数据集的列中没有无效值。检查是否有缺失值或错误的数据类型。
  • 打印出错误之前的所有内容:确保整个过程没有出错。有时当使用函数或子程序时,我们没有预料到的事情会修改我们的数据。
  • 改变库:如果你在使用 Matplotlib 绘制条形图时遇到问题,可以使用 Seaborn 库计算出等价的结果。这是一个简单的方法,但是尝试不同的库并看看什么适合你并不可耻。
  • 求助,网络社区是你的朋友!我最喜欢的网站是 Stack Overflow。如上所述,当使用在线资源时,确保考虑到出版年份。

非常感谢你的阅读!

更多类似的文章,请点击这里在 Medium 上找到我!

如果你有任何关于如何改进的问题建议想法,请在下面留下评论或通过 LinkedIn 这里取得联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值