TowardsDataScience 博客中文翻译 2016~2018(二百零二)
用卷积神经网络建模视觉神经元
(针对非技术人员)
我们的大脑很奇怪。这个奇怪的器官已经进化了数百万年,不断变化和调整,以处理他们会遇到的新刺激和条件,看起来像一袋黏糊糊的物质,以各种方式折叠在我们的大脑中。然而,这个器官和由它组成的数十亿个神经元是我们理解什么是智能以及它是如何出现的最佳赌注。另一个很好的赌注是我们自己创造(人工)智能,然后解释我们自己的创造。
近年来,我们离创造智能机器又近了一步。至少在视觉方面,我们现在拥有可以从数千个类别中准确分类图像的系统。这要归功于卷积神经网络(CNN)和用于训练它们的图形处理单元的效率。给定每个类别足够数量的图像来训练这些网络,CNN 可以学习调整它们的人工神经元的连接强度(“权重”),这样,在训练后,它们能够对它们从未见过的图像进行分类。
Fig1. How a typical CNN looks (source)
有趣的是,为了做到这一点,CNN 受到了我们大脑视觉系统的松散启发。视觉信息通过我们的眼睛进入我们的大脑,通过大脑区域的神经元传播,并在越来越复杂的阶段被消费,从简单的视觉表示如边缘、线条、曲线等开始。并且继续更复杂的表示,例如面部或全身。这导致一个人理解关于被观察物体的越来越复杂的信息。事实上,这种在日益复杂的阶段中对信息的解构似乎也是 CNN 所复制的。这个概念对于旧的视觉计算方法来说并不陌生。在更古老的、受生物学启发的 HMAX 模型中也可以看到这一点,该模型试图将大脑皮层中的视觉处理解释为“越来越复杂的表示层次”(更多信息请参见这里的、这里的和这里的)。
我们如何使用 CNN 层中的人工神经元来创建大脑视觉区域神经元的模型?“模型”是一个数学函数,给定与生物神经元相同的输入,可以产生类似的输出。为了创建它,首先需要理解和定义输入。
在这里,我们来看看我和我的同事在鲁汶大学神经生理学小组进行的一项研究。这项研究专门研究了下颞叶皮层,这是我们视觉系统的“晚期”处理阶段之一(腹侧流),更具体地说,是从一部分细胞中进行的,这些细胞对包含身体的图像比对其他类别的图像(如面部)更敏感。当图像中出现一具尸体时,即使是无头的,他们也会很兴奋!
示例输入是空白背景上的轮廓图像(见下文)
Fig2. Example image shown to biological neurons (without the green frame) (source).
生物神经元对图像的反应是这样的(图 2),科学家可以通过电生理学实验收集神经元的反应。在这样的实验中,一只猴子在监视器上看到图像,一个插入大脑的电极记录神经元对图像的活动或反应。 一些形状是随机的,一些形状像动物或人体,而其他形状像其他类别的轮廓。这项研究的目标是什么?为了找出 1)我们是否可以使用 CNN 层的人工神经元来预测该神经元对剪影图像的实际生物反应,以及 2)发现 CNN 的哪一层(早期、中期或晚期)对这些反应的建模最好。
Fig3. Body patch neurons would be excited looking at this…
卷积神经网络
CNN 的作用是接收输入图像,并为其训练识别的每个类别返回多个概率。
常见的 CNN 架构通常在早期层中包括数百个特征地图,并且该数字在接下来的更深层中逐渐减少。这些特征图(如示例 CNN 架构图所示)是整个层的切片,每个都由数千个神经元组成。
在谈论 CNN 时,“功能”这个词经常出现,要准确理解它的意思可能会令人困惑。所谓“特征”,我们指的是我们神经元的输出;术语“激活”也可以与特征互换使用,因为从神经科学的角度来看,t 更容易理解,因为它指的是在给定输入刺激的情况下神经元“激活”的程度。对于那些感兴趣的人来说,网上有很好的资源,它们很好地解释了 CNN 如何更详细地工作(例如卡帕西的课程, C .奥拉的博客,阿迪特·德什潘德的博客,这篇黑客文章等)。).让我们看看我们的神经元在做什么。
特征图中的每个神经元只能“窥视”输入的一小部分区域。因此,特征图左上角的神经元可以看到输入图像左上角的小窗口。同一个特征图中紧邻它的相邻神经元可以看到与第一个神经元的窗口相邻的小窗口。这意味着特征图可以通过用它的神经元“扫描”它来看到整个输入图像。那么为什么我们需要这么多的特征地图呢?所有这些神经元实际上是做什么的?
每个神经元根据其所属的层被分配一个数学运算来执行。这个操作涉及神经元的权重(连接强度)和它能看到的小窗口。
你可能想知道如何在权重和图像之间执行任何种类的数学运算。这是可能的,因为在数字世界里,一切都是数字。权重是指示神经元与构成图像(或该图像的小窗口)的像素的连接强度的数字。像素也是数字,在黑白图像中,黑色像素用数字 0 表示,白色像素用数字 1 表示。在灰度图像中,一个像素可以取一个范围内的值(我们通常定义为 0–255;见为什么表示其亮度。范围的一端是黑色(最暗),另一端是白色(最亮)。彩色图像有点复杂,因为它们的每个像素都有三个值来表示其在颜色通道中的亮度。我们使用红色、绿色和蓝色通道进行显示,因此我们将彩色图像称为 RGB 图像。
正如我们前面所说的,每个神经元根据其所属的层被分配一个数学运算作为其任务。例如,第一卷积层中的神经元在其权重和输入图像中的小窗口之间执行卷积运算。该卷积运算是权重和像素值之间的逐元素乘法,然后是结果的总和。这个想法是,如果神经元检测到一个看起来像它的权重模式的模式,它将输出一个很大的数字。通过训练网络,这些权重实际上会发生变化,看起来像输入的模式。因此,你可以把一个神经元想象成一个模式检测器,检查它正在观察的区域是否包含一些熟悉其权重模式的东西,并输出这种熟悉程度的“分数”。有趣的是,相同特征图的神经元被设置为具有相同的权重,因此每个特征图基本上扫描整个输入图像以寻找特定的模式。因此,我们拥有的特征地图越多,我们检测到的模式就越多。
任何子采样层或池层中的神经元取前一层中的小窗口的单个值。因此,最大池层的神经元简单地取那个小窗口的最大值。这里的想法是,即使你将输入图像移动到一边,甚至旋转,或缩放,池层中的神经元仍然会检测到类似的模式。这使得 CNN 能够容忍这些图像变换。
卷积和子采样层通过收集关于图像的信息并输出他们发现的重要点的更压缩的摘要,尺寸逐渐变小。请注意,在经典的 CNN 架构中,这些层接收来自它们之前的层的输入信息。还有更多体系结构,信息“跳过”各层,创建循环连接,但这里不讨论这些。
图像内容信息将最终出现在完全连接的图层中,这有助于我们进行最终分类。全连接层中的神经元连接到前一层的所有神经元。完全连接图层的作用是创建先前图层收集的关于输入图像的所有信息的展平表示。它是扁平的,因为这些层中的神经元的结构不像特征图,人们可以将它们视为一维数字阵列。这种扁平化的表示比以前的层包含更少的神经元,这有助于达到我们正在训练 CNN 识别的类别数量的最终目标。最终,我们将得到每个类的分数列表作为输出,最高分将指示最可能的类。
数学建模
研究中使用的网络是“预先训练的”。这意味着他们已经接受了使用一个非常大的数据集对图像进行分类的训练,然后他们的网络权重被保存下来,供下载公开使用。因此,为了获得每一层的激活,向这个预先训练的网络提供输入图像,然后获取每一层的输出。人们可以想象图像在网络中“流动”,就像信息在我们的大脑中流动一样,然后我们可以在每个处理阶段(层)捕捉它。这些捕获的信息是我们用来创建模型的。
这里的数学建模任务是测量生物神经元的响应与相应的人工神经元激活值之间的关系。这项任务被统计学家称为“回归分析”,即在给定其他变量(人工神经元激活)的值的情况下,试图预测一个变量(生物神经元的反应)的值。
在每一个回归分析中,都涉及到两个数值矩阵:预测变量的 X 矩阵和目标变量的 Y 矩阵。在目前的场景中,人们可以考虑整个 CNN 的神经元,并建立一个巨大的 X 矩阵作为预测器,但即使对于现代的计算机来说,这也是非常计算密集型的,并且它不会给我们任何关于层内差异的想法。因此,我们为每个 CNN 图层建立了一个单独的回归设置,下图显示了一个示例。
Fig4. X and Y matrices for our Regression problem. Note that the images are black-n-white (binary), but to pass them as input to a CNN, we replicate them twice to end up with a 3D volume (the bnw image 3 times). The trained weights are also 3D volumes and to understand how they interact with the input, check this incredible visualization from Karpathy’s CS231n course (and also read the rest of the blog for more details).
通过建立这些回归分析设置,我们本质上是试图用 CNN 层中存在的所有人工神经元来取代猴子的生物神经元( X )。最终,这项研究发现,较深的 CNN 层被证明是身体贴片神经元的强大模型,这些神经元在我们大脑的视觉处理阶段也更深。虽然预训练网络是使用自然图像训练的,但这并不妨碍使用剪影图像的研究结果。因此,深层 CNN 层可以接收图像作为输入,并产生非常接近实际神经元产生的响应。更重要的是,来自这些深层之一的最佳模型,平均可以解释真实神经元对轮廓反应的 80%的可变性。
为了建立一种人工方法来表示与神经元 C65b 相同的功能,我们需要使用一种有效的数学方法来获得给定 x 的 Y。我们将在更多技术部分(即将推出)中介绍这一点。在那里,我们将回顾我们的建模选项,以及为什么它不是一个可以用简单的线性多元回归解决的简单问题。
剧终
(更多关于数学建模的技术部分将在后面介绍)
声明:我是 eNeuro 的出版物 这里 的作者。此处展示的所有数据(示例图片)均属于鲁汶大学,有关该主题的更多详细信息,您可以参考 eNeuro journal 或鲁汶大学。
扬尼斯
当没有明确观察到客户流失时,用 R
Photo credit: Pexels
客户流失可以分为契约性或非契约性。根据取消机制的不同,它还可以分为自愿或非自愿。
我们今天只讨论非契约性和自愿性流失。
非合同
- 顾客可以随时自由购买或不购买
- 未明确观察到流失事件
自愿
- 客户选择离开该服务
一般来说,客户流失是一个分类问题。然而,在包括亚马逊(非 prime 会员)在内非合同业务中,每一次购买都可能是顾客的最后一次,或者是一长串购买中的一次。因此,非合同业务中的客户流失建模不是一个分类问题,而是一个异常检测问题。为了确定客户何时会流失或可能流失,我们需要知道他们在购买时间间隔内何时表现出异常大的变化。
异常检测
异常检测是一种用于识别不符合预期行为的异常模式(称为异常值)的技术。它在商业中有许多应用,从信用卡欺诈检测(基于“消费金额”)到系统健康监控。
现在,我们使用异常检测来模拟非合同业务的客户流失。我们希望能够做出这样的声明:“十有八九,顾客 X 会在 Y 天内进行下一次购买”。如果顾客 X 在 Y 天内没有再次购买,我们知道发生这种情况的概率只有 1/10,并且这种行为是异常的。
为了做到这一点,我们将需要每个客户的购买时间之间的分布。这可能很难估计,特别是如果分布是多模态的或不规则的。为了避免这一困难,我们将采用非参数方法,并使用经验累积分布函数 (ECDF)来近似每个客户的购买间隔时间分布的分位数。一旦我们有了 ECDF,我们就可以接近第 90 个百分位数,并获得我们上面描述的性质的估计值。我们开始吧!
数据
我们将使用来自 UCI 机器学习库的在线零售数据集。
加载库并读取数据:
library(tidyverse)
library(lubridate)
library(XLConnect)
library(dplyr)
library(ggplot2)
theme_set(theme_minimal())raw.data <- readWorksheet(loadWorkbook("Online_Retail.xlsx"), sheet=1)
data <- raw.data
创建一个“总计”栏,显示每位顾客每次购物的花费。然后,我们可以为每位顾客每天的总支出创建一个新的数据框架。
data$Total <- data$Quantity * data$UnitPricetxns <- data %>%
mutate(CustomerID = as.factor(CustomerID),
InvoiceDate = InvoiceDate) %>%
group_by(CustomerID, InvoiceNo, InvoiceDate) %>%
summarise(Spend = sum(Total)) %>%
ungroup() %>%
filter(Spend>0)
接下来,我们可以计算每个客户的购物间隔时间。
time_between <- txns %>%
arrange(CustomerID, InvoiceDate) %>%
group_by(CustomerID) %>%
mutate(dt = as.numeric(InvoiceDate - lag(InvoiceDate), unit= 'days')) %>%
ungroup() %>%
na.omit()
此时,我们只对数据中至少购买了 20 次的客户感兴趣。
Ntrans = txns %>%
group_by(CustomerID) %>%
summarise(N = n()) %>%
filter(N>20)
创建一个随机抽样客户的小函数。
sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
grps = tbl %>% groups %>% lapply(as.character) %>% unlist
keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}
在一系列数据争论之后,我们现在可以可视化随机选择的 20 个客户的购买天数分布。
ecdf_df <- time_between %>% group_by(CustomerID) %>% arrange(dt) %>% mutate(e_cdf = 1:length(dt)/length(dt))
sample_users <- ecdf_df %>% inner_join(Ntrans) %>% sample_n_groups(20)ggplot(data = time_between %>% inner_join(Ntrans) %>% filter(CustomerID %in% sample_users$CustomerID), aes(dt)) +
geom_histogram(aes(y = ..count../sum(..count..)), bins = 15) +
facet_wrap(~CustomerID) +
labs(x = 'Time Since Last Purchase (Days)',y = 'Frequency')
Figure 1
解释:
- 大多数 CustomerID 12748 的购买间隔少于 5 天,偶尔,他(或她)的购买间隔超过 5 天甚至 10 天。
- CustomerID 13102 是一个不经常购买的客户,他(或她)的大部分购买间隔期为 5 到 30 天。
在计算了每个客户的 ECDF 后,我们将上述客户的 ECDF 可视化。红线代表大约 90%的百分比。因此,如果 ECDF 在 20 天内越过红线,这意味着 10 次中有 9 次顾客会在 20 天内再次购买。
ggplot(data = ecdf_df %>% inner_join(Ntrans) %>% filter(CustomerID %in% sample_users$CustomerID), aes(dt,e_cdf) ) +
geom_point(size =0.5) +
geom_line() +
geom_hline(yintercept = 0.9, color = 'red') +
facet_wrap(~CustomerID) +
labs(x = 'Time Since Last Purchase (Days)')
Figure 2
创建一个函数来计算第 90 个百分位数。
getq <- function(x,a = 0.9){
if(a>1|a<0){
print('Check your quantile')
}
X <- sort(x)
e_cdf <- 1:length(X) / length(X)
aprx = approx(e_cdf, X, xout = c(0.9))
return(aprx$y)
}percentiles = time_between %>%
inner_join(Ntrans) %>%
filter(N>5) %>%
group_by(CustomerID) %>%
summarise(percentile.90= getq(dt)) %>%
arrange(percentile.90)
查看 CustomerID 12748:
percentiles[ which(percentiles$CustomerID==12748), ]
Figure 3
该模型告诉我们:10 次中有 9 次,CustomerID 12748 将在 4.74 天内进行另一次购买,如果 CustomerID 12748 在 4.74 天内没有进行另一次购买,我们知道这种情况发生的概率只有 1/10,并且这种行为是异常的。此时,我们知道 CustomerID 12748 开始“反常地”行动。
让我们快速浏览一下 CustomerID 12748 的购买历史,看看我们的模型是否有意义:
txns[ which(txns$CustomerID==12748), ]
Figure 4
CustomerID 12748 的大部分购买发生在 1 到 4 天内。如果他(或她)在 4.74 天内没有再次购买,我们应该担心,这是有道理的。
查看 CustomerID 13102:
percentiles[ which(percentiles$CustomerID==13102), ]
Figure 5
该模型告诉我们:10 次中有 9 次,CustomerID 13102 将在 31.6 天内进行另一次购买,如果 CustomerID 13102 在 31.6 天内没有进行另一次购买,我们知道这种情况发生的概率只有 1/10,并且这种行为是异常的。此时,我们知道 CustomerID 13102 开始“反常地”行动。
同样,我们快速浏览了 CustomerID 13102 的购买历史,以了解我们的模型是否有意义:
txns[ which(txns$CustomerID==13102), ]
Figure 6
通过查看 CustomerID 13102 的购买历史,我们同意该模型!
给你!我们现在知道了每个客户开始“反常”行为的时间点。
非合同业务的客户流失非常不同。挑战在于定义一个清晰的客户流失事件,这意味着采用不同的方法来模拟客户流失。当一个顾客有所动摇时,他(或她)的购买间隔时间是异常的长,所以我们应该知道“异常”对每个顾客意味着什么。使用 ECDF,我们已经以非参数的方式估计了每个顾客在购买时间分布之间的 90 个百分点。通过检查客户最后一次购买的时间,如果从那时到现在的时间接近第 90 个百分点,那么我们可以称他们为“有流失风险”,并采取适当的措施来防止他们流失。最重要的是,随着更多的数据,我们的方法将变得越来越好,因为ECDF 将收敛于人口的基本累积分布函数(CDF)。
此外,当我们实现上述模型时,我们可能要考虑季节性。
源代码可以在 Github 上找到。我期待听到任何问题。
参考资料:
使大学橄榄球决赛现代化
在一个由分析驱动的时代,大学足球使用数字而不是意见来选择季后赛球队。
Photo by Alex Korolkoff on Unsplash
随着大学橄榄球赛季最后一周(通常称为竞争周)的临近,大学橄榄球季后赛的 4 支球队似乎一如既往地清晰可见。尽管我们认为我们知道最好的 4 支球队,但由大学橄榄球季后赛委员会提供的第 13 周排名再次令人惊讶。5 队 4 负排名,创历史新高。UCF 的排名高于俄亥俄州。路易斯安那州立大学,尽管输了两场(包括一场 29-0 的井喷),仍然排在第 7 位。也许这些决定都有可取之处,但是没有委员会的解释或透明度,目前的系统对许多人来说是不完善的。要了解大学足球季后赛的目的,以及如何修复这个系统,我们必须看看大学足球排名系统的历史。
排名简史
1936-1997:投票时代
大学足球(CFB)冠军是由预先确定的一组选民组成的不同投票选出的。引用最多的两项民意调查是美联社民意调查,由媒体成员投票选出,以及《今日美国》教练民意调查,由 62 名精选的 CFB 教练投票选出。在这个时代,这些民意调查偶尔会发生冲突,在赛季结束时产生两个不同的冠军。最好的两个队也不能保证互相比赛,这导致了关于谁将在第一和第二队之间赢得比赛的假设。随着其他投票开始流行(CNN 投票等),很明显最好的球队应该在球场上解决争论。
1998 年至 2013 年:波士顿咨询公司
BCS 旨在通过在赛季末选择最好的两支球队争夺冠军来解决投票时代的问题。使用计算机化的分数,BCS 考虑了几个因素来对团队进行排名。该分数由 3 个因素组成,所有因素的权重相等:教练投票、哈里斯投票和 6 个计算机排名的平均值,去掉最高和最低的排名以说明异常值。哈里斯民意调查是由专门从事互联网研究的市场调查公司进行的,在美联社决定他们不想被纳入 BCS 公式后,该公司取代了美联社的民意调查。哈里斯民意调查在 2013 年赛季结束后结束。提到的 6 个计算机排名是:
- 萨加林: 各队使用国际象棋常用的 ELO 评分系统进行排名。输赢是主要标准,获胜的队伍比他们的对手得分高。每个团队最初是根据他们的预期获胜次数来评分的,如果一个团队的获胜次数超过了他们的预期值,他们的评分就会提高。该模型还考虑了游戏地点的因素,以说明难度。
- Wolfe: 每支队伍都使用最大似然估计量(MLE)进行评分,A 队击败 B 队的概率简单描述为(ARating)/(ARating + BRating)。这被描述为布拉德利·特里模型。
- 梅西: 根据他的网站:每场比赛都通过一个等式“连接”两支球队。随着游戏越来越多,最终每个团队都通过某种游戏链与其他团队联系在一起。当这种情况发生时,方程组是耦合的,需要用计算机来同时求解。收视率是完全相互依赖的,所以一个球队的收视率会受到它没有参加的比赛的影响。因此,解决方案实际上依赖于对手、对手的对手、对手的对手的对手等等的无限链条。最终评级代表一种平衡状态,在这种状态下,每个团队的评级与其良好和不良表现完全平衡。
- 科利: 赛程和胜率的强弱最重要,比分差距或对手胜率则无关紧要。没有任何修正的简单统计模型。
- 安德森:再次强调,赛程的强度至关重要。各队因安排优质对手并获胜而获得奖励,分数差异无关紧要。球队会进一步受到对手的对手和整个赛季中联盟整体表现的影响。
- 比林斯利: 季前赛投票开始的唯一投票,根据比赛时各队的快照来奖励各队。例如,如果华盛顿队与第五名俄勒冈队比赛,并且华盛顿队赢了,而俄勒冈队在本赛季剩余的比赛中打了坦克,则华盛顿队仍然被认为赢了第五名队。亏损会受到重罚,因此在这个模型中保持不败会得到很多奖励。
BCS 排名选出赛季末的前 2 名球队,1 号打 2 号争夺全国冠军。虽然排名比投票时代更准确地代表了球队的表现,但许多大学足球社区的人认为两队太少了。许多年来,非常有资格的球队落后于第二名仅仅十分之几的分数,然而却被淘汰出冠军争夺。是时候扩展领域了。
2014 年至今:大学橄榄球决赛
NCAA 通过在 2014 年成立 CFP 委员会解决了 BCS 问题,该委员会由来自 CFB 社群的 13 名轮流成员组成。这个委员会选出最好的 4 支队伍参加冠军决赛。尽管该领域从 2 个团队扩大到 4 个团队,但委员会的决策在其存在的 4 年中不断受到质疑,2018 年的任何混乱都将提供另一个具有挑战性的选择。总结委员会以前有问题的决定:
- 2014 年:俄亥俄州对 TCU 和贝勒。OSU 赢得了 10 大冠军,而 TCU 和贝勒被排除在外,因为一个感知“较弱”的时间表。
- 2016: 俄亥俄州对宾州。PSU 以 27 比 24 的比分击败了 OSU,宾夕法尼亚州立大学赢得了十大冠军。然而,OSU 被选中是因为一个被认为“更强大”的时间表。
- 2017: 阿拉巴马州对俄亥俄州。阿拉巴马州是第二支进入季后赛的 SEC 球队(排名第一的是佐治亚州)。只有 1 次失败,但没有分区或联盟冠军,阿拉巴马州被选中超过 10 大冠军 OSU,因为人们认为失败的质量较低。
在委员会存在的 4 年中的 3 年里,围绕所做的决定存在严重的争议。这场季后赛的内在结构是排除至少一个 5 强冠军。如果在选择全国锦标赛的最佳球队时不考虑联盟锦标赛,那么目前的选择过程是有缺陷的,并且充满了委员会成员影响的可能性。在每个主要运动都接受数据和分析的时代,大学足球应该接受基于优点的排名模型,并致力于消除 13 人董事会可能带来的偏见,特别是在决策没有任何透明度的情况下。BCS 投票成功了,只需要扩展到 4 个团队就可以解决 BCS 的紧迫问题。
然而,要修复这个系统,需要解决两个问题:意见和数据应该如何平衡?而我们是否应该每年至少排除 1 次 Power 5 大会?
现代化的碗季后赛(MBP)
在一个理想的系统中,排名将捕捉到大学足球世界的完整画面。这个新系统,我们称之为现代化的碗季后赛(MBP),建立在 BCS 模型之上。首先,AP 调查和教练调查将各占 1/6 的分数,或总分数的 1/3。这确保了人类的感知影响排名,但不是驱动力。第二,平均 7 次民调会占 2/3 的分数,同时保留每个队的最高分和最低分。这将确保没有单一模型比另一个模型具有更大的权重,并且如上所述,将允许包括诸如快照胜利(击败当时排名第二的团队等)的因素。随着更新、更先进的计算机模型的出现,MBP 将 、ESPN FPI 作为第七个计算机排名加入到它的等式中。FPI 衡量团队实力,以最佳方式预测团队在本赛季剩余时间的表现,基于本赛季剩余时间的 10,000 次模拟。
为了解决是否应该排除 5 强联盟冠军,或者是否应该从一个给定的联盟中选择几个球队,季后赛必须扩大到 8 个球队。前 5 名大会的大会冠军将自动获得一个席位,排名前 3 位的未参加大会的团队将获得大额投标。这确保了 5 个团队或来自 Power 5 会议的第二个团队有机会竞争,如果他们值得的话。这 8 支队伍将根据他们的排名被列为种子队。这个新的 MBP 排名系统将在第 13 周产生前 25 名…
在我的 网站 查看新的排名和假设的 8 支球队季后赛。也可以在 Twitter 关注我。
学术数据科学的现代化
软件工程提高科学再现性的四个原则
摘要
再现性对科学进步至关重要,然而大多数结果是无法复制的。今天的研究论文严重依赖编程分析管道和统计模型。几十年来,软件工程在如何实现高质量、可复制的代码方面已经发展出了最佳实践。然而,科学家通常没有接受过这些最佳实践的培训。这篇文章涵盖了在科学研究中促进更大的可重复性的四个基本原则: c ode review 、 t esting 、版本控制和ddocumentation。
Photo by Conner Baker on Unsplash
不可复制的研究问题
在我研究生生涯的末期,我把研究再现性危机作为一个兼职项目,这对于一个越来越失望的博士生来说,就像往火上浇汽油一样聪明。一些已发表的研究发现是虚假的这一事实并不新鲜,也不特别令人担忧。然而,令人担忧的是越来越多的证据表明大多数发表的研究发现是错误的。
心理学首当其冲受到负面压力,但是危机影响了大多数领域。例如,整个神经科学的统计能力大约是的 20%。虽然最新的力量姿势或超感知觉的后验概率可能不会让你晚上睡不着觉,但在癌症生物学、遗传学或药理学中持续失败的重复发现可能会引起关注。
by KC Green
学术界扭曲的激励结构是许多统计滥用的核心。有意义的结果会带来金钱和名声,而无意义的结果则什么都不会。证据的二分法使得选择性报告变得更加容易,在专业上也更加方便。
这个问题不仅仅是显性的黑客攻击,而且更隐蔽的是,隐性的黑客攻击来自于丰富的研究人员自由度和我们对正面结果的偏好。这就是为什么再现性在如此多的领域受到关注,包括机器学习和 AI 。
走向可复制的研究
越来越多的人意识到缺乏再现性,这导致了许多最近的提议,例如移动显著性阈值,用效应大小和置信区间补充分析,或者切换到贝叶斯因子。这些都是统计学上的原则性建议,但却非常不令人满意。为什么?因为这些充其量只是权宜之计,持久的解决方案需要文化转型。
从这个转变开始的一个地方是软件开发,它是许多学术研究项目的核心。因此,从软件行业借用促进可复制性、透明性和健壮性的原则是合乎逻辑的。
为什么这些实践在学术界几乎不存在?一个原因是研究生院没有跟上数据的指数增长。例如,即使在排名最高的神经科学博士项目中,定量方法和编程基础的课程也是可选的或过时的。哈佛大学为即将入学的研究生开设的定量方法训练营仍然只专注于 Matlab。封闭源代码和昂贵的许可证不太可能成为可复制科学的良方。
结果是学生必须自己发现现代数据科学和开发的最佳实践。但是实验室已经采用了没有支持机器的编程语言。学术实验室不是工业软件开发团队,也不应该是。但是工业中使用的确保可再现性、功能性和透明性的工具与学术界高度相关,并将培育更多可再现的科学。
提高科学再现性的核心原则
1)代码审查
想一想,与对产生结果的代码关注甚少相比,一份手稿在出版前受到了多么严密的审查。除了原作者之外,有多少人曾经看过这些代码?
在开发团队中,代码通常由多人进行同行评审。这有助于确保预期的功能、缺陷的识别以及对标准的遵守。
你是怎么做到的?逐行阅读代码,并问自己:
- 我能容易地理解代码吗?
- 代码做了它应该做的事情了吗?运行它。
- 代码遵循标准吗? Python 风格指南, R 风格指南
- 代码是模块化的吗?
审查者应熟悉编程语言,但可能不具备生理或统计模型方面的专业知识。因此,纳入防弹测试方案是一个好主意。
2)测试
第一个原则是你不能欺骗自己——而你是最容易被欺骗的人。— 理查德·费曼
软件测试有很多种,有手工的,也有自动的,覆盖了不同程度的粒度。它们通常分为三类,针对单个功能或类的单元测试,针对多个组件的集成测试,以及针对整个项目的端到端测试。测试的目的是验证一个软件的行为符合预期,并预测它会如何崩溃(就像这个癌症研究被一行代码搞垮一样)。
在学术界,最常见的担忧之一是虚假的发现。测试将有助于防止虚假的发现。
例如,线性判别分析通常在许多研究项目中用作分类器。然而,如果不满足模型的假设,分类结果很容易被误解。最关键的假设之一是特征不在共线。下面是一个测试示例,如果违反了这个假设,它将停止执行并引发错误。
测试可以加快调试速度。当依赖于依赖于快速发展的库的复杂代码库时,这个事实尤其突出,这些库可能与来自另一个实验室的遗留代码集成在一起。
好的测试需要仔细考虑数据和可能的故障点。这使得编写测试本身成为一项有用的练习。这里的是更详细的 Python 测试入门指南。
3)版本控制
版本控制系统回答了这个问题:“谁在什么时候做了什么?”通过记录和维护可以随时比较的代码版本。它已经存在大约 50 年了,但我们不知何故找到了一种方法来保持命名文件version _ final-edits _ December _ 2018。如果你不熟悉版本控制,你正在为你的同事和你未来的自己创造更多的工作。
目前最流行的版本控制系统之一是 Git,它与 Github(Git 托管服务)一起使用。
我给新开发人员的第一条建议是:学习 Git。
codeburst.io](codeburst.io/number-one-…)
学习 git 是一项可以立即收回成本的投资。它将防止丢失您的工作,不记得昨天工作了什么,没有您的代码的功能版本来共享,等等。
不要让成千上万的“简易 Git 指南”使你相信这是软件工作流程中每个人都非常了解的琐碎方面。就连 Git 的开发者 Linus Torvalds 也称之为“该死的白痴的一卡车 sh*t:当它坏掉的时候”。有效使用 Git 需要时间,这里有一些资源可以帮助。
4)文件
你可能已经发现了强 AI 缺失的关键,但没人能说得清是不是不可能理解你的代码。虽然有少数优秀的可以手动修补二进制代码,但编辑带有文本字符串的代码可能更容易,它会告诉你代码做了什么。这些有用的字符串称为文档字符串。以下是用 Python 编写的函数的文档字符串示例:
三重引号"""之间的文本解释了这个函数做什么,预期的输入和输出以及它们相关的类型。在 Python 中,包含文档字符串的约定是将它们作为每个模块、函数、类和方法的第一条语句。
在编写文档时,您没有义务遵循任何规则,但是使用一个标准,比如 Python 中 NumPy 库的这个,可以自动生成有用的参考指南。经验法则是使用你加入的团队已经习惯的东西,因为细节没有坚持和一致性重要。
文档也不是可读性的唯一方面,但它是一个非常强大的起点。
经过审查、测试、版本控制和记录的软件将极大地提高结果的健壮性和可重复性。
如果有兴趣进一步优化,可以考虑集装箱化带码头、打包,以及持续集成。值得记住的是,再现性是一个光谱,小的变化会产生大的影响。
感谢刘冉和克里斯·霍布森的有用的评论,删除了许多不必要的段落,并感谢德克斯特·杜克沃斯提高了例子的质量。
如果你想聊天,请联系我,你可以在这里找到我。
利用生物技术的分子系统学。菲洛
你有没有想过生命是如何从原始汤形成并进化成现在可以看到的不同生命形式的?不同的物种是如何从它们的祖先进化而来的,它们之间有什么关系?这些问题可以通过对种系发生学的研究来解答。
本文将带您了解以下主题。
- 什么是种系发生学?
- 系统进化树
- 用于系统发育推断的算法
- 带代码的示例练习任务
什么是种系发生学?
根据维基百科,
系统发育学是对生物个体或群体之间的进化历史和关系的研究。
通过系统发育推断方法发现生物之间的关系,其中可遗传的特征,如 DNA 序列或形态,可以在特定的进化模型下观察到。这些分析的结果是一个系统发育(也称为系统发育树)。它是描述一组生物或一个基因家族进化关系历史的假说的图表。
分子系统发生学是系统发生学的一个分支,分析某些分子,主要是 DNA 序列和蛋白质如何随时间变化,以确定一组生物或一个基因家族的进化关系。
Primates with books
系统进化树
系统进化树代表生物或基因之间的进化关系。进化树中的分支模式反映了物种或其他群体是如何从一系列共同的祖先进化而来的。进化树的一个例子是 生命树 ,它表示自地球诞生以来各种生物物种是如何进化的。
在系统发育树中,感兴趣的物种或类群位于被称为分支的线的顶端。分支的点称为分支点。
Image Source: Khan Academy
如果两个物种有更近的共同祖先,那么它们就更相关;如果它们有更近的共同祖先,那么它们就更不相关。
Image Source: Khan Academy
这里给出的是基于基因数据的灵长类动物的系统进化树。大猩猩和猩猩比其他灵长类动物分化得更早。人血统(人类)沿着一条道路前进,而潘血统则沿着另一条道路前进。后来,潘的血统发生了分裂,产生了黑猩猩和倭黑猩猩。
用于系统发育推断的算法
有三种主要类别的算法用于从任何类型的生物数据进行系统发育推断。他们是,
- 基于距离的方法
- 最大简约法
- 概率方法
1.基于距离的方法
基于距离的方法计算出一个进化距离,这是两个被认为从一个共同祖先分化出来的物种所发生的变化的数量。然而,当涉及到处理具有非常遥远关系的大量数据时,这些方法面临准确性问题。
2。最大简约(MP)方法
MP 方法推断出一棵最小化变化总数的树,这种变化被称为解释数据所需的突变。在最大简约准则下,解释数据的最短可能树被认为是最佳树。这棵最好的树被称为最节俭的树。执行启发式搜索以快速生成最节省的树。由于这种方法认为最短的可能树是最好的树,实际发生的进化变化可能被低估。
3.概率方法
概率方法,如最大似然(ML) 和贝叶斯推断 *、*试图找到一棵最大化观察数据的条件或后验概率的树。目前,系统发育研究广泛使用贝叶斯框架,因为它可以解释系统发育的不确定性、有效算法的可用性及其作为各种计算机程序的实现。
生物。phylo——练习的时间到了
既然我们对系统进化树有了一个基本的概念,现在是时候尝试一些编码了。我在之前的文章中介绍过一套名为 Biopython 的 Python 工具,可以用来分析生物数据。如果你还没有浏览过,也一定要去看看。
我将使用简历。Phylo 模块,提供类、函数和 I/O 支持,用于处理系统进化树。你可以通过官方文档来获得更多关于这个模块的细节。
任务—为给定的 DNA 序列构建系统发生树
假设你有五个 DNA 序列,它们的标签在每一行的开头。你可以在官方 biopython 测试材料中名为 msa.phy 的文件中找到这些序列。考虑的顺序如下。
- 阿尔法 AACGTGGCCACAT
- 测试版 AAGGTCGCCACAC
- 伽玛 CAGTTCGCCACAA
- 增量gagatttcgcct
- 艾司隆 GAGATCTCCGCCC
我们的任务是基于基于距离的系统发育推断方法构建系统发育树来表示这些序列。
目前,生物。Phylo 模块有两种类型的树构造器:DistanceTreeConstructor和ParsimonyTreeConstructor。我们将使用**DistanceTreeConstructor**来完成这个任务。
此外,DistanceTreeConstructor支持两种启发式算法:UPGMA(算术平均的不加权对组方法)和NJ(邻居加入)。我们将使用**UPGMA**算法。你可以从这个链接中读到更多关于 UPGMA 算法的内容。
解决办法
首先,确保您已经下载了包含输入序列的 msa.phy 文件,并将其包含在您当前的工作目录中。
下面给出的是为给定的 DNA 序列创建系统发生树的 python 代码。注意我们是如何使用 Bio 的。Phylo 模块及其功能。
通过运行代码,我们可以得到可视化的系统进化树,并在终端中打印出来,如下所示。
Graphical visualization of the phylogenetic tree using UPGMA
The phylogenetic tree using UPGMA printed in the terminal at the end
如果使用 NJ 算法而不是 UPGMA 算法,那么得到的树会有如下变化。
Graphical visualization of the phylogenetic tree using NJ
The phylogenetic tree using NJ printed in the terminal at the end
希望您喜欢阅读这篇文章,并了解到关于分子遗传学以及如何使用 Biopython 从一组给定的序列构建系统进化树的有用和有趣的东西。我很想听听你的想法和主意。
感谢阅读…😊
现代艺术博物馆及其数据艺术品
今天我将用 MoMA 的数据来描绘一幅 MoMA 现当代艺术收藏的图画。
为了了解艺术品的大小,我将它们绘制成上下重叠的矩形,其中 88.8%在 500 厘米 x 500 厘米(197 英寸 x 197 英寸)范围内,而平均高度和宽度约为 25 厘米(10 英寸)。
size of artwork by overlapping their actual size in rectangles
虽然大多数艺术品都小于 50 厘米 x 50 厘米,但大小各不相同,建筑收藏中一些较大的异常值达到 10 米。
我们还可以调查最具代表性的艺术家、摄影师和建筑师的作品规模。高宽比表示肖像模式或风景模式。我们可以看到法国画家和雕塑家让·杜布菲创作了许多高大的艺术品,而德裔美国建筑师路德维希·密斯·凡·德罗的作品则更为广泛。
artists and size of their canvas
对于 MoMA 收藏最多绘画作品的艺术家,我们也了解到他们对画布尺寸的不同偏好。像奈良美智这样的艺术家创作较小的波普艺术,而像吉姆·戴恩这样的艺术家创作较大和较宽的绘画。
这是我关于数据科学和视觉故事的# 100 日项目的第 36 天。我的 github 上的全部代码。感谢阅读,欢迎反馈。
房地产摇钱树
投资房地产?开餐馆?发起营销活动?你以前听说过——这都是关于位置、位置、位置的。它有可能成就你的事业,也有可能毁掉你的事业,然而这个关键的决定仍然常常是由直觉和直觉驱动的。
有了 Easy Atlas ,我们正在改变这一切。在过去的一年里,我们一直在开发一种新技术,可以为您的投资和业务确定最佳位置。不用再猜了。
怎么会?
**数据。**如今,我们可以访问大量的位置数据,而这些数据在十年前根本不存在。这也不仅仅局限于地理位置。我们可以看到我们如何移动,停留多久,付出多少,以及我们的感受。地理位置数据无处不在,无所不在,挖掘这些数据源可以揭示一种洞察力,这种洞察力可能会对我们的决策产生重大影响。
那么,如果我们分析所有数据并跟踪随时间的变化,会发生什么呢?
当人们搬家时,价格就会变化。新事物出现,旧事物消失。我们可以从数字中看到这一切。数据是解决位置问题的工具,我们已经组装了一个工具箱,能够回答最复杂的基于位置的查询。
Easy Atlas 是一个实时系统,允许您插入我们的任何或所有数据源,以便您可以为您选择的一个或多个城市绘制数据图层。
让我们来看看 Easy Atlas 的运行情况。我们打算 1) 在巴黎开一家咖啡馆 ,2)在上海投资 住宅房地产 ,3)在纽约 开一家夜总会 。
1.在巴黎我应该在哪里开一家新的咖啡馆?
巴黎是一个咖啡馆林立的城市。为了确保我们的新咖啡馆成功,我们想找一个人流量大、咖啡馆少或档次低的地方。
高客户需求+不满意的客户=我们的机会
这里是目前巴黎咖啡馆的分布
Least dense (light blue) to most dense (dark blue)
下面是顾客对他们的评价
Red (below city average) to green (above city average)
这里是城市中最繁华的地方
当我们将所有数据层层叠加时,我们得到了巴黎新咖啡馆最佳位置的两个明确候选人。与巴黎其他地方相比,这两个地方的咖啡馆表现不佳,数量也较少,但与巴黎其他地方相比,这里的交通和活动要多得多。
你知道吗?
星巴克在巴黎有 59 家分店。平均位置每周开放 6.87/7 天,每天开放 12.82 小时。
一般人走进巴黎咖啡馆的时间是下午 2 点 52 分。这是比纽约晚25 分钟,比多伦多晚28 分钟比多伦多晚,比伦敦晚 1 小时 21 分钟**,比香港早 12 分钟**。****
2.在上海投资住宅地产应该去哪里?
上海人口在最近十年增长了近 40%(涌入 1000 万+人)。随着越来越多的人涌入城市生活和工作,住宅区将继续涌现。为了准确定位我们应该在这个城市火热的房地产市场上投资哪里,我们将分析整个城市的增长趋势和价值。
- ****增长趋势:通过查看所有类别流量的增长情况(如社交媒体、酒店、餐厅、Airbnb),找出哪些社区正在崛起。
- ****价值差异:通过比较 Airbnb 的 8000+房源与房地产中介的 7000+房源的价格点,定位被低估的区域。我们想揭示 Airbnb 的高价格和低房价之间的最大差异。
高增长领域+被低估的领域=我们的机会
以下是 2016 年末上海最繁忙的地方
Least active (light blue) to most active (dark blue)
这里是今天上海最繁忙的地方
Least active (light blue) to most active (dark blue)
这里是已经发生的流量变化
Red (below city average growth rates) to green (above city average growth rates)
这里是上海目前的房价
Least expensive (light blue) to most expensive (dark blue)
当我们综合这些数据时,我们发现上海有两个明显的新兴社区值得我们考虑投资。这两个城市的客流量增长都超过了纽约,而且房地产市场和 Airbnb 之间的价格差异为负。
你知道吗?
上海平均建筑高度 110.6 米。与首尔的 130 米、东京的 109.5 米、香港的 125.6 米相比。
如果你把所有的建筑一个接一个的堆叠起来,上海将会有一个 119.9 公里长的建筑。那远远长于首尔的 35.6 公里和东京的 85.5 公里,但短于香港的 122.6 公里。
3.我应该把我的新夜总会设在纽约市的什么地方?
纽约市的夜总会竞争激烈。为了确保我们的新夜店从 18-35 岁的目标人群中获得大量客流量,我们需要找到他们经常出没的地方,以及举办大量社交活动的区域。
- 以自行车份额衡量的千禧年活动:今年 3 月,纽约市使用花旗自行车系统的出行次数超过 717,300 次;其中 46%是由 18-35 岁的人拍摄的。让我们看看他们去了哪里。
- 以脸书活动衡量的活动:目前有 4550 多项脸书活动计划于下个月在纽约市地区举行。689,382,475 人表示将参加。让我们看看这些事件发生在哪里。
千禧一代流量+活动密度=我们的机会
这里是纽约千禧一代使用花旗自行车的地方
Least active (light blue) to most active (dark blue)
这里是脸书事件发生的地方
Fewest events (light blue) to most events (dark blue)
当我们对数据进行分层时,这两个区域最有希望成为新的夜总会。两者都获得了大量的千禧一代流量,并举办许多社交活动。
你知道吗?
纽约市自行车共享出行的平均时间是 12:57 分钟。与此同时,他们在蒙特利尔比在伦敦多了 0:13 分钟和 5:21 分钟。****
在纽约市,千禧一代完成一次旅行的平均时间比 35 岁以上的人快 38 秒。
谈到 Easy Atlas 的潜力,这些例子只是冰山一角。我们的系统以前所未有的方式了解城市的位置和动态特性,并实现了前所未有的发现和分析。利用 Easy Atlas 的可能性,确保您未来的所有投资和商业决策都植根于最新的数据和机器学习。
如果您有兴趣与我们合作,将您的位置战略提升到一个新的水平,请给我们发消息,地址是info@easyatlas.com。
MongoDB——引领 NoSQL 的潮流
MongoDB World’18 向我们展示了数据库技术的未来
CTO Eliot Horowitz introduced many of the novel features of MongoDB 4.0.
你好。我是 Sohan。欢迎来到我的第一篇博客。我的目标是利用这个空间,通过我自己作为计算机科学本科生的成长来探索科技世界。我决定从 MongoDB 开始,这是因为它给这个行业带来了创新,也是因为我接触了这个产品。
6 月 27 日星期三,我有机会前往纽约参加 MongoDB World 2018。在该公司的旗舰年度会议上,MongoDB 4.0 被公布,同时还有许多功能可以帮助公司永远转向非关系数据库。
Example of a collection of JSON documents. (source)
那么,什么是非关系(或 NoSQL)数据库呢?嗯,它们与关系数据库有很大的不同,这是一个很好的复习,可以在这里找到。MySQL 等传统数据库利用基于表的结构来存储数据,而在非关系型数据库中,一切都是基于文档的。文档以无序的方式存储在一个集合中,通常没有什么层次结构。每个文档都代表一个对象—无论是客户还是待售商品—并且具有任何和所有相应的信息—从名称和年龄到价格和剩余库存。这为数据存储提供了更大的灵活性,并减少了手动构建数据所花费的时间和精力。
越来越多的公司决定转向非关系数据库,尽管 MongoDB 在 2009 年才推出,但它在最受欢迎的数据库中排名第五。街区里新来的孩子正在获得大量的街头信誉,这并不奇怪为什么。凭借更快的数据访问速度、出色的可伸缩性和熟悉的 JSON 风格文档(更不用说专业的 MongoDB 支持),这些优势在大数据时代显而易见。我在 Everbridge 的暑期实习中一直在使用 MongoDB,我可以证明它的易用性和快速查询。
目前,MongoDB 面临的最大挑战包括扩大客户群和让用户为优质服务付费。作为一个开源产品,MongoDB 的商业模式建立在开发者和支持特性的基础上,这使得客户获取和保持对其成功至关重要。这一重点在首席执行官 Dev Ittycheria 上台的会议主基调上非常明显。在谈到该公司最近的快速增长(以及 2017 年 10 月 IPO 后股价飙升)后,他将注意力转移到了客户故事上。Travelers Insurance、Braze 和比特币基地等公司的高管和开发人员走上舞台,讨论如何使用 MongoDB,特别是该公司的优质云服务产品 Atlas,通过满足业务需求来帮助支持快速增长。
Hyman explained how MongoDB’s scalability has helped Braze send billions of notifications to customers.
对客户故事的巨大关注绝对让我大吃一惊。总而言之,Ittycheria 在很大程度上充当了一个主持人的角色,他很好地设计了各种各样的评价。从房间的气氛来看,这种方法显然是合格的。几乎每个我在会议上交谈过的人似乎都对这个产品感到由衷的兴奋。顾客故事无处不在——itty cheria 只是选择了最有影响力的故事。从初创公司的创始人到辉瑞或 IBM 等传统公司的员工,很明显,MongoDB 是一股不断增长的受欢迎的颠覆力量。
随着 MongoDB 4.0 的现场发布,这种兴奋感更加强烈了。在主题演讲的这一部分,首席技术官兼联合创始人艾略特·霍洛维茨率先发言,没有让大家失望。他将矛头直接指向传统数据库,开玩笑地将 SQL 称为“低劣的查询语言”,并公开了显然旨在处理关系数据库优势的特性。
MongoDB’s evolution has been driven towards Multi-Documented Transactions with the goal of improving data integrity. (source)
有什么新鲜事吗?4.0 的主要好处是它为 MongoDB 带来了 ACID(原子的、一致的、隔离的、持久的)事务,并且以一种非关系数据库闻所未闻的方式。为什么这很重要?我将借用霍洛维茨提供的一个案例,并做一些修改。
假设你有一个网上商店,在那里你出售纪念品来支持你最喜欢的当地足球队。有了 MongoDB 4.0 的交易,你所有的库存都会随着订单的到来而被准确跟踪。例如,如果一个客户从您的网站订购了一件 35 美元的运动衫,在一次交易中,客户的总额将增加 35 美元,而您的该运动衫的可用库存将减少一件。以前,事务中的故障(通常由网络故障或服务器崩溃引起)会导致重大问题,而多文档 ACID 可以防止这种情况。
在欧洲有铁杆支持者,只需要得到那些个性化的帽子?Atlas 的全球集群允许您将他们的数据放在您需要的地理位置,然后您可以在那里读取和写入,从而有助于 GDPR 合规性。通过 AWS、微软 Azure 和谷歌云平台的可用性,有丰富多样的服务器位置可供选择。
对于我们的案例来说,这就足够了。这一切对你来说意味着什么?
早些时候,我将 MongoDB 描述为一股受欢迎的不断增长的颠覆力量。那是有条件的真实。为了真正欢迎这些变化,必须了解非关系技术及其在塑造数据使用和存储的未来方面的进步。在这个不断变化的行业中保持最新。资源就在那里!
MongoDB 已经在教育领域取得了长足的进步——查看 MongoDB 大学的官方在线课程和来源认证。对于定期的技术博客帖子,你知道在哪里可以找到我。谢谢你的来访!
蒙特卡洛魔术搜索:聚会
探索卡牌游戏与人工智能的交集
我们最近看到了强人工智能(AI)在高难度棋盘游戏(如围棋和扑克)中的出现。还有一个超人的魔术:聚集(MTG)球员,但我相信这只是一个时间问题。一旦我们有了这样的球员,会有一些特别有趣的后果。
强大的游戏技巧将能够指导甲板建设。我们应该能够将一个强大的 MTG 玩家放在一张牌池上,允许它与自己进行数千次或数百万次游戏,并自己“破解 meta”(从可用的牌中构建最好的牌组)。
监控这些人工智能玩家将极大地有利于游戏设计者和玩家。想象一下这样一个世界,每一套都或多或少完美平衡,没有必要禁止……但是,不幸的是,这种技术对信用卡价格投机者也是有利的。
在这篇文章中,我简要描述了游戏人工智能的基础,并考虑了 MTG 最近的一种决策方法。我描述了一些测试这种方法的实验,并讨论了令人兴奋的未来工作。这些实验是在一个简单的 Python 模块 OpenMTG 中实现的,我希望它能够作为 AI MTG 玩家的基础。
魔法:在最小的果壳里聚集
MTG 是一种至少有两个人相互竞争的游戏。游戏的目标是通过各种手段获胜,最常见的是通过将对手的生命总数减少到 0。玩家开始游戏时除了带一叠卡片什么都没有,然后轮流抽取和使用不同类型的卡片。现在,我将集中在三种类型的牌上:地、魔法和生物。
Magic cards: A land, sorcery, and creature.
土地为玩家生产货币。每回合你可以将一个地放入游戏区(战场),它可以用来产生*法力,*可以用来执行其他动作。这些包括使用生物或魔法。
巫术执行一个动作,然后被丢弃。例如,减少对手的总生命值或摧毁对手的土地。
生物是进入战场的牌,被允许攻击你的对手或阻挡敌方攻击者。游戏不可或缺的一部分是生物之间的战斗。游戏中一些最困难的决定是关于如何用你的生物攻击你的对手,以及你如何分配你的生物去阻挡你对手的生物。
如果你仍然好奇的话,这里有更详细的规则解释:magic.wizards.com/en/gameplay…
一点博弈论
MTG 是一个零和游戏,这意味着一个玩家输了,另一个玩家赢了。在这种游戏中采取最优决策的算法是极小极大 算法。
使用极大极小算法,在游戏中的每一个状态,你都要考虑你能走的每一步,并选择最有价值的一步。如果一步棋能让你赢得比赛,它就有最高的价值。如果它导致你的损失,那它的价值可能是最低的。
如果一个移动没有导致游戏结束,你递归地考虑下一个游戏状态和与合法移动相关的值。请注意,你通常假设你的对手会采取对他们最有利的行动。
探索所有可能的游戏轨迹可能需要一段时间,因此通常会对我们希望搜索的深度设置一个限制,并构建一个衡量游戏状态承诺的函数,称为启发式函数或价值函数。这个函数在你赢的时候取最高值,在你输的时候取最低值。对于其他游戏状态,它介于两者之间,取决于你认为自己赢或输的可能性有多大。
考虑一个简单的场景,轮到你了,你有两个合格的攻击者。你的对手只剩下 1 点生命值,他们的资源也耗尽了(他们*耗尽了),*除了一个合格的阻挡者。你对手的生物可以阻挡一个攻击者,但如果攻击者未被阻挡,那么它会对你的对手造成致命伤害。
A minimax decision tree of depth 2: For this scenario, the value of winning is +1, losing -1 and states where the game isn’t over yet have a value of 0.
最小最大算法建议用这两种生物攻击,因为这保证了你的胜利。你可以通过攻击一个生物来获胜,但是你假设你的对手做了对他们最有利的事情,所以用一个生物攻击的价值和根本不攻击是一样的。
极大极小的问题是
即使上面的场景是在游戏结束时,也要考虑八种状态。此外,我们已经知道了做出完全知情的决定所需的一切。如果我们想在游戏早期做出最小最大决策,那么我们必须考虑所有潜在的隐藏信息。也就是说,对手可能持有不同的牌,我们的牌组(牌库)可能有各种不同的排列方式,我们对手的牌库也可能有各种不同的排列方式。即使知道我们对手的甲板列表,我们也可能处于超过十亿种不同的游戏状态中的一种。
这使得寻找游戏的完全极大极小解在物理上是不可能的。有一些方法可以减少在极大极小中要考虑的博弈状态的数量,例如阿尔法-贝塔剪枝。然而,这些方法已经被证明对于有太多游戏状态需要考虑的游戏来说是困难的。
全副武装的匪徒前来救援
既然为你想做的每一步棋评估游戏的每一个可能结果是一场计算噩梦,那么最好做一个概率估计。在概率论中,多臂强盗问题是一个玩家有几个选择的问题,每个选择给出一个随机奖励。这个比喻指的是吃角子老虎机,有时被称为独臂强盗。
One-Armed Bandits: The gang’s getting back together for one last heist. Photograph by Yamaguchi 先生 / CC BY-SA 3.0
每个强盗都有自己的内部参数,即平均给予多少奖励。有了关于所有参数的完美信息,玩家可以选择只与有最高预期奖励输出的强盗互动。然而,玩家得到的唯一信息是他们互动的随机奖励。根据大数法则,玩家可以更好地估计他们在每一次互动中能从强盗那里得到多少。
蒙特卡罗搜索
我们会考虑在多兵种的土匪问题中,我们作为土匪可以做出的每一个潜在的举动。内部奖励参数是如果我们选择一步棋,我们获胜的可能性。对于每一个合法的行动,我们想象游戏的其余部分在完成后会如何发展。这可以做任意次数,给我们很好的估计每个动作的力度。这就是为什么一个方法 Monte-Carlo: 做一些随机的事情很多次来得到一个有用的集合结果。
缓解上述问题的一个很好的切入点是 一文中描述的方法蒙特卡洛搜索应用于魔术中的选卡:聚会 。他们只在主要阶段使用它,但是它可以在游戏中的任何时候使用
算法如下,在可以做出决定的每个点:
- 列举所有合法的移动
- 对于每个合法的移动,在执行该移动后模拟一个完整的游戏,并记录您是赢了还是输了。这种模拟被称为卷展栏。
- 重复大量的步骤:选择一个随机的合法移动,并支持获胜的移动。执行所选的移动并执行卷展栏。
- 将上面最常选择的棋步返回为最佳棋步。
- 在真实的游戏中表演最好的动作。
关于算法的注记
在每次推出之前,未知信息(即牌库中牌的顺序,对手手中的牌)被随机化。这需要很好地猜测对手的牌。
如何在 2 中模拟游戏。很重要。现在,我们会让两个玩家每次执行一个随机动作。我不认为这是最佳的,但这将给我们一个快速原型。
三分钟后。,我们可以控制选择一个好的行动而不是再次尝试一个明显错误的行动的可能性有多大。这就是所谓的探索-开发权衡:选择尝试更多的选择以获得更好的感觉,选择哪一个是最好的,或者“耕种”看起来最好的选择。对我来说,这本质上和决定晚餐再吃披萨还是最终尝试新事物的两难境地是一样的。
一些实验
那么,蒙特卡罗搜索的表现如何呢?我用必要的游戏机制实现了来自第八版 核心游戏和的基本金银牌。
Ready-to-play decks: It makes it much easier not to have to worry too much about instant-speed actions and the stack — for now!
让我们允许黄金和白银玩家用不同的决策规则进行一百场比赛。每场比赛前,我们掷硬币决定谁先开始。如果我们让他们执行随机的动作,两个玩家看起来是平等的,尽管金牌可能会稍微占优势。
The win rates from the perspective of the gold player: In each column, we fix one search method for the Silver player and vary the number of rollouts for the Gold player— and similarly for the Gold player, per row. If there are 0 rollouts, we let the player choose any legal move at random.
请注意,在表格中,随着我们从左到右,百分比变得越来越低,从上到下,百分比变得越来越高。
增加蒙特卡洛决策会使银卡玩家更受欢迎,每次移动增加更多的滚屏会使银卡玩家更受欢迎。然而,如果允许黄金玩家执行等量的转出,则黄金玩家变得更受青睐。白银玩家在执行随机动作时,与拥有 50 甚至 10 个翻滚的黄金玩家相比,机会非常小。
结果不是决定性的,但实验表明黄金甲板更好。无论如何,蒙特卡罗搜索比随机行动要好,做更多的铺开更好。
下一步是什么?
在经典的人工智能方法中,这是一个有趣的练习,但是还可以做得更多!拥有一个完全开放的 MTG 是最理想的——至少包括玩家之间的即时速度互动,以及更复杂的触发和效果。我的代码可以在 github 上找到,我喜欢合作,把强大的人工智能带到 github.com/hlynurd/ope… 的 MTG:
实际上,改进不完全信息下的博弈树搜索是必要的。在上面的实验中,我们允许玩家互相认识对方的行李箱盖,但这通常不是事实。
探索不同的方式将先前的知识结合到搜索中会让玩家变得更强大,而不会给他们不公平的信息。如果你的对手玩的是山,那么你更有可能准备敌对的红色牌,而不是其他颜色的牌。根据格式或元,你可能想在游戏开始前立即考虑或放弃某些牌。
强大的围棋人工智能 AlphaGo ,结合了关于游戏状态的手工或常识知识,以及原始游戏状态,作为神经网络的输入。这允许自动学习一种启发式函数来引导他们在游戏中寻找好的移动。一个类似的功能,衡量“什么是好的,什么时候”对 MTG 来说也很重要。
通过结合所有这些,我想象一种强化学习方法将帮助我们建立一个在构建和限制格式方面都非常优秀的代理。
作为一个成熟的人工智能 MTG 玩家,在未来的某个地方观看一些高调的人机对抗比赛会很有趣。
致谢:感谢 Haukur Rósinkranz 对本文的建设性反馈。
蒙特卡罗树搜索
每个数据科学爱好者的 MCTS
像井字游戏、魔方游戏、数独游戏、国际象棋、围棋和许多其他游戏都有一个共同的属性,那就是可以玩的动作数量呈指数增长。随着游戏的进行,这些可能的步骤会成倍增加。理想情况下,如果你能预测未来可能发生的每一个可能的举动及其结果。可以增加自己的胜算。
但是,由于移动呈指数增长,计算移动所需的计算能力也达到了顶点。
蒙特卡洛树搜索是一种通常在游戏中使用的方法,用于预测策略应该采取的路径(移动)以达到最终的获胜解决方案。
Final output could be any one of these
在我们发现引导我们走向胜利的正确道路(步骤)之前。我们首先需要安排游戏当前状态的移动。这些动作连接在一起会看起来像一棵树。因此得名树搜索。请参见下图,了解移动的突然指数增长。
树形搜索算法
这是一种用于搜索游戏回合后可能存在的每一步棋的方法。例如:在井字游戏中,玩家有许多不同的选择,可以用树形图来表示。在下一轮将图表演变成树时,移动可以进一步增加。
通过考虑每个子移动/节点来强制指数增长树找到问题的最终解决方案需要大量的计算能力。导致极慢的输出。
💡通过制定策略可以实现更快的树搜索——给予一些节点比其他节点更大的重要性&允许首先搜索它们的子节点以获得正确的解决方案。
而是如何找到最有利于在它们子节点中具有正确解的节点。让我们来看看…
什么是蒙特卡罗树搜索?
MCTS 是一种算法,它通过选择→扩展→模拟→更新树中的节点来找出一组移动中的最佳移动,以找到最终的解决方案。这个方法一直重复,直到达到解,学习到博弈的策略。
蒙特卡洛树搜索是如何工作的?
让我们逐一查看循环的各个部分。
SELECTION
选择👆 |此过程用于选择树上最有可能获胜的节点。例如—考虑有获胜可能性的棋2/3, 0/1 & 1/2在第一步4/6之后,节点**2/3**获胜的可能性最高。
从树的当前状态中搜索选定的节点,并且选定的节点位于分支的末端。由于所选节点获胜的可能性最高,因此该路径也最有可能比树中的其他路径更快地到达解决方案。
EXPANSION
展开— 选择正确的节点后。扩展用于在游戏中进一步增加选项,方法是扩展选中的节点并创建许多子节点。在这种情况下,我们只使用一个子节点。这些子节点是游戏中可以玩的未来招式。
暂时没有进一步展开的节点称为叶子。
SIMULATION
模拟|探索🚀因为没有人知道哪个节点是组中最好的孩子/叶子。这一步将表现最好,并导致正确的答案。但是,
我们如何找到最优秀的孩子,从而引导我们找到正确的解决方案?
我们使用强化学习在游戏中从每一个孩子节点往下随机决策。然后,奖励被给予每个子节点——通过计算他们随机决策的输出与我们赢得游戏所需的最终输出有多接近。
**比如:**井字游戏中。随机决定在游戏中的前一个十字(X)旁边做十字(X)会导致赢得游戏所需的三个连续十字(X-X-X)吗?
仅供参考:这可以认为是 RL 算法的策略
π。了解有关政策&价值网络的更多信息…
在强化学习中,代理在他们的环境中采取随机决策,并学习选择正确的决策…
towardsdatascience.com](/policy-networks-vs-value-networks-in-reinforcement-learning-da2776056ad2)
对每个孩子节点进行模拟,然后是他们各自的奖励。
UPDATING | BACK-PROPAGATION
假设节点的模拟对其未来给出了乐观的结果,并得到了 1/1 的正分数。
更新|反向传播— 由于环境中的新节点及其正或负分数。它们的父节点的总分数必须通过一个接一个地回到树上来更新。新的更新分数改变了树的状态,并且还可以改变选择过程的新的未来节点。
在更新所有节点之后,通过选择树中的最佳节点→ 扩展所选节点的→使用 RL 进行模拟探索→ 反向传播更新的分数→然后最终选择树中更靠下的新节点,这实际上是所需的最终获胜结果。
比如:解决了魔方,数独的正确解法,象棋中的杀王或者
Final Required Solution of TIC-TAC-TOE
结论
而不是从数百万种可能的方式中蛮力寻找正确的路径。
蒙特卡洛树搜索算法在强化学习的帮助下,从游戏树的当前状态中选择最佳可能的移动。
感谢您阅读这篇文章。如果你有任何疑问或者只是想谈谈数据科学,请写在下面的评论中。
鼓掌吧!分享一下!跟我来。
你会喜欢的以前的故事:
Sigmoid,tanh,Softmax,ReLU,Leaky ReLU 解释!!!
towardsdatascience.com](/activation-functions-neural-networks-1cbd9f8d91d6) [## 纪元与批量大小与迭代次数
了解您的代码…
towardsdatascience.com](/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9) [## 50 tensor flow . js API 5 分钟讲解| TensorFlow.js Cheetsheet
TensorFlow API Cheetsheet
towardsdatascience.com](/50-tensorflow-js-api-explained-in-5-minutes-tensorflow-js-cheetsheet-4f8c7f9cc8b2) [## 手机上的 TensorFlow:教程
在 Android 和 iOS 上
towardsdatascience.com](/tensorflow-on-mobile-tutorial-1-744703297267) [## 用 6 个神经元玩雅达利|开源代码
#2 研究论文解释
towardsdatascience.com](/playing-atari-with-6-neurons-open-source-code-b94c764452ac)
黄画的蒙特利尔:神经风格的网络
最近,CNN(卷积神经网络)的一个非常酷的应用是设计神经网络;这些包括分离一幅图像的风格和另一幅图像的内容,然后将它们组合起来:
An example of style transfer, from the first paper to describe it, ‘A Neural Algorithm of Artistic Style’, by Gatys et. al
这里使用的风格转换方法是基于图像迭代。这意味着算法将多次改变图像(即“迭代”)以获得输出图像。
因此,主要的挑战是描述一个损失函数,它可以告诉算法它正在创建的图像是更接近还是更远离我们想要的。
这是一个不小的问题;你如何告诉一个算法,你想要图像 A 中的房子的形状,但你想把它画成约瑟夫·特纳的《牛头怪的沉船》?
突破来自于使用卷积神经网络进行图像识别;当 CNN 学习识别一幅图像是否包含一所房子时,它会学习房子的形状,但它的颜色并不重要。CNN 隐藏层的输出因此可以用来定义神经类型网络的损失函数。
我将探索风格神经网络,并赶上自 Gatys 的 2014 年论文首次介绍这一想法以来,基于图像迭代的描述性风格转移的其他发展。
这篇文章附带的代码在这里:https://github . com/Gabriel Tseng/learning data science/tree/master/computer _ vision/style _ neural _ network
内容:
目录中的每个部分都基于一篇论文(每个部分下面有链接)。我的方法基本上是尝试在 Keras(和 Tensorflow)中实现每篇论文。
- 得到风格神经网络的直觉,以及基本风格神经网络 和艺术风格神经网络
- 在整个图像中添加更一致的纹理 在基于 CNN 的纹理生成中加入长距离一致性
- 添加直方图,消除 Gram 矩阵的可变性 使用直方图损失实现稳定可控的神经纹理合成和风格转换
- 结合这一切
基本型神经网络
论文,代码(对于一个风格神经网络的基本实现,我用了这个帖子)
考虑一下传统的神经网络是如何学习的:它会对它接收到的一些数据做出一些结论,然后根据它是对还是错来调整它的权重。
风格神经网络的工作方式完全不同。CNN 的权重是固定的。相反,会产生一个输出图像,网络会调整图像上的像素。
Starting from a random image, the pixels are gradually improved to resemble an image of the Montreal skyline painted in the style of Huang Gongwang’s Dwelling in the Fuchun Mountains.
我使用 VGG 图像识别模型创建了上面的图像(我在这里探究)。风格神经网络利用了 VGG 模型的不同层擅长识别不同事物的事实。后面的层善于识别形状和形式(内容),而前面的层识别图案和纹理(风格)。
因此,如果生成的图像在 VGG 的后续图层中具有与图像 A 相似的输出,那么它可能具有与图像 A 相似的内容
另一方面,如果生成的图像在通过 VGG 早期的图层时具有与图像 B 相似的输出,那么它们可能具有相似的风格。
有了风格,还有一个额外的转折;计算格拉米矩阵,并以此作为比较,而不是纯粹的输出,更有效地传达风格。
通过量化生成图像的输出与输入“目标”图像(图像 A 和 B)之间的差异,我生成了一个函数。这给了我一个梯度,然后我可以用它来调整我生成的图像的像素(使用梯度下降)。
我可以将差异量化为生成图像和目标图像的 VGG 模型输出之间的均方误差:
Creating a loss function. The loss function, and gradient, are recalculated at every iteration. The gradient is a matrix of the same size as the generated image (with two additional dimensions, for the RGB channels), so that each pixel is changed according to the gradient value for that pixel.
注意:从现在开始,当我说我在比较图像时(例如,比较生成的图像和样式图像),我的意思是我在比较 VGG 输出。
神经网络的内容和风格方面的实际目标是什么?我可以通过从随机噪声开始,仅使用内容或损失函数来观察神经网络的每一侧试图生成什么图像,来对此进行可视化:
Starting from random noise, only using the content loss function with the Montreal skyline as content input yields the bottom left image. Only using the style loss function with the Fuchun mountains as style input yields the image on the bottom right. In both cases, the network was run for 10 iterations.
然后,将风格和损失函数结合在一起得到:
A combination of style and content, after 10 iterations. Note: as per Novak and Nikulin’s recommendations, I used the content image as the starting image, instead of random noise.
这是一个超级酷的组合图像的开始,但也有一些缺点。幸运的是,后来的研究人员已经做了大量的工作来解决这些问题。我现在将尝试实现这些解决方案中的一些,以获得一个很好的蒙特利尔图像,如黄所画。
包含长期一致性
X 的克矩阵是其自身与其转置的点积:X(X 转置)。这将 X 的每个元素与其自身进行比较,并且擅长于获得图像中正在发生的事情的全局理解。
然而,这不能捕捉图像内的局部结构。比较局部结构的一种方法是,不仅将每个元素与其自身进行比较,还将其相邻元素进行比较。有一个简单的方法来实现这一点;在计算 gram 矩阵时,只需将输出向侧面平移一点:
Credit to the original paper for this figure.
对风格损失函数进行这种微小的改变会对输出产生显著的影响:
With the same input as before (Dwelling in Fuchun Mountains), the simple act of shifting the gram matrices leads to a very different style output; the shape of the mountain is nearly visible, showing the extent to which local image structure is conserved.
直方图损失
使用 Gramian 矩阵来衡量风格有一个很大的问题,这就是不同的图像可以产生相同的 Gram 矩阵。因此,我的神经网络可能会以不同于我想要的风格为目标,而碰巧会生成相同的 Gram 矩阵。
这是一个问题。
幸运的是,有一个解决方案:直方图匹配。这是目前在图像处理中使用的技术;我获取了源图像中像素颜色的直方图,并将它们与模板图像进行匹配:
An example of grayscale histogram matching with two images. Credit to ali_m for this image.
同样的原理也可以应用到我的图像输出中。通过将我生成的图像用作源图像,将目标样式图像用作模板图像,我可以将我的损失定义为生成的图像和目标样式图像之间的差异。
Histogram matching with the target outputs. The jitteriness of the matched histogram can be attributed to the number of histogram bins; I plotted this using 255 bins. Using every unique output layer value as a bin would have been desirable, but computationally impossible (there were about 5 million unique values). This jitteriness was therefore the tradeoff for reasonable computation times.
现在,给定我的生成图像和匹配图像,我可以将我的损失定义为两者之间的均方误差。然后,可以将这个新的直方图损失添加到 Gramian 矩阵产生的损失中,以使其稳定。
将所有这些结合起来,并进行额外的改进
将这两个损失与原始内容和样式损失相结合(并调整 hyper 参数),得到以下结果:
Montreal, as painted by Huang Gongwang. The input images were ‘Dwelling in the Fuchun Mountains’ and this image of the biosphere.
天空中有一点噪音,但是考虑到我只运行了 10 次迭代(相比于一些论文中的 1000 次),这是一个相当酷的结果!
外卖:
- 放过网络!当生成最后一个图像时,我倾向于“微观管理”我的网络,一旦损耗停止下降就改变参数。仅仅让网络运行就能产生最好的结果,因为它往往会脱离那些常规。
- 调整风格神经网络的参数尤其困难,因为这最终是一种主观判断,即一幅图像看起来是否比下一幅好。此外,一些图像会比其他图像做得更好。
- 张量流很棘手。特别是,评估一个张量是确保一切正常的唯一方法;tensorflow 可能会说一个操作很好,只是在评估时抛出一个错误。
请采取代码,并作出冷静的形象!
使用 Python 的 Monty Hall 问题
借助编程理解数学证明
我们都听说过三门游戏节目的概率脑筋急转弯。每位参赛者猜猜门后是什么,节目主持人会展示三扇门中没有奖品的一扇门,并给参赛者一个换门的机会。假设并且事实上使用条件概率证明,换门会将你的机会增加到惊人的 66%。但是等等,当我进入游戏,不知道哪扇门有奖品时,我有 33%的机会获胜,当主持人揭示其中一扇门没有奖品时,这难道不意味着还有两扇门,有 50%的机会获胜吗?我为什么要换?如果你是那种不相信你在电视上听到的或者你在杂志有趣的事实专栏中读到的,但是对数学证明有好奇心的人,这里有你的答案。
证明来源:www3.nd.edu/~jstiver/Ex…
以下是你走进游戏节目时的最初概率。
现在到了棘手的部分,这是数学开始变得非常混乱的地方。假设参赛者选择了第一扇门,现在假设奖品在第一、第二或第三扇门后,主人打开第三扇门的概率是多少?这是一个需要理解的重要概念,因为稍后会使用它来推导概率。
from left 1)Probability of choosing door 3 given the prize is in 1 and your initial choice was 1. 2)Probability of choosing door 3 given 2 has the prize and you start with 1. 3) Probability of choosing door 3 given door 3 has the prize and your initial choice was 1.
第一个概率(左)回答问题:如果你选了 1 号门,奖品在 1 后面,主持人露出 3 号门的概率是多少?答案是 50%,主持人可以打开 3 号门或 2 号门,因为他们都没有奖品。但这里的关键概念是,概率是存在的,因为你从 1 号门开始。
如果你选择 1 号门,而奖品在 2 号门(中间),主持人很可能会打开 3 号门,因为 1 号门已经被参赛者选中,2 号门有奖品,所以主持人只能打开剩下的没有奖品的 3 号门。
现在,如果奖品在 3 号门,在参赛者选择 1 号门后,主持人没有机会打开 3 号门。像前面的场景一样,在这种情况下,主机将总是打开门 2。假设我们从 1 号门开始,如果 3 号门有奖,打开 3 号门的概率是 0。
现在我们已经理解了原因,让我们假设在这个例子中,主人打开门 3。3 号门没有奖品,现在我们怎么能确定 2 号门有奖品呢?
概率基于贝叶斯定理。到目前为止,我们的逻辑和推理已经创造了信息,我们将插入到这个等式中,以获得条件事件的概率。
这里要理解的主要概念是最左边的概率陈述。假设门 3 显示为没有奖品,我们最初的选择是门 1,它计算门 2 成功的概率。所以我们切换的时候成功的几率是 2/3!另一种选择;如果我们在这种情况下仍然选择 1 号门,获胜的机会将如下。
不管你从哪个门开始,同样的概率应该随之而来。条件是以这样一种方式创造的,即总是产生给定的结果。
现在是有趣的部分。让我们看看这是不是真的!
%matplotlib inline
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from time import time as TT
from random import choice as ch
import numpy as npac = []
tc = []
N = []
st = TT()
for M in range(1,10000): #Outer loop from 1 to 10000
st1 = TT()
score = []
runs = 0
cards = [1,2,3]
for K in range(1,M): # sub loop that simulates 1 to M(outerloop) games
aset = []
host = cards.copy()
hbk = ch(host) #Randomly choose as answer which host knows
aset.append(hbk)
#print("The host knows the answer",hbk)
player = cards.copy()
px = ch(player) # Contestanrs random guess
aset.append(px)
#print ("Players first choice",px)
chance = 0
for i in host: # The computation....host will eliminate P(X|DOOR) = 0
if i not in aset:
chance = i
#print ("The elimination",chance)
#print (player)
player.pop(player.index(chance))
player.pop(player.index(px))
#print ("final answe",player)
if player[0] == hbk:
score.append(1)
else:
score.append(0)
runs = K
#print ("\n\n")
ac.append(np.mean(score))
N.append(M)
en1 = TT()
tc.append(en1-st1)
en = TT()
print ("Total time for Loop ", en - st )
上面的代码模拟游戏 10,000 次,其中每一次重复都是游戏数量增加的循环。这个过程可以用不同的方式来完成,但是结果应该是相同的,但是使用上面描述的循环来获得正在玩的游戏的数量的变化是很有趣的,这确实会影响最终的结果。
这个节目中的主要逻辑是,在参赛者选择第一扇门后,主持人将消除参赛者没有选择的门或正确答案的门。如果参赛者的第一个猜测是正确的,选择显示的门是一个随机过程。但是我的计算方法是,如果元素不是正确答案,它将是列表(1,2,3)的最后一个元素。 这样做之后,出于模拟的目的,参赛者在揭示之后总是会改变他的答案。 所以这样通过这个模拟我们就有了下面的结果。
X 轴是玩的子游戏的数量。Y 轴是赢得的子游戏的平均数。在 0-100 个子游戏之间,你可以看到有很大的变化,但在 2000 个标记和接近 10,000 个标记之后,子游戏的平均获胜数集中在 64%-68%左右(最多 70)。这支持了我们最初通过贝叶斯定理得出的推论。
如果我们有 3 个以上或更少的选项,这个理论可能会有不同的规模。
code:https://github . com/siddharthapachhai/python samples/blob/master/monty hall . py
领英:www.linkedin.com/in/siddhart…
摩尔定律正在消亡。这就是人工智能如何让它复活的!
摩尔定律是表明科技行业(尤其是电子工程)指数级进步的基本定律之一,最近(更准确地说,是从 2005 年开始)放缓了,这让该行业的许多人认为这条定律不再适用。那是,直到人工智能加入了竞技场!从那以后,游戏变了,摩尔定律正在慢慢复活。
Image by author
让我们来看看人工智能是如何逆势而上的。
什么是摩尔定律?
Image by author
英特尔的联合创始人之一戈登·摩尔在 1965 年注意到,集成电路上每平方英寸的晶体管数量每年翻一番,而在几乎相同的速度下,成本却下降了一半。因此,他预测这种趋势将持续到可预见的未来。
我知道,我们中的一些人可能会想“仅此而已?好吧,不如我注意到下雨了,然后制定我自己的法律说每年都会下雨??"。但是摩尔定律不仅仅是一个模糊的猜测:它也符合一个叫做丹纳德缩放的技术缩放规则,即“随着晶体管尺寸的减小,它们的功率密度保持不变”。呃……什么?好了,翻译成英语,这就意味着:单位面积的晶体管数量会增加。芯片(现在有更多的晶体管)单位面积的功率需求将保持不变,而电压和电流将随着长度的增加而降低。预言果然实现了:电子行业一直在蓬勃发展!
晶体管不仅变得更小,而且速度更快,更节能,因此芯片现在可以在大约相同的美元和功率预算下提供至少两倍的性能。
摩尔定律成立…直到它不成立。
摩尔定律为什么会消亡?
正如 NovuMind 公司的陆建平在他的论文中简明扼要地指出的:
转折点发生在 2005 年,当时晶体管的数量继续翻倍,但速度和以前一样,既没有更快也没有更节能。
原因如下:21 世纪是电子行业将技术带给人们的时代。商业繁荣,三星和高通分别是手机和处理器的典范。但是在这个时代,科技行业的竞争对手是真实存在的!因此,一家公司提供的硬件必须继承其遗产:它必须符合规格,为每个新版本提供更好的用户体验,因此不能为了节能而进行大规模修改。
丹纳德标度方面出现了故障,因此从那时起就偏离了摩尔定律的趋势。进入人工智能,以及它如何修复情况。
人工智能是如何修改摩尔定律的
(Sourced from artificialintelligenceimpacts.wordpress.com/2019/01/27/…)
我们都知道媒体和电影业如何用机器人和过度智能的系统过度宣传人工智能。一些计算机先驱,艾伦·图灵(你可能想看模仿游戏来欣赏他的传奇)站在最前沿,开始着手一些项目,以期制造会思考的机器。然而,图灵确实意识到这将极其困难,并在 1950 年提出:
与其试图制作一个模拟成人思维的程序,为什么不试着制作一个模拟儿童思维的程序呢?如果这种大脑接受适当的教育,就可以获得成人的大脑。
这个想法发展成为深度学习。快进到 2018 年:我们已经并仍在收集海量数据。我们已经并仍在开发越来越多的高级算法(生成式对抗网络和胶囊网络就是很好的例子。)但是我们有硬件在合理的时间内处理所有这些计算吗?如果我们这样做了,我们能做到这一点,而不会让所有这些图形处理器因处理过程升温而导致另一场全球变暖吗?
azeem’s diagram explains this trend perfectly in his article
就在这里,人工智能施加了一个约束:保持功率恒定或降低功率,但提高性能……这听起来是不是有点熟悉我们刚刚看到的一些缩放规则?确切地说,通过迫使科技行业推出能够在单位时间内执行更多计算的新处理器,同时保持功耗和价格,人工智能再次强加了 Dennard 缩放,从而迫使摩尔定律复活!
如果你喜欢这篇文章,请给它一个掌声,这样其他人也可以找到它。在数据科学社区中互相帮助总是好的:)
Hans A. Gunnoo 是一名数据科学家,他的职业生涯始于电子工程,后来专攻机器学习。他还在业余时间为开源人工智能项目和关于数据科学领域最新趋势的博客做出贡献。
关于渐变的更多信息
在与 Eugene 的交谈中,我列举了一些具体的例子,这些例子可能对我最近的一页“克服消失梯度问题”有所帮助。
考虑玩迷宫游戏的递归神经网络。给出了连续的选择,要么走“右边的路”要么走“左边的路”,只有在选择少于一定数量的情况下才给予奖励。假设在所有成功的剧里,网络选择了‘右侧路径’,而失败的剧有很大一部分是从‘左侧路径’*开始的。“左”是一个错误的决定。而且是第个第个决定。这是典型梯度下降失败的地方;损失函数仅“拉动”网络的最顶层的,因此它没有“力”来改变这些早期错误**。*
随着递归变得更深(更大的迷宫,需要更长的时间来完成),梯度下降更难识别早期的错误。然而,该错误仅出现在失败的案例中。基于协方差的方法可以立即捕捉到这类误差。
现在,考虑协方差提醒我们有问题的另一个实例,不同于从输出层传播的损失函数:图像分类器,它通常(> 0.95)正确识别“猫”…然而,它失败的时间集中在一些特征的缺失周围。通常活跃的神经元反而变得沉默。(“两只耳朵”举例?)我们希望将我们的“拉力”施加到错误的神经元上,鼓励它们像正确的神经元一样放电(即使双耳并不完全可见)。
一点数学:
作为对反馈的回应,我将深入研究负协方差的一个玩具示例。除了训练中的任何其他图像之外,您的“猫”分类器在训练集中有七幅真实猫的图像(称它们为 A、B、C、D、E、F、G)。你通过你的网络发送每一张“猫”的图像,并勤勉地为你的计算保存每一个神经元的活动。根据正确或错误的分类对它们进行分类——假设,在我们的例子中,所有的 A、B、C、D 都被正确地分类为“cat ”,而 E、F、G 被标记为其他东西。只看我们的第一个神经元 x1,我们可以问:“在{A,B,C,D}中,平均激活是多少?同 for {E,F,G}?”以下是第一个神经元激活的一些样本值:
x1[A]: 0.7 __________ 精确激活值的平均值
x1[B]: 0.8
x1[C]: 1.1
x1[D]:1.0 _ _ _ _ _ _ _ _ _ _ _ _
x1[E]:0.2 _ _ _ _ _ _ _ _ _ _ 错误激活值的平均值
x1[F]: 0.3
x1[G]: 0.0_________
准确批次的平均值为 S=0.9,而错误批次的平均活化值为 R = 0.16666……它们表现不同,这可能是分类错误的原因。
现在,我们求这两个平均数的平均值:(0.9+0.16666)/2 = T = 0.53333。注意这是如何平等地对待平均值的,不管每批中图像的数量(如果有 5 个以上的错误图像,但是它们的平均值仍然是 0.16666,那么它们之间的平均值仍然是 0.53333)。
下一步是随机(替换)挑选一对,每批一对。画出这样一对的例子:x1[ C 和 x1[ F 。从它们中的每一个中减去组合平均值 T。然后,将它们相乘。即,(x1[C]-T)*(x1[F]-T)= U(C,F)。继续画线对,计算它们的 U(v,w ),一边画一边将每个结果相加。有了足够的样本后,将你的总和除以你尝试的配对数。如果和是负的,就保留它,这是围绕 t 的负协方差。
协方差值可以加到你的梯度上,当它接近每个神经元的时候。(您可以尝试使用一个非常小的因子来加权协方差,在添加到梯度之前将其乘以 0.01,并将该行为与具有更强协方差力的网络进行比较,比如 0.1…)
希望这能清晰地勾勒出一个粗略的实现!
正如 Eugene 提到的,可能仍然存在问题:
如果只有一个少数例子是误分类,而有许多神经元,那么每个神经元都有很小的“偶然协方差”机会,这仅仅是因为批量小。这可能会将网络参数推向错误的方向,并使网络处于不良振荡状态。一个有用的统计视角,只有通过探索才能得到验证!
然而,似乎在一小批错误中观察到的协方差(统计上可能,有许多神经元)将仍然在应该施加“拉力”的地方,考虑到这是错误中的共性,而不是成功。协方差不会出现在许多神经元中,就好像它们是随机样本一样;这是一个结构化的环境。我仍在试图想象一种情况:观察到负协方差,而我们不想消除它?直觉上,我们应该总是喜欢让我们错误的网络信号更像正确的,不是吗?
另一个简单的人工智能基础指南。
揭开机器学习领域复杂行话神秘面纱的系列文章的第 2 部分
Photo by James Pond on Unsplash
他的文章上接第一部分,在第一部分中,我采用了基于直觉的方法来介绍机器学习的基础。如果你还没有读过那篇文章,那么你会想先读一读。
机器学习背后的行话听起来可能很复杂,但概念惊人地直观
medium.com](medium.com/@danharris2…)
本系列的目的是揭开讨论或教授机器学习时通常出现的许多技术细节和术语的神秘面纱。我们很多人都容易成为这种谬论的受害者,因为一个话题对我们来说是新的和不熟悉的,那么它一定很难。这是一个问题,因为它立即给理解设置了障碍。
例如,如果你先发制人地认为你不会理解多项式回归,仅仅是因为“多项式回归”这个词看起来很可怕,那么很可能你要花比应该花的时间更长的时间来完全理解多项式回归。另一方面,如果当你听到“多项式回归”时,你对自己说,“好吧,我不知道那是什么意思,但我会假设给出的解释是在我能理解的水平上,我将能够理解它”,那么你可能会更容易地理解这些材料。
这就是为什么我在介绍事物的名称和沉重的行话之前解释机器学习概念背后的直觉。这与顺序解释独立算法如何工作的典型路线形成鲜明对比。
此外,事物的名称一般意义不大。如果你对一个概念有一个直观的理解,那么这比知道这个概念的名字要有用得多。理查德·费曼用褐喉画眉做了一个很好的类比…
你可以用世界上所有的语言知道那只鸟的名字,但是当你完成的时候,你会对那只鸟一无所知。你只会知道不同地方的人类,以及他们怎么称呼这种鸟。…我很早就知道知道一件事的名字和知道一件事之间的区别。
因此,考虑到这一点,我们将继续理解机器学习中的一些新概念。
模型的准确性
记住,模型这个词在这里指的是一个机器学习程序,它已经“学习”了一些关于特定数据集的东西。它不是指凯特·阿普顿!
上次,我们了解到机器学习背后的基本思想是分析一组数据点,了解数据的形状,然后使用学习到的形状来回答关于新数据的问题。
我们问的问题可以是量化的,这意味着答案应该是一个数字。一些例子是:
- 假设爱丽丝穿六码的鞋,她有多高?
- 假设我的房子有两个浴室和三个卧室,需要多少天才能卖掉?
问题也可以是定性的,这意味着答案应该是一个数字以外的东西。这些类型的问题可以进一步分为简单的是或否风格的问题和更复杂的问题。一些是或否问题的例子是:
- 根据这封邮件的内容,它是垃圾邮件吗?
- 鉴于这个肿瘤有 2 厘米长,它是恶性的吗?
- 鉴于今天下雨,明天会下雨吗?
更复杂问题的一些例子有:
- 给定这张照片中像素的颜色值,这是什么物体的照片?
- 考虑到棋盘的当前状态,我在这盘棋中的下一步应该是什么?
- 根据这条推文的内容,表达的主要情绪是什么?
现在,很有希望清楚的是,我们可以向我们的机器学习模型提出的问题的复杂性可以有很大的不同。有的比较直白,有的不直白;大多数人的一个共同点是他们很少是 100%准确的。通常,如果我们可以找到一种获得 100%成功率的方法,那么数据就有一些潜在的模式,这意味着机器学习不是真正必要的。
以上面的爱丽丝和她六码的鞋子为例。正如我们上次看到的,我们都有一个直观的认识,即高个子的人一般比矮个子的人脚大,而机器学习模型将有效地“学习”正是这个概念。然而,这条规则并不完美。一些矮的人比其他高的人有更大的脚。人类是杂乱的,尽管我们可以利用数据的明确模式,但我们的模型永远不会 100%正确。
看一下上面的其他一些例子,我们可以看到它们也有同样的特性:
- 即使是房地产经纪人也不能保证房子卖出的确切天数,因为这取决于许多外部因素。
- 甚至人类有时也很难分辨一封邮件是否是垃圾邮件。例如,看看网络钓鱼诈骗。
- 人类有时很难识别照片中的物体。视错觉可以欺骗我们的大脑,或者我们可能认为这件衣服是白色和金色的,而实际上它是黑色和蓝色的!
- 甚至人类也可能误解某人在推文中表达的情绪,因此期望计算机完美似乎不现实。
就像有些人会比其他人更擅长回答这些问题一样,一些机器学习模型也会比其他人更好。定义一个模型是否好的最重要的指标之一是它的准确性。
当数据科学家谈论模型的准确性时,他们谈论的是模型正确回答模型设计要回答的问题的频率。
但是等等!我们如何计算一个模型有多精确?如果我们能够验证一个模型是否答对了一个问题,那么这一定意味着我们已经有办法知道正确的答案是什么,这意味着使用机器来回答这个问题似乎是多余的!
这看起来有点像第 22 条军规,但事实并非如此。
确定准确性
在继续之前,我先简单解释两个新的技术术语:有监督的和无监督的学习。
到目前为止,我们在这个系列中看到的所有例子都是我们使用监督学习来训练模型的例子。这意味着我们已经有了一些数据,我们知道问题的答案是什么,我们用这些数据来训练我们的模型。
例如,为了训练一个模型,在给定鞋码的情况下预测某人的身高,我们将收集一些我们已经知道每个人的身高和鞋码的数据。这样,我们可以通过这样的方式训练这个模型,“这里有一个人穿 6 码的鞋,身高 170 厘米。”
另一个例子是训练一个可以识别垃圾邮件的模型。我们会收集一组电子邮件,我们已经知道它们是否是垃圾邮件。然后,对于每一封邮件,我们可以向模型显示电子邮件,并告诉它是否应该回答“是的,这是垃圾邮件”或“不,这不是垃圾邮件”。
这叫做监督学习。我们通过给出例子并引导它找到正确的答案来训练这个模型。
无监督学习的工作方式不同,我将在以后的文章中介绍它,所以现在不要担心它。
现在你知道什么是监督学习,我可以更容易地解释我们如何确定一个模型的准确性。方法很简单。
我们不是使用所有的数据来训练模型,而是只使用其中的一部分,比如说 80%。然后,我们可以用剩下的东西来测试我们的模型工作得有多好。因为模型以前从未见过那些额外的数据点,所以我们可以像使用全新的数据点一样使用它们,除非我们知道答案应该是什么。
然后你要做的就是将模型给出的答案与实际答案进行比较,正确的百分比就是模型的准确性。简单!
让我给你看一个简单的例子来巩固这一点。
假设你有 100 封你知道是不是垃圾邮件的电子邮件。你可以选取其中的 80 封,训练一个机器学习模型来识别垃圾邮件。如果电子邮件是垃圾邮件,该模型将回答“是”,如果不是,则回答“否”。
然后,你拿出剩余的 20 封邮件,询问模型对它们的看法。如果模型只得到其中十个正确,那么模型的准确率为 50%。如果它答对了 15 个,那么它的准确率是 75%。
了解模型的准确性是件好事,但这不是衡量模型好坏的唯一标准…
精确度和召回率
说到一个模型有多好,准确性并不是最重要的。除了准确性,还有两个不太为人所知的术语非常重要:精确度和召回率。
与准确性不同,准确性和召回率可能更难记忆和直观理解——这可能是准确性通常是首选指标的原因——但通过几个例子,它们都有意义。
为了将这些概念放到上下文中,让我们从上面看下面:根据这封邮件的内容,它是垃圾邮件吗?
如果你的收件箱和我的一样,我收到的垃圾邮件的数量远远超过非垃圾邮件的数量。如果我选择我的电子邮件,并训练一个机器学习模型来将它们分类为垃圾邮件或非垃圾邮件,那么我可能会得到以下模型:
Results for spam classifier
该表显示,模型确定 70 封垃圾邮件实际上是垃圾邮件,但其中 5 封不是,20 封非垃圾邮件实际上不是垃圾邮件,但其中 5 封是。
该模型的准确度是它得到的正确数字——绿色的比特——除以电子邮件总数:90/100,即 90%。现实生活中的垃圾邮件检测器比这好得多,但 90%听起来没那么糟糕。
所以,精度很容易计算,也很直观,但是精度呢?不像 accuracy,我们使用上表中的所有数字进行计算,precision 只使用其中的两个数字,所以应该更简单!
精确度的公式是(相当令人困惑的)真阳性的数量除以阳性总数。这里的“肯定”一词指的是模型认为是垃圾邮件的电子邮件,也就是模型回答“是”的电子邮件。
Precision of spam classifier
这实际上意味着,在上表中,我们只考虑顶行中的两个值(模型回答“是”),我们将 70 除以 75(该行的总和)— 93%。稍后我会进一步澄清这一点,但首先,关于回忆。
召回类似于精确。它也只使用两个值,但与 precision 不同。召回的公式是真阳性的数量,除以真阳性的数量加上假阴性的数量。
Recall of spam classifier
这实际上意味着,在上表中,我们只考虑左列中的两个值,我们将 70 除以 75(该列的总和)— 93%。
那么,现在我们知道了如何计算这两个值,它们直观地意味着什么?
模型的精度是一种描述有多少被模型认为是垃圾邮件的电子邮件实际上是垃圾邮件的方式。93%的值意味着每 100 封模型认为是垃圾邮件的邮件中,有 7 封实际上不是。很容易想象这会有多烦人。尽管准确率似乎高达 90%,精确度似乎高达 93%,但这个模型并没有那么好。
为了看到这一点,不要发送垃圾邮件,考虑一个决定患者是否患有癌症的模型。在这种情况下,上面的七封电子邮件实际上是七名健康的患者,他们被告知患有癌症。这 93%精度的成本最终给人们带来了很多痛苦。
该模型的召回是描述有多少实际垃圾邮件被检测为垃圾邮件的一种方式。值为 93%意味着每 100 封垃圾邮件中,模型会认为其中 7 封不是垃圾邮件。这将导致垃圾邮件慢慢进入你的收件箱。还有,烦。
同样,在检测患者癌症的模型的情况下,这一次的结果甚至更糟。这七封邮件实际上是七个患有癌症的病人,但被告知他们没有!
简而言之,当误报的成本很高时,精度是一个很好的值,即当答案实际上是“否”时回答“是”的成本。当假阴性的成本很高时,即当答案实际上是“是”时回答“否”的成本,召回是一个很好的值。
包扎
就像上一篇文章一样,我将涵盖我们在这里学到的新东西,希望能在你的脑海中巩固它们。
**量化模型:**这些是机器学习模型,用数字回答问题,例如 150cm、42 天、20 辆车等。
**定性模型:**这些是机器学习模型,它们用非数字的答案来回答问题,例如“是和不是”、“下雨、下雪或晴天”、“高兴、悲伤、兴奋或生气”等。
**准确性:**模型的准确性描述了模型正确回答问题的频率。
**监督学习:**这是指我们使用已经知道答案的数据来训练模型,以便我们可以在训练中指导模型。
**精度:**模型的精度描述了有多少模型的“是”答案实际上是正确的。
**召回:**模型的召回描述了模型得到了多少应该是“是”的答案。
最后两个可能需要一些时间让你理解,所以我建议你先做几个例子,直到你理解为止。
我还想介绍更多的内容,但那要等到下一篇文章了。感谢阅读!
如果你喜欢这篇文章和它的格式,你可能想看看我的系列…
“一系列简单指南”正是它所说的。
medium.com](medium.com/series/a-se…)
更多的钱,更多的问题:分析 PAC 资金对美国国会的影响
总结
2010 年,美国最高法院裁定,宪法不能禁止公司和工会宣传一名候选人胜于另一名候选人,这实际上解除了对竞选资金的管制。公民联盟诉联邦选举委员会案中的这一决定备受争议,不得人心;80%接受民意调查的美国人反对这项裁决。公民联盟的结果和 2014 年麦卡琴诉联邦选举委员会案的裁决导致了美国目前的状况,越来越多的资金涌入国会选举。2018 年中期选举的预计总成本 近 52 亿美元,成为有史以来最昂贵的 。
这种情况激发了一个项目,在这个项目中,我使用自然语言处理和机器学习技术对美国国会现任成员的推文主题进行建模,然后分析他们收到的 PAC(政治行动委员会)资金数额如何影响他们的推文内容。我发现,国会议员从政治行动委员会获得的竞选资金越多,他们就越不可能在推特上谈论有争议的政治问题。下面这篇博客文章介绍了这一努力的背景,提供了该项目的概述,并指出了选民可以用来在 11 月 6 日投票日之前了解现任国会议员的资源。
快速事实
- 即将到来的中期选举预计总成本为 52 亿美元。
- 2018 年,一小部分美国人(0.42%)贡献了大部分竞选捐款(70.8%)。
- 2015 年,76%的美国人认为金钱对政治的影响比以前更大。
- 国会议员花 50%的时间筹款。
- 盖洛普民意调查显示,美国人目前认为美国面临的最重要的问题是对政府的不满和糟糕的领导。
重点项目调查结果
- 在最后一次竞选活动中,美国参议员平均从政治行动委员会获得 250 万美元。
- 在 2018 年中期选举中,美国众议院的普通成员从政治行动委员会手中接管了$600,000⁴。
- 从 2007 年开始,Congress⁵的现有成员已经发了超过 180 万条 times⁶微博。
- 在最近的竞选活动中,推特上没有政治争议的国会议员平均从政治行动委员会多拿了 8 万美元。
项目链接
推特上的国会
鉴于越来越多的钱被用于政治竞选,以及美国人对金钱在政治中的影响力的担忧,国会不受欢迎也就不足为奇了;只有 21%的美国人赞同国会正在做的工作。国会议员有什么要为自己辩护的?他们越来越多地使用 twitter 与他们的基地直接沟通。参议员卡玛拉·哈里斯、马尔科·卢比奥和伊丽莎白·沃伦每个人在推特上都有数百万粉丝,并且已经发了数千次推特。像许多其他国会议员一样,他们使用自己的 Twitter 账户作为媒介来展示自己的个性和政策立场。
社交媒体在阿拉伯之春和黑人的命也是命的跟风运动中所扮演的角色,提供了大量证据,证明社交媒体上的政治话语具有真实的、切实的影响。此外,越来越多的学术界关注美国政客的推文。这些努力包括分析州政府成员在推特上的政策议程;国会在推特上做什么;以及政治家讨论的话题和其追随者讨论的话题之间的关系。这些努力为我的分析提供了部分信息和灵感。
分析国会的推文
为了开始这项工作,我使用 Jefferson Henrique 的 GitHub 知识库“获取旧推文”来收集来自第 115 届国会所有活跃成员的官方推特账户⁷的所有推文。Henrique 用 Python 编写了“获取旧推文”项目,它使我能够绕过 Twitter API 的一些限制。我总共从第 115 届国会的 522 名议员那里收集了超过 180 万条推文。⁸ 然后,我使用熊猫进行探索性数据分析并清理数据,采取的措施包括调查国会议员的推文数量以及这些推文的参与度(如转发、点赞),并删除太短而没有太多意义的推文。
(The Tweet in the Dataset with the Most Likes and Retweets)
下图显示了各州和高音喇叭所属党派的数据概况。圆圈的大小反映了推文的数量,颜色代表了推文者的政党。圆圈的大小与每个州的人口数量大致相关。例如,加利福尼亚州、纽约州和得克萨斯州的国会议员的推文数量相对较多。然而,这种相关性也有例外。佛蒙特州参议员伯尼·桑德斯发送了相对较多的推文,因此他的家乡被过度代表。
在清理和探索数据之后,我使用一个名为自然语言工具包的 Python 库对数据进行了预处理。我对文本进行预处理的步骤包括删除标点符号和格式(例如,单词的首字母大写),对每条推文进行标记(即,将每条推文的文本分成单个单词的列表),删除停用词(即,像这样的单词,这些和只有出现频率高,语义意义不大),以及词干。此外,我使用自定义函数来删除链接、标签和提及。
(Example Tweets Before and After Preprocessing)
在对 Tweets 执行主题建模之前的最后一步是转换预处理文本语料库的形状。为此,我使用了 scikit-learn 的计数矢量器,它输出一个矩阵,其列对应于文本语料库中的唯一单词,其行对应于每个单独的 Tweet。这个过程可以将每条推文与整组推文进行比较。然后我转置了矩阵,使其成为术语文档格式,并为主题建模做好了准备。
主题建模是一种机器学习/自然语言处理方法,它依赖于统计手段,基于文档和语料库级别的单词出现频率,从文本中获取含义。有多种方法对文本的主题进行建模,包括机器学习的监督和非监督方法。
为了对国会推文的主题进行建模,我使用了一个名为 gensim 的 Python 包来执行潜在的狄利克雷分配(LDA)。LDA 是一种无监督学习方法,由大卫·比尔、安德鲁·乔丹和吴恩达(前谷歌员工,现任百度首席科学家)创建。 **LDA 是一种生成概率模型,其假设文本语料库可以由给定数量的主题来表示,并且其中的每个文档可以由全部主题的子集来表示。**LDA 识别的主题由大量在文档中频繁出现的单词表示(在本例中为 Tweet)。
在我上面提到的努力中,LDA 是为美国政治官员的推文主题建模的首选方法。Gensim 的 LDA 允许轻松调整模型超参数,包括它应该从文本中提取的主题数量以及模型应该对文本进行学习的次数。国会推文最明智的表现包括 50 个主题,我调整了模型,对文本进行了 20 遍学习;训练时间大约花了八个小时。然后,为了便于解释,我缩写了每个主题的原始组成词。
(View the full list of topics in this GitHub repository)
介绍活动财务信息
接下来,我从响应政治中心(Center for Responsive Politics)的网站opensecrets.org上收集了竞选财务数据,该网站被描述为**“联邦竞选捐款、游说数据和分析的最全面资源。”**响应政治中心(Center for Responsive Politics)的数据来自联邦选举委员会(Federal Election Commission),我使用公开秘密应用编程接口(Open Secrets API)收集了所有现任国会议员的竞选财务信息,并观察了他们在推特上谈论的话题如何随着他们在上次竞选活动中接受了多少 PAC 资金而变化。
最初,我把分析的重点放在相关主题和部门之间的关系上。我的假设是,某个国会议员从某个部门拿走的越多,他们就越会(或者可能更少)在推特上谈论它。然而,这种类型的分析证明是不确定的,因为没有出现明确的趋势。
但是当我看着从政治行动委员会拿钱最多和最少的国会议员时,我注意到一些有趣的事情。例如,参议员 Pat Toomey、Rob Portman 和 Tim Scott 在他们最近的竞选中分别从政治行动委员会获得了近 600 万美元,他们推特上最常见的话题完全没有政治争议。
(Common Topics Include Meetings, Receiving Honors, and Congress itself)
另一方面,在上次选举中没有从政治行动委员会拿任何钱的国会议员的推文的主题表明了明显的差异。虽然这两个群体之间最常见的话题有所重叠,但众议员 Jared Polis、John Sarbanes 和 Francis Rooney 更多地在推特上谈论政治上有争议的问题。他们在推特上最常谈论的话题是医疗保健、罗伯特·穆勒的特别调查和经济。这种实质性的话题在前一组中是缺乏的。****
我进一步探究了这种关系,发现不幸的是,这些国会议员代表了一种模式。为了得出这个结论,我根据推文是否涉及政治争议话题对推文作者进行了分类,并计算了每个群体成员收到的 PAC 资金的平均金额,我发现国会议员拿的钱越多,他们就越少在推文中谈论政治争议问题。平均而言,在推特上谈论非政治争议话题的国会议员每次竞选都会从政治行动委员会多拿走 8 万美元。我推测这是由于有意识或无意识的努力,使他们看起来更适合他们的捐助者。
结论
这项努力是为了调查政治行动委员会的资金对美国国会的影响。不幸的是,PAC 资金似乎与国会议员谈论(或至少在推特上)重要政治问题的倾向负相关,这些问题对他们的选民最重要。
这一结论加入了声称我们的当选官员过于依赖竞选捐款的声音。例如,剑桥大学的一项分析“表明代表商业利益的经济精英和有组织的团体对美国政府政策有实质性的独立影响,而普通公民和基于大众的利益团体则很少或没有独立影响。”此外,最近的媒体报道都集中在那些公开拒绝接受 PAC 资金的国会候选人身上。
11 月 6 日是中期选举,还有两天就要举行了,美国人能够影响国会言行的一个可靠方法是批判性地思考对他们来说重要的问题,并投票给那些不依赖政治行动委员会捐赠者,而是关心美国人民的候选人。
后记
非常感谢 Jefferson Henrique,他写了一个如此优秀、强大的仓库来获取旧推文。没有他,这一努力是不可能的。
虽然我在分析中关注的是政治行动委员会的捐款,但我并不是说个人竞选捐款不重要。在这次中期选举周期中,个人捐款超过 16 亿美元。
作为这项工作的补充,我创建了一个互动地图,显示了众议院每位现任议员在 2018 年中期选举前的竞选活动中收到的 PAC 资金数额。
(Link to Interactive Map)
脚注
- 这个总数包括政治行动委员会和个人直接捐赠给国会竞选活动的资金,以及支持候选人但与候选人无关的支出。
- 政治上有争议的话题在这里被定义为有共同的,也许是党派的政治分歧。有争议的话题包括“人权”和“共和党废除奥巴马医改”没有政治争议的话题包括“竞选途中的停留”和“参观景点”。
- 考虑的竞选周期包括 2014 年、2016 年和 2018 年结束的竞选周期——取决于参议院的级别。美国参议员任期 6 年,其中三分之一每两年开始
- 竞选资金总额截至 2018 年 10 月;最终数字可能会更高。
- 由于辞职,死亡,特别选举和其他情有可原的情况,第 115 届国会的完整名单是一个移动的目标。在可能的情况下,我使用最新的在职人员名单。
- 推文总数截至 2018 年 9 月。
- 在可能的情况下,我使用国会议员的官方推特账户。一些国会议员(如伯尼·桑德斯、科里·布克)有多个 Twitter 账户。
- 并非所有国会议员都发了推特。
作者联系信息
如果你想谈论数据科学或政治,请在 LinkedIn上添加我,或者在 edmunchitwood@gmail.com 给我发电子邮件。
更多关于科学、真理和一致性的内容
根据“科学方法”的说法,“科学”分为四个步骤:
- 建立一个模型
- 捕捉相关数据
- 寻找模型和数据之间的偏差。
- 回到第一步,修改模型,看下一轮偏差是否减小。
人们可能会对此稍加修改,提出“工程方法”,其中重点不是模型和数据之间的一般偏差,而是偏差的特定子集:您希望建立一个更好的老鼠陷阱,即使它在捕捉老鼠方面更差,因此相对于老鼠的偏差会进一步减少,即使代价是增加相对于老鼠的偏差,或者类似的事情。
第三步与一致性有关:一致性越强意味着偏差越少、越小。如果第 2 步执行得当,也就是说(训练)数据是现实的无偏(且足够大)样本,则模型更接近现实,即“更真实”其他条件不变的情况下,更一致的模型是更好的模型。
但是“平等对待一切”是一个含糊的词。每当模型根据不同的(训练)数据进行训练时,根据定义,所有的东西都不相等。此外,统计学家知道,原则上,任何样本都有误差最小化最优:样本本身,最终过度拟合。这就是为什么教科书统计学不鼓励在模型中添加更多的部件。这是各种验证技术背后的基本原理。
选择(即使是无意的)训练集、测试集和实际应用集(据我所知,我意识到没有“应用集”这样的通用术语,至少没有与训练集和测试集相提并论。我觉得应该有。)的模型,但是,迫使我们回到步骤 2。如果发现一个模型对于某个数据子集是稳健的,以一组条件为特征,那么它就和我们所拥有的“真理”一样接近,但只是以这些条件为条件。如果某个森林中的骑士说“你”,并且他们一直这样做,那么“那个森林中的骑士说‘你’”的模式是一个很好的模式——只要你不试图将它应用于所有的骑士。除了没有任何逻辑基础的推断,我们不知道一个普通骑士无条件地说了什么。**
换句话说,这个模型的实际应用主要取决于第二步和第三步之间的相互作用。如果我们天真地根据某个森林中的骑士的数据来训练模型,但试图根据其他森林的数据来测试它,那么我们会错误地拒绝它。我们应该小心比较训练集和测试集:如果测试集似乎使您在训练集中发现的内容无效,问题可能是测试集实际上不同于训练集。对于更像训练集的测试集子集,模型可能仍然成立(同样,对于更像测试集的训练集子集,它以前不成立)。训练集和测试集相同的(隐含)假设是我们需要参与的“故意忽视”的一部分(我喜欢 Weisberg 的措辞转变!)为了让事情简单化。但我们需要记住,这可能不是真的。当然,就算模型好,也只是对有问题的森林骑士好。去另一个森林,那里的骑士不会知道“你”是什么意思。不在天魔森林的时候,就不要去烦天魔模型了。
因此,如果来自训练集和测试集的结果不匹配,我们可能有两种可能性:
- 样本足够接近→模型不好。(按照步骤 3)
- 样本不同→模型是好的(也许),但只是有条件的(按照步骤 2。)
这两种可能性都需要进一步调查。在这个阶段,实验可能是必要的,也可能是不必要的。在发现训练集和测试集之间的差异以及该模型仅适用于特定森林中的骑士的可能性之后,您真正需要的是获得更多关于该森林的条件观察(因为您已经有大量来自骑士而非该森林的观察。)你面前的问题就是简单回答是否:P(Ni|forest X) >>>> P(Ni|!森林 X)。也许您已经有足够的数据来回答这个问题,至少暂时有,或者没有(也就是说,您没有足够的数据来“测试”它,因为您已经用完了旧的测试集)。但是,如果您可以从 forest X 获得新的数据,就不需要进行全面的实验。
那么,对“真理”的统计识别需要是一个微妙的过程:我们不仅要识别无条件地说“一致”的观察,还要识别“有条件一致”的观察。大部分的努力都需要投入到“有条件”的成分中。可能有一些普遍一致的真理是可以观察到的,没有任何附加条件,但如果是这样,它们将很容易被发现,而不是花哨的“科学!”需要去发现它们。但是,当我们寻找条件真理时,抽样就成了关键:条件真理(更多地)适用于现实的特定子集,而不是其他子集。当我们找到合适的样本时,我们会知道的。如果我们不这样做,我们就会搞砸,看不到存在的东西——只是因为它们不在任何地方。
PS。从一个非常普遍的经历中出现的一个相关点(当然对我来说——大概对其他人来说)是,模型的用户是否有可能记录他们的模型在何时何地有多错误。作为事后分析的手段,对于统计学的更传统的用途来说,这很容易:我们有数据,除了“过去”事件的记录之外,我们不会假装这些数据有用,在我们拟合模型之后,我们可以立即说出偏差在哪里。对于产生定量预测与记录保存相结合的数据,即使在创建模型时“应用数据”尚不存在,也可以追溯研究不匹配的程度。对于其他各种应用程序,尚不清楚是否有可能对模型进行回顾性审查。我经常收到错误的定向广告、搜索结果或推荐,我想我们都遇到过这样的事情。如果我在另一端,我想得到一些关于算法有多错误的信息,对于哪些观众,在什么条件下。这些信息似乎根本不可能以有意义的方式获得。诚然,我们偶尔会有机会报告调查结果/结果/广告/建议是否恰当,但我不认为所有用户和环境的回复率是随机的。
有时,错误是显而易见的:我不懂越南语,所以越南语广告显然是错误的。但我会说西班牙语,能读一点德语和匈牙利语(只是举例,不一定是现实的反映)。因此,即使匈牙利语广告可能是“错误的”,因为我不能很好地阅读它,我也没有寻找信息,它可能会意外地产生一些我可以利用的相关信息,即使我没有积极地寻找它。通常,用户自己不一定知道他们在寻找什么。我们不知道普希金诗歌的“正确”翻译是什么(通常,这才是重点)。“正确的答案”通常不存在于精确定义的形式中,除非我们错误地假设它们存在于不存在的条件下(同样,凯恩斯的选美比赛游戏在这里是恰当的:参与者认为美的共同标准是什么的共同期望,而不是他们真正认为什么是“美”,往往会驱动“市场”。更重要的是,这种“共同但错误的信念”比事实更加一致。然而,问他们什么是“美”是没有意义的,因为它没有一个明确的、普遍定义的答案。)即使我们知道用户和算法输出之间的匹配,量化“错误”可能有点棘手。但大多数定向广告、搜索结果和推荐甚至无法与用户真正想要的东西匹配。
这似乎特别令人不安:如果你不知道你的模型与现实有多大的误差,也不能估计误差在不同条件下是如何变化的,你怎么能做科学呢?
不仅仅是算法——在工业中建立模型
本文原载于【blog.zakjost.com】
由于数据科学博客圈几乎完全专注于机器学习算法的本质细节,你会被原谅认为这是作为一名 ML 从业者最重要的方面。但是那些在行业中建立模型来解决实际商业问题的人知道这只是工作的一小部分。学术人员可能在本地构建模型,并根据基准数据对其进行评估,以获得可发布的结果,而工业界的人员正在将模型集成到一个更大的系统中,这有很多失败的机会。这篇文章是关于在这种环境下你需要做的其他重要的事情。
垃圾进,垃圾出
在工业界,当有人问一个模型表现如何时,得到的回答往往是:让我做一些分析。如果这是您的情况,您将面临不必要痛苦的风险。
有一天,一些人将审查业务度量,并且不可避免地发现一个主要问题。他们会说,“你的模型说所有这些东西都是 X,但实际上它们是 y。这没有任何意义,而且每天要花费我们数十亿美元!”
当事实证明基于某个模型的决策是糟糕的时,就会引出几个明显的问题:我的模型坏了吗?我的数据管道坏了吗?我建模的东西变了吗?回答这些问题应该不比看仪表盘难。这给我们带来了重要的事情 1。
重要的事情 1:除非你有实时的性能监控,否则你还没有完成
(“实时”的定义将取决于您的业务问题,并受到标签成熟度的限制)。这听起来可能真的很难,但是除非你在一个有极端数据孤岛的组织中,否则你可以在几个小时内构建一些东西。你只需要:
使用 Docker 图像,我在大约 3 个小时内构建了整个堆栈,尽管以前从未使用过这些工具。即使您是唯一可以访问它的人,这个练习仍然值得您花费时间,因为这是一项时间投资,当出现问题时,它会在早期向您提供可操作的信号。您不仅能够更快地排除故障,而且通过观察模型的时间行为,您将对模型有更多的了解。
结果可能是你的模型是好的,但是进入你的模型的数据才是问题所在。好消息:这也很容易测量,你只需将其连接到你的新仪表板解决方案。一旦有了用于性能监控的监控仪表板/数据库设置,添加这样的新视图就变得容易多了。这是重要的事情。
重要的事情 2:监控你的模型输入和输出
太好了!您可以监控模型的输入、输出和性能。现在你可以在东西坏了的时候检查它!或者每隔一分钟检查一次,确保一切正常。*对吗?*错了。
重要的事情 3:在你的显示器上设置闹钟
如果你费了很大的劲来构建将所有重要指标放在一个地方的东西,为什么不构建一些简单的规则来在事情变得不可靠时提醒你呢?得到一个关于你的一个重要输入变量突然丢失的警报,远比从这个问题给企业带来的所有痛苦中间接地发现它要好得多。警报将允许您联系企业并说,“注意:有丢失的数据,它导致我的模型行为怪异,这将导致错误的决策和数十亿美元的损失,所以让我们暂停事情,直到数据问题得到解决。我已经将此事上报给负责数据的团队。”
保持新鲜
由于各种原因,模型几乎总是随着时间而退化。最终,您可能会希望使用最新的数据来重新训练您的模型。既然你有一个奇特的仪表板可视化性能,至少这应该是预期和计划的,而不是对紧急问题的反应。但是有一个更好的方法,这是下一个重要的事情。
重要的事情 4:自动化模型再训练和部署
这不仅使你的模型保持新鲜和高性能,而且这是一项应该在年内获得回报的投资,即使在你离开团队之后。
它如何节省您的时间?因为技术债务会引发更多的技术债务。当一个团队在运营痛苦中溺水时,他们倾向于反动,去扑灭紧急的大火。这意味着他们可能不知道模型降级了,直到它引起了问题,然后他们尽可能快地修复这个问题。而“尽快”这一部分导致了额外的技术债务。
与自动刷新的模型形成对比。如果您从一开始就知道这是一个需求,那么您会做出设计决策,并在整个过程中支持它。因此,与其用一个大的 Jupyter 笔记本从您的笔记本电脑中取出一个 csv 文件,然后吐出一个模型工件,您可以用一些黑魔法将其部署到生产中,不如将您的数据提取过程从您的模型构建过程中模块化,并自动跟踪和部署模型。有了这一点,模型再培训项目从几周/几个月变成了每天或每周进行,没有人参与。
这是另一个非常强大的原因:人们倾向于从头开始重建,而不是逆向工程。如果您不自动化一个过程来保持模型的新鲜,那么您的工作很可能在您不积极维护它的时候就被丢弃了。如果你的解决方案在你离开后继续增值,你的影响力会被放大。
当我们谈到这个话题时,你可以做最后一件重要的事情,让你的工作不至于很快变得无关紧要:
重要的事情 5:文件,文件,文件
不同的公司有不同的文化规范来保存信息。不管是什么,做好,做好。早点开始,不要让它成为你会回来做的事情之一,因为你可能永远不会回来。撰写正式的白皮书,记录您的设计决策和分析。还要创建一个更容易访问的 wiki 页面,或者其他面向下一个可能需要维护的人的页面。从头开始重建系统的主要原因之一是因为原始系统没有很好的文档记录。
摘要
因此,这里有 5 件重要的事情,它们将使您的工作保持稳健和相关,同时为您节省大量时间,否则这些时间会浪费在不必要的操作消防上:
- 实时监控您的模型
- 监控您的模型输入和输出
- 监视器上的警报
- 自动化模型再训练和部署
- 记录你的工作
【blog.zakjost.com】您可以在 找到我所有的内容并订阅
早上,下午,还是晚上?使用数据驱动方法对一周中的时间进行聚类。
在律师事务所,我们的主要目标是利用我们广告预算的最佳分配,将相关案例导向我们的合作律师事务所。数据科学团队通过优化我们的 Adwords 竞价,在不超出预算的情况下最大限度地增加我们收到的查询数量,从而为这项任务做出了贡献。在这篇文章中,我将简要介绍这个问题,并详细讨论解决方案的一部分:为什么我们使用历史数据对一天/一周的时间进行聚类。
数据科学团队的中心项目之一是构建最佳模型,以预测广告支出作为出价的函数。出价是我们在这个模型中可以控制的最重要的自变量之一。出价定得太高,我们会很快花光我们的月度预算,错过本月晚些时候的潜在商机。出价定得太低,我们的广告可能无法充分展示,从而无法获得足够多的询盘发送给我们的合作伙伴公司。
当设置出价,我们这样做在每周每小时的水平。因此,在构建模型时,模型中将有额外的 168 个分类变量来解释一周中的每个小时。由于多种原因,这是不希望的。在一个模型中有这么多的变量使得它更难解释。在一个模型中有这么多分类变量意味着训练的设计矩阵将有大量的零,这些零必须用于计算。此外,每个类别中必须有足够的数据来训练和验证模型。当我在 USF 大学学习时,我有一位教授,他在建立回归模型时更喜欢“简约”而不是复杂。在这一点上,让我们讨论一下 Lawfty 的数据科学团队为降低我们的投标模型的复杂性所采取的方法。
我将首先概述我们用来训练和验证模型的数据格式。然后我将讨论我们如何使用 KMeans 聚类算法来减少我们在模型中使用的分类变量的数量。作为这篇文章的总结,我将展示一些聚类前后的标准化数据图,以直观地说明为什么这样做。
我们训练模型的主要数字特征是成本、点击和印象。数据的粒度是每小时一次。我们获取这些原始数据,并使用公式day _ of _ week * 24+hour _ of _ day为一周中的 168 个小时之一添加一个标签。现在把时间组合在一起,为什么不按照“早上”、“下午”、“晚上”来组合呢?这似乎是一个自然的分组,但是基于的分析,我们知道一周中的某些时间在成本、点击和印象方面有相似的行为。因此,我们使用 KMeans 聚类算法来寻找将一周中的小时分组的最佳方式,这样我们就可以将分类变量的数量从 168 减少到更小的数字 k 。注意,为了确定聚类数 k ,我们对照实际发生的每周成本交叉验证一组 k 值的每周预测成本,并选择给出最小平均绝对误差的 k 。我们使用这种方法,而不是理论方法,如肘和差距,因为这为我们提供了一种更加以业务为中心的方法来衡量模型的成功。
现在,我们已经介绍了如何使用 KMeans 通过对一周中表现相似的时间进行分组来减少模型中的分类变量的数量,让我们来看看这种方法的一些实际应用,以直观地了解正在发生的事情。
考虑以下情节。
这是我们按一周中的小时汇总的数字数据,总共 168 个数据点。使用上面提到的方法,我们发现对于这个特定的市场,12 个聚类给出了最小的平均绝对预测成本误差。
现在,一周中的每一个小时都有潜在的周期性。可以说,它们是环绕的。周日中午 12 点和周六晚上 11 点“接近”。因此,假设我们也在单位圆中加入一周中的小时的映射。参见本或本帖子。结果给了我们下面的情节。
我们可以看到,一周中有几个小时的成本较高,同样,一周中有几个小时的成本较低。用 z 轴上的点击和印象产生类似的图给出类似的结果。一周中有几个小时的行为与其他时间不同。这就是我们希望通过时间的聚类来捕捉的内容。
现在我们有了小时的聚类,然后我们可以使用这些小时聚类作为模型中的分类变量来生成回归模型。我们已经将特征空间的维度从 167+(一周中的小时加上包括的任何其他数字/分类特征)减少到 3+(小时聚类标签和其他特征)。这为我们提供了更强大的模型,因为当聚合到 3 个小时的聚类时,我们现在有了更多的数据点,而不是将一周中的每个小时都放在自己的类别中。
目前,我们仍在运行基于上述基于容量的指标的算法。但是,我们进行的分析让我们相信,添加更多基于价值的指标。当我们实现了这些新的添加时,请继续关注更新的帖子。
与此同时,请随时在脸书、 LinkedIn 和我们的主页上找到我们。
Lawfty 开发技术,将律师和律师事务所的数字广告变成一门科学。使用搜索引擎营销和社交媒体,我们的技术平台为下一代成功的人身伤害和大规模侵权律师铺平了道路。
镶嵌图和卡方检验
在数据科学项目中,从数据中获得更多见解非常重要。有一个特定的阶段,即项目的第一个阶段,以数据分析为目标:数据探索阶段。在其他种类的分析中,最有趣的是双变量分析,它找出两个变量之间的关系。如果这两个变量是分类,那么用于分析它们之间关系的最常见的图是镶嵌图。乍一看,它可能会显得有点混乱。不了解一些统计概念的人可能会错过这个图能给我们的重要信息。因此,在这篇文章中,我们将会更深入地探讨这些概念。
马赛克图
本帖中使用的数据集可以从这里下载。每一行都是在汉堡店完成的交易。正在分析的两个变量如下:
- SELL_CATEGORY :分类变量,标识所售产品的类别。类别“0”标识单一产品;类别“2”标识组合的
- COKE :一个分类变量,标识销售的组合产品中是否存在 COKE。因此值“1”标识焦炭的存在;“0”表示缺席
以下简单的 R 代码将为变量 SELL_CATEGORY 和 COKE 生成镶嵌图。打开 RStudio (或 R Tools for Visual Studio )并运行它:
下面是由此产生的情节:
fig. 1 — Mosaic plot for SELL_CATEGORY vs COKE
镶嵌图基于条件概率。为了得到前面图背后的数字,需要一个列联表。它也被称为交叉表或双向表,用于总结几个分类变量之间的关系。只需运行下面的代码来获取我们案例的列联表:
结果就是这张漂亮的桌子:
fig. 2 — Contingency table for SELL_CATEGORY vs COKE
镶嵌图从行开始递归计算边际比例。在我们的例子中,我们从销售类别开始。单元的宽度分别与单一产品和组合产品的百分比(焦炭中的总百分比,在图 2 中以深蓝色表示)成比例。事实上,“0”和“2”的 SELL_CATEGORY 的总数是 1355 和 4065(总观察值),所以 25%的产品是单品,75%是组合品。
现在在销售类别中(绿色),它计算属于每个可乐类别的比例(“0”、“1”)。所以盒子的高度与销售类别中可乐的百分比成正比。事实上,如果卖出类别是“0”,则不包含可乐(COKE =“0”)的交易是 1355;含焦炭(COKE = "1 ")的为 0。因此,对于单一产品,100%的交易不包含可乐,0%的交易包含可乐。相反,如果卖出类别是“2”,1355 交易不包含可乐;2710 交易包含它。因此,对于组合产品,33.3%的交易不包含可乐,其中 66.7%包含可乐。
为了理解颜色是如何分配的,我们需要引入标准化残差,如图 1 中的图例所示。
关于人口的推论
镶嵌图按原样表示数据,并不试图概括全部人口。为了对总体进行推断,我们需要提供统计显著性的度量来证明发现的结果不是偶然的。
皮尔逊标准化残差
关系的强度可以被认为是观察值偏离独立情况下的值的程度(独立=变量之间任何类型关系的完全缺失)。 Pearson 标准化残差测量每个细胞偏离独立性的程度,它们可以计算如下:
其中 O ij 是观察到的频率(在我们的样本中找到的), E ij 是期望的频率( i = i 行; j = j 列列联表)。后者是在独立变量的情况下,我们根据理论概率预测事件将发生的次数。在我们的例子中,独立情况下的期望频率计算如下:
在哪里
- E ij =第 i 行/ j 列的预期频率。
- T i =第 i 行合计
- T j =第 j 列的合计
- T tot =表格总计(实验中的项目总数)
更简单的把前面的等式想成*(行合计*列合计)/总计。*皮尔逊残差显示了协会的实力和方向。强度由残差的绝对值给出;通过它的标志来辨别方向。在我们的例子中,皮尔逊标准化残差可以在 R 中计算如下:
单位在标准差中,因此大于 2 或小于-2 的残差代表显著偏离独立性。
现在,回到我们的镶嵌图,我们可以轻松地将标准化残差(下图中以绿色突出显示)映射到像元,记住正号表示蓝色阴影,负号表示红色阴影。
fig. 3 — Mapping of standardized residuals to colors and percent values to sizes of the mosaic plot
蓝色表示单元格中的观察值比零模型(独立性)下的预期值多。红色表示观测值比预期的要少。
换句话说,可以很自信地说,combo 产品(SELL_CATEGORY = 2)将几乎总是包含可乐(COKE = 1)。事实上,不含可乐(可乐= 0)的组合产品(SELL_CATEGORY = 2)与它们之间独立的情况(红色)相比,较少出现在交易中。与此同时,可以肯定地说,单一产品(SELL_CATEGORY = 0)不含可乐。
有关镶嵌图的更多信息,请参考此链接。
在图 2 中可以看到,桌子底部还有其他符号: χ (卡方)、 df (自由度)和 φ (克莱姆氏φ,也称克莱姆氏 V)。让我们看看他们是什么意思。
卡方检验
χ的值由所有标准化残差的总和给出:
该值是所谓的*卡方检验的结果。*它测试样本中的证据是否足够强,足以概括更大人群的关联。卡方独立性检验的 零假设 是两个分类变量在某个总体中是独立的。
在我们的例子中,χ的值是 1804.001。这个数字总结了我们的数据和我们的独立性假设之间的差异。但这意味着什么呢?我们可以从它的采样分布开始了解它的价值。
在某些假设下,我们可以说我们的χ检验统计量遵循χ分布。在这种情况下,我们可以确定χ检验值对应的p-值。为了确定我们分布的确切形状,我们需要自由度 ( df )。一旦我们有了这两个值,就很容易计算相应的p-值,这要感谢这个在线计算器。
一般情况下,p-值由χ检验值后右尾下的面积给出:
fig. 4 — Value of χ² corresponding to a p-value of 0.05
在我们的例子中,图形结果如下:
fig. 5 — The p-value corresponding to χ²=1804.001
说p-值为 0.0000,是指在变量独立(关联强度= 0)的情况下,有 0.0000 的概率偶然发现这个关联。换句话说,似乎 SELL_CATEGORY 和可乐在我们的人群中是相关的。通常,如果p-值< 0.01(有时p-值< 0.05 也被认为具有统计显著性),我们可以说两个变量是相关的(我们拒绝独立性的零假设)。p-值越低,结果越有意义,因为不太可能是噪声造成的。
有可能有一个对应于弱关联的p-值= 0.0000。如果我们处理大样本,就会发生这种情况。那么,我们如何确定这种关系的强度?我们可以通过效应的大小来测量它。因为在我们的例子中,我们有两个标称变量,所以可以使用克拉默 V (图 2 中的 φ )。对于两个顺序变量,Spearman 相关性或 Kendall 的 tau 是更好的测量方法。对于定量变量,皮尔逊相关是最好的选择。请注意,即使克莱姆的 V 有时用 φ 表示,相同的 φ 也可以用于另一种统计测量(更多细节此处为)。在我们的例子中, *φ = 0.577。*根据这些指南,克莱姆的 V 取 0 到 1 之间的值,所以值 0.577 表示非常好的关联。那么我们确信我们的变量是紧密相关的。
结论
通常,数据探索中使用的图很容易理解。有时他们中很少有人需要了解一些统计学的概念。一旦这些得到澄清,这些图会给每个分析师带来第一眼就很强的洞察力。
数据科学家最基本的技能,以及如何为未来进行教育
昨天我参加了 SJSU 跨学科课程发展的小组讨论(回到学校感觉又回到了家!).最受欢迎的话题是数据科学家最重要的技能是什么,以及教育工作者如何适应行业的快速变化,更好地为未来的劳动力做准备。这是一场非常有见地的讨论,不出所料,虽然许多教师专注于技术能力,如教授哪些编程语言以及涵盖多少深度学习,但行业专家小组在没有任何事先协调的情况下,更多地强调了基础知识(如数学和统计)、领域知识(某一行业的专家)、软技能(沟通和协作),以及接受反馈、适应、学习、发展和茁壮成长的能力。学校教授的知识和市场需求之间显然存在差距,这导致了一种矛盾的供需不平衡——公司正在努力寻找最优秀的人才,而许多新毕业生无法找到第一份技术工作。那么,我们如何才能缩小差距呢?(另一方面,缩小差距将意味着更多合格的供应,并可能减少对自己的需求,但我认为从长远来看,这将更好,并迫使我走出舒适区,为明天的更好生存发展——就像 达拉·科斯罗萨西说的 :让我们自相残杀(在我们的竞争对手自相残杀之前)。
学术界和工业界之间的这种脱节在工程领域显然没有那么严重。各大 techs 频繁组织校园招聘活动;问题被更清晰地定义和约束(前端/后端开发、数据仓库、分布式系统等)。)进行课程开发。具有血统技术能力的应届毕业生从一开始就可以非常成功。相反,数据科学的范围非常广泛,不同行业在不同阶段的要求也有很大差异——早期公司可能需要开发人员/数据工程师的混合来启动业务,而大型公司可能更喜欢统计人员/实验人员来获取见解并推动产品开发。自动驾驶等专注于利基市场的公司寻求信号/图像处理和高级机器学习方面的专家,而运营密集型公司希望获得预测和优化专家。任何两个数据科学家角色,即使是在同一机构内,也可能非常不同,这使得开发一个包含所有这些主题并具有足够深度的课程非常具有挑战性。更不用说领域知识了,与在线市场的数据科学家相比,医疗保健领域的数据科学家面临着完全不同的挑战。啊!
更糟糕的是,数据科学被视为一个有利可图的职业,许多训练营让它看起来很容易开始(不要怀疑所有训练营,其中一些,特别是声誉良好的 MOOCs,确实极大地帮助了人们学习和开始新的职业生涯,特别是在少数族裔和代表性不足的群体中)。去年,我参加了几次 1 小时的会议,在会上,讲师会简单地展示用 python 构建深度学习模型是多么容易,只需在 Jupyter 笔记本上写几行字就可以对猫和狗进行分类。激发热情是非常容易的,有些人可能会进一步投资几个月的项目,有时用所有的积蓄甚至贷款,却发现他们后来仍然无法找到工作-技术发展使数据科学民主化,使其比以往任何时候都更容易获得,但也出人意料地将具有基础知识和丰富经验的专家从单调乏味的工作中解放出来,使他们能够在该领域中探索得更远更深,使他们比市场上快速培训的更同质的群体更有价值。此外,技术堆栈发展迅速;仅仅精通某个特定的库是一种有有效期的技能;也许很快谷歌的 AutoML 将起飞,使所有的超级参数调整专业知识变得一文不值。
所以,作为教育者和学生,谁愿意投资到这个行业,游戏计划是什么?也让我思考——我应该怎么做才能保持相关性和竞争力?以下是几点想法。
- 关注基本面。在一支篮球队中,那些持续时间很长的人是那些基础扎实的人——不是令人瞠目结舌的扣篮或狡猾的传球,而是跳投、步法和无懈可击的传球。对于数据科学,它是数学和统计学,以及对编程、数据结构等的基本理解。虽然现在运行一个 ML 模型可能只需要一行代码,但是理解它在幕后是如何工作的不仅会在事情不工作时给你提供直觉,还会帮助你选择最佳的分析策略,甚至开发新的方法。技术的前沿每天都会遇到新的挑战,只知道进口 sklearn 或图书馆(caret) 不会让你走得很远。无论如何,从书上而不是从网上视频中学习,用传统的方式手工计算。随着不愿意走捷径的人越来越少,对基金会的这种投资变得前所未有的重要。对于教育工作者来说,应该更多地关注数学、统计和概率,而不是机器学习 101,这可以通过使用大量免费的在线资源进行自学。至于编程和数据结构,你可能不需要每天实现一个新的算法,但你应该知道更多关于 Array.sort 的知识,而不是简单地调用函数。
- 成为专家,然后成为多面手。我曾与之共事并钦佩的超级明星数据科学家都是领域专家——物理、数学、经济、金融、政治科学、医疗保健,应有尽有。他们通过训练确实很擅长自己所做的事情,能够非常迅速地吸收看似不相关的新知识。我还有很长的路要走,但是我已经在不同的领域中跳跃,这些年来我开始意识到许多问题,当从上下文中抽象出来时,本质上是非常相似的。此外,应用于不同领域的方法通常是相似的,尽管名称不同。因此,一旦你成为某个领域的专家,并建立了一个坚实的知识框架,将所学知识转移到一个全新的领域并不困难(仍然需要付出很多努力),这种转移可以继续下去,知识覆盖面将成倍增长。为了到达那里,你需要一个非常非常坚实的根来长成一棵树,这远远超出了几个月的工作。我也很喜欢智力运动员这个称呼:很多职业运动员真的可以擅长多项运动。最牛逼的数据科学家可以应对任何挑战;他们是快速的学习者,善于将不熟悉的挑战映射到他们的专业领域,然后轻松解决。对于教育工作者或新生来说,在学习了 DS/ML 中的一般概念后,你需要找到一个重点领域并全力以赴。深度优先。
- 软技能和人文素质。沟通、判断、优先排序、协作—所有这些软技能对于数据科学家的成功至关重要。与工程师不同,数据科学家经常在职能交叉的团队中工作,他们需要以各种方式与各种利益相关者沟通。有一个臭名昭著的面试问题——*解释 p 值背后的数学,然后向工程师、设计师、产品经理解释,你能向一个 3 岁的孩子解释吗?*在课堂环境中教授软技能很难,但一位教授提出了一个非常好的观点——通常学生只需要在学期结束时向一位听众(教授)写一份报告,但我们可以将来自不同背景的学生聚集在一起,让他们练习不同层次的沟通。对于任何分析,你都可以在家里练习:我能向技术观众、半技术人员和高中生解释吗?另一方面,许多这样的问题没有最佳答案,通常这是艺术而不是科学的选择。人文学科在科学和工程课程中一直被忽视,对于数据科学来说,人文学科可能是非常重要的一部分。是时候让他们回来了!
- **解决问题训练。**归根结底,最好的数据科学家是最好的问题解决者。解决一个结构良好的问题很容易(我应该如何建立一个模型?),提出问题很难(为什么要建立模型?)你可以很容易地获得针对第一类问题的培训,比如向你提出问题的 Kaggle,但针对后一种挑战的培训没有多少好地方,后者需要大量的自我启动。一个简单的思维练习,就是偶尔挑一个题目,试着想出一个解决方案。例如,当你在网上冲浪或浏览应用程序时,你可能会问自己一个问题:如果我想改进网站/应用程序 Y 中的功能 X,我应该收集什么数据,我应该监控什么指标,如何建立一个模型来预测/分类,以及我应该如何设计一个实验来衡量成功?有哪些权衡?这类似于健身房的例行公事,即使你在健身房,你也可以一天做几次。我发现它非常有用,让我对这个世界更加好奇,当它不可避免地变老时,让我的思维保持活跃。
最后,也是最重要的(许多人都同意),你必须对数据科学和业务充满热情。你必须完全买入并投资。这是一个快速变化的领域,你必须不断适应和改进。你必须接受不确定性,这是数据科学家应该享受的。
附:这是我的上一篇文章的后续。随着我的学习,我可能会再次更新。
你读到的关于增加 Instagram 受众的大部分内容要么不相关,要么不够
“帖子始终如一。使用标签。加入一个约定舱。冲洗。重复。”
这基本上就是咒语,对吧?我在互联网上阅读或观看的每一篇博文、YouTube 视频或在线课程,要么是同时谈论所有这些事情,要么是非常垂直地谈论其中一个(类似于:“2018 年 Instagram 标签权威指南”)。
我决定用数据分析来检验它们的有效性。
我用我公司的 Instagram 账户[**@uniwhere**](https://www.instagram.com/uniwhere)和我自己的 Instagram 账户[**@giansegato**](https://www.instagram.com/giansegato)有条不紊地遵守了这些规则。Uniwhere 是一款面向大学生的 app,所以社区建设对我们来说是关键。
以下分析仅基于 Uniwhere 的账户。
我在过程中改变了活动——比如停止做某件事,同时引入另一件事;这样,我就有了进行比较分析所需的必要程度的变化。
然后,我将一个 Python 笔记本连接到 Instagram Graph APIs 和我们自己的数据库,并试图得出一些结论。
TL;DR 版本:帖子一致性、标签曝光率和参与度与追随者增长完全不相关。你可以从中受益,但不是在受众发展方面。
让我们来看看细节。
数据
首先,我想指出我能够分析哪种数据。这是我最后的数据框架:
如你所见,我有一组标准化的指标,这些指标要么直接来自 Instagram,要么来自我们自己的内部 ETL 系统。 每行代表一天,从 2018 年 1 月 1 日开始,到 2018 年 6 月 10 日结束。
为了便于分析,我将数据分为三类:
行动
这些是跟踪为发展客户而采取的明确行动的指标:
did_post:是否在某一天我们贴了一张照片;它也有一个滞后版本,consistency:一个尾随值,代表当天之前一周的帖子一致性程度。vgm:那一天,帖子后面有没有用交战吊舱推过。 参与豆荚推动特定图片的参与度飙升(数百个赞),通常它们会让你的照片出现在标签的top post部分。他们的工作非常简单:有一群人在某个约定的时间互相喜欢对方的照片。所以,大量的参与和潜在的曝光。 这个特性也有一个滞后变量,vgm_effect:同样,一个 5 天的拖尾值,以考虑到在推送后的几天内接合荚有一个转移效应的可能性。engagement:在某一天,我们对相关图片的喜爱程度,使用我们在平台上找到的用户标签。另一个常见但耗时的活动是:你试图在一系列与你的喜好相关的图片中发现有趣的图片,并且你喜欢它们;希望有喜欢的人访问你的个人资料,喜欢它,并关注你。
达到目的的手段
这些是间接结果:
profile_views:一天内有多少用户访问了账户页面reach:有多少独立用户以任何方式接触到我们的页面- 在给定的一天内,我们的一张照片被浏览了多少次
小剧透:impressions 和 reach 是完全相关的(1.0),所以我们有可能将这两个术语作为同义词使用,尽管它们意味着两个不同的东西。
目标
最后,我们感兴趣的真正的、最终的KPI:
followers_count:某一天我们有多少 新 用户website_clicks:我们在账户页面上展示的网站链接被点击了多少次
最后,它看起来像这样:
好吧,没那么有用,我懂了。
Divide et imper:在拼凑出全貌之前,让我们先考虑一些小的比较。
后期一致性
以我的愚见,我认为“持续发帖并获得新追随者”这一永恒的大法则非常具有误导性。坚持发帖子有用吗?嗯,不疼。对于你的 现有的 观众来说肯定很关键。但是,看看确凿的证据,很难说它有助于 增长它 。 让我们来看看这个情节:
红色竖线表示我们发布图片的日期(did_post = 1)。黑色的竖线表示我们不仅发布了一张图片,还使用了一个参与 pod ( vgm = 1)来推送它。
看起来这两件事之间没有任何规律可言。然而,很难从这幅图像中推断出一些有趣的东西,除了非常清楚的“接合吊舱无助于”(这仍然非常有趣)。
让我们绘制相同的数据,但这次使用后一致性(我提醒你,这是一个移动窗口总和,因此可以绘制为一条连续的线):
正如你在 3 月和 4 月之间看到的(红色区域),关注者增长和帖子一致性之间似乎有一个有趣的关联:我发的越多(蓝线),我的关注者就越多(绿线)。
然而,后来,在 4 月和 5 月之间(黑色区域),新追随者的增长停滞不前,而一致性却创下新高。所以… 看起来发帖越多,或者越持续,越不会直接影响追随者的成长,使用互动豆荚也不会。
行动 2:成为热门帖子的趋势
有时候,我们的页面已经成为大量标签流的趋势。我们有一些照片登上了 2000 万左右的热门帖子。然而,它并没有给我们带来多少参与,而且,可能更糟糕的是,因为它,基本上没有新的追随者。
看看下面的情节。它显示了印象数和关注数之间的关系。
正如你所看到的,一般来说,它们都朝同一个方向移动(我猜)。然而,你完全可以在没有印象的情况下获得观众增长(两个红色区域),也可以在没有增长的情况下获得良好的印象(黑色区域)。
所以… 没有。你的照片经常被人看到与粉丝的增长没有太大关系。
行动 3:疯狂地四处活动
我就给你看这个。
参与度的新关注者(小提示:engagement定义为一个介于 0 和 1 之间的参数,用于量化平台中其他用户的点赞会话强度——我们在某一天与其他用户互动的次数):
网站点击参与度:
参与的个人资料视图:
轰。 订婚。 差不多就是这样。
当你使用正确的标签喜欢周围的图片时,你的个人资料浏览量会上升,因此你的关注者数量也会随着网站点击量的增加而增加。
这是唯一一个一直被证明是成功增加 Instagram 受众的策略。
我们能不能别绕圈子了?
现在我们来看看数据帧相关矩阵,它基本上是我可能向您展示的每一个可能的图的总结:
这张照片非常有趣。我需要一些来自不同账户和不同领域的信息,以便进行真正的概括,但据我所知,这是一张关于 2018 年 Instagram 游戏如何运作的非常生动的图片。 换句话说,你可能想到的每一个可能的策略都应该包含在这里,至少从相关性的角度来看是这样的。
我最感兴趣的是这个紫色的小家伙:
vgm_effect与无关。就像,真的,任何事。这几乎与profile_views无关,这是显而易见的,因为你的订婚豆荚中的那些人实际上必须访问你的个人资料才能喜欢你的上一张照片。did_post与impressions和reach密切相关,这也是显而易见的:当你发帖时,你留下了印象,当你不发帖时,你就没有了印象。但是和follower_count没有关联的迹象。- 而
follower_count则与engagement和profile_views高度相关,与website_clicks略有相关。正如我们在之前的情节中已经看到的,投入时间喜欢周围的图片是真正吸引新粉丝的唯一方法:你喜欢图片,因此你的个人资料会被浏览,人们会接触到你的图库,然后他们会决定是否值得关注你。在决定是否关注你的过程中,他们可能会访问你的网站。 - 公平地说,在
profile_views和impressions之间存在某种形式的关联。然而,我怀疑那些在印象高峰之后出现的部分个人资料视图(因此伴随着did_post)是你自己的追随者因为你发布了一些东西而访问你的页面。因此,没有新的追随者,但现有的观众参与。
外卖(即。我从这里学到了什么)
最后,我认为这里要提出的主要观点如下:
1。只为你在现有的受众发帖:不要指望你的帖子会吸引更多的关注者;即使他们在网上疯传也不行
2。使用互动平台只是为了增加你对照片的喜欢,并有一些社会证明:不要指望互动平台是增加你的观众的魔杖
3。喜欢,喜欢,喜欢,喜欢。 冲洗干净。 重复。
追踪
-
如果你喜欢这篇文章,我会非常感激你给我一个掌声:这是我第一次写这种东西,我想知道人们是否对此感兴趣。
-
如果你想得到这篇文章更新的通知,或者关于创业、成长和数据科学的新文章,你可以订阅我的时事通讯:
-
如果您对本文有任何意见、问题或批评,请告诉我!
最后一个音符
为什么不考虑后续跟进策略(我四处跟踪人们,希望他们中的一部分人也能跟踪我)?嗯:我从来没有做过,所以我没有关于这种策略的数据。
我相信它在短期内非常成功,但我讨厌它,主要是因为它传达了一个非常明确的绝望信息,而且你无法扩大它:要么你保留你建立的每个联系,因此 a .你很快就达到了 7500 的限制,b .你看起来真的超级绝望,要么你不时地随机取消关注你的一些粉丝,这是非常不诚实的事情,依我看。所以,没有,没有相关数据。
使用面部动作控制鼠标光标——一个人机交互应用程序
这个用 Python(3.6)编写的 HCI(人机交互)应用程序可以让你通过面部动作控制鼠标光标,只需普通的网络摄像头就能工作。它是免提的,不需要可穿戴的硬件或传感器。
特别感谢阿德里安·罗斯布鲁克令人惊叹的博客帖子【2】【3】、代码片段和他的 imutils 库【7】,它们在实现我的想法中发挥了重要作用。
工作示例
使用
现在,我完全理解这些面部动作做起来可能有点奇怪,尤其是当你在人群中的时候。作为一名良性位置性眩晕的患者,我讨厌自己做这些动作。但我希望随着时间的推移,它们会变得更容易,不那么怪异。请随意建议一些我可以纳入该项目的公共友好行动。
密码
您可以在以下位置找到代码文件:
[## ACL 21/Mouse _ Cursor _ Control _ 免提
Python(3.6)中的这个 HCI(人机交互)应用程序将允许你用你的…
github.com](github.com/acl21/Mouse…)
使用的库
- Numpy — 1.13.3
- OpenCV — 3.2.0
- PyAutoGUI — 0.9.36
- Dlib — 19.4.0
- Imutils — 0.4.6
repo 的 README.md 中提到了执行步骤。如果有任何错误,请随时提出问题。
它是如何工作的
这个项目的核心是预测给定人脸的面部标志。我们可以利用这些地标完成很多事情。从检测视频中的眨眼到预测受试者的情绪。面部标志的应用、结果和可能性是巨大而有趣的。
Dlib 的预建模型,本质上是【4】的实现,不仅可以进行快速人脸检测,还可以让我们准确预测 68 个 2D 面部标志。非常方便。
使用这些预测的面部标志,我们可以建立适当的特征,这将进一步允许我们检测某些行为,如使用眼睛纵横比(下面将详细介绍)来检测眨眼或眨眼,使用嘴巴纵横比来检测打哈欠等,甚至可能是噘嘴。在这个项目中,这些动作被编程为控制鼠标光标的触发器。 PyAutoGUI 库用于移动光标。
眼睛长宽比(耳朵)
你会发现眼睛长宽比[1]是最简单也是最优雅的特征,它很好地利用了面部标志。耳朵帮助我们发现眨眼和眨眼等动作。
你可以看到,每当眼睛闭上时,耳朵值就会下降。我们可以训练一个简单的分类器来检测下落。然而,正常的 if 条件工作正常。大概是这样的:
if EAR <= SOME_THRESHOLD:
EYE_STATUS = 'CLOSE'
嘴部长宽比
受到耳朵功能的高度启发,我稍微调整了一下公式,以获得一个可以检测张开/闭合嘴的度量。没有创意,但很管用。
与耳朵类似,当嘴张开时,MAR 值上升。类似的直觉也适用于这一指标。
预建模型详细信息
该模型提供了两个重要的功能。检测面部的检测器和预测界标的预测器。所使用的面部检测器是使用结合了线性分类器、图像金字塔和滑动窗口检测方案的经典梯度方向直方图(HOG)特征制成的。
面部标志估计器是通过使用 Dlib 的论文实现来创建的: 一毫秒面部对齐与瓦希德·卡泽米和约瑟芬·沙利文 的回归树集合,CVPR 2014。并在 iBUG 300-W 人脸地标数据集上进行训练:C. Sagonas,E. Antonakos,G,Tzimiropoulos,S. Zafeiriou,M. Pantic。300 人面临野外挑战:数据库和结果。 图像与视觉计算(IMAVIS),面部地标定位“野外”特刊。2016 。
你可以从dlib.net/files,点击shape _ predictor _ 68 _ face _ landmarks . dat . bz2获得训练好的模型文件。模型,。dat 文件必须在项目文件夹中。
**注意:**iBUG 300-W 数据集的许可不包括商业用途。因此,您应该联系伦敦帝国理工学院,了解您是否可以在商业产品中使用该模型文件。
参考
【1】。Tereza Soukupova 和 Jan Cˇ ech。 利用面部标志点进行实时眨眼检测 。2016 年 2 月,第 21 届计算机视觉冬季研讨会。 【2】。艾德里安·罗斯布鲁克。 用 dlib、OpenCV、Python 检测眼睛、鼻子、嘴唇、下巴。 【3】。艾德里安·罗斯布鲁克。 用 OpenCV、Python 和 dlib 进行眨眼检测。 【4】。瓦希德·卡泽米约瑟芬·苏利文。 一毫秒人脸对齐与回归树 系综。2014 年在 CVPR。 【5】。S. Zafeiriou、G. Tzimiropoulos 和 M. Pantic。 野外 300 视频(300-VW)面部标志追踪野外挑战 。在 2015 年 ICCV 研讨会上。 。c .萨戈纳斯、G. Tzimiropoulos、S. Zafeiriou、M. Pantic。 野外 300 张人脸挑战赛:首届人脸地标定位挑战赛 。IEEE 国际会议论文集。在计算机视觉(ICCV-W),300 面临野外挑战(300-W)。澳大利亚悉尼,2013 年 12 月 【7】。艾德里安·罗斯布鲁克。 Imutils 。github.com/jrosebr1/im…。
Photo by Orysya Dibrova on Unsplash
使用 Tensorflow 对象检测 API 通过网络摄像头移动光标
Tensorflow 最近发布了用于对象检测的对象检测 API ,能够从图像中定位和识别对象。其快速检测图允许从视频帧甚至网络摄像头馈送中进行连续检测。它也可以用来制作鼠标。张量鼠。一个用摄像头移动光标的应用程序。
你是不是一直想用香蕉移动光标,却做不到?未来就是现在。
TensorMouse 是一个小型开源 Python 应用程序,允许你通过在网络摄像头前移动随机的家用物体(如杯子、苹果或香蕉)来移动光标,并作为电脑鼠标或触控板的替代品。
TensorMouse allows you to play games… with bananas
它是如何工作的?
TensorMouse 从网络摄像头记录图像序列。然后,这些被输入 Tensorflow 对象检测 API 图形,该图形返回对象的概率和位置。然后移动鼠标光标,使光标位置与图像上对象的位置相对应。 例如,如果在图像的左上角检测到物体,光标将移动到屏幕的左上角。
应用程序的主要部分依次重复以下步骤:
- 使用 OpenCV 从网络摄像头获取单帧图像
- 使用 Tensorflow 对象检测 API 进行对象检测
- 基于检测到的对象位置移动鼠标光标
1.帧采集
使用 Python OpenCV 模块捕获来自网络摄像头的帧。它为快速图像采集和缩放提供了一个跨平台的工具。然后将图像缩放至360p以提高性能。
2.目标检测
对象检测用于确定所需对象在网络摄像机帧中的相对位置。它使用 Tensorflow 对象检测 API 的冻结 Mobilenet 神经网络图,在 COCO 数据集上进行训练。该数据集由 80 种不同的物品组成,大部分包括杯子、苹果、餐具等家用物品。
Detected objects with corresponding probabilities
如果检测到的对象概率超过指定的阈值(当前为 85%),TensorMouse 会将该对象视为已检测到,并计算检测到的对象的框的中心。
3.移动鼠标光标
Python 包 pynput 为执行鼠标光标移动提供了跨平台支持。光标移动到基于检测到的对象的相对位置的位置。这意味着如果在图像的左上角检测到物体,光标将移动到屏幕的左上角。
然后,应用程序返回到步骤 1,从网络摄像头中检索下一张图像,并重复这些步骤。
怎么用?
该应用程序的源代码发布在 my Github repo 中。
TensorMouse 可以在任何主流(Windows、Linux 或 MacOS)平台和几乎任何机器上运行,但要实现良好的帧速率,它需要一个像样的 CPU 或支持 CUDA 的显卡。
装置
安装确保安装了软件包依赖项。
- 安装 Anaconda(我推荐缩小版的 Miniconda )
- 从 Gitlab 克隆tensor mouse
- 打开终端并导航到项目根目录
conda env create -f environment.yml(Linux/MacOS)或conda env create -f environment-win.yml(Windows)source activate tensormouse(Linux/MacOS)或activate tensormouse(Windows)
跑步张量鼠标
一旦安装了依赖项并激活了环境(参见第 4 步和第 5 步),我们就可以简单地运行 TensorMouse:
python tensormouse.py
然后等待大约 10-20 秒,等待绿色消息指示 Tensormouse 已成功启动。
这将运行 Tensormouse 跟踪它的默认对象-杯子。但是您可以通过提供可选参数--obect="OBJECTNAME"使它与 80 个 COCO 数据集对象中的任何一个一起工作
您也可以使用CTRL进行点击,使用ALT按钮进行拖动。
使用说明
- 确保物体光线充足(Tensormouse 在光线不好的情况下表现不佳)
- 确保物体足够远,不会占据整个网络摄像头画面,但足够近,仍然可以被检测到(需要一些尝试和错误)
- 如果你遇到物体检测性能差,尝试运行应用程序设置它来检测杯子,因为他们表现得相当好
如何下载电影海报作为深度学习数据集
如果你对神经网络感兴趣,你可能和我在同一个地方。在某些时候,通常的数据集开始变得无聊(看看你,MNIST)。它们是开始旅程的完美之选,但在那里只有这么多东西可以发现。这就是为什么我很兴奋地在 Kaggle 上发现了一系列电影海报的链接。
在这篇文章中,你可以找到我用来收集这些海报的代码,以便对它们进行多分类实验。我以一种很容易根据你的需要进行调整的方式来编写代码。你还可以在我的 Github 页面上找到一个完整的 Jupyter 笔记本。
一些背景:我收集这些数据的动机是建立一个神经网络,能够对艺术家设计电影海报的十年进行分类。当有人给你看一张电影海报时,你可能会知道它来自哪个时期。所以如果人类能做到,神经网络应该也能做到,对吧?这听起来不是比识别数字更令人兴奋吗?诚然,对电影海报进行分类的现实应用较少。但是……无论如何。
介绍够了。我们开始工作吧!作为对每一个读到最后的人的奖励:我找到的七十年代最差的三张电影海报在这篇文章的最后等着你。
Three more recent examples of movie posters. One of these movies was excellent.
数据准备和取样
Kaggle 数据集列出了 40,108 部电影,并有四个我感兴趣的字段:imdbID作为索引(以及稍后的文件名),Title包含年份,Genre列出了一部电影所属的所有流派,Poster是带有相应电影海报链接的字段。有一些电影缺少值(845 部电影)和一些重复的链接(1,413)。清理完这些之后,我的数据集中还剩下 37,850 部电影。
电影的年份是Title字符串的一部分,例如,“朱曼吉(1995)”。我使用了一个正则表达式来提取这些信息。最老的电影是 1874 年的(!),最近的都是 2018 年的。
由“|”划分的长字符串,例如“动作|冒险”,存储所有适用的类型。我将每个字符串拆分成一个列表,构建一个集合来获取所有唯一的值(all_genres),并对其进行循环以创建每个流派的布尔变量,例如is_action。
我的主要目标是建立一个预测海报十年的多类分类网络。因此,我决定把重点放在 1970 年或以后制作的动作片上。这种方法有两个优点:
- 电影海报的风格是由时期和类型决定的。对正确的十年进行分类而不保持类型不变,将使任何网络架构都很难获得正确的信号。
- 1970 年及以后的过滤器是一个很好的平衡,在这种情况下,有足够多的十年可以看,也有足够多的海报可以建立一个网络。我一会儿会回到这一点。
这样的选择逻辑给我留下了 4614 张动作片海报。
最后,是时候添加十年作为目标变量了。因为这是一个分类问题,所以我选择将这个信息编码为一个字符串值。看了几十年来可用电影的分布,我意识到这些数据是多么不平衡:
不平衡数据集以及如何处理它们是许多真实世界机器学习应用程序的关键主题。然而,我不希望这成为我实验中的潜在问题。因此,我从每十年的海报中抽取了相同数量的样本。因为最低金额是 70 年代的 469 英镑,所以我选择了这个。
在所有这些步骤之后,我还剩下 2345 个(4 x 469)电影海报链接,我想用它们来做我的实验。
I think the second movie takes place in an airport. Please correct me if I’m wrong.
海报下载
我决定使用 80%的图像进行训练,20%的图像进行测试。根据目标变量对数据集进行分层始终是一种好的做法。在这种情况下,通过decade进行分层以保持数据集平衡至关重要。
也有例外(例如来自autokeras的load_image_dataset方法),但是作为一个规则,你的文件夹结构应该反映训练和测试集的划分以及你想要预测的不同类:
我使用set(df.decade)作为classes 的值,但是这很容易调整,取决于你想做什么。文件夹结构就绪后,我可以开始下载电影海报了:
这些是我使用的函数的主要组成部分。在Jupyter 笔记本中,代码还包括检查先前下载的海报和一些诊断输出。
当我开始建立一个网络时,我意识到的最后一个问题是,一些电影海报不是 RGB 而是黑白的。下面是我写的代码,在它们干扰我的网络之前,我会删除它们:
在这最后的清理之后,我的数据被下载并准备好了。正如我所承诺的,这里是我发现的 70 年代最糟糕的三张海报:
I wonder whether people would celebrate or burn these posters today. I’m pretty sure about two of them.
感谢阅读!如果你喜欢这篇文章,留下一些吧👏🏻这样其他人就可以找到它,并在 LinkedIn 或 Twitter 上分享。让我知道你在评论和推特上的想法。再次感谢,继续学习!
向前看,向后看
马后炮偏差
从过去重建伟大事物的愿望总是带有一些后见之明的偏见。
当我还小的时候,我和我的兄弟姐妹玩一种我们边玩边编的游戏(太详细了,无法解释),这太棒了。几年后,出于一种怀旧情绪,我们试图重建它,但它太糟糕了。足够多的小细节已经改变,它不起作用。改变的一个重要细节是完全缺乏自发性。我们都知道结果应该是什么样的,这让我们的行为有所不同。
回顾过去时,很难了解自那以后发生了哪些变化。这意味着反过来很难推断因果关系。
实验
因果关系的黄金标准是实验。这是一个非常棒的工具。但是这种方法在复杂的环境中受到很大的限制,比如商业环境。
我们大多数人都读过这样的书,作者收集了一组例子,并利用它们之间的共性来暗示因果关系。论点是这样的:“看看所有这些成功的企业,他们都做了同样的事情!这一定意味着这是成功的一个重要因素。”
但是等等。这是一条很有问题的推理路线。我可以很容易地说:“有史以来排名前十的篮球运动员的球衣上都有数字。编号球衣一定是成功的关键决定因素。”
当然,我们从来没有听到过这样的陈述,因为它不符合我们的直觉。那么,真正阴险的陈述是那些直觉上吸引人的、虚假的、不可能反驳的陈述。
我最喜欢的例子是史蒂夫·乔布斯。我听过很多关于苹果真正伟大的原因的说法,从“史蒂夫·乔布斯天生就是一个有创造力的天才”到“史蒂夫·乔布斯为自己创造了他真正想要的东西”,再到“史蒂夫·乔布斯非常善于利用他人的想法”,甚至“史蒂夫·乔布斯真的很了解女性消费者。”每一种说法都很有吸引力,是苹果成功的合理原因(除了最后一种),几乎不可能反驳。我们不能让史蒂夫·乔布斯起死回生,修改每一个属性,然后看看每次苹果会发生什么。
因此,在许多最具启发性的情况下,实验是不可能的。
辉煌的日子
回到再创造。施乐 PARC,另一个虚构的历史实体,激发了人们渴望再创造的欲望。贝尔实验室和 IBM Almaden 是类似的例子。如果我们可以有意识地再造这样的实体,难道我们不会喜欢吗?
再创造是的天性不是创新。它是尝试去做已经发生的事情。这可能是一个吹毛求疵的观点,但是我认为它让再创造者在开发新的、伟大的解决方案时处于不利的地位。
我是 PARC、贝尔实验室和艾伦·凯的超级粉丝(他们可能会帮助 YCombinator 试图重现 PARC 精神)。我认为我们可以从他们身上学到很多,并产生很多假设。问题是大多数人只是相信艾伦·凯的话。恕我直言,我认为没有人能够确切知道 PARC 为什么会成功。
归根结底,我们没有可靠的数据来告诉我们。样本太小,变量太多。
回顾过去并非毫无意义,这也是我一直在做的事情。事实上,我推荐任何人阅读所有关于 R&D 大实验室的书籍(创意工厂、梦想机器、闪电经销商)。然而,在这样做的时候,认识到不稳定的立足点确实很重要。我们看到“透过玻璃黑暗”,抄袭保罗。
更好的数据
为了避免写一篇纯粹的评论,我将大胆提出一些如何做得更好的想法。
一个主要的方法是,我们应该研究最近的创新例子,甚至是同时代的例子。现在正在发生的真正创新的事情是什么?硅谷是一个开始的好地方。
即使是最新的例子,也存在这样的风险,即事物变化太快,以至于降低了研究它们的价值。然而,我认为研究最近一批来自 YC 的创业公司及其创始人会比研究 PARC 或史蒂夫·乔布斯产生更多有用的数据。
自发性
人脑有点像联想机器。当图式和概念被同时刺激时,它们会互相桥接(“神经元一起放电,连接在一起。”)这些强关联超级有帮助,效率超高,但是在很多很多方面会让我们产生偏见。
我们可以通过允许生活中的随机性,并从传统结构中解放出来,在一定程度上减少这种偏见。简而言之,我们可以停止向后看,看那些我们认为已经被证实的事情,而开始看我们周围正在发生的任何事情。
虽然上面的部分认为我们应该学习更好的东西,但这一部分更像是根本不要学习。只是生活,体验,尝试事物,享受乐趣,做一些你想做的事情,即使它们看起来很愚蠢。
接受成功的罕见
最后,我认为承认巨大的成功不会经常出现是很重要的。重大的新进展不仅难以制造,总体来说也很难。
也许我没有说太多的用处,但我希望至少我已经说服了一些读者,当他们向前看过去的时候,要多加小心。
将数据科学作为职业(数据和 IT 管理)
之前,我已经对数据科学家所需的技能和知识给出了一个总体的看法,还就数据科学家应该知道的数学知识进行了一次 T2 式的讨论。接下来,我将谈谈数据科学家应该了解的数据和 IT 管理知识。
1-数据治理&管理
由于数据是数据科学的命脉,因此需要像公司的所有其他战略资产一样小心管理。因此,数据科学家必须具备数据治理和管理方面的知识,以确保数据尽可能达到最高质量。这就相当于厨师尽可能保持食材新鲜,从而做出最美味的菜肴。
那么什么是数据治理呢?在 Wikipedia 中定义,它是一套正式管理数据的流程,以便数据可以信任并与责任一起,将不利的数据事件(如数据丢失、数据质量差、数据泄漏)降至最低。
数据科学家需要注意,甚至应该对数据治理流程进行反馈,以确保数据具有最高的质量和类似的优先级,确保数据隐私和安全,确保只有需要访问数据的人才能访问数据。
向不熟悉数据科学的读者介绍什么是数据治理。以新雇员对数据的访问为例。数据治理将阐明为新员工提供数据访问权限所需遵循的流程。例如,决定授予访问权限所需的信息是什么,授予哪种访问权限,需要访问多长时间,谁有权授予访问权限,在做出决定后,谁影响该决定等。当然,这只是“数据治理”的冰山一角。
在这一过程中,随着组织沿着学习曲线前进,数据科学家还需要提出数据收集策略、正确的数据粒度级别、支持策略的技术和基础架构,以及相关的数据治理流程,以便更好地管理收集的新数据。
数据管理&数据质量
我不认为我需要强调数据质量的重要性。那么,数据科学家应该注意哪些数据质量维度,并能够提出可能的维护解决方案呢?它们是:
准确性——它在多大程度上反映了现实?
完整性——我们是否获得了所有可能的数据?
及时性—当我需要时,数据是否可用?
有效性—它是否符合定义的格式?
一致性—不同表格之间的格式是否相同?
独一无二——没有重复?
在学习的过程中,数据科学家必然会遇到数据质量的更多方面。数据科学家可以在这个过程中建立自己的列表。更重要的是,数据科学家能够并且应该对可以创建并用于衡量数据质量的指标类型进行反馈。除了衡量数据质量的指标之外,能够设置正确的警报级别(例如,当缺失值的百分比超过 1.0 时发出警报)对于确保“脏”数据不会渗入也很重要。
数据质量只是数据管理的一个方面。数据管理的其他方面可以是例如自动化、验证、ETL 过程、备份、访问权限等。
企业数据仓库(EDW)
数据科学家不需要构建整个企业数据仓库,但对他们来说,了解如何构建数据仓库是有好处的,因为数据仓库的结构会影响数据的质量,尤其是数据的及时性和唯一性。构建 EDW 时,数据科学家可以通过牢记极端时期的业务连续性需求以及牢记 ETL(提取、转换和加载)流程来增加价值。
2-计算机架构
在我的大学时代,我修了一门“计算机导论”课程,学到的知识对我的工作帮助很大,帮助我理解了计算机是如何工作的,以及计算机是如何进行计算的。像内存总线、缓存、内存、硬盘、CPU 等东西都是在那个模块里教授的。它让我对计算的硬件方面以及它如何限制/增强处理能力有了更多的了解。这些知识为我理解技术是如何在幕后工作的打下了良好的基础。因此,我必须说,对计算机体系结构的良好理解使数据科学家能够提出可行的解决方案来捕获和维护数据,在 IT 系统中实现模型和算法。
企业 IT 架构设计
除了了解计算机如何工作,数据科学家还应该了解 it 架构在组织中是如何规划、设计和构建的。
原因在于,数据科学家可能需要将最终/选择的模型实施到企业 it 架构中,而良好的理解有助于数据科学家在数据收集策略或模型实施中提出可行的想法,并且在模型培训期间,能够注意到将这些模型嵌入到架构中时 IT 架构的约束和可能性(即,模型与现有 IT 系统和业务流程的良好集成,确保数据和数字的平稳流动)。例如,一些传统系统无法考虑复合变量(即 X1X2),因此数据科学家将无法构建具有复合变量的机器学习模型,而只能使用简单的特征(X1 和/或 X2)。
3 种编程语言
考虑到大多数数据科学家需要利用计算机巨大的计算能力,数据科学家无法逃避编码,除非他/她想把职业机会限制在使用大量点击式软件的公司环境中。此外,精通编码允许数据科学家在设置模型的超参数、损失函数时有更大的灵活性,允许在构建的模型中有更多的“创造力”。
我可以理解为什么人们会反对编程,因为这就像试图用一个外国人的母语和他交谈,而我们对他们的母语却一点都不熟悉,并且希望这个外国人能够完全理解我们想要表达的意思。我的第一门编程语言是 Java,当我在大学里学习它的一个模块时,我对它一窍不通。随着我职业生涯的继续,我意识到如果我不处理编程,我将限制我的机会,并决定重新开始。谢天谢地,我学的下一门“编程”语言是 SAS,由于受控的环境,学这门语言是一种更愉快的经历。这给了我信心,让我可以继续前进,继续学习 R 和 Python(开源)。
鉴于许多 [IDEs](http://integrated development environment (IDE)) 已经使学习编程变得更加容易(通过建议&颜色编码)以及大量可用的资源,如 YouTube、开放课程软件、博客、StackOverflow 等,学习编程变得更加容易。一个人可以自己学习编程,或者如果他们在学习中需要结构,可以去编程训练营,这是最近很流行的。
如果我可以提出学习编程的另一个角度,我发现编程就像解决一个逻辑难题。解决 bug 需要一个人进行逻辑思考,并且很好地理解语言在幕后是如何工作的。因此,能够解决一个 bug(尽管这个过程极其令人沮丧),实际上确实提供了一种成就感。至少对我来说,这感觉就像在努力解决一个难题很长一段时间后,当答案显而易见时,一种奇妙的感觉(以及成就感)就出现了。
此外,有许多方法可以通过编程达到目的或目标。足够熟练地编写代码,使代码能够高效地运行,也会给人一种成就感。对于任何开始学习数据科学的人来说,我强烈鼓励他们探索编程,数据科学家目前常用的语言是 R 和 Python,但请不要问我选择哪一种。
对于一个数据科学家来说,我相信首先要获得正确的概念,然后再想出要使用的工具,因为有了正确的概念,就有了“正确的”训练轮来高效地学习语言。所有这些关于哪个工具更好的文章仅仅是点击诱饵文章,唯一从中获益的人是文章的作者(以最昂贵的货币支付,称为时间)。
4-软件和硬件工具
作为一名数据科学家,我们必须让自己(尽可能)了解可用的最新工具,包括企业工具和开源工具。这是因为组织将依赖数据科学家来提出在每个数据科学项目中使用的正确工具。
打个比方,说给你一个工具箱,里面有各种各样的工具。着眼于眼前的挑战,你只会使用你熟悉的工具(锤子、钳子、螺丝刀),并且知道它能有效地解决挑战。我们知道,我们熟悉的工具越多,挑战就越容易解决。
同样,数据科学家应该尝试熟悉所有不同种类的工具,包括软件和硬件,并对其工作原理有所了解,使用它的利弊是什么,它在什么样的情况下有效,维护成本是多少,与当前工具集的可能集成问题等。对现有工具有一个很好的了解会给数据科学家带来附加值,这对组织挖掘他们的数据以获得更多见解是很重要的。
数据科学家不需要深入阅读(直到文档级别)就能提出工具,而是从最基本的层面理解它的工作方式及其优缺点。如果有时间和资源进行试验,那么也请进行试验,以便数据科学家能够很好地了解实施挑战。
数据科学家应该熟悉的一些建议工具是可视化和仪表板工具、机器学习工具、数据仓库和处理工具以及计算工具。
结论
为了让数据科学发挥作用,数据科学家必须非常小心地对待数据,确保数据是可信的,并且在质量上能够获得有意义的见解。如果数据科学家也参与 IT 基础架构的构建和维护,这是可以实现的。能够提出可行的解决方案有助于建立数据科学家的可信度,使数据科学团队成为具有高度内部信任的紧密团结的团队,鉴于数据科学需要组织中的团队努力,这一点非常重要。
这些是我认为数据科学家应该至少了解的数据和 IT 管理知识。在下一篇博文中,我将讨论数据科学家应该知道的有效的领域专业知识。
祝您的数据科学学习之旅愉快,请务必访问我的其他博客文章和 LinkedIn 个人资料来了解数据科学的重要信息。
**补充说明:**我已经建立了自己的网站,作为我 2020 年新年计划的一部分,最新消息请访问这里。感谢支持!
将数据科学作为职业(领域专长)
在几篇讨论有兴趣从事数据科学职业的人应该具备哪些知识的帖子(总体、数学、数据& IT 管理)之后,我现在将更多地讨论数据科学家应该具备哪些业务知识(领域知识)。
1 —业务流程
如今,每个企业或组织都有流程。这些流程始终保持高效和有效是至关重要的,尤其是那些面向客户的流程。
重要的是,数据科学家要从总体上理解这些过程以及它们是如何工作的。为什么这很重要?原因是,作为一家在数据科学方面成熟的公司,数据收集和模型实现通常会添加到业务流程中。数据科学家需要很好地理解这些业务流程是如何工作的,以便能够建议何时可以捕获某个数据元素以获得更好的质量,其次能够建议应该在业务流程中的何处放置模型,以便将模型需要的数据元素提供给模型,并且模型在流程的正确阶段生成“决策”。
例如,大多数信用记分卡需要信用局的数据。因此,在信贷申请过程中,必须将模型置于模型所需的申请人数据(尤其是申请人的信用局数据)可用于模型的阶段。该模型还应在决策阶段之前生成信用评分,因为它是一个关键的决策因素(即在决定是否授予信用时)。
由于这涉及到模型的实现,因此数据科学家必须对业务流程有很好的理解,以便为数据收集和模型实现提出可信的建议。
2 —战略管理
通常,数据科学家的见解需要转化为业务战略。例如,来自营销活动响应模型的洞察可用于确定哪些客户特征可能会对营销活动做出响应,并由此设计出能够触及这些客户群的合理活动。
因此,对于希望为组织提供价值的数据科学家来说,能够提供“可操作”的见解至关重要。对战略管理有很好的理解,有助于数据科学家了解什么样的见解会受到公司的高度重视,什么样的见解是可行的(也许是考虑到组织中可用的资源),能够在提出可行的见解后思考接下来的步骤。能够战略性地思考有助于数据科学家通过提供可以采取行动的见解来持续提供价值。能够持续提供可操作且有价值的见解有助于建立可信度,因为人们更倾向于听取数据科学家提供的有用见解,而不是无法付诸行动的见解(即空话和可行的行动)。
业务和收入模式
商业模式是一个组织如何服务于一个选定的市场,其竞争优势超过其他类似的竞争对手,而收入模式将说明该组织如何继续从商业模式中获取价值/利润。
对于要为组织增加价值的数据科学家来说,了解组织的业务和收入模式(包括现在和未来)是至关重要的。有了一些了解,数据科学家就可以确定哪些业务目标是重要的,并能够提供支持重要业务目标的见解。这与为战略制定和执行提供相关见解的能力密切相关,以便组织能够继续运营、服务于所选市场并从中获取利润。
通过了解战略管理、业务模式和收入模式,数据科学家可以了解每个项目提供的价值量,从而能够提供可以采取行动的相关见解,因为这些见解是根据业务和收入模式改编的,所以它允许公司继续从他们的数据中提取价值,为推动组织中更多的数据科学或分析创造可持续的动力。
3 —变更管理
许多刚开始学习数据科学的人没有意识到数据科学家也是变革的推动者,因为我们提供的见解,变革是必要的,让我们面对它,人类不喜欢变革,但如果企业要在比几十年前更具活力的动态环境中生存,变革是必要的。
作为变革推动者的数据科学家,需要了解如何通过提供见解的过程来创造可持续的变革(即不会回到旧习惯)。数据科学家不能只是创建大量的信息/见解,然后将它们倾倒到组织中。有时,需要有一种有分寸的方法来发布见解和信息,以便能够做出有效的改变。
对于那些对变革管理感兴趣的人,我发现约翰·科特设计的流程是最好的流程之一。你可以在这里阅读维基百科关于变革管理的文章。
4 —特定领域
随后,数据科学家需要具备的业务知识将与项目/分析所在的领域相关。例如,如果数据科学家在风险管理部门工作,则需要了解特定的业务定义、法规(尤其是银行、医疗保健、制药、航空)、会计政策和国际标准( GAAP 或 IFRS )、流程等。这是数据科学家所在组织所特有的部分。
我在招聘实践中注意到的一件事是对拥有领域相关知识的员工的巨大偏好。这可能会严重限制组织能够获得的数据科学人才的供应。着眼于前景和劳动力,雇主将有更好的机会从数据科学中获得更多价值,方法是寻找那些数学能力强、能够将业务目标转换为数学模型的数据科学。根据我的观察,与编程和领域知识相比,这是一个更难找到或训练的技能。
结论
我的结论是,在我看来和观察中,数据科学新手应该知道、学习和理解的关键技能和知识是什么。
随着技术的变化,数据科学家的工作也将不断发展,知识和技能可能也需要相应更新,所以请继续学习!!
请务必访问我的其他博客文章和 LinkedIn 个人资料以获取更多数据科学知识。
**补充说明:**作为我 2020 年新年计划的一部分,我已经建立了自己的网站,最新消息请访问这里。感谢支持!