为什么要用机器学习代替传统统计学?
Image by Matan Segev on pexels.com
当我为一家大型金融服务公司的分析师职位准备电话面试时,这个问题浮现在我的脑海中。当面试我的工程师问我:“你为什么选择在你的项目中使用学习方法,而不仅仅是回归和相关的统计数据?”时,我的好奇心变成了苦恼
我一开始不明白这个问题。对我来说,一个向学生推荐未来大学的算法没有机器学习就无法运行,这似乎是显而易见的。我如何在不对我们数据集的成千上万笔交易应用人工智能的情况下,识别出将增加电影院连锁爆米花销量的电影?采访之后,我开始思考这个问题。
为什么简单回归不能用来识别影响因素及其相关系数? 当我思考这个问题并做一些研究时,我意识到学科之间的界限对许多人来说似乎很模糊——以至于我们可以怀疑机器学习是否不仅仅是美化了的统计学。
ML 真的和统计学不一样吗?这种差异会产生有意义的技术影响吗?还是说你做 ML 和 AI 只是好听?
在本文中,我将主要关注监督学习方法。首先,因为这是我的项目所依赖的,所以这是我必须给出答案的类别。其次,因为这通常是人们听到“机器学习”时的想法。
事实上,人们通常将最大似然与推断统计学联系在一起,即旨在理解特定人群中现象的潜在概率分布的学科。这也是我们在 ML 中想要做的,以便为一个新的总体元素生成一个预测。
推断统计依赖于假设:统计方法的第一步是选择一个具有未知参数的模型,用于管理观察到的特性的基本法则。然后相关性和其他统计工具帮助我们确定这个模型的参数值。因此,如果你对数据的假设是错误的,参数的计算将毫无意义,你的模型将永远不会以足够的精度拟合你的数据。
Trying to fit a Gaussian model by visualizing a histogram
因此,让我们选择更好的假设,并确保选择正确的模型!你可以认为。是的,但是有无限多的可能的分布族,却没有一个好的方法。通常,我们进行描述性分析来确定数据分布的形状。但是如果数据有两个以上的特征呢?我们如何将这些数据可视化以提出一个模型命题?如果我们不能识别模型的具体形状怎么办?如果两个系列的模型之间的细微差别不能被人眼分辨出来怎么办?事实上,模型化阶段是推断统计学方法中最困难的部分。
这是正确的!当我们确定数据中的关系是线性的,然后运行线性回归时,这也是我们在机器学习中所做的。但是 ML 并没有总结到这一点。让我们不要忘记,学习方法,对于深度学习来说更是如此,要在自然和人类的学习过程中找到它们的根源。
Photo by Derek Thomson on Unsplash
让我们看一个例子。就拿一个想转行做房地产经纪人的医生来说吧。起初,她对房地产市场及其运作方式一无所知。但是,当她观察到她参观过的房产正在成交时,她将对市场有更好的了解,并很快能够对房产价值进行良好的估计。当然,我们都有一个广泛的直觉,房子越小价格越低,但这并不意味着两倍小的房子会便宜两倍。此外,我们的新经纪人还没有得到一个包括房子所有特征的公式来计算正确的价格。那太容易了!相反,她用许多例子“喂养”她的大脑,并随着时间的推移建立了一个更准确的判断:她已经学会了!
总体而言,这正是机器学习、深度学习和人工智能的要点。这种学习方法使我们能够识别数据集中棘手的相关性,对于这些相关性,探索性分析无法正确确定潜在模型的形状。我们不想给出数据分布的明确公式,而是希望算法直接从数据中自己找出模式。学习方法使我们能够抛弃附在统计方法上的假设。
当然,对于一些真实世界的应用程序,回归和相关就足够了。有时我们只想知道一个变量相对于另一个变量的总体趋势。在这种情况下,简单的相关性将确定与该趋势相关的系数。但是,如何确定一个模型来对这些非线性可分离数据进行分类:
There is no straight line to separate these data points in 2D
没有简单的回归能够做到这一点。机器学习提出了 SVM(支持向量机)和内核技巧,将数据映射到更高维度,在那里它们是线性可分的:
SVM algorithm maps the points into 3D where they are separable by a plane (linear hyperplane in 3D)
ML 似乎不可避免的另一个例子。假设我们的数据有五个特征 X1、X2、X3、X4 和 Y,Y(我们希望能够预测的期望输出)和其他四个输入特征之间的基本关系就像:
ε(蓝色)是大多数真实世界现象固有的噪声。当然,回归在理论上是可行的。我们可以从四个输入中构建新的变量,方法是应用对数、平方根、指数、将这些特征提升到 2、3、4……的幂,对这些变量的一些和取对数。然后,我们将使用这些新特征作为线性回归的输入变量。想出正确的模型需要使用大量可能的变量,我们不太可能实现它——我不包括可以通过子集选择来选择的变量的不同组合。简单的多项式回归又一次为我们提供了一个对我们的目标足够精确的模型。但是如果我们寻找一个最小化的错误,学习方法是关键。
不要误会,没有 ML 方法会输出‘真实’的底层模型。相反,它将提供一个模型来表示与数据行为最接近的可能匹配。有时,这可以是一个全局函数或局部模型,例如,如果我们使用随机森林或 KNN。这些最后的算法甚至不提供我们计算新观察数据的输出的函数,而是将新观察分配给一组“旧”数据——训练数据——并且决定输出应该与该组的输出相似。
我们还可以提到这样一个事实,即机器学习是计算机科学和优化所固有的,它允许在巨大的数据集上进行快速学习,这不是统计学所关心的问题。我们看到,ML 的目标不是提出关于数据的知识(“这是真实的现象,这是它是如何工作的”),而是提出一个可行的和可重复的模型,其误差容限由我们正在进行的项目决定。
事实上,学习方法是处理大量问题所必需的。他们忽略了我们对数据知识的缺乏,没有提示我们选择模型。当然,你必须决定使用哪种算法,但这是另一回事。毫无疑问,它们仍将是必不可少的,深度学习和 NLP 支持的疯狂应用证实了这一点。
你呢?为什么学习方法对你的项目至关重要?请在评论区告诉我😄
为什么要可视化梯度下降优化算法?
先决条件-简介
在多层感知器 (MLPS )中,我们使用 tanh 或 sigmoid 函数作为激活函数进行学习,而不是使用阈值阶跃函数的基于逻辑的麦卡洛克皮茨神经元的苛刻判断。MLPs 为我们提供了输入的平滑且有界的实值输出函数,具有良好定义的导数的优点,这使得学习权重更容易。我们可以将学习这些权重和偏差的问题视为优化问题,并对其应用不同的算法。假设我们这里的函数是损失为 L (w,b)的 sigmoid 逻辑函数。
Sigmoid Logistic Function
Loss Function, to minimize(Training Objective)
为这些算法和它们的收敛方式提供视觉效果,将为设计者选择最佳方案提供深刻的见解。现在,假设我们没有学习权重的算法。我们将如何解决这个学习问题?随机猜测将是我们的方法,用我们大脑的一些启发来固定 w 和 b 的值,使得误差达到最小。让我们看看这样的过程,只有两个数据点进行训练。
Loss with w=-0.10 comes out greater then first iteration w=0.50. Hence, changing our approach with iteratively better values for w and b. Also, in guess work knowing that with higher ‘w’ values behavior approaches step functions & with higher ‘b’ values it shifts towards left is helpful.
很明显,我们需要明确定义的方法来学习权重和避免随机化方法。**但是为什么要梯度下降呢?**为了理解这一点,假设我用小的∏θ移动矢量θ,以检查损耗是否减少。有效矢量可由矢量加法平行四边形定律写成θnew =θ+η∏θ。现在,应该用什么∏θ?我们把泰勒级数应用在上面,观察一下。η是学习率。
l(θ+ηu)= l(θ)+η∫u t ∇l(θ)[η一般很小,所以η 2,η 3,… → 0]。因此,应选择 l(θ+ηu)l(θ)< 0 的值,即 u T ∇L (θ) < 0。
设β为 u T 和∇L 之间的角度(θ)。因此,当 cos(β)= 1 时,即当β为 180°时,l(θ+ηu)l(θ)= u t∇l(θ= k∫cos(β)为最大负值。因此,向梯度的相反方向移动。这是梯度下降的方程式。现在,我们可以在这之后开始想象。
Gradient Descent Method’s Equations. In one epoch GD is calculated once only taking into account all the points.
先决条件-可视化
理解误差曲面和等高线图的概念是必需的,然后我们就可以开始可视化不同的优化算法了。让我们首先来看误差表面,红色代表高误差,蓝色代表相反的误差。
Gradient Descent Convergence. Also, notice that for steeper surface it converges faster visible with less dense point representation.
3D 表示可能很麻烦,并增加了表示工作量。相反,误差表面的 2D 等高线图可以提供等效的表示能力。让我们分析上述误差表面的等高线图情况,其中相同的颜色表示该区域中相同的误差值。此外,更陡的坡度或坡度的快速变化可以用该图中的线箭头来分析。和具有类似线状结构的密集点的缓慢变化。
Contour Map with GD applied on it. Arrows represent faster fall in error value. Flat surfaces represented by constant color regions.
选择哪个梯度下降变体?
虽然 Adam 是许多深度学习模型的标准,但理解每个梯度下降优化变体的基本功能很重要,因为取决于误差表面,不同的优化可能执行得更好。就像,许多论文表明 SGD 与动量加退火η也表现很好。出于这个动机,本文旨在通过可视化这些算法来理解,同时也试图保持简洁。这里,在本文中只讨论在大多数实际用例中观察到的一般情况和行为。
This post at Trask’s twitter account was main major motivation for this post. Courtesy: Sebastian Ruder
我们开始吧。终于!!😉
现在,从以上梯度下降的可视化可以清楚地看出,对于平坦表面,表现缓慢,即需要更多的迭代才能收敛到更平坦的表面。让我们考虑这样一个场景:在一个未知的区域定位一所房子,同时询问地址。如果多人指向同一个位置,随着每个肯定的肯定,我们将开始以越来越快的速度向同一个方向移动。就像一个自由落体的球。我们直到现在才利用这个事实。如何利用错误表面的这一事实?在中,基于动量的梯度下降值的变化也考虑到了历史。
Equation for Momentum based Gradient Descent
Exponentially weighted average is being taken. Earlier responses are less weighted. With this it is able to take faster steps in flat surfaces. Even after shooting away it returns faster with U-turns.
有了更早的 surface 它肯定会表现得更好。现在,让我们来看一个新的误差曲面,它具有更窄的极小曲面。
It oscillates in the valley of minima. Take lot U-turns, still converges faster than Vanilla GD.
收敛有很多振荡,这意味着 sigmoid 函数在相反的方向上反复多次。导致可以避免的客观过冲。但是怎么做呢?在纵身一跃之前,先简单地向前看,如何?
x(2-unit)-y(0.2-unit) plot of sigmoid function. For Momentum Based Gradient Descent.
内斯特罗夫加速梯度比动量法收敛更快。移动一点,计算该点的梯度,然后更新权重和偏差。
Similar Equation will be there for ‘b’ also.
看这里的一个观察,所有的 U 形转弯都是在 NAG 基于动量法的范围内进行的。因此,这减少了振荡。当然修正要快得多。现在,我们有一个令人满意的解决方案,可能不是一个最佳的解决方案。例如,有多个最小值,很难避免较小的振荡,但可以通过不同的初始化来处理。因此,我们有满意的解决方案,现在让我们把一些重点放在减少计算时间。
Comparison b/w NAG(blue) v/s Momentum Based Method(Red)
考虑到有大量的数据点,假设一百万个数据点之后只有一次更新,这将消耗太多的时间。但是,正如上面的证明所发现的,其正确的使用方法,即对应于每个数据点的损失梯度的总和应该最小化。为了提高效率,在这种情况下,可以使用概率方法进行近似。
用**随机方法近似:**该算法将对每个点进行更新,它将像一个时期中百万个点的百万次更新。这也是一个令人满意的解决方案,因为近似法不能保证每一步的损耗都会减少,就像扔硬币一样。
Many oscillations with greedy decision making. As, each point pushes parameter in a direction most favorable to it. Almost like data points are competing with one another.
贪婪决策将参数推向最需要的方向,在这种情况下可能并不需要。对于狭窄的表面,这种行为将随着更多的振荡而放大。只有在观察到某一批点后,我们才能通过创建批和更新参数来解决振荡问题。这种方法叫做小批量梯度下降。对于大型数据集,它的收敛速度会更快。实际上,k 的典型值是 16、32、64。
Less oscillations can be seen for k=2 itself.
另外,GD 方法在一个历元中只需要 1 步。随机 GD 在一个历元中走 N 步。其中为小批量 GD 优化的 N/B 步骤。类似于这种随机版本的基于动量的方法和 NAG 可以存在。在概率方法中,NAG 相对于基于动量方法的优势仍然存在。此外,这两种方法都比随机梯度下降法表现得更快。同样,为了获得更小的振荡和更好的性能,这些器件需要小批量实施。
考虑调整学习率超参数的场景。因为在讨论了所有算法变型之后,这种变型被忽略了。我们不能有大的学习率,因为它会放大梯度,即使对于平坦的误差表面,事实上,学习率值的逐渐变化将是一个好主意来结束我们的分析。同样,我们的第一个粗略的方法将是尝试不同的随机学习率,并在反复试验后找到最佳的一个。大脑启发法不是一个好的战略解决方案。其他方法可以是退火像阶跃衰减,指数衰减,1/t 衰减可以是一个替代选择。退火动量可以是一种更快收敛的方法,再次逃脱最小值将是一个问题。
线搜索,按顺序选择一串学习率,计算相对较好的η值的梯度。更新不同η值的“w”和“b ”,并保留最佳值。它很快离开缓坡,而不是粘在上面。振荡取决于学习率集的选择。但是,每一步的计算都会增加。我们需要更少的计算!!有什么解决办法?大家多讨论一下。
Faster than Vanilla GD approach. Small oscillations, different from Momentum & NAG.
自适应学习速率,这背后的想法我们可能需要不同的学习速率来实现不同的功能。为何如此?一个变量可能很稀疏,但如果它没有得到正确更新,或者没有得到足够更新,模型将无法做出正确预测,那么它可能非常重要。比方说,每当院长给一个班上课时,几乎所有的人都出席了,但是只有一个院长。这是一个稀疏的变量,但却是不同班级出勤趋势用例中的主要控制案例之一。
因此,合成方法将具有更多与其更新历史成比例的衰减。更多,更新意味着更多的腐烂。
Adagrad update rule, similar one for ‘b’
让我们考虑这样一种情况,沿着‘b’进行初始化,在‘w’轴上很少移动。这意味着我们已经假设‘w’本质上是稀疏的,它经历很少的更新。现在比较不同的 GDs 变体。在这里,GD 是黑色,Momentum 是红色,NAG 是蓝色,Adagrad 是绿色。
It ensures ‘w’ has larger learning rate for more updates. For ‘b’ learning rate decreases as denominator is growing.
从上面的视觉化来看,阿达格拉德在接近收敛时卡住了,不再能够向 b 的方向移动。在 Adagrad 中,衰减率太大,因此频繁的参数将开始接收非常小的更新。为了防止这种快速增长,我们可以通过使分母项为β及其补数的分数之和来减少分母项。 **RMSprop,**利用这一特性,在频繁变量中进行不太激进的衰变。
以上是 RMSprop 的更新规则,类似的公式也适用于偏差。此外,它会积累历史,但不会迅速衰减。这里,术语“v”是用指数衰减平均值计算的,而不是梯度的总和。
Here, the new magenta line added above green of Adagrad is RMSprop
在前面讨论的 RMSprop 逻辑中,忽略了动量,可以通过考虑步骤的历史来添加动量。考虑到这一点的方法是 Adam 优化方法。它对 CNN,大型序列间模型非常有效。
m(hat) is bias correction. Why bias correction is required ?
与上面讨论的方法相比,收敛通常更快。Adam 现在似乎或多或少是默认选择(β 1 = 0.9,β 2 =0.999,ε= 1e 8)。一些研究表明在某些情况下不会收敛。但是对于初学者来说,这是一个很好的入门选择。
现在,为什么需要偏差校正,然后我们终于可以休息了。注意,我们取梯度的移动平均值为‘mt’。我们这样做的原因是我们不想太依赖当前梯度,而是依赖梯度在许多时间步长上的整体行为。感兴趣的是梯度的期望值,而不是时间“t”处的单点估计。然而,我们不是计算 E[∇w t 而是将 m t 计算为指数移动平均值。理想情况下,我们希望 E[m t 等于 E[∇w t 。从数学角度来看这个案子。
Derived From m(t) = β1 ∗ m(t−1) + (1 − β1 ) ∗ g(t) | Let ∇wt as gt
表达双方的期望。此外,假设所有 gi 来自相同的分布,即 E[g i ] = E[g] ∀ i。然后应用 GP sum,β作为公共比率。
Expectation both sides | After assumption of E[gi ] = E[g]
Bias Correction applied as expected value of m̂t is the same as the expected value of gt.
我希望以上所有的分析和可视化能够清楚所有与优化算法相关的主要概念,需要开发更新的算法,并对在哪里使用算法有直观的理解。为了保持文章简短,没有讨论所有的优化变量。请继续关注这些算法的实现细节,以及后续文章系列中对不同用例的深入分析。感谢阅读!!
鸣谢
Mitesh M. Khapra 教授和他助教们在创建深度学习的非常丰富的课程方面做了出色的工作。这些图片都是从那里借来的。此外,这些内容来自 Ryan Harris 的“可视化反向传播”(可在 youtube 上获得)和 Andrej Karpathy 的课程 cs 231。我只是试图用简洁的方式解释它们。热情问候。
为什么在深度学习中我们需要比反向传播更好的学习算法
Source — toptal -https://www.toptal.com/
我们都同意一件事,即反向传播是一种革命性的学习算法。当然,它已经帮助我们训练了几乎所有的神经网络结构。在 GPU 的帮助下,反向传播将几个月的训练时间减少到了几个小时/几天。它允许有效地训练神经网络。
我想到了它被广泛采用的两个原因,(1)我们没有比反向传播更好的方法,(2)它有效。反向传播是基于微分的链式法则。
问题在于反向传播算法本身的实现。为了计算当前层的梯度,我们需要下一层的梯度,所以当前层是锁定的,我们不能计算梯度,除非我们有下一层的梯度。如果我们的网络中有 1000 层,我们的第一层必须等到永远更新它的权重。神经网络的前几层很糟糕,不能正常更新。有时,在 Sigmoid 激活函数的情况下,当我们往回传播时,梯度消失或爆炸。
当我们做决定的时候,我们是基于我们当前的观察和之前的学习来做决定的。目前的神经网络或深度学习算法不是按照我们做决定的方式设计的。我们的经验决定了我们的决定。例如,当我们走路时,我们使用视觉、听觉和感官输入来做出决定。我们利用从一个任务中学习来学习其他任务。
反向传播算法的局限性:
- 这是缓慢的,所有以前的层被锁定,直到当前层的梯度计算
- 它遭受消失或爆炸梯度问题
- 它遭受过拟合和欠拟合问题
- 它只考虑预测值和实际值来计算误差和计算梯度,与目标函数相关,部分与反向传播算法相关
- 它在计算与目标函数相关、与反向传播算法部分相关的误差时,不考虑类之间的空间、关联和去关联关系
DeepMind 的合成渐变显示了一种变通方法,但它不是一种解决方案。在我看来,我们必须从头开始思考,设计一种新的学习算法,它可以高效地学习,并可以帮助我们的网络实时学习。
免责声明:这是我的个人观点,完全基于我的学习和研究。我邀请大家分享对此的想法。
感谢您的阅读。
如果你想取得联系,你可以通过 ahikailash1@gmail.com的联系我
关于我:
我是 MateLabs 的联合创始人,我们在那里建立了 Mateverse ,这是一个 ML 平台,让每个人都可以轻松地建立和训练机器学习模型,而无需编写一行代码。
注:最近,我出版了一本关于 GAN 的书,名为《生成对抗网络项目》,书中涵盖了大部分广泛流行的 GAN 架构及其实现。DCGAN、StackGAN、CycleGAN、Pix2pix、Age-cGAN 和 3D-GAN 已在实施层面详细介绍。每种架构都有专门的一章。我已经使用 Keras 框架和 Tensorflow 后端用非常简单的描述性语言解释了这些网络。如果你正在开发 GANs 或者打算使用 GANs,请阅读一下,并在ahikailash1@gmail.com与我分享你的宝贵反馈
[## 生成对抗网络项目:使用 TensorFlow 构建下一代生成模型…
探索使用 Python 生态系统的各种生成性对抗网络架构关键特性使用不同的…
www.amazon.com](https://www.amazon.com/Generative-Adversarial-Networks-Projects-next-generation/dp/1789136679)
可以从http://www . Amazon . com/Generative-Adversarial-Networks-Projects-next-generation/DP/1789136679https://www . Amazon . in/Generative-Adversarial-Networks-Projects-next-generation/DP/1789136679?FB clid = iwar 0 x2 pdk 4 ctxn 5 gqwmbbkigib 38 wmfx-sqcpbni 8k 9z 8 I-kcq 7 vwrpjxm 7 Ihttps://www . packtpub . com/big-data-and-business-intelligence/generative-adversarial-networks-projects?FB clid = iwar 2 otu 21 fam fpm 4 suh _ HJmy _ drqxovwjzb0k z3 zis bfb _ MW 7 inycqqv7 u 0 c
为什么我们不应该担心工作会被人工智能技术抢走?
我们不时会看到人工智能,确切地说是自动化程度更高的行业和系统,导致工作岗位流失,我们应该担心吗?
我不得不承认,在阅读安德鲁·迈克菲和埃里克·布林约尔松的《第二次机器时代》之前,我对这种形式的工业进化没有更乐观的看法,的确,过去许多有记录的工作因为进化而从生活中消失了,如果你坐下来和更老的几代人谈论一些曾经存在的工作,你会惊讶于这些工作是如何存在的,但这是进化,这是工作创造和淘汰的循环。
为什么担心?
不可否认的事实是,这种演变应该发生,但工作的更换速度并不匹配发展新的生存技能的能力,是的,这是现实!我们采用新的技能来生存,但现在进化和自动化的水平开始超过学习和创造新工作的能力,我们面临的选择是放慢这一进程或面对现实,让每个人自己处理,或者一个更体贴的解决方案开始被一些国家采用:基本收入。
利弊?
减缓一个行业的发展会对增长和利润产生另一种影响,考虑到迁移的成本和对保持质量标准的影响,大多数行业将倾向于将他们的行业转移到更便宜的劳动力市场,在这种转移中,许多工作岗位将不是逐渐地而是明显地流失,这最终会造成巨大的社会挑战。 举个例子 Carrier-Trump challenge 就是其中一个例子,在这个例子中,公司不是在沙盒中试图看看如何恢复就业机会和减缓发展,这个行业最终将采取比预期更多的措施,例如应用新的保护主义法律,这些法律被认为是衰落的标志。 多长时间有效?直到它成为一个“僵尸植物”的产业。
每个人都在努力寻找一份新工作,这不是每个人都要面对或准备去做的事情,尤其是在新工作要求越来越复杂的情况下。在这种情况下,个人发现自己面临着学习新技能的挑战,或者在开始自由职业生涯或自己创业时变得更有创造力,但开始新的东西是一个独立的故事,不适合这篇文章。
最后剩下的就是基本收入,全民基本收入,也叫公民收入。基本上是无条件地给定期的人发放免费的钱,这是一种福利,但是没有人知道这一步的结果,尽管 Y Combinator 的总裁 Sam Altman 和另一组 YC 的研究人员在加州进行了一项实验,记录了给 100 个家庭发放 2000 美元的影响。在未来,当自动化接管时,很大一部分劳动力将会暴露出来,并可能需要这样的需求,但结果并不确定。
为什么不担心?
综上所述,在每一种情况下,积极的东西总是可以在我们的优先考虑中得到推动和强调,人类表明,通过艰难的处境和巨大的灾难能够采取非常积极的生存方式,重大战争和技术进步使我们更加意识到使用武力, 我们更愿意做出谨慎的决定,更愿意进行更多的国际合作来面对由忙乱的个人决定引起的危险,我们更愿意面对环境问题的所有后果,这同样适用于自动化、人工智能和就业。
进步虽然总体上是积极的,但我们对技术进步的应用的理解可能需要更全面的视野,而不仅仅是让它以随机的方式行动,可能需要实施法规来减缓应用,我们将需要采取更多的劳动力“再技能化”计划,这种计划是存在的,但我不确定不同核心和组织之间在处理方式上的协调程度,更准确地说,谁应该支付费用?是否应该对严重依赖自动化的行业征税?但是,如果我们没有培养出一代有技能、有更灵活转换能力的人,那该有多好。
教育 2.0?
这是我留到最后的,这是一个严重的问题,关于我们能在多大程度上保持我们现有的经济体系,我不确定它是否能够与自动化和工作相协调。
教育系统肯定需要改变,以减少年数,并开始一个更集中的方法来学习什么是需要的,并在任何时候回去,在需要的时候得到更多,这就是我每天所做的,学习新的技能,以适应变化。
为什么我们不擅长医学
任何告诉你他们知道某事的人都是在胡说八道
我想不出比我们现在的总司令更好的例子了。他不断请求我们“相信”没有人比我更了解(此处插入字面意思)这件事,这引起了那些仍有兴趣观看这场闹剧的人紧张的笑声。但是这说明了这篇文章更广泛的观点:如果我们已经知道东西,那么还有学习东西的空间吗?
“1500 年前,每个人都知道地球是宇宙的中心。500 年前,每个人都知道地球是平的。15 分钟前,你知道人类在这个星球上是孤独的。想想明天你会知道什么。—(特工 K,黑衣人)
上面的引用(来自我最喜欢的一部电影)提供了两个人类通过发现过程成功推进“已知”的历史例子。第三次没有发生,但我可能错了。让我们来看一个更具体的例子:
美国宇航局 EmDrive 打破牛顿第三定律
由于我是一个科幻迷,我不得不把这个放在这里。基本上,该发动机——2001 年开发,2014/15 年测试,2016 年发布——是一个无螺旋桨推进系统,这意味着该发动机不使用燃料来引起反应。在这里阅读这项技术及其对太空探索的意义。无推进器推进系统“违背了我们目前对物理学的基本理解:一个动作(推进一艘船)在没有反应(点燃燃料和排出物质)的情况下发生是不可能的。对于这种事情的发生,这将意味着一种“尚未定义的现象正在发生——或者我们对物理学的理解是完全错误的。"
现在,仅仅通过在网站上阅读这篇文章,我能知道我们对物理学的理解是否完全错误吗?当然不是(我什么都不知道,记得吗?).但它强化了这样一种观念,即在“东西”停止争论数百年后,人类将继续发现关于“东西”的东西。这让我想到了我的下一个观点:我们大脑处理信息的能力有限,导致我们通过二元透镜对我们的世界进行分类(对与错,真与假,真与假,等等。)出于方便。在牛顿第三定律的情况下,每一个单独的动作都需要一个反作用,因此任何不遵守相同原则的动作都被认为是不可能的。我们出于方便对事物进行分类的倾向是这一知识进步难题的本质。
为什么我们的医学“知识”限制了我们治疗疾病的进展
分类帮助我们简化我们周围的复杂世界——没有它,我们正常化感觉输入和发展神经通路(我们称之为学习)的能力将受到极大限制。然而,当分类的目标不是明确地学习和改进时,我们实际上最终增加了阻碍进步的复杂性。这就是我们目前在医学大数据分析中所处的位置。
为医学发展的分类系统的主要目标是创造管理效率。虽然与“了解什么有效”(即医学的目标)的目标没有直接的对比,但两者之间出现的不一致往往会通过确认实际上不存在的信号来扭曲知识的聚合体。这到底是什么意思?
垃圾进,垃圾出
我们为了简化而分类,最终得到的是不完整的数据。电子病历中的结构化信息虽然易于传输和访问,但在患者病历中仅占大约 20%的医疗相关数据。让我们暂停一下,尝试理解这意味着什么。如果我们只有五分之一的医疗信息用于结构化分析,那么五分之四的医疗信息仍然是非结构化和未使用的?
是的。
显然,我们已经如此有效地浓缩了我们关于人体和疾病过程的知识,以至于我们只需要很小一部分数据就可以确定以下内容:
- 所有重大疾病的临床指南
- 每种批准药物的安全性和有效性
- 过去 15 年的公共卫生政策…(大口)
在现实世界中,这种认为我们“知道”如何治疗疾病的信念转化为一些可怕的后果。
约翰霍普金斯医学院的研究人员进行的一项研究表明,医疗差错应该列为第三大死亡原因…
www.npr.org](http://www.npr.org/sections/health-shots/2016/05/03/476636183/death-certificates-undercount-toll-of-medical-errors)
这一严酷的现实源于我们对医学知识最终结果的信念,以及整个行业对解决系统性和棘手问题的抵制——缺乏对完整临床数据的访问。过去 15 年的进步,特别是在学习如何治疗慢性疾病方面的进步,显示了我们还有多少尚未开发的 80%有待学习。绘制人类基因组是一个巨大的飞跃,但这仍然只是我们开始弄清楚事情所需的一小部分数据。精确医疗的梦想是可以实现的,但只有在我们找到如何建立完整和一致的数据来源之后。现在,想象那看起来像什么…
黄金场景—完整、结构化的临床数据
解决上述系统性棘手问题的每一步在技术上都很简单,在操作上很复杂,在文化上也不太可能。
第一步——把所有东西都放在一个地方:了解慢性病——我在这里只关注慢性病,因为这是一个不完整数据如何摧毁我们所有人的切实例子——我们需要纵向信息。每一份医生笔记、进展报告、出院总结,每一位医生、医院、紧急护理部门——你见过的任何提供者——提供的任何未解释的医学意见。全部拿走!明白了吗?好了,现在我们有 1000 页覆盖每个慢性病患者 15 年的数据(美国有 1.6 亿人),所以我们有 1600 亿页未分类的非结构化数据。让我们一起玩吧!
**第二步——将所有内容提取到一个数据湖中:**来自各个领域的医生领导聚集在一个巨大的仓库中,开始通读每一页,突出任何包含独特生物医学概念的句子(例如,症状、观察、程序、过敏、药物治疗等)。).这些句子按时间顺序为每个病人标记,创造了 1.6 亿个纵向叙述,这些叙述描述了每个病人的经历,而不是分类。现在,有了我们的病人经验库,我们可以进入最难的部分了。
**步骤 3——将所有内容分解成离散的概念:**将句子文本中的离散生物医学概念联系起来,并为每个元素分配一个代码,这需要使用四个关系向量来确定文本概念值。首先是词汇向量,它说明了同一术语的词汇变体(同义词)(例如呕吐=呕吐);第二个是字符串向量,它说明了单词的拼写/大小写的变化(例如,呕吐=呕吐);第三个是原子向量,它充当从字符串到医学中常用编码词汇(例如,ICD-10、CPT、SNOMED-CT 等)的链接。);第四个是概念向量,它作为“元向量”位于其他向量之上,允许离散的非结构化但相同的概念在单个结构化代码下相关联。对每个句子中的每个生物医学概念都这样做,并将结果代码连接成一串代码,从而为每个叙述带来结构。现在再做一亿六千万次。这是可能的。
恭喜你!你刚刚创建了一个完整信息的数据库——现在坐下来,输入机器学习算法,看着计算机教我们如何行医!
还记得第一步吗?这是它的样子。
20 年前,上述三个步骤甚至没有被考虑,因为这个问题仍然隐藏在我们推动高效药物的背后。10 年前,由于信息科学的局限性,这些步骤被认为是不可能的。现在,我们再也没有借口了。我们不能继续让我们积累的知识扼杀学习过程;我们必须利用我们所掌握的每一种工具来开发这一知识体系,从而创造出一条通向“医学智慧”的道路。
未能构建完整的信息意味着我们放弃了精确医疗和“编码人类”的梦想——我还没准备好认输,你呢?
matt sinder brand | matt@betterpath.com better path 公司联合创始人兼首席执行官
为什么木工会让你成为更好的程序员
和木头一起工作很有趣。
专家的时代已经结束了。
许多技术专家认为擅长一件事就等于什么都不擅长;“二等于一,一等于零”。那些能够跨越多个学科的人——博学之士——将主宰商业的未来。随着技术以指数速度增长,新兴产业正在兴起,这是现有学科交叉融合的结果。区块链就是一个很好的例子。那些具有编码、加密和 web 开发背景的人发现自己处于构建当前最杰出的新兴技术的最佳位置。
我发现不同的爱好会导致意想不到的迁移学习。在下面的文章中,我分享了一个横向思维的例子;一个领域的技能如何影响另一个领域的学习和决策。
在一整天的数据科学之后,我在我的木工车间里修修补补。我经常来这个满是灰尘的避难所整理思绪。在制作了一整天的文件后,制作出一些触觉上的东西是令人耳目一新的,这些文件存在于服务器上的某个地方,遥不可及。和木头一起工作会让我进入状态,就像长距离慢跑一样。
正是在其中一次间隔会议期间,我意识到木工和编码是多么相似。用电脑搭建和用一套手工工具搭建没有太大区别。我思考得越多,就越意识到我小时候在木工车间学到的经验如何帮助我长大后写出更好的代码。请跟随我分享编码员应该考虑尝试木工的五个理由。
它会教你效用
出于需要,我开始写代码。我已经超越了 excel 的分析能力,并发现自己在 R 语言的浅滩上跋涉。
大多数人开始做木工也是这样;他们需要一个盒子来存放东西,或者一个咖啡桌来放咖啡。他们用干墙螺丝把一些松木板粘在一起,称之为好东西。代码也不例外——它是达到目的的功能手段。没有人为屏幕上的文字的美感编写代码,他们编写代码是为了做一些事情——尽管我承认熊猫语法是一种享受。我们努力编写尽可能简单的代码,以便我们的同事将来能够解码。一个系统越复杂,熵就越会把它撕裂。
设计
让我们看看设计中的实用性。有许多有趣的家具风格,但没有一个比得上 Shaker 家具的美丽简约。
Traditional Shaker Coffee Table
动摇者是一个再洗礼派教派,分散在 18 世纪和 19 世纪的新英格兰。他们以实用的家具、简单的生活和独身生活而闻名(这也是为什么今天没有摇摇乐)。如你所见,上面的作品线条简单,几乎没有装饰。它由结实耐用的硬木制成。
Chippendale Table
第二张桌子是奇彭代尔桌子的复制品,这是一种更高端的风格,受到上层阶级的青睐。这件作品风格化的雕刻,褶边和其他不必要的功能,没有增加它的实用性。
Aged Shaker End Table
Aged Chippendale Table
接下来的两张图片是夏克尔和奇彭代尔的原创作品,已经有几百年的历史了。如你所见,Shaker 的形状比奇彭代尔好得多。《时代》没有善待奇彭代尔,因为它使用了层压木皮,这是一张纸一样薄的木头,粘在下面的木头上。随着时间的推移,胶水会失去粘合力,贴面会卷曲脱落。Shakers 家不会用 10 英尺长的贞操带来接触单板,这就是为什么他们的家具像辛迪加的情景喜剧一样优雅地老化了。
模板
高效的编码人员尽可能使用模板。
木工也使用模板快速制作一致的作品。例如,如果我需要将四条桌腿切割成一定长度,如果我在横切锯上构建一个模板,我将获得更加一致和准确的结果,因此我不必测量和标记每条腿。木工使用的另一个技巧是“故事棒”。您只需在一根长木棒上标记每个测量值,而不是在整个项目中用卷尺重复标记测量值。然后,你可以把木棒放在木头上,转移尺寸,这样就不需要尺子和卷尺了。
Story Stick
在“懒惰”是一个积极含义的工作领域中,用最少的人力投入来构建程序是一种最佳实践。我已经为 EDA(探索性数据分析)建立了几个模板,我用它们来快速系统地分析新数据。
我很小的时候就意识到模板可以节省时间,让我更高效地制作家具。毫无疑问,这项技能在几年后转移到了我的日常工作中。
它会教你如何排除故障
在编写程序的整个过程中,为了解决一个大问题,你要解决许多小问题。在这种情况下,我将“问题”定义为独立的构建的一个方面。例如,要构建一个跟踪股票价格的 web 应用程序,开发人员必须解决许多小问题,比如建立数据库、API 提要、UI 等。在这一过程中,总是会出现需要解决的问题——要么是新颖的想法,要么是对堆栈溢出的随意回顾。
木工为你做好了完美的准备。由于许多木工项目都是定制的、新颖的想法,通常没有经过测试的蓝图来工作,所以建造者被迫在这个过程中为自己想出许多事情,例如从矩形胶合板上切割碎片的最佳方式,平衡碎片的美学效果或消除“抖动”。
Satisfying
它会教你如何自举
从创业或商业的角度来看,自举指的是在几乎没有资金或支持的情况下启动一个项目,“靠自己努力”。在测试和推出更复杂的产品之前,一个启动新应用的初创公司通常会花足够的钱来创建一个 MVP(最小可行产品)。在上述战略的过程中,开发的某些方面可能会以不太完美的方式与更便宜的部件放在一起。
在木工领域,由于一些原因,在实际构建开始之前,许多较大的项目首先与较便宜的材料和方法一起启动。第一,在使用昂贵的硬木之前,看看一个完成的工程实际上是什么样子是很重要的。顾客在看到他们面前的三维自助餐桌的商店草图后,也会经常改变主意。
第二,有机会在这个测试环境中构建项目会导致不可避免的看不见的错误出现。也许你计划在这个案例中使用的燕尾榫会分散你希望在面框中引起注意的装饰木材的注意力。无论如何,你邀请墨菲加入进来,让他的法律生效,这样你就可以在真正开始之前收拾残局。
除了这种原型自举,木工经常缺乏完成项目所需的确切材料,所以他们被迫即兴创作。黑樱桃是制作高级家具的主要硬木。由于其在自然界的相对稀缺性、较小的树干直径和市场需求,板脚的价格高于许多其他木材类型的价格。木工并不总是有资金用铜色木材制作椅子或厨房橱柜,所以他们会通过在便宜的木材如桦木上临时使用染料和油漆釉来启动这个项目。天然樱桃木和染色和上光桦木几乎无法区分。
Hipster Woodworker
它会教你进步
威廉·S·巴勒斯说过这样一句话:“如果你不成长,你就会死去。”在全球经济中,员工不仅要与本地的人才竞争,还要与世界各地的人才竞争,这句话应该是你的拿手好戏。你需要不断提高你现有的技能并学习新的东西。
将你的代码库或者 Git repo 按日期排序,看看你写的第一个程序。太可怕了,对吧?不注意折叠最佳实践,可能重复自己,甚至可能缺少一个注释。
如果你将这个计划与你最近的计划进行比较,你所取得的进步是显而易见的。您学习了如何正确编译项目。如何注释掉不明显的代码?你已经有意识地努力提高编码水平,你的工作得到了回报
作为一名程序员,我的进步很大程度上归功于我在木工车间培养的对专业知识的渴望。快乐的第一条规则是只把自己和过去的自己比较——而不是和其他人比较。当我在办公室里看着我的第一个木工项目时——一个用细钉子固定在一起的粗糙的紫心首饰盒——我能立刻看到我作为木工取得的进步。我开始用最简单的方法用木头制作东西:不加思索地用螺丝钉把便宜的木板钉在一起。我学会了比例、黄金比例和杆秤原理,我的作品开始看起来更加平衡。最终,我转向了常规的燕尾榫接头,这种接头比我年轻时用钉子固定的对接接头更牢固,也更有吸引力。
几乎在同一时间,我成长为一名程序员和木工。我现在用手工工具制作所有的关节,并尝试前卫的镶嵌和概念,掌握了常规设计。我的 R 程序也达到了一个完美的状态,允许我自由地试验更多“有趣”的概念。
这种对技能进步的关注对那些投入时间和精力在某个领域达到精通的人是有好处的。
它会教你逆向工作
你是先处理待办事项中最难的事情,还是把它们留到最后?马克·吐温说过,如果你早上第一件事就是吃一只活青蛙,那么一天中就不会有更糟的事情发生了。项目中总有一个方面——木材或代码——你知道会很棘手。如果你在困难的部分搞砸了,这个项目可能会失败。
我曾经做过一个项目,需要用手动刳刨机在时钟基座上塑造轮廓。刳刨机是一种高功率工具,以超过 15,000 转/分的速度旋转切割钻头;很容易在木头上犯难以修复的错误,以及在你的附属物上犯同样麻烦的错误。我知道这个切割会很困难,所以我拖延了一下,先把整个钟组装起来,把困难的切割留到最后。我最后用路由器切掉了底座的一角,不得不把整个钟拆开来修理,浪费了时间和金钱。最终,我学会了尽早做出那些艰难的削减,这使得以后的构建更加顺利。
在另一个混乱中,我为一个客户构建了一个完整的推荐引擎系统,后来才发现他们的系统不能以我准备的方式接受数据,浪费了他们和我的时间。这个错误改变了我处理数据项目的方式。我不是从前到后地工作——收集数据、构建 alg、将数据发送给客户端——而是在相反的方向工作。如果我不能把数据发给客户,为什么还要做 algs?如此等等。通过从后向前,从难到易的工作,你将能够更快地向前失败,并在更短的时间内完成更多的工作。
好的代码和伟大的代码之间的区别是显而易见的。我们都见过这样的代码。它从 Github 页面跳到你面前;它让你说,“我希望我想到了这一点。”dev 用来解决这个问题的方法非常简单。她找到了阻力最小的途径,并以一种既高效又耐用的方式执行了脚本。一件顶级的家具也有同样的特点。设计注重木材的美观,所以你甚至看不到木板是如何相互贴合的;看起来好像有人从树上取下一片放在房子里。构建家具和构建脚本在执行和目的上有天壤之别。
但是编码者和木工所使用的基本原理是非常相似的。我希望看到这篇文章的开发者拿起钉枪,在错误的木槌打击下弄几个血泡,并在木工方面进行交叉训练。它会把你的游戏带到一个全新的水平。
原载于 2018 年 7 月 11 日medium.com*。*
为什么你需要一个专业的数据科学导师,以及如何实际获得一个。
我记得我第一次听说数据科学。
我刚刚获得了物理学硕士学位,我和我的老同学们正试图找出如何从学术界过渡到有偿职业。我们中的大多数人以前都没有申请过真正的工作,我们都想知道我们的新学位能带来什么样的工作。
幸运的是,那是 2013 年,数据科学仍处于蛮荒的西部阶段。这个领域太新了,以至于雇主们到处雇佣没有经验的 STEM 毕业生,因为他们没有其他选择。
那时,如果你有一个技术研究生学位,你可以温习一下你的 Python 技能,用 scikit-learn 项目填充一个小文件夹,并且或多或少地看着机会滚滚而来。我的很多同学都找到了满足他们求知欲的好工作,并支付了账单。
为什么不再那么容易了
如果你今天在数据科学就业市场呆过一段时间,你就会知道这种情况不再存在了。
仍然有很多关于对数据科学家需求飙升的头条新闻,但事实是现在比过去更难找到工作了。现在这个领域变得越来越成熟,公司对候选人的期望也越来越高。五年前,他们问的是决策树和朴素贝叶斯;现在他们假设你对 sk-learn 和 TensorFlow 了如指掌,他们问的是 devops 和 deployment。
我们已经多次看到同样的事情发生在我们通过 SharpestMinds 筛选的数百名候选人身上。事情发生变化的原因是,数据科学充斥着拥有基本技能和适度个人项目组合的人。因此,雇主可以对入门级的候选人吹毛求疵。
如今,当你刚开始工作时,想引起别人的注意并不容易。
到达那里需要什么
现在已经到了这样一个地步,你需要在数据科学就业市场中脱颖而出的技能非常难学,除非你得到了真正知道自己在做什么的人的指导。
为一个真正的应用程序构建产品代码与为一个 Kaggle 竞赛分类有毒评论,甚至完成一个纳米学位完全不是一回事:
- 生产代码必须是干净的。如果没有经验丰富的开发人员的参与,您如何知道您的代码是否干净?
- 生产代码必须由团队来构建。如果您的过程没有经过专业人员的审查,您如何知道您是否使用了最佳实践?
- 生产代码必须是健壮的。如果您不知道管道需要健壮地应对什么,您怎么能学会构建健壮的管道呢?
自己学习可以让你起步,但是从数据科学沙箱提升到行业就绪的生产代码真的需要有经验的开发人员的投入。
但你可能不认识愿意指导你的专业数据科学家或机器学习工程师。在你培养技能的过程中,你可能没有足够的资源来雇佣一个人和你一起工作。
那么,你怎样才能获得超越学士、硕士或纳米学位所需的专家帮助,并在 2018 年真正具备就业能力呢?
收入分享和指导
与专业开发人员一起工作的经历可以决定你是否有能力获得数据科学职位。在过去的 18 个月里,我在 SharpestMinds 的工作中一直专注于寻找让人们获得这种体验的方法。
我们尝试了许多不同的策略来激发专业开发人员和新手数据科学家之间的合作。我们发现的最佳策略被称为收入分成:基本上,有抱负的数据科学家在一个行业级项目上与一位专家导师合作,作为交换,他们向导师支付未来收入的一小部分(但只有在他们最终真正被聘用的情况下)。
收益分成有两个好处:第一,意味着你可以不需要前期成本就能获得专家指导。你只有在有能力的时候才付钱,如果你在一定期限内(通常是 24 个月)没有找到数据科学的工作,你根本不用付钱。
第二,收入分成与导师和学员的激励一致。即使在正式的导师期结束后,导师仍然与你未来的成功有利害关系,这意味着他们会默认为你寻找机会。
收入分享导师制为那些负担不起专家时间或寻找专业数据科学家进行学习的人提供了新的机会。
因为这是一种让人们在有限的风险下快速了解数据科学的惊人方式,我们刚刚推出了一个名为sharpes minds Mentorships的收入分享计划。这是有抱负的数据科学家和专业开发人员导师之间为期 8 至 12 周的合作,导师和学员通过收入共享协议一起工作。如果学员在与导师合作的两年内获得了数据科学职位,他们将返还第一年工资的一小部分。
如果你想注册我们的第一个正式批次,你可以在这里注册。
为什么你需要关注可解释的机器学习
机器学习(ML)模型正在进入现实世界的应用。
我们都听说过关于 ML 系统的新闻,比如信用评分系统 T1、T2、医疗保健系统 T3、T4、犯罪预测系统 T5。我们很容易预见一个由 ML 驱动的 社交评分系统。由于 ML 研究的快速发展和在受控实验中获得的巨大成果,越来越多的人现在似乎对统计模型统治我们生活重要部分的可能性持开放态度。
然而,大多数这样的系统被视为黑箱。产生简单是/否答案的晦涩难懂的数字计算机器;最多答案后面跟着一个不满意*“信心百分比”*。这通常是全面采用这种系统进行关键决策的一个障碍。
在医疗保健或贷款领域,专家不会检查庞大的数据库来找出复杂的关系。**专家应用先前的教育和领域知识为给定的问题做出最佳决策。**很有可能是基于数据分析的评估,甚至涉及自动化工具的帮助。但是,最终,这个决定是由一个合理的、可解释的推理支持的。这就是为什么拒绝贷款和医疗有动机。此外,这样的解释经常帮助我们判断一个好的专家和一个坏的专家。
我们大多数人倾向于拒绝接受看似武断的决定;理解决策的重要性是至关重要的。这篇优秀的文章描述了可解释 ML 系统的一些现实目标:
- 信任:对系统预测的信心
- 因果关系:有助于推断自然界的属性
- 概括:应对不稳定的环境
- 信息含量:包括关于决策过程的有用信息
- 公平和道德 决策:防止歧视性结果
很明显,社会关心可解释的机器学习。
我想更进一步:那些构建 ML 系统的人也应该关心可解释性。ML 从业者和工程师应该追求可解释性,作为建立更好模型的一种手段。
本文的目的并不是介绍可解释性工具和技术的细节以及如何应用它们。相反,我想提供一个为什么这样的工具对机器学习实践如此重要的愿景,并回顾几个我最喜欢的工具。
ML 系统(例如用于分类)被设计和优化为在海量数据中识别模式。建立一个能够发现输入变量和目标类别之间非常复杂的相关性的系统是非常容易的。结构化数据?扔个 XGBoost 给它。非结构化数据?某深网来救援!
典型的 ML 工作流包括探索数据、预处理特征、训练模型,然后验证模型并决定它是否准备好用于生产。如果没有,返回,通常为我们的分类器设计更好的特征。大多数时候,模型验证是基于预测能力的度量:例如,ROC 曲线下的区域通常是相当可靠的。
Fig. 1 — How model interpretation fits in the common ML workflow
然而,在模型构建过程中,许多设计决策可能会稍微改变模型。不仅仅是分类器的选择,而是每个预处理步骤中无数的决定。事实证明,给定一个非平凡的问题,有无数个具有高预测能力的模型,每一个都讲述了关于数据的一个完全不同的故事。有些故事可能就是错误的,尽管它们似乎适用于特定的数据集。
这被美其名曰 罗生门效应 。我们应该在生产中部署哪些模型来做出关键决策?是否应该一直取绝对 AUC 最高的模型?我们应该如何区分好的和坏的设计决策?
可解释的机器学习方法和工具帮助我们做出这个决定,更广泛地说,做 更好的模型验证。这不仅仅是简单地查看 AUC,而是要回答这样的问题:模型输出如何随每个特征的值而变化?这些关系是否符合人类直觉和/或领域知识?对于特定的观察,什么特征最重要?
我们可以粗略地将可解释性分为全局分析和局部分析。
全局分析方法将使您对特征和模型输出之间的关系有一个大致的了解。比如:房子大小如何影响未来三个月被卖出的几率?
局部分析方法将帮助你理解一个特定的决定。假设对于给定的贷款申请有很高的违约概率(未偿还)。通常,您想知道哪些特征导致模型将应用程序分类为高风险。
全局方法
对于全局分析,从使用部分依赖图和个体条件期望(ICE)开始。
部分相关图显示了给定不同特征值时某一类的概率。这是一种全局方法:它考虑了所有实例,并对某个特征与预测结果之间的全局关系进行了陈述。【演职员表:可解释机器学习
部分相关图让您了解模型如何响应特定特征。它可以显示目标和特征之间的关系是线性的、单调的还是更复杂的。例如,该图可以显示平方米对房价的单调增长影响(这很好)。或者你可以发现一个奇怪的情况,当花更多的钱对你的信用评分更好的时候——相信我,它发生了。
部分相关图是一种全局方法,因为它不关注特定实例,而是关注整体平均值。单个观察值的 PDP 的等价物被称为个体条件期望(ICE)图。ICE 图为每个实例绘制一条线,表示当特征改变时实例的预测如何改变。
Fig. 2 — Partial Dependence Plot (the bold line) with Individual Conditional Expectations. Credits: https://github.com/SauceCat/PDPbox
作为一个全局平均值,PDP 可能无法捕捉来自特征间交互的异质关系。用冰线来装备你的部分依赖图通常是好的,以获得更多的洞察力。
本地方法
最新的和最有前途的局部分析方法之一是 SHapley 加法解释 。它旨在回答问题为什么模型为一个实例做出那个特定的决定? SHAP 为每个特征分配一个特定预测的重要性值。
Fig. 3 — An example of SHAP values for Iris dataset. You can see how the petal length influences the classification much more than sepal length. Credits: https://github.com/slundberg/shap
在生产之前,您可以在测试环境中部署您的模型,并提交来自维持测试集的数据。为该测试集中的观察值计算 SHAP 值可以表示一个有趣的近似值,即要素将如何影响生产中的模型输出。在这种情况下,我强烈建议提取“过时”的测试集,也就是说,最近的观察结果就是维持数据。
从 ML 模型中得到的可解释的决策已经成为在现实世界中应用它们的重要需求。
在许多关键的 ML 应用中,解决方案一直是只考虑固有的可解释算法——例如线性模型。这些算法无法捕捉特定于训练数据集的细粒度模式,只能捕捉一般趋势。趋势很容易解释,并与领域知识和直觉相匹配。
可解释的工具为我们提供了另一种选择:使用强大的算法,让它捕捉任何模式,然后使用你的人类专业知识来删除不需要的模式。在所有可能的模型中,选择一个能正确描述数据的模型。
当您的训练模型产生可解释的结果时,您可以利用这种可解释性。上述工具的输出可以构成业务人员能够理解的简要报告。毕竟,你需要向你的老板解释为什么你的模型如此有效。可解释的模型可能会引导你的老板和所有利益相关者做出更好的商业决策。
结论
有时人们说,只有高度管制的应用中的 ML 从业者才应该关心可解释性。我认为相反:每个 ML 从业者都应该使用可解释性作为建立更好模型的额外工具。
感谢阅读。我喜欢你的反馈。
为什么你应该在下一个机器学习项目中绘制学习曲线
入门
剧透:它们会帮助你理解你的模型是高方差还是高偏差——我会解释你能做些什么
Image by author
偏差-方差困境是机器学习领域中一个广为人知的问题。它的重要性是这样的,如果你没有得到正确的权衡,你在你的模型上花多少时间或多少钱都没有用。
在上图中,您可以感受到什么是偏差和方差,以及它们如何影响您的模型性能。第一个图表显示了一个模型(蓝线),该模型对训练数据(红叉)拟合不足。这个模型是有偏差的,因为它“假定”自变量和因变量之间的关系是线性的,而事实并非如此。绘制数据散点图总是有帮助的,因为它将揭示变量之间的真实关系——二次函数将“恰好”符合数据(第二个图表)。第三个图表是过度拟合的明显例子。模型的高度复杂性使其能够非常精确地拟合数据——过于精确地拟合*。尽管该模型在训练数据上可能表现得非常好,但是它在测试数据(即,它从未见过的数据)上的表现会差得多。换句话说,这种模型存在高方差,这意味着它不擅长对从未见过的数据进行预测。因为建立机器学习模型的要点是能够准确地对新数据进行预测,所以你应该专注于确保它能够很好地推广到看不见的观察结果,而不是最大化它在训练集上的性能。*
如果你的模特表现不怎么样,你能怎么办?
您可以做几件事:
- 获取更多数据
- 尝试较小的功能集(降低模型复杂性)
- 尝试添加/创建更多功能(增加模型复杂性)
- 尝试降低正则化参数λ(增加模型复杂性)
- 尝试增加正则化参数λ(降低模型复杂性)
现在的问题是:“我如何知道这些事情中的哪一个应该首先尝试?”。答案是:“嗯,看情况。”。这基本上取决于你的模型是高偏差还是高方差。
你可能想知道,这里的问题是:“好吧,那么我的模型表现不如预期……但是我怎么知道它是有偏差问题还是有方差问题呢?!"。学习曲线!
学习曲线
学习曲线显示了训练集大小和您选择的评估指标(如 RMSE、准确度等)之间的关系。)在您的训练集和验证集上。在诊断您的模型性能时,它们可能是一个非常有用的工具,因为它们可以告诉您您的模型是否存在偏差或差异。
Image by author
如果你的学习曲线是这样的,这意味着你的模型有很大的偏差。训练和验证(或交叉验证)的错误都很高,并且似乎不会随着更多的训练示例而改善。事实上,您的模型在训练集和验证集的表现都很差,这表明该模型对数据拟合不足,因此具有较高的偏差。
Image by author
另一方面,如果你的学习曲线看起来像这样,你的模型可能有一个高方差的问题。在此图表中,验证误差远远高于训练误差,这表明您对数据进行了过度拟合。
如果你的模特表现不怎么样,你能怎么办?(pt。二)
很好,所以你现在已经确定了你的模型发生了什么,并且处于一个很好的位置来决定下一步做什么。
如果您的模型具有高偏差,您应该:
- 尝试添加/创建更多功能
- 尝试降低正则化参数λ
这两件事会增加模型的复杂性,因此有助于解决拟合不足的问题。
如果您的模型有很高的方差,您应该:
- 获取更多数据
- 尝试一组较小的功能
- 尝试增加正则化参数λ
当您的模型过度拟合训练数据时,您可以尝试降低其复杂性或获取更多数据。正如您在上面看到的,高方差模型的学习曲线图表明,有了足够的数据,验证和训练误差最终会彼此更接近。对此的一个直观解释是,如果你给你的模型更多的数据,你的模型的复杂度和你的数据中的底层复杂度之间的差距会越来越小。
Python 实现和实际例子
我编写了这个函数来绘制模型的学习曲线。在自己的工作中可以随意使用!
我想我应该以展示一个学习曲线图的真实例子来结束这篇文章,这个例子是用上面的代码创建的:
Image by author
从图中可以非常清楚地看出,我的随机森林模型正遭受高偏差,因为训练曲线和验证曲线非常接近,并且在 70%左右的标记处精度不是很高。了解这一点有助于我决定我的下一步是什么,以提高我的模型性能。因为我有一个高度偏见的问题,我知道获得更多的训练数据本身不会有帮助,通过设计新的和更相关的功能来增加我的模型的复杂性可能会产生最大的影响。
结论
下次你面前有一个表现不好的模型时,记得画出学习曲线,分析它们,找出你是否有偏差或方差问题。了解这一点将有助于你决定下一步应该做什么,它可以为你节省无数的头痛和浪费在对你的模型没有帮助的工作上的时间。
为什么你应该关心内特·西尔弗和纳西姆·塔勒布的推特之战
两个数据专家怎么会有这么大的分歧?
过去一个月,一场不为人知的争议再次浮出水面。定量分析社区的两个图标在最伟大的公共舞台 Twitter 上发生了冲突。你可能会被原谅没有跟踪这场争论:我将为门外汉做一个快速回顾。用于创建本文的所有代码和数据都可以从这个 Github Repo 中派生出来。
内特·西尔弗是538的联合创始人。一个非常受欢迎的专注于数据的博客,因其准确预测 2008 年美国大选的结果而闻名。Silver 使用一种聪明的民意调查汇总技术来生成预测,这种技术考虑到了偏见,例如民意调查者只给使用座机的人打电话。
作为一名训练有素的统计学家,通过经济学,他将自己对棒球(sabermetrics)和扑克分析的热情引入了政治领域。事实上,FiveThirtyEight 这个名字是对美国选举人票数(538 张)的认可。然而,博客也涵盖了其他兴趣领域,如体育。内特把他的博客卖给了 ESPN,并接受了主编的工作。他们(ESPN)利用它作为一个平台,向观众提供体育赛事的预测,FiveThirtyEight 后来搬到了美国广播公司。对他们网站的例行访问是政治和体育文章的混合,带有详细的预测和数据可视化。
Silver (left) in conversation with NY1’s Pat Kiernan
内特的预测能力已经成为大众媒体公认的标准。他是许多全国电视节目的常客,在每个全国选举周期讨论他的预测。因此,当畅销书作家、量化风险专家纳西姆·塔勒布(Nassim Taleb)公开宣布 FiveThirtyEight 不知道如何正确预测选举时,人们感到非常震惊!
对塔勒布来说,由于他对现实世界中概率的敏锐理解,他已经变得非常成功。他的书既有哲学的,也有技术的,重点是不确定性和风险。具体来说,他认为实践中使用的绝大多数定量模型都没有充分考虑到现实世界的风险。相反,它们给人一种短期价值的错觉(比如在一些很好理解的情况下是准确的),但当不知情的用户经历模型设计不理解的情况时,他们会面临巨大的系统风险。
Nassim Taleb
塔勒布之所以出名,部分是因为他通过暴露自己的财富将自己的哲学付诸实践。马尔科姆·格拉德威尔在《纽约客》上写了一篇文章,讲述了塔勒布是如何将他的风险哲学转化为一个极其成功的投资策略的。此后,他在不可预见的市场事件中获得了巨额财富,如黑色星期一、俄罗斯债务违约和 2008 年金融危机。塔勒布现在花很多时间写作和硬拉(我很嫉妒这一点)。他不羞于公开告诉别人他不同意他们的观点:内特·西尔弗就是其中之一。
Taleb’s Tweets directed at Silver November 2018
然而,西尔弗并没有屈服于这些侮辱!
Silver 和 Taleb 分别拥有 300 万和 30 万粉丝,在这些交易所中引起了巨大的轰动(从 2016 年开始)。然而,快速浏览评论线程,你会发现很少有人理解这些论点。甚至西尔弗自己似乎也被塔勒布的攻击弄得措手不及。
然而,我认为这是一个数据科学专业人员(或有抱负的专业人员)更深入挖掘所讲内容的绝佳机会。这对我们如何选择以可靠和可验证的方式建模和展示我们的工作有影响。你必须自己决定塔勒布是否有道理,或者只是一个有太多空闲时间的疯狂富人。
并非所有介于 0 和 1 之间的实数都是概率
围绕 FiveThirtyEight 预测的争议和困惑的主要来源是它们是“概率性的”。实际上,这意味着他们不预测赢家或输家,而是报告一种可能性。使问题更加复杂的是,这些预测被报告为点估计(有时带有模型隐含误差),远在事件发生之前。例如,在民意调查开始前六个月,这是他们对 2016 年总统选举的预测。
FiveThirtyEight Running Forecast of the 2016 Presidential Election
他们的预测过程是用专家知识(选举、体育赛事等)建立一个系统的定量复制品。)然后运行一个蒙特卡洛模拟。如果模型接近真实世界,模拟平均值可以可靠地用于概率陈述。所以 FiveThirtyEight 实际上说的是:
x%的时间我们的蒙特卡罗模拟导致了这个特殊的结果
问题是模型不是真实世界的完美复制品,事实上,在某些方面总是错误的。这种类型的模型构建允许在构建中有一定的主观性。例如,Silver 曾在许多场合表示,其他竞争模型没有正确纳入相关性。在描述建模方法时,他还清楚地表明它们会调整结果(比如基于事件发生前的时间人为增加方差或类似的调整)。这就产生了一个关于谁的模型是“最好的”或最像真实世界的无限递归的争论。当然,要判断这一点,你可以看看从长远来看谁表现得更好。这就是事情有点偏离轨道的地方。
因为 FiveThirtyEight 只预测概率,他们从来没有对结果采取绝对的立场:正如塔勒布所说的那样,没有“参与游戏”。然而,这不是他们的读者效仿的东西。在公众眼中,他们(FiveThirtyEight)是根据有多少预测概率高于和低于 50%的事件分别发生或没有发生(在二元设置中)来判断的。或者,他们(读者)只是选择最高的报道概率作为预期的预测。例如,当“在 2008 年总统竞选中正确说出 50 个州中的 49 个”之后,他们获得了大量的赞誉。内特·西尔弗被列入《时代周刊》100 位最有影响力的人名单 t。如果他没有在任何一个州说出获胜者,他就不应该接受这一荣誉!
公众未经询问就使用 50%规则是情有可原的。例如,在监督机器学习中,分类模型必须有一个称为“决策边界”的特征。这通常是先验决定的,并且是在模型被训练之后理解模型质量的基本部分。在这个界限之上,机器相信一件事,在这个界限之下则相反(在二进制的情况下)。
Example Decision Boundary in Classification Problems
对于标准模型,如逻辑回归,默认决策边界被假定为 50%(或 0 到 1 范围内的 0.5)或具有最高值的替代值。为分类而设计的经典神经网络通常使用 softmax 函数,这些函数就是以这种方式解释的。这是一个使用计算机视觉执行图像分类的卷积神经网络示例。甚至这个基本的人工智能模型也能做出决定。
Convolutional Neural Network with Decision Boundary Prediction
如果 FiveThirtyEight 没有规定的决策边界,那么很难知道他们的模型实际上有多好。由于隐含的决策边界,在 2008 年和 2012 年,随着水晶球般精确的陈词滥调,当他们被加冕并愉快地接受它时,这种困惑变得更加复杂。然而,当人们指责他们错了时,他们会回过头来说一句简单的俏皮话:
你就是不懂数学和概率。
通常这是 f 的后续报道,他们只报道了 x%,所以这意味着(1-x)%也可能发生。这是一个完美的场景。他们永远不会错!我们都应该如此幸运。当然,这种概率论证可能是有效的,但如果它看起来不真诚,就会引起一些焦虑。甚至《华盛顿邮报》也有一篇观点文章,在 2016 年选举期间发表了同样多的观点。
不清楚的是,FiveThirtyEight 读者隐藏了一个因素。预测有两种不确定性;偶然性和认知性。随机不确定性与基础系统有关(在标准骰子上掷出六点的概率)。认知不确定性与系统的不确定性有关(骰子有几个面?掷出 6 的概率是多少?).有了后者,你要去猜测博弈和胜负;像选举一样!
像 FiveThirtyEight 这样的定制模型只向公众报告偶然的不确定性,因为它涉及到它们的统计输出(在这种情况下由蒙特卡洛进行推断)。麻烦在于认知的不确定性很难(有时不可能)估计。例如,为什么 FiveThirtyEight 的模型没有在事情发生之前,考虑到科米可能会重新调查克林顿的电子邮件?相反,这似乎导致了预测变异的巨大峰值。可能是因为这个事件无法预测。
相反,认识论上的不确定事件被先验地忽略,然后 FiveThirtyEight 假设来自不可预见事件的预测中的剧烈波动是预测的正常部分。这应该让我们问‘如果模型忽略了一些最重要的不确定性,我们真的得到了一个可靠的概率吗?’
为了进一步扩展这一点,我已经综合了 FiveThirtyEight 的一些预测,使用他们的开源数据,针对两种非常不同类型的事件;美国参议院选举和国家橄榄球联盟(NFL)比赛。这里是对最终预测概率和实际结果比例的比较。
Stated Probabilities Compared with Average Portions
体育数据(NFL 比赛)具有极好的线性关系。这些比例是使用 30K 个数据点构建的,因此,如果我们假设系统是稳定的,我们已经平均掉了任何采样误差。然而,正如你所看到的,实际比例与预测值仍有 2-5%的显著差异。这是未解决的认知不确定性的信号。这也意味着你不能轻信这些预测概率。
体育运动,像其他碰运气的游戏一样,有着非常明确的机制,这些机制有助于进行统计分析。另一方面,高度非线性的事件,如有争议的选举,可能不会。通过更少的数据点,你可以看到参议院预测的变化是巨大的。衡量模型在这类事件上的表现变得加倍困难。还不清楚一个预测是错误的,是由于模型的质量(认知的)还是仅仅是运气(偶然的)。
这种预测方法最令人不安的一点是,它打开了叙事谬误的潘多拉魔盒。克林顿为什么会输?科米?电子邮件服务器?然后,人们可以通过目测预测变化周围发生的事件来证明可能的虚假推断。看看天气预报是如何变化的吧,所有这些新闻!
我想这就是塔勒布竭力反对的原因。这个博客给人的感觉更像是一个圆滑的推销,充斥着量化的流行词汇,而不是不带偏见的分析(尽管它很可能是)。如果一个预测不符合一些基本特征,它就不应该作为一种可能性被推销。更重要的是,一个预测应该从发布给公众的时候就开始判断,而不仅仅是在事件发生之前。预测者应该对偶然性和认知性的不确定性负责。
从这个角度来看,很明显 FiveThirtyEight 报告了导致事件的过多噪音,而没有足够的信号。这对于驱使用户阅读同一主题的一长串相关文章来说是很棒的,但并没有严格到可以赌上你的财富。塔勒布和西尔弗对 FiveThirtyEight 应该如何判断的看法可以这样形象化。
Taleb vs. Silvers Different Take On How FiveThirtyEight Should be Judged in 2016
因为像选举这样的非线性事件有太多的不确定性,所以报告早期预测可能被合理地认为是轻率的。这样做的唯一可能的原因是捕捉(并货币化?)渴望知道未来的公众的兴趣。我不会深入讨论技术问题,Taleb 已经撰写并发表了一篇关于关键问题的论文,并给出了解决方案。
这里我们可以有把握地说,538 次预测并不总是可靠的概率。然而,它们伪装成 1,介于 0 和 1 之间。这是塔勒布的主要论点;FiveThirtyEight 的预测不像包含所有不确定性的概率那样表现,也不应该被当作概率。
我不想暗示五三八在他们的手艺上是糟糕的。他们可能是业内最好的民意调查聚合者。如果我们只看最近报道的概率预测,并使用公众的决策边界,他们比任何其他试图完成相同任务的来源都更成功。然而,无论结果如何,都要让自己看起来正确,让用户推断自己的决策界限,过度报告预测,以及忽略认知的不确定性,这些都不应该被忽视。FiveThirtyEight 的声誉如何,数据社区的声誉也如何。
明确你建议的决策界限、概率陈述、关于不确定性的假设,你就不太可能误导利益相关者。
所有代码和数据都可以从这个 Github repo 中派生出来。
在 LinkedIn 上关注我:【https://www.linkedin.com/in/isaacfaber/
为什么您现在应该熟悉数据
跟踪和处理不断增长的数据的能力正在改变我们对世界和万物的认知。数据,尤其是“大数据”,影响着我们的日常生活——工作、政治、医疗保健、锻炼、购物……主要与机器学习、深度学习、预测分析或 AI(人工智能)等时髦词汇结合在一起。
朋友和家人问我为什么对这个话题感到兴奋,为什么要在这个特殊的学科上做硕士。我的回答总是一样的:我们不能逃避。有无穷无尽的“数据”机会,但也有严重的风险因素。没有人必须研究这个话题——但是理解要点是不可避免的。在下面你可以找到我的三大理由 为什么我认为每个人都应该理解当今世界“数据” 背后的原理。不要期待一篇只有极客才能理解的技术文章——期待一些你钻研这个话题的动力。
后果。 数据只是信息的另一种说法。但在计算方面,数据通常是指机器可读的信息——无论是结构化数据还是非结构化数据。通过技术进步,特别是所谓的“使能技术”的进步,例如计算能力、互连性、廉价数据存储等的大量增加,使用这些信息的可能性比以往任何时候都多。正如我们所知,这个世界上并不是每个人都将整体福祉列在议程的首位,有很多机会可以通过数据的力量操纵或控制我们。
“Social Credit” China
例如,中国将会或者已经部分实施了他们的“社会信用”系统。这是怎么回事?每个公民都有信用,他可以收集,当然也可以失去。因此,大量的数据被处理和组合——来自政府记录等来源的大数据,包括教育和医疗、安全评估和财务记录,将被输入到个人得分中,并与来自您自己设备的数据相结合。
现在人们可以说——太好了!一切都将更加安全,“好”公民将获得更多特权,并获得他们所赚取的。但是谁来定义好公民呢?完全正确:为评分设置指标的人。对系统持批评态度的人会直接得分很低。他将不会被纳入社会福利,甚至可能不会被纳入他通常的社会群体,因为其他人也担心得分低。现在我们有了:通过数据的反乌托邦独裁。
但是在收集数据的时候,不仅仅是坏的事情。让我们以医疗保健中的大数据为例:如今,医学研究人员可以访问大量关于癌症患者治疗计划和康复率的数据。这使得医生在制定治疗计划和给患者用药时能够做出更好的决定。收集的数据越多,链接到其他数据库的数据越多,产生的见解就越多。现在让我们进入下一个阶段:更多的训练数据,为人工智能处理和准备数据的能力允许医生部分自动化诊断过程。医生不必害怕——这并不意味着他/她会丢掉工作。这意味着比以往更多的人可以接受治疗。没有足够的钱来支付这种诊断的病人可以得到治疗。并且额外的资源将被释放用于更困难的或单独的程序。这是一个转变整个医疗保健行业治疗流程的巨大机遇。
上面的两个例子都表明,如何使用数据有不同的选择。不管这种力量是出于善意还是恶意,最重要的是理解每个选项背后的基本原理和后果。作为普通公民,你不必成为人工智能、人工智能、深度学习、神经网络等领域的专家。但是你有责任了解你的数据是用来做什么的,会有什么后果。
数据是你生活的一部分。
大数据影响着我们的日常生活。术语“大数据”描述的是大型数据集的集合,其规模如此之大,以至于您无法使用普通的数据库系统来处理、分析、挖掘或生成见解。数据的增长是巨大的。假设存储的所有数据中有 90%是在过去两年中产生的。但是,让我们开始一段简短的旅程,看看我们每个人是如何遇到大数据的:
从家里开始。通过智能恒温器和电表,我们每天都能在家中省钱。通过识别个人行为,我们的能源消耗得到了优化和大幅降低。但不仅仅是能源消耗变得智能,我们完整的家也可以变得“智能”。一切都是连接的(你肯定听说过 IoT——物联网),并在设备之间和设备与制造商之间发送数据。在你的咖啡机坏之前,制造商已经联系了你,所以你可以像往常一样继续享用你的拿铁咖啡。
开车去上班时,您的汽车已经有了最新的交通数据。你会注意到提供的方向越来越好,越来越详细,有自行车和公共交通的选择。更令人兴奋的是,它可以告诉你是否会遇到交通堵塞,这不是因为有人观察到了交通堵塞,而是因为经过这一路段的汽车群正在报告交通堵塞。虽然你仍然可以自己驾驶汽车,但传感器可以识别街道上你周围的一切,并在你的汽车中处理这些数据。如果有人一个小孩跳到你的车前,车会比你更快地坏掉。在工作中,你不必再做任何重复性的工作。一个智能助手正在安排你的会议( x.ai ),让你知道你必须在什么时间去哪里。下班后,你的健康跟踪器建议你做一些运动,因为你今天没有做足够的运动(顺便说一下,69%的美国人跟踪他们的健康数据)。在一天结束的时候,你可以坐在沙发上看一部令人惊叹的网飞系列片——这是在收集的行为用户数据的帮助下,以你真正喜欢的方式制作的。
在提出所有这些简单的例子时,信息如下:没有人能够再隐藏数据使用。它是我们日常生活的一部分,我们想不想用它不再完全是我们的决定。因此,还有什么比挖掘对你的日常生活有如此巨大影响的事物更好的动力呢?
决策优势。 35.000——这是我们每天有意识和无意识做出的决定的数量。有些比其他的更重要。丹尼尔·卡内曼分享了他关于做出重要决定的建议:“你应该放慢脚步,从某个特定的人那里获得建议。一个喜欢你,但不太在乎你感受的人。那个人更有可能给你好的建议。” *
但是还有什么在影响我们的“重要”决定呢?那些我们放慢脚步的决定,那些我们花了很多时间去做的决定,不管是私人的还是商业的。F 关于决策的行为者在科学研究中已经比在这篇博文中被更好地指明。但为了说明我的观点,让我们简单地将影响因素分为内部和外部两类:
- 内部因素或个人特征:以前的经历、个人背景、价值观、风险、兴趣、哲学、偏见(尤其是不同形式的认知偏见)等等。
- 外部影响和形势:在什么时候做出决定。决策者在什么地方。围绕在决策者身边的人。
现在让我们把这些影响因素放在决策的基础上:事实。内部和外部因素使个人总是做出不同的决定,但事实和实际信息这一参数既不能改变也不能忽略。它让我们可以选择更客观地调整决策过程
如前所述,数据是一种信息形式。如果个人、企业主或任何类型的群体能够在技术的帮助下访问和处理越来越多的数据,并根据有见地和更完整的信息采取行动,结论很简单:信息越多,决策就越全面。无论你在哪个领域,为自己使用这种可能性,应该有足够的动力去理解用于它的数据的基本概念。
现在该怎么办?
在那篇文章的结尾,希望你对进入数据领域感到非常兴奋,并了解它对你、你的企业、你的朋友,…但是现在如何入门呢?
现实一点,你不必为了简单地学习基础知识而去读硕士或类似的课程。更重要的是,你已经阅读了这篇文章,它让你思考数据。所以问问你自己:
- 数据对你和你的同伴有什么影响?
- 你想用数据做什么?您希望在哪里贡献您的数据?
你对数据反思的越多,问题就会出现的越多。最后,你对它在政治、法规和自由数据流方面的需求有自己的看法和理解。
期待在评论中听到您的反馈,或者给我发邮件至 florian@investory.io。
另一篇你可能喜欢的文章:
结合定性&定量数据分析你的产品粘性
为什么您应该忽略数据科学绩效评估
Picture by Peter Belch, CC0
上周,我拜访了一位客户,向他展示了我的分析。我显示的 AUC 是 0.92。印象深刻,嗯?
你不知道我在说什么?太好了——你不需要。有一堆数据科学性能指标。AUC、AUPRC、F-Measure、R-Squared、RMSE、精确度等等等等。在现实生活中他们都不会帮到你。你应该简单地忽略它们。
优化你真正想要的
如果做行业内的数据科学项目,你对什么感兴趣?收入?延迟时间?那么你为什么不对此进行优化呢?每个数据科学项目都应该针对其目标价值进行优化。在最好的情况下,数据科学绩效评估只能代表您的真实目标。分类比较正确当然好。当然,确保预测和目标变量之间的良好相关性是很好的。但这只是一个代理,而不是主要目标。
为什么它会对您优化的内容产生巨大影响
先说一个简单的例子。您的目标是减少银行账户的流失,包括个人账户和企业账户。你可以想象有几种类型的客户流失者。
可能会有学生、工人,也可能会有初创企业和更大的公司流失。简单地以最准确为目标是好的,但是我们通过为学生预测它来产生多少收入呢?没那么多。中型公司呢?我想会更多。\ n * *因此,我们的绩效指标以及优化方案应该考虑每个客户的收入,并更多地关注大客户。**找到更少的产生更多平均收入的搅动者可能比简单地找到尽可能多的人更好。
为什么您应该投资数据仓库&标签管理系统,或者 CRM 系统的日子是有限的
处理度量是一件具有挑战性的事情。提出一项措施计划是一回事。想出一个追踪系统是另一件事。谷歌在 2015 年 10 月初推出了它的标签管理系统,然而…在这篇文章中,我想从两方面谈谈标签的总体需求。客户端和数据仓库端
客户端和数据仓库端的区别
客户端
如果说到客户端,我说的是真正的客户端交互。在浏览器中。如果要进行跟踪,服务器端是其中的一部分。这只是达到目的的一种手段,但本质上它归结为跟踪你的平台上的客户端的交互,不管那可能是什么。你可以说,就其最纯粹的形式而言,CRM 在某种程度上也在跟踪客户端交互:
- 客户发送了一封电子邮件
- 给潜在客户打了一个电话
- …
像 hubspot 或 intercom.io 正在做的事情。一种数字化的第一客户关系管理,基于你平台上的标签页面和互动。
因此,本质上,他们是一个工具,内置了灵活但精细的标签管理系统,仅用于他们的产品。
如果你愿意,Intercom.io 可以让你走得更远,但这不是它的目的。你必须在对讲机上定制,以充分利用标记功能。所以…不行。你最好投资一个标签管理系统。
在网站上,它会得到这些互动的形式:
- 一个访问者点击了一个按钮
- 一名游客填写了联系表格
- 一个登录的客户下载了手册
- …
非常简单明了,对吗?
专注于客户端交互的标签管理系统提供了一种控制、注入和构建代码或部分代码的方式来衡量这些交互。
客户端集中的标签管理系统
外面有一些。最著名的可能是谷歌标签管理器,因为它有一个大型的分布式分析平台作为基础:谷歌分析。还有一个,GTM (Google Tag Manager)出来之前我一直在用的是量子位的 Open Tag 。同样的想法,有点不同的工作方式,但本质上是一样的:一个系统,把代码和脚本跟踪在你的网站上的某个地方。如果涉及到微标记某些东西(点击按钮等),GTM 有更多的功能。)
例如,Tealium 是另一个标签管理系统。我还没有用过它,但我认为它可能是市场上最有趣的独立标签管理系统。
数据仓库方面
我们这里不是在讨论互动。我们在这里讨论的是事务性数据和细分。完全不同的东西。为了实现良好的营销执行,你需要一个系统来标记你的细分市场:
- 客户细分级别的标签(行为和偏好类型,而非人物角色!)
- 产品细分级别上的标签(排序)
- 行为细分级别上的标签(搜索和阶段)
CRM 系统不是标签管理系统
很多人把 CRM 和标签管理系统混淆了。CRM 是一个客户关系管理系统,这意味着它存储了潜在客户的一些数据(主要是社会和人口统计数据),并将它们放在从潜在客户到客户的漏斗中,以便更容易跟踪销售过程。
别忘了,客户关系管理是一种销售工具。它告诉你有多少线索进来,有多少客户出去。
标签管理系统是一个系统,您可以在其中标记交互以及潜在的潜在客户或潜在客户的状态。这是可能的。它能做的不仅仅是 CRM 系统。它可以进行行为分析,这是 CRM 做不到的。像 hubspot 这样的混合动力系统可以,但在我看来,我认为 hubspot 并没有那么好。这是最基本的。太简单了。做精就够好了。推动成长不够专业。如果你想深入研究,它缺乏灵活性。部分原因是你有义务在 hubspot 平台上建立你的网站。
跳过或放松 CRM &建立一个数据仓库,并在其上建立一个好的标签管理系统。
你需要的是两全其美
你需要这两者来获得最好的洞察力来指导你的营销执行计划和营销情报。其实不需要 CRM 系统。你只需要一个数据仓库&一个好的标签管理系统。剩下的就是过程&你团队里一帮聪明的男生/女生。
CRM 只是一个可视化这个过程的工具&跟踪销售。使用仪表板工具挖掘您的数据实际上是同样的事情。传统 CRM 系统的时代已经结束。真的,他们是。
为什么你不应该连续编码 30 个小时
First place prize of the last year, but believe me, it looks the same each year 😃 (photo source: DSG FB group)
9 月的最后一周,我参加了 2018 年数据科学比赛(DSG)的决赛,这是最著名的致力于机器学习和数据科学的天才学生国际比赛。今年,来自世界各地的 26 支队伍来到巴黎挑战自我。这项赛事的任务始终是一场类似卡格尔的比赛,但时间有限:参赛者只有 30 个小时来取得最好的成绩。
我和我的团队代表芬兰参加了这次活动。在 DSG 历史上,芬兰第一次进入了 DSG 的决赛,并进入了前 10 名的决赛排行榜。这篇文章将是关于比赛的任务,我们在比赛中面临的挑战,我们的解决方案的描述,以及我们在 30 小时的编码冲刺中学到了什么。
任务和数据
这项任务是由法国电子商务网站 Cdiscount 承担的,该网站提供广泛的产品:包括文化用品、高科技、IT、家用电器、个人电器和食品等多种产品。Cdiscount 向竞争对手提供了一个由导航跟踪元素组成的数据集,以及一个描述产品类别层次结构的数据集。
考虑到用户的隐私,Cdiscount 主动在没有任何用户身份的情况下将挑战置于会话级别。因此,所有类型的个人数据都已从数据集中删除。此外,所有与产品相关的信息都已加密,以确保所有参与者(讲法语的人和其他人)之间的公平。
Description of provided data
我们被要求预测在最后一次观察和会话结束之间发生购买行为的概率(对于给定用户,会话被定义为一系列事件,当两个连续事件之间的时间超过 30 分钟时,会话结束)。这个任务是一个二元分类,竞争的度量——对数损失。
The illustration shows how the target was built
我们的解决方案
在比赛开始时,组织者提供了三个数据集:训练、测试和产品的层次结构。最后一个有点问题,组织者正在试图在活动期间修复它;所以,我们决定完全不用它。训练数据集由 130 万行组成,代表大约 13 万个会话。在测试中,我们有关于 90k 个会话的信息。因此,类别是不平衡的:在 train 数据集中呈现的所有会话中,只有 9.4%导致购买。
这项任务相当困难,原因有很多:建议的数据集相当原始(如果没有一些预处理,我们无法运行简单的拟合预测),每个会话都包含一个序列组件(数据的本质是用户的动作序列),绝大多数特征都是匿名的。然而,我们以前也面临过类似的情况;所以,我们知道该怎么做。数据集由几种类型的要素组成,这就是我们以不同方式处理它们的原因。我们来详细讨论一下。
时间特征
Duration
是数据集中唯一的时间特征。它显示了从会话开始到打开当前页面之间的时间。绝对值对模型没有意义;因此,我们决定计算用户在当前页面和前一个页面上花了多少时间。然后,我们像处理数字特征一样处理这两个特征。
字符串特征
这次比赛有很多弦乐特色。它们代表不同的东西:一种页面类型(和一种简化的页面类型)、页面上或用户购物篮中各种商品的 id、用户使用的过滤器、转盘 id、搜索行和站点 id。
处理这些功能最常见的方法是将它们组合在一起,像处理文本功能一样处理它们(准确地说,使用 NLP 任务中常用的工具)。我们对每个会话的连接字符串执行 TF-IDF 或计数矢量器;在这种情况下,“or”意味着我们为每个字符串列选择了一种策略(不是同时选择两种策略)。当我们处理多个模型时,我们测试了预处理的各种组合。此外,我们对每个模型使用了不同的 TF-IDF 超参数集和计数矢量器。我们这样做主要是因为我们希望我们的模型给我们不同的预测(即,在不同地方“出错”的模型),以便我们可以在以后堆叠或混合它。
此外,我们从这些字符串中提取了一些数字特征:每个用户的每列的值的数量,每个用户的每个字符串列的唯一值的数量,等等。
分类特征
我们决定获取每个字符串列中最频繁出现的值,并像处理分类特征一样处理它。更重要的是,我们以一个类别的形式添加了 first、first two、last 和 last 两个动作。
我们使用了几种策略来处理分类特征:标签编码、一个热点编码和均值编码。许多团队使用均值贝叶斯编码(参见ka ggle 内核以更好地理解这个想法),它试图对罕见类别的概率进行正则化。根据我的经验,这不是执行均值编码的最佳方式。正确的方法如下:我们将训练数据集分成k
个折叠,k-th
个折叠将用于验证,而k-1
个折叠将用于计算该类别所有级别的平均目标,并转移到测试数据集和验证部分。然后将k-1
褶皱分成t
褶皱,重复同样的操作(k
和t
—有些数字,我们用了k=10
、t=5
)。使用这种策略,我们不需要任何类型的正则化;我们经常取得更好的成绩。然而,这种方法需要更多的计算时间。
The concept of mean encoding: classes will become more separable with it
数字特征
在这场竞赛中,处理数字特征的最佳方式是通过sid
和一些分类列进行聚合,然后计算一些统计数据:
import pandas as pd
import numpy as np
from scipy import statscat_columns_list = """ all cat columns """
num_columns_list = """ all numberical columns """
# nearly all sids contained at least one NaN in each numerical feature
functions_dict = {
'max': np.nanmax,
'min': np.nanmin,
'ptp': lambda x: np.nanmax(x) - np.nanmin(x),
'mean': np.nanmean,
'std': np.nanstd,
'mean_div_std': lambda x: np.nanmean(x) / (np.nanstd(x) + 1) # std==0 sometimes
'median': np.nanmedian,
'skew': lambda x: stats.skew(x, nan_policy='omit')
}num_features_dfs = []
for cc in cat_columns_list:
for fc in num_columns_list:
for fnc_d in functions_dict:
fnc_f = fnc_d.keys()
fnc_name = d.values()
grb_df = df[['sid'] + cc + fc].groupby(['sid'] + cc).agg(fnc_f).reset_index()
new_col_name = fc + 'l_grouped_by_' + cc + 'l_agg_' + fnc_name
grb_df = grb_df.rename({fc: new_col_name}, axis=1)
piv_df = grb_df.pivot(index = 'sid', columns = cc, values = new_col_name)
num_features_dfs.append(piv_df)
序列预测特征
如上所述,每个会话的数据包含页面序列和用户的一些操作(进行搜索、添加过滤器或放入购物篮,等等)。处理这些序列最常见的方法是使用 RNN 或 LSTM 模型来预测目标变量,但我们没有这样做。我们认为,由于每个会话的长度不同(从页数和每页花费的时间来看),这些模型给我们的分数很低(免责声明:我们是对的;试用这些模型的竞争对手报告说这种方法得分很低)。
为了捕捉数据的序列性质,我们做了一件完全不同的事情。对于每个会话,我们都知道他访问过的某类页面的顺序。我们制作了一个预测下一页的模型,给出了前n
页的信息(我们尝试了不同的n
,n=3
根据我们的验证分数是最好的一个)。我们将训练和测试数据集结合在一起,并为会话进行了 OOF(分组折叠策略)预测;然后,我们计算了每次预测的准确性。这个特性用于预测目标变量——用户是否会购买某样东西。最后,这个特性是最重要的特性之一。
The illustration of the new feature distribution
模型
我们试图在这场比赛中使用前馈神经网络,但它们给我们的分数比基于树的模型更差。我们采用了一个具有l
层和每层中的n
神经元的网络(我们尝试了l
和n
的不同值,使用以下参数获得了最佳结果:l=6
和n=256
,但仍然太差而无法工作)。对于分类特征,我们尝试了 OHE 和嵌入层。在每一层之后,我们使用了一个脱落层。事后,其他参与者告诉我们,NN 在这项任务中帮助不大。
在我们的最终解决方案中,我们在各种特征子集上训练了几个基于树的模型(使用了不同的预处理策略)。我们使用 CatBoost 和 LightGBM 以及我们自己调整的超参数。XGBoost 训练很慢,最后我们没有太多时间;所以,我们没有使用它。根据公共排行榜和验证的加权分数,我们最终提交的是最佳模型的前 5 名:
w_score = (log_loss_public * n_samples_public + log_loss_cv * n_samples_cv) / (n_samples_public + n_samples_cv)
经验教训和成果
在大部分比赛时间里,我们都在公共排行榜的前 1-前 5 名,但有些地方出了问题。我们连续工作了 30 个小时,只睡了 1.5 个小时,这显然是我们的失误。临近截止日期时,我们感到极度疲劳,无法做到最好:我们的想法变得肤浅,我们在代码中犯了几个错误。最终,我们被那些决定花时间在床上,而不是在显示器前的团队,或者那些采用 2 乘 2 方案的团队打败了:两个在睡觉,两个在工作。我认为这是我们的主要错误,也是我们最终排名第八的主要原因。由于一个战略错误,我们失去了所有的战术优势。
下次,我们会更加注意时间管理。
Final leaderboard
然而,我对结果很满意。我第一次参加数据科学比赛,但是有几个团队,他们参加了两次。我们面临的挑战是艰巨的,但我们没有放弃。最后,它让我们变得更强大:就我个人而言,我发现了许多可以改善我的机器学习竞赛管道的领域(强大的特征工程,预处理期间的多信息输出)和许多新想法,我可以在即将到来的挑战中尝试新数据(主要与特征选择相关)。
最后,我要感谢这次盛会的所有组织者;感谢微软在 Azure 上的免费积分和一个有趣任务的 Cdiscount。特别感谢所有参加 DSG 2018 的人,没有如此强大的竞争对手,参加就没意思了。
这是一场精彩的战斗。我会尽我所能参加数据科学游戏 2019。
Our team: Dmitrii Mikheev, Denis Vorotyntsev, Margarita Pirumyan, Nikita Ashikhmin
更多关于 DSG 的信息:数据科学游戏网站
附注:根据 NDA 政策,我既不能发布数据也不能发布代码:(
为什么你应该开始使用。npy 文件更频繁…
数据科学/机器学习需要数据的快速计算和转换。Python 中的原生 NumPy 对象提供了优于常规编程对象的优势。它的工作就像从磁盘上的文件中读取数字数据集一样简单。我们用几行代码展示了它的优势。
介绍
N umpy,简称数值 Python ,是 Python 生态系统中高性能科学计算和数据分析所需的基础包。它是几乎所有高级工具如熊猫和 scikit-learn 的基础。 TensorFlow 使用 NumPy 数组作为基本的构建模块,在此基础上他们构建了用于深度学习任务的张量对象和 graphflow(在长列表/向量/数字矩阵上大量使用线性代数运算)。
已经有很多文章展示了 Numpy 数组相对于普通 Python 列表的优势。在数据科学、机器学习和 Python 社区中,您会经常遇到这样的断言:Numpy 的速度要快得多,这是因为它的矢量化实现以及它的许多核心例程都是用 C 语言编写的(基于 CPython 框架)。这确实是真的(这篇文章很好地展示了使用 Numpy 可以使用的各种选项,甚至可以使用 Numpy APIs 编写基本的 C 例程)。Numpy 数组是同构类型的密集数组。相反,Python 列表是指向对象的指针数组,即使它们都是同一类型。你得到了参考位置的好处。
在我的一篇被大量引用的关于走向数据科学平台 的文章中,我展示了使用 Numpy 向量化操作相对于传统编程结构(如 for-loop )的优势。
然而,不太为人所知的是,当涉及到从本地(或网络)磁盘存储中重复读取相同数据时, Numpy 提供了另一个名为。npy 文件格式。这种文件格式使得的阅读速度比从纯文本或 CSV 文件中阅读快得多。
问题是——当然,您第一次必须以传统方式读取数据,并创建一个内存中的 NumPy ndarray
对象。但是如果您使用同一个 CSV 文件来重复读取相同的数字数据集,那么将ndarray
存储在npy
文件中,而不是从原始 CSV 文件中一遍又一遍地读取它,这是非常有意义的。
这是什么?NPY 文件?
这是一种标准的二进制文件格式,用于在磁盘上保存单个任意的 NumPy 数组。该格式存储了正确重建数组所需的所有形状和数据类型信息,即使在另一台具有不同体系结构的计算机上也是如此。在实现其有限目标的同时,格式被设计得尽可能简单。该实现是纯 Python 的,并作为主 NumPy 包的一部分分发。
该格式必须能够:
- 表示所有 NumPy 数组,包括嵌套的记录数组和对象数组。
- 以本机二进制形式表示数据。
- 包含在一个文件中。
- 在不同架构的机器上存储重建数组所需的所有信息,包括形状和数据类型。小端和大端数组都必须得到支持,具有小端编号的文件将在任何读取该文件的机器上生成小端数组。这些类型必须根据它们的实际大小来描述。例如,如果具有 64 位 C“long int”的机器写出具有“long int”的数组,则具有 32 位 C“long int”的读取机器将产生具有 64 位整数的数组。
- 被逆向工程。数据集通常比创建它们的程序存在的时间更长。一个有能力的开发人员应该能够用他喜欢的编程语言创建一个解决方案,来阅读他得到的没有多少文档的大多数 NPY 文件。
- 允许数据的内存映射。
使用简单代码进行演示
和往常一样,你可以从我的 Github 库下载样板代码笔记本。这里我展示了基本的代码片段。
首先,读取列表中的 CSV 文件并将其转换为 ndarray 的常用方法。
import numpy as np
import time**# 1 million samples**
n_samples=1000000**# Write random floating point numbers as string on a local CSV file**
with open('fdata.txt', 'w') as fdata:
for _ in range(n_samples):
fdata.write(str(10*np.random.random())+',')**# Read the CSV in a list, convert to ndarray (reshape just for fun) and time it**
t1=time.time()
with open('fdata.txt','r') as fdata:
datastr=fdata.read()
lst = datastr.split(',')
lst.pop()
array_lst=np.array(lst,dtype=float).reshape(1000,1000)
t2=time.time()print(array_lst)
print('\nShape: ',array_lst.shape)
print(f"Time took to read: {t2-t1} seconds.")>> [[0.32614787 6.84798256 2.59321025 ... 5.02387324 1.04806225 2.80646522]
[0.42535168 3.77882315 0.91426996 ... 8.43664343 5.50435042 1.17847223]
[1.79458482 5.82172793 5.29433626 ... 3.10556071 2.90960252 7.8021901 ]
...
[3.04453929 1.0270109 8.04185826 ... 2.21814825 3.56490017 3.72934854]
[7.11767505 7.59239626 5.60733328 ... 8.33572855 3.29231441 8.67716649]
[4.2606672 0.08492747 1.40436949 ... 5.6204355 4.47407948 9.50940101]]>> Shape: (1000, 1000)
>> Time took to read: **1.018733024597168 seconds**.
这是第一次阅读,无论如何你都要做。但是如果您可能会多次使用同一个数据集,那么,在您的数据科学过程完成之后,不要忘记在中保存 ndarray 对象。npy格式。
**np.save('fnumpy.npy', array_lst)**
因为如果你这样做了,下一次,从磁盘读取将会非常快!
t1=time.time()
array_reloaded = np.load('fnumpy.npy')
t2=time.time()print(array_reloaded)
print('\nShape: ',array_reloaded.shape)
print(f"Time took to load: {t2-t1} seconds.")>> [[0.32614787 6.84798256 2.59321025 ... 5.02387324 1.04806225 2.80646522]
[0.42535168 3.77882315 0.91426996 ... 8.43664343 5.50435042 1.17847223]
[1.79458482 5.82172793 5.29433626 ... 3.10556071 2.90960252 7.8021901 ]
...
[3.04453929 1.0270109 8.04185826 ... 2.21814825 3.56490017 3.72934854]
[7.11767505 7.59239626 5.60733328 ... 8.33572855 3.29231441 8.67716649]
[4.2606672 0.08492747 1.40436949 ... 5.6204355 4.47407948 9.50940101]]>> Shape: (1000, 1000)
>> Time took to load: **0.009010076522827148 seconds**.
如果您想以其他形式加载数据,这并不重要,
t1=time.time()
array_reloaded = np.load('fnumpy.npy').**reshape(10000,100)**
t2=time.time()print(array_reloaded)
print('\nShape: ',array_reloaded.shape)
print(f"Time took to load: {t2-t1} seconds.")>> [[0.32614787 6.84798256 2.59321025 ... 3.01180325 2.39479796 0.72345778]
[3.69505384 4.53401889 8.36879084 ... 9.9009631 7.33501957 2.50186053]
[4.35664074 4.07578682 1.71320519 ... 8.33236349 7.2902005 5.27535724]
...
[1.11051629 5.43382324 3.86440843 ... 4.38217095 0.23810232 1.27995629]
[2.56255361 7.8052843 6.67015391 ... 3.02916997 4.76569949 0.95855667]
[6.06043577 5.8964256 4.57181929 ... 5.6204355 4.47407948 9.50940101]]
>> Shape: **(10000, 100)**
>> Time took to load: **0.010006189346313477 seconds.**
事实证明,至少在这种特殊的情况下,磁盘上的文件大小对于。npy 格式。
摘要
在本文中,我们演示了使用原生 NumPy 文件格式的效用。npy over CSV,用于读取大型数值数据集。如果需要多次读取同一个 CSV 数据文件,这可能是一个有用的技巧。
点击阅读更多关于这种文件格式的细节。
喜欢这篇文章吗?成为 中等会员 继续 无限制学习 。如果您使用下面的链接, ,我将收取您的一部分会员费,而不会对您产生额外费用 。
[## 通过我的推荐链接加入 Medium—Tirthajyoti Sarkar
作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@tirthajyoti/membership)
为什么您仍然应该考虑 R 中的老式 For 循环
当我第一次开始使用 R 时,我对这种语言的计算效率(速度)有点失望。这并不会妨碍大多数数据科学家,但对于生产代码或大型数据集来说就不那么好了。然而,就像生活中的许多事情一样,为了让 R 做你想做的事情,你需要更加努力地工作,走出普通的道路。
在之前的一篇文章中,我比较了四种不同编程语言中拆分-应用-合并原理的时间,在几次尝试之后,R 实际上在我的用例中名列前茅。最好的结果是使用了 data.table 包,它主要是在 Rcpp(R 的 c++接口)中构建的。
有趣的是,我现在正与另一位工程师合作,在我们的一个商业包中实现一种分割-应用-组合的方法,使用 R 中的预开发代码来快速地在客户那里得到东西(持续开发等等)。不幸的是,我们被告知不能使用 GNU GPL 开源许可。
这意味着:
- 没有数据。表:(
- 没有 dplyr:(
- 没有使用有效的 Rcpp 代码…
现在怎么办?
没有这些精美的软件包,数据科学家应该做些什么呢?什么都要自己写?以 R 为基数?哦不!这是一场噩梦,对吗?但是,事实证明,你学到了 r 基的一些有趣的方面。
所以我还是要速度。我的应用程序肯定不会成为瓶颈。绝对不会。我代表质量。代替这种用户体验的是:
点击开始按钮。预计计算时间:15 分钟。“唉,我再去喝一杯咖啡。”
我更喜欢这种用户体验:
点击。嗖嗖。完成了。“嘿,这个漂亮的图表在这里做什么?”
因此,我的一般规则是:“当我的算法运行时,顾客不能喝咖啡。”幸运的是,我的同事也有同样的想法,显然他甚至牺牲了对经理的好感,在代码优化上花时间。所以我觉得这将是一次有趣的合作。
那么我们如何获得速度呢?一般你用众所周知的互联网智慧。这是 R 中宣扬的主要范式:
你不应该使用 for 循环!您应该使用应用功能!
并不总是对的…
我喜欢函数式编程,但有时你必须尝试什么最有效。在 base R 中,对数据帧中的每个组应用操作的默认方法是函数by
。最重要的是,R 中典型的线性建模接口是lm
。将这两个功能结合起来,在一个简单的用例上的计时超过 9 秒(在更现实的情况下,打哈欠、喝咖啡会很快达到几分钟)。我可以用基 R 函数把它降低到 0.4 秒。这是超过 25 倍的改进!
我们是如何加快速度的?
函数lm
很慢,因为它进行字符串解释和许多其他计算,使用户的生活更容易。假设您有一个包含 A、B 和 Z 列的数据框架,那么通常情况下,您会对多项式回归进行如下操作:
**# The easy way of modeling**
model <- lm(Z ~ poly(A, B, degree=3, raw=TRUE), data = df)
比lm
更快的方法是手动处理线性代数。在我之前的文章中,我使用了一个 QR 分解器,但是我的同事发现内部的.lm.fit
功能甚至比它快两倍(我们有一点竞争)。对于那些不熟悉线性代数的人来说,这里最难的部分是为你的问题定义模型矩阵。
**# The harder way, first construct a model matrix**
M <- cbind(A*0+1, A, B, A*B, A², A²*B, B², A*B², A³, B³)
**# Then do the fit**
model <- .lm.fit( M, Z )
随着建模速度的提高,我们现在可以看看如何处理by
功能。这个函数很慢,因为它在内部进行了大量的数据转换,一直在分配新的内存,这是完全没有必要的。最后,您会得到每个组的结果列表,您需要再次取消列表,这又是一次内存分配。这很容易改进。
A comparison of some of the results. I’m not even showing by + lm
, that’s off the chart at 9 seconds.
by
的另一种选择是 data.table,但不幸的是我们不能使用它。所以下一个最好的方法是一个简单的 for 循环!我们发现矩阵是循环中最快的索引数据类型,这是线性代数所需要的。为了让事情进展得更快,只要确保不要创建太多不必要的变量,尤其是避免将事情转换成列表。
对于那些喜欢钻研代码的人,我已经在我的 github 库中添加了一个关于这个主题的单 R 脚本。
结论
结合所有这些改进和其他代码优化,我的同事成功地将一个典型用例的 5 分钟计算时间减少到了 2 秒钟!这是一个伟大的结果!现在的瓶颈在于数据加载,这仍然需要大约一分钟的时间,我们目前没有能力解决这个问题。但是总的来说没有时间再喝咖啡了!
因此,如果您正面临一些数据科学或编码问题,不要忘记尝试违背常规实践的方法!
为什么你应该尝试平均编码
from Stuart Hall’s 1973 “Encoding/Decoding” model
任何特征工程任务中一个非常常见的步骤是将分类特征转换成数字特征。这被称为编码,虽然有几种编码技术,但有一种是我特别喜欢并经常使用的——意味着编码。
这是怎么做到的
与标签编码不同,标签编码以一种随机的方式高效地完成工作,而均值编码试图以更符合逻辑的方式处理问题。简而言之,它使用目标变量作为基础来生成新的编码特征。
让我们来看一个例子:
在这个样本数据集中,我们可以看到一个名为“Jobs”的特征,另一个名为“Age”的特征,以及一个指向带有目标变量 1 和 0 的二元分类问题的目标变量。现在,特征“年龄”已经设置好了,因为它已经是数字了,但是现在我们需要对特征“工作”进行编码。
最明显的方法是标签编码,其中我们将根据映射逻辑转换值——例如 1 表示医生,2 表示教师,3 表示工程师,4 表示服务员,5 表示司机。因此,结果将是:
这种方法真的没有错。然而,如果我们观察特征的分布,我们会发现它完全是随机的,与目标变量没有任何关联。
有道理,对吧?关于我们应用的映射没有任何特定的逻辑,我们只是给每个工作一个数字,仅此而已。现在,有没有另一种方法,我们可以对这个特征进行编码,使它不那么随机,也许会给我们一些关于目标变量本身的额外信息?
让我们试试这个:对于分类特征的每个唯一值,让我们根据目标变量中阳性类出现的比率对其进行编码。结果将是:
为什么?例如,让我们看看独特的价值“医生”。目标变量出现了 4 次,其中 2 次是阳性标签,因此,值“Doctor”的平均编码为 0,5。对该特征的所有唯一值重复该过程,就可以得到结果。
现在让我们再来看一下这个特性的分布,看看有什么不同。
目标类看起来更加独立-类 1 在右侧,类 0 在左侧-因为在特征值和目标类之间存在相关性。从数学的角度来看,均值编码代表了目标变量的一个概率,取决于特性的每个值。在某种程度上,它将目标变量体现在其编码值中。
总之,均值编码既解决了编码任务,又创建了一个更能代表目标变量的特征——基本上是一举两得。
时好时坏;起伏波折
然而,这并不都是好事。虽然均值编码已经显示出可以提高分类模型的质量,但是它也存在一些问题;主要的一个是通常的嫌疑人,过度拟合。
事实上,我们基于目标类对特性进行编码可能会导致数据泄漏,使特性有偏差。为了解决这个问题,均值编码通常与某种正则化一起使用。以 Kaggle 上的这个解决方案为例,作者使用了平均交叉验证方案。
既然我们在谈论 Kaggle,我们不妨提一下梯度推进树,以及均值编码如何对它们特别有用。GBT 的一个缺点是它无法处理高基数分类特征,因为树的深度有限。
from Dmitry Altukhov’s “Concept of Mean Encoding”
现在,由于均值编码大大降低了基数,正如我们之前看到的,它成为了一个很好的工具,可以用更短的树达到更好的损失,从而改进分类模型。
正在总结…
没有什么比尝试更好的了,对吧?我的建议是:从 Kaggle 上的梅赛德斯比赛的数据集开始,看看它们的分类特征。
提示:测量应用均值编码前后分类特征的基数😉
为什么应该使用脏数据以及从哪里获取
Photo by Jeremy Bishop on Unsplash
每个人都在谈论的一件事是,学习者应该获得数据集,并开始进行机器学习。来自存储库的数据集,特别是机器学习数据集。
问题是这些数据集通常都很干净。人们会问:我们从哪里获得脏数据集?
为什么需要脏数据集?
机器学习或数据科学的第一步实际上是研究数据,理解数据。这是关于什么的。
从干净的数据集开始是一个好主意,在那里你可以学习建立机器学习模型的方法等等。但是在某些时候你需要学习如何清理数据,如何做预处理。
预处理非常重要,因为:数据从来都不是干净的!
谷歌开放数据
我的建议是:去谷歌搜索公开数据。有很多公开的数据集,谷歌一下就知道了。
我推荐的另一件事不仅仅是搜索公开数据。寻找一个特定的利基。
如果你对银行业感兴趣,那么谷歌:“开放数据银行”
如果你对交通感兴趣:“开放数据公共交通”或“开放数据智慧城市”,无论你感兴趣的小众。开放数据能源生产。
你会发现数据无处不在。然后你就可以清洗它了。
领域知识很重要
我总是强调领域知识,因为作为一名数据科学家,你需要它。是对某一领域的深刻理解。
没有领域知识,你就不会真正理解数据。你不能预处理数据,不能清理数据。没有领域知识,很难决定一个模型是否真的如预期的那样工作。
你需要理解商业案例:你到底想用这个模型解决什么。
在你有领域知识的地方处理数据
当你开始选择适合你的利基。你有一些领域知识的利基。
这意味着你对正在发生的事情有所了解。如果你学过工程学,也许是和工程学相关的。
如果你是一名银行业分析师,并且你正在研究机器学习,那就研究一下银行业。这很容易,也很开放。
有这么多的来源。出去试试吧。
.
上打招呼:insta gram|LinkedIn|脸书|Twitter|YouTube|Snapchat
不要错过我在 SoundCloud 和主播上的几乎每天的数据科学和大数据播客
订阅我的简讯:这里
为什么你不应该成为数据科学通才
我在一家数据科学导师初创公司工作,我发现有一条建议是我反复给有抱负的学员的。这真的不是我所期望的。
与其建议一个新的库或工具,或一些简历黑客,我发现自己建议他们首先考虑一下他们想成为什么样的数据科学家。
这一点至关重要的原因是,数据科学不是一个单一的、定义明确的领域,公司不会雇用通用的、多面手的“数据科学家”,而是拥有非常专业的技能组合的个人。
要了解原因,只需想象一下,你是一家试图招聘数据科学家的公司。几乎可以肯定,你头脑中有一个相当明确的问题需要帮助,这个问题需要一些相当具体的技术知识和专业知识。例如,一些公司将简单模型应用于大型数据集,一些公司将复杂模型应用于小型数据集,一些公司需要即时训练他们的模型,一些公司根本不使用(常规)模型。
这些都需要完全不同的技能,因此特别奇怪的是,有抱负的数据科学家收到的建议往往如此笼统:“学习如何使用 Python,建立一些分类/回归/聚类项目,然后开始申请工作。”
我们这些在这个行业工作的人要为此承担很多责任。在随意的交谈、博客帖子和演示中,我们倾向于将过多的东西归入“数据科学”范畴。为生产构建强大的数据管道?这是一个“数据科学问题”发明一种新的神经网络?这是一个“数据科学问题”
这并不好,因为这往往会导致有抱负的数据科学家失去对特定问题类别的关注,而是成为所有行业的千斤顶——在一个已经充满多面手的市场中,这可能会使人们更难注意到或突破。
但是,如果你不知道首先应该专攻哪些常见问题,那么你就很难避免成为多面手。这就是为什么我列出了通常被归入“数据科学”标题下的五个问题类别:
1.数据工程师
**职位描述:**你将为处理大量数据的公司管理数据管道。这意味着确保您的数据在需要时被有效地从其来源收集和检索,并进行清理和预处理。
**为什么重要:**如果您只处理过存储在。csv 或。txt 文件,可能很难理解为什么会有人全职工作是建立和维护数据管道。这里有几个原因:1)50gb 的数据集不适合您的计算机的 RAM,所以您通常需要其他方法将它输入到您的模型中,2)这么多的数据可能需要花费大量的时间来处理,并且经常需要冗余存储。管理这种存储需要专业的技术知识。
**需求:**您将使用的技术包括 Apache Spark、Hadoop 和/或 Hive,以及 Kafka。你很可能需要有坚实的 SQL 基础。
你将要处理的问题听起来像:
→“我如何构建一个每分钟可以处理 10 000 个请求的管道?”
→“我如何在不将数据集全部加载到 RAM 中的情况下清理数据集?”
2.数据分析师
工作描述:你的工作是将数据转化为可操作的商业见解。你经常是技术团队和商业战略、销售或营销团队的中间人。数据可视化将成为你日常生活的一大部分。
**为什么重要:**高度技术化的人通常很难理解为什么数据分析师如此重要,但他们确实如此。有人需要将一个经过训练和测试的模型和成堆的用户数据转换成可消化的格式,以便围绕它们设计商业策略。数据分析师有助于确保数据科学团队不会浪费时间来解决无法带来商业价值的问题。
**需求:**您将使用的技术包括 Python、SQL、Tableau 和 Excel。你还需要成为一名优秀的沟通者。
你将要处理的问题听起来像:
→“是什么推动了我们的用户增长?”
→“我们如何向管理层解释,最近用户费用的增加正在拒人于千里之外?”
3.数据科学家
**工作描述:**你的工作将是清理和探索数据集,并做出带来商业价值的预测。您的日常工作将包括培训和优化模型,并经常将它们部署到生产中。
**为什么重要:**当你有一堆太大的数据,人类无法解析,并且太有价值而不能被忽略时,你需要某种方式从中提取可消化的见解。这是数据科学家的基本工作:将数据集转换成可理解的结论。
**需求:**您将使用的技术包括 Python、scikit-learn、Pandas、SQL,可能还有 Flask、Spark 和/或 TensorFlow/PyTorch。一些数据科学职位是纯技术性的,但大多数职位需要你有一些商业意识,这样你就不会最终解决没有人解决的问题。
你将要处理的问题听起来像:
→“我们到底有多少不同的用户类型?”
→“我们能否建立一个模型来预测哪些产品会卖给哪些用户?”
4.机器学习工程师
**职位描述:**你的工作将是构建、优化机器学习模型,并将其部署到生产中。你通常会将机器学习模型视为 API 或组件,你会将它们插入到全栈应用程序或某种硬件中,但你也可能会被要求自己设计模型。
**需求:**您将使用的技术包括 Python、Javascript、scikit-learn、TensorFlow/PyTorch(和/或企业深度学习框架),以及 SQL 或 MongoDB(通常用于应用数据库)。
你将要处理的问题听起来像:
→“我如何将这个 Keras 模型集成到我们的 Javascript 应用程序中?”
→“如何减少我们推荐系统的预测时间和预测成本?”
5.机器学习研究员
**职位描述:**你的工作将是寻找新的方法来解决数据科学和深度学习中的挑战性问题。您将不会使用开箱即用的解决方案,而是制作自己的解决方案。
**需求:**您将使用的技术包括 Python、TensorFlow/PyTorch(和/或企业深度学习框架)和 SQL。
你将要处理的问题听起来像:
→“我如何将我们模型的精确度提高到更接近最先进的水平?”
→“定制优化器有助于减少培训时间吗?”
我在这里列出的五个职位描述在所有情况下绝对不是孤立的。例如,在早期创业公司,数据科学家可能还必须是数据工程师和/或数据分析师。但是大多数工作会比其他的更好地归入这些类别中的一个——而且公司越大,这些类别就越适用。
总的来说,要记住的是,为了被录用,你通常会更好地建立一个更专注的技能集:如果你想成为数据分析师,不要学习 TensorFlow,如果你想成为机器学习研究员,不要优先学习 Pyspark。
相反,想想你想帮助公司建立什么样的价值,并善于传递这种价值。最重要的是,这是进门的最佳方式。
为什么你的人工智能有偏见&如何解决
我们都应该问的问题
人工智能和机器学习领域的许多创新者面临着一个技术培训的问题。他们用来教授算法的数据仅限于来自网络或合理使用资源,这些资源容易受到偏见或不充分,因为没有包括各种各样的人。
例如,这里有一些快速的谷歌图片搜索,有助于可视化包容性和代表性的差异。以下结果来自搜索“女人”、“男人”、“头发”和“美丽的微笑”
Representation of Women & Men, According to the Internet.
What People With Hair & Beautiful Smiles Look Like, According to the Internet.
当人工智能暴露在网络上已经培养了几十年的文化刻板印象、语义和系统偏见中时,问题就出现了。我们中的许多人已经无意识地习惯于接受这些偏见作为“规范”;《人工智能的编程》将这些偏见公之于众,而将这些偏见的问题本质放入背景中——迫使我们变得更加公平和负责。许多人质疑人工智能是否天生就有偏见,因为它是由人类训练的,而人类本身并不完美。
这些问题
答案在于问两个关键问题:
1)什么数据被用来训练人工智能,它来自哪里,是“全谱”数据吗?
2)是否有意识地从头开始实施人工智能系统,以防止偏见的发生?
为什么我变得有偏见
当做错时,通常会在通过来自互联网的数据进行训练的机器中看到种族主义和厌恶女性的特征,或者从一开始就没有认真努力解决偏见。
下面的例子快速突出了为什么使用互联网作为机器学习中建立数据集的媒介是有问题的&扩散了预先存在的人类偏见。
1)微软和他们的 twitter 聊天机器人 Tay 在大约一天的时间里变成了一个亲希特勒的种族主义者,在 Twitter 上发布了如下声明:
“布什制造了 911 事件,希特勒会比我们现在的猴子做得更好。唐纳德·特朗普是我们唯一的希望。”
Tay’s tweet
Tay 正在从人们在互联网上发布的推文中学习和提取数据。
- 最近的研究表明人工智能在网上的标准文本体上进行训练,结果是它将欧裔美国人的名字与令人愉快的词语如“礼物”或“快乐”联系起来,而将非裔美国人的名字与令人不快的词语联系起来。
3)美。AI 表演了一场由人工智能评判的选美比赛。上传了来自 100 个不同国家的 6000 张自拍。在 44 名获奖者中,少数是亚洲人。除一人外,其余都是白人。答:我并不是故意被教导说白皮肤的人更漂亮,但它确实是这样,不过假设它所输入的数据主要由白人组成。
亚历克斯·扎沃龙科夫,美女。AI 的首席科学官, 在《卫报》上解释了多样化数据集的重要性:
“虽然算法偏向白人有很多原因,但主要问题是该项目用来建立吸引力标准的数据没有包括足够多的少数族裔……如果数据集中没有那么多有色人种,那么你实际上可能会得到有偏见的结果。”他当时说。
答案
以下是如何建立一个没有偏见的人工智能:
1)创建“全谱”数据集,这是一个从零开始构建的数据库,没有固有的偏见,具有包容性和多样性。
2)建立人工智能,注意偏见&全面实施防止偏见发生的系统。
3)人情味对质量控制至关重要,以确定在向人工智能引入新数据时是否存在任何偏见。
例如, Knockri 通过分析求职者的语言和非语言交流来筛选视频求职申请。我们建立了自己的专有数据集,强调包容性和多样性。此外,在量化候选人的能力时,该算法不会将个人的种族、性别、外貌或性偏好作为招聘意愿的衡量标准。
A.我只和它的数据集一样好。当精心构建时,人工智能可以为企业提供可扩展的资源,可以持续帮助人们做出更客观的决策。
为什么你的授权率是后 PSD2 时代的一个衡量标准
如果你有一家电子商务公司,每天要处理成百上千的交易,你应该问自己的问题是:
我的授权率是多少?
授权率是多少?
对于 PSP 和收单机构来说,授权率是最重要的指标之一,因为它通过跟踪所有提交交易中授权交易的数量,提供了对其平台性能的洞察。
在传统的电子商务支付流程中,购物者表示她想要“结帐”她的商品。她向商家提供她的信息,这些信息或者存储在商家的数据库中,来自以前的交易,或者在结账过程中提供。购物者继续选择支付方式并通过支付流程。
E-Commerce Payment Flow
对于提交给处理者的每一笔提交的交易,发行者可以授权或拒绝交易。因此,为了计算授权率,我们使用以下公式:
((授权交易)/(授权交易+拒绝交易))* 100 =授权率
例如,如果我们处理了 800 笔授权交易和 200 笔拒绝交易,授权率将为:
((800)/(800+200))*100 = 80%授权率
我之所以认为电子商务企业应该跟踪他们的授权率,是因为 授权率越低,对你的业务造成的财务伤害就越大 。
例如,如果您的授权率为 80%,这仍然意味着您的交易有 20%被拒绝,这意味着您无法收集和处理订单。当然,许多客户会再次尝试或使用不同的支付方式,但对于那些不这样做的客户来说,这意味着您正在失去收入,因为您的 PSP/收单机构无法处理您的交易或向您提供有关交易无法完成的原因的相关信息。
一个重要的指标
在精益分析中,作者 Alistar Croll 和 Benjamin Yoskovitz 讨论了一个重要的指标(OMTM)。《精益创业》的作者 Eric Reis 谈到了推动增长的三个引擎:粘性引擎、病毒引擎和付费引擎。虽然所有公司都使用每种引擎,但他警告说,一次只关注一种引擎。在分析和数据的世界里,这意味着选择一个你要跟踪的单一指标,来改进你正在经历的阶段。这就是 Croll 和 Yoskovitz 所说的一个重要的度量标准。
在支付领域,有许多指标可以跟踪,如交易、收入或退款。我之所以建议你应该开始跟踪授权率,是因为这是这个过程中你唯一不能完全控制的部分,但对你的底线影响最大。因此,无论你是处于启动(粘性引擎)、增长(病毒引擎)还是维持(付费引擎)阶段,跟踪你的 PSP 的表现对你的支付成功至关重要。
衡量和比较
如果购物者正在浏览您的网站,但没有将商品添加到购物车中,您可以 A/B 测试包括定价、图片和文案在内的变量。如果购物者正在向购物车中添加商品,但没有继续结账,您可以添加弹出窗口或电子邮件提醒来完成他们的购买。如果购物者正在结账,但在过程中中止,你可以增加页面数量或分散注意力,以帮助他们完成交易。但是当你将交易提交给你的 PSP/收单机构时,你就无能为力了,因为授权或拒绝完全取决于 PSP 或收单机构如何处理你的交易。这就是为什么我总是建议商家跟踪他们的 PSP/收购方的表现,并定期与其他 PSP/收购方进行比较。要么通过实施两个不同的 PSPs 收单机构并进行定期 A/B 测试,要么使用行业基准来比较它们的授权率。
A/B Testing Variations
PSD2 将如何影响我的授权率?
随着支付服务指令 (PSD2)的出台,我相信授权率将是受影响最大的一个指标,除非商家采取适当的行动。
作为 PSD2 的一部分,强客户身份验证将适用于欧盟境内的在线支付,特别是当 PSP/收单机构和购物卡发行机构都位于欧盟境内时。
强客户身份认证将要求使用以下至少两个独立要素对在线支付进行身份认证:
- 只有客户知道的东西 (例如:只有客户知道的密码、PIN 或代码)
- 只有客户拥有的东西 (例如:实体卡、手机或硬件令牌生成器)
- 客户身份 (例如:指纹、虹膜扫描或面部识别等生物特征)
随着 Apple Pay 和 Google Pay 的推出,许多银行已经实施并积极使用 3D Secure、master card Secure code 或 Visa Verified 来减少欺诈,购物者可以选择通过移动或桌面进行支付认证,而本地支付方式,如 iDeal 、 SOFORT 和 Bancontact 已经在使用多因素认证。
但是在支付流程中增加更多的步骤,会导致支付流程中更多的摩擦和更高的放弃率,从而导致更多的拒绝交易,从而降低授权率。
如何开始跟踪我的授权率?
大多数 PSP 对你的授权率提供很少的洞察力,尤其是如果他们没有任何方法来控制或影响它。因此,如果您无法下载报告或使用分析套件来跟踪授权率,我建议您采取以下措施:
- 跟踪您的结账会话(每次购物者使用您的网络分析点击结账,例如谷歌分析或 KissMetrics )
- 跟踪你的 WebHook 会话(每次购物者返回你的感谢或支付失败页面)
- 跟踪您的成功付款(根据您的 PSP,每笔授权/成功付款)
由于 PCI 合规性,您无法将 Web 分析添加到支付页面,跟踪结账会话,为您提供客户想要结账的次数的良好指示。
可以跟踪 WebHook 会话,并让您很好地了解成功或失败的会话数量。
要验证已启动的结帐会话数以及成功/失败的会话数,您可以将其与成功付款数进行比较。
根据您的业务模式(直销、订阅)、购物卡的发行方、PSP 和/或收单机构以及其他几个变量,授权率可以在 70%到 95%之间。通过每天跟踪您的授权率,您可以创建一个仪表板,让您更好地了解实际获得授权的交易百分比,并能够真正了解您的 PSP/收单机构的表现。
Authorization Rate Dashboard
感谢阅读;),如果你喜欢它,请点击下面的掌声按钮,这对我意义重大,也有助于其他人了解这个故事。还添加了关注按钮,以接收我的每周博客。
为什么您的公司应该关注大数据
Photo by Gamze Bozkaya on Unsplash
【免责声明:本文旨在提出“大数据”概念背后的基本思想。我想帮助人们熟悉它。这不是一种技术方法,所以我想否认在技术方面可能缺乏准确性。我不是技术人员,也不是数据科学家,而是企业家。其他比我更好的人可以在技术方面提供帮助。我想提供一个不同的,更“普通人”的观点。]
什么是“大数据”
你不讨厌周围人用流行语吗?它可能是“大数据”、“人工智能”或“数字自动化”。你点头,我很确定,对自己说:“新技术听起来很棒,但它们对我有什么帮助?
有恐惧,有怀疑,有许多问题注定没有答案。
你认为有人能告诉你什么对你更好吗?绝不!甚至你的父母,你的母亲,你的爱人都不能这样做!你是唯一能为自己做决定的人。
其实不是这样的。
是的,有人(或某物)可以知道,在某些情况下比你更清楚,什么是最好的决定。
人工智能可以做到这一点。它可以帮助你做决定。
你可以用其他数十亿人产生的数据来支持你所做的事情。
根据一个古老但仍然有效的定义,Gartner 这样定义“大数据”:
大数据是高容量、高速度和/或高多样性的信息资产,需要经济高效、创新的信息处理形式来增强洞察力、决策制定和流程自动化。— 高德纳公司
让我更好地解释它。
大数据是高容量的
充分接触许多不同的经历引起高音量。
此外,我们做的各种互动,例如,在网上购买商品,导致高容量。今天你几乎可以追踪任何事情。
想想你自己在网店给宝宝买婴儿食品和纸尿裤。你的基本客户旅程是什么?
你上电子商务。
您过滤产品并选择您的偏好。
有优惠,所以你看买不同的数量,或者大小,可以省钱。
您登录或注册网站。
您用您的送货地址和信用卡信息完成订单。
通过简单的购买,您已经产生了大量的结构化和非结构化数据。
人口统计数据,例如,年龄、性别、地理区域、收入。心理数据:推动你购买的偏好、价值观和动机。
你购买过有机食品吗?你是一个关心宝宝健康的人,认为有机食品更贵但更好。
你订购可洗尿布了吗?你也关注环境,想要为拯救地球做出贡献。
你的地址靠近高污染区吗?或者,你住在乡下吗?
所有这些数据,应用于不同的人、产品、来源,达到难以置信的高容量。
大数据是高速的
让我们坚持婴儿食品采购的例子。
是你第一次做这种订单,你想为你的宝宝做好。
在你继续之前,你需要更多的信息。传统上,你必须从一个商店搬到另一个商店。你得比较产品。你求推荐。你向你的朋友、你的妈妈、你的岳母寻求意见,关于什么对你更好。与此同时,你们也讨论烟雾、污染和其他话题。
这是一种缓慢的信息收集方式,而且你只能收集到一些观点。
多亏了科技,你可以追踪更多信息,让它们更容易获取。
大数据种类繁多
平行行动追踪任何事物的无限可能性,造成高音量。也造成了高品种。
让我们展望未来,完成我们的婴儿食品购买示例。
当你在一家网上商店购物时,你会比较另一家商店的价格和报价。在另一个浏览器窗口,你可以在育儿博客上寻找建议。在一个社交网络群上,你寻找相似的经历。同时,你会收到你通常订阅的时事通讯。你会读到农业中杀虫剂的风险,空气质量水平,绿色习惯。
这些信息来自不同的来源,社交网络,视频,传感器。
你从一条信息跳到另一条,拓宽了你的可能性。
好,我有大数据,现在呢?
“大数据分析检查大量数据,揭示隐藏的模式、相关性和其他见解.”— SAS
让我们来完成我们的婴儿食品购买体验。
大数据分析系统可以匹配你的订单历史、其他客户行为、你的环保态度、你的地址等等。在此基础上,它可以建议你为你的家买一个空气过滤器。
你喜欢乡村。也许两三年后,你会搬到那里去。在未来,你孩子已经会走路了,你不再需要婴儿食品和尿布了。
系统发现隐藏模式和相关性。它能发现你生活中的变化,以及你过去和现在的偏好。所以,它建议你买一辆自行车。更重要的是,它建议你为你和你的小男孩/女孩准备一辆自行车,现在可以和你一起跑了。
得益于大数据分析,建议成为可能。这是一个突出对您有意义的数据的过程。
大数据和数字自动化的优势
让我用一句有意义的话来介绍使用大数据的好处:
“企业希望获得数字化和自动化带来的好处,但他们并不总是信任驱动这些机器的底层分析。”— Ryan Rozich 在“为什么人工智能和内容比人工和机器更重要
人们和公司对大数据以及人工智能持怀疑态度。
怀疑来源于复杂性。
我们必须提取复杂性,以便您可以更好地运营您的业务。
我们必须将大数据视为帮助我们完成任务的标准工具,就像厨房里的微波炉帮助我们烹饪食物一样。
我们身边到处都有大量使用这些算法的合适例子。让我们看看大数据分析可以改善我们业务的 5 个方面。
大数据分析可以改善我们业务的 5 个方面
更好的决策
大数据分析有助于组织收集过去和新的信息,找出相似的模式。
Photo by Jacek Dylag on Unsplash
这个操作是有帮助的。它让人们对成功的决策和碰壁的决策一目了然。
大数据和人工智能也有助于对比过去和现在。
像往常一样,让我们举个例子。
你喜欢啤酒吗?
想象你生产啤酒。您正在跟踪您的每个卖点的分销和消费情况。
使用大数据分析,你会发现哪些是最好的销售期,哪些是最差的销售期。你可以衡量最好和最差的分销商。你可以根据不同的时间和地点来组织生产和销售。您可以高效地节省时间和金钱。
借助基于经验和市场预测的策略,您可以做出更好的数据驱动型决策。更明智地使用数据,您可以通过更高效的运营推动业务向前发展。
更好的决策=降低成本
不仅如此,你还可以发现新的机会。
发现新的机会
你也可以通过考虑新的额外变量来追踪啤酒消费的差异。
你是否有一个考虑到当地气候的分配计划?或者,当地的人口统计?有一个经销商最服务于家庭或当地超市?一个最服务于酒吧?
根据不同的模式,使用数据驱动的信息创建差异化的分销计划。
决策可以反映客户的需求或价值。例如,为家庭服务的当地超市的淡啤酒。
你有更高的利润和更满意的顾客。
““We like you too 😃” written on a white brick wall” by Adam Jang on Unsplash
你还会发现缺乏对顾客需求的覆盖。客户特性是用来满足他们的。
你甚至可以发现一个尚未覆盖的利基。
听起来这可能是一个新的可爱产品的起点。
他们有价值。你和你的企业获得了价值。
新机会=新收入
节省时间
利用大数据,你可以找到更有效的做事方法。
例如:
- 书籍需要没有错别字,配有索引和参考书目。
- 管理者必须为利益相关者收集财务数据。
重复的过程耗费大量资金。
自动化,一个索引,一个书目,一个财务报告,今天更容易得到。建立良好的大数据分析和训练有素的人工智能系统。
节省时间=降低成本
主动面对市场
利用大数据,您可以优化营销工作。
举几个例子:
- 细分你的 CRM 数据,你可以比你的竞争对手更快地推出新的产品。
- 分析趋势对话,您可以锁定特定的客户群。跨越数据和应用人工智能你可以支持个性化策略。
- 所以,你给了你的销售部门一个竞争优势。
他们更好地以正确的方式和定制的报价接近正确的潜在客户。
这种策略非常适合银行,所以他们会根据市场变化更新报价。
这种策略对于专业卖家来说非常有效,可以从他们的营销和销售漏斗中获取价值。
积极=新收入
以客户为中心
积极主动的市场策略也带来了以客户为中心的个性化策略。
大数据分析和人工智能一起重塑了这个行业。
甚至传统的呼叫中心活动也可以利用这些技术。
如果你能更好地预测客户对报价的反应呢?
数字自动化系统:
- 分析历史数据。
- 将它们与实时趋势交叉。
- 做有意义的段子。
- 就如何进行(或不进行)下一次销售拜访或销售会议提出建议。
销售人员表现更好,这得益于支持他们说服技巧的数据。
了解你的前景,赢得他/她的心。
那么,公司为什么需要大数据呢?
数学家研究员约翰·图基曾经说过:
“一张照片的最大价值在于它能迫使我们注意到我们从未想过会看到的东西。”
数据可视化就是图基提到的那个画面。数据可视化是显示数据内部内容的一种方式。然而,它需要发现哪些数据对业务来说是必不可少的,因此值得展示。
为什么您的模型需要维护
人们通常认为给定的模型可以永远投入使用。其实恰恰相反。你需要像维护机器一样维护你的模型。机器学习模型可以超时下车或者坏掉。这对你来说听起来很奇怪,因为它们没有移动的部分?嗯,你可能想仔细看看概念的变化和漂移。
观念的改变
让我们从一个例子开始。如果您试图为飞机建立一个预测性维护模型,您通常会创建如下列
错误 5 _ 发生 _ 过去 _ 5 _ 分钟
作为模型的输入。但是如果错误号 5 不再是错误号 5 会发生什么呢?软件更新会彻底改变您拥有的数据。它们修复已知问题,但也以不同的方式编码您的数据。如果您将更新后的数据作为更新前模型的输入,它会做一些事情,但不是您所期望的。这种现象叫做观念的转变。
概念漂移
一个非常相似的现象是概念漂移。如果变化不是剧烈的,而是缓慢出现的,就会发生这种情况。一个工业例子是传感器的外壳。随着时间的推移,这种情况会发生,测量的 100 度不再是 100 度。客户分析的一个例子是新技术的采用过程。人们没有马上使用 iPhones,而是慢慢适应了它。在 2007 年,像“HasAnIphone”这样的专栏意味着一个非常精通技术的人。今天,这表明一个普通人。
我能做什么?
An example for window based relearning. The pattern to detect circles moves over time. Only recent data points are included to built a model.
克服概念漂移的一种常见方法是基于窗口的重新学习。假设你的模型是建立在去年的数据之上的。这个窗口随着时间移动,因此你可以捕捉到概念的漂移。虽然这听起来很好,但它会遇到实际问题。一个问题是训练数据的限制。窗口越小,样本量越小。
这种方法通过减少概念漂移的问题帮助很大。但是观念的转变呢?
处理概念变化
需要报告由人类引入的并且可能影响模型的变化,并且需要调整模型。困难的是,负责变更的人需要意识到,模型会受到变更的影响。有 ML 意识的公司文化是成功的关键。最不可能的部分是,你有时不能在“新”硬件上建立一个模型。您只是没有新型号的数据,可能需要等待一段时间才能获得。
Graph resulting from backtesting. Real perforamnce (crosses) is compared to cross validation performances. It is decresing over time and results in a notification
另一个想法是回溯测试。在大多数情况下,你知道之后发生了什么。因此,您可以将您的模型预测与现实进行比较。另一方面,您的验证为您提供了对方法真实性能的评估。你可以用这两个平均值,做每日比较。如果基本概念改变了,您应该会看到性能下降。仪表板和通知方法是将此付诸实施的好方法。
关键要点:机器学习能力至关重要
本文展示了为什么“建模并运行”的常见实践是一种不好的实践。公司需要密切关注保持他们的机器学习能力。除了维护相关人员之外,拥有一个公共平台和良好记录的代码也很关键。
为什么你的组织不应该害怕人工智能
“事实是,今天你们中的每一个人…你们是一家软件公司,你们是一家数字第一的公司,你们正在构建核心的应用程序…而这些核心是数字产品”——微软首席执行官塞特亚·纳德拉——Ignite 2017
浏览一下你的 LinkedIn feed,不需要 90 秒就可以注意到,人工智能是“街上”关于收入电话的所有话题,是你 It 或营销部门大厅里咖啡聊天中希望或绝望的主要话题,甚至已经从反乌托邦式的 block buster Matrix/Terminator 模式扩散到我们的客厅,通过复杂的社会文化惊悚片,挑战我们“认为”我们是人类的动力(拜托,请告诉我你看过《西部世界》(Westworld)?).
现实是,关于人工智能的对话越来越重要,如此重要,以至于麻省理工学院的物理学家、《T2 T3 生命 3.0:成为人工智能时代的人类 T4 T5》的作者马克斯泰格马克(Max Tegmark)声称,这场对话是“我们这个时代最重要的对话”。 Max 有一个非常有趣的观点,对于各地组织的领导者来说,如果你关心员工和技术的互动将如何影响你组织的成功,你应该注意 Max 所说的话,因为正如你将看到的塞特亚·纳德拉的上述引用,每项业务都将成为软件/数据业务(你也可以 参考我的上一篇文章 以了解有关该主题的更多信息)。目前,马克斯的论点停留在人类已经开发出一定数量的硬件(我们的身体)的观点上,为此我们可以“下载”或更新软件来学习:
“我们有巨大的能力将新的“软件”上传到我们的大脑中……如果你决定要成为一名律师,你可以去法学院,法学院会将新的算法上传到你的大脑中,这样你就可以突然拥有律师的专业知识。正是这种设计我们自己的软件的能力,而不是等待进化给我们,使我们能够主宰这个星球,创造现代文明和文化。”
是的是的,我知道这次谈话的方向, 这到底跟跑 P & L 有什么关系,告诉我这跟我有什么关系!?根据 Max 的工作,他谈到了软件能够开发更智能的硬件或“大脑”的能力,这些硬件或“大脑”可以比人类更快地记忆和学习。**“写软件的软件”,**是这些思想片段开始升级为人类如何互动和利用机器驱动的超级智能变得更加有效的地方。
「超级智能」和商业有什么关系?
一切。任何企业的成功都依赖于竞争,根据迈克尔·波特*(回想一下你的战略课程和 5 种力量),这并不意味着击败对手,而是意味着赚取利润。提高利润的最快方法是在现有资产范围内提高生产率和绩效,削减成本,让员工更快地获得更好的见解(更多信息请参见下面的),这也将推动收入和新的增量收入来源。**我们正在迅速接近一个时期,在这个时期,我们的性能将被计算机性能超越,在整个组织中拥抱、构建、教育和部署人工智能的企业将加快他们的旅程,比他们采取“他们还没有为人工智能做好准备”的立场要快得多。*作为微软的一名员工,我当然对我们如何与企业合作并管理企业以帮助他们实现数字化转型的总体愿景抱有偏见,但我们的战略是建立在一个优雅的门户网站上,以促进企业进步和数字化转型。
安:又来了,**“数字化转型”。**我们已经走得够远了,所以让我们一起努力:数字化转型正在利用技术创造创新和颠覆,让员工和客户能够实现更多。微软“数字转型”智能价值体系中的四个“支柱”说明了这个疯狂的人工智能对话与你的业务有什么关系,可能看起来像这样:
- 真正地吸引您的客户利用智能机器人收集实时情报,了解您的客户真正重视什么,以及您如何更好地为他们提供服务,预测他们流失的潜力或提供服务/产品的机会,从而改善他们的生活。
- 你将如何授权你的员工不仅仅是关于*“你在世界的前景或萧条上花了多少钱”*的对话,而是你为员工提供了多少访问关键业务指标的机会,这些指标可以告诉他们他们的 P & L 实时表现如何——仪表盘可以闪现漂亮的图片,但机器学习可以告诉你为什么图表会下降或上升,并可以生成数据可视化,让你现在做出更好的决策。
- 优化运营是一些企业在全球化市场中生存的唯一途径,不管他们的产品有多好。假设你是一家食品制造/分销企业,影响你底线的三个趋势是 1)商品成本增加 2)监管增加 3)竞争对手规模扩大以及大企业间的加速合并。绝对有必要通过推断工厂车间的数据并使您的数据相互关联来削减成本,找出关键应用程序数据流之间的相关性,并了解每个流程如何相互影响。无论是通过深度学习图像识别、连接到机器并在边缘实时计算的智能边缘设备,还是通过机器学习模型查看历史数据并提出建议,这都是全球市场中竞争运营的现状。如果你不相信我,听说过【牡蛎互联网】?
- 最后,是通过人工智能优先/混合现实优先应用来转变产品的机会:“在今天的世界中,我的设计团队可能会制作一面镜子,我们必须以数字方式呈现,然后发送给工程师,让他们可以研究它,然后根据他们的反馈做出改变,”韦策尔说。“这需要时间,我们发现自己在这方面存在很多问题。但将工程和设计放在同一个空间,我们称之为共同创造的过程,可以简化这种互动。”**——**福特的设计技术运营经理说,他的团队采用了微软的 Halolens。
不可预测的人工智能:缓解交通流量,改善公司战略,并可能收紧婚姻
尼古拉斯·克里斯塔基斯,耶鲁大学的社会学家和医生,在他的校园社会学实验室进行了一项关于人类和人工智能互动的研究。这项研究由一个游戏组成,在这个游戏中,人类和机器人(简单的人工智能程序)必须合作做出定时决策。游戏网络显示,人类倾向于做出模式化的决策,智能机器人也是如此,它们平均产生类似的决策得分。除了一组机器人在 10%的时间里做出随机决策之外,这一组机器人最终在决策过程中制造了更多的“噪音”,引发了人类之间不同的反应思维,并导致了更快的决策。这种“愚蠢/猜测”的人工智能允许一个随机的环境,在这个环境中,由于机器人的“教学”性质,人类蓬勃发展,因为它们在允许**“人类自助”中扮演了一个助手角色。**
“没有机器人添加的噪音,人们经常陷入困境”
那么,如果随机运行的计算机可以帮助人类做出更好的决策,高度复杂的人工智能可以帮助人类更好地执行特定任务 ( 如人工智能实体“AlphaGo”帮助人类玩家更好地玩游戏*)*那么**为什么商业领袖将人工智能部署到团队内部人类交互的愿望与我们在世界上最大的企业中看到的实际人工智能足迹之间存在巨大差异?**问得好。
但是,利用愚蠢的人工智能并不意味着仅仅使用智能机器将随机场景引入一个群体环境中,以激发思维创造, “人们可以想象聊天机器人通过引导夫妇走向妥协而不屈服于愤怒或厌倦来调解关系治疗” 克里斯塔克斯博士说。这篇文章还引用了最近的一项研究,研究社交媒体机器人如何“羞辱”贬损性的推文,并降低 twitter 上种族诽谤的使用。
“现在怎么办?”人工智能对话
我想在我们继续之前,这里的一个快速图表会对我们有所帮助。关于如何区分深度学习、机器学习和人工智能,一直存在很多困惑。这是一个很容易模糊的对话,但理解其中的差异是找出什么适合你的业务目标的关键一步。
通常,我们看到人工智能作为一个总括术语被用来涵盖右边概述的情况,但是让我们先做一点手脚,然后再深入。当我想到人工智能时,我会想到“马尔默项目”,这是微软研究&开发的新方法的一部分。它涉及一个人工智能代理和一个人类玩家在一个名为《我的世界》的游戏中合作建造物体。人类玩家教人工智能代理如何使用特定的工具来达到游戏的最佳水平,然后人工智能代理教人类玩家它自己学到的课程。深度学习更多地涉及一个多层神经系统,当它熟悉新数据时,它具有依次辨别和发现的精细能力——想想图像识别和机器需要做的所有事情,以识别手持冲浪板的女人和红色敞篷车之间的差异。
https://www.statista.com/chart/6810/the-future-of-ai/
我看到的今天在企业中使用最多的用例是数字化的开端,是使用机器学习从新的见解中派生和自动化的。他们使用训练有素的模型来发现用例中的模式,以检测设备故障的原因和如何预测未来的故障,以及实时提供维护呼叫、智能采购零件和为技术人员提供潜在故障和需要哪些零件/工具的智能所需的措施,从而大幅降低运营成本和减少停机时间。一个好的机器学习工作流程通常是这样的:
- 数据采集:寻找相关数据,开始评估你关心的变量,当然,还要确保这些数据是干净的,可供消费
- 分析:人工定位和理解模式,数据科学的基础
- 重塑:加入函数和数理统计,以确保正确的分类,并遵循连续迭代的流程
- 建模:使用引擎创建一个模型,这不是一次性事件,该过程在特定的时间盒内反复重复
- 提炼:做上面的步骤来增加准确的概率,模型越准确,预测就越好,越可信
- 部署:由应用程序提供,随时可供员工或客户使用
随着我们从移动优先云优先技术生态系统转变为智能云智能边缘生态系统,企业现在将能够发现新的数据环境,识别模式,并在用户授权的最尖端进行计算和发布:通过多传感器和多设备,在“边缘”。
https://www.gartner.com/technology/research/methodologies/hype-cycle.jsp
正如我们从上面 Gartner 的炒作周期中可以看到的,我们可以尝试走在像 AI 这样的新技术现在是否值得投资的前面,或者我们是否已经迟到了。根据图表,我们正处于 AI/ML/Cognition 取得一些巨大成功的时期,但也有许多失败。随着我们通过“幻灭的低谷”接近下一个 5 年,确保组织与人工智能提供商保持一致将是极其重要的,这些提供商将继续与您、企业一起发展他们的思维方式、技能和工具集。这不仅仅意味着说“我们已经完成了机器学习项目”,而是学习有多少项目成功了,哪些项目失败了,以及从那些失败中学到了什么。
所以让我们开始吧!…
在微软的“数字转型学院”(一个为微软销售组织提供的学习体验)期间,我看到了由 凯捷 *(一个专门帮助企业围绕见解和数据制定战略的合作伙伴)*所做的令人信服的演示,内容是人工智能项目必须成功的关键要素,以及商业领袖在驾驭可能性艺术时应该关注的问题:
…对这些项目的数据有很好的理解,数据&人工智能只是达到目的的手段,而不是解决方案本身,所有人工智能项目都需要一种愿意改变的文化,并且必须以信任为中心,因为这是与人工智能互动的基石。
请随时发表评论进行更多讨论,也可以在 LinkedIn 上关注我。
具有交互代码的宽剩余网络
Gif from this website
我的期末考试终于结束了,我想通过实现 wide res net 来庆祝一下。此外,这将是一个很短的帖子,因为我想回到写博客的心情,希望我不会让你失望!
广残网
Image from this website
红框 →卷积神经网络中增加的特征图数量
该论文的作者称之为宽残差网络的主要原因是由于每一层的特征地图大小的增加。如上所述,当我指的是特征图大小时,我指的是在每个卷积层上创建的通道数,但是,请记住,该特征图大小也可以减小。
网络架构(层/全/面向对象)
红框 →我们要实现的网络层。
每一层与传统的残差网络几乎相同,然而如上所述,特征图的数量已经增加。现在,让我们来看看我们将要使用的完整网络体系结构。另外,请注意,上图中没有显示批处理规范化和 ReLu()激活。
以上是我们将要实施的完整网络架构,我们可以观察到两个变量,即 N 和 k。这里 k 是我们希望每层的特征图增加多少,N 是每层中卷积块的数量。因此,对于我们的网络,我将 N 设置为 1,K 设置为 8,因此我们的网络只有 8 层,但每层都有许多特征地图。现在让我们看看网络的 OOP 形式。
如上所述,网络本身并不深,但是我们可以观察到每一层都有大量的要素地图。
优化
正如上文所见,原始论文使用了具有内斯特罗夫动量的 SGD,对我来说,我将使用 ADAM,当然这将使模型过度拟合训练数据,有关此主题的更多信息请单击此处。
结果
左上 →训练精度随时间变化
右上 →训练成本随时间变化
左下 →测试精度随时间变化
右下 →测试成本随时间变化
考虑到 CIFAR 10 数据集由 50000 幅训练图像和 10000 幅测试图像组成,我们的 8 层宽 Resnet 仅在训练图像上表现良好。然而,我们可以清楚地观察到,该模型已经过度拟合于训练数据。(测试图像的最佳准确度只有 17%。)
互动代码/透明度
对于 Google Colab,你需要一个 Google 帐户来查看代码,而且你不能在 Google Colab 中运行只读脚本,所以在你的操场上复制一份。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要获取这篇文章的代码,请点击这里。
为了让这个实验更加透明,我已经将我的命令窗口的所有输出上传到我的 Github,要从我的 cmd 访问输出,请点击这里。
最后的话
看到结果令人失望,但我很有信心用正确的正则化技术,这个网络会表现得更好。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- Zagoruyko 和 n . Komodakis(2016 年)。广泛的剩余网络。arXiv 预印本 arXiv:1605.07146 。
- 神经网络 PyTorch 教程 0.4.0 文档。(2018).Pytorch.org。检索于 2018 年 4 月 27 日,来自http://py torch . org/tutorials/beginner/blitz/neural _ networks _ tutorial . html
- SGD >亚当??哪一个是最好的优化程序:狗对猫玩具实验。(2017).萨卢。检索于 2018 年 4 月 27 日,来自https://Shao anlu . WordPress . com/2017/05/29/SGD-all-the-one-is-the-best-optimizer-dogs-vs-cats-toy-experiment/
- CIFAR-10 和 CIFAR-100 数据集。(2018).Cs.toronto.edu。检索于 2018 年 4 月 27 日,来自https://www.cs.toronto.edu/~kriz/cifar.html
维基百科数据科学:与世界上最大的百科全书合作
如何以编程方式下载和解析维基百科
(Source)
维基百科是现代人类最令人印象深刻的创造之一。谁会想到在短短几年内,匿名的免费贡献者可以创造出世界上前所未有的最大的在线知识来源?维基百科不仅是获取写大学论文信息的最佳地方,而且它还是一个极其丰富的数据来源,可以推动从自然语言处理到监督机器学习的众多数据科学项目。
维基百科的规模使得它既是世界上最大的百科全书,也有点让人望而生畏。然而,使用合适的工具,大小不是问题*,在本文中,我们将介绍如何以编程方式下载并解析所有英语维基百科。*
在此过程中,我们将讨论数据科学中的许多有用主题:
- 从网络上查找并以编程方式下载数据
- 使用 Python 库解析 web 数据(HTML、XML、MediaWiki)
- 使用多处理/多线程并行运行操作
- 寻找问题最优解的标杆方法
这个项目最初的动力是收集维基百科上每一本书的信息,但我很快意识到所涉及的解决方案有更广泛的适用性。这里介绍的技术和随附的 Jupyter 笔记本将让您有效地处理维基百科上的任何文章,并且可以扩展到其他 web 数据源。
如果您想了解更多关于如何利用本文中的数据,我写了一篇文章,使用神经网络嵌入构建了一个图书推荐系统。
包含本文 Python 代码的笔记本是 GitHub 上的。这个项目的灵感来自 Douwe Osinga 的优秀的深度学习食谱,大部分代码都改编自这本书。这本书非常值得,你可以在 GitHub 上免费获得 Jupyter 笔记本。
以编程方式查找和下载数据
任何数据科学项目的第一步都是访问您的数据!虽然我们可以向维基百科页面发出个人请求,并抓取结果,但我们很快就会遇到速率限制,不必要地增加维基百科服务器的负担。相反,我们可以通过维基媒体在 dumps.wikimedia.org 的访问所有维基百科的转储。(转储是指数据库的定期快照)。
英文版在dumps.wikimedia.org/enwiki。我们使用下面的代码查看数据库的可用版本。
import requests# Library for parsing HTML
from bs4 import BeautifulSoupbase_url = '[https://dumps.wikimedia.org/enwiki/'](https://dumps.wikimedia.org/enwiki/')
index = requests.get(base_url).text
soup_index = BeautifulSoup(index, 'html.parser')# Find the links on the page
dumps = [a['href'] for a in soup_index.find_all('a') if
a.has_attr('href')]
dumps**['../',
'20180620/',
'20180701/',
'20180720/',
'20180801/',
'20180820/',
'20180901/',
'20180920/',
'latest/']**
这段代码利用了BeautifulSoup
库来解析 HTML。鉴于 HTML 是网页的标准标记语言,它是处理网络数据的无价库。
对于这个项目,我们将在 2018 年 9 月 1 日进行转储(一些转储不完整,因此请确保选择一个包含您需要的数据的转储)。为了在转储中找到所有可用的文件,我们使用以下代码:
dump_url = base_url + '20180901/'# Retrieve the html
dump_html = requests.get(dump_url).text# Convert to a soup
soup_dump = BeautifulSoup(dump_html, 'html.parser')# Find list elements with the class file
soup_dump.find_all('li', {'class': 'file'})[:3]**[<li class="file"><a href="/enwiki/20180901/enwiki-20180901-pages-articles-multistream.xml.bz2">enwiki-20180901-pages-articles-multistream.xml.bz2</a> 15.2 GB</li>,
<li class="file"><a href="/enwiki/20180901/enwiki-20180901-pages-articles-multistream-index.txt.bz2">enwiki-20180901-pages-articles-multistream-index.txt.bz2</a> 195.6 MB</li>,
<li class="file"><a href="/enwiki/20180901/enwiki-20180901-pages-meta-history1.xml-p10p2101.7z">enwiki-20180901-pages-meta-history1.xml-p10p2101.7z</a> 320.6 MB</li>]**
同样,我们使用BeautifulSoup
解析网页来查找文件。我们可以去https://dumps.wikimedia.org/enwiki/20180901/手动寻找要下载的文件,但那样效率会很低。考虑到网络上有多少数据,知道如何解析 HTML 并在程序中与网站交互是一项非常有用的技能。学习一点网络搜集,大量新的数据来源变得容易获得。(这里有一个教程让你入门)。
决定下载什么
上面的代码在转储中查找所有文件。这包括几个下载选项:只有文章的当前版本,文章和当前讨论,或者文章和所有过去的编辑和讨论。如果我们选择后者,我们会看到几兆兆字节的数据!对于这个项目,我们将只关注文章的最新版本。本页有助于根据您的需求确定要获取哪些文件。
所有文章的当前版本都作为一个文件提供。然而,如果我们得到的是单个文件,那么当我们解析它时,我们将不得不按顺序浏览所有的文章——一次一篇——这是一种非常低效的方法。更好的选择是下载分区文件,每个文件包含文章的一个子集。然后,正如我们将看到的,我们可以通过并行化一次解析多个文件,从而大大加快这个过程。
当我处理文件时,我宁愿有许多小文件,而不是一个大文件,因为这样我可以对文件进行并行操作。
分区文件以 bz2 压缩 XML(扩展标记语言)的形式提供。每个分区的大小约为 300–400 MB,总压缩大小为 15.4 GB。我们不需要解压缩文件,但如果您选择这样做,整个大小约为 58 GB。对于人类的所有知识来说,这似乎并不算太大!(好吧,不是全部知识,但还是)。
Compressed Size of Wikipedia (Source).
下载文件
要真正下载文件,Keras 实用程序get_file
非常有用。这将在链接处下载一个文件,并将其保存到磁盘。
from keras.utils import get_filesaved_file_path = get_file(file, url)
文件保存在~/.keras/datasets/
中,这是 Keras 的默认保存位置。一次下载一个文件需要 2 个多小时。(您可以尝试并行下载,但是当我尝试同时发出多个请求时,我遇到了速率限制。)
解析数据
看起来我们想做的第一件事就是解压文件。然而,事实证明我们实际上并不需要这样做来访问文章中的所有数据!相反,我们可以通过一次解压缩和处理一行来迭代地处理文件。如果我们处理不适合内存的大型数据集,遍历文件通常是唯一的选择。
要遍历一个bz2
压缩文件,我们可以使用bz2
库。不过在测试中,我发现一个更快的选择是用subprocess
Python 模块调用系统实用程序 bzcat
。这说明了一个关键点:通常,一个问题有多种解决方案,找到最有效的解决方案的唯一方法是对选项进行基准测试。这可以像使用%%timeit
Jupyter 细胞魔法计时方法一样简单。
有关完整的细节,请参阅笔记本,但是迭代解压缩文件的基本格式是:
data_path = '~/.keras/datasets/enwiki-20180901-pages-articles15.xml-p7744803p9244803.bz2# Iterate through compressed file one line at a time
for line in subprocess.Popen(['bzcat'],
stdin = open(data_path),
stdout = subprocess.PIPE).stdout:
# process line
如果我们简单地读入 XML 数据并将其附加到一个列表中,我们会得到如下所示的结果:
Raw XML from Wikipedia Article.
这显示了来自一篇维基百科文章的 XML。我们下载的文件包含数百万行这样的内容,每个文件中有数千篇文章。如果我们真的想让事情变得困难,我们可以使用正则表达式和字符串匹配来查找每篇文章。考虑到这是非常低效的,我们将采用一种更好的方法,使用定制的工具来解析 XML 和维基百科风格的文章。
解析方法
我们需要在两个层次上解析文件:
- 从 XML 中提取文章标题和文本
- 从文章正文中提取相关信息
幸运的是,在 Python 中这两种操作都有很好的选择。
解析 XML
为了解决定位文章的第一个问题,我们将使用 SAX 解析器,它是“XML 的简单 API”BeautifulSoup
也可用于解析 XML,但这需要将整个文件加载到内存中,并构建文档对象模型(DOM)。另一方面,SAX 一次处理一行 XML,这非常适合我们的方法。
我们需要执行的基本思想是搜索 XML 并提取特定标签之间的信息(如果您需要 XML 的介绍,我建议从这里的开始)。例如,给定下面的 XML:
<title>Carroll F. Knicely</title>
<text xml:space="preserve">\'\'\'Carroll F. Knicely\'\'\' (born c. 1929 in [[Staunton, Virginia]] - died November 2, 2006 in [[Glasgow, Kentucky]]) was [[Editing|editor]] and [[Publishing|publisher]] of the \'\'[[Glasgow Daily Times]]\'\' for nearly 20 years (and later, its owner) and served under three [[Governor of Kentucky|Kentucky Governors]] as commissioner and later Commerce Secretary.\n'
</text>
我们想要选择标签<title>
和<text>
之间的内容。(标题简单来说就是维基百科页面标题,正文就是文章内容)。SAX 将让我们使用一个parser
和一个ContentHandler
来完成这项工作,T3 控制传递给解析器的信息是如何处理的。我们一次一行地将 XML 传递给解析器,内容处理程序让我们提取相关信息。
如果不亲自尝试,这有点难以理解,但其思想是内容处理程序寻找某些开始标记,当它找到一个时,它将字符添加到缓冲区,直到遇到相同的结束标记。然后,它将缓冲区内容保存到一个字典中,并将标签作为键。结果是我们得到一个字典,其中键是标签,值是标签之间的内容。然后我们可以将这个字典发送给另一个函数来解析字典中的值。
我们需要编写的 SAX 的唯一部分是内容处理程序。这一点完整地显示在下面:
Content Handler for SAX parser
在这段代码中,我们寻找标签title
和text
。每当解析器遇到其中的一个,它都会将字符保存到buffer
中,直到遇到相同的结束标记(由</tag>
标识)。此时,它会将缓冲区内容保存到一个字典— self._values
。文章由<page>
标签分隔,因此如果内容处理程序遇到结束</page>
标签,那么它应该将self._values
添加到文章列表中,self._pages
。如果这有点令人困惑,那么也许看到它的运行会有所帮助。
下面的代码展示了我们如何使用它来搜索 XML 文件以找到文章。现在我们只是将它们保存到handler._pages
属性,但是稍后我们会将文章发送到另一个函数进行解析。
# Object for handling xml
handler = WikiXmlHandler()# Parsing object
parser = xml.sax.make_parser()
parser.setContentHandler(handler)# Iteratively process file
for line in subprocess.Popen(['bzcat'],
stdin = open(data_path),
stdout = subprocess.PIPE).stdout:
parser.feed(line)
# Stop when 3 articles have been found
if len(handler._pages) > 2:
break
如果我们检查handler._pages
,我们会看到一个列表,其中的每个元素都是一个元组,包含一篇文章的标题和文本:
handler._pages[0]**[('Carroll Knicely',
"'''Carroll F. Knicely''' (born c. 1929 in [[Staunton, Virginia]] - died November 2, 2006 in [[Glasgow, Kentucky]]) was [[Editing|editor]] and [[Publishing|publisher]] ...)]**
至此,我们已经编写了可以成功识别 XML 中的文章的代码。这使我们完成了解析文件的一半过程,下一步是处理文章本身以找到特定的页面和信息。再一次,我们将转向为该任务而构建的工具。
解析维基百科文章
维基百科运行在一个名为 MediaWiki 的软件上。这意味着文章遵循标准格式,使得以编程方式访问其中的信息变得简单。虽然一篇文章的文本可能看起来只是一个字符串,但由于格式的原因,它编码了更多的信息。为了有效地获取这些信息,我们引入了强大的mwparserfromhell
,一个为 MediaWiki 内容而构建的库。
如果我们将一篇维基百科文章的文本传递给mwparserfromhell
,我们会得到一个Wikicode
对象,它带有许多对数据进行排序的方法。例如,下面的代码从一篇文章(关于 KENZ FM )创建一个 wikicode 对象,并在文章中检索wikilinks()
。这些都是指向其他维基百科文章的链接:
import mwparserfromhell# Create the wiki article
wiki = mwparserfromhell.parse(handler._pages[6][1])# Find the wikilinks
wikilinks = [x.title for x in wiki.filter_wikilinks()]
wikilinks[:5]**['Provo, Utah', 'Wasatch Front', 'Megahertz', 'Contemporary hit radio', 'watt']**
有许多有用的方法可以应用到wikicode
中,比如查找评论或者搜索特定的关键词。如果您想获得一个干净的文章文本,请拨打:
wiki.strip_code().strip()**'KENZ (94.9 FM, " Power 94.9 " ) is a top 40/CHR radio station broadcasting to Salt Lake City, Utah '**
既然我的最终目标是找到所有关于书籍的文章,那么问题就来了,是否有办法使用这个解析器来识别某个类别的文章?幸运的是,答案是肯定的,使用 MediaWiki 模板。
文章模板
模板是记录信息的标准方式。维基百科上有许多模板,但与我们的目的最相关的是Infoboxes
。这些是为文章的摘要信息编码的模板。例如,《战争与和平》的信息框是:
维基百科上的每一类文章,如电影、书籍或电台,都有自己的信息框。以书籍为例,infobox 模板被方便地命名为Infobox book
。同样有用的是,wiki
对象有一个名为filter_templates()
的方法,允许我们从文章中提取特定的模板。因此,如果我们想知道一篇文章是否是关于一本书的,我们可以为图书信息框过滤它。如下所示:
# Filter article for book template
wiki.filter_templates('Infobox book')
如果有匹配的,那我们就找到了一本书!要找到您感兴趣的文章类别的信息框模板,请参考信息框列表。
我们如何将解析文章的mwparserfromhell
与我们编写的 SAX 解析器结合起来?我们修改了内容处理程序中的endElement
方法,将包含文章标题和文本的值字典发送给一个函数,该函数搜索指定模板的文章文本。如果该函数找到我们想要的文章,它从文章中提取信息,然后返回给handler
。首先,我将展示更新后的endElement
:
def endElement(self, name):
"""Closing tag of element"""
if name == self._current_tag:
self._values[name] = ' '.join(self._buffer) if name == 'page':
self._article_count += 1
# Send the page to the process article function
book = process_article(**self._values,
template = 'Infobox book')
# If article is a book append to the list of books
if book:
self._books.append(book)
现在,一旦解析器到达文章的末尾,我们就将文章发送给函数process_article
,如下所示:
Process Article Function
虽然我在找书,但是这个功能可以用来在维基百科上搜索任何类别的文章。只需将template
替换为该类别的模板(例如Infobox language
来查找语言),它将只返回该类别中文章的信息。
我们可以在一个文件上测试这个函数和新的ContentHandler
。
**Searched through 427481 articles.
Found 1426 books in 1055 seconds.**
让我们来看看一本书的输出:
books[10]**['War and Peace',
{'name': 'War and Peace',
'author': 'Leo Tolstoy',
'language': 'Russian, with some French',
'country': 'Russia',
'genre': 'Novel (Historical novel)',
'publisher': 'The Russian Messenger (serial)',
'title_orig': 'Война и миръ',
'orig_lang_code': 'ru',
'translator': 'The first translation of War and Peace into English was by American Nathan Haskell Dole, in 1899',
'image': 'Tolstoy - War and Peace - first edition, 1869.jpg',
'caption': 'Front page of War and Peace, first edition, 1869 (Russian)',
'release_date': 'Serialised 1865–1867; book 1869',
'media_type': 'Print',
'pages': '1,225 (first published edition)'},
['Leo Tolstoy',
'Novel',
'Historical novel',
'The Russian Messenger',
'Serial (publishing)',
'Category:1869 Russian novels',
'Category:Epic novels',
'Category:Novels set in 19th-century Russia',
'Category:Russian novels adapted into films',
'Category:Russian philosophical novels'],
['https://books.google.com/?id=c4HEAN-ti1MC',
'https://www.britannica.com/art/English-literature',
'https://books.google.com/books?id=xf7umXHGDPcC',
'https://books.google.com/?id=E5fotqsglPEC',
'https://books.google.com/?id=9sHebfZIXFAC'],
'2018-08-29T02:37:35Z']**
对于维基百科上的每一本书,我们都有来自作为字典的Infobox
的信息、内部wikilinks
、外部链接和最近编辑的时间戳。(我正专注于这些信息,为我的下一个项目建立一个图书推荐系统)。您可以修改process_article
函数和WikiXmlHandler
类来查找您需要的任何信息和文章!
如果你只看处理一个文件的时间,1055 秒,乘以 55,你得到超过 15 小时的所有文件的处理时间!当然,我们可以通宵运行,但如果没有必要,我不想浪费额外的时间。这就引出了我们将在本项目中涉及的最后一项技术:使用多处理和多线程的并行化。
并行运行操作
我们希望一次处理几个文件,而不是一次解析一个文件(这就是我们下载分区的原因)。我们可以通过多线程或多处理使用并行化来实现这一点。
多线程和多重处理
多线程和多处理是在一台或多台计算机上同时执行许多任务的方法。我们在磁盘上有许多文件,每个文件都需要以同样的方式进行解析。一种简单的方法是一次解析一个文件,但这并没有充分利用我们的资源。相反,我们使用多线程或多重处理来同时解析许多文件,大大加快了整个过程。
一般来说,对于输入/输出受限的任务,例如读入文件或发出请求,多线程工作得更好(更快)。多重处理对 cpu 受限的任务更有效(更快)(来源)。对于解析文章的过程,我不确定哪种方法是最佳的,所以我再次用不同的参数对它们进行了基准测试。
学习如何设置测试和寻找不同的方法来解决问题,将使你在数据科学或任何技术职业生涯中走得更远。
(测试多线程和多处理的代码出现在笔记本的最后)。当我运行测试时,我发现多处理快了近 10 倍,这表明这个过程可能是 CPU 受限的(有限的)。
Processing results (left) vs threading results (right).
学习多线程/多处理对于提高数据科学工作流的效率至关重要。我推荐这篇文章来开始了解这些概念。(我们将坚持使用内置的multiprocessing
库,但是您也可以使用 Dask 进行并行化,就像在这个项目中一样)。
在运行了大量测试后,我发现处理文件最快的方法是使用 16 个进程,每个进程对应我电脑的一个内核。这意味着我们可以一次处理 16 个文件,而不是 1 个!我鼓励任何人测试多处理/多线程的一些选项,并让我知道结果!我仍然不确定我用最好的方式做了事情,我总是愿意学习。
设置并行代码
要并行运行一个操作,我们需要一个service
和一组tasks
。服务只是一个函数,任务在一个 iterable 中——比如一个列表——每个任务我们都发送给函数。为了解析 XML 文件,每个任务都是一个文件,函数将接收文件,找到所有的书籍,并将它们保存到磁盘。该函数的伪代码如下:
def find_books(data_path, save = True):
"""Find and save all the book articles from a compressed
wikipedia XML file. """ # Parse file for books if save:
# Save all books to a file based on the data path name
运行该函数的最终结果是从发送到该函数的文件中保存一个图书列表。这些文件被保存为json
,这是一种机器可读的格式,用于编写嵌套信息,如列表和字典列表。我们要发送给这个函数的任务都是压缩文件。
# List of compressed files to process
partitions = [keras_home + file for file in os.listdir(keras_home) if 'xml-p' in file]
len(partitions), partitions[-1]**(55, '/home/ubuntu/.keras/datasets/enwiki-20180901-pages-articles17.xml-p11539268p13039268.bz2')**
对于每个文件,我们希望将其发送到find_books
进行解析。
搜索整个维基百科
搜索维基百科上每篇文章的最终代码如下:
from multiprocessing import Pool# Create a pool of workers to execute processes
pool = Pool(processes = 16)# Map (service, tasks), applies function to each partition
results = pool.map(find_books, partitions)pool.close()
pool.join()
我们将每个任务map
给服务,找到书籍的函数(映射是指将函数应用到 iterable 中的每一项)。16 个进程并行运行,我们可以在 3 小时内搜索所有维基百科!运行代码后,每个文件中的书籍都保存在磁盘上单独的 json 文件中。
用多线程读取和连接文件
为了练习编写并行代码,我们将使用多个进程读取单独的文件,这次使用线程。multiprocessing.dummy
库提供了线程模块的包装器。这次服务是read_data
,任务是保存在磁盘上的文件:
多线程代码的工作方式完全相同,mapping
任务在一个 iterable 中运行。一旦我们有了列表的列表,我们就把它展平成一个列表。
print(f'Found {len(book_list)} books.')**Found 37861 books.**
根据我们的统计,维基百科有近 38,000 篇关于书籍的文章。包含所有图书信息的最终json
文件的大小只有大约 55 MB,这意味着我们搜索了超过 50 GB(未压缩)的总文件,找到了 55 MB 的图书!鉴于我们只保留了图书信息的有限子集,这是有意义的。
我们现在有维基百科上每一本书的信息。您可以使用相同的代码来查找您选择的任何类别的文章,或者修改函数来搜索不同的信息。使用一些相当简单的 Python 代码,我们能够搜索数量惊人的信息。
Size of Wikipedia if printed in volumes (Source).
结论
在本文中,我们看到了如何下载和解析维基百科的整个英文版本。拥有大量的数据是没有用的,除非我们能够理解它,因此我们开发了一套方法来有效地处理我们项目所需信息的所有文章。
在整个项目中,我们涵盖了许多重要的主题:
- 以编程方式查找和下载数据
- 以高效的方式解析数据
- 并行运行操作以充分利用我们的硬件
- 设置和运行基准测试以找到有效的解决方案
在这个项目中开发的技能非常适合维基百科数据,但也广泛适用于来自网络的任何信息。我鼓励你将这些方法应用到自己的项目中,或者尝试分析不同类别的文章。有足够的信息供每个人做自己的项目!(我正在利用神经网络中的实体嵌入,用维基百科的文章制作一个图书推荐系统。)
维基百科是一个令人难以置信的人类策划的信息来源,我们现在知道如何通过编程访问和处理它来使用这一巨大的成就。我期待着写更多的维基百科数据科学。与此同时,这里介绍的技术具有广泛的适用性,所以走出去,找到一个问题来解决!
一如既往,我欢迎反馈和建设性的批评。可以通过推特 @koehrsen_will 或者我的个人网站 willk.online 找到我。
野火破坏——森林火灾的随机森林分类
我们能预测野火会变得多大吗?
Image by Mike McMillan on baynature
信不信由你,美国每年大约有 80,000 起野火。其中大多数都很小,很少被注意到,只影响到几英亩无人居住的乡村,但有些会变成咆哮的、无法控制的森林大火,摧毁它所经之处的一切。2017 年 10 月至 12 月,仅在北加州(www.insurance.ca.gov)与野火相关的保险索赔就达到近 120 亿美元。不出所料,野火也非常危险,据报道,在 1920 年至 2015 年间,野火夺去了 1114 条生命(【www.nifc.gov】)。我们所能了解的任何关于引起野火的原因、推动其规模和蔓延的因素以及以任何方式对其行为有所贡献的因素的信息,都可能有利于灭火和预防工作,因此对于这个项目,我建立了一个模型来预测野火的规模,该模型使用了 1992 年至 2015 年约 188 万起火灾的信息,这些信息可在美国林务局档案馆找到,并整合了来自伯克利地球、劳伦斯伯克利国家实验室的历史气温数据(下面提供了链接)。
特性、探索性数据分析和基线
Photo by Skitterphotoon on pixabay
美国使用一个分类系统,根据燃烧的总面积对野火进行分类,A 类燃烧不到 1/4 英亩,G 类燃烧超过 5000 英亩。我收集了用于分析的要素,例如发现野火的州、火灾发生地的所有者(联邦、州、部落、私人等)。),火灾的最初起因(闪电、烟火、营火等。)、经度、纬度、气温;然后,我从已经获得的信息中设计了一些额外的特征,例如每个州的火灾总数和年平均气温。通过 SQL 将这些信息加载到 Python3 中,我隔离了 20%的总体数据(约 367,000 起火灾)作为子样本,以减少计算量,确保它是随机分层的,以便每个目标火灾规模类别在我的子样本中按比例表示,就像它们在我的完整数据集中一样。接下来,我将基于距离的逻辑回归和基于树的随机森林分类器(RFC)用于我的子样本,使用 5 重交叉验证技术,80%训练,20%验证基线分离,结果令人失望。
Image by Author
你可以在上面看到,逻辑回归对类别“C”到“G”产生了 0.00 的召回率,基本上说它没有成功地将任何火灾分类到这些组中,这是不好的。右边的随机森林分类器也好不到哪里去。
Video by Author
为了理解为什么我的模型对较大火灾的预测如此之差,我回到了完整的数据集,并探索了火灾类别的分布,结果表明,火灾小于 10 英亩的两个大小类别“A”和“B”构成了我的数据点的绝大部分;此外,与大多数其他类别相比,“G”类火灾的数量极低。这种火灾数量的不平衡在我的两个模型中都引起了非常明显的偏差。另一个非常重要的不平衡是,我没有量化每个类别中有多少起火灾,而是看了每个类别累计燃烧了多少英亩。通过这种方式,数据显示“G”类火灾虽然只占全国所有野火的 0.2%,但实际上已经燃烧了所有野火面积的 75%。上面是一个我用来说明这种关系的 D3 动画视频,第一个图形显示了火灾数量的不平衡,然后图形过渡到显示总燃烧面积的不平衡。红色部分代表全国最具破坏性、最危险和最罕见的火灾,因此,它预测这些“G”类火灾是我的模型的重点。
调整模型
因此,我回到了我的基线模型,并实施了权重分类来补偿数据点中的不平衡,这指示模型在训练时更加重视属于较罕见火大小的数据点的特征。在用新参数重新拟合和重新测试这两个模型之后,随机森林分类器再次优于逻辑回归以及其他基于距离的模型,所以我继续使用 RFC。这里需要注意的一个方面是,由于 RFC 是一个基于树的模型,并且不依赖于点之间的距离,所以我能够包括一些我最初收集的特征,但是直到现在还没有包括,因为数据不完整,使它们与逻辑回归不兼容。因为我想要两种模型类型的真实比较,所以我需要使用相同的数据作为基线。既然我已经决定了 RFC,并且基于树的方法不仅对于处理空值是健壮的,而且实际上可以收集包含在数据丢失的事实中的信息,我可以重新集成被排除的数据。除了添加包含空值的特征之外,我还能够使用 RFC 模型中的特征重要性分数来消除一些很少使用并且没有区分火灾规模等级的信号的特征。
在调优我的 RFC 时,最终对最高优先级目标类的召回产生显著影响的超参数是:模型在决定在哪里对数据进行分割时考虑的特征的数量,我在我的树模型集合“森林”的每棵树内允许的最大分割数量,在数据中创建内部分割所需的最小样本数量,以及在每棵树上创建终止叶节点所需的最小样本数量。一旦我在 20%分层子样本上拨入我的模型,我就用 Amazon Web Services 初始化一个实例,该实例具有足够的 RAM 和处理能力来在我的 188 万行上运行这些集成模型,使用另外 80%-20%的分割进行训练和测试,并重新调整我的模型,再次使用 5-CV K-Fold 方法来防止来自随机数据模式的误导性错误度量,最后在最终调整之前,我根据测试数据评估我的模型。
最终评估
Image by Author
最终的“G”级召回分数为 0.62,这个模型已经从它开始的地方走了很长的路。“G”精度测量有多少来自其他类别的火灾被错误地标记为“G ”,而召回测量有多少“G”火灾被正确地放置在“G”中。不幸的是,精确度非常差,但这只是我不得不做出的决定,也是我不得不接受的权衡。对于这个模型,我决定,我宁愿有一些小火,也许会得到额外的关注,被遏制,并最终成为假警报,以尽量减少潜在的巨大,破坏性火灾的数量。
这个模型能教给我们什么
除了我的随机森林分类器模型的基本预测能力(通过回忆最危险大小类别进行评估)之外,还有最后一个要点需要提出,即当查看我的最终模型的特征重要性分数时,我的模型使用最多的三个特征,以及在学习如何区分火灾大小类别时提供最多收益的三个特征是:经度、纬度和气温。这很重要,因为经度和纬度都可以代表真实的环境条件,如气温、湿度、降雨量、风力和海拔,我的模型确定,在预测野火的最终燃烧规模时,这些因素比初始原因和财产所有者等特征更有影响。从这个项目一开始,我就想在我的分析中加入更多的环境因素,但是时间限制了我在数据采集和数据争论上投入的精力。有了这些结果,如果我要继续改进这个模型,我肯定会将额外的环境特征集成到我的随机森林分类器中,希望增加它的预测能力。
一个真正准确、维护良好的模型可以实时识别在什么条件下野火最有可能蔓延到危险和破坏性的规模,从而帮助灭火专业人员有效地分配资源,并将他们的努力引向最具潜在破坏性的火灾,防止财产损失和拯救生命。
资源
野火数据:
Short,Karen C. 2017。美国 1992–2015 年的空间野火发生数据[FPA_FOD_20170508]。第四版。柯林斯堡,CO:林务局研究数据档案。https://doi.org/10.2737/RDS-2013-0009.4T5https://www.kaggle.com/rtatman/188-million-us-wildfires
气温数据:
http://berkeleyearth.org/data/
https://www . ka ggle . com/berkeleyearth/climate-change-earth-surface-Temperature-Data