TowardsDataScience 博客中文翻译 2016~2018(一百一十四)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

联邦拜占庭协议

原文:https://towardsdatascience.com/federated-byzantine-agreement-24ec57bf36e0?source=collection_archive---------3-----------------------

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

随着区块链技术获得牵引力,开发人员越来越多地调整和试验共识机制

达成共识的最传统方式是通过拜占庭协议(区块链技术中的一个基本概念)。区块链上的节点通过对给定问题的解决方案达成共识来验证数据块。当某个最小数量的节点(称为法定人数)同意所给出的解决方案是正确的时,就达成了拜占庭协议,从而验证了一个块并允许其包含在区块链上。

联邦拜占庭协议

涟漪区块链首创了联邦拜占庭协议(FBA)共识机制。恒星区块链进一步完善了这种方法,采用了第一个可证明安全的 FBA 协议。在 FBA 系统中,每个节点不必提前知道和验证,成员是开放的,控制是分散的。节点可以选择信任谁。系统范围的法定人数是由单个节点做出的决定形成的。

法定切片

法定人数是系统内达成一致所需的节点数量。FBA 改用“仲裁片”。仲裁片是仲裁的子集,它可以说服另一个特定节点同意。

一个节点可以依赖于许多切片,并且节点的选择可以依赖于外部标准。例如,“节点 X”可以说,“为了达成共识,我们必须让我们选择的五家银行中的三家的节点参与进来”。五个存储体中的三个现在可以确定节点 X 是否同意。增加另一层复杂性节点 X 可能是另一个节点的仲裁片的一部分。

如果将一个节点编程为依赖于一个法定切片,用户必须相信该法定切片是足够可信的,如果它同意某件事,该节点肯定会同意。

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

A Quorum slice.

法定交集

信任是在节点的配置文件中建立的。由于节点可能具有不同的配置文件,因此网络中的片和定额可以动态形成。好的法定人数共享节点,导致法定人数重叠。这种重叠被称为“法定交集”。当法定人数不相交时,系统以‘不相交的法定人数’结束。不相交的法定人数是不可取的,因为他们中的每一个都可以独立地同时就矛盾的事务达成一致,从而破坏了整体共识。

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

Quorum Intersections.

阻塞与发散状态

区块链应该又快又安全。如果节点在达成协议的过程中被“阻塞”,区块链就会变慢。当区块链上的节点呈现不同于其他节点的值时,系统是“发散的”。发散的系统比阻塞的系统更危险:阻塞的系统只是速度慢,但是发散的系统开始显示矛盾的数据。

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

3 Disjoint Quorums.

FBA 的优势

开放成员和分散控制

没有看门人或中央机构—单个节点可以决定信任谁来获取信息

选择每个节点信任谁的能力分散了网络

节点可以有多个切片

进入门槛低(任何人都可以加入)

面对故障时保持稳健(一个节点可以关闭,而系统的其余部分将保持完整)

可以对节点进行编程,使其信任仲裁片或外部源,具体取决于其随时间推移的性能

单个节点的选择可以基于外部标准(例如,属于汽车金融公司的节点可能需要来自可信的银行节点、可信的信贷机构以及与机动车辆部门相关联的节点的确认,以接受有效的交易)

结论

FBA 分类帐可以是最新的和准确的,而不要求其所有节点一致。相反,每个节点的选择会产生一个法定人数。

法定切片可以说服单个节点达成一致,而法定切片可以说服整个系统达成一致。如果某个节点发现某个特定的仲裁片完全可信,它可以同意接受该仲裁片同意的任何内容。

传统拜占庭协议系统和 FBA 系统的区别在于,在后者中,每个节点选择自己的法定切片。

沙安雷

关注媒体上的 Lansaar Research ,了解最新的新兴技术和新的商业模式。

对手中稀疏的数据感到气馁?给因式分解机一个机会(1)

原文:https://towardsdatascience.com/feel-discouraged-by-sparse-data-in-your-hand-give-factorization-machine-a-shot-1-7094628aa4ff?source=collection_archive---------11-----------------------

如果你是一名工业界的数据科学家,你是否有过这样的经历:面对你的客户,告诉他们由于数据稀疏,项目可能无法实现他们的期望?

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

的确,没有人能无草制砖。准确地说, 中的 大量 名副其实的 数据是数据科学家期待的‘稻草’。然而,事实并不总是如此。我们应该让数据的弱点阻止我们进行我们的项目吗?不要!

今天,我将介绍一个高性能模型,即使没有理想的数据,它也能产生出色的结果。就是 因式分解机 (FM)。

因式分解机 是 2012 年 Steffen Rendle 在日本大阪大学工作期间想出的。它已经成为推荐系统和文本分析的主流模型。

作者强调了 FM 的三大优势:

1。 对稀疏数据友好。

2。 线性计算复杂度。

3。 一个通用的预测器。

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

在阐明因式分解机之前,让我们用一个应用场景来描述这个模型。

“电子商务网站要求你根据每个顾客的历史评分数据,预测他们对每件商品的评分。”

该比率从 1 到 5 递增,适用于来自 非常差差、一般到好以及优秀 的印象。

现在,让我们来看一下历史数据。

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

historical rated data by users to merchandises

表示商品名称,包括“靴子”、“咖啡豆”、“杯子”、“耳机”、“花”、“足球”、“帽子”、“笔记本电脑”、“连指手套”和“毛衣”。 指的是用户名包括 April、Brian、Daniel、Eric 和 Frank。

矩阵中的每个值都是用户对该行中该列商品的评分。

然而,在实际场景中,网站通常需要支持数百万用户和商品的高吞吐量。只有用户购买的商品才能从顾客那里得到分数。很有可能我们会得到一个非常 大的稀疏矩阵 ,其中的大部分值都是零。

在继续之前,让我们将问题简化为"基于用户如何与他/她购买的商品(X) 进行交互来对分数(Y)建模。"

这里来 2 度因式分解机的模型方程。

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

The model equation of factorization machine of 2 degrees

看着眼熟? 是的,它是在线性回归的基础上增加了自变量之间的相互作用这一项而发展起来的。该等式中的 Wij 是在我们的示例中量化用户和机构之间的交互的系数。

如何估计相互作用系数 Wij 也是本文讨论的重点,也是因式分解机的显著特点。

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

**回到我们讨论的大型稀疏数据,如果我们直接进行系数估计会发生什么?**不难知道,由于历史数据中没有交互(用户和机构之间),大量系数将被估计为零。

如果我们还陷入直接从已知去研究未知的思维习惯,怎么给一个用户从来不评分的项目打分呢?这就是 因式分解机 的用武之地。

“因式分解在机器中通过因式分解对交互进行建模,这允许在稀疏性下对高阶交互进行高质量的参数估计。”

听起来很抽象?

现在就让 用更多的角色来丰富用户 的描述吧。April 是一名 26 岁的亚洲女性,是一名科学家,住在洛杉矶。四月的形象通过她的 性别、年龄、职业、种族和居住地 变得具体。

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

同样, 她评价的杯子是为圣诞节设计的绿色陶瓷杯,70 美元,星巴克的。杯子的更多细节被考虑进去,如 颜色、质地、类型、季节、价格和公司

在系数估计中描述两个具有多重特征的自变量的过程就是因式分解的过程。

因此,在数学中,独立变量表示如下。

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

The feature vector representing independent variables

k 是描述自变量的数量特征。 i 是自变量的个数。在圣诞杯四月得分的例子中,用户和商品分别有 6 个特征。

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

The feature vector of user

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

The feature vector of merchandise

因此,用户和商品之间的交互可以用下面的格式表示。

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

The interactions between i-th and j-th variable

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

The calculation process of the interaction coefficient

模型方程可以重写如下。

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

The model equation of factorization machine of 2 degrees

到目前为止,你可能想知道为什么要费心通过特征向量将变量扩展到多堆维度?痛点和策略有什么关系?

因为它们通过分解相互作用参数打破了它们的独立性。一般来说,这意味着一个相互作用的数据也有助于估计相关相互作用的参数。”

让我用我们掌握的数据来说明这一点。

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

historical rated data by users to merchandises

从上面的观察来看,由埃里克咖啡豆 的费率差不多,分别是 5(【W(埃里克,咖啡豆) )和 4(【W(埃里克,杯) )。于是特征向量 V(咖啡豆)V(杯子) 可以视为大致相同, V(咖啡豆) = V(杯子)

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

因此 W(四月,咖啡豆) ,四月率到咖啡豆,可以推断为与W(四月,杯) 相同,即 1

完美解决痛点。哈?

让我们把独立变量的所有特征向量放入矩阵。

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

The matrix containing all feature vectors

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

The feature vectors in matrix

左边两个矩阵 是自变量特征向量的展开。

右矩阵 包含两个特征向量相乘的交互系数。

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

The interaction matrix of 2-degree Factorization Machine

标有蓝色的那一半矩阵正是要估计的相互作用项。

那么如何估计模型的系数呢?为什么说计算复杂度是线性的?让我们把它们放在下一篇文章中。

简报:

本文通过推荐系统中的一个应用场景来介绍因式分解机,通过矩阵分解来解决稀疏数据下的系数估计问题。

paper . DVIhttps://www.csie.ntu.edu.tw/~b97053/paper/Rendle2010FM.pdf

如果您有任何问题,请随时留下您的评论。

对手中稀疏的数据感到气馁?给因式分解机一个机会(2)

原文:https://towardsdatascience.com/feel-discouraged-on-the-sparse-data-in-your-hand-give-factorization-machine-a-shot-2-b2e54d670cf8?source=collection_archive---------11-----------------------

打好矩阵分解的基础,你对矩阵分解概念衍生出的一系列高级模型 的探索就会顺利很多,比如 LDA、LSI、PLSA、张量分解等等

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

The models derived from the concept of Matrix Factorization

上一节中,我们讲过 因式分解机 背后的基础理论。今天让我们揭示模型背后的技术细节和数学。

本文将讨论两个问题:

  1. 如何估算 因式分解机 的系数?随机梯度下降(SGD)?交替最小二乘法(ALS)?
  2. 为什么计算复杂度是线性的?

在陷入系数估计的深渊之前,让我们先回顾一下 因式分解机 的模型方程。

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

The model equation of Factorization Machine

我们的目标 是找到最优化的系数,使得变量和真实反应之间的关系可以用最准确的方式描述。

机器 通过最小化 损失函数 来学习模型的系数,该损失函数描述真实响应(地面真实值)与设计模型的估计值之间的距离。为了使概念形象化,系数更新的数学表达式如下。

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

The goal of machine learning / model training

ѳ*是一组系数。标为蓝色的项目是L2-诺姆 ,惩罚模型的复杂性,避免 过拟合 为了简化数学推导,下图中省略了 L2 范数。

第一个需要回答的问题就这样呈现在我们面前。 模型的损失函数是什么?

  1. 回归: 我们通常用最小二乘误差来处理回归问题。

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

The equation of least square error

2。二进制分类** : y = [-1,+1]

铰链损失或对数损失作为损失函数应用于二元分类。

铰链损耗:

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

The equation of hinge loss

(y = 1)和(y = -1)下的铰链损耗如下图所示。

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

The hinge loss plot for y = 1 and y = -1

日志丢失:

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

The equation of log loss

σ(x)是 sigmoid 函数。

下面是铰链损耗和对数损耗的对比图。随着估计值逐渐接近真实值,损耗变得越来越小。

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

the plot of hinge loss and log loss (y = 1)

在阐明损失函数之后,如何最小化它成为我们研究的第二个关注点。

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

how to reach the bottom of valley within the shortest time?

随机梯度下降因其在系数优化方面的出色表现而被引入。 关于方法的一个很棒的比喻 到达谷底的最快方法(损失函数的最小值)就是沿着最陡的方向迈步(迭代梯度下降法)(梯度的负值)。

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

The equation of gradient descent

这个想法是以数学的方式实现的。 损失函数的导数 用红色标记圈起来代表步长方向。 η 是要走的步幅。 w 是要更新的权重集。

同时,因式分解机中系数的导数/梯度成为第三个焦点

  1. 对原木损耗进行分类的导数:

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

The derivative of log loss for classification

你可能想知道如何得到它。下面用 4 个步骤来说明演绎过程。

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

step 1

顺着逻辑, sigmoid 函数σ(x) 的导数是什么?

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

step 2

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

step 3

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

step 4

2。回归损失函数的导数:

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

The derivative of loss function for regression

因此,到目前为止,在上方用红色标记圈起来的估计响应的导数被置于聚光灯下。

FM 模型的一个重要性质,**多重线性,**可以对回答这个问题做出很大的贡献。让我们重新表述方程来形象化这个概念。

  1. 关于 FM 对 W0 的偏导数:把 W0 放到一边,重新组织公式。

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

The model equation of Factorization Machine

W0 的 FM 的梯度/偏导数为 1。

  1. 至于 FM 对 W l:W l 放在一边重新组织公式。

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

The model equation of Factorization Machine

FM 对Wl 的梯度/偏导数为Xl .

3.至于 FM 对lm*的偏导数:把lm*放到一边,重新组织公式。**

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

The model equation of Factorization Machine

FM 对V**lm的梯度/偏导数就是上式中标记为红色的项目。**

综上所述,FM 的导数为:

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

估计响应的导数集在随机梯度下降系数学习过程中起着重要作用。

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

随机梯度下降训练因式分解机怎么样?

通过回顾算法中待估计的所有参数,收集了其中的 3 组参数。

a. W 0:全局偏差

b. W i:第 I 个变量的强度

c. < V i, V j >:第 I 个和第 j 个变量之间的相互作用

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

Iterate until stopping criterion is met

迭代直到满足停止标准。

到目前为止,接下来是关于计算次数的讨论。特征向量带来了参数数量的增加,从而增加了计算量。 线性时间复杂度 大大缓解了这个问题。

让我们快速反思一下模型方程(度= 2)。

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

The model equation of Factorization Machine

复杂度的直接计算在 O (k n ) 中,因为必须计算所有成对的相互作用。

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

Time complexity of machine factorization

让我把时间复杂度的方程拿到显微镜下,进行详细的推导。将复杂性公式分为三部分:

a. n + (n-1):

在上述模型方程中,自变量权重的计算时间用黄色标出。

b . {[k+(k-1)+2][(n-1) n/2]+[(n-1) n/2-1]}:***

模型方程中用红色表示的交互项的计算时间。

c. 2:

3 个项目的 2 次添加

模型方程中交互项的复杂性可能最吸引你的眼球。下面的推论会清楚地梳理你的想法。

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

The deduction of complexity for interaction items in model equation

把其他项目的复杂程度加起来,我们就得到了整个计算结果。

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

The deduction of complexity for the FM model

但是正如我们之前提到的,通过重构交互项,复杂度下降到 线性 运行时间。

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

The reformulation of interaction items

方程现在在 k 和 n 中只有线性复杂度 O(kn) 。我会留给读者一个问题。遵循上面类似的逻辑,如何得到基于方程重构后的线性复杂度?稍后我会在评论区附上答案。欢迎你在这里给我留下你的评论或想法。

女性 CEO 的薪酬中位数较高,但这与她们的性别有关吗?

原文:https://towardsdatascience.com/female-ceos-have-a-higher-median-pay-but-is-it-related-to-their-gender-40d0662b7d4f?source=collection_archive---------1-----------------------

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

T 何《华尔街日报》2017 年 5 月 31 日发表文章,标题为 虽然寡不敌众,但女性首席执行官的收入却超过了男性首席执行官 。《华尔街日报》的分析显示,女性首席执行官的收入一再超过男性。去年,21 位女性首席执行官的薪酬中值为 1,380 万美元,而 382 位男性首席执行官的薪酬中值为 1,160 万美元。

我很好奇,也有点怀疑。当我仔细观察时,我注意到他们报告了收入的中位数。中位数比平均数更稳健,但我很好奇女性首席执行官的薪酬分布情况,并想知道这是否有所不同。由于今年标准普尔 500 公司中只有 23 名女性首席执行官,很可能这些女性只是在正确的公司,所以这一统计数据是真实的。

例如,我从数据中随机抽取了 10 个样本(占总人口的 4.6%,相当于 500 名首席执行官中的 23 名女性),最终得出的平均值为 1397 万美元,标准差为 71 万美元,平均值为 1800 万美元,标准差为 148 万美元。从这个例子中,我们可以看到中值更加稳健,但是,仍然存在足够大的误差,足以导致 WSJ 结果中值的差异。

如果我可以建立一个 CEO 薪酬模型,这个模型是否能够使用公司排名作为输入,准确预测首席执行官的薪酬?

为了检验我的假设,我需要一些数据。我从美国劳工联合会-产业工会联合会关于首席执行官薪酬的页面上找到了一些数据,为了节省时间,我使用 ImportIO 来搜集这些数据。AFL-CIO 的数据有点大杂烩,包含 2015 年、2016 年和 2017 年的薪酬数据,所以我无法直接复制《华尔街日报》的分析,但我认为这将是一个不错的近似值。使用的所有代码(和数据!)可从我的 GitHub repo 获得。

快速浏览数据

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

A representation of the compensations of our top 500 CEOs. We can see there’s a rapid drop off after Sundar Pichai leading to a much lower compensation package for Thomas L Carter. This representation is every 16th CEO in the data, which gives us 32 CEOs. (Interesting side note: Rex Tillerson happened to make it into this figure.)

乍一看,我很惊讶地发现数据集包含 3031 个条目,尽管我正在查看标准普尔 500 的数据。将数据限制在 500 强公司之后,是时候看一眼数据了。看左边的补偿分布,首先想到的是来自化学或者物理的阿伦尼乌斯方程(可能是因为我的生物物理化学背景)。

T 阿伦尼乌斯方程是一个指数函数,可以让你预测给定温度下的反应平衡常数(上图方程)。这个方程可以线性化,使它成为一些 OLS 回归(底部方程)的一个很好的候选。

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

准备数据

在进一步考虑这个模型之前,我需要做一些数据清理。为了将数据分段,按性别区分首席执行官,我需要找出哪些是女性首席执行官。我使用维基百科Catalyst 获得了女性 CEO 的名单。使用这两个名单的理由是名字的变化,即玛丽·巴拉对玛丽·t·巴拉或帕蒂·波佩对帕特里夏·k·波佩。使用这组组合名称的目的是为了在屏蔽熊猫数据帧以找到女性首席执行官的特定数据时,最大限度地提高匹配的机会。这种方法只给了我 23 个 CEO 中的 16 个。为了找出我遗漏的数据,我用《财富》( Fortune)杂志(T10)找到了哪些公司有女性首席执行官,这最终让我找到了另外 4 家公司的数据。最终,卫报人寿保险公司的数据似乎丢失了。美国公司、格雷巴电气公司和 CH2M 希尔公司。

