Beads —仅附加针对内存占用优化的数据结构
我必须承认,我对数据表示产生了一种不健康的迷恋。我认为它是基本的构建模块,在计算机科学中没有得到足够的重视。
在这篇博文中,我想介绍一种数据结构,它主要专注于以非常紧凑的方式表示数据,因此提供了最小的内存占用和良好的数据局部性。
小免责声明:beads 数据结构的参考实现是用 Swift 编写的,所以简短的代码片段会在 Swift 中,但不用担心,我让它对于不熟悉 Swift 编程语言的人来说是易于理解的。
当我们谈论数据结构时,我们关注运行时特征和大 O 符号。然而,我没有看到很多关于内存占用的讨论。比如:链表是一种广为人知的数据结构,以 O(1) prepend 特性而闻名。然而,我从来没有读到过这样的讨论——一个 64 位架构上的指针如何有 8 字节宽,这意味着一个布尔值列表将为每个列表元素占用 16 字节。与位数组相比,布尔值链表需要 128x 更多的空间。不要让我从数据位置开始。
eads 被设计成一个序列,它在追加时压缩值。Append 是在常数时间内执行的,它涉及一些计算,但是这些并不是很昂贵,并且基于复杂性理论,我们可以假设运行时间特性为 O(1)。
让我们举一个实际的例子。假设我们有一个数字序列[1, 5, 6, 7]
,我们希望将它存储在一个数据结构中。最简单的就是把它存储在一个数组里。如果数字是正数并且小于 256,我们可以将它们存储在一个[UInt8](https://developer.apple.com/documentation/swift/uint8)
数组中。这意味着每个条目将只占用 1 个字节。
如果我们需要在数组中存储一个负数或者更大的数,会发生什么呢?在这种情况下,我们需要确定最大的可能值,并根据这种特殊情况选择一个数字类型。然而,预测潜在价值的大小非常困难,甚至是不可能的。这就是为什么我们通常不麻烦,我们定义一个整数数组[Int]
,其中[Int](https://developer.apple.com/documentation/swift/int)
在 64 位架构上是 64 位宽。这意味着我们每个条目占用 8 个字节,尽管这是完全不必要的。
珠子做了一些不同的事情。Beads 不仅存储值,还存储类型。一个类型存储在 4 位中,这意味着我们可以在一个字节中存储 2 个类型标签。让我们把我们的数字系列[1, 5, 6, 7]
储存在珠子里:
[{u8/u8}, 1, 5, {u8/u8}, 6, 7]
我们为每两个条目引入一个标签条目{/}
,这意味着条目的数量增长到 150%。因此,如果我们可以将我们的数字序列存储为一个[UInt8]
,我们就是在浪费空间。然而,如果我们将序列存储为[Int]
。该序列如下所示:
[1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,]
每个数字占用 8 个字节。我们假设我们在一个小端架构上。不需要的字节等于0
。如果我们比较珠子和一组Int
——珠子只占大约 19%的空间。
如果序列是稀疏的,这种影响会变得更大——意味着我们有很多nil
值。
例如:[5, nil, nil, nil, nil, 2]
=>6 字节
变成:[{u8/nil}, 5, {nil/nil}, {nil/u8}, 2]
=>5 字节
当一个nil
值被附加到珠子上时,只有标签被添加,因为标签只占用一半的字节,我们有 50%的好处。所以在[UInt8]
的情况下,我们损失 50%,[UInt8?]
随着每个nil
值获得 50%。也就是说,如果我们有相同数量的数字和nil
值,我们就是 100%。如果nil
值的数量更大,我们向 50%收敛。如果更小,我们就向 150%收敛。
追加是如何工作的?
珠子公开了各种数字类型的附加方法。当使用类型为Int
的数字调用 append 时,我们检查这个数字是否可以用更小的类型来表示。最简单但不一定是最有效的解决方案是双重造型和比较:
let value: Int = 42
let u8Value = UInt8(value)
if value = Int(u8Value) {
// store value as u8
}
我们把初始值转换成一个更小的数字表示,然后再把它转换回来,看看它是否等于初始值。在这种情况下,我们可以采用较小的表示,并将其存储在底层缓冲区中。
该解决方案甚至适用于浮点数。浮点通常以 4 字节(单精度)或 8 字节(双精度)存储。如果传递给 append 的值是一个[Double](https://developer.apple.com/documentation/swift/double)
,但实际上是一个小整数(例如42.0
),我们可以节省高达 81%的空间。
弦乐呢?
如果我们有一个只和数字一起工作的数据结构,这将是非常有限的。存储一个字符串序列是一个非常普通和重要的任务。
如果我们考虑一下,字符串只是一系列数字,它们对应于特定的字符编码。如今最流行的字符编码是 UTF-8 。它将文本转换成一系列的UInt8
数字,或者如果你愿意的话,转换成[Data](https://developer.apple.com/documentation/foundation/data)
。珠子可以附加一系列的UInt8
数字,或者Data
作为一个带有一对类型标签的珠子。这里有一个例子:
"Maxim" => [{data/u8}, 5, [77, 97, 120, 105, 109]]
字符串"Maxim"
用下面的标签对{data/u8}
表示。它表示下一个条目是以 u8 类型的大小为前缀的数据。这样,迭代器能够将下一个条目解释为大小5
,并且知道接下来的 5 个条目[77, 97, 120, 105, 109]
属于一起。数据内部的 5 个条目形成字符串"Maxim"
的 ASCII /UTF-8 表示的信息没有存储在任何地方,并且被认为是隐含的知识。
这里有一个更复杂的例子,我们存储了一个带有nil
值的字符串序列:
["Max", "Maxim", "", nil, "Alex"]
=>
[{data/u8}, 3, [77, 97, 120], {data/u8}, 5, [77, 97, 120, 105, 109], {data/u8}, 0, {nil/data}, {u8/-}, 4, [65, 108, 101, 120]]
让我们把这个例子分解一下。
"Max"
和"Maxim"
并不奇怪,它们存储在{data\u8}
标签中,后面是代表字符串的大小和数字。
空字符串(""
)却很有趣。标签字节仍然是{data/u8}
,但是后面只跟着0
。这些信息足以存储一个空字符串。
接下来是nil
,在这种情况下,我们甚至不需要标签对。一个nil
是一个nil
,可以用一个标签来表示,只占用标签字节的一半。
下一个条目是"Alex"
,不出所料,它必须由一个{data/u8}
标签对来表示,但是由于我们在前面的字节中仍有空间仅被nil
占用,因此该标签对将分布在两个字节中。这就是导致{nil/data}, {u8/-}, 4, [65, 108, 101, 120]
的原因。
零重量表示的压缩数据
如你所见,beads 非常努力地尽可能少地浪费内存。这是实现这个目标的另一个窍门。
如果我们将字符串存储在 UTF-16 中,让我们看看我们的字符串序列会是什么样子。这种格式也很普遍,但是特别是对于简单的 ASCII 字符来说更浪费。这是我们之前在 UTF-16 中的例子:
["Max", "Maxim", "", nil, "Alex"]
=>
[{data/u8}, 8, [255, 254, 77, 0, 97, 0, 120, 0], {data/u8}, 12, [255, 254, 77, 0, 97, 0, 120, 0, 105, 0, 109, 0], {data/u8}, 0, {nil/data}, {u8/-}, 10, [255, 254, 65, 0, 108, 0, 101, 0, 120, 0]]
现在"Max"
表示为{data/u8}, 8, [255, 254, 77, 0, 97, 0, 120, 0]
。标签字节是相同的,但是代表字符串的数字序列的长度是 8,而不是 UTF-8 中的 3。这是因为在 UTF-16 编码中,我们将每个字符存储在 2 个字节中,我们需要在序列前加上所谓的 BOM ,它可以识别数字是根据大端还是小端存储的。
当我们存储使用许多简单 ASCII 字符的语言(如英语)编写的文本时,我们最终会有许多0
值。这就是我所说的“ 零重表象 ”。在这种情况下,珠子提供一种特殊的珠子类型,称为紧凑数据(简称为c_data
)。让我们直接看看它的运行情况:
["Max", "Maxim", "", nil, "Alex"]
=>
[{c_data/u8}, 6, [{01010111}, 255, 254, 77, 97, 120], {c_data/u8}, 9, [{01010111}, 255, 254, 77, 97, 120, {00000101}, 105, 109], {c_data/u8}, 0, {nil/c_data}, {u8/-}, 8, [{01010111}, 255, 254, 65, 108, 101, {00000001}, 120]]
使用c_data
,我们能够将"Max"
减少到 75%——从 8 字节减少到 6 字节。
这是通过以下技术实现的:
我们创造了一串珠子。如果你仔细想想,[255, 254, 77, 0, 97, 0, 120, 0]
可以被看作是一个 beed 本身。不过我们知道数字都是UInt8
,所以可以用标志字节来存放别的东西。我们使用标志字节来存储下一个字节是否等于0
。这样我们减少了:
[255, 254, 77, 0, 97, 0, 120, 0]
to ( 位屏蔽应从右向左读)
[{01010111}, 255, 254, 77, 97, 120]
使序列缩短两个字节。
现在,记住我们将[1, 5, 6, 7]
存储为[Int]
的例子
[1, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0,]
这也是一个 零重的表象。 如果我们将其存储为c_data
会怎么样?
[{c_data/u8}, 8, [{00000001}, 1, {00000001}, 5, {00000001}, 6,{00000001}, 7]]
我们以(8 + 2)字节结束,这比 32 字节好,但仍然比 6 字节差,我们能够通过直接珠子追加来实现。
让我们进一步了解珠子的想法
我们讨论了添加数字和字符串,但是对于更复杂的数据类型呢?这一次,如果一个数据类型可以转换成Data
或[UInt8]
,我们可以像附加字符串一样附加它。然而,我们可以做得更好。假设我们想要创建一个三维向量的珠子:
struct Vector3 {
let x: Double
let y: Double
ley z: Double
}
我们可以说,我们可以将每一个Vector3
转换成它自己的珠子数据结构,然后将它们连接在一起。
让我们看看:
Vector(x:2, y: 4, z:0)
可转换为[{u8/u8}, 2, 4, {u8/-}, 0]
以及Vector(x:5, y: 8, z:257)
至[{u8/u8}, 5, 8, {u16/-}, 1, 1]
所以如果我们有多个向量
[
Vector(x:2, y: 4, z:0), Vector(x:5, y: 8, z:257)
]
我们可以把它们连接到下面的珠子上
[{u8/u8}, 2, 4, {u8/-}, 0, {u8/u8}, 5, 8, {u16/-}, 1, 1]
这里有一个有趣的小细节。Vector3
有 3 个属性,这意味着第二个标签的第二部分是一个 跳过 标记-
。如果我们想快速连接两颗珠子。我们保留 skip 标记,并用第二个珠子扩展第一个珠子的底层缓冲区。然而,如果我们不想浪费内存,我们可以将第二个珠子的成员一次附加到第一个值上,从而产生以下珠子:
[{u8/u8}, 2, 4, {u8/u8}, 0, 5, {u8/u16}, 8, 1, 1]
意思是——如果我们想为每秒连接的珠子节省一个字节,我们可以做到!(我不确定我们是否应该这样做)
在这一点上,我想强调一下,beads 是一个短暂的数据结构,也就是说,它不是持久的。这是一个有意识的选择,因为目标是拥有一个最小内存占用的数据结构。
我们如何从珠子中读取数据?
正如我之前提到的,珠子基本上是一个序列。在 Swift 中有一个叫做[Sequence](https://developer.apple.com/documentation/swift/sequence)
的协议,它对实现类型强加了一个要求:它必须提供一个迭代器。
大多数其他语言都提供了类似的协议:
[Iterable](https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html)
在 Java 中[IEnumerable](https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspx)
在 C#中[IntoIterator](https://doc.rust-lang.org/std/iter/trait.IntoIterator.html)
在生锈- 等等…
Beads 是一个Sequence
,迭代器提供对下一个 beads 的访问。那么作为用户,我们可以检查这个珠子是否是一个nil
值,或者要求将珠子解释为int
、uint
、double
或data
。如果给定的珠子不能按要求解释,我们得到一个nil
值。因为我们可以明确地检查一个值不是nil
,所以我们可以识别一个问题。
下面是一个简单的单元测试,我们将值附加到珠子上,然后将珠子映射到一个新的数组中,并检查它是否等于初始值:
func testSequenceU8AndI8ToInt() {
var beads = BeadsSequence()
let values = [
1, 0, nil, 250, nil, 5, -5, -127
]
for v in values {
beads.append(v)
}
XCTAssertEqual(beads.map { $0.int }, values)
}
复杂数据类型呢?
为了让处理复杂数据类型变得愉快,我们引入了一个BeadsConvertible
协议:
public protocol BeadsConvertible {
static func from(
sequenceIterator: BeadsSequence.BeadsIterator
) -> BeadsSequence.FailableResult<Self>?
var numberOfBeads: Int { get }
func toBeads() -> BeadsSequence
}
当一个类型实现这个协议时,它允许我们将这个类型的实例转换成珠子,反之亦然。
这是一个单元测试,它执行从[CGPoint](https://developer.apple.com/documentation/coregraphics/cgpoint)
阵列到珠子的往返行程:
func testCGPoint() {
var sequence = BeadsSequence()
let points = [
CGPoint(x: 2, y: 4),
CGPoint(x: 2.5, y: 4.5),
CGPoint(x: 2.1, y: 4.1)
]
for point in points {
sequence.append(point.toBeads())
} let pointsArray = sequence.beadsConvertibleSequence(
for: CGPoint.self
).map { try?$0.get() } XCTAssertEqual(points, pointsArray)
}
观点
Beads 是一种专门的数据结构,在内存占用和数据局部性很重要的用例中非常有用。它还被设计成数据序列化格式的平台。它有它的局限性,例如,它只能附加,但这也是它能做好一件事的原因。
我很想听听你们的想法、关切和建议。
我会尽快把链接添加到 github 库。
2018 年 8 月 26 日更新:
我很高兴地宣布,珠数据结构是在 Github:
GitHub 是人们构建软件的地方。超过 2800 万人使用 GitHub 来发现、分享和贡献超过…
github.com](https://github.com/beads-data-structure)
2019 年 5 月 31 日更新:
由于珠子用于 Dart,我们引入了另一种(最后一种可能的)珠子类型— TinyData。
当存储的字节数组小于 16 字节时,使用微小数据。在这种情况下,数据的长度可以存储为一个标签(4 位):
"Maxim" => [{t_data/5}, [77, 97, 120, 105, 109]]
这样,我们为每个项目节省了一个字节。
目前只能在 dart 存储库中找到微小数据的实现:
Dart 的珠子数据结构。通过在…上创建帐户,为 beads-data-structure/beads _ dart 开发做出贡献
github.com](https://github.com/beads-data-structure/beads_dart)
其他实现也将随之而来。
用于数据可视化的 BeakerX 和 Python
Jupyter Notebooks 为数据工程师提供了一个强大的工具,可以即时从海量数据中提取见解。典型地,Pythonistas 使用笔记本来快速编译代码、测试/调试算法和扩展程序执行;一个健壮的 Javascript 内核(这里是)现在也可以作为 IJavascript 用于笔记本,但是当然,即使是笔记本使用的 Javascript 仍然遵守变量声明的单赋值约束。由于 Jupyter 提升了 Python 安装包,Jupyter 笔记本迅速发展成为 Python 学习和数据科学的默认平台,数据可视化越来越成为大规模数据集和预测映射的可访问窗口。
BeakerX 是由 Two 适马发起的一个开源项目,这是一家投资管理公司,为他们的投资决策提供机器学习和分布式计算。作为适马众多开源项目中的一个,BeakerX 是迄今为止最强大、对社区贡献最大的项目,其多方面的目标是扩展 Jupyter 生态系统。
尽管这个项目——更确切地说是 Jupyter 扩展的分组——乍一看似乎增加了 Jupyter 笔记本的绘图和通用数据可视化库存,但它也为笔记本增加了多语言支持;通过 BeakerX 的安装,用户可以用 JVM 语言和其他语言(Groovy、Scala、Clojure、Kotlin、Java、SQL,当然还有 Python)创建一个笔记本。或者,如下所示,Python 和 Javascript 的混合(通过 Jupyter 的 magics 和 autotranslation)结合起来,从 Python 操作的数据集创建 D3.js 交互式可视化:
Python and Javascript in the same notebook — for a future post?
迟早会给我们带来:
Python & D3.js, via BeakerX
然而,BeakerX 的可视化和交互功能正是这个项目的初衷,我们将通过一个交互示例来展示它的易用性。(尽管 BeakerX 的官方活页夹中的许多例子都是用 Groovy 编写的,但我们在这里将重点关注 Python。)
装置
首先,确保PATH
被正确声明(这是关于 MacOS 安装的*)。MacOS 上的 Python 和 Anaconda 有时可能无法按预期执行,尤其是当您的机器上有多个 Python 版本时(例如 Python 2.7&3.6);Pandas 可能在一个位置,而可执行的 Python 版本在另一个位置(在这种情况下,您可以通过终端为必要的版本起别名)。我发现在尝试安装 BeakerX 的首选方法conda install
之前,以下方法可以确保事情指向正确的方向。*
~ $ export PATH=~/anaconda3/bin:$PATH
一旦处理完毕,一个接一个地运行下面的代码行,它们应该会毫无问题地执行和安装相关的库:
~ $ conda create -y -n beakerx 'python>=3'
~ $ source activate beakerx
~ $ conda config --env --add pinned_packages 'openjdk>8.0.121'
~ $ conda install -y -c conda-forge ipywidgets beakerx
( NB。BeakerX 与 Python 版本> 3.4 一起工作。)
在那里,从 Anaconda Navigator 或您的终端初始化您在localhost:8888
的 Jupyter 笔记本,
~ $ jupyter notebook
Take note of the available JVM languages, in addition to Python 3 and SQL
初始化后,我喜欢运行下面的代码来检查一切是否正常:
我们准备好出发了…
该项目
熟悉 BeakerX 功能的最佳方式是解析官方活页夹,并从熟悉的数据可视化技术开始,如时间序列输出、热图或直方图,所有这些都可能是数据科学家通过 Seaborn 的基于 matplotlib 的库或 Bokeh 库所熟悉的。我们将关注基于 Python 的输出容器示例的一小部分,这里的是。
我们将使用 Python 和 Pandas 从大约 300 行数据中创建一个交互式散点图,最终结果如下:
Finished product
这些数据是 BeakerX 自己的,可以在 GitHub repo 上找到。为了便于测试,有一个数据的最小化版本,但是我将使用完整的版本,它只有 314 行长,因此生成了一个更完整的图。
(有一点需要简要说明:散景的交互性本身就很强大和令人满意,而 bqplot——通过彭博——同样提供了标准化的 2D 可视化选项。但是 BeakerX 更适合与 Spark 集群计算框架集成,一个简短的教程展示了在 BeakerX 的领导下,TensorFlow 和神经网络集成是如何轻松实现的。)
尽管如此,出于介绍的目的,我们还是将重点放在一个简单的散点图上。因此,首先,我们必须通过 Pandasread
数据,并打印前 5 行以检查是否一切正常:
Did we import Pandas?
敏锐的读者会注意到我们只跑了import beakerx
(或者,T2)。然而,我们可以在不进口熊猫的情况下经营熊猫…
查看源代码可以发现,BeakerX 将 Pandas 合并到了它的构建中,提供了自动编译的pd.dataframe
和其他 Pandas 调用的功能。
如果不了解 Pandas 库,当基于 Python 的笔记本生成可视化或处理数据时,可能很容易忽略 BeakerX 允许的大量简写代码。因此,知道pd
引用了什么是有帮助的,即使read_csv
是相当不言自明的。(只要确保.csv
在一个可到达的目录中!)在这种情况下,BeakerX 依赖于 panda,但它也用更多类似电子表格的动作来增强 panda 的基本方法。正如下面可以看到的,BeakerX 对 Pandas 库的处理带来了更大的灵活性,从而(更)容易实现可视化。这次,对前 20 行数据运行df.head(20)
:
接下来,我们将处理美学:
以及处理绘图的代码:
当涉及到这样的绘图时,熟悉熊猫当然有所帮助,但如果你使用过 Jupyter 笔记本,那么你已经完成了关于熊猫、其数据帧和某种绘图的基础知识。IPython 旨在轻松处理这些事情。但简单来说…
我们将数据帧设置为df
,在我们调用plot.add
来构建绘图的地方,我们同样调用Points
和Line
参数作为数据的x
和y
轴。因此,df.y1
是df
数据帧中的y1
列;df.y30
是df
数据框中的y30
列。等等。此外,为了便于说明,我们将setShowLegend
布尔值设置为True
,将鼠标悬停在图例中的项目上会根据所选的动作照亮或隐藏相应的数据点。
最终,这将产生一个整洁的、交互式的(参见。多亏了 BeakerX,只需几行 Python 代码就能绘制出来:
结论
由于内置了多语言功能和笔记本 magics,BeakerX 是一个效率和工作流的发电站,很高兴看到更多的神经网络处理开发,特别是通过 TensorFlow 或分布式计算框架。这样的进步将允许更多的编程新手容易和直观地理解人工智能编程的复杂内部工作原理。
但在我看来,最令人兴奋的是它是开源的,是适马推动数据科学社区的两个项目之一。许多活跃的问题可供每个人挖掘并着手处理。
CTC 训练神经网络中的波束搜索解码
一种具有集成语言模型的快速且性能良好的算法,用于在文本识别背景下解码神经网络输出
由卷积神经网络层和递归神经网络层以及最终的连接主义时间分类(CTC)层组成的神经网络(NN)是(手写)文本识别的良好选择。
神经网络的输出是一个矩阵,包含每个时间步长(水平位置)的字符概率,图 1 中显示了一个例子。这个矩阵必须被解码以得到最终的文本。实现这一点的一种算法是波束搜索解码,它可以很容易地集成字符级语言模型。
Fig. 1: Output matrix of NN consisting of two time-steps (t0, t1) and two characters (“a”, “b”) plus the CTC blank (“-”). The numbers indicate the probability of seeing the character at the given time-step.
我们将从回顾 CTC 和最佳路径解码开始我们的讨论。然后我们将讨论 CTC 波束搜索解码算法的构建模块(基本算法、CTC 评分、语言模型)。最后,我将向您介绍一个 Python 实现,您可以使用它来进行自己的测试和实验。
简短提醒反恐委员会如何工作
阅读文章“联结主义时态分类的直观解释”有助于你理解下面的讨论。在这里,我将给出一个简短的回顾。
CTC 允许用成对的图像和真实文本来训练文本识别系统。文本通过路径在 NN 输出矩阵中编码,每个时间步包含一个字符,例如“ab”或“aa”是图 1 中可能的路径。我将用双引号“文本”显示文本,用单引号“路径”显示路径。
路径以下列方式对文本进行编码:文本中的每个字符都可以重复任意多次。此外,可以在字符之间插入任意数量的 CTC 空格(非字符,不要与空白字符混淆,在本文中用“-”表示)。如果出现重复字符(如“pizza”),则路径中这些重复字符之间必须至少有一个空格(如“piz-za”)。
以下是带有相应路径的文本示例:
- "到"→ ‘-t-o -’,’ tttttttt-ooo-',‘到’,…
- “你好”→‘h-ellll-ll-ooo’,‘hel-lo’,…
- " a" → ‘aa ‘,’ a-’,'-a ',…
如您所见,一个文本对应的路径可能不止一个。当我们对文本的概率感兴趣时,我们必须对所有相应路径的概率求和。单个路径的概率是该路径上的字符概率的乘积,例如,对于图 1 中的路径‘aa ’,它是 0.2±0.4 = 0.08。
最佳路径解码
最佳路径解码是解码输出矩阵的最简单方法:
- 每个时间步连接最可能的字符,产生最佳路径。
- 然后,通过首先删除重复字符,然后删除所有空格来撤消编码。这给了我们可识别的文本。
让我们看一个例子:矩阵如图 2 所示。对于时间步长 t0 和 t1,得分最高的字符为空。所以,最佳路径是’-'。然后我们撤销编码,得到文本" "。此外,我们可以通过乘以字符概率来计算路径的概率,在本例中是 0.8±0.6 = 0.48。
Fig. 2: Concatenate most probable characters per time-step to get best path.
最佳路径解码速度很快,我们只需为每个时间步找到分数最高的字符。如果我们有 C 个字符和 T 个时间步,算法的运行时间为 O(T ^ C)。
为什么最佳路径解码会失败
最佳路径解码既快速又简单,这当然是很好的特性。但是在某些情况下可能会失败,如图 2 所示。在图 3 中,对应于文本“a”的所有路径被示出:“aa”、“a-”和“-a”。文本“a”的概率是这些提到的路径的所有概率的总和:0.2 0.4+0.2 0.6+0.8 0.4=0.52。所以,“a”比“”的概率更大(0.52>0.48)。我们需要一种比最佳路径解码更好的算法来处理这种情况。
Fig. 3: All paths corresponding to text “a”.
波束搜索解码的基本版本
波束搜索解码迭代地创建文本候选(波束)并对它们评分。基本版本的伪代码如图 4 所示。:用空射束(第 1 行)和相应的分数(2)初始化射束列表。然后,该算法在神经网络输出矩阵(3–15)的所有时间步长上迭代。在每个时间步长,仅保留来自前一时间步长的最佳刻划射束(4)。波束宽度(BW)指定要保留的波束数量。对于这些波束中的每一个,计算当前时间步长的分数(8)。此外,每个光束被扩展字母表中所有可能的字符(10),并且再次计算分数(11)。在最后一个时间步之后,返回最佳波束作为结果(16)。
Fig 4: Basic version of beam search.
让我们用 BW 2 和 alphabet {“a “,” b”}来形象化算法如何解码我们的示例 NN 输出。图 5 示出了待解码的 NN 输出和波束树。该算法从一个空射束“”开始,它对应于树的根节点。然后,光束被复制并被字母表中所有可能的字符扩展。这给了我们光束“a”,“b”和“”。稍后,我们将进一步了解如何计算射束分数。现在,我们使用我们的直觉,看到只有一条路径对应于每个波束:“a”的概率为 0.2,“b”的概率为 0,“a”的概率为 0.8。
在下一次迭代中,我们只保留来自前一时间步的 2 个最佳波束(根据 BW ),即我们丢弃波束“b”。然后,我们再次复制并扩展幸存的梁,得到" aa “,” ab “,” a “,” a “,” b “,” "。如果两个光束相等,如“a”的情况,我们简单地将它们合并:我们将分数相加,只保留其中一个光束。我们再次用我们的直觉来计算分数。每个包含“b”的波束的概率为 0。“aa”的概率也是 0,因为要对具有重复字符的文本进行编码,我们必须在字符之间插入空格(例如“a-a”),这对于长度为 2 的路径是不可能的。最后剩下的就是光束“a”和“”。我们已经计算了它们的概率:0.52 和 0.48。
我们完成了最后一次迭代,算法的最后一步是返回得分最高的射束,在本例中是“a”。
Fig. 5: NN output and tree of beams with alphabet = {“a”, “b”} and BW = 2.
在横梁上划线
我们还没有讨论如何在平衡木上得分。我们将波束得分分成以空白结尾的路径得分(例如“aa-”)和以非空白结尾的路径得分(例如“aaa”)。对于非空白情况,我们用 Pb(b,t)和 Pnb(b,t)表示所有路径以空白结束并对应于时间步长 t 处的波束 b 的概率。波束 b 在时间步长 t 处的概率 Ptot(b,t)就是 Pb 和 Pnb 之和,即 Ptot(b,t)=Pb(b,t)+Pnb(b,t)。
图 6 显示了当我们扩展一个路径时会发生什么。主要有三种情况:通过空格扩展、通过重复最后一个字符扩展和通过其他字符扩展。当我们折叠延伸的路径时,我们要么得到未改变的(复制的)光束(“a”→“a”),要么得到延伸的光束(“a”→“aa”或“ab”)。我们也可以反过来使用这些信息:如果我们延伸一个光束,我们就知道我们必须考虑哪些路径来计算分数。
Fig. 6: The effect of appending a character to paths ending with blank and non-blank.
让我们看看如何迭代计算 Pb 和 Pnb。请注意,我们总是添加而不是分配计算值(+=而不是=),这隐式地实现了前面讨论的光束合并。所有 Pb 和 Pnb 值最初设置为 0。
复制光束
要复制一个光束,我们可以用一个空格扩展相应的路径,得到以空格结尾的路径:Pb(b,t)+=Ptot(b,t-1) mat(blank,t)。
此外,我们可以通过最后一个字符来扩展以非空白结尾的路径(如果光束非空):Pnb(b,t)+=Pnb(b,t-1) mat(b[-1],t),其中-1 表示光束中的最后一个字符。
延伸光束
有两种情况。要么我们将光束扩展一个不同于最后一个字符的字符 c,那么就不需要在路径中分隔空格:Pnb(b+c,t)+=Ptot(b,t-1) mat(c,t)。
或者最后一个字符 b[-1]被重复,那么我们必须确保路径以空格结束:Pnb(b+c,t)+=Pb(b,t-1) mat(c,t)。
我们不用关心 Pb(b+c,t),因为我们增加了一个非空白字符。
字符级语言模型
字符级语言模型(LM)对一系列字符进行评分。我们将 LM 限制为对单个字符(unigram LM)和成对字符(bigram LM)进行评分。我们将字符 c 的一元概率表示为 P(c ),将字符 c1,c2 的二元概率表示为 P(c2|c1)。一条短信“hello”的得分是看到单个“h”的概率,看到一对“h”和“e”挨着的概率,以及一对“e”和“l”挨着的概率,…
一个字符序列 c1,c2,c3,…的概率为:P(c1,c2,c3,…)=P(c1) P(c2|c1) P(c3|c2) …
从大量文本中训练这样一个 LM 很容易:我们只需计算一个字符出现的频率,然后除以字符总数,就可以得到单字概率。我们计算一对字符出现的频率,并对其进行归一化,以获得二元模型概率。
把所有的放在一起
CTC 波束搜索算法如图 7 所示。它类似于已经展示过的基本版本,但是包含了对梁进行评分的代码:复制的梁(第 7-10 行)和延伸的梁被评分(第 15-19 行)。此外,当将光束 b 延伸字符 c 时,应用 LM(第 14 行)。在单字符梁的情况下,我们应用一元得分 P©,而对于更长的梁,我们应用二元得分 P(b[-1],c)。波束 b 的 LM 分数被放入变量 Ptxt(b)中。当算法寻找最佳得分波束时,它根据 Ptot Ptxt(第 4 行)对它们进行分类,然后取 BW 最佳波束。
Fig. 7: CTC beam search with character-level LM.
运行时间可以从伪代码中推导出来:最外面的循环有 T 次迭代。在每次迭代中,N 个波束被排序,这占 N log(N)。BW 最佳波束被选择,并且它们中的每一个被扩展 C 个字符。因此,我们有 N=BW C 个波束,总运行时间为 O(T BW C log(BW C))。
履行
波束搜索解码(以及其他解码算法)的 Python 实现可以在 CTCDecoder 资源库中找到:相关代码位于 src/BeamSearch.py 和 src/LanguageModel.py 中,TensorFlow 提供了 ctc_beam_search_decoder 操作,但是,它不包括 LM。
估价
在 IAM 数据集上对 NN 进行解码给出了最佳路径解码的 5.60%的字符错误率,以及波束搜索解码的 5.35%的字符错误率。每个样本的运行时间从 12 毫秒增加到 56 毫秒。
下面是 IAM 数据集的一个示例(见图 8 ),可以更好地了解波束搜索如何改善结果。使用和不使用 LM 的最佳路径解码和波束搜索来完成解码。
Ground truth: "the fake friend of the family, like the"
Best path decoding: "the fak friend of the fomly hae tC"
Beam search: "the fak friend of the fomcly hae tC"
Beam search with LM: "the fake friend of the family, lie th"
Fig. 8: Sample from IAM dataset.
结论
CTC 波束搜索解码是一种简单快速的算法,性能优于最佳路径解码。角色级别的 LM 很容易集成。
参考
- 解码器的 Python 实现(最佳路径、波束搜索……)
- 解码器比较
- 字束搜索解码
- CTC 简介
- Hwang 和 Sung——使用递归神经网络的字符级增量语音识别
- Graves 和 jait ly——利用递归神经网络实现端到端语音识别
在 5 分钟内击败 Datadriven 的邓艾竞赛基准
持续时间最长、最有趣的数据科学和机器学习竞赛之一毫无疑问是邓艾竞赛。参赛者被要求根据环境信息预测两个南美城市的登革热病例数。
在本文中,我们试图通过仅使用一个特征和时间序列预测来击败竞争对手的基准分数。在脸书的先知库,一个 Jupyter 笔记本和总共二十行代码的帮助下,我们学会了如何在几分钟内打破基准分数。
邓加伊
比赛要求你利用美国联邦政府各机构收集的环境数据,预测圣胡安(波多黎各)和伊基托斯(秘鲁)每周报告的登革热病例数。所提供的数据具有诸如每周最高温度、湿度和降雨量的特征。
平均绝对误差 (MAE)用于评分。看看排行榜上的最高分,很明显挑战并不容易:最高分的人只有 13 分多一点,而排名在第 100 位左右的人只有 17 分。如果你知道在 Iquitos 提供的数据中,每周的平均病例数只有 8 例左右,这意味着即使是顶级模型也几乎没有预测能力。
然而,比赛组织者提供了一个基准分数,包括一个完整的笔记本来帮助你开始。在这个例子中,他们只使用了负二项式广义线性模型中的几个特征,结果得分为 25.81。这篇文章的目标是通过使用时间序列预测技术,尽可能快地打破这个记录**。为了帮助我们完成这项任务,我们将使用脸书的 Python 先知库。**
什么是脸书先知
2017 年初脸书开源 Prophet 、Python 和 R. Prophet 中可用的预测工具特别适合预测季节性强、历史趋势变化和遵循非线性增长曲线的趋势的时间序列。使用 Prophet 的其他好理由是提供的优秀文档和整体易用性。
Prophet for Python 可以像任何其他库一样使用,可以在命令行安装或更新。因为我使用 Python 的 Anaconda 发行版,所以我使用了一个简单的 conda 安装。
conda install -c conda-forge fbprophet
如果你在安装 Prophet 时遇到任何麻烦或错误,看看 Github 的问题或者在谷歌搜索中抛出你的错误。
准备数据
在开始预测之前,我们需要掌握数据。进入邓艾竞赛页面下载列车功能、列车标签和测试功能。然后打开一个 Jupyter 笔记本,导入熊猫*、 numpy 、 matplotlib 和 fbprophet (全库或者只 Prophet 类)。*
*import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from fbprophet import Prophet*
将数据载入你的笔记本。
*train = pd.read_csv('dengue_features_train.csv')
test = pd.read_csv('dengue_features_test.csv')
labels = pd.read_csv('dengue_labels_train.csv')*
由于我们将尝试纯粹基于时间数据进行预测,因此我们可以从数据框架中去掉城市*、周 _ 开始 _ 日期和总 _ 例数。注意,我们选择 week_start_date 作为时间数据,因为这个特性已经被表示为一个标准日期时间字符串,并且不需要任何转换。*
*train['total_cases'] = labels['total_cases']prophet_data = train[['city', 'week_start_date', 'total_cases']]*
接下来,拆分伊基托斯和圣胡安的数据,删除城市列,因为我们的预测不需要这个。
*prophet_data_sj = prophet_data[prophet_data['city'] == 'sj']\
.drop('city', axis=1)
prophet_data_iq = prophet_data[prophet_data['city'] == 'iq']\
.drop('city', axis=1)*
然后,对您的测试数据进行同样的操作,但是只保留 week_start_date 列。
*test_sj = test[test['city'] == 'sj']['week_start_date']
test_iq = test[test['city'] == 'iq']['week_start_date']*
为了使 Prophet 库正常运行,必须将时间特性命名为 ds 以及预测值为 y 。对两个数据帧都这样做。
*prophet_data_sj.columns, prophet_data_iq.columns =
['ds', 'y'], ['ds', 'y']*
现在我们的数据已经准备好进行一些先知魔法了!
先知魔法
我们可以开始使用 fbprophet 库来预测我们测试数据的值。为了方便起见,我们将创建一个函数,将训练数据、测试数据和两个预测参数作为输入。
建立先知预测的第一步是创建一个先知类的新实例。在初始化该类时,您可以设置一大堆参数(例如周 _ 季节性或日 _ 季节性*),但我们将只设置变点 _ 先验 _ 标度(默认为 0.05) 和年 _ 季节性(默认为 10) 。*
为了理解第一个参数的含义,你需要知道时间序列的趋势经常发生突变。这些变化被称为变点。 Prophet 将自动检测这些变化点,并允许趋势适当调整。
Prophet 通过首先指定大量潜在的变点来检测变点,然后对速率变化的幅度进行稀疏先验。这实质上意味着,Prophet 有大量可能改变速率的地方,但将尽可能少地使用它们。
调整稀疏先验的强度将改变模型的灵活性,并且可以使用 changepoint_prior_scale 参数进行调整。通过向上调整该参数,将使用更多的变点,因此模型将更好地拟合训练数据。
因为这个参数被用来改变模型的灵活性,并对抗过拟合或欠拟合,我们在函数中称这个参数为 flex 。
第二个参数yearly _ 季节性*,是使用部分傅立叶和估算的。看看这篇论文了解更多关于部分傅里叶和与周期信号的信息。本质上,季节性论点决定了季节性变化的速度。*
在我们的案例中,我们最有可能更好地应对较低的季节性,因为我们的数据与似乎不会改变的年度天气模式密切相关(看看气候训练和测试数据)。
我们函数的下一步是通过调用 fit() 函数使我们的训练数据符合我们的 Prophet 。然后,我们希望创建一个数据帧,表示我们希望预测的未来日期。这可以通过调用我们的 Prophet 上的make _ future _ data frame()函数来轻松完成。
该函数有两个参数:周期和频率*。在我们的例子中,周期的数量应该正好是我们测试数据的长度,频率应该设置为每周一次(‘W’),因为我们每周都有数据点。*
然后,终于到了用预测值填充我们未来数据框架的时候了。我们通过调用 Prophet 上的 predict() 来实现这一点,并将未来数据帧作为输入。我们还在 Prophet 上运行 plot() 来获得我们预测的可视化。
*def create_forecast(train_data, test_data, flex, seas):
prophet = Prophet(changepoint_prior_scale=flex,
yearly_seasonality=seas)
prophet.fit(train_data)
future_frame = prophet.make_future_dataframe(
periods=len(test_data),
freq='W')
forecast = prophet.predict(future_frame)
prophet.plot(forecast)
forecast = forecast[['ds', 'yhat']].yhat\
.apply(lambda x : int(x))return forecast[len(train_data):]*
如果您看一下预测数据帧,您应该看到它有一大堆变量,包括时间戳( ds )和预测值( yhat )。切掉这两个值,并将预测转换为整数(竞赛只接受整数作为预测)。
数据帧还包括来自我们的训练和测试数据的所有数据。我们只需要对测试数据的预测。截取测试数据并返回这个数据帧作为我们函数的输出。现在,我们的功能已经完成,我们可以开始使用它来预测我们的登革热数据。
制作两个预测,一个针对伊基托斯,一个针对圣何塞,并将它们存储在一个变量中。这里,我们使用季节性(10)和灵活性(0.05)的默认值。
*forecast_sj = create_forecast(prophet_data_sj, test_sj, 0.05, 10)
forecast_iq = create_forecast(prophet_data_iq, test_iq, 0.05, 10)*
查看预测,我们可以看到我们确实创建了两个熊猫系列,并对我们的测试数据进行了预测。除了这个系列,还应该弹出一个图表,其中原始数据是分散的,预测是连续的线。摆弄一下季节性和灵活性参数,看看它们如何影响预测(蓝线)信心(浅蓝色)趋势(红线)和转折点(垂直红色虚线)。
Predictions for San Juan with respectively high flexibility and high seasonality
提交结果
可以说是整个流程中最简单的一步,就是准备好提交的结果并上传到 DrivenData 上。要了解提交要求,看一下提交格式(在这里找到)。
DengAI submission format
总之,比赛需要一个。csv* 文件,有四列,分别命名为城市、年份、星期几和总 _ 例数(我们的预测)。我们再次创建一个函数,将两个城市的预测和一个提交名称作为输入。*
我们连接预测,将它们与索引列合并,给所有列指定所需的名称,并将结果数据帧保存为。csv* 文件。确保为您的 csv 提供适当的名称,以便您记住用于预测的参数(例如 prophetflex05seas10 )。*
*def create_submission(forecast_sj, forecast_iq, sub_name):
test_index = test[['city', 'year', 'weekofyear']]
output = pd.concat([forecast_sj, forecast_iq])\
.reset_index().drop(['index'], axis=1)
output.columns = ['total_cases']
pd.concat([test_index, output], axis=1)\
.set_index(['city']).to_csv(sub_name + '.csv')*
现在,用默认的预测参数创建一个新的提交,并给它起一个合适的名字。
*create_submission(forecast_sj, forecast_iq, 'prophetflex05seas10')*
前往竞赛提交页面并上传您刚刚创建的 csv 文件以获得分数。您应该得到 26.76 的结果,这不是我们所希望的,比基准测试还要差。请记住,这个分数是我们测试数据集中每个预测日期的平均误差。
看看您的代码生成的图表,您会发现两种预测多一点灵活性可能不会有什么坏处(增加灵活性)。此外,伊基托斯的季节性非常多变,我们的预测会更好,季节性趋势会稍微平稳一些(减少季节性)。
Forecast for San Juan and Iquitos with default Prophet parameters
用这些新信息做一个新的预测。例如,将两个城市的弹性设置为 0.10,并将伊基托斯的季节性降低为 5。
*forecast_sj = create_forecast(prophet_data_sj, test_sj, 0.1, 10)
forecast_iq = create_forecast(prophet_data_iq, test_iq, 0.1, 5)create_submission(forecast_sj, forecast_iq, 'prophsjf10s10iqf10s5')*
再次提交结果,并得出结论,我们仅用几行代码和一个特性( week_start_date )就击败了竞争基准。请注意,没有使用机器学习来进行预测。
下一步是什么?
- ***用剩下的数据!*利用环境数据根据天气特征进行预测。将这些结果与我们在这里建立的时间序列预测模型结合起来。
- 调整参数。尝试通过改变参数来提高模型的得分,不仅是这里讨论的参数,还有这里没有讨论的所有其他参数(参见文档)。
- 寻找新的数据源。看看你能否在新闻网站或博客上找到任何关于圣胡安和/或伊基托斯登革热疫情(或没有疫情)的信息。了解年度趋势会给你带来巨大的优势。
—请随时在评论中或私信中向我指出任何不一致或错误。—
我们的人工智能如何使用数据科学在梦幻超级联赛中获得前 10 名
(团队编号:2057677)
我们对 EPL 梦幻联盟的摇钱树方法
注意:我们开始了一个新的博客,我将在这里运行更新的算法,并更新我的团队在整个 19-20 赛季的表现:
我的朋友( Andrew Sproul )和我已经玩了很多年的官方梦幻英格兰超级联赛,尽管我们坚信我们了解英格兰足球的一切,但我们倾向于年复一年地“倒霉”,不知何故似乎从来没有选出获胜的球队。因此,我们最终决定将数据科学和“金钱球”方法应用于团队/球员分析,以确定我们是否真的在每个赛季选择了最佳的球员组合。我们的研究始于从梦幻游戏 API 中提取最新的玩家数据,并使用 Python 对所有 EPL 团队和所有个人玩家进行统计分析。我们项目的最终目标是编写一个 Python 算法,它使用来自我们分析的数据进行“智能”挑选,并在我们有限的 100 毫米预算下建立最佳的梦幻联盟阵容。
注意:最理想的幻想小队将会根据每花费一美元的幻想点数返回的总点数=投资回报率来衡量。
我们的分析将以以下假设为指导,旨在回答以下关键问题:
- 要检验的主要假设:
- 大多数娱乐性的 EPL 幻想玩家在为他们的幻想队挑选队员时会有个人偏见和偏爱。换句话说,人们通常会根据他们支持的球队以及目前哪些 EPL 球员是“最热门”的来做出决定,而不会将单个球员视为长期投资以及他们每一美元的投资回报率。
- 我们相信,如果我们在选择我们的梦幻阵容时,从决策过程中消除偏见和偏袒,并专注于单个球员的统计数据和整体团队表现,我们可以在赛季结束时比普通人做得更好。
2.我们的分析旨在回答的关键问题:
- 个别球员梦幻联赛的统计数据,他们的球队在英超联赛中的总积分,以及该球队相应的积分榜位置之间是否存在相关性?
- 我们能否识别出有很多表现不佳、价格过高的球员的球队,以及那些拥有非常稳固但被低估的阵容的球队,这样我们就可以告诉我们的算法相应地从这些球队中挑选球员?(注:“被低估”和“被高估”是根据幻想联盟成本而非现实世界中的实际玩家价值来衡量的。)
- 我们能否将英超官方梦幻游戏视为股票市场的等价物,将单个球员视为金融资产,并根据他们的投资回报率找出所有定价过低和过高的球员,并相应地投资我们的梦幻美元预算?
单个玩家投资回报率=玩家幻想点数/玩家幻想成本(换句话说,我们在玩家身上花费的每 1 毫米幻想美元的总点数回报。)
- 我们的理论是,这有助于将我们有限的 1 亿英镑梦幻联盟预算花在球员身上,在整个赛季中,每花 1 美元梦幻就能获得尽可能多的积分。
- 如果这被证明是真的,那么我们是否可以使用 Python 来构建一个算法,通过挑选尽可能多的高 ROI 球员并结合一些昂贵的超级明星来优化预算的使用,以最大化每总预算支出的总积分回报?
- 我们的算法和玩 EPL 幻想游戏的普通人相比怎么样?我们的团队获得了什么样的总体排名,他们是否以显著优势击败了普通玩家?
**注意:**这个项目是在 2018 年 11 月 14 日,游戏周 10 之后执行的,所以文章中的所有数据和表格都是准确的。
我们程序的主要步骤如下:
1.查看单个团队的数据
首先,我们首先根据目前的积分榜排名排列所有巴克莱 EPL 球队,并查看所有球员的总积分,以了解这是否与球队的积分榜位置直接相关。
Total Fantasy Squad Cost vs. Total Fantasy Points per team
我们可以清楚地看到,一般来说,一支球队在英超联赛中的表现与其球员的累计梦幻积分之间存在线性相关性。上面的橙色条显示了每支球队的球员在梦幻联盟货币方面的总成本。这有助于我们识别出平均每美元投资(ROI)可产生可观梦幻积分回报的球队,例如— 曼城、利物浦、切尔西、亚足联伯恩茅斯、沃特福德和狼队。这也暴露了一些被认为是糟糕投资的球队,如——热刺、阿森纳、曼联、富勒姆、哈德斯菲尔德、西汉姆和南安普顿。
接下来,我们绘制了每支球队的累积球员投资回报率与教练经常使用的球员数量的关系图(本赛季迄今为止至少打了 360 分钟的球员)。这将有助于我们识别那些拥有太多昂贵且表现不佳的球员的球队,由于他们的教练经常轮换阵容,这些球员很少每场比赛打满 90 分钟,从长远来看,这使他们成为一项糟糕的投资,因为他们不会每场比赛都持续不断地产生梦幻积分。此外,下面的图表将帮助我们确定教练不经常轮换球员的球队,这将导致这些球队拥有更一致的常规球员核心。这将通知我们的算法从这些球队中挑选更多的球员,因为从长远来看,他们的球员预计会产生更高的总 ROI,因为与来自经常轮换球员的球队的球员相比,他们平均会参与更多的游戏活动。
Team ROI vs Number of players that have played more than 360 mins
在上图中,我们在寻找有很高的蓝条(累积球员投资回报率)和较短的橙条(教练定期使用的球员总数)的球队。这一类别的领导者是伍尔弗汉普顿,的 AVG 投资回报率为 8.21,只有 11 名教练经常使用的球员(平均每名伍尔弗汉普顿球员身上花费的 1 美元产生 8.21 分的收益)。这意味着与他们的表现相比,伍尔弗汉普顿的大多数球员都被低估了,教练经常使用同样的 11 名球员,并且只在比赛快结束时或正式队员受伤时使用替补队员。即使像曼城、利物浦和切尔西这样的球队也属于这一类,拥有 13-14 名正式队员,这意味着从上述任何球队中挑选球员从长远来看都是一项不错的投资,因为正式队员比替补队员平均上场时间更长。
这一类别中最大的输家是曼联、热刺、阿森纳、埃弗顿、西汉姆和富勒姆,他们的投资回报率在 4-5 之间,许多常规球员的回报率高达 15-16。这意味着,通过从这些球队中挑选球员,你正在进行一项“糟糕的投资”,因为教练经常轮换阵容,你的球员可能无法参加每场比赛。此外,统计数据清楚地表明,与他们在梦幻联盟中的表现相比,这些球队的球员被高估了,这是由他们低于平均水平的 ROI 所表明的。
2.查看单个玩家的数据
在确定了哪些团队产生了更高的累积投资回报率之后,我们接着放大了单个玩家。在股票市场方面,我们已经确定了所有的高收益市场部门——团队——现在我们要开始分析每个部门的所有个股——玩家。计划是分离出一个具有最高 ROI 的玩家列表,并编写一个 Python 算法,该算法将使用智能逻辑来挑选最佳的玩家组合,这将为我们 1 亿毫米的有限预算带来最高的投资回报。
看着上面玩家花费与玩家总幻想点数的散点图,我们希望我们的人工智能选择出现在图上尽可能靠西北的玩家(低花费玩家产生大量幻想点数)。请注意,我们还希望包括一些来自该地块东北角的顶级玩家,因为这些将是一些产生大量积分的明星联盟玩家,尽管他们有点昂贵,但他们最终仍有不错的 ROI。下图描绘了前 20 名投资回报率玩家与后 20 名投资回报率玩家的对比。因此,我们希望我们的最终算法尽可能多地选择这些高产玩家。我们希望远离那些相对于他们的表现(高成本/低幻想点)价格过高的球员,如哈里·凯恩、阿莱克西斯·桑切斯、罗梅卢·卢卡库、克里斯蒂安·埃里克森、阿尔瓦罗·莫拉塔、保罗·博格巴、德勒·阿里等等。
Top 20 and Bottom 20 Players by ROI plotted against AVG League ROI
我们决定绘制上面的统计数据,包括联盟中所有球员的 AVG 投资回报率(绿线= 5.74 ),以直观地了解“*表现出色”*和“表现不佳”的球员是什么样子。例如,联盟中收益最高的球员马科斯·阿隆索的投资回报率为 12.11 ,是 AVG 5.74 的两倍多,这使他成为我们算法中显而易见的选择。
在下面的饼状图中,我们可以看到球员价值最高的球队和球员价值最低的球队的分布情况。我们期待我们的最终算法能够从拥有许多高产球员的各种球队中挑选球员,例如——**伯恩茅斯、狼队、利物浦切尔西、曼城、沃特福德和埃弗顿。**这种聪明的方法与普通人玩幻想游戏的方法非常不同,后者主要从他/她最喜欢的球队中挑选球员,加上来自 4 或 5 个最受欢迎球队的少数球员——**阿森纳、托特纳姆、曼联、切尔西、利物浦或曼城,**然后用廉价的“填充”球员填充他们幻想球队的剩余部分,这些球员从不在真实比赛中出场,也不会产生任何幻想积分。
Teams with the most players from the TOP 50 ROI list
Teams with the most players from the BOTTOM 50 ROI list
3.编写挑选最佳幻想团队的 Python 算法
现在是最有趣的部分——编写实际的 Python 算法,并将人工智能选择的结果与普通人可能为他们的幻想团队选择的结果进行比较。
要理解我们算法的逻辑,首先必须理解下面 EPL 幻想游戏的规则和约束:
- 每个幻想玩家的预算都是 100 万英镑,必须购买 15 名足球运动员(11 名主力+ 4 名替补)才能参赛。
- 你需要至少有 2 名守门员,5 名后卫,5 名中场球员和 3 名前锋,以完善你的阵容并有资格参加比赛。
- 同一个足球队不能有 3 名以上的球员。
因此,我们用一个针对这些条件的if-else
语句开始我们的 python 算法,然后在此基础上添加我们自己的条件和逻辑,这样每次算法遍历我们的玩家列表时,它都可以使用智能逻辑根据下面的条件做出有效的选择:
- 检查一个球员是否受伤,被禁赛或不能比赛,如果是这样,即使他们有很高的投资回报率,也不要选择这个球员加入我们的梦幻队。
- 先挑联盟累计联赛积分最多的前三名明星球员。(我们将使用不同数量的明星球员来测试这种情况的结果,并选择能够产生最大投资回报的版本,同时仍然允许足够的剩余预算来填充我们的团队,让我们拥有许多投资回报率排名前 50 的球员。
- 每次我们挑选一名球员并将其加入我们的球队,我们都会从 1 亿美元的预算中减去他们的费用,并将他们的位置和球队名称添加到一个列表中,以确保我们不再为达到限制的位置和球队购买球员。
- 一旦选择了最佳数量的昂贵超级明星球员,该算法就开始浏览投资回报率最高的球员名单,并试图尽可能多地找到顶级球员,直到我们接近耗尽我们的预算并填补所有的球队职位。
- Algorithm 打印出它在最后挑选的球员名单,并给我们剩余的预算和球队的总幻想点数。
这里是我们团队挑选算法的一些压缩 Python 代码:
Optimal Fantasy Team Selector
下面你可以看到我们的算法选出的最终团队的截图:
**注:**以下团队仅准确到 2018 年 11 月 14 日。我们的算法旨在每个游戏周之后更新玩家数据,并根据团队/玩家 ROI 数据的波动做出新的选择。
Money Team as of Nov 14th, 2018 (944 Total Fantasy Points, World Ranking: 1st out of 5.8 million people)
**注:**我们为 AVG·乔团队编写了一个类似的算法,该算法更侧重于将预算花在来自大球队的明星球员身上,这些球员往往定价过高,可能无法在我们 1 亿英镑的有限预算中获得最高的累计投资回报。
**注意:**我们还要求一位同学选择一个他自己的随机团队,这样我们可以比较他的选择,并验证我们为 AVG·乔算法设计的随机团队选择器函数是准确的。
4.比较我们的结果
既然两种算法都已经建立并执行,让我们比较一下“金钱团队”与“AVG·乔的团队”和“随机同学团队”的结果,看看哪一个表现最好,差距有多大。最终结果显示,我们队的总分 944 分对 **812 分。**对于 AVG·乔团队(类似于我们同学的团队),这是一个显著的 **132pt 差异!**下面的柱状图展示了我们的结果:
要回答的有趣问题: 我们的算法是否返回了最高 ROI 的团队?它是否以显著优势击败了其他公司?我们的算法是否成功地从一些我们最初认为被低估的中游球队中挑选了球员?AVG·乔算法和我们的同学从顶级球队中挑选了更多价格昂贵的球员吗?
下面我们可以看到,我们的算法从我们在项目开始时确定的大部分高 ROI 团队中挑选了一组球员:
Money Team Player Distribution
这是一个更加平衡和公正的选择方法,而不是 AVG·乔在选择他/她的球员时所用的方法。请注意,下面的饼状图显示了 AVG 乔队选择的 11 名球员的球队名单。由于 AVG·乔将他/她的大部分预算花在挑选 11 名非常昂贵的球员上,他/她不得不将剩余的预算花在最便宜的可用球员上,以填补所有的替补位置,但是这些球员中没有一个可以用于产生幻想积分,因为他们实际上从未参加过真正的 EPL 比赛,并且仅被用作球队填充员。这些是来自布赖顿和卡迪夫的一些替补队员。
AVG Joe Team Player Distribution
结论:
消除团队/玩家的偏见和偏袒,专注于实际的玩家统计数据,让我们的算法得到最大的回报,并以总计 132 分或整整 16.25% 的优势击败了一般的 EPL 幻想玩家!最后,事实证明我和我的朋友实际上并不“不幸”,我们的梦幻联盟球队年复一年表现不佳是有原因的。这种对球员数据的深入研究让我们意识到,我们正在允许球队偏袒和购买大量高价球员的倾向,从而损害我们的整体梦幻联盟表现。
5.后续步骤
我们计划继续监控这些数据,在赛季中当球员开始受伤,争夺积分奖杯变得更加激烈时,检查球员统计数据中的任何剧烈变化和异常值。我们还想比较算法的团队在赛季结束时与世界上大多数休闲球员相比的表现。此外,我们计划每月更新一次这个博客,为那些对我们的人工智能进展感兴趣的人,所以请在每个月底重新访问这个博客,了解性能更新,并享受 EPL 行动的其余部分!!!
**12 月更新:**新博客开始更新代码,团队准备好第一周的 EPL 行动:https://medium . com/@ pruchka/EPL-fantasy-is-one-week-away-and-our-algorithm-is-ready-to-play-78 afda 309 e 28
数据扩充和伪标记简介
在本文中,我们将了解两个可以帮助您充分利用培训数据的想法。
为了更好地感受这些技术,我们将应用它们来击败 2013 年以来在区分图像中的猫和狗方面的最先进技术。情节的转折是,我们将只使用 5%的原始训练数据。
我们将与使用 13 000 幅训练图像达到的 82.37%的准确率进行竞争。我们的训练集将由随机选择的 650 幅图像组成。
模型将从零开始构建,我们不会使用迁移学习或预训练。
你可以在 github 上我的库中找到我写的代码。
Image from the original Kaggle competition website from 2013
第一个模型
第一个模型必须非常简单——650 张图片是非常小的数据量。
我倾向于 CNN 架构,它通过利用在图像中几乎任何位置都可以找到相似形状的事实来限制权重的数量。
我还跳过了全连接分类器,而是决定采用全卷积网络。希望这能给我们的模型一个更好的推广机会。
最重要的是,我做了很多实验。最终的架构包含跨越 6 个卷积块的 28,952 个可训练参数。通过少量的 l2 正则化,该模型在测试集中的 23,750 幅图像上实现了 74.38%的准确率。
是时候推出第一个大创意了。
数据扩充
怎样才能让一个模特表现的更好?用更多的例子训练它,同时确保它有学习能力,通常是正确的方法。
但在实践中,更多的训练数据往往不容易得到。获取或注释额外的示例可能是乏味或昂贵的。
我们可以做的另一件事是利用我们对图像的了解来模仿拥有更多的图像。
如果从更小的距离拍摄,照片看起来会有很大的不同吗?不完全是。我们能效仿吗?绝对的!放大图片并裁剪中心。
让照片看起来像是用稍微偏右的相机拍摄的怎么样?完全没问题。将图像向左移动一点点。
这听起来很简单,但却非常强大。这里唯一要补充的小细节是,我们不会自己变换图像——我们会告诉一个算法允许它做什么样的变换,它会对它们进行一些随机组合。
不幸的是,为了从扩充的数据中学习,我需要构建一个更大的模型。它最终包含了更多的特征地图,将可训练参数数量增加到 1 003 682 个。
这似乎有点不对劲。也许我选择的架构一开始就没有那么好。然而在这一点上,我选择坚持下去,继续实验。
随着数据的增加,该模型在早期结果的基础上提高了 35%,并在测试集上实现了 83.43%的准确率。
第二个伟大想法的时间到了。
伪标记
我们能不能用模型本身来模拟拥有更多的数据?
理论上,我们可以获取所有未标记的数据,包括我们的验证集,在其上运行模型,并将我们的模型对其预测最有信心的图像添加到我们的训练集。
我们不是在冒险强化我们的模型已经在犯的错误吗?无论如何,这在某种程度上会发生。
但是如果事情按计划进行,这样做的好处将超过上述效果。
我们所希望的是,通过提供更多的数据,我们的模型将了解所有它可能看到的图像所共享的底层结构。这将有助于它进行预测。
How our perception of what a good model is changes based on seeing unlabeled data. Source: presentation by Alex Conway
为了从伪标签图像中学习,我构建了一个比之前的模型大 1.5 倍的模型。我们现在有 1 566 922 个可训练参数。
我在 24350 个未标记的例子上运行旧模型。我挑选了 1000 张它认为最有把握正确的图片。我使用大约 1 比 4 的比例,在伪标签和原始训练集图像的混合上训练我们的更大模型。
在没有对模型架构进行实验和调整混合比的情况下,新模型在测试集上实现了 85.15%的准确率,非常有信心击败 2013 年的 SOTA。
摘要
在完成 fast.ai 的程序员实用深度学习课程之前,我写了这篇文章。我现在会用不同的方式来面对这个挑战。我会选择 Densenet 架构,它在处理少量数据时表现得非常好。我也不会调整图像的大小,而是将它们放大并裁剪到较短的一边。这丢失了一些信息,但是它保持了纵横比不变,通常效果更好。
如果你觉得这篇文章很有趣并且想保持联系,你可以在 Twitter 上找到我 这里 。
漂亮的数据科学演示
制作视觉上吸引人的 PowerPoint 幻灯片的介绍。
概述
这篇简短博客文章的目标读者是对 3 种不同用途的演示感兴趣的人:销售工具包、流程和分析报告。当然,这篇文章的核心思想不仅限于数据科学项目,因此来自该领域之外的人也可能会发现它很有用。
我们将通过一个数据即服务项目来展示这个想法,其中输入是大量的消费者调查,输出是一些描述我们目标受众的人物角色。
商业计划书
商业计划书或销售套件的目的是为我们的数据科学咨询服务吸引潜在客户。他们可能来自不同的背景,在品牌或营销机构的营销职能部门中属于不同的员工级别。因此,我们希望通过吸引人的视觉设计,尽可能简单地传达我们的想法。
我们看到了这张由 ODESZA ( )制作的专辑封面,请注意,这仅用于演示和教育目的,该专辑拥有版权,因此我们需要所有者的许可才能修改它 ):
让我们将我们的服务名称添加到图片中,使其成为我们的主要视觉效果,并将其修改为我们的封面。
然后,我们希望通过确定可能的工作角色来吸引他们的注意力。他们可能是战略规划者、媒体购买者或创意设计师。还建议用不同的颜色突出显示关键词。
接下来,我们将通过识别他们日常工作中可能出现的问题,给他们一个继续阅读的理由。注意,我们可以谷歌关键词,如“ resource icon png white ”来获得符合我们观点的小图标。我们还可以使用 PowerPoint 内置功能 Arrange 来对齐文字和图标之间的空间,使幻灯片更加美观,同时表现出对细节的关注等专业性。
我们需要更详细地告诉观众我们的解决方案能提供什么。同样,图标可以帮助我们更好地将想法联系起来,也可以节省观众理解我们服务的时间。
在接下来的部分,我们需要通过确定我们服务中的 4 个关键要素来解释服务实际上是如何工作的。注意,也建议找风格相似的图标。比如下面的图标轮廓都比较细。虽然这可能很费时间,除非我们想创建自己的图标。
最后,我们需要给出执行计划的明确时间表,否则我们的观众可能会发现我们的服务不切实际。此外,关键里程碑可能会更好地描述如何实际执行该服务。
这总结了数据科学业务提案中最重要的部分,可能会引起观众的极大兴趣,因此我们可以进入下一阶段。
工艺流程
这个阶段的观众是更懂技术的工程师或科学家。虽然他们可能每天都在处理流程图,但也值得一提的是,漂亮整洁的图标可以帮助他们不太懂技术的观众更好地理解复杂的概念。我们想推荐的一个很好的资源是麦肯锡洞察,其中我们可以使用他们精心设计的展品作为我们的演示模板,比如这个:
现在,我们可以使用这个模板,并采取相关的图标来显示我们自己的服务的流程。PowerPoint 中的吸管工具非常适合将幻灯片上的颜色与插入的图片或其他对象进行匹配,如下所示。
一旦我们更好地理解了我们的服务是如何工作的,我们实际上就可以用它来构建一个 PoC,并拿出一个演示报告。
分析报告
这可能是我们演示中最具技术性的部分,因为它与展示我们数据科学项目的实际结果有很大关系。这里对观众来说最重要的是最终的输出是什么样的。这里的受众可能是项目利益相关者,如营销主管或机构中的品牌负责人。我们希望向他们展示我们调查数据的输入以及我们角色的输出。
根据我们选择的机器学习模型,我们可能需要不同的可视化方法。虽然分类和回归树(CART)被认为是一种不太准确和稳健的方法,但它的可解释性和可解释性对我们的营销受众非常有帮助。出于演示目的,我们选择了去年去过日本的目标受众作为调查对象。我们可以清楚地看到每个角色是如何选择的,以及哪些关键特征可以帮助我们区分我们的目标受众和其他人,即去年没有去日本的人。
这篇简短的博文大致总结了这一点,因为我们可以看到,制作漂亮的演示文稿需要时间和精力,它们可能更有助于向业务人员、技术人员或工程师以及管理层解释复杂的数据科学项目。
这是我们第一次讨论数据科学中的交流和表达方面。建议定期访问不同的资源来探索演示模板,包括 R 或 Python 图库、行业报告或简单的 Google for cool business 演示模板。
O 笔以专案为基础的工作。
jchen6912@gmail.com
为开源做贡献,成为更好的数据科学家
参加第一次开源冲刺的有用提示
让我们面对现实吧:在一场游戏竞赛中获得高分并不需要遵循 T2 pep 8 T3 或者其他任何软件开发最佳实践。然而,代码是我们的手艺,在你职业生涯的某个时刻,你可能想要或需要学习编写生产级代码。为开源做贡献是磨练您的代码技能、学习专业最佳实践以及回馈更广泛的技术社区的一个很好的方式。
很好,你说,但是我从哪里开始呢?参与开源没有的“正确”方式,在 你的 自己的上有大量的 入门 。但是另一个很好的开始方式是参加短跑。你当地的技术聚会小组或开发者大会只是可能举办 sprint 的两个例子。
冲刺的概念来自于敏捷,在敏捷中,不是等待一个产品最终完成,而是价值在它变得可用时就交付给客户。这个想法是迭代地工作,在整个开发过程中结合来自客户的反馈。开源 sprint 采用这种快速开发的思维方式,并将其应用到开源代码开发中。在冲刺阶段:
- 开发人员和项目维护人员共处一地;
- 每个人都在相同的代码库、包或库中工作;
- 您可以处理已知问题(bug)、文档、单元或假设测试、重构或优化现有代码,或者使用代码开发示例/教程;和
- 欢迎所有级别。
我的第一次冲刺,去年的WiMLDSscikit-learnsprint,是我为开源软件做贡献的开始。上周,我参加了由纽约 Python 和 PyData 联合举办的 sprintdateutil(datetime 计算的主要依赖项和)。在这两个例子中,通过参加 sprint,我能够向现代数据科学的基础库发出拉请求。
短跑和黑客马拉松有什么区别?
虽然两者在功能上有一些相似之处(限时编码,快速解决问题),但是一个 sprint 和一个黑客马拉松有着本质的不同。
黑客马拉松通常是一场竞赛,不同的团队有不同的想法,可能会持续一天或几天(比如一个周末)。可能会颁发奖品。通常目标是编码一些全新的东西。黑客马拉松通常(但不总是)是独立的,导致 MVP 并不总是被进一步开发。
然而,在 sprint 中,每个人都在同一个现有的开源代码库、包或库中处理不同的 bug 或问题。短跑可能持续三个小时或半天。没有奖品。目标是改进代码库,同时加强支持开发人员的社区。在 sprint 之外继续开发代码库是可以的,也是鼓励的。
When you are sprinting, don’t forget to take some photos! Photo by author.
第一次冲刺应该怎么准备?
冲刺前
sprint 的重点是从你的时间表中划出专门的时间来做实质性的工作。本着这种精神,任何准备步骤都可以在冲刺阶段的一开始就做好,只要你带着电脑并能上网。尽管如此,我还是建议在冲刺之前做以下步骤*(按照重要性递减的顺序),以便充分利用你的冲刺时间。*
首先,你应该提前确保你的电脑上安装了 Python,一个 IDE 或者首选的文本编辑器,以及 Git。你应该有一个 Github 账号。如果现场电源插座很少,也要给电脑的电池充电。虽然在没有工具的情况下,你也有可能在 sprint 中获得良好的体验,但是如果没有工具,你的贡献可能会受到限制。
如果您已经准备好了工具,并且还有一些时间来准备,那么就开始熟悉这个项目吧。看看项目的 Github 回购。有没有 README.md,或者是你想参考的投稿人风格指南?
阅读项目文档。有意义吗?了解代码库的功能。如果你不确定如何做出贡献也没关系。计划无论如何都要出现,并计划结对编程。 结对编程是学习更好的软件开发实践的关键。
Pair programming is the key to a successful sprint and to becoming a better programmer. Photo by author.
冲刺阶段会发生什么
选择工作内容
当你第一次到达现场时,仔细观察房间,向听得见的每个人介绍你自己。要友善;询问人们他们计划做什么。如果有些东西听起来不错,问问他们是否愿意在上面配对程序!
对于第一次投稿的人来说,文档是一个很好的起点。如果您阅读了该项目的一些代码文档,但没有意义,请查看代码并尝试找出它的作用。然后写下你对其工作原理的改进解释。
查看该项目的 Github 中的已知问题选项卡。有人可能已经按难度标记了问题。你认为你能在这里解决什么问题吗?
重要 —不要太有野心。事实上,在你的第一次拉动请求中,你的野心越小越好。更改一个错别字会让你很好地理解与这个代码库交互和更改代码库所需的工作流程,这将为你在 sprint 期间或之后提交更复杂的编辑做好准备。
记住:没有提交给 Github 的工作和根本没有发生的工作是一样的。决定你的冲刺目标是有一个单一的拉请求(如果你做得更多也没关系)。因为你们是结对编程,所以要确保这也是和你一起工作的人的目标。
知道如何提交您的更改
版本控制问题可能是混乱的,您将希望等待项目维护者的指示,他们希望您如何对项目进行更改。他们是否有测试代码,您可以在本地运行,以确保项目可以在所有支持的版本上运行?项目是否有一个“声明”问题的系统,以防止两个人同时处理同一个问题?(通常这是通过在问题上留下评论来完成的,尽管一些项目维护者可能更喜欢使用看板来保持组织性。)
将项目分支到您自己的回购中。 Git 克隆到你的桌面本地工作。在做出任何改变之前,你会想要改变你的设置,这样你就可以在你自己的分部工作了(而不是大师)。如果你知道如何做到这一点,太好了!如果没有,请随意温习一下 Git 基础知识。或者,随便问问人!sprint 最大的好处是你可以和其他开发人员共处一地。
当您准备提交您的更改时
现在,您已经在自己的分支中本地进行了更改,并针对任何内部多版本支持工具测试了更改,您已经准备好发出拉请求了!
根据项目对参与的要求(活跃贡献者和一次性贡献者),记得在你的 pull 请求中包含一个修改过的 AUTHORS.md 文件,并添加你的名字和 Github 帐户。
冲刺之后
灾后小贴士
帮忙收拾;这很可能是一次志愿者领导的活动。专业建议:留下来帮忙清理空披萨盒不仅是表达你感激的好方法,也是和活动组织者聊天的最后机会。在科技领域建立关系网的最佳时机是你不需要工作的时候,第二个最佳时机是你需要工作的时候。
确保你为任何冲刺后的社交留出时间和精力,这可能是临时的而不是提前宣布的。不要害怕成为那个建议之后去酒吧的人。即使你不喝酒,这也可以是一个很好的方式来反思你所做的事情,在社交环境中向他人学习,在开源社区中变得更加活跃,结交朋友,当然,还有网络。
您的“拉”请求可能不会立即被接受,您可能需要进行一些更改,以适应项目的风格期望或需求。预计在接下来的几天内会处理好这个问题,因为这可能需要与项目维护人员反复沟通,并且当他们引用代码库的最新版本时,合并您的更改会更容易。
保持接触
然后,在接下来的几周或几个月里,写一篇关于你的经历的博文(咳咳),继续解决更有雄心的问题,因为你对这个代码库越来越熟悉了,并且享受成为现实生活中的开源贡献者的荣耀。
劳伦·奥尔德加 是纽约州布鲁克林的一名数据科学家。
成为赞助人
为什么您应该考虑承诺一小笔捐款来帮助我们运营我们的出版物?
2016 年 10 月,我们使用 Medium 创建了一个数据科学出版物。我们的目标只是收集好的帖子,并将它们分发给更广泛的受众。仅仅几个月后,我们很高兴地看到,我们有一个非常快速增长的观众和许多贡献者。
今天,走向数据科学为成千上万的人提供了一个交流思想和扩展我们对数据科学的理解的平台。我们的观众是混合的,包括对主题完全陌生的读者和想要分享他们的发明和发现的专家专业人士。
现在,我们的读者人数已经增加,我们每天都吸引着优秀作家的投稿,我们觉得是时候“升级我们的游戏”了。我们希望提供强有力的支持,让我们的作者通过编辑指导发展他们的才华。此外,我们希望继续呈现我们的观众乐于阅读的精心撰写、内容丰富的文章。
人们为什么支持我们?
人们是如何评价我们的?
“数据科学正在复兴。复兴是由社区推动的,而走向数据科学是卓越的社区信息来源之一。” 罗布·托马斯—IBM 领先的分析软件。
“从数据中学习的新方式正在改变社会的几乎所有方面。分享经验教训和最新进展的场所对于确保这些新方法产生最大可能的影响至关重要。“走向数据科学是我们如何作为一个社区来加速积极变革的典范。”Leonard D ’ avolio PhD——哈佛医学院助理教授,Cyft 联合创始人。
我一直很喜欢阅读别人写的机器学习相关文章。通过这种方式,我学到了很多东西,并成为了一名更好的数据科学家。所以,对我来说,把我所学到的东西回馈给 ML 社区是合乎逻辑的一步。“走向数据科学”为我提供了一个极好的平台,因为他们拥有大量的受众,因此他们可以从我的学习中受益,就像我从其他人那里受益一样。Dat Tran—Pivotal Labs 的数据科学家。
“很高兴被纳入《面向媒体上的数据科学》。我们非常喜欢与更广泛的数据科学社区分享我们的创新和知识,并相信这样做会促进该领域内有价值的对话、学习和辩论。就我们而言,我们一直在寻找方法来迭代和改进我们的实践,最终目标是让数百万旅行者尽可能轻松地进行旅游搜索。” 利兹·埃德里 ,Skyscanner 的数据科学家。
"走向数据科学是一个由志同道合的人组成的家庭,他们希望传播他们对所有数据事物的热情。在一个越来越自动化的世界里,当不平等阻碍穷人接受教育时,走向数据科学,就像许多其他出版物一样,为所有人提供了一个民主化、分享和相互学习前沿知识的机会。” 那华康 —人工智能/机器学习,斯德哥尔摩经济学院。
**“每个人都需要了解数据科学,以加深他们对数据科学中使用的工具的了解,使其能够为大众所用。这就是为什么我认为出版是一项伟大的事业,我们应该让各行各业的作者投稿。”Luke Armbruster——联大数据科学助教。
**“当有一个可以从中汲取新思想并与之分享想法的社区时,学习和实践数据科学会有趣得多。“走向数据科学”是一个很好的平台,可以让您随时了解数据科学社区正在发生的事情,并分享我的工作!”Gabriel Tseng——麦吉尔大学研究员。
“走向数据科学通过向合适的受众展示高质量的知识,帮助数据科学爱好者之间建立协作。发表的文章鼓励讨论和分享新的和未探索的数据科学领域。”萨扬·辛哈——IIT·哈拉格普尔大学二年级学生。
"在数据科学领域工作是一种奇妙的感觉。这本刊物给了我很多知识,也正因为如此,我才能够把我的话传播给公众,这给了我很多信心和动力。期待为《走向数据科学》写更多的文章,并从中学习新的东西。安尼施·辛格·瓦利亚——Selectdine 服务公司的实习生。
“我认为分享关于数据科学的知识至关重要,因为这是一个每天都在增长和发展的领域。为了成为最好的数据科学家,你必须不断更新,不断学习新的方法和算法。我发现写博客是了解最新动态、分享技巧和了解其他数据科学家如何应对挑战的好方法。” Shir Meir Lador —数据科学家和 PyData 特拉维夫会议的组织者。
“迈向数据科学一直是发表注重实践的文章的好地方。与传统的期刊出版物相比,这个平台更容易被广大受众访问,并有助于以经济高效的方式汇集数据科学界。” 丹尼尔·夏皮罗博士——渥太华大学机器学习博士。
**“数据科学将成为求职者的一项关键技能。如果您想了解数据科学的不同方面以及数据科学的各种应用领域,《走向数据科学》是一本重要的出版物。”Arkin Dharawat——伊利诺伊大学香槟分校理学学士。
**“迈向数据科学有一个了不起的作家社区,他们努力让每个人都能接触到数据科学。这些帖子对于新手和专家数据科学家都非常重要。随着越来越多的人参与数据科学和机器学习,创建并免费提供这种探索性和教育材料变得非常重要。与该社区合作的优势之一是他们的响应速度和反馈质量。我希望在未来继续与社区合作。”Chirag maha patra—tro oly 高级软件工程师/机器学习。
“我在 TDS 团队的经历简直太棒了。他们令人难以置信的作家和读者社区为所有的**人工智能提供了极好的观众——从基础教程到高级研究、项目和论文分析。TDS 团队速度快,反应快,在这一领域经验丰富。我强烈建议人们关注这份出版物。在一个日益受到人工智能帮助的世界,跟上最新发展至关重要,TDS 是了解所有正在开发的令人兴奋的技术的最佳场所。” 阿比纳夫·苏里——宾夕法尼亚大学生物医学研究员兼助教。**
成为数据驱动或灭亡:为什么你的公司需要一个数据战略,而不只是更多的数据人
在过去的 14 年里,我一直以这样或那样的方式处理数据。我最初是一名管理信息系统经理(ABN·阿姆洛),这是一个很棒的头衔,但我基本上是下载 PDF 报告,并手动将它们输入电子表格,以生成每日财务报告,多年来,我做过商业情报经理( ING 银行、荷兰合作银行、德尔塔·劳埃德)、数据分析师(微软)、数据科学家(阿德延), De Bijenkorf ,现在是一家荷兰支付技术初创公司( Dimebox )的数据主管。
在我所有的经历中,最让我难忘的是我的工作真正产生影响的时候。当然,当你在一家拥有超过 15,000 名员工的公司工作时,与你在一家 30 人的初创公司相比,你的影响非常小,但知道你所做的工作有助于做出决策,这可能是处理数据的最佳部分之一。
但随着数据,尤其是数据科学和分析成为最新的热门话题,我很惊讶有多少公司急于吸引数据科学家、数据工程师、机器学习工程师、人工智能工程师,但从未停下来思考他们的数据战略。
数据
).
时至今日,企业已经认识到数据的价值,尤其是可用于报告或数据分析的交易数据,这有助于做出更好的决策。但是,尽管数据的感知价值在过去二十年中有所增加,但许多公司仍在努力捕获、共享和管理数据,因为他们的行为反映了一种过时的基本观念,即数据只是应用程序的副产品,因此雇佣“数据人”来处理数据。因为为了雇佣而雇佣某人,永远不会解决任何问题,所以我认为,在考虑雇佣任何职位中有数据的人之前,组织需要创建一个符合当今现实的数据策略。
数据战略 制定数据战略背后的理念是确保所有数据资源的定位能够方便高效地使用、共享和移动。换句话说,拥有数据策略可以确保数据作为资产来管理和使用,而不仅仅是作为应用程序的副产品。通过建立通用的方法、实践和流程,以可重复的方式在整个公司范围内管理、操作和共享数据,数据战略可确保高效使用数据的目标和目的保持一致。
数据人
因此,大多数数据分析师并没有将数据转化为洞察力的明确目标,而是访问数据库,并请求运行任何基本分析工具都可以在几秒钟内提供的查询。
最近,趋势已经从雇用数据分析师转向雇用数据科学家、数据工程师、机器学习/人工智能工程师,不是因为他们是一个实际的战略或目标,而是因为每个人都在这么做。导致公司花费大量的金钱,吸引和留住数据科学家,他们花费大部分时间来提取、清理和建模数据,而不知道它将如何解决实际问题或创造新的商业机会来产生收入或利润。
该怎么办? 因此,如果您或您组织中的某人刚刚雇用了一名数据分析师、科学家或工程师,并且您一直在想这是否是正确的做法,我将这四个步骤进行了分解,我认为任何组织,无论是初创公司还是企业,如果想在数据方面取得成功,都应该经历这四个步骤。
第一步:任命一名数据主管或首席数据官 在我看来,管理层/创始人必须做出的最重要的决定,就是让某人对数据全面负责。此人的大部分职责是在公司范围内管理和使用作为组织/战略资产的数据。这意味着,与单一部门合作,设计一种获取、存储、管理、共享和使用数据的通用方法,但更重要的是,通过促进对话和分享决策和成功,确保文化采用数据驱动的思维和决策方式。
第二步:使组织的关键愿望与数据价值链相一致 每个公司都会经历其生命周期中的不同阶段,当一个组织转变为数据驱动型组织时,数据价值链上的愿望需要与组织的主要需求相一致。被指派的数据主管/首席数据官的首要任务应该是确定公司的目标是什么,这样他们就可以使之与他们的战略保持一致。
比如说; 数据集成商 主要致力于实施现代化的集成内部数据基础设施,而 业务优化师 主要致力于利用已建立的数据基础,使内部和以客户为中心的业务流程尽可能高效,而 市场创新者 主要致力于扩展认知能力,成为数字颠覆者。
Aspirations for Data
第三步:制定符合组织关键目标的战略 随着公司目标的明确,数据主管/首席数据官需要制定业务驱动的数据和分析战略,并培养数据驱动的文化。这可以从为 数据集成商 建立公司级、业务驱动的数据和信息治理,到为 业务优化者 和 市场创新者 建立“有针对性”的治理。然而,如果商业文化不愿意改变,即使是最好的战略也会动摇。 数据集成商 ,他们依靠基于证据的运营方式茁壮成长,需要建立一种数据驱动的文化,而 业务优化者 和 市场创新者 ,需要采用一种“快速失败”的敏捷软件开发文化来提高上市速度和创新。
第四步:吸引实现您的战略所需的人才 最后,为了实现与已制定的抱负和战略相一致的目标,数据主管/首席数据官需要担任实现目标所需的角色。 数据集成商 需要更多的技术角色,比如数据架构师、分析师、集成专员,因为内部基础还需要建立。 业务优化者 取决于他们是专注于扩展生态系统还是专注于数据的分析应用,需要技术角色和数学/业务角色的混合,如数据科学家、数据建模师和业务分析师,以推动优化和创新。最后, 市场创新者 需要数据科学家和数据可视化专家以可理解的可视化方式传达复杂的新概念。
成为数据驱动型或灭亡 我坚信,那些不相信自己的数据是一种资产并且不认为数据应该得到相应管理的公司,在未来五年将会遇到很多麻烦。但是,与其专注于雇佣一个“数据人”,我认为应该花时间和精力在你的组织中找到这样一个人,他能够看到更大的图景并制定战略,拥有改变一个组织的人和沟通技巧,并且愿意并且特别有足够的耐心站在第一线,将一个公司从数据整合者一直推进到市场创新者。
感谢阅读;),如果你喜欢它,请点击下面的掌声按钮,这对我意义重大,也有助于其他人了解这个故事。通过在 Twitter 或 Linkedin 上联系我,让我知道你的想法。
来源/附加推荐阅读: IBM 商业价值研究所《首席数据官行动手册》
麦肯锡公司《构建数据驱动战略的三个关键》&公司
首席数据官:毕马威
数据驱动型组织中受欢迎的新高管成员 SAS
成为更好的数据科学家
一个人不会简单地“成为”数据科学家。它不会在一夜之间发生,也不会在获得学位后发生。这需要时间、努力、学习、质疑和大量的学习。
Photo by Mark Autumns on Unsplash
在 2008 年,我从未听说过数据科学这个术语。我是一名工科毕业生,正在学习四年的负荷图、流体力学计算和足以让人发疯的困难。直到我在社会科学硕士项目的夜校里埋头苦读(后来又有了四年的教育和工作经验),我不断发展的数据技能的现实应用才开始围绕数据科学的概念融合在一起。将近十年后,我终于开始习惯称自己为数据科学家。虽然在内心,我可能会不好意思地想“……有点”。
我从工程师到政策专家再到开发专家的演变让我认识了数据科学这个三头兽。要想在新兴的数据魔法领域真正出类拔萃,需要疯狂的科学家将计算机编程、统计能力和社会理解融合在一起——所有这些都包含在设计师的可视化和演示镜头中。如果没有编码技能,你的分析和想法将停留在健怡可乐+曼妥思瓶火箭阶段,而不是难以捉摸的猎鹰-X,完美着陆。理解你的数据并提取出统计意义,对于在众所周知的垃圾场中找到百万美元的宝藏是至关重要的。如果没有将复杂的数字转化为易于理解的见解所需的应用程序和语言的指导,世界上所有的分析都是无用的。
这些技能不容易获得。它们来源于原则和概念的学术研究之塔;在商业世界的烈火中提炼;通过漫长的夜晚和头发花白的项目打磨。即使经过多年的工作,成为数据科学家的战斗永远不会结束。
作为技术进步的驱动力和原因,数据科学已经成为新兴技能和职业的重中之重。这就是我爱上这个新兴领域的原因。我生活中的一个爱好就是学习,尽管我已经确定在大学环境之外我会学得更好。编码、分析和可视化的新方法、新技术、新系统和新流程让我不断参与其中。因为正如达芬奇所说:
铁不用会生锈;死水失去了纯净,在寒冷的天气里会结冰;即使如此,无为也会削弱头脑的活力。所以我们必须将自己的潜能发挥到极致。不这样做就是对上帝和人类的犯罪。
对于像我一样想成为更好的数据科学家的人来说,这里有一些磨砺你的铁一般的智慧和扩展你的技能的好地方。因为成为更优秀的数据科学家的旅程永无止境。
为无师自通之人: 数据科学辍学课程由大卫·文丘里
编码从无到有: 370 在线编码课程 由 昆西·拉森可视化者游乐场
成为一名生物信息学家
直入深水区。
使用 Perl 介绍生物信息学
这第一周是旋风。我刚刚开始在克兰菲尔德大学攻读应用生物信息学硕士学位。坐下来不到一个小时,我们就面对命令行的黑屏和白字,并被告知开始编程。
幸运的是,当我们开始时,我们得到了介于介绍和警告之间的东西;没有论文和很少的讲座,游戏的目的是用多种语言编写代码,直到你精通为止。
我们本周的焦点是 Perl ,这个历史编程家族被世界各地的生物学家所使用。在简要概述了我们可以使用的主要函数和数据类型之后,我们开始编写实用手册。这些包含的任务旨在逐步建立我们关于如何在相关环境中应用 Perl 的知识库。
我很快就被吸引住了,因为很明显,从一开始我们所学的一切都会对我们的未来有用。这些都不是没有实际应用的抽象挑战。相反,当我们在周末接受任务时,我们可以建立管道工具,用于揭示任何所需蛋白质的序列、结构和相互作用网络。
如果有一个角落需要删减(更重要的是,要避免代码行),那么我通常会很热心。本周晚些时候,我们被介绍给了 BioPerl。这是一个由社区开发的开源工具的集合,可以作为独立模块使用,也可以作为更大程序的一部分。
基本上,在写了一个星期的剧本后,我们被告知剧本已经写好了。当然,如果没有首先完成我们的任务,我们就不会理解 BioPerl 软件包是如何工作的,所以它不会完全贬低我们的努力。
此外,BioPerl 是面向对象的,这感觉像是下一个级别。对于 Perl,我们编写程序来处理给它们的数据并输出响应。然而,对于 BioPerl,我们定义的是程序中相互交互的对象。你可以阅读这个获得更好的解释。
这是我第一次尝试编码;Perl 是我尝试学习的第一门编程语言。我发现最初的学习曲线非常陡峭,但慢慢地你会发现一种不同的思维方式。
这是令人沮丧的逻辑,虽然 Perl 被认为是一种更健壮、更灵活的语言(非官方的格言是“有不止一种方法可以做到这一点”),但与 Python 相比,事实仍然是这里缺少一个分号,或者那里缺少一个开括号,将会停止所有的进程。在你编写的任何代码中都是如此,所以养成正确的习惯是很有价值的一课。
虽然现在学习 Perl 似乎对理解遗留代码更重要,但我已经开始喜欢使用它了。骆驼一直是 Perl 的象征,虽然唯一的官方原因是它出现在 O’Reilly Media 的第一版编程 Perl 的封面上,但很容易看到沙漠居民和经常丑陋但总是有弹性的编程语言之间的相似之处。
成为数据驱动的产品经理
产品经理,也称为产品所有者,是组织中一个相对较新且越来越重要的角色。由于我对所有新事物和技术驱动的事物贪得无厌的热爱,我最近完成了一系列对产品经理的定性采访,并对我了解到的情况感到震惊:
- 没有大学课程对他们目前的工作进行培训,他们认为自己是一个没有现成剧本的“迷你 CEO”。
- 他们比组织中的任何人都更关注用户/客户。
- 他们相信自己的直觉,但他们的工作倾向于数据,有些人是由人力资源部门根据他们的数据熟练程度进行评估的。
- 他们觉得在工作中使用数据让他们更有力量,但他们基本上是自学的,通常对数据解释感到紧张。
对于爆炸式增长的软件即服务(SaaS)公司来说,这是一个特别紧迫的问题,因为这些所有者部分或全部管理的东西会产生大量数据,并且有可能产生更多数据。因此,如果你认为自己是这些勇敢的新产品领导者之一,以下是我关于成为数据驱动型产品经理的建议:
接受你正在解决一个新的(数据)问题
我在其他地方写过关于数字化转型的力量的文章,但是你实际上是这一转型的第一线。人们仍然在弄清楚产品问题是什么,这是确定任何可行的解决方案的先决条件。这也意味着建议(当然不包括我的)将是泛泛而谈,而且往往毫无意义,因为你的产品和组织是独一无二的,而且有些人一开始就不理解你的问题。在这种情况下,关键是关注核心原则,而不是案例研究建议。
一位产品经理给了我一个这样的例子,他引用了一篇文章,该文章提倡进行功能选择,利益相关者和决策者在可能的产品功能上花费游戏资金,以确定他们在产品路线图中的优先级。对于产品经理来说,这种方法的问题是显而易见的:花钱的人不使用产品,并且不能够合理地为特性分配价值。这违反了以客户为中心的设计原则,因此尽管这个想法是一个有趣的下午活动,但产生的数据并不适合路线图。这只是个糟糕的建议。
作为产品经理,你应该关注的核心原则围绕着产品使用、以客户为中心的设计(尤其是用户体验)、竞争产品、定价、市场份额和行业趋势。如果你收到的建议不能帮助你利用数据成功地找到你工作职能中这些部分的答案,那就忽略这些建议。
我所说的“产品数据”是什么意思
作为一名产品经理,你拥有大量数据,并且有能力获取更多数据。这是行为经济学家幻想的那种实验设计环境(我将在我的下一篇文章中再次讨论这个问题)。但是,在尝试管理和使用所有这些数据时,它也会导致许多问题。这通常表明您的组织缺乏清晰的数据治理,但也可能是由于误解了您可用的不同类型的数据以及每种数据的优缺点。
数据中最明显的差异是来自产品本身的观察数据,如事件数据,而不是直接的用户/客户反馈数据,如应用商店评论或调查,这一点我采访的每个产品经理都非常清楚。这些并不是互斥的数据类型,通过将一种与另一种混合,您可以获得更好的洞察力。产品经理提到的另一个关键数据区分是结构化数据,如 5 星评级系统或拇指向上/向下,而不是用他们自己的话说的非结构化客户反馈。同样,一个不一定比另一个更好(尽管它们确实需要非常不同的分析方法),虽然结构化数据通常更容易处理,但非结构化数据通常更能提供信息。
除了数据权衡之外,大多数产品经理目前都使用一组核心指标来指导他们的路线图,他们都将成功归功于在整个组织中拥有一个通用的指标定义及其计算方式:
- 客户获取成本(CAC)
- 客户转换率
- 回购率
- 每日活跃用户(DAU)
- 功能用法(傅,没错就是这个缩写)
- 用户流失
- 净推介值(NPS)
- 客户满意度(CSAT)
- 客户终身价值(CLV)
产品管理中的数据用例
我从产品经理那里听到的另一个关于数据的常见抱怨是拥有清晰的用例。虽然他们中的大多数人提到使用数据来优先考虑功能开发,但是数据的第一优先应该是找到整体的“产品-市场匹配”使用数据(比如事件)是一个很好的起点,但是你绝对需要包括客户反馈。我采访过的一位经理说,她从拿起电话直接与 10 位客户交谈中获得的洞察力,从来没有任何观察到的使用数据能与之相提并论。总的来说,我同意她的观点,但这不仅仅是因为对话有神奇的力量(尽管确实如此),而是因为你可能还没有建立评估使用数据的正式测试。
这是下一个用例,假设测试。不少产品经理提到,当他们进行正式测试时,他们对测试结果感到“震惊”,通常,他们对客户想要如何使用产品的直觉是错误的。测试不是你应该轻视的事情,如果一个测试结果的后果很大,比如说因为它需要大量的开发成本或者废弃你的产品路线图的一部分,那么你真的需要确保你的测试是有效的,你应该进行多次测试来检查你得到的结果是否一致。
说到高成本,产品管理并不便宜,您的数据是验证您所做的事情是否对收入产生积极影响,而不仅仅是让用户/客户满意的好方法。例如,那个昂贵的新机器学习项目真的能带来可观的投资回报吗?为推荐的追加销售添加人工智能组件是否真的增加了购买量(订单总数和总支出)?如果你用正确的数据设置了正确的测试,这些事情你很容易就能学会。
弥合部门间的分歧
看起来最快乐的产品经理都来自数据不仅仅是优先事项的组织,它是每个级别决策过程的重要部分(一些产品经理正是因为这个事实才接受了目前的工作)。这就是我所说的“一种数据文化”的意思,作为一名专注于客户希望从你的产品中得到什么的迷你 CEO,你处于持续推动和加速这种文化的最佳位置。
当数据驱动的决策结合了来自整个组织的数据时,它就进入了一个全新的层次。如果你回头看看我上面的指标列表,你会注意到它们存在于不同的部门筒仓中,虽然每日活跃用户和转化率可能是让你夜不能寐的指标,但你的产品的成功在很大程度上是在客户接触它之前由营销和销售流程预先决定的。
为了克服这个问题,使用概念框架来指导与组织中其他部门的协作,尤其是市场营销、销售和客户体验部门。这些框架中最好的包括客户旅程图、用户/客户人物角色和客户终身价值群组(特别关注找到所有用户/客户中可预测地创造总价值的 80%的 20%的用户/客户,称为帕累托人物角色)。
数据如何让你失望
与我交谈过的产品经理很明智地认识到解释数据是一个主要的棘手问题。这不仅对你来说很难,因为(可能)缺乏正式的数据培训;即使是最好的数据科学家也会时不时地犯这个错误。脏的或不完整的数据使情况变得更糟,但是即使你有完美的数据,也有可能误解它的意思。我发现的解决这个问题的唯一方法是让多个人参与到解释中来,并鼓励在这个过程中彻底的坦诚。
虽然有可能成为一名数据解释专家,但你也可以雇佣一名数据科学家来帮忙。对于将这些数据科学家嵌入开发团队还是让他们成为产品管理团队的一部分的价值,我采访的产品经理之间存在明显的意见分歧。你的具体情况应该决定这一点(记住,专注于核心原则),但确保为这项工作聘用正确类型的数据科学家是你的责任,而且有许多不同的类型。
最后,即使是最大的数据也可能见解浅薄。仅仅因为你有很多数据,并不意味着它就是正确的数据。你将通过探索性数据分析、假设检验和解释输出来学习这些。但是你也可以通过定性采访来解决这个问题(这是我的下一篇文章和即将到来的 Emperitas 讲座的主题)。这是因为在大数据世界中,人类(您和您的用户/客户)仍然扮演着非常重要的角色。不要忽视你的直觉,只要告诉它更多的证据,并相信自己会根据所有可用的信息做出正确的决定。
关于作者:
Luciano 是一名经济学家、数据科学家和未来学家。除了在多个高等教育机构担任广受爱戴的教授之外,他还是商业智能解决方案公司 Emperitas 的创始人兼首席执行官,该公司将数据科学与敏捷研究和经济建模相结合。
成为机器学习工程师|第五步:建立投资组合
本文是“成为机器学习工程师”系列的最后一篇。我开始写作的目标是通过创作来提高我的写作和学习。我最大的恐惧是我写的所有东西都会被忽视。幸运的是,恰恰相反的事情发生了。人们参与、评论、鼓掌、分享、关注我和我的作品。我对这一成功感到谦卑,并决定继续写作,希望能够在新一代机器学习工程师的学习之旅中提供帮助。谢谢
成为一名机器学习工程师不是一件小事。从一无所有到建立从数据中学习的系统需要大量的努力和耐心。如果你已经在这个系列中走了这么远,那么恭喜你,你和我几个月前一样,但是如果你和我一样,那么你不太确定如何展示你在几个月的专注练习中积累的技能。
为了展示你的技能,你能做的最有成效的事情就是建立一个作品集。高质量的投资组合可以展示:
- 通讯能力
- 技术能力
- 思考问题的能力
- 采取主动的动机和能力
这些都是雇主在决定雇佣谁时希望看到的。不幸的是,没有多少人把一个投资组合放在一起就能展示这一点。在整理你的第一个机器学习投资组合时,有五件事要记住。这五件事是指导方针,将确保你的投资组合给你最大的回报。
保持项目小
在你的投资组合中,规模的确很重要,尽管一个重大项目华而不实,但它也伴随着风险和成本。一个小项目可能不会花超过 20-40 个小时来完成,如果它没有成功,那么你的损失比一些大项目可能会变成的几个月的时间下沉要小得多。
完成项目
唯一比没有投资组合更糟糕的事情是有一个装满半成品项目的投资组合。它向世界尖叫,你没有能力完成你开始的事情,应该不惜一切代价避免。
独立项目
机器学习可以应用于几乎每个领域,你应该通过完成独立的项目而不是以前工作的扩展来展示这一点。如果你确切地知道你想擅长什么领域,并且想展示你的专长,那就忽略这一点。
新颖的项目
我班上的许多学生犯同样的错误。他们学了很多教程,觉得自己应该无所不能。然后他们试图完成我的带回家的项目,但失败了。跟随在线教程不是学好的方法,从头到尾完成新颖的项目才是学好的方法。如果我在简历中看到许多辅导型项目的组合,我会想出整个简历。
需要新颖的项目创意?查看我之前的文章 成为机器学习工程师|第四步:练习,练习,练习
容易接近
将你的作品集放到网上,让所有人都能看到。越多的人发现、阅读和评论你的作品越好。这不仅是未来雇主找到你的一个载体,而且你也可能从你的项目中获得很好的反馈。要做到这一点,最简单的方法就是将所有内容放在一个 git 存储库中,并提供一个完整的 ReadMe。
如果你像我一样,从例子中学习效果最好,那么看看这个数据科学 作品集 。
减去
拥有自己的作品组合正迅速成为招聘新的机器学习工程师的重要组成部分。这已经成为软件工程师招聘过程的一部分有一段时间了。现在就开始,挖掘旧的项目或建立新的项目,把它们放在一起,写几份关于你从项目中学到了什么的报告。
感谢阅读:)如果你喜欢它,点击下面的按钮,跟我来!这对我意义重大,鼓励我写更多这样的故事
成为机器学习极客
“Big Data in 21st Century.” Source: Marketing Land.
最近写了一篇关于 家 的帖子。什么是你的家?
我认为家是任何你可以自由做自己的地方。最快乐的时候,最原始的你。
当我开始阅读我的机器学习教材时,我差不多就是这样。尽管我很开心(也很书呆子气),但我还是疯狂地阅读了这本书,即使是在地铁上或吃着一碗拉面的时候。作者安德里亚斯·穆勒(Andreas Mueller)是我现在的教授,我很感激我学到了这么多关于机器学习在现实世界中的应用。
Highly recommended for those interested in Machine Learning.
那么什么是机器学习呢?一个科技网站将其定义为“一种人工智能(AI ),它为计算机提供了无需明确编程就能学习的能力。基本上都是从数据中提取知识。随着机器学习在我们日常生活中无处不在的应用,它可以被视为统计学和计算机科学的交叉领域。
在我最近参与的机器学习中的女性纽约分会中,我有机会回答他们关于使用数据集的问题。以下是我的想法,希望对那些对探索数据世界感兴趣的人有所帮助!
1。说说你处理过的最乱最丑的数据集吧。你是如何让它变得可用的?
我使用 Python 和 SQL 从互联网上的各种类型中搜集数据。我发现的最难控制的数据集通常是那些缺少很多值、特征不一致以及用于识别空值的不同值的数据集。虽然这可能会延长清理过程,但我通过理解每个变量的含义、删除无关紧要的功能、创建虚拟对象以及使数据集的值保持一致,使其变得可用。
2。告诉我一个你不得不处理一个对你来说是新的数据集的时候。你是怎么探索出来的?你是如何理解这些数据的?
我处理的数据集通常很大很复杂,具有从分类和有序到离散和连续的特征。为了探索和加深对数据的理解,我将首先进入布局文件,仔细通读该列中使用的每个特性/变量,对它们的类型进行分类,并查看是否有潜在的相关特性。
我喜欢通过各种类型的图表来可视化数据特征之间的关系,从条形图、直方图和箱线图到散点图、线性和径向形式。了解我们试图构建什么以及我们的模型将如何被使用是很重要的,因此我们知道在探索我们的数据时要寻找什么。我用于数据探索的一些工具通常涉及 R (ggplot2 非常有用)、Python (matplotlib!),SAS,Excel(谁没有?),以及 D3(基于 Javascript 的库提供了一些很酷的交互特性)。
3。告诉我一个你建立的预测模型。你用了什么方法?你是如何验证你的模型的?
我在构建预测模型时使用了各种类型的监督学习技术,从广义线性模型和 k 近邻技术到决策树和神经网络。然而,大多数时候,由于数据集的复杂性较低,我使用分类和回归来建立预测模型。
我使用交叉验证(通常是 k-fold)和网格搜索以及不同的参数技术,并可能结合其他方法来很好地验证模型,避免过拟合或欠拟合。为了进一步验证,迭代过程对于确保 R 平方不仅是好的,而且是精确的是非常重要的。建设管道也有助于避免信息泄露。
4。告诉我一个你做过的地理空间分析或者你制作的地图。
我最近赢得了哥伦比亚大学商学院(Columbia Business School)举办的一场黑客马拉松,在那里我开发了一个交互式数据可视化工具,以确定治疗糖尿病、精神障碍和艾滋病毒等常见疾病的医生短缺的社区。这个想法是纽约市的公共机构或医疗服务提供者自己可以利用这些信息在地理上更好地匹配医生和病人。除了这次经历,我还喜欢在业余时间玩玩可视化,看看我最近用 D3 制作的这张简单的地图,来确定世界各国的幸福排名:http://moorissa.com/happy-countries/。
5.告诉我你的一些技能,这些技能可能有助于探索机器学习领域的数据。
云(亚马逊 AWS 或谷歌云)、D3、Excel、Git & GitHub、HTML & CSS、Javascript、Python、R、SAS、Spark Apache、Tensorflow、Hadoop MapReduce。
Moorissa 是一名研究生,目前在哥伦比亚大学学习机器学习,希望有一天她可以利用这些技能让世界变得更美好,一次一天。
成为分析经理不是晋升。
(Photo by rawpixel on Unsplash)
是转行。
一开始是一名数据科学家可能是成为 T2 摇滚明星的现代版,但似乎没有人真正谈论你职业生涯几年后会发生什么。
分析大数据集。建筑模型。连接数据管道。挑战永无止境。
但是,如果一切开始变得有点太例行公事,你开始听到传言说你应该想在职业阶梯上继续前进到下一步会发生什么?
传统的做法通常是开始寻找管理之路,在分析领域也是如此。也许你自己的经理已经离开了,留下了一个空缺。或者你的公司导师(你确实有导师,不是吗?)建议是时候把自己推向“下一个层次”了。
唯一的方法是向上。或者是?
在许多公司结构中,数据科学的职业发展与公司其他部门没有区别。你会经历从初级分析师到分析师再到高级分析师的过程,然后遇到管理这一关。最大的问题是,在任何技术岗位上的晋升都不应该意味着管理是最终的终点。
我自己也从高级分析师升到了分析经理,所以当我说:
成为分析经理不是一种晋升。
是转行。
纯粹而简单。除了从分析师或数据科学家的技术领域直接进入人员管理领域并不简单。一点也不。这就是我们将要探索的。
自从进入管理界以来,我花了六年多的时间,才真正开始挖掘是什么让这么多高成就的技术分析师的跳跃如此困难。这些人对管理的介绍中,有许多是基于所谓的“彼得原理”。潜在的前提是,根据你在当前职位的出色表现,你被认为是晋升到另一个职位的最佳人选。
彼得原则的问题在于,只有当你被提升到一个你不再擅长的职位时,你在公司组织结构图中的上升才会停止。简而言之,管理者上升到他们无能的水平。当我写这篇文章时,我能感觉到全世界有一百万个灯泡在运转。
你在职业生涯中遇到的那些完全不称职的中层经理会突然出现在你的脑海中。所有那些你质疑他们是如何走到那一步的时候,现在都得到了解答。
他们擅长其他事情,但是,当他们进入这份工作时,他们的老板发现他们并不擅长,就把他们留在了那里。现在一切都很合理了。
但这不会发生在我们身上,对吗?
你的个人经历告诉了你什么?
总是如此。
你最初为什么想进入管理层?
撞上玻璃天花板。
也许你决定尝试管理的原因是你担心作为一名分析师会碰到玻璃天花板。毫无疑问,在适当提高薪酬方面,技术职位通常都有一个保质期。很少有公司允许它的技术人员保持他们的个人贡献者身份,并骑着小马一路晋升到董事会。
如果从分析师角色进入管理层的唯一原因是为了获得更多的钱,那么你可能需要重新考虑你的策略。对于大城市中心的数据科学家来说,他们的经理是否比他们当初挣得多得多是个问题。考虑到所谓的高质量、有经验的分析师和数据科学家的短缺,对实际“做”的补偿只有一种方式——T2,那就是上涨。
一般也可以。
可能只有我一个人有这种想法,但找到一个你喜欢的角色并坚持下去也没什么错。环顾任何一个现代的格子间农场,你会发现很多工作了 15 年或 20 年的分析师,他们对自己舒适的工作非常满意。
如果你没有动力去做的话,你不需要在你的职业生涯中一直去砍树。有时候,仅仅是做好工作(如果不是杰出的话),获得丰厚的报酬,下午 5 点回家就足够了。如果这听起来像你,那么你应该知道,在企业分析领域,你有足够的空间。不要让自己痛苦地去追求晋升,去做一份你很可能会讨厌的工作。
会议室里没有密室男孩。
不得不说,在许多公司中,高管们仍然普遍(如果被掩盖的话)认为,技术人员没有继续提升的潜力,不管他们作为经理的表现如何。
我想起了我曾经听过的一个故事,一位高级主管对他的团队进行年终绩效评估。该部门的职权范围相当多样化,因此它包括营销、通信和包括分析在内的其他几个大团队。
分析团队度过了硕果累累的一年。因达到并超出业务预期,完成了大量成功的项目而受到广泛好评。然而,在对分析经理进行评分时,他们都被降了一个绩效等级。他觉得他们都是“密室男孩”,就其本身而言,他们只不过是按按钮的人,不管他们在整个公司的评价有多高。
这是一个警示故事,爬上管理层的阶梯不会神奇地让你进入董事们的私人浴室或顶层角落办公室。仍然有很多知名公司的高层管理人员不理解也不信任我们的工作。令人欣慰的是,这种情况正在改变,但这件事表明,还有很长的路要走。我只想说小心点。草不总是更绿。
把你现在的技能留在门口。你在这里不需要它们。
管理显然不适合每个人。这绝对不是你目前所做的(并且做得很好的)分析角色的自然延伸。一旦你有了飞跃,你可能会发现转型的主要问题是必须学习一套全新的技能。一开始,分析师并不总是拥有最完善的人际交往技能。这是一种刻板印象,但经验告诉我,这在某种程度上是植根于现实的(对不起,和我一起工作过的每一个人——我把自己放在这个列表的最前面!)
学习如何进行一对一、绩效评估、管理他人的工作重点以及卷入高层办公室政治,这些都不是你所习惯的。到目前为止,对于习惯于在自己的年终考评中获得高分的人来说,这是一条陡峭的学习曲线。
扮演和平使者、心理医生、牧师、仁慈的独裁者以及人事经理不得不承担的所有其他日常角色的互换角色可能会产生负面影响。尤其是对于那些更习惯戴上降噪耳机,一头扎进分析一组数据的人来说。
学会放手。
也许从分析师角色到分析经理最难的部分是意识到你不应该再做分析师的工作了。我发现很难放过这个机会,尤其是当一个有趣的项目摆在我们面前的时候。我最喜欢卷起袖子做数据侦探了。探索性数据分析是我的专长,当我不得不做范围和需求部分,然后把它交给其他人时,我很纠结。
如果你发现自己希望自己是做这项工作的人,而不是管理其他人,也许这是一个信号,表明你在职业道路上走错了方向。
滴滴创始人罗布·沃林 总结得很好:
“如果你发现自己身处管理层,希望自己是一名程序员,不要等到你彻底精疲力竭、满腹牢骚的时候;帮你自己(和你的公司)一个忙——现在就做。回到代码骑师的位子上。如果你现在的公司不愿意和你合作,总会有公司愿意的。”
人生苦短,没时间做你讨厌的事情。如果你发现行政和人员管理离你想做的太远,回到你的分析师角色也没什么不好意思的。
那为什么我从四分卫变成了教练?
我进入管理层有几个非常具体的原因。
怀第二胎是最主要的。孩子是昂贵的,没有比有几个小嘴巴来喂饱和穿衣服更大的动力去攫取更多的钱。
在之前的五年半时间里,我一直是一名承包商,然后是该公司的顾问,这在其中发挥了很大作用。我知道我将管理的团队,我和我的经理有着良好的关系。在你生命中的某些时候,一点点稳定是没有错的,我认为我们即将到来的到来预示着其中的一个时期。
事实上,我们的咨询工作即将结束,一份全职工作的机会来的正是时候,这可能也是原因之一…
一旦我踏上第一级台阶,我就再也不想保持稳定的上升势头了。与许多不同的高层人物打交道,看到他们的世界与企业的日常运营如此脱节,只会强化这一点。
选择应该是你的,而且是你一个人的。
你考虑进入管理层的动机是你自己的,但我的最终建议是确保你真的是出于自己的原因在做这件事。不是因为你被强迫做你不想做的事,因为这是你的期望。如果你被迫改变方向,因为有人告诉你,如果你错过了这个机会,会给你带来不好的影响,那么你应该考虑一下,这能告诉你你工作的地方的文化是什么。
无论你的个人决定是什么,只要知道它不一定是永远的。我认识一些数据分析师,他们已经跳到管理层,而且从未回头。他们受到团队的喜爱,他们已经适应了新角色的要求。其他人变成了僵硬的机器人,无法将任何同理心带入他们的人事管理风格,最终让他们的分析师生活在地狱中,没有任何真正的最终利益。
对于那些不能放弃工作技术方面的人,他们有两个选择。要么承认这是一个错误,回到他们最擅长的地方,要么为自己制定一个妥协方案。
我总是确保自己有一些动手的编码和分析工作。这让官僚、行政和政治领域的人才流失变得稍微可以忍受一些。当然,我知道工作质量会很高。我的意思是,为什么我会被提升?
让我们听听你们的故事。
我很想看到一些关于你自己从技术角色转变为管理角色的故事的评论,以及它是如何为你工作的。知道陷阱在哪里以及你可能取得的成功对任何后来者都非常有帮助。(加上我爱管闲事,喜欢听别人的故事。)
成为数据驱动的第 1 级:拥有您信任的用户数据
在本系列的第一部分中,我们将讨论如何获得你信任和理解的用户行为数据。这意味着涵盖漏斗和跟踪事件的设置和初步理解。如果你已经知道这些事情,那么请随意跳过。
虽然世界上有很多分析系统,但谷歌分析是事实上的标准。它免费提供高级数据,并与其他系统共享许多相同的词汇和核心概念,如事件跟踪。事件跟踪非常棒:它支持漏斗和实验分析。稍后我会深入探讨这意味着什么,但关于谷歌分析,我想提出两点。第一,可靠。我使用过各种实验和分析框架,当我们不相信来自这些系统的数字时,我们经常与谷歌分析中的数字进行比较,这是信任的明显标志。第二,它是可用的。它的高水平分析和跟踪事件的方法使它受到初创公司和一些世界上最大的在线品牌的欢迎,因为它让缺乏数据分析背景的人能够理解正在发生的事情。成为数据驱动的一个关键因素是,组织中的每个人都可以读取和解释用户数据。
Some no-effort, high-level user data from Google Analytics
为了完整起见,以下是你如何为你的网站、 iOS 应用或 Android 应用设置谷歌分析。
跟踪
而 Google Analytics 自带大量高级流量数据,如流量、留存、来源、语言等。,它不会提供太多的机会洞察力。这就是“跟踪事件”有用的地方。有了少量的代码,你就可以开始了解某件事情发生了多少次,人们是如何使用你的产品的。例如,您可以在按下特定按钮或呈现特定页面时触发跟踪事件。测量事件的相对发生率是漏斗分析和实验的基础,因此将跟踪放在你理解的地方是至关重要的。
让我们介绍一个使用事件来跟踪用户如何通过销售袜子的在线商店的实际例子。这个商店有六个页面:
- 包含搜索表单的主页。
- 搜索结果,包含一堆袜子。
- 列表详细信息页面,包含特定袜子的大量信息。它在页面的顶部和底部有两个“添加到购物车”按钮。
- 带有“结帐”和“从购物车中删除”按钮的购物车。
- 带有信用卡表单和“立即支付”按钮的支付页面。
- 支付确认页面。
人们向确认页面的移动是你的漏斗,很多用户在漏斗的顶端随意浏览你的网站,一些人沿着漏斗向下购买,也就是所谓的“转化”。
首先,你可以使用页面跟踪来跟踪每个页面,从主页到付款确认。谷歌将跟踪哪些页面被默认点击,但页面跟踪事件是分配有意义的名称和更详细信息的好方法,使分析更容易。
接下来可以介绍事件跟踪。事件跟踪可用于计算任何任意事件;在我们的示例中,我们可以为以下内容添加跟踪事件:
- 列表详细信息页面有两个“添加到购物车”按钮——为每个按钮引发一个事件,以了解哪个按钮的点击率最高。
- 购物车有“结帐”和“从购物车中删除”按钮。了解哪个按钮被按下可以告诉你有多少用户误用了购物车,或者有多少比例的用户进入了你的漏斗。
- 支付页面上的“立即支付”按钮。
- 不要忘记在付款确认页面上跟踪!以防您在“立即支付”和确认之间有一些您可能想要检测的损失(例如,导致错误和收入损失的错误)。
Sample tracking event JavaScript
有了这种跟踪,您现在正在收集数据,这些数据将构成一些后续分析的基础。恭喜你。现在我们可以弄清楚如何阅读它来理解机会。
值得注意的是,谷歌分析也支持一些专门为电子商务设计的功能。
了解您的漏斗
通过你设置的跟踪事件,你可以开始了解用户是如何与你的产品互动的。
Example Behavior Flow
谷歌分析有几种不同的方式来查看和分析您的跟踪事件。一个简单的起点是“行为流”。这构建了事件、页面或屏幕被触发的顺序以及与会话期间相邻事件、页面或屏幕的比率的图片,从初始登陆到某个最终端点。这份报告对你的漏斗和用户如何使用你的产品提供了一些见解,但也有一个缺点:它可能会对一定比例的事件进行采样,而不是对高容量产品的每一个事件进行计数。如果你的转化率很低,你可能会在漏斗的末端得到稍微不准确的结果。尽管如此,这仍然是一个不错的起点。
您可以开始构建自定义报告。有了这些,你可以衡量和比较不同的事件随着时间的推移。重要的是要了解趋势,以检测你的产品是增长还是停滞。但是有龙。按周衡量是常见的,但这是危险的。以袜子零售商为例,这将是一项季节性业务,在假期期间可能会出现不成比例的销售额,然后可能在 1 月份下降。在可能的情况下,更好的比较通常是同比,即与前一年的类似日期进行比较。有时候同比比较很棘手,因为比如说,情人节可能是某年的某个星期一,而第二年的某个星期三。因此,你必须对一年的 365 天进行补偿,并将一周中的每一天与前一年对齐,直到我们拥有十进制表示地球绕太阳旋转的技术。
Sample year-on-year comparison with date correction so day of week lines up.
在早期,你可能不一定知道有多少用户可以通过你的漏斗的最佳版本(在后面的文章“成为数据驱动 3:使用数据做出令人敬畏的决定”中有更多的信息)。然而,你可以为自己设定一些漏斗优化的目标:如果有 5%的用户点击你的主页进行搜索,你可以尝试不同的方法来达到 7%。试图达到这个目标不仅会给你一些努力改善漏斗的想法,还会让你成为一个袜子亿万富翁。
进一步阅读
- 如果你有兴趣了解更多关于谷歌分析的信息,看看谷歌分析学院。
- 虽然我使用谷歌分析作为一种方式来说明一些概念,但也有替代方案。这里是对这些替代品的一个稍微陈旧但相当彻底的回顾。
- 漏斗分析的维基百科页面不错。
包裹
在这里,我们已经讨论了如何使用 Google Analytics 跟踪和查看产品中发生的事情的纯技术练习。这是容易的部分。当你试图利用数据做出决策,并围绕数据和目标塑造组织时,事情会变得越来越难。下一篇文章将讲述如何减少在令人遗憾的项目上浪费时间的可能性……“避免糟糕的决定”,如果你愿意的话。
成为数据驱动的第二级:使用数据来避免不明智的决策
“用数据来避免糟糕的决策”只是“降低风险”的一种委婉说法。本系列中的第 2 级是关于降低发布在线产品变更的可能性,这种变更可能不会产生投资回报或具有潜在危害。鉴于第 1 级是跟踪&报告的技术练习,第 2 级及以上更具哲理性。
你是“假设”中的“屁股”
当提出改变现有产品或推出新产品的想法时,了解你的假设是什么是很重要的。如果你知道你的假设是什么——尤其是那些你信心不足的假设——你就可以开始想办法将这些假设转化为事实。你要问自己的问题是:做这件事的最好方法是什么?这里有一张图是 100%正确的,并且由科学家进行了同行评审,以帮助构建讨论框架:
如果您可以启动和删除某些东西,而不会永久损害您的用户体验(“回滚”),那么您应该尝试通过实验在真实用户身上进行测试,让您对结果有很高的信心。另一种方法是预先进行研究,寻找先例、市场数据或在受控环境中进行用户测试。虽然本文关注的是该图的左侧,但这两种方法在正确的上下文中都是完全有效的,甚至是互补的,只是基于真实用户数据时可信度更高。这里有一些故事…
新产品 MVP
MVP 的意思是“最小可行产品”。MVP 是一个产品或特性,它包含了测试一个想法的可行性所需的最少的功能或工作量。当谈到现有产品时,在现有用户基础上进行实验的能力是一个优势。但是当用户群还不存在的时候,你需要更有创造力。
根据他们的网站“Rocket Internet 建立并投资互联网公司,将成熟的在线商业模式带到新的、快速增长的市场”。这意味着,他们通常会采用一种他们知道在一个市场成功的产品,并在另一个市场尝试,以此来降低一些风险。然而,失败的风险远非为零,这一模型的一个广为人知的假设是,一个在美国行得通的想法在另一个国家也会行得通。因此,需要制定策略来检验这一假设。例如,当他们评估 Shopwings (一种从超市送货上门的服务)的可行性时,他们派了一帮学生去当地的商店购买每件商品并拍照。每张照片都被放在网站上,并附有描述和合理的价格。钱花在了这个网站的广告上,就用户而言,这是真实的和运行的。一旦他们建立了足够的信心,他们就可以筹集资金,雇佣一个完整的团队来生产产品并交付货物。Rocket 已经非常擅长这种技术,并利用它创办了许多公司。
同样方法的一个更著名的例子是在线鞋类零售商 Zappos 。创始人尼克·斯温穆恩(Nick Swinmurn)从当地一家鞋类零售商那里拍摄了鞋子的照片,并建立了一个网站进行销售。当订单来了,他去商店,购买和运输鞋子。以较低的成本,这解决了人们愿意冒险在网上买鞋的假设。有趣的是,Zappos 启发 Rocket Internet 创建了 Zalando ,它现在是欧洲最大的在线时装零售商之一。
新功能 MVP
一个 MVP 不一定是一个全新的产品。它可以是现有产品上的新特性,允许您运行实验或执行用户测试,这取决于您的回滚能力。新产品 MVP 同样适用的原则是:我们试图用最少的努力来测试关于我们新特性的假设。
一个涵盖很多基础的例子是在 LYKE 上运行的一个小实验,这是一个为注重时尚的印尼人开发的购物应用。LYKE 的一个显著区别在于,推荐是用户体验的核心。这意味着主屏幕、搜索结果和推送通知的内容会受到先前浏览和购买行为的严重影响,而不是像传统做法那样,受到用户输入的搜索标准或由员工管理的列表的影响。然而,建立足够的数据来生成推荐需要用户浏览或购买,因此新用户的体验不如现有用户好。
为了克服这一点,LYKE 决定引入一个 onboarding 流程,用户在第一次打开应用程序时会被问及关于他们口味的问题。研究完成了,设计完成了,用户在实验室接受了测试,并且有了很高的信心。最大的风险是,如果用户理解这样做的价值,他们会愿意提供这些信息。为了测试这一假设,设计了一个 MVP,其中包含关于购物偏好的问题,但没有完成的功能所需的任何其他功能。50%的新用户暴露于此,在奇数和偶数设备 id 之间任意划分(更多关于进一步划分受众)。没有围绕它建立推荐模型,也没有存储数据。谷歌分析事件(如此简单……)被用来跟踪有多少人在入职时关闭了应用程序,在哪个阶段,有多少人没有进入主屏幕,有多少人进一步参与并购买了应用程序,而对照组则没有这种体验。为了便于比较,对控制组和变量组触发的跟踪事件进行了不同的命名。实验显示,大多数人都关闭了应用程序。一些有价值的东西是以低成本学到的:大多数用户只想购物,任何妨碍购物的东西都是不必要的干扰。
上面例子中的一个关键点是,这个项目对 LYKE 的价值与对用户的价值不同。LYKE 重视其个性化体验,但大多数用户只是想购物,而没有意识到科学在指导他们的行为。通过这种方式的实验,该团队以低廉的代价失败了,并了解了很多关于他们的用户想要他们的应用程序的东西,理解了中断他们的流量的真正影响,并帮助指导未来的产品决策。利用第一次实验的数据,他们可以理解问题的落点和最佳点。有了这些数据,他们又尝试了一次,取得了更大的成功……这次用了“跳过”按钮。
实验类型
如果你没注意到,我用了很多“实验”这个词。在上面的例子中,我介绍了两种不同类型的实验:
- 绿野仙踪测试。这是一个对用户来说似乎完全功能化的 MVP,但是,在引擎盖下,是一些更加手动的东西,就像 Rocket 或 Zappos 的例子。
- A/B/n 检测或多元检测。将你的现有受众分成两个或更多随机的“桶”,向他们展示你的产品或功能的稍微不同的版本,并比较两组之间的行为差异。如在 LYKE 例子中所解释的。
这些很特别,因为对用户来说,它们是真实的。这给了你很多信心,根据你得到的数据,你是否应该改变(改变你的计划),放弃或进一步投资。你也可以通过调查、研究、门房 MVP或者直接的登录页面来测试你的想法的有效性,这些页面解释了如果一个产品以某种方式为用户表达兴趣而存在,它会做什么。虽然我喜欢 A/B/n 测试&绿野仙踪测试的故事,但是人们经常会遇到一些危险…
实验危险
当您对用户进行 A/B/n 测试时,您需要确保用户在存储桶之间的合理分布。LYKE 将用户分为奇数和偶数设备 id,但这是一个可怕的想法,原因有二。首先,如果您同时运行两个实验,而没有在存储桶之间随机分配用户,那么一组用户将看到两个实验的变体,一组用户将看到两个实验的对照。你实际上希望它比这更混合,这样你就可以确定哪个实验导致了哪个影响。
Two mice
未能对用户进行随机分组的第二个问题是,如果你按顺序进行实验,你会有一个总是被实验的受众,而另一个是“干净”的受众。随着时间的推移,与另一个群体相比,这可能会开始影响一个群体的潜在行为。如果你的实验经常改变你的流程的基本部分,那么如果使用你的产品是不可预测的或不稳定的,那将会使那些“不同的用户”感到沮丧。按顺序运行实验还会使安排工作变得很麻烦。
下一个常见的危险是看着实验结果说“是的,够好了”_(ツ)_/。如果你进行实验,你需要确信结果不是随机的。想象你将一枚硬币抛 1000 次,大概它落在一边的次数会比另一边多一点。如果你再次做同样的事情,假设硬币的重量分布均匀,有 50%的机会它会更频繁地落在另一边。为了确信你的结果不是随机的,你可以测试“统计显著性”。有大量的统计显著性计算器供您选择,如这个、这个、这个或这个。尽管有不必要的页面超时,但后者是我的最爱。
统计显著性是一个很好的方法来判断一个变化是否可能是随机的结果,但是有理由偶尔暂时忽略这一点:一些变化需要时间让用户适应。如果他们习惯于把一个按钮放在一个地方,而你把它移到另一个地方,那么在他们再次恢复过来并调整习惯之前,预计他们会有些沮丧或惊讶。我不确定是否有一个好的公式来解释这一点,但当我在 iOS 和 Android 原生应用上工作时,我们经常假设更新后两三天的行为变化,并忽略这一时期进行分析,除非它是灾难性的。我们忽略它,部分是因为在应用程序更新后参与度往往会增加,部分是因为如果最新版本包含应用程序核心流程的变化,用户可能会经历一次调整。
在开始实验之前,心中有一个可以衡量的明确目标是非常重要的,理想的目标是改善你的业务,这不同于衡量对新功能的吸收。当然,衡量你的新功能是否被使用是很重要的,但是更重要的是了解这个功能是否使你的产品更有效。假设你在你的袜子销售网站上运行一个新的愿望清单功能的实验。这个“愿望清单”允许用户保存他们最喜欢的袜子,供以后查看。你当然可以衡量有多少人使用这个功能,但更重要的是要确保访问意愿列表的人继续购买(“转化”)。如果很多人使用愿望清单,但由于某种原因没有购买,那么愿望清单可能会很混乱。
最后一个危害是我所说的“情感过度投资”。当你建立一个东西时,很自然地希望它成功。如果数据显示你构建的东西没有像你希望的那样工作,那么调查一下为什么,因为你可以学到一些东西。但是注意不要找理由来证明你改变的成功。如果上一段中的愿望清单示例导致用户列出很多愿望,但购买更少的袜子,这可能是意想不到的。如果你调查并发现这种下降是真实的,请随时更改功能并再次尝试,但不要不加更改地推出这一功能,除非你对暂时少卖袜子感到舒服。
进一步阅读
- 关于不同类型的 MVP 的好文章。
- 可用性测试,我已经懒洋洋地称之为“用户测试”。我现在不会改变对它的引用。
- Zappos 的故事是在重复已经写好的精益创业。值得一读。
- A/B 测试框架列表。
- LYKE 构建了一个分桶系统来帮助将用户分配到桶中(比奇数/偶数设备 id 更好!).来看看。
包裹
我们讲述了识别假设的重要性,以及测试假设以增强信心的一些方法。然后,我开始长篇大论地谈论做实验时应该避免什么。从中得出的关键是,有相当简单的技术来确定你将要发布的东西是否是一个好主意,并了解你的用户。你甚至可以用实验来对真正的用户冒真正的风险,只要你能体面地回滚。如果你不能,那么你应该把你的努力更多的放在研究和用户测试上。
下一篇文章是关于使用数据(比如通过实验收集的数据)来帮助指导决策。回头见!再见了。再见!
成为数据驱动的第三级:使用数据做出令人敬畏的决策
在系列的第二篇文章中,我们谈到了你可以发现你计划对你的在线产品做的事情是否是个坏主意的方法。这一次,我们将更有前瞻性地思考,并讨论工作的预测和优先顺序。再一次,我带着一个令人兴奋的标题去了,却对这个话题的真实性感到失望。生活充满了这样令人失望的狗屎,习惯吧。
它始于一个假设(我从没想过事情会发展到这一步
假设你有一个销售袜子的网站,你注意到你卖的便宜袜子比高档袜子多。基于此,你有一个假设:如果你提高廉价袜子的突出程度,人们会购买更多。你只需要弄清楚如何检验这个假设,然后变得富有。袜富。你和你的团队讨论并提出以下实验:
- 在主页上展示便宜的袜子,而不是由你的内部袜子专家挑选的最酷的袜子。
- 将搜索结果改为按价格升序排序(最便宜的先排序),而不是最新的先排序。
已知的已知和已知的未知
让我们关注上面列出的第二个实验:按价格升序排列搜索结果。您可能会在两种情况下考虑这种影响:
- 你以前在搜索结果或漏斗的其他部分做过类似的事情,所以对这种变化的潜在影响有一些想法。理想情况下,你已经将此作为实验运行,并且对结果有很高的信心。
- 你从来没有这样做过,不知道会发生什么。
在之前做过类似工作的情况下,设定一个目标要容易一些:你可以把以前的一些经验作为基线,并运用一些判断。如果你做出的最无效的积极改变在转化率上引起了 0.25 个百分点(称为“pp”)的改善,而最有效的是 2pp 的改善,那么你就有了一定的范围。然后,您可以应用其他因素来细化该范围,例如漏斗中的相对突出度,但您正在接近一个现实的目标。这很容易被忽视,但实验中最重要的人工产物之一是对未来变化的预期影响。你做的实验越多,理解的结果越多,你就越了解你的产品,你的用户和可能发生的事情。如果你把以前实验的结果储存在某个地方,那么你会得到一颗额外的金星。干得好。
如果您以前从未对您的袜子网站做过这样的改变,并且不知道会发生什么,转化率变化的范围可能是零个百分点以上或以下。这就是漏斗分析有所帮助的地方(参见成为数据驱动型第 1 级:拥有您信任的用户数据)。现在闭上眼睛,想象你正在做那个分析……很好的一个。以下是您的发现:
- 您每个月总共有 1,000,000 次课程和 20,000 次销售。这是 2%的转化率。
- 在这 1,000,000 个会话中,有 250,000 个会话包含搜索(25%)。
- 250,000 个会话中的 100,000 个(包括搜索),请查看 sock 详细信息页面。其中 10,000 次课程会导致购买(转换)。
- 因此,搜索的转化率为 4% (10,000 是 250,000 的 4%)
- 搜索占所有转换的 50%(总销售额为 20,000,其中销售额为 10,000)。
Search result funnel
让我们提出一个假设,将搜索结果的顺序更改为价格上升将使详细页面的浏览量增加 50%(从 100,000 增加到 150,000):
- 搜索的转化率上升了 2 个百分点,从 4%上升到 6%。
- 总转化率从 2%上升 0.5 个百分点至 2.5%。
- 你每月多卖 5000 双袜子。
为了简单起见,我假设转化率呈线性增长,其中 50%以上的详细页面视图转化为 50%以上的销售额。这是一个很大的延伸,因为您可能会因为展示更多相关产品而导致更随意的浏览,所以请考虑这是一个绝对最大的好处。通过运行一个实验,你会看到这有多接近。
现在你有了一个经过深思熟虑的假设,有了一个合理的目标(即使你开始时没有任何想法),并且知道要测试什么来达到这个目标。通过计算假设的潜在收益,我们有了测试工作优先级的基线。你可以开始写任务,人们可以开始设计和编码。厉害!
…然而,在预测搜索结果顺序变化的影响时,有一个巨大的“但是”:但是谁会关心搜索结果中袜子的顺序呢?我一遍又一遍看到的最大错误是团队和公司庆祝发布而不是冲击。如果你根据合同有义务交付某些东西以换取金钱,这没问题,但如果你的工作是改进你自己的产品,这就不好了。如果改变搜索结果的顺序不能增加袜子的销量,没人会在意。去尝试别的事情,直到你达到那个目标。明确一点:在计划中,你寻找的是努力和可衡量的目标。如果你没有达到那个目标,那就学习并尝试不同的东西。
比较苹果和苹果
对于制造产品的公司来说,一个重大的挑战是从无数的想法中知道该做什么。你下一步应该做什么可能偶尔会很明显。然而,很可能你的想法比你能执行的要多。为了弄清楚你应该首先做什么,许多公司和团队执行一些预定的计划,这可能每年发生一次,但也可能每周都发生。在这个计划中,来自多个来源的想法被提出,优先考虑和批准…或者被拒绝和忽略。正如第一段所确立的:生活是艰难的。从这些练习中,有四点很重要,但是经常缺少。
**一致影响测量。**如前所述,除非你有合同义务,否则执行项目时最重要的是影响,而不是交付。尽管通常很有可能制定出一个目标(见上文),但经常听到没有目标的项目提案。这不必是一篇很长的散文,就像“转化率增加 0.5 个百分点”,这是一种解释你计划如何达到这个数字以及你所做的假设的能力。
当涉及到多个团队提出一个项目时,康威定律经常适用,你可能会对同一件事有不同的表达。例如,您可能会听到“转化率增加 0.5 个百分点”表述为“额外售出 305 只袜子”、“每天额外售出 10 只袜子”、“搜索结果转化率增加 50%”、“每月额外收入 6982 美元”、“找到便宜袜子提高了用户满意度”等等。所有这些都可能是在陈述同样的事情,但却很难理解和比较。因此,为您的团队提供少量的度量标准和他们应该使用的单位是有益的。对于我们的袜子网站,这可能是:
- 转换率的百分点变化(导致销售的会话)。
- 新用户的数量(以前没有记录会话的用户)。
- 返回用户的数量(以前记录过会话的用户)。
我们 sock 项目的很大一部分应该能够影响这三个指标中的一个。你的产品可能不是一个袜子网站,但关键是使用简单的指标,可以理解和表达整个组织一致。
向后工作。以上观点的延伸是:从一个目标开始。就我个人而言,我喜欢设定一个目标,并被赋予实现目标的自由。以“我们计划将转化率提高 0.5 个百分点”开始,然后“我们将试图通过改变搜索结果的顺序来实现这一目标,因为我们假设大多数人对廉价袜子感兴趣”。通过这样做,你强调了什么是重要的:转化率增加 0.5 个百分点。你也表达了你可能如何到达那里,但你不应该害怕改变你的计划。
**T 恤尺寸是本地化的标准。**这是千真万确的:t 恤尺寸反映了当地市场上人们的体型。谁知道呢?在衡量工作的复杂性或努力程度时,这也是一个比喻。两个团队可能对“小”、“中”和“大”的含义有非常不同的理解。因此,当比较来自多个团队的提议时,尽量坚持你将投入多少时间以及谁将从事这项工作。我的思维模式是“如果一个团队被锁在一个房间里做这件事,谁会在那个房间里呆多久?”。你可以表达当你进行一项实验时存在一些不确定性,实验结果可能会影响你以后的决策,或者其他一些不可预知的事情。所有这些都是有缺陷的,但是你正在寻找一种合理地比较工作的方法,以便对其进行优先排序,天、周和月是很好理解的时间单位。
你的假设可能是错的。但那很酷。围绕这个信念优化你的执行风格。如果你刚刚了解到一些关于用户如何与你的产品互动的新知识,那么错了也没关系。事实上这很重要。花费不必要的精力来完成这种学习就不那么酷了。当弄清楚如何测试你的假设时,把注意力放在尽可能少的努力和为用户伪造体验的方法上,而不是构建整个过程。
进一步阅读
- 这篇文章是关于定义可交付成果的松散性。
- 关于假设驱动开发的古老而相关的文章。
- 什么叫一个百分点。
包裹
在 ImmobilienScout24 ,我们一直在使用计划卡来帮助多个团队一致地构建我们的项目,以便我们可以进行比较、优先排序和计划。下面是一个版本,你可以用在你的袜子网站上:
A planning card and an illustration of why my parents bought me a computer
由于这可能很难阅读,上面的卡片包括:
- 我们计划做什么(“通过推广廉价袜子来提高转化率”)。
- 我们的三个目标和预测影响(转化率增加 0.5 个百分点,误写成 0.5%,对新用户或回头客数量没有预期影响)。
- 我们计划进行的实验(“搜索结果上升”和“主页上的廉价袜子”)。
- 我们所做的假设(“对用户来说,价格比近期更重要”)。
- 我们需要的人员,这有助于我们规划容量。
- 我们认为建立、运行和分析我们的实验需要多长时间。如上所述,时间单位有助于跨多个团队标准化。这并不酷,但很实用。如果你喜欢,可以叫实习工具。
这篇文章的关键信息概括在这张计划卡中:有一个假设,一些要测量的东西和一个起点(在这个例子中是实验);最终的可交付成果没有目标重要。
下一篇文章是关于“用数据塑造你的组织”,在这里你可以开始应用这里概述的东西来设计团队结构和流程。
*虽然我听说它有自己的月亮。
成为数据驱动的第 4 级:用数据塑造你的组织
在系列的第一部分中,介绍了收集和读取数据的起点,在第二部分中,我们讨论了如何使用这些数据来启动帮助您发展业务的事情,在第三部分中,我们讨论了您可以预测和优先处理工作的方法。
在最后一部分,我们将使用这些构建模块来构建和扩展产品工程团队。我将谈谈我合作过的团队,他们将数据作为成功的定义和结构的基础。但是首先…
不同类型的团队
比方说,如果你有 8 名以上的工程师和一个产品,那么你可能希望将这些工程师、产品经理、分析师和设计师塑造和定义为最适合你试图优化的团队:速度、可靠性、技术才华、快乐、产品美观或其他。以下是一些例子:
- **项目团队。**这些团队是围绕特定的可交付成果创建的。理论上,当然对于跨越几个月的大型项目来说,这种结构优化了可预测的项目结果。项目团队通常是自治的和跨职能的。根据定义,他们也不负责他们所建造的东西的长期维护,因为一旦项目完成,他们就解散了。处理好它。
- **特色团队。**功能团队和项目团队看起来非常相似,但是有细微的区别。一个项目团队可能跨越多个特性,并且只是暂时存在,而一个特性团队可能在很长一段时间内处理同一个特性的多个项目。功能团队的一个例子可能是“支付团队”,负责与电子商务产品支付相关的所有主题。当变更需要跨多个特性工作时,这些团队需要有人来协调。
- **组件/平台团队。**在这种配置中,您可以根据平台或技术来划分团队,并努力在交互平台之间建立定义良好的接口。这可能适用于复杂的系统(例如,考虑一架飞机是如何设计和建造的),但这需要一些项目管理开销来进行跨多个平台的产品更改。它肯定不是为速度而优化的。
- **客户团队。**如果你的企业有多种不同类型的付费客户,围绕这些客户组建你的团队会很有用。例如,如果你是一家广告公司,你可能有三个主要客户,每个客户都有一个相关的团队。另一个例子可能是一个产品的用户在不同的国家,每个国家对你的产品都有特殊的需求,比如不同的语言或支付网关。这是为了以潜在的费用和技术复杂性为代价的交付而优化的。
- **度量驱动的团队。**在这种设置中,团队负责监控和改进特定的指标(如“转化率”或“页面速度”),并期望包含实现该目标所需的所有人员。它们不像项目团队那样根据具体的可交付成果来衡量。相反,它们是通过度量的变化来衡量的。这是我们将在这篇文章的剩余部分主要讨论的团队设置。
成长@ Etsy
在 Etsy 面向用户的产品工程部,我们有大约 70 名工程师、设计师、分析师和产品经理。他们被分成不同的小组,执行不同的任务。例如,我们有一个主页项目团队,一个为营销构建和维护电子邮件基础设施的平台团队,一个包含 Etsy 搜索体验大部分知识的团队,一个付费广告功能团队,等等。虽然看起来有点混乱,但这些团队相当独立,非常关心他们的工作,并进行实验,以确保所有用户看到的变化在某种程度上对 Etsy 和它的卖家是有益的。虽然一切正常,但我们希望以某种方式扩大组织规模,加深对用户体验关键部分的了解,并基于稳定的团队更有效的信念创建稳定的团队。
解决方案是将这 8 个左右的团队分成两组:增长团队和买家体验团队。增长小组的目标非常简单:增加 Etsy 网站和应用程序的会话数量。买家体验组的目标稍微复杂一些,但可以概括为“提高转化率”。增长小组增加会议次数的总体指标目标被分解为更具体的指标,并指派团队来改进每一项指标。我们将集中讨论增长是如何被组织成多个团队的,但值得注意的是购买者体验和增长之间的积极张力:随着增长团队增加会议,它抑制了购买者体验团队的转化率,然后他们努力抵消。
为了增长,会议是王道。会话是对网站或原生应用的访问(实际上比那个更复杂)。Growth 团队的任务是制定与直接增加会议次数相关的清晰、简单且可衡量的目标。
- 新访客增长:这个团队致力于增加 Etsy 上的用户数量,而没有之前录制的会话。虽然标题指标增加了新用户的数量,但这可以分解为与 Etsy 可用的各种流量源的优化相关的更具体的指标。他们的重点是搜索引擎优化和 SEA 的改进。这涉及到网站各个部分的工作,例如,提高(主要是)谷歌的排名,降低新用户的跳出率。
- 注册:由于各种原因,如果没有注册账户,你就不能在 Etsy 上购物。一旦用户注册并登录,他们只会在购买过程中中断支付。注册用户也保持得非常好:注册一个账户不仅是一个非常强烈的参与信号,而且它还允许 Etsy 以后联系你,比如在圣诞节前一个月给你发一封电子邮件。该团队将这一高级指标分解为不同的注册方法,创建了允许用户使用脸书或谷歌帐户登录的项目,并优化了传统的注册流程。
- 保留:这个团队的目标是通过之前录制的会话增加 Etsy 上的用户数量。他们的主要手段相当直接和生硬:电子邮件和推送通知。像新访客增长一样,一个简单的目标可以分解成许多不同的指标,这些指标与各种渠道的功效相关。一旦理解了这些,团队就可以发现改进的机会。
每个团队包括 4-6 名具备必要技能的工程师,他们可以在必要时跨 Etsy 的所有平台(web、iOS 和 Android)进行运输并执行一些分析,一名对其主题具有丰富知识的产品经理,一名确保跨 Etsy 的一致和可用体验的设计师,以及一名帮助了解工作机会和影响的指定分析师。他们的目标很明确,对于他们执行的大部分工作来说,包含了所有提出想法并自主执行的人。这个跨职能团队与营销团队的密切关系,对于那些有增长黑客经验的人来说应该是熟悉的。在建立这种亲密关系的过程中,来自营销团队的人在卡拉 ok 之夜和去看棒球的同时参加了产品工程会议。
Etsy 的招聘政策意味着人们主要是根据他们对产品的兴趣和 Etsy 的使命来选择的。在面试过程中,候选人会被问及他们的意见,而且更多的时候,他们与 Etsy 有一些个人联系。这意味着工程领域的每个人都对产品有一些看法,并且非常关心它。这为员工了解产品及其用户创造了肥沃的土壤。这一点的具体影响是,产品变更可能来自公司的任何部门,无论其角色如何。例如,工程师通常会构思一个实验,找出最简单的方法来测试他们的假设,并进行分析以理解结果。产品经理被视为其领域的专家(如保留策略),确保想法符合一些长期战略,并利用他们的产品管理专业知识来帮助考虑想法的影响,而不是规定团队将承担什么工作。对于许多产品经理和工程师来说,这通常是对以前工作的文化调整,在新员工入职时必须考虑到这一点。
供求@ LYKE
前一篇文章中提到的【LYKE 是一家为印度尼西亚服装购物者开发应用程序的初创公司。它的产品工程团队比 Etsy 小得多,大约只有 12 个人。LYKE 不出售自己的商品,而是像 Etsy 一样,为其他人(“卖家”)制造和运送的商品做广告。
LYKE 的产品工程团队最初是按平台划分的。工程师们每人负责编码、监控和部署技术基础设施的一部分。此外,尽管公司很小,但工程师和产品经理是相互独立的。如果一个产品经理想要改变一些东西,他们必须和一个特定的人谈话,然后这个人会把工作分配给每个必要的工程师。工程师们将一起找出组件间数据流的最佳接口,评估和部署该特性。产品经理们的挫折感很大,简直是被逼哭了,直接导致了辞职。对于一个局外人来说,这个问题很明显。
像大多数电子商务创业公司一样,LYKE 也遭受了库存和用户之间的循环依赖:当没有足够的用户时,很难让卖家列出库存,如果没有足够的销售,也很难获得用户。为了让工程师、产品经理、分析师和设计师专注于解决这种循环依赖,产品工程团队被分成了两个团队:“供应”和“需求”。
供应团队的产品经理有一个库存目标,工程师们执行任何必要的工作,以便更容易地在 LYKE 上列出产品。需求团队的产品经理也有工程师和设计师,但目标是通过用户增长或提高转化率来增加销售。对 LYKE 来说,需求团队融合了 Etsy 的“成长”和“买家体验”。将这两个学科结合起来只是因为公司的规模:它不够大,不足以支持拆分增长和转换率的提高,因此团队在这两个杠杆之间进行了权衡。
这种重组很快影响了日常工作:每个团队的人坐在一起,站在一起,他们之间的形象墙被拆除了,因为产品经理现在可以和工程师坐在一起,想出最好的方式来一起运送东西。工程师们的关注点已经从平台转移到了供需指标上。这需要一些调整,包括一名工程师辞职,但影响是迅速的,而且在很大程度上是积极的。团队明显更开心了,速度更快了,可以衡量他们工作的影响了,就像他们在初创公司应该做的那样,工程师们开始贡献想法,而不仅仅是工作票。值得注意的是,通过分享客户反馈会议和站立式 A/B 测试的结果来教育团队中的每个人,这变得更加容易。
本地应用@ ImmobilienScout24
ImmobilienScout24(简称“ImmoScout”)是德国领先的房地产门户网站,虽然规模与 Etsy 相似,但业务却截然不同。在 Etsy 和 LYKE,用户愿意购买的商品数量有些弹性,会受到产品变化的影响。然而,无论 ImmoScout 的网站和原生应用程序如何优化,这些平台都很难增加购买的房屋数量。尽管如此,还是有一些非常相似的挑战和解决方案。
在加入 ImmoScout 后,很明显 iOS 和 Android 原生应用团队的出货情况并不好,因为他们可以获得大约 16 名工程师、3 名设计师、1 名 UX 专家和 1 名最近辞职的产品经理的能力。团队在平台和功能上的分裂是显而易见的。沟通方面的分歧经常可以在座位图中看到,在这种情况下,所有 iOS 工程师坐在一个房间的一侧,所有 Android 工程师坐在另一侧,API 专家在其他地方。产品经理和设计师(也致力于一个平台)坐在 20 米外完全不同的房间里。在这个团队中有很多挫折,有时会导致相对较小的问题,辞职和断断续续的释放大声,循环的争论。
虽然德国购房者一手拿着 ImmoScout Android 应用,一手拿着 iOS 应用并不正常,但那些在 2016 年这样做的人应该会看到康威定律的图形说明。例如,要在地图上看到你的搜索结果,需要在 Android 应用中滑动,在 iOS 应用中点击下拉菜单。在 iOS 中,多年来一直有高效的推送通知,但从未进入 Android 应用程序。这个清单很长,但是你已经明白了。虽然这些差异不一定是一个巨大的用户问题(正如我所说,谁会同时看这两个应用?),他们是偶然的。往好里说,它们反映了 Android 和 iOS 团队之间分享的知识是多么少,往坏里说,它们代表了一种令人困惑的产品愿景。
在这一点上,我们做了三个显著的改变:首先,一个产品经理被两个产品经理取代,以反映工作量。这已经计划了一段时间,但这是一个非常积极的变化,尤其是考虑到这些产品经理带来的创业态度。他们没有主动离开公司的事实也很方便。
第二个变化是强加了一条规则,即默认情况下,所有功能更新都必须经过 A/B 测试。为此选择的工具是optimized,仅仅是因为在 ImmoScout 已经有了它的许可,我们想马上开始。这条规则的引入有两个影响:只有积极的变化会被 100%的用户看到,团队可以看到他们的工作对真实用户的影响。了解影响不仅有潜在的激励作用,也有教育意义。这种知识的增长使得规划的质量有了显著的提高。
最后,团队是由公制而不是平台组织的。一个团队叫做“成长”(还记得 Etsy 的这个吗?),其目标只是“增加 x%的会话”,另一个叫做“参与度”,其目标是保持每次会话的稳定比率,即用户查询 ImmoScout 应用程序上列出的属性的比率。这类似于转换率。询问率保持稳定而非上升的原因是(根据以前的经验)认为增加会议次数也会导致听众参与度降低。因此,保持一个稳定的汇率本身就是一个挑战,而且已经证明是一个公平的目标。
每个团队包括一名产品经理、一名设计师、一名 API 专家、一半 Android 工程师和一半 iOS 工程师。蛋糕上最后的樱桃是这些团队之间分享的分析师,以帮助他们了解影响和机会。与 LYKE 的转型类似,这导致了一些明显的变化:座位被重新安排(产品经理被故意放在中心),增长和参与团队有单独的展台,每两周展示一次两个团队,这些展示的开场幻灯片涵盖了会话和查询率指标(以及下载量、应用评级),大部分时间花在实验的状态和学习上。
按平台划分团队的理论好处之一是技术稳定性。逻辑是,如果一个 Android 团队(例如)紧密合作,而不是与产品经理保持一致,他们可以更容易地优先考虑将提高稳定性和可维护性的技术工作,因为工程经理决定谁做什么。不管这是不是真的,我们保持了相同的面向平台的报告路线。之前 iOS 和 Android 的工程经理仍然是 iOS 和 Android 专家的直线经理。这些经理负责确保部署按时进行(如果不是自己执行部署的话),保持无故障率> 99.90%,为对各自平台感兴趣的人召开会议,支持需要本地应用工作的其他团队,最重要的是,让他们的团队满意。
最后,当团队先前不开心时造成的小规模员工流失创造了雇佣具有更强产品意识的工程师的机会。在招聘过程中,对技术能力的主要关注有所放松,有利于那些对 ImmoScout 应用程序感兴趣的人。如果一个有能力的工程师带着合理的意见参加面试,告诉他们产品中哪些地方可以改进,这就让他们比一个可能更有经验、不太关心用户体验的工程师更有优势。
在证明了度量驱动模型之后,下一步是将这一理念推广到本地应用团队所在的 60 多人的“消费者体验”部门。这将创建三个多平台、跨职能的团队,每个团队都旨在改善一项指标,如新用户数量、回头客数量以及跨原生应用和网站的查询率。我期待看到 Etsy 中使用的镜像结构将如何在 ImmoScout 中工作。
进一步阅读
包裹
虽然在实现度量驱动团队的过程中偶尔会遇到一些困难,但我相信上面描述的变化(以及在之前的文章中的描述)在很大程度上是积极的。由此产生的团队持续交付超出正常预期的价值,团队能力随着期望的增加而增长。此外,他们创造了有趣的工作环境,很好地留住了员工。工作不仅仅是让公司变得更富有,它还关系到你如何度过生命中的 86000 个小时。当它们经过你的办公桌时,数下每一个小时。数一数。如果你真的看到计数到零,你就老了。超级老。
虽然 Etsy、LYKE 和 ImmobilienScout24 的例子侧重于不同的目标,涉及不同的个性,但它们有一些共同的特征:
- 他们的工作集中在一个明确的目标上。有时候这很容易,老板或客户交给你一个交付目标,围绕这个目标组织人员。往往不是那么清楚。有了清晰、持久的度量标准,即使下一个大项目不明显,他们也能够保持专注和稳定。
- 他们包含了有知识和技能的人来做决定和改变产品,只是偶尔需要来自其他团队的输入。换句话说,它们是跨职能的,并且足够可信,可以自主运营。
- 他们很开心。士气普遍很高,工作人员的保留率也很高,令人遗憾的损失很少。
- 默认的立场是实验。这意味着所有用户可用的每一个变化都提升了公司。这也意味着团队中的大多数人理解他们的贡献,并且拥有强大的知识体系来提出和预测想法的影响。
感谢您阅读本文,我希望这个系列对您有用…好吧,那么…嗯…再见?
贝多芬、毕加索和人工智能
“A low-angle black-and-white shot of a person playing the piano” by Guang Yang on Unsplash
介绍
当人们想到有史以来最伟大的艺术家时,他们可能会想到贝多芬或毕加索这样的名字。没有人会认为电脑是伟大的艺术家。但如果有一天,事实确实如此。计算机能学会画出像蒙娜丽莎这样不可思议的画吗?也许有一天,一个机器人将能够创作下一部伟大的交响乐。一些专家认为是这样的。事实上,人工智能领域一些最伟大的头脑正在努力开发能够独立于人类创作绘画和音乐的程序。人工智能在艺术领域的应用甚至被谷歌等科技巨头所采用。
本文中包含的项目可能会对我们的日常生活产生重大影响。它们还可能改变我们看待艺术的方式。它们还展示了人工智能领域取得的令人难以置信的进步。图像识别并不像研究那样深入。以我们过去伟大艺术家的风格创作音乐的能力也是如此。虽然会涉及到这些主题,但我们将重点关注几个更高级的成就,如文本描述被转化为图像,以及生成完全原创的艺术和音乐。这些项目中的每一个都带来了新的和创新的东西,并向我们展示了艺术空间是如何成为进一步探索人工智能应用的绝佳场所。我们将讨论这些项目中遇到的问题以及如何克服这些问题。人工智能的未来看起来很光明。让我们看看未来会怎样。通过这样做,我们可能能够更好地理解人工智能在一个由人类创造力驱动的领域中可能产生的影响。
GAN 及其演化形式
机器必须接受教育。他们从指导中学习。我们如何引导机器不去模仿已经存在的东西,并让它们创造新的技术?“没有一个有创造力的艺术家会在今天创造出试图模仿巴洛克风格、印象派风格或任何其他传统风格的艺术,除非他们试图讽刺地这样做”[4]。这个问题也不仅限于绘画。音乐在某些方面非常有条理,但也是一种需要大量创造力的艺术形式。那么我们如何着手解决这样一个问题呢?我们要讨论的第一个概念叫做 GAN(生成对抗网络)。GANs 虽然相当复杂,但正在成为一种过时的模型。如果艺术领域的人工智能要进步,研究人员和开发人员将不得不努力寻找更好的方法,让机器产生艺术和音乐。其中两种方法以草图的形式呈现——RNN和残(创意对抗网络)。这些方法都有其优于 GANs 的优点。
首先,让我们探讨一下 GAN 到底是什么。下面是一小段摘录,解释了 GAN 的工作原理:
生成对抗网络有两个子网络,一个生成器和一个鉴别器。鉴别器可以访问一组图像(训练图像)。鉴别器试图区分“真实”图像(来自训练集)和生成器生成的“虚假”图像。生成器试图在看不到图像的情况下生成与训练集相似的图像[4]。
生成器创建的图像越多,就越接近训练集中的图像。这个想法是,在生成一定数量的图像后,GAN 将创建与我们认为的艺术非常相似的图像。至少可以说,这是一个非常令人印象深刻的成就。但是如果我们更进一步呢?
许多与 GAN 相关的问题只是限制了它的功能。GAN 是强大的,但是不能做我们想要的那么多。例如,上述模型中的生成器将继续创建越来越接近提供给鉴别器的图像的图像,它不会生成原创艺术。GAN 可以被训练为与用户一起绘制吗?不太可能。该模型也无法将基于文本的图像描述转化为实际的图片。尽管 GAN 可能令人印象深刻,但我们都同意它可以改进。提到的每一个缺点实际上已经被处理,并且在一定程度上被解决。让我们看看这是如何做到的。
Sketch-RNN 是 Google 开发的递归神经网络模型。素描 RNN 的目标是帮助机器学习以类似人类学习的方式创造艺术。它已经被用于谷歌人工智能实验,能够与用户一起绘制草图。在这样做的同时,它可以为用户提供建议,甚至在用户决定休息一下时完成用户的草图。Sketch-RNN 接触到了大量的草图,这些草图是通过一组矢量图提供的,这些矢量图是通过另一个谷歌应用程序获得的,我们将在后面讨论。每一个草图都有标签,让程序知道草图中的物体是什么。数据集将草图表示为一组笔画。这使得素描 RNN 然后了解某个物体的每个素描有什么共同点。如果用户开始画一只猫,素描 RNN 就可以向用户展示这只猫的其他共同特征。这个模型可以有许多新的创造性应用。“在各种课程上训练的纯解码器模型可以通过建议完成草图的许多可能的方法来帮助艺术家的创作过程”[3]。Sketch-RNN 团队甚至认为,给定一个更复杂的数据集,这些应用程序可以在教育意义上用于教用户如何绘画。单独使用 GAN 无法轻松实现草图 RNN 的这些应用。
另一种用于改进 GAN 的方法是创造性的对抗网络。在他们关于对抗性网络产生艺术的论文中,一些研究人员讨论了一种通过易拉罐产生艺术的新方法。这个想法是,CAN 有两个对手网络。一个是生成器,它无法接触到任何艺术。在生成图像时,它没有任何基础。另一个网络,鉴别器,被训练来将生成的图像分类为艺术或非艺术。生成图像时,鉴别器向生成器提供两条信息。第一个问题是,它是否认为生成的图像与它接受训练的艺术作品来自同一个发行商,另一个问题是,鉴别器如何将生成的图像归入它所学习的艺术类别之一。这种技术是神奇的,因为它帮助生成器创建图像,这些图像既可以模仿过去的艺术作品,因为它学习了这些图像的优点,又具有创造性,因为它被教导产生新的不同的艺术概念。这与甘模仿训练图像的艺术创作有很大的不同。最终,CAN 将学会如何只生产新的和创新的艺术品。
香草甘的最后一个未来是堆栈甘。StackGAN 是一个从文本到照片的逼真图像合成器,它使用堆叠式生成对抗网络。给定文本描述,StackGAN 能够创建与给定文本非常相关的图像。这对于正常的 GAN 模型来说是不可行的,因为即使使用最先进的训练数据库,从文本描述中生成照片级的图像也是非常困难的。这就是 StackGAN 的用武之地。它把问题分成两部分。“低分辨率图像由我们的第一阶段 GAN 生成。在第一阶段 GAN 的顶部,我们堆叠了第二阶段 GAN,以根据第一阶段结果和文本描述生成逼真的高分辨率图像”[7]。正是通过对第一阶段结果和文本描述的调节,第二阶段 GAN 可以发现第一阶段 GAN 可能遗漏的细节,并创建更高分辨率的图像。通过将问题分解成更小的子问题,StackGAN 可以解决常规 GAN 无法解决的问题。下一页的图片展示了常规 GAN 和 StackGAN 每一步的区别。
This image came from the StackGAN paper [7].
正是通过近年来取得的这些进步,我们可以继续推动人工智能的发展。我们刚刚看到了改进一个已经相当复杂和创新的概念的三种方法。这些进步中的每一项都有实际的、日常的用途。随着我们不断改进人工智能技术,我们将能够做越来越多的事情,不仅仅是艺术和音乐,而是各种各样的任务来改善我们的生活。
DeepBach、Magenta 和 NSynth
然而,图像并不是人工智能能够影响的唯一艺术类型。正如我们所说,它对音乐的影响正在被探索。我们现在将探讨一些具体案例及其对音乐和人工智能的影响。在这样做的时候,我们应该能够看到艺术如何为人工智能做同样多的事情。这两个领域都从我们在这里探索的项目类型中受益匪浅。
机器能够创作出像约翰·塞巴斯蒂安·巴赫这样的音乐吗?在一个名为德普巴赫的项目中,几名研究人员试图创作类似巴赫合唱曲的作品。DeepBach 的美妙之处在于它“能够生成连贯的音乐短语,并提供,例如,旋律的各种重新和声,而不会抄袭”[6]。这意味着什么,DeepBach 可以创造结构正确的音乐,是原创的。这正是巴赫的风格。这不仅仅是他作品的混搭。DeepBach 正在创造新的内容。DeepBach 的开发者继续测试他们的产品是否真的能愚弄听众。
作为实验的一部分,超过 1250 人被要求投票决定展示给他们的作品是否确实是巴赫创作的。受试者有不同程度的音乐专长。结果显示,随着 DeepBach 复杂性模型的增加,受试者在区分巴赫的合唱曲和 DeepBach 的合唱曲时会遇到越来越多的困难。这个实验向我们表明,通过使用人工智能和机器学习,完全有可能以伟人的形象再造原创作品。但这是人工智能在艺术和音乐领域的极限吗?
DeepBach 取得了一些在不久前闻所未闻的成就,但这肯定不是人工智能在音乐领域所能做的最大贡献。如果我们想创造新的和创新的音乐呢?也许人工智能可以一起改变音乐创作的方式。肯定有项目做得更多来突破极限。事实上,这正是 Magenta 背后的团队所要做的。
Magenta 是谷歌大脑团队正在进行的一个项目,由 Douglas Eck 领导。埃克自 2010 年以来一直在谷歌工作,但这并不是他对音乐兴趣的开始。埃克帮助建立了大脑音乐和声音,一个大脑、音乐和声音研究的国际实验室。他还参与了麦吉尔音乐媒体和技术跨学科研究中心的工作,并且是蒙特利尔大学计算机科学的副教授。
Magenta 的目标是成为“一个研究项目,推进音乐和艺术生成的机器智能的艺术状态”[2]。它是一个使用 TensorFlow 的开源项目。Magenta 的目标是学习如何以一种真正可生成的方式生成艺术和音乐。它必须超越仅仅模仿现有的音乐。这与 DeepBach 的项目截然不同,DeepBach 试图以一种不抄袭现有音乐的方式模仿现有音乐。Eck 和他的公司意识到,艺术就是捕捉惊喜的元素,并吸引人们对某些方面的注意。“这带来了或许是最大的挑战:将世代、关注和惊喜结合起来,讲述一个引人入胜的故事。如此多的机器生成的音乐和艺术在小块中是好的,但缺乏任何种类的长期叙事弧”[2]。这种观点赋予了电脑生成的音乐更多的内容,并帮助它变得不那么噱头。
magenta 团队开发的项目之一叫做 NSynth 。NSynth 背后的想法是能够创造前所未有的新声音,但除此之外,重新想象音乐合成是如何完成的。与普通合成器专注于“振荡器的特定排列或样本回放的算法,如 FM 合成或粒度合成”[5]不同,NSynth 在个体层面上生成声音。为此,它使用深度神经网络。谷歌甚至推出了一项实验,让用户真正看到 NSynth 可以做什么,让他们将现有乐器的声音融合在一起,创造出前所未有的新混合声音。例如,用户可以使用两种乐器,如班卓琴和大号,并提取它们声音的一部分来创建一种全新的乐器。该实验还允许用户决定每种仪器的使用比例。
像 Magenta 这样的项目向我们展示了人工智能在创作音乐方面的全部能力。他们探索人工智能的新应用,可以独立于人类产生新的想法。这是我们最接近机器创造力的阶段。虽然机器还不能真正思考和表达创造力,但它们可能很快就能产生新的独特的艺术和音乐供我们欣赏。不过不要担心。Eck 不打算用 AI 取代艺人。相反,他希望为艺术家提供以全新方式创作音乐的工具。
深梦且快,画!
当我们展望人工智能在艺术领域被用来实现新的和创新的想法的更多方式时,我们看着像这样的项目快速,绘制!和深梦。这些项目展示了该领域的惊人进展,同时指出了人工智能研究人员在未来几年必须解决的一些问题。
快,画!是来自谷歌创意实验室的一个应用程序,被训练来识别快速绘图,就像人们在猜字谜游戏中看到的一样。该程序可以根据之前给它的许多图片的共同点来识别简单的物体,如猫和苹果。虽然程序不会每次使用时都得到正确的图片,但它会继续从绘制的图片和之前的数百张图片中学习相似之处。
快,画背后的科学!“使用了一些帮助谷歌翻译识别你的笔迹的技术。要理解笔迹或图画,你不能只看这个人画了什么。你看看他们实际上是怎么画出来的”[1]。它以游戏的形式呈现,用户画出应用程序选择的对象的图片。然后程序有 20 秒的时间来识别图像。在每个会话中,用户总共有 6 个对象。这些图像然后被存储到用于训练应用的数据库中。这恰好是我们之前在草图-RNN 应用程序中看到的同一个数据库。这种图像识别是人工智能在艺术和音乐领域的一个非常实际的应用。它可以在日常生活中给我们带来很多好处。但这仅仅开始触及人工智能在该领域所能做的事情的表面。尽管这非常令人印象深刻,但我们可能会指出,该应用程序并没有真正理解正在绘制的内容。它只是发现了一些模式。事实上,这种区别是简单的 AI 技术和真正的人工通用智能之间的差距的一部分。真正理解图像中的物体是什么的机器似乎不会在不久的将来出现。
艺术领域另一个有趣的项目是谷歌的 Deep Dream 项目,该项目使用 AI 来创建新的独特的图像。不幸的是,深度梦生成器团队不会对技术本身进行太多的细节描述(主要是担心对于一封电子邮件来说太长了)[8]。然而,他们解释了卷积神经网络是在著名的 ImageNet 数据集上训练的。这些神经网络然后被用来创建艺术般的图像。本质上,深度梦采用一个图像的样式,并用它来修改另一个图像。结果可以是任何东西,从愚蠢的融合到艺术杰作。当程序识别用户提供的图像的独特样式并将这些样式强加到用户提供的另一个图像上时,就会发生这种情况。通过使用 Deep Dream 可以很容易地观察到,计算机还没有能力真正理解它们在艺术方面做了什么。它们可以被输入复杂的算法来生成图像,但并不从根本上理解它们正在生成什么。例如,计算机可能看到一把刀正在切一个洋葱,并假设刀和洋葱是一个物体。缺乏真正理解图像内容的能力是研究人员尚未解决的一个难题。
也许随着我们在人工智能方面的不断进步,我们将能够拥有真正理解图像中的对象以及它们的音乐所唤起的情感的机器。实现这一目标的唯一途径是达到真正的人工智能(AGI)。与此同时,深度梦团队相信,生成模型将能够创造出一些真正有趣的艺术作品和数字内容。
我们将何去何从?
在这一部分,我们将考虑人工智能在艺术领域的发展方向。我们将看看人工智能是如何影响这个领域的,以及它能以何种方式继续这样做。我们也将关注艺术和音乐在未来几年继续影响人工智能的方式。
虽然我不认为我们已经完全掌握了模仿过去伟大艺术家的能力,但这个问题的解决只是时间问题。真正需要解决的任务是在艺术和音乐上创造新的创新。我们需要朝着没有模仿的创造方向努力。很明显,我们正通过 CAN 和 Magenta 等项目朝着这个方向前进。人工通用智能(AGI)并不是完成这项任务的唯一途径。事实上,即使那些质疑 AGI 的可能性的人也很难质疑由一台机器创造出独特的艺术作品。
通过人工智能进一步提高艺术和音乐的一条途径是创建更先进的数据集,用于训练复杂的网络,如素描 RNN 和深度梦。人工智能需要经过训练才能达到预期的性能。这种训练对我们获得的结果有着巨大的影响。难道我们不应该尽可能以最有益的方式训练我们的机器吗?即使开发像 Sketch-RNN 这样的软件来使用《深度梦境》中使用的 ImageNet 数据集,也可能会在教育艺术家绘制复杂、逼真图像的技术方面发挥巨大作用。复杂的数据集很可能是我们更有效训练的答案。在我们的机器能够像我们一样思考和学习之前,我们需要非常小心使用什么数据来训练它们。
艺术和音乐可以帮助影响人工智能的方式之一是提供另一种图灵测试机器的方法。对于那些梦想创造 AGI 的人来说,有什么更好的方法来测试机器的能力,以创造出测试人类创造力的东西呢?艺术是人类创造力最真实的表现。事实上,这就是它的本质。尽管艺术可能不是人工智能的终极目标,但它可能是测试机器能力极限的最佳方式之一。有一天,计算机可以创作原创音乐作品,并根据用户的描述创建图像,这很可能就是我们无法区分人和机器的那一天。
结论
在音乐领域使用人工智能有很多好处。其中一些已经在我们目前讨论的项目中出现过。我们已经看到了人工智能如何用于图像识别,以及它们将我们的话语转化为精彩图像的能力。我们也看到了人工智能如何被用来合成从未听过的新声音。我们知道,人工智能可以用来与我们一起创作艺术,也可以独立于我们之外。它可以被训练来模仿过去的音乐,并且可以创造新的想法。所有这些成就都是推动人工智能研究走向未来的一部分。谁知道呢?也许有一天,我们将实现人工智能,机器将能够理解它所获得的图像中的真实内容。也许我们的计算机能够理解他们的艺术带给我们的感受。有一条清晰的道路告诉我们从这里去哪里。我坚信,无论是在艺术领域还是在我们的日常生活中,我们都应该继续这项研究,并测试人工智能的极限。
参考
- 开发者,谷歌。(2016 年 11 月 15 日)。人工智能实验:快,画!美利坚合众国。
- Eck,D. (2016 年 6 月 1 日)。欢迎来到 Magenta!从品红色检索:【https://magenta.tensorflow.org/welcome-to-magenta
- 埃克博士和哈博士(2017 年)。素描的神经表征。 eprint arXiv:1704.03477。
- 埃尔加马尔,a .,刘,b .,埃尔霍塞尼,m .,&马佐尼,M. (2017)。CAN:通过学习风格和偏离风格规范来产生“艺术”的创造性对立网络。
- 恩格尔、雷斯尼克、罗伯茨、迪耶曼、埃克、西蒙扬和诺鲁齐(2017)。用 WaveNet 自动编码器对音符进行神经音频合成。eprint arXiv:1704.01279。
- Hadjeres,g .,Pachet,f .,和 Neilsen,F. (2016 年)。 DeepBach:巴赫合唱曲生成的可控模型。 eprint arXiv:1612.01010。
- 黄,陈,李,黄,,王,徐,张,张,张(2016)。 StackGAN:利用堆叠式生成性序列网络进行文本到照片级的图像合成。 eprint arXiv:1612.03242。
- 团队,D. D. (2017 年 9 月 22 日至 25 日)。电子邮件。(c .卡拉希基,采访者)
在人工智能接管我们的工作之前,它会组织我们的工作。
用不了多久,人工智能就能比人类更好地预测项目的成功。
2012 年 5 月,离正式日期还有 4 周,柏林新国际机场的启用被宣布将再推迟几周。几周变成了几个月,几个月变成了几年。对其实际开放的最新预测是 2018 年底。
项目的计划进度和实际进度之间存在巨大的不匹配。
当一个项目像柏林机场一样被戏剧性地延迟时,这显然是一个以上问题的结果。然而,这个大型项目分享了许多项目延迟或失败的大多数常见原因:沟通不畅、不切实际的时间估计和政治游戏,这些甚至可能超过最精心的规划和过程。
新技术为重新思考项目管理奠定了基础。
几年前在科技公司开始的事情现在正在冲击主流业务:聊天取代电子邮件。WhatsApp、微信和 Messenger 向普通公民介绍了即时通讯的优势。它们为 Slack 等面向商业的聊天解决方案铺平了道路,Slack 结合了 IRC 等老派聊天应用的强大功能和现代移动通讯应用的易用性。Slack 正在被初创公司广泛采用,微软现在正在将其等效的 Teams 应用程序推向更保守的市场。
这个新时代的到来也为项目管理软件开辟了新的可能性:加上目前在机器学习方面取得的进步,新的聊天技术为项目管理人工智能的发展奠定了基础。
这一切都始于范式的转变。
在这场定义新标准的竞赛中,候选人之一是一款名为工作流的 Slack 应用。这是第一款完全基于 Slack 聊天基础设施的项目管理软件。传统的项目管理软件被设计成所有计划和沟通的中心,而工作流团队采取了不同的方法:他们将公司现有的沟通渠道视为工作协调的真正中心。流程和工具必须包含这些渠道,因此要嵌入其中。Workstreams 的产品经理 Christian Bick 指出了这种范式转变如此重要的原因:
为了做出准确的预测并给出有意义的见解,软件必须成为我们交流渠道的积极参与者。这样,it 可以了解团队成员和项目合作伙伴之间的信息流动。
AI 会首先改善我们的沟通,然后纠正我们的乐观主义倾向。
这是有道理的:没有人能够跟踪一个项目中交换的所有信息。然而,计算机是监控通信的大师,在未来,这正是他们要做的。机器还没有必要达到人类的理解水平;重要的是知道谁在什么时候分享信息,分享什么主题的信息。这些知识已经足以在合作者之间的沟通不畅发展成昂贵的问题之前识别出它。人工智能不仅会检测这类问题,还会提出解决问题的措施。
人工智能将负责对项目进度做出更准确的估计。对项目信息流进行建模可用于项目的特征描述和分类。为了做出精确的预测,人工智能需要从成千上万的参考项目中学习。这些项目中的沟通结构将在人工智能的训练中发挥主导作用。
房间里有一头大象!就在那里!
即使人工智能与我们的数字对话相结合,它仍然会错过我们作为人类的主要交流方式。如果不是大部分的话,很多重要的信息交流是在离线的面对面的会议中进行的。工作流团队提出了一个简单的策略来解决这个问题:
人工智能不需要亲自出席会议来了解已经交换的信息。它真正需要知道的是会议召开了,谁参加了会议。随着数字日历已经成为标准,这是微不足道的。
关于会议时间和参与者的信息已经在网上发布了。如果会议的议程和结果没有以数字方式发布,那么人工智能无论如何都会引起注意,因为它负责确保信息共享。无论如何,由于最近在录音和识别方面的创新,计算机已经开始被整合到物理会议中。
欢迎你的新团队成员——这不完全是约翰·克立斯
那么,当这一愿景成为现实时,经理们会担心自己的工作吗?尽管计算机在生成预测和见解方面将比人类更好,但有一样东西是人工智能在很长一段时间内都不会具备的:理解人类关系独特性的能力。评估人工智能的发现,并把这些建议放到一个更大的背景下,仍然是团队和经理的责任。工作流团队考虑的是劳动力的分配:
我们的目标是为今天的团队增加一名有价值的成员——一名在沟通和评估方面具有独特技能的成员。不过,不要指望你的新伴侣会过于有创造力和风趣。那是人类的工作。也是最重要的一个。
How things might soon look.
目前,所有这一切都只是一个愿景。工作流团队仍然忙于做好基础工作。今天看起来很奇特的任务管理应用程序可能很快会变成项目管理的一场革命。
Workstreams current Slack integration and web interface
柏林机场还有希望。
智能软件已经存在,并将越来越多地出现在日常生活中。自动驾驶汽车已经在我们家门口了。迟早,同样的技术会集成到我们的数字协作工具集中,并增强我们的工具集。这些进步绝对值得关注。尤其是当你计划去柏林旅行的时候。
新手问“人工神经网络要用多少个隐层/神经元?”
人工神经网络(ann)的初学者很可能会问一些问题。这些问题包括使用多少个隐藏层?每个隐藏层有多少个隐藏神经元?使用隐藏层/神经元的目的是什么?增加隐藏层/神经元的数量总是能得到更好的结果吗?我很高兴地告诉大家,我们可以回答这样的问题。明确地说,如果要解决的问题很复杂,回答它们可能会太复杂。到本文结束时,您至少可以了解这些问题是如何回答的,并能够根据简单的例子进行自我测试。
介绍
ANN 的灵感来自于生物神经网络。为简单起见,在计算机科学中,它被表示为一组层。这些层分为三类,即输入层、隐藏层和输出层。
知道输入和输出层的数量及其神经元的数量是最容易的部分。每个网络都有一个输入层和一个输出层。输入层中神经元的数量等于正在处理的数据中输入变量的数量。输出层中神经元的数量等于与每个输入相关联的输出的数量。但是挑战在于知道隐藏层及其神经元的数量。
以下是了解分类问题中隐藏层和每个隐藏层的神经元数量的一些准则:
- 根据这些数据,画出一个预期的决策边界来分隔这些类。
- 将决策边界表示为一组线。请注意,这些线的组合必须服从决策边界。
- 选定线的数量表示第一个隐藏层中隐藏神经元的数量。
- 为了连接由前一层创建的线,添加了一个新的隐藏层。请注意,每次需要在前一个隐藏层中的线条之间创建连接时,都会添加一个新的隐藏层。
- 每个新隐藏层中隐藏神经元的数量等于要建立的连接的数量。
为了让事情更清楚,让我们将前面的指导方针应用到一些例子中。
示例 1
让我们从一个简单的两类分类问题的例子开始,如图 1 所示。每个样本有两个输入和一个表示类标签的输出。这与异或问题非常相似。
Figure 1
要回答的第一个问题是是否需要隐藏层。确定是否需要隐藏层的规则如下:
在人工神经网络中,当且仅当数据必须非线性分离时,才需要隐藏层。
查看图 2,似乎这些类必须是非线性分离的。单行不行。因此,我们必须使用隐藏层,以获得最佳决策边界。在这种情况下,我们可能仍然不使用隐藏层,但这将影响分类精度。所以,最好使用隐藏层。
为了添加隐藏层,我们需要回答以下两个问题:
- 所需的隐藏层数是多少?
- 每个隐藏层中隐藏神经元的数量是多少?
按照前面的过程,第一步是绘制划分两个类的决策边界。如图 2 所示,有不止一个可能的决策边界可以正确分割数据。我们将用于进一步讨论的是图 2(a)。
Figure 2
按照指导方针,下一步是用一组线来表达决策边界。
使用一组线来表示决策边界的想法来自于这样一个事实,即任何人工神经网络都是使用单层感知器作为构建块来构建的。单层感知器是一个线性分类器,它使用根据以下等式创建的线来分离类别:
y = w1 * x1+w2 * x2+⋯+w1 * x1+b
其中 x_i 为输入, w_i 为其权重, b 为偏置, y 为输出。因为每增加一个隐藏神经元都会增加权值的数量,因此建议使用最少数量的隐藏神经元来完成任务。使用比所需更多的隐藏神经元将增加更多的复杂性。
回到我们的例子,说 ANN 是使用多个感知器网络构建的,等同于说网络是使用多条线构建的。
在这个例子中,判定边界由一组线代替。这些线从边界曲线改变方向的点开始。在这一点上,放置了两条线,每一条都在不同的方向上。
因为边界曲线只有一个点改变方向,如图 3 中灰色圆圈所示,所以只需要两条线。换句话说,有两个单层感知器网络。每个感知器产生一条线。
Figure 3
知道只需要两条线来表示决策边界告诉我们,第一个隐藏层将有两个隐藏神经元。
到目前为止,我们有一个带有两个隐藏神经元的隐藏层。每个隐藏神经元可以被视为线性分类器,如图 3 中的线所示。将有两个输出,一个来自每个分类器(即隐藏神经元)。但是我们要构建一个单一的分类器,用一个输出表示类标签,而不是两个分类器。结果,两个隐藏神经元的输出将被合并成单个输出。换句话说,这两条线将由另一个神经元连接。结果如图 4 所示。
幸运的是,我们不需要添加另一个具有单个神经元的隐藏层来完成这项工作。输出层神经元将完成这项任务。这种神经元将合并先前生成的两条线,使得网络只有一个输出。
Figure 4
知道了隐藏层及其神经元的数量后,网络架构就完成了,如图 5 所示。
Figure 5
示例 2
另一个分类示例如图 6 所示。它类似于前面的例子,其中有两个类,每个样本有两个输入和一个输出。区别在于决策边界。这个例子的边界比上一个更复杂。
Figure 6
根据指南,第一步是绘制图 7(a)所示的决策边界。
下一步是将决策边界分割成一组线,其中每条线将被建模为人工神经网络中的感知器。在画线之前,应如图 7(b)所示标出边界改变方向的点。
Figure 7
问题是需要多少行?每个顶点和底点将有两条线与之相关联,总共四条线。中间点的两条线将与其他点共享。要创建的行如图 8 所示。
因为第一隐藏层将具有与行数相等的隐藏层神经元,所以第一隐藏层将具有四个神经元。换句话说,有四个分类器,每个都由一个单层感知器创建。目前,网络将产生四个输出,每个分类器一个。下一步是将这些分类器连接在一起,以使网络只生成一个输出。换句话说,这些线将通过其他隐藏层连接在一起,以生成一条曲线。
Figure 8
由模型设计者来选择网络的布局。一种可行的网络架构是建立具有两个隐藏神经元的第二隐藏层。第一个隐藏神经元将连接前两条线,最后一个隐藏神经元将连接后两条线。第二个隐藏层的结果。第二层的结果如图 9 所示。
Figure 9
至此,有两条分离的曲线。因此,网络有两个输出。下一步是将这些曲线连接在一起,以便整个网络只有一个输出。在这种情况下,输出层神经元可以用于进行最终连接,而不是添加新的隐藏层。最终结果如图 10 所示。
Figure 10
网络设计完成后,完整的网络架构如图 11 所示。
Figure 11
欲了解更多信息,
深度学习+用人工神经网络解异或简介
slide share:https://www . slide share . net/AhmedGadFCIT/brief-introduction-to-deep-learning-solution-xor-using-ANNs
YouTube:https://www.youtube.com/watch?v=EjWDFt-2n9k
卷积神经网络初学者指南
到现在为止,你可能知道机器学习,这是计算机科学的一个分支,研究可以学习的算法的设计。深度学习是机器学习的一个子领域,它受到人工神经网络的启发,而人工神经网络又受到生物神经网络的启发。卷积神经网络非常类似于具有可学习权重和偏差的普通神经网络。在神经网络中,卷积神经网络主要应用于图像识别、图像分类、物体检测、人脸识别等。
卷积是什么意思?
卷积来自拉丁语 convolvere,“to convolve”的意思是卷在一起。卷积是对两个函数(f 和 g)进行数学运算,以构造第三个函数,该函数表示一个函数的形状如何被另一个函数修改。它是计算两个函数重叠程度的积分。假设卷积是通过将两个函数相乘来组合它们的一种方式。
"绿色曲线显示蓝色和红色曲线的卷积,作为 t 的函数,垂直绿线表示位置。灰色区域表示作为 t 的函数的如下所示的乘积,因此它作为 t 的函数的面积正好是卷积。”
如果用 CNN 的话,对输入图像进行的操作是特征检测器/内核/过滤器和特征映射。
我们的大脑是如何对一幅图像进行分类的!
每当我们看到一幅图像,我们的大脑就会寻找图像中的特征来对图像进行分类。我们通过识别特征来对事物进行分类。为了证明这一点,这里有两个图像,我们将分类:
A two-faced man!
在上面的图像中,如果我们看向图像的右侧,我们会看到一个人朝右侧看,而如果我们看向中间,我们会感觉到那个人正朝我们看。
我们的大脑在识别这些不同的场景时会不会很挣扎,会不会对这个人是向右看还是朝我们看感到困惑?
发生这种情况是因为我们的大脑研究图像中的特征,然后假设应该采取什么。
考虑另一个图像:
A young girl or an old lady?
上图描绘了一个小女孩看着别处,一个老太太头上戴着围巾向下看。迷茫?图像是为了迷惑你而创建的!
如果特征不清晰,像这样呢?
Dazzling face!
我们是不是有点眼花缭乱?你的大脑能够决定什么是正确的吗?
不!这是因为描述的特征不足以帮助大脑对它们进行分类。
所有上述图像都是为了理解我们的大脑根据它所看到的图像的特征来运作,然后对其进行相应的分类。
神经网络以类似的方式工作。我们可以在下图中看到,神经网络已经成功地将猎豹和子弹列车分类,但在预测手玻璃方面却不成功。这是因为图像中的特征不清楚。
简而言之,神经网络的工作方式与人类思维完全一样。
计算机是如何看到图像的?
How computer sees an image!
众所周知,图像是像素的矩阵。如果有一个黑白图像,那么我们将得到一个 2D 阵列。然而,如果我们传递一个彩色图像,那么我们将得到一个 3D 数组,这意味着它有一个额外的深度参数,即 RGB 通道,如下所示。像素值介于 0 和 255 之间,图像以字节(0 到 255)存储。
How images are converted in arrays!
总结:
我们已经讨论了什么是 CNN,以及如何根据图像中的特征对图像进行解释和分类。细胞神经网络在图像和视频识别、推荐系统和自然语言处理中有着广泛的应用。
在下一篇博客中,你会发现关于卷积运算和 ReLU 层的概念。在那之前,继续学习。
如果您有任何疑问或建议,可以在下面留言:)
参考资料:
- https://skymind.ai/wiki/convolutional-network#tensors
- http://mathworld.wolfram.com/Convolution.html
- https://medium . com/@ RaghavPrabhu/understanding-of-convolutionary-neural-network-CNN-deep-learning-99760835 f148
- https://medium . com/technology made easy/the-best-explain-of-convolutionary-neural-networks-on-the-internet-fbb 8 B1 ad 5d F8
数据科学入门指南— Python + Docker
每样都来一点
范围
[## 人工智能教育全球黑客周:7 月 28 日至 8 月 4 日
你的开源人工智能项目将获得 17,000 美元的奖金
medium.com](https://medium.com/opened-ai/ai-for-education-global-hackweek-7edc7db87d4f)
尽管我不知道 S#!关于机器学习,我注册了,希望学习,并希望建立一个有用的工具。嗯,老实说,注册的好处(AWS 积分、Bluemix 积分等)也很吸引人。
所以这是我的尝试,从新手开始,慢慢走向机器学习中令人满意的水平,并根据我的研究和我觉得对我这样的初学者有趣和有用的话题,发表更多的故事。
那么到底什么是机器学习呢?
让计算机在没有明确编程的情况下运行。
就是这样!现在你只需要知道这些。
数据科学
你知道 Amazon.com 是怎么提出建议的。它知道你需要一双新袜子,甚至在你真正需要它们之前。这一切都是通过数据来完成的——你的数据,我的数据,所有这些数据。它会根据搜索查询,或者过去的购买记录,或者躲在橱窗后面列出你所有的对话,来预测你下一件想买的东西。
简而言之,数据科学是一种分析、处理大块数据并将其转换为信息的科学,这样就可以用它来预测你想要购买的下一件东西。也适用于教育、医疗、时尚等领域。
在第一个示例中,我们将获取一个水果度量(如大小、重量、质地)的样本数据集,标记为苹果和橙子。然后,我们可以使用 scikit-learn 的决策树(一个满足所有机器学习需求的糟糕模块)预测给定的一组新水果指标的水果。
第一次提交
码头工人
一个可怕的工具,你应该昨天就学会了。
说真的,Docker 让开发环境的建立变得轻而易举。我倾向于在装有不同操作系统的不同机器上工作,安装了 Docker 就没有必要担心依赖性。
步骤:
- 安装对接器。
- 创建 Dockerfile(在名为“MyCatKnowEverything”的新文件夹中名为“Dockerfile”的文件)— Dockerfile 是一个文本文件,包含自动构建给定图像所需的所有命令。在这里是 python。
# Use an official Python runtime as a parent image
FROM python:3.6-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install -r requirements.txt
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
3.Create requirements.txt —包含 python 模块,与 Docker 无关。在 Dockerfile 内部调用。
numpy
scipy
scikit-learn
Python
在文件夹 MyCatKnowEverything 中创建一个名为“app.py”的文件
from sklearn import tree#DataSet
#[size,weight,texture]
X = [[181, 80, 44], [177, 70, 43], [160, 60, 38], [154, 54, 37],[166, 65, 40],
[190, 90, 47], [175, 64, 39],
[177, 70, 40], [159, 55, 37], [171, 75, 42], [181, 85, 43]]
Y = ['apple', 'apple', 'orange', 'orange', 'apple', 'apple', 'orange', 'orange',
'orange', 'apple', 'apple']
#classifier - DecisionTreeClassifier
clf_tree = tree.DecisionTreeClassifier();
clf_tree = clf_tree.fit(X,Y);
#test_data
test_data = [[190,70,42],[172,64,39],[182,80,42]];
#prediction
prediction_tree = clf_tree.predict(test_data);
print("Prediction of DecisionTreeClassifier:",prediction_tree);
我不打算浏览代码,因为它是 Python 而不是 Java。
Directory Structure
5.运行docker build-t。| example- docker build -t 这很简单。(不要忘记“.”)
6.运行 docker 运行< tag_name > | 示例——docker 运行 this_is_easy
Output — see them apples there
不要被庞大的 docker run 命令吓到。“rm”在完成执行后删除容器,“name”只是给容器命名,“v”是用容器挂载一个卷。更多关于这个这里。
这里有几个 docker 命令,可以让你动起来
https://docs.docker.com/get-started/part2/#recap-and-cheat-sheet-optional
我们完了。我们刚刚使用 Docker 创建了我们的第一个 Python 数据科学程序。
源代码:
[## a shish-y/Docker _ Python _ data science
用 docker + python + SciKit-learn 进行一些数据科学测试
github.com](https://github.com/ashish-y/Docker_Python_DataScience/blob/master/README.md)
觉得这篇文章有帮助?别忘了推荐分享:)
从自动驾驶汽车开始我的旅程
在开始我的 SDC 纳米学位之旅之前,给你一点我自己的背景,我是 SDC 纳米学位的学生(2016 年 12 月队列)。我在机器学习、深度学习和 web 应用程序开发方面有大约 5 年以上的经验。我总是对技术充满热情,对其积极的进步充满好奇。随着交通行业经历一场革命(从化石燃料转向电动和自动驾驶),人工智能正在发挥重要作用,我真的很有兴趣成为这场革命的一部分。而我的旅程是从 Udacity 的自动驾驶汽车纳米学位课程开始的。
那么,我为什么选择这门课呢?正如我之前提到的,我已经在从事机器学习和深度学习,但是我没有对端到端系统(即硬件、软件和环境)有一个整体的想法。然后我就把这个课程的内容过了一遍,真的是在履行我的要求。
让我们从我的项目经历开始吧。
项目-1 车道检测
Lane detection using opencv
经历:
这是 SDC 纳米学位的第一个项目。在这里,我们将让汽车学习在道路上向何处行驶。我们必须找到道路上的车道线,使汽车安全行驶。这个项目是用 python 和 opencv 实现的。
在车道线检测期间,我在这个项目中面临的挑战如下:
- 不同道路的车道线颜色不同
- 线路并不总是完全连接的
- 线条的曲率在不同的条件下也不同
- 在许多情况下,道路的照明条件也会发生变化
外卖:
- 使用 opencv 学习并实现了不同的计算机视觉技术
- 对图像应用不同的颜色变换
- 应用 canny 边缘检测算法寻找边缘
- 利用霍夫变换从 Canny 边缘检测直线
项目-2 使用深度学习的交通标志分类
Deep Convolutional Neural Network Architecture for Traffic sign Classification
体验:
这个是第一学期的第一个深度学习项目。因为我已经进入了深度学习,所以对深入研究这个项目感到非常兴奋。我的网络由两个卷积层和两个全连接层组成。深度神经网络需要大量的训练数据和大量的参数调整。因此,训练一个深度神经网络更像是艺术而不是科学/工程。经过几次实验,我终于冻结了我的网络。
我对这个项目的观察和收获如下:
- 首先,我尝试了一个深度神经网络(没有卷积),它在一定程度上起作用,但不是实时场景。
- 当汽车在非常复杂的环境中行驶在道路上时,所有的交通标志都不是清晰可见的。有时它们被遮挡或者能见度不清等等…
- 在这种情况下,为了处理遮挡、平移变化和部分可见性,简单的深度神经网络不够健壮。
- 卷积层来了。卷积层相对于其他层的优势是参数共享。当滤波器在图像上卷积时,它试图捕捉图像的所有可能的特征。这有助于通过每层中不同的过滤器组来学习图像的所有不同特征。这带来了特征学习和分类的鲁棒性。
- 学习速率和正则化对学习也有重要作用。学习速率的衰减和对正确层的权重的调整提高了模型的性能。同样,这是一门艺术,在可视化每一层的输出后,微调你的学习率和正规化。
项目-3 使用深度学习的行为克隆
经历:
这是深度学习的第二个也是最后一个项目,目标是在赛道上安全驾驶汽车(预测转向角)。我真的很享受在这个项目中度过的时光。从很多方面来说,这都是一次很棒的理论和实践学习经历。分享详情如下:
- 数据收集是任何深度学习任务中最重要的任务之一。使用模拟器收集数据很有趣。然而,这是一项耗时的任务,因为深度神经网络是贪吃的。Udacity 通过发布这个项目的 dataset 成为了救世主。
- 学习 keras 让我的生活变得轻松,因为它去掉了锅炉板代码。Keras 是在 Theano 和 Tensoflow 之上的高级深度学习框架。在 keras 中开发一个深度神经网络真的很容易,因为它简单而抽象。
- 数据扩充在为模型带来变化以及模型性能的稳健性方面具有重要作用。我学到了许多不同的数据增强技术及其在训练模型中的重要性。很少经常使用的是剪切,裁剪,翻转和改变亮度。
- 迁移学习确实推动了人工智能的快速发展。我更愿意强调迁移学习是培训的第一阶段,在实际培训开始之前,我们将已经学到的特性引入到我们的模型中。
- 我的网络灵感来自英伟达论文http://images . NVIDIA . com/content/tegra/automotive/images/2016/solutions/pdf/end-to-end-dl-using-px . pdf
- 选择正确的激活函数对于训练神经网络至关重要。在这里,我选择了 ELU,而不是雷鲁。ELU 激活提供了与 RELU 相同的对消失梯度的保护,此外,ELU 具有负值,这允许它们将平均激活推向更接近零,从而提高梯度下降的效率。
- 辍学。不要小看这个。我在这里的直觉是,辍学可能并不适合回归问题中的每一层。在分类问题中,我们只关心相对于另一个类的软最大概率,所以即使丢失影响了最终值,也没有关系,因为我们只关心相对于其他类的值。对于回归,我们关心最终值,所以退出可能会有负面影响。为了避免这种困境,我在全连接层中选择了 l2 正则化。
我的行为克隆体验真的很令人满意。
项目-4 超前车道检测
Lane detection using opencv
经历:
这是第一学期的第四个项目。这里我们使用 opencv 来寻找车道。在这个项目中,有机会学习许多使用 opencv 的计算机视觉技术。
- 失真校正对于在图像中找到正确形状和外观的对象具有重要作用。
- 正在实施摄像机标定和畸变校正,以使物体的几何形状一致。
- 透视变换为我们提供了一种自上而下查看所有曲率的方法。
- 其他技术,如梯度大小和梯度方向的梯度阈值也是这个项目的一个收获。
- 不同的颜色空间和颜色阈值具有梯度,具有在图像中找到对象的作用。
- 滑动窗口搜索来找到图像中的对象是我的另一个收获。
然而,我对这个项目的体验并不那么令人满意。我未来的工作范围将涉及使用深度学习来实现相同的项目。
项目-5 车辆检测与跟踪
vehicle detection using svm and opencv
体验:
这是第一学期的最后一个项目。这个项目的目标是使用 HOG 和支持向量机结合滑动窗口搜索来检测车辆。虽然我已经用上面的方法实现了这一点,但我对实现的健壮性并不满意。
我肯定会选择车辆检测的深度学习方法。许多先进的架构,如 fast-rcnn、YOLO、SSD,在各个方面都优于其他传统的对象检测方法。
致谢:
我要感谢 udacity 的所有相关人员。我还要感谢 Shreyas Gite (导师) Vivek Yadav , Dhruv Parthasarathy , Oliver Cameron , David Silver 以及其他许多人的真知灼见,帮助我完成了 SDC 大学第一学期的课程。
保持饥饿,保持愚蠢…
史蒂夫·乔布斯
对于代码库和其他查询,请通过下面的链接联系我。
ashispapu 有 288 个存储库。在 GitHub 上关注他们的代码。
github.com](https://github.com/ashispapu/) [## Ashis Samal | LinkedIn
用人工智能构建下一代产品
www.linkedin.com](https://www.linkedin.com/in/ashissamal/) [## Ashis Samal (@ashis_samal) |推特
Ashis Samal 的最新推文(@ashis_samal)。想象,通过…为社会的积极变化而努力
twitter.com](https://twitter.com/ashis_samal)
为第二学期做好准备:)