Domino 博客中文翻译(三)
原文:Domino Blog
协议:CC BY-NC-SA 4.0
生态学中的 r
原文:https://www.dominodatalab.com/blog/r-in-ecology
我是个有点 R 的书呆子。好吧,那是骗人的;我是个大书呆子。但是有很好的理由,因为 R 在简化科学过程中非常有用,并且增加了以更少的人为错误复制发现的能力。
我经常和我的研究生同学谈论学习 R 的主要原因是因为研究生必须重做的事情几乎是常数;这甚至发生在作为一个整体的科学中。如果你花了整整一周的时间使用 GUI 来运行你的所有模型,然后你把它们呈现给你的顾问,而她/他告诉你你需要改变“仅仅一件事”,这将花费你另外一周的时间来完成。这是令人沮丧的,至少可以说,尤其是当它发生不止一次。
然而,当您编写了该过程的脚本后,返回并进行小的更改通常会更快、更容易,而不必手动重做大部分工作,或者记住该过程的每一步。无论是总结数据、运行模型还是制作图表,都是如此。学习曲线是陡峭的,但特别是如果你打算在获得学位后继续进行研究,这是非常值得的。当您正在处理多个项目,并且您可能三个月没有接触数据,然后需要立即返回时,它也是有帮助的。如果你已经很好地描述了你的脚本(你有一个包含代码和正在发生的事情的大量细节的文件),你可以更容易地恢复项目,记住你从哪里停止,为什么你从站点 23 丢弃所有的数据,以及你运行的是什么类型的模型。现在,我正忙于五个论文章节和三个兼职项目。我的待办事项清单和 R 脚本是唯一让我不至于负债的东西。
此外,当您需要向分析中添加更多数据时,这也很有帮助,因为已经收集了更多数据,或者因为您之前只分析了数据的一个子集。诺姆·罗斯有一些很好的幻灯片,描述了为什么可复制的研究是一个有价值的目标。这些幻灯片讨论了一些其他工具,但这些概念非常适用于 R。R 可以帮助您使您的分析尽可能透明,并消除不断重新运行它的需要,并重新生成包含讨厌的“又一次修复”的图形
数据清理
我不在 r 中输入我的数据。有些人输入了,但我觉得这很乏味,我也让我的技术人员输入我一半的数据,因为使用电子表格更容易。然而,一旦它被输入和校对,我就把它导出到。csv,其他都用 r 写,我记性太差了。我从来不记得我对我的数据做了什么,所以我把它写成脚本,这样我就可以回头看,弄清楚所有的事情,如果/当我需要的时候再做一次。我从不更改原始数据文件(从我的现场数据表输入的原始文件)。该数据的任何更改都在 R 中完成,然后写入不同的. csv。
该过程的第一部分是数据清理。尽管我在 Twitter 上谈论了很多,但我经常花大量时间清理我自己的数据。这包括检查不可能的数值,通常还有拼写错误。因为我每年秋天收集三个月的数据,这也让我可以一路探索数据,看看发生了什么。
清理数据听起来可能很繁琐,也确实如此,但这非常重要。否则,当你试图运行一个分析或总结你的数据,并获得“密苏里”,“密苏里”和“密苏里”水深的总结,这是不太有用的。
以下是我所处理的不同数据集的所有唯一位置值的示例。如你所见,有许多不一致的地方:比如,毕格罗沼泽和毕格罗沼泽。
此外,如果您有一个随时间增长的数据集,您可以使用这种方法将所有这些不同时期的数据文件合并到一个脚本中,这样您就不必粘贴、复制和担心破坏任何东西。如果您从不同的人那里接收数据,这也非常有帮助,因此您可以确保所有数据都是相同的格式。
该方法还保留了原始文件,以防您以后需要返回并找出任何奇怪值的来源。在我的野外工作中,每天早上我从我们的 GPS 管理软件中导出测量数据,并使用“combining_night_files.R”清理/检查/缝合它们。
file_names <- list.files (path=”./R_in_ecology/night_files/“,pattern=“.csv”)
# creates a list of the files so that we can read all of them in, and not have to copy and paste all the file names, or worry about updating that list manually as the files grow in number. These data are highly subsetted files from my dissertation, and I realize that latitude typically is accompanied by longitude, but this is all I’m using for this example.
library(tidyr)
library(dplyr) # gives us the gift of pipes “%>%”
library(auriel) # my personal R package, used here for the ordinal_date_con() function
nights <- list() # creates the list into which all of our files are going to be stored
for(i in 1:length(file_names)){
# first I have to pull the data I need out of the file name, as I store a bunch of information there.
dat <- as.data.frame(file_names[i])
colnames(dat) <- “name”
names <- dat %>% separate(name, into=c(“year”,”month”,”day”,”obs”,”round”,”region”,”area”,”impound”,”treat”,”night”),sep=“_”)
names <- names %>% separate(night, into=c(“night”,”file”), sep=-5)
# now we read in the .csv and stitch together all of the data from above with this data frame, as well as splitting things apart into multiple columns
int <- read.csv(paste0(“./R_in_ecology/night_files/“,file_names[i]))
lesscol <- int[,c(“lat”,“name”)]
lesscol$name <- as.character(lesscol$name)
lesscol$name <- ifelse(nchar(lesscol$name)==7,paste0(lesscol$name, “N”),lesscol$name)
lesscol <- lesscol %>% separate(name, into=c(“name”,“distance”),sep=5) %>% separate(distance, into=c(“species”,“distance”), sep=1) %>% separate(distance, into=c
(“distance”,“flush_walk”), sep=-2)
lesscol$distance <- as.numeric(lesscol$distance)
lesscol$species <- tolower(lesscol$species)
lesscol$year <- as.numeric(names$year)
lesscol$month <- as.numeric(names$month)
lesscol$day <- as.numeric(names$day)
lesscol$obs <- names$obs
lesscol$round <- names$round
lesscol$region <- names$region
lesscol$area <- names$area
lesscol$impound <- names$impound
lesscol$treat <- names$treat
lesscol$night <- names$night
lesscol$odat <- ordinal_date_con(lesscol[,c(“month”,“day”,“year”)])
nights[[i]] <- lesscol # throws it back into the list in the same place it came from; some will hate this.
}
masterdat <- do.call(rbind, nights) #: this binds together all of the items in the nights[[]] list. This script is great because it can grow with each file.
# now we can write this out, or do whatever needs to be done with it.
我也有一个我们的调查和植被数据的脚本。同样的过程,循环,逐个检查每个文件,检查一遍,然后把它们缝合在一起。为了简单起见,github 上的示例数据文件只有一个文件。
我使用 match (%in%)等神奇的东西来确保我的植物拼写正确,我的网站没有错别字,这样以后当我开始分析我的数据时,我就不必花很多时间来校对了。
int <- read.csv(“./R_in_ecology/example_survey_data.csv”)
regions <- c(“nw”,“nc”,“ne”,“se”)
fs <- c(“fed”,“stat”)
print(paste0(int[(int$region %in% regions==FALSE),]$region,“ ”, “region”))
print(paste0(int[(int$fs %in% fs==FALSE),]$area,“ ”,“area”))
is.numeric(dat$sora)
is.numeric(dat$jdate)
当这个文件只是返回一堆“区域”和“面积”而不是“SDF 区域”或任何其他不正确的值时,我们就可以开始了。当我对整个赛季收集的 100 多个文件执行此操作时,我将使用“for”循环来单独检查每个文件。
dplyr 和 tidyr 包是实现这一切的关键。
报告
我几乎每天都使用 R 的一个主要方式是通过 RMarkdown 文件,它允许我在编写报告和重新生成一系列图表时消除一些麻烦。我可以用 R 写出来,然后把它们编织在一起,这样看起来就很清楚了。html 或者。pdf 文件。
这对于为合作者创建定期报告,或者每天生成一堆图表而不必做一堆工作(聪明地工作,而不是努力地工作)来说是超级棒的!).
它消除了所有的复制和粘贴过程,可以轻松地制作出漂亮的报告。我爱 RMarkdown 这简直是最好的。现在,如果我能让我所有的合作者也在上面写就好了。相反,我送他们。pdf,他们给我评论,这也可以。这个是开始 RMarkdown 的好地方。
最棒的是你可以写这样的东西:
# Fun with Graphs
You can create graphs in RMarkdown and print them with or without the code shown. The echo, message, and warning arguments are set to false in the first graph to hide the code and any other outputs.
{r, echo=F, message=F, warning=F}
dat <- read.csv(‘./example_survey_data.csv’)
gdat <- dat[,c(“jdate”,“sora”)] %>%
group_by(jdate) %>% summarise_each(funs(median))
ggplot(data=gdat) +geom_bar(aes(x=jdate, y=sora), stat=“identity”)+theme_krementz()+scale_x_ordinaldate(year=2015)+xlab(“date”)+ylab(“sora per hectare”)
编织它,得到这个。
很酷,是吧?不必导出图表、将它们复制并粘贴到 Word 中,以及处理格式等,这是一个巨大的救命稻草,可以更容易地使用相同的图表/表格和其他数据分析定期创建报告。我将它用于我的常规实地调查报告、包含 50 多张地图和 25 幅图的年度报告,以及我每天/每周/每月使用的许多其他小型产品。
You 还可以在 markdown 文档中包含 latex 代码,以帮助对其进行更多的定制。我这样做是为了我的简历。
绘制图形
我喜欢 ggplot2。我从制作大量漂亮的图表中获得了极大的快乐。当我对论文的其余部分感到沮丧时,我就会调整图表。
ggplot 是制作可用于演示或制作有趣图形的出版物质量图表的好方法,它们是通过我前面提到的 RMarkdown 报告生成的,我使用这些报告来关注我的数据并为合作者创建更新。
我喜欢 ggplot 的一点是,我构建了一个以我的顾问命名的自定义主题,制作他喜欢的图形,这为我节省了大量时间,这是一件有价值的事情,并有助于让我的顾问高兴,这是一件更有价值的事情。因此,我不必每次都写出/复制并粘贴这些内容来制作我想要的图形:
ggplot(data=masterdat)+
geom_histogram(aes(x=odat))+
scale_x_ordinaldate(2015)+
theme(axis.text.x = element_text(size=12,color=“black”),
axis.text.y = element_text(size=12,color=“black”),
axis.title.y=element_text(size=20),
plot.background = element_blank(),
panel.border=element_blank(),
panel.grid.major= element_line(colour=NA),
panel.grid.minor=element_line(colour=NA),
title=element_text(size=20),
panel.background = element_rect(fill =“white”),
axis.line=element_line(colour=“black”),
strip.background=element_rect(fill=“white”, color=“black”),
strip.text=element_text(size=15))
我可以这样写:
ggplot(data=masterdat) +
geom_histogram(aes(x=odat)) +
scale_x_ordinaldate(2015) +
theme_krementz()
这更短,更干净,并且不需要我记住很多,这是我在每个 R 脚本中的目标,以拯救我可怜的记忆。
定制 R 包
有自己的 R 包真的很有用;这是一个保存东西的好地方,比如为 ggplot 保存自定义主题,以及为 ggplot 的其他部分保存有用的 mod,比如这个。
我用序数日期(一年中的某一天)来保存我所有的日期,所以我为 ggplot 构建了这个自定义的缩放器,使它可以轻松地创建具有真实日期(8 月 1 日)的图形,而不是序数日期。
scale_x_ordinaldate <- function(year){
scale_x_continuous(label=function(x) strftime(chron(x, origin=c(month=1, day=1,year=year)), “%B %d”))
}
因此,我只需将scale_x_ordinaldate(2015)
添加到我的 ggplot 图中,它就会将我图中的序数日期(一年中的某一天)更改为更易读的日期(8 月 1 日)。
希拉里·帕克写了一篇关于创建你自己的 R 包的精彩介绍。这非常适合保存和使用您编写的函数,以及保存您需要经常查看的数据集。我在很多很多项目中使用相同的数据集,如果我只在一台计算机上工作,这没什么大不了的。我可以使用文件路径将所有东西组织起来并保存在某个文件夹中。然而,相反,平均一周,我在两台,如果不是三台,不同的计算机上工作,所以如果它们不浪费我大量时间的话,这些文件路径只会引起挫败感。
有几种方法可以绕过这个问题,但是 Oliver Keyes 和 Jeff Hollister 向我建议的方法之一是将这些数据文件保存到一个 R 包中。然后你只需将软件包加载到你的计算机上,然后砰,数据文件。这些数据文件可以很容易地更新,通过使用 github,您可以很容易地在计算机之间移动包。您不必担心任何数据隐私问题,因为您可以拥有私人包。然而,在 github 上,如果你没有教育折扣,你将不得不为此付费(bitbucket 是解决这个问题的一种方法)。
将数据保存在 R 包中也有助于鼓励您(虽然它不强迫您)记录您的数据,这通常是当您将您的数据交给其他人时的一个大问题——缺少文档(所有这些列标题到底是什么意思?).
这也是编写和排除函数故障的很好的练习,并且维护一个包,这样有一天你就可以处理你将与其他人共享的包。也许你永远也不会这样做,但是知道软件包是如何工作的,以及如何对它们进行故障排除,可以在将来为你省去一大堆麻烦。
你可以在这里查看我个人 R 包常用的一些功能。我也有一个私人数据包,但遗憾的是,我不能公开分享。
建模
我做的大多数建模,以及我一天中的大多数头痛都是因为“未标记”包,它允许我使用距离采样数据来检查关于栖息地内鸟类密度的问题,并研究它们的迁徙。
在 R 语言中建模的方法非常多,种类也非常多。我最熟悉的是无标记支持的层次模型。这些模型允许同时估计动物的丰度、占用(或可用性)和检测概率,这是非常强大的,并允许我使用各种协变量来解释模型的每个级别。
R 怎么入门
我非常喜欢使用 R 的一个原因是它可以非常灵活地使数据的重新排列变得简单,这样当我的合作者带着另一种思考数据的新方法回来时,我可以快速地重新排列事物并继续运行模型。这有助于消除进行科学研究的大量记忆,这是一件好事,而且它还允许你回去找出哪里出了问题(因为它们会出问题)。
r 确实有一个学习曲线,尤其是如果你以前从未编程过,但是它可以非常有趣和有益,一旦你超过了学习曲线,它就非常强大。
我是软件木工和数据木工的讲师,他们的课程可以在他们的网站上找到,非常棒。我经常指导人们从软件木工开始,以便在进入数据木工之前掌握 R 语言,但是这真的取决于你在哪里以及你的目标是什么。
像 tidyr 和 dplyr 这样的软件包非常适合在一组一致的函数中清理、组织和操作你的数据。这两篇文章都是由活跃于 R 社区的 Hadley Wickham 撰写的,我推荐人们通过 Twitter 参与其中。
Twitter 上的标签是一个提问的好地方,我经常在 20 分钟内收到多个有用的回复。此外,这是一个逃离困扰其他 R 帮助来源的危险的好地方。
r 云中的笔记本电脑
原文:https://www.dominodatalab.com/blog/r-notebooks
我们最近为 Domino 添加了一个特性,让您只需点击一下鼠标,就可以在您选择的任何一类硬件上启动交互式 R 会话,从而在 R 中实现更强大的交互式探索性工作,而无需任何基础设施或设置麻烦。这篇文章描述了我们如何以及为什么构建我们的“ R Notebook ”特性。
R 笔记本如何工作
我们想要一个解决方案:(1)让我们的用户与 R 交互工作;(2)在强大的机器上;以及(3) 在云上运行 R而不需要任何设置或基础设施管理。出于我下面描述的原因,我们修改了 IPython Notebook 来满足这个需求。结果就是我们所说的 R 笔记本:一个交互式的 IPython 笔记本环境,使用 R 代码。它甚至处理绘图和视觉输出!
那么它是如何工作的呢?
第 1 步:一键启动笔记本会话:
与 Domino 中的任何其他运行一样,这将启动一台新机器(在您选择的硬件上),并自动加载您的项目文件。
第二步:使用笔记本!
任何 R 命令都可以工作,包括加载包的命令和system
函数。既然 Domino 允许您在功能强大得离谱的机器上运行这些笔记本(例如,32 个内核,240GB 内存),那么让我们展示一下:
动机
我们对 Domino 的愿景是成为一个平台,加速整个分析生命周期的工作,从早期探索,一直到分析模型的打包和部署。我们认为我们正在朝着这个目标前进,这篇文章是关于我们最近添加的一个特性,它填补了我们对生命周期早期阶段支持的一个空白:r 中的交互式工作。
分析生命周期
分析思想经历了不同的阶段:
-
探索/构思。在一个想法的早期阶段,能够交互地“玩数据”是至关重要的。你正在尝试不同的技术,快速解决问题,找出可行的方法。
-
细化。最终你有了一个你想要投资的方法,你必须提炼或者“硬化”一个模型。通常这需要更多的实验:例如,用几个不同的参数在你的整个数据集上运行一个模型,看看什么效果最好。
-
包装和部署。一旦你有了可以工作的东西,通常它会被部署用于一些正在进行的使用:要么打包成一个 UI 供人们交互,要么部署一些 API(或 web 服务)以便软件系统可以使用它。
Domino 为所有三个阶段提供了多种不同语言的解决方案,但是我们有一个缺口。对于交互式探索性工作,我们支持在 Python 中使用 IPython 笔记本,但是对于在 r 中使用,我们没有一个好的解决方案。
分析生命周期的阶段 |
|
--- |
要求 |
我们的解决方案 |
为 R |
差距** |
我们的 Python 解决方案 |
ipython 笔记本 |
实施细节
因为我们已经支持在任意 EC2 机器上的 docker 容器中运行 IPython 笔记本服务器,所以我们选择使用 IPython 笔记本作为我们的 R 解决方案。
关于 IPython Notebook 的一个鲜为人知的事实(可能是因为它的名字)是,它实际上可以运行各种其他语言的代码。特别是,它的 RMagic 功能允许你在 IPython 笔记本单元格内运行 R 命令,方法是在命令前加上%R
修饰符。我们改编了这个【黑客】(谢谢, fperez !)将 RMagic 修改自动添加到每个单元格表达式中。
这种方法是用一个启动脚本创建一个新的 ipython 概要文件,该脚本会自动在您计算的任何表达式前面加上%R
魔法前缀。结果是一个交互式 R 笔记本。
具体步骤如下:
- pip 安装 rpy2
- ipython 配置文件创建 rkernel
- 将 rkernel.py 复制到~/中。ipython/profile _ rker nel/startup
其中rkernely.py
是 fperez 脚本的稍微修改版本。我们只需将第 15 行的rmagic
扩展改为rpy2.ipython
扩展,以兼容 IPython Notebook 2。
15 行代码的“原生”IPython R 内核。
这不是一个真正的原生 R 内核,只是一个快速而肮脏的黑客行为,只需要几行代码就可以实现基本的运行。
将它放入您的启动目录,作为一个名为“rkernel”或类似名称的配置文件,启动时,内核将通过简单地在每个单元格前添加%%R
来模仿 R one。
from IPython.core.interactiveshell import InteractiveShell
print('*** Initializing R Kernel ***')
ip = get_ipython()
ip.run_line_magic('load_ext', 'rpy2.ipython')
ip.run_line_magic('config', 'Application.verbose_crash=True')
old_run_cell = InteractiveShell.run_cell
def run_cell(self, raw_cell, **kw):
return old_run_cell(self, '%%Rn' + raw_cell, **kw)
InteractiveShell.run_cell = run_cell
RStudio 服务器怎么样?
一些使用过这个的人问我们为什么不集成 RStudio 服务器,这样你就可以在浏览器中启动 RStudio 会话。诚实的回答是,使用 IPython Notebook 要容易得多,因为我们已经支持它了。不过,我们正在探索与 RStudio 服务器的集成。如果您要使用它,请让我们知道。
同时,试用 R 笔记本功能!
Python 与 R 在数据科学中的对比
原文:https://www.dominodatalab.com/blog/r-vs-python-data-science
r 和 Python 都是数据科学家流行的开源编程语言。对于执行数据科学任务,每种方法都有其优势。那么,你应该用哪一个呢?在这个视频中,Eduardo ario de la Rubia 为每一种语言都提供了一个案例,证明它们是数据科学家的“最佳”语言。
https://fast.wistia.net/embed/iframe/hw5q21q3sg
Ray 的共同创造者 Robert Nishihara:分布式计算如何轻松改变数据科学的一切
原文:https://www.dominodatalab.com/blog/ray-co-creator-robert-nishihara-how-easy-distributed-computing-changes-everything-in-data-science
如果你想在数据科学领域做一些真正雄心勃勃的事情,比如设计一个创新的新搜索引擎,会怎么样?今天,这将是一项艰巨的任务,你可能需要一个由数据科学家和程序员组成的大型高素质团队来实现你的创新。你需要几个月,甚至几年才能完成。
这种情况将会改变,罗伯特·西原最近告诉多米诺数据实验室 ,当快速改进的分布式计算接口和技术使得从你的笔记本电脑上获得你需要的所有资源变得容易。
今天难以想象的庞大 Python 数据科学项目会变得司空见惯吗?
“今天,创造一个新的搜索引擎将是一个巨大的项目。他说:“有大量的数据处理,你必须进行网络爬行来获取页面,你必须进行数据处理来提取关键词并建立搜索索引,你需要训练 ML 模型来对页面进行排名,就像你需要提供服务来处理查询一样。”
“这些组件中的每一个都需要可扩展,这是一个巨大的基础设施提升,”他解释道。“我们使用 Ray 的目标之一是让开发人员能够在一天之内构建这样的可扩展应用程序,而无需任何分布式系统知识。我们将使开发人员能够只对他们的应用程序逻辑进行推理。”
西原设想,有一天他的公司 Anyscale 将使开发跨越数百个节点或 GPU 的 Python 应用程序变得容易,从而引发一波新的创新,这在以前是不可行或不可能的。
多米诺最近采访了西原关于数据科学及其顶级创新者的电子书,数据科学创新者的剧本。下载电子书阅读完整的采访。
其他知名创新者也对数据科学的优势发表了看法
下载免费的 数据科学创新者手册 阅读西原以及其他许多顶级创新者关于主题、战略和创新的更多见解,这些见解使数据科学成为商业及其他领域的变革力量..独家内容包括对这些高层领导的采访:
- 卡西·科济尔科夫——谷歌首席决策科学家
- Andy Nicholls——GSK PLC 统计数据科学部高级总监
- Mona g . Flores——NVIDIA 医疗人工智能全球主管
- najat Khan——强生公司让桑制药公司首席数据科学官兼研发战略与运营全球总监
- Robert Nishi hara——Ray 的联合创始人,Anyscale 的联合创始人兼首席执行官
- 约翰·汤普森—分析思想领袖、畅销书作家、数据创新者&分析
- 格伦·霍夫曼—纽约人寿保险公司首席分析官
Ray for Data Science:大规模分布式 Python 任务
原文:https://www.dominodatalab.com/blog/ray-for-data-science-distributed-python-tasks-at-scale
编者按: 本文原载于帕特森咨询博客经许可已转载。
我们为什么需要雷?
训练机器学习模型,尤其是神经网络,是计算密集型的。但是,大部分负载可以划分为较小的任务,并分布在大型集群上。几年前,加州大学伯克利分校的人工智能研究人员需要一种简单的方法来为他们正在研究和开发的算法做这件事。他们是专业的 Python 程序员,但是他们不想花费大量的时间和精力使用大多数可用的工具包。他们不需要太多复杂或精细的控制。他们只需要尽可能简单的 API,在幕后做出良好的默认选择,以在集群上扩展工作,利用可用资源,重新启动失败的任务,并管理计算结果以方便使用。
出于这种需求,出现了 Ray,这是一个开源系统,用于将 Python(现在是 Java)应用程序从单机扩展到大型集群。Ray 吸引我的地方在于它的 API 简单、简洁,使用起来很直观,尤其是对于没有分布式计算经验的人来说,但是它对于很多问题都非常灵活。
您当然可以找到具有更大扩展性和灵活性的更复杂的工具包,但是它们总是需要更多的努力来学习和使用。对于许多项目来说,这可能是正确的选择,但是当您需要一个易于使用的框架,并且您不需要对它的工作方式进行绝对控制时,例如为了实现最大可能的性能和效率,那么 Ray 是理想的。
光线任务
让我们看一个简单的例子,它说明了使用 Ray 在集群上进行“低级”分布是多么容易。然后,我将简要介绍几个利用 Ray 的机器学习高级工具包。Ray API 文档和 Ray 网站提供了比我在这里所能涵盖的更多的信息。
假设我们想要实现一个简单的 DNS 服务器。我们可以如下开始。如果您在家独自玩游戏,请将这段代码复制并粘贴到 Python 解释器中:
import time # We'll use sleep to simulate long operations.
addresses = { # Some absolutely correct addresses.
"google.com": "4.3.2.1",
"microsoft.com": "4.3.2.2",
"amazon.com": "4.3.2.3",
}
def lookup(name): # A function to return an address for a name.
time.sleep(0.5) # It takes a long time to run!
return name, addresses[name] # Also return the name with the address.
start = time.time() # How long will this take?
for name in addresses: # Use the keys in addresses...
n, address = lookup(name) # ... but go through lookup for the values.
delta = time.time() - start
print(f"{name}:\t {address} ({delta:.3f} seconds)")
# The results:
# google.com: 4.3.2.1 (0.504 seconds)
# microsoft.com: 4.3.2.2 (1.008 seconds)
# amazon.com: 4.3.2.3 (1.511 seconds)
末尾的注释显示,每个查询大约需要 0.5 秒。让我们用 Ray 来减少这个开销。
首先,您需要使用pip install ray
安装 Ray。这就是我们在这个练习中需要做的全部工作,我们将只在一个进程中运行 Ray,但是它将根据我们的需要在我们的 CPU 内核中利用尽可能多的线程。如果你想在一个集群中运行 Ray,你可以按照文档中描述的步骤进行设置。
在 pip 安装 Ray 后重启 Python 解释器。现在我们可以创建一个 Ray 任务来并行运行这些查询。
import time
import ray. # Import the Ray library
ray.init() # Initialize Ray in this application
addresses = {
"google.com": "4.3.2.1",
"microsoft.com": "4.3.2.2",
"amazon.com": "4.3.2.3",
}
@ray.remote # Decorator turns functions into Ray Tasks.
def ray_lookup(name): # Otherwise, it's identical to lookup().
time.sleep(0.5)
return name, addresses[name]
start = time.time()
for name in addresses:
reference = ray_lookup.remote(name) # Start async. task with foo.remote().
n, address = ray.get(reference) # Block to get the result.
delta = time.time() - start
print(f"{name}:\t {address} ({delta:.3f} seconds)")
# google.com: 4.3.2.1 (0.520 seconds)
# microsoft.com: 4.3.2.2 (1.024 seconds)
# amazon.com: 4.3.2.3 (1.530 seconds)
我们没有改进我们的结果,但我们会马上解决这个问题。首先,我们来讨论一下有什么新内容。
您导入光线库并调用ray.init()
在您的应用程序中初始化它。您可以向ray.init()
传递参数,以连接到正在运行的集群,配置一些行为,等等。
当你用@ray.remote
修饰一个 Python 函数的时候,你把它转换成了一个 Ray 任务。当被调用时,它将在集群中的某个地方异步运行,或者在我们的例子中,只在笔记本电脑的 CPU 核心上异步运行。这已经提供了轻松打破 Python 本身的单线程限制的能力。所有的核心都是属于我们的!
请注意循环是如何变化的。当您调用一个任务时,您将.remote(...)
添加到函数中。这种必要变化的一个好处是为读者提供了文档;很明显,一个 Ray 任务正在被调用。
一旦任务完成,任务立即返回一个引用,该引用可用于检索任务的结果。我们通过调用ray.get(reference)
来立即实现这一点,它会一直阻塞到任务完成。
这就是我们没有提高成绩的原因。我们等待每个任务完成,一次一个。然而,这很容易解决。我们应该“启动”所有的任务,然后立刻等待结果,而不是立即调用ray.get(reference)
:
start = time.time()
references = [ray_lookup.remote(name) for name in addresses]
ns_addresses = ray.get(references) # Wait on all of them together.
for name, address in ns_addresses:
delta = time.time() - start
print(f"{name}:\t {address} ({delta:.3f} seconds)")
# google.com: 4.3.2.1 (0.513 seconds)
# microsoft.com: 4.3.2.2 (0.513 seconds)
# amazon.com: 4.3.2.3 (0.513 seconds)
好多了!它仍然需要至少 0.5 秒,因为没有一个任务能比这更快完成。对ray.get(array)
的调用仍然阻塞,直到所有调用完成。还有一个ray.wait()
API 调用,可以用来避免阻塞,并在结果可用时处理它们。详见文档和光线教程。
射线演员
分布式编程的一大挑战是管理分布式状态。Ray 用行动者的概念解决了这个问题。如果您曾经为 JVM 使用过 Erlang 语言或 Akka 系统,那么您就使用过 actors。
基本上,actor 是用 Python 类实现的,任何状态都由类实例中的字段保存。这些实例的 Ray actor 封装确保了许多 Ray 任务或其他 actor 同时与 actor 交互时的线程安全。我们的演员就像“迷你服务器”。
让我们使用一个 actor 来保存 DNS 数据。到目前为止,我们在尝试访问单个字典时遇到了瓶颈,它“卡”在了我们的驱动程序 ipython 进程中。有了 actors,我们可以在一个集群上运行任意多的 actors,并将负载分配给它们。在 Ray 中甚至有一些工具,您可以在其中查询正在运行的演员。我们现在不看这两个特性,我们只用一个演员。
首先,这位是DNSServer
雷演员:
import ray
@ray.remote
class DNSServer(object):
def __init__(self, initial_addresses):
# A dictionary of names to IP addresses.
self.addresses = initial_addresses
def lookup(self, name):
return name, self.addresses[name]
def get_addresses(self):
return self.addresses
def update_address(self, name, ip):
self.addresses[name] = ip
除了熟悉的@ray.remote
装饰器,这看起来像一个常规的 Python 类,尽管我们也添加了一个get_addresses
方法。在普通的 Python 对象中,您可以只读取像地址这样的字段。射线参与者需要 getter 方法来读取字段。
现在让我们使用它。为了方便起见,我将展示整个 Python 脚本,包括我们上面已经定义的一些内容。让我们从演员的设置开始:
import ray
import time
from dns_server import DNSServer
#ray.init() # Uncomment if this is a new ipython session.
server = DNSServer.remote({ # Construct actor instances with .remote
"google.com": "4.3.2.1",
"microsoft.com": "4.3.2.2",
"amazon.com": "4.3.2.3",
})
server.update_address.remote("twitter.com", "4.3.2.4")
server.update_address.remote("instagram.com", "4.3.2.5")
ref = server.get_addresses.remote()
names_addresses = ray.get(ref)
for name, address in names_addresses.items():
print(f"{name}:\t {address}")
# google.com: 4.3.2.1
# microsoft.com: 4.3.2.2
# amazon.com: 4.3.2.3
# twitter.com: 4.3.2.4
# instagram.com: 4.3.2.5
注意,实例是用 remote 构造的,方法是用 remote 调用的,就像我们对任务所做的那样。现在我们可以使用 actor:
@ray.remote
def ray_lookup(name): # Now use the server.
time.sleep(0.5)
return name, server.lookup.remote(name)
start = time.time()
refs = [ray_lookup.remote(name) for name in names_addresses.keys()]
names_refs2 = ray.get(refs)
for name, ref2 in names_refs2:
delta = time.time() - start
name2, address = ray.get(ref2)
print(f"{name}:\t {address} ({delta:.3f} seconds)")
# google.com: 4.3.2.1 (0.512 seconds)
# microsoft.com: 4.3.2.2 (0.512 seconds)
# amazon.com: 4.3.2.3 (0.516 seconds)
# twitter.com: 4.3.2.4 (0.517 seconds)
# instagram.com: 4.3.2.5 (0.519 seconds)
我们并不真的需要通过ray_lookup
来调用服务器,但我们还是会这样做。产生了两个级别的引用。首先,ray_lookup
返回服务器返回的 IP 地址的名称和引用。因此names_refs
是一个名称引用对的数组。然后,当我们在每个引用上调用ray.get(ref2)
时,我们得到名称和地址的另一个副本。值得打印出每个对ray.get
的调用返回的内容,以了解发生了什么。
如果您编写了大量 Python 代码,并且偶尔发现自己需要并行化工作以提高速度,无论是在笔记本电脑上还是在集群中,我希望您能够体会到 Ray 在这方面的简洁。您甚至可以用参与者来管理状态。正如上一个例子所示,您必须小心地管理通过引用的“间接性”,这样它才不会变得太复杂,但是在大多数现实世界的应用程序中,这并不难做到。
Ray API 对于各种应用程序来说都是非常通用和灵活的。虽然它出现在 ML/AI 世界,但它完全不限于数据科学应用。
机器学习的射线
然而,因为 Ray 出现在 ML/AI 研究社区,所以大多数使用 Ray 的可用库都是以 ML 和 AI 为中心的。我现在讨论几个。
雷·里布
当 Deep Mind 使用强化学习实现专家级游戏时,强化学习成为 ML 中的热门话题,首先是在雅达利游戏中,然后是击败世界上最好的围棋选手。 Ray RLlib 是世界领先的 RL 库之一,其性能与 RL 算法的定制实现不相上下,但它非常通用,可以支持各种 RL 算法和环境,如游戏、机器人等。,为此你可以训练一个 RL 系统。下面是一个使用命令行工具的快速示例,尽管您也可以使用 Python API。首先你需要安装 RLlib,pip install ‘ray[rllib]’
。然后,您可以运行以下命令。$是命令提示符(*NIX 或 Windows)。该命令包含两行。产量很大。我将显示第一条和最后一条“状态”消息,我根据页面进行了编辑:
$ rllib train --run PPO --env CartPole-v1 --stop='{"training_iteration": 20}' --checkpoint-freq 10 --checkpoint-at-end
…
== Status ==
Memory usage on this node: 19.4/32.0 GiB
Using FIFO scheduling algorithm.
Resources requested: 3/8 CPUs, 0/0 GPUs, 0.0/11.52 GiB heap, 0.0/3.96 GiB objects
Result logdir: /Users/deanwampler/ray_results/default
Number of trials: 1 (1 RUNNING)
+--------------------+------------+-------+------+--------------+-------+----------+
| Trial name | status | loc | iter | time (s) | ts | reward |
+--------------------+------------+-------+------+--------------+-------+----------+
| PPO_CartPole-v1_…. | RUNNING | ip:N | 1 | 7.39127 | 4000 | 22.2011 |
+--------------------+------------+-------+------+--------------+-------+----------+
…
== Status ==
Memory usage on this node: 19.3/32.0 GiB
Using FIFO scheduling algorithm.
Resources requested: 0/8 CPUs, 0/0 GPUs, 0.0/11.52 GiB heap, 0.0/3.96 GiB objects
Result logdir: /Users/deanwampler/ray_results/default
Number of trials: 1 (1 TERMINATED)
+--------------------+------------+-------+------+--------------+-------+----------+
| Trial name | status | loc | iter | time (s) | ts | reward |
|--------------------+------------+-------+------+--------------+-------+----------|
| PPO_CartPole-v1_…. | TERMINATED | ip:N | 20 | 95.503 | 80000 | 494.77 |
+--------------------+------------+-------+------+--------------+-------+----------+
这个命令在横拉杆环境中训练一个神经网络,我一会儿会描述它。它使用一种流行的分布式训练算法,称为 PPO(“近似策略优化”),其停止条件是它应该只运行 20 次迭代。您还可以指定与性能相关的停止条件,比如奖励值。- checkpoint*标志控制“代理”(在 CartPole 环境中运行的东西)的检查点的保存频率。这包括正在训练的简单神经网络。我们主要关心最终的代理,它是- checkpoint-at-end 保存的,但是- checkpoint-freq 标志在作业由于某种原因失败时很有用。我们可以从最后一个检查点重新开始。
侧手翻是训练环境的“hello world”。它是 OpenAI 库“健身房”的一部分,用于“练习”RL 算法。这个想法是训练一辆手推车来平衡一根垂直的柱子,手推车可以向左或向右移动,而柱子被限制在二维空间内。
我说模型是检查点,但是在哪里呢?默认情况下,它会写入您的$HOME/ray_results directory
。我们可以使用最后一个检查点来“推出”模型,看看它的效果如何。这里我省略了以PPO_CartPole-v1
开头的完整目录名。同样,该命令包含两行:
$ rllib rollout ~/ray_results/default/PPO_CartPole-v1.../checkpoint_20/checkpoint-20 --run PPO
…
Episode #0: reward: 500.0
Episode #1: reward: 484.0
...
Episode #19: reward: 458.0
Episode #20: reward: 488.0
Episode #21: reward: 367.0
将弹出一个对话框,动画展示该卷展栏,以便您可以看到它的工作效果。你会看到杆子开始向左或向右倾斜,而手推车会移动试图保持它直立。奖励点数计算购物车成功保持垂直且不触及左边界或右边界的迭代次数,最多 500 次迭代。效果非常好。
因此,命令行 rllib 对于许多快速训练运行和实验来说是非常好的,但是当您需要更深入地研究时,有一个完整的 Python API。参见 Anyscale Academy RLlib 教程获取深入示例。
射线调谐
我说我们用 RLlib 训练了一个神经网络,但是那个网络的参数是什么,是最优的吗?默认情况下,使用具有两个 256 个参数的隐藏层的网络。这些是许多超参数中的两个,我们可能想要调整它们来优化神经网络的架构和我们的 RL 代理的有效性。
雷调就是为此而造。使用它自己的 CLI 或 API,您可以指定想要优化的超参数,通常指定一个允许值的范围,以及任何固定的超参数,然后 tune 会为您运行实验以找到最佳性能。Tune 使用多种算法来优化这个潜在代价高昂的过程,例如提前终止看起来不太理想的超参数集的训练运行。
其他射线库
Ray 还附带了其他几个库,如文档所示,许多第三方库现在都使用 Ray 来实现可伸缩的计算。
从这里去哪里
我希望你觉得这个简短的介绍雷有趣。要了解更多关于 Ray 的信息,请查看以下资源:
- Ray 网站 -社区信息、教程、文档。
- 我给过的关于雷的更深入的演讲:
- Anyscale -开发 Ray 和基于 Ray 的产品和服务的商业公司。博客和事件页面提供了大量关于 Ray 在各种组织和行业中使用的有用信息。
雷入门
原文:https://www.dominodatalab.com/blog/ray-tutorial-for-accessing-clusters
在这篇博客文章中,我们简单介绍了雷。我们讨论了架构和执行模型,并展示了一些 Ray 的核心范例,比如远程函数和参与者。
在之前的 博客文章 中,我们谈到了各种并行 Python 计算的框架,以及在 Spark、Dask 和 Ray 之间自由无缝移动的重要性。在本文中,我们将通过对 Ray 的简单介绍来扩展这个主题,并展示在 Domino 中访问按需 Ray 集群是多么容易。
雷是什么?
Ray 是一个通用框架,使您能够快速并行化现有的 Python 代码,但它也被称为“构建框架的框架”。事实上,有越来越多的特定领域库在 Ray 之上工作。
例如:
- rays GD——分布式深度学习的库,提供了 PyTorch 和 TensorFlow 的包装器
- rl lib——一个强化学习的库,它本身也支持 TensorFlow、TensorFlow Eager 和 PyTorch
- RayServe -一个可伸缩的模型服务库
- 雷调——一个超参数优化框架,最常用于深度和强化学习
可以在这里找到这些组件的文档。
接近雷
Ray 既可以安装在本地,也可以安装在多节点集群上。本地安装是一个相当简单的过程,它提供了一个让您熟悉框架的简单方法。正式的项目文档包含了一个关于在一台机器 上安装 Ray 的综合章节,可以归结为:
-
通过 pip 安装 Ray,或者通过用 Ray 和所有需要的依赖项拉一个 Docker 映像
-
调用射线启动头,它启动运行时并提供连接细节。一个成功启动的光线实例的示例输出如下所示:
Local node IP: 10.0.40.194
--------------------
Ray runtime started.
--------------------
Next steps
To connect to this Ray runtime from another node, run
ray start --address='10.0.40.194:6379' --redis-password='5241590000000000'
Alternatively, use the following Python code:
import ray
ray.init(address='auto', _redis_password='5241590000000000')
To connect to this Ray runtime from outside of the cluster, for example to
connect to a remote cluster from your laptop directly, use the following
Python code:
import ray
ray.init(address='ray://<head_node_ip_address>:10001')
If connection fails, check your firewall settings and network configuration.
To terminate the Ray runtime, run
ray stop
-
打开 Python REPL、JupyterLab 或任何您喜欢的 Python IDE,并通过在运行 ray start 的同一节点上启动驱动程序进程来连接到运行时。
当然,Ray 的亮点在于它能够在多台机器上同时编排和运行代码。在多节点配置中,Ray 操作一个头节点和多个工作节点。
在这个设置中,头节点首先启动,工作节点在启动时被赋予地址,因此它们形成一个集群。根据底层基础设施(Azure、AWS、GCP、内部部署等),配置 Ray 集群有其自身的复杂性。)
Domino Enterprise MLOps platform支持 按需射线集群 ,可以使用简单的 GUI 进行配置,而无需深入到与基础架构相关的配置任务。
上面的截图显示了将按需光线簇附加到您选择的工作空间(例如 JupterLab、VS Code、Zeppelin 等)的简单性。)
假设您现在可以通过本地或云安装访问 Ray,让我们看看如何开始熟悉这个框架。
连接到射线
局部射线
一旦安装并运行了 Ray,我们的第一个任务就是连接到集群。如果这是本地安装,我们可以复制在 ray start 输出中建议的 Python 代码。
命令启动一个驱动程序进程,并把它连接到已经在本地系统上运行的头部。我们可以通过调用 ray.is_initialized() 来验证 Ray 是否被初始化:
在我们完成之后停止 Ray 可以通过调用 ray.shutdown() 或者通过命令行来完成:
ubuntu@run-61600c7b0f08e1652cfad481-p9bx8:/mnt$ ray stop
Stopped all 11 Ray processes.
ubuntu@run-61600c7b0f08e1652cfad481-p9bx8:/mnt$
连接到按需光线簇
如果我们使用 Domino on demand 提供的适当的多节点集群,我们可以使用下面的代码连接到它:
import ray
import ray.util
import os
if ray.is_initialized() == False:
service_host = os.environ["RAY_HEAD_SERVICE_HOST"]
service_port = os.environ["RAY_HEAD_SERVICE_PORT"]
ray.util.connect(f"{service_host}:{service_port}")
正如您在上面看到的,Domino 自动设置环境变量,这些变量包含连接到集群所需的信息。
Domino 还提供了对仪表板(Web UI)的访问,它允许我们查看集群资源,如 CPU、磁盘和内存消耗
在工作区或作业终止时,按需 Ray 集群和所有相关资源会自动终止并取消供应。这包括为群集分配的任何计算资源和存储。在工作区或作业启动时,Domino 会自动提供并启动具有所需集群设置的 Ray 集群,并在集群可用时将其附加到工作区或作业。
与雷的第一步
通过将标准 Python 函数转换成 Ray 任务(也称为远程函数),Ray 使我们能够异步执行这些函数。这是一个非常简单的过程,我们可以通过一个非常简单的例子来演示。
让我们从编写一个基本的下沉排序函数开始,至少可以说,根据定义,这不是最有效的排序方法。
def bubble_sort(to_sort):
n = len(to_sort)
for i in range(n):
for j in range(n - 1):
if to_sort[j] > to_sort[j+1]:
to_sort[j], to_sort[j+1] = to_sort[j+1], to_sort[j]
然后,我们可以在[1;1,000,000]范围,并将其传递给 bubble_sort 函数。我们可以用 20 次运行的累计运行时间来计算执行时间,如下所示:
start_time = time.time()
[bubble_sort(random.sample(range(1, 1000000), 3000)) for _ in range(20)]
print("--- %s seconds ---" % (time.time() - start_time))
让我们看看 bubble_sort 使用 Python 和本地 CPU 完成排序通常需要多长时间。在这种情况下,我们的系统可以访问 8 个 CPU 内核:
--- 22.029696702957153 seconds ---
看起来 20 次运行 bubble_sort 的挂钟大约是 22 秒。
现在让我们看看 Ray 是否能在这个运行时间上有所改进。要将我们的 bubble_sort 函数转换成一个 Ray 任务,我们唯一需要做的就是对它应用 @ray.remote 装饰器。让我们创建一个等效的副本,这样我们仍然可以完整地保留原始文件,以备将来需要。我们将新函数命名为 bubble_sort_remote ,除了新的装饰器之外,我们将让它与 bubble_sort 完全相同:
@ray.remote
def bubble_sort_remote(to_sort):
n = len(to_sort)
for i in range(n):
for j in range(n - 1):
if to_sort[j] > to_sort[j+1]:
to_sort[j], to_sort[j+1] = to_sort[j+1], to_sort[j]
为了调用上面的远程函数,我们需要使用 remote 方法。这将立即创建一个对象引用( obj_ref )和一个将在工作进程上执行的 Ray 任务。执行的结果可以通过调用 ray.get(obj_ref) 来检索。因此,修改后的执行和计时代码应该如下所示:
start_time = time.time()
ray.get([bubble_sort_remote.remote(random.sample(range(1, 1000000), 3000)) for _ in range(20)])
print("--- %s seconds ---" % (time.time() - start_time))
--- 6.814101696014404 seconds ---
现在,工作负载似乎需要大约 7 秒钟。与单节点 Python 相比,性能提高了三倍。
作为一个 Domino 集群,我们还可以访问 Web UI,因此我们可以在运行远程冒泡排序方法时检查集群节点的资源利用情况。
我们可以确认所有集群节点都被同时使用,这是 Ray 提供的加速的关键。因为单独的 Ray 任务被异步处理,所以 Ray 可以独立地调度和运行它们。相反,纯 Python 方法作为 list comprehension 语句的一部分一个接一个地运行。
请注意,尽管本质上是异步的,但是 Ray 任务仍然可以依赖于其他任务。例如,我们可以通过以下方式修改对 bubble_sort_remote 的调用:
@ray.remote
def random_list(n=3000):
return random.sample(range(1, 1000000), n)
start_time = time.time()
ray.get([bubble_sort_remote.remote(random_list.remote()) for _ in range(20)])
print("--- %s seconds ---" % ((time.time() - start_time)))
在这种情况下,随机列表的创建被重构到一个单独的 Ray 任务中,该任务嵌套在 bubble_sort_remote 调用中。Ray 通过构建一个内部依赖图来透明地处理这些情况,所以我们没有什么特别需要注意的。请注意,在这种情况下,在 random_list 任务执行完毕之前,不会执行实际的排序。相互依赖的任务通常都是这样。
此外,善于观察的读者可能会问,“等等,我以为调用一个 Ray 任务会返回一个对象引用,而不是实际的对象。难道我不需要调用 ray.get() 并将其传递给bubble _ sort _ remote . remote?”答案是否定的;雷为我们做了这一步。
演员简介
到目前为止,我们已经了解了如何将简单的 Python 函数转换成 Ray 任务。Actors 进一步将 API 扩展到 Python 类。类似于函数的转换,用 @ray.remote 修饰一个 Python 类,把它转换成一个有状态的 actor。用 @ray.remote 修饰的类的每个实例都会产生一个新的进程(actor ),由 ray 在集群的某个地方启动。对实例方法的每个调用都作为一个 Ray 任务执行,这可能会改变参与者的状态。
让我们看一个例子。下面是一个简单的类,它实现了我们的下沉排序算法:
@ray.remote
class Bubble_Remote(object):
def __init__(self):
self.to_sort = self.shuffle()
def shuffle(self):
return random.sample(range(1, 1000000), 3000)
def sort(self):
n = len(self.to_sort)
for i in range(n):
for j in range(n - 1):
if self.to_sort[j] > self.to_sort[j+1]:
self.to_sort[j], self.to_sort[j+1] = self.to_sort[j+1], self.to_sort[j]
def get_value(self):
return self.to_sort
从上面可以看出,除了 decorator,这个类没有什么特别的地方。该类封装了我们的 bubble_sort 方法,一个随机初始化 to_sort 类成员的 shuffle 方法,以及一个用于检索排序列表的 getter 方法。需要后者是因为我们不能直接读取 Ray actors 中的字段。
使用上面的代码非常简单,但是要注意这个类是如何被实例化的:
bubble_remote = Bubble_Remote.remote()
print("Unsorted:", ray.get(bubble_remote.get_value.remote())[:10])
start_time = time.time()
bubble_remote.sort.remote()
print("Sorted:", ray.get(bubble_remote.get_value.remote())[:10])
print("--- %s seconds ---" % ((time.time() - start_time)))
Unsorted: [616716, 419779, 57565, 782118, 577401, 61843, 102215, 499268, 287925, 57212]
Sorted: [124, 175, 1603, 1909, 2280, 2424, 2896, 2990, 3235, 3398]
--- 1.17197277545928955 seconds ---
并行化呢?让我们再做 20 次洗牌和排序,并检查挂钟。
start_time = time.time()
for _ in range(20):
bubble.remote.shuffle.remote()
ray.get(bubble_remote.sort.remote())
print("--- %s seconds ---" % ((time.time() - start_time)))
--- 24.30797028541565 seconds ---
好吧,看起来这和普通的单线程 Python 执行一样慢。这是因为在同一个 actor 上调用的方法是按照它们被调用的顺序连续执行的。记住 actors 是有状态的,所以 Ray 不允许多个远程函数乱序改变类成员。这种行为乍一看可能令人失望,但请记住以下几点:
- 不同参与者上的方法是并行执行的
- 参与者句柄可以传递给远程函数和其他参与者,它们可以相互调用
上述特性使我们能够设计高度复杂的并行执行图。这里有一个来自 官方雷文档 的例子,说明了如何构建演员树:
@ray.remote(num_cpus=1)
class Worker:
def work(self):
return "done"
@ray.remote(num_cpus=1)
class Supervisor:
def __init__(self):
self.workers = [Worker.remote() for _ in range(3)]
def work(self):
return ray.get([w.work.remote() for w in self.workers])
ray.init()
sup = Supervisor.remote()
print(ray.get(sup.work.remote())) # outputs ['done', 'done', 'done']
在上面的代码中,您可以看到一个管理许多工作人员的 Supervisor 类。如果您想要并行训练多个模型(在本例中为三个),这将非常有用。这种设置的另一个好处是,对监控器的单个调用触发多个工作器的实例化,并且监控器能够在任何给定时间检查和修改工作器的状态。请注意,就依赖关系和相互调用的参与者而言,您可以比这里所示的两级主管/工作人员结构更深入。
摘要
在这篇博客文章中,我们研究了 Ray——一个用于 Python 的通用并行化框架,它可以通过最少的代码修改来加速计算繁重的工作负载。我们展示了框架使用的两个主要范例——远程函数和参与者,并演示了如何在单台机器或多节点分布式集群上使用 Ray。
要了解更多关于 Ray 的信息,请访问官方的 Ray 文档。更多详细信息可在 Do mino Enterprise MLOps 平台文档- 按需射线概述中找到。 您可能也对各种集成感兴趣,如 分布式 scikit-learn 、 Dask on Ray 、Apache air flow provider for Ray、以及许多其他应用。
跨越过道:IT 和数据科学如何更好地合作
原文:https://www.dominodatalab.com/blog/reaching-across-the-aisle-how-it-and-data-science-can-better-partner
机器学习(ML)和人工智能(AI)现在有很大的发展势头,我们有机会做一些特殊的事情:打造产品和解决方案,为我们的行业和世界带来真正的变化。
但是,数据科学和 IT 团队需要清除许多障碍,才能使数据科学解决方案取得成果,其中最重要的是有效地合作。
这是我与 Forrester 首席分析师 Kjell Carlsson 博士主持的一次小组讨论的主题,他是我们的特邀演讲人之一。我们(当然是通过 Zoom)与 easyJet 的数据和分析总监 Ben Dias 以及首席信息官 Cesar Goulart(就职于一家医疗保健数字解决方案公司)和数据科学家 Peter Shen(就职于一家领先的制药公司)坐在一起,讨论数据科学与 IT 之间强大合作关系的最佳实践。
首先,我应该说,我们邀请这个小组不仅是因为他们的专业知识,还因为他们可以一起描述这种合作关系如何推进当今数据科学的三个基本目标:
- 在市场中创新。例如,Peter Shen 分享了他的公司如何利用计算数据科学研究跨越免疫学、成分化学和生物学,为患者带来拯救生命和改变生活的药物。
- 生产数据。 Cesar Goulart 分享了他的医疗保健数字解决方案公司的数据科学团队如何使用机器学习来创建决策支持工具,以帮助医疗保健组织提高临床、财务和运营绩效。
- 提高运营效率。 Ben Dias 讨论了 easyJet 数据科学团队如何通过扩大自动化的使用来支持日益增加的工作负载,如更频繁的日程更新,从而应对新冠肺炎疫情期间提出的运营挑战。他们还开始应用先进的人工智能技术,如强化学习,以及外部数据,以更早地检测和应对市场变化。
为讨论做准备
首先,Kjell 分享了最近关于数据科学重要性的研究,以及为什么弥合 IT 和数据科学之间的沟通差距至关重要。Forrester 2020 年数据科学调查的一些主要趋势包括:
- Forrester 的人工智能使用同比增幅最大。Forrester 在 2020 年调查的近 70%的公司报告称,他们正在实施、已经实施或正在扩展人工智能、机器学习和深度学习解决方案,而 2019 年为 54%。
- 人工智能对企业的重要性日益增加,超过 70%的高增长公司表示,人工智能将是未来三年决定竞争力的最重要因素。这些高增长公司中有近 40%表示,人工智能已经是最重要的因素。
- 对人工智能的重大投资,59%使用人工智能和机器学习的公司表示,这是他们最大或最大的投资领域之一。(21%的高增长公司表示,AI 是他们最大的投资领域。)
- 人工智能价值的证据,大多数(75%)已实施人工智能的人报告其投资产生了积极影响。
建立更好的伙伴关系的最佳做法
鉴于数据科学的重要性,有些人可能认为在数据科学和 IT 之间建立无缝合作关系会很容易。毕竟,我们朝着同一个目标努力。但正如小组成员所分享的,一些根本性的挑战阻碍了发展。下面我总结了他们在讨论中分享的一些挑战,以及他们用来解决这些挑战的最佳实践。
挑战#1:数据科学和 IT 团队讲“不同的语言”
easyJet 的 Ben Dias 之前在皇家邮政(Royal Mail)工作,负责数据科学(这是他开始职业生涯的地方)和数据工程,这有助于他了解这两个团队的工作和思维有多么不同。例如,当他与他的数据工程师一起建立一个新的 Hadoop 集群时,他亲眼看到了治理和控制在确保流程顺利进行方面的重要性,以及没有这些流程可能会发生灾难。“为什么对我来说是一门大学问,”他说。“(数据工程师)想要控制它……这样,如果出现问题,他们可以快速修复。”
你能做什么 : Ben 建议,在提出请求时,IT 和数据科学不仅要概述他们需要什么,还要概述他们为什么需要它。这使得团队能够理解并积极参与控制和治理在哪里有意义,在哪里没有意义。
挑战#2:每个人都期望协作和结盟“奇迹般地发生”
正如塞萨尔·古拉特(Cesar Goulart)在讨论中强调的那样,“仅仅将一个新的高技能团队安置在某个地方,并期望事情会自行解决,这是行不通的。”
你能做什么: Cesar 分享了分析副总裁如何与公司的产品管理副总裁和首席解决方案架构师紧密合作,以确保每个人都在共同的目标上保持一致,并创建协作场所。这种积极、持续的参与有助于在一切事情上铺平道路,从获得主题专家的帮助到在潜在的部署问题脱离概念证明演示之前解决它们。
挑战 3:组织没有将研究和生产阶段分开
这触及了前面提到的最常见的争论领域之一,即平衡数据科学家在研究阶段探索新想法所需的灵活性与 it 确保一切顺利运行所需的控制和治理。
您能做什么: 数据科学家 Peter Shen 使用 Domino Enterprise MLOps 平台调整传统软件开发流程,以便在研究生命周期的早期实现可重复性。例如,他使用 Domino 创建数据和方法的快照,数据科学家使用这些快照来测试不同的想法。这确保他们可以在进入下一个研究阶段时重现结果,并随着时间的推移建立不同的思维分支,同时随着模型逐渐接近生产,记录所有工件。在 easyJet,Ben Dias 使用“精益创业”方法,让数据科学家在某种程度上受控的环境中自由探索不同的想法和工具。他们尽可能地使用相同的模板、语言和工具,但是在早期开发阶段需要的时候,他们可以超越界限。
也就是说,Cesar Goulart 强调,对于交付人工智能驱动的产品或通过 API 公开模型的公司来说,数据科学家使用何种技术的灵活性较小。“我们必须有一个标准堆栈,”他说。“我需要产品方面的技术和分析方面的技术之间的所有协调。”例如,将所有的源代码放在一个地方以保证质量,这样就有一个结构来处理任何性能问题。
挑战#4:相反,他们没有足够早地考虑生产阶段
在整个讨论过程中,小组成员强调需要有帮助解决企业 MLOps(包括模型监控)的过程,并尽早将其纳入循环。正如 Cesar Goulart 经常强调的那样,数据科学团队在完全成熟之前不会乐于分享他们的想法。他们通常要等到弄清楚细节后才开始和它说话,这会拖慢事情的进度。
你能做什么: 虽然在许多公司将每个人都放在同一个团队是不现实的,但 Cesar 强调了协调机构(例如,卓越中心)的价值,以协调研究活动与概念的技术验证、基础设施部署和产品管理路线图。作为 Ben Dias 精益启动方法的一部分,所有人从一开始就对模型开发过程中所需的流程和关卡有清晰的理解和一致的意见,因此他们从一开始就知道要做什么以及何时强化解决方案,以便在生产环境中成功运行。在可能的情况下,当将新模型引入生产时,他重用现有的过程,例如当前用于服务设计、服务转换和治理的 IT 和操作指南,而不是创建一个全新的过程。但是将会有当前软件部署通常没有覆盖的领域,模型监控是最重要的,并且团队将需要构建新的过程(它可以来自过道的任何一边)。
如果您还没有,我鼓励您收听完整讨论以了解 Ben、Cesar 和 Peter 在数据科学和 IT 之间搭建桥梁方面的更多工作。所有小组成员强调的关键要点之一是,最终数据科学家将需要接受一些 IT 治理原则,并且 IT 将需要接受数据科学对灵活性的需求。这就是像 Domino 这样的企业 MLOps 平台如此有价值的原因之一:它促进了数据科学家、数据工程师、it 和业务之间的协作,因此他们可以在 Ben、Cesar 和 Peter 谈到的控制和灵活性之间实现难以捉摸的平衡。
正如谢尔指出的,这些都是好问题。它们表明数据科学正在迅速成熟,为我们的世界带来真正的改变。
了解更多信息
观看网络研讨会“跨越通道”,了解数据科学和 IT 如何合作打造更好的企业。
阅读报告“组织企业数据科学”,了解数据科学领导者用于构建企业数据科学战略的最佳实践的更多信息。
阅读 Forrester 报告,“Domino Enterprise MLOps 平台的总体经济影响”,以了解关于 Domino 提供的价值的更多信息。
Twitter Facebook Gmail Share
基于协同过滤的推荐系统
原文:https://www.dominodatalab.com/blog/recommender-systems-collaborative-filtering
这是对协同过滤算法以及如何在实践中使用它的技术深度探讨。
从亚马逊根据你最近的购买推荐你可能感兴趣的产品,到网飞推荐你可能想看的节目和电影,推荐系统已经在数据科学的许多应用中变得流行。像数据科学中的许多其他问题一样,有几种方法来处理推荐。其中最流行的两种是协同过滤和基于内容的推荐。
- 协同过滤:对于每个用户,推荐系统根据相似用户对项目的喜欢程度来推荐项目。假设爱丽丝和鲍勃对电子游戏有相似的兴趣。爱丽丝最近玩并喜欢上了游戏塞尔达传说:野性的呼吸。Bob 没有玩过这个游戏,但是因为系统已经了解到 Alice 和 Bob 有相似的口味,所以它向 Bob 推荐这个游戏。除了用户相似性,推荐系统还可以使用项目相似性来执行协同过滤(“喜欢这个项目的用户也喜欢 X”)。
- 基于内容的推荐:如果公司有关于你的每个项目的详细元数据,他们可以推荐具有相似元数据标签的项目。例如,假设我看了网飞的节目杰克骑士。这个节目可能有“动画”、“喜剧”和“成人”的元数据标签,所以网飞推荐了其他具有这些元数据标签的节目,如家庭盖伊。
在这篇博客文章中,我将重点介绍第一种协作过滤方法,同时也简要讨论第二种基于内容的推荐方法。这是为希望实现推荐系统的数据科学家、工程师和产品经理撰写的关于推荐系统的一系列博客文章中的第一篇。
基于协同过滤的推荐
协同过滤背后的想法是基于用户的相似性来推荐新项目。在这一部分,我将讨论
- 如何衡量用户或对象之间的相似度?
- 用余弦相似性度量一对向量之间的相似性
- 如何使用基于模型的协同过滤来识别相似的用户或项目。
- 使用 Surprise,一个用于简单推荐系统的 Python 库,来执行项目-项目协同过滤。
测量相似性
如果我给你点 (5,2) 和 (8,6) ,让你告诉我这两点相距多远,你可以给我多个答案。最常见的方法是计算欧几里德距离(对应于连接这两点的直线路径的长度),并说它们相距 5 个单位。另一种方法是计算曼哈顿距离,并说它们相距 7 个单位。
我们在计算相似度的时候,是要把它作为“反距离”的度量来计算的。两个物体之间的距离越大,它们之间的距离就越大。另一方面,两个对象之间的相似度越高,它们就越“靠得更近”。通常,相似性度量返回一个介于 0 和 1 之间的值,其中 0 表示没有相似性(完全不相似),1 表示完全相似(完全相同)。
余弦相似性
现在,让我们讨论最常用的相似性度量之一,余弦相似性。如果我给你矢量 U = (3,4) 和 V = (1,1) ,你可以很容易地告诉我这两个矢量相距多远(再次使用欧几里德距离或其他度量)。现在,重要的问题来了:这两个向量有多相似?
同样,对于相似性,我们想要一个介于 0 和 1 之间的“反距离”度量。如果你还记得三角学,余弦函数的范围是从-1 到 1。回忆一下余弦的一些重要性质:
- 余弦(0 ) = 1
- 余弦(90 ) = 0
- 余弦值(180 ) = -1
对于余弦相似性,我们将基于两个向量之间的角度来评估它们之间的相似性。角度越小,两个向量越相似。
使用余弦相似性,我们得到当两个向量之间的角度为 0°时,它们达到最大相似性(它们朝向相同的方向),当它们之间的角度为 90°时,它们具有 0°相似性(它们彼此正交),当它们之间的角度为 180°时,它们具有-1°相似性(它们朝向完全相反的方向)。下面是正交矢量的一个例子。它们之间的角度为 90°,所以余弦相似度为 0。
如果我们将我们的向量限制为非负值(如电影评级的情况,通常从 1-5 的范围),那么两个向量之间的分离角度被限制在 0°和 90°之间,分别对应于 1 和 0 之间的余弦相似性。因此,对于正值向量,余弦相似性返回一个介于 0 和 1 之间的值,这是相似性度量的“理想”标准之一。需要注意的一点是余弦相似度是方向的量度,而不是幅度。两个向量可以指向完全相同的方向(因此余弦相似度为 1 ),但幅度不同。
比如向量 (3,4) 和 (30,40) 方向相同,但大小不同(后一个向量是前一个的倍数)。使用余弦相似性时,请记住,仅仅因为两个向量的相似性得分为 1 并不意味着它们是相同的,这一点很重要!
基于模型的协同过滤
既然我们有了定义向量之间相似性的具体方法,我们现在可以讨论如何使用该方法来识别相似的用户。问题设置如下:
1.)我们有一个 n X m 矩阵,由 n 用户和 m 物品的评分组成。矩阵的每个元素( i , j )代表用户 i 如何对项目 j 进行评分。由于我们正在处理电影评级,如果用户 i 已经对电影 j 进行了评级,则每个评级可以是从 1 到 5 的整数(反映一星评级到五星评级),如果用户没有对该特定电影进行评级,则为 0。
2.)对于每个用户,我们要推荐一组他们还没看过的电影(电影评分为 0)。为此,我们将有效地使用一种类似于加权 K 近邻的方法。
3.)对于每一部还没有看过的电影 j 用户 i ,我们找到与用户 i 相似并且看过电影 j 的用户 U 的集合。
对于每个相似用户 u ,我们取 u 对电影 j 的评分,并乘以用户 i 和用户 u 的余弦相似度。把这些加权评分加起来,除以 U 的用户数,我们就得到了电影 j 的加权平均评分。
4.)最后,我们按照加权平均排名对电影进行排序。这些平均排名作为用户对每部电影的评价的估计。平均排名较高的电影更容易受到用户的青睐,所以我们会把平均排名最高的电影推荐给用户。
我前面说过,这个过程类似于加权 K-最近邻算法。我们把看过电影 j 的用户集合作为 K-NN 的训练集,每个没看过电影的用户作为测试点。对于没有看过电影的每个用户(测试点),我们计算与看过电影的用户的相似性,并基于邻居的已知评级来分配估计的评级。
举个具体的例子,假设我没有看过电影。不过,我看过很多其他电影,并给它们打了 5 星的分。有了这些信息,你要预测我会对隐藏的数字做出什么评价。基于我的评分历史,你可以找到一群和我评分差不多,也看过隐藏人物的用户。为了使这个例子简单,让我们看看与我最相似并且看过这部电影的两个用户。假设用户 1 和我有 95%的相似度,给了电影四星评价,用户 2 和我有 80%的相似度,给了电影五星评价。现在我的预测评分是 0.95 4 = 3.8(用户 1 的相似度 X 评分)和 0.80 5 = 4(用户 2 的相似度 X 评分)的平均值,所以预测我给电影的评分是 3.9。
*### 惊喜
我们将使用 Surprise 库,一个用于简单推荐系统的 Python 库,而不是自己手动实现这个过程。
我们将使用 MovieLens 数据集,这是推荐系统算法的一个通用基准数据集。通过惊喜库,我们可以加载movie lens 100k数据集,该数据集由大约 1000 名用户和 1700 部电影的 100,000 部电影评级组成。
from surprise import Dataset, evaluate
from surprise import KNNBasic
数据集方法允许我们在用户-电影交互矩阵中轻松下载和存储电影镜头 100k 数据。这个矩阵的行代表用户,列代表电影。使用这个 load_builtin 方法,我们得到一个 943 行 1682 列的稀疏矩阵。
data = Dataset.load_builtin("ml-100k")
trainingSet = data.build_full_trainset()
对于我们的任务,我们希望使用电影之间的余弦相似性来进行新的推荐。虽然我解释了基于用户相似性的协同过滤,但是我们可以同样容易地使用项目间的相似性来进行推荐。通过项目-项目协同过滤,每部电影都有一个所有评级的向量,我们计算两部电影评级向量之间的余弦相似度。
sim_options = {
'name': 'cosine',
'user_based': False
}
knn = KNNBasic(sim_options=sim_options)
现在,我们可以在训练数据集上训练我们的模型。
knn.train(trainingSet)
现在我们已经训练了我们的模型,我们想为用户提供电影推荐。使用 build_anti_testset 方法,我们可以在用户没有观看电影的训练集中找到所有用户-电影对,并从这些条目中创建一个“测试集”。
testSet = trainingSet.build_anti_testset()
predictions = knn.test(testSet)
因为我们的模型将为每个用户推荐几十部电影,所以我们将使用一个助手方法来为每个用户只获得前三部电影推荐。
from collections import defaultdict
def get_top3_recommendations(predictions, topN = 3):
top_recs = defaultdict(list)
for uid, iid, true_r, est, _ in predictions:
top_recs[uid].append((iid, est))
for uid, user_ratings in top_recs.items():
user_ratings.sort(key = lambda x: x[1], reverse = True)
top_recs[uid] = user_ratings[:topN]
return top_recs
在我们的数据集中,每个用户和电影都用一个 ID 号表示。如果我们现在要查看模型的输出,我们会收到每个用户的电影 id 列表;这不是我们能轻易解释的结果。因此,我们将使用第二个辅助方法 read_item_names 来创建一个字典,将每个电影的 ID 映射到它的名称。这个方法是基于惊喜库 Github repo 中的例子之一。
import os, io
def read_item_names():
"""Read the u.item file from MovieLens 100-k dataset and returns a
mapping to convert raw ids into movie names."""
file_name = (os.path.expanduser('~') +
'/.surprise_data/ml-100k/ml-100k/u.item')
rid_to_name = {}
with io.open(file_name, 'r', encoding='ISO-8859-1') as f:
for line in f:
line = line.split('|')
rid_to_name[line[0]] = line[1]
return rid_to_name
现在,我们可以调用我们的 get_top3_recommendations 方法来获取每个用户的热门电影推荐并输出结果。
top3_recommendations = get_top3_recommendations(predictions)
rid_to_name = read_item_names()
for uid, user_ratings in top3_recommendations.items():
print(uid, [rid_to_name[iid] for (iid, _) in user_ratings])
如您所见,每个用户都会收到基于他们对所看电影的评价的个性化电影推荐。
协同过滤的一个主要弱点是众所周知的冷启动问题:我们如何向新用户提供推荐,我们对他们的偏好几乎没有数据。因为我们没有关于用户偏好的信息,所以我们不能精确地计算新用户和更老的用户之间的相似性。
基于内容的推荐
在这一节中,我将简要讨论基于内容的推荐是如何工作的。在上一节中,我们讨论了使用余弦相似性来衡量两个用户基于他们的向量的相似程度。假设我们想根据一对项目的元数据标签来确定它们的相似程度。例如,对于电影,元数据标签可以是关于电影中的男演员或女演员(道恩·强森)、流派(动作)和导演( J.J .艾布拉姆斯)的信息。
Jaccard 相似性为我们提供了一种度量两个集合之间相似性的方法,即计算两个集合之间共有的项目数,然后除以两个集合之间唯一项目的总数。本质上,这是他们共享的项目数量与他们可能共享的项目数量的比率。在正式的数学术语中,两个集合 A 和 B 之间的 Jaccard 相似性是 A 和 B 的交集的基数或元素数除以 A 和 B 的并集的基数。
现在我们有了基于每个项目的元数据标签的相似性度量,我们可以很容易地向用户推荐新项目。假设我在网飞看电影 《疯狂动物城》 。因为网飞在其平台上有大量的节目和电影的元数据标签,网飞可以计算出 Zootopia 和我还没有看过的节目和电影之间的 Jaccard 相似度。在计算相似度后,它可以向我推荐与 Zootopia 相似的新电影,如 Finding Dory 。
当然,这不是执行基于内容的过滤的唯一方式。我们可以使用许多其他方法来分析每个项目的元数据。通过 TF-IDF 或主题建模等自然语言处理技术,我们可以分析电影的描述,并基于相似的 TF-IDF 向量或主题模型定义电影之间的相似性度量。
与协同过滤一样,如果我们没有用户偏好的数据,基于内容的推荐也会受到影响。如果我们没有任何关于新用户感兴趣的信息,那么无论我们的元数据有多详细,我们都无法做出任何推荐。
结论
有了足够的数据,协同过滤为数据科学家向用户推荐新产品或项目提供了一种强大的方式。如果你有关于你的产品的详细的元数据,你也可以使用基于内容的推荐方法。
对于那些有兴趣了解更多关于推荐系统的人来说,我强烈建议你们去看看 挖掘海量数据集 一书中关于推荐系统的章节。
在接下来的一篇博文中,我将展示我们如何使用矩阵分解为用户产生推荐,然后我将展示一种混合的推荐方法,它结合了协同过滤和基于内容的推荐。这种混合方法解决了协同过滤和基于内容推荐的缺点。*
Red Hat 的 Heidi Lanford 分享了她成为模特驱动的公式
原文:https://www.dominodatalab.com/blog/red-hats-heidi-lanford-to-share-her-formula-for-becoming-model-driven
Heidi Lanford 因其在分析和数据科学领域的领导地位而闻名。从她在 Harley-Davidson 的早期客户细分工作(该工作指导了一次重要的营销重组)到她在北电的营销活动和预测计划(该计划使两个关键垂直市场的收入翻了一番),Heidi 已经指导一些世界上最大的品牌成功地利用他们的数据来更好地竞争。
现在,作为世界上最大的开源软件公司 Red Hat 的企业数据和分析副总裁,Heidi 再次崭露头角。在加入 Red Hat 不到两年的时间里,她实施了该公司首个用于协作的企业数据科学平台和一个用于认证企业数据资产的框架,这两个平台都是全面计划的一部分,该计划将帮助 Red Hat 在其业务的各个方面扩展数据科学。
她的工作为如何成为模型驱动的公司提供了宝贵的见解-正如大多数数据科学领导者所知,尽管人们对数据科学普遍感到兴奋并进行投资,但这仍是一个重大挑战。事实上,2017 年麻省理工学院斯隆管理学院的一项研究发现,尽管其调查的 85%的公司认为模型能够让他们获得(或保持)竞争优势,但只有 5%的公司在业务中广泛使用模型。
Red Hat 如何建立真正的企业数据科学能力来推动采用?在 Heidi 本月的 Rev 2 会议之前,我们与她坐在一起,先睹为快地了解了她的成功公式,该公式以三个支柱为中心:协作、社区和采纳。以下是我们谈话的编辑记录。
合作的重要性
让拥有大量数据和强大工具的聪明的数据科学家到位,只能让公司走到这一步。许多公司正在通过协作转变他们在业务各个部分使用数据的方式,如果我们不适应,我们知道我们只能从我们的数据和分析工作中获得一定程度的成功。例如,就模型开发而言,最好的数据科学成果来自数据科学家和商业社区之间的大量合作。因此,在前端,我们坚持要求数据科学和分析社区以业务能够理解的方式解释他们将着手的任何建模项目的价值。为了投资生产模型或其他分析输出,企业必须阐明:模型将如何改变某人的日常工作或改善客户体验?
数据科学家还必须真正了解业务,以便他们可以从业务角度看模型建议是否有意义,并且他们需要与业务团队一起审查初始模型输出,以获得他们的反馈。通常,业务团队可以提供一些趋势和模式是否相关的见解,但更重要的是是否存在因果关系。
为数据科学家建立一个社区
我们的数据科学家在不同的环境中接受过教育,有过不同的经历,我们需要为他们提供可以利用彼此知识的方式。因此,我们创建了一个名为 DAVE 的环境,即数据分析虚拟化环境,为数据科学家提供了一个空间来分享想法、建模技术、数据源和他们的主题知识,并就他们试图解决的业务挑战提出问题。
从可信数据到可信模型的思考
虽然我们知道我们正在处理可信的数据源,但我们也希望有一个过程来确定哪些是我们最可信的模型,例如,他们是否使用了足够大的样本量,他们是否采用了正确的方法,他们是否有正确的文档,技术基础设施是否支持该模型,模型何时需要更新,等等。随着我们治理实践的扩展,既有开发部分,也有运营部分。我们正在组建一个数据科学委员会,该委员会将提供同行评审,以确保模型的构建足够严谨。我们只是在测试流程和确定委员会成员的早期阶段,但我们认为这项工作对于建立一条清晰的道路以将模型投入生产和建立信任以最终推动采用至关重要。
谈到推动最终用户的采用,我们还需要确保我们的销售、产品、客户体验和其他团队中的人员都精通“数据作为第二语言”我们的数据素养计划和“你会说数据吗”活动正在帮助我们将数据科学带到组织的每个层面。
在 5 月 24 日于纽约举行的 Rev 2 会议上,您可以听到 Red Hat 的完整故事(和挣扎),并获得关于建立真正的企业数据科学能力的建议。
减少你雇佣错误候选人的机会
原文:https://www.dominodatalab.com/blog/reduce-your-chances-of-hiring-the-wrong-candidate
By Karina Babcock, Director Corporate Marketing, Domino on May 21, 2019 in Perspective
Wayfair 的 Patrick Phelps 将在纽约的 Rev 2 上分享在机构层面处理认知偏见和噪音的方法
我们都知道雇佣错误的人的成本会很高。除了产生大量的入职费用之外,当新员工不合适时,数据科学团队还可能面临广泛的影响,从项目延迟到流失率增加。我们采访的一位数据科学领导者发现,在雇用团队经理后的六个月内,团队的人员流动率高达 80%。事实证明,新经理不愿意接受反馈,也不愿意听取团队的想法,结果导致了大规模流失。
像这样的警示故事比比皆是,导致组织为雇佣新的数据科学家创建了强大的面试流程。这种努力通常包括技术面试和可能的编码评估的某种组合,以及评估候选人“软”技能的针对性行为问题——这对运作良好的数据科学团队和与业务人员的有效互动至关重要。
但是没有一个过程是完美的。鉴于“直觉”很容易影响候选人的选择,最近也有很多关于如何在招聘决策中消除无意识偏见的讨论。一个典型的例子是,当面试官仅仅基于一个人充满活力的个性,就对这个人与商业团队合作的能力做出比其他人更高的评价。另一种情况是,面试官认为候选人非常适合,因为他们与个人“有联系”,有着相同的兴趣或母校。
即使抛开认知偏见,数据科学的领导者也需要担心解决全球最大的家居用品在线公司之一的 Wayfair 所谓的“噪音”。
面试过程中的“噪音”到底是什么?
Patrick Phelps 是 Wayfair 数据科学测量和归因的副主任,他将在本周纽约 Rev 2 的演讲中分享他们对噪音的理解以及如何处理噪音。
一些读者可能还记得去年 Rev 峰会上的 Patrick,当时他参加了一个关于如何雇佣、保留和培养数据科学人才的小组讨论。作为谈话的一部分,他分享了他使用“学习面试”来帮助评估候选人是否愿意听取公司专家的意见并向他们学习。(查看视频了解更多关于这种面试方法的信息。)
在他今年的讲座中,你将了解到:
- Wayfair 如何处理“嘈杂的决策”,因为他们成长为一百多名数据科学家
- Wayfair 正在改进面试流程,以招聘下一百名数据科学家
- 创造一致访谈的技巧,以帮助最小化无意识的偏见和噪音
今年的会议将于 5 月 23 日星期四至 5 月 24 日星期五在纽约举行,60 多位行业领袖分享了对当今数据科学最大挑战的见解,从扩展模型和建立模型驱动的文化到确保负责任的人工智能,会议为从业者和领导者量身定制。诺贝尔奖获得者、著名行为经济学家丹尼尔·卡内曼将主持会议开幕式,讨论为现代行为经济学奠定基础并阐明我们如何真正做出选择的关键发现。
那里见!
Twitter Facebook Gmail Share
反思创纪录的 2017,展望伟大的 2018
原文:https://www.dominodatalab.com/blog/reflections-2017
By Nick Elprin on January 25, 2017 in Perspective
2017 年对于数据科学和 Domino 来说都是重要的一年。很难相信 2018 年 1 月已经快过去了。在进入下一个月、下一年之前,我想停下来反思一下我们已经走过的不可思议的旅程。
数据科学在 2017 年成为一个非常真实的市场,Gartner 的数据科学平台魔力象限报告就证明了这一点。我们在 Domino 看到了三位数的收入增长——从戴尔、T. Rowe Price、84.51、WPP 的 Mindshare、Postmates 和 Survey Monkey 等客户那里赢得了业务——而根据 2017 年 MQ 报告,现有客户“将 Domino 的客户支持和协作功能视为特殊优势。Domino 的协作特性的客户满意度得分在所有供应商中是最高的。
各种形状和规模的组织都在接受数据科学,并投资于必要的人员、流程和技术,以使其成为核心竞争力。在组织中扩展数据科学肯定会面临一些巨大的挑战,我们一直在与客户一起努力克服这些挑战。还有一些更深层次的挑战,我们希望通过我们一直在进行的数据科学管理调查来揭示这些挑战。(这些见解将在未来一个月左右公开分享。)但是,各行各业的组织都有机会成为模型驱动的组织——更重要的是,推动量化的差异化业务影响——这是触手可及的。我们很高兴能帮助这些组织挑战极限。
为了支持不断增长的市场吸引力,我们将我们的团队扩大了一倍,组建了我们的行政人员,聘用关键人员负责产品、工程、营销、业务运营和业务发展。我们仍在快速发展,希望通过有才华、有动力、希望推进数据科学的人来壮大我们的团队。查看我们的职业页面了解更多信息。
我也很高兴今年能主持 Rev 会议:这是一次汇聚当今和未来数据科学领域领导者的行业会议。为期两天的活动将于 5 月 30 日至 31 日在旧金山举行,世界公认的数据科学领袖将重点介绍这一活动,并帮助与会者学习技能、技术和最佳实践,以推动其组织成为模型驱动型组织。当然,我们也将推出激动人心的新 Domino 功能。我们期待在那里见到您!
最后,我想快速介绍一下这个帖子的渠道:我们新的企业博客。我们 Domino 对发布到我们的数据科学博客的内容有非常严格的要求。它必须支持、帮助或支持数据科学家和/或数据科学领导者的数据科学工作或职业生涯。但是,随着我们公司、产品和行业的发展,我们发现需要一个新的渠道来分享市场趋势、Domino vision 和产品新闻、合作伙伴关系、职业机会、活动等信息。这就是这个新的 Domino 企业博客的目的。我们邀请您对这里发布的内容发表意见和反馈。希望它是有价值的。
我们以前所未有的势头、市场需求和真正强大的团队进入了 2018 年。这是令人谦卑的,令人欣慰的,也是非常令人兴奋的。2018 年最让我兴奋的是继续帮助我们的客户为模型驱动的企业设定新标准,并为他们提供新的、突破性的产品功能,以促进这一旅程。
Twitter Facebook Gmail Share
关于数据科学平台市场的思考
原文:https://www.dominodatalab.com/blog/reflections-data-science-platform-market
在我们进入 2019 年之前,我想花一点时间来反思我们在市场上看到的一些变化。2018 年,我们看到“数据科学平台”市场迅速具体化为三个不同的产品细分市场。这篇文章描述了我们对这三个细分市场的观察,并为评估这一领域产品的人们提供了建议。
在过去的几年里,很难责怪任何人对数据科学平台市场前景感到不知所措。尽管为不同类型的用户解决了不同的问题,但有几十种产品使用相似的语言描述自己。这不仅困惑了数据科学家,也影响了作为软件供应商的我们:一些市场分析将 Domino 与完全不同于我们的产品混为一谈,迫使我们回答这样的问题:我们如何与解决根本不同的需求和用例的产品进行比较。有时,感觉就像是一个汽车制造商,看着别人把我们的汽车比作潜艇、飞机和踏板车。
我们惊喜地看到,尤其是在过去的六个月里,公司在为其数据科学团队配备一流技术时,对这些产品的看法越来越清晰。正如经常发生的那样,这种清晰性同时从世界不同的角落出现,反映了似乎是数据科学平台市场的时代精神。
已经结晶的三个部分是:
- 自动化工具
- 专有(通常是 GUI 驱动的)数据科学平台
- 代码优先的数据科学平台
自动化工具
这些解决方案通过自动化数据科学中的任务(包括训练模型、选择算法和创建特征)来帮助数据分析师构建模型。这些解决方案主要面向非专家数据科学家或对简化构建快速基线模型过程中的繁琐步骤感兴趣的数据科学家。这些“自动化机器学习”解决方案通过让非专家数据科学家参与模型构建过程,提供拖放界面,帮助传播数据科学工作。它们通常包括用于部署已经被自动训练的模型的功能,并且它们也越来越多地为那些模型集成可解释性和可解释性特性。当数据准备充分且结构一致时,它们工作得最好。
专有(通常是 GUI 驱动的)数据科学平台
这些工具支持广泛的用例,包括数据科学、数据工程和模型操作。它们提供拖放和代码接口,并在许多企业中拥有强大的立足点,甚至可能为特定的微型垂直市场提供独特的功能或算法。虽然这些解决方案提供了广泛的功能,但用户必须利用专有的用户界面或编程语言来表达他们的逻辑。
代码优先的数据科学平台
这组解决方案面向代码优先的数据科学家,他们使用统计编程语言,整天呆在计算笔记本(例如 Jupyter)或 ide(例如 RStudio)中,利用开源和商业软件包和工具的组合来开发复杂的模型。这些数据科学家需要灵活地使用不断发展的软件和硬件堆栈来优化他们模型生命周期的每一步。这些代码优先的数据科学平台协调必要的基础设施,以加速高级用户的工作流,并为拥有数百或数千个模型的组织创建记录系统。拥有数据科学家团队的企业选择这些解决方案来加速个人实验,同时推动组织的协作和治理。主要功能包括可扩展计算、环境管理、可审核性、知识管理和可再现性。
证据:我们所看到的
我们已经看到多个组织描述了类似的市场划分,有时使用稍微不同的术语。
例如,一家排名前十的全球金融机构的首席数据科学家告诉我,他们的组织研究了产品前景,并根据目标用户的技术技能将其分为三个级别:
- “1 级”包括自动化数据科学任务的工具;
- “第 2 级”包括面向技术水平较低的分析师的拖放式 GUI 工具;
- “第三级”是为那些希望使用统计编程语言来编写逻辑的技术数据科学家准备的。
评估团队将这些层表示为一个金字塔:随着级别的上升,用户数量减少,但用户更具技术性,影响更大。至关重要的是,这些级别并不相互排斥——事实上,评估最终建议从每个级别购买一个工具,以支持组织内不同类型的用户。
同样,2018 年,Forrester 将其预测分析产品的“浪潮”分为两个不同的浪潮。第一个——“多模式解决方案”——包含了我们在本文中称之为“专有/基于 GUI”的解决方案(包括一些“自动化工具”)。他们的第二次浪潮——“基于笔记本的解决方案”描述了“代码优先”平台。他们今年有一份即将发布的关于自动化平台的报告。
作为最后一个例子, 2018 工作台企业年鉴有一个很大的部分是关于企业的机器学习产品。在第 31 张幻灯片中,他们描述了三种“数据驱动洞察模型”,这三种模型与我们看到的三种产品类别非常吻合:
* Image excerpted from 2018 Work-Bench Enterprise Almanac*
虽然来自这些不同领域的解决方案解决不同的问题,但许多组织需要来自这些领域的解决方案。例如,一家保险公司可以指派一组专家数据科学家在一个代码优先的平台上协作开发他们专有的索赔风险模型。与此同时,他们可能在营销部门有一名公民数据科学家,他正在探索自动化工具,看看是否有一种新的方法来进行销售线索评分,从而超越他们现有的基于规则的流程。
下表总结了这些细分市场。
结束语
如果您正在考虑使用这些细分市场中的任何产品,我们的建议(适用于大多数技术选择)是对宣传持怀疑态度,并从评估您的业务需求、使用案例和数据科学人才战略开始。根据您雇佣的人员类型以及您计划如何解决数据科学问题(非技术人员、半技术人员、复杂的技术人员),您将需要并想要不同的解决方案。
如果你对不同类型的问题采取多层次的人才战略,你可能需要多种解决方案。仅仅在一年前,这可能看起来令人不快,但一旦你将这一市场格局视为三个不同的产品类别,它就有意义了。
关于自举的思考
原文:https://www.dominodatalab.com/blog/reflections-on-bootstrapping
我们最近聘请了一名营销主管,其中一个更大的挑战让我感到惊讶:许多候选人对我们自举公司而不是使用更传统的风险投资支持的方法表示严重关切。我认为我们的方法更好、更快、更聪明——但这并不是许多候选人所看到的。
与候选人进行这些辩论让我思考如何启动 Domino,为什么,好的和坏的,我想分享所有这些,它可能会给你提供的观点和你可能会给我们的建议。
从更大的角度来看,bootstrapping Domino 是一个比我们意识到的更激进的决定,因为今天许多人无法想象在没有风险投资的情况下创办一家公司。所以要小心:你在逆流而上。
我们如何以及为什么自举
作为背景,Domino 是一个"数据科学平台:"它让数据科学家可以更快地改进他们的分析,使其更容易运行、跟踪、复制、共享和部署分析模型。尼克、克里斯和我在 Bridgewater Associates 工作了六年(正负)后开始了这个项目,Bridgewater Associates 是一家深入分析和系统化的对冲基金。
我们看到了很多为多米诺骨牌融资的选择,但有一点是相当清楚的:种子阶段风险投资(VC)是其中最昂贵的。要筹集 100 万美元的种子资金,可能需要我们出让公司 20%的股份。在某些情况下,相同的百分比你会得到更多的现金;在某些情况下,你不会。这也需要从生产产品和销售中转移出有意义的注意力。这是一个很高的代价,所以我们想考虑替代方案。
相反,我们引导,特别是:
-
创始人不拿薪水。显然不是每个人都能做到这一点,但这是降低成本的巨大杠杆。这不是全有或全无。即使薪水减少,你的消耗率也会有很大的不同。
-
我们保持其他费用较低。例如,我们还没有聘请律师;相反,我们依靠 Rocket Lawyer 和类似的产品来收集我们需要的东西。我见过初创公司仅在律师身上就花了好几万。
-
我们尽可能使用海外承包商,他们每小时的工资更低,管理费用也更少(如办公空间)。
-
我们做了一些副业。我们知道有几家硅谷公司在我们有丰富经验的领域需要一些帮助,所以我们接了三四个咨询项目来获得一些现金。取决于你的技能和关系网,这对于一些创始人来说会比其他人容易;这可能需要一些极端的创造力。你还必须用你的核心产品来平衡分心。
-
我们尽快收取了产品费用。就像不领薪水一样,这并不适用于所有企业,但对我们来说,幸运的是,它确实适用。
只是要明确一点:我们没有从我们的个人储蓄中给公司开大额支票。我们每个人凑了几千美元作为启动资金,然后做了我上面描述的事情。
好人
16 个月后,我们的结局如何?我们在市场上有一个产品,许多产品的支持者,有意义的收入(足够支付我们的成本,尽管创始人仍然不拿薪水),和一个小团队。
该公司是 100%员工所有的,这是我们方法的最大优点。
除了增加所有权,自举的另一大优势是它让你保持苗条和饥饿。深深烙进多米诺 DNA 的是对每一美元来之不易和应该如何谨慎使用的深刻认识。(马克·安德森最近也掀起了一场与这一点相关的推特风暴。)
自举无疑是一种为许多其他成功公司所采用的方法。Github 在没有外部资助的情况下运行了五年。小蜜蜂在没有外部资金的情况下成长为一家价值 10 亿美元的公司。Craigslist、Patagonia 和 Tableau 软件在最初关键的几年里也是自举发展。
"I would think, this is how Galileo must have felt after a lecture to the Catholic Church."
坏事
自助方法的一个缺点是:某些风险投资公司可能是你建立业务的强大盟友(例如,招聘、营销、媒体)。由于没有风投的参与,我们无法从这种帮助中获益(尽管需要明确的是,并非所有公司都提供这种帮助)。我们已经通过顾问在一定程度上对此进行了补偿。
但最大的挑战是招聘。以下是我们与候选人的典型讨论:
候选人:“那么哪些风投在支持你?”
我说:“我们是穷光蛋。”
候选人:“嗯...这是为什么?”
我:主要是因为我们可以。风投资金,尤其是早期,是非常昂贵的。自举对我们来说意味着更少的稀释。意味着我们有更多的股权可以雇佣。还能减少分心——可以专注于产品和销售。此外,它还能让我们保持苗条和专注。”
候选人:“你的钱快用完了吗?”
我:“不,在雇用你之后,我们会有一年的时间在银行里走秀。相当典型。”
候选人:“但是自举公司往往没有那么充足的资源。”
我说:“实际上我们的障碍是寻找人才,而不是钱——这意味着我们雇不起的人比我们能找到的优秀人才多。”
候选人:“嗯,我也想知道一个风投已经同意了这个想法。”
我:“那是什么意思?”
候选人:“你知道,背后有一个风投。风投看到很多企业,知道他们认为你的想法是个好主意会很好。你当然认为这是个好主意……这是你的公司。”
我:“嗯……风投正在购买期权组合,所以我不确定他们的支持是否如你所想。风投们正试图获得一两笔非常成功的投资,其余的都无关紧要——所以这更像是在玩彩票。我只下了一个赌注,我认为这是一个很好的赌注——这就是为什么我每天都投资它。你应该想想哪种情况最能反映你的处境。”
候选人:“但这就是风投的工作——他们验证初创企业的商业模式。所以,这有助于告诉我,你的业务是稳固的。”
我:“当然。但是没有 VC 做后盾不代表公司无效。你可以将客户和收入增长作为一个更有意义的指标,我们的增长是我们能够启动的一个关键原因。”
候选人:“我就是不确定。”
老实说,我发现像上面这样的对话非常令人沮丧。后来我会想,“这就是伽利略在对天主教会演讲后的感受。”
当然,这是不公平的。接受风险投资是为企业融资的一种完全合理且通常明智的方式。但这不是唯一的方法。在某些情况下,这可能不是最好的方法。
反光
"Ultimately we turned the pushback we were getting into an interview question that we used to judge independence of thought."
那么,是什么让潜在的初创企业员工产生了这种心态呢?两件事——在某种程度上指向了引导的元挑战:
首先,在某种程度上,我只能钦佩他们商业模式的目标,我认为风投已经“抓住”了初创企业的生态系统。换句话说,人们无法想象在没有风投支持的情况下创办一家公司。然后,因为人才(以及媒体和其他人)开始相信这一点,这就变成了一个自我强化的循环。
在这一点上,我要强调的主要事情是有替代方案(这是我写这篇文章的主要原因)。当然,在我们取得巨大成功之前,我们还有数百英里的路要走。所以你只能从我们的例子中得到这么多。但是对于那些考虑走自举之路的人来说,我希望这能给你一些鼓励。
第二,太多人想把思维外包给别人。我不会对此做过多阐述,因为我认为彼得·泰尔最近的努力比我更好地体现了逆向思维在初创企业(以及生活中)的重要性。
最终,我们把遇到的阻力变成了一个用来判断思想独立性的面试问题。这就是我们最终找到营销主管的原因。
对数据科学工具“购买还是构建”的思考
原文:https://www.dominodatalab.com/blog/reflections-on-buy-vs-build
“购买 vs 制造”、“不在这里发明综合症”甚至“在这里发明综合症”已经被广泛地写过。我想分享一些关于这个话题的思考,基于我作为一名工程经理(在那里我必须决定是构建还是购买解决方案)和最近作为一名向其他公司销售平台的创始人的观察。
简而言之,我将使用术语“购买”来表示“使用第三方解决方案”(包括免费或开源的东西)。
这是关于你的业务,而不是你的技术
我看过无数的博客文章,从功能和所需的工程努力方面描述了建设与购买的利弊。你正在寻找的第三方解决方案的质量如何;它是否具备您需要的所有功能;学习/集成另一个解决方案与构建您自己的解决方案需要多长时间。
在我看来,这种类型的计算忽略了最重要的问题:你试图为你的公司的业务和竞争优势提供的能力是不是核心?如果你交付的能力是你业务的核心或者使你与众不同的东西,你应该有强烈的偏好去构建,这样你就可以控制自己的命运。如果你提供的是核心业务的外围功能或支持核心业务的功能,你应该倾向于购买,这样你就可以将宝贵的工程资源集中在你的差异化功能上。
这种框架代表了一种微妙但重要的心态转变,与大多数人处理购买还是建造问题的方式不同。考虑一个论点,比如“第三方产品拥有我们需要的所有功能,所以我们自己构建它是在浪费时间”——如果这些功能是您竞争优势的关键,您可能希望构建自己的产品,以便您可以根据需要精确地发展它们。相反,如果一个产品只有你想要的 80%,但它的功能不会成就或破坏你作为一个企业的成功,这可能是更好的选择,这样你就可以专注于你必须做的功能。
举例来说,对冲基金可能会建立自己的时间序列数据库,即使有很多强大的数据库解决方案,包括许多具有强大时间序列支持的解决方案。这是有意义的,因为时间序列的表示和操作对公司的竞争优势至关重要。另一方面,同一家公司管理自己的虚拟主机基础设施是疯狂的。相反,高容量的消费者 web 应用程序可能需要构建和管理自己的托管基础设施,但可能使用现成的数据库来存储指标(作为时间序列)。在做出购买还是构建的选择时,应该深刻、周到地了解什么对您的业务最重要。
这种思路的一个缺陷是,很容易将两种独立的能力混为一谈,而不是认识到一种能力是业务的核心,而另一种能力不是。例如,您可能有对您的竞争优势至关重要的预测模型——但是计算这些模型的网格基础设施可能是许多公司都有的一般性问题。
大多数工程师天生就有偏见
大多数工程师是工程师,因为他们喜欢建造东西。所以如果你问一个工程师是自己造好还是自己买好,大多数情况下,她默认的姿势会是自己造。工程师喜欢建造东西并不是坏事——事实上,这很好——但这确实意味着当你询问工程师的意见时,你需要记住这一点。
这是我收到的一封真实的电子邮件,发件人是一位数据科学家,他见过 Domino,认为这将有助于他的团队:
嘿,尼克,
很抱歉延迟回复。我已经和这里的一些开发者聊过了,他们已经决定在内部定制我们的平台。我不太清楚为什么,但这是[公司]的普遍趋势。谢谢你的时间。
或另一封电子邮件:
嗨,尼克,恭喜你!看起来是一个很棒的产品,我的团队对此印象深刻。我不认为它适合我们,因为我们更喜欢自己成长,在需要控制方面犯了错误,但如果这种情况有所改变,我们很乐意让你知道。
不幸的是,这种偏见也经常延伸到技术管理职位。我认识一位工程师,他正在构建自己的消息队列,因为,据他所说,“如果我一直建议现有的解决方案,而不是构建自己的解决方案,我会失去首席技术官的信任。”
当技术人员脱离了对业务的理解,他们自然倾向的影响就被放大了。如果你的工程师认为他们存在的理由是建造东西,而不是“最佳地使用技术来实现我们的关键战略业务目标”,那么你的工程组织,以及你的业务作为一个整体,将会受到影响。
“我们自己建造一切”
我听到许多工程师和技术经理说他们在内部开发所有的技术。当然,这些公司还没有建立自己的操作系统、编程语言、数据库系统、电子邮件客户端、文本编辑器等。我怀疑他们永远不会考虑为这些功能构建内部解决方案。
我认为这一点认知失调突出了在实践中应用我之前的建议(考虑你的核心/差异化能力)的挑战。具体来说,我怀疑许多公司夸大了他们业务的核心,同时,我怀疑他们低估了构建自己的解决方案的成本。
需要考虑的问题
我上面的观察并不意味着购买还是构建总是一个简单的决定。这涉及到各种各样的因素——通常是相互冲突的。一个优秀的技术经理——对相关的业务考虑有着发自内心的理解——将能够切入问题的核心,确定这些问题中哪些与任何特定的环境最相关。
-
最重要的是,列举您需要从解决方案中获得的功能,并确定哪些功能对您的业务至关重要,即,您需要控制哪些功能,以确保您与竞争对手相比保持差异化。批判性地思考分解这些能力,以识别哪些是特定的,哪些是通用的。例如,你的专有软件可能是一个区别,但这并不意味着你需要一个专有的编程语言;您的预测模型可能是一个优势,但这并不意味着您需要自己的网格解决方案来训练您的模型。
-
考虑构建您自己的解决方案的机会成本:您的工程师可以做些什么?
-
可视化持续维护(修复和改进)
-如果您正在构建解决方案,请记住构建解决方案的 40-80%的“成本”来自持续的支持和维护。你能承诺吗,或者你想让第三方来做吗?
——反过来,如果你购买一个解决方案,你的改进需求会与供应商或提供商或解决方案的利益一致吗?您会从更新中受益吗,或者解决方案会朝着与您的目标不一致的方向发展吗?
- 当然,要考虑功能,与您的需求相匹配。第三方解决方案会给你 50%、80%或 100%的你想要的吗?如果有差距,它们是必须拥有的还是最好拥有的?(同样,您对差距的容忍度应该取决于功能对于区分您的业务有多重要。)
-你得到的功能有多复杂?建立和维护自己容易吗,或者实际上相当微妙和复杂?
-考虑集成第三方解决方案的成本。即使它拥有您需要的所有功能,与您现有的环境集成又有多少工作量呢?
我们自己的例子
这里有一些我们在构建 Domino 时所做决策的具体例子,关于买什么和构建什么。
-
购买:我们使用了第三方工具(Mixpanel)进行用户分析。这是一个普遍的问题,不是我们特有的,也不是我们竞争优势的核心。它很容易集成,虽然它没有做到我们理想中想要的一切,但差距不是大问题。
-
Build :我们构建了自己的作业调度器和“自动缩放器”,它们一起旋转 EC2 机器,并将用户的作业分配给集群中的不同机器。有些人认为这是一个疯狂的决定——毕竟,AWS 有自动缩放功能。但是我们发现
-
这个功能是我们产品的核心,所以我们希望对我们如何发展它进行细粒度的控制;
-
我们需要的基本功能集实现起来并不复杂。(我们有了第一个版本,在大约 4 周内部署并运行)
-
集成第三方作业调度程序可能会很麻烦,因为我们需要将我们的领域对象和词汇表映射到一个更通用、更一般化的领域。我们实现的特殊性——根据我们的领域精确定制——使我们在代码库中工作更加高效。
-
混合:对于我们的修订版文件存储(支持大文件),我们采用了混合方法。我们在幕后使用 git,但是我们在此基础上构建了对大文件的支持。我们希望尽可能多地使用现成的,因为版本控制是一个众所周知的复杂问题,所以我们希望从解决这个问题的所有工程中受益。但是 git 不能处理大文件。
我们最终构建了一个与 Github 的大文件存储非常相似的东西,但是我们差不多两年前就这么做了,那时 Github 的解决方案还不存在。(如果我们现在做,我们可能会使用他们的解决方案。)我们查看了 git-annex 和几个类似的解决方案,但它们似乎都没有给我们想要的控制,并且/或者集成的复杂性会令人尴尬。所以我们选择主要使用 git,并在上面进行我们自己的定制开发,尽可能做到最小化。
关于数据科学平台市场的思考
原文:https://www.dominodatalab.com/blog/reflections-on-the-data-science-platform-market
反光
在我们进入 2019 年之前,我想花一点时间来反思我们在市场上看到的一些变化。2018 年,我们看到“数据科学平台”市场迅速具体化为三个不同的产品细分市场。这篇文章描述了我们对这三个细分市场的观察,并为评估这一领域产品的人们提供了建议。
在过去的几年里,很难责怪任何人对数据科学平台市场前景感到不知所措。尽管为不同类型的用户解决了不同的问题,但有几十种产品使用相似的语言描述自己。这不仅困惑了数据科学家,也影响了作为软件供应商的我们:一些市场分析将 Domino 与完全不同于我们的产品混为一谈,迫使我们回答这样的问题:我们如何与解决根本不同的需求和用例的产品进行比较。有时,感觉就像是一个汽车制造商,看着别人把我们的汽车比作潜艇、飞机和踏板车。
我们惊喜地看到,尤其是在过去的六个月里,公司在为其数据科学团队配备一流技术时,对这些产品的看法越来越清晰。正如经常发生的那样,这种清晰性同时出现在世界不同的角落,反映了数据科学平台市场的时代精神。
已经结晶的三个部分是:
- 自动化工具
- 专有(通常是 GUI 驱动的)数据科学平台
- 代码优先的数据科学平台
自动化工具
这些解决方案通过自动化数据科学中的任务(包括训练模型、选择算法和创建特征)来帮助数据分析师构建模型。这些解决方案主要面向非专家数据科学家或对简化构建快速基线模型过程中的繁琐步骤感兴趣的数据科学家。这些“自动化机器学习”解决方案通过让非专家数据科学家参与模型构建过程,提供拖放界面,帮助传播数据科学工作。它们通常包括用于部署已经被自动训练的模型的功能,并且它们也越来越多地为那些模型集成可解释性和可解释性特性。当数据准备充分且结构一致时,它们工作得最好。
专有(通常是 GUI 驱动的)数据科学平台
这些工具支持广泛的用例,包括数据科学、数据工程和模型操作。它们提供拖放和代码接口,并在许多企业中拥有强大的立足点,甚至可能为特定的微型垂直市场提供独特的功能或算法。虽然这些解决方案提供了广泛的功能,但用户必须利用专有的用户界面或编程语言来表达他们的逻辑。
代码优先的数据科学平台
这组解决方案面向代码优先的数据科学家,他们使用统计编程语言,整天呆在计算笔记本(例如 Jupyter)或 ide(例如 RStudio)中,利用开源和商业软件包和工具的组合来开发复杂的模型。这些数据科学家需要灵活地使用不断发展的软件和硬件堆栈来优化他们模型生命周期的每一步。这些代码优先的数据科学平台协调必要的基础设施,以加速高级用户的工作流,并为拥有数百或数千个模型的组织创建记录系统。拥有数据科学家团队的企业选择这些解决方案来加速个人实验,同时推动组织的协作和治理。主要功能包括可扩展计算、环境管理、可审核性、知识管理和可再现性。
证据:我们所看到的
我们已经看到多个组织描述了类似的市场划分,有时使用稍微不同的术语。
例如,一家排名前十的全球金融机构的首席数据科学家告诉我,他们的组织研究了产品前景,并根据目标用户的技术技能将其分为三个级别:
- “1 级”包括自动化数据科学任务的工具;
- “第 2 级”包括面向技术水平较低的分析师的拖放式 GUI 工具;
- “第三级”是为那些希望使用统计编程语言来编写逻辑的技术数据科学家准备的。
评估团队将这些层表示为一个金字塔:随着级别的上升,用户数量减少,但用户更具技术性,影响更大。至关重要的是,这些级别并不相互排斥——事实上,评估最终建议从每个级别购买一个工具,以支持组织内不同类型的用户。
同样,2018 年,Forrester 将其预测分析产品的“浪潮”分为两个不同的浪潮。第一个——“多模式解决方案”——包含了我们在本文中称之为“专有/基于 GUI”的解决方案(包括一些“自动化工具”)。他们的第二次浪潮——“基于笔记本的解决方案”描述了“代码优先”平台。他们今年将发布一份关于自动化平台的报告。
作为最后一个例子, 2018 工作台企业年鉴有一个很大的部分是关于企业的机器学习产品。在第 31 张幻灯片中,他们描述了三种“数据驱动洞察模型”,这三种模型与我们看到的三种产品类别非常吻合:
图片摘自 2018 工作台企业年鉴
虽然来自这些不同领域的解决方案解决不同的问题,但许多组织需要来自这些领域的解决方案。例如,一家保险公司可以指派一组专家数据科学家在一个代码优先的平台上协作开发他们专有的索赔风险模型。与此同时,他们可能在营销部门有一名公民数据科学家,他正在探索自动化工具,看看是否有一种新的方法来进行销售线索评分,从而超越现有的基于规则的流程。
下表总结了这些细分市场。
结束语
如果您正在考虑使用这些细分市场中的任何产品,我们的建议(适用于大多数技术选择)是对宣传持怀疑态度,并从评估您的业务需求、使用案例和数据科学人才战略开始。根据您雇佣的人员类型以及您计划如何解决数据科学问题(非技术人员、半技术人员、复杂的技术人员),您将需要并想要不同的解决方案。
如果你对不同类型的问题采取多层次的人才战略,你可能需要多种解决方案。仅仅在一年前,这可能看起来令人不快,但一旦你将这一市场格局视为三个不同的产品类别,它就有意义了。
在 Conda 和 Domino 环境中实现再现性
原文:https://www.dominodatalab.com/blog/reproducibility-conda-domino-environments
管理“环境”(即一组包、配置等)。)是任何一个数据科学平台的关键能力。环境设置不仅会浪费人员的时间,而且跨环境的配置问题会破坏可再现性和协作,并且会在将模型从开发转移到生产时引入延迟。
这篇文章描述了 Domino 如何使用 Docker 来解决这些环境问题,更具体地说,是如何将这种方法与常见的包管理解决方案集成,如 Anaconda 。
计算环境快速介绍
Domino 计算环境允许数据科学家使用任意软件和配置来管理图像。这些环境定义是共享的、集中的和修订的——当 Domino 在其计算网格上运行您的代码时(在模型训练期间或为了部署),您的代码也在您的环境中运行。这意味着无论您何时进行项目(甚至几个月后),或者谁在进行项目(例如,一位新同事加入您的项目),或者项目是为了开发还是生产目的而运行,您都可以获得相同的环境。
下面展示了 Domino 环境强大功能的一个例子,下面的环境可以用来创建一个安装 Theano 和 opencv python 库的环境。
在这种环境下的项目中运行的任何 python 脚本都能够重复利用 Theano 和 opencv。
在 Domino 计算环境中使用 Continuum 的 Anaconda
Continuum 的 conda 是 python 生态系统可用的包和依赖管理工具之一。我们的一些客户问我们“Domino 和 conda 是如何协同工作的?”由于 Domino 环境本质上是 conda 功能的超集,因此利用 conda 或 Domino 内部任何其他类似的依赖管理系统的能力,同时增强其可再现性和可靠性是很容易的。
一些客户使用 conda“渠道”来管理定制套餐。Conda 通道允许用户创建包的内部“存储库”,我们的客户希望使用这些通道(而不是 pip)在 Domino 计算环境中安装包。
这是一个很容易解决的用例。因为 Domino 环境是基于 Docker 映像构建的,所以我们可以简单地在基本环境中安装 conda。我们将通过使用以下 Docker 指令创建一个环境来展示这一点,这些指令是我们从网上获得的:
RUN \
# Install Anaconda for Python 3.5 v 4.2.0 (current as of 1/27/2017)
wget -q https://repo.continuum.io/archive/Anaconda3-4.2.0-Linux-x86_64.sh -O anaconda.sh \
&& yes | bash $HOME/anaconda.sh -b -p /usr/local/anaconda \
&& export PATH=/usr/local/anaconda/bin:$PATH \
&& conda update -q -y --all \
&& ipython kernel install
RUN \
# IPython, Python 3.6; conda can't install due to permissions; conda install soft-linked \
export PATH=/usr/local/anaconda/bin:$PATH \
&& echo 'export PATH=/usr/local/anaconda/bin:${PATH:-}' >> /home/ubuntu/.domino-defaults \
# Allow conda install to access install directory
&& chown ubuntu:ubuntu -R /usr/local/anaconda \
&& chown ubuntu:ubuntu -R /home/ubuntu/*
我们已经构建了这样一个环境,并通过我们的托管平台提供给数据科学家:只需从项目“设置”页面的环境菜单中选择它。如果您在防火墙后运行 Domino 的私有部署,请告诉我们,我们可以与您分享。利用这个环境,现在可以从终端访问 Anaconda 的所有 python 包。简单地输入conda install opencv
将使用 conda 包管理器来处理安装和依赖关系。
向 Domino 环境添加动态行为
Domino 环境不必完全是静态的,它们可以保持灵活性和动态行为,同时保持它们的可复制性。在本节中,我将讨论我们如何利用先进的 conda 特性实现动态配置。
conda 更高级的用途之一是“conda 环境”的概念这些为开发人员提供了一种方式,在一个 yaml 文件中声明性地列出一个项目所需的所有包。一个 conda 环境的例子可以在 Chris Fonnesbeck 的关于 PyMC3 概率编程环境的教程中找到。在这个存储库中,有一个 environments.yml 文件。这个文件描述了运行 PyMC3 的所有 python 要求和提供的示例笔记本。这个 environments.yml 文件如下所示:
以这种方式定义环境是一个吸引人的愿景,但不幸的是在实践中并不成功,因为软件包通常依赖于操作系统级的依赖项和系统库。Domino 环境提供了 conda 环境功能的超集,因为 Domino 环境是基于 Docker 映像的,Docker 映像允许将需求定义到 OS 级别。
为了展示 Domino 环境的灵活性,我们扩展了之前构建的 conda Domino 环境来支持 conda 环境。如果环境与包含 environments.yml 文件的 Domino 项目一起使用,它将:
- 动态发现它
- 构建康达环境
- 使其对执行引擎可用。
Domino 环境在可重现运行的执行生命周期中有许多强大的钩子可用。值得注意的是,我们能够在脚本执行前后注入代码,以便提供合理的环境配置。可以利用 Domino 注入的环境变量并编写类似这样的高级行为。这个示例 shell 脚本就是在定制 Domino 环境中动态引导 conda 环境所需要的全部内容。
通过利用 Domino 最近发布的增强的 git 集成和定制环境,有可能利用 conda 发行版,以及诸如 conda 环境这样的高级特性。
当与同事分享时,或者在将来使用时,这种环境没有不起作用的风险。Domino 环境保证配置的行为是可预测的。“它在我的电脑上工作”的老问题不会再次出现。
利用现有的构建模块,我们创建了一个定制环境,它允许我们的客户利用 conda 发行版及其现有的通道基础设施,但仍能获得 Domino 环境的所有优势,例如对操作系统配置的严格控制,以及实验的完全可再现性。
结论
Domino 建立在抽象的基础上,这些抽象是我们多年来在数据科学平台领域作为一个有远见的人所策划的。Domino 环境为您的包提供了灵活性和控制,同时降低了包漂移或无法重新创建栈或环境的风险。
这种方法足够灵活,可以包含更专业的包管理工具,如 conda。为此,我们很高兴现在提供一个预装了 conda 的托管环境,我们也很高兴让那些在防火墙后部署了 Domino 的客户也能使用这个环境。
Domino 环境,以及我们可扩展的计算和再现性基础设施,使数据科学团队能够以无与伦比的灵活性进行实验和创新。如果您对 Domino 感兴趣,但是担心一些特殊的需求或依赖性,请求一个演示来看看 Domino 环境有多灵活和强大。
Bouwe Brouwer 的横幅, CC BY-SA 3.0 ,通过维基共享。
Jupyter 的可复制仪表板和其他重要功能
原文:https://www.dominodatalab.com/blog/reproducible-dashboards-great-things-jupyter
在最近的 Domino 数据科学弹出窗口上,Domino 的研究工程师 Mac Rogers 展示了创建 Jupyter 仪表板的最佳实践。
会话摘要
在这个数据科学的弹出式会议中,Domino 的研究工程师 Mac Rogers 深入探讨了在 Jupyter 中创建可再现仪表板的技巧和最佳实践。数据科学家使用 Jupyter 来探索数据、测试想法、编写代码和共享工作。然而,创建交互式仪表盘或快速总结研究结果的方法,使数据科学家、数据科学经理和利益相关者能够进一步了解他们所做的工作及其结果。Mac 认为,有了真正可复制的仪表板,如果“你实际上已经证明了一些关于世界如何运转的东西……那个结论是任何人都可以得到的,不管他们采取什么途径。”
本次会议的几个重要亮点包括
- Jupyter 仪表盘概述及其在数据科学生命周期中的作用
- 再现性的不同定义和应用
- 用 Jupyter 的魔法命令打开可能性
- r 使用 rpy2(一个开源包)嵌入在 Python 中运行
- 在您的笔记本上渲染 HTML,等等
如欲了解更多关于本次会议的见解,请观看视频或通读文字记录。
演示文稿的视频记录
谢谢你加入我们。我要开始了,所以我不会逗留太久。
我们将讨论使用 Jupyter 的可复制仪表板。我们将对 Jupyter 做一个简单的概述,以防有人不熟悉。
一点我自己的背景。我叫麦克·罗杰斯。我在多米诺工作。我有化学工程的背景,然后在对冲基金做定量研究,现在在多米诺工作。
开始之前,我们跳得太远,所以我想涵盖的第一件事是“什么是仪表板?就数据科学生命周期和数据科学家的工作而言,它们到底有什么用处?”
我没有意识到,格雷格是一个伟大的数据可视化专家,也是一个制图师。因此,不幸的是,我的演示中有一个地图示例,你们可能会因此对我做出判断。接下来我们要讨论的是,“什么是再现性?那么,为什么这在数据科学和数据科学生命周期的背景下很重要呢?”最后,我们将介绍一些使用 Jupyter 做更多事情的技巧和诀窍。我们会看到你对朱庇特有多熟悉。
这是一个很好的继续。"你们中有多少人知道 Jupyter 是什么或者以前用过 Jupyter?"好的,很好。“你们中有多少人认为自己是高级 Jupyter power 用户,每天都在工作中使用它?”好的,很好。几个月前,我在 JupyterCon 给了这个演讲一个味道,它是一个非常不同的动态。希望这对你有用,而不是多余的。
但是我首先想讨论的主要问题是,“什么是仪表板?”所以你可以把仪表板想象成一种综合信息的方式。它不仅仅是单一的数据可视化。它是一个数据可视化的集合,给你一些你想要讲述的故事的想法,或者你希望你的观众或你的观众从你所做的任何分析中获得的信息,或者你正在进行的任何项目的最终目标。
我从加州大学圣地亚哥分校的 Philip Guo 那里偷来了这个数据科学生命周期。郭在他的博士论文期间,在数据科学成为事物之前,意识到他创建了数据科学生命周期,作为他对定量分析和定量分析如何工作的元分析的研究的一部分。这里的想法是,“仪表板在这个数据科学生命周期中处于什么位置?”。它可以有一个完整的其他话题,就像数据科学研究或定量研究生命周期中经历的所有各种事情一样。但是,作为一名数据科学家、定量研究人员或定量研究人员团队的经理,当您需要了解他们在做什么时,仪表板才真正发挥作用。并了解他们所做的工作以及他们所做工作的结果。
这就涉及到传播部分,不仅仅是写一份书面报告,更是一种快速总结你所有发现的方式;对你的业务的某一部分的长期的、持续的看法;你的学术工作;或者你试图解释的世界的一部分。
Jupyter 笔记本很有趣,因为它们涵盖了所有这些东西。从数据采集到清理,一直到实际分析本身。该分析的迭代以及实际生产你一直在做的东西。
在学术环境中,你要写一篇论文,并把一些结果提交给期刊。但在企业界,你必须证明你的成果是有价值的,然后帮助企业利用这些成果。这不仅仅是一些非常好的见解,而是通过你所做的工作来改变业务运营的方式。仪表板适合这个周期的后期,你把你的工作成果传播给其他人。这就是我们在这个生命周期中所处位置的一些背景。
Jupyter 笔记本的价值不可思议,但我们只关注最后一件。关于再现性方面的第二个问题是“再现性在可视化或仪表板的上下文中意味着什么,或者甚至像任何数据科学工作一样?”不仅仅是“其他人能运行这个代码吗?”因为你可能认为有能力以一种其他人也可以消费的方式传播你的成果。“但他们能得出同样的结论吗?”这不仅仅是他们可以像你执行代码一样执行代码。“他们能接触到您使用过的相同数据吗?但是他们能像你一样经历探索、分析、实验和总结的过程吗?”这对不同的行业有不同的意义。
当我在金融服务领域工作时,有一种想法是“我开发的这种交易策略,当它实际上在市场中时,与在我的模拟中相比,会产生钱吗?”这是一个结果的再现性,“这实际上增加了我认为它会增加的价值吗?”这当然不仅仅适用于金融领域。金融界还有另一个可复制性的方面,“当我开发的这个系统化的交易策略出现在证券交易委员会面前时,它会在哪里产生同样的系统化的结果?”
因此,在生产中使用它与在审计中使用它时,能够出于相同的原因实际生成相同的结果。这也适用于保险业,你必须证明你建立的模型没有任何偏见或歧视,而且它们每次都以相同的方式分析相同的数据。
有趣的一点是,学术界也有这种可重复性的想法,有一个非常流行的统计数据,比如“有多少百分比的学术研究是可重复的?”这是一个非常低的数字,人们实际上可以去另一个实验室,复制,做同样的结果,得到同样的实验。从我高中的化学课开始,或者像那些教科书一样,可复制性,重复性和再现性之间是有区别的?
这真的很有趣,在过去的三四年里,在计算机科学领域和更传统的化学或生物学领域,对于这些术语的含义有一些分歧。我不会说太多。我不会就哪一个意味着哪一个表明立场,但我的想法是,基于相同的计算,使用相同的数据,使用相同的信息,简单地得到相同的结果是有区别的。有点像你虚张声势,你在论文中得出的结论,实际上是可以用同样的信息得到的。
您可以采取更进一步的措施,我认为这在数据科学领域更为重要。这不仅仅是我可以执行相同的代码,相同的方式,就像它今天会以六个月前的方式运行吗?
但是给同一个问题一个新的解释,“我能达到同样的目标吗?”因此,这可能是设计一个新的实验,在一个新的数据集上,使用新的方法或材料,“根据我选择的路线,结果会是一样的吗?”这更多的是在整体可再现性的领域,我得到了相同的结论,就像测试我的无效假设给我带来了相同的结果。
不管我使用的是哪种数据集,也不管我在什么环境下工作,这就像圣杯一样。这并不是说你已经完成了一系列的指令,并能证明这些指令得出了相同的结论。但是如果你真的证明了这个世界是如何运转的……这个结论是任何人都可以得到的,不管他们采取什么途径。
为了做到这一点,你要做的不仅仅是简单地写一份清单,让其他人遵循。你必须从头到尾解释整个过程。这是我努力实现的目标。这些是我前进道路上的障碍。这些是我认为我将要克服的障碍。这就是我将要围绕这些来设计我的实验的方式,这样我得出的结论是全球适用的,而不是非常狭隘的。这是一个关于可复制性的大讨论。有一个宾夕法尼亚大学的教授,他有一个关于语言学和语义学的博客,他有一篇关于这三者区别的文章,如果你想看的话,非常有趣。
最后一块进入木星本身。我想在这里花一点时间谈谈 Jupyter 如何适应这个生命周期。第一,听起来很多人都知道朱庇特。一个基于网络的应用程序,让你运行代码,添加评论,添加描述,可视化,它真的很强大。如果我们回到数据科学的生命周期,它通常是数据科学家或研究人员使用的工具。他们编辑脚本或执行代码,检查输出,这对于让我测试这个东西的迭代周期来说真的很棒。“让我看看结果。让我展示一下利益相关者。让我把它带回来。”
我们看到 Jupyter 在这个生命周期中如此有价值的一个方面,不仅仅是这个狭窄的部分,是许多数据科学家或研究人员知道当他们从一个环境到学术环境,或者从一个更重研究的环境到企业环境时,他们喜欢使用什么工具,在那里你必须证明你正在增加的价值,或者展示你正在工作的结果。事实上,学习一门全新的语言,或者全新的系统是一件非常痛苦的事情,这是为了让它可视化。或者以一种其他人可以利用的方式来做,这些人不是程序员、数据科学家,或者不懂 Python、不懂 r。
Jupyter 如此有价值的原因之一是你可以在一个罩下结合许多不同的工具和技术。在某种程度上,让你能够很容易地将你产生的结果传递给组织的其他成员。从 Greg 在我面前展示的内容来看,这些是一些非常酷的强大地图,我不知道是否有任何数据科学家能够在项目结束后拼凑出这些地图。我当然不能,但是不要相信我的话。Jupyter 在这种情况下变得如此有价值的原因是,你可以对你工作的基础平台做一些非常小的改变。您进行数据清理、数据脚本编写、基本图表、模型训练以及为 TensorFlow 引入 GPU 的地方。同样的环境可以用来产生结果和分发你一直在工作和发展的分析…在某种程度上降低了数据科学家或研究人员以其他人可以发现有价值的方式分发他们的成果的门槛。
你不必去学习如何编写 JavaScript 或非常复杂的可视化工具。你可以使用你已经在使用的东西,如果你有记录你正在做的事情的严谨性,并以一种直观的方式展示给其他人利用。现在,如果你组织得当,你可以让一个三到五人的团队使用一个工具。
接下来我想讲几个例子。我将跳到一个 Jupyter 笔记本,里面有一些提示和技巧。在 JupyterCon 上,这无疑是最有趣的部分,因为每个人都想要所有的代码。希望有一部分观众对逐行代码不太感兴趣,但是我会展示给你们看以证明它是有效的。
使用 Jupyter 最酷的部分之一就是这些神奇的命令。魔法指令背后的想法是他们能够打开 Jupyter 罩下的可能世界。在幕后,Jupyter 只是根据你的工作运行许多不同的内核。我将跳进这个 Python 3 笔记本。太好了。所以这个神奇的命令揭开了幕后可能发生的事情。所有这些不同的命令,如果你熟悉 Jupyter,你们会知道它是什么。对于 Python 2、Python 3、R、Scala、Julia,每个单元都在跨单元的共享内核中运行一个内核。在这种情况下,我们运行的是 Python 3。
所以当我点击这个 LS 魔法命令时,它会显示所有这些魔法命令的列表。我不打算一一列举它们的功能,但我会列举几个真正强大的功能。它将帮助我们制作一个非常酷的仪表板,只要你不是制图师。所以简单的一个只是感叹号。你实际上可以像在终端一样运行。你可以列出这个项目中的所有文件。这对于直接从 Jupyter 内部安装包来说很常见,不需要打开终端,执行你的东西,来回切换。同样的原则也适用,所以如果我只想运行一行,我可以用感叹号运行我的 bash 命令。
如果我想让整个单元执行,作为一个 bash 单元,只需执行% % bash,现在我正在做一些事情,比如检查我正在运行的 Pandas 的版本。这并不仅仅局限于 bash。在这个例子中,我只说我使用的 Python 版本,Python 3。因为 Pythonistas 就在上面,你很快就会意识到这是行不通的,因为这不是 Python 3 的语法。这是 Python 2 语法。我不知道是否有人曾试图在一个团队中工作,这个团队总是在争论我们应该使用哪个版本的 Python。但是有了像 Jupyter 这样的东西,你就可以绕过它了。你不必让每个人改变他们的语法或者重写他们所有的代码。使用 Python 2 的魔力,你可以在 Jupyter 笔记本上运行 Python 3 中的 Python 2 代码。所以我们执行这个,现在在 Python 3 笔记本内部,我们在 Python 2 内核内部执行 Python 2。不需要安装不同的笔记本,不需要使用 Anaconda 来管理全新的环境。就在那里。
好吧,但还有更多。有一个开源包叫做 rpy2。“观众中有 R 用户吗?”好的,很好。所以你会喜欢这个而不是 JupyterCon。所以现在,我们可以简单地开始在这个 Jupyter 笔记本里面使用 R。当然,Jupyter 的用户会意识到,你可以用 Python 2 做诱饵。同样的原则也适用。您可以在 Jupyter 笔记本下运行 R 内核,但是您也可以在 Python 3 笔记本内运行 R 内核,而不必将它写成传递给 Python 函数的字符串。所以现在,我们用的是 R 3.2,这是它真正酷的地方。
我们将回到运行 Python 的普通单元。我们要去获取虹膜数据集,因为花需要更多的分析。我们实际上可以传递这个 Python 数据框。这是一个 Python 熊猫数据框。我们将把它传递到 R 内核中,因为我喜欢 dplyr 和 ggplot,所以我将在我的 Python 3 笔记本中使用 R 来绘制它。如果你有一个同事更喜欢 dplyr,喜欢管道函数,觉得它们更直观,就像我一样,你实际上可以使用这些 R 命令来分析你的 Python 数据帧。你可以来回传递它们。对于这个问题或那个问题来说,这变得非常容易,我将致力于我最擅长的任何工具,无论什么时候我知道得最多…我会为那种语言切换到这种语言,并根据需要切换回另一种语言。
这变得非常容易,只需挑选你最喜欢的工作。作为社区,这些数据真的很有价值,因为这不是大家都同意的事情。你如何做数据科学工作没有标准。Python 2 正在慢慢地被弃用,虽然很慢,但是很确定,但是人们仍然在使用它。Python 3 开始变得越来越流行。它本身仍然是一种完全不同的动物,把这两者结合起来真的很难。Jupyter 让你很容易团结地作为一个团队工作,而不是像如果你想和这个团队一起工作,你必须去下载 R Studio。如果你想在这个队里工作,你就得施展你的个人魅力。它给了你一个工作的环境,这很好。
所以现在我们只是在讨论一些其他的事情,比如如果你在学术领域做得更多,你可以用 LaTeX 或者任何你想用 LaTeX 做的事情来渲染非常酷的方程。可以用 HTML,真的很甜。我们将在仪表板中使用它。所以只要使用 HTML 的魔力,你现在就可以在你的笔记本里呈现 HTML。这使得交互式图表和可视化变得非常容易。这更多的是技术方面,但也很酷,因为 Jupyter 只是一些内核的 HTML 覆盖。你可以把手伸到引擎盖下摆弄它,这可能很危险,但有一些简单的预设示例。
如果你熟悉 head 函数,它会抓取最上面的几行。它会做一些基本的事情。但是,如果您曾经试图一次查看多个数据框,您必须单独打印它们。这可能是一个小烦恼,但也很容易改变。我们设置了一个 IPython 变量。现在,我们可以在一个调用中渲染头部、尾部、描述它,而不用打印它,超级简单。还有一些非常有用的计时工具,比如评估一个函数完成需要多长时间。您可以使用 timeit 函数。它会运行你的代码一百万次,然后看看平均计算时间是多少。所以我们只是做一个简单的循环,它将运行一百万次循环,并计算出它的速度。如果你在 Jupyter 中评估代码的性能,这真的很简单。
最后是交互式图表、可视化和绘图。所以我们在这个例子中使用 seaborn,他们的基本 pairplot。你们可能熟悉 Matplotlib inline,它可以显示可视化效果。他们最近推出了 Matplotlib Notebook,这使得这些可视化成为交互式的,而不是静态的。比如说我想——pair plots 总是铺天盖地而来——但是我想放大这个特定的片段。我可以对所有相关的视觉化图像都这样做。你可以直接进入,现在它就像一个互动的东西,在我的 Jupyter 笔记本里面。真的很简单。
好了,为了节省提问的时间,我将直接进入最后一个环节,也就是把所有这些结合起来。所以现在,我们可以在细胞之间,细胞内核之间传递信息。这样我就可以写剧本了。我可以把它传递给我的 Python 函数。我可以把它传回 R,反之亦然。我可以呈现 HTML。我可以渲染互动图像。我会一直讲到最后,说我有这个笔记本。我做了一些分析。我希望我的组织中的其他人使用它,看到它,看看它。如果我把这个发给他们,他们就会关机。就像,“这是代码。我不喜欢它。我不要。”
但是,Jupyter 的超级可扩展。我有这个 HTML 的小脚本,你可以在 Stack Overflow 上找到。没什么特别的,只是给了我这个按钮。我可以切换这个代码,所以现在所有可怕的代码都消失了。最后,我得到了我的地图,按照制图师的标准,它看起来可能很糟糕,但根据美国地质服务中心的数据,它显示了美国的地震。我可以看到水力压裂在俄克拉荷马州没有引起任何问题。我可以看到西北地区什么也没发生。真的很棒。所以现在,这是一个非常简单的方法,我可以有一个其他人可以跟随的仪表板。他们可以打开代码,看看我在做什么。他们可以看到我在使用什么库。他们可以看到我的数据源是什么,我在做什么操作,我如何构建可视化。无需重新编写一个全新的应用程序,我就可以像只做迭代分析一样可视化数据,然后与他人分享使用。我没有额外的工作。我已经粘贴了一些很容易在网上获得的片段,现在我有了一个其他人可以使用的仪表板,其他人可以跟随。其他不是程序员的人实际上可以利用并融入他们产生的任何见解。
不幸的是,我没有谈到这张幻灯片,但这是一个将它带回来的好机会。在数据科学项目或定量研究中,您可以生成一些光谱分析,您可以有一个特别的报告,如地震图,它只是显示“嘿,在这个时间点,这是发生的事情。”显然,你可以走极端,就像机器和有 API 的机器对话一样。
可复制的仪表板,甚至像可共享和可用的托管仪表板,真的很有价值,因为它们位于这个区域,这里是人类消费者的更高级的终端。我们正在构建一些没有用的东西,只是想通知一个单独的决定。但是它可以用来告诉你整个思考过程,比如“我如何管理这个团队?或者我该如何处理这一业务?”到“我如何驱动我的公司?,我如何从一个定性的、轶事驱动的组织变成一个一致的、定量的、数据驱动的机构。”这就是这类事情的由来,从“嘿,给我这张我们在该地区的销售图表,到我们基于这些东西的预计收入……以及我如何每天都能看到它?,以及它是如何变化的?”所以这就是仪表板有价值的原因。
Domino 编辑注意:为了可读性,这篇文字经过了轻微的编辑。
可再生数据科学的案例
原文:https://www.dominodatalab.com/blog/reproducible-data-science
再现性是科学方法的基石,它确保不同的团队可以使用相同的方法再现测试和实验。在 数据科学 的背景下,可再现性意味着重新创建模型及其结果所需的一切,如数据、工具、库、框架、编程语言和操作系统,都已被捕获,因此无论原始项目已经过去了多长时间,都可以不费吹灰之力地产生相同的结果。
再现性对于数据科学的许多方面都至关重要,包括法规遵从性、审计和验证。它还可以帮助数据科学团队提高生产力,与非技术利益相关者更好地合作,并提高机器学习产品和服务的透明度和信任度。
在本文中,您将了解可再现数据科学的好处,以及如何在每个数据科学项目中植入可再现性。您还将学习如何培养一种组织文化,促进更大的可复制性、责任性和可伸缩性。
可复制是什么意思?
机器学习系统是复杂的,包含代码、数据集、模型、超参数、管道、第三方包、跨机器、操作系统和环境的模型训练和开发配置。简而言之,如果您无法重现用于构建模型的完全相同的条件,那么重现数据科学实验即使不是不可能,也是非常困难的。要做到这一点,所有的工件都必须在一个可访问的存储库中被捕获和版本化。这样,当需要重现模型时,可以使用精确的训练数据和代码,在精确的包组合中轻松地重新创建精确的环境。很多时候,考古探险可能需要几周或几个月的时间(或者可能永远也不会),而文物在创作时并没有被捕获。
虽然对再现性的关注是数据科学中的一个现象,但它一直是各种行业科学研究的基石,包括临床和生命科学、医疗保健和金融。如果你的公司不能产生一致的实验结果,那会极大地影响你的生产力,浪费宝贵的资源,并损害决策。
再现性很重要的情况
在数据科学中,再现性对于数据科学家将实验发现应用到他们自己的工作中来说尤其重要。
法规遵循
在保险、金融和生命科学等高度监管的行业中,必须记录和捕获模型的所有方面,以提供关于组织内部如何开发和使用模型的完全透明性、合理性和验证。这包括所使用的算法类型、选择该算法的原因以及该模型在业务中的实施方式。遵从的很大一部分包括能够在任何时候精确地再现模型的结果。如果没有一个系统来捕获用于构建模型的工件、代码、数据、环境、包和工具,这将是一项耗时、困难的任务。
模型验证
在所有行业中,模型都应该在部署之前进行验证,以确保结果是可重复的、可理解的,并且模型将实现其预期目的。这通常是一个时间密集型的过程,验证团队必须将用于创建模型的环境、工具、数据和其他工件拼凑在一起,这减慢了将模型投入生产的速度。当一个组织能够立即复制一个模型时,验证者可以专注于他们的核心功能,确保模型是健壮和准确的。
合作
当团队能够协作和复合知识时,数据科学创新就会发生。当他们不得不花费时间费力地重现先前的实验或意外地重复工作时,这种情况不会发生。当所有的工作都很容易被复制,很容易被搜索,就很容易在先前的工作基础上进行创新。这也意味着随着团队人员的变化,机构知识不会消失。
将再现性融入每个数据科学项目
在整个组织中灌输数据科学的可复制性文化需要长期战略、技术投资以及数据和工程领导层的支持。在本节中,您将了解在您的行业中开展和推广可重复数据科学工作的一些既定最佳实践。
版本控制
版本控制指的是跟踪和管理工件变更的过程,比如代码、数据、标签、模型、超参数、实验、依赖性、文档以及用于训练和推理的环境。
数据科学的版本控制的构建块比软件项目更复杂,使得再现性更加困难和具有挑战性。对于代码,有多个平台,如 GitHub 、 GitLab 和 Bitbucket ,可以用来在公共存储库中存储、更新和跟踪代码,如 Python 脚本、Jupyter 笔记本和配置文件。
然而,这还不够。数据集也需要被捕获和版本化。环境、工具和包也是如此。例如,这是因为代码在不同版本的 Python 或 R 上可能运行相同,也可能不运行相同。即使使用相同的参数提取,数据也可能已经更改。类似地,为每个实验捕获不同版本的模型和相应的超参数对于重现和复制可能部署到生产中的获胜模型的结果是很重要的。
再现端到端的数据科学实验是一项复杂的技术挑战,使用像 Domino 的企业 MLOps 平台这样的平台可以更有效地实现这一挑战,该平台消除了所有手动工作,并确保了大规模的可再现性。
可扩展系统
构建准确且可复制的数据科学模型需要强大且可扩展的基础设施,用于数据存储和仓储、数据管道、 特征存储、 、模型存储、部署管道和实验跟踪。对于实时预测的机器学习模型,为了快速解决错误和性能问题,可重复性的重要性甚至更高。
端到端的机器学习管道涉及多个组件,可重复数据科学工作的组织策略必须仔细规划工具和基础设施以实现它。工程可再现的工作流需要复杂的工具来包含代码、数据、模型、依赖、实验、管道和运行时环境。
对于许多组织来说, 购买(与构建) 这种专注于可复制数据科学的可扩展工作流是有意义的。
结论
可重复的研究是科学研究的基石。对于像数据科学这样涉及多种工件(如代码、数据、模型和超参数)的跨职能学科,以及各种各样的从业者和利益相关者来说,再现性尤其重要。因此,重现复杂的实验和结果对于团队和组织在做出重要决策时至关重要,例如部署哪些模型、在模型崩溃时确定根本原因以及建立对数据科学工作的信任。
复制数据科学成果需要一套复杂的流程和基础设施,对于许多团队和公司来说,内部构建这些流程和基础设施并不容易,也没有必要。
Jupyter 和 Quilt 的可重复机器学习
原文:https://www.dominodatalab.com/blog/reproducible-machine-learning-with-jupyter-and-quilt
Jupyter 和 Quilt 的可重复机器学习
Jupyter 笔记本记录了代码和数据的交互。代码依赖关系很容易表达:
import numpy as np
import pandas as pd
另一方面,数据依赖关系更加混乱:自定义脚本从网络上获取文件,解析各种格式的文件,填充数据结构,并处理数据。因此,跨机器、跨协作者以及随着时间的推移再现数据依赖性可能是一个挑战。Domino 的再现性引擎通过将代码、数据和模型组装到一个统一的中心来应对这一挑战。
我们可以将可再生机器学习视为一个包含三个变量的方程:
代码+数据+模型=可复制的机器学习
开源社区为复制第一个变量代码提供了强有力的支持。像 git、pip 和 Docker 这样的工具可以确保代码的版本化和统一的可执行性。然而,数据带来了完全不同的挑战。数据比代码大,有多种格式,需要高效地写入磁盘和读入内存。在这篇文章中,我们将探索一个开放源代码的数据路由器,被子,它版本化和编组数据。Quilt 为数据所做的与 pip 为代码所做的一样:将数据打包到可重用的版本化构建块中,这些构建块可以在 Python 中访问。
在下一节中,我们将设置 Quilt 与 Jupyter 一起工作。然后,我们将通过一个例子来重现一个随机森林分类器。
推出带被子的木星笔记本
为了访问 Quilt,Domino cloud 用户可以在项目设置中选择“默认 2017-02 + Quilt”计算环境。或者,将以下几行添加到文件下的 requirements.txt
:
quilt==2.8.0
scikit-learn==0.19.1
接下来,启动一个 Jupyter 工作区,用 Python 打开一个 Jupyter 笔记本。
用于机器学习的被子包
让我们用来自 Wes McKinney 的 Python for Data Analysis,第二版的数据建立一个机器学习模型。访问这些数据的旧方法是克隆 Wes 的 git 库,导航文件夹,检查文件,确定格式,解析文件,然后将解析后的数据加载到 Python 中。
有了被子,过程就简单多了:
import quilt
quilt.install("akarve/pydata_book/titanic", tag="features",
force=True)
# Python versions prior to 2.7.9 will display an SNIMissingWarning
上面的代码具体化了 akarve/pydata_book 包的“titanic”文件夹中的数据。我们使用“features”标签来获取合作者已经完成了一些特性工程的包的特定版本。每个被子包都有一个用于文档的目录条目,一个惟一的散列,和一个历史日志($ quilt log akarve/pydata_book
)。
我们可以从 Wes 的书中导入如下数据:
from quilt.data.akarve import pydata_book as pb
如果我们在 Jupyter 中评估pb.titanic
,我们会看到它是一个包含 DataNodes 的 GroupNode:
<GroupNode>
features
genderclassmodel
gendermodel
model_pkl
test
train
我们可以如下访问pb.titanic
中的数据:
features = pb.titanic.features()
train = pb.titanic.train()
trainsub = train[features.values[0]]
请注意上面代码示例中的括号。括号指示 Quilt“将数据从磁盘加载到内存中”Quilt 加载表格数据,如features
所示,作为 pandas 数据帧。
让我们将训练数据转换成可在 scikit-learn 中使用的 numpy 数组:
trainvecs = trainsub.values
trainlabels = train['Survived'].values
现在,让我们根据我们的数据训练一个随机森林分类器,然后进行五重交叉验证来衡量我们的准确性:
from sklearn.model_selection import cross_val_score as cvs
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(max_depth=4, random_state=0)
rfc.fit(trainvecs, trainlabels)
scores = cvs(rfc, trainvecs, trainlabels, cv=5)
scores.mean()
该模型的平均准确率为 81%。让我们将模型序列化。
from sklearn.externals import joblib
joblib.dump(rfc, 'model.pkl')
我们现在可以将序列化的模型添加到 Quilt 包中,这样合作者就可以用训练数据和训练好的模型来复制我们的实验。为了简单起见,titanic
子包已经包含了我们训练过的随机森林模型。您可以按如下方式加载模型:
from sklearn.externals import joblib
model = joblib.load(pb.titanic.model_pkl2())
# requires scikit-learn version 0.19.1
为了验证它是否与我们上面训练的模型相同,请重复交叉验证:
scores = cvs(model, trainvecs, trainlabels, cv=5)
scores.mean()
表达数据依赖关系
通常一台 Jupyter 笔记本依赖于多个数据包。我们可以将quilt.yml
中的数据依赖关系表达如下:
packages:
- uciml/iris
- asah/mnist
- akarve/pydata_book/titanic:tag:features
精神上quilt.yml
和requirements.txt
很像,但是对于数据来说。使用quilt.yml
的结果是,你的代码库仍然小而快。quilt.yml
伴随您的 Jupyter 笔记本文件,以便任何想要复制您的笔记本的人可以在终端中键入被子安装并开始工作。
结论
我们展示了 Quilt 如何与 Domino 的 Reproducibility Engine 协同工作,以使 Jupyter 笔记本变得便携,并为机器学习提供可复制性。棉被的社区版由开源核心驱动。欢迎代码贡献者。
计算科学中的可复制研究
原文:https://www.dominodatalab.com/blog/reproducible-research-using-domino
这篇客座博文由斯泰伦博斯大学 MIH 媒体实验室数理统计专业的硕士生 Arnu Pretorius 撰写。Arnu 的研究兴趣包括机器学习和统计学习理论。
在科学中,复制很重要。原因在于,如果一项研究的发现可以被复制,参与研究的利益相关者就更有可能相信支持或反对某个假设的证据。不幸的是,由于各种原因,重复一项研究并不总是容易的。最初的研究可能非常大(包括成千上万的参与者)、昂贵或漫长(持续多年)。另一方面,许多研究由更适度的分析形式组成,这使它们成为复制的良好候选。
这篇文章关注计算科学,着眼于 Domino 如何被用作可重复研究的工具。第一部分将讨论围绕可重复研究的一些概念和想法,第二部分提供一个使用 Domino 的简单示例。请随意跳到您感兴趣的任何部分。
为了更好地介绍可重复研究,请看一下罗杰·彭的 Coursera 课程,这是约翰·霍普金斯大学数据科学专业的一部分。事实上,这里介绍的许多介绍性内容都是基于本课程的幻灯片。
可重复的研究
给定一篇报告分析结果的科学文章,下图提供了三个不同级别的复制。
“黄金标准”指的是完美的复制。这意味着在测量机制、计算硬件和软件以及分析中采取的步骤方面的所有必要资源都是可用的,以至于可以进行原始研究的精确复制。另一方面,根本没有复制。这里只给出了关于文章中提供的发现的信息。
可重复的研究介于两者之间。这个想法是让所有的数据、代码和相关的文档都可用,这样研究人员就能够重现这项研究。这种可访问性是至关重要的,因为通常一篇文章的读者的旅程是从作者的另一端开始的(如下所示)。
作者从左到右,首先收集数据,处理数据,然后通过计算分析得出结果。每一步之间都有代码段,这些代码段执行将原始数据转换成整洁数据或将整洁数据转换成结果的任务。最后,所有的发现被总结和浓缩成一篇文章,包括图表和/或数字摘要。相比之下,对复制研究感兴趣的读者从右边开始,然后向左移动。没有数据和代码,读者只能根据文章中提供的信息来解读作者做了什么。因此,可复制研究的目标是从本质上给予读者从与作者相同的位置开始的能力,同时以代码的形式添加每个转换之间的缺失部分。因此,要想让读者了解研究的可重复性,需要具备四个条件:
- 收集的数据。
- 处理和分析代码。
- 数据和代码文档。
- 公众对分发平台的访问。
然而,困难仍然存在,因为读者必须下载数据、代码和文档,以及研究文档,以便能够理解哪个代码段适用于哪个结果以及如何重新运行分析等。此外,读者可能无法获得与撰写文章的研究人员相同的计算资源。然而,下面的例子展示了如何使用 Domino 来规避这些问题,使重现研究更容易、更快。
使用 Domino 的示例
本例中的数据来自 Gareth James、Daniela Witten、Trevor Hastie 和 Robert Tibshirani 的《统计学习入门》。它研究产品销售和各种媒体如电视、报纸和广播的营销预算之间的关系。
注:出于示例目的,数据中添加了一个异常值。
探索性数据分析
一旦收集了原始数据,分析的第一步通常包括探索数据。这是为使用 R 语言的电视预算而做的。
# read in the data
adsData <- read.csv("Data/Advertising2.csv")
# plot sales per thousand from tv advertising
library(ggplot2)
ggplot(adsData, aes(x=TV, y=Sales)) + geom_point(col="darkorange") +
ylab("Sales (per thousand units)") + xlab("TV budget (per thousand dollars)")
预算的大小和销售额之间似乎有明显的正相关关系。然而,负预算设法渗入数据中,这很可能是数据收集错误。
处理代码
下面的代码删除了具有负预算的点,这类似于将原始数据转换为已处理数据的分析中的一段代码。
# processing (remove outlier)
outlierIndex <- which(adsData$TV < 0)
adsData <- adsData[-outlierIndex,]
现在数据已经处理完毕,可以进行数据分析了。
分析代码
为了更具体地描述预算和销售之间的关系,可以用线性模型来拟合数据。
# fit linear model to the data
lmFit <- lm(Sales~TV, data=adsData)
# print coefficients
lmFitCoef <- coef(lmFit)
lmFitCoef
## (Intercept) TV
## 7.03259355 0.04753664
根据线性拟合,电视预算增加 1000 美元将大致导致额外销售 47 台。拟合如下图所示。
# plot fit
ggplot(adsData, aes(x=TV, y=Sales)) + geom_point(col="darkorange") +
geom_abline(intercept = lmFitCoef[1], slope = lmFitCoef[2], col="blue") +
ylab("Sales (per thousand units)") + xlab("TV budget (per thousand dollars)")
现在分析已经完成,让我们看看如何使用 Domino 来重现结果。
使用 Domino 的再现性
简而言之, Domino 是一个企业级平台,支持数据科学家运行、扩展、共享和部署分析模型。这篇由 Jo-Fai Chow 撰写的帖子包含了如何开始使用 Domino 的教程,从启动和运行,到在云中运行您的第一个分析。或者,您可以注册一个现场演示来看看 Domino 提供了什么。所以让我们开始吧。
下面的代码代表了完整的分析管道,创建该管道是为了执行将原始广告数据转换成线性拟合形式的计算结果的所有必要步骤。代码被保存为 lmFitAdvertising。R 。
#########################################################
# Fit linear regression model to the advertising data #
#########################################################
# read in the data
adsData<- read.csv("Advertising2.csv")
# processing (remove outlier)
outlierIndex <- which(adsData$TV < 0)
adsData <- adsData[-outlierIndex,]
# fit linear model to the data
lmFit <- lm(Sales~TV, data=adsData)
# print coefficients
lmFitCoef <- coef(lmFit)
lmFitCoef
# plot linear fit
library(ggplot2)
ggplot(adsData, aes(x=TV, y=Sales)) + geom_point(col="darkorange") +
geom_abline(intercept = lmFitCoef[1], slope = lmFitCoef[2], col="blue") +
ylab("Sales (per thousand units)") + xlab("TV budget (per thousand dollars)")
使分析可重现的第一步是确保所有需要的数据和代码都位于 Domino 项目文件中。如果整个分析是使用 Domino 执行的,那么文件应该已经存在于项目中,但是 Domino 还允许上传数据和代码,如下所示。
接下来导航到启动器页面来创建一个新的启动器。这些是运行在分析代码之上的自助式 web 表单。
要创建启动器,只需点击新启动器按钮,给它一个名称和描述,并选择启动器应该运行的程序(在本例中为 lmFitAdvertising。r)。
另一个可用选项是设置硬件层,在本例中设置为“project default”。这个选项真的有用。如果所有的分析最初都是使用 Domino 进行的,那么研究人员可以通过确保为启动器选择分析中使用的相同硬件层,为读者消除可能的计算障碍。最后,点击右上角的保存启动器,保存启动器。
在可以公开访问启动器之前,必须更改项目设置。前往设置并点击访问&共享选项卡。
内部访问和共享选择公共:任何人都可以查看选项,并勾选允许匿名用户运行执行框。
这些设置将使项目可公开访问,并允许任何具有指向启动器页面的 URL 的人运行启动器。所以现在一切都在多米诺这边准备好了。
这个例子将使用 LaTeX ,但是步骤可能与 Word 非常相似。下面的代码显示了一个表格(通常可能出现在文章中),该表格显示了线性拟合的结果(回归系数)。
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\begin{table}[!htbp] \centering
\caption{Linear fit to advertising data}
\href{https://trial.dominodatalab.com/u/ArnuP/advertising_analysis/runLaunchers}{\begin{tabular}{@{\extracolsep{5pt}} cc}
%\\[-1.8ex]\hline
\hline \\[-1.8ex]
\textbf{Intercept} & \textbf{TV (Slope)} \\
\hline \\[-1.8ex]
$7.0326$ & $0.0475$ \\
\hline \\[-1.8ex]
\end{tabular}}
\end{table}
\end{document}
通过使用 hyperref 包将表格包装在 href 标签中,可以使表格可点击,链接到网络上任何给定的地址。因此,通过插入启动器页面 URL,拥有文章电子版的读者将能够点击表格并被引导至符合线性模型的启动器。点击运行按钮,可再现结果。
Domino 提供了更改运行标题以及将结果发送到指定电子邮件地址的选项。一旦这些被填充(或留空),读者再次点击运行。
代码运行时显示代码打印输出。可以在下面的红框中查看系数。
要查看图表,读者可以点击查看结果。在这里,系数和图都将被显示。然后可以使用位于右上角的按钮下载该图。
这就是使用 Domino 的可重复研究。总之,Domino 允许作者:
- 在云中进行整个分析。
- 下载将在文章中使用的计算结果。
- 通过创建可公开访问的启动器并将它们链接到文章的电子版,使结果可重复。
这样,读者就不必执行以下任务了:
- 下载重现研究结果所需的数据、代码和文档。
- 确保有足够的计算能力来重新运行分析。
这个例子的工作版本可以在这里找到。它包括构建的 LaTeX 文件和生成的 PDF,后者包含前面介绍的表格。PDF 将引导您到再现该示例的启动程序。您还可以通过访问 Domino 平台上的项目来直接访问启动器。
版本 2:下一届数据科学领袖峰会,纽约,5 月 23-24 日
原文:https://www.dominodatalab.com/blog/rev-2-next-data-science-leaders-summit-nyc-may-23-24
By Paco Nathan, Managing Partner, Derwen, Inc. on March 06, 2019 in
这篇文章最初出现在 KDnuggets 上。
修订版 2,纽约市,5 月 23 日至 24 日
字母“REV”开始了许多在数据科学实践中很重要的单词:revision、reveal、review、revenues、revolution 等。去年在我们的第一次 Rev 会议期间,数据科学领导者揭示了与生产中的数据处理和机器学习模型相关的风险的许多方面。自 2018 年以来,非常贴切地代表了对与数据相关的风险格局的全球现实检查:GDPR 和数据隐私合规性,广泛的安全漏洞和泄露的数据,专门针对机器学习模型的网络威胁,关于 Cambridge Analytica 的新闻报道,以及越来越多的人认识到我们通过道德数据科学对社会影响的责任。我们回顾了问题和解决方案。我们修正了我们对数据科学优先级的想法。我们向前看。
今年, Rev 2 探讨了关于数据科学团队的主题。除了问题和解决方案,我们如何在复杂的环境中管理团队?自从工业界开始接受数据科学的实践以来,十年已经过去了。我们有学习数据科学的很好的例子,以及人们如何提高技能加入行业团队——正如加州大学伯克利分校有数千名学生的鼓舞人心的“数据 8”课程所展示的那样。虽然获得成为个人贡献者的技能非常有价值,也非常受欢迎,但在企业中领导数据科学团队的实践却是完全不同的事情。
例如,行业已经认识到机器学习如何强制全新的过程。简单地重新应用软件工程过程,宣布一个组织是“敏捷的”,这是一个灾难的处方——因为去年关于风险的主题应该牢牢地固定在脑海中。
我们在哪里可以找到关于数据科学领导力和新兴流程的指导?首先仔细看看成功的团队。他们的最佳实践是什么?哪些是他们难以学习的课程?我们怎样才能在他们的见解和例子上有所建树?
Rev 2 将会特别强调这一点。请于 5 月 23 日至 24 日向耐克、网飞、Slack、Stitch Fix、Domino Data Lab、微软、戴尔、Red Hat、谷歌、Turner Broadcasting、Humana、Workday、Lloyds Banking、BNP Paribas Cardif 和许多其他公司的数据科学团队和领导者学习以下主题:
- 如何开发成熟、可持续的数据科学实践,并对业务产生切实影响。
- 世界领先的模型驱动型组织为在内部提升数据科学而采取的具体步骤。
- 扩大跨团队协作的最佳实践、方法和技术。
我喜欢把今年的焦点想成“团队可以互相学习什么?”
在第二版主题演讲中,我们将邀请诺贝尔奖得主、《思考,快与慢》的作者丹尼尔·卡内曼。思考:我们为什么需要模型?公司在哪里没有恰当地使用模型,为什么?为了在业务中成功应用模型,数据科学组织应该采取哪些实际步骤?卡尼曼博士的大部分生活和工作都致力于人类决策科学。在这个人工智能应用的时代,拆分决策过程是企业面临的一个关键挑战,卡尼曼博士带来了至关重要的见解。
Nike 的 Tom Kornegay、网飞的 Michelle Ufford 和 Slack 的 Josh Wills 这三位都是主题演讲人,我有幸与他们的团队交谈,了解他们所面临的挑战以及他们如何应对企业数据科学成功案例。
我最喜欢的另外两位演讲者加入了 Rev 2:Maryam Jahan shahi,tap recruit的研究科学家,介绍了他们如何利用数据科学来帮助改变我们对如何雇用数据科学家的想法,特别是在培养专业知识和包容性方面。此外,由 DJ Patil 领导的 LinkedIn 开创性数据科学的校友 Pete Skomoroch 创建了一家名为 SkipFlag 的人工智能公司,专注于企业解决方案,一年前被 Workday 收购。也就是说,Pete 已经看到了从初创企业到企业的全方位数据科学实践,他将介绍人工智能的产品管理。在本·洛里卡和我最近进行的一系列关于企业采用人工智能的行业调查中,近五分之一的公司称“难以识别适当的商业用例”是他们在生产中部署机器学习的主要瓶颈。换句话说,在你雇佣了一小群数据科学家和数据工程师之后,人工智能领域的产品管理仍然存在广泛的人才缺口。我期待着 Maryam 关于招聘的见解,Pete 关于产品的见解,以及 Rev 2 演讲者关于成功的数据科学如何管理他们的实践的全部内容。
请加入我们 5 月 23 日至 24 日在纽约举行的 Rev 2 的对话。
Twitter Facebook Gmail Share
Rev 3 表明数据科学确实在主宰世界,而 MLOps 正在推动这一趋势
原文:https://www.dominodatalab.com/blog/rev-3-shows-data-science-really-is-running-the-world-and-mlops-is-spurring-on-the-trend
数据科学管理世界的新兴力量——长期以来甚至对该行业的个体从业者来说也是部分模糊的——本周在纽约市举行的影响深远的 Rev 3 会议的开幕日得到了充分展示,这感觉就像是一个年轻职业的初次社交舞会。
第一天的 Rev 3 计划重点介绍了商业、生命科学、计算机技术以及数据科学本身的领导者的主题演讲,强调了从职业在做出关键商业决策中的重要性到其在制药和金融等特定行业中的影响。首先,会议组织者 Domino 数据实验室宣布了新的机器学习操作(MLOps)工具,可以更快更容易地创建和维护让世界运转的模型。
“永远记住,你的所作所为和让世界变得更美好之间是有联系的。我非常清楚,你们也应该清楚,”前海豹突击队指挥官兼 VMware 首席数字转型官 Mike Hayes 对观众说,观众主要由参加为期两天的会议的数据科学家、It 专业人员和数据科学负责人组成。
“MLOps 是我们决策能力的巨大提升,”Hayes 说,并补充说,数据科学为当今几乎每个学科的决策提供了信息,从商业到军事到政府,等等。
疫情,惊人的成果推动了数据科学作为一门学科的飞速发展
主题演讲人 Linda Avery 是威瑞森的首席数据和分析官,她的故事强调了数据科学专业在商业中几乎惊人的发展速度。两年半多以前,用她自己的话来说,埃弗里是“一个人的部门”。
Avery 着手组建一个围绕数据科学能力构建的“卓越中心”,并为其配备人员和资源。如今,他领导着一个拥有 1000 多名员工的组织,该组织参与了从手机信号发射塔定位到疫情期间威瑞森商店人员配备等各方面的学科应用。她说,该集团现在“收入近 20 亿美元”,现在是威瑞森战略决策的驱动力。
“新冠肺炎对世界来说是可怕的,但它对数据科学来说是一个伟大的机会,”埃弗里说,因为像威瑞森这样的公司必须回答关键问题,并使用数据模型和 MLOps 进行预测,以保持运营并应对前所未有的情况。
类似地,在从金融到制药和生命科学的领域,相关领域相对较新的数据科学家和技术专家大军已经动员起来,以解决组织和技术复杂性不断增长的问题。诺贝尔奖得主詹妮弗·杜德纳(Jennifer Doudna)触及了这个主题,她在 CRISPR 基因编辑方面的工作给生物技术和寻找严重疾病的治疗方法带来了革命性的变化。
Doudna 告诉 Rev 3 的观众说:“过去十年发生的事情是,生物学研究确实发生了变化,更加专注于需要复杂方法和需要不同专业的许多人的专业知识的问题。”
这种不断增加的复杂性通常需要大量数据来解决特别困难但极其重要的问题。
“你必须对数据有一定的理解,然后才能意识到你有了新的东西,”她说。
在持续交付的压力下,MLOps 对于学科的成功至关重要
数据科学在众多领域的成功,以及它在疫情的巨大压力下对业务决策的加速和支持,也给这个年轻的学科带来了压力,要求它每次都提供成功的见解和成果。
“数据科学的游戏时间已经结束了,”埃尔普林说。“如果公司不能将数据科学转化为商业影响并描述这种影响——如果工作仍然被转移到人工智能创新实验室——他们已经落后了,不管他们是否意识到这一点。”
埃尔普林告诉他的听众,Domino 数据实验室发布的 Domino 5.2 是加速数据科学家工作的解决方案,同时仍然给他们创新和使用他们需要的任何工具来解决重要问题的自由。
随着数据科学家使用更多的软件和计算,IT 需要管理更多的成本和运营负担。Elprin 说,Domino 的持久工作空间开发环境现在更加智能和高效,具有一个名为 Intellisize 的新功能,可以推荐环境的最佳大小,从而节省资金,否则这些资金会浪费在未使用的资源上。对于数据科学团队来说,这意味着更低的复杂性和更高的生产力。对于 IT 来说,消除多余的工作空间容量并自动删除废弃的工作空间可以显著降低每月的云存储成本。
使用雪花进行数据库内计算的灵活模型部署
编排数据的移动需要定制开发工作,并强制执行手动解决方案,这消耗了数据科学家和 ML 工程师的宝贵时间,并带来了不必要的风险。Domino 已经与 Snowflake 合作,在 MLOps 生命周期中集成端到端的工作流。Domino 5.2 将 Domino 中模型构建的灵活性与 Snowflake 的数据库内计算平台的可伸缩性和强大功能结合在一起。客户可以使用 Snowflake 的 Snowpark 在数据库中训练模型,然后将这些模型直接从 Domino 部署到 Snowflake 数据云中进行数据库内评分,从而通过跨 IT 和数据科学团队的通用数据和部署平台简化企业基础架构。
Domino 5.2 为模型衰退的威胁性问题提供了一个解决方案
最后,Elprin 演示了在雪花数据云环境中简化实时模型监控的新功能,这是对模型衰退威胁的一种回应,当模型不再像最初测试和部署时那样准确时,就会出现模型衰退。这通常是由于业务条件、客户偏好和其他因素的变化。如果没有对数据漂移和准确性的主动监控,公司可能会根据过时的模型做出错误的业务决策,尤其是在快速变化的时代。
有了 Domino 5.2,数据科学团队现在可以为部署到雪花数据云中的模型自动设置预测数据捕获管道和监控。Domino 现在还将不断更新数据漂移和模型质量计算,以提高模型准确性,并最终做出更好的业务决策。
反光
原文:https://www.dominodatalab.com/blog/revlections
By Mac Steele, Director of Product, Domino on June 01, 2018 in Perspective
本周,我们在旧金山举行了有史以来第一次 Rev 峰会,召集了 300 多位数据科学领袖,为期两天。演讲者和与会者讨论了数据科学行业的战略方向,并在其他领导者之间分享了战术技巧。我们 Domino 主办 Rev 是因为我们听到并感觉到市场上存在一个缺口,需要一个论坛,让领导者们能够聚在一起,带走一些实质性和实际的东西。他们可以在周一早上开始工作。结果超出了我们的最佳预期。我们想为那些无法亲临现场的人分享一些亮点。
-
我们的首席执行官 Nick Elprin 公布了数据科学领域的 Domino 愿景。在他的主题演讲中,他讨论了数据科学领导者社区如何获得千载难逢的机会来帮助建立新的组织能力并释放数据科学的全部潜力。他详细介绍了这种能力的一个新框架,称为模型管理,并通过演示 Domino 数据科学平台的未来,分享了我们如何将这种能力应用到生活中。如果你想了解更多,请看看这篇论文,它更详细地介绍了模型管理。
-
我们听到了凯茜·奥尼尔和内特·西尔弗发人深省的主题演讲。
- 《摧毁数学的武器 的作者凯茜谈到了在考虑到所有不同利益相关者的情况下,从更广阔的角度来看待什么是“好”模型的重要性。她建议团队在盲目地直接进入模型构建之前使用一种叫做道德矩阵的工具,特别是当模型开始驱动我们与大多数官僚机构的互动时。
- 《信号与噪音 的作者 Nate 讨论了概率思维的重要性,以及大数据推动的模型爆炸如何为社会带来了许多问题和机遇。他强调了快速迭代的必要性,引用了气象学家不断从过去的错误中学习和调整的天气预报的巨大进步。
-
来自 Stitch Fix、谷歌、优步、Airbnb、联合健康集团、摩根大通等模型驱动型公司的领导者分享了他们自己的观点。Bristol-Myers Squibb 的 Nathan Siemers 详细介绍了他的团队如何利用模型发现基因生物标志物来改善癌症治疗。来自穆迪分析的 Jacob Grotta 描述了银行业模型的传奇历史,以及他们如何开发了一个严格的系统来管理这些模型,其他行业可以从中学习。他指出,所有的数据科学家都喜欢把自己当成艺术家,他说在穆迪,真正的艺术是“可观察的、可重复的、 T 透明的。”****
-
会上就如何最好地管理数据科学组织举行了多个小组讨论和一个互动研讨会。领导们就招聘哪些角色、以什么顺序招聘以及数据科学应向谁汇报展开了一场健康的辩论。协作的重要性和再现性的目标是会议中反复出现的主题。许多与会者描述了一种如释重负的感觉,即他们所面临的挑战并不是他们所独有的,他们都很兴奋能够在我们仍处于萌芽状态的行业中形成最佳实践。
总的来说,这是令人振奋的两天,演讲者和与会者愿意分享他们的见解,以帮助推进数据科学管理的新兴实践,这让我们感到谦卑。随着各行各业的数据科学领导者继续打造模型驱动型公司,我们深受鼓舞。
请继续关注 Rev 2019 的更多内容,同时,请留意 2018 年下半年在你附近的一个城市出现的数据科学弹出窗口。
Twitter Facebook Gmail Share
民意调查发现,对数据科学的信心直线上升:更好的工具是原因吗?
原文:https://www.dominodatalab.com/blog/rocketing-confidence-in-data-science-poll-finds-are-better-tools-the-reason
企业越来越多地在数据科学上下大赌注,以实现雄心勃勃的短期增长,这再次表明,这个迅速崛起的行业正在成为医疗保健&制药、国防、保险和金融服务等领域的巨大创新力量。 在最近的一次民意调查中,近一半的受访者表示,他们公司的领导层预计数据科学的努力将带来两位数的收入增长。2021 年的一项类似调查显示,这一数字仅为 25%,表明人们对年轻职业的期望越来越高。
这只是多米诺数据实验室最近 Revelate 调查的发现之一,该调查吸引了该领域相关人员的 151 份回复。近五分之四的受访者(79%)表示,数据科学、ML 和 AI 对其公司的整体未来增长至关重要。整整 36%的受访者称这些技术是他们公司扩张的“唯一最关键的因素”。
商家需要做什么才能收获预期的大收益
公司应该把精力集中在哪里才能获得如此巨大的回报?什么能最有效地帮助新兴学科充分发挥其巨大潜力?调查结果也说明了这些问题,发现:
- 与扩展和运营数据科学相关的最困难的技术问题 是访问适当的数据科学方法/工具(27%的受访者表示这是他们最大的挑战)和安全性考虑(26%)。
- 最大的人和流程挑战 仍然拥有足够的数据科学人才,据 44%的受访者称,这与许多的近期调查一致。因此,精明的企业领导人应该尽一切努力尽可能高效和有效地利用他们现有的数据科学团队。
- 最能帮助数据科学加速其游戏 的改进包括: 增加协作 和按需访问 数据科学工具和基础设施,两者都占 的 43%。
数据科学领导者还强调需要企业 MLOps 平台来帮助他们解决世界上最大的挑战。特别是,他们中的许多人说他们很乐观,因为企业 MLOps 工具能够应对挑战。
例如,谷歌的首席数据科学家 Cassie Kozyrkov 最近承认,人们对这个年轻的职业越来越有信心。 但是随着数据科学变得越来越受重视,像多米诺数据实验室这样的公司正在投资创造和升级工具来支持这个年轻的职业。Kozyrkov 表示,现在专门为数据科学工作设计的工具的功能增加,是帮助从业者和数据科学领导者跟上发展的非常积极的一步。
她说:“例如,多米诺数据实验室为数据科学家制作了 工具 ,这些工具令人难以置信,非常有用,而且非常可爱。”" 那是 为我们数据科学界所倡导的 看起来就像 。"
这项调查是由 Rev 3 的与会者以及他们的团队在 5 月份进行的,Rev 3 是 Domino Data Lab 为数据科学和 IT 领导者举办的一个受欢迎的会议。Kozyrkov 在会议上发言,重点关注数据科学在一些世界上最重要的挑战中的应用,并在 5 月吸引了 800 多名与会者。
容器在 MLOps 和模型生产中的作用
原文:https://www.dominodatalab.com/blog/role-of-containers-on-mlops-and-model-production
容器技术改变了数据科学的发展方式。数据科学最初的容器用例集中在我所说的“环境管理”上。配置软件环境是一项持续的工作,尤其是在开源软件领域,这是大多数数据科学家工作的领域。这通常需要反复试验。这种修补可能会打破依赖性,例如软件包之间或驱动程序和应用程序之间的依赖性。容器为分析专业人员提供了一种将环境相互隔离的方式,允许分析人员试验和冻结黄金状态环境。容器编排在数据科学工作中具有以下优势:
-
消除 MLOps 生命周期中的中心 IT 瓶颈。
-
共享代码和研究时,数据科学家可以更好地协作。
-
旧项目可以立即复制和重新运行。
将模型投入生产是 MLOps 生命周期中的一个关键阶段。容器技术在让 ML/AI 模型进入生产中起到了什么作用?为了回答这个问题,我将借助 Domino 数据科学平台中的一个例子。对于那些不熟悉 Domino 的人来说,快速了解一下背景:这是一个数据科学家运行他们的代码(例如 R、Python 等)、跟踪他们的实验、分享他们的工作以及部署模型的平台。Domino 运行在本地或所有主要的云上。
在我们的示例中,考虑一个出于安全目的需要在内部进行模型研究的组织。但是,该组织希望将生产模型部署到 AWS SageMaker,以满足其客户组织的 IT 需求。Domino 可以使用容器及其 SageMaker 导出功能来满足这个组织的需求。我鼓励您阅读发布在 AWS 合作伙伴网络上的博客How to Export a Model from Domino for Deployment in Amazon sage maker,以便更深入地了解 SageMaker Export。
在这种情况下,Domino 将安装在本地,并像往常一样通过容器化实验协调协作研究,所有这些都通过利用容器环境库的本地硬件运行,这些环境也存储在本地并由 Domino 管理。模型通过验证后,Domino 将整个模型环境打包到一个 SageMaker 兼容的容器中,导出到 AWS SageMaker 进行部署,而不是部署到 Domino 用于研究的同一本地服务器场。
Figure 1 – Options for deploying and hosting models created in Domino.
这就是现代组织所需要的灵活性。他们希望避免局限于任何一种架构。就像容器最初为配置环境的数据科学家提供灵活性和自由度一样,它们也可以为组织提供跨平台和架构工作的灵活性和自由度。随着数据科学继续通过 CI/CD 和模型验证等原则强化 MLOps 管道,很容易相信容器也将在这一演变中发挥关键作用。
根据现代需求扩展机器学习
原文:https://www.dominodatalab.com/blog/scaling-machine-learning
这是 ThinkFast 的创始人&首席执行官 Hristo Spassimirov Paskov 在举办的数据科学专题会议。
在丹麦领先的保险公司之一扩展 MLOps
原文:https://www.dominodatalab.com/blog/scaling-mlops-at-one-of-denmarks-leading-insurers
编者按:这是分享开发企业数据科学战略的公司最佳实践的系列文章的一部分。一些文章将包含关于他们使用 Domino 的信息。
最近,在 NVIDIA 的 GTC 会议 期间,我参加了一个小组讨论,讨论保险行业以及 Topdanmark 的 MLOps 规模。
作为丹麦第二大保险公司,我们的目标是提高保险为消费者服务的标准。我们希望为消费者提供更好、更快、更满意的保险体验——无论我们是在制定政策决策还是处理索赔——我们使用机器学习和人工智能来实现这一点。
当我们在 2017 年推出我们的机器学习卓越中心时,我们进行了概念验证,以了解我们如何应用这些技术。我们证明了我们可以使用自然语言处理文档来自动化将近一半的选择过程。由于我们的大部分流程都包含文档,这种潜力对我们来说变得很明显。我们还证明了我们可以应用图像分析(即计算机视觉),这样我们的核保和理赔专家就可以在最需要的地方运用他们的专业知识。
但是,为了将模型集成到我们的运营工作流程中,并在 2018 年前将我们的第一批模型投入实时生产运行,我们必须克服技术和非技术两方面的挑战。以下是我们在 NVIDIA GTC 会议期间重点讨论的一些领域。(你可以在这里 聆听整个讨论 。)
确保版本控制和再现性
当我们第一次开始努力时,我们立即意识到,如果没有数据科学平台,我们将在各个机器上到处都有模型,这将使我们的工作难以扩展。我们的早期步骤之一是与德勤顾问合作,确定一个可以帮助我们控制版本、重现结果、访问资源以及分离测试和生产环境的平台。我们认为 Domino 的企业 MLOps 平台是代码优先数据科学家加速研究和扩展的理想平台。例如,我们的团队现在可以轻松地在云中旋转 NVIDIA GPUs,使用 Domino 来选择他们需要的大小和功率,以便他们可以快速测试新的想法。它使我们的数据科学家能够专注于他们擅长的领域-数学建模和数据分析-在安全的环境中使用他们选择的任何工具或方法处理数据,在这样的环境中,我们可以记录工作并确保我们产生影响。
数据科学部门内部经常会讨论是构建还是购买数据科学平台。我们不认为建立一个平台是一个好的选择。从头开始构建可能需要很长时间,并且您需要大量的资源来维护和不断添加新的功能。有了 Domino,我们可以从他们的全球经验中受益,获得我们可能没有想到会要求的新特性,但这些新特性会给我们带来巨大的好处。
投资于机构知识
在建立我们的机器学习卓越中心的过程中,我们也很快意识到我们需要建立一个专家社区,并使他们易于合作。我们与一所领先的大学合作,为我们的团队开设了语言和图像分析高级方法的大师班。我们在几个方面进行了投资——具有擅长解释数据源的领域专业知识的从业者、对高级技术有深刻理解(博士级别)的专家,以及软件专家。我们的大师班确保每个人都对自然语言处理和图像分析有深刻的理解,这两者对我们的成功至关重要。今天,我们继续拓宽我们的专业知识,与欧洲各地在自然语言处理和图像分析方面具有相同技能水平和相同挑战类型的社区交流知识。
此外,当我们选择 Domino 平台时,我们将协作作为核心需求。 通过使 我们的数据科学家更容易分享和发展彼此的想法,我们创建了一个社区,团队成员在其中不断相互激励,推动我们的能力向前发展。
管理模型漂移
我们关注算法的实时曝光,这在技术上比仅仅运行批量模型要求更高。因此,我们需要有信心保持算法的准确性和质量,并证明这些自动化决策的价值。这是一个挑战,我们必须用熟练的人员和先进的模型监测技术来解决。例如,我们有一种算法,它每年为我们节省数百万美元。在我们使用 Domino 来监控模型漂移之前,我们让两位数据科学家花了三个多月的时间来挖掘数据源,以确定一个提供给算法的数据集没有正确格式化,从而导致了模型漂移。今天,我们可以立即看到我们是否有模型漂移以及在哪里寻找,节省了我们大量的时间。
有些人认为你可以将这项工作作为传统 ITOps 流程的一部分留给 IT 部门。但是,通常情况下,它不知道数据源的变化会如何影响算法。我认为,如果您要展示您正在交付预期的价值并快速解决任何问题,企业 MLOps 平台中的实时模型监控功能至关重要。
平衡风险和创新
当我们扩展我们的工作时,我们必须确保考虑到潜在的风险。当然,我们会设置围栏,以确保我们对数据的使用符合所有监管和合规指导原则。但除此之外,我们还与我们的法律团队合作,围绕我们的数据科学家可以利用数据和机器学习做些什么来制定政策。我们最重要的问题总是:我们能否站在客户和投资者面前,捍卫我们的工作是合理的?
在过去的四年里,我们取得了长足的进步。通过投资于我们的数据科学社区,并消除他们前进道路上的流程和技术障碍,我们在创新业务方面取得了巨大的收益。例如,我们现在可以立即批准 25%的汽车索赔。在不到两秒钟的时间内,我们还可以批准高达 65%的承保,这是我们向个人客户提供的风险波动最大的保险之一。此外,我们可以不断试验和迭代,以提升我们算法的性能,同时与我们的业务领导者合作,提供更多可以改变我们客户体验的解决方案。
了解更多信息
Domino 5.0:安全地存储凭证以支持最严格的法规遵从性要求
原文:https://www.dominodatalab.com/blog/secret-store
介绍 Domino 5.0 中的秘密商店
Domino 不断创新,使我们的企业 MLOps 平台尽可能安全。我们做到这一点的一个最基本的方法是确保您的数据只能由那些应该有权访问的人访问。即使是需要访问整个平台的管理员,也不应该能够访问特定的数据。这一点尤其重要,因为我们的许多 客户 在受监管行业工作,他们的数据存储必须符合标准,例如【FIPS】HIPAA和 PCI 。考虑到这一点,Domino 引入了一个秘密存储来加密静态的敏感数据,并帮助确保组织能够遵守安全标准。
Domino 现在使用 HashiCorp Vault 将敏感的用户数据,包括凭证、API 密钥和新的数据源访问秘密存储在一个安全的秘密存储中。存储在 Secret Store 中的数据是静态加密的——如果您在 Kubernetes 集群中启用了 Istio 到它的连接是用 TLS 保护的。
Domino 中的 Secret Store 为安全团队提供了生成已被访问的机密日志的能力,然后如果有可疑的活动——或者更糟糕的是,完全违反安全性——就撤销这些机密。您的安全工程师晚上会睡得更好,即使您的组织不在受监管的行业中。
它是如何工作的
新安装的 Domino 将把预先配置好的 HashiCorp Vault 实例部署到您的 Kubernetes 集群中。然后,Nucleus 服务(主 Domino 用户界面)根据 Vault 服务进行身份验证,并被授权在 Vault 中读取和写入键值对。
但是,许多组织已经安装了 Vault,并且不想管理第二个服务。其他组织可能尚未部署 Vault,但希望能够灵活地将安装与现有的 HSM 和 PKI 基础架构相集成,并定义自己的策略。在这两种情况下,Domino 都可以配置为使用外部保险库,使用组织现有的加密和密钥轮换策略。然后,Domino 可以通过文字令牌认证或令牌路径认证来访问外部 Vault 实例。
Domino 中创建用户环境变量、API 键等的屏幕。,与以前一样,但是后台基础结构的变化只是改变了数据提交后的存放位置。
例如,要设置一个用户环境变量,进入 Domino UI 左下方用户菜单中的“Account Settings”。
在“用户环境变量”部分,添加新环境变量的键和值,然后单击“设置变量”。当前的 Domino 用户和 DevOps 及其他产品的用户应该对这个过程很熟悉。
一旦您单击“Set variable”,Domino 的 Nucleus 服务将把键-值对写入秘密存储,该对被加密保存在其数据库中。当您需要在项目中引用您的环境变量时,Domino 反转这个过程,从秘密存储中读取键值对,并将值插入到您的项目中。从用户的角度来看,这个过程很简单,因为所有的艰苦工作都是为他们做的。
结论
Domino Data Lab 很高兴将 Secret Store 引入 Domino——它扩展了 Domino 中已经存在的安全措施,并简化了对公司政策和行业标准的遵从。升级到 Domino 5.0 ,你会得到一个预配置的实例,你可以立即开始保存秘密。对于需要更大灵活性的组织,Domino 可以连接到符合既定策略的现有实例。不管怎样,Domino 已经准备好帮助所有组织满足最严格的安全标准。
Domino 是 企业 MLOps 平台,它无缝集成了代码驱动的模型开发、部署和监控,以支持快速迭代和最佳模型性能,因此公司可以确保从其数据科学模型中实现最大价值。
在社会科学中寻求再现性:探索与发现
原文:https://www.dominodatalab.com/blog/seeking-reproducibility-within-social-science-search-and-discovery
NYU 大学教授、经济学家、柯勒律治倡议的联合创始人 Julia Lane 在 Rev. Lane 上发表了题为“数据在哪里:社会科学搜索的新方法&发现”的演讲,描述了柯勒律治倡议正在采取的应对科学再现性挑战的方法。该方法旨在为政府分析师和研究人员提供远程访问安全数据设施中的机密数据的机会,并通过应用数据分析培训计划建立分析能力和协作。本文提供了 Lane 在 Rev 的演讲的摘要和文字记录。非常感谢 Julia Lane 在发表之前对本文提供了反馈。
会话摘要
科学正面临着研究的可重复性挑战,这阻碍了数据科学家和研究人员加快工作速度和提供影响其组织的见解的能力。自从多米诺成立以来,我们通过持续更新平台的协作功能,解决了可再现性问题,以支持我们的客户,并为博客和行业活动上的整体公众讨论做出了贡献,包括修订。在 Rev 会议“数据在哪里:社会科学搜索&发现的新方法”中,Julia Lane 就柯勒律治计划如何通过为政府分析师和研究人员提供对机密数据的安全远程访问来应对可再现性挑战,以及如何通过应用数据分析培训项目建立分析能力和协作提供了见解。目标是使政府机构能够利用更高质量的数据做出更好的循证决策。Lane 忠于再现性的精神,讲述了如何使用这种方法来允许认可的分析师重用和吸收见解,以加速他们的工作。莱恩讨论了柯尔律治试图回答的问题;提高与使用关联数据相关的分析的严密性;柯勒律治如何建立和测试一套工具,用来识别哪些数据被用来解决不同的研究问题;以及当新的研究人员带着新的项目访问安全环境时,如何使用该方法来通知他们。Lane 在会议结束时谈到,该计划的目的是“建立基于证据的政策制定,从而获得更好的知识、更好的政策、更好地分配资源,并减少收集信息的成本和负担。”
本次会议的一些亮点包括
- 如何利用现代方法以更低的成本获得更高质量的数据,以帮助支持循证决策。
- 共享机密政府微观数据的独特挑战,以及访问在生成高质量推断中的重要性
- 风险-效用权衡的务实评估,或更多数据使用导致的风险与泄露或重新识别风险的权衡
- 讨论柯勒律治如何利用培训课程培养政府机构工作人员应对数据质量挑战的能力
- 研究人员培训与安全环境中的访问配对的重要性。
书面记录中提供了更多见解。
副本
朱莉娅·莱恩:
我是一名训练有素的经济学家,这也是我的工作重点。让我告诉你这个故事。我在 NYU,你可以从我浓重的纽约口音听出来,我职业生涯的大部分时间都在联邦统计机构工作,这些机构为你提供十年一次的人口普查、失业率、国内生产总值等等。在使用这些数据进行决策时,您面临的一个主要挑战是,收集数据的成本非常高,而且数据的质量正在下降。
你们中有多少人知道十年一次的人口普查将在明年进行?好吧。你认为美国大约有多少人?3.5 亿,3.6 亿,也许明年我们会发现更多。你认为收集…数一数这些人需要多少钱?三亿六千万美元。试试北边。20 亿美元,有人出 20 亿吗?好吧。有人想再高点吗?更高,更多,更多。170 亿美元,好吧,去数人数,问他们 10 个,也许 11 个问题。对吗?我们面临的挑战是数据质量正在下降。人们没有回应,他们给出了不好的回应,等等。
大约三年前,循证决策委员会成立,它汇集了来自全国各地的专家,研究如何开发数据,以更高的质量和更低的成本做出决策。他们提出了一系列建议,并于今年被纳入循证决策法案。
他们要求 NYU 建立一个环境来为委员会的审议提供信息,并展示如何将来自多个来源的数据汇集在一起,并在质量水平上理解它们,以便能够分配资源来做出决策。这就是为什么它被称为循证政策。
当然,整合数据的挑战在于数据,尤其是人类的数据,是相当复杂的。当它来自多个不同的来源时,就不仅仅是将它们混合在一起的问题了。你需要了解它们是如何产生的,问题是什么等等。除此之外,我们还建立了培训课程,培训政府机构工作人员、研究人员和分析师,他们希望处理数据、解决问题……以及如何处理数据。
挑战来了。当你处理复杂的数据时,当它是机密的时,因为它是关于人类的数据,所以很难找出以前对他们做过什么。每次有人开始处理数据时,都是一片空白。你搞不清楚是怎么回事。我们必须解决的挑战是我今天要和你们谈的挑战,那就是当你登陆一个新生成的数据集时,你如何发现,它没有以任何方式被策划....我怎么知道里面有什么,我怎么知道还有谁用过它?如果你仔细想想,这是一个 Amazon.com 问题,对吗?
杰夫·贝索斯赚了这么多钱的原因是他解决了弄清楚书里有什么的问题,通过其他人使用这本书的方式产生的信息来弄清楚,而不仅仅是人们生产这本书的方式。我们想要做的是为数据建立一个 Amazon.com,这就是我今天要讲的故事,让你们对我们试图建立的平台有一些了解。
我所说的新类型的数据是什么?过去,数据通常是由填写调查表的人生成的,对吗?一个统计机构收集它,策划它,记录它,发出它。也可能是管理记录,即从政府项目管理中生成的记录,如税务数据。如今,我们也在关注新类型的数据,由传感器生成的数据集,由您的刷卡生成的数据集,如零售贸易数据、万事达卡或 IRI 数据或您的 DNA。这些是复杂的数据集。它们不是精心策划的,但它们可以增加很多关于如何分配政策的理解。
这些数据需要共享。我们面临的挑战是,当它是人类的机密数据时,有许多关于分享知识的禁令,这是很正确的。与您习惯处理的开放数据世界相比,一切都更加孤立。例如,如这张幻灯片所示,每次有儿童死亡时,巴尔的摩市的委员们都会聚在一起,分享他们接触到的所有政府项目的信息。可能是住房、教育、福利、寄养等等。但他们唯一分享知识的时候是孩子死了的时候。我们在这里试图做的是建立一个知识基础设施,使我们能够在儿童死亡之前分享知识,以改善政策。
但挑战是,这是一个风险效用权衡,使用机密数据的价值在于,越多的人和越多的人使用它,政策就越有利,但泄露的风险也越大。你必须做的是,你必须尝试和管理这种披露。如果可以,你真的可以制定更好的政策。新西兰是一个很好的例子,这些幻灯片是由前总理比尔·英格利希制作的。像大多数国家或城市一样,你知道,有三大支出领域:教育、卫生、养老金。如果你想更好地分配资源,你要做的是更好地利用从多个政府项目中产生的综合数据。
例如,我所说的集成数据是什么意思?这是一个孩子,这个孩子的年龄在这里,底部是纳税人的成本,不仅仅是其他东西。你看看这个孩子如何打击儿童,青少年,家庭服务,虐待,寄养,教育,青少年司法,收入支持或福利,对不对?孩子出生,到大约两岁半的时候出现在儿童、青少年、家庭服务和虐待通知中。你开始看到孩子在这里,更多的虐待,更多的家庭服务的访问。开始接受教育,大约 9 岁,10 岁,11 岁,断断续续的接受教育,17 岁时被送去看护,他参加了青少年司法,然后去了收入补助。如果你把这些信息放在一起,这是很容易预测的。我不需要在这里反复讨论与之相关的问题。
那种信息,如果你把它放在一起,理解它,可以帮助分配资源。这是获得学校证书,教育资格。如果孩子在 18 岁时得到它,现在,在未来会有很好的状态。如果他们没有得到它,这是一个非常糟糕的指标。你可以根据数据进行排序,你可以对一个孩子在 18 岁之前获得或未获得学校证书的可能性进行排序,你可以找出哪些孩子没有获得证书的风险最高。如果你分配资源远离,你知道,像我的孩子一样的孩子,他们不需要干预。他们不需要这些孩子需要的服务。你可以重新分配资金,你可以极大地降低纳税人的成本,改变这些孩子的生活。
正是这种观点导致了循证决策法案的产生。最重要的是,你如何在一个信息交换中心安全地将数据放在一起?我所说的这种工作可以由政府分析师和研究人员以一种安全的方式实施,从而将重新鉴定的风险降至最低。
我们建立了一个清算所。我们称之为行政数据研究机构。我不喜欢清算所这个术语,原因有很多。它必须是项目…任务特定的,所以我更喜欢设施这个术语。但关键的事情不仅仅是建立信息交换机构,还要建立一个与之配合的培训项目。
我不会讲太多细节,但基本的想法是你会有一个安全的环境。当然,一个主要的挑战是你必须有遥测技术来判断谁在访问它。但是你也需要在数据周围有元数据。你需要有一个丰富的上下文,因为如果它只是 0 和 1,我不知道它是什么。你们中许多使用过开放数据的人会注意到,开放数据在质量方面可能有点不可靠。挑战的一部分是数据生成的方式,这有点…有大量的数据被放在一起进行汇总,并且没有任何电缆连接到微数据引擎。你真正需要的是你希望数据用户参与到元数据文档中。
换句话说,再一次,用统计系统做类比,机构产生数据的方式作为人类使用,他们非常辛苦地创建元数据文档,你得到一个关于所有变量的意义,它们是如何产生的等等的报告。高度手工的过程。我们想要做的是,我们想要生成一种自动的方法来找出数据中有什么信息,以及这些信息的质量如何。让我给你一点味道。在其中一个班里,我们有前科犯的资料。纲领性的问题是,获得工作的机会和社区特征对前罪犯的收入和就业结果有什么影响,以及他们随后的再犯率。
这就是我们所处的位置…为什么这一切都在[听不清 00:14:09]上,它们在来回移动。如果能把隐性知识编纂成册,这样当人们开始处理数据时,元数据文档就会自动生成,就像 Amazon.com 一样,这不是很好吗?对吗?这是基本的想法。你知道,不是你说,“数据从哪里来,它是如何根据它产生的方式被记录的,”而是社区告诉你一些关于数据是什么的事情。
好吧。这是我的挑战。我想弄清楚,当我登陆一个数据集时,还有谁在什么主题和什么结果上处理过数据。然后我想创建一个贡献知识的社区。这有点像数据的 Amazon.com。
好吧。我要怎么造一台能做到这一点的机器呢?还记得那些统计机构吗,我在开始的时候抨击过他们,但是,你知道,这些都是很棒的人。这些人工作努力,很棒,有很大的动力,但他们就像是工业革命前的数据工厂。现在,我们正在尝试建立一个现代化的数据工厂,一个自动化元数据生成的现代化方法。
本质上,我们要尝试并弄清楚如何做的是我们要确定问题的范围,将它提交给计算机科学社区,自然语言处理,机器学习社区,并说,“你能想出如何从中学习,自动化,冲洗和重复吗?”这是核心观点。我们感兴趣的是谁以前处理过这些数据,识别他们,然后弄清楚他们用这些数据做了什么。如果你想一想,所有这些知识都包含在出版物中,无论是出版的作品、工作论文还是政府报告。它在某个文件里。在那份文件中,如果是实证的,有人说,“这是我的问题,这是我要用它做什么,这是描述数据的部分。”
我想做的是,我想让计算机科学家们帮我找出数据集在哪里,以及语义上下文将把我指向哪里。好吧。然后我会让整个社区告诉我他们这样做是对还是错,然后从那里解决它。
本质上,我们与美国农业部合作的一个社区。但是不管怎样,美国农业部,你会看到他们关注的一个东西是 NHANES,营养教育数据集。你会看到这里,这里有写着分析样本的东西。他们说了一些关于数据的事情。我们想要的是计算机科学家去找出数据在哪里。
我们就是这么做的。我们举办了一场比赛。我们手动收集了一个语料库。社会科学数据仓库,公共使用的,坐落在全国不同的地方。一个是在密歇根大学,你有 ICPSR。有三个人,他们每天的工作是阅读论文,并手动说出哪个 ICPSR 数据集在该语料库中。然后他们把它写下来,然后把它贴出来,说已经做了什么。我们收集了这些语料,然后进行了一场比赛。我们有来自世界各地的 20 支队伍参赛。他们中的 12 个人提交了代码,这里有四个非常善良的人帮忙做了广告,非常感谢。然后我们有四个决赛选手。实际实现的模型是…我们很惊讶他们居然能做到这一点。
好好想想。如果我拿起一份出版物,它……你能告诉我里面引用的数据集是什么吗?答案当然是否定的。基线是零。胜出的算法所做的是,它正确识别了出版物中 54%被引用的数据集。这太神奇了,对吧?
现在还有很多工作要做。我已经跳过了所有的错误和问题等等,但它仍然是超级令人鼓舞的,对不对?因为现在,一旦我把数据集链接到出版物,这给了我丰富的背景,这给了我找到其他一切的潜力,因为有很多工作是由我在数字科学,UberResearch 的同事在出版物上做的。它们与过去 10 年的出版物相关联:拨款、政策文件、专利、临床试验等等。一旦我拿到那对,我就要去比赛了,对吗?这使我能够为一个特定的出版物找出围绕它的一切。这是我的目标。
围绕这一点,现在有许多工作要做。但是,举个例子,这是一个 Dimensions 网站,我没有时间去直播,因为我会被吼,但是我可以给你直播,你可以输入数据集,你会得到很多相关的信息。你找出研究人员是谁,相关主题是什么等等。这将给我带来我一直在寻找的知识。这是一个相当有缺陷的模型,尽管它是惊人的。你知道,有大量的工作要做。
现在我们想做的是去把那一对清理干净。最大的问题是,你可能已经发现了这一点,但我们搜索的是有标题的数据集。它被称为美国社区调查或 NHANES 或 PSID 或类似的东西。如果有很多人类处理的数据集,他们会说,“哦,我们在处理 LinkedIn 的数据,我们在处理 Twitter 的数据,”这些数据没有标签,或者没有零售 IRI,零售扫描仪数据,它们实际上没有一个你可以找到的标题。我们需要从语义语境中获得更好的知识。这意味着我们需要开发一个语料库,一个可以训练机器学习算法的带标签的语料库。
我们正在研究数字科学中的维度,我们也试图以多种不同的方式获得人类策划的输入。一个是与出版商合作,[听不清 00:22:01],当作者提交出版物时,他们说,“你能给我们一些关键词吗,”我们可以告诉他们,“给我们一些…告诉我们那里有什么数据集。”对吗?如果他们告诉我们那里有什么数据集,我马上就能得到一个二元组。对吗?然后我就可以训练了。
当研究人员进入一个安全的环境,然后他们询问有什么数据集可用时,你也可以让他们贡献他们的知识。在课堂上,我们通过 300 名政府分析师,他们是主题专家,我们可以让他们告诉我们他们对可用于公共利益的数据集的了解。如果你们中有人是社会科学家,请到这里来,我们要求我们的同事来填写。事实证明,你知道,如果我们得到一千个精心策划的公共数据集文档,这将足以看到下一次迭代。
这是我们接下来要去的地方。给我们带来替代数据的那些数字科学家。事实证明,人们真的喜欢…他们去那个闪亮的小徽章,Altmetrics 徽章,并点击它。我们正在设计的是,如果你现在输入并寻找一个数据集,我们也与德意志联邦银行合作,它将会调出相关的出版物。这里的想法是,每一个被拉起的出版物,你得到那里的数据集上下文,它会说有多少专家,多少论文,多少代码书,有多少注释与它相关联。然后当你点击它,弹出更丰富的上下文,我可以找到所有的论文,其他论文,专家,代码书,注释和相关的数据集。然后这里是行动的号召,对吗?我们不需要让每个人都响应,但我们会尝试一下,看看我们在这方面做得如何。然后,当然,把它输入到这个方法中。
最后一步,也是与布莱恩·格兰杰和费尔南多·佩雷斯合作的一步,是将其构建到 Jupyter 笔记本中。Fernando 和 Brian 一直在做的一件事是,他们试图让练习册更具协作性。因为现在,这只是一个单一的计算叙事。他们也试图与他们合作,为了我所说的所有原因,能够与机密的微数据合作。
基本思路是这样的。目前,当你登陆一个数据集时,如果你幸运的话,你所得到的是数据集产生的方式所产生的数据。类比的例子还是杰夫·贝索斯。当你找一本书时,你发现了什么?ISBN 号,作者,书名,出版商,对吗?那是元数据,顺便说一句,书是制作出来的。你真正想要的是关于数据本身的知识。我不需要去书店寻找答案,我只需要找到像我一样的人使用了这些信息。同样,我们正在将这一点构建到 Jupyter 笔记本中,我们 Jupyter 团队正在与我们的团队合作,这里的概念是记住我们曾经的松散通信,将其构建到注释中。这是 Brian 和 Fernando 刚刚放入的内容,但将其构建到注释中,隐性知识被编码并构建到数据基础架构下的图模型中。
这就是故事的梗概。我们希望能够建立基于证据的决策,从而获得更好的知识、更好的政策、更好地分配资源,并降低收集信息的成本和负担。我们首先构建了一个安全的环境,并围绕它培养了员工能力。我们现在正处于这个阶段。我们的目标是建立一个平台。
如果你想了解更多信息,我们在风景优美的纽约州 NYU 招聘员工。很多信息都在这里,也在我们的网站上。你可能想知道为什么它被称为柯勒律治倡议。你们中有多少人听说过塞缪尔·泰勒·柯尔律治?太好了。好吧。因《老水手之歌》而出名,对吗?我们试图找出这个东西的名称,我们想,“为公众利益服务的数据科学”,[blech]“基于证据的政策”,[blech]。柯勒律治倡议似乎是显而易见的,对不对?《古舟子咏》“水,到处都是水,也没有一滴可以喝”,对吗?在这里,它是“数据,到处都是数据,我们必须停下来思考。”这就是为什么它被称为柯勒律治倡议。
为了便于阅读,本文经过了编辑。
解决 K 武装土匪的半统一策略
原文:https://www.dominodatalab.com/blog/semi-uniform-strategies-for-solving-k-armed-bandits
在 之前的博客文章 中,我们介绍了 K 臂强盗问题——一个在不确定的时间内分配有限资源的简单例子。我们看到了随机强盗的行为,并证明了随机拉武器产生的奖励接近预期的奖励分布。
在这篇文章中,我们进一步发展了这个概念,并介绍了可能带来更好回报的更聪明的策略。
ε优先策略
Epsilon-first 是一个两阶段策略,代理从纯粹的探索阶段开始,然后是开发阶段。探索阶段发生在第一次试验期间,其目的是获得足够的知识来确定提供最高预期回报的臂。一旦这个最佳臂被识别,算法就在剩余的回合数中播放它((1-\ε)T )。在探索阶段,动作要么统一从(\mathcal{A})中选择,要么按顺序执行,重复循环(\mathcal{A})直到阶段结束。在后一种情况下,我们通常对探索阶段执行(NK) ((N \in \mathbb{N}))次迭代,这保证了所有报酬分布的相等表示。这种方法在算法 1 中给出。
算法 1-ε-第一土匪
我们看到,该算法最初运行一个探索阶段进行(NK)次迭代,在每个时间步存储奖励。在探索结束时,它会将所有可能的武器储存的奖励相加,并选择到目前为止已累积最高奖励的武器。然后,该算法切换到开发阶段,并为所有剩余的时间步长播放最佳手臂。查看模拟结果(图 1 ),很明显,当针对相同的报酬分布进行测试时,ε优先策略明显优于随机 bandit。我们看到,这两种算法最初表现相似,这是由于在ε优先算法的探索阶段臂的统一选择。然而,一旦 epsilon-first 过渡到开发阶段,它立即开始累积更高的奖励,产生平均即时奖励(\ bar { R } \约 0.66)和累积奖励(G \约 665) -与随机 bandit 方法相比,这是一个显著的改进。
图 1——随机 vs 用(K=3)、(T=1000)、和(N=2)进行第一次盗匪模拟。平均 10 场比赛,每场 100 分。
我们需要认识到,尽管 Epsilon-first 与随机选择相比表现更好,但有几个重要问题代表了实质性的缺点:
- 太短的探索阶段可能导致选择次优的贪婪行为。
- (\epsilon)的选择是外部的—目前没有关于探索阶段应该执行多长时间的规定。这个问题加剧了前一点。
- ε优先策略的一个关键假设是报酬分布是稳定的。如果违反了这一假设,那么代理很有可能锁定错误的手臂,直到时间用完。
ε-贪婪策略
ε贪婪是对ε优先策略的一种可能的改进。这种方法的关键区别在于,勘探更均匀地分布在(T)上,而不是有明确的勘探和开采阶段。这是通过在每个时间步(t \in T)执行随机动作来实现的,以便对所有试验的(\epsilon)比例执行探测,并在((1-\epsilon))比例的试验中利用最佳臂。(\ε)的值通常选择为 0.1。
算法二-ε-贪婪大盗
在探索阶段,以均匀的概率随机选择一个分支,在开发阶段,该策略使用具有最高估计期望回报的分支。算法 2 概述了 epsilon-greedy 策略的实施,图 2 将 epsilon-greedy 的性能添加到仿真结果中。我们清楚地看到,ε-greedy 的回报最初在随机策略的范围内,但随着算法执行若干轮探索,其对预期回报的估计提高了,回报开始优于随机策略和ε-优先策略。
图 2——随机 vs .ε-第一 vs .ε-贪婪土匪模拟用(K=3),(T=1000),和(N=2)。平均 10 场比赛,每场 100 分。
摘要
在这篇文章中,我们研究了两种针对 K-武装匪徒的半一致策略-ε-优先和ε-贪婪。我们展示了它们都比我们在上一篇文章 的 中提到的完全随机策略表现得更好。然而,半一致方法的一个问题是,这些策略不能根据观察到的回报更新它们的探索机制。直觉上,能够根据目前的回报调整决策的算法应该表现得更好。一个简单的自适应示例可以是一种算法,该算法可以动态地确定 arm 表现不佳,根本不再可行。这种方法以及其他适应性方法将是以后文章的主题。
额外资源
注册一个免费的多米诺账户,获得算法 1 & 2 的实现和额外的代码示例,让你运行上面讨论的模拟。点击下面的按钮,一旦你的帐户被创建,打开强化学习项目开始。文章中讨论的所有策略都可以在 Bandits.ipynb 笔记本中找到。
SHAP 和 LIME Python 库:第 1 部分——很好的解释者,各有利弊
原文:https://www.dominodatalab.com/blog/shap-lime-python-libraries-part-1-great-explainers-pros-cons
这篇博客文章提供了对 SHAP 和 LIME Python 库的简要技术介绍,随后是代码和输出,强调了各自的优缺点。如果对这篇文章的视觉演示感兴趣,可以考虑参加网络研讨会。
介绍
模型可解释性是当今数据科学界的一个优先事项。作为数据科学家,我们希望防止模型偏差,并帮助决策者了解如何以正确的方式使用我们的模型。数据科学的领导者和高管们注意到现有的和即将出台的立法,这些立法要求模型提供它们如何工作以及如何避免错误的证据(例如, SR 11-7 和人工智能的未来法案)。
这篇博文的第 1 部分提供了对 SHAP 和 LIME Python 库的简要技术介绍,随后是代码和输出,强调了各自的优缺点。第 2 部分将通过将这些库应用于各种 Python 模型来更详细地探索这些库。这些帖子的目标是让读者熟悉如何在实践中使用这些库,以及如何解释它们的输出,帮助您在自己的工作中利用模型解释。
SHAP 对莱姆
SHAP 和莱姆都是模型可解释性的流行 Python 库。SHAP (SHapley 附加解释)利用 SHapley 值的概念对模型特征影响评分。一个 Shapley 值的技术定义是“一个特征值在所有可能的联合中的平均边际贡献。”换句话说,Shapley 值使用所有可能的输入组合来考虑实例的所有可能的预测。由于这种详尽的方法,SHAP 可以保证像一致性和局部准确性的属性。 LIME (局部可解释模型不可知解释)围绕每个预测建立稀疏线性模型,以解释黑盒模型如何在局部附近工作。在他们的 NIPS 论文中,SHAP 的作者展示了 Shapley 值提供了准确性和一致性的唯一保证,并且石灰实际上是 SHAP 的子集,但是缺少相同的属性。为了进一步研究,我找到了 GitHub 站点 SHAP GitHub 和 LIME GitHub 有用的资源:
那么为什么会有人使用石灰呢?简单来说,石灰速度快,而 Shapley 值计算时间长。对于你们这些统计学家来说,这种情况让我想起了费希尔的精确检验和列联表的卡方检验。费希尔的精确测试提供了最高的准确性,因为它考虑了所有可能的结果,但它永远需要在大型表上运行。这使得卡方检验,一种基于分布的近似方法,成为一种很好的替代方法。
SHAP Python 库通过使用近似和优化来帮助解决这个计算问题,在寻求保持良好的 Shapley 属性的同时大大加快了速度。当您使用 SHAP 优化模型时,运行速度非常快,并且输出准确可靠。不幸的是,SHAP 还没有针对所有模型类型进行优化。
例如,SHAP 有一个在树上运行快速的树解释器,如来自 XGBoost 和 scikit-learn 的梯度增强树和 sci-kit learn 的随机森林,但对于像 k-nearest neighborhood 这样的模型,即使在非常小的数据集上,它也非常慢。这篇文章的第二部分将回顾 SHAP 解释者的完整列表。下面的代码和注释记录了 SHAP 图书馆在波士顿住房数据集上的这一缺陷。这段代码是我创建的 Jupyter 笔记本的一个子集,用来浏览 SHAP 和莱姆的例子。该笔记本托管在 Domino 的试用网站上。点击此处查看、下载或运行笔记本。您需要设置一个免费帐户才能登录。
# Load Libraries
import pandas as pd
import sklearn
from sklearn.model_selection import train_test_split
import sklearn.ensemble
import numpy as np
import lime
import lime.lime_tabular
import shap
import xgboost as xgb
import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d, Axes3D
import seaborn as sns
import time
%matplotlib inline
# Load Boston Housing Data
X,y = shap.datasets.boston()
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2, random_state=0)
X,y = shap.datasets.boston()
X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2, random_state=0)
# K Nearest Neighbor
knn = sklearn.neighbors.KNeighborsRegressor()
knn.fit(X_train, y_train)
# Create the SHAP Explainers
# SHAP has the following explainers: deep, gradient, kernel, linear, tree, sampling
# Must use Kernel method on knn
# Summarizing the data with k-Means is a trick to speed up the processing
"""Rather than use the whole training set to estimate expected values, we summarize with a set of weighted kmeans,
each weighted by the number of points they represent. Running without kmeans took 1 hr 6 mins 7 sec.
Running with kmeans took 2 min 47 sec. Boston Housing is a small dataset.
Running SHAP on models that require the Kernel method becomes prohibitive."""
# build the kmeans summary
X_train_summary = shap.kmeans(X_train, 10)
# using the kmeans summary
t0 = time.time()
explainerKNN = shap.KernelExplainer(knn.predict,X_train_summary)
shap_values_KNN_test = explainerKNN.shap_values(X_test)
t1 = time.time()
timeit=t1-t0
timeit
# without kmeans a test run took 3967.6232330799103 seconds
"""t0 = time.time()
explainerKNN = shap.KernelExplainer(knn.predict, X_train)
shap_values_KNN_test = explainerKNN.shap_values(X_test)
t1 = time.time()
timeit=t1-t0 timeit"""
# now we can plot the SHAP explainer
shap.force_plot(explainerKNN.expected_value, shap_values_KNN_test[j], X_test.iloc[[j]])
在基于 Boston Housing 数据集的 knn 模型上运行 SHAP 花费了一个多小时,这是一颗难以下咽的药丸。如果我们牺牲一些准确性和可靠性,首先用 k-means 算法汇总数据,我们可以将时间缩短到三分钟。作为替代方法,我们可以使用石灰。LIME 使用相同的 knn 模型即时运行,不需要使用 k-means 进行汇总。请参见下面的代码和输出。请注意,LIME 的输出不同于 SHAP 输出,尤其是对于要素 AGE 和 b。由于 LIME 不具有与 Shapley 值相同的准确性和一致性属性,并且 SHAP 在计算影响得分之前使用 k-means 汇总,因此很难判断哪个更接近正确答案。
exp = explainer.explain_instance(X_test.values[j], knn.predict, num_features=5)
exp.show_in_notebook(show_table=True)
虽然 LIME 在 knn 模型示例中提供了一个不错的替代方案,但不幸的是,LIME 并不总是能够扭转局面。它并不适用于所有型号。例如,LIME 不能处理 XGBoost 使用 xgb 的要求。输入数据上的 DMatrix()。下面是用 XGBoost 模型调用 LIME 的一次尝试。有一些潜在的方法可以让 LIME 在这个模型上工作,包括创建自己的预测函数,但关键是 LIME 不会自动与 XGBoost 库一起工作。
xgb_model = xgb.train({"objective":"reg:linear"}, xgb.DMatrix(X_train, label=y_train))
max_features="auto", max_leaf_nodes=None,
min_impurity_decrease=0.0, min_impurity_split=None,
min_samples_leaf=1, min_samples_split=2,
min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=False,
random_state=None, verbose=0, warm_start=False)
# LIME has one explainer for all models
explainer = lime.lime_tabular.LimeTabularExplainer(X_train.values,
feature_names=X_train.columns.values.tolist(),
class_names=["price"],
categorical_features=categorical_features,
verbose=True,
mode="regression")
# Out-of-the-box LIME cannot handle the requirement of XGBoost to use xgb.DMatrix() on the input data
xgb_model.predict(xgb.DMatrix(X_test.iloc[[j]]))
expXGB = explainer.explain_instance(X_test.values[j], xgb_model.predict, num_features=5)
expXGB.show_in_notebook(show_table=True)
另一方面,SHAP 针对 XGBoost 进行了优化,可以提供快速、可靠的结果。下面的代码运行速度非常快。它使用 SHAP 库中的 TreeExplainer,该库经过优化,可以跟踪 XGBoost 树以找到 Shapley 值估计值。
explainerXGB = shap.TreeExplainer(xgb_model)
shap_values_XGB_test = explainerXGB.shap_values(X_test)
shap.force_plot(explainerXGB.expected_value, shap_values_XGB_test[j], X_test.iloc[[j]])
结论
希望这篇文章能给你一些如何在 SHAP 和莱姆之间做出选择的建议,并揭示出它们各自的局限性。虽然这两种方法都有各自的优势和局限性,但我个人更喜欢在可能的情况下使用 SHAP,而在 SHAP 的计算成本太高时则依赖 LIME。请继续关注我关于这个主题的下一篇文章,,它将提供如何在各种模型上使用这些库的多个示例,并展示如何解释它们的输出。
SHAP 和 LIME Python 库:第 2 部分——使用 SHAP 和 LIME
原文:https://www.dominodatalab.com/blog/shap-lime-python-libraries-part-2-using-shap-lime
这篇博文提供了关于如何在实践中使用 SHAP 和莱姆 Python 库以及如何解释它们的输出的见解,帮助读者准备在他们自己的工作中产生模型解释。如果对这篇文章的视觉演练感兴趣,那么考虑参加网络研讨会。
介绍
这篇博文的第 1 部分提供了对 SHAP 和 LIME Python 库的简要技术介绍,包括代码和输出,以强调每个库的一些优点和缺点。在第 2 部分中,我们将通过将这些库应用于各种 Python 模型来更详细地探索这些库。第 2 部分的目标是让读者熟悉如何在实践中使用这些库,以及如何解释它们的输出,帮助他们准备在自己的工作中产生模型解释。我们通过对四种常见 Python 模型的 SHAP 和莱姆的并行代码比较来做到这一点。
下面的代码是我创建的 Jupyter 笔记本的一个子集,用来浏览 SHAP 和莱姆的例子。该笔记本托管在 Domino 的试用网站上。单击此处在已经安装了所有必需的依赖项的环境中和 Domino 免费提供的 AWS 硬件上查看、下载或运行笔记本。您需要设置一个免费帐户来登录。
SHAP 和莱姆个人预测解释者
首先,我们加载所需的 Python 库。
import pandas as pd #for manipulating data
import numpy as np #for manipulating data
import sklearn #for building models
import xgboost as xgb #for building models
import sklearn.ensemble #for building models
from sklearn.model_selection import train_test_split #for creating a hold-out sample
import lime #LIME package
import lime.lime_tabular #the type of LIIME analysis we’ll do
import shap #SHAP package
import time #some of the routines take a while so we monitor the time
import os #needed to use Environment Variables in Domino
import matplotlib.pyplot as plt #for custom graphs at the end
import seaborn as sns #for custom graphs at the end
接下来,我们加载波士顿住房数据,这与我们在第 1 部分中使用的数据集相同。
X,y = shap.datasets.boston()X_train,X_test,y_train,y_test = train_test_split(X, y, test_size=0.2, random_state=0)
让我们建立模型来测试 SHAP 和石灰。我们将使用四个模型:两个梯度增强树模型,一个随机森林模型和一个最近邻模型。
# XGBoost
xgb_model = xgb.train({'objective':'reg:linear'}, xgb.DMatrix(X_train, label=y_train))
# GBT from scikit-learn
sk_xgb = sklearn.ensemble.GradientBoostingRegressor()
sk_xgb.fit(X_train, y_train)
# Random Forest
rf = sklearn.ensemble.RandomForestRegressor()rf.fit(X_train, y_train)
# K Nearest Neighbor
knn = sklearn.neighbors.KNeighborsRegressor()knn.fit(X_train, y_train)
SHAP Python 库提供了以下解释器:deep(一种快速但近似的算法,基于 DeepLIFT 算法计算深度学习模型的 SHAP 值);gradient(将来自 Integrated Gradients、SHAP 和 SmoothGrad 的思想结合到深度学习模型的单个期望值方程中);内核(一种特别加权的局部线性回归,用于估计任何模型的 SHAP 值);线性(计算具有独立特征的线性模型的精确 SHAP 值);树(一种快速精确的算法,用于计算树和树集合的 SHAP 值)和采样(在假设特征独立的情况下计算 SHAP 值-当您想要使用大型背景集时,这是内核的一种很好的替代方法)。我们的前三个模型可以使用树解释器。
# Tree on XGBoost
explainerXGB = shap.TreeExplainer(xgb_model)
shap_values_XGB_test = explainerXGB.shap_values(X_test)
shap_values_XGB_train = explainerXGB.shap_values(X_train)
# Tree on Scikit GBT
explainerSKGBT = shap.TreeExplainer(sk_xgb)
shap_values_SKGBT_test = explainerSKGBT.shap_values(X_test)
shap_values_SKGBT_train = explainerSKGBT.shap_values(X_train)
# Tree on Random Forest explainer
RF = shap.TreeExplainer(rf)
shap_values_RF_test = explainerRF.shap_values(X_test)
shap_values_RF_train = explainerRF.shap_values(X_train)
正如在第 1 部分中所解释的,最近邻模型没有一个优化的 SHAP 解释器,所以我们必须使用内核解释器,SHAP 的包罗万象的适用于任何类型的模型。然而,这样做需要一个多小时,即使是在小型波士顿住房数据集上。SHAP 的作者推荐首先用 K-Means 方法总结数据,如下所示。
"""Must use Kernel method on KNN.
Rather than use the whole training set to estimate expected values, we summarize with
a set of weighted kmeans, each weighted by the number of points they represent.
Running without the kmeans took 1 hr 6 mins 7 sec.
Running with the kmeans took 2 min 47 sec.
Boston Housing is a very small dataset.
Running SHAP on models that require Kernel method and have a good amount of data becomes prohibitive"""
X_train_summary = shap.kmeans(X_train, 10)
# using kmeans
t0 = time.time()
explainerKNN = shap.KernelExplainer(knn.predict, X_train_summary)
shap_values_KNN_test = explainerKNN.shap_values(X_test)
shap_values_KNN_train = explainerKNN.shap_values(X_train)
t1 = time.time()
timeit=t1-t0
timeit
既然我们已经建立了模型和 SHAP 解释器,我发现将所有 SHAP 值放入数据框架中以备后用是很有帮助的。
# XGBoost
df_shap_XGB_test = pd.DataFrame(shap_values_XGB_test, columns=X_test.columns.values)
df_shap_XGB_train = pd.DataFrame(shap_values_XGB_train, columns=X_train.columns.values)
# Scikit GBT
df_shap_SKGBT_test = pd.DataFrame(shap_values_SKGBT_test, columns=X_test.columns.values)
df_shap_SKGBT_train = pd.DataFrame(shap_values_SKGBT_train, columns=X_train.columns.values)
# Random Forest
df_shap_RF_test = pd.DataFrame(shap_values_RF_test, columns=X_test.columns.values)
df_shap_RF_train = pd.DataFrame(shap_values_RF_train, columns=X_train.columns.values)
# KNN
df_shap_KNN_test = pd.DataFrame(shap_values_KNN_test, columns=X_test.columns.values)
df_shap_KNN_train = pd.DataFrame(shap_values_KNN_train, columns=X_train.columns.values)
这就结束了 SHAP 解释器的必要设置。设置 LIME 解释器要简单得多,只需要一个解释器就可以分别应用于每个模型。
# if a feature has 10 or less unique values then treat it as categorical
categorical_features = np.argwhere(np.array([len(set(X_train.values[:,x]))
for x in range(X_train.values.shape[1])]) <= 10).flatten()
# LIME has one explainer for all models
explainer = lime.lime_tabular.LimeTabularExplainer(X_train.values
feature_names=X_train.columns.values.tolist(),
class_names=['price'],
categorical_features=categorical_features,
verbose=True, mode='regression')
好了,现在是时候开始解释这些模型的预测了。为了简单起见,我选择使用 SHAP 和莱姆来解释每个模型的测试集中的第一条记录。
# j will be the record we explain
j = 0
# initialize js for SHAP
shap.initjs()
XGBoost SHAP
注意我们前面创建的数据帧的使用。下面的图称为力图。它显示了有助于从基础值推动预测的特征。基本值是我们通过的训练数据集的平均模型输出。将预测值推高的要素以红色显示。将它推低的特征以蓝色显示。与 21.83 相比,我们从测试集中测试的记录在 23.03 处具有高于平均预测值的值。该记录的 LSTAT(人口的低地位百分比)为 7.34。这使得预测值更高。不幸的是,力图没有告诉我们到底高了多少,也没有告诉我们 7.34 与 LSTAT 的其他值相比如何。您可以从 SHAP 值的数据帧中获得此信息,但它不会显示在标准输出中。
shap.force_plot(explainerXGB.expected_value, shap_values_XGB_test[j], X_test.iloc[[j]])
XGBoost 石灰
现成的 LIME 无法处理 XGBoost 使用 xgb 的要求。DMatrix(),所以下面的代码抛出一个错误,我们将只对 XGBoost 库使用 SHAP。潜在的攻击,包括创建自己的预测函数,可以让 LIME 在这个模型上工作,但关键是 LIME 不会自动与 XGBoost 库一起工作。
expXGB = explainer.explain_instance(X_test.values[j], xgb_model.predict, num_features=5)
expXGB.show_in_notebook(show_table=True)
sci kit-学习 GBT SHAP
shap.force_plot(explainerSKGBT.expected_value, shap_values_SKGBT_test[j], X_test.iloc[[j]])
sci kit-学习 GBT 石灰
LIME 致力于 GBTs 的 Scikit-learn 实现。LIME 的输出比 SHAP 的输出提供了更多的细节,因为它指定了导致该特征产生影响的一系列特征值。例如,我们知道 PTRATIO 对这个预测的房价有积极的影响,因为它的价值低于 17.4。SHAP 没有提供这方面的信息。然而,石灰的功能重要性不同于 SHAP 的。由于 SHAP 有更坚实的理论基础,如果莱姆和 SHAP 不同意,大多数人倾向于相信 SHAP,特别是与树和线性 SHAP 解释者。
expSKGBT = explainer.explain_instance(X_test.values[j], sk_xgb.predict, num_features=5)
expSKGBT.show_in_notebook(show_table=True)
随机森林 SHAP
shap.force_plot(explainerRF.expected_value, shap_values_RF_test[j], X_test.iloc[[j]])
随机森林石灰
exp = explainer.explain_instance(X_test.values[j], rf.predict, num_features=5)
exp.show_in_notebook(show_table=True)
KNN·SHAP
shap.force_plot(explainerKNN.expected_value, shap_values_KNN_test[j], X_test.iloc[[j]])
KNN 石灰
exp = explainer.explain_instance(X_test.values[j], knn.predict, num_features=5)
exp.show_in_notebook(show_table=True)
SHAP 宏观上的可解释性
SHAP 和莱姆背后的整个想法是提供模型的可解释性。我发现把模型的可解释性分成两类是很有用的——局部的和全局的。模型的局部可解释性包括为为什么做出个体预测提供详细的解释。这有助于决策者信任该模型,并知道如何将其建议与其他决策因素相结合。模型的全局可解释性需要寻求理解模型的整体结构。这比解释一个单一的预测要大得多(也困难得多),因为它涉及到对模型如何工作的陈述,而不仅仅是对一个预测。对于需要在高层次上理解模型的执行发起人、希望从总体上验证模型决策的审计员以及希望验证模型与他们对所研究系统的理论理解相匹配的科学家来说,全局可解释性通常更为重要。
上一节中的图表是局部可解释性的例子。虽然 LIME 没有提供任何全球可解释性的图表,但 SHAP 提供了。让我们来探究其中的一些图表。对于这些图形示例,我选择使用第一个模型,即来自 XGBoost 库的模型。
可变重要性图是从全局意义上理解模型的有用工具。SHAP 为评估可变重要性提供了一个理论上合理的方法。这一点很重要,因为关于计算变量重要性的传统方法哪一种是正确的存在争议,而且这些方法并不总是一致。
shap.summary_plot(shap_values_XGB_train, X_train, plot_type="bar")
与可变重要性图类似,SHAP 也提供了一个摘要图,显示训练数据集中每个实例的 SHAP 值。这可以更好地理解整体模式,并允许发现预测异常值的口袋。
shap.summary_plot(shap_values_XGB_train, X_train)
变量影响或依赖图长期以来一直是统计学家对模型可解释性的喜爱。SHAP 也提供这些,我觉得它们很有用。
shp_plt = shap.dependence_plot("LSTAT", shap_values_XGB_train, X_train)
我非常喜欢这些,我决定使用 matplotlib 和 seaborn 对它们进行一些定制,以实现两项改进。首先,我用黑点突出显示了第 j 个实例,这样我们可以将全局和局部可解释性的优点结合到一个图中。第二,我允许根据变量灵活选择颜色。
# inputs = column of interest as string, column for coloring as string, df of our data, SHAP df,
# x position of the black dot, y position of the black dot
def dep_plt(col, color_by, base_actual_df, base_shap_df, overlay_x, overlay_y):
cmap=sns.diverging_palette(260, 10, sep=1, as_cmap=True) #seaborn palette
f, ax = plt.subplots()
points = ax.scatter(base_actual_df[col], base_shap_df[col], c=base_actual_df[color_by], s=20, cmap=cmap)
f.colorbar(points).set_label(color_by)
ax.scatter(overlay_x, overlay_y, color='black', s=50)
plt.xlabel(col)
plt.ylabel("SHAP value for " + col)
plt.show()
# get list of model inputs in order of SHAP importance
imp_cols = df_shap_XGB_train.abs().mean().sort_values(ascending=False).index.tolist()
# loop through this list to show top 3 dependency plots
for i in range(0, len(imp_cols)):
#plot the top var and color by the 2nd var
if i == 0 :
dep_plt(imp_cols[i], imp_cols[i+1],
X_train,
df_shap_XGB_train,
X_test.iloc[j,:][imp_cols[i]],
df_shap_XGB_test.iloc[j,:][imp_cols[i]])
#plot the 2nd and 3rd vars and color by the top var
if (i >; 0) and (i <; 3) :
dep_plt(imp_cols[i],
imp_cols[0], X_train,
df_shap_XGB_train,
X_test.iloc[j,:][imp_cols[i]],
df_shap_XGB_test.iloc[j,:][imp_cols[i]])
如今,模型可解释性仍然是许多数据科学家和数据科学领导者的头等大事。SHAP 和莱姆是在本地和全球层面上帮助提供这些解释的坚实图书馆。随着时间的推移,解释黑盒模型的需求只会增加。我相信在不太遥远的将来,我们会发现模型可解释性与模型敏感性/压力测试相结合将成为数据科学工作的标准部分,并且它将在大多数数据科学生命周期中拥有自己的一步。
打破公民数据科学家的神话
原文:https://www.dominodatalab.com/blog/shattering-the-myth-of-the-citizen-data-scientist
现在终于是时候终结“公民数据科学家”这一昂贵而危险的神话,将注意力转移到一个被忽视的现实生活中的人身上了,这个人已经对你今天的模型驱动型业务至关重要,并且在未来将变得更加重要——“荣誉”或兼职数据科学家。
“公民数据科学家”(CDS)概念的发明初衷是好的——促进数据、机器学习和人工智能素养——但弊大于利。由 CDSes 组成的企业的白日梦不可避免地导致昂贵的计划,充其量导致一次性的见解,在大多数情况下,与数据科学无关。许多采用这种方法的公司最终一无所获。
更糟糕的是,试图发展 CDSes 会严重伤害你的数据科学团队。他们将注意力和资金从实际的数据科学计划转移到分析 101 课程和商业智能平台或具有原始数据科学功能的数据准备工具。在最糟糕的情况下,数据科学家被期望使用玩具工具,导致要么跟踪它,要么你最好的数据科学家大批离去。
模型推动大规模的结果,单独的见解不会
让更多懂数据的员工,给他们可视化的数据准备工具,加上一些简单易用的高级分析方法,有什么错?什么都没有,除了它们通常不会驱动变革性的商业价值。
即使 CDS 项目做得很好,这些人也只能提取特定的见解,为你的企业带来一次性的机会。这是因为变革性的结果只能来自于开发越来越多的机器学习模型组合,这些模型投入生产并不断推动决策、行动和应用。换句话说,你需要数据驱动的洞察作为模型构建过程的部分,但是洞察本身是开发生产级模型的必要步骤,但还不够。
这些模式是当今几乎所有发展最快的公司的核心。它们为流媒体视频服务的推荐引擎、搜索引擎的结果、汽车的自动驾驶功能以及每个顶级零售商的定向折扣提供动力。
这些基本的、任务关键的——通常是受监管的——模型不能也不应该由专业数据科学家之外的任何人创建,原因与医院不应该配备“公民外科医生”、航空公司不应该依赖“公民飞行员”、塔楼不应该由“公民建筑师”建造、你的首席管理人员不应该由“公民经理”组成一样。
期望公民数据科学家取代您的专业数据科学家在最好的情况下是徒劳的,在最坏的情况下会导致表现不佳的模型,危及您组织的声誉、法规遵从性或底线。(如果你真的对创建道德、守法的人工智能模型感兴趣,请在 Rev 3 观看我们的第二场专题讨论,在那里我们将解释新兴的人工智能标准以及如何满足它们。)
公民数据科学家死了,荣誉数据科学家万岁
是时候抛弃 CDS 这个有缺陷的概念,转而关注现实世界中的角色——除了专业的数据科学家之外——这实际上有助于实现巨大的商业价值。这就是“荣誉”或兼职数据科学家。此人的日常工作与数据科学家无关,通常是数据分析师或精通数据的业务线专业人员。他们可以与专业的数据科学家携手合作,创建描述性分析应用程序,或者进行跨越高级分析领域的调查。
“荣誉数据科学家”可以独自创造价值,但他们对每个数据科学项目也至关重要,因为他们带来了对业务及其数据的理解。此外,他们通常可以承担数据准备和其他任务,从而解放您的数据科学家。在他们现有的角色中,他们可能没有成为专业数据科学家的培训、经验、关注或激励,但在正确的支持下,他们推动数据科学成果,并可能成为未来数据科学家人才的重要渠道。(在 Rev 3 召开会议,了解如何赢得数据科学人才大战,打造分析驱动型员工队伍。)
授权给你的荣誉数据科学家
公民数据科学家对企业来说既是神话,也是可选的。你们的荣誉数据科学家就不一样了。如果你正在做数据科学方面的事情,你已经有了荣誉数据科学家,但可能没有意识到这一点,几乎可以肯定的是,你需要更多的荣誉数据科学家,并使他们更加有效。
他们也需要得到支持。他们需要培训,需要有助于他们与数据科学团队合作的流程,还需要工具。由于他们要么与数据科学家密切合作,学习如何成为数据科学家,要么已经在做数据科学家的一些工作,他们需要访问您的专业数据科学家正在使用的相同工具和平台。他们可能还需要对敏感数据设置更多的防护栏,并限制他们可以使用的基础设施数量。
更好的是,给你的荣誉数据科学家平台(如 Domino Data Lab 的 Enterprise MLOps platform )提供对各种专业数据科学工具的集成支持。但是,不要将它们局限于不适合数据科学的“玩具”工具、与您的数据科学家正在使用的工具不兼容的工具,或者不能帮助他们实践专业数据科学的工具。这样做只会伤害他们、你的数据科学家,并最终伤害你的业务。
是否应该建立自己的数据科学平台?
原文:https://www.dominodatalab.com/blog/should-you-build-your-own-data-science-platform
随着组织日益努力成为模型驱动的,他们认识到数据科学平台的必要性。根据最近的调查报告“成为模型驱动的旅程中的关键因素”,86%的模型驱动公司通过使用数据科学平台来区分自己。然而,是建造还是购买的问题仍然存在。
对于大多数组织来说,从业务战略和项目成本效益的角度来看,购买数据科学平台都是正确的选择。然而,许多组织混淆了模型对他们长期成功的重要性和他们自己构建底层平台的需要。在一些特定的情况下,平台本身就是差异化因素。这些组织拥有高度专业化的工作流程(例如,优步),内部软件开发的出色记录(例如, Airbnb ),以及能够识别模型独特特征的深厚数据科学专业知识(例如,谷歌)。对于绝大多数组织来说,竞争优势不是平台,而是整个组织的能力——我们称之为模型管理——包括许多不同的技术、利益相关者和业务流程。购买该平台是大多数人的合理选择。
您可能会想,“当然,数据科学平台供应商 Domino 认为每个人都应该购买一个数据科学平台。”我们在 Domino 确实对这个主题有自己的看法,但是这种看法来自于与世界各地各种形状和大小的组织的数千次互动,这些组织在成为模型驱动的过程中面临着共同的斗争和障碍。大多数选择自己建造核电站的公司要么停滞不前,要么失败了。那些购买了平台的人正在大规模实施数据科学。这些互动和与试图决定他们是否应该建造或购买的组织一起工作的经验使我们开发了一个严格和客观的框架来促进决策过程。在这个框架中,我们考察三个主要因素:
-
总拥有成本需要仔细考察构建、管理和运营数据科学平台的范围。许多组织低估了构建方法的总拥有成本。在一个为期四年的场景中,一个组织首先构建一个支持 30 名数据科学家的数据科学平台(并在随后的几年中以 20%的年增长率增长),我们估计构建的 TCO 超过 3000 万美元,而购买的 TCO 只是其中的一小部分。请参见下面的图 1,了解两种方法的 TCO 的年度对比。
图一。构建与购买的四年 TCO 预测
-
机会成本通过投入资源构建数据科学平台,组织不可避免地会选择放弃其他项目。这种选择可能是不明智的,尤其是如果组织牺牲其核心竞争力,最终将损害组织的收入。
-
风险因素数据科学不是一项容易的工作,尽可能降低风险是明智的。在决定构建之前,需要仔细考虑风险因素,如人才获取和保留、技能需求变化以及平台功能需求变化。另一方面,一个组织在选择向哪个供应商购买时也应该非常小心。
如果您想深入了解这个框架的更多细节,可以阅读 Domino 白皮书:“您应该构建自己的数据科学平台吗?”。最终,组织需要决定他们与数据科学的区别在哪里:在他们建立的模型和整体组织能力中,还是在底层基础设施中?对大多数人来说,是前者,所以“购买”方法可能提供最低的 TCO 和最一致的战略选择。
R 的重大更新需要重新安装软件包
原文:https://www.dominodatalab.com/blog/significant-update-to-r-requires-re-installation-of-packages
R 的最新更新于 4 月 24 日下降,将统计计算语言带到了 4.0 版本。该更新包含新功能、错误修复和对现有函数的底层行为和语法的更改,有助于优化代码的实现和可重用性。
由于 R 4.0 中核心组件的变化,R 包将需要重新安装,以确保它们能够正常工作,因为核心库的工作方式发生了根本的变化。这一更新可能会带来模型再现性问题,并带来确保数据科学家团队版本一致的古老挑战,使他们能够共同开发模型,并确保在他们的机器上开发的模型能够由其他数据科学家运行并部署到生产中。
在 R 4.0 中所做更改的完整列表可以在综合 R 存档网络中找到。
环境管理
环境管理是 Domino 平台的一个关键组件。它使团队能够配置和维护多个分析环境,这些环境可以以安全、无缝的方式轻松应用于他们的项目和工作台,只需最少甚至不需要 It 交互。它不需要开发人员配置他们自己的本地机器或设置新的虚拟环境来测试更新或新的包,并且在部署后可以很容易地推广到其他团队成员。
该功能通常用于创建“黄金标准”生产环境,在该环境中,所有软件包和软件版本都已经过测试和评估,适合生产;此外,在研发环境中,数据科学家可以测试最新、最棒的软件包和软件更新。
与 Domino 中的所有功能一样,环境管理是完全受版本控制的,这意味着可以随时跟踪变化,并且在底层包或软件组件发生重大变化的情况下,可以恢复完整的环境。这对于像 R 4.0 这样的重大升级来说是至关重要的,否则这些升级可能是破坏性的,导致您的模型崩溃。关键是要有一个平台,能够回忆并使用重现模型所需的确切环境,即使是多年以后。
那么 Domino 如何提供帮助呢?
- 计算环境可以跨用户共享。一旦管理员创建了一个新的 R 4.0 环境,他们可以让每个人立即使用它。没有电子邮件爆料说“这里有关于如何在你的笔记本电脑或环境上升级 R 的说明”。
- Domino 允许您拥有多个计算环境,并在它们之间轻松切换。更新 R 需要你重新安装所有的软件包,这很可能会升级你的软件包版本。所以有很多地方可以进行突破性的改变。在 Domino 中,您可以创建一个新 R4.0 计算环境,然后在其上测试您的代码。如果它不起作用,因为你可能依赖于一些维护者还没有更新的包,那么你几乎可以立即切换回来。否则,您将升级您的笔记本电脑/服务器,然后测试您的测试材料,然后再次降级。如果你是单个用户,这是一件痛苦的事,但是如果你有很多用户,这就更让人头疼了。没有电子邮件爆炸出去说“我们今晚升级,所以每个人都可以在 EOD 之前测试他们的东西,让我知道是否有问题”。
- 最后,由于 Domino 版本和跟踪环境是自动的,升级不会破坏您的旧工作,因为您的旧东西仍然可以在旧环境中运行。事实上,您有代码工作的确切环境和环境版本的记录。没有电子邮件爆料说“有人记得吉姆在离开之前,为我们的季度报告创作情节时使用的是什么版本的 R 吗?”
结论
支撑数据科学的工具和技术在不断发展。数据科学团队通常采用的方法是将虚拟机环境作为开发中心,并在为每个数据科学家发布指令以更新他们的开发环境之前测试软件包。这种方法通常意味着包和版本不兼容,需要故障排除,并阻碍数据科学家的进步。
环境管理使数据科学家可以轻松测试新的软件包和软件更新,但更重要的是,这些环境可以在数据科学团队之间轻松共享,这意味着花费数小时来设置环境以测试同事工作的日子已经一去不复返了。
这使数据科学家能够建立值得信赖的黄金标准生产环境,而不会牺牲他们尝试新出现的软件包和软件的自由或灵活性。
有关 Domino 如何管理环境的更多信息,请查看我们的环境管理概述或联系我们进行演示。
Twitter Facebook Gmail Share
Python、R、Matlab 和 Octave 中的简单并行循环
原文:https://www.dominodatalab.com/blog/simple-parallelization
Domino 平台使得在非常强大的硬件(多达 32 个内核和 250GB 内存)上运行云中的分析变得轻而易举,允许通过并行性大幅提高性能。在本帖中,我们将向您展示如何使用多种语言并行化您的代码,以利用多个内核。这听起来可能有点吓人,但是 Python、R 和 Matlab 的特性使它变得非常简单。
请继续阅读,了解如何从一台机器上获得超过 3000%的 CPU 输出。
Perf stats from some parallelized Python code running on a single, 32-core machine
我的代码是可并行的吗?
出于本文的目的,我们假设一个常见的分析场景:您需要对许多项目执行一些计算,并且一个项目的计算不依赖于任何其他项目。更准确地说:
- 你的分析处理一系列事物,例如,产品、商店、文件、人、物种。让我们称之为
inputs
。
- 你可以构建你的代码,这样你就有一个函数,它接受一个这样的东西,并返回一个你关心的结果。我们称这个函数为
processInput
。(在这一步之后,您可以按照自己的意愿组合您的结果,例如,汇总它们,将它们保存到一个文件中——这对我们的目的来说并不重要。)
通常情况下,您会循环处理您的项目,处理每个项目:
for i in inputs
results[i] = processInput(i)
end
// now do something with results
我们将向您展示如何并行处理所有项目,将工作分散到多个内核,而不是在普通的 a 循环中处理项目。
为了使下面的例子更具体,我们使用了一个数字列表和一个平方数字的函数。当然,您会使用您特定的数据和逻辑。
我们开始吧!
计算机编程语言
Python 有一个很棒的包,[joblib]让并行变得非常容易。
from joblib import Parallel, delayed
import multiprocessing
# what are your inputs, and what operation do you want to
# perform on each input. For example...
inputs = range(10)
def processInput(i):
return i * i
num_cores = multiprocessing.cpu_count()
results = Parallel(n_jobs=num_cores)(delayed(processInput)(i) for i in inputs
results
现在是[1, 4, 9 ... ]
稀有
从 2.14 开始,R 包含了并行库,这使得这类任务变得非常容易。
library(parallel)
# what are your inputs, and what operation do you want to
# perform on each input. For example...
inputs <- 1:10
processInput <- function(i) {
i * i
}
numCores <- detectCores()
results = mclapply(inputs, processInput, mc.cores = numCores)
# the above won't work on Windows, but this will:
cl <- makeCluster(numCores)
results = parLapply(cl, inputs, processInput)
stopCluster(cl)
你可以在这个 StackOverflow 帖子上找到更多关于mclapply
和parLapply
的区别的信息
作为替代,您也可以使用 foreach 包,它允许您使用熟悉的for
循环语法,自动并行化您的代码:
library(foreach)
library(doParallel)
library(parallel)
numCores <- detectCores()
cl <- makeCluster(numCores)
registerDoParallel(cl)
inputs <- 1:10
processInput <- function(i) {
i * i
}
results <- foreach(i=inputs) %dopar% {
processInput(i)
}
矩阵实验室
Matlab 的并行计算工具箱使得通过使用 parfor 构造来使用并行 for 循环变得很简单。例如:
inputs = 1:10;
results = [];
% assumes that processInput is defined in a separate function file
parfor i = inputs
results(i) = processInput(i);
end
请注意,如果您的输入不是整数(例如,它们是文件名或项目标识符),您可以使用 parcellfun 函数,它对单元格输入而不是数组输入进行操作。
八度音阶
不幸的是,Octave 没有一个好的parfor
等价物——但是它有自己的并行包。你可以这样使用它:
if exist('OCTAVE_VERSION') ~= 0
% you'll need to run this once, to install the package:
% pkg install -forge parallel
pkg load parallel
end
inputs = 1:10;
numCores = nproc();
% assumes that processInput is defined in a separate function file
[result] = pararrayfun(numCores,@processInput, inputs);
请注意,如果您的输入不是数字(如文件名或产品标识符),您可以使用 parcellfun
功能。
结论
现代统计语言使得跨内核并行化代码变得非常容易,而 Domino 使得访问拥有许多内核的强大机器变得轻而易举。通过使用这些技术,我们已经看到用户在使用单台机器的情况下将代码速度提高了 32 倍以上。
如果您想尝试将这种方法应用到您的分析中,请告诉我们,我们很乐意帮助您!
ML 内部:合成少数过采样(SMOTE)技术
原文:https://www.dominodatalab.com/blog/smote-oversampling-technique
在本文中,我们讨论了为什么在不平衡的数据集上拟合模型是有问题的,以及通常如何解决类别不平衡。我们展示了 SMOTE 算法的内部工作原理,并展示了一个简单的“从头开始”的 SMOTE 实现。我们使用人工构建的不平衡数据集(基于 Iris)通过我们的 SMOTE 实现生成合成观察值,并讨论帮助 SMOTE 处理分类属性的修改。数据集和代码可在这里获得。
机器学习算法通常需要处理高度不平衡的数据集。当我们说一个分类数据集不平衡时,我们通常指的是数据集中包含的不同类不是均匀表示的。例如,欺诈检测数据集通常具有 100:1 的比率,因为与合法支付的数量相比,欺诈交易的数量相对较少。在其他领域观察到甚至更高的偏斜度。例如,高能物理分类问题可以具有 100,000:1 的背景信号比(Clearwater 和 Stern,1991)。在蛋白质分类中遇到同样的挑战,其中一类中的蛋白质数量通常比该类之外的蛋白质数量少得多(赵等,2008)。此外,不平衡的数据加剧了此类生物数据中常见的维数灾难带来的问题。
处理高度不平衡的数据可能在几个方面存在问题:
- 扭曲的性能指标 —在高度不平衡的数据集中,比如一个类比为 98:2 的二进制数据集,一个总是预测多数类而完全忽略少数类的算法仍然会有 98%的正确率。这使得像分类准确度这样的度量变得毫无意义。这反过来使得分类器的性能评估变得困难,并且还会损害努力使准确度最大化的算法的学习。
- 少数类中的训练数据不足 —在数据收集成本高昂的领域中,包含 10,000 个示例的数据集通常被认为是相当大的。但是,如果数据集不平衡,类比率为 100:1,这意味着它只包含 100 个少数类的示例。这个数量的示例可能不足以使分类算法建立良好的决策边界,并且可能导致较差的概括
Figure 1: Balanced vs. imbalanced datasets — Left-hand side: a balanced binary dataset, which contains an approximately equal number of observations of its two classes (male and female); right-hand side: an imbalanced dataset where the ratio of legitimate to fraudulent transactions is 100:1.
从历史上看,类不平衡是通过欠采样解决的,其本质归结为丢弃来自多数类的观察值。这可以通过从多数类中随机抽取与少数类中的观察值数量相同的多个观察值来天真地执行。将两者合并会产生一个完全平衡的数据集(50:50)。这种方法的问题是,在高度不平衡的集合中,它很容易导致大部分数据必须被丢弃的情况,并且已经坚定地确立,当涉及到机器学习时,数据不应该被轻易丢弃(Banko 和 Brill,2001;Halevy 等人,2009 年)。其他技术包括简单的重新采样,其中少数类被连续地重新采样,直到获得的观察值的数量与多数类的大小相匹配,以及集中欠采样,其中来自多数类的丢弃的观察值被仔细地选择以远离决策边界(Japkowicz,2000)。研究还表明,考虑中的一些技术可以结合使用,例如,凌和李(1998)同时证明了多数欠采样和少数过采样。然而,似乎尽管对多数类的欠采样比少数类的重采样产生了更好的结果,但是结合这两种技术并没有导致显著的改进。
人工示例的生成
必须注意,过采样中使用的传统技术通常依赖于简单的替换采样。在其 2002 年的论文中,Chawla 等人提出了一种不同的策略,其中通过生成合成样本来对少数类进行过采样。他们证明了这种合成少数过采样技术(SMOTE)和多数欠采样的组合产生了显著更好的分类器性能。
以下是 SMOTE 算法的简化版本:
import random
import pandas as pd
import numpy as np
from sklearn.neighbors
import NearestNeighbors
from random import randrange
def get_neigbours(M, k):
nn = NearestNeighbors(n_neighbors=k+1, metric="euclidean").fit(M)
dist, indices = nn.kneighbors(M, return_distance=True)
return dist, indices
def SMOTE(M, N, k=5):
t = M.shape[0] # number of minority class samples
numattrs = M.shape[1]
N = int(N/100)
_, indices = get_neigbours(M, k)
synthetic = np.empty((N * t, numattrs))
synth_idx = 0
for i in range(t):
for j in range(N):
neighbour = randrange(1, k+1)
diff = M[indices[i, neighbour]] - M[i]
gap = random.uniform(0, 1)
synthetic[synth_idx] = M[i] + gap*diff
synth_idx += 1
return synthetic
该算法接受三个必需的参数-少数观察值列表(M,一个 Numpy 数组)、所需的过采样量(N)和要考虑的最近邻数(k)。请注意,N 的值被解释为百分比,因此 N = 100 的过采样将产生许多与 M 中的观测值相匹配的合成观测值,N = 200 将产生两倍于 M 中的观测值,依此类推。注意,原始算法没有规定用于选择最近邻居的特定例程。这里我们使用基于欧几里德的 kNN,但这不是一个硬性要求。
Figure 2: An imbalanced dataset based on Fisher’s Iris (Fisher, 1936) — six observations of class 0 have been sampled at random, and all observations of class 1 have been kept intact. The minority to majority ratio is 12:100
让我们检查 Iris 数据集的随机不平衡样本(图 2),其中只考虑了两个目标类。少数类仅包含 6 个观察值,但我们可以使用 SMOTE 对其进行上采样,并获得完全平衡的数据集,其中类 0 和 1 包含相同数量的样本。图 3 显示了在这种情况下 SMOTE 如何生成合成观测值的直观解释。
Figure 3: Generation of synthetic observations for a single member of the minority class — Start with the minority class (3a) and select a member at random (3b). Identify its k-nearest neighbours (3c). Place a new observation between the member and each of its neighbours. The specific distance of each synthetic observation from the selected minority member is chosen at random (3d)
该算法迭代少数类中的每个观察值。一旦选择了少数观测值,SMOTE 就识别其 k 个最近的邻居,并随机选择一组邻居用于生成过程。请注意,所用邻居的数量取决于所需的过采样量。例如,如果 k = 3 且 N = 100,则只需要一个随机选择的邻居。如果 N = 200,将选择两个随机邻居。在⌊N/100⌋ > k 的情况下,SMOTE 将使用替换对邻居集进行采样,因此将多次使用同一个邻居。
Figure 4: Repeated generation of synthetic observations for the same minority member leads to different new observations, because of the adjustment via the random gap component.
在选择了邻居之后,该算法取少数成员和单个邻居的特征向量之间的差。然后,将每个差值乘以(0,1)中的随机数,并加回特征向量。这在每个成员的方向上构建了合成观测值,这些观测值位于离少数成员随机距离处。请注意,由于距离计算的随机性,使用相同少数成员-最近邻组合的重复迭代仍然会产生不同的合成观察结果(见图 4)。
Figure 5: Results of up-sampling via SMOTE for N = 100 (left) and N = 600 (right). The synthetic observations are coloured in magenta. Setting N to 100 produces a number of synthetic observations equal to the number of minority class samples (6). Setting N to 600 results in 6 × 6 = 36 new observations.
图 5 展示了对少数类运行 SMOTE 的结果,其中 k = 5,N 值设置为 100 和 600。检查该图可以发现,所有的合成观测值都位于连接两个少数样本的直线上。这是基于 SMOTE 的上采样的一个非常明显的特征。此外,上采样提供优势背后的直觉可以通过以下事实来解释:少数类中的更多观察导致更宽的决策边界。学习更宽的区域提高了分类器的泛化能力,因为少数类的区域没有被多数类的观察结果如此紧密地约束。Chawla 等人(2002 年)对基于 SMOTE 的上采样的影响进行了综合评估。他们证明了将少数向上采样与多数向下采样相结合会产生最好的结果。他们的测试是使用 C4.5 生成的决策树(Quinlan,1993)进行的,这些决策树适用于十个不同的不平衡数据集(例如,Pima Indian Diabetes (Smith 等人,1988),E-state 数据(Hall 等人,1991),Oil 数据集(Kubat 等人,1998)等)。C4.5、SMOTE 上采样和多数下采样组合的性能是针对另外两个分类器进行评估的。第一种是朴素贝叶斯分类器,其先验被调整以校正类别不平衡。第二个是 RIPPER2 拟合的基于规则的分类器,它也非常适合于类分布不平衡的数据集。
Figure 6: Up-sampling using SMOTE with k = 5 and N = 500. The synthetic observations have been merged with the six original minority samples, and the new up-sampled dataset is plotted using pairwise scatter plots for each possible combination of the four original Iris attributes.
结果表明,SMOTE-C4.5 组合始终优于其他两种分类器——SMOTE-c 4.5 分类器仅在所进行的 48 个实验中的 4 个实验中表现最佳。Chawla 等人(2002 年)还解释了为什么简单的替换过采样与基于 SMOTE 的上采样相比性能更差——少数观察值的简单复制导致决策区域缩小,这与良好概括所需的情况相反。另一方面,合成上采样扩展了决策区域,这提高了分类器性能。
SMOTE 和分类特征
SMOTE 的一个局限性是它不能处理只包含分类特征的数据集。有一种算法的修改,称为合成少数过采样技术-名义连续(SMOTE-NE),它可以处理具有连续和分类特征混合的样本。除了 vanilla SMOTE 之外,SMOTE-NE 还执行以下操作:
- 中值计算 —该算法计算少数类中所有连续属性的标准偏差,然后计算标准偏差的中值;
- 最近邻识别-使用欧几里德距离计算用于 k-最近邻选择的度量,并对任何不匹配的分类属性进行额外的校正。对于所选少数成员和潜在邻居之间不同的每个分类属性,预先计算的中值作为一个分量添加到欧几里德距离计算中;
- 合成样本校正 —通过 vanilla SMOTE 计算合成样本的连续特征。使用 k 个最近邻居的分类属性中最频繁的值来设置合成分类属性;
Chawla 等人(2002 年)提供了一个说明这种修改的例子。
例 1 :设少数集合包含以下观察值:
$ $
O1 = {1,2,3,a,b,c}^t \
O2 = {4,6,5,a,d,e}^t \
O3 = {3,5,6,a,b,k}^t $ $
设连续属性的标准差中值为(Med = SD(1,4,3),SD(2,6,5),SD(3,5,6)),本次迭代选择的少数成员为(O1)。(O1)和(O2)之间的欧几里德距离则为:
$ $ \ begin { equation * }
d(O1,O2)= \sqrt{(4-1)2+(6-2)2+(5-3)2+med2+med^2}
\ end { equation * } $
对(O1)和(O2)之间不同的两个分类属性应用两次中值校正,即:(B \右箭头 d )、(C \右箭头 E)。(O1)和(O3)之间的距离同样计算如下:
$ $ \ begin { equation * }
d(O1,O3)= \sqrt{(3-1)2+(5-2)2+(6-3)2+med2}
\ end { equation * } $
对(C \右箭头 K)变化进行一次修正。
提醒一句。Chawla 等人(2002 年)没有对这种修正进行严格的数学处理,建议的中值修正似乎完全是由经验驱动的。这带来了这种修改比像多数欠采样这样的简单方法表现更差的风险。事实上,在最初的论文中,Chawla 等人注意到,当在成人数据集上进行测试时,这种变体“比基于 AUC 的普通欠采样表现更差”(Dua & Graff,2017)。
SMOTE 的另一个修改,称为 SMOTE-N(用于名义特征),试图绕过 SMOTE-NE 的限制,即数据集不能只由分类特征组成。SMOTE-N 变体使用值距离度量(VDM)的修改版本,这是 Cost 和 Salzberg (1993)为在符号域中操作的最近邻算法建议的(即,特征不再是数字的,但是仍然需要观察值之间的实值距离)。对于所有要素都是分类的数据集,VDM 将两个对应的特征值(v1)和(v2)之间的距离计算为
\[\delta (v1,v2)= \sum_{c=1}^c | p(c | v1 _ f)-p(c | v2 _ f)|^k,k\in\{1,2\}
\]
其中(c)是数据集中的类的数量,(p(c|v1_f))是类(C)的条件概率,假设特征(f)的值为(v1\ ),而(p(c|v2_f))是类(C)的条件概率,假设特征(f)的值为(v2\ ),并且(k)是设置为 1 的常数(k=1 产生曼哈顿距离,k=2 产生欧几里德距离)。
两次观测(O1)和(O2)之间的距离进一步定义为
\[\Delta (O1,O2) = \sum_{f=1}^{F} \delta (O1_f,O2_f)^r,r\in\{1,2\} \text{ (1)}
\]
例 2 :假设(\mathcal{D})是一个二元分类数据集,由以下三个
观测值及其对应的类组成
\[O1 = \{A,B,C,D,E,\}^T,0\\
O2 = \{A,F,C,G,N,\}^T,0\\
O3 = \{H,B,C,D,N,\}^T,1 $ $
\(O1\)和\(O2\)之间的距离可以计算为
$ $ \ begin { equation * }
\ begin { aligned }
\ delta(O1,O2)&= \sum_{f=0}^{f} \ delta(O1 _ f,O2_f)^1 = \delta (A,A) + \delta (B,F) + \delta (C,C) + \delta (D,G) + \delta (E,n)\ \
&= \sum_{c=0}^1 | p(c | a _ 0)-p(c|a_0)|^1+\sum_{c=0}^1 | p(c | b _ 1)-p(c|f_1)|^1+\sum_{c=0}^1 | p(c | c
可以使用以下事实来计算(1)中的条件概率
$ $ p(c | v _ f)= | v _ f | _ c \ div | v _ f | _ \ mathcal { D } $ $
其中\(|v_f|_c\)是类\(c\)的特征值\(v_f\)出现的次数,而\(|v_f|_\mathcal{D}\)是数据集中\(v_f\)出现的总次数。然后,我们可以如下获得成对特征距离
$ $ \ begin { equation * }
\ begin { aligned }
\ delta(a,a)= \sum_{c=0}^1 | p(c | a _ 0)-p(c | a _ 0)|^1&= | | a | _ 0 \ div | a | _ \ math cal { d }-| a | _ 0 \ div | a | _ \ math cal { d } |+| | a | _ 1 \ div | a | _ \ math cal { d }-| a | _ 1 \ math cal { d }-| a | _ 1 \ div | a | _ \ a f)= \sum_{c=0}^1 | p(c | b _ 1)-p(c | f _ 1)|^1&= | | b | _ 0 \ div | b | _ \ mathcal { d }-| f | _ 0 \ div | f | _ \ mathcal { d } |+| | b | _ 1 \ div | b | _ 1 | b | _ \ mathcal { d }-| f | _ 1 \ div | f | _ \ mathcal { d } | \ \【T6 = | 1 \ div 2-1 \ div 1 |+| 1 \ div 1
同样,我们得到
$ $ \ begin { equation * }
\ begin { aligned }
\ delta(C,C)&= | 2 \ div 3-2 \ div 3 |+| 1 \ div 3-1 \ div 3 | = 0 \ \
\ delta(D,G)&= | 1 \ div 2-1 \ div 1 |+| 1 \ div 2-0 \ div 1 | = 1 \ \
\ delta(E,N) & = | 1 \div 1 - 1
最后
$ $ \ begin {equation*}
\ begin { aligned }
\ delta(O1,O2)&= \sum_{f=0}^{f} \ delta(O1 _ f,O2_f)^1 = \delta (A,A) + \delta (B,F) + \delta (C,C) + \delta (D,G) + \delta (E,n)\ \
&= 0+1+0+1 = 3
\ end { aligned }
\ end { equation * } $【结束{ equation * }
类似地\(\Delta (O1,O3) = 5\)和\(\Delta (O2,O3) = 6\)。注意,因为\(\delta\)是对称的,所以\(\Delta (O1,O2) = \Delta (O2,O1)\)、\(\Delta (O2,O3) = \Delta (O3,O2)\)等也是对称的。
在通过 VDM 选择相关的\(k\)最近邻居之后,SMOTE-N 通过简单地基于邻居采取多数投票来获得合成特征向量的值,从而创建新的观察值。请记住,原始论文没有提供 SMOTE-N 的任何性能比较,因此不建议在没有研究替代方法和评估其性能的情况下将其用作“首选”技术。此外,SMOTE-N 的原始描述没有讨论投票过程中的平局打破,但是,一个简单的启发式方法是随机选取一个平局选项。
## 摘要
在这篇博文中,我们讨论了为什么处理不平衡数据集通常会有问题,并介绍了 SMOTE 的内部原理——一种用于上采样少数类的常用技术。我们还讨论了 SMOTE 的两个修改,即 SMOTE-NE 和 SMOTE-N,它们针对具有分类特征的数据集。
这篇博文中使用的数据集和代码可以在**[https://try.dominodatalab.com](https://try.dominodatalab.com/u/nmanchev/mlinternals-smote/overview)**获得,这里显示的所有结果都是完全可再现的,这要感谢 Domino reproducibility engine,它是 Domino Enterprise MLOps 平台的一部分。如果你想自己尝试这个项目,你可以通过点击上面的链接注册一个免费账户。
## 参考
* Banko,m .,& Brill,E. (2001 年)扩展到非常非常大的自然语言消歧语料库。计算语言学协会第 39 届年会会议录,26–33。https://doi.org/10.3115/1073012.1073017
* 舒拉、鲍耶、K. W .、霍尔、L. O .、凯格尔迈耶、W. P. (2002 年)。Smote:合成少数过采样技术。j .阿提夫。里面的第 16(1)号决议,第 321 至 357 段。
* s .克利尔沃特和 e .斯特恩(1991 年)。高能物理事件分类中的规则学习程序。计算机物理通讯,67(2),159–182 页。https://doi . org/10.1016/0010-4655(91)90014-C
* 科恩和辛格(1999 年)。一个简单、快速、有效的规则学习者,335–342。成本,s .,&萨尔茨伯格,S. (1993)。一种带符号
特征的加权最近邻学习算法。机器学习,57–78。
* Dua,d .,& Graff,C. (2017)。UCI 机器学习知识库。http://archive.ics.uci.edu/ml·费希尔(1936 年)。分类问题中多重测量的使用。优生学年鉴,
7(2),179–188。https://doi.org/10.1111/j.1469-1809.1936.tb02137.
* Halevy,A. Y .,Norvig,p .,& Pereira,F. (2009 年)。数据的不合理有效性。IEEE 智能系统,24(2),8–12。http://dblp . uni-trier . de/db/journals/expert/expert 24 . html # halevynp 09
* 霍尔、莫尼和基尔(1991 年)。电拓扑状态:分子图在原子水平上的结构信息。化学博士。Inf。计算机。Sci。, 31, 76–82.
* Japkowicz,N. (2000 年)。阶层失衡问题:意义与策略。2000 年国际人工智能会议(ICAI)论文集,111–117。
* Kubat,r . c . Holte 和 s . Matwin(1998 年)。卫星雷达图像中探测石油泄漏的机器学习。马赫。学习。, 30(2–3), 195–215.https://doi.org/10.1023/A:1007452223027
* 凌春霞、李、陈(1998)。直接营销的数据挖掘:问题与解决方案。第四届知识发现和数据挖掘国际会议论文集
, 73–79。
* 昆兰,J. R. (1993 年)。C4.5:机器学习程序。摩根·考夫曼出版公司。
* 史密斯、J. W .、埃弗哈特、J. E .、迪克森、W. C .、诺勒、W. C .、&约翰内斯、R. S. (1988)。使用 adap 学习算法预测糖尿病的发病。医疗保健中的计算机应用年度研讨会会议录,261–265。
* 赵晓明,李晓霞,陈,李,,王(2008)。不平衡数据下的蛋白质分类。蛋白质,70(4),1125–1132。https://doi.org/10.1002/prot.21870
# 使用 Domino Data Lab 简化数据访问并在雪花中发布模型结果
> 原文:<https://www.dominodatalab.com/blog/snowflake-and-domino-better-together>
## 介绍
为数据科学团队提供建立双向信息流所需的访问和能力是许多组织在从建模工作中释放价值时面临的一个关键挑战。
这一挑战的一部分是许多组织寻求使其数据科学工作流与数据仓库模式和实践相一致。这意味着牺牲数据的粒度和延迟,以获得更易于编写查询的结构,这些查询可以聚合、过滤和分组结果以用于报告目的。
当数据尽可能接近真实事件中发生的事情时,如金融交易、医疗咨询或营销活动结果,数据科学在高数据粒度下工作得最好。
也就是说,确保数据科学家不仅能够读取数据仓库结构,而且能够写入数据仓库结构,有很多好处。构建使数据科学家成为信息消费者和生产者的渠道,使得建模工作更有可能以一种终端用户可以改变业务运营的方式到达终端用户,即从数据科学工作中创造价值。
## Domino 数据实验室和雪花:一起更好
Domino 与 Snowflake 集成,通过提供一种现代的数据方法来解决这一挑战。这些现代模式使数据科学家能够从数据仓库中提取信息,关键是将模型得分和派生数据写回到数据仓库中,以便最终用户能够通过他们的报告和业务查询工具进行访问。
使用 Domino dataset 功能,将数据从雪花带到一个环境中,使断开的数据集(如 CSV 或从 API 连接汇集的实时信息)可用。
Domino 提供了一个强大的调度功能,可以协调一个完整的工作流,从雪花和其他来源获取数据,运行模型代码,并将结果(如预测分数)写回到雪花中供最终用户使用——将所有结果保存在一个地方,并与现有的数据存储存储在一起。
## 设置 Domino 环境来使用雪花。
Domino 本身是基于 Kubernetes 架构的,这使得基于容器的映像可以很容易地部署到可伸缩的可配置计算资源上。数据科学家可以访问 docker 指令,这些指令允许他们指定自己选择的工具和库。
要在 Domino 中配置访问环境,我们只需通过 docker 文件指令向该环境添加一个连接器。
1. *登录 Domino,在 Domino 的“实验室”中找到自己*
2. *选择侧边栏上的“环境”*
3. *选择要编辑的现有环境或创建新环境*
4. *在 Dockerfile 指令中,添加您选择的雪花连接器,例如 Python、R 或其他如 SQL Alchemy*
1. *Python 与熊猫:运行 pip 安装雪花-连接器-python【熊猫】*
2. *SQLAlchemy:运行 pip 安装雪花-sqlalchemy*
## 按用户/帐户详细信息进行身份验证
用户将他们的凭证存储为项目级别的环境变量,以使每个项目能够通过 Snowflake 进行身份验证。这些变量很容易改变,并允许每个项目有自己的独立连接到雪花,甚至多个雪花帐户。
虽然用户也可以将变量硬编码到他们自己的编码文件中,但使用环境变量是一种更安全、更灵活的选择。
要将环境变量添加到项目中,请执行以下操作:
1. *从 Domino workbench 中选择一个“项目”,然后在侧边栏上选择“项目设置”*
2. *在“环境变量”下选择“添加新的环境变量”*
3. *在本例中,我们将设置雪花账户、雪花密码和雪花用户*
1. *SNOWFLAKE_ACCOUNT:您的雪花计算 URL**的子域,即*[*https://test . eu-west-1 . snowflakecomputing . com/console #/data/databases*](https://test.eu-west-1.snowflakecomputing.com/console#/data/databases)*成为账户*
2. *雪花 _ 用户:您的雪花用户凭证*
3. *雪花 _ 密码:你的雪花密码*
![Setting environmental variables in Snowflake and Domino Data Lab](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/1deae53751bfe53e347f64fcf5243d78.png)
## 从雪花中检索信息以便在 Domino 中使用
Domino 为数据科学家提供了在提供 ide(如 Jupyter、R Studio 或 VS Code)的工作环境中运行代码的能力,或者相反,创建一个运行特定代码段的作业。
在这个例子中,我们使用 Jupyter 和 python 连接器从 Domino 环境中的 Snowflake 检索信息,对数据集执行一些简单的分析。
*使用在项目阶段设置的连接器库和雪花环境变量创建一个到雪花的连接*
```py
import snowflake.connector
import os
# Connect to Snowflake via Python Connector
ctx = snowflake.connector.connect(
user=os.environ['SNOWFLAKE_USER'],
password=os.environ['SNOWFLAKE_PASSWORD'],
account=os.environ['SNOWFLAKE_ACCOUNT']
)
cs = ctx.cursor()
```
*现在我们已经创建了一个雪花连接,我们编写一个查询来访问“DOMINO_TESTING”数据库和“wine_red”表,将结果打印到我们的 Jupyter 实例*
```py
cs.execute("USE DATABASE DOMINO_TESTING")
results = cs.execute("SELECT TOP 10 * from wine_red")
for rec in results:
print('%s, %s' % (rec[0], rec[1]))
cs.close
```
*为了使数据更加可行,我们现在要创建一个查询,将结果写入熊猫数据帧*
```py
#Write Snowflake Results into a Pandas Container
import pandas as pd
# Create a cursor object from previous connector and select database
cs = ctx.cursor()
cs.execute("USE DATABASE DOMINO_TESTING")
# Execute a statement that will generate a result set.
sql = "SELECT * from wine_red"
cs.execute(sql)
# Fetch the result set from the cursor and deliver it as the Pandas
DataFrame.df = cs.fetch_pandas_all()
df
```
现在,数据作为数据帧加载到 Domino 中,我们可以重复查询数据,而不会引起对雪花实例的回调,并按照我们认为合适的方式操作数据,比如添加列来对信息进行分组或分类。
为了将雪花查询结果作为一个永久对象存储在 Domino 项目中,我们在 Domino 项目中创建一个数据框对象到我们的数据目录后,将结果输出为一个 CSV 文件。
```py
#Write Snowflake Results into a CSV Output File.
df.to_csv('/mnt/data/wine_red_snowflake.csv', index=False)
```
## 将数据从 Domino 写入雪花
一旦开发出模型,就需要通过应用程序、应用编程接口或在这种情况下,将预测模型的模型得分写回到雪花中,以便业务分析师最终用户能够通过他们的报告工具访问预测。
在本例中,我们采用客户流失模型的结果,该模型对客户数据进行了一系列预测,以确定最有可能流失的客户。我们将展示将数据从 Domino 写入雪花的三种方式:
* 基于生成为 CSV 文件的模型输出在雪花中创建表格
* 基于模型输出文件覆盖雪花中的表
* 将新结果追加到现有雪花表中。
我们将使用 Python 中的 SQLAlchemy 来实现这一点,这是我们之前在环境中设置的。
*使用与雪花 Python 连接器相同的环境变量创建 SQLAlchemy 上下文,并指定我们希望写入数据的用户角色、数据库和模式。*
```py
import sqlalchemy as sql
import pandas as pd
import os
# Setup our SQLAlchemy Engine and connection to Snowflake
engine = sql.create_engine(
'snowflake://{u}:{p}@{a}/{d}/{s}?role={r}'.format(
u=os.environ['SNOWFLAKE_USER'],
p=os.environ['SNOWFLAKE_PASSWORD'],
a=os.environ['SNOWFLAKE_ACCOUNT'],
r='SYSADMIN',
d='DOMINO_TESTING',
s='PUBLIC'
))
```
现在,我们将 CSV 文件加载到 Pandas 数据框中,然后将该表写入 Snowflake 中的 DOMINO_TESTING 数据库。请注意,如果已经存在一个具有我们提供的名称的表,这将失败。
```py
data = pd.read_csv('/mnt/data/modelOut.csv')
data.to_sql('modelOutput', engine, index = False)
```
*现在,我们可以在雪花门户中访问我们的 SQL 浏览器,看到已经生成了一个包含 7900 行的新表。*
![SQL browser with 7.9k rows](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b02e3136706bd0d7ec1a04ec5dd43d48.png)
如果我们再次尝试运行相同的查询,我们将会收到一个错误,指示该表已经存在。
```py
ValueError: Table 'modelOutput' already exists
```
对于 SQLAlchemy,我们必须指定我们希望追加结果(如在文件底部写入更多结果)还是覆盖结果(如在删除表并重新创建中)。将结果追加到表中,或者通过指定 **if_exists** 参数来替换表。
*为了将结果追加到现有的表中,例如用一组新的结果更新它,我们将‘append’指定为****if _ exists****函数的参数。*
```py
data = pd.read_csv('/mnt/data/modelOut.csv')
data.to_sql('modelOutput', engine, index = False, if_exists='append')
```
![SQL Browser table with if_exists argument specified](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ffc3048094c34879e6defb15a552ffd5.png)
*为了删除并重新创建该表,我们将“替换”指定为* ***if_exists*** 的参数
```py
data = pd.read_csv('/mnt/data/modelOut.csv')
data.to_sql('modelOutput', engine, index = False, if_exists='replace')
```
![dropping and recreating the table with replace function](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e14a616f3121b25036a989c71748d874.png)
## 在 Domino 内部自动将模型结果部署到雪花中
Domino 为用户提供了四种将数据科学模型部署到生产中的方法:
* 发布一个 API,其他应用程序可以调用该 API 来按需接收预测
* 发布一个 Web 应用程序,让用户通过 Dash 或 Shiny 等界面使用数据科学模型
* 发布一个启动器,让用户向底层代码运行提供参数,以接收特定的结果(即日期范围)
* 发布一个调度作业,该作业在 Domino 环境中重复运行底层代码。
通过调度作业,Domino 能够与雪花无缝链接,轻松地从雪花环境中提取数据,执行模型运行,并将模型的结果返回到雪花数据表中,供最终用户使用,使用上述函数和雪花 Python 连接器或雪花 SQLAlchemy 引擎。
## 结论
将雪花和 Domino 结合在一起,研究人员和数据科学家可以更容易地从雪花中访问高质量的信息和强大的查询功能,同时利用 Domino 的开放、可扩展框架。它们共同赋予数据科学家在他们选择使用的任何代码库中访问、转换和操作数据的能力。
数据科学家可以轻松地将模型结果发布到雪花中,以便在数据库中提供预测分数和分类,并自动运行这些模型,使组织能够从他们的数据中提取更多价值,并在数据科学和业务专家之间建立更紧密的协作,这些专家根据模型的结果做出决策。
[![Webinar Snowflake + Domino: More Datasets, More Production Models, More Business Impact Closed loop data science from data management to model training, deployment, scoring, and monitoring Watch the webinar](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6bdee913af939a5fdb8970abf47845cb.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/c4ff7b3c-27f7-47bd-9336-7abb002dcd60)
#### 关于雪花
雪花提供了数据云,这是一个全球网络,成千上万的组织在其中以近乎无限的规模、并发性和性能移动数据。在数据云中,组织可以统一各自孤立的数据,轻松发现和安全共享受监管的数据,并执行各种分析工作负载。无论数据或用户生活在何处,雪花都能跨多个公共云提供单一无缝的体验。雪花的平台是为数据仓库、数据湖、数据工程、数据科学、数据应用开发和数据共享提供解决方案的引擎。
了解更多关于雪花的[。](https://c212.net/c/link/?t=0&l=en&o=3037049-1&h=3060057458&u=https%3A%2F%2Fwww.snowflake.com%2F&a=here)
#### 关于 Domino 数据实验室
Domino 数据实验室是企业数据科学团队的记录系统。该平台管理开发、部署和监控模型的端到端流程。它提供了广泛的功能,使数据科学生命周期中的实验、再现和协作易于管理,帮助组织更快地工作,更快地部署结果,并在整个企业中扩展数据科学。
### 集成功能
* 轻松地将雪花实例和数据源连接到 Domino 项目
* 轻松地从雪花数据库中提取和推送数据,以便将数据集快照存储在 Domino 中进行版本控制
* 利用雪花的时间旅行功能,让您重现长达 90 天的数据历史视图
* 为部署到雪花实例中的模型结果提供端到端的自动化和编排。
# 风暴为按需计算带来的雪花和激流
> 原文:<https://www.dominodatalab.com/blog/snowflake-and-rapids-for-on-demand-computing-by-a-storm>
随着数据被称为 21 世纪^(的[石油](https://www.wired.com/insights/2014/07/data-new-oil-digital-economy/))世纪以及数据科学被贴上本世纪最性感工作的标签,我们看到数据科学和机器学习应用在每个领域都出现了大幅增长。在 IT、金融和商业领域,预测分析正在颠覆每个行业。
然而,随着数据量的持续增长,数据科学家和 ML 工程师面临的最大挑战之一是如何高效地存储和处理如此大量的数据。当他们需要执行计算量很大的任务(如特征工程)时,问题会变得更糟。简单地说,基础设施目前是 ML 世界的限制因素。
因此,在今天的文章中,我们将探讨如何使用雪花和 NVIDIA 的 RAPIDS 解决大规模计算问题。而且,达斯克在这一切中也起着至关重要的作用。
## 一点背景
几年前,对于大多数企业来说,采用现场计算是显而易见的。然而,考虑到计算和存储需求的动态变化,这种模式不再适用。当他们需要扩展、进行数据备份以及同时使用多种数据格式时,会遇到一些问题。
为了应对这些问题,一些企业更进一步,建立了本地数据仓库。每当他们想要完成计算开销大的任务,如模型训练、特征工程等等,他们就将所有需要的数据转移到进行计算的地方。但这不仅非常慢且昂贵,而且对大多数人来说还存在各种安全问题。
然而,我们将在本文中讨论的架构通过将数据和计算这两个领域的精华结合起来解决了所有这些问题。
## 雪花+激流——为什么组合这么好?
先说雪花。[雪花数据云](https://www.snowflake.com/)是一个众所周知的云架构,完美地满足了用户的所有存储需求。传统上,现场存储解决方案面临着诸如**数据扩展、安全性、治理**等问题。然而,雪花没有遭受任何这些。您不仅可以方便地扩大容量,而且也不局限于存储任何特定类型的数据,可以存储您想存储的任何数据。
接下来,我们有 NVIDIA,它多年来因在重型计算的硬件和软件领域的持续卓越而闻名。在其各种成功的项目中,一个这样的项目是[RAPIDS](https://developer.nvidia.com/rapids)——一个**开源、** [**GPU 支持的**](https://www.nvidia.com/en-us/deep-learning-ai/software/rapids/) 平台,数据工程师可以在实现高达 100 倍加速的同时完成处理广泛的任务。
RAPIDS 的一大优点是它提供了所有常用的 API,如 pandas 和 scikit-learn,因此工程师可以专注于他们的用例,而不是担心实现。
当用于训练需要大量计算的端到端机器学习模型时,雪花和急流的这种组合在速度方面完全使传统方法相形见绌。然而,完整的集成还需要一个工具——Dask。在本文的后面,我们将看到 DASK 如何帮助我们实现这种端到端架构。
## 【Dask 在哪里发挥作用?
想知道我们为什么需要 Dask 吗?嗯, [Dask](https://www.dask.org/) 是数据科学社区中最著名的[并行计算框架](https://www.dominodatalab.com/blog/spark-dask-ray-choosing-the-right-framework)之一。它通过以分布式方式处理任务来帮助加速任务。幸运的是,Dask 支持数据科学家需要的大多数 API,比如 Pandas、sklearn,甚至本例中的 RAPIDS。
下面是我们如何使用 Dask-Snowflake 包将您的所有数据从 Snowflake 无缝导入 Dask dataframes。
```py
from dask_snowflake import read_snowflake
query = "Select * from SAMPLE_DATA LIMIT 100"
df = read_snowflake(query= query,
connection_kwargs=DB_CREDS)
```
## 查询从达斯克&急流下推至雪花
当用户从 Dask 客户端向 Snowflake 发送一个查询进行处理时,流程开始。一旦查询被发送并在 Snowflake 中处理,客户机就会以响应的形式接收所有 [SQL 结果集](https://sqlstudies.com/2016/01/14/what-is-result-sets/)的元数据。
这里需要注意的是,通常客户端一次只能处理结果集的一部分。然而,多亏了雪花使用的 [Apache Arrow](https://arrow.apache.org/) ,多个结果集可以作为独立的工作器发送,并且可以并行计算。
接下来,Dask 客户端接收到的元数据用于初始化从雪花中并行读取结果集,从而实现高速数据检索。这里值得一提的是,您可以在 Python 环境中完成所有这些工作,这是该架构的一个重要亮点,对于数据科学家来说非常有用。
最后,一旦以 Dask 数据帧的形式获得结果集,您就可以使用 RAPIDS 处理它们,同时利用 GPU 以闪电般的速度著称。这样,我们就完成了端到端的机器学习过程——无论是培训、验证还是功能工程。
## 分布式按需计算的一些优势
对于企业来说,转向分布式按需云计算不仅省事,而且相对经济高效。虽然如果公司规模较大,本地基础架构在成本方面可能会稍好一些,但它需要大量的前期资本,更不用说设置所需的时间了。
然而,这还不是全部。您可能不知道分布式云计算的许多其他方面。我们来过一遍:
### 1.无限存储
不管你怎么想,从长远来看,现场计算的存储总会有问题。即使你不是一个渴求数据的组织,这种情况现在很少发生,但总会有空间不足的时候。当这种情况发生时,与云计算相比,获得额外的存储空间肯定不是一件容易的事情,在云计算中,你几乎可以享受无限的存储空间。
### 2.快速部署
云服务提供商夜以继日地为您的部署提供无缝支持。即使你也有现场计算的专家,你也不可能与像亚马逊和微软这样的云计算巨头竞争,对吗?
因此,一旦你注册了云计算,不言而喻,部署将变得像点击一样简单。这节省了大量人力资源,增加了云系统的成本效益。
### 3.加强安全&治理
当您进行现场计算时,数据治理和安全性始终是一个大问题。亚马逊和微软等云供应商付出了额外的努力,以确保你不会面临任何这方面的问题。
然而,我要说的是,过去最著名的云计算供应商也出现过[安全漏洞](https://firewalltimes.com/amazon-web-services-data-breach-timeline/)。但就个人而言,与现场相比,它们还是少了很多。
# 基于网络的社会网络分析
> 原文:<https://www.dominodatalab.com/blog/social-network-analysis-with-networkx>
现实世界中的许多问题都涉及数据记录之间的依赖关系。例如,社会学家渴望了解人们如何影响他们的同龄人的行为;生物学家希望了解蛋白质如何调节其他蛋白质的活动。涉及依赖关系的问题通常可以用图来建模,科学家们已经开发出了回答这些问题的方法,称为网络分析。
这篇文章描述了如何使用 Python 库 [NetworkX](https://networkx.github.io/) ,来处理网络数据和解决网络分析中的有趣问题。
## 图表介绍
在我们深入现实世界的网络分析之前,让我们先回顾一下什么是图。图由一组称为顶点的对象 V 和一组连接成对顶点的边 E 组成。
![Example of a Graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b1b9261f43e192adbbda0a161f74d541.png)
在上图中,圆圈代表顶点,连接圆圈的线是边。如果这个图代表一个社会网络,那么圆圈代表人,两个顶点之间的边可以表示这两个人是朋友。
我们将着眼于一种特殊类型的网络,称为自我网络。在自我网络中,有一个“中心”顶点或网络围绕其旋转的自我顶点。
自我网络在社会学中很重要,因为它们允许研究者研究个体与其世界的关系结构。
## NetworkX 入门
```py
import networkx as nx
```
Domino 提供了 NetworkX 作为它的默认 Python 库之一,所以您所要做的就是用上面的语句导入这个库。
现在,让我们考虑一个真实世界的数据集:[脸书自我网络](https://snap.stanford.edu/data/egonets-Facebook.html)!
这个脸书组合自我网络数据集包含十个人的脸书朋友列表的聚合网络。在这个数据集中,顶点代表脸书上的个体,两个用户之间的边意味着他们是脸书的朋友。每个自我网络都是从一个脸书用户开始创建的,然后挖掘他所有的脸书朋友。然后通过识别出现在多个自我网络中的个体来聚集自我网络。
以下是我们将使用的网络数据集的一些基本信息:
* 节点:4039
* 边缘:88,234
* 平均学位:43.6910
![Facebook Network](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/1ae047eedfac6ba2b43b7bb42a49d7b9.png)
如您所见,这是一个相当连通的网络,网络中边的数量是节点数量的 20 倍以上,因此网络是密集集群的。如果您检查网络,您会注意到出现了某些顶点中枢。像这样的中心是现实社会网络的一个重要特征。密集的枢纽代表高度聚集,通常是科学家感兴趣的潜在社会机制的结果。
## 平行介数
我们如何确定谁是网络中最“重要”的个体。嗯,那要看“重要”的定义了。定义“重要性”的一种方式是个人的[中间性](https://en.wikipedia.org/wiki/Betweenness_centrality)。介数中心性是通过特定顶点的最短路径数量的度量。通过该顶点的最短路径越多,该顶点在网络中的中心位置就越高。
因为任何一对顶点之间的最短路径都可以独立于任何其他一对顶点来确定,所以我们可以利用 Domino 的多核硬件,使用并行算法来计算网络中每个顶点的介数中心性。
为此,我们将使用来自[多处理](https://docs.python.org/2/library/multiprocessing.html)库和 [itertools](https://docs.python.org/2/library/itertools.html) 库的池对象。在这里可以找到对 Python 中的多处理库和并行编程的很好的介绍。
```py
from multiprocessing import Pool
import itertools
```
我们需要做的第一件事是将网络的顶点划分成 *n* 个子集,其中 *n* 取决于我们可以访问的处理器数量。例如,如果我们使用具有 32 个内核的机器,我们将脸书网络划分为 32 个组块,每个组块包含 128 个顶点。
现在,我们可以让 32 个处理器并行计算 128 个顶点的介数,而不是一个处理器计算所有 4,039 个顶点的介数。这大大减少了算法的运行时间,并允许它扩展到更大的网络。
```py
def partitions(nodes, n):
"Partitions the nodes into n subsets"
nodes_iter = iter(nodes)
while True:
partition = tuple(itertools.islice(nodes_iter,n))
if not partition:
return
yield partition
# To begin the parallel computation, we initialize a Pool object with the
# number of available processors on our hardware. We then partition the
# network based on the size of the Pool object (the size is equal to the
# number of available processors).
def between_parallel(G, processes = None):
p = Pool(processes=processes)
part_generator = 4*len(p._pool)
node_partitions = list(partitions(G.nodes(), int(len(G)/part_generator)))
num_partitions = len(node_partitions)
#Next, we pass each processor a copy of the entire network and
#compute #the betweenness centrality for each vertex assigned to the
#processor.
bet_map = p.map(btwn_pool,
zip([G]*num_partitions,
[True]*num_partitions,
[None]*num_partitions,
node_partitions))
#Finally, we collect the betweenness centrality calculations from each
#pool and aggregate them together to compute the overall betweenness
#centrality score for each vertex in the network.
bt_c = bet_map[0]
for bt in bet_map[1:]:
for n in bt:
bt_c[n] += bt[n]
return bt_c
```
现在,让我们看看网络中具有前 10 个最高介数中心性度量的顶点。
![Betweenness in a network graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fc22161451c5824a7323c2d6fd6135b0.png)
如您所见,主要位于一个中枢中心或充当两个中枢之间桥梁的顶点具有较高的介数中心性。桥顶点具有高介数,因为连接集线器的所有路径都经过它们,集线器中心顶点具有高介数,因为所有集线器内路径都经过它们。
## 社区检测
对于那些使用脸书的人来说,你的脸书朋友可能来自你生活的不同方面:有些是你大学时的朋友,有些是你的同事,也许还有一些来自你家乡的老朋友。
因为你的朋友可以像这样分成不同的组,你可能想知道我们是否可以在你的社交网络中识别这些不同的*社区*。答案是肯定的!使用*社区检测*算法,我们可以将一个社交网络分解成不同的潜在重叠社区。
寻找好社区的标准类似于寻找好集群的标准。我们希望最大化社区内的优势,同时最小化社区间的优势。在形式上,该算法试图最大化网络的模块性,或者如果边是随机分布的,则最大化落在社区内的边的比例减去期望的边的比例。好的社区应该具有大量的社区内边缘,因此通过最大化模块性,我们检测到具有高比例社区内边缘的密集社区。
虽然 NetworkX 中没有社区检测方法,但一位好心人在 NetworkX 的基础上编写了一个[社区检测库。](https://python-louvain.readthedocs.io/en/latest/api.html)
```py
import community
```
这个库易于使用,并且允许在不到 3 行代码的无向图上执行社区检测!
```py
parts = community.best_partition(G_fb)
values = [parts.get(node) for node in G_fb.nodes()]
```
这就是全部了!
现在让我们看看不同的社区。
![Communities in a network graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/812fb27c0b7f175942c5c69653886f1b.png)
如您所见,社区与顶点中心紧密相连。因为这个数据集是由 10 个个体的自我网络聚合而成的,不同的社区很可能反映了不同的自我网络。
## 结论
图形和网络在数据科学中越来越受欢迎。 [Neo4j](http://neo4j.com/) 是一个将数据表示为图形的数据库,拓扑数据分析算法和光谱聚类算法基于图形来识别数据中的灵活模式和子结构。
你可以使用 [Domino](https://www.dominodatalab.com/product/domino-data-science-platform/) 在大型硬件上运行网络算法来加速你的计算。
![Notebook for data exploration of network graphs ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8313124b665cb923a8b419ffc3c44b12.png)
# Spark、Dask 和 Ray:选择正确的框架
> 原文:<https://www.dominodatalab.com/blog/spark-dask-ray-choosing-the-right-framework>
Apache Spark、Dask 和 Ray 是三种最流行的分布式计算框架。在这篇博文中,我们将探讨它们的历史、预期用例、优势和劣势,试图了解如何为特定的数据科学用例选择最合适的一个。
## 火花、达斯克和雷:一段历史
### 阿帕奇火花
Spark 由加州大学伯克利分校 AMPLab 的 Matei Zaharia 于 2009 年创立。该项目的主要目的是加速分布式大数据任务的执行,这些任务当时由 Hadoop MapReduce 处理。MapReduce 的设计考虑了可伸缩性和可靠性,但性能或易用性从来不是它的强项。MapReduce 将中间结果存储到磁盘的持续需求是 Spark 要克服的主要障碍。通过引入弹性分布式数据集(RDD)范式,并利用内存缓存和延迟评估,Spark 能够将延迟降低几个数量级(与 MapReduce 相比)。这使得 Spark 成为大规模、容错、并行数据处理的事实上的标准。该项目通过添加 GraphX(用于分布式图形处理)、MLlib(用于机器学习)、SparkSQL(用于结构化和半结构化数据)等进一步增强。值得注意的是,Spark 是用 Scala 编写的,后来加入了 Python 和 R 支持,因此与它交互一般不会有 Python 的感觉。理解 RDD 范式以及 Spark 中的工作方式需要一点时间来适应,但对于熟悉 Hadoop 生态系统的人来说,这通常不是问题。
### Dask
Dask 是一个用于并行计算的开源库,于 2015 年发布,所以相对于 Spark 来说是比较新的。该框架最初是由 Continuum Analytics(现在的 Anaconda Inc .)开发的,他们是许多其他开源 Python 包的创造者,包括流行的 Anaconda Python 发行版。Dask 最初的目的只是为了并行化 NumPy,以便它可以利用具有多个 CPU 和内核的工作站计算机。与 Spark 不同,Dask 开发中采用的原始设计原则之一是“不要发明任何东西”。这个决定背后的想法是,使用 Python 进行数据分析的开发人员应该对使用 Dask 感到熟悉,并且加速时间应该是最小的。据其创建者称,Dask 的设计原则已经发展了多年,现在它正被开发为一个用于并行计算的通用库。
围绕 parallel NumPy 的最初想法进一步发展,包括一个完全成熟但轻量级的任务调度器,它可以跟踪依赖性并支持大型多维数组和矩阵的并行化。后来增加了对并行熊猫数据帧和 scikit-learn 的进一步支持。这使得该框架能够缓解 Scikit 中的一些主要问题,如计算量大的网格搜索和工作流,它们太大而无法完全放入内存。单机并行化的最初目标后来被分布式调度程序的引入所超越,现在它使 Dask 能够在多机多 TB 问题空间中舒适地运行。
### 光线
Ray 是加州大学伯克利分校的另一个项目,其使命是“简化分布式计算”。Ray 由两个主要组件组成- Ray Core,这是一个分布式计算框架,以及 Ray 生态系统,广义地说,这是许多与 Ray 打包在一起的特定于任务的库(例如,Ray Tune -一个超参数优化框架,用于分布式深度学习的 RaySGD,用于强化学习的 RayRLib,等等。)
Ray 与 Dask 的相似之处在于,它允许用户以并行方式跨多台机器运行 Python 代码。然而,与 Dask 不同,Ray 并没有试图模仿 NumPy 和 Pandas APIs 它的主要设计目标不是替代数据科学工作负载,而是为并行化 Python 代码提供一个通用的底层框架。这使得它更像是一个通用的集群和并行化框架,可以用来构建和运行任何类型的分布式应用程序。由于 Ray Core 的架构方式,它通常被认为是构建框架的框架。也有越来越多的项目与 Ray 集成,以利用加速的 GPU 和并行计算。spaCy、Hugging Face 和 XGBoost 都是引入了 Ray 互操作性的第三方库的例子。
## 选择正确的框架
不幸的是,没有简单直接的方法来选择“最佳”框架。正如每个复杂问题的情况一样,答案在很大程度上取决于上下文以及在我们特定工作流程中起作用的许多其他因素。让我们看看这三个框架中的每一个,并考虑它们的优缺点,考虑各种常见的用例。
**火花**
* 赞成的意见
* 成熟的技术(2014 年 5 月发布)。
* 许多公司提供商业支持/服务。
* 非常适合针对大型数据集的数据工程/ ETL 类型的任务。
* 提供更高级别的 SQL 抽象(Spark SQL)。
* 骗局
* 涉及新执行模型和 API 的陡峭学习曲线。
* 调试可能具有挑战性。
* 复杂的架构很难由 IT 单独维护,因为正确的维护需要了解 Spark 的计算范例和内部工作方式(例如内存分配)。
* 缺乏丰富的数据可视化生态系统。
* 没有内置 GPU 加速。需要 [激流加速器](/resources/running-complex-workloads-using-on-demand-gpu-spark-rapids/) 来访问 GPU 资源。
**Dask**
* 赞成的意见
* 纯 Python 框架——非常容易升级。
* 对 Pandas 数据帧和 NumPy 数组的现成支持。
* 通过 [Datashader](https://datashader.org/) ,对数十亿行进行简单的探索性数据分析。
* 提供了 [*Dask 包*](https://docs.dask.org/en/latest/bag.html)——PySpark RDD 的 Pythonic 版本,具有*贴图*、*滤镜*、*分组、*等功能。
* Dask 可以带来令人印象深刻的性能改进。2020 年 6 月,Nvidia 报告了在 16 个 DGX A100 系统(128 个 A100 GPUs)上使用 RAPIDS、Dask 和 UCX 进行 TPCx-BB 测试的一些令人震惊的[结果。然而,对此不能全信。2021 年 1 月,TPC 迫使 Nvidia 取消这些结果,因为它们违反了 TPC 的公平使用政策。](https://www.datanami.com/2020/06/22/nvidia-destroys-tpcx-bb-benchmark-with-gpus/)
* 骗局
* 没有太多的商业支持(但有几家公司开始在这个领域工作,例如 Coiled 和 QuanSight)。
* 无内置 GPU 支持。 [依靠激流](https://docs.dask.org/en/latest/gpu.html) 进行 GPU 加速。
**雷**
* 赞成的意见
* 最小集群配置
* 最适合计算繁重的工作负载。已经表明,在某些机器学习任务上, [Ray 的表现优于 Spark 和 Dask](https://towardsdatascience.com/benchmarking-python-distributed-ai-backends-with-wordbatch-9872457b785c) ,如 NLP、文本规范化等。更重要的是,即使在单个节点上,Ray 的工作速度也比 Python 标准多处理快 10%左右。
* 因为 Ray 越来越多地被用于扩展不同的 ML 库,所以你可以以一种可扩展的、并行的方式一起使用它们。另一方面,Spark 将其生态系统中可用的框架数量限制得更少。
* 独特的基于参与者的抽象,其中多个任务可以在同一个集群上异步工作,从而提高利用率(相比之下,Spark 的计算模型不太灵活,基于并行任务的同步执行)。
* 骗局
* 相对较新(2017 年 5 月首次发布)
* 并不真正适合分布式数据处理。Ray 没有用于分区数据的内置原语。该项目刚刚引入了 [射线数据集](https://docs.ray.io/en/master/data/dataset.html) ,但这是一个全新的补充,仍然是相当新的和裸露的骨骼。
* GPU 支持仅限于调度和预留。实际使用 GPU 取决于远程函数(通常通过外部库,如 TensorFlow 和 PyTorch)
通过分析这三种框架的优缺点,我们可以提炼出以下选择标准:
* 如果工作负载以数据为中心,更多地围绕 ETL/预处理,我们最好的选择是 Spark。尤其是如果组织拥有 Spark API 的机构知识。
* Dask/Ray 的选择并不明确,但一般规则是,Ray 旨在加速任何类型的 Python 代码,其中 Dask 面向特定于数据科学的工作流。
让事情变得更加复杂的是,还有 Dask-on-Ray 项目,它允许您在不使用 [Dask 分布式调度器](https://distributed.dask.org/en/latest/) 的情况下运行 Dask 工作流。为了更好地理解 Dask-on-Ray 试图填补的空白,我们需要看看 Dask 框架的核心组件。这些是集合抽象(数据帧、数组等。)、任务图(DAG,表示类似于 Apache Spark DAG 的操作集合)和调度器(负责执行 Dask 图)。分布式调度程序是 Dask 中可用的调度程序之一,它负责协调分布在多台机器上的多个工作进程的动作。这个调度器很棒,因为它设置简单,保持最小的延迟,允许点对点数据共享,并支持比简单的 map-reduce 链复杂得多的工作流。另一方面,分布式调度程序并非没有缺陷。它的一些缺点包括:
* 这是一个单点故障——分布式调度程序没有高可用性机制,因此如果它出现故障,整个集群都需要重置,所有正在进行的任务都将丢失。
* 它是用 Python 编写的,这使得它易于安装和调试,但它也带来了通常与 Python 密切相关的标准性能考虑。
* 客户端 API 在设计时考虑到了数据科学家,而不是针对来自高可用性生产基础架构的调用而定制的(例如,假设客户端是长期的,可能通过 Jupyter 会话使用集群)。
* 它为有状态执行提供了最低限度的支持,因此很难实现容错管道。
* 它会成为一个瓶颈,并且无法进行本地扩展
相比之下,容错和性能是光线调度程序设计中根深蒂固的原则。它是完全去中心化的(没有瓶颈),提供更快的数据共享(通过 Apache Plasma),单个调度器是无状态的(容错),支持有状态的参与者,等等。这使得在 Ray 集群上运行 Dask 任务的吸引力变得很容易理解,也是 Dask-on-Ray 调度器[](https://docs.ray.io/en/latest/data/dask-on-ray.html)存在的理由。深入研究 Dask-on-Ray 项目超出了本文的范围,但是如果您对两者的性能进行更深入的比较感兴趣,请随意查看 Anyscale 完成的 [内存管理和性能基准](https://www.anyscale.com/blog/analyzing-memory-management-and-performance-in-dask-on-ray) 。
## 如何做出选择(提示:你真的需要吗?)
现在,我们已经了解了 Spark、Dask 和 Ray 的优缺点,并简要讨论了 Dask-on-Ray 混合技术,很明显这不会是“一刀切”的情况。这三个框架从一开始就有不同的设计目标,试图将根本不同的工作流硬塞进其中一个可能不是最明智的选择。一个更好的方法是在设计数据科学流程和配套基础设施时考虑灵活性,理想情况下,让您能够加快速度并使用合适的工具来完成工作。典型的管道可能涉及在 Spark 中进行的一些类似 ETL 的数据处理,然后是在 Ray 中执行的机器学习工作流。一个能够以受控、容错和按需方式自由运行这两种框架的平台使数据科学团队能够利用这两种框架的优势。
![Spark, Dask, and Ray: Choosing the right framework | Domino Data Lab](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7d1ca74d44df52f7b7eace70cbcc38b4.png)
从 Spark(数据帧)到 Ray(分布式训练)再回到 Spark(变压器)的流程的高级概述。射线估计器将这种复杂性封装在 Spark 估计器接口中。来源:[https://eng.uber.com/elastic-xgboost-ray/](https://eng.uber.com/elastic-xgboost-ray/)
混合框架的重要性已经很明显,集成库的出现使得框架间的交流更加流畅。例如, [Spark on Ray](https://docs.ray.io/en/latest/data/raydp.html) 正是这样做的——它“结合了你的 Spark 和 Ray 簇,使得使用 PySpark API 进行大规模数据处理变得容易,并无缝地使用这些数据来训练你使用 TensorFlow 和 PyTorch 的模型。”还有 Spark 项目上的[Ray](https://github.com/intel-analytics/analytics-zoo),可以让我们在 Apache Hadoop/YARN 上运行 Ray 程序。这种方法也已经在实际生产工作负载中得到成功测试。例如,优步的机器学习平台 [米开朗基罗](https://eng.uber.com/michelangelo-machine-learning-platform/) 定义了一个光线估计器 API,为最终用户抽象出在火花和光线之间移动的过程。这在优步工程公司最近的出版物中有详细介绍,其中涵盖了一个用于分布式训练的 [架构](https://eng.uber.com/elastic-xgboost-ray/) ,涉及到 Spark 和 XGBoost on Ray。
## 摘要
在本文中,我们研究了三个最流行的并行计算框架。我们讨论了它们的优缺点,并就如何为手头的任务选择合适的框架给出了一些一般性的指导。建议的方法不是寻找适合每种可能的需求或用例的最终框架,而是了解它们如何适应各种工作流,并拥有足够灵活的数据科学基础架构,以允许混合搭配方法。
[![Webinar 50x Faster Performance with Ray and NVIDIA GPUs See Ray in action, boosted by performance gains from NVIDIA GPU-acceleration. Watch the webinar](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/11a384e7b01583cacaef89b7e8813253.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/17946acf-bac1-417d-8261-1b048f64d48b)
# 通过 Spark 的并行 C/C++代码执行加速机器学习
> 原文:<https://www.dominodatalab.com/blog/speeding-up-machine-learning-with-parallel-c-code-execution-via-spark>
C 编程语言是在 50 多年前引入的,从那以后,它一直占据着最常用编程语言的位置。随着 1985 年 C++扩展的引入以及类和对象的增加,C/C++对在所有主要操作系统、数据库和一般性能关键应用程序的开发中保持了中心地位。由于其效率,C/C++支持大量的机器学习库(如 TensorFlow、Caffe、CNTK)和广泛使用的工具(如 MATLAB、SAS)。当想到机器学习和大数据时,C++可能不是第一个想到的东西,但它在需要闪电般快速计算的领域无处不在——从谷歌的 Bigtable 和 GFS 到几乎所有与 GPU 相关的东西(CUDA、OCCA、openCL 等)。)
不幸的是,当谈到并行数据处理时,C/C++并不倾向于提供开箱即用的解决方案。这就是大规模数据处理之王 Apache Spark 的用武之地。
## 通过 RDD.pipe 调用 C/C++
根据其 [文档](https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.RDD.pipe.html),*管道*操作符使 Spark 能够使用外部应用程序处理 RDD 数据。*管道*的使用不是 C/C++特有的,它可以用来调用用任意语言编写的外部代码(包括 shell 脚本)。在内部,Spark 使用一种特殊类型的 RDD[piped rdd](https://spark.apache.org/docs/0.7.3/api/core/spark/rdd/PipedRDD.html),通过指定的外部程序来传输每个数据分区的内容。
让我们看一个简单的例子。下面是一个基本的 C 程序,它从标准输入(stdin)中读取并鹦鹉学舌般地返回字符串,前缀为“Hello”。该程序存储在一个名为 *hello.c* 的文件中
```py
/* hello.c */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
char *buffer = NULL;
int read;
size_t len;
while (1) {
read = getline(&buffer, &len, stdin);
if (-1 != read)
printf("Hello, %s", buffer);
else
break;
}
free(buffer);
return 0;
}
```
让我们编译并测试它。请注意,您可以按 Ctrl+D 来中断执行。
```py
$ gcc -o hello hello.c
$ ./hello
Dave
Hello, Dave
Kiko
Hello, Kiko
Dirk
Hello, Dirk
$
```
到目前为止一切顺利。现在让我们看看如何将这段代码传送到 Spark RDD。首先,在我们尝试实际执行编译后的 C 代码之前,我们需要确保两件事情已经就绪:
* 访问 Spark 集群——这是一个显而易见的先决条件,在 Domino MLOps 平台中构建按需 Spark 集群是一个简单的操作[](https://docs.dominodatalab.com/en/4.3.1/reference/spark/on_demand_spark/On_demand_spark_overview.html),只需点击几下鼠标即可完成。或者,你可以在 [独立模式](https://spark.apache.org/docs/latest/spark-standalone.html) 下运行 Spark。
* 我们计划使用的外部代码应该对所有负责运行应用程序的 Spark 执行者可用。如果我们使用的是 Domino 按需 Spark,所有执行者都默认访问一个 [共享数据集](https://docs.dominodatalab.com/en/5.0.1/reference/data/data_in_domino/datasets.html) 。我们要做的就是把编译好的 C/C++程序放到数据集的文件夹里。或者,我们可以修改驱动程序以包含对[Spark context . addfile()](https://spark.apache.org/docs/latest/api/python/reference/api/pyspark.SparkContext.addFile.html)的调用,这将强制 Spark 在每个节点上下载作业引用的外部代码。我们将展示如何处理上述两种情况。
假设我们使用的是 Domino,我们现在可以将编译好的 hello 程序放到一个数据集中。如果我们项目的名称是 SparkCPP,那么默认情况下,我们可以从工作区访问位于/domino/datasets/local/spark CPP/的数据集。让我们复制那里的 hello 程序。
```py
$ cp hello /domino/datasets/local/SparkCPP/
```
接下来,我们创建主程序 test_hello.py,我们将使用它来测试管道。这个 PySpark 应用程序将简单地并行化一个 RDD,并直接传输位于数据集内部的外部代码。
```py
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("MyAppName") \
.getOrCreate()
# Suppress logging beyond this point so it is easier to inspect the output
spark.sparkContext.setLogLevel("ERROR")
rdd = spark.sparkContext.parallelize(["James","Cliff","Kirk","Robert", "Jason", "Dave"])
rdd = rdd.pipe("/domino/datasets/local/SparkCPP/hello")
for item in rdd.collect():
print(item)
spark.stop()
```
对于远程集群(即独立且不在 Domino 中运行的集群),我们可以修改代码来显式分发 hello 程序。注意,管道命令的访问路径发生了变化,因为 hello 代码现在位于每个执行器的工作目录中。我们还假设编译后的 C 程序的绝对路径是/mnt/hello。
```py
from pyspark.sql import SparkSession
spark = SparkSession \
.builder \
.appName("HelloApp") \
.getOrCreate()
spark.sparkContext.addFile("/mnt/hello")
rdd = spark.sparkContext.parallelize(["James","Cliff","Kirk","Robert", "Jason", "Dave"])
rdd = rdd.pipe("./hello")
for item in rdd.collect():
print(item)
spark.stop()
```
通过 spark-submit 运行程序在两种情况下都会产生相同的输出:
```py
$ spark-submit test_hello.py
2022-02-10 09:55:02,365 INFO spark.SparkContext: Running Spark version 3.0.0
…
Hello, James
Hello, Cliff
Hello, Kirk
Hello, Robert
Hello, Jason
Hello, Dave
$
```
我们看到我们的 C 程序正确地连接了 RDD 的所有条目。此外,这个过程是在所有可用的工作人员上并行执行的。
## 使用编译的库和 UDF
现在让我们来看一些更高级的东西。我们将看到如何使用一个编译过的库(共享库或共享对象的集合,如果我们想使用 Linux 术语的话)并将其中的一个函数映射到一个 Spark 用户定义函数(UDF)。
我们首先在一个名为 *fact.c* 的文件中放置一个简单的 C 函数,它计算一个数 n 的阶乘:
```py
/* fact.c */
int fact(int n) {
int f=1;
if (n>1) {
for(int i=1;i<=num;i++)
f=f*i;
}
return f;
}
```
上面的代码非常简单明了。然而,我们将把它编译成一个。所以库并定义了一个事实()的 UDF 包装器。在我们这样做之前,我们需要考虑有哪些选项可以帮助我们实现 Python 和 C/C++的接口。
* SWIG(Simplified Wrapper and Interface Generator)——一个成熟的框架,将 C 和 C++编写的程序与各种高级编程语言连接起来,如 Perl、Python、Javascript、Tcl、Octave、R 和 [许多其他的](http://www.swig.org/compat.html#SupportedLanguages) 。SWIG 最初开发于 1995 年,是一个成熟而稳定的包,惟一的缺点是它的灵活性是有代价的——它很复杂,需要一些额外的预编译步骤。值得注意的是,因为 SWIG 或多或少与语言无关,所以可以用它将 Python 与框架支持的任何语言进行接口。它自动包装整个库的能力(假设我们可以访问头文件)也非常方便。
* CFFI (C 对外函数接口)——根据它的 [文档](https://cffi.readthedocs.io/en/latest/overview.html#overview) 来看,使用 CFFI 的主要方式是作为一些已经编译好的共享对象的接口,这些共享对象是通过其他方式提供的。该框架通过动态运行时接口增强了 Python,使其易于使用和集成。然而,运行时开销会导致性能下降,因此它落后于静态编译的代码。
* Cython——Python 的超集,cy thon 是一种为速度而设计的编译语言,它为 Python 提供了额外的受 C 启发的语法。与 SWIG 相比,Cython 的学习曲线不太陡峭,因为它自动将 Python 代码翻译成 C,所以程序员不必用低级语言实现逻辑来获得性能提升。不利的一面是,Cython 在构建时需要一个额外的库,并且需要单独安装,这使得部署过程变得复杂。
当然,还有其他选择(Boost。Python 和 Pybindgen 跃入脑海),但是对每个 C/C++接口工具的全面概述超出了本文的范围。现在,我们将提供一个使用 SWIG 的例子,这或多或少是我们的最爱,因为它的成熟和多功能性。
在 Linux 上安装 SWIG 再简单不过了——它归结为一个简单的 *sudo 来安装 swig* 命令。如果你想看其他操作系统的安装过程,请随意看它的 [文档](http://www.swig.org/Doc4.0/SWIGDocumentation.html) 。还有一个简单的 [教程](http://www.swig.org/tutorial.html) 提供了一个 10 分钟的“入门”介绍,对于想要熟悉使用框架的人来说是一个简单的方法。
假设我们已经安装了 SWIG,构建共享库所需的第一步是为它创建一个接口。这个文件作为 SWIG 的输入。我们将把这个文件命名为我们的 *fact()* 函数 fact.i (i 代表接口),并将函数定义放在里面,如下所示:
```py
/* fact.i */
%module fact
%{
extern int fact(int n);
%}
extern int fact(int n);
```
然后我们运行 SWIG 来构建一个 Python 模块。
```py
$ swig -python fact.i
```
我们看到 SWIG 生成了两个新文件:
* fact.py(基于接口文件中的模块名)是一个我们可以直接导入的 Python 模块
* fact_wrap.c 文件,它应该被编译并与外部代码的其余部分链接
```py
$ ls -lah
total 132K
drwxrwxr-x 2 ubuntu ubuntu 4.0K Feb 10 14:32 .
drwxr-xr-x 6 ubuntu ubuntu 4.0K Feb 10 11:13 ..
-rw-rw-r-- 1 ubuntu ubuntu 110 Feb 10 11:20 fact.c
-rw-rw-r-- 1 ubuntu ubuntu 55 Feb 10 14:32 fact.i
-rw-rw-r-- 1 ubuntu ubuntu 3.0K Feb 10 14:32 fact.py
-rw-rw-r-- 1 ubuntu ubuntu 112K Feb 10 14:32 fact_wrap.c
$
```
接下来,我们使用 GCC 来编译函数和包装器:
```py
$ gcc -fpic -I /usr/include/python3.6m -c fact.c fact_wrap.c
$
```
最后,我们将目标文件捆绑到一个名为 _fact.so 的共享库中:
```py
$ gcc -shared fact.o fact_wrap.o -o _fact.so
$ ls -lah
total 240K
drwxrwxr-x 2 ubuntu ubuntu 4.0K Feb 10 14:36 .
drwxr-xr-x 6 ubuntu ubuntu 4.0K Feb 10 11:13 ..
-rw-rw-r-- 1 ubuntu ubuntu 108 Feb 10 14:33 fact.c
-rw-rw-r-- 1 ubuntu ubuntu 89 Feb 10 14:35 fact.i
-rw-rw-r-- 1 ubuntu ubuntu 1.3K Feb 10 14:35 fact.o
-rw-rw-r-- 1 ubuntu ubuntu 3.0K Feb 10 14:35 fact.py
-rwxrwxr-x 1 ubuntu ubuntu 51K Feb 10 14:36 _fact.so
-rw-rw-r-- 1 ubuntu ubuntu 112K Feb 10 14:35 fact_wrap.c
-rw-rw-r-- 1 ubuntu ubuntu 50K Feb 10 14:35 fact_wrap.o
$
```
我们现在需要将共享库放在一个所有 worker 节点都可以访问的地方。选项大致相同——共享文件系统(例如 Domino dataset)或在执行期间通过 SparkContext.addFile()添加库。
这一次,我们将使用共享数据集。不要忘记将编译后的库和 Python 包装器类都复制到共享文件系统中。
```py
$ mkdir /domino/datasets/local/SparkCPP/fact_library
$ cp _fact.so /domino/datasets/local/SparkCPP/fact_library/
$ cp fact.py /domino/datasets/local/SparkCPP/fact_library/
```
这是我们将用来测试外部库调用的 Spark 应用程序。
```py
import sys
from pyspark.sql import SparkSession
from pyspark.sql.functions import udf
from pyspark.sql.types import IntegerType
def calculate_fact(val):
sys.path.append("/domino/datasets/local/SparkCPP/fact_library")
import fact
return fact.fact(val)
factorial = udf(lambda x: calculate_fact(x))
spark = SparkSession \
.builder \
.appName("FactApp") \
.getOrCreate()
df = spark.createDataFrame([1, 2, 3, 4, 5], IntegerType()).toDF("Value")
df.withColumn("Factorial", \
factorial(df.Value
)) \
factorial(df.Value)) \
.show(truncate=False)
spark.stop()
```
这里有几件事需要注意。首先,我们使用 *calculate_fact* ()作为用户定义的函数(UDF)。UDF 是用户可编程的例程,作用于单个 RDD 行,是 SparkSQL 最有用的特性之一。它们允许我们扩展 SparkSQL 的标准功能,并促进代码重用。在上面的代码中,我们使用 org.apache.spark.sql.functions 包中的 *udf* (),它采用一个 Python 函数并返回一个 UserDefinedFunction 对象。然而,上面的 Python 函数是对我们的共享库和底层 C 实现的调用。第二件要注意的事情是,我们使用了 *sys.path.append* (),它告诉 Python 添加一个特定的路径,以便解释器在加载模块时进行搜索。我们这样做是为了迫使 python 寻找位于/domino/datasets/local/spark CPP/fact _ library 下的事实模块。注意, *append* ()和 *import* 调用是 *calculate_fact* ()函数的一部分。我们这样做是因为我们希望在所有工作节点上附加路径和导入模块。如果我们将这些与脚本顶部的其他导入捆绑在一起,导入将只发生在 Spark 驱动程序级别,作业将会失败。
下面是运行上面的 Spark 应用程序的输出。:
```py
$ spark-submit test_fact.py
2022-02-11 16:25:51,615 INFO spark.SparkContext: Running Spark version 3.0.0
…
2022-02-11 16:26:07,605 INFO codegen.CodeGenerator: Code generated in 17.433013 ms
+-----+---------+
|Value|Factorial|
+-----+---------+
|1 |1 |
|2 |2 |
|3 |6 |
|4 |24 |
|5 |120 |
+-----+---------+
…
2022-02-11 16:26:08,663 INFO util.ShutdownHookManager: Deleting directory /tmp/spark-cf80e57a-d1d0-492f-8f6d-31d806856915
$
```
##
总结
在本文中,我们研究了如何通过访问外部 C/C++库提供的闪电般的操作来增强 Spark 这个无可争议的大数据处理之王。注意,这种方法并不仅限于 C 和 C++,因为 SWIG 等框架提供了对许多其他语言的访问,如 Lua、Go 和 Scilab。其他项目如 [gfort2py](https://github.com/rjfarmer/gfort2py) 也提供了对 Fortran 的访问。
此外,人们可以使用 NVIDIA CUDA 来编写、编译和运行调用 CPU 功能和启动 GPU 内核的 C/C++程序。然后可以通过 Spark 经由共享库访问这些代码,提供并行化和 GPU 加速的自定义操作。
#### 额外资源
* Domino Enterprise MLOps 平台提供了对按需 Spark 计算的灵活访问。它提供了直接在云或支持 Domino 实例的本地基础设施上动态配置和编排 Spark 集群的能力。它还可以直接运行 NVIDIA 的 [NGC 目录](https://catalog.ngc.nvidia.com/containers) 中的容器。注册并了解该平台如何帮助您加快组织中的模型速度。
* 了解更多关于 [Spark、Ray 和 Dask](https://blog.dominodatalab.com/spark-dask-ray-choosing-the-right-framework)T2 的信息,以及如何为您的机器学习管道选择正确的框架。
# Warby Parker 的利益相关者驱动的数据科学
> 原文:<https://www.dominodatalab.com/blog/stakeholder-driven-data-science-warby-parker>
*[Warby Parker](https://www.warbyparker.com/)的数据科学负责人 Max Shron 在一个数据科学弹出式菜单上发表了一篇关于利益相关者驱动的数据科学的演讲。这篇博客文章提供了一个会议摘要,一个整个会议的视频,以及一个演示文稿的视频抄本。如果你有兴趣参加未来的[数据科学活动,下一次活动将于 11 月 14 日在芝加哥](https://popup.dominodatalab.com/chicago/?utm_source=blog&utm_medium=post&utm_campaign=stakeholder-driven-data-science-warby-parker)举行。*
## 会话摘要
在这个数据科学的弹出式会议中,Warby Parker 的数据科学主管 Max Shron 深入研究了利益相关者驱动的数据科学。他的方法使他的数据科学团队能够做正确的事情,交付尽可能多的价值,并被视为整个公司的价值驱动者。Shron 设想了一个世界,公司在数据科学上花费的钱与他们在组织的其他主要部分上花费的钱一样多。他主张,为了实现这一点,数据科学工作应该做到*“对我们的同事最有利”*,并考虑像“*这样的问题:我们如何确保构建有价值的东西?我们如何确保十年后,数据科学作为一个整体,拥有今天你从技术中获得的那种思维分享?”*
本次会议的几个重要亮点包括
* 利益相关者驱动的数据科学始于数据科学家花更多的时间倾听和与利益相关者交谈,花更少的时间做数据准备、数学和编程
* 尽早创建模型的重要性,以发现一个可交付物是否能让涉众“做一些不同的事情”
* 一个推荐的“优先级规划”框架,帮助数据科学团队评估“符合利益相关者的工作流程”、“保真度和准确性”、“代码质量和可再现性”、“不确定性的正确处理”和“技术有趣性”之间的权衡
* 浏览一个零售选址示例,该示例引导团队构建了两个模型,一个在城市级别,确定一个城市可以容纳多少家商店;另一个在人口普查区域或站点级别,考虑“如果我在这里建一家商店,它会怎么样?”
如欲了解更多关于本次会议的见解,请观看视频或通读文字记录。
![Data science at Warby Parker](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8b7f490d2bfaad926ff6c2706c76abe3.png)
## 演示文稿的视频记录
大家好。
谢谢你这么晚还留在这里。
我叫马克斯·史隆。我是 Warby Parker 的数据科学主管。本次演讲将讨论 Warby Parker 如何解决从事正确工作的问题,以及我们如何确保数据科学团队交付尽可能多的价值。我们希望确保数据科学团队不会在几年后被视为公司历史上的一个脚注。我们希望成为真正被视为全公司价值主要驱动力的人。
如果你不熟悉 Warby Parker,我们是一家总部设在美国和加拿大的眼镜公司,最初在网上。我们出售价格适中的眼镜,起价为 95 美元,包括直接运送到人们家中的镜片和镜架。相比之下,如果你在一家典型的眼镜店或美国主要街道上的某个地方买一副眼镜,你通常会发现眼镜——一副好的、高质量的眼镜售价为 400 美元或 500 美元。我们正以相当大的折扣出售它们。该公司也是一家 B 公司。我们有这个利益相关者驱动的价值体系。我们不仅要确保股东的利益,还要确保员工、环境、客户以及参与我们工作的所有人的利益。
除了销售眼镜,我们还有一个“买一副,送一副”项目,我们向发展中国家的一些非营利组织捐款,培训人们成为眼镜商。他们自己学习如何销售眼镜。我们能够真正地(而不是用我们自己的眼镜充斥市场)确保世界各地的专业人员为每个人提供高质量的眼镜。
如果你不熟悉一副眼镜是如何戴在某人脸上的,这是一个快速的图表。人们在 Warby Parker 购买的每一副眼镜都是从他们在某个地方听说过它开始的。他们从一些广告中听说,或者从朋友口中听说。然后他们访问我们的网站,或者他们访问我们的一个商店。我们最初是做电子商务的。我们现在是零售为主。我们是这种新的全渠道优先业务的最突出的例子之一。
或者他们可以把东西送到家里。我们有一个家庭试戴计划,您可以获得五副送到您家的眼镜,免费试戴,然后全部寄回,然后我们会为您制作一副,并寄给您一副有正确处方的眼镜。
他们去商店,或者在网上购物。他们看着各种各样的玻璃杯。他们必须挑选一副他们真正想要的眼镜。他们挑选一个,然后我们自己并通过第三方承包商进行光学服务。我们必须把玻璃切掉,放入镜框,让人们得到他们需要佩戴的眼镜。然后,产品被运送到客户手中,客户可能会非常高兴,并告诉他们的朋友,这样我们就实现了良性循环。
这个过程中的每一步,都需要做出很多决定。在这个过程中的每一步,我们都必须决定“我们如何开展营销活动?”,“我们的网站应该是什么样的?”、“我们应该把店铺放在哪里?”,“我们应该如何运行我们的家庭试穿计划?”、“我们的搭配中应该有哪些种类的玻璃杯?”。我们必须订购眼镜。从你设计一副眼镜到它们真正上架,需要几个月到一年(有时甚至更长)的时间。我们如何预测那些能真正帮助我们超越这类事情的趋势?当我们在我们的光学服务实验室制作自己的眼镜时,我们如何决定将这些实验室放在哪里?
Warby Parker 在纽约的 Sloatsburg 有我们自己的完全拥有的实验室,我们必须在那里制造装配线,有多班工人,以及所有类似的东西。然后,我们必须把这些东西装上卡车或飞机,运出去给顾客。再说一次,他们必须对此感到高兴,而且他们会在之后继续与我们交谈,希望保持接触。
这一过程中的每一个步骤,以及其他步骤,在 Warby Parker 都有专门致力于此的整个团队。我们有一个供应链团队,他们唯一的工作就是确保这里的这部分工作正常。我们有一个销售规划团队,他们的工作主要是——这不是他们唯一的工作——预测库存趋势,设计一副眼镜,并确保我们有合适的库存,这样顾客就能真正得到他们想要的东西。
在整个公司中,在我们总部的几百人中,大约有 30 人是某种类型的分析师。这不包括数据科学团队。这些人坐在这些团队中,做大量的日常决策支持,使这些活动成为可能。数据科学团队是一个集中化的团队,本质上是一个内部咨询小组。我和我的几个同事是从一个小型咨询商店进入 Warby Parker 的。我们带来的视角实际上是一家试图解决问题的集中式咨询公司,这些问题需要更多的预测分析、更多的优化、更多的机器学习和更多的自动化,而这些都不是分析师通常能获得的。
我认为——先把这个东西(幻灯机)关掉一会儿——我们试图弄清楚的核心问题是……“我们如何确保我们创造了有价值的东西?我们如何确保十年后,数据科学作为一个整体,拥有今天你从技术中获得的那种思维分享?”我可以预见 10 年后,大多数公司仍然只有两三名数据科学家。我想生活在这样一个世界里,10 年后,公司花在数据科学上的钱和他们花在组织其他主要部分的钱一样多。那么,我们如何确保我们所做的工作能够真正传递这种价值,而不是让书呆子们专注于那些可能是技术上最有趣的事情,而不一定是对我们的同事最有益的事情呢?
我的方法被我称为“利益相关者驱动的数据科学”。
我对此的想法是,如果你看这里的顶部[参考屏幕上的幻灯片],那么“一个数据科学家认为他们在进入该行业之前的时间将如何度过的‘天真估计’是什么?”他们认为都是数学和编程。我们都知道,实际上很多都是数据准备。但现在,在这一点上,我们作为一个团队结束的地方,意识到我们整个三分之一的时间实际上是花在倾听和与公司的利益相关者交谈上。与主题专家交谈,他们真的会从我们的工作中受益,并在我们工作的整个生命周期中与他们保持联系。显然,数据准备仍然是其中的核心部分。数学和编程不会消失。这才是真正传递价值的东西。我最后想说的是监控。因此,除了所有这些工作,我们必须确保我们建造的东西对人们有用,对吗?从头到尾都保持着相关性。
我将讲述我们作为一个团队使用的一点流程,以确保我们完成第一步。我将快速介绍两个我们已经完成的产品示例,以及它们是如何组合在一起的。
第一个例子,零售选址。Warby Parker 现在有 50 家店铺,实际上,到今天为止有 52 家。今年我们将再开 20 家,所以我们发展非常迅速。一个核心问题是,你在纽约市开第一家店吗?还是你在克利夫兰的第一家店?这里有一个明显的权衡,因为你正在发展一家公司,你决定实际上把你的商店。他们要进入沃比·帕克了。当我到达那里时,已经有一个数据科学团队。他们已经做了一些工作。有一个非常合理的回归模型可以解释这一点。但是我们的任务是,“我们怎样才能造出对我们更有帮助的东西来理解同类相残?”…更多地了解业务的不同部分如何相互配合,并做一些对零售团队真正有帮助的预测。
我们处理这类问题的方法是,首先,我们从模型开始。我们从没有真正分析内容的事情开始,除了验证如果我们把这个可交付物放在决策者面前,他们实际上能做一些不同的事情。我想今天早上乔纳森·罗伯特谈到了提出正确问题的重要性。我完全同意。然后,有了这个直接的问题,下一个问题就是,“我能给你什么来帮助你回答这个问题?在我考虑数学或程序看起来像什么来实现它之前”。
所以这个项目的第一阶段,我们所做的是我们实际上把它们放在一起——所以这个地图[指向屏幕],这只是我从谷歌图片中提取的一个东西。这是一个 choropleth。我想他们正在播放城市里的 311 电话。但我最初的直觉是,在我们的零售团队面前放一张地图,告诉他们,“这将是一张设置商店的地图。这对你有帮助,对吗?”他们实际上说不,这对他们没有帮助。因为事实证明他们必须做出两个重大决定。一是关注哪些城市。第二个问题是,当房地产顾问给了他们一个地点时,他们想选择哪个地点?他们没有机会看地图,选择开店的地点。当它们从堆栈中出来时,他们必须对它们进行评估。
我们最终意识到我们需要制造两种不同的模型。一个城市级别的模型,这个城市能容纳多少家商店。还有一个单独的模型,在人口普查的时候,或者在场地级别,它说,“如果我在这里建一个商店,它会怎么样?我们认为它实际上会获得多少销量?”如果你想一想当我们在一堆不同的竞争项目中做出决定时,我们必须经历的优先级,竞争解决这个问题的方法,我们真的必须有某种优先级…它告诉我们在我们能做的事情中,什么比其他的更重要。从某种意义上来说,这是这次演讲的关键幻灯片。
我们意识到,做出符合决策者工作流程的东西是头等大事。实际上,比做一个精确的模型更重要。如果我能多花一周时间来构建一些东西,就像手套一样,直接适合他们已经在做的事情,并且他们知道他们会使用它,那么这一周比花一周时间来提高模型的准确性要好。
[对幻灯片的手势]我们适应工作流程、保真度和准确性,然后是代码质量和可再现性。我们不想一遍又一遍地做同一件事,我们想做点什么,然后继续前进。我们希望确保当上游的数据发生变化时,我们不会不得不回去修复它。至少,它会抛出一个错误。它不会给某人错误的结果。所以我们花了很多时间在我们的项目上设置护栏,确保我们已经真正指定了我们预期要通过的数据集的所有不变性,以便希望通过的数据不会在发生变化时让我们措手不及。
在这之后,在这个代码质量之后,是正确处理不确定性。这是我的内心统计书呆子现在希望这是第一位的优先事项。对我的置信区间和可信度区间进行准确、全面的覆盖,是我非常关心的事情。但是我必须认识到,这比拥有一个适合人们工作流程并且可重复的精确模型更重要。
最后,技术上有趣的事情。它在这里(幻灯片上),因为它是一个值。这是一个优先事项,做这样的事情:有利于留住人才,有利于找到新的解决方案,做技术创新的事情。但它仍然比其他位优先级低,不管是好是坏。
我提到的这个项目的一个例子是关于决定商店的位置。获得每个站点和城市的销售预测比地图更重要,对吗?尽管在某种意义上,地图是更好的解决问题的方法。显然,有好的误差是很重要的。如果我们要说商店会赚 x 百万美元,它通常会做得很好。我们希望确保我们的整个工作流程是可重复的。我们在这件事上并不冷静。我们使用的是 makefiles 文件,它们工作得很好。我们确实花了一些时间来验证我们的误差线。我们尝试了一些基于人口统计和其他因素的分层方法。它们是值得的,但最终,在这种情况下,我认为是正确的,我们放弃了这些路线,转而在其他方面花更多的时间,这样我们就可以完成这个产品,从事其他工作。
为了让你们快速了解我们的结局。因此,我们最终建立了一个模型,该模型认为,对于给定的人口普查区域,市场渗透率将是距离的函数。这个距离,这个函数,将会根据人口统计和人口普查区域的其他因素而改变。如果你把这看起来像是一个因果模型,你可以想象如果我有一种药,我想给一群病人。我认为结果是剂量依赖性的,当我给你更高的剂量时,我应该期待更高的反应。一些患者会有更大的反应,因为他们更年轻,或者他们的基因,或者任何使他们更易受影响的因素。同样的,我们可以说一些人口普查区域——你可以把它想象成一个邮政编码——一些人口普查区域非常容易受到影响。如果我在他们旁边开店,我会有很多顾客。还有一些人口普查区,如果我在它们旁边放一个商店,没有人会出现。
这里的挑战是,我们没有在全国各地随意开设门店。我们把商店放在我们认为会做得好的地方。所以有一个选择偏差的问题。我们不是随便拿出来的。我想说的是,我们做了一个真正深入的,深思熟虑的方法来理解这里的因果关系。这意味着我们在参数空间周围画了一个栅栏,说我们只在一定范围内有支持。如果你让我在一个我不太支持的地方开店,而这个地方周围的社区和我以前开店的地方真的不一样,我至少应该告诉你我不知道。我至少应该告诉你,这个问题超出了我的专业范围。用你有的任何其他型号,但不要依赖我们的。我认为你应该认识到人们总是会对你的模型作出因果性的解释。因此,这取决于你来确保你已经做了工作,不要把他们引入歧途。
最后,这是一个我认为可爱的小 HipChat 机器人的例子——HipChat 有他们的网站—
在那里你可以说“嘿,给我旧金山的天气”,它会回传给你。不幸的是,我不能给你看我们这边的实际截图,但我们最终交付选址模型的方式是作为一个 HipChat 机器人。有一个 HipChat 聊天室,我们的零售团队说,“给我们一个我们认为这个地址的网站的销售预测”。机器人查找地址,在我们的模型中查找,输出结果。所以他们有一种非常自然的方式与之互动。摩擦非常小。它不需要他们记住一个网址。第二,他们有一段历史。他们有一根木头。它只是内置在聊天程序中。它总是说,六个月前,当你询问网站时,他们可以返回并查看它。随着模型的发展或事情的变化,他们能够认识到他们当时认为他们会得到的历史,我们发现这非常有用。
让我们快速了解一下这样一个项目的生命周期,各个部分是如何组合在一起的。在计划阶段的早期,我们通常会在项目开始时花费一到三周的时间。正如我所说的,因为我们是集中的团队,我们倾向于一次做几个月的项目。一开始,人们必须提出一个想法。通常,我们不是为这些事情想出这些主意的人。有时候我们是。但是,我们定期与所有董事开会,我们控制办公时间,我们经营分析师协会,因此公司的分析师可以听到新的很酷的技巧和技术,他们经常向我们提出想法。
然后,我们花一些时间思考项目的商业价值。然后我们进行快速迭代,一种敏捷的前期工作,使用虚假数据或混乱的数据。我只想说,“嘿,在我们开始做所有艰难的数据清理工作之前,我们能不能就这件事的发展方向达成一致?让我们尽快接受这一点。”一旦我们有了一个好的感觉,我们就写下一个计划。我们用简单的英语写了五到七页,上面写着,“这就是我们为什么要这么做。这是我们认为的价值。风险大概是什么,我们的计划是什么”。我们希望所有参与其中的人都说,“是的,我读过,我理解。这是我能理解的语言,之后我会做出不同的决定。”
另一部分,我马上会谈到,因为我们提前做了这些,我们不再遇到已经构建了一些东西的问题,然后我们交付它,却发现更多的工作必须由另一个团队完成,这是没有计划的。我们过去常常构建一些我们偶尔会完成的东西,我们与另一个团队进行模糊的对话,讨论如何接手这项工作并完成他们那一半的实现。但后来发现他们忘记了把它放在路线图上,或者他们认为它很有趣但没有真正为它做计划。现在我们就像,他们签署了这个东西,我们将继续把它扔在他们的脸上,直到最终,当轮到他们的时候,他们知道在它跑过来的时候拿起接力棒。
最后,我们将学习传统意义上的数据科学。所有的 EDA、工程、建模等等。这可能需要几个星期到几个月或更长时间,取决于项目。最后,我们交付代码、报告、微服务或任何我们工作的成果。
我们设置了某种监控,以确保当它倒下时,因为世界是复杂的,这是不可避免的,我们至少会收到关于它的电子邮件。然后我们有一个快速回顾,我们召集房间里所有的人,包括技术人员和非技术人员,然后问:“这个做了你认为它会做的事情吗?你满意吗?”我尝试与不属于我们团队的人进行一对一的交谈,只是为了确保他们在提供反馈时感到舒适,这有助于我们重复和改进这一过程。感觉有点重。的确,我们最近在团队中引入了一名项目经理,以确保这是有帮助的。但是我认为,这样做的重量比花几个月的时间做一些实际上并不成功的事情要轻得多。
在我们剩下的时间里,还有第二个例子。这是一张全美送货时间估计图,那里的小红点是 Sloatsburg,这是我们工厂的所在地。这是直接来自美国邮政服务。他们声称这个黑色的斑点是一天的交付时间,浅蓝色是两天,真正的浅蓝色是三天。这是他们关于物体从 A 点到 b 点需要多长时间的说法,这是一个非常特殊的估计。这只是一个估计数字。我们知道这对我们自己来说不是超级准确的。
我们知道,在我们已经有了位置的地方,我们可以得到更好的估计,因为我们可以查看我们自己的所有发送,看看它是如何做的。但是我们想到的问题是,“如果我们想在这里,这里,这里,或者这里建立一个新的实验室呢?我们能预测从那个地方到全国其他邮政编码的递送时间吗?”因为这是一大堆不同类型模型的输入。
实际上,我会先跳到这一步。准确估计交货时间有助于决定将订单分配给哪个实验室。记得我说过每副眼镜基本上都是定制的,对吗?他们必须拿着你的处方,切下晶状体,然后把它们放进去。所以我们必须决定把订单送到哪里。我们与我们的运营商协商合同说,“这是你说你会给我们的,这是我们认为你实际上可以交付的。你能不能来这里找我们谈谈价格,让我们明白这一点?”这里最具战略意义的事情是,决定将开设一个光学实验室所需的数百万美元分配到哪里,我们最好对到达客户那里需要多长时间有真正准确的估计,这样他们就不会最终对我们不满,认为我们是一家糟糕的公司。
所以在这个用假数据迭代的主题上,我们开始的方式是在这上面取得一致——这是第一步。它不止于此(指着幻灯片)。但是,只是说,“嘿,这里有几个输出。这里有一些不同种类的模型可以告诉你的不同的事情。这些输出中哪一个对你最有用?”暂且忽略它有多精确。只能说它是准确的。这是 A 号。字母 A,这是运营商的风格。这是我们认为到达那里需要的天数。这是我们最好的猜测。如果你是一名统计学家,可能会有某种最大似然估计,或者平均值,或者类似的东西。
然后,我最容易想到的是,“嘿,我们来做一个置信区间。我们肯定会知道它会在这个范围内的某个地方。”但这实际上并不能帮助我们的决策者。他们不需要置信区间。事实证明,他们需要知道最坏的情况。
所以我们最终为他们建模的是这个尾部概率,比如说,第 95 百分位。我们非常确定,20 次中有 19 次,它会在 6 天内到达那里。这种方法有助于对概率进行不同的思考,思考这些东西是如何结合在一起的,并试图建立一些实际上适合这些不同目标的东西。因为实际上有不同的团队需要这些东西。所以我们想确保我们所做的工作符合每个团队的目标。如果我说,“嘿,我要给你做一个魔术盒,让我们挥动魔杖。几个月后,你会有一个能给你一个数字的魔盒。这个数字应该是什么样子,才能对你尽可能有用?在优先级方面,只是重复一下同样的优先级在这里是如何工作的。”所以,事实证明,为了适应他们的工作流程,他们真的更关心尾部概率,而不是整体分布。我的意思是,我们可能仍然模拟分布,但我们真的应该确保我们的尾部概率估计是准确的。
我们想确保我们有一些好的覆盖率,比如说,100 次中有 99 次,如果我告诉你这是第 95 个百分点,我是正确的。显然,再现性再次得到了广泛的肯定。我们从运营商那里得到的数据不是起止日期。每次他们测量的时候。有人扫描了盒子上的条形码,它为我们创建了一个数据点。所以我们有每一个这样的事件。我们必须确保当邮政服务决定改变其编码事件的方式时——他们确实这样做了——我们至少会知道有些事情发生了变化,而不是意外地开始说一切都会在两天内出现。正确处理不确定性。我们一直在考虑直接模拟累积分布函数的方法,因为这是我们真正关心的事情,是这个百分比。有一些有趣的贝叶斯方法来做到这一点,坦率地说,我们可能不会这样做。但至少我们应该知道他们会是什么样子。
最后,在技术上有趣的一面,我真的对这种成本时间的权衡很感兴趣。因此,当我们提出分配给最佳实验室的决定时,并不是每个实验室都收取相同的费用。所以,现在,我们临时决定取舍是什么样的。我很想进行一次真正结构化的采访,试图从我们的高管那里引出一个效用函数,看看他们是如何考虑这些事情的权衡的。我不知道那会有什么价值,所以我们还没有做。但是我仍然有很多事情要做。尽管这确实是我们进行这次谈话时首先想到的事情之一,但不幸的是,它最终被放在了我们最优先考虑的事情的底部。因为我们知道,我们可以先用其他的东西传递很多价值。
我想用一句话来结束我的演讲,我不记得是谁写的了,可能是卡尔·纽波特…他说了这样的话,你从工作中获得的激情来自于对工作的擅长,来自于处在一个支持你的环境中,处在一个你喜欢的环境中。更重要的是,无论你认为你的激情是什么,你的激情都会来自于它。我发现,对向利益相关者交付数据科学产品充满热情,就像在一段时间间隔内获得正确的计算方法一样令人满意。我认为很多人可以拥有同样的东西。我认为,如果我们这样做,作为一个整体,我们将在一个地方结束,在那里数据科学是一个真正受尊重的成熟学科,得到应有的关注和预算。所以,谢谢你。
Domino 编辑注意:为了可读性,本文经过了编辑。
# 在生产中使用 k-最近邻(k-NN)
> 原文:<https://www.dominodatalab.com/blog/summary-using-k-nn-production>
## 什么是 k 最近邻(k-NN)?
*k*-最近邻是一种简单的算法,它存储所有可用的案例,并基于相似性度量(例如,距离函数)对新案例进行分类。KNN 是一种“基于惰性实例”的算法,这意味着它不会泛化。因此,[训练一个 KNN 算法快得吓人](/knn-with-examples-in-python)!对于基本的 kNN,训练的速度实际上是读取所有的训练数据并将其保存在一个数据结构中。
Domino 的首席数据科学家 Eduardo ario de la Rubia 展示了一个网络研讨会:介绍如何在生产中使用 *k* -NN。
如果您错过了现场网络研讨会或想再次观看,您可以在下面找到一段录音:
[https://fast.wistia.net/embed/iframe/jggs1iy570](https://fast.wistia.net/embed/iframe/jggs1iy570)
# 监督学习与非监督学习:有什么区别?
> 原文:<https://www.dominodatalab.com/blog/supervised-vs-unsupervised-learning>
在所有可用于机器学习的[](https://blog.dominodatalab.com/7-machine-learning-algorithms)数千种算法中,绝大多数使用了学习技术的三个主要分支之一。
## 机器学习中的 3 种主要学习类型
监督学习在训练 时使用标记数据 [将算法指向正确答案。无监督学习不包含这样的标签,算法必须自己推测答案。在](//blog.dominodatalab.com/what-is-machine-learning-model-training) [强化学习](https://blog.dominodatalab.com/what-is-reinforcement-learning) 中,通过触发由模型设计者确定的一系列奖励和惩罚,算法被导向正确的答案。这些学习类型中的每一种也可以使用 [深度学习技术](https://blog.dominodatalab.com/deep-learning-introduction) 来完成。
## 监督与非监督学习
当一个人在受监督的环境中学习时,老师手里拿着答案。有了监督学习, [ML 模型](//blog.dominodatalab.com/a-guide-to-machine-learning-models) 没有老师,但他们可以在训练数据集中以标注数据的形式获取答案。带标签的数据意味着训练数据已经包含算法应该找到的答案。
无监督学习有着本质的不同。当一个没有老师的学生必须解决一个复杂的问题时,这通常是一个反复试验的问题,学生必须自己确定正确的答案可能是什么。在机器学习中,无监督学习涉及未标记的数据,没有明确的答案,因此算法必须自己找到数据点之间的模式,并且它必须得出最初未定义的答案。
### 什么是监督学习?
监督学习是 ML 中使用的一种技术,它使用标记数据集来训练算法。只有当 [训练数据被标记为](https://www.ibm.com/cloud/learn/supervised-learning) 时,才能使用这种监督学习。当你想解决分类或者回归问题的时候就用到了。
为了解决分类问题,算法预测离散值,将输入数据识别为类的一部分。例如,如果算法应该区分狗和猫的照片,则这些图像都被正确标记,并且算法将在做出预测后将其每个答案与标记进行比较。当它获得一组新数据时,它可以将新数据与从标记的训练数据中获得的经验进行比较,以更准确地做出新的预测。
为了解决回归问题,算法通常需要连续的数据。线性回归是一个常见的例子,在这种情况下,可以根据数据集中的任何 x 值来预测 y 值。然而,为了证明 ML 模型的开发是合理的,通常有许多不同的变量,并且算法必须确定几个变量之间的关系或模式,以及它们各自的权重,以确定正确的答案。
半监督学习类似于监督学习,除了不是所有的数据都被标记。当标注示例需要太多时间,或者从数据中提取特征太困难时,这是一个更好的选择。半监督学习经常用于医学成像,例如分析 MRI 扫描。
### 监督学习过程
因为监督学习需要带标签的训练数据,所以处理训练数据集可能需要大量的时间和精力。一旦模型用这些数据进行了训练,它就会得到一组新的数据来测试它的预测。可用的算法取决于您需要解决的是分类问题还是回归问题。
为了解决分类问题,该算法在带标签的数据上进行训练,然后进行测试,看它是否可以识别新测试数据集中的实体,以对这些实体进行分类。分类算法的例子包括:
* 逻辑回归
* [支持向量机](https://www.dominodatalab.com/blog/fitting-support-vector-machines-quadratic-programming)
* 决策树
* *K*-最近邻居
* 随机森林
当模型需要使用回归来解决问题时,它会根据因变量和自变量之间的关系进行预测。回归的例子包括线性回归多项式回归。回归算法的例子包括:
* 具有实值输出的神经网络
* 套索回归
* 支持向量回归
* 随机森林回归量
## 什么是无监督学习?
通常情况下,没有干净、有标签的数据可用,或者研究人员可能需要一种算法来回答没有明显答案的问题,即使在训练期间也是如此。在这些情况下,使用无监督学习。无监督学习是一种使用算法分析非结构化和无标签数据的 ML 技术。
复杂模型,如神经网络,可以通过分析数据的结构和提取有用的特征来确定数据中的模式。在这些情况下,数据集通常是复杂的,算法和需要解决的问题也是如此。无监督学习的例子包括:
* **异常检测:**该模型搜索异常模式,如通过异常的收费地点检测信用卡欺诈。
* **关联:**该模型识别数据点的关键属性以创建关联,比如在在线消费者将商品放入购物车后向他们推荐配件。
* **聚类:**该模型在训练数据中搜索相似性,并将它们分组在一起,就像识别市场人口统计数据组一样。
术语“半无监督”有时用于描述标记数据稀疏且一个或多个类中的数据根本没有被标记的情况。这种方法实际上是半监督学习的一个子集,但与零炮学习以及 [迁移学习](https://blog.dominodatalab.com/guide-to-transfer-learning-for-deep-learning) 有相似之处,其中使用了深度生成模型。
### 无监督学习过程
在无监督学习环境中,一个算法被给予未标记的数据,其任务是自己发现变量中的模式。有三种主要的方法:聚类、关联规则和降维。
聚类包括[根据相似性或差异将数据点分组](https://www.dominodatalab.com/blog/topology-and-density-based-clustering)。在 *K* -means clustering 中使用的 Exclusive clustering 涉及将数据点放入所需的多个组中,尽管它们在一个组中的权重可能高于另一个组。其他聚类方法包括层次聚类和概率聚类。
关联规则用于发现变量之间的关系,通常在营销中用于推荐产品或了解消费者行为。例如,Apriori 算法通常用于识别与某些客户购买的商品相关联的商品,以便向其他客户推荐这些商品。
当数据集中的维度或特征数量过多时,降维用于减少数据输入的数量。降维的例子包括主成分分析、奇异值分解和自动编码器。这些技术在缓解与 [维数灾难](https://www.dominodatalab.com/blog/the-curse-of-dimensionality) 相关的问题时非常有用。
## 监督和非监督学习技术
当你要开发一个机器学习模型时,并不总是能够预测哪种学习技术是最好的。如果您可以方便地访问用于以前模型的数据、工具和文档,那么随着经验的增加,做出这一决定的学习曲线可以缩短。
这就是模型驱动的组织依赖 Domino Data Lab MLOps 平台的原因,该平台为数据科学团队提供了他们需要的工具和资源,同时也为每个项目培养了一个协作的、文档化的过程。要开始探索 Domino 企业 MLOps 平台的优势,请注册一个 14 天的免费试用版。
[![14-day free trial Try The Domino Enterprise MLOps Platform Get started](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4b2c6aa363d959674d8585491f0e18b8.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/28f05935-b374-4903-9806-2b4e86e1069d)
# 调查显示:模型驱动的文化对于数据科学的成功至关重要
> 原文:<https://www.dominodatalab.com/blog/survey-says-a-model-driven-culture-is-crucial-for-data-science-success-1>
在 Domino,我们很幸运能够与世界上最大的数据科学组织的领导者合作。真正突出的一点是,即使是最成熟的组织也难以理解和管理其数据科学投资的深度和广度。当您将“数据科学”扩展到包括组织正在投资的更广泛的大数据、BI 和分析功能时,这种情况会变得更糟。复杂性源于过去五年中新工具、功能和流程的爆炸式增长,许多首席信息官和首席数据官实际上并不知道哪些系统在驱动哪些业务流程,以及哪些团队在交付价值方面遇到了阻碍。
软件有一个健壮的“软件开发生命周期”,在过去的二十年中已经非常成熟。数据科学需要自己的“数据科学生命周期”,今年晚些时候,我们将推出[模型速度评估](/resources/data-science-process-lifecycle-assessment)。有了它,数据科学领导者将能够跨越数据科学生命周期的四个阶段来衡量他们的成熟度。我们发现,即使是最成熟的公司也有可以改进的地方,以帮助使数据科学对其业务更具可扩展性和价值。
这就是为什么我们与 [DataIQ](https://www.dataiq.co.uk/) 和[合作,调查](https://www.dominodatalab.com/resources/dataiq-survey-how-to-scale-data-science)他们的数据和分析专业人员成员,以了解他们的数据科学方法。在可以衡量数据科学的业务优势的企业中,大约四分之一的组织预计数据科学将对顶线收入产生超过 11%的影响。对于这些公司来说,它们在数据科学上的投资以及对使其成为一流企业职能的重视已经产生了显著的效益。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/189a92ff16bf4fe9007f27e2ae293f4b.png)
不幸的是,几乎三分之一的受访者(29.1%)不知道他们可以从数据科学中获得什么商业利益,而在可以获得商业利益的受访者中,超过一半的人(57.3%)认为数据科学对年收入的影响不到 5%。深入挖掘数据表明,根本原因在于缺乏一种模型驱动的文化,在这种文化中,业务利益相关者、数据科学从业者和 IT 拥有紧密的联系和共同的目标。
想想调查中的一些数字:
* 五分之二的组织(39.5%)认为“对商业中的数据科学缺乏理解或支持”是他们最大的挑战。
* 八分之一的人(12.8%)认为“用例不引人注目”是他们最大的挑战之一。鉴于上一点中强调的对数据科学的理解薄弱,这一结果并不令人惊讶。
* 三分之一的组织(33.7%)认为“数据科学和 IT 之间的冲突”是他们最大的挑战之一。
* 就数据和分析的采用水平而言,即使是将自己评为“先进”或“即将成熟”的公司也无法避免冲突。对于这两个群体来说,“数据科学和 IT 之间的冲突”是他们最大的挑战(分别为 52.4%和 50%)。
## 模型是一种新型的数字生活
调查中发现的挑战是许多公司进行数据科学的方式的直接结果。例如,部门领导喜欢上了业务分析师(他们缺乏正式的数据科学培训或经验)可以突然使用自动化机器学习工具来创建和部署模型的想法。根据我们的经验,这些工具可以用来解决一些基本的业务挑战,但只有当使用它们的“公民数据科学家”与能够验证其工作的专家(经过适当培训的)数据科学家配对时。走得太远并认为他们可以取代专家数据科学家的公司通常会遇到与缺乏理解和支持有关的问题。
数据科学和 IT 之间的冲突表现在许多方面,它通常是因为它对待数据科学模型就像对待其他软件项目一样。模型需要重新训练,以实验的方式开发,并使用许多不同的软件工具制作。没有必要“再培训”软件代码,但是生产模型需要经常再培训。从数据科学中实现最大价值的公司明白,模型是一种新型的数字生活,需要不同的人、流程和平台。
我们还看到许多冲突源于对可扩展基础架构的访问不足,数据科学团队需要这些基础架构来处理更大的数据集和更复杂的算法,以解决更广泛的用例。数据科学家的解决方案通常是“影子 IT”解决方案,即工作和部署的模型存在于 IT 权限之外的私有服务器或公共云中,代价是可见性、治理和安全性。
## 建立积极的数据科学文化
幸运的是,调查结果还提供了一些关于如何帮助建立数据文化以促进数据科学蓬勃发展的建议。由于许多组织很难衡量其数据科学工作的好处,因此“更好的数据科学 ROI 指标”排在首位(39.5%)也就不足为奇了。但是,接下来的三条建议将有助于为数据科学建立积极的文化。
* 39.5%的人希望“利益相关者对需求状态有更清晰的定义”
* 38.4%的人想要“数据科学概念的跨业务培训”
* 32.6 想要“利益相关者和数据科学之间更积极的关系”
了解阻碍可扩展数据科学发展的障碍是成为本次调查中“先进”企业的第一步。通过合作,业务利益相关方、数据科学团队和支持他们的 IT 社区可以更好地了解每个团队的独特需求,建立清晰的指标,并专注于最有影响力的用例。
您可以在此查看完整的调查结果[。](https://www.dominodatalab.com/resources/dataiq-survey-how-to-scale-data-science)
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c98711f401edba39e86c7dd85547ef11.png)
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Fsurvey-says-a-model-driven-culture-is-crucial-for-data-science-success-1%2F&title=Survey%20Says%3A%20A%20Model-driven%20Culture%20is%20Crucial%20for%20Data%20Science%20Success)
# 参加课程:面向程序员的实用深度学习
> 原文:<https://www.dominodatalab.com/blog/taking-course-practical-deep-learning-coders>
*这篇博文描述了参加《程序员实用深度学习》课程第 1 课的内容、价值和体验。帖子还包括课程视频。*
## 参加课程
上周,我开始上一门名为[程序员实用深度学习](http://course.fast.ai/)的在线课程。我的动机是基于个人兴趣,但如果你是一名实践数据科学家,这门课程将对你的职业发展有价值。它提供了对深度学习的基础理解,这将帮助你评估你是否愿意将深度学习融入到你的工作中。
## 深度学习的用途
深度学习是一个令人兴奋的快速发展的领域,有着广泛的应用。深度学习有很多用途。它可以帮助科研人员深入了解植物学、T2、药物研发和 T4 农业等领域。深度学习也被用于欺诈检测、[语音识别](https://www.gridspace.com/),以及构建[“情绪感知”应用](https://www.affectiva.com/#what-you-can-do)。我参加的深度学习课程是由 fast.ai 的雷切尔·托马斯和杰瑞米·霍华德开发的。它是免费的,有一个强大的在线社区围绕着它。
## 第一课概要
从一开始就很清楚这门课不是典型的教育体验。重点是让更多的观众能够接触到这些材料,并尽快找到有趣的东西。
第 1 课从零开始,以您向 Kaggle 竞赛提交图像识别模型结束。讲座和家庭作业练习将带你完成基本任务。一路上,有足够的信息和作业练习给那些像我一样在睡梦中不能做这些事情的人。然而,一切都在以良好的速度前进。很快你就会以一种全新的方式思考数据结构,并且和 [NumPy](http://www.numpy.org/) 、 [Keras](https://keras.io/) 和 [Matplotlib](http://matplotlib.org/) 变得友好起来。然后事情变得非常有趣,因为你开始使用并微调一个叫做 [VGG16](http://www.robots.ox.ac.uk/~vgg/research/very_deep/) 的模型来区分猫和狗的图像。然后,你的作品通过参加一个智力竞赛而得到评价。
仅仅上了一节课就能真正使用深度学习,这是非常值得的。在我对真实照片使用有效的、完整的深度学习模型之前,我不需要更新我的线性代数技能。不过,如果我真的想更新我的线性代数技能,fast.ai 有免费的在线教科书和视频系列。
[https://www.youtube.com/embed/Th_ckFbc6bI?start=5420&feature=oembed](https://www.youtube.com/embed/Th_ckFbc6bI?start=5420&feature=oembed)
## 摘要
我非常感谢 fast.ai 的创始人为包括我自己和数据科学家在内的广大受众创建了这个教育资源。我也很感激 fast.ai 和 USF 数据研究所(T1)设立了 T2 多样性奖学金(T3),让我认识了 T4 的达威特·海尔(T5)。Dawit 正在数据学院进行深度学习课程的[现场版](https://www.usfca.edu/data-institute/certificates/deep-learning-part-one)。一旦我们每个人都完成了所有的课程,寻找总结我们经验的博客帖子。
*^(多米诺编辑注:课堂图片由 USF)T3 提供*
# 直销电子邮件推广的故事
> 原文:<https://www.dominodatalab.com/blog/tales-from-direct-sales-email-outreach>
直接电子邮件外联是我们的销售渠道之一:我们找到在感兴趣的公司工作的数据科学家,并向他们发送电子邮件。我们已经通过几次迭代和 A/B 测试改进了我们的模板,我们得到了超过 5%的响应率,这似乎是合理的。但是我们也得到一些令人困惑的回答。我想分享其中的一些,不是因为酸葡萄,而是因为我认为它们揭示了销售企业数据科学软件所面临的一些挑战。澄清一下,我不是在抱怨;我分享-有两个原因。第一,可能人家会有建议。其次,这可能有助于其他试图做企业销售的人。
以下是一些回答,代表了我们遇到的一些反复出现的主题:
## 我们自己建造它
到目前为止,我们听到的最常见的拒绝是“不,谢谢,我们自己构建我们的技术解决方案。”这里有一个例子:
```py
Hey Nick,
Sorry for the delay in response.
I have chatted with a few of the developers here and they have decided to tailor build our platform in house.
I am not entirely sure why, but this has been a common trend with [company]. Thank you for your time though.
```
或者另一个例子:
```py
Hi Nick,
Congrats! Seems like an awesome product, my team was definitely impressed. I don't think it's a fit for us as we prefer to homegrow and err on the side of needing control but would love to let you know if that changes.
```
或者简单地说:
```py
We have already built (and continue to build) the in-house technology we need.
```
我对[“购买 vs 构建”的想法可以写一篇长长的博文](/blog/reflections-on-buy-vs-build),但这里有一些:
首先,开发人员更喜欢构建他们自己的解决方案一点也不奇怪。大多数开发人员之所以成为开发人员,正是因为他们喜欢构建东西,而且大多数公司都有一种文化,奖励那些做事情*的人*,而不是根据总体业务目标和约束找到最佳解决方案。因此,询问开发人员(甚至大多数工程经理)“你愿意构建一个解决方案还是购买一个”可能会被误导,因为对他们来说,权衡所有因素以做出最佳决策并不自然——相反,他们有某种直觉。当你有一堆锤子的时候,你会找到钉东西的理由。
第二,我认为像“我们通常更喜欢本土解决方案”这样的原则没有更多的限定是没有意义的。你总是会购买一些软件和构建一些软件。如果你认为你真的更喜欢构建自己的解决方案,问问自己是否构建了自己的编程语言、文字处理器、电子邮件客户端、操作系统、数据库服务器、IDE、防火墙软件等。
是否构建您自己的解决方案应取决于其功能对您的业务的重要性和差异化程度。
如果您要解决的功能和使用情形对您的业务来说是独一无二的,或者对您的竞争优势来说是至关重要的,以至于您必须完全控制它们,那么您应该构建一个自主开发的解决方案。(当然,这也取决于您自己是否有交付和维护解决方案的工程能力。)
相反,如果您需要的功能在很大程度上是商品化的,即许多其他公司需要做同样的事情,您应该考虑购买一个解决方案。
对此有两点看法:
1. 我们遇到的许多公司认为他们的用例比实际情况更独特。大多数人都想认为“我们做事的方式”是特别的——但通常它与其他公司的做法没有太大区别。在我们的具体环境中:当然,您公司的特定分析模型是高度差异化的,但这并不意味着您有独特的需求来支持构建这些模型的数据科学家。
2. 当考虑购买与构建的权衡时,许多公司大大低估了开发成本和总拥有成本。开发成本应该包括业务用户参与需求和验收测试的时间。它们还应该包括将这些开发人员从其他可能的项目中撤出的机会成本。总拥有成本估计应该包括用于持续支持和维护的开发人员资源。
## 低估生产功能的工作量
这里有一个与潜在客户的交流,他实际上用 Domino 实现了一个有效的概念验证。在大约一个小时的时间里,他完成了他的用例(将 Python 预测模型公开为 web 服务,供现有的 web 应用程序使用)。但是公司的决策者决定不使用我们的服务。以下是我们听到的反馈:
```py
As I understand it, the reasoning was pretty simple - they didn't want to be dependent on an external service that they would have to pay for when the exact functionality that they need is achievable using ZeroMQ and some shell scripts.
```
我认为这表明低估了真正强化生产应用程序所需的成本。将 ZeroMQ 和一些 shell 脚本拼凑在一起可能会产生一个原型,但需要真正的工程来确保解决方案满足公司对可用性和正常运行时间的要求;有一个部署新版本的好故事;并且当问题不可避免地发生时,公司具有支持和维护所需的内部知识。
他的理由中“必须为”部分似乎也是被误导的。为了将 Python 中的预测模型与现有的 Java web 应用程序集成在一起,使用 ZeroMQ 和 shell 脚本来实现定制的解决方案肯定不是免费的。除了前期工作之外,还需要持续利用资源进行支持和维护。
## 过程重于结果
一家非常大的咨询公司回信说,他们对了解 Domino 不感兴趣,因为:
```py
We are pretty far down the path evaluating several different technologies in this space and don’t want to incur the cost of spinning up another.
```
尽管我尽可能客观,但这对我来说似乎仍然不合逻辑。如果你要做一个重要的决定,并投入几个月(可能是几年)的时间来寻找解决问题的好方法,难道不值得花 30 分钟去了解另一个可能的解决方法吗?从期望值的角度来看,这似乎是显而易见的。
我不确定这是否是更深层次的症状,但我的直觉是这反映了大型组织的官僚作风。最终的业务目标和实际的所有活动之间存在脱节。有人没有看到更好的业务成果的机会,而是看到了对他正在运行的流程的干扰。
* * *
不幸的是,我没有很好的技巧来解除这些反应——事实上,解除它们可能是不可能的,因为大多数人在确信某事时不会改变主意。但是如果我们弄明白了,我会在以后的帖子里分享我们的见解!如果你有什么想法,请在评论中发表或者给我们发邮件。
# 收集、准备和绘制数据的技术:预测社交媒体对 NBA 的影响
> 原文:<https://www.dominodatalab.com/blog/techniques-for-collecting-prepping-and-plotting-data-predicting-social-media-influence-in-the-nba>
*这篇文章提供了解决现实世界中的 ML 问题时需要考虑的思维模式、方法和工具。它包括要考虑的问题以及收集、准备和绘制数据。一个[补充多米诺骨牌项目可用](https://try.dominodatalab.com/u/ann_spencer/socialpowernba/overview)。*
## 介绍
收集和准备数据是核心研究任务。虽然最理想的情况是用干净的标记良好的数据开始一个项目,但现实是数据科学家花费无数的时间来获取和准备数据。由于 Domino 致力于支持数据科学家和加速研究,我们联系了 Addison-Wesley Professional(AWP)Pearson,以获得适当的权限,从 Noah Gift 所著的《实用人工智能:基于云的机器学习简介 *[》一书中摘录“预测社交媒体在 NBA 的影响”。摘录深入到收集、准备和绘制数据的技术。非常感谢 AWP·皮尔森提供了摘录作品的许可,并为我们提供了数据和代码,以纳入一个](http://www.informit.com/store/pragmatic-ai-an-introduction-to-cloud-based-machine-9780134863863?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Pragai)[补充多米诺骨牌项目](https://try.dominodatalab.com/u/ann_spencer/socialpowernba/overview)。*
![Domino Data Lab Enterprise MLOPs workspace](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8f8a3ac99e7e54a7bba0765e58398aad.png)
![Domino Data Lab Enterprise MLOPs NBA workshop](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f629f8a01bdd94bb1c6d5c4479af6640.png)
## 第一章介绍:预测社交媒体在 NBA 的影响力
体育对于数据科学家来说是一个迷人的话题,因为每个数字背后都有一个故事。仅仅因为一名 NBA 球员比另一名球员得分更多,并不一定意味着[他们]为球队增加了更多价值。因此,最近试图衡量球员影响力的个人统计数据激增。ESPN 创造了真正的正负效应,FiveThirtyEight 提出了卡梅罗 NBA 球员预测,NBA 有球员影响估计。社交媒体也不例外;这个故事不仅仅是一个高粉丝数。
本章将使用 ML 探索数字背后的数字,然后创建一个 API 来提供 ML 模型。所有这些都将本着以现实世界的方式解决现实世界问题的精神来完成。这意味着除了在干净的数据上创建模型之外,还要涵盖设置环境、部署和监控等细节。
## 对问题的措辞
从冷眼看待社交媒体和 NBA 开始,有许多有趣的问题要问。这里有一些例子。
* 单个球员的表现会影响团队的胜利吗?
* 球场上的表现与社交媒体的影响力有关联吗?
* 社交媒体上的参与度与维基百科上的受欢迎程度有关联吗?
* 粉丝数量或社交媒体参与度是 Twitter 受欢迎程度的更好预测指标吗?
* 薪水和球场上的表现有关联吗?
* 获胜会给游戏带来更多粉丝吗?
* 什么更能推动球队的估值:上座率还是当地的房地产市场?
为了得到这些问题和其他问题的答案,需要收集数据。如前所述,80/20 法则适用于此。这个问题的百分之八十是收集数据,然后转换数据。另外 20%是 ML 和数据科学相关的任务,比如找到正确的模型、进行 EDA 和特征工程。
## 收集数据
在图 6.1 中,有一个要提取和转换的数据源列表。
![NBA Social Power Data Sources](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fcc6094cfb9cf488b4030293ea0e8351.png)
收集这些数据是一个不小的软件工程问题。有许多障碍需要克服,例如找到一个好的数据源,编写代码来提取它,遵守 API 的限制,以及最终将数据转换成正确的形状。收集所有数据的第一步是确定首先收集哪个数据源,以及从哪里获取。
我们知道最终目标是比较 NBA 球员的社交媒体影响力和权力,因此从 2016-2017 赛季 NBA 球员的名册开始是一个很好的起点。理论上,这将是一个简单的任务,但收集 NBA 数据有一些陷阱。直观的起点是去 nba.com 的官方网站。然而,出于某种原因,许多体育联盟很难从他们的网站上下载原始数据。NBA 也不例外,从他们的官方网站获取统计数据是可行的,但具有挑战性。
这就引出了一个关于如何收集数据的有趣问题。通常手动收集数据很容易,即从网站下载,并在 Excel、Jupyter Notebook 或 RStudio 中手动清理。这可能是着手解决数据科学问题的一种非常合理的方式。但是,如果收集一个数据源并清理它需要几个小时,那么最好的办法可能是编写代码来解决这个问题。没有硬性的规则,但是有经验的人知道如何在一个问题上不断取得进展而不会受阻。
## 收集第一数据源
我们将从相对容易的东西开始,而不是从棘手的数据源开始,比如 NBA 官方网站,它会主动阻止你下载它的数据。要从篮球中收集第一个数据源,可以直接从本书的 [GitHub 项目](https://github.com/noahgift/pragmaticai)或者从[篮球参考](https://www.basketball-reference.com/leagues/NBA_2017_per_game.html)【或者补充的[多米诺项目](https://try.dominodatalab.com/u/ann_spencer/socialpowernba/overview)下载。
在现实世界中做 ML 不仅仅是为干净的数据找到正确的模型;这也意味着了解如何设置您的本地环境。
要开始运行代码,需要几个步骤。
1. 创建虚拟环境(基于 Python 3.6)。
2. 安装几个我们将在本章使用的包:例如,Pandas,Jupyter。
3. 在 Makefile 中运行这些。
清单 6.1 显示了一个 setup 命令,它为 Python 3.6 创建了一个虚拟环境,并安装了清单 6.2 中 requirements.txt 文件中列出的包。这可以用这个一行程序一次性执行。
```py
make setup && install
```
![Makefile Contents and requirements.txt contents](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/1990f102ba24f235db50f832f162041c.png)
### 注意
处理 Python 虚拟环境的另一个便利技巧是在您的。巴沙尔或者。zshrc 文件,它可以在一个操作中自动激活环境并进入目录。我通常的做法是添加这个代码片段。
`alias pragai6top="cd ~/src/pragai/chapter6\`
要处理本章的项目,在 shell 中键入 pragai6top,您将进入正确的项目签出并启动您的虚拟环境。这就是使用 shell 别名的强大之处。还有其他工具可以自动为您完成这项工作,比如 pipenv 或许也值得去探索它们。
要检查数据,使用命令:`jupyter notebook`启动 Jupyter 笔记本。运行此操作将启动一个 web 浏览器,允许您浏览现有笔记本或创建新笔记本。如果您已经查看了这本书的 GitHub 项目的源代码,您会看到一个名为 basketball_reference.ipynb 的文件。
这是一个简单的 hello world 类型的笔记本,其中加载了数据。将数据集加载到 Jupyter Notebook 中,或者在 R 的情况下,加载到 RStudio 中,通常是对数据集进行初始验证和探索的最方便的方式。清单 6.3 展示了除了 Jupyter 之外,或者代替 Jupyter,如何从常规的 IPython shell 中探索数据。
![Notebook Basketball Reference Exploration](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/1146854ced0fbeea92bfebd3c20ce9c3.png)
### 注意
另一个有用的技巧是养成使用 pytest 的 nbval 插件确保 Jupyter 笔记本可运行的习惯。您可以添加一个 Makefile 命令测试,通过发出来运行您的所有笔记本
`make test`
你可以在下面的代码片段中看到 Makefile 文件的样子。
`test:`
如果 CSV 文件有列名,并且每列的行长度相等,那么将 CSV 文件加载到 Pandas 是很容易的。如果您正在处理准备好的数据集,那么通常情况下(如果不总是这样的话),数据将处于适合加载的状态。在现实世界中,事情从来没有这么简单,正如我们将在本章后面看到的那样,将数据整理成正确的形状是一场战斗。
图 6.2 显示了描述命令在 Jupyter 记事本中的输出。Pandas 数据帧上的 describe 函数提供了描述性统计数据,包括列的数量,在本例中为 27,以及每列的中位数(这是 50%的行)。在这一点上,这可能是一个好主意,玩一玩 Jupyter 笔记本,看看你还能观察到什么。然而,这个数据集没有的一个东西是在一个统计数据中对进攻和防守表现进行排名的单一指标。为了得到这个,我们需要将这个数据集与来自 ESPN 和 NBA 的其他来源结合起来。这将显著提高项目的难度,从简单地使用数据到找到数据,然后转换数据。一种合理的方法是使用 Scrapy 这样的刮擦工具,但是在我们的情况下,我们可以使用一种更特别的方法。通过访问 ESPN 和 NBA 网站,可以剪切和粘贴数据,并将其输入 Excel。然后可以手动清理数据并保存为 CSV 文件。对于小型数据集,这通常比编写脚本来执行相同的任务要快得多。
![Basketball Reference DataFrame Describe Output Jupyter](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/dae63f37dbc961c65a05cbd3804f7a9f.png)
后来,如果这些数据需要转化为更大的项目,这种方法就成了一个糟糕的主意——但是对于原型来说,这是最强的选择之一。对于混乱的数据科学问题,一个关键的要点是继续前进,而不要陷入太多的细节。很容易花大量时间自动化一个混乱的数据源,后来才意识到这些信号没有帮助。
从 ESPN 获取数据的过程与 FiveThirtyEight 类似,所以我不再描述如何收集数据。要收集的两个其他数据源是工资和背书。ESPN 有薪水信息,福布斯有 8 名球员的一小部分代言数据。表 6.1 描述了数据源的形状,总结了它们的内容,并定义了它们的来源。大部分是通过手工完成的,有一个相当可观的数据源列表。
![NBA Data Sources](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/23c91d9da914acdc401efa811dc40b4c.png)
要获得其余的数据,主要是来自 Twitter 和 Wikipedia 的数据,并将其转换为统一的数据集,还有很多工作要做。几个最初有趣的可能性是探索前八名球员的代言和探索球队本身的估值。
## 探索第一个数据源:团队
首先要做的是使用新的 Jupyter 笔记本。在 GitHub 的资源库中,这个已经为你做好了,它叫做 exploring _ team _ valuation _ nba。接下来,导入一组通常用于在 Jupyter 笔记本中浏览数据的公共库。清单 6.4 显示了这一点。
![Jupyter notebook common initial imports](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/58bf02add3f1475e88e695aefa9c1423.png)
接下来,为每个数据源创建一个 Pandas 数据帧,如清单 6.5 所示。
![Creating DataFrames from NBA Data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/32f64c6405f0c53a703c947dcb332da2.png)
在图 6.3 中,创建了一个数据帧链,这是在野外收集数据时的常见做法。
![Multiple DataFrame Outputs in Jupyter](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f8634609dd3216cde30edfdee82bc1a1.png)
这里是一个出勤数据与估价数据的合并,看看前几行。
![Merging attendance data with valuation data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/59189083bb5890fbf2f02e558c0aa5d7.png)
![Attendance/Valuation Pairplot](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/24907a3db98c70dfea464799ff5e3979.png)
在观察这些图时,似乎上座率(无论是平均上座率还是总上座率)与球队的价值之间存在关系。深入研究这种关系的另一种方法是创建一个关联热图,如图 6.5 所示。
![heatmap of attendance valuation dataframe](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4fc65a6ac41645f6325f9db91669e140.png)
![Attendance/Valuation Correlation Heatmap](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/380a5c264047ad2a2c3e67d33f1bf120.png)
配对图中可见的关系现在更加可以量化。热图显示,估值和上座率之间的相关性中等,徘徊在 50%左右。另一张热图显示了 NBA 每支球队的平均上座率和估价。要在 Seaborn 中生成这种类型的热图,首先需要将数据转换成数据透视表。
该图如图 6.5 所示。
![Code for valuation heatmap of NBA team data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5d89f5f1e4003e6ddd9a0bb2135f7cc5.png)
在图 6.6 中,热图显示可能有一些有趣的模式需要进一步绘制,也许是在 3D 绘图中。纽约和洛杉矶存在异常值。
![NBA Teams Attendance versus Valuation Heatmap](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/398e9c3be24662c849a692cf52968117.png)
## 使用回归探索第一个数据源
图 6.5 显示了一些有趣的异常值,例如,布鲁克林篮网队的市值为 18 亿美元,但他们的上座率却是 NBA 中最低的。这里发生了一些值得关注的事情。进一步研究的一种方法是使用线性回归来试图解释这种关系。如果同时包含 Python 和 r,有几种不同的方法可以做到这一点。在 Python 中,两种更常用的方法是 StatsModels 包和 scikit-learn。让我们探索这两种方法。
有了 StatsModels,关于执行线性回归有一个很好的诊断输出,它有经典线性回归软件的感觉,如 Minitab 和 r。
![Results variable for attendance data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2f9a26bb35d3fd727690ab39617804d2.png)
![print statement for results variable](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6c08c23fd9eedfbbf3f1328f7f2dbe28.png)
在查看回归结果时,变量 TOTAL_MILLIONS(以百万计的总出席人数)在预测出席人数的变化方面确实具有统计显著性(以小于. 05 的 *P* 值测量)。0.282(或 28%)的 R 平方值表示“拟合优度”;也就是回归线完美拟合数据的程度。
做更多的绘图和诊断将显示这个模型能够预测得多好。Seaborn 有一个内置的非常有用的 residplot 来绘制残差。这如图 6.7 所示。拥有随机分布的残差是最理想的情况;如果图中有模式,可能表明模型有问题。在这种情况下,似乎没有统一的随机模式。
![plotting attendance data code](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/04036fbb038b7f3cbcfce5251e77904c.png)
![NBA Teams Attendance versus Valuation Residual Plot](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0345e53b5c31f0dc0422809bae4563d2.png)
衡量最大似然或统计预测准确性的一种常用方法是查看均方根误差(RMSE)。下面是如何用 StatsModels 来做这件事。
![Importing statsmodels and running statsmodels](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e363f96410ae6002fc5f489573aca62f.png)RMSE 越低,预测越好。为了获得更好的预测精度,我们需要找出降低这个 RMSE 的方法。此外,拥有一个更大的数据集,使模型可以分为测试数据和训练数据,将确保更好的准确性,并减少过度拟合的机会。进一步的诊断步骤是绘制线性回归的预测值与实际值的关系图。在图 6.8 中,显示了预测值和实际值的`lmplot`,很明显,这不是一个很好的预测模型。不过这是一个好的开始,通常 ML 模型就是这样创建的——通过找到相关性和/或统计上显著的关系,然后决定是否值得努力收集更多的数据。
![Predicted versus Actual Plot of Team Valuation](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5211c04134219dd74aeb9a77dc6fe2a5.png)
一个初步的结论是,虽然上座率和 NBA 球队的估值之间存在关系,但存在缺失或潜在变量。最初的预感是,该地区的人口,房地产价格的中位数,以及球队有多好(ELO 排名和胜率)都可能在这里发挥作用。
![elationship between attendance and valuation of an NBA team](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c4bc438df4043499e3a09769129c53bd.png)
## 无监督机器学习:聚类第一数据源
了解 NBA 球队的下一步是使用[无监督 ML](/supervised-vs-unsupervised-learning) 对数据进行聚类,以找到更多见解。我可以从人口普查中手动找到一个县的[中值房价数据](https://www.zillow.com/research/)和每个县的[人口](https://data.census.gov/cedsci/all?q=county)。
所有这些新数据都可以加载一个新的数据框架。
![loading housing dataframe](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b67c0d6d10325511c0c3e25e3029105b.png)
[k-最近邻(kNN)](/knn-with-examples-in-python) 聚类通过确定点之间的欧几里德距离来工作。需要对要聚类的属性进行缩放,这样一个属性的缩放比例不会与另一个不同,否则会扭曲聚类。此外,聚类更多的是艺术而不是科学,选择正确的聚类数可能是一个反复试验的过程。
下面是缩放在实践中的工作原理。
![scaling knn on housing data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/19eba7448baf7a2ff40a02c252111ea0.png)
在本例中,使用了 scikit-learn 中的 MinMaxScaler。它将所有数值转换为 0 到 1 之间的值。接下来,对缩放后的数据执行 sklearn.cluster,然后将分类结果附加到一个新列。
![Kmeans clustering of NBA attendance and housing data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/3f15a990d44a462df06e4eca3b2e6e3b.png)
在这一点上,有足够的解决方案为公司提供即时价值,数据管道的开端正在形成。接下来,让我们使用 R 和 ggplot 来绘制集群。为了将这个数据集放入 R 中,我们可以将它写出到一个 CSV 文件中。
![valuation housing and attendance data saved as a csv](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b3b3f488646a40804054a3e9cc1a0220.png)
## 用 R 绘制三维 kNN 聚类
R 语言的一个亮点是能够用有意义的文本创建高级的情节。用 R 和 Python 编写解决方案的能力为用 ML 编写各种各样的解决方案开辟了道路。在这种特殊的情况下,我们将使用 R 3D 散点图库和 RStudio 来制作一个复杂的关系图,我们已经了解了如何使用 kNN cluster。在本章的 GitHub 项目中,有 R markdown 笔记本,里面有代码和情节;您也可以使用 RStudio for notebooks 中的预览功能来跟进。
要在 RStudio(或 R shell)的控制台中开始,请导入散点图 3d 库并使用以下命令加载数据。
![importing scatterplot3d in r](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b9a01b296d543017cac3644d9702627e.png)
接下来,创建一个函数来将数据类型转换成散点图 3d 库期望的格式。
![R function for converting data for scatterplot3d](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/100c5713fc0f39d11f877dec1ee17cfd.png)
要在 3D 空间的正确位置绘制文本需要一点工作。
![plotting text onto a 3d space code](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/3c2e23c6d3e51dd48ff0431022688dae.png)
图 6.9 显示了一些不寻常的图形。纽约尼克斯队和洛杉矶湖人队是最差的两支篮球队,但却是最有价值的。此外,你可以看到他们所在的城市房价中值最高,这也是他们高估值的原因之一。所有这一切的结果是,它们处于自己的集群中。
蓝色集群主要是 NBA 最好的球队的集合。他们也往往位于房价中值较高、但实际价值相差很大的城市。这让我怀疑房地产在团队估值中发挥的作用比实际业绩更大(这与之前的线性回归相符)。
红色聚类显示的团队通常表现低于平均水平,估值低于平均水平,房地产价格低于平均水平。布鲁克林篮网是一个例外,它正在成为洛杉矶湖人队和纽约尼克斯队类型的球队:表现不佳,但价值很高。
r 还有一种方法可以在多维度上可视化这些关系。接下来,我们将在 r 中使用 ggplot 创建一个地块。
在绘制新图表中的关系时,要做的第一件事是为集群指定一个逻辑名称。3D 图给了我们一些关于如何命名星团的好主意。集群 0 似乎是低价值/低性能集群,集群 1 是中等价值/高性能集群,集群 2 是高价值/低性能集群。需要补充的一点是,聚类数选择是一个复杂的问题。(有关该主题的更多信息,请参见附录 B。)
![3D Scatter Plot of NBA Teams: 2016 - 2017](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c9a110608aef8d25faa279870834556e.png)
接下来,我们可以使用这些聚类名称来分面(在每个图中创建多个图)。此外,ggplot 能够创建许多其他维度,我们将全部使用它们:颜色显示获胜队的百分比和失败队的百分比,大小显示该县中位房价的差异,形状表示 NBA 的东部或西部联盟。
```py
> team_cluster <- read_csv("nba_cluster.csv",
+ col_types = cols(X1 = col_skip())) > library("ggplot2")
>
> #Name Clusters
> team_cluster$cluster_name[team_cluster$cluster == 0] <- "Low" Unknown or uninitialised column: 'cluster_name'. > team_cluster$cluster_name[team_cluster$
cluster == 1] <- "Medium Valuation/High Performance" > team_cluster$cluster_name[team_cluster$
cluster == 2] <- "High Valuation/Low Performance"
```
请注意,如果估价超过 1200,geom_text 只打印团队的名称。这使得情节可读性更强,不会被重叠的文本淹没。在最后的代码片段中,图例标题被更改。还要注意,颜色被更改为具有两个值之一的因子,而不是默认值 0.25.50.1。该图的输出如图 6.10 所示。ggplot 的分面特性真实地展示了聚类是如何为数据探索增加价值的。使用 R 进行高级绘图是一个好主意,即使你是另一种 ML 语言如 Python 或 Scala 的专家。结果不言自明。
```py
> p <- ggplot(data = team_cluster) +
+ geom_point(mapping = aes(x = ELO,
+ y = VALUE_MILLIONS,
+ color =
factor(WINNING_SEASON, labels=
c("LOSING","WINNING")),
+size = MEDIAN_HOME_PRICE_COUNTY_MILLIONS,
+ shape = CONF))
+ facet_wrap(~ cluster_name)
+ ggtitle("NBA Teams 2016-2017 Faceted Plot")
+ ylab("Value NBA Team in Millions")
+ xlab("Relative Team Performance (ELO)")
+ geom_text(aes(x = ELO, y = VALUE_MILLIONS,
+ label=ifelse(VALUE_MILLIONS>1200,
+ as.character(TEAM),'')),hjust=.35,vjust=1)
```
请注意,如果估价超过 1200,geom_text 只打印团队的名称。这使得情节可读性更强,不会被重叠的文本淹没。在最后的代码片段中,图例标题被更改。还要注意,颜色被更改为具有两个值之一的因子,而不是默认值 0.25.50.1。该图的输出如图 6.10 所示。ggplot 的分面特性真实地展示了聚类是如何为数据探索增加价值的。使用 R 进行高级绘图是一个好主意,即使你是另一种 ML 语言如 Python 或 Scala 的专家。结果不言自明。
```py
#Change legends
p+
guides(color = guide_legend(title = "Winning Season")) +
guides(size = guide_legend(
+ title = "Median Home Price County in Millions" )) +
guides(shape = guide_legend(title = "NBA Conference"))
```
## 收集具有挑战性的数据源
已经收集了关于团队的一组好的数据,是时候进入更具挑战性的数据源了。这是事情开始变得更加真实的地方。收集随机数据源存在一些巨大的问题:API 限制、未记录的 API、脏数据等等。
### 收集运动员的维基百科浏览量
这里有几个需要解决的问题。
1. 如何对维基百科系统进行逆向工程以获得浏览量(或找到隐藏的 API 文档)
2. 如何找到生成维基百科句柄的方法(它们可能和自己的 NBA 名字不一样)
3. 如何将数据框架与其余数据连接起来
下面是如何在 Python 中实现这一点。这个例子的全部源代码都在本书的 GitHub repo 中,但是将在这些部分中进行分析。下面是维基百科页面浏览量和四个所需模块的示例 URL。请求库将进行 HTTP 调用,Pandas 将把结果转换成数据帧,维基百科库将用于为运动员检测正确的维基百科 URL。
```py
"""Example Route To Construct:
https://wikimedia.org/api/rest_v1/ +
metrics/pageviews/per-article/ +
en.wikipedia/all-access/user/ +
LeBron_James/daily/2015070100/2017070500 + """
import requests
import pandas as pd
import time
import wikipedia
BASE_URL ="https://wikimedia.org/api/rest_v1/metrics/pageviews/per-article/en.wikipedia/all-access/user"
```
接下来,下面的代码构造一个包含数据范围和用户名的 URL。
```py
def construct_url(handle, period, start, end):
"""Constructs a URL based on arguments
Should construct the following URL:
/LeBron_James/daily/2015070100/2017070500"""
urls = [BASE_URL, handle, period, start, end]
constructed = str.join('/', urls)
return constructed
def query_wikipedia_pageviews(url):
res = requests.get(url)
return res.json()
def wikipedia_pageviews(handle, period, start, end):
"""Returns JSON"""
constructed_url = construct_url(handle, period, start,end)
pageviews = query_wikipedia_pageviews(url=constructed_url)
return pageviews
```
以下函数自动填充 2016 年的查询。这可以在以后变得更抽象,但是现在,这是“黑客”代码,为了速度硬编码可能值得技术债务。还要注意,sleep 被设置为 0,但是如果达到 API 限制,可能需要启用它。这是第一次使用 API 时的常见模式;他们可能会以意想不到的方式行事,所以隔一段时间睡觉通常可以解决这个问题,这也是一种临时的方法。
```py
def wikipedia_2016(handle,sleep=0):
"""Retrieve pageviews for 2016"""
print("SLEEP: {sleep}".format(sleep=sleep))
time.sleep(sleep)
pageviews = wikipedia_pageviews(handle=handle,
period="daily", start="2016010100", end="2016123100")
if not 'items' in pageviews:
print("NO PAGEVIEWS: {handle}".format(handle=handle))
return None
return pageviews
```
接下来,结果被转换成熊猫数据帧。
```py
def create_wikipedia_df(handles):
"""Creates a Dataframe of Pageviews"""
pageviews = []
timestamps = []
names = []
wikipedia_handles = []
for name, handle in handles.items():
pageviews_record = wikipedia_2016(handle)
if pageviews_record is None:
continue
for record in pageviews_record['items']:
pageviews.append(record['views'])
timestamps.append(record['timestamp'])
names.append(name)
wikipedia_handles.append(handle)
data = {
"names": names,
"wikipedia_handles": wikipedia_handles,
"pageviews": pageviews,
"timestamps": timestamps
}
df = pd.DataFrame(data)
return df
```
代码中更棘手的部分从这里开始,因为猜测正确的句柄需要一些试探法。对于第一遍,猜测大多数句柄都是简单的`first_last`。第二次传递将“(篮球)”附加到名称上,这是维基百科消除歧义的常用策略。
```py
def create_wikipedia_handle(raw_handle):
"""Takes a raw handle and converts it to a wikipedia handle"""
wikipedia_handle = raw_handle.replace(" ", "_")
return wikipedia_handle
def create_wikipedia_nba_handle(name):
"""Appends basketball to link"""
url = " ".join([name, "(basketball)"])
return url
def wikipedia_current_nba_roster():
"""Gets all links on wikipedia current roster page"""
links = {}
nba = wikipedia.page("List_of_current_NBA_team_rosters")
for link in nba.links:
links[link] = create_wikipedia_handle(link)
return links
```
这段代码运行试探法并返回经过验证的句柄和猜测。
```py
def guess_wikipedia_nba_handle(data="data/nba_2017_br.csv"):
"""Attempt to get the correct wikipedia handle"""
links = wikipedia_current_nba_roster()
nba = pd.read_csv(data)
count = 0
verified = {}
guesses = {}
for player in nba["Player"].values:
if player in links:
print("Player: {player}, Link: {link} "format(player=player,link=links[player]))
print(count)
count += 1
verified[player] = links[player] #add wikipedia link
else:
print("NO MATCH: {player}".format(player=player))
guesses[player] = create_wikipedia_handle(player)
return verified, guesses
```
接下来,Wikipedia Python 库用于转换名字和姓氏的失败初始猜测,并在页面摘要中查找“NBA”。这是另一个体面的黑客获得更多的比赛。
```py
def validate_wikipedia_guesses(guesses):
"""Validate guessed wikipedia accounts"""
verified = {}
wrong = {}
for name, link in guesses.items():
try:
page = wikipedia.page(link)
except (wikipedia.DisambiguationError,wikipedia.PageError) as error:
#try basketball suffix
nba_handle = create_wikipedia_nba_handle(name)
try:
page = wikipedia.page(nba_handle)
print("Initial wikipedia URL Failed: {error}".format(error=error))
except (wikipedia.DisambiguationError, wikipedia.PageError) as error:
print("Second Match Failure: {error}".format(error=error))
wrong[name] = link
continue
if "NBA" in page.summary:
verified[name] = link
else:
print("NO GUESS MATCH: {name}".format(name=name))
wrong[name] = link
return verified, wrong
```
在脚本结束时,一切都运行了,输出用于创建一个新的 CSV 文件。
```py
def clean_wikipedia_handles(data="data/nba_2017_br.csv"):
"""Clean Handles"""
verified, guesses = guess_wikipedia_nba_handle(data=data)
verified_cleaned, wrong = validate_wikipedia_guesses(guesses)
print("WRONG Matches: {wrong}".format(wrong=wrong))
handles = {**verified, **verified_cleaned}
return handles
def nba_wikipedia_dataframe(data="data/nba_2017_br.csv"):
handles = clean_wikipedia_handles(data=data)
df = create_wikipedia_df(handles)
return df
def create_wikipedia_csv(data="data/nba_2017_br.csv"):
df = nba_wikipedia_dataframe(data=data)
df.to_csv("data/wikipedia_nba.csv")
if __name__ == "__main__":
create_wikipedia_csv()
```
总之,像这样的事情可能需要几个小时到几天的时间,代表了通过随机数据源解决问题的现实主义。
## 收集运动员的 Twitter 参与度
从 Twitter 收集数据有一些更简单的元素。首先,Python 中有一个很棒的库,名为 twitter。然而,仍然存在一些挑战。它们在这里被展示出来。
1. 使用描述性统计数据总结敬业度
2. 找到正确的 Twitter 句柄(Twitter 上的句柄名称甚至比维基百科上的更难找到)
3. 将数据帧与其余数据连接起来
首先,创建一个配置文件 config.py,并将 Twitter API 的凭证放入其中。然后,`.import config`将创建一个名称空间来使用这些凭证。此外,Twitter 错误处理以及 Pandas 和 NumPy 也被导入。
```py
import time
import twitter
from . import config
import pandas as pd
import numpy as np
from twitter.error import TwitterError
```
下面的代码与 Twitter 对话,获取 200 条推文,并将它们转换成熊猫数据帧。请注意这种模式是如何在与 API 的对话中频繁使用的;这些列被放入一个列表中,然后这个列表被用来创建一个数据帧。
```py
def api_handler():
"""Creates connection to Twitter API"""
api = twitter.Api(consumer_key=config.CONSUMER_KEY,
consumer_secret=config.CONSUMER_SECRET,
access_token_key=config.ACCESS_TOKEN_KEY,
access_token_secret=config.ACCESS_TOKEN_SECRET)
return api
def tweets_by_user(api, user, count=200):
"""Grabs the "n" number of tweets. Defaults to 200"""
tweets = api.GetUserTimeline(screen_name=user, count=count)
return tweets
def stats_to_df(tweets):
"""Takes twitter stats and converts them to a dataframe"""
records = []
for tweet in tweets:
records.append({"created_at":tweet.created_at,
"screen_name":tweet.user.screen_name,
"retweet_count":tweet.retweet_count,
"favorite_count":tweet.favorite_count})
df = pd.DataFrame(data=records)
return df
def stats_df(user):
"""Returns a dataframe of stats"""
api = api_handler()
tweets = tweets_by_user(api, user)
df = stats_to_df(tweets)
return df
```
最后一个函数 stats_df 现在可以用来交互式地研究 Twitter API 调用的结果。下面是勒布朗·詹姆斯描述性统计的一个例子。
![LeBron James descriptive statistic using pandas describe and corr](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/629aebf2481123e7677a84852ff9a47d.png)
在下面的代码中,调用 Twitter API 时会略微休眠,以避免遇到 API 节流。请注意,Twitter 句柄是从 CSV 文件中提取的。篮球参考还保留了大量的 Twitter 账户。另一种选择是手动找到它们。
```py
def twitter_handles(sleep=.5,data="data/twitter_nba_combined.csv"):
"""yield handles"""
nba = pd.read_csv(data)
for handle in nba["twitter_handle"]:
time.sleep(sleep) #Avoid throttling in twitter api
try:
df = stats_df(handle)
except TwitterError as error: print("Error {handle} and error msg {error}".format(
handle=handle,error=error))
df = None
yield df
def median_engagement(data="data/twitter_nba_combined.csv"):
"""Median engagement on twitter"""
favorite_count = []
retweet_count = []
nba = pd.read_csv(data)
for record in twitter_handles(data=data):
print(record)
#None records stored as Nan value
if record is None:
print("NO RECORD: {record}".format(record=record))
favorite_count.append(np.nan)
retweet_count.append(np.nan)
continue
try:
favorite_count.append(record['favorite_count'].median())
retweet_count.append(record["retweet_count"].median())
except KeyError as error:
print("No values found to append {error}".format(error=error))
favorite_count.append(np.nan)
retweet_count.append(np.nan)
print("Creating DF")
nba['twitter_favorite_count'] = favorite_count
nba['twitter_retweet_count'] = retweet_count
return nba
```
在这一切结束时,会创建一个新的 CSV 文件。
```py
def create_twitter_csv(data="data/nba_2016_2017_wikipedia.csv"):
nba = median_engagement(data)
nba.to_csv("data/nba_2016_2017_wikipedia_twitter.csv")
```
## 探索 NBA 运动员数据
为了研究运动员数据,将创建一个新的 Jupyter 笔记本。这个笔记本叫做`nba_player_power_influence_performance`。首先,导入一些常用的库。
```py
import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.cluster import KMeans
color = sns.color_palette()
from IPython.core.display import display, HTML
display(HTML("<style>.container{width:100% !important; }</style>"))
%matplotlib inline
```
接下来,将数据文件加载到项目中,并重命名这些列。
```py
attendance_valuation_elo_df =pd.read_csv("../data/nba_2017_att_val_elo.csv")
salary_df = pd.read_csv("../data/nba_2017_salary.csv")
pie_df = pd.read_csv("../data/nba_2017_pie.csv")
plus_minus_df=pd.read_csv("../data/nba_2017_real_plus_minus.csv")
br_stats_df = pd.read_csv("../data/nba_2017_br.csv")
plus_minus_df.rename(
columns={"NAMES":"PLAYER", "WINS":"WINS_RPM"}, inplace=True)
players = []
for player in plus_minus_df['PLAYER']:
plyr, _ = player.split(".")
platers.append(plyr)
plus_minus_df.drop(["PLAYER"], inplace=True, axis=1)
plus_minus_df["PLAYER"] = players
```
有一些重复的源,所以这些也可以删除。
![Removing duplicate sources in NBA data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b6890f661ae2232dc2814c634dad3e84.png)
![Subsetting and renaming NBA data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/28f7f95fff0e8e52b04d43034db19297.png)
111 名 NBA 球员的工资信息丢失,所以当我们做分析时,这些球员也将被删除。
![removing NBA data with missing values](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e6f80f30bbb99e4d8b637caeefa4c5a5.png)
剩下的是一个有 38 列的熊猫数据框架。
![Columns in NBA Dataframe](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/448660e366ad5550431af35eee0c12f2.png)
![Length of NBA Dataframe](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6fe06ada85ef1cc7591555ca9cf8074b.png)
接下来,数据框架可以与维基百科数据合并。数据被折叠到一个中间字段中,因此可以表示为一列中的一行。
```py
wiki_df = pd.read_csv(
"../data/nba_2017_player_wikipedia.csv")
wiki_df.rename(columns={"names":"Players", "pageviews":"PAGEVIEWS"}, inplace=True)
median_wiki_df = wiki_df.groupby("PLAYER").median()
median_wiki_df_small = median_wiki_df[["PAGEVIEWS"]]
median_wiki_df_small.reset_index(
level=0, inplace=True)
median_wiki_df_sm.head()
```
```py
PLAYER PAGEVIEWS
A.J. Hammons 1.0
Aaron Brooks 10.0
Aaron Gordon 666.0
Aaron Harrison 487.0
Adreian Payne 166.0
```
最后要添加的列是来自 Twitter 数据的值。现在总共有 41 个属性可以使用。
```py
twitter_df = pd.read_csv(
"../data/nba_2017_twitter_players.csv")
nba_players_with_salary_wiki_twitter_df=nba_players_with_salary_wiki_df.merge(twitter_df)
len(nba_players_with_salary_wiki_twitter_df.columns)
```
```py
41
```
探索数据的合理的下一步是创建关联热图。
```py
plt.subplot(figsize=(20,15))
ax = plt.axes()
ax.set_title("NBA Player Correlation Heatmap")
corr = nba_players_with_salary_wiki_twitter_df_corr()
sns.heatmap(corr,
xticklabels=corr.columns.values,
yticklabels=corr.columns.values)
```
图 6.11 显示了一些有趣的相关性。Twitter 参与度和维基百科浏览量高度相关。归因于玩家的胜利,或 WINS_RPM,也与 Twitter 和 Wikipedia 相关。薪水和积分也高度相关。
![NBA Players Correlation Heatmap: 2016 - 2017](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/268a510509e7d4cbb3b9704b5b9c2c35.png)
## NBA 球员的无监督机器学习
利用多样化的数据集和许多有用的属性,对 NBA 球员进行无监督的 ML 可以证明是非常有用的。第一步是缩放数据并选择要聚类的属性(删除缺少任何值的行)。
![Unsupervised ml code for NBA player data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b4107983d4f65176fb9b7a66e067949b.png)
接下来,让我们再次集群并写出一个 CSV 文件来在 r 中进行分面绘制。
![KMeans clustering script for NBA data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ce945100705fccfc7d28181b3f37e687.png)
## NBA 球员的分面聚类分析
首先,导入 CSV 文件并使用 ggplot2 库。
```py
> player_cluster <- read_csv(
+ "nba_2017_players_social_with_clusters.csv",
+ col_types = cols(X1 = col_skip()))
> library("ggplot2")
```
接下来,给所有四个集群起一个有意义的名字。
```py
> #Name Clusters
> player_cluster$cluster_name[player_cluster$
+ cluster == 0] <- "Low Pay/Low" > player_cluster$cluster_name[player_cluster$
+ cluster == 1] <- "High Pay/Above Average Performance" > player_cluster$cluster_name[player_cluster$
+ cluster == 2] <- "Low Pay/Average Performance" > player_cluster$cluster_name[player_cluster$
+ cluster == 3] <- "High Pay/High Performance" > player_cluster$cluster_name[player_cluster$
+ cluster == 4] <- "Medium Pay/Above Average Performance"
```
使用集群名称创建面。
```py
> #Create faceted plot
> p <- ggplot(data = player_cluster)
+ geom_point(mapping = aes(x = WINS_RPM,
y = POINTS,
color = SALARY_MILLIONS,
size = PAGEVIEWS))+
+ facet_wrap(~ cluster_name) +
+ ggtitle("NBA Players Faceted")
+ ylab("POINTS PER GAME")
+ xlab("WINS ATTRIBUTABLE TO PLAYER (WINS_RPM)")
+ geom_text(aes(x = WINS_RPM, y = POINTS,
```
在每个方面都有一些工作要做,这是通过下面的 R 和/或语句来完成的。薪水中还使用了三种颜色,这样可以更清楚地看到差异
```py
label=ifelse(
+ PAGEVIEWS>10000|TOV>5|AGE>37|WINS_RPM>15|cluster
+ == 2 & WINS_RPM > 3,
+
as.character(PLAYER),'')),hjust=.8, check_overlap = FALSE)
>
> #Change legends
> p +
+ guides(color = guide_legend(title = "Salary Millions")) +
+ guides(size = guide_legend(
+ title = "Wikipedia Daily Pageviews" ))+
+ scale_color_gradientn(colours = rainbow(3))
> geom_text(aes(x = ELO, y = VALUE_MILLIONS, label=ifelse(
VALUE_MILLIONS>1200,as.character(TEAM),'')),hjust=.35,vjust=1)
```
最终的结果是一个漂亮的,多面的图,如图 6.12 所示。已经发现的主要标签是受欢迎程度、工资和绩效之间的差异。勒布朗·詹姆斯和拉塞尔·维斯特布鲁克的组合拥有“精英中的精英”,但他们也拥有最高的薪水。
![ggplot Faceted Plot NBA Players: 2016 - 2017 with kNN](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8f71eeeb4f4f167f09c95038d072b792.png)
## 把所有这些放在一起:团队、球员、权力和支持
收集了所有数据后,有一些有趣的新情节需要测试。通过结合代言、球队和球员的数据,有可能制作出几个引人入胜的情节。首先,背书数据可以显示在图 6.13 中的关联热图中。你可以看到“铜”色给这个情节增加了一个有趣的转折。
![code for Endorsements Correlation Heatmap](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b1666567577b5459508b722918a65188.png)
![Endorsements Correlation Heatmap](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5c79f71f1eadbc6141d55cf2101b6601.png)
接下来,在重点图中,作品的整体展示在图 6.14 中。这方面的代码是
![code for heatmapping endorsement data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b8c4dd60af40806496a2b25095fede2b.png)
![Endorsements for Players, Accent Plot](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2f4fa8cf47a204cb2963e28c7104f517.png)
注意,使重音图可读的很大一部分是将颜色转换成对数范数。这允许相对变化成为细胞间边界的催化剂。
## 进一步的实用步骤和学习
这本书存在的主要原因之一是展示如何创建可部署到生产中的完整的工作解决方案。将此解决方案从笔记本中取出的一种方法是探索其他章节中的一些解决方案,这些章节介绍了将项目投入生产的技术,例如,创建一个 NBA 球队估值预测 API,或一个展示 NBA 超级明星社会影响力的 API。Y combinator (YC)的演示文稿可能只需要几行代码。除此之外,[ka ggle 笔记本](https://www.kaggle.com/noahgift/social-power-nba)可以分叉,这可能是更多探索的起点。【还有一个互补的[多米诺项目](https://try.dominodatalab.com/u/ann_spencer/socialpowernba/overview)。]最后,关于这个主题的视频和幻灯片可以在[Strata Data Conference 2018 San Jose 日程表上找到。](https://conferences.oreilly.com/strata/strata-ca/public/schedule/detail/63606)
## 摘要
本章着眼于现实世界的 ML 问题,从问题开始,然后转移到如何从互联网上收集数据的技术。许多较小的数据集是从网站上剪切和粘贴的,这些网站可能对它们的收集友好,也可能不友好。更大的数据源 Wikipedia 和 Twitter 需要一种不同的方法——一种更加以软件工程为中心的方法。接下来,以统计的方式并使用无监督的 ML 和数据可视化来探索数据。在最后一节中,使用云提供商创建了几个解决方案,包括一个可伸缩的 API、一个无服务器应用程序和一个数据可视化框架(Shiny)。
# 深度学习的 Tensorflow、PyTorch 或 Keras
> 原文:<https://www.dominodatalab.com/blog/tensorflow-pytorch-or-keras-for-deep-learning>
机器学习为我们提供了创建数据驱动系统的方法,这些系统可以学习和增强自身,而无需为手头的任务专门编程。就机器学习算法而言,有一类已经抓住了我们许多人的想象力:深度学习。你肯定听说过许多利用深度学习的奇妙应用。例如,以汽车行业为例,其中[自动驾驶汽车由卷积神经网络](https://developer.nvidia.com/blog/deep-learning-self-driving-cars/)驱动,或者看看递归神经网络如何用于[语言翻译和理解](https://ai.googleblog.com/2017/08/transformer-novel-neural-network.html)。同样值得一提的是神经网络在[医学图像识别](https://sciencepublishinggroup.com/journal/paperinfo?journalid=303&doi=10.11648/j.ajcst.20190202.11)中的许多不同应用。
深度学习可以被认为是人工智能的支柱之一,它从神经元如何在大脑中相互交流中获得灵感。人工神经网络(简称神经网络)通常是分层组织的;每一层都由几个相互连接的节点组成,这些节点对它们接收到的输入进行转换。请参见下图。该转换被称为激活函数,并且其输出被直接馈送到相邻神经元的下一层。网络中的第一层称为输入层,最后一层是输出层。夹在输入层和输出层之间的层称为隐藏层,原则上,我们可以有任意数量的隐藏层。在深度学习中使用形容词“深度”是指神经网络架构中的大量隐藏层。在之前的博客文章中,我们谈到了深度神经网络所需的计算任务如何受益于 GPU 的使用。随着我们网络中参数数量的增长,这一点尤其重要,可能达到数百亿个。
![tf_pt_keras_for_dl_ann](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7109e841b25d21ca3f1aeaca7212c132.png)
您可以编写自己的代码来实现一个神经网络架构,该架构可以使用单个隐藏层来逼近任何函数。随着我们添加更多层,我们能够通过执行自动[特征工程](https://www.dominodatalab.com/data-science-dictionary/feature-engineering)来创建学习复杂表示的系统。我已经在我的书[“用 Python 进行高级数据科学和分析”](https://www.taylorfrancis.com/books/mono/10.1201/9780429446641/advanced-data-science-analytics-python-jesús-rogel-salazar)中介绍了这个主题,作为对神经网络的介绍。除此之外,我强烈推荐阅读[最近在这个博客](https://blog.dominodatalab.com/deep-learning-introduction)上发表的一篇关于深度学习和神经网络的文章。虽然这可能是一个非常有启发性的练习,并且它将使您对神经网络如何工作有一个深入的了解,但是如果您正在寻求为复杂的应用程序构建高效的实现,您还需要熟悉许多框架。这些框架的一些例子包括 TensorFlow、PyTorch、Caffe、Keras 和 MXNet。在这篇文章中,我们关注的是深度学习的三个主要框架,即 TensorFlow、PyTorch 和 Keras。我们将看看它们的起源、优缺点,以及在选择其中一个进行深度学习任务之前,你应该考虑什么。
## 深度学习框架:综述
### TensorFlow
TensorFlow 是最著名的深度学习框架之一。它最初是谷歌大脑的一个内部项目,旨在帮助改善谷歌的一些服务,如 Gmail、照片和无处不在的谷歌搜索引擎。2015 年末公开,但直到 2017 年才发布第一个稳定版(1.0.0)。进一步的改进给了我们 [TensorFlow 2.0](https://medium.com/tensorflow/whats-coming-in-tensorflow-2-0-d3663832e9b8) ,于 2019 年 9 月发布。该框架可作为 Apache License 2.0 下的开源项目获得,根据 [TensorFlow Dev Summit 2020 主题演讲](https://www.youtube.com/watch?v=_lsjCH3fd00&t=90s),据报道该框架已被下载 76,000,000 次,超过 2,400 人对其开发做出了贡献。这种流行的深度学习框架的名称来自于用于在神经网络中执行操作和操纵的张量。在这种情况下,张量实际上是一个多维数据数组,它“流经”神经网络的各个层。
TensorFlow 最重要的特性之一是开发人员可以用它实现的抽象。这意味着,机器学习开发者不是处理遍历神经网络所需的操作的低级细节,而是专注于应用程序的高级逻辑。这是在数据流图的帮助下实现的,数据流图描述了张量如何通过神经网络中的一系列层和节点移动。平心而论,TensorFlow 提供的 API 不仅是高级的,还允许一些低级的操作。此外,还有支持 Python、JavaScript、C++和 Java 的 API。除此之外,还有一些针对 C#、Haskell、Julia、R、Matlab、Scala 等的第三方语言绑定包。开发人员也能够使用 Keras 来创建自己的机器学习模型。稍后会详细介绍。
使用 TensorFlow 的另一个优势是 Google 提供的张量处理单元或 TPU。这些是专用集成电路,专门为与 TensorFlow 一起用于机器学习而定制。可以想象,Google 是 TensorFlow 的重度用户。例如,看看 [TF-Ranking](https://ai.googleblog.com/2021/07/advances-in-tf-ranking.html) ,这是一个开发学习-排名模型的库。像 [GE Healthcare](https://blog.tensorflow.org/2019/03/intelligent-scanning-using-deep-learning.html) 这样的公司已经在 MRI 扫描中使用 TensorFlow 进行大脑解剖识别; [Spotify](https://engineering.atspotify.com/2019/12/13/the-winding-road-to-better-machine-learning-infrastructure-through-tensorflow-extended-and-kubeflow/) 用它来改善对用户的音乐推荐。其他用例列在 [TensorFlow 主页](https://www.tensorflow.org/about/case-studies)上。
### PyTorch
PyTorch 并没有掩盖 Python 是其开发和设计原则的核心这一事实。PyTorch 也是一个开源项目(BSD 许可证),它建立在几个项目的基础上,主要是现在已经废弃的[Lua Torch](http://torch.ch/)T4、一个现在被 PyTorch 本身取代的科学计算框架,以及自动微分库 [Chainer](https://chainer.org/) 和 [HIPS 亲笔签名](https://github.com/HIPS/autograd)。PyTorch 由 Meta 的研究(以前的脸书)带头,让用户创建计算机视觉、对话式人工智能和个性化的系统。[版本 1.0](https://engineering.fb.com/2018/05/02/ai-research/announcing-pytorch-1-0-for-both-research-and-production/) 于 2018 年发布,[版本 1.10](https://pytorch.org/blog/pytorch-1.10-released/) 于 2021 年 10 月发布,后者支持 CUDA graph APIs 以及其他改进。
鉴于其 Python 证书,PyTorch 使用类似 NumPy 张量的对象进行计算。一些开发人员认为它比其他人更“pythonic 化”。无论如何,PyTorch 是一个非常灵活的框架:尽管它依赖于一个图来定义神经网络架构的逻辑,但我们不需要在计算之前定义它。相反,我们可以以动态的方式向图中添加组件,并且彼此独立。这也为我们代码的测试和调试阶段带来了优势。
与 TensorFlow 相比,PyTorch 成功地建立了大量的支持者,这要归功于它的动态图方法以及调试和测试代码的灵活性。作为回应,TensorFlow 最近引入了一种类似 PyTorch 的“急切执行”模式。一些基于 PyTorch 的流行用例包括为 Tubi 的视频点播需求[提供动力,Lyft](https://medium.com/pytorch/machine-learning-at-tubi-powering-free-movies-tv-and-news-for-all-51499643018e) 的自动驾驶汽车[的培训,或者](https://medium.com/pytorch/how-lyft-uses-pytorch-to-power-machine-learning-for-their-self-driving-cars-80642bc2d0ae)[迪士尼的](https://medium.com/pytorch/how-disney-uses-pytorch-for-animated-character-recognition-a1722a182627)动画角色识别工作。
### Keras
[Keras](https://keras.io/) 是另一个值得考虑的重要深度学习框架。它不仅像 PyTorch 一样基于 Python,而且它还有一个高级神经网络 API,TensorFlow 等公司已经采用它来创建新的架构。它是一个在 MIT 许可下提供的开源框架。它也运行在[Aesara](https://github.com/aesara-devs/aesara)([Theano](https://github.com/Theano/Theano)和 [CNTK](https://github.com/Microsoft/CNTK) 的继任者)之上。我认为 Keras 具有两个世界的优点,这也是我选择这个框架作为[“使用 Python 的高级数据科学和分析”](https://www.taylorfrancis.com/books/mono/10.1201/9780429446641/advanced-data-science-analytics-python-jesús-rogel-salazar)中深度学习章节的主要核心的主要原因。它将 Python 的可读性和用户友好性与快速原型制作和实验相结合,使其成为深度学习领域的真正竞争者。
Keras 最初是作为开放式神经电子智能机器人操作系统(ONEIROS)研究项目的一部分开发的。这个首字母缩略词指的是神话中的希腊原始神,被称为 [Onieiroi](https://www.greekmythology.com/Other_Gods/Oneiroi/oneiroi.html) 。Keras 这个名字来源于希腊语,意为“角”,进一步参考了希腊神话,在这种情况下,暗指由角制成的大门,真正的梦想来自于此。Keras 依赖于一个模型,该模型允许我们在神经网络中添加和删除层,使我们能够通过其顺序 API 以顺序方式构建简单和复杂的架构。如果我们需要具有各种输入和输出的模型,Keras 还提供了一个功能 API。这让我们可以定义复杂的模型,如多输出模型、有向无环图或具有共享层的模型。
Keras 被用于各种任务,从预测肺炎到检测疟疾。它也与 TensorFlow 一起被广泛用于大型强子对撞机中的 [CERN,或者 NASA 内部的](https://blog.tensorflow.org/2021/04/reconstructing-thousands-of-particles-in-one-go-at-cern-lhc.html)[高端计算能力](https://www.nas.nasa.gov/hecc/support/kb/multiple-cpu-nodes-and-training-in-tensorflow_644.html)。
## 选择深度学习的框架
我们已经解决了当[选择机器学习框架](https://www.dominodatalab.com/blog/choosing-the-right-machine-learning-framework)时你需要考虑的一些方面。我们支持帖子中提到的三个方面,即:
1. 评估您的需求
2. 参数优化
3. 扩展、培训和部署
我们强烈建议查看之前的帖子,了解这些方面的更多信息。在这篇文章中,我们集中讨论三种深度学习框架的优缺点。这一点,加上上面的三个方面,应该是在这三个优秀的选项中进行选择的良好开端。
### TensorFlow
#### 赞成的意见
* 对计算图形的强大支持,包括计算和可视化(通过 TensorBoard)
* 支持 Keras
* 谷歌支持的图书馆管理,经常更新和发布
* 具有高度可扩展性的高度并行管道
* TPU 的可用性
* 能够使用调试方法调试代码
#### 骗局
* 由于低级 API,学习曲线很陡
* 谷歌支持的图书馆管理,经常更新和发布。我们也把它列为专业版,但是有时新版本的文档可能有点过时。
* 代码可能有点混乱
* TPUs 的使用只允许执行模型,不允许培训
* 仅支持 NVIDIA 的 GPU 加速。它也只支持 Python 用于 GPU 编程
* Windows 操作系统下的限制
### PyTorch
#### 赞成的意见
* 简单易学
* 支持急切执行的动态图逻辑
* 用 Python 原生开发,使得开发非常“Python 化”
* 支持 GPU 和 CPU
* 支持分布式培训
#### 骗局
* 生产所需的 API 服务器
* 通过 [Visdom](https://github.com/fossasia/visdom) 的培训过程可视化受到限制
* 目前不如 TensorFlow 受欢迎,尽管 PyTorch 仍在继续增长
### Keras
#### 赞成的意见
* 优秀的高级 API
* 与 TensorFlow、Aesara/Theano 和 CNTK 无缝集成
* 通过构建新架构的简单方法轻松学习
* 提供多个预先训练的模型
* 快速实验
#### 骗局
* 最适合处理小型数据集
* 有时被视为“前端”框架,对于后端使用可能更慢(与 TensorFlow 相比)
## 比较深度学习框架
| 元素 | Tensorflow | PyTorch | Keras |
| 连接 | C++,Python,CUDA | Python,C/C++,Julia | 计算机编程语言 |
| 体系结构 | 难以使用 | 简单易用,可读性较差 | 简单易用 |
| 表演 | 高性能,适合大型数据集 | 高性能,适合大型数据集 | 最适合较小的数据集 |
| 学习曲线 | 陡峭的 | 温和的 | 容易的 |
| 许可证 | 阿帕奇 2.0 | 加州大学伯克利分校软件(Berkeley Software Distribution) | 用它 |
| 排除故障 | 调试复杂 | 良好的调试能力 | 简单的架构需要较少的调试 |
| 社区支持和受欢迎程度 | 第一 | 第三 | 第二 |
| 速度 | 快的 | 快的 | 慢的 |
| 形象化 | 优秀的 | 有限的 | 取决于后端 |
## 摘要
深度学习的可用框架数量一直在稳步增长。根据你的需要和愿望,可能有一个最适合你。不可否认,TensorFlow 更成熟,更适合高性能。此外,它的流行意味着有很多支持,不仅来自谷歌,而且来自整个社区。PyTorch 是一个伟大的框架,自豪地佩戴着它的 pythonista 徽章,提供了灵活性和出色的调试能力。最后,Keras 应该更多地被视为 TensorFlow 的同伴,而不是真正的对手。如果你有兴趣迈出深度学习的第一步,我强烈建议从 Keras 开始。它有一个非常简单的学习曲线,一旦你准备好了,你可能想在需要时转移到完整的 TensorFlow 或 PyTorch 来利用它的 pythonic 能力。
#### 额外资源
您可以获得一个 [免费 14 天](https://invite.try.dominodatalab.com/?utm_id=234%20utm_source=DS_Blog%20utm_stage=Blog_Outreach) 试用访问 [企业 Domino MLOps 平台](https://www.dominodatalab.com/product/domino-enterprise-mlops-platform),在这里您可以
* 运行像 JupyterLab、RStudio 和 VScode 这样的 ide
* use TensorFlow, PyTorch, and Keras
* 了解如何快速轻松地部署 ML 模型和应用程序。
# 维度的诅咒
> 原文:<https://www.dominodatalab.com/blog/the-curse-of-dimensionality>
## 大数据的危险
大数据风靡一时。这可能是许多行(样本)和几个列(变量),如信用卡交易数据,或者许多列(变量)和几行(样本),如生命科学研究中的基因组测序。*维数灾难*,或*大 P,小 N, ((P > > N))* 问题适用于后一种情况,即在相对较少数量的样本上测量大量变量。
数据集中的每个变量都是一个维度,变量集定义了样本所在的空间。考虑由小学生的身高和体重定义的二维空间。每个学生被表示为图上的一个点,X 轴(维度)是身高,Y 轴(维度)是体重。一般来说,年纪大的学生更高更重,所以他们在图上的点更可能在空间的右上区域。存在用于分析这种二维数据的统计方法。例如,马诺娃可以测试男孩和女孩的身高和体重是否不同。这个统计检验是正确的,因为数据(大概)是双变量正态的。
当有许多变量时,*维数灾难*会改变数据的行为,标准的统计方法会给出错误的答案。这导致了通过昂贵且及时的实验来跟踪错误结果的成本增加,并减缓了产品开发的速度。在这篇博客中,我们展示了数据在高维空间中的*行为变化。在我们的下一篇博客中,我们将讨论如何在高维数据的应用数据分析中避免这些问题。*
## 数据有属性
上个世纪发展起来的统计学是基于概率模型(分布)的。这种方法提供了一种**自动和客观的策略,用于在关于数据**的已定义假设下进行决策。这种数据分析模型在基础生物医学研究和临床试验中被证明非常成功。
不幸的是,当变量的数量远大于样本的数量时(即 \(P > > N\) ),这种方法就失效了。在高维中,不满足统计检验所需的数据假设。下面我们将展示当 \(P > > N\) 时数据会发生什么,以及它如何导致不正确的结果。
高维数据有四个*属性*:
* 在高维空间中,点彼此远离。
* 在高维空间中,点远离中心。
* 所有点对之间的距离变得相同。
* 任何预测模型的准确率都接近 100%。
下面用代码讨论了每个属性,这样读者可以自己测试。
### 性质 1:高维空间中的点彼此远离。这意味着局部邻域中的数据密度过于稀疏,不符合分布。
考虑上面讨论的身高/体重数据。将每个学生表示为一个长度为二的向量, \(s_i = (x_{i,1},x_{i,2})\) ,其中 \(x_{i1}\) 为身高, \(x_{i2}\) 为学生的体重 \(i\) 。两个学生 \(i,j\) 在二维上的欧氏距离 \(p = 2\) 为 \[d_{p = 2}(s_{i},s_{j}) = \sqrt{(x_{i,1} - x_{j,1})^2 + (x_{i,2} - x_{j,2})^2}.\] 增加变量时距离非递减, \[d_{p = 3}(s_{i},s_{j}) = \sqrt{(x_{i,1} - x_{j,1})^2 + (x_{i,2} - x_{j,2})^2 + (x_{i,3 }-x_{j,3})^2} \ geq d _ { p = 2 }(s _ { I },s_{j}),\] 当增加的变量有不同值时严格递增(例如,这个结果延伸到高维度,\(d _ { p = 1 } \ leq d _ { p = 2 } \ leq d _ { p = 3 } \ leq \ ldots \)。
随着维数增加到无穷大,其中样本之间的值是不同的,点对之间的距离变到无穷大,即\(\ lim _ { P \ to \ infty } d _ { P = P }(s _ { I },s_{j}) \rightarrow \infty\) 。但是在*极限*的这个结果对我们看到的现代大数据的维度有影响吗?模拟显示确实如此。
模拟数据集 100 个样本(行)和 2 个协变量 \(X,Y\) (列)由单位正方形上的均匀分布生成,如下图所示。
```py
### This code generates 100 uniformly distributed data
### points over the unit cube used throughout this report
###
set.seed(864729)
simData = cbind(X = runif(100), Y = runif(100))
p1 <- ggplot(as.data.frame(simData), aes(x = X, y = Y)) +
geom_point() + geom_vline(xintercept = .5) +
geom_hline(yintercept = 0.5) +
ggtitle('100 Uniform Points on the Unit Square') +
xlab("X") + ylab("Y") +
theme_bw()
p1
```
![download-3](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7f5bbe70380c02bcaa038be4e4b821d1.png)
这些点之间的平均成对距离是 \(0.53\) 。要查看添加维度对 pints 对之间的平均距离的影响,运行以下代码。该图显示,随着维数的增加,平均值稳步增加,表明这些点使得统计分析变得困难。
```py
### This code adds U(0,1) random variable additional dimensions to
### the simulated data and measures the average pairwise distance
###
simData.average.dist = c('Noise' = 0, 'Iter' = 1, 'Distance' = 0.53)
noise = c(8, 98, 998, 9998, 99998)
for(iter in 1:10) {
for(addedNoise in noise) {
simData.noise = cbind(simData,
matrix(runif(dim(simData)[1]*addedNoise),
nrow=dim(simData)[1]))
simData.dist = dist(simData.noise)
simData.average.dist = rbind(simData.average.dist,
c('Noise' = addedNoise,
'Iter' = iter,
'Distance' = mean(dist(simData.noise))))
}
}
simData.dist.agg = aggregate(simData.average.dist[,3],
by = list('Dimensions' = simData.average.dist[,1]),
mean)
simData.dist.agg$Dimensions = simData.dist.agg$Dimensions + 2
p2 <- ggplot(simData.dist.agg,
aes(x = Dimensions, y = x)) +
geom_point() + geom_line() +
ggtitle('Increase in Distance Between Points') +
xlab("log(Dimensions)") + ylab("Average Distance") +
scale_x_log10(breaks =
trans_breaks("log10",
function(x) 10^x),
labels = trans_format("log10",
math_format(10^.x))) +
theme_bw()
p2 + annotation_logticks(sides = 'b')
```
![download-7](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/715f795e714fdb474c75b40cf658e212.png)
**对分析的影响:**分析师经常聚类 \( P > > N \) 数据。然而,稀疏性掩盖了[聚类](https://www.dominodatalab.com/blog/topology-and-density-based-clustering),并且存在于低维中的数据聚类在高维中消失。从 \(N(-10,1)\中模拟 10 个随机样本,从 \(N(10,1)\) 分布中模拟 10 个随机样本。该图显示了这些数据和原始数据的三个聚类分析(两组样本 \(1-10\) 和样本 \(11-20\) 的清晰分离),添加了 9 个额外的噪声变量(增加的*高度*发生了一些区分损失),添加了 99 个额外的噪声变量(完全损失了聚类)。
当 \(P > > N\) 是一个虚假的树状图,其聚类是样本的随机分组时的聚类结果。
```py
### this code generates 2 groups of samples from N(-10,1) and N(10,1)
### and runs cluster analysis with and without added noise
###
par(mfrow=c(2,2))
simDataNorm = c(rnorm(10, -10, 1), rnorm(10, 10, 1))
plot(density(simDataNorm), xlab = 'X', main = 'Two Normal Distributions')
grid()
plot(hclust(dist(simDataNorm)), main = 'No Noise', xlab='')
plot(hclust(dist(cbind(simDataNorm,
matrix(runif(20*9, -10, 10), ncol=9)))),
main = '9 Noise Variables', xlab='')
plot(hclust(dist(cbind(simDataNorm,
matrix(runif(20*99, -10, 10), ncol=99)))),
main = '99 Noise Variables', xlab='')
```
![download](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/921e9c4967940e2955198cabda5ebcb1.png)
## 性质 2:点在高维度中远离中心移动。这意味着数据正在远离中心,向空间的外部边缘移动。
高维空间中的点位于分布的外部边缘或外壳上。考虑独立的 \(X_i \sim U(0,10)\) 随机变量或维数 \(P\) 被添加到数据中, \(Pr( d(min(x_1,x_2,\ldots,0)\ le \ epsilon)\ right arrow 1 \)和 \(Pr( d(max(x_1,x_2,\ldots),1)\ le \ epsilon)\ right arrow 1 \)。换句话说,随着更多维度的增加,至少有一个 get 在 0 的\(\ε\)内,至少有一个 get 在 1 的\(\ε\)内。
该表显示了随着维度的增加,1)低于 0.001,2)高于 0.999,以及 3)低于 0.001 **或**高于 0.999 的概率。正如所料,落在边界上的概率随着维度的增加而增加 \(P\) 。
第二个结果是观察到的数据中心离真正的中心越来越远。对于多元的 \(U(0,1)\) 分布,每个维度的*期望*中心位于 \(0.5\) 。在下面的模拟中,估计了*观察到的*中心(即平均值),并计算了其到*预期*中心的距离。随着维度的增加, \(O-E\) 增加,表明估计的平均值离真实平均值更远。
**对分析的影响:**需要精确的参数估计来拟合分布、执行假设检验、确定实验的功效和样本大小、计算置信区间以及许多其他统计计算。因为 \(O-E\) 随着维度的增加,精确拟合分布、执行假设检验等的能力也增加了。会恶化导致错误的结论。
```py
### This code calculates the probabilities of being with 0.001 units away from
### the data distribution boundaries, and calculates the difference between the
### observed and expected mean parameter for different dimensions
###
boundaryProb = function(data) {
x = t(apply(data, 1, function(a) {c(min(a) <= 0.001, max(a) >= 0.999)}))
y = cbind(x, apply(x, 1, max))
apply(y, 2, mean)
}
nnoise = c(seq(2, 32, by = 4), 100, 1000) - 2
noise = c(0, 8, 98, 998, 9998, 99998)
boundaryProb.results = NULL
for(iter in 1:10) {
for(addedNoise in noise) {
simData.noise = cbind(simData,
matrix(runif(dim(simData)[1]*addedNoise),
nrow=dim(simData)[1]))
simData.mean = apply(simData.noise, 2, mean)
simData.dist.ctr = sqrt(sum((simData.mean -
rep(0.5, length(simData.mean)))^2))
boundaryProb.results = rbind(boundaryProb.results,
c(2+addedNoise,
boundaryProb(simData.noise),
simData.dist.ctr))
}
}
colnames(boundaryProb.results) = c('Dimensions', 'Pr(Min. <= 0.001)',
'Pr(Max. >= 0.999)', 'Pr(Either)',
'O - E Dist.')
boundaryProb.results = as.data.frame(boundaryProb.results)
round(aggregate(boundaryProb.results[,2:5],
by=list('Dimensions' = boundaryProb.results$Dimensions), 'mean'),
3)
```
```py
## Dimensions Pr(Min. <= 0.001) Pr(Max. >= 0.999) Pr(Either) O - E Dist.
## 1 2e+00 0.000 0.000 0.000 0.040
## 2 1e+01 0.007 0.008 0.015 0.091
## 3 1e+02 0.091 0.094 0.177 0.290
## 4 1e+03 0.625 0.647 0.868 0.915
## 5 1e+04 0.999 1.000 1.000 2.893
## 6 1e+05 1.000 1.000 1.000 9.134
```
### 性质 3:所有点对之间的距离变得相同。这意味着最近的两点*与最远的两点*的距离相同!
这是 \(P > > N\) 数据最令人费解的结果。几何上,2 维中的 3 个点 \((i,j,k)\) 当它们是等边三角形的顶点时是等距的。添加一个 \(4^{th}\) 点, \((i,j,k,l)\) ,当这些点是三维正四面体的顶点时,等距出现。超过 4 个点,我的直觉就失效了,我只能凭经验思考这个问题,以证明高维空间中所有点的等距性
所有成对距离都在最小和最大(范围)成对距离之间。如果最大值和最小值之间的差变得小于所有成对距离变得更加相似,那么对于所有成对距离 \((i,j)\, \(d(s_i,s _ j)\约 d _ { max } \约 d_{min}\) ,以及 as\(d _ { max }-d _ { min } \右箭头 0\) ,那么对于 \((i,j)\) ,\换句话说,所有成对的距离变得相等。下图显示了在模拟中\(d _ { max }-d _ { min } \ right arrow 0 \)随着维数的增加,因此必然 \(d(s_i,s _ j)\ right arrow d _ { max } \ right arrow d _ { min } \)。
```py
### This codes added U(0,1) random variable dimensions to the sample data
### and calculates the scaled difference between the max and min.
###
noise = c(2, 10, 100, 1000, 10000, 100000) - 2
simData.average.dist = NULL
for(iter in 1:10) {
for(addedNoise in noise) {
simData.noise = cbind(simData,
matrix(runif(dim(simData)[1]*addedNoise),
nrow=dim(simData)[1]))
simData.dist = dist(simData.noise)
simData.average.dist = rbind(simData.average.dist,
c('Noise' = addedNoise, 'Iter' = iter, summary(simData.dist)))
}
}
simData.average.agg = aggregate(simData.average.dist[,3:8],
by=list('Noise' = simData.average.dist[,1]), mean)
simData.pairwise.dists = data.frame('Dimensions' = simData.average.agg[,1]+2,
'Dist' = (simData.average.agg[,7] -
simData.average.agg[,2]) /
simData.average.agg[,7])
p3 <- ggplot(simData.pairwise.dists,
aes(x = Dimensions, y = Dist)) +
geom_point() + geom_line() +
ggtitle('Decrease in Scaled Distance Between Minimum and Maximum') +
xlab("log(Dimensions)") + ylab("Average Distance") +
scale_x_log10(breaks=trans_breaks("log10",
function(x) 10^x),
labels = trans_format("log10",
math_format(10^.x))) +
theme_bw()
p3 + annotation_logticks(sides = 'b')
```
![download-1](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7182cdc4792218e8e7d3bfffb0137408.png)
**对分析的影响:**最近邻算法根据最近点的大部分类别对点进行分类。在该模拟中,模拟了 100 个 \(N(-5,1)\) 和 100 个 \(N(5,1)\) 数据,并且添加了 \(U(-5,5)\) 噪声维度。1 个维度(原始 2 组数据)和 10 个维度的误差为 0,但随着维度的增加而增加。在 100,000 维的情况下——不是不合理的维数 \(P\) 对于\(P>>【N \)数据——最近邻在 50%的情况下是错误的。
```py
### This codes measures misclassification (error) rate in k = 5 nearest
### neighbor analysis with 100 samples from N(-5, 1) and 100 from N(5, 1)
###
simDataNorm = as.matrix(c(rnorm(100, -5, 1), rnorm(100, 5, 1)))
simDataNorm.train = simDataNorm
simDataNorm.nn = kNN(simDataNorm.train, k=5)
a = apply(simDataNorm.nn$id[1:100,], 1,
function(a) ifelse(sum(a<101) > 2, 1, 0))
b = apply(simDataNorm.nn$id[101:200,], 1,
function(a) ifelse(sum(a>100) > 2, 1, 0))
simDataNorm.results = c('Dimension' = 0, 'Iter' = 1,
'Error' = 100 - (100*(sum(c(a,b)) / 200)))
for(noise in c(9, 99, 999, 9999, 99999)) {
for(i in 1:10) {
simDataNorm.train = as.matrix(cbind(simDataNorm,
matrix(runif(noise*200, -5, 5), ncol=noise)))
simDataNorm.nn = kNN(simDataNorm.train, k=5)
a = apply(simDataNorm.nn$id[1:100,], 1,
function(a) ifelse(sum(a<101) > 2, 1, 0))
b = apply(simDataNorm.nn$id[101:200,], 1,
function(a) ifelse(sum(a>100) > 2, 1, 0))
simDataNorm.results = rbind(simDataNorm.results,
c('Dimension' = noise,
'Iter' = i,
'Error' = 100 - (100*(sum(c(a,b)) / 200))))
}
}
simDataNorm.agg = aggregate(simDataNorm.results[,3],
by=list('Dimensions' = simDataNorm.results[,1]),
mean)
simDataNorm.agg$Dimensions = simDataNorm.agg$Dimensions + 1
p4 <- ggplot(simDataNorm.agg,
aes(x = Dimensions, y = x)) +
geom_point() + geom_line() +
ggtitle('Increase in Error with Higher Dimensions') +
xlab("log(Dimensions)") + ylab("Error") +
scale_x_log10(breaks = trans_breaks("log10",
function(x) 10^x),
labels = trans_format("log10",
math_format(10^.x))) +
theme_bw()
p4 + annotation_logticks(sides = 'b')
```
![download-2](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9335586d1375c0776d2b3e7361674a46.png)
## 特性 4:任何预测模型的准确率都接近 100%。这意味着总是可以找到以高精度预测群体特征的模型。
在 \(P > \(P\) 维中的*超平面*是通过将空间分成两边的空间的 \(P-1\) 边界。这些用于根据点落在超平面的哪一侧来将点分类成组。
**对分析的影响:中的**\(P>>【N \)数据超平面可以用来对样本的任何特征进行分类,即使所有的变量都是噪声。该模拟拟合分类树以预测具有不同维度的多元 \(X \sim U(0,1)\) 超立方体的偶数和奇数行 \((Y)\) 。应该没有模型可以用随机数据准确预测偶数行和奇数行。
但是,该图显示,准确预测偶数行和奇数行的能力随着维度的增加而增加。因此,任何适合高维数据的预测模型都可能是纯随机数据的结果。虽然这些模型可以用测试数据来验证,但有两件事应该记住。首先,分离数据方法(其中一些数据被保留用于测试)仍然有许多共同的超平面,因此测试数据准确性可能仍然非常高。 \(P > > N\) 数据中的样本有限,这就很难做到。其次,后续实验的验证费用昂贵,而且会减缓产品开发。确认研究可能会显示模型是错误的,但最好不要一开始就进行这些研究。
```py
### this code runs recursive partitioning on purely random U(0,1)
### data and calculates how many correctly classified as coming
### from an even or odd row in the data
###
y = rep(c(1,2), 50)
simData.rpart.predict = NULL
for(noise in c(1, 10, 100, 1000, 10000)) {
for(i in 1:50) {
simData.y = as.data.frame(cbind(y, matrix(runif(noise*100), ncol=noise)))
simData.rpart = rpart(as.factor(y) ~ ., data = simData.y)
simData.rpart.class = table(y, predict(simData.rpart, type='class'))
simData.rpart.predict = rbind(simData.rpart.predict,
c('Dimension' = noise, 'Iter' = i,
'Error' = (100 - sum(diag(simData.rpart.class)))))
}
}
simData.rpart.agg = aggregate(simData.rpart.predict[,3],
by=list('Dimensions' = simData.rpart.predict[,1]),
mean)
p5 <- ggplot(simData.rpart.agg,
aes(x = Dimensions, y = x)) +
geom_point() + geom_line() +
ggtitle('Reduction in Error with Higher Dimensions') +
xlab("log(Dimensions)") + ylab("Error") +
scale_x_log10(breaks=trans_breaks("log10",
function(x) 10^x),
labels = trans_format("log10",
math_format(10^.x))) +
theme_bw()
p5 + annotation_logticks(sides = 'b')
```
![download-4](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8481abbfee7be0d98876f4be1b7527df.png)
## 摘要
在这篇博客中,描述了 \(P > > N\) 数据的 4 个属性,并使用模拟来显示它们对数据分析的影响:随着点彼此远离,聚类被破坏,树状图给出不正确的结果;随着点远离中心,估计平均向量不太准确;随着所有点对之间的距离收敛到相同的值,最近邻分析变得不太准确;随着超平面的出现,预测噪音以预测随机结果的能力变得非常准确。
最令人不安的是,分析会产生结果,但由于*维数灾难*,不可能知道它们是有效的还是完全虚假的。在我们的下一篇博客中,[分析大 P 小 N 数据-微生物组的例子](https://www.dominodatalab.com/blog/analyzing-large-p-small-n-data-examples-from-microbiome)我们将讨论我们在分析 \(P > > N\) 数据时使用的方法。
#### 关于生物排名
BioRankings 利用我们创新的统计分析师和研究人员的才能,使最具挑战性的数据分析问题变得清晰。虽然有时这是通过应用现成的工具来完成的,但这通常需要融合紧密的**协作**、**统计研究**和**知识转移**来交付定制的解决方案和定制的**统计软件**。
我们的团队专注于**协作**并与客户合作,以深入了解需要解决的数据问题以及它们将如何影响该领域。我们的客户包括财富 20 强公司、小型生物技术公司、大学和政府实验室。
**统计研究**确定当前使用的方法,当这些方法不适用时,开发基于高等数学和概率的新方法。通过与顶级医学院和学术实验室的合作,BioRankings 研究人员撰写了超过 180 篇出版物,并获得了 SBIR 国立卫生研究院(小型企业创新研究)超过 300 万美元的资助。
我们强调教育,通过有计划的、有目的的**知识传授**,让我们的客户能够进行未来的分析。研究人员建立了理解最适合其数据类型的分析方法的基础,分析人员在新领域的工作得到了支持。
最后,我们的分析师在客户端管道和 Domino 环境中部署开发的定制 [**统计计算软件**](/solutions/life-sciences-sce) 。
验证、再现性和清晰度是生物排名研究人员带给我们的交互和软件的价值。自 2014 年以来,BioRankings 一直在为医药、农业和商业领域的客户提供定制解决方案。
[![Whitepaper Why a Successful Digital Transformation Demands a Flexible SCE This paper summarizes key learnings and best practices around modern statistical compute and data science Download the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6b2fd8a2ac01f51680467fe320742133.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/2fb84ca0-cce4-4d2c-b8b6-a2ccc3343d26)
# 道德数据科学家:三位领导者分享他们对数据责任的愿景
> 原文:<https://www.dominodatalab.com/blog/the-ethical-data-scientist-three-leaders-share-their-vision-for-data-responsibility>
By Domino Data Lab on December 12, 2018 in
近年来,备受瞩目的数据丑闻层出不穷——从剑桥分析公司访问脸书的用户信息以影响选民意见,到 Equifax 暴露 1.48 亿美国人的个人信息。消费者现在比以往任何时候都更关心公司如何收集、存储和使用他们的数据。这也意味着,数据科学家正在思考,在这个仍有点像西部蛮荒的领域里,作为道德数据管理者意味着什么。
在 Domino 年度数据科学领袖峰会上,三位专家分享了他们对数据责任的愿景。
**定义数据责任**
社交服务提供商数据平台 BrightHive 的首席运营官娜塔莉·埃文斯·哈里斯(Natalie Evans Harris)表示,数据责任包括三个部分:
1. 合规性:遵守法律和法规,例如有关隐私的规定和欧盟的一般数据保护规定。“通常,合规部门被视为天花板,实际上它应该被视为地板,”她表示。
2. 文化:建立一个组织,在产品的整个生命周期,包括数据收集、分析、部署和报废,鼓励关于道德的对话。“我们如何建立能力,不仅思考预期的解决方案,还思考那些意想不到的后果?不仅仅是我们能用数据做什么,而是我们应该用数据做什么?”她问道。
3. 社会责任:提高透明度,以建立信任的方式与客户和公众沟通。
**为什么数据道德很重要**
除了道德的内在价值,公司和非营利组织也在响应其他驱动因素,向数据责任迈进。哈里斯说,对许多人来说,动机是遵守法律,避免惩罚或丑闻,而对其他人来说,这是对更多客户询问他们的数据如何被使用的回应。
其他人将数据责任视为从竞争中脱颖而出的一种方式。国家奥杜邦协会保护科学主任查德·威尔西说,该组织数量影响的透明度是增加资金和公众支持的一种方式。
对于贝莱德(BlackRock)系统主动股票副总裁玛吉特兹韦默(Margit Zwemer)来说,这归结为风险:“如果你不保护你的数据,你就有被黑客攻击或数据泄露的风险。”
**团队如何能够并且应该更负责任**
在行业范围的转变形成之前,培养数据责任取决于个人、团队和组织。但是不存在路线图,并且弄清楚如何做到这一点可能是具有挑战性和昂贵的。“要求每一位数据科学家都成为哲学家和信息安全专家,会给那些不一定需要在该领域表现出领导力的人带来很大负担……因为那些文化还没有到位,”兹韦默说。
为了弥补这一差距,哈里斯创立了社区驱动的道德数据共享原则,这是一项涉及 800 多名数据科学家的众包道德规范的努力。该准则体现了知情同意、安全、透明和防止不公平偏见等原则。“这些原则没有什么突破性的,但它们已经成为人们创造自己的个人精神和方法来建造产品的发射台,”她说。
**使数据责任坚持**
可选的道德准则不能替代真正的行业标准。如何才能让公司真正全体遵循道德数据实践?Harris 预计,类似 GDPR 的法规将会扩展,大学将会越来越多地将伦理讨论纳入数据科学课程。但她认为,作为一家有道德的公司,这种声望会更加有效。她说:“我们将到达这样一个地方,在使用人们信息的方式上,负责任和合乎道德将会变得很酷。”
兹韦默认为,科技公司最终将面临围绕数据责任的培训和可报告性要求,类似于金融等行业的监管义务。但她表示,只有影响到底线,企业才会认真对待数据伦理,客户或股东会惩罚不遵守规定的玩家。鉴于技术创新的快速发展,她预测在此之前会出现许多失误。“我们在解决新问题的同时,也在制造新问题,”她说。“跌倒了再爬起来需要很多时间。”
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Fthe-ethical-data-scientist-three-leaders-share-their-vision-for-data-responsibility%2F&title=The%20Ethical%20Data%20Scientist%3A%20Three%20Leaders%20Share%20Their%20Vision%20for%20Data%20Responsibility)
# AI - Plus 3 特征的进化需要在下一次大灭绝中生存
> 原文:<https://www.dominodatalab.com/blog/the-evolution-of-ai-plus-3-traits-needed-to-survive-the-next-mass-extinction>
技术的进化,很像我们星球上生命的进化,其特点是稳步前进,偶尔夹杂着大规模灭绝和创新生命的爆发。我们很幸运地经历了一个进化的转折点。数据科学和人工智能领域的创新比比皆是,已经在改变商业和生活的本质。随着技术的繁荣,那些没有获得新时代生存特征的组织将面临真正的风险。
许多高管和分析专家对这一过程将把我们带向何方缺乏远见。他们对我们生活的这个时代的定义,我们称之为 MLOps 时代,是有局限性的。这导致他们固守技术并采用限制他们在新市场竞争能力的流程(进化意义上的特征)。企业人工智能的下一个进化时代会是怎样的?最先到达的人会发现自己处于食物链的顶端。在本帖中,我们提供了 MLOps 的定义,并讨论了顶级分析企业是如何超越我们当前的时代而发展的。我们洞察了下一个时代将会是什么样子,更重要的是,什么样的组织将会生存和发展。
## MLOps 时代
随着 2021 年的开始,数据科学、人工智能和人工智能行业目前正处于 MLOps 时代的早期。这是一个建立在过去创新基础上的激动人心的进步。它寻求解决将更多数据科学产品投入生产的最后一英里问题——将 ML 和 AI 投入运营。它承诺模块化和可重用的组件来满足这一目的。它采用了 DevOps 和软件工程(如 CI/CD 方法)的原理,并经过修改以适应数据科学工作的需要。它强调干净的数据管道来支持操作化过程。重要的是,MLOps 时代的每个方面都在经历向云工作负载的过渡。注意这个时代强调的[数据科学生命周期](https://blog.dominodatalab.com/how-enterprise-mlops-works-throughout-the-data-science-lifecycle)的各个阶段很有帮助。它们是验证、部署和监控阶段。
## 数据科学生命周期
![The Data Science Lifecycle](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a94c6c4eba8015ac3d0d9764dc4a7cc2.png)
这是 MLOps 时代的普遍观点,但我们还处于这个时代的早期,在过渡到下一个大事件之前还有工作要做。特别是,我们将看到学术界和工业界对完善数据科学生命周期的验证和监控方面的关注。
验证工作目前领先于监测工作。学术界发表了大量关于模型的可解释性、伦理和偏见的研究。业界正在将这些想法转化为当今领先组织使用的工具和流程。还有很多工作要做,等我们离开这个时代,模型验证会成熟很多。
谈到模型监控,学术界是后来者。这在一定程度上是因为,至少从学术意义上来说,这是一个已经解决的问题。然而,对于将已知的监控原则应用于生产模型的最佳方式,我们还有许多未解的问题。即使建立了最佳实践,实施也不是微不足道的;为了在 MLOps 意义上有效,它必须完成反馈循环以重新训练或完全重建模型。在模型监控有一个坚实的基础之前,学术界和工业界都有工作要做,但他们将在这个时代结束时到达那里。
## MLOps 时代的当前和未来
### MLOps 时代的当前焦点
* 操作化
* 模块化和可重复使用的组件
* DevOps 和应用于数据科学的软件工程原理
* 数据完整性
* CI/CD(持续集成和持续交付或部署)
* 功能模型验证
* 功能模型监控
* 云工作负载趋势
### MLOps 时代的未来焦点
* 模型验证将扩展到包括可解释性和伦理
* 模型监测将利用统计学原理,并与研究过程相结合,完成反馈循环
## 未知的未来
尽管围绕 MLOps 投入了大量精力和讨论,但 MLOps 仍然是生命周期的“生产”部分。MLOps 要求我们找出复杂的 API,并将服务和技术缝合在一起。MLOps 是关于*如何*的。这个未来的未命名时代将把 MLOps 时代的一些相同原则应用到“R & D”生命周期的一半。那时,我们将进入一个以规模效益为特征的新时代。
正如一位已经在为未来时代做准备的前瞻性数据科学领导者所说,
> “十年前,数据是我们的竞争优势。然后是我们的模特。今天是我们的过程。”
有了 MLOps 时代的工具,下一个时代将是流程时代。这并不意味着技术不会发挥作用。创新将帮助领导者和团队运营数据科学生命周期的剩余部分。我们不是在谈论 auto-ML 或数据科学的简单按钮。这是关于标准化的。实施生命周期的构思、分析和开发阶段意味着提供获取和共享机构分析知识的工具。这意味着提供一种自动跟踪研究并通过点击一个按钮来复制它的方法。它与数据科学组合管理和建立需求层次有很大关系。它将关注数据科学项目管理。它的特点是全面的资产管理,从模型到数据集到图像以及其间的所有东西。它包括跟踪数据产品的商业价值。简而言之,这是关于强调数据科学中的科学-提供结构,以便团队可以像一组合作研究科学家一样运作。
### 未来时代是关于过程的
* 数据科学是真正的企业能力
* 机构知识管理
* 再现性
* 在整个生命周期中优化研究团队的工作流程
* 分析专业人员的协作
* 利用有限的资源和巨大的人才缺口实现商业价值最大化
* 记录系统
* 自上而下的投资组合视图
* 项目管理
## 在下一次大灭绝中幸存下来所需的特征
基于对当前时代结束时 MLOps 将会是什么样子以及下一个时代将会带来什么的愿景,我们看到了组织和公司为了在下一个时代生存和发展而必须发展的三个强大特征。有些已经在开发了。
### 未来时代的特征
1. 生命周期管理
2. 知识管理
3. 证券管理
生命周期管理将是在我们当前的时代,即 MLOps 时代有效适应的组织的最终状态。它利用 MLOps 的原则和工具,作为优化将模型投入生产的过程的手段。它建立了一个组织,将这些原则扩展到整个生命周期中的研究团队。
知识管理依赖于定义良好的数据科学工作记录策略系统。这将通过技术实现,具体来说就是[数据科学平台](https://www.dominodatalab.com/product/domino-data-science-platform/),但也需要领导层在不扼杀创造力的同时实现工作标准化。知识管理系统将成为分析突破的灵感火花。它将对数据科学团队创造的价值产生复合效应。
最后,那些采用有效的项目组合管理策略的人,在工具的支持下,将最终实现他们的需求层次,而不是今天数据科学项目工作的自下而上的方法。所有领导,从团队领导到最高管理层,都将了解数据科学项目和研究。追踪商业价值将成为现实。组织的分析引擎将最终开始全速运转。
## 后续步骤
组织应该拥抱当前的 MLOps 时代,同时为下一个时代奠定基础。拥抱今天的可操作性思维。建造管道。投资合适的人才。同时,开始试验分析研究的标准化。开始思考和测试知识管理原则和工具。了解你的分析组合,它来自哪里,以及如何管理它。阅读如何根据顶级分析领导者的最新研究[构建成功的组织](https://www.dominodatalab.com/resources/organizing-enterprise-data-science/)。现在采取这些步骤将是在未来十年的分析发展中取胜的关键。
[![Recipes from the Global 2000 and Beyond Organizing Enterprise Data Science In our conversations with nearly a dozen industry leaders building model-driven businesses, we found that there’s no one-size-fits-all answer. Get the report](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5c547f7058c82bfb3daeeb10bb8a6e69.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/344e4c7f-b995-4b00-a88f-1e4007a55f08)
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Fthe-evolution-of-ai-plus-3-traits-needed-to-survive-the-next-mass-extinction%2F&title=The%20Evolution%20of%20AI%20--%20Plus%203%20Traits%20Needed%20to%20Survive%20the%20Next%20Mass%20Extinction)
# 数据科学的未来——挖掘 GTC 2021 的趋势
> 原文:<https://www.dominodatalab.com/blog/the-future-of-data-science-mining-gtc-2021-for-trends>
深度学习爱好者越来越多地将[英伟达的 GTC](https://www.nvidia.com/en-us/gtc/) 放在他们必须出席的会议名单的首位。我喜欢从今年的谈话中挖掘预示我们行业发展方向的趋势。其中三个特别引人注目,启发了我对 [*转移学习*](https://www.dominodatalab.com/blog/guide-to-transfer-learning-for-deep-learning) 的新观点,我认为这对分析从业者和领导者理解很重要。让我们从主题开始。
### 期待深度学习 API 变得更加智能
> 摘要:API 在将模型组件从一个应用程序转移到另一个应用程序以及将管道转移到生产环境方面会变得更好。
### 一场深度网络架构竞赛正在进行,这可能会导致深度网络在 10 年后看起来有很大不同
> 下面回顾的两个新颖的深度网络架构的例子都大量借用了变压器和类似 BERT 的模型的概念,这些模型非常适合转移学习,但是,它们这样做的方式可以推广到其他应用,如[计算机视觉](https://www.dominodatalab.com/blog/what-is-computer-vision)。我看到了深度学习的未来,其中迁移学习在很大程度上是王,因为大型模型架构将非常擅长捕捉大量关于语言和视觉等领域的信息。
### 人工智能应用的数量真的开始起飞,保持同步是一个好主意
> 如果我们能够破解让更广泛的劳动力建立人工智能解决方案的难题,我们就可以开始实现数据科学的承诺。数据科学家和数据专家之间的知识转移(双向)至关重要,并可能很快促成公民数据科学的新观点。
在我们开始之前,我想做一个观察,它贯穿了每一个主题。迁移学习不仅仅是分享预先训练好的模型。将训练有素的模型管道转移到生产中至关重要,而在分析和数据专家之间转移知识是实现规模化的先决条件。领导者尤其可以从理解迁移学习的广义定义的每个方面中受益。
## 来自 GTC21 的深度学习趋势
### 深度学习 API 的演变
从业者鼓起勇气。由于您最喜欢的深度学习 API,迁移学习、功能共享和模型部署可能很快会变得更容易。
**演讲摘要** -弗朗索瓦·乔莱- [Keras 和 TensorFlow:未来五年](https://www.nvidia.com/en-us/on-demand/session/gtcspring21-s31925/)
![Keras turns 6 | Deep learning trends from Domino Data Lab ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8bf1c09a338585ce239a3fe5bc3ec43d.png)
谷歌的工程师 Franç ois Chollet 是 Keras 的主要作者和维护者,Keras 是一种流行的深度学习语言,它是 TensorFlow 的高级 API,他认为我们正处于深度学习时代的早期。“深度学习到目前为止只实现了其潜力的一小部分。深度学习的完全实现将是一个数十年的转变。”弗朗索瓦认为深度学习应用变得像今天的 web 开发一样普遍。他接着谈到了 Keras 的现状以及他对其未来的看法。
他认为 Keras 的使命是成为加快迭代速度的 UX——尽可能快地从想法到实验。Keras 针对创意表达进行了优化。Keras 实施的关键设计原则是,“复杂性的渐进揭示”这使得它能够在各种不同的情况下实现良好的生产力,如“一年级研究生和一个 Kaggle 大师”。
未来 5 年,Keras 会是什么样子?为了回答这个问题,Keras 团队正在追踪数据科学的趋势。弗朗索瓦认为四个趋势很重要,并且已经在推动 Keras 路线图。首先是可重复使用部件生态系统的出现。例如,预训练模型和特征重用。其次,他看到了自动化程度更高、工作流程层次更高的趋势。这是在手工调整模型时形成的,但应该是自动化的。第三个趋势是面向高性能计算的更快的专用芯片,是的,这一趋势正在云中发生。最后一个趋势是深度学习应用表面积的增加。弗朗索瓦觉得深度学习只解决了它最终将解决的大约 10% - 15%的问题。
## 弗朗索瓦的趋势和 Keras 路线图
可重用的特定领域功能 → KerasCV、KerasNLP(为计算机视觉和 NLP 管道提供可重用构建模块的导入库)和 Keras 应用程序(更大的预训练模型库)正在积极开发中。
**增加自动化** →超参数调整、架构搜索、特征库&终身学习和 [AutoML](https://www.brighttalk.com/webcast/17563/371418) 是自动化人类 5 年后不会做的事情的关键。下图捕捉到了这一愿景。该算法本身将是白盒,并将与用户进行对话,使搜索过程中的问题更容易解决。这是一个雄心勃勃的目标,不会在一个版本中实现,而是一层一层的实现。这些基础层的一个重要部分是 Keras 调谐器和 AutoKeras。
![Deep learning API architecture | Deep learning trends from Domino Data Lab ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/da5961e37f7b29d355cf4c668c75bccc.png)
Image from the GTC [presentation](https://www.nvidia.com/en-us/on-demand/session/gtcspring21-s31925/)
**规模&云** →未来,在数百个 GPU 上进行训练,就像在管理工作区的 [Jupyter 笔记本上进行训练一样简单](https://www.dominodatalab.com/solutions/jupyter/)。Keras 有一个名为 TensorFlow Cloud 的新 API,但这个 API 是专门针对 GCP 的。
**走进现实世界** →我们将看到更多的移动、浏览器和嵌入式设备采用资源高效型模式,并在设备上进行隐私和安全培训。这在一定程度上是由 Keras 预处理层促成的。应该在模型中进行预处理。我们需要避免在 JavaScript 和训练服务队列中重新创建管道。您的 Keras 模型现在将是“原始数据输入和预测输出”,这使得它们完全可以移植。
## 神经网络架构竞赛
所以你终于掌握了 CNN,rnn,LSTMs 和 Transformers。恭喜,你正式落伍了。玩笑归玩笑,考虑到创新的速度,我们都知道这些令人惊叹的、最近策划的架构只是冰山一角。我回顾了两次深入浅出的谈话。
* * *
**演讲摘要** - Yoshua Bengio,蒙特利尔大学正教授,Mila -魁北克人工智能研究所科学主任- [人类启发的因果推理和非分布概括的归纳偏差](https://www.nvidia.com/en-us/on-demand/session/gtcspring21-s32760/)
* * *
这位图灵奖获得者让我们看到了解决我们所有人都面临的问题的一种有前途的新方法——如何让我们的模型在野外也能很好地推广。他将这项工作描述为,“我设想在未来几年内将深度学习扩展到一个领域的研究方向,在这个领域中,它需要处理鲁棒性和非分布泛化的问题,结合我们对人类状况的观察所启发的因果关系的思想。”
当我们部署一个深度网络时,数据分布不可避免地会与我们在实验室中设计的不同,这意味着我们的模型不能很好地概括。本吉奥博士认为,理解这些变化意味着什么非常重要,他正在寻求一种新的理论和算法来应对这些变化。人类可以在新的环境中重复使用知识进行归纳,因此本吉奥博士转向人类思维寻求灵感,即丹尼尔·卡内曼对人类决策的双系统解释。Kahneman 的想法启发了我们在今天的分析系统中看到的许多东西,因此这一最新应用令人兴奋。
![Kahneman keynote | Deep learning trends from Domino Data Lab ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fac35cde7af415ac5d22900389a47656.png)
> 查看 Kahneman 博士在数据科学大会第 2 版上的主题演讲,了解他对人类思维系统如何影响现代分析的第一手见解。
本吉奥博士在一个深网中模仿卡尼曼的系统 2,它有一个包括先验的新架构。这些先验代表了对世界的假设,允许人类快速概括。他表明,在因果关系的意义上,它们可以被认为是反事实,并且用他的团队几年前引入的注意机制来表示。这些是变形金刚的基础,变形金刚是一些世界顶级语言模型的核心。这些新架构是通过在变化的条件下进行优化,以监督的方式学习的。
![Kahneman's two systems | Deep learning trends from Domino Data Lab ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/bee461fe5c6b8575a28bd034e94b7d3b.png)
Image from [https://manceppo.com/](https://manceppo.com/)
**演讲摘要** - Geoffrey Hinton,多伦多大学名誉教授,谷歌副总裁兼工程研究员,Vector Institute 首席科学顾问,与 Bengio - [博士共同获得图灵奖,如何在神经网络中表示部分-整体层次](https://www.nvidia.com/en-us/on-demand/session/gtcspring21-s33159/)。
* * *
辛顿博士的新视觉系统被称为 GLOM。它从 NLP 转换器、通过协议的视觉表示的无监督学习和生成图像模型中窃取。他认为,用多种不同的方式描述同一个形状(多个参照系)在人类思维中很常见,但在传统的 CNN 中却没有。如果你熟悉辛顿博士在胶囊方面的工作(我最近在博客上发表了关于胶囊的文章),有趣的是,GLOM 正在寻求完成同样的任务,即从概念的角度找到一种分类/理解图像的方法——超越 CNN 的暴力性质。CapsNet 采取的方法是提前创建嵌入类,并查看图像激活了哪一个。GLOM 动态地构建它们,以便图像中的每个位置都知道它正在处理哪个部分/对象。(辛顿说 CapsNet“笨拙”,暗示他已经向前看了。而这,就在我开始掌握这种方法的时候。在数据科学中很难跟上。)就像变形金刚使用句子中的单词通过它们与另一个单词的接近程度来给出另一个单词含义的线索一样,对象感知图像中的部分-整体组件可以给网络提供对图像整体中正在发生的事情的关键洞察力。它也可能有助于模型的可解释性。
![GLOM embeddings | Deep learning trends from Domino Data Lab ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a3520179e481daa454ca96801b4a6fb2.png)
Image from the GTC [presentation](https://www.nvidia.com/en-us/on-demand/session/gtcspring21-s33159/)
GLOM 的训练感觉很像训练 BERT,希望它能产生更好地转移计算机视觉学习的模型。
## 新的人工智能应用的爆发
从欺诈和异常检测到机器人技术,GTC21 上的例子比比皆是。在所有行业中,人工智能在生产中的例子比比皆是。我特别喜欢两次申请讲座。坦白地说,我密切关注了它们,因为它们是由 Dominio 客户提供的,但这些收获是有价值的,并且与供应商无关。
* * *
**演讲摘要** - Andrew Modjeski -洛克希德·马丁质量技术公司人工智能应用负责人- [保持 F-35 飞行-人工智能管道以支持质量 4.0](https://www.nvidia.com/en-us/on-demand/session/gtcspring21-ss33119/)
* * *
最近,我们听到了很多关于公民数据科学家的消息。我们被告知,它们是在整个企业内联合数据科学的关键。这一点对我来说从来都不合适,因为我无法想象企业会把他们的业务押在由缺乏训练的个人使用拖放工具创建的模型上。在他的演讲中,Andrew Modjeski 分享了他和洛克希德·马丁公司对公民数据科学家的看法。他们解释的方式对我来说很有意义,弥补了我头脑中的空白。
![Lockheed's keys to scale | Deep learning trends from Domino Data Lab ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/140cbaa47938b95633c4e5197be8a682.png)
Image from the GTC [presentation](https://www.nvidia.com/en-us/on-demand/session/gtcspring21-ss33119/)
安德鲁解释说:“在洛克希德·马丁公司,公民数据科学家是我们的质量工程师。这是我们的制造工程师或维护工程师。这些人能够接触到数据知识……所以我们的目标是让这些工程师能够开发人工智能解决方案。这样做的主要限制是许多工程师没有计算机科学背景……然而,他们来到洛克希德公司时确实对 Matlab 有相当深入的了解...这就是为什么我们的重点是将 Matlab 放入 Domino 数据实验室…我们需要 Domino 数据实验室高性能计算将这项工作卸载到云上。此外,...我们需要一个简单的共享数据的能力,系统化的存储,项目启动,或者种子项目,一个公民数据科学家可以在此基础上建立一个新的解决方案。因此,举例来说,如果我们创建一个人工智能来检查 F-35 上的紧固件,然后我们转到 C-130 甚至旋翼机,西科斯基直升机,他们想对紧固件进行人工智能检查,他们可以使用我们的 Domino 解决方案作为基线,因为最终他们都是紧固件,一个类似的架构可能适用于两个项目,无需太多更改。这种 Domino 实例化允许我们在洛克希德·马丁公司范围内扩展这些模型,并让公民数据科学家与其他公民数据科学家共享。”
因此,在洛克希德,公民数据科学看起来像是很好的老式转移学习,结合了协作工具,抽象出云中开发运维的复杂性。与专业数据科学家一起构建原型,然后让数据专家参与并实现协作,以便他们获得 Jr .数据科学家的技能。这是我可以信任的公民数据科学方法。
* * *
**演讲摘要**-AES 分析总监 Sean Otto-[AES 如何在两年内从零增加到 50 个部署模型](https://www.dominodatalab.com/resources/how-aes-went-from-zero-to-50-deployed-models/)
* * *
在他的演讲中,Sean Otto 分享了一个故事,这个故事抓住了我在整个行业中看到的情况——人工智能和人工智能应用的爆炸式增长。Sean 解释说:“AES 是全球第五大可再生能源生产商,仅次于中国。我们生产的 70%以上是可再生能源。”AES 的应用非常多样化,这表明 AI & ML 正在模型驱动的公司中获得跨组织的牵引力。
![AES use cases | Deep learning trends from Domino Data Lab ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/929a3f031d376c6af0fa951e5077ca10.png)
Image from the GTC [presentation](https://www.dominodatalab.com/resources/how-aes-went-from-zero-to-50-deployed-models/)
为了强调这一点,我们来看看 AES 的各种应用。
### 发电中的预测性维护
AES 在一个每天更新的仪表板 GUI 中显示了其风电场的健康可靠性指数。可靠性工程师用它来知道从哪里开始更有效。当你有 75 个涡轮机要处理时,一个指针真的很有用。除了风力发电厂,AES 还有 200 多家太阳能发电厂。有些在雪域。一种称为“雪检测模型”的模型用于确定能量输出变化是否可能是由于面板上的雪造成的。
### 水力发电优化
AES 使用 AI & ML 来回答围绕电力生产的关键业务问题。预计流入会带来什么,与类似工厂相比如何?我们如何有效地实时调度和提前一天计划?
### 电网基础设施威胁
当你有 100 万个智能电表时,你必须每天更换一些,就像你在大型数据中心更换硬件一样。断电预测成为必备工具。恢复服务的时间也是用 AI & ML 评估的一个重要指标。
### 物流
AES 利用优化和预测模型。他们部署了一个随机模型来确定全年燃料应该何时到达,以及这将如何影响预测的供应和需求。
## 摘要
分析领导者应该意识到模型生产的步伐正在加快。他们可以观看这里提到的关于这是如何发生的棒球内幕的两个演讲。他们还可以访问 [Domino 客户故事](https://www.dominodatalab.com/customers/)页面,寻找更多灵感和竞争焦虑的来源。领导者的一个重要收获是,实现员工和组织之间的知识转移是扩展数据科学计划的关键。对于 Jr 数据科学家来说,公民数据科学应该看起来更像是提升数据专家的技能,而不是给他们黑盒、拖放式的人工智能工具。
Keras 和其他深度学习 API 正朝着模型和管道组件的自动化和抽象方向发展,这将使迁移学习和模型部署在未来变得更加容易。这也将促进[构建人工智能解决方案的人类之间的协作和知识共享](https://www.dominodatalab.com/product/knowledge-center/)。
每个人都应该,而且可能已经痛苦地意识到,在数据科学中,除了变化,没有什么是不变的。在过去 5 年中创建/修改的新的深网架构已经打开了一个解决方案的新世界。所有迹象表明,建筑创作的趋势将继续。这里回顾的两个有趣的演讲指向了一个未来的世界,在这个世界里,大而广的模型捕捉到了关于我们试图解决的问题的大量信息。这意味着将有大量的迁移学习和深度网络最后几层的训练,这些预先训练的巨型模型是引擎盖下的引擎。
所有这三个主题都有一条贯穿其中的迁移学习的线索,这让我怀疑获取和分享知识将是个人、团队和企业在这十年中成功分析的关键。
# 笔记本中结构、编码风格和重构的重要性
> 原文:<https://www.dominodatalab.com/blog/the-importance-of-structure-coding-style-and-refactoring-in-notebooks>
笔记本在数据科学家的工具箱中变得越来越重要。尽管相对较新,但它们的历史可以追溯到 Mathematica 和 MATLAB 等系统。引入这种形式的交互式工作流是为了帮助数据科学家记录他们的工作,促进再现性,并促进与其团队成员的协作。最近有大量新人涌入,数据科学家现在有大量的实现可供选择,如 Juptyer、Zeppelin、R Markdown、Spark Notebook 和 Polynote。
对于数据科学家来说,将构建笔记本实例作为探索性数据分析的第一步已经成为他们的第二天性。访问云计算非常简单,笔记本提供的混合代码、输出和绘图的能力是无与伦比的。在团队层面,笔记本电脑可以显著增强知识共享、可追溯性,并加快发现新见解的速度。为了充分利用笔记本,它们必须具有良好的结构,并遵循良好的文档和编码惯例。
在本文中,我将讨论在您的笔记本中实现的最佳实践,包括笔记本结构、编码风格、抽象和重构。本文最后给出了一个实现这些最佳实践的笔记本示例。
## 笔记本结构
与非结构化代码非常相似,组织不良的笔记本可能难以阅读,并违背您使用笔记本的预期目的,创建自文档化的可读代码。markdown、简洁的代码注释和使用章节导航等元素有助于为笔记本带来结构,从而增强其知识共享和可复制性的潜力。
退一步想想什么是好的笔记本,我们可以从科学论文中寻找指导。一篇优秀科学论文的标志是清晰、简单、中立、准确、客观,最重要的是逻辑结构。在开始之前为你的笔记本建立一个计划是一个好主意。打开一个空的笔记本,立即输入你的第一个导入,即“`import numpy as np`”并不是最好的方法。
这里有几个简单的步骤,可以鼓励你在你的思想被多维数组吸收之前考虑全局:
* 确立你的笔记本的目的。想想你的目标受众和你试图解决的具体问题。你的读者需要从中学习什么?
* 如果没有一个明确的目标,可以考虑将工作拆分到多个笔记本中,创建一个主 markdown 文档来解释整个概念,并提供相关笔记本的链接。
* 使用分区帮助构建笔记本的正确顺序。考虑一下组织工作的最佳方式。例如,按时间顺序,在模型训练和评估之前,从探索和数据准备开始。或者,比较/对比部分涉及时间、空间或样本复杂性,用于比较两种不同的算法。
* 就像学术研究论文一样,不要忘记包括标题、序言、目录、结论和你在编写代码时使用的任何参考资料。
使用 markdown 和 HTML,在你的笔记本上添加一个目录很简单。这是一个目录的基本示例。
![Table of contents in a jupyter notebook](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8768814aa9b8126a6cedf2e0b94dfe4d.png)
下面的渲染单元给了笔记本更多的结构和更精美的外观。它使文档更容易浏览,也有助于让读者一目了然地了解笔记本的结构。
![Notebook sections rendered in HTML](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c0de5a34c65f6fa98a7f9410027f40b9.png)
要想进一步了解笔记本良好结构的例子,请前往 [Kaggle](http://www.kaggle.com) ,随机选择一个挑战,然后看看用户投票选出的前五名笔记本。这些笔记本的结构将允许您看到预期的目的和代码流,而不需要运行代码来理解它。如果你将排名前五的笔记本与排名后百分之十的笔记本进行比较,你会发现结构对于创造一个易于阅读的笔记本是多么重要。
## 代码风格
“代码被阅读的次数比它被编写的次数多得多”这句话经常被认为是 Python 的创始人吉多·范·罗苏姆的名言。
当你在团队中合作时,坚持一致的风格是至关重要的。通过遵循适当的编码约定,您可以创建更容易阅读的代码,从而使您的同事在任何代码评审中更容易合作和提供帮助。使用一致的模式来命名变量和调用函数也可以帮助您找到不明显的错误。例如,在变量名中使用小写的 L 和大写的 I 是一种不好的做法。
这一节是在考虑 Python 的情况下编写的,但是概述的原则也适用于其他编码语言,比如 R. I 如果您对 R 的有用的约定指南感兴趣,请查看 [R Style。保罗·e·约翰逊的《T4》研究评论。关于什么是好代码和坏代码的全面讨论超出了本文的范围。其目的是强调一些经常被忽视的基础知识,并强调常见的罪犯。](https://cran.r-project.org/web/packages/rockchalk/vignettes/Rstyle.pdf)
鼓励读者熟悉 [Python 增强提案 8](https://www.python.org/dev/peps/pep-0008/) (PEP-8),因为它在本节中被引用,并提供了关于如何编写良好清晰代码的约定。
代码中的常量、函数、变量和其他构造应该有有意义的名字,并且应该遵守命名约定(见表 1)。
给事物命名可能很困难。我们经常倾向于使用占位符变量名,如“I”或“x ”,但是考虑到你的代码被阅读的次数将远远超过它被编写的次数,你就会明白正确名称的重要性。我在用像 Python 这样的动态类型语言编码时养成的一些好习惯包括
* 给变量类型加前缀,比如布尔,使它们更容易阅读,比如“是”或者“有”——(`is_enabled`、 `has_value` 等等。)
* 数组使用复数。例如,`book_names`对`book_name`
* 描述数字变量。根据变量的用途,考虑`avg_age`或`min_age`,而不仅仅是`age`。
![PEP-8 Naming Conventions](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/07ae58e0c81c8502bb04a3595f2c31fc.png)
即使你不多做一点,不严格遵循 PEP-8,你也应该努力采纳它的大部分建议。保持一致也很重要。如果你使用单引号或双引号,大多数人不会有问题,如果你坚持使用它们,你也可以混合使用它们(例如字符串用双引号,正则表达式用单引号)。但是如果您不得不阅读任意混合它们的代码,它会很快变得令人讨厌,并且您会经常发现自己在进行中修改引号,而不是关注手头的问题。
一些最好避免的事情:
* 带有大写字母和下划线的名称(如`This_Is_Very_Ugly`)
* 非 ASCII 字符和一般的非英语标识符。例如:
```py
def 곱셈(일,이):
return 일*이
```
* 缩写(例如`BfrWrtLmt`)
当谈到缩进标签时,应该避免——推荐的方法是每个缩进层次 4 个空格。PEP-8 指南还谈到了对齐延续行的首选方式。一个常见的违规是参数不一致。例如:
```py
foo = long_function_name(var_one, var_two
var_three, var_four)
```
而不是下面整齐得多的垂直排列。
```py
foo = long_function_name(var_one, var_two
var_three, var_four)
```
这类似于换行符,我们应该总是在二元操作符之前换行。
```py
# No: Operators sit far away from their operands
income = (gross_wages + taxable_interest + (dividends - qualified_dividends))
# Yes: Easy to match operators with operands
income = (gross_wages + taxable_interest + (dividends - qualified_dividends))
```
从逻辑上讲,谈论换行符会让我们想到一个常见的错误,即空行。说实话,对于过度使用空行,我也有过于宽大的愧疚。好的风格要求它们应该如下使用:
* 用两行空行包围顶级函数和类定义
* 类中的方法定义由一个空行包围
* 在函数中使用空行(少用)来表示逻辑部分
三者最后一条的关键点是“节制”。在代码中每隔一行留出一两个空格,除了让你不必要地上下滚动之外,不会给表格带来任何好处。
最后但同样重要的是,我们需要说几句关于进口的话。只有三条重要的规则需要注意:
* 每个导入应该在一个单独的行上(`import sys,os`是不允许的)
* 分组顺序应该是标准库、第三方导入,最后是本地应用程序
* 避免通配符导入(例如`from numpy import *`),因为它们会使命名空间中出现的名字变得不清楚,并且经常会混淆自动化工具
这可能让人觉得有很多东西要理解,毕竟,我们是数据科学家,而不是软件工程师;但是,就像任何试图回到他们几年前的工作中,或者从另一个数据科学家那里捡起剩余项目的碎片的数据科学家一样,实现良好的结构并考虑到其他人可能会阅读您的代码是非常重要的。能够分享您的工作有助于知识转移和协作,从而在数据科学实践中取得更多成功。有一个共享的风格指南和代码约定可以促进有效的团队合作,并帮助初级科学家理解成功是什么样子的。
虽然在 Jupyter 中,使用代码风格检查器(通常称为“代码棉条”)的选择有限,但是某些扩展可能会有所帮助。一个有用的扩展是 [pycodestyle](https://pypi.org/project/pycodestyle/) 。它的安装和使用非常简单。在安装和加载扩展之后,你可以放一个`%%pycodestyle` magic 命令,pycodestyle 列出它可以检测到的任何违反 PEP-8 的情况。
![Pycodestyle in notebook](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/abb9cb82c79e1fcb83383043abecdd2a.png)
注意,您还可以从 JupyterLab 的终端运行 pycodestyle 并分析 Python 脚本,因此扩展不仅限于笔记本。它还有一些简洁的特性,向您显示代码中检测到违规的确切位置,此外,它还可以计算不同违规类型的统计数据。
## 抽象的使用和重构过程
抽象,或者说只暴露基本信息而隐藏复杂性的思想,是一个基本的编程原则,我们没有理由不将它应用于数据科学特定的代码。
让我们看看下面的代码片段:
```py
completeDF = dataDF[dataDF["poutcome"]!="unknown"]
completeDF = completeDF[completeDF["job"]!="unknown"]
completeDF = completeDF[completeDF["education"]!="unknown"]
completeDF = completeDF[completeDF["contact"]!="unknown"]
```
上面代码的目的是删除 DataFrame `dataDF`的任何列中包含值“unknown”的任何行,并创建一个名为`completeDF`的新 DataFrame,其中只包含完整的案例。
这可以很容易地用一个与`dataDF`结合使用的抽象函数`get_complete_cases(`重写。我们也可以更改结果变量的名称,以符合 PEP-8 风格指南。
```py
def get_complete_cases(df):
return df[~df.eq("unknown").any(1)]
complete_df = get_complete_cases(dataDF)
```
以这种方式使用抽象的好处很容易指出。用函数替换重复的代码:
* 减少不必要的代码重复
* 促进可重用性(特别是当我们参数化定义一个缺失观察的值时)
* 使代码更容易测试
* 额外的好处是:使代码自文档化。在看到函数名和它收到的参数后,很容易推断出`complete_df`的内容
许多数据科学家认为笔记本电脑对于探索性数据分析和与他人交流结果非常有用,但是当涉及到将代码投入生产时,它们就没有那么有用了;但是越来越多的笔记本电脑正在成为建立生产模型的可行方式。当希望部署将成为计划生产作业的笔记本电脑时,请考虑以下选项。
* 拥有一台“指挥者”笔记本,使用`%run`魔法来执行其他笔记本
* 使用像 [papermill](https://github.com/nteract/papermill) 这样的工具,它允许从 Python 或通过 CLI 参数化和执行笔记本。调度非常简单,可以直接在 crontab 中维护
* 更复杂的管道使用 [Apache Airflow](/data-science-dictionary/airflow) 进行编排,使用 [papermill operator](https://airflow.apache.org/docs/stable/howto/operator/papermill.html) 执行笔记本。这个选项相当强大。它支持异构工作流,并允许有条件地并行执行笔记本电脑
无论我们喜欢哪种代码生产方式(通过笔记本提取或直接编排),都应该遵守以下一般规则:
* 大部分代码应该在良好抽象的函数中
* 这些功能应该放在模块和包中
这就把我们带到了笔记本重构,这是一个每个数据科学家都应该熟悉的过程。无论我们的目标是让笔记本代码生产就绪,还是只想将代码推出笔记本并放入模块,我们都可以迭代地完成以下步骤,包括准备和实际的重构:
1. 重启内核并运行所有单元——重构一个不工作的笔记本毫无意义,所以我们的首要任务是确保笔记本不依赖于任何隐藏状态,并且它的单元可以成功地按顺序执行
2. 制作笔记本的副本——开始重构,把笔记本破坏到无法恢复原状的地步,这很容易。使用副本是一种更简单的选择,如果出现问题,您还可以回到原始笔记本
3. 将笔记本转换成 Python 代码- `nbconvert`提供了一种简单易行的将笔记本转换成可执行脚本的方法。你要做的就是用你笔记本的名字来调用它:
```py
$ jupyter nbconvert --to script
```
4. 整理代码——在这一步,你可能想要删除不相关的单元格输出,将单元格转换成函数,删除 markdown 等。
5. 重构——这是过程中的主要步骤,我们重构现有的代码体,改变其内部结构而不改变其外部行为。我们将在下面详细介绍重构周期
6. [如果需要]从第 5 步开始重复
[else]重启内核并重新运行所有单元,确保最终的笔记本正确执行并按预期运行
现在让我们深入第 5 步的细节。
## 重构步骤
重构步骤是一组循环动作,可以根据需要重复多次。这个循环始于从笔记本中识别出一段我们想要提取的代码。这段代码将被转换成一个外部函数,我们需要编写一个单元测试来全面地定义或改进这个函数。这种方法受到测试驱动开发(TDD)过程的启发,也受到极限编程的测试优先编程概念的影响。
![The refactoring step cycle](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c36eac8dfc9c16a1190d1c80fd54eb6b.png) Figure 1 - The refactoring step cycle
不是每个数据科学家都对代码测试充满信心。如果他们没有软件工程的背景,就更是如此。然而,数据科学中的测试一点也不复杂。它还通过迫使我们更加注意并产生可靠、健壮且可安全重用的代码带来了大量好处。当我们考虑数据科学中的测试时,我们通常会考虑两种主要类型的测试:
* 关注单个源代码单元的单元测试。它们通常通过提供一个简单的输入并观察代码的输出来实现
* **集成测试**目标是组件的集成。这里的目标是获取一些经过单元测试的组件,根据设计规范组合它们,并测试它们产生的输出
有时会提出一个论点,即由于机器学习代码的概率性质,它不适合测试。这与事实相去甚远。首先,机器学习管道中的大量工作负载是完全确定的(例如数据处理)。其次,我们总是可以使用非确定性工作负载的指标——考虑在安装二元分类器后测量 F1 分数。
Python 中最基本的机制是`assert`语句。它用于测试一个条件,如果不满足这个条件,就立即终止程序(见图 2)。
![Flowchart illustrating the use of the assert statement](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4c8da73f7514d27d3d48bd155eebfc63.png)Figure 2 - Flowchart illustrating the use of the assert statement
`assert`的语法是
```py
assert <statement>, <error>
```
一般来说,assert 语句测试不应该发生的情况——这就是为什么如果测试语句的结果为`False`,它们会立即终止执行。例如,为了确保函数`get_number_of_students()`总是返回非负值,您可以将它添加到代码中
```py
assert get_number_of_students() &amp;gt;= 0, "Number of students cannot be negative."
```
如果由于某种原因函数返回一个负数,您的程序将终止,并显示如下消息:
```py
Traceback (most recent call last):
File "", line xxx, in
AssertionError: Number of students cannot be negative.
```
断言对于代码中的基本检查很有帮助,它们可以帮助你捕捉那些讨厌的 bug,但是用户不应该体验到它们——这就是我们有例外的地方。请记住,断言通常在发布版本中被删除——它们不是为了帮助最终用户,而是帮助开发人员并确保我们生成的代码坚如磐石的关键。如果我们认真对待代码的质量,我们不仅应该使用断言,还应该采用全面的单元测试框架。Python 语言包括`unittest`(通常被称为 PyUnit ),这个框架从 Python 2.1 开始就是测试 Python 代码的事实上的标准。这不是 Python 唯一可用的测试框架(`pytest`和`nose`立即浮现在脑海中),但它是标准库的一部分,有一些很棒的教程可以帮助您入门。通过子类化`unittest.TestCaseTests`来创建一个测试用例`unittest`,测试作为类方法来实现。每个测试用例调用框架提供的一个或多个断言方法(见表 2)。
![TestCase class methods to check for and report failures](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/31eda9c4f088f0ef3bb7e9c71dff01ef.png) Table 2: TestCase class methods to check for and report failures
在我们有了一个测试类之后,我们可以继续创建一个模块并开发一个通过测试用例的 Python 函数。我们通常使用来自`nbconvert`输出的代码,但是考虑到测试用例以及可重用性,我们对它进行了改进。然后,我们运行测试,并确认我们的新函数顺利通过了所有测试。最后,我们用对函数的调用替换笔记本副本中的原始代码,并确定要重构的另一段代码。
我们根据需要多次重复重构步骤,直到我们最终得到一个整洁简洁的笔记本,其中大部分可重用代码都被外部化了。这整个过程可能很难理解,所以让我们来看一个端到端的例子,让我们看一下如何改造玩具笔记本。
## 端到端的例子
在这个练习中,我们将看一个非常基本的笔记本(见图 3)。虽然这个笔记本很简单,但是它已经有一个目录了(耶!),所以有人已经想到了它的结构或者说我们希望如此。最初命名为`demo-notebook.ipynb`的笔记本将一些 CSV 数据加载到 Pandas 数据帧中,显示前 5 行数据,并使用我们在抽象的使用一节中已经看到的代码片段来删除数据帧的四列中包含值“unknown”的条目。
按照上面建立的过程,我们首先重启内核,然后运行所有单元命令。在确认所有单元都正确执行之后,我们继续创建笔记本的工作副本。
```py
$ cp demo-notebook.ipynb demo-notebook-copy.ipynb
```
接下来,我们使用`nbconvert`将副本转换成脚本。
```py
$ jupyter nbconvert --to script demo-notebook-copy.ipynb
[NbConvertApp] Converting notebook demo-notebook.ipynb to script
[NbConvertApp] Writing 682 bytes to demo-notebook.py
$
```
![The sample notebook before refactoring](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b05f38adec30a0bf51a16437a5126a4f.png) Figure 3 - The sample notebook before refactoring
`nbconvert`的结果是一个名为`demo-notebook.py`的文件,其内容如下:
```py
#!/usr/bin/env python
# coding: utf-8
# ### Outline #
# * Take me to [Section A](#section_a)
# * Take me to [Section B](#section_b)
# * Take me to [Section C](#section_c)
# ### &amp;lt;a name="section_a"&amp;gt;&amp;lt;/a&amp;gt;This is Section A
import pandas as pd
dataDF = pd.read_csv("bank.csv")
dataDF.head()
# ### &amp;lt;a name="section_b"&amp;gt;&amp;lt;/a&amp;gt;This is Section B
completeDF = dataDF[dataDF["poutcome"]!="unknown"]
completeDF = completeDF[completeDF["job"]!="unknown"]
completeDF = completeDF[completeDF["education"]!="unknown"]
completeDF = completeDF[completeDF["contact"]!="unknown"]
completeDF.head()
# ### &amp;lt;a name="section_c"&amp;gt;&amp;lt;/a&amp;gt;This is Section C
```
此时,我们可以将`completeDF`的定义重写为一个函数,并将第二个`head()`调用用一个`print`调用括起来,这样我们就可以测试新开发的函数了。Python 脚本现在应该是这样的(为了简洁起见,我们省略了不相关的部分)。
```py
...
def get_complete_cases(df):
return df[~df.eq("unknown").any(1)]
completeDF = get_complete_cases(dataDF)
print(completeDF.head())
...
[/code]
```
我们现在可以运行`demo-notebook.py`并确认输出符合预期。
```py
$ python demo-notebook.py
age job marital education default balance housing ... month duration campaign pdays previous poutcome y
24060 33 admin. married tertiary no 882 no ... oct 39 1 151 3 failure no
24062 42 admin. single secondary no -247 yes ... oct 519 1 166 1 other yes
24064 33 services married secondary no 3444 yes ... oct 144 1 91 4 failure yes
24072 36 management married tertiary no 2415 yes ... oct 73 1 86 4 other no
24077 36 management married tertiary no 0 yes ... oct 140 1 143 3 failure yes
```
```py
[5 rows x 17 columns]
```
接下来,我们继续重构步骤,目标是`get_complete_cases()`函数。在识别出代码片段后,我们的第一个任务是想出一套好的测试来全面测试或改进功能。这是一个单元测试,它为我们的功能实现了几个测试用例。
```py
import unittest
import warnings
warnings.simplefilter(action="ignore", category=FutureWarning)
import numpy as np
import pandas as pd
from wrangler import get_complete_cases
class TestGetCompleteCases(unittest.TestCase):
def test_unknown_removal(self):
"""Test that it can sum a list of integers"""
c1 = [10, 1, 4, 5, 1, 9, 11, 15, 7, 83]
c2 = ["admin", "unknown", "services", "admin", "admin", "management", "unknown", "management", "services", "house-maid"]
c3 = ["tertiary", "unknown", "unknown", "tertiary", "secondary", "tertiary", "unknown", "unknown", "tertiary", "secondary"]
df = pd.DataFrame(list(zip(c1, c2, c3)), columns =["C1", "C2", "C3"])
complete_df = df[df["C2"]!="unknown"]
complete_df = complete_df[complete_df["C3"]!="unknown"]
complete_df_fn = get_complete_cases(df)
self.assertTrue(complete_df.equals(complete_df_fn))
def test_nan_removal(self):
"""Test that it can sum a list of integers"""
c1 = [10, 1, 4, 5, 1, np.nan, 11, 15, 7, 83]
c2 = ["admin", "services", "services", "admin", "admin", "management", np.nan, "management", "services", "house-maid"]
c3 = ["tertiary", "primary", "secondary", "tertiary", "secondary", "tertiary", np.nan, "primary", "tertiary", "secondary"]
df = pd.DataFrame(list(zip(c1, c2, c3)), columns =["C1", "C2", "C3"])
complete_df = df.dropna(axis = 0, how = "any")
complete_df_fn = get_complete_cases(df)
self.assertTrue(complete_df.equals(complete_df_fn))
if __name__ == '__main__':
unittest.main()
```
上面的代码显示我打算把`get_complete_cases()`放在一个名为`wrangler`的包中。第二个测试用例也清楚地表明,我计划通过删除 NaN 的函数来改进作用域内函数。你可以看到,我执行测试的方式是从一些静态定义的数组中构造一个`DataFrame`。这是设置测试的基本方法,更好的方法是利用`TestCase`的`setUp()`和`tearDown()`方法,所以你可能想看看如何使用它们。
我们现在可以继续构建我们的数据争论模块。这是通过创建一个名为`wrangler`的目录并放置一个包含以下内容的`__init.py__`文件来实现的:
```py
import numpy as np
def get_complete_cases(df):
"""
Filters out incomplete cases from a Pandas DataFrame.
This function will go over a DataFrame and remove any row that contains the value "unknown"
or np.nan in any of its columns.
Parameters:
df (DataFrame): DataFrame to filter
Returns:
DataFrame: New DataFrame containing complete cases only
"""
return df.replace("unknown", np.nan).dropna(axis = 0, how = "any")
```
从上面的代码中可以看到,该函数已经做了轻微的修改,也删除了 NaN 条目。是时候看看测试用例是否成功通过了。
```py
$ python test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.015s
```
```py
OK
```
在得到所有测试都成功通过的确认后,是时候执行最后一步了,用对新开发和测试的函数的调用替换笔记本代码。笔记本的返工部分应该是这样的:
![Reworked sections of notebook](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7a09dd2bbb437f5628ad3417fca2ec20.png)
因为我只是重构了完整的案例代码,所以我不必再重复重构周期了。剩下要检查的最后一点是反弹内核并确保所有单元都按顺序执行。正如你在上面看到的,最终的笔记本是简洁的,自文档化的,并且通常看起来更好。此外,我们现在有一个独立的模块,可以在其他笔记本和脚本中重用。
## 摘要
良好的软件工程实践可以而且应该应用于数据科学。没有什么能阻止我们开发可读、可维护和可靠的笔记本代码。本文概述了数据科学家在笔记本电脑上工作时应该遵守的一些关键原则:
* 组织你的内容
* 观察代码风格并保持一致
* 利用抽象
* 采用一个测试框架,为你的代码开发一个测试策略
* 经常重构并将代码转移到可重用的模块中
机器学习代码和通常用数据科学应用程序编写的代码也不例外。当编写代码时,我们应该总是考虑它的可维护性、可靠性、效率和可用性。本文试图概述产生高质量数据科学交付物的一些关键原则,但是所涵盖的元素绝不是详尽的。以下是需要考虑的其他习惯和规则的简要列表:
* 评论——没有评论是不好的,但是把钟摆摆向另一边也没有帮助。只是重复代码的注释是没有价值的。显而易见的代码不应该被注释。
* 干原则(不要重复自己)——重复的代码段应该抽象/自动化。
* 深度嵌套是邪恶的——五个嵌套的 if 很难读懂,深度嵌套被认为是反模式。
* 项目组织是关键——是的,您可以在一个笔记本或一个 Python 脚本中做大量的事情,但是拥有一个逻辑目录结构和模块组织非常有帮助,尤其是在复杂的项目中。
* 版本控制是必备的——如果你经常要和名字看起来像`notebook_5.ipynb`、`notebook_5_test_2.ipynb`或者`notebook_2_final_v4.ipynb`的笔记本打交道,你就知道有些不对劲。
* 众所周知,在笔记本上工作很难复制,因为需要考虑许多因素(硬件、解释器版本、框架和其他库版本、随机化控制、源代码控制、数据完整性等)。),但是至少应该在每个笔记本旁边存储一个`requirements.txt`文件。
# 解决可信人工智能的三个 r:道德、合法和可靠的模型
> 原文:<https://www.dominodatalab.com/blog/the-principles-of-trustworthy-ai>
由达美乐数据科学战略和宣传负责人 Kjell Carlsson 于 2022 年 4 月 27 日在 [透视](https://www.dominodatalab.com/blog/tag/perspective)
*![Hand showing an AI face](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a0a0e35c44c45e27e5b73c64a468d383.png)*
*您的业务成果、声誉和合规性取决于值得信赖的人工智能*
尽管通俗小说(和埃隆·马斯克)试图说服我们不要这样,但我们并没有面临人工智能引发的天启的威胁。正如吴恩达所说,对流氓人工智能的担忧仍然像是对“火星人口过剩问题”的担忧相反,越来越多的人一致认为,真正需要防范的人工智能威胁是不可信的人工智能。在最近的一项调查中,82%的数据科学领导者[](https://www.dominodatalab.com/news/data-science-leaders-say-their-companies-focus-on-short-term-payoffs)表示,高管需要担心支撑不可信人工智能解决方案的糟糕和失败模型的严重后果。
不可信的人工智能已经造成了真实的——尽管通常是隐藏的——伤害。在同一项调查中,46%的数据科学领导者表示,他们因这些模型的错误决策和收入损失而失眠,41%的人指出了歧视和偏见的风险。更糟糕的是,随着你扩大自己和第三方人工智能解决方案的规模,你的客户、员工和企业面临的 [风险](https://www.mckinsey.com/capabilities/quantumblack/our-insights/confronting-the-risks-of-artificial-intelligence) 几乎肯定会增加。
*可信的人工智能*和——根据定义,*可信的人工智能*——是关于*道德、* *法律合规*以及最重要的是*可靠的*人工智能解决方案的非常真实的挑战,通过正确的设计、开发和维护为它们提供动力的机器学习模型。让我们来探索*可信的人工智能*如此重要的原因,以及你需要克服的挑战,以确保它。(此外,请于 5 月 5 日至 6 日参加关于该主题的 [Rev 3](https://rev.dominodatalab.com/?utm_campaign=rev_2021&utm_content=204875409&utm_medium=social&utm_source=linkedin&hss_channel=lcp-3542130) 小组讨论和演示。)
## 可信人工智能的三个“R”
在数据科学之外,很少有高管理解信任对于他们的组织利用人工智能的能力有多重要。金融服务(finserv)和保险公司知道可信赖的人工智能在监管合规性方面的重要性,例如围绕 [信用风险评分](https://www.brookings.edu/research/an-ai-fair-lending-policy-agenda-for-the-federal-financial-regulators/) 的规则。安全公司已经敏锐地意识到即将到来的监管,特别是执法部门对面部识别的使用。而且,每个人都在媒体上看到过人工智能解决方案陷入困境的尴尬事件——想想微软 Tay 的 [种族主义爆发](https://techcrunch.com/2016/03/24/microsoft-silences-its-new-a-i-bot-tay-after-twitter-users-teach-it-racism/?guccounter=1&guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&guce_referrer_sig=AQAAAIPobh3XAFbjnGHUHkN7NI6RwnP_xacdbNEOfXpHOYOW0DPKkpLekJP6rDOnKIiptsM-Uq_StvHw-yMElC3lxiDMYHCJgzYwx8nu1IixIBJSgSCLUq_OE8SEGPktEnIHwHOYaPNEZuf6fnv9TUNKSm_4PvxkTsyWKFIOm0n7IIAS) 或谷歌照片“将人标记为 [大猩猩](https://www.bbc.com/news/technology-33347866) ”。然而,这些仅仅触及了可信人工智能对每个组织的人工智能运营和雄心至关重要的一小部分方式。所有这些都受到可信人工智能的三个“R”的影响。
### 结果
不可信的人工智能解决方案经历了较少的验证、鲁棒性测试和对预测驱动因素的检查,与可信的解决方案相比,交付了更差的业务结果。为什么?因为他们表现更差,将来更容易失败,更不容易被采纳。此外,不公平的人工智能模型通常会通过使用种族和性别等歧视性信息来走捷径,并且不如经过实际行为驱动因素训练的模型准确。此外,不可信的人工智能解决方案会减缓创新,因为它们在整个开发、实施和采用过程中受到利益相关者的怀疑和抵制。
### 名声
当人工智能解决方案被发现不公平、不可靠甚至非法时,公司的声誉就会受到打击,影响客户与公司做生意的意愿,以及人才申请或留在他们的职位上的意愿。大多数重大失误来自谷歌、脸书、微软和亚马逊等科技公司,这不应被视为其他公司风险较小的迹象。这些公司只是更早地开始了他们的人工智能之旅,并更多地使用人工智能模型。然而,它们也能经受住重大失误带来的声誉影响——因为它们实际上是核心业务的垄断者。你的竞争企业已经花费了大量的金钱和多年的时间来建立你的关系和声誉,可能没有这种奢侈。一个互联网巨头不会有招聘问题,即使它的招聘工具[被证明是性别歧视](https://www.reuters.com/article/us-amazon-com-jobs-automation-insight/amazon-scraps-secret-ai-recruiting-tool-that-showed-bias-against-women-idUSKCN1MK08G) 。不要指望你的组织如此幸运。
### 规章制度
除了一组有限的(尽管非常有价值)用例,主要是在 [金融服务](https://www.federalreserve.gov/newsevents/testimony/braunstein20100323a.htm#:~:text=Under%20ECOA%20and%20Regulation%20B,to%20evaluate%20an%20applicant's%20creditworthiness.) 中,这些用例早在人工智能出现之前就受到了严格的监管,我们在人工智能监管方面基本上一直生活在无政府主义者的天堂。在欧盟,以 GDPR 的形式存在强有力的*数据*监管,这间接影响了利用客户数据的人工智能用例。此外,中国上个月出台了全面的人工智能立法,尽管其影响仍不明朗。在美国,还没有关于人工智能的联邦立法,只有小城市和州一级的立法,其中大部分是关于面部识别和客户数据的使用。但是,调控来了。欧盟提出了广泛的人工智能监管——罚款高达全球收入的 6%——美国预计将在不久的将来推出更温和的联邦人工智能立法。
## 没有灵丹妙药,但有一个不断增长的道德 AI & ML 工具包
虽然大多数公司几乎肯定低估了它的重要性,但有一个压倒性的共识,即可信的人工智能是重要的。在如何实现这一点上,并不存在同样的共识。阐明一套道德的人工智能原则一直很受欢迎——比如微软、IBM、谷歌、德勤和 [梵蒂冈](https://www.reuters.com/article/vatican-artificial-intelligence/pope-to-endorse-principles-on-ai-ethics-with-microsoft-ibm-idUSL2N2AS01S) 提出的那些原则。不幸的是,这些原则中的许多对实践者提供的指导很少,相互矛盾,并且经常与实际技术及其应用明显脱节。
不幸的是,也很少有证据表明,公司设立的人工智能道德顾问委员会提供了合理、实用的指导。在人工智能技术领域拥有专业知识的人似乎很少参与这两种努力。例如,值得注意的是,这些实体中有多少要求绝对的客户数据隐私,同时坚持消除所有有害的偏见。这忽略了一个对任何从业者来说都显而易见的事实,即如果没有客户信息来检测或减轻歧视性偏见,您就无法消除它。
值得信赖的人工智能不是由人工智能道德委员会颁布的法令产生的,而是最终依赖于参与开发和维护这些人工智能解决方案的团队的辛勤工作和不断警惕。谢天谢地,有一个不断扩展的 [方法](https://www.trustworthyml.org/) 工具包,从业者可以用它来提高可信度。这些方法包括可解释性技术、公平性测试和偏差缓解方法,以及始终重要的模型验证和监控的传统方法。
由于信任本身的许多不同方面,从业者总是需要使用大量的这些技术,这取决于上下文和用例。平台(如 Domino Data Lab)可以轻松应用所有这些工具,实现可用的新方法,确保模型的可重复性,并促进持续监控,这对于确保信任至关重要。但让了解数据科学、值得信赖的人工智能方法和道德规范以及流程的人持续记录、评估、测试和监控您的解决方案至关重要。正如人工智能中的一切一样,人类智能是最重要的成分。
有关如何确保现实世界的人工智能解决方案是可靠的、道德的,并且符合新的和未来的法规的更多信息,请查看在 [Rev 3](https://rev.dominodatalab.com/) 的会议。
[![New call-to-action](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ff0f86b10fb5e777d83869be28e7dc01.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/99d47ffd-cdb9-4123-810e-6b640812f848)
# 剩余数据 I/O 竞争
> 原文:<https://www.dominodatalab.com/blog/the-r-data-i-o-shootout>
我们让新来的 R 数据 I/O 包`feather`与流行的包`data.table`、`readr`以及来自 base R 的古老的`saveRDS` / `writeRDS`函数进行竞争。虽然`feather`表现不错,但它确实面临着激烈的竞争。
他们说好人没好报。很少有像向社区发布开源包这样高尚而美好的行为。您将辛苦获得的经验作为代码,打包,并发布它们以供(希望)使用和扩展。但是几乎可以肯定的是,你会被网络上的随机者(比如我自己)无情地批评,除了吹毛求疵,你似乎没有什么更好的事情可做。
因此,我们发现自己在这里:与 R 数据 I/O 包枪战!我们将比较`feather`、`data.table`、`readr`以及来自 base `R`的古老的`saveRDS` / `writeRDS`函数的读写性能。
## 大张旗鼓地宣布
3 月 29 日,数据科学世界最知名的两位人物,R 的 Hadley Wickham 和 Python 的 Wes McKinney 向世界发布了“羽毛”。从他们的公告来看:
### 什么是`feather`?
Feather 是一种快速、轻量且易于使用的二进制文件格式,用于存储数据帧。它有几个具体的设计目标:
* 轻量级、最小化的 API:尽可能简单地将数据帧推入和推出内存
* 与语言无关:无论是用 Python 还是 R 代码编写,Feather 文件都是一样的。其他语言也可以读写羽毛文件。
* 高读写性能。如果可能,羽化操作应该受本地磁盘性能的限制。
我们的其他竞争者:
### 什么是`data.table`?
是一个 R 包,它提供了一个增强版本的 data.frame,允许快速的数据操作。对于该基准测试,我们将通过`fread`函数加载所有数据(许多基准测试表明这是获取 CSV 文件的最快方式)。然后,我们将测试新的`fwrite`功能,这是最近添加的(尚未在 CRAN 上),并提供多核高性能磁盘 IO。
### 什么是`readr`?
是一个 R 包,是[Hadleyverse]的一部分。它提供了一种快速友好的方式将表格数据读入 r。它提供了许多类似于`data.table`的`fread`的功能(它猜测列类型,`stringsAsFactors=FALSE`等等)...)
## 我们枪战的实验装置
我使用了下面的 [Kaggle 数据集](https://www.kaggle.com/datasets),并对每个数据集做了如下处理:
1. 使用`fread`加载数据集,运行时间记为`read_time`。
2. 使用`fwrite`、`write_csv`、`write_feather`、`saveRDS`将它写成 CSV 格式,并捕获运行时间。
3. 将其加载为一个`feather`和`RDS`文件,并捕获运行时间。
我们将每个操作运行 10 次,并在比较中使用中间值。在实验中,为了比较苹果和苹果,压缩被关闭了。
* 贷款俱乐部数据来自
* 美国死亡人数从[https://www.kaggle.com/cdc/mortality](https://www.kaggle.com/cdc/mortality)
* 来自[https://www.kaggle.com/kaggle/college-scorecard](https://www.kaggle.com/kaggle/college-scorecard)的大学记分卡
* 美国消费金融投诉来自
[https://www . ka ggle . com/ka ggle/US-Consumer-Finance-Complaints](https://www.kaggle.com/kaggle/us-consumer-finance-complaints)
* 来自[https://www . ka ggle . com/berkeleyearth/climate-change-earth-Surface-Temperature-Data](https://www.kaggle.com/berkeleyearth/climate-change-earth-surface-temperature-data)的地球表面温度数据
* 来自 https://www.kaggle.com/snap/amazon-fine-food-reviews 的亚马逊美食评论
### 五金器具
该基准测试在一个拥有 32 个内核和 60GB 内存的 Domino XX-Large 实例上运行。这映射到一个 AWS c3.8xlarge 实例。读写发生在 SSD 支持的 EBS 上。虽然我们使用的实例没有经过 *EBS 优化*(有保证的带宽和延迟),但是每个操作的迭代次数减少了与 EBS 连接的一些差异。
## 结果呢
马上,我们就要和我们最喜欢的竞争者之一说再见了。从数据来看,很明显`readr`和它的`write_csv`调用是迄今为止最慢的。因此,尽管 Hadley 是一个超级酷的人,我也很尊敬他,但我们还是会称其为写出数据的基准中最弱的。我们将从所有未来的分析中排除`write_csv`。抱歉哈德利。我仍然认为你是最好的。
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ccbb6f7004a0f49d3687b66e9443b9fe.png)
### 死亡记录数据集
`DeathRecords.csv`数据集由 260 万行 38 列组成,在磁盘上有 251 兆字节。数据集由 32 个数字列和 6 个字符列组成,NA 值为零。
对于写作,`fwrite`是 1.7 秒的性能赢家,比第二快的`feather`快大约 2 倍。
| | 文件 | 键 | 价值 |
| --- | --- | --- | --- |
| one | DeathRecords.csv | 写时间 | One point six six six |
| Two | DeathRecords.csv | 保存时间 | 5.6035 |
| three | DeathRecords.csv | 羽毛 _ 写作 _ 时间 | Three point zero three five |
![png](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e9e4a87ec1d21c1fda4268821a9c895f.png)
对于读取,与其他数据集类似,`feather`是目前最快的获取数据的方式。正如您将看到的,`feather`并不总是写出数据的最快方式,但它确实是检索数据的最快方式。
| | 文件 | 键 | 价值 |
| --- | --- | --- | --- |
| one | DeathRecords.csv | 阅读时间 | Five point seven seven four |
| Two | DeathRecords.csv | 羽毛 _ 阅读 _ 时间 | Zero point five eight six |
| three | DeathRecords.csv | 阅读时间 | Three point four three |
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/88c5badf4c7f9e518b92e3faa2fe09ea.png)
### 全球陆地和温度数据集
`GlobalLandTemperaturesByCity.csv`数据集有 850 万行,7 列,在磁盘上有 508 兆字节。这个文件是数字和字符值的混合,大约有 70 万 NA 值。
对于写作来说,`data.table`的`fwrite`再次成为性能赢家,以大约 3 秒的速度进来,或者说是下一个包`feather`的两倍。
| | 文件 | 键 | 价值 |
| --- | --- | --- | --- |
| one | GlobalLandTemperaturesByCity.csv | 写时间 | 3.2295 |
| Two | GlobalLandTemperaturesByCity.csv | 保存时间 | 11.1285 |
| three | GlobalLandTemperaturesByCity.csv | 羽毛 _ 写作 _ 时间 | Five point seven one |
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/16dff0d409931219f297060b861d9b11.png)
同样,`feather`是检索数据的最快方法。这一次是非常大的因素。在这一点上没有问题:写文件将是其他包之间的一场混战,但是读是决定性的,`feather`赢了。寓意似乎很简单:如果您正在创建一个要多次读取的数据文件,`feather`提供了比`fread`和`readRDS`好得多的性能。
| | 文件 | 键 | 价值 |
| --- | --- | --- | --- |
| one | GlobalLandTemperaturesByCity.csv | 阅读时间 | Nine point nine seven three |
| Two | GlobalLandTemperaturesByCity.csv | 羽毛 _ 阅读 _ 时间 | One point six three nine |
| three | GlobalLandTemperaturesByCity.csv | 阅读时间 | 8.7695 |
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/20743ed97cb33e19dde9805f6d47e3f3.png)
### 亚马逊美食评论数据集
`Reviews.csv`大约有 50 万行,10 列,在磁盘上有 287 兆字节。这个文件是数字和字符值的混合,几乎没有 NA 值。
在这个场景中,`data.table`的`fwrite`以大约 2 秒的成绩胜出。
有趣的是,所有的解决方案之间几乎没有区别:它们都在几毫秒内完成了书写。在早期测试中看到的差异在这里并不明显。我很想知道这是为什么。
| | 文件 | 键 | 价值 |
| --- | --- | --- | --- |
| one | 点评. csv | 写时间 | One point nine nine three |
| Two | 点评. csv | 保存时间 | Two point five zero three |
| three | 点评. csv | 羽毛 _ 写作 _ 时间 | Two point two four nine |
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fa221774fb6eee56b72f763b3564e883.png)
### 大学记分卡数据集
最大的数据集`Scorecard.csv`大约有 125k 行,1,731 列,磁盘容量为 1.2GB。这个文件是数字和字符值的混合,有大约*2000 万* NA 值。在这个场景中,`fwrite`是以大约 10 秒的成绩胜出的。这里有相当多的差异,`feather`花费了将近两倍的时间。
| | 文件 | 键 | 价值 |
| --- | --- | --- | --- |
| one | 记分卡. csv | 写时间 | 9.7835 |
| Two | 记分卡. csv | 保存时间 | 39.3755 |
| three | 记分卡. csv | 羽毛 _ 写作 _ 时间 | Sixteen point five two seven |
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/69b137ac88b82170c92e6985caacb0f2.png)
### 消费者投诉数据集
`consumer_complaints.csv`数据集大约有 50 万行,18 列,在磁盘上有 167 兆字节。这个文件几乎完全是具有单个数值的字符值,并且具有零 NA 值。
在这个写场景中,`fwrite`是以大约 1 秒的时间进入的性能赢家。这里有一些差异,`saveRDS`花费了将近三倍的时间。`feather`比`fwrite`大约慢 40%。如果这个文件需要频繁地被*读取*,并且增量如此之小,`feather`可能会作为磁盘格式提供下游优势。
| | 文件 | 键 | 价值 |
| --- | --- | --- | --- |
| one | 消费者 _ 投诉. csv | 写时间 | 1.1455 |
| Two | 消费者 _ 投诉. csv | 保存时间 | Two point six eight |
| three | 消费者 _ 投诉. csv | 羽毛 _ 写作 _ 时间 | One point four one seven |
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fce4cb8e096bdb5d13c26c99bdb99f85.png)
### 贷款数据
`loan.csv`数据集大约有 88 万行,74 列,磁盘上有 421 兆字节。这个文件是一个混合了字符值的文件,数字值的比例为 2 比 1,NA 值的比例非常高(接近 1500 万。)在这种情况下,`fwrite`是性能的赢家,在启用和未启用睿频加速的情况下都是 2.8 秒。与大学记分卡数据集不同,`saveRDS`在这里取得了更好的结果。似乎随着稀疏度的增加(高密度的`NA`值)`saveRDS`表现得更好。
| | 文件 | 键 | 价值 |
| --- | --- | --- | --- |
| one | loan.csv | 写时间 | Two point nine zero five |
| Two | loan.csv | 保存时间 | Seven point nine nine eight |
| three | loan.csv | 羽毛 _ 写作 _ 时间 | Five point zero four three |
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/86497438145d7e433ef0908bfb8553b8.png)
## 外卖
我从这个实验中得到了两大收获:
1. 就摄取数据集而言,真的很难打败`feather`。简直快得不可思议。比我能测试的任何东西都快。
2. `feather`和`fwrite`都提供了出色的表格文件写入性能。作为一个规则,如果你有一个与我们的实验配置相似的盒子(大量的内核和内存,以及固态硬盘),`fwrite`似乎很难被击败。不过,只要吃一两口那个文件,你可能会希望你已经`feather`看过了。
与所有基准一样,这个基准是有限的和不完整的。我们在一台具有一种配置的机器上进行实验。数据集稀疏性似乎也对结果有一些影响,我们没有明确测试稀疏性的差异。您的收获可能有所不同:您可能会在您的系统和数据集上看到完全不同的性能特征。
毫无疑问,我可以说的是`readr`写文件并不是特别快。如果你还在用`write.csv`或者类似的,那你就是在浪费很多电!
最后,需要注意其他一些封装特性:
* 这些工具中只有一个提供跨语言支持(将 CSV 放在一边)。如果你想轻松而*快速的*在 Python 和 R apps 之间共享复杂的数据,你真的只有一个选择:`feather`。
* `saveRDS` / `readRDS`和`feather`使用二进制格式,而不是 CSV 文本格式。二进制有缺点:不能使用 head、tail、wc、grep 和 sed 等熟悉且历史悠久的命令行工具。二进制格式也是不透明的,随着包的开发和格式的改变,有可能出现破损和向后不兼容。
### 汇总统计数据
在下面的图表中,我们看到在一般情况下`feather`和`fwrite`的表现非常相似。在最坏的情况下,`fwrite`比`saveRDS`的平均速度要快。
![svg](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f88f3770b7f91ba74f47b02ef8a7f6be.png)
| | 键 | 部 | 意思是 | 最大 |
| --- | --- | --- | --- | --- |
| one | 羽毛 _ 写作 _ 时间 | One point four one seven | 5.6635 | Sixteen point five two seven |
| Two | 写时间 | 1.1455 | 3.45375 | 9.7835 |
| three | 保存时间 | Two point five zero three | 11.54808 | 39.3755 |
综上所述,`feather`和`fwrite`是最大的赢家。然而,`feather`确实有一个相当糟糕的写作“最坏情况”行为。如何分摊`feather`读取操作的节省是留给读者的练习。
## 最后的想法
基准可能会引起争议。希望这个不要超一般!代码和数据都可以在上面链接的 Domino 项目中找到。我欢迎改进实验的建议(和代码)。非常感谢 Matt Dowle 和 Arun Srinivasan 在`data.table`的出色工作,以及 Hadley Wickham 和 Wes McKinney 在`feather`的出色工作!在 2016 年,从分析环境中获取数据的世界取得了长足的进步,我们很幸运能够从中受益!
# 容器对于数据科学的真正价值
> 原文:<https://www.dominodatalab.com/blog/the-real-value-of-containers-for-data-science>
每年,你交的税中有 50 美元被投入到无法复制的研究中。
气候公司科学副总裁埃里克·安德列科在 2016 年圣荷西 Strata+Hadoop World 大会上发言
本周在圣何塞的 Strata+Hadoop 世界博览会上,很明显,供应商们已经抓住了容器的漏洞。去年毕竟是容器的[年。令我印象深刻的是,Docker 等容器技术主要用于计算基础设施。然而,数据科学家的真正价值不在这里。](http://www.infoworld.com/article/3016800/virtualization/2015-the-year-containers-upended-it.html)
供应商正在提供[可扩展的计算和存储],发言者正在讨论在容器上部署[Hadoop,或者在 Hadoop 上运行容器。但是,计算基础设施只会间接影响数据科学家开展研究的能力。虽然有人努力将容器化的](http://conferences.oreilly.com/strata/hadoop-big-data-ca/public/schedule/detail/47489)[科学研究和 Python 堆栈](https://github.com/jupyter/docker-stacks/tree/master/datascience-notebook)带到桌面上,但对于许多最终用户来说,这是一项不小的工作。
在昨天的会议上,气候公司的科学副总裁埃里克·安德列科谈到了“把科学放在数据科学中”。他强调再现性原则是科学方法的核心。然而,科学正面临着一场危机:无法重现研究成果。一个相当令人吃惊的例子:最近的[研究](http://www.nature.com/nature/journal/v483/n7391/full/483531a.html)发现,药物发现项目中近 90%的研究是不可重复的(关于这一点的更多信息,请参见我们最近[对埃里克](//blog.dominodatalab.com/building-a-high-throughput-data-science-machine/)的采访)。
这就是容器在数据科学中的真正价值:在某个时间点捕获实验状态(数据、代码、结果、包版本、参数等)的能力,使得在研究过程的任何阶段重现实验成为可能。
可重复性对于监管环境下的定量研究至关重要,例如,记录贷款模型的出处以证明其避免了种族偏见。然而,即使在不受监管的环境中,再现性对于数据科学项目的成功也是至关重要的,因为它有助于捕捉稍后可能会浮出水面的假设和偏见。
科学过程是建立在不断积累的洞察力上的。这种积累可能是由一组数据科学家在一段时间内合作推动的,也可能是由一名数据科学家根据过去的经验构建的。只有过去的结果是可重复的,这个过程才有效。
容器是支持数据科学的科学方法的理想技术。我们从一开始就在 Domino 中大量使用 Docker,我们很高兴在接下来的博客文章中分享更多关于使用容器的经验和教训。
# 模型治理在机器学习和人工智能中的作用
> 原文:<https://www.dominodatalab.com/blog/the-role-of-model-governance-in-machine-learning-and-artificial-intelligence>
在机器学习(ML)和人工智能(AI)的世界里,治理是一生的追求。所有的模型都需要在整个部署过程中进行测试和审计,而且由于模型在不断学习,因此总是存在偏离原始标准的风险。因此,只要模型被使用,模型治理就需要被应用到每个模型中。
## 什么是模型治理?
模型治理是一个框架,它决定了公司如何实现策略、控制对模型的访问以及跟踪它们的活动。它类似于公司治理,除了它特别适用于 ML/AI 模型,并且应该被视为模型风险管理的子集。其目的是提高效率,降低风险,减少或消除可能发生的任何危险的财务影响。
模型治理的主要焦点包括跟踪、测试和审计。这包括:
* 模型谱系,从数据获取到模型构建
* 生产中的模型版本,因为它们是根据新数据更新的
* 使用模型监控原则在生产中建立健康模型
* 生产中的模型使用和基本功能
* 模型成本
模型治理不仅降低了风险,它还有助于实现基本的业务目标,如生产效率和盈利能力。例如,跟踪模型血统使数据科学团队能够快速有效地复制模型,并在需要时再次访问相同的数据。它还为审计提供重要信息,并记录测试、开发或部署的不同阶段涉及的人员。
### 模型治理的目的及其重要性
模型治理有两个方面:风险和回报。双方都要求公司在模型过程中部署洞察力,以跟踪模型开发、部署和监控的进展,并在出现偏差时通知适当的人员。
在风险方面,有两个因素需要关注。首先是模型使用的数据。机密数据需要安全,不能被滥用。这不仅可能违反法律,而且在许多商业领域,包括金融和医疗保健行业,合规认证将规定如何使用数据。另一个问题是公司自己关于数据使用的政策和法律合同。
第二个风险领域来自模型本身。因为 AI/ML 模型被设计为学习和进化,它们可以学习它们不应该学习的东西,并产生不准确性或偏见,这将影响它们的决策。想象一下,例如,一个被设计用来解释 MRI 扫描的模型学会忽略解剖异常,或者一个不更新当前利率的金融分析模型。
从回报方面来看,良好的治理可以提高模型开发、测试和部署的效率,释放资源并揭示新的探索机会。例如,在许多公司,数据科学家倾向于在测试后长期坚持一个项目,并致力于部署,而不是将工作量交给开发人员或工程师。治理可以确保他们提供足够的文档。
## 模型治理如何工作
正如[财务模型](https://www.afponline.org/ideas-inspiration/topics/articles/Details/what-is-a-financial-model/)的治理遵循其生命周期一样,ML/AI 模型的治理应该遵循[数据科学生命周期(DSLC)](https://www.dominodatalab.com/blog/adopting-the-4-step-data-science-lifecycle-for-data-science-projects) :管理、开发、部署、监控。
### 经营
在绘制模型或确定数据源之前,应该为项目建立治理。这包括确定谁将参与项目,他们的角色是什么,以及他们需要访问哪些技术资源。
不像其他类型的治理,可以由执行官或董事会来设置,模型治理需要团队的努力。每个数据科学团队的代表以及主要利益相关者都应参与其中:
* **法律:**法律团队中的某个人,负责为政府或监管要求以及公司治理范围内的任何方面(如数据使用要求、保密等)建立治理准则。
* 管理:监督包括人力资源在内的资源的有效使用,以确保资源得到合理利用。
* **团队领导:**每个团队的代表应包括首席数据科学家、工程师、开发人员、分析师等。他们处于最佳位置,可以确保正确遵循程序、定期进行监控以及团队高效协作。
* **业务部门:**业务部门的代表应参与进来,以确保实现业务目标,为客户提供良好的服务,成本在预期范围内,以及未开发的业务机会得到处理。
### 发展
随着项目的开始,应该记录所有的数据来源。如果数据集被清理或修改,应该给它一个版本号。这同样适用于所使用的算法。模型的每一个变化都应该被记录和保存,以便在需要时可以重用。幸运的是,如果您使用的是企业 MLOps 平台,这一切都是自动完成的,包括用于开发模型的特定工具和完成工作的人员。
### 部署
当一个模型被部署到一个生产环境中时,模型治理确保它被适当地审计和测试,以确保它像预期的那样快速和准确地运行,并且它没有经历漂移或者不像预期的那样执行。如果模型确实遇到了问题,可以使用已经部署的最后一个成功版本来替换它。
### 班长
一旦一个模型出现在现实世界中,被它的设计服务对象所使用,就应该对它进行日常监控。例如,经历漂移的模型可能会输出比预测更多或更少的数据,或者它可能会过度利用 CPU 或 GPU 资源。Domino 的 Enterprise MLOps 平台会自动完成这项工作,并在模型未能满足或超出预设参数时提醒团队领导。
## ML 和 AI 中的模型治理
当模型治理在企业 MLOPs 平台中开发和管理时,它会更加容易和有效。Domino 的 MLOPs 数据科学平台从企业级安全性和凭证传播开始,以控制[机器学习模型](https://www.dominodatalab.com/blog/a-guide-to-machine-learning-models)访问并保护有价值的数据。它还提供了一个完全可审计的环境,允许主要利益相关者通过满足任何法规遵从性要求的安全工作历史及时跟踪项目。
如果您的公司尚未将模型治理应用到您的数据科学项目中,或者如果您正在寻找将治理系统化地实现到未来项目中的方法,请花几分钟时间[观看 Domino Enterprise MLOps Platform 的演示](https://www.dominodatalab.com/demo/),或者通过[免费试用](https://www.dominodatalab.com/trial/)亲自探索其治理工具。
[![The Practical Guide to Accelerating the Data Science Lifecycle Lessons from the field on becoming a model-driven businesses. Read the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/733c37e12c2c7c37295fb3198e3a226a.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/c77ca351-ae85-425a-9ee3-c264b3bc4a69)
# MLOps 成熟的 7 个阶段:如何构建最大化数据科学投资回报的关键能力
> 原文:<https://www.dominodatalab.com/blog/the-seven-stages-of-mlops-maturity>
我很幸运地与一些最成熟的全球公司合作,研究他们的人工智能/人工智能计划。这些公司包括财富 500 强中许多家喻户晓的名字,来自保险、制药和制造等不同行业。每个公司都有几十到几千名数据科学家。虽然他们在人工智能和 ML 方面有大量投资,但在 MLOps 方面,他们表现出惊人的成熟度。
在这篇文章中,我花一点时间来看看我从与这些公司的合作中学到了什么,并分享他们在 [MLOps](/resources/a-guide-to-enterprise-mlops/) 旅程中出现的共同主题。我这样做的目标是提供一个框架,高管和领导者可以通过这个框架来衡量他们迈向人工智能卓越之旅的进展。
## 定义 MLOps
以我的经验来看,MLOps 的[定义取决于受众。对于技术从业者,我会说,“MLOps 是特定于数据科学生命周期的开发运维任务的自动化。”对于关注跨组织扩展的高管,我首先会使用术语“企业 MLOps”,然后我会说,“企业 MLOps 是一组技术和最佳实践,可简化跨多样化企业的大规模数据科学模型的管理、开发、部署和维护。”](/data-science-dictionary/mlops)
通过这种方式,MLOps 加快了一些领导者所称的"[模型速度,"](/blogs/model-velocity)"模型速度是公司在确保模型安全性、安全性和准确性的最高标准的同时可以生产模型的速度。
## 将技术能力与商业价值联系起来
在考察这些公司采用的技术 MLOps 能力时,有一些共同的主题。它们自然地分成几组,并表现出向高度成熟发展的趋势。我将使用成熟度曲线来帮助指导这些概念的讨论。沿着 x 轴将是 MLOps 能力的几个分组。y 轴是公司从每个分组中获得的商业价值。
最成熟的组织基于对业务价值的合理评估,优先考虑添加新的 MLOps 功能。他们的北极星是优化他们整个 ML/AI 投资的 ROI。为了给每个价值陈述增添质感,我将分享分析领导者的直接引语。听到他们用语言表达他们通过采用 MLOps 功能所看到的价值是很有趣的。
## 加速研究
**![Enterprise MLOps Maturity Curve graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/21670957dce5cd4350bcd96f15f5a3c2.png)**
对数据的访问,对数据科学家日常使用的工具和 ide 的访问,以及对硬件的访问是第一组能力。为了扩大数据科学研究的规模,软件环境必须基于像 Docker 这样的容器技术。并且这些组件中的每一个都必须以一种 IT 不太介入的方式进行自助服务。如果一个数据科学家必须填写一张票,发送一封电子邮件,或扮演 Linux 管理员来访问这些,我们就偏离了轨道。
这种能力组合带来的商业价值是加速研究或更快地将数据转化为见解。在 MLOps 的初始阶段取得成功后,一家制药公司的数据平台总监说:“以前,可能需要两到三周的时间来了解和启动基础架构,然后开始工作。过去需要几周时间,现在只需点击一下按钮。”高效。
## 部署
**![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0682f9adbd75cf28ade6d2e7a42e2859.png)**
在下一组普遍采用的功能中,我们可以调度作业、管理实验的细节,并拥有某种类型的自动化部署流程,如 CI/CD 管道。这有助于高效部署报告、应用程序、模型和其他资产。决策科学和软件服务的一位高级主管对当你达到这个成熟阶段时可能会出现的情况进行了描述,他说“当我们建立模型时,我们现在就可以发布应用程序…我团队中的任何人都可以在不到一周的时间内完成,有些人可以在几个小时内完成。”
## 高级人工智能解决方案
**![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/3811d55193d4b53b51b30ea4d3d9d322.png)**
在成熟的下一个阶段,公司通常会寻求构建一个堆栈,以创建现代、复杂的分析解决方案。这种复杂性的提升来自更大的数据规模(分布式框架)、数据中的相互关系(管道和功能服务)以及复杂的类似人工智能的解决方案(深度网络)。
此外,我们超越了基本的模型托管,考虑大规模托管和具有更复杂推理机制的托管模型。达到这种水平的 MLOps 成熟度代表了两个重要方面的重要里程碑。首先,能够达到这一水平的组织可以比竞争对手更快地扩展高级人工智能解决方案。
这些组织是推动其行业挑战旧规范并创造新收入流的颠覆者。例如,保险公司正在重新思考人工智能如何改变客户的索赔流程,制药公司正在将人工智能与生物标记相结合,为患者定制治疗。第二,处于 MLOps 成熟阶段的公司可以吸引和留住顶级分析人才,这是当今竞争激烈的人才市场的重要一点。
这些优势可以为数据科学团队带来显著的新功能。正如 FinServe 首席顾问所说,“我们当然正在实现更精确的模型,甚至是我们以前无法用更复杂的工作流实现的模型。”
保险行业的一位曹(音)说,“如果我们没有先投资[MLOps],我根本就不可能建立一个团队,因为如果不为他们提供最先进的工作环境,你就无法[雇用高技能的数据科学家](/resources/field-guide/hiring-data-science-teams)。”
## 示范安全网
**![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0abdb34cf4a49bbee2ca723908f4de9b.png)**
在我们达到来自 MLOps 投资的价值拐点之前,还有一项功能需要添加。如今,大多数公司都明白监控其生产模型的重要性,以提供一个抵御模型风险的安全网。正如一家保险公司的机器学习负责人解释的那样,“数据漂移可能对预测产生关键影响,最终影响我们的业务。”
## 拐点
正在实现其人工智能战略目标的公司不会孤立地实现这四组能力。他们认为它们是统一 IT 框架的一部分。对于这些公司来说,他们的 MLOps 功能遵循一致的策略,这导致 IT 部门可以在没有通常的英雄主义的情况下进行管理。
此外,他们非常重视数据科学家的角色。他们将数据科学家视为自己的客户。这可能包括统计分析师、定量分析师、精算师、临床程序员等。
这个想法是,他们不是从不同的开源 MLOps 技术中提取零碎的东西,而是将所有这些东西放在一个保护伞或平台下,根据数据科学优先的原则将这些能力结合在一起。这种以数据科学为先的思维方式体现在几个微妙但重要的方面,从跟踪元数据的方式到模型再训练自动化的方式。
这个拐点右侧的公司是那些在整个企业中成功扩展人工智能和人工智能的公司。
## 标准化、协作、简化、板载
**![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/69aaf80012863786c48dfa577a397303.png)**
超越拐点的第一组功能采用了容器的概念,并将其发展为一个数据科学容器管理系统,专为数据科学家的工作和协作方式而构建。这包括管理、共享和版本控制。这也使得数据科学家修改和构建容器变得容易。此外,它还包括一个可搜索的知识库,其中可以标记、存储和索引工作的所有元数据,以便于发现和轻松协作,从而减少浪费的时间并加快项目的启动。
该组还包括一个再现性引擎,其中您的工作痕迹就在您面前,很容易为审计人员和监管人员验证模型血统,并且只需单击一个按钮即可重新创建过去的工作。我还在这个组中包含了一个模型注册中心。拥有一个在一个地方捕获和管理所有模型的中央存储库是模型风险管理和模型治理的基础。
我工作过的大多数大型企业在其业务线、IT 部门、运营组织、研究团队和中央卓越中心中都有数据科学团队。基于 [MLOps 最佳实践的标准化](/blog/mlops-best-practices-for-large-organizations)在这种多样性的团队中培养强大的协作能力,从而实现规模化。在谈到这一价值时,一家生命科学公司的工程和数据科学高级总监指出,“[成熟的 MLOps 支持]可再现性和发现。然而,真正的知识加速发生在平台上发现他人的研究。通过简单的关键字搜索,科学家可以找到其他相关的研究或主题专家。"
## 最佳模型健康和风险规避
**![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6469445a6abaf5c63bc63c6f67a67e85.png)**
在通过专注于统一的、最佳实践的、以数据科学为中心的 MLOps 方法实现这一价值飞跃后,更先进的组织会关闭模型风险和模型健康的环路。他们通过与之前采用的数据和研究能力相集成的监控来实现这一点。
当模型出错或数据漂移时,自动警报会触发补救工作。还集成了模型验证,为公司或监管框架要求提供内部检查。这可能包括偏见检查、同行代码审查、模型卡创建或可解释性分析。
关键是,任何人看到一个模型都可以理解风险是如何被减轻的,并看到这个模型是如何被创建的。这优化了模型健康并避免了风险。正如一家保险公司的机器学习负责人解释的那样,“[集成]模型监控为我们节省了以前花费在维护和调查上的大量时间,并使我们能够实时监控模型性能,并将其与我们的预期进行比较。”
## 可重复的人工智能利润和安全人工智能
**![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6e1dc6c92314dd97fa50b24d6910bc20.png)**
这最后一组功能对集中 MLOps 特性的想法提出了挑战。正是在这里,领导者们终于拥有了一个像机器一样运行的人工智能程序,在保持所有数据和知识产权安全的同时,输出一系列可靠的盈利、产生投资回报的模型。
第一个概念是项目管理。必须为数据科学家的工作方式建立工作流程,以便他们的研究能够以流畅的协作方式进行。项目流过熟悉的阶段,有逻辑检查点。该项目成为数据科学工作的记录系统。
所有这些都需要在一个集中的平台上进行,以便 IT 部门能够确保安全性、管理用户和监控成本。合作者、领导者、主题专家、验证者、数据工程师、云开发人员和分析师都可以参与项目工作,同时让平台管理安全问题。有了这些结构,您的数据科学团队就成了创收机器。我甚至见过为数据科学团队设定收入目标的公司。一家制造企业的董事兼首席数据和分析官最近解释了这些变化的转型性质:“(我们的)平台是我们现代数据科学环境的核心,它帮助我们最大限度地提高了数据科学团队的效率、生产力和产出,帮助我们推动创新以支持客户的使命。"
## 从哪里开始自我评估
考虑您自己的 MLOps 之旅,并评估您在成熟度曲线上的位置。制定计划来填补你战略中的空白。请记住,超越价值拐点的关键是以数据科学为中心的方式紧密集成所有功能。远见和规划是必需的,否则你最终会得到一堆特性和功能,这些特性和功能会抑制而不是加速扩展。做对了这一点的公司将会看到他们的人工智能/人工智能投资的巨大回报。
编者按:Josh Poduska 最初为 [撰写这篇文章,面向数据科学](https://towardsdatascience.com/the-seven-stages-of-mlops-maturity-ccb029530f2) ,经同意在此转载。
[![Free Tool Model Velocity Assessment How could your data science team improve its processes? Find out in minutes by reviewing your data science lifecycle. Get your score](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/43163b315136b1033cb91d806bfafece.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/8c274ad2-80a7-4f78-94cc-02aeccd2d52c)
# 每个 Pacoid 的主题和会议,第 10 集
> 原文:<https://www.dominodatalab.com/blog/themes-and-conferences-per-pacoid-episode-10>
*联*** Paco Nathan 提供了数据科学领袖峰会 Rev 2 的亮点。*
## 介绍
欢迎回到我们每月一次的主题发现和会议总结。我们于 5 月 23 日至 24 日在纽约市举办了 Rev 2,作为“数据科学领导者及其团队相互学习的地方。”会议比去年增加了一倍多:2 天,3 个轨道,5 个赞助商,39 场会议,65 个演讲者,600 个与会者。许多评论、讨论、辩论等。,在社交媒体上大声说话,我会在这里提供一些指点。请注意,文章中没有足够的篇幅来充分涵盖这些演示,所以我将重点介绍主题演讲和几个我最喜欢的演讲。视频稍后会出来。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/544f9369d27c4924f10e79e7eaf2fe53.png) Nick Elprin, CEO and co-founder of Domino Data Lab. Image Provided Courtesy of [A.Spencer of Domino.](https://blog.dominodatalab.com/author/ann-spencer/)
## 领导力
我们清单上的第一项:Rev 2 提到如何领导数据团队了吗?是啊!在很多很多方面。引用 Duo Security 的 Brian Lindauer 的话:
* “非常享受[#多明诺夫](https://twitter.com/hashtag/dominorev?src=hash)的工作,以至于我想给数据科学的领导者们留一点时间。如果你领导一个数据科学团队/组织,请给我发邮件,我会邀请你参加[data-head.slack.com](https://data-head.slack.com/)
我们让数据科学领导者介绍了在领导数据科学团队时学到的经验教训,涵盖了可扩展性、模型驱动、模型知情以及如何有效塑造公司文化等关键方面。作为 Rev 的联合主席之一,我很遗憾没能看到每一场会谈。再次,我期待着视频!
## 数据科学领导力:规模、文化和专业化的重要性
我最喜欢的演讲之一,也是我不断听到与会者引用的一个演讲,是米歇尔·乌福德在第一天的主题演讲“网飞的数据科学:速度和规模的原则”。首先,她的幻灯片棒极了!其次,我在后台与 Michelle 进行了交谈,她通过从事机器学习项目进入了该领域,尽管最近她领导了支持数据科学团队的数据基础设施。她从大规模数据工程的角度,对数据科学团队的领导者有很多话要说*到*。我所说的“规模”是指任何非云提供商的上市公司在云中最大、最成功的数据分析操作。网飞是云原生的,建立在复杂的数据科学实践文化之上。就个性化而言,基于模型的决策的巨大规模令人吃惊;如果没有机器学习,像手动选择成千上万个节目的视频帧这样的工作就不可能实现。
Michelle 的演讲考察了简单性和灵活性之间的组织权衡,特别是通过实践如何随时间演进的视角;例如,组织如何应对挑战。我觉得网飞的工程实践非常有趣,因为 Ariel Tseitlin 领导了那里的云解决方案。例如,在 Rev 的前一天晚上享用晚餐时,一位密友质疑 Jupyter 在探索性数据科学之外的用途。我问,“你见过网飞的造纸厂吗?”第二天,Michelle 不假思索地提到了 Jupyter 笔记本电脑在生产中的应用,尤其是数据工程师的应用。换句话说,当你遇到一个问题时,让别人下次遇到同样的问题时更容易理解。让这成为公司文化的一部分。这就是工程的本质。朱庇特非常适合这个目的。
https://twitter.com/RandiRLudwig/status/1131563503121326080
Michelle Ufford 的另一项观察发现:对于数据团队如何处理问题,有太多的规定性规则会导致脆弱的过程和无效的文化。换句话说,团队级别的[自治](https://twitter.com/RandiRLudwig/status/1131570857522978816)允许更有效地扩展:
“我们雇佣有能力的人,然后离开他们。我们尽量减少政策,取消限制,给每个人自由和责任。”
我对此的反应是发自内心的。希望我能引用米歇尔过去 15 年的话!哇,这是我见过的公司(就我而言,过去的 5-6 家雇主)最大的绊脚石之一,公司领导人*禁止*如何处理数据,如何分析数据,以及如何组织数据科学团队。因为原因。因为不良文化。因为河马周围的焦虑和误解(收入最高的人的观点),他们可能对技术和用例知之甚少。坏事就是这样发生的。在我见过的最令人震惊的[案例之一](https://secure.imvu.com/welcome/ftux/)中,一家硅谷科技初创公司的 [CEO](https://www.youtube.com/watch?v=HhwgyKDPHG4) 禁止员工为被解雇的前同事写 LinkedIn 推荐信。虽然花了几年时间,但最终他们的董事会在遭受巨大损失很久之后,还是让这位首席执行官离开了。
如果你没有注意到,企业高管通常不擅长禁止数据实践。事实上,[最近的行业调查](https://www.oreilly.com/ideas/three-surveys-of-ai-adoption-reveal-key-advice-from-more-mature-practices)指出了如何:
1. 公司文化是企业采用有效的数据相关实践的最大绊脚石之一。这些问题往往来自高层,即董事会层面的误解。
2. 许多拥有复杂数据实践的企业组织将这些决策交给数据科学团队领导,而不是高管或产品经理。
Michelle 的观察是我第一次在数据科学中看到与 Bruce Schneier 在他的书《超越恐惧:在不确定的世界中理智地思考安全问题 中关于安全的观点相对应的观点。套用 Schneier 的话来说,这就是集中化和统一性如何使安全工作变得脆弱:“深度防御,这意味着重叠责任以减少单点故障,无论是实际的防御事务还是情报职能。”同样,从认知的角度来看,集中化和统一性使数据科学方法变得脆弱,禁止领导是一个严重的失误。这与实现规模化不相容。
米歇尔和我在后台争论的一个主观观点是:*专业化*。
在网飞这种规模的组织中,团队需要与众不同。她的演讲提出了数据科学领域的人员进入专业角色的职业道路,如数据可视化工程师、算法工程师等。我通常反对过于专业化的职称——考虑到我们的领域是基于跨学科工作的。即便如此,我还是百分之百同意米歇尔的观点,我可以这样解释:引进擅长做多面手的人,然后让他们深入自己热爱的领域。这种方法非常适合企业的差异化需求。
## 数据科学领导:模型驱动和模型信息的重要性
考虑到 Rev 2 在很大程度上是关于领导力的,我很想把所有的评论放在同一个标题下。那不太公平,但是至少再多几个怎么样? [Randi Ludwig](https://twitter.com/RandiRLudwig) ,戴尔技术公司的数据科学负责人,从 Domino 数据实验室的首席执行官和联合创始人 Nick Elprin 那里获得了这些关于模型驱动业务重要性的[禅 káans](https://twitter.com/RandiRLudwig/status/1131579022100586496):
* “数据驱动就像通过观察后视镜来导航。模型驱动就像使用 GPS 一样。”
* “如果您的企业正在使用大数据并将仪表盘放在分析师面前,您就没有抓住要点。”
* “模型驱动是指足够自律,实际使用模型来做决策。仅仅做机器学习是不够的,有时甚至没有必要。”
* 还有…我最喜欢的 Rev 2 中的一句话…(等一下)…
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e0d7103e36b173571106d6a7e9af75c1.png) Nick Elprin. Image Provided Courtesy of [ A.Spencer of Domino](https://blog.dominodatalab.com/author/ann-spencer/)
这条箴言:“如果你不是一个模型驱动的企业,你很快就会输给一个。”
除了[模型驱动的业务](https://twitter.com/DominoDataLab/status/1031567846378233856),另一个引起 Rev 2 与会者强烈共鸣的术语是[首席执行官兼 Coatue 联合创始人 Thomas Laffont](https://twitter.com/thomas_laffont) 所说的“模型信息”。FWIW,我的[主题演讲](https://derwen.ai/s/79q6)(【数据科学:过去和未来】“[见爆头表情符号](https://twitter.com/outoftheverse/status/1131934099629903872))是在 [Matthew Granade](https://twitter.com/MatthewGranade) 与 Thomas 和来自 Coatue 的 [Alex Izydorczyk](https://twitter.com/aleksizy) 的讨论之后。它们涵盖了我将要讨论的许多项目;我对他们小组的跟进似乎主要是将他们的关键点分解到时间线上,同时总结一些来自本专栏的更非传统的见解,然后预测可能的近期结果。像你一样。
https://twitter.com/RandiRLudwig/status/1131923454381502464
我对模型在“元合成-变量-吞噬世界”连续体中的位置的看法?
1. 我们领导人员加自动化(例如,模型)的团队来满足客户需求,在这些实体的任何一对之间都可能有许多惊人的双向反馈循环。也许不是模型驱动的,也不是无信息的,而是模型缠绕的。因为 I <3 图,网络,张量等等。话说回来,Gartner 和 Forrester 并不急于收购我的产品线。
2. 试图剖析一个模型来推测对其结果的解释是抛弃许多关键信息的好方法——特别是关于进入我们工作流程的非自动化输入和决策——这些信息是减轻存在风险所必需的。因为合规。诚然少了笛卡尔,多了[周三亚当斯](https://www.youtube.com/watch?v=2V8wDnSopaY)T2。
## 认知、决策和偏见
我们清单上的第二项:Rev 2 是否挖掘了一些关于认知和决策的奥秘?检查!
## 丹尼尔·卡内曼:扬声器出处
当被问及“谁会是关于数据科学领导力的著名演讲者?”我的回答几乎是立即的:丹尼尔·卡内曼。作为普林斯顿的心理学教授,畅销书《T2》《T3》《思考的快慢》《T4》《T5》的作者,[行为经济学的共同发明人](https://en.wikipedia.org/wiki/Behavioral_economics)(和阿莫斯·特沃斯基一起),以及 [2002 年诺贝尔奖获得者](https://www.nobelprize.org/prizes/economic-sciences/2002/kahneman/facts/):
“将心理学研究的见解融入经济科学,尤其是关于人类在不确定情况下的判断和决策。”
我记得大约在 2012 年,一个“数据饮酒小组”在帕洛阿尔托的一家酒吧聚会,我无意中听到皮特·斯科莫洛赫和其他数据科学家谈论卡尼曼的工作。相反,他们喜气洋洋地谈论卡尼曼的工作及其在我们领域的重要性。显然,当我们处理数据和机器学习时,我们正在不确定性下的决策水域中游泳。无论一个组织是模型驱动的,还是模型通知的,或者任何与模型相关的相邻描述符,在某个点上,我们正在管理人员加上自动化的团队,并且人员——特别是他们的[领导](https://medium.com/leadership-motivation-and-impact/what-i-learned-from-thinking-fast-and-slow-a4a47cf8b5d5)——必须有效地处理概率过程。这就是诺贝尔委员会提到的人类判断发挥作用的地方。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8ee29c3eba240201e60e466d778de8ae.png) [Pete Skomoroch](https://twitter.com/peteskomoroch). Image Provided Courtesy of [A.Spencer of Domino.](https://blog.dominodatalab.com/author/ann-spencer/)
Pete [描述了](https://blog.dominodatalab.com/machine-learning-product-management-lessons-learned/)一般来说,机器学习如何将工程从确定性过程转变为概率性过程。不幸的是,人类不擅长概率。人类似乎是被进化硬连线成尖叫“呸!有怪物,大家快跑!”此外,考虑有人大喊“着火了!”在拥挤的剧院里。人类通常不会停下来评估怪物或火灾的可能性,在行动前会仔细思考。相反,他们往往会在匆忙逃离时相互踩踏。
## 克服认知偏差的影响
https://twitter.com/adelanyo/status/1131559485447856129
我们在 Rev 2 的第一天主题演讲中,卡尼曼博士介绍了“直觉判断和选择的心理学”你可以在 [Twitter 帖子](https://twitter.com/pacoid/timelines/1134862788545744896)上看到许多精彩内容。由于 Claude Shannon,噪声及其与 T2 信息论的密切关系在 20 世纪中期成为使用概率工具的研究主题。在他的主题演讲中,卡尼曼提出了一个探索噪音与人类认知和决策的主题。
* [tweet-quote](https://twitter.com/DominoDataLab/status/1131563226880258048) :“人类有很多有价值的输入;他们有印象,他们有判断。但是人类不太擅长以可靠和健壮的方式整合信息。这就是算法的设计目的——它们减少噪音。”
* [tweet-quote](https://twitter.com/RandiRLudwig/status/1131553870033891330) :“人类是嘈杂的,我们更喜欢自然的而不是人工的,尽管模型通常比人更好。”
* [tweet-quote](https://twitter.com/pacoid/status/1131557909429653504) :“人们在做出决定后需要一个对结果感觉良好的故事——只是不要太快。先讨论证据再讨论直觉。”
除了介绍,即更多的描述和轶事方面,卡尼曼探索了我们可以用来克服认知偏见影响的工具。对我来说,最深刻的是一种测量组织内部噪音的简单方法。要做到这一点,首先要审查员工做出的量化决策,例如,保险理赔员报出的结算价格。衡量这些决定在你的人群中是如何变化的。然后计算[方差除以均值](https://twitter.com/pacoid/status/1131557909429653504)来构建决策中噪声的度量。公共服务建议:一定要把那个流氓包在[置信区间](https://www.mathsisfun.com/data/confidence-interval.html)里。
Kahneman 描述了在许多专业组织中,人们如何直观地估计该指标接近 0.1——然而,在现实中,该值通常超过 0.5,因此员工的总体决策过程比随机决策过程表现更差。比扔硬币还糟糕!对于 kicks,尝试在您自己的组织内计算这种指标。显然,在这些情况下,成为模型驱动解决了一个存在的风险,这就是 Nick Elprin 在他的主题演讲中提出的观点。更好的训练(对人和对模型)也被指出。
另一个微妙但有力的建议是:在会议辩论开始前收集证据,以避免确认偏差。换句话说,在任何人开始表明立场之前,让人们私下表达他们的担忧。否则,人们会倾向于支持早期表达的观点。卡尼曼[描述了](https://twitter.com/RandiRLudwig/status/1131555361595506688)T4【决策分析】的历史:
*“决策分析要接管业务,但后来首席执行官们不想要了。他们不想犯错或事后批评。当 ML 模型开始预测首席执行官的决策以及他们是否感到威胁时,这将是令人着迷的。”*
真心话很少说。这里有一点很重要,数据科学实际上只解决了一部分难题。决策分析有一个完全不同的领域,涉及我们如何处理数据科学提供的行动。最近有一些人对这一点颇有微词——卡西·科兹尔科夫和 T2·阿贾伊·阿格拉瓦尔最先出现在我的脑海中。卡尼曼认为,一旦 ML 模型开始扰乱/自动化高管决策的价值,这一切都会让*变得真正*有趣。
## 用预死亡解决认知偏差
这可能需要一段时间。就近期而言,卡尼曼建议使用[前预测](https://en.wikipedia.org/wiki/Pre-mortem)——也称为逆向预测,作为预测的逆命题。这种做法在引入会议中固有的认知偏见之前,正式确定了收集证据的方式。这是一种利用人类认知偏见产生切实结果的方式。
参加 Rev 的其中一个人是 Carl Spetzler,他是 T2 拉姆齐奖章获得者,也是 SRI 名人堂的决策分析专家。在会议后期,我与卡尔进行了交谈,我强烈推荐他最近的“ [Rethink: Premortem 3.0](https://sdg.com/webinars/premortem-3-0-best-prevention-postmortem/) ”网络研讨会。虽然网上研讨会的讨论开始有点奇怪,但人们很快意识到他们(1)正在与现场观众一起运行预分析的组件,以及(2)利用主持人来减少偏见。他们正在使用一个名为 [PowerNoodle](https://www.powernoodle.com/) 的基于云的工具来自动化一些死前过程的机制。
说真的,在我的下一次创业中,没有先利用事前分析就安排会议很可能会成为一种可解雇的罪行。这种实践对于支持多样性和包容性,对于避免由于人类概率困难而可能被忽略的灾难,对于消除在会议中一次又一次听同一只河马嗡嗡叫而浪费的时间,都是必不可少的。
公平地说,卡尼曼说了一两句让我皱起眉头的话。其他与会者也有同感。有人评论 ML 模型中嵌入了[偏见,与歧视有关,我不太相信他说的话。此外,Kahneman 似乎在多个点上谈论 ML 模型的全自动使用,而没有考虑模型评估、审计、人在回路、模型透明度或当前其他相关问题。在他的主题演讲后有一个活跃的问答环节,如果我们有更多的时间,我很想深入探讨这些问题。](https://twitter.com/outoftheverse/status/1131559763907698690)
## 实际上,困难的问题
[克里斯·维金斯](http://www.columbia.edu/~chw2/)是哥伦比亚大学教授,《纽约时报》首席数据科学家, [hackNY](https://hackny.org/) 的联合创始人。如果你研究一下我们领域的起源,你会很快发现 Chris 一直在撰写和教授有关数据科学的历史,例如,哥伦比亚大学的“[数据:过去、现在和未来](http://www.columbia.edu/~chw2/)”课程——你可能已经注意到,这是我最喜欢的主题之一。尽管我们从未见过面,但我们已经参与论坛好几年了。可以说,我从与克里斯的几次交谈中学到的东西比会议其他人学到的加起来还多。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/1c46b5e761730247a795a07802074c90.png) [Chris Wiggins.](http://www.columbia.edu/~chw2/) Image Provided Courtesy of [A.Spencer of Domino](https://blog.dominodatalab.com/author/ann-spencer/)
在他的第二天会议演讲“纽约时报的数据科学”中,Chris 以“演讲”开始,几乎我的每个编辑都让我坐下来重新讲述新闻业中的“政教分离”。他将这两个关注点的图表显示为单独的框,然后添加了另一个标有“数据”的框,作为两者的共同基础。通过区分*描述性分析*、*预测性分析*和*规定性分析*,Chris 讲述了几个关于经理如何从数据科学中要求一种可交付成果,而需要完全不同的东西的故事。在我们的领域中,领导力的一个关键方面是认识到这些区别,并重新构建项目以适应业务需求,而不仅仅是响应请求。例如,一个*描述性*仪表板的请求“比较红色按钮或蓝色按钮是否导致较低的流失率”可能更好地由一个*说明性*模型提供,以个性化页面,使客户流失率更低。不要犹豫,要积极主动。另一个主题是关于内部决策的项目结果作为面向客户的产品出现的频率——只要销售人员看到哪些见解可以浮出水面,然后货币化。这是对数据科学和我们团队流程跨学科本质的重要提醒。
https://twitter.com/pacoid/status/1131975765594169346
NYU 大学创新分析研究员、[柯勒律治倡议](https://coleridgeinitiative.org/)的联合创始人 Julia Lane 在第一天发表了题为“数据在哪里:社会科学搜索和发现的新方法”的会议演讲。这项工作是根据最近成为联邦法律的[循证决策法案](https://www.congress.gov/bill/115th-congress/house-bill/4174)进行的。它也代表了 Jupyter 项目当前关注的一部分:增加对协作、增强的安全性、作为顶级实体的项目、数据注册、元数据管理和使用遥测的支持。主要的工作称为[富上下文](https://github.com/jupytercalpoly/rich-context-demo),为近期利用 Jupyter 和其他基于 [FedRAMP 合规性](https://www.fedramp.gov)的敏感数据开源项目铺平了道路。从长远来看,它将利用机器学习和知识图合成/推理来支持高度监管环境中的协作数据科学工作。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/55ff0d11b34645c61043d347c6cf12f7.png) [Julia Lane](https://wagner.nyu.edu/community/faculty/julia-lane#). Image Provided Courtesy of [A.Spencer of Domino](https://blog.dominodatalab.com/author/ann-spencer/)
假设来说,如果特定的联邦计划有被削减的风险,除非他们能证明他们的结果,但所需的数据是在人口普查,国税局,平视显示器,伊利诺伊州校正等。,不可能在保持合规性的同时运行跨机构的连接…那么很明显,许多重要的社会服务面临被削减的风险。朱庇特和 NYU 一直忙于解决这个问题。除了政府用例之外,这项工作对于一般企业中的数据科学具有巨大的效用。完全披露:我是这一努力的一部分,并代表 NYU 提供咨询。
在另一个我最喜欢的演讲中,来自美国陆军特种作战司令部的 Robert Toguchi 在第一天发表了“培养变革文化”的演讲。与企业规模和数据科学的合规性要求相比,军方面临着企业组织特有的巨大挑战,以及与机器学习进步保持同步的额外方面。后者还有一个微妙之处,即快速发展的[对抗性机器学习](https://github.com/kenny-co/procedural-advml)领域正变得越来越具有对抗性。在不深入细节的情况下,人们甚至可以发现代表大国最新人工智能技术的人工智能团队在 Kaggle 上相互竞争——这不再是“代理战争”的问题,而是在真实和模拟之间交换数据集的问题。换句话说,这些可能会升级为更激烈的冲突。国防部可以从企业学习数据科学的经验中获益良多,也可以从开源中获益良多。鉴于过去十年左右大数据的“提交者战争”,我发现这一点特别有趣:现在我们在流行的开源项目中看到更多的非供应商贡献者。我认为这是一个健康的趋势。
此外, [Josh Wills](https://twitter.com/josh_wills) 发表了第一天的闭幕主题演讲“如何与他人合作”,这可以说是关于数据科学和领导力的最务实的演讲之一,尤其是关于“无限循环的~~悲伤~~同理心”的部分。这与“[用数据计算:概念和挑战](https://www.tandfonline.com/doi/abs/10.1080/00031305.1999.10474434)”中的另一个著名例子非常吻合,约翰·钱伯斯(R 语言的发明者)引用了约翰·图基(数据分析的发明者)。只要有机会,就跑,不要走,去听乔希讲话。
## Rev 2 总结
我们跟随 Josh 参加了一个名为[感官数据科学](https://medium.com/derwen/data-science-in-the-senses-5fb72c758f11)的社交聚会,展示了几个利用感官数据的项目。这甚至包括一种定制鸡尾酒,仅在 Rev 2 中提供。对于另一个“仅在第二版”的功能,我们放弃了[袜子](https://twitter.com/pacoid/timelines/1134953656057339904)作为施瓦格!当我们到达纽约时,我几乎忘记了几个月前的一项任务,我们在那里描述了数据科学历史上的名人,然后制作了袜子来纪念他们:格蕾丝·赫柏、托马斯·贝叶斯、凯伦·斯帕克·琼斯、约翰·图基、阿达·洛芙莱斯。为了确保 NLP 的代表性,我当然买了[凯伦·斯帕克·琼斯](https://twitter.com/pacoid/status/1131626015040655361)的袜子。
https://twitter.com/LeapingLlamas/status/1131973679192203266
Rev 2 提供了一个难得的、非常需要的关于数据科学领导力的论坛,团队可以在这里相互学习实践。多米诺数据实验室赞助了这种独特的形式,特别是联合主席乔恩·鲁尼(Jon Rooney)和 T2(Karina Babcock),他们熟练地处理了会议发言人的介绍,并为会议做了大量的核心工作。我想说这是一个独一无二的事件,除了我们每年都这样做。2020 年 Rev 3 见!
## 即将举行的活动
要在日历上标记的与数据相关的[事件](https://derwen.ai/events#watchlist):
* [佩塔卢马沙龙](https://www.meetup.com/Petaluma-Salon/events/260912356/),6 月 5 日——我将主持一场关于约翰·巴尔的人工智能主题书评,
“脸书和中国正在争相成为对方吗?”
* 伦敦,6 月 10 日至 12 日
* [麻省理工学院 EmTech Next](https://events.technologyreview.com/emtech/next/19/) ,6 月 11-12 日,波士顿
* [Jupyter 社区研讨会](https://blog.jupyter.org/jupyter-community-workshop-south-america-d8e482652952),6 月 22-23 日,科尔多瓦
* [git 提交展](https://blog.invidelabs.com/git-commit-show/),6 月 22-23 日,在线
* 7 月 5 日至 6 日,柏林
* [OSCON](https://conferences.oreilly.com/oscon/oscon-or/public/cfp/746) ,7 月 15 日至 18 日,CFP:我将于 7 月 16 日主持“ML 运营:管理端到端 ML 生命周期”专题讲座
# 每个 Pacoid 的主题和会议,第 11 集
> 原文:<https://www.dominodatalab.com/blog/themes-and-conferences-per-pacoid-episode-11>
*[Paco Nathan](https://twitter.com/pacoid) 的最新文章涵盖了程序合成、AutoPandas、模型驱动的数据查询等等。*
## 介绍
欢迎回到我们每月一次的主题发现和会议总结。顺便说一句,第二版的视频出来了:【https://rev.dominodatalab.com/rev-2019/
甲板上这次的‘绕月:*节目综合*。换句话说,使用元数据来生成代码。在这种情况下,会生成用于数据准备的代码,数据科学工作中的大量“时间和劳动”都集中在这里。SQL 优化提供了有用的类比,给出了 SQL 查询如何在内部被转换成查询图**,然后真正聪明的 SQL 引擎处理该图。我们在[气流](https://airbnb.io/projects/airflow/)等方面看到的一个长期趋势是**将基于图形的元数据外部化**,并在单个 SQL 查询的生命周期之外利用它,使我们的工作流更加智能和健壮。让我们把细节留到下一次,但简单来说,这项工作会引出关于数据集的知识图表和 [Jupyter](https://jupyter.org/) 支持的新特性。**
**## 程序合成
如果你还没看过 AutoPandas,去看看吧。要点是这样的:给一只[熊猫。DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html) ,假设您需要通过对其中一列执行``groupby()``来聚合数据,然后计算分组值的平均值。您可以将数据帧的“之前”和“之后”版本作为输入输出示例对提供给 AutoPandas。然后点击 AutoPandas 中的*合成*按钮,获得 Python 中的一段代码。完了,完了。
作为程序合成的背景,我们通过编写详细的指令来给计算机编程似乎有点奇怪。一大群软件工程师,每天 24 小时埋头苦干——真的必须这样吗?Don Knuth 在他的“[识字编程](http://www.literateprogramming.com/knuthweb.pdf)”文章中提出了一个著名的相关问题:
让我们改变对程序构造的传统态度:与其想象我们的主要任务是指导计算机做什么,不如让我们集中精力向人类解释我们希望计算机做什么
顺便说一句,Knuth 1983 年的那篇文章可能是我第一次看到“Web”这个词被用作与计算机相关的意思。不知道蒂姆·伯纳斯·李在创建万维网时是否重复了这一点。无论如何,Knuth 对*文化编程*的描述指导了很多后续工作,包括【Jupyter 项目。最终目标是让人们解释他们需要做什么,然后让计算机生成或合成代码来执行所需的操作。这难道不像是机器学习的一个有价值的目标吗——让机器学会更有效地工作?这就是*节目合成*的主旨。
程序综合的许多早期工作倾向于集中在特定领域语言(DSL)上,因为它们是相对受限的问题空间。比如你可以写一个基本的编程语言解释器作为[Scala](https://github.com/tpolecat/basic-dsl)中的一个小 DSL。实际上,Scala 因为实现了各种各样的 DSL 而广受欢迎。
然而,AutoPandas 有一个更大胆的计划。他们开始实现“宽”API 的程序合成,而不是“窄”受限的 DSL。这暗示了数据科学的工作,在这些工作中,许多繁重的数据准备工作都是在像 pandas、NumPy 等这样的库中完成的。,这似乎符合 AutoPandas 研究的意图。
## 自动潘达斯:起源
AutoPandas 是在加州大学伯克利分校 rise lab 创建的,其总体思想在 NeurIPS 2018 年的论文“[从输入-输出示例进行 API 函数的神经推理](https://www.carolemieux.com/autopandas_mlforsys18.pdf)”中有所描述,作者包括 Rohan Bavishi、Caroline Lemieux、Neel Kant、Roy Fox、Koushik Sen 和 Ion 斯托伊察。另见:卡罗琳·雷米尔关于 NeurIPS 演讲的[幻灯片](https://www.carolemieux.com/autopandas_mlforsys18_slides.pdf),以及罗汉·巴维希来自 2019 年夏季度假胜地的[视频](https://youtu.be/QD4xBW1JVQI)。
AutoPandas 的作者观察到:
* 流行数据科学包的 API 往往有相对陡峭的学习曲线。
* 当文档中找不到合适的例子时,人们会求助于在线资源,如 StackOverflow,以了解如何使用 API。
* 这些在线资源可能不太适合回答问题:版本问题、陈旧的答案、粗鲁/钓鱼等。
相反, *[程序合成](https://en.wikipedia.org/wiki/Program_synthesis)* 可以解决这些问题。换句话说,人们可以通过展示例子来描述他们想如何使用 API 的意图,然后收到合成的代码。在论文和视频中,作者描述了他们希望如何“自动化 API 的 StackOverflow ”,并提出了具体目标:
* 为现实的、广泛的 API(而不是狭隘的 DSL)开发一个程序合成引擎。
* 扩展问题以处理复杂的数据结构。
* 扩展问题以合成数百个函数和数千个潜在参数。
他们的方法是基于使用深度学习的组件,特别是使用[图嵌入](https://towardsdatascience.com/overview-of-deep-learning-on-graph-embeddings-4305c10ad4a4):
*“在高层次上,我们的方法通过以下方式工作:(1)将 I/O 示例预处理到图中,(2)将这些示例馈送到可训练的神经网络,该神经网络学习图中每个节点的高维表示,以及(3)汇集到神经网络的输出,并应用 softmax 来选择熊猫函数。在此之后,我们使用穷举搜索来找到正确的论点;这些细节超出了本文的范围。”*
对于训练和评估数据,他们使用 StackOverflow 中的[示例,Wes McKinney](https://stackoverflow.com/questions/tagged/pandas) (熊猫的创造者)的 [Python 用于数据分析,以及](https://www.goodreads.com/book/show/36313494-python-for-data-analysis)[数据学校视频系列](https://www.dataschool.io/easier-data-analysis-with-pandas/)。在问题的第一部分,用一个图来表示数据帧的输入输出例子。在问题的第二部分,涉及到一些搜索,潜在的搜索空间可能很大且很复杂。即使对于简单的“深度 1”解析树,搜索空间也具有 10^17 分支因子。早期,RISElab 研究人员的蛮力尝试能够将搜索空间缩小到 10^4—reduced 的 13 个数量级。令人印象深刻。使用最大似然模型进行更有效的搜索,将搜索空间缩小到 10^2—which,可以在适度的硬件上运行。那就更厉害了。
## 自动潘达斯:结果
到目前为止,AutoPandas 已经支持了 119 只熊猫。DataFrame 转换函数及其合成代码的结果引人注目。回到 StackOverflow,作者发现他们可以解决 65%的*熊猫。DataFrame* 问题。这是基于对结果的“top-1”评估,这意味着合成代码的最佳预测输出必须与 StackOverflow 上选择的答案相匹配。或者,就结果的“成功率”评估而言,AutoPandas 为 82%的 StackOverflow 答案预测了正确的功能等价。
在架构方面,AutoPandas 的前端运行在无服务器计算上,而其后端基于 [Ray](https://rise.cs.berkeley.edu/projects/ray/) 。后端处理的一部分需要深度学习(图形嵌入),而其他部分利用[强化学习](https://www.dominodatalab.com/blog/what-is-reinforcement-learning)。
展望未来,AutoPandas 团队打算扩展该系统以合成更长的程序,并可能将其移入开源。他们使用的方法适用于其他流行的数据科学 API,如 [NumPy](https://www.numpy.org/) 、 [Tensorflow](https://www.tensorflow.org/) 等等。这个领域肯定会变得有趣。
## 程序合成的一个范例
有关程序合成的更多背景信息,请查看詹姆斯·博恩霍尔特(James born Holt)2015 年的“[程序合成解释](https://homes.cs.washington.edu/~bornholt/post/synthesis-explained.html)”,以及亚历克斯·波洛佐夫(Alex Polozov)2018 年更近的“[2017-18 年程序合成](https://alexpolozov.com/blog/program-synthesis-2018/)”。
如果你想深入了解,这里有相关论文和文章的样本:
* "[用深度学习合成程序](https://alexpolozov.com/blog/program-synthesis-2018/)"-尼尚特·辛哈(2017-03-25)
* "[一个程序合成引物](https://barghouthi.github.io/2017/04/24/synthesis-primer/)"–Aws Albarghouthi(2017-04-24)
* "[从输入-输出示例中进行交互式查询综合](https://scythe.cs.washington.edu/media/scythe-demo.pdf)"——王成龙,阿尔文·张,拉斯蒂斯拉夫·博迪克(2017-05-14)
* "[ICLR 2018](https://scythe.cs.washington.edu/media/scythe-demo.pdf)项目综合论文"——伊利亚·波洛舒欣(2018-05-01)
* "[程序合成是可能的](https://www.cs.cornell.edu/~asampson/blog/minisynth.html)"–阿德里安·桑普森(2018-05-09)
* "[利用语法和强化学习进行神经程序合成](https://arxiv.org/pdf/1805.04276.pdf)"–鲁迪·布内尔,马修·豪斯克内希特,雅各布·德夫林,里沙布·辛格,普什梅特·柯利(2018-05-28)
* “[执行引导的神经程序综合](https://openreview.net/pdf?id=H1gfOiAqYm)”——陈,,宋晓(2018-09-27)
* "[软件写软件——程序合成 101](https://openreview.net/pdf?id=H1gfOiAqYm)"——亚历山大·维迪博尔斯基(2019-01-20)
* "[使用有经验的垃圾收集器自动合成长程序](https://arxiv.org/pdf/1809.04682.pdf)"–Amit Zohar,Lior Wolf (2019-01-22)
总之,这些链接应该提供一些轻松的夏日阅读乐趣。
顺便说一句,为了减少可能的混淆,请注意,在野外还有其他名为“autopandas”的 Python 项目,它们与 RISElab 的工作无关:
* [https://pypi.org/project/autopandas/](https://pypi.org/project/autopandas/)
* [https://github.com/Didayolo/autopandas](https://github.com/Didayolo/autopandas)
## 我们来谈谈 SQL
说到 DSL,最容易识别的 DSL 之一就是 SQL。SQL 的内部与程序合成有相似之处,并有助于指出用于数据科学工作的开源的新兴主题。
SQL 是一种声明性语言。SQL 侧重于描述必须执行“什么”——结果集应该是什么样子,而不是应该“如何”执行该工作的低级细节。要构建 SQL 查询,必须描述所涉及的数据源和高级操作(SELECT、JOIN、WHERE 等。)请求。然后,查询引擎开始忙碌起来,在幕后发生了很多事情:查询历史和统计信息通知各种优化策略;索引被自动使用;中间结果得到缓存;算法变体被替换,等等。
为了实现所有这些神奇的转换,首先 SQL 引擎解析一个查询,生成一个查询图,它是一个*有向无环图* (DAG)。然后,查询引擎识别要使用的表(如果您回到 Edgar Codd 的[原始论文](https://www.seas.upenn.edu/~zives/03f/cis550/codd.pdf),也称为“关系”)。查询图提供了在关系数据库栈的多个层进行优化所利用的元数据。最后,生成一些代码来操作表和索引中的数据,如果一切顺利,结果集将作为输出。这并不完全不同于程序合成,但更像是 [OG](https://www.urbandictionary.com/define.php?term=OG) 。
一个快乐、高效的 SQL 开发人员通常看不到这种神奇的事情发生,而是关注于如何声明*结果集*应该是什么样的,而不是太多隐藏的细节。这说明了 SQL 非凡的学习曲线方面,如此多的数据如何能够被执行*而不需要*费心处理细节。显然,对于那些正在学习数据管理和分析的人来说,SQL 有助于减少[认知负荷](https://en.wikipedia.org/wiki/Cognitive_load)。SQL 的悠久历史和普及性使得数据驱动的工作更容易被更广泛的受众所接受。
## SQL 和 Spark
要全面了解 SQL 优化器是如何工作的,请看一下 Spark SQL 中的 *[Catalyst 优化器](https://databricks.com/blog/2015/04/13/deep-dive-into-spark-sqls-catalyst-optimizer.html)* 。详情请见他们的 [SIGMOD 2015 论文](http://people.csail.mit.edu/matei/papers/2015/sigmod_spark_sql.pdf),其中迈克尔阿姆布鲁斯特&公司惊人地打出了一个公园:
“Spark SQL 的核心是 Catalyst optimizer,它以一种新颖的方式利用高级编程语言特性(例如 Scala 的模式匹配和准引号)来构建可扩展的查询优化器。”
根据定义,Spark 程序是 Dag,旨在使用各种不同类型的数据源。Spark 项目也有相对可互换的“数据框架”概念(不完全是*熊猫。DataFrame* ,但是关闭)和 SQL 查询结果集。正如 Catalyst 论文所述,它是“为现代数据分析的复杂需求量身定制的”,非常方便。
例如,假设您有(1)一堆通过 ETL 过程加载的 JSON 中的客户档案记录,以及(2)您需要将这些记录与存储在 [Parquet](http://parquet.apache.org/) 中的日志文件连接起来。这些日志文件的列数很可能比大多数查询所需的要多。Catalyst 足够聪明,可以通过 DAG 图推断出它可以对 Parquet 数据使用 *[下推谓词](https://jaceklaskowski.gitbooks.io/mastering-spark-sql/spark-sql-Optimizer-PushDownPredicate.html)* ,只反序列化查询所需的确切列。较少的数据被解压缩、反序列化、加载到内存中、在处理过程中运行等。要点提示:**对特定数据集的图表和元数据进行智能处理可以在多个层面上实现优化。那是好东西。**
## 模型驱动的数据查询
正如蒂姆·菲利普·克拉斯卡等人在“[学习索引结构的案例](https://dl.acm.org/citation.cfm?id=3196909)”(见[视频](https://www.youtube.com/watch?v=NaqJO7rrXy0&feature=youtu.be))中指出的那样,内部智能(B 树等。)代表了机器学习的早期形式。此外,它们可以被机器学习模型取代,以大幅提高性能:
“我们已经证明,机器学习模型有可能提供超越最先进指数的显著优势,我们相信这是未来研究的一个富有成效的方向。”
学习指数的研究强调了另一个有趣的点。关于 SQL 和它的声明性本质(换句话说,它对于如此广泛的应用程序的易用性)的一个权衡是,系统中的许多“智能”是在幕后发生的。按照理论,如果您*将所有数据处理集中*在同一个关系数据库管理系统中,那么该系统可以收集关于您的用例的元数据(例如,查询统计数据),并利用它作为 SQL 优化器的反馈。
当然,如果你在你的数据科学工作流程中使用几个不同的数据管理框架——就像现在每个人都做的那样——那么 RDBMS 的大部分魔力就会烟消云散。有些人可能会问:“难道我们不能回到商业智能、OLAP 和企业数据仓库的辉煌时代吗?”不,妖怪已经跑出瓶子了。21 世纪初的一个明显教训是:依赖于[集权](https://www.mckinsey.com/capabilities/people-and-organizational-performance/our-insights/to-centralize-or-not-to-centralize)的大规模战略通常是有风险的(约翰·罗布在我刚刚读过的 *[【勇敢的新战争】](https://www.goodreads.com/book/show/679469.Brave_New_War)* 中详细探讨了这一点——好东西)。一刀切(OSFA)是数据科学工作中的一个有害神话,没有一个数据框架会适合您的所有用例和需求。
Apache Spark 在集成各种不同的数据源和数据汇方面进行了创新,特别是对于非结构化数据,并将“应用程序代码”结构化为 SQL 语句,其结果集成为数据帧。即便如此,还是有一个问题:Spark 和其他 SQL 引擎一样,每次运行程序时都会重新创建一个查询图。表示运行时开销的。查询图用于在并行化、计算时间成本、内存资源等方面优化生成的应用程序代码。之后,图形消失。这种方法的好处(降低认知负荷等。)抵消增加的运行时开销和消失的元数据。如果更正式地外部化,后者可能特别有价值。
## 回路
这就是我们兜了一圈的地方。查看上面提到的“[镰刀](https://scythe.cs.washington.edu/)”演示和来自华盛顿大学的王成龙、阿尔文·张和拉斯·博迪克的相关[论文](https://scythe.cs.washington.edu/media/scythe-demo.pdf)。他们为 SQL 查询创建了一个程序合成系统,使用了类似于 AutoPandas 的输入输出示例,还利用了 StackOverflow 问题。虽然 AutoPandas 项目没有具体引用(如果我错过了参考文献,请原谅?)早期 U Washington 项目的几个方面似乎非常相似,包括实验设计、训练/测试数据源,甚至幻灯片。华盛顿大学的团队开发了一个 SQL 示例编程系统,这是一种有趣的方式,可以将更多的机器学习引入 SQL 查询。它解决了将一些关于 SQL 查询使用的元数据外部化的问题——为机器学习重用这些元数据。相比之下,RISElab 团队专注于*熊猫。DataFrame* 和杠杆射线。它们解决了一个更具挑战性的问题(“宽”API,而不是“窄”DSL,如 SQL),此外,它们还利用了更多的 SOTA 工具。我期待着看到 RISElab 研究的展开并取得许多进展。
此时,您可能已经开始将 Catalyst、Scythe、Learned Indexes、AutoPandas 等联系起来。机器学习在这部电影中扮演了很大的角色。图形也发挥了很大的作用,除了 SQL 使用一个内在化的图形(阅读:大部分是凡人看不见的);然而,越来越多的情况是利用一个*外化的*图来代替。
## 关于数据集的外部化图形
我们看到的一个长期趋势是[气流](https://airbnb.io/projects/airflow/)等。,就是将基于图的元数据具体化。有没有办法利用关于数据集的元数据来使我们的工作流更智能、更健壮?换句话说,在单个 SQL 查询的生命周期之外还有其他用途吗?鉴于目前处于“数据目录和谱系”与“数据集知识图”交汇处的开源项目的[风暴](https://docs.google.com/spreadsheets/d/1K_nA805YXXsez-S83zk6gi1bXoYTjNF06kCBHWKLpow/edit#gid=661099478),答案是响亮的“YAAASSS!”
在这里我想分享一些关于 Jupyter 项目的相关新闻。开发中有一组新的“丰富的上下文”功能,以支持作为顶级实体的项目、实时协作(à la GDocs)和评论、数据注册、元数据处理、注释和使用跟踪。
假设,假设您有一群数据科学家在 Jupyter 工作,并且您的组织正在认真对待数据治理。假设您想要跟踪关于数据集使用的元数据,例如,以便您可以随后[构建关于您组织中使用的数据集的知识图](https://www.akbc.ws/2019/),然后利用机器学习进行数据治理应用。跟我到目前为止?通过这个[非常受欢迎的开源](https://twitter.com/parente/status/1111346560582017028)数据基础设施将知识图实践注入主流 It 现实是有意义的。
更好的是,Jupyter 是开放标准的典范,所以请随意加入对话:
* [数据浏览器](https://github.com/jupyterlab/jupyterlab-data-explorer/blob/master/press_release.md)
* [元数据浏览器](https://github.com/jupyterlab/jupyterlab-metadata-service/blob/master/press_release.md)
* [评论](https://github.com/jupyterlab/jupyterlab-commenting/blob/master/press_release.md)
另外,GitHub 上有一个[问题/主题提供了更多的背景故事。](https://github.com/jupyterlab/jupyterlab/issues/5548)
总的来说,你对熊猫的使用。DataFrame 和其他流行的用于数据科学工作的开源 API 可能会变得更加智能和自动化。工作流正在不断发展,以在更长的生命周期内捕获数据集的元数据,这样数据科学工作流本身就可以变得更加模型驱动。**
# 每个 Pacoid 的主题和会议,第 12 集
> 原文:<https://www.dominodatalab.com/blog/themes-and-conferences-per-pacoid-episode-12>
*[Paco Nathan](https://twitter.com/pacoid) 的最新月度文章涵盖了 Sci Foo 以及为什么数据科学领导者应该重新思考其数据科学团队的招聘和培训优先事项。*
## 介绍
欢迎回到我们每月一次的主题发现和会议总结。七月中旬,我参加了在 [Google X](https://x.company/) 举办的 [Sci Foo](https://en.wikipedia.org/wiki/Science_Foo_Camp) 。在这一集里,我将介绍 Sci Foo 的主题以及数据科学团队应该跟踪的重要信息。
首先也是最重要的一点:科学界为学术基础设施所做的努力与当前行业中数据治理的一些需求之间存在大量重叠。这两个社区都在各自的工具领域取得了长足的进步,尽管还需要更多的合作。第二:在 Sci Foo 上讨论的一些关键见解最终打动了我——在我听到它们在其他地方被介绍了几次之后。总的来说,组织都在努力雇佣足够的数据科学家。与此同时,许多组织还在为生产中的模型部署和相关的法规遵从性的“后期问题”而奋斗。出现了一系列的科技创业公司、开源框架、企业产品等。,旨在提供解决技能差距和公司文化脱节等问题的工具。是的,所以有几十万年的历史例子证明工具不能真正解决文化问题——只是说说而已。无论如何,有一种更简单的方式来看待这些问题,然后重新思考数据科学团队的招聘和培训优先事项。
但首先,让我们备份和讨论:这到底是什么 Foo 的东西?以前听说过吗?
## 什么是 Foo?
如果你从未参加过 Foo 活动,[看看 Scott Berkun 的这篇文章](https://scottberkun.com/2006/how-to-run-a-great-unconference-session/)。人们认为这是一次强烈的、意想不到的、改变人生的经历。参加过几个 Foo 营——甚至在 2016-17 年共同主持了 Ed Foo 系列——最肯定的是,一个 Foo 会让你神魂颠倒。
与其像大多数技术会议那样发布议程,为什么不让人们交流、讨论、提出主题和可能的会议?提议的会议在一个小时左右就被堵在了墙上。然后我们加入到闪电般的谈话、会议、食物、饮料、现场音乐、科学实验、长时间的讨论直到凌晨等等。
想象一下,身处一群精通量子物理、组织工程、考古学、鸟鸣语言学、气候变化、增值税牛肉、CRISPR、建造火星探测器等等的人中间。现在想象一下,他们中的一些人想要抽出一个小时来讨论“亚马逊正在摧毁城市生活吗?”由以挖掘古丝绸之路沿线城市为生的人领导,与研究网络拓扑或宏观经济学的人展开辩论。仅仅是做一只墙上的苍蝇就已经足够迷人了。顺便说一句,这是我今年最喜欢的会议主题——看看游牧民和城市建设者的历史模式,并考虑通过大型仓库及时交付的全球影响。
Foo 俱乐部夏令营的第一条规则是参与你感兴趣的话题。如果它根本不有趣,那么你就去另一个会话。如果你站起来走出去,没有人会生气。意外之喜接踵而至,结果,人们发现自己陷入了激烈辩论的话题,而这些话题与他们的专业领域毫不相关。然而,通常他们的专业知识的切线,相邻的性质提供了拼图的缺失部分。Foo Camp 的第二条规则是关于一种叫做“FrieNDA”的做法,在这种做法中,人们坦率地说话,其他人尊重这一点,而不需要(1)“哦,天哪,我必须在推特上直播这一惊人的见解”或(2)任何人都必须签署法律文件。
## 科幻 Foo 2019
Sci Foo 由[奥赖利媒体](https://www.oreilly.com/)、[谷歌](https://www.google.com/)和[数字科学](https://www.digital-science.com/)联合发起,其基本理念是召集大约 200 名世界顶尖科学家参加一个周末的非正式“露营”。当然,与会者“露宿”在斯坦福附近的豪华酒店,而声名狼藉的公交车穿梭于酒店和谷歌之间。与此同时,奥赖利为每个与会者印制了一本小型传记指南,看起来几乎就像科学家的交易卡。我们在门口收到了旅游指南的复印件,这让我们期待这次会议将会变得有趣——非常有趣。然后沿着通往 Google X 礼堂的长走廊,有一堆由著名科学家写的令人惊叹的书,我们将与他们近距离共度周末:交谈,吃饭,辩论,思考,喝酒,大笑,交流,规划我们如何合作前进,等等。量子物理学最新进展?检查。建造行星探测器的最新进展?检查。如何在桶里培养迷你大脑的最新消息?检查。机器学习研究中心在非洲迅速扩张?检查。
在去开会的路上,我听了一个关于[太阳能地球工程](http://www.geoengineering.ox.ac.uk/www.geoengineering.ox.ac.uk/what-is-geoengineering/what-is-geoengineering/)的精彩演讲,即地球化以应对气候变化。Nota bene:在我们后代的有生之年,我们所处的温度范围很可能会把萨克拉门托变成海滨房产。有一些非常奇怪和有趣的方法将气溶胶喷入平流层,以减轻全球变暖的影响。当我试图研究投射到 Google X 的一面大墙上的详细幻灯片时,前面的一些家伙不停地问一些破坏性的,但显然是见多识广的问题。最终我认出这个人是前加州州长杰里·布朗。想象一下,有这样的人出现的野营/聚会——简而言之,这几乎就是一个 Foo 营地。
关于[组织工程](https://www.nibib.nih.gov/science-education/science-topics/tissue-engineering-and-regenerative-medicine)的会议让我感到极度恶心:与会者就通过癌症患者的活检提取脑细胞,然后在装有仪器的基底上培养大脑“类器官”进行了随意的讨论。他们的方法是用潜在的癌症药物轰击生活在大桶中的“类器官”迷你大脑,以测量药物的相对效果。之后,我悄悄地回到我的笔记本电脑上,做一些简单的编码来恢复。
最迷人的时刻:与 Wolfram Research 的联合创始人、笔记本电脑的发明者西奥多·格雷(早在 20 世纪 80 年代)聊天。他离开 Wolfram 已经有一段时间了,正在撰写精美的科学书籍,包括《元素:宇宙中每个已知原子的可视化解释》和《分子:万物的架构》。我们详细地讨论了 Jupyter 和他们使用笔记本电脑的广泛的私人研发,这太令人兴奋了!这就像发现了一个已经成功制造出低成本聚变反应堆的废弃苏联研究基地。
## 学术基础设施
也许是由于[数字科学](https://www.digital-science.com/)是活动的联合制作者之一,或者(更有可能)这是一种新兴趋势,许多与会者提到“sci comms”是他们最感兴趣的专业之一。换句话说,[科学传播](https://www.nature.com/articles/d41586-019-02387-w)。打听了一下,发现它是不同含义的编码:“我支持 STEM 教育,”或“我是一名科学作家/编辑”,或“我支持科学研究,这受到当前全球政治环境的困扰”,或者在其他情况下,它是收集研究数据集元数据(出处、关联数据、方法等)的简称。)然后建立机器学习模型,向科学家推荐方法和潜在合作者。我在这里提到这一点是因为当前的行业数据治理需求和科学界为学术基础设施所做的努力之间有很多重叠。要点是,利用关于研究数据集、项目、出版物等的元数据。,提供了一石二鸟的方法:为利用这些数据的人提供更好的建议,更好的数据治理,以及更好的研究资金投资回报率。这些担忧听起来耳熟吗?数据科学团队应该关注这里发生的事情,尤其是欧盟的重点。
例如,与 Carole Goble 会面对我来说是 Sci Foo 2019 的最大亮点之一。如果您的团队对数据治理、元数据处理、工作流管理、合规性、数据集推荐等方面的开源感兴趣,那么一定要看看 Carole 的一长串项目,包括: [FAIRdom](https://fair-dom.org/platform/) 、 [Apache Taverna](https://taverna.incubator.apache.org/) 、 [CWL](https://www.commonwl.org/) standard、 [PAV](https://pav-ontology.github.io/pav/) 出处和版本控制本体、公平数据指南、 [Galaxy](https://www.nature.com/articles/sdata201618) 等等,除了是 Jupyter 的早期机构采用者之一之外,还有所有这些。
科学研究界正在取得巨大进步,使得开源项目能够应对处理数据的重大挑战。据我所知,它们与行业数据科学团队一直在构建的类似开源项目没有太多交叉。我想帮助这两个社区搭建桥梁,并为共同的目标建立更多的合作。奇怪的是,在数据治理和法规遵从性游戏中,有时科学家比行业走得更远,特别是在法律不允许研究项目中的治理和法规遵从性是可选的情况下——这是有充分理由的。
## 有时一个奇怪的想法
多亏了 Sci Foo conversations,一个古怪的想法终于出现了。总的来说,组织都在努力雇佣足够的数据科学家。与此同时,许多组织也在努力解决机器学习模型在生产中部署后才会遇到的问题。事实证明,监管机构也倾向于应对在生产中部署的机器学习模型的微妙问题——换句话说,合规和其他法律问题——这反过来可能会让董事会成员夜不能寐。我看到一系列项目试图为人们的问题提供技术解决方案——换句话说,治标不治本。这是一个隐患,暴露了硅谷产品管理文化的问题,没有完全理解 MLOps 的现实问题。事实证明,也许有一种方法可以同时解决招聘和文化问题。虽然我要感谢克里斯·维金斯和其他专家多次耐心地向我描述了这个问题,但正是在 Sci Foo 上,这个难题的各个部分最终到位,描绘了一幅更大的画面。
考虑以下时间表:
* 2001 年——对冲基金大量雇用物理学研究生在华尔街工作(在一两篇突破性论文之后,加上市场微观结构的变化)。
* 2008 年- [金融危机](https://variety.com/2015/film/reviews/the-big-short-review-1201639770/):科学家逃离华尔街,加入数据科学团队,例如,支持广告、社交网络、游戏等等——我雇佣了不少人。
* 2018 - [关于数据治理的全球清算](https://blogs.wsj.com/cio/2018/03/19/%E2%80%8Bthe-morning-download-facebook-at-center-of-global-reckoning-on-data-governance/),又名“哎呀!…我们又做到了。”
后一次火车事故是怎么发生的?如果数据科学领域已经成熟了十多年,成千上万的超级聪明的人涌入了备受追捧的数据科学职位,那么这些数据错误是如何集体发生的呢?这是因为科技业亿万富翁的贪婪和贪婪,或许还因为他们一心一意地想尽一切办法增加收入?大概如此。但我有预感,这不完全是问题所在。
将时钟滚动到 Sci Foo。我一直在密切关注 Pete Skomoroch 最近的演讲,关于机器学习背景下的产品管理如何成为一种不同的责任。概率性质改变了所需的风险和过程。我还仔细阅读了[克里斯·维金斯最近关于数据和伦理的演讲。然后我在 Sci Foo 上说了几句话,这让我想起了去年在](https://blog.dominodatalab.com/data-ethics-contesting-truth-and-rearranging-power/) [JupyterCon](https://conferences.oreilly.com/jupyter/jup-ny) 上的类似讨论。宾果,一个想法终于点击!
历史上,物理学和物理科学专业的研究生是数据科学团队的优秀候选人。物理系学生通常需要收集数据、清理数据、运行分析和可视化、构建模型、评估结果……而这只是在与他们的导师讨论科学之前所需的准备工作。冲洗,起泡,重复——大概每周一次。通常,这些学生必须掌握使用 Linux、Jupyter、Docker、Git、各种云服务(或其他高性能计算基础设施)、诸如 NumPy、SciPy、scikit-learn 等库的技能。举个例子:我最喜欢的一个关于使用 Git 的教程是 inside[Effective computing in Physics:Field Guide to Research with Python](http://shop.oreilly.com/product/0636920033424.do),作者是 [Anthony Scopatz](https://www.ergs.sc.edu/people/scopatz.html) 和 [Kathryn Huff](http://katyhuff.github.io/) 。在许多情况下, [Jupyter](https://jupyter.org/) 尤为突出,我们在数据科学中使用的流行开源工具是由具有物理科学背景的人编写的,而不是 CS 学位。
这种对技能和工具的描述听起来熟悉吗?我接受的正式培训是计算机科学方面的,我可能会偏向于这方面的技能。即便如此,根据我的经验,一个拥有计算机科学学位的工程师可能至少需要几个月的额外培训,才能为数据科学团队做出贡献。工具和过程——更重要的是,思维方式——与典型的编程工作非常不同。另一方面,物理学家可能会在第一天就忙于新的数据科学工作,因为工具、流程和思维模式已经很熟悉了。
## 皮拉塔斯
在过去的几年里,硅谷的数据科学领导者已经接受了物理学家快速适应数据科学角色的概念,就像佳能一样。我估计,我多年来建立的数据科学团队中,至少有 50%是由具有物理科学背景的人组成的。这对于招聘那些了解工具和数据争论技术并熟悉构建机器学习模型的人来说非常好。与此同时,我看到来自社会科学背景的候选人在应聘备受青睐的数据科学职位时面临更多挑战。关于后一点的一些事情困扰着我,尽管我不能清楚地说出细节。
最近,我们(行业中的数据科学社区)已经承认,建立机器学习模型并不是在数据科学团队中工作的最大挑战。一旦模型部署到生产中,真正的乐趣就开始了。企业对安全性、隐私、伦理、血统、遵从性等等的关注,通常只有在模型部署之后才会显现出来。此外,我们看到这些问题如何出现在受监管的环境中,这些环境越来越多地成为用于数据分析基础设施的流行开源项目的目标用例:Spark、Jupyter、Kafka 等。数据治理,为了胜利!
另一个要点是:解决生产中模型的边缘情况——就监管者而言,这通常是道德和数据相遇的地方——需要比大多数数据科学团队更复杂的统计学。在产品经理会议上,试着轻松地谈论“校准的均衡赔率”或“因果推断”。这是清理房间的快捷方式。
套用克里斯·维金斯的话,数据科学中的伦理来自哲学和社会学的交叉……就哲学而言,Chris 将其描述为“作为服务的痛苦”( PITAaaS ),因为哲学家不断提醒我们生活并不简单。重复已知会让我们陷入麻烦的错误,会让我们陷入麻烦。将关于安全性的讨论放在一边,在生产中面对机器学习模型的公平和偏见问题所需的统计能力设置了相当高的标准。看看[斯坦福政策实验室](https://arxiv.org/pdf/1808.00023.pdf)、[谷歌](https://towardsdatascience.com/what-if-ai-model-understanding-were-easy-57ba21163d0e)、[微软](https://docs.microsoft.com/en-us/azure/machine-learning/studio-module-reference/evaluate-model)、[埃森哲](https://hbr.org/2018/10/auditing-algorithms-for-bias)等等是如何重申这一点的。
就在那时,我突然明白了。当然,我有点笨,尽管包括克里斯在内的专家已经耐心地向我解释了至少几次,但事实需要一段时间才能被理解。典型的自然科学研究人员和典型的社会科学研究人员的技能和思维模式之间的差异在这里提供了神奇的解码环。虽然前者倾向于熟悉数据争论工具、惊人的可视化和机器学习模型,但后者倾向于处理较小的数据集,尽管数据更加敏感,并且通常具有更加严格的合规性和道德要求。
社会科学研究——产生诸如[指导政府政策](https://www.congress.gov/bill/115th-congress/house-bill/4174)的结果——倾向于使用关于人们的机密数据:病史、家庭住址、家庭细节、性别、性行为、心理健康问题、警方记录、除了你的治疗师之外你可能不会告诉任何人的细节,等等。社会科学研究人员没有使用大数据工具和(值得发表的)机器学习应用程序,而是普遍面临数据使用授权,以维护严格的数据隐私要求,此外还有跟踪血统和其他数据治理细节的强烈需求。他们必须遵守各种[合规和道德标准](https://www.slideshare.net/chrishwiggins/history-and-ethics-of-data),然后才能开始进行相关的科学研究(往往侧重于人类行为),关心自己的行为如何影响参与研究的人类,等等。他们倾向于使用较少的机器学习,但更先进的统计实践,因为结果(政府政策等。)将意味着许多后果和潜在的争议,除非证据确凿。
作为数据科学领导者和技术公司产品经理的题外话:前面的任何一段是否类似于您当前使用机器学习处理客户问题的需求?是啊,我有预感这些要点听起来很熟悉。
我们——一个集体的“我们”代名词,在整个数据科学社区中——在第一个十年里忙于*人员配备*。我们(领导者)开始疯狂地雇佣足够多的人加入数据科学团队,以迅速实现公司目标。我们优先考虑那些之前有工具实践经验的人,而不是采取更昂贵和耗时的方式从冷启动开始培训新人,或者关注那些比工具更了解问题的人。
与此同时,我们把自己逼到了墙角。我们实践中的困难部分越来越多地集中在数据治理中的“所有事情”上:安全性、隐私、血统、公平/偏见、道德、合规性——此外,还有统计中用于排除边缘情况的*更深入的工作台。还有一个问题是要把客户理解为人,而不是像我们模拟星系团一样模拟数百万的客户。这些是高管们关心的 2018 年后的结果——自从*华尔街日报*称之为关于数据治理的“全球清算”以来。*
换句话说,虽然物理专业的学生(我们雇佣他们加入数据科学团队)可能已经能够让工具和模型以极具成本效益的方式进行后空翻,但社会科学专业的研究生(他们不那么经常被雇佣)已经理解了在行业中变得至关重要的问题和实践,特别是为了避免商业中的大风险。也就是说:数据科学是一项团队运动。从第一天起就跨学科了。多样性在数据科学中至关重要,通常是解决商业中复杂问题的竞争优势。雇佣物理科学研究人员来支持你的数据科学团队中了解这些工具的人。然后聘请社会科学研究人员补充团队;增加了解问题的员工和相关人员,即您的客户。
## 善用洞察力
这有什么关系?
首先,我们所接受的“数据驱动的业务”的概念已经越来越脱离业务的长期重要性。例如,业内关于隐私和效用的观念被扭曲了。事实证明,在生产中管理机器学习是一件工程无法解决的事情。即便如此,还是有不同的方式来看待这些问题,以及解决这些问题的好方法。
让我们从隐私和效用如何成为处理数据时永恒的矛盾开始。换句话说,如果您能够确定一个重要的、具有良好投资回报的业务用例,那么可能有一个解决数据隐私问题的方法。有时候,这句话的反义词会破坏最好的意图。在任何情况下,传统的智慧是识别数据集中代表个人身份信息 (PII)的字段,例如,客户的护照号码,然后“匿名化”这些字段。散列和加密方法已被接受,还有在共享数据前应用的取样和其他去识别方法。
然而,这种对隐私和安全的肤浅看法太过于亚里士多德式了,现在变成了只见树木不见森林的问题。如果你没有看到,最近发表的一篇研究论文——“[使用生成模型估计不完整数据集中重新识别的成功](https://www.nature.com/articles/s41467-019-10933-3)”作者 Luc Rocher,Julien M. Hendrickx,Yves-Alexandre de Montjoye;*Nature communication s*(2019-07-23)——表明,即使有许多所谓的“匿名化”数据集,机器学习模型也可以用来“重新识别”数据中描述的人。深入挖掘细节:“基于生成 copula 的方法可以准确估计特定人被正确重新识别的可能性,即使是在严重不完整的数据集中。”他们使用最大似然模型对人进行三角测量,“预测个体的独特性……错误发现率低”,以重新链接到 PII。笑点如下:“使用我们的模型,我们发现 99.98%的美国人可以在任何使用 15 个人口统计属性的数据集中被正确识别。”啊哦。
诚然,我在这篇文章中多次提到克里斯·维金斯,但你真的需要看看他最近的谈话。我们面临着与生产中的数据和机器学习相关的风险问题——危机。事实上,有些人接受过应对这类风险的训练。他们处理关于人的敏感数据,他们使用高级统计对边缘情况进行故障排除,他们应用有效的过程来合乎道德地使用数据,等等。这些人通常没有通过数据科学面试的筛选,因为他们不擅长在白板上编写 5000 行的 Java 程序。或者,他们犯了在与程序员的面试中提到模糊研究的大罪。或者什么的。
## “没有什么比恐惧更能传播”
曾几何时,大约在 2012 年左右,数据科学会议充斥着关于一个行业不顾一切地将惊人的海量数据加载到某种数据湖中,并应用各种奇怪的类似天体物理学的方法……以最终获利的讨论!事实证明,这并不是企业所需要的。将数亿人建模成数亿颗恒星是绝对错误的。奇怪的是,当你在俄罗斯巨魔军队面前泄露他们的银行账户数据时,这些天文机构不会发起集体诉讼或维权股东运动。
一个开明的(阅读:智力上积极进取的)数据科学领导者应该能够连接这里的虚线。想要为数据科学团队寻找更多的候选人吗?尤其是那些能在 ML 管道后期提供帮助的人?尤其是在你与监管机构发生纠纷的时候?然后根据克里斯的描述重新考虑你的招聘策略。
这些都是很棒的话。最好的话。但是,嘿,有没有更具体的例子呢?例如,社会科学研究与数据科学实践相关的商业问题在哪里交叉?我四处询问,这篇论文作为一个例子回来了:“[推进急诊科症状监测数据的使用,纽约市,2012-2016](https://journals.sagepub.com/doi/10.1177/0033354917711183) ”作者 Ramona Lall,Jasmine Abdelnabi,Stephanie Ngai 等人;公共卫生报告(2017-07-10)。这似乎是一个晦涩且无关痛痒的学术话题,除非你通读了摘要中的细节:
* 监视数据和生物恐怖主义问题-检查。
* 超级风暴桑迪期间的危机-检查。
* 旅行者中的埃博拉样病毒最近返回纽约-检查。
* 风暴期间建筑物倒塌,涉及急诊室-检查。
* 潜在的隔离违规-检查。
* 门诊病人作为流动载体-检查。
**关注数据科学家:**“嗯,这个很重要。这里有一个问题,它比我们今天的 scrum 会议更重要。对于这些数据,对于没有采取适当的应对措施,存在道德上的担忧……”
**漠不关心的数据科学家:**“那只有几百个数据点。建立一个有趣的模型真的不够。没什么大不了的。”
**令人沮丧的产品经理:**“业务用例不清晰,尤其是预期的投资回报率是多少?你有没有进行过任何 A/B 测试,或者写过一页纸来描述一个最小可行的产品?”
**关注数据科学家:**“僵尸启示录哪部分你没看懂!?!"
## 大局
事实上,让我们来画一张图。下图显示了由数据科学团队处理的项目的理想化工作流。对于组织的其他部门来说,有一些成果得到了支持,例如“执行决策”和“客户互动”,还有数据科学团队从组织获得的支持,我将这些支持统称为某种平台。需要什么样的技能,在拼图的哪个部分需要?
![Skills needed for projects handled by a data science team](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/604519c20e09d0320c9342c5284ac528.png) Credit: Paco Nathan
好吧,如果这种思路激起了你的兴趣,有什么推荐的资源?最肯定的是来自 NYU 的数据科学社区时事通讯,作者是劳拉·诺兰和布拉德·斯坦格。Laura 之前是 T2 NYU 大学的教授,使用 JupyterHub 等在美国和加拿大研究数据科学教育。换句话说,在特定的环境下,什么行得通,什么行不通。
我强烈推荐的另一个资源是 Douglas Rushkoff 和 TeamHuman.fm 项目。虽然从表面上看,这些内容可能显得相对保守,偏向左翼主题,但道格是技术方面的专家;在互联网时代的早期,他就在考虑使用大数据、机器学习等的社会影响。拉什科夫帮助人们了解即将来临的灾难(灾难已经发生)以及如何减轻灾难(我们忽略了他)。关于他目前工作的一个引人入胜的例子,请参见“[最富有者的生存](https://medium.com/s/futurehuman/survival-of-the-richest-9ef6cddd0cc1)”(也在[的这个播客](https://nextbillionseconds.com/2019/06/26/episode-3-10-paranoid-billionaires-with-doug-rushkoff/))亿万富翁正在为世界末日做准备,道格被拉进来担任技术顾问。如果你对受访者进行抽样调查,越过一些显而易见的政治主题,你会发现一些令人惊叹的项目和实用建议,告诉你如何平衡技术创新与更脆弱的人类关切。
我在 TeamHuman.fm 上最喜欢的一个片段是与希瑟·杜威·哈格伯格(Heather Dewey-Hagborg)的一个“艺术项目”,涉及 DNA 分析、机器学习、虚拟现实等。并从纽约地铁里发现的 DNA 残留物中重建可能的面孔:口香糖、烟头、头发等。如果你还没有考虑将 DNA 作为法庭证据的数据伦理,这是一个你不应该错过的采访。
如果我们能得到一个由道格·拉什科夫、克里斯·维金斯、劳拉·诺兰和其他几十个我们在这一集里提到的人领导的 Foo 活动,那就太棒了。让我们尽量避免 2018 款 redux。
## 即将举行的活动
以下是一些与数据科学相关的[事件](https://derwen.ai/events#watchlist),请记在您的日历上:
* 9 月 9 日至 12 日,圣何塞
* [Strata NY](https://conferences.oreilly.com/strata/strata-ny) ,9 月 23-26 日,NYC–查看我们的小组“[数据科学与工程,真的必须这样吗](https://conferences.oreilly.com/strata/strata-ny/public/schedule/detail/76399)?”
* [伦敦互联数据](https://conferences.oreilly.com/strata/strata-ny/public/schedule/detail/76399),10 月 3 日至 4 日,伦敦
* [AI UK](https://conferences.oreilly.com/artificial-intelligence/ai-eu) ,10 月 14 日-17 日,伦敦–查看“[执行简报:打开汽车包装](https://conferences.oreilly.com/artificial-intelligence/ai-eu/public/schedule/detail/79547)
* [Tensorflow World](https://conferences.oreilly.com/tensorflow/tf-ca) ,10 月 28 日至 31 日,圣何塞
# 每个 Pacoid 的主题和会议,第 13 集
> 原文:<https://www.dominodatalab.com/blog/themes-and-conferences-per-pacoid-episode-13>
*Paco Nathan 的最新文章涵盖了美国国家海洋和大气管理局(NOAA)环境数据管理(EDM)研讨会的数据实践以及 AI 大会的更新。*
## 介绍
欢迎回到我们每月一次的主题发现和会议总结。这是一个繁忙的会议季节,一直持续到 12 月。让我们来看看最近的两次会议。我们将考察国家海洋和大气管理局(NOAA)的数据管理实践,这是我在他们的研讨会上了解到的,作为一个案例研究,说明当风险特别高时,如何处理数据收集、数据集管理、质量控制、分析和问责制。即使对于从事明显不同的垂直行业的组织来说,在如何处理数据实践方面,也有很多东西要向他们学习。我们还将关注圣何塞[奥莱利人工智能会议](https://conferences.oreilly.com/artificial-intelligence/ai-ca-2019)的更新,该会议展示了人工智能的最新突破,特别是关于突破我们在该领域的一些假设限制——以及更多关于 [Ray](https://ray.readthedocs.io/en/latest/) 的信息,该项目来自加州大学伯克利分校 RISELab,它正在超越基准,蚕食其他库的功能,并追踪 Apache Spark 进行致命一击。
## 数据科学与气候科学相遇
我最近参加的最有趣也是最重要的会议是在西雅图举行的 NOAA EDM 研讨会。环境数据管理(EDM)是在 [NOAA](https://noaa.gov) 召开的数据管理团队年会,今年由 Kim Valentine 和 Eugene Burger 主持。举个例子,位于西雅图的 NOAA 太平洋海洋环境实验室(PMEL)负责收集世界上 50%以上的海洋学研究数据。NOAA 通过其实验室和其他中心拥有世界气候科学研究的独特集中地,拥有紧密相邻领域的专家:极地冰,珊瑚礁健康,晴天洪水,海洋酸化,渔业计数,大气二氧化碳,海平面上升,洋流,等等。他们还管理着重要的基础设施,如 T4 海啸预警系统和国家飓风中心。
## 数据准确性、数据管理和数据科学英雄
除了科学家和工程师之外,NOAA 还包括准军事小组,他们直接飞行和航行到飓风中。在某些情况下,当数百万人的生命可能因自然灾害而受到威胁时,他们的工作至关重要。在其他情况下,他们的工作受到严格的政治审查,通常以数据的真实性为目标——例如,从公司利益与政府对非法捕鱼、能源和矿物开采、石油泄漏、濒危物种保护等的监管。碳税很可能迟早会浮出水面。因此,非常需要谨慎的数据管理。一些敌对政党甚至入侵部署在海上的传感器,以扰乱由此产生的数据分析,并可能扭曲政治结果。鉴于 21 世纪气候变化、物种灭绝、石油峰值等现实,NOAA 的这些人是我们这个时代数据科学的真正英雄。
考虑到这种情况,NOAA 的数据管理实践特别复杂,远远超过我遇到的任何行业数据科学团队。例如,有关于他们的数据管理工作的联邦法律。他们管理的一些数据集可以追溯到 200 多年前。因此,他们的总体数据政策必须以世纪为单位来定义。现在他们正在计划向云的大规模迁移,以及更广泛地采用 ML。
许多科技创业公司将面临这种专注于其数据团队的审查,这是值得怀疑的——即使如此,在最佳实践方面仍有许多值得学习的地方。
在 EDM 研讨会上,我做了一个关于 AI 在行业中的应用的主题演讲。除了主题演讲之外,还有:
* [来自 OMB 白宫的 Rebecca Williams](https://twitter.com/internetrebecca)——她帮助制定了[美国联邦数据战略](https://strategy.data.gov/)和[第一年行动计划](https://strategy.data.gov/action-plan/#federal-data-strategy-action-plan)——查看她关于“联邦数据战略”主题演讲的[幻灯片](https://static.sched.com/hosted_files/noaaedm19/a2/Federal%20Data%20Policy%20Rebecca%20Williams.pdf)
* 美国国家海洋和大气管理局的 CDO 埃德·卡恩斯(Ed Kearns)在专家的领导下指导了那里的许多任务
* 数据管理总监 Monica Youngman 查看她的[幻灯片,了解“NOAA 的数据归档”主题演讲](https://static.sched.com/hosted_files/noaaedm19/65/Youngman_Plenary%20%281%29.pdf)
* 乔纳森·奥尼尔(Jonathan O'Neil)领导了对大规模云迁移的评估——查看他的幻灯片“NOAA 大数据项目:数字”主题演讲
九月的第一个星期,我们在台上表演,观众们开始窃窃私语,谈论“沙皮”和“阿拉巴马”。现在,我理解了他们日常工作的一些现实,这与许多企业环境并无太大出入。查看[研讨会网站](https://noaaedm19.sched.com/),获取演示文稿中幻灯片的链接。
## 元数据挑战
NOAA 团队在元数据交换方面面临着巨大的挑战:他们传入的许多原始传感器遥测数据都是时序数据,这些数据本身使用的是 [netCDF TF](https://www.unidata.ucar.edu/software/netcdf/) 格式。元数据必须转换成 W3C 和 ISO 标准才能发布。数据必须转换成各种支持的下载格式,包括 JSON-LD。查看 NOAA [数据目录](https://data.noaa.gov/datasetsearch/)中的例子。总的来说,当你需要在机器学习教程、产品演示等中使用有趣的数据时,这些公共数据集提供了一个很好的资源。数据目录中的一个区域真正吸引了我的眼球:来自海洋气候站的[系泊数据](https://www.pmel.noaa.gov/ocs/data/disdel/),这些数据是海上高度仪器化的浮标,带有几个时间对齐的信号。该网站提供可视化和下载特定信号和时间范围的工具:
![KEO Daily Data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/3d2e7274d7eac3c8544a29f5e041edbf.png)
我在 EDM 最喜欢的一次会议(正如你可能想象的那样)是关于[元数据工具](https://noaaedm19.sched.com/event/TH5M/metadata-tools-solutions-for-the-creation-management-discovery-of-metadata)。除了发布元数据来描述数据集之外,它还引入了两个有趣的实践,由[泰勒·克里斯滕森](https://noaaedm19.sched.com/event/TH5M/metadata-tools-solutions-for-the-creation-management-discovery-of-metadata)描述:
* 机器可读数据字典
* 创建、共享和收集[人行横道](https://www.sciencedirect.com/topics/computer-science/crosswalk)的实践
前者是 ML 在管理数据集的困难现实中可以提供帮助的地方。FWIW,我最近写了一篇[文章](https://medium.com/derwen/dataset-discovery-and-human-in-the-loop-ai-for-scholarly-infrastructure-e65d38cb0f8f)关于使用 ML 清理和链接元数据的相关工作:利用半监督学习来支持可重复的研究,以及推荐系统来帮助人们在政府机构中进入数据分析角色。后者提供了一个元数据模式和另一个元数据模式之间的映射。可以把它想象成一个组织用来描述另一个组织的数据集使用情况的“临时笔记”。自从 EDM 研讨会以来,我发现在我的一些日常工作中可以使用人行横道,来指导我使用以前不熟悉的数据集。
此外,参观西雅图 PMEL 的机械商店和机器人实验室也令人震惊。我最喜欢的项目是他们使用太阳能机器人船,从旧金山湾和其他港口出发,然后在整个世界的任何地方执行任务。saildrones 收集数据,并通过卫星上行链路与[铱星网络](https://www.iridium.com/)进行报告。NOAA 最近启动了有史以来最大的【saildrone 船队,用于北极冰层调查——一次总共 6 艘,尽管在北部海域航行是一项壮举。NOAA 最近还完成了有史以来第一次机器人环南极航行。多酷啊。!
我们举行了工作会议,讨论如何在边缘设备上用低功耗 ML 改造 saildrones,使用迁移学习和深度学习模型来检测和避免海冰的危险。研究人员的另一个问题是:“我们如何利用 ML 从船上视频中识别海洋哺乳动物?”可以说,一些数据读数已经被修改,如果有异常因素需要过滤。原来,海狮已经发现了这些自供能的帆船,在海上行驶,其大小和形状与一个小帆板相似,因此是更有见识的海狮在海上放松的绝佳场所。迄今为止,这是我最喜欢的异常检测用例。
关于使用赛尔号作为移动气候站的更多信息,见[海洋气候站](https://www.pmel.noaa.gov/ocs/saildrone),也可以查看这个[延长任务的照片日志](https://www.pmel.noaa.gov/itae/follow-saildrone-2018)。
## AI CA 2019 亮点
在 NOAA EDM 之后,紧接着在圣何塞举行了奥莱利人工智能会议。作为对主持人[本·洛里卡](https://twitter.com/bigdata)和[罗杰·陈](https://twitter.com/rgrchen)的证明,这次会议是为数不多的能够在学术研究的最新成果和行业中切实可行的案例之间找到平衡点的会议之一,这是非常罕见的两者的结合。
## 来自里塞实验室的雷:火花黑仔?
所有的目光都集中在一个演讲上:加州大学伯克利分校的杰出教授迈克尔·乔丹(Michael Jordan)发表了[“基于梯度的方法寻找博弈论均衡”](https://conferences.oreilly.com/artificial-intelligence/ai-ca-2019/public/schedule/detail/77921)主题演讲。在早期的会议上,乔丹介绍了来自[的](https://rise.cs.berkeley.edu/)[射线项目](https://ray.readthedocs.io/en/latest/)(意思是:可能的火花杀手】。这一次,他深入研究了描述机器学习(ML)研究进展的数学,一年接一年。他的演讲见[视频](https://www.oreilly.com/radar/on-gradient-based-methods-for-finding-game-theoretic-equilibria/)和[幻灯片](https://cdn.oreillystatic.com/en/assets/1/event/298/On%20gradient-based%20methods%20for%20finding%20game-theoretic%20equilibria%20Presentation.pptx)。这是 ML 研究的数学杰作,也是未来的趋势:
* 20 世纪 90 年代—关注早期电子商务的“后端”问题,如搜索和欺诈检测
* 2000 年代—侧重于“人的一面”,如推荐者和社交媒体
* 2010 年代——专注于“模式识别”,如用于计算机视觉或语音转文本的深度学习
* 21 世纪 20 年代——专注于展示智力的“市场”,而不是与活体大脑相关的那种
## 机器学习:最新进展和执行简报
另一个亮点是脑波强化系统公司的安德鲁·费尔德曼的“[通过晶圆级集成发挥人工智能的潜力](https://conferences.oreilly.com/artificial-intelligence/ai-ca-2019/public/schedule/detail/79929)”。如果你错过了最近的新闻,脑波强化器在硬件开发方面取得了重大突破,创造了首款[晶圆级](https://www.oreilly.com/radar/enabling-ais-potential-through-wafer-scale-integration)芯片——有史以来最大的芯片。这种新芯片大大加快了深度学习模型的训练阶段。相比之下,最大的 GPU 处理器有 211 亿个晶体管,但新的 Cerebras 晶圆级芯片有 1.2 万亿个晶体管,面积约为其 50 倍。新一代芯片的能量如此之大,最大的挑战之一就是不让它们熔化。安德鲁把一个晶圆级芯片带到后台给我们看…哇!!!更重要的是,这一技术上的巨大飞跃在实践中转化为非线性增益:大脑芯片的约 50 倍大的面积转化为 10,000 倍多的内存带宽——这是训练大规模网络的限制因素之一。见[视频](https://www.oreilly.com/radar/enabling-ais-potential-through-wafer-scale-integration/)。
另一个引起我注意的主题是来自脸书 AI 的 Srinivas Narayanan 的“[超越完全监督学习](https://conferences.oreilly.com/artificial-intelligence/ai-ca-2019/public/schedule/detail/78536)”。看他的[幻灯片](https://cdn.oreillystatic.com/en/assets/1/event/298/Going%20beyond%20fully%20supervised%20learning%20Presentation.pdf)和[视频](https://www.oreilly.com/radar/going-beyond-fully-supervised-learning/)。值得注意的是,脸书建立了一种基于自我监督的实践,以管理复杂的工作流,这些工作流使用生成性对抗网络(gan)和弱监督形式,为深度学习模型带来大量的训练数据。深度学习的一个限制因素是,你需要大量仔细标记的数据。通过使用自我监督,脸书可以整合其他更嘈杂、更不正式的数据源——超越监督学习的内在限制因素——并获得更好的预测能力。例如,识别 NSFW 图像获得了 62%的准确率。这意味着与深度学习在行业中的使用相关的一个长期问题的突破:我们能对海量的未标记数据做什么?
在会议期间,我主持了管理层简报业务跟踪,并发表了一篇调查报告“[打开 AutoML](https://derwen.ai/s/yvkg) ”,回顾了许多供应商、云服务、开源项目以及针对 AutoML 的研究成果。
https://twitter.com/miguelmalvarez/status/1177292709138182144
我们的两次管理层简报会谈尤其值得关注。来自 Fiddler 的 Ankur Taly 展示了“[解释机器学习模型](https://conferences.oreilly.com/artificial-intelligence/ai-ca-2019/public/schedule/detail/80021)”(幻灯片和视频即将推出)。可解释的人工智能是当前的热门词汇,我之前在本专栏中讨论过让 ML 模型“可解释”的利弊。扎克·利普顿是 XAI 著名的作家和批评家之一——参见他的论文“[模型可解释性的神话](https://arxiv.org/pdf/1606.03490.pdf)”中对这些问题的出色调查。Taly 对这个主题提出了全新的观点,他对 [*综合渐变*](https://github.com/ankurtaly/Integrated-Gradients) 的描述尤其令人印象深刻。虽然我们通常只在训练后评估 ML 模型,但我们也可以在训练期间查看拐点,在这些点对训练数据进行采样,然后整合这些样本,以确定模型用于进行特定预测的数据特征。
谈到深度学习中的二阶效应,Fiddler talk 让我想起了最近在 O'Reilly Data Show 播客上对 Michael Mahoney 的采访。简而言之,深度学习的行为与我们想象的不同。例如,我们应该在训练中看到局部最小值问题…但我们通常不会。深度学习的其他数学属性并没有得到很好的理解。领导 MMDS 算法会议的马奥尼正在开发理论方法和实用诊断工具,这对使用深度学习的从业者应该有所帮助。他是开发深度学习实用理论的领先数学家之一。马奥尼对二阶效应的研究([黑森](https://en.wikipedia.org/wiki/Hessian_matrix))回忆了塔利对积分梯度的讨论。关于深度学习的实践,我们还有很多要学的。
我真正想特别提到的另一个高管简报是由南加州大学信息科学研究所的 [Mayank Kejriwal](https://twitter.com/kejriwal_mayank) 发表的“[嵌入时代](https://conferences.oreilly.com/artificial-intelligence/ai-ca/public/schedule/detail/76503)”。(幻灯片和视频即将推出。Kejriwal 是 T4 知识图表中心 T5 实验室的教授。长话短说:在过去的两年里,应用于自然语言的深度学习完全颠覆了该领域的最佳实践。由此产生的嵌入式语言模型创建了一个芝麻街人物名册,其中包括最先进的方法:艾伦·艾(Allen AI)的埃尔莫(ELMo)、谷歌(Google)的伯特(BERT)、百度(Baidu)的厄尼(ERNIE)等等。语言分析依赖于复杂图形。将这种方法向前推进了几步——如此多的真实世界数据是相互关联的,理想情况下可以用图表来表示,只是图表分析在计算上非常昂贵。然而,复杂图形中的子图可以被矢量化,并用作嵌入来训练深度学习模型——就像 ELMo 和 friends 如何将句子和短语矢量化一样。我们开始看到具有深度学习的图形嵌入方法,并期待这种更强大的方法(阅读:不要停留在关系思维中)来处理现实世界的数据。更多信息,请查看这些[https://usc-isi-i2.github.io/kejriwal/](https://usc-isi-i2.github.io/kejriwal/)资源。
在其他新闻中,spaCy 现在已经增加了一倍的编程人员,[刚刚发布了 2.2 版本](https://explosion.ai/blog/spacy-v2-2):“更精简,更干净,甚至更用户友好”,其安装占用的磁盘空间只有原来的 5-10 倍。另外,请继续关注:下一次我保证会探索更多关于 Ray 的细节和例子。
# 每个 Pacoid 的主题和会议,第 2 集
> 原文:<https://www.dominodatalab.com/blog/themes-and-conferences-per-pacoid-episode-2>
*[Paco Nathan](https://twitter.com/pacoid) 的专栏涵盖了问责的数据科学、强化学习挑战假设以及人工智能和经济学中的惊喜等主题。*
## 介绍
欢迎回到我们新的每月系列!九月是“会议季”最忙碌的一段时间,有很多优秀的新材料需要回顾。最近有三个主题跳出来。
首先是:**问责的数据科学**。一个被称为 [*的有争议的度量标准邓巴的数字*](https://www.sciencedirect.com/science/article/pii/004724849290081J?via%3Dihub) 描述了一种灵长类动物根据新大脑皮层的大小可以维持多少关系。粗略的想法将 150 设置为内聚组的阈值大小。这说明了一个事实,人类并不特别擅长在大得多的群体中做决定。然而,数据科学有助于改善这种人类状况——特别是对于跨大型组织的协作数据洞察。虽然关于数据科学道德的对话在过去几年一直很活跃,但我们开始看到企业的切实行动:团队可以使用的清单,更好的测量和建模方法的例子,以及对迫使变革的问题的出色分析和可视化。随着数据科学被应用于企业和公众问责,问题以意想不到的方式出现。
其次:**强化学习挑战假设**。正如 Strata NY 2018 所展示的那样,数据科学实践正在向主流业务转移。与此同时,许多关于数据分析、机器学习及其与工程的[关系的“给定”正在快速变化。强化学习是挑战该领域先前假设的一个重要因素。新型的生物启发学习打破了既定的做法,几十年的旧模式有了新的优先事项,以及关于我们需要多少数据来建立模型的问题?换句话说,“数据多”就一定赢吗?此外,在企业 IT 实践中,*学习*被证明比*编码*更通用。](https://www.oreilly.com/ideas/artificial-intelligence-in-the-software-engineering-workflow)
第三: **AI 和经济学有惊喜店内**。有很多关于人工智能取代工作的潜力的公开讨论。所涉及的计量经济学主要集中在劳动力和就业的测量上,与此同时,关于研发投入总量下降的趋势令人不安(T2)。然而,其中一些假设似乎是错误的。多个独立的研究工作指出了这些经济模型的数学问题,即人工智能如何以意想不到的方式加速研发,进而提振资本股票(从经济意义上讲,而不是公司估值)。此外,更新的硬件、更新的云架构、更快的网络等的经济性。,意味着远离基于 Hadoop/Spark 的数据实践时代。这些因素对数据科学和数据工程为翻天覆地的变化提供基础的行业有着深远的影响。
## 数据科学促进问责制
2018 年纽约时装周(9 月 11 日至 13 日):今年的纽约时装周将 4 天的活动压缩成了 3 个忙碌的日子。即便如此,人们还是提到了规模——不是从人数上,尽管规模很大——而是从分析在主流业务中的渗透程度。参加[一次高管简报会谈](https://twitter.com/pacoid/status/1039955321731653633),我前面的一排人来自爱荷华州的一家保险公司。我在 2017 年介绍了同样的演讲者/演讲,只有少数人参加。一年后,这种谈话只是站着说话不腰疼。来自衣阿华州的人说他们对提出的概念是多么陌生,并且渴望学习。随着数据科学实践在主流业务中的传播,我们正在大规模获得更好的光学技术。企业和公众责任的一些问题可以从关键个人的意见和偏见转向客观分析和大规模数据的可视化。这对数据科学和业务都有好处,尽管这种情况可能会以一些不太直观的方式出现…
## 量化宽恕
最尖锐的阶层主题演讲之一是[茱莉亚·安格温](https://twitter.com/JuliaAngwin)的《[量化宽恕](https://www.oreilly.com/ideas/quantifying-forgiveness)》。茱莉亚是《T4 的拖网国家》一书的作者,她领导了著名的针对 ML 模型中种族偏见的 ProPublica 调查,该模型用于假释听证会中的犯罪风险评分。她探索了她从算法问责调查中学到的关于宽恕的知识。换句话说,由于基于 ML 模型的自动化中的内在偏见,谁会因违法行为而获得通行证,谁会直接入狱?这些是“我们都需要为即将到来的人工智能未来学习的课程”,在未来,算法越来越多地成为宽恕的*仲裁者*。总的来说,这项工作展示了许多杰出的数据科学实践的例子,尤其是引人注目的可视化。
https://twitter.com/ginablaber/status/1040238561726025728
Julia 在数据新闻和问责制方面的下一个项目刚刚宣布: [The Markup](https://themarkup.org/) ,这是一个位于纽约的无党派、非营利的新闻编辑室,它“阐明新兴技术的社会危害”,由 Craig Newmark、Knight Foundation、Ford Foundation、MacArthur Foundation 等[资助](https://techcrunch.com/2018/09/23/the-markup-a-tech-focused-investigative-news-site-raises-20-million-from-craigslist-founder/)。
## 声音及其对认知的影响
在另一个截然不同的问责例子中,数据分析能否指出大规模的有害商业行为,即(1)无形的,(2)对消费者造成长期的身体伤害?
[琥珀盒](https://twitter.com/caseorganic)的《[声音设计与体验的未来](https://www.oreilly.com/ideas/sound-design-and-the-future-of-experience),以微妙、深刻的[声景](https://en.wikipedia.org/wiki/Soundscape)开场。没有图像,只有前一天晚上她在曼哈顿酒店房间里的录音,探索从街上传来的声音纹理。我们不断地处理声音,甚至在睡觉时也是如此,这对我们的认知有着重要的影响。例如,我们在商业航班上听到的声音[会影响我们品尝食物的能力](https://www.theguardian.com/lifeandstyle/wordofmouth/2014/mar/11/sound-affects-taste-food-sweet-bitter):芬兰航空公司制作了一个定制的配乐,让他们的机上食物味道更好。
Amber 是即将推出的 [*设计带声音的*](http://shop.oreilly.com/product/0636920051923.do) 产品的合著者,我一直在忙于一个早期版本。强烈推荐用于严肃的数据科学工作。在她的主题演讲中,展示了各种产品的设计,如暖通空调、吹风机——或者我在公司校园里最讨厌的东西,不可避免的吹叶机——Amber 指出,“这些都损害了我们放松、更好地思考和对我们的环境更感兴趣的能力。”
在 Strata 的后台,Amber 带着 [Spectrogram Pro](https://itunes.apple.com/us/app/spectrogram-pro-with-super-smooth-60hz-update/id415301721?mt=8) 在 A/V 设备中蜿蜒前行,指出哪些工作站产生的噪音最大,哪些主讲人需要进行过滤调整以使其更容易理解。具有讽刺意味的是,前一天晚上我在[约翰·多利牡蛎酒吧](https://www.thejohndory.com/)参加了一个行业晚宴。我不得不捂住耳朵,费力地听着[首席执行官萨尔·约斯科维茨(Saar Yoskovitz)描述他们如何在声学传感器上使用 ML 来诊断工业设备故障。我们在约翰多利地下室餐厅的“安静”角落测量到 100+分贝。虽然对高端餐馆来说很时髦,但这种噪音水平足以造成损害——城市千禧一代预计会比他们的父母早二三十年经历听力损失的“衰老”影响。幸运的是,](https://www.augury.com/)[有一个应用程序可以解决这个问题,](https://www.soundprint.co/)——这有望让公共场所的健康标准得到更好的执行。
### 旧金山的声纹餐馆噪音水平
琥珀作品的一个中心主题是关于[平静的技术](https://calmtech.com/),与吸引注意力的产品相反。这将为我们如何构建分析和报告提供信息。例如,决策者有多容易从我们作为数据科学家制作的数据可视化和其他交互式材料中学习?有没有办法让我们的分析结果平静下来,让人们更好地思考数据洞察和业务战略?问责制的另一个例子——关于我们如何呈现分析的影响。
顺便说一句,如果你还没有参加艾德·塔夫特的一日课程“展示数据和信息”,把它放在一个高优先级的清单上,明智地投资 380 美元。每位参与者都会收到一套他的精美精装书籍,这些书籍在亚马逊上的售价约为课程注册费的 50%。此外,这是充满统计数据和数据可视化的令人震惊的一天。我提到这个是因为 Tufte 的做法如*数据墨水*、*迷你图*等。很适合安珀·凯斯的作品。
## 招聘中的偏差数据
其中一个优秀的数据案例研究是 [TapRecruit](https://taprecruit.co/) 的[Maryam Jahan shahi](https://twitter.com/mjahanshahi):[“投钱球”招聘:一种数据驱动的方法,用于解决招聘中的瓶颈和偏见](https://twitter.com/pacoid/status/1039547210168459272)。他们分析了大量关于数据科学招聘的数据。一个观察到的问题是初级数据科学家中的头衔膨胀。因此,在候选人搜索中使用“高级数据科学家”这一短语会造成瓶颈,而不是一个好的过滤器——将招聘成功率降低 50%。此外,职位描述中两个最重要的*津贴和福利*竟然是提及医疗保险和 401k——而短语“无限假期”在年龄统计中的意思是*吝啬的公司,过度竞争的环境,无法想象适合那里*。另一个要点是:科技公司经常将“黑客多样性”作为快速解决方案,但这是一个神话。Maryam 表明,当你有更大的候选人库时,你最终会在新雇员中有更多的多样性。相比之下,人们在招聘时往往会做出有偏见的微观决定,尤其是在边际上,这导致候选人范围变小。
鉴于约 150 场演讲,Strata 还有更多的内容可以总结,尽管完整的视频集仍在网上发布。下面是 Maggie Seeds 的一个很好的总结:
*“未来已经到来,现在的热门话题是如何最好地存储、处理和分析数据,以有效地提供洞察力来推动决策。”*
## 人工智能中的伦理和隐私
同时,[AI Conf,SF](https://conferences.oreilly.com/artificial-intelligence/ai-ca)(9 月 4-7 日)售罄。我录制了对展会现场与会者和供应商的视频采访,他们的评论都是一致的:
“前些年,人们会问‘人工智能是什么?’;然而,今年他们来描述他们的使用案例,然后问“你如何能在这方面帮助我?”相反。"
这非常符合数据科学在主流业务中的分层。
AI SF '18 上的两次演讲从伦理、隐私以及您的团队今天可以采取哪些切实可行的措施等方面探讨了人工智能。虽然幻灯片和视频还没有上线,但是来自 Altimeter Group 的 Susan Etlinger 将在 10 月 11 日的人工智能伦敦会议上再次发表演讲[“道德人工智能——如何打造客户喜爱和信任的产品”](https://conferences.oreilly.com/artificial-intelligence/ai-eu/public/schedule/detail/68474)。苏珊在六月参加了*的[播客,内容涉及相关主题:](https://medium.com/the-official-integrate-ai-blog/podcast-trust-in-enterprise-ai-with-susan-etlinger-b257e2056162)*
* 在消费企业环境中定义道德和信任
* 为什么企业“应该将道德视为竞争优势,而不是无聊的合规练习”
查看她的 Altimeter Group 白皮书“[人工智能的客户体验:培养参与、创新和信任的五项原则](https://marketing.prophet.com/acton/media/33865/altimeter--the-customer-experience-of-ai--2017)”。Susan 的一个关键观点,加强了 Maryam Jahanshahi 的上述观点,即个人基于他们自己的偏见(每个人都有)做出*微观决策*,这些偏见累积成*微观策略*。同样,这与人们在大群体中无法自然做出好的决策有关。即便如此,数据科学可以帮助增强基线人类条件,以便大型组织可以合作做出客观和符合道德的决策——这是一个*竞争优势*。
Mike Loukides、Hilary Mason 和 DJ Patil 今年夏天与 Susan Etlinger 等人合作撰写了一系列数据伦理文章作为核心材料。一份[数据伦理清单](https://www.oreilly.com/ideas/of-oaths-and-checklists)产生了,现在[民主数据](http://datafordemocracy.org/)正在指导数据科学团队将该清单投入生产。最近,我与 D4D 社区经理[莫·强森](https://www.youtube.com/watch?v=8ZpQ4KZZwoc&feature=youtu.be&t=35m54s)进行了交谈,她将远赴各地进行介绍。D4D 是一个志愿者组织,看看[如何参与](http://datafordemocracy.org/contact.html)。
[Amanda Casari](https://twitter.com/anitayorker/status/1037875387831922688) 介绍企业中的伦理和隐私,[“当隐私扩大:GDPR 下的智能产品设计”](https://www.slideshare.net/AmandaCasari/when-privacy-scales-intelligent-product-design-under-gdpr-113692776)。新东西: [Deon](http://deon.drivendata.org/) 为数据科学家提供了一份 GitHub 友好的道德清单。沿着这些思路,请看来自芝加哥大学的面向 ML 开发者的“开源偏见审计工具包”。
![Amanda Casari at AI Conference](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/231cf75d1c38fae7778a379cf4fcef37.png)Amanda Casari at AI Conference, Photos by Paco Nathan
此外,我还介绍了“[开源分散数据市场,用于在大型共享风险领域培训人工智能](https://conferences.oreilly.com/artificial-intelligence/ai-ca/public/schedule/detail/72032)”,并了解了一个相关的开源项目 [PySyft](https://github.com/OpenMined/PySyft) “基于 PyTorch 的加密、隐私保护深度学习”。随着关于隐私、道德、偏见、合规性的对话深入,预计将会看到更多将隐私数据从模型训练中分离出来的工具。最终,风险管理为企业中的这些变化起到了“楔形的薄边”的作用。
## 强化学习挑战假设
丹尼·兰格关于人工通用智能(AGI)的演讲上个月被推荐到这里。再来看看重点,加上刚刚发表的一篇相关论文。简而言之,在数据建模工作中有一些假设,即我们必须从大量带标签的数据开始,才能得到一个好的 ML 模型。然后如果你想提高那个模型的预测能力,获取更多/更好的数据。但是,有时您可以利用领域知识,这样模型就不需要从头开始训练,也不需要仅仅基于堆积如山的数据。R&D 在*强化学习*领域的工作正在挑战其中的一些假设,从其他领域引入数十年来已有的实践来增强人工智能。
## 训练小狗
在 AI SF 上,Danny Lange 展示了如何训练小狗:“[在通往人工通用智能的道路上](https://conferences.oreilly.com/artificial-intelligence/ai-ca/public/schedule/detail/68710)”——游戏模拟 [Unity3D](https://unity3d.com/) 加上用于训练虚拟小狗玩“捡东西”等技能的强化学习。在此基础上,丹尼描述了几种受生物学启发的学习形式,它们超越了*深度学习*。他展示了虚拟小狗的例子:
* *模仿学习*:如见 https://bit.ly/2zvYH51(开始 0:15)
* *课程学习*:从一个简单的问题开始,然后逐步加大学习挑战的难度
* *好奇心驱动的探索*:超越了*随机探索*永远无法解决的问题,也就是说,代理不会因为想要探索其他房间而被困在一个房间(鞍点)
https://twitter.com/danny_lange/status/1045017157539713031
两个有趣的脚注:
* 并行运行数千个这样的训练模拟很简单,然后结合成功学习者的特征
* 困难的机器学习是在虚拟环境中完成的,没有人提供标记数据
最近的一篇论文详细描述了这一点:“ [Unity:智能代理的通用平台](https://arxiv.org/abs/1809.02627)”,他们的团队正在将其实现开源。虽然有人指出“人工通用智能”是世界末日(或其他什么)的前兆,但丹尼强调了开源与易于计算的方法相结合的价值:“构建人工智能最安全的方式是确保每个人都可以使用它。”说到容易计算的方法,Unity 在 [50%的手机游戏](https://www.businesswire.com/news/home/20180926005180/en/Unity-DeepMind-Advance-AI-Research-Virtual-Worlds)中运行。
## Pywren 和其他新项目
准备好迎接一场旋风吧,我必须听八遍埃里克·乔纳斯和本·洛里卡的播客采访“[为大规模计算和机器学习构建可访问的工具](https://www.oreilly.com/ideas/building-accessible-tools-for-large-scale-computation-and-machine-learning)”,然后才能勾勒出他们的轮廓。说真的,你找不到全筹码玩家的更广阔视角。虽然采访的核心是关于 [Pywren](http://pywren.io/) ,但 Eric 和 Ben 详细介绍了强化学习及其与[最优控制理论](https://en.wikipedia.org/wiki/Optimal_control)的关系,追溯到 20 世纪 50 年代。如果没有这个,我们就不会乘飞机或在高速公路上开车。RL 提供了利用[领域知识](http://www.argmin.net/2018/06/25/rl-tour-fin/)的方法,因此模型不需要仅仅从数据开始训练。此外,这些模型可以有更可预测的结果。所涉及的数学进入*贝叶斯方法*、*变分法*等。振作起来,但结果对行业中稳健的 ML 模型是乐观的。
Pywren 是一个新的开源项目,它在云中的无服务器计算上“让您大规模运行现有的 python 代码”。它与 [scikit-learn](http://scikit-learn.org/stable/) 、[熊猫](https://pandas.pydata.org/)等配合得很好。,在云/无服务器上横向扩展,用于:
* 针对特定查询的快速 ETL(非管道)
* ML 方法的定量分析(例如,科学)
作为加州大学伯克利分校 RISE 实验室的博士后,Eric 意识到 AMP 实验室和 RISE 实验室的许多研究生从未写过 T2 Apache Spark T3 的作品,于是这个项目开始了。将最后一句话重复几遍,让它深入人心……虽然在独立模式下运行 PySpark 很简单,但在科学开始发生之前,Spark 集群的设置需要大量的*数据工程*。
## 建筑方面的巨大变化
当有大量廉价的“旋转磁盘”和“商用硬件”Linux 服务器时,Apache Hadoop 和 HDFS 重新崛起,尽管这些磁盘的故障率很高。Hadoop 为完成批处理作业提供了一个可靠的框架,即使磁盘在作业进行过程中出现故障。新颖的策略是在商用硬件集群上托管您的数据集,然后*将您的计算带到数据*,尽可能利用数据局部性实现并行。大约在 2008 年,我带领一个团队运行亚马逊 AWS 上最大的 Hadoop 实例之一[。在我 2009 年在伯克利的演讲中,喜欢惩罚的人可以观看戴夫·帕特森施展他的“论文答辩”绝地技巧。](https://www.slideshare.net/pacoid/getting-started-on-hadoop/7-A_Tale_of_Two_VenturesAdknowledge)
几年后,火花出现了。几乎相同的模型,更灵活地使用[组合子](https://en.wikipedia.org/wiki/Combinatory_logic),加上更多地利用内存中的数据。后来我们有了[多核](https://papers.nips.cc/paper/3150-map-reduce-for-machine-learning-on-multicore.pdf)、[大内存空间](https://forwardthinking.pcmag.com/hard-drives/346999-storage-class-memory-the-coming-revolution)、[云存储](https://aws.amazon.com/s3/)效果惊人地好——再加上[摩尔定律失效](https://www.theregister.co.uk/2018/01/24/death_notice_for_moores_law/)。
如今,随着快速商品联网的出现,云服务的经济性完全不像早期 Hadoop 的“商品服务器”。争论更多地集中在网络上,而不是服务器上,但是不管怎样,埃里克·乔纳斯和他的团队做了大量关于瓶颈、吞吐量、故障率、经济等方面的研究。现在*将您的数据带到计算*中,而不是将您的计算带到数据中。
Eric 用“阻尼正弦”曲线来描述 Spark 和 Hadoop 中的集群利用率,其中定义了所需的最大集群资源,但只在管道的后期阶段使用部分资源。然而,“管道”是关于批处理的——而世界正在远离批处理。相比之下,在 Pywren 上大规模运行 Python 函数比在 Spark 上做类似的工作要便宜 2-3 倍。虽然*无服务器*不是万能药(也就是说,因为权衡),我们会看到更多的分析在 Pywren 这样的平台上运行。一批崭露头角的开源框架利用了更新的硬件和云架构:[箭头](https://arrow.apache.org/)、 [Crail](https://crail.apache.org/) 、 [Nuclio](https://github.com/nuclio/nuclio) 、 [Bullet](https://bullet-db.github.io/) 等。后者是 Yahoo 提供的针对大数据流的实时查询引擎,零持久层。
## 学习编码
将这一点与 IT 实践和软件工程联系起来,注意 Eric Jonas 是如何引用与不平衡连接相关的问题的,ML 模型在这方面大有可为。这是又一个[数据点](https://www.oreilly.com/ideas/how-machine-learning-will-accelerate-data-management-systems)的提示,表明学习如何被证明比编码更通用。紧接着,来自 RISE Lab 的杨宗衡最近发表了“ [SQL 查询优化遇上深度强化学习](https://rise.cs.berkeley.edu/blog/sql-query-optimization-meets-deep-reinforcement-learning/)”:
“我们表明深度强化学习在优化 SQL 连接方面是成功的,这是一个在数据库社区中研究了几十年的问题。此外,在大型连接上,我们证明这种技术的执行速度比传统的动态程序快 10 倍,比穷举快 10,000 倍。”
换句话说,使用 RL 来预测如何优化 SQL 连接。对于企业 IT 来说,这可能是一个巨大的胜利,因为 SQL 连接的效率是重中之重。
Hadoop/Spark 的策略是利用批处理和小型批处理。对于 ML 应用程序,您将关注于*编码*管道来清理您的数据,大规模运行连接,提取特征,在集群上构建模型,然后将模型部署到生产中。来自 RISE Lab 的 Eric Jonas 和其他人现在指出了架构和实践中的巨大变化,其中 RL 更关注将数据更新(流/实时)引入计算(即,大规模无服务器,世界上的移动设备)以实现最佳控制方法。数学可能令人望而生畏,但结果可能更可预测和稳健。
## 世界是长尾的
假设受到挑战,那么有效的建模需要多少数据?这里有一些关于这个主题的最新佳作…
你知道吗:你可以用回归来代替 t 检验?对于那些使用 A/B 测试在线运行客户实验的人来说,这可能会改变你收集数据的方法,以及在采取行动之前你需要多少数据——这会影响测试的速度。Stitch Fix 有一个[出色的演示](https://www.slideshare.net/stitchfix_algo/progression-by-regression-how-to-increase-your-ab-test-velocity),它可以追溯到数学(例如*条件间可变性*,以消除关于 A/B 测试统计的普遍神话。
![iNat2018 Training Distribution](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/1bba7cce37f42ee67b853ad0b642a4f5.png)*[Source: Deep Learning Analytics in iNat 2018 Challenge](https://www.deeplearninganalytics.com/)*
在深度学习方面,DL 模型需要 [10⁶ 作为训练数据集的最小大小](https://venturebeat.com/2017/10/23/google-brain-chief-says-100000-examples-is-enough-data-for-deep-learning/),这一点已经被接受。由格兰特·范·霍恩、彼得罗·佩罗娜/加州理工学院(2017-09-05)撰写的优秀论文“[魔鬼在尾部:野外的细粒度分类](https://arxiv.org/pdf/1709.01450.pdf)”探索了训练数据的*大小、类别数量和模型错误率*之间的定量关系:
训练图像的数量是至关重要的:每当我们将训练图像的数量减少 10 倍,分类误差就会增加一倍以上。这在长尾状态下尤其重要,因为尾部包含大部分类别,因此决定了平均分类性能。”
范霍恩和佩罗娜以一句绝妙的俏皮话开场:世界是长尾的。上图显示了来自[深度学习分析](https://www.deeplearninganalytics.com/)的分析,该分析是在[in naturalist 2018 竞赛](https://www.kaggle.com/c/inaturalist-2018)中排名第二的团队。这个挑战的一部分是,有多少要学习的类几乎没有用于训练的数据点。这种情况比著名的 [ImageNet](http://image-net.org/) 更加“真实”——每个类平均有大约 500 个实例——这使得“深度学习”成为一个流行短语。前面提到的 Lange,Jonas 等人的 sea change 解决了减少数据需求的问题。我可以做出一个有根据的猜测,你的企业 ML 用例更像 iNaturalist 而不是 ImageNet,我们需要找到产生有效模型的方法,而不需要巨大的标签数据集。
该领域的主要推动者之一 DARPA 最近发表了“[减少智能机器的数据需求](https://www.darpa.mil/news-events/2018-07-11)”,同时宣布了一项价值 100 亿美元的 3B 计划:
领导 LwLL 项目的信息创新办公室(I2O)的 DARPA 项目经理 Wade Shen 表示:“在 LwLL 下,我们正在寻求将从头构建模型所需的数据量减少 100 万倍,并将调整模型所需的数据量从数百万减少到数百个标记的例子。也就是说,现在需要 100 万个图像来训练一个系统,将来只需要一个图像,或者需要大约 100 个带标签的示例来适应一个系统,而不是现在需要的数百万个
诸如*主动学习、迁移学习、元学习、k-shot 学习*等技术。,建议用于研究,以使机器学习在较小的数据样本(即长尾数据)下有效工作。FWIW,我在 AI SF 上发表了“人在回路中的最佳实践:主动学习的商业案例”,它提供了解决企业中数据需求的例子。
在某些情况下,也有关于合成数据的工作。 [Augmentor](https://augmentor.readthedocs.io/en/master/) 作为一个例子,是一个 Python 包,用于“机器学习任务的图像数据的增强和人工生成”。
## 人工智能与经济理论
如前所述,有很多关于人工智能取代工作岗位、R&D 衰退等的公开讨论。其中一些假设似乎是错误的。例如,参见兰格最近的另一篇论文,[程依娜·莫-兰格](https://twitter.com/yina_ml/status/1006101689164759042)的《[人工智能对经济增长的影响:检验人工智能在创意产生中的作用](https://onedrive.live.com/?cid=6b8f3ce78808dba5&id=6B8F3CE78808DBA5%2124490&authkey=%21AGq1FHOehfeUPIQ)》。
程依娜也是一名奥林匹克滑雪运动员,他提出了一个引人入胜的论文,其中包括对新发明的“通用技术”的传播、R&D 与劳动力之间不断变化的关系、硬件能力的戏剧性演变,以及关于资本存量创造的当代理论(在经济意义上,而不是公司估值上)的详细调查。这建立在 Agrawal 等人对技术驱动的经济增长前景的基础上。在程依娜发现了早期理论工作中的一些数学错误后,她的总结是:人工智能放大了 T2 研发,增加了资本存量,对就业和全球经济的影响比劳动力转移更深远。
## 经济前景
程依娜·莫-兰格并不孤单。在 AI SF,来自[麦肯锡全球研究院](https://twitter.com/HitzkeE/status/1037772164227719168)的 Mehdi Miremadi 在“[中证实,我们是否已经达到了人类的巅峰?人工智能对劳动力的影响](https://conferences.oreilly.com/artificial-intelligence/ai-ca/public/schedule/detail/68470):
* 基于目前劳动力供应的趋势,经济前景看起来很暗淡
* 过去五十年的“生产率增长”是基于大量人口进入劳动力市场
* 我们自动化的能力(许多工作的 30%)是人工智能的故事将如何展开
也就是说,高级分析在短期内有潜力释放经济中的 11-13 万亿美元(约占全球 GDP 的 15%),其中深度学习约占 40% 。历史类比是存在的,例如,早期个人电脑的普及创造了就业机会,尽管有相反的可怕警告。
然而,有一个陷阱:*健壮的数据基础设施和有效的数据工程和数据科学实践是这场游戏的赌注*。**基于人工智能的明日资本存量创造始于今天良好的数据科学实践。**
## 按细分市场划分的企业人工智能采用情况,部分基于麻省理工学院 SMR 2017
请注意,上表中最上面的部分大约有 12 家公司,而第二和第三部分大约各占一半。人在回路中是第二个细分市场获得相对于第一个细分市场的优势的好方法,而即使是第三个细分市场也通常会有遗留资产——就未使用的数据排放而言——这可能会被利用来获得优势。
![Enterprise AI adoption by segment](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8d384bb7dc05c07e2478612c6f41e0db.png)Enterprise AI adoption by segment, partly based on [MIT SMR 2017](https://sloanreview.mit.edu/projects/reshaping-business-with-artificial-intelligence/)
这里举个反例:[“AI”做得不好](https://medium.com/derwen/marque-dos-para-espa%C3%B1ol-fedd85d13e4c)。作为一个“假设”,考虑人工智能在消费者航运领域的三个竞争对手中的采用细分:亚马逊作为现任者处于顶级细分市场,联邦快递处于第二细分市场,拥有机会和不断发展的数据文化,而 UPS 则在数据基础设施方面苦苦挣扎。
## 齐心协力
好吧,深呼吸,这就够了。简而言之,数据科学正在被用于更好的企业和公共问责,以增强/克服微观决策、微观侵略和在大群体中缺乏良好判断的固有人类状况。同时,更新的硬件、更新的云架构、更快的网络等的经济性。,意味着远离基于批处理的数据实践时代,走向涉及更多流、强化学习、无服务器等的巨变。这些实践挑战了 ML 中的假设,并开始展示 AI 在企业中的 ROI。这很好,因为我们感受到了来自与“智能机器”相关的数据需求的压力,以及现实世界用例中长尾数据的现实。从另一个抽象层面来看,人工智能的经济学也在挑战计量经济学、就业率、有效 R&D、股本创造等方面的假设。在这里,我们再次看到了与数据科学相关的最佳实践如何成为未来的赌注。
# 每个 Pacoid 的主题和会议,第 7 集
> 原文:<https://www.dominodatalab.com/blog/themes-and-conferences-per-pacoid-episode-7>
*[Paco Nathan](https://twitter.com/pacoid) 涵盖了最近对数据基础设施的研究,以及机器学习和人工智能在企业中的应用。*
## 介绍
欢迎回到我们关于数据科学的每月系列!这个月的主题不是专门关于会议总结;相反,它是关于来自 Strata Data 参与者的一组跟踪调查。我们在几个转折点上都有很大的惊喜,随后发表了一系列报告。让我们来看看从这些报告中获得的一些见解。说真的,整篇文章只不过是对这些报告的一点皮毛。与此同时,景观正在迅速演变。查看本文结尾部分,了解从该领域领导者的实践中总结出来的关键指导。
## 调查 ABC 在企业中的采用情况
"当生活给你柠檬时,做柠檬酒."在一次数据科学会议之后,我们的营销团队希望通过调查来自行业的 300 名与会者来跟进。然而,一个快乐的意外导致了更大更好的结果。该调查被错误地发送给了全球企业组织中的 15,000 人。然后,当我们收到 11,400 份回复时,对于数据收集接收端的数据科学家阿朵来说,下一步就显而易见了。我们开始分析这个偶然发现的庞大数据集,寻找趋势、异常、意想不到的见解、反直觉的惊喜等等。
在过去的六个月里,[本·洛里卡](https://twitter.com/bigdata/)和我进行了三次关于企业采用“ABC”(人工智能、大数据、云)的调查。考虑到主流企业正纷纷拥抱这三个技术领域,这个时机再好不过了。O'Reilly Media 将我们的分析作为免费的迷你书出版:
* [*机器学习在企业中的采用状况(2018 年 8 月)*](https://www.oreilly.com/data/free/state-of-machine-learning-adoption-in-the-enterprise.csp)
* [*演进的数据基础设施:高级分析和人工智能的工具和最佳实践(2019 年 1 月)*](https://www.oreilly.com/data/free/evolving-data-infrastructure.csp)
* [*人工智能在企业中的采用:企业如何在实践中规划和优先考虑人工智能项目(2019 年 2 月)*](https://www.oreilly.com/data/free/ai-adoption-in-the-enterprise.csp)
本和我还为每个调查写了文章,总结了重点。依次是:
* *[《奥莱利机器学习采用调查公司应该知道的 5 个发现》](https://www.oreilly.com/ideas/5-findings-from-oreilly-machine-learning-adoption-survey-companies-should-know)*
* " [*公司如何构建可持续的人工智能和人工智能计划*](https://www.oreilly.com/ideas/how-companies-are-building-sustainable-ai-and-ml-initiatives) "
* [*“三项人工智能采用调查揭示来自更成熟实践的关键建议”*](https://www.oreilly.com/ideas/three-surveys-of-ai-adoption-reveal-key-advice-from-more-mature-practices)
第一项调查开始于对机器学习(ML)主流采用的简单探索。使用 ML 模型对文化和组织有什么影响?谁构建他们的模型?决策和优先级是如何制定的,由组织内的谁来制定?用什么标准来评估成功?考虑到时机——大约在 [GDPR](https://gdpr-info.eu/) 生效后一个季度——这似乎是一个探究企业组织中普遍智慧的好时机。我们很高兴在世界范围内有几千个企业组织。
第二项调查更多地着眼于数据工程方面,特别是正在使用的框架(例如,开源框架与商业产品),以及这项工作是否正在迁移到云中。
对于第三次调查,我们在已经与 ML 合作的公司中挖掘了关于 AI 的细节。他们的使用案例、首选技术、预期预算、采用障碍等如何?
为了设计这些调查,我们使用几个不同的维度对数据进行了细分。地理是显而易见的,也就是说,世界不同地区之间的对比是什么?商业垂直是另一个区分 ML 实践趋势的重要优先事项:金融服务、医疗保健和生命科学、电信、零售、政府、教育、制造等。
我们还使用了*成熟度*,换句话说,一个企业组织在生产中部署 ML 模型有多久了?对于这个维度,我们指定了三个类别,尽管我们对它们的确切措辞在每次调查之间有所不同:
* **成熟实践**:“我们在生产中已经做了 5 年多了”
* **评估阶段**:“是啊,我们几年前就开始了”
* **还没有**:“只是看看,非常感谢”
换句话说,第一类代表“领导者”,而第三类代表“落后者”,其余的实际上是中间地带。这种对比为区分领先者和落后者提供了良好的基础。
说真的,本在如何组织这些调查方面的远见卓识值得称赞。我在这里主要是提供麦克卢汉的语录,并用加州口语测试我们文字编辑的耐心。再加上明显过度使用互文意合。或者什么的。
## 技术
公司正在云中构建数据基础设施:85%的公司表示他们在至少一家云提供商处拥有数据基础设施。三分之二(63%)的人在数据基础设施的某个部分使用 AWS,37%的人在某个部分使用微软 Azure,28%的人在某个部分使用谷歌云平台(GCP)。低两位数使用 AWS 和一种其他云,而 8%使用所有三种主要的公共云 AWS、Azure 和 GCP。
被云供应商商业化为服务的开源框架最近成了热门话题。坦率地说,这是云服务发展过程中的一个长期叙事弧——例如,我在 EC2 上做了一个关于 Hadoop 的大型案例研究,它帮助通知了 [Elastic MapReduce](https://aws.amazon.com/emr/) 的发布。在我们的第二次调查中,出现了一些关于云的有趣见解,如下图所示。
![Which of the following streaming or data processing tools/frameworks do you use graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/957e074bafdb684c07d93a01d0172c7c.png)
也就是说,有很多开源框架用于数据处理和流式传输。虽然我在主流 IT 中听到了很多关于雪花采用率的说法,但在这里,我们看到 Spark、Kafka 和 Hadoop 是最受欢迎的数据处理工具,以及它们在云中对应的托管服务。**注意依赖开源和使用托管服务的比例大约是 2:1。**
无服务器也在雷达上。虽然许多组织仍处于采用无服务器技术的早期阶段,但在复杂的实践中,53%的组织已经在使用主要云供应商的无服务器产品:AWS Lambda、GCP 云功能、Azure 云功能等。顺便说一句,如果你还没有阅读加州大学伯克利分校 RISE 实验室的最新分析和项目,请停下你正在做的事情,看看戴夫·帕特森、扬·斯托伊察、埃里克·乔纳斯等人的[“简化的云编程:关于无服务器计算的伯克利观点”](https://www2.eecs.berkeley.edu/Pubs/TechRpts/2019/EECS-2019-3.pdf)。十年前(同一天),同一批教授发表了开创性的“[云端之上:云计算的伯克利观点](https://www2.eecs.berkeley.edu/Pubs/TechRpts/2009/EECS-2009-28.pdf)”论文,该论文预见了未来数年云采用的形式,并指导了 Apache Spark 的创始团队。
O'Reilly Media 早些时候进行了一项关于深度学习工具的调查,该调查显示前三大框架是 TensorFlow (61%的受访者)、Keras (25%)和 py torch(20%)——注意,在这种情况下,Keras 可能被用作 TensorFlow 之上的抽象层。今年,我们看到 Keras (34%)和 PyTorch (29%)正在取得进展。
深度学习中使用的数据类型很有趣。基本上有四种类型:图像/视频、音频、文本和结构化数据。虽然自 2011-2012 年众所周知的“ [AlexNet moment](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf) ”以来,图像数据一直是深度学习用例的中坚力量,并且过去 2-3 年自然语言处理中的[复兴](https://paperswithcode.com/area/nlp)加速了对文本用例的重视,但我们注意到结构化数据在企业中处于首位。这很可能是 devops、远程信息处理、物联网、过程控制等的混合,尽管它对采用强化学习也有积极的意义。
![AI training data graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cb7a8283649be336f270573aa5a66a5f.png)
人工智能技术创业公司向企业出售能力,请注意。下图显示了未来一年计划的 ML 工作流功能排名。请注意[模型可视化](https://towardsdatascience.com/understanding-your-convolution-network-with-visualizations-a4883441533b)是如何浮出水面的,这对模型的可解释性、网络威胁等都有影响。
![ML Workflow survey results graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ebe6f376158a55a3b8ebf600c54062a7.png)
排名第二的类别也很有趣——当你特别关注 FinServ 垂直领域时,它排名第一。到 2018 年年中,AutoML 的使用在企业中引起了很少的兴趣-在第一次调查中,我们的受访者中只有个位数的百分比。到 2018 年 11 月,43%的人报告说,他们计划在 2019 年的某个时候将 AutoML 纳入他们的工作流。成熟的实践报告了 86%,在金融服务中,这个数字更高一些。这代表着战略的重大转变,云提供商将从中受益。也就是说,AutoML 并没有解决 ML 部署的整个生命周期。
公司正在将人工智能应用于他们可能已经有分析应用程序的功能领域,并以此为基础。与此同时,“人工智能”的范围正在扩大:
![AI technology survey results graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7fc5d776eea38ad0e47a9bbbbc35652e.png)
在我们的调查中,有一半的组织已经在使用深度学习。三分之一使用人在回路。四分之一使用知识图表。五分之一使用强化学习。请注意,强化学习可能比一般认为的更广泛地应用于工业生产中,并期待它在企业解决方案中变得更加普遍。此外,迁移学习提出了一个有趣的细微差别,因为它在生产中的使用往往需要更有经验的从业者。我们看到成熟的实践使用迁移学习的速度是评估阶段公司的近三倍。迁移学习的应用是有价值的,尽管对于门外汉来说可能不那么明显。
## 管理
正如所料,我们的第一项调查显示了成熟的组织如何利用其内部数据科学团队来构建他们的 ML 模型,而经验不足的组织往往更依赖外部顾问:
![Who builds ML Models survey results graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6a62cf45c9f21d5031452f317977d89b.png)
然而,令人惊讶的是,大量更复杂的组织依赖数据科学线索来设置项目优先级和确定成功的关键指标:
![KPIs for data science projects survey results graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/38d6c688c65e348da3a71e4306416822.png)
这些传统上是产品经理或高管的职责。此外,更复杂的组织报告说他们更多地使用“其他”方法,而不是“敏捷”方法。我们没有办法探究“另一种”方法可能是什么。
无论如何,正如我们从几个方面听到的那样,将 ML 模型引入生产似乎与“照常营业”背道而驰。典型的产品管理和软件工程方法根本不适用于数据实践。相反,经验丰富的公司似乎正在将关键决策移交给最了解其领域的数据科学领导。
深入了解生产中 ML 模型的过程的更多细节,总体上 40%的受访者表示他们的组织检查模型的公平性和偏见。在成熟的实践中,这一比例高达 54%的受访者:
![success evaluation survey results graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ab51d2c44271bfe7bbebc4c8f48832bb.png)
同样,43%的受访者属于在将 ML 模型投入生产之前检查数据隐私问题的公司,在成熟的实践中,这一数字跃升至 53%。
这三项调查中的细节太多,无法在一篇文章中充分涵盖。然而,笑点留到了最后:
![Budget commitment to AI survey results graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/acd62a02d32d1a71c931b78b6da1305a.png)
请注意 43%的成熟实践如何将 2019 年整体 IT 预算的 20%或更多投入到 ML 项目中。换句话说,领先者和落后者之间的分裂正在加速。领导者已经学会了如何从 ML 中创造投资回报——现在他们更有竞争力,并在人工智能上下了双倍赌注。然而,落后者有数年的数字化转型、公司文化排毒、巨大的人员障碍等。在他们变得有竞争力之前去克服。
## 综合
正如我在之前的文章中所描述的,数据科学的基础对于那些打算开发复杂数据能力并最终部署人工智能应用的公司来说是“赌注”。换句话说,如果一家公司不首先偿还技术债务,并使其数据基础设施井然有序,它将无法进入这一旅程的后期阶段。这些后期阶段是组织获得关键洞察力、竞争能力和认识到数据科学投资回报的阶段。
在第三次调查中,我们试图量化企业组织在这一过程中遇到的风险。下图按顺序显示了这些步骤,以及将每个步骤列为其主要瓶颈的受访者百分比,您可以将这些步骤视为企业中竞争性人工智能采用的成功结果的[生存分析](https://en.wikipedia.org/wiki/Survival_analysis):
![Synthesis of risks encountered in data science projects](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2c7f8214721207ea6edbd856427f2417.png)
请记住,第三次调查中 81%的受访者在已经对 ML 感兴趣的公司工作;虽然上图中的顺序适用于整个企业,但风险的分布将更倾向于有经验的数据科学实践的问题。此外,我根据成熟度来解释步骤的顺序:在经验较少的团队中更普遍的问题被放在旅程的早期步骤中,而后期步骤是更有经验的团队面临的问题。说到这里,你可能会注意到图表有两三种模式?这些与成熟的阶段相对应——让我们深入了解这些细节。
前三大挑战代表“不成功”的情况,正如[早期研究](https://sloanreview.mit.edu/projects/reshaping-business-with-artificial-intelligence/)所报告的那样,它们是落后者报告的更常见的绊脚石。也就是说,一个组织首先需要解决其技术债务,打破孤岛,确保高层管理人员支持,并学习如何确定适当的业务用例。
接下来列出的三个挑战——缺乏数据、人才短缺和合规性问题——即使对于 ML 的早期采用者(即更成熟的实践)来说也是众所周知的问题。
坦率地说,我很惊讶工作流可再现性没有得到更大的份额。即便如此,在早期问题得到解决之后,以及当有更大、更复杂的 ML 项目正在进行时,再现性和超参数优化可能会成为问题。
无论如何,对人工智能的采用有一种生存分析。在这一过程中,您的组织处于什么位置?如果你目前正与数据质量问题争论不休,你可能会开始展望员工或法律问题将如何成为下一个要面对的障碍。
其中一些障碍可能会在旅程的不同点出现,这取决于组织。例如,如果一个团队采用“自下而上”的方法来构建他们的数据能力,那么识别适当的业务用例或培养支持性的公司文化的问题可能会在以后的阶段出现。换句话说,虽然您的数据科学团队可能独自取得了许多进展,但如果产品管理人员不了解在生产中使用 ML 模型,或者高管人员仍然持怀疑态度,这些风险可能会在后期阶段转化为战略瓶颈。
与此同时,在更成熟的数据实践和没有取得太大进展的组织之间的对比中,有一个故事正在展开。我们从三项调查中得出的主要结论是,领先者正在加速脱离落后者。证据是成熟的实践如何在 2019 年对 ML 项目进行如此大量的投资。
我试图从这些成熟的实践中总结出一些总体指导:
* 尽早克服与公司文化或无法识别业务用例相关的挑战。做足准备,教育其他利益相关者,并达成共识。
* 您的组织可能需要在基础设施工程上投入比它想象的更多的资金——永久地。虽然做到这一点至关重要,但不要让尾巴摇狗:“做好数据科学”的可参考公司投资于良好的基础设施,足以将它的关注转移到中心舞台,使数据科学团队能够负责更多的 ML 业务生命周期,而不是简单地将模型交给工程团队。换句话说,如果你的平台工程尾巴一直在摇业务用例狗,你的公司可能会付出太多的开销来长期维持它的数据科学计划。
* 开发内部数据科学能力,以建立和管理 ML 模型,而不是外包这项工作。此外,建立明确的角色,如数据科学家和数据工程师,而不是试图将这些职责硬塞给传统角色,如业务分析师。我在真诚对待公民数据科学的组织中听到了关于公民数据科学的精彩论点,尽管当这句话在传统企业环境中翻译为“让我们继续做我们自 20 世纪 90 年代以来一直在做的事情”时并不如此
* 请注意,缺乏数据和熟练人员都会带来持续的挑战。继续投资这些。大型企业所需的转变需要数年时间。拥有有效的基础设施是这场扑克游戏的赌注,但倾向于过早弃牌的玩家甚至不会赢回他们的底注。
* 当雇佣数据科学家和数据工程师时,通过雇佣能够识别可用 ML 技术的适当业务用例的人来补充。“人工智能的产品管理”缺乏经过验证的方法,这种专业知识需要时间在组织层面上培养。
* 就目前而言,让数据科学领导设定团队优先级并确定项目成功的关键指标可能会更好,而不是改造不熟悉数据科学流程和问题的产品经理。
* 除了简单地针对业务指标进行优化之外,还要针对模型透明性和可解释性、公平性和偏见、道德、隐私、安全性、可靠性以及其他方面的合规性,采用可靠的清单。
* 探索深度学习之外的用例:其他解决方案正在获得巨大的吸引力,包括人在回路、知识图和强化学习。
* 寻找可以应用迁移学习的用例,迁移学习是一种微妙的技术,在这种技术中,更高级的实践认识到了更多的价值。
另一件事…我一直听到宣扬的一点是,数据科学家和工程师之间有一种隐约的脱节。相反,迫在眉睫的脱节**是 ML 的工程部署和业务用例的“最后一英里”之间的差距,你需要熬夜担心**。火花,卡夫卡,张量流,雪花等。,不会在那里救你。AutoML 不会在那里救你。这就是模型一旦暴露给实时客户数据就会退化的地方,这需要大量的[统计专业知识](https://www.oreilly.com/library/view/strata-data-conference/9781492025856/video322935.html)来回答甚至一个简单的“为什么?”利益相关者的问题。这是一个大的攻击面暴露于针对输入数据的[安全利用](https://twitter.com/kennyco26/status/1100128527947612161)的点——具有目前几乎不可想象的后果。这就是复杂的道德和合规问题产生的地方,这些问题会导致愤怒的监管者前来敲门。那些是商业问题。当最终业务问题会给你的组织带来最大的痛苦时,停止膨胀数据工程团队作为灵丹妙药。我们在企业中采用人工智能的时间还不够长,关于这些问题的案例研究还不足以成为标准的 HBS 讲座,但它们将会成为。很快。
# 每个 Pacoid 的主题和会议,第 8 集
> 原文:<https://www.dominodatalab.com/blog/themes-and-conferences-per-pacoid-episode-8>
*[Paco Nathan](https://twitter.com/pacoid) 最新专栏深入探讨数据治理。*
## 介绍
欢迎回到我们每月一次的主题和会议。本月的文章重点介绍了今年早期数据会议之一的更新,[Strata Data Conference](https://conferences.oreilly.com/strata)——上周刚刚在旧金山举行。特别是,这是我的 Strata SF 演讲“数据治理概述”,以文章形式呈现。它包括关于*数据治理*的当前问题、主题、供应商和产品的观点。
我对数据治理(DG)的兴趣始于 O'Reilly Media 最近关于企业采用“ABC”(人工智能、大数据、云)的行业调查。我在“[人工智能采用的三项调查揭示了来自更成熟实践的关键建议](https://www.oreilly.com/ideas/three-surveys-of-ai-adoption-reveal-key-advice-from-more-mature-practices)中介绍了这些主题,并在本专栏的“[第 7 集](https://blog.dominodatalab.com/themes-and-conferences-per-pacoid-episode-7/)中更详细地探讨了它们。让我们来看看一个调查问题的结果,特别是“您的组织目前正在构建或评估哪些解决方案?”
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/81ca6e610cf8bd129c8dc6d1fe38bff2.png)
对于想要投资数据科学的公司来说,前三项基本上是“你知道的魔鬼”:数据平台、集成、数据准备。冲洗,起泡,重复。这是游戏中的赌注。
[数据治理](/choosing-a-data-governance-framework)是企业团队在 2019 年采用或评估的第四种最受欢迎的解决方案。这是一个很大的优先级——尤其是当你将紧密相关的项目组合在一起时,比如排名在附近的*数据血统*和*元数据管理*。此外,更成熟的机器学习(ML)实践比缺乏经验的组织更重视这类解决方案。综上所述,这些观点需要对该领域进行更深入的审查。
当然,我不是 DG 的专家。我有数据科学方面的专业知识,加上云计算、软件架构、自然语言、数据管理等相关领域……所以我*应该*有关于该主题的良好工作知识——但我没有。这给了我一个学习的机会,让我和大多数观众站在了同一立场上。另外,“机器学习原住民”也差不多该开始讨论 DG 了。也许我们可以从不同的角度和优先事项出发,帮助探讨这些问题。
因此,这个月让我们来探索这些主题:
* 2018 年是 DG 失败的爆发点,引发了世界各地的头条新闻,并引发了人们对该领域的兴趣。
* 考虑:ML 对 DG 有什么影响,反之亦然?
* 这里有一个关于问题、工具、供应商、标准、开源项目和其他考虑因素的调查。
* 系统架构的变化反映在我们收集、使用和管理数据的方式上,因此成为 DG 的驱动因素。
最后一点是我将从 DG 那里拿走的北极星。着眼于系统架构的发展变化,了解数据治理的发展方向。
## 定义和描述
为了探究 DG 并公平对待这个话题,让我们从几个不同的角度来探讨。我们将从标准定义开始——目前业内公认的智慧。然后,作为对比,我们将转向“愤世嫉俗的观点”,这种观点在业内也很普遍。接下来,我们将回顾一下对 DG 的复杂性产生了巨大影响的系统架构的发展历史。
另一个注意事项:有些人问为什么这包括这么多关于安全性的细节。简而言之,将安全性、数据管理和系统架构分开是不切实际的(或不负责任的)。由于这三个领域中的任何一个领域都存在挑战和机遇,因此它们会共同发展。更长的答案是,在机器学习用例的背景下,对数据完整性的强假设导致了整体脆弱的解决方案。换句话说,不要指望 100%的安全性、100%的隐私性、100%的正确性、100%的公平性等等。那些日子如果曾经存在过,也早已一去不复返了。相反,我们必须建立稳健的 ML 模型,考虑到我们数据的固有限制,并承担后果的责任。换句话说,#成人化。要获得更详细的解释,请参见本文末尾链接的本·洛里卡和安德鲁·伯特的访谈。
对于定义,让我们从标准的教科书/百科全书定义开始:
*“数据治理包括在整个业务企业中创建一致且适当的组织数据处理所需的人员、流程和信息技术。*
我遇到的最好的一句俏皮话可能是这样的类比:
DG 对于数据资产就像 HR 对于人一样。
这个定义加上一行程序提供了一个很好的起点。此外,在调查文献时,两个关键驱动因素非常突出:
* **风险管理**是
for DG 在企业中的应用。
* 流程效率(**成本降低**)总体上是
a 第二,priority﹣at 第一,尽管这种情况可能会改变。
另一个趣闻…在最近的三次经济衰退中,DG 支出比整体 IT 支出增加了
faster。因此,它看起来相对抗衰退。我并不是在暗示当前的经济状况与这份报告的时间有关……#只是说说而已。
## 愤世嫉俗的观点
从那时起,我开始有了更愤世嫉俗的观点。这些对对位很有帮助。例如,在谷歌搜索中查看热门文章时, [Rob Karel 在《计算机世界》](https://www.computerworld.com/article/3032333/data-governance-so-mom-can-understand.html)上的文章脱颖而出——忽略了它有些不太合适的标题。套用一句话,即使在有多年数据管理工作经验的人中,DG 的话题也经常被忽略,因为:(1)它很难;(2)有一个漫长的,只求你一个眼球的错误开始的历史。
DG 的实际情况提出了几乎铺天盖地的一系列主题。一些更好的点充其量看起来是无定形的。虽然对于治理的不同方面有许多单点解决方案,但“数据”一词在现在的技术中意味着许多不同的东西,有太多的接触点——我们将在下面回顾。
因此,当我询问这一领域的专家时,毫不奇怪,他们的回答是提问。总的来说,我不相信有很多人是 DG 的专家。对任何人来说,保持一个全面的视角都是困难的。即便如此,越来越多的人担心我们需要解决这个问题。而且很快!
考虑到一些愤世嫉俗者的一些可能动机…我的朋友 Alistair Croll,Strata 的联合主席,写了一篇有趣的文章,“[不同的大陆,不同的数据科学](https://medium.com/@acroll/different-continents-different-data-science-703f5114366) ,"
去年在媒体上。不可否认,这篇文章对人们看待数据的地理差异进行了全面概括。即便如此,这些概括听起来是正确的:
* 中国:人们担心数据的真实性(因为政府倾向于专注于大规模收集数据)。
* 西欧:人们担心数据的存储和分析(因为该地区有严重滥用存储数据的历史先例)。
* 北美:人们担心
acting 对数据产生意想不到的后果(因为,嗯,有太多该死的律师专注于给人们更多的理由来担心所有事情的意想不到的后果)。
可以说,任何这些担忧都可能导致对 DG 解决方案的不信任——或者至少是严重的质疑。然而,总的来说,Alistair 利用这些观点构建了一个重要的视角:
<
p style = " padding-left:40px;"“现实是,任何可靠的数据科学计划都需要
to 担心准确性、存储、分析和使用。”
说得好。
查看我们按地理区域划分的调查结果,有趣的是这些区域对 DG 和相邻主题的优先顺序:北美(最高)、西欧(中间)、南亚和东亚(最低):
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/18c132446adeedfe2a5fc000daecb5df.png)
至此,我们有了定义和对位。换句话说,要实施的 DG 以及对 DG 实施方式的现实看法。我会很高兴地接受好的和坏的,然后试着看看我们下一步要去哪里。为了更好地了解 DG 的现状和近期前景,首先,让我们仔细看看我们是如何走到这一步的历史。在过去 60 年的 IT 发展中,与安全性、数据管理和系统架构相关的挑战和机遇是如何交织在一起的?
## 图像简史
正如故事所述,DG 的历史分为四个时代:
* “应用时代”(1960-1990)——一些数据建模,
though 总体上不太关心
* “企业存储库时代”(1990–2010)——第一代 DG 解决方案
* “更多政策出台”(2010-2018 年)
* 《闪点》(2018)–[GDPR](https://eugdpr.org/)生效,加上重大数据失误似乎无处不在
*[《华尔街日报》](https://blogs.wsj.com/cio/2018/03/19/%E2%80%8Bthe-morning-download-facebook-at-center-of-global-reckoning-on-data-governance/)* 将 2018 年称为“数据治理的全球清算年”,参考了[对剑桥分析公司](https://www.nytimes.com/2018/03/19/technology/facebook-cambridge-analytica-explained.html)的调查,脸书[受到美国国会](https://www.washingtonpost.com/news/the-switch/wp/2018/04/11/zuckerberg-facebook-hearing-congress-house-testimony/?utm_term=.beb76fcd6b29)关于数据滥用的拷问,以及[数十亿人](https://www.digitalinformationworld.com/2018/12/biggest-data-breaches-of-2018.html)受到各种公司、学校、政府机构等发生的数据泄露的影响。
这当然有助于设定预期。现在对 DG 的关注是非常必要的;然而,这发生在 DG 的现实变得更加复杂的时候。
考虑到这些复杂性,我觉得有必要画些图——试图勾勒出 DG 历史中的“如何”和“何处”,以帮助更好地协调这些问题。
### 20 世纪 70 年代及更早
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/59e0beb76aa0118d2b8538e491cb2507.png)
总的想法是有一个非常大的服务器,加上一些通过专有线路连接的终端。换句话说,[大型机](https://en.wikipedia.org/wiki/Mainframe_computer)在此期间占优势。数据是在那台非常大的服务器中运行的应用程序的一部分。即便如此,除了对访问权限、备份等的系统控制之外,该架构在治理数据方面并没有太大的区别。换句话说,DG 还不是一个完整的东西。
FWIW,我在演讲中问“在穿孔卡片和电传打字机时代,谁开始编程?”MVS、VSAM、JCL、APL 等。幸运的是,其他几个人举起了手。否则,我现在就开始觉得自己老了。或者也许“老”是一个更好的说法。或者什么的。
### 20 世纪 80 年代
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/201f8abf22f9727db1efc934dc99c9c2.png)
六七十年代, [Unix](https://en.wikipedia.org/wiki/History_of_Unix) 发生了,C 编程语言发生了,[小型机](https://en.wikipedia.org/wiki/Minicomputer)发生了, [ARPAnet](https://www.lk.cs.ucla.edu/internet_first_words.html) 发生了,[以太网](https://www.hpe.com/us/en/insights/articles/the-birth-and-rise-of-ethernet-a-history-1706.html)发生了, [UUCP](https://en.wikipedia.org/wiki/UUCP) 发生了。网络出现了。架构改变了。编程风格改变了。软件创业公司获得了更多的关注。许多新颖的想法挑战了将一个非常大的服务器连接到一些终端的传统观念。虽然这些变化的结果需要几年时间才能融合,但最终人们开始考虑一种叫做 **[客户机-服务器的新架构模式。](https://en.wikipedia.org/wiki/Client%E2%80%93server_model)**
客户机-服务器应用程序在一台服务器上运行,然后通过网络与其他服务器通信。电子邮件就是一个很好的例子。
***趣闻:**20 世纪 80 年代初,我参加了一个系统研讨会,参与者是我们系的一些研究生和教授,还有他们来自附近一所大学的同事,他们展示了一个叫做“斯坦福大学网络”工作站的东西。他们成立了一家初创公司,建造这些越来越受欢迎的“ [SUN 工作站](https://en.wikipedia.org/wiki/Sun_Microsystems#History)”。楼上的另一位教授正计划推出一个新的网络协议套件,名为 [TCP/IP](https://en.wikipedia.org/wiki/Vint_Cerf) 。在拐角处,校园内使用的计算机系统的几个系统管理员正忙着挑选研究生和大学资源来构建蓝色塑料“[甘道夫盒子](https://en.wikipedia.org/wiki/Cisco_Systems#History)”——我们用它来在不同的局域网之间切换终端。他们被逮捕并搬出校园,将他们的公司改名为思科。当时我更关心期中考试,在新浪潮乐队中演奏键盘,以及一个被称为“[神经网络](https://en.wikipedia.org/wiki/Hopfield_network)的奇怪研究领域,所以我基本上没有注意到那些公司——DEC、Sun、思科——是如何迅速成为客户机-服务器时代的标志性成功故事的。*
到目前为止,DG 是有限的(见上面的小红点),但正在增长:应用程序不再简单地运行在一个非常大的服务器上,所以登录密码不再完全覆盖访问控制。换句话说,我们隐约知道 DG 最终会被需要,但是没有人真正去做。肯定有标准委员会在某个地方忙于这个问题?(能举出更早的例子吗?在我的公共时间线上发推文建议,时间: [@pacoid](https://twitter.com/pacoid)
### 20 世纪 90 年代
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/316e2a67ba8e0006ccd273e1c921e2fc.png)
啊哈!这里是 DG 行动开始发生的地方。到了 20 世纪 90 年代, [*网间互联* g](https://en.wikipedia.org/wiki/Internetworking) (TCP/IP)已经成为一个流行的东西。运行在互联网上的应用程序推动了架构的重大变化,从而改变了我们对如何管理数据的观念。
***趣闻:1992 年 12 月,我用一种叫做 [Gopher](https://en.wikipedia.org/wiki/Gopher_(protocol)) 的互联网应用程序,与人合伙创办了一家电子商务公司(实际上是一个在线邮购目录),这种应用程序在当时相当流行。一些相关人士询问这种做法是否合法……说真的,通过由大学、公司和政府机构托管的计算机网络从事商业活动,利用文件传输和电子邮件牟利,真的可以吗?原来是这样。除了我们的[古怪的媒体集体](https://web.archive.org/web/19990117093314/http://fringeware.com/)在大众的要求下,仅仅几个月后就转向了 WWW。和世界其他地方一样。抱歉地鼠。***
**作为网络的一个结果,客户-服务器时代的两层架构让位于三层架构。*表示层*将 UX 移动到浏览器中。之前存在于应用程序中的业务逻辑现在被重构到一个*中间层*层中——很快被称为“中间件”也就是*应用服务器*。越来越多的,这些仅仅是网络服务器。大多数数据管理转移到后端服务器,例如*数据库*。所以我们有三个层次来提供关注点的分离:表示、逻辑、数据。
请注意,[数据仓库](https://en.wikipedia.org/wiki/Data_warehouse#History) (DW)和商业智能(BI)实践都出现在大约 1990 年。考虑到这两个因素,再加上 SQL 作为一种数据库策略越来越受重视,一幅明显的关系图在这十年间融合在了一起。因此,DG 的“企业存储库时代”作为一种行业实践出现在所有关系中的第三层。
那些时候相对简单:将所有数据保存在数据库中,远离网络边界,远离攻击者,遵守明确定义的权限策略–哦,对了,记得执行备份。
### 2000 年代
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/61372f86895e37ae86576628459491e1.png)
现在情况开始变得更加混乱。 **[云](https://dash.harvard.edu/bitstream/handle/1/24829568/tr-08-07.pdf?sequence=1)** 介绍:亚马逊 AWS 于 2006 年推出公测版。手机问世:2006 年,“ [CrackBerry](https://en.wikipedia.org/wiki/Smartphone#Early_smartphones) ”一词成为时尚,随后第二年 iPhone 发布。边缘缓存对于管理从网络服务器到移动设备的数据变得至关重要。VPN、 [IDS](https://en.wikipedia.org/wiki/Snort_(software)) 、网关、各种嵌入式解决方案、将外围环境中的所有防入侵措施捆绑在一起的 sim 等网络安全技术层出不穷。电子商务变得越来越大,并成为许多安全问题(如信用卡)的强制功能。数据在移动。
本世纪初崛起为科技巨头的公司有很多共同点。最初的四个独立地认识到 RDBMS 许可的过高成本将如何阻碍他们成长的业务。相反,大约在 1997 年末,他们[基于*水平扩展*方法和明显更少的直接使用 SQL,重构了他们的单片网络应用](http://glinden.blogspot.com/2006/02/early-amazon-splitting-website.html)(例如,中间件)。这导致了服务器农场,从客户互动中收集大量的日志数据,这些数据然后被聚合并输入到机器学习算法中,这些算法创建了 [*数据产品*](https://www.oreilly.com/ideas/data-jujitsu-the-art-of-turning-data-into-product) 作为预先计算的结果,这反过来使 web 应用程序更加智能,并增加了电子商务收入。此外,这些数据开始大量地在移动设备之间来回传输。吴恩达后来将这种策略描述为“人工智能的良性循环”——也称为*飞轮效应*。换句话说,那些早期的科技巨头一举发明了云、大数据和早期的数据科学实践。Booyah!
注意 DW+BI 是如何在图的*后端服务器*角落结束的,DG 是一个组件。在图的其余部分,已经发生了很多变化,但这一部分没有——DG 仍然愉快地享受着它的“企业存储库时代”的宁静日子。如此多的数据流经其他部分,但这不是 DG 解决方案所关心的。还没有。
***有趣的事实:**2011 年,谷歌收购了之前的[摩托罗拉](https://www.google.com/press/motorola/)的残余部分。后来,他们卖掉了公司的大部分,保留了一些知识产权,并且保留了内部文件的副本。在这个档案中的某个地方,有一份 1990 年的内部白皮书,内容是关于“使用神经网络和硬件加速的智能手机应用程序”——由 yours truly 合著——负责大胆技术计划的摩托罗拉高管阅读了这份白皮书,并没有发现特别有趣。我觉得那很有趣。*
### 2010 年代
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8f7d6c2b488f8317df24e1ab66aa7542.png)
云在发展。电子商务变得巨大。现在几乎每个人都有一部智能手机。我们之前提到的日志数据现在占了世界上大多数数据。数据科学有自己的[技术大会](https://conferences.oreilly.com/strata)。
来自机器的数据往往会(又名, *[静态数据](https://en.wikipedia.org/wiki/Data_at_rest)* )存放在*的耐久商店*,如亚马逊 S3,然后被 Hadoop、Spark 等使用。不知何故,数据的重力产生了地质效应,形成了 *[数据湖](https://www.kdnuggets.com/2018/06/data-lake-evolution-data-processing.html)* 。
此外,数据科学工作流开始创建从上述 illo 的大数据端到 DW 端的反馈循环。这在早些年是异端邪说。DG 是为全球大数据领域而出现的,例如,2012 年发布的 Alation。
简而言之,良性循环在增长。我们一直在给怪物提供数据。我们找到了改进机器学习的方法,使其需要数量级以上的数据,例如,[用神经网络进行深度学习](https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf)。
***趣闻:** Satyen Sangani 和我是在 2012 年的一次大数据会议后,在山景城的一家[标志性的西雅图咖啡馆连锁店](https://www.google.com/maps/place/Starbucks/@37.4210666,-122.0967388,16z/data=!4m15!1m9!2m8!1sstarbucks!3m6!1sstarbucks!2sCostco+Wholesale,+1000+N+Rengstorff+Ave,+Mountain+View,+CA+94043!3s0x808fba0558b2a12f:0xbb457a3972673971!4m2!1d-122.0958161!2d37.4210332!3m4!1s0x0:0x490b0306da6e619b!8m2!3d37.4217996!4d-122.0964195)相遇的,在那里他在一张众所周知的餐巾纸的背面勾画了关于如何处理大数据工具的数据治理的想法——从数据目录开始,以跟踪数据集及其来源。真希望我留着他的餐巾,但这可能会让人毛骨悚然。几个月后,我去位于帕洛阿尔托的新办事处拜访了 Satyen,他们已经成为大银行的客户。*
### 2020 年代
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/1e7bb6c35306f9163aabc92aa94555d4.png)
换句话说,从我们现在所处的位置向前看。这是一个多云的世界。这是一个混合云世界。还有更多移动设备。然而,也有一个巨大的海啸边缘推理设备得到部署。有数据 API、各种 SaaS 服务、合作等。所有这些都带来了关于治理和法规遵从性的潜在问题。
安全性不再位于组织网络资产的外围。取而代之的是,许多关于安全的智能已经被推到了新一代的[边缘缓存](https://www.cloudflare.com/)(用 [HSTS](https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security) 代替 [MITM](https://en.wikipedia.org/wiki/Man-in-the-middle_attack) , [DDoS](https://en.wikipedia.org/wiki/Denial-of-service_attack) )。接下来是架构上的变化,如 [JAMstack](https://jamstack.org/) 和作为云计算第二个十年的[模式的“无服务器”整体转向。](https://rise.cs.berkeley.edu/blog/a-berkeley-view-on-serverless-computing/)
良性循环越来越快。流数据和发布/订阅架构通过 Kafka、Pulsar 等推送数据。,而不是简单地降落在数据湖中。机器学习中较新的工作(例如 *[强化学习](https://arxiv.org/pdf/1806.09460.pdf)* )需要数量级更多的数据,并且需要它是流式的。
到处都是模特。模型用于电子商务,但现在用于许多其他用例。它们嵌入低功耗设备中,有时甚至用于数据管理。现在有人呼吁*模式治理*。
游戏的赌注已经改变。民族国家眼睁睁地看着他们的政体因数据隐私问题和系统被不良分子滥用而遭到破坏。数十亿人成为数据泄露的受害者。黑客真的不再有趣了。数据被武器化。
一个巨大的**顺应性**环围绕着以上所有。 [GDPR](https://gdpr-info.eu/) (通用数据保护条例)已经在欧盟实施,但它适用于在世界任何地方使用的任何欧盟数据。几个月后,加州紧随其后,颁布了(加州消费者隐私法案),美国其他州也纷纷效仿。换句话说,GDPR 式的发展已经成为定局。
有 DG 点解决方案,虽然没有太多的连接块。巴尔干化可能是一个很好的描述。较大的供应商开始谈论一种新的“结构”,这种结构允许相同的 DG 策略和流程跨多个云、混合云、本地云等应用。,将各种单点解决方案整合成一种更普遍的方法。坦率地说,如果实施得好,这是有道理的。
有趣的事实:我们现在都站在这里。一起。可以说,有点困惑,也许有点枪伤。Booyah!
## 简而言之,断开连接
我对这个叙事弧线的解读是,大约在 2001 年出现了一些真正奇怪的紧张关系:
* 可以说,这是 DW+BI 的鼎盛时期
* [*敏捷宣言*](https://agilemanifesto.org/) 发表
* 一代开发人员将“数据库”等同于“关系型”,认为**系统的易读性=那些系统内的数据的易读性(*提示*:不)**
* 即便如此,作为对 RDBMS 定价的反应,新崛起的科技独角兽集体转向 NoSQL
* [机器学习](https://projecteuclid.org/euclid.ss/1009213726)开始成为一项大型商业努力,尽管 DG 解决方案没有考虑道德、偏见、隐私、安全等因素。,在 ML 的上下文中
* 科技独角兽开始"[快速移动并打破东西](https://www.goodreads.com/book/show/31420725-move-fast-and-break-things)"而没有充分关注 DG
通过举手表决,术语“数据”在敏捷宣言中出现了多少次?5 次?3 次?一次?零?如果你回答“零”,你就赢了!抱歉,敏捷里没有数据。
坦率地说,考虑到所有这些因素,它们并不一致。乱七八糟。大约从 2001 年开始,这是一个非常大的混乱,现在变得相当危险。换句话说,在我看来,这个问题的要点是:
* 一代主流开发者被教导
“编码是迫在眉睫的,数据是次要的”
* 与此同时,拥有先发优势的科技巨头纷纷涌向
" **学习是卓越的,数据是竞争优势**
请思考一下这两种说法之间的矛盾。如果你的组织倾向于前者,请重新考虑你的情况。
二十年后,我们仍然停滞不前,而由于边缘推理、流数据、多云、更多安全问题等,环境变得更加复杂。幸运的是,有一个名为首席数据官(CDO)的新 C 级职位将神奇地解决这些问题!
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a4d08cf9b1dc17c5a10cf281db54834f.png)
哇,首席数据官,这可真棘手!请让我第一个祝贺你担任新职务。有太多的机会来改变现状。
说到魔法,我就把这个放在这里,在“再次制造象限魔法”(MQMA)的副标题下。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c4e6f6af1e4eaa0c8cdffd323fbed8b0.png)
## 近期展望
让我们快速看一下现在有哪些资源可用,以及近期会出现哪些趋势。
## 供应商前景
大鱼–IBM、SAS、Informatica、SAP 等。–拥有成熟的产品,此外,这一领域现在有几家科技企业。我一直在收集这一领域的风险投资信息,并把它们作为资源在网上发布。请注意,这些数字是从 Crunchbase 引用的,可能会有一些延迟-一些供应商提到这些数字被缩小了。通过 Twitter 上的 [@pacoid](https://twitter.com/pacoid) public timeline 让我了解评论、更正、建议或任何其他信息。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/21de49169ba42c9ca086243b5c9f0104.png) A quick tour through that vendor list shows a mix of early-stage, growth-stage, several firms taken by private equity, even a public listing – Varonis was the [first tech IPO of 2014](https://www.investors.com/news/technology/varonis-systems-soars-after-ipo-for-big-data-firm/).
快速浏览一下供应商名单,可以看到早期阶段、成长期阶段、被私募股权收购的几家公司,甚至是公开上市的公司——瓦罗尼是 2014 年第一家上市的科技公司。
请注意,我们在 Strata Data 会议上展示该材料的目的是试图促使该领域的供应商提出他们自己的意见。我很高兴地报告,我们的第一次演示取得了预期的效果:我们现在正在寻找 Strata 的 DG 跟踪,其中 3-4 家供应商经常是会议赞助商。让我特别感兴趣的是那些对 DG 解决方案没有强烈认同感的供应商的对话;但是,他们的客户使用案例对 DG 有着强烈的需求。这些公司希望在组合中包含客户案例研究,这一点非常突出。
## 开源,开放标准
各种开源项目和新兴的开放标准满足了 DG 的需求。
Egeria 项目提供了数据资源的企业目录。它的一些最大卖点包括:
* 提供开放的 API、类型和交换协议。
* 允许元数据存储库共享和交换。
* 为自动化元数据的收集、管理和使用添加了治理、发现和访问框架。
* 验证产品的一致性。
另请参见 IBM UK 的 Mandy Chessell(2017–04–21)的论文“[开放元数据的案例](https://zenodo.org/record/556504#.XJWaZBNKgWo)”,了解关于开放元数据的令人信服的观点。
Apache Atlas 是 Egeria 的一个类似 Hadoop 的本地参考实现。[阿帕奇 NiFi](https://nifi.apache.org/) 也触及了一些 DG 关心的问题。
[Marquez](https://github.com/MarquezProject/marquez) 是一个由 WeWork 和 Stitch Fix 赞助的项目,旨在“收集、聚合和可视化数据生态系统的元数据”,这听起来与 Egeria 的某些方面大致相似。也许在那里出现了共同点?
[WhereHows](https://github.com/linkedin/WhereHows) 是 LinkedIn 的一个 DG 项目,专注于大数据。最近有来自优步的消息,关于他们的[数据手册](https://eng.uber.com/databook/)项目,似乎已经从 Hows 得到了灵感。
W3C 拥有 [PROV](https://www.w3.org/TR/2013/NOTE-prov-overview-20130430/) 系列标准“以实现异构环境(如 Web)中出处信息的互操作交换”,以及 Python 中的[实现,加上伦敦大学国王学院的开放出处相关研究。](https://github.com/trungdong/prov)
向 NOAA 的 Kim Valentine 致敬,美国正在酝酿一项新的联邦数据战略,需要你的参与。现在是时候开始了解如何利用数据作为美国的战略资产了。
## 机器学习会改变优先级吗?
ML 用例的激增以及[随后对
data](https://www.youtube.com/watch?v=21EiKfQYZXc&feature=youtu.be&t=141) 培训和测试模型的需求带来了新的挑战:
* 分析工作流程中对[再现性](https://twitter.com/peterwrose/status/1053156027602878465)的需求变得更加迫切。
* 模型[可解释性](https://github.com/oracle/Skater)很难,因为“解释”这个词在法律、医学、新闻、金融等领域有不同的含义。
* 董事会和高管人员受到概率系统和决策分解的挑战。
* ML 倾向于从数据中归纳,所以我们不再假设 100%正确、100%隐私、100%安全等。,而是必须承认并拥有结果。
* 现在更加关注模型治理——模型是数据的代理,因此是 DG 的更好关注点吗?
我不会在这里假装有答案。我几乎不理解最初问题的大致轮廓——这又回到了我最近询问 DG 专家的经历。
我认为,Spotify 产品经理艾琳·gonzálvez
在 2018 年西班牙大数据大会上的演讲“数据隐私@Spotify”是一个很好的近期前景说明。
我很幸运地与艾琳进行了长时间的交谈,并留下了鲜明的印象:( Spotify 的那些人非常聪明;(2)也许 GDPR 并没有那么糟糕。她的演讲集中在“挂锁”上,这是 Spotify 的一个全球钥匙管理系统,也是
handles 用户同意的。换句话说,只有首先加密,数据才能持久化。这降低了数据泄露的风险;例如,攻击者可能会窃取数据,但数据会被加密。
此外,一个团队管理所有
customer 数据的整个生命周期;Spotify 中的其他用例必须按用户请求密钥,然后才能使用这些数据。然后,当客户根据 GDPR 要求
requests“被遗忘的权利”时,合规很简单:从挂锁中取出他们的钥匙。
另一个很好的资源是最近的 O'Reilly Data Show 播客采访“[机器学习如何影响信息安全](https://www.oreilly.com/ideas/how-machine-learning-impacts-information-security)”,来自 [Immuta](https://www.immuta.com/) 的 Andrew Burt。这篇文章回顾了最近的一份白皮书,这份白皮书被强烈推荐,并阐述了隐私和安全性是如何融合的,以及我们将如何减少源代码,增加源数据。
有效的数据治理需要对手头的问题进行大量的反思。我的直觉是,像 Spotify 和 Immuta 这样的公司(以及许多其他公司!)正在指出我们共同的近期未来的形状。即使在风险、边缘情况、法规遵从性和其他因素的复杂环境中,也有适应的方法。
如果你想看我的整个演讲,可以在 https://derwen.ai/s/6fqt 的 T2 看幻灯片,几周内会有一个视频在网上发布(尽管是在奥莱利媒体付费墙后面)。
感谢马克·马德森和瓦尔·贝尔科维奇的指导,特别是本·洛里卡强迫我这么做。**
# 每个 Pacoid 的主题和会议,第 9 集
> 原文:<https://www.dominodatalab.com/blog/themes-and-conferences-per-pacoid-episode-9>
Paco Nathan 的最新文章展示了与模型可解释性相关的几个新兴线索。
## 介绍
欢迎回到我们每月一次的主题和会议。几个技术会议都发生在充满乐趣的四周内: [Strata SF](https://conferences.oreilly.com/strata/strata-ca) 、 [Google Next](https://cloud.withgoogle.com/next/sf/) 、[美中创新 CMU 峰会、](https://cmu-iea.com/) [AI NY](https://conferences.oreilly.com/artificial-intelligence/ai-ny) 和 [Strata UK](https://conferences.oreilly.com/strata/strata-eu) ,以及其他一些活动。我已经离开了*主题定位*,本月的文章介绍了几个与机器学习模型的*可解释性*相邻的新兴线索。
快速总结:有一个棘手的问题。二十年前,通过将简化技术应用于项目规划和管理,软件工程取得了重大突破。不可否认,在计算机科学的大部分领域中,还原论表现得相当好。由于它们的成功,涉及诸如敏捷和精益这样的词的方法已经变得很熟悉了。他们已经成为工程领域的“嵌入式机构”。不幸的是,ML 应用程序引入的扭曲不是工程可以解决的问题。我最近看到的几个 IT 高管的谈话中就有很好的例子。强调对 ML 模型可解释性需求的那些高管,往往也是那些过分强调机器学习的工程方面,而忽略了社会背景,使得模型可解释性几乎不可能的人。
相比之下,一些正在探索模型解释的定义、可能性和局限性的研究人员倾向于更全面的观点。例如,收集数据以构建训练数据集的常见做法往往会在过程中丢弃有价值的信息。
为什么?在我看来,这里的主题是转移推理的更深层次——如可解释性、可审计性、信任等。–回到数据集的结构。
简化论的视角和对工程的过分强调成为数据科学工作的致命弱点。相反,考虑从数据收集一直到推断的“全栈”跟踪。让我们看看一些解药。
## 机器学习模型的可解释性
在 CMU,我加入了由扎卡里·利普顿主持的一个小组,会上有人问了一个关于机器学习模型解释的问题。如果你一直在关注利普顿的工作——或者如果你看过我去年的主动学习调查演讲——你可以想象接下来会有一场热烈的讨论。利普顿写了一篇早期的、经常被引用的批评 ML 模型解释的立场文件:“[模型可解释性的神话](https://arxiv.org/abs/1606.03490)”其他良好的相关论文包括:
* [迈向可解释机器学习的严谨科学](https://arxiv.org/abs/1702.08608)
压轴 Doshi-维勒兹,后土金(2017-02-28);另见关于 TCAV 的[多米诺博客文章](/blog/model-interpretability-tcav-testing-concept-activation-vectors/)
* [透明度的挑战](https://arxiv.org/abs/1708.01870)
艾德里安·韦勒(2017-07-29)
* [黑箱模型解释方法综述](https://arxiv.org/abs/1802.01933)
Riccardo GUI dotti 等(2018-06-21)
值得注意的是,用于 ML 模型解释的开源工具已经获得了发展势头,出现了超级有趣的项目,如[滑手](https://github.com/oracle/Skater)、[石灰](https://github.com/marcotcr/lime)、 [SHAP](https://github.com/slundberg/shap) 、[主播](https://github.com/marcotcr/anchor)、 [TCAV](https://paperswithcode.com/paper/interpretability-beyond-feature-attribution) 等等。数据科学团队需要将这些作为其流程和工作流的一部分,我们稍后会谈到这一点。
即便如此,也要注意不要把机器学习模型的*可解释性*当成一种健壮的技术能力。还没有,如果有的话。决策是一个复杂的过程,有太多的问题需要考虑。让我们来看两个问题,这两个问题更多的是社会问题,而不是技术问题。一方面,如果你是医生、律师或记者,单词*解释*本身有不同的意思。对于所有垂直行业的要求,没有一个*通用的*定义。举例来说,如果立法者——他们不理解机器学习的细微差别——试图*定义*解释一个词的单一含义,这是有风险的。另一方面,正如 Lipton 所强调的,虽然工具产生了有趣的可视化,但是可视化并不意味着解释。后者是人类的一种品质,而且相当狡猾。再说一次,这不是归属于规则和算法的事情。
## ML 模型的可解释性和数据可视化
根据我领导数据团队的经验,当企业面临困难的挑战时,数据可视化可能会有所帮助,也可能会有所损害。一个真正糟糕的方法是,分析师带着数据可视化走进一个重要的会议,并试图为处理危机的利益相关者解释它。这就相当于公司里的人工解释。对于分析师来说,更有效的方法是为手头的问题创建各种数据可视化,然后让业务涉众讨论所展示内容的相关性和意义。
![St Paul’s from Madison London](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/34052c9f34735d23fb3babd23adf2f68.png)St Paul’s from Madison London
这种类比适用于 ML 模型解释,尽管方向相反。商业利益相关者不能依赖可视化来解释他们的数据科学团队产生的 ML 模型。要点在于,ML 模型是训练集特征的一种代理,训练集特征是基础历史(或合成)数据的视图,其本身可能不完整或不准确。模型预测能力的可视化增加了另一个抽象层。可视化在数据科学工作中至关重要,但需要注意的是,它们所传达的信息可能是与被测量的实际业务流程相距 4-5 层的抽象层。信息在被抽象那么多次后会变得非常失真。请记住,可以说 [*热图不是*](https://en.wikipedia.org/wiki/Map%E2%80%93territory_relation) 的领地。
## 使用算法解决非算法问题
总的来说,浏览上面列出的论文,很明显 ML 模型解释的问题没有神奇的解决方案。还没有。虽然民粹主义呼吁 ML 模型应该是可解释的——我在这些会议上看到几乎每个高管级别的幻灯片中都提到了这一点——但我们不应该指望技术修复,也不应该试图对它们进行立法。只要研究界还在为最基本的定义而挣扎,监管者就不太可能有一致的方法来衡量 ML 的可解释性,更不用说“强制”使用它了。企业也应该明智地调整自己的观点。
换句话说,**不要试图用算法来解决通过使用算法**所经历的非算法问题。博凯?
## 不是一个纯粹的计算问题
与此同时,让我们切换到本·洛里卡最近接受 Poursabzi Sangdeh 、[的](https://www.oreilly.com/ideas/its-time-for-data-scientists-to-collaborate-with-researchers-in-other-disciplines)[采访,在*奥赖利数据秀播客*上](https://www.linkedin.com/in/forough-poursabzi-sangdeh-479156a1/)“是时候让数据科学家与其他学科的研究人员合作了:
许多当前的机器学习应用增强了人类,因此 Poursabzi 认为数据科学家与其他学科的研究人员密切合作非常重要。
真心话很少说。例如,在使用算法决策的关键领域,它们几乎总是 ML 模型加上人们一起努力做出决策的实例:
* 谁获得贷款批准?
* 谁会被缓刑释放?
* 谁会被录用?
查看播客[采访](https://www.oreilly.com/ideas/its-time-for-data-scientists-to-collaborate-with-researchers-in-other-disciplines)了解更多细节。在这个领域的初步研究之后,Poursabzi 对机器学习模型的可解释性概念感到困惑。显然,ML 中有技术成分;然而,还有一个*人机界面* (HCI)组件。这不是一个纯粹的计算问题。
## ML 可解释性:解开冲突的优先级
![Keynotes at Strata UK](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/21edf18d629426713d5e88ee7b4fe7fb.png)Keynotes at Strata UK. [Image Credit](https://twitter.com/innatok/status/1123511996224290816?s=20).
回到 Ben Lorica 和 Forough Poursabzi 之间的采访,几乎任何关于机器学习中可解释性的讨论都会纠缠一系列相互冲突的优先事项:
* *可解释性*
* *信任*
* *清晰度*
* *透明度*
* *可审计性*
不言而喻,这是一个加载的参数,需要解包。
单词*解释*本身就有一个含义,即人们应该能够以人类可以理解的方式描述系统的内部。一个潜台词经常伴随着:任何解决方案都应该有足够的*完整性*,它适用于一般情况,即超出训练数据——否则它作为解决方案就没有意义。可解释性加剧了这两点之间的矛盾:你希望你的 ML 模型解释简单还是完整?一般来说,你不能两者兼得。例如,在更近的深度学习工作的情况下,完整的解释*可能*是可能的:它*可能*也需要难以理解的参数数量。
考虑到对风险和成本的担忧是如何驱动 IT 的,实际上*可审计性*是许多商业利益相关者的首要任务。然而,从更长远的角度来看,在生产中部署的 ML 模型,*可理解性*代表了风险和成本的现实优先事项:对技术债务的考虑,检测错误的能力,故障排除,等等。另一个需要考虑的关键因素是:参与自动化增强的任务的用户经验如何?
这些优先级中的一些是模型和系统设计的属性,而另一些是人类行为的属性。Poursabzi 强调了关于信任、可审计性等问题的一个很好的观点。:
如果你不从人类的角度来考虑这些问题,它们是不可能回答的。
在这里,她切入了关于机器学习实践的一个核心观察,我很少发现在学术界提到过,在工业界几乎从来没有。如果你在建模上投入足够的时间,你通常可以为给定的问题找到相对简单的模型。让我们打开那个:它相当重要。机器学习领域的许多工作——无论是专注于发表论文的学术方面,还是专注于投资回报率的行业方面——都倾向于强调:
* 模型有多大的预测能力(精度、召回率)?
* 它是否超越了现有的基准,也就是说,它是 SOTA 吗?
* 模型能训练多快?
* 它能多快推断出结果?
* 培训花费了多少?
* 跑步要花多少钱?
* 对于非专家来说,训练这个模型有多容易?(自动)
为了快速获得预测能力——也就是更便宜——结果将倾向于更复杂的 ML 模型。如果您的“性能”度量关注于预测能力,那么您可能会得到更复杂的模型,因此更难解释。权衡是数据科学团队是否投入时间来迭代超越单纯的预测能力,以达到同样有效的更简单的模型,并且还具有更好的*可审计性*、*可理解性*等。
然而,当你强调完整性时,你得到的解释可能很全面,但对人类来说更难理解。因此,不太好解释。
您的数据科学团队遵循的流程和优先事项将对 ML 模型的可解释性带来潜在风险。
## ML 模型的可解释性:预期用途的背景
Poursabzi 的另一个重要观点是,ML 模型的可解释性应该在其预期用途的背景下进行研究。换句话说,是否有任何人体实验来评估这些模型?
对于数据科学团队来说,这可不是什么好消息,因为管理层要求他们“敏捷”并快速制作大量模型。相反,团队应该花足够的时间来:
* 构建更简单的模型,保留预测能力,同时更易于理解
* 评估模型对人类主体的影响
* 衡量受试者信任模型结果的能力
这些工作很难或者不可能自动化。他们还需要统计学、实验设计、因果推理等方面的高级技能——比大多数数据科学团队都要高。另外,社会科学比计算机科学更倾向于教授这些技能。请记住,数据科学基本上是跨学科的。也许这一点说明了拓宽数据科学从业者的课程和培训的需要,提高了标准?
## “敏捷”在社会环境中几乎没有任何意义
如上所述,对于数据科学团队来说,使用任何可用的工具来解释他们生成的模型是非常重要的。这种方法产生了反馈循环,因此构建模型的人可以从他们的结果中学习洞察力。特征工程可以改进吗?早退一步,数据能增强吗?模型结果是否适合客户的环境?有任何人体实验吗?
这就是我被那些使用诸如敏捷或精益这样的词汇来描述数据科学过程的人所迷惑的地方。敏捷最初是关于快速迭代代码库及其单元测试,然后在利益相关者面前得到结果。投入时间寻找更简单、更容易排除故障的模型并不是一种特别[敏捷](http://agilemanifesto.org/)的方法。
或许,如果机器学习只是用来优化广告或电子商务,那么敏捷的概念就足够了。仅仅是一个“训练数据创建模型,根据测试数据评估”的机械化问题,也许可以翻译成纯粹的工程术语。十年前可能是这样,但那些日子早已过去。机器学习被用于驾驶公共汽车(现在在欧盟的机场),协调医院内部的运作,假释委员会,贷款申请,开发药物以及其他领域,在这些领域中,仅基于软件工程方法的决策会导致灾难和诉讼。
深究这一点,为机器学习问题编写“单元测试”的想法是一种谬误;然而,这正是 *[测试驱动开发](http://agiledata.org/essays/tdd.html)* 和其他敏捷方法所要求的。相反,团队必须投入大量时间来处理培训数据、研究各种模型、使用实时客户数据进行评估等等。奔向 *[最小可行产品](https://en.wikipedia.org/wiki/Minimum_viable_product)* 将倾向于产生更复杂和更难解释的模型。创建更难解释、更难排除故障的模型并不能满足涉众的需求,而且显然不是敏捷的。
## ML:社会系统和环境
![Strata chair Ben Lorica, coordinating backstage](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4cd2403d0cab1a0976f5aeeccd1294c0.png) Strata chair [Ben Lorica](https://twitter.com/bigdata), coordinating backstage.
在 Strata UK 的后台,我和詹姆斯·伯克聊了一会儿,就在他走上台做我参加过的最精彩的主题演讲之一之前。他谈到了 *[还原论](https://en.wikipedia.org/wiki/Reductionism)* 的风险和笛卡尔的可疑遗产。关于*的终结稀缺*是经济学、政治话语、教育等的驱动力。关于技术上的巨大转变几乎总是来自意料之外的用途。关于我们现在需要争论的问题是如何*嵌入机构*阻止我们认识到就在我们眼皮底下的巨大进步。
网络上流传着一个马特·韦洛索的笑话:
*如果是用 Python 写的,很可能是机器学习。如果是用 PowerPoint 写的,很可能是 AI* 。
Poursabzi 和越来越多的研究人员指出了比 Twitter 上流传的人工智能/PowerPoint 笑话更有用的定义:
* ML 是关于使用工具和技术的
* 人工智能是关于改变社会系统的
开发人工智能不再仅仅是工程过程,也不是幻灯片笑话。关于社会体系和环境,这越来越成为一个严肃的问题。关于人工智能,我们今天的嵌入式机构是:敏捷式的概念,对工程方法的过分强调,对机器学习解释的民粹主义呼吁,等等。
我们必须从社会系统中整合的人工智能的关键方面超越了机器学习的简化论观点。充分披露:这就是为什么我认为使用*机器学习工程师*这个头衔是一个传统组织的标志,并且最终亚马逊和谷歌都可能失宠,至少是因为他们目前营销基于云的人工智能服务的方法。但是我跑题了。
超越嵌入式机构的束缚,我认为人工智能中的社会系统工作将成为下一代*产品管理*的主要焦点。正如 O'Reilly 调查和其他最近的报告所表明的那样,“人工智能产品管理”的状态甚至还没有进化到原始的汤阶段。[皮特·斯科莫罗奇](https://twitter.com/peteskomoroch)在英国 Strata 做了一个精彩的演讲,概述了人工智能背景下所需的产品管理形式,这是他的[幻灯片](https://cdn.oreillystatic.com/en/assets/1/event/292/Executive%20Briefing_%20Why%20managing%20machines%20is%20harder%20than%20you%20think%20%20Presentation.pdf)。我有一种预感,这仍然是一个小小的简化论者,缺乏社会系统方面——尽管这可能有助于达到更广泛的受众基于他们目前的想法?总的来说,从方向上来说,这很酷。
真正让我抓狂的是,在一个问题/解决方案纠缠的提喻中,有多少呼吁 ML 模型可解释性的高管经常是那些过分强调工程和敏捷概念的人。伯克在他的主题演讲中用康沃尔矿业高管作为例证,他们并非完全不同:与经济困境作斗争,几乎将员工推向死亡,不顾一切地提取最后一点锡矿石,即使面对收益递减——而事实上,他们的人在瓦特蒸汽机设计上进行创新,创造了[高压变体](https://en.wikipedia.org/wiki/Cornish_engine)。
几十年后,那个时候的詹姆斯·伯克可能会引导观众经历一场大约 2020 年的搞笑“连接”之旅,思考“敏捷人工智能”——回到人们被雇佣来编写软件的时候——当时一个名为“IT”的落后行业是如何完全忽略了这一点,然后不久就变得默默无闻。
在谷歌研究博客上,2009 年的论文“[数据的不合理有效性](https://research.google.com/pubs/archive/35179.pdf)”和 2017 年的更新[“重新审视数据的不合理有效性”之间有一个有趣的叙事弧我建议比较一下这两者,注意后者侧重于计算机视觉。回到高管们的幻灯片,以前的论文被错误引用了。拥有更多数据通常更好;然而,有微妙的差别。大数据*卷*一定是一种内在的美德,这可能不仅仅是一种确认偏见——否则为什么要花费所有的数据工程成本来存储它呢?](https://ai.googleblog.com/2017/07/revisiting-unreasonable-effectiveness.html)
与 ML 模型可解释性相邻的新兴线索之一表明,数据科学团队可能需要重新思考他们的训练数据集是如何构建的。或者至少更仔细地观察这一解释过程,而不是依赖于根据数据建立的模型的事后解释。
这部分旅程的第一站是斯坦福大学的庞伟·高(Pang Wei Koh)和珀西·梁(Percy Liang)2017 年的作品“[通过影响函数](https://arxiv.org/abs/1703.04730)理解黑盒预测”。使用[影响函数](https://en.wikipedia.org/wiki/Robust_statistics#Empirical_influence_function)可以追溯到 20 世纪 70 年代稳健统计学。Koh 和 Liang 在机器学习中应用了这种方法,通过学习算法跟踪模型预测,并返回到训练数据。这可用于检测和修复数据集错误、了解模型行为、故障排除和创建训练集攻击。
![Robotic bartenders mixing Negroni cocktail at Strata UK.](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f50f1e3bb34abc04f4d734194f759e46.png) [Robotic bartenders mixing my Negroni cocktail at Strata UK.](https://www.instagram.com/p/Bw42G1MlHJZ/)
我们从纽约湾区的研究人员那里得到了两个非常有趣和非常有用的更新。斯坦福大学教授 [Chris Ré](https://cs.stanford.edu/~chrismre/) 介绍了关于*监管不力*的[软件 2.0 和浮潜](https://www.youtube.com/watch?v=TWv5yb_0OEw&feature=youtu.be)。换句话说,Ré观察到,在许多情况下,有专门形式的编程标记用于建立训练数据集。这些在源数据中创建了*结构*,尽管是以隔离的方式。浮潜将这些特别的方法正式化,以利用进入数据集的*监督*—*监督学习*的关键要素:
*大主题:利用组织知识资源快速有效地监管现代 ML。*
这有助于更快地创建良好的训练数据,有助于随着时间的推移管理数据,也有助于构建更高质量的 ML 模型:
仅仅知道每一个标签的来源就有相当大的力量。
我会让你把对模型解释的影响联系起来。提示:考虑短语*模型谱系*,并认识到并非训练数据集中的所有行都同样有价值。这就涉及到了*模型治理*中的核心问题。考虑用于编程标记的概率方法通过从业务过程直到训练数据、建模、推理以及最终结果解释的所有抽象级别保留更多信息。伯克用参加会议来说明信息是如何暗示变化的,并解释说:“告诉你你正在参加一个会议并没有传达任何信息。你已经知道了。然而,声明坐在你旁边的人患有传染病,这意味着改变。”粗略地说,这就是雷在这里所描述的。
让我们试着用图表来说明这一点。将下面的图表想象成“堆栈”,其中中间的斜体字(例如,“数据收集”)显示团队执行的“过程”步骤,而方框(例如,“培训数据”)显示有形的结果。表面上,业务是作为最有形的一层来运营和衡量的——在图表的底部。抽象出一个更高的层次。抽象出一个更高的层次,你就有了一个训练数据集。如此等等。近似、失真、方差和其他令人烦恼的人为因素几乎在每一个层次都会被引入,这会破坏信息。如果你的目标是得到某种可解释的推论作为最终结果,你必须自始至终考虑那些工件。当前一代的 ML 模型可解释性工具倾向于在“ML 模型”阶段获得,忽略了达到该点所需的其他步骤——这是 Zachary Lipton、Forough Poursabzi 等人批评的一部分。这是简化论的一个极端。克里斯·雷(Chris Ré)认为,通过数据收集,你可以有更好的形式,以保留结构和信息,供你在“解释”阶段遇到困难问题时使用——而不是扔掉它们。这似乎更加稳健。
![explanation in ml model diagram](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e4d88f2d58d80cfea6caf2646b3c76ce.png)
加州大学圣克鲁斯分校的教授 Lise Getoor 提出了“结构的不合理的有效性”——用上面引用的一篇谷歌论文中的一句话做了一个游戏。这里有一个[的视频](https://www.facebook.com/nipsfoundation/videos/keynote-lise-getoor-the-unreasonable-effectiveness-of-structure/1554329184658315/)是她在 NeurIPS 2017 上的早期版本的演讲,以及她来自 [ScaledML](https://www.matroid.com/scaledml/slides/lise.pdf) 的相关幻灯片。
*概率软逻辑(PSL)是一个用于开发概率模型的[机器学习框架](https://www.dominodatalab.com/blog/choosing-the-right-machine-learning-framework)。PSL 模型易于使用和快速。您可以使用简单的逻辑语法来定义模型,并使用快速凸优化来求解它们。PSL 已经在自然语言处理、社会网络分析、知识图表、推荐系统和计算生物学等许多领域取得了最先进的成果。*
诚然,PSL 的这项工作已经酝酿了大约 9 年,重点是从你的数据中构建可解释的知识图表。即便如此,如果你之前没看过这个,那就跑,不要走,来看看*概率软逻辑*的代码:
* [http://psl.linqs.org/](http://psl.linqs.org/)
* [https://github.com/linqs/psl/wiki](https://github.com/linqs/psl/wiki)
在我看来,这里的主题是转移推理的更深层次——如可解释性、可审计性、信任等。–回到数据集的结构。当然,人们经常使用 *[贝叶斯网络](https://en.wikipedia.org/wiki/Bayesian_network)* 构建概率图来解释推论,结果好坏参半。PSL 是非常不同的,我渴望在一些当前的应用程序中利用它。又是*快*。
## 人工智能的产品管理
很明显,我对那些试图宣扬几乎所有与人工智能相关的问题都有工程解决方案的供应商感到担忧。过程进入测量,进入数据收集,进入训练和测试模型,进入推理。完成了又完成了,以一种彻底的线性的,亚里士多德式的方式,可能会让笛卡尔脸红。敏捷的核心。更不用说任何名字本身,但我们已经看到了由此产生的难题。那不是 AI。这就是应用于机器学习工具的还原论。
其他组织使用 ML 模型来帮助汇总数据中的示例——将协作决策镜头聚焦于重要指标——但随后让客户基于数据中的示例而非 ML 模型的“结果”做出决定。我认为这是一种更有弹性的方法。初级人工智能是一个[的好例子](https://www.youtube.com/watch?v=UHV8JvQenHc&feature=youtu.be),为了充分披露,我是那里的顾问。这种微妙的细微差别允许团队将高级人工智能的结果融入他们的社会系统,以利用信息(如 Burke 所描述的)并做出判断。这可能不是你优化大量广告投放所需要的,但是我相信大多数基于广告投放的商业模式在这一点上已经过时了。人工智能为需要解决的更重要的问题提供了前进的道路。
我有一种预感,这将成为“[人工智能](https://www.dominodatalab.com/blog/product-management-for-ai)的产品管理”的基础——如果你在过去的 2-3 年里一直在听我说,是的,这就是问题所在。不是缺乏“敏捷人工智能”过程。
## 杂项,太好了,不能错过
此外,这里有四个链接指向最近的项目,它们并没有紧密地结合到我们的主题中,但也不容错过:
* [《训练神经网络的秘方》](https://karpathy.github.io/2019/04/25/recipe/)作者安德烈·卡帕西(2019-04-25)
* 克里斯·霍尔德格拉夫(2019-03-27)
* 由黛布拉·威廉姆斯·考利和梅丽莎·法拉利创作的《开源世界中的女性》
* Alasdair Allan 的《[即将到来的物联网隐私危机](https://medium.com/@aallan/has-the-death-of-privacy-been-greatly-exaggerated-f2c4f2423b5)》(2017-10-09)——以及英国地层 2019 的相关演讲
* YouTube 上的 SparkFun 频道,以皮特·沃顿和其他低功耗的 ML 名人为特色
## 即将举行的活动
要在日历上标记的数据相关事件:
* [Jupyter 社区研讨会](https://blog.jupyter.org/jupyter-community-workshop-jupyter-server-design-and-roadmap-workshop-6e6760cc5098),5 月 16 日至 17 日,巴黎
* [AKBC](http://www.akbc.ws/2019/) ,5 月 20 日至 22 日在阿默斯特
* 5 月 23 日至 24 日在纽约市举行的 Rev——到时见!
* 6 月 5 日,佩塔卢马沙龙,我将主持一场关于约翰·巴尔的人工智能主题书评,“脸书和中国正在争相成为对方吗?”
* [OSCON](https://conferences.oreilly.com/oscon/oscon-or) ,7 月 15 日至 18 日,CFP 波特兰:我将于 7 月 16 日主持“[人工智能运营:发展与数据科学](https://conferences.oreilly.com/oscon/oscon-or/public/cfp/746)”专题讲座
# 每个 Pacoid 的主题和会议,第 1 集
> 原文:<https://www.dominodatalab.com/blog/themes-conferences-per-pacoid-episode-1>
## 简介:新的每月系列!
欢迎来到新的每月系列!我将从最近的行业会议、新的开源项目、有趣的研究、伟大的例子、了不起的人等方面总结一些亮点。–都指向如何提升贵组织的数据科学实践。
## 关键主题:机器学习模型
主题。在科技行业的忙乱和喧嚣中,我渴望尝试辨别主题。技术发展迅速,几乎总有隐藏在众目睽睽之下的潜在驱动因素……如果人们能够及早发现它们,阐明其中的细微差别,并开始理解它们的动态和可能的轨迹。讨论主题有助于我们建立一个认知框架——或者,如果你愿意的话,一个提示、一个启动板、一个操作指南——来了解整个行业正在发生什么。
我一直通过会议、文章、论文等追踪的一个关键主题。,是关于*机器学习模型*的。在组织的各个层面,都有关于 ML 模型及其对我们如何进行数据科学的影响的丰富对话。我们看到了技术和对话的进步:关于 ML 模型的可再现性,关于安全性,关于透明度,关于道德和偏见,关于合规性,关于工作流和流程挖掘,关于如何在生产中处理模型的最佳实践。最终,我们看到 ML 模型的影响远远超出了开源和 IT 团队:关注诸如安全性、数据隐私、偏见、道德、合规性等问题。,ML 模型影响了更大范围的[开放社会](https://en.wikipedia.org/wiki/The_Open_Society_and_Its_Enemies)。
让我们来看看…
## 英国地层
[今年 5 月 21 日至 24 日在伦敦举行的地层数据会议](https://conferences.oreilly.com/strata):看看大卫·塔尔比(Pacific AI)关于“[为什么机器学习模型在生产中崩溃和燃烧以及如何处理它](https://conferences.oreilly.com/strata/strata-eu/public/schedule/detail/64515)”的丰富警示故事——见[视频](https://www.safaribooksonline.com/library/view/strata-data-conference/9781492025993/video320608.html)。David 区分了机器学习所需的过程和移动网络开发所使用的过程。也就是说,在“传统的”敏捷过程中,*专家的贡献往往发生在前面,而在 ML 中,情况正好相反*。
例如,当开发一个 web 应用程序时,通常架构师和技术负责人会在项目的早期投入更多的时间,而随着项目的成熟,经验较少的人会投入更多的时间。在 ML 中,来自数据集的模型的初始训练——这是一个“入门”作业。一旦模型在生产中运行,响应边缘情况、识别偏差、特征工程中的问题等所需的*迭代*。这就是 ML 的核心专业知识变得必不可少的地方。换句话说,当你处理那些微妙的、棘手的问题时,严酷的现实就会浮现出来,这些问题决定着一个产品的成败。当讨论生产中 ML 模型的最佳实践时,这是很好的思考材料。
大卫的讲话让我开始思考。在我在英国 Strata 演讲的五分钟前,我匆忙地将大卫的要点与皮特·沃顿的相关笔记结合在一起,产生了一张有点像 T2 的有争议的幻灯片,随后是大量精彩的走廊讨论。尤其是后者。
## 奥斯科答
[OSCON](https://conferences.oreilly.com/oscon/oscon-or) ,7 月 16 日至 19 日:基于生产模型的最佳实践,整个 OSCON 会议上我最喜欢的话题是 Richa Khandelwal(耐克)的“[生产中的数据科学](https://conferences.oreilly.com/oscon/oscon-or-2018/public/schedule/detail/67762)”——见[视频](https://www.safaribooksonline.com/library/view/oscon-2018-/9781492026075/video321483.html)、[幻灯片](https://cdn.oreillystatic.com/en/assets/1/event/274/Data%20science%20in%20production%20Presentation.bin)。Richa 是 Nike 的软件工程经理,在个性化组从事数据工程和基础设施方面的工作。我有幸多次与他们的团队会面。
Richa 介绍了如何提升数据工程团队,使其与数据科学团队“在中间相遇”,从而实现更好的企业协作。一个简单但经常被忽视的要点是:要求您的数据工程师参加数据科学实践培训。总的来说,Richa 的观点为企业中高效的数据科学提供了思想领导力和角色模型。
## JupyterCon
# 每个 Pacoid 的主题和会议,第 3 集
> 原文:<https://www.dominodatalab.com/blog/themes-conferences-per-pacoid-episode-3>
*[Paco Nathan](https://twitter.com/pacoid) 的专栏涵盖的主题包括开源、“智能是一项团队运动”和“大规模潜在硬件的含义”。*
## 介绍
欢迎来到我们关于数据科学的每月系列!这里要考虑的主题:
* 开源胜出;学习是不够的
* 智力是一项团队运动
* 大规模潜在硬件的含义
此外,首先要提到的是:我们将于 11 月 8 日星期四在 Domino 总部举行一场小组讨论,主题是“数据科学与工程”。真的非得这样吗?”——由[艾米·海尼克](https://twitter.com/aheineike)、[皮特·沃顿](https://twitter.com/petewarden)、我自己和我们甜美的主持人安·斯潘塞主演。加入我们关于开发和部署 ML 模型的合作的热烈讨论。请参见下文,了解 Amy 和 Pete 在数据科学领域取得进展的详细信息,我们期待在专家组上见到许多新朋友[!](https://www.eventbrite.com/e/data-science-versus-engineering-does-it-really-have-to-be-this-way-tickets-50454045408)
## 开源胜出;学习是不够的
数据科学,让我们把它分成几个部分:
* **代码:** *迭代过程*(等等),感谢 [SLDC](https://en.wikipedia.org/wiki/Systems_development_life_cycle) 、[敏捷](http://agilemanifesto.org/)、[看板](https://www.atlassian.com/agile/kanban)、[精益](http://theleanstartup.com/)等。,帮助指导团队将软件提炼为知识产权,并且结果可能在 [Git](https://git-scm.com/) 仓库(或者一些其他版本系统)中管理
* **数据:**当我们整理、准备、分析、货币化、审计数据时,数据会不断积累(数量巨大,我们将在下面看到)。
* **模型:** [一般化](https://www.basicbooks.com/titles/pedro-domingos/the-master-algorithm/9780465061921/)由代码构成,但从数据中学习
20 年前,关于软件工程的强有力的观点开始盛行。如今,在大多数企业圈子里,谈论“代码”很难不提到“敏捷”这个词。因此,有强烈的倾向将这个描述符应用到许多其他活动中(“敏捷数据”、“敏捷建模”等)。)根据我的经验,这是一个非常糟糕的主意。敏捷方法的创始人之一 Ron Jeffries 最近建议开发人员应该“脱离命名方法”
数据曾经是一个相对简单的东西。写代码的人也定义了一个[数据模型](https://web.archive.org/web/20120412150613/http://yourdon.com/strucanalysis/wiki/index.php?title=Chapter_10),然后程序的执行是确定的:输入进入程序,处理发生,输出出来。完了,完了。[那个现实在最近的某个时候崩溃了。现在我们到处都有“数据驱动”的公司。代码变得廉价。谷歌会给你他们的](https://www.oreilly.com/ideas/what-is-data-science) [ML 代码](https://www.tensorflow.org/);但是你不会得到他们的(精选的)数据,也不会得到他们的组织学习。
一家大型软件公司的高管最近对我说,“开源赢了,我们现在认识到了这一点。”很可能你的组织所依赖的大部分代码都是由你的组织之外的人通过开源项目来维护的。先从 Linux 开始,然后转移到 Git、Docker、Kubernetes、Python 等。明白重点了吗?敏捷代码开发可能不是您的数据团队关注其价值创造活动的地方。而越来越多的数据科学训练营、本科生项目等。关注开发不同类型的 ML 模型的细微差别,在日常实践中,您的数据团队可能会将宝贵的时间花在管理上述数据上:如何管理、准备、分析、货币化、审计等。,再加上创建数据基础设施来收集、存储、提供和查询数据等。
也就是说,对于开源与数据分析基础设施,有一些很好的见解。如果你最近没有看新闻的话,至少有三起巨大的并购( [1](https://venturebeat.com/2018/10/26/microsoft-completes-its-7-5-billion-github-acquisition/) 、 [2](https://www.cnbc.com/2018/10/03/cloudera-and-hortonworks-announce-all-stock-merger.html) 、 [3](https://www.wired.co.uk/article/ibm-buys-red-hat) ),其中包括,可以说是历史上最大的[拉动请求](https://help.github.com/articles/creating-a-pull-request/)。Google [BigQuery](https://cloud.google.com/bigquery/) 的 Felipe Hoffa 有一个 [Twitter 帖子](https://twitter.com/felipehoffa/status/1004720802590330885)和[博客帖子](https://towardsdatascience.com/these-are-the-real-stack-overflow-trends-use-the-pageviews-c439903cd1a)关于如何基于大规模堆栈溢出数据来识别开发者中流行的真正趋势。此外,对于科技公司来说,赢得其他公司开发人员的关注比传统营销更加重要,现在几乎每个公司都在成为科技公司,所以这一点很重要。但是我跑题了。
https://twitter.com/DynamicWebPaige/status/915326707107844097
^(ML eats 软件,杰夫·迪恩访谈/佩吉·贝利摄影)
敏捷宣言中甚至没有提到学习这个词。在宣言写了几年后,机器学习开始“[吃掉](https://medium.com/@karpathy/software-2-0-a64152b37c35)软件。我们现在看到大型代码库可以被学习模型取代[。来自谷歌的报道“每天都有数百个项目发生这种情况。”在一些有趣的案例中,开发人员花了几十年时间琢磨的无处不在的算法正在被学习模型所取代。在地平线上,我们将看到 QA 团队致力于生成单元测试的机器学习应用程序。这将对](https://twitter.com/DynamicWebPaige/status/915326707107844097)[如何编写代码](https://en.wikipedia.org/wiki/Test-driven_development)产生重大影响。即便如此,我在行业中遇到的许多团队都表现出一种反模式,即过于强调代码,对数据的预算重视不够,相对来说不太强调团队学习。稍后会有更多的介绍。
同时,学习并不是人工智能的全部。以下是奈良逻辑公司[的贾娜·艾格斯](https://twitter.com/jeggers)的精彩观点:
你必须管理你的数据,你的算法,和你的偏见目标。这是一个三位一体,它的力量可以对你不利,也可以对你有利。
啊哈,*目标*也很重要。此外,正如彭博测试版的[詹姆斯·查姆](https://twitter.com/jamescham)在[的推特帖子](https://twitter.com/jamescham/status/1050168086811140097)中探索的那样,有监督的机器学习本质上是反动的。这是需要考虑的。本月早些时候,克里斯蒂安·哈蒙德在伦敦[人工智能](https://conferences.oreilly.com/artificial-intelligence/ai-eu-2018)的[主题演讲](https://youtu.be/jU2GmxlfqYA)上发表演讲,强调人工智能是多方面的,而不仅仅是学习。
所以,*代码+数据+学习*是必要的,但不是充分的。什么是足够的?我们如何达成一个适用于数据科学的敏捷宣言?
在这一点上,Jupyter 项目[的](https://twitter.com/fperez_org/status/1052726678219157505)[费尔南多·佩雷斯](https://twitter.com/fperez_org)分享了保持 PDF(即发表的文章)“与背景细节、交互性和再现性支持相联系”的实践换句话说,如何发表相对最新并支持*可复制科学*的论文。最近在 *[Nature](https://www.nature.com/articles/d41586-018-07196-1)* 上发表的一篇文章探索了基于 [Jupyter](http://jupyter.org/) 的*可重复工作流程*。费尔南多和加州大学圣迭戈分校生物信息学的[彼得·罗斯](https://twitter.com/peterwrose)等人最近在 Jupyter 笔记本上发表了 [*可重复研究的十个简单规则*](https://twitter.com/peterwrose/status/1053156027602878465) 。我在 LinkedIn 上开了一个关于这个问题的[帖子](https://www.linkedin.com/feed/update/urn:li:activity:6459073995722625024)。
你在数据科学工作中的经历与此相符吗?
## 智力是一项团队运动
深度学习(DL)在 2012 年经历了一个拐点。几年前就有了可用的代码,但是过了一段时间,一个好的 T2 数据集才展示了这种方法的惊人价值。另外,[GPU 可以被用来](https://medium.com/@smallfishbigsea/a-walk-through-of-alexnet-6cbd137a5637)使大量的计算需求变得更加可行。
自然语言(自然语言处理,NLU,NLG 等。)正在到达一个拐点。像 DL 一样,现在有很棒的代码、优秀的数据集、足够的硬件等等。即便如此,我还是很震惊地看到聪明人仍然引用 [NLTK](https://www.nltk.org/) 、单词袋、词干等。,在 2018 年,当这个领域最近经历了一个[爆炸](https://explosion.ai/)的进步。
本月早些时候,我参加了由[安帕罗·阿朗索](https://twitter.com/AmparoAlonsoB)和[大卫·马丁内斯·减压阀](http://dataspartan.co.uk/)主持的[大数据大会,会上](https://www.fic.udc.es/es/evento/big-data-coruna)[达尼·维拉·苏埃罗](https://twitter.com/dvilasuero)展示了一份来自 ICML 的最新 NLP 论文的调查——这份调查令观众们惊叹不已。AllenNLP 已经为“深度语境化的单词表示”推出了 ELMo,然后 Google 又推出了 BERT。那周晚些时候,我加入了 Dani 和整个 Recogn.ai 团队,在阿斯图里亚斯(Asturias)参加了一次精彩的公司务虚会,重点是 NLP、[sidra](https://www.instagram.com/p/Bom8gG1FeJ6/)、[fa bada](https://www.instagram.com/p/BopXECpF_KI/)和其他阿斯图里亚斯的乐趣。如果你想随时了解 NLP 的最新消息,Dani 推荐[http://nlpprogress.com/](http://nlpprogress.com/)网站。
https://twitter.com/recogn_ai/status/1048588248010960896
^([在阿斯图里亚斯](https://twitter.com/recogn_ai/status/1048588248010960896)的 Recogn.ai,就在我们出发去 sidra 和藤壶)用餐前不久
我们看到的如此多被称为“人工智能”的东西,以及如此多对自然语言的商业关注,似乎都集中在聊天机器人上。关于商业机器人软件的有问题的声明比比皆是,但是关于对话的 NLP 的一些最好的工作来自于一个叫做 Rasa 的流行的开源库。[看看这次采访](https://www.oreilly.com/ideas/using-machine-learning-to-improve-dialog-flow-in-conversational-applications)艾伦·尼科尔,该项目的负责人,他们的独特视角: *[奥莱利数据秀播客:艾伦·尼科尔为聊天机器人开发者构建一套开源工具。](https://www.oreilly.com/ideas/using-machine-learning-to-improve-dialog-flow-in-conversational-applications)*
回到 AI 伦敦,Amy Heineike 在拥挤的主题演讲中展示了其他优秀的自然语言作品,其中包括马拉松式的问答环节,这是观众反应的一个指标。艾米和我录制了一段[视频采访](https://youtu.be/xBzZ2n_dOnY),她在采访中详细介绍了关于自然语言工作的关键见解,这些见解使 [Primer.ai](https://primer.ai/) 能够推出解决难题的人工智能产品。Amy [强调了关于人在回路实践的一个核心观点](https://twitter.com/pacoid/status/1049944290045161472):
*…人擅长精确,机器更擅长回忆,重要的是融合两者的精华……*
Amy 的另一个精彩观点是分三个阶段考虑文本的 AI 产品:
1. **读作**(即 NLP)
2. **分析**(即 NLU)
3. **写**(即 NLG)
每个阶段都有内在的权衡,取决于人或机器分别能处理多少。虽然许多公司似乎都在努力开发神奇的人工智能算法,可以一举解决他们的业务问题,但 Amy 警告说,我们应该考虑如何“智能是一项团队运动”,如何通过团队传播认知,让人工智能过程**读/分析/写**来创建草稿,专家团队可以使用并放大这些草稿来实现他们的业务目标。明智的建议!
事实上,这一主题与其他主动学习的案例研究相呼应,也被称为“人在回路中”。创建和更新商业网站,在这些网站上,只有设计人员和程序员完成最后阶段的工作。在大型企业中,安永&扬(EY)同样在他们的[租赁会计合规](https://www.forbes.com/sites/adelynzhou/2017/11/14/ey-deloitte-and-pwc-embrace-artificial-intelligence-for-tax-and-accounting/#1840c80c3498)实践中使用“智能是一项团队运动”方法中的“人在循环中”,导致比他们以前的纯人类团队多 3 倍的一致性和 2 倍的效率。
我做了一个关于主动学习案例研究的演讲,有一个总结图:
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5e847d30d94b09262a57f4d202f3ed82.png)
gist 从 Clara Labs 的 Michael Akilian 那里借了一块宝石:
诀窍是从第一天开始设计系统,它从已经存在的智能中隐含地学习。
换句话说,根据 Amy 的见解,“智能是一项团队运动”,您的组织已经有了在您的业务需要做什么方面的领域专家。随着时间的推移,他们在团队中传播*组织* *学习*,利用已经存在的智慧。你部署的任何人工智能应用都需要被认为是**团队+机器**的混合体。此外,借用控制论(以及机器学习的起源,特别是 20 世纪 40 年代的第一个神经网络项目),我们需要将人工智能中的难题概念化,而不是作为具有线性输入/输出的“黑盒”,而是作为动态的、几乎有机的认知系统,其中每个交互点都有双向反馈回路。
也就是说:
* 部署的 ML 模型与客户交互(用例)
* 客户与领域专家互动(专业服务、客户支持)
* 领域专家与 ML 模型(训练数据集、主动学习、ML 模型可解释性等)交互。)
这些反馈回路中的每一个都必须是双向的。出于好奇,反馈循环有可计算的形式,称为行动的[对话。FWIW,谷歌出现在斯坦福实验室,在那里这项工作被探索,如果你真的想了解相关的历史,检查一下](https://www.goodreads.com/book/show/17870114-conversations-for-action-and-collected-essays)[项目 Cybersyn](https://youtu.be/9qKoaQo9GTw) 。
## 大规模潜在硬件的含义
行业中的一些痛点来自意料之外的方向。因为需要巨大的集群来训练大数据的 ML 模型,所以*机器学习*这个词往往会让人们想到巨大的数据中心:充满计算设备、网络等的巨大建筑。可能[位于某个偏远的可再生能源生产设施](https://www.google.com/about/datacenters/)附近。然而,这种心理形象是*所以* 2017。
你可能已经看到了最近关于微软为 edge 构建硬件,将数据带入云端的新闻。预计在数据科学的日常实践中会有更多,重点是关键词*硬件*、*边缘*和*云*。一方面,数据库中的数据量(例如,你的银行记录)与网络应用交互和其他互联网活动中产生的数据量相比相对较少。作为衡量标准,考虑在 Twitter 上发送的[推文每天产生大约 0.15 兆字节的数据](https://web-assets.domo.com/blog/wp-content/uploads/2017/07/17_domo_data-never-sleeps-5-01.png)。另一方面,正如许多物联网报告所提到的,与*字段*中的数据速率相比,这一指标微不足道。金融交易所每天产生[~ 5tb](http://download.microsoft.com/documents/en-us/sam/bsadatastudy_en.pdf)。全世界的天气数据是这个数字的 4 倍,大约 20tb/天。单个大型望远镜阵列每晚产生的数量就超过这个数字。据估计,2015 年医院的吞吐量约为 665 天。与此同时,从每天飞行的 25,000 次商业航班中,我们得到了大约 18 倍,超过 12 天。总的来说,即使这些数据速率与每辆自动驾驶汽车每天大约 30tb 的数据量相比也是微不足道的。想想商用车辆会给这个数字增加多少数据?
粗略估计将 ML 模型推断所需的数据放在*边*上,正好在[字节](https://en.wikipedia.org/wiki/Yottabyte)的范围内。然而,基本的物理定律排除了将数据“上传到云端”进行处理并返回的可能性。数学和物理学认为我们必须在边缘运行 ML 模型。例如,在安装在商业运输车队的硬件中运行模型(这是一个非常庞大、普遍、有价值的用例)。
https://twitter.com/aallan/status/1055874656761249793
^(“蓝色药丸”棋盘,由[阿拉斯代尔艾伦](https://twitter.com/aallan/status/1055874656761249793))
进入*硬件、边缘、云*的魔法组合。注意,GPU w . r . t 深度学习并没有什么特别神奇的地方。如果你从零开始为神经网络构建硬件,你会为低级线性代数库进行优化,并且可能不会以类似于 GPU 的任何东西结束。对于一个精彩的讨论,[查看](https://www.oreilly.com/ideas/specialized-hardware-for-deep-learning-will-unleash-innovation) [*奥赖利数据秀播客:Andrew Feldman 关于为什么深度学习正在迎来计算架构的黄金时代。*](https://www.oreilly.com/ideas/specialized-hardware-for-deep-learning-will-unleash-innovation)
然后看一段*必看的* [视频采访](https://youtu.be/wgJYd3iLPaU)皮特·沃顿和我在 AI 伦敦录制。皮特向[展示了谷歌](https://github.com/google/stm32_bare_lib)最近基于“蓝色药丸”STM32 兼容微控制器板的工作,这些微控制器板正在中国大量生产。值得注意的是,这些设备每台售价 0.5 美元,如果你批量购买的话,价格会低得多。它们提供了在低功耗嵌入式应用中运行基于 [TensorFlow.js](https://js.tensorflow.org/) 的深度学习推理所需的所有硬件。
斯坦福大学最近的研究表明,深度学习模型可以被转化为在低精度硬件上高精度地运行,通常尺寸会减少几个数量级,运行速度高达 4 倍。Pete 演示了如何运行用于视频识别、图像、语音等的 TensorFlow 模型。,在 20K RAM 中–没有操作系统。换句话说,信号直接进来,通过一个 [DSP](https://en.wikipedia.org/wiki/Digital_signal_processor) ,然后通过 DL models 推断。这些“蓝色药丸”设备足够小,可以通过使用室内环境光线的光伏电池供电;不需要电池。
皮特在其他几个关键点上执行了精致的麦克风下降。首先(除了它们作为猫玩具的明显效用之外),考虑结合语音和视觉命令的方法,即传感器融合。例如,考虑一个[嘈杂的餐厅环境](https://www.soundprint.co/),其中有几个人在说话,这使得深度学习几乎不可能可靠地将语音转换为文本。然而,如果一个人指着一个设备(摄像头)说一个命令(mic),那么 20K TensorFlow 模型就可以可靠地推断出来。
其次,尽管这些“蓝色药丸”设备不够大,无法支持无线电或其他网络连接,但它们能够“永远在线”,随时准备解释语音/视觉命令,进而“唤醒”其他更大的硬件设备,这些设备确实可以连接到基于云的人工智能服务。换句话说,考虑无处不在的廉价硬件设备—*部署在现场,不需要电力、连接和维护*—这些设备可以利用人工智能按需连接到云。
第三,全球已经部署了 5 亿台这样的设备。这意味着存在大量的潜在硬件,我们可以在这些硬件上部署 ML 模型。准备就绪等待。对我来说,这既不祥又奇妙。改变游戏规则的人。
说到 DSP,在伦敦期间,我还采访了英特尔 AI 公司的 Gary Brown,了解他们为 edge 开发新型硬件的工作。英特尔发布了 [OpenVINO](https://www.forbes.com/sites/moorinsights/2018/05/22/intel-openvino-funny-name-great-strategy/#7402b3646301) 工具包,在低功耗应用中部署 ML 模型,类似于谷歌的皮特团队正在做的事情。例如,总的来说,无论我们谈论的是安全、零售还是医疗成像,案件摄像机都变得越来越智能,ML 模型正在嵌入摄像机。延伸这个例子,工厂正在升级为“视觉工厂”,使用这些潜在的摄像机+ML 硬件。换句话说,工厂基础设施本身可以检测危险并在现场发出安全警告*——无需将所有数据上传至云端并传回。随后,可以将聚合的数据或元数据发送到云中进行后处理。*
*作为对上述 edge 数据速率统计的回拨:Gary 描述了未来五年的前景,其中人工智能推理的价值预计将增长 25-30 %,其中大部分增长将发生在边缘而不是数据中心。
把这一切放在上下文中:皮特描述了如何利用大规模存在的大规模潜在硬件;加里描述了新型硬件是如何将这些效应推向更大规模的;艾米描述了如何利用这些进步实现“智能作为团队运动”,即不必等待神奇的人工智能算法,这些算法在没有人参与的情况下执行不可想象的技巧。相反,按照**团队+机器**来计划所有的技术推广,然后根据需要调整组合。
有趣的是,这些边缘人工智能应用程序将数据直接放入硬件,而不是数据科学团队据称花费 80%以上时间的数据管理。这是流程和工程假设中的一个重大变化,对上述的万亿字节规模产生了影响。
我在 2018 年探索的一个元主题是如何
**硬件>软件>流程**
换句话说,硬件比软件进化得快,软件比流程进化得快。许多企业组织对此“竖起两个大拇指”
你在数据科学领域的工作经验与此相符吗?*
# 每个 Pacoid 的主题和会议,第 4 集
> 原文:<https://www.dominodatalab.com/blog/themes-conferences-per-pacoid-episode-4>
*[帕科·内森](https://twitter.com/pacoid)的最新专栏涵盖的主题包括数据隐私、机器伦理,是的,还有堂吉诃德。*
## 介绍
欢迎回到我们关于数据科学的每月系列。我刚从西班牙一个热闹的会议回来。)在那里,我注意到大西洋两岸从事数据科学工作的人们正在努力解决类似的问题。欧洲正在出现重要的创新。这个月,让我们来详细探讨这三个主题:
* *数据隐私*
* *机器伦理*
* *堂吉诃德*
## 数据保密
数据隐私最近发生了一些有趣的变化,与此同时,合规性、安全性和客户体验也获得了好处。苹果首席执行官蒂姆·库克(Tim Cook)10 月底在布鲁塞尔发表了一次关于合规的演讲。他警告说,随着我们的个人数据被大型广告技术公司、数据经纪人等“用军事效率对我们进行武器化”,即将出现“数据工业综合体”。在随后的 [Twitter 帖子](https://twitter.com/tim_cook/status/1055035534769340418)中,库克分享了关于数据隐私的四点:
1. “公司应该挑战自己,首先消除客户数据的身份或不收集这些数据”
2. “用户应该始终知道从他们那里收集了哪些数据,以及收集这些数据的目的是什么”
3. “公司应该认识到,数据属于用户,我们应该让人们能够方便地获得他们个人数据的副本,以及修改和删除这些数据”
4. “每个人都有权保护自己数据的安全;安全是所有数据隐私和隐私权的核心”
这些要点总结了欧盟通用数据保护条例( [GDPR](https://eugdpr.org/) )出台五个月后的许多高级成果。虽然许多公司关注与数据隐私和合规性相关的风险,但新兴技术正在使必然的回报(即产品增强)变得非常有形。
![Irene Gonzálves at Big Data Spain 2018](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/07ecd33e3bb387dc0a630c373b955529.png)*Irene Gonzálves at Big Data Spain 2018, Reuse in Accordance with [Creative Commons Attribution License](https://www.youtube.com/watch?v=Pt8DVNp9fCM&feature=youtu.be)*
11 月中旬,我在马德里的[大数据西班牙](https://www.bigdataspain.org/)大会上授课/演讲,这是欧洲第二大数据科学大会。Irene Gonzálvez 的“数据隐私@Spotify”是一个引人注目的演讲。她首次公开介绍了 Spotify 如何实施 GDPR 有争议的 *[被遗忘权](https://gdpr-info.eu/issues/right-to-be-forgotten/)* 方面。简而言之,Spotify 创建了一个新的名为“挂锁”的全球密钥管理系统来处理用户同意。任何使用客户数据的内部应用程序都必须首先从隐私门户获取密钥。相反,当客户撤销使用其数据的许可时,他们的密钥将被删除,其数据变得不可读。我强烈推荐[艾琳的视频](https://www.youtube.com/watch?v=Pt8DVNp9fCM&feature=youtu.be)了解全部细节。
艾琳指出,*数据只有先加密*才能持久化 *。这有助于减少数据泄露的影响。它还使 Spotify 中的任何一个团队都能够为客户管理整个数据生命周期。这将更好的数据隐私、更主动的合规性、潜在的更好的安全性和有趣的产品增强功能集于一身。我的观点是,在 Spotify 等公司的引领下,我们将看到更多专门针对隐私的大数据创新。这些将导致客户体验的增强而不是降低。*
与此同时,支持数据隐私和加密的其他技术也在快速发展。关于当代工作的出色概述,请参见最近的播客采访“[对加密数据的机器学习](https://www.oreilly.com/ideas/machine-learning-on-encrypted-data)”与[阿龙·考夫曼](https://conferences.oreilly.com/strata/strata-ca/public/schedule/speaker/334106),[二元性](https://duality.cloud/)的联合创始人兼首席执行官。Alon 描述了三种互补的数据隐私方法:
1. [同态加密](https://en.wikipedia.org/wiki/Homomorphic_encryption)
2. [差分隐私](https://arxiv.org/abs/1412.7584)
3. [多方计算](https://en.wikipedia.org/wiki/Secure_multi-party_computation)
想象一个系统,其中机器学习模型根据一组数据进行训练,然后在生产中使用(推理)实时客户数据…与 ML 模型不同的是,训练数据对 ML 模型保密,模型对生产部署保密,用于推理的客户数据也保密。这三种技术各有利弊,有些偏向于一方的隐私,有些偏向于另一方的隐私,但是它们可以结合起来形成一个健壮的系统。
Duality 是一家强大的科技初创公司,绝对值得密切关注。值得注意的是,另一位联合创始人是 2012 年 [ACM 图灵奖](https://amturing.acm.org/)、1993 年和 2001 年[哥德尔奖](http://eatcs.org/index.php/goedel-prize)、1996 年[格蕾丝·默里·霍珀奖](https://awards.acm.org/hopper)的获得者[沙菲·戈德瓦瑟](https://en.wikipedia.org/wiki/Shafi_Goldwasser)……名单还很长。如果有人打算重写计算机科学的基础,看看戈德瓦瑟教授吧。
有关这些技术如何在生产用例中工作的更多信息,请收听与格鲁吉亚合作伙伴[刘畅](https://georgianpartners.com/team/chang-liu/)的播客采访"[隐私保护技术如何能够导致更强大的机器学习模型](https://www.oreilly.com/ideas/how-privacy-preserving-techniques-can-lead-to-more-robust-machine-learning-models)。这些方法中的大多数涉及将噪声注入到数据中,这具有潜在产生更一般的 ML 模型的好处,使它们远离过度拟合。然而,请记住[没有免费的午餐定理](https://en.wikipedia.org/wiki/No_free_lunch_theorem)──增加的噪音也可能降低精确度。
通过查看这些相对较新的论文来更深入地挖掘数学的细节:
* [“差分隐私和机器学习:调查和评论”](https://arxiv.org/abs/1412.7584)
* [“来自分散数据的深度网络的通信高效学习”](https://arxiv.org/abs/1602.05629)
* [“隐私保护深度学习的通用框架”](https://arxiv.org/pdf/1811.04017.pdf)
最后一篇论文与快速增长的 [PySyft](https://github.com/OpenMined/PySyft) 社区有关。到目前为止,运行这些技术的计算成本很高。然而,最近的一份报告指出了性能方面的潜在突破:“[同态加密的 AlexNet 时刻:HCNN,第一个用 GPU](https://eprint.iacr.org/2018/1056.pdf)加密数据的同态 CNN”,作者是 Ahmad Al Badawi,Jin Chao,林杰等人。虽然以前在同态加密方面的工作使用了诸如[海豹突击队](https://www.microsoft.com/en-us/research/project/simple-encrypted-arithmetic-library/)和 [PySEAL](https://medium.com/bioquest/pyseal-homomorphic-encryption-in-a-user-friendly-python-package-51dd6cb0411c) 之类的库,但位于新加坡的 [A*STAR](https://www.a-star.edu.sg/) 的研究发现了以前研究中的错误,他们还在 GPU 上实施了他们的工作以提高性能。他们报告了高安全级别(> 128 位)以及高精度(99%),鉴于上述注入噪声与精度的关系,这似乎令人惊讶。
![An “arithmetic circuit” used in homomorphic encryption](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0e984a909108bfdbee961653627a7f50.png)*An “arithmetic circuit” used in homomorphic encryption*
诚然,最近有人争相抓住“XYZ 的 AlexNet 时刻”这个如今令人遗憾的陈词滥调,尽管它有其实质内容。网络攻击并不新鲜。第一次有记录的金融漏洞网络攻击发生在 1843 年的法国。显然,这个等式中的安全威胁一方不会消失。考虑到新兴技术——尽管计算成本很高——隐私保护技术的性能突破将成为关键因素,因为创新技术供应商如 Duality 改变了游戏,极大地扩展了消费公司如 Spotify 已经在生产中使用的实践。
同时,正如 Alon Kaufman 和其他人提到的,另一个正在出现的关键组件是[联合学习](https://ai.googleblog.com/2017/04/federated-learning-collaborative.html)。如果你想对加密数据进行机器学习实验, [tf-encrypted](https://github.com/mortendahl/tf-encrypted) 是一个构建在 TensorFlow 之上的 Python 库。当涉及两方、三方或多方时,保持数据的私密性至关重要。这个多方问题的共轭是,我们也需要更好的方法来分配机器学习工作,特别是考虑到世界正在朝着边缘、物联网、嵌入式等用例的方向发展。大数据西班牙 2018 的另一个我最喜欢的演讲是 [Amparo Alonso](https://twitter.com/AmparoAlonsoB) 的“[超越准确性和时间](https://www.youtube.com/watch?v=rFaK7Z1oWeg&feature=youtu.be)”,他是 da Coruñ大学人工智能研究的负责人。他们的团队正在研究参数共享,这是另一个令人信服的替代方案。展望未来,我渴望听到即将于 2019 年 3 月 28 日星期四在 Strata SF 由来自谷歌的[亚历克斯·英格曼](https://twitter.com/alex_ingerman)发表的演讲“机器学习的未来是分散的”。
## 机器伦理
今年早些时候,一个令人担忧的时刻出现了:迫在眉睫的 GDPR 要求,网上关于重大数据隐私泄露的报道似乎层出不穷,硅谷的许多道德灾难带来的阴影,等等。,这一切都是同时发生的。这些因素让数据分析的未来看起来很黯淡。如果监管机构不允许你收集大量用户数据,而与此同时,你却不断被黑客攻击和起诉你已经拥有的数据,那么一个组织怎么可能是“数据驱动的”呢?
然而,正如华尔街所说,“买谣言,卖新闻。”几个月后,数据隐私方面的创新带来了安全优势,并带来了更好的客户体验。其他合规领域呢?例如,我们能否以类似的方式接受数据中的*道德*难题,创新不仅能解决棘手的合规问题,还能带来更好的产品?
![Susan Etlinger at AI London](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0edd2a0e85b5ac914826a3a6e66da9e5.png)*Susan Etlinger at AI London*
十月份,我有幸在伦敦的人工智能会议上采访了苏珊·埃特林格。目前,关于道德和数据的对话似乎集中在风险、担忧、监管后果上,坦率地说,集中在那些看到整个电子商务世界正在发生变化的人的困惑感上。我们能否扭转这种局面,不被风险所驱动,而是基于伦理考虑,开发出由数据驱动的更好的产品和服务?*丝丝丝,克拉罗*看看我对苏珊的[视频采访。](https://www.youtube.com/watch?v=WEEbtQjHOKk&feature=youtu.be)
一个关键的要点是不可能得到完全“公平”的决定——生活不是这样的——更不用说完全公平的 ML 模型了。公司的领导层必须理解这一点,并认识到使用 ML 部署的系统会在特定的方向上出错(希望不会损害客户、公众等),并且作为领导者,拥有这些决策。拥有他们,为他们自豪,宣扬他们,制造噪音。保持透明,而不是封闭这些决策。这是一条通向组织实践中更好的数据伦理的道路。
为此,谷歌和 data kind(T1)在 T2 呼吁投资 2500 万美元的人工智能(T3)来解决棘手的社会和环境问题。做一些好事,制造一些噪音,赢得资助。不错的交易。
当然,完美不会经常出现(除了 *Buckaroo Bonzai* 中的完美汤米)。为了更好地了解为什么完美的 ML 公平是一种[*m*](https://tvtropes.org/pmwiki/pmwiki.php/Main/Unobtainium)*的形式,请查看最近与斯坦福大学的 [Sharad Goel](https://5harad.com/) 和 [Sam Corbett-Davies](https://twitter.com/scorbettdavies/status/1002609515668258816) 的播客访谈“[为什么很难设计公平的机器学习模型](https://www.oreilly.com/ideas/why-its-hard-to-design-fair-machine-learning-models)。也就是说,公平需要许多考虑、许多权衡和许多优化的变量。本次访谈涵盖了 ML 模型公平性的几项重要技术,如*反分类、分类奇偶校验、校准等*。净效应是,虽然这些都是好的方法,但要求它们成为一揽子政策将会伤害边缘群体。这基本上是公平的对立面。此外,恶意行为者可以利用这些方法中的任何一种。试图量化公平或自动化监督过程是一个严重的错误。必须分析模型,必须考虑多种因素,必须做出判断。这涉及到决策的分解(稍后会有更多的介绍)。要更深入地挖掘,请查看 Sharad 和 Sam 的论文:“[公平的衡量和错误衡量:公平机器学习的批判性评论,](https://arxiv.org/abs/1808.00023)”,其中包括说明他们论点的优秀例子。*
*《自然》杂志最近发表了一篇文章“[无人驾驶汽车的困境揭示了道德选择并不是普遍的,这扩展了这些论点。](https://www.nature.com/articles/d41586-018-07135-0)“在阅读这些关于“机器伦理”的谜题之前,请先坐下来,这些谜题基于全球范围内对无人驾驶汽车在生死困境中应该做些什么的价值观调查。西方与东方、南方价值观的对比揭示了社会和经济因素对道德规范的影响。例如,*收入不平等*,或政府机构的相对实力,如何改变“道德”选择的定义?一些文化认为,自动驾驶汽车应该选择放过守法者,一些人会放过年轻人,而另一些人则希望放过社会地位更高的人。换句话说,如果你是一个上了年纪的工人阶级,甚至有轻微的警察记录,*在大多数大洲避免走人行横道*,否则机器人会过来追捕你!很明显,没有完美的规则可供认可机构遵守。
## 堂吉诃德
就像塞万提斯 17 世纪早期的小说 [*中亲爱的*](https://www.goodreads.com/book/show/3836.Don_Quixote) *[Alonso Quixano](https://en.wikipedia.org/wiki/Don_Quixote) 一样,我上个月在马德里的大数据西班牙经历了一些冒险和惊喜。在我最后一次演讲后,主持人坚持让我赤脚走路,并蒙住眼睛踩在碎玻璃上。后来,一天深夜,我和一个好朋友去了一家古色古香的 19 世纪咖啡馆,这是著名的西班牙诗人最喜欢的咖啡馆,Jorge Bedoya 和他的女演员姐姐跟着我们进去,并迅速拿起小三角钢琴,在钢琴上即兴演奏了弗拉门戈风格的音乐。这个地方爆发了。*大官!**
![Central Madrid at Night](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/14ce747db922655fab146cb6ff3fed61.png)*Central Madrid at Night*
然而,最令人惊讶的文化享受是去参观 [Restaurante El Tormo](https://www.restaurantes.com/restaurante-el-tormo) 餐厅,那里供应《T2》*唐吉诃德*中描述的手工菜肴。诚然,在塞万提斯写作的时候,其中一些菜肴已经有几个世纪的历史了。店主是一对年纪较大的夫妇(根据墙上的照片快速算了一下,我想他们肯定都已经 70 多岁或更老了),他们几十年来热衷于研究历史食谱,重现了失传已久的技术。如果你来到世界的这个地方,千万不要错过厄尔尼诺现象。看看这些[菜](https://www.instagram.com/p/BqQFA6SgI69/)!顺便说一句,“午餐”大约需要 4 个小时才能完成,所以要做好相应的计划。
《堂吉诃德》的部分魅力在于,自它首次出版以来的四个世纪里,几代人都在努力确定作者的意图。这是一个关于一个在骑士观念下长大的老人的故事吗?他对文艺复兴时期急剧变化的世界感到困惑。是对正统和民族主义的冷嘲热讽?它是否试图证明当社会是错误的时候,个人是正确的?*无 sè。*
关于伦理和隐私,Susan Etlinger 和我最近参加了世界经济论坛(WEF)的一个研讨会,他们正在为明年的 T2 达沃斯(T3)准备人工智能议程。我们是该领域 30 名专家中的一员,致力于解决堂吉诃德式的问题。一个成果是针对企业董事会成员的[授权人工智能领导力工具包](http://www3.weforum.org/docs/WEF_Empowering-AI-Leadership_Oversight-Toolkit.pdf),以帮助他们理解数据科学隐含的关键但非直觉的问题。
许多老牌公司的最高级决策者在职业生涯中已经成熟,诸如六适马、T2、精益创业、T4 和敏捷的理念在技术管理中非常流行。结果,他们学会了将自动化视为某种固有的*确定性*的东西,并且他们被训练将*不确定性*视为一个需要从业务流程中根除的问题。
然而,世界突然发生了变化,高级决策者可能会发现自己有点像阿隆索·基萨诺(Alonso Quixano)试图理解他周围的巨大变化。《堂吉诃德》出版将近 500 年后,我们可以称我们现在的时代为“文艺复兴 2.0”,或者别的什么。现在我们有了参与决策的*概率*系统。随着组织在分析能力方面经历典型的成熟阶段—*描述性、诊断性、预测性、规范性*——越来越多的决策逐渐转向自动化流程。
今天,我们对如何培养数据科学职业的个人贡献者有了很好的想法。我们开始清晰地阐述如何有效地领导数据团队。然而,在数据科学和人工智能的背景下,执行决策的细微差别仍然有点模糊。董事会和高管团队在数据相关问题上的互动大多处于混乱状态。和奎萨诺一样,他们在这里是“向风车倾斜”(即打击假想敌)。
因此,瓶颈问题正在上升到管理层和董事会层面。董事会成员学习了六适马、敏捷等。没有为人工智能用例的判断做好充分准备。他们现在必须考虑随机系统(阅读:*非确定性*),其中不确定性得到利用,风险的性质已经改变。坦率地说,如果他们不采取行动,竞争对手(或联邦监管机构,或反对的法律团队,或消费者权益倡导者,或网络攻击者)就会采取行动。
WEF 正试图通过在 2019 年达沃斯论坛上预览他们的人工智能工具包来正面帮助董事会成员解决这个问题……之后,WEF 和他的朋友们将努力通过全球董事会级网络传播这一资源。
![Art in Hallway at World Economic Forum, SF](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c0d9ed63a36b92cc6e2ee6d7be2896da.png)*Art in Hallway at World Economic Forum, SF*
奇怪的是,虽然我们认为机器学习是一种从过去的数据中归纳模式的方法,但事实证明机器学习与商业理论的核心有直接关系。回顾上个世纪的经典商业文本之一,Frank Knight 的[风险、不确定性和利润](https://www.econlib.org/library/Knight/knRUP.html)(出版于 1921 年)在*可识别风险*(购买保险)和*不确定性*(存在利润机会)之间建立了重要的区别。事实证明,机器学习非常擅长识别数据集中的不确定区域,因为这些数据被用来训练 ML 模型。这为*半监督学习*的变体打开了大门:模型在对其预测有可接受的信心的情况下处理预测分析,否则它们会将可证明不确定的极限情况提交给团队中的人类专家。每个商业问题现在都应该被看作是由人+机器的团队来解决的事情。在某些情况下,大部分是人,而在其他情况下,大部分是机器。在任何情况下,总是从管理两个团队的基线开始。此外,利用它们之间的反馈循环:你的人和机器学习模型互相学习。
今年早些时候,有一篇来自麦肯锡公司的精彩文章,Ajay Agrawal 的《[人工智能经济学》,指出了*拆分组织内部决策过程的必要性。对于那些刚刚进入数据领域的组织来说,我找不到比这更重要的一点来强调。这是当代堂吉诃德的解药,这些暴躁的侠客可能会因为数据、隐私、道德、安全、合规、竞争等方面的严重难题而向风车倾斜。在六适马长大的高管和董事会成员现在必须重新学习如何与自动化的概率系统一起思考。决策可能来自直觉层面(反应性)或个人精力的更昂贵投资(认知)。我们在 2018 年学到的是,为了在竞争利用人工智能的世界中茁壮成长,我们必须将更多的反应性快速决策转移到大多数机器上,同时将更昂贵的认知转移到人身上。一些组织试图以相反的方式开始,但失败了。*](https://www.mckinsey.com/capabilities/quantumblack/our-insights/the-economics-of-artificial-intelligence)
另一个很好的资源是诺贝尔奖获得者丹尼尔·卡内曼的《思考快与慢》、《T2》、《T3》一书,这本书概述了人们通常在决策中失败的原因。我们生来就有作为个体做出决定的能力;例如,坏消息比好消息更重要,这有助于我们在一个残酷、竞争激烈的世界中生存。感知的损失比可能的收益更重要。卡尼曼指出,我们的进化线路迫使个体试图*存活足够长的时间来繁衍后代*,这对于大型组织的决策根本不起作用。尤其是当我们谈论复杂的决策和长期战略时,其中的含义将跨越许多不同的文化和大陆。因此,我们开始利用数据科学作为一种通知组织的方式,围绕人类决策者在实践中通常引发的常见形式的[认知偏差](https://en.wikipedia.org/wiki/List_of_cognitive_biases)开展工作。一个问题是:大型组织的最高层仍然在努力应对“文艺复兴 2.0”的影响,以及如何与机器合作。
![“Fast Food” at Madrid Airport](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9399e87000d84595b315c7df156f1585.png)*“Fast Food” at Madrid Airport*
决策的*松绑*是当今数据科学最重要的一点。了解你的组织是如何做决策的。在你的业务流程中,哪些地方的直觉反应至关重要?哪里是需要更深思熟虑的地方?机器在这幅图中处于什么位置?因为现在他们必须这么做。
以下是一些精彩的演示,更详细地探讨了决策“拆分”问题:
* "[从大数据到人工智能:我们现在在哪里,前进的道路是什么?](https://www.zdnet.com/article/from-big-data-to-ai-where-are-we-now-and-what-is-the-road-forward/) " ─乔治·阿纳迪奥蒂斯,ZDnet
* [《缺失的一块》](https://www.oreilly.com/ideas/the-missing-piece)──凯西·科济尔科夫,谷歌
* “社会科学研究如何为人工智能系统的设计提供信息”─雅各布·沃德,斯坦福
* [“全球大脑的新愿景:以人代替机器的深度学习”](https://www.oreilly.com/ideas/a-new-vision-for-the-global-brain-deep-learning-with-people-instead-of-machines) ─ Omoju Miller,GitHub
在后面的演讲中,Omoju 拿出一个典型的企业组织结构图,将其旋转 90 度,然后考虑该图看起来有多像,以及(应该)作为一个深度神经网络架构发挥作用。这是一个很好的思考点:我们能从人工神经网络组织如何跨层、连接池、嵌入等进行决策中学到什么?,企业团队可以借鉴哪些技术?这与风车倾斜正好相反。
## 即将举行的活动
11 月,我们进行了一场热烈的小组讨论“[数据科学与工程:真的必须这样吗?](https://www.eventbrite.com/e/data-science-versus-engineering-does-it-really-have-to-be-this-way-tickets-50454045408)“在旧金山的达美乐总部。我将把详细的报道交给[,但我最喜欢的摘录是](https://blog.dominodatalab.com/data-science-vs-engineering-tension-points/)[皮特·沃顿](https://twitter.com/petewarden),描述了谷歌计划开发人工智能模型和产品预期的部分过程——他们称之为[绿野仙踪](https://twitter.com/aheineike/status/1060944102429097984)。换句话说,让一个人站在幕后,扮演一个预期的 ML 模型的角色,使用训练数据来回答问题。然后让一小群观众与一个模拟产品互动,就好像他们在与幕后的一个向导互动一样。如果那个角色扮演奇才遇到了麻烦,想象一下训练相应的 ML 模型可能有多难?这是一个设定期望值的好方法——同样,对于生产中的人+机器团队来说。
说到数据科学的领导力和决策过程的“松绑”,请在您的日历上标记一下 5 月 15 日至 16 日在纽约举行的 [Rev](https://rev.dominodatalab.com/?utm_source=blog&utm_medium=post&utm_campaign=) 会议,我们将在会上重点讨论如何领导数据科学团队并在组织内保持高效。我们将在整个项目中强调团队之间的相互学习,并展示数据分析领域的天才领导者,包括我在该领域非常尊敬的两个人的主题演讲:[米歇尔·乌福德](https://twitter.com/MichelleUfford)和[汤姆·科恩盖](https://www.linkedin.com/in/kornegayt/)。请关注 12 月即将开启的“提案征集”活动。
与此同时,2018 年剩余时间里没有太多数据科学活动。请查看新的[会议观察列表](https://derwen.ai/events#watchlist),了解关于数据、机器学习、人工智能等会议的策划列表。我们将在这里继续强调即将到来的重要事件。
祝你和你的家人节日快乐!*
# 每个 Pacoid 的主题和会议,第 5 集
> 原文:<https://www.dominodatalab.com/blog/themes-conferences-per-pacoid-episode-5>
*在 [Paco Nathan](https://twitter.com/pacoid) 的最新专栏中,他通过深入教育计划、学习材料、教育方法以及对教育的看法来探索“学习数据科学”的主题。他还是即将举行的数据科学领袖峰会 [Rev](https://rev.dominodatalab.com/?utm_source=blog&utm_medium=post&utm_campaign=themes-conferences-per-pacoid-episode-5) 的联合主席。*
## 介绍
欢迎回到我们关于数据科学的每月系列。这个月,我们来探讨一下*学习数据科学*。
最近,我一直在为一个客户开发他们新的“数据科学导论”系列课程的课程。无论如何,这都不是一个新的工作。自 2008 年以来,我一直在私下为雇主教授数据科学,包括高管人员、投资者、IT 团队和我领导的数据团队,自 2013 年以来,我还为整个行业的专业人士教授数据科学。然而,现在是考虑的一个有趣的时间点:“需要教什么?我们领域的基础部分是什么?”
让我们探讨一下关于学习数据科学的问题,并对其进行一些解释。数据科学领域领先的*教育项目*在哪里?有哪些好的*学习资料*可以提供给大众?
在*在线资料*、*面授课程、MOOCs、bootcamps、*等一系列课程中,哪种效果更好?像*辅导*项目这样的选择,对于组织和相关个人来说,如何适应这种情况?
在商业术语中,**为什么这很重要**?对于在数据科学内部培训方面落后的公司来说,*预计风险*是什么?对于希望接受数据科学培训以转换到新角色的员工来说,什么样的*角色*比较合适?
我最喜欢的话题是:有哪些最好的书、博客、播客等等。,开始学习数据科学?
## 学习数据科学
如果您正在寻找数据科学课程的好例子,例如帮助培训您的团队,您会从哪里开始?
从数字上看,可以说世界上最大的成功是加州大学伯克利分校的数据科学部门。在摇滚明星[凯瑟琳·卡森](https://twitter.com/cathryncarson)、[大卫·卡勒](https://people.eecs.berkeley.edu/~culler/)等人的带领下,这项倡议从根本上改变了柏克莱的学术项目。此外,它还为其他大学的效仿开辟了道路。他们的[数据 8](http://data8.org/) 基础课程和数据 100 中级课程的教育资料,以及他们的教材 *[推理和计算思维](https://www.inferentialthinking.com/chapters/intro.html)* 都可以在网上找到。这两门课程是伯克利历史上发展最快的课程,现在已经达到了校园人口的 40%。此外,还有一个创新的做法是将 *[课程](https://data.berkeley.edu/education/connectors)* 连接到其他学科。该计划支持基于 [JupyterHub](https://jupyter.org/hub) 的超过 1200 名学生的动手数据科学班级规模,这为企业基础架构设置了一个标杆。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fa76beac5ff8c45ef022b1f351c7844e.png) *UC Berkeley intro data science course (credit: [Fernando Pérez](https://www.youtube.com/watch?v=xuNj5paMuow&feature=youtu.be))*
当然,并不是每个人都是加州大学伯克利分校的注册学生或其大学合作伙伴之一,因此,不会有机会参加这些项目。此外,数据科学显然没有“一刀切”的教育模式。运营*数据科学社区简讯*的 Laura Noren 在[JuptyerCon 2018 上展示了她的 NYU 博士后研究,比较了研究和教育中数据科学的基础设施模型](https://conferences.oreilly.com/jupyter/jup-ny/public/schedule/detail/68332)。加拿大项目与美国类似努力的对比尤其有趣。伯克利模式满足了美国大学的巨大需求。然而,学习数据科学还有多种其他需求。
## 为什么这很重要?
首先,祝贺伯克利。我的母校可能位于旧金山湾的对面(树木与熊之类的),然而,我很高兴看到他们的成功,并荣幸地在相关的 [BIDS](https://bids.berkeley.edu/about) grad 项目中做客座演讲。将数据科学工作的*工具集、技能集、数据集、*和*思维定势*渗透到大学生的头脑和头脑中——这太棒了。无论学生选择哪个学术领域,他们都将为从事 21 世纪的研究打下更好的基础。
## 不同的格式,不同的方法
然而,已经在工业界工作的人还有其他需求。需要不同的学习材料格式、不同的课程方法(例如,案例研究中更深入的内容),以及不同的教学风格(“ROI”得到了大量讨论)。例子:大约在 2002 年,我在一个 *[继续教育项目](http://continue.austincc.edu/workforce/computer)* 中教授网络安全。我们班的人会工作 8-10 个小时,然后晚上再花 3 个小时参加我们的节目(如果他们能保持清醒的话)。他们做出巨大牺牲,投资*提升*技能,为职业生涯带来重大改变。教授这些课程与教授本科生非常不同。
一般来说,专业人士的首要任务是从目前的工作中“提升技能”,进入他们的组织在快速变化的工作场所要求的新角色。在数据科学中尤其如此;大多数企业组织根本无法雇佣足够的数据分析人才,因此,这些人员需求中的大部分必须由现有员工来满足。
根据组织的业务重点,人们需要不同的培训方法。例如,一家大型知名咨询公司的高管向我解释说,他们很少派员工参加面对面的课程。他们向客户收取 3000 美元/小时的费用,因此,除了提供按需在线学习材料之外,做任何事情都是一笔巨大的业务损失。OTOH,同一周,一家大型知名计算机硬件公司的高管向我解释说,他们强烈反对员工使用在线学习材料。他们的竞争对手很容易从培训供应商那里“获得”web 服务器日志,并可能提前很长时间猜测新产品方向。相反,该公司花费$$$送员工(以团队形式)去参加培训会议,在那里他们很少问团队以外的问题。我为公司教过课,这是真的。对于必须认真对待竞争和安全问题的大部分企业来说,情况也是如此。**mooc 不是万能药**。对于数据科学培训,我们没有也不可能有“一刀切”的解决方案。
## 规模和紧迫性
此外,还有规模和紧迫性的问题。如果该领域的顶级分析师的预测甚至接近准确,我们必须希望提升技能能够很好地工作并有效地扩展。最近,世界经济论坛发布了“【2018 年未来就业报告”这些数字是“令人信服的”(有些人可能会说“令人鼓舞”,有些人可能会说“令人恐惧”,YMMV):
“再培训势在必行:到 2022 年,不少于 54%的员工将需要大量的再培训和技能提升。其中,约 35%预计需要长达 6 个月的额外培训,9%需要持续 6 至 12 个月的再技能培训,而 10%需要超过一年的额外技能培训。到 2022 年,持续增长的突出技能包括分析思维和创新,以及主动学习和学习策略。技术设计和编程等技能的重要性急剧上升,突显出接受本报告调查的雇主对各种形式的技术能力的需求日益增长。然而,精通新技术只是 2022 年技能等式的一部分,因为创造力、原创性和主动性、批判性思维、说服和谈判等“人类”技能将同样保留或增加其价值,关注细节、弹性、灵活性和解决复杂问题的能力也是如此。情商、领导力、社会影响力以及服务导向也相对于它们目前的突出地位出现了巨大的需求增长。”
如果你擅长做数据科学的工作,在可预见的将来你会有很多就业机会。与此同时,那些押注他们的团队会在数据科学、机器学习、数据工程、人工智能等领域完成重大项目的雇主。,并希望在竞争异常激烈的招聘环境中奇迹般地招聘到新人才——请注意。术语*提升技能*更有可能成为你的代名词。
麦肯锡全球研究所最近的另一份报告与 WEF 的分析密切相关。特别要注意“附件 6:”
“人才是人工智能面临的最大挑战之一,无论一家公司的数字计划有多先进,公司在寻找人才和技能时不遗余力也就不足为奇了。最常见的情况是,受访者表示他们的组织正在采取“以上所有”的方法:雇佣外部人才,建立内部能力,以及从大型技术公司购买或授权能力。在各个行业,即使是在人工智能采用方面领先的公司(即电信、高科技和金融服务公司)也报告了内部和外部采购的混合——尽管它们比其他公司更专注于开发自己的人工智能能力。这些领域的受访者比平均水平更有可能表示,他们正在建立内部人工智能能力,这需要具备适当技能的内部人才。在高科技和金融服务业,受访者也更有可能报告接受再培训或提高技能。数字化程度最高的公司也是如此:受访者比其他人更有可能报告人工智能能力的内部开发以及对现有员工的再培训或技能提升(图表 6)。”
重点是,*培训、再培训、*和*技能提升*对于企业中的数据科学至关重要。让我问一个问题:作为一名经理,你会把培训外包出去吗?你依靠 L & D 来获得合适的程序吗?你在内部培养技能了吗?你指导你的员工寻找他们自己的学习机会吗?一句话,是的。而且,正如麦肯锡报告中提到的,可能以上都有。
## 学历!=培训!=学习
关于如何有效地学习数据科学,我有两条重要的建议,主要针对个人,但也针对组织:
1. 学历!=培训!=学习
2. 找到优秀的人来指导和投入你的时间
你通过经验获得的第一点。第二点是利用你的经验,加速相关的学习。
教育可以发挥作用。也许对职业发展来说不是这样,在职业发展中,我们更需要的是“培训”。无论如何,学习是真正需要发生的事情。这三个术语彼此有很大的不同。对于数据科学工作,该领域发展迅速,专业人员需要不断学习*。*
*这就引出了第二点。找到与你不同的人,他们需要并希望在数据科学方面得到有益的指导。投入时间。有所作为。当他们准备换工作,需要谈论新的机会时,倾听他们的心声。提供参考。建议选项、警告、指导。帮助建立联系。同时建立你的人际网络。
猜猜谁从中受益最大?**你会**。多年来,我在数据科学领域帮助指导过的人已经成为团队领导、经理和高管。他们创办了有趣的新科技公司,并在行业中开创了令人惊叹的项目。他们会问一些会让你有不同想法的问题。他们会积累与你不同的观点,关注远远超出你经验的用例。数据科学是[多学科](https://www.semanticscholar.org/paper/Data-science%3A-An-action-plan-for-expanding-the-of-Cleveland/915cd8e2b39eb02723553913d592b2237d4d9960)的,是一项团队运动。孤狼变得短视。通过指导,你将在这个过程中以比仅仅专注于爬公司阶梯更快的方式学习。
此外,这为社会资本建立了一个投资组合,即使是亿万富翁风险资本家也无法购买。现在就开始,成为盟友。如果你需要关于从哪里开始的建议,尽管问。
组织注意:数据科学领域的内部指导项目非常成功。当你建立内部项目时,融入足够的包容性。同上,提高技能的紧迫性。
## 美国宇航局一直拼错木星
就数据科学的教学而言, [Project Jupyter](https://jupyter.org/) 可能是过去十年中最大的新闻——尽管 Jupyter 的起源可以追溯到 2001 年!我将修改这一点,说大新闻是 Jupyter + *【某种形式的轻量级虚拟化,从虚拟机到 Docker 到 virtualenv 再到无服务器】*。
Jupyter 的核心是一套用于远程代码执行语义的网络协议。一个类似的例子是 HTTP T1 是一套网络协议,用于 T2 远程文件共享 T3 的语义。然而,在实践中(IMO ),有两个要点强烈支持 Jupyter:
* [用于协作的可重复工作流程](https://www.w3.org/Protocols/HTTP/AsImplemented.html)(读作:责任)
* 出版和同行评审
可复制意味着另一个人可以定义一个问题,描述一个解决方案,加上代码,加上数据,然后提交这个“思想包”作为一个回购。您可以搜索 repo,运行代码,探索解决方案。完了,完了。科学只用了几百年就达到了这种理智的程度。
出版和同行评议对学习至关重要。当然,有一个明显的例子,博士生有期刊论文,学位论文,论文答辩。从另一个角度来看:询问任何维护过流行开源项目的人关于*出版*和*同行评审* w.r.t .加速和持续学习的好处。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/bcecc8cb67fa58d2c5fe772a933d8b9e.png) *GWU session for #Jupyter4Edu ([credit: Kyle Mandli](https://twitter.com/KyleMandli/status/1068605226565988353))*
后一点是我特别喜欢朱庇特的原因。作为一名教师,使用笔记本进行动手练习、增加课堂内的合作、[计算思维](https://www.cs.cmu.edu/~CompThink/)方法、[倒置课堂技巧](https://facultyinnovate.utexas.edu/how-to-flip)等都有明显的好处。
2018 年 12 月下旬发布的一个强烈推荐的资源是新的[*Jupyter*](https://jupyter4edu.github.io/jupyter-edu-book/)在线书籍的教学。非常感谢 Lorena Barba 等人汇编了该领域许多人的经验和建议。标题为“教学模式目录”的章节回答了人们曾经问过我的关于用 Jupyter 教学的大部分难题。
## 教育学的一些背景
同时放弃对教学、学习等的看法。,也许一些教师的个人背景可能有助于建立背景:
斯坦福大学计算机科学讲师,1984-86 年:在互联网推出的第二年,为了我的奖学金,我为非技术专业的学生创建了一个大型的同伴教学项目,以学习如何利用互联网资源。在过去 34 年多的时间里,许多杰出人士为住宅计算做出了贡献,也称为“RCC”计划,最近更名为“VPTL”。许多其他大学最终复制了我们的方法(看看你,伯克利)。
在互联网繁荣/萧条之后,我成为了一所大型社区大学的兼职教授,介绍 web 开发(“AJAX”在当时是一个新奇的事物)和网络安全(最重要的是,我们学会了如何“检索”RedHat Linux 的根密码)的课程。
在 2013 年至 2014 年期间创建和教授数据科学课程时,我向那些希望提升机器学习用例技能和所需高级数学的企业高管介绍了[恰到好处的数学](https://github.com/ceteri/jem-video)。开始是一本书,后来演变成视频加 Jupyter 笔记本,然后是一系列 O'Reilly Media 的会议教程。
2014 年晚些时候,Matei Zaharia 和我开发了一个介绍 Apache Spark 的 *[课程,然后我从创建它的 Andy Konwinski 手中接管了广受欢迎的 Spark Camp。随之而来的是在斯坦福大学、加州大学伯克利分校、CMU 大学、麻省理工学院、马里兰大学、佐治亚理工学院、博尔德大学、KTH 大学等地的一系列客座演讲。](https://www.youtube.com/watch?v=VWeWViFCzzg&feature=youtu.be)*
成千上万的学生之后,我加入了 O'Reilly Media,并建立了一个名为“学习小组”的团队,我们中的大多数人都曾在大学和行业中任教。虽然避免了编辑和获取方面,我们监督学习路径,教学视频和会议培训的生产。我们还推出了[黄鹂](https://learning.oreilly.com/oriole/)互动形式(Jupyter + Docker + video),为广受欢迎的[在线直播培训](https://www.oreilly.com/live-training/index.html)成立了业务部门,为 *[形成性自我评估](https://www.oreilly.com/ideas/why-self-assessments-improve-learning)* 创建了 API/微服务,并帮助组织了[Ed Foo](https://www.linkedin.com/pulse/ed-foo-camp-googleplex-innovation-lifelong-learning-russell-shilling/)——这是一个由 O'Reilly 和 Google 制作的关于教育的“Foo Camp”,得到了 Macmillan、Sci Am、芝麻街等的帮助。
## 对“教育”、“教学”和“学习”的理解
我提出这一点是因为在所有这些经历中,我的主要收获是人们对“教育”、“教学”和“学习”这些词有着非常疯狂的想法我的一位早期护理员教我永远不要在有礼貌的场合讨论宗教或政治(抱歉黑兹尔),但我发现*教育*是一个更具争议性的话题。人们带着他们的偏见和包袱,然后试图强加给别人。特别是对于数据科学,尤其是在管理人员中,人们对*如何学习*基于分析和证据的协作决策实践有着疯狂的想法。再加上关于*公平、偏见、道德、合规、隐私、安全、*和*包容*的问题,一些人基本上失去了理智。这是商业中的一个大问题,同上,上面关于“技能提升”的讨论。
比如说…
mooc 风靡全球,在数据科学和相关主题方面非常受欢迎。它们有用途,也有局限性。如果你是 UT Austin,而你所在的州立法机构要求你每年毕业 **N** 名新牙医,但不资助大学内部的课程开发(历史上就是这样),那么你可以通过 MOOCs 从其他大学购买大量课程。如果你住在纽芬兰农村的最边缘(就像我的一些亲戚一样),那么通过 MOOCs 进行远程学习可能是一个不错的选择。然而,MOOCs 也有局限性。参见 2013 年发表在 *Nature* 、[由少数受过教育的人开设的 MOOCs、](https://www.nature.com/articles/503342a)的文章,以及在 [ACM meetup](https://www.youtube.com/watch?v=pmi3NK39g3c&feature=youtu.be) 上关于这个话题的一些扩展讨论。一个缺点是,讲师开发 MOOCs 视频的成本往往很高,尽管 [Open edX](http://lorenabarba.com/news/jupyter-based-courses-in-open-edx-authoring-and-grading-with-notebooks/) 一直在创新解决这个问题。
训练营和相关的强化项目风靡全球(有一段时间),其中许多项目都专注于数据科学。我做过一些我很喜欢的程序( [Insight](https://www.insightdatascience.com/) 、 [TDI](https://www.thedataincubator.com/) 、 [ASI](https://www.asidatascience.com/) )。OTOH,其他人实质上承诺:“支付美元美元,你将在几周内成为一名认证数据科学家。相信我们。”翻译过来:**仿佛。有些人需要更多的社会环境来学习,训练营可以很好地满足这些人。**
## 超越反模式
但是数据科学课程包括什么呢?
多年来,客户反复向我提出的一个要求是开发一个数据科学课程,让人们从很少的先决条件开始,通过 3 到 4 门课程,然后在最后获得“专家”数据科学家的认证。这是人们对教育最疯狂的想法之一。
没有什么神奇的公式可以教人们成为数据科学家。在我看来,这些技能永远不可能神奇地捆绑到一个只需几周(或几天)就能完成的认证项目中。教是一回事,学是完全不同的。
数据科学教学中的一个*反模式*是,虽然想出一门好的“入门”或“基础”课程并不难,但定义中级和高级课程却成了问题。对高级主题的覆盖范围变得太广。因此,我对数据科学中的大多数三门“综合”课程持保留态度。
简短的回答是关于体验。引用沃纳·威格尔的一句名言:
“没有经验的压缩算法。”
然而,眼下的问题不是为数据科学专业的大学定义多课程课程,因为加州大学伯克利分校和朋友们在这方面做得很好。眼下的问题是解决工业上大规模提升技术的现实。
让我们为需要在提升技能的环境中学习数据科学的人定义一个*角色*。他们大概有一些技术背景,至少有一些编程经验,或者愿意去获取。那没问题。他们可能至少有几年的工业工作经验。因此,他们参与了面试、一些招聘决策,还有一些以某种方式进行数据分析。他们在工作中使用数据基础设施。他们可能已经知道如何编写 SQL 查询。也许,一个作为软件开发人员的团队领导,可能着眼于最终的管理。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b628d0e11e8c023a91ca8391ece7983a.png) * More than 3 million public notebooks ([credit: Peter Parente](https://twitter.com/parente/status/1058727026557939712))*
在这种背景下,定义数据科学课程变得更加容易。虽然有很好的理由使用 [R](https://www.r-project.org/about.html) (你见过最初的餐巾图吗?)或者[茱莉亚](https://julialang.org/)(2018[威尔金森奖](http://news.mit.edu/2018/julia-language-co-creators-win-james-wilkinson-prize-numerical-software-1226)获得者),大部分人都在关注 Python 对于数据科学的入门。就内容而言,基础材料需要强化*统计思维*的实践示例,如何构建*可重复的工作流程*,了解如何使用*置信区间*,如何*可视化数据*,*没有免费的午餐*定理,创建*混淆矩阵*等等。我可以从高中“代数 II”到机器学习所需的数学之间画一条线。哦,GitHub 上目前有超过三百万的 Jupyter 笔记本。再加上一些关于道德和偏见的最新材料,一些有趣的数据集,你可能就可以开始了。
在我看来,一个好的序列需要这个课程加上一个关于*数据工程*基础的类似结构的课程,它更侧重于利用基础设施、部署、流程等等。另外还有一门结构类似的课程,是关于建立和领导数据科学团队的,重点是*业务*和*领导力*。对于上面的角色,这些都是在几周内可以达到的学习目标。同样,所需的经验需要数年时间——引用上面沃纳的话——其中一些人已经有了这种经验。
## 推荐资源
对于学习数据科学,以下是我的一些主要建议。如果你还没有看过 [R2D3](https://twitter.com/r2d3us) 的机器学习系列的精彩视觉介绍,[第一部分](http://www.r2d3.us/visual-intro-to-machine-learning-part-1/)和[第二部分](http://www.r2d3.us/visual-intro-to-machine-learning-part-2/) …跑,不要走,去你最近的浏览器看看! *[提取](https://distill.pub/)* , *[参数化按压](https://parametric.press/)* ,*可观察*也给晚会带来了震撼。
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9200cf2c69eb0e99952c8cd5abd8bb17.png) *Data visualization for prediction accuracy ([credit: R2D3](http://www.r2d3.us/visual-intro-to-machine-learning-part-1/))*
有很多关于数据科学的好博客,我最喜欢的一个是数据可视化的网站,。其“邪恶双生对面”是 *[恐怖地图](https://twitter.com/terriblemaps/)* ,也推荐对比。
正如你在本专栏中注意到的,我是本·洛里卡的 [*奥莱利数据秀*](https://www.oreilly.com/topics/oreilly-data-show-podcast) 播客的忠实粉丝。它以我们领域的前沿信息为特色,直接来自使这些进步发生的专家。
现在是真正有趣的部分:**数据科学课程中使用的顶级书籍。**我曾经每周为 O'Reilly Media 做一次趋势分析,看看这一类别中哪些书籍在网上使用最多:以下是最好的书籍,大致按最近使用次数+使用次数排序:
[*用于数据分析的 Python,第二版*](https://www.goodreads.com/book/show/38230294-python-for-data-analysis)
**韦斯·麦金尼(2017)**
*这么多你需要的数据科学,汇聚成一本简明的卷*
*[用 Scikit-Learn 和 TensorFlow 进行动手机器学习](https://www.goodreads.com/book/show/32899495-hands-on-machine-learning-with-scikit-learn-and-tensorflow)*
**aurélien géRon(2017)**
*用最流行的开源包全面介绍 ML*
*[面向机器学习的特征工程](https://www.goodreads.com/book/show/31393737-feature-engineering-for-machine-learning)*
**Alice Zheng,Amanda Casari (2018)**
*系好安全带进行特征工程的激烈探索*
*[机器学习与 Python 菜谱](https://www.goodreads.com/book/show/37588196-machine-learning-with-python-cookbook)*
**Chris Albon(2018)**
*数据科学做得好的例子,从 A 到 Z,在笔记本上*
*[Python 数据科学手册](https://www.goodreads.com/book/show/26457146-python-data-science-handbook)*
**Jake Vander plas(2016)**
*优秀;GitHub 上的 [Jupyter 中的全文](https://github.com/jakevdp/PythonDataScienceHandbook);#walkthetalk*
*[Think Stats](https://www.goodreads.com/book/show/12042357-think-stats)*
**艾伦·b·唐尼(2011)**
*牛顿写了 3 卷的[原理](https://en.wikipedia.org/wiki/Philosophi%C3%A6_Naturalis_Principia_Mathematica#Contents),克努特写了~4 卷的 TAOCP(至今),唐尼写了 4 卷的 Think 系列,至今;我不会在没有参考他们的情况下教学*
*[思贝氏](https://www.goodreads.com/book/show/18711042-think-bayes)*
**艾伦·b·唐尼(2013)**
同上,牛顿等人。
*[从零开始的数据科学](https://www.goodreads.com/book/show/25407018-data-science-from-scratch)*
**乔尔·格鲁什(2015)**
我们有分歧,尽管我是乔尔关于 AllenNLP 的著作的超级粉丝,我也用这本书授课
*[大师算法](https://www.goodreads.com/book/show/24612233-the-master-algorithm)*
**佩德罗·多明戈斯(2015)**
当你需要向某人,甚至向自己解释 ML 时,这是迄今为止最好的指南
这是一个好的开始。顺便说一句,这些大多包括优秀的例子和练习(如笔记本)。敬请关注更多内容。
## 即将举行的活动
此处需要注意的即将举办的活动:
* [地层数据会议](https://conferences.oreilly.com/strata/strata-ca),旧金山,3 月 25 日至 28 日
* 4 月 15 日至 18 日在纽约举行的人工智能会议
* 5 月 23 日至 24 日,纽约市,我们将邀请诺贝尔奖得主丹尼尔·卡内曼()领衔主演!
我提到过我们会让丹尼尔·卡内曼在 [Rev](https://rev.dominodatalab.com/) 演讲吗?!?!?在那里见。
同时,我祝你和你的家人在新的一年里一切顺利!*
# 每个 Pacoid 的主题和会议,第 6 集
> 原文:<https://www.dominodatalab.com/blog/themes-conferences-per-pacoid-episode-6>
*在 [Paco Nathan](https://twitter.com/pacoid) 的最新专栏中,他探讨了好奇心在数据科学工作中的作用,以及即将举行的数据科学领导者峰会 [Rev 2](https://rev.dominodatalab.com/?utm_source=blog&utm_medium=post&utm_campaign=) 。*
## 介绍
欢迎回到我们关于数据科学的每月系列。这个月,让我们来详细探索两个主题:深入了解 [Rev 2](https://rev.dominodatalab.com/rev-2019/) 和探索*好奇心*如何在数据科学工作中发挥重要的、或许非直觉的作用。我们将把好奇心作为有效数据科学的一个核心属性,看看它是如何影响数据科学的过程的(相对于敏捷等)。),并深入了解数据科学中*科学*与*修辞*相遇的细节。剧透警告:一个名为*好奇心驱动的学习*的研究领域正在实验认知心理学和机器学习行业用例的结合点上出现,特别是在游戏人工智能领域。这些工作为领导数据科学团队的实践提供了很多东西。现代主义者和结构主义者要小心了。我们还将看一下行业调查分析,它描述了组织在数据游戏中陷入困境的地方。总的来说,这些话题都是你可以期待的下一次 [Rev](https://rev.dominodatalab.com/?utm_source=blog&utm_medium=post&utm_campaign=) 的主题,到时见!
## 版本 2
我们一直在整理第二版的主题演讲和曲目,我对即将发布的内容感到非常兴奋。这一届会议将于 2019 年 5 月 23 日至 24 日在纽约举行,我们将重点关注作为团队运动的数据科学:领导力、最佳实践以及团队如何工作。例如,在整个规划阶段提供指导的一个问题是:“**数据科学团队可以互相学习什么?**
在 Rev 的第二版中,会议的规模扩大了一倍。我们将有*领导力*赛道、*实践者*赛道,加上 AMAs(知名专家“问我任何问题”)和*行业海报会议*。大多数读完研究生的人对“海报会议”这个短语的含义有所了解。换句话说,你的演讲不够突出,不足以登上舞台,但你仍然会因为演讲而获得“发表或毁灭”的学分。这个不是那个。参加 2017-2018 年 JupyterCon 的人可以证明,“行业海报会议”包括一个开放的酒吧、精心准备的开胃菜、大量的社交活动……套用 JupyterCon 的反馈,“作为一名技术人员,我会为了在早上 8:00 喝咖啡而早起去见陌生人吗?是啊,没那么多。但是,我会在下午 6:00 和对类似技术话题感兴趣的人聊天时享受一两杯啤酒吗?当然啦!!"一些供应商展示了他们的客户使用案例。一些开源项目分享了比他们在一次会议中所能分享的更多的细节。许多人变得非常有创意——就像 3 米长的“海报”占据了整个地板。在活动应该结束很久之后,酒店工作人员不得不将人们推出大厅。五月在纽约加入我们,在 [Rev 2](https://rev.dominodatalab.com/?utm_source=blog&utm_medium=post&utm_campaign=) 获得更多类似的体验。
我们的主题演讲人将是诺贝尔奖获得者、 *[《思考,快与慢](https://www.goodreads.com/book/show/11468377-thinking-fast-and-slow)* 》的作者[丹尼尔·卡内曼](https://scholar.princeton.edu/kahneman/home),他有重要的事情要和我们讨论,群体如何做出协作决策,特别是在人工智能的背景下。关于卡尼曼博士最近的一些工作,请看这篇*哈佛商业评论(HBR)* 文章,“[噪音:如何克服不一致决策的高隐藏成本](https://hbr.org/2016/10/noise)”他研究了团队决策中的偏见和噪音:“有判断的地方就有噪音——而且通常比你想象的要多。”最近有很多关于机器学习模型中的*偏差*的对话,尽管考虑等式中的*噪声*部分是一个重要的推论。
我们希望听到您对运营数据团队的见解和观点。请加入我们和其他团队,探索数据科学团队如何工作和协作!
## 好奇号不仅仅是一辆漫游者
在我们去年 11 月的“[数据科学与工程:真的必须这样吗](https://blog.dominodatalab.com/data-science-vs-engineering-tension-points/)”小组讨论中, [Primer AI](https://primer.ai/) 的 [Amy Heineike](https://twitter.com/aheineike/status/1060944102429097984) 将*好奇心*加上*学习心态*描述为成功数据科学家的核心特质:
如果你对自己所负责的事情有一个非常开阔的视野,如果你对很多难题都很好奇,并且在你看来,如果你对很多难题都有所有权…那么如果你的最终目标是“我想建造并发布一些有趣的东西”,那就会消除一些紧张。
此外:
我觉得每六个月我都会做一次总结,并意识到有很多新的东西我必须去学习,但我不知道如何去做。通常在关键时刻,你会说,“好吧。我得到了这个。”
说得好。
最近, [Stitch Fix](https://www.stitchfix.com/) 的 [Eric Colson](https://twitter.com/ericcolson) 更新了他在 HBR 发表的关于*好奇心*在数据科学中的作用的文章:“[让好奇心驱动:促进数据科学的创新](https://hbr.org/2018/11/curiosity-driven-data-science)”——外加 LinkedIn 上发布的[更细致入微的更新。请注意,Eric Colson 在 2018 年的](https://www.linkedin.com/pulse/let-curiosity-drive-fostering-innovation-data-science-eric-colson/) [Rev](https://dominodatalab.wistia.com/medias/5coquumqjn) 上展示了“[通过数据科学实现差异化”&这是今年 Rev 上您将听到的优质演讲的一个例子!](https://twitter.com/NatalieTelis/status/1002255804290908162)
在 *HBR* 的文章中,Eric 将*好奇心*描述为一种强大的推动力,推动着数据科学领域的探索——通常以自上而下的管理法令无法想象或指导的方式:
*…创新能力与其说是设计出来的,不如说是由数据科学家通过好奇心驱动的修补发现和揭示出来的。*
加上相关的一点:
他们是在浪费时间吗?不要!数据科学的修补通常伴随着探索价值的证据。
在这一点上,我忍住了引用和分析几乎所有 HBR 文章的冲动。
你需要读一下:)也就是说,有一句话需要强调:
洞察力和由此产生的能力往往如此不直观和/或深奥,以至于在没有证据支持的情况下,它们似乎不是对时间或资源的良好利用。
哼。一旦你注意到这句话相当好地描述了机器学习中的一个长期挑战(例如,[爬山](https://en.wikipedia.org/wiki/Hill_climbing) ) ( **线索#1** ),铃声和哨声就应该开始响起来了。此外,它帮助我们区分适合数据科学工作的过程和适合软件工程的过程,例如敏捷、看板等等。
## 阐明数据科学的流程
Eric 的文章描述了一种数据科学团队的过程方法,这与[敏捷](http://agilemanifesto.org/)过程的风险管理实践形成了鲜明的对比,例如。正如本文所解释的,数据科学与其他业务职能的区别在于两个基本方面:
* 勘探成本相对较低
* 衡量结果的能力(降低风险的证据)
这两点提供了一种不同的风险管理机制,对于科学,尤其是数据科学是有效的。
当然,商业中的一些问题是无法用历史数据来回答的。相反,它们需要投资、工具和时间来收集数据。鉴于以上两点,没关系——有好的方法将数据探索引向 ROI。
即便如此,还是有一个重要的警告——注意它在团队环境中的效果与早期理论人工智能中我们称之为 [A*搜索算法](https://ieeexplore.ieee.org/document/4082128)的惊人相似之处(**线索#2** ):
*凭借其低成本的探索和降低风险的证据,数据科学使得尝试更多的事情成为可能,从而带来更多的创新……但你不能仅仅作为一个组织宣布“我们也会这样做。”*
为了说明这一点,我在描述一个成功的组织必须实施的必要条件的文章中列举了四个要点:
1. 将数据科学定位为自己的实体—使其成为自己的部门,向首席执行官报告。
2. 为数据科学团队配备他们需要的技术资源*自主*:对数据的完全访问、计算资源的弹性使用(读作:云)。
3. 确保一种支持稳步学习和*实验*的文化。
4. 为数据科学团队提供一个 *[健壮的数据平台](https://algorithms-tour.stitchfix.com/#human-computation)* 。
正如艾米·海涅克所描述的,第三点与*的学习*相呼应,成为*好奇心*的伴侣。这需要团队文化,通过有效的管理、指导等等来培养。可以说,这就是数据科学领袖给聚会带来的东西。或者不是。
在我看来,第 4 点是许多组织倾向于动摇的地方,然后通过让他们的数据工程团队变得过时来进行过度补偿——实际上建立了更多的筒仓。最佳实践是投资构建一个强大的数据平台,为该平台配备适当的人员,然后让您的数据科学团队成长为期望提供*通才*角色的团队。这比分发*超专业的标题*,花费 5 倍的预算,却得到一半的回报要好得多。YMMV。
孤岛是数据科学成为一门学科的原因之一。“为什么企业组织会失败?”这个问题中,筒仓排在首位关于利用数据。对复杂性的过于人性化的反应——用划分和分类的冲动来回应。这就是数据科学,一个[固有的多学科领域](https://onlinelibrary.wiley.com/doi/abs/10.1111/j.1751-5823.2001.tb00477.x),提供利用协作、科学、计算能力、大规模数据等力量的解决方案的地方。**在多学科背景下探索的好奇心是筒仓反模式的解毒剂。**
根据我的经验,高度专业化往往会以一种特殊的方式渗透到更大的组织中……如果一家公司成立超过 10 年,他们可能已经开始与使用*数据仓库*的*商业智能*团队进行分析工作。由于成本、预算、会计程序等原因,这种方法可能会在部门之间产生数据孤岛。或许该公司希望在 2010 年之前引入更先进的技术,所以他们增加了一个*数据科学*团队,因为他们的 BI 人员不愿意升级到 NoSQL 工具、机器学习等领域。后来,这个团队分成了*数据科学*和*数据工程*团队,产品经理和运营团队的优先级没有明确的区分。摩擦随之而来。大约在 2015 年后,该公司通过引入更复杂的机器学习技术来跟随羊群;然而,由于数据科学团队已经被报告需求淹没,他们引入了一个新的*机器学习工程师团队*。到目前为止,我统计了整个组织中四个不同的团队和头衔。在更大的公司里,这种方法将会在每个部门重复*这样就有几个团队在内部竞争。他们的主管变成了敌人,争夺资源、人员、资金、关键项目、重大胜利等等。在这种情况下,为每个团队采用高度专业化的名字就变成了一种防御性的举措,否则 CEO 和 CFO 可能会介入并整合团队和预算。*
*与数据相关的职位的高度专业化是 CYA 公司的一个策略,以保护筒仓和避免技术升级的成本。然而,当你投资这些成本而不是回避它们时,通常会有更多的好处。**提供强大的数据平台,将数据科学团队推向通才角色,以及[提升技能](https://blog.dominodatalab.com/themes-conferences-per-pacoid-episode-5/)为高度专业化的头衔反模式创造鸡尾酒解毒剂。**
不可否认,我预见到在寻找“全栈”数据科学候选人的困难、企业中创建孤岛的倾向以及跨团队协调的成本之间会出现一些矛盾。
但是在你开始在你的公司实施之前,要知道在一家老公司实施这种方法是困难的,甚至是不可能的。
换句话说,商业领导是艰难的。全球竞争也是如此。第一点是许多组织都无法破解的难题。然而,寻找有效的案例研究。Stitch Fix 为如何运行高效的数据科学实践树立了典范。因此,请把那篇 *HBR 关于缝针的文章*作为商业案例研究的一部分,并作为另一个[重要部分的伴侣。](https://algorithms-tour.stitchfix.com/)
## 防镇压装置
我喜欢埃里克文章中的很多东西:
* 解开好奇心在数据科学中的角色。
* 好奇心是一种典型的企业反模式的解药:在缺乏叙事的情况下,人们根据手头的任何部分数据编造故事(阅读:神话),以满足眼前的利益(参见 Andrew Hinton (2014)的[理解背景](https://www.goodreads.com/book/show/23855288-understanding-context)中的第 2 章)。
* 通才是另一个典型的企业反模式的解毒剂:筒仓的扩散。
* 呼应 Amy 关于作为团队驱动者的所有权的观点。
* 韧性:“很难平息好奇心。”
那个反镇压的部分很精彩:
通过提供业务目标和广义角色的所有权,修补和探索成为角色的自然和流动的一部分。其实很难平息好奇心。即使有人明确禁止好奇号项目,数据科学家也只会偷偷摸摸地进行探索。痒一定要挠!
几年前,我在一家大型广告公司领导一个数据科学团队。我们建议对我们的点击流数据进行地理空间分析,以揭示可能有用的区域趋势。然而,该公司的高管回应道:“不,不要在地理空间工作上浪费宝贵的时间。我们以前试过,结果没有意义。”即便如此,*我们团队的好奇心也无法被平息*。经过大量的数据准备,lat/lon 和 [PAM 在](https://en.wikipedia.org/wiki/K-medoids) [Hadoop](https://hadoop.apache.org/) 和 [R](https://cran.r-project.org/) 的混合上聚集,我们产生了类似兴趣的大型集群(每个集群有> 10,000 人)。
我永远不会忘记大约集中在阿肯色州/俄克拉荷马州的最大群体:50 岁以上的男性,他们分享了对吊床、旗杆、海盐、邮购牛排、便携式发电机和 T2 除颤器的网购偏好。我赌你不敢想象那群人!(而且无论你做什么,请不要把这个分享给 Cambridge Analytica。)当公司的高管们染指我们的分析时,两名高级副总裁花了一整天的时间翻遍了一页页的数据可视化和分析。咯咯笑,运筹帷幄,最终感谢我们明目张胆的好奇行为。
## 国家之路
多想想好奇心…这是一种动物的品质,在科学史上扮演了如此重要的角色。最初,它也是工程教育的驱动力之一——也许是从一些意想不到的地方出现的?查看一下 Genevieve Bell 关于 [*下一个十亿秒*](ttps://nextbillionseconds.com/2017/12/14/episode-1-14-future-stories-series-finales-with-john-allsopp-genevieve-bell-and-andy-polaine/) 的讨论,关于工程教育是如何在[理工学院](https://nextbillionseconds.com/2017/12/14/episode-1-14-future-stories-series-finales-with-john-allsopp-genevieve-bell-and-andy-polaine/)建立的,以及它如何作为创造[西点](https://en.wikipedia.org/wiki/History_of_the_United_States_Military_Academy)的模式(完全披露:我参加了后者,并对早上 6:30 用四种颜色的粉笔进行的关于微积分的高度自律的论述有着美好的记忆,遵循了科尔模式)。
法国大革命后,领导人意识到神职人员控制了 18 世纪法国的道路系统,以及供养法国人口的供应链。因此,他们创建了理工学院来培训工程师,然后他们可以管理国家优先事项所需的道路和其他基础设施。在新成立的美国,西点军校与综合技术学院的教师一起开办,借用了他们的方法和许多意图。麻省理工学院、加州理工学院和其他机构后来使用这种模式来创建他们的工程项目。
在当前*数据科学*和*数据工程*之间的紧张关系中,我有一种预感,早期工程项目的好奇心——*同上*。美国西点军校早期的经验似乎缺乏。即便如此,更有效的组织已经想出了如何培养对数据科学的好奇心,并将其作为一种竞争优势。有点像是由神职人员控制一个国家的民用基础设施。考虑到为数据科学团队配备经验丰富的人才的*人才短缺*,对好奇心的关注也正在成为一个竞争优势。它创造了一个更受欢迎的工作环境。
因此,我认为“敏捷”和“精益”概念尤其不适合管理数据科学团队。这些软件工程过程的旧方法导致数据团队忽略机会,侵蚀组织的竞争优势,并强化我们试图首先消除的企业反模式。在我们为这一点建立基础时,请原谅我提出一个题外话。
## 为撞击做好准备
Bokay,我保证这部分 100%是关于数据科学的。首先,论点需要一些框架和背景,然后我们将有一个基础来探索为什么数据科学中的科学是不同的。以我的经验来看,实地考察之外的人对这方面的考察尤其多。这里有一些关于为什么他们这样做的争论,以及理解科学方面在工作场所是如此重要。
让时光倒流~65 年。文学、社论、讲座、杂志文章、电影等中的一系列辩论。发生在 20 世纪中叶,关于*媒体*和*言论*。本世纪中期媒体研究的后起之秀,[马歇尔·麦克卢汉](https://www.marshallmcluhan.com/),引入了一种有争议的*马赛克*写作方法,这代表了他对通过电子媒体(又名,我们现在称之为互联网)产生的一种不同的、更复杂的认知的看法,与图书出版和前电子文学文化形成对比。没有进入太多的细节,导致机械印刷的字母语言已经过滤和塑造了思想;依赖丰富口头传统的部落文化被改造成国家、货币经济等等。随后出现了电报、广播、电影、电视等。这混淆了几个世纪以来基于印刷文化的学习和思想——尤其是电视,它重新引入了口头文化的某些方面。该领域的另一颗新星肯尼斯·伯克引入了新修辞学的概念,与亚里士多德的旧修辞学形成对比。大约在《广告狂人》的时代,这个理论受到了争论,当时通过电子媒体进行大众说服的规则已经发生了巨大的变化。与此同时,美国大学“西方文明”项目的发明者理查德·兰哈姆(Richard Lanham,T13)正在系统阐述导致数字修辞描述的思想。尽管这三个人——麦克卢汉、伯克和兰哈姆——没有达成太多共识,但合在一起,他们在预见和阐明互联网普及后我们将面临的挑战方面做得非常出色。正如麦克卢汉所描述的,他非常担心一头冲进 21 世纪,同时受到 19 世纪机构的阻碍,这些机构陷入了 17 世纪的思维。就企业和政府的决策而言,这很适合我们今天的处境。
这就把我们带到了大约所有演示之母。在过去的五个世纪里,*媒体*的主导思想是书籍由*作者*创作,然后由*评论家*讨论,而普通大众作为*观众*扮演被动角色。从现代/世纪中叶的角度来看,*科学*——一门稍微年轻一点的学科,当时只有三百年的历史——是关于确定*事实*的。科学著作的作者应该避免使用亚里士多德式的修辞作为说服的工具,而是坚持积累知识。罚款规则 500 年,直到他们撞上一堵砖墙。20 世纪媒体技术的引入助长了世界大战,导致了核武器和 T21 战争,更不用说一场关于迫在眉睫的环境危机的全球辩论了。到了本世纪中叶,科学家们争先恐后地运用修辞来说服世界改变进程。伯克描述了科学和修辞之间的一种紧张关系,特别是在他 1966 年的著作 *[中将语言作为象征性的动作](https://www.goodreads.com/book/show/411011.Language_as_Symbolic_Action)* (参见“术语主义的屏幕”一章)。虽然科学确实积累了“事实”(阅读:本体论),但现实是人类通过故事来理解世界。换句话说,正如伯克所描述的,人们通过故事和使用新的修辞来学习——同上,上面提到的学习心态(**线索#3** )。
麦克卢汉推倒了作者、评论家和观众之间的墙,同时重新配置了印刷文本的“线性”本质。最好的例子是在他 1962 年的书 [*《古腾堡星系:印刷人的气质*](https://www.goodreads.com/book/show/440463.The_Gutenberg_Galaxy) 。如果没有这部杰作,超文本早就挂掉了。“马赛克”文学/设计方法(加上大量的实验,感谢 DARPA)打开了“多媒体”的大门,引领我们进入当代的数据故事、实践教程、协作框架等概念。总的来说,麦克卢汉对 Jupyter 笔记本的发展影响不亚于唐·克努特或史蒂夫·沃尔夫勒姆。
兰姆后来出现了,可以说是提供了伯克和麦克卢汉以及其他人的综合。他提出了关于数字修辞的概念,作为支撑网络媒体的理论。兰哈姆在 1995 年的文集[中的文章《电子世界:民主、技术和艺术](https://www.goodreads.com/book/show/126001.The_Electronic_Word)是一个很好的起点。[布兰达·劳雷尔](https://www.goodreads.com/book/show/17573567-computers-as-theatre)、[贝蒂·马伦科](https://www.researchgate.net/publication/264711716_Neo-Animism_and_Design_A_New_Paradigm_in_Object_Theory)和其他人已经将这个领域远远超越了兰哈姆。
如果你来自美国的一个技术背景,你可能没有从模糊的研究中得到太多的修辞学、诗学、美学、伦理学或其他“ics”方面的正规教育。或者你被告知古希腊人涵盖了所有这些东西,现在安全地藏在维基百科的某个地方。或者什么的。
我选择这条切线有两个原因。首先,有抱负的数据科学家应该好好阅读媒体研究。互动媒体在我们的工作中扮演着比单纯的演示或博客帖子更重要的角色。如果没有 GitHub 或 YouTube,数据科学会以多快的速度获得关注?如果没有互联网,大学要花多长时间来重组学术课程以纳入数据科学?在没有互联网加速的十年时间里,工业界怎么能雇佣一小群精通 Python、R 等语言的人呢?就此而言,数据科学的智力方面与麦克卢汉的马赛克有许多共同之处。所以有三本不寻常的书被推荐给你的阅读清单。
其次,因为*利益相关者*。利益相关方越来越依赖数据科学团队的成果..虽然作为个人,他们可能是金融、保险、制药、汽车或任何垂直领域的行业专家,但许多人仍然用 20 世纪 60 年代以前的观念经营*科学、修辞、媒体、*等。,并应用 17 世纪对数据的思考。我愿意拿一家大型对冲基金来赌这一点。许多人质疑数据科学中是否有任何“科学”,即使有,他们也不愿将分析与修辞工具混合在一起。我们称其中一些人为“执行官”,其他人为“董事会成员”……至少在大型企业中是这样。现在,他们突然被迫进入令人不安的决策过程,与数据科学团队分享判断,甚至与自动化(又名人工智能)分享一些判断。正如《[第四集](https://blog.dominodatalab.com/themes-conferences-per-pacoid-episode-4/)中提到的,这种脱节被 2019 年达沃斯论坛的 [WEF 确定为人工智能领域最关键的问题之一。](https://www.weforum.org/agenda/2019/01/three-things-i-learned-at-davos/)
Eric Colson 没有明确指出的另一点(所以把我放在这一点的责备名单上):实践,如敏捷、精益、看板等。可能适用于管理建筑工人或管理软件工程团队,就像他们是建筑工人一样。然而,这些实践对于管理科学并不有效。特别是在这种情况下,我们谈论的是一个从行业用例中产生的科学领域,而不是学术殿堂。考虑到前面提到的麦克卢汉、伯克、兰哈姆、劳雷尔、马伦科等人的工作,数据科学从一个决定性的 [*后现代状态*](https://en.wikipedia.org/wiki/Postmodernism) 中脱颖而出。对于在 1960 年前接受现代观念教育的决策者(和公司文化)来说,这绝对会吓坏他们的#^@$!
总的来说,这种情况造成了一辆缓慢行驶的火车残骸,其中数据科学处于列车员的座位上。为撞击做好准备。
## 把脉
企业中的影响点会在哪里?本·洛里卡和我最近完成了关于企业中“ABC”(人工智能、大数据、云)采用情况的第三次行业调查。关于第二次调查的免费迷你书《演进的数据基础设施》刚刚出版。
没有剧透,有一个来自我们第三次调查(尚未公布)的直方图,我觉得有必要描述一下。阻碍企业利用数据和采用人工智能技术的主要瓶颈依次是什么?
1. 公司文化还没有意识到这种需求。
2. 缺少数据或数据质量问题(筒仓)。
3. 数据科学和数据工程职位的人才短缺。
4. 难以确定合适的业务用例。
5. 技术基础设施挑战(技术债务)。
6. 法律问题、风险、合规性。
7. 有效训练 ML 模型的问题。
8. 缺乏可重复的工作流程。
前四项是企业中的主要障碍,在“最邪恶”排名中各占 20%左右。较低的三项处于相对邪恶的个位数范围内。另一个答案是**项#1** 的一个子集,应该是“BoD 没有得到它”——尽管我们没有及时了解到这一点并将其包含在调查问题中。参见前述部分。
奇怪的是,金融业在招聘所需人才方面往往没那么困难,而医疗保健业在识别业务用例方面往往没那么困难。高度管制的环境可能会造成一些扭曲。
从调查中得到一个有趣的收获:成熟的实践(在生产中部署 ML 超过 5 年经验的公司)在**项目#1** 公司文化或**项目#4** 确定业务用例方面不太困难。换句话说,在后的*解决这两个问题之前,一家公司不会有机会成为成熟的 ML 实践。*
总体而言,此列表描述了阻碍组织获得数据科学项目投资回报的因素。这与之前描述的基于好奇心和学习的过程正好相反。为什么这很重要?要切入正题,请回到文章结尾的“[第 2 集](https://blog.dominodatalab.com/themes-and-conferences-per-pacoid-episode-2/)”中一个名为“企业人工智能采用细分市场”的表格。
谈到数据实践,我们可以描述企业组织的三个部分:
* *独角兽*——凭借先发优势,侵蚀其他公司的垂直市场。
* *采纳者*–在生产中获得 ML 的经验和成熟实践。
* *落后者*——受困于公司文化、技术债务等。
落后细分市场中的公司需要 2-3 年的时间来实现其数据基础架构的转型。增加几个季度为团队配备人员,并让他们到位。再增加 18 个月左右的时间在生产中部署 ML 应用程序,以获得投资回报。我没有一个指标来估计改变公司文化所需的时间,因为这是我们所说的非常小的数据集。即使以很快的速度,如果你的公司今天落入了落后者的行列,也可能需要 5-8 年的时间来检查上面的 8 点列表。
不深究 J 曲线、GPT 等经济预测技术。,来自几个方向的证据指向大约 4-5 年后的前景,独角兽(以及加入它们的采纳者)在数据游戏中变得足够有效,足以压倒埋在科技债务和认知/文化斗争中的落后者。换句话说,对于许多组织来说,5-8 年将超过“游戏结束”的时间。
我们调查的另一个惊喜是:目前(2019 财年),前两大细分市场正在将大部分 IT 预算投入到更多的“ABC”采用中。一种解释是,他们已经发现了竞争优势的一个关键领域,他们正在进入必杀阶段。在很短的时间内,许多落后者可能没有足够的跑道来扭转局面。这不是厄运和黑暗,这是一种可能性,它可能会带来更好的市场效率。但是你不想站在历史错误的一边;你不希望你公司的墓志铭是上面列出的八项。查看调查了解更多详情:
* [“O ' Reilly 机器学习采用调查公司应该知道的 5 个发现”](https://www.oreilly.com/ideas/5-findings-from-oreilly-machine-learning-adoption-survey-companies-should-know)
* [“公司如何构建可持续的人工智能和人工智能计划”](https://www.oreilly.com/ideas/how-companies-are-building-sustainable-ai-and-ml-initiatives)
## 关于学习的学习
你可能已经注意到了这篇文章中的几个要点。最后,我们弹出足够的堆栈,以达到我写“第 6 集”的动机。读到埃里克·科尔森关于*好奇心*的文章,我非常兴奋,特别是因为我最近一直在研究人工智能中的*好奇心驱动的学习*。事实证明,婴儿似乎有内在的学习动机。这项认知心理学的研究通过对婴儿的研究获得了大量的实验证据。现在,它得到了游戏中人工智能用例的实证推动。以下是一些需要检查的关键文件:
* [“好奇心驱动学习的计算理论”](https://arxiv.org/abs/1802.10546)
Pierre-Yves Oudeyer (2018)
* [婴儿基于好奇心的学习:神经计算方法](https://onlinelibrary.wiley.com/doi/full/10.1111/desc.12629)
Katherine two mey,Gert Westermann (2017)
* [“好奇心驱动学习的大规模研究”](https://pathak22.github.io/large-scale-curiosity/)
尤里·布尔达等(2019)
* [“进步驱动假说:对早期模仿的一种解释”](http://pyoudeyer.com/kaplan-05a.pdf)
弗雷德里克·卡普兰,皮埃尔-伊夫·欧代尔(2007)
这里有太多的概念需要描述,从*进步驱动到自由能源原理到环境复杂性*。Oudeyer 和 Twomey 分别描述了好奇心驱动的探索过程,该过程与 A*搜索和梯度下降的启发式优化相似。你需要看报纸。简而言之,婴儿寻求学习新技能的挑战,这些挑战既不太难,也不太容易。好奇心是驱动和调节学习的机制。在能够通过交流获得帮助之前,这些是婴儿能够与挑战斗争的内在过程。实际上,婴儿正在构建一个梯度,以最大限度地增加关于内部世界模型的学习机会。
领导数据科学团队的实践可以从好奇心驱动的学习中学到很多东西。我们经常在没有太多先例的挑战中挣扎,没有外部的交流资源可以简单地引导我们找到一个方便的解决方案。相反,这是一个应用科学的过程。Eric 的上述风险管理过程也被好奇心驱动学习的多位研究人员勾勒出来。
好奇心驱动的学习及其与数据科学工作的关系的研究还产生了其他影响。其中一些更具有教育意义。例如,在一个来自明显后现代起源的多学科实践中,经院哲学可能是一个非常糟糕的提升人们技能的方法。即便如此,我还是忍不住注意到在一些数据科学训练营、MOOCs、edtech 等中存在大量的学术方法。我也有一种预感,取代了大学经院哲学的人文主义,是一个特别糟糕的参考框架,用来教授人们包括人工智能和自动化在内的协作决策。完全披露:我来自一个[不同的弯](https://www.researchgate.net/publication/264711716_Neo-Animism_and_Design_A_New_Paradigm_in_Object_Theory),并倾向于投下谨慎的侧视过度使用人文主义。对于 deets,请查看蒂姆·英戈尔德的“[重新思考动画,重新制作动画的想法](https://www.researchgate.net/publication/240532829_Rethinking_the_Animate_Re-Animating_Thought):
然而,所有的科学都依赖于观察,而所有的观察都依赖于参与——也就是说,依赖于观察者和世界上那些关注焦点之间在感知和行动上的紧密结合。如果科学要成为一种连贯的知识实践,它必须重建在开放而不是封闭、参与而不是脱离的基础上。这意味着重新获得惊讶的感觉,这种感觉在当代科学工作中是如此明显。认识必须与存在重新连接,认识论必须与本体论重新连接,思想必须与生活重新连接。因此,我们对土著万物有灵论的反思导致我们提出重新激活我们自己的,所谓的“西方”思想传统。
好奇心、科学、学习、万物有灵论、认知——所有这些都融入了一个美丽的后结构表达。<3 <3 <3
不管怎样,好奇心驱动的学习有启发式模型,现在已经被实验证实了。此外,这些模型正在通过使用神经网络进行模拟。这项工作还被用来改善游戏中的强化学习,以便模型可以更有效地推广 T3。这是认知心理学和机器学习的一个超级有趣的交叉,其中一个学科可以帮助增强另一个学科。另外,它指向数据科学的过程。
那有多酷?
在导致机器学习不同领域的 7 个领域中,神经网络部分源于生物学和认知心理学的交叉。一位名叫温贝托·马图拉纳的研究生是麻省理工学院麦卡洛克-皮茨团队的成员,该团队开创了人工神经网络研究。马图拉纳后来因在控制论和控制系统中为*认知*水平引入定义(**线索#4** )而闻名,即 *[自动生成](https://www.goodreads.com/book/show/695442.Autopoiesis_and_Cognition)。在我看来,20 世纪中期的许多二阶控制论工作为人工智能的发展创造了蓝图,这正是我们现在正在接近的。*
综合以上各点,你会强烈地感觉到埃里克·科尔森和艾米·海涅克正在勾勒出实用人工智能的轮廓,这些人工智能被应用为人+机器团队的**过程**。数据科学工作需要敏捷的必然结果:不同种类的风险管理、反馈循环、治理的内在机制——敏捷过程为软件工程提供的“所有东西”,尽管它更适合异常的后结构科学分支。此外,这个新兴流程的草图是基于该领域中有效的数据科学实践。
期待听到更多关于实验心理学和机器学习的融合。马歇尔·麦克卢汉会非常好奇的想了解更多。同时,为数据科学团队寻找利用好奇心和内在动机的机会。与此相反的可能是有效的数据科学工作的反面,并且风险很高。*
# 跳出框框思考(和象限)
> 原文:<https://www.dominodatalab.com/blog/thinking-outside-the-box-and-quadrant-where-domino-is-focused-within-the-noisy-and-crowded-data-science-landscape>
本周,Gartner 发布了他们最新的数据科学和机器学习(DSML)平台魔力象限。与此同时,Forrester 有两个独立的预测分析和机器学习(PAML)平台浪潮——一个是基于的笔记本电脑,一个是 [多模态](https://www.forrester.com/report/The+Forrester+Wave+Multimodal+Predictive+Analytics+And+Machine+Learning+Q3+2020/-/E-RES157465)——加上第三个新浪潮是面向 [自动化的机器学习解决方案](https://www.forrester.com/report/The+Forrester+New+Wave+AutomationFocused+Machine+Learning+Solutions+Q2+2019/-/E-RES143845) 。而马特图尔克的 [2020 年数据& AI Landscape](https://mattturck.com/data2020/) 列出了数十个子类别的数百家公司。
从所有这些分析中最清楚和一致的是,关于如何定义空间以及哪些供应商满足哪些需求,这一点并不清楚和一致。在这种背景下,我们希望阐明我们在 Domino 看到的市场需求,以及我们专注于为客户解决的问题。
## 简而言之:我们的重点是帮助拥有大型“代码优先”数据科学家团队的企业。
我们相信拥有大型代码优先数据科学团队的企业对世界上最重要的挑战有着最大的影响。企业具有巨大的、通常是全球性的影响。如果一家公司已经发展了一个相当大的数据科学团队,这表明他们认为数据科学对他们的业务具有战略性和重要性。否则他们为什么要在数据科学上进行如此大的投资?虽然“公民数据科学家”对于某些问题来说肯定是有价值的,但根据我们的经验,代码优先的数据科学家(即主要使用统计编程语言的人)提供了最大的价值,并提供了最具创新性的关键任务数据科学工作。
过去的一年为我们提供了强有力的证明,即拥有代码第一的数据科学家的企业创造了巨大的价值。我们很幸运,我们的客户中有许多制药和医疗保健公司。在这个关键时刻,能够帮助他们加快工作进度是一种荣幸。
鉴于其规模和复杂性,这些组织中的数据科学团队面临着独特的挑战。支持他们不仅仅是提供算法或基础设施,让一个数据科学家训练和部署一个模型。也不仅仅是支持更大的数据量或加快 ETL 任务。这些企业面临的问题是*将数据科学作为一门学科*-跨越人员、流程和基础架构。这些是我们正在用 Domino 解决的问题。以下是其中的三个:
1. **平衡基础设施灵活性与 IT 治理。**所有数据科学家都受益于访问强大的计算资源,并能够试验新的开源工具和软件包。在企业中,提供这种敏捷性是一项挑战,因为数据科学家分布在不同的部门,并使用各种分析堆栈:例如,R、Python,甚至 SAS 或 MATLAB。这增加了 IT 组织的支持负担、支持成本以及运营和安全风险。不幸的是,企业在两个糟糕的选择之间进退两难:限制数据科学家的灵活性,或者冒“不受控制”的数据科学的风险。
Domino 通过一个独特的“开放”架构解决了这个问题,该架构允许企业在中央基础设施上整合多种工具(例如,RStudio、SAS、Jupyter、MATLAB ),这些工具可以基于弹性、可伸缩的计算,并由 it 进行管理和治理。这为数据科学家创造了自助式、受监管的沙箱。
2. **消除孤立的工作。**在任何大型研究机构中,协作和知识管理都是至关重要的——发掘新想法和突破性见解,并通过让人们在过去工作的基础上工作而不是重新发明轮子来节省他们的时间。跟踪数据科学过程中产生的工作和知识是棘手的,传统的知识管理工具(wikis 或源代码控制)不起作用。
Domino 通过自动跟踪工作的独特功能解决了这个问题,使工作完全可重现、可搜索和可发现。
3. **提供企业基础设施和安全性。**数据科学工作需要强大的计算资源、对高价值数据的访问以及核心知识产权的开发。因此,数据科学平台受制于企业内最复杂的 IT 和安全要求。
我们投入巨资支持最严格、最复杂的 IT/安全要求。结果,Domino 被世界上一些最有安全意识的复杂 IT 组织所接受。
我们认为,这些是阻碍数据科学应对全球最重要挑战的一些最大障碍。这些问题中有许多并不性感——但它们很难,而且很有价值。
我们也知道,并非每个人都同意我们的观点,即这些是需要解决的重要和有价值的问题。这一领域的许多其他供应商专注于不同的问题。一些分析师对 Domino 持批评态度,因为我们关注企业中大型的代码优先数据科学家团队。
从我们的角度来看,我们知道我们正在为企业创造大量的价值。洛克希德·马丁公司就是一个很好的例子。当他们想要集中访问数据科学工具、简化协作和知识共享、自动化开发运维任务以提高数据科学家的工作效率时,他们转向了 Domino。如今,他们将[2000 万美元的年度成本节约](https://www.dominodatalab.com/customers/lockheed-martin/)归功于他们对我们平台的使用,这得益于 IT 成本的降低、入职效率的提高以及数据科学家工作效率的 10 倍提升。
我们坚定不移地致力于帮助企业加速大规模的代码优先数据科学。这种专注为我们的业务带来了回报:超过 20%的《财富 100 强》公司使用 Domino 来开发、部署、监控和管理数百甚至数千种模型,从而击败竞争对手、颠覆行业并推动前所未有的增长。我们期待在未来几年为更多公司加速数据科学的发展。
# 三个简单的令人担忧的统计问题
> 原文:<https://www.dominodatalab.com/blog/three-simple-worrying-stats-problems>
*在这篇客座博文中,[肖恩·欧文](https://www.linkedin.com/in/srowen/)写了三种提供模糊结果的数据情况,以及因果关系如何帮助澄清数据的解释。这个帖子的[版本之前出现在 Quora](https://www.quora.com/What-are-some-common-statistical-sins-inexperienced-data-scientists-make/answer/Sean-Owen#) 上。Domino 要特别感谢 [Sean](https://twitter.com/sean_r_owen) 为我们的博客更新 Quora 帖子,并增加了一个 [Domino 项目](https://trial.dominodatalab.com/u/srowen/causation/view/main.R)。*
## 相关性与因果性
相关性不是因果关系。仅仅因为冰淇淋和防晒霜的销量一起上升和下降并不意味着一个导致另一个。然而,作为人类,我们思考因果关系。你可能已经意识到两者的销售都是由夏季炎热晴朗的天气造成的。那么,因果关系的作用是什么?
一个新的数据科学家可能会有这样的印象,因果关系是一个应该避免的话题。这将是一个错误。我们使用数据来决定诸如“哪个广告会引起更多点击?”有一个由简单、开放的工具组成的生态系统,可以从数据中创建模型,这些模型感觉像是在回答关于因果的问题。他们什么时候真的这样做了,我们什么时候被骗去认为他们这样做了?
数据所能表达的和我们认为的数据所表达的之间的细微差距是混乱和错误的来源。配备了强大建模工具的新[公民数据科学家](https://www.dominodatalab.com/blog/shattering-the-myth-of-the-citizen-data-scientist),可能成为甚至简单分析中“未知的未知”的受害者。
令人担忧!作为一项公共服务,本帖将举例说明三种看似简单的数据情况,它们会产生令人惊讶的模糊结果。剧透:在所有情况下,因果关系是澄清数据解释的基本要素。事实上,有很多令人兴奋的工具,包括概率图形模型和“do-calculus ”,让我们一起思考因果关系和数据,以获得强有力的结论。
## 两条“最佳拟合”线
考虑内置在 [R](https://www.r-project.org/) 中的`cars`数据集。这是一个小而简单的数据集,给出了汽车以不同速度行驶时的停车距离。为了便于讨论,假设两者之间的关系在低速时是线性的:一辆车以两倍的速度行驶,需要两倍的时间停下来。
没有什么比应用线性回归找到表达速度和停车距离之间的线性关系的最佳拟合线更简单的了,对吗?只需将距离作为速度的函数进行回归(注意坐标轴)。
![regress distance as a function of speed](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2045ecc5e6df83a90487c4fd778ac5f2.png)
同样,人们可以说,一辆车花了两倍的时间停下来,它的速度也是两倍,并且速度可以作为距离的函数回归。
![regress speed as a function of distance](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e0411fe2e2d951cabc6a73298fe35932.png)
尽管似乎是同一件事的两种说法,但这两种回归将给出不同的最佳拟合线。两者不可能都是最好的。哪个最好,为什么?
要在家跟进,请随意查看并运行创建这些图的代码,可在[这个共享项目中获得。](https://trial.dominodatalab.com/u/srowen/causation/view/main.R)
## 两种最佳疗法
下面的数据集可能看起来很熟悉。它显示了两种肾结石治疗方法的成功率,分为两组病人:一组是小肾结石,一组是大肾结石。你可能会注意到一些奇怪的记录。总的来说,治疗 B 显然更成功。然而,A 疗法对小肾结石更为有效。对其他人来说也更成功。怎么会这样呢?你自己把这些数字加起来。
许多人会马上意识到这是辛普森悖论的一个经典例子。(这个例子来自维基百科。)认识到这一点很重要。然而,承认它并没有回答真正的问题:哪种治疗方法更好?
这个问题现在值得回答,因为在辛普森悖论中有一个更深层次的问题。在这里,A 治疗更好。较大的肾结石更难治疗,总体成功率较低。治疗 A 更经常地给予这些较难的病例。它实际上表现得更好,但总体成功率更低,因为它适用于更难的案件。结石大小是一个混杂变量,表格的行控制结石大小。那么,为了避免这种悖论,总是这样控制所有变量是对的吗?
考虑以下数据:![Treatment A/B of kidney stone data by blood pH](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2bc41fd208f7cc78806b61b3a1d5e842.png)这是相同的数据,但现在它被治疗后患者血液的 pH(酸度)分解。根据这个数据,哪种治疗更好?如果不一样,为什么?
## 幻象相关
最后,考虑一下 r 内置的公共数据集`mtcars`,它给出了 20 世纪 70 年代早期几款汽车的统计数据,比如发动机尺寸、燃油效率、气缸数等等。考虑`drat`(轴比)和`carb`(化油器数量-喷油器的旧版本)之间的关系。
![phantom correlation graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/656015270312265259308c9a121677fa.png)
几乎没有相关性(r=-0.09)。这是显而易见的,因为变速器设计和发动机设计是相当正交的。(不可否认,这不是最直观的例子,但从简单的内置数据集来看,这是最显而易见的例子。)
然而,只考虑 6 缸和 8 缸发动机的汽车:
![correlations of cars with 6 & 8 cylinder engines](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0622ed8fd118445cb537ce39565ab9d4.png)
有明显的正相关性(r=0.52)。其他的车呢?
![correlations with broad car data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f0f494c9017b1a4fdcabafecbb8ec393.png)
也有正相关,尽管很小(r=0.22)。两个变量如何在部分数据中相关,在其余数据中相关,但在整体上不相关?
## 因果关系的答案
当然,答案是有的。在第一个例子中,两条不同的线来自两组不同的假设。回归`dist ~` 速度意味着距离是速度加上高斯噪声的线性函数,并且该线使实际距离和预测距离之间的平方误差最小化。另一种方法是最小化实际速度和预测速度之间的平方误差。前者对应的是速度导致停车距离的假设,有道理;后者暗示距离导致汽车的速度,这是荒谬的。从 `dist ~ speed` 引出的线是正确的最佳拟合线。然而,做出这样的决定需要诉诸数据本身之外的信息。
速度导致距离的简单想法可以绘制成(非常简单的)有向图:
![speed pointing to distance diagram](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fce3c2374a7e3d1fb0036aed087833b0.png)
同样,在第二个辛普森悖论的例子中,血液 pH 不再是一个混杂因素,而是一个中介因素。它并不引起治疗方法的选择,而是由治疗方法的选择引起的。控制它会消除治疗的主要效果。在这种情况下,治疗 B 似乎更好,因为它降低了血液 pH 值,导致更好的结果(尽管治疗 A 似乎确实有一些积极的副作用)。
也就是说,尽管原始场景是:
![size pointing to treatment and outcome, treatment pointing to outcome](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/eb89cfd1d582d01fd4bb5e3f793dcb0b.png)
...第二种情况是:
![treatment pointing to pH and outcome and pH pointing to outcome](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/76df31f88ffe134aab183693919ac033.png)
这里的“悖论”同样是可以解决的。在这两种情况下,关于因果关系的外部信息解决了这个问题——而且解决的方式不同!
第三个例子是伯克森悖论的一个实例。轴比和化油器不相关的结论是正确的,假设这两个因素实际上影响汽车的气缸数量。*(这个例子延伸到这里,但是为了便于讨论,假设这是发动机设计的真实情况!)*对气缸的控制创建了一个没有关联的关系,因为气缸的数量是一个关于轴比和化油器的“冲突”变量:
![Axle Ratio and Carburetors pointing to Cylinders](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c2f4b0388d81d4955cf0845bf8d8b6fc.png)
同样,数据并没有告诉我们这一点;变量之间因果关系的知识允许这些结论。
## 概率图形模型和 do 演算
画上面的图是有目的的,通常称为[概率图形模型](https://en.wikipedia.org/wiki/Graphical_model) (PGMs)。这些图表表达了因因果关系而产生的条件概率依赖性。虽然在这些情况下相当琐碎,但它们可以迅速变得复杂。然而,可以通过分析图表来检测上述变量之间的相同类型的关系,这是正确分析数据所必需的。
PGM 是一个有趣的话题。(Coursera 在这个问题上有达芙妮·柯勒的一整套课程。)了解因果关系的重要性以及如何分析因果关系以正确解读数据是数据科学家旅程中的重要一步。
这种类型的分析可能会产生更令人兴奋的能力。如果一个变量取了不同的值,有可能会发生什么。这个想法听起来像是条件概率:鉴于今天冰淇淋销量很高(IC),防晒霜销量很高(ST)的概率是多少?也就是什么是[latex]P(IC | ST)[/latex]?这很容易从一组数据中找到答案。如果这些是正相关的,我们会进一步预期[latex]P(IC | ST) > P(IC)[/latex] -也就是说,当防晒霜的销量高时,冰淇淋的销量更可能高。
然而,如果我们增加防晒霜的销量,冰淇淋的销量会增加吗?很明显,[latex]P(IC) | do(ST)[/latex]和[latex]P(IC | ST)[/latex]不是一回事,因为我们不希望这两者之间有任何因果联系。
数据只提供简单的条件概率。有没有可能评估数据中没有发生的事情的反事实概率来评估这些关于做的陈述?
令人高兴和惊讶的例子是,是的,这是可能的,借助于因果模型和多年前由朱迪亚·珀尔倡导的“微积分”,以及现在他的新书的主题,“[为什么之书](http://bayes.cs.ucla.edu/WHY/)”作为因果思维、贝叶斯网络、图形模型和珀尔自己对该领域的重大贡献的历史总结,它是非常值得推荐的。
也许这种演算最令人信服的证明是这本书对最终得出吸烟致癌结论的研究的追溯分析。正如 Pearl 所说,关于吸烟是否通过肺部焦油积累导致癌症,或者是否有一种未知的遗传因素导致了吸烟和肺癌,还存在一些问题。不幸的是,这种遗传因素是不可观察的,也不可能控制的。通过绘制隐含的因果模型,现在很容易对此进行推理。
![Cycle of smoking and cancer correlations to genetic factors and tar](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/17ba23ea1b9e6a7faf38b57ed898287a.png)
即使没有解决遗传因素是否存在的问题,是否有可能回答诸如“吸烟会导致癌症吗?”[乳胶]是 P(癌| do(吸烟))> P(癌)[/乳胶]吗?
不用细说细节,最好留给论文和书,只要说应用三个简单的“做演算”规则就可以了。它看起来像这样,最后只涉及关于吸烟、焦油和癌症的条件概率陈述,所有这些都可以从现实生活的数据集中获得:
![conditional probability statements about smoking, tar, and cancer written as a formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a90470fcef123578c8627412ae54fad5.png)
仅仅通过从数据中读取条件概率,就有可能知道吸烟是否导致癌症风险增加,即使不知道是否存在未知的混杂因素。
## 结论
这位经验丰富的数据科学家不仅知道如何将工具作为黑盒来使用。她知道对模型和数据的正确解释往往是模棱两可的,甚至是违反直觉的。避免常见的陷阱是经验丰富的从业者的标志。
幸运的是,这些悖论中的许多都自行解决了,并源于几个简单的共同来源,这些来源可以通过对因果关系网络的推理来分析。概率图形模型和统计方法一样重要。
与 do-calculus 一起,这些工具允许从数据中进行解释和分析,坦率地说,这些数据对于那些习惯于相信因果或反事实结论不可能仅来自数据的人来说是惊人的!
# 含 R 的时间序列
> 原文:<https://www.dominodatalab.com/blog/time-series-with-r>
*本文深入探讨多变量和单变量时间序列数据的分析方法。一个互补的[多米诺骨牌项目](https://try.dominodatalab.com/u/domino-johnjoo/time_series_autocorrelation/overview)是可用的。*
## 介绍
进行探索性分析并从数据中提取有意义的见解是研究和数据科学工作的核心组成部分。时间序列数据是经常遇到的。我们在处理日志数据、财务数据、交易数据以及测量真实工程系统中的任何东西时都会看到它。然而,因为上一个事件影响当前事件,并且事件的顺序很重要,所以与简单的回归或分类机器学习算法相比,我们有义务使用更专业的工具。为了支持数据科学家提取见解并加速他们的工作,Domino 联系了 Addison-Wesley Professional (AWP)以获得适当的权限,从《面向所有人的高级分析和图形,第二版 一书中摘录“时间序列和自相关”一章。AWP 提供了摘录作品的许可,并使我们能够提供一个[补充多米诺骨牌项目](https://try.dominodatalab.com/u/domino-johnjoo/time_series_autocorrelation/overview)。
![Domino Data Lab Enterprise MLOPs workspace](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0dae31e6c92c6cdef2e6a1f5cf794a80.png)
![Domino Data Lab Enterprise MLOPs time series project](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f7a3a7444d00955b7e2fb1f36e61ac15.png)
## 第一章介绍:时间序列和自相关
统计学的很大一部分,尤其是金融和计量经济学数据,是分析时间序列,即随时间自相关的数据。也就是说,一个观察依赖于先前的观察,并且顺序很重要。需要特别注意考虑这种依赖性。r 有许多内置的函数和软件包,使得处理时间序列更加容易。
## 24.1 自回归移动平均线
拟合时间序列模型的最常见方法之一是使用自回归(AR)、移动平均(MA)或两者(ARMA)。这些模型在 R 中得到了很好的表现,并且非常容易使用。ARMA(p,q)的公式是
![Autoregressive moving average formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/83e43d2ad7490f98e14331c548160add.png)
(24.1)
![Autoregressive moving average formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e7a881d625347978e7d015d29ee7ef56.png)
(24.2)
是白噪声,本质上是随机数据。
AR 模型可以被认为是时间序列的当前值对以前值的线性回归。类似地,MA 模型是时间序列的当前值对当前和先前残差的线性回归。
举例来说,我们将利用世界银行 API 来下载一些国家从 1960 年到 2011 年的国内生产总值(GDP)。
```py
# load the World Bank API package
> library(WDI)
> # pull the data
> gdp <- WDI(country=c("US", "CA", "GB", "DE", "CN", "JP", "SG", "IL"), indicator=c("NY.GDP.PCAP.CD", "NY.GDP.MKTP.CD"), start=1960, end=2011) >
# give it good names
> names(gdp) <- c("iso2c", "Country", "Year", "PerCapGDP", "GDP")
```
下载后,我们可以检查数据,这些数据以长国家年格式存储,图 24.1a 显示了人均 GDP。图 24.1b 显示了绝对 GDP,说明虽然中国的 GDP 在过去十年中大幅增长,但其人均 GDP 仅略有增加。
```py
> head(gdp)
```
![GDP data first 5 rows](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fbf7d553011388846786e1936172a8a6.png)
```py
> library(ggplot2)
library(scales)
> # per capita GDP
> ggplot(gdp, aes(Year, GDP, color=Country, linetype=Country))
+ geom_line() + scale_y_continuous(label=dollar)
>
> library(useful)
> # absolute GDP
> ggplot(gdp, aes(Year, GDP, color=Country, linetype=Country)) +
+ geom_line() + scale_y_continuous(label=multiple_format(extra=dollar,
+ multiple="M"))
```
![Per capita GDP and absolute GDP in millions](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c231fa46a9bf52fd8bd442b9daa5dc0a.png)
首先,我们将只查看一个时间序列,因此我们提取美国的数据。
```py
> # get US data
> us <- gdp$PerCapGDP[gdp$Country == "United States"] > # convert it to a time series
> us <- ts(us, start=min(gdp$Year), end=max(gdp$Year)) > us
```
![Time series 1960-2011 data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9aaee6751afa600ca68ade804c9d95bd.png)
```py
> plot(us, ylab="Per Capita GDP", xlab="Year")
```
![Time series plot of US per capita GDP](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ec6f627f868fa4326e9a9aa692231b30.png) Figure 24.2 Time series plot of US per capita GDP.
另一种评估时间序列的方法是查看它的自协方差函数(ACF)和部分自协方差函数(PACF)。在 R 中,这是通过适当命名的`acf`和`pacf`函数来完成的。
ACF 显示了时间序列与其自身滞后的相关性。也就是说,how
much 时间序列在一个滞后、两个滞后、三个滞后等情况下与自身相关。
PACF 稍微复杂一点。滞后一的自相关会对滞后二及以后的自相关产生延迟效应。部分自相关是时间序列和它本身的滞后之间的相关量,它不能用以前的滞后来解释。所以,滞后二的偏相关是时间序列和第二个滞后之间的相关,第一个滞后不能解释这个相关。
美国人均 GDP 数据的 ACF 和 PACF 如图 24.3 所示。延伸到水平线之外的垂直线表示自相关和部分自相关,它们在那些滞后处是显著的。
```py
> acf(us)
> pacf(us)
```
![ACF and PACF of US per capita GDP. These plots are indicative of a time series that is not stationary](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/31b312f209816f03b3671fa23e695324.png) Figure 24.3 ACF and PACF of US per capita GDP. These plots are indicative of a time series that is not stationary.
这个时间序列需要一些转换才能被正确地建模。它的上升趋势表明它不是稳定的 1(数据以当前美元计算,因此通货膨胀不是原因)。[注:平稳要求时间序列的均值和方差在整个序列中保持不变。]这可以通过对级数求导或应用其他变换来解决。差分是从一个观测值中减去另一个观测值的过程,可以对任意数量的观测值进行差分。例如,我们从一系列开始
![array with integers](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e5f8347e74295a9a7b20c2297b038a7c.png)
不同的产量
![x(1) = [3 4 -6 4 0 -1 -2]](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0b1046e1f55edb609ccd5d7daab9d52d.png)
这是连续元素之间的差异。两次迭代微分微分,所以
![x(1) = 3 4 -6 4 0 -1 -2]](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c5adb191edafad0525ce7048ca564110.png)
请注意,对于每一级差分,序列中的元素会减少一个。在 R 中这样做涉及到`diff`函数。`differences`参数控制迭代计算多少个差值。滞后决定了哪些元素相互相减。滞后 1 减去连续的元素,而滞后 2 减去彼此相距两个索引的元素。
```py
> x <- c(1 , 4 , 8 , 2 , 6 , 6 , 5, 3) >
# one diff
> diff(x, differences=1)
```
```py
[1] 3 4-6 4 0-1-2
> # two iterative diffs
> diff(x, differences=2)
[1] 1 -10 10 -4 -1 -1
> # equivalent to one diff
> diff(x, lag=1)
[1] 3 4-6 4 0-1-2
> # diff elements that are two indices apart
> diff(x, lag=2)
[1] 7-2-2 4-1-3
```
计算出正确的差异数可能是一个令人厌倦的过程。幸运的是,`forecast`包有许多函数可以使处理时间序列数据变得更容易,包括确定最佳差值数。结果如图 24.4 所示。
```py
> library(forecast)
> ndiffs(x=us)
```
```py
[1] 2
> plot(diff(us, 2))
```
![Plot of the US per capita GDP diffed twice.](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/df0542c363be10a04403d77d4b382efc.png) Figure 24.4 Plot of the US per capita GDP diffed twice.
虽然 R 提供了单独的`ar`和`ma`函数,但更好的选择是`arima`函数,它既适合 AR 和 MA 模型,也适合组合的 ARMA 模型。它甚至更稳健,因为它可以区分系列和适应季节影响。传统上,通过分析 ACF 和 PACF 来确定模型中每个组件的正确顺序。这可能是非常主观的,所以幸运的是`forecast`包含了`auto.arima`,它将计算出最佳规范。
```py
> usBest <- auto.arima(x=us)
> usBest
```
```py
Series:
ARIMA(2,2,1)
Coefficients:
ar1 ar2 ma1
0.4181 -0.2567 -0.8102
s.e. 0.1632 0.1486 0.1111
sigma^2 estimated as 286942: log likelihood=-384.05
AIC=776.1 AICc=776.99 BIC=783.75
```
该函数确定具有两个差的 ARMA(2,1)(AR(2)分量和 MA(1)分量)是基于最小 AICC 的最佳模型(即,被“校正”以对模型复杂性给予更大惩罚的 AIC)。这两个差异实际上使这成为一个 ARIMA 模型,而不是一个 ARMA 模型,其中 I 代表积分。如果这个模型非常适合,那么残差应该类似于白噪声。
![ACF and PACF plots for the residuals of ideal model chosen by auto.arima](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9edeb92b47aa5206be5b576fd356b655.png) Figure 24.5 ACF and PACF plots for the residuals of ideal model chosen by auto.arima.
图 24.5 显示了理想模型残差的 ACF 和 PACF。它们类似于白噪声的模式,证实了我们的模型选择。
```py
> acf(usBest$residuals)
> pacf(usBest$residuals)
```
ARIMA 模型的系数是 AR 和 MA 分量。
```py
> coef(usBest)
```
```py
ar1 ar2 ma1
0.4181109 -0.2567494 -0.8102419
```
使用`predict<c/ode> function.`基于 ARIMA 模型进行预测与任何其他模型类型非常相似
```py
> # predict 5 years into the future and include the standard error
> predict(usBest, n.ahead=5, se.fit=TRUE)
```
```py
$pred
Time Series:
Start = 2012
End = 2016
Frequency = 1
[1] 49292.41 50289.69 51292.41 52344.45 53415.70
$se
Time Series:
Start = 2012
End = 2016
Frequency = 1
[1] 535.6701 1014.2773 1397.6158 1731.1312 2063.2010
```
可视化这是很容易的,但使用预测功能使它更容易,如图 24.6 所示。
```py
> # make a prediction for 5 years out
> theForecast
<- forecast(object=usBest, h=5) >
# plot it
> plot(theForecast)
```
![Five year prediction of US GDP. The think line is the point estimate and the shaded regions represent the confidence intervals](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/da0fb424677a9d8fe0ed787e6c1fc97f.png) Figure 24.6 Five year prediction of US GDP. The think line is the point estimate and the shaded regions represent the confidence intervals.
## 24.2 VAR
当处理多个时间序列时,每个时间序列都依赖于自己的过去、他人的过去和他人的现在,事情变得更加复杂。我们要做的第一件事是将所有的 GDP 数据转换成多元时间序列。为此,我们首先将`data.frame`转换为宽格式,然后调用`ts`进行转换。结果如图 24.7 所示。
```py
> # load reshape2
> library(reshape2)
> # cast the data.frame to wide format
> gdpCast <- dcast(Year ~ Country,
data=gdp[, c("Country", "Year", "PerCapGDP")],
value.var="PerCapGDP")
> head(gdpCast)
```
![head of GDP data across various countries](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5b4631d34c2e6f1e71d81aa22e02838f.png)
```py
> # remove first 10 rows since Germany did not have
>
> # convert to time series
> gdpTS <- ts(data=gdpCast[, -1], start=min(gdpCast$Year),
+ end=max(gdpCast$Year))
>
> # build a plot and legend using base graphics
> plot(gdpTS, plot.type="single", col=1:8)
> legend("topleft", legend=colnames(gdpTS), ncol=2, lty=1,
+ col=1:8, cex=.9)
```
![Time series plot of GDP data for all countries in the data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/507607904ba13f30cf76dbf9cb633707.png) Figure 24.7 Time series plot of GDP data for all countries in the data. This is the same information as in Figure 24.1a, but this was built using base graphics.
## 24.2 VAR
在继续之前,我们必须处理德国的 NAs。出于某种原因,世界银行没有德国 1970 年以前的 GDP 数据。还有其他资源,如圣路易斯美联储经济数据(FRED),但他们的数据与世界银行的数据不太一致,因此我们将德国从我们的数据中删除。
```py
> gdpTS <- gdpTS[, which(colnames(gdpTS) != "Germany")]
```
将模型拟合到多个时间序列的最常见方法是使用向量自回归(VAR)模型。VAR 的计算公式是
![vector autoregressive model formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8038ebc5834c689b65e9331eb36c127d.png)
(24.3)
在哪里
![vector autoregressive model formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7fc3682661c29f39e72c5f88e6fc4802.png)
(24.4)
是白噪声。
虽然`ar`可以计算 VAR,但当 AR 阶数较高时,它通常会遇到奇异值`matrices`的问题,因此最好使用`vars`包中的`VAR`。为了判断数据是否应该进行差分,我们在`gdpTS`上使用`ndiffs`函数,然后应用差分次数。差异数据如图 24.8 所示,它比图 24.7 具有更好的平稳性。
![Differenced GDP data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/32f9b20398c058f0a7f01f9787e6912f.png) Figure 24.8 Differenced GDP data.
```py
> numDiffs <- ndiffs(gdpTS)
> numDiffs
[1] 1
> gdpDiffed <- diff(gdpTS, differences=numDiffs)
> plot(gdpDiffed, plot.type="single", col=1:7)
> legend("bottomleft", legend=colnames(gdpDiffed), ncol=2, lty=1,
+ col=1:7, cex=.9)
```
现在数据准备好了,我们可以用 VAR 来拟合一个 VAR。这实质上是 fits
a 利用每个时间序列的 lm 对其自身和其他序列的滞后进行的单独回归。如图 24.9 所示,加拿大和日本模型的系数图证明了这一点。
```py
> library(vars)
> # fit the model
> gdpVar <- VAR(gdpDiffed, lag.max=12)
> # chosen order
> gdpVar$p
AIC(n) 6
> # names of each of the models
> names(gdpVar$varresult)
[1] "Canada" "China" "Israel"
[4] "Japan" "Singapore" "United.Kingdom"
[7] "United.States"
> # each model is actually an lm object
> class(gdpVar$varresult$Canada)
[1] "lm"
> class(gdpVar$varresult$Japan)
[1] "lm"
> # each model has its own coefficients
> head(coef(gdpVar$varresult$Canada))
```
![Coefficient plot for Canada and other geographic areas](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/3e1340e252019197cc0097bac816a37d.png)
```py
> head(coef(gdpVar$varresult$Japan))
```
![Head of Coefficient plot for Canada and other geographic data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b9dd5732a343156b34c8d9aad3a955a1.png)
```py
> library(coefplot)
> coefplot(gdpVar$varresult$Canada)
> coefplot(gdpVar$varresult$Japan)
```
![Coefficient plots for VAR model of GDP data for Canada and Japan](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4617fbb8bc69154ba38e4db6b281a1c7.png) Figure 24.9 Coefficient plots for VAR model of GDP data for Canada and Japan.
使用
predict 函数,该模型的预测就像其他模型一样。
```py
> predict(gdpVar, n.ahead=5)
```
![predictive time series data Canada/China](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b75b75ee61e1ecdde71964ed1e112b83.png)
![predictive time series data Israel/Japan/Singapore/UK/USA](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/3296d6a7418d86d24d2dbce7997d2e06.png)
## 24.3 GARCH
ARMA 模型的一个问题是它们不能很好地处理极端事件或高波动性。为了克服这一点,一个很好的工具是广义自回归条件异方差或 GARCH 模型族,它除了对过程的均值建模之外,还对方差建模。
GARCH(m,s)中方差的模型为
![GARCH](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c66d0f66e5c18212b106c9b856bdb431.png)
(24.5)
在哪里
![GARCH formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2e7fbaa83f34fedbebf855f56ae86970.png)
(24.6)
和
![GARCH formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7f0e3a7bde475fb2a26582c95318b5a9.png)
(24.7)
是广义白噪声。
在这个例子中,我们使用`quantmod`包下载美国电话电报公司股票数据。
```py
> library(quantmod)
> load("data/att.rdata")
> library(quantmod)
> att <- getSymbols("T", auto.assign=FALSE)
```
这将数据从`xts`包加载到一个`xts`对象中,这是一个更健壮的时间序列对象,在许多其他改进中,可以处理不规则间隔的事件。如图 24.10 所示,这些物体甚至比`ts`的绘图有所改进。
![Time series plot of AT&T ticker data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/df577ec069de94638f9eed1d9c3d5fdd.png) Figure 24.10 Time series plot of AT&T ticker data.
```py
>library(xts)
> # show data
> head(att)
```
![Att stock ticker data first 5 rows](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e7aa03fac5d6c6f7259289d1712ccf69.png)
```py
> plot(att)
```
对于那些习惯了金融终端图表的人来说,`chartSeries`函数应该是
令人欣慰的。它创建了如图 24.11 所示的图表。
```py
> chartSeries(att)
> addBBands()
> addMACD(32, 50, 12)
```
![Series chart for AT&T](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4618f2a235866dcbe3d4f1384821ddc6.png) Figure 24.11 Series chart for AT&T.
我们只对收盘价感兴趣,所以我们创建了一个变量来保存它。
```py
> attClose <- att$T.Close
> class(attClose)
[1] "xts" "zoo"
> head(attClose)
T.Close
2007-01-03 34.95
2007-01-04 34.50
2007-01-05 33.96
2007-01-08 33.81
2007-01-09 33.94
2007-01-10 34.03
```
被广泛认为最适合 GARCH 模型的软件包是`rugarch`。还有其他拟合 GARCH 模型的软件包,比如`tseries`、`fGarch`、`bayesGARCH`,但我们将重点放在`rugarch`。
一般来说,GARCH(1,1)就足够了,因此我们将使该模型适合数据。第一步是使用`ugarchspec`设置模型规格。我们指定波动率建模为 GARCH(1,1),均值建模为 ARMA(1,1)。我们还指定新息分布应该是 t 分布。
```py
> library(rugarch)
attSpec
<- ugarchspec(variance.model=list(model="sGARCH",
+ garchOrder=c(1, 1)),
+ mean.model=list(armaOrder=c(1, 1)),
+ distribution.model="std")
```
下一步是使用 ugarchfit 拟合模型。
```py
attGarch <- ugarchfit(spec=attSpec, data=attClose)
```
打印模型会显示出很多信息,包括系数、标准误差、AIC 和 BIC。其中大部分,如残差统计、测试、AIC 和 BIC,都是对拟合质量的诊断性度量。靠近顶部的最佳参数是模型的关键。
```py
> attGarch
```
![GARCH Model Fit](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9610080d4c238763f41f75b8e74ee54c.png) ![GARCH Model Fit](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9f203286c2d78e4eb47181c0d4f87ca4.png)
![GARCH Model Fit](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/3fe6b7995636d206d33c533bc0313823.png)
![GARCH Model Fit](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/91d33498298da18957fca8565e53febd.png)
![a time series plot and the ACF of the residuals from the model](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/23c2feddec6a15d64587119d70033b83.png)
图 24.12 显示了时间序列图和模型残差的 ACF。
![Residual plots from GARCH model on AT&T data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/258ac2758ad4ff2f971178ed76d7b3a6.png) Figure 24.12 Residual plots from GARCH model on AT&T data.
为了判断这个模型的质量,我们建立了几个具有不同均值规格的模型——都是 GARCH(1,1)——并比较它们的 AIC。
```py
> # ARMA(1,1)
attSpec1 <- ugarchspec(variance.model=list(model="sGARCH",
garchOrder=c(1, 1)),
+ mean.model=list(armaOrder=c(1, 1)),
+ distribution.model="std")
> # ARMA(0,0)
> attSpec2 <- ugarchspec(variance.model=list(model="sGARCH",
garchOrder=c(1, 1)),
mean.model=list(armaOrder=c(0, 0)),
distribution.model="std")
> # ARMA(0,2)
attSpec3 <- ugarchspec(variance.model=list(model="sGARCH",
garchOrder=c(1, 1)),
mean.model=list(armaOrder=c(0, 2)),
distribution.model="std")
> # ARMA(1,2)
attSpec4 <- ugarchspec(variance.model=list(model="sGARCH",
+ garchOrder=c(1, 1)),
+ mean.model=list(armaOrder=c(1, 2)),
+ distribution.model="std")
> attGarch1 <- ugarchfit(spec=attSpec1, data=attClose)
> attGarch2 <- ugarchfit(spec=attSpec2, data=attClose)
> attGarch3 <- ugarchfit(spec=attSpec3, >data=attClose)
> attGarch4 <- ugarchfit(spec=attSpec4, data=attClose)
>
> infocriteria(attGarch1)
```
![Infocriteria](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/46a4f6fced96405021d0f1598782aafe.png)
这表明,根据 AIC 和 BIC 以及其他标准,第一和第四种模式是最好的。
使用来自`rugarch`的对象进行预测是通过`ugarchboot`函数完成的,然后可以绘制成图 24.13。
```py
> attPred <- ugarchboot(attGarch, n.ahead=50,
+ method=c("Partial", "Full")[1])
> plot(attPred, which=2)
```
![Predictions for GARCH model on AT&T data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cb514f56549a67ff0cb909076566f75e.png) Figure 24.13 Predictions for GARCH model on AT&T data.
因为这是股票数据,所以值得根据日志回报而不是实际收盘价来计算模型。
```py
> # diff the logs, drop the first one which is now NA
> attLog <- diff(log(attClose))[-1]
> # build the specification
> attLogSpec <- ugarchspec(variance.model=list(model="sGARCH",
+ garchOrder=c(1, 1)),
+ mean.model=list(armaOrder=c(1, 1)),
+ distribution.model="std")
> # fit the model
> attLogGarch <- ugarchfit(spec=attLogSpec, data=attLog)
> infocriteria(attLogGarch)
```
```py
Akaike -5.869386
Bayes -5.845481
Shibata -5.869426
Hannan-Quinn -5.860500
```
这导致 AIC 显著下降。
重要的是要记住,GARCH 模型的目的不是更好地拟合信号,而是更好地捕捉波动。
## 24.4 结论
时间序列在许多领域都起着至关重要的作用,尤其是在金融和一些物理科学领域。R 中用于时间序列的基本构件是`ts`对象,它被`xts`对象大大扩展了。最常见的模型类型有 ARMA、VAR 和 GARCH,分别用`arima`、`VAR`和`ugarchfit`函数拟合。
# 去木星和更远的地方
> 原文:<https://www.dominodatalab.com/blog/to-jupyter-and-beyond>
*TLDR;Domino 现在支持带有 R、Python 和 Julia 内核的 Jupyter 以及终端访问。它现在在浏览器中呈现 ipynb 文件,让你更容易地分享、比较和讨论笔记本;它还允许您以批处理作业的方式运行或安排笔记本电脑,使笔记本电脑成为一个很好的报告工具。*
## 介绍
尽管用于交互式探索性分析的工具越来越受欢迎,但我们经常听到数据科学家抱怨安装和配置这些工具是多么耗时和烦人,以及他们没有好的工具来在笔记本上共享和协作。从第一天起,我们就一直在构建 Domino 来解决这两个问题:让数据科学家更容易“启动并运行”,同时促进团队之间的协作和共享。
为此,我们的最新版本包括“一键”访问三个用于交互式数据科学工作的伟大工具: **Jupyter Notebooks** ,它提供对 R、Python、Julia 和 shell 的访问; **Rodeo** ,Python 中交互分析的新 IDE 以及**烧杯笔记本**,强大的多语言笔记本平台。
在接下来的几周里,我将更详细地描述其中的每一个。今天,我将描述我们最近添加的一些改进,这些改进使 Jupyter 在 Domino 上更加强大,特别是对于协作团队工作流。关于在 Domino 中使用 Jupyter 的完整文档在我们的帮助网站上。
## 基础:跑 Jupyter
Domino 让您在任何类型的硬件上只需点击一下就可以启动 Jupyter 笔记本服务器。您可以控制安装哪些软件包(尽管我们默认安装了很多),您的笔记本服务器将可以访问您项目中的所有文件。
![Selecting Jupyter in Domino](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8561c6c9a840da527333d8c402ab75bd.png)
Domino 将在安装了所选硬件的机器上启动 Jupyter,并将项目文件复制到那里。当服务器准备就绪时,您会看到一个打开它的链接:
![Notebook session ready in Domino](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/52b55d96bbfc7663de0ff6141290362e.png)
![Selecting terminal](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9407ab4cbc72451ecdf5025e0d3b42f7.png)
点击“打开会话”按钮将进入 Jupyter 界面。
我们默认的 Jupyter 安装有 Python 2.7、R 和 Julia 的内核。它还支持创建终端会话。我们支持定制 Jupyter 安装,所以你可以使用任何你想要的内核。
## 查看笔记本文件
启动服务器可能需要一分钟的时间,在许多情况下,能够快速查看可用的笔记本电脑非常重要。
多米诺现在渲染。ipynb 文件,所以你不用运行整个服务器就可以看到笔记本的内容。下图显示了如果您只是浏览查看 ipynb 文件会发生什么——这里没有运行 Jupyter 服务器。
![Browsing an ipynb file without server connection](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/dd5c2fb9e77e72736709b05d856e0b2c.png)
这让您可以将 Domino 项目转变成一个强大的笔记本图库,与同事们共享。如果有人看到他们喜欢的笔记本电脑,他们可以在运行的服务器上点击一下就可以旋转它。或者他们可以派生您的项目来进行他们自己的更改。
## 比较和评论
Domino 已经为数据科学工作提供了强大的协作工具,比如比较实验结果和促进讨论。现在,这些功能也可以很好地处理 ipynb 文件。例如,您可以比较您参与的两个不同会话,并查看笔记本的两个版本之间的差异。
![Comparing and commenting on notebooks in Domino](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4aefe63191731f5a24bf328279771e29.png)
![Comparing two different notebooks](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c2119ee09941263544d186d3214858fa.png)
像任何其他文件或结果一样,您可以留下关于笔记本的评论,这些评论将与您的同事共享。
![Commenting on a notebook](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/14400b242cab0ba93c59e13d003c4f70.png)
## 使用笔记本进行报告
除了交互式地运行笔记本和静态地查看它们之外,Domino 还允许您将笔记本文件作为批处理作业运行:我们将计算笔记本并将结果保存为 HTML,我们将把它放在 web 上,以便您的同事可以看到它。要将笔记本作为“批处理”作业运行,您可以(a)在文件视图中单击笔记本旁边的“运行”按钮;(b)或者从 CLI 执行普通的“domino run”命令,只需指定笔记本名称(例如,“domino run foo.ipynb”)。
![Reporting through notebooks in Domino](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/64471aa27f813d2b47fc0a0920da0a8d.png)
或者,您可以将笔记本设置为按计划运行,这样您的计算、渲染笔记本就可以作为报告发送出去。
![Run notebooks on schedule for reporting](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2fdc12606609ee49e99a4db5c9c87bcb.png)
# Rev 大会上最值得期待的 10 件事
> 原文:<https://www.dominodatalab.com/blog/top-10-things-to-look-forward-to-at-rev>
By Karina Babcock on May 01, 2018 in [Company Updates](/blog/company-updates/)
在不到一个月的时间里,首届数据科学领袖年度峰会即将举行。我们很高兴地宣布,此次活动的详细议程现已公布,届时将有来自不同行业、地区和规模的公司的杰出演讲者、数据科学领导者和从业者参加。
简而言之,这是与会者在 Rev 大会上应该期待的 10 件事的清单——没有经过任何科学审查。
### 10.举办地点
耶尔巴布埃纳艺术中心(Yerba Buena Center for the Arts)是一个以点燃大规模运动而闻名的场所,位于旧金山市中心,Rev 与会者可以在市中心的 Marriott Marquis 酒店获得无与伦比的 199 美元/晚的房价。
### 9.娱乐
在开幕晚宴上,来自一位惊喜嘉宾的令人兴奋的娱乐和顶级饮品。
### 8.车间
参加“管理数据科学生命周期的最佳实践”有限座位研讨会,提供实物外卖和实用的实践建议。
### 7.熊实验室预览
有机会从韦斯·麦金尼那里直接了解新的乌尔萨实验室。
### 6.免费培训
价值 1000 美元的会后多米诺培训,免费提供给 Rev 与会者。
### 5.深度会话
从业者会议深入探讨适用的使用案例和方法,如来自德勤、戴尔、AncestryDNA、UnitedHealth Group、摩根大通和其他公司的数据科学家的蒙特卡罗排列、GPU 深度学习、实验设计和多标签分类。
### 4.领导力课程
关于组织变革管理、与 IT 保持一致和发展团队的领导力会议,主讲人来自 Airbnb、S&P 全球、贝莱德、Stitch Fix、enlight 等。
### 3.新功能
亲身体验新的 Domino 特性和功能。
### 2.内特·西尔弗和凯茜·奥尼尔
主题演讲、签名售书机会以及 Nate Silver 和 Cathy O'Neil 的现场问答。
### 1.未来
这是加入这一塑造未来的数据科学领导者运动的第一手机会。
几周后见!
![null](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2780434f881cd74266624df0e7544f44.png)
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Ftop-10-things-to-look-forward-to-at-rev%2F&title=Top%2010%20Things%20to%20Look%20Forward%20to%20at%20Rev)
# 顶级创新者约翰·汤姆逊:为什么管理分析团队和数据科学家是一个独特的问题
> 原文:<https://www.dominodatalab.com/blog/top-innovator-john-thompson-why-managing-analytics-teams-data-scientists-is-a-unique-problem>
数据科学团队的管理是否跟上了该学科的飞速发展?多米诺数据实验室最近的电子书《数据科学创新者的剧本》[*探索了关于这个问题的新方法和新思考,作者是参与建立世界上最成功团队的顶级数据科学创新者。他们中的一些人说,管理数据科学和分析是一个独特的新问题,需要新的方法,并重新思考在管理其他类型的团队(如 IT、运营人员和软件开发人员)时学到的旧思想。*](https://www.dominodatalab.com/resources/data-science-innovators-playbook)
“数据科学团队是独一无二的,”John K. Thompson 说,他是《构建分析团队 的作者,也是几个非常成功的企业数据科学团队的领导者和构建者。他最近因其工作而出现在《数据科学创新者行动手册》中。
“他们不是开发团队;他说:“数据科学团队是一种创造性的职能,与软件开发项目和相关工作几乎没有共同点。相反,他说数据科学团队有创新功能和战略功能,而不是运营功能。
### 优化数据科学团队
他说,这就是为什么有效的数据科学团队应该有一定程度的试验和失败的自由。此外,当他们有年轻的、年老的和好奇的工作人员时,他们是最佳的。
汤普森说,最有效的方法是了解你的企业现在需要什么类型的团队。汤普森在书中概述了三种不同类型的团队:
* Artisan -每个数据科学家负责他们项目的所有方面,从设计到向高级管理人员演示
* 工厂-所有工作都通过专门的子团队进行。这些团队按顺序工作,以执行整个数据科学流程中的特定任务
* 混合——工匠团队和混合团队一起工作
### 管理分析和数据科学团队会随着时间的推移而变化
Thompson 说,同样重要的是要认识到,数据科学和分析团队的最佳组织通常会随着时间的推移而变化。
“关于我目前的团队,我从一个工匠团队开始,”他说。“一年前我加了一个厂队。目前,我有一个混合团队。数据科学团队是动态的,因此团队组织也应该是动态的。
在谈到该领域的积极发展时,Thompson 表示,企业和数据科学家都受益于数据科学和分析的当前状态,包括数据科学工具的出现,如 [enterprise MLOps](/resources/a-guide-to-enterprise-mlops/) 。
“我们已经达到了一个市场状态,我们拥有坚实的基础工具和技术来提供强大的模型和应用程序,”汤普森说。“我们缺乏分析人才,但我们有足够多有才华的数据科学家来推动公司和行业的变革和影响。此外,我们可以公开访问重要的数据资产,以便在我们的工作中使用。”
[![Ebook The Data Science Innovator's Playbook Industry trends, career advice, and how to meet the world's biggest challenges. Read the book](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/30324421f137a17eb87e63193631070d.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/b9b000f9-22c1-4169-a302-35fe4dee155c)
下载免费的 [*数据科学创新者行动手册*](https://www.dominodatalab.com/resources/data-science-innovators-playbook) ,阅读 Thompson 和其他许多人关于管理团队和开发创新分析程序的主题、战略、战术和见解的更多见解。这一独家内容包括以下采访:
* [卡西·科济尔科夫](https://www.dominodatalab.com/blog/googles-kozyrkov-tells-rev-3-data-science-universe-is-expanding-and-incredible-mlops-tools-emerging)——谷歌首席决策科学家
* Andy Nicholls——GSK PLC 统计数据科学部高级总监
* Mona g . Flores——NVIDIA 医疗人工智能全球主管
* najat Khan——强生公司让桑制药公司首席数据科学官兼研发战略与运营全球总监
* Robert Nishi hara——Ray 的联合创始人,Anyscale 的联合创始人兼首席执行官
* [约翰·汤普森](https://www.dominodatalab.com/blog/how-to-retain-your-data-scientists)—分析思想领袖、畅销书作家、数据创新者&分析
* [格伦·霍夫曼](https://www.dominodatalab.com/blog/what-the-rise-of-data-science-in-insurance-says-about-the-profession-and-how-its-changing)—纽约人寿保险公司首席分析官
# 9/11 新闻文章中的主题建模
> 原文:<https://www.dominodatalab.com/blog/topic-modeling-in-sept-11-news-articles>
这是丹·莫瑞斯的客座博文。另外还有[交互式仪表盘](http://djsensei.github.io/911)和[代码](https://github.com/djsensei/AlwaysRemember)。
这篇文章描述了一个项目,该项目将与 9 月 11 日^(袭击及其持久影响和后果相关的新闻文章中的主题可视化。我描述了我的动机、实现的技术细节以及我对一些结果的思考。)
![Topic relevancy line plot](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7fbd649b5a930e5377be1f7b57456003.png)
## 介绍
在美国近代史上,没有比 9/11 袭击更具变革性的事件了;它们挥之不去的影响将持续到未来。自那以后的几年里,成千上万的文章被写在了 9/11 事件上,每一篇都涵盖了新出现的话题的一小部分。我们如何使用数据科学的工具来发现这些主题并追踪它们随时间的进展?
## 灵感
这个主题最初是由一家名为 [Local Projects](http://www.localprojects.com/) 的公司提出的,他们被委托为纽约的[国家 911 博物馆](http://www.911memorial.org/)设计一个展览。他们的展览,[时代景观](http://www.fastcodesign.com/3030603/new-museum-uses-algorithms-to-visualize-how-9-11-still-shapes-the-world),将主题和文章的图像投射到博物馆的墙上。不幸的是,由于官僚主义和现代人的注意力跨度的考虑,展览仅限于广泛的主题和简短的循环持续时间。我的灵感来自时代景观的建筑师,但我想创造一些更深入和更具互动性的东西;任何有网络连接的人都可以在闲暇时探索。
这个问题的本质是讲故事。每篇文章都对一个故事提供了一些视角,但是连接它们的线索是以单词和短语的形式存在的。《奥萨马·本·拉登》、《关塔那摩湾》、《自由》等等。这些是我的模型的组成部分。
## 获取数据
在所有新闻来源中,没有比《纽约时报》更适合讲述 9/11 事件的了。他们也有一个很棒的 API,允许人们查询完整的文章数据库,找到与特定主题相关的文章。我使用这个 API 以及一系列的 [python 网页抓取](https://www.dominodatalab.com/blog/getting-data-with-beautiful-soup)和 [NLP 工具](https://www.dominodatalab.com/blog/deep-learning-illustrated-building-natural-language-processing-models)建立了我的语料库。
刮削过程如下:
1. 查询 API 以获取关于新闻文章的元数据,包括每篇文章的 URL。
2. 向每个 URL 发送一个 HTTP GET 请求,在 HTML 中找到实际的文章文本,并提取它。
3. 清理文章文本,删除[停用词](http://en.wikipedia.org/wiki/Stop_words)和标点符号。
我编写了 python 脚本来自动化这些过程,并且能够建立一个包含数万篇文章的语料库。也许这个过程中最具挑战性的部分是构建从 HTML 文档中提取文章文本的函数。在过去的几十年里,NYT 偶尔会改变他们的 HTML 文件的格式,因此提取文本的函数依赖于一个庞大的嵌套条件:
```py
# s is a BeautifulSoup object containing the HTML of the page
if s.find('p', {'itemprop': 'articleBody'}) is not None:
paragraphs = s.findAll('p', {'itemprop': 'articleBody'})
story = ' '.join([p.text for p in paragraphs])
elif s.find('nyt_text'):
story = s.find('nyt_text').text
elif s.find('div', {'id': 'mod-a-body-first-para'}):
story = s.find('div', {'id': 'mod-a-body-first-para'}).text
story += s.find('div', {'id': 'mod-a-body-after-first-para'}).text
else:
if s.find('p', {'class': 'story-body-text'}) is not None:
paragraphs = s.findAll('p', {'class': 'story-body-text'})
story = ' '.join([p.text for p in paragraphs])
else:
story = ''
```
## 向量化文档
在我们能够进行任何严肃的机器学习之前,我们必须对我们的文档进行矢量化。由于 scikit-learn 的 [TF-IDF 矢量器](http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html),这出奇的容易。只考虑单个单词是不够的,因为在我的语料库中不缺少重要的名字和短语。所以我选择包含从 1 到 3 的 n 元文法。令人愉快的是,实现多个 n 元语法就像矢量器初始化中的一个关键字参数一样简单:
```py
vec = TfidfVectorizer(max_features=max_features,
ngram_range=(1, 3),
max_df=max_df)
```
在早期的建模运行中,我将`max_features`(向量模型中包含的单词或短语的最大数量)设置为 20,000 或 30,000,在我的本地机器的合理计算限制范围内,但是考虑到包含 2-和 3-gram 会导致可能的功能组合爆炸(其中许多功能确实很重要),我希望在最终的模型中提高这个数字。
## 用 NMF 进行主题建模
非负矩阵分解,或 NMF,是一个令人愉快的线性代数优化算法。它最神奇的属性是,它可以提取关于主题的有意义的信息,而无需了解数据中的潜在含义!它的数学目标是将单个 n x m 输入矩阵分解成两个矩阵,通常命名为 W 和 H。W,文档-主题矩阵,形状为 n x t,H,主题-术语矩阵,形状为 t x m。事实上,该模型试图形成 W 和 H,使得它们的乘积非常接近输入矩阵。该算法的另一个很好的特性是,用户可以自由决定变量 t 的大小,t 代表产生的主题数量。
我再一次把重任交给了 scikit-learn,它的 T2 NMF 模块足以完成手头的任务。如果我在这个项目上花更多的时间,我可能会探索更有效的优化 NMF 的方法,因为这是这个项目中计算量最大的过程。在项目工作中,我想到了一个想法,但没有实现,那就是热启动版本。这将允许用户通过用特定术语播种 H 矩阵的行来将一些领域知识注入到主题的形成中。无论如何,我只有几周的时间来完成整个项目,所以我很满意为项目的这一部分插入一个好的预建算法。还有很多其他方面需要我更多的关注。
### 主题建模参数
因为主题模型是整个项目的基石,我在构建它时所做的决定对最终产品有相当大的影响。我决定将模型的输入限制在 9/11 之后 18 个月的文章。在那个时期,字面上和隐喻上的尘埃落定,所以所有作为 9/11 的直接结果而出现的话题都是在那个时间窗口内出现的。就像在矢量化阶段一样,我早期运行的规模受到了计算机能力的限制。结果是体面的 20 或 30 个主题,但我想要一个更大的模型,更实质性的结果。
我的最终模型使用了 100,000 个矢量化术语和大约 15,000 个文档。我选择了 200 个主题,因此 NMF 算法必须处理形状为 15000x100000、15000x200 和 200x100000 的矩阵,逐渐将后两种形状调整为符合第一种形状。
### 最终确定模型
在我的最终模型矩阵形成后,我浏览了每个主题并检查了关键术语(那些在主题术语矩阵中值最高的术语)。对于每个主题,我给它指定了一个特定的名称(稍后将在可视化中使用),并决定是否保留它。一些主题因与中心主题无关而被拒绝(例如,本地运动队)。其他的则过于宽泛或普通(关于股票市场或政治的话题)。还有一些过于具体,可能是 NMF 算法的产物(一系列相连的 3 个字母显然来自一个文档)。
在这个过程之后,我留下了 75 个强有力的相关主题,每个主题都根据其内容命名。
## 分析
一旦主题模型完成,确定任何给定文章的主题权重是一项简单的任务:
1. 使用存储的 TF-IDF 矢量器对文章文本进行矢量化
2. 找出术语向量和来自 NMF 的过滤主题术语矩阵的点积。(1 x 100k * 100k x 75 = 1 x 75)
3. 由此产生的 75 个元素的向量表明了这篇文章与 75 个主题的相关性。
更困难的部分是确定如何将这些文章权重编译成一种可以可视化的格式,以讲述引人入胜的故事。如果我简单地将给定时间段内所有文章的每个主题的权重相加,那么分布*将*准确地表示每个主题在该新闻周期中出现的频率。然而,这种分布的单位对于人类用户来说是没有意义的。另一方面,如果我对每个主题使用二进制分类,我可以找到一段时间内与特定主题相关的所有文章的百分比。我选择这种方法是因为它更容易理解。
二元主题分类有其自身的困难,特别是涉及文章和主题的不同权重。一些文章的主题权重较高,因为它们较长,并且包含了许多主题间共享的关键词。其他文章的主题权重普遍较低,即使是那些显然适合手动检查的文章的主题。这些变化使得固定的重量阈值不适合分类;一些文章可能属于几十个主题,而另一些则不属于任何主题。相反,我决定将每篇文章归类为权重最高的三个主题。虽然这种方法并不完美,但它很好地平衡了我们的主题加权模型所产生的各种问题。
## 形象化
虽然数据获取、主题建模和分析阶段都是这个项目的关键要素,但它们都是为最终的可视化服务的。我努力在视觉吸引力和用户互动之间找到适当的平衡,让用户在最少的指导下探索和理解主题的趋势。我使用堆积面积图作为主要图形,直到我意识到一个简单的重叠线图足够清晰。
我使用 d3.js 构建了可视化,这非常适合项目的数据驱动特性。数据本身以一个包含主题趋势数据的 CSV 文件和两个包含主题和文章元数据的 JSON 文件的形式传递到页面中。虽然我(现在也是)不是前端开发方面的专家,但我在一周的时间里学会了足够的 d3、html 和 css 来构建一个令人满意的可视化页面。
### 一些有趣的话题
* 炭疽热——911 之后,恐惧的气氛笼罩了整个国家。幸运的是,许多担心都是没有根据的。2001 年末的炭疽热恐慌是一个孤立的事件,没有太多持久的影响,从这个图中可以清楚地看到。
![Anthrax topic frequency in 9/11 dataset](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b8692a9bbe6e394658160da8315ec681.png)
* 奥萨马·本·拉登、基地组织、托拉搏拉——2011 年本·拉登在阿伯塔巴德被追捕后,任何话题中的最大峰值出现了。这种主题组合是值得注意的,因为它显示了媒体报道在 9/11 之后的进展:首先,奥萨马·本·拉登获得了大部分的关注。不久之后,托拉搏拉话题因被认为是本拉登的藏身之处和美国军方关注的焦点而变得突出。当本·拉登显然已经逃脱追捕时,这两个话题的重要性都下降了,而更广泛的基地组织话题略有上升。近年来,每个专题的数量逐渐增加,这表明它们仍然具有相关性。即使覆盖面没有绝对增加,它们的相对频率也会随着其他话题的减少而增加。
![Osama Bin Laden topic frequency in 9/11 dataset](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7fbd649b5a930e5377be1f7b57456003.png)
## 我学到了什么
虽然项目结束后,我对主题建模和完整数据管道的其他组件有了更全面的理解,但项目的真正价值在于它(重新)讲述的故事。9/11 本质上是负面的,但也有许多正面的故事:拯救了许多生命的英雄,团结的社区,以及重建。
不幸的是,在我的主题模型中出现的东西反映了更大的媒体氛围:对消极、恶棍和破坏的关注。当然,个别英雄在一两篇文章中受到了表彰,但没有一篇足以成为话题。另一方面,像奥萨马·本·拉登和扎卡里亚斯·穆萨维这样的恶棍在成百上千的文章中被提及。即使是瑞德·李察,这个笨手笨脚(企图)的鞋子炸弹客,在媒体上也比成功的英雄有更持久的影响(补充说明:以术语为中心的主题模式的弱点之一是,像里德这样的常见名字可能导致关于非常不同的人的文章聚集在一起。在这种情况下,哈里·里德和瑞德·李察。).
# 基于密度的聚类
> 原文:<https://www.dominodatalab.com/blog/topology-and-density-based-clustering>
###### Manojit Nandi 原创内容 Josh Poduska 更新。
聚类分析是数据分析中的一个重要问题。数据科学家使用聚类来识别故障服务器,将具有相似表达模式的基因分组,并执行各种其他应用。
数据聚类算法有很多种,您可能熟悉最流行的一种:k-means。作为快速复习,k-means 确定数据中的 k 个质心,并通过将它们分配到最近的质心来聚类点。
虽然 k-means 在实践中易于理解和实现,但该算法没有离群值的概念,因此所有的点都被分配到一个聚类中,即使它们不属于任何聚类。在异常检测的领域中,这导致了问题,因为异常点将被分配到与“正常”数据点相同的聚类中。异常点将聚类质心拉向它们,使得将它们归类为异常点更加困难。
在这篇博文中,我将介绍一系列被称为基于密度的聚类的技术。与 k-means 等基于质心的聚类相比,基于密度的聚类通过识别点的“密集”聚类来工作,允许它学习任意形状的聚类并识别数据中的异常值。特别是,我将:
* 讨论非常流行的 DBSCAN 算法。
* 使用 denpro R 包。这个库包含了水平集树聚类算法的有效实现。
和往常一样,代码[可以在 Domino 平台](https://try.dominodatalab.com/u/nmanchev/clustering/overview)上找到。不用注册就可以浏览项目。文件下的“Clustering.ipynb”是一个很好的起点。你需要[注册](https://www.dominodatalab.com/trial)来在 Domino 中免费运行代码。
[![Trial Project Density-Based Clustering in Domino Try Now](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/56eb088166519737bf8f4d604323ce3e.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/c37e0058-5e6a-4d2a-8922-c8a7acf60ca7)
## 初步:ɛ-Balls 和邻里密度
在讨论基于密度的集群之前,我们首先需要讨论一个您可能在拓扑课程中见过的主题:ɛ-neighborhoods.
ɛ-neighborhoods 背后的一般思想是给定一个数据点,我们希望能够对它周围空间中的数据点进行推理。形式上,对于一些实值ɛ > 0 和一些点 p,p 的ɛ-neighborhood 被定义为距离 p 至多ɛ距离的点集
如果你回想一下几何学,所有的点到中心的距离相等的形状就是圆。在 2D 空间中,点 p 的ɛ-neighborhood 是包含在以 p 为中心的半径为ɛ的圆中的点集。在 3D 空间中,ɛ-neighborhood 是以 p 为中心的半径为ɛ的球体,而在更高维度的空间中,ɛ-neighborhood 只是以 p 为中心的半径为ɛ的 n 球体
让我们考虑一个例子来使这个想法更具体。
我在区间[1,3]X[2,4]里散了 100 个数据点。让我们选择点(3,2)作为我们的点 p。
![100 data points in the interval [1,3]X[2,4]](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cd766d7970d21853dbb93176e077b87c.png)
首先,让我们考虑半径为 0.5 (ɛ = 0.5)的 p 的邻域,即距离 p 为 0.5 的点集
![Neighborhood of P with radius 0.5](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fc287401684df69eee5a369e4cfbb019.png)
不透明的绿色椭圆形代表我们的邻域,在这个邻域中有 31 个数据点。由于我分散了 100 个数据点,其中 31 个数据点在邻域内,这意味着不到三分之一的数据点包含在半径为 0.5 的 p 的邻域内。
现在,让我们将半径改为 0.15 (ɛ = 0.15),并考虑由此产生的更小的邻域。
![Neighborhood of (3,2) with radius 0.15](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/d658951e47c91c0234e43f5dde5644f4.png)
我们缩小了邻域,所以现在只有 3 个数据点包含在其中。通过将ɛ从 0.5 减少到 0.15(减少 70%),我们将邻域中的点数从 31 减少到 3(减少 90%)。
既然我们已经定义了“邻域”的含义,我们将引入下一个重要的概念:邻域“密度”的概念(毕竟,我们正在建立描述“基于密度的聚类”)。
在小学科学课上,孩子们被告知密度=质量/体积。让我们使用质量除以体积的思想来定义某个点 p 处的密度。如果我们考虑某个点 p 及其半径为ɛ的邻域,我们可以将邻域的质量定义为邻域内包含的数据点的数量(或者数据点的分数),邻域的体积是邻域的最终形状的体积。在 2D 的例子中,邻域是一个圆,所以邻域的体积就是圆的面积。在 3D 和更高维的情况下,邻域是球体或 n 球体,因此我们可以计算这个形状的体积。
例如,让我们再次考虑半径为 0.5 的 p = (3,2)的邻域。
![Neighborhood of p = (3,2) of radius 0.5](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e0c9adefe427e80d9c1202b1832908c3.png)
质量是邻域中数据点的数量,因此质量= 31。体积是圆的面积,所以体积= π0.25 = π/4。所以我们在*p = (3,2)的局域密度近似计算为密度=质量/体积= 31/(π/4) = 124/π ~= 39.5。
这个值本身是没有意义的,但是如果我们计算数据集中所有点的局部密度近似值,我们可以通过说邻近的(包含在同一个邻域中)并且具有相似局部密度近似值的点属于同一个聚类来对我们的点进行聚类。如果我们降低ɛ的值,我们可以构建包含更少数据点的更小的邻域(更小的体积)。理想情况下,我们希望识别高密度的邻域,其中大部分数据点都包含在这些邻域中,但这些邻域中每个邻域的体积都相对较小。
虽然这不完全是 DBSCAN 或水平集树算法所做的,但它形成了基于密度的聚类背后的一般直觉。
概括地说,我们讨论了ɛ-neighborhoods,以及它们如何让我们对特定点周围的空间进行推理。然后我们为一个特定的邻域定义了一个特定点的密度概念。在下一节中,我将讨论 DBSCAN 算法,其中ɛ-ball 是定义聚类的基本工具。
## DBSCAN
DBSCAN(含噪声应用的基于密度的空间聚类)是最著名的基于密度的聚类算法,[由 Ester 等人于 1996 年首次提出。al](https://dl.acm.org/doi/10.5555/3001460.3001507) 。由于其在理论和应用上的重要性,该算法是 2014 年 KDD 会议上获得[时间检验奖](https://www.kdd.org/awards/view/2014-sikdd-test-of-time-award-winners)的三个算法之一。
与 k-means 不同,DBSCAN 不需要将聚类数作为参数。相反,它根据数据推断聚类的数量,并且可以发现任意形状的聚类(作为比较,k-means 通常发现球形聚类)。如前所述,ɛ-neighborhood 是 DBSCAN 逼近局部密度的基础,因此该算法有两个参数:
* *ɛ* :我们在一个数据点周围的邻域半径 *p* 。
* *minPts* :我们希望在一个邻域中定义一个聚类的最小数据点数。
使用这两个参数,DBSCAN 将数据点分为三类:
* *核心点*:如果 **Nbhd** ( *p* ,*ɛ*)*p*的ɛ-neighborhood 至少包含 *minPts* ,则一个数据点 *p* 为一个*核心点*;| **Nbhd** ( *p* ,*ɛ*)|>=*min pts*。
* *边界点:如果 **Nbhd** ( *q* , *ɛ* )包含的数据点少于 *minPts* 数据点,但 *q* 是从某个*核心点* *p* 到达*的*边界点*。**
* *离群点*:如果一个数据点 *o* 既不是核心点也不是边界点,那么它就是一个*离群点*。本质上,这是“其他”类。
这些定义可能看起来很抽象,所以让我们更详细地讨论一下每个定义的含义。
### 核心要点
*核心点*是我们集群的基础,基于我在上一节中讨论的密度近似值。我们使用相同的ɛ来计算每个点的邻域,因此所有邻域的体积都是相同的。然而,每个邻域中其他点的数量是不同的。回想一下,我说过我们可以把邻域中数据点的数量看作它的*质量*。每个邻域的体积是恒定的,而邻域的质量是可变的,所以通过对需要成为*核心点*的最小质量设置一个阈值,我们实质上是设置了一个最小密度阈值。因此,核心点是满足最小密度要求的数据点。我们的集群是围绕我们的*核心点*(因此是*核心*部分)构建的,因此通过调整我们的 *minPts* 参数,我们可以微调我们的集群核心的密度。
### 边界点
*边界点*是我们聚类中不是核心点的点。在上面对*边界点*的定义中,我使用了术语*密度可达*。我还没有定义这个术语,但是这个概念很简单。为了解释这个概念,让我们重温一下ε= 0.15 的邻域示例。考虑点 *r* (黑点)在点 *p* 的邻域之外。
![Density-Reachable with radius 0.15](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/72968d3d3210355fb336f4a768f6d327.png)
点 *p* 的邻域内的所有点都被称为从 *p* 直接可达*的点。现在,让我们探索点 *q* 的邻域,点*可从 *p* 直接到达*。黄色圆圈代表 *q* 的邻居。*
![Neighborhood of (3,2) with radius 0.15](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b54df17760e2628877a02dedf51007c2.png)
现在,虽然我们的目标点 *r* 不是我们的起点 *p* 的邻域,但它包含在点 *q* 的邻域中。这是密度可达背后的思想:如果我可以从点 *p* 开始,通过从一个邻域跳到另一个邻域到达点 *r* ,那么点 *r* 是从点 *p* 密度可达的。
![Density-Reachable with radius 0.15](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7b72cc0fee34dae582d3e334c5c7118a.png)
打个比方,我们可以把*密度可达的*点想象成“朋友的朋友”。如果一个*核心点 p* 的*可直接到达的*是它的“朋友”,那么*密度可到达的*点,即 *p* 的“朋友”的邻域中的点,是“它的朋友的朋友”。可能不清楚的一件事是*密度可达*点不仅限于两个相邻的邻域跳跃。只要你能到达做“邻居跳跃”的点,从一个*核心点 p* 开始,那个点是从 *p* 可到达的*密度*,所以“朋友的朋友的朋友……朋友的朋友”也包括在内。
重要的是要记住,*密度可达的概念依赖于我们的ɛ.值通过选择较大的ɛ值,更多的点成为*密度可达*,通过选择较小的ɛ值,较少的点成为*密度可达*。*
### 极端值
最后,我们到了我们的“其他”类。*离群点*是既不是*核心点*也不是足够靠近一个集群以至于从*核心点*到*密度可达*的点。*异常值*未分配给任何聚类,并且根据上下文,可能被视为异常点。
既然我已经介绍了所有的预备知识,我们终于可以谈谈算法在实践中是如何工作的了。
### 应用
DBSCAN 是在流行的 Python 机器学习库 [Scikit-Learn](http://scikit-learn.org/stable/) 中实现的,因为这个实现是可伸缩的并且经过了良好的测试,所以我将使用它来演示 DBSCAN 在实践中是如何工作的。
DBSCAN 算法的步骤如下:
* 随机选取一个点,该点没有被分配给一个聚类,也没有被指定为*异常值*。计算它的邻域以确定它是否是一个*核心点*。如果是,围绕这个点启动一个集群。如果否,将该点标记为*异常值*。
* 一旦我们找到一个*核心点*并因此找到一个集群,通过将所有*可直接到达的*点添加到该集群来扩展该集群。执行“邻域跳跃”来找到所有的*密度可达*点,并将它们添加到集群中。如果添加了*异常值*,则将该点的状态从*异常值*更改为*边界点*。
* 重复这两个步骤,直到所有点要么被分配到一个聚类,要么被指定为一个*异常值*。
多亏了 Scikit-Learn 易于使用的 API,我们只用几行代码就可以实现 DBSCAN
```py
from sklearn.cluster import DBSCAN
```
为了测试 DBSCAN,我将使用一个由批发分销商的年度客户数据组成的[数据集。](https://archive.ics.uci.edu/ml/datasets/Wholesale+customers)
该数据集由 440 个客户组成,每个客户有 8 个属性。我将使用 Pandas 库来加载。csv 文件转换为 DataFrame 对象:
```py
import pandas as pd
data = pd.read_csv("data/wholesale.csv")
#Drop non-continuous variables
data.drop(["Channel", "Region"], axis = 1, inplace = True)
```
删除标识客户的两个字段后,我们可以检查该数据集的前几行:
![First five rows of wholesale data in a dataframe](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/78a97162bf679ee12b45cba06c7d804f.png)
因此,我们可以将数据可视化,我将只使用其中的两个属性:
* 杂货:顾客在杂货产品上的年度支出(以某种货币单位计)。
* 牛奶:顾客每年在奶制品上的花费(以某种货币单位计)。
```py
data = data[["Grocery", "Milk"]]
data = data.to_numpy().astype("float32", copy = False)
```
因为数据的值以千计,所以我们将通过将每个属性的平均值和单位方差调整为 0 来对其进行规范化。
```py
stscaler = StandardScaler().fit(data)
data = stscaler.transform(data)
```
现在,让我们来可视化标准化数据集:
![Wholesale Data - Groceries](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4457a702bc3bd22f5da732b061a9a20b.png)
如你所见,食品杂货购买和奶制品购买之间存在正相关关系。有一个以平均牛奶购买量(牛奶= 0)和平均食品杂货购买量(食品杂货= 0)为中心的聚类。此外,与其他顾客相比,购买更多食品杂货或奶制品的顾客也有一些异常值。
通过 DBSCAN,我们希望识别这一主要客户群,但我们还希望将具有更多不寻常年度购买习惯的客户标记为异常值。
我们将构建一个 DBSCAN 对象,它要求半径为 0.5 的邻域中至少有 15 个数据点被视为核心点。
dbsc = DBSCAN(eps = .5,min_samples = 15)。拟合(数据)
接下来,我们可以提取我们的聚类标签和离群值来绘制我们的结果。
```py
labels = dbsc.labels_
core_samples = np.zeros_like(labels, dtype = bool)
core_samples[dbsc.core_sample_indices_] = True
```
![DBSCAN on Wholesale data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6983aace0b330af864ad436883234b7c.png)
根据我们的直觉,DBSCAN 算法能够识别一个购买普通食品和奶制品的客户群。此外,它还能够标记出年度购买行为与其他客户相差太大的客户。
因为异常值对应于具有更极端购买行为的客户,批发分销商可以专门针对这些客户提供独家折扣,以鼓励更大的购买量。
作为基线,让我们对这个数据集上的两个聚类运行 k-means。蓝色大圆点代表黑色星团的质心,金色大圆点代表白色星团的质心:
![K means cluster of wholesale data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/67fc04f990f748d9d2e2b8a8a5b13ba9.png)
虽然白色聚类似乎捕获了大多数异常值,但该聚类基本上捕获了购买相对更多商品的客户。如果我们将白色聚类指定为“异常”聚类,那么我们基本上标记了购买大量牛奶或食品的任何客户。如果你是批发分销商,那么你会把你更好的客户,那些你从中赚更多钱的客户,称为异常客户。
### DBSCAN -玩具示例
对于 DBSCAN 的功能,我们考虑一个非正式地称为“半月”数据集的玩具示例,其中每个数据点属于两个“半月”中的一个。
```py
from sklearn.datasets import make_moons
#moons_X: Data, moon_y: Labels
moons_X, moon_y = make_moons(n_samples = 2000)
```
![Half moons graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2da8f910ca6ef616039e4610a1f4e0c5.png)
这个数据集很有美感,但是没有异常值。为了纠正这个问题,我将使用以下代码向 1%的数据添加随机噪声:
```py
def add_noise(X,y, noise_level = 0.01):
#The number of points we wish to make noisy
amt_noise = int(noise_level*len(y))
#Pick amt_noise points at random
idx = np.random.choice(len(X), size = amt_noise)
#Add random noise to these selected points
noise = np.random.random((amt_noise, 2) ) -0.5
X[idx,:] += noise
return X
```
现在数据集有了明显的异常值。
![Outliers in half moon graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b5fdebffe1de97457713be545364ea0e.png)
我们可以对数据运行 DBSCAN 以获得以下结果。该算法成功地发现了两个“半月”,并将几乎每个有噪声的数据点识别为异常值。
![DBSCAN on Half Moons](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e1161b23579e3e9567311a2e8af1833c.png)
相比之下,k-Means 在这个数据集上表现不佳。该算法不能成功发现“半月形”结构,也不能区分噪声数据点和原始数据点。
![K means with two clusters on Half Moons](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/dde81628c719552b492a65b9260fd429.png)
## 进去吧
[水平集树聚类算法](http://cseweb.ucsd.edu/~dasgupta/papers/tree.pdf)是由加州大学圣地亚哥分校的两位计算机科学家 Chaudhuri 和 Dasgupta 于 2010 年开发的。在本节中,我将使用由教授兼作者 Jussi Klemela 开发的 [denpro](https://denpro.co.uk/) R 软件包。这个库包含了水平集树聚类算法的有效实现。见 R 档,denpro。r,在[多米诺项目](https://try.dominodatalab.com/u/nmanchev/clustering/overview)中。
### 水平集
DBSCAN 是建立在ɛ-balls 基础上的,而水平集树聚类,顾名思义,是建立在水平集上的。
如果我们有某个数学函数 *f* 和某个常数 *c* ,那么水平集*L*c 就是 *x* 的所有值使得 f(x) = c .形式上,在数学集构建器符号中。
*L*[c](f)= { X in**X**| f(X)= c }
例如,如果 f(x) = x² 和 *c* = 4,那么*L*c(f)= {-2,2}因为 f(-2) = (-2)² = 4 和 f(2) = 2² = 4。
![Level Set graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ffb5c75c9c4e3c48ef236cd08629a371.png)
为了构建水平集树,我们将使用一类特殊的*水平集*,称为λ- *上水平集*。对于某个常数λ和某个函数 *f* ,则 *f* 、 *L* 、 λ (f)的λ- *上水平集*,定义为:
*l*[(f)= { x 中的 X| f(x) > = λ}]
本质上,这是函数大于或等于某个常数λ的情况。回到我们之前的例子 f(x) = x² 和λ = 4, *f* 的λ- *上水平集*会是(-∞,-2】U[2,∞)。
![Upper level set of f](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/be3f7fddcb6f53544d2b0f57fd0b4811.png)
现在,我肯定你想知道我们如何使用这个数学对象来执行聚类。基本思想是,我们假设我们的数据是根据某个概率密度函数 *f* 生成的,因此如果我们将λ选为区间[0,1]中的常数,我们的λ- *上水平集*对应于比我们的阈值λ更密集的数据区域。
我们的目标是使用阈值参数λ来识别对应于具有相似密度的数据的连接区域的*高密度聚类*。
现在,我们来谈谈算法的*树*部分。假设我们从λ的高初始值开始,假设λ = 0.7,计算得到的 *f* 的λ- *上水平集*。我们最终得到一组点,使得对于*上水平集*中的每个点,f(x) > = 0.7。现在,让我们将λ的值减小到 0.5,并计算得到的λ- *上水平集*。现在由传递性可知,λ = 0.7- *上水平集*中的所有点也是λ = 0.5- *上水平集*的成员因为如果 f(x) > = 0.7 且 0.7 > = 0.5,则 f(x) > = 0.5。
推广这个模式,如果λ1 < λ2, then *L* λ2 (f)是 *L* λ1 (f)的子集。本质上,如果我们要遍历λ的递增序列,我们将创建一个λ上*水平集*,它是先前上水平集的子集。这是树结构:根代表λ = 0.0(所有的点),每个分支代表λ的更高值,因此是来自前一级的点的子集。
## kNN 密度估计
由于我们不知道生成数据的真实概率密度函数 *f* ,我们将需要估计它。之前,我们使用ɛ-Balls 通过计算邻域的“质量”与“体积”之比来估计密度。
这里我们用一个类似的方法叫做[k-最近邻](/knn-with-examples-in-python)密度估计来估计底层的概率密度函数 *f* 。使用ɛ-Balls 方法,我们首先固定邻域的体积,然后计算邻域内的点数来确定质量。对于 k-最近邻密度估计方法,我们要做相反的事情;首先我们将质量固定为某个数字 *k* ,然后我们计算在球内得到 *k* 个点所需的体积。
在机器学习中,最基本的分类算法之一是 k-最近邻(k-NN)分类。k-NN 分类的快速复习;
* 挑选一些整数 *k* 和一些测试数据点 *x*[i] 。
* 检索您的训练数据集中最接近 *x*[i] 的 *k* 个点。
* 获得这些 *k* 点的多数标签,并将该标签分配给*x*I
用 k-NN 密度估计,我们要做一些类似的事情。就像我上面说的,我们希望在我们的邻域中有 *k* 个点,所以我们要找到恰好包含 *k* 个点的最小邻域的体积。
要使用 k-NN 密度估计来估计给定点的密度,我们要找到到第 K 个^个最近点、*d*K 的距离,并以此作为我们邻域的半径。通过这样做,我们得到了一个在我们点周围的邻域,其中正好有其他的点。
k-最近邻估计量的数学公式如下:
![mathematical equation for knn](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/043a9742e5048049bbd0c3cbf462a268.png)
在这个方程中, *k* 是我们想要的邻域内的点数,*x*I 是我们给定的点, *n* 是数据集中的点数,*v*d 是 d 维欧氏球的体积,*r*k(*x*I)是到
对于 2 维数据,2 维欧氏球的体积为πR² 其中 R = 1,所以*v*d=π,在这种情况下。
以下代码使用 [TDA](https://github.com/cran/TDA) R 包计算二维数据的 k-NN 密度估计值:
```py
## kernel density estimator
install.packages('TDA')
library(TDA)
k <- 500
KNN <- knnDE(crater_xy, crater_xy, k)
qplot(x, y, data = crater, size = KNN, colour = KNN, main = 'KNN Density Estimate on Crater Dataset') +
scale_colour_continuous(low = "black", high = "red")
```
为了演示 k-NN 密度估计,让我们考虑一个非正式地称为“火山口”数据集的玩具数据集。数据集包括一个非常密集的核心(“撞击”的陨石坑),核心周围有一个密度较低的环。
![Crater dataset](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/84fbd34dc3b24707b23d687e821993c4.png)
如果你看上面的图像,你会注意到在中心有一组紧密捆绑的数据点,随着我们远离中心,这些点看起来变得不那么紧密。有 2000 个红色数据点,和 1000 个蓝色数据点,供参考。
下面是我用来创建这个玩具数据集的代码:
```py
makeCraters <- function(inner_rad = 4, outer_rad = 4.5,
donut_len = 2, inner_pts = 1000,
outer_pts = 500){
#Make the inner core
radius_core <- inner_rad*runif(inner_pts)
direction_core <- 2*pi*runif(inner_pts)
#Simulate inner core points
core_x <- radius_core*cos(direction_core)
core_y <- radius_core*sin(direction_core)
crater <- data.frame(x=core_x, y=core_y, label='core')
#Make the outer ring
radius_ring <- outer_rad + donut_len*runif(outer_pts)
direction_ring <- 2*pi*runif(outer_pts)
#Simulate ring points
ring_x <- radius_ring*cos(direction_ring)
ring_y <- radius_ring*sin(direction_ring)
crater_ring <- data.frame(x=ring_x, y=ring_y, label='ring')
crater <- rbind(crater, crater_ring)
return(crater)
}
crater <- makeCraters()
crater_xy <- crater[,c(1,2)]
require(ggplot2)
qplot(x, y, data = crater, colour = label, main = 'Crater Dataset')
```
从上面的图像中,我们应该期望中心附近的点具有较高的 k-NN 密度估计,而外环中的点具有较低的 k-NN 密度估计。
我们在这个“陨石坑”数据集上运行上面包含的 k-NN 密度估计代码,并绘制较大和较暗的点对应于较高密度值的点。
```py
## kernel density estimator
install.packages('TDA')
library(TDA)
k <- 500
KNN <- knnDE(crater_xy, crater_xy, k)
qplot(x, y, data = crater, size = KNN, colour = KNN) +
scale_colour_continuous(low = "black", high = "red")
```
![KNN Density Estimate on Crater Dataset](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6447f6e79a03de2af561e7749c0e7286.png)
正如所料,较大和较暗的点被捆绑在中心,随着我们远离中心,这些点变得越来越亮和越来越小。通过选择适当的λ值,我们可以创建一个仅由靠近中心的暗点组成的上水平集,对应于一个高密度的簇。
### 应用
通过 CRAN 可以获得 denpro 库,所以我们可以用
```py
install.packages('denpro')
library(denpro)
```
我们将把水平集树算法应用于上一节中的“火山口”数据集。水平集树算法的分层性质将在外环中找到“更密集”的子聚类,而不是仅仅试图将数据聚类到核心和外环中。
我们首先运行 pcf.kern,它计算一个多元核估计,并给出一个分段常数函数对象的输出。它采用 h(平滑参数)和 N(核估计的网格维数)作为输入。默认情况下,它使用标准的高斯核。
```py
pcf <- pcf.kern(crater_xy,h=0.5,N=c(32,32)) # kernel estimate
```
接下来,我们构建水平集树,然后修剪它。
```py
lst <- leafsfirst(pcf) # level set tree
td <- treedisc(lst,pcf,ngrid=60) # pruned level set tree
```
现在,我们绘制树,它的体积图,和它的重心图,这是一个形状树的位置图。
```py
plottree(td, col='blue') # plot tree
plotvolu(td) # volume plot
plotbary(td) # location plot
```
![plottree()](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f4663a3a466ce6302b320eb1e249180e.png)![plotvolu()](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6d5f63b0ab170be199f38ce2a9c60dfd.png)
从树状图中,我们看到数据集被聚集成一个主群,后面是更密集的外部群。
我们现在可以用这些聚类标签来绘制数据。
## 聚类的彩色散点图
```py
cd<-colors2data(crater_xy,pcf,lst)
plot(crater_xy,col=cd$datacolo)
```
![colored scatter plot of clusters](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f8fe427ad59721c9857b73e6040cc256.png)
水平集树能够成功地将大部分内核聚类为单个聚类,然后识别外环中的“密集”子聚类。
使用水平集树,我们可以在数据密度差异较大的数据集中进行聚类。DBSCAN 只是标记离群值,而水平集树试图在这些离群值中发现一些基于聚类的子结构。在市场细分中,这可能有助于发现新兴市场。在数据安全方面,研究人员可以识别新的恶意软件,其中最近受感染的计算机的小样本与其余数据的行为不同,但彼此相似。
## 距离函数
在关于ɛ-neighborhoods 的初始部分,我说过这些街区呈现圆形或球形。当我们使用标准的欧几里德距离度量时,有时称为*l*T2 2 度量,我们的邻域显示这个球形。为什么会这样?
我们来考虑 2D 空间中的两点 *p*[1] = (x[1] ,y[1] ),*p*[2]=(x[2],y[2] )。为了简单起见,我使用 2D 空间中的点,但是这些距离度量可以推广到更高维度的空间。
这两点的欧氏距离为 *d(p[1] ,p[2])*=[(x[1]–x[2])²+(y[1]–y[2])²^(0.5)。
如果我们将距离固定为小于ɛ,那么我们得到以下不等式:
*d(p[1] ,p[2])*=[(x[1]–x[2])²+(y[1]–y[2])²^(0.5)<ɛ
两边均方得出:
(x[1]–x[2])²+(y[1]–y[2])²<ɛ²
上面的不等式应该看起来很熟悉以(c[1] ,c[2] )为圆心的半径为 *r* 的圆的一般方程:(x–c[1])²+(y-c[2])²= r²。
由于欧几里德距离度量,当我们计算 **Nbhd** ( *p* ,ɛ)时,我们最终得到一个以 *p* 为中心、半径为ɛ.的球形邻域
然而,如果我们使用不同的距离度量,我们会得到不同形状的邻域。例如,如果我们使用曼哈顿距离,或 *l*[1] 公制,其中两点之间的距离是 *d(p*[1] *,p*[2]*)*= | x[1]–x[2]|+| y[1]–y[2]|(|)。|是绝对值),那么邻域将显示一个矩形。
通过改变使用的距离度量,我们可以改变邻域的形状。通过改变邻域的形状,我们可以发现不同的集群集合。取决于问题,使用除欧几里德距离度量之外的距离度量来发现不同类型的聚类可能是有益的。
## 结论
基于密度的聚类方法很棒,因为它们没有预先指定聚类的数量。与其他聚类方法不同,它们引入了离群值的概念,并能够“过滤”掉这些离群值。最后,这些方法可以学习任意形状的聚类,使用水平集树算法,可以学习密度差异很大的数据集中的聚类。
但是,我应该指出,与 k-means 之类的参数聚类方法相比,这些方法更难调整。与 k-means 的聚类数参数相比,DBSCAN 的 epsilon 参数或水平集树的参数不太直观,因此为这些算法选择良好的初始参数值更加困难。
最后,对于对不同类型问题的通用聚类方法感兴趣的读者来说,[这本关于数据聚类的书](https://www.crcpress.com/Data-Clustering-Algorithms-and-Applications/Aggarwal-Reddy/9781466558212)是一本方便的参考资料。
# 走向预测准确性:调整超参数和管道
> 原文:<https://www.dominodatalab.com/blog/towards-predictive-accuracy-tuning-hyperparameters-and-pipelines>
*本文提供了《调优超参数和管道》一书的节选,该书由 Mark E. Fenner 所著,[Machine Learning with Python for every one](http://www.informit.com/store/machine-learning-with-python-for-everyone-9780134845623?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Fenner&utm_term=MLPython)。摘录和补充 [Domino 项目](https://try.dominodatalab.com/u/domino-andrealowe/Tuning-Hyperparameters-and-Pipelines/overview)评估超参数,包括 GridSearch 和 RandomizedSearch,以及构建自动化的 ML 工作流。*
## 介绍
数据科学家、机器学习(ML)研究人员和商业利益相关者在模型的预测准确性方面有着高风险投资。数据科学家和研究人员使用不同的技术、方法和设置(包括模型参数和超参数)来确定模型的预测准确性。模型参数是在训练期间学习的。超参数不同,因为它们是在学习方法之外设置的预定值,并且不由学习方法操纵。例如,具有适当的正则化超参数提供了控制模型灵活性的能力。这种控制防止新测试数据的过度拟合和预测准确性的降低。当超参数也用于优化并针对特定数据集进行调整时,它们也会影响预测准确性。
[模型是数据科学的核心](https://blog.dominodatalab.com/model-management-era-model-driven-business/),提高模型的预测准确性是行业的核心期望。为了支持行业工作的迭代和实验性质, [Domino](https://www.dominodatalab.com/) 联系了 Addison-Wesley Professional (AWP)以获得适当的许可,从 Mark E. Fenner 的书[Machine Learning with Python for every one](http://www.informit.com/store/machine-learning-with-python-for-everyone-9780134845623?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Fenner&utm_term=MLPython)中摘录了“调整超参数和管道”。AWP 提供了摘录工作的许可,并使我们能够提供一个补充的 [Domino 项目](https://try.dominodatalab.com/u/domino-andrealowe/Tuning-Hyperparameters-and-Pipelines/overview)来评估超参数,包括 GridSearch 和 RandomizedSearch。[项目](https://try.dominodatalab.com/u/domino-andrealowe/Tuning-Hyperparameters-and-Pipelines/overview)还包括为自动化 ML 工作流构建一个管道,请关注 Domino 数据科学博客上的其他超参数内容。
![Workspace in Domino Data Lab for Hyperparameters](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5382e8efffec27884cb8405fc3643686.png)
![Tuning Hyperparameters notebook in Domino](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/da6cf56d26c229a46af87b7b0fba7df9.png)
## 章节简介:调整超参数和管道
```py
# setup
from mlwpy import *
%matplotlib inline
iris = datasets.load_iris()
diabetes = datasets.load_diabetes()
digits = datasets.load_digits()
```
我们已经在本书的[一节中介绍了模型、参数和超参数。出于两个原因,我将再次提起它们。首先,我希望您看到(1)我们如何通过改变代码和参数以不同的方式编写简单的 Python 函数,以及(2)学习模型如何使用参数和超参数之间的具体类比。其次,我们将注意力转向选择好的超参数。当我们拟合一个模型时,我们选择了好的参数。我们需要某种定义明确的过程来选择好的超参数。我们将按两种类型的*搜索* — `GridSearch`和`RandomizedSearch`—投入使用。搜索是解决或优化问题的一种非常通用的方法。通常,搜索可以在数学上不太好的领域中工作。然而,不足为奇的是,这些答案并不能保证是绝对的最佳答案。相反,和启发式一样,我们希望答案足够好。](http://www.informit.com/store/machine-learning-with-python-for-everyone-9780134845623?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Fenner&utm_term=MLPython)
所有这些讨论将使我们处于一个有利的位置,更深入地研究如何构建多个学习组件首尾相连的*管道*。通常,正确使用管道需要我们为管道的组件找到好的超参数。因此,在没有讨论`sklearn` API 的搜索技术的情况下,过于深入地研究管道可能会导致我们养成坏习惯。我们不能这样!
## 11.1 模型、参数、超参数
如果您需要复习与模型、参数和超参数相关的术语,请回顾本书中的第 5.2 节[。我想用一个从非常原始的 Python 函数构建的具体类比来扩展这个讨论。开始了。制造机器(包括物理计算机和软件程序)的困难之一是,通常有不止一种方法。这里有一个简单的例子:](http://www.informit.com/store/machine-learning-with-python-for-everyone-9780134845623?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Fenner&utm_term=MLPython)
```py
def add_three(x):
return 3 + x
def add(x, y):
return x + y
add(10,3) == add_three(10)
```
```py
True
```
每当计算依赖于一个值时——在本例中为`3`——我们可以(1)硬编码该值,如在`add_three`中,或者(2)通过传递参数在运行时提供该值,如在`add(10.3)`中的`3`。我们可以将这个想法与我们的工厂机器学习模型及其旋钮联系起来。如果机器侧面有一个旋钮,我们可以在安装模型时调整该值。这个场景就像`add(x,y)`:即时提供信息。如果一个值在盒子里面——它是学习机的固定内部组件的一部分——那么我们就处在一个类似于`add_three(x)`的场景中:`3`是固定在*位置*的代码部分。当我们安装这个特殊的学习机时,我们不能调整那个组件。
这是另一种构造三加的方法。我们可以创建一个返回函数的函数。我真心希望我没有让你头疼。我们的方法是将一个*内部*组件的值传递给函数生成器。当函数生成器构造一个我们想要使用的新函数时,它将使用这个内部值。这个场景就像是建造一台工厂机器的过程。在制造机器的过程中,我们可以组合任意数量的内部齿轮、部件和小发明。它建成后,就完成了,固定了,具体了,坚固了;我们不会再对它的内部进行任何修改。
下面是一些代码:
```py
def make_adder(k):
def add_k(x):
return x + k
return add_k
# a call that creates a function
three_adder = make_adder(3)
# using that created function
three_adder(10) == add_three(10)
```
```py
True
```
所以,好消息是它*起作用了*。坏消息可能是你不知道为什么。我们来分解一下第 7 行发生了什么:`three_adder = make_adder(3)`。当我们调用`make_adder(3)`时,我们启动了通常的函数调用机制。`3`与`make_adder`中的`k`联系在一起。然后,我们在 things 中执行代码:用函数 *stuff* 定义名称,然后返回步骤就像一个只有两行的函数:`m=10`,然后我们定义一个名称`add_k`,它的值是一个函数,而不仅仅是一个简单的`int`。
好,那么定义`add_k`是什么意思?它是一个参数`x`的函数。传入的任何值都将被添加到传入 make_adder 的`k`值中。但是这个细节永远不会给 x 增加任何东西。从它的角度来看,`k`是一个永远不变的值。获得不同的`add_k`的唯一方法是再次调用`make_adder`并创建一个*不同的*函数。
让我们总结一下从`make_adder`中得到的信息:
* 返回的*东西*(严格来说是 Python 对象)是一个有一个参数的函数。
* 当调用返回的函数时,它(1)计算`k`加上调用它的值,并且(2)返回那个值。
让我们把这与我们的学习模型联系起来。当我们说`KNeighborsClassifer(3)`时,我们正在做类似于`make_adder(3)`的事情。它给了我们一个具体的对象,我们可以把一个`3`放进它的配方里。如果我们想拥有 5-NN,我们需要一个新的学习机,用不同的调用来构造:`KNeighborsClassifer(5)`,就像构造一个`five_adder`需要调用`make_adder(5)`。现在,在`three_adder`的情况下,你可能会对我大喊,“用`add(x,y)`,笨蛋!”没关系,我没有被冒犯。我们可以做到。
但是在 *k* -NN 的情况下,我们不能。算法的设计方式,在内部是不允许的。
我们的外卖信息是什么?我引出了固定行为和参数驱动行为的概念来说明以下几点:
1. 在我们创建一个模型之后,我们不会修改学习机的内部状态。我们可以修改旋钮的值,以及我们使用侧面输入托盘(如我们在第 1.3 节中所见)向其输入的内容(见本书中的[)。](http://www.informit.com/store/machine-learning-with-python-for-everyone-9780134845623?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Fenner&utm_term=MLPython)
2. 训练步骤为我们提供了首选旋钮设置和输入托盘内容。
3. 如果我们不喜欢训练后的测试结果,我们可以*也可以*选择一个完全不同的内部结构不同的学习机。我们可以选择完全不同类型的机器。我们可以从 *k* -NN 转换到线性回归。或者,我们可以保持在相同的学习机器类别中,并改变一个超参数:从 3-NN 切换到 5-NN。这是从 5.2.2.1 区选择模型的过程。[书中。](http://www.informit.com/store/machine-learning-with-python-for-everyone-9780134845623?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Fenner&utm_term=MLPython) ]
## 11.2 调整超参数
现在让我们看看*如何在 sklearn 的帮助下*选择好的超参数。
## 11.2.1 计算机科学和学习术语注释
不幸的是,在计算机科学术语中,当我们描述进行函数调用的过程时,术语*参数*和*参数*经常互换使用。然而,在最严格的意义上,它们有更具体的含义:实参是传递给调用的实际值,而参数是在函数中接收值的*占位符*。为了澄清这些术语,一些技术文档使用实际变量/参数和形式变量/参数的名称。我们为什么关心?因为当我们开始谈论调整*超参数*时,你很快就会听到人们谈论*参数调整*。然后你会认为我一直在骗你关于由*超参数*选择设置的内部工厂机器组件和由参数优化设置的*外部工厂机器组件(旋钮)之间的区别。*
在本书中,我专门用术语*争论*来形容计算机科学的生物。这是为了避免与机器学习*参数*和*超参数*术语冲突。我将继续使用参数(在培训期间优化)和*超参数*(通过交叉验证进行调整)。请注意,`sklearn`文档和函数参数名称通常(1)将超参数缩写为`param`或者(2)使用计算机科学意义上的参数。在*或者*的情况下,在下面的代码中,我们将讨论学习构造函数的实际参数——比如在 *k* -NN 机器中为`k=3`指定一个值。机器学习的说法是,我们将 *k* -NN 的超参数设置为`3`。
## 11.2.2 完整搜索示例
为了避免过于抽象,我们来看一个具体的例子。有许多可以调用的参数。大多数参数都是超参数,控制我们创建的`KNeighborsClassifier`的内部操作。他们在这里:
```py
knn = neighbors.KNeighborsClassifier()
print(" ".join(knn.get_params().keys()))
```
```py
algorithm leaf_size metric metric_params n_jobs n_neighbors p weights
```
除了`n_neighbors`之外,我们还没有深入研究过这些。在我们的 *k* -NN 学习模型中,`n_neighbors`参数控制着 *k* 。你可能记得最近邻的一个关键问题是决定不同例子之间的距离。这些由`metric`、`metric_params`和`p`的一些组合精确控制。`weights`决定邻居如何组合自己得出最终答案。
## 11.2.2.1 评估单个超参数
在 5.7.2 节【书中的[】](http://www.informit.com/store/machine-learning-with-python-for-everyone-9780134845623?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Fenner&utm_term=MLPython)中,我们手动经历了比较 *k* 、`n_neighbors`几个不同值的过程。在我们进入更复杂的例子之前,让我们用来自`GridSearch`的一些内置的`sklearn`支持来重做那个例子。
```py
param_grid = {"n_neighbors" : [1,3,5,10,20]}
knn = neighbors.KNeighborsClassifier()
# warning! this is with accuracy
grid_model = skms.GridSearchCV(knn,
return_train_score=True,
param_grid = param_grid,
cv=10)
grid_model.fit(digits.data, digits.target)
```
```py
GridSearchCV(cv=10, error_score='raise-deprecating',
estimator=KNeighborsClassifier(algorithm='auto',
leaf_size=30,
metric='minkowski',
metric_params=None,
n_jobs=None, n_neighbors=5,
p=2, weights='uniform'),
fit_params=None, iid='warn', n_jobs=None,
param_grid={'n_neighbors': [1, 3, 5, 10, 20]},
pre_dispatch='2*n_jobs', refit=True, return_train_score=True,
scoring=None, verbose=0)
```
幸运的是,`skms.GridSearchCV`的结果是*只是一个模型*,所以你已经知道如何让它运行:在它上面调用`fit`。现在,它将花费大约五倍于单个 *k* -NN 运行的时间,因为我们正在为 k 的五个值运行它。`fit`的结果是一个非常庞大的 Python 字典。它包含每个超参数组合和交叉验证回合的条目。好在可以用`pd.DataFrame(grid_model.cv_results_)`快速转换成`DataFrame`。
```py
# many columns in .cv_results_
# all params are also available in 'params' column as dict
param_cols = ['param_n_neighbors']
score_cols = ['mean_train_score', 'std_train_score',
'mean_test_score', 'std_test_score']
# look at first five params with head()
df = pd.DataFrame(grid_model.cv_results_).head()
display(df[param_cols + score_cols])
```
![dataframe of training scores](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6d44a82eff9697fe9990b4708b7be6d5.png)
我们可以挑选出一些感兴趣的列,并通过我们操作的参数对数据帧进行索引。
```py
# subselect columns of interest:
# param_* is a bit verbose
grid_df = pd.DataFrame(grid_model.cv_results_,
columns=['param_n_neighbors',
'mean_train_score',
'mean_test_score'])
grid_df.set_index('param_n_neighbors', inplace=True)
display(grid_df)
```
![n neighbors train and test scores](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/caabef1e063b5259032f39d39909a86c.png)
我们也可以用图形来查看:
```py
ax = grid_df.plot.line(marker='.')
ax.set_xticks(grid_df.index);
```
![graph of training scores](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/859400e5e4162aca1d0412db6f4d8464.png)
这种方法的一个好处是——相对于我们在第 5 章中手工做的——我们不需要手工管理任何结果收集。当我们开始尝试处理多个超参数时,最大的好处就来了。
## 多个超参数的 11.2.2.2 评估
即使是简单的 *k* -NN 模型,也有相当多的可能性。如果你看一下文档,你会发现`n_neighbors`和`p`仅仅是整数。我们可以尝试不同数值的*。请记住,我们需要管理所有这些组合的训练和测试集,这是一个全面的交叉验证过程。否则,我们会冒着用一些特定的超参数过度拟合数据的风险,因为我们从未在新数据上评估过它们。*
*如果我们手动尝试一个有三个参数的模型,它可能看起来像下面这样:
```py
def best_model_hyper_params(make_a_model,
some_hyper_params,
data):
results = {}
for hyper_params in it.combinations(some_hyper_params):
for train,test in make_cv_split(data):
model = make_a_model(*hyper_params).fit(train)
key = tuple(hyper_params)
if key not in results:
results[key] = []
results[key].append(score(test, model.predict(test)))
# or, rock stars can use this instead of the prior 4 lines:
# (results.setdefault(tuple(hyper_params), [])
# .append(score(test, model.predict(test)))
best_hp = max(results, key=results.get)
best_model = make_a_model(*best_hp).fit(data)
return best_model
def do_it():
model = pick_a_model # e.g., k-NN
some_hyper_params = [values_for_hyper_param_1, # e.g., n_neighbors=[]
values_for_hyper_param_2,
values_for_hyper_param_3]
best_model_hyper_params(model_type,
some_hyper_params,
data)
```
幸运的是,评估超参数是设计和构建学习系统的常见任务。因此,我们不必自己编写代码。假设我们想要尝试这些超参数的所有组合:
![Hyperparameter and values](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a20d78ed0fb7b6658a318d4f2abc5ff0.png)
两个音符:
1. *距离*意味着我的邻居的贡献通过它离我的距离来加权。*统一*意味着我所有的邻居都被认为是一样的,没有加权。
2. `p`是构造函数的参数。我们在第二章的笔记中简要地看到了它。只知道 p = 1 是曼哈顿距离( *L*[1] -like), *p =* 2 是欧氏距离( *L*[2] -like),更高的 ps 接近一种叫做无穷范数的东西。
下面的代码执行设置,为一个 *k* -NN 模型尝试这些可能性。它不会进入实际的处理过程。
```py
param_grid = {"n_neighbors" : np.arange(1,11),
"weights" : ['uniform', 'distance'],
"p" : [1,2,4,8,16]}
knn = neighbors.KNeighborsClassifier()
grid_model = skms.GridSearchCV(knn, param_grid = param_grid, cv=10)
```
这段代码将比我们之前用`GridSearch`在`kNN`上调用`fit`的时间长一点,因为我们要拟合 10 × 2 × 5 × 10 = 200 个模型(最后 10 个来自交叉验证步骤中的多次拟合)。但好消息是所有的脏活都是为我们管理的。
```py
# digits takes ~30 mins on my older laptop
# %timeit -r1 grid_model.fit(digits.data, digits.target)
%timeit -r1 grid_model.fit(iris.data, iris.target)
```
```py
1 loop, best of 1: 3.72 s per loop
```
调用`grid_model.fit`后,我们有一大篮子结果可以调查。这可能有点难以应付。一个小熊猫——傅可以让我们得到我们可能感兴趣的东西:哪些模型——也就是哪组超参数——表现最好?这一次,我将以稍微不同的方式提取值:
```py
param_df = pd.DataFrame.from_records(grid_model.cv_results_['params'])
param_df['mean_test_score'] = grid_model.cv_results_['mean_test_score']
param_df.sort_values(by=['mean_test_score']).tail()
```
![n neighbor weight and mean test scores](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/d4cc27cb4d3b59ba69532c95cd85eb94.png)
我特别想看看几个最佳结果,而不仅仅是一个最佳结果,因为通常情况下,有几个模型具有相似的性能。这个启发在这里也适用——而且,当你看到这个,你会知道不要太投入在一个单一的“最佳”分类器上。然而,在某些情况下,肯定会有明显的赢家。
我们可以使用 fit `grid_model`上的属性来访问最佳模型、其参数和总得分。关于结果的一个非常重要和微妙的警告:这是一个使用最佳超参数创建的新模型,然后重新适应整个数据集。不相信我?从`refit`参数下的`sklearn`单据到`GridSearchCV`:
改装后的估算器在`best_estimator_`属性可用,并允许在这个`GridSearchCV`实例上直接使用`predict`。
所以,我们可以看看网格搜索过程的结果:
```py
print("Best Estimator:", grid_model.best_estimator_,
"Best Score:", grid_model.best_score_,
"Best Params:", grid_model.best_params_, sep="\n")
```
```py
Best Estimator:
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=8, p=4,
weights='uniform')
Best Score:
0.98
Best Params:
{'n_neighbors': 8, 'p': 4, 'weights': 'uniform'}
```
该过程(1)使用`GridSearch`找到好的超参数,然后(2)在整个数据集上训练用这些超参数构建的单个模型。我们可以将这个模型用于其他新的数据,并进行最终的坚持测试评估。
这里简单介绍一下`GridSearchCV`使用的随机化。关于对`KFold`和朋友使用`shuffle` -ing,`sklearn`文档强调:
`random_state`参数默认为`None`,这意味着每次`KFold(..., shuffle=True)`迭代时洗牌都会不同。然而,`GridSearchCV`将对通过对其`fit`方法的单次调用验证的每组参数使用相同的洗牌。
一般来说,我们想要这种相同性。我们想要比较参数,而不是可能的交叉验证数据分割的随机样本。
## 11.2.3 利用随机性大海捞针
如果我们有许多超参数,或者如果单个超参数的可能值范围很大,我们可能无法穷尽所有可能性。感谢随机化的美妙,我们可以用不同的方式进行。我们可以指定超参数的*随机组合*——比如一副牌的不同处理方式——并要求尝试其中的一些。有两种方法可以指定这些。一种是通过提供一个值列表;这些都是统一采样的,就像滚骰子一样。另一个选项有点复杂:我们可以利用`scipy.stats`中的随机分布。
不必深究,以下是你可以考虑的四个具体选项:
* 对于您更喜欢较小值而不是较大值的超参数,您可以尝试`ss.geom`。这个函数使用一个几何分布,它产生的正值下降得非常快。这是基于你在抛硬币时,要等多久才能看到正面。很久不见人头,可能性很小。
* 如果您想要均匀采样某个范围的值,例如,1 和 1 之间的任何值都应该与其他值一样可能,请使用`ss.uniform`
* `If you’d like to try hyperparameter values with a normal distribution, use `ss.normal`T1。`
`* 简单整数用`randint` 。`
``sklearn`使用`RandomizedSearchCV`执行超参数值的随机滚动。在内部,它使用了`.rvs(n)`方法,在你定义的东西上有一个`.rvs(n)`方法,你可以把它传递给`RandomizedSearchCV`被警告,我不对结果负责。
```py
import scipy.stats as ss
knn = neighbors.KNeighborsClassifier()
param_dists = {"n_neighbors" : ss.randint(1,11), # values from [1,10]
"weights" : ['uniform', 'distance'],
"p" : ss.geom(p=.5)}
mod = skms.RandomizedSearchCV(knn,
param_distributions = param_dists,
cv=10,
n_iter=20) # how many times do we sample?
# fitting 20 models
%timeit -r1 mod.fit(iris.data, iris.target)
print(mod.best_score_)
```
```py
1 loop, best of 1: 596 ms per loop
0.98
```
## 11.3 向下递归兔子洞:嵌套交叉验证
我最敏锐的读者——你可能是其中之一——可能正在思考一些事情。如果我们考虑*多个*可能的超参数集,我们会不会过度拟合它们?让我来打破这个惊喜:简单的回答是肯定的。但是你说,“那我们的坚持测试集呢?”事实上,年轻的蚱蜢,当我们看到我们坚持测试集的糟糕表现时,我们已经*输掉了游戏*。我们已经查看了最后的数据。我们需要一种替代方案来处理超参数调整中的过度拟合,并让我们深入了解估计值的可变性和稳健性。关于我们将如何做这件事,我给你两个提示。首先,`*Search`模型是*仅仅是*模型——我们可以像使用其他简单模型一样使用它们。我们给他们提供数据,让他们适应,然后用这些数据进行预测。其次,我们通过交叉验证解决了评估关于*参数*的性能可变性的问题。让我们试着结合这些想法:网格搜索作为一种模型,我们用交叉验证来评估。
让我们退后一分钟来清楚地定义这个问题。提醒一下,在我们开始考虑超参数和`*Search` ing 之前,这里是关于参数、训练和验证的设置。当我们在训练集上拟合一个常用模型(例如,3-NN 或 C = 1.0 的 SVM)并在验证集上评估它时,由于选择训练集和验证集的随机性,我们会有可变性。我们可能会挑选表现好或不好的组合。我们真正想知道的是我们期望在随机选择的一个上做什么。
这个场景类似于从一个班级中挑选一个学生,用她的身高代表整个班级。效果不会太好。然而,取班上许多学生身高的平均值是对随机选择的学生身高的一个更好的估计。在我们的学习案例中,我们采用了许多训练测试分割,并对其结果进行平均,以了解我们的系统在随机选择的训练测试分割上的表现。除此之外,我们*也*得到了可变性的度量。我们可能会看到性能结果的紧密聚集;在一些明显的赢家之后,我们可能会看到学习成绩急剧下降。
## 交叉验证,重复
现在,我们感兴趣的是将整个方法——整个`GridSearch`过程——包装在交叉验证中。这似乎有点令人吃惊,但图 11.1 应该有所帮助。它显示了我们通常在普通模型上使用的扁平简历的外观。如果我们决定我们喜欢模型的 CV 性能,我们可以返回并在所有非坚持数据上训练它。最终训练好的模型是我们将来用来做新预测的。
如果我们使用像线性回归(LR)这样的原始模型,或者使用从`GridSearch`得到的更复杂的模型作为我们交叉验证评估的模型,这没有区别。如图 11.2 所示,两者都简单地填写交叉验证运行的*模型*。然而,在引擎盖下发生的事情是完全不同的。
![Flat cross-validation on a generic model](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9ce244512d590ba74d699de7ff1e8923.png)
复杂的部分发生在`GridSearch`盒子里面。在一个盒子里,有一个完全独立的`fit`过程,由一组超参数构建的内部学习模型使用。如果我们称之为`GridSearchCV(LinearRegression)`,那么在盒子里面我们是拟合线性回归参数。如果我们调用`GridSearchCV(3-NN)`,那么在盒子内部我们正在构建邻居表,用于进行预测。但无论哪种情况,`GridSearchCV`的产出都是我们可以评估的模型。
## 11.3.2 作为模型的网格搜索
我们称之为适合的通常模型是*完全定义的*模型:我们挑选模型和超参数使其*具体化*。那么,当我们在一个`GridSearchCV`大型模型上调用`fit`时会发生什么呢?当我们在一个`LinearRegression`模型上调用 fit 时,我们得到一组内部参数权重的值,这些值是给定训练集时它们的首选最优值。当我们在一个 *k* -NN 的`n_neighbors`上调用`GridSearchCV`时,我们得到一个`n_neighbors`,它是给定训练数据的那个*超参数*的首选值。这两个人在不同的层面上做着同样的事情。
![Wrapping models in cross-validation](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/55244acdebbbc9cf36f9084ac7b6d448.png)
图 11.3 显示了双超参数网格搜索的图形视图,突出显示了该方法的输出:拟合模型和良好的超参数。它还展示了 CV 作为网格搜索的*内部*组件的使用。单个超参数的交叉验证导致对该超参数和模型组合的评估。反过来,比较几个这样的评估来选择优选的超参数。最后,首选超参数和所有输入数据用于训练(相当于我们通常的`fit`)最终模型。输出是一个合适的模型,就像我们调用了`LinearRegression.fit`一样。
![GridSearch](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cee3f91c5bd10c74bf89fdcbb938ef87.png)
## 11.3.3 交叉验证中嵌套的交叉验证
`*SearchCV`函数足够智能,可以对它们尝试的所有模型和超参数组合进行交叉验证(CV)。这份简历很棒:当我们拟合单个模型和超参数组合时,它保护我们免受应试教育。然而,这不足以保护我们不受`GridSearchCV` *本身*的检验。为此,我们需要将它放在自己的交叉验证包装器中。结果是一个*嵌套的交叉验证*。图 11.4 显示了 5 重外部交叉验证和 3 重内部交叉验证的数据分割。
![Nested cross-validation for GridSearch](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9e583a0a0c01ffccd75d12ce2d7c0be9.png)
外部简历用大写字母表示。内部 CV 分割线用罗马数字表示。外部 CV 的一个序列工作如下。利用从外部 CV 数据(B,C,D,E)的*部分*中选择的内部 CV 数据(I,II,III),我们通过 CV 找到一个好的模型,然后在外部 CV 数据(A)的*余数*上对其进行评估。好的模型——有其超参数的值——是一个单一的模型,适合所有的(I,II,III ),来自`grid_model.best_*`朋友。
我们可以在不走极端的情况下实现嵌套的交叉验证。假设我们在一个`GridSearch`内执行三重 CV——也就是说,每个模型和超参数组合被评估三次。
```py
param_grid = {"n_neighbors" : np.arange(1,11),
"weights" : ['uniform', 'distance'],
"p" : [1,2,4,8,16]}
knn = neighbors.KNeighborsClassifier()
grid_knn = skms.GridSearchCV(knn,
param_grid = param_grid,
cv=3)
```
正如在没有交叉验证的参数级别上发生的那样,现在我们无意中缩小了适用于该数据集的超参数的范围。为了消除这种窥视,我们可以用五层交叉验证的另一层将`GridSearchCV(knn)`包装在*中:*
```py
outer_scores = skms.cross_val_score(grid_knn,
iris.data, iris.target,cv=5)
printer(outer_scores)
```
```py
[0.9667 1\. 0.9333 0.9667 1\. ]
```
在我们的例子中,我们对 5 × 3 嵌套交叉验证策略(也称为*双交叉*策略)使用了 5 重重复的 3 重交叉验证。我选择这些数字是为了示例和图表的清晰。然而,嵌套 CV 最常见的建议是 5 × 2 交叉验证方案,这是由 Tom Dietterich 推广的。数字 5 和 2 并不神奇,但迪特里希确实为它们提供了一些实际的理由。为内部循环选择值 2,因为它使训练集不相交:它们根本不重叠。之所以选择值 5,是因为 Dietterich 发现,重复次数越少,数值的可变性——差异就越大,所以我们需要再重复几次,才能得到可靠的、可重复的估计值。如果超过五个,分裂之间会有太多的重叠,这会牺牲训练集之间的独立性,因此估计值会变得越来越相关。所以,5 是这两个竞争标准之间的一个折中。
## 嵌套 CV 的注释
为了理解刚刚发生的事情,让我扩展一下我之前在 11.2.2.2 部分写的`GridSearch`伪代码。
```py
def nested_cv_pseudo_code(all_data):
results = []
for outer_train, test in make_cv_split(all_data):
for hyper_params in hyper_parameter_possibilities:
for train, valid in make_cv_split(outer_train):
inner_score = evaluate(model.fit(train).predict(valid))
best_mod = xxx # choose model with best inner_score
preds = best_model.fit(outer_train).predict(test)
results.append(evaluate(preds))
```
让我回顾一下平面交叉验证的过程。学习的训练阶段设置参数,我们需要一个训练验证步骤来评估这些参数的性能。但是,实际上,我们需要交叉验证——多重训练验证分割——通过平均产生更好的估计,并评估这些估计的可变性。我们必须把这个想法延伸到我们的`GridSearch`。
当我们使用网格搜索来*选择*我们偏好的超参数值时,我们实际上是在确定——或者在不同的层面上,*优化*——那些超参数值。至少,我们需要网格搜索的训练验证步骤来评估这些结果。然而,实际上,我们希望对我们的整个过程的性能有一个更好的估计。我们也很想知道我们对结果有多确定。如果我们再做一次这个过程,我们会得到相似的结果吗?相似性可以是几个不同的方面:(1)预测相似吗?(2)整体表现相似吗?(3)选取的超参数是否相似?(4)不同的超参数导致相似的性能结果吗?
在嵌套交叉验证中,外部交叉验证告诉我们*当我们通过网格搜索选择超参数时,我们可以预期的可变性*。这类似于通常的交叉验证,它告诉我们当我们估计参数时,在不同的训练测试分割中性能如何变化。
正如我们不使用交叉验证来确定模型的*参数*——这些参数由 CV 中的训练步骤设置——我们不使用`GridSearch`的外部交叉验证来挑选最佳超参数。最佳超卷在`GrideSearch`内部确定。CV 的外层只是给我们一个更真实的估计,当我们在最终模型中使用这些内层选择的超参数时,它们会如何。
嵌套交叉验证的实际应用远比试图将其概念化简单。我们可以使用嵌套 CV:
```py
param_grid = {"n_neighbors" : np.arange(1,11),"weights" : ['uniform', 'distance'],
"p" : [1,2,4,8,16]}
knn = neighbors.KNeighborsClassifier()
grid_knn = skms.GridSearchCV(knn,
param_grid = param_grid,cv=2)
outer_scores = skms.cross_val_score(grid_knn,
iris.data,
iris.target,
cv=5)
# how does this do over all??
print(outer_scores)
```
```py
[0.9667 0.9667 0.9333 0.9667 1\. ]
```
这些值向我们展示了当我们随机分割数据并将其传递到较低级别的超参数和参数计算中时,我们可以预期的学习性能。重复几次可以让我们知道我们可以期待的答案。反过来,这告诉我们估计值的*变量*可能是多少。现在,我们实际上可以根据来自`GridSearchCV`的参数训练我们的首选模型:
```py
grid_knn.fit(iris.data, iris.target)
preferred_params = grid_knn.best_estimator_.get_params()
final_knn = neighbors.KNeighborsClassifier(**preferred_params)
final_knn.fit(iris.data, iris.target)
```
```py
KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=None, n_neighbors=7, p=4,
weights='distance')
```
我们对其性能的估计是基于我们刚刚执行的外部 5 重 CV。我们现在可以在新的数据上使用`final_knn`和`predict`,但是我们应该先花点时间将它们指向一个坚持测试集(参见练习)。
## 管道
我们在特征工程中最大的限制之一——我们在本书第 10 章中的任务——是组织计算和遵守不为测试而教的规则。幸运的是,管道让我们可以做到这两点。我们在第 7.4 节对管道做了简要介绍。在这里,我们将查看管道的更多细节,并展示它们如何与网格搜索集成。
如果我们回到工厂的类比,我们很容易想象把一台机器的输出和下一台机器的输入连接起来。如果这些组件中的一些是特征工程步骤(如在第 10 章中)[ [在本书](http://www.informit.com/store/machine-learning-with-python-for-everyone-9780134845623?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Fenner&utm_term=MLPython)中),我们就有了一个非常自然的传送带。传送带方便地将样品从一个步骤移到下一个步骤。
## 简单的管道
在最简单的例子中,我们可以从多个模型和转换器中创建学习组件的管道,然后使用该管道作为模型。`make_pipeline`把它变成一行程序:
```py
scaler = skpre.StandardScaler()
logreg = linear_model.LogisticRegression()
pipe = pipeline.make_pipeline(scaler, logreg)
print(skms.cross_val_score(pipe, iris.data, iris.target, cv=10))
```
```py
[0.8 0.8667 1\. 0.8667 0.9333 0.9333 0.8 0.8667 0.9333 1\. ]
```
如果我们使用方便的`make_pipeline`,管道中步骤的名称是从步骤的`__class__`属性构建的。比如说:
```py
def extract_name(obj):
return str(logreg.__class__).split('.')[-1][:-2].lower()
print(logreg.__class__)
print(extract_name(logreg))
```
```py
< class 'sklearn.linear_model.logistic.LogisticRegression'>
logisticregression
```
名称被转换成小写,仅保留最后一个`.`后的字母字符。由此产生的名称就是我们在这里看到的`logisticregression`:
```py
pipe.named_steps.keys()
dict_keys(['standardscaler', 'logisticregression'])
```
如果我们想自己命名这些步骤,我们使用更加可定制的`Pipeline`构造函数:
```py
pipe = pipeline.Pipeline(steps=[('scaler', scaler),
('knn', knn)])
cv_scores = skms.cross_val_score(pipe, iris.data, iris.target,
cv=10,
n_jobs=-1) # all CPUs
print(pipe.named_steps.keys())
print(cv_scores)
```
```py
dict_keys(['scaler', 'knn'])
[1\. 0.9333 1\. 0.9333 0.9333 1\. 0.9333 0.9333 1\. 1\. ]
```
一个`Pipeline`可以像任何其他`sklearn`模型一样使用——我们可以用它来`fit`和`predict`,我们可以把它传递给 sklearn 的一次胜利。这个公共界面是`sklearn`的头号胜利。
## 更复杂的管道
随着我们向学习任务添加更多步骤,我们从使用管道中获得更多好处。让我们举一个例子,我们有四个主要的处理步骤:
* 将数据标准化,
* 创建特征之间的交互术语,
* 将这些特征离散化为大-小,以及
* 对生成的要素应用学习方法。
如果我们必须手动管理这一切,结果将会是一堆杂乱无章的代码,除非我们是一流的程序员。让我们看看如何使用管道。
这是我们在第 10.6.3 节开发的简单大小离散化器:
```py
from sklearn.base import TransformerMixin
class Median_Big_Small(TransformerMixin):
def __init__(self):
pass
def fit(self, ftrs, tgt=None):
self.medians = np.median(ftrs)
return self
def transform(self, ftrs, tgt=None):
return ftrs > self.medians
```
我们可以将它与其他预构建的`sklearn`组件一起插入到我们的管道中:
```py
scaler = skpre.StandardScaler()
quad_inters = skpre.PolynomialFeatures(degree=2,
interaction_only=True,
include_bias=False)
median_big_small = Median_Big_Small()
knn = neighbors.KNeighborsClassifier()
pipe = pipeline.Pipeline(steps=[('scaler', scaler),
('inter', quad_inters),
('mbs', median_big_small),
('knn', knn)])
cv_scores = skms.cross_val_score(pipe, iris.data, iris.target, cv=10)
print(cv_scores)
```
```py
[0.6 0.7333 0.8667 0.7333 0.8667 0.7333 0.6667 0.6667 0.8 0.8 ]
```
我不会对这些结果做太多评论,但我鼓励你们将这些结果与我们应用于虹膜问题的一些更简单的学习系统进行比较。
## 11.5 管道和调谐在一起
当我们的学习系统不是一个单一的组件时,使用自动化——`*SearchCV`方法来调整超参数的最大好处就显现出来了。随着多个组件的出现,我们可以调整多组超参数。手动管理这些将会非常混乱。幸运的是,管道与`*SearchCV`方法配合得很好,因为它们只是另一个(多组件)模型。
在上面的管道中,我们有点武断地决定使用二次项——像 xy 这样的二次多项式——作为模型的输入。让我们使用交叉验证来为我们的多项式选择一个好的次数,而不是从帽子里挑出一个。这里的主要难点是我们必须在想要设置的参数之前加上`pipelinecomponentname__`。这是组件的名称,后跟两个下划线。除此之外,网格搜索的步骤是相同的。我们创建管道:
```py
# create pipeline components and pipeline
scaler = skpre.StandardScaler()
poly = skpre.PolynomialFeatures()
lasso = linear_model.Lasso(selection='random', tol=.01)
pipe = pipeline.make_pipeline(scaler,
poly,
lasso)
```
我们指定超参数名称和值,以管道步骤名称为前缀:
```py
# specified hyperparameters to compare
param_grid = {"polynomialfeatures__degree" : np.arange(2,6),
"lasso__alpha" : np.logspace(1,6,6,base=2)}
```
从 pprint 导入 pprint 作为 pp
pp(param_grid)
```py
{'lasso__alpha': array([ 2., 4., 8., 16., 32., 64.]),
'polynomialfeatures__degree': array([2, 3, 4, 5])}
```
我们可以使用常规的`fit`方法来拟合模型:
```py
# iid to silence warning
mod = skms.GridSearchCV(pipe, param_grid, iid=False, n_jobs=-1)
mod.fit(diabetes.data, diabetes.target);
```
管道中的每一步都有结果:
```py
for name, step in mod.best_estimator_.named_steps.items():
print("Step:", name)
print(textwrap.indent(textwrap.fill(str(step), 50), " " * 6))
```
```py
Step: standardscaler
StandardScaler(copy=True, with_mean=True,
with_std=True)
Step: polynomialfeatures
PolynomialFeatures(degree=2, include_bias=True,
interaction_only=False)
Step: lasso
Lasso(alpha=4.0, copy_X=True, fit_intercept=True,
max_iter=1000, normalize=False, positive=False,
precompute=False, random_state=None,
selection='random', tol=0.01, warm_start=False)
```
我们只对我们考虑的参数的最佳值感兴趣:
```py
pp(mod.best_params_)
```
```py
{'lasso__alpha': 4.0, 'polynomialfeatures__degree': 2}
```
## 11.6 EOC 总结
我们现在已经解决了构建更大的学习系统的两个遗留问题。首先,我们可以构建多个模块化组件协同工作的系统。其次,我们可以系统地评估超参数,并选择好的参数。我们可以用一种非为测试而教的方式来做评估。
### 注释
我们的函数定义了一个函数并设置了`k`的值,这是一个*闭包*的例子。当我们填写`k`时,我们就合上了定义`add_k`的书:`add_k`已经设置好,并准备好作为一个参数`x`的明确定义的函数。
关于洗牌的细节以及如何与`GridSearch`交互的笔记来自[http://sci kit-learn . org/stable/modules/cross _ validation . html # a-note-on-shuffling](http://scikit-learn.org/stable/modules/cross_validation.html#a-note-on-shuffling)。
有一些关于交叉验证的很好的参考,超出了通常的教科书陈述:
* *Dietterich 用于比较监督分类学习算法*的近似统计测试
* Arlot 和 Celisse 对模型选择交叉验证程序的调查。交叉验证
* *统计预测的选择和评估*由斯通
性能评估最有趣和令人困惑的一个方面是,我们正在评估一个系统的性能。因为我们是在估计——就像我们的学习模型是通过拟合训练数据集来估计的——我们的估计会受到偏差和方差的影响。这意味着在拟合模型中出现的同样的问题也适用于评估性能。这比我想在这本书里学到的要多一点,但是如果你感兴趣的话,考利和塔尔博特的*关于模型选择中的过度拟合和随后的性能评估中的选择偏差*正面解决了这个问题。
### 练习
1. 使用线性回归,研究我们在 CV 褶皱上构建模型和在整个数据集上构建模型时看到的最佳参数之间的差异。您也可以尝试使用简单的模型来计算这些 CV 折叠和整个数据集的平均值。
2. 从第八章或第九章中挑选一个你感兴趣的例子,用适当的超参数估计重做它。你可以用第 10 章的一些特征工程技术做同样的事情。
3. 你可以想象,对于 10 倍的数据,我们可以将它们分成 1 × 10、5 × 2 或 2 × 5。执行每个场景并比较结果。资源成本有什么大的区别吗?作为结果,我们得到的度量的可变性如何呢?之后,在[https://www3.nd.edu/~nchawla/papers/ICDM10.pdf](https://www3.nd.edu/~nchawla/papers/ICDM10.pdf)检查分类器性能评估可变性的后果。
4. 您可能已经注意到,我没有保存嵌套交叉验证示例中的拒绝测试集(第 11.3 节)。所以,我们真的没有对我们在那里开发的系统进行独立的、最终的评估。将我们在第 11.3 节中构建的整个过程包装在一个简单的训练测试分割中,以解决这个问题。`*
# Python 迁移学习实践教程
> 原文:<https://www.dominodatalab.com/blog/transfer-learning-in-python>
拟合复杂的神经网络模型是一个计算量很大的过程,需要访问大量数据。在本文中,我们介绍了迁移学习-一种利用预训练模型的方法,它加快了拟合速度,并消除了处理大量数据的需要。我们为 NLP 和计算机视觉用例提供迁移学习的指导,并通过拥抱脸展示迁移学习的简单实现。
## 介绍
机器学习方法的不断发展和改进正在推动一场新的工业革命。这对生活的各个方面都产生了重大影响,并可能产生类似于工业革命期间所观察到的那种深远影响。然而,目前的模型拟合方法仅用于增强人类的学习能力,而不是模仿人类的智力[1]。
为了能够对看不见的数据进行推理,机器学习算法需要从已知数据中学习并严重依赖它。例如,在分类任务中,需要将带注释的数据分成训练和测试子集。前者的特征向量用于训练模型,后者用于测试训练后的模型在未知数据上的性能。数据集可以由一个或多个类别组成,并且必须对属于训练子集中存在的类别的看不见的数据执行推断。
让我们举一个例子来阐明上述观点。我们有一个水果图像的数据集,分为 3 类,包括苹果、香蕉和柚子。为了训练能够准确分类的模型,该数据集将被分成训练和测试子集,样本比率分别为 70%和 30%。训练所选择的机器学习算法,并测量性能以确保高精度和低误差。可以使用最佳的[超参数](https://www.dominodatalab.com/blog/hyperopt-bayesian-hyperparameter-optimization)来改进训练的模型。完成训练后,该模型已经学会了如何成功地对三类水果图像进行分类。下一步是探索模型在测试图像上的性能,这些图像是模型在此之前没有见过的。最后,该模型可以部署到生产中。
[深度学习神经网络](https://www.dominodatalab.com/blog/deep-learning-introduction)的进步已经允许学习性能的显著改善,导致它们在包括[计算机视觉](https://www.dominodatalab.com/blog/what-is-computer-vision)在内的一些领域占据主导地位。神经网络[2,3]以特征向量的形式利用数据,并且它们的操作松散地模拟从其他神经元接收多个输入的生物神经元。如果输入的总和超过一个定义的阈值,神经元将向下一个神经元发送信号。在基本的人工神经网络中,分层排列的神经元(节点)连接到下一层的神经元。对于每个输入,分配一个初始随机权重,随后通过误差反向传播进行修改。这种情况一直持续到模型能够熟练预测未知样本的类别[4]。
尽管取得了这些进步,但机器学习方法的广泛采用仍然存在许多主要障碍。机器学习模型通常局限于一项任务和一个领域,可能会遭受灾难性的遗忘[5]。在许多情况下,训练模型需要大型的带注释的数据集,这在某些领域(例如医学领域)中可能并不总是可用的。此外,在多类别分类中,类别不平衡带来了额外的挑战。此外,由于输入要素和要素分布的差异,在一个数据集上训练的模型在另一个数据集上可能表现不佳。
不管数据集的大小如何,也很难将所有类别都包含在一个数据集中。在上面描述的水果示例中,模型被训练为对 3 种水果进行分类,而世界上有 2000 多种水果。在其他类型的数据集中,这成为一个更大的问题,例如,描述的昆虫物种的数量约为 91,000。创建覆盖所有昆虫物种的带注释的数据集将是非常复杂和费力的工作。
总之,尽管智能机器的想法并不新鲜,并且机器智能可以变得与人类智能相同的假设是人工智能的核心,但当今的人工智能并没有复制生物大脑能够具备的智能和学习能力。例如,教一个孩子识别苹果和橘子是一件很简单的事情,即使没有这些物体的视觉呈现,也是可以教会的。例如,可以描述形状、颜色和其他属性,以使儿童能够使用这些语义描述来区分橙子和香蕉。这可以通过其他方法实现,包括强化学习,不仅在人类中,而且在其他物种中,鸽子能够在 200 个小样本上区分癌组织和健康组织[6]。
长期的解决方案是让 AI 模型像人类一样进行智能学习。与此同时,新的机器学习方法已经被开发出来,以减少模型训练对数据的依赖,包括迁移学习和少量学习。
## 迁移学习
使用大型数据集从头开始训练复杂的神经网络需要访问高端计算资源、CPU 集群和[GPU](https://www.dominodatalab.com/blog/machine-learning-gpu),因为训练过程在计算上非常昂贵【7,8】。此外,即使访问计算资源不是一个障碍,用于模型训练的大数据集的可用性也不总是一个选项。
为了避免这些问题,并利用神经网络的能力,一种简单的方法是利用日益流行的传递函数方法。该函数允许使用来自预训练模型的权重来构建新模型,该预训练模型已经在一个任务(例如,分类)和一个数据集(例如,作为最大的开源数据集之一的 ImageNet)上被训练过,并且允许在类似的任务和不可见的数据集上使用新模型。
[迁移学习](https://www.dominodatalab.com/blog/guide-to-transfer-learning-for-deep-learning)背后的直觉是,如果两个问题中的数据集包含相似的数据点,它们的特征表示也是相似的,因此从一个训练中获得的权重可以用于解决后续的类似问题,而不是使用随机权重和从头开始的模型训练。预训练模型可以更快地适应第二个任务,因为它们已经包含来自第一个任务的训练权重。除了模型在先前训练期间已经学习的那些特征之外,预训练的模型可以被直接使用或利用来提取特征。还可以修改预训练的模型,以结合旨在获得更高性能的新层,或者围绕数据集塑造模型。
许多不同的预训练架构(例如,卷积神经网络;CNN)可以通过迁移学习来使用。性能最好的架构之一是 ResNet 在 ImageNet 和包括 CIFAR-10 数据集在内的其他数据集上进行开发和培训。该模型利用剩余连接,该剩余连接允许身份变换层在特征被再次添加在一起之前跳过已学习的变换层。这些连接和批量标准化一起减轻了消失和爆炸梯度的问题[9]。
迁移学习的一个缺点是,在第一项任务中学习的特征可能对第二项任务不够具体,因此伴随的权重不会导致第二项任务的高性能。例如,只有当两个任务的数据集的图像特征相似时,经过训练以识别特定类型图像的模型才能被重新用于成功分类其他图像[10,11]。在接下来的两节中,我们将提供自然语言处理和计算机视觉中迁移学习的简单示例。
### 自然语言处理中的迁移学习
许多风险投资公司提供预先训练的模型,其中一个是 2017 年推出的[拥抱脸](https://huggingface.co/)。他们的重点是 NLP 任务,他们的库建立在 PyTorch 和 TensorFlow 上,并提供各种资源,包括对数据集和转换器的访问。后者是利用预先训练的 NLP 模型的简单方法。一个流行的 NLP 模型是 BERT(变压器的双向编码器表示),它采用双向方法,允许模型一次性考虑整个单词序列[12]。
我们将使用拥抱脸进行情感分析。首先,如果环境中没有变压器,我们将安装变压器:
```py
!pip install transformers
```
在典型的 NLP 管道中,采取几个步骤来预处理和准备数据,以训练和微调模型。拥抱脸提供了用几行代码执行所有这些步骤的管道。本质上,管道由一个标记器和一个模型组成,用于对输入文本执行任务。
下面,我们将在这篇文章中使用 BERT 进行情感分析:“迁移学习可以帮助克服与机器学习中过度依赖数据相关的问题”。
```py
#importing pipeline
from transformers import pipeline
```
管道将下载并缓存一个默认的预训练模型(distil Bert-base-un cased-fine tuned-SST-2-English)和一个用于情感分析的标记器。然后,我们可以对输入文本使用分类器:
```py
# Initialising the pipeline with default model
classifier = pipeline('sentiment-analysis')
# Performing sentiment analysis on below text
classifier('Transfer learning can help overcome issues related to over-reliance on data in machine learning')
```
上面的管道产生标签“正”和“分数”0.908。我们可以在分类器中定义一个模型并执行分析。下面我们就用“情操-罗伯塔-大-英语”[13]。
```py
#Initialising the pipeline with the selected model
classifier = pipeline('sentiment-analysis', mode='siebert/sentiment-roberta-large-english')
# Performing sentiment analysis on below text
classifier('Transfer learning can help overcome issues related to over-reliance on data in machine learning')
```
上面的管道产生一个标签“正”和一个“分数”0.998。与默认模型相比,这是一个微小的改进。
###
计算机视觉的迁移学习
预训练模型可用于进行预测、提取特征和微调。这里,我们将使用 ResNet50 预训练模型对一个示例图像进行分类。这是一个 50 层深度的卷积神经网络,对 ImageNet 数据库中的 100 多万张图像进行了训练。它可以将图像分为 1000 类,包括许多物体和动物[9]。
我们将使用 [Keras](https://www.dominodatalab.com/blog/deep-learning-illustrated-building-natural-language-processing-models) 库来实现 ResNet50 的迁移学习:
```py
#Importing required libraries
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
```
接下来,我们将定义一个基础模型并定义预训练权重:
```py
model = ResNet50(weights='imagenet')
```
随后可以对示例图像执行分类,并打印和显示结果:
```py
img_path = 'Resources/tiger.jpg'
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
preds = model.predict(x)
# Showing the image with prediction
plt.figure(figsize=(15,10))
img_bgr = cv2.imread(img_path, 1)
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb);
plt.title('Prediction using ResNet50 pre-trained model: {}'.format(decode_predictions(preds, top=1)[0]));
```
![Prediction using ResNet50 pre-trained model. The result correctly identifies a tiger in the image.](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2f86dc89f02e91bda09469f4f9b390b6.png)
图一。使用 ResNet50 预训练模型进行预测。结果正确地识别了图像中的老虎。
## 摘要
在本文中,我们研究了迁移学习——一种机器学习技术,它重用为一项任务开发的完整模型,作为新模型完成新任务的起点。第一个模型使用的知识因此被转移到第二个模型。
在训练新模型时,迁移学习可以加快进度并提高性能,因此,当计算基础架构的访问权限有限且拟合模型的时间至关重要时,迁移学习非常有吸引力。
在接下来的文章中,我们将关注 [N-shot 和零-shot 学习](https://www.dominodatalab.com/blog/n-shot-and-zero-shot-learning-with-python),这是迁移学习的变体,专门用于处理例子稀少或根本没有标记数据的情况。
## 参考
[1] S. Makridakis,“即将到来的人工智能(AI)革命:对社会和企业的影响”,《未来》,第 90 卷,第 46-60 页,2017 年。
[2] F. Rosenblatt,“感知机:大脑中信息存储和组织的概率模型”,《心理学评论》,第 65 卷,第 6 期,第 386 页,1958 年。
[3] W. S .麦卡洛克和 w .皮茨,“神经活动内在思想的逻辑演算”,《数学生物物理学通报》,第 5 卷,第 4 期,第 115-133 页,1943 年。
[4] D. E. Rumelhart、G. E. Hinton 和 R. J. Williams,“通过反向传播错误学习表示”,*《自然》,*第 323 卷,第 6088 期,第 533-536 页,1986 年。
[5] M. McCloskey 和 N. J. Cohen,“连接主义网络中的灾难性干扰:顺序学习问题”,载于*学习和动机心理学*,第 24 卷:Elsevier,1989 年,第 109-165 页。
[6] R. M. Levenson,E. A. Krupinski,V. M. Navarro 和 E. A .乏色曼,“鸽子作为病理学和放射学乳腺癌图像的可训练观察者”,*《公共科学图书馆综合》,*第 10 卷,第 11 期,第 e0141357 页,2015 年。
[7] K. Simonyan 和 A. Zisserman,“用于大规模图像识别的极深度卷积网络”, *arXiv 预印本 arXiv:1409.1556,* 2014。
[8]潘世杰,杨青,“迁移学习研究综述”, *IEEE 知识与数据工程汇刊,*第 22 卷第 10 期,第 1345-1359 页,2009。
[9] K. He,X. Zhang,S. Ren,和 J. Sun,“用于图像识别的深度残差学习”,载于 2016 年 IEEE 计算机视觉和模式识别会议论文集*,第 770-778 页。*
[10] J. Donahue *等*,*机器学习国际会议*,2014: PMLR,第 647-655 页。
[11] T. Pfister,K. Simonyan,J. Charles 和 A. Zisserman,“手势视频中有效姿态估计的深度卷积神经网络”,载于*亚洲计算机视觉会议*,2014: Springer,第 538-552 页。
[12] J. Devlin,M.-W. Chang,K. Lee,K. Toutanova,“Bert:用于语言理解的深度双向转换器的预训练”, *arXiv 预印本 arXiv:1810.04805,* 2018。
[13] Y. Liu *等*,【Roberta:一种稳健优化的 bert 预训练方法】, *arXiv 预印本 arXiv:1907.11692,* 2019。
# 变形金刚-自我关注拯救
> 原文:<https://www.dominodatalab.com/blog/transformers-self-attention-to-the-rescue>
如果提到“变形金刚”会让人想起伪装的自主机器人的冒险,那么你可能和我一样,是一个 80 年代的孩子:和混迹于卡车、飞机甚至微型录音机或恐龙中的塞伯坦人玩耍。虽然我很想谈谈那种变形金刚,但这篇博客的主题是关于瓦斯瓦尼和他的团队在 2017 年题为“[注意力是你所需要的全部](https://arxiv.org/abs/1706.03762)”的论文中提出的变形金刚。我们将讨论什么是变形金刚,以及自我关注是如何工作的。这将帮助我们理解为什么变形金刚正在接管机器学习的世界,并且没有伪装。
## 什么是变形金刚模型?
变压器是一种人工神经网络架构,用于解决深度学习应用中输入序列到输出序列的转换或变换问题。如果你想了解更多关于深度学习的信息,你可以看看我们之前的博客文章,在那里我们讨论了一些流行的深度学习框架。
你可能想知道我们所说的输入和输出序列是什么意思。嗯,也许考虑一些应用可能会有所帮助。以语音识别、蛋白质结构预测或机器翻译为例。让我们专注于后者:给定一个英语句子(序列输入),我们想要找到翻译成日语的句子(序列输出),其具有与原始句子相同的意思(或尽可能接近)。因此,输入句子“擎天柱是一个很酷的机器人”将要求我们产生输出“コンボイはかっこいいロボットです”(是的,擎天柱在日语中被称为 Convoy/コンボイ)。
![Diagram of English text going through a transformer pipeline and a Japanese output](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/bc284f6fcaad33b5a1e8cafd0be9d5b3.png)
简单地按照出现的顺序逐字翻译可能会导致说日语的人认为不合语法的输出。例如,在日语中,动词被放在话语的末尾,而在英语中从来没有这样的情况。序列转导中的一个主要问题是以稳健的方式学习输入和输出序列的表示,以便不引入失真。你不想误译一条重要的信息。
应对这一挑战的方法是使用递归神经网络(RNNs)。与输入和输出相互独立的前馈神经网络不同,RNN 的输出取决于给定序列的先验元素。这有时被称为“记忆”。尽管 RNNs 的结果可能很好,但它们的使用有局限性,例如,给定 RNNs 的固定大小的输入/输出向量架构,找出输出序列的长度可能具有挑战性。更好的方法是使用变压器。
机器翻译的魔力得益于该架构中的两个组件:编码器和解码器。前者是接收输入序列的每个分量的元素,将它编码(因此得名)成一个携带整个序列的上下文信息的向量。这被发送到解码器,其工作是理解上下文并有意义地解析输出。
![Encoders and Decoders within a Transformer](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/01a5df1a26b486d3b2aedce959a8b4a8.png)
因为原始序列的重要信息是在上下文向量中携带的,所以我们可以将其视为架构中最重要的部分。同样,它可能是系统中“交通堵塞”的原因。这就是注意力概念发挥作用的地方。最初[由 Minh-Thang Long 于 2015 年](https://arxiv.org/abs/1508.04025)提出,它使您的模型能够根据需要关注输入序列的重要部分。
## 集中注意力
正如我们所看到的,模型中仅有“内存”可能还不够。我们需要“注意力”来帮助进一步改进诸如机器翻译这样的任务。让我们来看看注意力是做什么的。
在序列到序列模型中,编码器只将最后一个隐藏状态作为上下文传递给解码器。当使用注意时,编码器不仅传递最后一个隐藏状态,而且实际上传递所有隐藏状态。这意味着解码器可能要比以前多做一点工作。需要这种额外的处理,因为现在接收到的每个隐藏状态都与输入序列的给定部分相关联。在我们的例句“擎天柱是一个很酷的机器人”中,第一个隐藏状态与单词“擎天柱”有关,第二个与单词“擎天柱”有关,第三个与“是”有关,依此类推。通过这种方式,解码器可以做更多的事情,但也可以接收更多的信息。
![Hidden states from encoding to decoding in a transformer model](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/411c639155635352070f789f78fea2a1.png)
解码器现在的工作是计算编码器接收到的每个隐藏状态的权重。这是通过解码器自己的隐藏状态完成的,换句话说,就是模型中上一个时间步的输出。目的是为具有更高权重值的隐藏状态提供更大的重要性,这是我们新的上下文向量。然后,我们可以使用该上下文作为解码器的前馈神经网络的输入,以获得我们想要的输出序列。反过来,输出序列被用作解码器的隐藏状态,在下一个时间步骤中用于计算权重。
## 向内看——自我关注的作用
虽然注意力是解码器袖子上的一个重要把戏,我们可能会问编码器是否有它自己的任何把戏。答案是肯定的,这叫做自我关注。像注意一样,自我注意跟踪输入序列的关联,但这次是编码器跟踪其他项目以实现更好的编码。例如,以下面的输入句子为例:
“大黄蜂播放一些朗朗上口的音乐,并跟着跳舞”。
如果我们只追踪靠得很近的词的关系,我们可以很容易地识别出“朗朗上口”这个词指的是“音乐”。如果跟踪只在两个连续的单词之间进行,我们可能会在句尾的单词“it”失去其所指的情况下结束。对于人类读者来说,句子中的“它”显然是指“音乐”。然而,在自我注意力较低的情况下,翻译机器可能不知道这一点。
![Low attention and high attention in a transformer model](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a1bc0d1682058e59f8d934f67457d11c.png)
在自我注意中,编码者在处理句子的其他成分时寻找线索。以这种方式,自我注意可以被用来提取对序列中每个被处理元素的理解。在嵌入每个元素进行处理之后,我们需要另外三个组件:
* **Key:Value**\((k:v)\):Key 是我们序列中一个元素的标签,用来区别于其他元素。每个键都有一个相关的值
* **Query** \((q)\):当我们请求特定的信息时,我们查询键并为我们的请求选择最佳匹配
![transformers_fig5](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e709fb636bc6633107e8aed9fa25248a.png)
理解提取通过以下步骤完成:
1. 从训练时创建的矩阵中计算三个数组,称为 query \(q\)、key \(k\)和 value \(v\)。
2. 通过点积\(q\cdot k\)获得输入序列中每个元素的分数。注意,对于上面的句子,我们将使用每个值["bumblebee "," plays "," some "," catching ",...].分数是通过将每个结果除以一个值来衡量的\(\sqrt(d_k )\)。典型值为 8,但也可以使用其他值。
3. 确保分数是正常的,积极的,加起来是 1。这可以通过应用 softmax 函数来实现。
4. 将值向量\(v\)乘以上一步的标准化分数。
5. 最后,把所有的结果加到一个向量中,并创建自我关注的输出。结果被传递给前馈神经网络。
## 变压器及其应用
转换器是一种神经网络架构,它在编码器和解码器的堆栈中利用了注意力和自我注意力的概念。在 Vaswani 等人的原始论文中,提议的架构师使用了 6 个编码器和 6 个解码器。第一个编码器将获取输入向量,并在将其传递给前馈神经网络之前用自关注层对其进行处理。在典型的体系结构中,每个编码器由两部分组成:自关注层和前馈神经网络。同样,每个解码器由三部分组成:自我注意层、解码器注意层和前馈神经网络。一旦第一个编码器的工作完成,结果就被传递给下一个编码器,依此类推,直到最后一个编码器将信息发送给解码器,然后进行类似的过程。
![Series of encoders and decoders in a transformer model](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e074dacd826f95bceee421b965ed8b81.png)
![Encoder and Decoder examples in a transformer model](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/31d8cc8f1c72ce9320fb781996f5e56e.png)
transformer 体系结构相对于其他神经网络(如 RNNs)的一个重要优势是,在较长的距离上以更有效的方式呈现单词周围的上下文。此外,与 rnn 不同,输入数据不需要顺序处理,支持并行化。
变形金刚正在迅速成为自然语言处理(NLP)中的首选工具,一些预训练的模型,如“来自变形金刚的双向编码器表示”或 [BERT](https://arxiv.org/abs/1810.04805) ,以及“预训练生成变形金刚 3”或 [GPT-3](https://beta.openai.com/docs/engines/gpt-3) 占据了头条。GPT-3 可以根据提供的训练数据生成新的文本,据说它支持 300 多种应用,如搜索、对话、文本补全等(见[此处](https://openai.com/blog/gpt-3-apps/))。
虽然我们已经用机器翻译的方式给出了变形金刚的例子,实际上这个架构最初就是为这个目的开发的,但是也有机器视觉的应用。看看[这篇关于大规模图像识别的文章](https://ai.googleblog.com/2020/12/transformers-for-image-recognition-at.html)。就像 NLP 转换器使用单词来学习句子一样,机器视觉转换器使用像素来实现图像的类似结果。
与 GPT-3 生成新文本的方式相同,机器视觉的对等物将基于所提供的输入来生成新图像。这正是姜等人[使用双变压器模型所展示的](https://arxiv.org/abs/2102.07074):当提供了超过 20 万个名人的脸部时,该模型能够生成具有中等分辨率的新脸部图像。
其他的应用正在浮出水面,我们在这篇文章的前面提到的一个是蛋白质结构的预测。2021 年发表的 [AlphaFold](https://www.nature.com/articles/s41586-021-03819-2) 展示了“第一种可以以原子精度定期预测蛋白质结构的计算方法,即使在没有类似结构已知的情况下。”变形金刚提供的潜力开始为多模态处理开辟可能性,应用程序将能够使用多种类型的数据,将图像和视频等媒体与语言结合起来。参见例如 VATT 的提议或由[阿克巴里等人](https://arxiv.org/abs/2104.11178)提出的视频-音频-文本转换器。
## 访问模型
随着应用程序数量的增长,在我们的工作中尝试实现 transformers 时,访问各种框架和模型是一个重要的考虑因素。在撰写本文时,许多 transformer 模型都可以通过开源项目获得。例如,BERT 已经被 Google Research [在这里](https://github.com/google-research/bert)提供。一个重要的例外是 GPT-3,它目前只能通过 OpenAI 的 API 产品提供。
鉴于 TensorFlow、PyTorch 或 Keras 等框架的广泛使用,它们已经提供了 transformer 模型也就不足为奇了:
* TensorFlow 提供了许多用于文本分类、文本生成或翻译的文本处理工具。看一看[这里](https://www.tensorflow.org/text)。也有一些教程,例如[这个](https://www.tensorflow.org/text/tutorials/transformer)把葡萄牙语翻译成英语
* PyTorch 提供了一个名为 [PyTorch-Transformers](https://pytorch.org/hub/huggingface_pytorch-transformers/) 的库,里面有最先进的预训练模型,包括伯特、GPT 和 GPT-2(GPT-3 的早期版本)
* Keras 用户已经提供了一些代码样本,用于变形金刚的文本分类、[时间序列分类](https://keras.io/examples/timeseries/timeseries_classification_transformer/)或[语音识别](https://keras.io/examples/audio/transformer_asr/)
对于各种预先训练的模型,你可以看看 HuggingFace 和他们的[变形金刚库](https://huggingface.co/transformers/index.html),有 100 多个模型可供选择,包括 BERT、RoBERTa(来自脸书)、XLNet(来自卡耐基梅隆大学)、DistilBERT(来自 Hugging Face 自己)、DeBERTa(来自微软)、威震天-BERT 或威震天-GPT2(都来自 NVIDIA)。
## 摘要
变压器已经彻底改变了序列间建模的世界,并开始渗透到许多令人兴奋的应用中,其编码器-解码器模型提供了优于其他神经网络架构的优势。依靠注意力和自我注意力的概念,变形金刚能够在给定的序列中提供更广泛的上下文,改善重要的自然语言处理任务的结果,如语音识别或机器翻译。
此外,与其他顺序模型相比,transformers 能够提供更好的结果,因为我们能够使用并行化,让我们充分利用我们的 GPU 推送性能,并获得出色的结果。接下来要做的是去开始玩变形金刚;谁知道呢,这可能比玩伪装的机器人好玩多了。
# 走向概念构建——深度神经网络模型可解释性综述
> 原文:<https://www.dominodatalab.com/blog/trending-toward-concept-building-a-review-of-model-interpretability-for-deep-neural-networks>
当谈到验证模型时,我们正处于行业中一个有趣的时期——当你考虑它时,这是一个十字路口。从业者和领导者有机会通过支持适当的模型验证来做出真正的改变。这项工作必须包括可解释性和可解释性技术。解释深度神经网络是如何工作的很难。这是学术界和工业界的一个活跃的研究领域。数据科学家需要保持与时俱进,以创建安全可用的模型。领导者需要知道如何避免不道德、有偏见或被误解的模型的风险。在这篇文章中,我分析了应用于图像数据的网络可解释性的趋势。所涉及的一些方法也适用于非基于图像的网络。
## 来自像素影响...
[深度神经网络](/deep-learning-introduction)的大部分模型解释工作都是基于分析输入对分类的影响。对于图像数据,这意味着查看每个像素的重要性。典型的结果是一个显著图,就像这里显示的那样。
![Saliency maps using Class Activation Mapping](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/98e868dd9cd21297eea9aa720177ad6b.png)
There are many ways to build a saliency map. Here we see the top 5 predicted categories for an image using a technique called Class Activation Mapping explained in this paper: [https://arxiv.org/pdf/1512.04150.pdf](https://arxiv.org/pdf/1512.04150.pdf)
在他们介绍 TCAV 的论文(稍后讨论)中,作者指出了基于像素的方法的局限性。
1. 仅提供局部可解释性
2. 无法控制这些地图选择的概念
3. 随机化网络产生的显著性图类似于训练网络产生的显著性图(Adebayo 等人,2018 年)
4. 简单的无意义的数据处理步骤,可能导致显著性方法产生重大变化(Kindermans et al .,2017)。
5. 显著图也可能容易受到对抗性攻击(Ghorbani 等人,2017 年)。
## …接下来是概念提取和构建
新的研究提出了一个更好的方法——关注概念。概念是存储在网络高层中的图像的构建块。它们可以是基本的,如角、边、曲线、纹理、色调、位置、大小等。它们也可以是一些组件的集合,比如猫的脸或汽车的车顶。
![Deep neural network diagram, outlining complexity of each layer](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cc79204b11bb54d42eb752430516a828.png)
Networks do a good job of learning concepts that increase in complexity with each layer. Source: [Medium](https://medium.com/diaryofawannapreneur/deep-learning-for-computer-vision-for-the-average-person-861661d8aa61)
最初的可解释性工作集中在*提取*网络在试图对图像进行分类的自然过程中发现的概念。然而,最近出现了非常令人兴奋的研究,围绕*从基本原则构建*概念,目标是优化更高层,使其可读。该网络不是为了纯粹的准确性而优化,而是以一种专注于高级概念的强定义的方式来构建。换句话说,我们优化的是可解释性,而不是预测准确性。种种迹象表明,这样做最终可能会提高预测的准确性。
在接下来的部分中,我将介绍与刚才讨论的技术相关的各种方法。一定要坚持到概念构建的最后一部分。看到管道里的东西是令人兴奋的。
## 基于像素影响的方法综述
### 显著图
介绍可以在[https://arxiv.org/pdf/1312.6034.pdf](https://arxiv.org/pdf/1312.6034.pdf)找到
### 深 SHAP
“DeepLIFT 最近被提出作为深度学习的递归预测解释方法[8,7]。它赋予每个输入一个值,代表该输入被设置为参考值而不是其原始值的效果……(我们)调整了 DeepLIFT,使其成为 SHAP 值的组合近似值,从而导致深度 SHAP。”[https://proceedings . neur IPS . cc/paper/2017/file/8 a20 a 8621978632d 76 c 43 DFD 28 b 67767-paper . pdf](https://proceedings.neurips.cc/paper/2017/file/8a20a8621978632d76c43dfd28b67767-Paper.pdf)
### 石灰
“当对图像分类器使用稀疏线性解释时,人们可能希望只突出显示对特定类别具有正权重的超像素,因为它们给出了关于为什么模型会认为该类别可能存在的直觉。”([https://arxiv.org/pdf/1602.04938.pdf](https://arxiv.org/pdf/1602.04938.pdf)
![Incorrect classification of a cat ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cd819172693366b202b8b3608d97d532.png)
This image was incorrectly classified as a black bear. The collection of positive weight pixels on the right shows what the network focused on for this image. Image source: [https://arxiv.org/pdf/1602.04938.pdf](https://arxiv.org/pdf/1602.04938.pdf)
## 锚
“锚定解释”是一种规则,它充分“锚定”了本地预测,因此对实例的其余特征值的更改无关紧要。换句话说,在锚固定的情况下,预测(几乎)总是一样的。”([https://www . aaai . org/OCS/index . PHP/AAAI/aaai 18/paper/view/16982/15850](https://www.aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16982/15850))
![A deep neural network understanding an image of a dog](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/03cd6379b693dc9561371bbe9f623abf.png)
What part of the beagle image does the network think is most influential in deciding to apply the label of beagle? In other words, if we superimpose that part of the image on any other image it will still predict a beagle. Image source: [https://www.aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16982/15850](https://www.aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16982/15850)
## 基于概念抽取的方法综述
### TCAV
允许研究人员在他们的网络中测试高级的、人类可理解的概念的重要性。使用概念激活向量(TCAV)进行测试,可以很容易地找到可能引起伦理问题或被怀疑混淆分类的概念。作者给出的一个例子是在识别图像中一个人的种族时检查乒乓球的存在。创建了三个模型。在 TCAV 之后,研究人员有数据来丢弃那些与乒乓球的存在相混淆的模型,从而避免了一个泛化能力差且不道德的模型。
![TCAV models plotted as a bar chart](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/d177d59d4959eaf6a120d159483ef9be.png)
Image source: [https://arxiv.org/abs/1711.11279](https://arxiv.org/abs/1711.11279)
### (American Cinema Editors)美国电影电视剪接师协会
基于概念的自动解释(ACE)是一种混合方法,它依赖于像素影响,但也测试概念的存在。它旨在消除手工设计概念的需要和概念选择中的人为偏见,如在 TCAV 所使用的。它采用一个经过训练的分类器和一组图像作为输入。然后,它提取该类中的概念(通常以像素组的形式)并返回每个概念的重要性。
![Automated Concept-based Explanation (ACE)](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a15b3a362cda37bef0f6dfcdbc2b3806.png)
Image source: [Cornell](https://arxiv.org/abs/1902.03129)
### 影响导向的解释
这种方法将单个实例的传统输入影响与高级概念的激活神经元识别(概念提取)相结合。它识别具有高影响力的神经元,并提供可视化技术来解释它们所代表的概念。当你把许多图像拼接在一起时,你就获得了全局可解释性,这对于大多数网络来说是很难实现的。
![activation neuron identification (concept extraction)](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9e0b594663ec00d9758a522e949f0147.png)
Taking a model trained to classify convertibles, we see that the influence-directed explanation almost always looks at the roof of the car, giving us confidence that the model has learned the right concept. Image source: [Carnegie Mellon University](https://arxiv.org/pdf/1802.03788.pdf)
## 基于概念构建的方法综述
### 可解释 CNN
在没有任何额外的人工监督的情况下,网络被优化以使用过滤器来自动推动网络中的高 conv 层表示来表示可理解的对象部分。每个过滤器必须编码一个独特的对象部分,这是唯一的一个类别。这些对象部分通常是人类可以解释的。迫使网络的各层代表人类可以理解的对象的部分,使得解释整个网络变得相对容易。预期损失会发生,但通常是最小的。
![nterpretable convolutional neural networks (CNN) diagram](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/729cb57b3332e5fcea1bc68d60ff7342.png)
“Interpretable convolutional neural networks (CNN) add a regularization loss to higher convolutional layers of CNN to learn disentangled representations, resulting in filters that could detect semantically meaningful natural objects.” [Image and quote source](http://openaccess.thecvf.com/content_cvpr_2018/papers/Zhang_Interpretable_Convolutional_Neural_CVPR_2018_paper.pdf)
### CapsNet
胶囊表示图像中特定实体的属性,例如位置、大小、方向、速度、反照率、色调、纹理等。该模型学习对部分和整体之间的关系进行编码,这导致概括成新视点的视点不变知识。CapsNet 方法最初是纯监督的,但现在使用无监督的结构提取和简单的分类器进行标记。“现在对胶囊的研究与本世纪初对用于语音识别的递归神经网络的研究处于相似的阶段。有基本的代表性理由相信这是一种更好的方法,但它可能需要更多的细微见解,才能超越高度发达的技术。一个简单的胶囊系统已经在分割重叠数字方面提供了无与伦比的性能,这一事实表明胶囊是一个值得探索的方向。”([https://papers . nips . cc/paper/6975-dynamic-routing-between-capsules . pdf](https://papers.nips.cc/paper/6975-dynamic-routing-between-capsules.pdf))
![Capture properties and capsule generation diagrams](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b90fc6ceb044a3869c1f3557d0a13df8.png)
Image source: [NeurIPS Proceedings](https://papers.nips.cc/paper/6975-dynamic-routing-between-capsules.pdf)
## 从这里去哪里
这是数据科学研究中一个激动人心的重要领域。为了更广泛、更深入地探究这个话题,我建议查看一下我最近关于可解释性的会议演讲的[录音。](https://www.dominodatalab.com/resources/data-science-playbook-for-explainable-ai/)
最后,我要指出的是,这一切都很好,但如果数据科学家和分析领导者在他们的验证工作流程中不关注模型的可解释性,这将是无效的。然后,一旦我们,作为一个行业,把我们的模型验证方面处理好了,我们将需要把许多相同的技术转移到模型维护方面。模型和输入数据会随时间漂移,可能会引入训练中没有的偏差。是的,有很多工作要做,但这也意味着我们每个人都有足够的机会在我们的组织中加强和支持正确的模型验证。
[Joey Kyber 在 Unsplash 上的横幅照片]
# 对莱姆的信任:是,不是,也许是?
> 原文:<https://www.dominodatalab.com/blog/trust-in-lime-local-interpretable-model-agnostic-explanations>
*在本 Domino 数据科学领域笔记中,我们简要讨论了一种用于生成解释的算法和框架, [LIME(本地可解释模型不可知解释)](https://github.com/marcotcr/lime),这可能有助于数据科学家、机器学习研究人员和工程师决定是否信任任何模型中任何分类器的预测,包括看似“黑盒”的模型。*
## 你信任你的模型吗?
信任是复杂的。
韦氏词典的[对信任的定义](https://www.merriam-webster.com/dictionary/trust)包括多个组成部分,传达了与信任相关的潜在细微差别。在构建和部署模型时,数据科学家、机器学习研究人员和工程师决定是否信任模型或分类器的预测。他们还权衡了可解释性。关于机器学习可解释性的[严格程度的讨论,以及关于](/blog/make-machine-learning-interpretability-rigorous/)[缺乏机器学习可解释性](/blog/ingesting-kate-crawfords-trouble-with-bias/)的影响,之前已经在 Domino 数据科学博客中报道过。在这篇博客文章中,我们简要讨论了一种用于生成解释的算法和框架, [LIME](https://github.com/marcotcr/lime) (本地可解释模型不可知解释),这可能有助于人们决定是否信任任何模型中任何分类器的预测,包括看似“黑盒”的模型。
## 什么是石灰?(本地可解释的模型不可知的解释)
2016 年,马尔科·图利奥·里贝里奥、萨梅尔·辛格和卡洛斯·盖斯特林发表了一篇论文,“[我为什么要相信你?:解释任何分类器](https://arxiv.org/pdf/1602.04938.pdf)的预测,这在 [KDD 2016](https://www.youtube.com/watch?v=KP7-JtFMLo4) 以及[博客帖子](https://homes.cs.washington.edu/~marcotcr/blog/lime/)中讨论过。在[的论文](https://arxiv.org/pdf/1602.04938.pdf)中,Riberio、Singh 和 Guestrin 建议将 LIME 作为一种手段,“为单个预测提供解释,作为‘信任预测问题’的解决方案,并选择多个这样的预测(和解释)作为‘信任模型’问题的解决方案。”Riberio、Singh 和 Guestrin 还将 LIME 定义为“一种算法,它可以通过用可解释的模型在局部对其进行近似,以忠实的方式解释任何分类器或回归器的预测”。在后来的[数据怀疑论者访谈中,里贝罗](https://dataskeptic.com/blog/transcripts/2016/trusting-machine-learning-models-with-lime)还指出
“我们把它作为一个产生解释的框架。我们做了一些特别的解释,特别是线性模型,但是 LIME 基本上是一个试图平衡可解释性和忠实性的等式。所以我会说这是一个框架,你可以用 LIME 框架得出许多不同种类的解释。”
## 为什么信任是机器学习中的问题?
Riberio、Singh 和 Guestrin “认为解释预测是让人类信任和有效使用机器学习的一个重要方面,如果解释是可信和可理解的”。他们还认为,“机器学习实践者经常必须从许多备选方案中选择一个模型,这要求他们评估两个或更多模型之间的相对信任度”以及
*“每个机器学习应用程序也需要对模型的整体信任度进行一定的测量。分类模型的开发和评估通常包括收集* *带注释的数据,其中一个保留的子集用于自动评估。虽然这对于许多应用来说是一个有用的管道,但是对验证数据的评估可能并不对应于“在野外”的性能,因为从业者经常高估他们的模型的准确性[20],因此信任不能仅仅依赖于它。查看示例提供了一种评估模型真实性的替代方法,尤其是在示例得到解释的情况下。”*
过度拟合、数据泄漏、数据集偏移(训练数据不同于测试数据)是“模型或其评估可能出错”的几种方式。这些类型的挑战导致人们在模型开发和部署期间评估是否信任模型。
## LIME 如何解决信任问题?
为了了解模型的潜在行为,LIME 使人类能够以对人类有意义的不同方式干扰输入,观察预测可能如何变化,然后人类评估是否信任特定任务的模型。Riberio、Singh 和 Guestrin 在许多论文和演讲中使用图像分类作为例子。[在树蛙示例](https://www.oreilly.com/learning/introduction-to-local-interpretable-model-agnostic-explanations-lime)中,Riberio、Singh 和 Guestrin 评估分类器是否能够“预测图像包含树蛙的可能性”。他们将树蛙图像分割成不同的可解释部分,然后扰乱、“屏蔽”或隐藏各种可解释部分。然后
*“对于每一个被扰乱的实例,我们根据模型得到一只树蛙在图像中的概率。然后,我们在这个数据集上学习一个简单的(线性)模型,这个模型是局部加权的——也就是说,我们更关心在与原始图像更相似的扰动实例中出错。最后,我们给出了具有最高正权重的超级像素作为解释,将其他所有东西都变灰。”*
然后,人类能够观察模型预测,将其与他们自己对图像的观察进行比较,并评估是否信任该模型。里贝里奥在数据怀疑论者访谈中指出,“我们人类有直觉...我们知道在很多情况下一个好的解释是什么样的,如果我们看到模型是否以合理的方式运作,我们就会更倾向于相信它。”
## 要考虑的资源
这篇博客文章通过摘录石灰研究的重点,提供了一个蒸馏石灰的概述。如果您有兴趣了解更多关于 LIME 的知识,并进一步评估 LIME 作为一种可行的工具来帮助您决定是否信任您的模型,请考虑阅读这篇博文中回顾和引用的资源:
### Python/R 代码
* [使用属性重要性、PDP 和时间解释黑盒模型](/blog/explaining-black-box-models-using-attribute-importance-pdps-and-lime)
* [LIME 开源项目](https://github.com/marcotcr/lime)
* [Python 石灰包的 R 口](https://github.com/thomasp85/lime)
### 报纸
* 里贝里奥、辛格和盖斯特林的“'[为什么](https://arxiv.org/pdf/1602.04938.pdf) [我应该相信你”:解释任何分类器的预测](https://arxiv.org/pdf/1602.04938.pdf)
* Riberio、Singh 和 Guestrin 的"[机器学习的模型不可知可解释性](http://sameersingh.org/files/papers/lime-whi16.pdf)"
* 里贝里奥、辛格和盖斯特林的“[锚:高精度模型不可知论解释](https://homes.cs.washington.edu/~marcotcr/aaai18.pdf)
### 视频和采访
* 数据怀疑论者的[“用石灰信任机器学习模型”](https://dataskeptic.com/blog/transcripts/2016/trusting-machine-learning-models-with-lime)
* KDD2016 "' [我为什么要相信你':解释任何分类器的预测](https://www.youtube.com/watch?v=KP7-JtFMLo4)"
### 博客帖子
* Riberio、Singh 和 Guestrin 的“[对局部可解释模型不可知解释的介绍(LIME)](https://www.oreilly.com/learning/introduction-to-local-interpretable-model-agnostic-explanations-lime)
* 托马斯·林·彼得森和迈克尔·贝尼斯特的《理解石灰》
*^(Domino 数据实验室提供数据科学研究的亮点、趋势、技术等,支持数据科学家和数据科学领导者加快他们的工作或职业发展。如果你对我们博客中报道的你的数据科学工作感兴趣,请发邮件到 writeforus@dominodatalab.com 给我们。)*
# 优步和对数据科学平台的需求
> 原文:<https://www.dominodatalab.com/blog/uber-and-the-need-for-a-data-science-platform>
对于那些想知道数据科学平台是否真的存在的人,优步数据科学平台团队的负责人凯文·诺瓦克有一篇很棒的文章。他描述了他们的数据科学团队遇到的问题,以及他们为什么需要一个平台。
优步因数据科学在其业务中的核心作用而闻名,因此他们对数据科学需要如何进行的前瞻性思考也就不足为奇了。对于研究数据科学团队应该如何组织工作的人来说,这是一个关于数据驱动型公司投资方向的绝佳案例。
从 Kevin 的文章中得到的一个重要启示是,即使是高能力、管理良好的团队,在扩大规模时也会遇到一些基本问题。就优步而言:
* 他们在重新发明轮子:“重复的工作正在发生。”
* 他们没有建立最佳实践:*“我们通过公共图书馆、维基和 Jupyter 笔记本分享最佳想法的模式没有扩大。”*
* 他们的基础设施减缓了数据科学的发展:*“大规模查询数据、处理实验数据或构建和维护机器学习模型所必需的工程基础设施并没有考虑到数据科学家。”*
* 他们错过了获得洞察力的机会:*“由于摩擦,我们错过了利用数据的机会。”*
Kevin Novak 得出的结论是,他们需要一个“数据科学平台”来提高数据科学的效率。他们的目标是“找到每个优步数据科学家面临的基本问题,并组建跨职能团队,致力于出色地解决这个问题。”
我们知道凯文来自哪里。这正是我们对 Domino 使命的看法,也是我们产品背后的驱动力。
至于特性,Kevin 完全正确地描述了对共享、可重用性和更快地将模型部署到生产中的需求。这些是任何数据科学平台都应该具备的基本功能。
但是凯文提出的最重要的一点是关于“诱人的技术”让人们对他们的工作方式做出哪怕是很小的改变都是非常困难的。你对他们要求越多,就越难。人们不希望必须学习一个新的 IDE 或者将现有的工作移植到一个新的开发范例中。
正是用户采用的缺乏扼杀了许多这样的计划。你最终承担了所有的成本,却没有任何收益。因此,在你购买或生产一个产品之前,要确保人们真的会喜欢你提供的产品。
然而,在一个方面,我们 Domino 不同意 Kevin 的观点。
不奇怪,我们不认为公司需要建立自己的平台。有一个很好的例子说明为什么这是不好的。15 年前,有很多公司对 Salesforce.com 嗤之以鼻,并决定建立自己的客户关系管理。
构建他们自己的理由与 Kevin 现在使用的理由相同:我们需要特殊功能,我们将有更多的控制权,我们有优秀的工程师可以以低廉的成本构建它,当然,这对于业务来说是战略性的。
从长远来看,这些本土平台变成了船锚,而不是加速器。代码基础变得僵化和复杂。这个平台不再是人们想要开发的酷的新事物。公司低估了持续维护和支持所需的成本和资源。不可能跟上用户要求的所有功能。对于 CRM 系统,“我们可以构建它”的团队变成了“你不能拥有它”的团队因此,拥有自制 CRM 系统的公司发现,他们的平台让他们处于不利地位,尽管他们花费了大量资金来维护。
如果你正在考虑建立自己的平台,重要的是要确保这是一个你可以在未来五年或更长时间内投入大量资源的项目。跟上基本功能的总投资将是数百万美元。对于像优步这样的公司,融资超过 10 亿美元,拥有丰富的工程人才,这可能是一个正确的决定。对许多公司来说,这显然是错误的。
但这是一个小的分歧,在这个话题上,我们通常与凯文意见一致。数据科学团队需要协作和可重用性。如果有人从事对你的业务很重要的定量研究,你将需要一个数据科学平台。
# 数据科学过程中丑陋的小片段
> 原文:<https://www.dominodatalab.com/blog/ugly-little-bits-data-science-process>
今天早上,在 Twitter 上有一个很棒的对话,由 Hadley Wickham 发起,是关于数据科学过程中一个丑陋的小细节。
> 在数据分析过程中,您通常会创建许多模型。你怎么给它们命名?谁写了关于这个问题的好建议?
>
> — Hadley Wickham (@hadleywickham) [June 8, 2016](https://twitter.com/hadleywickham/status/740532372513247233?ref_src=twsrc%5Etfw)
# 理解因果推理
> 原文:<https://www.dominodatalab.com/blog/understanding-causal-inference>
*本文涵盖了因果关系,其中一章摘自 Andrew Kelleher 和 Adam Kelleher 所著的《生产中的[机器学习:开发和优化数据科学工作流和应用](http://www.informit.com/store/machine-learning-in-production-developing-and-optimizing-9780134116549?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Kelleher)》一书。一个补充的[多米诺骨牌项目可用](https://try.dominodatalab.com/u/domino-andrealowe/Causal_Inference/sharedView/13_Causal_Inference.ipynb)。*
## 介绍
由于数据科学工作本质上是[实验性和概率性的](https://www.dominodatalab.com/blog/horizontal-scaling-parallel-experimentation),数据科学家经常面临做出推论的问题。这可能需要思维方式的转变,特别是如果从“[传统统计分析转向多元数据的因果分析](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2836213/)。由于 Domino 致力于提供数据科学家加速工作所需的平台和工具,我们联系了 Addison-Wesley Professional(AWP)Pearson,请求允许从 Andrew Kelleher 和 Adam Kelleher 所著的《生产中的 *[机器学习:开发和优化数据科学工作流和应用](http://www.informit.com/store/machine-learning-in-production-developing-and-optimizing-9780134116549?utm_source=Referral&utm_medium=DominoLabs&utm_campaign=Kelleher)】一书中摘录“因果推理”。我们感谢提供以下章节摘录以及将代码放在补充的 [Domino 项目](https://try.dominodatalab.com/u/domino-andrealowe/Causal_Inference/sharedView/13_Causal_Inference.ipynb)中的许可。*
![Domino Data Lab Enterprise MLOPs workspace](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e1490675fc5ed598dc8d971951b15ef4.png)
![Domino Data Lab Enterprise MLOPs casual inference project](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/d473315735ca137d78f737536be5ad12.png)
## 第一章介绍:因果推理
我们在书中介绍了几个机器学习算法,并指出它们可以用来产生清晰、可解释的结果。您已经看到,逻辑回归系数可用于表示某个结果与某个特征一起出现的可能性有多大(对于二元特征),或者某个变量每增加一个单位,某个结果出现的可能性有多大(对于实值特征)。我们想发表更强烈的声明。我们想说“如果你将一个变量增加一个单位,那么它将会使一个结果更有可能。”
对回归系数的这两种解释表面上非常相似,以至于你可能要读几遍才能理解其中的含义。关键在于,在第一种情况下,我们描述的是在我们观察的系统中通常会发生什么。在第二种情况下,我们说的是如果我们干预这个系统并破坏它的正常运行会发生什么。
在我们看完一个例子后,我们将建立数学和概念机制来描述干预。我们将讨论如何从描述观察数据的贝叶斯网络发展到描述干预效果的贝叶斯网络。我们将通过一些经典的方法来估计干预的效果,最后我们将解释如何使用机器学习估计器来估计干预的效果。
如果你想象一个二元结果,比如“我上班迟到了”,你可以想象一些可能随之变化的特征。恶劣的天气会导致你上班迟到。恶劣的天气也会导致你穿雨靴。那么,当你穿着雨靴的时候,你上班就更有可能迟到。如果你观察二元特征“穿雨靴”和结果“我上班要迟到了”之间的相关性,你会发现一种积极的关系。说穿雨鞋导致上班迟到,当然是扯淡。这只是坏天气的一个代表。你永远不会推荐“你不应该穿雨靴,这样你上班就不会经常迟到”的政策。只有当“穿雨靴”与“上班迟到”有因果关系时,这才是合理的。作为防止迟到的干预措施,不穿雨鞋没有任何意义。
在这一章中,你将学习相关关系(雨靴和迟到)和因果关系(下雨和迟到)之间的区别。我们将讨论建立因果关系的黄金标准:一个实验。我们还将介绍一些方法,用于在无法进行实验的情况下发现因果关系,这在现实环境中经常发生。
## 13.2 实验
你们可能熟悉的例子是 AB 测试。您可以对产品进行更改,并根据产品的原始版本进行测试。您可以通过将用户随机分成两组来实现这一点。群体成员由 *D* 表示,其中 *D = 1* 是体验新变化的群体(测试群体),而 *D = 0* 是体验产品原始版本的群体(控制群体)。具体来说,让我们假设你正在研究一个推荐系统在网站上推荐文章的变化的影响。对照组体验原始算法,测试组体验新版本。您希望看到这一变化对总浏览量的影响。
你可以通过观察一个叫做*平均治疗效果* (ATE)的量来衡量这个效果。ATE 是测试组和对照组之间结果的平均差异,
![average treatment effect (ATE) formula 1](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/41bfc2e1dbed862e706055500d42d2fb.png)
或者
![average treatment effect (ATE) formula 2](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f9e3758b64caf55b39be03ba1f658426.png)
这是 ATE 的“天真”估计值,因为这里我们忽略了世界上的其他一切。对于实验来说,这是对真实效果的无偏估计。
估计这一点的一个好方法是做一个回归。这样,您还可以同时测量误差线,并包括您认为可能会降低 Y 中噪声的其他协变量,从而获得更精确的结果。让我们继续这个例子。
```py
import numpy as np
import pandas as pd
N = 1000
x = np.random.normal(size=N)
d = np.random.binomial(1., 0.5, size=N)
y = 3\. * d + x + np.random.normal()
X = pd.DataFrame({'X': x, 'D': d, 'Y': y})
```
在这里,我们将 *D* 随机分配给测试组和控制组。 *X* 是导致 *Y* 的某个其他协变量, *Y* 是结果变量。我们给 *Y* 增加了一点额外的噪音,只是为了让问题变得更加嘈杂。
你可以使用回归模型
![regression model formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/a9077c74f56bcf7ffe1e96430f3befc5.png)
给定协变量 *D* ,估计 *Y* 的期望值,为
![estimate the expected value of Y, given the covariate D](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/d83cf8ccebf92006593f6dd984dfa6c3.png)
对于 *D* 的所有值(即 0 或 1),将把*β[0]块加到*E【Y | D】*上。只有当 *D = 1* 时,才会添加 *β[1] 部分,因为当 *D = 0* 时,它会乘以零。这意味着**
![regression model formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6f78812eb65ccdd9b91065b942e114c0.png)
当 *D=0* 并且
![regression model formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/9a6fdb86dc61f12fa24721b20660c4c3.png)
当 *D=1* 时。因此,β[1] 系数将是 *D = 1* 组和 *D = 0* 组之间的平均 *Y* 值的差值,
![regression model formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/bfce1ef750bfa6d8fcc6250a64dc7ecc.png)
你可以用那个系数来估计这个实验的效果。当你对 *Y* 对 *D* 进行回归时,你会得到图 13.1 中的结果。
```py
from statsmodels.api import OLS
X['intercept'] = 1.
model = OLS(X['Y'], X[['D', 'intercept']])
result = model.fit()
result.summary()
```
![OLS Regression Results](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b93750a80ad82a319c321301fe578e7a.png)
为什么会这样?为什么可以说实验的效果只是测试组和对照组结果之间的差异?这似乎是显而易见的,但这种直觉将在下一节中被打破。在继续之前,让我们确保你深刻理解它。
每个人可以被分配到测试组或控制组,但不能两者都分配。对于一个被分配到测试组的人,如果他们被分配到控制组,你可以假设他们的结果会有什么价值。你可以称这个值为*Y⁰T3 】,因为如果 *D* 被设置为 0,它就是 *Y* 的值。同样,对于控制组成员,你可以谈论一个假设的 Y¹ 。你真正想衡量的是结果的差异*
![Y1 - Y0](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8ff6dc7eb91f5863c60cfb44792af3e4.png)
对每个人来说。这是不可能的,因为每个人只能在一个组!正因如此,这些*Y¹和 *Y⁰* 变量被称为潜在结果。*
如果一个人被分配到测试组,你测量结果*Y = Y¹。如果一个人被分配到控制组,你测量 *Y = Y⁰ 。既然你不能测量个体效应,也许你可以测量群体水平效应。我们可以试着用*E【Y1】*和*E【Y0】*来代替。我们想要**
![E[Y1] and E[Y0]](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/190628a2530d178fe250146225c9d7a2.png)
和
![E[Y1] and E[Y0]](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5c1a60b211e531d62b4a2be8172e5198.png)
但是我们不能保证这是真的。在推荐系统测试的例子中,如果你将页面浏览量较高的人分配到测试组,会发生什么?您可能会测量到比真实效果更大的效果!
幸运的是,你随机化 D 以确保它独立于*Y⁰和*Y¹。那样的话,你确定**
![E[Y1] and E[Y0]](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/190628a2530d178fe250146225c9d7a2.png)
和
![E[Y1] and E[Y0]](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5da3e654af2dcd39c61c5966429b66f6.png)
所以你可以这么说
![E[Y1] and E[Y0]](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cf94553a31df48a1719b3c874dd5e014.png)
当其他因素可以影响赋值时, *D* ,那么你就不能再确定你有正确的估计了!一般来说,当你无法控制一个系统时,这是正确的,所以你不能确保 *D* 独立于所有其他因素。
一般情况下, *D* 不会只是一个二元变量。它可以是有序的、离散的或连续的。你可能想知道一篇文章的长度对分享率的影响,吸烟对患肺癌概率的影响,你出生的城市对未来收入的影响,等等。
在我们继续之前,为了好玩,让我们看看你可以在实验中做些什么来获得更精确的结果。因为我们有一个协变量, *X* ,这也导致了 *Y* ,我们可以解释更多的 *Y* 的变化。这使得我们的预测不那么嘈杂,所以我们对 *D* 的影响的估计会更精确!让我们看看这个怎么样。我们现在对 *D* 和 *X* 进行回归,得到图 13.2。
![The regression for Y](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/d8ce776be9d2da9ed18a73a578f08a40.png)
注意,*R²T3 要好得多。另外,请注意 *D* 的置信区间要窄得多!我们从 3.95-2.51 = 1.2 的范围下降到 3.65-2.76 = 0.89。简而言之,找到解释结果的协变量可以提高实验的精确度!*
## 13.3 观察:示例
让我们来看一个例子,当你没有让你的事业独立于其他一切时会发生什么。我们将用它来展示如何建立一些直觉,观察和干预是不同的。让我们来看一个简单的模型,看看种族、贫困和社区犯罪之间的关系。贫困减少了人们生活中的选择,并使犯罪更有可能发生。这使得贫穷成为犯罪的原因。其次,邻里之间的种族构成会持续一段时间,所以邻里是种族构成的一个原因。邻里关系也决定了一些社会因素,如文化和教育,因此也可能是贫困的原因。这给了我们图 13.3 中的因果图。
![The neighborhood is a cause of its racial composition and poverty levels. The poverty level is a cause of crime.](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/df99d99de16199b5e121d2a976cf1316.png)
在这里,种族和犯罪之间没有因果关系,但你会发现它们在观察数据中是相关的。让我们模拟一些数据来检验这一点。
```py
N = 10000
neighborhood = np.array(range(N))
industry = neighborhood % 3
race = ((neighborhood % 3
+ np.random.binomial(3, p=0.2, size=N))) % 4
income = np.random.gamma(25, 1000*(industry + 1))
crime = np.random.gamma(100000\. / income, 100, size=N)
X = pd.DataFrame({'$R$': race, '$I$': income, '$C$': crime,
'$E$': industry, '$N$': neighborhood})
```
这里,每个数据点将是一个邻域。每个社区的种族构成和主导产业都有共同的历史原因。这个行业决定了社区的收入水平,而收入水平与犯罪率成反比。
如果你为这些数据绘制相关矩阵(图 13.4),你可以看到种族和犯罪是相关的,尽管它们之间没有因果关系!
![Data showing correlation between crime, industry, income, neighborhood and race](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/06577c4d4af5d4d8459b525dbd6eb8ee.png)
你可以采用回归方法,看看如何解释回归系数。因为我们知道使用正确的模型,我们可以做正确的回归,结果如图 13.5 所示。
![Regression for crime against the inverse of income](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/30f5270627a619be17b09cbc5b1ceaec.png)
```py
from statsmodels.api import GLM
import statsmodels.api as sm
X['$1/I$'] = 1\. / X['$I$']
model = GLM(X['$C$'], X[['$1/I$']], family=sm.families.Gamma())
result = model.fit()
result.summary()
```
由此可以看出,1/I 每增加一个单位,犯罪数量就增加 123 个单位。如果犯罪单位是每 10,000 人的犯罪,这意味着每 10,000 人多 123 起犯罪。
这是一个很好的结果,但是你真的想知道这个结果是否有因果关系。如果是因果关系,这意味着你可以设计一个政策干预来利用这种关系。也就是说,你想知道如果人们挣更多的收入,在其他条件不变的情况下,犯罪率会不会降低?如果这是一个因果结果,你可以说,如果你使收入更高(独立于其他一切),那么你可以预期 1/I 每减少一个单位,你会看到 123 起犯罪减少。是什么阻止我们现在提出这些主张呢?
你会发现回归结果不一定是因果关系;让我们看看种族和犯罪之间的关系。我们将进行另一次回归,如下所示:
```py
from statsmodels.api import GLM
import statsmodels.api as sm
races = {0: 'african-american', 1: 'hispanic',
2: 'asian', 3: 'white'}
X['race'] = X['$R$'].apply(lambda x: races[x])
race_dummies = pd.get_dummies(X['race'])
X[race_dummies.columns] = race_dummies
model = OLS(X['$C$'], race_dummies)
result = model.fit()
result.summary()
```
![Statistics highlighting relationships between race and crime](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6391d63262bffa863b3ceafa3548a26e.png)
在这里,你会发现种族和犯罪之间有很强的关联,尽管没有因果关系。你知道,如果我们把很多白人搬到一个黑人社区(保持收入水平不变),你应该对犯罪没有影响。如果这种回归是因果关系,那么你会。为什么即使没有因果关系也能找到显著的回归系数?
在这个例子中,你错了,因为种族构成和收入水平都是由每个街区的历史造成的。这是两个变量有共同原因的情况。如果你不控制那段历史,那么你会发现两个变量之间的虚假关联。你所看到的是一个普遍的规律:当两个变量有共同的原因时,即使它们之间没有因果关系,它们也是相关的(或者更一般地说,是统计相关的)。
这个共同原因问题的另一个很好的例子是,当柠檬水销量高时,犯罪率也高。如果你回归柠檬水销售的犯罪率,你会发现柠檬水销售每增加一个单位,犯罪率就会显著增加!显然,解决办法不是取缔柠檬水摊。碰巧的是,热天卖的柠檬水更多。热天犯罪率也更高。天气是犯罪和柠檬水销售的常见原因。我们发现这两者是相关的,即使它们之间没有因果关系。
柠檬水示例中的解决方案是控制天气。如果你看看所有阳光明媚、华氏 95 度的日子,天气对柠檬水销售的影响是不变的。在有限的数据集中,天气和犯罪的影响也是不变的。两者之间的任何差异必定是由其他因素造成的。你会发现柠檬水销售和犯罪在这个受限的数据集中不再有显著的相关性。这个问题通常被称为混杂,打破混杂的方法是对混杂者进行控制。
同样,如果你只看有特定历史的社区(在这种情况下,相关变量是主导产业),那么你会打破种族和收入之间的关系,也打破种族和犯罪之间的关系。
为了对此进行更严格的推理,让我们看一下图 13.3。我们可以看到依赖的来源,这里有一条从 N 到 R 的路径和一条从 *N* 通过 *E* 和 *P* 到 *C* 的路径。如果您能够通过固定一个变量来打破这条路径,那么您就可以破坏沿着这条路径流动的依赖性。结果将不同于通常的观察结果。你会改变图中的依赖关系,所以你会改变所有这些变量的联合分布。
如果你以一种独立于主导行业的方式干预设定一个地区的收入水平,你将打破行业和收入之间的因果联系,导致图 13.7 中的图表。在这个系统中,你应该发现种族和犯罪之间产生依赖的路径被打破了。两者应该是独立的。
![The result of an intervention where you set the income level by direct intervention in a way that is independent of the dominant industry in the neighborhood](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/686c7acb3a43560247d84bc74ab98b5b.png)
你如何只用观察数据来控制?一种方法是限制数据的子集。例如,你可以只看行业 0,看看最后一次回归是什么样的。
```py
X_restricted = X[X['$E$'] == 0]
races = {0: 'african-american', 1: 'hispanic',
2: 'asian', 3: 'white'}
X_restricted['race'] = X_restricted['$R$'].apply(lambda x: races[x])
race_dummies = pd.get_dummies(X_restricted['race'])
X_restricted[race_dummies.columns] = race_dummies
model = OLS(X_restricted['$C$'], race_dummies)
result = model.fit()
result.summary()
```
这产生了图 13.8 中的结果。
![A hypothetical regression on race indicator variables predicting crime rates.](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/3b27d510648adf5c92ecb1fb4d1a2a65.png)
现在你可以看到所有的结果都在彼此的信任范围内!这个地区的工业充分说明了种族和犯罪之间的相互关系。换句话说,在这个假设的数据集中,当你知道该地区的主导产业是什么时,犯罪是独立于种族的。你做的和你之前做的调理是一样的。
请注意,与以前相比,新系数的置信区间相当宽。这是因为您已经限制了一小部分数据。你能做得更好吗,也许通过使用更多的数据?事实证明,有一种比限制数据集更好的控制方式。你可以回归你想要控制的变量!
```py
from statsmodels.api import GLM
import statsmodels.api as sm
races = {0: 'african-american', 1: 'hispanic',
2: 'asian', 3: 'white'}
X['race'] = X['$R$'].apply(lambda x: races[x])
race_dummies = pd.get_dummies(X['race'])
X[race_dummies.columns] = race_dummies
industries = {i: 'industry_{}'.format(i) for i in range(3)}
X['industry'] = X['$E$'].apply(lambda x: industries[x])
```
```py
industry_dummies = pd.get_dummies(X['industry'])
X[industry_dummies.columns] = industry_dummies
x = list(industry_dummies.columns)[1:] + list(race_dummies.columns)
model = OLS(X['$C$'], X[x])
result = model.fit()
result.summary()
```
然后,你得到图 13.9 显示的结果。
![Statistics highlighting the relationship between race and industry](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cdbb251748b47ff133a095e10d48b523.png)
在这里,置信区间要窄得多,你可以看到种族和收入水平之间仍然没有明显的联系:系数大致相等。这是一个因果回归结果:你现在可以看到,改变社区种族构成的干预没有任何效果。这个简单的例子很好,因为你可以看到要控制什么,并且你已经测量了你需要控制的东西。一般怎么知道控制什么?你会一直成功吗?事实证明这在实践中非常困难,但有时这是你能做的最好的了。
## 13.4 阻止非因果路径的控制
你刚刚看到,你可以通过控制正确的变量,把一个相关的结果变成一个因果结果。你怎么知道要控制哪些变量?你怎么知道回归分析会控制他们?本节主要依赖于第 11 章中的 d-分离。如果这些材料不新鲜,你可能想现在就复习一下。
你在前一章已经看到,条件作用可以打破统计上的依赖。如果你以路径的中间变量 *X → Y → Z* 为条件,你将打破路径产生的 *X* 和 *Z* 之间的依赖关系。如果您以混杂变量 *X ← Z → Y* 为条件,您也可以打破混杂变量导致的 *X* 和 *Y* 之间的依赖关系。重要的是要注意,由 *X* 和 *Y* 之间的其他路径引起的统计相关性不会受到这种调节的影响。例如,如果你在图 13.10 的系统中以 *Z* 为条件,你将摆脱混杂因素,但留下因果关系。
![Conditioning on Z disrupts the confounding but leaves the causal statistical dependence between X and y intact](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4522b9649bc0986a6b20f78c1c8aef4c.png)
如果你有一个通用的规则来选择阻塞哪些路径,你可以消除变量之间的所有非因果相关性,但保留因果相关性。“后门”标准是您正在寻找的规则。它告诉你应该控制哪组变量, *Z* ,以消除*X[I]和*X[j]之间的任何非因果统计相关性。在引入标准之前,您应该注意最后的细微差别。如果你想知道*X[I]和*X[j]之间的相关性是不是“因果”,你就要担心效果的方向了。例如,很高兴知道“度假”和“放松”之间的相互关系没有混淆,但你真的想知道“度假”是否会让你“放松”。这将为去度假放松的政策提供信息。如果因果关系颠倒过来,你就不能采取那种政策。****
记住,后门标准是相对于一对有序变量定义的,( *X[i] ,X[j] )* ,其中 *X[i]* 将是原因, *X[j]* 将是结果。
```py
Definition 13.1\. Back-Door Conditioning
It’s sufficient to control for a set of variables, Z, to eliminate noncausal dependence for the effect of *X[i]* on *X[j]* in a causal graph, G, if
```
* Z 中没有变量是 Xi 的后代,并且
* Z 封锁 Xi 和 Xj 之间包含指向 Xi 的箭头的所有路径。
我们不去证明这个定理,但是让我们为它建立一些直觉。先来考察条件“Z 中没有变量是*X[I]的后代。”你之前了解到,如果你以一个共同的效应*X[I]和*X[j]为条件,那么这两个变量将是有条件依赖的,即使它们通常是独立的。如果你以共同效应中的任何一个效应为条件,这一点仍然成立。因此,您可以看到后门标准的第一部分阻止您在没有依赖的地方引入额外的依赖。***
这种情况还有其他原因。如果你有一个类似*X[I]→*X[k]*→*X[j]*的链条,你看到 *X[k]* 是 *X[i]* 的后代。这在 z 中是不允许的。这是因为如果你以 *Xk* 为条件,你就阻断了*X[I]和*X[j]之间的因果路径。因此,你可以看到第一个条件也阻止了你对落在因果路径上的变量进行条件化。***
第二个条件是“Z 阻塞了在*X^I和*X^j之间的每一条路径,该路径包含一个指向*X^I的箭头。”这一部分将告诉我们控制混杂因素。你怎么能看到这个?让我们考虑一些情况,其中沿着在 *Xi* 和 *Xj* 之间的路径有一个或多个节点,并且该路径包含一个到*X^I的箭头。如果在*X[I]和*X[j]之间的路径上有一个碰撞器,那么这条路径已经被阻塞了,所以你只需要在空集上设置条件来阻塞这条路径。接下来,如果沿着路径有一个分叉,像路径 *Xi ← Xk → Xj* ,并且没有碰撞器,那么你有典型的混杂。您可以对路径上任何会阻塞它的节点设置条件。在这种情况下,您将*X^k添加到集合 *Z* 中。注意,从*X[I]到*X[j]不可能有箭头指向*X[I]的因果路径,因为箭头指向*X^I。***********
因此,你可以看到你阻断了从 Xi 到 Xj 的所有非因果路径,剩下的统计相关性将显示出*X[j]对*X[I]的因果相关性。有没有一种方法可以利用这种依赖性来估计干预的效果?**
## G 公式
让我们看看干预到底意味着什么。这意味着你有一个如图 13.11 所示的图表。
![A pre-intervention casual graph](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0b4c4b9ffd5c499e6ee80ac3bb9e9bb4.png)
图 13.11 干预前因果图。从这个系统中收集的数据反映了我们观察世界的方式。
你要估计*X[2]T3 对 *X[5]* 的影响。也就是你想说“如果我介入这个系统把*X[2]的值设置为*X[2],*X[5]会怎么样?为了量化这种影响,你必须认识到,所有这些变量的值不仅取决于它们的前身,还取决于系统中的噪声。因此,即使存在*X[2]对*X[5]的确定性影响(比方说,将*X[5]的值提高一个单位),您也只能用一个值分布来真正描述*X[5]将取的值。因此,当你估计*X[2]对*X[5]的影响时,你真正想要的是*X[5]的分布,当你介入设置*X[2]的值时。************
我们来看看*干预*是什么意思。我们说我们想要忽略 *X1* 对 *X2* 的通常影响,并通过向 *X2* 施加一些外力(我们的动作)将 *X2* 的值设置为 *x2* 。这消除了 *X2* 和 *X1* 之间通常的依赖性,并通过中断穿过 *X2* 的路径来破坏 *X1* 对 *X4* 的下游影响。因此,我们还将期望 X1 和 X4,P( *X1,X4* )之间的边际分布发生变化,以及 *X1* 和 *X5* 的分布!我们的干预可以影响它下游的每一个变量,其方式不仅仅取决于值 *x2* 。我们实际上破坏了其他的依赖性。
你可以画一张新的图表来表示这种干预。在这一点上,你会看到操作与观察*X[2]= X[2]的值非常不同,即简单地调节 *X[2] = x[2]* 。这是因为你破坏了图中的其他相关性。你实际上在谈论一个由图 13.12 中的图表描述的新系统。*
![Graph representing the intervention do(X2 = x2)](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c2017ef830fa92c0510820d73c53434c.png)
你需要一些新的符号来谈论这样的干预,所以你将表示*do(X[2]= X[2])*你执行这个操作的干预。这给出了干预的定义,或 *do 操作。*
```py
Definition 13.2\. Do-operation
We describe an intervention called the do() operation in a system described by a DAG, G as an operation where we do Xi by
```
删除 G 中指向 xi 的所有边,并将 Xi 的值设置为 Xi。
这张新图的联合分布是什么样的?让我们使用通常的因式分解,并写出以下内容:
![usual factorization formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cac1d15ef3451399a49af0d81905022b.png)
这里我们刚刚用δ函数表示了 *P(X[2] )* ,所以当 *X[2] = x[时*X[2]≠X[2]X*P(X[2])*= 1 我们基本上是说,当我们干预设置*X[2]= X[2]*时,我们确信它起作用了。我们可以在其他地方执行*x[2]= x[2],就像在 *P(X[4] |X[2] ,X[3] )* 的分配中一样,但是只需用 *X[2] = x[2]* 来替换 *X[2]*
最后,让我们以 X2 分布为条件,来摆脱这个公式右边的怪异之处。我们可以这样写:
![conditioning of X2 distribution](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e890acbfc9a9d33ee732f1c3b2f199e2.png)
准确地说,
![Precise conditioning of X2 distribution](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/390fe71abd974a0830e7e22c7c4bd781.png)
令人难以置信的是,这个公式在一般情况下是有效的。我们可以这样写:
![conditioning of X2 distribution additional example](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c25801bc458538ffba1bda39754db3ae.png)
这给了我们一个很好的通用规则:变量的父变量总是满足后门标准!事实证明,我们甚至可以比这更一般化。如果我们把除 Xi 和 Xj 之外的所有东西都边缘化,我们会看到父母是控制混杂因素的一组变量。
![variables that control confounders](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/bafb14319afece2bf3d282988b844ef6.png)
事实证明(我们将在没有证明的情况下陈述),你可以将父集合推广到满足后门标准的任何集合 Z。
![formula for back door criterion](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/480d3ca33c6c087526be979f1c1d616d.png)
您可以忽略 Z,使用条件概率的定义写出一个重要的公式,如
定义 13.3。
定义 13.3。罗宾斯 G 公式
![formula for definition of conditional probability](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cf5e0d63a2f2d55ca982cd431f0beaaa.png)
这是在干预*X[I]下估计*X[j]分布的一般公式。请注意,所有这些分布都来自干预前系统。这意味着你可以在一些假设的干预下,用观测数据来估计*X[j]的分布!***
这里有一些重要的警告。首先,方程 13.4*P(X[I]| Pa(X[I])*的分母中的项,对于左边要定义的量,必须是非零的。这意味着,你必须观察到 Xi 呈现出你想通过干预设定的值。如果你从未见过它,你不能说系统会如何响应它!
接下来,假设你有一个可以控制的集合 *Z* 。实际上,很难知道你是否找到了一组好的变量。总会有你从未想过要测量的混杂因素。同样,你控制已知混杂因素的方法可能不会做得很好。当你进入一些机器学习估值器时,你会更加理解第二个警告。
有了这些警告,很难从观察数据中估计因果关系。你应该把条件反射法的结果看作是对因果效应的临时估计。如果您确定您没有违反后门标准的第一个条件,那么您可以预期您已经移除了一些虚假的依赖。你不能肯定地说你减少了偏见。
举例来说,想象一下*X[I]对*X[j]的影响的两个偏差源。假设您对测量的平均值感兴趣**
![two sources of biases](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8ad84433b3ac20618fffd020e60a2024.png)
路径 *A* 引入的偏置为δ,路径 B 引入的偏置为 2δ。如果你在不控制任何一条路径的情况下估计平均值,你会发现
![biased path A](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2c12416a8990830749d64fdf2a4bde56.png)
如果你沿着路径 *A* 控制一个混杂因素,那么你去除它对偏差的 *j^((偏差,A))* 贡献,剩下
![remainder of biased path A](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ce43ba32f2f60091617719675b9570bf.png)
现在偏差大了一倍!当然,问题是你纠正的偏差实际上是把我们的估计值推回到正确的值。在实践中,更多的控制通常会有所帮助,但你不能保证你不会发现这样的效果。既然你已经有了观察因果推断的良好背景,让我们看看机器学习估计器如何在实践中有所帮助!
## 13.5 机器学习估算器
一般而言,您不会想要估计干预下的完全联合分布。你甚至可能对边缘感兴趣。通常,你只是对平均效果的差异感兴趣。
在最简单的情况下,你想估计一些结果的期望差,Xj,你能控制的变量,Xi 的单位变化。例如,你可能想测量
![machine learning estimator formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/7bcb593e7f7be666b97ba91fb5b1d95f.png)
这将告诉您,当您将*X[I]设置为 1 时,如果 *X[i]* 设置为 0,您平均可以预期的*X[j]T3 的变化。**
让我们重温一下 g 公式,看看如何测量这些量。
## 13.5.1 重新审视 G 公式
g 公式告诉你如何估计因果效应, *P(Xj|do(Xi = xi)* ),使用观察数据和一组变量进行控制(基于我们对因果结构的了解)。上面写着:
![The G Formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/8858628ace8815bc622941d789cec873.png)
如果你在每一边取期望值(乘以 Xj,然后在 Xj 上求和),你会发现:
![The G Formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/afb83b58b6530505da4d43d1d22d8257.png)
在实践中,很容易估计这个公式右边的第一个因子。如果你用均方误差损失来拟合回归估计量,那么最佳拟合就是每个点 *(X^i ,Z)* 的 *Xj* 的期望值。只要模型有足够的自由度来准确描述期望值,就可以通过使用标准的机器学习方法来估计第一个因素。
估算整个左侧,需要处理 *P(Z)* 项,以及和。原来有一个简单的技巧可以做到这一点。如果你的数据是从观测联合分布中抽取的,那么你的样本 *Z* 实际上就是从 *P(Z)* 中抽取的。然后,如果您将 *P(Z)* 项替换为 *1/N* (对于 *N* 个样本)并对数据点求和,您将得到这个和的估计值。也就是说,您可以进行如下替换:
![The G Formula](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e61f69d948682f9be38fb4c18de73b0f.png)
## 一个例子
让我们回到图 13.11 中的图表。我们将使用朱迪亚·珀尔书中的一个例子。我们担心人行道会滑,所以我们正在调查其原因。 *X5* 可以是 1 或 0,分别表示滑或不滑。你发现人行道在潮湿的时候很滑,你会用 *X4* 来表示人行道是否潮湿。接下来,你需要知道人行道潮湿的原因。你看到一个洒水车在人行道附近,如果洒水车开着,会把人行道弄湿。 *X[2] 你会注意到雨后的人行道也是湿的,你会用雨后的 X3 表示为 1,否则为 0。最后,你注意到在阳光明媚的日子里,你打开了洒水器。你将用 *X[1]* 来表示天气,其中 *X[1]* 如果是晴天就是 1,否则就是 0。*
在这幅图中,雨和打开的洒水器是负相关的。这种统计相关性的发生是因为它们相互依赖于天气。让我们模拟一些数据来探索这个系统。您将使用大量数据,因此随机误差会很小,您可以将注意力集中在偏差上。
```py
import numpy as np
import pandas as pd
from scipy.special import expit
N = 100000
inv_logit = expit
x1 = np.random.binomial(1, p=0.5, size=N)
x2 = np.random.binomial(1, p=inv_logit(-3.*x1))
x3 = np.random.binomial(1, p=inv_logit(3.*x1))
x4 = np.bitwise_or(x2, x3)
x5 = np.random.binomial(1, p=inv_logit(3.*x4))
X = pd.DataFrame({'$x_1$': x1, '$x_2$': x2, '$x_3$': x3,
'$x_4$': x4, '$x_5$': x5})
```
这里的每个变量都是二进制的。您可以使用逻辑连接函数来使逻辑回归适当。当你不知道数据生成过程时,你可能会更有创造力。一会儿你就讲到这一点了!
让我们看看相关矩阵,如图 13.13 所示。天气好的时候,洒水车就开了。下雨的时候,洒水器就关了。你可以看到,由于这种关系,洒水器开着和下雨之间有一种负的关系。
有几种方法可以估计出*X[2]对 *X[5]* 的影响。第一种简单的方法是,给定 *X[2] = 1* 或 *X[2] = 0* ,找出 *X[5] = 1* 的概率。这些概率的差异告诉你,在洒水器打开的情况下,人行道湿滑的可能性有多大。计算这些概率的一个简单方法就是对每个数据子集中的 X5 变量进行平均(其中 *X[2] = 0* 和 *X[2] = 1* )。您可以运行以下程序,生成图 13.14 中的表格。*
```py
X.groupby('$x_2$').mean()[['$x_5$']]
```
![The correlation matrix for the simulated dataset](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c832777b7783a54553b34536ab8ff960.png)
![The naive conditional expectation values for whether the grass is wet given that the sprinkler is on. ](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fe16fea07cfcd66e7c58cdbb2cec9382.png)
如果你看看这里的差异,你会发现人行道是 0.95-0.86 = 0.09,或者说,在洒水装置打开的情况下,9 个百分点的可能性更容易打滑。您可以将其与介入图进行比较,以获得变化的真实估计值。您可以使用此处显示的过程生成此数据:
```py
N = 100000
inv_logit = expit
x1 = np.random.binomial(1, p=0.5, size=N)
x2 = np.random.binomial(1, p=inv_logit(-3.*x1))
x3 = np.random.binomial(1, p=inv_logit(3.*x1))
x4 = np.bitwise_or(x2, x3)
x5 = np.random.binomial(1, p=inv_logit(3.*x4))
X = pd.DataFrame({'$x_1$': x1, '$x_2$': x2, '$x_3$': x3,
'$x_4$': x4, '$x_5$': x5})
```
现在,*X[2]独立于*X[1]和 *X[3] 。*如果重复之前的计算(试试看!),你就得到 0.12 的差异,或者说 12 个百分点。这比天真的估计要大 30 %!**
现在,您将使用一些机器学习方法,严格使用观察数据来尝试获得真实(0.12)效应的更好估计。首先,您将尝试对第一个数据集进行逻辑回归。让我们重新创建天真的估计,只是为了确保它正常工作。
```py
from sklearn.linear_model import LogisticRegression
# build our model, predicting $x_5$ using $x_2$
model = LogisticRegression()
model = model.fit(X[['$x_2$']], X['$x_5$'])
# what would have happened if $x_2$ was always 0:
X0 = X.copy()
X0['$x_2$'] = 0
y_pred_0 = model.predict_proba(X0[['$x_2$']])
# what would have happened if $x_2$ was always 1:
X1 = X.copy()
X1['$x_2$'] = 1
y_pred_1 = model.predict_proba(X1[['$x_2$']])
# now, let's check the difference in probabilities
y_pred_1[:, 1].mean() - y_pred_0[:,1].mean()
```
你先建立一个逻辑回归模型,用*X[2]来预测*X[5]。您进行预测,并使用它来获得在 *X[2] = 0* 和 *X[2] = 1* 状态下 *X[5] 的概率。你对整个数据集都这样做了。***
这样做的原因是,您经常会有更多有趣的数据集,有更多的变量在变化,并且您会希望看到整个数据集上*X[2]对 *X[5]* 的平均影响。这个过程允许您这样做。最后你求两个状态概率的平均差,你得到和之前一样的 0.09 的结果!*
现在,你想要对相同的观察数据进行控制,以得到因果(0.12)结果。您执行与之前相同的过程,但是这次您将*X[1]包括在回归中。*
```py
model = LogisticRegression()
model = model.fit(X[['$x_2$', '$x_1$']], X['$x_5$'])
# what would have happened if $x_2$ was always 0:
X0 = X.copy()
X0['$x_2$'] = 0
y_pred_0 = model.predict_proba(X0[['$x_2$', '$x_1$']])
# what would have happened if $x_2$ was always 1:
X1 = X.copy()
X1['$x_2$'] = 1
# now, let's check the difference in probabilities
y_pred_1 = model.predict_proba(X1[['$x_2$', '$x_1$']])
y_pred_1[:, 1].mean() - y_pred_0[:,1].mean()
```
在这种情况下,您会发现结果为 0.14。你高估它了!哪里出了问题?你实际上并没有在建模过程中做错什么。问题很简单,逻辑回归不是这种情况下的正确模型。对于每个变量的父代来说,这是预测其值的正确模型,但对于父代之后的后代来说,这种模型并不适用。我们能做得更好吗,用一个更通用的模型?
这将是你第一次看到神经网络对于一般的机器学习任务有多么强大。在下一章中,你将更详细地学习如何构建它们。现在,让我们使用 keras 尝试一个深度*前馈*神经网络。之所以称之为深度,是因为不仅仅是输入和输出层。这是一个前馈网络,因为你将一些输入数据放入网络,并通过各层将它们向前传递以产生输出。
深度前馈网络具有“通用函数逼近器”的特性,在某种意义上,只要给定足够的神经元和层数,它们就可以逼近任何函数(尽管在实践中学习起来并不容易)。您将像这样构建网络:
```py
from keras.layers import Dense, Input
from keras.models import Model
dense_size = 128
input_features = 2
x_in = Input(shape=(input_features,))
h1 = Dense(dense_size, activation='relu')(x_in)
h2 = Dense(dense_size, activation='relu')(h1)
h3 = Dense(dense_size, activation='relu')(h2)
y_out = Dense(1, activation='sigmoid')(h3)
model = Model(input=x_in, output=y_out)
model.compile(loss='binary_crossentropy', optimizer='adam')
model.fit(X[['$x_1$', '$x_2$']].values, X['$x_5$'])
```
现在像以前一样做同样的预测程序,结果是 0.129。
```py
X_zero = X.copy()
X_zero['$x_2$'] = 0
x5_pred_0 = model.predict(X_zero[['$x_1$', '$x_2$']].values)
X_one = X.copy()
X_one['$x_2$'] = 1
x5_pred_1 = model.predict(X_one[['$x_1$', '$x_2$']].values)
x5_pred_1.mean() - x5_pred_0.mean()
```
你比逻辑回归模型做得更好!这是一个棘手的案子。给你的是二进制数据,很容易计算概率,直接使用 g 公式你会做得最好。当你这样做的时候(你自己试试!),你从这个数据算出 0.127 的真实结果。你的神经网络模型很接近!
现在,你想制定一项政策,让人行道不那么容易滑。你知道,如果你不经常打开洒水器,应该会有效果。你可以看到,制定这一政策(并进行干预以改变系统),你可以预期人行道的滑度会降低。多少钱?当您设置洒水喷头=关闭时,您希望比较干预前和干预后打滑的可能性。你可以简单地用我们的神经网络模型来计算,就像这样:
```py
X['$x_5$'].mean() - x5_pred_0.mean()
```
这使得结果为 0.07。如果你制定一个保持洒水器关闭的政策,人行道打滑的可能性将会降低 7 %!
## 13.6 结论
在这一章中,你已经开发了进行因果推理的工具。您已经了解到,机器学习模型有助于获得更通用的模型规格,并且您看到,使用机器学习模型预测结果越好,就越能从观察性因果效应估计中消除偏差。
观察性因果效应估计应始终小心使用。只要有可能,你应该尝试做随机对照实验,而不是使用观察估计。在这个例子中,你应该简单地使用随机控制:每天抛一枚硬币,看看洒水器是否打开。这将重新创建干预后系统,并让您测量洒水装置关闭时与打开时(或系统未干预时)相比,人行道变滑的可能性有多大。当你试图评估一项政策的效果时,很难找到一种替代方法来通过受控实验来实际测试这项政策。
在设计机器学习系统时,能够进行因果思考尤其有用。如果你只是想说给定系统中通常发生的事情,什么结果是最有可能的,标准的机器学习算法是合适的。你不是在试图预测干预的结果,你也不是在试图建立一个对系统运行方式的变化具有鲁棒性的系统。你只是想描述系统的联合分布(或者它下面的期望值)。
如果你想告知政策变化,预测干预的结果,或使系统对其上游变量的变化(即外部干预)具有鲁棒性,那么你将需要一个因果机器学习系统,在其中你控制适当的变量来测量因果效应。
一个特别有趣的应用领域是在逻辑回归中估计系数。之前,您看到了逻辑回归系数在观察数据中有一个特殊的解释:它们描述了某个自变量的单位增加产生结果的可能性有多大。如果您控制正确的变量以获得因果逻辑回归估计(或者只是对控制生成的数据进行回归),那么您会有一个新的、更强有力的解释:系数告诉您当您干预以将自变量的值增加一个单位时,发生结果的可能性有多大。您可以使用这些系数来制定政策!
# 数据科学的“单元测试”
> 原文:<https://www.dominodatalab.com/blog/unit-testing-data-science>
我们经常听到数据科学组织谈论的一个有趣的话题是“单元测试”这是构建软件的长期最佳实践,但是对于定量研究工作来说,它到底意味着什么还不是很清楚——更不用说如何实现这样的实践了。这篇文章描述了我们对这个话题的看法,以及我们如何设计 Domino 来促进我们所认为的相关最佳实践。
## 如果我们知道自己在做什么...
首先,我们认为术语“单元测试”并不适用于所有类型的数据科学工作。这是因为“测试”意味着你正在测试的东西有一个正确的答案:先验地,你知道结果应该是什么。
如果您正在创建一个“华氏温度到摄氏温度的转换”函数,您可以查找正确的答案,并验证 32 华氏度的输入应该输出 0 摄氏度。
但是,当我们开始研究一个新的模型或分析时,我们并不知道正确的答案。假设你在一个[保险数据科学](https://www.dominodatalab.com/insurance/?utm_source=blog&utm_medium=post&utm_campaign=unit-testing-data-science)团队中,正在建立一个模型来预测某人申请贷款时的违约概率;或者客户流失的可能性;或者申请保险的人可能会提出的索赔。对于一个你可以提前知道的预测,没有“正确”的答案。当然,您有验证数据集,因此您可以用各种方式来度量模型性能。但是一个模型是“好”还是“改进”往往是一个解释的问题。
或者如爱因斯坦所说:
如果我们知道我们在做什么,那就不叫研究了,对吗?
有大量的数据科学工作涉及到构建核心库函数,其中有明确定义的正确答案——并且无论如何这些函数都应该进行单元测试。
但通常当人们问及“数据科学的单元测试”时,他们指的是别的东西——我们认为这都是关于质量控制的。软件中单元测试的最终目标是确保你的代码在你使用它之前没有引入问题,因为它会产生更大的影响。我们看到这种质量控制在典型的数据科学工作流程中的两个地方非常重要。
## 人工守门
如果您或您的同事对某些代码进行了更改,并希望替换旧版本,您如何知道它没有引入任何问题(更不用说它得到了改进)?单元测试有助于确保软件做到这一点,当然还有代码审查。对于数据科学工作,我们发现让评审员检查实验结果至关重要。
Domino 通过在运行代码时自动记录结果,并允许您检查这些结果来解决这个问题。结果可以是定量统计,如 F1 分数、p 值、AUC 等。或者它们可以是视觉结果,比如 ROC 曲线。迭代之后,当你有一个你喜欢的版本想要评审(或者让同事评审)的时候,你可以对比一下:
![Comparing Run Results](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/429d9e202db6115c9d22ee3fa30c72b3.png)
在将提议的变更合并回项目之前,这个“评审”过程可以作为一个正式的关口。
在没有已知的“正确”答案的情况下,我们发现质量控制最好通过人工检查结果(定量和视觉)来实现。
## 自动部署
软件中单元测试的另一个常见用例是在部署到生产环境之前确保一切正常。
在我们的例子中,Domino 允许您将预测模型部署为 API,以便其他软件系统可以轻松地使用它们。我们提供的一个强大功能是安排再训练任务的能力:您可以运行代码,根据新数据再训练您的模型,并自动将更新后的模型重新部署到生产中。
在这种情况下,如果您更新的模型不能满足某些条件,您可能希望部署失败。为了处理这个问题,如果您的重新训练脚本抛出错误,Domino 将中止部署。这允许您在自己选择的编程语言中构建任何您想要的把关检查。例如,在 R:
```py
library(randomForest)
library(jsonlite)
df <- read.csv("./winequality-red.csv", h=T, sep = ";")
df$quality <- factor(df$quality)
cols <- names(df)[1:11]
clf <- randomForest(df$quality ~ ., data=df[,cols], ntree=50, nodesize=4, mtry=8)
runChecks <- function(clf) {
finalErr <- clf$err.rate[length(clf$err.rate)]
if (finalErr > 15) {
stop("error rate too high")
}
}
runChecks(clf)
save(clf, file="classifier.Rda")
```
我们这里的代码将训练模型,然后执行 runChecks 函数,如果新模型的错误率太大,该函数将失败。
Domino 让我们安排这个“再培训”。r "脚本并自动部署生成的更新模型,只要脚本成功运行。
![Scheduled Runs](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/0739a1b3cf9dd8b88f942ab0f6cced2b.png)
这样,您可以编写自己的“测试”来确保新模型不会被部署,除非它们通过您的检查,无论您如何定义它们。
## 结论
我们认为“单元测试”对于数据科学工作流来说是一个被误导的术语。相反,我们更愿意谈论如何实现质量控制和把关,包括对人和自动化部署过程。鉴于定量研究的性质(复杂且事先不知道“正确答案”),我们认为实现这些目标的最佳方式是允许人工对结果进行视觉检查和比较,并让用户为自动化部署定义自己的把关检查。
# 通过云中的容器化释放 SAS 的威力
> 原文:<https://www.dominodatalab.com/blog/unlock-the-power-of-sas-with-containerization-in-the-cloud>
[容器化](https://blog.dominodatalab.com/the-real-value-of-containers-for-data-science/)是一项关键技术,它加速了数据科学在全球众多公司中的采用和影响。实验的状态(数据、代码、结果、包版本、参数等)。)可以在一个轻量级容器中整体捕获,并部署在客户的内部基础架构和/或弹性计算基础架构(如[云](https://blog.dominodatalab.com/data-science-aws/))上。这意味着数据科学实验可以轻松快速地重现,并且数据科学团队可以建立在其他人之前的工作基础上,这最终有助于他们推动更高水平的创新。
现在,通过 Domino 上的 SAS Analytics for Containers,SAS 用户可以利用 SAS Analytics 和 SAS Viya 获得集装箱化和云的所有好处。这些预构建的 SAS 容器可以很容易地导入到 Domino 的弹性计算基础设施中,供数据科学家使用,允许他们与 R、Python 或使用 TensorFlow、H2O 等的其他实验交叉授粉。有了 SAS。在 Domino 上使用 SAS Analytics for Containers,用户可以在浏览器或 [Jupyter 笔记本](https://blog.dominodatalab.com/to-jupyter-and-beyond/)中直接使用 SAS Studio 编写 SAS 代码、开发模型和发布应用程序。用户将不再需要为 SAS 使用 R 或 [Python 包装器。相反,他们可以从本机 SAS 体验中受益,同时利用 Domino 提供的所有实验管理功能,包括](https://blog.dominodatalab.com/pandas-for-sas-users-part-1)[再现性](https://blog.dominodatalab.com/machine-learning-reproducibility-crisis/)、[协作](https://blog.dominodatalab.com/domino-honored-named-visionary-gartner-magic-quadrant/),以及对可扩展计算的轻松访问。此外,Domino 允许 IT 在一个地方管理 sa 和开源工作负载,并帮助 IT 团队导航 sa 向云的迁移。
![Sas studio in Domino](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2928d45ce03299a78a1718d82447998d.png)
Domino 上的 SAS Analytics for Containers 为组织加速采用 AWS 等云平台提供了一条清晰的道路,允许组织减少其数据中心的规模,利用弹性计算处理固有的突发工作负载,并将所有分析工作负载迁移到集中式基础架构。使用 [Domino Lab](https://www.dominodatalab.com/product/) ,数据科学家只需轻轻一点,就可以使用他们首选的计算资源隔离运行 SAS 分析和机器学习工作负载,而不必等待其他工作负载完成。此外,数据科学团队可以加速并行实验,以实现更快的迭代、建模竞赛和结果。
Domino 跟踪 SAS 项目的所有版本,并捕获每个实验的状态,包括数据、代码、SAS 版本、环境、讨论、参数和结果。这些项目可以在数据科学团队之间共享,以便进行协作,并作为未来项目的基础。捕获这些工件有助于用户实现模型起源和治理,并在他们的工作流中提供可审计性。
当数据科学家准备好部署他们的 SAS 模型时,他们可以利用 [Domino Launchpad](https://www.dominodatalab.com/product/) 功能在可扩展的计算基础设施上轻松发布模型(以及模型的不同版本)。数百个模型可以同时部署和运行。
Domino 使用[容器](https://blog.dominodatalab.com/data-science-docker/)作为其模型管理平台的基础,该平台可以部署在本地或云中。此外,Domino 使用户能够使用任何选择的工具,无论是开源的还是私有的。通过在 Domino 上添加 SAS Analytics for Containers,用户可以轻松获得 SAS 数据科学工具,而不必担心文档或再现性。模型管理的所有方面都由 Domino 负责,允许用户专注于他们最擅长的事情:创建 SAS 模型和推动创新。
## 了解更多信息:
* [查看新闻稿。](https://www.dominodatalab.com/news/domino-data-lab-partners-with-sas-to-accelerate-data-science-work-in-the-cloud/)
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Funlock-the-power-of-sas-with-containerization-in-the-cloud%2F&title=Unlock%20the%20Power%20of%20SAS%20with%20Containerization%20in%20the%20Cloud)
# 使用贝叶斯方法清理人类标签
> 原文:<https://www.dominodatalab.com/blog/using-bayesian-methods-to-clean-up-human-labels>
## 会话摘要
Derrick Higgins 在最近的 [Data Science Popup](https://popup.dominodatalab.com/?utm_source=blog&utm_medium=post&utm_campaign=using-bayesian-methods-to-clean-up-human-labels) 会议上,深入研究了在收集和创建数据集时如何使用贝叶斯方法来提高注释质量。希金斯从覆盖模型开始,这些模型是“称为概率图形模型的建模家族”的一部分。概率图形模型常用于贝叶斯统计。然后,Higgins 介绍了“一个基于高斯混合模型的示例,展示了如何开始使用 Stan 并在没有太多该框架的经验的情况下构建模型。”
会议的主要亮点包括
* 需要带有 y 变量的标注或注释数据,以使用监督模型进行预测
* 不是每个人都能得到干净的数据集,比如学术界使用的 MNIST 和虹膜数据集
* 覆盖模型,如 IRT,梅斯,贝叶斯网络(贝叶斯网),潜在的狄利克雷分配(LDA),斯坦(使用 PyStan)和更多
希金斯在会议结束时提出了两点:“一是思考你的数据。考虑如何创建数据,以便对建模有用。不要认为任何事情都是理所当然的,马上开始建模。第二,图形模型:不像以前那么难了。”
要了解更多关于本次会议的见解,请观看视频或通读文字记录。
[https://fast.wistia.net/embed/iframe/7xiha29s07](https://fast.wistia.net/embed/iframe/7xiha29s07)
# 利用数据科学在 Macbook 上获得优惠
> 原文:<https://www.dominodatalab.com/blog/using-data-science-to-get-a-good-deal-on-a-macbook>
## 介绍
我创建了一个 Python 项目,它可以抓取纽约 Craigslist 上关于 Macbook Air 13 的帖子,并自动向你显示最划算的交易——好到可以在易贝卖掉赚钱的交易。这是针对特定产品和位置的概念验证设计,但该模型非常灵活,可以扩展到其他位置和/或产品。
该算法根据型号年份和其他特征,知道每台 Macbook 应该定价多少。定价异常低且根据其规格被低估的 Macbooks 显示在谷歌地图上,这样人们就可以预测他们愿意投入多少时间和精力。
该算法利用了 Craigslist 上定价不透明的机会。人们往往没有敏锐的眼光来确定他们的上市价格。他们甚至不知道它是否能与其他房源竞争。这创造了一个从错误定价中获利的完美环境。
## 动机
几个月前,我想买一台 Macbook Air。但我没有时间、数据或耐心去弄清楚相对于市场而言什么是好交易。我如何知道我正在看的这个帖子相对于其他东西是不是一个好的交易?是便宜货吗?
如果是便宜货,很可能已经卖出去了——所有的时间都浪费在筛选上了。我需要开发一些能让这些宝石快速浮出水面的东西。因此,我认为这是一个有趣且有用的数据科学产品。
## 高级方法
我考虑了一些如何对这个问题建模的方法:异常检测技术、分类或回归建模。经过大量探索,我发现用回归模型拟合数据是最准确的。
通过使用成本函数平均绝对误差(mae)和按负残差排序。然后验证 vs 易贝,以便只过滤有利可图的项目,这被证明是最好的方法。因此,产生了最佳市场内(Craigslist)或跨市场(易贝)的推荐列表。验证是通过使用易贝的拍卖结束价格超过 2 周(平均)。
![ml pipeline diagram](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/23f247c39c868dee98d27bc859a7b8c7.png)
## 挑战和障碍
### 特征工程
寻找和创建最重要的特性不是一件简单的任务。[创建合适的特征矩阵](/blog/manual-feature-engineering)是任何机器学习管道中最重要的方面之一——显然,你的模型的输出只和你的输入一样好(特征矩阵)。我可以用最多的信号使用或创建哪些功能?刮什么数据才是正确的?我应该瞄准哪个城市?我需要多少例子?...所有这些都属于数据“争论”和“欺骗”的范畴。一旦我想出了我想要的(或者说我是这么想的),我就将数据可视化在一个散点图上(在 sci-kit learn 中),该图显示了多个特征如何相互关联的图。这是一种很好的技术,可以在早期判断哪些特性会产生最多的信息增益(信号)。
从建模的角度来看,“价格”很明显是由“车型年”来解释的。但是一些 Craiglist 帖子没有提供车型年份。相反,人们通常会说“BNIB”或“最新款”或“密封在盒子里”或一些型号。为了了解这一点,我基本上使用了潜在主题建模器(LDA)对错误分类的帖子集的帮助。
在收集了所有这些短语之后,我构建了一个包含几乎所有内容的正则表达式字符串。一些人谈到了他们 MacBook 的规格。我该如何解决这个问题?我可以为每个型号的所有技术规格制作一个正则表达式字典(我最终做到了),或者我可以创建一个余弦相似矩阵,其中前几个文档是每个型号的官方技术规格,并相应地对具有最高相似性得分的每个帖子进行分类。
这将使模型半无人监管(对于那些保持跟踪的人来说)。虽然这是一个有趣的方法,但我发现字典方法在实现中更有用,在将其归类为升级或基本配置时更有用。我最终尝试和使用的功能是——型号年份、AppleCare、升级或基本[cpu | ram | hd]。
### 学习方法
分类方法意味着手动标记[“好交易”或“坏交易”]——这可不好玩。但是,我们可以把它简化为一个“分类”问题,而不是思考这个问题,“我们如何识别一个定价过低的商品?”也就是说,我们如何找到超出正常范围的数据点?异常检测技术会有所帮助,特别是 DBSCAN。我面临的一个问题是价格的方向(过高或过低都会被检测到)及其准确性并不是很好。最终,我发现回归建模是最好的,也是最容易实现的。
## 寻找模型
网格搜索理想模型和最佳参数。我们考虑的三个是:支持向量回归机(类似于 SVM),套索回归和随机森林回归机。
## 拟合模型
推荐的“好交易”列表是通过首先将回归模型拟合到一组特征并按最大负残差排序(最大正残差给出了所有定价过高的交易)而产生的。
![random forest diagram of best macbook deals](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/52127346367236cc6288f089e3f94a11.png)
## 关于 NLP 和附加 EDA 的更多信息
首先使用一个帖子的文本(标题和正文)作为语料库中的一个文档,并由此构建一个 TF-IDF 矩阵(使用二元模型)。借助于潜在主题提取方法,非负矩阵分形,我发现了一些隐藏的洞察力的宝石。
搜索关键词*公司*,避开 *OBO* 和*或最佳报价*。似乎违反直觉,对吗?Craigslist 上的帖子几乎从来不会被支付“要价”,大多数情况下还会有谈判。那么,为什么你会去搜索那些清楚地表明卖家可谈判性的东西呢?事实证明,使用“公司”这个关键词的人往往已经给了你最低价,不需要讨价还价。“OBO”和“或最佳报价”是定价过高的交易中常见的口号。
![keyword frequency in macbook deals data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/1b64ea9ca5f0ee4f8a1778269a350dc4.png)
* *数据基于美国各大城市 470 个帖子中排名前/后 20 位的随机样本*
我还发现,大多数倾向于低价出售的人都是因为它是一件礼物。所以,当你今年圣诞节购物时,请记住这一点。
谢谢大家@ Zipfian
# Trupanion 利用数据科学为我们的宠物带来改变
> 原文:<https://www.dominodatalab.com/blog/using-data-science-to-make-a-difference-for-our-pets>
By David Jaw, Director of Data Science, Trupanion on October 15, 2019 in [Perspective](/blog/perspective/)
编者按:这是一系列文章的一部分,分享公司在成为模型驱动的道路上的最佳实践。一些文章将包含关于他们使用 Domino 的信息。
在北美,宠物主人花费[超过 620 亿美元](https://investors.trupanion.com/why-trupanion/default.aspx)(截至 2019 年 9 月)来照顾他们的猫和狗。如果宠物没有医疗保险,当他们心爱的宠物受伤或生病时,主人经常会面临经济压力和困难的决定。我很自豪能为一家公司工作,这家公司采用模型驱动的方法来帮助宠物主人支付尽可能最好的兽医护理: [Trupanion](https://trupanion.com/) 。在这篇博客中,我将描述我们应用模型来影响宠物健康保险体验的方法之一,并分享我们如何建立和管理提供这些模型的数据科学团队的见解。
## 但是首先,有一点背景
即使主人为他们的宠物购买了医疗保险,他们通常也必须自掏腰包支付服务费,并等待数周才能知道某项测试或程序是否在保险范围内。当兽医费用达到数百或数千美元时,这一过程中有许多不确定性,而且往往会带来巨大的财务压力。(事实上,虽然平均索赔额在 300 美元左右,但一些兽医发票的总额达到 10,000 美元或更多并不罕见)。
Trupanion 希望通过不仅提供全面的保险,而且使用算法模型来简化索赔过程,来消除这种不确定性。我们的专有专利软件目前安装在美国大约 4000 家兽医诊所中。通过我们的软件,兽医账单可以在不到 7 秒的时间内直接在服务点处理和支付。宠物主人只需支付他们的那部分账单,通常是承保服务的 10%减去他们选择的免赔额。他们不再需要提交报销申请或等待批准和报销。这对我们的客户和他们的宠物来说都是一个游戏规则的改变者,帮助兽医推荐和宠物主人为他们的宠物选择最好的治疗方案,而不考虑费用。
我们在开发自动化索赔流程的软件时所面临的一个挑战是考虑兽医实践记录服务的许多不同方式。兽医领域没有像人类医学领域那样的标准化医学规范。因为我们的宠物在生病的时候不能告诉我们哪里疼,所以医学诊断常常是模糊的,比如“今天不舒服”
评估索赔需要很多解释和专业知识,我们必须模仿人类的决策。因此,我们创建了一系列独立的模型,每个模型旨在分析一个特定的项目或问题,综合预测准确率为 99%。有些型号使用简单的文本搜索来识别宠物玩具等不在承保范围内的商品。其他人使用[深度学习框架](https://blog.dominodatalab.com/deep-learning-introduction)来发现一次或多次访问中单词之间的联系。我们目前有 15 个模型并行工作来裁定索赔。它们都有自己的代码库、版本控制,并在 Amazon Web Services (AWS)中自己的硬件上运行。这些独立模型的结果被输入到最终决策模型中,最终决策模型将这些预测关联起来,并决定是否支付索赔以及适用何种免赔额。
在构建我们的直接薪酬体系时,我们还注重等式的人这一面,特别是在两个方面:
1. **有效利用专家数据科学家和公民数据科学家**
2. **直面自动化恐惧**
## 利用专家和市民数据科学家
我们有少量的分析专家,只有少数数据科学家、BI 分析师和其他数据专家。为了达到所需的自动化水平,并在我们业务的所有领域增加模型的使用,我们需要利用每个团队的专业知识,并为所有人提供学习机会。为此,我重点介绍了几项计划:
* **建立一个有凝聚力的社区:**我们的数据科学和 BI 团队地理位置非常接近,可以有机地分享想法和知识。我们的数据科学家负责开发和部署模型,例如自动化索赔解决流程、检测欺诈或预测客户流失的模型。但是如果一个业务分析师有一个模型的想法,他们可以使用 autoML 工具 [DataRobot](https://www.datarobot.com/) 来确认这个想法的可行性。我们鼓励业务分析师和其他“公民数据科学家”拥有这些建模项目。BI 团队不断处理对公司最重要的指标背后的数据。因此,他们处于一个很好的位置,可以产生关于预测模型可以改进流程甚至改变我们看待事物的方式的想法。到目前为止,BI 一直致力于电子邮件分类、净推介值(NPS)预测和销售线索评分模型。在开发过程中,我们的专家数据科学家积极指导我们的公民数据科学家,在整个编码和[模型评估过程](https://blog.dominodatalab.com/model-evaluation)中提供功能工程建议和最佳实践。考虑到索赔自动化占用了数据科学家大约 70%的时间,这种由社区主导的方法实现了比其他方法更多的实验。
* **确保一致性和协作:**我鼓励业务分析师使用我们的数据科学团队使用的相同工具;DataRobot 主要用于原型模型,Domino 用于在生产过程中编码和管理模型。有几个好处:容易访问、知识转移和容易过渡。
* **强调创造力:**我们的数据科学和 BI 团队都采用 70/20/10 的资源分配理念来分配工作。他们把大约 70%的时间花在我们知道有价值的工作上,20%花在有明显潜力的项目上,10%花在投机项目上。事实上,索赔自动化最初是一个投机项目,现在它是我们业务的核心。创新是我们的基因。为了保持行业领先地位,我们必须愿意测试想法,尝试别人从未做过的事情。这种方法有助于确保我们公司和团队的长期健康发展。
## 直面自动化恐惧
我们组织中有数百名具有丰富医学知识的人员,他们的唯一工作就是解决索赔。作为一家公司,我们需要传达这样一个信息,即该系统并没有取代他们的工作,而是增加和解放了他们,让他们专注于他们能够发挥最大影响的复杂问题。此外,我们的专家对于不断改进我们的软件是必不可少的,本质上是用他们做出的每一个决定来训练软件。
此外,我们希望帮助理算员以更快的速度和更高的效率解决更困难的索赔。例如,我们建立了一个模型驱动的决策工具,帮助指导理赔员做出特别困难和耗时的决策。到目前为止,使用这一工具的调节人员已经实现了 20%的效率提升。
## 我们已经有了一个很好的开始,并且正在扩大
我们已经能够在美国的 4,000 家兽医诊所自动处理超过 75,000 起索赔,支付了 610 万美元的福利。我们正在改善客户的整体体验,同时降低成本。
仅在美国就有 25,000 多家兽医诊所,我们还有很长的路要走。然而,通过关注等式中的人员部分,并制定流程来帮助利用每个人的知识,我们正在实现我们的目标。
## 了解更多信息
查看 Jaw 的演讲, [*在 Trupanion*](https://drive.google.com/open?id=1gMWJoGBghmS0alcpQVpajy7pXZ2bqbZT) 自动裁定兽医索赔,最初于 2019 年 5 月在 [Rev 2 数据科学领袖峰会](https://rev.dominodatalab.com)上发表。
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Fusing-data-science-to-make-a-difference-for-our-pets%2F&title=Using%20data%20science%20to%20make%20a%20difference%20for%20our%20pets)
# 在 R 中使用蒙特卡罗模拟来检验社会政策研究中的方法论进展
> 原文:<https://www.dominodatalab.com/blog/using-monte-carlo-simulations-in-r-mdrc>
这是克里斯汀·波特写的一篇客座博文,他是 MDRC T2 大学的高级研究员。MDRC 是一个非盈利、无党派的教育和社会政策研究组织,致力于学习如何改善影响穷人的项目和政策。
## MDRC 的方法论创新
40 多年来,MDRC 一直是推进项目评估中最严格的研究方法以及与该领域分享我们所学知识的领导者。MDRC 在解决现实世界研究问题的前沿设计的理论完善和实际应用方面都处于最前沿。
下面的例子描述了一些最近和正在进行的方法学研究领域,这些研究通常是与其他机构的研究人员合作完成的:
* 除了衡量平均计划影响,了解影响如何变化也很重要。因此,MDRC 大学的研究人员正在调查使用多点随机试验所涉及的概念和统计问题,以了解和学习不同个体和不同项目点的项目效果的差异。了解项目效果的变化包括检测和量化它。
* 近年来,回归不连续设计(RDD)作为一种准实验方法得到了广泛的认可,当正确使用时,它可以产生对治疗、计划或干预的因果效应的内部有效估计。在传统的 RDD 中,根据单个数字指标(例如,考试分数)对受试者(例如,学生)进行评级,并且通过个人评级是高于还是低于外部定义的评级分界点值来确定治疗分配。传统 RDD 中感兴趣的参数是分界点处的平均治疗效果*,或“治疗边界”,其代表评级等于分界点值的个体亚群的平均效果。MDRC 的研究人员最近提出了估计*多等级* RDD 病因果参数的建议,目前正在调查 RDD 参数的外部有效性或可推广性。*
* 研究人员通常感兴趣的是测试干预对多个结果、多个亚组、多个时间点或多个治疗组的有效性。由此产生的多重统计假设检验会导致虚假的结果。多重测试程序(MTP)是通过向上调整效应估计的 p 值来解决这个问题的统计程序。虽然中期计划越来越多地用于教育和其他领域的影响评估,但使用中期计划的一个重要后果是统计能力的巨大变化。不幸的是,研究人员在设计研究时经常忽略 MTP 的权力含义。因此,在某些情况下,样本量可能太小,研究可能不足以检测小到所需大小的影响。在其他情况下,样本量可能会比需要的大,或者研究可能会检测到比预期更小的影响。MDRC 的研究人员开发了在使用 MTP 时评估多种电源定义的方法,并得出了使用 MTP 如何影响电源的经验发现。
在我们的研究中使用新的研究方法并与现场分享之前,MDRC 的研究人员使用各种方法彻底测试和验证新的研究方法。这些包括理论推导、使用真实数据的经验比较和使用模拟数据的经验检验。此外,MDRC 的方法研究人员在同行评议的期刊上广泛发表论文。
## MDRC 如何用蒙特卡罗模拟测试新方法
正是使用模拟数据的实证检验将我们引向了多米诺。在统计研究中,MDRC 经常采用蒙特卡罗模拟技术,这可能是非常计算密集型。有了 Domino 的 R 计算平台,我们已经能够显著加快模拟分析的速度。
蒙特卡洛模拟依靠计算机从总体中产生大量数据样本,总体的特征是数据产生分布。因为生成分布的数据是由分析师指定的,所以总体参数的值是已知的,并且这些参数的估计量可以根据它们的统计特性(例如,偏差和方差)进行评估。
蒙特卡洛模拟也可用于估算统计功效(或样本量要求或最小可检测效应),用于无法推导出(或无法轻易推导出)统计功效的封闭型方程的研究。例如,当使用上述 MTP 进行分析时,统计功效的闭合形式方程通常不存在。MDRC 的研究人员开发了一种方法,用于在对多个测试进行调整时估计统计功效,这种方法不需要蒙特卡罗模拟。(然而,该方法确实依赖于更有限的模拟——测试统计数据而非数据)。这种方法比蒙特卡洛模拟更容易实现,而且*也更快实现,但是我们依赖于大量完整的蒙特卡洛模拟来验证我们的方法,这些模拟是在 R 中的 Domino 平台上运行的。*
*## 了解更多关于 MDRC 的信息
MDRC 最为人所知的是针对低收入人群的大规模示威游行和对现实世界政策和项目的研究。我们帮助倡导在社会政策研究的真实世界环境中使用随机分配——用于测试新药的同样高度可靠的方法。从福利政策到高中改革,MDRC 的工作帮助塑造了全国的立法、项目设计和操作实践。在情感和意识形态经常主导公共辩论的领域工作,MDRC 提供了关于可以复制和扩大规模的解决方案的客观、严格的证据。
要了解更多关于 MDRC、我们开展的广泛研究、我们工作的影响以及我们的研究方法,请访问我们的[www.mdrc.org](http://www.mdrc.org),或联系 kristin.porter@mdrc.org。你也可以在推特 [@MDRC 新闻](https://twitter.com/MDRC_News)关注 MDRC,在脸书[关注 MDRCNews](https://www.facebook.com/MDRCNews) 。
标题为“[叶老教室](https://www.flickr.com/photos/cogdog/8773811585)”的横幅图片,作者艾伦·莱文。根据 [CC BY-ND 2.0](https://creativecommons.org/licenses/by-nd/2.0/) 授权。*
# Python 3.6 与 Domino 在几分钟内完成
> 原文:<https://www.dominodatalab.com/blog/using-new-python-3-6-domino>
对于像我这样的 Python 爱好者来说,随着今天 [Python 3.6](https://docs.python.org/3.6/whatsnew/3.6.html) 的发布,假期开始得有点早。
如果你还不知道,Python 3.6 有很多改进:
* 速度和内存使用优化,包括 CPython 层的低级改进。
* 新的语法特性包括一种叫做“f-strings”的新的字符串文字,函数参数的标准注释,异步生成器和理解。
* 从 asyncio 到 datetime 的标准库改进。
* 安全性改进,如新的 secrets 模块和对 OpenSSL 1.10 的支持。
多亏了 Domino,我能够在几秒钟内将 Python 3.6 安装到 Domino 计算环境中,而不会弄乱我的稳定环境或本地开发设置。
我要做的就是:
1. 用这个 docker 文件创建一个 [Domino 计算环境](https://docs.dominodatalab.com/en/latest/reference/projects/Projects_overview.html)。
2. 将我项目设置为使用计算环境。
3. 告诉多米诺给我开一个 [Jupyter 笔记本会议](https://docs.dominodatalab.com/en/latest/get_started/3-start_workspace.html)。
现在我有了自己的 Python 3.6 / Jupyter 4.3 平台,在 Domino 的再现性引擎中工作。这里有一张 gif 向你展示了上面的步骤:
![HubSpot Video](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/84d6fc445a5df655375503dfd92568d2.png)
想自己试试吗?我已经在 Domino 上发布了一个公共的 forkable 项目,所以您可以点击“Fork ”,开始尝试 Python 3.6,而无需安装任何软件
如果您想了解更多有关如何快速迭代您的数据科学环境和工具而无需征得 IT 部门同意的信息,您可以在此处申请[演示](https://www.dominodatalab.com/demo?utm_source=blog&utm_campaign=&utm_medium=post&utm_content=)。
标题为“[光之季节](https://www.flickr.com/photos/ncindc/2948478259/)”的横幅图片,作者为 oh_hellogina。根据 [CC BY-ND 2.0](https://creativecommons.org/licenses/by-nd/2.0/) 授权。
# 如何使用 R,H2O 和多米诺骨牌进行纸牌游戏比赛
> 原文:<https://www.dominodatalab.com/blog/using-r-h2o-and-domino-for-a-kaggle-competition>
*这是一篇由[周若辉](https://www.jofaichow.co.uk/)发表的客座博文*
如果您赶时间,请直接跳到:
* 教程 1: [使用 Domino](#tutorial1)
* 教程 2: [利用 H2O 预测土壤性质](#tutorial2)
* 教程 3: [扩大您的分析](#tutorial3)
## 介绍
这篇博文是《H2O 深度学习简介》的续篇。如果说之前的博客文章是一个简短的介绍,那么这篇文章就是一个基于最近的 [Kaggle 竞赛](https://www.kaggle.com/c/afsis-soil-properties)的适当的机器学习案例研究:我正在利用 [R](https://www.r-project.org/) 、 [H2O](https://h2o.ai/) 和[多米诺](https://www.dominodatalab.com?utm_source=blog&utm_medium=post&utm_campaign=using-r-h2o-and-domino-for-a-kaggle-competition)在现实世界的数据挖掘竞赛中竞争(并且做得相当好)。
![kaggle_topspot](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/76c21fb23425134249f4268ab5387b14.png)
### 从那以后竞争变得更加激烈,但我仍然非常自豪地说,我保持了几天的领先地位!
请注意,公开分数仅基于一小部分测试数据(13%)。我在最终排行榜上的位置可能会发生巨大变化。在我看来,爬上公共排行榜只是第一步,确保模型足够一般化以保持不变才是真正的挑战。无论如何,这是未来博客文章的主题。
### 使用 Domino 加速您的数据分析
我认为公平地说,卡格尔竞赛非常具有挑战性。当你把时间限制考虑进去的时候就更是如此了。Domino 的[数据科学工具](https://www.dominodatalab.com?utm_source=blog&utm_medium=post&utm_campaign=using-r-h2o-and-domino-for-a-kaggle-competition)让我可以轻松地扩大我的分析,利用并行代码,并在很短的时间内进行许多测试。在数据挖掘竞赛中竞争就是要比对手更好地理解问题,更快地确定最佳策略。能够同时对数据提出许多问题是至关重要的。
结果,Domino 将几天甚至几周的分析时间缩短到了几个小时。我可以快速评估许多不同的机器学习策略,用于 Kaggle 竞赛。最重要的是,我不必在基础设施设置和硬件维护上浪费任何时间,因此我可以专注于更好地理解机器学习问题,并随着时间的推移稳步提高模型性能。
### 和 H2O 一起深入
说我对 [H2O 深度学习模块](https://github.com/0xdata/h2o/tree/master/docs/deeplearning/)的预测性能印象深刻是一种保守的说法。所有数据极客都知道“没有免费的午餐”定理。然而,尽管困难重重,根据我过去的经验,我还是设法利用`h2o.deeplearning`算法和一些简单的模型平均策略爬上了梯子。
性能并不是唯一的东西,H2O 高效的内存管理和并行算法同样令人惊叹。当我意识到我可以同时使用 R、H2O 和 Domino 时,情况变得更好了。在那一刻,我知道我找到了一个非常有前途的机器学习解决方案,因此也是这篇博客的动机。
这篇文章不仅仅是关于 Kaggle 竞赛,**更是关于寻找一个实用的和可扩展的数据分析解决方案**。一个通用且健壮的解决方案,我可以依赖它并将其应用于我生活中的许多机器学习问题(比如[这个](https://github.com/woobe/wc2014))。在过去的几周里,我对 R + H2O +多米诺组合的体验非常有希望。所以我想利用这个机会分享我的经验。我希望这篇文章鼓励更多的数据爱好者尝试一下 R、H2O 和多米诺。
单独使用 H2O 是一个巨大的话题。为了简单起见,我将带您浏览这里的起始代码。我向你保证,大赛之后会有更深入的关于各种机器学习算法和策略的讨论。我也希望这些博客帖子最终能够演变成合适的教程(作为我对数据科学社区的一点点贡献)。
### 边做边学
我始终相信边做边学是最好的学习方法。所以我准备了两个简短的教程来帮助你开始使用 Domino 和 H2O。希望通过阅读教程,您能够很快掌握基础知识,并尝试使用 H2O 和 Domino 进行自己的数据分析。而且,如果你按照所有的步骤去做,你会得到一个 CSV 文件,为 Kaggle 比赛做好准备。最后,当你准备好升级你的游戏时,看看**的第三篇教程**,它讲述了如何通过几个简单的步骤来升级你的分析。
### 等待...H2O 多米诺卡格尔。他们是谁?
以防你还没听说过他们...
* [H2O](https://h2o.ai/) 是由 [0xdata](https://0xdata.com/) 开发的用于大数据科学的开源数学和内存预测引擎。
* Domino 是面向分析师和数据科学家的企业级平台,处理运行、扩展、共享和部署分析模型所需的所有“管道”。
* [Kaggle](https://www.kaggle.com/) 是一个预测建模和分析竞赛及咨询的平台。
### 准备好了吗?
好了,介绍到这里就足够了。 ***让我们深入了解一下吧!!!***
* * *
Tutorial One: Using Domino
在第一篇教程中,我将只关注通过 web UI 和 R 接口的基本 Domino 操作。虽然 R 脚本都是关于 H2O 机器学习的,但同时学习两个新东西是很难的。所以我将保持简单,把 H2O 的讨论留给下一个教程。
### 步骤 1.1 -启动并运行
如果您还没有这样做,[注册一个免费的 Domino 帐户](https://www.dominodatalab.com?utm_source=blog&utm_medium=post&utm_campaign=using-r-h2o-and-domino-for-a-kaggle-competition),然后下载并安装客户端。(报名后跟着简易指南走。)
### 步骤 1.2 -安装 R 接口
Domino 在 CRAN 上有自己的 [R 包](https://cran.r-project.org/web/packages/domino/index.html)。安装完这个包之后,您可以登录您的 Domino 帐户,直接从 r 管理您的项目。我个人认为这是使用 R 作为接口的又一个极好的例子。
```py
install.packages("domino")
library(domino)
domino.login("your_username", "your_password")
```
### 步骤 1.3 -下载数据和代码
本教程基于 [Kaggle 非洲土壤特性预测挑战赛](https://www.kaggle.com/c/afsis-soil-properties)。为了进行数据分析,您需要先从 ka ggle[下载原始数据集](https://www.kaggle.com/c/afsis-soil-properties/data)。然后您可以使用我的示例 R 脚本 [`Kaggle_AfSIS_with_H2O.R`](https://github.com/woobe/blenditbayes/tree/master/2014-09-r-h2o-domino) 运行一个简单的分析。
![kaggle_data](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/daaa4d1b312b2ab80903f070c0325217.png)
#### ###步骤 1.4 -上传数据和代码
您需要将文件上传到 Domino 上特定的项目文件夹中。为了简单起见,我将在这里使用`quick-start`文件夹,因为在阅读完 Domino 的[入门指南](https://support.dominodatalab.com/hc/en-us/articles/204186939-Getting-Started)之后,你们大多数人应该在本地驱动器的某个地方有这个文件夹。
在您的机器上,将 Kaggle 数据集和 R 脚本复制到`quick-start`文件夹。文件结构应该如下所示:
| **在**之前 | | 之后 |
|
* Results/
* 主要的。m
* 主要的。巴拉圭
* 主要的。r
| |
* **data/train.zip** (Note: create a new' data' folder)
* **数据/测试。zip**
* **数据/样本 _ 提交。CSV**
* 结果/
* 与 H2O 合作.r
* 主要的。m
* 主要的。巴拉圭
|
之后,您可以将文件上传到 Domino 上的`quick-start`文件夹中。
```py
## Set Working Directory to the 'quick-start' folder
setwd("quick_start_dir_on_your_local_drive")
## Upload new files to the 'quick-start' folder on Domino cloud
domino.upload()
```
### 步骤 1.5 -检查文件
在运行分析之前,检查并确保文件在云上。登录您的 Domino 帐户,浏览您的`quick-start`项目中的文件。
![kaggle_files](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/d00be7371e59eb7e8cb786acf0d1d25e.png)
#### ###步骤 1.6 -运行您的代码
所有的文件都在吗?太好了,您现在可以在云上运行分析了!
使用 web UI 开始跑步(`Runs`->-`Run`->-`Enter of the File Name`->-`Start Run`)。
![kaggle_startrun](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/5f666086035628fae93459f4c0bca8f2.png)
或者,您可以直接从 r。
```py
domino.run("Kaggle_AfSIS_with_H2O.R")
```
### 步骤 1.7 -监控进度
Domino 的 web UI 允许您在线监控您的跑步。您可以在左侧面板上访问所有文件和项目设置。当您单击您的任何运行时,它将在右侧显示本机控制台(在本例中为 R ),下面有一个摘要,显示 CPU 负载、内存使用情况和关于该运行的其他信息。
![kaggle_monitor](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b0005ea9689517ec7c1b303c36dd7f88.png)
#### ###步骤 1.8 -下载结果
分析大约需要半个小时。之后,你可以从网上下载结果...
![kaggle_monitor](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4557f20c7ab3ab4e7c8e5d4fefa7ba0c.png)
或者通过 r。
```py
## Download the results to your local drive
domino.download()
```
默认情况下,一旦运行完成,您将收到一封电子邮件通知。有兴趣的话还有更多[定制通知](https://support.dominodatalab.com/hc/en-us/articles/204139619-Notifications)的方法。
![kaggle_monitor](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/d08de5b794a3953a47a0535ad6a01251.png)
#### ###步骤 1.9 -提交给 Kaggle(可选)
您现在可以进入[提交页面](https://www.kaggle.com/c/afsis-soil-properties/submissions/attach)并上传 CSV 文件。祝你好运:)
### 尝试您自己的代码
我已经向您展示了在 Domino 云上启动和运行 Kaggle 启动代码的基本步骤。现在是时候尝试你自己的代码了。记得 Domino 还支持 **Python** 、[T3、Matlab](/why-choose-matlab-for-data-science-and-machine-learning)和 **Julia** !
### 共享您的项目
与他人共享您的 Domino 项目非常容易。您可以在项目设置中启用对项目文件夹的公共访问,这样每个人都可以查看您的文件和运行。
![kaggle_monitor](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fc5346298cdbdf3923079b6276ed0f4e.png)
### Version Control
顺便说一下:Domino 上的版本控制是一个经过深思熟虑的过程,是专门为数据科学家设计的。Domino 为您的数据、代码和结果创建快照,而不是一次对一个文件进行版本控制。这意味着可以很容易地回到过去,使用精确的数据和代码来引用特定的运行。
* * *
## 教程二:使用 H2O 预测土壤属性
在这一节中,我将解释我如何使用 R 和 H2O 为 Kaggle 竞赛训练预测模型。简而言之,我们必须基于 1158 行训练数据开发回归模型,然后使用这些模型来预测 728 个测试记录中每一个的五种土壤属性 Ca、P、pH、SOC 和沙子。如需了解更多信息,请前往 Kaggle 上的[描述页面](https://www.kaggle.com/c/afsis-soil-properties)。
### 步骤 2.1 -为 H2O 安装 R 接口
同样,R 充当接口。有了 R 作为公共接口,H2O 和 Domino 可以无缝集成。
像 Domino 一样,H2O 也有一个优秀的 R 包。首先,您可以安装 H2O 的 CRAN 版本:
```py
install.packages("h2o")
```
如果你想利用 H2O 的新功能,你可以安装最新版本。
```py
## Specify H2O version here
h2o_ver <- "1511"
## Install H2O
local({r <- getOption("repos"); r["CRAN"] <- "https://cran.us.r-
project.org"; options(repos = r)})
txt_repo <- (c(paste0(paste0("https://s3.amazonaws.com/h2o-
release/h2o/master/", h2o_ver),"/R"), getOption("repos")))
install.packages("h2o", repos = txt_repo, quiet = TRUE)
```
为了找出最新的 H2O 版本号,进入[这一页](https://s3.amazonaws.com/h2o-release/h2o/master/1511/index.html),寻找最后四位数字,如下图截图所示。
![h2o_version](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/97ec29e29d57c93a83fb7f0d6202175b.png)
(可选)最近我经常使用 H2O,所以我写了一个包装器函数,让我的生活更轻松。通过两行代码,您可以将 H2O 安装或升级到最新的版本:
```py
## Use the wrapper function in my package 'deepr'
devtools::install_github("woobe/deepr")
deepr::install_h2o()
```
### 步骤 2.2 -启动并连接到本地 H2O 集群
使用函数`h2o.init(...)`中的参数`max_mem_size`,我们可以手动限制物理内存的使用。在本教程中,我们将内存限制设置为 1GB,因为这是 Domino 空闲层的最大允许值。
```py
library(h2o)
localH2O <- h2o.init(max_mem_size = '1g')
```
![R connected to H2O Cluster](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c88af03a6a4b1615b9e4d16d78c17f92.png)
#### ###步骤 2.3 -导入数据
导入数据是我最喜欢 H2O 的地方之一!!!您可以将压缩文件(`.zip`、`.gz`)直接加载到 H2O 集群中。这对于本教程中的小 Kaggle 数据集来说可能不是很重要,但对于较大的数据集来说肯定是有用的。
```py
## Import Data to H2O Cluster
train_hex <- h2o.importFile(localH2O, "./data/train.zip")
test_hex <- h2o.importFile(localH2O, "./data/test.zip")
```
### 步骤 2.4 -训练深度神经网络模型并进行预测
事不宜迟,下面是为每个目标变量训练一个深度神经网络模型的起始代码,然后使用这些模型进行预测。在`h2o.deeplearning(...)`函数中有相当多的变量需要调整。为了简单起见,我只提供了让您入门的基本代码。要了解更多信息,我强烈建议浏览一下[插图和演示代码](https://github.com/0xdata/h2o/tree/master/docs/deeplearning/)。
```py
## Split the dataset into 80:20 for training and validation
train_hex_split &lt;- h2o.splitFrame(train_hex, ratios = 0.8, shuffle = TRUE)
```
```py
## Split the dataset into 80:20 for training and validation
train_hex_split <- h2o.splitFrame(train_hex, ratios = 0.8, shuffle = TRUE)
## One Variable at at Time
ls_label <- c("Ca", "P", "pH", "SOC", "Sand")
for (n_label in 1:5) {
## Display
cat("nnNow training a DNN model for", ls_label[n_label], "...n")
## Train a 50-node, three-hidden-layer Deep Neural Networks for 100 epochs
model <- h2o.deeplearning(x = 2:3595,
y = (3595 + n_label),
data = train_hex_split[[1]],
validation = train_hex_split[[2]],
activation = "Rectifier",
hidden = c(50, 50, 50),
epochs = 100,
classification = FALSE,
balance_classes = FALSE)
## Print the Model Summary
print(model)
## Use the model for prediction and store the results in submission template
raw_sub[, (n_label + 1)] <- as.matrix(h2o.predict(model, test_hex))
## One Variable at at Time
ls_label <- c("Ca", "P", "pH", "SOC", "Sand")
for (n_label in 1:5) {
## Display
cat("nnNow training a DNN model for", ls_label[n_label], "...n")
## Train a 50-node, three-hidden-layer Deep Neural Networks for 100 epochs
model <- h2o.deeplearning(x = 2:3595,
y = (3595 + n_label),
data = train_hex_split[[1]],
validation = train_hex_split[[2]],
activation = "Rectifier",
hidden = c(50, 50, 50),
epochs = 100,
classification = FALSE,
balance_classes = FALSE)
## Print the Model Summary
print(model)
## Use the model for prediction and store the results in submission template
raw_sub[, (n_label + 1)] <- as.matrix(h2o.predict(model, test_hex))
}
```
### 步骤 2.5 -将结果保存为 CSV 格式
最后一步是将所有预测保存为 CSV 文件。这是正确 Kaggle 提交格式的 CSV 文件。
```py
write.csv(raw_sub, file = "./results/my_Kaggle_submission.csv", row.names = FALSE)
```
### 尝试其他数据集
就是这样!你刚刚训练了一些深度神经网络模型,并用于预测!为什么不在其他数据集上尝试同样的事情呢?例如,我在之前的 TTTAR 博客文章中使用的[乳腺癌和 MNIST 数据集。](https://bit.ly/bib_TTTAR1)
### 尝试其他 H2O 机器学习算法
`h2o.deeplearning`算法只是 H2O 可用的算法之一。还可以试试`h2o.gbm`、`h2o.glm`、`h2o.naiveBayes`、`h2o.randomForest`等等。所有这些函数都可以像上面的代码示例一样直接从 R 中调用。它们有相似的语法,所以应该非常简单。
* * *
## 教程三:扩大你的分析!
我在 Domino cloud 上为 Kaggle 做了一个简单的 H2O 机器学习练习。希望入门代码和教程能帮助你更好的理解 R + H2O +多米诺机制。然而,模型的简单性意味着你将无法在 Kaggle 排行榜上获得非常好的分数。
当您准备加速工作(例如构建更复杂的模型)或分析更大的数据集时,只需几个步骤就可以轻松地在 Domino 上扩展您的数据分析。准备好了吗?请继续阅读!
### 选择更高的硬件层
您可以在项目设置中找到硬件层下拉列表。您需要做的只是选择一个适合您需求的层。多米诺会帮你解决剩下的问题。
![Choosing hardware tier for H20 & R](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c95af4d2703195ac53ddc2f5061db675.png)
### 修改您的代码
如果您使用 R + H2O + Domino 组合,您可以通过增加物理内存余量来轻松提高 H2O 的性能。H2O 将自动并行化机器学习算法,并利用所有 CPU 内核。对于一般代码并行化,请阅读这篇关于[简单并行循环](https://blog.dominodatalab.com/simple-parallelization/)的 Domino 博客文章。
```py
## Increase the H2O Cluster Memory Allowance (e.g. 25GB)
localH2O <- h2o.init(max_mem_size = '25g')
```
### 使用多个实例
为了进一步提高生产率,您可以同时开始多次运行。同样,不需要复杂的设置。像往常一样开始跑步。多米诺会处理剩下的。在下面的截图中,你可以看到我将同时运行多个实验,每个实验可能需要几个小时,并使用 30GB 的内存和 30 个 CPU 核心。
![Multiple instances of H20 & R](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f4598435eaa128986624bbb23f56a117.png)
* * *
## 结论
如果我必须总结这个经验,我会说,这个 R + H2O +多米诺组合的发现是非常令人兴奋和有前途的!我可以自信地说,我有一个实用且可扩展的解决方案,不仅可以处理 Kaggle,还可以处理许多其他机器学习问题。我也知道这个解决方案可以变得更好!我将继续探索和试验其他工具。
* * *
## 所有链接
这是一篇相当长的帖子,所以让我在这里总结一下所有有用的资源:
### 多米诺骨牌
* [报名](https://www.dominodatalab.com/?utm_source=blog&utm_medium=post&utm_campaign=using-r-h2o-and-domino-for-a-kaggle-competition)
* [文档&常见问题解答](https://support.dominodatalab.com/hc/en-us)
* [快速启动](https://support.dominodatalab.com/hc/en-us/articles/204186939-Getting-Started)
* [博客](https://blog.dominodatalab.com/)
* Nick 关于使用 HTTP API 将 R 与生产系统集成的帖子
* [简易并行循环](https://blog.dominodatalab.com/simple-parallelization/)
### H2O
* [文档](https://docs.0xdata.com/)
* [Oxdata 演示文稿](https://www.slideshare.net/0xdata)
* [通过示例进行深度学习截屏](https://www.youtube.com/watch?v=fdbQreQacIQ&feature=youtu.be)
* 谷歌上的 h2ostream 论坛
* [H2O 深度学习简介和演示代码](https://github.com/0xdata/h2o/tree/master/docs/deeplearning/)
* * *
## 是人,而不仅仅是工具!
我告诉过你这些工具有多棒。但我还没提到幕后的牛逼人物。
首先,我要感谢 Nick Elprin 从 Domino 早期开始给予我的巨大支持。尼克不仅在过去的几周里给了我无限的云资源来试验这种 R + H2O + Domino 组合(这一切都是从一封简短的电子邮件*开始的,“嗨,尼克,我能在 Domino 上使用 H2O 吗?”*),他还不断帮助我解决许多技术问题,并将我的要求转化为新功能。
然后,当然是 H2O 引擎背后的 [Oxdata 团队](https://0xdata.com/about/) ( [斯里安巴蒂](https://twitter.com/srisatish)、[阿诺坎德尔](https://twitter.com/ArnoCandel)、维拉伊帕马尔、克里夫克、凯文诺莫伊尔、[雷蒙德佩克](https://twitter.com/raymondpeck3)、斯潘塞艾洛和许多其他人)。自从我开始一步步了解 H2O 的早期,他们就一直通过电子邮件给我发关于 H2O 的建议和信息,并鼓励我拓展视野。特别是[阿诺·坎德尔](https://twitter.com/ArnoCandel)在微调`h2o.deeplearning`和其他功能上给了我一些非常具体的建议。
我希望这篇文章对你有用。如果你决定尝试一下 R + H2O +多米诺组合,但对设置有疑问,请随时给我以及 Domino 和 Oxdata 团队发[电子邮件](mailto:jofai.chow@gmail.com) / [推特](https://twitter.com/matlabulous)。我知道您的问题和反馈将有助于他们开发出更好的数据科学产品。不幸的是,我需要遵守 Kaggle 比赛规则,我不能告诉你我到底做了什么才能爬上排行榜。然而,你可以从我的博客名“[中猜出它,就像贝叶斯理论一样!](https://bit.ly/blenditbayes)”。
恐怕我不能在一篇文章中涵盖所有内容,但是在接下来的几个月里,我会继续写关于 Domino 和 H2O 的其他功能的博客。
# 23 种可视化以及何时使用它们
> 原文:<https://www.dominodatalab.com/blog/video-23-visualizations-use>
*本演讲于 2016 年 11 月 18 日在纽约举行的 2016 年 PLOTCON 现场直播。*
散点图或气泡图——什么样的可视化对您的数据最有意义?在本演示中,Domino Data Lab 的首席数据科学家 Eduardo ario de la Rubia 带领我们经历了 23 种不同的可视化,并讨论了它们最相关的权衡和场景。
[https://fast.wistia.net/embed/iframe/n586mlh42h](https://fast.wistia.net/embed/iframe/n586mlh42h)
收听:
* 了解使用许多流行的数据可视化库生成这些可视化需要多少代码;
* 了解可视化 7 种数据的不同方式,从变化和分布到关系和组成;
* 看看哪些可视化应该很少使用,以及一些有吸引力但不太容易解释的设计的陷阱。
# 探索并行机器学习的极限
> 原文:<https://www.dominodatalab.com/blog/video-exploring-limits-parallelized-machine-learning>
本周,Domino 的首席数据科学家 Eduardo ario de la Rubia 举办了一场网络研讨会:利用亚马逊的 X1 实例进行大规模机器学习。如果您错过了现场网络研讨会或想再次观看,您可以在下面找到一段录音:
[https://fast.wistia.net/embed/iframe/pn2jnzcg7p](https://fast.wistia.net/embed/iframe/pn2jnzcg7p)
# 机器学习如何放大社会中的不平等
> 原文:<https://www.dominodatalab.com/blog/video-how-machine-learning-amplifies-societal-privilege>
> 这个演讲发生在 2016 年 4 月 13 日德克萨斯州奥斯汀的 *Domino 数据科学弹出窗口*
[https://player.vimeo.com/video/163292139?title=0&byline=0&portrait=0](https://player.vimeo.com/video/163292139?title=0&byline=0&portrait=0)
* * *
在这个演讲中,[快进实验室](http://www.fastforwardlabs.com/)的研究工程师 **Mike Williams** ,着眼于有监督的机器学习如何有可能放大社会中的权力和特权。
通过情感分析,他展示了文本分析是如何支持男人的声音的。Mike 讨论了偏见如何被无意中引入到任何模型中,以及如何识别和减轻这些危害。
# 让数据科学快速发展:GPU 加速工具综述
> 原文:<https://www.dominodatalab.com/blog/video-making-data-science-fast-survey-of-gpu-accelerated-tools>
> 这个演讲发生在 2016 年 4 月 13 日德克萨斯州奥斯汀的 *Domino 数据科学弹出窗口*
[https://player.vimeo.com/video/163292134?title=0&byline=0&portrait=0](https://player.vimeo.com/video/163292134?title=0&byline=0&portrait=0)
* * *
在这个演讲中,Bitfusion.io 的首席执行官兼联合创始人 Mazhar Memon 调查了 GPU 加速的数据科学工具的前景。从硬件,到语言,再到机器学习和深度学习框架。
该视频包括 GPU 加速图形处理的演示。
演示幻灯片[可在此处](http://www.slideshare.net/dominodatalab/data-science-popup-austin-making-data-science-fast-survey-of-gpu-accelerated-tools)获得。
# RStan 中基于模型的机器学习和概率规划
> 原文:<https://www.dominodatalab.com/blog/video-model-based-machine-learning-webcast>
在这个录制的网络广播中,Daniel Emaasit 介绍了基于模型的机器学习以及相关的概念、实践和工具,如贝叶斯定理、概率编程和 RStan。
机器学习领域已经发展了数千种学习算法。通常,科学家会从这些算法中进行选择,以解决特定的问题。他们的选择常常受到他们对这些算法的熟悉程度的限制。在这个经典/传统的机器学习框架中,科学家们被约束于做出一些假设,以便使用现有的算法。这与基于模型的机器学习方法形成对比,后者寻求为每个新问题创建定制的解决方案。
想多读点?丹尼尔最近写了一篇关于基于模型的机器学习的介绍。
[//fast.wistia.net/embed/iframe/k5wv3shly5?seo=false&videoFoam=true](//fast.wistia.net/embed/iframe/k5wv3shly5?seo=false&videoFoam=true)
# 可视化逻辑创作与代码
> 原文:<https://www.dominodatalab.com/blog/visual-tools-vs-code>
在他们职业生涯的某个时刻,几乎每个数据科学家都编写过代码来执行一系列步骤,并认为,“如果我能可视化地构建这些转换,而不是通过编写代码,那就太好了。”
这就是“可视化创作”工具的目标,它旨在使不太懂技术的人能够开发分析。这篇文章描述了可视化创作工具的一些缺陷,并认为虽然它们提供了一个诱人的愿景,但它们最终在企业环境中的真实工作流环境中是不够的。作为一种替代方法,我们已经看到组织通过使用开源编程语言,投资于技术含量较低的用户的培训,以及使用良好的协作和知识管理工具来使现有工作更容易获得,从而实现了更持续的分析工作加速。
![Data science no-code workflow tool](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fe84ea4fd496a9562de4b8acf70d7bc5.png)
## 视觉工具的缺点
### 1.差异、协作和知识管理
我们经常认为理所当然文本的一个属性是区分的容易程度。在任何变更管理很重要的环境中,能够比较不同版本的工作是至关重要的。相比之下,如果您的逻辑的规范表示是一个图表,那么就很难判断发生了什么变化。对于不同的视觉逻辑有两种常见的“解决方案”。
* 有些应用会给你一个图形比较,基本上就是给你看两张图。这很少有用,因为很难区分“布局”的变化和实际逻辑或行为的变化。
* 其他应用程序将允许您区分逻辑的底层表示(例如,XML)。这提供了一个基于文本的视图,但它通常是嘈杂的,充满了关于视觉布局的文本,而不是你的逻辑,所以它通常是不可理解的。
除了区分之外,许多现实世界的工作流是琐碎的基于文本的文件,但是很难使用可视化工具。例如,如果两个人分别处理同一个文档,并且他们的工作需要合并,那么如何使用可视化文档来实现呢?它也很容易插入评论,搜索文本,等等。
### 2.供应商/IDE 锁定
可视化创作工具有自己专有的 ide,这意味着如果您想继续维护或改进您的分析,您将被限制使用它们。用代码工作?它只是由文本文件组成,所以你可以选择如何维护和编辑它们。
### 3.文档和“可谷歌性”
比方说,您正在试图弄清楚如何让您的分析做一些特定的操作或数据转换。大多数编程语言都有活跃的在线社区来帮助你实现这一点。在线搜索和重用代码很容易,因为互联网是建立在文本之上的。在谷歌上简单搜索一下大多数挑战,你会看到一个 StackOverflow 页面,里面有你的答案。
这对可视化工具来说是一个更大的挑战,因为它们的创作环境更加专有(因此在网上不太受欢迎)。假设你甚至可以找到你的问题的答案,实际使用它将是它自己的挑战——不像复制和粘贴代码的文本片段。
### 4.可扩展性和对开放生态系统的访问
因为大多数可视化创作工具都是专有的(上面的第二点),你经常被限制在使用他们已经建立的“可视化部件”或者“配方”。这使得利用可从代码访问的开源包和库的不断发展变得更加困难。
### 5.模块化、重用、重构
代码允许你创建函数、模块、包等。,您可以再次使用它来加速未来的开发,从而避免重新发明轮子。更好的是,真正的编程语言拥有强大的开发工具,允许您轻松地重构工作(例如,安全地重命名),搜索代码库,并导入您想要快速利用的现有工作。
一些可视化工具允许您打包和重用可视化组件,但并不是所有的工具都这样做。当考虑一个可视化创作工具时,重要的是要确定随着作品库的增长,可视化文档是否仍可管理。
### 6.电力用户的环境效率
最后,值得注意的是,虽然可视化工具对于不太懂技术的用户来说更容易使用,但这通常是以更复杂的高级用户为代价的。超级用户通常定制他们的工作区和 ide,以最大化环境效率。键盘快捷键、调试器、语法突出显示和自动完成是允许它们在基于文本的环境中快速工作的特性的例子。为了留住顶尖人才并最大限度地提高他们的产出,授权给技术先进的研究人员而不是迎合技术水平较低的研究人员可能是明智的。
## 例外情况
一些可视化工具已经在市场上取得了如此强大的地位,以至于它们已经克服了其中的一些限制。例如,Informatica 或 Ab Initio 是在企业中广泛使用的大量成熟产品。然而,大多数视觉逻辑创作的新尝试并没有达到相同的采用水平和产品成熟度。
## 二级编码
为了解决上面的一些缺点——特别是缺乏可扩展性和对开源包和库的访问——许多可视化创作工具提供了在可视化流程或管道中使用代码位的方法。最常见的是,这采用了一种新型可视“小部件”的形式,它允许您编写任意代码,然后使用它来转换输入。
不幸的是,这种方法只不过是权宜之计。它允许您使用一些代码片段,但是它从来没有解决上述可视化创作环境的基本限制。通常,代码“编辑器”被嫁接到主可视编辑器上,并且缺少良好创作体验所必需的功能(例如,自动完成、调试、键盘快捷键)。
更一般地说,这种方法适用于简短的片段,但是不能适应任何实质性的逻辑,也不能解决专有工具的核心限制,该工具缺乏在工作产品上进行比较和协作的健壮方法。
## 那些不会写代码的用户怎么办?
可视化创作工具的主要论点是,它们更容易被不太懂技术的分析人员使用,这些人不会处理代码。然而,根据我们的经验,大多数分析师能够比人们预期的更容易地获得代码。当你从零开始,盯着一个空白的文档不知道该做什么时,代码可能会令人生畏。然而,在实践中,大多数工作涉及修改已经存在的东西,或者从现有工作中借鉴模式。根据我们与不同行业的各种分析师合作的经验,我们已经看到许多“没有编码”的用户,但是经过一点培训,他们能够打开一个现有的脚本,进行一些修改,并从中借用模式来用于他们自己的新项目。
## 视觉文档
可视化工具的主要论点是,它们使非技术用户更容易进行分析。第二个论点是它们为分析中的步骤提供了很好的文档。然而,代码也可以提供文档的这种好处。我们已经看到一些公司成功地使用代码作为逻辑的基本表达,并在此基础上生成可视化来辅助文档,而不是将“代码编辑器”移植到主要的可视化工具中。这颠倒了可视化创作工具的模型:代码第一;视觉表现如下。
## 一个例子:德雷克
作为这种方法的一个例子,考虑德雷克。Drake 允许您将数据转换和操作步骤表示为脚本——它甚至允许您在部分转换中使用 R、Python 或其他语言——但它也可以从该脚本生成管道的图形视图。
例如,您可以有一个 Drake 脚本,它使用 Python、Ruby 和 Clojure 在管道中执行不同的转换。因为它完全基于文本,所以很容易区分和管理。此外,Drake 还允许您生成管道的可视化表示。我们用一个示例管道(最初来自 Drake Github repo)制作了一个 Domino 项目,它转换几个输入数据集来创建几个输出数据集。运行该脚本将执行所有转换以生成派生的输出,以及其步骤的可视化:
![Drake script diagram](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c3b6bf99999f8639a0714205e6a1402f.png)
最重要的是,因为 Drake 只是作为一个脚本运行,所以您也可以在 Domino 上运行 Drake 管道,这样您就可以对您的脚本、中间数据集和最终派生数据集进行版本控制!
## 结论性意见
分析组织不断地试图提高他们的能力和交付项目工作的速度。根据我们的经验,投资一个可视化逻辑创作工具来实现这个目标是短视的,其目的是让不太懂技术的用户来开发分析。相反,当公司投资于基于文本的逻辑表达工具时,我们看到他们取得了巨大的成功。通过对技术含量较低的分析师进行少量的培训,以及强大的知识管理和协作工具(以便人们可以发现、重用和构建现有的模式和工作),您可以更快地行动,避免在需要在企业环境中进行协作时将自己逼入一个专有工具的死角。
# 用 Plotly 和 Domino 可视化机器学习
> 原文:<https://www.dominodatalab.com/blog/visualizing-data-with-plotly-and-domino>
我最近有机会与 Domino Data Lab 合作制作了一个网上研讨会,演示了如何使用 Plotly 在 Domino 笔记本中创建数据可视化。在这篇文章中,我将分享我在一起使用 Plotly 和 Domino 时发现的一些好处。
[Plotly](https://www.dominodatalab.com/data-science-dictionary/plotly) 是一个面向数据科学家和工程师的基于网络的数据可视化平台。我们的平台背后的引擎是 plotly.js,这是一个基于 D3.js 和 stack.gl 构建的开源图表库。我们有 R、Python 和 MATLAB 的 API,使数据科学家可以轻松地使用他们选择的编程语言,并且可以访问使用多种语言的团队。这在 Domino 平台上运行得非常好,在那里您可以用各种语言创建笔记本。下面我将展示两个例子,一个用 R 语言,一个用 Python 语言。
* * *
## 普罗特利河
首先,让我们看看 R 中的一个例子。我将使用 Plotly 的 twitter 帐户中的一些 twitter 数据来展示如何使用 Plotly 的 R 库为 K-Means 聚类创建一个交互式的二维可视化。这个例子是基于之前的 [*r-bloggers* 的帖子](http://rstudio-pubs-static.s3.amazonaws.com/5983_af66eca6775f4528a72b8e243a6ecf2d.html)。可以说,我最喜欢的 Domino 笔记本特性是在浏览器选项卡中打开 RStudio 会话的能力。我强烈建议在 Domino 中启动一个 RStudio 会话,并亲自测试一下!
## 设置
在 R 中,我们将首先安装必要的包,加载库,然后使用一个 twitter 应用程序启动身份验证并从 twitter 获取数据。
# 用小倍数和 R 可视化房屋所有权
> 原文:<https://www.dominodatalab.com/blog/visualizing-homeownership-in-the-us-using-small-multiples-and-r>
“小多次波”可视化技术是由当前数据可视化大师之一的[爱德华·塔夫特](http://en.wikipedia.org/wiki/Edward_Tufte)提出的。在展望信息中,他写道
> 定量推理的核心是一个简单的问题:与什么相比?小型多重设计,多变量和数据丰富,通过直观地比较变化,对象之间的差异,选择的范围来直接回答。对于数据表示中的各种问题,小倍数是最好的设计解决方案。
小倍数的想法很简单:不要显示一个包含许多数据系列的复杂图表,而是并排显示许多较小的图表。这使得快速吸收信息相对容易得多。小倍数可以很好地代表一段时间内的数据。找到差异和特性很容易。
这是不同州的房屋拥有率随时间变化的图表:
![Evolution of Homeowner rates](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/dd5c3def9ee59df21cc4ad943f22aad4.png)
即使不是房地产专家或经济学家,也很容易一眼就注意到几个事实:
* 纽约、加利福尼亚和夏威夷的自有住房率非常低。另一方面,特拉华州、阿拉巴马州、密歇根州和西弗吉尼亚州的税率非常高。
* 爱达荷州、特拉华州、怀俄明州和内华达州受到经济危机的严重打击,而马萨诸塞州、佛蒙特州和缅因州则相当抵制(至少在房屋所有权方面)
* 总的来说,住房拥有率一直在下降
## R 中的实现
r 是一个非常强大的数据可视化工具,而 ggplot2 是制作图表最有用和最通用的包(也是从 CRAN 下载最多的包之一)。有时 ggplot2 有点难以使用,但小倍数的一个好处是,根据定义,它需要相对简单的图。为了安排图,我使用了 [gridExtra 包](http://cran.r-project.org/web/packages/gridExtra/index.html),这使得定义我将放置图的网格变得容易。
代码如下:
```py
install.packages('openxlsx')
install.packages('sqldf')
install.packages('gridExtra')
```
```py
library("openxlsx")
library("ggplot2")
library("sqldf")
library("gridExtra")
# data from: http://www.stats.indiana.edu/sip/statesInProfile_dataExtract.xlsx
file = "statesInProfile_dataExtract.xlsx"
data=read.xlsx(file, sheet = 33, startRow = 1, colNames = TRUE)
data[c("year", "data")]=lapply(data[c("year", "data")], as.numeric)
data=sqldf("SELECT stabb, year, avg(data) as data FROM data WHERE title='Homeownership Rate' AND stabb NOT IN ('US', 'DC') GROUP BY 1, 2")
opts=theme(
panel.background = element_rect(fill="white"),
panel.border = element_rect(colour="black", fill=NA),
axis.line = element_blank(),
axis.ticks = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text = element_text(colour="gray25", size=15),
axis.title = element_blank(),
text = element_text(size=20),
legend.key = element_blank(),
legend.position = "none",
legend.background = element_blank(),
plot.title = element_text(size = 45))
stabbs=unique(data$stabb)
vplayout=function(x, y) viewport(layout.pos.row = x, layout.pos.col = y)
grid.newpage()
pdf(file="home_ownership.pdf",width=36,height=18)
pushViewport(viewport(layout = grid.layout(7, 10, heights=c(.4,.1,rep(1,5)), widths=c(1.1, rep(1,9)))))
grid.text("Evolution Of Homeownership Rates Across The United States, 2000-2013", gp=gpar(fontsize=50, col="gray40"), vp = viewport(layout.pos.row = 1, layout.pos.col = 1:10))
grid.text("Percent. Source: U.S. Census Bureau", gp=gpar(fontsize=20, col="gray40"), vp = viewport(layout.pos.row = 2, layout.pos.col = 1:10))
for (i in 1:length(stabbs))
{
datap=subset(data, stabb==stabbs[i])
p=ggplot(datap, aes(year, data, group = stabb, fill=stabb))+
geom_ribbon(aes(ymin=50, ymax=data), fill= "dodgerblue", colour = "dodgerblue4")+
geom_text(data = NULL, x = 2007, y = 85, label = stabbs[i], size = 8, colour = "gray50")+
scale_y_continuous(expand = c(0, 0), limits=c(50,90))+
scale_x_continuous(expand = c(0, 0), breaks = seq(2000,2013, by=3))+
opts
if (i%%10!=1) p=p+theme(axis.text.y = element_blank())
if (i&lt;=40) p=p+theme(axis.text.x = element_blank())
print(p, vp = vplayout(floor((i-1)/10)+3, i%%10+(i%%10==0)*10))
}
dev.off()
```
### 实施说明
* openxlsx 包非常适合读取大的 Excel 文件
* sqldf 包使得使用 SQL 转换数据帧变得容易
* 我从 [STATsIndiana](http://www.stats.indiana.edu/sip) 下载数据
# 100 个数据科学家一周能做什么?(回答:很多)
> 原文:<https://www.dominodatalab.com/blog/what-can-100-data-scientists-do-in-one-week-answer-a-lot>
*编者按:2021 年 5 月 14 - 21 日* *,拉美各地近百名数据科学家加入了法国巴黎银行卡迪夫的虚拟数据科学黑客马拉松。* *在 Domino 这里,我们很高兴能够成为这一活动的一部分,为下一代数据科学家和下一代保险解决方案提供支持。*
我们如何根据食物的成分(例如,碳水化合物、蛋白质、维生素等的含量)、产地和其他变量来预测食物的营养成分?
这是我们向 100 多名数据科学家提出的挑战,他们参加了我们在拉丁美洲举办的首届虚拟数据科学挑战赛。参与者来自智利、哥伦比亚、墨西哥和秘鲁的大学和合作公司,带来了巨大的创造力和创新,以及帮助解决业务问题的愿望。他们四人一组工作,使用 我们的数据科学家每天依赖的同一个企业 MLOps 平台:Domino 数据实验室。
*![BNP Hackathon](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/33b76642e3cf46cc9a1f8ec547b3b67a.png)*
他们提出了一些非常有创意的解决方案,提交了 800 多个预测进行评分。我们学生组的优胜队伍是**Insight ML–DD”(perú)*。 “我们的合作伙伴”类别的获奖团队是*【analicatituya】(哥伦比亚)* 。每个获胜团队的成员都可以在六个月内无限制地使用 Coursera 的所有数据科学学院课程,并有机会免费获得 Coursera 证书。*
*## 是什么让获胜的解决方案脱颖而出?
所有团队的创造力给我们留下了深刻的印象,但获胜者尤其展示了如何用完全不同的方法来解决业务问题。 一个人使用传统方法,应用自然语言处理(NLP)将文本转化为数字特征来预测食物营养分数。另一个使用新的高级方法,利用预先训练的深度学习模型,并根据挑战数据对其进行微调。Domino 平台的灵活性使每个团队能够访问他们需要的基础设施资源,例如,较小的 CPU 资源用于“传统”方法,而较大的 GPU 资源用于深度学习方法。
## 为什么是黑客马拉松?【T2
由于几个原因,黑客马拉松是我们战略的重要组成部分。
1. ***分享我们的成功。*** 黑客马拉松为宣传我们的数字化转型提供了一个绝佳的机会。 法国巴黎银行 Cardif 是法国巴黎银行的 子公司,也是银行保险和信用保险联盟的 全球领导者。我们在帮助我们的客户实施不同的项目,同时保护他们免受不可预见事件的影响方面发挥着关键作用。 我们致力于通过合作伙伴关系对社会产生积极影响,并使保险更容易获得。 但正如我们所知, 消费者的期望、消费习惯和人口趋势不断变化,在产品和服务质量、响应能力和效率方面产生了新的含义和期望。为了满足这些需求,我们在数字、数据和人工智能(AI)解决方案上进行了大量投资,并正在实施一项雄心勃勃的数据战略,以支持我们以客户和员工为中心的数字化转型,并提供积极、可持续的业务影响。 到 2022 年,我们预计 80%的流程将实现自动化 让我们的产品和服务更容易为每一位客户所用。
2. ***吸引新的人才。*** 通过复制我们现实世界的多米诺环境,参与者体验了我们如何支持和装备我们的数据科学家,让他们做最好的工作。我们的数据分析团队定期与我们的商业和流程领域合作,通过模型预测、数据丰富和其他提高效率和日常数字化的技术来增强决策。数据处理丰富了我们银行保险计划的所有管理决策。来自 35 个国家的 150 多名法国巴黎银行 Cardif 数据科学家每天都在使用 Domino 平台来帮助他们构建和部署创新模型,这些模型有助于彻底改造保险业。例如,我们开发了一个基于人工智能的光学字符识别(OCR)行业解决方案,通过自动文档识别和数据提取来帮助客户申报索赔,从而加快支付流程。我们还开发了推荐工具,以帮助我们的客户改善招聘流程和其他服务。
3. ***加强合作关系。*** 黑客马拉松为我们与合作伙伴合作解决业务问题提供了另一个渠道。在一个深受新趋势和生活方式影响的世界中,我们采用了一种基于联盟的独特业务模式,并与 500 多家分销合作伙伴在多个领域建立了合作关系,包括银行和金融服务、汽车、分销、电信和能源,以及财富管理咨询和经纪公司。
我们为我们的合作伙伴提供:在他们的产品中嵌入保险保护的能力,以创建定制的解决方案来保护客户免受损失;即插即用解决方案;独家销售和营销知识,以促进他们的业务;以及数据科学和客户参与方面的专业知识。对于客户来说,这意味着简单、有用、相关的产品,以及一个服务生态系统,提供端到端的数字化和个性化服务、轻松的核保、快速的索赔流程和持续的支持。
去年,我们在拉丁美洲建立了 30 多个新的和更新的联盟,包括与巴西银行保险专家 Brasilseg 和大型零售分销公司在秘鲁的子公司 Financiera Oh 的新合作,以及更新我们与哥伦比亚 Grupo Aval 的协议。
这是我们在拉丁美洲的第一次虚拟黑客马拉松…
### 这不会是我们的最后一次。
![BNP Hackathon Infographic](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/57404af79834aa4ae76e1cb3cc731689.png)从参与者的热情和我们开展这项活动的技术难度来看,我们显然不能止步于此。我们的赛后问卷调查显示,参与者对明年再次参加我们的黑客马拉松感到兴奋,并计划再次参加!我们还看到,参与的学生和合作伙伴对我们关于人工智能产业化的课程特别感兴趣。这对于 AI 来说是一个至关重要的问题,就像我们模型的可审计性一样——这也是我们选择 Domino Data Lab 作为合作伙伴的两个原因。Domino 的 Enterprise MLOps 平台使我们的数据科学团队能够更快速、更轻松地开发、部署、监控和管理大规模模型,自动跟踪他们的工作,例如代码、ide 等,以便他们能够重现结果并在过去工作的基础上进行构建。
我们很兴奋地开始为 2022 年的黑客马拉松做计划,并且正在努力思考如何进一步帮助我们的新学生社区在这些主题上了解更多。在第一次黑客马拉松中,有两项工作做得很好,我们肯定会重复:
* ***选择一个实际的、统一的话题。*** 我们今年预测食物营养分数的主题引起了所有参与者的共鸣,这有助于团队在整个比赛中保持参与和兴奋。在我们计划 2022 年黑客马拉松时,我们将寻找另一个所有参与者都能参与的实践主题。
* ***提供团队导师。*** 在整个比赛过程中,Cardif 数据科学家为每个团队提供指导。这增强了学生、合作伙伴和我们的数据科学团队的体验。
## **了解更多**
* 观看法国巴黎银行 Cardif 的 Sebastien Conort 在他的演讲中分享他们如何使用 Domino 平台 开发和管理其人工智能算法,[*催化您的转型,感谢模型风险治理*](https://dominodatalab.wistia.com/medias/81icchhvj5) *。”*
* 访问法国巴黎银行卡迪夫网站[](https://www.bnpparibascardif.com/en/who-are-we),看看法国巴黎银行是如何让保险变得更容易获得的。
* 阅读 Forrester 报告, [*【多米诺企业 MLOps 平台的总体经济影响】*](https://www.dominodatalab.com/domino-business-impact-forrester-tei-report/) 了解更多关于多米诺提供的价值。*
# Domino 客户在说什么
> 原文:<https://www.dominodatalab.com/blog/what-domino-customers-are-saying>
By Karina Babcock, Director, Corporate Marketing, Domino on April 15, 2020 in [Perspective](/blog/perspective/)
## 阅读“Gartner Peer Insights 客户之声’:数据科学和机器学习平台”报告中的 Peer Insights 用户对 Domino 的评论
最近几个月,随着新冠肺炎的蔓延和社交距离的必要性,在行业内建立社区的春季会议,如 [Gartner 数据和分析峰会](https://www.gartner.com/en/conferences/na/data-analytics-us),甚至我们自己的[数据科学领袖 Rev 峰会](https://rev.dominodatalab.com)都被推迟了。毫不奇怪,数据科学网络和社区建设计划比以往任何时候都更加重要。随着公司努力预测这些前所未有的时代的下一步,数据科学仍然是一个优先事项(并将被证明更加重要)。现在远程工作的数据科学团队需要分享最佳实践,并找出如何在公司和社区应对这场危机的社会和经济影响时更有效地完成工作。
当您希望与同事交流并了解数据科学领域的最新趋势时,我们推荐查看的一个资源是 [Gartner Peer Insights](https://www.gartner.com/reviews/market/data-science-machine-learning-platforms/vendor/domino/product/domino-data-science-platform?months=12) *。它为企业提供了一个评价和审查产品的地方,包括 Domino 数据实验室平台。评论匿名提交,由 Gartner 审查,Gartner 致力于确保“[没有供应商偏见…只是企业用户的真实心声](https://www.gartner.com/reviews/home)。
### 下面是一些客户在查看 Domino Data Lab 时写的内容
我们平台核心的一个重要原则是开放式工作台。公司可以在任何基础设施上运行 Domino 云、本地,甚至在他们自己的 Kubernetes 集群中。数据科学家在开发模型时可以使用他们喜欢的语言、工具、服务和基础设施。
关于开放性,一家制造企业的首席数据科学家分享道:
> *“使用计算和数据科学工具极大地扩展了我们的工作类型,为公司带来了实实在在的价值。”*
我们关注的另外两个关键原则是再现性和协作。我们的重现性引擎会自动跟踪数据科学实验的所有方面(代码、环境、数据等),因此数据科学团队永远不会丢失工作,并且始终可以重现他们的结果。我们的协作能力,如[实验管理器](https://blog.dominodatalab.com/announcing-domino-3-3-datasets-and-experiment-manager/)和[项目组合仪表板](https://blog.dominodatalab.com/announcing-trial-and-domino-3-5-control-center-for-data-science-leaders/),帮助数据科学团队分享想法、相互学习,并更轻松地与 IT 和业务利益相关方协作。
关于协作和可复制性,一家金融公司的数据科学和分析负责人写道:
> *“核心功能提供了我们所期望的一切,让我们的数据科学社区更有效率,让我们的资产投入生产——自助服务环境非常出色——协作得到了改善 APIs 发布变得简单——工作流版本控制非常棒——原型开发和应用开发速度更快。”*
正如一家制造公司的首席数据科学家所说:
> “它[Domino 数据实验室]让我们向客户部署机器学习解决方案的速度比以前快了 10 倍,并为整个公司的合作开辟了全新的可能性。”
这些只是过去 12 个月中添加的十几篇评论中的几段引文。客户来自各行各业,从金融和制造业(我们的大多数客户来自这些行业)到服务业和运输业。这些公司的规模从收入不到 5000 万美元到超过 100 亿美元不等。
如果您正在考虑 Domino 数据实验室平台,我们鼓励您看看 [Gartner Peer Insights。](https://www.gartner.com/reviews/market/data-science-machine-learning-platforms/vendor/domino/product/domino-data-science-platform?months=12)这是从积极使用我们产品的人那里获取独家新闻的好方法。
如果您是现有客户,我们希望您能在 Gartner Peer Insights 等论坛上与他人分享您的经验和知识,并在 [Domino 社区论坛](https://community.dominodatalab.com/)上与我们分享您的需求,以便我们能够继续添加帮助数据科学团队取得成功的功能。
### 了解更多信息
今年 2 月,我们宣布 Domino Data Lab 在 2020 年 Gartner 数据科学和机器学习平台魔力象限中被评为“有远见者”。**这是我们第三次获得这一定位,我们相信这一定位认可了 Domino 数据实验室平台核心的三个关键原则——开放性、可再现性和协作性。数据科学和机器学习平台的完整魔力象限的免费副本可以在这里找到[。](https://www.dominodatalab.com/resources/gartner-magic-quadrant-data-science-platforms/)
Gartner 不认可其研究出版物中描述的任何供应商、产品或服务,也不建议技术用户仅选择那些具有最高评级或其他称号的供应商。Gartner 研究出版物包含 Gartner 研究机构的观点,不应被视为事实陈述。Gartner 否认与本研究相关的任何明示或暗示的担保,包括对适销性或特定用途适用性的任何担保。
**Gartner Peer Insights“客户之声”:Insight Engines,2020 年 2 月 6 日。*
***Gartner 数据科学和机器学习(DSML)平台魔力象限,[彼得·克伦斯基](https://www.gartner.com/analyst/58080),彼得·登·哈默,埃里克·布雷特努斯,[吉姆·黑尔](https://www.gartner.com/analyst/52451),[卡莉·伊多因](https://www.gartner.com/analyst/43435),[亚历山大·林登](https://www.gartner.com/analyst/12496),[斯维特拉娜·西库拉尔](https://www.gartner.com/analyst/40906),法尔汉·乔杜里,2020 年 2 月 17 日。*
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Fwhat-domino-customers-are-saying%2F&title=What%20Domino%20customers%20are%20saying)
# 数据科学平台:是什么?为什么重要?
> 原文:<https://www.dominodatalab.com/blog/what-is-a-data-science-platform>
随着越来越多的公司认识到对[数据科学平台]的需求,越来越多的供应商声称他们已经有了一个。我们越来越多地看到公司将他们的产品描述为“数据科学平台”,而没有描述使平台如此有价值的功能。因此,我们希望分享我们对一个平台应该具备的核心功能的愿景,以便它对数据科学团队有价值。
首先让我们定义“[数据科学平台](https://www.dominodatalab.com/resources/field-guide/data-science-platforms/)”,然后深入了解细节:
## 数据科学平台(定义)
**数据科学平台是一种软件,它统一了数据科学生命周期(从开发到部署)中使用的人员、工具、工件和工作产品。组织使用数据科学平台围绕数据科学创造更多的成熟度和学科,将其作为一种组织能力,而不仅仅是一种技术技能。**
现在,让我们来看看为什么会出现这种情况,为什么它很重要:
## 框架:数据科学生命周期
我们看到“数据科学生命周期”跨越三个阶段。每个阶段都有不同的需求,这些需求激发了数据科学平台的能力:
1. **构思和探索**
2. **实验&模型开发**
3. **运作/部署**
在某种程度上,所有数据科学项目都会经历这些阶段。
* 此外,还有一个贯穿整个生命周期的潜在观点:需要**管理、扩展和发展**您的分析和您组织的能力。
![Data science platforms and the data science project lifecycle.](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fe0d754872c2b83a0166f9dcec26011c.png)
我们将讨论这四个方面,描述每个方面涉及的挑战,以及一个好的数据科学平台应该提供哪些功能。
## 思维和探索
定量研究从探索数据开始,以了解你有什么。这可能意味着以不同的方式绘制数据,检查不同的特征,查看不同变量的值,等等。
构思和探索可能很费时间。数据集可能很大而且难以处理,或者您可能想要尝试新的包或工具。如果你在一个团队中工作,除非你有办法看到其他人已经完成的工作,否则你可能会重做工作。其他人可能已经开发了洞察力,创建了干净的数据集,或者确定了哪些功能是有用的,哪些是无用的。
### 一个好的数据科学平台应该能够轻松...
* 找到并理解过去的工作,让数据科学家在提出新问题时不需要从头开始。
* 探索大型机器上的数据,无需处理开发运营/基础架构设置。
* 安全地使用新的包和工具,即不中断过去的工作或干扰同事的环境。
## 实验和模型开发
通过探索数据的过程,研究人员形成了他们想要测试的想法。在这一点上,研究通常从笔记本中的临时工作转移到更硬的批处理脚本。人们进行实验,回顾结果,并根据他们所学到的东西做出改变。
当实验是计算密集型的(例如,模型训练任务)时,这个阶段可能会很慢。这也是数据科学的“科学”部分特别重要的地方:跟踪实验中的变化,确保过去的结果是可重复的,通过同行评审过程获得反馈。
### 一个好的数据科学平台应该能够轻松...
* 横向扩展计算资源,一次运行多个计算密集型实验。
* 跟踪你的工作(例如,你的实验),使它们具有可重复性。
* 与同行和非技术同事(具有其他专业领域)分享工作,以获得关于不断发展的研究和结果的反馈
## 操作化
数据科学工作只有在对业务成果产生一定影响的情况下才有价值。这意味着工作必须以某种方式操作化或生产化,也就是说,它必须集成到业务流程或决策流程中。例如,这可以是以 API、供人们交互的 web 应用程序或显示在人们收件箱中的每日报告的形式公开的预测模型。
实施数据科学工作通常需要工程师资源,这会增加成本并推迟上市时间。这不仅会影响初始部署,而且如果它成为新迭代的持续税收,它更有可能使模型永远不会超过“版本 1”,或者它意味着当新的研究投入生产时,它已经过时了。
### 一个好的数据科学平台应该能够轻松...
* 将模型发布为 API,那么其他语言的软件系统(Java,PHP,C#,Ruby 等。)可以轻松地使用它们,而无需重新实现。
* 向非技术分析师和利益相关者公开工作—作为自助服务工具、仪表盘、静态报告等
## 管理、学习和扩展
除了帮助研究人员更快地开发更好的模型之外,平台还为团队和管理者带来了一种至关重要的能力。随着企业在定量研究上投入更多,它们应该积累制度知识和最佳实践,让团队随着时间的推移变得更加有效。
一个平台的核心价值是它集中知识和研究资产的能力。这让经理们可以透明地了解人们的工作方式;它降低了关键人物的风险;这使得搭载人员变得更加容易;它改善了共享环境,从而增加了创造力;而且它通过使建立在过去的工作上而不是从零开始成为可能,加快了研究的步伐。
### 一个好的数据科学平台应该能够轻松...
* 浏览或搜索过去的工作(包括元数据、代码、数据集、结果、讨论)
* 在工作中设置安全界限,确保合适的人可以访问
* 以过去的工作为基础
## 开放式与封闭式平台
我们认为平台应该促进我们上面描述的过程,最终使构建模型或其他数据科学交付物变得更容易。比较平台时出现的一个相关问题是:在平台之上可以使用哪些工具?
有些平台是封闭的:也就是说,它们促进了上面描述的过程,但前提是你使用的是*平台供应商的*特定编程语言、建模包或 GUI 工具。
我们构建 Domino 是为了成为一个*开放的*平台,致力于这样一个目标:你应该能够选择你想要使用的语言和软件包,一个好的平台将会给你这种灵活性。
根据我们的经验,开放平台的价值在于两个原因:首先,它为您的数据科学家创造了灵活性,使他们更容易在不同的环境中使用正确的工具,并根据需要试验新的包或语言。其次,它减少了采用的摩擦,因为数据科学家可以自由地继续使用他们习惯的工具。
[![The True Cost of Building a Data Science Platform Should you build or buy? See the level of effort it takes to build a platform with those capabilities from scratch Read the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/ec78987b2846b00004c35ecd3ab5764c.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/55c5cf7e-0558-4c49-8177-a3c7cbf3713a)
# 深度学习中的计算机视觉:入门指南
> 原文:<https://www.dominodatalab.com/blog/what-is-computer-vision>
计算机视觉是数据科学中最先进和最迷人的领域之一,它允许计算机技术像人类一样看待事物,并通过视觉图像将数据呈现给人类。虽然计算机视觉的进步只是在过去几年里爆炸式增长,但它的根源和首次突破可以追溯到近 60 年前。
## 什么是计算机视觉?
计算机视觉,有时也被称为 CV,是一个使用 [深度学习](https://blog.dominodatalab.com/deep-learning-introduction) 让计算机自主建模人类视觉系统的领域。通过 CV,计算机能够从数字图像和视频中获得洞察力和理解。CV 使用对生物学的理解 [复制人类视觉系统](https://cds.cern.ch/record/400313/files/p21.pdf) 使用 [机器学习(ML)模型](//blog.dominodatalab.com/a-guide-to-machine-learning-models) ,来创建能够执行一些人类视觉系统可以执行的相同任务的自主系统,并提高性能。与此同时,计算机视觉算法的进步为我们提供了人类视觉系统如何工作的科学见解。
## 计算机视觉的历史
计算机视觉源于 Larry Roberts 的工作,他在 20 世纪 60 年代探索了从街区的 2D 图像中提取 3D 地理信息的可能性。接下来是边缘检测和分割等低级任务。另一项重大突破是在 20 世纪 70 年代由 David Marr 实现的,他将低级图像处理算法应用于 2D 图像,使用双目立体技术创建了一个 2.5D 草图,然后应用高级技术将其转化为 3D 模型表示。这两种方法都代表了自下而上的方法,从 2D 图像中创建三维模型。
视觉和成像技术自这些先驱时代以来已经取得了长足的进步。在许多情况下,不需要创建 3D 对象模型,自顶向下的方法解决视觉问题更有效。例如,用于车辆导航等领域的目的性视觉不需要物体的完整 3D 模型,只需要车辆附近物体的位置和运动。计算机视觉通常与其他相关领域相结合,例如:
* **图像处理:**原始图像需要经过处理才能进行分析。
* **摄影测量:**在开始测量点与点之间的距离之前,需要对相机进行校准。
* **计算机图形学:**需要渲染图像的 3D 模型。
与人类视觉相比,计算机视觉往往很脆弱:一种算法在某些情况下可行,但在其他情况下则不可行。困扰该领域的另一个问题是,与人类视觉系统相比,算法无法捕捉到所有的细微差别,特别是在不同环境、不同光照下识别人脸,同时考虑到多年来的特征变化。
然而,数据科学家继续改进模型。例如,2020 年,中国面部识别公司汉王对全脸图像的识别准确率达到了[](https://arstechnica.com/tech-policy/2020/03/how-china-built-facial-recognition-for-people-wearing-masks/)99.5%。然而,当人们由于冠状病毒而开始戴口罩时,这一准确率下降了一半。该公司能够使用向量分析来重新训练其模型,以预测 12 亿人数据库中的人戴上口罩后的样子,现在已经有 95%的准确率,即使人们戴着口罩、冬天的帽子和围巾。
## 深度学习在计算机视觉中是如何使用的?
过去几年中 CV 的许多进步很大程度上是由于 CV 建模中[](https://arxiv.org/pdf/1910.13796.pdf)深度学习的日益采用。许多传统的 CV 方法依赖于从图像中提取特征,如边缘和角点。当需要越来越多的功能时,这需要在开发过程中进行人工干预,并且需要更多的劳动和更多的反复试验。当使用深度学习时,这种人类的“特征工程”是不必要的,因为深度学习模型可以自主区分特征。
深度学习模型被提供有图像的数据集,其中在图像中它们存在的地方标记了对象的类别(例如鸟、孩子或云)。在机器内部,神经网络发现图像中的模式,以自动确定哪些特征识别不同的类别。这需要数据工程师更少的时间,但需要更多的 CPU 和 GPU 资源。深度学习也更加针对特定问题,不能转移到与训练数据集不密切相关的问题。
传统的 CV 建模技术仍然在许多不需要特定类别知识的情况下使用,如图像拼接或 3D 网格重建。当图像区分不复杂时,或者当图像需要根据基本形状或颜色进行分类时,传统的 CV 建模比深度学习更有效,资源消耗更少。
### 5 种计算机视觉工具
在你开始开发 CV 应用程序之前,你需要访问[右侧的 CV 库](https://viso.ai/computer-vision/the-most-popular-computer-vision-tools/)。如果您已经探索过 ML,您可能会发现已经有一些资源可供您使用。对于那些刚刚开始 ML 之旅的人来说,今天最流行的计算机视觉工具包括:
#### OpenCV
这是一个 ML 和 CV 软件的开源库,它有超过 2500 种算法,从红眼消除器到人脸检测算法。 [OpenCV](/getting-started-witn-open-cv) 接口有 C++、Python、Java、MATLAB。
#### TensorFlow
另一个开源工具,也兼容多种语言, [TensorFlow](https://www.dominodatalab.com/data-science-dictionary/tensorflow) 是一个流行的 ML 平台,允许用户为各种常见任务开发计算机视觉 ML 模型。对于那些觉得太耗费资源的人来说,TensorFlow Lite 是处理较小模型的一个很好的选择。
#### 库达
NVIDIA 开发的并行计算平台和 API 接口。它提供 GPU 加速的图像、视频和信号处理功能,是计算机视觉的理想选择。它支持多种语言,并带有超过 5000 个用于图像和信号处理的图元。
#### 矩阵实验室
一个流行的[付费编程平台](/why-choose-matlab-for-data-science-and-machine-learning),它包括一个具有多种功能、算法和应用的计算机视觉工具箱。
#### YOLO
这款软件工具专为实时物体检测而设计,速度极快,精确度极高。更具体地说,YOLO 没有其他工具那么大的社区。
## 计算机视觉在行动
在过去的几年里,社会已经被越来越多的计算机视觉应用所淹没。你只需要看看你的手机就能看到令人惊叹的例子,比如 [病毒人脸过滤器](https://onezero.medium.com/how-instagrams-viral-face-filters-work-5c98ba05122f) ,它可以把人变成 Instagram 上的卡通人物,即使你转头和移动,它的实时功能也会准确地停留在你脸上的正确位置。
CV 技术的另一个令人惊叹的例子是 FaceApp, ,它可以通过滤镜变换人脸图像,包括衰老和性别变化。该应用程序中的算法还可以消除皱纹和瑕疵,甚至向用户展示他们脸上的毛发会是什么样子。
PoseNet 也利用了计算机视觉,它可以仅根据 2D 图像或视频来确定某人的 3D 姿势。通过跟踪人体骨骼中的关键点,它可以在各种其他应用程序中呈现姿势,包括增强现实应用程序、游戏、动画和训练机器人,或者用于体育运动或监控系统分析中的活动识别。
## 探索计算机视觉
无论您是使用传统的 ML 方法和标记数据集开发 CV 模型,还是使用基于神经网络的最新深度学习算法,您都需要确保拥有正确的工具和资源。模型驱动的组织依靠最先进的 [企业 MLOps](https://www.dominodatalab.com/resources/a-guide-to-enterprise-mlops/) 平台。
David Weedmark 是一位出版作家,曾担任过项目经理、软件开发人员和网络安全顾问。
# 机器学习模型训练:它是什么,为什么它很重要
> 原文:<https://www.dominodatalab.com/blog/what-is-machine-learning-model-training>
训练机器学习(ML)模型是一个过程,在该过程中,机器学习算法被馈送以训练数据,机器学习算法可以从中学习。可以通过快速处理大量数据、识别模式、发现异常或测试相关性(人类在没有帮助的情况下很难做到),对 ML 模型进行训练,以使企业在许多方面受益。
## 什么是模特培训?
模型训练是 [数据科学开发生命周期](https://blog.dominodatalab.com/adopting-the-4-step-data-science-lifecycle-for-data-science-projects) 的核心,数据科学团队致力于为算法拟合最佳权重和偏差,以最小化预测范围内的损失函数。损失函数定义了如何优化 ML 算法。根据项目目标、使用的数据类型和算法类型,数据科学团队可能会使用不同类型的损失函数。
当使用监督学习技术时,模型训练创建数据特征和目标标签之间关系的数学表示。在无监督学习中,它在数据特征本身之间创建数学表示。
### 模特培训的重要性
模型训练是机器学习的首要步骤,产生一个可以验证、测试和部署的工作模型。该模型在训练期间的性能将最终决定它最终投入最终用户的应用程序时的工作情况。
训练数据的质量和算法的选择都是模型训练阶段的核心。在大多数情况下,训练数据分为两组,分别用于训练、验证和测试。
算法的选择主要由最终使用案例决定。然而,总有一些额外的因素需要考虑,例如算法模型的复杂性、性能、可解释性、计算机资源需求和速度。平衡这些不同的需求会使选择算法成为一个复杂的过程。
![how-to-train-a-machine-learning-model](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c6804a1107615398850402fc072dd8f7.png)
## 如何训练一个机器学习模型
训练模型需要一个系统的、可重复的过程,以最大限度地利用可用的训练数据和数据科学团队的时间。在开始训练阶段之前,您需要首先确定您的问题陈述,访问您的数据集并清理要呈现给模型的数据。
除此之外,您还需要确定您将使用哪些算法,以及它们将与哪些参数(超参数)一起运行。完成所有这些工作后,您可以将数据集分为训练集和测试集,然后准备用于训练的模型算法。
### 分割数据集
您的初始训练数据是有限的资源,需要谨慎分配。其中一部分可以用来训练你的模型,一部分可以用来测试你的模型——但是你不能每一步都使用相同的数据。你不能正确地测试一个模型,除非你给了它一个它以前没有遇到过的新数据集。将训练资料分割成两组或更多组,可让您使用单一资料来源来训练并验证模型。这允许您查看模型是否过度拟合,这意味着它在训练数据中表现良好,但在测试数据中表现不佳。
拆分训练数据的一种常见方法是使用交叉验证。在[十重交叉验证](/blog/guide-to-building-models-with-cross-validation)中,比如将数据拆分成十组,让你对数据进行十次训练和测试。为此:
1. 将数据分成十等份或十等份。
2. 指定一个折叠作为保持折叠。
3. 在其他九个折叠上训练模型。
4. 在固定褶皱上测试模型。
重复这个过程十次,每次选择一个不同的折叠作为保持折叠。十次坚持的平均表现就是你的表现评估,称为交叉验证分数。
### 选择要测试的算法
在机器学习中,有成千上万种算法可供选择,没有确定的方法来确定哪种算法对任何特定模型都是最好的。在大多数情况下,您可能会尝试几十种(如果不是几百种)算法,以便找到一种能够产生准确工作模型的算法。选择候选算法通常取决于:
* 训练数据的大小。
* 所需输出的准确性和可解释性。
* 速度训练所需的时间,这是成反比的准确性。
* 训练数据的线性。
* 数据集中的要素数量。
### 调整超参数
超参数是数据科学团队在组装和训练模型之前设置的高级属性。虽然许多属性可以从训练数据中学习,但是它们不能学习它们自己的超参数。
例如,如果您正在使用 [回归算法](http://www.sthda.com/english/articles/37-model-selection-essentials-in-r/153-penalized-regression-essentials-ridge-lasso-elastic-net/) ,模型可以通过分析数据来确定回归系数本身。然而,它不能规定惩罚的力度,而惩罚应该用来调整过多的变量。作为另一个例子,使用随机森林技术的模型可以确定决策树将在哪里被分割,但是要使用的树的数量需要预先调整。
### 适应和调整模型
既然数据已经准备好,模型的超参数也已经确定,那么就该开始训练模型了。这个过程本质上是使用您决定探索的每组超参数值来循环不同的算法。为此:
1. 拆分数据。
2. 选择一种算法。
3. 调整超参数值。
4. 训练模型。
5. 选择另一个算法并重复步骤 3 和 4..
接下来,选择另一组你想对同一算法尝试的超参数值,再次交叉验证,计算新的分数。一旦您尝试了每个超参数值,您可以对其他算法重复这些相同的步骤。
把这些比赛想象成田径预赛。每种算法都展示了它可以用不同的超参数值做什么。现在你可以从每个算法中选出最好的版本,并把它们送到决赛中去。
### 选择最佳型号
现在是时候测试每个算法的最佳版本了,以确定哪一个给了你总体上的最佳模型。
1. 对你的测试数据进行预测。
2. 在该模型的训练过程中,确定目标变量的基本事实。
3. 根据您的预测和基本事实目标变量确定绩效指标。
4. 用测试数据运行每个决赛模型。
测试完成后,您可以比较它们的性能,以确定哪种型号更好。总的赢家应该在训练和测试中表现良好(如果不是最好的话)。它还应该在您的其他性能指标上表现良好(如速度和 [经验损耗](https://developers.google.com/machine-learning/crash-course/descending-into-ml/training-and-loss) ),并且最终应该充分解决或回答您在问题陈述中提出的问题。
## 模型训练的系统方法
对于任何计划大规模构建成功的[机器学习模型](https://www.dominodatalab.com/blog/a-guide-to-machine-learning-models)的组织来说,使用系统的、可重复的模型训练过程是至关重要的。这一点的核心是在一个单一的企业平台上拥有你所有的资源、[](https://www.dominodatalab.com/blog/data-science-tools)、库和文档,这将促进而不是阻碍协作。
[![The Practical Guide to Accelerating the Data Science Lifecycle Lessons from the field on becoming a model-driven businesses. Read the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/733c37e12c2c7c37295fb3198e3a226a.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/c77ca351-ae85-425a-9ee3-c264b3bc4a69)
# 什么是模型风险管理,企业 MLOps 如何支持它?
> 原文:<https://www.dominodatalab.com/blog/what-is-model-risk-management-and-how-is-it-supported-by-enterprise-mlops>
模型风险管理是关于减少由于信任不正确或误用的模型输出而导致的决策的不良后果。企业从使用框架来形式化其流程和程序开始,随着数据科学项目的增长,这变得越来越困难。系统地实现模型开发和大规模生产部署需要使用企业 MLOps 平台,该平台解决了包括模型风险管理在内的整个生命周期。借助一个框架和[企业 MLOps](https://www.dominodatalab.com/resources/a-guide-to-enterprise-mlops/) ,组织可以大规模管理数据科学,并实现模型风险管理的优势,这些优势已被广泛的行业垂直领域所接受。
## 什么是模型风险管理?
模型风险管理起源于银行业。它最初是由美国美联储和货币监理署( [SR 11-7](https://www.federalreserve.gov/supervisionreg/srletters/sr1107a1.pdf) )在 2011 年 4 月定义的。现在被业界接受为标准的早期定义是:“模型的使用总是呈现模型风险,这是基于不正确或误用的模型输出和报告的决策的不利后果的可能性。”该指引警告称:“模型风险可能导致财务损失、糟糕的业务和战略决策,或者损害银行的声誉。”
在这份关于模型风险管理的*指南*中,监管机构强调了使用系统化流程的重要性,该流程将解决模型中的所有错误点,从设计开始,经过实施和持续维护。建议金融机构决策者警惕模型的潜在局限性——尤其是当模型的使用不同于其初衷时。
自那以后,模型的使用激增,产生了重大的人工智能应用,正在颠覆银行和金融以外的主要行业。[示例](https://www.leewayhertz.com/ai-applications-across-major-industries/)包括医疗保健、零售和电子商务、食品技术、物流和运输、旅游、房地产、娱乐和游戏。随着业务成为模型驱动的,模型风险管理可以帮助限制几乎任何垂直行业的可持续增长的风险。
## 模型风险的类型
模型的复杂性,以及商业领袖对数据科学专业知识的普遍限制,为风险创造了一个成熟的环境。为了管理模型风险,重要的是要理解模型的使用在哪里有缺陷。[模型风险的三种典型类型](https://en.wikipedia.org/wiki/Model_risk)包括:
### 型号不对
当一个人发现梯子靠在错误的墙上时,爬上新商机的梯子的兴奋很快就变得索然无味。将特定模型与相应的业务挑战正确地结合起来显然是至关重要的。如果不了解该模型如何应用于挑战,或者指定了不正确的模型,可能会在机会离开较低的梯级之前就将其扼杀。
### 模型实现
从事数据科学的过程是关于从实验失败中学习,但是无意中的错误会在模型实现中产生巨大的风险。一个模型的许多运动部件都有可能出现编程错误、技术错误或使用不准确的数值近似值。这些风险中的任何一个都可能成为模型实现中的实质性弱点。
### 模型使用
决定部署一个糟糕的模型是一个有风险的使用错误。驱动模型的“燃料”是数据,其中的问题也会导致使用风险。数据可能是错误的类型,或者在范围上过于有限,或者由于偏见而意外扭曲。由于校准误差,算法可能会以意想不到的方式执行。另外,要注意在设计环境之外使用模型。在没有仔细研究和测试的情况下,一个新问题的输出可能与另一个不同问题的模型的原始意图不一致。
清楚地了解了模型的风险类型之后,下一步就是用模型风险管理框架从制度上管理这些风险。
## 模型风险管理框架
模型风险管理是关于系统地最小化用于分析商业策略、通知商业决策、识别和测量风险的计算模型的潜在风险,以及许多其他可能触发来自模型开发、输入或输出的意外后果的商业活动。模型风险管理使用活动、政策和程序的框架来系统地形式化大型企业的实施过程。
### 模型风险管理框架的要素
模型风险管理框架将合理的治理原则与业务中新模型的设计、开发、验证和部署中的端到端文档相结合。它是模型开发过程的重要推动者,尤其是在金融和生命科学机构中,在这些机构中,未能满足监管标准的代价是巨大的。如前所述,框架还可以帮助许多其他垂直行业中的模型驱动的组织最小化模型风险。
模型风险管理框架的关键要素包括:
* **模型定义:**需要记录问题陈述和模型输出的预期目的,包括所有开发决策,如使用的技术和数据集。
* **风险治理:**为评估每个模型的风险建立清晰的章程,包括要实施的政策、程序和控制。请注意,治理不同于法规遵从性,法规遵从性是关于使操作策略和过程符合法令或法规要求。
* **生命周期管理:**识别模型在其生命周期中持续使用的依赖性和重要因素。
* **有效挑战:**独立评估和验证,以确保开发期间做出的所有假设和决策都是适当的。
使用框架有助于组织为模型风险管理做准备。进行实施的实际方面和持续的风险监控需要使用一种叫做[企业机器学习操作](/resources/a-guide-to-enterprise-mlops/) (MLOps)的软件解决方案。
### 使用企业 MLOps 实施模型风险管理框架
实施模型风险管理框架需要许多复杂的实践和过程。机器学习应用的激增催生了一个新的软件领域,称为企业 m lops——这是一个实践和技术平台,用于构建模型、测试数据和算法、大规模部署模型、维护模型的持续相关性,以及提供企业级记录系统来记录模型如何工作以及为什么可以信任它们。
把 MLOps 想象成类似于 ITOps、 [DataOps](https://en.wikipedia.org/wiki/DataOps) 、 [ModelOps](https://en.wikipedia.org/wiki/ModelOps) 或 [DevOps](https://en.wikipedia.org/wiki/DevOps) 。维基百科将 [MLOps](https://en.wikipedia.org/wiki/MLOps) 定义为“机器学习、DevOps 和数据工程交汇处的一套实践。”MLOps 通常专注于模型在生产中的部署和管理。企业 MLOps 有两个主要目标:大规模地操作和自动化模型开发和部署过程,以及提高生产模型的质量。这两者对于高效和有效地实现业务和法规要求都是强制性的。借助企业 MLOps,组织可以控制和全面了解管理和开发模型的整个生命周期,同时支持模型风险管理的实际实施。
### 企业 MLOps 的核心能力
企业 MLOps 平台自动执行系统化流程,以确保正确构建和验证模型。在探索企业 MLOps 的选项时,请考虑数据科学生命周期中的四项关键能力:
* **管理**。[扩展数据科学](https://www.dominodatalab.com/blog/how-enterprise-mlops-supports-scaling-data-science)和由此产生的模型需要强大的项目管理能力。这些有助于避免关键人物风险,当数据科学专家突然离开去做新工作时,这可能是实现模型速度的障碍。集成项目管理支持复杂研究项目的协作和治理。它还简化了审计和审查过程,以确保模型的合规性和可信度。
* **发展**。数据科学的核心工作是建立模型。对于大型企业来说,扩展模型构建工作面临着巨大的障碍。为了提高效率,数据科学家需要即时访问各种工具、语言、库、集成开发环境和计算资源。缺少集成平台会导致生产力的大幅下降。在没有 MLOps 平台的情况下,跟踪所有相关的工件版本以及相应的软件元素是无法实现的。
* **展开**。企业 MLOps 的一个亮点是快速灵活地大规模部署模型。企业 MLOps 消除了数据科学家依赖 IT 或软件开发人员部署每个模型的需求。该平台确保利益相关方可以立即获得部署所需的所有资源。
* **监视器**。企业 MLOps 集成了强大的模型维护系统。它包括模型再训练和重建,以及原始建模工作的完整历史和背景;以前的版本保持不变,企业中的任何利益相关者都可以轻松使用。
例如,Domino Data Science Platform for Enterprise MLOps 包括各种模板和流程,使数据科学家能够立即提高工作效率,并使数据科学领导者能够全面了解和控制企业生产的扩展模型。我们的[白皮书](https://www.dominodatalab.com/resources/model-risk-management-in-domino-data-lab/)为模型风险管理提供了一个项目清单,包括模型定义模板、模型验证流程、模型生产流程和模型库存。
### 企业 MLOps 和模型风险管理的优势
模型风险管理的好处是实施企业 MLOps 的强大动力;使生产规模的模型能够成为“模型驱动”的业务。当最初为银行业开发时,模型风险管理通常被视为促进遵守监管标准(如 SR 11-7、CRD 协议 IV 和 GDPR 协议)的途径。随着模型风险管理扩展到各种其他行业,合规性仍然是一个重要的目标。然而,对于每一个模型驱动的企业来说,还有其他各种各样的好处。
* **容量**。使用企业 MLOps 将显著提高整个企业中数据科学团队的吞吐量和能力。Enterprise MLOps 通过提供对任何数据集、语言、工具、集成开发环境、计算资源或其他用于数据科学的元素的即时访问来实现这一点,所有这些都是按需提供的,无需 IT 人员帮助配置资源。
* **质量**。做数据科学就是做实验…一次又一次地做,直到一个模型可以大规模部署。企业 MLOps 方便了开发中使用的任何数据集或工具的可重用性。一个平台将为团队和领导者提供全面的知识管理和与任何利益相关者协作的能力。
* **治理**。组织可以自动执行活动、策略和过程,以便为任何用例大规模开发和部署模型。例如,SR 11-7 的指导建议治理将重点放在测试和分析上,以提高模型的准确性。透明度的相关好处有助于促进道德规范,控制偏见,或使模型算法的可解释性促进信任。
* **操作**。企业 MLOps 的流程自动化支持跨团队的简化工作流、更好的文档标准以及模型开发流程的一致性。通过集成的同行评审和分析,以及将当前结果与先前结果进行比较的能力,团队可以获得更可验证和更准确的模型结果。
* **管理**。企业 MLOps 允许组织根据业务价值调整人员、基础架构成本和项目优先级。模型风险管理让数据科学领导者向高管和董事会成员展示为什么组织在数据科学方面的努力是“值得的”
## 结论
模型风险管理的使用对于避免模型开发、输入或输出的非预期后果至关重要。这个概念被模型风险管理框架放大,并通过企业 MLOps 平台实现,是模型驱动业务的基石。正如麦肯锡&公司[总结](https://www.mckinsey.com/~/media/mckinsey/business%20functions/risk/our%20insights/a%20strategic%20vision%20for%20model%20risk%20management/a-strategic-vision-for-model-risk-management.pdf?shouldIndex=false)的那样,“模型范围的扩大和基于高级分析的模型使用的增加放大了模型风险管理的战略重要性。”
如果您的公司正在走模型驱动的道路,我们邀请您阅读我们的白皮书《多米诺数据实验室 中的 [*模型风险管理》中的一些实用建议和清单。*](https://www.dominodatalab.com/resources/model-risk-management-in-domino-data-lab/)
[![Whitepaper Model Risk Management in Domino Read the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/fff796ec4e281b6e52609c10515c8d9d.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/e273c581-b366-4c12-872f-a63fdaa0ea7b)
# 机器学习模型验证的重要性及其工作原理
> 原文:<https://www.dominodatalab.com/blog/what-is-model-validation>
模型验证是开发机器学习或人工智能(ML/AI)的核心组件。虽然它独立于培训和部署,但它应该贯穿整个 [数据科学生命周期](https://blog.dominodatalab.com/how-enterprise-mlops-works-throughout-the-data-science-lifecycle) 。
## 什么是模型验证?
模型验证是一组过程和活动,旨在确保 ML/AI 模型按其应有的方式运行,包括其设计目标和对最终用户的效用。验证的一个重要部分是测试模型,但是验证并没有就此结束。
作为模型风险管理的一个组成部分,验证被设计成确保模型不会产生比它解决的更多的问题,并且它符合治理需求。除了测试之外,验证过程还包括检查模型的构造、用于创建模型的 [工具](https://blog.dominodatalab.com/8-modeling-tools-to-build-complex-algorithms) 及其使用的数据,以确保模型能够有效运行。
### 模型验证的作用
在对[模型进行训练](https://www.dominodatalab.com/blog/what-is-machine-learning-model-training)之后,需要一个过程来确保模型按照预期的方式运行,并解决其设计要解决的问题。这就是模型验证的目的。
以公正的方式进行验证是很重要的。因此,验证团队通常独立于训练模型的数据科学团队和将使用模型的人。通常,较小的组织会将模型验证外包给第三方。在一些受到高度监管的行业,这通常是一个熟悉法规的团队,以确保合规性。
### 模型验证与模型评估
[模型验证](https://medium.com/yogesh-khuranas-blogs/difference-between-model-validation-and-model-evaluation-1a931d908240) 与模型评估完全分开。评估是培训阶段的一部分。它是通过训练数据完成的:你选择一个[算法](https://www.dominodatalab.com/blog/7-machine-learning-algorithms),在训练数据上训练它,然后将其性能与其他模型进行比较。
评估完成后,您可以继续验证获胜的模型。验证永远不会在测试数据上进行,而是在一个新的数据集上进行——测试数据。
## 如何验证模型
模型验证应该在模型测试之后、部署之前完成。在部署之后,可能还需要进行模型验证,尤其是在对它进行了任何更改的情况下。此外,作为监控过程的一部分,验证应在部署后定期进行,例如每年进行一次。
有 [三个主要的验证区域](https://axenehp.com/beginners-guide-model-validation/) :输入、计算和输出。
### 投入
输入部分包括模型计算中使用的假设和数据。数据应该与其来源一致,并根据行业基准以及团队在该模型或类似模型上的经验进行衡量。如果数据来自另一个模型,那么所使用的父模型的输出也应该被验证。
回溯测试通常是验证的一部分。例如,在[预测模型](https://www.dominodatalab.com/blog/introduction-to-predictive-modeling)中,可以向模型提供测试数据,然后可以将模型结果与来自测试数据的实际结果进行比较。
### 计算
检查模型逻辑很重要,以确保计算是合理和稳定的,并且输入被正确地合并。测试模型计算组件的两种常见方法是敏感性测试和动态验证。
敏感性测试包括量化模型输出的不确定性与其输入数据的不确定性之间的对应关系。动态验证包括在模型运行时更改属性,以测试其响应。
### 输出
模型的输出不仅包括计算结果,还包括数据的格式和表示。输出需要清晰,没有误导用户的风险。测试模型输出的一个好方法是将其与类似模型的输出进行比较,如果有类似模型的话。另外两种测试方法是历史回溯测试和版本控制。
## 最后的想法
如果没有合格的验证,您的组织将冒着潜在的灾难性风险,将有缺陷的模型部署到生产中。在商业中,这可能会使公司处于危险境地,甚至承担法律责任。在同一个组织中重复使用的一个有缺陷的模型可能会造成数百万甚至数十亿的损失。在卫生和科学等领域,一个未经验证的模型会危及人类生命。
除了模型本身,许多利用[机器学习模型](https://www.dominodatalab.com/blog/a-guide-to-machine-learning-models)的组织,包括毕马威和 Axene Health Partners,都将 [模型治理](https://blog.dominodatalab.com/the-role-of-model-governance-in-machine-learning-and-artificial-intelligence) 和文档监督作为验证流程的基本组成部分。当然,验证过程本身也必须完全记录在案。
认真对待数据科学计划的模型驱动型组织依赖于像 Domino 这样的企业级 MLOps 平台。Domino 不仅提供了数据科学团队需要的库和协作工具,还提供了大量的文档和治理工具,可以指导整个数据科学生命周期。
[![The Practical Guide to Accelerating the Data Science Lifecycle Lessons from the field on becoming a model-driven businesses. Read the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/733c37e12c2c7c37295fb3198e3a226a.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/c77ca351-ae85-425a-9ee3-c264b3bc4a69)
# 机器学习建模:工作原理及其重要性
> 原文:<https://www.dominodatalab.com/blog/what-is-modeling>
模型是数据科学的中心输出,它们有巨大的力量来改变公司、行业和社会。每一个机器学习或人工智能应用的中心都是用数据、[算法](/blog/7-machine-learning-algorithms)和代码构建的 ML/AI 模型。即使模型看起来像软件并且涉及数据,但是模型有不同的输入材料、不同的开发过程和不同的行为。创建模型的过程称为建模。
## 什么是机器学习建模?
模型是一种特殊类型的算法。在软件中,算法是一组[硬编码的指令,用于计算确定性答案](https://csd.cmu.edu/research-areas/algorithms-and-complexity)。模型是一种算法,其指令是从一组数据中归纳出来的,然后用于进行预测、推荐或根据概率评估规定一项行动。该模型使用算法来识别数据中与输出形成关系的模式。模型可以在事情发生之前比人类更准确地预测事情,例如灾难性的天气事件或谁在医院面临即将死亡的风险。
## 为什么 ML 模型很重要?
模型极大地降低了预测的成本,就像半导体极大地降低了运算的成本一样。这种变化使得模型成为竞争优势、战略和增长的新货币。模型可以互相建立。一个模型的输出充当另一个更复杂模型的输入,然后创建一个活生生的、相互联系的、可训练的决策者大军。不管是好是坏,模型可以自主完成,其速度和复杂程度是人类无法企及的。
对于模型驱动的组织来说,建模不仅仅是创建模型的过程。这是一个由流程、工具和协议组成的[框架](/blog/choosing-the-right-machine-learning-framework),在数据科学生命周期的每一步为数据科学团队提供支持(DSLC)。
模型治理是建模的核心,它包括从构建第一个模型版本到在生产环境中部署最终模型的过程中跟踪模型工件。每次模型改变或使用新数据时,都会记录新的版本。持续监控模型的健康状况,以观察由于输入数据的变化、市场的变化或输入数据不再与构建模型时使用的数据平行的任何其他变化而可能出现的异常。不受监控的模型可能会开始产生不准确的答案,从而导致糟糕的业务绩效,并且在业务部门意识不到的情况下继续如此。
## 建模工具的类型
建模工具通常是基于代码的,尽管一些商业解决方案可以在没有代码的情况下创建简单的模型,并且存在多种语言的库和框架来帮助数据科学家加速他们的工作。这些工具包含算法库,可用于快速高效地创建模型。许多建模工具是开源的,并且依赖于 Python,尽管其他语言也很常用,比如 R、C++、Java、Perl 等等。一些流行的工具库和框架有:
* **Scikit-Learn:** 用于机器学习和统计建模技术,包括分类、回归、聚类和降维以及预测数据分析。
* **XGBoost:** 是一个开源库,为各种编程语言提供了一个[正则化的梯度增强框架](/blog/credit-card-fraud-detection-using-xgboost-smote-and-threshold-moving)。
* **Apache Spark:** 是一个开源的统一分析引擎,专为扩展数据处理需求而设计。
* **PyTorch:** 用于深度学习模型,像自然语言处理和计算机视觉。它基于 Python,由脸书人工智能研究实验室开发,是一个开源库。
* 与 PyTorch 类似,这是一个由 Google 创建的[开源 Python 库](https://www.dominodatalab.com/data-science-dictionary/tensorflow),支持其他语言。它用于开发深度学习模型。
* Keras: 是一个构建在 TensorFlow 之上的 API,它提供了一个简化的接口,只需要最少的手工编码。
* **Ray:** 是一个开源的库框架,它提供了一个简单的 API,用于将应用从[单个 CPU 扩展到大型集群](/blog/ray-tutorial-for-accessing-clusters)。
* **Horovod:** 是一个分布式深度学习训练框架,可以与 PyTorch、TensorFlow、Keras 和其他工具一起使用。它用于同时跨多个 GPU 进行扩展。
有数以千计的工具可用,大多数模型需要多种最适合数据类型和业务问题的工具。
### ML 模型是如何构建的?
在业务环境中,新模型的出现几乎总是源于需要解决方案的问题,比如做出更明智的决策、自动化流程或在大量数据中寻找模式。
一旦确定了该问题的解决方案,就将其转化为业务目标,例如预测库存短缺,或者确定银行客户的信用限额。然后,这可以转化为一个需要使用 ML/AI 模型解决的技术问题。
根据业务问题的类型和可用数据,确定最适合该问题的方法。有各种类型的[机器学习方法](/blog/a-guide-to-machine-learning-models),包括:
* **监督学习:**当您知道模型需要学习什么时使用,通常是在预测、回归或分类中。你把算法暴露给训练数据,让模型分析输出,调整参数,直到达到预期目标。
* **无监督学习:**模型可以自由探索数据,识别变量之间的模式。这对于根据统计属性对非结构化数据进行分组非常有用。因为不需要培训,这是一个快得多的过程。
* **强化学习:**当模型需要与环境交互时,与人工智能或神经网络一起使用。当模型采取期望的行动时,它的行为会通过奖励得到[的强化。](/blog/deep-reinforcement-learning)
* **回归:**用于训练监督模型。它用于使用以前的数据集预测或解释一个数值,就像根据历史经济数据预测利率的变化一样。
* **分类:**用于预测或解释监督学习中的类值。这通常用于电子商务,如预测客户购买或对广告的反应。
* **聚类:**与无监督开发一起使用,这些模型根据相似性或共享属性对数据进行分组。在商业上,这些可以用来细分消费者市场。社交媒体和视频平台可以使用聚类来推荐新内容。
* **决策树:**通过回答关于对象属性的问题,使用算法对对象进行分类。根据不同的答案,比如“是”或“否”,模型会继续处理另一个问题,然后是另一个问题。这些模型可以用于预测定价和客户服务机器人。
* **深度学习:**旨在复制人类大脑的结构。这也被称为[神经网络](/blog/trending-toward-concept-building-a-review-of-model-interpretability-for-deep-neural-networks),数百万个相连的神经元创建了一个复杂的结构,多次处理和再处理数据,以得出答案。
一旦获取了数据,就根据具体方法的需要对其进行准备,可能包括从数据集中删除不必要的或重复的数据。然后,数据科学家将使用不同的算法进行实验,并在不同的数据集上比较性能。例如,图像识别模型将在一组图像上训练,然后在一组新的图像上测试,以确保它将按要求执行。一旦性能满足了业务问题的需求,就可以部署了。
即使模型看起来是稳定的,并且在预期的参数范围内工作,它仍然需要被监控。这可以使用 Domino Model Monitor 平台自动完成,方法是指定模型准确性度量,然后让平台通知您模型的性能是否超出了这些度量。例如,如果模型精度开始下降,则有必要调查原因,并使用数据的更新表示重新训练模型,或者甚至构建一个新的模型。
### 管理模型风险
模型风险,即模型被使用但未能满足预期结果,如果没有实施安全措施来管理它,可能会异常危险。这归结为[模型风险管理](https://www.dominodatalab.com/resources/model-management/)。如果你熟悉金融,你会发现数据科学中的模型风险管理类似于[金融模型](https://www2.deloitte.com/ca/en/pages/risk/articles/model-risk-management.html)的风险管理。模型风险管理有五个关键方面,模型治理是其中之一。
* **模型定义:**详细说明模型起源背后的问题陈述、模型输出的目的,以及所有开发决策、修改和使用的数据集。
* **风险治理:**包括要实施的政策、程序和控制。
* **生命周期管理:**识别模型依赖关系和在模型的整个生命周期中需要注意的因素。
* **有效挑战**:独立评估和验证,以确保开发期间做出的所有决策都是适当的。
无论模型性能如何,都需要适当的模型风险管理,以确保模型符合组织的期望和法规要求。
## 企业物流建模
随着组织的成长,跨团队和工具管理、开发、部署和监控模型所需的复杂性可能会导致进展停滞。企业 MLOps 平台旨在通过通用治理和模型风险管理框架帮助不同团队和工具扩展数据科学,同时支持所有类型模型的标准化开发、部署和监控流程。由企业 MLOps 推动的模型驱动的组织能够在竞争优势、战略和增长的新货币——AI/ML 模型上获利。
[![The Practical Guide to Accelerating the Data Science Lifecycle Lessons from the field on becoming a model-driven businesses. Read the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/733c37e12c2c7c37295fb3198e3a226a.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/c77ca351-ae85-425a-9ee3-c264b3bc4a69)
# 什么是强化学习,如何使用?
> 原文:<https://www.dominodatalab.com/blog/what-is-reinforcement-learning>
当你做得好的时候,你会得到奖励。这个简单的原则从一开始就指导着人类,现在,它比以往任何时候都更是我们每天使用和依赖的技术中越来越多的强化学习(RL)代理背后的关键原则。
## 什么是强化学习?
强化学习是 [训练机器学习模型](//blog.dominodatalab.com/what-is-machine-learning-model-training) 做出一系列决策的技术,通常基于不确定且复杂的数据集。 [RL 代理因正确决策而被奖励](https://web.stanford.edu/class/psych209/Readings/SuttonBartoIPRLBook2ndEd.pdf) ,因错误决策而被惩罚。它的目标是回报最大化,简而言之,把每个问题都当成一个游戏。强化学习用于游戏人工智能、机器人导航或任何需要模型获取新技能或实时做出快速决策的应用。
设计团队为模型设置规则,以确定什么会产生奖励或惩罚,但一旦设置好,就没有进一步的干预了。该模型自行运行,并通过试错,学会最大化回报,以发展模式识别和解决问题的复杂技能。
## 强化学习的重要性
强化学习代理有特定的目标要实现,可以感知和适应环境的变化,并可以选择行动来影响这些环境。在所有类型的机器学习中,它最接近人类的学习方式,有些人会说, [RL 可以展示创造力](https://medium.com/@BonsaiAI/why-reinforcement-learning-might-be-the-best-ai-technique-for-complex-industrial-systems-fde8b0ebd5fb) 。
当强化学习做得好的时候,它可以达到比人类更快、错误更少的结果。如果给予足够的计算机资源,一个 RL 模型可以处理数以千计的并行游戏,并从每个游戏中学习。结果往往是更具创新性的问题解决方案。
当在具有复杂数据的环境或数据快速变化的环境中使用 RL 模型时,可以看到 RL 模型的好处。因为他们接受了惩罚和奖励系统的训练,而不是被引导到预定的决策路径,RL 模型能够为不可预见的情况创建自己的解决方案。
例如,考虑一个导航应用程序,它必须对不断变化的交通状况或复杂的供应链做出响应,其中许多因素可能会在没有通知的情况下发生变化。RL 模型能够在人类通常需要长得多的时间来响应并且通常不那么准确的环境中快速有效地响应。
### 强化学习是如何工作的?
强化学习总是基于奖励假设。奖励(R[t] )是一个标量反馈系统,它指示代理在步骤 t 做得有多好。代理的目标是最大化其累积奖励。
1. RL 代理从环境接收状态。
2. 代理基于 s 采取行动(A)。
3. 由于代理人与环境的相互作用,环境现在处于一种新的状态,S2,并且代理人得到一种奖励(或惩罚)。
奖励或惩罚因代理人预期实现的目标而异。在视频游戏的情况下,代理人可以获得点数作为奖励,就像人类玩家一样。在汽车自动驾驶的情况下,如果车辆保持在预期轨迹上,可能会得到奖励,而如果发生碰撞,则会受到惩罚。机器人可以因行走而受到奖励,也可以因摔倒而受到惩罚。
在整个过程中,代理人使用一个价值函数来评估由于其可能的行动而导致的状态变化,并 [预测未来的回报](//blog.dominodatalab.com/introduction-to-predictive-modeling) 。然后,它可以选择正确的行动方针。
### 强化学习算法
每个 RL 代理的核心是处理来自环境的数据的算法。有许多可用的开源算法库,例如:
* [【稳定基线 3 (SB3)](https://github.com/DLR-RM/stable-baselines3) :是 PyTorch 中一套可靠的 RL 算法。RL Baselines3 Zoo 包括一系列预先训练的代理、训练脚本、评估代理、调整超参数、绘制结果以及录制视频。
* [ACME](https://github.com/deepmind/acme) :专为 Python 设计的 RL 积木库。它包括许多基线代理,作为新实现的起点,以及作为比较新迭代性能的强大基线。
* [多巴胺](https://github.com/google/dopamine) :支持 Tensorflow 和 Jax 的 RL 代理库。图书馆的大部分是为 Atari 2600 视频游戏设计的。在默认设置下,单个训练实验将持续 2 亿帧。
* RLib :支持 TensorFlow 和 PyTorch,非常注重高可伸缩性和统一的 API。它为单个代理和单个策略、多个代理以及具有多个策略的多个代理提供了不同的环境。
![applications-of-reinforcement-learning](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/aaabcbd862f522a2b8a5fa255c59e1b8.png)
### 强化学习的应用
2021 年,加州大学伯克利分校的研究人员训练了一个名叫卡西 的 [两足机器人如何行走。在日本,](https://www.youtube.com/watch?v=goxCjGPQH7U) [机器人制造商 Fanuc](https://machinelearningknowledge.ai/8-real-world-applications-of-reinforcement-learning/) 一直在训练机器人区分盒子里的随机物体,取出它们并放入另一个盒子。这可能看起来像儿戏,因为它是。如果你考虑到这些任务对初学走路的孩子来说有多难掌握,你就能体会到让机器自己编程用 RL 做这些事情是多么具有革命性。
在金融领域,RL 模型用于交易,通过观察股票价格的状态并及时采取行动以实现收益最大化,表现优于最好的对冲基金经理。与此同时,在电子商务领域,RL 代理正在取代旧的消费者推荐系统。例如,阿里巴巴集团现在正在使用一家 RL 代理公司——乐百氏 DQN,通过考虑不断变化的客户偏好数据来改善对客户的推荐。同一家公司还使用 RL 代理对付费在线广告进行投标,以优化覆盖范围,而无需不必要的超额投标。
强化学习代理也可以在自动化工业控制系统中找到。由 Deepmind 开发的谷歌 AlphaGo 目前正被用于优化冷却系统。Salesforce 使用 RL 代理来汇总长文本内容,包括文章、博客和其他文档。
## 用 Domino 数据实验室进行强化学习
每个星期,组织都宣布强化学习技术的突破,推动被认为是合理的东西的门槛,并建立一个又一个成功的代理。无论您的数据科学团队有多大,也无论您在哪个部门工作,您都将需要仅在[企业级 MLOps 平台](https://www.dominodatalab.com/product/domino-enterprise-mlops-platform/)中可用的库、工具和资源,以将您的合作项目从开始带到成功部署。
Domino 的 Enterprise MLOps 是当今机器学习平台的领导者,现在被 20 家财富 100 强公司使用。要开始探索 Domino 企业 MLOps 平台的优势,请注册一个[14 天免费试用版](https://www.dominodatalab.com/trial/?_ga=2.42355429.1300734614.1636060935-555552642.1632667115) 。
David Weedmark 是一位出版作家,曾担任过项目经理、软件开发人员和网络安全顾问。
# 数据科学项目的数据科学生命周期是什么?
> 原文:<https://www.dominodatalab.com/blog/what-is-the-data-science-lifecycle>
数据科学是一个极其复杂的领域。当你在工作的企业环境中考虑业务关键型机器学习模型的要求时,旧的养猫迷因甚至不会得到一笑。
在数据科学生命周期(DSLC)的四个步骤中构建[数据科学项目](/resources/field-guide/managing-data-science-projects/),可以更轻松地管理有限的资源和控制时间表,同时确保项目满足或超过其设计的业务要求。
## 什么是数据科学生命周期?
数据科学生命周期(DSLC)是一系列创建、部署和监控分析模型的迭代步骤。在其最高级别,数据科学生命周期(DSLC)由四个阶段组成:管理、开发、部署和监控。在每个阶段中都有多个迭代步骤,通过这些步骤,项目进展到最终生成生产模型。该项目可能会通过先前的步骤进行循环,以获取更多的数据、构建新的特征、尝试不同的算法、调整超参数等等。即使在部署之后,当模型性能衰退时,模型将返回到先前的步骤进行重新训练或重建。
## ![4 steps outlines in the data science lifecycle](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cc3a094a6b2143eb379d913ae30b38c4.png)
## 数据科学生命周期的 4 个步骤是什么?
数据科学生命周期将任何给定项目中的所有任务分为四大步骤。这不仅有助于创建每个项目的整体鸟瞰图,还可以更容易、更有效地确定哪里需要资源,以及确定每个项目的进展情况。这四个步骤是:
* **管理:**多个人员和团队参与各个步骤,包括 IT 运营、业务利益相关方、数据科学领导者、数据科学家、数据分析师、开发人员、数据科学产品经理、ML 工程师和数据工程师。
* **开发:**访问和准备数据,然后创建特征。构建、评估和记录多个模型。当最终的模型被选择时,它被验证以确保它解决了业务问题并且在技术上是合理的。
* **部署:**模型被注册到一个中央存储库中,并被测试以确保它们在生产中会如预期的那样运行。所有的模型工件都被保留和编目。它们通过模型治理过程被批准部署,并被集成到系统或过程中以供使用。业务采用通过变更管理得到保证。
* **监控:**持续监控模型的性能和漂移,并在性能下降时采取措施。捕获并传达业务价值实现
让我们用一个业务问题示例来说明数据科学生命周期的四个步骤
## 管理步骤
管理步骤应该涉及一个跨职能团队,包括来自业务部门的代表、数据科学家、工程师、分析师和开发人员。在这里,每个人都聚在一起设计要解决的问题,提出解决方案,然后从[技术和业务角度](http://www.cs.toronto.edu/~soroosh/gr4ml_language.html)确定项目需求并确定其优先级。
### 找出问题所在
没有任何解决办法可以先于问题。假设一家零售商在其网站上有几千种产品出售。确定每件商品的最佳价格主要是人工完成的,方法是根据历史趋势对整个类别进行折扣,以及将最畅销的商品与竞争对手的价格进行比较。这是一个非常耗时和低效的过程,使用 ML 模型会有效得多。这个阶段的一个关键输出是理解将受到 ML 模型影响的一个或多个决策。
### 评估项目
您的业务部门希望使用来自竞争对手的实时数据,根据内部历史定价和销量动态调整价格。经过一番讨论后,您决定需要创建一个竞争对手定价的实时数据库。制造商的 SKU 并不总是可用,零售商的 SKU 也因公司而异,因此识别竞争对手的产品需要一个能够整合 SKU、产品描述和图片的模型。一个来自以前项目的现有模型,比较图像和描述来衡量产品的受欢迎程度,可以重新用于这个项目。如果无法获得完成目标所需的数据或资源,一些项目可能会到此结束。
### 确定项目的优先级
不仅需要对每个项目中的任务进行优先级排序和角色分配,还需要考虑其他项目所需的工作。在我们的定价示例中,您决定首先开发一个 API,它可以从三个竞争对手的网站中提取数据,并创建一个新的数据库。这将让您的数据工程师和开发人员忙碌几天。与此同时,您的数据科学家可以完成另一个已经部署但需要更新的紧迫项目。
管理阶段既是数据科学生命周期的开始,也是结束。生产中的 ML 模型可能会降级,可能需要重新培训,并根据新的请求确定优先级。在其他情况下,生产中的 ML 模型可以用于新的项目,以便为组织实现更高的价值。
## 显影步骤
对于数据科学家来说,开发阶段是所有乐趣的开始。开发通常有三个部分,从访问数据开始,探索和准备数据,然后研究和开发模型。
### 存取数据
在我们的定价模型示例中,许多数据需要从互联网上提取并放入新的数据库中。历史内部数据应该已经可用,但需要使其可访问。然而,在其他情况下,数据可能不可用,必须从其他来源购买。
### 探索和准备数据
在大多数情况下,需要为数据做好准备。缺失的数据需要被处理,数据需要被分类,无关的数据和重复的列需要被删除,并且只有在预测期间可用的数据才可以被使用。例如,在预测能源需求时,您不能使用温度,因为您只知道事后的实际温度。在这种情况下,您必须使用预测温度。错误地准备数据可能与实际构建 ML 模型一样重要。
### 研究与开发
在这部分开发中,数据科学家开始创建模型并进行实验来测试它们的性能。在开发的这一部分有很多尝试和错误,因为需要评估和修改不同的算法。通常,您需要返回并再次准备数据,因为被测试的模型中的变化可能需要不同的变量。
R&D 的最终结果应该是一个工作模型,它结合了在管理步骤中确定的功能,可以根据需要执行
## 部署步骤
[部署阶段](/blog/machine-learning-model-deployment)是将经过测试的模型转移到生产环境的阶段。理想情况下,这是项目从数据科学家移交给开发人员和工程师的地方,尽管从项目开始到完成通常需要首席数据科学家的监督。
### 验证您的模型
根据公司治理、法律或认证机构的要求,对测试的模型进行分析和验证。这确保了模型的建立是正确的,符合伦理的,没有偏见的。它还确保模型不会滥用数据来获得结果。例如,这在医疗保健和金融领域至关重要。此外,任何收集数据的公司都必须遵守法律和自己的用户协议,知道可以和不可以对客户信息做什么。
### 发布您的模型
将工作模型投入生产状态并进行分析。在我们的定价模型示例中,该模型可以访问客户服务器上的数据,以及从竞争对手网站收集实时数据的数据库的工作版本。如果它遇到任何问题,或者如果它不像预测的那样工作,模型可能需要被终止,并进行一系列新的测试,将项目带回开发步骤。
### 交付您的模型
一旦工作模型被成功发布,它就可以被交付给将要使用它的业务单元。交付阶段包括将模型合并到业务流程中,培训用户,并确保模型按计划使用。在我们的定价模型示例中,将添加一个 API,以便可以监控它,并且可以实时查看它对产品价格所做的任何更改。
## 监控步骤
向商业世界发送一个 ML 模型永远不会是数据科学生命周期的结束。监测是这一过程的基本部分。
首先,需要监控传入的数据。在我们的定价模型示例中,内部数据应该相对稳定,如果要进行任何更改,应提前通知监督 ML 模型的人员。其他实时数据来源就不一样了,它们可能会在没有通知的情况下随时发生变化。[需要模型监控](/blogs/model-monitoring-best-practices-maintaining-data-science-at-scale)以确保团队被通知输入数据的任何变化,不管来源如何——因为模型可能需要重新开发。
其次,需要对模型进行监控,以确保它始终如一地交付业务角度所需的价值。在我们的定价模型示例中,产品成本或最低加价应该已经被考虑到模型中。否则,这种模式很容易开始以低于成本的价格销售产品,这可能会成为公司底线的一个严重问题。
第三,您不仅需要监控模型及其数据源,还应该监控最终用户,尤其是在采用的早期。您需要确保他们可以访问他们需要的结果,并且模型提供给他们的信息是可用的。这通常涉及培训,但在某些情况下,可能需要修改平台或用户界面。
不管工作模型执行得有多好,一旦它如预期的那样执行,并且用户习惯于将它集成到他们自己的工作流中,团队应该再次开会,以确定相同或相似的模型是否可以在其他环境中使用。
### 使用企业 MLOps 推动 DSLC 的采用
当您拥有现成的工具和框架时,将数据科学生命周期应用到您公司的数据科学项目中会容易得多。Domino 的企业 MLOps 平台是基于 DLSC 的协作而从头开始构建的,因此每个业务需求、每个资源、每个数据集、算法和实验都可以在同一个平台中记录和获取。
[![The Practical Guide to Accelerating the Data Science Lifecycle Lessons from the field on becoming a model-driven businesses. Read the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/733c37e12c2c7c37295fb3198e3a226a.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/c77ca351-ae85-425a-9ee3-c264b3bc4a69)
# 什么是 Pharmaverse,数据科学创新者如何利用它来简化药物审批?
> 原文:<https://www.dominodatalab.com/blog/what-is-the-pharmaverse>
当涉及到制药行业时,机器学习、人工智能和统计计算环境(SCE)经常获得媒体关注的最大份额,并在报道中抓住大众的想象力,这些报道主要关注旨在为下一个突破性治疗找到有趣的化学候选物的技术。但是,在寻求新疗法的过程中,数据科学还有第二个更少被提及的作用,葛兰素史克高级董事兼统计数据科学主管安迪·尼科尔斯(Andy Nicholls)在 [*《数据科学创新者的剧本*](https://www.dominodatalab.com/resources/data-science-innovators-playbook) 中讨论了这一点。
## 人工智能和人工智能模型的许多其他角色
“人们对数据科学感到兴奋的部分是机器学习、视觉识别之类的东西。但对我们来说,数据科学也对审批过程有影响,我们必须证明我们的药物是有效和安全的,”尼科尔斯说。
“我们重复使用许多相同的工具进行分析、可视化、分析安全数据和文档记录,”他说。
“有了数据科学,我们有了可视化工具,我们可以合并数据源,我们可以做一些事情,比如与监管机构共享数据库,”Nicholls 补充道。
## 药剂师反对者:一个可以缩短药物审批时间的合作想法
一个有望帮助加快审批速度的新兴工具是 Pharmaverse,这是一套工具,主要在 R 中,帮助制药公司更好地与监管机构合作,共享数据、模型和软件。
尼科尔斯解释说:“[pharma corr](https://pharmaverse.org/)是一个基于研究如何重复使用数据的想法,并创建了一系列经过审查的工具和结果,这些工具和结果简化了获得药物批准的端到端过程的许多部分。”
Domino 最近采访了 Nicholls 的电子书《数据科学及其顶级创新者》,以及《数据科学创新者的剧本[。要了解更多关于数据科学在医学和其他领域的创新应用,请下载这本 24 页的电子书。](https://www.dominodatalab.com/resources/data-science-innovators-playbook)
## 其他有特色的创新者也对数据科学及其优势发表了看法
下载免费的 [*数据科学创新者手册*](https://www.dominodatalab.com/resources/data-science-innovators-playbook) 阅读西原以及其他许多顶级创新者关于主题、战略和创新的更多见解,这些见解使数据科学成为商业及其他领域的变革力量..这一独家内容包括以下采访:
* [卡西·科济尔科夫](https://www.dominodatalab.com/blog/googles-kozyrkov-tells-rev-3-data-science-universe-is-expanding-and-incredible-mlops-tools-emerging)——谷歌首席决策科学家
* Andy Nicholls——GSK PLC 统计数据科学部高级总监
* Mona g . Flores——NVIDIA 医疗人工智能全球主管
* najat Khan——强生公司让桑制药公司首席数据科学官兼研发战略与运营全球总监
* Robert Nishi hara——Ray 的联合创始人,Anyscale 的联合创始人兼首席执行官
* [John k . Thompson](https://www.dominodatalab.com/blog/how-to-retain-your-data-scientists)—分析思想领袖、畅销书作家、数据创新者&分析
* Glenn Hoffmann——纽约人寿保险公司首席分析官
这些创新者还根据自己的道路提供职业建议,并提供发展和管理数据科学团队的技巧。今天就下载 [*数据科学创新者的剧本*](https://www.dominodatalab.com/resources/data-science-innovators-playbook) 。
[![Ebook The Data Science Innovator's Playbook Industry trends, career advice, and how to meet the world's biggest challenges. Read the book](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/30324421f137a17eb87e63193631070d.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/b9b000f9-22c1-4169-a302-35fe4dee155c)
# 保险业中数据科学的兴起对该行业意味着什么,以及它是如何变化的
> 原文:<https://www.dominodatalab.com/blog/what-the-rise-of-data-science-in-insurance-says-about-the-profession-and-how-its-changing>
您如何将数据科学能力打造为一种强大的力量,用于对您业务的几乎所有方面做出决策?在一个人才竞争激烈且不断增长的领域,你如何招聘、培训、组织和再培训你的团队成员?这些只是纽约人寿保险公司首席分析官 Glenn Hofmann 在任职期间遇到并掌握的几个问题。
在五年的时间里,Glenn Hofmann 在纽约人寿内部创建了一个成功的大规模数据科学组织,纽约人寿是财富 100 强公司,也是美国最大的互惠人寿保险公司。纽约人寿的数据科学和人工智能中心(CDSAi)完全专注于公司的核心业务。CDSAi 广泛的统计和机器学习专业知识帮助纽约人寿在全公司范围内做出实时的、基于模型的决策,因此纽约人寿即使在新冠肺炎疫情这样的高度不确定时期也能应对新的挑战。
## 霍夫曼和其他顶级创新者的新电子书访谈
Domino [最近与 Hofmann 就我们的新电子书](https://www.dominodatalab.com/blog/7-top-innovators-share-insights-trends-and-career-advice-in-the-data-science-innovators-playbook) 、 [*【数据科学创新者的剧本】*](https://www.dominodatalab.com/resources/data-science-innovators-playbook) 进行了对话,该书涵盖了数据科学在推动创新方面的崛起,通过在 5 月份的 [Rev 3](https://www.dominodatalab.com/resources/breakthrough-innovations-rev-3?utm_content=214346104&utm_medium=social&utm_source=linkedin&hss_channel=lcp-3542130) 对同行选出的七位顶级数据科学创新者进行采访。
所有这些创新者都在解决一些世界上最棘手的问题,其中许多问题——如 COVID 和——给保险和金融行业带来了特别严峻的挑战。但是,霍夫曼说, [新工具正在加强数据科学](https://www.dominodatalab.com/blog/googles-kozyrkov-tells-rev-3-data-science-universe-is-expanding-and-incredible-mlops-tools-emerging) ,因此 [这门新兴学科越来越有能力应对世界抛给它的任何挑战](https://www.dominodatalab.com/blog/rocketing-confidence-in-data-science-poll-finds-are-better-tools-the-reason) ,纽约人寿继续茁壮成长。
## 数据科学工具的改进有助于推动创新
“算法变得更好了,将模型部署到生产中的基础设施和软件也有了很大的改进,”霍夫曼说。“这推动了我们的模型对业务的影响。”
“例如,在纽约人寿,我们有内部和基于云的计算环境,用于数据科学生命周期的各个方面,”他说。“这包括 Domino,它可以在任何流行的编程语言中实现模型的灵活实时部署,并在生产中监控和报告我们的模型。”
在 [的新电子书](https://www.dominodatalab.com/resources/data-science-innovators-playbook) 中,霍夫曼解释了他的一些技巧,让纽约生活成为许多数据科学家想要从事职业的地方。在他的《创新者》采访中,你会发现:
* 为什么不应该将数据科学团队建设策略建立在寻找大量“全栈”数据科学家的基础上
* 霍夫曼传播数据科学的两种方式——在组织内部和外部
* 对你的业务产生更大影响和作用的三种方法,包括建立模型信任
## 其他关于数据科学优势的创新者
下载 [*数据科学创新者行动手册*](https://www.dominodatalab.com/resources/data-science-innovators-playbook) 阅读更多 Glenn 的观察,以及许多其他主题、战略、战术和见解,请访问:
* [卡西·科济尔科夫](https://www.dominodatalab.com/blog/googles-kozyrkov-tells-rev-3-data-science-universe-is-expanding-and-incredible-mlops-tools-emerging)——谷歌首席决策科学家
* najat Khan——强生公司让桑制药公司首席数据科学官兼研发战略与运营全球总监
* Robert Nishi hara——Ray 的联合创始人,Anyscale 的联合创始人兼首席执行官
* Mona g . Flores——NVIDIA 医疗人工智能全球主管
* [约翰·汤普森](https://www.dominodatalab.com/blog/how-to-retain-your-data-scientists)—分析思想领袖、畅销书作家、数据创新者&分析
* Andy Nicholls——GSK PLC 统计数据科学部高级总监
电子书是免费的,但是你需要在这里注册[](https://www.dominodatalab.com/resources/data-science-innovators-playbook)。你也可以在这里 看到更多关于二十六页电子书 [的内容。](https://www.dominodatalab.com/blog/7-top-innovators-share-insights-trends-and-career-advice-in-the-data-science-innovators-playbook)
[![Ebook The Data Science Innovator's Playbook Industry trends, career advice, and how to meet the world's biggest challenges. Read the book](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/30324421f137a17eb87e63193631070d.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/b9b000f9-22c1-4169-a302-35fe4dee155c)
# 您的首席信息官需要了解的数据科学知识
> 原文:<https://www.dominodatalab.com/blog/what-your-cio-needs-to-know-about-data-science>
## 你想做什么?数据科学还是 DevOps?
作为一名数据科学家,您的 CIO 可能会从您那里听说模型部署是一项挑战(例如,模型在部署到生产环境之前会闲置数周)。然而,您的首席信息官可能不具备应对挑战所需的细致入微的洞察力。与此同时,由于对模型无所事事感到沮丧,你可能会通过做 DevOp 式的工作来获得创造力,包括安装包、在机器之间移动文件,以及配置和使用自己的计算资源作为围绕的工作。然而,难道你不想把时间花在探索性的数据分析和开发新模型上吗?根据 [Crowdflower 的 2017 年数据科学调查](https://visit.crowdflower.com/rs/416-ZBE-1img/CrowdFlower_DataScienceReport.pdf?mkt_tok=eyJpIjoiTTJFek1UaGxNekl5TmpJeCIsInQiOiJPMXpWVnREbHJGR1RHN1BUVk9Zdm5xTEEyNXRpdDRONmZ4XC9oaFwvZGpFNnB0Z0hIWERGS1NqN0huRjB5QUE1UUJVbVZxNFhaeVBSUXJzMTNYdmRJR)、*“数据科学家最快乐的是构建和建模数据,挖掘数据以寻找模式和提炼算法。”*
## 考虑你的首席信息官的观点,并提供帮助他们的见解
花点时间考虑一下您的首席信息官的观点。这样做将使您能够提供正确的见解,帮助您的首席信息官解决延迟模型部署等挑战。根据 [KPMG 2017 CIO 调查](https://home.kpmg/gr/en/home/insights/2017/05/harvey-nash-kpmg-cio-survey-2017.html),IT 领导层的首要运营优先事项包括*“为业务提供一致而稳定的 IT 性能”*和*“提高运营效率”*。
随着越来越多的企业希望将数据科学打造为核心组织能力,数据科学为首席信息官带来了独特的挑战和机遇。首席信息官面临的挑战是,如何在不限制您或您的数据科学家同事进行数据分析和开发新模型的能力的情况下,集中数据科学工具和基础架构,从而提高运营效率。
如果没有经过深思熟虑的方法来解决这种紧张关系:
* 重要的业务流程变得依赖于不可靠的基础设施。寻找变通办法的数据科学家可能会设置在本地机器上运行的计划作业,或者将共享服务器作为“实验室”或“开发”机器来操作。一家财富 10 强银行的关键业务流程依赖于一个模型,该模型是一名数据科学家每晚在其笔记本电脑上运行的,直到他离开时才被发现,而该笔记本电脑也已退役。
* 计算成本可能会变得过高且无法控制。与 BI 不同,数据科学涉及计算密集型技术,需要高性能的机器和 GPU 等专门资源。尤其是在云环境中,数据科学家可能会无意中让昂贵的机器不必要地运行,从而每月浪费数千美元。
* 高价值知识产权保护不当。预测模型和分析可以封装对竞争优势至关重要的洞察力,而这项工作通常分散在网络驱动器、wikis 或 Sharepoint 站点上。
* IT 员工将会忙于被动支持(例如,数据科学家请求安装软件包或配置基础架构),而没有时间关注更具战略性的投资。
这些只是为您的 CIO 提供的一些见解,有助于他们了解如何让您能够将更多精力放在数据科学而不是开发工作上。如果您想进一步帮助您的首席信息官应对数据科学的独特 IT 挑战,并让 IT、数据科学家和业务高管找到一个能满足所有人需求的解决方案,那么请向您的首席信息官提供[完整的白皮书](https://www.dominodatalab.com/resources/wild-west-data-science/?utm_source=blog&utm_medium=post&utm_campaign=how-cios-wrangle-wild-west-data-science)。
# Domino 5.0:释放模型速度
> 原文:<https://www.dominodatalab.com/blog/whats-new-in-domino-5.0>
每位高管都会告诉你,数据科学和机器学习对他们公司未来的成功至关重要。然而,与此同时,大多数人都会承认,他们在数据科学和机器学习方面的投资尚未带来他们想要的结果。
严峻的事实是,虽然机器学习很容易取得快速胜利,但在整个企业中扩大其影响却极具挑战性——以支持更多的项目、更大的团队和不同的流程。许多团队在数据科学生命周期的各个阶段都会遇到重大摩擦,围绕着使数据科学独一无二的三个基本要素:
1. **计算。**数据科学家需要前所未有的计算能力和灵活性来试验新的软件工具。大多数公司无法处理现代数据科学技术和工作负载的独特基础架构和软件需求。结果是大量耗时的开发工作,限制了研究的速度。
2. **数据。**尽管经过了几十年的努力,数据科学家仍然面临着巨大的数据工作摩擦。他们必须在几十个不同的地方寻找他们需要的数据,他们可能没有适当的访问权限,需要 IT 帮助才能获得这些数据,然后每个团队都必须编写自己的数据访问代码才能处理这些数据。
3. **车型。**对于大多数企业来说,模型是一种新型的数字资产。它们是概率性的,其行为不同于软件等更传统的 IT 资产。数据科学家在部署模型时遇到摩擦,这延迟了业务影响。然后,不一致或不存在的监控和更新实践会危及关键的业务决策和结果。
减少这种摩擦一直是我们对 Domino 的愿景:一个通过改变团队的工作方式,而不是他们工作的内容来加速模型速度的平台。通过自动化最佳实践、创建更多的一致性和增加协作,Domino 就像一个飞轮,帮助数据科学团队更快地变得更好。
> 模型速度对于模型驱动的业务至关重要
> “作为全球第四大再保险公司,我们采用模型驱动的方法来帮助客户控制和管理风险,包括自然风险、气候风险、健康风险、地缘政治风险、网络风险以及许多其他风险。为此,我们实施了一个多云战略以及 Domino 的企业 MLOps 平台,以提高我们的模型速度,这样我们就可以用过去四分之一的时间来满足客户需求。”
>
> –SCOR 数据科学主管 Antoine Ly
## Domino 5.0 简介
今天,我们自豪地宣布 [**Domino 5.0**](/resources/introducing-domino-5.0) 的发布——这是我们公司历史上最具雄心和影响力的发布。Domino 5.0 引入了突破性的新功能,解决了数据科学生命周期中的核心摩擦点。
#### 自动缩放聚类
为了让数据科学家拥有更强大的计算能力,Domino 5.0 引入了 [**自动伸缩集群**](/blog/autoscaling-compute-clusters) 。只需几次点击,数据科学家就可以为最流行的分布式计算类型——Spark、Ray 和 Dask——构建弹性集群。这使得数据科学家能够测试更多的想法,并更快地开发更好的模型。Domino 5.0 的突破是能够监控数据科学工作负载,并动态增长和收缩计算集群,以优化利用率、降低成本和支持快速迭代。当结合我们上周宣布的与 NVIDIA AI Enterprise 的 [集成时,工作负载可以加快 100 倍或更多。](https://www.dominodatalab.com/blog/domino-validated-for-nvidia-ai-enterprise)
![Autoscaling Clusters](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/f3d4132016000f4e9412764ecdd37643.png)
#### 数据源
为了使对关键数据的访问民主化,Domino 5.0 中的[数据源](/blog/data-connectors)允许数据科学团队安全地共享和重用常见的数据访问模式。数据科学家浪费大量时间试图克服与安装驱动程序和特定库相关的 DevOps 障碍,只是为了访问他们需要的数据。Domino 5.0 简化了整个过程,允许他们更容易地创建新的数据源连接器并与同事共享,或者使用管理员共享的预建连接器——所有这一切都以直观、协作和高度安全的方式进行。
![Data Sources](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/108d29ff2026ad7304a3bda646fd1a94.png)
#### 集成监控和自动化洞察
为了简化公司如何操作模型,Domino 5.0 引入了 [集成监控](/blog/integrated-model-monitoring) 和 [自动洞察](/blog/automated-model-insights) 。这种以前独立的 Domino 监控产品(Domino Model Monitor)的紧密集成允许客户极大地简化他们部署、监控和更新模型的工作流程。具体来说,Domino 5.0 将自动为 Domino 中构建的模型建立预测数据捕获管道和模型监控。新的自动化见解有助于数据科学家快速确定模型性能不如新模型时的根本原因,最有可能的原因是预测数据漂移或反馈到 Domino 的真实数据。有了这种洞察力,数据科学家可以根据市场、客户偏好等的变化,快速重构原始开发环境,以重新培训或重建模型。
![Integrated Monitoring](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e582cc18085f07b5f72511f6df362b00.png)
升级到 Domino 5.0 的 Domino 客户将立即有机会免费试用模型监控。这算不算升级的奖励?
## 结论
借助 Domino 5.0,公司获得了一个统一的平台,可以减少端到端数据科学生命周期中关键点的摩擦——释放模型速度以增加收入、改善客户体验并在竞争中胜出。在接下来的几周内,您将能够阅读关于 Domino 5.0 中许多创新的独立博客,演示视频将展示紧密集成核心数据科学功能对改善数据科学家工作方式的独特优势。
此外,如果您错过了我们的 [Domino 5.0 发布活动](https://go.dominodatalab.com/unleashing-exceptional-performance),Atul Gawande(著名外科医生、作家和性能改进专家)和 Najat Khan 博士(首席数据科学官和强生让桑制药公司&强生研发战略&全球负责人和强生数据科学委员会&联***)将出席,您可以在此观看重播[。](https://go.dominodatalab.com/unleashing-exceptional-performance)
[![Virtual Event Unleashing Exceptional Performance Hear from surgeon and author Atul Gawande, plus J&J's Chief Data Science Officer Najat Khan, on lessons for driving continuous improvement when it matters most. Watch on demand](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/e9c938f2dd70fb85700f6089cd74b3c7.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/865073e9-e27c-4a25-b7a7-1136f75553a7)
# 用于数据科学和机器学习的 MATLAB
> 原文:<https://www.dominodatalab.com/blog/why-choose-matlab-for-data-science-and-machine-learning>
使用数据解决问题的机会比以往任何时候都多,随着不同行业采用这些方法,可用的数据一直在稳步增加,工具的数量也在增加。新数据科学家提出的一个典型问题与学习最佳编程语言有关,要么是为了更好地理解编码,要么是为了让他们的技能经得起未来考验。通常,这个问题围绕一些常见的疑点展开,比如 [R 和 Python](/r-vs-python-data-science) 。也有人问我 Java 和[的问题,我在其他地方提供了这个问题的答案](https://jrogel.com/programming-first-steps-java-or-python/)。实际上,可能没有单一的最佳工具可以使用,我一直主张在数据科学实践中使用工具箱方法。我想推荐其中一个工具:MATLAB。
## MATLAB 是什么?
MATLAB 于 20 世纪 80 年代中期首次出现在商业领域,它对专家工具箱的使用已经成为这种语言和生态系统的一个定义性特征。许多工程和科学课程已经接受 MATLAB 作为教学工具。因此,它被许多领域的科学家和工程师广泛使用,为数据分析、可视化等提供了出色的功能。
MATLAB 是一个高级技术计算环境,它在一个地方集成了计算、可视化和开发。它的交互式环境可作为开发、设计和使用应用程序的平台,其优势在于拥有各种数学函数,如统计、线性代数、傅立叶分析和优化算法等。
MATLAB 提供了有用的开发工具,可以改进代码维护和性能,以及与 Fortran、C/C++等其他编程语言的集成。NET,或者 Java。这就是我写 [Essential MATLAB 和 Octave](https://jrogel.com/essential-matlab-and-octave-video/) 的一些原因,这本书介绍了我自己的物理、数学和工程学生用 MATLAB 解决计算问题。
今天,MATLAB 是一种广泛使用的编程语言,许多行业都信任它,当用户试图将机器学习技术集成到他们的应用程序中时,它可以从中受益。
## 数据科学为什么要选择 MATLAB?
在数据科学和机器学习领域,MATLAB 可能不是首先想到的编程环境之一。部分原因可能是因为 Python、R 和 Scala 等语言吸引了人们的注意力;也可能是因为作为一种专有语言有时被视为一种障碍。然而,我认为,在许多行业和应用中,如航空航天、军事、医疗或金融,拥有一套受支持和外部验证的工具是一种优势,有多年的发展和商业成功作为后盾。
从技术角度来看,数据科学家和机器学习从业者需要一种语言,使他们能够操纵适合向量或矩阵运算的对象。一种编程语言,其名称实际上是“矩阵实验室”的缩写,它保证矩阵是表达所需计算操作的自然方式,其语法接近原始的线性代数符号。换句话说,对于 MATLAB 来说,基本的运算对象是一个矩阵元素。这样,例如整数可以被认为是 1×1 矩阵。这意味着为向量或矩阵构建的各种数学算法从一开始就内置到 MATLAB 中:叉积和点积、行列式、逆矩阵等。是天生可用的。反过来,这意味着机器学习技术需要的许多实现工作在 MATLAB 中变得更加容易。例如,考虑自然语言处理中语料库的表示:我们需要大型矩阵来表示文档。例如,矩阵的列可以表示文档中的单词,行可以是我们语料库中的句子、页面或文档。在机器视觉的情况下,将图像表示为矩阵并不罕见,MATLAB 提供了对这类对象的操作。
此外,MATLAB 中可用的工具箱数量使得创建结构化数据管道变得很容易,不需要我们担心兼容性问题,所有这些都是在相同的计算环境中完成的。一些工具箱已经成为语言的一部分很长时间了,例如[符号数学](https://uk.mathworks.com/products/symbolic.html)、[优化](https://uk.mathworks.com/products/optimization.html)和[曲线拟合](https://uk.mathworks.com/products/curvefitting.html?s_tid=srchtitle_curve%20fitting_1)工具箱,但是新的工具箱,例如[文本分析](https://uk.mathworks.com/products/text-analytics.html)、[统计和机器学习](https://uk.mathworks.com/products/statistics.html?s_tid=srchtitle_Statistics_1)以及[深度学习](https://uk.mathworks.com/solutions/deep-learning.html?s_tid=srchtitle_deep%20learning_1)工具箱正在将 MATLAB 重新放回游戏中。
MATLAB 强大的工程资质意味着有现成的机制可以直接从电路板、测量仪器和成像设备等硬件获取数据。这些功能,加上模拟工具,如 [SIMULINK,](https://www.mathworks.com/products/simulink.html)使得在一个有凝聚力的环境中使用机器学习技术变得不可抗拒。以防你从未听说过 SIMULINK,它是一个用于动态系统建模的交互式图形环境。它让用户创建虚拟原型,这些原型可以作为数字双胞胎,在飞行中尝试事物或分析假设情景。
让我们将 MATLAB 的使用映射到典型的数据科学工作流程,看看它如何为我们提供支持:
* 数据访问和探索——MATLAB 允许我们接收各种数据格式,包括文本文件、电子表格和 MATLAB 文件,还包括图像、音频、视频、XML 或拼花格式的数据。正如我们上面提到的,直接从硬件读取数据也是可能的。由于提供的交互式 IDE 和生态系统的数据可视化功能,可以实现数据探索。
* 数据预处理和清理-作为数据探索的自然下一步,MATLAB 使得使用实时编辑器清理异常值以及查找、填充或删除丢失的数据、删除趋势或规范化属性变得容易。MATLAB 还为用户提供特定领域的图像、视频和音频预处理工具。这意味着我们可以在训练 [MATLAB 的 Deep Network Designer 应用程序](https://uk.mathworks.com/help/deeplearning/ug/build-networks-with-deep-network-designer.html)之前对我们的数据应用合适的步骤,以构建复杂的网络架构或修改已训练的网络以进行迁移学习。
* 预测建模-工具箱可用于实现逻辑回归、分类树或支持向量机,以及专用的深度学习工具,用于在图像、时间序列和文本数据上实现卷积神经网络(ConvNets,CNN)和长短期记忆(LSTM)网络。
## 用 MATLAB 进行更多的机器学习
你的 MATLAB 之旅可能始于一台台式电脑,作为你工程或科学课程的一部分。今天,MATLAB 在专用的云资源中可用,例如在[Domino Enterprise MLOps Platform](https://www.dominodatalab.com/product/domino-enterprise-mlops-platform)中,您的模型可以在合适的 GPU 上训练。这种情况已经持续了一段时间,在[之前的博客文章](https://blog.dominodatalab.com/simple-parallelization)中,我们研究了 Domino 平台支持的一些更流行的语言中的代码并行化。
使用 MATLAB 实现数据科学和机器学习模型的可能性是无限的:从模型比较、用于特性和模型选择的 AutoML 以及超参数调整或扩展专用集群处理的能力,到用 C++等语言生成适合高性能计算的代码,以及与 SIMULINK 等仿真平台的集成。
借助深度学习工具箱等工具,MATLAB 不仅可以为深度神经网络的训练和部署(包括网络架构的设计)奠定坚实的基础,还可以为图像、视频和音频格式等数据的准备和标记提供支持。MATLAB 还使我们能够在同一环境中使用 PyTorch 或 TensorFlow 等框架。
## 摘要
数据科学家可以使用几个很棒的工具。尽管像 R 和 Python 这样的语言引人注目,但在 MATLAB 中训练的工程师、科学家、计量经济学家和金融工程师可以继续使用这个丰富而强大的生态系统提供的功能。随着 Mathworks 向其用户提供的持续支持和开发,以及与 Domino 的合作关系,MATLAB 将继续在数据科学和机器学习领域发展。
[![Video Demo MATLAB with Domino Video Demo This video will show how MATLAB and the Domino platform work together to help researchers and data scientists be more productive Watch the demo](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/35e8f5529200d691d24f055f32c7b0c9.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/fe952271-aa70-48ef-87c9-f1432053f854)
# 为什么混合云是扩展企业数据科学的下一个前沿
> 原文:<https://www.dominodatalab.com/blog/why-hybrid-cloud-is-the-next-frontier-for-scaling-enterprise-data-science>
在企业数据科学领域,一个令人振奋的新趋势正在兴起,它正在打破内部环境和云环境之间的孤岛,以释放各自的优势,同时改善协作和法规遵从性。先进的、模型驱动的公司——特别是那些在机器学习和人工智能方面超越竞争对手的公司——正在采用 *混合云* 战略来实施他们的数据科学计划。最先进的甚至是 *将数据科学工作负载* 调回内部,同时利用多个云环境的灵活性。
这样,数据科学作为一个整体向前迈出了进化的一步。它还沿着计算、存储和数据平台已经走过的道路,从内部部署战略向云以及现在的*混合战略跳跃。*这一趋势如此明显,以至于在最近对人工智能基础设施决策者的 [Forrester 调查](https://www.nvidia.com/en-us/lp/data-center/forrester-challenge-of-ai-infrastructure/) 中,91%的人表示他们将在两年内投资混合云,66%的人表示他们已经投资了人工智能工作负载的混合支持。
这是一个似乎奏效的策略。在同一项调查中,在数据科学生命周期的每个阶段(从数据准备到部署和监控),投资混合云的企业比专注于云的企业面临的挑战更少。
## 混合策略与“坚持混合策略”
将混合云战略与困扰许多组织的现状区分开来非常重要,这些组织受困于一系列分散在内部位置(有时是几个云服务提供商)的孤岛环境。从技术上来说,两者都是混合云,因为它们在内部和至少一个其他云环境中运行工作负载。然而,相似之处仅此而已。
如今,大多数大型组织都“受困于混合模式”由于零碎的现代化工作、法规、收购、影子 IT 和缺乏协调的战略,他们最终拥有多个环境,而这些环境之间几乎没有集成。数据是孤立的,工具受到限制,同时某些领域的利用率很低,而其他领域的容量不足。这种情况扼杀了合作、创新和效率。
相比之下,新一代混合云组织正在打破环境之间的孤岛,以运行基于成本、性能和监管考虑最有意义的数据科学工作负载。他们正在实施策略,以利用不同环境的优势并避免其劣势,从而提供治理和运营效率所需的整体情况,并促进跨团队的访问和协作。
## 混合云成功应对四大关键数据科学挑战
在与数据科学领导者的交谈中,他们指出了促使他们采纳明确专注于混合云的战略的四个关键因素。按重要性排序,它们是:
* **数据本地化和主权:** [Gartner](https://www.gartner.com/en/newsroom/press-releases/2020-09-14-gartner-says-by-2023--65--of-the-world-s-population-w) 预测,全球 65%的人口的个人数据将受到新隐私法规的保护,而 [Forrester](https://www.forrester.com/blogs/predictions-2022-cloud-computing-reloaded/) 则预测将迎来一个“云民族主义”的新时代事实上,许多国家已经制定了数据隐私法,要求在本地处理客户数据。混合云支持数据局部性,即您可以将模型训练和推理推送到数据所在的位置,无论是在区域云实例中还是在本地数据中心。除了法规遵从性之外,这还有助于满足特定工作负载的性能要求,例如延迟,并使您能够在您选择的云供应商没有运营的地区利用数据科学。例如,谷歌在中国没有业务。
* **成本:**当一家公司希望将数据科学应用于组织中更多部门的更多用例时,基础架构的成本就会增加。最终,它成为增长和创新的主要障碍,特别是在涉及深度学习模型(例如,计算机视觉或 NLP 任务的模型)时。混合云使您能够将这些工作负载从云中转移出来,以利用本地硬件的成本优势,从而显著降低总拥有成本。云供应商对人工智能优化的硬件收取非常高的溢价,即使计算价格下降,也没有什么迹象表明这些加价会消失。
* **灵活性:**即使按照已经不稳定的应用程序工作负载的标准,数据科学工作负载需求也会大幅波动。根据数据量、模型类型和超参数优化的程度,以及项目时间、数据科学家的工作时间表和数据变化等反复无常的因素,模型培训工作可能会有很大的不同。混合云使您能够从内部“爆发”,根据需要利用云中的快速纵向扩展(更强大的实例)和横向扩展(更大的集群)能力。
* **锁定:**As[Gartner](https://www.itpro.co.uk/cloud/cloud-storage/361389/cloud-freedom-avoiding-vendor-lock-in)副总裁兼分析师迈克尔·瓦里洛(Michael Warrilow)曾说过:“大多数组织出于避免厂商锁定或利用同类最佳解决方案的愿望而采用了云计算战略。”混合云更是如此。随着公司开始越来越依赖云,他们也开始担心这些供应商对其业务的控制。在最极端的情况下,云供应商甚至可以成为竞争对手。出于这个原因,零售商避免使用 AWS,但每当亚马逊决定进入其垂直行业时,金融服务、保险和医疗保健将需要找到替代方案。混合云为公司提供了一条通往内部云或其他云的退路,并帮助公司在云供应商之间进行对冲。
## 首个企业混合云数据科学平台
混合云方法有许多优势,并认识到公司面临的内部系统和法规的现实。然而,为了充分利用 hybrid,公司必须摆脱目前的手动流程和互不连接的平台。
借助一个真正的混合平台,数据科学团队可以更好地协作并提高工作效率,该平台使他们能够在公司运营的每个环境中以安全、受监管的方式访问数据、计算资源和代码。另一种选择是螺旋上升的成本、浪费的精力、次优的模型和更高的风险。
不幸的是,还没有混合云平台可以支持整个企业的所有数据科学团队。无论是云供应商,还是专注于云的数据科学平台,都没有进行任何有意义的投资来创建它们,因为这样做不可避免地违背了他们自己的利益。其他公司仅提供支持一小部分数据科学家的单点解决方案。
然而,那就是变化, [从今天开始](/nexus) 。Domino 与其合作伙伴 NVIDIA 一起宣布推出 Nexus,这是首个面向企业级数据科学的混合云平台。它为跨企业所有区域和环境的数据科学提供了单一平台,无论这些区域和环境是内部的、云环境还是多云环境。核心特性是:
* **一键访问。** Nexus 允许您在内部或不同的云平台上启动新的作业和工作区,并允许您根据成本和性能要求选择硬件层。
* **统一数据访问控制。**通过 Nexus,您可以指定哪些环境可以访问特定的数据集。因此,它允许您按地区限制对数据的访问,帮助您强制遵守数据本地化和主权法规。
Nexus 的测试版将在未来几个月内推出,明年年初正式上市。如果您想实施面向数据科学的下一代混合云平台, [联系](mailto:nexus@dominodatalab.com) 与我们合作构建。
# 我为什么加入多米诺
> 原文:<https://www.dominodatalab.com/blog/why-i-joined-domino>
By Kayla Cytron-Thaler, Enterprise Business Development, Domino on June 04, 2020 in [Perspective](/blog/perspective/)
*这最初是作为 [LinkedIn 文章](https://www.linkedin.com/pulse/why-i-joined-domino-kayla-cytron-thaler/)发布的。感谢凯拉允许我们在这里联合发行。*
![](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/6dc186a94c38d9da89c3451ada1a4acb.png)
加入 Domino 数据实验室是我职业道路上的一个重要里程碑。我认为分享一下我为什么决定加入这个团队是很有价值的。以下是我在做出这一举动之前考虑的事项。
### **公司**
* 为一家有所作为并能解决世界上最重要挑战的公司工作是很重要的。达美乐正通过与像百时美施贵宝这样的公司合作来加速他们对抗癌症的进程,并与国家奥杜邦协会合作来协助保护工作。
* 我想为一家在市场上做一些与众不同、与众不同的事情的公司工作,这一点在看了我们的首席执行官 Nick Elprin 的[“模型驱动的商业时代”](https://www.youtube.com/watch?v=0BPysrFhdvk)之后变得尤为明显。
### **员工**
* 我很重视为一家员工体贴、勤奋、热情的公司工作。加入这样一个组织是很重要的,在这个组织中,每个人都会尽自己的职责并提供帮助,即使这个任务不在他们的“工作描述”中。这在我的招聘/面试过程中很明显。
* 我有机会成为新团队的一员,帮助建立流程。我能够运用我在 Looker 学到的所有知识,并使之更上一层楼。此外,我的团队由我一直最喜欢的经理[莱恩·安德森](https://www.linkedin.com/in/ryananderson111/)领导。我在 Looker 的 Ryan 团队中工作,当他加入 Domino 时,我受到了启发,开始追随他。
* 对我来说,加入一家我知道我的贡献受到重视并有所作为的公司非常重要。
* 我们的总裁娜塔莉·麦卡洛是一位无畏的领袖。她是我崇拜并渴望成为的人。
### **个人成长机会**
* 我一直在商业智能领域工作,我想要一个新的挑战。在 BI 行业工作让我从整体上对数据有了很好的理解,但数据科学是一个完全不同的领域。我非常喜欢我正在学习的一切——从 Docker 容器到 Kubernetes,从数据科学工具到数据科学工作流。
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Fwhy-i-joined-domino%2F&title=Why%20I%20joined%20Domino)
# 为什么 Kubernetes 非常适合数据科学工作负载
> 原文:<https://www.dominodatalab.com/blog/why-kubernetes-is-great-for-data-science-workloads>
Kubernetes 是一个开源容器编排系统,随着 IT 部门转向容器化应用程序和微服务,它正迅速成为必不可少的工具。正如 Kubernetes 在处理一般 IT 工作负载时一样强大,Kubernetes 还提供了支持突发数据科学工作负载的独特优势。在容器的帮助下,数据科学家可以使他们的建模可移植和可复制,并大规模扩展这些相同的容器化的机器学习模型。
## Kubernetes:计算的新基础
在过去的几年里,容器化应用程序在企业计算和数据科学领域变得非常流行。Docker 不仅实现了强大的新 DevOps 流程,还优雅地解决了环境管理的问题。
容器需要被管理并连接到外部世界,以执行调度、负载平衡和分发等任务。Kubernetes(又名 K8s)的开发是为了管理在生产环境中运行的多个容器和主机的复杂架构。它提供了将容器调度到计算集群所需的流程编排,并管理工作负载以确保它们按预期运行。Kubernetes 帮助您管理一组机器上的容器化应用程序(例如 Docker 上的应用程序)。K8s 就像是数据中心的操作系统,抽象出 API 背后的底层硬件:
![Kubernetes diagram outlining the relationship between developer and container](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/cc1289b1a62fbde3e3a2957fda80e071.png)
*来源:[阿蛮功](https://gruntwork.io/static/guides/kubernetes/how-to-deploy-production-grade-kubernetes-cluster-aws/#what-is-kubernetes)*
Kubernetes 也正在成为云的平台基础设施层。在 K8s 之前,当您必须部署多个虚拟机(VM)时,您可能会有任意的负载平衡器、网络、不同的操作系统等等。即使在一个云服务中,也有如此多的变化,以至于你不能把一个分布式应用程序变成真正可移植的。另一方面,Kubernetes 可以作为一个持续可编程的基础设施。Kubernetes 使网络、负载平衡、资源管理和更多部署考虑保持一致。
## 在企业 IT 环境中广受欢迎
在 IT 专业人士中,Kubernetes 正在成为基础设施面向未来的共识 API。根据[云原生计算基金会](https://www.cncf.io/blog/2018/03/06/kubernetes-first-cncf-project-graduate/)的数据,K8s 现在是全球第二大开源项目,仅次于 Linux。在最近 451 Research/StackRox 对 400 多名 IT 专业人员的调查中,91%的人正在使用 Kubernetes,而两年前这一比例仅为 57 %:
![Pie chart outlining use of kubernetes for containers](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2740dac4171580cf6a464b4b62a07edd.png)
*来源:[斯塔克洛克斯](https://www.stackrox.com/kubernetes-adoption-security-and-market-share-for-containers/)*
## 非常适合数据科学工作负载
如果您还记得 Docker/containers 之前数据科学部门的要求,环境和包管理是繁重的。它必须频繁地安装新的软件包。代码对于不同的人会有不同的工作方式(或者有时根本没有),因为他们的环境是不同的。旧的项目变得不可用,旧的结果变得不可能重现,因为自代码编写以来环境已经发生了变化。Docker 巧妙地解决了这个问题,因为它的映像包含一组软件和配置文件,当分析代码运行时,这些文件应该在适当的位置。Docker 在包装和环境管理以及再现性方面提供了巨大帮助。
**效率和资源利用:** Kubernetes 为容器化应用带来了一系列全新的好处,包括效率和资源利用。K8s 允许数据科学家可扩展地访问 CPU 和 GPU,当计算需要大量活动时,这些 CPU 和 GPU 会自动增加,并在完成时缩减。这是一笔巨大的资产,尤其是在云环境中,成本是基于消耗的资源的。向上或向下扩展集群既快速又简单,因为只需在集群中添加或删除虚拟机即可。这种动态资源利用对数据科学工作负载尤其有利,因为在训练模型或工程功能时,对高性能 CPU、GPU 和 RAM 的需求可能会非常密集,但随后需求会很快再次下降。
Kubernetes 还有助于实现基础设施抽象,可以为数据科学家提供一个计算服务的抽象层,而无需担心底层基础设施。随着越来越多的团体希望利用机器学习来理解他们的数据,Kubernetes 让他们更容易访问他们需要的资源。
**云灵活性:**Kubernetes 对数据科学工作负载的另一个好处是,所有主要的云供应商(包括亚马逊、谷歌和微软)都提供托管服务,以提供构建在其灵活弹性的基础设施上的 Kubernetes 集群。这些供应商中的每一个都经常引入新的基础设施创新,比如新的更强大的 GPU 和 TPU、新的成本结构等等。由于 K8s 支持基础架构之间的应用程序可移植性和灵活性,因此它对云可移植性的支持以及围绕混合云和多云选项的承诺对于数据科学工作负载尤为重要。负责支持数据科学能力的 IT 领导者明白保持云灵活性非常重要。
## 为数据科学定制 Kubernetes
虽然 Kubernetes 为数据科学平台内的工具敏捷性、更快的迭代和可重复性提供了良好的基础,但在为数据科学家进行优化之前,还需要进行大量的定制。为数据科学定制 K8s 应满足以下特征:
* **可供数据科学家使用的接口:**K8s 的声明式 YAML 语法对于工程师和开发人员来说非常强大,但对于数据科学家来说却不是最直观的接口。数据科学家需要一个直观的界面和 API 来抽象 K8s 的一些概念。
* **容器化环境管理:**为了能够实现上述再现性,数据科学家需要能够创建、更新和管理将用于其工作的图像。K8s 需要被修改以允许构建容器映像。
* **集成用户管理和权限:** K8s 提供了一组授权原语,但这通常不足以为协同工作负载提供真正的用户隔离,以及管理敏感信息以使用工作负载的适当机制(例如,数据连接的访问凭证)。
* **特定于数据科学的调度:**仅靠 K8s 通常不足以正确调度数据科学中常用的复杂多 pod 工作负载。
* **资源控制:** K8s 需要扩展,以便管理员能够平衡用户对可扩展计算资源的访问,并提供足够的控制来管理成本和防止容量垄断。
当我们在 Kubernetes 上重建计算引擎时,我们自己完成了大部分定制工作。在这个过程中,我们还添加了高可用性、[水平可伸缩性](https://blog.dominodatalab.com/horizontal-scaling-parallel-experimentation)、企业安全性等等——所有这些都基于 Kubernetes 的可伸缩基础。
## 结论
如果您正在计划任何新的 IT 计划来支持您的数据科学工作负载/团队,Kubernetes 支持应该是一个重要的需求。凭借 Kubernetes 的快速增长、编排能力及其跨云和内部系统的互操作性,它提供了无与伦比的管理能力和可移植性。它确保您的系统可以与任何云供应商一起向前发展。它还能有效管理数据科学工作负载的突发性。
Domino 是第一个完全由 Kubernetes 提供的企业数据科学平台。这意味着您可以在任何云或内部基础设施上运行 Domino 工作负载。Domino 与您的 IT 战略和基础设施愿景非常一致,并且在您转向全云或混合本地和云部署时,它可以成为一个关键的推动者。使用 Kubernetes 上的 Domino,您可以让您的数据科学组织能够使用下一代工具和分布式计算框架。
有关 Kubernetes 的更多详细信息,以及为什么有远见的 IT 部门应该现在或在不久的将来采用它,请查看我们的新白皮书。
[![Kubernetes: The IT Standard for Data Science Workloads Download this paper today to learn how Kubernetes is becoming the platform infrastructure layer for the cloud. Download now](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/aab79db9c5bd99166f1586aa5980b9a9.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/4c6263b9-de06-42c0-9f9f-8a4379a27231)
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Fwhy-kubernetes-is-great-for-data-science-workloads%2F&title=Why%20Kubernetes%20is%20Great%20for%20Data%20Science%20Workloads)
# 为什么模型不能传递价值,你能做些什么
> 原文:<https://www.dominodatalab.com/blog/why-models-fail-to-deliver-value-and-what-you-can-do-about-it-1>
建立模型需要大量的时间和精力。数据科学家可能会花费数周时间试图找到、捕获数据并将其转换为模型的适当特征,更不用说许多周期的训练、调整和调整模型,以使它们具有高性能。
然而,尽管做了所有这些艰苦的工作,但很少有模型能够投入生产(VentureBeat AI 得出结论[只有 13%的数据科学项目能够投入生产](https://venturebeat.com/2019/07/19/why-do-87-of-data-science-projects-never-make-it-into-production/))并且在为业务提供价值方面, [Gartner 预测只有 20%的分析项目能够提供提高绩效的业务成果](https://blogs.gartner.com/andrew_white/2019/01/03/our-top-data-and-analytics-predicts-for-2019/)。
## 这是怎么回事?
数据科学项目失败率高并没有单一的原因。一些人可能会将问题归咎于数据科学专业人员不足或常见的管理瓶颈,如简化技术或基础设施的访问,或让模型投入生产。
当然,组织需要雇佣数据科学专家。这些专业人员需要得到[数据科学平台](/resources/field-guide/data-science-platforms/)和技术的支持,使他们能够做他们最擅长的事情,即探索、实验和解决业务挑战。例如,实施数据科学平台作为开发工作的记录系统,有助于明确开发模型并将其部署到生产状态的技术流程。
然而,除此之外,根据我们与各行业大型企业客户合作的经验,我们发现许多数据科学项目未能交付价值,因为在最高层面上,数据科学与业务根本没有联系。这带来了各种挑战:
1. 数据科学项目开始时没有业务支持,也没有关键的利益相关者在模型开发过程中充当领域专家。
2. 组织努力将业务挑战转化为可解决的数据科学问题。通常,数据科学团队强调寻找新的见解,而不是确定如何改进业务流程。这意味着许多项目陷入了无休止的研究和实验中。
3. 可用数据无法充分回答所提问题,或者由于缺乏跨应用程序的连接,从系统中提取数据的相关成本太高。
4. 数据科学和 IT 团队之间在如何将模型部署到生产中缺乏明确性。如果没有一个可行的、可重复的方法来部署模型代码,模型可能会被束之高阁,而商业机会也会错过。
5. 企业经常努力实现有效的变更管理,以采用和实现来自模型的发现。
## 增加你成功的几率
为了避免这些失误并确保项目有更高的成功机会,数据科学家应该通过回答三个关键问题来启动每个新项目:
1. 我们是否有一个清晰的通往价值之路的业务问题?
2. 这个问题对我们来说可行吗?
3. **企业能否根据数据科学见解做出必要的改变?**
需要注意的是,回答这些问题通常需要一个探索阶段,在这个阶段,数据科学家与业务利益相关者一起评估问题,描述可用的数据,并对他们解决问题的方法建立一个粗略的想法。
虽然这个初始阶段是至关重要的,但我们发现许多项目在这里停滞不前。一个好的经验法则是:
> 如果你不能在两到四周内与商业利益相关者一起回答这些问题,或者至少能够确定回答这些问题需要什么,那么成功的机会就会减少。
让我们更深入地探究每个问题。
## 我们有一个清晰的价值路径的业务问题吗?
数据科学通过提供基于证据的决策方法来创造价值。基于模型结果做出的决策最终应该**降低成本**或**增加收入**。
一开始,数据科学团队应该寻求明确定义业务问题以及与业务利益相关方一起创造价值的途径。一个简明的目标(*“我想通过优化我的商店员工名单来节省成本”*)比一个宽泛的陈述(*“我想增加我的零售店的收入”*)更有可能导致一个成功的计划。
问题陈述最终应该:
* 包括问题定义。
* 确定企业内成本或收入的驱动因素。
* 确定驱动因素中可变性来源。
* 确定衡量这种可变性的指标。
* 确定创造可量化价值的清晰路径。
让我们看一下优化商店员工人数的零售例子。
#### 问题定义:
* 我想在不牺牲顾客体验的情况下,通过优化商场的员工花名册来节省成本。
#### 成本/收入驱动因素:
* 降低员工成本。
#### 可变性的来源:
* 客户总数。
* 员工总数。
#### 现有指标:
* 基于时间序列的商场总顾客数的客流量(客流量)监控
* 历史人员编制名册
* 季节性/营销活动影响
#### 通向价值的清晰路径:
* 通过预测商店中的顾客数量,我们可以组织我们的员工花名册来**维持我们在高峰期**服务这些顾客的能力,同时**降低非高峰期**的员工成本。
通过这一过程,我们现在有了一个简明的业务问题,有了一个我们可以解决的清晰的价值路径。
## 这个问题对我们来说可行吗?
有许多不同的因素来评估问题陈述中确定的问题实际上是否可以解决。
这些因素包括:
* 我们有足够的可用数据吗?这些数据是否足够准确?如果数据的质量不够高,或者你不能得到一致的访问,项目很可能在到达时就夭折了。即使您有数据,如果您不理解数据的含义,或者没有主题专家来帮助您,那么所产生的任何见解都不会被很好地理解,从而转化为问题的可重复解决方案。
* 我们有生产这种模型的技术能力吗?
* 我们解决问题的方法中是否有业务支持?如果企业不愿意在数据科学团队解决问题时为他们提供资源,您的模型被采用和实施的可能性就会降低。通过模型的开发获得业务支持大大增加了部署后被接受的机会。
* 在部署模型时,是否存在任何可能成为关键故障点的潜在问题?例如,违反监管标准或公司价值观当然会破坏交易,同样不太明显的问题也是如此,例如以允许的方式使用客户数据,但可能会导致负面的公众看法和声誉损害。
## 企业能做出必要的改变吗?
模型采用是实现中的一个关键挑战。
您可能已经确定了企业可以省钱或增加收入的场景。尽管如此,如果公司没有通过变更管理项目实现任何一个场景,这个模型就没有意义。
在许多失败的项目中,一旦问题陈述被批准,主题专家和数据科学家之间的交流就停止了。
培养数据科学家和负责价值驱动因素的决策者之间的双向透明沟通至关重要。尽早分享见解,通常有助于业务理解他们需要采取的行动,以利用模型输出。
评估一个业务单元是否能够做出改变通常归结为与业务分析师和解决方案架构师一起工作,以了解他们的业务流程以及改变业务流程会产生的任何技术影响。
## 结论
数据科学通过创造基于证据的洞察力来改进行动和决策,从而改变了业务运营的方式。
提高[数据科学项目](/resources/field-guide/managing-data-science-projects/)的成功率需要数据科学团队和决策者之间的合作,以确保模型是适当的并且可以被采用。
通过在开发开始前对这些问题进行标准化,数据科学团队可以构建一种可重复的方法来识别潜在业务问题的价值驱动因素,在模型开发期间获得业务支持,并与业务部门合作以增加其模型结果被采用的机会。
[![The Practical Guide to Managing Data Science at Scale Lessons from the field on managing data science projects and portfolios Read the Guide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/4009b1665a905f8c4b32c9155ca0c9a7.png)](https://cta-redirect.hubspot.com/cta/redirect/6816846/4fa9500d-90e5-4182-8b71-3765859d1265)
[Twitter](/#twitter) [Facebook](/#facebook) [Gmail](/#google_gmail) [Share](https://www.addtoany.com/share#url=https%3A%2F%2Fwww.dominodatalab.com%2Fblog%2Fwhy-models-fail-to-deliver-value-and-what-you-can-do-about-it%2F&title=Why%20models%20fail%20to%20deliver%20value%20and%20what%20you%20can%20do%20about%20it)
# 为什么模型不能传递价值,你能做些什么。
> 原文:<https://www.dominodatalab.com/blog/why-models-fail-to-deliver-value-and-what-you-can-do-about-it>
建立模型需要大量的时间和精力。数据科学家可能会花费数周时间试图找到、捕获数据并将其转换为模型的适当特征,更不用说许多周期的训练、调整和调整模型,以使它们具有高性能。
然而,尽管进行了所有这些艰苦的工作,但很少有模型能够投入生产(VentureBeat AI 的结论是,只有 13%的数据科学项目能够投入生产),在为企业提供价值方面,Gartner 预测只有 20%的分析项目能够提供提高绩效的业务成果。
## 这是怎么回事?
数据科学项目失败率高并没有单一的原因。有些人可能会将问题归咎于数据科学专业人员不足或常见的管理瓶颈,如简化技术或基础设施的访问,或让模型投入生产。
当然,组织需要雇佣数据科学专家。这些专业人员需要数据科学平台和技术的支持,使他们能够做他们最擅长的事情,即探索、实验和解决业务挑战。例如,实施数据科学平台作为开发工作的记录系统,有助于明确开发模型并将其部署到生产状态的技术流程。
然而,除此之外,根据我们与各行业大型企业客户合作的经验,我们发现许多数据科学项目未能交付价值,因为在最高层面上,数据科学与业务根本没有联系。这带来了各种挑战:
数据科学项目开始时没有业务支持,也没有关键的利益相关者在模型开发过程中充当领域专家。
组织努力将业务挑战转化为可解决的数据科学问题。通常,数据科学团队强调寻找新的见解,而不是确定如何改进业务流程。这意味着许多项目陷入了无休止的研究和实验中。
可用数据无法充分回答所提问题,或者由于缺乏跨应用程序的连接,从系统中提取数据的相关成本太高。
在如何将模型部署到生产中,数据科学和 IT 团队之间缺乏明确性。如果没有一个可行的、可重复的方法来部署模型代码,模型可能会被束之高阁,而商业机会也会错过。
企业经常努力实现有效的变更管理,以采用和实现来自模型的发现。
## 增加你成功的几率
为了避免这些失误并确保项目有更高的成功机会,数据科学家应该通过回答三个关键问题来启动每个新项目:
我们有一个清晰的价值路径的业务问题吗?这个问题对我们来说可行吗?
企业能否根据数据科学见解做出必要的改变?
需要注意的是,回答这些问题通常需要一个探索阶段,在这个阶段,数据科学家与业务利益相关者一起评估问题,描述可用的数据,并对他们解决问题的方法建立一个粗略的想法。
虽然这个初始阶段是至关重要的,但我们发现许多项目在这里停滞不前。一个好的经验法则是:
如果你不能在两到四周内与商业利益相关者一起回答这些问题——或者至少能够确定回答这些问题需要什么——成功的可能性就会减少。
让我们更深入地探究每个问题。
### 我们有一个清晰的价值路径的业务问题吗?
数据科学通过提供基于证据的决策方法来创造价值。基于模型结果做出的决策最终会降低成本或增加收入。
一开始,数据科学团队应该寻求明确定义业务问题以及与业务利益相关方一起创造价值的途径。一个简明的目标(“我想通过优化我的商店员工花名册来节省成本”)比一个宽泛的陈述(“我想增加我的零售店的收入”)更有可能导致一个成功的计划。
问题陈述最终应该:
* 包括问题定义。
* 确定企业内成本或收入的驱动因素。
* 确定驱动因素中可变性来源。
* 确定衡量这种可变性的指标。
* 确定创造可量化价值的清晰路径。
让我们看一下优化商店员工人数的零售例子。
> **问题定义:**
>
> 我想在不牺牲顾客体验的情况下,通过优化商场的员工花名册来节省成本。
>
> **成本/收入驱动因素:**
>
> 降低员工成本。
>
> **可变性来源:**
>
> 客户总数。
> 员工总数。
>
> **现有指标:**
>
> 根据时间序列
> 历史员工花名册
> 季节性/营销活动影响,监控店内顾客总数
>
> **清除值路径:**
>
> 通过预测商店中的顾客数量,我们可以组织我们的员工花名册,以维持我们在高峰期服务这些顾客的能力,同时降低非高峰期的员工成本。
通过这一过程,我们现在有了一个简明的业务问题,有了一个我们可以解决的清晰的价值路径。
### 这个问题对我们来说可行吗?
有许多不同的因素来评估问题陈述中确定的问题实际上是否可以解决。
这些因素包括:
* 我们有足够的可用数据吗?它是否足够准确?
* 如果数据的质量不够高,或者您不能获得对它的一致访问,那么项目很可能在到达时就夭折了。即使您有数据,如果您不理解数据的含义,或者没有主题专家来帮助您,那么产生的任何见解都不会被很好地理解,从而转化为问题的可重复解决方案。
* 我们有生产这种模型的技术能力吗?
* 在我们解决问题的方法中,我们有业务支持吗?
* 如果企业不愿意在数据科学团队解决问题时为他们提供资源,您的模型被采用和实现的可能性就会降低。通过模型的开发获得业务支持大大增加了部署后被接受的机会。
* 在部署模型的过程中,是否存在任何可能成为关键故障点的潜在问题?
* 例如,与监管标准或公司价值观发生冲突当然会破坏交易,同样不太明显的问题也是如此,例如以允许的方式使用客户数据,但可能会导致负面的公众看法和声誉损害。
### 企业能做出必要的改变吗?
模型采用是实现中的一个关键挑战。
您可能已经确定了企业可以省钱或增加收入的场景。尽管如此,如果公司没有通过变更管理项目实现任何一个场景,这个模型就没有意义。
在许多失败的项目中,一旦问题陈述被批准,主题专家和数据科学家之间的交流就停止了。
培养数据科学家和负责价值驱动因素的决策者之间的双向透明沟通至关重要。尽早分享见解,通常有助于业务理解他们需要采取的行动,以利用模型输出。
评估一个业务单元是否能够做出改变通常归结为与业务分析师和解决方案架构师一起工作,以了解他们的业务流程以及改变业务流程会产生的任何技术影响。
## 结论
数据科学通过创造基于证据的洞察力来改进行动和决策,从而改变了业务运营的方式。
提高数据科学项目的成功率需要数据科学团队和决策者之间的合作,以确保模型是适当的并且可以被采用。
通过在开发开始前对这些问题进行标准化,数据科学团队可以构建一种可重复的方法来识别潜在业务问题的价值驱动因素,在模型开发期间获得业务支持,并与业务部门合作以增加其模型结果被采用的机会。
# 为什么模型将主宰世界
> 原文:<https://www.dominodatalab.com/blog/why-models-will-run-the-world>
多米诺建立在几个核心信念之上:
1. 未来几十年,模型将成为世界上最成功企业的核心,而
2. 公司需要新的组织能力来管理它们(就像他们管理资本、人员和技术一样)。
今年早些时候,Domino 的联合创始人兼首席执行官 Nick Elprin 展示了他对这些组织能力的愿景,描述了一种叫做模型管理的新学科。 [模型管理](https://www.dominodatalab.com/model-management/) 描述了一种新的技术和过程类别,帮助组织一致且安全地开发、验证、交付和监控模型,以创造竞争优势。
最近,我在《华尔街日报》上与人合著了一篇文章,题为“ [为什么模特会主宰世界](https://www.wsj.com/articles/models-will-run-the-world-1534716720) ”这篇文章涵盖了模型驱动业务的兴起、重要性和含义。
达美乐在此特别感谢作者允许转贴整篇文章。
马克·安德森的文章“为什么软件正在吞噬世界”发表在 2011 年 8 月 20 日的报纸上。安德森的分析是有先见之明的。他指出的公司——网飞、亚马逊、Spotify——确实蚕食了他们的产业。较新的软件公司——滴滴、Airbnb、Stripe——也参与进来。
今天,大多数行业领先的公司都是软件公司,并不是所有的公司都是这样开始的。例如,Aptiv 和 Domino's Pizza 是其所在行业的长期领导者,它们采用软件来保持或扩大其竞争优势。
创新公司的投资者现在在问接下来会发生什么。我们相信一个新的、更强大的商业模式已经从它的软件前身发展而来。这些公司构建其业务流程,将基于“闭环”数据的持续学习模型置于其工作的中心。当构建正确时,他们会创建一个强化循环:他们的产品变得更好,允许他们收集更多数据,这允许他们建立更好的模型,使他们的产品更好,并继续前进。这些都是模型驱动的业务。它们是由各行各业的在职者和初创者创造的。
> 如果软件吃掉了世界,模型将会管理它。
关于人工智能和大数据的炒作并不缺乏,但模型是这些工具背后真正力量的来源。模型是一个决策框架,其中的逻辑是通过算法从数据中导出的,而不是由开发人员显式编程或通过人的直觉隐式传达的。输出是一个可以做出决定的预测。一旦被创建,一个模型可以从它的成功和失败中学习,其速度和复杂程度是人类通常无法比拟的。
然后,模型驱动的业务使用模型来驱动其业务流程中的关键决策,从而创造收入流或成本效率。构建这个系统需要一个收集数据的机制(通常是基于软件的),从数据、模型本身创建模型的过程,以及一个交付或执行来自这些模型的建议的机制(通常也是基于软件的)。
模型驱动的业务超越了数据驱动的业务。数据驱动的企业收集和分析数据,以帮助人类做出更好的商业决策。模型驱动的业务创建一个围绕定义业务的持续改进的模型构建的系统。在数据驱动的业务中,数据帮助业务;在模型驱动的业务中,模型就是业务。
中国社交媒体巨头和微信制造商腾讯是我们最喜欢的这种新商业模式的例子之一。一位腾讯高管去年秋天告诉我们:“我们是唯一一家拥有社交媒体、支付、游戏、消息、媒体和音乐等客户数据的公司,我们拥有(数亿)人的这些信息。我们的战略是将这些数据交给数千名数据科学家,他们可以利用这些数据来改进我们的产品,并在我们的平台上更好地投放广告。”这种独特的数据集为不断改善用户体验和提高盈利能力的模型工厂提供动力,从而吸引更多用户,进一步改善模型和盈利能力。这是一个模型驱动的业务。
网飞用软件打败了百视达;它用自己的模式战胜了有线电视公司和内容提供商。它的推荐模式很有名,估计每年的收入超过 10 亿美元,推动了 80%的内容消费。每当顾客接受或拒绝一项建议,网飞的算法就会改进。该公司目前的战斗是对抗 Hulu、苹果和迪士尼。谁会赢?谁最有能力构建模型并将其集成到业务中。谁能收集最好的客户数据,谁能招募最好的数据科学家,谁能建立最好的预测引擎?
亚马逊用软件将自己与 Borders 和 Toys“R”Us 等实体竞争对手区分开来,但它的模式帮助它拉开了与 Overstock.com 等其他电子商务公司的距离。到 2013 年,估计 35%的收入来自亚马逊的产品推荐。这些模型从未停止改进。杰夫·贝索斯在 2016 年的股东信中描述了亚马逊使用机器学习模型的无数方式,从 Prime Air 无人机等高度可见的举措到产品植入、欺诈检测和翻译等潜在应用。最近对 Whole Foods 和 PillPack 的收购将把亚马逊的模式驱动力带到新的行业。
持怀疑态度的人可能会说,这些例子只不过是过去十年中不断获胜的公司。但是,我们所描述的转变正在一系列行业中形成,包括许多通常被描述为传统的行业。这里有三个例子:
* *农业。*人类的第一产业越来越多地使用模型来提高农作物产量。气候公司(The Climate Corp .)早期的重点是利用模型为农民提供农作物保险。2013 年,拜耳以 11 亿美元收购了 TCC,并将其重点扩展到模型驱动的农业领域——鉴于拜耳与农场的深度整合及其数据资产。为了生产更具弹性的作物,拜耳的模型根据历史产量、天气数据、配备 GPS 和其他传感器的拖拉机以及从卫星图像收集的田间数据来预测农民的最佳种植地点,卫星图像估计降雨将汇集在哪里以及土壤化学的细微变化。
* *物流。*电子商务的快速发展带来了新的挑战。典型的履行中心让人工拣货员每天步行 15 英里穿过仓库来收集订单。为了解决这个问题,inVia Robotics 制造了能够自主导航仓库的机器人,并从货架上拉下搬运箱,将其运送到固定的人类拣选机。该方法是模型驱动的;inVia 使用考虑物品受欢迎程度和关联概率(例如,将太阳镜放在防晒霜附近)的模型来自动调整仓库布局,并最小化机器人必须行驶的英里数。每一个订单都为先前的预测提供了反馈,并提高了整个系统的生产率。
* *服务。*在这个劳动密集型行业,提高生产率总是很困难,但模型驱动的方法可能会改变这种情况。以翻译服务为例。公司每年花费 200 多亿美元将从目录到服务条款的一切翻译成数百种语言。虽然谷歌翻译对日常消费者来说很好,但企业通常需要人工翻译的更复杂的技能。总部位于旧金山的初创公司 Lilt 正在开发一款软件,旨在通过在翻译过程中插入一个模型,使翻译效率提高五倍。使用 Lilt 软件的翻译人员不再只从原文开始工作,而是从模型中得到一组建议,他们根据需要对这些建议进行改进。该模型总是从翻译人员所做的更改中学习,同时使所有其他翻译人员在未来的项目中更加高效。
模型驱动型企业的崛起意义深远。从业务角度来看,我们看到了五个关键点:
首先,对企业的估值将越来越基于它们创造的数据的完整性,而不仅仅是数量。为什么腾讯和亚马逊能够成功?不仅仅是因为他们数据的广度——知道谁是他们的客户;他们在访问之前、之后和期间去了哪里;他们一路上看到的一切,而且数据是“闭环”对于模型提出的每一个建议,用户的反应——例如,购买或不购买——都会被捕获并用于改进模型。通过闭环数据,公司知道输入和输出、预测和最终结果。相比之下,数据集不完整的企业只能依靠人类的直觉来开发假设和解释结果,这限制了他们前进的速度和范围。鉴于数据在构建模型驱动的业务中的基础性作用,那些能够创建闭环数据的业务将更有价值。
第二,目标是一个飞轮,或者说良性循环。腾讯、亚马逊和网飞都展示了这一特征:模型改进了产品,产品被更多地使用,这些新数据更加改进了产品。这创造了一个近乎无摩擦的持续改进过程,自我激励,而不是被人类的判断和进步所驱动。对许多高管来说,真正可怕的是——正如贝佐斯在致股东信中所描述的那样——许多模式驱动的改进都是在更高效的运营和改进的决策的表象之下发生的。
第三,相对于他们在软件时代的战斗中的角色,现任者将是这场战斗中更强有力的竞争者。这一次,他们有一个有意义的优势,因为他们通常拥有大量数据,而初创公司通常没有。在职者将有机会用自己的数据创建模型,并向他人出售他们的数据。初创公司必须更加聪明地获取数据,事实上,可能必须收购现有公司。
第四,正如公司已经建立了深厚的组织能力来管理技术、人员和资本,同样的事情现在也将发生在模型上。随着软件时代的到来,各地的公司雇佣首席技术官,组建工程师团队,设计敏捷等流程,以系统化、工业化的方式向业务交付软件。希望变得更加模型驱动的公司将需要创建一个新的模型管理学科——开发、验证、交付和监控创建关键竞争优势的模型所需的人员、流程和技术。
第五,企业将面临新的道德和合规挑战。随着数据变得越来越全面和重要,消费者对其使用和滥用的担忧也相应增加。脸书的市值在 7 月底下降了 1200 亿美元,部分原因是投资者在面临越来越多的监管和剑桥分析公司丑闻的反弹时,越来越担心该公司的数据资产。
像这样的例子会越来越多。模型本身会引发更复杂的问题。当一个模型在做一个高影响力的决策时,比如诊断一种疾病,提供一笔贷款,或者录取一个学生上大学,我们必须将模型保持在什么样的准确度标准?公平、问责和透明度问题既是哲学问题,也是商业问题,因为犯了错误的公司将失去客户的信任,并承担重大责任。
软件继续蚕食世界,但昨天的优势是今天的赌注。在寻找竞争优势的过程中,模型驱动的公司将会加速远离人群,因为软件已经变得无处不在。正如安德森先生预测的那样,在过去的七年里,软件是一个赚钱的好地方。在接下来的七年里,我们的赌注是模型驱动的业务。
> 科恩是 Point72 LP 的创始人、董事长兼首席执行官,该公司旗下包括 Point72 资产管理公司和 Point72 风险投资公司。格兰纳德是 Point72 Ventures 的管理合伙人,也是 Point72 Asset Management 的首席市场情报官。2013 年,他联合创立了多米诺数据实验室。Point72 资产管理公司对本文中提到的所有上市公司进行长期和短期投资,作者通过 Point72 Ventures 直接拥有 inVia Robotics 的所有权。
# 来自网飞机器学习的智慧
> 原文:<https://www.dominodatalab.com/blog/wisdom-from-machine-learning-at-netflix>
在五月份的 [Data By The Bay](http://data.bythebay.io/) 上,我们看到了网飞的 Justin Basilico 的精彩演讲:[关于构建机器学习软件的建议](http://www.slideshare.net/justinbasilico/recommendations-for-building-machine-learning-software-62448865)。Justin 描述了一些有效开发机器学习算法并将其集成到软件产品中的原则。
我们发现自己点头表示同意,我们希望根据我们与其他组织的数据科学团队合作的经验,总结一下他的一些观点,这些观点引起了我们最强烈的共鸣。
### 机器学习是迭代的(幻灯片 15-17)
![iterative](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/76832cf1b1883cdc53bb9aafe4ba9f4f.png)
Justin 强调“开发模型是迭代的”,实验是重要的。他还建议“避免双重实现”,这样一旦模型建立起来,就可以很容易地在生产中使用,而不需要重新实现。
Domino 支持在同一个平台上进行实验和生产,因此您可以迭代地开发您的模型,并且只需点击一下鼠标就可以部署它们——而不用担心翻译您的代码或者在不同的基础设施上配置一组匹配的包。
我们有两个短片强调 Domino 如何支持快速迭代实验,并让您将模型部署为 API 以避免双重实现。
### 在分发算法之前最大化单台机器(幻灯片 26)
![hardware-slide](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/2c853643ce0111f661454f89b7f65fe9.png)
Justin 建议避免“分布式的诱惑”,尽可能在一台机器上做更多的事情。分布式系统很难——更难安装和使用,也更不可靠!我们完全同意。无论如何,如果你真的需要给定数据的规模,就去分布式——但是如果你能避免的话,不要从分布式开始。
![hardware](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/11c6a2b35f0c418d8cb13e4b2c713a6d.png)
Domino 的方法是使在大规模单个实例上运行分析变得容易。我们一直支持 32 核和 240GB 内存的 AWS 实例,上周,我们支持亚马逊的新 X1 实例,让你在 128 核和 2TB 内存的机器上运行 Jupyter、RStudio、批处理脚本或任何你想要的东西。[你可以在这里阅读更多内容](//blog.dominodatalab.com/high-performance-computing-with-amazons-x1-instance/)。
### 不要仅仅依赖度量进行测试(幻灯片 32)
![testing](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/c634efa6fe716943667e422c4e5db248.png)
Justin 解释说,虽然单元测试对于捕捉数学错误很有用,但是查看整个系统的输出也很重要,“至少,比较不同版本之间的意外变化的输出”
我们最近写了我们对数据科学的[单元测试的看法,以及 Domino 的“比较”特性如何促进这种类型的输出比较。](//blog.dominodatalab.com/unit-testing-data-science/)
![comparison-screen](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/185195681633a8a171b827d848005b89.png)
### 结论
![testing](https://github.com/OpenDocCN/geekdoc-ds-zh/raw/master/domino-blog/img/b0850d302e01d90d3841fe5c25ed593f.png)
我们在构建 Domino 时就考虑到了这些原则。Domino 支持快速迭代和实验,同时使生产变得容易,而不需要模型的冗余实现。我们主要是通过让您扩展到大型机器(并使用许多机器同时运行多个实验)来做到这一点。我们还通过跟踪所有实验结果并让您进行比较,来实现更全面的测试和比较过程。
如果你喜欢阅读关于实现更成熟的数据科学流程的原则和最佳实践,你会喜欢我们关于[什么是数据科学平台](//blog.dominodatalab.com/what-is-a-data-science-platform/)和我们的[“Joel 测试”的帖子](//blog.dominodatalab.com/joel-test-data-science/)。
Nic McPhee 制作的标题为“[递归雏菊](https://www.flickr.com/photos/gadl/253426762/in/photolist-ooSWW-5fxpCF-3BrGE-6z9eEg-57pvzs-i7PB4-RmMk4-hKJ4x-cfffhA-5kPFAc-8BueGX-9qow3d-9bVPcV-9bHkm9-5kPHaM-4eotPP-C1i2Z-Lcx4B-9bSUPJ-5kTXmj-t4TQ-9bGxf6-7etTW5-bxJ9x9-6Hw3D4-bLCN7c-3p2sCQ-sxfpc-bLCPSZ-bxJ8Aj-6FkYhG-bxJ757-63qeWa-bxJ7A3-bLCM4x-9dNsHs-6tb9fB-8krf4R-bxJ93b-5kTZ6A-9evUAi-3L4mHN-772CSg-7BNQ67-772Ckt-Vqhx7-5kPVX8-8Bqbnb-dLhVz5-772BNi)的横幅图片。由 2.0 在 [CC 下授权。](https://creativecommons.org/licenses/by/2.0/)
# 用 36 行代码改进 Zillow 的 Zestimate
> 原文:<https://www.dominodatalab.com/blog/zillow-kaggle>
Zillow 和 Kaggle 最近开始了一场[100 万美元的比赛来提高热情](https://www.kaggle.com/c/zillow-prize-1)。我们使用 H2O 的 AutoML 生成一个解决方案。
新的超低价格竞争受到了媒体的大量报道,这是有充分理由的。如果你能提高他们的 Zestimate 功能的准确性,Zillow 已经投入了 100 万美元。这是 Zillow 对房子价值的估计。正如他们在比赛描述中所说,提高这个估价可以更准确地反映美国近 1.1 亿套房屋的价值!
我们构建了一个项目,作为利用数据科学社区正在构建的一些令人惊叹的技术的快捷方式!在这个项目中有一个脚本`take_my_job.R`,它使用了令人惊叹的 H2O AutoML 框架。
H2O 的机器学习图书馆是行业领导者,他们将人工智能带入大众的最新尝试是 AutoML 功能。通过一个函数调用,它可以并行训练许多模型,将它们集成在一起,并建立一个强大的预测模型。
这个脚本只有 36 行:
```py
library(data.table)
library(h2o)
data_path <- Sys.getenv("DOMINO_EARINO_ZILLOW_HOME_VALUE_PREDICTION_DATA_WORKING_DIR")
properties_file <- file.path(data_path, "properties_2016.csv")
train_file <- file.path(data_path, "train_2016.csv")
properties <- fread(properties_file, header=TRUE, stringsAsFactors=FALSE,
colClasses = list(character = 50))
train <- fread(train_file)
properties_train = merge(properties, train, by="parcelid",all.y=TRUE)
```
在前 12 行中,我们设置了环境,并将数据作为 R data.table 对象导入。我们在第 4 行使用 Domino 环境变量功能,不必在脚本中硬编码任何路径,因为硬编码的路径通常会带来巨大的挑战。
在第 12 行,我们通过将属性文件与训练数据集合并来创建训练集,该数据集包含我们将要预测的 logerror 列。
```py
h2o.init(nthreads = -1)
Xnames <- names(properties_train)[which(names(properties_train)!="logerror")]
Y <- "logerror"
dx_train <- as.h2o(properties_train)
dx_predict <- as.h2o(properties)
md <- h2o.automl(x = Xnames, y = Y,
stopping_metric="RMSE",
training_frame = dx_train,
leaderboard_frame = dx_train)
```
这段代码就是利用 [H2O 的 AutoML 基础设施](https://www.dominodatalab.com/blog/deep-learning-with-h2o-ai)所需要的全部!
在第 14 行,我们正在初始化 H2O,让它使用和机器内核一样多的线程。第 16 行和第 17 行用于设置预测变量和响应变量的名称。在第 19 行和第 20 行,我们将 data.table 对象上传到 H2O(这本来可以用 h2o.importFile 来避免)。在第 22-25 行中,我们告诉 H2O 在训练数据集上使用 RMSE 作为早期停止指标,为我们建立它能做到的最好的模型。
```py
properties_target<- h2o.predict(md@leader, dx_predict)
predictions <- round(as.vector(properties_target$predict), 4)
result <- data.frame(cbind(properties$parcelid, predictions, predictions * .99,
predictions * .98, predictions * .97, predictions * .96,
predictions * .95))
colnames(result)<-c("parcelid","201610","201611","201612","201710","201711","201712")
options(scipen = 999)
write.csv(result, file = "submission_automl.csv", row.names = FALSE )
```
第 27-36 行是我们最后的预测和簿记。
在第 27 行,我们使用训练好的 AutoML 对象来预测我们的响应。然后,我们将答案四舍五入到 4 位数的精度,构建结果 data.frame,设置名称,并将其写出。
我添加的唯一一点技巧是将每一列的 logerror 缩小 1%,假设 Zillow 的团队总是让他们的模型变得更好一点。
在我没有任何意见的情况下,这个包建立了一个提供公共排行榜分数`0.0673569`的模型。不惊人,但考虑到我还没看过这些数据,这已经很了不起了。将 H2O 的算法与灵活的可扩展计算和简单的环境配置结合在一起,使这个项目变得快速而简单。
## 包裹
虽然手工构建的解决方案在 Kaggle 排行榜上的得分明显高于这一个,但完全自动化的解决方案表现相当好仍然令人兴奋。全自动数据科学的未来令人兴奋,我们迫不及待地继续支持社区开发的惊人工具!\]