我们的数据中包括的女性首席执行官有:马克·v·赫德、V.M 罗梅蒂、卢英德、玛丽·t·巴拉、菲比·n·诺瓦科维奇、玛丽琳·a·休森、艾琳·罗森菲尔德、乌苏拉·m·伯恩斯、林恩·j·古德、苏珊·m·卡梅隆、维基·霍卢伯、丹尼斯·m·莫里森、芭芭拉·伦特勒、a·格雷格·伍德林、黛布拉·l·里德、伊琳·s·戈登、玛丽·a·拉辛格、谢里·麦考伊、金伯利·s·卢贝尔和约翰·p·塔格。值得注意的是,这些首席执行官中有一些是男性。我假设男性首席执行官的薪酬足够接近,我们可以直接进行替换。

描述数据集

H 薪酬方案的价值如何比较?使用 Pandas describe()函数,我们看到男性 CEO 数据包含 480 名成员,平均薪酬为 1646 万美元,中值薪酬为 1347 万美元,最小值和最大值分别为 975 万美元和 1.0063 亿美元。女性首席执行官数据包含 20 名成员,平均薪酬为 1605 万美元,中值薪酬为 1322 万美元,最小值和最大值分别为 946 万美元和 4112 万美元。

绘制样本分布和数据直方图为我们提供了这个漂亮的图形:

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

男性和女性首席执行官直方图的差异是最令人震惊的特征之一。当以同样的比例看这两张图表时,女性首席执行官的条形图几乎看不到,这戏剧性地显示了顶级公司中女性首席执行官的数量是多么少。

描述模型

正如我上面提到的,我怀疑阿伦尼乌斯方程是描述数据的良好基础。然而,等式本身的符号对我们的情况毫无意义。我改写了这个等式,使其采用以下形式之一:

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

在该模型中, c 是高管的薪酬, b 是基本薪酬(最低薪酬的下限,在一些图中有时表示为 c_0 ),α、β、γ和δ是模型中的调整参数。当我们线性化方程时,形式(A)和(B)之间的主要区别将是显而易见的。这些模型的图表看起来与数据相似。

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

Model (A) was plotted with two different values for alpha and beta and Model (B) was only plotted for a single gamma and delta value. The values for the parameters were set by using the maximum compensation and the minimum compensation along with their respective ranks.

当我们将数据线性化时,我们得到以下方程和相应的曲线图:

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

在查看线性化方程和图表后,很明显我们可以从线性回归分析中排除模型(B ),因为它与1/等级成比例,而不是与等级成比例。

建立回归模型

I 通过从补偿中减去基数,将补偿数据转换为线性形式,并取对数。由于基数是最低补偿的下限,我们避免了 log(0)未定义的问题。log( c-b )对排名的曲线大部分是线性的,但对于前 50 名左右的公司来说,有一些非常非线性的点。

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

Plots of the 2015 and 2016 CEO data after being linearized.

转换完数据后,我把数据集分成两部分。我做了一份只有女性 CEO 数据的副本,另一份有男性 CEO 数据的副本。女性首席执行官的数据将被用作抵制测试集。我还使用了样本量为 33%的 sci-kit 的train_test_split函数来创建使用男性 CEO 数据的训练和测试集。

通过使用训练数据和 sci-kit learn LinearRegression(normalize=True)模型拟合归一化的 OLS 模型。模型的最佳拟合线是 log (c-b) = -0.00636 秩+ 3.108 。使用测试数据,模型的均方误差为 0.0487,r 平方值为 0.957。使用女性首席执行官抵制测试数据,模型表现稍好,均方误差为 0.0198,r 平方值为 0.9581。

看一看残差显示,在排名分布的末端,即前 10%和后 10%的公司,肯定存在一些非线性行为。

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

为了改进模型,我决定尝试一个更稳健的回归变量,Huber 回归变量。我交叉验证了ε和α参数并选定了

HuberRegressor(alpha=71.428600000000003, epsilon=9.2000000000000064, fit_intercept=True, max_iter=100, tol=1e-05, warm_start=False)。(alpha 和 epsilon 值的长尾是浮点伪像。)

