从头开始编写任何机器学习算法的 6 个步骤:感知器案例研究
从零开始编写一个 机器学习算法 是一次极其有益的学习经历。
它为你提供了“啊哈!”当你终于明白时,你就会明白引擎盖下到底发生了什么。
一些算法只是比其他算法更复杂,所以从简单的开始,比如单层感知器。
我将使用感知器作为案例研究,带您通过以下 6 个步骤从头开始编写算法:
- 对算法有基本的了解
- 寻找一些不同的学习资源
- 将算法分成块
- 从一个简单的例子开始
- 通过可信实施进行验证
- 写下你的过程
获得基本的理解
这又回到了我最初的陈述。如果你不了解基础知识,不要从头开始研究算法。
至少,你应该能够回答以下问题:
- 这是什么?
- 它通常用于什么?
- 这个什么时候不能用?
对于感知器,让我们继续回答这些问题:
- 单层感知器是最基本的神经网络。它通常用于二元分类问题(1 或 0,“是”或“否”)。
- 一些简单的用途可能是情绪分析(正面或负面反应)或贷款违约预测(“将违约”、“不会违约”)。对于这两种情况,决策边界需要是线性的。
- 如果决策边界是非线性的,你真的不能用感知器。对于这些问题,您需要使用不同的方法。
使用不同的学习资源
对模型有了基本的了解之后,就该开始做研究了。
有些人用课本学得更好,有些人用视频学得更好。
就我个人而言,我喜欢反复使用各种类型的资源。
对于数学细节,教科书做得很好,但是对于更实际的例子,我更喜欢博客帖子和 YouTube 视频。
对于感知器,这里有一些很好的来源:
教科书
- 统计学习的要素,第。4.5.1
- 理解机器学习:从理论到算法,Sec。21.4
博客
- 如何用 Python 从零开始实现感知器算法,作者 Jason Brownlee
- 单层神经网络和梯度下降,塞巴斯蒂安·拉什卡
视频
将算法分成块
现在我们已经收集了我们的资源,是时候开始学习了。
与其从头到尾阅读一章或一篇博文,不如从略读章节标题和其他重要信息开始。
写下要点,并尝试概述算法。
在浏览了源代码之后,我将感知器分成了以下 5 个部分:
- 初始化权重
- 用输入乘以权重,然后求和
- 将结果与阈值进行比较,以计算输出(1 或 0)
- 更新权重
- 重复
让我们详细地看一下每一个。
1。初始化权重
首先,我们将初始化权重向量。
权重的数量需要与特征的数量相匹配。假设我们有三个特征,这就是权重向量的样子
权重向量通常用零初始化,所以我将继续使用这个例子。
2.将权重乘以输入并求和
接下来,我们将权重乘以输入,然后求和。
为了更容易理解,我在第一行中给权重和它们相应的特征着色。
在我们将权重乘以特征之后,我们将它们相加。这也称为点积。
最终结果是 0。我将把这个临时结果称为“f”。
3.与阈值比较
计算完点积后,我们需要将其与阈值进行比较。
我已经选择使用 0 作为我的阈值,但是你可以使用它来尝试一些不同的数字。
由于我们计算的点积“f ”( 0)不大于我们的阈值(0 ),所以我们的估计值等于零。
我将估算值表示为带帽子的 y(也称为“y 帽子”),下标 0 对应于第一行。你可以用 1 代替第一行,这并不重要。我只是选择从 0 开始。
如果我们将这个结果与实际值进行比较,我们可以看到我们当前的权重没有正确预测实际输出。
由于我们的预测是错误的,我们需要更新权重,这将我们带到下一步。
4.更新权重
接下来,我们将更新权重。这是我们要用的等式:
基本思想是,我们在迭代“n”时调整当前权重,以便我们获得新的权重用于下一次迭代“n+1”。
要调整权重,需要设定一个“学习率”。这由希腊字母“eta”表示。
我选择使用 0.1 作为学习率,但是你可以使用不同的数字,就像阈值一样。
以下是我们目前所掌握信息的简要总结:
现在让我们继续计算迭代 n=2 的新权重。
我们已经成功完成了感知器算法的第一次迭代。
5.重复
由于我们的算法没有计算出正确的输出,我们需要继续下去。
通常我们需要多次迭代。遍历数据集中的每一行,我们每次都会更新权重。
对数据集的一次完整扫描被称为“时期”
由于我们的数据集有 3 行,我们需要三次迭代来完成 1 个时期。
我们可以设置总的迭代次数或次数来继续执行算法。也许我们想要指定 30 次迭代(或者 10 个时期)。
与阈值和学习率一样,历元数也是一个可以随意使用的参数。
在下一次迭代中,我们移动到第二行特性。
我不会重复每一步,但下面是点积的下一个计算:
接下来,我们将比较点积和阈值来计算新的估计值,更新权重,然后继续。如果我们的数据是线性可分的,感知器就会收敛。
从一个简单的例子开始
既然我们已经手工将算法分成了几个块,是时候开始用代码实现它了。
为了简单起见,我总是喜欢从一个非常小的“玩具数据集”开始
对于这类问题,一个很好的小型线性可分数据集是一个与非门。这是数字电子中常用的逻辑门。
由于这是一个相当小的数据集,我们可以手工输入到 Python 中。
我将添加一个虚拟特征“x0 ”,它是一列 1。我这样做是为了让我们的模型计算偏置项。
您可以将偏差视为截距项,它正确地允许我们的模型将两个类别分开。
下面是输入数据的代码:
# Importing libraries
# NAND Gate
# Note: x0 is a dummy variable for the bias term
# x0 x1 x2
x = [[1., 0., 0.],
[1., 0., 1.],
[1., 1., 0.],
[1., 1., 1.]]y =[1.,
1.,
1.,
0.]
与上一节一样,我将分块逐步完成算法,一边编写代码一边测试。
1.初始化权重
第一步是初始化权重。
# Initialize the weights
import numpy as np
w = np.zeros(len(x[0]))Out:
[ 0\. 0\. 0.]
请记住,权重向量的长度需要与特征的数量相匹配。对于这个与非门例子,长度是 3。
2.将权重乘以输入并求和
接下来,我们将权重乘以输入,然后求和。
另一个名称是“点积”
同样,我们可以使用 Numpy 轻松地执行这个操作。我们将使用的方法是.dot()
。
让我们从权重向量和第一行特征的点积开始。
# Dot Product
f = np.dot(w, x[0])
print fOut:
0.0
不出所料,结果是 0。
为了与上一节的注释保持一致,我将点积赋给了变量“f”。
3.与阈值进行比较
计算完点积后,我们准备将结果与阈值进行比较,以预测输出。
同样,我将与上一节的笔记保持一致。
我将使阈值“z”等于 0。如果点积“f”大于 0,我们的预测将是 1。否则就是零。
请记住,预测通常用一克拉表示,也称为“帽子”。我将把预测赋给的变量是yhat
。
# Activation Function
z = 0.0
if f > z:
yhat = 1.
else:
yhat = 0.
print yhatOut:
0.0
不出所料,预测值为 0。
你会注意到,在代码上方的注释中,我称之为“激活函数”。这是对我们正在做的事情的更正式的描述。
看一下 NAND 输出的第一行,我们可以看到实际值是 1。由于我们的预测是错误的,我们需要继续更新权重。
4.更新权重
现在我们已经做出了预测,我们准备更新权重。
在这样做之前,我们需要设定一个学习率。为了与前面的例子保持一致,我将学习率“eta”的值指定为 0.1。
我将对每个权重的更新进行硬编码,以便于阅读。
# Update the weights
eta = 0.1
w[0] = w[0] + eta*(y[0] - yhat)*x[0][0]
w[1] = w[1] + eta*(y[0] - yhat)*x[0][1]
w[2] = w[2] + eta*(y[0] - yhat)*x[0][2]
print wOut:
[ 0.1 0\. 0\. ]
我们可以看到我们的权重现在已经更新了,所以我们准备继续。
5.重复
现在我们已经完成了每一步,是时候把所有东西放在一起了。
我们还没有讨论的最后一点是我们的损失函数。这是我们试图最小化的函数,在我们的例子中是平方和(SSE)误差。
这是我们将用来计算我们的误差,并看看模型是如何执行的。
综合来看,完整的函数如下所示:
import numpy as np
# Perceptron function
def perceptron(x, y, z, eta, t):
'''
Input Parameters:
x: data set of input features
y: actual outputs
z: activation function threshold
eta: learning rate
t: number of iterations
'''
# initializing the weights
w = np.zeros(len(x[0]))
n = 0
# initializing additional parameters to compute sum-of-squared errors
yhat_vec = np.ones(len(y)) # vector for predictions
errors = np.ones(len(y)) # vector for errors (actual - predictions)
J = [] # vector for the SSE cost function
while n < t: for i in xrange(0, len(x)): # dot product f = np.dot(x[i], w) # activation function if f >= z:
yhat = 1\.
else:
yhat = 0.
yhat_vec[i] = yhat
# updating the weights
for j in xrange(0, len(w)):
w[j] = w[j] + eta*(y[i]-yhat)*x[i][j]
n += 1
# computing the sum-of-squared errors
for i in xrange(0,len(y)):
errors[i] = (y[i]-yhat_vec[i])**2
J.append(0.5*np.sum(errors))
return w, J
现在我们已经编写了完整的感知器,让我们继续运行它:
# x0 x1 x2
x = [[1., 0., 0.],
[1., 0., 1.],
[1., 1., 0.],
[1., 1., 1.]]
y =[1.,
1.,
1.,
0.]
z = 0.0
eta = 0.1
t = 50
print "The weights are:"
print perceptron(x, y, z, eta, t)[0]
print "The errors are:"
print perceptron(x, y, z, eta, t)[0]Out:
The weights are:
[ 0.2 -0.2 -0.1]
The errors are:
[0.5, 1.5, 1.5, 1.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
看一下误差,我们可以看到误差在第 6 次迭代时变为 0。对于剩余的迭代,它保持为 0。
当误差达到 0 并停留在那里时,我们知道我们的模型已经收敛。这告诉我们,我们的模型已经正确地“学习”了适当的权重。
在下一节中,我们将使用我们在更大的数据集
上计算的权重来进行预测。
通过可信实施进行验证
到目前为止,我们已经找到了不同的学习资源,手工完成了算法,并用一个简单的例子在代码中进行了测试。
现在是时候将我们的结果与可信的实现进行比较了。为了比较,我们将使用 scikit-learn 的感知机。
我们将通过以下步骤进行比较:
- 导入数据
- 将数据分成训练/测试集
- 训练我们的感知器
- 测试感知器
- 比较 scikit-learn 感知器
1.导入数据
让我们从导入数据开始。你可以在这里获得数据集的副本。
这是一个线性可分离的数据集,我创建它是为了确保感知器能够工作。为了确认,让我们继续绘制数据。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv("dataset.csv")
plt.scatter(df.values[:,1], df.values[:,2], c = df['3'], alpha=0.8)
看一下这个图,很容易看出我们可以用一条直线将这些数据分开。
在我们继续之前,我将解释我上面的绘图代码。
我使用 Pandas 导入 csv,它会自动将数据放入 dataframe 中。
为了绘制数据,我必须从数据帧中提取值,这就是我使用.values
方法的原因。
这些特性在第 1 列和第 2 列中,所以这就是我在散点图函数中使用它们的原因。列 0 是 1 的伪特征,我包括它是为了计算截距。这应该与我们在上一节中对与非门所做的事情很相似。
最后,我在散点图函数中使用c = df['3'], alpha = 0.8
给两个类着色。输出是第 3 列中的数据(0 或 1),所以我告诉函数使用第 3 列给两个类着色。
你可以在这里找到 Matplotlib 散点图函数的更多信息。
2.将数据分成训练/测试集
既然我们已经确认了数据可以线性分离,那么是时候拆分数据了。
在与测试数据集不同的数据集上训练模型始终是一种很好的做法。这有助于避免过度拟合。
有不同的方法可以做到这一点,但是为了简单起见,我只使用一个训练集和一个测试集。
我将从整理我的数据开始。如果您看一下原始文件,您会看到数据是按行分组的,输出(第三列)中有 0,然后是所有的 1。我想改变一下,增加一些随机性,所以我要打乱它。
df = df.values
np.random.seed(5)
np.random.shuffle(df)
我首先将数据从 dataframe 改为 numpy 数组。这将使我将要使用的许多 numpy 函数更容易使用,比如.shuffle
。
为了使结果对你来说是可重复的,我设置了一个随机种子(5)。完成后,尝试改变随机种子,看看结果如何变化。
接下来,我将把 70%的数据分成一个训练集,30%的数据分成一个测试集。
train = df[0:int(0.7*len(df))]
test = df[int(0.7*len(df)):int(len(df))]
最后一步是分离出训练集和测试集的特征和输出。
x_train = train[:, 0:3]
y_train = train[:, 3]
x_test = test[:, 0:3]
y_test = test[:, 3]
为了这个例子,我为我的训练/测试集选择了 70%/30%,但是我鼓励你研究其他方法,比如 k 倍交叉验证。
3.训练我们的感知器
接下来,我们将训练我们的感知器。
这非常简单,我们只是要重用我们在上一节中构建的代码。
def perceptron_train(x, y, z, eta, t):
'''
Input Parameters:
x: data set of input features
y: actual outputs
z: activation function threshold
eta: learning rate
t: number of iterations
'''
# initializing the weights
w = np.zeros(len(x[0]))
n = 0
# initializing additional parameters to compute sum-of-squared errors
yhat_vec = np.ones(len(y)) # vector for predictions
errors = np.ones(len(y)) # vector for errors (actual - predictions)
J = [] # vector for the SSE cost function
while n < t: for i in xrange(0, len(x)): # dot product f = np.dot(x[i], w) # activation function if f >= z:
yhat = 1\.
else:
yhat = 0.
yhat_vec[i] = yhat
# updating the weights
for j in xrange(0, len(w)):
w[j] = w[j] + eta*(y[i]-yhat)*x[i][j]
n += 1
# computing the sum-of-squared errors
for i in xrange(0,len(y)):
errors[i] = (y[i]-yhat_vec[i])**2
J.append(0.5*np.sum(errors))
return w, J
z = 0.0
eta = 0.1
t = 50
perceptron_train(x_train, y_train, z, eta, t)
让我们来看看权重和误差平方和。
w = perceptron_train(x_train, y_train, z, eta, t)[0]
J = perceptron_train(x_train, y_train, z, eta, t)[1]
print w
print JOut:
[-0.5 -0.29850122 0.35054929]
[4.5, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
权重现在对我们来说意义不大,但是我们将在下一节中使用这些数字来测试我们的感知机。我们还将使用权重来比较我们的模型和 scikit-learn 模型。
看一看误差平方和,我们可以看到我们的感知机已经收敛,这是我们所期望的,因为数据是线性可分的。
4.测试我们的感知机
现在是时候测试我们的感知机了。为此,我们将构建一个小的perceptron_test
函数。
这与我们已经看到的非常相似。该函数采用我们使用perceptron_train
函数和特性计算的权重的点积,以及激活函数来进行预测。
我们唯一没见过的是accuracy_score
。这是 scikit-learn 的一个评估指标函数。你可以在这里了解更多。
将所有这些放在一起,代码如下所示:
from sklearn.metrics import accuracy_score
w = perceptron_train(x_train, y_train, z, eta, t)[0]
def perceptron_test(x, w, z, eta, t):
y_pred = []
for i in xrange(0, len(x-1)):
f = np.dot(x[i], w)
# activation function
if f > z:
yhat = 1
else:
yhat = 0
y_pred.append(yhat)
return y_pred
y_pred = perceptron_test(x_test, w, z, eta, t)
print "The accuracy score is:"
print accuracy_score(y_test, y_pred)Out:
The accuracy score is:
1.0
1.0 分表示我们的模型对所有测试数据做出了正确的预测。这个数据集显然是可分离的,所以我们可以预期这个结果。
5.比较 scikit-learn 感知器
最后一步是将我们的结果与 scikit-learn 的感知器进行比较。这是该模型的代码:
from sklearn.linear_model import Perceptron
# training the sklearn Perceptron
clf = Perceptron(random_state=None, eta0=0.1, shuffle=False, fit_intercept=False)
clf.fit(x_train, y_train)
y_predict = clf.predict(x_test)
现在我们已经训练了模型,让我们将权重与模型计算的权重进行比较。
Out:
sklearn weights:
[-0.5 -0.29850122 0.35054929]
my perceptron weights:
[-0.5 -0.29850122 0.35054929]
scikit-learn 模型的重量与我们的重量相同。这意味着我们的模型工作正常,这是个好消息。
在我们结束之前,还有几个小问题要讨论一下。在 scikit-learn 模型中,我们必须将随机状态设置为“None ”,并关闭洗牌。我们已经设置了一个随机种子并打乱了数据,所以我们不需要再次这样做。
我们还必须将学习率“eta0”设置为 0.1,以与我们的模型一致。
最后一点是截距。因为我们已经包含了一个 1 的伪特征列,我们正在自动拟合截距,所以我们不需要在 scikit-learn 感知器中打开它。
这些看起来都是次要的细节,但是如果我们不设置这些,我们将无法重现与我们的模型相同的结果。
这是很重要的一点。在使用模型之前,阅读文档并理解所有不同设置的作用是非常重要的。
写下你的过程
这个过程的最后一步可能是最重要的。
您已经完成了学习、做笔记、从头开始编写算法以及与可信实现进行比较的所有工作。不要让所有的好工作都白费了!
记录流程非常重要,原因有二:
- 你会获得更深的理解,因为你正在把你刚刚学到的东西教给别人。
- 你可以把它展示给潜在雇主。
表明你可以从机器学习库中实现一个算法是一回事,但如果你能从头开始自己实现它,那就更令人印象深刻了。
展示你的作品的一个很好的方式是使用 GitHub Pages 作品集。
结论
在这篇文章中,我们学习了如何从头开始实现感知器。
更重要的是,我们学会了如何找到有用的学习资源,以及如何将一个算法分解成块。
然后,我们学习了如何使用玩具数据集用代码实现和测试算法。
最后,我们将模型的结果与可信的实现进行了比较。
这是在更深层次上学习算法的一个很好的方法,这样你就可以自己实现它。
大多数时候你会使用一个可信的实现,但是如果你真的想更深入地了解底层发生了什么,从头实现它是一个很好的练习!
我们都需要从机器学习中学到的 6 课
机器学习作为一个领域至少已经存在了几十年。由于深度学习,这个术语现在成为主流,不再局限于研究和学术界。
在所有激活函数和反向传播的复杂数学背后,深度学习是对我们大脑中神经元网络的抽象,并模拟它们学习和概括信息的迷人能力。
深度学习的巨大成功意味着,从人类那里获得灵感来设计算法是有价值的。反之呢?
机器学习的实践有什么值得我们学习和启发的地方吗?
机器学习不仅仅是神经网络和深度学习。这是一个拥有众多智能算法的领域,这些算法可以推导出复杂的模式,并对未知做出预测。
以下是我发现的六件在 ML 领域非常引人注目的事情,它们可能会给我们带来一些人生教训
- 相信多样性的力量(随机森林)
随机森林的健壮性得益于其不同决策树的集合,每个决策树都试图解决问题的一部分。
没有只有一棵树的森林。
类似地,当来自不同背景的人和团体一起合作和工作时,结果是令人温暖的。如果我们把自己局限在与我们关系最密切的小圈子里,我们就限制了自己真正的潜力。
2。从你的错误中学习,永远(梯度推进)
梯度提升不是使用不同分类器的集合,而是利用错误并以迭代的方式不断改进基本分类器。
就像梯度推进机一样,我们需要意识到没有人是完美的,我们都会犯错。重要的是要找出错误并吸取生活教给你的教训。
不要被你的成就冲昏了头脑,而是要专注于纠正你人生每个阶段的缺陷。
3。每个问题都有解决方案(内核方法& SVM)
核方法在支持向量机中很流行。它们用于将低维中不可分的数据转换到高维中,并使用决策边界来分离类。
生活并不总是玫瑰和彩虹。它给我们带来了难以解决的难题,没有现成的解决办法。在那些绝望的时刻,令人欣慰的是知道有更高的维度是你不知道的,总会有出路。
保持冷静,向更高的维度祈祷
4。接受改变个人信念(贝叶斯定理)
贝叶斯定理在获得关于相关和条件事件的附加信息后更新事件的先验似然。
同样,我们都对人、文化和社会有先入为主的信念和假设。这些信念是基于我们的社会、经济和人口状况培养出来的。
当我们遇到挑战我们先前信念的新情况时,我们有意识地更新自己是至关重要的。
永远不要对变化持不可知论态度。
5。应做出决定以说明当前的情况(梯度下降)
从回归到神经网络,梯度下降是许多机器学习算法的学习部分。原则是始终沿着最陡下降的路径到达期望的目的地。
我们经常面临这样的情况,需要我们做出决定,在无数的选择中选择一个。这些决定对未知的未来有着潜在的影响。
梯度下降为我们提供了这种情况下的捷径,总是为现在做出最佳选择,而不是太担心你的未来课程。
不要等待理想的解决方案,你永远不知道会发生什么。
6。关系随时间变化(k 均值)
k-means 算法通过将数据分配和重新分配给不同的组来迭代地提高聚类质量,直到达到平衡。
人类的互动和情感在建立我们的关系中起着至关重要的作用。不足为奇的是,当这些关系紧张时,我们会崩溃。
我们应该意识到,即使是强大的关系也可能在没有明显过错的情况下随时改变或结束,就像 k-means 一样。接受事实,在可以的时候珍惜你爱的人。
如果你在算法和其他学习范式的经验中有类似的类比,请告诉我。我们都可以互相学习,包括机器学习。
有效数据科学的 6 个不寻常原则
如何概念化和实施有效的数据科学项目
Results, not hype
动机
我对数据科学研究得越多,我就越确信,公司和数据科学从业者必须对如何打破机器学习和人工智能的宣传有一个清晰的看法,以实施一个有效的数据科学战略来推动商业价值。本文希望建立一个框架来概念化和实施有效的数据科学项目。
你为什么要在乎
展示你作为一名数据科学家可以获得有意义的见解,从而提高收入和利润,这将使你对公司更有价值。借助高度优化且易于实现的机器学习和深度学习库,任何数据猴子都可以只用几行代码构建复杂的人工智能算法。然而,复杂的模型并不等同于有效的模型。了解模型输出如何转化为现实世界的应用是关键。
从公司的角度来看,数据科学家和任何其他员工一样,根据他们创造的价值获得报酬。如果一家公司支付给员工的薪酬高于他们带来的价值,那么这家公司就亏损了。显然不是一个可持续的长期战略。是的,数据科学家现在工资很高,但如果公司不能从数据科学中提取他们认为可以获得的价值,数据科学家的工资和需求最终会下降。
问题:数据科学家更倾向于关注手段而不是目的
由于人工智能研究人员在过去几年取得的成果(演奏 GTA ,创作肖邦风格的音乐作品 s),许多公司都在赶潮流,宣告人工智能的新时代。
这一切都很好,但由于数据科学在商业环境中的新生应用,信息不对称是存在的。数据科学家从业者往往具有技术背景,并且通常将他们的主要目标视为构建最先进的算法。另一方面,其他员工将人工智能视为一个黑盒子,通常是通过人工智能研究人员高调突破的镜头(例如,人工智能能够击败顶级围棋选手)。由于业务的技术和商业部分之间的脱节,来自数据科学家的输出可能不具有可操作性或商业意义。
解决方法:不要只见树木不见森林;实用数据科学是关于推动价值,而不是优化准确性
我们可以把实用数据科学想象成一个有三条腿的凳子:编程、统计和业务理解,如果我们缺少任何一条腿,凳子就会倒塌。我们都知道这一点,但业务理解很少成为数据科学文章或论坛的焦点。
The three pillars of data science
编程和数学是必要的,但不足以成为一名有效的数据科学家,因为技术技能只是达到目的的一种手段。帮助公司提高客户保持率,帮助穷人获得贷款,通过更早地诊断疾病来改善健康状况——这些是数据科学家应该关注的目标;机器学习/人工智能只是实现这一目标的一种手段。
有效数据科学的 6 项原则
坚持以下六条原则将使数据科学家能够概念化和实施有效的项目。
1.理解人工智能的需求层次
就像人类在实现自我实现之前需要食物、水和空气一样,建立可靠的数据流是使用数据做任何事情的关键。只有当数据可以访问时,才能对其进行探索和转换。当清理后的数据可以很容易地被浏览时,就可以更好地理解客户。 莫妮卡·罗加蒂的优秀文章, ’ 人工智能需求层次 ’ ,提供了一个清晰的框架来思考这一点。
许多公司希望人工智能带来的结果,但没有合适的基础设施来实施机器学习。公司应该意识到,机器学习/深度学习在整个数据堆栈中出现得较晚。数据首先必须可靠地收集*,然后才能转换,随后探索。一个中断的上游流程(例如,如果跟踪不准确)将影响数据的清洁度,并最终影响从中获得的洞察力。只有当数据是干净的并且容易探索时,它才能用于商业智能、分析和人工智能。*
Diagram adapted from Monica Rogati’s excellent article, ‘The AI Hierarchy of Needs’
人工智能需求层次的含义——在考虑机器学习或深度学习之前扩大数据基础设施
这种等级制度意味着公司应该按照需求的顺序招聘员工。这是什么意思?如果你的公司还没有建立规模机器学习,那么重点应该是那些任务,而不是深度学习。与编码一样,这是一个循序渐进的过程,在达到下一个级别之前,必须先准备好正确的构件。
灾难的一个原因是,一名在建模方面经验丰富的数据科学家被一家没有适当跟踪和数据库的初创企业聘用。在加入公司之前,员工还应该检查他们对工作的期望。
作为一名数据科学家,知道如何正确设计表模式或构建数据管道可能很重要,但却被低估了许多公司所需的技能,特别是因为大多数数据科学课程和机器学习竞赛往往专注于机器学习的“更性感”方面。
2。构建能够回答正确问题的模型
早期决策,以及随之而来的项目早期假设,通常会对整个项目产生不成比例的影响。您在项目开始的一天或一周内所做的决策——关于最终用户需求的假设,如何使用模型的输出——对模型的有效性有着最重要的影响。随着项目越来越晚做出决策,他们的影响力会降低。选择如何清理脏数据或使用什么功能会影响模型的准确性,但决定机器学习模型是否可以部署到生产中的最大因素来自于你在项目开始时提出的问题。
Early decisions have disproportionately large impact on projects
表面上很容易理解这一点,但很少有人考虑其中的含义。
为了构建一个具有可操作结果的模型,在键入一行代码之前必须完成以下工作:与最终用户沟通,了解已经到位的业务规则,查看现有数据并思考如何为要训练的模型定义“基础事实”,以使其对最终用户有意义,了解提议的模型的局限性,并与业务用户一起对模型的预测输出进行压力测试。
这里有一个例子来说明这一点。
建立流失预测模型
营销部门找到你,让你建立一个机器学习模型来预测哪些客户已经流失。营销部门告诉你,有这样一个输出是有用的,所以他们可以更好地重新定位客户,以提高客户保留率。作为一名数据科学家,这似乎是一项简单明了的任务。建立一个二进制分类模型,输出 1 为搅动的客户,0 为活跃的客户。事实上,你告诉你的同事,你可以通过给他们一个客户翻盘的可能性来超越他们的要求。
进一步的讨论发生了,你了解到市场营销将被搅动的客户定义为一年或一年以上没有订购的客户。您决定遵循他们现有的逻辑,并将您的模型的目标标记为这样。
你提出你的计划,然后营销部门给你建立模型的许可。你花了数周时间提取和清理数据,定义损失函数,确定交叉验证策略,训练和调整模型,验证结果,最终得到的 AUC 为 0.9。您对结果感到欢欣鼓舞,并自豪地向营销团队展示您的发现,告诉他们使用了什么数据和模型,以及如何解释 AUC。
市场部有意见:
- 最近注册但没有下订单的用户被模型贴上了“搅动用户”的标签。这种情况不应该发生,因为订单周期更长。更广泛地说,在不同时间注册的用户应该有不同的流失定义。六个月内没有购买的常客可能被认为是被搅动的,而六个月内没有购买的新用户可能不会被搅动,因为正常的购买周期是一年或更长时间。
- 营销部门意识到,模型预测的客户流失已经成为现有保留工作的目标。他们实施了一个简单的业务规则,即六个月内没有购买的客户已经获得了最大可能的折扣。模型输出能提供客户流失的原因吗?
从流失预测模型中得到的启示
无论模型有多精确,回答错误的问题都是浪费时间。
**企业可能并不总是预先知道它需要什么,因为企业经理可能不理解机器学习是如何工作的。挑战业务告诉你的东西。在这种情况下,预测流失有用吗?或者,我们是否希望预测客户对现有流失报价的反应程度,以便营销能够更好地针对他们现有的活动?能够有效地做到这一点需要了解业务和客户。
**目标的定义极其重要。企业如何定义客户流失,以及您希望如何训练您的模型可能会有所不同,因为用现有的客户流失定义训练模型可能会导致没有商业意义的预测。在这种情况下,了解不同的客户群(例如,顶级客户和新用户)及其不同的生命周期是获得有意义预测的关键。基于模型的训练方式来理解模型输出是必要的。
3。挑选最能增加业务价值的项目
在选择做什么项目时,问正确的问题也很重要。理想情况下,优先项目应该是那些对业务有最大机会的项目。机器学习项目需要时间来推广,承担错误项目的成本可能会超过收益。**
鉴于机器学习的经验性质,提出正确问题的重要性进一步凸显,因为结果无法得到保证。进行探索性数据分析可能不会产生太多的洞察力,并且构建模型可能不会产生比已实现的现有业务规则更好的结果。在承担一个项目的收益(它们需要很大)和成本(很小或无害)之间需要有一个显著的不对称,正是由于这种不对称,经验项目(试错)才能产生结果。凸性是表示这一点的数学性质。
Graphical representation of a convex strategy
机器学习项目可以比作烹饪,这在很大程度上依赖于试错,因为我们还不能直接从化学方程式中调制出一道菜。我们取大米,加入不同的配料组合,比如酱油和姜黄粉,尝一尝,看看配料之间的相互作用是否有所改善。然后,我们保留好的食谱,丢弃其余的。重要的是,我们有保留结果的选择权,而没有保留结果的义务,这让我们在保留优势的同时严格限制劣势。在机器学习的情况下,如果模型还没有在生产中实现,缺点是花在这些模型上的时间。这种“选择性”导致了机器学习项目的凸性,因为它允许数据科学家通过选择最佳模型并忘记其他模型来获得更多好处。至关重要的是,这意味着所选的项目必须具有很高的商业潜在收益。
在建立机器学习模型之前计算机会的大小可以帮助确定项目对业务的潜在影响。然后,可以将这种潜在影响与花费在项目上的估计时间进行权衡,以衡量项目的凸性。
计算商机规模的通用公式:
受影响的客户数量目标影响规模=预计项目影响*
着手直接影响业务杠杆的项目。 确保机器学习模型的输出直接影响商业杠杆也很重要。这将产生可直接操作的项目。例如,一家电子商务公司可能会要求其数据科学团队识别对某个品牌或商品类别有强烈意向的客户。仅仅预测客户是否有强烈的意图是不够的,因为意图不会直接影响任何商业杠杆。理想情况下,我们仍然希望给那些有强烈意向的人发送他们感兴趣的东西。识别有意向的客户只是等式的一半——识别为这些客户服务的产品同样重要。
4.快速迭代
快速迭代几乎总是最好的凸策略。 为了利用机器学习的经验性质和我们必须保留最佳模型的可选性,我们应该降低每次尝试的成本。当我们处理一个凸函数,我们的成本是每次迭代花费的时间时,大规模的单次试验比小规模试验的投资组合有更低的预期回报。降低每次尝试的成本意味着进行更多的尝试,在 N 次尝试中分配 1/N 的时间可以让我们将失败的概率降至最低,而不是在成功的情况下将利润最大化。
在实践中,这意味着基线模型在实施之前不需要对全部数据进行训练(例如,模型可以仅针对单个地理位置进行训练),或者首先构建简单的机器学习模型可以帮助衡量模型的输出是否可以在实践中实施。
Simple technologies can have a big impact when correctly applied
少即是多。从发现火到用火通过蒸汽机发电,经历了大约一百万年。有时最简单的技术也会被忽略。实际上,复杂化没有额外费用;在企业界是有的。查看人工智能研究中使用的最新技术会带来复杂性,在实践中,在数据探索后实施简单的业务规则可能是从数据中提取价值的全部内容。
拥有不同的视角很重要;俗话说:如果你只有一把锤子,那么一切看起来都像钉子。如果一个人过分依赖某个特定的工具、方法或心态,他可能看不清事物。在实践中,通过将数据探索与商业敏锐度相结合(例如,量身定制的客户细分)所实现的结果很快就会推出,而且机器学习模型很难超越。以这种方式使用数据使数据科学家能够快速迭代,并有助于建立一个良好的基线来衡量机器学习模型。
5。 数据没有灵丹妙药(至少目前没有)
了解数据的局限性以及机器学习算法如何工作对于了解哪些模型值得建立很重要。机器学习算法的有效性取决于所使用的数据,很多时候,收集的数据并不能完全代表现实,尤其是在涉及人类行为的时候。
这就是为什么 AI 在一些领域有更大的突破,而在另一些领域没有。在计算机视觉问题中,用于表示图像或视频的数字准确地代表了模型试图预测的内容。换句话说,整个假设空间被编码在计算机视觉问题的数据中。相比之下,股票价格受人类偏见的影响很大,使用神经网络通过每日收盘价、交易量和新闻情绪分析来预测股票价格不会像计算机视觉问题那样产生好的结果,这正是因为股票和买卖背后的人类心理和情绪无法编码在数据中。
含义:缩小问题规模,并从业务中获得输入,以更好地在模型中编码信息
缩小问题的范围。 这并不意味着当涉及人类行为时,数据科学就不能应用,但它的使用必须缩小规模。例如,对冲基金使用 NLP 进行情绪分析,这只是用于增强投资决策的工具之一。或者在上述情况下,与其预测客户何时会流失,不如根据客户之前的电子邮件打开率和点击率来预测客户对流失电子邮件报价的回应可能性可能更有意义。
利用业务知识完善原始数据。 通过融入商业知识,可以从原始数据中创建新的变量,使机器学习模型能够更好地发现有用的模式。这提高了使用相同数据的模型性能。数据科学家是他们自己领域的专家,由数据科学家进行的探索性数据分析通常不会像来自业务专家的洞察力那样多。例如,一个电子商务企业的产品被标记为数千个子类别,其中许多都非常相似。有了商业知识,可以对产品进行更恰当的标记,以更好地代表不同的子类别。这允许模型更好地理解子类别中的差异,并产生更好的结果。
正如Tirthajyoti Sarkar在这篇中所言:
“对于实际的机器学习来说,对人类设计者来说,指定一种表示来捕捉关于假设的相对概率的知识有时可能比完全指定每个假设的概率更容易。
这就是知识表示和领域专长变得至关重要的地方。它缩短了(通常)无限大的假设空间,并把我们引向一组极有可能的假设,我们可以对这些假设进行最佳编码,并努力从中找出一组映射假设。"
6.模型在部署前必须由业务部门仔细评估
最后一英里问题是部署机器学习模型的最后障碍。要求机器学习模型 100%的时间提供正确的答案是不可能的,从违反基本商业规则的模型中获得建议并不罕见。
再次以流失预测模型为例,预测用户在注册几周后流失是没有意义的。因此,商业利益相关者应该在部署之前仔细评估机器学习模型的输出。
应用商业规则当卫士
拥有一个额外的业务规则层对于质量保证来说是必不可少的,也有助于防止损害客户体验的错误机器学习模型的推出。决定实现什么样的业务规则源于业务部门进行的健全性检查。
具体而言,健全性检查可以包括:
- 通过根据不同的客户特征验证模型输出,确保模型输出有意义。用于验证的确切客户特征高度依赖于模型的用例。如果模型预测顶级客户何时会流失,请检查模型输出是否仅包括顶级客户,并且包括诸如上次网站浏览日期、上次订单日期、平均购物篮大小、订单数量等特征有助于验证输出
结论
有效数据科学背后的六个原则并不复杂。您可以将它们比作超参数调整,这些超参数在 0 到 100 的范围内确定模型输出对业务的价值。调整其中的任何一个都会影响项目带来的价值。
确保有一个人工智能需求层次,首先收集数据,然后在数据库中清理和转换数据,这对可扩展的机器学习至关重要。
在开始任何项目之前问正确的问题,并确保模型输出回答这些问题,将有助于确保项目的输出是有意义的。
考虑凸性和权衡项目的潜在成本和收益将有助于选择对业务价值最大的项目。
与此同时,快速迭代的心态让我们有更多的尝试,这将我们获得琐碎结果的可能性降至最低——这在本质上属于探索性的机器学习中尤为重要。快速迭代的一个扩展是旨在使用最有效但不一定最复杂的分析或机器学习技术。
能够理解数据的局限性将有助于定义项目的范围,以确保输出不是胡言乱语。从业务中获得洞察力以更好地设计功能有助于改进模型。
最后,由企业进行的健全性检查是必要的保障措施,以防止建议导致糟糕的客户体验。
感谢阅读,希望这篇文章对你有用。如果你不同意上面的任何观点,或者如果你对实现机器学习项目有更多有用的原则,让我们进行一次对话!
人们利用机器学习赚钱的 6 种方式
source: www.graymeta.com
机器学习绝对非常酷,很像虚拟现实或者你键盘上的触控条。但是酷和有用有很大区别。对我来说,如果能解决问题、节省时间或金钱,那就是有用的。通常,这三件事是有联系的,并且与一个更宏大的想法有关;投资回报。
在人工智能和机器学习方面已经有了一些惊人的飞跃,但是如果它不能为你的投资提供回报,这些都没有意义。那么如何让机器学习变得有用呢?以下是机器学习如何为公司节省时间和金钱的一些真实例子:
- 查找资料
https://www.thunderstone.com/products-for-search/search-appliance/
我相信你已经花了时间去找一张照片或一封电子邮件。如果你全部加起来,那是多少时间?你每小时得到多少钱?公司也有这个问题。我们都完全淹没在数字内容中。我们到处都有文件和文件夹,它们被塞满了。更糟糕的是,我们也没有很好地跟踪它。类似于我的公司 GrayMeta 的平台被用来扫描企业拥有的一切,并运行诸如对象识别、文本分析、语音到文本、人脸识别等功能。来创建好的,可搜索的数据库。人们现在花在搜索和寻找东西上的时间大大减少了。这种节省远远大于平台的成本。Tadaaa!这就是 ROI 宝贝。
2.瞄准你的观众
如今广告商面临的最大问题之一是人们忽视了他们的产品。我承认我觉得 99%的广告都很烦人,而且不相关。我尽我所能不点击或不看广告。问题是广告还是太宽泛,而且通常不能反映我的个人兴趣。做广告的平台希望用机器学习来解决这个问题。
向观众提供内容的公司现在正在使用计算机视觉和语音转文本技术,以比以前更精细的方式理解他们自己的内容。然后,这些信息被动态地用于驱动你在内容中或内容旁边看到什么广告。你在看一部关于狗的电影吗?看到狗粮的广告不要惊讶。更多的相关广告意味着更多的参与,更多的参与意味着更多的钱。
3.提高存储效率
您知道吗,大多数云存储服务根据您需要内容的速度有不同的定价?存储在一个可以立即访问的地方的东西每 GB 大约要花 0.023 美元。但是你不介意等待的东西每 GB 要花费 0.004 美元。便宜五分之一。新闻机构有许多采访、b-roll 和其他重要的镜头,它们正在转移到云上。假设他们有 100TBs 的内容。为了快速访问(因为新闻发生得快),他们将 100%的内容保存在更昂贵的层上。这让他们每月花费 2300 美元,每年 27600 美元。
现在,他们使用机器学习来决定哪些内容应该存储在更昂贵的层上。社交媒体上的趋势关键词在数据库中发起查询,该数据库具有每个视频的粒度元数据(多亏了机器学习)。对该查询的肯定匹配启动该视频到更昂贵的存储器的传输。该公司现在可以在更便宜的存储设备上存储 100TBs,每年节省 22,800 美元。
4.提高存储效率
使用上述公司存储在云中的 100TBs 数据也是要花钱的。让我们假设,到今年年底,100%的内容都需要被下载、编辑和用于新闻制作。那要花 84000 美元。如果你不知道你的云存储中有什么,你必须下载它来找出答案,这需要你花钱。你有没有一个标签为 b-roll 的文件夹,里面有很多视频文件,仅凭文件名无法识别?由于机器学习,人们可以知道每一个视频中有什么,而不必下载它。他们可以下载他们想要的确切文件,而不是整个文件夹或项目,每年节省数万美元的外出费用。
5.分析东西
大多数机器学习都是关于预测事物的。一家受欢迎的视频点播公司列出了你观看的所有内容,你观看它们的时间,你观看之前的趋势,并训练一个机器学习模型来尝试和预测你接下来要观看的内容。他们使用这种预测来确保该内容在离您最近的服务器上已经可用。对你来说,这意味着电影播放速度快,质量高。对于视频点播公司来说,这意味着他们不必将自己拥有的所有东西都存储在世界上的每一台服务器上。他们只在认为你会看的时候才会把视频内容转移到服务器上。这省下的钱是惊人的。
6.避免罚款和保全面子
联邦通信委员会和其他政府机构可以对广播公司进行罚款,因为它们有不雅或淫秽的内容,如裸体、性内容或图形语言。其他发行合作伙伴可能只是对他们能玩什么或不能玩什么有严格的规定。你可能会认为,在将有问题的内容发送出去之前,很容易就能发现它们,但事实证明,制片厂仅仅是在内容发布之前检查一下,就要花费超过 120 个工时!如果你每小时付给这些人 20 美元,那么每部电影,每个分销渠道就是 2400 美元!如果你认为每个国家至少有一个频道,那么每个国家都有机上娱乐、日间电视、黄金时间电视、点播等节目…变得疯狂。幸运的是,机器学习通过自动标记内容为这些公司节省了大量的时间和金钱。人类仍然需要审查和批准,但他们花在这方面的时间从几周减少到几分钟。这是我个人看到的机器学习投资的最大回报之一。
作为个人或大公司,机器学习可以成为实现目标的非常有用的工具。弄清楚如何将一些很酷的技术和现实问题结合起来并不容易。这就是为什么考虑想法的有用性和投资回报总是很重要。
7 数据类型:思考机器学习数据类型的更好方式
超越数字和范畴
在本文中,我为机器学习实践者提出了一个更有用的数据分组分类法:7 种数据类型。
关于机器学习的编码、输入和特征工程的在线课程、教程和文章通常将数据视为分类或数字。二进制和时间序列数据有时会被调出,偶尔,序数这个术语会溜进对话中。然而,需要一个更精细的框架来提供更丰富的公共词典,用于思考和交流机器学习中的数据。
我在这篇文章中提出的框架应该引导从业者,尤其是新的从业者,更快地开发更好的模型。有了 7 种数据类型作为参考,我们应该能够更快地评估和讨论可用的编码选项和插补策略。
TL;DR;
将您的每个功能作为以下七种数据类型之一进行思考和讨论,以节省时间和传递知识:
- 无效的
- 名义上的
- 二进制的
- 序数
- 数数
- 时间
- 间隔
更新
通读一遍,看看机器学习的另外 4 种数据类型。
当前状态
在机器学习的世界里,数据几乎总是被分成两组:数值型和分类型。
数字数据用来表示由数字(浮点或整数)表示的任何东西。分类数据通常意味着其他一切,特别是离散的标记组经常被调出。这两个主要的分组——数字分组和分类分组——使用起来不一致,并且没有提供关于应该如何操作数据的更多指导。
数据通常需要以数字形式输入,以便机器学习算法使用这些数据进行预测。在机器学习指南中,分类字符串数据通常是 one-hot-encoded (又名哑编码)。Dan Becker 在 Kaggle 的机器学习教程系列中将它称为“分类数据的标准方法”。
在教程中,经常会假设所有以数字形式到达的数据都可以直接使用,并且所有的字符串数据都需要进行一次热编码。虽然许多教程确实对数据类型进行了更深入的研究(例如专门处理时间、二进制或文本数据),但这些更深入的研究通常不是以系统的方式进行的。事实上,我还没有找到明确的准则来根据本文提出的分类法转换数据。如果你知道这样的数据科学资源,请在评论中分享:)
在研究生院接受社会科学方法和统计学培训后,我来到机器学习,我发现很惊讶的是,没有太多关于序数数据的讨论。例如,我发现自己一直在试图找出最好的方法来编码和估算字符串形式的顺序标度数据和数字形式的名义(真正分类的)数据。如果没有清晰一致的数据类型分类,这将花费不必要的时间。
这 7 种数据类型的灵感来自 Steven 的测量尺度类型学和我自己对机器学习模型中需要特别考虑的数据类型的观察。在介绍 7 种数据类型之前,让我们先来看看正在使用的度量标准及其来源。
史蒂文斯的测量量表类型学
Stanley Smith Stevens
20 世纪 60 年代,哈佛大学心理学家 Stanley Smith Stevens 为数据创造了四个测量尺度:比率、区间、序数和名义值,这四个尺度是 T2。
- 比率(值和有意义的零值之间的等间距—平均值有意义)
- Interval(值之间有相等的空格,但没有有意义的零值 mean 有意义)
- 序数(第一个、第二个、第三个值,但第一个和第二个以及第二个和第三个值之间的间距不相等—中间值有意义)
- 名义值(不同类别之间没有数字关系——平均值和中值没有意义)
史蒂文的类型学变得非常流行,尤其是在社会科学领域。此后,其他研究人员进一步扩大了音阶的数量( Mosteller & Tukey) 包括多达十个类别( Chrisman )。尽管如此,Steven 的类型学在社会科学中占据主导地位,偶尔也会在数据科学中被引用(例如这里),尽管在许多情况下没有提供明确的指导。
其他机器学习和数据科学从业者已经以各种方式采用了史蒂文类型学的部分内容,导致了各种各样的术语。例如,Hastie、Tibshirani 和 Friedman 在《统计学习的要素》第二版中。将比率和区间组合成定量并分解出序数和分类在一个例子中(第 504 页)。哈斯蒂等人。艾尔。将序数称为有序分类变量,将分类变量称为定性、离散、或因素(第 10 页)。 [假人统计](http://TYPES OF STATISTICAL DATA: NUMERICAL, CATEGORICAL, AND ORDINAL)将数据类型分解为数值、序数和分类——在数值下用区间集总比率。DataCamp 是指教程中的连续、序数和名义数据类型。
统计学中偶尔出现的一种分类是介于离散变量和连续变量之间的。离散数据有不同的值,而连续数据在一个范围内有无限个可能的值。
但是一般在机器学习中数值和分类就是你会看到的除法(比如这里的)。流行的 Pandas 库在其可选的 类别 数据类型中将序数和名义数据结合在一起。总的来说,目前机器学习数据类型的词典不一致,令人困惑。而不清楚的,学的慢。可以做些什么来改善事情?
机器学习的 7 种主要数据类型
虽然改进机器学习中的数据类型词典似乎是一个大胆的目标,但我希望这篇文章将提供一个有用的分组分类法,以便为数据科学家提供更可行的步骤。通过提供清晰的类别,我希望帮助我的同事,尤其是新人,更快地建立模型,并发现提高模型性能的新选项。
我建议对机器学习从业者最有用的 7 种数据类型进行如下分类:
- 无效的
- 名义上的
- 二进制的
- 序数
- 数数
- 时间
- 间隔
1.无效的
无用数据是唯一的、离散的数据,与结果变量没有潜在关系。一个无用的特性可能有很高的基数。随机生成的银行账号就是一个例子。
That’s useless for machine learning, but kind of cool
如果特征由没有顺序和意义的唯一值组成,则该特征是无用的,并且在拟合模型时不需要包括在内。
没有变化的特性也是如此。如果数据集中的每个人都是成年人,那么用一列 1 来表示这些信息对模型没有帮助。
2.名义上的
名义数据由不同类别之间没有数值关系的离散值组成,平均值和中值没有意义。动物物种就是一个例子。比如,猪并不比鸟高,比鱼低。
Nominal data: animal groups
国籍是名义数据的另一个例子。群体成员没有数字顺序——法国人、墨西哥人或日本人本身并不意味着一种有序的关系。
您可以一次性热编码或散列名义特征。不要对它们进行顺序编码,因为组之间的关系不能简化为单调函数。值的分配将是随机的。
3.序数
序数数据是可以排序的离散整数。一个决定性的特征是任何两个数之间的距离都是未知的。
例如,第一和第二之间的距离可能不同于第二和第三之间的距离。想想 10 公里赛跑。获胜者可能跑了 30 分钟,第二名可能跑了 30 分 01 秒,第三名可能跑了 400 分钟。没有时间数据,我们不知道队伍之间的相对距离。
概括地说,序数数据可以用三种方式之一进行编码。可以假设它与区间数据足够接近,数值之间具有相对相等的幅度,从而将其视为区间数据。社会科学家一直用李克特量表做这个假设。例如,从 1 到 7,1 表示极不可能,4 表示既不可能也不太可能,7 表示极有可能,您向朋友推荐这部电影的可能性有多大?这里,3 和 4 之间的差以及 6 和 7 之间的差可以合理地假设为相似。
第二种选择是将有序数据视为名义数据,其中每个类别与任何其他类别都没有关系。在这种情况下,可以使用一键编码或类似的方案。
第三个选项将在以后的文章中更详细地探讨,它类似于反向赫尔默特编码,可用于对值之间的各种潜在大小进行编码。
将有序数据归类为它自己的数据类型是有好处的。
4.二进制的
二进制数据是离散数据,只能属于两类中的一类——是或否、1 或 0、开或关等。二进制可以被认为是序数、标称值、计数或区间数据的一种特殊情况。
二进制数据是机器学习分类问题中非常常见的结果变量。例如,我们可能希望创建一个监督学习模型来预测肿瘤是恶性的还是良性的。
二进制数据是常见的,当考虑您的数据时,应该有自己的类别。
5.数数
计数数据是离散的整数数据,这里没有负数。计数数据通常有许多小值,如零和一。
计数数据通常遵循泊松分布。
Poisson distribution drawn from random numbers
计数数据通常被视为类似于区间数据,但它足够独特和广泛,足以值得自己的类别。
6.时间
时间数据是一种循环的、重复的连续数据形式。相关的时间特征可以是任何时间段——每天、每周、每月、每年等等。
每个观察值可能是我们见过的任何其他数据类型。例如,您的数据可能包含按日期排列的单位销售额或总收入。
Pandas python 库的设计考虑了时间序列数据。财务和营销数据通常包含重要的时间序列部分。
时间序列数据通常需要一些争论和操作来创建可能对您的模型有意义的周期特征。
缺失的时间序列数据通常使用适合于季节或每日数据的独特方法来填充。
时间序列数据有一些自己的模型,绝对值得单独考虑。😀
7.间隔
间隔数据在数字之间有相等的空间,并且不代表时间模式。例子包括百分比、温度和收入。
区间数据是最精确的测量尺度数据,非常普遍。尽管每个值都是一个离散的数字,例如 3.1 英里,但对于机器学习来说,它是否是一个连续的范围(例如,无限小的测量大小是可能的)通常并不重要,是否存在绝对零度也不重要。
区间数据通常很容易处理,但您可能希望创建条柱来减少范围的数量。
这里有 7 种数据类型。
- 无效的
- 名义上的
- 二进制的
- 序数
- 数数
- 时间
- 间隔
尽管许多有经验的机器学习实践者在实践中确实认为用这些标签描述的一些数据类型不同,但该领域缺乏明确的分类。我假设使用上面的分类法将帮助人们更快地评估编码、输入和分析数据的选项。
请注意,这七个类别中的大多数可以以几乎任何形式出现在您的原始数据中。我们不是在讨论 float 64 vs bool:Python 类型或(Numpy 或 Pandas dtype)与这里讨论的数据的类型不同。
这是正确的七类吗?
类型学被发明出来进行辩论。😀
在构建 7 种数据类型时,我问自己将计数数据与区间数据分开是否真的有用。最后,我认为这是因为文本数据是计数数据的一种常见形式,并且计数数据确实有一些常见的不同统计方法。
类似地,二进制数据可以被视为所有更高比例类型的子类型。然而,二进制数据在机器学习中非常常见,二进制结果变量具有一些其他多分类任务所不具有的潜在机器学习算法。您也不需要采取额外的步骤来编码二进制数据。
2018 年 12 月 7 日更新:
在深度学习上花了更多时间并考虑了读者的评论后,我会再添加四种特定的数据类型,使机器学习的有用数据类型总数达到 11 种。
8.图像
9.录像
10.声音的
11.文本
这四种数据类型具有独特的特征和专为它们构建的库特性。我认为机器学习的数据类型的全面分类需要包含它们。
如果你想倡导不同的分类法,请在评论中提出。
我该如何记住这些 7̶数据类型呢?
- 无效的
- 名义上的
- 二进制的
- 序数
- 数数
- 时间
- 间隔
- 图像
- 录像
- 声音的
- 文本
记忆是学习的关键。RNBOCTI 并不完全是脱口而出。
One of the eight or nine planets
从 9 行星助记符中得到启示,让我们制作一个助记符来帮助记住 7 种数据类型。
丑吵倭黑猩猩和老猫拿冰?
或者
傲慢吵闹的男孩常常无法接受指令
或者
新床底下老牛翻身
你或许可以做得更好。😉想出你自己的助记符,包括四种额外的数据类型,并在评论中分享。👍
我应该传播关于数据类型的信息吗?
绝对的。
在本文中,我将数据类型归类为 s̶e̶v̶e̶n̶十一大类之一,以创建一个更连贯的词典,用于在数据科学中思考和交流数据类型。这些类别对我在本文的中探索的编码选项有影响。
当我们都使用相同的术语来表示相同的事情时,我们就节省了学习和传递知识的时间。听起来是不是很棒?如果您同意,请在您最喜爱的社交媒体上分享。
我写关于数据科学、T2、Python 和其他技术主题的文章。如果你对这些感兴趣,请关注我,在这里阅读更多。😀
感谢阅读!
我从零开始构建 MySQL 数据处理系统(使用 Python)中学到的 7 个教训
在写这篇短文之前,我首先要说的是,我并不自称是一名优秀的数据科学家或机器学习工程师。第一件事是,我有一段有趣的、意想不到的(对我来说)工作经历,我想分享一些我从中学到的感悟。
我自己是一名自然语言处理/机器学习科学家,至于我的经验,不幸的是,我不能说你真的需要一个很好的计算机科学背景才能在这个领域成功工作(至少在我的国家),我不认为这是一个好的工作概念。我个人认识一些杰出的研究人员,他们由于某种原因没有足够的技能来参与实时开发和知识库贡献,这是一种小型数据科学悲剧。所以,知道我将要讲述的一些事情对于大多数阅读这篇短文的观众来说可能是非常清楚的,我仍然想分享它们——也许有人会发现这些信息是有用的。
我希望你会喜欢我将要讲的故事。
1.处理异常至关重要
当我第一次尝试连接到存储在 Google Cloud 上的这个特定的 MySQL 数据库时,我遇到了许多不同的错误。当我设置我的代理时,我经历了更多。事情是,处理所有的错误总是更好的,尤其是与连接相关的错误,在代码开发的第一阶段,在需要时抛出,否则调用 except 语句。
这听起来可能很简单,但在我的例子中,我可以有环境变量,其中有 UNIX 套接字名称和节点环境名称,我可以让它们的值不正确,我可以让我的数据库凭证不正确,,我可以拥有这一切。处理这类案例的几个小时节省了我很多时间,我真的很高兴我把这些时间投入到项目开发的这个阶段。
2.适当的抽象类是无价的
在处理抽象类时,你需要记住的最重要的事情是,你需要花很多时间和精力去定义它,并且你需要确定你确实需要它。我的存储库的结构是基于这样一个事实,即我必须创建许多。csv 文件,具有非常相似的模式(唯一键)。事实上,我有许多类似的提取器、算法、数据后处理器等。,所有这些都被简化为基本抽象类,这使得下一个模块的创建更加容易。
当你写第 n 个模块的时候,你真的意识到你已经把你的类做对了,而且你明白,构造函数和一些在编码时没有定义的方法已经实现了,你不需要再为它们费心了。
3.灵活的存储库结构总是最好的
有时它可能看起来有点难看(例如,一个文件夹中有一个文件),但是如果您看到如果您需要更改一些关键模块(例如,像文本预处理程序),并且这样做您只需要更改 1-2 个文件,那么它是很好的。
我不认为自己是一个软件架构师,所以对我来说很难判断在这个领域什么是好的,什么是错的,但是我学到的是组件的高度碎片化和独立性总是好的。我自己开发的 repo 有大量的小文件夹,引用它们比试图使架构整体化要容易得多(也许更漂亮)。
4.测试数据科学模型是值得的
我写这些文字的时候,我在嘲笑自己,因为我仍然没有足够的时间来创建涵盖所有情况的漂亮的测试。我仍然提到这一点的原因是,如果您有不太明显的 ML/NLP 模型行为,至少为了您自己的利益,最好对它进行测试。
我没有很多 NLP/ML 算法(其中大部分足够简单),但是它们的另一部分如果没有最简单的测试就无法支持。此外,在更好地理解模型方面,测试通常是有用的——浏览断言语句,当您希望在脑海中刷新时,一些算法概念可能会变得更加清晰。
5.使数据库符合第三范式
有时这是我和同事争论的一部分,但是如果不使所有 3 个语句都完美地为数据库工作,你就不能编写一个有效的数据处理系统。没有它们,一些不明显的查询麻烦往往会发生,你甚至找不到问题出在哪里。
一个简短的 SQL NFs 指南是这里是,我认为多看两遍总是更好。
6.记录你的错误
简单易用—日志记录。通常,你不会查看你收到的所有 3 年警告和错误,但是一些错误可能不会重复(我有一些错误),日志记录至少帮助我理解了发生的原因。我是在我的本地机器上做的,当一些东西在服务器上不工作时,查看类似的案例为我节省了一些时间。
7.除非你的数据库非常简单,否则你不需要 ORM
在从事这个项目的很长一段时间里,我真的担心我需要用 ORM 重写所有的东西。我大错特错了。
实际上,像 SQLAlchemy 和 Peewee 这样的东西适合小型的简单数据库,但是它们不适合像 had 这样的复杂数据库(有时编写一个查询需要 4 个 group by 和 5 个 joins)。它们很优雅,有时非常简单和漂亮,但无论如何,如果你只是简单地使用连接器 API,你就不能拥有像一样多的控制。我决定使用 MySQL Connector,我很高兴我没有改变我的决定,因为用 ORM 编写任何东西都会使困难的事情变得更加复杂。
∞.结论
这篇小笔记与 ML/NLP 算法解释及其性能讨论无关,但我仍然觉得它很有用。我希望在开始从事这个项目之前,我知道上面描述的所有陈述,但我也确信,只有在花费一些痛苦的时间修复错误和寻找实际问题之后,其中一些陈述才会变得清晰易懂。
在使用 GPU 加速深度学习应用程序之前,需要思考 7 点
Deep Learning and GPUs
介绍
鉴于围绕其加速的宣传,使用GPU进行深度学习训练和推理是很有诱惑力的。然而,为了有效地使用这些资源,更深入地了解加速的来源是很重要的。在本文中,我们将研究一个典型的 DL 应用程序的性能依赖性。我们将使用英伟达的大肆宣传的机器 DGX-1 作为例子,但以下几点是通用的,足以适用于通用 GPU 或 TPU。
1.五金器具
底层硬件规格在决定 DL 加速方面起着最重要的作用。对于典型的 DL 应用程序来说,拥有一个快速的硬件并不能自动转化为最好的加速,除非你非常小心。
2.数据传送
由于 DL 应用程序执行数据密集型操作,因此在训练和推理过程中理解硬件组件之间的数据流非常重要。今天的高档机器中的数据传输范围从网络上的几千兆字节/秒到 GPU 集团内的超过 100 千兆字节/秒。这可能会对 DL 应用程序的性能产生高达 100 倍的影响。例如,采用 nVLink 的特斯拉 P-100 架构允许 GPU 之间的数据传输速度高达 160GB/s,同时,它可以通过 HDD/SSD、NIC 或 RAM 接口来降低速度。
记住这一点很有帮助,数据传输链的速度与其最慢的链路一样快。下面是数据传输所依赖的速度的组成部分。
- 硬盘驱动器或 HDD(典型速度 100MB/s)
- 固态硬盘或 SSD(典型速度 500MB/s)
- PCI express 5(典型速度 4GB/s-60GB/s)
- 网络接口卡(典型速度 16Gb/s)
3.基础设施软件
基础设施软件包括以下选项
- 操作系统: Ubuntu 14.04 LTS 依然是热门选择。在将机器用于 DL 应用程序之前,请确保删除未使用的守护程序和服务(例如 ftp、防火墙等)。
- 编程语言和 DL 框架: Python 和支持多线程的 Tensorflow 是一个流行的组合。深度学习库中对优化算法(如 Allreduce、Parameter-Server & Worker 等)的本机支持可以平衡数据管道,这对于利用快速硬件有很大帮助。其他值得一提的流行 DL 库有 Caffe 、 CNTK 和 pyTorch 。
4.深度学习模型
如果您使用现成的深度学习模型(如 VGG16、resNet50 等)进行推理,请考虑使用针对您选择的深度学习库优化的版本,以确保神经网络结构针对效率进行了优化。Tensorflow 社区继续支持新的 DL 模型,以实现更大的利益。你可以在这里访问它们。
5.数据集
数据集或样本的大小是一个重要的指标。一般来说,现实生活中的数据要比数据挖掘应用程序所需的数据大几个数量级。例如,VGG-16 仅拍摄 224x224 像素的图像,而典型的手机相机则拍摄 4000x3000 像素的图像。与在训练循环或推断中避免不必要的带宽消耗相反,在此之前减少一次大小是值得的。
6.培养
对 DL 训练原语和分发策略的原生 GPU 支持使得 DL 开发人员工作效率更高。
样本 DL 训练原语包括池化、批量标准化、丢弃、ReLU、Sigmoid、Softmax 等
分发策略涵盖镜像策略、PS-worker、All reduce 等技术。
分布式风味的反向传播算法如自动微分对计算效率起着至关重要的作用。
确保像 nVidia 和 AMD 这样的 GPU 提供商为你选择的深度学习库提供支持是很重要的。nVidia 为 DL 训练原语提供了成熟的 cuDNN,而 AMD 的 ROCM 还有很多需要赶上。
7.推理
DL 推断可能会拖累大型 DL 模型,如 resNet152 ,并且可以在生产模式中使用 GPU。推理优化包括以下两种方法。
层和张量融合改变图的结构,在不影响输出精度的情况下提高推理性能。
精度校准降低神经元精度(从 FP32 到 FP24、FP16 或 INT8)会对 DL 模型精度产生不利影响,因此必须谨慎使用。
摘要
下图总结了我们上面讨论的 7 点。
信用
这些数据大部分是为《设计自动化中的机器智能》这本书收集的。
7 个实用的深度学习技巧
想获得灵感?快来加入我的 超级行情快讯 。😎
深度学习已经成为解决许多具有挑战性的现实世界问题的首选方法。对于物体检测、语音识别和语言翻译来说,这是迄今为止性能最好的方法。许多人将深度神经网络(DNNs)视为神奇的黑匣子,我们将一堆数据放入其中,然后我们的解决方案就出来了!实际上,事情实际上会变得复杂得多…
在针对特定问题设计和应用 DNN 时,可能会面临一系列挑战。为了达到实际应用所需的性能标准,管道中所有阶段的正确设计和执行至关重要,包括数据准备、网络设计、训练和推理。在这里,我将与你分享 7 个实用技巧,让你最大限度地利用你的深层神经网络。
1 —数据,数据,数据
这不是什么大秘密。一直运行良好的深度学习机器需要燃料——大量的燃料;这种燃料就是数据。我们拥有的标签 数据越多,我们的模型表现就越好。更多的数据导致更好的性能的想法甚至已经被谷歌用 3 亿张图像的数据集进行了大规模的探索!
当在现实世界的应用中部署深度学习模型时,你应该不断地向它提供更多的数据并进行微调,以继续提高它的性能。下图很好地说明了这将如何影响你的准确性。传统的机器学习算法达到了早期饱和点,超过这个饱和点,更多的数据就没有帮助了(蓝线)。另一方面,深度学习可以带你走得更远,获得更多数据(红线)。
喂野兽:如果你想提高你的模型的性能,获得更多的数据!
Increasing data consistently yields better performance
2 —您应该使用哪种优化器?
多年来,已经开发了许多梯度下降优化算法,并且每个算法都有其优点和缺点。一些最受欢迎的包括:
- 带动量的随机梯度下降(SGD)
- 圣经》和《古兰经》传统中)亚当(人类第一人的名字
- RMSprop
- 阿达德尔塔
RMSprop、Adadelta 和 Adam 被认为是自适应优化算法,因为它们自动更新学习率。使用 SGD,您必须手动选择学习率和动量参数,通常学习率会随时间衰减。
实际上,自适应优化器往往比 SGD 收敛得更快;但是,他们最后的表现通常会稍差一些。SGD 通常可以获得更好的最小值,从而获得更好的最终精度,但是它可能比某些优化器花费更长的时间。它还更加依赖于一个健壮的初始化和学习率衰减时间表,这在实践中很难调整。
因此,如果你需要一些快速的结果,或者只是想测试一种新的技术,那么就使用自适应优化器。我发现 Adam 非常容易使用,因为它对你选择完美的学习速度并不敏感。如果你想要绝对最好的最终性能,使用 SGD + Momentum 并使用学习率、衰减和动量值来最大化性能。
两全其美
最近的研究表明,你可以两全其美:通过从 Adam 切换到 SGD 进行高速训练和顶级表现!这个想法是,训练的早期阶段实际上是 SGD 对参数调整和初始化非常敏感的时候。因此,我们可以通过使用 Adam 开始我们的训练,这将使您走得很远,而不必担心初始化和参数调整。然后,一旦亚当让我们滚动,我们可以切换到 SGD +动量优化,以实现最佳性能!论文中的关键数字如下所示,展示了如何通过这种技术来提高精确度。
Adam vs SGD performance. Adam performs better at the beginning due to robustness and adaptive learning rate, while SGD reaches a better global minimum in the end.
3—如何处理不平衡的数据
在很多情况下,你会处理不平衡的 数据,尤其是在现实世界的应用中。举一个简单但真实的例子:出于安全原因,你正在训练你的深层网络来预测视频中的某人是否持有致命武器。但是在你的训练数据里,你只有 50 个拿武器的人的视频,1000 个没拿武器的人的视频!如果你只是用这些数据马上训练你的网络,你的模型肯定会高度偏向于预测没有人曾经拥有过武器!
你可以做一些事情来解决这个问题:
- 在损失函数中使用类 权重。本质上,代表不足的类别在损失函数中接收更高的权重,使得该特定类别的任何错误分类将导致损失函数中非常高的误差。
- 过采样:重复一些包含代表性不足的类的训练示例有助于均衡分布。如果可用数据很少,这种方法效果最好。
- 欠采样:您可以简单地跳过一些包含过度表示类的训练示例。如果可用数据非常大,这种方法效果最好。
- 少数民族阶层的数据扩充。你可以为代表性不足的班级综合创造更多的训练范例!例如,在前面检测致命武器的例子中,你可以改变视频的一些颜色和灯光,这些视频属于拥有致命武器的类别。
4 —迁移学习
正如我们在第一个技巧中看到的,深度网络需要大量数据。不幸的是,对于许多新的应用程序来说,这些数据很难获得,而且获取成本很高。如果我们希望我们的模型表现良好,我们可能需要数万或数十万个新的训练样本来进行训练。如果一个数据集不容易得到,它必须全部收集起来并手工标记为**。**
这就是迁移学习发挥作用的地方。有了迁移学习,我们就不需要很多数据了!这个想法是从一个之前在数百万张图像上训练过的网络开始,比如在 ImageNet 上预先训练过的 ResNet 。然后,我们将通过只重新训练最后几层而不去管其他层来微调 ResNet 模型。通过这种方式,我们获得了 ResNet 从数百万张图像中获得的信息(图像特征),并对其进行了微调,以便我们可以将其应用于不同的任务。这是可能的,因为跨域的图像的特征信息通常非常相似,但是对这些特征的分析可以根据应用而不同。整个过程如下图所示,它展示了我们如何获取源模型的特性,并将其作为全新目标模型的起点。
A basic transfer learning pipeline
5 —快速简单的数据扩充,以提高性能
我们已经说过几次了:更多的数据=更好的性能。除了迁移学习,另一种提高模型性能的快速简单的方法是数据扩充。数据扩充包括通过改变来自数据集的一些原始图像,同时使用原始类别标签来生成合成训练样本。例如,图像数据扩充的常见方式包括:
- 水平和垂直旋转和/或翻转图像
- 改变图像的亮度和颜色
- 随机模糊图像
- 从图像中随机裁剪补丁
基本上,你可以进行任何改变图像外观的改变,但不能改变整体内容,也就是说,你可以把一张狗的图片变成蓝色,但你仍然可以清楚地看到这是一张狗的图片。下图来自 imgaug 库,显示了许多你可能想要尝试的图像增强选项,以提高你的模型的准确性。
Data augmentation galore!
6-用合奏来提升你的模型!
在机器学习中,集合训练多个模型,然后将它们组合在一起,以实现更高的性能。因此,想法是在相同的数据集上对相同的任务训练多个深度网络模型。然后可以通过投票方案将模型的结果结合起来,即票数最高的类别获胜。
为了确保所有模型都是不同的,可以使用随机权重初始化和随机数据增加。众所周知,集合通常比单个模型更精确,这是由于使用了多个模型,因此从不同的角度处理任务。在现实世界的应用中,尤其是挑战或比赛,几乎所有的顶级模型都使用系综。集成的一般要点如下所示,其中 3 个不同分类模型的输出被组合在一起。
Ensemble models
7 —通过修剪加快速度
我们知道模型精度随着深度增加,但是速度呢?层数越多意味着参数越多,参数越多意味着计算越多,内存消耗越大,速度越慢。理想情况下,我们希望在提高速度的同时保持高精度。我们可以通过修剪来做到这一点。
这个想法是,在网络的许多参数中,有些参数是冗余的,对输出没有太大贡献。如果你可以根据神经元的贡献大小对网络中的神经元进行排序,那么你就可以从网络中移除排序较低的神经元,从而形成一个更小、更快的网络。可以根据神经元权重的 L1/L2 均值、它们的平均激活度、某个验证集上神经元不为零的次数以及其他创造性方法来进行排序。获得更快/更小的网络对于在移动设备上运行深度学习网络很重要。
修剪网络的最基本方法是简单地丢弃某些卷积滤波器。这在最近的论文中做得相当成功。这项工作中的神经元排序相当简单:它是每个过滤器权重的 L1 范数。在每次修剪迭代中,他们对所有的过滤器进行排序,在所有层中全局地修剪 m 个最低排序的过滤器,重新训练并重复!
另一篇最近发表的论文提出了修剪过滤器的关键见解,该论文分析了残差网络的结构。作者表明,当删除图层时,具有残余快捷连接的网络(如 ResNets)在保持良好的准确性方面远比不使用任何快捷连接的网络(如 VGG 或 AlexNet)更强大。这一有趣的发现具有很大的实际意义,因为它告诉我们,在为部署和应用而修剪网络时,网络设计至关重要。).所以用最新最棒的方法总是好的!
这是一个总结!
这就是你深度学习的 7 个实用技巧!
喜欢学习?
在推特上关注我,我会在那里发布所有最新最棒的人工智能、技术和科学!
给数据科学领导者的 7 条建议(游戏行业)
在游戏行业的不同数据团队工作了五年后,我最近决定加入金融行业的一家初创公司。虽然许多数据团队被分配了大量的资源,但将研究结果实际投入生产并产生面向客户的影响通常具有挑战性。根据我在 Twitch、Electronic Arts 和 Daybreak Games 的经验,我对数据科学团队的领导者有以下建议:
- 为数据科学家角色设定现实的期望
- 提供一个分享结果的论坛
- 定义产品化模型的过程
- 鼓励数据科学家提交 PRs
- 通过 MBR 避免死亡
- 提供如何升级为 IC 的路线图
- 为可重复研究设置工具
我将在下面更详细地讨论每一点,并从我的经验中突出例子。
为数据科学家角色设定现实的期望 为数据科学家将在您的团队中执行的项目类型和日常工作设定明确的期望非常重要。数据科学是一个广泛使用的术语,向候选人明确定义该角色非常重要,最好是在第一次电话面试时。当谈论即将到来的项目时,有点前瞻性是可以的,但对你的团队今天执行的工作类型持现实态度也是必要的。如果您团队的大部分时间都花在诸如仪表板、数据工程和编写跟踪规范等任务上,那么可能就没有多少时间用于建模和构建数据产品了。如果你向候选人推销一个角色的有趣建模工作,而他们的大部分时间都花在了其他工作上,你可能很难留住数据科学家。
我在游戏行业看到的最好的例子是,一名候选人在面试电子艺界数据科学团队的一个角色,该团队专注于核心项目,而不是与游戏工作室合作。该候选人对嵌入游戏团队更感兴趣,基于这一反馈,他被一个嵌入式分析团队聘用。
提供分享成果的论坛 数据科学家应该有一个在公司内部和外部分享工作的平台。理想情况下,数据科学家应该与产品团队密切合作,并经常向产品团队的领导提供更新。让数据科学团队有渠道向更广泛的受众传播他们的工作也很有用。
在 Twitch,我们通过编写长格式报告并将报告发送到一个广泛的电子邮件分发列表来实现这一点。这种方法效果很好,但是需要研究报告在共享之前达到一个很高的标准,并且不是所有的相关方都在分发列表上。在电子艺界,跨团队分享成果通常是通过会议和内部活动来完成的,比如 EA Dev Con 。我工作过的所有游戏公司都对在会议上对外展示作品持开放态度,比如 GDC 和 userR!我的建议是,数据科学团队应该有一个不需要开会,也不需要采取桌面形式的成果共享平台。
定义产品化模型的流程 作为游戏行业的数据科学家,我面临的最大挑战之一是将预测模型投入生产。也许可以在相对较短的时间内为一款游戏建立一个流失预测模型,但需要几个月的时间与多个团队协调,才能让这个模型面向客户,例如向可能流失的用户发送电子邮件。我之前在的博客上谈到了 Twitch 的科学团队应用于产品化模型的一些方法,但这些项目都是一次性的,没有一个新的数据科学家如何与产品团队合作来扩大模型的蓝图。对我工作过的大多数团队来说,将模型产品化一直是个问题,因为数据科学团队通常没有数据管道的所有权,并且经常无法访问这个管道中的许多组件。
为了改进这一流程,数据科学团队应该为如何在生产中移交或拥有模型定义一个清晰的流程,以便新的数据科学家不必定义他们自己的方法。对于数据科学家来说,与工程团队密切合作并更多地参与创作生产代码也很有帮助。我在产品化模型方面的最佳经历是在 Daybreak Games 工作,在那里我负责为 DC Universe Online 拥有一个客户流失模型,并帮助设计 EverQuest Landmark 市场的推荐系统。
鼓励数据科学家提交 PRs 与最后一点相关,数据科学家在将模型投入生产时应该更加亲力亲为。数据科学家不应该将 R 或 Python 代码交给需要将其翻译成 Java 或 Go 的工程团队,而是应该做更多让模型在生产系统上运行所需的工作。在我目前的角色中,我负责将我的 R 脚本翻译成代码,作为我们数据流过程的一部分运行。我提交拉动式请求,由我们的工程团队审查,然后部署到生产中。另一种可以使用的方法是使用中间模型格式,比如 PMML ,这简化了不同语言之间的模型翻译过程。
我所在的大多数数据科学团队都使用版本控制来支持工作并鼓励数据科学家之间的协作。然而,我很少能够访问工程团队的存储库。有几次数据科学家在 Twitch 提交 PRs,但这并不被认为是该角色的核心职能。这一建议并不适用于所有的数据科学角色和团队,但我会鼓励正在构建数据产品的团队这样做。
避免死于 MBR 数据科学团队面临的另一个挑战是被每月业务回顾(MBR)或其他定期召开的指标审查会议淹没。如果您没有商业智能或分析团队,那么大部分责任可能会落在数据科学团队身上。我发现让数据科学家参与定义跨公司的业务指标通常是好的,但是如果每个业务部门都需要定制指标来跟踪结果,这很快就会变得难以承受。使用自动化报告有助于解决这个问题,但如果指标不断变化,或者数据科学需要为 MBR 编写叙述,这可能会成为一个巨大的时间陷阱。
我见过的最好的 MBR 方法是在黎明游戏。我们确定了一些指标来跟踪我们的游戏,在 Tableau 中自动生成报告,直接查看报告,而不是在会议上复制到 PowerPoint 中,并让游戏制作人负责编写关于指标上升或下降原因的叙述。
提供如何晋升为 IC 的路线图 如果你声称拥有一个双重职业阶梯,数据科学家可以通过个人贡献(IC)继续推进他们的职业发展,那么你应该提供一个切实可行的晋升途径。团队中有高水平的 IC 是一个很好的指标,表明你可以在不担任管理角色的情况下继续发展你的职业生涯,但应该有一套明确的标准,员工可以关注这些标准以获得晋升。使这条道路成为可能的一种方法是,确定个人贡献者可以在他们的直接团队之外增加其影响力的方法。
电子艺界是我在游戏行业经历的最好的例子。分析团队有一个工作-家庭矩阵,该矩阵确定了不同分析角色需要满足的标准以及在角色内提升的标准。EA 还举办了一些活动,数据科学家可以在这些活动中分享工作,并与业务部门以外的团队建立影响。
为可重现的研究设置工具 数据科学领导者应该定义一个流程和一组共享的工具,以便数据科学家完成的工作可以在以后由其他团队成员重现。实现这一目标的挑战之一是不同的团队成员可能使用不同的脚本语言,并在不同的环境中工作。我目前解决这个问题的方法是设置支持 R 内核的 Jupyter 笔记本,因为这满足了我当前团队的脚本需求。然而,这并没有直接解决凭证管理和存储中间数据结果的问题。
在 EA,我们通过编写一个内部 R 包来实现这个目标,这个包提供了跨不同数据仓库获取和存储数据的实用函数。我们还为想要创作 Scala 脚本的数据科学家建立了共享的 Zeppelin 笔记本。我的建议是使用笔记本环境,为常见的数据任务创建库,使用提供凭证管理的工具(例如 Secret ),并为存储来自脚本的中间数据结果提供一个暂存区。此外,Airbnb 的 knowledge repo 等工具对于实现这一目标非常有用。
虽然游戏行业中的大多数数据科学团队能够勾选这些框中的几个,但我认为大多数高效团队已经遵循了这些指南中的大部分。
7 为想学习数据科学的人提供的资源
有时候你只需要一点动力就能开始。以下是对我有效的方法。
Src: https://tinyurl.com/y7bgtyjo
数据科学是通过与计算机、数学、人打交道而获得的多种技能和经验的自然结果…有些人会在多年的经历中自然地发展这些技能。我的数据科学之旅始于 14 年前(我将在 2022 年 11 月更新这篇文章),因此我决定汇编 7 大资源,我认为这是点燃我对该领域的兴趣和理解的第一步。下面的资源将产生处理所涉及的数据和科学所需的兴趣和直觉。这不是一个明确的指南,因为有多种方法可以让你成为数据科学家,但以下是对我有用的方法。
Source: https://timoelliott.com/blog/
一点背景知识
约翰·霍普金斯大学彭博公共卫生学院教授杰夫·莱克(Jeff Leek)5 年前写道:“数据科学的关键词不是‘数据’;是‘科学’。只有当数据被用来回答一个问题时,数据科学才有用。这是等式的科学部分。这种数据科学观点的问题在于,它比关注数据大小或工具的观点要难得多。计算数据集的大小并说‘我的数据比你的大’或者说‘我能在 Hadoop 中编码,你能吗?’而不是说,‘我有一个非常难的问题,我能用我的数据回答它吗?’。"
数据科学是古老的。John Graunt 在天气凉爽的时候做了这件事。真的很酷。正是在十五世纪的小冰期,他开发了第一批使用概率模型的人口学著作之一。到 1960 年,这一学科已经非常成熟,被称为 数据学 ,,但直到 2012 年《哈佛商业评论》发表了文章《数据科学家:21 世纪最性感的工作》后,这一术语和工作才变得越来越流行。关于这个主题的大量在线课程将在两年后推出。谷歌趋势显示了一些有趣的东西:尽管“统计学家”一词自 2004 年以来呈下降趋势,但在 HBR 的文章发表后,“数据科学家”一词出现了更强的积极趋势,当在线课程增加时,它得到了提振。
https://trends.google.com/trends/explore?date=all&q=Data%20Scientist,%2Fm%2F0c_xl
考虑到这一点,我需要澄清一点:数据科学家不是统计学家,他们也不会取代统计学家(反之亦然),但对统计和数学的真正兴趣是正确的数据科学的关键。
Img source: https://towardsdatascience.com/introduction-to-statistics-e9d72d818745
你喜欢列表吗?
简而言之,这 7 种资源是:
- 列纳德·蒙洛迪诺所著《酒鬼之行》
- 机器学习课程,由斯坦福大学创建,由吴恩达博士教授
- 《数学思维导论》,也是斯坦福大学的,由基思·德夫林教授
- 编码
- 对数学的不带偏见的评论
- 人
- 有兴趣的话题
这个列表既不是按时间顺序排列的,也不是按高潮顺序排列的。许多这样的事情会同时发生,第 4 到第 7 项几乎肯定会成为你作为数据科学家的日常工作的一部分。
让我们进入细节…
酒鬼的走路姿势
多年前(2009 年?)当我得到这本书作为秘密圣诞礼物时,我并没有留下深刻的印象,但它却是我一直最喜欢的书之一。
根据亚马逊的产品描述,是关于理解随机性对我们生活的影响,并“揭示了阻止我们理解从选股到品酒的一切事物的心理错觉”。
它启发我认识到一个人是多么容易成为机遇的受害者,并理解为什么解释导致某一事件发生的所有因素比预测类似事件何时或是否会再次发生要简单得多。
从分析的角度来看,这本书显示了预测模型的重要性,并展示了统计分析背后的历史,还显示了数据如何可以用来回答困难的问题,以及这些问题中的一些如何将仍然没有答案。我记得这是我第一次接触“数据科学”。
同样风格的另一本好书:[赖以生存的算法:人类决策的计算机科学](http://Algorithms to Live by: The Computer Science of Human Decisions)。
Representation of a random walk. Src: http://cu.t-ads.org/python-intro-02-random-walk/drunkard/
机器学习
这是斯坦福大学在 Coursera 上提供的课程,是许多机器学习的入门课程。它是我的。本课程有趣、简洁,并提供良好的理论基础。
它首先给你一个线性代数的关键概念的修订,并教你基本的 Matlab(或 Octave)编程。将介绍一元回归的最初概念。本课程的后续部分将带你了解有趣的部分,如主成分分析和神经网络,但如果你认真地通过适当的复习、参加测验和掌握课程之外的概念来学习,这肯定会培养你的直觉,并教会你关键的人工制品和机器学习中使用的数学。本课程将帮助你建立坚实的基础,并为你学习更高级的概念做好准备。
Example slide from the course. Source: https://tinyurl.com/ybupqzzb
数学思维入门
早在 2008 年,我在大学选修了离散数学,我非常喜欢它!它教会你用数学和逻辑来思考,用数学来表达。在大学期间,我在这门课程上表现得非常好……尽管如此,我还是决定利用斯坦福大学通过 Coursera 提供的这门课程来复习核心概念和提高技能。这门课程涵盖了我在第一学期所看到的部分内容,并且提高了我的分析思考能力。对很多人来说,它很容易成为一种新的范式,因为课程中提出的数学思维与普通的推理过程有很大的不同,尤其是普通书面语言的推理过程。此外,最后几节课在数学验证方面会变得相当具有挑战性。不可避免地,这会让你想学一门新的口语。
你不会介意学习这种“新语言”,因为批判性思维对数据科学至关重要。本课程的一个重要补充(或无痛替代)是掌握常见谬误的概念,以在探索性数据分析或从数据中获得洞察力等过程中避免或检测它们。这里有一个谬误列表。
*综上所述,我相信一个优秀的数据科学家会对“数学思维”产生兴趣,以了解如何交流数学概念,并在必要时将思想表达为方程,或者将数学方程表达为无懈可击的可执行步骤。**在我面对的许多场合,知道如何建立一个逻辑论证比方法和数学正确更重要。*事实上,与我共事过的最好的数据科学家知道如何构建论点,并掌握口才艺术。
*[## 逻辑谬误总表
utminers.utep.edu/omwilliamson/emgl1311
utminers.utep.edu](http://utminers.utep.edu/omwilliamson/ENGL1311/fallacies.htm)*
Dilbert listing some common components in fallacies. Src: https://tinyurl.com/y97w2oej
编码
首先,不管你的职业选择是什么,你都应该学会如何编码。它在许多领域都很有用,可以让你的生活变得更加方便和有趣!
的确,我们可能不再需要任何关于预测或聚类的更简单的数据科学例程的编码,因为诸如 Alteryx 、 Azure Studio 、datatai ku、 H2O.ai 或 Knime 等平台大大减少了编码工作。然而,编码和通用框架方面的专业知识仍将是(并且在很长一段时间内)保持信心、生产力和精确度的重要资产,这将带来可维护的工作流,特别是在处理大量数据或机器学习的实时应用程序或开发新模型时。
开始时,您的典型问题是“我如何将这个 csv 读入数据框?我如何做简单的可视化?如何将所有分类值转换成数值?我该如何处理这个多索引数据集?”然后,在某个时候,你会进展到这样的事情“这个优化器的学习率的批量大小的选择会导致一个好的损失吗?”或者甚至像“使用 KL-Divergence 来评估这个模型有意义吗?”或者“在这种情况下,我应该使用正常-正常-反伽马共轭吗?”
A simple command with Seaborn can help you build nice visualisations (own source)
幸运的是,你有大量的选择来处理这些问题和挑战:更有经验的人和可靠的在线论坛(比如 Pytorch 的社区论坛,它很棒)。
就编程语言而言,我推荐 Python 入门,因为它易于学习,在数据科学家中很受欢迎,并且有大量的库,如 Pandas、Numpy 和 Matplotlib,用于处理数据准备、争论和可视化,还有像 Tensorflow 这样的框架,除了许多好处外,它还允许您毫无争议地利用 GPU 处理。
我在 2022 年回顾这篇博客,我也相信 JAX 是一个很好的学习框架。
另一个常见的途径是通过 R(编程语言)。是的,对于你来说,用 Python 进入“数据科学”可能需要更长的时间,而 R 将带你进入统计建模,而不用费什么周折。另一方面,Python 将让您更好地理解数据科学之外以及其他编程语言(如 C++或 Java)中常用的编程原则。无论你选择哪一个,你都会很好。
编辑:现在是 2020 年。我现在成了茱莉亚(【https://julialang.org/】)的粉丝
编辑:现在是 2022 年。我不再使用朱莉娅(!)
另一个很好的资源是 Gareth James 的《统计学习及其应用介绍》。这本书可以在链接中公开获得,它涵盖了 R 编程的统计概念。如果线性代数让你感到害怕,这将是一个挑战(你将在第 10 页上面对它)。无论您做出何种选择,您都需要…
…一篇不带偏见的数学评论
我在大学里努力学习,成绩非常好,但直到 2013 年——或多或少,当我决定在未来的某个时候攻读硕士学位时——我才意识到有多少基本概念已经过时和无力。因为我很想考上硕士,所以我决定在对数学一无所知的情况下学习,这样我就可以回到基础,而不会为此感到难过。有趣的是:我是从看儿童减法和加法的视频开始的。
几周后,我转向了数据科学和机器学习的基石:高等线性代数、微积分和概率论。尽管这并不是所有类型的数据科学家最终都需要的(只有优秀的数据科学家才需要!),理解例如主成分分析实际上在做什么是极其有用的。理解数据科学背后的数学至少可以在你讲故事的过程中给你很大的帮助。
Plot of 2 clusters upon 3 Principal Components (own source). Maths intuition helps in interpreting this
编辑:现在是 2020 年,我强烈推荐https://www . coursera . org/specializations/mathematics-machine-learning
编辑:现在是 2022 年,我强烈建议一直学习数学。我正在冒险进入生命科学领域的贝叶斯概率建模中更复杂的主题。太牛逼了。
人
数据科学可能需要你坐下来,键入看似无穷无尽的代码行,并在任何有见地的输出之前(或者直到你的交叉熵损失函数输出一个接近于零的数字)进行数周或数月的功能工程。一个人如果不能解释至少在高层次的理解上正在做什么以及为什么这样做,就不能充分享受它的美。最重要的是,你首先需要对你试图解决的问题有一个清晰的定义,如果你不和别人交流,你可能会做出错误的假设。
与人良好互动将是你作为数据科学家职业生涯的最大推动力之一。在过去的许多年里,不同的人帮助我发现了更聪明的方法来完成我的工作,做出职业决策,应对大公司的政治挑战…一个单独工作的数据科学家可能会错过这个职业中最好的东西。
假设你是一名在电子商务公司工作的数据科学家,他向你简要介绍了“欺诈性信用卡交易的突然增加”。尽管你可能已经知道了一些方法,但你仍然对这个问题毫无头绪。一个新手的错误是直接进入分类或聚类模型,仅仅因为“欺诈”这个词诱使你这样做…探索性数据分析可以在开始时帮助你,但关键问题仍然没有答案:分析什么,从哪里开始,最终目标是什么,以及如何衡量你的工作的影响。你可能最终会发现原来的问题实际上是最新网站版本中的一个 bug,这是你不需要花里胡哨的数据科学著作就能发现的。
显然,一个人在特定领域越有经验,就越容易通过支持数据来准备、建模和可视化问题,并提出解决方案来提高生产率或效率。不可避免的是,即使是最资深的数据科学家也必须在人们面临新挑战时与他们交谈。
从更有经验的人(无论是在技术领域还是在商业领域)那里获取想法真的很有用,在很多情况下是一条很大的捷径。您还可以结识来自各个角落的人,分享经验,参加黑客马拉松和聚会,因为世界上大多数主要城市都会举办这种活动。关键的想法是交流、学习和分享,绝对没有理由被孤立。
感兴趣的话题
编辑 2022: 结合我作为数据科学家的职业生涯,我发现的第一个感兴趣的话题是“非正统和正统经济学”。这是哲学和数学,我真的很喜欢它。现在我最感兴趣的是生命科学(基因组学、蛋白质组学和生物科学)和基础数学方法。感兴趣的主题可能会随着时间的推移而改变,但我意识到对给定主题的兴趣对于数据科学家来说至关重要。你对一个话题越感兴趣,就越容易成为一名优秀的数据科学家。听起来显而易见,但我花了几个月的时间在一个我讨厌的主题上做数据科学家…我做得很好,但成本很高,因为我没有兴趣在工作之外阅读这个主题。另一方面,在我的空闲时间,我一直在呼吸、进食和观察生物数据和概率图形模型……在我目前的工作中,这产生了很大的不同。
当我开始我的职业生涯时,对经济学的强烈兴趣“弹射”到我的第一份工作中,因为我知道我在说什么,我知道如何进行分析和建立模型来解释我所理解的东西。多年来,我的兴趣领域转移到生物学,今天我必须表达自己并建立关于生物系统而不是经济系统的模型。如果你想开始,选择一个感兴趣的话题作为起点会有很大的不同。
编辑:现在是 2020 年,自从 2018 年写完这篇博客后,我开始在其他领域冒险,比如自然语言处理、计算机视觉甚至强化学习。
Data Science is more than algorithms. Src: https://xkcd.com/1831/
一般想法
选择一个地方开始可能会令人生畏,今天我们有太多的选择和无数像这样的帖子。2018 年我最初写这个帖子的时候,数据科学已经很热但是没有 2022 年那么热。回到 2009 年,当我开始这段旅程时,很难做出决定和获得建议,所以我希望这些经历可以帮助你找到一些资源来开始。
如果你想成为一名伟大的数据科学家,我的“秘诀”是:
- 选择一个感兴趣的话题(化学、经济、生物、游戏、体育……),并对此进行大量思考。了解一下。小心点。做梦吧。
- 通过 LinkedIn 和与你分享兴趣话题的人联系,见面…问你的朋友他们是否认识这个领域的人。与教授、研究人员联系。向他们提问,从“如何在这个领域起步”到如何作为一名数据科学家处理问题。
- 熟悉在你感兴趣的主题中用来解决问题的模型、数学和方法。这些模型试图解决的问题是什么:是数据质量的问题,是预测未来的事情,还是对事情进行分类?现有模型的局限性是什么?
想听更多关于数据科学和人工智能的知识吗?
7 零售分析趋势塑造行业(信息图)
随着全球越来越多的零售商从使用 BI 和分析平台及服务中获得巨大回报,零售分析解决方案的采用率正在快速增长。因此,毫不奇怪,全球零售分析市场预计将在 2015-2020 年间翻一番,到 2020 年总额将达到 51 亿美元。
随着对机器学习和颠覆性创新的日益关注,零售领域正在不断发展。例如,Sailthru 在其报告中透露,在 2017 年和接下来的几年里,零售商打算利用人工智能能力来提升他们的营销游戏。
也就是说,下面是 BRIDGEi2i 的信息图,强调了影响行业并将在未来几年继续占据显著地位的最大零售分析趋势。
(首发于 BRIDGEi2i 博客 )。)
7 个短期人工智能伦理问题
当新技术变得广泛传播时,它们通常会引发伦理问题。例如:
- 武器——应该允许谁拥有武器?
- 印刷机——应该允许出版什么?
- 无人机——应该允许它们去哪里?
这些问题的答案通常是在技术变得足够普遍以至于实际出现问题之后。随着我们的技术变得越来越强大,新技术带来的潜在危害也会越来越大。我认为,面对新的技术危险,我们必须从被动的反应转变为主动的 T2。
我们需要在到来之前开始识别我们的技术的伦理问题和可能的影响。鉴于技术以指数级的速度增长,我们考虑伦理问题的时间会越来越少。
我们需要就所有这些话题进行公开对话。这些是科学无法回答的问题——它们是关于我们价值观的问题。这是哲学的领域,不是科学。
尤其是人工智能引发了许多伦理问题——以下是我认为值得考虑的一些问题。我为那些想更深入了解的人提供了许多链接。
我只提供问题——作为一个社会,我们有责任找出最好的答案,并最终找到最好的立法。
1.算法中的偏差
机器学习算法从给定的训练数据中学习,而不考虑数据中任何不正确的假设。通过这种方式,这些算法可以反映甚至放大数据中存在的偏差。
例如,如果一个算法是根据种族主义或性别歧视的数据训练的,那么产生的预测也会反映这一点。一些现有的算法将黑人误标为“大猩猩”,或者向亚裔美国人收取更高的 SAT 辅导费用。试图避免像“种族”这样明显有问题的变量的算法,会发现越来越难以理清可能的种族替代物,比如邮政编码。算法已经被用于确定信用价值和雇佣,它们可能无法通过传统上用于确定歧视行为的不同影响测试。
我们如何确保算法是公平的,尤其是当它们被公司私有,并且不被公众监督的时候?我们如何平衡开放性和知识产权?
Using Twitter to call out Google’s algorithmic bias
2.算法的透明度
比公司不允许他们的算法被公开审查这一事实更令人担忧的是,一些算法甚至对它们的创造者来说也是晦涩难懂的。
深度学习是机器学习中一种快速发展的技术,可以做出非常好的预测,但不能真正解释为什么会做出任何特定的预测。
例如,一些算法已经被用于解雇教师,却无法给他们一个解释为什么模型显示他们应该被解雇。
我们如何平衡对更精确算法的需求和对受这些算法影响的人透明的需求?如果有必要,我们是否愿意牺牲准确性来换取透明度,就像欧洲新的通用数据保护条例可能做的那样?如果人类真的可能不知道他们行动的真实动机,我们应该要求机器在这方面比我们实际做得更好吗?
An algorithm that is much more transparent than deep learning
3.算法至上
前两个问题引起了类似但略有不同的关注。如果我们开始信任算法来做决定,谁将对重要的决定拥有最终决定权?会是人类,还是算法?
例如,一些算法已经被用于确定刑期。鉴于我们知道法官的判决会受到他们情绪的影响,一些人可能会认为应该用“机器人法官”来取代“T4”法官。然而,ProPublica 的一项研究发现,这些流行的判决算法之一对黑人有很大的偏见。为了找到一个“风险分数”,该算法使用关于被告熟人的输入,这些输入永远不会被接受为传统证据。
人们应该能够上诉,因为他们的法官不是人吗?如果人类法官和量刑算法都有偏差,我们该用哪个?最高法院未来的“机器人法官”应该扮演什么角色?
A case study from the ProPublica investigation into the COMPAS sentencing algorithm
4.假新闻和假视频
另一个伦理问题出现在(错误)信息的话题上。机器学习用于确定向不同观众展示什么内容。鉴于广告模式是大多数社交媒体平台的基础,屏幕时间被用作衡量成功的典型标准。鉴于人类更有可能接触更具煽动性的内容,有偏见的故事会像病毒一样传播。与此相关的是,我们即将使用 ML 工具来创建病毒式的假视频,这些视频如此逼真以至于人类无法将它们区分开来。
例如,最近的一项研究表明,假新闻比真新闻传播得更快。虚假新闻被转发的可能性比真实新闻高出 70%。有鉴于此,许多人试图利用假新闻来影响选举和政治观点。最近对《剑桥分析》的秘密调查拍到了他们吹嘘利用假新闻影响选举的录像带。
如果我们知道视频是可以伪造的,那么在法庭上我们会接受什么样的证据呢?我们如何才能减缓虚假信息的传播,谁来决定哪些新闻算“真”呢?
Left: real image of Parkland shooting survivor Emma González. Right: Fake image that went viral
5。致命自主武器系统
人工智能研究人员表示,我们将能够在不到十年的时间内创造出致命的自主武器系统。这可能是能够部署的小型无人机的形式,与目前的军用无人机不同,能够在没有人类批准的情况下做出杀人的决定。
例如,最近由人工智能研究人员制作的一个视频展示了小型自主无人机,即屠宰机器人,如何被用于杀害目标人群,即种族灭绝。近 4000 名人工智能/机器人研究人员签署了一封公开信,要求禁止攻击性自主武器。
当个别国家想要利用这些武器时,我们应该根据什么来禁止这些类型的武器?如果我们真的禁止这些,我们如何确保它不会驱使研究转入地下,导致个人自己创造这些?
还是来自《屠宰机器人》,点击图片观看完整视频。
6.无人驾驶汽车
谷歌、优步、特斯拉和许多其他公司正在加入这个快速增长的领域,但许多伦理问题仍然没有答案。
例如,最近一辆优步自动驾驶车辆在 2018 年 3 月撞死了一名行人。即使有紧急情况下的“安全司机”,他们也不够快,不能及时停下车。
随着自动驾驶汽车被更广泛地部署,当事故发生时,谁应该承担责任?应该是制造汽车的公司,在代码中犯了错误的工程师,应该被监视的操作员吗?如果一辆自动驾驶汽车开得太快,必须在撞人和坠崖之间做出选择,汽车该怎么办?(这是一个字面 台车问题)一旦自动驾驶汽车比一般人类司机安全(与一般人类司机比酒驾司机安全的比例相同)我们是否应该将人类驾驶定为非法?
A dashcam still from Uber’s self-driving accident
7.隐私 vs 监控
无处不在的安全摄像头和面部识别算法将围绕监控产生新的伦理问题。很快,摄像机将能够发现和跟踪街上的人。在面部识别之前,即使是 ominpresent 相机也考虑到了隐私,因为让人类一直观看所有镜头是不可能的。通过面部识别,算法可以更快地查看大量镜头。
例如,闭路电视摄像机已经开始在中国被用来监控公民的位置。一些警察甚至收到了面部识别眼镜,这种眼镜可以给他们在街上看到的人提供实时信息。
是否应该对这些技术的使用进行监管?鉴于社会变革往往始于对现状的挑战和非暴力反抗,圆形监狱会导致自由的丧失和社会变革吗?
Surveillance cameras in China using machine vision
有期限的哲学
现实中的人们目前正遭受这些技术的折磨:被不公平地跟踪、解雇、监禁,甚至被有偏见和难以理解的算法杀死。
我们需要在这些领域为人工智能找到适当的立法。但是,在社会形成意见之前,我们不能立法。在我们开始这些道德对话和辩论之前,我们不能有自己的观点。让我们开始吧。让我们养成习惯,在构思新技术的同时,开始思考道德含义。
另一篇:长期伦理问题
设计师婴儿
工作自动化
AGI 对齐
AI 权利
意识上传
实现数据科学家梦想工作的 7 个步骤
浏览数据科学面试流程
找工作很难。我最近经历了寻找数据科学家这一新角色的过程,我想通过几个关键技巧来帮助其他人成功实现他们作为数据科学家的梦想角色:
- 技巧一:找到自己想要的角色。
- 秘诀 2:找工作意味着应对拒绝。要坚持。
- 技巧三:学习统计学、机器学习、SQL、Python。
- 秘诀 4:如果你想要这份工作,就要超越自我。
- 提示 5:研究公司文化、人员和商业模式。
- 技巧 6:谈判和利用。
- 技巧 7:选择最适合你的角色。
- 额外:帮助您准备的有用资源
技巧一:找到自己想要的角色。
数据科学家这个头衔通常意味着不同公司的不同职责,有时这个头衔甚至意味着同一家公司内部的不同职责。AirBnB 的数据科学负责人讨论了他们在 AirBnB 中的三个数据科学家角色,这可能与其他公司不同。AirBnB 的数据科学家要么从事分析、算法,要么从事推理。
Dan Frank (Data Scientist at Coinbase) discusses the roles of Data Scientists at AirBnB
在 Lyft,他们将数据科学家的角色分为两组。研究复杂算法的数据科学家被称为研究数据科学家,这些算法与匹配骑手和驾驶员以及扩展这些系统相关。第二组数据科学家在内部被称为数据科学家,这是我申请和面试的一个角色。
从我与这个数据科学家团队的互动来看,他们在很大程度上扮演了产品数据科学家的角色,决定哪些指标对衡量产品的成功最重要,如何衡量这些指标,如何改进现有产品,以及追求哪些新产品。
我面试的其他公司的数据科学团队规模较小,角色也不太明确。在这些公司,我关心的是数据科学家试图为公司解决的问题。对我来说很重要的一点是,他们的系统已经到位,以确保这些公司的数据科学家的努力能够成功。
- 例如,他们是否已经雇佣了工程人才来收集必要的数据,以回答他们感兴趣的问题并构建数据科学产品?
- 领导层中是否有人创造了与数据科学应用相关的正确的宣传?
- 是否对构建某些数据科学应用程序的时间表有现实的预期,以及是否了解数据科学将如何集成到公司的各个组织中?
询问您(和您团队中的其他数据科学家)将如何对公司目标产生影响。
这些问题让公司了解你带来了什么,也让你了解他们对你的期望是什么。考虑到与*数据科学家这个头衔相关的技能的多样性,*你和你未来的雇主保持一致是很重要的。
秘诀 2:找工作意味着应对拒绝。要坚持。
一旦你完成了找出你应该申请的角色类型的过程,你就需要申请这些角色。以我的经验来看,从为某个职位提交的一堆申请中抽离出来是一项不可能完成的任务。
这并不意味着您可以跳过将您的申请输入到正在提交的申请堆中的步骤。
相反,这意味着除了提交申请之外,你还必须找到一个联系人。下面是 Udacity 招聘人员和招聘经理关于招聘的讨论;注意网络会出现几次,以及找到与空缺职位相关的招聘经理的重要性。具体来说,您可以查看时间戳 5:00–9:40(尽管这段视频对于您的入门非常有用)。
我发现一些有助于人际交往和获得推荐的资源:
- 【LinkedIn】:我联系了以前的同事、朋友和我网络中发布工作的其他人。
- AngelList :我在创业公司用天使名单搜索工作。
此外,我还利用以上两种方法找到与我申请的工作相关的招聘人员和招聘经理,与他们取得联系。你不要指望这些人会给你回复。然而,你应该向他们展示你是专业的、有礼貌的、坚持不懈的,如果你非常适合一个公开的职位,他们通常会做出回应。
如果你在你感兴趣的公司内部认识某人,利用你和那个人的关系,看看他们是否能了解你申请的职位。同时,不要损害你将来与个人合作的机会。如果他们认为你不合适, 感谢他们的时间继续 。
我们都经历过拒绝。下面是我收到的众多拒绝之一的例子。我选择了一个特别好的,因为它让我对我收到的所有拒绝感觉更好!有很多!
有些公司不会对你的申请做出回应,甚至在完成现场面试后也不会拒绝你。他们可能会让你处于一种不知情的状态。作为候选人,你的目标不是痛斥任何公司的面试过程。 你的目标是得到一份工作。保持专注。
面试进行到什么程度并不重要;如果一家公司认为你不合适,再次感谢他们的时间*。*
下面是 Greg Kamardt 的演讲,他现在是 Salesforce 的数据科学家。如果你认真并致力于你的求职,他有一些非常有用的技巧来建立一个与你的求职相关的漏斗。在视频的前 2 分钟,你可以了解格雷格的坚持能力。为了得到一份对他和公司都合适的工作,他能够承受拒绝。
你对这一领域的了解越多,你就越难进入这个领域。有些人很幸运,很快就得到一个角色,但我可以告诉你那是少数。对大多数人来说,找到一份工作意味着经历许多拒绝。你必须坚持*。*
技巧三:学习统计学、机器学习、SQL、Python。
一旦你成功吸引了一家对你的技能感兴趣的公司的注意,你就进入了我称之为“面试管道”的环节。大多数职位的筛选过程都遵循类似的模式。
- 初次电话面试
- 技术电话面试
- 带回家评估
- 现场面试
- 最终谈判电话
在这一部分的剩余部分,我将深入了解面试流程中每一部分的细节。如果你正在面试,这篇文章的这一部分可能与你最相关。
第一步:初次电话面试
候选人在面试过程中的第一个接触点通常是与招聘人员或招聘经理的非正式谈话。在这次谈话中,您将获得更多关于该职位的背景信息。你也会被告知面试过程的步骤。
在这个阶段,准备一些关于角色的问题以及关于公司的问题是很有用的。关于公司文化和价值观、团队中的个人以及特定角色的职责的问题都适合在这次面试中提出。
在面试结束时,您将为您的第一次技术电话面试设定日期和时间。电子邮件通常也包含这些信息。你应该确保对面试中给出的时间和解释心存感激,并让他们知道你期待着面试过程的下一步。
在这一点上,你希望对这个角色和加入公司更加兴奋。
第二步:技术电话面试
第二步,你很可能会被问到与统计学和机器学习相关的问题。重要的是,你不仅要得到有正确答案的问题,而且要清楚简洁地表达你的想法。
我被问及与贝叶斯统计、线性回归、解释分析结果和定义指标相关的问题。在许多情况下,问题简单明了。我被问到的问题没有技巧,但我听说过其他人有这样的经历,他们的问题需要一个特定的、巧妙的答案才能通过。
在我的面试案例中,面试官似乎在检查我是否具备处理数据的基础知识,以及我是否能够与非技术和技术受众沟通。这些公司通常将这些想法与他们自己的商业目标联系在一起,但有时这些问题你可以在一本书或博客的面试问题清单上找到。
下面我提供了几个与我回答的问题相似的问题。**
示例(a 部分):
你会如何向非技术员工描述线性回归和逻辑回归之间的区别?你可以选择提供一些例子来说明你什么时候会使用其中的一个来帮助你的描述。
可能答案(a 部分):
无论是线性回归还是逻辑回归,你都是用输入变量来预测某个输出变量。例如,您可以使用星期和月份来预测每天的销售额。销售额是输出变量,星期几和月份是输入变量。
此示例是一个使用线性回归的问题示例,因为输出变量(每天收集的销售额)是一个类似于年龄或身高的连续值。对于逻辑回归,逻辑回归中的输出变量通常只有两个可能的值。例如,我们可以使用逻辑回归来预测客户是否会购买某个特定的产品。
例子(b 部分): 从这个回归中,你会得到系数。你如何描述从这个模型中得到的系数。你知道对于逻辑回归模型,系数的解释会有什么不同吗?
可能答案(b 部分): 我选择日和月作为模型的输入,它们是分类变量。定量变量往往更容易解释。但是没关系。我们想把它们转换成一个数字,其中的顺序给出了日期的顺序,或者我们想把它们虚拟化。
假设我将它们虚拟化,那么其中一个值就是基线。对于一周中的每一天,基线可能是星期日。然后,这些系数将被附加到一周其他 6 天的虚拟变量上。如果星期一的系数是 12,这意味着在同一个月中,星期一的销售额预计比星期天高 12。如果星期二的系数是-15,这将意味着星期二的销售额预计比星期天少 15。它总是一天与基线的比较。
对于逻辑回归模型,响应是对数概率,而不仅仅是预测响应。通常取系数的指数,然后将结果值解释为 1 类与 0 类相比的几率的倍增变化。如果 1 是某人正在购物,12 是与星期一相关联的系数,那么 exp(12)将是在星期一与星期日的基线相比进行购物的几率的倍增变化。
举例(c 部分):
说明你的模型中的系数是如何计算的。是什么让这些值比每个系数的随机值更好呢?
可能的答案(c 部分): 实际上,通常是用系数的随机值来开始你的模型。然后使用梯度下降更新这些值。您可以将系数的更新视为以某种方式移动,从而最小化您想要最小化的任何误差。在回归分析中,误差通常是实际值和预测值的平方差之和。
然后,您可以将梯度下降视为一种算法,它通过多次迭代来改变系数,以小的方式降低损失函数(在这种情况下是实际值和预测值之间的平方差)。因此,在算法开始的时候,它们并不比 random 好。然而,在算法的最后,它们在最小化你感兴趣的任何损失函数方面会更好。
在本示例通知中,回答每个问题所用的语言。在回答问题时,我尽量使用非技术性语言。如果面试官想让你深入了解技术细节,他们会问一个问题,让你深入了解他们关心的技术部分。第一次回答更容易保持较低的技术性,但通常面试官会继续推动更多的技术方面,以衡量你对每个主题的理解水平。
在我面试结束时,许多公司称赞我的回答平易近人。有些人试图用专业术语淹没他们的面试官;我不推荐这种方法。我经常试图利用面试来展示我可以向组织中的技术人员和非技术人员传达我的想法。
在此过程中,此时提出的其他问题示例包括:
1.你会如何设计一个实验来测试 __________?
2.想象你有一个装有一些蓝色、红色和白色球的骨灰盒;在选择一个白色或蓝色之前选择两个红色的概率有多大?
3.想象你有两个硬币,一个是公平的,另一个有两个头。你随机选择其中一枚硬币,并掷 5 次。所有的抛硬币都是正面的,有多大的概率是公平的?
4.估计感兴趣参数的后验区间与使用 frequentist 方法得到的区间有何不同?
第三步:带回家评估
不同的公司对带回家的评估差别很大。在某些情况下,一家公司明确提供了一个“带回家”的项目,以确保候选人能够编写代码,找到解决方案,并且能够在不需要有人监督的情况下做出贡献。在第一种情况下,创建任何基本的端到端解决方案都足以“通过”。在其他情况下,带回家的东西是获得工作的关键,尽可能在整个解决方案中投入更多的时间和精力也是非常重要的(这只是稍微有点夸张)。
考虑到这一点,我将在这里介绍另一个技巧。
秘诀 4:如果你想要这份工作,就要超越自我。
对我来说,询问你的招聘人员或招聘经理如何给带回家的评估“打分”似乎是公平的。如果带回家的评估由多位评估者进行评分,并且/或者他们确保在检查评估时匿名以避免可能的偏见,那么可以肯定地说,公司非常重视带回家的评估。或者,如果招聘经理只是要求你完成它,并试图展示你的技能,面试的这一部分只是对你技能的简单检查。
不管是哪种情况,你都应该全力以赴。然而,在一种情况下,你可能会花整个周末从早到晚检查每个可能感兴趣的想法,而在另一种情况下,你可能会在几个小时内拼凑出一个合理的解决方案,这将使你进入下一步的过程。
我发现有趣的是,在过程的这一部分,我认为编写真正干净的代码,包括文档字符串,添加单元测试,并确保我所做的事情遵循 DRY 原则是非常重要的,但我的采访对象似乎都不太关心这一点。也许这是因为完成的时间有限。
不管公司有多重视带回家的评估,你都可以利用这个评估从其他应聘者中脱颖而出。多做些带回家的事情会给招聘经理留下深刻印象,增加你获得现场面试的机会。如果你真的想得到这份工作,你就应该努力脱颖而出。
在所有情况下,采访者似乎都关心:
- 我的解决方案有多有创意?(我是否设计了有趣的功能)
- 我是否传达了我正在做的事情以及原因?
- 我回答了他们问的问题吗?(与一个没有被问到的问题相反)
第四步:现场面试
完成“带回家”后,流程的下一步是现场面试。在现场采访中,你会经常遇到许多你经常共事的人。对每家公司来说,在现场表现出色对获得一个职位至关重要。即使你提供了“带回家评估”中有史以来最令人惊叹的解决方案,如果现场面试不顺利,你也不会被录用。
我知道这听起来压力很大,但老实说,这是面试过程中我最喜欢的部分。你得到有趣的问题,你可以和另一个人讨论如何解决有趣的问题。对我来说,那很有趣!
考虑到这一点,您如何确保现场顺利进行?首先,让我们考虑一下现场的不同方面。以我的经验来看,我有 4-6 次会议,涵盖了一系列的主题。通常,这些主题包括本部分标题中列出的内容。此外,还有一些对话,看看你如何将这些想法与每个公司的业务联系起来。在这里,我将添加我们的下一个技巧,但这与前面的观点有点混合。
提示 5:研究公司文化、人员和商业模式。
虽然这个建议没有出现在下面的所有要点中,但它出现在了列表的最后,这可能是整个现场面试中要记住的最重要的事情。
所有访谈都包含以下内容:
- SQL: 在白板上写出 SQL 来组合数据源。在我的经历中,我被而不是*询问任何与执行自连接或窗口功能相关的问题。我从其他人那里听说,有些公司确实会问与这些话题相关的问题。*
- Python: 问我的很多问题都有与时间相关的数据。事实证明,知道如何处理日、月、年,并创建适当的指标变量,对于带回家和面对面的访谈非常有用。
- 统计:很好地掌握某些相似性或差异性的度量标准是如何计算的非常有帮助。我还被问到一些关于概率和概率分布的基本问题,包括在一些面试中使用贝叶斯法则。
- ***机器学习:*能够谈论为什么在某些情况下使用欧几里德距离可能比 Spearman 或 Pearson 相关系数更好,如何在决策树中进行拆分,或者随机梯度下降与批量梯度下降相比的利弊,这些都被证明是有用的话题。你不必知道每一个细节,但是你知道的越多,可以利用的就越好。
- Python: 对于所有带回家的评估,我大量使用了 Python。与数据分析相关的主要库是用来帮助我的:numpy、pandas、scikit-learn 等。看起来大多数公司都不太关心我是否想使用 r。然而,看起来一旦你进入公司,你很可能会使用 Python。许多面对面的面试都有一个组成部分,即使没有要求你写,你也可以思考如何用 Python 解决问题。
- ***业务:*这部分我再强调也不为过— 研究公司。他们是怎么赚钱的?你的角色如何与业务目标相联系?尽可能多地了解这家公司。了解他们做什么,他们的客户是谁,以及你如何帮助他们维持和发展。了解他们的竞争对手也有帮助!
我非常确信,一些我没有得到的面试机会或者我在面试过程中失败的原因是我没有足够好地研究公司的商业和文化。你对公司和公司里的人了解得越多,你在面试的各个环节就会表现得越好。
了解产品,并确定如何改进产品。
第五步:最终谈判电话
如果一切顺利,你将进入最后一轮面试,你将得到一份工作邀请。虽然这个电话没有技术细节,但做好准备是很重要的。以我的经验来看,面试进行顺利的时候,一些围绕薪资的谈判甚至发生在现场面试过程中。这又引出了另一个提示。
技巧 6:谈判和利用。
不可否认,我不擅长这个过程的这一部分,但以下是我的建议。当你被问到你期望的薪水时,
- 给个范围。
- 谈谈你对相似职位和头衔的薪酬的真实调查。
- 充分利用你的优势,让你从其他候选人中脱颖而出。
- 强调你对工作和团队有多兴奋。钱是工作的一个因素;这不应该是你选择角色的主要原因。如果是的话,你和公司都应该担心。
- 我们当然欢迎你来谈判,许多公司都希望你去尝试和谈判。他们可能会说不,但他们不会仅仅因为你谈判就取消报价。提供理由会有所帮助;有没有一项福利是没有提供的,你需要为自己投保?你得到了竞争报价,你想匹配吗?
- 有些人建议让他们总是说第一个数字。我认为,如果你给出一个你真正期望落地的范围,至少你对双方都有一个起点。
- 请注意,在世界上的一些地区,他们问你目前在做什么是违法的。他们应该根据你对公司的贡献付给你报酬。
示例:
现场面试过程结束时:
**招聘人员:所以,我们已经到了需要谈谈薪资期望的时候了。看起来事情进行得很顺利,从我目前的谈话来看,车队很喜欢你。你心里有数吗?
**你:以我的经验水平,这个职位的起薪范围是 10 万到 14 万英镑。因为我有与团队使用的工具相关的额外经验,我希望这也能有所帮助。
**招聘人员:好的,我会和我们的财务团队谈谈,看看我们在哪里落地。
然后在最后一次通话中:
招聘人员:我和每个人都聊过了,我们想向你发出邀请。首先,让我们看看好处…谈谈好处…(此外,你可能还有)我们还应该谈谈股票期权…关于这一部分,你有什么问题吗?
你:不,我觉得这些都不错(或者有问题就问)。
**招聘人员:我跟我们财务部谈过了,我们可以给你一个 88000 的报价。考虑到所有其他的好处,你肯定会落入你提供的窗口。
**你:我真的很喜欢这个团队,我想加入。然而,我真的期望在我们谈论的范围内。考虑到我几乎可以立即给团队增加多少价值,我实际上预计会达到上限。
**招聘人员:给了我一点回旋的余地,我可以出到 9.5 万。
在这一点上,这完全取决于你想推动多少,但你不应该威胁或说一些你没有坚持到底的事情。此外,你不应该谎报你目前的薪水,试图把门槛推得更高。通常公司会在你被雇佣的时候要求 w2,所以他们会知道你撒谎了。这可不是你想和新雇主开始交往的第一步。
**你:不幸的是,我真的很希望能完成这项工作,但这仍然低于我对行业标准的预期。有没有办法 125000 左右见面。
你可以继续这个过程,直到你达成一个协议,或者你决定你不能做一些工作。假设事情进展顺利,你可以要求时间来做最后的决定和考虑事情。这是完全合理的。大多数公司对你花一两周时间做最终决定感到满意。
如果你幸运的话,你甚至可以选择。一旦你打开了第一扇门,建立了正确的关系,就会有很多机会。在这些情况下,我有一个最后的提示。
技巧 7:选择最适合你的角色。
确定你想加入的团队,你想解决的问题,你想产生的影响。对每个人来说,没有一个正确的决定。做出对你最有利的决定。
额外:帮助您准备的资源
在这里,我提供了一些有用的(免费)资源,帮助你准备数据科学家职位面试的不同部分。
SQL Udacity 的 SQL 课程
w3schools 上的 SQL
SQL 动物园
Python Python Codecademy
Python I uda city
Python II uda city
Codewars for Python 与 SQL
hacker rank
leet code
机器学习 Luis Serrano 的 Youtube 频道
统计学习简介正文
Udacity 机器学习
uda city 上的技术面试算法
软技能
软技能上艾莉森
随着时间的推移,我将继续添加到列表中,但这只是一个开始。如果您有其他有用的资源,请随时在评论中添加。然后,我可以更新列表,以帮助其他人准备!为了让你对未来作为数据科学家的角色感到兴奋,请查看下面的视频,其中讨论了许多主题(包括更多关于面试的内容)!
感谢阅读!
MLconf SF 的 7 个要点
我在 MLConf 参加了几年来第一次以人工智能为主题的会议。赶上机器学习和数据科学的最先进水平真是太棒了。虽然会议的大部分时间都集中在深度学习上,但从这次活动中可以学到更广泛的经验。以下是我从会议中获得的主要收获:
- 构建数据产品不仅仅是构建模型
- 张量是 ML 工作的新原语
- 准备好为了空间和时间的限制而牺牲精确性
- 深度学习是跨学科的
- 深度学习正在越来越多地影响我们的日常生活
- 如果您想要推动采用,请提供笔记本电脑
- ML 公司都在招人!
我将在下面更详细地讨论每一点。在接下来的几周里,所有的幻灯片都将在的 SlideShare 上发布。
构建数据产品远不止构建模型 对我来说,大会的亮点是 June Andrews 的关于构建直观机器学习系统的演讲。她提出了一个框架,在这个框架中,许多学科都参与到了决定构建什么样的数据产品以及如何将产品投放市场的过程中。她介绍了一个过程,详细说明了哪些团队应该负责各种任务,包括:如何收集模型的需求,如何研究模型提案,如何评估模型的部署,如何确定是否推出模型,如何扩展到模型的完全部署,以及如何随着时间的推移维护模型。她承认,对于哪个团队负责数据产品的不同阶段,较小的团队不会有如此严格的规则,但她明确表示,将人工智能发布到世界上比仅仅在训练数据集上训练模型要复杂得多。她提供了航空领域的例子,人工智能系统需要健壮和高度准确才能被采用。
June’s slide on the many stages of releasing Data Products.
张量是 ML 工作的新原语
会议的主题之一是倡导在 ML 工作中使用张量。张量是矩阵的自然扩展,它不是用二维来表示数据,而是用三维来表示数据。 Tamara Kolda 提到它的使用可以追溯到 90 年代初的化学领域,但直到最近张量才被广泛用作 ML 工作的数据结构。 Anima Anadkumar 也主张使用张量作为原语,并提到采用新的原语将需要创作新的库。
准备好权衡空间和时间限制的准确性 在 MLconf 上的几次会谈讨论了在求解最优解时所涉及的权衡。有时最优解是难以处理的,团队需要找到新的方法来减少所用算法的空间或时间复杂性。例如, Tamara Kolda 谈到了可用于在每次迭代中不使用完整数据集的情况下解决模型拟合问题的采样方法, Anima Anadkumar 谈到了从张量表示中删除秩以节省空间,而 Rushin Shah 谈到了脸书用于精确语言理解的 fastText 算法,该算法比以前的方法快得多。
深度学习是跨学科的 会议的新奇之处之一是看到科技公司以外的研究人员如何利用深度学习来创造新的发现。Ted Willke 做了一个非常有启发性的演讲,讲的是深度学习如何被应用到海洋生物学领域,并使科学家能够比以前的方法更准确地跟踪鲸鱼的迁徙,而且侵入性更小。还有关于将深度学习应用于其他领域的会谈,包括化学、医学和约会。
深度学习正在影响我们越来越多的日常生活 在手机上发送的电子邮件中,有 12%使用了 gmail 新的自动回复功能。这只是大会上许多例子中的一个,深度学习正在被用来影响我们更多的日常活动。有6 月的演讲关于通用电气如何提高飞往该活动的任何参与者的航空旅行安全性,有 Xavier Amatriain 关于深度学习对医学诊断的影响的演讲,以及 Rushin Shah 关于 FB 关于旅行建议的帖子如何被用来影响决策的演讲。
提供笔记本如果你想推动采用 今天的一些演讲者,包括道格·埃克,谈到了早期的人工智能,所有的代码都是用 C++编写的,没有人想接触现有的代码库。我们现在有更好的工具来使 ML 和笔记本环境大众化,比如 Jupyter 提供了如何使用 ML 框架的例子。Anima Anadkumar 谈到了 Jupyter 是如何被用来让 Gluon 这样的 ML 库变得更加平易近人的。
ML 公司在招人! 今天活动中的大多数演讲者都提到他们的公司正在招聘 ML 职位。MLconf 有一个清单列出了的工作岗位,而意外之财数据公司也在招聘一个专注于数据治理的数据科学家职位。
我在第一次国际会议(泰国 PyCon,2018)上发言后学到的 7 件事
嗨,如果你有兴趣了解我,你可以从下一行开始读,如果没有,直接跳到第一点。
我是 Kajal,是一名分形分析的工程师,在 Bengaluru 工作。我 2017 年毕业,从事 Python 工作已经三年了。在 2015 年结束了在一家初创公司的暑期实习后,我的导师鼓励我参加会议、聚会等。会见在同一领域工作的人,并介绍我的工作。这对我很管用。事实上,我相信无论我今天在哪里或者将来会在哪里,我对 Python 社区的参与都做出了巨大的贡献。
最初,我开始去 PyDelhi ,这通常是两周一次,我会虔诚地参加所有的讲座,并在会后与演讲者交谈,以防我有疑问或甚至我对他们在做什么感兴趣。我认为要在会议上发言,你需要精通公开演讲以及一个令人敬畏的“程序员”。在结束我的夏季实习后,我的导师逼我在PyData Delhi展示我在推荐系统方面的工作,这是一个数据科学&机器学习的独家聚会。我展示了我的作品,颤抖着像个婴儿一样发出噼噼啪啪的声音,并为我不能自信地谈论我三个月的辛勤工作而感到悲哀。我回答了 Q & A 环节中的大部分问题,感觉相当自信。有人提出了我无法回答的问题,我记下了与提问者的电子邮件 id 相对应的问题,然后通过电子邮件进行了回复。感觉是一个-M-A-Z-I-N-G
从那以后,我决定在小型活动/聚会上发言,以减少我的怯场,我开始对用最怪异的幻灯片解释概念产生了更多的兴趣,而不是避免演讲,甚至在工作中也是如此。
以下是我在第一次国际会议即泰国 PyCon 上演讲后的一些心得。
1.你不需要成为一个专家来说话。
我真正喜欢 PyCon 的一点是——它适合所有人!你的演讲将被分为以下几类:“初级”、“中级”或“高级”。我建议你根据水平准备你的幻灯片和内容,这样你和观众都能从中受益。
2.提高你的公共演讲技巧。
有些人从学生时代就克服了怯场,有些人则没有,而我两者都不是。我怯场,唯一能让我感觉好起来的方法就是练习。尽可能多地练习公开演讲。参加聚会,在众人面前演讲。在你的工作场所采取主动,不要放过任何一个你可以展示自己的机会。
只是确保你不会在会议上变成这样。
3.提前准备好你的主题。
这是我说话时犯的一个错误。由于办公室繁忙的日程安排,我无法准备,所以我忙着整理我的幻灯片和内容,直到最后一分钟,以避免任何混乱。你应该提前准备,这样你就不会错过参加其他有趣的会议和与人互动。我在演讲者的房间里生闷气,直到我的演讲被宣布。所以,要避免。
4.发起对话。
在泰国 PyCon 大会上,主讲人是韦斯·麦金尼。整个会议期间我都很害怕和他说话,我是说我想和他说话,但是我没有什么可说的。在社交活动中,我只是说了一句尴尬的你好,然后他回应了,我们谈论了 Python、 Apache Arrow 项目等等。所以,开始和你感兴趣的人交谈,不管你感到多么尴尬或害怕。这将极大地帮助你在会议上度过愉快的时光。
5.保持您的演示离线!
虽然会议组织者确保尽最大努力保持 Wi-Fi 连接正常,但由于有数百人使用,事情可能会出错。所以,一定要把你的演示/结果录制成视频或 gif,以避免最后一分钟的网络混乱。
6.参观所有的摊位。
如果你正在寻找改变(或者即使你没有),我建议你参观每家公司的展位,与那里的人交谈,如果可能的话,拿走他们的电子邮件 id,并在会议结束后放下你的简历。我听说过很多人在会议期间被雇佣的故事。事实上,当你是一名演讲者的时候,你有更多的机会被雇佣或者实习。在这个过程中,你会了解到哪家公司在做什么,以及他们的招聘是如何进行的,以便日后参考!
7.始终给予反馈。
每当我发言时,无论是国际会议还是小型聚会,我都有向组织者提供反馈的责任感。我相信这是我对社区的一点小小的贡献,可以让它继续下去,也可以在将来改善其他人的体验。
我给你讲一个关于这个的小事件。作为一个素食主义者,我很难在泰国 PyCon 吃任何东西,因为在第一天,大多数菜肴都不是蔬菜。会议中负责食品部分的人英语说得相当好,所以我给了她我对食物的反馈。她很慷慨地在会议的第二天加入了更多的素菜,这对我和其他素食者来说都是一个福音。我感谢她,这也让她很高兴,我可以在一个陌生的地方享受我的食物。只是想传达这样的信息,“反馈有帮助!”
最后我只想感谢泰国 PyCon 的组委会给我一个发言的机会。我不能要求更好的体验。每个人都很友好,我迫不及待想明年再去那里。
如果你感兴趣的话,这是我在泰国 PyCon 上的幻灯片链接。
幻灯片链接:http://bit.do/epfA8
如果你想就招聘事宜和我聊几句,你可以在 Twitter 上给我发消息
通往“整体”的 77 条道路以及我是如何到达那里的
寻找航班捕捉日全食
from NASA Goddard SFC
离美国大日食不到一周了。
对这一特殊事件的大肆宣传部分是由于大片地方(大部分在美国)人们可以目睹所谓的“全食”这时月亮遮住了整个太阳,产生了日全食。
在全食期间,太阳被完全遮住,变得像夜晚一样黑暗。如上图所示,你可以看到环绕太阳的日冕。我听说这是一个壮观的景象。
然而,试图完全体验全食的挑战之一是天气。据 weather.com 的报道,我们东海岸的人可能要倒霉了。
但是有一种方法可以战胜天气——超越它。每天有成千上万的航班。因此,很自然地,你可能想知道你是否能在这些飞行中体验到全食。
嗯,我也想知道。所以,我决定一探究竟。
TL;速度三角形定位法(dead reckoning)
我设法确定了 77 次飞行——每一次都有很好的机会(我认为)体验完整。滚动到列表的末尾。
消除的过程
因为我这样做主要是为了满足我的好奇心,所以我决定将我的预算设置为 0.00 美元。我最后稍微检查了一下,因为我需要在 AWS 上有一个像样的 EC2 实例来做一些计算。但我认为最终的成本会低于一杯拿铁。
大部分工作都是通过笔记本电脑完成的。使用的主要 Python 包是 pandas 。我还使用了python _ sphere来做一些球面三角计算。
有多少条飞行路线?
从 OpenFlights 有一个飞行路线的公共数据库。稍加调整后,总共有 19,257 对机场,每一对都表示这两个机场之间现有的一对直飞航班。
有多少条飞行路线穿过全食路线?
你可以通过 Xavier Jubier 的这个了不起的工具下载总体信息的路径。你可以下载 XML 格式的文件(我把它转换成 JSON,然后转换成 pandas DataFrame。)
全食的路径可以被认为是月球的影子在地球表面移动的轮廓。在很大程度上,你可以把它近似为一个半径约为 50 英里,时速约为 1500 英里的圆。(可以在这里找到路线图和时间表。)
假设飞行路径遵循测地线(球体上两点间的最短距离),那么就可以计算出有多少飞行路径实际上穿过了全食路径。答案是:3954。
日食期间有多少航班计划在空中飞行?
好的,结果是 OpenFlights 的人今天在他们的网站上没有预定的航班(尽管他们是考虑到这一点)。)这个有点堵……
我最终订阅了 FlightStats 开发者计划来下载日食当天的预定航班。我想他们会同意我用这些数据做好事。(对他们来说是“免费营销”吧?)
使用实际的时间表,人们可以计算出在月食期间(即月亮的影子掠过地球表面)在空中的实际飞行。)答案:4408。
注意,对于这个结果,我们假设航班准时到达*。如果我们允许航班晚点几个小时到达(有时确实如此),这个数字会高得多。*
(如果你想知道为什么这个数字比上面的数字 3954 大,那是因为每个飞行路径都有多个航班,向两个方向飞行。)
有多少航班预计会在正确的时间穿越全食轨道?
当然,这是最难估计的部分。对于每一次飞行,我们都需要计算出何时它将穿过全食的路径,并观察它与月球阴影出现的时间有多接近。
我们要做的是计算出在“良好条件”下,一次飞行何时会穿过全食路径,并估计一次飞行会延迟(多晚)多久,并且仍然在全食路径之下。
以下是构成“良好条件”的假设——结合互联网上的各种阅读和我的个人经验:
- 航班准时起飞。
- 飞行滑行 12 分钟。
- 飞行 10 分钟到达巡航高度。
- 航班在预定到达时间前 15 分钟着陆。
然后,我们计算那些至少有 10 分钟时间窗(安全裕度)的航班。最大的安全裕度是 30 分钟左右。这导致了本文末尾列出的 77 个航班。
这是美国东部时间下午 1 点 52 分的 77 次飞行和月球阴影的粗略图像:
一些笔记
我花了大量的时间验证结果,似乎最弱的假设是飞行路径遵循测地线。
这是有意义的,因为实际的飞行路径取决于天气(如雷暴)等因素,并考虑到急流。我看到,例如,JFK 到火奴鲁鲁的飞行路线在历史上似乎明显位于测地线以北。(你可以在这里查看历史飞行轨迹。而这个工具似乎使用测地线来投射飞行路径。)
其影响是,一般来说,飞行时间越长,飞行路线越有可能偏离测地线,从而错过日食。事实上,在 77 个航班中,最有可能的是 9 号航班(从查德隆到丹佛)。)
同样有趣的是,对于许多这样的飞行,由于飞机的方向,你可能看不到太阳。(即使你坐在右边。)像这个这样的工具可以用来计算太阳是否处于从飞机上可见的正确位置。
最后,我想提一下,西南航空公司在推特上说他们可以在五个航班上看到日全食:
不幸的是,我只能确认其中一个航班。不过,看了视频后,我发现这些航班中有许多可能不符合我在选择 77 航班时使用的标准。同样令人好奇的是,视频中 1368 航班似乎是如何向南弯曲的。测地线实际上会向另一个方向弯曲。当然,他们完全有可能在那天创造飞行路线,以确保这些路线能赶上日全食…
如果我“真的”这么做…
如果资金和时间不那么有限,更合适的方法是查看日食期间计划飞行的 4408 次航班的实际历史飞行路线。然后,我们可以根据历史模式,估计每次飞行看到日食的“可能性”。
理想情况下,所有的努力将包括考虑实际飞机的方向、从窗口的视角以及飞行的实际高度(这也会影响月球阴影的位置)。
77 次航班
请注意,该列表并不详尽。根据实际飞行路线和时间表的变化,还有许多其他航班将全部结束。这个列表也不是一个保证(显然。)
当然,如果你打算观看或记录日食,请采取适当的预防措施!
- 从 ATL(亚特兰大)到 PDX(波特兰),DL-2565 航班(达美航空),21 日 08:09:45:00 起飞
- 从 ATL(亚特兰大)到 SEA(西雅图),DL-1336 航班(达美航空),08/21 10:55:00 起飞
- 从 ATL(亚特兰大)到 SEA(西雅图),DL-39 航班(达美航空),08/21 12:25:00 起飞
- 从 ATL(亚特兰大)到 TYS(诺克斯维尔),DL-517 航班(达美航空),08/21 13:47:00 起飞
- 从 BNA(纳什维尔)到 CHS(查尔斯顿),WN-1559 航班(西南航空),08/21 12:50:00 起飞
- 从 BOI(博伊西)到 PDX(波特兰),AS-2510 航班(阿拉斯加航空公司),08/21 10:35:00 起飞
- 从 BOS(波士顿)到 DEN(丹佛),UA-652 航班(联合航空公司),08/21 10:31:00 起飞
- 从 BOS(波士顿)到 SFO(旧金山),UA-1749 航班(联合航空公司),08/21 09:35:00 起飞
- 从 CDR(Chadron)到 DEN(Denver),BAI-702 航班(精品航空),08/21 11:10:00 起飞
- 从 CLT(夏洛特)到 STL(圣路易斯),AA-1769 航班(美国航空公司),08/21 13:00:00 起飞
- 从 DCA(华盛顿州)到 DFW(达拉斯),AA-1602 航班(美国航空公司),08/21 12:50:00 起飞
- 从丹(丹佛)到 BNA(纳什维尔),WN-301 航班(西南航空),08/21 10:20:00 起飞
- 从丹(丹佛)到 CLT(夏洛特),AA-688 航班(美国航空公司),08/21 09:50:00 起飞
- 从丹(丹佛)到 CLT(夏洛特),UA-1711 航班(联合航空公司),08/21 10:15:00 起飞
- 从丹(丹佛)到 CVG(辛辛那提),DL-936 航班(达美航空),08/21 10:32:00 起飞
- 从丹(丹佛)到 IAD(杜勒斯),WN-724 航班(西南航空),08/21 10:50:00 起飞
- 从 DEN(丹佛)到 IAD(杜勒斯),UA-1192 航班(联合航空公司),08/21 10:55:00 起飞
- 从丹(丹佛)到 MKE(密尔沃基),UA-445 航班(联合航空公司),08/21 10:59:00 起飞
- 从丹(丹佛)到皮特(匹兹堡),WN-1866 航班(西南航空),08/21 11:00:00 起飞
- 从丹(丹佛)到 TYS(诺克斯维尔),UA-4751 航班(联合航空公司),08/21 10:10:00 起飞
- 从丹(丹佛)到 TYS(诺克斯维尔),F9–588 航班(边疆航空公司),08/21 10:10:00 起飞
- 从 DFW(达拉斯)到 PDX(波特兰),AA-1580 航班(美国航空公司),08/21 09:05:00 起飞
- 从 DFW(达拉斯)到西雅图(西雅图),AA-1402 航班(美国航空公司),21 日 08:55:00 起飞
- 从 EWR(纽瓦克)到丹佛(丹佛),UA-1262 航班(联合航空公司),08/21 10:26:00 起飞
- 从 EWR(纽瓦克)到拉斯维加斯(拉斯维加斯),UA-1179 航班(联合航空公司),08/21 10:44:00 起飞
- 从 FCO(罗马)到 ATL(亚特兰大),DL-63 航班(达美航空),08/21 09:45:00 起飞
- 从 FLL(劳德代尔堡)到奥德(芝加哥),UA-1290 航班(联合航空公司),08/21 12:27:00 起飞
- 从 FLL(劳德代尔堡)到 YYZ(多伦多),AC-1623 航班(加拿大航空公司),08/21 13:20:00 起飞
- 从 GYE(瓜亚基尔)到 JFK(纽约州),XL-1438 航班(厄瓜多尔拉美航空公司),起飞时间为 08/21 08:40:00
- 从 HKG(香港)到旧金山(三藩市),CX-870 航班(国泰航空),08/21 14:15:00 起飞
- 从 IAD(杜勒斯)到 DFW(达拉斯),UA-6018 航班(联合航空公司),08/21 12:45:00 起飞
- 从 IAH(休斯顿)到 YVR(温哥华),UA-600 航班(联合航空公司),08/21 09:13:00 起飞
- 从 JFK(纽约州)到 HNL(檀香山),HA-51 航班(夏威夷航空公司),08/21 10:00:00 起飞
- 从 JFK(纽约州)到拉斯维加斯(拉斯韦加斯),B6–411 航班(捷蓝航空公司),08/21 11:20:00 起飞
- 从 JFK(纽约州)到洛杉矶国际机场(洛杉矶),AA-163 航班(美国航空公司),08/21 11:00:00 起飞
- 从 JFK(纽约州)到洛杉矶国际机场(洛杉矶),VX-409 航班(维珍美国),08/21 11:30:00 起飞
- 从 JFK(纽约州)到旧金山(三藩市),DL-490 航班(达美航空),08/21 09:45:00 起飞
- 从拉斯(拉斯维加斯)到印第安纳州(印第安纳波利斯),WN-1942 航班(西南航空公司),08/21 08:30:00 起飞
- 从拉斯(拉斯维加斯)到奥德(芝加哥),NK-446 航班(Spirit Airlines),08/21 08:31:00 起飞
- 从洛杉矶国际机场飞往波士顿的 VX-360 航班(维珍美国航空),起飞时间为 21 年 8 月 8 日 08:03:00
- 从洛杉矶国际机场飞往纽约 JFK 的 AA-82 航班(美国航空公司),于 21 日 8:00:00 起飞
- 从洛杉矶国际机场飞往芝加哥的 AA-362 航班(美国航空公司),起飞时间为 21 年 8 月 8 日 8:00:00
- 从 LGA(纽约州)到 BNA(纳什维尔),DL-4175 航班(达美航空),08/21 11:59:00 起飞
- 从 LGA(纽约州)到 BNA(纳什维尔),AA-4774 航班(美国航空公司),08/21 12:00:00 起飞
- 从 LGA(纽约州)到丹佛(丹佛),UA-1135 航班(联合航空公司),08/21 10:30:00 起飞
- 从 MCO(奥兰多)到 MSP(明尼阿波利斯),SY-342 航班(太阳乡村航空公司),08/21 12:50:00 起飞
- 从 MDW(芝加哥)到 ATL(亚特兰大),DL-1648 航班(达美航空),08/21 12:00:00 起飞
- 从 MDW(芝加哥)到旧金山(旧金山),WN-267 航班(西南航空公司),08/21 11:25:00 起飞
- 从 MIA(迈阿密)到 SEA(西雅图),AA-2691 航班(美国航空公司),08/21 08:40:00 起飞
- 从 MSP(明尼阿波利斯)到 JAX(杰克逊维尔),DL-2786 航班(达美航空),08/21 11:30:00 起飞
- 从 MSP(明尼阿波利斯)到 LAS(拉斯维加斯),DL-1439 航班(达美航空),08/21 11:15:00 起飞
- 从 MSP(明尼阿波利斯)到 SNA(圣安娜),DL-1377 航班(达美航空),08/21 11:30:00 起飞
- 从奥马哈到拉斯维加斯,WN-1882 航班(西南航空公司),08/21 12:00:00 起飞
- 从奥德(芝加哥)到 BOI(博伊西),UA-5814 航班(联合航空公司),08/21 09:00:00 起飞
- 从 order(芝加哥)到 SFO(旧金山),UA-499 航班(联合航空公司),08/21 10:47:00 起飞
- 从 PDX(波特兰)到 ATL(亚特兰大),DL-2466 航班(达美航空),于 2011 年 8 月 21 日 08:45:00 起飞
- 从 PDX(波特兰)到 MCI(堪萨斯市),AS-3382 航班(阿拉斯加航空公司),08/21 09:15:00 起飞
- 从 PHX(凤凰城)到奥德(芝加哥),F9–1308 航班(边疆航空公司),08/21 08:25:00 起飞
- 从 RDU(罗利/达勒姆)到 ATL(亚特兰大),DL-1803 航班(达美航空),08/21 13:25:00 起飞
- 从圣地亚哥飞往夏洛特的 AA-2050 航班(美国航空公司),起飞时间为 08/21 07:15:00
- 从圣地亚哥飞往 JFK 的 AA-94 航班(美国航空公司),起飞时间为 21 年 8 月 7 日 07:45:00
- 从 SAN(圣地亚哥)到 SEA(西雅图),AS-493 航班(阿拉斯加航空公司),08/21 08:00:00 起飞
- 从 SEA(西雅图)到 ATL(亚特兰大),AS-746 航班(阿拉斯加航空公司),08/21 07:10:00 起飞
- 从 SEA(西雅图)到 ATL(亚特兰大),DL-2864 航班(达美航空),08/21 07:45:00 起飞
- 从 SEA(西雅图)到 FLL(劳德代尔堡),AS-38 航班(阿拉斯加航空公司),08/21 08:55:00 起飞
- 从旧金山飞往波士顿的 UA-768 航班(美国联合航空公司),于 2011 年 8 月 21 日 08:30:00 起飞
- 从旧金山飞往华盛顿的 VX-1 航班(维珍美国航空公司),于 2011 年 8 月 21 日 08:00:00 起飞
- 从旧金山飞往 EWR 的 UA-233 航班(联合航空公司),起飞时间为 21 年 8 月 8 日 8:10:00
- 从旧金山飞往芝加哥的 AA-150 航班(美国航空公司),于 2011 年 8 月 21 日 08:00:00 起飞
- 从旧金山飞往 PHL(费城)的 AA-722 航班(美国航空公司),起飞时间为 21 年 8 月 8 日 08:00:00
- 从 SJU(圣胡安)到 PHL(费城),AA-2049 航班(美国航空公司),08/21 13:15:00 起飞
- 从 SLC(盐湖城)到 CVG(辛辛那提),DL-1833 航班(达美航空),08/21 09:45:00 起飞
- 从 SLC(盐湖城)到 PDX(波特兰),AS-3499 航班(阿拉斯加航空公司),08/21 10:04:00 起飞
- 从 SLC(盐湖城)到 PHL(费城),DL-194 航班(达美航空),08/21 10:10:00 起飞
- 从 SLC(盐湖城)到 RDU(罗利/达勒姆),DL-1846 航班(达美航空),08/21 10:05:00 起飞
- 从 SNA(圣安娜)到 ORD(芝加哥),AA-1205 航班(美国航空公司),于 08/21 08:05:00 起飞
- 从 STL(圣路易斯)到 DEN(丹佛),UA-4493 航班(联合航空公司),08/21 11:55:00 起飞
最后…
如果你觉得这篇文章有趣,请点击“拍手”按钮,和/或分享这篇文章。
我对此很感兴趣,我想知道其他人是否对这类信息感兴趣。如果你是,请给我留言让我知道。(不,我收集电子邮件不是为了把它们卖给垃圾邮件发送者——只是想看看是否有足够的真正兴趣来刺激额外的工作!)
另外,你可以使用同样的表格让我知道你是否碰巧在这些航班中的一个。我很想知道结果如何!
8 种令人迷惑的视错觉(以及它们揭示了我们大脑的工作方式)
他们说“眼见为实”,但你真的能相信你所看到的吗?
以这个著名的光学实验为例:橙色的圆圈对你来说大小一样吗?
如果你认为右边的圆圈看起来更大,你并不孤单。其实大部分人都是这样的。现在你应该已经猜到了,这两个圆的大小是一样的。
最佳视错觉挑战我们对现实的感知:此刻看似真实的东西最终是假的。如果我们挑战自己,进一步思考,你就会明白信息——比如视觉输入——毫无意义。是我们对信息的处理赋予了它意义。
我们通过学习如何看来看。我们的大脑已经进化到可以识别模式,通过与现实世界的互动来建立联系。这是生存本能。用著名的神经科学家博·洛托、的话说,“大脑实际上并没有进化到看世界的方式……大脑进化到看它有用的世界。”
大脑如何以一种有用的方式适应视觉?无需深究视觉科学理论,如 Baysian 模型,定义我们如何看的一个简单事实是,我们的大脑在每种视觉情况下不断定义和重新校准“标准”。
因此,当视觉情境偏离我们大脑所知的“标准”时,视错觉是我们大脑对异常视觉体验做出反应的结果。换句话说,我们的大脑会“行动起来”,做出看似“不恰当”的解释。
视错觉是如何工作的?
虽然找到一个共同的理论来解释所有类型的错觉将是"理论家的梦想,“流行的学术解释认为认知错觉是"大脑用来解释或阅读感官信号的知识被误用的结果”
我们的大脑已经进化到储存一个“规则手册”,这个“规则手册”根据过去的感官经验来描述物体应该如何看/感觉/闻。例如,我们将木纹纹理与木质表面联系起来,甚至当我们看到带有木质图案设计的光滑塑料表面时,我们也倾向于应用这一知识。
人类也不是唯一看到视错觉的人。大黄蜂对颜色的感知是出了名的,尽管它们的基本调色板由绿色、蓝色和紫外线、组成,而不是红色、绿色和蓝色。
在博·洛托博士对大黄蜂的实验中,他证明了大黄蜂的大脑——类似于人类的大脑——不以绝对的方式对颜色信息进行编码,而是通过真实世界进行学习。如果我们把大黄蜂的生活环境设计成黄色花朵中灰色是最蓝的,那么依靠蓝色花朵生存的大黄蜂就会转向灰色花朵。
这些科学实验有力地提醒我们,我们根据大脑如何组织其元素(如形状、大小、颜色和空间关系)来“看到”物理世界。现在,事不宜迟,让我们来看看我们在网上找到的一些最好的视错觉,以及它们揭示了我们视觉感知中的盲点。
最佳视错觉
1.特克斯勒效应
Source: Mighty Optical Illusions
盯着上面模糊图像的中心,不要眨眼。几秒钟后,你看到了什么?图像开始变淡了吗?
这种被称为特克斯勒效应的视觉现象,由瑞士医生伊格纳斯·保罗·维塔尔·特克斯勒于 1804 年首次发现,揭示了我们的视觉系统如何适应感官刺激。这是由于我们的神经元停止对不变的刺激做出反应——在这种情况下,背景中的静态模糊图像——导致图像从我们的意识中消失。
2.丘博错觉(亮度)
Chubb 错觉是由 Charles Chubb 及其同事 Sperling 和 Solomon 在 20 世纪 80 年代末首次发现的,当时他们通过将低对比度的视觉对象放置在各种背景上来实验感知对比度。
正如你在上面的图像中看到的,当纹理对象被放置在一个简单的灰色背景上时,它似乎比相同的对象被放置在一个高对比度的纹理背景上时有更多的对比度。
对这种常见视觉错误的一种解释是“不完全透射”,这是一种大脑需要为视觉感知导航模糊的情况,例如当透过雾或从远处看东西时。当没有光线照射在视网膜上时,我们的大脑试图通过做出不完美(通常不准确)的解释来确定物体的真实颜色或对比度,例如当低对比度物体在灰色背景上时。
3.棋盘格阴影错觉(对比)
在这个著名的视错觉中,标有 A 的方块看起来比 B 暗很多,对吧?但事实上,它们都是灰色的。如果你不相信我,点击这个链接看证明。
阿德尔森的棋盘阴影错觉是我们的视觉系统不能绝对感知的经典例子。在这里,棋盘上视觉解释的情况是复杂的:有光进入表面,然后有圆柱体投射的阴影,阴影下有亮和暗的方块。
正如 Adelson 所解释的那样,大脑如何确定正方形 A 和 B 的颜色涉及到几个变量,使用过去关于对比度和阴影的经验作为参考点。在这里,明亮和黑暗的方块以及柔和的阴影的接近会欺骗大脑做出错误的判断。
但对阿德尔森来说,这种错觉证明了我们视觉系统的有效性,而不是它的缺陷,因为它通过分解视觉信息成功地构建了意义。
4.丁香追逐者(彩色)
盯着图片中央的十字看 20 秒钟左右,你会看到一个绿点绕着圆圈跑,或者一个绿点绕着圆圈转,似乎抹去了灰色背景上的洋红色点。如果你移动你的眼睛,洋红色的点会再次出现。
淡紫色追逐者,也被称为“吃豆人”错觉,主要是“负视网膜残像的影响,当我们的感知系统适应填充中性背景上互补色调的“残像”留下的间隙时,就会出现这种情况。在这种情况下,淡紫色点的消失会产生互补色(绿色)的余像。
格式塔效应促成了一个绿色圆盘飞行的视觉现象。过了一会儿,大脑开始整合连续的残像,转而感知一个单独的飞行物体。我们将在后面深入探讨格式塔效应。
5.波根多夫错觉(几何)
看左图:黑线好像和蓝线排成一条线了吗?实际上,黑线和红线是一条线,如右图所示。
以 1860 年首次描述这种错觉的德国物理学家约翰·波根多夫命名的波根多夫错觉揭示了我们的大脑如何感知深度和几何形状,但这种视错觉的原因尚未得到充分解释。
虽然到目前为止,没有任何理论能够令人满意地解释这种视觉错误,但普遍的看法是,我们的大脑试图用 3D 属性来解释 2D 图像,并扭曲了线条之间的深度。如果你想了解更多,这里有一个完整的网站致力于 Poggendorff 错觉。
6.谢泼德表(尺寸)
当你看上面的两张桌子时,它们的大小和形状是否有很大的不同?你会相信这两个桌面一模一样吗?如果没有,看看这个动画插图自己看吧。
美国心理学家罗杰·谢泼德在他的著作《心灵景象》(1990 年)中首次提出了这种简单而惊人的视觉错觉,进一步证明了我们的视觉系统在很大程度上受到我们对外部世界的体验的影响,因此有时会干扰现实。
在这个错觉中,感知错误是由于我们的大脑忍不住对 2D 的图片进行 3D 解释,并由于透视缩小而感知到非常不同的大小:物体在距离上越近,在我们的视网膜上就越大。
7.卡尼萨三角形(格式塔效应)
如果你还没有看到由吃豆人的边组成的三角形,我肯定看到了。不存在的三角形看起来也比背景亮,尽管它们的亮度相同。
由意大利心理学家 Gaetano Kanizsa 推广的这种错觉揭示了我们是如何在视觉感知中寻求封闭的。一些最好的视错觉是基于这样的原理:我们的大脑被训练来填补形状和线条之间的空隙,并将空白空间视为物体,即使根本没有物体。
换句话说,Kanizsa 的三角形是一个恰当的例子,我们的视觉感知是由经验形成的,而不仅仅依赖于感官输入。
8.不可能三叉戟(不可能的物体)
仔细看:在叉子的末端,三个叉子奇迹般地变成了两个。你越看它,它就变得越不可能。这是怎么发生的?
通常被认为是在 1965 年 3 月的《疯狂杂志》封面上首次亮相的原创图形艺术,不可能的三叉戟也被称为魔鬼的叉子、不可能的叉子或 blivet。这些线条在末端连接在一起,创造出一种尖头的错觉。因为我们的大脑倾向于从平面的 2D 图像中重建三维图像,这就产生了深度错觉。
轮到你了
无论你是想用视觉来强化你的信息,还是用图像来阐述复杂的想法,理解视觉感知背后的过程对于成为一个更好的视觉传达者来说都是至关重要的。点击这里阅读更多关于如何成为更好的视觉思考者或者点击这里有效地讲述视觉故事。
你在网上找到的最好的视错觉是什么?你有更多在这里看不到的惊人例子吗?在下面的评论区和我们分享你的想法。
作为一名数据人员,我学到了 8 件事
Lexer Sydney Office
在上周的一次 Python 见面会上,我最害怕的问题出现了:“那么你是做什么的?”恐惧的感觉来自于不得不解释我是如何负责三个不同职位的焦虑。那我该说什么?
我是一名数据开发人员、数据科学家和数据工程师。相当多,特别是当我说我也是一名火箭工程师的时候。
今天是我在 Lexer 工作的第 268 天,这是一段怎样的旅程!当我提炼出一些我的技术和商业知识时,这篇文章旨在给局外人一个窥探创业公司迷人世界的机会。
技术的
1.正确命名您的变量!
作为一名航空航天工程背景的人,编码只是达到目的的一种手段,我对良好的编码实践一无所知。当我开始用 Ruby 编写脚本时,我在 Lexer 的导师很快指出像sum_array
或final_hash
这样的变量名是没有意义和多余的。
相反,命名变量是为了描述它们的功能,而不是它们的数据类型。
假设我想使用一个假设的 count 函数来计算["apple","orange","banana","apple"]
中"apple"
的出现次数,这个函数接受一个字符串数组和要计算的搜索字符串。有利的语法应该是n_apples = count(fruits, "apple")
而不是count_val = count(fruits, "apple")
2.少相信你的眼睛,多相信你的代码。
假设你有一个柠檬水摊位,你想分析你的销售业绩。你让你的助手 Roger 在 excel 电子表格中记录所有交易,分为三列Name
、Total Spent
、&、Date of Lemonade purchase
。
作为一名数据工作者,你自然不相信人类能够生成干净的数据集,所以你决定在分析 Roger 的电子表格之前对其进行感官检查。
前几行看起来都很好,名字以正确的格式输入。总数和日期是合理的。问题是电子表格包含 1000 个事务。您可以继续目测数据,一次一行,但这将花费很长时间,而且无法保证您的眼睛会错过数据格式或总花费值中的细微错误。
更聪明的选择是查看数据的基数。像cut -d '|' -f 2 lemonade_purchase.csv | sort | uniq -c | sort -rn
这样的 bash 命令将汇总所有总花费值,并根据出现次数对它们进行排序:
800 2.5
100 5
50 10
50 $
就像这样,您可以看到其中 50 笔交易的交易金额为$
,这毫无意义。现在,您将研究这个问题的可能解决方案,并继续清理数据。
3.测试、测试和更多测试
在加入 Lexer 之前,这是我写代码的过程:Write Code --> Count my blessings --> Execute --> Check if output looks right
。这是一个直觉游戏。
在 Lexer,我被引入了测试驱动开发(TDD)的美丽世界。测试指定您正在编写的特定代码段的输入和期望输出,然后它检查您的代码的实际输出是否与期望输出相等。
测试应该尽可能的具体和多样。测试给你信心,你的代码正在按预期工作。它用可靠的工作证据取代了直觉。
4.边缘情况下的设计
当我第一次开始数据争论时,我会很快形成一个清理数据集的攻击计划,并天真地期望它能完美地工作。我几乎不知道,当您有一个数百万行和 40-100 列的数据集时,您肯定会遇到您最初的攻击计划没有考虑到的边缘情况。这造成了严重的延误和方法的重复。
总是假设数据质量很差,所以你可以设计你的争论方法在最坏的情况下工作。
5.制作可伸缩代码
当你的 Ruby 脚本花了一个小时从 200 万行文本中解析并提取相关信息后,代码效率就跃升到了你的首要任务。在 Lexer,我学会了从大处着眼,总是问自己如何将一个解决方案大规模应用到几十亿字节的文本数据中。俗话说时间就是金钱,你通过代码效率节省的每一秒都是有价值的。
商业
6.想想你的客户如何使用你的产品
在 Lexer,我们帮助公司将数据用于真正理解和吸引客户。由于我的大部分工作都围绕着 Lexer 平台的技术工作,因此很容易脱离客户需求,转而沉迷于构建“酷”的功能,这些功能使用起来很酷,看起来很酷,但可能不那么有用。
7.只向需要您提供的解决方案的人销售
我在 Lexer 的第一个月,我让我们的一位业务开发经理卖给我一支笔。他说的第一句话是“你需要这支笔吗?”。我说‘不’。他说‘好吧。那就没必要把笔卖给你了。到目前为止,对我来说,销售意味着无论如何都要说服你的潜在客户购买你的产品。理论上,只要有足够的时间和努力,这是可行的,尽管成功率较低。或者,您可以尝试寻找那些拥有由您的产品实现的用例的客户。虽然你需要做额外的工作来发现这些潜力,但与“喷洒和祈祷”方法相比,这大大提高了你结束的机会。
8.找到需要回答的问题
这项工作最难的部分不是找到要回答的问题。这些为解决方案提供了背景,为我们提供了可操作的见解。许多组织都非常清楚“大数据”能为他们带来什么。例如,客户参与度的提高、收入的增加、流失率的降低等。然而,为了得到这些结果,大多数组织会被如何处理他们的数据所困扰。在这种情况下,问“如何?”是拼图中重要的一块。你如何利用这些数据为自己谋利?