以与之前相同的方式拟合HuberRegressor,我们得到 log(c-b)=-0.00636 rank+3.108!这和我们在 OLS 得到的模型一样。我计划尝试 RANSAC 和 Theil-Sen 回归,但考虑到 Huber 模型与 OLS 模型相同,我觉得没有必要。创建 OLS 模型的下一步可能是利用一些高阶项或使用[sklearn.preprocessing](http://scikit-learn.org/stable/modules/classes.html#module-sklearn.preprocessing).[PolynomialFeatures](http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html#sklearn.preprocessing.PolynomialFeatures)对数据进行预处理。

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

The 2015 and 2016 CEO data plotted with the Huber/OLS model as a solid line.

更进一步:树模型

我想看看我是否能使用不同类别的模型做出更好的估计。我选择决策树有两个原因:数据的非线性无关紧要,决策树可以产生容易理解的输出。

开始时,我使用了 sci-kit 的tree.DecisionTreeRegressor,其max_depth为 4。完整的回归变量看起来是
DecisionTreeRegressor(criterion='mse', max_depth=4, max_features=None, max_leaf_nodes=None, min_impurity_split=1e-07, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=False, random_state=None, splitter='best')

当模型符合数据时,树看起来像这样:

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

它给出的预测也不是那么糟糕:

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

模型的 MSE 对于测试数据是 8.29 x 10⁴,对于维持数据是 0.0164。

在使用交叉验证优化树模型的max_depth之后,我发现最佳数量在 10 到 11 个决策层之间变化。该模型的图形是

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

A screenshot of the model. The actual image was way too big to put on Medium. You can view the rotated version on the GitHub page.

这个模型的预测要好得多。测试数据的模型 MSE 为 0.000994,维持数据的模型 MSE 为 0.00213。数据用下面的预测绘制:

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

Predicted values (mustard yellow) overlaid on the training data (hunter green) for the tree model with a max_depth of 11.

结论

基于线性和 Huber 回归模型以及树形模型的预测质量,我认为数据表明公司的排名是 CEO 薪酬的良好预测指标。这并不能证明 CEO 的性别没有影响,但这确实降低了这一论点的分量。

为了进一步分析,我将使用 sci-kit 的PolynomialFeatures进行实验,看看这是否会提高线性模型的拟合度。我还会添加一个虚拟变量来表示 CEO 的性别,并探究该术语的权重大小。看看回归模型是否可以通过使用树模型作为管道的一部分来改进也是很有趣的。

有什么建议吗?我很想听听你的想法,无论如何,我可以改进我的分析。请留言评论!还记得吗,我在项目的 GitHub Repo 中包含了我使用的数据和全部代码。

发酵数据可视化:自学 Python 的一个夏天

原文:https://towardsdatascience.com/fermenting-data-visualization-a-summer-of-self-directed-python-learning-7d78dfd10462?source=collection_archive---------14-----------------------

我已经烤面包八年了。在那段时间里,我在食谱上画了一个非常宽泛的路线。但在我的创作中,无论是奶油蛋卷、芋头面包还是 focaccia,有一个重要的不变因素是我使用了活性干酵母。而且理由很充分!商业脱水酵母不油腻,反应灵敏,使烘焙成为一天的活动。

脱水酵母的主要替代品是培养活酵母培养物,也称为发酵剂。对我来说,这是一个令人生畏的复杂性飞跃。与耐储存的干酵母不同,发酵剂是一种活的、动态的微生物群落,需要定期喂食以保持活力。用活菌烘焙可以将你的烘焙周期从三个小时增加到三十个小时——整整一个数量级!

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

My winsome loaf

但是一片新鲜的酸面团是有嚼劲的,扑鼻的,美味的。今年夏天,当我发现自己有多余的空闲时间时,我决定尝试一下酸奶。抓了野生曲,自学面团水合,买了醒发筐。这是一个耗费时间的过程,但我在这个过程中学到了很多,最终的产品也不算太差。

然而,ourdough 并不是我唯一的暑期项目!在同一时期,我也为自己设定了一个目标,用Python 编程语言来发展自己的技能。Python 是数据科学事实上的脚本语言,这也是我目前的工作领域。就像我对脱水酵母的依赖一样,我过去一直避免使用 Python,而是倾向于使用简单的业务 智能 工具(与结构化查询语言协同使用)来展现、可视化和发布见解。必要性和好奇心偶尔会促使我偶尔涉足 Python,通常是为了执行传统 BI 工具根本不可行的任务,例如访问 API 和管理不同的数据源。但是,总的来说,我很难证明花时间在 Python 中进行分析项目是合理的,否则利用现有的技术资源可以更有效地完成这些项目。

但就像烘焙酸面团一样,对我的领域有更基本了解的前景一直吸引着我。最大的障碍是找时间去追求它。同样,一个自由的夏天给了我这个机会。

构建方法

项目需要时间。更大的项目需要大量的时间。但是时间本身并不足以成功。对于自我指导的项目来说尤其如此,在那里陷阱可能很多。不切实际的目标会让你无法到达终点。定义不当的过程会让你原地打转。非目标导向的任务会只见树木不见森林。为了避免这些陷阱,我需要扩展我的关注点,而不仅仅是提高我的编程技能:我还需要兼职项目管理、冲刺规划、产品策略等等。

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

That’s a lot of hats!

为了驾驭这些职责,我选择借鉴一下科技行业围绕目标设定的最佳实践。具体来说,我挑战自己说出我对这个项目的最高目标。以下是我想要完成的目标:

  • **学习:特别是,**我想学习 Python 编程语言的基础分析
  • 学习之后,我想将这些知识应用到一个完全原创的项目制作中,让更多的观众感兴趣
  • 最后,我希望自己能够成功地申请到一份需要这些技能的工作,并在这份工作中表现出色

除了帮助我让自己保持在正确的轨道上,这些目标有望为在此过程中做出的任何低级决策提供一些清晰度。从理论上讲,任何一项任务都应该服务于这三个目标中的至少一个;如果不是,我很可能偏离了轨道!

既然我已经陈述了我的目标,我需要想出如何实现它们。这需要一点耐心、研究和计划,但最终将有助于保持我的诚实和正确。概括地说,我开发了以下路线图。:

  1. 一个准备阶段,在这个阶段我将遵循一个有指导的学习课程。这样做有助于我的学习目标。
  2. 一个项目阶段,在这个阶段,我将把我的知识应用到一个自我构思的、原创的任务中。除了巩固我的知识,这个阶段也将满足我的建设目标。
  3. 一个出版阶段,在这个阶段,我会考虑将我的作品分发给观众的最佳方式。这有望推进我的职业目标。

1。准备阶段

为了构建我的项目,我首先需要学习如何构建它。在实践中,这意味着进行线性的、基于课程计划的学习,这在学术界很常见。谢天谢地,这种资源在互联网上随处可见。我的主要工具是以锻炼为重点的在线课程技术手册,以及我发现自己正在努力解决的特定主题的博客/视频博客。

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

My other study desk

我不会把我的清单作为一个说明性的清单——每个人都有自己喜欢的学习方式。事实上,我优先考虑的甚至不是找到最好的资源。相反,我想找到最能让我顺利完成项目阶段的资源,而不会筋疲力尽。就这一点而言,如果你是那种长时间坐在电脑显示器前会感到疲惫的人,我强烈建议你买一本实体书。确实有一些时候,我认为我学习累坏了,但事实上我只是需要走出家门,在公园的长椅上继续我的学习。呼吸新鲜空气可以创造奇迹!

在许多方面,这一阶段是三个阶段中最直接的。这种方法的结构化和规定的本质意味着我的日常目标通常很简单,比如“花四个小时做 Python 练习”我所有的决定都是战术性的(“我如何应用这个 lambda 函数”),而不是战略性的(“我下一步做什么?”),这是我经常欣赏的。

也就是说,一种预定的、僵化的学习方法也有其缺点。在最糟糕的日子里,我感觉自己就像跑步机上的老鼠。从严格的功利主义角度来看,我发现这些练习的价值随着远离学科的基础而减少。像定制函数和 IO 管理这样的基本概念可能与我最终从事的项目密切相关。相比之下,花一个下午的时间对 Matplolib 图表应用自定义样式就更不合理了。

在这一点上,我将提供一个重要的建议:b 你一定要监控自己的疲劳程度!实现一个特定的目标可能有很多方法,尝试不同的方法可能是突破和崩溃的区别。

2.项目阶段

与其他学科相比,从物质的角度来看,编程是非常容易理解的。理论和应用之间几乎没有逻辑障碍。出于这个原因,人们可以相当快地进入基于项目的学习。我决定,当我超越 Python 的中级功能和它的核心分析库时,我将停止系统化的学习,并将我的重点放在特定项目的开发上。以下是我这样做的主要原因:

  • 动机:我认为一个目标导向的、专注的项目是完美的动机助推器。我已经陷入了“被动学习疲劳”的单调沉闷状态,足以知道什么时候改变是合适的。
  • **重复:**我不擅长媒体的重复消费。我很少重新看电影,我不重新阅读书籍,我可能不会喜欢重温相同的编码练习。但我也知道重复是巩固知识的重要工具。鉴于我对死记硬背的厌恶,我将一个项目视为一种不错的方式,来欺骗自己在不同媒介的伪装下重温以前的概念。
  • **陈述:**我希望我的过程能够以总结和体现我所有的学习成果而告终。虽然理论上一个课程证书可以满足这个目的,但是我相信一些更独特的东西将会提供一个生动的,容易理解的表现。

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

One of the earliest known Python applications

当然,这种方法说起来容易做起来难。为一个项目想出一个好主意可能很难,尤其是如果你希望它与一套特定的应用知识重叠的话。也不能保证每个项目都会成功。此外,项目的真实范围可能很难衡量,因此很难预算必要的时间和精力(可能比你想象的要多)。但是,正是这些挑战的存在,使得一个令人印象深刻的项目在投资组合中更加有价值:它的存在本身就可以证明你的奉献精神、创造力和毅力。

对于有抱负的数据鼓吹者来说,有大量的在线资源可以从中找到灵感和材料资源。 Kaggle 是一个特别丰富的公共数据集库,包含了人们如何使用它们的例子。

就我个人而言,我有机会利用来自 Rarebits 的好人的数据集,它包含 Etherium 平台上加密收藏品拍卖数据的标准化表示。虽然我通过交易进行数据分析,但我很快意识到我个人对加密拍卖分类账的兴趣有限,相反,我更感兴趣的是如何在这个数据集上促进分析。有了这些知识,我决定使用 Potly 的 Dash 库来创建一个在线数据可视化仪表板。Dash 库为 web 浏览器中的交互式数据可视化提供了一种高度可定制、易于发布且以 Python 为中心的方法。

你可以在这里看到输出

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

Interactive scatter visualization of crypto asset auction details

3.出版阶段

随着我的项目本身的完成,我的重点从编码转向了通信。具体来说,我需要思考谁是我的受众,以及我如何才能最有效地与他们沟通。我大致看到了四个可能对我的仪表板感兴趣的主要群体:Python 数据可视化社区、潜在雇主、密码收集爱好者和对自我导向学习感兴趣的人(尤其是围绕编码和数据分析主题)。这些观众中的每一个都有不同的兴趣。

Python 数据爱好者:这些观众最感兴趣的是我的作品的可访问性和可复制性。我想给他们提供干净的、公开的、文档完整的代码。

潜在雇主:除了技术能力的展示,潜在雇主可能会对诸如沟通、项目管理和战略思维等软技能感兴趣。

自我导向的学习者:这些观众主要对我对过程本身的观点和方法感兴趣。对他们来说,项目本身对于产生它的组织上层建筑来说可能是次要的。

加密爱好者:我与这些观众的主要目标是开发一个有趣的工具——也许是实用的。出于时间考虑,我不得不放弃对区块链本身的研究,因此我降低了对专业知识的标准,即“不要听起来像个白痴”

考虑到这些因素,我采取了以下步骤来从我的项目中获得最大的潜在效用:

  • 我使用谷歌应用引擎在网上发布了我的最终产品。这确保了不需要安装 Python 库和下载我的代码,人们可以简单地导航到网站来看我的最终产品。
  • 我把我的代码上传到 Github 。这使得其他程序员(和有抱负的程序员)可以看到我是如何创建我的项目的。我广泛使用了代码注释来帮助提供我的编码选择的上下文。
  • 我写了一个“自述”描述我的项目。这份文档,你可以在 Github 页面上看到,为任何可能好奇的人提供了该项目的简要概述。除了技术上的考虑,我还提出了一点来提供数据集本身的背景。
  • 我接触了我的观众。我在 Plotly 的 Dash 库Reddit 的 Etherium 开发社区的论坛上分享了我的项目。通过这样做,我精心制作了一份针对特定受众的简短的定制信息。

下一步是什么?

现在这个项目已经成为过去,我可以很舒服地说,我对这个过程的进展很满意。在我分配给自己的时间范围内,我设法学习了相当多的 Python,制作了一个项目,我为自己的投资组合中有这个项目而自豪,甚至发现了一两件关于自我导向学习的事情。至于我的找工作……嗯,我刚刚开始着手这个过程。如果事情不顺利,我可以把我的职业生涯转向烘焙。

人工智能和大数据可以改变交通违法区域的几种未来方式开始遵守交通规则

原文:https://towardsdatascience.com/few-futuristic-ways-ai-and-big-data-can-convert-law-breaking-regions-of-traffic-start-following-ba11574681ed?source=collection_archive---------15-----------------------

赛卡特 苏坎特库拉纳

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

Photo by mauro mora on Unsplash

自 1912 年莱斯特·威尔发明了第一个交通灯以来,情况已经发生了变化,当时他希望它能够向行人和车辆发出信号,要求他们遵循和遵守新制定的道路运输规则和条例。虽然信号传递被证明是成功的,但另一半却没有。

在当今时代,交通已经成为一个经常发展的问题,更是一个所有人口高度密集的主流城市都面临的危险问题。每天,人口呈指数级增长,而道路的大小和管理它们的人员却没有增加,将像班加罗尔这样有湖泊、花园和宁静气氛的城市变成了一个负担过重的城市,无法应对沸腾的权力。

那么,是交通专家睡着了,导致了这场混乱吗?不,这不是所有地方的问题。例如,正如文章“米佐拉姆的驾车者如何遵循一个简单的规则来避免交通堵塞&确保道路无拥堵”[1]中所述,我们可以从视频中推断出那里的交通管理比混乱的印度其他地方更好,其中包括四轮车和两轮车在他们应该驶入的地方有自己的一侧。不用着急,因为所有的车辆都保持稳定的速度,不会互相超车,这足以让任何一辆来自另一条车道的摩托车小心翼翼地开到属于摩托车手的右车道。这种理解的表现是我们解决这一全球性问题的一种方式。

但是,这真的能在各地推行吗?让我们以印度为例,它是人口密度最高的国家之一,却缺乏交通纪律。在德里、班加罗尔、加尔各答、孟买等许多城市,来自不同文化背景的人们在沟通和合作方面仍然存在差距,每个人都有不同的思维方式和需要解决的不同问题。要开发一个中央集权的系统并解决这个问题,我们需要比简单的人类警察管理或人民教育更多的力量。

让我们思考一下这个问题,因为它不仅仅是“交通管理”。我们谈论的是当今城市中非常缺乏的刑事执法。就在最近,我们读到了一篇新闻报道——“一辆汽车在 Wawa 外被盗,车内有两个孩子”[2]。一名妇女将车停在停车场,带着两个孩子快速跑进一家商店,当她五分钟后到达时,车和孩子都不见了。

在最近的交通规则执行调查[3]中,古吉拉特邦 83%的人懒得遵守交通规则,比如戴头盔,这最终会导致他们“把脑袋埋在沙子里”。2016 年,古吉拉特邦有 8136 人在街头事故中丧生,大量死亡是由于伤亡人员没有戴帽子或安全带。

虽然在某些领域人口过多是不利的,但在交通管理领域可能并非如此。直到最近,我们一直试图用人力来解决交通管理问题,虽然我们在一些地方取得了成功,但我们大多都失败了。然而,在这个领域采取大数据和人工智能的方法可以为我们提供不同的结果。

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

Photo by Richard Lee on Unsplash

我们人类相信我们个人是理性的,然而在集体的场景中,非理性似乎扮演了主要角色,交通管理问题就是证明。为了个人利益的一次自私的超车,或者甚至是一次刹车合并,它会发出一连串的刹车,形成一个链条,吞没所有的交通。然而,人工智能(AI)可以提供帮助。

在迈克尔·伯恩的一篇题为“新的人工智能算法击败了世界上最糟糕的交通”[4]的文章中。他写道,只有 10%的汽车必须连接到网络才能工作。但是这到底是怎么回事呢?

判断力对驾驶有很大影响。人们是贪婪的,他们倾向于主要为自己而不是全人类做好事。这是交通堵塞首先发生的原因之一。但是,如果有一天我们完全从这个系统中移除人类思维,并引入另一个复杂的网络,该网络将连接到运行在其上的每一辆汽车,做出对所有汽车都最优的决策,每一秒钟提供最佳解决方案,会怎么样?那不是很神奇吗?

大多数情况下,事故的发生是因为一些人在开车时睡着了,在酒精或睡意的影响下。然而,假设我们将整个系统自动化,使其根据特定的环境做出正确的决定,并根据以前的经验进行学习,这些问题就永远不会出现。

人工智能需要大数据来做出判断。假设,有一辆自动驾驶汽车在人工智能上运行,它可以规划路线,并相应地在街道上安全移动。这种自动驾驶汽车将如何做出判断,例如从哪里左转,如何避免碰撞,交通信号的状态如何,是否应该根据道路上的交通密度停止或继续移动或加速?对于这些场景和许多其他场景,人工智能需要大量数据的输入——主要来自传感器,来自它所属的网络,反馈机制,等等。所有这些数据都不是相同的格式,因为我们从不同的来源获取数据,因此不能以相同的方式处理。要分析如此大量的非结构化数据,会成为一个大数据问题。

随着世界的增长,数据也在增长,人工智能是一种让连接的机器能够学习、进化和增长的技术,而这只能通过“通过递归实验和人类干预重复和持续更新数据库”来实现[5]。

让我们看看迄今为止一些成功的尝试。Drive.ai 是一家使用深度学习的自主自动驾驶车辆软件创业公司。它专注于“汽车理解周围环境并做出决策所必需的软件”[6]。通过深度学习,人类大脑的工作可以被复制,以便产生可以解决复杂问题的程序。

但是这一切和犯罪有什么关系呢?让我们看看 AI 与大数据结合时的潜力。我们处理的是不遵守规则的流量,这是因为我们给了他们遵守或不遵守规则的选择。如果我们取消这个选项,让一切都自主化,那么人们将不得不接受正在发生的事情,系统非常详细,交通问题的几率将趋于零。现在,这种情况可能只是一个梦想,但不会太久。有些人甚至会认为这是一场噩梦。

你可能会问,我们如何强迫人们只使用自动驾驶汽车,如果他们中的一些人不同意,他们想自己驾驶汽车怎么办?是的,可能是这样。人们大多不会很快接受变化。必须向他们证明,如果建立新系统,它将比现有系统更好,这样它将防止各种不可预见的事件,并降低整体犯罪率。这可能不仅仅是为了驾驶,有了人工智能和大数据,我们可以让车辆的所有部分都变得智能。接下来会发生什么,假设有人试图闯入你的车,他们打破了窗户,你的车会自动向你发出警告信号或某种信息,或者会启动某种紧急协议,阻止罪犯实现他/她想要的。

通过适当的强化学习,这些汽车将被训练在所有类型的地形上行驶,从而消除了我们驾驶它的麻烦。

现在想象一下这样一个系统可以实现什么。如果我们能制造自动警车或机器人,我们就能阻止整个城市的几乎所有犯罪。这是一个遥远的乌托邦或反乌托邦的未来,但却是一个有趣的想法。通过适当的数据挖掘,我们可以实时分析过去几年发生的和现在正在发生的犯罪,可以构建一个系统来分析和发现什么类型的犯罪发生在城市的什么区域。将警力分配到适当的位置并不像我们上面想的那样超前,而是可以很容易实现的事情。这是初创企业应该抓住的一个想法,否则我们可能会自己动手。

这个系统不仅仅可以用于犯罪,我们可以将这个人工智能集成到救护车上。在过去几年中,由于救护车延误,数千人已经死亡。这个人工智能可以做的是,当救护车在街上时,增加救护车的优先级,因此周围的所有其他车辆都将减速并有效地定位自己,以构建一条无障碍的路径,使救护车比平时更快地到达医院。这将在拥挤的城市如加尔各答、孟买、班加罗尔等每年拯救数百人的生命。

不管我们愿不愿意,下一代即将到来。人口每月呈指数增长,只有一种方法可以优化我们的生存——通过智能,即使是人工的。我们很多人不会马上接受这些变化,因为我们已经习惯了。但我们都不得不同意——人类是不可靠的。现在我不是说机器不是,而是改变所有人类的行为和改变少数机器的行为——我们都知道哪一个是可行的。

参考资料:

[1]

https://www . thebetterindia . com/98500/mizo ram-traffic-management/

米佐拉姆的司机如何遵循一个简单的规则来避免交通堵塞&确保道路畅通

经过

Lekshmi Priya S

[2]

https://www . Delaware online . com/story/news/crime/2018/01/05/car-stopped-two-kids-inside/1006445001/

车在瓦瓦外面被偷,里面有两个孩子

经过

约瑟芬·彼得森,新闻杂志

[3]

https://timesofindia . India times . com/city/vado Dara/83-gujaratis-don ’ t-give-two-hoots-to-traffic-rules/articleshow/62360310 . CMS

83%的古吉拉特人根本不在乎交通规则

经过

图沙尔泰雷| TNN

[4]

https://motherboard . vice . com/en _ us/article/jp3d n7/new-ai-algorithm-beats-even-the-world-worst-traffic

新的人工智能算法甚至打败了世界上最糟糕的交通

经过

迈克尔·伯恩

[5]

https://hacker noon . com/how-big-data-is-empowering-ai-and-machine-learning-4e 93 a 1004 c8 f

大数据是如何赋能 AI 和机器学习的?

经过

史蒂文·汉森

[6]

https://Mashable . com/2017/09/28/drive ai-lyft-deal/# k 0 ugocxpmmqr

Drive.ai 是自动驾驶汽车领域炙手可热的新公司

经过

贾森

关于:

Saikat Bhattacharyya 先生是一名研究人员,与 Sukant Khurana 博士一起研究人工智能和大数据在打击犯罪中的应用。

Sukant Khurana 博士经营着一个学术研究实验室和几家科技公司。他也是著名的艺术家、作家和演说家。你可以在 www.brainnart.com或 www.dataisnotjustdata.com了解更多关于苏坎特的信息,如果你希望从事生物医学研究、神经科学、可持续发展、人工智能或数据科学项目,为公众谋福利,你可以在 skgroup.iiserk@gmail.com 联系他,或者通过 LinkedInhttps://www.linkedin.com/in/sukant-khurana-755a2343/联系他。

这里有两个关于 Sukant 的小纪录片和一个关于他的公民科学努力的 TEDx 视频。

[## Sukant khu Rana(@ Sukant _ khu Rana)|推特

Sukant Khurana 的最新推文(@Sukant_Khurana)。创始人:https://t.co/WINhSDEuW0 和 3 家生物技术创业公司…

twitter.com](https://twitter.com/Sukant_Khurana)

更少的航班,更大的延误和 JetBlue 糟糕的一年:2017 年美国航空业的 17 张图表

原文:https://towardsdatascience.com/fewer-flights-bigger-delays-and-a-bad-year-for-jetblue-17-charts-on-the-u-s-d718f867b351?source=collection_archive---------11-----------------------

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

美国航空公司这几年过得多姿多彩。随便看看头条:拖客、爆发动机、大合并

但是标题只是故事的一部分。为了更全面地了解美国航空旅行的现状,我们查阅了数据,并检查了超过 500 万次航班的记录。

这是我们的发现。

1.按城市划分的飞行痛苦

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

就晚点出发和到达时间而言,往返旅行最糟糕的城市是新泽西州的纽瓦克,其次是纽约和旧金山。同时,准时出发和到达的最佳城市是阿拉斯加的安克雷奇。

虽然有人会认为航班量与晚点的出发和到达密切相关,但实际上仍有一些航班量低的城市表现不佳。例如,印第安纳州韦恩堡的航班量不到纽约的 3%,但准点到达率却比纽约更低。路易斯安那州的巴吞鲁日和纽约州的怀特普莱恩斯也是如此;这两个城市的航班量都很低,但准点率却是所有城市中最低的。

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

2.航班减少

如果 2018 年旅行感觉比以前更糟糕,那不仅仅是你的怀旧之言。自 2010 年以来,航空旅客可乘坐的航班数量每年减少 100 多万次,而乘客数量却在增加

这些数字是怎么加起来的?从好的方面来看,航空公司在填满所有座位方面做得更好了。2008 年,美国航空公司在国内航班上的座位里程达到了 79.74%。到 2017 年底,这个数字已经上升到 84.57% 。这意味着你不像 10 年前那样喜欢空着的中间座位。

但是还有另一个潜在的因素在起作用;航空公司缩小座位以增加载客量。当你把更多的乘客和托运行李费结合在一起,鼓励顾客把他们所有的东西都装进他们的随身行李时,难怪头顶行李箱空间的耗尽已经成为一个常见的旅行头痛

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

3.和更多的延迟

快速浏览一下航班准点性能统计,总体延误(蓝条)似乎自 2010 年以来一直保持相对稳定,2013 年和 2014 年有所上升。但是这种乐观的景象得益于时间表填充——航空公司有意计划航班晚点以提高准点率的做法。据《华尔街日报》报道,达美航空自 2009 年以来每年都在增加其日程安排。因此,许多航班提前到达。

当你把所有的早班航班都视为准点到达时,一个不好的模式出现了:实际延误(绿色条)在过去八年中呈上升趋势。

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

4.价格减免?

乍一看,整合时代似乎压低了美国主要航空公司旅客的平均票价。但是读一下小字。运输统计局的这一数据“只包括购票时支付的价格,不包括行李费等可选服务的费用。”

这是一个很大的警告,特别是在主要航空公司 2017 年近 30%的利润来自行李费的情况下。2016 年的行李费为 42 亿美元,2015 年的行李费为 38 亿美元,相比之下,这一数字达到了 46 亿美元。航空公司也找到了其他新颖的收费方式向消费者收费。在 2015 年第四季度,达美航空销售“舒适+”座位赚了 1.25 亿美元,西南航空一年内在提前检票费用上赚了大约 2.6 亿美元

因此,虽然节俭的旅行者可以找到比以前更好的交易,但普通旅行者会支付更多。

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

5.捷蓝航空经历了糟糕的 2017 年

唯一一家航班延误和取消统计数据比捷蓝航空更糟糕的航空公司是维珍美国航空公司和已经不存在的维珍美国航空公司。即便如此,它至少在让飞机准时起飞方面做得更好。

另一方面,看看联合航空和达美航空的准点飞行数据。他们的起飞延误与大多数其他航空公司相似,但他们学会了如何在混乱中留下足够的缓冲。虽然批评调度填充是对系统的游戏是公平的,但达美航班在 2017 年有 85%的时间按时或提前到达,胜过除夏威夷航空公司以外的所有其他主要航空公司,夏威夷航空公司的网络更容易管理。

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

6.不,事实上捷蓝航空的 2017 年非常糟糕

根据 JetBlue 航班的规模和整个行业的平均取消率,JetBlue 应该有大约 950 次因运营商方面的问题而取消的航班。相反,该航空公司的人数几乎是这个数字的两倍(1805 人)。

情况变得更糟。航空公司还对天气和国家航空系统的延误进行过采样,这些延误有时是伪装的承运人延误。

雪上加霜的是,在所有仍在运营的美国主要航空公司中,捷蓝航空的准点率最低,在一个受欢迎的年度航空公司排名系统中,其排名下降了四位。

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

7.星期二=无机场忧郁日

如果你能灵活安排旅行时间,就准时到达和离开而言,周二和周六是一周中最可靠的日子。周五的延误最严重,其次是周一。

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

8.早走=少头疼

平均来说,航班起飞的时间越晚,延误越严重。这里的机械问题和那里的天气延迟一整天都在发生。但是,早点飞,一切运行良好。平均而言,午夜至早上 8 点之间起飞的航班往往会提前到达。

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

9.红眼航班准时到达

爱他们也好,恨他们也罢,凌晨降落的深夜航班一般都是准点的。平均而言,早上 6 点到 10 点之间的航班实际上会提前到达。

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

10.不要怪航班量

看一下按小时划分的延误图表,很容易将当天晚些时候延误增加归咎于航班量,但数据并没有证实这一点。虽然下午 5 点是最繁忙的时段,但机场交通在早上 8 点至晚上 7 点之间相对稳定,晚上 9 点时段的累积痛苦排名第四,到达或离开的航班数量排名第五。

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

11.航空公司非常重视感恩节

看看航班准点性能统计,你会发现航班延误在暑假期间最严重,在 11 月最好,这个月包括一年中最繁忙的旅行日之一。

11 月是 2017 年航班晚点率最低的月份。这可能是日程安排的产物,但是 11 月份的航班实际上提前到达了*。*

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

12.你从未听说过美国第四大航空公司。

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

就航班数量而言,美国第四大航空公司是 SkyWest。没听说过他们?那是因为他们是一家白标航空公司,经营阿拉斯加、美国、达美和联合航空的业务。

13.洛杉矶和旧金山的空中交通在美国名列前茅

2017 年,旧金山和洛杉矶之间的空中高速公路的原始交通量超过了美国其他地区——而且差距很大。洛杉矶和旧金山以 47%的得票率超过排名第十的洛杉矶和芝加哥。

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

14.繁忙的天空=更大的延误

在前 200 条最繁忙的航线中,洛杉矶和旧金山也有一些最严重的到达延误。

总的来说,随着航线容量的增加,航班延误越来越严重,但也有一些值得注意的异常值。从纽约到芝加哥的航班平均来说非常准时。相比之下,从佛罗里达到纽瓦克的航班比预计时间晚了很多。

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

15.为什么不能直飞,第一部分

如果你要去美国最大的城市之一,或者它的主要枢纽之一,你可以很容易地搭乘直达航班。但是如果你想从迈阿密到得梅因,你可能需要在芝加哥停留。

2017 年出行量排名前 200 的航班只连接了 43 个城市,不到美国有机场城市的 14%。

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

16.为什么你不能乘坐直达航班,第二部分

当你包括所有的航线时,这幅图看起来很不一样。洛杉矶从第 3 位跌至第 13 位。波士顿、华盛顿和奥兰多等主要目的地完全跌出了榜单。与此同时,达拉斯/沃斯堡——在主要路线的连接上甚至没有进入前 15 名——跃升至第 4 名。

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

17.你不能从这里到达那里

交通统计局在 2017 年的航班和航班延误统计数据中列出了 312 个有机场的城市,但你只能在一家主要航空公司找到其中的 205 个。要到达 107 中的任何一个,你都需要一架私人飞机或一家小型地区性航空公司。

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

18.垃圾进,垃圾出

总的来说,机场是他们网络的受害者。如果你检查航班准点性能数据,你会发现在机场的平均到达延误和平均离开延误之间有接近 1:1 的关系。但是有些特别糟糕。从好的方面来说,任何从玛莎葡萄园岛或楠塔基特岛旅行的人可能都处于一种放松的心态。

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

在过去的一年里,飞行给你带来了怎样的变化?你有什么不好的经历想分享吗?欢迎在下面的评论区给我留言。

本帖 原版 最早出现在 Visme 的 视觉学习中心

光纤神经网络

原文:https://towardsdatascience.com/fibre-optic-ai-for-my-apartment-wall-99f2efd4c507?source=collection_archive---------4-----------------------

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

好莱坞在过去对人工智能(AI)做出了许多重大承诺:它将如何摧毁我们,它将如何拯救我们,以及它将如何给我们带来好处。承诺的一件不太令人难忘的事情是它看起来有多酷。

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

Jarvis AI interacting with Ultron AI ©Marvel

令人惊叹的人工智能可视化的一个伟大例子是在《复仇者联盟》中,当托尼·斯塔克的人工智能巴特勒·贾维斯与奥创互动时,我们看到了这个光变形和脉动的有机浮动网络。

我想做一些类似的东西来填补我公寓墙上的一些空白(应该比通常的宜家艺术要好)。很明显,我不可能再创造出像漂浮的光球贾维斯那样神奇的东西。然而,有一种机器学习算法,通过一些古怪的数据可视化看起来很有趣:神经网络!它采用了生物灵感元素,旨在复制人类大脑的工作方式(我们认为)。

如果你还不熟悉机器学习中的神经网络:它们受到大脑中生物神经元的启发。网络中的每个节点与网络中的其他节点相连。当信号流经网络时,节点之间的连接会改变信号,直到信号到达网络的末端。在算法训练阶段学习连接调整信号的具体方式。

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

neural network algorithm structure (https://en.wikipedia.org/wiki/Artificial_neural_network)

我着手用光重建一个神经网络。对于我在半透明塑料中 3D 打印出定制形状的节点,以及节点之间的连接,我使用了所谓的侧发光光纤,这是普通的光纤管道,沿着管道的长度发光(看起来非常科幻)。

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

The fruits of painstaking soldering and gluing. (more images of its making here)

实际的光源是一个 RGB LED 条,它被费力地切割、焊接和粘合到每个节点上(每个节点需要大约 30 分钟来安装电子设备)。

告诉 LED 做什么的组件是一个 Arduino 板,它由一个小 Raspberry Pi Zero 告诉它做什么,这使整个事情与 WiFi 连接!

现在它是如何工作的!?光网络本身就是一个美化了的 WiFi 灯。真正的人工智能运行在我连接到同一个 WiFi 的笔记本电脑上。我写了一段方便的代码,插入到我的标准神经网络编程环境中,当我训练我的算法时,它将连接值**(绿色=高值,红色=低值,蓝色=接近零)**实时发送到光网络。然后我就可以亲眼看到我的神经网络学习了!!!

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

Voilà! A physical light visualisation of AI learning!

它现在将快乐地生活在我的墙上,作为人工智能的光辉象征!

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

(graph 1) Data that the neural network is learning from

那么它在学习什么呢?G raph 1 是神经网络试图复制的数据模式。仅基于 x 和 y 值(图中的特征 1 和特征 2),神经网络将尝试输出正确的分类(图中的颜色)。下面是另一个动画,展示了光线网络沿着它的预测数据倾斜。正如你所看到的,数据点的颜色不断变化,直到它们与原始数据非常接近,这就是学习!

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

The light network learning along side its live predictions for the data

关于该项目的所有细节技术信息以及所有代码,你可以在我的 Github->【https://github.com/ZackAkil/rgb-neural-net上找到。

2018 年世界杯:数据驱动的理想球队阵容方法

原文:https://towardsdatascience.com/fifa-world-cup-2018-a-data-driven-approach-to-ideal-team-line-ups-93505cfe36f8?source=collection_archive---------6-----------------------

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

随着 2018 年俄罗斯世界杯的到来,世界各地的每个足球迷都渴望预测今年哪个队会赢。对于球迷来说,另一个迫在眉睫的问题是他们最喜欢的国家队应该如何排队:应该使用什么阵型?应该选哪些球员?哪些人应该留在替补席上或从锦标赛中淘汰?

作为一个狂热的足球迷,我开始思考:为什么我不能在世界杯上为我最喜欢的球队建立自己的梦之队?作为一个热爱数据科学并在玩 FIFA 长大的人,我意识到我可以使用 EA Sport 去年发布的非常受欢迎的视频游戏 FIFA18 中的数据来做我的分析。

在这篇博文中,我将一步一步地向你介绍我在本届世界杯上为 8 支公认的最佳球队打造最强大阵容的方法:法国、德国、西班牙、英格兰、巴西、阿根廷、比利时和葡萄牙。

FIFA 18 数据集

我在 Kaggle 上找到了 FIFA18 数据集。该数据集包含 17,000 多名 FIFA18 中的球员,每名球员都有 70 多种属性。它是从网站 SoFiFa 通过提取玩家的个人数据、ID、玩法&风格统计数据刮来的。有各种有趣的特点,如球员价值,工资,年龄,和性能评级,我真的很想挖掘。

加载数据后,我只选择了我想分析的最感兴趣的列:

interesting_columns = [
    'Name', 
    'Age',  
    'Nationality', 
    'Overall', 
    'Potential', 
    'Club', 
    'Value', 
    'Wage', 
    'Preferred Positions'
]
FIFA18 = pd.DataFrame(FIFA18, columns=interesting_columns)

以下是根据数据集中的总体评分快速查看的前 5 名玩家:

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

数据可视化

为了让你更好地理解这个数据集,我对球员的年龄、总体情况、首选位置、国籍、价值和工资做了一些可视化处理。让我们逐一查看:

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

正如你所看到的,大多数玩家年龄在 20 到 26 岁之间,巅峰时期在 25 岁。

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

该图呈正态分布,平均综合评分为 66 分。

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

这里,球员最喜欢的 4 个位置依次是中后卫、前锋、守门员和中场。

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

我使用包 plot.ly 来绘制玩家国籍的地理可视化。如你所见,玩家在欧洲非常集中。准确地说,是英国、德国、西班牙和法国。

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

在价值方面,我做了一个散点图,展示了球员的年龄和总体评价。峰值似乎相应地落在 28-33 岁的年龄范围和 90+的总评分上。

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

在工资方面,我还做了一个散点图,显示了球员的年龄和总体评分。随着年龄范围从 30 岁到 33 岁以及总体评分为 90 分以上,最高工资似乎会相应下降。

最佳阵容分析

好吧,让我们为国家队建立一些最佳阵型。为了简化分析,我只引入我感兴趣的数据:

FIFA18 = FIFA18[['Name', 'Age', 'Nationality', 'Overall', 'Potential', 'Club', 'Position', 'Value', 'Wage']]
FIFA18.head(10)

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

我写了两个非常重要的函数, get_best_squad_n (给定一个球队阵型和球员的国籍,完全根据总体评分返回在各自位置上拥有最佳球员的球队)和 get_summary_n (给定一个球队阵型选择和国家队的列表,根据各个阵型中球员的平均总体评分比较这些不同的阵型)。

我也使阵容选择更加严格:

squad_343_strict = ['GK', 'CB', 'CB', 'CB', 'RB|RWB', 'CM|CDM', 'CM|CDM', 'LB|LWB', 'RM|RW', 'ST|CF', 'LM|LW']squad_442_strict = ['GK', 'RB|RWB', 'CB', 'CB', 'LB|LWB', 'RM', 'CM|CDM', 'CM|CAM', 'LM', 'ST|CF', 'ST|CF']squad_4312_strict = ['GK', 'RB|RWB', 'CB', 'CB', 'LB|LWB', 'CM|CDM', 'CM|CAM|CDM', 'CM|CAM|CDM', 'CAM|CF', 'ST|CF', 'ST|CF']squad_433_strict = ['GK', 'RB|RWB', 'CB', 'CB', 'LB|LWB', 'CM|CDM', 'CM|CAM|CDM', 'CM|CAM|CDM', 'RM|RW', 'ST|CF', 'LM|LW']squad_4231_strict = ['GK', 'RB|RWB', 'CB', 'CB', 'LB|LWB', 'CM|CDM', 'CM|CDM', 'RM|RW', 'CAM', 'LM|LW', 'ST|CF']squad_list = [squad_343_strict, squad_442_strict, squad_4312_strict, squad_433_strict, squad_4231_strict]squad_name = ['3-4-3', '4-4-2', '4-3-1-2', '4-3-3', '4-2-3-1']

1 —法国

让我们探索法国不同阵容的可能性,以及它如何影响收视率。

France = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['France'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall']) France.set_index('Nationality', inplace = **True**) France['Overall'] = France['Overall'].astype(float) print (France)

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

让我们来看看 4-3-3 阵容中最好的 11 名法国球员。

rating_433_FR_Overall, best_list_433_FR_Overall = get_best_squad_n(squad_433_strict, 'France', 'Overall')print('-Overall-')
print('Average rating: **{:.1f}**'.format(rating_433_FR_Overall))
print(best_list_433_FR_Overall)

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

Antoine Griezmann

2 —德国

卫冕冠军肯定是今年第一名的有力竞争者。

Germany = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['Germany'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall'])Germany.set_index('Nationality', inplace = **True**)Germany['Overall'] = Germany['Overall'].astype(float)print (Germany)

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

正如你所看到的,德国目前的收视率在 3-4-3 或 4-3-3 阵型中达到顶峰。我将采用 4–3–3 选项。

rating_433_GER_Overall, best_list_433_GER_Overall = get_best_squad_n(squad_433_strict, 'Germany', 'Overall')print('-Overall-')
print('Average rating: **{:.1f}**'.format(rating_433_GER_Overall))
print(best_list_433_GER_Overall)

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

Toni Kroos

3 —西班牙

2010 年的冠军怎么样?

Spain = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['Spain'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall'])Spain.set_index('Nationality', inplace = **True**)Spain['Overall'] = Spain['Overall'].astype(float)print (Spain)

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

好吧,西班牙在 4-3-3 或者 4-2-3-1 上表现最好。出于多样性考虑,我会选择 4–2–3–1 阵型。

rating_4231_ESP_Overall, best_list_4231_ESP_Overall = get_best_squad_n(squad_4231_strict, 'Spain', 'Overall')print('-Overall-')
print('Average rating: **{:.1f}**'.format(rating_4231_ESP_Overall))
print(best_list_4231_ESP_Overall)

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

Sergio Ramos

4 —英格兰

尽管拥有欧洲最好的足球联赛,英格兰似乎在国家层面做得并不好。让我们来看看他们对即将到来的世界杯有什么选择:

England = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['England'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall'])England.set_index('Nationality', inplace = **True**)England['Overall'] = England['Overall'].astype(float)print (England)

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

那么英格兰应该坚持 4-3-3。

rating_433_ENG_Overall, best_list_433_ENG_Overall = get_best_squad_n(squad_433_strict, 'England', 'Overall') print('-Overall-') 
print('Average rating: **{:.1f}**'.format(rating_433_ENG_Overall)) print(best_list_433_ENG_Overall)

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

Harry Kane

5 —巴西

桑巴队赢得了历史上最多的世界杯冠军,毫无疑问,它将是今年夏天俄罗斯世界杯的最大热门之一。

Brazil = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['Brazil'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall'])Brazil.set_index('Nationality', inplace = **True**)Brazil['Overall'] = Brazil['Overall'].astype(float)print (Brazil)

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

如你所见,巴西和英格兰有相似的选择。全程 4-3-3。

rating_433_BRA_Overall, best_list_433_BRA_Overall = get_best_squad_n(squad_433_strict, 'Brazil', 'Overall')print('-Overall-')
print('Average rating: **{:.1f}**'.format(rating_433_BRA_Overall))
print(best_list_433_BRA_Overall)

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

Neymar

6 —阿根廷

莱昂内尔·梅西还在等待他职业生涯中唯一一个还没有拿到的奖杯。在 4 年前决赛失利后,他能带领阿根廷登顶吗?

Argentina = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['Argentina'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall'])Argentina.set_index('Nationality', inplace = **True**)Argentina['Overall'] = Argentina['Overall'].astype(float)print (Argentina)

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

3-4-3 和 4-3-3 对阿根廷球员来说都很好。我会选择 3–4–3。

rating_343_ARG_Overall, best_list_343_ARG_Overall = get_best_squad_n(squad_343_strict, 'Argentina', 'Overall')print('-Overall-')
print('Average rating: **{:.1f}**'.format(rating_343_ARG_Overall))
print(best_list_343_ARG_Overall)

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

Lionel Messi

7 —比利时

红魔拥有一些英超联赛中最好的球员,但似乎永远无法在国家队中取得成功。哈扎德和德·布鲁因这次能把他们逼远吗?

Belgium = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['Belgium'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall'])Belgium.set_index('Nationality', inplace = **True**)Belgium['Overall'] = Belgium['Overall'].astype(float)print (Belgium)

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

同样,4-3-3 是比利时的最佳阵型。

rating_433_BEL_Overall, best_list_433_BEL_Overall = get_best_squad_n(squad_433_strict, 'Belgium', 'Overall')print('-Overall-')
print('Average rating: **{:.1f}**'.format(rating_433_BEL_Overall))
print(best_list_433_BEL_Overall)

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

Kevin De Bruyne

8 —葡萄牙

2016 年欧洲杯的冠军和连续三次获得世界最佳球员的克里斯蒂亚诺·罗纳尔多也有机会参加这次比赛。

Portugal = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['Portugal'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall'])Portugal.set_index('Nationality', inplace = **True**)Portugal['Overall'] = Portugal['Overall'].astype(float)print (Portugal)

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

好吧,我选葡萄牙 4-2-3-1。

rating_4231_POR_Overall, best_list_4231_POR_Overall = get_best_squad_n(squad_4231_strict, 'Portugal', 'Overall')print('-Overall-')
print('Average rating: **{:.1f}**'.format(rating_4231_POR_Overall))
print(best_list_4231_POR_Overall)

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

Cristiano Ronaldo

9 —乌拉圭

乌拉圭拥有欧洲最好的两名前锋:苏亚雷斯和卡瓦尼。他们这次能表演吗?

Uruguay = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['Uruguay'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall', 'Potential'])Uruguay.set_index('Nationality', inplace = **True**)Uruguay[['Overall', 'Potential']] = Uruguay[['Overall', 'Potential']].astype(float)

print (Uruguay)

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

太棒了,乌拉圭以 4-3-1-2 的比分表现最好。

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

Edison Cavani

10 —克罗地亚

嗯,我是莫德里奇和拉基蒂奇的超级粉丝。他们的中奖习惯就不用说了吧?

Croatia = pd.DataFrame(np.array(get_summary_n(squad_list, squad_name, ['Croatia'])).reshape(-1,4), columns = ['Nationality', 'Squad', 'Overall', 'Potential'])Croatia.set_index('Nationality', inplace = **True**)Croatia[['Overall', 'Potential']] = Croatia[['Overall', 'Potential']].astype(float)

print (Croatia)

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

毒品,克罗地亚以 4-2-3-1 领先。

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

Luka Modric

最终比较

好的,让我们将这 10 个阵容与这些 2018 年世界杯最强竞争者的球员的当前评级进行一些比较。

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

所以纯粹基于 FIFA 18 的数据:

  • 西班牙的平均综合评分最高,其次是德国和巴西。
  • 德国总值最高,其次是西班牙和法国。
  • 西班牙的平均工资最高,其次是德国和巴西。

我的赌注是 T2 对法国,第三名是 T4 对巴西。而 Les Bleus 将会赢得一切!你有什么想法?

你可以通过这个链接查看我的 GitHub repo 中的所有源代码(https://github.com/khanhnamle1994/fifa18)。如果您有任何问题或改进建议,请告诉我!

— —

如果你喜欢这首曲子,我希望你能按下拍手按钮👏因此其他人可能会偶然发现它。你可以在GitHub上找到我自己的代码,更多我的写作和项目在【https://jameskle.com/】上。也可以在 上关注我推特 直接发邮件给我 或者 在 LinkedIn 上找我 注册我的简讯 就在你的收件箱里接收我关于数据科学、机器学习和人工智能的最新想法吧!

利用最大似然技术预测 2018 年世界杯

原文:https://towardsdatascience.com/fifa-world-cup-2018-predictions-using-ml-techniques-48354e22cd8?source=collection_archive---------4-----------------------

嘿机器学习,谁会是下一届世界杯冠军?

我的预测?比利时将成为冠军。

但似乎我的很多朋友,包括我的线性回归模型和神经网络模型,都偏爱巴西。

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

暑假我正在自学机器学习模型,FIFA 世界杯现在就在我们脚下!所以我在想:为什么不做一个用 ML 模型预测世界杯结果的实践项目呢?

我为期三天的预测之旅开始了!

第一天:玩数据集

真正引发我开始这个项目的兴趣的数据集实际上是这个 Kaggle 的数据集(嗯,如果你订阅了 Kaggle,它刚刚出现在我的电子邮件中)。该数据集包含自 1930 年以来 FIFA 世界杯的所有比赛、球员和冠军。我甚至受到启发,建立了一个模型,其中包含玩家在比赛中的属性,因为玩家对游戏的胜利做出了重大贡献,我们可以访问数据集中的这条信息。

但是最后,我个人觉得这个数据集太乱了,里面塞满了太多不必要的数据。然后我偶然发现了这个数据集,里面有所有国际足球比赛的信息。在这篇中型文章中提到了 ML 结果预测,尽管文章中的模型使用了逻辑回归。我个人更喜欢这个数据集,因为:

  • 它只有 1 张 csv 表(哈哈!)
  • 当我们做预测时,我们不仅应该关注世界杯比赛,还应该关注其他国际比赛
  • 通过使用所有国际比赛的数据,我们应该有一个更大的训练数据量,这应该可以提高我们的预测性能

基本上,数据集包含一场比赛的年份日期、两队的名称两队的得分比赛类型城市国家中立(无论比赛是否在任何一队自己的地点举行)。所以我会说这个数据集相对来说更干净,简洁,而且直截了当。

设置属性和数据预处理

我从这一部分学到的一个重要教训是数据总是又脏又乱。我打了一个比方,将数据科学比作烹饪——首先,数据就像你的肉和蔬菜。挑选那些新鲜、干净、最适合你的。

就像一个厨师并不真的需要使用很酷的技术来烟熏或液氮来烧烤他的食物,因为他的主要目标是用简单的方法为他的食客提供美味的食物。对于一个数据科学家来说,这是类似的——我们并不真的需要建立一个非常花哨、复杂的 ML 模型(除非复杂的任务需要),但主要目的是能够从你挑选的数据中辨别事物。

关键是 你如何分辨事物 —在这种情况下,你选择的是哪个 属性

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

这些是我总结出来的属性,非常简单易懂:

在预测的时候,我们应该考虑球队在比赛举办年份的排名。如果没有数据,我的处理方式是放一个大数(我用的是 200,因为球队不到 200)作为排名。

  • 中奖数和抽奖数

在她所有的国际比赛中,意味着一个队的胜利和平局。不需要丢失计数,因为它只是两者的补充。

  • 一队净胜球

在她所有的国际比赛中,净胜球意味着一个团队的。如果 A 队和 B 队打了一场 5 比 0 的比赛,那么 A 队的净胜球是 5,B 队是-5。这不仅仅是衡量输赢,而是衡量团队能在多大程度上赢得比赛。

  • 对对手的赢数和平局数

基本上是比赛中两队的比赛历史。注意,我们应该注意比赛的日期,只考虑过去的比赛历史数据*。*

看一支球队是否在自己的国家比赛。

这也是我在 pandas 上练习的机会,这是一个非常方便的数据操作库。所以我写的第一个脚本是FIFA-results-preprocess . py,主要是从 results.csv 中的原始数据生成我想要的属性。

有一点要分享的是——这个脚本运行了大约 18 分钟!原因是对于每一行比赛数据,我们必须计算两个队的比赛历史。对于该计算,我们需要遍历特定行之前的所有行,因为我们的数据是按时间顺序排列的。这显然需要 O(n)。

预处理生成了 results_processed.csv ,我手动删除了一些列以得到results _ processed _ dev . CSV

第二天:机器学习日

将大蒜和洋葱切碎,牛肉切片,你就可以开始做菜了。

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

所以基本上这个预测任务可以被框定为一个分类任务。给定这些属性,我们将对主队是输(0 类)、赢(1 类)还是平(2 类)进行分类。

我首先尝试使用我的脚本 fifa-ml.py 将我的数据输入几种类型的分类器。令人震惊的是,所有分类器返回的训练和测试准确率都在大约 55% 左右,并且没有一个分类器优于另一个。

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

所以,我宁愿在最后使用线性回归,因为它没有太大的区别。线性回归器可以被认为是一个一层神经网络,接受 n 个特征并最终返回每个逻辑的概率。在这种情况下,它返回比赛中主队的赢、输和平局概率。你也可以使用逻辑回归,只是在我看来,在这个特定的任务中,两者做同样的事情。

请注意,对于线性回归,所有 Y 示例都需要进行一次热编码。在 sklearn 中,我是通过使用一个 LabelBinarizer 来完成的;在 Keras 中,我通过to _ categorial()来实现。

我做到了!我在这里附上了对淘汰赛的预测:

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

所以前 4 名球队是:巴西,西班牙,阿根廷,德国。

完整结果(包括小组赛结果和概率),查看这里:results _ predict _ output _ final . CSV

第三天:神经网络日

然后我就在想:既然经典的分类器都做不好,那么神经网络的表现会更好吗?于是我用 Keras 想出了一个神经网络脚本: fifa-ml-nn.py

答案是否定的。

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

即使对于具有许多隐藏单元的大型网络,其准确度似乎也只是缓慢地收敛到 55%左右(有时略高,NN 是我唯一达到 59%测试准确度的模型,这是目前最高的)。但我有 300、500 甚至 1024 个单元的密集层,但性能仅提升了不到 5%。不值得。

尽管如此,NN 的预测和 LR 的预测之间还是有细微的差别。让我在这里附上 NN 对淘汰赛阶段的预测:

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

所以这次的前 4 名球队是:巴西、西班牙、德国、葡萄牙。

完整结果(包括小组赛结果和概率),查看这里:results _ predict _ output _ nn _ final . CSV

结论和调查结果

我想说,这是一个非常好的数据科学入门迷你项目,它经历了数据争论、提出分类属性和实现分类模型的整个过程。

我的结论是 足球比赛保持不可预测 ,当我读到这篇 LinkedIn 帖子时,我完全同意的观点。帖子甚至附上了这篇论文使用随机森林并融入大量属性进行预测,但仍然无法做出准确的预测。

使用 ML 并不能预测所有的事情。它有其局限性。

对于我的模型,我只能说,像巴西、西班牙和德国这样的球队更倾向于我设置的属性,这主要是考虑到一支球队的获胜统计数据。但我们都知道,赢得历史并不能说明什么——毕竟,当我写这篇博客的时候,德国已经被强大的韩国以 2 比 0 淘汰了。

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

总而言之,预测在这里并不是最重要的。最重要的是学习处理数据的技巧,从中讲述故事,最后但同样重要的是… 全力支持比利时!

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

原载于gud gud 96 . github . io

用人工智能对抗癌症:第 0 部分——深度学习

原文:https://towardsdatascience.com/fighting-cancer-with-artificial-intelligencepart-0-deep-learning-a6f0b375c8c?source=collection_archive---------3-----------------------

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

Cutaneous anaplastic large cell lymphoma (ALCL) By L. Wozniak & K. W. Zielinski — Own work, CC BY-SA 3.0

今年 8 月,我听到了没有人想从他们的医生那里听到的话:“你得了癌症。”我被诊断患有一种罕见的非霍奇金淋巴瘤。经过几周混乱的测试和第二意见后,很明显我的预测是好的。几个月的治疗让我开始思考我的运气;尽管我不得不忍受癌症,但我很幸运有一个良好的预后。我发现自己在思考一个古老的问题,“这有什么原因吗?”

在这段时间里,我真正开始钻研数据科学。我开始思考机器学习(ML)和人工智能(AI)对癌症治疗的影响及其对预后的影响。鉴于我的情况,我想知道我是否应该开始专注于研究数据科学的这个领域。这篇文章是这样做的第一步。

2018 年 1 月 12 日星期五,我的医生很高兴地告诉我,我的 PET 扫描结果很清楚。这一系列文章对我来说是一种庆祝和宣泄。在第一篇文章中,我将介绍深度学习。

深度学习正在开发,以帮助阅读放射学扫描 (PET/CT,MRI,X 射线等)。)以提高癌症的早期检测,帮助减少乳腺癌筛查中的假阳性和不必要的手术,以实现结肠直肠癌筛查期间息肉的近实时分析,以及其他提高检测的方法。我将在随后的文章中看到这些。

什么是深度学习?

由于我将探索的大多数与癌症诊断相关的工作都严重依赖于深度学习,所以我决定该系列应该从深度学习的一些基础知识的简短介绍开始。
**免责声明:**我不是深度学习方面的专家,但我已经对这篇文章的准确性进行了审查。

深度学习是机器学习领域中人工智能的子集。它使用大型神经网络来学习数据中哪些特征是重要的,以及如何利用这些特征来预测新数据集[ 123 ]。

我们所说的(有监督的)学习是什么意思?嗯,机器学习算法需要三样东西才能发挥作用:输入数据,预期输出的例子(训练数据,以及一个反馈信号来表明算法执行得有多好。本质上,机器学习算法以一种有用的方式转换数据,从而产生有意义的输出。例如,我将查阅的一篇论文拍摄了一张皮肤病变的手机照片,并输出了该病变是否为恶性的预测。因此,在这种情况下,学习就是自动寻找更好的表达方式。

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

FIG 1: Diagram of a multi-layer feedforward artificial neural network. By Chrislb (derivative work: — HELLKNOWZ, TALK, enWP TALK ), CC BY-SA 3.0 via Wikimedia Commons

**我说深度学习用的是大型神经网络,但是是什么是神经网络?**神经网络是基于人类对大脑的理解。与大脑不同,在大脑中,神经元可以与任何其他神经元建立连接,神经网络被离散成具有信息流方向性的层[ 45 ]。这在图 1 的中进行了说明。数据被传递到第一层神经元并被处理。处理后的输出被向前传递到另一层,依此类推,直到它返回一个结果。

神经网络的基础——神经元

神经网络由称为神经元的类似物组成。我们将看看神经元的两种常见实现:感知器和 sigmoid 神经元[ 1 ]。历史上,神经网络起源于感知器。感知器最初是在 20 世纪 50 年代和 60 年代由弗兰克·罗森布拉特(Frank Rosenblatt)提出的。

一个感知机本质上表现得像一个逻辑门 [ 3456 。如果你对逻辑门不熟悉,它们是实现布尔逻辑[ 346 ]的模拟电路。它们将获取输入值并对其进行处理,以确定是否满足特定条件[ 图 2 ]。

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

FIG 2: A schematic representation of a neuron. The inputs, X, are weighted (indicated by the varying width of the arrows) and processed by the neuron’s activation function producing the output, y.

一个特别重要的门是与非门(一个负与门)。与非门在计算中是通用的,这意味着任何其他布尔函数都可以表示为与非门[ 178 ]的组合。这种想法的含义是,由于感知器可以实现与非门,感知器在计算中也是通用的[ 1 ]。

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

FIG 3: Illustration of the threshold function. This variation has a third component: if the product of the inputs is equal to the bias, that is they sum to zero, the output is 0.5. By PAR~commonswiki, CC-BY-SA-3.0 via Wikimedia Commons

神经元的两种实现在它们的激活/传递函数(决定神经元是开还是关的方程)[ 15 ]上有所不同。罗森布拉特感知机的美妙之处在于它的简单性。感知器将接受输入,并根据它们的权重组合它们,如果输入表明被分析的对象是该类的成员,则输出值 1,如果不是成员,则输出值 0[图 2 ]。感知器使用阈值函数,该函数将输出值 0,除非加权输入的和大于感知器的偏差阈值,在这种情况下,它将输出 1 [ 图 3图 4

阈值函数的问题是,感知器的权重或偏差的微小变化会在输出[ 1 ]的行为中产生难以控制的结果。这是因为激活函数的全有或全无性质。当试图优化神经元网络时,这就成了一个问题。

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

FIG 4: Vector representations of the activation functions of the two main types of neurons.

我们可以通过使用一个 sigmoid 函数 [ 图 5 ]而不是阈值函数来避免这个问题。

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

FIG 5: Illustration the the sigmoid function. Public Domain via Wikimedia Commons

sigmoid 函数(也称为逻辑函数,因为它是所用 sigmoid 函数的特殊形式)具有扁平 S 形的特性[ 图 5 ]。这与阈值函数曲线的“开/关”形状相比较[ 图 3 ]。

sigmoid 函数为神经元的输出产生更平滑的过渡。当我们接近图形的边缘时,神经元的行为就像感知器输出大约 0 或 1。神经元将随着 wx + b 的值变大而开启,随着其变小而关闭。零附近的区域是我们行为变化最大的地方。这个平滑和连续的区域允许我们对感知器的权重和偏差进行小的改变,而不会产生阈值函数可能产生的输出的大的改变。事实上,乙状结肠神经元是这些权重和偏差变化的线性函数[ 1 ]。这两个函数之间的另一个区别是,sigmoid 函数的允许输出是 0 和 1 之间的任何值,而 threshold 函数将输出 0 或 1 [ 1 ]。这对于确定某些特征是有用的,但是当应用于分类时就不那么清楚了[ 1 ]。解释这个单个神经元输出的一种方法是作为属于正在讨论的类别的概率。

将神经元结合成网络

单个神经元对于做出单个决定是有用的,但是我们如何扩展它们的有用性呢?在图 1 中,网络显示多个神经元可以组合起来组成一层神经元。只看图中的输入层,我们可以看到它由三个神经元组成,因此它能够做出三个非常简单的决策(尽管由于有两个输出神经元,网络本身只会进行两种分类)。我们可以通过增加层中神经元的数量来扩展简单决策的数量。该层的输出是数据[ 12 ]的表示。理想情况下,该表示提供了对正在解决的问题的一些洞察[ 图 6 ]。

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

FIG 6: Example mean activation shapes in a learned hierarchy. These are the representations of the data that are learned by the network. ViCoS Lab

神经元层可以堆叠起来进一步处理数据。我们可以把每一个后续层看作是获取前一层的输出,并进一步提取数据中包含的信息。多层网络能够提取足够的数据来做出复杂的决策。

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

FIG 7: A schematic representation of a multi-layer neural network. The input layer takes data from X and processes it and passes it to the first hidden layer. Each hidden layer processes and passes the data to the next. The output layer makes a prediction that is an array of probabilities of the input belonging to each of the possible classes. The result is checked by the loss function to determine the networks accuracy and this is passed to the optimizer which adjusts the weights of the information passing to each layer.

图 7 中显示了一个多层网络的例子。一些输入数据由神经网络的第一层转换(输入层**)。转换后的数据由第二层处理(称为隐藏层,因为它既不是输入也不是输出)[ 1 。这个输出将或者到下一个隐藏层或者到输出层。输出层将返回一个概率分数数组(其总和为 1) [ 2 ]。**

网络的输出通过损失函数(或反馈信号)进行分析,该函数测量预测的准确性 2 。网络的权重由一个优化器** [ 2 ]改变。**

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

FIG 8: A schematic of the information flow during optimization. The data loss shows the difference between the scores and the labels. The regularization loss is only dependent on the weights. Gradient descent allows us to find the slope of the weights and update them. Optimization: Stochastic Gradient Descent.

优化器使用梯度下降来确定如何更新权重。本质上,该算法遵循损失函数表面的斜率,直到找到一个谷[ 34图 8 ]。该信息通过反向传播的过程得到增强:“反向传播可以[……]被认为是门相互通信(通过梯度信号)它们是否希望它们的输出增加或减少(以及多强烈),以便使最终输出值更高” 5 。反向传播提供了关于改变权重和偏差将如何影响整个网络的详细信息。[ 6

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

FIG 9: Detailed activation of neurons in five layers. The activations show the representations that are deemed important by the network. Zeiler and Fergus, 2013.

包裹

总而言之:

  • 深度学习在癌症检测、活检分析中发挥着重要作用,并为在难以找到医生的地区增加筛查提供了可能性
  • 神经网络的基本构件是神经元
  • 神经元可以用不同的激活函数起作用,每个激活函数都有其优点和缺点
  • 神经元可以堆叠成层,并且这些层可以堆叠在一起,这增加了网络可以做出的决策的复杂性
  • 这些决策提供了数据的新表示[ 图 6图 9 ],这些数据有望提供洞察力
  • 可以使用损失函数和反向传播来优化神经元的输出,以提高网络的复杂度

感谢伊尔胡姆·沙夫卡特约翰·比约恩·尼尔森阅读我的草稿,提出很好的建议并确保准确性。我还要感谢我的妻子校对并提出建议,以提高本文的流畅度和清晰度。我要特别感谢我的朋友们,他们对技术的不同熟悉程度让我确信这能被广大的观众所接受。

我希望您喜欢这篇关于深度学习的介绍,并会回来阅读本系列的下一篇文章。关注我获取新帖子通知;留下评论让我知道你的想法;发送带有反馈的推文或开始对话;或者看看我的项目组合

参考

标题将链接到适当的资源,而[^将带你回到你正在阅读的部分。

什么是深度学习?

****【1】**机器学习精通。什么是深度学习?^
**【2】**英伟达博客。AI 和 ML 有什么区别?【^】
**【3】**技术评审。深度学习:凭借海量的计算能力,机器现在可以实时识别物体和翻译语音。人工智能终于变聪明了。^
**【4】弗朗索瓦·乔莱。用 Python 进行深度学习。第一章。[【^】
迈克尔尼尔森神经网络和深度学习。第一章。^

神经网络的基础——神经元

****迈克尔·尼尔森神经网络和深度学习。第一章。【
**【2】**维基百科。弗兰克·罗森布拉特——感知器。【^
**【3】**维基百科。逻辑门。^
**【4】**数据怀疑论者。前馈神经网络。[^]
凯文·斯温勒。第二讲:单层感知器。^,弗朗西斯克·卡米洛。逻辑门的神经表示。【^】
【7】百科。与非门。【^
维基百科。与非门逻辑——利用与非门制作其他门。^

将神经元结合成网络

********迈克尔·尼尔森神经网络和深度学习。第一章。[^
【2】弗朗索瓦·乔莱。用 Python 进行深度学习。第二章。[^]
【3】塞巴斯蒂安·鲁德。梯度下降优化算法概述。【^
【4】安德烈·卡帕西CS231n:视觉识别的卷积神经网络优化:随机梯度下降。【^
安德烈·卡帕西CS231n:视觉识别的卷积神经网络反向传播,直觉。【^
迈克尔尼尔森神经网络和深度学习。第二章。^

Pandas、Tidyverse、Pyspark 和 SQL 中的过滤、聚合和连接

原文:https://towardsdatascience.com/filter-aggregate-and-join-in-pandas-tidyverse-pyspark-and-sql-71d60cbd5330?source=collection_archive---------17-----------------------

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

Alike but different (Source)

祝福与诅咒

鼓舞人心的数据科学家最常问的一个问题是,他们应该为数据科学学习哪种语言。最初的选择通常是在 Python 和 r 之间。已经有很多对话可以帮助做出语言选择(这里的和这里的)。选择合适的语言是第一步,但我怀疑大多数人最终只使用一种语言。在我个人的旅程中,我先学了 R,然后是 SQL,再后来是 Python,再后来是 Spark。现在在我的日常工作中,我使用所有这些工具,因为我发现每个工具都有独特的优势(在速度、易用性、可视化等方面)。有些人确实只停留在一个阵营(有些 Python 人从未想过学习 R),但是我更喜欢使用现有的东西来创建我的最佳数据解决方案,并且使用多种数据语言有助于我与不同团队的协作。

正如机器学习的状态所指出的,我们面临着在数据团队中支持多种语言的挑战,跨语言工作的一个不利方面是我会把一种语言与另一种语言混淆,因为它们可能有非常相似的语法。考虑到我们拥有一个多种语言共存的数据科学生态系统,我很乐意并排写下这四种语言中的三种常见数据转换操作,以便阐明它们在语法层面的比较。将语法放在一起还有助于我在数据科学工具箱中更好地协同它们。希望对你也有帮助。

四种语言的三种数据操作

数据科学的前景是广阔的,我决定在这篇文章中关注最大的共同点。没有正式的统计数据支持,我想当然地认为:大多数数据科学工作都是基于表格数据;常见的数据语言有 SQL,Python,R 和 Spark(不是 Julia,C++,SAS 等。).

SQL 有一长串的方言(hive,mysql,postgresql,casandra 等等),我在这个帖子里选择 ANSI-standard SQL。纯 Python 和 Base R 能够操作数据,但是在这篇文章中我选择 Pandas 作为 Python,Tidyverse 作为 R。Spark 有 RDD 和数据帧,我选择专注于数据帧。Spark 在 Pyspark 和 Sparklyr 中都有 API,我这里选择 Pyspark,因为 Sparklyr API 和 Tidyverse 很像。

三种常见的数据操作包括筛选、聚合和连接。这三个操作允许您剪切和合并表格,导出平均值和百分比等统计数据,并为绘图和建模做好准备。由于数据争论消耗了大量的数据工作时间,这三种常见的数据操作应该占数据争论时间的很大一部分。

1。使用标准过滤表格

包含和排除在数据处理中是必不可少的。我们保留相关的,丢弃不相关的。我们可以用一个词来称呼包容和排斥:过滤。过滤器在表格数据中有两个部分。一个是过滤列,另一个是过滤行。使用这篇文章中著名的虹膜数据,我在下面列出了四种语言的过滤操作。

Question: What is the sepal length, petal length of Setosa with petal width larger than 1 ?# SQLselect Sepal_Length, Petal_Length from Iris where Petal_Width > 1 and Species=’setosa’;# PandasIris[(Iris.Petal_Width > 1) & (Iris.Species==’setosa’)][[‘Sepal_length’,’Petal_Length’]]# TidyverseIris %>% 
 filter(Petal_Width > 1, Species==’setosa’) %>%
 select(Sepal_Length, Petal_Length)# PysparkIris.filter((Iris.Petal_Width > 1) & (Iris.Species==’setosa’)).select(Iris.Sepal_Length, Iris.Petal_Length)

Pandas 使用括号来过滤列和行,而 Tidyverse 使用函数。Pyspark API 是借熊猫和 Tidyverse 两者之所长而定的。正如你在这里看到的,Pyspark 操作与熊猫和 Tidyverse 有相似之处。SQL 和往常一样是声明性的,显示出它的签名“从表中选择列,其中行符合标准”。

2。按组导出汇总统计数据

创建计数、总和及平均值等汇总统计数据对于数据探索和特征工程至关重要。当分类变量可用时,按某些分类变量对汇总统计数据进行分组也很常见。

Question: How many sepal length records does each Iris species have in this data and what is their average sepal length ?# SQLselect Species, count(Sepal_Length) as Sepal_Length_Count, avg(Sepal_Length) as Sepal_Length_mean from Iris group by Species; # Pandas
aggregated=Iris.groupby(by=’Species’,as_index=False).agg({‘Sepal_Length’: [‘mean’,’count’]})
aggregated.columns = [‘_’.join(tup).rstrip(‘_’) for tup in temp1.columns.values]# Tidyverse
Iris %>%
 group_by(Species) %>%
 summarize(Sepal_Length_mean=mean(Sepal_Length), Count=n())# Pyspark
from pyspark.sql import functions as FIris.groupBy(Iris.species).agg(F.mean(Iris.sepal_length).alias(‘sepal_length_mean’),F.count(Iris.sepal_length).alias(‘sepal_length_count’))

这个例子很好地说明了为什么我会对这四种语言感到困惑。编写“group by”有四种略有不同的方法:在 SQL 中使用group by,在 Pandas 中使用groupby,在 Tidyverse 中使用group_by,在 Pyspark 中使用groupBy(在 Pyspark 中,groupBygroupby都可以,因为groupby是 Pyspark 中groupBy的别名。groupBy看起来更真实,因为它在官方文件中使用得更频繁。

在聚合方面,Python 在这里非常不同。第一,它使用一个字典来指定聚合操作。第二,它默认使用 group by 变量作为索引,你可能不得不处理 multiindex。

3。连接表格以将功能放在一起

大数据工作的一个标志是将多个数据源集成到一个源中,用于机器学习和建模,因此 join 操作是必不可少的。有一个可用的连接列表:左连接、内连接、外连接、反左连接和其他连接。以下示例中使用了左连接。

Question: given a table Iris_preference that has my preference on each species, can you join this preference table with the original table for later preference analysis?# SQLselect a.*, b.* from Iris a left join Iris_preference b on a.Species=b.Species;# Pandaspd.merge(Iris, Iris_preference, how=’left’, on=’Species’)# Tidyverseleft_join(Iris, Iris_preference, by=”Species”)# PysparkIris.join(Iris_preference,[‘Species’],”left_outer”)

这真的很神奇,我们有很多方法来表达相同的意图,在编程语言和自然语言中。

数据争论的备忘单

语言丰富是福也是祸。对于社区来说,在未来对跨语言的公共数据操作的 API 进行标准化可能不是一个坏主意,这可以消除摩擦并增加可移植性。到目前为止,我调查了 Pandas、Tidyverse、Pyspark 和 SQL 中的 filter、aggregate 和 join 操作,以突出我们每天最常处理的语法细微差别。上面的并排比较不仅可以作为一个备忘单来提醒我语言的差异,还可以帮助我在这些工具之间进行转换。在我的 git 库这里有这个备忘单的一个更简洁的版本。此外,你可能会发现其他特定语言的备忘单很有帮助,它们来自 Pandas.org、R Studio 和 DataCamp。

与熊猫的数据角力:链接

与 dplyr 和 tidyr 的数据角力:链接

python for Data Science py spark:链接

如果你想在我的小抄里增加额外的数据运算对,那就连上吧!

最后,通过制作一个来学习如何使用命令行应用程序!

原文:https://towardsdatascience.com/finally-learn-how-to-use-command-line-apps-by-making-one-bd5cf21a15cd?source=collection_archive---------8-----------------------

冒着疏远很多读者的风险…我是和 GUI 一起长大的,所以我从来不需要学习终端的方式!在当今友好用户界面的社会中,这是被社会所接受的,除非你从事软件工程……哎呀!

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

Manager — “Oh this is easy, just use this command line app”, Me — ”Yes…the command line… I’ll use that…”

找回我的软件工程街头信誉

我已经通过从 Stack-Overflow 复制和粘贴完整的命令行操作走了很远,但还没有足够舒适地“正确”使用命令行应用程序。最终让我喜欢上它的是当我偶然发现一个非常方便的 python 库,叫做arg parse,它允许你为你的 python 脚本构建一个漂亮健壮的命令行界面。

**本教程对如何使用 **argparse、进行了深入的解释,但我还是要回顾一下关键的开眼器 :

argparse 是标准 python 库的一部分,所以打开你的代码编辑器,跟着做(你不需要安装任何东西)!

帮助

每个命令行 app 最有用的部分!

# inside a file called my_app.py**import** **argparse**
parser = argparse.ArgumentParser(description="*Nice little CL app!*")
parser.parse_args()

上面的代码什么也不会做,除了默认情况下你有帮助标志!

在命令行中,您可以运行:

python my_app.py --help

或者

python my_app.py -h

您将得到如下输出:

usage: my_app.py [-h] **Nice little CL app!** optional arguments:-h, --help  **show this help message and exit**

看起来很酷,对吧?但是等一下,当你使用 argparse 到添加更多功能(见下文)时,这个帮助输出将自动填充你如何使用你的应用程序的所有指令!

必需的参数

假设你想让你的应用程序接受一些变量,我们只需使用parser.add_argument()函数,并给我们的参数一些标签(在这种情况下是“名称”):

import argparse
parser = argparse.ArgumentParser(**description**="*Nice little CL app!*") parser.add_argument("***name***", **help**="*Just your name, nothing special*") args = parser.parse_args()
print("*Your name is what?* " + args**.name**)

注意我们是如何添加帮助文本的!现在,当我们运行python my_app.y -h时,我们会获得所有应用程序的详细信息:

usage: my_app.py [-h] name **Nice little CL app!** positional arguments:name        **Just your name, nothing special** optional arguments:-h, --help  **show this help message and exit**

很酷,但是让我们用python my_app.py来运行我们的应用程序

usage: my_app.py [-h] namemy_app.py: error: too few arguments

没错!自动输入检查!

现在让我们运行python my_app.py "Slim Shady"

Your name is what? Slim Shady

相当光滑!

可选参数

也许你想让某人告诉你更多关于他们的事情?在使用parser.add_argument()函数时添加双破折号将使该参数可选!

import argparse
parser = argparse.ArgumentParser(**description**=”*Nice little CL app!*”)
parser.add_argument(“*name*”, **help**=”*Just your name, nothing special*”) parser.add_argument("***--****profession*”, **help**=”Y*our nobel profession*”) args = parser.parse_args()
print(“*Your name is what?* “ + args.name)if args.profession:
    print(“*What is your profession!? a* “ + args.profession)

如果要为该参数传递一个变量,只需在要传递的变量前指定双虚线参数名称:

python my_app.py "Slim Shady" **--profession "gift wrapper"**

这给了你:

Your name is what? Slim ShadyWhat is your profession!? a gift wrapper

或者可以不用,毕竟是可选的!

python my_app.py "Slim Shady"

仍然给你:

Your name is what? Slim Shady

并且在运行时再次神奇python my_app.py -h:

usage: my_app.py [-h] [--profession PROFESSION] name **Nice little CL app!** positional arguments:name                      **Just your name, nothing special**optional arguments:-h, --help                **show this help message and exit**--profession PROFESSION   **Your nobel profession**

旗帜

也许你只是想让一些很酷的事情发生。将action="*store_true*"添加到您的parser.add_argument()函数中,您就有了一个标志参数:

import argparseparser = argparse.ArgumentParser(**description**="*Nice little CL app!*")
parser.add_argument("*name*", **help**="*Just your name, nothing special*")
parser.add_argument("*--profession*", **help**="*Your nobel profession*") parser.add_argument("*--cool*", **action**="*store_true*", **help**="*Add a little cool*") args = parser.parse_args()
print("*Your name is what?* " + args.name)cool_addition = " *and dragon tamer*" if args.cool else ""if args.profession:
    print("*What is your profession!? a* " + args.profession + cool_addition)

它非常简洁,您只需将标志的名称放入您的命令中,如下所示:

python my_app.py "Slim Shady" --profession "gift wrapper" **--cool**

转眼间。

Your name is what? Slim ShadyWhat is your profession!? a gift wrapper and dragon tamer

记住,你不必使用它,它只是一面旗帜:

python my_app.py "Slim Shady" --profession "gift wrapper"

还是会给:

Your name is what? Slim ShadyWhat is your profession!? a gift wrapper

看看帮助命令python my_app.py -h:

usage: my_app.py [-h] [--profession PROFESSION] [--cool] name **Nice little CL app!** positional arguments:name                      **Just your name, nothing special**optional arguments:-h, --help                **show this help message and exit**--profession PROFESSION   **Your nobel profession**--cool                    **Add a little cool**

我只是假设从现在开始你和我一样对此感到满意。

简易格式

揭开了困扰我很久的神秘的一个角色的争论。仅仅通过在你的parser.add_argument()函数中添加一个以单个破折号为前缀的单个字母,你就可以得到相同参数的超短版本:

import argparseparser = argparse.ArgumentParser(**description**="*Nice little CL app!*")
parser.add_argument("*name*", **help**="*Just your name, nothing special*")parser.add_argument("-p", "*--profession*", **help**="*Your nobel profession*")parser.add_argument("-c", "*--cool*", **action**="*store_true*", **help**="*Add a little cool*")args = parser.parse_args()
print("*Your name is what?* " + args.name)
cool_addition = " *and dragon tamer*" if args.cool else ""
if args.profession:
    print("*What is your profession!? a* " + args.profession + cool_addition)

这样就不用输入:

python my_app.py "Slim Shady" --profession "gift wrapper" --cool

您只需键入:

python my_app.py "Slim Shady" -p "gift wrapper" -c

您将得到相同的输出:

Your name is what? Slim ShadyWhat is your profession!? a gift wrapper and dragon tamer

这反映在帮助文本中(python my_app.py -h):

usage: my_app.py [-h] [--profession PROFESSION] [--cool] name**Nice little CL app!**positional arguments:name                           **Just your name, nothing special**optional arguments:-h, --help                      **show this help message and exit**-p PROFESSION, --profession PROFESSION   **Your nobel profession**-c, --cool                      **Add a little cool**

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

a perfect little command line app!

你现在有了一个完美的小命令行应用程序,希望你能更舒服地找到命令行应用程序!

只要记住--help

** [## ZackAkil/超级简单命令行应用程序

超级简单的命令行应用程序代码“终于学会如何使用命令行应用程序…通过制造一个!”

github.com](https://github.com/ZackAkil/super-simple-command-line-app)**

最后,欧盟让你控制你的银行数据

原文:https://towardsdatascience.com/finally-the-eu-is-giving-you-control-of-your-banking-data-57f0ee424a3d?source=collection_archive---------4-----------------------

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

消费者和企业的朋友。银行和美国的敌人?

什么是 PSD2,它将如何帮助我?

不,这不是 R2D2 的表弟。PSD2 是欧盟银行指令的第二个版本,其主要目的是保护消费者。现在我们都知道银行立法通常不被认为是令人兴奋的,但 PSD2 将在 2018 年到来,以撼动系统,让银行客户控制他们的财务数据,并让企业有机会在金融服务中竞争。通过 PSD2,您将能够允许获得许可的第三方金融服务提供商访问您的银行信息(在明确同意的情况下),他们可以使用这些信息来分析您的支出并为您提供预算建议,或者引导您使用更便宜的抵押贷款或更高利息的储蓄账户。第三方也将能够提供跨越国界延伸到整个欧盟和欧洲经济区的支付服务,这意味着消费者可以更快地验证和更少的费用。

所以如果你想象你想成为一个商人,在整个欧盟销售产品。或者想从一个欧洲国家搬到另一个欧洲国家。你马上就能做到这两点。您不需要一个新的外国银行账户,因为您可以允许您的财务数据跨境共享,并在整个欧盟范围内进行支付。而且你的身份和名声很容易被验证。

在本文中,我们将了解为什么需要 PSD2,它是如何工作的,它对消费者、企业和银行意味着什么,以及它将如何影响欧盟和美国。

第三方提供商有两种新的许可证类型

账户信息服务提供商(AISP)—这些服务提供商可以在一个地方为用户提供一个或多个支付账户的汇总信息,帮助消费者更好地管理他们的财务。这可以包括交易历史、往来账户余额、储蓄账户、直接借记和其他存款和支付。

支付启动服务提供商(PISP)—这些服务有助于使用网上银行进行支付。这可以是账户之间的在线资金转账、直接借记、信用转账以及通过借记卡或信用卡进行的交易等。当谈到避免信用卡费用和其他交易成本时,这是一个游戏规则的改变者。

我们为什么需要 PSD2?

第一个指令 PSD1 是在 2008 年金融危机前起草的。不出所料,自那以后,世界发生了很大变化。在政治上,由此产生的紧缩政策和高失业率加剧了欧盟的动荡。在经济上,欧盟增长落后。在数字方面,非洲大陆没有大公司来挑战美国的公司,这意味着当我们从美国购买数字和技术产品和服务时。因此, 欧盟的现金充斥着美国的账户,有价值的数据源源不断地流入美国的服务器,而美国的数据保护法对消费者的友好程度要低得多。PSD2 的不可告人的动机是解除管制,让欧盟的数字企业获得竞争优势——并迅速提振欧盟经济。

据报道,2008 年金融危机之后,欧盟领导人也对银行拥有的权力感到不满。凭借对客户数据的独家访问权,他们是唯一能够通过向客户出售金融服务来赚钱的人,而这往往意味着高额费用。这种对客户数据的垄断在 2015 年为欧盟银行赚取了约 1280 亿€,占其零售银行收入的四分之一。这些高额费用的另一个原因是过时和昂贵的行政和安全系统。每年都有数百万人正式投诉他们的银行。金融科技和区块链公司最近在欧盟的成功证明,向第三方开放金融服务将意味着更多的竞争、创新机会和更好的安全性——同时降低消费者的成本

金融科技并不新鲜

70%的欧盟客户使用应用程序进行网上银行业务,40%的客户使用软件进行移动支付。Sofort、iDEAL 等金融科技公司完成了荷兰和德国超过一半的在线支付业务。在英国,你可以通过朋友的电话号码向他们支付小额款项。然而,如果金融科技公司能够获得客户交易信息,它们还可以提供许多其他服务。目前,大多数银行都配合这些数据请求,但它们可能会响应缓慢,有时甚至会完全阻止这些请求。PSD2 将强制要求共享数据,并建立能够实现实时交易的系统。消费者和企业的巨大胜利。

金融科技只会越来越大。根据毕马威的数据,2016 年对金融科技的投资总额为 247 亿美元。随着私营部门发展 2 在该部门创造更多机会,这一数字今年可能会超过。

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

安全呢?

所有第三方提供商的安全措施都很严格。他们必须得到许可、保险、监管和监督。例如,帮助公司跟踪工作流程和发票的芬兰初创公司 Holvi 被芬兰金融监管局监管并许可为支付机构,在整个欧盟范围内运营。它和传统银行一样由同一权威机构监管,并为欺诈损失提供保险。所有的客户资金也与公司资产分开存放,所以在破产的情况下,你的钱是安全的,可以随时提取。保护消费者是这项指令的重点。

随着人工智能的改进,欺诈将更容易被发现。这将为零售商和商家节省数十亿欧元的损失,避免因不正确的欺诈检测而导致的网上虚假下降。虚假拒绝还会导致许多顾客的流失,因为据估计,大约三分之一付款被拒绝的用户不会再回到在线零售商那里。通常情况下,失去业务的成本超过了欺诈带来的潜在损失。

不仅仅是公司被检查。PSD1 指令的一个重要变化是需要 SCA、强客户认证。每次您想要使用这些第三方服务之一时,您都必须完成一个更强大的两步认证,该认证包括以下三个组件中的两个组件的组合:

  1. 你拥有的东西——例如手机或物联网设备,如 PINsentry 读卡器
  2. 一些你知道的东西,比如一个别针、个人信息或秘密信息
  3. 你是什么样的人——指纹或面部识别等生物识别技术

公司还需要承担责任,通过加密、混淆、root 和越狱保护、设备绑定和密钥保护等方法保护消费者数据。欧盟本身也将需要开发区块链式的分布式账本基础设施,用于身份验证和交易认证。这些技术可能已经很难实现,但更难让用户友好,这就是为什么银行应该寻求金融科技公司的帮助

PSD2 对银行意味着什么?

周围有一些可怕的统计数据;高盛已经加入进来,并估计传统银行可能会损失多达 4.7 万亿美元的收入,这有利于金融科技公司。然而,大多数金融分析师和评论员似乎都同意,银行应该积极看待 PSD2,将其视为一个创新机会。金融科技可以提供单独的组件,但银行将占据先机,特别是在创建有关身份和数据(他们目前拥有)以及资本(他们目前拥有)的优质实用程序时。

一些银行已经选择接受 PSD2 将带来的变化。西班牙银行 BBVA 已经收购了 Holvi,并将与他们合作提供新的公共设施。其他银行雇佣了专业的研发部门、创新和孵化团队,开始拆分过时的 IT 系统,甚至赞助黑客马拉松。

从使用会计和薪资软件到通过众筹融资而不是获得贷款来筹集资金,中小企业现在在全球范围内运营,并且更加精通技术。对于银行来说,重要的是满足中小企业不断变化的需求,并保持金融创新的领先地位,以避免竞争对手在开始使用第三方提供商时获得优势或失去与客户的联系。Facebook Messenger 计划提供一项服务,允许用户通过其社交网络向朋友支付小额款项。如果脸书每月 20 亿活跃用户中的每一个人都注册这项服务,并输入他们的银行账户信息,那么与数百年来传统银行来之不易的客户基础相比,它可能会在非常短的时间内拥有世界上最大的金融消费者网络之一。

从法律上讲,银行将被要求允许第三方访问数据,但仍要对这些信息的安全性负责。他们还将负责为这些新的竞争对手提供便利的余额检查、报表检查和支付初始化。

它将如何工作?

将银行及其数据连接到第三方的最广泛认同的解决方案是使用 API,即应用程序编程接口。它本质上是一种将一个服务器、移动应用程序或网站插入另一个服务器、移动应用程序或网站,并允许它们相互通话,同时仍然独立工作的方式。在这种情况下,it 可以控制银行希望接收数据请求的方式,以及金融应用程序设计人员希望接收数据的方式,以便最好地与客户沟通。通常,大多数大型商业网站都希望对他们的代码保密,因为他们不希望开发者窃取他们花了很多钱开发的代码。然而,许多人已经意识到,通过向开发者发布他们代码的某些部分,他们通常会得到更好的产品和服务的回报。API 是他们公开的代码的一部分。因此,银行将能够从开发人员社区获得许多新功能,开发人员也有机会在一些昂贵的专业代码和一个巨大的平台上进行构建,以推广他们的工作。

API 还有助于解决如何连接银行、金融科技公司、零售商、社交网络和任何其他计划提供金融服务的人的新生态系统的问题。银行目前已经拥有专有的 IT 系统,这些系统可能会也可能不会连接到云基础设施。考虑到安全性和法规,将整个结构迁移到云中是不安全的。但是,当需要相互协作的操作数量只会不断增加时,集成新的和不同的组件也是如此。随着越来越复杂的系统一个接一个地被开发出来,其结果几乎肯定意味着昂贵且耗时的技术债务。

因此,答案似乎在于混合集成,它使用一个与当前银行内部已经建立的系统相连接的云系统。新的金融科技合作伙伴将能够通过互联网立即加入核心结构,而不需要耗时的入职。通过整合云系统,银行还将受益于即时增加的容量,这对于 PSD2 将带来的实时数据和交易的新需求和增加的需求将是无价的。

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

荷兰正在发生什么?

除了上述所有好处,该指令在荷兰尤其令人兴奋,因为荷兰是许多金融科技初创公司、孵化器和加速器的所在地。随着英国退出欧盟的迅速临近,许多公司正在寻找英国以外的地点。海牙和鹿特丹等荷兰城市是有吸引力的选择,阿姆斯特丹已经是几家金融科技初创公司、许多顶级以太坊开发商和 BitPay 欧盟总部的所在地。

荷兰金融科技初创公司 Adyen 是整个欧盟获得资金最多的公司之一。其当前价值为 23 亿美元。该公司在一个系统中提供了从信用卡到 Apple Pay 的 250 种不同的支付选择,提供了一种“无摩擦的支付体验”。客户包括网飞、LinkedIn、Spotify、优步、Etsy 和 Groupon。

在阿姆斯特丹,已经有一个强大的技术生态系统,这使它成为 PSD2 改变金融科技和其他几个行业的完美场所。从高速宽带和 LoRaWAN 物联网网络到政府主导的计划、创业孵化器和加速器,以及致力于创新的大学和研究人员。

几周后,EIT Digital 将在该市开设一个金融科技创新中心,由市政府、CWI(数学和信息学中心)、ING 银行、飞利浦和 TNO(荷兰应用科学研究组织)提供支持。该中心相信“投资数字业务对荷兰知识经济非常重要”,将专注于金融区块链技术、人工智能和网络安全领域的研究、教育和创新。

PSD2 会影响美国银行业吗?

简短的回答是没有。它仅适用于在欧盟内部进行的部分支付交易。然而,私营部门司 2 将实施所谓的“一条腿伸出”政策。这意味着一旦资金被记入欧盟内的实体账户,该指令将对支付服务提供商产生影响。对于对外支付,支付服务提供商必须遵守 PSD2,直到欧盟的清算账户被借记。

更长的答案是肯定的,尽管是间接的。这与该指令的竞争性有关。欧洲在个人数据保护方面一直采取比美国更进步的立场,如果你考虑到 2006 年针对谷歌的“被遗忘权”裁决等案例,美国通常会将欧盟列为“反大企业技术”。

目前,Visa 和 Mastercard 等美国金融公司已经在全球和欧盟铺设了支付基础设施。如果一个公司或消费者想要使用这些框架,他们必须付费。如果欧盟可以使用 PSD2 来创建计划中的强大验证和直接帐户到帐户支付系统,美国的系统将变得缓慢、昂贵,并且与欧洲电子商务无关。欧盟将能够改变收费标准,向境外公司收取费用,让他们使用新的基础设施。

机器学习算法可以帮助我们评估金融决策的风险

原文:https://towardsdatascience.com/financial-data-analysis-2f86b1341e6e?source=collection_archive---------15-----------------------

贷款资格预测:探索性数据分析

在本系列的第一部分的中,我展示了一些必要的数据处理,包括:移除常量特征、移除重复特征、移除重复行、移除与 85%缺失值相关的特征>。这些是我们需要在几乎每个数据集上执行的初步步骤。完成上述处理后,我能够移除 60 个不相关的特征,剩下 153 个初始特征中的 93 个。在的第二部分,我手动检查了每一个特征,处理文本并删除了一些不必要的特征。在数据处理和清理结束时,我们有 36 个相关特征。

在这一部分,我对所选择的 36 个特征进行了一些探索性的分析。这些分析包括可视化特征的相关系数,去除高度共线的特征。

让我们从导入库和读取具有所选功能的数据集开始:

import warnings
warnings.filterwarnings("ignore")import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snsfrom sklearn.utils import shuffle, class_weight
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

读取数据

df_selected = pd.read_csv('./data/df_selected.csv')

特征关联

可视化特征之间的关系是一组数据可能对应于另一组数据的方式之一。特别是在机器学习中,特征相关性的重要性是显著的。它帮助我们识别坏的和高度共线的特征。相关矩阵也可以用于特征工程。在下图中,显示了特征之间的关系:

corr = df_selected.corr()
plt.figure(figsize = (10, 8))
sns.heatmap(corr)
plt.show()

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

从上面的图中,我们看到解释特性关系有点棘手。所以,我们要具体一点。例如,如果我们想知道特征是如何与目标变量相关的,我们必须编写下面的代码来获得特征与目标变量的相关系数:

corr['loan_status'].sort_values(ascending = False)
                   .to_frame('corr_value')
                   .reset_index()

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

从上面打印的结果来看,sub_grade 与目标变量贷款状态的正相关性最高,其次是等级、利率等。Fico_range_high 和 Fico_range_low 的负相关性最高。由于 Fico_range_high 和 Fico_range_low 具有几乎相同的相关系数(-0.136),所以我们可以将它们合并,取它们的平均值并删除它们。

df_selected['avg_fico_score'] = (df_selected['fico_range_high'] + df_selected['fico_range_low'])/2.0df_selected.drop(['fico_range_low','fico_range_high'], axis=1, inplace=True)

寻找高度相关的特征

现在,我们有了要素的相关系数矩阵,查找高度共线(高度相关)的要素变得更加容易。使用下面的代码,我找到了共线特性:

funded_amnt           loan_amnt           1.000000
funded_amnt_inv       loan_amnt           0.999996
                      funded_amnt         0.999996
int_rate              term                0.435879
installment           loan_amnt           0.952673
                      funded_amnt         0.952673
                      funded_amnt_inv     0.952653
grade                 term                0.446887
                      int_rate            0.962951
sub_grade             term                0.454138
                      int_rate            0.985559
                      grade               0.976940
total_acc             open_acc            0.689583
acc_open_past_24mths  open_acc            0.482634
                      total_acc           0.428877
mort_acc              home_ownership     -0.477745
pub_rec_bankruptcies  pub_rec             0.642983
tax_liens             pub_rec             0.695931
credit_history        earliest_cr_year   -0.994442
fico_grade            int_rate            0.792840
                      grade               0.821197
                      sub_grade           0.798134

从上面的结果中,我们看到’ funded_amnt ‘和’ loan_amnt ‘有 100%的相关性,这告诉我们,它们本质上是一样的。同样,’ funded_amnt_inv ‘与’ loan_amnt ‘和’ funded_amnt ‘的关联度几乎是 100%。因此,我删除了’ funded_amnt ‘,’ funded_amnt_inv '功能。

df_selected.drop(['funded_amnt','funded_amnt_inv'], axis=1, inplace=True)

我还发现以下特性与建模目的无关。因此,我将它们从数据中删除:

df_selected.drop(‘earliest_cr_year’, axis = 1, inplace=True)
df_selected.drop('issue_year', axis = 1, inplace=True)

删除特性后,我们得到了 29 个最相关和最重要的特性以及一个目标特性‘loan _ status’。

分类特征与连续特征

好的,让我们看看这些特征是具有分类值还是连续值。它帮助我们找到合适的建模算法:

cat_features.remove('loan_status')['term',
 'grade',
 'emp_length',
 'home_ownership',
 'verification_status',
 'purpose',
 'initial_list_status',
 'application_type',
 'pub_rec_bankruptcies',
 'disbursement_method',
 'issue_month',
 'issue_year']

我们看到 12 个特征≤14 个唯一值。只有六个要素具有超过 1200 个唯一值。这意味着大多数特征都是绝对的。因此,基于树的算法将是尝试的第一选择。

还有许多其他可以执行的 EDA。但由于时间的限制,我不会做进一步的分析功能。相反,在下一部分中,我将着重于选择一个合适的算法,然后创建一个模型。

系列的下一部分,我将开始创建模型。同时,如果你对这部分有任何问题,请在下面写下你的意见。你可以联系我:

Email: sabbers@gmail.com
LinkedIn: [https://www.linkedin.com/in/sabber-ahamed/](https://www.linkedin.com/in/sabber-ahamed/)
Github: [https://github.com/msahamed](https://github.com/msahamed)
Medium: [https://medium.com/@sabber/](https://medium.com/@sabber/)

机器学习算法可以帮助我们评估金融决策的风险

原文:https://towardsdatascience.com/financial-data-analysis-51e7275d0ae?source=collection_archive---------11-----------------------

贷款资格预测:创建预测模型

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

本文是构建预测模型系列文章的最后一部分。在前两部分(第一部分第二部分,我展示了如何处理和清理原始数据。然后在的第三部分,我将展示如何执行一些探索性的数据分析(EDA)来理解数据和特性工程。在处理和 EDA 的最后,我们现在有了 30 个最相关的特性,包括目标变量 loan_status。在文章的最后,也是最激动人心的部分,我将展示如何从一个简单的模型开始,然后继续构建一个高精度的复杂模型。在这项工作中,我能够构建一个基于树的 LightGBM 模型,准确率为 87%,而初始的逻辑模型预测准确率为 66%。在接下来的部分中,我描述了用必要的理论和代码改进模型的一步一步的过程。好了,让我们从导入一些必要的库开始。

导入库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snsfrom sklearn.linear_model import LogisticRegressionimport lightgbmfrom sklearn.utils import resample
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_validate, KFoldfrom sklearn.metrics import recall_score, roc_auc_score, f1_score
from sklearn.metrics import accuracy_score, roc_auc_score, \ classification_report, confusion_matrix

读取所选功能

df_selected = pd.read_csv(‘./data/df_selected.csv’)df_selected.describe(include = 'all')

看阶级比例

在我们开始任何事情之前,让我们检查一下数据集中的类比率。如果一个类的例子数量很少,而另一个类的例子数量很多,我们就认为数据是不平衡的,我们必须在创建模型之前解决这个问题。以下代码显示了我们使用的数据的类比率:

df_selected.loan_status.value_counts(normalize=True)0    0.783494
1    0.216506
Name: loan_status, dtype: float64df_selected.loan_status.value_counts()
0    358436
1     99048
Name: loan_status, dtype: int64

显然,上面打印的结果显示数据集是不平衡的。1 类(已注销)是少数类别,占全部样本的 21.6%。该数据集中,按时还清贷款的申请人比被取消贷款的申请人更多。这对于机器学习模型来说是一个问题,因为该模型将主要基于具有更多示例的类来学习其参数。因此,模型会偏向多数阶级。要解决不平衡的阶级问题,我们可以使用许多技巧,例如:

(1)分配类权重(2)使用具有交叉验证的集成算法(3)对少数类进行上采样或对多数类进行下采样

在我的另一篇博客([用不平衡数据集提高机器学习模型性能的三种技术](http://In my other blog (‘Three techniques to improve machine learning model performance with imbalance datasets’) I wrote a blog post describing the above three techniques. In this work, I have tried all the techniques and found upsampling minority class improves the model’s generalization on unseen data. I the code below I upsample minority class with Scikit-learn ‘resample’ method.))中,我解释了这三种技术的细节。我还展示了如何逐步提高模型的性能。在这项工作中,我尝试了所有的技术,发现对少数类进行上采样可以提高模型对未知数据的泛化能力。因此,在本文中,我只关注重采样技术。

对少数民族类进行重采样

处理高度不平衡数据集的一种流行技术叫做重采样。虽然该技术在许多情况下被证明是有效的,以解决不平衡的阶级问题,但是,它也有其弱点。例如,来自少数类的过采样记录会导致过拟合,而从多数类中移除随机记录会导致信息丢失。在向上采样小类和向下采样大类中,我发现带有向上采样的模型在未知数据上表现得更好。下面的代码显示了这种机制:

df_major = df_selected[df_selected.loan_status == 0]
df_minor = df_selected[df_selected.loan_status == 1]df_minor_upsmapled = resample(df_minor, replace = True, n_samples = 358436, random_state = 2018)df_minor_upsmapled = pd.concat([df_minor_upsmapled, df_major])df_minor_upsmapled.loan_status.value_counts()1    358436
0    358436
Name: loan_status, dtype: int64

在上面的代码中,我首先将类分成两个数据帧:1。df_major 和 2。df_minor。然后,我使用 df_minor 将其向上采样到与主类相同的数字,即 358436。请注意,我将替换选项保持为 true。如果我被向下采样,那么我会保持替换选项为假。最后,我将上采样的 minor 类与 major 类连接起来。看看 loan_status 特性的类,它们现在很明显是平衡的。我建议以迭代的方式尝试不同的技术,直到找到更好的模型。

数据标准化

在本节中,我通过去除每个样本的平均值,然后除以标准偏差来重新调整数据。零均值和单位标准差有助于加快模型的优化。我使用了 Scikit-learn StandardScaler 方法。在此之前,我将数据集分为训练和测试部分。以下代码不言自明:

X = df_minor_upsmapled.drop('loan_status', axis = 1)
Y = df_minor_upsmapled.loan_statusxtrain, xtest, ytrain, ytest = train_test_split(X, Y, test_size=0.25, random_state=0)mms = StandardScaler()
mms.fit(xtrain)
xtrain_scaled = mms.transform(xtrain)

现在我们的数据已经准备好了,我继续下一步:构建模型。正如我之前所说,从逻辑回归这样的简单算法开始有助于保持事情的简单,并作为复杂模型的基准。

逻辑回归模型

逻辑回归是一种借用统计学的建模技术。这是第一个算法,应该从复杂模型开始,并不断向复杂模型发展。这种算法相对简单,易于实现,这就是为什么我总是首先从这种技术开始,并记录模型的性能,用于将来复杂模型的基准测试。它帮助我轻松直观地前进。好的,让我们看看逻辑回归是如何执行的:

logisticRegr = LogisticRegression()
logisticRegr.fit(xtrain_scaled, ytrain)LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True, intercept_scaling=1, max_iter=100, multi_class='ovr', n_jobs=1, penalty='l2', random_state=None, solver='liblinear', tol=0.0001, verbose=0, warm_start=False)

在上面的代码中,我用默认的 LR 参数训练模型。下面,我使用训练数据中使用的相同标准化参数均值和标准差来标准化测试数据,然后预测测试数据。

xtest_scaled = mms.transform(xtest)
lr_pred = logisticRegr.predict(xtest_scaled)

为了查看测试数据的性能,我编写了一个名为“evaluate_model”的函数,它打印不同的评估标准:1)准确性,2) ROC-AUC 得分,3)混淆矩阵和 4)详细的分类报告。

最后,让我们看看逻辑回归的表现:

evaluate_model(ytest, lr_pred)Accuracy of the model: 0.66409066053633

Classification report: 
             precision    recall  f1-score   support

          0       0.66      0.68      0.67     89877
          1       0.67      0.65      0.66     89341

avg / total       0.66      0.66      0.66    179218

Confusion matrix: 
[[60846 29031]
 [31170 58171]]

上述预测并不是一个坏的开始,但并不令人印象深刻。模型的精度只是在随机猜测之上一点点。我们看到最简单的模型给出了 66%的准确度。因此,我们还有很多工作要做,以制造一个高效的模型。我们必须选择一个更好的算法并调整其超参数,以使模型优于逻辑回归模型。

如果我们使用下面的代码查看特征的唯一值,我们会看到几乎 60%的特征是分类的,其余的是连续的。显示器看 GitHub jupyter 笔记本

features = pd.DataFrame([], columns = ['feature_name', 'unique_values'])
for i, col in enumerate(df_selected.columns):
    features.loc[i] = [col, len(np.unique(df_selected[col]))]features.sort_values('unique_values')

选择合适的模型是数据科学家面临的另一个挑战。有时,在尝试不同的算法之前,即使是经验丰富的数据科学家也无法判断哪种算法的性能最佳。在我们最终的数据集中,几乎 60%的特征是绝对的。在这种情况下,基于树的模型可能是更好的选择。尽管如此,还是很难预测。如果基于树的算法执行得不太好,我们可以尝试另一种算法,如神经网络。然而,在这个项目中,我将首先尝试基于树的集成技术:bagging(随机森林)和 boosting (LightGBM)算法。好吧,让我们从随机森林开始。

随机森林(RF)模型

随机森林是一种灵活且易于使用的机器学习集成算法。该算法是如此的轻巧和有效,即使没有超参数调整,它也可以产生很好的结果。它也是最常用的算法之一,因为它简单,而且可以用于分类和回归任务。方法的详细内容可以在 Scikit-Sklearn 网页上或者在这篇博文中找到:https://towardsdatascience . com/the-random-forest-algorithm-d 457d 499 fcd。让我们开始建模:

在上面的函数中,我首先定义了超参数。随机森林的重要超参数是估计数和树的最大深度。我更喜欢迭代地寻找最优超参数。在这种情况下,我首先从少量估计量开始,然后慢慢增加。我发现这个手动过程比使用 GridSearchCV 或 RandomSearch 更有效、更直观。还有另一种称为贝叶斯超参数优化的技术,可以用来找到一组合适的超参数。这种方法似乎更有效率和效果。在我的下一个项目中,我会尝试另一个项目。关于该技术的更多细节可以在威廉·科尔森的博客文章“机器学习贝叶斯超参数优化的概念解释”中找到。如前所述,我从最重要的超参数的一个小数值开始,一旦找到最佳值,我就从下一个有影响的超参数开始,依此类推。

好了,是时候看看随机森林在测试数据上的表现了:

evaluate_model(ytest, rfpred, rfpred_proba)ROC-AUC score of the model: 0.8054282761077389
Accuracy of the model: 0.7304177035788816

Classification report: 
             precision    recall  f1-score   support

          0       0.75      0.69      0.72     89877
          1       0.71      0.77      0.74     89341

avg / total       0.73      0.73      0.73    179218

Confusion matrix: 
[[61972 27905]
 [20409 68932]]

哇,拉多姆森林做得更好。几乎 11%的准确率来自逻辑回归,这是一个伟大的成就,证明了基于树的模型在分类数据上表现良好。

因为进一步调整超参数并不能提高模型性能,所以我停止了对随机森林模型的研究。我尝试了其他超参数并增加了 n_estimators,但没有帮助。这些困难帮助我决定使用梯度增强树。因为我不打算进一步使用随机森林,所以让我们检查一下模型的健壮性。找出交叉验证的一种方法。

随机森林模型的交叉验证

交叉验证是在实践中使用独立数据集评估模型及其泛化能力的有效方法之一。如果该模型在不同褶皱上的表现是一致的,那么我们可以说该模型是稳健的并且表现良好。在下文中,我们使用 Scikit-Sklearn 交叉验证方法测试 RF 模型的稳健性:

scoring = [‘accuracy’, ‘recall’, ‘roc_auc’, ‘f1’]scores = cross_validate(rf, X = xtrain_scaled, y = ytrain, scoring = scoring, cv = 10, return_train_score = False, verbose = 10, n_jobs= -1)

正如你在上面的代码中看到的,我使用了四个不同的评估指标(“准确性”、“回忆”、“roc_auc”、“f1”)来判断模型的泛化能力。让我们看看结果:

scores{'fit_time': array([519.01635194, 519.08185387, 518.91476393, 514.854949  ,
        491.86662292, 491.60002613, 492.63204885, 491.53150296,
        296.78954768, 297.04013801]),
 'score_time': array([10.45862293, 10.56293011, 10.65213013, 10.40467215, 10.21855617,
        10.32528472, 10.14684105, 10.33355498,  6.49080539,  6.19442701]),
 'test_accuracy': array([0.72979206, 0.7310196 , 0.73124279, 0.73332589, 0.73371648,
        0.72999163, 0.7343625 , 0.72937785, 0.73207477, 0.73201399]),
 'test_recall': array([0.76737272, 0.77194352, 0.77324415, 0.77840951, 0.77421033,
        0.77122896, 0.77728641, 0.77037422, 0.77174923, 0.77271545]),
 'test_roc_auc': array([0.80477504, 0.80651739, 0.80334897, 0.8090473 , 0.80837787,
        0.80377023, 0.80829186, 0.80413098, 0.80798087, 0.8082303 ]),
 'test_f1': array([0.73977216, 0.74178689, 0.74226804, 0.74502063, 0.74427079,
        0.74087428, 0.74548241, 0.74022496, 0.74248735, 0.74268672])}

上面的代码片段打印出了交叉验证的结果。如果您仔细观察不同的评估指标,您会发现该模型在各个褶皱中表现一致,因此非常健壮。让我们计算更具体的指标,如均值和方差:

print('F1 score# (1) mean: {} (2)variance: {}'.format(np.mean(scores['test_f1']), np.var(scores['test_f1'])))
print('Recall score# (1) mean: {} (2)variance: {}'.format(np.mean(scores['test_recall']), np.var(scores['test_recall'])))
print('Accuracy score# (1) mean: {} (2)variance: {}'.format(np.mean(scores['test_accuracy']), np.var(scores['test_accuracy'])))### mean and variance of the merics:
F1 score# (1) mean: 0.7424874224946193 (2)variance: 3.4239691671447294e-06
Recall score# (1) mean: 0.7728534498486367 (2)variance: 9.340496661280428e-06
Accuracy score# (1) mean: 0.7316917565649772 (2)variance: 2.6660110240196636e-06

很高兴看到每个评估指标都有非常低的方差,这再次证实了模型的稳健性。虽然模型很稳健,但我还不开心。我们需要提高模型性能。接下来,我将尝试一种基于梯度增强树的算法。有许多基于梯度增强树的算法可用,如 XGBoost、LightGBM、CataBoost 等。我发现 LightGBM 速度更快,在分类数据上表现良好。

LightGBM 型号

在上面的代码中,我首先以类似于我在随机森林模型中所做的方式手动找到最佳超参数。我发现模型中最重要的参数是“n 估计量”和“最大深度”。让我们看看模型对测试数据的预测和表现:

### Performance report
ROC-AUC score of the model: 0.9586191656898193
Accuracy of the model: 0.890546708477943

Classification report: 
             precision    recall  f1-score   support

          0       0.93      0.85      0.89     89877
          1       0.86      0.94      0.90     89341

avg / total       0.89      0.89      0.89    179218

Confusion matrix: 
[[75963 13914]
 [ 5702 83639]]

业绩报告似乎很有希望。逻辑回归的准确率提高了 35%,随机森林模型的准确率提高了 23%。我在这里停止优化其他超参数。我大概花了 4 个小时才找到以上两个超参数。现在我使用同样的技术交叉验证来关注模型的稳健性。

如果你看看下面的结果,你会看到 LightGBM 在不同的训练中表现一致,这正是我们想要建立的。我们到了。

--------------- cv: 1 --------------------
ROC-AUC score of the model: 0.9483670270426987
Accuracy of the model: 0.8754963684890869

Classification report: 
             precision    recall  f1-score   support

          0       0.91      0.83      0.87     53472
          1       0.84      0.92      0.88     54059

avg / total       0.88      0.88      0.88    107531

Confusion matrix: 
[[44284  9188]
 [ 4200 49859]]--------------- cv: 2 --------------------
ROC-AUC score of the model: 0.9478880521895745
Accuracy of the model: 0.8756730617217361

Classification report: 
             precision    recall  f1-score   support

          0       0.92      0.83      0.87     53861
          1       0.84      0.92      0.88     53670

avg / total       0.88      0.88      0.88    107531

Confusion matrix: 
[[44633  9228]
 [ 4141 49529]] --------------- cv: 3 --------------------
ROC-AUC score of the model: 0.9490374658331387
Accuracy of the model: 0.8780909691158829

Classification report: 
             precision    recall  f1-score   support

          0       0.92      0.83      0.87     53504
          1       0.85      0.92      0.88     54027

avg / total       0.88      0.88      0.88    107531

Confusion matrix: 
[[44457  9047]
 [ 4062 49965]]--------------- cv: 4 --------------------
ROC-AUC score of the model: 0.9490402272662238
Accuracy of the model: 0.8781188680473538

Classification report: 
             precision    recall  f1-score   support

          0       0.92      0.83      0.87     53958
          1       0.85      0.92      0.88     53573

avg / total       0.88      0.88      0.88    107531

Confusion matrix: 
[[44916  9042]
 [ 4064 49509]]--------------- cv: 5 --------------------
ROC-AUC score of the model: 0.9486846347287888
Accuracy of the model: 0.8762112898725937

Classification report: 
             precision    recall  f1-score   support

          0       0.91      0.83      0.87     53764
          1       0.84      0.92      0.88     53766

avg / total       0.88      0.88      0.88    107530

Confusion matrix: 
[[44671  9093]
 [ 4218 49548]]

在这个项目中,我没有讨论任何关于过度拟合的问题。希望我会写另一篇关于这个话题的博客。

非常感谢您的阅读。我希望你喜欢整个系列。完整的代码可以在 Github 上找到。我很想收到你的来信。如果您发现我在代码中或任何地方犯了任何错误,请随时写下评论。如果你愿意,你可以联系我:

Email: sabbers@gmail.com
LinkedIn: [https://www.linkedin.com/in/sabber-ahamed/](https://www.linkedin.com/in/sabber-ahamed/)
Github: [https://github.com/msahamed](https://github.com/msahamed)
Medium: [https://medium.com/@sabber/](https://medium.com/@sabber/)

机器学习算法可以帮助我们评估金融决策的风险

原文:https://towardsdatascience.com/financial-data-analysis-80ba39149126?source=collection_archive---------12-----------------------

贷款资格预测:数据处理-1

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

介绍

金融机构/公司已经使用预测分析很长时间了。最近,由于计算资源的可用性和机器学习方面的大量研究,使得更好的数据分析从而更好的预测成为可能。在这一系列文章中,我将解释如何创建一个预测贷款模型来识别更有可能被取消的不良申请人。在一步一步的过程中,我展示了如何处理原始数据,清除不必要的部分,选择相关的特性,执行探索性的数据分析,最后建立一个模型。

作为一个例子,我使用 Lending club loan 数据集。Lending Club 是世界上最大的连接借款人和投资者的在线市场。贷款的一个不可避免的结果是借款人违约。本教程的想法是创建一个预测模型,确定哪些申请人的贷款风险相对较高。为此,我将整个系列分为四个部分,如下所示:

  • 数据处理-1 :在这第一部分,我展示了如何清理和移除不必要的特征。数据处理非常耗时,但是更好的数据会产生更好的模型。因此,为了准备更好的数据,需要进行仔细和非常详细的检查。我将展示如何识别常量要素、重复要素、重复行和具有大量缺失值的要素。
  • 数据处理-2 :在这一部分,我手动浏览从第 1 部分选择的每个特征。这是最耗时的部分,但为了更好的模型,这是值得的。
  • EDA :在这一部分中,我对第 1 部分和第 2 部分中选择的特性做了一些探索性的数据分析(EDA)。一个好的 EDA 需要更好的领域知识。我们需要花一些宝贵的时间来找出这些特征之间的关系。
  • 创建模型 :最后,在这最后但不是最后的部分,我创建模型。创建模型也不是一件容易的事情。这也是一个迭代的过程。我将展示如何从一个简单的模型开始,然后慢慢增加复杂性以获得更好的性能。

好了,让我们开始第 1 部分:数据处理、清理和特征选择。在此之前,你需要从这个链接下载数据集来和我一起编码。

数据处理-1

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")

在这个项目中,我使用了三年的数据集(2014 年、2015 年和 2017 年(第一季度))并存储在五个独立的 CSV 文件中。让我们先读文件:

df1 = pd.read_csv(‘./data/2017Q1.csv’, skiprows=[0])
df2 = pd.read_csv(‘./data/2017Q2.csv’, skiprows=[0])
df3 = pd.read_csv(‘./data/2017Q3.csv’, skiprows=[0])
df4 = pd.read_csv(‘./data/2014.csv’, skiprows=[0])
df5 = pd.read_csv(‘./data/2015.csv’, skiprows=[0])

由于数据存储在不同的文件中,我们必须确保每个文件中有相同数量的特征。我们可以使用下面的代码片段进行检查:

columns = np.dstack((list(df1.columns), list(df2.columns), list(df3.columns), list(df4.columns), list(df5.columns)))
coldf = pd.DataFrame(columns[0])

上面的代码是不言自明的,我们首先提取列名,并使用 Numpy 'dstack '对象将它们堆叠在一起。如果你看看 Github 上的 Jupyter-notebook,你会发现它们是一样的。这对我们有好处。我们可以进入下一步了。是时候检查数据的形状了:

df = pd.concat([df1, df2, df3, df4, df5])
df.shape(981665, 151)

我们看到大约有一百万个例子,每个例子有 151 个特征,包括目标变量。让我们看一下特性名称来熟悉数据。必须了解领域,尤其是特性与目标变量之间关系的细节。一夜之间学会并不容易,这就是为什么需要花几天或一周的时间来熟悉数据,然后再进行进一步的详细分析。让我们看看功能名称:

**print(list(df.columns))**['id', 'member_id', 'loan_amnt', 'funded_amnt', 'funded_amnt_inv', 'term', 'int_rate', 'installment', 'grade', 'sub_grade', 'emp_title', 'emp_length', 'home_ownership', 'annual_inc', 'verification_status', 'issue_d', 'loan_status', 'pymnt_plan', 'url', 'desc', 'purpose', 'title', 'zip_code', 'addr_state', 'dti', 'delinq_2yrs', 'earliest_cr_line', 'fico_range_low', 'fico_range_high', 'inq_last_6mths', 'mths_since_last_delinq', 'mths_since_last_record', 'open_acc', 'pub_rec', 'revol_bal', 'revol_util', 'total_acc', 'initial_list_status', 'out_prncp', 'out_prncp_inv', 'total_pymnt', 'total_pymnt_inv', 'total_rec_prncp', 'total_rec_int', 'total_rec_late_fee', 'recoveries', 'collection_recovery_fee', 'last_pymnt_d', 'last_pymnt_amnt', 'next_pymnt_d', 'last_credit_pull_d', 'last_fico_range_high', 'last_fico_range_low', 'collections_12_mths_ex_med', 'mths_since_last_major_derog', 'policy_code', 'application_type', 'annual_inc_joint', 'dti_joint', 'verification_status_joint', 'acc_now_delinq', 'tot_coll_amt', 'tot_cur_bal', 'open_acc_6m', 'open_act_il', 'open_il_12m', 'open_il_24m', 'mths_since_rcnt_il', 'total_bal_il', 'il_util', 'open_rv_12m', 'open_rv_24m', 'max_bal_bc', 'all_util', 'total_rev_hi_lim', 'inq_fi', 'total_cu_tl', 'inq_last_12m', 'acc_open_past_24mths', 'avg_cur_bal', 'bc_open_to_buy', 'bc_util', 'chargeoff_within_12_mths', 'delinq_amnt', 'mo_sin_old_il_acct', 'mo_sin_old_rev_tl_op', 'mo_sin_rcnt_rev_tl_op', 'mo_sin_rcnt_tl', 'mort_acc', 'mths_since_recent_bc', 'mths_since_recent_bc_dlq', 'mths_since_recent_inq', 'mths_since_recent_revol_delinq', 'num_accts_ever_120_pd', 'num_actv_bc_tl', 'num_actv_rev_tl', 'num_bc_sats', 'num_bc_tl', 'num_il_tl', 'num_op_rev_tl', 'num_rev_accts', 'num_rev_tl_bal_gt_0', 'num_sats', 'num_tl_120dpd_2m', 'num_tl_30dpd', 'num_tl_90g_dpd_24m', 'num_tl_op_past_12m', 'pct_tl_nvr_dlq', 'percent_bc_gt_75', 'pub_rec_bankruptcies', 'tax_liens', 'tot_hi_cred_lim', 'total_bal_ex_mort', 'total_bc_limit', 'total_il_high_credit_limit', 'revol_bal_joint', 'sec_app_fico_range_low', 'sec_app_fico_range_high', 'sec_app_earliest_cr_line', 'sec_app_inq_last_6mths', 'sec_app_mort_acc', 'sec_app_open_acc', 'sec_app_revol_util', 'sec_app_open_act_il', 'sec_app_num_rev_accts', 'sec_app_chargeoff_within_12_mths', 'sec_app_collections_12_mths_ex_med', 'sec_app_mths_since_last_major_derog', 'hardship_flag', 'hardship_type', 'hardship_reason', 'hardship_status', 'deferral_term', 'hardship_amount', 'hardship_start_date', 'hardship_end_date', 'payment_plan_start_date', 'hardship_length', 'hardship_dpd', 'hardship_loan_status', 'orig_projected_additional_accrued_interest', 'hardship_payoff_balance_amount', 'hardship_last_payment_amount', 'disbursement_method', 'debt_settlement_flag', 'debt_settlement_flag_date', 'settlement_status', 'settlement_date', 'settlement_amount', 'settlement_percentage', 'settlement_term']

看上面的特征,可能先显得吓人。但是我们将浏览每个功能,然后选择相关的功能。让我们从目标特性“loan_status”开始

df.loan_status.value_counts()Current               500937
Fully Paid            358629
Charged Off            99099
Late (31-120 days)     13203
In Grace Period         6337
Late (16-30 days)       3414
Default                   36
Name: loan_status, dtype: int64

我们看到有七种类型的贷款状态。然而,在本教程中,我们感兴趣的是两类人:1)全额支付的人:支付贷款利息的人;2)冲销的人:无法支付并最终冲销的人。因此,我们为这两个类选择数据集:

df = df.loc[(df['loan_status'].isin(['Fully Paid', 'Charged Off']))]df.shape
(457728, 151)

观察形状,我们会发现现在的数据点是原始数据的一半,但特征数量相同。在手动处理和清理之前,让我们先做一些常规的数据处理步骤:

  • 移除与 85%以上缺失值相关的要素
  • 移除恒定特征
  • 移除重复要素
  • 删除重复的行
  • 移除高度共线的特征(在第 3 部分 EDA 中)

好了,让我们从典型的数据处理开始:

  1. **删除与 90%缺失值相关的特性:**在下面的代码中,我首先使用 pandas 的内置方法‘is null()’来查找与缺失值相关的行。然后我将它们相加,得到每个特征的数量。最后,我根据缺失值的数量对要素进行排序,并创建一个数据框以供进一步分析。

在上面的结果中,我们看到有 53 个特征有 400000 个缺失值。我用熊猫滴法去掉这 53 个特征。请注意,在此函数中,我将“inplace”选项设置为 True,“这将从原始数据帧 df 中移除这些要素,而不返回任何内容。

**2。移除恒定特征:**在这一步,我们移除具有单一唯一值的特征。与一个唯一值相关联的要素无法帮助模型很好地进行概化,因为其方差为零。基于树的模型不能利用这些类型的特征,因为模型不能分割这些特征。识别具有单一唯一值的要素相对简单:

在上面的代码中,我创建了一个函数“find_constant_features”来标识常量特性。该函数遍历每个要素,并查看其唯一值是否少于两个。如果是,这些特征被添加到恒定特征列表中。我们也可以通过方差或标准差来找出常量特征。如果该特征的方差或标准差为零,我们就可以确定该特征只有一个唯一值。print 语句显示五个特性有一个唯一的值。所以我们使用“inplace”选项 true 来删除它们。

**3。去除重复特征:**重复特征是在多个同名/异名特征中具有相同值的特征。为了找出重复的特性,我从这个堆栈溢出链接中借用了以下代码:

我们只看到一个似乎是复制的特征。我不打算删除该功能,而是等到我们在下一部分做 EDA。

**4。删除重复的行:**在这一步中,我们删除所有重复的行。我使用 pandas 内置的“drop_duplicates(inplace= True)”方法来执行这个操作:

df.drop_duplicates(inplace= True)

以上四个处理是基本的,任何数据科学项目我们都需要做。让我们看看所有这些步骤之后的数据形状:

df.shape
(457728, 93)

我们看到,执行上述步骤后,我们有 93 个特征。

在本教程的下一部分中,我将浏览每个特性,然后进行清理,并在必要时将其移除。同时,如果你对这部分有任何问题,请在下面写下你的意见。你可以联系我:

Email: sabbers@gmail.com
LinkedIn: [https://www.linkedin.com/in/sabber-ahamed/](https://www.linkedin.com/in/sabber-ahamed/)
Github: [https://github.com/msahamed](https://github.com/msahamed)
Medium: [https://medium.com/@sabber/](https://medium.com/@sabber/)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值