TowardsDataScience-博客中文翻译-2016-2018-十-
TowardsDataScience 博客中文翻译 2016~2018(十)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
用 Docker 为 R 创建沙盒环境
原文:https://towardsdatascience.com/creating-sandbox-environments-for-r-with-docker-def54e3491a3?source=collection_archive---------2-----------------------
在过去的一年里,我一直在学习 R,其中一件让我印象深刻的事情就是建立一个环境,并启动和运行 R 有多么困难。我最近看到了一篇关于如何使用 H2O 和机器学习的博客帖子( link ),这在我看来很棒。唯一的问题是,如果我要分享我的工作,很有可能有人会花很长时间来尝试配置一个恰到好处的环境,以便所有的星星都可以正确地重现我的结果。
[## 今晚关于人力资源分析的实时数据谈话:使用机器学习预测员工流动率
美国东部时间今晚 7 点,我们将进行一场关于使用机器学习预测员工流动率的#DataTalk 直播。员工…
www .商业科学. io](http://www.business-science.io/presentations/2017/10/26/datatalk_hr_employee_attrition.html)
现在,任何了解我的人都知道,我已经设法破坏了我的 Macbook 无数次,我宁愿不改变我的系统注册表中的一些随机 json 文件,而只是运行可能证明有用的包。输入 Docker。
码头工人:鬣狗之家
Sway’s Five Fingers of Death challenge
为什么要称 docker 为“鬣狗之家”?这难道不应该让我们知道我们的应用程序应该“正常工作”吗?
What we think our container will look like
What actually ends up happenning
你看,建造一个容器需要某种类型的个体。那个人需要有一定程度的坚韧,在他们的灵魂中有一种燃烧的感觉,当他们看到建造日志的恐怖时,他们不只是打个盹,然后喝醉。
Build Log Horrors
不。他们就像一只鬣狗,不仅仅把他们的构建日志看作错误,而是一个挑战,试图理解正在发生的事情,并且对他们的容器有一个愿景。你看,有两种人:选择建造的人和不建造的人。不同的是,从事建筑的人有一个愿景,一个目标,坚持不懈地追求这个目标,直到目标实现。以肯德里克或安迪·米尼奥这样的说唱歌手为例。对于码头工人是否比流浪汉更好,或者周二午餐吃什么,他们不会分心:*他们只是有一个目标,并像一只欲望未得到满足的鬣狗一样追逐它。*请注意,这一过程绝非易事。等待容器构建,找出构建中的错误,并不是一个奢侈的过程。如果你还没有准备好,这是可以理解的。不要再看这个了,去散散步,做个三明治,给需要的人。如果你想做一个容器,拿起三明治,狼吞虎咽:让我们开始工作。
Andy Mineo’s Five Fingers of Death
在你进一步阅读之前,请观看下面的视频,直到 2:40:
从Opensource.com,Docker 定义如下:
Docker 是一个工具,旨在通过使用容器来简化应用程序的创建、部署和运行。容器允许开发人员将应用程序与它需要的所有部分打包在一起,比如库和其他依赖项,然后作为一个包发送出去。通过这样做,由于有了容器,开发人员可以放心,应用程序将在任何其他 Linux 机器上运行,而不管该机器的任何定制设置可能与用于编写和测试代码的机器不同。
简单地说,Docker 是一种给你的计算机一套指令来制作一道菜(比如说比萨饼)的方法。也许我的朋友杰夫发现了我的比萨饼,想在他的机器上测试一下。简单。下拉映像,使用 docker 文件构建容器,并在本地运行容器。有多简单?
现在,在我们开始之前,有几个主题是值得讨论的,这样你就不会陷入和我刚开始时一样的陷阱:依赖管理,以及托管平台。
依赖管理
想想你的“披萨”(或容器)里想要什么。当我开始使用我的容器时,我不知道术语“依赖地狱”是什么意思。我强烈建议您在构建容器之前考虑一下您到底想用它做什么。对我来说,我只是想要一个有特定包的沙盒环境,比如 tidyquant。我还想确保当我安装我的包时,任何必要的包也安装了:
install.packages("tidyquant")
默认情况下,下面的代码行将安装“Depends”、“Imports”和“Linking to”中的所有包。虽然这很好,但 tidyquant 有一个被证明是麻烦的小依赖项:XLConnect,它需要 rJava。这可能有点令人头痛,因为 rJava 需要 Java 才能工作,而这很难用 Docker 来配置。
平台:Docker Hub vs Gitlabs
如果您决定使用 Github 来托管(或存储)您的 docker 文件,很可能您会希望使用 CI(持续集成)服务来查看对您的 docker 文件所做的更改是否成功。持续集成是必要的,因为这些服务可以帮助您监控推送到 GitHub 的更改,以及构建是否成功。Docker Hub 在默认情况下提供了这种能力,但是很难找出到底是哪里出了问题。如果您决定使用 GitHub 来存储您的代码,我强烈建议您使用 Travis CI 来监控对您的容器所做的更改,以及是否有任何问题发生。
另一个让我印象深刻的关于持续集成的服务是 Gitlabs,它提供了托管、构建和监控 Docker 容器的一站式服务。GitLabs 有时可能有点难以配置,但如果您感兴趣,可以查看以下容器,看看它是否能满足您的需求:
https://gitlab.cncf.ci/fluent/fluentd-docker-image
无论你决定使用哪种服务,我认为有一个版本控制系统是非常必要的,这样你就可以回去,看看什么变化起作用,什么变化不起作用。提交新的变更绝对是一件痛苦的事情,但是我认为能够看到你的构建状态从 15 次糟糕的尝试到第一个绿色徽章是非常值得的。
一些后勤物品
在我们开始这个项目之前,有几个后勤项目需要解决:首先,从这里下载 docker:【https://www.docker.com/community-edition
接下来,下载以下工具:
Visual Studio 代码-【https://code.visualstudio.com/download
https://www.gitkraken.com/download
Visual Studio 代码是非常好的文本编辑器,内置了对 Docker 管理的支持,这是一个与文件系统交互的终端,允许您在文本编辑器中与 Git 或 GitHub 等版本控制进行交互。当您从 Visual Studio 代码中打开存储库时,您会注意到下面有一个名为 Docker 的选项卡。这使您可以直观地看到本地下载的图像,以及任何正在运行的容器和 Docker Hub 上的任何图像,这非常方便:
Visual Studio Code Docker Management
GitKraken 是一个用于从远程位置管理存储库的工具(如 GitHub 或 BitBucket)。GitKraken 特别有助于保持您的存储库的本地副本与 GitHub 上所做的更改同步,但不会下载到您的本地机器上。
最后,在 GitHub 上创建你的库,你可以随心所欲地命名它。
1.现在进入 GitKraken,点击屏幕左上角的文件夹图标。
2 这将提示您从远程位置克隆存储库。有关更多详细信息,请参见下图:
Cloning the repo in GitKraken
我们走吧!您的存储库现在应该被克隆到您的本地机器上,因此您现在可以访问它,并且可以将文件推/拉到存储库中。
第 1 部分:创建 Dokerfile
为了构建您的 order 文件,需要一些核心组件来使 order 文件完整,这些组件是:
- 从基础图像开始
- 在基本映像上安装所需的任何核心库
- 您希望安装在容器上的包
- 清理所有临时文件,使图像尽可能小
有一点需要注意的是,当你创建 docker 文件时,你希望你的图像有尽可能少的“层”。让我们看一个样本 docker 文件
FROM rocker/tidyverse:latest
LABEL maintainer="Peter Gensler <peterjgensler@gmail.com>"RUN R -e "install.packages('flexdashboard')"
RUN R -e "install.packages('tidytext')"
RUN R -e "install.packages('dplyr')"
RUN R -e "install.packages('tidytext')"
为什么这样不好?根据 Docker 的说法,每个 RUN 命令都被视为图像上的一层,你放入图像的层越多,图像就越大,这使得它有点难以处理。为了尽量减少这种情况,最好限制 docker 文件中的命令数量。我把我的任务分成了创建目录、复制文件夹、安装 CRAN 包和安装 GitHub 包,这些仍然是相当多的层,但使代码更可读,以查看我试图用这段代码执行什么操作。
让我们通过使用我创建的 Dockerfile 作为示例来说明上述概念,从而对其进行分解:
FROM rocker/tidyverse:latest
LABEL maintainer="Peter Gensler <peterjgensler@gmail.com>" # Make ~/.R
RUN mkdir -p $HOME/.R# $HOME doesn't exist in the COPY shell, so be explicit
COPY R/Makevars /root/.R/MakevarsRUN apt-get update -qq \
&& apt-get -y --no-install-recommends install \
liblzma-dev \
libbz2-dev \
clang \
ccache \
default-jdk \
default-jre \
&& R CMD javareconf \
&& install2.r --error \
ggstance ggrepel ggthemes \
###My packages are below this line
tidytext janitor corrr officer devtools pacman \
tidyquant timetk tibbletime sweep broom prophet \
forecast prophet lime sparklyr h2o rsparkling unbalanced \
formattable httr rvest xml2 jsonlite \
textclean naniar writexl \
&& Rscript -e 'devtools::install_github(c("hadley/multidplyr","jeremystan/tidyjson","ropenscilabs/skimr"))' \
&& rm -rf /tmp/downloaded_packages/ /tmp/*.rds \
&& rm -rf /var/lib/apt/lists/*
为了构建一个容器,容器需要一个起始映像来开始,这个映像可以在 Docker Hub 上找到,Docker Hub 位于这里是。这里需要注意的一点是,虽然 Docker Hub 有 Ubuntu 或 Python 的官方图片,但 r 没有官方图片。幸运的是,Rocker 项目的人决定给我们一些非常有用的图片,作为一个好的起点:【https://www.rocker-project.org/images/】T2
接下来,我们需要创建一个。r 文件夹,通过下面一行:
RUN mkdir -p $HOME/.R
一旦完成,我们需要将 Makevars 文件从 GitHub 上的 R/Makevars 复制到容器的主目录中。Makevars 文件只是用来将参数传递给编译器(本例中是 C++ ),这样构建我们的容器的输出就不会有 rstan 包(prophet 包需要它)的一堆混乱的警告
COPY R/Makevars /root/.R/Makevars
一旦我们将正确的文件放入它们各自的位置,就该开始安装使用我们的 R 包所需的任何必要的库了。这里要注意的是,rocker/tidyverse 映像是建立在 Debian 的最新稳定版本(目前是 stretch)上的。要找到你可能需要的软件包,只需使用下面的链接在 Debian stretch 上搜索软件包(这并不总是最容易搜索的)
[## Debian -软件包
根据 Debian 自由软件的规定,Debian 官方发行版中包含的所有软件包都是免费的…
www.debian.org](https://www.debian.org/distrib/packages#search_packages)
如果您希望了解更多关于以下内容的信息,我强烈建议您在这里查看 apt-get 的文档:
RUN apt-get update -qq \
&& apt-get -y --no-install-recommends install \
[## apt-get(8) - Linux 手册页
apt-get 是处理包的命令行工具,可以被认为是用户对其他工具的“后端”…
linux.die.net](https://linux.die.net/man/8/apt-get)
我们在第二行所做的只是声明不要为一个给定的包安装任何推荐的包。
需要注意的一点是,在 docker 文件中,我们使用命令:
&& install2.r --error \
这是从包 littler 中取出的,它允许我们通过命令行安装 R 包。上面的错误标志仅仅意味着如果下面几行中的任何一个包出错,编译就会出错。请注意,上面安装以下包的脚本是一个连续的行,它允许在容器内安装包时创建尽可能少的层。
接下来,我们使用 Rscript,这是从 GitHub 命令行安装软件包的一种不同方式。
最后,我们使用下面的命令清理所有临时文件,以减小容器大小:
&& rm -rf /tmp/downloaded_packages/ /tmp/*.rds \
&& rm -rf /var/lib/apt/lists/*
既然我们的 docker 文件已经编写好了,那么是时候在本地测试我们的容器以验证它是否构建成功了
第 2 部分:本地运行容器
一旦我们创建了 Dockerfile,下一个测试就是看看我们是否可以在本地构建容器。虽然这一步听起来很简单,但仅仅构建容器只是征服 docker 之旅的一半。
为此,只需导航到包含您的文件的文件夹。在这个例子中,我只是进入名为 sandboxr 的文件夹。
cd ~/sandboxr
接下来,在您的终端中运行命令,这将构建映像。这需要一些时间,所以要有耐心。末尾的句点表明 dockerfile 位于我们所在的文件夹中,因此我们不需要显式指定路径:
docker build -t my_image .
完成后,您应该会在最后看到一条消息,表明映像已经成功构建。如果您的映像没有构建,请检查日志,看看是什么失败了,是不是需要一个 Debian 包,或者从源代码构建包有一些问题。
既然我们的 Dockerfile 已经编写好了,是时候使用一些 CI 服务来监控我们的构建了,这样当进行更改时,我们就可以看到这些更改是否破坏了构建。
第 3 部分:持续集成
持续集成的启动和运行可能会很麻烦,因此本文旨在提供一个关于如何为您的容器启动和运行框架的简要概述。大多数 CI 服务使用 YAML 文件,它只是一个配置文件,告诉服务如何构建您的容器,以及测试它的指令。我们将使用 Travis 进行 CI,但您也可以选择使用 Docker Hub 的 CI 服务来查看您的包是否已构建。如果您选择在 GitLabs 而不是 GitHub 上托管您的文件,您可以使用 GitLabs DIND 进行 CI,这需要您的 Docker 文件以及您项目的其他文件夹存储在 GitLab 中,然后使用 Docker 运行一个容器,该容器然后在中运行您的容器以测试它。我用 GitLabs 设置了我的项目,所以你可以看到。yml 文件不同于 Travis:
[## 签到
GitLab.com
gitlab.com](https://gitlab.com/petergensler/sandboxr/blob/master/.gitlab-ci.yml)
我也鼓励你去看看 Jon Zelner 关于与 Docker 一起建立 GitLabs 的博客,了解一下其他人是如何建立 git labs 的。yml 文件外观:
[## 再现性始于家庭
当谈到公共健康和社会科学时,再现性越来越成为话题的一部分…
www.jonzelner.net](http://www.jonzelner.net/statistics/make/docker/reproducibility/2016/05/31/reproducibility-pt-1/)
首先,将一个. travis.yml 文件添加到 Github 存储库中,如下所示:
sudo: required
services:
- dockerbefore_install:
- docker build -t pgensler/sandboxr .
script:
- docker run -d -p 127.0.0.1:80:8787 pgensler/sandboxr /bin/sh
我们在这里做什么?让我们来分析一下。首先,我们需要一个 sudo 命令,就好像这是在 Linux 机器上构建的一样,需要 sudo 来使这些命令正常工作。Travis 要求您在. travis.yml 文件中指定三个项目,如他们的初学者核心概念中所概述的:
- 服务
- 安装前 _ 安装
- 脚本
接下来,我们指定这个构建所需的服务。在这种情况下,我们只需要 docker 来测试我们的容器。我们想在 Travis 上构建容器,所以我们简单地使用命令 docker build 和 <github_username>/ <repo_name>。的。in 只是说在当前文件夹中查找 Dockerfile 来构建图像。</repo_name></github_username>
一旦构建了映像,我们就想看看是否可以运行容器作为一个简单的测试来验证容器是否工作。请注意,需要一个脚本来测试图像。如果没有指定脚本,那么 Docker 将尝试使用 Ruby 来测试容器,这可能会导致如下错误:
Error: No rakefile found
第 4 部分:与 Docker Hub 集成
如果你已经做到了这一步,恭喜你。您已经成功构建了一个 docker 文件,在本地对其进行了测试,集成了 CI 服务,并且您认为您的映像可以按预期工作。现在是时候整合 Docker Hub 和 GitHub 了,这样两者就可以互相交流了。现在,你可能会问自己“好吧,兄弟,但是谁在乎呢?”如果我的映像构建成功,我妈妈不会收到电子邮件通知?
你想“走过 Docker Hub 的门口”的原因很简单:这样别人就可以享受并受益于你的形象。通过查看 DockerHub 上他们的构建日志和 Dockerfile,我从其他映像那里学到了更多,从而了解如何定制我自己的构建来为我的容器获得灵感。举个例子,我发现有人在 Docker Hub 上成功构建了一个包,并有了输出。多棒啊。
登录 Docker Hub 并启用以下功能:
这将把你的 GitHub 库和 Docker 连接起来。这将允许其他人不仅可以查看您的 docker 文件,还可以查看您的容器的源存储库。我认为这是必要的,原因有二:它能让别人看到你的作品,得到灵感,并为你的最终产品感到骄傲。您刚刚创建了一个杰作容器,为什么不想与他人共享呢?
最终测试
要测试您的映像,只需尝试通过以下方式从 docker hub 获取映像:
- docker pull pgensler/sandboxr
现在,通过以下命令运行映像:
docker run -d -p 8787:8787 -v ~/Desktop:/home/rstudio pgensler/sandboxr
上面的命令获取您的映像,将其从 Docker Hub 中取出,作为一个容器在端口 8787 上运行,并将您的桌面映射到文件夹/home/rstudio,这样您就可以从容器内部访问机器上的文件。
最后,将您的浏览器指向 localhost:8787,就可以了!现在,您已经有了一个与 RStudio 的工作会话,并且您的包都已配置好,可以开始工作了!
收拾东西
完成映像后,记得清理映像,方法是通过以下方式将其从机器中删除:
Docker rmi $(docker images -aq)
最后的想法
将 Docker 与 R 集成在一起几乎是显而易见的——如果您希望能够与其他同事共享您觉得有用的包,那么您需要使用 Docker。为什么?因为它允许您以可重现的方式重新创建分析环境,所以其他人可以比试图找出 rstan 不能正确安装的原因更快地启动并运行。不仅如此,Docker 还鼓励你通过 Docker Hub 分享你的杰作,这是免费的,非常容易使用。Docker 可能非常辛苦,但考虑到你所创造的东西,它也非常值得——你会使用它吗?
用有限的移动时间和文件大小创建(几乎)完美的连接四个机器人
原文:https://towardsdatascience.com/creating-the-perfect-connect-four-ai-bot-c165115557b0?source=collection_archive---------0-----------------------
在位操作上,alpha-beta 剪枝和硬编码初始游戏状态,为 connect four 打造一个非常强大的 AI 代理。
在根特大学一年级工程师学习 Python 编程的“信息学”课程背景下,我们建立了一个人工智能机器人竞赛平台。目标是通过实现以下功能来创建一个玩游戏 connect-four 的机器人:
def generate_move(board, player, saved_state):
"""Contains all code required to generate a move,
given a current game state (board & player) Args: board (2D np.array): game board (element is 0, 1 or 2)
player (int): your plabyer number (float)
saved_state (object): returned value from previous call Returns: action (int): number in [0, 6]
saved_state (optional, object): will be returned next time
the function is called """
return 0
向平台提交代码后,自动挑战排行榜上排名比你高的所有玩家。游戏是在你的机器人和对手之间模拟的。每场游戏由五轮组成,如果出现平局,首先连接四个代币的玩家将获得 5 分,首先连接最长链(很可能是 3 个代币)的玩家将获得 1 分。这确保了总有一个赢家。第一轮的首发球员是随机选择的,之后球员们轮流首发。你的等级不断增加,直到你输了(天梯游戏)。
A simulation of a game between bots. Player 1 is definitely on the winning hand.
我和我的同事耶鲁安·范德胡夫特决定,根据下面的博客文章,尽可能多地模仿完美的解算者(,如果他能开始,他就赢得了比赛,这将是一个有趣的练习。我们的代码必须遵守的一些重要要求(这导致我们的解算器不是完全最优的)是:
*最大文件大小为 1 MB
- generate_move 不能运行超过 1s
*仅使用标准库和 NumPy
用位串表示游戏板
先介绍一种高效的存储游戏板的数据结构: bitstrings 。我将总结最重要的操作(例如检查四个令牌是否连接,以及在移动后更新棋盘)。关于位串(或位板)和所有可能的操作的详细解释,请查看这个自述文件(尽管做的有点不同)。
我们可以用两个位串的形式唯一地表示每个可能的游戏状态(或游戏板配置),这可以很容易地转换成整数:
*一个位串表示一个玩家的标记的位置(位置 )
*一个位串表示两个玩家的位置(掩码 )
对手的位置位串可以通过在掩码和位置之间应用异或运算符来计算。当然,为两个玩家的令牌存储两个位串也是一种可行的方法(然后我们可以通过对两个位串应用 or 运算符来计算掩码)。
位串由 49 位组成,其中包括一个 7 位的标记行(全为 0 )(稍后将解释其用途)。这些位的排序如下:
The ordering of the bits to in the bitstring (0 is the least significant, or right-most, bit). Notice how bits 6, 13, 20, 27, 34, 41 and 48 form a sentinal row, which is always filled with 0's.
例如,检查以下游戏板配置:
An example of a possible game state / board configuration
现在让我们用黄色玩家的位置位串形成位串:
**position**
0000000
0000000
0000000
0011000 = b'0000000000000000000110001101000100000000000000000'
0001000
0000100
0001100 = 832700416**mask**
0000000
0000000
0001000
0011000 = b'0000000000000100000110011111000111100000000000000'
0011000
0011100
0011110 = 35230302208**(opponent position)** 0000000 0000000 0000000
0000000 0000000 0000000
0000000 0001000 0001000
0011000 XOR 0011000 = 0000000
0001000 0011000 0010000
0000100 0011100 0011000
0001100 0011110 0010010
由于 board 输入参数是 numpy 数组中的 numpy 数组,我们首先需要将这个 board 转换成相应的位图。下面是实现这一点的(相当直接的)代码:
**def get_position_mask_bitmap(board, player):**
position, mask = '', ''
# Start with right-most column
for j in range(6, -1, -1):
# Add 0-bits to sentinel
mask += '0'
position += '0'
# Start with bottom row
for i in range(0, 6):
mask += ['0', '1'][board[i, j] != 0]
position += ['0', '1'][board[i, j] == player]
return int(position, 2), int(mask, 2)
我们现在可以使用位置位串来检查四个令牌是否连接,使用下面的位操作:
**def connected_four(position):**
# Horizontal check
m = position & (position >> 7)
if m & (m >> 14):
return True # Diagonal \
m = position & (position >> 6)
if m & (m >> 12):
return True # Diagonal /
m = position & (position >> 8)
if m & (m >> 16):
return True # Vertical
m = position & (position >> 1)
if m & (m >> 2):
return True # Nothing found
return False
现在,让我们分解检查四个令牌是否水平连接的部分:
1\. m = position & (position >> 7)
2\. if m & (m >> 14):
return True
第一步(1。)将我们的位串 7 的位置向右移动,并采用 and 掩码,这归结为将我们的位板中的每个位向左移动(我们减少位串中的索引,其中索引 0 对应于最右边或最不重要的位)。让我们以下面的 bitboard 为例(简化版,在真实游戏中不会出现):
0000000
0000000
0011110
0000000
0000000
0000000
0000000= b'0000000001000000100000010000001000000000000000000'
>> 7: b'0000000000000000100000010000001000000100000000000'0000000
0000000
0111100
0000000
0000000
0000000
0000000&: b'0000000000000000000000010000001000000100000000000'0000000
0000000
0011100
0000000
0000000
0000000
0000000
我们可以按如下方式查看新的位板:如果在其左侧有一个令牌,并且如果它是相同的,则位等于 1(或者换句话说:位等于 1 表示我们可以从该位置向左水平连接两个令牌)。现在进行下一个操作(2。),我们将结果向右移动 14 位,并再次应用 and 掩码。
0000000
0000000
0011100
0000000
0000000
0000000
0000000= b'0000000000000000100000010000001000000000000000000'
>> 14: b'0000000000000000000000000000001000000100000000000'
-------------------------------------------------
& : b'0000000000000000000000000000001000000000000000000'> 0? : True # four connected tokens found
通过将我们得到的位串向右移动 14 个位置,我们正在检查我们是否可以将两个水平连续的记号与棋盘上它左边两个水平连续的记号匹配。这些步骤组合起来相当于检查四个令牌是否水平连接。其他方向(对角线和垂直方向)的操作是相同的,我们只是将位图移动了或多或少的位置(1 表示垂直方向,8 表示西南方向的对角线(/),6 表示东南方向的对角线())。
标记行(7 个额外的位)的原因是为了区分网格的顶行和底行。没有它,这种方法会产生假阳性,下面是两个位置位串,一个在 6x7 网格上,另一个在 7x7 网格上。我们检查是否可以找到四个垂直连续的记号(在这种情况下,这是假的)
vertical check on 6x7 grid
--------------------------
0010000
0010000
0010000
0000000
0000000
0001000= b'000000000000000000000001111000000000000000'
>> 1: b'000000000000000000000000111100000000000000'
& : b'000000000000000000000000111000000000000000'
>> 2: b'000000000000000000000000001110000000000000'
& : b'000000000000000000000000001000000000000000'
> 0?: True (WRONG)vertical check on 7x7 grid
--------------------------
0000000
0010000
0010000
0010000
0000000
0000000
0001000= b'0000000000000000000000000001011100000000000000000'
>> 1: b'0000000000000000000000000000101110000000000000000'
& : b'0000000000000000000000000000001100000000000000000'
>> 2: b'0000000000000000000000000000000011000000000000000'
& : b'0000000000000000000000000000000000000000000000000'
> 0?: False (CORRECT)
现在让我们更好地看看移动操作,我们根据玩家的移动来改变位图:
**def make_move(position, mask, col):**
new_position = position ^ mask
new_mask = mask | (mask + (1 << (col*7)))
return new_position, new_mask
我们做的第一件事是在位置和掩码位串之间应用异或掩码,以获得对手的位置位串(因为在走完这步棋后将轮到他)。然后,我们更新我们的掩码位串,方法是在当前掩码和添加的掩码之间应用一个 OR 掩码,并在相应的列中添加一个位(我们希望丢弃我们的令牌)。让我们看一个例子:
**position**
0000000
0000000
0000000
0011000
0001000
0000100
0001100**mask**
0000000
0000000
0001000
0011000
0011000
0011100
0011110# Drop a token in the fourth column
--> make_move(position, mask, 4)new_position = position ^ mask
**new_position**
0000000 0000000 0000000
0000000 0000000 0000000
0000000 0001000 0001000
0011000 XOR 0011000 = 0000000
0001000 0011000 0010000
0000100 0011100 0011000
0001100 0011110 00100101 << (col*7)
0000000
0000000
0000000
0000000 = 268435456
0000000
0000000
0000100mask + (1 << (col*7)) = 35230302208 + 268435456 = 35498737664
0000000
0000000
0001000
0011000
0011**1**00
0011000
0011010mask | (mask + (1 << (col*7)))
0000000
0000000
0001000
0011000
0011**1**00
0011100
0011110
博弈树、极大极小和阿尔法-贝塔剪枝
在阅读前一部分时,你可能会想:“为什么要给代码增加这么多的复杂性?”。我们之所以过度优化四合一游戏的基本操作,是因为我现在要介绍的概念:游戏树。
对于每一个有离散行动空间(或每一步有有限数量的可能行动)的博弈,我们可以构建一个博弈树,其中每个节点代表一个可能的博弈状态。在偶数深度的内部节点代表初始游戏状态(根)或由对手的移动导致的游戏状态。奇数层的内部节点代表我们移动时的游戏状态。如果一个状态是游戏结束(四个代币连接或棋盘已满),则为叶节点。每个叶节点被授予一定的分数,不再进一步展开。下面是一个连接四个游戏的游戏子树的例子。
An example of a path to a game-ending state in a game subtree
总共有 4531985219092 个可能的叶节点,因此树中的节点总数要大得多。即使使用优化的位板操作,遍历整个游戏树在计算上也是不可行的。我们将需要技术来有效地在这棵树中找到一条获胜的路径。
现在,虽然上图中游戏树的路径 1–1–2 导致游戏结束状态,黄色玩家获胜(这是一条获胜路径),但它基于红色是一个愚蠢的机器人并搞砸了他的移动(他没有阻止你)的假设。
因为我们不知道我们要对抗的机器人有多“好”,我们不得不假设最坏的情况:如果我们的对手是最好的机器人,因此每次都采取最好的行动,那该怎么办?如果我们能找到对抗这样一个最坏情况的 bot 的获胜路径,那么我们绝对可以走这条路,并且确信我们赢得了比赛(真正的 bot 只能做得更差,让比赛更早结束)。对于连接四个游戏,这样的路径存在,如果你是开始玩家。这就是 minimax 算法发挥作用的地方。
在我们将这个算法应用于博弈树之前,我们需要为树中的每个节点定义一个得分函数。我们将采用与这篇文章所基于的博客文章相同的评分函数。一个游戏棋盘配置的分数等于:
- 0 如果游戏以和棋结束
- 22 -如果我们能赢游戏所用的石头数
- -(22 -石头数)如果我们会输。
在下图中,如果我们假设我们是黄色玩家,我们可以给游戏棋盘分配-18 的分数,因为红色玩家可以用他的第四颗石头获胜。
This game board is assigned a score of -18 since the opponent can finish with 4 stones
实际上,当游戏还没有结束时,很难分配分数。这就是为什么我们探索我们的树,直到我们到达一个叶节点,计算分数并将这个分数向上传播回根。现在,当我们向上传播这些值时,游戏树中的内部节点将接收多个值(每个子节点一个值)。问题是我们应该给内部节点分配什么值。现在我们可以给出内部节点的值的定义:
*如果内部节点在奇数深度上,我们取子节点的最小值值它们的值(作为对手,我们希望最终的分数尽可能为负,因为我们想赢)
*如果内部节点在偶数深度上,我们取子节点的最大值值它们的值(我们希望我们的分数尽可能为正)
这里有一个例子,直接取自维基百科:
The optimal score we can achieve is -7, by taking the action that corresponds to the edge that goes to the right child of the root.
所以现在我们有办法在博弈树中找到最优路径。这种方法的问题是,特别是在游戏开始时,遍历整个树需要很长时间。我们只有一秒钟时间行动!因此,我们引入了一种技术,允许我们修剪游戏树的(大)部分,这样我们就不需要搜索整个游戏树。这个算法叫做阿尔法-贝塔剪枝。
我将总结最重要的概念。Pieter Abbeel 教授的一步一步的视频可以在这里找到。我们定义以下变量:
- alpha :最大化器(us)在通往根的路径上的当前最佳得分
- beta :最小化器(对手)在通往根的路径上的当前最佳得分
我们所做的是每当我们看到来自我们孩子的新值时更新我们的 alpha 和 beta 值(取决于我们是在偶数还是奇数深度上)。我们将这些α和β传递给我们的其他孩子,现在当我们发现一个值高于我们当前的β,或者低于我们当前的α时,我们可以丢弃整个子树(因为我们确信最优路径不会经过它)。让我们看看另一个例子,同样取自维基百科:
- 我们首先遍历游戏树的深度,从左到右。我们遇到的第一片叶子是最左边的叶子(值为 5)。叶子将这个值传播给它的父节点,在父节点中β值被更新并变成 5。它还检查第二个最左边的叶子(其值为 6),但这不会更新任何值(因为如果从最小化的角度来看,6 并不比 5 好)。
- 在这个节点中找到的最佳值(还是 5)被传播到它的父节点,在那里 alpha 值被更新。现在,我们在这个父节点的右边的子节点,首先用值 7 检查它的左边的子节点,并更新 beta 值(我们现在有 alpha=5 和 beta=7)。我们检查下面的孩子:值为 4,这是最小化的更好的值,所以我们现在有β= 4 和α= 5。
- 既然现在β≤α,我们可以剪除所有剩余的子代。这是因为我们现在在那个内部节点中总会有一个≤ 4 的值(我们是极小化器,只在遇到比当前值小的值时更新我们的值),但是父节点只会在值≥ 5 时更新值(因为我们在那个节点中是极大化器)。因此,无论遍历所有节点后的值是多少,它都不会被最大化节点选择,因为它必须大于 5 才能被选择。
- 对于所有剩余的节点,此过程将继续…
这个算法的一个很好的 python 实现,作者是 AI 最著名的参考书之一的作者,可以在这里找到。
在接下来的部分中,将讨论对 alpha-beta 算法的进一步优化,其中大多数是专门为 connect-four 游戏定制的。为了评估每种优化的性能增益,我们将设置一个基线。我们将把成功率表示为已经完成的步数或步数的函数。如果在一秒钟内找到解决方案,则执行成功。这是我们的基线图。
The success rates in function of the sequence length. The longer the sequence, the smaller the moves till a game-ending state and thus how bigger the probability on a success. We can see that our algorithm can find the optimal moves once 27 moves have already been made (which means we would have to find an intermediate solution for the first 26 moves).
其他优化
在接下来的内容中,将列出最重要的已实现优化,并给出相应的成功率图,与基线进行比较。
1。使用缓存(转置表& Python LRU 缓存) 我们可以把位置和掩码位图加在一起形成一个唯一键。这个密钥可以存储在具有相应上限或下限的字典中。现在,在我们开始迭代所有的子节点之前,我们已经可以通过首先从缓存中获取相应的边界来初始化我们的当前值。另一个非常简单的优化是给每个 helper-function 添加LRU _ cache decorator。
We can see quite an improvement of our success rates compared to the baseline. Unfortunately, we plateau at around the same x-value as our baseline, which means we still need an intermediate solution for our (approximately) first 26 moves.
2。获胜状态的早期确定 最初,当连接了四个代币或者移动了 42 步时,到达结束状态(叶节点)。我们已经可以提前确定游戏是否会结束(也就是说,如果有三个连接的令牌,用户可以在连接中引入第四个令牌)。这是一个非常有效的检查,并使我们的树更浅。
We see a significant improvement by making our trees more shallow… Moreover, we plateau at a lower x-value (around 23), which means we will only need an intermediate solution for the first 22 moves.
3。寻找任何获胜路径,而不是移动次数最少的获胜路径 不是寻找最大值或最小值,我们可以只遵循第一个严格正或负(分别)值的路径。这些路径不是最佳路径(我们不会以最少的移动次数获胜,也不会以最大的移动次数失败),但我们对常规的胜利非常满意(它不一定是最佳路径)。
An increase in the success rates, but we do not plateau on a lower x-value.
4。其他优化 尝试了许多其他优化:多处理(没有成功,可能是由于 Python 中的开销),基于试探法对叶子遍历的顺序进行排序(仅在博弈树的较低深度有效),过早修剪子树,这将导致博弈失败(小收益)等。以下是我们最终解决方案的成功率:
The final listed improvements did not result in significant gains. Our solver can solve every sequence as soon as the length is higher or equal than 23. This means we need to find a solution to bridge the first 22 moves, where our solver often takes longer than 1 second.
存储前 22 个最佳移动
现在仍然有很多可能的优化,但在 1 秒钟内找到每个可能的游戏配置的最佳移动似乎是一项几乎不可能的工作,特别是在 Python 这样的语言中。但是由于游戏是确定性的,对于每个给定的游戏配置,只有有限数量的最优移动。举例来说,玩家开始游戏的最佳行动总是在中间一栏丢一个代币。
因此,我们决定以硬编码的方式存储较短序列的所有最优移动(或已经进行了少量移动的游戏状态)。同样,这被证明是具有挑战性的,因为文件大小只能是 1 兆字节。
对于每个可能的序列(一个序列的例子可能是 3330,这意味着已经进行了 4 次移动:中间一列中有 3 个标记,最左边一列中有 1 个标记),我们存储了它的最佳移动(,对于这个序列将是 4)。一个简单的字典,其中不同的序列表示键和最佳移动,相应的值在文件大小方面非常快地爆炸。这是因为存储了大量冗余信息。一种非常有效的压缩是不使用字典,而是使用 7 个集合。将属于最佳移动的所有序列(字典中的相同值)存储在同一集合中(我们的序列 3330 将与其他序列如 2220 一起存储在同一集合中)。然后查询所有集合找到某个序列,找到匹配的就输出对应的招式。七个集合中的一个也可以被丢弃用于进一步压缩(如果我们不能在所有 6 个集合中找到匹配,那么最终集合必须包含该序列)。
当我们还想存储更长的序列时,这些包含序列的集合仍然倾向于变大,所以我们决定寻找一种更有效的方法来存储序列。我们试图找到一个函数f
,使得f(x) = y
中的x
是序列(由数字 1-7 组成,前面用 0 填充,这样所有的序列都有相同的长度),而y
是相应的最优移动。这是一个典型的机器学习设置,我们试图构建一个模型,在给定输入向量的情况下,准确预测某个值或类。此外,我们有很多数据(我们的求解器可以被视为一个甲骨文,你只需给它序列,并等待相应的最优解)。我们试图拟合一个神经网络,但我们不能达到 0 的误差(这意味着对于某些序列,给出了一个次优解)。然后,我们尝试了一个决策树,以其过度拟合能力而闻名(特别是如果您没有指定最大深度或事后修剪树)。事实上,数据的误差可以达到 0(事实上,只要我们没有两个标签冲突的相同输入向量,决策树归纳技术总是可以发现完全符合训练数据的假设)。因此,我们找到了一个函数,它可以输出特定长度的给定序列的最优移动。通过广度优先遍历决策树并存储节点信息,可以非常有效地反序列化该决策树。下面是一个决策树的例子(长度不超过 2 的序列)。不幸的是,我们没有得到在 dockerized 容器中工作的决策树解决方案,并且不得不求助于 6 个集合来存储我们的序列。
A decision tree for sequences of maximum length 2. The root node can be interpreted as follows: if the board is empty or the first move of the opponent was in the left-most column (empty sequence or ‘1’), then place a token in the middle. As expected, we see a lot of leaf nodes with 4 (since moving a token in the middle column is often the most optimal move in the beginning of the game). The root node and its two children can be serialized as: ‘0<2 4 1<2’, which is very space-efficient.
由于连接 4 游戏是对称的,我们从来没有存储过大于所有 4 的序列。因此,如果我们要存储长度不超过 4 的序列,我们将只存储小于 4444 的序列。如果我们曾经遇到过比这个更大的序列,我们可以通过对序列中的每个k
应用8 — k
来镜像它。此外,假设每个状态都有一个最优解,那么可以将移动集合分成两个不同的集合:一个用于奇数移动,一个用于偶数移动。使用这种方法可以显著减少状态表示。例如,考虑以下移动顺序:
1\. 3
2\. 3
1\. 3
2\. 3
1\. 3
2\. 0
1\. 2
2\. 1
一种可能的表示是 33333021。然而,我们知道我们的机器人会在每个可能的状态下采取最优解。因此,只提取对手的移动就足够了。如果机器人分别是第一个或第二个玩家,这将导致 3301 或 3332 的状态表示。使用这些状态表示导致树中的路径更短,从而导致更压缩的动作查找表。
结束语
耶鲁安和我在比赛中得到了很多乐趣,这对我们双方来说都是一次很好的锻炼。我们希望一次提交就足以获得第一名,但是我们在使我们的代码在 dockerized containers 服务器端工作时遇到了一些麻烦。
我要感谢所有参赛的学生,并祝贺 TomVDM、pythonneke 和 Ledlamp 获得前三名。此外,一年级工程学生提交的材料的多样性和复杂性给我留下了深刻的印象。提交的内容从阿尔法-贝塔剪枝(尽管没有我们的搜索深入),非常聪明的启发式方法,甚至神经网络。
如果这篇博文中有任何不清楚的地方,如果你知道任何可能的改进,或者如果你想对一些书面部分进行更多的澄清,请留下评论。此外,我愿意应要求与他人分享(研究级)python 代码。
明年另一场 AI 比赛再见;)、
张卫&耶鲁安
用 R 创建美国移民路径图
原文:https://towardsdatascience.com/creating-us-immigration-path-map-in-tableau-with-r-dd781c465840?source=collection_archive---------21-----------------------
在 Tableau 看过目的地地图吗?它通常用于显示航班、公交地图、交通等的轨迹。有大量的视频和文章教你如何从包含你需要的所有信息的数据集中创建目的地地图,例如,这个视频使用延迟的航班数据,其中每一行、起点和目的地都已经提供。如果你的数据集不是这样的标准飞行数据集呢?在这里,我将用来自国土安全部(附件中的第一个补充表格)的移民数据向您展示一个例子。数据看起来像这样:
最左边一栏是移民的祖国,标题是他们要去的州。根据 Tableau 教程,如果我们要生成目的地图,数据应该遵循如下模式:
from Tableau Online help
最后三列是必需的。路径 ID 用于识别始发地和目的地的位置(经度和纬度)数据。
数据准备
因为我们要说明 10 年后的路径,并且有 10 个 excel 文件,所以最好先创建一个数据处理函数,并将其应用于所有文件。我们首先从读取和清理数据开始。
1.数据读取
year = 2017
path = paste(as.character(year), ".xlsx", sep="")
df = read_excel(path, na = c("D", "-"), skip = 3)
df = df[-c(1:11). -2]
df = df[ , !(names(df) %in% c("U.S. Armed Services Posts", "U.S. Territories1","Guam", "Unknown"))]
df = head(df,-5)
colnames(df)[1] = 'country'
我去掉了电子表格中一些不必要的数据和注释,以及一些实际上没有陈述的列(例如,武装部队)。此外,一些单元格为“D”,即为了限制披露而保留的数据。我把他们当娜。
2.数据清理
表格只记录了移民的出生国。但是,有些国名只存在于历史中。如果我们不考虑它们,最终的地图将不会反映真实的路径。此外,一些国家名称与我们稍后将使用的地理信息不一致。
df$country = gsub('Czechoslovakia \\(former\\)|Czechoslovakia, former', 'Czechia', df$country)
df$country = gsub('Netherlands Antilles \\(former\\)', 'Curacao', df$country)
df$country = gsub("China, People's Republic", 'China', df$country)
df$country = gsub('Serbia and Montenegro \\(former\\)|Serbia and Montenegro', 'Serbia', df$country)
注意正则表达式。记住在 r 中用两个反斜杠对括号进行转义。
3.数据转换
stk = stack(df, select= -country)
stk$from = rep(df$country,(ncol(df)-1))
stk$year = rep(year,(ncol(df)-1))
stk$id = paste(stk$from,stk$ind,stk$year,sep="-")
stk = na.omit(stk)
接下来,我们将堆叠数据(考虑转置每一行),并为每个转置的行添加 country 列。现在,始发地国家和目的地国家在同一行。然后添加年份信息和路径 ID。现在数据看起来像这样:
4.添加位置数据
最后,我们将连接国家和州的经度和纬度表。我们可以在 Google developer 网站上找到这样的数据,使用 R 中的 XML 包,我们可以很容易地将它作为一个数据帧。当然,你也可以将数据复制到 Excel 并存储为 csv 格式,然后从 r 中读取。
library(RCurl)
library(XML)
ccode = readHTMLTable(getURL("[https://developers.google.com/public-data/docs/canonical/countries_csv](https://developers.google.com/public-data/docs/canonical/countries_csv)"), stringsAsFactors = FALSE)[[1]][ ,-1]
scode = readHTMLTable(getURL("[https://developers.google.com/public-data/docs/canonical/states_csv](https://developers.google.com/public-data/docs/canonical/states_csv)"),stringsAsFactors = FALSE)[[1]][ ,-1]
ccode[1:2] = sapply(ccode[1:2], as.numeric)
scode[1:2] = sapply(scode[1:2], as.numeric)
然后找出堆叠数据中的国家和位置数据中的国家之间的差异,并更改位置数据框中的名称。例如,美国人把缅甸称为缅甸。最后,我们将数据分别与国家位置和州位置连接起来,并绑定两个数据框的行。因此,在最终的数据帧中,每个路径 ID 对应于两个记录,一个包含源信息,一个包含目的地信息。
您可以将这些步骤打包成一个函数,这样您就可以根据需要调用多年的数据。完整的代码在我的 GitHub 上。
Tableau 中的映射
现在您已经准备好了数据,是时候展示您的 Tableau 技能了!事实上,这再简单不过了。
- 加载不同年份的数据并合并它们(不要合并)。
2.将经度和纬度拖到列和行中。
3.选择标记类型作为线条。
4.将年设置为日期,然后设置为过滤器。
5.将订单拖到“路径”上,并将路径标识拖到标记卡下的“细节”上。
6.定制您的地图!
您可以将值(每条路径上的人数)拖动到颜色上,以便更直观地了解哪些路径的人数更多。把它作为一个过滤器,把那些只有很少几个人的路径排除在外。我将阈值设置为 2000。这样,你的地图就不会看起来这么拥挤了!
查看我在 Tableau Public 上的最终作品,了解美国移民是如何随着时间变化的。这张地图是我的数据可视化课程最终项目的一部分。您也可以通过单击其他图表进行过滤,找到某个大陆或国家的移民趋势。
谢谢你的阅读和快乐的活动!
使用深度神经网络图像分类器的单词嵌入
原文:https://towardsdatascience.com/creating-words-embedding-using-deep-neural-network-image-classifier-ae2594d3862d?source=collection_archive---------6-----------------------
众所周知,单词嵌入在许多 NLP 任务中非常强大。大多数当前的实现使用所谓的“分布假设”,即在相似的上下文中单词具有相似的含义。人类不仅可以通过可能使用的上下文来判断两个单词是否相似,还可以通过观察或想象这个单词可能代表的物体来判断。很多时候,相似的物体与具有相似含义的单词相关,如“汽车”和“卡车”,“房子”和“建筑物”,“狗”和“猫”。
在这篇文章中,我想探索这个想法,并尝试创建单词嵌入,这将保留单词的语义,我将通过使用一个在图像上训练的神经网络来完成。
我想使用 pertained ResNet
模型创建单词嵌入,这是一个非常流行的图像分类器,它是在“ImageNet”数据集上训练的。然后,我想使用新的嵌入来构建一个翻译系统。西班牙语中的 Car 看起来与英语中的 Car 非常相似(甚至完全相同)。我想用这个把任何语言的单词翻译成英语。
你可以在这里找到所有的代码
如 ImageNet 网站所述“ImageNet 是一个根据 WordNet 层级(目前只有名词)组织的图像数据库”。它在包含超过 1400 万张图像和 1000 个类别的 ImageNet 数据集上进行训练。我将使用模型最后一个内层的预测值创建单词向量,并假设如果单词对应的图像相似,则单词具有相似的含义。
我们来看一个小例子。我们有四个词:卡车、酒、汽车和瓶子。
作为人类,我们可以分辨出“卡车”和“汽车”比“卡车”和“瓶子”更相似,或者“酒”和“瓶子”比“酒”和“汽车”更相似。事实上,这些单词的图像看起来很相似。那些物体在现实生活中看起来很相似。
在这里,我将只为名词创建嵌入,因为它们的图像可能比“to”、“and”、“the”等词的图像更好地描述了实际的单词。
首先,我们需要找到一个大的名词列表。为此,我们将使用 NLTK:
nouns = set()
for synset in list(wordnet.all_synsets('n')):
n = synset.name().split('.')[0]
if len(n) > 2 and n.isalpha():
nouns.add(n)
经过一些清理,我们有大约 39,000 个名词。实际上,并不是所有的都是名词,但我们还是坚持用它们。
接下来,我们希望为我们拥有的每个单词获取一个图像。我们将使用谷歌图片搜索。有一个很棒的叫做[google_images_download](https://github.com/hardikvasa/google-images-download)
的 python 库可以帮助我们。我们希望重新缩放图像,以便所有的图像都具有相同的大小。然后,我们将使用ResNet
来创建单词向量。我将使用网络的最后一层,就在最后的softmax
之前:
resnet = ResNet50(weights='imagenet',
include_top=False,
pooling='avg')embeddings = KeyedVectors(2048)for word in nouns:
response = google_images_download.googleimagesdownload()
path = response.download({'keywords': word, 'limit': 1})[word][0]
img = cv2.imread(path)
img = scipy.misc.imresize(img, 224.0 / img.shape[0])
img = img.reshape((1,) + img.shape) embeddings[word] = resnet.predict(img)[0]
让我们看看我们的嵌入:
看起来不错。我们可以看到“car”和“truck”比“car”和“dog”更相似
embeddings.similarity('car', 'truck') # = 0.419
embeddings.similarity('car', 'dog') # = 0.270
这并不奇怪,这只是'汽车'、'卡车'、'狗'形象的相似而已!我们使用ResNet
模型的内层来获得这些图像的一般表示,这样我们更容易比较它们。
我们的嵌入可能保留了单词之间的语义相似性,但它错过了其他嵌入所具有的非常有趣的部分。在我们的嵌入中,我们不能做类似于queen — king = woman — man
的事情,因为我们的嵌入只捕获两个单词/对象之间的相似性,但它不能捕获单词之间更复杂的关系。我们在这里没有使用英语,我们只是看图像之间的相似性。
现在我想用我的新嵌入构建一个简单的翻译系统。这非常简单,给定任何语言中的任何单词,我们将使用 Google images 搜索来找到相应的图像,然后我们将使用ResNet
来预测最终的图层值,最后,找到与这些预测值最相似的英语单词:
def translate(word):
response = google_images_download.googleimagesdownload()
path = response.download({'keywords': word, 'limit': 1})[word][0]
img = cv2.imread(path)
img = scipy.misc.imresize(img, 224.0 / img.shape[0])
img = img.reshape((1,) + img.shape) vector = resnet.predict(img)[0] return embedding.most_similar([vector])[0]
让我们看一些例子:
>>> translate("מכונית") # 'car' in Hebrew
Output: clio # Brand of car (Renault Clio)
>>> translate("ristorante") # 'restaurant' in Italian
Output: 'grubstake' # A restaurant in San Fransisco
>> Translate("еда") # 'meal' in Russian
Output: thanksgiving
正如你所看到的,它一点也不完美,但它确实输出了一些有趣的翻译。
这种“嵌入”实际上是在图像的ResNet
表示之上的简单的“K 最近邻”模型。这并不是真正的翻译单词,但一个好处是,我们能够比较(或分类)成千上万种类型的单词/图像/类别,而最初的ResNet
模型只训练了 1000 个类别。
最终注释
这是一个有趣的实验(至少对我来说),但正如你可能想象的那样,它并不那么有用,也不实用。下载约 39K 的照片需要很多时间,并且不能保证下载的图像是我们想要或需要的。受益于适当嵌入的最常见的任务之一是文本分类。我试图用这种嵌入方式解决“20 个新闻组”的分类问题,但没有成功。如果你对它感兴趣,你可以在这里找到代码,这是一个相当凌乱的笔记本。它显示了 3 个实验,随机可训练嵌入,手套不可训练嵌入,和我的视觉嵌入。尽情享受吧!
在 Kaggle 上创建你的人工智能项目
原文:https://towardsdatascience.com/creating-your-ai-projects-on-kaggle-ff49f679f611?source=collection_archive---------8-----------------------
我们正在将 Kaggle 打造成为一个平台,在这里你可以合作创建你所有的人工智能项目。在过去的这个季度,我们通过推出许多新功能和扩展计算资源,增加了您可以在我们的平台上构建的工作的广度和范围。
现在,您可以加载正在使用的私有数据集,在我们基于云的数据科学环境中对其进行复杂的分析,并以可复制的方式与合作者共享项目。
将私有数据集上传到 Kaggle
我们首先将 Kaggle 内核和数据集作为公共产品推出,其中所有创建和共享的东西都必须是公共的。去年 6 月,我们让您能够创建私有 Kaggle 内核。这改变了你们中有多少人使用 Kaggle: 94.4%的内核是私有的。
然而,这个故事并不完整:您只能在公共数据上运行内核。这阻止了你将 Kaggle 用于你自己的私人项目。
在过去的这个季度,我们推出了私有数据集。这让您可以将私有数据集上传到 Kaggle,并在内核中运行 Python 或 R 代码。您可以上传无限数量的私有数据集,最高限额为 20GB。所有新数据集默认为私有。您可以通过点击www.kaggle.com/datasets上的“新建数据集”或内核编辑器的“数据”选项卡上的“上传数据集”来创建数据集。
一旦你创建了私有数据集,你可以通过 Kaggle API 发布新的版本来保持它的更新,我们在一月份发布了这个 API,并在三月份进行了扩展。这个 API 使您能够从命令行下载数据和提交竞赛资料。
Kaggle 内核的全新编辑体验
既然已经创建了私有数据集,就可以将其加载到 Kaggle 内核中。
Kaggle 内核使您只需点击一个按钮,就可以在云中创建交互式 Python/R 编码会话。这些编码会话在 Docker 容器中运行,Docker 容器提供了版本化的计算环境,并包含了许多 Python 和 R analytics 生态系统。
我们有两种截然不同的内核运行模式:交互和批处理。交互式会话使您能够在实时会话中编写 Python 或 R 代码,因此您可以运行选定的代码并立即看到输出。一旦你完成了一个会话,你可以点击“ Commit & Run ”来保存代码版本,并在一个干净的环境中自顶向下运行一个批处理版本。您可以关闭您的笔记本电脑并离开——这个批处理运行将在云中完成。
当您回来时,您将拥有您创建的所有批处理运行的完整版本历史。如果您在会话结束时没有“提交并运行”,您的最新编辑将被保存为工作草稿,您将在下次编辑内核时看到。
我们一直在交互式模式下启用笔记本电脑,并在本季度推出了对脚本的交互式支持。
除了交互式脚本,我们还更新并统一了 Kaggle 内核的脚本和笔记本编辑器。这使您可以访问控制台,显示当前会话中的变量,并使您能够在交互式会话中查看当前的计算使用情况。它还为许多令人兴奋的未来扩展奠定了基础。
在 Kaggle 内核中创建更复杂的项目
在过去的一个季度中,我们专注于扩展您可以在 Kaggle 内核中完成的工作。让你能够处理私人数据是其中的一部分。
我们将 Kaggle 内核中的计算限制从一小时扩展到六小时。这增加了您可以运行的模型和可以分析的数据集的大小和复杂性。这些扩展的计算限制适用于交互式会话和批处理会话。
我们增加了在你的内核中安装定制包的能力。你可以在内核编辑器的“设置”标签中完成这项工作。在 Python 中,对 PyPI 或 GitHub 上的包运行“pip install”命令。在 R 中,对 github 上的包运行“devtools::install_github”命令。这扩展了我们的基本容器,以包含添加的包。随后的内核分叉/编辑在这个定制容器中运行,使您和其他人更容易复制和构建您的结果。
此外,我们专注于提高 Kaggle 内核的健壮性。我们在幕后所做的改变将使内核运行更加可靠和流畅。如果您在这里遇到任何问题,请让我们知道。
与协作者共享您的项目
一旦你上传了一个数据集或者编写了一个内核来启动一个新项目,你就可以与合作者分享你的工作。这将使他们能够看到、评论和构建您的项目。
您可以将协作者添加为查看者或编辑者。
数据集上的查看者可以在数据上查看、下载和写入内核。编辑者还可以创建新的数据集版本。
内核上的查看者可以看到内核并将其分叉。如果他们可以访问所有底层数据集,他们还可以复制和扩展它。内核上的编辑器可以直接编辑内核,创建一个新版本。
当你创建一个内核作为竞赛团队的一部分时,默认情况下,它与你团队的其他成员共享。我们听说,由于不同的计算环境,许多竞赛团队在协作方面遇到了困难,我们希望这能让您在竞赛中更容易地合作。
其他更新
我还想介绍几个产品更新。
我们推出了 Kaggle Learn 作为一种快速、结构化的方式,让您获得更多关于分析、机器学习和数据可视化的实践经验。它包括一系列快速教程和跨越六个轨道的练习,您可以完全在您的浏览器中完成。
我们完成了第二届内核竞赛,所有参赛作品都需要通过内核提交。2,384 支队伍参加了比赛,这让我们大吃一惊。感谢所有对这种新的比赛形式的深思熟虑的反馈。我们了解到限制计算功能是对模型复杂性极其有效的正则化。我们还了解了纯内核格式的一些挫折,包括可变的计算性能。总的来说,第二届内核竞赛非常成功,我们的目标是在未来对这种竞赛形式进行更多的迭代,同时根据您的反馈进行改进。
我们推出了对 BigQuery 公共数据集的集成,使您能够从内核中查询更大、更复杂的数据集,如 GitHub Repos 和比特币区块链。
你们中的许多人告诉我们,你们希望对以前发布的内容有更多的控制权,并且能够删除它们。我们听到了。你现在可以删除你在 Kaggle 上写的数据集、内核、主题和评论。这些留下了一个【删除】外壳,这样相关的内核或注释仍然有一些上下文。
我们在 Kaggle 上发布了一个不同主题的概述页面,让你可以更容易地按主题浏览数据集、比赛和内核。
谢谢
我非常感谢 Kaggle 的团队,他们努力工作以获得这些更新,并继续建立世界上最好的数据科学项目合作场所。
最重要的是,我要感谢你,感谢你成为 Kaggle 社区的一员。我们的平台不能没有你。我们不断惊讶于你为竞赛构建的创造性解决方案,你通过内核分享的见解,以及你如何帮助彼此成长为更好的数据科学家和工程师。
您对我们有什么反馈吗?我们很乐意倾听—请在我们的 产品反馈论坛 分享您的想法。
音乐中的创造性人工智能:Sync 和其他迷人用例的天才创新
原文:https://towardsdatascience.com/creative-artificial-intelligence-in-music-genius-innovation-for-sync-and-other-fascinating-use-d36e34732525?source=collection_archive---------6-----------------------
现在我们已经过了人工智能创作的第一首歌曲,你认为使用人工智能是优化电影,电视和游戏行业音乐生成的合乎逻辑的下一步吗?
“我一直着迷于这样一个概念,即我们可以自动或智能地做人类认为只有他们才能做的事情。我们总是把创造力视为人类最后的堡垒。你能按一个按钮写一首交响乐吗?”— —英国科技初创公司 AI Music 的首席执行官 Siavash Mahdavi 正在探索人工智能和音乐之间的潜在交集。
许多人工智能公司现在都在深入研究这项技术在音乐行业的各种应用,并已经取得了令人瞩目的成就。电影、电视、视频和游戏行业日益紧张的预算促使人们寻找在不牺牲音乐质量的情况下降低成本的方法。现在,各种各样的人工智能公司正在努力开发技术,这些技术可以成为在这些媒体中使用的实际轨道生成背后的创造性力量。
这个领域正在迅速扩张,越来越多的公司竞相将自己的软件提升到一个新的水平,包括英国的 Jukedeck 和 AI Music,旧金山的 Humtap,柏林的 Melodrive 和 Groov。AI 在加州山景城。甚至谷歌也有一个名为 Magenta 的人工智能音乐研究项目正在进行中,索尼的计算机科学实验室(CSL)也在进行一个名为 Flow Machines 的类似项目。
对专业音乐家的影响。
所有这些公司和研究人员都试图回答同一个复杂且有时有争议的问题:机器能否使用神经网络等人工智能技术来分析现有的人造音乐,并随后学习如何创作自己的作品?虽然这本身肯定是一个非常复杂的问题,但它也提出了一个额外的问题,即这项技术对专业音乐家有什么影响,他们中的许多人通过创作或授权音乐用于电视节目、电影和视频游戏来获得全部或部分收入。事实上,一些音乐人甚至提议限制将他们以前的录音和作品用于人工智能和机器学习目的。与此同时,其他艺术家也意识到艾的创造力,将这种创造力融入到他们的作品中。
有价值且无威胁的用途
尽管人工智能在音乐中的上述应用存在一系列问题和担忧,但其他有价值和无威胁的应用已经在很好地工作。
其中一个应用是根据心情创建播放列表。虽然 Gracenote 的音乐数据专家多年来一直按照这种标准对音乐进行分类,但员工并没有真正听过公司数据库中 1 亿首歌曲中的每一首。相反,Gracenote 使用机器学习和人工智能来教计算机如何检测音乐中的情绪,从而让机器准确地将曲目分类为梦幻、悲伤、闷热或其他感觉。
另一个有趣的当前集成来自谷歌研究员道格拉斯·埃克,他发起了该公司的 Magenta 项目。研究团队正在研究的一个概念涉及通过分析数百个音符,教会神经网络如何学习乐器的音乐特征。该机器随后创建识别该特定仪器的数学表示。这使得能够简单地在屏幕上移动按钮来组合乐器,以便创建全新的虚拟乐器,例如 62%的小号和 38%的萨克斯管,或者任何其他声音的组合。
不要把 AI 当成敌人,而是合作者。
音乐产业正处于彻底改变歌曲创作方式的风口浪尖上,歌曲的创作方式有着广泛的用途。从电影和电视背景音乐到视频游戏,甚至可能是流行歌曲,人工智能都处于这个机器驱动的音乐创作新时代的前沿。充分利用其潜力的关键是不要把人工智能当作敌人——而是当作合作者。让它与艺术家的作品相得益彰。即使它自动化了一些任务,人类仍将在创造过程中掌舵。至少在可预见的未来。
由 谢尔盖布多夫【SVP】媒体&娱乐 数据艺术
发现更多谢尔盖·布鲁多夫的故事
创造力——总有更多的空间
原文:https://towardsdatascience.com/creativity-theres-always-room-for-more-726f26b6966f?source=collection_archive---------1-----------------------
呼叫和响应,1 号
Image courtesy of Kevin Ryder. https://flic.kr/p/fyezwg
形容词——指或关于一种演唱风格,其中一个歌手演唱的旋律被一个或多个歌手回应或呼应。****
从统计学上来说,如果你正在阅读这篇文章,你已经知道了这一点——21 世纪有创造力的人的主要职业似乎是谈论成为 21 世纪有创造力的人——它是什么样的,它应该是什么样的,以及“你也可以成为 21 世纪有创造力的人!”我明白了。注意力是互联网时代的货币,媒体上最受欢迎的两个故事标签是“创造力”和“生活课程”,这不是没有道理的
只有一个问题。关于创造力的文章是由有创造力的人写的——每个人都是自己自传中的英雄。许多描述如何成为一个有创造力的人的文章可以被理解为规则或要求,即使目的是提供鼓励。
所以我想也许回答一些总是给我带来麻烦的“规则”会有助于鼓励。
#1:艺术家必须创造艺术
这种想法从我上小学开始就受到了不同程度的折磨,到了我甚至不再称自己为艺术家的地步。为什么?因为我总是不得不做出选择——在艺术和数学之间,在视觉艺术和音乐之间,在素描和绘画之间,在…
明白我的意思吗?总是有选择的。事实上,太多了,以至于放弃告诉任何人你是一名艺术家要比努力名副其实容易得多。说“一个真正的艺术家必须创造艺术”是无害的,因为这是错误的。有害是因为不完整。**
每次你选择做艺术之外的事情,你都是不负责任的、坏的或者失败的,这也是不对的。创造是一个制造过程,就像其他任何过程一样,在实际制造发生之前,它需要原材料和准备时间。重要的是记住这个过程,并知道你在创作道路上的位置。这样,你就能区分“收集原材料”和“拖延症”
#2:创造力是生活中最大的奥秘
当多萝西发现伟大而强大的奥兹实际上只是一个幕后的人时,这是一件大事。可惜,我不知道巫师在哪里。据我所知,巫师是幕后黑手。老实说,我仍然在猜测,那是在 8 年的正规教育和 20 年的实践之后。然而,我知道这一点——保持创造力的神秘绝对符合每个有创造力的人的最佳利益,即使我们声称要向你们解释这一切。
听着,我就直说了。在宇宙中,甚至在全球范围内,艺术没有任何作用。我不能把墨西哥湾的虾数量描绘回 BP 之前的状态,就像我不能把渡渡鸟从灭绝中唱回来一样。不,一个有创造力的人的工作始于并止于人类领域。因此,有创造力的人的幸福依赖于在人类领域获得并保持健康的地位。这就像一个古老的圣职——我们不耕种、不建筑、不打猎,所以我们的生存取决于能否让你相信我们所做的事情值得保留。
不幸的是,人类领域显然已经决定说“去他的神秘,给我钱。”现在有了写新闻故事的算法,可以自己拍摄专业质量照片的相机,以及可以自动调谐到接近其寿命的最畅销音乐。
那不是抱怨。“神秘”不是一种你可以一直卖下去而不会被任何人发现的产品。然而,它确实把有创造力的人放在了寻找新产品或新市场的位置上——我相信这就是我们现在所看到的。谁也不知道最后会怎样,但没关系。坚持一直是创造力的基石。你尝试,你失败,你尝试,你成功——起泡沫,冲洗,重复。
#3:艺术家必须为艺术牺牲一切
每个人都喜欢谈论过创造性生活的所有牺牲。它描绘了一幅美丽的画面,但并不十分准确。毕竟,如果你不在乎你“放弃”了什么,这就不是牺牲。据我估计,当一个艺术家意识到他们牺牲了什么的时候,他们已经走了很远,他们甚至看不到岔路口。
相信我,有很多次我都希望自己当初做出了不同的选择。然而,直到最近,我才开始后悔在大学里学习美术。你明白了吗?我花了 20 年的时间去生活和工作,才开始珍惜我在那段时间里失去的东西。从这个角度来看,说我为了成为一个有创造力的人而牺牲了一切真的公平吗?号码
牺牲和后悔有着天壤之别。即便如此,说我后悔作为一个有创造力的人生活也是不对的。我只是现在年纪大了,有了一个老年人的优先权。安全和稳定比过去更重要。我对这个世界的运作方式有了更多的了解,对于一个有创造力的人来说,我可以看到比以前更多的空间。我只是不需要我年轻时需要的东西,也不需要为我未来几十年的生活做出选择。所以说真的,我牺牲了什么?
诚实,而不是讽刺
希望,亲爱的读者(我一直想称某人为“亲爱的读者”),你没有把这看作是一个失败的艺术家兼作家的酸葡萄心理——不管他在寻找什么来解释他的失败。我可能会以失败告终——从技术上来说,这个问题还没有定论——但让我对所有“如何成为一个有创造力的人”的写作感到如此不安的是那些被它排除在外的人。
每当有人看着我拍的一张照片或写的一个故事,说“我希望我也能那样做”的时候,实际上对我来说是痛苦的。作为一个有创造力的人,我最自豪的时刻是那些我所做的只是为别人打开创造的大门的时候。
我之所以这么喜欢说“尽管不是每个人都会在大都会博物馆有个展,但每个人都应该去画”**
本文的“号召”是 Jamie Varon 的高创造力的人为了他们的艺术而牺牲的 11 件事。去读吧。
信用卡聚类
原文:https://towardsdatascience.com/credit-card-clustering-6a92657ac99?source=collection_archive---------9-----------------------
使用 AuDaS 实现自动化集群
营销人员面临的首要挑战是了解他们的销售对象。当你知道你的买家的角色时,你可以定制你的目标和产品,以提高他们的满意度,从而增加你的收入。当你已经有了一批客户和足够的数据,对他们进行细分会非常有用。在本文中,我们将了解如何使用聚类对一些信用卡客户进行细分。用于此分析的数据取自 Kaggle ,我们将使用 AuDaS 来自动识别集群。
数据
每个客户的信用卡数据有 17 个属性,包括余额(客户所欠的信用)、预付现金(当客户使用信用卡提取现金时)、客户的信用额度、最低还款额、全额还款额的百分比和期限。
数据相当干净,但是有一些丢失的值被 AuDaS 自动拾取。
在应用了 AuDaS 建议的数据准备建议后,我们能够查看信用卡客户的直方图视图。
Histogram view of the data in AuDaS
使聚集
现在我们已经准备好了数据,我们将使用 AuDaS 构建一个聚类模型。我们需要指定集群的数量,在我们的例子中,我们将从 8 开始。
在应用了一个 K-Means 聚类管道后,AuDaS 会生成分数指标和它所识别的聚类的信息。
轮廓图给了我们一个很好的指示,说明我们的集群是如何定义的。介于-1 和 1 之间的轮廓系数表示一个聚类中的每个点与相邻聚类中的点有多接近。接近 1 的值距离其他聚类最远,而负的点与其他点重叠。在理想情况下,我们期望一个聚类中的所有点的轮廓系数接近 1。在我们的例子中,除了集群 2 和集群 7 之外,大多数集群看起来都定义得相当好。
然后,我们可以使用 t-SNE 可视化功能来验证我们的集群的独特性。如我们所见,聚类 2 和聚类 7 有许多与其他聚类重叠的点。为了提高我们集群的独特性,我们可能会决定从我们的客户那里收集一些额外的信息。
客户细分
AuDaS 提供了质心坐标,可用于解释每个集群的主要特征。
然后我们可以展开表格:
Cluster Centers
AuDaS 将自动创建一个新的数据集,其中附加了您可以导出的每个客户的聚类,通过访问直方图视图,我们可以了解聚类在整个数据集中的分布情况。我们现在将仔细观察一些由 AuDaS 发现的最有趣的星团。
群组 1
该细分市场的特点是,客户余额(104)和预付现金(302)最低,全额付款比例相当高(24%)。这些客户被称为交易者,因为他们支付的利息很少。
群组 2
这一细分市场的特点是客户余额和现金垫款高,购买频率和全额付款比例最低,这表明他们是信用卡提供商最有利可图的细分市场之一。这些通常被称为左轮手枪的人可能用他们的信用卡贷款。
第 4 组
这部分客户的特点是信用额度最高,全额付款比例最高(39%)。这些是主要客户,信用卡提供商可以通过进一步提高他们的信用额度来吸引他们增加消费习惯。
第 5 组
这个细分市场包括相当新的客户(低任期),他们有低余额和现金垫款。信用卡提供商可能会通过提供现金返还、促销、免费乘坐优步等方式鼓励他们增加活动。
结论
在几分钟内,我们能够建立一个聚类模型,能够将我们的信用卡用户分成不同的组。其中一些相当经典,如总理部分,左轮手枪和 transactors,但我们也能够确定非活跃用户。在这个粒度级别上理解客户的行为是定制产品的关键,从而提高客户保持率并增加收入。
使用 AuDaS 构建集群模型过程的完整视频可在下面查看:
奥达斯
AuDaS 是由 Mind Foundry 开发的自动化数据科学平台,为构建端到端的机器学习解决方案(分类、回归、聚类和 soon 时间序列)提供了一个强大的框架。这个框架有助于识别数据泄露并采取行动,以免为时过晚。你可以通过发送邮件到 audas@mindfoundry.ai 来尝试 AuDaS,并阅读一些其他的实际用例在这里和在这里。
【更新:我开了一家科技公司。你可以在这里找到更多的
团队和资源
Mind Foundry 是牛津大学的一个分支机构,由斯蒂芬·罗伯茨(Stephen Roberts)和迈克尔·奥斯本(Michael Osborne)教授创建,他们在数据分析领域已经工作了 35 年。Mind Foundry 团队由 30 多名世界级的机器学习研究人员和精英软件工程师组成,其中许多人曾是牛津大学的博士后。此外,Mind Foundry 通过其分拆地位,拥有超过 30 名牛津大学机器学习博士的特权。Mind Foundry 是牛津大学的投资组合公司,其投资者包括牛津科学创新、牛津技术和创新基金、牛津大学创新基金和 Parkwalk Advisors 。
在 H2O 使用自动编码器检测信用卡欺诈
原文:https://towardsdatascience.com/credit-card-fraud-detection-using-autoencoders-in-h2o-399cbb7ae4f1?source=collection_archive---------5-----------------------
金融领域的欺诈很少被发现。正因为如此,它会对金融领域造成严重损害。据估计,在所有的保险业务中,欺诈每年至少造成 800 亿美元的损失。如果发现欺诈活动的可能性很小,这可能会对年度损失产生重大影响。这就是为什么金融公司投资机器学习作为应对欺诈的先发制人的方法。
使用机器学习方法的好处是,
- 它有助于发现数据中隐藏和隐含的相关性。
- 更快的数据处理和更少的手动工作
- 自动检测可能的欺诈场景。
检测欺诈的最佳方法是异常检测。
异常检测
异常检测是一种识别不符合预期行为的异常模式的技术,称为异常值。它在商业中有许多应用,从信用卡交易中的欺诈检测到操作环境中的故障检测。异常检测的机器学习方法:
- k-最近邻
- 自动编码器—深度神经网络
- k 均值
- 支持向量机
- 朴素贝叶斯
今天我们将使用自动编码器来训练模型。
自动编码器
我们大多数人都不熟悉这种模式。Autoencoders 是一个无监督的神经网络。它是一种数据压缩算法,采用输入并经过压缩表示,然后给出重构的输出。
Figure 1: Neural network representation of Autoencoders
资料组
至于数据集,我们将使用 Kaggle 提供的信用卡交易数据集:【https://www.kaggle.com/mlg-ulb/creditcardfraud
该数据集包括 284,807 笔交易。其中,492 笔交易被标记为欺诈。因此,数据集非常不平衡。它只包含数字变量。特性**‘时间’包含数据集中每个事务和第一个事务之间经过的秒数。特征‘金额’是交易金额,该特征可用于依赖于示例的成本敏感学习。特征‘类’**是响应变量,在欺诈的情况下取值 1,否则取值 0。
你可以在这里找到我的 Kaggle 内核:https://www . ka ggle . com/mane esha 96/信用卡欺诈检测使用自动编码器
完整代码:https://github.com/Mash96/Credit-Card-Fraud-Detection
那我们开始吧!!!
设置
我们今天将使用 H2O 作为 ML 平台。你可以在这里找到更多信息: https://www.h2o.ai
import h2o
import matplotlib.pyplot as plt
from pylab import rcParams
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os
from h2o.estimators.deeplearning import H2OAutoEncoderEstimator, H2ODeepLearningEstimator
初始化 H2O 服务器
h2o.init(max_mem_size = 2) # initializing h2o server
h2o.remove_all()
使用 pandas 数据框加载数据集
creditData = pd.read_csv(r"File_Path\creditcard.csv")
creditData.describe()
# H2O method# creditData_df = h2o.import_file(r"File_Path\creditcard.csv")
探测
creditData.shape> (284807, 31)
检查数据集中的空值
creditData.isnull().values.any() # pandas method
# creditData_h2o.na_omit() # h2o method
# creditData_h2o.nacnt() # no missing values found> False
为了继续,我们需要将熊猫数据框架转换为 H2O 数据框架
# Turns python pandas frame into an H2OFrame
creditData_h2o = h2o.H2OFrame(creditData)# Let’s plot the Transaction class against the Frequency
labels = [‘normal’,’fraud’]
classes = pd.value_counts(creditData[‘Class’], sort = True)
classes.plot(kind = ‘bar’, rot=0)
plt.title(“Transaction class distribution”)
plt.xticks(range(2), labels)
plt.xlabel(“Class”)
plt.ylabel(“Frequency”)
Figure 2
fraud = creditData[creditData.Class == 1]
normal = creditData[creditData.Class == 0]
# Amount vs Class
f, (ax1, ax2) = plt.subplots(2,1,sharex=True)
f.suptitle('Amount per transaction by class')ax1.hist(fraud.Amount, bins = 50)
ax1.set_title('Fraud List')ax2.hist(normal.Amount, bins = 50)
ax2.set_title('Normal')plt.xlabel('Amount')
plt.ylabel('Number of Transactions')
plt.xlim((0, 10000))
plt.yscale('log')
plt.show()
Figure 3
# time vs Amount
f, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
f.suptitle('Time of transaction vs Amount by class')ax1.scatter(fraud.Time, fraud.Amount)
ax1.set_title('Fraud List')ax2.scatter(normal.Time, normal.Amount)
ax2.set_title('Normal')plt.xlabel('Time (in seconds)')
plt.ylabel('Amount')
plt.show()
Figure 4
#plotting the dataset considering the class
color = {1:'red', 0:'yellow'}
fraudlist = creditData[creditData.Class == 1]
normal = creditData[creditData.Class == 0]
fig,axes = plt.subplots(1,2)axes[0].scatter(list(range(1,fraudlist.shape[0] + 1)), fraudlist.Amount,color='red')
axes[1].scatter(list(range(1, normal.shape[0] + 1)), normal.Amount,color='yellow')
plt.show()
Figure 5: Frauds vs Normals
准备数据
时间变量对模型预测没有影响。这可以从数据可视化中搞清楚。在进入训练部分之前,我们需要弄清楚哪些变量是重要的,哪些是不重要的。所以我们可以去掉不需要的变量。
features= creditData_h2o.drop(['Time'], axis=1)
将数据帧分为训练集和测试集,其中 80%用于训练集,其余用于测试集。
train, test = features.split_frame([0.8])
print(train.shape)
print(test.shape)> (227722, 30)
> (57085, 30)
我们的数据集有很多非欺诈交易。由于这是为了模型训练,我们只发送非欺诈交易。以便模型能够学习正常交易的模式。
# converting to pandas dataframe
train_df = train.as_data_frame()
test_df = test.as_data_frame()train_df = train_df[train_df['Class'] == 0]
# drop the Class variable
train_df = train_df.drop(['Class'], axis=1)Y_test_df = test_df['Class'] # true labels of the testing settest_df = test_df.drop(['Class'], axis=1)train_df.shape> (227335, 29)
模型结构
train_h2o = h2o.H2OFrame(train_df) # converting to h2o frame
test_h2o = h2o.H2OFrame(test_df)
x = train_h2o.columns
当建立模型时,选择 4 个完全连接的隐藏层,每层具有[14,7,7,14]个节点。前两个用于编码器,后两个用于解码器。
anomaly_model = H2ODeepLearningEstimator(activation = "Tanh",
hidden = [14,7,7,14],
epochs = 100,
standardize = True,
stopping_metric = 'MSE',
loss = 'automatic',
train_samples_per_iteration = 32,
shuffle_training_data = True,
autoencoder = True,
l1 = 10e-5)
anomaly_model.train(x=x, training_frame = train_h2o)
模型评估
*变量重要性:*在 H2O 有一种特殊的方法来分析哪些变量对模型的影响更大。
anomaly_model._model_json['output']['variable_importances'].as_data_frame()
可视化
# plotting the variable importance
rcParams['figure.figsize'] = 14, 8
#plt.rcdefaults()
fig, ax = plt.subplots()
variables = anomaly_model._model_json['output']['variable_importances']['variable']
var = variables[0:15]
y_pos = np.arange(len(var))
scaled_importance = anomaly_model._model_json['output']['variable_importances']['scaled_importance']
sc = scaled_importance[0:15]
ax.barh(y_pos, sc, align='center', color='green', ecolor='black')
ax.set_yticks(y_pos)
ax.set_yticklabels(variables)
ax.invert_yaxis()
ax.set_xlabel('Scaled Importance')
ax.set_title('Variable Importance')
plt.show()
Figure 6
# plotting the loss
scoring_history = anomaly_model.score_history()
%matplotlib inline
rcParams['figure.figsize'] = 14, 8
plt.plot(scoring_history['training_mse'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
Figure 7
测试集包含正常交易和欺诈交易。自动编码器将学习识别输入数据的模式。如果异常测试点与学习的模式不匹配,则自动编码器在重构该数据时可能具有高错误率,从而指示异常数据。这样我们就能识别数据的异常。为了计算误差,它使用均方误差 (MSE)
test_rec_error = anomaly_model.anomaly(test_h2o)
# anomaly is a H2O function which calculates the error for the dataset# converting to pandas dataframe
test_rec_error_df = test_rec_error.as_data_frame()# plotting the testing dataset against the error
test_rec_error_df['id']=test_rec_error_df.index
rcParams['figure.figsize'] = 14, 8
test_rec_error_df.plot(kind="scatter", x='id', y="Reconstruction.MSE")
plt.show()
Figure 8: Anomalies in testing set
# predicting the class for the testing dataset
predictions = anomaly_model.predict(test_h2o)error_df = pd.DataFrame({'reconstruction_error': test_rec_error_df['Reconstruction.MSE'],
'true_class': Y_test_df})
error_df.describe()
Figure 9
# reconstruction error for the normal transactions in the testing dataset
fig = plt.figure()
ax = fig.add_subplot(111)
rcParams['figure.figsize'] = 14, 8
normal_error_df = error_df[(error_df['true_class']== 0) & (error_df['reconstruction_error'] < 10)]
_ = ax.hist(normal_error_df.reconstruction_error.values, bins=10)
Figure 10
# reconstruction error for the fraud transactions in the testing dataset
fig = plt.figure()
ax = fig.add_subplot(111)
rcParams['figure.figsize'] = 14, 8
fraud_error_df = error_df[error_df['true_class'] == 1]
_ = ax.hist(fraud_error_df.reconstruction_error.values, bins=10)
Figure 11
受试者工作特征曲线
from sklearn.metrics import (confusion_matrix, precision_recall_curve, auc,
roc_curve, recall_score, classification_report, f1_score,
precision_recall_fscore_support)
fpr, tpr, thresholds = roc_curve(error_df.true_class, error_df.reconstruction_error)
roc_auc = auc(fpr, tpr)plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, label='AUC = %0.4f'% roc_auc)
plt.legend(loc='lower right')
plt.plot([0,1],[0,1],'r--')
plt.xlim([-0.001, 1])
plt.ylim([0, 1.001])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show();
Figure 12
精度 为 0.9718
精确度和召回率
由于数据是高度不平衡的,所以不能只用精度来衡量。选择精度与召回率作为分类任务的矩阵。
精度:测量所得结果的相关性。
[真阳性/(真阳性+假阳性)]
回忆:测量返回多少相关结果。
[真阳性/(真阳性+假阴性)]
真阳性 —预测为欺诈的实际欺诈数量
误报 —预测为欺诈的非欺诈数量
假阴性 —预测为非欺诈的欺诈数量。
precision, recall, th = precision_recall_curve(error_df.true_class, error_df.reconstruction_error)
plt.plot(recall, precision, 'b', label='Precision-Recall curve')
plt.title('Recall vs Precision')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.show()
Figure 13
我们需要找到一个更好的阈值来区分异常和正常。这可以通过计算精度/召回与阈值图的交集来完成。
plt.plot(th, precision[1:], label="Precision",linewidth=5)
plt.plot(th, recall[1:], label="Recall",linewidth=5)
plt.title('Precision and recall for different threshold values')
plt.xlabel('Threshold')
plt.ylabel('Precision/Recall')
plt.legend()
plt.show()
Figure 14
# plot the testing set with the threshold
threshold = 0.01
groups = error_df.groupby('true_class')
fig, ax = plt.subplots()for name, group in groups:
ax.plot(group.index, group.reconstruction_error, marker='o', ms=3.5, linestyle='',
label= "Fraud" if name == 1 else "Normal")
ax.hlines(threshold, ax.get_xlim()[0], ax.get_xlim()[1], colors="r", zorder=100, label='Threshold')
ax.legend()
plt.title("Reconstruction error for different classes")
plt.ylabel("Reconstruction error")
plt.xlabel("Data point index")
plt.show();
Figure 15
混淆矩阵
import seaborn as sns
LABELS = ['Normal', 'Fraud']
y_pred = [1 if e > threshold else 0 for e in error_df.reconstruction_error.values]
conf_matrix = confusion_matrix(error_df.true_class, y_pred)
plt.figure(figsize=(12, 12))
sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt="d");
plt.title("Confusion matrix")
plt.ylabel('True class')
plt.xlabel('Predicted class')
plt.show()
Figure 16
分类报告
csr = classification_report(error_df.true_class, y_pred)
print(csr)
Figure 17
结论
我们的模型捕捉到了大部分欺诈数据。在自动编码器中,它提供了很好的准确性。但是,如果我们考察数据集的精度和召回率,它的性能还不够。正如我前面提到的,还有其他异常检测方法在高度不平衡的数据集中表现良好。
我在这个数据集上尝试了更多的方法。所以我很快会带着这些来见你。:)
参考
https://medium . com/@ curiously/credit-card-fraud-detection-using-auto encoders-in-keras-tensor flow-for-hacker-part-VII-20 e0c 85301 BD
犯罪预测
原文:https://towardsdatascience.com/crime-forecasting-8f71364f2fee?source=collection_archive---------6-----------------------
随着每天新技术的出现,我们现在处于一个很好的位置,可以开始重点关注未来的犯罪预测。犯罪预测是一种独特的预测未来犯罪的能力,可以预测未来数年的犯罪,以增加预防工作,并在受影响更严重的地区找到资源。犯罪预测是如何工作的,它真的值得我们花费时间吗?让我们看看这个伟大工具的来龙去脉,看看它今天能做什么!
什么是犯罪预测?
通过邻里或社区内的犯罪模式,可以预测与毒品相关的犯罪、入室盗窃等犯罪,以便更好地预防未来的犯罪,或者在犯罪发生时在急需的区域找到资源来处理犯罪。多年来,犯罪预测一直依赖于联邦调查局每年发布的报告。然而,这些报告仅仅提供了全国每年甚至每天发生的犯罪的一小部分情况。通过允许警官和警察部门监控犯罪模式或警察应对方法,每个社区可以更好地准备管理犯罪活动和警察在自己后院的外联活动。犯罪预测方法和在线数据集中收集,并定期维护这些记录,可以帮助官员分享观察结果,并创建更好的预警系统,以确保更多人在其城镇内的安全。
这也使得正在经历增长、变化或城市化的社区能够看到其他社区的趋势,从而为他们所在地区的这些事件做好更充分的准备。犯罪预测还跟踪警方的反应和活动。目前追踪的项目可能因部门而异,但这一系统将创造更统一的记录。犯罪预测可以帮助跟踪响应时间、使用或未使用的武力类型、警察枪击、受伤情况、EMS 对这些事件的响应等等。它还可以为需要改变政策的部门提供见解,或者是否需要对部门内的官员进行培训,以促进与其社区的更好沟通或互动。
犯罪预测有什么目的?
犯罪预测可以通过确定过去犯罪的模式或确定一个地区最常见的犯罪类型来帮助防止该地区再次发生犯罪。它还可以向许多部门提供信息,而不仅仅是一个部门,以便在全国许多社区获得更好的资源。这就是集中维护数据的优势,同时从每个部门收集数据以保存每个社区内的独特信息和犯罪模式。现在可用的技术还提供了一个更安全的存储区域,更容易或更快地访问数据,并有利于比较从最小的城镇到最大的城市的详细犯罪活动信息,以便更好地了解犯罪在全国各地和哪些地区是如何发生的。这还可以提供社区见解,帮助我们改善社区,从一开始就防止犯罪发生。这可以帮助官员通过教育、预防和更好的应对方法更好地应对他们自己社区的挑战。有了这些系统,社区可以准备好预警系统,以保护其公民的安全,并在警察队伍中保持警惕,以防止这些犯罪。它还使各部门能够更好地分配资源,覆盖犯罪率高的地区,以便警察更好地保护这些地区。
犯罪预测给使用它的地区带来了什么好处?
犯罪预测可以减少暴力犯罪的发生率,在这些地区,可以确定一种模式,以便发出预警,防止他人受害。这些系统也有助于防止警察出现意外枪击或过度使用武力等复杂情况,因为警察很难与社区成员就内部质量控制进行互动,而这些内部质量控制是你可以依赖的。犯罪预测还有助于各部门与培训机构和大学合作,进行更好的研究和培训,以更好地预防犯罪。刑事司法是一个不断发展的研究领域,随着时间的推移,出现了新的技术,以更好地维持治安,并帮助警官以更少的武力更好地维持他们所在地区的治安。犯罪预测有助于确定社区内所需的资源,以便在更脆弱的地区提供更好的警力。
犯罪预测会遇到哪些挑战?
随着时间的推移,糟糕的记录最多只能提供不完整的信息,可能只能提供最少的信息,如电话号码、日期和通话时间。这可能导致官员获得的信息不一致,可能导致他们错过警告信号或提醒社区对问题的预防为时已晚。这也可能导致各部门没有额外的培训,而这些培训可能是执法取得更大成功所必需的。关于暴力犯罪或毒品相关犯罪的少量数据收集可能无法识别社区内的犯罪模式,也会导致这种模式不断重复出现。像在线记录和犯罪统计这样的新技术可以帮助保持更清晰或更详细的记录,以便更好地做好准备,并从整体上更好地维持治安。更好的犯罪统计记录也有助于向公众提供该地区犯罪的更多信息,或者他们的警察部门在街上到底在做什么。这使得各部门和官员有责任减少警察暴力、歧视或貌相。然而,它也允许社区认可优秀官员的努力,并给予他们成功所需的资源。
谁可以使用犯罪预测?
任何警察部门都可以使用犯罪统计来跟踪他们执行的呼叫类型、需要使用武力的情况或他们执行的呼叫模式。全国各地的警察部门可以使用犯罪预测与其他部门或公民共享数据,以更好地通知和警告社区犯罪模式或特别容易发生犯罪的地区。社区经历动乱,经常犯罪,或新的扩张或发展,在他们的地区可以利用这些选项。另一个选择是观察其他一些经历过自然灾害或恐怖事件的地区如何应对犯罪,如在他们的地区抢劫,以便在灾害袭击他们的社区时通过良好的应急管理来抑制这些犯罪。各部门也可以使用犯罪预测作为质量控制措施,通过更好的培训或支持来保持警察部队安全有效地工作。各种规模的部门都可以从犯罪预测中受益,以确保其官员和公民每天的安全。
犯罪预测在不久的将来前景如何,比如在未来五年内的用途?
犯罪预测可能会成为未来五年警察工作的一个重要组成部分,因为在线平台和共享使信息能够在全国各地更快地传播,从而每天都有更好的刑事司法实践。在线犯罪统计还可以帮助一个地区内的各个部门通过更均匀地分配资源或努力打破其所在地区的犯罪模式,来更好地开展警务和犯罪预防工作。当过渡时期出现或某一地区的发展改变了人口或人口统计数据时,各部门可能会发现这些记录很有帮助。犯罪预测可以帮助制定更好的培训计划,并通过大学和院系对犯罪统计数据的审查来防止过度使用武力。自 1930 年代以来,犯罪预测一直严重依赖联邦调查局的统计数据,这将有助于各部门对社区一级的犯罪有一个更现实的看法。
既然我们已经探索了犯罪预测,并看到了它对许多社区的好处,那么很容易看到犯罪预测在不久的将来会成为执法部门的一个重要组成部分。凭借预测社区内犯罪的能力,它可以帮助公民和执法部门做出更明智的决策,并让我们的社区每天都更安全。它还可以帮助将资源转移到最需要的地方,用于迄今为止史无前例的预防犯罪。犯罪预测可以帮助社区打破长期存在的犯罪模式;更好地教育军官,以应对当今世界的挑战。并保持最新的培训,以便在全国各地的每个社区更好地维持治安。
人工智能的标准
原文:https://towardsdatascience.com/criteria-for-artificial-general-intelligence-cc268c4258be?source=collection_archive---------17-----------------------
一般智能必须能够做什么?
Carlos Irineu da Costa by @carlosirineu on Upsplash
人类的智力仍然远远超过机器。人类可以形成类比,识别下落的篮球和茶杯的相似轨迹。人类只看过一次不寻常的、凹凸不平的紫色玩具*,就能立即从其他玩具中识别出那个物体——这被称为“一次性学习”。当发生的事情与我们经历的事情相同或相似时,我们会立即认出这是在之前发生的*。我们的记忆并不完美,但我们确实对大量信息有着奇妙的记忆。而且,我们可以在我们的记忆中搜索任何符合一组条件的东西,比如“任何绿色且有刺的物体”都会检索到“仙人掌”。我们甚至可以在我们想象中的事物中进行搜索,就像许多人曾经问的那样“什么能让人飞起来?”**
对人工智能的研究集中在模仿人脑的各种方法上。这适用于智力的某些方面,然而我们未能复制出我们自身所有能力所必需的类脑行为的正确部分。在这里,我回到了智能的基本问题,并建立了一套任何成功的机器智能都必须满足的约束。我在这个分析中没有包括情感或目标创造——这些领域仍然很难概念化,它们创造了人工一般智能可能需要满足的额外要求。我在这里关注类比、回忆和受约束的想象以及认知的力量。
为了了解智能系统中这些功能的实际情况,我们需要放大智能的核心问题:创建地图。
映射输入
从根本上说,机器智能将每个可能的输入与一些输出关联起来——一个分类、一个预测或一个动作。每个输入都有一个输出,而一个输出可能有多个输入。这是从输入到输出的映射。
这些输入被安排在一个巨大的空间——“输入空间”。相似的输入是彼此靠近的,你可以改变输入的每一种方式都是它自己的空间维度。例如,28 像素宽、28 像素高的图像有 784 个像素。假设每个像素可以沿着灰度级变化。那么图像有 784 种不同的变化方式;输入空间中 784 个不同的尺寸*!如果两个点在 784 维输入空间中彼此相邻,那么它们的像素必须几乎相同。*
智能的目标是分割这个输入空间。考虑如果我们有一个平坦的输入空间,比如棋盘。棋盘上的每个点对应不同的输入,相似的输入彼此相邻。想象沿着棋盘铺设墙壁,将表面分割成多个“区域”。那是一个分割输入空间的。**
每个区域被分配给不同的输出。这种划分和分配定义了我们从输入到输出的映射。您可以查看棋盘上的任何一点,查看位于哪个领域内,并检查与该领域相关联的输出。分区创建区域,每个区域将所有输入发送到一个输出。
识别
当我们看到一个我们曾经去过的房间,或者在电话中听到一个熟悉的声音时,我们会立即意识到“我以前经历过这种或非常类似的事情”。这种识别已经发生的事情的能力,不同于我们想象的事情,或者没有发生的事情,必须作为它自己的结构放入机器智能中——除了上面提到的将输入划分为输出区域。
每当一个新的输入输出对出现时,机器智能必须记住那个实例。当划分变得精确时,会发生这种情况,弯曲或移动边界墙以将该新事件包括在正确输出的范围内。(在现有的神经网络中,这将等同于训练网络,直到它准确地记住已经给它的所有数据。通常,在网络到达这一点之前,训练就停止了。我相信相反的情况——训练应该继续,直到所有已知的事件都被准确地划分出来为止,尽管神经网络在这一点上变得很脆弱。)
现在,想象一下,如果每次一滴雨滴落在输入的棋盘上,它的飞溅创造了它自己的冻结墙,它自己的微小分区。那些雨滴领地包围了所有已经实际上经历过的事物,而棋盘上那些冰冻墙壁之外的每一个点都还没有经历过。就像走进一个不熟悉的房间。认可!这些雨滴墙是输入空间的一种新的独立分区,与将输入分配给输出区域的分区协同工作。一组墙映射输入→输出,另一组墙映射输入→已知或未知事件。
从另一个角度来看这个分区,你可以想象每一滴雨滴都创造了自己的小而陡峭的山丘。随着接收到更多的输入,更多的雨滴落下,更多的山丘形成。在那些山顶上是输入,在那里结果现在是已知的;那些山顶是 T2 已经经历过的地方。这些山丘周围区域的高度代表了对机器智能如何正确分配输出区域的信心。在附近的一个已知点,我们可以确信与该点相关的输出与山顶的输出相似。这是一个近似值,但它允许一个强大的概括…****
如果我们有一个函数来描述这些山丘的坡度,我们可以说“在任何有峰的地方,智能在之前已经*看到了那个输入,并且它完全确信它记住了正确的输出”同时,“任何低高度的地方都是不确定的;无论预测什么样的产出,都有可能是错误的。”这是一个有用的信心衡量标准,其中同时包含 认可 。而且,如果你想让智慧去想象一些新的东西,你可以看看那些自信的山谷,知道它们以前没有被体验过。如果你想让机器智能表现得像科学家一样,不断测试假设,那么它应该寻找属于最深信心谷的输入产生的输出。*
比喻
我们可以通过明确记录每一次事件来获得这种精确的情报。每次输入发生时,它都会被记录下来,同时记录的还有正确关联的输出。然而,对于像自动驾驶这样的复杂问题,不可能记录下每一次经历。数据实在太多了!需要某种形式的压缩*。*
神经网络当然实现了这种期望的压缩。每个神经元之间的突触权重形成了一个巨大的参数空间*,它相当容易地创建了复杂的分区。“输入→输出”划分和“输入→已知事件”划分都可以在神经网络中压缩。虽然,有许多方法可以设计神经网络,但很明显,当前的架构不足以满足我们的目的:现有的神经网络无法从第一次尝试中学习,需要数百个类似的实例来学习任何东西,即使这样,它们的预测也是不完美的。*
此外,神经网络未能发现另一种形式的压缩:类比。当两个事物的行为相似时,你只需要记住其中一个的行为。另一个行为相同。例如,几乎所有物体都会在重力作用下下落,所以“抛物线下落”是许多事物共有的行为,提供了大量的信息压缩。相反,如果你不得不为你遇到的每一个新的物体学习重力的属性,那会怎么样呢?
类比还有一个强大的特点:寓意。如果两个事物在大多数方面表现相似,你可以假设它们在另一个方面相似。根据这一假设,任何提高预测一种行为准确性的经验也会提高另一种行为的假设准确性*。这是现有机器智能严重缺乏的东西,常识的关键。那么,我们如何形成类比,它们的性质是什么?*
回头看看我们的输入空间,棋盘,当棋盘的一个样本与其他样本具有相同的分割模式时,就会发生类似的情况。这两个样本可能会相对于彼此翻转或翻转*,然而,只要它们的壁的形状匹配,我们就可以通过对两个使用*一个分区来降低我们的分区操作的复杂性。**
旋转和翻转代表了变量的重新分配。你可以想象一个原子类似于我们的太阳系,电子绕着原子核转。(卢瑟福过时的模型)在那个类比中,太阳→原子核、行星→电子。物体发生了变化,从太阳系到原子,但是轨道行为保持不变。打个比方,当你将一个分区定位到另一个分区时,它们的分区必须匹配。
回忆和想象
回忆不同于辨认。当你看到你以前见过的东西时,你就会认出来;它就发生在那一瞬间,来自你的感官体验。回忆更复杂,我们不擅长回忆。为了回忆一个事件或一条符合某些要求的信息,我们必须过滤输入空间,寻找匹配。当试图回忆已经发生的事情时,我们理想的算法智能必须过滤掉输入的每一点,除了每座山的顶峰。首先,从输入到输出的功能必须颠倒,这样输出才能回到输入。对允许的输出施加约束(“它必须是绿色和尖尖的”),并且测试可能满足这些约束的各种输入(“仙人掌?”).
智能可能会过滤掉接近的最大置信度,从而扩大搜索范围,将似是而非的输入包括在内,而不是过滤掉不是山峰的输入。想象一下,如果你走进厨房,看看冰箱,会发生什么。如果你现在去那里,你的感官不会产生你头脑所预测的,然而它是熟悉的,你可以生动地想象它。**
过滤掉除置信度最低的波谷之外的所有输入,会产生最大不确定性的情况。科学实验旨在测试这些不确定的区域。而且,如果机器智能要想象某种新的*,那某种东西一定来自这些山谷。从对输出的一组约束开始,留下一系列合适的输出来测试,并向后工作到可能的输入。然后过滤输入,除了那些最低的谷,想象不确定的事件。这个过程是一般智力的关键。*
只是一片
这些特征——识别、假设检验、想象、回忆、类比和暗示——只是我们在一般智力中所希望的一些特性。神经网络体系结构可能会超越简单的 DenseNets 和 LSTMs,走向能够提供所有这些特征的结构。在另一篇文章中,我希望概述一种可能性…
1plusX 数据管理平台的跨设备数据提供商评估
原文:https://towardsdatascience.com/cross-device-data-provider-evaluation-for-1plusx-data-management-platform-39c380981a5e?source=collection_archive---------5-----------------------
为了向用户提供相关的个性化内容,能够跨设备识别用户变得越来越重要。目前,公司使用 cookies 来识别网络上的单个用户。然而,移动应用程序不使用 cookies,而是依赖于设备标识符,这些标识符是为了在应用程序中做广告而创建的。由于这些标识符只能通过应用程序访问,因此要全面了解用户在网络和移动设备上的活动,必须能够将用户的 cookies 与其设备 id 进行匹配。这就是所谓的跨设备匹配。
在本白皮书中,我们描述了我们如何评估三个主要的跨设备概率匹配提供商。作为一个数据管理平台(DMP),我们的目标是能够为数字机构、媒体、电信和电子商务公司提供在其广告活动中包括甚至专门针对移动应用用户的能力。因为这些提供商使用概率模型,所以了解这些模型的质量并确保我们的客户可以依赖最佳的跨设备匹配对我们来说至关重要。
评估设置
为了进行评估,我们首先与三家提供商建立了用户群的持续同步,以便他们仅为我们的用户提供跨设备数据。然后我们同意每周交付他们的数据,让我们不仅可以评估他们预测的质量,还可以评估长期的稳定性。我们设计了一个评估框架,能够快速处理每周的新数据并衡量质量。
每个星期,每个提供商发送一个文件,其中包含用户列表、他们的 cookie IDs 和他们预测的相应设备 id。设备 id 包括 iOS 和 Android 平台上的设备,并涵盖了移动和平板电脑外形。
我们还从一家领先的面板数据提供商那里获得了相同格式的基础数据。该提供商精心设计在线面板并收集已知正确的数据,这些数据可用于评估预测数据的准确性。
图一。来自 ground truth 和跨设备提供商的数据表示
曲奇世界
为了执行这个评估,我们希望确保从实际和最近的用户那里获得足够多的 cookie IDs。我们与我们的一个客户进行了安排,他们对这个话题有共同的兴趣,可以使用他们广泛的网站组合。作为交换,他们收到了这次评估的全部结果。
为了确保对供应商进行客观的比较,避免我们的客户或其他方面的任何潜在偏见,我们仅在 1plusX 空间中运营。当用户访问我们客户的一个网站时,我们为该用户创建了一个标识符,并将其存储在 1plusX cookie 中。然后,我们与跨设备提供者共享这些 cookie IDs,以便他们可以只发送相关用户的设备 id。
我们在几个月的时间里收集了大量的饼干;然而,我们并没有使用全套。我们忽略了删除 cookiess 和不活动 cookie 的用户。为了做到这一点,每周我们将我们的 cookie 范围限制在过去 2 周和前一时期看到的 cookie 的交集。这样,评估仅基于重复出现的 cookies。
图二。评估所基于的 cookie 领域的定义
我们评估的宇宙由 2 M 个 cookies 组成。由于我们客户的投资组合都是瑞士的网站,这次评估仅限于瑞士市场。
事实数据和我们的宇宙之间的交集最终比预期的要小,所以我们引入了一个额外的共识验证方法。在共识方法中,如果 3 个提供商中至少有 2 个预测给定用户的设备相同,我们将设备 ID 匹配定义为正确。这有利于扩大评估中 cookies 的数量,但也有可能引入偏见。例如,如果一个供应商是正确的,而其他供应商是错误的,但在协议中,正确的供应商将受到惩罚,而其他供应商将得到奖励。为了确保我们的评估是客观的,我们同时使用了 cookie universe 和共识验证方法,并在多个评估点上比较了它们各自的结果。在所有情况下,地面实况方法的结果证实了共识方法,因此,我们相信共识方法不会引入重大偏差。
为了保持本白皮书的简短,我们将只展示一个评估点的结果。
韵律学
我们在评估中跟踪了多个指标,但在本文中,我们将重点关注三个指标:
- 新闻报道
- 平均召回率
- 平均精度
提供者的覆盖率被定义为我们从他们的图表中得到预测的 cookies 的百分比。这是我们的客户感兴趣的,因为它显示了他们将收到设备 id 匹配的用户的比例,因此评估了活动的潜在跨设备覆盖范围。
精确度和召回率更难把握。精确度被定义为正确的预测设备的百分比,而召回被定义为正确预测的真实设备的比例。它们对我们都很重要,因为召回率代表了预测的全部设备的份额,而精确度代表了每个预测的质量。
精确/召回示例
基本事实将用户列为拥有两个设备:A 和 B,显示在基本事实列中。下面是三组不同的预测以及它们相应的精度和召回率。
图 3。三个实例的查准率和查全率。
典型地,在精确度和召回率之间有一个折衷。做出的预测越多,就越难有高精度;但是,越容易有高召回率。这在广告行业是经常见到的。在品牌推广活动中,公司希望接触尽可能多的用户,因此优化召回。另一方面,在绩效活动中,广告商希望锁定与产品最相关的用户,而不是关注精确度。
请注意,最好使用基本事实来计算精确度和召回率。在下一节中,我们将讨论在使用共识方法和基础事实方法的组合时,在我们有基础事实和覆盖结果的子集上计算的精度和召回结果。
结果
为了公平对待所有被评估的提供商,我们对结果进行了匿名处理,并且不在结果/图表中提供完整的数字。
设备预测的平均数量
通过查看每个提供商发送的数据,我们立即观察到了不同的方法,仅仅是通过查看他们模型的输出。举例说明这一点的一个简单的方法是提供商预测每个 cookie 平均有多少设备。
图四。每个 cookie 的平均预测数
一家提供商做出的设备预测明显少于另外两家,而且似乎在精度上做了更多的优化。
新闻报道
看看每个提供商覆盖了我们多少用户群是很有见地的,我们很惊讶地看到这样的覆盖差异。
图五。关于 cookie 世界的报道
一家提供商明显领先,为接近 1/2 的用户提供设备。这些数字自然应该与质量指标一起考虑;然而,尽管如此,我们还是希望所有的提供商都有类似的覆盖率。
回忆
尽管覆盖率领先,但我们注意到,与竞争对手相比,这家供应商的召回率仅略高。
图六。每个供应商的覆盖范围和召回
精确
覆盖率高但回忆稍好的提供商似乎暗示他们以牺牲质量为代价发送了更多的预测。这一点在查看精度时得到了证实。
图 7。精度
覆盖率最高的提供商现在落后,精度低于 30%,而覆盖率最低的提供商展示了自己的实力。
结论
跨设备挑战没有明确的解决方案。由于第一方数据有限,我们需要依靠概率模型来确定可接受的范围,这意味着要处理预测。根据用例的不同,需要决定是优化精度还是召回率。回顾这一分析,每个提供商在这一二元性上提供了不同的选择。一个提供精度而不是范围,另一个提供范围而不是精度,第三个提供者提供了一个更平衡的方法。
图 8。两个提供商的精确到达权衡概述
这种权衡影响了广告市场的所有参与者。有时候,广告客户更喜欢广泛的覆盖面,而不是低点击率。其他时候,将针对一小部分人来限制活动的成本。
一个潜在的解决方案是与所有三家供应商签约,并在其中一家的实力与预期结果相符时使用它。然而,这是成本过高。我们决定满足于提供最佳折衷方案的供应商。该提供商为三分之一的用户提供了设备,这些用户平均预测了 60%的设备。
重要的是要记住,这项研究是在瑞士市场上实现的。其他市场的结果可能会有所不同,也会随着时间的推移而变化。我们期待着观察这一演变,并在有机会时评估不同的市场。
交叉验证代码可视化:有点意思
原文:https://towardsdatascience.com/cross-validation-code-visualization-kind-of-fun-b9741baea1f8?source=collection_archive---------3-----------------------
让我们想象来改善你的预测…
让我们说,你正在编写一个漂亮和干净的机器学习代码(例如线性回归)。你的代码是好的,首先你像往常一样用像 train_test_split 这样的函数和一些*随机因子把你的数据集分成两部分“训练集和测试集”。*如下图所示,您的预测可能会略微偏低或偏高。
Fig:Under and Over-Fit Prediction
结果也没有改变。那么我们能做什么呢?
顾名思义,交叉验证是学习线性回归之后的下一件有趣的事情,因为它有助于使用 K 倍 策略来改进你的预测。你问的 K 倍是多少?下面用代码解释一切。
完整代码:)
Fig:- Cross Validation with Visualization
代码洞察:
以上代码分为 4 个步骤…
- 加载和分割目标数据集。
Fig:-Load the dataset
我们正在将数据集中的目标复制到 y 变量*中。*要查看数据集,取消 print 行的注释。
2.型号选择
Fig:- Model Selection (LinearRegression())
为了简单起见,我们将使用线性回归。要了解更多信息,请点击“线性回归:更简单的方法”帖子。
3。交叉验证:)
Fig:- Cross Validation in sklearn
这是一个过程,也是 sklearn 中的一个功能
【cross _ val _ predict(模型,数据,目标,cv)
在哪里,
模型 是我们选择的要进行交叉验证的模型
数据 是数据。
目标 是 w.r.t .数据的目标值。
cv (可选)为总折叠数(又名 K-Fold )。
在这个过程中,我们不像通常那样将数据分为两组(训练集和测试集),如下所示。
Fig:- Train set (Blue)and Test set (Red)
但是我们把数据集分成相等的 K 部分( K 倍或者 cv )。**改进预测,更好地推广。**然后在较大的数据集上训练模型,在较小的数据集上测试。我们姑且说 cv 就是 6。
Fig:- 6 equal folds or parts
现在,模型分割的第一次迭代看起来像这样,红色是测试数据,蓝色是训练数据。
Fig:- cross_val first iteration
第二次迭代将如下图所示。
Fig:- cross_val second iteration
依此类推,直到最后一次或第六次迭代,看起来会像下图这样。
Fig:- cross_val sixth iteration
4.用 Matplotlib 可视化数据。
Fig:- Visualize with Matplotlib
为了可视化,我们正在导入 matplotlib 库。然后制作一个 支线剧情 。
用黑色(即(0,0,0))轮廓或边缘颜色创建 散点 。
使用 ax.plot 给出两轴的最小值&最大值,用“ k - ”表示线条的类型与线宽,即lw****= 4***。*
接下来,给 x 和 y 轴加标签。
****【PLT . show()】**最后显示图形。
结果呢
Fig:- Prediction
此图显示了使用线性回归模型对波士顿数据集进行的 k 重交叉验证。
我确信人们实现了许多类型的交叉验证,但是 K-folds 是一个好的并且容易开始的类型。
要获得完整代码,请访问 github 链接: Github
关注我在媒体获得类似的职位。
我将每周发布 2 篇帖子,所以不要错过代码教程。
在脸书、推特、 Linkedin 、 Google+ 上联系我。
任何评论或者如果你有任何问题,请写在评论里。
鼓掌吧!分享一下!跟我来。
乐意帮忙。荣誉……..
你会喜欢的以前的故事:
- 激活功能解释:神经网络
2.线性回归:更简单的方法
3. DIY Arduino 无线键盘
4.感知器是什么鬼?
5.Tensor flow 中的“张量”是什么鬼?
交叉验证解释:评估估计性能。
原文:https://towardsdatascience.com/cross-validation-explained-evaluating-estimator-performance-e51e5430ff85?source=collection_archive---------1-----------------------
使用交叉验证改进你的 ML 模型。
机器学习工程师或数据科学家的最终目标是开发一个模型,以便根据新数据进行预测或根据未知数据预测未来的一些事件。好的模型不是对已知数据或训练数据给出准确预测的模型,而是对新数据给出良好预测并避免过拟合和欠拟合的模型。
完成本教程后,您将了解:
- 为什么要使用交叉验证是一个用来评估模型在新数据上的技巧的过程。
- 您可以使用一些常用策略来为数据集选择 k 值。
- scikit-learn 中提供了交叉验证的常用变体,如分层和 LOOCV。
- k 折叠交叉验证在 Python 中的实际实现
为了找到解决办法,我们应该首先了解这个问题。在我们开始理解交叉验证之前,让我们先理解过度拟合和欠拟合
了解欠拟合和过拟合:
**过度拟合模型:**当统计模型或机器学习算法捕捉到数据的噪声时,就会发生过度拟合。直觉上,当模型或算法与数据拟合得太好时,就会发生过度拟合。
过度拟合模型导致训练数据集具有良好的准确性,但对新数据集的结果较差。这种模型在现实世界中没有任何用处,因为它不能预测新病例的结果。
**欠拟合模型:**当统计模型或机器学习算法无法捕捉数据的潜在趋势时,就会发生欠拟合。直观地说,当模型或算法与数据拟合得不够好时,就会出现拟合不足。拟合不足通常是模型过于简单的结果。简单是指缺少的数据没有得到正确处理,没有异常值处理,移除了不相关的特征或对预测变量没有太大贡献的特征。
如何解决过拟合问题:
答案是交叉验证
过度拟合和一般机器学习的一个关键挑战是,在我们实际测试之前,我们无法知道我们的模型在新数据上的表现如何。
为了解决这个问题,我们可以将初始数据集分成单独的训练和测试子集。
有不同类型的交叉验证技术,但是总体概念是相同的,
将数据分成若干子集
一次拿出一组,在剩余的一组上训练模型
等待装置上的测试模型
对数据集的每个子集重复上述过程
the process of cross validation in general
交叉验证的类型:
K 倍交叉验证
分层 K 折交叉验证
留一个交叉验证
让我们逐一了解每种类型
k 倍交叉验证:
该过程有一个称为 k 的参数,它指的是给定数据样本要被分成的组的数量。因此,该程序通常被称为 k 倍交叉验证。当选择了 k 的特定值时,它可以用来代替模型引用中的 k,例如 k=10 成为 10 重交叉验证。
如果 k=5,数据集将被分成 5 个相等的部分,下面的过程将运行 5 次,每次都使用不同的维持集。
1.将该组作为维持或测试数据集
2.将剩余的组作为训练数据集
3.在训练集上拟合模型,并在测试集上评估它
4.保留评估分数并丢弃模型
在上述过程的最后,使用模型评估分数的样本总结模型的技巧。
如何决定 k 的值?
选择 k 的值,使得数据样本的每个训练/测试组足够大,以在统计上代表更广泛的数据集。
k=10 的值在应用机器学习领域是非常常见的,如果您很难为数据集选择一个值,建议您使用它。
如果选择的 k 值没有平均分割数据样本,则一个组将包含剩余的示例。优选地,将数据样本分成 k 个具有相同样本数量的组,使得模型技能得分的样本全部相等。
分层 k 折交叉验证:
与 K 倍交叉验证相同,只是略有不同
将数据分割成多个折叠可以由标准来控制,例如确保每个折叠具有相同比例的具有给定分类值(例如类结果值)的观察值。这被称为分层交叉验证。
在下图中,分层 k 倍验证是基于性别设置的,无论是男性还是女性
stratified k-fold cross validation
遗漏一个交叉验证(LOOCV):
这种方法在训练数据中留出 1 个数据点,即如果原始样本中有 n 个数据点,则 n-1 个样本用于训练模型,p 个点用作验证集。对原始样本可以这样分离的所有组合重复这一过程,然后对所有试验的误差进行平均,以给出总体有效性。
可能组合的数量等于原始样本中数据点的数量或 n。
representation of leave one out cross validation
交叉验证是评估模型有效性的一种非常有用的技术,尤其是在需要减轻过度拟合的情况下。
Python 中交叉验证的实现:
在使用交叉验证时,我们不需要单独调用 fit 方法,cross_val_score 方法在对数据实施交叉验证时拟合数据本身。下面是使用 k-fold 交叉验证的示例。
***import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.ensemble import RandomForestClassifier
from sklearn import svm
from sklearn.model_selection import cross_val_score
#read csv file**data = pd.read_csv("D://RAhil//Kaggle//Data//Iris.csv")**#Create Dependent and Independent Datasets based on our Dependent #and Independent features**X = data[['SepalLengthCm','SepalWidthCm','PetalLengthCm']]
y= data['Species']**model = svm.SVC()**accuracy = cross_val_score(model, X, y, scoring='accuracy', cv = 10)
print(accuracy)**#get the mean of each fold
print("Accuracy of Model with Cross Validation is:",accuracy.mean() * 100)***
输出:
模型的精度是每个折叠精度的平均值。
在本教程中,您发现了我们为什么需要使用交叉验证,对不同类型的交叉验证技术的温和介绍,以及用于评估机器学习模型技能的 k-fold 交叉验证过程的实际示例。
具体来说,您学到了:
- 交叉验证是一个用于避免过度拟合和评估模型对新数据的技能的过程。
- 您可以使用一些常用策略来为数据集选择 k 值。
- scikit-learn 中提供了交叉验证的常用变体,如分层和重复。
如果你喜欢这个博客,给它一些 掌声 和 与你的朋友分享 它,你可以在这里 找到更多有趣的文章 ,敬请关注更多有趣的机器学习技术和概念。
机器学习中的交叉验证
原文:https://towardsdatascience.com/cross-validation-in-machine-learning-72924a69872f?source=collection_archive---------0-----------------------
总是需要验证你的机器学习模型的稳定性。我的意思是,你不能让模型适合你的训练数据,并希望它能准确地处理它从未见过的真实数据。你需要某种保证,你的模型已经从数据中得到了大多数正确的模式,并且它没有拾取太多的噪声,或者换句话说,它的偏差和方差很低。
确认
这个决定量化变量间假设关系的数值结果是否可接受作为数据描述的过程,被称为 验证 。通常,模型的误差估计是在训练之后进行的,更好的说法是残差评估。在此过程中,对预测响应和原始响应之间的差异进行数值估计,也称为训练误差。然而,这只能让我们了解我们的模型在用于训练它的数据上表现如何。现在,模型可能对数据拟合不足或拟合过度。因此,这种评估技术的 问题在于,它没有给出学习者对独立/不可见数据集 的概括能力。得到关于我们模型的这个想法被称为交叉验证。
保持方法
现在,对此的一个*基本补救措施是删除一部分训练数据,并使用它从根据其余数据训练的模型中获得预测。*误差估计然后告诉我们的模型在看不见的数据或验证集上表现如何。这是一种简单的交叉验证技术,也称为维持法。尽管这种方法不需要任何计算开销,并且优于传统的 验证,但它仍然存在高方差 的问题。 这是因为不确定哪些数据点会出现在验证集中,不同的数据集结果可能完全不同。
K 倍交叉验证
由于永远没有足够的数据来训练你的模型,为了验证而删除一部分数据会带来拟合不足的问题。 通过减少训练数据 , 我们冒着丢失数据集中重要模式/趋势的风险,这反过来增加了由偏差引起的误差。 所以,我们需要的是一种既能为训练模型提供充足数据,又能为验证留下充足数据的方法。k 折叠交叉验证正是这样做的。
在 K 折交叉验证中,数据被分成 K 个子集。现在,保持方法被重复 k 次,使得每次 ,k 个子集之一被用作测试集/验证集,而其他 k-1 个子集被放在一起形成训练集 。在所有 k 次试验中平均误差估计,以获得我们的模型的总有效性。可以看出,每个数据点恰好出现在验证集中一次,出现在训练集中 k-1 次。 这极大地减少了偏差,因为我们使用了大部分数据进行拟合,也极大地减少了方差,因为大部分数据也用于验证集中。交换训练集和测试集也增加了这种方法的有效性。作为一般规则和经验证据,K = 5 或 10 通常是首选的,但没有什么是固定的,它可以取任何值。
分层 K 折交叉验证
在某些情况下,响应变量中可能存在较大的不平衡。例如,在关于房屋价格的数据集中,可能有大量价格高的房屋。或者在分类的情况下,阴性样本可能比阳性样本多几倍。对于这样的问题, 在 K 倍交叉验证技术中做了一个微小的变化,使得每个倍包含与完整集近似相同百分比的每个目标类的样本,或者在预测问题的情况下,平均响应值在所有倍中近似相等。 这种变异也被称为层状 K 褶。
上述验证技术也被称为非穷举交叉验证方法。 这些并不计算分割原始样本的所有方式,也就是说,你只需决定需要制作多少个子集。此外,这些是下面解释的 方法的近似,也称为穷举方法,它计算所有可能的方式将数据分成训练集和测试集。
遗漏交叉验证
这种方法将 p 个数据点排除在训练数据之外,即如果原始样本中有 n 个数据点,则 n-p 个样本用于训练模型,p 个点用作验证集。对原始样本可以这样分离的所有组合重复这一过程,然后对所有试验的误差进行平均,以给出总体有效性。
该方法是详尽的,因为它需要为所有可能的组合训练和验证模型,并且对于适度大的 p,它在计算上变得不可行。
这种方法的一个特例是当 p = 1 时。这就是所谓的遗漏交叉验证。这种方法通常优于前一种方法,因为 它不会遭受密集的计算,因为可能组合的数目等于原始样本中数据点的数目或 n.
交叉验证是 ***一种非常有用的评估模型有效性的技术,尤其是在你需要减轻过度拟合的情况下。***也可用于确定您的 型号的超参数,即哪些参数会导致最低的测试误差。这是你开始交叉验证所需要的所有基础。您可以使用 Scikit-Learn 开始使用各种验证技术,只需几行 python 代码就可以启动并运行。
如果你喜欢这篇文章,一定要点击下面的❤来推荐它,如果你有任何问题,留下评论,我会尽力回答。
为了更加了解机器学习的世界,跟我来。这是最好的办法,等我多写点这样的文章就知道了。
你也可以在 关注我【推特】直接发邮件给我 或者 在 linkedin 上找我。我很乐意收到你的来信。
乡亲们,祝你们有美好的一天:)
跨越您的数据科学鸿沟
原文:https://towardsdatascience.com/crossing-your-data-science-chasm-f57d25393405?source=collection_archive---------4-----------------------
增长的分析路线图
场景——你是一家新兴的电子商务/SaaS 创业公司。你已经建立了你的网站,你已经对你的信息进行了 A/B 测试,你已经有了你的搜索引擎优化和社会广告购买。您已经设置了电子邮件点滴活动和提醒。您还可以获得基本的 BI 报告,了解渠道流量和转化率。流量还过得去,收入也在增长。你很可能处于最初的成长阶段;你穿着溜冰鞋飞翔,生意蒸蒸日上。你认为你找到了自己的声音;你在扩张。你在为更多的增长进行再投资;你在市场营销上投入了大量资金,事情似乎暂时进展顺利。
然后,交通突然慢了下来。广告购买不像以前那样有效了。促销仍然会带来一个高峰,但这是暂时的,短暂的。总体增长似乎无法度过难关,LTV 正在走下坡路,这意味着盈利需要两倍的时间。为什么?虽然可能有许多原因,但最有可能的原因是,随着时间的推移,过去一直有效的销售和营销引擎不可避免地开始变慢。著名成长黑客出身的风投陈楚翔解释了一个明显的“垃圾点击率定律”案例。
随着时间的推移,所有的营销策略都会导致糟糕的点击率。
—陈楚翔
我们都听说过“跨越鸿沟”这个词:所有成功的技术产品最终都要跨越鸿沟;从早期用户跃升为主流消费者。找到产品与市场的契合度很难,而实现这一飞跃也并非易事。
比方说,你现在已经取得了你的第一个滩头阵地,不管你是从零开始,带着一个新奇的想法开始网上销售,还是你正在数字化改造你的线下业务。你已经建立了一批忠实的追随者,他们相信你的事业和你的品牌。要进入下一个层次,你必须密切关注内部运营的优化以及扩张的机会。现在比以往任何时候都更重要的是,拥有做出正确决策所需的所有信息,并进行更多的赢钱下注,而不是输钱下注。现在你必须更深入地思考,锻炼你以前从未想过要使用的数据肌肉。你需要知道谁是你的客户,他们什么时候可能购买,他们打算买什么——换句话说,从知道“发生了什么”到“为什么会发生”和“将会发生什么”,或者简而言之,预测分析。
这就是数据科学和机器学习发挥作用的地方。
但是等一下,你说,你已经研究过这个问题,但是在市场上找不到合理的现成解决方案。也许你试图雇用一名数据科学家,但发现很难找到人才/成本/技能的正确组合?或者也许你认为你所拥有的指标和你的决策已经足够好了,因为它们已经让你走了这么远,对吗?
这就是我想称之为数据科学鸿沟的东西——网络分析/BI 报告与预测分析之间的鸿沟。这就像从谷歌分析(Google Analytics)到谷歌 deep mind(alpha go 的)。
由于当今数据科学的不可及性,购买与构建的典型选择失败了。由于人才短缺,商业先例稀缺,以及缺乏负担得起的解决方案,中小型企业经常发现自己被排除在数据科学和见解之外,而这些科学和见解可能会有所不同。
Google Analytics、Optimizely 和 Mixpanel 等产品试图填补网络分析和报告的空白。然而,高级分析和机器学习——以及更普遍的人工智能——仍然遥不可及。我们想改变这种情况。我们相信数据科学中人的因素。为了有效地跨越鸿沟,您需要获得专家的建议,以清晰地概括和解释要采取哪些步骤来实现这一目标。另一方面,你需要一个人来解释和负责结果,以及设计对你的业务有意义的上市。
为了帮助您入门,我们在这里提供了一个分析路线图,帮助您导航到下一个级别所需的内容。让我们一起穿越你的 #DataScienceChasm 。
描述性分析
对于即插即用工具,困难的部分是诊断问题。当一个指标上涨或下跌时,需要知识和经验来理解原因并回到正轨。商业智能和报告可以告诉你发生了什么,但要知道为什么你需要更深入。
描述性分析正好位于数据科学鸿沟的边缘——SaaS 工具可以解决这里和那里的问题,但许多问题需要经验丰富的眼睛。几种有用的分析和技术包括:
- 季节性和历史趋势
- 产品购买周期
- 促销和折扣有效性
- 用户细分和聚类
- 漏斗转换分析
- 市场篮子分析
大公司通常会有许多内部分析师全职致力于上述领域,以优化和加速他们的业务。在 LinkedIn,每个产品线都有广泛的用户细分和购买漏斗优化。例如,当您根据您的个人资料结账时,您可能会看到不同的订购产品。对于较小的公司来说,没有资源来雇佣全职分析师。需要通过 DSaaS(数据科学即服务)服务来跨越这一鸿沟,DSaaS 服务提供的分析和算法可以在不花费大量 R&D 的情况下立即交付结果,并缩短洞察时间。
预测分析
有效地跨越鸿沟进入高速增长是关于知道在哪里分配你的资源。如果你知道哪些用户更有可能购买你的产品呢?如果你知道接下来的几周将对你本季度的销售产生巨大的影响,你会怎么做?
你对某些事件或结果的概率越高,多活一年的机会就越大。一些预测分析包括:
- 用户获取倾向模型
- 回购或流失模式
- 用户终身价值预测
- 销售预测和促销计划
- 用户终身价值(LTV)
大公司甚至有更多的高级数据科学家在研究这些问题。数据是一大优势。如果你能够有效地利用数据来了解你的业务,并知道应该关注哪里,你将会成为前 1%的公司。
规定性优化
规定性优化是数据科学和机器学习的圣杯。想象一个全自动、自我学习、低代码部署的人工智能连接组件,这些组件根据实时购买行为和基于行动的协议对您的业务做出反应。
AI 处理订购、运输、定价、电子邮件和客户服务,为您的业务提供优化。
您可能需要的一些关键组件是:
- 动态更新产品层次结构
- 基于购买行为的目的驱动的产品类别
- 智能定价模型
- 自主人工智能在学习时更新规则和流程
在接下来的几周,我们将花更多时间深入探讨数据科学主题,为您简单解释它如何应用于您的业务。如果你有特别感兴趣的话题想看,请留下评论!
无论您在分析路线图的哪个位置,都有学习和改进的空间。数据科学的旅程是漫长的,但会飞速发展,最终,独角兽企业是值得努力的回报。如果有什么我们能帮忙的,请给我们写信!
( Tresl 是一家 DSaaS 公司,专注于通过我们的专家数据科学家团队和即插即用人工智能驱动的产品来实现数据科学。)
特别感谢 George Dy 、 Bruno Wong 的剪辑!
原载于 2018 年 3 月 18 日tresl.co。
实践中的众包:我们的发现
原文:https://towardsdatascience.com/crowdsourcing-in-practice-our-findings-42a6aca36060?source=collection_archive---------13-----------------------
分析来自众包市场的大型数据集
这篇简短的博客文章提供了我们在 VLDB 17 年发表的题为“理解工人,开发有效任务,增强市场活力:一个大型众包市场的研究” ( 期刊版 , ArXiv 版 )的论文的一个窥见。由 Akash Das Sarma 撰写的博客文章,由我轻微编辑。合著者:阿尤什·贾恩,詹妮弗·维多姆。
尽管人工智能令人兴奋,对大量人工标记的训练数据的需求无处不在,但过去几年对众包行业来说是一个相对动荡的时期。最近出现了一连串的合并、更名、放缓、以及转向私人群体。因此,我们的目标是尝试后退一步,研究当前市场的状态,了解这些市场是如何运行的,请求者如何充分利用这些市场,以及工人如何参与这些市场。
Figure 1. Key participants in crowdsourcing
我们对一个数据集进行了实验分析,该数据集包括 2012 年至 2016 年间由 70,000 多名工人执行的超过 2,700 万个微任务,这些任务被发布到一个大型众包市场。利用这些数据,我们揭示了三个关键方面:(1)任务设计——理解什么是有效的、设计良好的任务;(2)市场动态——理解任务和工人之间的交互、相应的市场负载以及市场上流行的任务类型;(3)员工行为——了解员工的注意力持续时间、寿命和一般行为。
我们相信这项工作是建立大众工作综合基准的第一步,也是为下一代众包市场奠定指导性见解的第一步。
数据集概述
首先是一些术语:我们将任务实例定义为基本的工作单元,通常出现在一个网页上(带有一个或多个问题);一个项是任务中每个问题操作的一段数据;而批处理是由请求者并行发布的一组任务实例,不同之处仅在于项目。
我们研究的数据集包含 2700 万个任务实例,分布在 12000 个批次中。对于每个批处理,我们都有该批处理中一个样例任务实例的高级任务描述和 HTML 源代码。对于任务实例,我们知道许多重要的信息,包括开始时间、结束时间和工作者响应。对于每个完成任务实例的工作者,我们有以下信息:位置、工作者的来源和信任分数。
丰富数据集
为了扩充这些数据,我们添加了三种额外的任务属性数据:
- 手动标签——我们根据它们的(a)任务目标,例如实体解析、情感分析,(b)人- 操作者类型,例如评级、排序、标签,以及(c)任务界面中的数据类型,例如文本、图像、社交媒体,来手动注释每个批次。
- 设计参数——我们从 HTML 源代码中提取特征,以及反映任务设计决策的任务的其他原始属性。例如,我们检查任务是否包含说明、示例、文本框和图像。
- 性能指标——我们计算了不同的指标来表征任务的延迟、成本和混乱,以帮助我们对任务设计的“有效性”进行定量分析。
精选市场洞察
让我们先来看看市场的高层次、整体运作。这是报纸上的一个小样本。
我们在市场上看到了什么类型的任务?
我们在图 2a 中按目标绘制了任务分解图;图 2b 中按运营商的细分;以及在图 2c 中由操作者对每个目标的分解。
Figure 2a: Goals
Figure 2b: Operators
Figure 2c: Goals broken down by Operators
查看图 2a,我们发现语言理解和转录是迄今为止最受欢迎的目标,分别包含超过 400 万和 300 万个任务实例,其次最接近的任务目标情感分析仅跨越约 150 万个实例。我们还注意到,语言理解和转录任务相对具有挑战性,并且通常涉及复杂的操作人员作为构建模块(见图 2c)——这些很难自动化,因此市场管理员可能值得考虑培训和维护技术工人来完成此类任务。
查看图 2b,我们发现经典操作符、过滤和评级被频繁使用,仅过滤就被用于超过 800 万个任务实例(是任何其他操作符的两倍多),并且被用于实现几乎每个目标(如图 2c 所示)。鉴于众包算法社区已经对这两个操作符进行了大量研究,并且它们可以进行算法优化,因此将已知的任务分配和响应聚合算法打包到它们的平台中对于市场来说是非常有价值的。
市场负载和由此产生的延迟有何不同?
Figure 3. Observations about the flux in marketplace load and corresponding latency
我们在图 3 中绘制了发布的任务和提货时间。总的来说,我们看到市场在任何给定的一周内任务实例的到达都有很大的变化,从中值任务负载的 0.0004 倍到 30 倍不等— —这意味着市场需要能够处理突然大量涌入的任务,并为停机做好准备。
同时,市场上的高负载通常伴随着较高的活动水平和较低的延迟,反之亦然。因此,市场能够吸引工人来为高需求期服务,这表明工人的需求经常没有充足的任务供应来满足。
少数请求者主导市场吗?
Figure 4. Heavy hitters
为了研究这一点,我们将任务实例分组为集群,其中集群被定义为一组具有相同任务描述和跨不同时间点发布的 ui 的批处理。我们在图 4 中绘制了顶部集群的发布率。看起来很大一部分任务和批处理来自几个集群;对这些集群进行微调可以带来丰厚的红利。这些“重量级”任务类型会迅速增加到稳定的活动流,然后完全关闭,之后该任务类型将不再发出。
任务设计建议
接下来,我们查看一些任务设计选择,并定量分析这些特性对测量任务“有效性”的三个质量度量的影响:延迟、成本(如果我们假设按小时计酬,可以通过任务时间来近似计算)和任务混淆(不同工作人员相互不同意的程度)。
Table 1: Impact of Images
图像(表 1):我们发现没有图像的任务的延迟是有图像的任务的 3 倍,任务时间增加了 40%。
Table 2: Impact of Examples
示例(表 2):我们发现有示例的任务比没有示例的任务有将近 4 倍的延迟,并且有大约 30%的不一致。
据我们所知,在之前的工作中,没有量化的证据表明例子和图片有帮助,尽管有大量的轶事证据支持同样的观点——所以现在你有了!
与此同时,尽管在任务界面中包含图像和例子有明显的好处,但我们惊讶地发现大多数任务并没有这样做。
在我们的论文中,除了这些结果,我们还:
- 检查其他设计特征对三个感兴趣的指标的影响;
- 深入到具体的任务类型,检查相同的相关性,从而消除一些隐藏的变量;
- 执行回归分析,根据给定的设计特征值预测任务的结果度量值;和
- 找出在一个关键特征上不同的相似任务的具体例子。
工人特征
我们进行了几个独立的实验,以了解工人来源以及单个工人的特征。
人群工作者的 80-10 行为
Figure 5: Task completed by top 10% and bottom 90% of workers
我们将前 10%和后 90%的员工完成的工作按完成的任务分布绘制在图 5 中。我们发现只有 10%的劳动力完成了市场上 80%的任务。鉴于他们的经验,从活跃的员工那里收集定期反馈并与他们建立持久的关系可能是值得的。
工人来源及其影响
Figure 6: Quality of worker sources
这个特殊的市场聚集了来自 100 多个不同来源的员工,包括其他流行的众包市场,如亚马逊机械土耳其公司(Amazon Mechanical Turk)。有趣的是,我们注意到 AMT 员工在这个市场上花费的时间比其他主要来源的员工要少得多。Amazon Mechanical Turk(图 6 中的 amt )的员工在任何任务上平均花费的时间是平均任务时间的 5 倍。与其他主要来源的员工相比,他们的信任得分也较低(详见本文)。
在本文中,我们还深入研究了按地理位置、员工来源、任务数量、员工准确性以及长期行为(如活动天数和小时数以及活动寿命)划分的员工分布。
整体外卖
我们在实践中获得对群体工作的更好理解的工作对于设计群体驱动的算法和系统的学者和从业者有广泛的影响。
例如,理解各种类型的数据处理需求的相对重要性,可以有助于刺激未开发领域的研究;了解任务是如何拾取的,可以帮助学术界开发更好的延迟和吞吐量模型;了解员工的观点和参与度有助于设计更好的员工准确性和员工参与度模型;了解任务设计的影响可以帮助学者和实践者采用“最佳实践”来进一步优化成本、准确性和延迟。
承认
我们感谢国家科学基金会资助这项研究;我们感谢众包市场的人们为我们指出了这个丰富而迷人的数据集。
数据科学和加密货币套利:如何从中获利
原文:https://towardsdatascience.com/cryptocurrency-arbitrage-how-to-profit-from-it-e2d7bf805fde?source=collection_archive---------5-----------------------
From the “Last Days of Lehman Brothers”
最近,我听到很多人在谈论“套利”,以及他们是如何做的,或者计划做的,或者他们是如何通过使用 YouTube 上的指令编程的“机器人”来套利加密货币,从而获得惊人的利润。
我甚至见过为上述活动筹集资金的 ico,没有提到套利的关键方面,团队缺乏正确的领域专业知识。
我也从硅谷、香港和纽约的程序员那里听说过这一点。对套利、高收益交易和金融工程略知一二后,我决定写我的第一篇中型文章,以说明什么是套利、它的不同风格,以及我所看到的加密货币的一些机会。我在这方面的知识既有学术方面的(MBA,金融;工程师、程序员)和实用性:我曾在纽约和伦敦为德意志银行(Deutsche Bank)构建自营套利 CDO 交易,最大的一笔交易总规模约为 30 亿美元;我在雷曼兄弟中也扮演了类似的角色(请看这段视频,T2 华尔街日报采访我时提到了 2008 年雷曼兄弟的破产)。
长话短说?是的,至少在 2017 年末之前,加密货币**【确定性套利】存在大量机会;“统计套利”仍有机会,其中有几个有趣的是“监管套利”。作为一名涉足加密资产领域的量化分析师和数据科学家,最让我兴奋的是我称之为“哈希套利”,**它触及了上述所有内容的某些方面,但它本身是独一无二的。
正如我提到的,在加密领域,仍然有一些机会;但是,知情的人不谈;不要发表论文,或“开源”他们的代码,或在 Kaggle 内核竞赛中披露部分代码。在分享知识方面,华尔街和硅谷截然相反。
《韦氏词典》对套利的定义如下:
几乎同时在不同市场购买和出售证券或外汇,以便从价格差异中获利
我不会在这里谈论我上面提到的所谓的“哈希套利”,关于监管套利,我只会引用 investopedia 的定义,这很好:
监管套利是一种企业利用监管体系中的漏洞来规避不利监管的做法。套利机会可以通过各种策略来实现,包括重组交易、金融工程和地理重新定位。监管套利很难完全防止,但可以通过堵塞最明显的漏洞从而增加规避监管的相关成本来限制其流行。
在我解释和区分确定性套利和统计套利,以及大多数加密货币交易者正在谈论的套利类型之前,我需要首先谈谈“做市”。
当参与者想要购买或出售金融产品时,他们需要前往买方和卖方会面的交易所。
他们可以交易的价格取决于当时产品的供求关系,这被转化为买入的买入价和卖出的要价。如果交易方有限,那么就不可能购买或出售产品,产品现在被认为是非流动性的。这个过程如下图所示:
为了保证流动性,交易所需要专业人士的参与,不断向市场提供买卖价差。
换句话说,这些专业人士做市,因此出现了“做市商”这个术语。
做市商对产品的价格应该上涨还是下跌没有意见,他们从买价和卖价之间的差价或价差中赚钱。
当做市商在价差的任何一边交易时,他们在市场中持有头寸,这转化为他们的风险。做市商将试图找到抵消这种风险的方法,比如用不同的产品对冲头寸。
因此,做市商不仅要了解他们做市的产品,还要了解与其他类似金融产品的关系。
随着时间的推移,竞争和技术极大地改变了做市商的工作,以便在多个交易所持续提供有竞争力的报价,并且多种产品需要运行交易算法的计算机以及电子交易所连接。
摩根大通(JPMorgan)、摩根士丹利(Morgan Stanley)和高盛(Goldman Sachs)等投资银行巨头主导了这种类型的金融活动,但据我所知,它们在加密货币市场上几乎没有出现,部分原因是监管约束。然而,有证据表明,高盛和摩根大通至少代表私人客户参与了一些交易,并可能很快将大量资源投入市场。
做市商需要不断投资于技术和人员,以保持竞争力并为高效的金融市场做出贡献。这些技术进步和竞争使得做市商的工作变得更加复杂。
做市商通过收紧买卖价差来降低买卖证券的交易成本,从而提供真正的好处。
现在,有了对流动性和技术影响的基本理解,我们可以区分两种主要的套利类型:a)确定性套利,和 b)统计套利。
a)确定性套利发生在投资者同时买入和卖出一项资产,试图从类似或相同证券的现有差价中获利的时候。套利技术使投资者能够自我调节市场,并帮助消除价格差异,以确保证券继续以公平的市场价值交易。
鉴于在交易遗留证券时技术的进步,从市场的错误定价中获利变得极其困难。如上所述,许多成熟的金融机构是这一领域的市场领导者,它们大量投资于 IT 基础设施和计算机化交易系统,以监控类似金融工具的波动。任何低效的定价设置通常都会被迅速采取行动,机会往往会在几秒钟内消失。正如我之前提到的,我曾经是一个定量分析师团队的成员,为我的雇主组织这些交易,并使用专有资本。你可以想象,当大型机构投资者投入大量资金和尖端技术时,临时交易者没有机会。
从 20 世纪初铁路股票交易火爆的日子开始;技术为拥有它的人提供了优势。它让一些将资本和技术结合起来的梦想家从加州和纽约证券交易所之间的巨大差价中获利。那些在当时拥有私人电话和电报等“尖端”技术的人,可以在波动时期找到加州和纽约某些铁路股票的价格,并让他们的经纪人执行无风险交易。
加密市场中的这种套利与传统证券中的套利没有什么不同。直到 2017 年底,这个资产类别中几乎没有机构存在,如果你知道 Python,一些基本的数据分析,也许还有一些金融的基本知识;你本可以赚些钱;可能你们中的一些人正在阅读这篇文章,可能把它称为“确定性套利”。
当然,有过为前雇主开发 arb 机会的经验,不久前我试图从加密市场的 arb 机会中获利;因为我已经从 2015 年开始挖掘并接触 BTC 和瑞士联邦理工学院。但对于 arb,我开发了自己的技术栈,并与美联储的一名前分析师合作,他也是一名博士定量分析师,对 C++、Python 及其科学栈有相当好的了解。我还从印度招募了一个了不起的 Python 和 C++程序员,他在几个项目上帮助了我。因此,三个在几个领域拥有专业知识的程序员在帕洛阿尔托认真地开始了这个项目,当时我们正在为一家公司开发人工智能,这家公司需要具有不同行业的时间序列分析知识的定量分析师。
为了让我们的现金发挥作用,我们首先需要量化市场及其风险。我们通过收集每笔加密货币交易的实时数据做到了这一点:100 多种不同货币对的逐笔价格和交易量信息;以及与它们的基础区块链和交易这些硬币的交易所相关的数百个其他因素,并将一切存储在 NoSQL 数据库中。
Early arb tracker — it did work
左边的图表显示了我们早期(2017 年 1 月)编写的 arb 跟踪器和执行代码的 GUI。
我将“Arb 事件”定义为时间的函数,并用我们收集的一些数据编制了一个表格。我们的分析显示,去年在频率和价值上最大的套利机会发生在 BTC-美元/USDT 和 BTC-瑞士法郎对。
例如,下表显示了从 2107 年 7 月 22 日到 2017 年 8 月 23 日不同交易所的 BTC-美元/USDT 的分笔成交点数据和分钟平均值。
Cryptocurrencies arb opportunities in different exchanges — 7/22 to 8/23 2017
在此期间,我们的分析显示,套利机会打开的平均时间约为 11 分钟,平均套利利润约为 6%。交易所 Exmo、OKCoin 和 LakeBTC 占了我在本文中选择显示的期间内所有 arb 机会的 2/3 以上。
但是怀着好奇的心,我们想找出 为什么这些机会存在 。下表显示,在超过 90%的交易中,中国交易所作为套利方之一参与其中。
Origination of arbitrage trading opportunities in the cryptocurrency markets
是什么创造了这些套利机会?随着时间的推移,他们是继续还是放慢了速度?
2017 年 9 月 4 日,中国宣布在该国禁止 ico,在接下来的几天里引发了市场修正。后来,禁令扩大到中国的交易所和一些采矿企业,一些运营商被给予 30 天的时间停止运营。
这些行动导致了几乎所有加密货币的修正;但与此同时,这也为我们追踪的加密货币市场创造了同样显著的盈利机会。
中国政府的这一决定是因为中国矿商在中国农村开展业务,利用了高额的补贴能源成本。在过去几年中,中国能源消耗的大幅增长与工业生产无关,而是脱钩的;这“迫使”中国政府至少在调查这个问题时采取行动。正如你们许多人所知,像比特大陆这样的公司(在采矿机械专用集成电路市场占主导地位)开始探索向亚洲其他一些地区以及北美和欧洲转移。套利机会之所以存在,是因为中国矿商(那里存在大量加密货币开采)“被迫”在中国当地交易所以折扣价出售其产品,这使得中国交易所的运营商能够从中国境外交易所的价格差异中获利。
那么,让我们继续解释“统计套利”。
b) 统计套利是一种高度量化和计算化的交易方法。它涉及数据挖掘和统计方法,以及自动交易系统。在这里,我们有对冲基金商店,如 Quantbot Technologies ,或 1500 亿美元的对冲基金 Bridgewater Associates ,或 2 适马,它们是这类活动的市场领导者,通过大量投资于技术,从华尔街聘请最好的量化分析师,并重新培训硅谷程序员和计算机科学家(在大多数情况下,他们对时间序列分析或金融领域专业知识的了解有限或为零)像量化分析师一样思考。然而,这些商店并不涉及加密货币,至少意义不大。
从历史上看,统计套利是从配对交易策略演变而来的,在这种策略中,股票根据基本面或基于市场的相似性被配对。当一对股票中的一只表现优于另一只时,表现较差的股票被买入做多,预期它将向表现更好的股票攀升,另一只股票被卖空。从数学上讲,策略是找到一对协整高的资产。
*在统计套利中,投资组合的构建包括评分阶段,在这个阶段,市场中的每种资产都被分配一个反映其可取性的数字分数或等级;有点像谷歌的网页排名,但对于金融资产。评分非常直观,因为高分表示“做多”,低分表示“做空”。
有一个风险降低阶段,将资产按照精心匹配的比例组合成一个投资组合,以消除风险。但是很明显,once 必须意识到这些风险,这也是偶然的密码交易员无法通过测试的地方。*
量化商店和对冲基金的这种评分方式很吸引人,而且高度专有。显然,评分公式的细节各不相同,而且高度保密。我有自己的,一直应用到加密货币交易,甚至挖矿;并且它也适用于其他资产,但是在不同的时间范围内。
广义而言, 统计套利是指任何利用统计和计量经济学技术,为执行 提供信号的策略。可以预料,统计套利已经成为对冲基金和投资银行的主要力量,许多自营业务在不同程度上围绕着统计套利交易。
所以,回到加密货币交易商,他们声称已经将一些套利机会货币化;在我看来,他们还没有实现严格意义上的套利利润。
套利的定义指出“当一个投资者同时买入和卖出一项资产时,就发生了套利”。目前,在不同的区块链核查交易,速度不是“几乎同时”。最好的情况是,有 10-15 分钟的风险窗口,如果根据中值波动性进行调整,加密市场的风险要比股票市场大得多。
虽然我遇到的一些加密交易者在某些情况下实现了一些利润,但也有一些风险,主要是在他们在交易所“X”获得加密货币“A”的时间窗内持有货币,将其转移到交易所“Y”,并在那里出售。除了市场风险敞口,他们还承担了不同交易所的信用风险,以及许多操作风险。由于没有意识到这些风险,也不知道如何量化它们,这就造成了已经实现套利利润的“幻觉”。事实上,那些声称已经实现利润的人是幸运的,流动性风险没有对他们不利。在牛市中,每个人看起来都很聪明。
为了增加从 crytpo 市场的 arb 机会中获利的几率,我会说你必须瞄准我在这里提到的 3 种套利类型中的至少 2 种,即确定性套利、统计套利和监管套利。
通过自定义代码,我们目前分析加密货币交易所订单簿交易账户,这提供了对市场的许多见解;加上很多其他因素。我们的代码能够:
- 指出低风险的入口和出口点,
- 检测价格和数量数据中的异常值,
- 检测波动率变化的高概率,
- 在给定的时间框架内建立最佳的资产组合。
所有这些都旨在在风险调整的基础上超越基准。
那么,人工智能管理的加密投资组合与 BTC 买入并持有相比,或者与被动的指数策略如 Bitwise 的加密货币指数基金相比,表现如何呢?。下面的图表(你可以在这里找到 Tableau 版本)显示了每种策略下投资 10,000 美元的收益。
Bitwise top 10, vs BTC buy and hold, vs an A.I. managed portfolio
2017 年 1 月 1 日在 BTC 投资的一万美元到 2018 年 4 月 5 日增长到大约 69000 美元。同样的$10K 在 Bitwise 的 10 大指数中增长到约 97K 使用 stat arb 方法在人工智能管理的投资组合中增长到大约 17 万美元。所有的指数都考虑了滑点和交易成本。
我见过金融科技领域有良好(理论上)理论模型的风投基金初创公司,但我怀疑(就我所见)这些模型会在 2008 年雷曼兄弟(Lehman)倒闭或 LTCM 危机前后的情景中崩溃。这些创业公司开发的许多底层机器学习模型很少(或根本不)考虑紧张的宏观经济场景和隐藏的运营风险。我想一些新投资的对冲基金,带着新的资本,冒险进入加密领域,也没有考虑到这些风险。
因此,为了以正确的方式从加密货币套利中获利,在你投入任何资本之前,先量化你能想到的所有风险;做大量的样本外测试。此外,领域专业知识大有帮助,所以如果你没有接触过专业交易;尝试与和你有共同兴趣,但在现实世界中有一些金融工程经验的人合作。
你可以在这里关注我或者问下面的问题。
干杯
注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
创业公司中的文化差异
原文:https://towardsdatascience.com/cultural-nuances-in-startup-b6df7984af43?source=collection_archive---------11-----------------------
文化差异无处不在——学校、工作场所、人际关系,创业领域也不例外。不同地区的创业公司最看重什么概念或创意?创业公司在全球各地的营销方式不同吗?来自 RISE 2018 创业榜单的数据告诉了我们一些有趣的故事,从电梯推介到公关渠道。
崛起大会
RISE 2018 是在香港举行的为期 4 天的科技大会,初创公司设立展台展示产品,投资者寻找具有高潜力的公司,行业领袖分享他们的见解。
今年,在为期 4 天的活动中,来自 58 个国家的 750 多家初创公司参展。香港吸引了超过 150 家本地初创企业参展,随后是印度、新加坡、马来西亚和美国。大多数公司总部设在亚洲,但我们也看到来自欧洲、南美和非洲不同大陆的公司。
金融科技和电子商务&零售是所有 25 个行业中最受欢迎的类别,分别有 104 家和 103 家公司加入。特别是香港的 Fintech 带来了 35 家公司,在所有地区-行业配对中名列榜首。
我去年 7 月去过那里,那真是大开眼界(至少对我来说)。今年我没有拿到门票,但我在 RISE 网站上找到的数据同样有趣,如果不是更多的话。
58 regions participated
top 20 countries — most are based in Asia
电梯推销术
有趣的部分开始了——所有的初创公司都被要求提供“电梯推介”
大多数公司给出了一个 17-18 个单词(平均值-中间值)的标语,概括了他们是谁以及他们提供了什么(可能与电梯推销中的预期不同)。但是有一个 outliner——网络峰会——放一个 92 字的段落!
Web Summit is a global technology conference company headquartered in Dublin, Ireland. We run a series of international gatherings across the world. Our flagship event is Web Summit, currently held in Lisbon, Portugal. In the last eight years, Web Summit has grown from a small team to a company of over 200 focused on disrupting the conference industry through technology and data science. In 2018, over 100,000 startups, investors, speakers and attendees will gather at Web Summit events, including MoneyConf in Ireland, Collision in the North America and RISE in Hong Kong.
如果你不知道,网络峰会是举办 RISE 会议的团队。
嵌入产品线的概念
most common word stem (lemma)
以上是使用所有电梯营销中最常见的“单词”的公司数量(它们可能不是实际使用的单词,而是单词的基本形式——“lemma”)。
在常用词中,“平台”是使用频率最高的,有 177 家公司使用了这个词。平台创业永远不会老。还是平台即服务?
许多创业公司都包含类似“服务”、“解决方案”、“提供”、“帮助”这样的词语——提供服务和解决方案是许多创业公司想要传达给客户的一个关键理念。
毫无疑问,艾(排名第 8)和(排名第 12)名列前茅。也许几年后,人工智能将会名列榜首?或者另一种情况,只有少数公司会把“人工智能”放在他们的营销线上,因为它不再值得一提。
艾是新电 —吴恩达
countries with startups using “blockchain” in their elevator pitch
除了人工智能,“区块链”是另一个热门主题,主要出现在香港和新加坡,每个城市都有 12 家公司的口号中包含这个词。相对而言,“区块链”在新加坡更受欢迎,因为它在新加坡排名第二,而在香港,它在电梯推介中仅排在第十位。
其他概念,如 IoT(物联网)、云和密码/加密货币(少于 15 家公司)等,没有最初预期的那么受欢迎。尤其是“区块链”和“密码”之间的受欢迎程度差距——这可能表明的初创公司更愿意将自己推销为“区块链”公司,而不是“密码”公司。
文化差异和行业趋势
% of companies using the top 20 common words in each region
我们已经知道“平台”是初创公司非常常见的主题,在上面的热图中,我们确实观察到不同地区的一些相对偏好。泰国、印度、马来西亚、香港看起来更像是“平台”,在韩国相对没那么受欢迎(文化差异?).
这种分布确实反映了一些有趣的文化差异模式。韩国创业公司更侧重于“我们”(-PRON-)、“服务”和“技术”;印尼强调“解决方案”、“ app ”、“平台”;比起其他国家的初创公司,香港、印度、韩国和美国的公司更喜欢称之为“世界”;菲律宾“上线”,“有事的”,“有事联系”。
% of companies using the top 20 common words in each industry
对于行业的衡量标准也有几句话要说。如果你不是一家电子商务公司,声称自己是“在线”可能是多余的。硬件&物联网公司很可能是某个东西的解决方案。广告&营销、大数据以及企业解决方案初创公司正在将更多的 AI 概念应用到他们的产品中。如果你不是一家金融科技公司,但你确实想脱颖而出,考虑在你的电梯推介中加入“区块链”(如果这有意义的话)。
公关渠道
除了电梯推销之外,初创公司还被要求提供脸书、Twitter、Linkedin 等公关渠道的网址,以及像 Crunchbase 和 AngelList 等初创平台的个人资料页面。
下面的热图显示了每个地区拥有相应公关渠道的公司的百分比。(我认为,假设初创公司会填写表格是有道理的,如果他们维持这样的渠道,除非他们真的很懒……)
% of companies within each region having a certain PR channel
对社交媒体渠道(脸书、推特、Linkedin)的观察
#1: 脸书是许多东盟国家(马来西亚、菲律宾、泰国)、台湾和香港的主要渠道。而美国和澳大利亚的公司似乎更关心 Twitter。
#2:乍一看,韩国的初创公司似乎不太依赖社交媒体作为公关渠道(排名最低)。虽然这可能是真的,但也可能是因为本地化的社交媒体(Naver、Kakao 等)在韩国非常受欢迎,因此脸书、Twitter 和 Linkedin 等西方世界的社交媒体可能不是他们的首选。
#2.5:中国也有与韩国相似的模式,但原因可能不同。脸书和 Twitter 被中国的防火长城屏蔽了,但 Linkedin 没有,这解释了 Linkedin 比脸书和 Twitter 高出 20%的原因。
对创业概况的观察(AngelList、Crunchbase、新闻稿)
#3: AngelList 在大多数地区的覆盖率似乎相对较低,尤其是在东盟国家、韩国和台湾。但 AngelList 在美国初创公司中更受欢迎(59%比 52%),两家公司都是美国公司。
4:中国大陆和台湾似乎比其他地区的同行更重视“新闻稿”,都有超过 50%的公司提供新闻稿链接;另一方面,美国公司不太关心“新闻稿” (36%),但在 AngelList (59%)和 Crunchbase (52%)中更看重初创公司简介。
% of companies within each industry having certain PR channel
在行业方面,这种模式似乎更加明显。
对于生活时尚领域的初创公司来说,脸书几乎是必不可少的(94%),而 Linkedin 个人资料更像是可选的(56%)。一般来说,医药创业公司做的公关最少,可能是因为他们的客户是关心实际技术的机构,受炒作和营销的影响较小。
在人工智能和机器学习领域,Linkedin 与(脸书+ Twitter)的相对重要性是相反的——也许他们的客户更加专业?(但我们没有在企业解决方案领域进行观察,因此这可能是一种过度解读)。
结论
我发现一些趋势和观察像是“常识”——作为一个香港人,我知道 Twitter 不如脸书受欢迎,中国屏蔽了脸书和 Twitter。有些观察结果可能是过度解读,这是正常的,因为我们没有采用非常稳健的统计方法来得出这些观察结果。但一些见解确实激励我更深入地思考,并尝试联系我们现有的知识,比如韩国和中国的公关渠道。
数据和分析可以在我的 github 中找到。在笔记本中,我准备了一些交互式可视化(从交互式世界地图到使用单词嵌入的 t-SNE 可视化),但后来我意识到没有办法将其嵌入到这篇文章中。但是我仍然在探索这个数据集的过程中获得了很多乐趣,我希望你也喜欢阅读这个。
模糊时代的文化映射
原文:https://towardsdatascience.com/culture-mapping-in-the-age-of-ambiguity-4836f681c033?source=collection_archive---------4-----------------------
由蒂姆股票 & 玛丽·莱娜·图波特
我们生活在一个模糊的时代。技术进步和全球经济增加了社会复杂性,迫使我们对世界事物变化的理解发生了变化。在复杂而模糊的环境中,长期的成功依赖于两大支柱:创造力和社会。新的思维方式对于理解动态的全球格局至关重要。然而,世界经济论坛的 W. Lee Howell 指出科技进步加上当今复杂的社会问题对理解创新以及创新如何为所有人创造价值提出了挑战。
人们被大数据淹没,无法提取他们需要的信息;问题是如何组织数据以获取有意义的信息,而不是与大量的统计数据打交道。因此,他们倾向于回归传统技术——这些技术不是为当今复杂或模糊的世界设计的。我们错过了数据中的故事。我们看不到未来的发展。
什么是文化?
文化是一个动态的、相互关联的系统。文化洞察力的深刻机会在于特定意识形态、特定地点和特定时间点的人们正在采用和适应的模式。
Meanings emerge only in relationship between data points.
可视化有助于说明从文化中演化出来的复杂的社会关系。在这个模棱两可的世界中,新的思维方式变得至关重要,这要求摆脱对任何一个数据点或文化特征的关注,并开发有助于显示点之间关系的数据和可视化策略。意义只出现在点与点之间的关系中。
例如,只关注我们作为一个社会如何重视汽车作为一种交通方式,而不考虑汽车与我们自己的人际进化和性自由概念的关系是不够的。毫无疑问,汽车运送人们不仅仅是从一个地方到另一个地方。他们允许人们维护自己。汽车让人们超越国界。它们拓展了人们生活的空间。传统的研究可能会错误地认为答案是更多的汽车。但是背景故事与汽车无关,更不用说更多的汽车了。是关于眼界的拓展。问题是能做些什么来扩展视野?随着这些关系的确定,直觉可以被重建,定量方法的拐杖可以被最小化。
文化是一个可测量的系统
在这个模棱两可的世界里,成为文化流行病学家是必不可少的。研究必须采取更加细致和归纳的方法来收集洞察力。我们必须对数据有耐心,并更多地关注具有重大影响的较小信号。每件事都必须与所有其他因素联系起来权衡。这就是为什么像这样的领导人提出了这个发人深省的想法,“在人工智能方面领先的国家将成为世界的统治者。这是一个有效的观察。
Our research must anticipate adaptation and immune responses.
因此,尽早识别文化信号变得至关重要。将人类表达视为社会系统的一部分,可以预测适应性和免疫反应。通过制定考虑黑天鹅的行动方案,可以获得巨大的价值。我们解读意外的能力只能来自对文化如何运作的系统观点。这里的关键词是“视图”一旦导致市场过饱和的过程暴露出来,它的路径就变得明显要避免。相反,那些曾经细微的意识形态转变可以在发生之前被积极地看待,并自信地投资于长期的经济和社会影响。
"我们所知道的所有进化都是从模糊到明确的过程."—查尔斯·桑德斯·皮尔士(美国哲学家、实用主义之父)
我们必须明白,这些文化系统是可测量的,这使得科学能够回到研究文化动态和意义创造是如何构成的。随着下一代技术和机器学习的发展,我们的方法可以更好地利用这一现实。
将科学转化为技术
根据作家约翰·兰卡斯特最近在《纽约客》上发表的文章文明如何开始,“然而,在人类历史的大部分时间里,技术与科学毫无关系。我们许多最重要的发明都是纯粹的工具,背后没有科学方法。”做饭前先有火。肥皂比青霉素等预防了更多的死亡。
这几乎就是当今世界数据和技术的现状。有很多技术,很多数据,但是缺少方法。
Culture Mapping Matrix
出于这个原因,经过十年的严格测试和调整,我们用实用专利锁定了我们的人类学方法。我们的方法一如既往——甚至在大数据时代之前——帮助我们组织和理解不断涌入的文化数据和趋势。它通过利用语言作为最强大的人类数据形式来工作,提供了一个丰富的视角来了解事物是如何真正与衡量表达的符号矩阵相违背的。输入语言数据,或“文化能指”,创建一个有助于识别和构建认知空间的地图。这些空间是语言聚集的地方,也是新习惯和新行为出现的地方。一个群体对世界的感知可以用语言分类法来表示,这些分类法在矩阵结构中显而易见。
A Cartesian grid quantifies points on the matrix and relationships between points
这些语言符号在每个象限中充当文化符号,形成一个模式化的、可测量的逻辑。原型和代码从能指群中浮现,将基本的人类叙事置于语境中。出现的逻辑和随之而来的算法量化了原型可能如何独特地响应。例如,放在四个象限的上下文中的“有机”一词,在与其他变化的能指相关时,意义发生了变化,从而产生了反应。出现的故事是亲属关系的基础。它们阐明了新出现的趋势,有助于理解社会适应。这有助于利用文化变革的模式和动力。
文化图谱有着广泛的应用
这并不是说在数字数据存在之前,就有信息可以映射。但是,有时,这一点被遗忘了。研究往往始于并止于可以通过数字手段获得的东西。毫不奇怪,它的成本效益在它的直接使用。然而,数字制图可以扩展到野外工作,反之亦然。目标是将看似不同的数据放在同一个测量平面上。
使用这种结构,可以实现和增强语料库的更广泛的互相关。还可以开发招聘的认知框架,并且可以构建进一步查询的语言逻辑。这些预测框架可以随着时间的推移进行测试和发展。
The hidden meanings in fieldwork emerges in cross-correlation of data sets
这种方法在充满挑战的研究市场中表现出明显的价值。例如,当在日本进行民族志实地调查时,传统的方法有所欠缺,而更现代的即兴采访方法受到怀疑。直接提问是不正确的,因为受试者会小心翼翼地透露他们的真实感受,以免被冒犯。这种现象并非日本独有——事实上,它在全球范围内因学科而异。访谈和调查天生无法捕捉意义和意图。
然而,结合多层数据分析和人种学可以解开研究中的一些难题。允许冗长与网上出现的更大范围的社会符号联系起来。这种混合方法有助于研究人员了解如何招募受试者,并有助于开发持续的小组和寻找现实生活中的灵感。筛选过程的意识形态演变给出了社会背景下个人的更大图景。这种对招聘细分的认知方法可以使互动不那么直接,而对主题和活动中的自然互动更加开放。
利用新兴技术
研究人员的沙箱被创建,这对于集成机器学习和补充 API 是有用的。图像识别 API 可以帮助我们对更大的视觉信息数据集进行分类。放入我们的框架中,图像集群作为一个集体讲述它们自己的故事。图像中有视觉细节,可以分类,然后搜索。单词和图像可以在它们的独特配对中进行评估,这些结构可以用于运行更大的搜索查询来收集近邻相关性。我们还可以分析图像与特定关键字的独特配对,这些关键字与我们矩阵中的独特认知空间相关联。该结构为所有这些新兴的识别引擎提供了可能性,包括可以对手势和声音进行分类的识别引擎。关键是数据的结构如何使这些识别引擎在理解文化变化方面更加实用。
哄骗出诗歌和故事
将数据中的诗意哄出来将真正的分析与计算分开——19 世纪英国数学家阿达·洛芙莱斯强调了分析引擎通过编程解决任何复杂问题的能力,这不同于计算机器。
“数学科学展示了什么是。它是事物之间看不见的关系的语言。但是要使用和应用这种语言,我们必须抓住看不见的、无意识的东西。”
——阿达·洛芙莱斯(英国数学家和作家)
The Patterns of Dissent and Aspiration
归根结底,数据是关于人的。研究结果必须更好地反映这一事实,尤其是如果人们被期望根据研究结果采取行动并实施策略的话。调查结果必须真实,并引起共鸣,才能引起关注。利用荣格原型是将发现带入生活的一种方式。它们作为文化能指的基础,揭示了人物实际上是信仰和意识形态系统中的点——从作为文化异议点的反叛者到将语言正常化为一种社会货币形式的英雄和情人。
原型代表了一个进化的过程。研究人员可以在任何给定的时间,在不断变化的社会力量背景下进行测量。衰退引发了一种免疫反应文化,在重建文化规范的过程中,这种文化高度重视反叛者和圣人。许多在 2009 年触发的早期信号现在被表达为社会规范和适应方式。经济衰退后瑜伽在美国文化中的演变就是一个很好的例子。从自我实现到作为社会徽章的瑜伽裤,与意义的起源无关。
基于文化开发新的 KPI
在讨论希望从数据中得到什么时,经常会用到 KPI(关键绩效指标)这个词。不同企业对这些指标的定义非常松散。社会背景下的适应性行为是唯一重要的指标,这种指标需要从意识发展到信仰体系。期望该指标用一个点来表示是不正确的。对这种绩效概念的需求可以从过去十年公司的兴衰中得到证明,像零售业这样的类别同时处于危机和重生之中。大品牌正在收购文化正宗的初创公司,以抵消其核心产品组合中销售额的下降。衡量未来成功的唯一标准是这些公司如何看待文化变革的复杂性,以及如何制定正确的参与行动措施。随着城市的发展,郊区的新机会开始以新的方式出现。随着手工食品被过度营销,在食品生产的科学方法开始被回收和整合。
作为文化体系的食物
想想 20 世纪 60 年代超市是如何设计的。在消费主义蓬勃发展的几十年里,食物反映了对技术和进步的意识形态肯定。这种常见的食品购物观念已经发生了巨大的变化——最显著的变化发生在我们最近的生活中。它的变化不是由营销者或城市规划者促成的,而是由推动变化的文化网络系统促成的。在全食食品出现之前,食物框架的含义经历了几十年的演变。这一含义与二战后食品生产中社会规范的政治反应直接相关。从罗代尔健康和保健书籍到艾丽丝·沃特斯到常伟,这些网络定义了我们如何生活、如何庆祝,进而定义了我们如何烹饪,并最终定义了我们如何成长。
研究倾向于将消费的这些方面孤立起来,这样就错过了某些关键趋势的兴衰。如果你想看到食物的未来,那就去找有创造力的厨师吧。他们是农场和每个人餐桌之间的桥梁。但是他们不仅仅在厨房里,他们还在游说和孵化。将种植和培育食物的新符号语言构建成可以理解和分享的技术的过程至关重要。对于那些想要建立面向未来的品牌组合的公司来说,整合的文化参与是一种更强有力的经济地位。
预测奢侈品泡沫
可视化这些文化系统有助于更好地描绘文化稀释和泡沫。把奢侈品的文化体系当作另一个例子。奢侈是在深奥和允许之间不断寻找平衡。在互联网发展的这些年里,它受到了意义元素被轻易重新分配的困扰。当每个人都知道它,并且能够以某种方式访问它时,最初的意义就消失了。它在奢侈品的支柱之间创造了一种意识形态的张力,这些支柱是目的、真理、自由和等级。绘制地图揭示了这些支柱的动态,并准确展示了在何处、何时以及如何进行克制。
过度促销会扼杀一个品牌。随着美国和欧洲市场在衰退后下滑,许多传统品牌都犯了这个错误。地图的一个很好的应用是了解一个品牌如何在多种实体和虚拟零售环境中表达自己而不降低意义。研究人员和品牌经理可以为品牌编排一个分层的元叙事,以区分零售环境,从而平衡艺术与易用性。一个不能做得太重而不伤害整体。像 Gentle Monster 这样的品牌通过允许其实体零售店更多地发挥景观和知识获取的功能,很好地执行了这一现实。为什么?因为该品牌了解人们在网上购买产品的便利性。温柔怪兽是一个设计师品牌,在“创新高端实验”的理念下不断发展这给了品牌喘息和创新的空间。
回溯更好的未来
回溯是一种设计研究方法,在这种方法中,确定一个理想的未来,然后反向工作,以调整政策和计划,将指定的未来与现在联系起来。在文化映射的情况下,行为原型建立了未来的愿景,以及随着时间的推移可以在上下文中连接的方式。例如,在 2007 年,自行车介于兰斯·阿姆斯特朗所代表的阳刚之气和童年周末骑自行车的琐碎之间。这个类别被定义为休闲。未来将把自行车作为交通工具不可分割的一部分。但是支持这一观点的传统数据还不存在。这项研究需要挖掘文化运动。2002 年加拿大的裸体自行车骑行是最近第一次自行车被用于抗议——始于艺术家促进和平/艺术家反对战争(法新社/AAW)。从那时起,像临界质量这样的支持自行车的抗议运动作为一种收回街道的方式出现,随后是激进的城市规划行动主义,导致围绕自行车交通考虑重建的适合步行的城市。这些事件预示了自行车和城市的发展方向。未来是流动而平凡的。
方向变化的迹象总是存在于文化中;我们只需要知道去哪里找证据。文化图谱为我们指明了正确的方向,为我们提供了处于进化前沿的优势,既给人以先见之明,又为新的社会方向做好了充分的准备。
在社会日益复杂和模糊的时代,任何地方的任何社会现象都可以用这些工具来观察,文化图谱有助于简化和提供清晰度。如果我们把我们的研究方法与文化的实际运作同步,我们就能培养出一种新的文化素养。
医疗保健机器学习和自然语言处理资源精选列表
原文:https://towardsdatascience.com/curated-list-machine-learning-and-nlp-resources-for-healthcare-35ef6e26ac89?source=collection_archive---------5-----------------------
2017 年 12 月 20 日更新随着我将这个项目转移到下面的 GitHub 库,这篇文章将不再更新。在那里你可以找到一个更新的列表。如果您有其他建议,请制作一份 PR 来帮助填补缺失区域和公开问题。
[## isaacmg/healthcare_ml
医疗保健 ml -医疗保健 ML|NLP 资源的精选列表。
github.com](https://github.com/isaacmg/healthcare_ml)
为那些对 ML 和 NLP 在医疗保健中的应用感兴趣的人列出了有用的论文、代码、教程和会议。更多的来源将被添加,所以经常检查回来。欢迎在评论中留下反馈或建议。
教程/研讨会
医疗保健领域精准医疗的 NLP(ACL 2017)
医疗保健应用的深度学习:挑战和解决方案 (ICML 2017)
机器学习与健康研讨会 (NIPS 2016)
有趣的论文
皮肤科医生级别皮肤分类皮肤癌与深度神经网络(Nature)
艾医生:通过递归神经网络(MLR)预测临床事件
利用机器学习分析和改进缺血性心脏病的诊断 (NIH 经典文章)
心脏病专家心律失常等级分类(斯坦福)
用于医疗诊断的机器学习(经典 2006 年文章)
里维医疗保健深度学习 w,机遇与挑战(牛津学术 2017)
会议/聚会(特定于此主题)
医疗保健领域的机器学习(MLHC)
医疗保健会议中的机器学习
Github 仓库
[## mp2893/doctorai
人工智能医生项目的知识库
github.com](https://github.com/mp2893/doctorai)
竞争
数据科学碗 2017-肺癌检测
【2016 年数据科学碗-在磁共振成像中估计心脏收缩容积
Luna16 (诊断肺癌)
个性化医疗重新定义癌症
遗产健康奖
NCBI 黑客马拉松
SVI 艾
数据集
[## 模拟重症监护数据库
研究人员可免费获得的重症监护数据。
mimic.physionet.org](https://mimic.physionet.org) [## 数据集-癌症报告的国际合作
编辑描述
www.iccr-cancer.org](http://www.iccr-cancer.org/datasets) [## 癌症影像档案(TCIA) -不断增长的癌症医学影像档案
癌症影像档案(TCIA)是一个大型的癌症医学影像档案,可供公众下载。所有…
www.cancerimagingarchive.net](http://www.cancerimagingarchive.net) [## 斯坦福大学
这些基因型是在 Illumina 650Y 阵列上生成的,GenCall 得分截止值为 0.25。整体调用的样本…
www.hagsc.org](http://www.hagsc.org/hgdp/files.html)
课程/其他
[## 6.S897/HST。S53:面向医疗保健的机器学习
探索临床和医疗保健应用的机器学习方法。涵盖算法公平的概念…
mlhc17mit.github.io](https://mlhc17mit.github.io) [## 医疗保健和人工智能领域被引用最多的 3 项研究
健康家里有机器人医生吗?人工智能是许多行业的热门话题,但…
quid.com](https://quid.com/feed/paging-dr-robot-how-ai-will-transform-healthcare) [## pydicom/pydicom
用 python 代码读取、修改和写入 dicom 文件
github.com](https://github.com/pydicom/pydicom)
好奇心驱动的学习变得容易第一部分
原文:https://towardsdatascience.com/curiosity-driven-learning-made-easy-part-i-d3e5a2263359?source=collection_archive---------3-----------------------
本文是🕹️. tensor flow 深度强化学习课程的一部分点击查看教学大纲。
OpenAI Five contest
近年来,我们在深度强化学习方面看到了很多创新。从 2014 年的 DeepMind 和深度 Q 学习架构到 2018 年的 OpenAI 与 OpenAI five 玩 dota 2,我们生活在一个令人兴奋和充满希望的时刻。
今天我们将学习好奇心驱动的学习,深度强化学习中最令人兴奋和最有前途的策略之一。
强化学习基于回报假设,即每个目标都可以被描述为回报的最大化。然而,当前外在奖励(即环境给予的奖励)的问题是这个函数是由人硬编码的,不可扩展。
好奇心驱动学习的想法是建立一个奖励函数,它是代理固有的**(由代理自身生成)。这意味着代理将是一个自学者,因为他既是学生,也是反馈大师。**
听起来很疯狂?是的,但这是一个天才的想法,在 2017 年的论文通过自我监督预测的好奇心驱动的探索中再次提出。第二篇论文好奇心驱动学习的大规模研究改善了结果。
他们发现,好奇心驱动的学习代理表现得就像他们有外在奖励一样好,并且能够更好地概括未探索的环境。
编辑:自 90 年代以来,好奇心一直是强化学习研究的一个主题,J. Schmidhuber 先生的出色工作,你可以在这里阅读。
在第一篇文章中,我们将讨论这个理论,并解释好奇心如何在理论上驱动学习。
然后,在第二篇文章中,我们将实现一个好奇心驱动的 PPO 代理来玩超级马里奥兄弟。
听起来很有趣?让我们开始吧!
强化学习中的两个主要问题
现代 RL 面临两个问题:
首先,稀疏奖励或不存在奖励问题:即大多数奖励不包含信息,因此被设置为零。然而,由于奖励是对 RL 代理的反馈,如果他们没有收到任何反馈,他们对哪种行为是适当的(或不适当的)的知识不会改变。
Thanks to the reward, our agent knows that this action at that state was good
例如,在 Vizdoom“末日家园”中,你的代理只有在找到防弹衣时才会得到奖励。但是,马甲离你的起点很远,所以你的大部分回报会是零。
A big thanks to Felix Steger for this illustration
因此,如果我们的代理没有收到有用的反馈(密集奖励),它将需要更长的时间来学习一个最优策略。
第二个大问题是外在奖励函数是手工制作的——也就是说,在每个环境中,一个人必须实现一个奖励函数。但是我们如何在大而复杂的环境中扩展它呢?
一个新的奖励函数:好奇心
好奇心是一种内在的奖励,它等于我们的代理人在给定其当前状态的情况下预测其自身行为后果的误差(也就是在给定当前状态和采取的行动的情况下预测下一个状态)。
为什么?因为好奇的想法是鼓励我们的代理人采取行动,减少代理人预测其自身行动结果的能力的不确定性(在代理人花费较少时间的区域**、或具有复杂动态的区域**,不确定性会更高)。
因此,测量误差需要建立环境动力学模型,在给定当前状态和行动 a 的情况下预测下一个状态。
这里我们可以问的问题是,如何计算这个误差?
为了计算好奇心,我们将使用第一篇论文中介绍的一个模块,称为内在好奇心模块。
介绍内在好奇心模块
需要一个好的特征空间
在开始描述模块之前,我们必须问自己给定我们当前的状态和我们的动作,我们的代理如何预测下一个状态?
我们知道,我们可以将好奇心定义为给定我们的状态 st 和动作 at 的预测新状态(st+1)与真实新状态之间的误差。
但是,请记住,大多数时候,我们的状态是 4 帧(像素)的堆栈。这意味着我们需要找到一种方法来预测下一个帧堆栈,这非常困难,原因有二:
首先,很难直接预测像素,想象你在厄运中你向左移动,你需要预测 248*248 = 61504 像素!
第二,研究人员认为这不是正确的做法,并举了一个好例子来证明这一点。
想象一下,你需要研究树叶在微风中的运动。首先,对微风建模已经很难,因此在每个时间步预测每片树叶的像素位置要困难得多。
问题是,因为你总是有一个大的像素预测误差,代理将总是好奇,即使树叶的移动不是代理动作的结果**,因此它的持续好奇是不可取的。**
Trying to predict the movement of each pixel at each timeframe is really hard
因此,我们需要将原始的感觉输入(像素阵列)转换成一个只有相关信息的特征空间,而不是在原始的感觉空间(像素)中进行预测。
我们需要定义什么规则必须尊重一个好的特征空间,有 3 个:
- 需要对代理可以控制的事物进行建模。
- 还需要对代理无法控制但可以影响代理的事情进行建模。
- 需要不受不受代理人控制且对其没有影响的事情的影响。
举个例子,你的代理是一辆汽车,如果我们想创建一个好的特征表示,我们需要建模:
The yellow boxes are the important elements
我们的车(由我们的代理控制),其他的车(我们不能控制但可以影响代理)但我们不需要对树叶建模(不影响代理我们也不能控制)。通过这种方式,我们将获得噪声更少的要素制图表达。
期望的嵌入空间应该:
- 在尺寸上要紧凑(去掉观察空间中不相关的部分)。
- 保存足够的观察信息。
- 稳定:因为不稳定的奖励让强化代理很难学习。
内在好奇心模块
ICM Taken from the Paper
内在好奇心模块是帮助我们产生好奇心的系统**。**由两个神经网络组成。
请记住,我们只想预测环境中的变化**,这些变化可能是由于我们的代理的行为引起的,或者会影响代理,而忽略其他变化。这意味着,我们需要将感觉输入转换成一个特征向量,其中只表示与代理执行的动作相关的信息,而不是从原始感觉空间(像素)进行预测。**
为了学习这个特征空间:我们使用自我监督,在给定代理的当前和下一个状态(st 和 st+1)的情况下,在预测代理动作(t)的代理逆动力学任务上训练神经网络。
Inverse Model Part
由于神经网络仅需要预测动作,它没有动机在其特征嵌入空间内表示环境中不影响代理本身的变化因素。
Forward Model Part
然后,我们使用该特征空间来训练前向动力学模型,该模型在给定当前状态 phi(st)和动作 at 的特征表示的情况下,预测下一状态 phi(st+1),的未来表示。
并且我们将正向动力学模型的预测误差提供给代理作为鼓励其好奇心的内在奖励。
好奇心=预测值 _phi(st+1) — phi(st+1)
因此,ICM 中有两种模型:
- 逆模型(蓝色):将状态 st 和 st+1 编码成特征向量 phi(st)和 phi(st+1),训练成预测动作βt
Inverse Loss function that measures the difference between the real action and our predicted action
- 正向模型(红色):以 phi(st)和 at 为输入,预测 st+1 的特征表示 phi(st+1)。
Forward Model Loss function
那么从数学上来说,好奇心将是我们预测的下一个状态的特征向量和下一个状态的真实特征向量之差。
最后,该模块的整体优化问题是反向损耗、正向损耗的组合。
那真是浪费了大量的信息和数学!
概括一下:
- 由于外部奖励实现和稀疏奖励问题,我们想要创建一个对代理来说是内在的奖励。
- 为了做到这一点,我们创造了好奇心,,这是代理在给定其当前状态的情况下预测其行为后果的错误。
- 使用好奇号将促使我们的智能体倾向于预测误差较高的转换(在智能体花费时间较少的区域或动态复杂的区域预测误差较高),从而更好地探索我们的环境。
- 但是因为我们不能通过预测下一帧来预测下一个状态(太复杂了),所以我们使用了一个更好的特征表示,它将只保留可以由我们的代理控制或影响我们的代理的元素。
- 为了产生好奇心,我们使用由两个模型组成的内在好奇心模块:逆模型用于学习状态和下一状态的特征表示,以及正向动力学模型用于产生下一状态的预测特征表示。
- 好奇号将等于预测φ(ST+1)(正向动力学模型)和φ(ST+1)(反向动力学模型)之间的差值
今天就到这里吧!既然你理解了这个理论,你应该阅读两篇论文实验结果好奇心驱动的自我监督预测探索 和好奇心驱动学习的大规模研究。
下一次,我们将实现一个 PPO 代理,使用好奇心作为内在奖励来玩超级马里奥兄弟。
如果你喜欢我的文章,请点击👏只要你喜欢这篇文章,其他人就会在媒体上看到。别忘了跟着我!
如果你有任何想法,评论,问题,欢迎在下面评论或者给我发邮件:hello@simoninithomas.com,或者发推特给我。
不断学习,保持牛逼!
Tensorflow 🕹️深度强化学习课程
📜教学大纲
📹视频版
第一部分:强化学习简介
第 2 部分:用 Q-Learning 更深入地研究强化学习
第 3 部分:深度 Q 学习简介:让我们玩毁灭战士
第 3 部分+: 深度 Q 学习的改进:决斗双 DQN,优先体验重放,固定 Q 目标
第 4 部分:关于带有厄运和翻转的政策梯度的介绍
第五部分:优势演员介绍评论家方法:我们来玩刺猬索尼克吧!
第 6 部分:刺猬索尼克 2 和 3 的近似策略优化(PPO)
深度强化学习中的好奇心
原文:https://towardsdatascience.com/curiosity-in-deep-reinforcement-learning-understanding-random-network-distillation-747b322e2403?source=collection_archive---------8-----------------------
理解随机网络蒸馏
Learning to play Montezuma’s Revenge, a previously difficult deep RL task, has seen big breakthroughs with Exploration by Random Network Distillation (source: Parker Brothers Blog)
学习玩 Atari 游戏是深度强化学习(RL)算法的一个流行的基准任务。这些游戏在简单性和复杂性之间提供了一个很好的平衡:一些游戏(如 Pong )足够简单,可以用基本算法解决,如香草政策梯度,而其他游戏足够复杂,以至于甚至可以难倒最先进的算法。
在最简单和最复杂的游戏之间是一系列有用的任务,这些任务已经成为许多深度 RL 研究论文的核心。
Taken from the OpenAI Blog.
一个以前“未解决”的雅达利游戏,蒙特祖马的复仇,最近被一种算法解决了(某种程度上),该算法能够在得分方面超过人类的表现。研究人员能够鼓励代理人在第一关探索不同的房间,这是在这个特定的游戏中赢得分数的一个很好的方式。
通过好奇心进行探索
当一个人类玩冒险游戏(比如蒙特祖马的复仇)时,会有一种内在的探索欲望。游戏设计者构建这样的游戏来鼓励这种行为,通常需要游戏玩家为了取得进步而探索。这可以说是让冒险游戏变得有趣的原因(问问任何喜欢过 Skyrim 的人)。)
Adventure games like Montezuma’s Revenge or Skyrim take advantage of the player’s natural desire to explore, making exploration a key component to completing in-game tasks.
一般深度 RL 算法通常通过随机策略执行“探索”:从神经网络提供的动作可能性分布中随机采样动作。这样做的结果,尤其是在早期(当政策还没有时间收敛的时候),是一个明显的随机行动选择。
这在某些情况下行得通。例如,Pong 可以通过随机移动球拍并观察结果来解决。球被偏转的一些幸运时刻可以开始优化。
在像蒙特祖马的复仇这样的游戏中,这种行为让我们一无所获;想象一下,游戏开始时,虚拟人物随机地左右移动,跳跃。他最终会掉进熔岩或者直接撞上敌人而没有获得积分。没有积分或奖励,算法就没有优化的信号。
So, you’re just going to flail around randomly? Good luck with that (source).
好奇心
很多人都强调要找到更好的方法去探索。基于好奇心的探索可以被视为试图模仿人类玩家的好奇心驱动行为。
但我们如何创造一个好奇的代理人呢?
有很多方法可以实现这一点,但有一种方法,它使用下一状态预测,由于其简单性和可扩展性而特别有趣。
基本思路是,在政策模型的基础上,再训练一个独立预测模型。该预测模型将来自当前状态和所选动作的观察作为输入,并产生下一个观察的预测。对于勘探程度较高的轨迹,我们假设这种损失会很小(因为我们通过监督学习不断训练预测模型)。在较少被探索的轨迹中,我们假设这种损失会很大。
那么,我们所能做的就是创建一个新的奖励函数(称为“内在奖励”),它提供与预测模型的损失成比例的奖励。因此,代理人在探索新的轨迹时会收到强有力的回报信号。
“Learning to explore” through curiosity in level 1 leads to faster progress in level 2 using next-state prediction in this Mario emulator task (source).
这项技术在超级马里奥模拟器中取得了令人鼓舞的效果。
拖延代理:电视问题
这种技术并不完美。这里有一个已知的问题:代理被他们环境中的随机或有噪声的元素所吸引。这有时被称为“白噪音”问题或“电视问题”;它也被称为“拖延症”。
为了演示这种效果,设想一个代理人通过观察他所看到的像素来学习在迷宫中导航。
A next-state prediction curious agent learns to successfully navigate a maze (source).
代理最终表现良好;他被驱使去寻找迷宫中未被探索的部分,因为他有能力在被充分探索的区域做出好的预测(或者更确切地说,他没有能力在未被探索的区域做出好的预测。)
现在,在迷宫的墙壁上放一台“电视”,迅速连续地播放随机选取的图片。由于图像的来源是随机的,代理无法准确预测下一个将出现什么图像。预测模型将产生高损失,这给代理人带来高“内在”回报。最终的结果是一个代理谁更喜欢停下来看电视,而不是继续探索迷宫。
The next-state prediction curious agent ends up “procrastinating” when faced with a TV, or source of random noise, in the environment (source).
利用随机网络提炼避免拖延
在探索随机网络蒸馏 (RND)中提出了一个解决电视噪音问题的方法,这是最近由开放 AI 的一些好人发表的一篇论文。
这里的新思想是将类似的技术应用于上述的下一状态预测方法,但是去除了对前一状态的依赖。
Next-State prediction vs. RND overview (source).
RND 不是预测下一个状态,而是从下一个状态进行观察,并试图预测下一个状态。这是一个相当琐碎的预测,对不对?
RND 的随机网络部分的目的是将这个琐碎的预测任务转化为硬预测任务。
使用随机网络
这是一个聪明的解决方案,尽管有违直觉。
这个想法是我们使用一个随机初始化的神经网络来映射观察到一个潜在的观察向量。这个函数的输出本身其实并不重要;重要的是,我们有一些未知的、确定性的函数(随机初始化的神经网络),以某种方式转换观察值。
因此,我们的预测模型的任务不是预测下一个状态,而是预测给定观察状态的未知随机模型的输出。我们可以使用随机网络的输出作为标签来训练这个模型。
当代理处于熟悉状态时,预测模型应该对随机网络的预期输出做出良好预测 。当代理处于不熟悉状态时,预测模型将对随机网络输出做出不良预测。
这样,我们可以定义一个内在的回报函数,它再次与预测模型的损失成比例。
Conceptual overview of the intrinsic reward computation. Only the next-state observation is used.
这可以被解释为“新奇检测”方案,其中当观察结果是新的或预测模型不熟悉时,计算的损失较高。
作者用 MNIST 作为这个想法的概念证明。在这个实验中,他们通过一个随机初始化的神经网络给一个班的 MNIST 角色喂食。然后,他们训练一个并行网络,根据给定的输入预测随机网络的输出。正如预期的那样,随着来自目标类的训练样本的数量增加,他们看到来自目标类的并行网络的损失下降。
MNIST proof-of-concept, from the research paper.
这样,当代理看到一个随机噪声源时,它就不会被卡住。它不再试图预测屏幕上不可预测的下一帧,而是只需要了解这些帧如何被随机网络转换。
探索蒙特祖马的复仇
先前的下一状态预测好奇心机制由于糟糕的解决方案而未能解决蒙特祖马的报复,但 RND 似乎已经克服了这些问题。
受好奇心驱使的代理人探索房间,并学习收集钥匙以打开新房间。
尽管取得了成功,代理只是“偶尔”通过第一关。这是因为需要仔细管理密钥的使用,才能通过最后一道门来完成关卡。LSTM 等内部国家模式将需要克服这一障碍。
因此,虽然 RND 已经让代理人在得分方面超过了人类的平均表现,但在掌握游戏之前还有一段路要走。
这是关于实验性深度强化学习算法系列帖子的一部分。查看该系列之前的一些帖子:
了解演变的政策梯度
深度学习的自定义损失函数:用 Keras 预测住宅价值
原文:https://towardsdatascience.com/custom-loss-functions-for-deep-learning-predicting-home-values-with-keras-for-r-532c9e098d1f?source=collection_archive---------2-----------------------
Source: 4047259 at pixabay.com
我最近开始和 R 一起阅读“深度学习”,我对 R 对深度学习的支持印象深刻。书中介绍的一个用例是预测波士顿的房价,这是一个有趣的问题,因为房价可能会有很大的变化。这是一个机器学习问题,可能最适合经典方法,如 XGBoost,因为数据集是结构化的,而不是感知数据。然而,它也是一个数据集,深度学习提供了一个真正有用的能力,即编写新的损失函数的容易程度,这可能会提高预测模型的性能。这篇文章的目标是展示深度学习如何通过使用自定义损失函数来改善浅层学习问题。
[## 用 R 进行深度学习
使用 R 的深度学习介绍了使用强大的 Keras 库及其 R 语言的深度学习世界…
www.amazon.com](https://www.amazon.com/Deep-Learning-R-Francois-Chollet/dp/161729554X)
我在处理金融数据时遇到过几次的一个问题是,您经常需要构建预测模型,其中的输出值可能有很大的范围,跨越不同的数量级。例如,在预测房价时会发生这种情况,一些房屋的价值为 10 万美元,而其他房屋的价值为 1000 万美元。如果你在这些问题上使用标准的机器学习方法,如线性回归或随机森林,通常模型会过度拟合具有最高值的样本,以减少平均绝对误差等指标。但是,您实际需要的可能是用相似的权重处理样本,并使用相对误差等误差度量来降低用最大值拟合样本的重要性。
**# Standard approach to linear regression** fit <- lm(y ~ x1 + x2 + x3 + ... + x9, data=df)**# Linear regression with a log-log transformation** fit <- nls( log10(y) ~ log(x1*b1 + x2*b2 + ... + x9*b9),
data = df, start = list(b1=1, b2=1, ... , b9 = 1))
您实际上可以在 R 中使用诸如非线性最小二乘法( nls )之类的软件包显式地做到这一点。上面的代码示例显示了如何使用内置优化器构建线性回归模型,该优化器将对具有大标签值的样本进行加权,以及使用 nls 方法,该方法显示了如何对预测值和标签执行对数转换,这将给予样本相对相等的权重。第二种方法的问题是,您必须明确地说明如何使用模型中的特性,这就产生了一个特性工程问题。这种方法的另一个问题是,如果不编写自己的似然函数和优化器,它不能直接应用于其他算法,如随机森林。这是一个针对特定场景的,在该场景中,您希望将误差项排除在对数转换之外,而不是简单地将对数转换应用于标签和所有输入变量。
深度学习为处理这些类型的问题提供了一个优雅的解决方案,其中,您可以探索不同的内置和自定义损失函数,这些函数可以与提供的不同优化器一起使用,而不是编写自定义的可能性函数和优化器。这篇文章将展示如何在使用 Keras 时用 R 编写自定义损失函数,并展示如何使用不同的方法对不同类型的数据集有益。
下图是我将在这篇文章中涉及的内容的预览。它显示了在波士顿房价数据集上训练的四个不同的 Keras 模型的训练历史。每种模型使用不同的损失函数,但是根据相同的性能指标,平均绝对误差进行评估。对于原始数据集,自定义损失函数不会提高模型的性能,但在修改后的数据集上,结果更有希望。
Performance of the 4 loss functions on the original housing prices data set. All models used MAE for the performance metric.
用深度学习改善浅层问题
深度学习的一个很大的特点是,它既可以应用于感性数据的深度问题,如音频和视频,也可以应用于结构化数据的浅层问题。对于浅层学习(c 经典 ML )问题,通过使用提供有用信号的定制损失函数,你经常可以看到对浅层方法的改进,例如 XGBoost 。
然而,并不是所有的浅层问题都能受益于深度学习。我发现,在构建需要为不同数量级的数据创建预测的回归模型时,自定义损失函数非常有用。例如,预测某个地区的房价,该地区的房价可能会大幅波动。为了展示这在实践中是如何工作的,我们将使用 Keras 提供的波士顿住房数据集:
[## 数据集- Keras 文档
来自 IMDB 的 25,000 个电影评论的数据集,由情绪(正面/负面)标记。评论已经过预处理…
keras.io](https://keras.io/datasets/#boston-housing-price-regression-dataset)
这个数据集包括 20 世纪 70 年代波士顿郊区的房价。每条记录有 13 个描述房屋属性的属性,在训练数据集中有 404 条记录,在测试数据集中有 102 条记录。在 R 中,数据集可以如下加载:dataset_boston_housing()
。数据集中的标签代表房屋的价格,以千美元计。价格从 5k 美元到 50k 美元不等,价格分布如左图所示。原始数据集具有相似数量级的值,因此自定义损失函数可能不适用于拟合该数据。右侧的直方图显示了标签的变换,这可能得益于使用自定义损失。
The Boston data set with original prices and the transformed prices.
为了转换数据,我将标签转换回绝对价格,对结果求平方,然后除以一个大因子。这导致最高和最低价格之间的差别是 100 倍,而不是 10 倍。我们现在有一个预测问题,可以受益于自定义损失函数的使用。生成这些图的 R 代码如下所示。
x <- (train_targets*1000)^2/2500000
hist(train_targets, main = "Original Prices")
hist(x, main = "Transformed Prices")
Keras 中的损失函数
Keras 包括许多有用的损失函数,用于训练深度学习模型。像mean_absolute_error()
这样的方法适用于数值数量级大致相等的数据集。还有像mean_squared_logarithmic_error()
这样的函数,它们可能更适合转换后的房屋数据。以下是由 Keras 的 R 接口提供的一些损失函数:
keras::loss_mean_absolute_error()
keras::loss_mean_absolute_percentage_error()
keras::loss_mean_squared_error()
keras::loss_mean_squared_logarithmic_error()
中的功能损失。R 引用 Python 函数,为了真正理解这些函数是如何工作的,我们需要跳入 Python 损失代码。我们将探讨的第一个损失函数是均方误差,定义如下。该函数计算预测值和实际值之间的差值,对结果求平方(使所有值为正),然后计算平均值。注意,该函数使用了对张量对象而不是 Python 原语进行操作的后端操作。当在 R 中定义自定义损失函数时,将使用相同的方法
def mean_squared_error(y_true, y_pred):
return K.mean(K.square(y_pred - y_true), axis=-1)
我们将探讨的下一个内置损失函数基于预测值和目标值的自然对数之间的差异来计算误差。这里定义为,如下图所示。该函数使用 clip 操作来确保负值不会被传递给 log 函数,并且将 1 加到 clip 结果确保所有 log 变换的输入都将具有非负的结果。这个函数类似于我们将在 r 中定义的函数。
def mean_squared_logarithmic_error(y_true, y_pred):
first_log = K.log(K.clip(y_pred, K.epsilon(), None) + 1.)
second_log = K.log(K.clip(y_true, K.epsilon(), None) + 1.)
return K.mean(K.square(first_log - second_log), axis=-1)
我们将探讨的两个自定义损失函数在下面的 R 代码段中定义。第一个函数 mean log absolute error(MLAE)计算预测值和实际值的对数变换之间的差值,然后对结果取平均值。与上面的内置函数不同,这种方法不会平方误差。与上面的对数函数的另一个不同之处是,该函数对数据应用了一个显式的比例因子,将房价转换回其原始值(5,000 到 50,0000)而不是(5,50)。这很有用,因为它减少了将+1 加到预测值和实际值上的影响。
**# Mean Log Absolute Error** MLAE <- function( y_true, y_pred ) {
K <- backend()
K$mean( K$abs( K$log( K$relu(y_true *1000 ) + 1 ) -
K$log( K$relu(y_pred*1000 ) + 1)))
}**# Mean Squared Log Absolute Error** MSLAE <- function( y_true, y_pred ) {
K <- backend()
K$mean( K$pow( K$abs( K$log( K$relu(y_true *1000 ) + 1 ) -
K$log( K$relu(y_pred*1000 ) + 1)), 2))
}
像 Python 函数一样,R 的自定义损失函数需要对张量对象而不是 R 原语进行操作。为了执行这些操作,您需要使用backend()
获得对后端的引用。在我的系统配置中,这将返回对 tensorflow 的引用。
第二个函数计算对数误差的平方,类似于内置函数。主要区别在于我使用的是relu
操作,而不是clip
操作,并且我在缩放值,这是特定于住房数据集的。
评估损失函数
我们现在有四个不同的损失函数,我们希望评估原始和转换后的住房数据集的性能。本节将介绍如何设置 Keras、加载数据、编译模型、拟合模型以及评估性能。本节的完整代码清单可在 github 上获得。
首先,我们需要建立深度学习的环境。这可以通过Keras
包和install_keras
功能完成。
**# Installation**
devtools::install_github("rstudio/keras")
library(keras)
install_keras(method = "conda")
安装完成后,我们将加载数据集并应用我们的转换来扭曲房价。最后两个操作可以注释掉使用原房价。
**# load the data set** library(keras)
data <- dataset_boston_housing()
c(c(train_data,train_targets), c(test_data,test_targets)) %<-% data**# transform the training and test labels** train_targets <- (train_targets*1000)^2/2500000
test_targets <- (test_targets*1000)^2/2500000
接下来,我们将创建一个用于预测房价的 Keras 模型。我已经使用了“用 R 进行深度学习”中的样本问题中的网络结构。该网络包括两层全连接的 relu 激活神经元和一个无变换的输出层。
**# The model as specified in "Deep Learning with R"** model <- keras_model_sequential() %>%
layer_dense(units = 64, activation = "relu",
input_shape = dim(train_data)[[2]]) %>%
layer_dense(units = 64, activation = "relu") %>%
layer_dense(units = 1)
为了编译这个模型,我们需要指定一个优化器、损失函数和一个度量标准。我们将对所有不同的损失函数使用相同的指标和优化器。下面的代码定义了一个损失函数列表,对于第一次迭代,模型使用均方误差。
**# Compile the model, and select one of the loss functions** losses <- c(keras::loss_mean_squared_error,
keras::loss_mean_squared_logarithmic_error, MLAE, MSLAE)model %>% compile(
optimizer = "rmsprop",
loss = losses[1],
metrics = c("mae")
)
最后一步是拟合模型,然后评估性能。我使用了 100 个 epochs,批量大小为 5,20%的验证分割。在训练了训练数据集的模型之后,基于测试数据集上的平均绝对误差来评估模型的性能。
**# Train the model with validation** model %>% fit(
train_data,
train_targets,
epochs = 100,
batch_size = 5,
verbose = 1,
validation_split = 0.2
)**# Calculate the mean absolute error** results <- model %>% evaluate(test_data, test_targets, verbose = 0)
results$mean_absolute_error
我用不同的损失函数训练了四个不同的模型,并将这种方法应用于原始房价和转换后的房价。所有这些不同组合的结果如下所示。
Performance of the Loss Function of the Housing Price Data Sets
在原始数据集上,在损失函数中应用对数变换实际上增加了模型的误差。这并不奇怪,因为数据是正态分布的,并且在一个数量级内。对于转换的数据集,平方对数误差方法优于均方误差损失函数。这表明,如果您的数据集与内置损失函数不兼容,自定义损失函数可能值得探索。
转换数据集上四个不同损失函数的模型训练历史如下所示。每个模型使用相同的误差度量(MAE ),但不同的损失函数。一个令人惊讶的结果是,所有应用对数变换的损失函数的验证误差都要高得多。
Performance of the 4 loss functions on the transformed housing prices data set. All models used MAE for the performance metric.
深度学习对于浅层学习问题来说是一个有用的工具,因为你可以定义定制的损失函数,这可能会大大提高你的模型的性能。这并不适用于所有问题,但如果您有一个不能很好地映射到标准损失函数的预测问题,这可能是有用的。
本·韦伯是意外收获数据的首席数据科学家,我们的任务是建立最准确和全面的净值模型。意外收获团队正在壮大,并正在招聘工程师和数据科学家。
用于梯度提升的定制损失函数
原文:https://towardsdatascience.com/custom-loss-functions-for-gradient-boosting-f79c1b40466d?source=collection_archive---------2-----------------------
优化重要的事情
作者:格罗弗王子Sourav Dey
介绍
梯度升压在工业上应用广泛,赢得过很多 Kaggle 比赛。互联网上已经有许多关于梯度增强的很好的解释(我们甚至在参考资料中分享了一些精选的链接),但我们注意到缺少关于自定义损失函数的信息:为什么、何时和如何。本文试图总结自定义损失函数在许多现实问题中的重要性,以及如何用 LightGBM 梯度增强包实现它们。
训练机器学习算法,使训练数据上的损失函数最小化。有许多常用的损失函数,这些函数在常见的 ML 库中很容易找到。如果你想了解更多,请阅读 Prince 在攻读数据科学硕士学位时写的这篇文章。在现实世界中,这些“现成的”损失函数通常不能很好地适应我们试图解决的业务问题。输入自定义损失函数。
自定义损失函数
一个客户损失函数很方便的例子是机场准时性的不对称风险。问题是决定什么时候离开家,这样你就能在正确的时间到达机场。我们不想走得太早,在门口等几个小时。同时,我们不想错过我们的航班。两边的损失是很不一样的:如果我们早到大门,真的没那么糟糕;如果我们到得太晚,错过了航班,那真是糟透了。如果我们使用机器学习来决定何时离开房子,我们可能希望在我们的模型中直接处理这种风险不对称,方法是使用一个定制的损失函数,该函数对晚期错误的惩罚远远超过早期错误。
另一个常见的例子发生在分类问题上。例如,对于疾病检测,我们可能认为假阴性比假阳性更糟糕,因为给健康人用药通常比不治疗病人的危害小。在这种情况下,我们可能希望优化 F-beta 分数,其中 beta 取决于我们希望给予假阳性的权重大小。这有时被称为尼曼-皮尔逊准则。
在流形,我们最近遇到了一个需要自定义损失函数的问题。我们的一个客户,Cortex Building Intelligence,提供了一个应用程序,帮助工程师更精确地操作建筑物的供暖、通风和空调(HVAC)系统。大多数商业建筑都有“租赁义务”,在工作日的工作时间内,将建筑物的室内温度调节在“舒适”的温度范围内,例如*,*,在上午 9 点到下午 6 点之间,温度在 70 到 74 度之间。同时,暖通空调是一栋建筑最大的运营成本。暖通空调高效运行的关键是在不需要的时候关闭系统,比如晚上,然后在清晨再次打开,以履行“租赁义务”。为此,Manifold 帮助 Cortex 建立了一个预测模型,以推荐建筑中开启 HVAC 系统的准确时间。然而,不正确预测的惩罚是不对称的。如果我们预测的开始时间早于实际要求的开始时间,那么建筑物将过早地达到舒适的温度,并且会浪费一些能量。但是,如果预测的时间晚于实际要求的开始时间,那么建筑物将过晚达到舒适的温度,租户将不会高兴——没有人愿意在冻结/沸腾的建筑物中工作、购物或学习。所以迟到比早到要糟糕得多,因为我们不希望租客(付$$$租金的)不高兴。我们通过创建一个定制的非对称 Huber 损失函数,将这种业务知识编码到我们的模型中,当残差为正对负时,该函数具有更高的误差。关于这个问题的更多细节可以在这个帖子中找到。
Ignore what recovery time error means.
**要点:**找到一个与你的商业目标紧密匹配的损失函数。通常,这些损失函数在流行的机器学习库中没有默认的实现。没关系:定义你自己的损失函数并不难,用它来碾压你的问题。
定制培训损失和验证损失
在继续之前,让我们先明确一下我们的定义。许多术语在 ML 文献中用来指代不同的事物。我们将选择一组我们认为最清楚的定义:
- **训练损失。**这是针对训练数据优化的函数。例如,在神经网络二元分类器中,这通常是二元交叉熵。对于随机森林分类器,这是基尼杂质。训练损失通常也被称为“目标函数”。
- **验证失败。**这是我们用来评估训练模型在未知数据上的表现的函数。这往往不等同于培训损失。例如,在分类器的情况下,这通常是接收器工作特性(ROC)曲线下的区域,尽管这从未被直接优化,因为它是不可微的。这通常被称为“绩效或评估指标”。
在许多情况下,定制这些损失在建立更好的模型中可能是非常有效的。这对于梯度增强来说特别简单,如下所示。
培训损失
训练损失在训练过程中得到优化。对于某些算法来说很难定制,比如随机森林(见这里),但对于其他算法来说相对容易,比如梯度推进和神经网络。因为梯度下降的一些变体通常是优化方法,所以训练损失通常需要是具有凸梯度(一阶导数)和 hessian(二阶导数)的函数。它最好也是连续的、有限的和非零的。最后一点很重要,因为函数为零的部分会冻结梯度下降。
在梯度推进的情况下,训练损失是使用梯度下降优化的函数,例如,梯度推进模型的“梯度”部分。具体来说,训练损失的梯度用于改变每个连续树的目标变量。(如果你对更多细节感兴趣,请看这篇帖子。)注意,即使训练损失定义了“梯度”,每棵树仍然使用不依赖于该定制损失函数的贪婪分割算法来生长。
定义一个自定义的训练损失通常需要我们做一些微积分的工作来寻找梯度和 hessian。正如我们接下来将看到的,通常首先更改验证损失更容易,因为它不需要太多的开销。
验证损失
验证损失用于调整超参数。它通常更容易定制,因为它不像培训损失那样有很多功能需求。验证损失可以是非凸的、不可微的和不连续的。因此,从定制开始通常更容易。
比如在 LightGBM 中,一个重要的超参数就是助推轮数。验证损失可用于找到最佳助推轮数。LightGBM 中的这种验证损失称为eval_metric
。我们可以使用库中可用的验证损失[之一,或者定义我们自己的自定义函数。既然它如此简单,如果它对您的业务问题很重要,您就应该进行定制。
具体来说,我们通常使用 early_stopping_rounds 变量,而不是直接优化 num boosting rounds。对于给定数量的早期停止轮次,当验证损失开始增加时,它停止提升。实际上,它通过监控样本外验证集的验证损失来防止过度拟合。如下图所示,将停止轮次设置得较高会导致模型运行更多的推进轮次。](https://github.com/Microsoft/LightGBM/blob/master/docs/Parameters.rst/#metric-parameters)
Blue: Training loss. Orange: Validation loss. Both training and validation are using the same custom loss function
k-fold cross validation. Each test fold scored with validation loss
请记住,验证策略也非常重要。上面的训练/验证分割是许多可能的验证策略之一。可能不适合你的问题。其他包括 k-fold 交叉验证和嵌套交叉验证,我们在 HVAC 开始时间建模问题中使用了它们。
如果适合业务问题,我们希望为我们的训练和验证损失使用自定义函数。在某些情况下,由于自定义损失的函数形式,可能无法将其用作培训损失。在这种情况下,只更新验证损失并使用像 MSE 这样的默认训练损失可能是有意义的。您仍将受益,因为 hyper 参数将使用所需的自定义损耗进行调整。
在 LightGBM 中实现自定义损失函数
让我们看看这在实践中是什么样子,并在模拟数据上做一些实验。首先,让我们假设高估比低估要糟糕得多。此外,让我们假设平方损失是我们在任一方向上的误差的良好模型。为了对此进行编码,我们定义了一个自定义的 MSE 函数,它对正残差的惩罚是负残差的 10 倍。下图显示了我们的自定义损失函数与标准 MSE 损失函数的对比。
根据定义,不对称 MSE 很好,因为它很容易计算梯度和 hessian,如下图所示。注意,hessian 在两个不同的值上是恒定的,左边是 2,右边是 20,尽管在下面的图上很难看到。
LightGBM 提供了一种实现定制训练和验证损失的简单方法。其他梯度增强包,包括 XGBoost 和 Catboost,也提供此选项。 这里的 是一个 Jupyter 笔记本,展示了如何实现一个定制的训练和验证损失函数。详细信息记录在笔记本中,但在较高层次上,实现略有不同:
- **训练损失:**在 LightGBM 中定制训练损失需要定义一个函数,该函数接受两个数组,目标和它们的预测。反过来,该函数应该返回每个观测值的梯度和 hessian 的两个数组。如上所述,我们需要使用微积分来导出 gradient 和 hessian,然后用 Python 实现。
- **验证损失:**在 LightGBM 中定制验证损失需要定义一个函数,该函数接受相同的两个数组,但返回三个值:一个带有要打印的度量名称的字符串、损失本身以及一个关于值越高越好的布尔值。
在 LightGBM 中实现自定义丢失的代码
Defining custom validation and training loss functions
Incorporating training and validation loss in LightGBM (both Python and scikit-learn API examples)
自定义损失函数的实验
Jupyter notebook 还对默认随机森林、默认 LightGBM 与 MSE 以及 LightGBM 与定制训练和验证损失函数进行了深入的比较。我们使用 Friedman 1 合成数据集,其中包含 8000 个训练观测值、2000 个验证观测值和 5000 个测试观测值。验证集用于找到优化验证损失的最佳超参数集。下面报告的分数是根据测试观察值评估的,以评估我们的模型的可推广性。我们做了一系列实验,总结如下表所示。 注意,我们关心的最重要的分数是不对称 MSE,因为它具体定义了我们的不对称惩罚问题。
Our experiments and results
让我们来看一些详细的比较。
随机森林→ LightGBM 使用默认设置,LightGBM 在该数据集上的表现优于随机森林。随着更多的树和更好的超参数组合,随机森林也可能给出好的结果,但这不是这里的重点。
LightGBM →带定制训练损失的 LightGBM with】这说明我们可以让我们的模型优化我们所关心的东西。默认的 LightGBM 正在优化 MSE,因此它给出了更低的 MSE 损失(0.24 对 0.33)。具有自定义训练损失的 LightGBM 正在优化不对称 MSE,因此它对不对称 MSE 的性能更好(1.31 对 0.81)。
LightGBM →使用 MSE 调整早期停止回合的 LightGBM with】两种 LightGBM 模型都在优化 MSE。我们看到默认 MSE 分数有了很大的改进,只是使用了早期停止回合的小调整(MSE: 0.24 vs 0.14)。因此,我们应该让模型使用早期停止超参数来决定最佳增压轮数,而不是将增压轮数限制为默认值(即,100)。超参数优化至关重要!
使用 MSE 调整早期停止回合数的 light GBM→使用自定义 MSE 调整早期停止回合数的 light GBM 这两个模型的得分非常接近,没有实质性差异。这是因为验证损失仅用于决定何时停止升压。在这两种情况下,梯度都在优化默认 MSE。每个后续的树为两个模型产生相同的输出。唯一的区别是,具有自定义验证损失的模型在 742 次提升迭代时停止,而另一个模型运行更多次。
使用定制 MSE 调整提前停止的 LightGBM→针对定制损失训练的 light GBM 和使用 MSE 调整提前停止的 light GBM 仅定制训练损失而不改变验证损失会损害模型性能。只有定制训练损失的模型比其他情况增加了更多回合(1848)。如果我们仔细观察,这个模型具有非常低的训练损失(0.013),并且在训练集上高度过拟合。每次梯度提升迭代使用训练误差作为目标变量来生成新的树,但是提升仅在验证数据的损失开始增加时停止。当模型开始过度拟合时,验证损失通常开始增加,这是停止构建更多树的信号。在这种情况下,由于验证和训练损失彼此不一致,模型似乎没有“得到消息”,这导致过度拟合。这种配置只是出于完整性考虑,在实践中不应该使用。
具有带 MSE 的调整的早期停止回合的 LightGBM→根据定制训练损失训练的 light GBM 和具有定制验证损失的调整的早期停止回合最终模型使用定制训练和验证损失。它以相对较少的提升迭代次数给出了最佳的不对称 MSE 分数。损失与我们所关心的一致!
让我们更仔细地看看残差直方图,了解更多细节。
Histogram of residuals on predictions from different models.
请注意,与随机森林模型相比,使用 LightGBM(即使使用默认的超参数)可以提高预测性能。具有自定义验证损失的最终模型似乎在直方图右侧做出更多预测,即实际值大于预测值。由于不对称的定制损失函数,这是预料之中的。使用残差的核密度图可以更好地可视化残差的这种右侧偏移。
Comparison of predictions from LightGBM models with symmetric and asymmetric evaluation
结论
所有的模型都有误差,但是许多商业问题并没有平等地对待低估和高估。有时,我们有意希望我们的模型将我们的误差偏向某个方向,这取决于哪个误差代价更大。因此,我们不应该用普通 ML 库中“现成的”对称损失函数来限制自己。
LightGBM 提供了一个简单的接口来整合定制的训练和验证损失函数。在适当的时候,我们应该利用这个功能来做出更好的预测。同时,你不应该立即使用自定义损失函数。最好采用精益迭代方法,首先从简单的基线模型开始,比如随机森林。在下一次迭代中,您可以移动更复杂的模型,如 LightGBM,并进行超参数优化。只有当这些基线稳定后,才有意义去定制验证和训练损失。
希望有用!快乐定制!
更多推荐阅读
如果你不清楚一般的渐变提升是如何工作的,我推荐阅读特伦斯·帕尔的如何解释渐变提升,以及普林斯的从零开始的渐变提升。关于如何在不同的 GBM 框架中调优超参数,有大量的文章。如果您想使用这些软件包中的一个,您可以花一些时间来了解要搜索哪个范围的超参数。这一期的 LightGBM GitHub 给出了一个大概的取值范围。 Aarshay Jain 写了一篇很好的博客关于调优 XGBoost 和 sklearn 渐变提升。我认为可以写一篇关于调优 LightGBM 的博文。
要获得哪个渐变增强包适合您的情况的一些直觉,请阅读 Alvira Swalin 的CatBoost vs . Light GBM vs. XGBoost,以及 Pranjan Khandelwal 的哪个算法摘得桂冠:Light GBM vs . XGBoost?。
关于流形
Manifold 是一家全方位服务的人工智能咨询公司,提供全面的人工智能工程服务,包括机器学习、数据科学、数据工程、devops、云和 edge。我们拥有设计、构建、部署和管理复杂数据应用程序的成熟能力。Manifold 深受全球 500 强和高增长公司的首席技术官、首席信息官和总经理的信任。我们的工作横跨消费电子、工业、无线、在线商务、数字健康等行业。Manifold 经验丰富的工程师在谷歌、高通、麻省理工学院和成功的风险投资创业公司等机构拥有创新记录。我们的顾问委员会包括斯坦福大学和哈佛大学深度学习领域的领先研究人员,我们有一个广泛的专家网络,我们可以利用工业和工程子专业。
想研究这样的东西吗?向 sdey@manifold.com 伸出援手!我们正在雇佣数据科学家。
TensorFlow 中的自定义优化器
原文:https://towardsdatascience.com/custom-optimizer-in-tensorflow-d5b41f75644a?source=collection_archive---------5-----------------------
介绍
当对非结构化数据建模时,例如在语言或图像处理中,神经网络起着非常重要的作用。这种网络的想法是使用节点和边来模拟大脑的结构,这些节点和边具有由激活函数处理的数字权重。这种网络的输出主要产生预测,例如分类。这是通过使用一些优化损失函数对给定目标进行优化来实现的。
在之前的一篇文章中,我们已经讨论了定制这个损失函数的重要性,对于梯度推进树的情况。在本帖中,我们将讨论如何定制优化器来加速和改进寻找损失函数(局部)最小值的过程。
优化者
虽然神经网络的架构在从数据中提取信息时起着重要作用,但所有(大多数)都是通过基于损失函数梯度的更新规则来优化的。
更新规则由优化器决定。不同优化器的性能和更新速度可能会有很大差异。梯度告诉我们更新的方向,但是我们可能采取多大的一步还不清楚。小步让我们保持在正确的轨道上,但是可能要花很长时间才能达到(局部)最小值。大步加快了这个过程,但它可能会把我们推离正确的方向。
亚当【2】和rms prop【3】是两个非常流行的优化器,仍然在大多数神经网络中使用。两者都使用梯度及其平方的指数衰减平均值来更新变量。
通过生成固定的数值更新或代数规则,已经进行了寻找新的优化器的研究。
使用控制器递归神经网络,一个团队[1]发现了两种新的有趣的优化器,PowerSign 和 AddSign,它们都是高性能的,并且比当前流行的优化器(如 Adam)需要更少的资源。
在 TensorFlow 中实现优化器
Tensorflow 是一个流行的用于实现神经网络的 python 框架。虽然文档非常丰富,但要找到阅读它的方法通常是一个挑战。
在这篇博文中,我将解释如何实现 PowerSign 和 AddSign。
优化器包括两个重要步骤:
- compute_gradients() 更新计算图形中的梯度
- apply_gradients() 更新变量
在运行 Tensorflow 会话之前,应该启动一个优化器,如下所示:
tf.train.GradientDescentOptimizer
是类GradientDescentOptimizer
的对象,顾名思义,它实现了梯度下降算法。
方法 minimize() 以“成本”作为参数被调用,由两个方法 compute_gradients() 和 apply_gradients() 组成。
对于这篇文章,以及 AddSign 和 PowerSign 的实现,我们必须仔细看看这最后一步 apply_gradients() 。
该方法依赖于我们将要创建的(new) Optimizer
(类)来实现以下方法: _create_slots() , _prepare() , _apply_dense() , _apply_sparse() 。
_create_slots() 和 _prepare() 创建并初始化附加变量,如动量。
_apply_dense() 和 _apply_sparse() 实现实际的 Ops,更新变量。Ops 一般都是用 C写的。您无需自己更改 C头文件,仍然可以通过这些方法返回一些操作的 python 包装器。
这是按如下方式完成的:
现在让我们把所有东西放在一起,展示 PowerSign 和 AddSign 的实现。
首先,您需要以下模块来添加 Ops,
现在让我们实现 AddSign 和 PowerSign。这两个优化器实际上非常相似,都利用了动量的符号
m
和g
进行渐变更新。
The momentum and gradient, respectively.
PowerSign
对于 PowerSign,变量的更新工作如下:
以下代码中的衰减率f_n
被设置为 1。我不会在这里讨论这个问题,我可以参考文献[1]了解更多细节。
添加标志
AddSign 与 PowerSign 非常相似,如下所示:
优化器的性能测试
Rosenbrock 函数是一个著名的优化算法性能测试。该函数是非凸的,定义如下:
生成的形状绘制在下图中。正如我们所见,它在 x = 1 和 y = 1 时有一个最小值。
Rosenbrock function
以下脚本通过给定优化器在每个时期生成真实最小值与近似最小值的欧几里德距离。
下面绘制了运行 4000 个时期的每个优化器的性能比较。
虽然性能因超参数的选择而有很大差异,但需要注意 PowerSign 的极快收敛。下面,已经绘制了几个时期的近似值的坐标。
最终讨论
Tensorflow 允许我们创建自己的定制程序。最近的研究进展产生了两个新的有前途的优化器,即 PowerSign 和 AddSign。PowerSign 的快速早期收敛使其成为一个有趣的优化器,可以与 Adam 等其他优化器结合使用。
参考:
- 有关 PowerSign 和 AddSign 的更多信息,请参见 arxiv 论文“具有强化学习的神经优化器搜索”,Bello 等人。艾尔。,https://arxiv.org/abs/1709.07417.
- 金马博士和巴律师事务所(2015 年)。亚当:一种随机优化方法。学习表征国际会议,1-13。
- 未发表过的
- 通过这篇 StackOverflow 帖子,我发现了很多有用的信息,并试图将其捆绑到这篇帖子中。
自定义 Vim 函数来格式化你的文本
原文:https://towardsdatascience.com/custom-vim-functions-to-format-your-text-b694295f7764?source=collection_archive---------4-----------------------
Vim 是一个了不起的文本编辑器,多年来,它让我在编写代码或编辑文本时效率大大提高。虽然最初的学习曲线有点陡峭,但花时间学习不用鼠标导航和编辑文件是非常值得的。但是使 Vim 更加强大的是它是可破解的——如果您发现自己为某些任务反复执行一系列按键,您可以创建自己的函数,在整个 Vim 中使用。
有时我会收到客户的 Excel 电子表格,他们希望我查看与他们在 Excel 列中提供给我的一系列数字相关的数据。如果我将这些数字粘贴到 Vim 中,我将得到如下所示的内容:
300418944
300404780
300482301
300354016
300295311
300417275
300409184
300480616
300478444
300491475
300478160
300482299
300482959
300154869
如果我要在 SQL 查询的WHERE
子句中使用这个数字列表作为 SQL 列表,我需要用引号将所有数字括起来,并在每个数字的末尾加上一个逗号。最后,我需要将所有的行折叠成一行,并用括号将那一行括起来。本质上,我需要获取这些数字并创建一个元组。所以我想要这样的东西:
(‘300418944’, ‘300404780’, ‘300482301’, ‘300354016’, ‘300295311’, ‘300417275’, ‘300409184’, ‘300480616’, ‘300478444’, ‘300491475’, ‘300478160’, ‘300482299’, ‘300482959’, ‘300154869’)
手动操作会花费相当多的时间,尤其是在给定一个包含数百个数字的列表的情况下。这就是 Vim 的亮点——我们可以在我们的vimrc
文件中创建一个函数来为我们处理这些步骤。
“ convert rows of numbers or text (as if pasted from excel column) to a tuplefunction! ToTupleFunction() range
silent execute a:firstline . “,” . a:lastline . “s/^/’/”
silent execute a:firstline . “,” . a:lastline . “s/$/’,/”
silent execute a:firstline . “,” . a:lastline . “join”
silent execute “normal I(“
silent execute “normal $xa)”
silent execute “normal ggVGYY”
endfunctioncommand! -range ToTuple <line1>,<line2> call ToTupleFunction()
这个函数不仅会格式化你的文本,还会将结果复制到你的剪贴板,这样你就可以将它粘贴到你使用的任何 SQL 查询编辑器中。
让我们分解函数体的每一行。
silent execute a:firstline . “,” . a:lastline . “s/^/’/”
对于所有可视选择的行,上面的行跳转到每一行的开头,并插入一个单引号。
silent execute a:firstline . “,” . a:lastline . “s/$/’,/”
这一行位于每一行的末尾,并插入一个单引号和逗号。
下一行代码将所有的文本行合并成一行:
silent execute a:firstline . “,” . a:lastline . “join”
现在我们在行首添加一个左括号:
silent execute “normal I(“
然后插入结束的那个:
silent execute “normal $xa)”
该函数的最后一行选择整个文本,并将其复制到剪贴板(我有一个自定义的映射,用于复制到剪贴板:vnoremap YY "*y
)。
最后,下面是实际运行的函数:
如果您希望有一个类似的函数来创建一个数组,那么您只需要对ToTupleFunction
做一点小小的修改,并给这个函数起一个新名字。
“ convert rows of numbers or text (as if pasted from excel column) to an arrayfunction! ToArrayFunction() range
silent execute a:firstline . “,” . a:lastline . “s/^/’/”
silent execute a:firstline . “,” . a:lastline . “s/$/’,/”
silent execute a:firstline . “,” . a:lastline . “join”
" these two lines below are different by only one character!
silent execute “normal I[“
silent execute “normal $xa]”command! -range ToArray <line1>,<line2> call ToArrayFunction()
就是这样!希望这是有帮助的,如果你们有任何很酷的 Vim 函数,你们经常用来写代码或者只是写一般的东西,请在评论中告诉我!
[## 想在数据科学方面变得更好吗?
当我在我发布独家帖子的媒体和个人网站上发布新内容时,请单击此处获得通知。](https://bobbywlindsey.ck.page/5dca5d4310)
原载于 2017 年 7 月 30 日【bobbywlindsey.com】。
顾客评论:借助网络搜集、数据分析和基本的自然语言处理,找出你的优势和劣势
原文:https://towardsdatascience.com/customer-reviews-identify-your-strengths-and-weaknesses-with-the-help-of-web-scraping-data-b87a3636ef55?source=collection_archive---------9-----------------------
Photo: https://pixabay.com/en/stars-rating-travel-four-hotel-1128772/
客户反馈是描述用户对公司及其服务体验的重要信息来源。就像在产品开发中一样,有效利用反馈可以帮助识别和优先考虑公司进一步发展的机会。
多亏了互联网,今天我们可以接触到无数的资源,在那里人们愿意与不同的公司和服务分享他们的经验。为什么不利用这个机会提取一些有价值的信息,并获得一些可操作的见解,以提供最佳的客户体验?
我在 Flixbus 担任数据科学孵化团队的产品负责人,flix bus 是一家主要的欧洲电动汽车公司,在欧洲各地提供城际巴士服务。Flixbus network 每天为 28 个国家的 1,700 多个目的地提供 120,000 多次连接,最近还将其业务扩展到了美国市场。
Source: https://www.flixbus.com/bus-routes
虽然该公司已经建立了收集客户反馈的流程,但我还是决定看看除此之外万维网还能提供什么。这就是我如何遇到 Trustpilot.com 的,在这个平台上,用户可以与世界上几乎任何一家公司分享他们的经验。令我惊讶的是,我发现在过去的几年里有超过 2000 条关于 Flixbus.com 的顾客评论。这个数字每天都在增长。
Source: https://www.trustpilot.com/
每条评论都包含:1-5 分等级的评分,表示客户对服务的总体满意度、评论发布的日期、有用的评论者信息(如国家位置)以及带标题的自由格式文本评论本身。虽然评级表明总体客户情绪,但包含描述客户体验主要痛点的极有价值信息的是评论。
通过收集所有这些评论,我们可以收集大量的定量和定性数据,对其进行分析,并确定需要改进的地方。幸运的是,python 提供了库来轻松处理这些任务。
删除评论
对于网络抓取,我决定使用 BeautifulSoup 库,它可以完成这项工作,而且使用起来非常简单。如果你以前没有抓取网页的经验,但是你想自己尝试,我强烈推荐你阅读这篇伟大的文章:“用 Python 和 BeautifulSoup 抓取网页”。
Source: https://www.trustpilot.com/review/flixbus.com
好的……所以在研究了 Trustpilot 网站的结构后,我列出了可能需要收集的数据点:
- 审查人姓名
- 审核标题
- 审查机构
- 日期
- 审查者的国家/地区
虽然这可能看起来是一个有限的数据列表,但它足以进行深入的数据分析,这将在后面进行。
作为第一步,我想分享一个自定义功能,从一个特定的 Trustpilot.com 公司的评论页面抓取所有评论:
你可以简单的复制粘贴,用这个功能给同一个点评平台上的任何其他公司刮点评。你所需要做的就是指定一个链接(链接到一个页码,其中页码将被变量 p 替换),循环浏览的评论页数,并且你可以改变睡眠时间(包括以防万一,以避免节流)。
df = scrape_reviews(PATH = '[https://www.trustpilot.com/review/flixbus.com?languages=all&page='](https://www.trustpilot.com/review/flixbus.com?languages=all&page='),
n_pages = 80)
运行刮擦功能会为我们提供以下数据框架:
结果,我们有来自 100 个不同国家的 2080 条评论!是不是很牛逼?:)
数据分析
有了这些信息,我们可以从定量分析开始。为了便于理解,我们来看看 Flixbus.com 的评分分布:
嗯,看起来我们有两个极端,非常高兴的顾客和不幸遇到我们服务问题的顾客。不过看到正面评价超过负面评价还是很棒的。
此外,我们可以看到平均月评分是如何随着时间的推移而发展的:
尽管在 2015 年底有一个良好的开端,但平均评级在接下来的两年中不断下降,在 2017 年 9 月达到历史最低点,约为 2.8。从那时起,评级趋势为横向通道,目前的平均评级为 3.2。
就每月的评论数量而言,我们看到了明显的季节性增长趋势。我们观察到每年 8 月和 9 月左右的本地高峰,这很可能与公共汽车旅行的旺季有关。
考虑到我们还收集了每个评论者的国家位置,我们可以将这些信息可视化,以查看大多数评论来自哪里。
(countries with more than 10 reviews displayed in the graph above)
由于 Flixbus 是一家总部设在德国的公司,所以毫不奇怪德国名列榜首,其次是英国、意大利、丹麦和法国。
接下来,让我们关注占所有数据 70%的评论数量排名前 10 位的国家。
按年份划分评论,我们看到大多数评论都是在 2017 年产生的,其中最大一部分来自德国。2018 年,类似的帖子数量持续增长,然而,现在英国在发布评论的数量上处于领先地位。
为了更好地了解每个国家的总体情绪,让我们来看看评级的份额:
如上图所示,意大利、美国和捷克共和国获得五星好评的比例最高,其次是德国、法国和比利时。相反,丹麦以 1 星评级的最大份额脱颖而出。
现在,为了理解评论的内容,我们将应用一些基本的 NLP。
自然语言处理
以前,我们认为丹麦是负面评价最多的国家之一。因此,在把所有国家放在一起看之前,让我们先试着了解一下丹麦的具体情况。
作为第一步,我们必须使用 python 的 googletrans 库将评论从丹麦语翻译成英语。在这项工作中,我只关注了 1 星评论,总共有 93 条评论,以确定来自该国的客户提到的主要痛点。
一旦翻译完成,在 nltk 库的帮助下,我们可以对文本进行标记,删除停用词并对它们进行词条化,以避免不必要的不一致。最后一步,我们统计单词,并使用 nltk 的频率分布图绘制出 30 个最常提到的单词。
正如你所看到的,我们有很多词并没有真正指出具体的问题。很自然,我们经常看到客户提到“巴士”和公司名称。然而,我们也能发现一些经常使用的词,如票、时间、服务、司机、钱等等。这可能在一定程度上说明了问题,但仍不清楚这些问题。
为了获得更多的上下文,我们可以继续使用二元模型,它提供了以下结果:
使用 bi-grams,我们可以获得更清晰的上下文,并可以轻松识别一般问题,包括:客户服务、退款(或退款)、延误、公交车站、公交车司机的问题以及公交车上的空调。因此,只需几秒钟,我们就可以总结客户在 93 条评论中提到的主要问题!
现在,让我们对所有 10 个国家和 1 星评级的评论使用相同的方法。
您会注意到,结果与我们在前面的图表中看到的没有很大的不同,但是,二元模型的排名略有变化。一个具有领域知识的人会立即识别许多客户体验方面,包括:
- 客户服务
- 公交车司机
- 退款
- 延误(迟到和/或离开)
有了这个结果,我们现在已经确定了 4 个需要进一步深入研究的主要领域,以发现改善客户体验和我们服务满意度的机会。
另一方面,我们可以对 5 星评价进行同样的分析,以了解客户最喜欢我们服务的什么。
看上面的图表,很高兴看到许多评论者特别指出:
- 我们公共汽车的清洁和舒适
- 我发现用我们的平台订票很容易
- 欣赏物有所值
- 愿意向他人推荐我们的服务
结论
上面描述的方法非常简单,远没有发挥出它的全部潜力。然而,如果有数以千计的各种语言的评论,它可以在几分钟内提供一些有价值的见解,帮助理解客户问题并得出主要的棘手问题。
希望这对你有用,你可以将这里分享的一些知识应用到你自己的工作中!
Arvato 金融解决方案的客户细分报告
原文:https://towardsdatascience.com/customer-segmentation-report-for-arvato-financial-solutions-b08a01ac7bc0?source=collection_archive---------10-----------------------
【Udacity 数据科学家纳米学位的顶点项目
简介
在这个项目中,监督和非监督学习技术用于分析德国一家邮购销售公司的客户的人口统计数据,与普通人群的人口统计信息进行对比。这个项目的目标是描述客户群体的特征,并建立一个能够为 Arvato 金融解决方案预测客户的模型。
这个项目的数据由贝塔斯曼 Arvato Analytics 的 Udacity partners 提供,代表了一项现实生活中的数据科学任务。它包括一般人群数据集、客户细分数据集、带有回复的邮寄活动数据集以及需要进行预测的测试数据集。
问题陈述
该项目有四个主要部分:
- 数据预处理
在这一部分,我们需要对数据进行预处理,以便进一步分析。
将按列和行分析缺失值,数据将按类型划分,然后进行后续转换。
2.客户细分
在这一部分,我们需要分析一般人群和客户细分数据集,并使用无监督学习技术进行客户细分,确定最能描述公司核心客户群的人群部分。
我将使用主成分分析(PCA)技术进行降维。然后,使用肘形曲线来确定 KMeans 算法的最佳聚类数。最后,我将应用 KMeans 对人口和客户进行细分,并确定公司目标群的描述。
3.监督学习模型
在这一部分中,我们需要使用营销活动的响应来建立机器学习模型,并使用模型来预测哪些个人最有可能转变为公司的客户。
我将使用几个机器学习分类器,并使用学习曲线分析选择最好的。然后,我将参数化模型并进行预测。
4.卡格尔竞赛
这部分的结果需要提交给 Kaggle 比赛
指标
预测概率的受试者操作特征曲线( ROC_AUC )下的面积将用于评估模型的性能。ROC 曲线是通过在各种阈值设置下绘制真阳性率(TPR)对假阳性率(FPR)来创建的。AUC 提供了对所有可能的分类阈值的综合绩效衡量。解释 AUC 的一种方式是模型对随机目标人的排序高于随机非目标人的概率。因此,ROC 分析提供了为客户预测任务选择可能的最佳模型的工具。
结果与讨论
数据预处理
与本项目相关的有两个数据描述 Excel 电子表格和四个数据文件:
- 德国普通人口的人口统计数据。它有 891211 个人(行)和 366 个特征(列)。
Descriptive statistics for the first few attributes of AZDIAS data set
CUSTOMERS
:邮购公司客户的人口统计数据。它有 191652 行和 369 个特征。
Descriptive statistics for the first few attributes of CUSTOMERS data set
MAILOUT_TRAIN
:作为营销活动目标的个人的人口统计数据;42982 人和 367 个特征,包括人的响应。MAILOUT_TEST
:作为营销活动目标的个人的人口统计数据;42833 人和 366 个特征。
不幸的是,这些数据集中有许多缺失值,并且并非所有列出的特性都在给定的 Excel 电子表格中有解释。
分析缺失值的列和行
首先,我创建了 python 缺失值代码字典,其中“键”中的键是:值对是属性,值是从 DIAS attributes-Values 2017 . xlsx 解析的缺失代码列表。
有趣的是,字典中的 366 个条目中只有 275 个,这意味着有许多特性没有在给定的属性描述文件中列出,并且一些缺少值的属性根本没有输入并在数据集中作为 numpy 而不是数字(np.nan)列出。
First three items from missing keys dictionary
接下来,与 AZDIAS 数据集的缺失值代码相对应的值被转换为 np.nan 值,并对每个属性分析缺失值的最终数量。
分析表明,大多数列的缺失数据不到 30%,而有 41 个属性的缺失数据超过 30%(参见下面这些列中缺失值的分布)。这 41 个属性已从分析中删除。
Attributes with more than 30% of missing values dropped from analysis
此外,基于以下原因删除了其他列:
- 具有唯一值的列,LNR
- 具有超过 10 个类别的分类列,以避免一次性编码后的许多附加属性(CAMEO_INTL_2015 除外)
- 具有来自另一特征的重复信息的列(例如 fein vs grob)
- 一些属性,没有给出描述,并且很难预测列的含义和类型(分类对顺序对混合)。
按行对缺失值的集合表明,删除列后,每行中缺失数据的最大数量是 303 个属性中的 233 个属性。每行中缺失数据量的分布表明,大多数行的缺失属性少于 25 个。因此,数据被分成两个子集:azdias,带有<=25 missing attributes (737235 rows) and azdias with > 25 个缺失属性(153986 行)。对 6 个随机选择的列的值分布的比较表明,在两个数据集中有相似的分布(见下面的 6 个不同属性的条形图,这些属性具有很少的 nan 和许多 nan 数据集)。
Comparison of distribution of values between dataset with few missing values (blue) vs dataset with many missing values (orange)
分配属性类型
Part of the manually created table with attributes types and actions.
为了进行数据工程和转换步骤,所有的属性应该被分配到以下类型:分类的、数字的、顺序的、二进制的、混合的。对于这一步,我已经手动创建了 attribute_types.csv 文件,其中包含属性名称、类型、操作(保留、删除、单热或工程)和删除原因列。
由于不是所有的列都提供了描述,我必须通过名称找到相似的列,并猜测它的类型,这样的列在类型前面用问号列出(例如?分类)。与任何列出的属性都不相似的缺失描述属性的类型也被视为分类属性。
OST_WEST_KZ 特征对于 OST 编码为 0,对于 WEST 运动模式编码为 1。时间功能 EIGEFUEGT_AM 已转换为年份格式。四个混合功能重新设计如下:
- PRAEGENDE _ jugendjhre-->运动(1:主流,2:前卫)和世代十年(4:40,5:50,6:60,7:70,8:80,9:90)
- CAMEO_INTL_2015 —>财富(1:富裕家庭,2:富裕家庭,3:舒适家庭,4:不太富裕家庭,5:较贫困家庭)和寿命(1:未成家夫妇和单身,2:有孩子的年轻夫妇,3:有学龄儿童的家庭,4:老年家庭和成熟夫妇,5:退休老人)
- WOHNLAGE—> RURAL _ neighborhood(0:非农村,1:农村)
- plz 8 _ BAUMAX—> plz 8 _ BAUMAX _ FAMILY(0:0 家庭,1:主要是 1-2 家庭住宅,2:主要是 3-5 家庭住宅,3:主要是 6-10 家庭住宅,4:主要是 10+家庭住宅和 PLZ8_BAUMAX_BUSINESS (0:不是商业,1:商业)
标准化和应对困难
在我们对数据应用降维技术之前,我们需要执行特征缩放,以便主成分向量不受特征在尺度上的自然差异的影响。对于这一步,所有缺失的 np.nan 数据都需要丢弃或估算。对付南人有几种策略。用 nan 删除数据点的简单选择会导致大量信息的丢失(约 30%)。一个更好的策略是用平均值或最频繁值对缺失值进行插补。在大多数情况下,估算值不会完全正确,但会系统地高于或低于实际值。但是,通常它会比完全删除数据点或列给出更准确的结果。
因此,我选择的策略是用最频繁的值来估算二进制数据,用列中的中值来估算数值数据。分类缺失值在转换为虚拟列后将被赋值为零。然后使用标准化程序来缩放特征。标准化程序的优点是,它不会将值限制在特定的范围内,并且受异常值的影响要小得多。
数据转换管道
Distribution of skewed data for ANZ_HAUSHALTE_AKTIV attribute (skew=8.3)
首先,我使用倾斜阈值为 1.0 的熊猫倾斜方法识别倾斜的数值连续属性。这些属性被指定为 log_attributes ,并通过以下步骤为这些属性创建管道:自然对数转换、中值插补和标准缩放。二进制属性( bin_attributes )仅通过最常用值进行插补。dummiestratransformation类是为分类属性的转换而创建的( cat_attributes )。在这种转换中,没有删除多余的虚拟列,以保留关于由零编码的丢失值的隐藏信息。所有其他数值和顺序属性( num_attributes )转换被合并到管道中,通过中值插补和使用标准缩放器缩放。最后,创建了 ColumnTransformer 对象,它将几个特征转换管道合并成一个转换器。这个对象进一步用于所有部分的数据转换。
Column transformation scheme for pipeline column transformer
transformers = [('log ',log_pipeline,log_attributes),
('binary ',binary_pipeline,bin_attributes),
('cat ',cat_pipeline,cat_attributes),
('num ',num_pipeline,num_attributes)]CT = sk learn . compose . column transformer(transformers = transformers)
关于异常值的快速说明
我使用了 Tukey 规则来检测四分位数范围(IQR)之外的异常值:IQR = Q3 — Q1。然而,仅移除经历了对数变换的六个属性的异常值会导致大约 30%的数据丢失。所以,我决定保留那些点。
数据预处理汇总
总之,所有数据集都经历清洗过程( clean_data 函数),该过程:(1)删除列和行,(2)重新设计 4 个混合类型特征,以及(3)通过由流水线特征联合组成的列变换器进行变换。值得注意的是,流水线的使用极大地方便了转换和建立机器学习模型。它可以防止可能导致算法过度拟合的数据泄漏,改进代码组织,并降低在训练集和测试集中混淆列的风险。
总体而言,在提取转换加载(ETL)管道步骤之后,AZDIAS 数据被转换为 737235 行 x 410 列,客户数据被转换为 134245 行 x 410 列数据集。
客户细分
PCA
主成分分析对数据进行降维处理。我绘制了累积解释方差与多个主成分的关系(用线表示)以及解释方差柱状图(见下文)。大约 175 个成分后,解释的变化明显减少。这一数量的转换特征导致 92%的解释方差。因此,项目的聚类部分保留了 175 个变换后的特征。
The plot of fraction of explained variance in the data represented by each principal component vs number of principal components.
第一、第二和第三主成分分别具有 8.0%、6.0%和 5.0%的方差,并且与接下来的三个潜在特征相关:
- 最突出的特征是 CAMEO_DEUG_2015,HH_EINKOMMEN_SCORE,财富和最突出的负面特征是 MOBI_REGIO,KBA13_ANTG1,KBA05_ANTG1。因此,第一个主成分与规模、财富和家庭类型有关。家庭越大,收入和财富所对应的成分越高。负值:该部分与和其他家庭共用单元的概率较高和流动性较低成反比。
- 最突出的特征是 KBA13_HERST_BMW_BENZ,KBA13 _ SEG _ OBEREMITTELKLASSE,KBA13_MERCEDES,KBA13_BMW 最突出的负面特征是 KBA13_SITZE_5。这种成分与拥有昂贵的汽车有关。
- 最突出的特点是世代 _ 十年,CJT_TYP_1,CJT_TYP_2,金融 _SPARER。最突出的负面特征是孔比亚尔特和 CJT_TYP_5。这一部分与年龄、客户和金融类型有关。较高的成分与年龄较大的人和存钱的人的概率较高有关。
K-均值聚类
Average sum of squared errors (SSE) vs number of clusters
肘方法被用于在 PCA 转换的数据上识别用于k-均值聚类的理想聚类数。将组内距离的误差平方和(SSE)的平均值对从 1 到 30 的组数作图。在此图中,聚类是使用 MiniBatchKmeans 方法创建的,批处理大小=40000。
该图表明,分数在前 16 个聚类中快速下降,然后在 17 个聚类中上升,然后在更大数量的聚类中继续下降,但是斜率更低。因此,选择 16 个类作为 k-means 聚类的理想数目。
无监督机器学习流水线
无监督学习管道由以下步骤组成:数据转换、PCA 和 KMeans(见下文)。
cluster _ Pipeline = Pipeline([
(' transform ',ct),
('pca ',PCA(n_components=175)),
('kmeans ',KMeans(n_clusters=16) )
))cluster _ pipeline . fit(azdias _ cleaned)
general _ predictions = cluster _ pipeline . predict(azdias _ cleaned)customers _ predictions = cluster _ pipeline . predict(customers _ cleaned)
拟合和预测方法应用于 AZDIAS 数据,预测方法应用于客户数据。
客户数据与 AZDIAS 数据的比较
使用每组中的人口比例对普通人群和 AZDIAS 数据的聚类结果进行相互比较。
Proportion of people for the general population and the customer data
Difference in proportion between customers and general audience: positive is overrepresented and negative is underrepresented
比较每个集群中普通受众和客户受众的比例和比例差异(customers _ ratio-general _ ratio ),表明存在客户代表过多和不足的集群。在客户数据中,客户和一般受众之间的比例具有最高正差异的聚类过多(感兴趣的聚类#6 和#8)。客户和普通受众之间比例负差异最大的聚类在客户数据中代表性不足(无兴趣聚类#0 和#7)。它们的潜在特征中的聚类中心被映射到原始特征以识别人的类型。
Comparison table of attribute values for overrepresented and underrepresented clusters.
因此,使用邮购公司的人(#6 和#8)是富有的,年龄在 45-60 岁之间(altersketoporie _ GROB = ~ 3.4),平均年龄为 60 岁(GENERATION_DECADE 分别= 6.1 和 6.6),是存钱的人或投资者的概率很高(FINANZ_SPARER 分别=1.3 和 1.6)。在代表性不足的群体中,他们是高收入者(LP_STATUS_GROB=4)对低收入者(1.2 和 2.3)。这些人具有低运动模式(MOBI _ 区域=4.2)。这些人也有宗教信仰和传统观念。
在诸如 D19_GESAMT_DATUM (8.2 对 2.8)、D19_KINDERARTIKEL (0.6 对 2.2)、D19_VERSAND_DATUM (9.0 va 3.3)、D19_KONSUMTYP_MAX (6.1 对 2.1)等类别中,两个过度表示的集群之间也存在一些差异。并非所有列出的特性都有说明,但总体 D19_*特性与使用某组产品的频率有关。因此,该方法区分了具有高和低交易活动的两组。
另一方面,在公司中任职人数不足的人最高达 45 岁(altersketagorie _ GROB = 1.8 和 1.9)。这些人出生于 80、90 年代(GENERATION_DECADE = 8.6),金融兴趣不高(FINANZ _ MINIMALIST = 1、2)。这些人是穷人,他们是概率极低的存钱者(FINANZ_SPARER > 3.9)。其中一个聚类表明,这些人具有高移动模式(MOBI _ 雷吉欧=1.9),这意味着他们没有自己的家,另一个具有中等移动模式(MOBI _ 雷吉欧=3.8)。这些人很可能是感性的;宗教和传统思想的可能性很小。
Comparison bar plot for SEMIO_REL, GENERATION_DECADE, WEALTH and FINANZ_SPARER feature in four clusters
监督学习模型
现在,我们准备分析 MAILOUT 数据集,并建立一个监督学习模型,能够预测该人是否成为客户。“邮件发送”数据文件中的每一行都代表一个具有“响应”列的邮件发送活动的目标个人。值得注意的是,MAILOUT_TRAIN 数据集中只有约 1.2%是客户。这里,应用了类似的转换管道和清理,只是没有删除任何行以避免信息丢失(在 clean_data 函数中使用 test_set=True 属性)。
通常,为了建立监督模型,我们需要将数据分成训练和测试数据集,在训练数据集上建立监督模型,并在测试数据集上进行预测。在我们的例子中,我们已经得到了 MAILOUT_TEST 数据集,可以通过将它提交给 Kaggle competion 来评估模型的性能。因此,在这一部分有两种可能的途径可走:
- 将数据集拆分为训练集和验证集
- 使用交叉验证技术
我决定使用交叉验证,因为只有 532 名(1.2%)客户。在分割数据集的情况下,该值将减少 20%。因此,我使用 5 重交叉验证(Scikit-learn 0.2 版本中的默认值)来获得学习曲线,并使用 GridSearchCV 参数化模型。
监督学习管道
监督学习管道由两个步骤组成:之前引入的列转换器和分类器。
管道=管道([
('变换',ct),
('分类器',分类器)
))pipeline . fit(maiout _ train _ cleaned)
预测= pipeline . predict _ proba(maiout _ train _ cleaned)
量词
使用默认参数测试了几种集成方法,以选择最佳分类器。集成学习是在其他模型的基础上建立一个模型的方法。Scikit-learn 中的随机森林分类器、Adaboost 分类器和梯度提升分类器都是建立在决策树模型之上的集成分类器(默认)。
这些集成模型对于分类和回归问题都非常有效,通常具有以下优势:
- 提高机器学习算法的稳定性和准确性;
- 减少一个模型的单个估计值的方差,因为它们合并了几个模型的几个估计值;
- 有助于避免过度拟合。
分类器评估
用于模型评估采用学习曲线法。学习曲线显示了不同数量的训练样本(训练数据的 10%-100%)的估计量的验证和训练分数。它是一种工具,可以发现我们从添加更多的训练数据中获益多少,以及估计量是更容易受到方差误差还是偏差误差的影响。
Learning curves for three different classifier, score = roc_auc score
对学习曲线的分析表明,随机森林分类器在训练集上具有微小的误差(roc_auc 得分=53%),这意味着该模型严重过拟合数据。验证集的误差(roc_auc 得分=53%)很大,这是一个高偏差模型。注意,曲线已经收敛,添加更多数据不会改进分类器。这是一个高偏差模型。
Adaboost 分类器表现出更好的性能。虽然随着训练集大小的增加,训练 roc_auc 分数降低了高达 84%,但是对于验证集,它增加了高达 72%。两条曲线几乎是收敛的,并且分数不会随着训练集中点数的增加而显著提高。
梯度提升分类器的验证分数提高了 76%,而训练分数降低了 92%。两条曲线不收敛,增加更多的点可以进一步提高分数。因此,梯度推进是最佳模型,并将用于 GridSearch 参数化。
分类器参数化
梯度推进分类器的参数化使用网格搜索来执行。网格搜索使用交叉验证测试指定超参数的所有可能组合,然后在验证集上选择具有最高分数(roc_auc)的模型。下面给出了在网格搜索中测试的具有不同超参数的梯度推进流水线的初始化。
gbc _ pipeline = SML . make _ pipeline(CT,GradientBoostingClassifier())
parameters = { ' classifier _ _ learning _ rate ':[0.1,0.2],' classifier _ _ n _ estimators ':[100],' classifier__max_depth': [3,5],' classifier _ _ min _ samples _ split ':[2,4]}
grid _ obj = GridSearchCV(gbc _ pipeline,parameters,scoring = 'roc_auc ')
最佳分类器具有以下超参数:learning_rate=0.1,n_estimators=100,决策树 max_depth=3,决策树 min_sample_split=4(默认值=2)。使用参数化模型在训练集上计算的分数明显高于默认模型(0.8976 比 0.8968)。
特征重要度图表明,最重要的特征是 D19_SOZIALES,遗憾的是没有关于它的描述。下一个重要特征与消费类型(D19_KONSUMTYP_MAX)和运动年份 EINGESOGENAM_HH_JAHR(信息不可用)相关。
Feature importances plot
Kaggle 比赛
最后将监督模型应用于 MAILOUT_TEST 数据。获得的成为顾客的概率被提交给 Kaggle competition。最终得分为 0.789,仅比本届冠军得分低 0.009。
结论
在这个由 Bertelsmann Arvato Analytics 的 Udacity partners 提供的项目中,分析了德国人口和客户群的真实人口统计数据。
- 在第一部分中,对数据进行了评估和预处理。这一部分是必须完成的最困难的步骤之一,因为有 366 个列要分析,并且不是所有的列都有描述。发现了许多缺失值和缺失的属性信息。创建了列转换管道,该管道进一步用于受监督和不受监督的部分。
- 在无监督的部分,使用 PCA 对描述 92%的解释方差的 175 个潜在特征进行维数减少。k 均值聚类为 16 个聚类,识别出 2 个聚类是公司的目标客户。这些都是 45-60 岁的传统意义上的富人。
- 最后,选择梯度推进分类器并参数化,建立监督模型,在 KAGGLE 上的测试数据集上进行预测。监督学习算法的最终性能为 78.9%。
这个项目可能有一些改进。例如,有其他方法预处理数据:为删除行和列选择另一个阈值,为列选择不同的转换,应用最小最大缩放器而不是标准缩放器,以另一种方式估算数据。
监督模型的改进可以通过使用 PCA 降维来测试。我们还可以选择在过度表示和不足表示数据的聚类中具有最大差异的属性,并仅使用这些属性构建监督模型。
最后,我想尝试的一个技巧是随机地将客户数据集中的数据添加到 MAILOUT_TRAIN 数据集中,使得客户和非客户的数量相等。由于现在我们在这个数据集中只有 1.2%的客户,在 50%的数据集上训练的模型可以是更好的预测器。
环境计算世界中的客户服务
原文:https://towardsdatascience.com/customer-service-in-a-world-of-ambient-computing-8e90c5ccbe5?source=collection_archive---------8-----------------------
很快将有一个额外的应用内客户服务渠道。
到目前为止,我们有一堆服务渠道,其中大多数都要求用户离开应用程序
- 拿起电话打电话
- 浏览自助服务
- 打开一个额外的聊天窗口
- 利用社交媒体渠道
- 继续使用 messenger 应用程序
- 坐进你的车去商店怎么样?
- …
然后,客户可能会在这些渠道之间来回移动,很可能会失去对事件状态的跟踪,并且跨渠道客户服务仍然会引起摩擦。
毫无疑问,提供应用内支持是快速解决问题的最佳选择。它可以从应用程序中提供遥测信息,识别用户,从而提供大量相关背景信息,使服务代理能够更轻松地帮助客户,避免不必要的延迟。谷歌的研究也发现了消费者对“现在”的重视。
并非所有设备都是智能手机
但是,如果客户不能拿起电话进行打字对话,该怎么办呢?客户可能正在玩虚拟现实游戏,或者正在驾驶汽车,或者处于无法自由行动的任何情况下。
也许客户只是不想接电话?
如果这款应用除了一盏指示‘我有空’的小灯之外,根本不提供用户界面,那该怎么办?这将例如是在周围环境中感测到人的存在并相应地采取行动的情况。
像这样的环境将主要通过亚马逊的 Alexa、谷歌 Home、苹果的 HomePod 或微软即将推出的 Home Hub 等设备进行语音和手势控制。类似这样的系统最多将键盘作为访问服务和支持的辅助手段。
但是没有必要看得那么远。想象一个游戏场景。无论是 Xbox,还是 Playstation,或者任何其他主要的控制器都没有提供键盘。在这些或 VR 或 AR 游戏的情况下,用户会握着控制器,没有足够的余地去拿键盘。
那么,他们为什么要提供一个键盘来实现对话式(或其他)应用内支持呢?没有理由。
相反,用户将通过基于手势、视图和语音的界面与服务系统和代理交互。
下一个应用内支持渠道是语音
语音识别技术正在迅速成熟,并开始在理解至少英语语言方面达到人类水平的准确性。
人类的理解水平大约是百分之五的单词错误率(WER),这意味着人类平均每一百个单词中有五个是由于错误识别、漏掉一个单词或错误插入一个单词而造成的。
机器达到人类的语言理解水平;来源 2017 互联网趋势报告
机器达到人类的语言理解水平;来源 2017 互联网趋势报告
虽然亚马逊没有给出 Alexa 能力的任何数字,但微软宣布在 2016 年 10 月达到了 5.9%的单词错误率(WER); IBM 在 2017 年 3 月以 5.5%的 WER 击败了他们。谷歌在 2017 年 5 月宣布,其 WER 达到了 4.9%。
在这样的水平上使用语音识别技术,结合自然语言处理(NLP)和自然语言生成(NLG),应用内服务对话可以获得两者,非常个性化,非常身临其境。
而且非常有效。说话是人类最容易的交流方式。说话和对话是紧密相连的。
最后但同样重要的是,这也是一种非常有效的提供客户服务的方式,因为人类交流信息的能力在说话时是最高的。
把人带回客户服务
现在,客户服务 2.0,客户服务的自动化,似乎正在从通过自助服务的呼叫偏转,然后机器人转向客户服务 3.0。
在自然语言处理和意图检测技术日益成熟的帮助下,这种迭代将把机器人从第二排移到第一排。它们将成为主要的客户支持界面。客户将通过聊天界面向机器人寻求帮助,而不是在 FAQ 上使用搜索框。然后,机器人本身将能够使用例如 FAQ 或数据库来回答问题,或者将问题升级到人类操作员。自助服务和辅助客户服务之间的区别将首先变得模糊,然后消失。机器处理较简单的问题,人处理较困难的问题。
随着自然语言处理、文本到语音、语音到文本技术和意图检测的进一步完善,打字将再次让位于语音,然后引入客户服务 4.0。
客户服务将完全转变为对话,无论是同步还是异步都不再重要。
客户服务是由机器人还是由人来提供也不再重要,但看起来会像人一样。这可能会对呼叫中心及其运营本身产生影响,我们将在另一篇文章中讨论。
底线是:客服会再次人性化。
如何定制你的 RStudio 主题(最后)
原文:https://towardsdatascience.com/customize-your-rstudio-theme-914cca8b04b1?source=collection_archive---------7-----------------------
按照这些简单的步骤在 RStudio 中安装自定义主题-包括主题!
当我的大脑在一个数据科学的早晨疲惫不堪后被挖掘出来时,我的浏览器将会不可避免地指向一个被 RescueTime 归类为“娱乐”的大杂烩网站来自 Stack Overflow 上的热点网络问题页面(“问题:为什么恶魔的治愈速度比天使快?”)去调查哈德利过去六个月的承诺。
在我感觉我已经看完了整个互联网之后,我有时会开始摆弄我的 IDE 主题,好像改变我的函数调用的十六进制颜色实际上会改进我的工作。这并不是说我目前的字体或配色方案不完美,这是一个有趣的合理化,如果我有一些 dope 连字,我实际上会工作得更快。
我通过提醒自己奥利佛·文德尔·霍马斯早在 19 世纪说过的话来强化我对这些细枝末节的痴迷;据说是关于他的 Win95 设置:
“一瞬间的洞察力有时抵得上一生的经验”
所以也许,所有这些磨利斧头的行为,可以说,实际上是有益的。也许,这让我们对积极的黑天鹅更加敏感。好了,这是一个健康的合理化!
多么甜蜜的更新!
我经常在 RStudio 中工作,虽然大多数 ide 和文本编辑器都有优秀的主题和样式,如 Sublime、Atom、Visual Studio Code,但我们 RStudio 人在这方面一直很有限。我们有一些基本的主题,仅此而已。
好吧,几个月前一切都变了。RStudio v1.2xxx 预览版于 10 月发布,具有大量新功能,包括:
- D3 功能
- 能够在后台运行 R 作业
- 更多 SQL 功能
- 酷派 plumbr API 工具
但对我们来说,最可爱的功能是能够导入我们自己的主题!本文将快速介绍如何在 RStudio 中复制 Panda 语法主题。
我们开始吧。
用 get 获取主题
RStudio 现在允许您上传。 tmThemes 和。 rsThemes 文件。我黑了一个类似熊猫的主题,放在一个回购中供你下载。我还在 repo 中加入了一个很棒的字体,叫做“Fira Code iScript ”,我们稍后会讲到。用这个 git 命令下载文件:
git clone [https://github.com/bradlindblad/rstudio-panda.git](https://github.com/bradlindblad/rstudio-panda.git)
安装字体
Fira Code iScript 是由 Ken Crocken 制作的一款优秀字体,它是 Fira Code 和 Script12 的混搭。这种字体在有斜体的地方使用 Script12 字样,在其他地方使用 Fira 代码。要安装它,双击*。您下载的 tff* 文件,然后在您的系统中安装字体,这将因每个操作系统而异。
它最终会看起来像这样:
很酷,是吧?要在 RStudio 中使用这种字体,请按照下列步骤操作:
- 如果你还没有打开 RStudio
- 导航到工具>全局选项>外观
- 使用编辑器字体框选择 Fira 代码脚本
注意,按照这个过程,你可以安装几乎任何你想要的字体。
安装熊猫主题
接下来我们将安装熊猫主题。跟随:
- 导航到工具>全局选项>外观
- 在编辑器主题框下,单击添加
- 导航到您克隆的 panda.thTheme 文件
- 打开
现在你所需要的只是快速重启,你就可以开始一个新的甜蜜主题了!这是它在我的系统中的样子(Linux Mint 19,深色):
不错!
Obi Wan is pleased
制作你自己的主题
如果熊猫主题不适合你,你可以用这个在线编辑器制作你自己的。这允许你制作任何你想要的自定义主题。你只需要从网站上下载主题,然后像上面那样上传到 RStudio。
祝你在拖延中好运!
使用 Python Matplotlib 自定义地块
原文:https://towardsdatascience.com/customizing-plots-with-python-matplotlib-bcf02691931f?source=collection_archive---------3-----------------------
通过漂亮的可视化效果获得更好的洞察力
数据科学和数据分析的核心部分是如何可视化数据。你如何利用可视化工具在定义你如何交流见解方面有着重要的作用。
我选择的探索和可视化数据的语言是 Python。
在这篇文章中,我想向您介绍我的框架,从可视化原始数据到拥有一个漂亮的情节,不仅引人注目,而且强调您想要传达的核心见解。
在这个例子中,我将使用在上一篇文章中使用的一组锻炼时间。它看起来像这样
Workout Dataset, where day category = 0/1 corresponds to weekday/weekend
一个简单的散点图应该是这样的
您可以用下面的代码复制它
import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’] def scatterplot(df, x_dim, y_dim):
x = df[x_dim]
y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5))
ax.scatter(x, y) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)
对我来说,通常的下一步是标记轴并添加标题,这样每个图都被适当地标记。
代码变化很小,但绝对有所不同。
import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’] def scatterplot(df, x_dim, y_dim):
x = df[x_dim]
y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5))
ax.scatter(x, y)
#adds a title and axes labels
ax.set_title('Distance vs Workout Duration')
ax.set_xlabel('Distance (Km)')
ax.set_ylabel('Workout Duration (min)') plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)
去掉那个盒子怎么样?
为了改变图周围的缺省框,我们必须实际移除一些图的边界。
import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’] def scatterplot(df, x_dim, y_dim):
x = df[x_dim]
y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5))
ax.scatter(x, y)
#adds a title and axes labels
ax.set_title('Distance vs Workout Duration')
ax.set_xlabel('Distance (Km)')
ax.set_ylabel('Workout Duration (min)')
#removing top and right borders
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)
主要网格线
我通常喜欢在我的图中添加一些主要的网格线。它通过减少白色背景的数量来提高可读性。你可以调整它的宽度linewidth
和透明度alpha
。
import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’] def scatterplot(df, x_dim, y_dim):
x = df[x_dim]
y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5))
ax.scatter(x, y)
#adds a title and axes labels
ax.set_title('Distance vs Workout Duration')
ax.set_xlabel('Distance (Km)')
ax.set_ylabel('Workout Duration (min)')
#removing top and right borders
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False) #adds major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)
美学
你可以看到图中的一些点重叠。为了进一步提高可读性,我们可以调整点‘透明度——alpha
。
import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’]def scatterplot(df, x_dim, y_dim):
x = df[x_dim]
y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5)) #customizes alpha for each dot in the scatter plot
ax.scatter(x, y, alpha=0.70)
#adds a title and axes labels
ax.set_title('Distance vs Workout Duration')
ax.set_xlabel('Distance (Km)')
ax.set_ylabel('Workout Duration (min)')
#removing top and right borders
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False) #adds major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)
仍然有一点重叠,但至少透明度提高了大部分点的可读性。
颜色;色彩;色调
由于我们有了天类别,我们也可以尝试用不同的颜色来标识我们图中的每个点。
为此,您可以从两种不同的方法中进行选择:
- 使用像 Adobe Kuler 的色轮这样的工具自己选择颜色
- 使用 Python 的颜色贴图
#1 定义您自己的调色板
import pandas as pd
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’]def scatterplot(df, x_dim, y_dim):
x = df[x_dim]
y = df[y_dim]fig, ax = plt.subplots(figsize=(10, 5))
#defining an array of colors
colors = ['#2300A8', '#00A658'] #assigns a color to each data point
ax.scatter(x, y, alpha=0.70, color=colors)
#adds a title and axes labels
ax.set_title('Distance vs Workout Duration')
ax.set_xlabel('Distance (Km)')
ax.set_ylabel('Workout Duration (min)')
#removing top and right borders
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)#adds major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’)
#2 使用 Python 绘制彩色地图
为了根据天类别绘制每个点,我需要在代码中引入一些新的组件
- 导入颜色映射库
- 将天类别作为参数,可以映射出相应的颜色
- 使用
scatter
方法中的参数c
分配颜色序列 - 使用参数
cmap
指定要使用的颜色图。我将使用桥彩色地图
import pandas as pd
import matplotlib.cm as cm
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’]def scatterplot(df, x_dim, y_dim, category):
x = df[x_dim]
y = df[y_dim] fig, ax = plt.subplots(figsize=(10, 5)) #applies the custom color map along with the color sequence
ax.scatter(x, y, alpha=0.70, c= df[category], cmap=cm.brg)
#adds a title and axes labels
ax.set_title('Distance vs Workout Duration')
ax.set_xlabel('Distance (Km)')
ax.set_ylabel('Workout Duration (min)')
#removing top and right borders
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False) #adds major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5) plt.show()scatterplot(df, ‘distance_km’, ‘duration_min’, ‘day_category’)
传说
到目前为止,我们一直使用原生的scatter
方法来绘制每个数据点。为了添加一个图例,我们需要稍微修改一下代码。
我们将不得不
- 将日类别作为参数,这样我们就有了自己的标签
- 将数字(0,1)标签转换为分类标签(工作日、周末)
- 遍历数据集,为每个数据点分配一个标签
import pandas as pd
import matplotlib.cm as cm
import matplotlib.pyplot as plt#loading dataset
df = pd.read_csv(‘workout_log.csv’)
df.columns = [‘date’, ‘distance_km’, ‘duration_min’, ‘delta_last_workout’, ‘day_category’]def scatterplot(df, x_dim, y_dim, category):
x = df[x_dim]
y = df[y_dim] #converting original (numerical) labels into categorical labels
categories = df[category].apply(lambda x: 'weekday' if x == 0 else 'weekend') fig, ax = plt.subplots(figsize=(10, 5)) #assigns a color to each data point
colors = ['#2300A8', '#00A658'] #iterates through the dataset plotting each data point and assigning it its corresponding color and label
for i in range(len(df)):
ax.scatter(x.ix[i], y.ix[i], alpha=0.70, color = colors[i%len(colors)], label=categories.ix[i]) #adds title and axes labels
ax.set_title('Distance vs Workout Duration')
ax.set_xlabel('Distance (Km)')
ax.set_ylabel('Workout Duration (min)') #removing top and right borders
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False) #adds major gridlines
ax.grid(color='grey', linestyle='-', linewidth=0.25, alpha=0.5)
#adds legend
ax.legend(categories.unique())
plt.show()scatterplot(df, 'distance_km', 'duration_min', 'day_category')
现在你知道了!定制的散点图,现在可以更容易地理解数据并获得一些见解。
感谢阅读!
前沿的人脸识别很复杂。这些电子表格使它变得更容易。
原文:https://towardsdatascience.com/cutting-edge-face-recognition-is-complicated-these-spreadsheets-make-it-easier-e7864dbf0e1a?source=collection_archive---------2-----------------------
在 Excel 中为正常人构建深度卷积神经网络的 9 个步骤。
机器学习可能很复杂……而且刚开始学的时候很吓人。另一方面,电子表格很简单。它们并不*性感,*但是它们去除了干扰,帮助你以直观的方式可视化代码背后发生的事情。
通过一步一步的电子表格(可以使用下面的链接查看或下载),我将向您展示计算机视觉中使用的卷积神经网络(“CNN”)是如何工作的。有一点数学,但你可以遵循电子表格中的所有公式:
【https://drive.google.com/open? id = 1 tjxppq 6 cz-4kvrxtsrbj 4 u 4 orcaamtpgvy 58 yujbzhk
电子表格模型查看图片,分析其像素,并预测它是否是埃隆马斯克,杰夫·贝索斯,或 rrrr 琼恩·雪诺…显然是天网的最大威胁。
Terminator Vision — Creating a convolutional neural net in a spreadsheet
这篇文章将涵盖上述 9 个步骤,并对每个步骤进行类比,以帮助增强你的直觉。
目标是给你一个简单的方法来开始机器学习,并向好奇的头脑展示尖端人工智能如何通过易于遵循的电子表格“在引擎盖下”工作。如果这对你有帮助,请考虑通过点击下面的注册我的电子邮件列表,我将向你发送更多电子表格,帮助你开始机器学习。
计算机视觉是脸书面部识别系统、中国奥威尔式大规模监控以及很快你的汽车:
大图类比:CNN 就像夏洛克·福尔摩斯
让我们先假设在终结者的大脑里住着一位名叫“夏洛克·卷积·福尔摩斯”的特殊侦探他的工作是仔细观察证据(输入图像),并利用他敏锐的眼睛和推理能力(特征检测),他预测照片中的人并破解案件(正确分类图像)。
以下 9 个步骤中的每一个都是这个大图类比的一部分。
Convolutional neural net architecture
输入——一张图片胜过一千个数字
Skynet’s biggest threat, Elon Musk
当我看这张照片时,我看到了一个幻想家。一个人在改善地球的同时建造了一个火箭来逃离它,以防终结者试图炸毁它。与计算机不同,我看不到像素值,也看不出图片只是红、绿、蓝光的叠加组合:
另一方面,计算机(即天网)是盲目的…它只能看到数字。
把一张数码照片想象成 3 个电子表格(1 个红色,1 个绿色,1 个蓝色)堆叠在一起,每个电子表格都是一个数字矩阵。拍照时,您的相机会测量照射到每个像素的红色、绿色和蓝色光量。然后,它按照 0-255 的范围对每个像素进行排序,并将它们记录在电子表格中:
Computers see spreadsheets
在上面的 28x28 图像中,每个像素由 3 行(1 行红色、1 行蓝色和 1 行绿色)表示,其值为 0–255。像素已经基于它们的值被有条件地格式化。
Terminator doesn’t see an eye, he sees a bunch of numbers
如果我们将每种颜色分成单独的矩阵,我们有 3 个 28x28 矩阵,每个矩阵都是我们用来训练神经网络的输入:
Model inputs
***** 侧栏:如果你想学习如何在大约 30 秒内将任何图片转换成条件格式的 Excel 文件,请访问:
http://think-maths.co.uk/spreadsheet
你将学会如何拍一张你的电子表格同事会喜欢的“前照片”……相信我,他们会在电子表格中看到你(或他们)的照片而开怀大笑🤳(小图片效果最好)。
培训概述—有其父必有其子
当你出生的时候,你知道什么是狗吗?不,当然不是。但是随着时间的推移,你的父母会给你看书籍、漫画、现实生活中的狗的照片,最终…你可以指着那些四条腿的毛茸茸的动物说“狗”你大脑中数十亿神经元之间的联系变得足够强大,以至于你能认出狗。
终结者学会了用同样的方式看待伊隆。通过一个叫做监督训练的过程,向它展示了数千张埃隆·马斯克、杰夫·贝索斯和琼恩·雪诺的照片。起初,它有 1/3 的机会猜出来是谁…但就像一个孩子一样…随着时间的推移,它会在训练中看到更多的图像。网络的连接或“权重/偏差”随着时间的推移而更新,使得它可以基于像素输入来预测图像输出。这就是在第一部分中讨论的学习过程(梯度下降)。
CNN learning to see — the training loop
那么是什么使得卷积神经网络不同于普通的神经网络呢?
一言以蔽之:翻译不变性。
是啊…那对我来说也毫无意义。让我们来解构:
- 翻译=将某物从一个地方移到另一个地方
- 不变性=它不会改变
对于计算机视觉来说,这意味着无论物体在图像中被移动到哪里(平移),都不会改变该物体是什么(不变性)。
Translation Invariance (Plus scale invariance to exaggerate the point)
必须训练卷积神经网络来识别 Elon 的特征,不管他在图像中的什么位置(平移),也不管他的大小(比例不变)。
CNN 擅长识别图像任何部分的模式,然后将这些模式一个接一个地堆叠起来,构建更复杂的模式……就像人类一样。
在正常的神经网络中,我们会将每个单独的像素作为模型的输入(而不是 3 个矩阵),但这忽略了一个事实,即靠近在一起的像素具有特殊的意义和结构。使用 CNN,我们查看相邻的像素组,这允许模型学习局部模式,如形状、线条等。例如,如果 CNN 看到一个黑色圆圈周围有许多白色像素,它会将这个图案识别为一只眼睛。
为了让 CNN 完成翻译差异,他们依赖于其功能侦探夏洛克卷积福尔摩斯的服务。
认识一下夏洛克·康科利·福尔摩斯——特写侦探
Sherlock searching for features
夏洛克活在终结者的脑海里。他用放大镜一次仔细观察一幅图像的一部分,并找到该图像的重要特征或“线索”。当他收集像简单的线条和形状这样的线索时,他把它们一个接一个地堆叠起来,开始看到像眼睛或鼻子这样的面部特征。
每个卷积层都有一堆相互依赖的特征图或“线索”。在案件结束时,他把所有这些线索放在一起,他能够破解案件,并正确识别他的目标。
Each feature map is like another “clue”
网络的每个卷积层都有一组特征图,这些特征图能够以如下所示的分层方式识别日益复杂的模式/形状。
CNN 使用数字的模式识别来找出任何图像最重要的特征。由于它将这些图案堆叠在更多的层上,因此可以构建非常复杂的特征地图。
现实生活中的 CNN 做着和夏洛克完全一样的事情:
Convolutional neural net detecting features
让 CNN 如此神奇的是,他们自己学会了这些特征…一个工程师不会写代码说寻找一组两个眼睛,一个鼻子,一张嘴,等等。
这样,工程师就更像建筑师了。他们告诉夏洛克,“我给你两叠(“卷积层”)空白特征地图(“线索”),你的工作是分析图片并找到最重要的线索。第一个堆栈有 16 个特征地图(“线索”),第二个堆栈有 64 个特征地图…现在去把你的侦探技能派上用场,破案吧!”
为了让夏洛克找到案件中的“线索”(即“计算特征图”),他依赖于他的侦探工具包中的几个工具,我们将逐一介绍:
- 滤镜 —夏洛克的放大镜🔍
- 卷积数学 —滤波器权重 x 输入图像像素
- 大步走 —在输入图像周围移动滤镜🔍 ➡️ 🔍 ➡️
- 填充材料——像“犯罪现场胶带”一样保护线索🚧
夏洛克放大镜/滤光镜
毫无疑问,夏洛克非常敏锐,具有敏锐的观察能力,但如果没有他收集的特殊放大镜或“过滤器”,他就无法完成工作他使用不同的放大镜来帮助他填写每个空白特征地图的细节。所以,如果他有 16 张地图…他会有 16 个放大镜。
每个放大镜由多层玻璃组成,每层玻璃由不同的重量组成。玻璃的层数,我们的“过滤深度”,总是与他正在看的输入层的层深度相匹配。
首先,夏洛克在看我们的输入图像,它有三层——红色、绿色和蓝色。所以…我们的放大镜也有 3 层。
当我们构建 CNN 时,我们的层深度增加,因此我们的放大镜也会变得更厚。
为了让夏洛克构建一个特征图或“线索”,他首先拿出一个放大镜,放在输入图像的左上方。红色玻璃层只能看到红色输入图像,绿色玻璃看到绿色图像,蓝色玻璃看到蓝色图像。
现在是数学问题。
卷积数学
我们特征图中的每个像素都是线索的一部分。为了计算每个像素,夏洛克必须做一些基本的乘法和加法。
在下面使用 5x5x3 输入图像和 3x3x3 滤波器的示例中,1 个像素需要 27 次乘法运算:
- 3 层 x 每层 9 个乘法卷积= 27
- 27 个数字中的每一个都加在一起。
- 将 27 个计算值加在一起后,我们再加一个数字——我们的偏差。
Convolution Calculation — Sherlock building his feature maps or “clues”
让我们放大来看看数学。一个像素由 27 个乘法运算组成(3 层 x 每层 9 个乘法运算),下面的屏幕截图显示了 27 个乘法运算中的 9 个:
Element-wise multiplication — calculating 1 piece of a clue
就偏向而言,你可以把它想象成每个放大镜的手柄。像权重一样,它是模型的另一个参数,在每次训练运行时都会进行调整,以提高模型的准确性并更新特征图细节。
过滤权重——在上面的例子中,我将权重设为 1 和 0,以简化计算;然而,在一个正常的神经网络中,你可以用随机的较低值来初始化你的起始权重…比如使用钟形曲线或正态分布类型的方法在 0.01 和 0.1 之间的值。要了解更多关于重量初始化的信息,请查看此简介。
大步走——移动放大镜
计算完特征图的第一个像素后,夏洛克下一步把放大镜移到哪里?
Striding — Moving magnifying glass 1 pixel at a time
答案取决于步幅参数。作为建筑师/工程师,我们必须告诉夏洛克,在他计算特征图中的下一个像素之前,他应该将放大镜向右移动或“移动”多少像素。2 或 3 的步幅在实践中是最常见的,但是为了简单起见,我们将坚持使用 1。这意味着夏洛克将他的眼镜向右移动 1 个像素,然后他将执行与之前相同的卷积计算。
当他的眼镜到达输入图像的最右边时,他将放大镜向下移动 1 个像素,一直移动到左边。
为什么你的步幅会超过 1?
优点:
- 通过减少计算量和存储在内存中的计算量来加快模型的速度。
CONS:
- 您会丢失关于图片的信息,因为您会跳过像素,并可能错过看到图案。
步长为 2 或 3 通常是有意义的,因为相邻像素通常具有相似的值,但如果它们相距 2-3 个像素,则对于特征图/模式来说很重要的像素值更有可能发生变化。
如何防止信息丢失(丢失线索)
为了让夏洛克破案,他需要大量的线索。在上面的例子中,我们拍摄了一个 5x5x3 的图像,或 75 像素的信息(75 = 5 x 5 x 3),我们最后只得到一个 3x3x2 的图像,或第一个卷积层后的 18 像素(18 = 3 x 3 x 2)。这意味着我们失去了证据,这让他的搭档约翰·沃森非常不安。
在 CNN 的前几层,夏洛克喜欢看到许多微小的图案(更多的线索)。在后面的图层中,当夏洛克堆叠微小的线索并查看更大的图案时,可以“向下采样”并减少我们的像素总量(更少的线索)。
那么,我们如何在 CNN 的开头防止这种信息丢失呢?
#1:填充——我们必须在图像周围用“填充”来保护犯罪现场。
Padding
在我们的例子中,在到达右边之前,我们只能移动过滤器 3 次…从上到下也是一样。这意味着我们得到的输出高度/宽度是 3x3,我们从左到右损失了 2 个像素,从上到下移动滤镜又损失了 2 个像素。
为了防止这种信息丢失,通常用零“填充”原始图像(称为“零填充”或“相同填充”)…有点像犯罪现场磁带,以确保没有人篡改这样的线索:
填充后,如果夏洛克再次使用他的放大镜,他的两个特征图将都是 5x5 而不是 3x3。
这意味着我们将剩下 50 个像素的信息,因为这个卷积的新输出是 5x5x2 = 50。
50 像素比 18 像素好。但是记住…我们从 75 像素开始,所以我们仍然缺少一些线索。
那么,我们还能做些什么让夏洛克和约翰·沃森开心呢?
#2:更多的过滤器——通过在我们的卷积层中添加至少一个特征地图,给夏洛克更多的线索
我们的模型拥有的特征地图或“线索”的数量没有限制…这是一个我们可以控制的参数。
如果我们将特征图从 2 个增加到至少 3 个(5x5x 2…到…5x5x3),那么我们的总输出像素(75)与我们的输入像素(75)相匹配,并且我们确保没有信息丢失。如果我们把地图增加到 10 个,那么当夏洛克找到他的线索时,我们会有更多的信息需要他整理(250 像素= 5×5×10)。
总之,前几层的总像素信息通常高于我们的输入图像,因为我们想给夏洛克尽可能多的微小线索/图案。在我们的网络的最后几层中,向下采样和具有较少像素是常见的,因为这些层识别图像的较大模式。
非线性模式识别— ReLUs
在一个案件中给夏洛克足够的信息是重要的,但是现在是真正的侦探工作的时候了——非线性模式识别!比如耳朵的弯曲或者鼻子的鼻孔。
到目前为止,夏洛克已经做了大量的数学运算来构建他的特征地图,但每次计算都是线性的(获取输入像素并对每个像素执行相同的乘法/加法),因此,他只能识别像素的线性模式。
为了在 CNN 中引入非线性,我们使用一个激活函数,称为整流线性单元或简称“ReLU”。在我们从第一次卷积计算出我们的特征图之后,每个值都通过这个函数来查看它是亮着还是被“激活”
如果输入值是负的,那么输出变成零。如果输入为正,则输出值保持不变。ReLU 就像一个开/关开关,当您通过 ReLU 运行特征图的每个值后,您就创建了非线性模式识别。
回到我们最初的 CNN 示例,我们将在卷积后立即应用 ReLU:
ReLU = Rectified Linear Unit
虽然有许多非线性激活函数可用于将非线性引入神经网络(sigmoids、tanh、leaky ReLU 等)。),ReLUs 是目前 CNN 中最常用的,因为它们计算效率高,学习速度更快。查看 Andrej Karpathy 关于非线性激活函数的概述,了解每个函数的优缺点。
最大化共享——把关键的几个放在大脑阁楼里
既然夏洛克已经有了一些特征图,或者“线索”,可以开始查看,他如何确定哪些信息是关键的,哪些是不相关的细节呢?最大池化。
夏洛克认为人脑就像一个空荡荡的阁楼。傻瓜会把各种各样的家具和物品放在那里,这样有用的信息最终会在混乱中丢失。聪明的人只储存最重要的信息,以便在需要时能迅速做出决定。这样,max pooling 就是夏洛克版的大脑阁楼。为了让他快速做出决定,他只保留最重要的信息。
Max Pooling is like Sherlock Holmes ‘Brain Attic’
使用 max pooling,他查看像素邻域,并且只保留“最大”值或“最重要”的证据。
例如,如果他在看一个 2×2 的区域(4 个像素),他只保留具有最高值的像素,而丢弃其他 3 个像素。这种技术让他学得很快,也帮助他归纳(相对于“记忆”)线索,他可以为将来的图像存储和记忆。
类似于我们前面的放大镜过滤器,我们也控制最大池的步幅和池的大小。在下面的例子中,我们假设步幅为 1,池大小为 2x2:
Max pooling — picks the “maximum” value in a defined neighborhood of values
在最大池化之后,我们已经完成了一轮卷积/ReLU/最大池化。
在一个典型的 CNN 中,在我们到达我们的分类器之前,会有几轮卷积/ReLU/pooling。对于每一轮,我们会在增加深度的同时压缩高度/宽度,这样我们就不会在途中丢失证据。
第 1-5 步的重点是收集证据,现在是夏洛克查看所有线索并破案的时候了:
现在我们有了证据,让我们开始理解这一切..
当夏洛克到达一个训练循环的末尾时,他有一个分散在各处的堆积如山的线索,他需要一种方法来一次查看所有的线索。每条线索都是一个简单的二维数值矩阵,但是我们有成千上万条这样的线索堆积在一起。
作为一名私人侦探,夏洛克在这种混乱中茁壮成长,但他必须将他的证据带到法庭上,并为陪审团组织起来。
Feature maps prior to flattening
他使用一种简单的变换技术来实现这一点,这种技术叫做展平:
- 每个二维像素矩阵变成 1 列像素
- 我们的二维矩阵的每一个都放在另一个的上面。
这是人眼看到的变形的样子…
回到我们的例子,这是计算机看到的…
既然夏洛克已经组织好了他的证据,是时候让陪审团相信证据明确指向一名嫌疑人了。
在全连接层中,我们将证据与每个嫌疑人联系起来。从某种意义上说,我们通过向陪审团展示证据和每个嫌疑人之间的联系,为他们“连接线索”:
Fully connected layer — connecting the evidence to each suspect
使用我们的数字示例,计算机会看到以下内容:
Fully connected layer
在展平层中的每个证据和 3 个输出之间是一堆权重和偏差。像网络中的其他权重一样,当我们第一次开始训练 CNN 时,这些权重将被初始化为随机值,随着时间的推移,CNN 将“学习”如何调整这些权重/偏差,以产生越来越准确的预测。
现在是夏洛克破案的时候了!
在 CNN 的图像分类器阶段,模型的预测是得分最高的输出。目标是让正确的输出得到高分,让不正确的输出得到低分。
该评分功能有两个部分:
- Logit 分数—原始分数
- soft max-0–1 之间每个输出的概率。所有分数之和等于 1。
第 1 部分:逻辑——逻辑分数
每个输出的 logit 得分是一个基本的线性函数:
Logit 得分=(证据 x 权重)+偏差
每条证据都乘以将证据与输出关联起来的权重。所有这些乘法加在一起,我们在最后加上一个偏差项,最高分就是模型的猜测。
Logit score calculation
那么我们为什么不就此打住呢?2 个直观原因:
- 夏洛克的自信程度 —我们想知道夏洛克有多自信,这样我们就可以在他高度自信并且正确的时候奖励他……在他高度自信并且错误的时候惩罚他。当我们最后计算损失(“夏洛克的准确性”)时,这个奖励/惩罚被捕获。
- 夏洛克的置信加权概率 —我们希望有一种简单的方法将这些概率解释为 0-1 之间的概率,并且我们希望得到与实际输出(0 或 1)相同的预测分数。实际正确的图像(Elon)具有 1,而其他不正确的图像(Jeff 和 Jon)具有 0。把正确的输出变成 1,不正确的输出变成 0 的过程叫做一键编码。
夏洛克的目标是让他的预测尽可能接近 1,以获得正确的输出。
第二部分:soft max——夏洛克的置信加权概率得分
2.1.夏洛克的自信程度:
为了找出夏洛克的信心水平,我们用字母 e(等于 2.71828…)乘以 logit 分数。高分成为非常高的置信度,低分成为非常低的置信度。
这个指数计算也确保了我们没有任何负的分数。因为我们的 logit 分数“可能”是负的,所以假设的 logit 分数在取幂之后会发生什么:
The “Confidence” Curve
2.2 夏洛克的置信加权概率:
为了找到置信度加权概率,我们将每个输出的置信度度量除以所有置信度得分的总和,这给出了每个输出图像的概率,其总和为 1。使用我们的 Excel 示例:
Softmax
这个 softmax 分类器很直观。夏洛克认为,终结者看到的照片有 97%的可能性是埃隆·马斯克。
我们模型的最后一步是计算我们的损失。这一损失告诉我们一个侦探夏洛克到底有多好(或多坏)。
每个神经网络都有一个损失函数,我们将预测值与实际值进行比较。随着我们训练 CNN,随着我们调整网络的权重/偏差,我们的预测会提高(夏洛克的侦探技能变得更好)。
CNN 最常用的损失函数是交叉熵损失。在谷歌上搜索交叉熵会出现几个带有大量希腊字母的解释,所以很容易混淆。尽管描述各不相同,但在机器学习的背景下,它们都意味着相同的事情,因此我们将在下面介绍 3 种最常见的方法,以便为您提供帮助。
在处理每个公式变体之前,下面是它们各自的工作:
- 比较正确类别的概率(Elon,1.00)与 CNN 对 Elon 的预测(他的 softmax 得分,0.97)
- 当夏洛克对正确类别的预测接近 1 =低成本时,奖励他👏
- 当夏洛克对正确类别的预测接近 0 时,惩罚他=高成本👎
These all result in the same answer! 3 different interpretations…
#1 解释——测量实际概率和预测概率之间的距离
距离捕捉了这样一种直觉:如果我们对正确标签的预测接近于 1,那么我们的成本就接近于 0。如果对于正确的标签,我们的预测接近于 0,那么我们会受到很大的惩罚。目标是最小化正确类的预测(Elon,0.97)和正确类的实际概率(1.00)之间的“距离”。
在解释#2 中讨论了奖励/惩罚“对数”公式背后的直觉。
Cross Entropy — 1. Distance Interpretation
#2 解释——最大化对数可能性或最小化负对数可能性
在 CNN 中,“log”实际上是“自然对数(ln)”的意思,它是 softmax 的步骤 1 中完成的“取幂/置信度”的逆运算。
不是采用实际概率(1.00)减去预测概率(0.97)来计算成本,而是对数计算指数地惩罚夏洛克,他的预测离 1.00 越远。
Cross Entropy — 2. Log Loss Interpretation
#3 解释— KL 分歧
KL (Kullback-Leibler)散度衡量我们的预测概率(softmax 得分)与实际概率的偏离程度。
该公式分为两部分:
- 我们实际概率的不确定性。在机器学习的监督训练的背景下,这总是零。我们 100%确定我们的训练形象是埃隆·马斯克。
- 如果我们使用我们预测的概率,我们会丢失多少“信息”。
3. Cross-Entropy — KL Divergence Interpretation
包扎
在我们的特别卷积侦探夏洛克·福尔摩斯的帮助下,我们给了终结者一双眼睛,所以他现在有能力寻找并摧毁自由世界的保护者…埃隆·马斯克(抱歉埃隆!).
虽然,我们只训练终结者区分埃隆,杰夫和乔恩…天网有无限多的资源和训练图像在它的处置,所以它可以利用我们已经建立和训练终结者看到任何人或事。
订阅更多并分享
如果你喜欢这一点,并希望获得更多优秀的学习和备忘单直接发送到您的收件箱,请点击下面并输入您的电子邮件地址(它们都是免费的)。
其他资源—交互式
- 抽一个数字,看 CNN 预测
- 用谷歌+你的网络摄像头训练你自己的 CNN(或者只是观看)
- 安德烈·卡帕西的实时图像分类模型
- 快速结账。艾的在 CNN 上的 YouTube 视频(不是互动的,而是很棒的讲座和深度学习系列)
在这场对抗机器的战争中,我们未来的命运掌握在你的手中😜
Terminator Vision
切断绳索:预测电信公司的客户流失
原文:https://towardsdatascience.com/cutting-the-cord-predicting-customer-churn-for-a-telecom-company-268e65f177a5?source=collection_archive---------12-----------------------
你可以在这里找到 Github 项目库中的代码,或者在这里查看的最终演示幻灯片。
为什么要研究客户流失?
客户流失是大多数企业面临的最大问题之一。根据哈佛商业评论,发现一个新客户的成本是留住一个现有客户的 5 到 25 倍。换句话说,你现有的客户价值连城!
防止客户流失是一项重要的业务职能。这也是一个经常用漫无目的的、粗略的方法来处理的问题。通过建立一个模型,用机器学习算法预测客户流失,理想情况下,我们可以将不满意的客户问题扼杀在萌芽状态,并保持收入流动。
背景
我使用了来自 Kaggle.com 的数据集,其中包括一家名为 Telco 的电信公司的 7033 条独特的客户记录。每个条目都有关于客户的信息,包括以下特征:
服务—客户订购的服务(互联网、电话、有线电视等。)
每月账单总额
任期——他们成为客户多长时间了
基本的人口统计信息——他们是否是老年人,是否有家属,等等。
在我们的研究中,因变量是客户在过去一个月中是否有过“搅动”。事实上,我们有整整 27%的客户被贴上了上个月离开公司的标签。随着流失率如此之高,如果我们不干预,公司失去大部分客户只是几个月的事情。
Churn!
假设
出于我们分析的目的,我们做了两个假设:
- **对于每个离开公司的客户,电信公司需要花费 500 美元来替换该客户。**营销、广告、活动和外展——成本不断增加。
- 我们可以通过投资 100 美元留住每个可能流失的客户。这可以通过折扣、改善服务(例如提升网速)或提供额外津贴来实现。
树立标杆
Let’s make our model better.
为了宣告胜利,我们需要知道成功是什么样子的!我们成功的主要衡量标准是我们的模型相对于默认的虚拟模型的表现如何。请将此视为“维持现状”选项。因为我们知道花 100 美元留住一个客户从长远来看会为我们节省 500 美元——但是我们不知道哪些客户可能会流失——**我们默认的“虚拟”模式就是在我们所有的*客户身上花 100 美元,以确保我们抓住那些流失的客户。***这是我们想要击败的模式。
方法学
对于我们的模型,我们首先查看了几种不同的机器学习算法,以确定应该使用哪种算法。我们的第一步是使用训练-测试-分割将我们的数据分割成训练集和测试集,这将允许我们稍后交叉验证我们的结果。**我们还对训练-测试-分割进行了分层,**以确保我们的目标变量在训练和测试集中的比例相同。
# Stratify our train-test-split so that we have a balanced split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=40, stratify=y)
我们还使用了一些少数过采样来平衡我们的数据集。由于我们数据库中只有大约 27%的记录被标记为“搅动的”,在没有过采样的情况下将我们的数据输入我们的算法会导致它对我们的目标变量分类不足。我们使用 imblearn 的 SMOTE 使我们的少数民族类达到数据集的 50% 。
sm = SMOTE(random_state=42, ratio=1.0)
X_train_res, y_train_res = sm.fit_sample(X_train, y_train)
现在我们的数据已经平衡了,我们接着执行另一个训练测试分割——这一次只是在我们的训练数据上。这样做的原因是为了不违反交叉验证的基本原则——根据测试数据提供的结果做决定。
X_train_2, X_test_2, y_train_2, y_test_2 = train_test_split(X_train_res, y_train_res, test_size=0.33, random_state=20)
在所有这些辉煌的数据管理之后,我们绘制了一条 ROC 曲线,以比较每个算法在识别真阳性(灵敏度)和假阳性(特异性)方面的表现。
The ROC Curve, in all its glory.
基于这个图,我们决定用 4 个主要的分类模型前进:逻辑回归、梯度推进、随机森林和 AdaBoost。我们着手调整这些模型,以充分利用它们。
对于我们的分析,召回是我们的目标指标。我们最关心的是用我们的模型捕捉尽可能多的真阳性(可能流失的人),我们不太关心我们可能会把一些假阴性(没有流失的人)一起扫进去。
了解了这一点,我们然后使用 Sci-Kit Learn 的 GridSearchCV 函数,它允许我们调整我们的模型。我们将召回率设置为优化的评分标准,然后使用不同超参数的组合来找到最适合的模型。我们的目标是从我们的模型中挤出最后一点召回,不能少!
pipe = Pipeline([('scaler', StandardScaler()),
('clf', RandomForestClassifier())])
param_grid = [{'clf__max_depth': [4, 5, 6],
'clf__max_features': [5, 10, 15, 20],
'clf__n_estimators': [50, 100, 150]}]
gs = GridSearchCV(pipe, param_grid, cv=5, n_jobs=-1, scoring='recall')
gs.fit(X_train_res, y_train_res)
GridSearchCV 还包括一个方便的交叉验证功能(这就是 CV 的含义!),所以我们在每个模型的新参数通道上执行分层 K 折交叉验证。不用说,我们在试图避免过度拟合我们的模型时非常仔细。
最后,我们分析的很大一部分与创建一个**“节省的净美元”函数**有关,该函数将确定我们在留住客户上花了多少钱,而不是因为不必替换他们而节省了多少钱。这和回忆一起,构成了我们判断是否有一个成功模型的决策标准。
结果
All of our models performed well.
调整了我们的模型后,结果是 3 个模型并驾齐驱。**我们的最后一步是调整每个模型的概率阈值(在 i = .01 和 i = 1 之间)。**这让我们能够优化“节省的净美元”功能。本质上,对于每个概率阈值 i ,我们要求我们的模型预测客户是否会流失——即使是非常低和非常高的 I 值。当然,当 i 接近 0 时,我们的模型基本上会预测每个人都会流失——相反,当它接近 1 时,没有人会流失。通过绘制这个函数,我们能够看到优化我们的“净节省美元”函数的确切概率。
Making money by keeping customers.
最终,Logistic 回归模型胜出。它显示了 81%的出色召回率,并且最大化了我们的“净节省美元”功能。总的来说,我们的模型为我们节省了 272,200 美元,轻松击败了“现状”模型。这种模式只节省了(微不足道的)16.2 万美元。
感谢阅读!如果你喜欢这个帖子,在 LinkedIn 上找到我,在 Medium 上给我鼓掌,或者在这里给我发电子邮件。向前向上,朋友们!
【CVPR 2014 /论文摘要】显著对象分割的秘密
原文:https://towardsdatascience.com/cvpr-2014-paper-summary-the-secrets-of-salient-object-segmentation-9c777babdc5?source=collection_archive---------7-----------------------
Gif from this website
我已经知道什么是分割,但是我不知道什么是显著对象分割。因此,我决定通过阅读 2014 年 CVPR 上发表的一篇论文来改变这一现状。
请注意,这篇文章是为了让未来的我回顾并记住这篇文章的内容。
显著物体检测/注视预测
Image from this website
显著的 →最显著的或最重要的。(来自谷歌搜索)
因此,从上面的图像中,我们可以得出结论,显著对象检测是一个用于分割图像中最重要的对象的术语。
Image from this paper
从上面的论文中我们可以得出结论,当我们希望预测人眼在观看图像时看得最多的地方时,使用术语注视预测。
摘要
这篇文章声称,我们目前评估显著对象基准的方式存在巨大的偏差(称为数据集偏差)。(请记住,本文发表于 2014 年。)此外,本文还介绍了一种显著对象分割的新方法,该方法优于现有的模型。
简介
所以在我们继续之前,我们需要知道一个术语。
数据集设计偏差 →一种特殊类型的偏差,由实验者对数据集图像的非自然选择引起。(更多信息请点击此处)
这篇论文的作者告诉我们两件事。计算机视觉中的显著性不是一个明确定义的术语,它可以被理解为 a)分割,其中我们分割图像中最重要的对象,或者 b)眼睛注视预测。然而,现有的方法存在两个问题。
- 如果一个模型专注于一个问题,它往往会忽略与另一个问题的联系。
- 如果一个模型在一个数据集上进行基准测试,它往往会过度适应该数据集,从而产生固有的偏差。
相关作品
该论文再次描述了每个问题是什么,例如注视预测是眼睛凝视预测,并且对于显著对象分割是试图分割给定图像中最重要的对象的任务。本文还讨论了对象识别任务(我们试图在它们各自的每一类中找到对象)与显著对象分割之间的联系。最后,作者讨论了一个数据集偏差,这在视觉显著性分析中心偏差是一个巨大的问题。这是当实验参与者专注于观看图像的中心,而摄影师想要将焦点对准图像的中心时的原因。
数据集分析
这一节的题目是巨大的,主要是因为它是本文的核心贡献之一。我不得不说,我不知道他们做的所有统计分析的细节,但是,一旦我研究了他们。我一定会再写一篇博文。
在帕斯卡数据集 上的心理物理实验在这里,作者进行了一些实验来收集用于注视预测的地面真实数据帕斯卡 2010 数据 se t 上
评估数据集一致性
为了比较不同标注者(来自之前的实验)之间的一致程度,作者进行了一些广泛的分析,以了解受试者之间的一致性。(对于显著对象分割以及注视预测)。作者发现一个有趣的事实是…..(如下所示)
基准测试 在这里,作者比较了许多执行显著对象分割的先进算法,并发现当算法没有在 FT 数据集上训练时,它们的性能显著下降。
数据集设计偏差 作者在这一节真的是全力以赴,他们进行了很多统计分析,比如比较局部颜色对比度、全局颜色对比度、局部 gPB 边界强度、对象大小等。他们把建国总结成一段话
基本上,在 FT 数据集中,在我们想要分割的对象和该对象的背景图像之间存在强烈的对比。这使得模型更容易学习如何分割对象,但不能很好地概括。
注视和 F-measure
这里作者讨论了中心偏差问题的影响,以及许多最先进的算法抵消中心偏差问题的方法。例如,在 AWS 和 SIG 中,他们在 s-AUC 中对其算法性能进行了基准测试,消除了中心偏差问题。
从注视到显著物体检测
对于这一部分,上面的图片,一步一步地描述了作者的方法来执行显著的对象分割,这是一个惊人的工作。(他们声称这很简单,但在我看来真的一点也不简单…)
- 使用 CPMC 执行无监督分割方法
- 获得对象内注视的空间分布
- 具有一个函数,其中给定一个建议的对象候选遮罩及其固定图(来自步骤 1 和 2),估计该区域相对于地面实况的重叠分数(交集/并集)。
结论
同样,本文已经证明了在注视预测和显著对象检测之间存在强相关性的事实。使用这种知识,他们提出了一种执行显著对象分割的新方法,其中他们首先执行片段生成过程,然后使用注视预测的显著性评分机制。最后,本文还描述了数据集中的偏差,这在视觉显著性分析中心偏差是一个巨大的问题。
遗言
这篇论文包含了大量的信息,并且作为显著对象分割任务以及眼睛注视跟踪的非常好的介绍。非常有趣…
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 李,杨,侯,x,科赫,c,瑞格,J. M .,,尤耶,A. L. (2014)。显著对象分割的秘密。佐治亚理工学院。
- MSRA10K Salient Object Database. (2014). 南开大学媒体计算实验室. Retrieved 28 April 2018, from https://mmcheng.net/msra10k/
- (2018).Arxiv.org。检索于 2018 年 4 月 28 日,来自https://arxiv.org/pdf/1611.09571.pdf
- 如何识别 AI 中的排斥—微软设计—中?(2017).中等。检索于 2018 年 4 月 28 日,来自https://medium . com/Microsoft-design/how-to-recognize-exclusion-in-ai-EC 2d 6d 89 f 850
- 帕斯卡视觉对象类挑战 2010 (VOC2010)。(2018).Host.robots.ox.ac.uk 检索 2018 年 4 月 28 日,来自http://host.robots.ox.ac.uk/pascal/VOC/voc2010/
- 频率调谐显著区域检测。(2018).Ivrlepfl.ch 于 2018 年 4 月 28 日检索,来自 http://ivrlwww.epfl.ch/supplementary_material/RK_CVPR09/
- 图像签名:突出稀疏的显著区域。(2018).Ieeexplore.ieee.org。检索于 2018 年 4 月 28 日,来自 https://ieeexplore.ieee.org/document/5963689/
- 加西亚-迪亚兹,a .,莱博兰,v .,Fdez-Vidal,x .,和帕尔多,X. (2012 年)。光学可变性、视觉显著性和眼睛注视之间的关系:一种计算方法。视觉杂志,12(6),17–17。doi:10.1167/12.6.17
【CVPR 2017 /论文摘要】用于密集图像标注的门控反馈细化网络
原文:https://towardsdatascience.com/cvpr-2017-paper-summary-gated-feedback-refinement-network-for-dense-image-labeling-8746a3e1889b?source=collection_archive---------6-----------------------
GIF from this website
我一直想读的论文之一。
请注意,这篇帖子是给未来的自己看的,回顾这篇论文上的材料,而不是从头再看一遍。
Paper from this website
摘要
对于密集标记问题,重要的是考虑图像中的局部和全局信息。在本文中,作者提出了门控反馈细化网络,该网络最初进行粗略预测,然后在细化阶段通过有效地整合局部和全局上下文信息来逐步细化细节。
简介
在要求像素级精度的图像密集标记中,保持空间分辨率非常重要,因为我们需要创建一个分割掩模。这些任务中的大多数都有一个解码器部分,它逐渐恢复类别的像素级规范。在编码阶段的最深处,神经元可能缺乏空间信息(由于下采样),然而,它通常具有最丰富的可能特征表示。并且在更早的层中,每个神经元将具有更大的空间局部性,但是可能区分度更低。(如上图。).因此,为了克服这个问题,本文的作者介绍了一种新的架构,其中编码器和解码器通过门控单元连接。(因此利用了来自早期层的空间信息以及较深层中丰富的特征表示。).该模型的一个优点是这种类型的方法可以应用于任何编码器-解码器类型的神经网络。
背景
在这里,作者简要描述了编码器-解码器类型网络的基础知识,并给出了一些具有类似结构的示例论文。接下来,作者讨论了编码器和解码器之间跳过的连接。一个有趣的事实是,对于密集标记任务,对诸如小平移或光照等有害因素不变的特征地图的高表示并不理想。因为一些重要的关系可能被抽象掉。
门控反馈细化网络
如上所示,该网络是 VGG 16 的修改版本,其中去掉了 softmax 层,并增加了两个额外的卷积层。最后,在编码器阶段结束时,特征映射具有 HWC 的维数,其中 C 是类的数量。(上采样是通过双线性上采样完成的)。并且使用解码器来恢复空间分辨率。作者工作的新颖性主要在于编码器和解码器之间的门控连接,而不是通过直接连接直接连接两者,他们使用门控机制来调制信息。
门单元
如上所述,选通单元接收两个特征图作为输入,并且由于每个特征图的维数彼此不同,所以它们应用一系列操作,随后是逐元素的点积。(操作顺序是与批量标准化和 ReLU 卷积)。最后,门控单元的输出被馈送到门控细化单元。
门控细化单元
遵循类似的策略,给定的特征图首先通过批量归一化的卷积(在这之后,通道大小 C 与类的数量相同)。)接下来,特征图 mf 与阶段标签图 Rf 连接。最后,通过应用 3 × 3 卷积来生成细化的标签映射 R`f。(数学上我们可以总结如下。)
阶段性监督
虽然我们最感兴趣的是最终阶段生成的掩码,但是隐藏标签可能会提供有用的信息,并且可以对模型进行早期监督。因此,使用具有交叉熵损失的调整大小的地面真相掩模,作者引入了多个损失函数。我们可以看到上面的逐级损失函数的效果。
实验
作者使用 Caffe 来实现网络,并在三个数据集上训练网络,剑桥驾驶标记视频(CamVid),PASCAL VOC 2012 和马牛解析。
上面可以看到 Cam Vid 数据集的每类 IoU 和平均 IoU。我们可以立即注意到,G-FRNet 在平均 IoU 得分方面获得了最高分。下面是分割图的例子。
对于 PASCAL VOC 2012 数据集,在修改类似于 resnet 的网络并在最终预测的基础上应用条件随机场之后,作者能够实现最先进的性能。
最后,即使对于 Horse-Cow 解析数据集,当与不同的现有技术网络相比时,该模型也能够实现最高的 IoU 分数。
上面可视化的底部图表显示了消融分析的结果,其中作者通过省略一个或多个组件调查了网络的每个提议组件的贡献。他们发现包含门单元可以提高整个网络的整体性能。
讨论
关于 G-FRNet 的两个令人印象深刻的事实是,随着网络的发展,对象的丢失部分被恢复,并且在分段掩码中错误标记的部分被纠正。此外,与其他先进网络相比,G-FRNet 的参数数量只有其 12%到 25 %,但性能却极具竞争力。
结论
总之,本文的作者介绍了一个新的密集标记任务的框架。其中编码器-解码器型网络跳过了连接和逐级监督,以逐步产生更精细分辨率的密集标记。
遗言
这种类型的架构也可以应用于许多不同的 CNN。
参考
- 伊斯兰,m .,罗昌,m .,那霸,s .,布鲁斯,n .,,王,Y. (2018)。用于由粗到细的稠密语义图像标注的门控反馈细化网络。Arxiv.org。检索于 2018 年 7 月 14 日,来自 https://arxiv.org/abs/1806.11266
CVPR 2018。印象和 15 篇有趣的论文
原文:https://towardsdatascience.com/cvpr-2018-impressions-and-15-interesting-papers-37fcc1b5b449?source=collection_archive---------5-----------------------
从认识新朋友和与其他人一起去虚拟化的角度来看,这个 CVPR 很棒。关于新的很酷的结果——没那么多。我的意思是,很多好论文,但没有什么开创性的,至少在我感兴趣的领域。
Fun in posters 😃
0)如果您展示与图形相关的海报,例如去模糊、超分辨率等,请不要将其印在布上。尤其是在粗糙织物上。
深度图像去模糊的尺度递归网络做得很好,但是由于布料纹理你什么都看不到:(
Poster material matters.
- GANs、领域适配、自动驾驶和非常次要的架构小技巧无处不在。
2)东欧的代表性仍然很差,但在增长。匈牙利、乌克兰、罗马尼亚、波兰、土耳其。论文不多,但至少有一些,而且数量还在增加。太棒了。
3)工作坊“做好 CVPR 市民”出奇的酷。尤其是 Vladlen Koltun 的“什么是好的研究”和 Devi Parikh 的“日历,而不是列表”。所有幻灯片和视频都可以通过上面的链接获得
4)我发现了各种风格的图形神经网络。迈克尔·布朗斯坦的好教程
5)车间论文“马尔可夫链神经网络”。简单的想法——添加额外的随机输入变量来控制期望的输出,然后您可以在测试时有条件地控制输出。
Markov chain neural networks poster
6)三个版本的可区分 SLAM:
— MapNet:一个用于映射环境的以所有人为中心的空间内存来自牛津
— NVIDIA MapNet " 用于摄像机定位的地图的几何感知学习。
—salakhutdinov集团 deep slam:基于注意力的 RNNs 全局姿态估计
- RANSAC 还在进步。两篇很酷的论文:潜然萨克和图切然萨克
Latent RANSAC and Graph-Cut RANSAC
8)关于大规模地标识别的研讨会:关键提示信息:全局特征已经足够好了,但是池化和集成还有待改进。如果你需要本地特色——选择 DELF。以下是推特翻译:https://twitter.com/ducha_aiki/status/1008815959291777025
https://twitter.com/ducha_aiki/status/1008818384664838145
8)相比之下, InLoc:密集匹配和视图合成的室内视觉定位和 Benchmarking 6DOF 变化条件下的室外视觉定位论文说的不一样:局部特征很酷,但是你需要密集,而不是稀疏
InLoc and 6DOF bench papers
9)地方特色-相关论文线程—https://twitter.com/ducha_aiki/status/1009192898061979648
我喜欢的其他论文:
- 感知失真权衡。例如,如果信息丢失,您无法在重建中既获得良好的细节又接近真实情况,需要进行选择。下一个问题是如何得到给定优先级的算法,以及权衡的确切位置。
- 一种用于深度网络
随机优化的 PID 控制器方法,并行于 SGD 和 PID 控制器之间,能够重新使用已知的控制理论方法进行学习。 - 对抗性度量学习:甘式化易为难——特征迁移。为数不多的不枯燥的 GAN 论文。
- 通过提问来学习。网络通过自己学习提问来学习进行视觉问答。
- 2 篇关于基于秩的损失的论文:两篇关于优化平均精度的论文:这里有一个平均精度的闭式解及其可微公式。
基于秩的损失函数的高效优化:作者没有使用封闭形式,而是通过利用类似快速搜索的算法提出了高效的评价。 - 通过概率自省的几何稳定特征的自我监督学习通过预测匹配性来学习特征。
- 面向高效 ConvNet 的分析滤波器:第一层上的可操纵滤波器,用于全连接的第一级 DCT,用于前 FC 层的基于 BoW 的池。改进的 VGGNet 和 ResNet。
- 学习从单个运动模糊图像中提取视频序列新的运动去模糊任务公式:提取产生模糊图像的帧序列比提取单个去模糊图像更好且更容易。
- 亚特兰大世界:如果在你的 2D 世界中有 4 种主导方向,使用 4D 坐标系,而不是最小 2。
论文:亚特兰大帧估计的全局最优内联集最大化
P.S .另一份来自 CVPR 2018 的有趣报道https://olgalitech . WordPress . com/2018/06/30/cvpr-2018-recap-notes-and-trends/
【CVPR 2018 /论文摘要】去相关批量归一化
原文:https://towardsdatascience.com/cvpr-2018-paper-summary-decorrelated-batch-normalization-6917d2a8fcf6?source=collection_archive---------19-----------------------
GIF from this website
标准化有多种不同版本,如实例标准化或组标准化。这是一种新的方法,其中该层对给定数据执行统计白化。
请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。
Paper from this website
摘要
批量标准化是一种标准化给定小批量的技术,在这项工作中,作者将这一概念扩展到去相关批量标准化,其中执行 ZCA 白化。并且 ZCA 白化是为了白化数据而使用的白化技术。
简介
批量规范化用于加速深度网络的训练,从它的出现开始,就被广泛应用于深度学习的各个领域。(而且方程式如上图。)需要注意的一点是,在训练期间,我们使用数据均值和方差,但在测试期间,我们使用移动平均均值和方差。众所周知的事实是,如果我们白化输入,训练变得更有效,因为协方差矩阵的更好条件导致在更新权重时更好地调节 Hessian,使得梯度下降更新更接近牛顿更新。然而,典型的批处理规范执行标准化,然后白化数据。因此,本文的作者开发了一个新的层,在其中执行给定数据的白化。(作者解决了反向传播的问题,用于执行数据白化的技术的选择,以及在执行白化操作时如何决定批量大小。)
相关工作
众所周知,归一化数据有助于深度神经网络的收敛。BN 的一个问题是,我们需要一个合理的批量大小来估计平均值和方差,为了解决这个问题,开发了层归一化。还有其他尝试,如批量重新规范化和流规范化。作者的工作与自然神经网络密切相关,然而作者指出了他们的方法更稳定的事实。获得去相关数据的另一种方法是添加额外的正则化项。然而,这些方法并不是为了加速训练。
去相关批量标准化
如上所述,数学上我们可以定义去相关操作(其中输入维度和输出维度是相同的。).然而,上述白化操作并不是唯一的,因为 sigma 协方差矩阵仅定义到旋转(单击此处的以获得更多解释),并且由于这种现象,作者称之为随机轴交换,这是不可取的。随机轴交换会导致输入维度的随机排列,这会混淆学习算法并损害性能。
如上所述,我们可以看到,如果发生随机轴交换,网络将无法很好地运行。(甚至根本没有。)为了克服这个问题,作者使用了 ZCA 美白。
ZCA 白化将 L2 距离下的白化引入的失真最小化。并且相对于西格玛值的反向传播可以在下面看到。
当我们对输入值 x 求导时,它可以是下面这样的。
与批量标准化类似,作者使用了 sigma 和平均值的运行平均值以及可学习参数 alpha 和 beta 的概念。DBN 的完整算法如下所示。
最后,如引言部分所讨论的,作者将特征分成组并对每个组执行白化,而不是一起白化整批。
实验
正如上面看到的所有实验,如条件分析以及不同数据集上训练损失的比较,我们可以看到 DBN 表现出最好的性能。
当作者将 VGG-A 架构与 BN 或 DBN 进行比较时,我们可以看到 DBN 在一般化方面表现更好。(最右边的结果是在非线性之后应用 BN/DBN 时的结果。)
如上所述,当网络使用 DBN 而不是 BN 时,训练更加稳定。(更容易优化)。我们也可以更积极地设定学习率。
跳过所有需要的贪婪的细节,作者能够通过使用 DBN 的网络超越基线性能。
结论
总之,作者介绍了去相关批处理标准化,其中给定数据的性能白化。(而不是标准化)。此外,他们能够超越基线表现。最后,他们发现使用 PCA 美白并不是一个好的选择。
最后的话
最后,如果有人感兴趣的话,我已经链接了斯坦福讲座的 pdf,其中也包含了这个主题。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请点击这里查看我的网站。
同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 pos t。
参考
- (2018).Cs231n.stanford.edu。检索于 2018 年 8 月 19 日,来自http://cs 231n . Stanford . edu/slides/2018/cs 231n _ 2018 _ lecture 07 . pdf
- (2018).Arxiv.org。检索于 2018 年 8 月 19 日,来自https://arxiv.org/pdf/1804.08450.pdf
- 美白?,W. (2018)。ZCA 美白和 PCA 美白有什么区别?。交叉验证。检索于 2018 年 8 月 19 日,来自https://stats . stack exchange . com/questions/117427/zca-whiting-and-PCA-whiting 的区别是什么
【CVPR 2018 /论文摘要】TextureGAN:用纹理补片控制深度图像合成
原文:https://towardsdatascience.com/cvpr-2018-paper-summary-texturegan-controlling-deep-image-synthesis-with-texture-patches-50040c0e5cf?source=collection_archive---------5-----------------------
GIF from this website
有不同类型的 GAN 的,今天我将看看一个 GAN,它能够生成不同纹理的真实图像。
请注意,这个姿势是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。
Paper from this website
摘要
本文的作者是第一个在生成合成图像时尝试纹理控制的人。用户可以控制纹理的方式是通过在包含用户想要生成的目标纹理的草图中放置一个补丁。通过消融研究,研究人员展示了他们的方法是多么有效。
简介
计算机视觉的最大挑战之一是让普通用户生成逼真的图像。相关的研究已经持续了 20 多年。由于 GAN 和可变自动编码器,使用端到端数据管道生成图像的技术有了很大的提高,但尽管如此,在纹理生成方面的研究仍然有限。纹理生成很难的几个原因是:1)获取细节很难,2)保持在边界内很难,3)包围 3D 对象形状很难。在本文中,作者提出了新的损失,并使用大量的数据来克服这一问题。
相关工作
图像合成是计算机视觉中的一个巨大课题,主要有两种方法来实现。(非参数和参数方法)。非参数方法有很长的历史,并且使用更传统的技术。诸如深度学习之类参数方法已经给出了有希望的结果。(包括泛化)。GAN 可用于创建假图像,对于图像合成,这意味着它可以生成逼真的假图像。并且为了使 GAN 更能被人类理解,提出了有条件的 GAN。在计算机视觉中,纹理合成和风格转换密切相关。给定一个图像,纹理合成创建一个具有相似纹理的新图像,对于样式转换,模型尝试转换样式,同时保持图像的上下文相同。(最后,作者解释了他们的工作如何不同于传统的或其他众所周知的方法。)
质感甘
在这一节中,作者提出了纹理 GAN,一个条件生成网络,它能够从具有覆盖纹理的输入草图生成逼真的图像。他们的模型的一个优点是,用户可以直接将目标纹理片放在草图中。(关于这种 GAN 的一个令人印象深刻的事实是,它知道确切的边界,例如,点状纹理只能出现在裙子上,而不能出现在腿上。).注意作者使用了 LAB 色彩空间而不是 RGB 色彩空间,他们使用了“ Scribbler:用草图和颜色控制深度图像合成 ”中介绍的网络架构。
作者首先训练纹理 GAN 来再现地面真实图像,如包或鞋。然后,他们微调网络,使其能够生成逼真的纹理。(见上图)。
地面实况预训练
在这一节中,作者讨论了他们用来成功训练网络的各种损失函数。总之,有…..
**特征损失:**使用更深层的 VGG 19 和 L2 损失函数,尝试捕捉结构相似性。
**对抗性损失:**损失函数,使甘的画面更加清晰逼真。(但仅在灰度图像上,L 通道在实验室空间上。)
**风格损失:**鼓励甘再现纹理细节的损失函数。(仅在 L 声道上)。通过匹配来自 VGG 19 的特征矩阵的 Gram 矩阵来完成。
像素损失/颜色损失:损失函数,帮助生成更忠实于用户输入纹理片的纹理细节,并添加颜色约束(仅在 AB 通道上)
以上是预训练阶段的总损失函数。
外部纹理微调
关于纹理 GAN 的训练的一个困难是作者没有应用不同纹理的同一物体的地面真实图像。(网络擅长生成高级特征,但机器人擅长生成低级纹理细节。)为了克服这一点,作者对网络进行了微调,以复制和传播他们没有地面真实输出的纹理。因此,作者保留了除样式损失之外的所有内容,并修改了像素和颜色损失。(带有附加损失函数)
**局部纹理损失:**一个损失函数(由三项组成),只适用于输出图像的小局部区域。
**局部对抗性损失:**损失函数,强制该对具有相同的纹理。
局部风格损失和像素损失:类似于上一节的像素和颜色损失,但仅适用于局部。
以上是外部微调级的最终损耗函数。
训练设置
作者使用了三个不同的数据集,其中包含了颜色、材料和图案的巨大差异。(对于从网络输出的图像,图像从 LAB 空间转换到 RGB,对于网络的输入,地面真实图像被处理以提取 5 通道图像。)
分割遮罩
由于作者只希望输出纹理的样本与输入纹理的样本相匹配,所以他们从图像的前景中采样小块。(所以背景纹理不再是问题)
预处理数据生成
对于草图生成,作者使用了 deep edge detection、Canny edge detection、xDoG,甚至包括合成草图。对于纹理补片,他们从地面真实图像中随机裁剪特定区域,并将其放置在随机调整大小的分割区域内。
用于微调的数据生成
此外,他们甚至通过谷歌搜索“皮革”一词并手动选择图像来收集更多数据。
培训详情
对于预训练,他们使用学习率为 1e-2 的 Adam Optimizer 进行微调 1e-3。损失函数的权重如下所示。
结果和讨论
如上所述,当作者关闭了原始损失函数中的一些损失项时。所生成图像的图像质量开始下降,这表明为了生成逼真的图像,需要所有的损失函数。
此外,作者还发现,对于变化较少的图像(如鞋子),GAN 即使没有外部纹理微调也能生成逼真的图像。然而,具有更复杂结构的图像,如手提包,外部纹理微调变得至关重要。(如上图。)下面是一些生成的结果。
结论
总之,本文作者提出了一种利用输入草图和纹理片控制深度图像合成的方法。他们的纹理 GAN 在生成各种不同纹理的真实图像方面做得非常好。这是由于复杂的损失函数和转换 RGB 图像到 LAB 颜色空间。
最后的话
由于神经网络是通用函数逼近器,设计一个好的损失函数是至关重要的。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请点击这里查看我的网站。
同时,在我的推特这里关注我,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 pos t。
参考
- (2018).Arxiv.org。检索于 2018 年 7 月 15 日,来自https://arxiv.org/pdf/1706.02823.pdf
- (2018).Scribbler.eye.gatech.edu。检索于 2018 年 7 月 15 日,来自http://scribbler.eye.gatech.edu/paper.pdf
[ CVPR 2018 /论文摘要]利用周期和形状一致性生成对抗网络翻译和分割多模态医学卷
原文:https://towardsdatascience.com/cvpr-2018-paper-summary-translating-and-segmenting-multimodal-medical-volumes-with-cycle-and-e6381b4a2690?source=collection_archive---------14-----------------------
GIF from this website
最有才华的研究员之一的有趣的论文之一。
请注意,这篇帖子是给未来的自己看的,回顾这篇论文上的材料,而不是从头再看一遍。
Paper from this [website](http://Translating and Segmenting Multimodal Medical Volumes with Cycle- and Shape-Consistency Generative Adversarial Network)
摘要
合成的医学数据(例如 CT 图像)有许多不同的用例。它可以用来增加训练数据的数量,也可以用来为放射治疗计划提供 x 射线衰减图。本文作者提出了一种跨通道合成方法,可以实现多通道的合成。
1)根据不成对的数据创建合成的 3D 逼真图像
2)确保一致的解剖结构
3)通过使用有限训练样本上的合成数据改进体积分割。
一个非常有趣的事实是,上述所有目标都可以通过端到端模型实现,该模型由互利的生成器和分段器组成。生成器通过对抗损失、循环一致性损失以及形状一致性损失来训练,这由分割器来监督。(以配合目标 2)。从分段器的角度来看,生成器创建了更多的训练数据供模型学习。并且作者表明,将该任务作为耦合网络来解决比试图单独解决更有益。
简介
目前在临床领域中,非常需要开发一种跨模态图像传输分析系统来辅助临床治疗。在医学领域,很难收集某些类型的数据,这不仅是因为患者的隐私问题,而且是因为在临床实践中还没有很好地建立新的成像模式。本文针对这两个问题,首先进行跨模态图像传输,其次利用生成的图像提高分割性能。
作者使用 GAN 的生成图像,但是,有几个问题。首先,必须保留图像中存在的器官的形状,因为它们捕获医疗信息;其次,从一开始就缺乏训练 gan 的数据会导致许多问题。本文的作者提出了一种通用的解决方案,其中,给定两种模态中的两组不成对的数据,网络通过利用从另一个域以端到端的方式翻译的合成数据,同时学习用于跨域体积到体积翻译的生成器和更强的分割器。他们使用了 4496 张核磁共振成像和计算机断层成像的心血管三维图像
相关工作
医学图像合成主要有两个目标,第一是从不同领域生成逼真的图像,第二是使用从不同领域生成的数据来提高分类任务的性能。并且在这方面已经做了相当多的工作,然而,还没有探索从未配对的跨域数据中学习。最后,一些其他研究包括对抗性学习被用作对分割或检测网络的额外监督。
提议的方法
在这一节中,作者首先从解释图像到图像的转换开始,然后转到卷到卷的转换。
未配对数据的图像到图像转换
最近,GAN 已被用于执行图像生成,如风格转移或有条件的 GAN。然而,对于正确的损失计算,成对数据并不总是可获得的。CycleGAN 和其他方法已经提出推广有条件 GAN。
不成对卷到卷翻译中的问题
缺乏直接监督是一个大问题,因为它在几何变换方面具有固有的模糊性。简而言之,当几何失真被平移回原始域时,它可以被恢复,而不会引起数据保真度成本的任何损失。
卷对卷循环一致性/形状一致性
首先,为了训练 GAN,作者使用了如下所示的成本函数。
此外,该论文的作者引入了更多的损失函数,包括分段网络,以保持由循环 GAN 生成的数据的形状。和下面的损失函数,也作为 GANs 的正则化。
多模态体积分割/目标
在 GAN 的训练期间,分割网络也被训练,并且当 GAN 创建更真实的数据时,分割器利用这些图像。
最终的损失函数可以在上面看到,λ和α是要调整的超参数,所有其他成本函数都在上面解释过。
网络架构和细节/培训细节
网络实际上对体数据使用 3D 卷积运算。因此,与 2D 卷积运算网络相比,训练要困难得多。此外,作者使用了实例规范化。本文的发电机网络受 U-Net 的影响较大,但下采样操作不太积极。鉴别器受 PatchGAN 影响,且对于分割网络,再次使用 U-Net 型网络。如上所述,我们可以看到作者的生成器网络在生成合成图像方面比纯循环 GAN 做得更好。
对于优化器,作者使用 Adam,他们在分割网络之前预训练生成器和鉴别器。最后,作者还降低了训练后期的学习率。
实验结果
作者使用了来自各种心血管疾病患者的 4354 次对比心脏 CT 扫描,以及 142 次采用新压缩传感扫描协议的心脏 MRI 扫描。(域 A 设置为 CT,域 B 设置为 MRI。)
跨域翻译评测
如上图所示,生成的图像没有显示任何几何变换,看起来非常逼真。此外,作者提出了一种 S-core 来评估合成图像的形状变化质量。较高的分数意味着在给定的图像中有较少的变换,我们可以看到作者的网络优于比较的网络。
分割评估
这里作者训练了两个分割网络,并遵循不同的方法来衡量性能。这两种不同的方法是临时方法和作者(端到端)方法。(如下图所示)
利用骰子点数,作者测量了不同方法的性能差异。并且我们可以观察到作者的方法给出了最佳性能。
上面是一个分割蒙版的例子,下面是性能图。
合成数据与真实数据之间的差距
减少真实数据和生成数据之间的分布差距是这个项目的关键。如下所示,与仅给出真实数据的基线骰子得分相比,作者的方法具有显著更小的差距。
结论
总之,本文作者成功地展示了在进行跨模态翻译时如何对医学图像进行分割的方法。这是通过具有从不成对的数据中学习、保持一般结构的 GAN 和能够利用所生成的合成数据的分段网络来实现的。
遗言
光是这一篇论文所做的实验数量就非同一般,难怪张是其中的佼佼者。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。我还实现了广残网,请点击这里查看博文 t。
参考
- 张中,杨,李,郑,于(2018)。基于周期和形状一致性生成对抗网络的多模态医学卷翻译和分割。Arxiv.org。检索于 2018 年 7 月 10 日,来自https://arxiv.org/abs/1802.09655
[ CVPR /论文摘要]再谈显著目标检测:多个显著目标的同时检测、排序和分类
原文:https://towardsdatascience.com/cvpr-paper-summary-revisiting-salient-object-detection-simultaneous-detection-ranking-and-b759a9226d63?source=collection_archive---------13-----------------------
GIF from this website
请注意,这篇帖子是为了我未来的自己复习这篇论文上的材料,而不是从头再看一遍。
Paper from this website
摘要
许多研究人员提出了显著对象检测任务的解决方案,然而本文的作者认为,迄今为止大多数工作都解决了一个相对不适定的问题。具体来说,当有多个观察者时,对于什么构成显著物体没有普遍的一致意见。(这意味着一些对象比其他对象排名更突出,并且在对象之间存在排名。).本文的作者提出了一种方法/数据集,其性能优于传统的和新提出的工作。
简介
大多数显著目标检测任务考虑单个显著目标或多个显著目标,但是它们没有考虑不同的人可以将一些目标排列得比其他目标更显著。(此外,一些物体可以被认为更普遍地突出。因此,在本文中,作者更广泛地考虑了显著对象检测的问题,其包括检测图像中的所有显著区域,并通过向不同的显著区域分配置信度来解决观察者之间的可变性。(如上所述,模型不仅检测图像中的所有显著对象,还对它们进行排序。).
显著物体检测/替换
卷积神经网络提高了许多涉及图像的任务的性能标准。一些 CNN 使用超像素方法来实现显著对象检测。其他方法包括使用快捷连接来聚合多级特征。本文的作者通过应用新的机制来控制网络中的信息流,同时重要的是包括一个隐含携带确定相对显著性所必需的信息的堆叠策略,来使用逐级细化。除了分割之外,最近的工作还包括对图像中的显著对象进行子分类,这涉及对图像中的显著对象进行计数。
提议的网络架构
用于粗略预测的前馈网络
对于这一部分,作者使用 ResNet-101 作为编码网络,生成特征图。此外,为了用自上而下的细化网络增强编码器网络的主干,作者首先附加一个额外的卷积层以获得嵌套的相对显著性堆栈(NRSS),然后附加堆栈卷积模块(SCM)以计算每个像素的粗略水平显著性分数。(作者对某些网络使用了 atrous 金字塔池。)
分阶段细化网络
大多数现有的工作共享一个公共的逐级解码结构来恢复每个像素的分类。这是因为尽管 CNN 中的最深层具有最丰富的可能特征表示,但是仅依靠解码阶段的卷积和解卷积来恢复丢失的信息可能会降低预测的质量。受此启发,作者提出了一种基于多级融合的细化网络,通过将初始粗略表示与在早期层表示的更精细特征相结合,来恢复解码阶段丢失的上下文信息。(该单元恢复丢失的空间信息,并对图像中呈现的对象的显著性进行分级。)
多级显著图融合/地面真实的堆叠表示
为了组合不同 SCM 做出的不同预测,作者在网络末端添加了一个融合层,将不同阶段的预测显著图连接起来。此外,作者生成了一组对应于不同显著性级别(由观察者间协议定义)的堆叠地面实况图。
显著物体分群网络
为了生成给定图像的置信度得分,作者再次使用 ResNet-101 作为基础模型,但去掉了最后一层。(并且已经附加了完全连接的网络以生成存在于输入图像中的 0、1、2、3 和 4+个显著对象的置信度得分,随后是另一个完全连接的层导致生成每个类别的最终置信度得分。
最后,作者为 Pascal-S 数据集创建了子分类基础事实,如上所述,可以看到图像中显著对象数量的分布。
实验
作者添加了多种不同的网络体系结构,它们是…..
RSDNet(expanded ResNet-101,NRSS,SCM),RSDNet-A(同 RSDNet 但 gt 标签缩放 1000,使网络学习更多对比度。)、RSDNet-B (atrous 金字塔池模块)、RSDNet-C (RSDNet-B +地面实况缩放)、RSDNet-R(具有逐级秩感知细化单元的 RSDNet+多级显著图融合)。).
数据集和评估指标
作者使用了 PASCAL 的数据集,并将图像分成两个子集,425 个用于训练,425 个用于测试。使用的指标包括精确召回(PR)曲线、F-measure(沿曲线的最大值)、ROC 曲线下面积(AUC)和平均绝对误差(MAE)。此外,作者还引入了显著对象排序(SOR)分数来评估显著对象的排序。
从上表可以明显看出,RSDNet-R 优于许多现有技术方法。值得注意的是,尽管作者的模型是在 Pascal-S 数据的子集上训练的,但它优于其他也利用大规模显著性数据集的算法。(即使没有 CRF)。最后一列(SOR)分数也是作者发明的新度量分数。
如上所述,作者的方法能够生成最接近地面真实遮罩的显著图。
即使在其他任务上,如显著对象子分类,作者的方法也优于现有的方法。(需要注意的是,没有很多其他基线可以与这个分数进行比较。).
检查嵌套的相对显著性堆栈
当作者对嵌套的相对显著性堆栈进行主成分分析,并以 RGB 图像的形式可视化时,我们可以看到这三个分量本身就足以看出显著对象的排序。
结论
作者提出了一种神经框架,不仅可以检测给定图像中的显著对象,还可以根据它们的显著性对它们进行排序。他们的方法不仅优于传统方法,也优于新提出的方法。
遗言
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。我也实现了广残网,请点击这里查看博文 pos t。
参考
- (2018).Openaccess.thecvf.com。检索于 2018 年 9 月 11 日,来自http://open access . the CVF . com/content _ cvpr _ 2018/camera ready/2523 . pdf
Photo by Scott Webb from Pexels
网络安全:定义、持续时间、破坏和欺骗,Simon Smith eVestigator 网络调查员兼硕士
原文:https://towardsdatascience.com/cybersecurity-definition-duration-devastation-and-deception-simon-smith-cyber-investigator-44e5a14637ed?source=collection_archive---------5-----------------------
Cybersecurity: Definition, Duration, Devastation and Deception, Simon Smith eVestigator — Cyber Forensics Expert
西蒙·史密斯
我叫西蒙·史密斯。不认识我的人可以查看我在https://www.linkedin.com/in/simonsmithinvestigator的个人资料
我被要求解释我对所谓的“网络安全人才短缺”的立场。我花了一些时间,所以我想分享我的答案。这可以结合与工作相关的事实证据来理解:
https://www . LinkedIn . com/feed/update/urn:Li:LinkedIn article:6268034510613544960
网络安全——由于所谓的“网络安全人才短缺”而出现的新一批专家(的确如此),政府和我听说的一些人提出的培训方法近乎疏忽。
有基础技能。这就像去参加第五节丹黑带课程,是的,那天晚上你可能学了 1 个动作,而且那天晚上还能重复。第二天你会忘记的,这对你来说并不自然,因为你没有在过去的 20 年里通过等级和基础技能达到目的,而这些技能是掌握手臂、臀部、腿部和头部每一个动作的必备艺术。您错过了“手臂学派”、“腿学派”教导的重要元素,因为它们相互依赖。如果一个人不工作,他们都不会工作。你没有达到那个更高的水平。那天晚上你做的是一个短期记忆运动,不是经过身体训练的自然运动。
你旁边的第五个丹甚至没有想到任何来自“手臂学校”或“臀部学校”的训练,因为它是内置的。这就像呼吸。这很自然。他无缝地完成了这个动作,可以重做或完美地适应它,而不需要使用任何记忆,而是利用他身体的自然本能“随波逐流”,就像呼吸一样。
网络安全不是每个人的“行业”。这是一个级别,一个级别,一种方式。这是一门学科。这需要成为 6 个或更多“行业”的专家。这不是一份你可以直接学习的工作——它必须从你对其他行业专业知识的直觉知识中感受到。这就像呼吸,很自然。你需要打好基础。
这个组织有两扇门和一个秘密的活板门。一个输入门和一个输出门和一个地下室。然后,您需要理解通过这些门以任何方式进入的每个元素的“输入和输出”的工作方式。这包括数字、人力、文档、业务、流程、培训、监控、审核、账单、费用、整个业务。所有在里面被完全计算出来的东西都在活板门中被过滤,所有通过的东西都需要和下面描述的一样的等级。我可以更进一步,但这超出了范围,人们可能会在大师课上问这个问题。
这个原则留待以后讨论。关于技能短缺和风险或无风险的话题,我已经在上面和文章中提到了。我想说的是,人们似乎认为他们可以参加课程并报名参加,即使你可以,你还想参加吗?
发生网络犯罪时,谁会受到损失?
最终,股东和所有人都失去了工作,或者有人失去了生命、自由或隐私(或者数百万)。
谁负责?
会议室。因此,他们必须而且在很多地方被引用,如果不是负责公司生活的网络安全人员的话。网络安全是董事会和立法关注的问题,这是事实,也是不争的事实。这不是一份你可以在下班时带些食物回家的工作,而是:
- 你做对了,公司就能生存;
- 你做错了,公司就完蛋了。
除了生命受到威胁,这也是网络勒索和网络跟踪的一部分,该公司将面临法定罚款。如果你认为网络保险就是答案,请三思。仔细阅读政策。
现实生活:
**事实:**凭经验,我见过。公司停工也会毁掉公司,不仅仅是罚款。我甚至没有提到我参与的无数死亡威胁、诱拐儿童、邪教、强奸、自杀和网络跟踪案件,其中包括诱捕、勒索和一起持枪案件。
对于那些新手来说,如果你不说出自己的名字,我来说。如果我认为你会危及这个行业,我建议你参考这篇文章:
这完全是一种行业误解。公司可以选择雇佣他们想要的人,但在他们理解网络安全的定义(包括澳大利亚政府)甚至谷歌和脸书之前,你将继续拿生命、身份、安全和工作冒险,这不是我们任何一方想要生活的世界。
座右铭——你不能取代人类的优秀——你可以帮助它
记住,人类是任何系统中最薄弱的一环。技术第二!
🏆在 2018 年 12 月之前投票选出西蒙·史密斯为 2018 年度网络专业人士:
https://Cyber security-Excellence-awards . com/candidates/Simon-Smith/
在 LinkedIn 上连接见解和媒体请求:https://www.linkedin.com/in/simonsmithinvestigator
http://www.cybersecurity.com.au
http://www.cyberblog.com.au,
http://www.evestigatortestimonials.com.au
点击这里通过我的 YouTube 频道订阅所有媒体采访:https://www.youtube.com/c/evestigatorAu/?sub_confirmation=1
CycleGAN:学习翻译图像(无配对训练数据)
原文:https://towardsdatascience.com/cyclegan-learning-to-translate-images-without-paired-training-data-5b4e93862c8d?source=collection_archive---------4-----------------------
An image of zebras translated to horses, using a CycleGAN
图像到图像转换是将图像从一个领域(例如,斑马的图像)转换到另一个领域(例如,马的图像)的任务。理想情况下,图像的其他特征——与任何一个领域都不直接相关的任何东西,例如背景——应该保持可识别的相同。正如我们可以想象的,一个好的图像到图像的翻译系统可以有几乎无限的应用。改变艺术风格,从素描到照片,或者改变照片中风景的季节只是几个例子。
Examples of paired and unpaired data. *Image taken from the paper.
虽然对这项任务有大量的研究,但大多数都利用了监督的训练,在那里我们可以访问( x , y )对来自我们想要学习在两个领域之间进行翻译的相应图像。CycleGAN 是在伯克利分校的 2017 年论文中介绍的,使用循环一致的对抗网络进行不成对的图像到图像翻译。这很有趣,因为不需要成对的训练数据——虽然仍然需要一组 x 和 y 图像,但它们不需要彼此直接对应。换句话说,如果你想在草图和照片之间进行转换,你仍然需要在一堆草图和一堆照片上进行训练,但是草图不需要是数据集中的精确照片中的*。*
由于配对数据在大多数领域中很难找到,甚至在某些领域中不可能找到,因此 CycleGAN 的无监督训练功能非常有用。
它是如何工作的?
两台发电机的故事
CycleGAN 是一个生成式对抗网络(GAN ),它使用两个生成器和两个鉴别器。(注意:如果您不熟悉 GANs,您可能想在继续之前阅读一下关于它们的内容)。
我们称其中一个生成器为 G ,让它将图像从 X 域转换到 Y 域。另一个生成器称为 F ,将图像从 Y 转换为 X 。
Both G and F are generators that take an image from one domain and translate it to another. G maps from X to Y, whereas F goes in the opposite direction, mapping Y to X.
每个发生器都有一个相应的鉴别器,用于区分合成图像和真实图像。
One discriminator provides adversarial training for G, and the other does the same for F.
目标函数
循环目标函数有两个组成部分,一个对抗损失和一个循环一致性损失。两者对于获得好的结果都是必不可少的。
如果你熟悉 GANs,这种对抗性的失败应该不会让人感到意外。这两个生成器都试图“愚弄”它们对应的鉴别器,使其无法区分它们生成的图像和真实版本。我们使用最小二乘损失(由毛等人发现比典型的对数似然损失更有效)来捕捉这一点。
然而,仅仅是对抗性的损失不足以产生好的图像,因为它使模型受到约束。它强制生成的输出是适当的域,但是没有强制输入和输出是可识别的相同。例如,一个生成器输出图像 y 是该领域一个很好的例子,但是看起来一点也不像 x ,按照对抗性损失的标准,它会做得很好,尽管没有给出我们真正想要的。
周期一致性丢失解决了这个问题。它依赖于这样的期望,如果你将一个图像转换到另一个域,然后再转换回来,通过连续地将它输入两个生成器,你应该得到与你输入的相似的东西。它强制执行F(G(x)≈x和G(F(y)≈y)。
我们可以通过将这些损失项放在一起,并用超参数λ对循环一致性损失进行加权,来创建完整的目标函数。我们建议设置λ = 10。
发电机架构
每个周期信号发生器有三个部分:一个编码器,一个变压器,和一个解码器。输入图像被直接输入编码器,这样可以缩小图像的大小,同时增加通道的数量。编码器由三个卷积层组成。产生的激活然后被传递到转换器,一系列的六个剩余块。然后由解码器再次扩展,解码器使用两个转置卷积来扩大表示大小,并使用一个输出层来产生最终的 RGB 图像。
具体可以看下图。请注意,每一层后面都有一个实例规范化层和一个 ReLU 层,但为了简单起见,这些都被省略了。
An architecture for a CycleGAN generator. As you can see above, the representation size shrinks in the encoder phase, stays constant in the transformer phase, and expands again in the decoder phase. The representation size that each layer outputs is listed below it, in terms of the input image size, k. On each layer is listed the number of filters, the size of those filters, and the stride. Each layer is followed by an instance normalization and ReLU activation.
由于生成器的架构是完全卷积的,一旦经过训练,它们就可以处理任意大的输入。
鉴别器架构
鉴别器是 PatchGANs,这是一种全卷积神经网络,它查看输入图像的“补丁”,并输出该补丁“真实”的概率。这不仅比试图查看整个输入图像的计算效率更高,而且也更有效——它允许鉴别器专注于更多的表面特征,如纹理,这通常是在图像转换任务中被改变的那种东西。
如果你读过其他图像到图像的翻译系统,你可能已经熟悉 PatchGAN。在 CycleGAN 发表论文时,Isola 等人已经在使用条件对抗网络的图像到图像翻译中成功地将 PatchGAN 版本用于成对图像到图像的翻译。
An example architecture for a PatchGAN discriminator. PatchGAN is a fully convolutional network, that takes in an image, and produces a matrix of probabilities, each referring to the probability of the corresponding “patch” of the image being “real” (as opposed to generated). The representation size that each layer outputs is listed below it, in terms of the input image size, k. On each layer is listed the number of filters, the size of those filters, and the stride.
正如您在上面的架构示例中所看到的,PatchGAN 将表示大小减半,并将通道数量加倍,直到达到所需的输出大小。在这种情况下,让 PatchGAN 评估 70x70 大小的输入补丁是最有效的。
减少模型振荡
为了防止模型从一次迭代到另一次迭代发生剧烈变化,鉴别器被提供了生成图像的历史,而不仅仅是由最新版本的生成器生成的图像。为此,我们保留一个池来存储最近生成的 50 幅图像。这种减少模型振荡的技术是由 Shrivastava 等人在通过对抗训练从模拟和无监督图像中学习开创的。
其他培训详情
这种训练方法对于图像到图像的翻译任务来说是相当典型的。Adam optimizer 是梯度下降的一种常见变体,用于使训练更加稳定和高效。在训练的前半部分,学习率被设置为 0.0002,然后在剩余的迭代中线性降低到零。批处理大小被设置为 1,这就是为什么我们在上面的架构图中提到实例规范化,而不是批处理规范化。
优势和局限性
总的来说,CycleGAN 产生的结果非常好——在许多任务中,图像质量接近成对图像到图像的翻译。这令人印象深刻,因为配对翻译任务是一种完全监督学习的形式,而这不是。当 CycleGAN 的论文问世时,它轻而易举地超越了当时可用的其他无监督图像翻译技术。在“真实对虚假”的实验中,人类在大约 25%的时间里无法区分合成图像和真实图像。
CycleGAN can be used for collection style transfer, where the entire works of an artist are used to train the model. *Image taken from paper.
如果您计划将 CycleGAN 用于实际应用,了解它的优势和局限性是很重要的。它适用于涉及颜色或纹理变化的任务,如白天到晚上的照片翻译,或照片到绘画的任务,如收藏风格转移(见上文)。然而,需要对图像进行大量几何改变的任务,例如猫对狗的翻译,通常会失败。
A very unimpressive attempt at a cat-to-dog image translation. Don’t try to use a CycleGAN for this. *Image taken from paper.
对训练数据的翻译通常比对测试数据的翻译好得多。
结论
感谢阅读!我希望这是一个有用的概述。如果你想看更多的实现细节,你可以参考一些很棒的公共实现。如果你对这篇文章有任何问题、修正或建议,请留下你的评论。
CycleGANS 和 Pix2Pix
原文:https://towardsdatascience.com/cyclegans-and-pix2pix-5e6a5f0159c4?source=collection_archive---------0-----------------------
演职员表:展示这些博客的节略版,解释 pix2pix 和 cycleGANs 背后的思想和概念。
克里斯多夫·黑塞 博客:
[## 张量流——仿射层中的像到像转换
确保你已经安装了 Tensorflow 0.12.1 首先 python -c "导入 tensor flow;打印(tensorflow。version)" …
affinelayer.com](https://affinelayer.com/pix2pix/)
Olga Liakhovich 博客:
[## 用 CycleGANs 学习图像到图像的翻译
我们最近与全球图片社 Getty Images 合作,探索图像到图像的翻译…
www.microsoft.com](https://www.microsoft.com/developerblog/2017/06/12/learning-image-image-translation-cyclegans/)
像素 2 像素:
论文:https://phillipi.github.io/pix2pix/
pix2pix 使用条件生成对抗网络(cGAN)来学习从输入图像到输出图像的映射。
数据集的一个例子是输入图像是黑白图片,而目标图像是图片的彩色版本。在这种情况下,生成器试图学习如何给黑白图像着色。鉴别器正在查看生成器的彩色化尝试,并试图了解生成器提供的彩色化与数据集中提供的真实彩色化目标图像之间的差异。
发生器的结构称为“编码器-解码器”,在 pix2pix 中,编码器-解码器大致如下:
这些体积是为了给你一种感觉,它们旁边的张量维度的形状。本例中的输入是一个 256x256 的图像,具有 3 个颜色通道(红色、绿色和蓝色,对于黑白图像都是相同的),输出是相同的。
生成器获取一些输入,并试图用一系列编码器(卷积+激活函数)将其减少为更小的表示。这个想法是,通过以这种方式压缩它,我们有希望在最终编码层之后获得数据的更高级表示。解码层执行相反的操作(去卷积+激活功能),并反转编码器层的动作。
为了提高图像到图像变换的性能,作者使用了一个“U-Net”来代替编译码器。这是同样的事情,但是“跳过连接”直接将编码器层连接到解码器层:
如果不需要编码/解码部分,跳过连接为网络提供了绕过编码/解码部分的选项。
这些图表是一个轻微的简化。例如,网络的第一层和最后一层没有批范数层,而中间的几层有丢失单元。
鉴别器
鉴别器的工作是获取两个图像,一个输入图像和一个未知图像(它将是来自生成器的目标或输出图像),并决定第二个图像是否是由生成器生成的。
该结构看起来很像发生器的编码器部分,但工作方式略有不同。输出是 30×30 的图像,其中每个像素值(0 到 1)表示未知图像的相应部分的可信度。在 pix2pix 实现中,这个 30x30 图像的每个像素对应于输入图像的 70x70 补丁的可信度(由于输入图像是 256x256,所以补丁重叠很多)。这种架构被称为“PatchGAN”。
训练
训练这个网络有两个步骤:训练鉴别器和训练生成器。
为了训练鉴别器,生成器首先生成输出图像。鉴别器查看输入/目标对和输入/输出对,并猜测它们看起来有多真实。然后基于输入/输出对和输入/目标对的分类误差来调整鉴别器的权重。
然后基于鉴别器的输出以及输出和目标图像之间的差异来调整发生器的权重。
Discriminator and Generator training
CycleGANs
原创 CycleGAN 论文
虽然 PIX2PIX 可以产生真正神奇的结果,但挑战在于训练数据。您想要学习转换的两个图像空间需要预先格式化为一个包含两个紧密相关图像的 X/Y 图像。根据您尝试在两种图像类型之间进行转换,这可能会很耗时、不可行,甚至是不可能的(例如,如果两个图像配置文件之间没有一对一的匹配)。这就是 CycleGAN 的用武之地。
CycleGANs 背后的关键思想是,他们可以建立在 PIX2PIX 架构的能力上,但允许你将模型指向两个离散的、不成对的图像集合。例如,一个图像集合,组 X,将充满阳光海滩照片,而组 Y 将是阴天海滩照片的集合。CycleGAN 模型可以学习在这两种美学之间转换图像,而无需将紧密相关的匹配合并到单个 X/Y 训练图像中。
CycleGANs 能够在没有明确的 X/Y 训练图像的情况下学习如此出色的翻译的方法包括引入一个完整翻译周期的概念,以确定整个翻译系统有多好,从而同时改进两个生成器。
这种方法是 CycleGANs 为图像到图像的翻译带来的巧妙力量,以及它如何在非配对图像风格之间实现更好的翻译。
最初的 CycleGANs 论文“使用循环一致对抗网络的不成对图像到图像的翻译”由朱俊彦等人发表。
损失函数
CycleGANs 的强大之处在于他们如何设置损失函数,并使用全周期损失作为额外的优化目标。
作为复习:我们正在处理 2 个生成器和 2 个鉴别器。
发电机损耗
让我们从发电机的损耗函数开始,它由两部分组成。
第 1 部分:如果伪造(生成)的图像非常好,鉴别器无法区分这些图像与真实图像,则生成器成功。换句话说,鉴别器对假图像的输出应该尽可能接近 1。在张量流术语中,发电机希望最小化:
g_loss_G_disc = tf.reduce_mean((discY_fake — tf.ones_like(discY_fake)) ** 2)g_loss_F_dicr = tf.reduce_mean((discX_fake — tf.ones_like(discX_fake)) ** 2)
注意:上面的“**”符号是 Python 中的幂运算符。
第 2 部分:我们需要捕捉循环损耗:当我们使用另一个发生器从一个发生器回到图像的原始空间时,原始图像(我们开始循环的地方)和循环图像之间的差异应该被最小化。
g_loss_G_cycle = tf.reduce_mean(tf.abs(real_X — genF_back)) + tf.reduce_mean(tf.abs(real_Y — genG_back))g_loss_F_cycle = tf.reduce_mean(tf.abs(real_X — genF_back)) + tf.reduce_mean(tf.abs(real_Y — genG_back))
最后,发电机损耗是这两项之和:
G _ loss _ G = G _ loss _ G _ disc+G _ loss _ G _ 循环
因为循环损耗非常重要,所以我们想增加它的影响。我们为这个乘数使用了一个 L1λ常数(在论文中使用了值 10)。
现在发电机损耗的大结局看起来像:
G _ loss _ G = G _ loss _ G _ disc+L1 _λ* G _ loss _ G _ cycle
g _ loss _ F = g _ loss _ F _ disc+L1 _ 拉姆达* g_loss_F_cycle
鉴频器损耗
鉴别器需要做出两个决定:
- 真实图像应标记为真实(推荐值应尽可能接近 1)
- 鉴别器应该能够识别生成的图像,从而预测假图像为 0。
DY_loss_real = tf.reduce_mean((DY — tf.ones_like(DY))** 2)DY_loss_fake = tf.reduce_mean((DY_fake_sample — tf.zeros_like(DY_fake_sample)) ** 2)DY_loss = (DY_loss_real + DY_loss_fake) / 2DX_loss_real = tf.reduce_mean((DX — tf.ones_like(DX)) ** 2)DX_loss_fake = tf.reduce_mean((DX_fake_sample — tf.zeros_like(DX_fake_sample)) ** 2)DX_loss = (DX_loss_real + DX_loss_fake) / 2
D3 . js——现在就把它作为定制的模块化包使用吧!!
原文:https://towardsdatascience.com/d3-js-the-custom-modular-bundle-now-bebd6f25bc8b?source=collection_archive---------0-----------------------
Charts created using D3 — https://github.com/richavyas/D3-Charts
我们今天呼吸数据!!!!
当今是一个大数据世界,我们每天都在与数字打交道。数字是迷人的,但让我们都同意,阅读这些数字是令人生畏的,也是令人疲惫的。这就是数据可视化的起源!!!
我从事数据可视化已经有几年了。2013 年,当我开始研究数据的最佳工具 viz 时,几乎没有任何挣扎, D3.js 赢得了这场战斗。我在很多地方读到过它的学习曲线和复杂性,但我是一名 JavaScript 工程师,它对我很有用。这里有大量的例子'' https://bl.ocks.org/mbostock'和超级支持的 D3 社区,像我这样的人可以使用现有的,并根据具体要求创建自定义图表。
与此同时,我们的网络社区正在发生变化,它正在向模块化冲刺。 NPM ,没有处方药也没有狂欢的流浪艺人,LOL,接管了几乎每一个框架,它已经成为一个最强大的规范,将软件包作为依赖项安装,而不是将任何东西作为外部资源加载。
重点是只进口需要的东西。
在这个阶段,当 D3 v4.0.0 在 6 月份发布时,支持 ES6 并包含所有的导入/导出语句就不足为奇了。
我两天前开始用它做实验。从官方文档来看,D3 4.0 是一个模块的集合,这些模块被设计成一起工作;您可以单独使用这些模块,也可以将它们作为默认构建的一部分一起使用。最后一行, 你可以一起使用它们作为默认构建的一部分 是我花时间在这上面的最有说服力的原因。
我拿了 D3 的线图,https://bl.ocks.org/mbostock/3883245,,并打算使用 ES2015 模块和汇总构建一个定制的 D3 4.0 捆绑包。
让我们谈谈代码。
d3 折线图是 d3 形状模块的一部分,有更多的依赖关系,如 d3 刻度、d3 轴、D3 选择等。
代码库可以在这里查看:https://github.com/richavyas/d3-v4-line-chart
D3.js
此文件包含来自其他模块的导入语句,默认情况下会导出这些语句。
package.json
提到了 npm 安装的依赖关系。
它有一个关键步骤:
" build ":" roll up-c | uglifyjs-c-m > D3 . min . js "
它仅为要包含的模块创建缩小的 d3 文件。
汇总.配置
npm 导入/导出和默认的文件
index.html
负责图表创建的文件,包括,而不是整个 d3.js 库。
怎么建???
- npm 安装
- npm 运行构建
- http-服务器
这将启动一个节点服务器,并生成一个 D3 折线图,如下所示:
灵感来源于迈克的枪托原帖:https://bl.ocks.org/mbostock/3883245
这个 D3 V4 折线图定制包经过优化,只包含您需要的代码。感谢阅读。❤️,如果你觉得值得分享的话。
叙利亚内战造成的破坏:数据说明了什么
原文:https://towardsdatascience.com/damage-caused-by-the-syrian-civil-war-what-the-data-say-ebad5796fca8?source=collection_archive---------4-----------------------
Jobar neighborhood, Damascus, 2018–02–27 (Source).
七年多的战争让整个叙利亚城市成为废墟。数字还不清楚,但据估计重建这个国家将花费大约 2000 亿美元。
利用 2013 年至 2017 年拍摄的卫星图像, UNOSAT (训研所的业务卫星应用方案)对叙利亚八个最大的城市进行了全面的损害评估。
我研究了 UNOSAT 的数据,在这篇文章中,我解释了我的发现。
数据
联合国组织卫星数据是通过目视检查 2013 年 9 月至 2017 年 11 月期间拍摄的高分辨率卫星图像收集的。检测到的受损结构分为四类:1) 中度受损,2) 严重受损,3) 毁坏,或 4) 无可见损坏。评估了叙利亚最大的八个城市,即阿勒颇、大马士革、德拉、代尔祖尔、哈马、霍姆斯、伊德利卜和拉卡(图 1)。不同城市的评估重复了不同的时间。数据以 shapefile 和 geodatabase 格式提供下载。
Figure 1: Cities assessed by UNOSAT.
评估摘要
截至 2017 年 11 月,共有 109,393 个检测到的受损结构。2016 年见证了最高的破坏,共有 77,568 个结构(图 2-左)。
37%检测到的结构被中度损坏。 35.3%为严重损坏,其余 27.7%为毁坏(图 2—右图)。
阿勒颇占受损建筑总数的 32.7%(图 2 —中间)。
Figure 2: Summary of UNOSAT assessment.
损伤计数与密度
阿勒颇共有 35,691 座受损建筑,是受损数量最多的城市。其次分别是大马士革、拉卡、霍姆斯、哈马、代尔祖尔、德拉和伊德利卜(图 3—左)。
另一方面,拉卡的受损密度(单位面积受损建筑的数量)最高,其次是霍姆斯、代尔祖尔、大马士革、哈马、阿勒颇、伊德利卜和德拉(图 3 —右)。
值得注意的是,阿勒颇(破坏数量排名第一)的破坏密度是拉卡的 40%(图 3 —右图)。
Figure 3: Damaged structures: count (left), and density (right).
中度损坏的结构
阿勒颇以 16256 座中度受损建筑的数量位居第一。其次分别是大马士革、拉卡、霍姆斯、代尔祖尔、哈马、伊德利卜和德拉(图 4 —左)。
伊德利卜的 m 中度受损结构(被归类为中度受损的结构比例)最高。另一方面,哈马的中度受损的建筑仅占该市总数的 6%。这意味着,无论是严重受损的还是被毁的构筑物,都占到了城市受损构筑物的 94%(图 4 —中)。
拉卡的中度损坏结构密度最高(图 4 —右图)。
Figure 4: Moderately damaged structures: count (left), ratio (middle), and density (right).
严重受损的结构
阿勒颇再次成为严重受损建筑数量第一的城市,共有 14671 座建筑。其次分别是大马士革、霍姆斯、拉卡、代尔祖尔、哈马、德拉和伊德利卜(图 5 —左)。
霍姆斯的严重受损建筑比例最高。阿勒颇紧随其后,位居第二(图 5 —中间)。
至于严重破坏的密度,霍姆斯和拉卡以几乎相似的值占主导地位(图 5 —右图)。
Figure 5: Severely damaged structures: count (left), ratio (middle), and density (right).
被毁的建筑
哈马在被摧毁的建筑的数量(图 6-左)、比例(图 6-中)和密度(图 6-右)上都排在第一位。注意哈马 90%的受损建筑是如何被摧毁的。
Figure 6: Destroyed structures: count (left), ratio (middle), and density (right).
重建的结构
总共有 1153 个重建的结构(结构从损坏到无可见损坏)。哈马的建筑数量最多,有 353 座。大马士革没有(图 7-左)。另一方面,代尔祖尔的重建结构密度最高(图 7 —右)。
Figure 7: Reconstructed structures: count (left), and density (right).
摘要
- 利用 2013 年至 2017 年期间拍摄的卫星图像,联合国组织卫星评估了叙利亚八个最大城市的损失。
- 截至 2017 年 11 月,检测到的受损结构总数为 109,393 个。
- 阿勒颇占受损建筑总数的 32.7%。
- 拉卡的受损建筑密度最高。
- 哈马拥有最高数量和密度的被摧毁的建筑。
- 总共有 1153 个重建的结构。哈马的票数最高。代尔祖尔的密度最高。
敢于在数据科学社区中与众不同
原文:https://towardsdatascience.com/dare-to-be-different-in-the-data-science-community-6a3a275230a9?source=collection_archive---------1-----------------------
如果您想提高对某个问题的认识或倡导一项重要的事业,将数据科学作为您的工具,该怎么办?作为一名数据科学家,这种想法可能会让你非常兴奋:让问题变得明朗,用数据让故事变得生动。但是,如果你的专业知识没有明确的定位,你该怎么办呢?如果您的主题目前在数据科学社区中不可见,该怎么办?
吹响号角:
好消息:您可以利用您的独特性来推动您在数据科学社区中想要做的事情。你题材的独特性就是你的优势。
1。拥抱你的融合存在
作为一名数据科学家,我相信你一定认得这张图。
Data Science Venn Diagram- Courtesy of Drew Conway Site
作为复习,当我们第一次接触数据科学领域时,这张图表概述了哪些技能是必需的。
不要把这些技能看成是孤立的,而是拥抱这些领域的交汇点。寻找可以让你探索自己专业知识的社区项目。例如,考虑提出你自己的基于数据的项目。
- 例 1:体育数据分析
Mara Averick 是一名狂热的体育迷和数据分析师,他将两者结合起来探索数据:点击此处查看她关于体育数据分析的讨论:
Mara Averick 的项目讨论
- 例 2:诗歌与 AI
Joy Buolamwini,诗人、企业家和麻省理工学院研究生研究员,一直倡导人工智能中的偏见,并使用许多工具就这一主题进行交流,包括诗歌。点击这里查看她的作品:
Joy Buolamwini 的项目
2。坚持自己的独特性
在数据科学领域挑战自我的最佳方式是规划自己的道路。找到没有被强调的地方,将你的天赋与你在一个尚不存在的领域的发展联系起来 。
这个领域的伟大之处在于,几乎所有东西都是新的,都是开放创新的。直到 2008 年,“数据科学家”这个头衔才被创造出来(9 年多前!)。这门学科对任何事情都开放。
如果你觉得你的话题可能太晦涩或者太独特,记住:你的独特就是你的优势。让我们的领域如此令人兴奋的是,新的想法和新的声音经常会受到好奇和欢迎。
今年初夏,芝加哥大学数据科学与政策中心举办了 2017 年数据科学促进社会公益大会的公开提案会议。我对提交犹豫不决。在我脑海里盘算着我的提议不会被批准的所有可能性。1.我不在学术附属机构 2。我不在数据科学团队工作。甚至在我犹豫的时候,我利用了我认为“不足”的东西,并把它们作为杠杆点。我的主题演讲是关于作为一名单独的数据科学家开发一个社区数据项目**(利用不在团队中的优势)**。有一次,我被选中参加一个演讲机会,我意识到我是唯一一个来自公共图书馆的演讲者(利用作为不同附属组织的一部分)。所以,即使你觉得自己不具备抓住机会的条件,也要抓住它。忽略内心的对话。
Excerpt Photo’s from Presentation
永远要认识到你独特视角的价值。
3。继续前进
一旦你开始走上自己独特的道路,就要一直向前。这种向前的情绪,是由一个以他的独特性铺平了自己的道路并一直向前推进的人华特·迪士尼表达的。
“在这里,我们不会长久地向后看。我们不断前进,打开新的大门,做新的事情,因为我们很好奇……好奇心不断引领我们走上新的道路。”
Photo Courtesy of Pixabay
请记住这些提示
1.好奇。
不要让你的犹豫或抗拒阻止你。保持谦逊。提问。
有意识地把握你要抓住的机会,这样你就能继续增强自己独特的声音。
2.建立并加强你的人际网络。有意接触他人。与人见面。向你渴望成为的人学习。当你发现自己的技能有差距时,寻求帮助。对你着手寻找的机会要坚持不懈。
在工作中拓展和延伸自己。不要只是突破你的舒适区,而是迭代到另一个增长水平。
我希望这条信息能引起你的共鸣,尊重并接受你在数据科学方面的独特观点。拥抱自己的观点让我受益匪浅,我得到了一个演讲的机会,而且几乎马上就有了另一个机会。
Dash:初学者指南
原文:https://towardsdatascience.com/dash-a-beginners-guide-d118bd620b5d?source=collection_archive---------11-----------------------
简单介绍该库框架的特性和优点,以便用纯 Python 构建 web 应用程序。
作为一名数据科学家,我们工作中最不可或缺的一个方面就是向“非数据科学家”传递和显示数据,以提供可视的可操作数据的格式。在我看来,我们工作中最酷的部分之一就是与数据互动,尤其是在有视觉互动的时候。当我们想要构建一个交互式应用时,我们可以选择一个叫做 Dash 的框架。Dash 是一个用于构建 web 应用程序的开源 Python 框架,由 Plotly 的人员创建和维护。Dash 的网络图形是完全交互式的,因为框架是建立在 Ploty.js 之上的,Ploty 编写和维护的 JavaScript 库。这意味着在将 Dash 框架导入 Python 文件后,您可以构建一个完全用 Python 编写的 web 应用程序,而不需要其他语言。
如果你是编码新手,你可能会对自己说,“一个框架听起来像一个库…有什么不同?”很高兴你问了!
Library vs. Framework
“控制反转是框架不同于库的关键部分。库本质上是一组你可以调用的函数,现在通常被组织成类。每个调用都做一些工作,并将控制权返回给客户端。框架体现了一些抽象的设计,内置了更多的行为。为了使用它,你需要通过子类化或者插入你自己的类,把你的行为插入到框架的不同地方。然后框架的代码在这些点上调用你的代码。”
——马丁·福勒——
库和框架的关键区别在于“控制”是颠倒的。当你从一个库中调用一个方法时,你是在控制中。然而,对于框架来说,控制是相反的;框架召唤你。想到这个概念的一个简单方法是好莱坞原则——“不要打电话给我们,我们会打电话给你。”
“Dash 应用程序代码是声明性和反应性的,这使得构建包含许多交互元素的复杂应用程序变得容易。”
-https://github.com/plotly/dash
让我们把它分解成更简单的术语。声明式编程是一种构建计算机程序的技术,其中程序员只声明所需结果的属性,而不声明如何计算它。这种风格基本上是告诉你程序应该完成什么,而不是要遵循的具体步骤顺序。“如何做”取决于程序的解释者。假设你有掌握烘焙技巧的朋友,我会打个比方。声明式编程就像让你的朋友给你做蛋糕一样。你不关心他们是怎么做的;这个过程取决于他们。声明性语言的一个例子是 SQL,一种数据库查询语言。
让我们来看看 Dash 的一些动作:
你可以在这里找到安装说明:【https://dash.plot.ly/installation。因为您将使用 Python,所以您只需学习一些关于编写 Dash 应用程序的语法。一个松散定义的格式应该是这样的:1)导入必要的框架和库。2)提供布局,包括输入和输出。3)提供你的应用程序将如何与用户交互。
前两个例子是相当简单的应用程序,分别用 43 行和 59 行代码编写。
应用程序的每个时尚组件都可以定制,并完全控制交互性。
正如我们在 Goldman Sachs 报告原型中看到的,Dash report 应用程序具有高度定制化、时尚化和直观化的能力。应用可以是对人类和老鼠大脑的 3d 探索,或者是一个物体探测器,它可以实时提供复杂视频中发生的事情的有用可视化(下面的例子)。无数的可能性是相当惊人的。
代码是什么样子的?
下面是一个很酷的 Dash 应用程序的例子,它只用了 56 行代码:
import dash
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Outputexternal_stylesheets = ['[https://codepen.io/chriddyp/pen/bWLwgP.css'](https://codepen.io/chriddyp/pen/bWLwgP.css')]app = dash.Dash(__name__, external_stylesheets=external_stylesheets)all_options = {
'America': ['New York City', 'San Francisco', 'Cincinnati'],
'Canada': [u'Montréal', 'Toronto', 'Ottawa']
}
app.layout = html.Div([
dcc.RadioItems(
id='countries-dropdown',
options=[{'label': k, 'value': k} for k in all_options.keys()],
value='America'
),html.Hr(),dcc.RadioItems(id='cities-dropdown'),html.Hr(),html.Div(id='display-selected-values')
])[@app](http://twitter.com/app).callback(
dash.dependencies.Output('cities-dropdown', 'options'),
[dash.dependencies.Input('countries-dropdown', 'value')])
def set_cities_options(selected_country):
return [{'label': i, 'value': i} for i in all_options[selected_country]][@app](http://twitter.com/app).callback(
dash.dependencies.Output('cities-dropdown', 'value'),
[dash.dependencies.Input('cities-dropdown', 'options')])
def set_cities_value(available_options):
return available_options[0]['value'][@app](http://twitter.com/app).callback(
dash.dependencies.Output('display-selected-values', 'children'),
[dash.dependencies.Input('countries-dropdown', 'value'),
dash.dependencies.Input('cities-dropdown', 'value')])
def set_display_children(selected_country, selected_city):
return u'{} is a city in {}'.format(
selected_city, selected_country,
)if __name__ == '__main__':
app.run_server(debug=True)
我认为这是一个很酷的例子,因为代码片段包含了几个 decorators(这是我最近在课上学到的),并将输出和输入链接在一起,这样一个回调函数的输出就是另一个回调函数的输入。
Jared and I share the same sentiment
所以,总结一下…
Dash 是数据科学家使用的一个很好的工具,因为它允许您构建分析 Python 后端的前端,而不必使用单独的工程师/开发人员团队。因为 Dash 应用程序代码既是声明性的又是反应性的,所以创建包含许多交互元素的丰富的、易于共享的、基于 web 的应用程序的过程现在变得容易多了。我真的很高兴在我未来的项目中开始使用 Dash。
-应用示例图片来自【https://dash.plot.ly/】-
精益仪表板:数据包含和排除原则
原文:https://towardsdatascience.com/dashboard-data-inclusion-and-exclusion-criteria-51cd934e7f60?source=collection_archive---------2-----------------------
仪表板以互动的方式将数据和可视化呈现给用户,因此获得了大量的喜欢和欢迎。为了保持仪表板讲述故事的强大力量,我得出的结论是,一定数量的数据包含和排除是必要的,因为粗心的数据选择可能会使仪表板故事难以理解、播放缓慢、难以维护且存储成本高昂。你有没有遇到过很难理解的图表?我有:)
这里有一个激励人心的假设例子:假设一个科学家来找我,告诉我我患老年痴呆症的几率是 321%。我不会要求在仪表板上显示每月更新的概率,我不会对这个概率做任何事情,因为这个概率不会逐月变化,因为阿尔茨海默病是基因相关的。事实上,到目前为止,阿尔茨海默氏症还没有有效的治疗方法,知道我有更高的几率患上这种疾病不允许我采取任何行动,因此没有任何有意义的商业行动。我不会因为可以更新和监控指标就去更新和监控。
Business world is full of dashboards, on papers or on screens
这个假设的例子可能看起来滑稽可笑,但它意味着在使用信息时要突出一个深思熟虑的过程。我们如何使用信息进行决策决定了我们如何创建、显示和存储信息。这些方面中的每一个都对人们非常关心的数据的分析、计算和可视化有影响。
我反思了我个人的仪表板经验,提出了一套数据包含和排除原则。在我的工作中,这些原则已经在帮助我指导我的技术决策和业务协作。我用以下五点来说明五个原则。
1。包括多少感兴趣的指标?
在业务分析项目中,我们使用许多指标,如基点、下降率、交易量等(我在工作中提到了一些指标,但这些原则应该适用于其他设置)。这些指标允许我们从不同的角度探索有趣的话题。自然,人们要求将这些指标包含在仪表板中,以便他们可以选择、过滤和评估。
Exponentially growing complexity
当我们有一个感兴趣的度量时,我们研究这个度量的性质。当我们有两个感兴趣的指标时,我们研究这两个指标的属性,并比较这两个指标,例如,我们首先研究欺诈,然后研究退款,并将欺诈与退款进行比较(我在金融技术部门工作)。
考虑到两个指标,我们可能会认为再研究一个指标并不是一个大问题,但是,如上图所示,多一个点会产生更多的边,突出了指数增长的复杂性。
因此,前期小心控制度量的数量可以有效控制下游的复杂度。
我的经验告诉我,每个仪表板少于三个指标就可以了。少即是多。
2。要包括哪些过滤器?
如果没有过滤器,仪表板就是图形和表格的集合。过滤器让仪表板活起来。在数据探索阶段,我们使用尽可能多的过滤器来发现洞见。美国的交易比其他国家多吗?产品类别 A 的客户最多吗?
然而,在将这些过滤器提交到最终的仪表板(定期更新的服务器端仪表板)之前,我们需要仔细考虑这些过滤器的“ROI(投资回报)”。我有两种方式来思考“滤镜的 ROI”。
**这个过滤器揭示了一种模式吗?**在研究 F 封锁的影响(这是我公司对我们的用户实施的干预计划)时,与 F 封锁相关的过滤器显示,在 F 封锁发生后,提交的退款减少。这个过滤器揭示了一个模式,证实了我们的业务决策。
此过滤器支持业务操作吗?由于巴西对我们团队来说是一个重要的市场,因此包含巴西的国家过滤器与业务相关,并支持我的业务行动。另一方面,如果我的仪表板用户不愿意(或不能)对特定市场采取行动,那么国家过滤器不支持业务行动,因此没有用。
A filter should divide things into meaningful piles
如果一个过滤器既不显示模式也不支持业务操作,我们最好排除这个过滤器,以避免浪费资源。在我的工作中,按商家渠道过滤的欺诈基点通常不能真实反映模式(它只给出一些旧消息),也不能支持业务操作,因此我们不将其包括在最终仪表板中。
3。我应该随着时间的推移跟踪这个指标吗?
如果一个指标不随时间变化很大,那么一次探索就足够了。很多时候,我的合作者要求 12 个月的指标,而这些指标实际上并没有因为自然波动和季节性而改变。你通常不需要知道 12 个月的世界人口,对吗?一张世界人口的快照可能就足够了。
4。认识探索和最终仪表板之间的差异
因为我们无法直观地看到草案仪表板和生产仪表板之间的区别,所以这两者在很多时候被视为相同的。我们都知道笔记本电脑上的机器学习模型不同于生产系统中部署的机器学习模型。仪表板在探索和生产中是不一样的。
在 exploration(仪表板草稿)中,我们使用许多相关的过滤器来发现趋势和见解。然而,在 production dashboard 中,我们使用优化的仪表板来一致地提供见解。细化和剪切不能保存在仪表板部署路径中。
很多次,我听到人们说“你能每月给我提供这个仪表板吗?”。人们将探索仪表板视为生产仪表板,这可能会有问题。
5。装袋目的是一个危险的游戏
仪表板可以有多种用途:探索、监控、报告甚至预测。探索优化了灵活性和规模。监控优化了自动化和准时性。报告优化了演示文稿和内容读者适合度(会议或目标群体)。
如果我们将探索、监控、报告甚至预测需求打包到一个仪表板中,我们会忽略基本的权衡,同时追求许多优化,这可能会导致折衷的结果。想象一下,如果我们想要一项低风险、高回报和低成本的投资,我们很可能会失望,因为低风险和高回报很难共存。
和你的商业伙伴一起明确目标,如果可能的话,分而治之。
结论
构建一个仪表板实际上就像构建一个统计模型(您需要决定包含哪个变量),一个健康的数据包含和排除对于成功的仪表板是必要的。这五点希望能启发你找到自己的精益仪表板原则。
用 Folium 实现 Python 中的空间可视化和分析
原文:https://towardsdatascience.com/data-101s-spatial-visualizations-and-analysis-in-python-with-folium-39730da2adf?source=collection_archive---------2-----------------------
Photo by NASA on Unsplash
在这篇文章中,我将通过一个例子来说明如何使用 Python 来可视化空间数据,并在著名的 Python 库follow的帮助下从这些数据中生成见解。
注意:当我在本文中提到空间数据时,我指的是包含地理信息(纬度、经度、海拔高度)的所有类型的数据。
我假设您已经了解了:
- 计算机编程语言
- Jupyter 笔记本
- 熊猫
使用地图可视化空间数据的优势
使用地图可视化空间数据有几个明显的优势:
- 能够获得数据点位置的可视化表示,从而使我们能够轻松地将我们拥有的数据点与现实世界联系起来。
- 让我们有可能从现有的数据中获得地理信息。
Plotting spatial data in a map allow us to gain geographical insights that we cannot obtained from other chart forms
Alberto Cairo 在他的书 《功能艺术:信息图形和可视化简介》 中的陈述雄辩地表达了上述观点:
“图形不应该简化信息。他们应该阐明它们,突出趋势,揭示模式,揭示以前看不到的现实。”
当涉及到空间数据时,使用地图而不是其他形式的图表使我们能够突出趋势,揭示模式,并揭示在之前不可见的现实。它还帮助我们获得数据的清晰度,而不仅仅是简化数据本身。
It is extremely hard, if not impossible, to gain useful insights from spatial data using tables as a way to represent the data
薄层
引用 Github 页面上 Folium 的 Python 库:
“follow 构建在 Python 生态系统的数据优势和 fleet . js 库的映射优势之上。在 Python 中处理您的数据,然后通过 leav 在传单地图中将其可视化。”
Folium 是一个 Python 库,它允许我们以交互的方式可视化空间数据,直接在许多人(至少我自己)喜欢的笔记本环境中。该库使用起来非常直观,并且它提供了高度的交互性和较低的学习曲线。最棒的是,这一切都是开源的🎉
Map of New York and its surrounding areas visualized using Folium
数据集
我们将使用从 Kaggle 获得的纽约市出租车出行持续时间数据集 中的数据,我们将在本文中使用这些数据。该数据集可以从上面的链接下载,并且该页面还包括关于数据集中存在的列的文档。
New York City Taxi Trip Ride Data Set available from Kaggle, alongside the documentation explaining the data available in the dataset
该数据集包含两个独立的数据文件,分别是 train.csv 和 test.csv. 数据集之间的区别在于 train.csv 文件包含一个额外的列,即 *trip_duration。*在本例中,我们不会关注这一点,因此我们不需要额外的列。
分析问题
我们将设置一个模拟问题,让我们在分析中努力解决(给文章一个方向感)
该市正计划建造出租车停靠站,在全市范围内,人们可以乘坐出租车上下客,然后等待出租车来接他们。该倡议旨在:
- 减少停在自行车道上的出租车数量
- 使得城市居民更容易和更安全地获得出租车,尤其是在晚上
- 让出租车司机知道他们想找乘客时去哪里
- 允许潜在乘客在寻找出租车时有一个可以去的地方。
您的任务是建议这些出租车停靠点的最佳位置,并了解城市中全天的乘车量模式。
导入和预处理数据
我们首先导入我们将要使用的库, Pandas 和*leav,*导入我们将要使用的所有文件,删除我在上一节提到的 trip_duration 列,并将这两个不同的文件合并为一个数据帧。
Initial steps
Preview of the data set that we will be working with
上面的截图显示了我们将要使用的数据的预览。从数据集来看,可以说我们确实有相当大量的游乐设备数据可以处理(2M+6 个月的数据)。使用 Python 中的 Datetime 包可以生成一些列,如月份*、或其他时间特征。除此之外,这个数据集看起来已经准备好被叶*使用(叶基本上只需要行方向的纬度/经度数据就可以运行它的功能)
Generating the month from the pickup_datetime column
The new dataframe generated after the process above.
如您所见,我们可以从 pickup_datetime 列中获取月、周、日和小时(该列也被转换为 datetime 列,而不是 object)。我们将在后面的分析中使用这些列。
用叶子可视化空间数据
在我们使用 leav 进行可视化之前,有几件事情需要注意:
- 地图被定义为叶子。映射对象,我们可以在叶子上添加其他叶子对象。地图改善/添加到渲染的地图
- 页允许用户选择不同的地图投影。我们将在本文中使用球面墨卡托投影,因为我们正在可视化一个相对较小的区域,这是一个更常用的投影。
- 我们可以使用不同的地图切片来绘制由 follow 绘制的地图,例如来自 OpenStreetMap(我将在本教程中使用的那个), MapBox (使用来自 MapBox 的切片需要您将您拥有的用于 MapBox 许可的 API 密钥作为参数之一),以及您可以从这个 github repo 文件夹或这个文档页面中看到的其他几个切片
**叶子。地图()
这个类方法将永远是您在使用 leav 时执行的第一件事。这个函数的目的是生成默认的地图对象,该对象将由您的笔记本呈现,并且我们将在其上构建我们的可视化对象。
我们可以通过定义默认的地图对象来开始我们的地图可视化。
Function to generate the base map object
Generating the base map object that we will be using for our visualizations
这个类函数中有几个我经常使用的参数,它们是:
- 位置,这个参数基本上定义了默认位置,它将被地图显示为中心位置。
- zoom_start,定义地图的默认放大级别
- control_scale,启用/禁用给定缩放级别的地图比例。这有时对我们了解我们所观察的地理区域的规模很有帮助。
在这个类方法中还可以设置许多其他参数,您可以从这里的中读到这些参数。
热图()
我们将使用一个类方法 Heatmap() 来可视化我们现在拥有的乘坐数据。这个类函数可以用来在我们之前创建的 map 对象上覆盖一个热图。
Using data from May to June 2016 to generate the heat map
Visualizing 2 months worth of rides in a map view
从上面的地图可视化中可以看出,曼哈顿区内的区域以及靠近曼哈顿区的皇后区和布鲁克林区内的区域对出租车的需求量很大。查看地图,我们还可以看到,该区域周围的需求高于其周围的需求。
Adding the functionality for us to add markers to the map by clicking on the location where we would like to add the marker
Running the command allows us to click on the map to add markers where we would recommend them to place the stops for phase 1
加入叶子后。ClickForMarker() 对象添加到我们创建的地图对象中,我们可以单击地图中的位置来添加标记,这些标记是我们建议在第一阶段放置这些出租车停靠站的位置。有些地点位于纽约的机场,因此我们可以跳过第一阶段的这些地点,因为机场已经有乘客可以寻找出租车的地点。
我们还可以使用一个名为 HeatMapWithTime() 的类方法,根据特定维度(即小时、月)来改变热图上显示的数据。这种方法将允许我们将笔记本呈现的热图制作成动画。
首先,我们需要创建一个包含我们想要绘制的值列表的列表,按照我们想要使用的维度进行分组(在本例中,我们将使用 hour 作为维度)。
Generating the list that we will be using as the data value for HeatMapWithTime()
在我们生成了将用于 HeatMapWithTime 类方法的数据之后,我们可以调用该方法并将其添加到我们的地图中。
We use the data from the previous step as the data argument for the HeatMapWithTime class method
Looking at the hourly data pattern, it can be seen that Manhattan will always have a high amount of rides coming from it throughout the day
从上面的结果可以看出,在一天中,总会有一辆车来自曼哈顿地区,因此我们可能会在整个曼哈顿地区设置许多站点,因为我们会将该项目扩展到整个城市的更多站点
结束语
如上所述,可以看出,作为一种可视化空间数据的方式,使用 follow 非常直观。Folium 内置了许多特性,包括热图、动画、标记和许多我在本文中没有涉及的其他特性。
从上面的例子中还可以看出,通过使用地图而不是其他形式的可视化,我们确实可以突出趋势,揭示模式,并揭示在空间数据之前不可见的现实。最重要的是,它将我们拥有的数据的清晰度提升到了一个全新的水平。
你可以在这里下载本文使用的附带笔记本:https://colab . research . Google . com/drive/1 hjb 7 ugj 7 yuueji-ckzrar 3 o 4d lym 2 krp
参考
功能艺术:信息图形和可视化介绍阿尔贝托·开罗写的关于有效可视化的书。
https://python-visualization . github . io/folio/docs-v 0 . 6 . 0/quick start . html # Getting-Started,follow 的快速入门指南,非常方便地入门。
http://python-visualization . github . io/Folium/docs-v 0 . 5 . 0/modules . htmlFolium 的文档页面。
https://github.com/python-visualization/folium叶氏 Github 页面。
数据分析:纳粹禁书
原文:https://towardsdatascience.com/data-analysis-books-banned-by-the-nazis-c9d3cf0cfab3?source=collection_archive---------11-----------------------
数据显示希特勒对自由媒体发动了一场文化战争
Photo by Fred Kearney on Unsplash
在这个数据分析中,我们将使用柏林开放数据倡议提供的数据集来探索 1935 年被纳粹禁止的书籍的作者、书名和位置。您可以在这里访问数据集。它包含了 13 个变量的 4762 个观察结果,包括作者姓名、头衔、出版商所在地和出版年份。为了可视化数据,我们将使用 r 中的 tidytext 、 wordcloud 、 treemap 和 ggmap 包
为什么这与今天相关?
在美国对媒体、过滤泡沫和错误信息“开战”的时代,我们应该保持警惕,当权者如何控制信息流来支持他们的政治议程,并重新叙述我们的集体历史。
#Cleaning up for display and loading necessary packages
library(tidyverse)
library(tidytext)
library(wordcloud)
library(treemap)
library(ggmap)
df <- read.csv('nazibooks.csv', stringsAsFactors = F)
df <- df%>%
unite('name', authorfirstname, authorlastname, sep=' ' )
df <- df%>%
mutate(firsteditionpublicationyear = as.integer(firsteditionpublicationyear))
戈培尔和纳粹文化理想
据该网站称,这份名单是由约瑟夫·戈培尔(Joseph Goebbels)的心血结晶“帝国文化宫”(Reichskulturkammer)拟定的,并被传递给所有的图书馆和书店。根据维基百科,
【帝国文化室】意在获得对德国整个文化生活的控制,创造和推广符合纳粹理想的雅利安艺术。每个艺术家必须出示雅利安证书才能申请会员资格。被拒绝的登记事实上导致了职业禁令。
两种禁书
党卫军实际上使用了两种“旗帜”:第一种是“威胁纳粹文化”的书籍,第二种是“不适合落入青少年(18 岁以下的儿童)手中”的书籍这些书也不能陈列在店面的橱窗里,或者放在书店里,公众可以在那里找到它们。
df%>%
ggplot(aes(firsteditionpublicationyear, fill=as.factor(ssflag)))+
geom_histogram(alpha=.5)+
theme_minimal()+
labs(fill='Type of Ban', x='Year First Published', y='Count')+
annotate('text',x=1890, y=600, size=3, label = 'Type 1: Die Reichsschrifttumskammer führt eine Liste solcher Bücher und Schriften,\n die das nationalsozialistische Kulturwollen gefährden.\n Die Verbreitung dieser Bücher und Schriften durch \n öffentlich zugängliche Büchereien \nund durch den Buchhandel in jeder Form (Verlag, Ladenbuchhandel,\n Versandbuchhandel, Reisebuchhandel, Leihbüchereien usw.) ist untersagt.
\n Type 2: Die Reichsschrifttumskammer führt eine weitere Liste solcher Bücher und Schriften,\n die zwar nicht in die in § 1 erwähnte Liste aufzunehmen,\n jedoch ungeeignet sind, in die Hände Jugendlicher zu gelangen. Solche Schriften dürfen:
1\. nicht in Schaufenstern und allgemein zugänglichen Bücherständen öffentlich\n ausgelegt werden,
2\. nicht durch Reisende, Bücherkarrenhändler, Ausstellungshändler und sonstige \nHändler ohne festen Verkaufsraum\n vertrieben werden,
3\. nicht an Jugendliche unter 18 Jahren ausgehändigt werden.')
我们看到大多数书籍都是在 20 世纪 30 年代出版的,尽管看起来第二类禁令(针对年轻人)针对的是出版时间稍早的书籍。1900 年以前出版的书籍很可能与共产主义有关。卡尔·马克思的《***宣言*(Manifest der Kommunistischen Partei)*出版于 1848 年,是柱状图中显示的最早出版的书籍。
禁书的 Tidytext 和 Wordclouds
我们将使用 tidytext 包和一个定制的德语停用词数据帧来过滤掉大部分语法单词。然后,我们将使用 Wordcloud 包来可视化被禁标题中的前 150 个单词。我们将首先看单个单词,然后看二元模型,它倾向于给出更多的上下文。
custom_stops <- bind_rows(data.frame(word = c(as.character(seq(1,100,1)),'nicht', 'kann','na', 'en','le', 'het', 'st', 'aufl','hrsg','unsere','de', 'bd', 'la','sämtliche', 'u', 'schriften', stopwords::stopwords(language = 'german')), lexicon = c('custom')), stop_words)my_pal1 <- rev(c("#FF4040", "#EE3B3B", "#8B2323", "#030303"))
df%>%
unnest_tokens(word, title)%>%
anti_join(custom_stops)%>%
count(word, sort=T)%>%
with(wordcloud(word, n, scale=c(2, .3), color=my_pal1, random.color = F, max.words = 150))
现在用二元模型来深入了解单词的上下文。
df[df == ' '] <- 'unknown'
df%>%
filter(ssflag==1)%>%
mutate(title = iconv(title, 'UTF-8', 'latin1'))%>%
unnest_tokens(word, title, token = 'ngrams', n=2)%>%
separate(word, into=c('word1', 'word2'))%>%
#filter(nchar(word1) > 2)%>%
#filter(nchar(word2) > 2)%>%
filter(str_detect(word1, '[a-zA-Z]'))%>%
filter(str_detect(word2, '[a-zA-Z]'))%>%
filter(!word1 %in% custom_stops$word)%>%
filter(!word2 %in% custom_stops$word)%>%
unite('bigram', word1, word2, sep=' ')%>%
count(bigram, sort=T)%>%
with(wordcloud(bigram, n, scale=c(1.2, .3), color=my_pal1, random.color = F, max.words=100))
最危险的想法
在 bigrams cloud 中,我们注意到对德国诗歌的大量关注。很可能纳粹试图盗用德国的文化偶像,并用它们来支持他们的意识形态。我们也在俄罗斯和中国(远东)找到了很多共产主义的参考资料。最后,我们看到了控制家庭价值观和年轻人(年轻一代)的困扰。对性话题的关注尤为有趣( erotik 、卖淫、 sexuelle )。
从单个单词中,我们可以看到许多被禁书籍关注的主题如下:
**爱情,战争,历史,德国,婚姻,青年,犹太人,苏联,希特勒,女人,革命,精神分析,社会主义,**教会,在众多的当中。
重述过去
基于此,我们可以推断纳粹试图控制德国人如何看待他们自己的历史和俄国革命事件。与此同时,纳粹担心家庭的角色和婚姻制度,尤其是当时女性的性观念。最后,他们试图压制与基督教和教会相关的思想的自由表达。
所有这些都支持了人们熟悉的历史叙事,即纳粹利用新闻审查来支持种族优越的政党意识形态。任何含有可能使人们质疑党的路线的思想的书籍都被禁止出版。
禁书是在哪里出版的?
在这幅图中,我们将看到禁书是在哪里出版的。为了做到这一点,我们将需要地理编码的城市,并加入他们的出版物计数。
*#these were created separately
map_counts <- read.csv('euro_map_counts.csv')
nazi_words <- read.csv('top_nazi_words.csv')
#Google maps has changed its API since this time...
w_map <- get_map('Europe', zoom=4, maptype = 'toner')
ggmap(w_map)+
geom_point(aes(lon, lat, size=n, color=n), alpha=.5,data=map_counts)+
scale_color_gradient(low='blue', high='red')+
guides(size=FALSE)+
labs(color='# Banned Books', title='Location of Banned Books')+
theme_void()*
纳粹痛恨苏联共产主义
我们看到柏林出版了许多被禁的书籍(超过 1000 本),但也有许多书籍来自莫斯科。同样,这些很可能与共产主义和俄国革命有关,后者发生在大约十年前。
我们也可以看到更多来自伦敦、巴黎和维也纳等大城市的书籍。有趣的是,瑞士似乎也出版了很多书。
禁书的主题和位置
在这里,我们将看看在每个地方被禁止的热门词汇,希望能对各个城市出版的书籍中的观点有所了解。
*top_words <- df%>%
unnest_tokens(word, title)%>%
anti_join(custom_stops)%>%
count(firsteditionpublicationplace,word)%>%
arrange(desc(n))%>%
group_by(firsteditionpublicationplace)%>%
top_n(1,n)%>%
filter(n>1)%>%
inner_join(map_counts, by='firsteditionpublicationplace')library(ggrepel)
#get new map to see colors better
water_map <- get_map('Europe', zoom=4, maptype = 'watercolor')
ggmap(water_map)+
geom_text_repel(aes(label= word,lon, lat, size=log(n.y)),min.segment.length=.9,segment.alpha = .2,color='black', force=2,data=top_words)+
guides(size=FALSE)+
scale_size(range = c(1, 5))+
theme_void()+
labs(title='Top Words by City')*
来自柏林的爱与革命
这幅图让我们感受到纳粹想要控制哪些思想,以及这些思想的来源。单词的大小与包含该单词的标题数量成正比。
爱情和革命主要来自柏林,当时柏林以拥有一个蓬勃发展的***而闻名,而纳粹显然不喜欢这个政党。看来纳粹也在击退苏联的反宣传。
在德国南部,你可以看到对天主教会的提及,在维也纳,你可以看到对“Sittengeschichten”的压制,“Sittengeschichten”翻译过来就是“道德的历史”。
这些例子再次显示了纳粹为了控制和限制违背党的社会、历史和宗教叙事的思想的自由表达而在媒体上发动文化战争的程度。
这就是为什么特朗普的媒体战争树立了如此危险的先例:通过控制民众如何理解现实,当权者获得了以可预测的方式在情绪上操纵和煽动民众的能力。
哪些作家的禁书最多?
为了更好地了解纳粹最反感哪些作者,我们将统计禁书最多的作者,然后给出一个(随机选择的)标题示例,以了解该作者所写的书的类型。
*df_authors <- df%>%
filter(name != 'unknown')%>%
count(name, sort=T)%>%
filter(n > 4)top_title <- df%>%
filter(name != 'unknown')%>%
count(name,title, sort=T)%>%
filter(name %in% df_authors$name)%>%
group_by(name)%>%
slice(1)tot_count <- df%>%
filter(name != 'unknown')%>%
count(name, sort=T)%>%
filter(name %in% df_authors$name)%>%
group_by(name)%>%
slice(1)%>%
inner_join(top_title, by='name')#PLOTs
ggplot(tot_count, aes(reorder(name,n.x),n.x, fill=n.x))+
geom_col()+
geom_label(aes(x=reorder(name,n.x), y= 2, label=title),color='white', size=2.5)+
coord_flip()+
theme(axis.text.y = element_text(size=7))+
labs(y='# Books Banned', title='Authors with Most Banned Books', subtitle='(example title)', fill='# Banned Books')+
theme_minimal()*
纳粹认为新思想的自由表达是危险的
有趣的是,我看到鲁道夫·斯坦纳是最被禁止的作家之一。现在在德国和美国有许多“鲁道夫·斯坦纳学校”。鲁登道夫是第一次世界大战中最著名的德国军事领导人之一,后来参与了企图在慕尼黑刺杀希特勒的政变,但没有成功。他的书被禁并不奇怪。
这里列出的相对温和的书名显示了纳粹对任何与历史、神话、道德和性有关的书籍的担忧(《凯撒琳》、《阿佛洛狄忒》、《女人的性生活》、《大罪》)。
一个特别奇怪的标题是“使用高频波来看起来更年轻”。“我猜这本书违背了纳粹党在科学研究上的立场。
哪些作者和话题被禁最多?
最后,我们将使用一个树形图来查看最常被禁作者的标题中最常使用的单词。我们应该能够大致了解每个作者写的标题类型。
*df%>%
filter(name != 'unknown')%>%
unnest_tokens(word, title)%>%
anti_join(custom_stops)%>%
count(name, word, sort=T)%>%
group_by(name)%>%
slice(which.max(n))%>%
arrange(desc(n))%>%
head(200)%>%
treemap(index = c('name', 'word'),
align.labels = list(c("left", "top"), c("center", "bottom")),
vSize='n',
type='index',
vColor='white',
fontsize.labels = c(6,6),
fontcolor.labels=c("black","white"),
title='Frequent Words by Author')*
抹去犹太历史
矩形的大小与作者的禁书数量成正比。我们可以看到西奥多·亨德里克·范德维尔德(一位荷兰妇科医生和人体体温曲线的部分发现者)写了一些关于婚姻的书(何鄂),而齐格弗里德·利希滕斯塔滕经常写一些与犹太教相关的话题。他出版的作品涉及犹太历史、法律和习俗的政治问题。可悲的是,根据维基百科,他于 1942 年在 Theresienstadt 的犹太人区被谋杀。我鼓励你谷歌一下这些人,了解更多关于他们的作品和想法。
当心那些限制社会自由表达思想的政客或政党,尤其是那些与特定群体的历史和文化相关的思想。
这份书单强调了这样一个事实,即看似与政治无关的话题,如道德故事和神话,可以被当权者挪用和利用来控制流行话语,并使反对的观点远离年轻人,他们可能会愿意反抗这一制度。如果政党叙事被推得足够用力、足够长久,人们就会开始相信它。也许这是奥威尔的《1984 年》背后的灵感。
不管你对某些媒体出版商的看法如何,比如《纽约时报》或 CNN,下次有政治人物说他们是“人民的敌人”时,你应该提醒自己,纳粹使用了同样的策略来实施最令人发指的反人类罪行之一,并使世界陷入有史以来最具破坏性的战争之一。
原载于 2018 年 8 月 14 日https://greenet 09 . github . io。**
数据分析:你曾经想知道的关于 UFO 目击的一切
原文:https://towardsdatascience.com/data-analysis-everything-youve-ever-wanted-to-know-about-ufo-sightings-e16f2ed34151?source=collection_archive---------6-----------------------
实践教程
NUFORC UFO 目击数据的趋势分析
Photo by Jaredd Craig on Unsplash
如果文字数据和外星人让你感兴趣,那你来对地方了。在本帖中,我们挖掘了 80,000+ NUFORC ( 国家 UFO 报告中心)的 UFO 目击报告。在调查过程中,我们将使用 R 中的许多方法,从树形图、棒棒糖图和网络图到地理图,甚至一些统计测试。
我们能从中学到什么?至少,如果我们想最大化我们看到不明飞行物的机会,我们可以学习在哪里和什么时候寻找一个。您甚至可能会学到一些清理和可视化数据的漂亮的 R 技巧。你可以在 NUFORC 访问这里的数据。
我的 UFO 故事
自从我三年级在光天化日之下看到不明飞行物后,我就对外星人和不明飞行物感兴趣。事情是这样的。
这只是加州拉梅萨当地公园的又一个周日下午。那年一定是 1993 年左右。当我和我的伙伴在玩滑板的时候,天空中的一些东西吸引了我的注意。我们抬头看着一个闪亮的银色圆盘毫不费力地静静地在蓝天上盘旋,瞬间穿过整片云层。我不是说它移动得很快。我的意思是它没有移动——它只是出现在不同的位置。我能描述它的最好方式是想象拿一支铅笔在一张二维纸上戳洞。如果你面对着纸,没有意识到铅笔在纸后面移动,这些洞就会“瞬间”出现。事实上,铅笔只是在另一个“隐藏的”第三维空间中移动。
不明飞行物也离我们不远,在你可能会看到一架直升机的高度。我清楚地记得太阳照射在飞行器金属外壳上的样子——就像电影里的 UFO 和你在当地新闻中听到的一样。震惊之余,我们跑去告诉了困惑但好奇的父母,他们随后过来和我们一起看了十分钟左右。总之,我相信我们至少有五个证人。最终,不明飞行物以一种只能被描述为物理上不可能的超高速飞行般的速度飞入大气层。它就这样消失了,就像一片灰尘被吸进了一根管子里。
数据分析能帮助我们弄清不明飞行物的奥秘吗?
从那以后,我试图弄清楚不明飞行物到底是什么。一个政府会蠢到大白天在圣地亚哥测试高度先进的秘密技术吗?不太可能。让我们看看是否能找到任何可能帮助我们决定不明飞行物确实是人类还是外星人的东西。
数据清理和计数
library(tidyverse)
library(tidytext)
library(ggmap)
library(stringr)
df **<-** read.csv('ufo.csv', stringsAsFactors **=** **FALSE**)
*#delete any cities with punctuation. focus on US*
*#if you put df[which...] then you get a data frame back. we just want vector of indices*
bad **<-** which(str_detect(df**$**city, '[[:punct:]]'))
df **<-** df[**-**bad,]
df **%>%**
count(city, state, shape)**%>%**
arrange(desc(n))**%>%**
head()## # A tibble: 6 x 4
## city state shape n
## <chr> <chr> <chr> <int>
## 1 seattle wa light 113
## 2 phoenix az light 90
## 3 san diego ca light 78
## 4 portland or light 77
## 5 las vegas nv light 68
## 6 los angeles ca light 63
现在,我们可以使用伟大的 tidytext 包来深入研究报告,看看我们能在文本描述中找到什么。
big **<-** df **%>%**
unnest_tokens(word, comments, token**=**'ngrams', n**=**2)**%>%**
anti_join(stop_words)**%>%**
count(word, sort**=TRUE**)*#solve problem of bigrams with stop words*
bigrams_separated **<-** big **%>%**
separate(word, **c**("word1", "word2"), sep **=** " ")
*#keep only alphabetical words and longer than 2 letters*
bigrams_filtered **<-** bigrams_separated **%>%**
filter(**!**word1 **%in%** stop_words**$**word) **%>%**
filter(**!**word2 **%in%** stop_words**$**word)**%>%**
filter(str_detect(word1, '[[:alpha:]]'))**%>%**
filter(str_detect(word2, '[[:alpha:]]'))**%>%**
filter(nchar(word1) **>** 2)**%>%**
filter(nchar(word2) **>** 2)**%>%**
filter(word1 **!=** 'ufo')**%>%**
filter(word2 **!=** 'ufo')
*#most common types of lights seen*
lights **<-** bigrams_filtered **%>%**
filter(word2 **==** 'light' **|** word2 **==** 'lights')**%>%**
unite('bigram', **-**n, sep**=**' ')
*#What type of shapes?*
shapes **<-** bigrams_filtered **%>%**
filter(word2 **==** 'shape' **|** word2 **==** 'shaped')**%>%**
unite('bigram', **-**n, sep**=**' ')
*#movement*
mvt **<-** bigrams_filtered **%>%**
filter(word2 **==**'movement' **|** word2 **==** 'movements')**%>%**
unite('bigram', **-**n, sep**=**' ')
speed **<-** bigrams_filtered **%>%**
filter(word2 **==** 'speed' **|** word2 **==** 'speeds')**%>%**
unite('bigram', **-**n, sep**=**' ')
用树形图可视化 UFO 特征
树形图的工作原理是使矩形的面积与数据帧中的某个变量成比例。在这种情况下,我们有二元模型的计数,所以我们将设置矩形的大小来反映每一对的计数。希望这能告诉我们一些关于不明飞行物最常见特征的有趣的事情。
*# treemap. the size of the box is proportional to its count among all lights*
treemap(speed,
index**=**"bigram",
vSize**=**"n",
type**=**"index",
fontsize.labels **=** 6,
title**=** 'UFO Speed Words'
)
Image by Author
正如我所料,大多数人说不明飞行物以令人难以置信的速度移动。我喜欢对“曲速”的描述我会说我看到的不明飞行物也以违反物理定律的速度移动。
Image by Author
似乎有一个明确的模式不明飞行物有不稳定和不寻常的运动。
treemap(shapes,
index**=**"bigram",
vSize**=**"n",
type**=**"index",
fontsize.labels **=** 6,
title**=** 'UFO shape Words'
)
Image by Author
有趣的是,许多雪茄形和三角形的不明飞行物。我以前从未听说过人字形/回飞镖形的不明飞行物。
treemap(lights,
index**=**"bigram",
vSize**=**"n",
type**=**"index",
fontsize.labels **=** 6,
title**=** 'UFO Lights Words'
)
Image by Author
看起来大多数看到的光不是白光、橙光、红光就是蓝光。
用棒棒糖图显示州和城市
表示相同信息的另一种方式是棒棒糖图。这些本质上是看起来更光滑的条形图,其中条形的长度与我们的数据框架中的某一列成比例。请记住,在 ggplot2 中,我们使用 aes()参数将变量(即列)映射到我们的图中。这是 ggplot 极其有用的一个方面。
*#city state counts of sightings*
state_counts **<-** df **%>%**
filter(state **!=** '')**%>%**
count(city, state, sort**=TRUE**)**%>%**
unite('location', **-**n, sep**=**',')
*#visualize with lollipop chart*
state_counts **%>%**
filter(n **>** 90)**%>%**
mutate(x **=** factor(location))**%>%**
ggplot(aes(x, n))**+**
geom_segment(aes(x**=**reorder(x,n), xend**=**x, y**=**0, yend**=**n), size**=**1)**+**
geom_point(color**=**'red', size**=**2, alpha**=**.6)**+**
coord_flip()**+**
theme_minimal() **+**
theme(axis.text.y **=** element_text(size **=** 7))**+**
labs(title**=**'Which cities have had the most sightings?')
Image by Author
*#count cities and shape*
*#seattle fireballs sounds like a basketball team*
*#get rid of others because they don't contain useful info*
df **%>%**
filter(**!**shape **%in%** **c**('', 'unknown', 'other', 'light'))**%>%**
count(city, shape, sort**=TRUE**)**%>%**
filter(n **>** 20)**%>%**
unite('type', **-**n, sep**=**' ')**%>%**
mutate(type **=** factor(type))**%>%**
ggplot(aes(type, n))**+**
geom_segment(aes(x**=**reorder(type,n), xend**=**type, y**=**0, yend**=**n), size**=**1)**+**
geom_point(color**=**'red', size**=**2, alpha**=**.6)**+**
coord_flip()**+**
labs(title**=**'What shapes are most commonly seen in each location?',
x **=** 'City and Type of Shape', y**=**'# of sightings')**+**
theme_minimal()
Image by Author
使用 lubridate 寻找随时间变化的模式
lubridate 包很棒。它使处理日期和时间变得容易。如果您熟悉 xts 或 ts 对象,您会知道在 R 中处理日期和时间可能很麻烦。
一个非常方便的函数是 floor_date(),它允许您将观察结果汇总到多个时间段中。这类似于你如何在直方图中选择仓位大小,但这里我们选择的是考虑“仓位”或“桶”的时间间隔当您更改间隔(即时间单位)时,您会看到随着数据缩放级别的变化出现不同的模式。您需要运用自己的判断来找出哪种级别的聚合最适合您的需求。
library(lubridate)
*#biggest single events reported one time tinley park 17 counts*
df**$**datetime **<-** mdy_hm(df**$**datetime)
*#1 year intervals*
df **%>%**
mutate(datetime **=** floor_date(datetime, unit**=**'1 year'))**%>%**
group_by(datetime)**%>%**
filter(datetime **>** '1939-01-01')**%>%**
summarize(cts **=** n())**%>%**
ggplot(aes(datetime, cts))**+**
geom_line()**+**
scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y') **+** theme(plot.subtitle **=** element_text(vjust **=** 1),
plot.caption **=** element_text(vjust **=** 1),
panel.background **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "UFO Sightings Since 1939",
x **=** "Date", y **=** "Sightings")*#which states have the most sightings?*
*#ca, wa, fl, tx, ny*
df **%>%**
count(state, sort**=**T)**%>%**
slice(1**:**10)
*## # A tibble: 10 x 2*
*## state n*
*## <chr> <int>*
*## 1 ca 8998*
*## 2 wa 3949*
*## 3 fl 3792*
*## 4 tx 3445*
*## 5 ny 2635*
*## 6 il 2460*
*## 7 az 2454*
*## 8 pa 2406*
*## 9 oh 2301*
*## 10 mi 1930*
加利福尼亚、华盛顿和佛罗里达是不明飞行物最多的地方。考虑到他们庞大的人口,这并不奇怪。
Image by Author
*#top 10 states by sightings*
df **%>%**
mutate(datetime **=** floor_date(datetime, unit**=**'1 year'))**%>%**
group_by(datetime, state)**%>%**
filter(datetime **>** '1950-01-01')**%>%**
filter(state **%in%** **c**('ca', 'wa', 'fl', 'tx','ny', 'il','az','pa','oh','mi'))**%>%**
summarize(cts **=** n())**%>%**
ggplot(aes(datetime, cts, color**=**state), alpha**=**.5)**+**
geom_line(size**=**1)**+**
scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y') **+**
theme(plot.subtitle **=** element_text(vjust **=** 1),
plot.caption **=** element_text(vjust **=** 1),
panel.background **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "UFO Sightings Since 1950",
x **=** "Date", y **=** "Sightings")
Image by Author
尽管华盛顿在 20 世纪 90 年代中期仅仅接管了一年左右的时间,但加州在目击事件方面占据了主导地位。哪些城市见过最多的不明飞行物呢?
*#which cities?*
cities **<-** df **%>%**
count(city, sort**=**T)**%>%**
slice(1**:**10)
cities **<-** cities[,1]
cities
*## # A tibble: 10 x 1*
*## city*
*## <chr>*
*## 1 seattle*
*## 2 phoenix*
*## 3 portland*
*## 4 las vegas*
*## 5 los angeles*
*## 6 san diego*
*## 7 houston*
*## 8 chicago*
*## 9 tucson*
*## 10 miami*
在最受欢迎的 UFO 地点,UFO 目击事件随着时间的推移发生了怎样的变化?
*#tracking 10 cities*
df **%>%**
mutate(datetime **=** floor_date(datetime, unit**=**'5 years'))**%>%**
group_by(datetime, city)**%>%**
filter(datetime **>** '1970-01-01')**%>%**
filter(city **%in%** **c**('seattle', 'phoenix','portland', 'san diego', 'los angeles', 'houston', 'las vegas', 'chicago', 'tucson', 'miami'))**%>%**
summarize(cts **=** n())**%>%**
ggplot(aes(datetime, cts, color**=**city), alpha**=**.8)**+**
geom_line(size**=**1)**+**
scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y') **+**
theme(plot.subtitle **=** element_text(vjust **=** 1),
plot.caption **=** element_text(vjust **=** 1),
panel.background **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "5 year aggregate UFO Sightings Since 1970",
x **=** "Date", y **=** "Sightings")
Image by Author
我们可以看到,随着时间的推移,所有顶级城市的游客数量都经历了大致相同的增长。西雅图和凤凰城是一年中最多的。奇怪的是,自 2008 年以来,目击事件似乎减少了。
随着时间的推移,不明飞行物的形状发生了怎样的变化?雪茄形状的不明飞行物和圆盘形状的一样常见吗?
*#how have shapes changed over time? 1 year aggregrates*
df **%>%**
mutate(datetime **=** floor_date(datetime, unit**=**'1 year'))**%>%**
filter(datetime **>** '1950-01-01')**%>%**
group_by(datetime, shape)**%>%**
filter(**!**shape **%in%** **c**('', 'changed', 'changing', 'other', 'unknown'))**%>%**
summarize(cts **=** n())**%>%**
ggplot(aes(datetime, cts, color**=**shape))**+**
geom_line(size**=**1, alpha**=**.6)**+**
scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y')**+**
theme_minimal()
Image by Author
看起来现在灯是最常见的了,尽管以前并不总是这样。过去磁盘占主导地位。
让我们来看看每种形状的比例,而不是计数:
*#5 year intervals proportion of shapes sighted*
df **%>%**
mutate(datetime **=** floor_date(datetime, unit**=**'5 years'))**%>%**
filter(datetime **>** '1950-01-01')**%>%**
group_by(datetime, shape)**%>%**
filter(**!**shape **%in%** **c**('', 'changed', 'changing', 'other', 'unknown'))**%>%**
summarize(cts **=** n())**%>%**
mutate(freq **=** cts**/sum**(cts))**%>%**
filter(freq **>** .05)**%>%**
ggplot(aes(datetime, freq, color**=**shape))**+**
geom_line(size**=**1)**+**
scale_x_datetime(date_breaks **=** '5 years', date_labels **=** '%Y')**+**
theme_minimal()**+**
labs(title**=**'Freq of shape in 5 year aggregate sightings since 1950')
Image by Author
自 20 世纪 50 年代以来,圆盘的受欢迎程度大幅度下降,而三角形在 20 世纪 80 年代后期上升到顶峰,然后最终被光取代。球形和圆形一直稳定在所有目击事件的 10%左右。
在过去的 50 年里,加利福尼亚的形状发生了怎样的变化?
df **%>%**
mutate(datetime **=** floor_date(datetime, unit**=**'10 years'))**%>%**
filter(datetime **>** '1950-01-01')**%>%**
group_by(datetime, shape, state)**%>%**
filter(state **==** 'ca')**%>%**
filter(**!**shape **%in%** **c**('', 'changed', 'changing', 'other', 'unknown'))**%>%**
summarize(cts **=** n())**%>%**
ungroup()**%>%**
group_by(datetime, add**=TRUE**)**%>%**
mutate(freq **=** cts**/sum**(cts))**%>%**
filter(freq **>** .05)**%>%**
ggplot(aes(datetime, freq, color**=**shape))**+**
geom_line(size**=**1, alpha**=**.6)**+**
scale_x_datetime(date_breaks **=** '20 years', date_labels **=** '%Y')**+**
facet_wrap(**~** state)**+**
theme_minimal()**+**
labs(title**=**'Freq of shape in 10 year aggregate sightings since 1950')
Image by Author
外卖食品
- 磁盘在 20 世纪 50 年代达到顶峰,现在几乎没有出现过。
- 直到 20 世纪 70 年代末,灯才出现,然后爆炸了。
- 三角形似乎在 20 世纪 80 年代末达到了顶峰。
- 直到 20 世纪 80 年代末和 90 年代初,火球术越来越受欢迎,然后受到了一点打击,又恢复了。也许是飞碟绑架电影天空之火的结果?
- 雪茄在 20 世纪 60 年代绝迹了。外星人的租约到期了,他们换了灯?
UFO 目击事件是季节性的吗?
目击事件有日常模式吗?一天中的什么时间最有可能看到不明飞行物?我们将使用来自 lubridate 的超级有用的函数,这些函数从我们创建的 datetime 对象中提取不同的时间片段。一旦我们改变了新的列,就很容易对这些时间进行分组,并制作出漂亮的视觉效果。
df **<-** df **%>%**
mutate(day **=** day(datetime),
month **=** month(datetime),
year **=** year(datetime),
hour **=** hour(datetime))
现在我们准备开始分组和可视化。
*#I'm only showing 24 years' of data here due to size limits. But the same pattern persists up till 2014.*
df **%>%**
mutate(month **=** factor(month),
day **=** factor(day))**%>%**
filter(between(year, 1950, 1974))**%>%**
group_by(year, month)**%>%**
summarize(cts **=** n())**%>%**
ggplot(aes(month, cts, group**=**year))**+**
geom_line()**+**
facet_wrap(**~** year, ncol **=** 5, scales **=** 'free_y')**+**
labs(title**=**'Are UFO sightings seasonal? Apparently yes')
Image by Author
这真的出乎意料:不明飞行物非常季节性!几乎每年都有相同的目击分布,几乎每年的六月到七月都有一个高峰。这怎么解释呢?
一天中的时间呢?更多的目击事件发生在早上还是晚上?
df **%>%**
group_by(day, hour)**%>%**
summarize(cts **=** n())**%>%**
ggplot(aes(hour, cts, group**=**day))**+**
geom_line()**+**
facet_wrap(**~** day)**+**
labs(title**=**'Does time of UFO sighting depend on the day of the month?')
Image by Author
我很惊讶,大多数目击事件发生在晚上 9-11 点左右。当然,在晚上我们的视力不好,天空中有太多其他东西争夺我们的注意力。
另外,看看上面图表中可见的两个峰值:一是 4 日的大峰值,一是 1 日午夜左右的大峰值。我们将很快解释这些。
我现在意识到我白天的目击事件非常罕见。有多稀有?让我们估计一下下午 3 点看到不明飞行物的概率。
df **%>%**
count(hour)**%>%**
mutate(freq **=** n**/sum**(n),
cum_prob **=** **cumsum**(freq))**%>%**
slice(15**:**17)## # A tibble: 3 x 4
## hour n freq cum_prob
## <int> <int> <dbl> <dbl>
## 1 14 1042 0.01588608 0.3131784
## 2 15 1147 0.01748689 0.3306653
## 3 16 1282 0.01954507 0.3502104*#plot the estimated cumulative probability of sightings by hour in the day*
df **%>%**
count(hour)**%>%**
mutate(freq **=** n**/sum**(n),
cum_prob **=** **cumsum**(freq))**%>%**
ggplot(aes(hour, cum_prob))**+**
geom_area(alpha **=** .5)**+**
geom_vline(xintercept **=** 15, color**=**'red')**+**
geom_hline(yintercept **=** .33, color**=**'red')**+**
labs(title**=**'Estimated cumulative probability of UFO sightings by hour in the day')
Image by Author
显然,只有大约 1.7%的目击事件发生在下午 3-4 点之间。我们还可以看到,只有大约 33%的目击事件发生在午夜和下午 3 点之间。绝大多数发生在晚上 8-10 点之间。更具体地说,近 50%的目击事件(实际上我应该说目击报告)发生在晚上 8 点和午夜之间。
那星期几呢?更多的目击事件发生在周末吗?我在一个周日的下午看到了我的。我们将使用 lubridate 有用的 wday()来获取当天的名称。
library(stringr)
df **%>%**
mutate(dow **=** wday(datetime, label**=**T))**%>%**
count(month, dow)**%>%**
ggplot(aes(dow, n, fill**=**dow))**+**
geom_col()**+**
guides(fill**=FALSE**)
Image by Author
周六和周日的目击事件确实大幅上升。但是这种情况总是在所有月份都存在吗?如果你熟悉辛普森悖论,那么你就会知道,有时候汇总结果可能与分组结果完全不一致。
df **%>%**
mutate(dow **=** wday(datetime, label**=**T))**%>%**
count(month, dow)**%>%**
ggplot(aes(dow, n, fill**=**dow))**+**
geom_col()**+**
facet_wrap(**~** month)**+**
guides(fill**=FALSE**)
Image by Author
不出所料,周末会有更多的目击事件。有更多的时间凝视天空和喝酒,所有这些都可以解释目击事件的增加。这一周的逐渐增加的浏览量类似于你在零售销售中看到的情况。周一是缓慢的,然后购物在一周内加快,周末是最大的高潮。这在我看来,这种现象更多的是人们每周日程/习惯的作用,而不是任何真正的外星现象。
这个周末的撞击是偶然的吗?让我们对一周中的某一天进行卡方显著性检验。我们将假设目击事件在一周的任何一天都同样可能发生。
cn **<-** df **%>%**
mutate(dow **=** wday(datetime, label**=**T))**%>%**
count(dow)**%>%**
ungroup()
cn
*## # A tibble: 7 x 2*
*## dow n*
*## <ord> <int>*
*## 1 Sun 9533*
*## 2 Mon 8191*
*## 3 Tue 8856*
*## 4 Wed 9053*
*## 5 Thu 8989*
*## 6 Fri 9477*
*## 7 Sat 11493*
*#Goodness of fit test:*
*#Null hypothesis: Each day is equally likely for a UFO sighting*
*#What is the probability of getting the observed DOW counts we did under this condition?*
chisq.test(cn**$**n)
*##*
*## Chi-squared test for given probabilities*
*##*
*## data: cn$n*
*## X-squared = 687.82, df = 6, p-value < 2.2e-16*
是的,几乎可以肯定的是,假设发生概率相等的零假设,周末的目击率大大高于工作日。
UFO 目击事件在特定月份的不同时间发生吗?
df **%>%**
group_by(state)**%>%**
filter(state **%in%** **c**('ca', 'wa', 'tx', 'fl', 'ny'))**%>%**
count(hour,month)**%>%**
ggplot(aes(hour, n, color**=**state))**+**
geom_line()**+**
facet_wrap(**~** month)**+**
theme_minimal()**+**
labs(title**=**'Why does July have a big spike?')
Image by Author
这张图表向我们展示了排名前五的州,全天都有相似的 UFO 目击时间。然而,在 7 月份,我们注意到晚上 8 点以后出现了更多的目击事件。这可能与 7 月 4 日假期有关吗?更多的人在外面看着天空放烟花,也许?
df **%>%**
group_by(state)**%>%**
filter(state **%in%** **c**('ca', 'wa', 'tx', 'fl', 'ny'))**%>%**
count(hour,month,day)**%>%**
ggplot(aes(day, n, color**=**state))**+**
geom_line(size**=**1.5)**+**
facet_wrap(**~** month)**+**
labs(title**=**'People apparently can\'t tell fireworks and UFOs apart')**+**
theme_minimal()
Image by Author
令人失望的结论:烟花被误认为不明飞行物
目击人数最多的两天确实是 7 月 4 日和新年前夕,这两天有成千上万的人向夜空燃放烟花。我曾希望在年中出现神秘的目击高峰会有一个更酷的原因——但结果很可能只是人们把烟花误认为外星人的飞船。
UFO 目击事件中唯一的循环模式是美国人每周的例行公事。我在这里没有看到太多的证据表明,人们看到的不明飞行物超出了他们的预期,因为他们在周末和假期增加了休闲时间和饮酒量。
本节结束后,让我们回到文本描述,看看我们是否能在那里找到感兴趣的东西。
使用网络可视化在 UFO 描述中寻找模式
这个 igraph 和 ggraph 包将在这里帮助我们。我强烈推荐大卫·罗宾逊和茱莉亚·西尔格免费的《T4》杂志。
*#need 3 things after have igraph object: node edges and labels*
library(igraph)library(ggraph)big_graph **<-** bigrams_filtered **%>%**
filter(n **>** 200)**%>%**
graph_from_data_frame()
*#for some reason the edge_alpha argument isn't changing. It should make alpha levels proportional to the number of occurrences in the text.*
a **<-** grid**::**arrow(type **=** "open", length **=** unit(.05, "inches"))
ggraph(big_graph, layout **=** "fr") **+**
geom_edge_link(aes(edge_alpha **=** n), show.legend **=** **FALSE**,
arrow **=** a, end_cap **=** circle(.07, 'inches')) **+**
geom_node_point(color **=** "red", size**=**2) **+**
geom_node_text(aes(label **=** name), vjust **=** 2, hjust **=** 1) **+**
theme_void()
Image by Author
这张图表很好地概述了不明飞行物的主要描述。箭头的方向指示该单词是二元组对中的第一个还是第二个单词。
不明飞行物热点的地理可视化
为了总结我们的分析,让我们把重点放在地理位置上,看看我们是否能在目击事件中找到任何“热点”或模式。
为了使用纬度和经度绘图,我们将遵循我在 ggmaps 教程中概述的相同策略。首先,groupby()位置,然后平均每个城市的纬度和经度。如果你想知道这是怎么做到的,请点击这里。
注意:我相信谷歌地图已经改变了他们的 API。现在你必须注册进入。
us_map **<-** get_map('USA', zoom **=** 3,maptype **=** 'satellite')**%>%**
ggmap()
us_map
Image by Author
*#cities with over 50 sightings*
over_50 **<-** df **%>%**
count(city,state)**%>%**
filter(n **>** 1)**%>%**
unite('location', **-**n, sep**=**',')
head(over_50)## # A tibble: 6 x 2
## location n
## <chr> <int>
## 1 29 palms,ca 2
## 2 abbeville,la 4
## 3 abbeville,sc 2
## 4 aberdeen,md 5
## 5 aberdeen,nj 2
## 6 aberdeen,sd 2*#Now it's in the shape we need to plot. Not gunna lie: this took me like 10 mins to get working*
lat_long **<-** df **%>%**
unite('location', **c**('city','state'), sep**=**',')**%>%**
filter(location **%in%** over_50**$**location)**%>%**
mutate(latitude **=** **as.numeric**(latitude),
longitude **=** **as.numeric**(longitude))**%>%**
group_by(location)**%>%**
summarize(lon **=** mean(longitude, na.rm**=TRUE**),
lat **=** mean(latitude, na.rm**=TRUE**),
cts **=** n())**%>%**
ungroup()
head(lat_long)## # A tibble: 6 x 4
## location lon lat cts
## <chr> <dbl> <dbl> <int>
## 1 29 palms,ca -116.05417 34.13556 2
## 2 abbeville,la -92.13417 29.97444 4
## 3 abbeville,sc -82.37917 34.17806 2
## 4 aberdeen,md -76.16444 39.50944 5
## 5 aberdeen,nj -74.22212 40.41710 2
## 6 aberdeen,sd -98.48611 45.46472 2
我们已经准备好将我们的数据框架覆盖在我们的国家地图上。
us_map **+**
geom_point(data**=**lat_long, aes(lon, lat, color**=**cts, size**=**cts, alpha**=**cts))**+**
scale_color_gradient(low**=**'blue', high**=**'red')**+**
guides(color**=FALSE**)**+**
labs(title**=**'US UFO sightings since 1944')
Image by Author
除了大多数目击事件发生在沿海大城市(大多数人居住的地方),有趣的是在中西部看到一个很大的垂直差距,那里几乎没有目击事件发生。我想知道地理特征(山脉/河流)是否在起作用。几乎有一条垂直线将美国分成两半。
堪萨斯州、内布拉斯加州、南达科他州和北达科他州的不明飞行物在哪里?在内华达州北部和爱达荷州,也有一个观察缺口。
我们能放大看得更清楚吗?
us_idaho **<-** get_map('Idaho, USA', zoom**=**5, maptype **=** 'satellite')**%>%**
ggmap()
us_idaho **+**
geom_point(data**=**lat_long, aes(lon, lat, color**=**cts, size**=**cts, alpha**=**cts))**+**
scale_color_gradient(low**=**'blue', high**=**'red')**+**
guides(color**=FALSE**)**+**
labs(title**=**'Why no UFOs in Idaho?')
Image by Author
显然,人口越多,目击的机会就越多。可能是人口相对稀少的地区导致了这种现象。也有可能是不明飞行物厌恶土豆。我不确定我们是否会知道。目前,我坚持土豆假说。
能否将不同地区的关键词可视化?
为了做到这一点,我们将查看每个地区最常见的单词。
library(ggrepel)words_map **<-** df **%>%**
unite('location', **c**('city','state'), sep**=**',')**%>%**
unnest_tokens(words, comments)**%>%**
filter(**!**words **%in%** stop_words**$**word) **%>%**
filter(**!**words **%in%** **c**('las', 'los', 'san', 'quot', 'diego', 'sky', 'angeles', 'object',
'light', 'lights', 'beach', 'jose', 'francisco', 'antonio',
'tinley', 'myrtle', 'salt', 'texas', 'bright',
'moving', 'monica', 'colorado', 'city', 'barbara','flying',
'shaped', 'shape', 'santa', 'object', 'objects', 'craft',
'moved', 'alaska', 'downtown', 'north', 'south', 'east', 'west',
'rapids','sighting', 'cajon', 'simi', 'boca', 'paso',
'lauderdale', 'grand', 'puget', 'nuforc', '39s',
'looked', 'nyc', 'obj', 'cruz', 'missouri','springs', 'note',
'appeared', 'hotel', 'night', 'park', 'red', 'palm',
'des', 'moines'))**%>%**
filter(str_detect(words, '[[:alpha:]]'))**%>%**
filter(nchar(words) **>** 2)**%>%**
filter(words **!=** 'ufo')**%>%**
filter(**!**words **%in%** df**$**city)**%>%**
count(location, words, sort**=**T)**%>%**
filter(n **>** 12)**%>%**
inner_join(lat_long, by**=**'location')
head(words_map)## # A tibble: 6 x 6
## location words n lon lat cts
## <chr> <chr> <int> <dbl> <dbl> <int>
## 1 seattle,wa sound 37 -122.3308 47.60639 524
## 2 seattle,wa green 35 -122.3308 47.60639 524
## 3 seattle,wa hovering 27 -122.3308 47.60639 524
## 4 phoenix,az formation 24 -112.0733 33.44833 450
## 5 seattle,wa fast 24 -122.3308 47.60639 524
## 6 las vegas,nv green 23 -115.1364 36.17500 363us_map **+**
geom_point(data**=**words_map, aes(lon, lat, alpha**=**n, size**=**n), color**=**'red')**+**
geom_text_repel(data **=** words_map, aes(label **=** words, size**=**n), color**=**'green')**+**
labs(title**=**'Key words from UFO sightings around the US')
Image by Author
概述结果
首先,你应该注意到我去掉了单词“红”和“夜”,以便为其他可能更有意义的单词腾出空间。所以如果你在晚上看到一些红色的东西,很有可能是不明飞行物。
第二,我们看到快速发光的火球似乎在西雅图更常见。尽管在德克萨斯州南部似乎也有许多绿色火球。顺便说一下,西雅图火球会成为一个很棒的 NBA 队名。随便说说。
看看哪些地区见证了 UFO 的形成也是很有趣的。看起来加州哈瓦苏湖和亚利桑那州凤凰城附近的地区更容易看到不明飞行物。
解释爱达荷州附近没有不明飞行物的最终理论…
不明飞行物不多的区域似乎位于 51 区声称存在的大致区域,这只是巧合吗?大概不会。大部分地形都是沙子和山脉,周围很少有人能看到不明飞行物。如果我们发现一个人口非常少但有很多 UFO 目击事件的地方,我会非常惊讶。这表明那里发生了不正常的事情。
m **<-** get_map('Groom Lake, Nevada', zoom **=** 6, maptype**=**'terrain')**%>%**
ggmap()
m **+** geom_point(data**=**lat_long, aes(lon, lat, color**=**cts, size**=**cts))**+**
scale_color_gradient(low**=**'blue', high**=**'red')**+**
guides(color**=FALSE**)**+**
labs(title**=**'Sightings surrounding Area 51')
Image by Author
初步结论
根据这张图表,似乎没有任何无人居住的地区有大量的不明飞行物:不明飞行物报告基本上是有更多的人在周围进行不明飞行物报告的功能-而不是不明飞行物的任何潜在增加。这向您展示了没有因果知识的纯数据分析的局限性:垃圾进,垃圾出。我要说的是,这些报告中很大一部分可能是误报。
当我们发现 7 月 4 日和新年前夕的烟花是导致报告数量激增的原因时,我对报告的质量失去了很多信心。事实上,在周末有更多的报道也是可疑的。大多数报告可能只是人们有更多空闲时间的结果。此外,考虑到人们看到的大量“光”,它们可能有太多的可能性。
同样令人不安的是,几乎再也看不到“雪茄形”或“盘形”飞碟了。以我的钱来说,我只会相信发生在白天和晴朗的天气条件下的目击事件。
很明显,真相仍然存在。
面向所有人的数据分析介绍,第 2 部分
原文:https://towardsdatascience.com/data-analysis-for-everyone-part-2-cf1c79441940?source=collection_archive---------7-----------------------
在上一部分中,我们讨论了分析师成为全面的分析师或数据科学家所需的软技能。我们希望您有机会阅读它,因为它为您的所有团队成员奠定了一个很好的基础。
下一节将讨论商业分析的过程。这将有助于数据科学团队和分析师改善沟通和工作的可追踪性,并提高速度和清晰度。
重要更新!: 普华永道(PwC)最近公布的研究显示,雇主在寻找优秀的数据科学家、分析师和工程师方面面临困难。
Picture is from the PwC article linked above
我们将做一些快速的代码片段和笔记本。在这种情况下,我们将使用 Jupyter 笔记本。我们正在做的许多工作也可以在 Excel 或 r 中完成。
对于那些没有使用过 Jupyter 笔记本的人,这里有一个快速介绍。
数据科学指南
我们想补充的是,这一节的重点是规划流程,我们将在接下来的几节中提供需要解决的问题和更具体的演练。
像大多数其他学科(会计、金融、运营、软件开发)一样,数据科学家应该在工作中采用方法论。我们正在规划的过程绝不是唯一的过程,我们也不会每次都遵循它。然而,它确实有助于通过创建单个分析师可以满足的界限和目标来提高速度和减少错误。
类似于许多其他过程,总是有适应和添加个人步骤的回旋余地(像敏捷)。我们的团队使用这个过程更像是指导方针。
本节的目标是
分析结束时的目标是你的数据团队能够清晰地传达他们的想法,并且他们能够复制他们的方法。介于两者之间的是数据科学团队。只要能让它们有效,就是目标,只是不要欺骗你自己。
如果你告诉自己不需要笔记或评论,那你就是在撒谎。
如果你认为格式不重要,那你是在自欺欺人。
如果你认为其他人不够聪明,不能理解你的分析…记住..爱因斯坦在 E=mc 中解释了一个复杂得多的过程,连中学生都明白这一点。
所以如果你的分析不能被拥有 MBA 和 20 年经验的高管理解。可能不是他们。这可能是你的分析,即使你的发现非常出色,可以为公司节省数百万美元。解释不了也没关系。
你的分析想必大家都懂!
数据分析的过程
1.开始一个有清晰标签的新笔记本
我们在第一部分讨论过,关键是要注重细节。这需要有条理,并确保第一步是建立一个新的笔记本。
这意味着,没有建立一个名为“无标题 _V1”的笔记本。
确保你的项目有一个清晰的名字。一些分析师和程序员喜欢想出吸引人的名字,比如“乌贼”、“Jaberwoki”或其他一些奇怪但有意义的名字。
我们将把这个 Jupyter 笔记本命名为“创世纪”。仅作为您开始数据分析和数据科学之旅的参考!
此外,写一些关于笔记本用途、用途、修改者等的快速笔记。
这将让 5 年后偶然发现你的数据笔记本的分析师和数据科学家有能力理解它。
然后…建立某种形式的颠覆。你最不想玩的就是,哪个工作本是最近更新的。
NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.
2.召开一个明确的回顾会议或开始
这不是大多数一步一步跟着做的人能够做到的。然而,当设计一个产品、指标、仪表板、做研究或为任何其他团队或企业主甚至你自己的团队设计一个新的数据科学工具时,这是一个关键点。
你需要召开一两次会议来帮助数据团队清楚地了解他们将要承担的工作。再次延伸,回到我们的第一部分。我们在本系列的第一部分讨论了移情倾听。现在是时候开启这项技能了!
商业和技术团队仍然说着截然不同的语言。因此,通晓两种语言是有益的。一个能够倾听不仅仅是硬工程需求的数据科学家是物有所值的。
这不是一个普通的技能。有时,很容易从业务团队获得需求,而对请求的实际环境充耳不闻。
然而,这正是所有增值的来源!打造一个产品是伟大的,避免镀金很重要!
然而,这意味着您需要倾听并找出实际的业务问题。这在会议之外很难模拟…实际上,在会议中甚至会很困难。
这意味着问一些好的问题,表明你理解当前的话题,同时寻找隐藏的信息。
以下是数据科学团队应该向产品团队提出的一些示例问题:
- 谁可以看到这个项目?
- 我们已经有类似的产品了吗?
- 我们的数据科学团队需要参与进来吗?还是可以由工程团队来做?(数据科学团队通常资源有限,项目需要有意义)
- 我们具备完成数据科学项目所需的技能吗?
- 您正在查看的数据集是什么?
- 谁会使用这个工具?
- 有多少人会使用该产品?
- 你目前知道这个产品的投资回报率吗?(这可能需要你的团队进行研究)
- 可以列举几个问题吗?让我们知道!
3.探索偏见
在设置问题和设计指标和仪表板之前。我们喜欢寻找偏见,玩弄数据,哪怕只是一点点。我们的团队将根据数据的大小和复杂程度,分配一定的时间来玩游戏。
这是我们寻找偏差、寻找缺失数据、寻找任何可能奇怪的东西的时候。
这有几个目的。
第一,它有助于我们为将来的分析列出可能的问题。
第二,如果数据是坏的,我们尽快找出原因。有时坏数据很容易被发现。如果一半的字段为空,或者如果数值有字母字符,等等。嗯…
是时候重新开始了,希望它不像看起来那么糟糕!
那么如何探索偏倚和不良数据呢?
这里有一些很好的第一步。
导入您的库
NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.
自动化插件:
现在,我还将在这里添加一个奖金部分。这与分析关系不大,与自动化关系更大。还记得我们有一个快速的一行脚本,只提取数据类型和字段名吗?
如果您在数据库中跟踪元数据会怎么样!如果您计划围绕数据集开发一个完整的系统,或者有多个非常相似的数据集需要不断地处理,那么这种方法就更适用了。
我的背景是数据工程,所以这是一个你很早就学会的帮助自动化 ETL 和分析的技巧。尤其是当您从多个具有不同字段名的人那里获得相似的文件时,这些字段名意味着相同的事情。然后,您可以轻松地重新映射,或者轻松地加载,并根据您的标准化方法和它们的字段名进行分析!
【数据透视表】
NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.
直方图
NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.
相关矩阵
NOTE: You can scroll through these notebooks or click on the file name in the left corner to view the entire file on Github.
已经可以得出什么结论了?
嗯,我们一直在探索数据,以寻找任何可能突出的东西,这既有助于开始整理我们可能会有的问题,也有助于检查数据中的偏见和不良数据。
你已经得出什么结论了吗?
注意直方图和相关矩阵中的任何东西吗?
我们已经讨论过,我们注意到数据在满意度水平上是向右倾斜的。这是有道理的,因为如果一家公司真的很差,满意度处于中间,并且从那里平均分布。没有人会在那里工作。
当然,它可能只是一个从 0.7 到 1 的高斯分布。这可能更有意义。
然而,我们说的是一群不满意的人。
接下来,看相关矩阵。什么与什么相关?在我看来,最大的关联之一是“左”域和“满意度”域之间的关联。
它们是负相关的。这意味着,满意度越低,“离开”字段就越接近于 1,即表示离开的人。
因此,与员工主动离职实际相关的少数变量之一是“满意度”。你已经有线索了!
这只是一条线索。从这里开始,你的团队会有更多的问题!
你会想分析这两个不同的群体。也许用 IQR 来分离满意度最低的员工..你可以选择一个你觉得合适的数字。
这似乎不太科学..
现在,你可以分析两组并比较特征!
- 有导致员工离职的事件吗?(没有加薪,过了一周年没有升职,缺乏互动)
- 不同类型的员工(分析师和主管)在离职前会描绘出不同的特质吗
- 加薪幅度对员工的离职有影响吗
- 等等
计算和管理空值或 Nans
目前,我作为例子使用的数据集没有空值。您可以使用这段代码:
s.isnull()。sum()"
这是一种查看和跟踪空值的简单方法。
情况并非总是如此。事实上,我记得我曾经使用过的一组信用卡数据到处都是空值,包括收入水平、消费率等等。
它只占数据的 10%-15%。因此,我们最终找到了特定特征的每个邮政编码的平均值,并替换了空值。而不是排除数据。
这当然是一个有根据的猜测。但是,这是确保尽可能接近准确数据的好方法。
4.列出你想回答的问题
我们在分析的探索阶段开始这样做。让我们继续这个讨论。
一个很容易被忽略的重要步骤是定义您的数据团队想要回答的问题,因为分析有一种将您拖入兔子洞的方式。
团队是由数据科学家、分析师、营销人员还是企业主组成的团队并不重要。
没有一系列的问题,你可能会花上几天的时间在原地打转,却没有真正的结论。
设置问题就像设置目标。它帮助你定义什么是完成。没有它,您可能会不断地进入数据。
也就是说,每回答一个问题,可能会引出 3 个新问题。这很好也很自然。这也是过程的一部分。再次,追踪这些问题!
这样做的目的不仅仅是为了制定目标,也是为了当你的团队开始浏览你的笔记本,并与主管一起发现每个人都很容易遵循。把这个想的更像一本故事书,只是有数据!确保你可以重新追踪你的步骤,这样你就可以重新解释你的分析。
5.使用不同的方法分析数据集
我们新的计算能力。我们不再局限于标准差、数据透视表和五分位数。这些都是很好的分析方法。然而,我们现在有一系列不同的算法和工具可以帮助我们查看数据。
这包括、k-nn、支持向量机、boosting、bagging 和一群其他算法。
因为有太多的算法可以深入研究。我们将在未来的几个章节中专门介绍如何将这些不同的算法应用于不同的数据集。来展示它们是如何被使用的。
6.如有必要,联系 SME(主题专家)
作为数据科学家,我们并不总是了解不同主题的一切。也许我们处理过医疗保健数据,但从未处理过会计或电子商务数据。
此外,每家公司存放的数据略有不同。因此,通过获取所有可能的上下文来解决问题是很重要的。
这意味着去找管理这些过程的人。这可能是董事,或者企业主,他们实际上负责你正在分析的过程。他们将对整个过程有一个很好的概述,这将帮助你作为一个分析师理解你正在看的数据。
例如,我们最近与一家旅行报销公司的开发人员交谈,他提到了这样一个事实,即他们的应用程序逻辑只向两个数据库中的一个插入数据。这使得一个数据库不同步。可悲的是,这些错误一直在发生。然而,如果你不去和开发商和导演谈。这就像看一个黑盒子
开发人员注意:当我们来寻找过程中的漏洞时,开发人员请对我们诚实和透明。我们不是想让你难堪…我们只是想找出数据错误的原因。在会议中,我们称之为 bug,我们也不希望你惹上麻烦!
一旦你习惯了追踪 bug 的系统(至少对我来说是这样),这实际上是一种乐趣。).就我个人而言,我喜欢在查看系统之前猜测是什么导致了数据差距。当你是对的时候,感觉很神奇,就像实验室之王一样神奇!
7.同行评审您的结果
错误是会发生的,通过分析,坏的假设随时都会出现。遗憾的是,不像在编程中那样,它们只是一些错误,有些是意料之中的。
作为分析师或数据科学家的错误仅仅是错误。少了一个数字,你的整个分析就完了。
因此,对于每个项目,以常规的节奏后退一步,并回顾正在完成的工作是很重要的。这也是为什么保持一个清晰简洁的笔记本很棒的原因。这样,当你向你的团队演示时。你可以很容易地解释每个细节。
同行评审者应该寻找错误、格式问题和理解的难易程度。如果你自己的团队不能理解你想说的话,那么一个没有和数据科学家密切合作过的主管就很难完全掌握结论。
我们的团队以及许多其他程序员和分析师喜欢说:
“如果你不能简单地解释它,你根本不理解它”
8.定期会见业务或产品负责人
类似于敏捷编程方法。与正在进行的项目的业务负责人和产品经理会面是有帮助的。
通过这样做,数据团队变得更加适应产品的实际需求,并且增加了非技术所有者的所有权。
这里也有风险。
有时,这可能会导致企业所有者希望增加许多新的特性,因为产品仍在作为 MVP 进行开发。一个团队永远不会在这种状态下完成产品。因此,定期会面很重要,但也要保持在项目的原始范围内。
摘要
数据科学和分析与许多其他学科非常相似。它需要透明度和指导方针,以避免重复工作和易于理解。作为数据人员,很容易认为每个人都明白我们在谈论什么。然而,企业主和产品经理经常忙于管理数百名员工、客户或其他变量。
因此,这取决于我们,分析师,将我们的过程提炼成一个清晰的信息。
我们接下来要讨论的:
这仅仅是数据分析过程的概述。在接下来的几周里,我们将通过不同的数据集进行更深入的研究。我们鼓励你结合例子和自己动手解决问题。
我们还将讨论应用其他最佳商业实践。包括如何建立自动化数据科学系统、数据工程等。
如果您还想了解更多关于商业基础应用统计学的信息,请阅读下面的文章:
基础统计学每一个数据科学都应该知道的
如何将统计学应用于真实的商业问题
出色的决策树示例
我们的团队还为希望帮助员工发展分析能力的公司提供培训课程。如果您有兴趣在贵公司举办分析研讨会和课程,请点击这里查看我们的服务!我们将乐意讨论我们的团队如何帮助开发您的才能以提高他们的能力,并提供 21 世纪急需的技能。
R 中的数据分析:美国监狱到底有多拥挤?
原文:https://towardsdatascience.com/data-analysis-in-r-just-how-overcrowded-are-us-prisons-9b78317125bc?source=collection_archive---------14-----------------------
美国是世界上监禁率最高的国家之一,但是具体哪个州是最糟糕的呢?
Photo by Mitchel Lensink on Unsplash
这些数据来自司法统计局网站,该网站有许多关于美国犯罪的有趣数据。我鼓励你去探索它们。这个特殊的数据集叫做“2015 年的囚犯”
衡量监狱容量:三种方法
我们都在同一页上,BJS 以三种方式衡量“容量”: 运行容量 ,这是“根据设施的工作人员、现有方案和服务可以容纳的囚犯人数”,以及 额定容量 ,这是“官员给出的评级”,最后是 设计容量 ,这是“设施最初打算容纳多少名囚犯建筑师/规划师。”
简而言之,这些数字都会略有不同,因此如何定义“容量”会导致不同的结论。例如,如果我们使用运行容量,一个监狱可能有 110%的容量过剩,但是如果我们使用额定容量,只有 95%的容量过剩。
读入数据并清理干净
library(tidyverse)
library(stringr)
*#the original files used ... and / to denote NAs*
df **<-** read.csv('prison.csv', skip**=** 12, stringsAsFactors **=** **FALSE**, na.strings **=** **c**("…", '/'))
*#check out the data*
head(df,5)
## Jurisdiction Rated Operational Design Custody.population
## 1 Federal/b 134,461 <NA> <NA> 160,946
## 2 Alabama/c <NA> 25,763 13,318 24,814
## 3 Alaska/d <NA> 5,352 <NA> 5,247
## 4 Arizona 37,238 43,747 37,238 35,733
## 5 Arkansas 16,194 16,233 15,382 15,784
## Lowest.capacity.a X Highest.capacity.a X.1
## 1 119.7 % 119.7 %
## 2 186.3 96.3
## 3 98.0 98.0
## 4 96.0 81.7
## 5 102.6 97.2
这个数据集处理起来特别烦人,因为由于某种原因……没有得到正确处理,直到我使用双引号手动复制并粘贴这些值。
将另一个数据框架与州人口关联
*#remove extra columns*
df **<-** df[1**:**51,**-c**(7,9)]
*#Convert NAs to 0*
df[**is.na**(df)] **<-** 0
*#We are going to join our dataframe to this one later*
state_pop **<-** read.csv('statepop1.csv')
*#Correct backslashes in names of jurisdictions*
bad **<-** df[which(str_detect(df**$**Jurisdiction, '[:punct:]')),]**$**Jurisdiction
*#if have slash, then delete last three chars*
df[which(str_detect(df**$**Jurisdiction, '[:punct:]')),]**$**Jurisdiction **<-** str_sub(bad, end **=** -3)
*#this one manually do because had 3 chars after slash*
df[which(df**$**Jurisdiction **==** 'Idaho/e'),]**$**Jurisdiction **<-** 'Idaho'
*#replace commas in numbers*
df[,2**:**ncol(df)] **<-** lapply(df[,2**:**ncol(df)], **function**(x) **as.numeric**(gsub(",", "", **as.character**(x))))
*#make column names the same for joining*
colnames(df)[1] **<-** 'state'
full_df **<-** left_join(df,state_pop, by**=**'state')
*#we'll use the total population of the USA for the federal population*
full_df[1,'pop_est_2014'] **<-** 325000000
*#instead of high and low capacity percentages, we'll average both to get one statistic*
avgcap **<-** full_df **%>%**
group_by(state)**%>%**
mutate(avg_cap **=** mean(**c**(Lowest.capacity.a, Highest.capacity.a)))
*#apply to new column*
full_df**$**avg_cap **<-** avgcap**$**avg_cap
现在,我们的人口统计数据有点偏差,因为这些数据包括了 18 岁以下的儿童。为了公平起见,我们将估计 18 岁以上的州居民人数。根据谷歌的数据,美国大约 76%的人口年龄超过 18 岁。因此,我们将把每个州的人口减少 24%。这是我们的“监狱年龄人口”的数字
full_df **<-** full_df **%>%**
mutate(pop_est_2014 **=** pop_est_2014*****.76)
*#Now compute the % of prison age population in prison*
full_df **<-** full_df **%>%**
mutate(pop_prison_perc **=** Custody.population**/**pop_est_2014*****100)
州监狱中居民比例最高的 10 个州
full_df **%>%**
group_by(state)**%>%**
arrange(desc(pop_prison_perc))**%>%**
head()**%>%**
ggplot(aes(reorder(state, pop_prison_perc), pop_prison_perc, fill**=**state))**+**
geom_col()**+**
scale_y_continuous(breaks **=** seq(from**=**0, to**=**1, by**=**.1))**+**
labs(title**=**'States with highest % in state prisons', x**=**'states')
因此,根据这些数据,阿拉斯加和特拉华州都有近 1%的人口被关押在州立监狱。这不包括监狱人口,因此应该被认为是一个保守的估计。**注意:**一位细心的读者(在阿拉斯加惩教署工作)向我指出,上面的图表可能会有轻微的误导,原因如下。
阿拉斯加与其他州不同,基本上没有监狱系统。在阿拉斯加,等待审判和判决的被告被关押在监狱中,而在大多数其他州,这些人将被关押在监狱中。换句话说,阿拉斯加的数据包括监狱人口。特拉华州可能也有类似的系统,这可能解释了为什么特拉华州和阿拉斯加州在上图中显得异常。
哪个州的平均容量最高呢?
full_df **%>%**
arrange(desc(avg_cap))**%>%**
head(10)**%>%**
ggplot(aes(reorder(state, avg_cap), avg_cap, fill**=**state))**+**
geom_col()**+**
labs(title**=**'Top 10 states with most overcapacity prisons', x**=**'State')**+**
geom_hline(yintercept**=**100, color**=**'red', linetype**=**'dotted', size**=**2)**+**
coord_flip()
我们看到伊利诺伊州在最拥挤的监狱方面遥遥领先。有人知道为什么那里特别差吗?
这篇文章暗示这是因为伊利诺伊州的量刑法律存在问题。
哪些州的监狱最不拥挤呢?
full_df **%>%**
filter(**!**state **%in%** **c**('Nevada', 'Connecticut'))**%>%** *#Nevada and Connecticut state data were missing!*
arrange(avg_cap)**%>%**
head(10)**%>%**
ggplot(aes(reorder(state, avg_cap), avg_cap, fill**=**state))**+**
geom_col()**+**
labs(title**=**'Top 10 states with least overcapacity prisons', x**=**'State', y**=**'Capacity')**+**
geom_hline(yintercept**=**100, color**=**'red', linetype**=**'dotted', size**=**2)**+**
coord_flip()
新墨西哥州和密西西比州的监狱似乎是最不拥挤的。然而,像 T2 这样的报道表明新墨西哥州的监狱人口正在快速增长。请记住,这些是 2015 年的数据。
人们经常提到囚犯的住房/饮食/医疗费用很高。
让我们直观地检查一下成本,看看这是否可能是真的
谷歌告诉我,每个囚犯的平均年成本约为 31,100 美元。这相当于每天 84 美元。我住的大多数酒店价格都比这个低。一些州,如纽约,每年支付高达 60,000 美元来照顾州立监狱的囚犯。
更新我发现各州每年花在每个犯人身上的实际金额相差很大。所以当我们使用真实数量时,这个图表看起来非常不同。(我之前用州平均水平 31000 美元来估算州支出。事实证明,如果你这样做,德克萨斯州的花费是最多的——比加州还多。但实际上,德州在每个犯人身上的花费比加州少得多,所以总支出也更低。)
我们将使用来自 vera.org 网站的数据,那里有一些讨论美国监狱改革的好文章。然后我们将使用 Rvest 包下载表数据并提取数字。
用 Rvest 刮擦
library(rvest)
library(tidyverse)
url **<-** 'https://www.vera.org/publications/price-of-prisons-2015-state-spending-trends/price-of-prisons-2015-state-spending-trends/price-of-prisons-2015-state-spending-trends-prison-spending'
*#read in the website parse the html*
vera **<-** read_html(url)
*#Use the CSS selector to extract table data from the webiste*
html_data **<-** html_nodes(vera,'td')
table_text **<-** html_text(html_data)
*#turn into matrix*
mat **<-** as.data.frame(matrix(table_text, nrow**=**45, ncol**=**4, byrow**=TRUE**), stringsAsFactors **=** **FALSE**)
*#trim strings*
mat[, 2**:**ncol(mat)] **<-** lapply(mat[,2**:**ncol(mat)], stringr**::**str_trim, 'both')
*#replace commas in numbers and dollar signs*
mat[,2**:**ncol(mat)] **<-** lapply(mat[,2**:**ncol(mat)], **function**(x) **as.numeric**(gsub("[\\$,]", "", **as.character**(x))))
*#Rename columns*
mat **<-** mat **%>%**
rename('state' **=** V1, 'prison_pop' **=** V2, 'prison_exp' **=** V3, 'per_inmate' **=** V4)
现在我们已经处理了刮出的数字,让我们可视化结果
*#inmate spending*
ggplot(mat, aes(reorder(state, per_inmate), per_inmate, fill**=**state))**+**
geom_col()**+**
coord_flip()**+**
scale_y_continuous(labels **=** scales**::**dollar_format())**+**
theme(axis.text.y **=** element_text(size**=**7))**+**
labs(title**=**'Actual spending per inmate by state', x**=**'State', y**=**'Avg. annual spending per inmate')*#total expenditures*
ggplot(mat, aes(reorder(state, prison_exp), prison_exp**/**1000000000, fill**=**state))**+**
geom_col()**+**
coord_flip()**+**
scale_y_continuous(labels **=** scales**::**dollar_format())**+**
theme(axis.text.y **=** element_text(size**=**7))**+**
labs(title**=**'State expenditure on prisons', x**=**'State', y**=**'total spending in Billions $')*#total population*
ggplot(mat, aes(reorder(state, prison_pop), prison_pop, fill**=**state))**+**
geom_col()**+**
coord_flip()**+**
theme(axis.text.y **=** element_text(size**=**7))**+**
labs(title**=**'Number of state prisoners', x**=**'State', y**=**'total prison population')
可悲的是,相对而言,德克萨斯州和佛罗里达州有很多囚犯,但他们在每个人身上的花费很少,所以总支出有点低。我不知道他们怎么或为什么能在囚犯身上花这么少的钱。
Vera.org 建议,与其用监狱人口来划分支出,不如用州人口来划分支出可能更有意义。Vera.org 指出,囚犯成本高的州之所以出现,是因为这些州的人员与囚犯比率较低,平均工资较高。
让我们再次制作这个条形图,但这次我们将查看每名纳税人(18 岁或以上)的囚犯支出。
*#join the two tables*
df_join **<-** mat **%>%**
inner_join(full_df, by **=** 'state')**%>%**
mutate(per_taxpayer **=** prison_exp**/**pop_est_2014)
*#plot the per taxpayer avg spending per inmate*
ggplot(df_join, aes(reorder(state, per_taxpayer), per_taxpayer, fill**=**state))**+**
geom_col()**+**
scale_y_continuous(breaks **=** seq(0,600, 100),labels **=** scales**::**dollar_format())**+**
coord_flip()**+**
theme(axis.text.y **=** element_text(size**=**7))**+**
labs(title**=**'Per resident spending', x**=**'State', y**=**'Prison spending per resident')
这张图描绘了一幅与之前每个犯人的花费截然不同的画面。现在监禁率低的州将会平等。举个例子,犹他州的监禁率和人均支出都很低,因此每个纳税人的支出也很低。回想一下之前,我们看到阿拉斯加和特拉华州都有近 1%的成年人入狱。
由于相对较高的监禁率和每个囚犯的花费,他们的每个纳税人的成本相当高。
最后,支出和产能过剩有什么联系吗?我们会认为更多的支出与更少的拥挤相关,对吗?
df_join **%>%**
filter(**!**state **%in%** **c**('Federal', 'Nevada', 'Connecticut'))**%>%**
ggplot(aes(per_inmate, avg_cap, size**=**pop_est_2014, color**=**state))**+**
geom_point()**+**
scale_x_continuous(labels **=** scales**::**dollar_format())**+**
geom_text(aes(label **=** state), vjust **=** -1)**+**
theme(legend.position **=** "none")**+**
stat_smooth(method**=**'lm',color**=**'black', se**=FALSE**)**+**
labs(title**=**'Is there a relationship between spending and overcrowding?')
这很有意思。一个州的人均囚犯支出和监狱容量过剩之间似乎没有关系。从本质上说,这意味着大部分囚犯支出并没有用于缓解过度拥挤,尽管这些支出可能会用于提高警卫和医疗服务的工资。
纳税人人均囚犯支出和产能过剩之间的关系如何?
df_join **%>%**
filter(**!**state **%in%** **c**('Federal', 'Nevada', 'Connecticut'))**%>%**
ggplot(aes(per_taxpayer, avg_cap, size**=**pop_est_2014, color**=**state))**+**
geom_point()**+**
scale_x_continuous(labels **=** scales**::**dollar_format())**+**
geom_text(aes(label **=** state), vjust **=** -1)**+**
theme(legend.position **=** "none")**+**
stat_smooth(method**=**'lm',color**=**'black', se**=FALSE**)**+**
labs(title**=**'Is there a relationship between per taxpayer spending and overcrowding?')
其次,每个纳税人在囚犯身上的支出与产能过剩之间的关系是正相关的。不知何故,每个纳税人花费更多与监狱更加拥挤有关。这非常违背直觉。人均纳税人支出最高的两个州是监禁率相对较高且人口较少的州,这是巧合吗?
国家人口和过度拥挤
full_df **%>%**
filter(**!**state **%in%** **c**('Federal', 'Nevada', 'Connecticut'))**%>%**
ggplot(aes(avg_cap, pop_est_2014, size**=** pop_est_2014,color**=**state))**+**
geom_point()**+**
geom_text(aes(label **=** state), vjust **=** 2)**+**
theme(legend.position **=** "none")**+**
stat_smooth(method**=**'lm',color**=**'black', se**=FALSE**)**+**
labs(title**=**'Is there a relationship between population and overcrowding?')
总的来说,在一个州的人口和过度拥挤之间似乎确实存在某种联系,尽管相对较弱。也许各州倾向于建造类似数量的州立监狱,而不考虑人口规模,从而导致人口较多的州监狱略显拥挤?
我们发现的总结
我惊讶地发现,伊利诺伊州在过度拥挤的监狱方面领先全国,阿拉斯加州和特拉华州在州立监狱中的公民比例最高,如果你看看每个纳税人的支出,这两个州是全国前两名。
就囚犯人均支出而言,加州是独一无二的。但是如果你从纳税人人均支出的角度来看,加州看起来并没有那么糟糕。所有这些都表明,计算中的细微变化会导致非常不同的结论。如果我想推动监狱改革,我可能会引用一个统计数据,即加州为每个囚犯支付的费用比其他任何州都多。然而,如果我看一下每个纳税人的支出,加州做得更好,现在看来,立即改革并不那么紧迫。
原载于 2018 年 6 月 28 日https://greenet 09 . github . io。
航空公司的数据分析:达美航空和阿拉斯加航空
原文:https://towardsdatascience.com/data-analysis-on-airlines-delta-and-alaska-8062c970b1d?source=collection_archive---------1-----------------------
当我与家人或朋友一起旅行时,我的脑海中总有一个问题:我应该选择哪家航空公司?在 Expedia 或 PriceLine 等网站上搜索目的地时,会列出很多航空公司。如果价格和时间都差不多,我怎么知道哪家航空公司最适合我?我们相信许多人都有这个问题,并决定使用信号平台来分析客户声音数据,以了解用户体验。我们使用内置的脸书数据连接器来分析美国的两家主要航空公司,达美航空公司和阿拉斯加航空公司。
达美航空是美国历史第六悠久的航空公司,也是最受顾客欢迎的前三大航空公司。达美航空的准时到达率排名第三,处理不当的行李数量排名第三。与此同时,阿拉斯加航空公司作为主要竞争对手之一大放异彩。阿拉斯加航空公司在 J.D. Power 航空公司满意度调查中名列榜首,覆盖美国大陆 100 多个目的地。由于两家航空公司的得分都很高,我们的下一步是分析客户对脸书的评价。
Signals 是两家航空公司从脸书页面收集数据的绝佳工具。对于一线员工来说使用起来很简单,不一定要成为数据科学家才能使用。你所需要做的就是脸书页面的 URL,以及我们内置的数据连接器(见相关博文:客户分析数据连接器)。以下是我们在数据中发现的情况:
根据分析,我们可以看到阿拉斯加航空公司的客户满意度得分高于达美航空公司,尤其是在更好的客户服务方面。不过达美也有自己让人喜欢的特色,比如有女飞行员,还有他们的天空俱乐部服务。Signals 为决策者提供了一种快速简便的方法来查看反馈的主要类别,并收集有关未来改进领域的见解。由于旅客对达美航空的客户服务评分较低,他们的管理团队可能希望专注于提高准点率。降低航班延误的可能性将大大改善客户体验。
达美航空的另一个机会是通过增加座位的宽度和腿部空间来帮助客户更加舒适。对于托运行李,航空公司需要更加明确退款政策。如果客户支付了行李费,但行李被放错地方几天,破坏了旅行,航空公司需要退还托运行李费,并承诺这种情况不会再次发生。当然,如果承运人永久丢失行李,航空公司需要为客户退还损失!
Signals 平台非常适合快速分析大量反馈。Signals 指出数据集中的机会,以及改进的机会所在。对于任何一线工作人员来说,分析数据都是简单、快速和高效的。
你想分析你页面上的脸书评论,还是竞争对手的评论?获得 www.stratifyd.com 的免费试用版,并尝试运行自己的客户声音分析。如果您有任何问题,请随时联系我们【clientsupport@stratifyd.com 。我们期待与您合作!
数据分析:世界上哪个国家的健康状况最好?
原文:https://towardsdatascience.com/data-analysis-which-country-has-the-best-health-in-the-world-f41826763014?source=collection_archive---------13-----------------------
在哪些国家,你最不可能缓慢、过早、痛苦地死去?
Photo by United Nations COVID-19 Response on Unsplash
确定各国健康的 11 个方面
在这篇文章中,我将演示一些基本的数据争论和 R 中的可视化方法,同时尝试回答一个相当严肃和复杂的问题。
请记住,这些数据来自一个更加快乐和简单的前 COVID 时代。事实上,数据是由哥德堡大学政府质量研究所汇编的。它就像一个来自世界卫生组织、联合国和许多其他独立社会科学研究人员的数据集的元存储库,这些数据集被分解成不同的主题。我们将关注公共卫生。
因此,让我们看看是否可以使用 QoG 数据集来回答以下问题:
哪个国家最适合过上相对长寿、健康和幸福的生活?
我决定从 11 个维度对每个国家进行评级(基于 QoG 数据集中此类数据的可用性)。这 11 个维度是:
- 艾滋病流行率(在% )
- 空气中 PM 2.5 的程度**(100 为最佳空气,0 为最差空气)**
- 总 烟草使用
- ****婴儿死亡率(每 1,000 名新生儿的死亡率)
- 卫生水平和公共用水清洁度
- 公共服务的程度 (10 表示非常不可靠,1 表示非常稳定)
- 酒精消费(2000 年以后)
- 主观幸福感(评分 1-4 非常幸福)
- 肺结核发病率
- 联合国人类发展指数得分(0-100 分最佳)
- *2017 年肥胖率 (添加到原始数据中进行额外测量)
请注意,对于某些衡量标准,低分是好的,而对于其他衡量标准,高分是好的。我们将在后面的排名部分处理这个问题。
比较 39 个国家
首先,我们读入数据并选择 11 个变量。剔除缺失值后,我们得到了全球 39 个国家的样本。
**library(tidyverse)
df_f **<-** read.csv('qog.csv')
df **<-** df_f **%>%**
select(matches('cname'),matches('ccodealp'),matches('hiv'),matches('pm25'), matches('tobt'), matches('imort'),
matches('alc2000'), matches('ehwater'), matches('wvs_hap'), matches('ffp_ps'),
matches('wef_ct'), matches('hdi'))**%>%**
na.omit()
rm(df_f)
head(df)**
我们数据的样本:
**## cname ccodealp wef_chiv epi_pm25 who_tobt wef_imort who_alc2000
## 7 Azerbaijan AZE 0.20 94.30 23.5 30.8 2.14
## 8 Argentina ARG 0.40 100.00 25.3 12.7 7.93
## 9 Australia AUS 0.20 100.00 16.0 4.1 9.71
## 14 Armenia ARM 0.20 85.76 28.0 14.7 3.91
## 21 Brazil BRA 0.45 100.00 16.1 12.9 7.32
## 36 Chile CHL 0.40 100.00 38.9 7.8 7.16
## epi_ehwater wvs_hap ffp_ps wef_ct undp_hdi
## 7 77.47 3.052584 5.4 95.0 0.758
## 8 92.52 3.199185 4.3 25.0 0.826
## 9 100.00 3.277956 2.0 6.5 0.937
## 14 83.21 3.091120 4.1 52.0 0.741
## 21 84.66 3.264543 5.9 46.0 0.754
## 36 94.25 3.084253 4.5 16.0 0.845**
使用 rvest 丢弃肥胖数据
获取肥胖数据需要我们从 renewbariatrics 网站获取 HTML 表格。我们将使用超级易用的 Rvest 包来完成这项工作。
**library(rvest)url **<-** 'https://renewbariatrics.com/obesity-rank-by-countries/'
codes_url **<-** read_html(url)
*#Use the CSS selector to extract table data from the webiste*
html_data **<-** html_nodes(codes_url,'td')
table_text **<-** html_text(html_data)
*#easiest way is to recreate the table as a matrix and read in by row*
mat_weight **<-** matrix(table_text, nrow **=** 192, ncol**=**6, byrow**=TRUE**)
weight_df **<-** data.frame(country **=** mat_weight[,2], perc_obese **=** mat_weight[,6])
*#Get rid of percent signs and convert to decimal*
weight_df**$**perc_obese **<-** **as.numeric**(gsub('%', '', weight_df**$**perc_obese))**/**100
head(weight_df)**
由此产生的六大肥胖率:
**## country perc_obese
## 1 Cook Islands 0.508
## 2 Palau 0.476
## 3 Nauru 0.456
## 4 Samoa 0.434
## 5 Tonga 0.433
## 6 Niue 0.432**
为了保持我们原来的国家,我们需要做一些乏味但必要的改变。这张粗糙的表格使用了稍微不同的国家名称。
**idex_num **<-** which(df**$**cname **==** 'Malaysia (1966-)')
df**$**cname **<-** **as.character**(df**$**cname)
df**$**cname[idex_num] **<-** 'Malaysia'
idex_num **<-** which(df**$**cname **==** 'Pakistan (1971-)')
df**$**cname[idex_num] **<-** 'Pakistan'
idex_num **<-** which(df**$**cname **==** 'United States')
df**$**cname[idex_num] **<-** 'United States of America'
idex_num **<-** which(df**$**cname **==** 'Russia')
df**$**cname[idex_num] **<-** 'Russian Federation'**
现在棘手的部分将是匹配的名称与我们现有的名称。因为我们已经确保更改名称以使它们相同,所以我们不应该丢失任何观察结果(我希望)。让我们尝试一个 inner_join(变异连接),只保留匹配的行
***#convert to character instead of factor*
weight_df**$**country **<-** **as.character**(weight_df**$**country)
*#Nice tip: use semi_join to see what will be joined before you use inner_join*
*#I was able to see that Russia was missing*
df **%>%**
rename('country' **=** cname)**%>%**
semi_join(weight_df, by**=**'country')**%>%**
head()**
验证我们的结果:
**## country ccodealp wef_chiv epi_pm25 who_tobt wef_imort who_alc2000
## 1 Azerbaijan AZE 0.20 94.30 23.5 30.8 2.14
## 2 Argentina ARG 0.40 100.00 25.3 12.7 7.93
## 3 Australia AUS 0.20 100.00 16.0 4.1 9.71
## 4 Armenia ARM 0.20 85.76 28.0 14.7 3.91
## 5 Brazil BRA 0.45 100.00 16.1 12.9 7.32
## 6 Chile CHL 0.40 100.00 38.9 7.8 7.16
## epi_ehwater wvs_hap ffp_ps wef_ct undp_hdi
## 1 77.47 3.052584 5.4 95.0 0.758
## 2 92.52 3.199185 4.3 25.0 0.826
## 3 100.00 3.277956 2.0 6.5 0.937
## 4 83.21 3.091120 4.1 52.0 0.741
## 5 84.66 3.264543 5.9 46.0 0.754
## 6 94.25 3.084253 4.5 16.0 0.845**
好了,一切看起来都很好:没有 NAs 或疯狂的价值观。我们现在可以使用这个新的肥胖维度重新进行分析。
***#looks good so add together*
df **<-** df **%>%**
rename('country' **=** cname)**%>%**
inner_join(weight_df, by **=** 'country')**
我们最后去了哪 39 个国家?
***#Which 39 countries?*
**for** (n **in** df**$**country){
cat(paste(n, " "))
}## Azerbaijan Argentina Australia Armenia Brazil Chile China Colombia Ecuador Georgia Germany Ghana India Kazakhstan Jordan Kyrgyzstan Lebanon Malaysia Mexico Morocco Netherlands New Zealand Nigeria Pakistan Philippines Poland Romania Russian Federation Singapore Slovenia South Africa Spain Sweden Thailand Turkey Ukraine Egypt United States of America Uruguay**
最后,我们准备用这些修正的名字和新的肥胖变量重新运行我们的分析。
维度间的相关性
**library(corrplot)df **%>%**
select_if(is.numeric)**%>%**
cor()**%>%**
corrplot(method**=**'number')**
这非常有趣,值得花些时间研究一下。
- 毫不奇怪,结核病和艾滋病毒感染率高度相关。这表明在控制传染病方面存在系统性问题。
- 糟糕的空气与低幸福感有关。这是有道理的,但它值得重申。你的幸福可能取决于你国家的空气有多干净。
- 不足为奇的是,婴儿死亡率高与水卫生条件差有关。
- 从本质上讲,人类发展指数与公共服务变量衡量的是同一事物。
- 较高的酒精消费量与较低的婴儿死亡率和较高的人类发育有关。有意思。也许这与更多发展带来的额外闲暇时间有关。较贫穷的国家没有闲坐在一起和朋友喝啤酒的奢侈。
- 肥胖与幸福负相关,但与人类发展水平正相关。婴儿死亡率和肥胖是相反的关系。关于富有和现代的一些东西正在使我们变胖。有没有注意到所有的老英国君主都很胖?我敢打赌,富人的饮食中有一些因素导致了他们更高的肥胖率(提示:可能是肉类/动物产品消费的增加)。在以后的文章中,我会查看 GDP 增长和身体质量指数变化的时间序列数据来验证这一点。
还有很多更有趣的关联!
感知地图:使用主成分分析可视化国家之间的关系
如果你不熟悉感知地图,我建议你看一本由克里斯·查普曼和埃利亚·费特写的非常好的书,名为《营销研究和分析》。“基本上,我们将在 10 个维度上运行主成分分析,减少到两个维度,然后在两个维度上可视化国家分组。
***#Keep row names for ID. Very useful bit of code*
rownames(df) **<-** df[,2]
*#Run PCA. Make sure to scale your data first. Otherwise the PCs will reflect the dimensions with huge units*
ct_pc **<-** prcomp(df[,3**:**ncol(df)], scale. **=** **TRUE**)
summary(ct_pc)## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6
## Standard deviation 2.1693 1.3695 1.2621 1.00579 0.79305 0.74069
## Proportion of Variance 0.4278 0.1705 0.1448 0.09196 0.05717 0.04987
## Cumulative Proportion 0.4278 0.5983 0.7431 0.83508 0.89225 0.94213
## PC7 PC8 PC9 PC10 PC11
## Standard deviation 0.57025 0.41706 0.2482 0.1961 0.1934
## Proportion of Variance 0.02956 0.01581 0.0056 0.0035 0.0034
## Cumulative Proportion 0.97169 0.98750 0.9931 0.9966 1.0000**
summary()函数在决定保留多少台电脑时非常有用。在这里我们可以看到,5 个变量覆盖了我们最初的 10 个变量中大约 90%的方差。我们将只保留解释 60%方差的前两个。
如果你是一个视觉型的人,你可以使用 screeplot 找到下一台电脑捕捉到的边际差异似乎下降的“肘部”。
**plot(ct_pc, type**=**'l')**
如果我要在预测模型中使用它,我可能会决定保留 4-5 个,但这里我们只保留前两个,以便于可视化。
用双标图可视化电脑
为了可视化结果,我们使用 biplot()函数。仅供参考,南非是“ZAF”
**biplot(ct_pc, cex**=c**(.7,1), expand**=**1.5,
sub**=**'Comparing countries on the 11 dimensions of Health')**
这个双图包含了大量的信息,它的解释可能很复杂。我们来分解一下。
首先注意 x/y 轴是 PC1 和 PC2,它们累计解释了原始变量中大约 60%的变化。因此,我们已经知道这个故事不仅仅是这两个电脑分数,还有大约 40%的故事没有被披露。
第二,红色箭头(向量)既有大小又有角度。这些箭头相对于 x/y 轴的角度显示了这些原始变量被 PCs“捕获”的程度。因此,PC2 很好地捕捉到了几乎垂直的线条(艾滋病毒和结核病比率),而 PC1 似乎捕捉到了婴儿死亡率、公共服务、水卫生和人类发展指数。
两个原始变量(红线)之间的角度代表相关的方向。所以婴儿死亡率和公共服务是非常正相关的,而艾滋病毒感染率和烟草使用是负相关的。这些解释应该与我们从上面的相关矩阵中得到的结果相符。最后,这个我不确定,但是箭头的长度代表了原始变量的标准差。所以如果你对长度求平方,你就代表了变量的方差。
解释双绘图的陷阱
双翼飞机是微妙的生物。如果你不相信我,可以看看 StackOverflow 关于它们的一些讨论。现在,我们将只关注最实际的含义和陷阱。
首先,国家在双标图上的位置是相对于的,因此改变变量的数量和/或添加/删除国家将影响它们之间的关系。
第二,记得我提到过 PC1 和 PC2 只占所有原始变量方差的 60%左右。这意味着在这 60%的方差中可能没有考虑到国家之间的其他关系。简而言之,这个故事不仅仅是你在这个双绘图中看到的。
正如查普曼和费特解释的那样,
“当我们查看 PC1 和 PC2 的分数时,我们看到的是‘最大程度的相似性’,这可能会隐藏其他 PC 中其他较小的差异。”
在这个前提下,让我们快速回顾一下双标图告诉我们的内容。
- 南非(ZAF)在左领域遥遥领先,可能是由于婴儿死亡率和艾滋病病毒感染率。
- 有趣的是,约旦和黎巴嫩聚集在一起,主要是因为他们的烟草使用水平。现在,中国和埃及似乎又聚集在一起了,因为它们的烟草使用水平高,而艾滋病/肺结核的发病率低。
- 印度和巴基斯坦有着相似的婴儿死亡率、肺结核(高数字是不好的)和不稳定的公共服务。他们出奇的亲密。考虑到他们在 1971 年之前本质上是同一个国家,这是有道理的。
- 尼日利亚和加纳这两个非洲国家似乎是高婴儿死亡率和结核病的负面组合,再加上艾滋病毒和糟糕的公共服务。
国家的地理聚类表明,PCA 在计算不同国家的相似性和差异性方面非常有效。矛盾的是,任何一种统计学习程序都应该(大致)符合我们的预期,但是如果它 100%符合我们的预期,我们就不会学到任何东西。因此,理想情况下,我们的分析会与我们的直觉相符,但我们仍抱有希望,希望有一些未知因素会迫使我们重新评估我们的假设,甚至重新检查我们的数据,以确保它们是正确的。这就是数据驱动方法的美妙之处:它们可以为我们提供一个新的视角,让我们了解一个我们本以为已经了解的话题。
超越前两台电脑的视觉化
你可以使用 choices=c(3,4)以 PC3 和 4 为轴重新制作剧情。只是为了好玩,我们来试试。
因为多达 5 个电脑解释了 90%的差异,所以也值得检查一下这个图。请将此图视为显示 PC3 和 4 如何“吸收”PC1 和 2 未捕捉到的剩余方差。
**biplot(ct_pc, cex**=c**(.7,.8), expand**=**1.2, choices**=c**(3,4),
sub**=**'Comparing countries on the 11 dimensions of Health')**
现在我们看到 PC3 代表不同的变量(幸福),PC4 捕捉了 PM 2.5 和肥胖率的许多变化。有趣的是,根据这些指标,现在中东国家因其较高的肥胖率和较低的饮酒量而被归为一类。
那么哪个国家的健康状况最好呢?
正如我前面提到的,这是一个超级复杂的问题,但只是为了好玩,让我们看看我们能想出什么。以下是后面的想法。我们将根据每个变量的得分对国家进行排名,并计算哪些国家在所有 11 个维度上的总体排名最低(最好)。我们将把那个国家评为“最健康的国家”但我们将会遇到的一个问题是,有些维度在“好”方面得分很高,而其他维度在“好”方面得分很低。
***#Separate columns into those where higher is better*
up_ranks **<-** df[,colnames(df) **%in%** **c**("epi_pm25","epi_ehwater",
"undp_hdi", "wvs_hap")]
*#Separate where lower scores are better*
low_ranks **<-** df[,colnames(df) **%in%** **c**("who_alc2000", "ffp_ps", "wef_ct",
"wef_imort", "wef_chiv", "who_tobt", "perc_obese")]
*#Now we rank*
df_low_rank **<-** apply(low_ranks, 2, rank)
*#Use opposite ranking method*
df_high_rank **<-** apply(up_ranks, 2, **function**(x) rank(**-**x))
*#now assemble*
df_ranked **<-** cbind(df_low_rank, df_high_rank)
*#Here's what we end up with. 1 means best and 39 means worst.*
head(df_ranked)**
结果:
**## wef_chiv who_tobt wef_imort who_alc2000 ffp_ps wef_ct perc_obese
## AZE 18 19 34 10 25.0 29.0 22
## ARG 27 22 21 27 14.5 16.0 28
## AUS 18 7 7 35 6.5 5.0 33
## ARM 18 29 24 14 13.0 21.0 12
## BRA 30 8 22 25 29.0 19.0 14
## CHL 27 38 13 23 16.5 10.5 31
## epi_pm25 epi_ehwater wvs_hap undp_hdi
## AZE 24 31 28 21.5
## ARG 11 13 18 12.0
## AUS 11 2 13 1.0
## ARM 27 24 25 25.5
## BRA 11 21 14 23.0
## CHL 11 12 26 11.0**
让我们尝试对这些数据进行一些可视化处理,以获得更好的感受。我不常可视化排名数据,所以我欢迎任何关于哪种方法最适合显示这些数据的反馈。
等级热图
**library(gplots)heatmap.2(df_ranked,dendrogram **=** 'none', scale**=**'none', key**=FALSE**, cexRow**=**.6,
main**=**'Red = low rank (Good), White = (Bad)')**
我在那里保留了跟踪,因为它向您显示了颜色相对于平均值的位置(列方向)。例如,对于 HIV 比率,您可以看到白色代表较高的分数,因此轨迹会在右侧弹出。暗红色向左移动轨迹。你可以看到约旦的艾滋病流行率排名最高。
你还可以看到一大群欧洲国家在所有基本生活统计上都是暗红色的,但在烟草使用或酒精消费方面表现不佳——这是早期死亡率的两个强有力的预测指标。
美国是“肥胖”的白人,因为他们在 39 个国家中排名第一。
让我们最终选出一个获胜者,并想象结果
***#convert to Df*
df_ranked **<-** as.data.frame(df_ranked)
*#Find average ranks per country*
score_mat **<-** as.matrix(apply(df_ranked, 1, mean))
*#then rank by lowest average rank*
final_ranks **<-** apply(score_mat, 2, rank)
*#sort to get final list*
sort_ranks **<-** apply(final_ranks, 2, sort)
sort_ranks**
从最好到最差的最终排名:
**## [,1]
## SGP 1.0
## SWE 2.0
## NZL 3.0
## AUS 4.0
## NLD 5.0
## MYS 6.0
## DEU 7.0
## USA 8.0
## SVN 9.0
## ESP 10.0
## URY 11.0
## ECU 12.0
## ARG 13.0
## POL 14.0
## MEX 15.0
## BRA 16.0
## COL 17.0
## CHL 18.0
## TUR 19.0
## JOR 20.0
## ARM 21.0
## KAZ 22.0
## PHL 23.0
## THA 24.0
## GHA 25.5
## LBN 25.5
## KGZ 27.0
## CHN 28.0
## EGY 29.0
## MAR 30.0
## ROU 31.0
## AZE 32.0
## GEO 33.0
## PAK 34.0
## UKR 35.0
## RUS 36.0
## NGA 37.0
## IND 38.0
## ZAF 39.0**
确定最健康的前 5 名
现在你知道了,根据我们的标准,“健康”排名前五的国家(根据你的真实定义)依次是:
新加坡、瑞典、新西兰、澳大利亚和荷兰。
如果将肥胖率考虑在内,美国从第五位跌至第八位。
后 5 个国家依次是:
乌克兰、俄罗斯、尼日利亚、印度和南非。
哇,对不起我的南非朋友。如果要我猜为什么会有艾滋病毒/肺结核的发病率。也许近年来情况有所改善,因为这些数据是几年前的了。不过对巴基斯坦来说是个好消息,当肥胖数据被加入时,它现在在 39 个国家中排名第 34。俄罗斯取代了它的位置。
我得说这些结果与预期相当吻合,尽管我没想到南非会如此糟糕。我认为,这里的一个关键要点是,人口非常贫困的国家(印度和南非)被这些不平等现象压得不成比例。这些国家的某些地方肯定比我们排名前十的国家更现代(或者更现代)。然而,总的来说,排名前 10 位的国家拥有公共服务/基础设施/医疗保健的基线水平,而排名后 10 位的国家却没有。
可视化这些结果的最佳方式是什么?
我的第一个想法是使用类似平行坐标图的东西。但是有 39 个国家,情况会很糟糕。
***#useful function when converting from matrix to dfs*
df_ranked **<-** rownames_to_column(df_ranked)
df_ranked **%>%**
gather(**-**rowname, key**=**'vars', value**=**'scores')**%>%**
ggplot(aes(vars, scores, group**=**rowname, color**=**rowname))**+**
geom_path(size**=**1, alpha**=**.3)**+**
theme_minimal() **+** theme(axis.text.x **=** element_text(size **=** 13,
angle **=** 35), legend.key **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "Parallel Coordinates of Rankings",
x **=** "Variables", y **=** "Ranks")**
是的,正如我所怀疑的,这是 39 个国家的混乱。但是您仍然可以看到一些有用的关系(由变量之间连接线的深度表示)。例如,你可以看到在肥胖方面得分较高的国家往往也有较高的艾滋病毒/结核病发病率。水卫生条件差的国家似乎有更好的空气质量。这不是我想做的权衡,但仍然是一个有趣的观察。
我的另一个想法是根据变量类型和颜色进行分面,并寻找条形图最小的国家(表示排名低=好)。我觉得这样更好。
不要介意庞大的代码块。但基本上,为了做到这一点,你必须将数据重塑为“长”形式,这样你就可以按变量分面。如果你还没有掌握这种技术,那么花时间去做是非常值得的。使用 tidyverse 库中的 gather()函数。
**df_ranked **%>%**
gather(**-**rowname, key**=**'vars', value**=**'scores')**%>%**
ggplot(aes(reorder(rowname, scores), scores, fill**=**scores))**+**
geom_col()**+**
scale_fill_gradient(low **=** "#0000F7",high**=**"#FFDD00")**+**
facet_wrap(**~** vars, ncol**=** 11)**+**
coord_flip() **+** theme(plot.subtitle **=** element_text(colour **=** **NA**,
vjust **=** 1), plot.caption **=** element_text(vjust **=** 1),
axis.ticks **=** element_line(colour **=** **NA**),
panel.grid.major **=** element_line(colour **=** **NA**),
panel.grid.minor **=** element_line(colour **=** **NA**),
axis.title **=** element_text(family **=** "serif",
colour **=** **NA**), axis.text **=** element_text(colour **=** "gray4"),
axis.text.x **=** element_text(size **=** 8),
axis.text.y **=** element_text(size **=** 7),
plot.title **=** element_text(hjust **=** 0.5),
panel.background **=** element_rect(fill **=** **NA**),
legend.key **=** element_rect(fill **=** **NA**)) **+**labs(title **=** "Ranking for each Health Dimension",
x **=** "Country", y **=** "Ranks", fill **=** "Ranking") **+** theme(axis.title **=** element_text(size **=** 8),
axis.text **=** element_text(size **=** 5, colour **=** "gray14",
vjust **=** 0), plot.title **=** element_text(size **=** 8)) **+** theme(axis.title **=** element_text(size **=** 7),
axis.text **=** element_text(size **=** 1), plot.title **=** element_text(size **=** 13))**
Small purple bars mean lower (better) rank. SGP (Singapore) is #1 and ZAF (South Africa) is #39
结果摘要
所以我们开始吧。我们可以看到,南非在水资源、公共服务、人类发展、艾滋病和结核病方面表现不佳,这导致了它排名垫底。
与此同时,除了肺结核,新加坡几乎在所有领域都名列前茅。这些排名掩盖了一个事实,即从绝对数字来看,新加坡每 10 万人的病例数约为 50-60 例,而美国为 2.9 例。不是巨大的绝对差异,而是巨大的相对差异。
如果欧洲大多数国家的酒精和烟草消费水平低一些,它们显然会名列前茅。对于德国人,我要说的是,要怪就怪那些该死的 Hefeweizen 和柏林那些在地铁上抽烟的潮人。einoverstanden?
所有决策都应该由数据驱动吗?采访数据科学家谢尔盖·布瑞尔
原文:https://towardsdatascience.com/data-analyst-sergey-bryl-103b85e9876a?source=collection_archive---------4-----------------------
https://www.linkedin.com/in/sergeybryl/
你能简单介绍一下你的背景吗?
如果你看看我的专业背景,你会发现我所有的经验都围绕着应用于许多事情的分析。其中之一是银行业,作为分析和风险管理部门的负责人,我已经在这个行业工作了 10 年。然后,在几家 IT 公司做了 5 年的市场分析师和数据科学家。值得一提的是,我通过我的 analyzecore.com博客贡献了一些实用的数据分析。
An example of a multi-channel attribution model visualization (source analyzecore.com blog)
你在数据分析领域做过不少工作。它们对你雇主的目标有什么好处?
不管是什么业务,数据分析通常有助于找到以下问题的答案:
- 如何改进产品;
- 如何提高公司的决策;
- 如何让今天和明天比昨天赚得更多;
- 如何提高顾客的忠诚度;
- 和许多其他领域,在这些领域中分析是有用的。
请分享几个你经历过的真实案例
第一个例子,当我在 Namecheap.com 工作时,我们关心的是获取客户的成本,以及多快能得到回报。问题是,通过我们的付费渠道获得的成本开始超过第一笔交易的收入,更不用说毛利润了。因为域名注册、托管和所有附带服务通常具有长期性质,所以我们得出结论,客户收购成本必须在固定的时间框架内收回,这意味着我们应该预测客户的终身价值。
但那时候根本没考虑到这一点。将这样一个项目付诸实施是一项雄心勃勃的任务。最终,我们从零开始,开发了一个复杂的系统,你可以输入关于新用户的数据,作为回报,可以得到关于他们潜在价值的 5 年预测。
在我现在的雇主,MacPaw.com——一个为 Mac 开发顶级应用程序的开发者,最著名的是 CleanMyMac——我有幸完成了一系列有趣的项目。以下是我想强调的几个:
- 一个基于马尔可夫链的多渠道归因模型(你可以在我的analyzecore.com博客上了解这个概念)。该模型使我们有机会通过所有营销渠道充分分配价值,并相应地调整营销预算;
- 一个异常检测项目。它允许我们使用不同的指标和维度自动检测异常。结果,我们在 Slack 中得到关于这些异常的通知,这使得我们的生活容易得多;
- 今年,该公司发布了一项新的订阅服务,即Setapp.com。这项服务提供 30 天的免费试用。我们引入了一个模型来告诉我们一个用户是否最终转化为付费用户。这拓宽了我们的界限,例如,我们可以在游戏的早期评估我们促销活动的效果。现在,我们不需要等到 30 天的试用期结束,看看有多少用户转化为订户。此外,我们刚刚完成了一个客户流失模型,这将有助于我们防止客户流失。
One of Sergey’s visualizations was included into the long list of the “Kantar Information is Beautiful Awards”
你认为,数据分析师应该在公司“内部”工作,还是应该将他们的职能分配给数据分析机构?
当然,这取决于公司的规模及其寻求回答的问题。我的建议是实事求是地看待这个问题:这样寻找解决方案的成本就不会抵消决策带来的经济收益。就我而言,我相信分析师在公司内部工作时最有效,与其他员工一起工作,并直接接触产品或服务。我的意思是,当他或她不仅参加正式会议,而且知道人们在走廊或午餐时谈论什么。好主意不一定在预定的会议中出现。
在我看来,这些机构在两种情况下是有效的:
- 当他们提供现成的分析产品时,如开发的 BI 系统。我通常会说,如果一家公司想要并且有能力创建自己复杂的内部 BI 系统,那么他们将该解决方案出售给其他人可能是合理的。
- 当一个机构可以分享对问题的新观点时,因为他们研究的案例比内部分析师多得多,而内部分析师可能没有如此广泛的专业知识,在他或她获得专业知识之前可能还有很长的路要走。但是,即使你决定跟着中介走,你也应该考虑提出问题和得到答案之间的时间差——这可能比你预期的要长。
一个人应该如何向分析师提问,以便得到可以付诸行动的答案?
企业主向分析师提问是互动中最关键的阶段,值得仔细观察。分析师用一个专门的术语来描述这种数据:垃圾输入——垃圾输出,这完全适用于查询形成阶段。不恰当的问题会耗费每个人的时间和资源。
我在这里使用以下指导原则——企业/雇主必须用他或她理解的商业术语进行沟通。然后,与分析师配对,他们共同翻译和验证这种语言以进行数据分析。我完全怀疑产品负责人带着一个现成的问题来的情况,这个问题是用分析术语定义的,他希望这个问题适合他的商业计划。
Another useful chart for Cohort analysis (source analyzecore.com blog)
你认为,所有的决策都应该由数据驱动吗?
我觉得要看公司/项目/产品目前所处的阶段。数据如何出现的原则,我的意思是它的追溯性质,使得每个人都不可能在每种情况下做出数据驱动的决策——仅仅是因为数据的缺乏和不完整。因此,在现代社会,风险和直观的解决方案有足够的空间。我们的所有决策都不是数据驱动的,这很正常。但对于一些行业,如营销,没有银弹解决方案,这意味着即使是数据支持的决策也不一定是正确的。
与此同时,如今数据分析带来的好处已经显而易见。从短期来看,对于许多行业来说,使用数据驱动的方法将成为一个生存问题,而不是一个竞争优势。对许多人来说,钟声已经敲响,昨日的初创企业正在转变为拥有强大数据科学部门的公司。
在你的职业中,你期待的下一个变化是什么?
机器学习和深度学习,更具体地说,文本、语音和图像分析的快速发展,也扩大了企业的活动范围。现在有更多的线要拉,有更多的因素要考虑。我举个简单的例子。就在两年前,移动运营商还在使用流失模型,这种模型记录了一些因素,比如联系呼叫中心,或者充其量只是简单的问题分类。这些过去是手动或半自动方式注册的。相比之下,我们现在处于自动识别问题的边缘。很快你将能够有计划地识别谈话的音调和更多的因素。这意味着这些公司将能够更好地了解客户,并以数据驱动的方式采取行动。
我还可以看到更多伴随着机器学习和深度学习的自动化。解决方案已经在这里,它们将在应用 ML 算法的接口和框架方面变得更加实用。很快,数据分析师只需简单地指出数据的位置,然后就可以看到程序独立地生成一组预测值,并应用几十种自动选择超参数的算法,所有这些都将导致建立最佳模型。
An example of a visualization (source analyzecore.com blog)
现在是关于自我教育的部分。你工作中自我教育的地方在哪里?
关键的那个!如果没有自我教育,我从一个工作领域到另一个领域的任何转变都是不可能的。
这是改变你活动范围的主要动机——你可以学到很多东西,这很有趣。作为一名数据科学家,我基本上看不到教育有任何限制。这既是好的也是坏的——但肯定不无聊。
你对那些想从另一个职业转向数据分析的人有什么建议?
我理解并分享每个人对数据分析的兴趣。当你看到或读到数据分析有助于解决一个特殊的案例时,从局外人的角度来看,这几乎就像是魔术。然而,人们必须明白,这通常是由巨大的工作范围、数百小时的自学、假设检验以及通常相当枯燥的数据准备工作所支撑的。
你只需要热爱这份工作,就像其他任何工作一样,在这里你努力获得成功。我的建议是找一个有经验的导师,试着解决一些典型的问题。这会让你明白需要哪些基础知识,检查自己是否真的被这份工作勾住了。我们公司 MacPaw 为此提供了一个很好的机会。在过去的两个夏天里,我在参加了一个实习项目,其中也包括数据分析。当你还是一名学生或者在做其他事情的时候,你可以过来花三个月的时间和知名分析师一起研究一些真正令人伤脑筋的问题。我建议不要错过这样的机会。
Follow Sergey on facebook or twitter to read a bit of a data scientist’s humor (#DataStoned)
太好了,谢谢你的故事。我希望我们能收到一些问题作为对这篇文章的评论。很快在这里见到你😉
通过自我导向学习的数据分析师
原文:https://towardsdatascience.com/data-analyst-through-self-directed-learning-30dfefeca9df?source=collection_archive---------8-----------------------
这篇文章的目的是分享我利用自我导向学习成为数据分析师的故事,尽管我只有简单的技术和统计背景。我的希望是向你展示,只要坚持不懈并有条理地去做,你真的可以学到任何东西。
什么是自我导向学习?
成为一个自我导向的学习者意味着你主动去发现你的学习需求是什么,你制定学习目标,你识别资源,你选择和实施适当的学习策略和评估你的学习成果。这发生在一个结构化的方式中,使用特定的过程,并可能从其他人那里得到帮助。(诺尔斯,1975 年,第 18 页)。你可能想知道它与永远变得更好的愿望有什么不同..我想说的是,学习的欲望是核心态度,而过程是系统,通过它你可以把这变成现实。
2014 年,当我成为另类大学的一名学生时,我第一次发现了这一点,这是一所以自我导向学习为中心的大学。我使用的模型最好由 火箭专家 围绕三个主要集群来描述——设计、反映、做。在过去的 3 年里,我用这个模型作为指导,帮助我更快地学习东西,并取得更好的结果。我应用它的一个领域是成为一名数据分析师。
这一切都始于一个问题——为什么脸书的一些帖子比其他帖子表现得更好?我访问了学生非政府组织 is was in 的脸书页面,我很好奇我们如何调整我们的内容,使其与我们的追随者更相关。我分析了各种数据,应用了一些统计函数,但最终我并没有找到我的答案。在那一点上,分析比我的能力更先进。
一年后,我进入了商业智能领域的实习,商业智能是一种将原始数据转化为对商业人士有价值的信息的艺术。这是一个相对较新的工作领域,数据分析是其中的一个子领域。鉴于我对实际需要的技能没有太多的了解,我就一头扎进了杜克大学的在线课程——数据分析和统计推断,以便建立一些基础知识。
这门课程真的很好,在不同的时刻都很有挑战性,它开阔了我的眼界,让我知道我需要进一步学习什么。因此,我在数据分析师的主要技能之上设定了一些学习目标:
描述性统计的使用
- 能够向他人解释汇总统计数据及其在上下文中的含义
推理统计学的使用
- 根据数据分布和使用 R 所需的比较类型,应用正确的假设检验
- 使用线性回归和相关性来解释指标之间的关系
数据争论&用 R 编程
- 使用 R data.table 执行常见操作(条件子集化、连接、更新、分组计算),最少需要在 web 上检查语法
- 使用 R 编程元素(变量、控制语句、数据结构)自动化重复性任务
在 Excel 中应用数据可视化
- 能够为常见的业务请求选择最合适的可视化方式(在 2 或 3 个分类维度上比较随时间的演变,与多个变量的关系)
为了达到这些目标,我使用了几种策略:
- 在 Coursera 和 edX 上做具体的在线课程,比如 R 编程
- 阅读各种博客上的文章,对该领域有更广泛的理解,并跟上最新技术。关于 Analytics Vidhaya 的一篇博客文章向我介绍了 r。
- 与我的经理分享我的学习兴趣,以便他能为我提供该领域的项目。例如,这导致了一个推断性的统计分析,即人们是否会根据他们对索赔过程的体验的评价而减少点餐频率。
- 就如何回答某些分析问题提出各种想法或衡量标准。例如,我主动提出为我的经理感兴趣的一个仓库分析做一些 T2 控制图表。
- 对我能接触到的数据进行一些预测分析。这意味着对如何进行分析以及数据对业务流程的影响有透彻的理解。
你可能会注意到,我热衷于通过阅读和在线课程,在理论层面上创造环境或练习来应用我所学的知识,即使工作描述不一定暗示这一点。
同样为了达到目标,我给自己设计了一些学习习惯:
- 每周 5 天,每天早上做 1 小时的功课
- 多次逐步运行 StackOverflow 中的代码,以了解它是如何工作的(对于我找不到解决方案的问题,我在谷歌上搜索它们,并应用到我想做的事情上)
经验教训
在这条路上,我发现了一些关于我的学习风格的见解,这些见解让我提高了获取技能的方式:
- 如果我不知道我对这个领域的不了解,但它看起来很有趣,我会找到一个别人已经开发的涵盖基础知识的结构化课程。这是进入这个领域并意识到我所不知道的事情的一个简单方法。
- 我厌倦了连续几周学习同样的东西。这就是为什么我现在同时在不同领域有多个目标,比如数据可视化、报告、数据争论。它们都在数据科学的保护伞下,它们是互补的,但它们是不同的东西,所以我不会感到无聊。
- 我喜欢在线课程的作业压力——尽管这是自我导向的学习,在线课程为我提供了一些外部责任,帮助我在中期如几周内保持正轨。
- 在网上搜索我所面临的问题的解决方案的同时做一些真实数据的项目,对于通过理论手段沉淀我所学的东西是非常有价值的。它向我展示了其他人是如何解决问题的,我开始理解思考某个问题的方式。
- 只有在理解的基础上,重复使用才会导致记忆——有几行 R 代码我反复使用,但它们并没有留在记忆中。只有当我深入了解这些代码是如何工作的,我才能够从记忆中而不是从谷歌中回忆起这些代码。
- 学习就像工作一样,是一个有任务的项目。因此,在某个时候,我把它放在一个地方,而不是多个电子表格。现在,我将 Trello 与 Repeater、Harvest 和 Card Aging PowerUps 一起使用,并与桌面应用 Pomello 相连接,以将所有事情组织成 30 分钟的工作,5 分钟的休息 Pomodoro 会话。仍然缺少一些东西——一个集成的空间,在那里我可以对学习领域和我投入的时间进行反思。学习管理系统和工作管理系统的结合。
- 在线电子表格非常适合存储信息——我可以在地铁上用手机写下文章中的关键发现。此外,使用搜索框很容易访问原始链接。
- 学习是一个长期的目标。为了保持较高的动力,我把它分成小块,想办法获得短期的满足感,比如从我向其展示分析的商业人士那里获得“啊哈表情”,从工作中获得报酬,或者只是请更有经验的人来评估我的工作质量。
这次学习之旅持续了 1 年左右。那时,我在另一家公司找到了一份数据分析师的工作。从我的角度来看,通过这些工作测试是一个指标,表明我的水平在我选择的目标上足够好。接下来的目标是使用相同的框架和思想成为一名数据科学家。
最初发表于火箭专家博客。
通过网络抓取使用 Python 进行数据分析:CIA World Fact-book 示例
原文:https://towardsdatascience.com/data-analytics-with-python-by-web-scraping-illustration-with-cia-world-factbook-abbdaa687a84?source=collection_archive---------1-----------------------
在本文中,我们将展示如何使用 Python 库和 HTML 解析从网站中提取有用的信息,并回答一些重要的分析问题。
在一个数据科学项目中,几乎总是最耗时和最混乱的部分是数据收集和清理。每个人都喜欢建立一两个很酷的深度神经网络(或 XGboost)模型,并用很酷的 3D 交互情节来展示自己的技能。但是这些模型需要原始数据作为开始,而且这些数据来的不容易也不干净。
毕竟,生活不是一个充满数据的 zip 文件等着你去解压和建模的游戏:-)
但是为什么要收集数据或建立模型呢?根本动机是回答一个商业或科学或社会问题。有没有趋势?这个东西和那个有关系吗?对该实体的测量能否预测该现象的结果?这是因为回答这个问题将验证你作为该领域科学家/从业者的假设。你只是在用数据(而不是像化学家那样用试管或像物理学家那样用磁铁)来测试你的假设,并从科学上证明/反驳它。这是数据科学的“科学”部分。不多不少……
相信我,想出一个高质量的问题并不难,这需要一点数据科学技术的应用来回答。每一个这样的问题都变成了你的一个小项目,你可以编写代码,在 Github 这样的开源平台上展示给你的朋友。即使你的职业不是数据科学家,也没有人能阻止你编写很酷的程序来回答一个好的数据问题。这表明你是一个善于处理数据的人,一个能用数据讲述故事的人。
今天让我们来解决这样一个问题…
一个国家的 GDP(按购买力平价计算)和其互联网用户的百分比有什么关系吗?低收入/中等收入/高收入国家也有类似的趋势吗?
现在,你能想到的收集数据来回答这个问题的来源有很多。我发现美国中央情报局(CIA)的一个网站是收集数据的好地方,这个网站上有世界各国的基本事实信息。
因此,我们将使用以下 Python 模块来构建我们数据库和可视化,
- 熊猫, Numpy,matplotlib/seaborn
- Python urllib (用于发送 HTTP 请求)
- BeautifulSoup (用于 HTML 解析)
- 正则表达式模块(用于查找要搜索的精确匹配文本)
先说程序结构来回答这个数据科学的问题。在我的 Github 库中的这里有整个锅炉板代码。喜欢的话请随意叉星。
阅读前面的 HTML 页面并传递给 BeautifulSoup
这是中情局世界概况首页的样子,
Fig: CIA World Factbook front page
我们使用一个简单的带有 SSL 错误忽略上下文的 urllib 请求来检索这个页面,然后将它传递给神奇的 BeautifulSoup,后者为我们解析 HTML 并生成一个漂亮的文本转储。对于那些不熟悉 BeautifulSoup 库的人来说,他们可以观看下面的视频或阅读这篇关于 Medium 的大信息量文章。
这是阅读首页 HTML 的代码片段,
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE# Read the HTML from the URL and pass on to BeautifulSoup
url = '[https://www.cia.gov/library/publications/the-world-factbook/'](https://www.cia.gov/library/publications/the-world-factbook/')
print("Opening the file connection...")
uh= urllib.request.urlopen(url, context=ctx)
print("HTTP status",uh.getcode())
html =uh.read().decode()
print(f"Reading done. Total {len(html)} characters read.")
下面是我们如何将它传递给 BeautifulSoup,并使用find_all
方法来查找 HTML 中嵌入的所有国家名称和代码。基本上,这个想法是**找到名为‘option’**的 HTML 标签。标签中文本是国家名称,标签值的第 5 和第 6 个字符代表 2 个字符的国家代码。
现在,你可能会问,你怎么知道你只需要提取第五和第六个字符呢?简单的回答是你必须检查 soup 文本,也就是你自己解析的 HTML 文本,并确定那些索引。没有通用的方法来确定这一点。每个 HTML 页面和底层结构都是独一无二的。
soup = BeautifulSoup(html, 'html.parser')
country_codes=[]
country_names=[]for **tag** in soup.find_all('option'):
country_codes.append(**tag.get('value')**[5:7])
country_names.append(**tag.text**)temp=country_codes.pop(0) # *To remove the first entry 'World'*
temp=country_names.pop(0) # *To remove the first entry 'World'*
抓取:通过单独抓取每个页面,将所有国家的所有文本数据下载到字典中
这一步是他们所说的必不可少的刮或爬。要做到这一点,要识别的关键是每个国家信息页面的 URL 是如何构建的。现在,在一般情况下,这可能很难得到。在这种特殊情况下,快速检查显示了一个非常简单和有规律的结构。这是澳大利亚的截图,
这意味着有一个固定的网址,你必须附加 2 个字符的国家代码,你得到该国家的网页的网址。因此,我们可以遍历国家代码列表,使用 BeautifulSoup 提取所有文本并存储在本地字典中。下面是代码片段,
# Base URL
urlbase = '[https://www.cia.gov/library/publications/the-world-factbook/geos/'](https://www.cia.gov/library/publications/the-world-factbook/geos/')
# Empty data dictionary
text_data=dict()# Iterate over every country
for i in range(1,len(country_names)-1):
country_html=country_codes[i]+'.html'
**url_to_get=urlbase+country_html**
# Read the HTML from the URL and pass on to BeautifulSoup
html = urllib.request.urlopen(url_to_get, context=ctx).read()
soup = BeautifulSoup(html, 'html.parser')
**txt=soup.get_text()**
**text_data[country_names[i]]=txt**
print(f"Finished loading data for {country_names[i]}")
print ("\n**Finished downloading all text data!**")
如果你喜欢,可以存放在泡菜堆里
为了更好地衡量,我更喜欢将这些数据序列化并存储在一个 Python pickle 对象 中。这样,下次打开 Jupyter 笔记本时,我就可以直接读取数据,而无需重复网页抓取步骤。
import pickle
pickle.dump(text_data,open("text_data_CIA_Factobook.p", "wb"))# Unpickle and read the data from local storage next time
text_data = pickle.load(open("text_data_CIA_Factobook.p", "rb"))
使用正则表达式从文本转储中提取 GDP/人均数据
这是程序的核心文本分析部分,在这里我们借助 正则表达式 模块在庞大的文本串中找到我们要找的东西并提取相关的数值数据。现在,正则表达式是 Python(或几乎所有高级编程语言)中的丰富资源。它允许在大型文本语料库中搜索/匹配特定的字符串模式。这里,我们使用非常简单的正则表达式方法来匹配精确的单词,如“ GDP —人均(PPP): ”,然后读取其后的几个字符,提取某些符号(如$和括号)的位置,最终提取人均 GDP 的数值。这里用一个图来说明这个想法。
Fig: Illustration of the text analytics
本书中还使用了其他正则表达式技巧,例如,正确提取 GDP 总量,而不管该数字是以十亿还是万亿为单位。
# **'b' to catch 'billions', 't' to catch 'trillions'**
start = re.search('\$',string)
end = **re.search('[b,t]',string)**
if (start!=None and end!=None):
start=start.start()
end=end.start()
a=string[start+1:start+end-1]
a = convert_float(a)
if (string[end]=='t'):
# **If the GDP was in trillions, multiply it by 1000**
a=1000*a
下面是示例代码片段。注意代码中的多个错误处理检查。这是必要的,因为 HTML 页面极其不可预测的性质。不是所有的国家都有 GDP 数据,不是所有的页面都有完全相同的数据用词,不是所有的数字看起来都一样,不是所有的字符串都有类似的$和()。很多事情都可能出错。
为所有场景规划和编写代码几乎是不可能的,但至少您必须有代码来处理出现的异常,以便您的程序不会停止,并可以优雅地转到下一页进行处理。
# Initialize dictionary for holding the data
GDP_PPP = {}
# Iterate over every country
for i in range(1,len(country_names)-1):
country= country_names[i]
txt=text_data[country]
pos = txt.find('GDP - per capita (PPP):')
**if pos!=-1:** #If the wording/phrase is not present
pos= pos+len('GDP - per capita (PPP):')
string = txt[pos+1:pos+11]
start = re.search('\$',string)
end = re.search('\S',string)
**if (start!=None and end!=None):** #If search fails somehow
start=start.start()
end=end.start()
a=string[start+1:start+end-1]
#print(a)
a = convert_float(a)
**if (a!=-1.0):** #If the float conversion fails somehow
print(f"GDP/capita (PPP) of {country}: {a} dollars")
# Insert the data in the dictionary
GDP_PPP[country]=a
else:
print("**Could not find GDP/capita data!**")
else:
print("**Could not find GDP/capita data!**")
else:
print("**Could not find GDP/capita data!**")print ("\nFinished finding all GDP/capita data")
不要忘记使用熊猫内/左连接方法
需要记住的一点是,所有这些文本分析都会产生国家略有不同的数据框架,因为不同国家可能没有不同类型的数据。人们可以使用一个 熊猫左连接 来创建一个包含所有共同国家交集的数据框架,该数据框架的所有数据都是可用的/可以提取的。
df_combined = df_demo.join(df_GDP, how='left')
df_combined.dropna(inplace=True)
啊,现在很酷的东西,模特……但是等等!先做过滤吧!
在 HTML 解析、页面抓取和文本挖掘的所有艰苦工作之后,现在您已经准备好收获好处了——渴望运行回归算法和酷的可视化脚本!但是,等等,在生成这些图之前,通常你需要清理你的数据(特别是对于这种社会经济问题)。基本上,您需要过滤掉异常值,例如非常小的国家(如岛国),这些国家可能具有您想要绘制的参数的极端扭曲值,但不符合您想要调查的主要潜在动态。几行代码对这些过滤器来说很有用。可能有更多的方式来实现它们,但是我试图保持它非常简单和容易理解。例如,下面的代码创建了过滤器来排除总 GDP 为 500 亿美元、低收入和高收入界限分别为 5,000 美元和 25,000 美元(人均 GDP)的小国。
# Create a filtered data frame and x and y arrays
filter_gdp = df_combined['Total GDP (PPP)'] > 50
filter_low_income=df_combined['GDP (PPP)']>5000
filter_high_income=df_combined['GDP (PPP)']<25000df_filtered = df_combined[filter_gdp][filter_low_income][filter_high_income]
最后,可视化
我们使用 seaborn regplot 函数来创建散点图(互联网用户%与人均国内生产总值之比),其中显示了线性回归拟合和 95%的置信区间。他们看起来像是在跟踪。人们可以将结果解释为
一个国家的互联网用户%和人均 GDP 之间有很强的正相关关系。此外,低收入/低 GDP 国家的相关性强度明显高于高 GDP 的发达国家。这可能意味着,与发达国家相比,互联网接入有助于低收入国家更快地发展,并改善其公民的平均状况。
摘要
本文介绍了一个 Python 演示笔记本,演示了如何使用 BeautifulSoup 通过 HTML 解析抓取网页以下载原始信息。之后,还说明了如何使用正则表达式模块来搜索和提取用户需要的重要信息。
最重要的是,它演示了在挖掘杂乱的 HTML 解析文本时,如何或为什么不可能有简单、通用的规则或程序结构。我们必须检查文本结构,并进行适当的错误处理检查,以优雅地处理所有情况,从而维护程序的流程(而不是崩溃),即使它无法提取所有这些场景的数据。
我希望读者可以从提供的笔记本文件中受益,并根据自己的要求和想象来构建它。更多网络数据分析笔记本, 请看我的知识库。
如果您有任何问题或想法要分享,请联系作者在tirthajyoti【AT】Gmail . com。你也可以查看作者的 GitHub 资源库 中其他有趣的 Python、R 或 MATLAB 代码片段和机器学习资源。如果你像我一样对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
数据和实验驱动的政策制定
原文:https://towardsdatascience.com/data-and-experiment-driven-policy-development-42fb0d720eb2?source=collection_archive---------6-----------------------
我们相信上帝。所有其他:带数据。—威廉·e·戴明
GREAT lectures, Manila 13–14 March 2017
发展中国家面临的公共政策挑战的难度不亚于西方发达国家,但在许多方面更加紧迫。这些挑战包括提供基本公共服务——持续、可靠和有效——跨越城乡鸿沟,以及跨越社会分化的其他层面。这些挑战还包括可持续发展的问题,即在满足经济、环境和社会需求方面取得进展而不造成危及子孙后代的失衡。
一波又一波的学者、顾问和专家向东向南来到发展中国家,带来了解决问题的希望。有时,所提供的解决方案被描述为具有公认的功效,已被西方社会公认的实践所证明。有时,提供的解决方案更新颖,有望带来革命性的变革效果。
几十年来积累的例子包括基金组织的条件性(关于政府借贷和支出、关税和市场准入、金融和私营部门改革条件、具体部门的结构改革条件等)。)到公共部门政策、产业政策、市场改革政策、大规模基础设施项目,甚至农业、土地和卫生政策。
广义的社会科学——在某种程度上它可以被认为是一门科学——在一个关键方面不同于自然科学:观察的单位要么是一个社会集合体,要么是不能完全脱离文化和社会影响的个人。文化和社会制度在全球各地不同,在人类历史的各个时代也不同。
在一种组织文化及其相关社会制度下有效的政策和管理实践,在不同的制度和文化下不一定有效。
这个“房间里的大象”——可以追溯到未能解释大卫·休谟著名的“归纳问题”——是许多西方启发的重大政策实验失败的核心。事实上,在从西方世界到发展中国家的任何建议或“最佳实践”的交流中,T4 都必须面对这个问题。
但这个问题不仅适用于将西方解决方案输送到发展中国家。它适用于将溶液从一个地方运送到另一个地方的所有尝试。当权力或发展存在潜在梯度时也是如此:从殖民大国到殖民地,从发达世界到发展中世界,从中心到边缘,从城市到农村。
2009 年诺贝尔奖得主埃莉诺·奥斯特罗姆毕生致力于为社区如何解决公地悲剧提供多样而广泛的证据。她相信——并成功地让全世界相信——事实上,有许多方法可以克服公地悲剧,但中央强加的解决方案通常不起作用。她和她的合作者创造了大量的证据,证明当地社区发展了自己成功的解决公地悲剧的方法。
埃莉诺·奥斯特罗姆向我们表明,这种成功解决办法的关键是,它们必须来自社区本身。当他们这样做时,他们会考虑当地的地理、生态、当地居民的技能和兴趣、当地文化、当地习俗和当地机构。
发展中国家的公共政策挑战无法通过移植西方解决方案来解决。当应用于发展中国家的公共服务提供时,六适马的流程改进方法似乎可以找到现成的应用——并带来巨大的效率改进。但是,如果不从根本上适应发展中国家的情况,它的效力就很有可能受到质疑。
幸运的是,商业和社会科学在过去 20 年中都经历了彻底的转变,从根本上改变了政策和解决方案的制定方式。“设计”——无论是产品设计、服务设计、流程设计还是政策设计——已经被数据驱动的模式所取代。
数据驱动模型不是让专家设计解决方案,而是要求每个概念和特征都不是来自理论或意识形态,而是来自可靠的数据模式,无论数据是通过实验被动收集还是主动收集的。
例如,谷歌呈现链接时使用的蓝色的特殊色调和饱和度不是由设计师构思的。相反,谷歌进行了数千次实验,以找出哪种颜色和色调会导致最多的点击。事实上,谷歌的政策是,任何提议的功能都不能被整合到谷歌产品中,除非它在实地实验测试(计算机科学中称为 A/B 测试)中取得了统计上的显著进步。
在英国,自 2010 年以来,行为洞察小组(BIT)——又名“推动小组”——一直在为内阁办公室和其他政府部门提供建议。它设计实地实验,以测试对政策和政策材料的表述格式和框架的微小改变——即利用行为经济学和心理学的见解的改变——在多大程度上成功地促进了政策目标的实现。
BIT 因其在显著提高公共部门绩效方面的成功而获得了广泛认可,例如,提高了税收支付和征收率,提高了罚款支付率,减少了医疗处方错误,提高了器官捐赠率,并增加了家庭阁楼隔热装置的安装。许多不同的国家正在效仿英国的 BIT。
政治学、发展经济学和公共卫生等学科也采用随机对照实地实验来确定各种不同政策措施和干预的有效性。特别是在发展中国家,实地实验已经成为评估政策措施的黄金标准。与让一个国家进行一场以失败告终的重大政策革命不同,在随机控制的实地实验中,没有对特定解决方案的盲目承诺——除非某项特定干预在当地的制度和文化背景下证明自己是有效的。
民族国家在履行其职能的过程中,会产生大量的行政数据。通过蒂姆·伯纳斯·李对“开放数据”的成功倡导,即在互联网上提供细粒度的特定位置公共服务数据,英国公共服务的表现现在可以由学者和公众共同研究。英国所有政府部门都应该公布不违反数据保护法规的行政数据,除非有其他情有可原的情况。由于开放数据倡议,现在公共服务的提供更加透明。因此,数据驱动的政策举措现在在更加民主化的基础上成为可能。
移动电话和支持互联网的系统和设备会产生更多的非结构化数据。围绕机器学习技术在这种非结构化“大数据”中的应用,出现了相对较新的“数据科学”学科。数据科学的机器学习工具正被用来检测和验证模式,这些模式可以用来提高组织的有效性。无论是在商业领域还是在政府机构,数据科学家都非常吃香,因此他们的薪水也很高。
以数据和实验为导向的政策发展提供了一种避免将发达国家的解决方案盲目应用于发展中国家的根本性错误的方法。埃莉诺·奥斯特罗姆的研究表明,只要条件稳定,时间充足,社区可以找到自己的解决方案,而数据和实验驱动的方法让当地条件有了自己的声音,并缩短了适合当地情况的解决方案出现所需的时间。
在这个历史时期,我们可以承认毫无疑问地接受来自国外的宏大解决方案政策是有害的愚蠢行为。
幸运的是,我们还可以利用数据和实验驱动的技术,在当地制度和文化因素的背景下评估政策建议。有了统计学、数据科学和实验科学的工具,发展中国家的公民可以开发和完善他们自己的政策解决方案——他们应该这样做。
本文概述了作者在德拉萨大学(2017 年 3 月 13 日)和马尼拉雅典耀大学(2017 年 3 月 14 日)举办的演讲' 【数据和实验驱动的政策发展 ',该演讲是英国驻马尼拉大使馆主办的大演讲系列的一部分。
数据与心理健康:2016 年 OSMI 调查
原文:https://towardsdatascience.com/data-and-mental-health-the-osmi-survey-2016-39a3d308ac2f?source=collection_archive---------4-----------------------
大家好!首先,我要感谢我的朋友们,CMU 社区和媒体对我的上一篇文章提供了周到的反馈。分享的故事和关于这篇文章的对话非常感人,我真的很高兴这篇文章为 CMU 精神健康的讨论做出了贡献。
过去的几周对我的精神健康来说不是很好。由于很难找到一个新的强化门诊项目,也很难找到几个月的住房,我一直处于压力之下。话虽如此,我已经有了一个治疗计划,目前我在 DC 地区租了一个 Airbnb 的房间,住几个星期。
在贴出这篇文章后,我想知道我能做些什么来进一步增加关于心理健康的讨论。作为一个对数据非常感兴趣的人,我想我可以借我的技能来研究美国和其他国家的精神健康状况。我已经决定就我正在做的关于心理健康的一些数据分析项目写一系列的帖子。今天,我从分析由开源精神疾病(OSMI) 产生的数据集开始这个系列。
在开始讨论数据集之前,我有一些免责声明:
- 如果你想在这个分析中得到澄清,请在下面留下评论!写报告的时候我想尽可能的清晰。
- 如果您对使用的技术或研究的组件有任何疑问,也请留下您的评论!我非常欣赏关于数据挖掘策略的对话。
话虽如此,我们还是开始吧!
数据集
OSMI 是一家非营利性的 501c3 公司,致力于“提高意识,教育和提供资源,以支持技术和开源社区的精神健康”他们为支持这一目标所做的工作包括提供关于工作场所精神健康的电子书,举办关于精神健康对话的论坛,以及在开发者大会上举办关于社区精神健康的讲座。
在他们的努力中,OSMI 提供了一份关于科技行业心理健康的调查。该调查包含各种问题,涉及受访者的心理健康、受访者的人口统计数据以及雇主对工作场所心理健康的看法。这项调查是在 2014 年和 2016 年进行的。今天,我们将使用后一年的数据集。
2016 年,该调查通过 twitter 和会议上的演讲分发。由于这是一项自愿参加的调查,数据集中可能存在一些选择偏差。特别是,那些对心理健康更感兴趣的人更有可能参与这项调查。虽然这个数据集仍然是可分析的,但在以后考虑我们的结果时,注意这一点是很重要的。
OSMI 代表在数据世界论坛上列出了他们对调查的一些问题。最值得注意的是,OSMI 感兴趣的是受访者的某些人口统计和工作生活组成部分如何影响该行业的心理健康状况。这些变量包括:
- 被调查者的年龄
- 被调查者认同的性别
- 工作地点和区域
- 工作类型(如前端开发、设计、营销)
- 如果被调查者是个体经营者
我们将在分析中考虑这些变量和其他一些变量。
探索性数据分析
我们看到我们的数据集包含来自 1433 个用户的调查回答,每个填写的调查代表 63 个问题的答案。因为该调查是通过类型的表格收集的,所以每一行都有缺失值,表示回答者没有回答的问题。幸运的是,我们考虑的变量是由大多数用户填写的,因此我们没有处理严重的缺失值问题。
让我们看看我们的反应来自哪里。
Figure 1: Number of respondents by country. if you would like an interactive version of this plot, click here!
我们看到一半以上的回复来自美国。其他经常出现的国家是非常发达的国家,如加拿大、英国和澳大利亚。这表明我们的样本偏向于发达国家,这意味着我们没有了解新兴市场(如印度)科技行业可能存在的压力文化。
让我们来看看美国的哪些地区出现在这个数据集中。
Figure 2: Number of respondents by state. If you would like an interactive version of this plot, click here!
正如所料,加利福尼亚州在该数据集中具有重要的代表性。这很可能是因为加州是硅谷的所在地,所以大多数关于调查分布的开发者会议都在湾区举行。代表人数较多的其他地区是伊利诺伊州和纽约州,分别有 58 名和 49 名受访者。鉴于这两个州是美国的主要人口区,这是意料之中的。
单变量统计
Figure 3: Distribution of answers to the question “Have you been diagnosed with a mental health condition by a medical professional?”
在调查中,有三个问题可以衡量一个人是否有心理健康问题:
- "你过去有过精神疾病吗?"
- "你目前有精神健康障碍吗?"
- "你是否被医学专家诊断出有精神健康问题?"
为了确保对精神健康状况的发生率进行仔细分析,我认为第三个问题最能代表发生率。与其他两个问题相比,这个问题留给我们的可解释性和偏见更少。因此,我将我们的目标变量设为第三个问题的答案。
当我们观察这个问题的分布(见图 3)时,我们看到大约一半的受访者声称自己患有确诊疾病。这很可能受到我们之前讨论的选择偏差问题的影响(参见“数据集”部分),这可能意味着科技行业的实际发生率要低一些。然而,令人担忧的是,这个行业中有如此多的人面临精神健康问题。
Figure 4: Distribution of age of respondents after removing some obvious outliers.
去除一些异常值后,我们看到样本的平均年龄在 34 岁左右。虽然这高于我个人对科技行业的预期,但仍低于某些行业工人的平均水平。我们还看到,大多数受访者的年龄在 20 岁至 40 岁之间,与金融和咨询等行业的年龄范围相比,这相当年轻。
Figure 5: Distribution of gender that respondents identify with.
这项调查收到了大约 71 个不同的性别回答,但是因为这会给我们一个稀疏分布的特征,所以我选择重新编码这个变量。目前使用的性别变量包括识别为男性的人(M)、识别为女性的人(W)和识别为非二元的人(O)。虽然我希望包含更多非二进制的变体,但不幸的是,认为非二进制的受访者太少,无法进行更广泛的编码。
我们看到,我们的受访者主要是男性,这是科技行业性别失衡的典型表现。我们看到大约有 32 个来自非二进制个体的回答。因为这是一个不幸的小水平,我们将看到非二元个体的预测发病率将比男性或女性的预测更不确定。
Figure 6: Distribution of work descriptions given by respondents.
每个回答者给出了他们工作的工作描述,他们可以选择多个描述。因此,这个数字不是传统意义上的“分布”,但它确实计算了这些角色类型在他们的工作描述中出现的次数。我们看到,许多受访者指出了技术角色,如后端和前端开发人员,但也有许多非技术角色,如销售、执行领导和主管。我感兴趣的是比较那些只担任技术角色的人、只担任非技术角色的人以及坐在过道两边的人的发病率。
与发病率的关系
在我的探索中,发现与精神健康状况的发生率潜在相关的变量似乎是有用的。这可以在建立模型之前给我一个可以预测发病率的图片。
Figure 7: Distribution of whether a respondent was diagnosed given if the respondent works in the United States.
当我们根据受访者的工作地点来看我们的诊断率时,发现了一个有趣的关系。我们看到大约 56%在美国工作的受访者被诊断患有精神健康疾病。当我们考虑到只有 41.2%在美国以外工作的受访者声称被诊断时,似乎很明显存在一些基于位置的影响。我们将在讨论中进一步研究这种效应。
Figure 8: Distribution of diagnosis rate given gender of the respondent.
如果受访者认为自己是男性,他们有 44.2%的机会被诊断为精神健康问题。我们可以将这与女性的发病率进行比较,女性被诊断患有精神健康疾病的几率为 64.8%。在我们讨论部分的叙述中,分析这种性别效应是很重要的。我们还看到,非二元个体的发生率非常高,这是相当令人担忧的。也就是说,鉴于他们在受访者分布中的样本量很小,很难概括这种影响。
模型和变量选择
在考虑了 OSMI 提出的问题和我的一些数据探索后,我选择在选择阶段考虑以下预测诊断的变量:
- roleType :工作描述的编码,表示一个人是只从事技术性工作,还是只从事非技术性工作,或者两者兼而有之。如果你想知道我是如何编码的,请看这里的。
- companySize :回答者雇主的规模。这是一个分类变量,范围从自营职业者到超过 1000 名员工。
- 年龄:回答者的年龄。
- isUSA :个人是否在美国工作的指标变量(1 =是,0 =否)。
- 性别:被调查者认同的性别,编码为女性(“W”)、男性(“M”)或其他(“O”)。有关这种编码背后的理由,请参见图 5。
除了上述变量,我还考虑了以下因素之间的交互作用:
- 年龄和性别
- 性别和角色类型
- 性别和伊苏萨
- 角色类型和公司规模
在处理我们的数据后,在轻度探索中探索了这些相互作用的影响。
(注意:模型和变量选择部分的其余部分是相当技术性的。如果您只想看到结果和讨论点,可以跳过这一部分的其余部分。)
因为我们正在处理一个小的数据集和有限数量的变量,我想我应该为我们的推理步骤考虑可解释的模型族。我选择使用决策树来简化可视化表示,使用逻辑回归来测量简单的可变效应。
选择策略
我选择采取以下决定来实现我的最终模型:
- 我在整个数据集上使用 40%-10%-50%的比例将数据集分为训练集、验证集和推理集。推理集是用来获得我们的结果的数据。我们将使用训练集和验证集来选择我们的最终模型。
- 我在训练集上训练我们的模型,然后预测验证集的样本外。我使用 Brier 评分来衡量哪些模型预测验证集最好。
- 对于使用决策树的训练,我简单地将决策树与训练集相匹配。对于使用逻辑回归的训练,我选择在 Brier Score 指标上使用五重交叉验证方法来选择模型的变量。然后,我选择了交叉验证 Brier 得分最低的两个逻辑回归。这三个模型将在我最终选择的验证集上进行测试。要了解更多关于考虑的变量集,请参阅我的模型选择笔记本。
选择结果
在对训练集执行我的交叉验证方法后,最佳逻辑回归模型包括年龄、性别、角色类型、 isUSA ,以及年龄和性别之间的交互作用。第二好的逻辑回归模型被发现包含相同的变量集,没有交互作用的影响。
Figure 9: The regression/decision tree fitted upon our training set. A move to the right branch is an answer of “No” to a question, and a move to the left branch is an answer of “Yes” to a question.
我们看到我们的拟合决策树强调性别和 isUSA 对发病率的影响,这与我们在数据探索中发现的一致。有趣的是,我们看到公司规模作为一个相关变量出现,到目前为止,在分析中发现这并不重要。决策树的这一方面表明它过度拟合了我们的训练数据集的某些组件。
让我们看看这三个模型如何预测验证集。
Figure 10: Our models by their performance on predicting the validation set. Note that a lower brier score indicates a better performing model.
我们看到,通过我们的交叉验证方法选出的最佳逻辑回归在三个模型中具有最低的 Brier 分数。由于 Brier 得分越低,表明模型的预测效果越好,因此该逻辑回归在样本外的表现优于其他两个模型。因此,我们将选择这个模型作为我们的推理步骤。
结果
对于那些跳过了上一节的技术部分的人,让我们重申一下我们选择的模型。我们建立了一个逻辑回归,考虑了年龄、性别、角色类型、 isUSA ,以及年龄和性别之间的交互作用。
当我们在我们的推理数据集上拟合这个模型时,我们看到我们正确预测了 57.4%的诊断。这不是一个特别好的匹配,特别是因为推断集中约 51.3%的受访者声称被诊断患有精神健康疾病。我们将不得不注意到,我们的结果是有限的,我们目前的模型不适合。
Figure 11: Our confusion matrix of our model on the inference set.
根据我们的混淆矩阵,我们的假阳性率为 128/(128 + 220) = 36.78% ,假阴性率为 *161/(161 + 205) = 43.98%。*因为这些比率非常接近,很可能我们不应该使用其中任何一个来通知未来的模型迭代。
Figure 12: Our coefficient table for our model, including standard errors and p-values. These estimates are rounded up to four significant digits.
如果我们认为模型被很好地指定了,我们会对只有一个变量在. 05 水平上是显著的这一事实感到失望。也就是说,根据我们在模型选择步骤中的诊断,该模型可能不符合使 p- 值合理用于分析的假设。因此,在接下来的解释中,我将只考虑效应大小。
有一点很突出,那就是 isUSA 变量的巨大效果。这个效应大小表明,如果一个给定的回答者在美国工作,我们将平均预测该回答者被诊断的可能性是不在美国工作的回答者的 1.47 倍(其他因素不变)。因此,我们预测在美国工作的受访者比不在美国工作的受访者被诊断的可能性高 47%。为什么会出现这种效果将在以后的章节中详细讨论。
我们也看到了角色类型变量的技术水平的巨大影响。这种影响表明,如果给定的回答者只从事技术工作,则该回答者被诊断的可能性预计平均为同时从事技术和非技术工作的回答者的 0 . 799 倍。这意味着,在所有其他因素不变的情况下,我们预测仅从事技术工作的受访者比同时从事技术和非技术工作的受访者被诊断出疾病的可能性低 20%。
我们也看到了一个重要的性别效应。特别是,如果我们忽略年龄的交互作用(这种交互作用很小),该模型预测,平均而言,女性比人口统计学上相当的男性更有可能被诊断出疾病。为了解释一些性别效应,我认为研究相关回答者概况的分数预测是有用的。由于女性受访者的平均年龄是 35 岁,让我们看看我们的模型对美国 35 岁的技术工人的预测。
Figure 13: Some point predictions for technical workers in the US at the age of 35. We also include the lower and upper bounds of these predictions.
当我们只看女性平均年龄的这一点预测时,我们看到性别效应变得明显。我们预测,一名在美国工作的 35 岁女性技术工人有 68%的几率被确诊。对于一个有着相同人口统计数据的男性,我们预测有 48.6%的诊断几率。在这种情况下,我们的预测是,这些人口统计数据中的女性比这些人口统计数据中的男性更有可能得到诊断。在这些人口统计数据中,我们也看到了其他性别人群的高预测发病率,但考虑到预测下限和上限相距甚远,其他性别人群的数据比这一预测让我们相信的要嘈杂得多。
鉴于我是一名大学生,我也有兴趣看看我们的模型对美国大学毕业年龄的技术工人的预测。
Figure 14: Predictions for technical workers in the US at the age of 23. We also include lower and upper bounds for our predictions.
在我们的预测中,我们看到男性和女性之间出现了相似的距离。特别是,假设一个人是一名 23 岁的美国技术工人,我们预测,如果他们是女性,他们比男性更有可能患有精神健康疾病。
讨论
在我们的模型中,美国的大效应大小表明在美国工作对精神健康诊断有一些有意义的预测影响。在我看来,这里有两种可能的叙述。一方面,这可能表明美国的科技文化比其他国家更加浓厚。这将创造一种环境,在这种环境中,员工被推向某种心理健康状况。另一方面,美国的精神卫生保健系统可能比其他国家诊断出更多的人。这两种说法都需要进一步研究,但前者比后者对该行业有更大的政策影响。
我们看到,我们的模型预测,与同时从事技术和非技术工作的人相比,只从事技术工作的人发病率更低。由于纯技术工人和纯非技术工人的影响大小非常相似(见图 12),该模型可能会说,从事混合工作的个人比只从事一种角色的个人更有可能出现心理健康状况。这表明,承担更多角色类型的个人可能会过度劳累,从而影响他们的心理健康。话虽如此,但有一种叙事将因果关系置于另一个方向。在这个故事中,被诊断患有精神健康疾病的人倾向于选择行业中的特定角色群体。通过阅读有关心理健康和工作场所决策之间关系的文献,进一步分析这种因果关系的方向是很重要的。
我认为我们的结果最重要的含义是性别效应。特别是,我们的模型预测女性比男性更有可能要求诊断。关于是什么导致了这种效应,有许多可能的想法。一个潜在的想法是,技术行业的文化给技术工人带来了压力,对女性心理健康的影响比男性更严重。鉴于最近一些关于科技行业女性待遇的故事在网上疯传,这种说法似乎很合适。话虽如此,也很有可能女性比男性更容易承认自己有心理健康问题。这种说法是由 @ntayal 在 data.world 论坛上提出的,尽管我承认没有研究过支持这种说法的研究。这又是一个有意义的研究途径,可以捕捉科技行业中性别和发病率之间的因果关系。
限制
不幸的是,这种分析通常受到研究设计的许多特征和可用数据的限制。我们的模型不太符合推理集,这表明我们的模型不是数据生成过程的强有力的表示。这种拟合的缺乏也表明我们的模型不是很明确的,我们的误差模型是准确的。简单来说,这意味着衡量变量重要性的 p 值可能是不正确的。
我们也有数量有限的非二进制个体。这组人在我们的数据集中特别有趣,因为他们似乎呈现出高诊断率(见图 8)。作为一个非二元个体,在一个迫使自己适应二元社会的社会中工作,很可能会给非二元个体的心理健康带来问题。然而,由于我们的样本如此之少,我们很难对该组做出任何强有力的声明,因为我们的结果与该组相关的可变性很高。
如前所述,我们在调查分布的方式上有一个选择偏差问题(参见“数据集”部分)。因此,很难将我们的结果推广到整个科技行业,我们的模型可能需要持保留态度。
未来工作
令人欣慰的是,有许多与该数据集相关的未来分析途径:
- 调查的其余部分主要涉及与工作场所、公司和整个行业如何处理心理健康相关的问题。如果我们对这些回答进行聚类分析,我们可能会发现该行业如何处理心理健康的不同观点的轮廓。
- 因为我们的模型不是非常准确,在进一步的调查中考虑工作场所压力和文化的测量将是有用的。这些可能有助于告知我们的医疗诊断变量。
- 如前所述,被医学诊断为精神健康障碍不是唯一可能考虑的目标变量。如果我们估计人口统计和就业变量对这些目标的影响,其他两个测量可以提供有意义的分析。
- 由于这项调查也是在 2014 年进行的,因此进行年度分析并查看我们的结果在两个时间段内是否会发生变化可能会有所帮助。
更新:
- 3/19/2017 美国东部时间上午 4:50:更新了一些对性别效应的解释,以简要讨论年龄-性别的相互作用。
我要感谢创造了这个调查。如果你欣赏 OSMI 正在做的工作,请随意捐赠!
如果你有兴趣进一步研究我的分析,可以随意查看我的代码和资产 这里 。你可以在我的 GitHub 个人资料上查看我的整套项目(PLBMR)。**
如果您对分析有任何疑问,欢迎在下方留言评论!
数据与心理健康:2016 年 OSMI 调查—第二部分
原文:https://towardsdatascience.com/data-and-mental-health-the-osmi-survey-2016-part-2-cb8fb0c793cd?source=collection_archive---------1-----------------------
大家好!在对开源精神疾病(OSMI)之前的调查进行数据分析后,我在数据科学界和精神健康领域收到了许多关于我的技术和决策的良好反馈。我感谢您所有的想法和意见,我希望继续参与有关数据和心理健康的对话。
在查看了 OSMI 心理健康调查的其他组成部分后,我认识到数据集的一些其他组成部分可以挖掘出有意义的结果。特别是,调查中有许多资产考虑了受访者对该行业心理健康状况的意见。利用这些意见数据,我今天能够在这里进行分析。
正如我在前面的分析中所讨论的,我有一些基本规则:
- 如果你想澄清这个分析,请在下面留下评论!我想在报告中尽可能说清楚。
- 如果您对使用的技术或研究的组件有任何疑问,也请留下您的评论!我非常欣赏关于数据挖掘策略的对话。
话虽如此,让我们深入研究数据。
数据集
在之前的分析中,我花了一些时间详细描述了 OSMI 的调查。因此,如果你想了解调查的全部细节,我建议你通读前面分析的部分。
如前所述,OSMI 调查包含几个关于受访者如何看待工作场所心理健康支持的问题。其中一些问题涉及:
- 雇主是否在工作场所医疗保健计划中为精神健康状况提供保险。
- 雇主是否支持工作场所的精神健康。
- 某人的同事(如团队成员、直接主管)是否支持工作场所的精神健康。
- 如果有人认为精神健康状况被视为整个行业的禁忌。
我感兴趣的是,这些问题的答案是否有一套模式,这可能表明技术行业对心理健康的叙述。特别是,我想知道是否有不同群体的受访者对工作场所如何处理心理健康有不同的看法。一旦我发现了这些观点群,我希望看到被调查者的人口统计数据是否以某种有意义的方式预测了这些观点。
数据探索
我们面临的一个主要限制是,个体经营者不会填写与他们的雇主或同事相关的大部分信息。因此,为了分析这个数据集,我们必须从分析中去除个体经营者。这使我们的观测数量从 1433 下降到 1146,这是一个相当大的下降。自雇是一种非常不同于为公司工作的典型工薪阶层的工作方式。从这个意义上来说,将它们包括在分析中会导致对我们结果的复杂解释。在未来的分析中,我们将只考虑这一组。
Figure 1: Distribution of whether or not an employer provides mental health benefits as part of health coverage.
虽然相当多的人拥有某种形式的精神健康福利作为其健康保险的一部分,但也有相当多的人不确定他们的保险范围,或者没有精神健康保险。这直接关系到科技行业,因为这表明许多工作场所的医疗保健计划不足以照顾心理健康。
Figure 2: Distribution of whether or not an employer offers resources to learn more about mental health concerns and options for seeking help.
我们看到大多数受访者声称他们的雇主没有提供有意义的资源来进行心理健康教育和寻求帮助。这再次表明一种趋势,即雇主通常不提供福利或替代资源来解决心理健康问题。
Figure 3: Distribution of answers for the question “Do you think that discussing a mental health disorder with your employer would have negative consequences?”
在这个问题上,我们看到大多数人倾向于“不”和“可能”,但仍有相当一部分样本认为,与雇主讨论心理健康状况会产生负面后果。在未来的调查中捕捉这些负面后果可能是有用的。
Figure 4: Distribution of comfort level talking about mental health with coworkers.
从心理健康面向同事的角度来看,我们的样本似乎不愿意与同事谈论心理健康。在团队成员周围讨论心理健康可能存在禁忌。
Figure 5: Distribution of whether or not an individual was willing to bring up a mental health issue with a potential employer during an interview.
我们看到大多数人认为他们不会在采访中提出心理健康问题。在很大程度上,这并不奇怪,因为它可能被认为与面试过程的某些部分无关。然而,当你将它与个人是否会在采访中提出身体健康问题进行比较时(见本笔记本,图 11),很明显,讨论心理健康比讨论身体健康有更大的禁忌。
型号选择
鉴于所有这些关于技术工作场所精神健康禁忌的证据,我想使用一种方法,将我们对工作场所精神健康的反应分成可解释的叙述。我决定使用一个潜在类模型 (LCM)来创建这个细分。
为了建立一个关于工作场所心理健康的模型,我选择了大约 19 个我认为与这个主题相关的问题;包括以下问题:
- 你的雇主提供精神健康福利作为医疗保险的一部分吗?
- 你知道在你的雇主提供的保险范围内有哪些精神健康护理的选择吗?
- 与你的直接主管讨论精神健康障碍,你会感到舒服吗?
- 你觉得被认定为有精神健康问题的人会损害你的职业生涯吗?
我已经在项目的我的 Git 存储库中列出了所有 18 个问题。
(注:这一节的其余部分相当专业。跳过它是合理的!)
模型解释
在我们的调查中,LCM 是这样工作的:
- 在关于工作场所心理健康的调查中,我们有 18 个问题。每个人分别提交这些问题的答案a1,a2,…,a_{18} 。
- 关于工作场所的精神健康有 k 种观点。每个视角 i 携带一个答案分布 D_i 。因此,有D1,D2,…,D_k 分布,并且每一个都与特定的视角相关联。
- 我们的 LCM 假设每个答案组 (a_1,a_2,…,a_{18}) 来自一个特定视角的答案分布。例如,如果一个人的答案是 (a_1,a_2,…,a_{18}) ~ D_1 ,那么这些答案来自视角 1。
- 我们的目标是找到最符合回答者给出的答案的观点任务。我们用来寻找这个视角分配的方法被称为期望最大化算法。
这种客观的衡量我们与回答者给出的答案吻合程度的方法被称为可能性。可能性衡量我们的模型产生答案的可能性。
选拔过程
我们执行以下步骤来选择我们的潜在类模型:
- 我们首先将数据集随机分成一个选择集和一个推理集。我们将使用选择集来单独构建我们的最终模型,并且我们将使这个模型适合推理集来解释我们模型的各个方面。
- 对于选择,我们将考虑 1 到 10 个类别的 LCM。在这种情况下,这是考虑到 LCMs 与多达 10 个观点的精神健康在工作场所。为了衡量每个模型的性能,我们将使用数据可能性的日志上的五重交叉验证对它们进行基准测试。我们将选择交叉验证对数似然性最高的模型。
选择结果
Figure 6: Our Cross-Validated Log-Likelihood on the number of classes considered.
我们看到交叉验证的对数似然性增加,直到 3 个类别,3 个类别后有点动摇,然后在 5 个类别后显著下降。因此,我们将选择具有 3 个类/视角的潜在类模型。
推理
概括地说,我们选择了一个包含 3 个类的潜在类模型,将 18 个问题的答案聚集到不同的角度。现在我们有了这个模型,解释我们的模型参数以定义我们的数据集中的这些透视聚类是很重要的。
探索集群
Figure 7: The prior probabilities on our classes/perspectives discovered by our LCM.
我们可以将这些概率中的每一个解释为随机挑选的回答者被分配到特定类别的机会。因此,如果我们随机抽取一个回答者,该回答者有 26.1%的机会来自第 1 类。
我们数据集中最大的类是类 3,类 1 和类 2 是较小的组。我们看到一个随机的回答者有接近相等的机会成为 1 类或 2 类。
然后,我研究了 18 个问题答案的类别条件概率表。我已经在我的推理笔记本中留下了大部分的分析,但是讨论这些表格中的一些来对我们的集群定义的观点做出声明将是有用的。
Figure 8: Class-Conditional Probabilities on whether or not a respondent’s employer provides mental health benefits as part of healthcare coverage.
为了解释这个表格,考虑每一行代表给一个回答者一个课堂作业的答案分布。例如,假设一个回答者被分配到第 1 类,我们预测有 27.2%的几率他们会对这个问题回答“否”,有 11.7%的几率他们会对这个问题回答“是”。
我们看到类 2 主要对这个问题回答“是”,而类 1 和类 3 通常强调其他可能的答案。因此,类别 2 看起来代表经常有心理健康保险的个人,而类别 1 和 3 代表不常见或很少有心理健康保险的个人。
Figure 9: Class-Conditional Probabilities on whether discussing a mental health disorder with one’s employer would have negative consequences.
我们看到 1 班和 2 班普遍认为与雇主讨论心理健康不会有负面后果,而 3 班倾向于“也许”和“是”的答案。因此,这表明 1 班和 2 班通常比 3 班在心理健康方面得到雇主更多的支持。
Figure 10: Class-Conditional Probabilities on answers to the question “Would you feel comfortable discussing a mental health disorder with your direct supervisor(s)?”
我们看到,第 2 班的学生通常乐于与他们的直接主管讨论心理健康问题。一班似乎对这种类型的讨论感到“是”或“可能”舒服,而三班一般似乎不舒服与主管讨论心理健康。这表明二班在心理健康方面面临着直接上司的高度支持,一班和三班分别面临着中等和弱的支持。
Figure 11: Class-Conditional Probabilities on whether or not being identified as a person with a mental health condition would hurt one’s career.
我们看到 3 班普遍认为这种认同会损害他们的职业生涯,而 1 班和 2 班普遍认为这只会“可能”损害他们的职业生涯,或者不会损害他们的职业生涯。
定义集群
很明显,第 1 类代表的个人具有较高的精神健康福利,对精神健康状况的雇主尊重适中,对精神健康状况的同事尊重适中到较高,对精神健康状况的职业损害感知较低。第 2 类包括雇主提供的高心理健康福利、雇主对心理健康状况的高度尊重、同事对心理健康状况的高度尊重以及对心理健康状况的中度职业损害的感知。第 3 类包括雇主提供的心理健康福利中等、雇主和同事对心理健康状况的尊重程度较低,以及对心理健康状况的职业损害程度较高的个人。
在这种情况下,第 1 类代表在工作场所对精神健康状况感到中等支持的一组个人,第 2 类代表在工作场所对精神健康状况感到高度支持的一组个人,第 3 类代表在工作场所对精神健康状况感到低度支持的一组个人。由于类别 3 是模型中最大的分类,而类别 2 是最小的分类,所以这个度量值稍微有点问题。
预测聚类
在将我们的班级定义为工作场所心理健康景观的三个视角后,我决定我想看看回答者的人口统计数据告知了回答者被分配到哪个视角。我决定在预测我们的集群分配时考虑以下变量:
- 性别:回答者的性别(见此处为我们的映射)。
- 年龄:回答者的年龄。
- companySize :被告雇主的公司规模。
- isUSA :被调查人是否在美国工作。
- diagnosedWithMHD :被调查人是否被诊断有精神健康状况。
请注意,这些变量与我们在之前的分析中使用的特征和目标变量非常相似。
构建模型
(注:这一节也很技术性。如果你愿意,可以跳过它!)
与我们之前的分析类似,我决定使用决策树和多项逻辑回归来预测受访者的群体分配。多项式回归本质上是一种逻辑回归,但将多个类别作为目标变量。因为我们有$3$个不同的类别要预测,所以我们必须使用能够处理多种结果选择的模型。
由于我们已经执行了相当大的数据分割,我发现在这种情况下为我们的模型选择执行额外的数据分割是不合适的。如果我们对推理集进行额外的数据分割,我们将只有几百个调查响应来选择我们的最终模型。
我们通过使用偏差标准分裂来拟合我们的决策树。我们在变量的所有线性和交互效应上使用向前-向后逐步选择程序来拟合我们的多项式逻辑回归。
Figure 12: Our decision tree fitted on the inference set.
我们的决策树在考虑决策时会检查 isUSA 、 diagnosedWithMHD 、 companySize 和 age 。值得关注的一点是,它似乎永远不会预测数据中的类赋值 2。在某种程度上,这使得它的效用相当微薄,因为我们有一个完全不被这些变量告知的整体视角。
我们最终的多项逻辑回归最终包括年龄、性别、 isUSA 、公司规模、诊断为 MHD ,以及年龄和诊断为 MHD 之间的交互作用。
在研究我们的模型的准确性时,我发现多项式回归对数据的准确性约为 52.9%,决策树对数据的准确性约为 54.6%。因为我希望减少过度拟合,并且我更喜欢预测类别分配 2 的模型,所以我决定在这种情况下选择多项式逻辑回归。
研究模型
对于那些跳过我们上一节的技术细节的人,我们开发了一个多项式回归来预测我们的班级分配,使用了年龄、性别、 isUSA 、公司规模、诊断为精神疾病,以及年龄和诊断为精神疾病之间的相互作用。
如前所述,我们的模型在推理集上的准确率约为 52.9%。这通常是不合适的,因为我们的表现只比我们预测的所有受访者的课堂作业 3 稍好一点(见图 7)。
Figure 13: The confusion matrix for our model.
我们的模型在预测类别分配 2 方面做得非常差,因为看起来我们对类别分配 2 的预测正确率为 4/(122 + 4 + 10) = 2.9%$了。特别是,对于我们的大多数观察,我们的模型似乎过度预测了类别 3。这可能是由于我们的类别不平衡,因为类别 3 标签在我们的数据集中比类别 1 和类别 2 观察值出现得更频繁。
Figure 14: Our Coefficient Table for our multinomial classifier.
我们看到,我们的位置效应预测,与在美国以外工作的人相比,在美国工作的人更有可能属于第二类,稍微更有可能属于第三类。我们还看到,预测诊断对观点有轻微的两极分化影响,因为我们预测它将严重增加对类别 2 和类别 3 的分配,而不是类别 1。我们还看到,随着公司规模变大,被分配到第二类的可能性预计会增加,这表明随着公司规模变大,预计员工会发现工作场所存在更多的心理健康支持系统。
同样清楚的是一个非常重要的性别效应。我们看到,女性被分配到 3 级的可能性预计是男性的 exp(.313) = 1.367 倍。这意味着,一个给定的女性比一个同等的男性平均高出 36.7%。当我们看到女性在课堂作业 2 中的性别影响很小时,这意味着女性比男性更容易感到在工作场所缺乏良好的精神健康支持系统。
年龄效应相当有趣。考虑一个案例,其中一个人没有被诊断为精神健康状况。据预测,年龄增加一岁将使分配到类别 2 和类别 3 的概率分别增加 exp(.0666) = 1.069 和 exp(.0597) = 1.0615 。这意味着每增加一年,这些分配的机会预计将分别增加约 6.9%和 6.2%。这表明,随着未确诊的个体变老,存在二分法效应。他们要么发现在工作场所有一个强大的心理健康支持系统,要么发现有一个薄弱的支持系统。
让我们根据一些相关的人口统计数据进行一些要点比较。我们将把这部分分析局限于大公司的美国员工。我们将从研究平均年龄的个体开始。
Figure 15: Class Assignment Predictions for US workers at large firms of average age in our survey.
我们看到,在所有情况下,我们的模型压倒性地预测这个年龄组的班级分配为 3。因此,对于大公司中平均年龄的美国员工来说,我们预测他们可能会在工作场所对精神健康感到支持不足。我们还看到,那些被诊断出有精神健康问题的人被预测比他们同等的未被诊断的同行更不可能被归入 1 类。这证实了精神健康状况在支持方面的一些二分法。
我们看到,在这种情况下,男女之间的性别效应是显而易见的。特别是,与同等男性相比,该人口统计中被诊断的妇女被预测为*(. 44—. 36)/(. 44)=(18.18%)不太可能处于第二类,而 (.59 — .51)/(.51) = 15.68%更可能处于第三类。*
讨论
重要的是,我们的班级模型预测,更多的人认为工作场所的精神健康支持系统很差,而不是认为支持系统中等或强。事实上,我们的模型预测,相信前一种观点的人比相信其他两种观点的人加起来还要多。这表明整个行业要完全解决工作场所的精神健康问题还有很长的路要走。
诊断效果非常强,因为它将个人从感觉得到适度支持的角度推开,并将群体极化为在精神卫生保健方面感觉得到高度或微弱支持。这可能是因为被诊断患有精神健康疾病会让你更适应你周围的精神健康资源。从这个意义上来说,精神健康诊断可能会让一个人对工作场所中可用的资源和支持更加敏感,这可能会对一家公司的精神健康状况产生非中立的看法。这对于公司在对工作场所心理健康支持系统的反馈作出回应时加以利用可能很重要。
就像我们之前的分析一样,性别效应是研究的关键。这种性别效应表明,女性比男性更容易发现心理健康支持系统薄弱。也像我们之前的分析一样,这种结果可能有两种解释。在心理健康方面,女性获得的支持系统可能比男性少。话虽如此,也有可能女性比男性对工作场所的心理健康资源更敏感。后一种解释可能得到以下事实的支持,即在我们之前的分析中,我们发现女性比男性更有可能要求精神健康诊断。利用对我们模型的调整和研究将诊断和性别与这些观点联系起来的因果机制来进一步研究这种影响将是有趣的。
公司规模效应也应该考虑在内。特别是,我们预测,随着公司变得越来越大,他们的员工预计更有可能在工作场所感受到对精神健康的强烈支持。对此可能的解释是,大公司可能有小公司没有的财政资源来更好地支持工作场所的精神健康。当考虑同事和主管的意见时,这并没有解释一些关于心理健康的禁忌。同样重要的是要注意,大公司可能有官僚结构,这将阻止个人轻松访问这些资源,这与我们发现的预测效果相反。为了更详细地研究这种影响,我们可能需要一个 companySizevariable,它具有更高的粒度,并对科技行业主要公司提供的精神健康资源有更深入的了解。
限制
有几个限制需要解决:
- 有可能我们的 LCM 没有被很好地指定。特别地,它假设由 LCM 聚类的问题的每个答案在给定类分配的情况下是有条件独立的。即使从某个特定的角度来看,受访者的答案也极有可能高度相关,因此考虑解释这一问题的模型可能很重要。
- 我们预测班级分配的模型目前非常糟糕,它通常过度预测了工作场所中精神健康支持度低的观点。考虑可能需要哪些其他人口统计数据来更好地了解个人对这一主题的观点可能很重要。
- 年龄和诊断之间的相互作用目前可能是虚假的。特别是,它没有考虑人们在特定年龄是如何被诊断的,因此观点可能是基于他们被诊断的时间而不是年龄本身在特定年龄形成的。
- 在未来的分析中,考虑到个体经营者的细微差别是很重要的。简单地将他们排除在分析之外,并不能给我们一个心理健康支持系统的全貌。
未来的工作
为了进一步分析,需要考虑一些因素:
- 有更多的人口统计数据来预测我们的课堂作业将有助于改进这种分析。最值得注意的是,婚姻状况或有孩子可能会使一个人对可用的心理健康资源更加敏感。教育和父母背景也可能影响这些观点。
- 在这个行业中,有一些关于个人对心理健康的观点的语言数据。虽然为了防止过于复杂,我将它排除在分析之外,但挖掘这些语言数据对于进一步描述这个问题可能是有用的。
- 将 2014 美元调查的分组分配与当前调查进行比较可能也是有用的,以便研究对这一问题的观点如何随着时间的推移而变化。
更新:
- 美国东部时间 2017 年 4 月 27 日下午 5:00:清理了一个数学对象上的 LaTeX 标签的快速添加。
我要感谢创造了这个调查。如果你欣赏 OSMI 正在做的工作,请随意捐赠!
我要感谢 克里斯蒂娜·基兰 和 乔·弗格森 支持我继续分析 OSMI 调查。还要感谢 卡拉·弗格森 帮忙编辑修改这篇分析。
如果你有兴趣进一步研究我的分析,可以在这里 随意查看我的代码和资产 。你可以在我的 GitHub 个人资料上查看我的整套项目(PLBMR)。
如果您对分析有任何疑问,欢迎在下方留言评论!
数据与心理健康:OSMI 调查—第三部分
原文:https://towardsdatascience.com/data-and-mental-health-the-osmi-survey-part-3-1be61c7b3299?source=collection_archive---------5-----------------------
嘿大家好!尽管对这个调查做了两次分析,我的数据刚好够再做一次分析。在这次分析之后,我将会花更多的时间研究与精神健康相关的其他数据集。
开源精神疾病 (OSMI)曾在 2014 年做过类似的调查。假设我们的数据分析有两个时间点,这给我留下了两个关于数据生成过程的问题:
- 我们是否看到了这些年间精神健康状况诊断率的差异?
- 在这两年间,我们是否看到了某些人口统计学因素对诊断的影响有所不同?
话虽如此,我们还是开始吧!
数据集
我在我的第一次分析中详细描述了 2016 年 OSMI 调查。与 2016 年的调查一样,2014 年的调查主要分布在科技会议和在线场所。因此,这个数据集很可能包含同样的选择偏差问题,这些问题影响了我们对后来调查的解释。
一个显著的区别是,2014 年的调查比 2016 年的调查问题少得多。特别是,2014 年的调查包含 26 个调查问题,而 2016 年的调查包含约 63 个问题。我们之前的分析中使用的一些值得注意的变量没有记录在 2014 年的数据集中,包括:
- 以下哪一项最能描述你的工作岗位?(角色类型)
- 你是否被医学专家诊断出有精神健康问题?(被诊断出患有 MHD
不幸的是,我们将不得不把我们的分析限制在两个数据集中的变量上。由于在 2014 年的数据集中没有有效的替代变量 roleType ,我们需要将其从我们的分析中移除。然而,我们能够找到我们的诊断与 MHD 变量的替代。在 2014 年的数据集中,我们发现了这个问题:
- 你是否寻求过精神健康方面的治疗?
如果一个人对这个问题的回答是“是”,很可能他们有某种心理健康状况。也就是说,不清楚对这个问题回答“否”是否表明一个人没有精神健康问题,或者一个人只是没有接受治疗。这是目前 2014 年数据集中diagnostedwithmd的最佳可用指标,因此尽管我们仍然使用它来合并我们的两个数据集,但我们需要在我们的限制部分说明这个问题。
数据探索
Figure 1: Number of observations by year.
虽然 2016 年看起来比 2014 年有更多的观察,但我们认为大约有 150 名受访者。考虑到我们有超过 2600 个观察值,这是一个相对较小的差异。因此,我认为我们不需要担心合并数据集中不平衡的年份。
单变量分析
Figure 2: Distribution of Diagnosis given Year.
我们看到分布的相对差异很小,因为 2014 年和 2016 年的分布看起来各占一半。
Figure 3: Distribution of Age on Year.
我们看到这两年的年龄分布差别很小。也就是说,2016 年的分布看起来比 2014 年的分布略大。
Figure 4: Distribution of Gender by Year
我们看到,在这两年中,我们的性别分布主要由男性构成。不幸的是,这反映了科技行业存在的性别差异。也有相对较少的人不认同性别二元(O 型)。正如我在之前的分析中所讨论的,我希望对这个群体有更多的粒度,但有限的观察数量使得很难指定更粒度的性别谱。
二元关系
Figure 5: Distribution of diagnosis given gender and year.
我们很少看到年份和性别之间的交互作用,因为性别对诊断的影响在两年之间没有太大的变化。就像我们之前的分析一样,看起来女性和非二元个体比男性更有可能被诊断出精神健康状况。
Figure 6: Distribution of diagnosis given whether an individual was working in the United States by year.
我们看到,在美国工作对诊断率的影响在两年间没有太大变化。尽管如此,不随时间变化的地点效应仍然很明显,因为在美国工作的人看起来比不在美国工作的人更有可能被诊断出精神健康状况。
基于我之前的分析,我有兴趣看看美国在诊断上是否有明显不同于其他发达国家的位置效应。因此,我想知道在英国( isUK )或在加拿大( isCA )工作是否对诊断率有一些有意义的影响。我选择这两个国家是因为它们是我们数据集中第二和第三大流行地点。
Figure 7: Distribution of diagnosis given whether an individual works in the United Kingdom by year.
我们在这里看到了一种互动效应。2014 年,无论一个人是否在英国工作,诊断结果的分布似乎没有什么不同。然而,在 2016 年,我们看到在英国工作的个人比在英国以外工作的个人被诊断的可能性略低。促成这一变化的因素需要对英国精神健康状况的叙述进行更深入的分析。
Figure 8: Distribution of diagnosis given whether an individual works in Canada by year.
我们在加拿大看到了非常相似的互动效应。这可能表明,在 2014 年至 2016 年期间,除美国之外,发达国家的诊断率有所下降。也就是说,我们需要做一个完整的国际政策分析来研究这种互动效应。
型号选择
在结合了 2014 年和 2016 年的数据集之后,我决定在执行完整的选择程序之前测试简单模型的性能。
初始建模
作为典型的后续分析,我选择做的第一件事是在当前数据集上测试我们之前工作的最终模型。因为我们在上述模型中缺少一些变量,所以我选择在我们的组合数据集上使用以下变量来测试一个逻辑回归:
- 年龄
- 性别
- 伊苏萨
- 年龄和性别的相互作用
该模型在我们的组合数据集上有 59.44%的准确率。鉴于整个数据集中的诊断率略高于 50%,该模型解释了我们数据中的一些变化。
我还测试了一个类似的模型,它也包括了年的主效应以及年与年、性别和伊苏萨的交互作用。我主要测试这个模型,以便在我们的数据中看到任何明显的时间效应。这个模型与我们之前的模型表现一致,这表明我们的基于年的效应对预测诊断率没有帮助。
Figure 9: Our Initial Decision Tree for some relevant variables in our dataset.
我还拟合了一个年龄、性别、 isUSA 、年份的决策树。这个树在上面的图 9 中有描述。该模型似乎发现性别是唯一的信息变量,这不是一个非常有趣的工作叙述。这个模型在我们的数据集上也有 58.22%的准确率,比我们以前的模型的性能稍差。这向我暗示,在我的模型选择过程中考虑决策树是不值得的。
方法学
我在选择过程中考虑了以下变量:
- 年龄
- 性别
- 伊苏萨
- isUK
- isCA
- 公司规模
- 年份
- 年和我们的其他主要效果之间的相互作用
- isUK 和我们其他主特效的互动(除了 isUSA 和 isCA
- isCA 和我们其他主特效之间的互动(除了 isUSA 和 isUK
- 年龄和性别的相互作用
我选择考虑公司规模,因为角色类型在我们当前的分析中缺失。我觉得公司规模可能有助于包含一个基于雇主的效果的叙述,这种效果可能会随着角色类型而丢失。我选择考虑 isUK 和 isCA 与其他主要效应的相互作用,因为我没有太多时间研究这些特征与我们以前选择的变量之间的关系。因此,一个“厨房水槽”的互动效果与这些位置特征感觉像是最好的选择。我还考虑了年龄和性别之间的相互作用,因为它在之前的分析中被用于我们的最终模型。
(注:本节其余部分技术性很强。请随意跳过它,进入推论部分!)
我采取了以下步骤来选择我们的最终型号:
- 我把我们的数据分成一个选择集和一个推理集。我们的最终模型将在选择集上被选择,然后在我们的推断集上被拟合,用于估计和结果。
- 因为我考虑了许多不同的变量,我觉得选择模型的更有效的方法是通过逐步逻辑回归,使用赤池信息标准(AIC) 进行变量决策。下限模型是仅截距的逻辑回归,上限模型包括上面列出的所有变量。为了减少逐步选择过程中出现的诱导偏差,我选择使用向前向后的过程来选择变量。
选择结果
令人惊讶的是,我的最终模型比我之前分析的最终模型更简单。逐步选择程序选择了以年龄、性别和 isUSA 为特征的逻辑回归。在这个最终模型中,没有交互作用的影响,也没有基于年份的影响。
推理
对于那些跳过前一节的人,我们最终的诊断率模型是一个逻辑回归,以年龄、性别和伊苏萨为变量。
诊断学
该模型在我们的推理集上有 58.2%的准确率,这接近于我们的上一个模型在 2016 推理集上的准确率。也就是说,我们在两个略有不同的数据集上比较了两个模型的性能。很可能比较它们的准确性就相当于比较苹果和橘子。
Figure 10: The confusion matrix of our model on the inference dataset.
我们已经在之前的分析中提供了混淆矩阵的解释(参见这里的,图 11)。在我们当前的上下文中,我们的假阳性率是173/(173+503) 100% = 25.55%,我们的假阴性率是388/(388+278)* 100% = 58.26%*。很明显,我们的模型不能预测诊断率,这可能表明我们没有足够的人口统计学信息来预测诊断。
(注:这一小节的其余部分相当专业。请随意跳到口译部分!)
Figure 11: Our Pearson Response Residuals on our fitted values and our predictors.
我们在性别残差图中看到一些非线性。特别是,对于非二进制个体,我们的残差似乎不是以 0 为中心。除此之外,看起来没有违反独立性或恒定方差假设。
Figure 12: the Q-Q Plot for our Pearson Response Residuals.
对于我们的经验 CDF,有许多偏离高斯线的情况。因此,我们的残差很可能是非高斯的,所以我们不应该用高斯误差模型来解释我们的数据。这让我使用 bootstrap 程序对案例进行重新采样,构建出我们模型中的不确定性度量。
解释
Figure 13: Our Coefficient Estimates with bootstrapped 95% confidence intervals for our estimates.
我们对性别和 isUSA 的预测效果分别是. 8296 和. 3657,接近他们在之前模型中给出的估计值(见此处,图 12)。也就是说,现在我们有了自举置信区间,我们对这些变量对诊断率的真实预测效果范围有了更精确的估计。特别是,我们以 95%的信心预测,女性被诊断为精神健康状况的可能性是男性的 1.72 倍(T6)exp .(542)= 1.72 倍(T7)到 3.06 倍(T8)exp(1.12)= 3.06 倍(T9)。这向我们表明,女性被诊断的可能性是男性的 2 倍。
年龄的预测效应相当小,我们可以看到 0 的效应目前在该效应的自举置信区间内。这表明我认为年龄对诊断率几乎没有预测作用。
这个模型有意思的是,非二元个体的性别效应非常大。我们预测,平均而言,一个非二元个体被诊断为精神健康状况的可能性是一个同等人的 4.57 倍。95%的置信区间表明,非二元个体的真实预测效果介于 exp(.7876) = 2.2 和 exp(2.712) = 15.06 之间,是同等男性的诊断可能性。这种估计影响的大范围将在讨论部分进行更详细的研究。
让我们研究这个模型的相关点预测。
Figure 14: Predicted diagnosis rate of recent graduates of various genders working in the US.
我们看到,即使是最近的毕业生,女性和非二元个体比男性更有可能面临诊断。特别是,在美国的这个年龄,非二元个体比男性更有可能面临诊断。
Figure 15: Predicted diagnosis rate of average-aged individuals of various genders working in the US.
然后我决定研究平均年龄的个体,同时保持其他人口统计信息不变。我们看到我们的诊断率没有太大的变化,这是可以预料的,因为我们的模型中年龄的预测作用较弱(见图 13)。
Figure 16: Predicted diagnosis rate of recent graduates of various genders working outside the US.
我们发现,在美国以外工作会使这个年龄段的所有性别的诊断率降低约 9%。我们还看到,非二元个体和自我认同的男性之间的差异变得更加明显。在这种情况下,我们预测非二元个体比男性更有可能被诊断为精神健康状况。
讨论
我们看到,在模型选择步骤中,我们的年度效应被排除在我们的分析之外。这表明,不仅诊断的分布在这两年中是相同的,而且人口统计学和诊断之间的关系在这两年中保持相对相同。在这方面,2014 年和 2016 年之间的人群差异相对较小,无论这两个时间点之间发生了什么政策干预(如进一步实施平价医疗法案)都没有对诊断率产生多大影响。
我们发现女性的性别效应和美国的地理位置效应与我们在之前的分析中看到的相似。因此,许多相同的不确定性对诊断的因果影响保持不变(见前面的分析,讨论)。这种分析通过在我们的选择步骤中去掉 isUK 和 isCA 而有助于这些因果叙述。由于英国和加拿大分别是我们数据集中第二和第三大流行国家(美国是第一),这种下降不能完全通过这两个地方的小样本来了解。这进一步强调了美国科技行业或美国整体精神景观中的一些组成部分,使其诊断率不同于所有其他国家。
年龄对我们的诊断率几乎没有预测作用。这表明诊断不会随着个体年龄的增长而改变,但它并没有说明年龄对诊断的非线性影响。也许有一个特定的年龄组更容易根据心理健康状况的变化或科技行业的年龄歧视压力进行诊断。也就是说,研究这一点需要进一步改变模型(见未来的工作)。
拥有更大的组合数据集的好处之一是,我们可以更精确地估计非二元性别对诊断的预测效果。特别是,我们现在预测,非二元个体面临诊断的可能性是同等自我认同男性的四倍。也就是说,这种预测效果的叙述需要进一步的分析来证实。在一个迫使个人遵从性别二元制的国家,不清楚是行业内的压力还是整个社会的压力造成了这种效果。
限制
这种分析有几个局限性:
- 我们在 2014 年数据中的诊断指标与我们在 2016 年数据中的诊断指标不同。虽然我们有一个强有力的理由来解释为什么选择这个指标,但是这个差异是我们的目标变量的测量误差。该测量误差可能部分地使该分析的一些成分无效。
- 我们的推理数据集中只有 27 个非二进制个体,这意味着我们对这个群体的估计效果相对不精确。我们只能希望在这次调查的未来截面中,我们将捕捉到更多的非二元观测结果。在未来的调查分发策略中,以这一群体为目标也许是有用的。
- 2014 年数据集中缺乏职位描述迫使我们在本次分析中不考虑角色类型。当我们没有考虑一个人的工作类型如何影响他们的心理健康时,我们可能会遗漏特定工作的叙述。
- 正如我们在之前的分析中所讨论的,调查分布策略表明我们存在选择偏差。这种选择偏差可以在两个方向上起作用。很可能对心理健康更感兴趣的人会参加这项调查,这可能会导致对有心理健康问题的人进行过采样。另一方面,更有能力参加调查的人可能已经参加了调查。这可能会低估严重残疾的个人。
未来的工作
这个数据集有一些未来研究的途径:
- 将这次调查的结果与其他行业的结果进行比较是有益的。科技行业和其他白领工作之间的心理健康状况可能存在差异。
- 比较线性年龄效应和非线性效应是有用的。可能有些年龄段对诊断有关键影响,而不是诊断受年龄本身的影响。
- 深入探究我们的位置效应,看看美国的哪些方面创造了与其他发达国家不同的诊断率,将是有益的。
- 对即将到来的 2017 年技术领域精神健康调查的可能改变可能会给我们更多的人口统计变量,这些变量可以更好地预测诊断率。
我要感谢 OSMI 创建了这个调查。如果你欣赏 OSMI 所做的工作,请随意捐赠!
感谢 克里斯蒂娜·基兰 和 乔·弗格森 支持我继续 OSMI 调查的分析。
如果你有兴趣进一步研究我的分析,可以随意查看我的代码和资产 这里 。你可以在我的 GitHub 个人资料上查看我的整套项目(PLBMR)。
请随意查看我之前对这个数据集的两次分析。这些可用 这里 和 这里 。
如果您对本分析有任何疑问,欢迎在下方留言!
数据和政治变革
原文:https://towardsdatascience.com/data-and-political-change-f4679c86f3d8?source=collection_archive---------4-----------------------
社会学家乔治·齐美尔在 1915 年左右写道,“我们技术的巨大密集和广泛增长……将我们卷入一个手段的网络,手段通向手段,越来越多的中间阶段,使我们看不到我们真正的最终目的”。这些对技术在他所称的文化危机中的作用的反思,当然是对非常不同的政治时代的回应,然而这段话的观点仍然在回响。我们的技术系统越来越密集,越来越深入我们的生活,同时向外扩展到网络中。我们的媒体在伸出手的同时向内推进。对西美尔来说,结果是我们被这些系统纠缠在一起,它们层层叠加,很难把手段和目的分开。他的观点是,在所有这些分层的技术和信息碎片中,我们实际上看不到我们的目的感。简而言之,现代化带来的问题是,我们太专注于我们能做什么,太被层层任务、互动和过程分散了注意力,以至于很难保持方向感或专注感。
很少有作家比西美尔更好地把握住了日益增强的现代性力量。戴维·弗里斯比甚至称他为“第一位现代社会学家”。西美尔于 1918 年去世,他写了各种各样的主题,从时尚和食物到城市生活和秘密社团,但他总是关注他周围可以看到的现代性的发展后果。由于对这些早期转变的敏感,他的作品带有一种事物发展方向的感觉。
西梅尔长期以来一直对现代生活如何改变日常经历感兴趣。在 20 世纪初的一篇文章中,他思考了这些变化对感官的意义(在这篇文章中有更详细的描述)。他的结论是,我们最终会变得“感知不足”。意味着我们感觉事物越来越接近,同时又感觉远离更广阔的世界。我们根本无法应对由深不可测的信息和许多经验刺激带来的感官超载,所以我们更专注于眼前。他后来指出,随着现代性的到来,生活变得越来越“支离破碎”。我们面对的碎片越多,他在他后来的作品中声称,我们就越能拼凑出适合并强化我们对世界的概念——我们对世界的概念为这些碎片提供了一个框架,反过来,随着时间的推移,这些碎片又塑造了这个框架。在一篇关于技术和民主之间不断变化的关系的广泛而深思熟虑的文章中,杰米·巴特利特指出,寻找我们可以策划或编辑的例子来支持我们观点的能力是一个比所谓的“假消息”更大的问题。这种操纵碎片以支持理想或特定世界观的能力是西美尔观察到的,并开始概念化。碎片的范围越大,巩固这些观点的可能性就越大,人们从信息碎片中收集非常不同的世界观的可能性也就越大。在他 1918 年出版的最后一本书里,他写道:
“世界”是一种形式,通过它我们将所有给定的——实际的或潜在的——集合成一个整体。根据指导这种统一的终极概念,多个世界从同一材料中产生:知识世界、艺术世界、宗教世界。
如果是这样的话,那么我们可以想象,有了我们目前的个性化、按需和算法化媒体,西梅尔所观察到的生活的零碎特征将如何随着创造世界的可能性而升级。不仅有更多的碎片,我们遇到这些碎片的方式近年来也发生了变化。
在过去的 20 年里,我们围绕自己建立了一个大规模的数据基础设施,包括移动设备、算法处理、社交媒体、在线购物、GPS 跟踪等等。20 世纪 80 年代末,社会理论家唐娜·哈拉威对即将发生的事情有着强烈的感觉。哈拉威预见到,我们最终会以多种不可避免的方式融入我们的环境。这将改变边界条件,即我们与世界的连接点。正如哈拉威预测的那样,这些界面改变了我们的社会生活、休闲、工作和身体,它们之间的联系有着不可避免的性质。政治活动的背景已经发生了不可逆转的变化。最近几个月,这种情况以各种方式暴露出来,引发了人们对数据和技术可能如何侵蚀一个正常运转的民主国家的结构的担忧。除了更明显的数据滥用案例,科尔宾和他的核心圈子的社交媒体供稿微操作的怪异最近的故事在工党竞选广告上误导他们,给人一种规则如何被重新制定的味道。当然,这只是一座巨大的数据冰山的一角,这座冰山正在产生各种各样的结果和扭曲,同时还在堆积更多层 Simmel 提到的那种类型。
在这种碎片化媒体、新的权力结构和连通性的更广泛背景下,数据分析不再是次要角色。近年来,它已经成为推动社会生活场景、情节和对话的核心人物。数据导向的思维和分析技术的传播似乎是无情的。随着那些参与数据分析的人追求不间断的世界愿景,我们的生活越来越多地暴露在它不屈不挠的凝视之下。
我最近完成了一本书,名为 《数据凝视:资本主义、权力和感知 ,这本书着眼于数据的力量是如何融入数据分析的基础设施和实践的。一组有说服力的承诺被附在数据分析上,它们既延续又部署了对知识、生活和未来的某些愿景。也许毫不奇怪,在这一愿景中,数据将使我们变得更好、更快、更具创业精神、更高效和更具竞争力。这些有说服力的理念不仅传达了更广泛的意识形态,还提供了数据分析的扩展和强化。分析行业寻求推广某些的理想和愿景,以支付其产品的传播费用。结果是,这些理想和思维方式被编码到我们现在占据的非常数据密集型的基础设施和空间中,它们成为如何使用数据、如何通过我们的数据来判断我们等等的一部分。这些理想通常与通常被称为新自由主义理性的东西一致,在这种理性中,一种市场模式被推出到社会世界中,但如果只通过这个镜头来看待它们,那将是一个错误。编码到这些基础设施中的理想是多样的和不断变化的,这意味着我们不能简单地转向新自由主义来解释这些变化。
举一个例子,一个主导思想是,世界正在加速发展,数据分析提供的实时视图是我们可能跟上发展的唯一方式。世界正变得越来越快的观念,被作为一种将快速数据知情决策的理念嵌入组织和社会结构的方式而得以延续。核心思想是,数据使人们能够在竞争中领先,或者这些分析为他们提供了超越竞争对手的优势。在这里,我们看到市场模式和超竞争力的概念正在固化——与此同时,我们被告知,我们需要不断加快步伐。这种想法被编码成数据分析背后的软件项目被想象和设计的方式,这反过来又转移到这些系统的实现中。数据分析所依赖的软件被锁定在对完美洞察力的永恒追求中,不断有大量更新和新项目出现。类似地,数据分析师被要求清理和呈现数据,以便在尽可能短的时间内做出决策。竞争速度只是一系列固有理念的一个方面(在数据凝视中有详细讨论);这些也已经成为我们生活方式的重要组成部分,这些理念塑造了分析设计和整合到各种类型组织中的方式。
如果意识形态和理想以这种方式被编码到我们的基础设施中,那么很难想象在不拆除和重建调节我们消费、社会网络、互动、机构和工作场所的系统的情况下,它们会如何转变。齐美尔所说的密集的技术提供的“手段”使得这样的任务几乎不可想象。很难想象一个全新的基础设施会从我们脚下出现,尤其是考虑到这些数据丰富的架构背后的时间和资源。
如果我们将更广泛的言论转向不同的方向,如果政治变革发生在意识形态层面,我们可能会想,我们丰富的数据基础设施是否会阻碍我们的社会结构、组织和日常体验层面的真正变革。问题可能是,修辞变得完全脱离了我们日常生活的中介物质——随着话语中的变化,没有意识到这些巨大的密集和广泛的基础设施可能会受到挑战和改造。真正的改变需要相当大的方向转变。不仅数据分析在我们的商业、国家和组织结构中如此深入,与之相伴的思维模式也是如此。
随着我们的基础设施变得更加活跃,其中嵌入了如此多的思想,从算法建模到人工智能和机器学习的概念,因此出现了更严格的意识形态编纂的可能性。如果我们寻求社会和政治变革,那么我们不能仅仅从意识形态的角度来思考,我们还需要重新想象我们所生活的数据分析结构。在这种情况下,了解的方式与生产方式同样重要——事实上,在数据支撑资本主义的地方,这两件事混淆在一起。让我们的基础设施保持现状,即使我们改变我们的政治基调和治理,也可能使这种变化流于表面。目的将从这些手段层中分离出来。我们将继续生活在一种分布式的力量中,这种力量不再受任何核心意识形态力量的真正领导,而是如此根深蒂固,以至于它在我们的生活中漫无目的地游荡。因为权力如此深植于组织结构中,它可以在没有中枢神经系统的情况下通过数据发挥作用,因此只能通过关注它的隐性存在和限制来真正破坏它。
国际奥委会已经呼吁围绕数据使用制定新的选举规则,除此之外,我们还需要更具前瞻性的思维和前瞻性的监管方法。在更大的范围内,监管和重组需要一起进行——在如何监管平台方面有一些创造性的新兴想法,例如在最近由 IPPR 出版的报告中。从社交媒体到工作场所权利,围绕数据、平台、算法等的所有权和使用的新政策将至关重要。但是我们也需要跨越不同的尺度,深入到日常和组织层面。在这方面,我们需要在工作场所、服务提供、交易和信贷中使用数据的新规则。我们还需要重新思考公共机构和治理系统如何使用数据。除此之外,我们需要一个新的激进的教育议程——也许是在学校和大学里的数据公民计划——让人们能够理解这个不断变化的环境,它对他们意味着什么,对社会意味着什么。这一数据公民计划可用于建立对数据用途和影响的理解和认识——然后可用于未来如何处理、管理、改造和处理这些数据。政治愿景至关重要,但关注我们所占据的基础设施也同样重要。如果我们继续像 Simmel 观察到的那样纠缠于我们的技术,那么任何寻求真正变革的政治运动都需要精通数据。只有到那时,我们才有可能改变不平等的编码,朝着进步的目标重塑这些系统,并从我们的最终目标中分离出分层的手段。
…
《数据凝视》 现在可以从普通商店预订平装本。描述这本书写作的一篇文章可以在这里找到。
业务数据集的数据注释最佳实践
原文:https://towardsdatascience.com/data-annotation-best-practices-for-business-datasets-4a818e2c9643?source=collection_archive---------15-----------------------
在之前的一篇文章中,我们介绍了如何利用 reCAPTCHA、Mechanical Turk、Figure Eight 或 PyBOSSA 有效地众包我们的注释任务。但是,成功的众包活动注释您的业务数据集的秘诀是什么?
这里有一些我在 PyBOSSA 中使用过的快速提示(也适用于其他众包平台)来帮助你开始:
But how do we annotate the dataset(s)?
分阶段计划
- 数据标注是马拉松,不是短跑。最好从处理业务问题的数据科学家和 SME 的核心团队开始,用他们自己的答案“引导”数据集。实际上,您使用核心团队作为第一批工人来注释数据集的一小部分。当你向大众工作者扩展来衡量他们的可信度时,这将会派上用场。
- 使用来自每个阶段的反馈来迭代活动的工作流程,以使员工的参与变得非常简单。然而,注意不要重复太多。至关重要的是,你要在每个阶段保持活动精神的相似。查看调查设计了解更多详情。
- 使用排他性策略来增加员工对活动的兴趣,这与参与活动的激励措施紧密相关(稍后将详细介绍)。
- 避免让工作人员在一次活动中对同一观察执行多个注释任务的诱惑。相反,为每个需要注释的任务发起多个活动。每个活动的泳道越简单,最终的数据集就越丰富和有用。
清晰简单的说明
- 你应该能够用不到 40 个单词来解释你要求工人执行的注释任务。再多就会导致参与度急剧下降。如果你发现你用了太多的词语来解释手头的任务,重新评估你要求完成这项工作的工人的能力。
- 如果整合到 SME 的现有工作流程中,尽可能使其顺畅。你最不希望的事情就是任务太麻烦,以至于工人忽略它,或者更糟的是,输入随机的答案,只是为了通过你的注释任务!
- 限制员工成功参与活动所需执行的操作数量。理想情况下,每个任务、每个观察只需一次点击。这里的目标是降低参与的复杂性,以便员工更有可能正确参与。页面上有大量的 HTML 表单元素会让工作人员感到困惑,分散他们执行注释任务的注意力。这可能需要预先进行更高级的 HTML/JavaScript 编程,但是为了有一个坚实的基础事实数据集,时间投资是值得的!
- 理想情况下,尝试注释任务的工人已经被确定为“合格”。以防万一,提供任何术语和主题信息的超链接,以确保员工之间的一致应用。这可能像定义任务中使用的术语一样简单,也可能像解释您要注释的内容的整个过程一样复杂。同样,在选择哪些工人来执行这项工作时,他们应该已经知道这一点,但让它在点击范围内来刷新他们的记忆是有帮助的。
- 向员工提供反馈回路。老实说,注释数据是一项枯燥的工作。反馈员工回答了多少问题,以及其他基本指标,可以让员工保持参与。在某些情况下,一个简单的进度条对参与度有很大帮助。别信我的话,A/B 测一下!
- 时间限制有多少答案可以提供。在一些活动中,我们对多元化人群的智慧更感兴趣,并希望防止单个员工做出过多贡献。对于这一点,限制每个员工每小时/每天回答的次数是一个很好的解决方案。
活动的通信计划
- 您的员工如何知道注释活动可用?您是否有一个集中的中心来管理所有可用的活动,或者您是否希望将活动限制在特定的 SME?
- 在某个活动中,您是否有权要求特定的 SME 每天执行 N 项任务?如果没有,你需要找出如何从他们的领导团队获得授权,以确保活动成功。这通常包括向领导团队解释,在我们拥有这种类型的数据集之前,我们无法执行任何可信的机器学习建模。但是要注意,在商业中尝试这种类型的数据注释众包时,这可能是最困难的任务!
- 确保领导团队和员工都非常清楚为什么要开展这项活动。它有助于解释一旦收集到这种类型的数据,It 有可能公开什么类型的解决方案。对于任何重大的业务问题,通常都会附上一个金额数字,这有助于说明一个有效的带注释的数据集的重要性。但是,当最终目标是增加/取代/自动化工人的一部分日常工作时,要注意你如何向工人传达这一点。您最不希望的事情就是公开反对您的数据注释任务!
对工人的激励
- 找到一种方法来整合基于时间的激励措施,并添加游戏学(即游戏设计)的元素,使活动对员工来说更有趣。
- 奖励不一定是金钱上的。通常很容易找到礼品卡的预算来奖励前 N 名贡献者,但这可能不是最好的动力。与领导团队一起集思广益,找出激励员工的激励措施(甜甜圈、与副总裁共进午餐、额外休息、为参与最终项目的核心团队提供一个席位,该数据集将用于该项目等)。
验证员工答案
- 在你已经知道正确答案的地方,偶尔加入“抓住问题”的观察。这将有助于衡量每个员工的可信度,以了解他们的答案是否应该包含在最终的数据集中。通常,此“抓住”数据集从活动的初始“引导”阶段获得,该阶段可能由发起活动的核心数据科学团队策划。
- 测量每个工人为每项任务提供答案所花费的时间,然后应用 pareto 原则去除离群工人。请记住,我们对利用专家群体的智慧来构建我们的地面真相感兴趣;不仅仅是那些能最快/最慢完成任务的专家。
- 汇总所有工人的答案,以确定何时您有足够的法定人数,哪些注释应被视为“基本事实”。这通常意味着向奇数个工人(即 3、7、9 等)呈现相同的观察结果。).虽然这引入了重复工作,但它也让我们能够捕捉不同工作者对真相的理解。当与 SME 在业务数据集上合作时,该数据集将用于训练机器学习模型,该模型将使业务的某些方面自动化,关键是我们要根据普遍接受的“真理”来训练它。
- 与领导团队一起进行抽查,以确保法定人数的员工的回答符合他们的期望。如果没有,进行更深入的调查,以了解工人与领导团队意见不同的原因。这通常会带来比任何机器学习算法都能找到的更有趣的见解!
我很想听听商业领域中其他实践数据科学家的意见。你通过哪些步骤来生成地面真实数据集,以训练你的机器学习模型?
作为不完整历史的数据
原文:https://towardsdatascience.com/data-as-incomplete-history-5110e3bba62b?source=collection_archive---------15-----------------------
虽然哲学家们长期以来一直在争论存在和未被察觉的东西是否真的存在,但在数据方面,事情很简单:如果来自某个东西的数据未被收集,它就不能被使用。即使感知到也帮不了你多少。
Pietro Paolini — Allegory of the Five Senses; Sight and Touch. Source: http://www.the-athenaeum.org/art/full.php?ID=132064#
虽然有些人可能认为这一点是显而易见的,但即使是我们今天看到的大规模数据增长仍然只代表了现有数据或感知数据的一小部分。环顾四周,问问你自己,你正在品尝、看到、触摸、闻到或听到的东西有多少产生了正在被收集的数据。十有八九,答案是几乎都不是。考虑到现在存在的大量数据,这一点很容易被忘记,但是,通过查看我们的过去,我们可以更好地说明我们今天在哪里,我们不在哪里。
为了说明这一点,我将看看历史学家的工作。历史学家的目标是试图理解和解释已经发生的事情,有时还有一个额外的目的,那就是告知正在发生的事情,或者甚至帮助预测将要发生的事情。然而,起点是过去,因为如果你不知道发生了什么,你就不可能知道也不可能知道会发生什么。
虽然历史学家并不以特别精通数据而闻名,但他们广泛利用历史数据来实现自己的目标。此外,在使用这些数据时,历史学家明白它的局限性。过去发生的事情的历史数据或信息痕迹,数字的或其他的,往好里说是不完整的,往坏里说是不相关的或虚假的。
虽然在过去 100 年左右的时间里,特别是在过去 20 年里,数据的收集有了急剧的增长,但仍然有许多未被收集,这是历史学家非常清楚的事实。事实上,他们的很多技术都是围绕这个事实发展起来的。
这种数据格局
在许多方面,尽管缺乏高质量的历史数据,历史学家的技艺是发展和运用技术来理解过去的事件。作为一名历史专业的本科生,我记得我被要求确保我的论文主要基于原始资料:“包含直接证据的材料,来自一个目击或参与事件的人的第一手信息”第二手资料“使用第一手资料来分析一个事件或解决一个研究问题”被认为是对认知的解释,往往比我们所认为的更麻烦。我的教授们坚持说,“尽可能去查阅原始资料”。
整个框架表明了在数据解释中发生了多少事情,以及有多少数据本身只是收集到的对事件的解释。这些解释,主要来源,是建立在人类的感知之上的,带有许多偏见和错误。这些然后被嵌入数据本身。要搞清楚这一切,需要历史学家对数据进行额外的解释,在这个过程中创造新的二手资料。
对于一些历史学家来说,这不仅仅是一些数据问题,这是现实的反映。正如迈克尔·j·克莱默雄辩地写道:
- 该数据库似乎以有问题的方式限制了人文分析的微妙性和灵活性。它坚持将杂乱的生活现实、思想、情感、实践、艺术和表达挤压成整齐的行和列。打个比喻来说,我们从多样的建筑、自然地形、甚至世界的熵到一个标准化的系统:从起伏的山丘、创造性的建筑、陌生的人到停车场、没有面孔的办公大楼、以及最可怕的结构形式的公司资本主义的小隔间。任何东西都必须适合,不管它的大小、形状、内部尺寸或奇怪的配置。标准偏差是允许的,但不仅仅是简单的旧偏差,当然也不是偏差。这就是最麻烦的“大数据”时代。
无论数据挑战更多地反映了数据是如何收集的,还是收集数据的世界,历史学家都部署了无数技术来适应历史的数据现实。有些人关注的是数据更丰富的历史,因此更容易接受引人注目的叙述——看这里,(另一个)二战史,盐的历史,咖啡的历史,历史的历史。其他人关注的是数据贫乏或研究不足的历史,几乎任何数据或叙述都被视为对我们理解这一主题的补充。然后还有历史人物传记。虽然尼亚尔·费格森可能是正确的,“个人的优势在许多方面是历史研究的真正优势”,但在我看来仍然有太多的传记,特别是因为它们经常是关于同一个人的。
作为一名历史专业的本科生,我试图通过专注于思想史来应对这些数据挑战,花时间去理解伟大作品写作的历史背景,包括陀思妥耶夫斯基、加缪、黑格尔和其他人的作品。这样,我就可以根据这些人写的东西来进行研究。在大多数情况下,这方面的争论很少,数据也很容易获得。我只是需要阅读他们的作品。然后,我花了一些时间阅读他们的个人经历,他们在哪里出生和生活,他们与谁交往,等等。这些数据主要由基本事实组成,并通过信件或公开演讲加以充实。然后,我会试图对他们生活和写作的更广泛的社会背景有一个基本的了解——正在进行的战争,重大的科学发现,政治环境。最后一步是将所有这些放入一些半连贯的叙述中。
其核心是,我的策略是在给定数据现实的情况下尽我所能。我只能接触到有限的非数字原始数据,没有旅行预算,语言能力有限。当我能得到第一手资料时,它们常常读起来很乏味,或者读起来像是被当时的暴徒收买(或威胁)的人的目击证词。
数据结构
转向数据的结构,即使给定人员的书面理解相对准确,从数据的角度来看,主要和次要来源仍然主要是无结构的文本。此外,许多最重要的文本过去和现在都不是数字化的。我还记得在大学时,我花了几周时间在芝加哥的纽伯里图书馆做研究,那里有一个区域存放着手稿、课本、书籍等。你需要特别许可才能看。那时,我把我的研究重点放在了其他地方,因为我不愿意去弄清楚什么样的文本是可用的,以及我如何从受控阅览室到最终论文。
当你可以访问存在的非结构化文本时,不管是不是数字化的,数据都很难处理并从中获得意义。尽管一些历史学家已经开始利用计算语言学和自然语言处理等领域的发展,但这些技术对于复杂语言,尤其是数百年前的复杂语言,以及许多不同语言来说,仍然处于萌芽状态。
不幸的是,大多数历史学家仍然必须依靠 brut force 方法来试图绕过这些数据挑战:他们阅读。像许多其他领域一样,他们也是专业的,这有助于锚定他们所阅读的内容,因为尽管我们尽了最大努力和咖啡,人类并不是真正为部署布鲁斯力量方法而设计的。我们很慢,而且我们实际上不能非常有效地处理信息。
Google Image Search Results for the term “historian”
然而,即使他们广泛阅读并适当地专门化,文档本身的范围也可能非常有限。虽然历史学家可能不会经常说这句话,但我会想到“历史是由胜利者书写的”。这句话暗示着“失败者”的历史从历史记录中被忽略了,或者至少更难找到。虽然这并不总是正确的,而且有无数的例子表明历史是由官僚写的——T4 的《末日审判书》就是一个很好的例子(即使它是由胜利者资助的)——以及失败者写的家书、反面故事等等,但这种想法是,大多数历史都是由经历所述时刻的人们的书面感受提供的。这需要一个作家,而作家在历史上往往被某些群体(特别是受过良好教育的白人男性)过度代表。
即使我们能够识别和利用某个特定时代的所有相关作品,深入挖掘档案和随机来源,以识别在某个特定时间的某个地方写下的所有东西,那么,那么多东西都被遗漏了。历史上绝大多数人类都没有留下文字作品。他们的感知完全消失了。那些写了或者被写了的人,只写了一定的数量和一定的事情。
人类的经验本身只是已经发生的所有事情的一小部分——当然,除非你认为某些事情必须被感知为实际发生了——只产生了极其有限的一组数据。我们所感知和经历的几乎所有东西都没有被收集起来,这在今天依然如此。如果你不相信,让我们快速看一下意大利的经济。
一个例子:意大利经济数据
当然,随着时间的推移,作为数据收集的人类经验的数量已经发生了变化。在过去的 100 年左右的时间里,出现了大量的数据,这些数据可以用于现代历史和未来历史。快速看一下意大利这个历史资料相对丰富的国家,就能很好地说明这种差异的规模。这也说明了即使在今天,实际存在的数据是多么的少。
如果你回到 2000 年前,罗马帝国是欧洲的一股力量,而意大利不是今天的意大利(对不起,意大利),数据故事是暗淡的。尽管罗马建筑状况相对较好,并且仍然分散在欧洲各地,但使用数据来理解像罗马帝国经济这样基本的东西却异常困难。
麻省理工学院(MIT)的经济学教授彼得·特明(Peter Temin)在他关于早期罗马帝国的经济的论文中总结了这一挑战:
- 在探讨这些主题之前,我需要解释为什么所有关于罗马经济的陈述都是从高度不完整的数据中推断出来的。罗马人通过切割大约现代屋顶木瓦大小的木制椭圆形蜡层来记录他们的大部分日常交易。这种媒介极易腐烂,两千年后我们几乎没有这种交易的书面记录。因此,我们依赖于四种证据:出于其他原因保存下来的文学作品中关于经济的随意评论;重要到可以刻在石头上的宣言或指示;考古证据;和埃及的纸莎草纸,它们在那片土地的干燥气候中经久耐用。信息很多,但几乎没有经济学家所说的数据。
将这与假设的未来“早期欧盟时期的意大利经济”相比:在这种情况下,历史学家将拥有几乎无限的数据集来工作。例如,在撰写本文时,欧盟统计局(Eurostat)目前在网上提供超过 4600 个欧洲社会数据集。它甚至提供信息图表,非技术用户可以很容易地生成意大利经济各方面的图表。
像这样的图表:
Italian Gross Debt as a Percentage of GDP. Source: https://ec.europa.eu/eurostat/cache/infographs/economy/desktop/
在意大利债务数据和 GDP 数据的分层中,我们可以看到,在过去 10 年中,总债务占 GDP 的百分比已经上升,这意味着意大利作为一个国家负债越来越多。据一位未透露姓名的欧盟官员称,这一债务,加上最近提出的近期预算优先事项,意味着“义大利,以及欧元区,正在梦游进入下一场危机”。这种当前债务/未来预算是在 2018 年意大利大选中发生的,反建制的五星运动和右翼联盟党是大赢家。
这只是我通过几次搜索找到的一些基本的、容易获取的数据。对于一个真正的未来历史学家来说,是这样的。很多。数据。
然而,想起我的历史教授们,我必须问,这些资料中有多少可以被恰当地视为原始资料:有多少是直接证据,有多少是二手资料或摘要?更仔细地看一下我上面提到的数据,很多数据实际上更好地描述为二手来源信息,而不是一手来源数据。
例如,GDP——一个经济体中每年生产的所有商品和服务的估计总价值——只不过是试图量化经济学家在大约一百年前提出的一个想法,以帮助推动政府在税收和战争支出等问题上的决策。通常有三种计算方法(理论上等价):把每年花掉的钱加起来,把每年赚到的钱加起来,或者把每年增加的价值加起来。“它对于推动政府政策是有用的,但它不是对一个事物的事实衡量。似乎是为了强调这一点,欧盟统计局提供的年度 GDP 总量包括一份近6000 字的元数据参考文件,供任何希望更好地了解总量是如何产生的人使用。从我以前的历史课程的角度来看,GDP 看起来更像是一个二手来源。
如果我们试图深入研究聚集的主要来源,我们会发现我们倾向于深入的最低层次是行业或区域聚集。为了获得原始数据,我们必须一直追踪到实际交易——个人和组织一年中每天花费的钱的总和。也许有一天银行会披露这种个人信息,但是,我不确定。我们未来的历史学家可能会发现,要获得这些数据就像特明教授要获得罗马时代的书面交易记录一样困难。
为了便于讨论,让我们假设未来的历史学家将能够获得个人层面的交易记录,或者类似的东西。这在理论上应该允许我们发展个人 GDP。然而,如果我看看我自己的消费模式,它是直接支付、提取现金(谁知道钱去了哪里)、信用卡支付等等的混合。我的一些支出是代表我的妻子或女儿,或者一个朋友。
如果我在一家现金密集型企业工作,或者参与非正规经济,用服务换取商品,比如换工如何照看孩子来换取住宿,会怎么样?或者,如果我想隐瞒我的支出,或者利用企业作为金钱进出的幌子,该怎么办?又或许,知道家乡就业机会少,一年有一部分时间在国外工作怎么办?
即使这些因素中的几个因素存在,许多个人层面的数据也将无法收集,从而遗漏了重要的支出水平。此外,收集到的数据可能会误导人,甚至故意作假。回到意大利,所有这些因素都存在,甚至更多。
因此,尽管未来的历史学家可能会比现在的历史学家更多地讲述欧盟早期的意大利经济,但并不清楚这是否会带来更深的理解。在许多方面,许多最相关的人类经验仍然没有作为数据收集起来,许多所谓的数据从核心经验中抽象出来,以至于很难知道它是如何映射到人类经验的。据报道,一名纽卡斯尔妇女回应关于如果脱欧赢得 2016 年英国退出欧盟公投,GDP 可能下降的可怕警告,“那是你们该死的 GDP,不是我们的。”
图像数据扩充
原文:https://towardsdatascience.com/data-augmentation-and-images-7aca9bd0dbe8?source=collection_archive---------8-----------------------
Do you think this monkey could do a similar job of recognizing his own image from portrait frames such as in the mirror, or from the right-turn angle we are viewing the monkey in?
提高深度学习模型性能的最佳方法之一是向训练集添加更多数据。除了从野外收集更多代表区分任务的实例之外,我们还想开发一套方法来增强我们已经拥有的数据。有许多方法可以扩充现有的数据集并生成更健壮的模型。在图像域中,这样做是为了利用卷积神经网络的全部能力,卷积神经网络能够捕捉平移不变性。这种平移不变性首先使图像识别成为一项如此困难的任务。您希望数据集代表视觉任务感兴趣的许多不同位置、角度、光照和各种失真。
例如,如果训练集中的每幅图像都完全位于帧的中心,当图像相对于背景稍微向右移动时,传统的前馈模型就会出现混乱。如果每张猫的照片都是肖像照,那么当猫的脸转向右边时,模特就认不出它了。
为了提高模型概括和正确标记有某种失真的图像的能力,我们对数据集应用了几种翻译。这可以通过多种方式实现,在本文中,我们将主要关注水平和垂直翻转、平移、颜色失真和添加随机噪声。
水平和垂直不变性的关联性非常直观。
上面的镜像图像都带有我们希望图像分类器学习的猫的相同特征。添加这些左/右翻转的图像将增加图像分类模型的鲁棒性。特别是当涉及到猫的视角未知的任务时,(想象一个模型被放在一个视频监控摄像机内,在一个区域内数流浪猫)。
此外,我们可能希望向数据集中的图像添加平移。
Centered image vs. Left-Aligned Image
在上面的例子中,我们看到了一个完全居中的图像和一个左对齐的图像。在我们的图像上做这些变换将迫使模型聚焦于‘3’的曲线和特征,而不是与帧中的位置相关的一些隐含特征。
除了这些大量改变二维像素空间中的值的平移之外,我们可以向图像添加随机噪声。这可能有助于对抗色彩空间失真,如照明。
Add noise to image
noise = np.random.random((IMG_SIZE, IMG_SIZE), np.uint8)Matrix addition.. add noise to the image
image += noise
这些简单的图像变换将产生更健壮的模型,该模型学习更好的特征以在图像之间进行区分。这些技术对于提高模型的泛化能力以及使用少量数据进行学习非常有用。一般来说,过拟合是机器学习模型的主要问题之一。这些转换对于克服过度拟合非常有效,但是,如果底层数据集已经不能代表样本空间,它们就不起作用。
希望这些变换能提高你的图像识别模型,感谢阅读!
CShorten
Connor Shorten 是佛罗里达大西洋大学计算机科学专业的学生。对软件经济学、深度学习和软件工程感兴趣。
数据扩充实验
原文:https://towardsdatascience.com/data-augmentation-experimentation-3e274504f04b?source=collection_archive---------6-----------------------
试验简单的数据扩充参数以获得最佳结果
这是我之前关于数据扩充的文章的后续:使用 Fastai 的 数据扩充。不变性是卷积神经网络对对象进行分类的能力,即使它们被放置在不同的方向上。 数据扩充是一种创建不同方向的新“数据”的方式 。这样做的好处有两方面,第一是能够从有限的数据中产生“更多的数据”,第二是防止过度拟合。
处理有限的数据有其自身的挑战,只有当增强技术增强当前数据集时,使用数据增强才能产生积极的结果,例如,训练网络以“学习”颠倒方向的地标有任何价值吗?
然而,如果您的数据集由处方药的图像组成,那么有多个方向是有意义的,因为这些图像理论上可以在任何方向。
可能有许多变化会影响结果,例如数据集的大小、扩增技术、批量大小、图像大小和训练参数等等。本文的目的是展示数据扩充对整体准确性的影响。以下结果基于以下假设:
- 列车组有 1040 幅图像,测试组有 208 幅图像。
- 实验是使用学习机器学习的优秀资源 Fastai 进行的。你可以在这里找到更多信息。
- 训练是用 Leslie Smith 的一个循环法完成的,这在这篇 论文 以及这篇优秀的 文章 中有所解释。我以高学习率,低周期长度训练,在最大动量为 0.95,最小动量为 0.85,重量衰减为 1e-5 的情况下,将 5%的周期用于最后的退火。我们的目标是在最短的时间内获得最佳结果,这样就可以用不同的技术进行大量的实验(下面的结果并没有显示所有的结果)。
- 总共有 82 种不同的标签,从描述形状、颜色、表面标记、强度;例如,一个胶囊可以有以下标签[胶囊]、[蓝色]、[TEVA]、[多色]、[白色]、[胶囊形状]、[25 毫克]等。
- 在网络看不到的 10 幅图像上测试每种数据增强技术的预测,并计算准确度 和 误差率。这是通过检查正确分类标签的数量和错误分类标签的数量来完成的。 大多数论文关注的是准确性,但调查错误率或生成的错误标签数量也同样重要 。
- 结果分为 1) N:预测的正确标签总数, 2) 准确度:(N/82)*100 其中 82 是标签总数, 3) E:预测的错误标签总数, 4) 误差:(E/N)*100
结果如何?
记住,这个项目的目标是在最短的时间内找到最高的精确度和最低的错误数量(每 10 个时期的平均训练时间约为 3 分钟)我们可以看到,通过使用各种数据扩充技术加上 Leslie Smith 的单周期方法,我们可以很好地了解哪些数据扩充技术最适合这个数据集。
结果汇总显示**【RandomZoomRotate】选择正确的标签最多,而【Padding(50)】选择错误的标签最少。反之亦然【Cutout】正确选择的标签数量最少,而【random lighting+Dihedral】**错误选择的数字数量最多。
如果我们将具有最高数量的准确标签**【RandomZoomRotate】的增强与具有最低数量的不准确标签【填充(50)】**的增强相结合,会发生什么?
使用 RandomRotateZoom + AddPadding 的组合:
aug_tfms = [RandomRotateZoom(deg=45, zoom=2, stretch=1)] + [AddPadding(pad=50, mode=cv2.BORDER_CONSTANT)][AddPadding(pad=50, mode=cv2.BORDER_CONSTANT)]
**增强看起来像什么:**随机旋转和填充的组合
精确标签: 60
准确率: 70%
标签不准确: 6
误差: 10%
查看结果:
以下是研究结果的总结:
使用随机旋转:
aug_tfms = [Random Rotate(57)]
**增强后的样子:**视觉上,图像随机旋转了 57°角。
精确标签: 55
准确率: 67%
标签不准确: 4
误差: 7%
使用二面角:
aug_tfms = [Dihedral()]
**增强看起来像什么:**将图像随机旋转 90 度和/或反射(翻转)。
精确标签: 51
准确率: 62%
标签不准确: 9
误差: 18%
使用随机照明:
aug_tfms = [RandomLighting(b=0.25,c=0.15)]
**增强看起来是什么样子:**使用 2 个参数 b =平衡和 c =对比度来调整随机画面照明。
准确的标签: 57
准确率: 70%
标签不准确: 12
误差: 21%
使用随机照明和随机二面角的组合:
aug_tfms = [RandomLighting(b=0.25,c=0.15)] + [RandomDihedral()]
**增强看起来像什么:**随机照明和随机二面角的组合
精确标签: 52
准确率: 63%
标签不准确: 13
误差: 25%
结合使用 RandomDihedral 和 RandomRotate:
aug_tfms = [RandomDihedral()] + [RandomRotate(27)]
**增强看起来像什么:**随机二面角和随机旋转 27 度角的组合
精确标签: 56
准确率: 68%
标签不准确: 13
误差: 23%
使用 RandomZoomRotate:
aug_tfms = [RandomRotateZoom(deg=45, zoom=2, stretch=1)]
**增强看起来像什么:**接受 3 个参数 deg =最大旋转角度, zoom =最大缩放比例, stretch =最大拉伸比例
准确的标签: 62
准确率: 76%
标签不准确: 8
误差: 13%
使用填充:
aug_tfms = [AddPadding(pad=50, mode=cv2.BORDER_CONSTANT)]
增强看起来像什么:接受 2 个参数= 填充 =顶部、底部、左侧和右侧的填充大小和模式= cv2 填充模式的类型(常量、反射、换行、
复制)。
精确标签: 54
准确率: 66%
标签不准确: 2
误差: 4%
使用剪切块(椒盐效果):
aug_tfms = [Cutout(n_holes=200, length=7.5, tfm_y=TfmType.NO)]
**增强看起来像什么:**接受两个参数 n_holes 和 length ,它在一幅图像中的任意位置切出 n_holes 个大小长度的正方形孔。这些孔可以重叠。
精确标签: 41
准确率: 50%
标签不准确: 9
误差: 22%
总结思路:
[RandomRotateZoom]和[AddPadding]的组合产生了最有利的结果;70%的准确率和 10%的误差,只需要 10 次训练。在 20 个时期,准确度跃升至 82%,误差降至 6%。
毫无疑问,数据扩充有助于提高准确性,在减少误差方面同样重要。结果表明,并不是所有的增强都会产生有利的结果,因此最初尝试不同的数据增强有助于缩小哪种增强技术最适合您的数据集。
为什么 RandomZoomRotate 产生最准确标签的可能假设
提高分类精度需要用一个对象的所有自然变化的许多实例来训练模型。自然变化的三个主要来源是位置、视点和对象的大小[ 1 ]。
为了表现图像的所有视觉细节,它应该具有足够高的分辨率来容纳细节的表现。
RandomZoomRotate 允许放大以 2 的比例随机放大,以 1 的比例拉伸,并以 45 度的角度旋转,从而产生不同的变化。这允许模型从不同的图像视角学习,从而产生更准确的标签。
如果你有兴趣阅读更多关于人工智能和医疗保健的文章,这里是我的其他文章。感谢阅读!
[## 使用 Fastai 的数据增强
有 5 个步骤来避免过度拟合;获取更多数据、数据扩充、使用通用架构…
becominghuman.ai](https://becominghuman.ai/data-augmentation-using-fastai-aefa88ca03f1) [## 3 行代码!破译 Fast.ai
在我看来,上面列出的三行代码彻底改变了我对如何获得最新技术的理解…
becominghuman.ai](https://becominghuman.ai/3-lines-of-code-deciphering-fast-ai-658e79151af8) [## 不是典型的健康 IT 公司
“如果你总是做你一直做的事情,你就会一直得到你一直得到的东西。”—亨利·福特
becominghuman.ai](https://becominghuman.ai/not-your-typical-health-it-company-92149b04dfae)
文本数据的数据扩充:更快地获得更多数据
原文:https://towardsdatascience.com/data-augmentation-for-text-data-obtain-more-data-faster-525f7957acc9?source=collection_archive---------11-----------------------
source
简介
所有大多数关于使用监督学习算法进行文本分类的教程都是从预先标记的数据开始的。很少提到的是如何处理情感分析/文本分类中不那么迷人但非常关键的部分,即收集文本的标记。它没有那么迷人,因为要训练一个受监督的模型,你需要向它展示带标签的文本。你如何或从哪里得到标签数据?获得标记数据的一个选择是通过手动阅读每个文本来注释您需要的所有数据,并将其分类为负面或正面。另一种选择是将标签外包给自由职业者或致力于数据标签的公司。这两种选择在时间和金钱上都是昂贵的。在本文中,我们将研究如何在内部使用数据扩充的概念来加速标注任务。对文本数据使用数据增强的灵感来自埃米利奥·拉皮耶洛的博客文章。
数据增强的定义
数据扩充是一种通常用于为图像分类任务增加图像数据集大小的技术。它包括通过变换(旋转、平移或/和缩放,添加一些噪声)数据集中的图像来创建新的图像。然而,当应用数据扩充时,文本数据的等效变换是将要扩充成句子的文档/文本的记号化,将这些句子混洗并重新组合它们以生成新的文本。
为了在文本上测试数据扩充,我们在 OpinRank 数据集上应用了它,但它可以用于任何其他数据,其中:
- 其中一个类别比其他类别更普遍。比如你在主要来源中正面例子的比例是 0.8,负面例子的比例是 0.2,换句话说,比负面更容易得到正面的评论。我使用 main source 来引用数据存储文件,如。csv,。txt,数据库等。
- 而且,算法要分类的评论或文本通常足够长,比如说大约 10 个句子,如下所示:
“Clean hotel with certain charm. Good location and value. A mid-sized modern hotel with facade that’s been themed after bamboos, Kapok is within walkable (~15 min) distance from Subway line 1 Tiananmen East station, Wangfujing station, and line 5 Dengshikou station. Situated near Donhuamen (East gate) of the Forbidden Palace and Wangfujing, it’s location-wise competitive and can cost a whole lot less than the larger hotels that are even closer to Subway stations.The hotel is built and furnished with certain design elements that separate it from the run-of-the-mill chains; its interior has glass walls that give a sense of space while in corridors, there are sprinklings of mini-gardens, and the glass-walled bathrooms have rather stylish fixtures. All in all they make for an interesting experience, though not always comfortable (bathrooms could’ve been designed with more human ergonomics in mind). Rooms are generally clean, except for some mildew on the silicons at shower space. There are also a couple of convenience stores to each side of the hotel for stocking up on water and snacks (one near the Donghuamen-Nanchizi junction, and one near the Donganmen-Wangfujing junction).In conclusion, we think this hotel offers a very competitive combination of good location, clean accommodation, nearby nightlife, and attractive price. We do recommend this hotel. “
How much data required before applying Augmentation?
The main purpose of using Data Augmentation for text data in this article,as the title states,is to obtain more data faster. So the way we set the foundation for Data Augmentation on text data is by first manually labeling at least 1000 examples of the frequent occurring class and a few hundreds of the lesser common classes. Next, by reading each of labelled text we use NLTK sent_tokenize and Python’s shuffle method from the random module to generate the new texts. 10 different reviews were created from each old review. The difference in the generated texts is based on the changed position of the sentences. As Emilio Lapiello stated in his post, shuffling works as long as the context of the text is maintained. With sentence tokenization,the sentiment conveyed in the original text is still maintained. It would be lost if reviews were tokenized into words and then shuffled. Actually, although the meaning of a text may be lost due to words shuffling, it would not be an issue because feature extraction does consider order of words in a text.
Wouldn’t just tokenizing a text into sentences and then shuffling lead to over-fitting? You may ask. That’s possible to some extend. Over-fitting can occur when there is a high variance in the sentiment vocabulary used in different reviews. The two reasons why over-fitting is less likely to occur as a result of augmentation used are:
- 根据从用于增强的 202 个负面情绪示例中观察到的情况,词汇,或者更确切地说是同义词,似乎并没有从如下短语转移太多:
- 糟糕的服务
- 我们不推荐这家酒店
- 肮脏的房间,
- 令人不快的/无用的员工等
看不见的数据很可能与算法训练的数据相似,因此模型应该能够识别它,从而正确地对它进行分类。
使用 OpenRink 数据,我们人工标记了 2004 条正面评论和 202 条负面评论。
下表描述了在对原始数据应用数据扩充之前和之后,分别对 14 个和 6 个正面和负面评论的样本外数据的模型性能。
Metric used: F Score
你可以在这里找到文章使用的代码。
表中的第二列显示,我们显然需要更多的数据来提高性能(尤其是负面评价)。为了避免手动标记更多的数据,我们在负面评论上应用了增强,并将它们增加到 2051。
虽然应用数据增强后的分类准确率仍在 90%以下,但已大幅提升。手动标注更多的评论,以添加到 2004 年和 208 年,然后应用增强应该会增加准确性。
注意:
- TfidfVectorizer 特征提取器比 CountVectorizer 具有更高的精度
- 确保从一个评论生成的评论是不同的(句子在不同的位置),以避免重复..
结论
虽然数据扩充通常用于图像数据,但它也可用于文本数据,以更快地获得更多标记数据。
参考文献:
OpinRank 数据集
数据清理 101
原文:https://towardsdatascience.com/data-cleaning-101-948d22a92e4?source=collection_archive---------1-----------------------
早在 12 月份,我就宣布我将离开劳联-产联,去参加大会学习。我的领导要求我做几件事:我写的几个脚本的文档,创建一个包含我所有重要文件的文件夹,将管理员凭据转移给其他员工,等等。我唯一不能给他们的是如何有效清理数据的指南。
在我的上一份工作中,数据清理是一项非常重要的技能,因为我们会从各种政府机构和客户 IT 商店获取数据。我总是愿意花更多的时间来确保数据是干净的,而不是与客户进行困难的(但在使用建模的大数据环境中是不可避免的)对话,以了解为什么某些记录会丢失。
我给我的前雇主这个指南的困难是你的方法取决于你拥有的数据和你的最终目标。尽管困难重重,但这是我对如何清理数据的指导方针的最好尝试。
你现在看到的有意义吗?
看一下数据。如果这是一个大型数据集,看一看前 20 行、后 20 行和一个 20 行随机样本。下面是你应该问自己的问题,用项目符号表示。相应的示例用双星号**表示。
- 我看到的有意义吗?
- 数据与列标签匹配吗?
**姓名栏中是否有姓名,地址栏中是否有地址,电话号码栏中是否有电话号码?还是各列有不同的数据?
- 数据是否遵守其领域的适当规则?
**一个名字中的字符是只有字母(Brendan)还是有数字在里面(B4rendan)?
**电话号码的数字部分是 10 位数字(5558675309)还是不是(675309)?
- 计算数字数据的汇总统计数据。它们有意义吗?
**如果你处理的是经过的时间数据,最小值是负数(- 10 秒)?
**如果你在处理蓝领工人的年度工资数据,最大值(100 万美元)是否有些奇怪?
- 看看有多少值是 nulls?空值的数量可以接受吗?哪里有空值,有什么模式吗?
- 有重复的吗,可以吗?
如果您有足够的信息,请更正数值
一旦你对数据的问题进行了评估,就要考虑你想如何修正它。一些修正可能是显而易见的。如果 name 列的值是 B4rendan,则该值很可能是 Brendan。
然而,有些修正可能并不明显。假设你有一个超过 50 万人的数据集,其中一个人的名字是梅尔特。你可能会认为这是一个错别字,实际上应该说伯特。如果您事先知道这是一个错误(即您知道记录属于谁),您可以进行更改。但是,除非你对自己的假设有足够的信心,否则你可能不应该修改,否则你可能会造成一个错别字,而不是纠正一个。
试着看看数据问题中是否有逻辑,并对其进行更正。比方说,如果您的系统只接受仅包含数字字符的电话号码,但您的数据集包含格式为 so (555)867-5309 的电话号码,您可以使用 Excel/Python 对所有括号和破折号进行查找和替换。
如果可以,使用相同的逻辑为空数值填充数据。但是,如果没有条件逻辑,您可以通过其他方式填写数据。一种常见的方法是使用列的平均值或中值来填充空值,这很容易,但可能会影响该列中数据的分布。还有更复杂但在统计学上有效的方法来填充数据,比如老鼠。您还应该考虑创建一个元数据列,指示哪些值是估算的,哪些值是有机的。不管使用何种统计方法,如果某一列有大量缺失数据,最好在分析中放弃使用它。
使用有意义的工具
思考实现目标所需的工具可以节省你重复这个过程的时间。每种工具都有利弊,下面是我的经验法则:
何时可以使用 Excel:
- 你只有不到一百万条记录
- 你需要轻松快捷地完成这项工作
- 清理数据有一个逻辑模式,使用 Excel 函数清理很容易
- 清理数据的逻辑模式很难定义,您需要手动清理数据
当您可能使用 Python 或其他脚本语言时:
- 你需要记录你的过程
- 你打算重复做这项工作
- 清理数据有一个逻辑模式,但是很难用 Excel 函数实现
这也取决于你更喜欢哪种工具。当我开始学习编程时,当我需要清理数据时,我非常依赖 Excel。当我开始处理更大的数据集并且必须将我的过程常规化时,我转向了 Python。
与源头沟通
有一次,当我度假回来时,我的同事们对来自马里兰州选举委员会的一个数据集有疑问。他们需要数据集中每条记录的县,但州政府只给了我们每个县的代码,而且他们与 FIPS 人口普查局的代码不匹配。所以我打电话给产生该数据集的政府机构,结果发现代码是按字母顺序排列的县。阿勒格尼是 01,安妮·阿伦德尔是 02,巴尔的摩市(独立城市)是 03,以此类推。
不要害怕拿起电话或发电子邮件给数据的来源。如果您是数据源的客户,尤其如此,因为您有权获得清晰的信息。从长远来看,这种交流可以减少很多心痛。
这是我清理数据的方法,但绝对不是唯一的方法。我鼓励任何人在评论区张贴他们清理数据的技巧和诀窍。
用 Python 和 Pandas 清理数据:检测缺失值
原文:https://towardsdatascience.com/data-cleaning-with-python-and-pandas-detecting-missing-values-3e9c6ebcf78b?source=collection_archive---------0-----------------------
数据清理 可能是一项繁琐的任务。
这是一个新项目的开始,你很高兴应用一些机器学习模型。
你看了一下数据,很快意识到这是一个绝对混乱的局面。
根据 IBM Data Analytics的数据分析,你可以预计花费高达 80%的时间清理数据。
在这篇文章中,我们将使用 Python 的 Pandas 库完成许多不同的数据清理任务。具体来说,我们将关注可能是最大的数据清理任务,缺失值。
看完这篇帖子你将能够更多 快速清理数据 。我们都希望花更少的时间清理数据,花更多的时间探索和建模。
缺失值的来源
在深入研究代码之前,理解缺失数据的来源很重要。以下是数据丢失的一些典型原因:
- 用户忘记填写字段。
- 从旧数据库手动传输时数据丢失。
- 有一个编程错误。
- 用户选择不填写与他们如何使用或解释结果的信念相关的字段。
如你所见,其中一些来源只是简单的随机错误。其他时候,数据丢失可能有更深层次的原因。
从统计学的角度来理解这些不同类型的缺失数据是很重要的。缺失数据的类型将影响您处理缺失值的方式。
今天我们将学习如何检测缺失值,并做一些基本的插补。关于处理缺失数据的详细统计方法,请查看数据科学家 Matt Brems 的这些精彩幻灯片。
请记住,使用中间值或平均值进行估算通常不是一个好主意,因此请务必查看 Matt 的幻灯片,了解正确的方法。
入门指南
在开始清理数据集之前,最好先对数据有一个大致的了解。之后,您可以制定一个计划来清理数据。
我喜欢先问以下问题:
- 有什么特点?
- 期望的类型是什么(int,float,string,boolean)?
- 是否存在明显缺失的数据(熊猫可以检测到的数值)?
- 有没有其他类型的缺失数据不那么明显(用熊猫不容易检测出来)?
为了说明我的意思,让我们从这个例子开始。
我们将要处理的数据是一个非常小的房地产数据集。前往我们的 github 页面获取一份 csv 文件,这样您就可以一起编码了。
让我们快速浏览一下数据:
这是一个比您通常使用的数据集小得多的数据集。尽管它是一个小数据集,但它突出了许多您将会遇到的真实世界的情况。
快速感受数据的一个好方法是查看前几行。在熊猫身上,你可以这样做:
# Importing libraries
import pandas as pd
import numpy as np
# Read csv file into a pandas dataframe
df = pd.read_csv("property data.csv")
# Take a look at the first few rows
print df.head()Out:
ST_NUM ST_NAME OWN_OCCUPIED NUM_BEDROOMS
0 104.0 PUTNAM Y 3.0
1 197.0 LEXINGTON N 3.0
2 NaN LEXINGTON N 3.0
3 201.0 BERKELEY NaN 1.0
4 203.0 BERKELEY Y 3.0
我知道我说过我们将与熊猫合作,但你可以看到我也进口了 Numpy。稍后我们将使用它来重命名一些丢失的值,所以我们最好现在就导入它。
导入库后,我们将 csv 文件读入 Pandas 数据帧。你可以把数据框想象成一个电子表格。
使用.head()
方法,我们可以很容易地看到前几行。
现在可以回答我原来的问题了,**我的特点是什么?**很容易从列名中推断出以下特性:
ST_NUM
:街道号ST_NAME
:街道名称OWN_OCCUPIED
:住宅主人有人吗NUM_BEDROOMS
:卧室数量
我们也可以回答,预期类型有哪些?
ST_NUM
: float 或 int…某种数字类型ST_NAME
:字符串OWN_OCCUPIED
:字符串… Y(“是”)或 N(“否”)NUM_BEDROOMS
: float 或 int,一种数值类型
为了回答接下来的两个问题,我们需要开始得到更多深度宽度的熊猫。让我们开始看看如何检测缺失值的例子
标准缺失值
那么我说的“标准缺失值”是什么意思呢?这些都是熊猫可以察觉到的缺失值。
回到我们的原始数据集,让我们看看“街道号”列。
第三行有一个空单元格。在第七行有一个“NA”值。
显然,这两个都是缺失的值。让我们看看熊猫如何处理这些。
# Looking at the ST_NUM column
print df['ST_NUM']
print df['ST_NUM'].isnull()Out:
0 104.0
1 197.0
2 NaN
3 201.0
4 203.0
5 207.0
6 NaN
7 213.0
8 215.0
Out:
0 False
1 False
2 True
3 False
4 False
5 False
6 True
7 False
8 False
看一看这一栏,我们可以看到熊猫在空白处填上了" NA"。使用isnull()
方法,我们可以确认缺失值和“NA”都被识别为缺失值。两个布尔响应都是True
。
这是一个简单的例子,但突出了重要的一点。熊猫会将空单元格和“NA”类型识别为缺失值。在下一节,我们将看看一些熊猫不认识的种类。
非标准缺失值
有时可能会有不同格式的缺失值。
让我们看看“卧室数量”一栏,看看我的意思。
在这一列中,有四个值缺失。
- 不适用的
- 钠
- —
- 钠
从上一节中,我们知道熊猫会将“NA”识别为缺失值,但是其他值呢?让我们来看看。
# Looking at the NUM_BEDROOMS column
print df['NUM_BEDROOMS']
print df['NUM_BEDROOMS'].isnull()Out:
0 3
1 3
2 n/a
3 1
4 3
5 NaN
6 2
7 --
8 na
Out:
0 False
1 False
2 False
3 False
4 False
5 True
6 False
7 False
8 False
就像以前一样,熊猫认为“那”是一个缺失的值。不幸的是,其他类型没有被识别。
如果有多个用户手动输入数据,那么这是一个常见的问题。可能我喜欢用“n/a”而你喜欢用“na”。
检测这些不同格式的一个简单方法是将它们放在一个列表中。然后当我们导入数据时,熊猫会马上认出它们。这里有一个我们如何做到这一点的例子。
# Making a list of missing value types
missing_values = ["n/a", "na", "--"]
df = pd.read_csv("property data.csv", na_values = missing_values)
现在让我们再看看这个专栏,看看会发生什么。
# Looking at the NUM_BEDROOMS column
print df['NUM_BEDROOMS']
print df['NUM_BEDROOMS'].isnull()Out:
0 3.0
1 3.0
2 NaN
3 1.0
4 3.0
5 NaN
6 2.0
7 NaN
8 NaN
Out:
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 True
8 True
这一次,所有不同的格式都被识别为缺失值。
你可能不能马上抓住所有这些。当您处理数据并看到其他类型的缺失值时,您可以将它们添加到列表中。
为了汇总和转换缺失值,识别这些非标准类型的缺失值非常重要。如果在转换这些非标准类型之前尝试计算缺失值的数量,最终可能会缺失很多缺失值。
在下一节中,我们将研究一种更复杂但非常常见的缺失值类型。
意外缺少值
到目前为止,我们已经看到了标准缺失值和非标准缺失值。如果我们有意想不到的类型呢?
例如,如果我们的特征应该是一个字符串,但是有一个数字类型,那么从技术上讲这也是一个缺失值。
让我们看看“业主占用”一栏,看看我在说什么。
从前面的例子中,我们知道 Pandas 会将第七行中的空单元格检测为缺失值。让我们用一些代码来确认。
# Looking at the OWN_OCCUPIED column
print df['OWN_OCCUPIED']
print df['OWN_OCCUPIED'].isnull()# Looking at the ST_NUM column
Out:
0 Y
1 N
2 N
3 12
4 Y
5 Y
6 NaN
7 Y
8 Y
Out:
0 False
1 False
2 False
3 False
4 False
5 False
6 True
7 False
8 False
在第四排,有数字 12。Owner Occupied 的响应显然应该是一个字符串(Y 或 N),因此该数值类型应该是一个缺失值。
这个例子有点复杂,所以我们需要考虑一个策略来检测这些类型的缺失值。有许多不同的方法,但我打算用这种方法来解决这个问题。
- 遍历 OWN _ OCCUPIED 列
- 尝试将条目转换为整数
- 如果条目可以更改为整数,请输入缺失值
- 如果数字不能是整数,我们知道它是一个字符串,所以继续
让我们先看一下代码,然后我们将详细讨论它。
# Detecting numbers
cnt=0
for row in df['OWN_OCCUPIED']:
try:
int(row)
df.loc[cnt, 'OWN_OCCUPIED']=np.nan
except ValueError:
pass
cnt+=1
在代码中,我们遍历“Owner Occupied”列中的每个条目。为了尝试将条目更改为整数,我们使用了int(row)
。
如果该值可以更改为整数,我们使用 Numpy 的np.nan
将条目更改为缺失值。
另一方面,如果它不能变成一个整数,我们就pass
而继续下去。
你会注意到我用了try
和except ValueError
。这被称为异常处理,我们用它来处理错误。
如果我们试图将一个条目改变成一个整数,但它不能被改变,那么将返回一个ValueError
,代码将停止。为了解决这个问题,我们使用异常处理来识别这些错误,并继续下去。
代码的另一个重要部分是.loc
方法。这是就地修改条目的首选 Pandas 方法。关于这方面的更多信息,你可以查看熊猫文档。
既然我们已经学习了检测缺失值的不同方法,我们将看看汇总和替换它们。
汇总缺失值
在我们清理了丢失的值之后,我们可能想要对它们进行总结。例如,我们可能想要查看每个特性的缺失值的总数。
# Total missing values for each feature
print df.isnull().sum()Out:
ST_NUM 2
ST_NAME 0
OWN_OCCUPIED 2
NUM_BEDROOMS 4
其他时候,我们可能想做一个快速检查,看看我们是否有任何丢失的值。
# Any missing values?
print df.isnull().values.any()Out:
True
我们可能还想得到缺失值的总数。
# Total number of missing values
print df.isnull().sum().sum()Out:
8
现在我们已经总结了缺失值的数量,让我们来看看做一些简单的替换。
取代
通常情况下,您必须考虑如何处理丢失的值。
有时你只是想删除那些行,有时你会替换它们。
正如我前面提到的,这不应该被轻视。我们将回顾一些基本的插补,但对于处理缺失数据的详细统计方法,请查看来自数据科学家 Matt Brems 的这些精彩幻灯片。
也就是说,也许您只想用单个值来填充缺失的值。
# Replace missing values with a number
df['ST_NUM'].fillna(125, inplace=True)
更有可能的是,您可能想要进行基于位置的插补。下面是你应该怎么做。
# Location based replacement
df.loc[2,'ST_NUM'] = 125
替换缺失值的一种非常常见的方法是使用中位数。
# Replace using median
median = df['NUM_BEDROOMS'].median()
df['NUM_BEDROOMS'].fillna(median, inplace=True)
我们已经讨论了一些替换缺失值的简单方法,但是请务必查看 Matt 的幻灯片,以了解正确的技术。
结论
处理杂乱的数据是不可避免的。数据清理只是数据科学项目流程的一部分。
在本文中,我们讨论了一些检测、总结和替换缺失值的方法。
要获得更多关于数据清理的资源,请查阅这些数据科学书籍。
有了这些技术,您将花更少的时间清理数据,花更多的时间探索和建模。
数据有不同的形状和大小
原文:https://towardsdatascience.com/data-comes-in-different-shapes-and-sizes-ac5b411456c4?source=collection_archive---------2-----------------------
让我们来谈谈表格、树和图形
表格 —数据的表格化表示,可能是最古老的数据存储方式。也是最简单的。我们定义了行和列,其中一列代表一个属性,一行代表一个由属性组合而成的条目。
CSV 是表格数据的简单表示。下面你可以看到一个代表我最亲近的家人的 CSV:
Maxim,June 12,Berlin
Efim,November 24,Essen
Margarita,August 20,Bochum
Issai,May 9,Bochum
每行代表一个家庭成员,家庭成员由以下属性表示:
- 名字
- 生日
- 城市
这些属性很好地代表了一个人,但是它们没有说明这些人之间的关系。如果我们添加另外三个属性来建立它们之间的关系会怎么样:
- 父亲
- 母亲
- 同科
在这种情况下,CSV 可能如下所示:
Maxim,June 12,Berlin,3,2,1
Efim,November 24,Essen,3,2,0
Margarita,August 20,Bochum,,,
Issai,May 9,Bochum,,,
这些关系被描述为行的索引(索引从 0 开始)。
所以马克西姆的父亲是伊萨伊,马克西姆的母亲是玛格丽塔,马克西姆的兄弟姐妹是埃菲姆。在第二行,我们看到 Maxim 是 Efims 的兄弟姐妹(这并不奇怪),他们有相同的父母。Margarita 和 Issai 没有提到父亲、母亲和兄弟姐妹,不是因为他们没有,而是因为这些人没有列在这个数据集中。
如果马克西姆有多个兄弟姐妹会怎么样?
在 CSV 和一般表格数据表示的情况下,这是非常不幸的。然而,我们有两个选择:
- 为值数组创建自定义语法。例如,使用
+
字符分隔多个行索引1+10+12
。 - 有第二个表,表示关系的邻接矩阵。对于 CSV 格式,每个文件只能有一个表,所以我们需要创建另一个文件。
我们了解到,表格数据表示适用于一对一和多对一的关系,但是如果我们需要一对多的关系,就会变得棘手。
树呢?
树中的节点(如果它不是叶子)与其子节点有一对多的关系。让我们试着用 XML 来表示相同的数据:
<person name="Maxim" birthday="June 12" city="Berlin">
<father>
<person name="Issai" birthday="May 9" city="Bochum"/>
</father>
<mother>
<person name="Margarita" birthday="August 20" city="Bochum"/>
</mother>
<siblings>
<person name="Efim" birthday="November 24" city="Essen">
<!-- 😔 we have to repeat father and mother now -->
<father>
<person name="Issai" birthday="May 9" city="Bochum"/>
</father>
<mother>
<person name="Margarita" birthday="August 20" city="Bochum"/>
</mother>
<siblings>
<!-- 😨 OMG we have a cycle, abort!!! -->
</siblings>
</person>
</siblings>
</person>
一棵树必须有一个根元素。在我们的第一次尝试中,我们改变了数据集的语义,并决定将其表示为 Maxim 的“家谱”。然而,这也强调了我们的数据对于这种表示来说太复杂了。当我们添加 Efim 作为兄弟姐妹时,我们必须复制 Issai 和 Margarita。然后我们意识到 Efim 和 Maxim 建立了一个参考循环。这使得纯粹的层次化表示成为不可能。
好,让我们尝试使用带有显式引用的 XML:
<people>
<person id="0" name="Maxim" birthday="June 12" city="Berlin">
<father ref="3"/>
<mother ref="2"/>
<sibling ref="1">
<!-- could have another sibling tag here
<sibling ref="123">
-->
</person>
<person id="1" name="Efim" birthday="November 24" city="Essen">
<father ref="3"/>
<mother ref="2"/>
<sibling ref="0">
</person>
<person id="2" name="Margarita" birthday="August 20" city="Bochum"/>
<person id="3" name="Issai" birthday="May 9" city="Bochum"/>
</people>
现在我们可以在一个person
节点中拥有多个sibling
节点。然而,与 CSV 相比,我们有一个小缺点。CSV 中的引用是行的索引。在 XML 中,一个节点可能会根据解析器和 XML producer 的实现来改变它的索引,因此有必要在每个 person 节点上有一个显式的id
属性,在father
mother
sibling
节点上有一个ref
属性,它们反映了 person 的 id。当我们写数据时,这不是一个很大的不便,但当我们读数据时,这是一个更大的不便。为了遵循参考,用户将不得不建立某种类型的查找表,其中可以通过id
找到一个人。
JSON 能帮我们解决这个问题吗?
JSON 也是一个树形结构,但是如果 XML 是非常同构的——我们只能通过元素和内容来描述数据。JSON 是异构的——我们有数组、对象、字符串、数字、布尔文字和null
供我们使用。在 JSON 中,我们可以如下表示相同的数据集:
[
{
"name":"Maxim",
"birthday":"June 12",
"city":"Berlin",
"father":3,
"mother":2,
"siblings":[1]
},{
"name":"Efim",
"birthday":"November 24",
"city":"Essen",
"father":3,
"mother":2,
"siblings":[0]
},{
"name":"Margarita",
"birthday":"August 20",
"city":"Bochum"
},{
"name":"Issai",
"birthday":"May 9",
"city":"Bochum"
}
]
我们说根元素是一个数组。它有三个子对象,其中siblings
property 是一个人员索引数组。数组中的元素有一个稳定的索引,所以我们不需要显式的id
属性。我们还避免构建显式的查找表,因为数组可以通过索引来访问。
有些事我们还没谈过。
CSV、XML 和 JSON 都是基于文本的格式。为了处理数据集并遵循引用,我们需要解析数据集并将其转换成某种内存模型。如果我们有一个大的数据集,这可能会变得非常不方便。
文本与二进制
当我们从文本表示切换到二进制表示时,我们可以选择/构建一种允许随机值访问的格式。在这种情况下,引用可以由我们所引用条目的偏移量来表示。
偏移量可以是绝对的,也可以是相对的。绝对偏移量对于读、写和验证操作来说更简单。一个相对偏移量,可以帮助你减少二进制文件的大小,用户可以将多个缓冲区合并到一个文件中。如果你有兴趣,可以看看下面这篇文章:flatbufferswift是如何解决这种技术的:
[## 使用 JSON 时,性能并不是唯一损失的东西
这个来自 RSAnimate 的短片告诉我们,我不可能在 100 篇文章中做到这一点。
medium.com](https://medium.com/@icex33/performance-is-not-the-only-thing-you-lose-while-using-json-d7fc788c3056)
感谢您抽出宝贵的时间,如果您喜欢这篇文章,请鼓掌。
良好的数据和机器学习
原文:https://towardsdatascience.com/data-correlation-can-make-or-break-your-machine-learning-project-82ee11039cc9?source=collection_archive---------0-----------------------
深度学习已经成为一种锤子,可以钉死几乎任何机器学习(ML)问题。
深度学习正在解决许多其他大多数 ML 算法无法解决的问题。但是很多 ML 领域的人认为,只要你把足够多的层和神经元叠加起来,它就能解决任何问题。
出于几个原因,这样想很容易。像 Keras 和 TensorFlow 这样的框架很容易获得。亚马逊 AWS 和 GCP 提供廉价的计算能力。ML 社区是非常开放和支持的。
如今,任何人都可以参加一些在线课程或阅读一些论文。然后,他们可以创建一个卷积神经网络(CNN)来识别手写数字。然后自称为 ML 工程师。
甚至我也犯了同样的错误,而且我用很少的钱和一台不到 500 美元的笔记本电脑做到了这一点。
但是人们忘记了机器学习最重要的两个部分:数学和数据。
毕竟,机器学习是数据驱动的人工智能,你的模型只会像你拥有的数据一样好或一样坏。
一般来说,你不能有一个汽车图像的数据集,并期望用它来分类猫和狗。不能使用线性回归在没有线性相关性的数据集上训练模型。
在本文中,我将重点介绍数据和数据相关性。您的数据应该驱动您选择 ML 算法。你的选择不应该取决于一个算法有多先进,而是取决于你的数据集。
那么数据有多重要呢?
数据的重要性怎么强调都不为过。这里有一个例子。
能源分解使用 ML 来查找您家中可能有的电气设备的类型。它使用仪表数据、天气、位置等特征。
当我在做这个项目的时候,我的神经网络不能预测电气设备。无论我建立了一个多宽多深的网络,我都很难获得 55%以上的准确率。
我花了很长时间才意识到这不是我的模型的问题,而是我的数据的问题。
为了做这个项目,我使用了我在互联网上找到的数据集。这些数据既没有正确标注,也不是好数据。有一些非常不稳定的功率值与同时期的天气数据不一致。
所有这一切意味着,无论我的模型有多好,它都不可能完成它的工作,因为数据本身就是坏的!
什么是好数据?
很难回答这样的问题。我学会了不使用数据,除非它来自一个可证实的来源。
一个可验证的来源可以是像 Kaggle 或 KDNuggets 这样的开放数据源。此外,来自一个公司或国家的开源数据集。你也可以使用研究人员在工作中使用过的数据集。
有时获得正确的数据可能是项目中最困难的部分。如果你正在尝试做一些新的事情,这一点尤其正确。
对于我的大多数 ML 项目,我必须从博士学者和研究人员那里获得数据。不要犹豫向专家要数据!
即使有了验证过的数据,还是要检验一下好不好。可视化在这方面很方便。
可视化和数据
数据可视化让您看到数据的样子。您可以查看特征是否与输出相对应。它还可以帮助您找到您所拥有的数据相关性。
像 NumPy,Pandas 和 Matplotlib 这样的软件包非常适合可视化。
例如,下图显示了两个家庭在 24 小时内的用电量。
第一幅图中曲线的上升和下降显示了早晚用电量的增加。您还可以看到夜间用电量减少。
Image 1: A good Electricity Power Consumption Graph
第二幅图像具有不稳定的曲线和“嘈杂的”或不规则的数据。
Image 2: Irregular Electricity Power Consumption Data
如果我在训练一个模型来预测用电量,我会使用第一张图片的数据。
数据可视化有助于您了解您使用的数据是否有助于您的目的。
数据关联
在这篇文章的前面,我提到过你不能使用线性回归来建模一个非线性数据集。
反之亦然。如果你有一个线性相关的数据集,你需要一个简单的模型,如线性回归。再好的 CNN 也会给你一个很差的结果。
数据关联是一组数据可能对应于另一组数据的方式。在 ML 中,考虑您的要素如何与您的输出相对应。
例如,下图显示了大脑大小与身体大小的数据集。请注意,随着身体尺寸的增加,大脑尺寸也在增加。这就是所谓的线性相关。在线性相关的简单定义中,数据遵循一条直线。
Brain Weight Vs. Body Weight
并非所有数据都是线性相关的。下图显示了冰淇淋销售额与温度的关系曲线。它有一个倒 U 形图。为什么?
这可能意味着如果天气够热,人们可能不想离开家去买冰淇淋。或者有其他原因。所以使用线性回归对这个数据集没有意义。
Ice Cream Sales vs. Temperature
如果有两个以上的特征,就很难弄清楚数据是如何关联的。数据可视化有助于发现各个要素如何与输出相关联。
过滤数据
并非所有数据都与您的项目相关。
一个很好的例子就是卡格尔泰坦尼克号比赛。Kaggle 是一个由各级数据科学家组成的在线社区。他们举办持续的比赛,以帮助学习和实践数据科学。
在卡格尔泰坦尼克号比赛中,你被要求分析哪些人可能幸存。这个挑战有很多特点。您还可以通过组合现有的功能来创建许多功能。
你可以看到性别与生存的相关性,以及年龄与生存的相关性。从这些图像中可以明显看出,性别和年龄在决定谁可能在泰坦尼克号上幸存的过程中扮演了非常重要的角色。
可视化也可以帮助你过滤掉无用的特征。例如,登船港口和生存之间没有关联。在这种情况下,我们不考虑它。
开始计算
观想是伟大的。但是,如果你是一个更喜欢看数字和统计数据的人,那么有其他方法可以找出数据之间的关系。
皮尔逊相关系数帮助你找出两个量之间的关系。它给出了两个变量之间关联强度的度量。皮尔逊相关系数的值可以在-1 到+1 之间。
1 表示它们高度相关,0 表示不相关。-1 表示负相关。就当是反比例吧。
t 检验是对两个值之间的相关性进行的相关系数检验。
其他流行的相关系数包括
- 斯皮尔曼等级顺序相关
- 皮尔逊等级相关。
所有这些系数都有优点和缺点。知道何时使用它们很重要。
注意,如果你有一个大的数据集,如果你得到一个小的系数,比如说 0.4,那么它不一定是坏的。数据集可能具有很大的统计显著相关性。
还要注意,相关性可能并不意味着因果关系。
因为两个变量相关,并不意味着一个直接导致了另一个。
泰坦尼克号上的人没有死,因为他们是 28 岁的男性。更确切地说,他们中的许多人死亡是因为官员们“首先拯救妇女和儿童”。
当数据集包含许多要素时,数据相关性的重要性会产生影响。人们很容易认为,更多的特征将有助于模型做出更好的预测。但这是不正确的。
如果您尝试在一组没有相关性或相关性很小的特征上训练模型,将会得到不准确的结果。
在 MNIST 手写数字的人的年龄可能是一个特征。但这无助于做出更好的预测。
处理多维数据集时,过滤掉不相关的要素非常重要。相反,最好使用较少的高度相关的特征来训练模型。
具有更多要素或更高维度的数据集是一个新问题。如今,数据收集和存储从未如此简单。通常,许多数据集的要素具有相似的信息。这在系统中起到了噪声的作用,并增加了复杂性。
一些特征也几乎没有变化。如果您的输出有很大的方差,那么您认为方差较小的要素会改善您的模型吗?不要!为了计算出数据集中每个特征的重要性,我们使用等级相关。
秩相关
等级相关是一种比较哪些特征与输出相关的技术。
最大似然法中一种流行的等级相关方法是主成分分析。这是一种在高维数据中寻找模式的技术。基本上,它“将高维数据简化为低维数据。”你可以在这里阅读更多相关信息。
随着维度的减少,数据可视化也变得更加容易。
寻找数据相关性的其他强大工具是随机森林和决策树。他们通过找出每个特性的统计用法来工作。这使得找出最重要的特性变得更加容易。
怎么搞清楚用哪个算法?
数据关联和可视化可以帮助你决定使用哪种 ML 算法。
再看一下大脑与身体大小的数据。神经网络和线性回归都能够拟合该数据。但是,与神经网络相比,线性回归计算成本更低,训练速度更快。
如果您的数据没有线性相关性,您可以考虑使用多项式回归、支持向量机或随机森林。
但是,在大型数据集上,训练这些神经网络在计算上可能比训练小型神经网络更昂贵。
当处理图像识别问题时,使用卷积神经网络(CNN)总是更好。但是,NLP 和时间序列问题可以通过递归神经网络和 LSTMs(长短期记忆)更好地建模。
选择算法也要看你做的是回归还是分类。
神经网络在分类任务方面令人惊叹,但在回归方面则不然。简单的 SVM 可能表现更好。
那都是乡亲们!
如果你喜欢这篇文章,请跟我来,给我一个掌声…或者两个…或者 40 个。如果你没有,那么我希望听到你的反馈!
你可以在推特上关注我( @csoham358 )也可以在这里阅读我的其他文章
来源:
这张大脑尺寸和身体尺寸的对比图来自 Siraj Raval 关于从头开始实现线性回归的教程。
泰坦尼克图来源于 Ahmed Besbes 关于如何在 Kaggle 泰坦尼克号挑战赛中获得 0.8134 分的博客。
其他图表摘自 mathsisfun.com 一篇关于数据相关性的文章
数据好奇 02.05.2017:上周的数据故事、资源和可视化综述
原文:https://towardsdatascience.com/data-curious-02-05-2017-a-roundup-of-data-stories-resources-and-visualizations-from-last-week-504eb567c9f6?source=collection_archive---------7-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 4 周(上周的帖子是这里是)。
每个星期,我都会把在网上找到的大量与数据相关的很酷的东西剪辑、保存并加入书签。以下是 4 月 24 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的读物
上周,我在 Medium 上发现了一篇非常有趣的关于数据“探索”的文章。作为一名教授,阿达尔坚持一句口头禅:“没有人是被付钱去探索的,他们是被付钱去发现的。”《T4》的整篇文章很值得一读,但这里有一句很好的引言来总结它:
在构建工具的背景下,探索的范围太广了。我们需要能够决定探索何时终止。
这份来自政府研究所的数据分析文章让我们看看英国政府拒绝的信息公开请求的数量是如何增长的。
这份推特分析包括完全由带地理标签的推特制作的英国火车路线图。
(上周我没怎么看书……你能看出我异常忙吗?).
引起我注意的数据
这里有一个很酷的方法来结合数据和新的社交媒体功能:作为 Twitter 时刻的注释地图。这一系列来自彭博的关于法国第一轮选举结果的地图是以快速、易懂的方式讲述一个故事的好方法。
我喜欢这份数据中互动和滚动的使用,即关于发放旅游签证的国家之间不平等的数据。
遗憾的是,Fourish 的优秀员工无法参加本周在伦敦举行的黑客大会。但是他们发送了一张当晚推特的可视化图片。多么体贴。
Screenshot: Flourish
全球调查性新闻网络的大抄袭图有太多值得喜欢的地方,我不知道从哪里开始。映射和连接网络图以显示业务关系的组合非常出色。界面很直观。描述该地图的推文将其解释为犯罪分子利用匿名公司、【像俄罗斯娃娃】来隐藏资产。多好的台词。
牛津大学的马特·罗瑟在推特上发布了一张漂亮的图表,展示了感知与现实的对比。要点:小心描述你的发现。
数据集和其他资源
我喜欢关注欧盟统计局的新闻发布,寻找有趣的数据集。这里有一个引起了我的注意:在欧盟国家获得公民身份的人数连续第三年下降,2015 年约为 84 万人。自 2010 年以来,一个欧盟国家已经有 500 万人获得了成员国资格。
美国国家公园管理局发布了大量关于国家公园游客的数据。FiveThirtyEight 的这篇文章是在公共政府数据中寻找好故事的一个很好的例子。
Chart from FiveThirtyEight’s piece “The National Parks Have Never Been More Popular”
200 多个美国城市举行了科学游行。这是人群规模的数据正在等待绘制地图。
有人在 data.world 上发布了一个从 1990 年到 2016 年的 NBA 薪资数据集。
哈利波特迷们注意了:现在有了一个来自这位受人爱戴的作者和推特狂热分子 J.K .罗琳的推特和转发数据集。
说到推特数据集,这是唐纳德·特朗普每条推特的一个。Data.world 目前正在为此数据集举办一场 data viz 比赛。
这个数据集着眼于主要行业和初创公司的增长率对比。
对于那些对绘制#GE2017 感兴趣的人,Alasdair Rae 发布了一个英国选区的大规模 shapefile。
还有一个谷歌文档,是关于有用的英国政治数据集的。你觉得合适的话,再加进去。
本着众包的精神,我找到了一个名为SpreadShare.co的网站,让你探索社区策划的电子表格。有用吗?有可能。数据呆子的梦想?大概吧。
上周就这样了。你看到我错过的东西了吗?或者你只是想给我一个数字点头?给我发微博或者在下面留言。下周会有更多的数据。
数据好奇 02.10.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-02-10-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-237f117107c0?source=collection_archive---------8-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 22 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 9 月 25 日那周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
只需要 BBC 世界的 9 张图表就能让我了解朝鲜这个陌生的国家,比任何新闻报道都要多。
上周,Tableau 的狂热分子对新的空间制图功能感到疯狂。
我想起了来自的 Nathan Yau 的这篇关于无用数据比较的伟大文章。当你向下滚动时,看看你是否能猜出为什么每个结论都是错误的。
[## 无用的数据比较
苹果和橘子的情况下,比较是没有意义的。比较事物是我们的天性。什么更好…
flowingdata.com](https://flowingdata.com/2017/08/15/useless-points-of-comparison)
CARTO 整理了一份 40 个辉煌开放数据项目的清单,为 2018 年的智慧城市做准备(h/t Alastair Otter )。
想成为数据科学家?这篇文章告诉你如何像一个人一样思考:
[## 如何像数据科学家一样思考并成为一名数据科学家
我们都读过其中的妙语——数据科学家是最性感的工作,但这种工作并不多,而且薪水也…
cyborgus.com](https://cyborgus.com/2017/03/13/think-like-data-scientist/?utm_source=hootsuite&utm_medium=social&utm_content=170927&utm_campaign=social_media_post)
Alberto Cairo 写了一篇关于报纸花了多少篇幅报道美国飓风图片的总结文章。
Deborah Mesquita 写了一个有用的分步指南,介绍如何使用 D3 构建类似甘特图的图表。
这里有很好的分析:你真的对特朗普先生没有好处吗?真的吗?
我在 infogr8 的同事不要脸的插一句:我们完成了一个案例研究,关于我们如何为 CompTIA 建立一个数据驱动的交互式仪表板网站,以探索科技行业的趋势。点击这里查看互动,点击这里阅读我们为什么要做。
数据集和其他资源
劳工部对美国 966 种职业的知识和技能类型进行了量化。在他们的网站上下载数据。
这里有一个从 Crunchbase 构建的数据库,显示关于创业公司、投资和收购的信息。
留着以后用:这个 Jupyter 笔记本小抄。
数据可视化
上周,这张全球人口的动画柱状图在 Twitter 上引起了我的注意:
giorgia lupi 从她手机发送的所有通知中创建了一个数据 viz。
优步绘制了一名 UberEXEC 司机的平均工作日。
周日,发生了拉斯维加斯大规模枪击事件的新闻。这个故事是巨大的。因此,虽然我保存了上周的许多其他数据可视化,但其余的都是关于这一悲惨历史事件的报道。
NYT 突然出现在我的订阅中,提醒我他们的互动显示了枪支政策专家防止大规模枪击的建议。
Vox 在数据主导的视频中一针见血:18 个图表中的美国枪支问题。
我们来统计一下人均枪数。美国是暗红色的。
人物 1:“枪支在美国是个问题。太多了。”人 2:“枪不杀人,人杀人。”人 1:“但是……
Axios 正在这个可滚动的互动中跟踪所有与大规模枪击事件有关的死亡事件。
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。下周回到✌.
如果你欣赏这个每周综述,给它几个👏️️ 或者与你的朋友分享。我也很想看看你最近在做什么,所以 保持联系 。
数据好奇 02.11.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-02-11-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-79de97ad6af1?source=collection_archive---------6-----------------------
欢迎来到我的关于我在网上注意到的数据驱动事物的综述。这是第 24 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。这是过去两周引起我注意的事情。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
我很喜欢在 NYT 阅读这篇关于 Franco Moretti 在文学批评中使用大数据的长篇文章。他的建议得到了评论家的认可:我们知道如何阅读文本……现在让我们学习如何不去阅读它们。“他用文本分析来分析几个世纪以来的文学作品的方法非常迷人。
[## 数字阅读:当大数据遇到文学
这是一个引起激烈回答的问题。数字人文学科被指责为盲目崇拜科学,充当…
www.nytimes.com](https://www.nytimes.com/2017/10/30/arts/franco-moretti-stanford-literary-lab-big-data.html?nytmobile=0)
因为是万圣节,这里有一个让你毛骨悚然的:我发现这个来自设计机构 Impero 的互动地图是一个及时而聪明的万圣节地图。
Grim London
还因为万圣节(而且对定义数据术语超级有用!):
Paul Bradshaw 为您的收件箱提供了9 多份涵盖数据和数据的新闻简报。
还记得我在之前的综述中发布的优步游戏吗?如果你喜欢它,你应该看看这篇来自英国《金融时报》团队的博客,看看他们为什么要做这个。
该领域的 7 种数据可视化人员,由 Elijah Meeks 和 Susie Lu 为您带来。
均值≠中位数。反之亦然。这就是为什么记者需要知道如何以及何时使用它们:
哇,这个 Python 图表库对于任何想用 Python 绘制数据的人来说都是一个惊人的资源。每个图表都有使用 matplotlib、pandas 和 numpy 创建的代码。
Christian Laesser 写了他如何想象谷歌搜索对德国大选的兴趣。
[## 幕后:我们如何想出我们的谷歌搜索兴趣的可视化围绕…
Wahl 2Q17 是由数据可视化自由职业者 Moritz Stefaner、Dominikus Baur 和 Christian Laesser 共同完成的…
medium.com](https://medium.com/@laesser/behind-the-scenes-how-we-came-up-with-our-visualizations-of-google-search-interest-around-the-a864c3add0e9)
Twitter 的标题说明了一切。如果你曾经在新闻机构工作过,并且必须做数据工作,请阅读以下内容:
数据集和其他资源
在这里尝试一种新的共享数据集的格式。让我们试一试:
- 通过潜入这些数据集,探索深水地平线石油泄漏造成的环境破坏
- 从 1563 年到 1736 年,苏格兰有近 4000 人被指控实施巫术,分析起来令人毛骨悚然
- 通过研究人员 Michael A. Johansson 的 Github repo 中的数据来跟踪波多黎各的复苏
就是这样。短小精悍。
数据可视化
给你一个非常奇妙的线形图来开始。虽然我喜欢这里用颜色作为变量的方式。
没有足够的 RT 按钮让我点击这条推文。所以。没错。
英国国家统计局正在加入“你画它”的潮流,推出一个经典的猜年龄线图。
多么惊人的显示财富不平等的图表。
这篇关于巴西政府在烧烤上花费多少的调查文章的数据简直令人震惊。
Just look at that fire dot plot
这是一个真正令人惊讶/着迷的动画仪表盘。就像沙滩上的波浪。
这是一种非常酷的融合数据和艺术的方式。我喜欢这种让数据变得有形的概念,把波浪变成真正的木头让人们去感受。
相关还是因果关系?
这是过去两周的记录。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发推特或者在下面留言。下周回到✌.
如果你欣赏这个每周综述,给它几个👏️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以 保持联系 。
数据好奇 03.07.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-03-07-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-f332c4c69503?source=collection_archive---------6-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 12 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 6 月 19 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
从皮尤研究中心的一些有趣的数据驱动的研究开始本周的综述。
千禧一代已经正式超过婴儿潮一代,成为美国最大的一代。
皮尤研究中心(Pew Research Center)还公布了一项关于其他国家对美国未来信心的调查结果。除了俄罗斯,所有国家的信心都下降了。巧合吗?大概不会。
英国《金融时报》的另一个图表医生专栏是关于技术在现代数据中的作用。
Shelly Palmer 为为什么数据素养会让你“几乎”不可战胜写了一个令人信服的论点。我倾向于同意,但那可能只是偏见。你是法官。
布丁的另一个漂亮的数据分析和可视化:【1966 年至 2016 年每年票房前 200 的电影的时间表。
我上周在媒体上发现了这篇名为可视化对科学的影响是什么?。这将我最喜欢的两个主题联系在一起,虽然这篇文章很短,但它开始触及为什么可视化数据可以成为如此强大的解释工具。
第六届数据新闻奖颁奖揭晓,12 个国际项目获得荣誉。点击阅读媒体上的相关内容。
谷歌的数据编辑西蒙·罗杰斯上周宣布,新版本的数据新闻手册将于今年晚些时候推出。在官方网站可以找到这本广受欢迎的指南续集的更新。
NYT 的《结果》栏目上周发布了另一份出色的数据分析:
麻省理工学院计算机科学和人工智能实验室的研究人员发布了一项名为“如何实现更好的可视化”的研究结果。研究人员使用眼球追踪分析来衡量什么类型的可视化效果能最好地传达信息。TL;DR 研究的主要发现:
-最强的视觉效果使用简洁的描述性标题
-使用图像/图形提高用户的信息回忆能力
-重复是关键:在文本、图表、注释等中展示关键要点
如果你有时间,你真的应该读一读整个学术研究。
NYT 团队最近在气候变化方面做了一些开创性的工作,最近这篇关于气候变暖如何影响南部各州的文章特别有见地。
Tableau 的 Rachel Costa 在 Fast Company 上写了一篇关于如何在数据可视化中有效使用颜色的文章。
Periscopic 是一个数据可视化和信息设计工作室,制作一些令人惊叹的作品。他们绝对是一个值得关注的群体,上周他们的两名员工发布了关于使用大型数据集以及如何可视化它们的文章。
数据集和其他资源
我还没有机会亲自探索 Enigma Public ,但它看起来是一个值得关注的有趣的数据项目。Enigma Public 是一个“建立在世界上最广泛的公共数据基础上的免费搜索和发现平台。”另外,特别感谢安迪·迪金森(媒体工厂公报)和索菲·沃恩斯(公平警告)的数据简讯,感谢他们本周的数据摘要,没有这些,我永远也不会找到这个网站。
如果你对房价感兴趣,全国房地产经纪人协会公布了美国 500 个最大城市的月度数据
体育数据:印度顶级联赛发布大量板球数据。data.world 上的一位好心用户从他们的 SQL Server 中提取了一些数据,并制作了一个示例 SQL 查询列表以获取更多数据。
芬太尼是最近席卷美国新闻报道的致命阿片类药物。这里有一个数据集,其中有 2011 年至 2017 年新泽西州药房的所有芬太尼配药。
传染病监测图谱可以让你绘制并下载炭疽、寨卡等世界疾病的历史。这个网站有一些非常大的 shapefiles,所以如果你的电脑有点慢的话要小心处理。
这是国税局注册的所有联邦免税非营利组织的数据库。
你听说过国会的推特吗?这是一个 github repo,收集并发布国会议员的每日推文档案。每天都可以作为 JSON 文件下载。相关:特朗普推特档案库已经有超过 30,000 条推特可供搜索和下载。
如果你喜欢数据,认为谷歌搜索很有趣,你应该在 Twitter 上关注西蒙·罗杰斯(Simon Rogers)。上周,他有益地提醒他的追随者,他们的 Google Trends 项目的所有数据都可以在他们的 Github 页面上找到。
最后,一个关于大脚怪目击的数据集。不,不是玩笑。是的,大脚野外研究人员组织是真实存在的。
数据可视化
这张来自 Vox 的图片简单得惊人,但却很有效。无尽的滚动图形有它的位置,这当然是一个如何使用它的好例子。
如果你读了我之前提到的关于世界如何看待美国的皮尤研究,下面的图表不会让你感到惊讶。话说回来,即使你知道它要来了,它仍然在视觉上引人注目。
风能是一个非常好的东西,我们正在更好地最大限度地发挥其潜力。我真的很喜欢用涡轮来制作这张路透社的图表。
这似乎是一个非常酷的可视化应用程序:
《每日电讯报》描绘了英国的宽带速度。结果显然是不确定的。
在纽约地铁系统的数据分析中,使用了来自 NYT 的最小数据,即。
路透社图形团队深入解释了朝鲜最近的导弹发射。
关于朝鲜,我喜欢英国《金融时报》的这些旋转的 D3 地球仪。
这是一张迷人而有见地的数据 gif 图:Android 和 Mac 用户似乎更有可能投票给克林顿。Windows 和 iOS 更倾向于特朗普。
这是一个非常好的、清晰的例子,使用带注释的折线图来显示随时间的变化。信不信由你,健康政策确实有效。
数据中的异常值非常重要。下面的图表说明了原因。
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。我也很想看看你最近在忙些什么。
如果你喜欢这个每周综述,拍上一张 ❤️️ 或者和你的朋友分享。下周会有更多的数据。
数据好奇 05.06.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-05-06-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-3d7f4ac3e525?source=collection_archive---------4-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 8 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 5 月 29 日这一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
美国退出了巴黎气候协议,NYT 对此有很多话要说。这篇数据分析文章展示了美国是历史上最大的碳污染者,比整个欧盟加起来还多(包括英国)。
随着周四英国大选的临近,我有机会参加了由当地统计局主办的数据黑客日。他们由高质量的记者和统计学家组成的团队编制了一份独一无二的英国选民人口统计和权力数据集。故事在 6 月 6 日之前是被禁止的,但请留意来自他们账户的一些深度数据驱动的新闻。
Trinity Mirror 为英国大选重新推出了“寻找我的座位”互动,以便选民可以了解更多关于他们投票选区的信息。你可以在这里测试工具并在这里阅读它是如何被创建的。
网站 Maps4News 采访了《金融时报》互动设计编辑史蒂文伯纳德,并发表了一篇关于《金融时报》编辑部生活的博客文章。由于英国《金融时报》在图形方面做了一些出色的工作,这将是一个很好的数据阅读材料,即人们希望了解图形团队如何在新闻编辑室与记者互动。
这是英国《金融时报》关于英国将如何需要重新谈判至少 759 项欠英国退出欧盟的条约的精彩数据分析。
布丁又成功了,这次性别平衡登上了 NYT 畅销书排行榜。
英国《金融时报》的约翰·伯恩-默多克发表了他在一次关于数据鸿沟的#数字论坛上的全部幻灯片。它有一些非常有趣的想法,关于统计数据如何将社会分为富人和穷人,以及我们作为数据人可以做些什么来弥合这一差距。
这里有一篇很好的文章,就如何使用 Twitter 作为数据源给出了一些建议。
那些喜欢使用 Python 和 pandas 讨论数据的人会发现这篇文章很有帮助:使用 Python Pandas 和 data.world 的 5 种有用的数据讨论技巧。
一些值得一试的工具:
还有人试用过谷歌新闻实验室的新的数据 Gif 生成器吗?还不知道如何感觉它,但我想它可以派上用场的快速 viz-fix。
这里有一个可爱/古怪的工具用于生成中世纪风格的地图。
说到地图,Alastair Otter 为记者们出版了一份很好的 10+地图工具综述。
全球调查性新闻网络发布了一个展示全球经济关系的可视化工具。
数据集和其他资源
上周,Buzzfeed 数据中心的团队分享了一个庞大的联邦工资记录数据集。这些是通过 FOI 的请求获得的,包括过去 40 年数百万员工的数据。这是一个大问题:冒险潜入。
Buzzfeed 还与 After School 合作,调查高中生对社交媒体上假新闻的认识。这里是完整数据集。
显然,谷歌有自己特殊的数据搜索引擎。看起来他们没有给它太多的关注,因为它的造型看起来像是在 2000 年代末最后一次更新。但是当只想返回与数据/数据集相关的主题的结果时,它仍然是一个方便的工具。
如果你关注 Twitter 上的任何数据,你可能已经看到了#改头换面星期一的标签。这个标签是由 Tableau 作为“社会数据实验”开始的。他们每周都会发布一个数据集,其中包含一篇文章的链接,以供参考/参考。尽管这一点都不新鲜,但它提醒了我,无论你是否使用 Tableau,这个页面对于寻找练习数据集来说都是一个多么好的资源。点击这里,浏览所有过去的数据集。
我找到了一个网站,上面的地图显示了今年以来美国发生的所有抗议活动。每个抗议都有地点、参加人数和事件名称。你可以在这里下载数据和查看地图。
挖掘政府游说支出已经成为我最喜欢的挖掘故事的方法之一。每个季度,国会都被要求披露所有发生的游说活动,包括游说了哪些机构,涵盖了哪些主题,以及游说者获得了多少收入。你可以在这里下载众议院和参议院的数据集。
波士顿大学公共卫生学院的研究人员汇编了一个数据集,其中包括 1991 年至 2016 年美国各州存在或不存在的 133 种不同类型的枪支法律。下载/查看数据。
数据可视化
来自《我们的世界》的 Max Roser 在数据中创建了一个自 1400 年以来每年全球冲突死亡人数的综合图表。这张图表是密集而有影响力的,它有一个写上去的伴随着它在这里。
Our World in Data
我真的很喜欢这幅由 Nadieh Bremer 绘制的“呼吸”世界植被图。没有多少数据可视化让我感到着迷,但这一个肯定做到了。
NYT 发表了一份对每个学生的大学经费的全面数据分析。这张各州资金减少的图表引起了我的注意。我喜欢他们用阿拉斯加作为传说,因为它真正充分利用了空间。
本周一,Tableau 举办了一场关于全球互联网使用情况的#改头换面活动:
这个自 2000 年以来每一个难民运动的大画面令人印象深刻。
一个关于 K-Pop 乐队的场景?是的,请。遗憾的是,大部分文字都不是英文的,所以我不能通读,但是设计很棒。
本周,我让一位读者寄来了他过去的一个 viz 项目。来看看:11 年卫星发射的仪表盘。他还写了一篇中型博客文章描述他是如何着手设计仪表板的。我喜欢看到那些认为这篇综述有帮助/有趣的人的工作,这让我思考:你们还对我隐瞒了什么?有一些你最近创建的数据或有趣的数据集吗?如果你给我发个链接,我会很高兴的。
Created by Iulian Gulea. Full dashboard here.
这是一个关于全世界斋月禁食的信息丰富、设计良好的注释气泡图。与世界其他地方相比,赫尔辛基的斋戒时间特别长。
特朗普宣布美国将退出巴黎气候协议后,出版商蜂拥而至,提供有影响力的数据,即关于影响的数据。这是 FiveThirtyEight 的一个很棒的折线图 gif,显示了这个问题在美国已经变得多么党派化。
Vox 用这张图表指出,2016 年关于气候变化的广播新闻报道尤其糟糕。
特别是 NYT 在声明发布后,在推特上掀起了一场数据风暴,即图表和图形。2016 年是有记录以来最热的一年。
他们还绘制了特朗普给 4 个高风险城市留下的气候遗产。
这张 gif 图很好地快速传达了美国退出巴黎协定的利害关系。
上周就这样了。你看到我错过的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。我也很想看看你最近在忙些什么。下周会有更多的数据。
数据好奇 07.08.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-07-08-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-a43b875e1bc3?source=collection_archive---------4-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 16 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 7 月 31 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
上周,当我在网上搜索有趣和创新的数据驱动的东西时,我确信我是在正确的领域。我发现了大量精彩的内容、可视化、故事和学术见解与大家分享——所以让我们开始吧。
来自全球数据新闻调查的第一份见解于上周发布。我带走了一些关键的东西:受过新闻教育的数据记者正在慢慢地向数据分析和数据科学领域转移,但没有经过正式的培训。或许顺序应该颠倒一下?数据科学→记者。
Grouped bar chart showing level of formal training in survey respondents by topic. Full post here.
美联社的数据编辑 Troy Thibodeaux 向全球调查新闻网讲述了为什么数据技能对每个记者都至关重要。
在贾斯汀·加特林在最后一场 100 米比赛中击败尤塞恩·博尔特的消息传出后,约翰·伯恩-默多克在推特上发布了一张他在 2015 年制作的图表,显示加特林与他的竞争对手相比是一个有趣的异数。你可以在这里阅读他对世界上跑得最快的人的完整分析。
显然,“收缩通货膨胀”是一个由政府机构创造的术语。《国际商业时报》通过这项数据调查揭示出,许多食品的体积正在慢慢缩小,但价格并没有变得更便宜。
Paul Bradshaw 写了一篇关于数据新闻业第二个十年的 10 条原则的文章。这些指导方针受到了比尔·科瓦奇和汤姆·罗森斯蒂尔 2007 年出版的《新闻要素》一书的启发。这是 10 项原则的预览图。
Full post here
Bradshaw 最近也写了一篇关于下一波数据新闻的文章。这篇博文回顾了计算机辅助报道(CAR)时代数据新闻的早期。展望未来,布拉德肖看到了在新闻编辑室使用“机器人新闻”、增强新闻和计算思维的潜力。
在上看到 pudding.cool 的这篇博文,我既惊讶又欣慰,有多少人在读故事的时候真的会调整浏览器窗口的大小。在他们的一篇视觉论文中,他们嵌入了一个脚本来测量有多少人调整了中间故事的大小。TL;DR:只有 2-3%的用户会调整窗口大小。如果这适用于其他媒体格式,这将对网页设计产生巨大的影响。与其如此关注流体响应,也许我们应该为特定设备设计数据可视化,使其在加载时出现()。
我真的很喜欢这篇关于“数据”如何变成一个超负荷术语的博文。这可能是真的,尤其是在内容营销和创意机构的世界里。关键要点:数据不是一个时髦词。不管它被用于什么目的,我们总是需要考虑诸如来源、应用、治疗和敏感性之类的事情。
布丁公布了《办公室》系列每一句台词的文本分析:《办公室》对话五图。
如果你在推特上,你可能会看到谷歌多样性备忘录上流传的愤怒。关于为什么关于计算/软件“男女能力的差异部分是由于生理原因”的备忘录完全是胡说八道,有很多好的回答,但这是我最喜欢的(不仅仅因为它使用了数据)。记得阿达·洛芙莱斯吗?
上周,我通过电子邮件收到了一些故事,其中使用了一些令人印象深刻的数据可视化。来自《印度斯坦时报》的这篇关于印度死刑判决的文章,以基于幻灯片的叙事故事的巧妙运用开始。我喜欢华夫饼图表与上面彩色文字的对应方式。真的是把故事放在开场号的背景下。
我想起了上周斯坦福大学研究人员爱德华·西格尔和杰弗里·赫尔发表的具有里程碑意义的学术论文《叙事可视化:用数据讲故事》。如果你以前没有读过,我强烈建议你读一读。上面的《印度斯坦时报》文章使用了他们的一种技术(单帧互动),文章引用了其他不同方式的例子,以战略性的方式可视化数据。
Nadieh Bremer 写了一篇关于如何使用她全新的 D3.js 插件创建织机图表的博文。
这是一个很好的关于在 Tableau 和 QGIS 中结合 shapefiles 进行映射的教程:
如果你正在寻找如何使用 Python 找到故事的灵感,我强烈推荐以这篇中型文章为例:我如何使用 Python 在我的利基网站上发表了一篇好文章。这篇文章解释了作者如何编写 Python 脚本来访问 Yummly API 并分析他们所有的思慕雪配方,以找到思慕雪最常见的成分。
这里有一个极好的(如果不是令人沮丧的话)例子,说明框架调查问题如何产生非常不同的回答。
数据集和其他资源
在一项独立的研究中,data.world 的营销总监 Ian Greenleigh 发表了一篇文章,声称“如果 78%的美国成年人能够轻松地访问在线新闻背后的数据,他们就会更加信任在线新闻”。你可以在 data.world 这里亲自探索他的分析背后的数据。
该数据集列出了从 1925 年到 2015 年被美国逮捕、驱逐或遣返的所有移民。值得思考的问题:执行力度增加了/减少了吗?这个数量是否考虑到人口规模而标准化了?等等。
乌特勒支数据学院创建了一个数据伦理决策援助(DEDA)工具来帮助记者、数据分析师和政策制定者认识数据项目中的伦理问题。用户可以填写 PDF 或交互式问卷,以便采取系统的方法筛选数据中的伦理问题。
西雅图公共图书馆允许你查看自 2005 年以来每一个实体项目的每一次结账。警告:数据集包含超过 9000 万行,但您也可以通过查询或使用其 API 来访问它。
上周我发现了网站lobby facts . eu(h/t Jeremy Singer-Vine),并在脑海中将其标记为开始调查的绝佳地点。该网站从欧洲议会获取公共数据,并通过公共 API 提供。还可以找到游说会议的数据(相关站点: IntegrityWatch.eu 有关注这些会议的数据)。
还记得 2014 年马来西亚航空公司 MH370 飞机失踪的新闻吗?澳大利亚政府刚刚发布了他们雄心勃勃的海底测绘勘探的第一批数据,试图找到遗骸。该数据包含 278,000 平方公里的海底地形。
8 月 4 日是国际啤酒日。打开冰镇啤酒,投入到这个精酿啤酒数据集里,来一个迟到的庆祝吧。
Filipe Hoffa 分析了 30 亿条 reddit 评论,找出了网上被提及最多的 Reddit 用户。你可以阅读他是如何做到的,并通过查看他的博文在 BigQuery 上查询数据集。
数据可视化
还记得过去两周所有的日食可视化吗?在这一点上似乎有点过头了。嗯,也许不完全是…你还没有看到#日落地图。
很自然地,推特很快加入了这个笑话。以下是我最喜欢的一些恶搞日食地图:
数据并不总是实时的选举地图和政治报道。NYT 上周发表了一篇关于伦敦新 Crossrail 计划的长篇文章,其中有一个有趣的手机地图选择:
垂直翻转东/西运行的 Crossrail 允许 NYT 仍然可以在移动屏幕上使用注释。但这一选择似乎在 Twitter 制图和数据 viz bubble 之间引发了一点争议。
自然,令人迷惑的地图的例子接踵而至:
我的观点是:NYT 地图翻转绝对是正确的选择。我们应该挑战观众重新思考地图,即使这需要一些方向性的重新思考。
当我们在地图上的时候,我上周发现了这张漂亮的注释地图,是一个难民从也门到奥地利的地图。
Axios 制作了一个很棒的交互式流程图,显示了美国各州之间的商品出口。
本周最佳数据奖授予: Antti Lipponen 和他的温度异常动画图表。
BBC 图表显示桑基图仍然是显示选民如何在两次选举之间改变其政党忠诚度的最佳选择。
《卫报》将旋转散点图引入他们的数据,即上周在关于乌塞恩博尔特的互动数据分析。这里的注释非常清晰,我认为在这种情况下旋转散点图实际上会使图表的含义更容易理解。
英国《金融时报》通过在这张经济泡沫垂直线图上添加引言,再次拓展了图表注释的界限(我认为这是非常成功的)。
“Despacito”无处不在。我是说,到处都是*。*
另一个值得一提的数据 viz Twitter 讨论是由卫报美国数据编辑 Mona Chalabi 发起的这个帖子。完整的讨论值得一看,以了解为什么这些图表是可怕的,但重点包括莫娜揭穿研究,这些研究使用难以置信的小样本量和扭曲统计数据,以支持意识形态/种族偏见。一些人认为统计和数据可视化本质上是真实的,因为它们基于数字。这些图表证明,这是一种危险的不准确的思考方式。
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发推特或者在下面留言。
如果你喜欢这个每周综述,拍上一张 ❤️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以请联系我。下周会有更多的数据。
数据好奇 08.05.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-08-05-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-59b21aac101b?source=collection_archive---------5-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 4 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会把在网上找到的大量与数据相关的很酷的东西剪辑、保存并加入书签。以下是 5 月 1 日这一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的读物
上周法国大选有很多好消息分析。但是我也阅读了一些保存的关于数据最佳实践的链接,推荐了一些非常有用的工具。
在阅读了 Lisa Ross 的“我从使用 24 种工具重新创建一个图表中学到了什么”之后,我开始感觉到更多的工具不可知论。有这么多的选择来创建伟大的数据,没有一个工具可以统治他们。
哦好,另一个唐纳德·特朗普的推特分析!但是这一个从其他人中脱颖而出。《每日电讯报》研究了如何通过分析唐纳德·特朗普的推文来告诉我们他在推特世界之外做了什么,比如他什么时候醒来,什么时候看福克斯和朋友,以及总统可能会变得不那么愤怒(或者至少希望被人这样看)。
说到社交媒体数据分析,数字取证研究实验室的这篇文章深入探讨了 alt-right 在周末的#MacronLeaks 努力。
数据可视化应该总是讲述一个故事吗?简短回答:是也不是。但也许更多的是?这是对数据行业正在进行的辩论的有趣介绍。
我真的很喜欢尼曼实验室关于布丁的这篇文章,布丁是流行文化数据,即测谎仪的编辑部门。它很好地解释了网站的模式,洞察了它是如何盈利的。
播客听众可能会喜欢这个关于的对话,“开放数据应该有多开放?”由牛津大学播客主办。
你有没有想过为什么 data viz 的设计师如此痴迷于圈子?坦白说:我没有,直到我从《连线》杂志上读到这篇文章,描述了数据设计师曼纽尔·利马的新书(现在是我 Goodreads 上不断增长的必读书目)。
这篇文章描述了一个名为 EXIT 的新艺术展览,它用数据展示了气候变化的影响。在艺术中使用数据的真正有趣的方式,以艺术表达的形式而不是新闻报道的形式。
数据集和其他资源
650 data 是为即将到来的英国大选推出的一个新项目。他们为他们正在做的所有事情创建了一个 Github repo,其中包括一些用于轮询的优秀数据资源。
全球调查新闻网络上周在推特上发布了一个便捷的数据资源,列出了 520 个开放数据门户。
我之前在 Good Reads 部分提到了 Pudding,但是你知道吗,这个 data viz powerhouse 保存了他们所有积压的想法、数据集和资源的公共 Google 文档。检查。它。出去。
喝啤酒的人可能会喜欢这个美国啤酒厂生产的啤酒罐、小桶和税收的综合数据。
在非数据集相关的新闻中,Tableau 刚刚宣布了数据新闻项目的新的和更新的课程。博文此处。
数据可视化
天哪,上周在我的订阅上出现了惊人数量的数据。
彭博绘制了一幅精美的地图,展示了英国退出欧盟如何给吉尼斯世界纪录的出口制造问题。
阿什利·柯克(Ashley Kirk)发表了一个出色的例子,利用特朗普执政前 100 天的注释垂直时间线。
我喜欢英国《金融时报》约翰伯恩-默多克(john Burn-Murdoch)的这种高亮条形图风格。它清楚地显示了随时间和数量的变化。
这个由 Michael Mixon 撰写的关于 EPA 削减的交互数据将带注释的 Tableau 图表与 reveal.js 框架结合在一起。嵌入式 Tableau 图表素有挑剔的名声,但我认为 Mixon 在这里找到了一个成功的组合。用箭头键滚动故事是一件轻而易举的事,图表的交互性是一个很好的补充,同时不会妨碍故事。
我喜欢在这张 38 度的图表中使用空心圆圈和实心圆点,这是按发电厂类型划分的电力成本。它看起来比有时过于学术化的框框图要干净得多。
我真的很喜欢这个 gif 数据,即来自 FiveThirtyEight 的数据,它显示了共和党人和民主党人是如何看待不同群体受到歧视的。最能说明问题的是:许多共和党人认为基督徒受到了歧视,绝大多数民主党人并不这样认为。
来自英国《金融时报》的这份 vis gif 数据展示了一种让用户一步步了解图表故事的绝妙方式。通过改变整个 gif 的注释,一个标准的折线图不仅仅显示数量随时间的变化。它成为一个详细的时间线,而不占用传统时间线所需的空间。
Maarten Lambrechts 在今年即将到来的欧洲电视大赛上为谷歌新闻实验室创建了一个数据 vis。你可以在这里查看他的博客文章“制作:欧洲搜索歌曲大赛”。
这张来自 NYT 制图公司的地图很好地利用了颜色来显示运输路线。我也喜欢地图的圆形视图,以创建一个类似地球的效果。
几乎有太多的法国选举可视化可供选择,但这里有几个引起了我的注意。
华尔街日报的这篇分析显示了勒庞如何在高失业率地区获得更多支持。整篇文章的地图和图表真的很犀利,很好理解。
英国《金融时报》数据团队的创造性产出继续给我留下深刻印象。这份对法国大选的隔夜分析充斥着圆滑的数据,即。我最喜欢的是:显示预期寿命和马克龙选票份额之间相关性的散点图。
直到在英国《金融时报》上看到汉娜·墨菲(Hannah Murphy)的动画时间线,我才意识到马克龙的掌权速度有多快。将它转换成 gif 格式用于社交分享,使得这些数据具有超强的可读性和丰富的信息。
上周就这样了。你看到我错过的东西了吗?或者你只是想给我一个数字点头?给我发微博或者在下面留言。下周会有更多的数据。
数据好奇 10.07.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-10-07-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-8eaab7a32e8e?source=collection_archive---------10-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 13 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 6 月 19 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
公平的警告:本周将会很短暂。不是因为缺少数据,而是因为没有空闲时间来收集这些数据。让我们开始吧!
保罗·布拉德肖在《电视邮报》上发表了他的《数据新闻》的后续文章,在广播、音频和播客上发表了数据新闻。如果你正在寻找听力材料,他有一些很好的建议。
这篇题为已婚人士拥有更多的性生活的文章是利用数据分析对抗社会刻板印象的一个很好的例子。文化叙事:结婚后你的性生活会下降。数据叙事:已婚者性生活更多。
我很喜欢阅读卫报数据新闻团队关于他们如何使用数据驱动的新闻方法报道 2017 年英国大选的幕后报道。
这份关于二氧化碳排放的碳简要报告中有一些非常丰富的数据和可视化。
Eva Constantaras 非常友好地分享了她最新的数据新闻演示笔记:
布丁猫王深入研究了美国鲸鱼和海豚圈养的数据。
自英国在酒吧引入禁烟令以来,已经过去 10 年了。英国广播公司发布了显示影响的 10 张图表来纪念这一里程碑。
数据集和其他资源
本周我不太关注数据集,但我正在创建一个我每周都会找到的数据集的中央数据库。我会计划在每次发布新的数据时更新它。敬请关注。
现在,看看这个数据库,追踪美国帮派相关的谋杀案。
如果您使用 R 语言,您可能会发现本教程对于数据探索和可视化非常有用。
这是特朗普政府所有白宫官员的数据集。
如果你在 Tableau 工作,请查看安迪·克里贝尔(Andy Kriebel)过去几周的周三锻炼。象限图是一个很好的清单。
最后,大狗比小狗聪明吗?分析这个数据集来找出答案。
数据可视化
我喜欢在英国《金融时报》对格伦费尔大厦的数据分析中使用带注释的图表。
莫娜·沙拉比祝你 7 月 4 日快乐。没有 __,美国就不是美国了。
凯文·奎利是我的数据,即这条推文的本周英雄。" 44 张地图,比你手机上的任何时候都好看."
这里很好地使用了南丁格尔的玫瑰来显示自 1990 年以来互联网使用的增加。
看起来英国下议院图书馆正在进入预算可视化领域。桑基和泡泡图的有趣组合。
这是一个非常酷的方式来可视化世界各地的白昼时间。我认为地图的呈现是显示这些数据的直观方式,但是让用户点击到达那里感觉像是增加了一点不必要的工作,特别是因为 Tableau 似乎需要很长时间来响应用户的点击。
这张动画地图显示了伊拉克军队如何蚕食 ISIS 的大本营摩苏尔。
这是从上周开始的(我知道它比平时短,但更多即将到来!).你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。我也很想看看你最近在忙些什么。
如果你喜欢这个每周综述,在上面拍一张 ❤️️ 或者与你的朋友分享。下周会有更多的数据。
数据好奇 12.06.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-12-06-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-327bc89b2e00?source=collection_archive---------5-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 9 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 6 月 5 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
随着上周英国大选的临近,我的推特上充斥着大量政治分析和数据。当然,这不是坏事,但值得免责声明:本周有很多与英国选举相关的内容。但我向你保证,他们仍然很出色。
对于那些不熟悉英国政治格局的人来说,卫报的互动文章特里萨·梅的赌博是如何失败的?是一个很好的分析工具。密集的数据和带注释的微观可视化使其易于消化,同时仍能传达选举中的利害关系。
另一个好结果综述:BBC 的 2017 年选举:地图和图表中的结果。
关于 NYT 那篇文章英国如何投票,我有很多很多好话要说,但我更希望你自己判断。
约翰·伯恩-默多克是大选期间在推特上关注的关键人物之一。他在选举后的几个小时内制作的大量图表和分析既惊人又有见地。你可以在英国如何在 7 个图表中投票中阅读他对《金融时报》的完整分析。
话虽如此,他的一些散点图确实引发了关于因果关系/相关性融合的健康辩论。例如,这张图表显示,人的健康越差,他们就越有可能投票给保守党:
From John Burn-Murdoch at the FT.
这是《纽约客》上关于华盛顿大学提供的一门名为“大数据时代呼唤废话”的新课程的有趣简介。除了作为大学课程的一个好名字之外,这篇文章还提醒我如何处理数据,它涉及的远不止是实际的数字:数据从何而来?谁获得了数据?为什么?这些问题可能和数字本身一样重要,有时甚至更重要。
这里有一些关于如何使用 VLOOKUP 在 Excel 中面试数据的小技巧。
如果您在东欧地区,有一个值得一试的#opendata 和#ddj 机会:
如果你用数据来充实 UX,你可能会喜欢这个关于 UX 的阴阳和数据的中帖。此外,这篇文章有一些有用的设计技巧,可以在处理复杂的大数据集时牢记 UX。
上周,全球调查性新闻网络的工作人员强调了数据记者应该掌握的一些关键技能。
如果您正在寻找在线注册的最佳数据即课程,您可能想看看这张令人印象深刻的互联网上每门数据可视化课程的综合图以帮助您在注册前做出决定。
这篇关于 9 个更好的数据可视化技巧的文章从该领域的领导者那里得到了一些很好的建议。
更多的数据即学习资源值得关注:Shirley Wu(来自《数据素描】)正在教授一门在线课程,有人报名参加了这门课程,并为了每个人的利益写了第一课。
工具更新消息:流行的易用图表程序 Datawrapper 现在支持散点图。
2017 年数据新闻大会上有一些很好的收获,Marianna Bouchart 很好地将它们发布在 Medium 上:如何衡量数据新闻的成功以及 2017 年数据新闻大会上专家的其他建议。
这条为记者提出的规则将被写进我的黄金规则手册《如何不被数字欺骗》(这是一个工作标题)。
Data.world 发布了一个新的 SPARQL 教程,作为使用查询语言的介绍。作为额外的奖励,练习数据集是《权力的游戏》中的角色(在这里下载)。
这是一项有趣的研究,根据媒体出版商的报道,研究了脸书喜欢和分享之间的关联。如果你想分析福克斯新闻频道脸书帖子中的关系,你也可以在这里下载你自己的数据。
数据集和其他资源
我喜欢新闻编辑室开放他们的数据,Quartz 的团队刚刚发现了一个数据金矿:数据编辑 Chris Groskopf 宣布了 Quartz 可靠数据目录。这是一个很好的电子表格,可以作为书签来查找最近的可靠数据集。
彭博在 Github 上有一个数据集,记录了川普成为总统之前乘坐的所有航班。你可以通过阅读彭博的文章来了解如何分析这些数据,或者你可以在这里下载数据并亲自尝试一下。
美国劳工部必须公布已报告的严重工伤(住院、截肢、失明等)数据。听起来有点病态,但是如果你感兴趣,你可以在这里下载电子表格。
这里有一个由 Google Research 基于 Reddit 对话制作的有趣的数据集:“粗糙话语”,或者是一个对在线讨论进行理解和分类的数据集。
英国选举的官方结果数据将会很慢出来,但是你可以从BBC 的页面抓取一些政党结果来开始分析。
上周所有的选举地图也让我想起了这个便利的资源:一个英国所有选区的大形状文件。
数据可视化
有一些关于选举的东西对新闻编辑室的数据和图形单元施加了某种魔咒。似乎在每次重大选举之前、期间和之后,viz 的数据输出都会激增,英国将军当然也不例外。上周充满了令人难以置信的视觉效果。
我爱一个好的网络图分析,你呢?这张照片展示了英国现任议员的追随者关系。
我真的很喜欢这次卫报关于英国大选结果的互动。点击“播放”按钮,你就可以看到选票滚滚而来,就像选举之夜一样,还可以看到关于哪些席位最不重要的注释。《卫报》开始关注一种非常好的视觉风格,他们也偏爱十六进制图表。
2017 年当选的女议员比以往任何时候都多。
Yelp 的数据科学编辑 Carl Bialik 非常明智地指出,当一张地图根据座位的影响而不是地理区域进行加权时,视觉效果会形成鲜明的对比。
英国《金融时报》制作了一些精美的动画 gif,展示选举之夜是如何展开的。
Stefano Ceccon 制作了一个有趣的动画 viz,展示了在过去的四次选举中,英国政治是如何变得越来越两极化的。
除了对地图有好处之外,选举也是桑基图的好机会。典型的例子:
现在到一些非选举即。
我发现这个全球军火交易的地图混搭真的很有趣。
这是一个精心设计的交互式地图,结合了一些有品位的注释和工具提示中图表的使用,以更深入地挖掘数据。不过警告:文本是德语的(如果你想阅读注释,谷歌翻译做得不错)。
这是另一张美丽的网络图。
来自政治的关于欧盟死亡原因的互动提出了一些关于恐怖的有趣问题。这一视觉效果令人震惊,但也引发了一些担忧:以这种方式比较不同领域的死亡原因(即癌症与恐怖主义)公平吗?
Vox 对媒体如何报道某些事件做了一些有趣的分析。我认为这张图表提出了一些有趣的问题:
作为一个在美国中西部生活了大半辈子的人,下面这张地图并没有让我感到惊讶。但对世界上的其他人来说,这是令人震惊的。
大多数熟悉数据可视化的人都知道,人类用设计来描述数字已经有很长时间了(想想弗洛伦斯·南丁格尔的玫瑰图)。但是你知道吗,一个数字动画数据 viz 早在 1965 年就被制作出来了。
上周就这样了。随着上周产生的大量数据驱动的故事、分析和可视化,我很肯定我可能错过了一些顶级的工作。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。我也很想看看你最近在忙些什么。
如果你欣赏这份每周综述,就在上面画一颗心,或者与你的朋友分享。下周会有更多的数据。
数据好奇 13.09.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-13-09-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-e952c18846a6?source=collection_archive---------8-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 19 周(上周的帖子是这里是)。
在短暂的假期后,我又回来发布我最喜欢的数据了。原谅周三发布延迟!周一早上回来,下周例行周记(承诺)。由于我保存了过去两周的链接,这篇综述可能会比平常更有力。还有这么多飓风地图。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 8 月 21 日那周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。我下周休假,所以下一次数据好奇将在 9 月 11 日回来。请在媒体上关注我的最新消息。我也是推特上的。让我们开始吧。
好的阅读、分析和教程
Alastair Rae 在推特上发布了一些关于如何以有趣的方式教授统计学的不错的课程材料。
同样,我喜欢这个数据,也就是由 Nathan Yau 发布的漫画。
在过去的两周里,出现了很多值得收藏的好资源。我最喜欢的是来自 NYT 的公告:这个图表是怎么回事?
这是一篇来自 Alberto Cairo 的关于引用单一数据点时上下文的重要性的精彩博客。我也喜欢他指出布莱巴特在报道 DACA 时故意忽略了这一点。
布丁制作了一篇关于开车去美国堕胎诊所的时间的令人难以置信的视觉文章这篇文章中的数据可视化简直令人震惊,尤其是显示怀孕不同阶段最近诊所的动画 gif 地图。您可以在安全地点项目查看布丁用于创建地图的数据。
如果你想学习一门用于数据分析的编码语言,我强烈建议你从阅读这篇来自 Peter Gleeson : 的非常全面的概述开始,你应该学习哪种语言用于数据科学?
我发现这非常有趣,不太长,关于在新闻和数据中使用术语“讲故事”的 tweet 线程。一方面,数据可视化思想领袖 Alberto Cairo 反对在数据中使用“讲故事”。但是最近数据驱动视频《影子和平》的创作者尼尔·哈洛兰说他支持使用这个词。两个像样的论点…你觉得呢?
哇,NYT 的这个互动数据真是太棒了。你解决它:你能保持在世界碳预算之内吗允许用户估计从现在到 2100 年世界主要国家和地区的碳排放量。用户输入、改变滚动可视化和不同颜色的投影折线图的组合是一个非常有效的组合。
Screenshot from NYT piece
这是我在 Medium 上为任何使用 Seaborn 和 Python 创建数据可视化的人找到的一张不错的备忘单。
奈特实验室(Knight Lab)开发了一款名为 Storyline 的新工具,它允许你构建一个带注释的交互式折线图,风格类似于英国《金融时报》制作的折线图(但具有交互性)。看看这个:
过去两周的新闻中有如此多的飓风地图和视觉报道,我不得不阻止自己把它们都保存下来。以下是我最喜欢的两篇文章:
FiveThirtyEight 发表了一些非常好的视觉分析,分析了飓风哈维与美国以前的飓风相比的情况。这张华夫饼/条形图组合是我最喜欢的,它显示了近年来代价高昂的灾难似乎变得越来越常见。
在我看来,NYT 绘制了最漂亮的飓风路径图。这种互动功能在捕捉飓风强度方面做得很好。
NYT 还制作了一个视频,展示了 40 多个工业场所是如何因哈维飓风而释放有害污染物的。
哦,天哪……根据《哈佛商业评论》,只有 3%的公司的数据库达到了最低可接受的 97%正确数据记录的范围。这项研究分析了 75 名高管的调查结果。看起来不太好,西装男。
我们从大量数据中得知,人们喜欢地图(即使它们并不总是你数据的最佳选择)。Carto 发表了一篇博客,介绍了企业在数字战略中使用地图的三种方式。这里有一个来自 CityLab 的关于网络流量的很好的证明:
“例如,致力于讲述世界城市故事的大西洋媒体公司(Atlantic Media company)的子公司 CityLab 发现,平均而言,他们的地图页面上每月 220 万独立访客的参与度和分享量高于任何其他类型的帖子。”
ESRI 的约翰·纳尔逊写了一篇令人印象深刻的全美房屋抵押贷款价格数据分析这篇文章的中心视觉效果是一张 choropleth 图,显示了每个地区的抵押贷款中位数与收入中位数的比率。地图使用了一些很好的滚动说明来解释每个地区最好和最差的地方。这篇文章是使用 ESRI 的故事地图级联模板创建的,数据取自 ArcGis 住房负担指数。
Screenshot from full piece
这里有一篇来自当地统计局的很棒的博客文章,解释了他们如何将当地记者与国家数据联系起来,以披露一些关于英国受污染农场的大新闻。这是一个鼓舞人心的故事(也是一个值得关注的伟大媒体组织),展示了协作和数据的力量。
最后,这是一个关于如何使用 Python 来定位和跟踪特定比特币地址进行调查的精彩教程。你也可以检索地址,搜索这些账户的暗网提及。
数据集和其他资源
这周我有很多很棒的数据集要和你们分享。
比如这个数据世界的盗版攻击数据集:
这里有一个需要重新审视的及时数据集:大洪水事件的全球主动存档。记录可以追溯到 1985 年,你可以下载 Excel、XML、HTML 和地理空间文件(h/t Jeremy Singer-Vine )。
作为互联网档案馆新项目电视新闻档案馆的一部分,该公司创造了一个新工具: Face-O-Matic 。该软件通过电视新闻片段来分析特朗普和美国参众两院各领导人的屏幕时间。这些数据可以通过电视新闻档案免费下载。
显然,优步刚刚发布了来自全球超过 20 亿次旅行的匿名数据。那是很多的 Ubering。用户需要一个优步账户来访问数据,但这可能值得一看。
另一个值得一看的有新闻价值的数据集:这个关于那些受 DACA 影响的人住在哪里的数据库。
这是 2015 年印度发生的所有犯罪的数据集(与 2014 年相比)。
寻找更多的数据来源?Tableau 发布了一篇关于你现在需要的 5 个数据源的博客(提示:其中一些出现在这篇综述中)。
数据可视化
本周没有那么多数据值得炫耀,因为我尽了最大努力(但大部分都失败了)在度假时远离 Twitter。此外,大多数最好的东西都可以在这篇综述的文章部分找到。但这是我喜欢的其他东西。
皮尤研究中心证实了大多数人已经知道的事情,但是是以一种很好的视觉方式。
我喜欢在坡度图之间使用阴影来显示泰国的贫富差距。
对于一种显示风暴路径不确定性的方法来说,这是一个多么好的名字:涂抹。
欢乐情节再次来袭!Axios 绘制了自 1987 年以来大西洋上的每一次风暴。
在与风暴无关的情况下,现在有明确的证据表明,NYT 周五和周六的填字游戏客观上比其他日子更难。
这张互动地图向你展示了100 美元能让你在美国的每个城市(地区)走多远。
汪汪。太多了。上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。回到下一个 week✌.
如果你欣赏这个每周综述,给它几个👏️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以请联系我。
数据好奇 14.08.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-14-08-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-ec998b7d0caf?source=collection_archive---------7-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 17 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 8 月 7 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。让我们开始吧。
好的阅读、分析和教程
我发现这个教程和创建 Joyplots 的介绍非常有帮助。作为一种图表类型,Joyplot 有时更具艺术性,而非描述性。但是丹尼尔·普雷格为使用 Joyplots 作为一种显示随时间变化的方式提出了一个令人信服的论点,同时也包括了适当的背景。(旁白:要了解一点历史,请看这篇《科学美国人》的文章,它讲述了 Joy Division 的 pulsar 专辑封面背后的科学的历史。)
如果你还没有看过影子和平,抽出 15 分钟来看看吧。这个互动视频使用数据分析和研究来解释假设的核战争会对人类造成什么影响。既恐怖又迷人。但所有这些都是精心制作的。
Screenshot from The Shadow Peace video.
如果你以前读过这篇综述,你会知道我是布丁杂志的忠实粉丝。上周,我非常高兴地看到了伊利亚·宾德曼关于如何制作毒品的新文章。他的博客文章是即将推出的系列文章的第一部分,重点是用数据讲述视觉故事。请关注这个系列的其他部分(如果你不关注,我当然会支持你)。
现在是英国的假日旺季,所以自然地,BBC 创造了一个交互式的航班延误计算器来估计机场的等待时间。在互动的下面是一些漂亮的数据,即平均延迟时间(看起来不太好 EasyJet)。
Full story on BBC
路透社的图形团队制作了一个关于委内瑞拉发生的经济危机的漂亮的解说。 Vladimir's Venezuela 使用折线图/条形图、华夫饼图、小倍数图和地图来显示石油出口价格下跌如何削弱了该国,并使俄罗斯扫入并抓住了机会。顺便说一句,虽然我通常不喜欢深色背景的外观,但我认为黑色背景+黄色数据 viz 非常适合这件作品。
数据可视化工程师 Elijah Meeks 写了一篇关于冲积图和它们的不满的有见地的媒体文章。这篇文章讨论了系统可视化形式的兴起,比如 data viz 社区中流行的 Sankey 图。虽然桑基图是显示流量的明智选择,但它在很大程度上不允许循环反馈,这限制了它们准确描述网络流量的能力。
另外,我强调了 Elijah 文章中的这一部分,因为尽管是题外话,我觉得它适用于数据可视化中一个更大的问题。基本上:阅读图表时不要要求用户做太多的工作(大多数情况下)。
您会注意到,这个实现没有利用颜色来编码类别或数量。这是一个基于图的复杂性和我不想用太多的频道淹没用户的愿望的决定。当你展示的图表的大小和位置与读者期望的典型数据点不一致时,你已经在要求大量的投资了。
这里有一个很好的入门教程,关于如何用 Python 创建和可视化决策树。
这份彭博数据分析显示,伦敦几乎没有房屋出售。
Interactive module allows you to compare house prices in London boroughs.
Mapbox 发布了一个 WebGL 库来创建风模式模拟。我不知道它是如何工作的,但是演示地图确实令人着迷。
数据集和其他资源
记者亚历克斯·拉夫林根据她对音频制作人收入的调查制作了一份数据分析。你可以在她打开的谷歌电子表格中查看数据。
这里有一个数据集,里面有成吨的网飞电影和电视剧供你玩。这些数据绝非详尽无遗,但它可以作为一个很好的测试数据集来理解评级分布如何在网飞发挥作用。
美国农业部国家营养数据库是最全面的食物数据来源。你可以在数据库中查询食物描述、营养数据、食物类别等等。
英国海洋数据中心拥有 1915 年至 2016 年英国所有沿海洪水事件的数据库。该数据库包含每个事件的日期、地区和严重程度(h/t Jeremy Singer-Vine )。我感觉到了一些映射潜力…
Data.world 已经启动了一个新的数据项目,旨在识别包含食物沙漠的社区。目标是将来自 usaspending.gov 的数据与其他数据集结合起来,揭示新的见解。有趣的地理数据+美好的事业!顺便说一句,即将推出的美国消费网站的测试版看起来将是一个巨大的改进。
数据可视化
你看到这张图表了吗?我是说,*你看过吗?!*触目惊心。NYT 用一张简单的图表展示了我们破碎的经济。
这是同一个 NYT 图表,但是绘制成了 gif 折线图。
贝纳特·阿瑞吉用 Airbnb 的客人评分作为坐标,制作了一堆城市地图。
有没有注意到年历看起来和华夫饼干图表有多么奇怪的相似?自特朗普总统任期开始以来,多年日历堆叠=华夫饼图表新闻发布会对比(白色表示没有举行新闻发布会)。
我真的很喜欢 NYT 那篇文章中的这张图表组合图一个保守的电视巨头如何摆脱监管。气泡图可以很好地显示位置,但是很难区分气泡大小之间的更好的细节来进行比较。通过将之前/之后的气泡图与堆叠条形图相结合,查看者可以在一个图形中了解地理数据和一段时间内的累积数据。
Full piece
《卫报》上周在 Instagram 上发布了这张科技领域男性员工的图形后,引起了一些波澜。虽然这是一个有争议的设计选择,但至少它让人们开始谈论(h/t 索菲·沃恩斯)。
我喜欢这个形象化的画面,它用一个标志性的班克斯形象展示了处于贫困危险中的儿童。量化数据与艺术形式的完美结合。
Full Interactive here
还记得上周的 WaPo 首页数据吗?网络故事更好,有大量的数据和视频。
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。
如果你喜欢这个每周综述,在上面拍一张 ❤️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以请联系我。下周会有更多的数据。
数据好奇 15.05.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-15-05-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-a331e5f8e074?source=collection_archive---------4-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 5 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会把在网上找到的大量与数据相关的很酷的东西剪辑、保存并加入书签。以下是 5 月 8 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的读物
这周我找到了很多有用的文章,从很酷的操作指南到更多关于数据和数据可视化的理论文章。
约翰·纳尔逊在 LinkedIn 上发布了一个教程,展示如何在 Excel 中创建一个大块的单元格图。这是一个超级简单的方法,也是一种很酷的预览经纬度数据的方式。如果你喜欢复古电子游戏和像素化也很酷。
Screenshot from John Nelson’s LinkedIn post.
这里有一篇来自开放数据研究所的文章,其中提出了一些很好的建议,建议在即将到来的英国大选的宣言中关注哪些与数据相关的政策。
美国人口普查局的领导人刚刚辞职,该分支机构正面临巨额资金削减。局里有麻烦了?和人口普查经费的损失怎么会损害社会公正?
你是否曾经想检查或使用你在网上发现的一个很酷的互动背后的数据?Paul Bradshaw 发布了一篇博客,向用户展示如何使用浏览器检查器(在我看来,在 Chrome 浏览器中效果最好)来找到互动内容背后的数据。本周,他还宣布了伯明翰城市大学一个新的数据新闻专业的 T2 硕士学位
Max Harlow 在伦敦 Journocoders Meetup 上就如何使用 RegEx 搜索、转换和清理你的数据给出了详尽的指导。对于那些不熟悉正则表达式,并且正在寻找清理和搜索大量文本文件的方法的人来说,这尤其有用。
自从上周发现布丁后,我对他们的“视觉散文”的质量感到惊讶例句:这篇关于美国最佳啤酒城市的滚动文章给人留下了深刻的印象。这是我最喜欢的部分:在揭示了啤酒的最佳城市之后,他们给了用户调整一些排名的选项,以查看它如何改变数据。我认为这是与观众建立信任并展示计算可视化背后的过程的一个很好的方式,特别是当声称知道任何事情的“最好”时。
Try out manipulating the data for yourself here.
布丁还发布了一份关于 pup 音乐的惊人数据分析,题为“流行歌词越来越重复了吗?”。剧透:他们绝对是。但是他们计算的方法是使用数据分析和算法的一个很好的例子(也是很好的 scrollytelling )。
我很欣赏这篇捍卫饼状图的中帖。我认为作者在这里提出了一些很好的观点:在数据 vis 世界中,我们都喜欢讨厌饼图,但有时这有点像在体育课上找那些不能像大孩子一样运动的书呆子的麻烦。简要总结:“饼图是讲述简单故事的简单生物。”有时候这就是你所需要的。现在仍然不可否认有一些非常糟糕的饼状图,但有时简单也可能是好的。
围绕这篇大胆的中型文章有一些讨论:“静态可视化不存在”。我理解作者的观点,我也同意静态的视觉化图像在你阅读时仍然有一种与生俱来的运动感。但是从实践的角度来看,当考虑如何最好地利用数据进行设计时,静态和交互仍然是一个真正的区别。
对于那些希望用数据构建交互的人来说,丹·斯坎隆为为什么使用 D3 和 React 而不是任何其他组合提供了一个很好的论据。
说到 d3,谷歌的 UX 工程师伊恩·约翰逊发布了一篇名为“D3 . js 的搭便车指南”的中型文章,给那些想了解更多 D3 的人。这是一种更容易进入 d3 API 文档的方式,可以让你思考 d3 比例、D3 形状、D3 选择等等。
《经济学人》的数据新闻部举办了一场 Reddit AMA 会议。浏览对《经济学人》如何在新闻报道中使用数据的一些有趣回答。该团队使用 Python 和 R 进行数据分析,使用 Adobe Illustrator 进行静态图表分析,使用 D3 进行交互。
最后,一个 Spotify play 能给你买多少扁豆?居然有人发现了。感谢/theydithmathsubred dit(也许是有趣的数据板?)我们都更清楚 Spotify 上的一部剧值多少钱。
数据集和其他资源
政治本周发布了一份所有未经授权访问白宫的公共数据库,引起了一些轰动。
透明国际发布了他们最近的清廉指数数据集。可以在 data.world 上查询数据集,英国排名第十。你也可以看看每个国家在历史上的排名。
来自调查报道中心的出版物和播客 Reveal 发布了一个数据集,被描述为“公开可用的最详细的边界围栏地图”。每个部分包括围栏的类型和建造时间。
ProPublica 和《消费者报告》(Consumer Reports)最近开发了一款应用,可以按美国的邮政编码显示各家公司的汽车保险保费。他们在分析中发现,在少数族裔社区,一些保险公司收取的保费比白人社区高出 30%。你可以在这里下载完整的数据集并查看代码。
Instacart】发布了一个数据集,其中有来自 20 万匿名用户的 300 万个在线订单。哇哦。是时候想象网上购物了。
网购爱好者(以及通常喜欢挖苦人的人)会喜欢这个讽刺亚马逊评论的数据集。
欧盟统计局发布的新数据显示,2016 年宣布为孤身未成年人的寻求庇护者人数比 2015 年下降了约三分之一。2016 年,6.3 万名寻求庇护者在欧盟申请国际保护。新闻发布有按原产国划分的原始数据集。要查看数据,可以尝试用类似 Tabula 的工具快速抓取 PDF。
你看过伦敦数据仓库的英国退出欧盟仪表板了吗?我上周偶然发现了它,尽管处于测试模式(据称),它仍然很容易使用。建议的改进:在每个图表下面包含一个按钮,用于下载可视化数据的 csv 文件(因为开放数据!).
数据可视化
上周出现了许多地图。我不知道为什么,但我也不抱怨。
这张来自 NYT 的动画地图在大规模 WannaCry 勒索软件被发现后不久就在 Twitter 上流传开来。除了时尚和简单之外,我认为使用定时拍摄通过展示这种计算机勒索病毒传播的速度,产生了非常强烈的影响。
看看这张出现在巴拿马报纸上的所有公司的互动 ESRI 地图。
这张来自国家地理的互动地图展示了气候变化是如何影响海平面上升的,这张地图与最近的一部纪录片一同发布。本杰明·施特劳斯(Benjamin Strauss)令人不寒而栗的话道出了一切:“全球变暖的每一点点都会引发海平面上升,这将严重威胁到全世界的沿海城市。每降低几分之一度,就能挽救一些人。”
以前从来没有一条推文完美地总结了美国选举地图的问题。明智地映射朋友。明智地绘制地图。
你见过这个世界贫困钟吗?你应该这样做。他们还在开发一个开放数据 API。
哇,这个情感互动图谱是探索人类五种普遍情感的一种非常酷的方式。
比尔·盖茨在推特上为这个数据大声欢呼,因为它有效地可视化了全球贫困的减少。
我非常喜欢这个展示非洲大象如何消失的互动作品。大象普查显示,在 18 个非洲国家,稀树草原大象的数量在 7 年内下降了 30%。
那些未能参加 2017 年 Viz 大会的人可以观看下面的视频。
上周就这样了。你看到我错过的东西了吗?或者你只是想给我一个数字点头?给我发微博或者在下面留言。下周会有更多的数据。
数据好奇 16.10.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-16-10-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-32655589fd33?source=collection_archive---------3-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 23 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 10 月 2 日那一周吸引我眼球的内容(还有那之后的一周…错过了上周的帖子!).在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。请在媒体上关注我的最新消息。我也是推特上的。
作者说明
我最近一直在思考这个亲爱的综述,并想知道它可能会走向何方:只是时事通讯?还是中等,但是一个月一次?两者兼而有之?陪审团仍在商议,但现在我要说的是:某种变化可能会到来,它将有利于的质量而不是数量。
少即是多。极简主义现在很酷。你明白了。
但闲聊已经够多了。让我们认真对待你真正关心的事情。
好的阅读、分析和教程
第一篇要提到的文章,顶级的:来自 FT 互动团队的优步游戏。👏 👏 👏
如果你还没玩过,现在就玩吧。
我认为这是一个非常有趣的数据项目:人们如何凭记忆画出标志性的标志。星巴克是最搞笑的。最有趣的一点是:尽管所有画画的人都有同样的自信,但年轻人在细节上更准确。
哇,这篇来自《华盛顿邮报》的关于波多黎各挥之不去的黑暗的文章真的很有冲击力。使用深色背景和浅色图表也是一个很好的视觉效果。围绕美丽的数据即故事。
我喜欢《洛杉矶时报》要求读者重写第二修正案的简单互动。随着美国枪支辩论的持续进行,看不到结束的迹象,这是一个聪明而简单的方法来鼓励读者参与到网站上的一篇文章中。另外,第二修正案只有 145 个字符——方便地接近一条推文的长度。
关于枪支暴力的话题,NYT 制作了一个令人惊叹的互动作品,将数据可视化与半自动步枪开火的真实音频相结合。点击这个链接,按下图表上的播放键,你会惊奇地发现以前没有人想到这样做。
Screenshot of the audio chart mentioned above
如果你是韦斯·安德森电影和使用大量数据的视觉论文格式的粉丝,请请帮你自己一个忙,沉迷于这部美丽的机器学习作品,在韦斯·安德森电影中挑选视觉主题。你也可以从的人们那里了解到它是如何制作的。
Screenshot of full piece by Yannick Assogba
虽然我自己还没有机会这样做,但我期待着跟随 Giorgia Lupi 的教程学习如何制作自己的数据自拍。
到目前为止,我们已经熟悉了 charticle 格式:关于this你需要知道的 8 个图表。但是你听说过“宪章”吗?大概不会。即便如此,我还是决定喜欢它。抱歉英语。
数据集和其他资源
自 20 世纪 80 年代以来,美国环境保护署(u . s . Environmental Protection Agency)一直利用遍布全国的监测站发布空气质量数据。点击下载年度数据。
媒体云是一个非常酷的项目,来自麻省理工和哈佛。它在数以千计的新闻来源中爬行,以在故事和句子层面找到关键词和主题。你可以使用他们的仪表板进行更高级的搜索和查看数据。
你以前听说过私有公共空间吗?《卫报城市》刚刚发表了一篇关于遍布伦敦的“伪公共空间”的精彩文章。基本上就是大公司买下公共土地。您可以在此查看私有公共空间数据(在 shapefiles 中)。
如果你还没有读过布丁的最新视觉文章,该文章分析了美国生活中的性别偏见,你现在应该读一读。你也应该在这个方便的谷歌电子表格查看作者发布的原始数据。
NFL 现在是一个两极分化的话题。你知道美国政治中还有什么两极分化的话题吗?大多数事情。
Scrape the data from the NYT piece here if you want it
最近,野火在加利福尼亚迅速蔓延。如果你对这类自然灾害的历史感兴趣,请查看该数据集(最新发布于 2017 年 5 月)显示了自 1984 年以来每年的烧伤严重程度和范围。
卡内基·梅隆大学正在汇编一个人类运动数据集。该数据库包含握手、喝水、大笑、跳舞等动作的视频。听起来像是一个出色的机器学习项目的开始(如果你喜欢那种东西的话)。
这里有一个有趣的数据集:脸书因参与 2016 年选举操纵而删除的五个账户中的 3000 个帖子。准备进入假新闻的兔子洞(真正的假新闻,不是那种假新闻)。
data.world 上有人开始组织一个数据项目,由在网站上发布“有数据支持的新闻”的人组成。可能是一个有趣的资源,可以找到一些你在网上找到的故事背后的原始数据。
数据可视化
本周只分享几个图表,但它们都以自己独特的方式真正引人注目。
《华盛顿邮报》用一个(有点)方框图来解释不公正的选区划分,这是一个创新。
我喜欢这种比较两个百分比的图表风格。如此简单,却又如此有效。
这张图表绝对令人震惊。不是那种美丽的,令人敬畏的方式。有点不知所措。
前面提到的波多黎各的精彩摘录:
这里没什么好看的…等等,十月发生了什么?🙄
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。brb✌.
如果你欣赏这个每周综述,给它几个👏️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以请联系。
数据好奇 17.07.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-17-07-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-2a6766ac54d6?source=collection_archive---------7-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 14 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 6 月 19 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
《美国国家科学院院刊》的科学家发表了一项研究,内容是道德愤怒的推特用户如何在很大程度上保持在他们的政治社交媒体泡沫中。Quartz 发布了他们的分析摘要以及结果的网络图。
上周有消息称一座巨大的冰山从南极冰架上脱落。《卫报》制作了一些精彩的带注释的图表来展示裂缝的进展。我还发现这个展示冰山大小的动画视频很有冲击力。
我发现了这张很棒的 gif 图,它展示了汇总统计数据并不总是能告诉你更多关于全局的信息。你可以在这里阅读关于它的简短博客文章。
上周我发现了一个新的图表库,叫做 FactGraphs。它目前在 Kickstarter 上,主要面向新闻编辑室和学术研究人员。界面看起来很有趣,但不确定我对这个设计的感觉如何。
BrightTalk 将于 7 月 19 日举办一场免费网络研讨会,内容涉及如何将可视化应用于金融数据。
这篇来自华盛顿邮报的关于美国日食的文章有一些令人兴奋的旋转地球仪的图片。
布丁上周制作了一篇关于海豚的视觉散文。人鱼童话和 Flipper by the Numbers 分析是 scrollytelling 的一个很好的例子。再加上作者介绍了一个我没见过的功能:海豚视频和 gif 在栏目工具提示里。
Full piece
安迪·基尔克认为说到实践数据,你应该像记者一样思考。我非常同意他的观点(虽然我可能有点偏颇)。他的简短博客解释了这一基本原理,但它真正归结为好奇心。处理数据就是问正确的问题。
如果你开始使用 R 进行分析和可视化,这篇文章有一些不错的入门包可以帮助你。
需要刮一些 pdf 做数据?我们都经历过。pdf 是每个数据人员的眼中钉,但幸运的是有一些方便的工具来解决这个问题。我自己喜欢 Tabula ,但是这本从 pdf 中提取数据的初学者指南也有很多其他的好选择。
安迪·迪金森(Andy Dickinson)查看了今年 2016 年数据新闻奖开放数据类别的入围作品,以了解它们到底有多“开放”。他的中篇文章指出,这些作品中有一些根本没有完全开放。让数据开放不仅意味着让它可用;这也意味着使它容易和简单的访问。
数据集和其他资源
Data.world 刚刚发布了一个名为 Data Projects 的新功能,它允许您为多个数据集和有关数据的见解提供一个中央工作空间。这也是与其他对数据分析感兴趣的人合作的一种非常酷的方式。在这里阅读如何使用它。
这里有两个你可以参与的数据项目的例子:
如果迈克尔·菲尔普斯和鲨鱼赛跑,谁会赢?在今年的鲨鱼周期间,加入 data.world 上的这个数据项目,帮助找到答案。
UFO&大脚怪目击事件之间有关联吗?分析大脚怪目击数据找出答案。
这是 FiveThirtyEight 在剖析特朗普最狂热追随者的文章中使用的数据集。代码和数据显示,你可以通过各种特朗普相关的子主题上留下的评论来开始连接用户角色之间的点。
FiveThirtyEight 还保留了一个 Github repo ,其中包含数据驱动故事背后的所有数据集和代码。这是一座金矿。
这篇来自世界银行的博客文章展示了如何有效地使用健康、营养和人口数据门户来发现新的人口统计数据。如果你使用大量的世界卫生数据,这是一个很好的数据门户。
我发现这个来自我们世界的关于我们认为我们在医疗保健上花了多少钱和我们实际上花了多少钱的数据的可视化很有意思。你可以下载图表底部的数据。
Interactive version
数据可视化
从南极洲脱离的拉森 C 冰架抢尽了上周惊人数据的风头。
这是我最喜欢的一个:一个将拉森 C 号冰山放在地图上任何地方的互动程序。它还可以个性化数据(试着把它拖到你的祖国,你会大吃一惊)。
这里有一个有用的 3d 块,用于在点状图中显示方向。
这个互动可视化深入挖掘了数据 viz 社区:一个网络图 viz 来自播客数据故事的 100 集。数据故事由 Enrico Bertini 和 Moritz Stefaner 主持。你可能已经猜到了,他们经常谈论数据。
我非常喜欢这张关于合作伙伴一起和分开做什么活动的信息图。最高和最低值是可预测的(夫妻经常一起吃饭,但很少一起工作)。但是中间的一些条形显示了更多的洞察力。
你看过 Mona Chalabi 精彩的手绘数据可视化吗?你应该。我爱他们。它们简单、有效且容易记忆,就像所有伟大的数据可视化一样。
说到手绘图表,来自《泰晤士报》的 Peter Yeung 已经开始做他自己的版本了。但是他所有的图表都涉及某种食物,而不是所有的东西都是手绘的。留意#FOOD4THOUGHT 在他的 Twitter/Instagram 上的反馈。
当然,如果没有温布尔登的可视化,这个星期是不完整的。我期待在接下来的一周会出现更多,但现在享受这一点,即展示费德勒和西里奇的统治地位(这是在他赢得比赛之前)。
有人之前看过德佩切剧情吗?这需要一分钟来完全理解,但一旦你学会如何阅读它,我认为它实际上很酷。
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。我也很想看看你最近在忙些什么。
如果你喜欢这个每周综述,在上面拍一张 ❤️️ 或者与你的朋友分享。下周会有更多的数据。
数据好奇 19.06.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-19-06-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-1882704b698c?source=collection_archive---------6-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 10 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 6 月 12 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
本周的《数据好奇》比之前的版本略短,因为我一直忙于我实际上得到报酬的工作。但仍有一些未加工的钻石有待发现。让我们开始吧。
我非常喜欢石英的数据分析。通过筛选谷歌的大规模快速,抽奖!数据集,他们已经确定了来自世界各地的人们画圆的不同方式,以及这可能会对他们说些什么。有趣和出色的数据使用。
唐纳德·特朗普会让欧洲再次变得自由吗?FiveThirtyEight fame 的 Nate Silver 用投票和选举数据做了一个有说服力的案例。
如果你想展示你的数据肌肉,或者想找到一种实用的方法来应用你的技能,看看 data.world 上的“招聘贡献者”标签。所有带有这种标签的项目都在寻找某种志愿者的投入,由于将数据技能应用到现实生活中的项目总是一件好事,这似乎是一种双赢。
本周,我想起了在进行数据分析时,调查的微妙艺术。Zapier 有一个很好的解释者告诉我们如何最准确地为数据分析写调查问题,以及如何将它可视化。
测谎小组在《大西洋月刊》上发表了他们的另一篇美丽的 scrollytelling 文章。这篇文章对美国来说尤其及时,因为它分析了医疗费用的分布。
NYT 在上周的这篇文章中使用了一些类似的技术:营救移民的努力导致了致命的、意想不到的后果。除了精彩的图片,这个故事擅长以批判和历史的眼光看待我们这个时代的一个定义性故事。
下面推文的标题说明了一切。这项数据分析是高峰-非政治-FiveThirtyEight,并显示了如何使用数据来理解为什么人们喜欢他们所做的事情。
谷歌的慈善部门发布了美国私刑的互动地图。互动网站是一个美丽而令人心痛的方式来讲述一个需要被记住的故事。你也可以在这里阅读它是如何制作的。
保罗·布拉德肖刚刚更新了他的电子书《为记者刮痧》。第二版现在可以在网上获得,涵盖了从使用 API、格式化 JSON 对象到用 Python 抓取网页的所有内容。
这是《印度斯坦时报》数据新闻团队关于为新观众制作互动故事的一个有趣的问题。
我认为这是一个关于在地图上使用注释的非常好的小技巧。传说很乏味,所以尽可能用注解来指出故事。
数据集和其他资源
免费课程提醒!数据记者的 Python:分析政治中的金钱。
上周,英国大选的全部结果开始更新。英国《金融时报》公布了他们 2015 年和 2017 年选举结果的完整数据集。
议会也公布了官方结果和一些总结分析。
上周我发现了 Oyez 数据库,这是一个雷区。Oyez 是一个多媒体档案,记录了自 1955 年以来最高法院的所有音频记录。这也是 WNYC 播客更完美成为可能的原因(如果你对法庭案件很感兴趣,你应该听听:你会喜欢的)。
Vox Media 在 2017 年 3 月 21 日之前发布了一个关于 Vox.com 的所有文章的数据集。
企业主调查每五年进行一次,包括对美国企业和企业主的经济和人口特征的全面考察。点击查看 2012 年的最新数据。
我发现 Resistomap interactive 既迷人又可怕。仪表板风格的互动显示了人类微生物群中哪些药物已经变得越来越耐药。你可以在这里下载数据。
这是洛杉矶所有 191 家公开经营大麻生意的电子表格。
数据可视化
上周令人好奇的数据是大量的政治数据。本周,我想更多地平衡一下,但首先,这里有一些来自英国《金融时报》的非常好看的选举地图。
好了,大选正式结束了。
宗教和政治:感恩节餐桌上臭名昭著的禁飞区。但是这些 NYT 的数据以及对宗教领袖政治倾向的分析将会引发一些有趣的争论。
不过,数据可视化并不总是与政治/宗教的悲观情绪有关。也可以很时髦。比如这个:
特朗普反对鳄鱼是我最喜欢的图表。
我发现这张关于我们一生中与谁共度时光的图表非常有趣,但也有点悲伤。出于某种原因,一旦你成年,和朋友在一起的时间似乎就没有了。
哇,这个来自选民研究小组的报告真的出来了。举个例子,副标题是:关于美国身份的辩论如何影响了选举,以及这对特朗普总统任期意味着什么。结果非常值得一读,并且有一些很好的可视化(尽管更多的是从学术角度)。这是我最喜欢的:成为美国人标准的重要性。呀…看看那些棕褐色的小点落在哪里。
Voter Study Group: Race, Religion and Immigration in 2016
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。我也很想看看你最近在忙些什么。
如果你欣赏这份每周综述,就在上面画一颗心,或者与你的朋友分享。下周会有更多的数据。
数据好奇 2017 年 9 月 20 日:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-20-09-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-5281deb27d13?source=collection_archive---------9-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 20 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 9 月 13 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。请在媒体上关注我的最新消息。我也是推特上的。本周有点短暂而甜蜜,但让我们尽情享受吧。
好的阅读、分析和教程
读完这篇关于数据科学的十大谬误的帖子,我笑了。不是因为他们很可笑(他们实际上是正确的),而是因为我遇到了他们。所以。很多。时代周刊。我最喜欢的列表:我将下载的数据将是一致的(lol,耶对)。
偶尔被提醒一下基本知识是有好处的。这里有 7 个你应该永远避免的致命统计错误:
寻找一个使用 Python 和 Selenium 进行 web 抓取的简单入口?看看这篇关于如何抓取谷歌搜索结果的中型文章。
为你的书呆子朋友寻找圣诞礼物的想法?已排序。
这是一篇关于绿色和平组织如何利用 CARTO 通过数据可视化对抗石油巨头的精彩文章。你知道最大的一次泄漏持续了 17 个小时,并向卡拉马祖河倾倒了 100 万加仑原油吗?
Paul Bradshaw 写了一篇的评论来回应 Alberto Cairo 上周有争议的推文,称“讲故事”应该被禁止出现在数据新闻中。虽然 Cairo 的不满主要是针对该术语的语义,但我同意 Bradshaw 的观点:尽管该术语已经变得不完美,但我们需要通过讲故事来洞察数据。仅仅因为这个术语被一些人曲解,并不意味着我们应该完全抛弃它。我们应该做得更好。
本周最令人印象深刻的综合互动故事是弗雷德里卡·弗拉加潘的作品线后的故事。美丽的数据,即惊人的动画和对细节的关注。这里有一个 gif 预览图作为引子:
谷歌新闻实验室刚刚发布了一份关于 2017 年数据新闻状况的新报告。点击阅读博文点击下载 PDF 报告。
这是一篇来自 Storybench 的非常有趣的文章,讲述了新闻图表如何可视化今年的飓风。
数据集和其他资源
阳光基金会分析了美国超过 21,000 个开放数据门户网站,根据数据查看和下载量对最感兴趣的领域进行评分。他们发现,警察和犯罪构成了最受欢迎的开放数据集,其次是交通和紧急电话。点击阅读其余结果。
CAFOs 是坏消息。对动物和人类来说。探索由人道联盟编辑的美国 CAFOs 数据集,发现有助于改善农场动物和农产品生活的见解。
你是 xkcd 漫画的粉丝吗?您知道您可以使用 JSON 接口自动获取它们吗?没错。你可以。
民主基金选民小组发表了一份 2016 年选民选择和态度的报告。您可以在页面查看完整的调查数据。
数据可视化
美国地质勘探局发布了一份惊人的延时数据,即显示飓风“艾尔玛”路径和降雨量的动画。
USGS
哦。这张来自 NYT 专栏的图表显示了白人福音派基督徒对川普总统违法行为的宽容程度。
看看这篇匿名的西印度群岛之旅的视觉日志。这是 1815 年的。数据是旧的。真的老了。
很对你是马腾·兰布莱茨,很对。我也喜欢金融时报的这张图表。仅仅因为你有地理数据并不意味着你应该绘制地图。让数据决定你的图表类型。
NYT 绘制了袭击墨西哥城的 7.1 级地震迄今造成的损失。
英国《金融时报》的大卫·布拉德在推特上对德国 AfD 的传播做了一些很好的网络图表。
我认为这是卫报数据团队关于英国债务的一次非常好的互动。输入你的邮政编码可以让你看到你所在地区的人均消费信贷是多少。这可能会让你感觉更好或更差,所以使用时要自担风险。
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。下周回到✌.
如果你欣赏这个每周综述,给它几个👏️️ 或者与你的朋友分享。我也很想看看你最近在做什么,所以 保持联系 。
数据好奇 2017 年回顾:去年我最喜欢的数据故事、数据集和可视化
原文:https://towardsdatascience.com/data-curious-2017-year-in-review-my-favourite-data-stories-datasets-and-visualisations-from-last-4214bf634f56?source=collection_archive---------3-----------------------
又见面了。我从漫长的圣诞假期中回来了,并准备好拥抱 2018 年必须提供的最好的数据驱动的故事。
但首先,回顾一下。
八个月前,我开始每周发布我最喜欢的图表、交互式数据可视化、数据新闻、古怪的数据集和数据分析工具。起初,这只是对我而言:我喜欢每周寻找故事(主要通过 Twitter),它是激励我从事工作的一个很好的参考点。
快进到 2018 年,我发现至少有 2000 人和我一样喜欢在网上发现新的数据。所以,对于那些和我一起乘坐 Medium 的人,我想说几件事:真诚的感谢你们,抱歉过了这么久,我没有忘记你们,新年快乐!2018 年将会是美好的一年。
好了,手续结束了。现在说点好的。去年,我(在很大程度上)坚持每周发布我在网上找到的最好的数据。“数据好奇”2018 年的计划仍在进行中:但作为去年的一个很好的结尾,我想拿出一些在过去几期“数据好奇”中展示的最好的作品。2017 年最好的。你知道该怎么做。
最佳读物
让我们直接进入正题。
NYT 通过问“你能在地图上找到朝鲜吗?”向世界展示了美国人在世界地理方面有多糟糕。更有趣的是,他们把这个数据和那些更喜欢外交而不是其他东西的调查数据放在一起。似乎更好的地理技能=更倾向于外交(但我们先不要跳到因果关系上)。
[## 如果美国人能在地图上找到朝鲜,他们更可能倾向于外交手段
朝鲜在哪里?以下是来自 1746 名成年人的猜测: (用韩语阅读。)只有 36%的人答对了。这是…
www.nytimes.com](https://www.nytimes.com/interactive/2017/05/14/upshot/if-americans-can-find-north-korea-on-a-map-theyre-more-likely-to-prefer-diplomacy.html)
Full piece here
你如何画一个圆?仍然是 2017 年我最喜欢的互动故事之一。从好奇心开始的一个很好的例子(画一个圈能说明一个人的文化吗?)然后众包数据去发现。
[## 你如何画一个圆?我们分析了 100,000 幅画来展示文化是如何塑造我们的本能的
让我们做一个快速练习。你准备好了吗?在下面的方框里画一个圆。别想太多!你是从…开始的吗
qz.com](https://qz.com/994486/the-way-you-draw-circles-says-a-lot-about-you/)
FiveThirtyEight 发表了一篇关于美国人死亡 25 年的漂亮分析。病态,但很美。
[## 美国死亡 35 年
我们的地图显示了自 1980 年以来美国各县主要死因的估计死亡率。
projects.fivethirtyeight.com](https://projects.fivethirtyeight.com/mortality-rates-united-states/)
NYT 图形团队的一些令人印象深刻的地图。
[## 随着气候变化,南部各州将比其他州遭受更多
随着美国在未来几十年面临全球变暖,并不是所有的州都会受到同样的影响。缅因州可能…
www.nytimes.com](https://www.nytimes.com/interactive/2017/06/29/climate/southern-states-worse-climate-effects.html)
增强非现实能否解决移动可视化?多米克似乎是这么认为的。这篇关于 AR 如何取悦更多个性化数据的中型帖子有一些非常令人兴奋的想法。
[## 增强现实能否解决移动可视化?
自从第一代 iPhone 问世以来,移动设备上的数据可视化似乎很有前途:非常强大的便携式…
hackernoon.com](https://hackernoon.com/can-augmented-reality-solve-mobile-visualization-f06c008f8f84)
布丁今年发表了大量惊人的作品。但这一个似乎比其他的更让我着迷:分析电影剧本,寻找电影中的性别刻板印象。
[## 她咯咯地笑,他飞奔
2016 年 4 月,我们按性别分解电影对白。这篇文章提出了一种不平衡的现象,即男性提供了更多的…
布丁,酷](https://pudding.cool/2017/08/screen-direction)
我最喜欢的年度气候变化互动作品是“你解决它:你能保持在世界碳预算之内吗?”在 NYT 旁边。该软件允许用户估计从现在到 2100 年世界主要国家和地区的碳排放量。用户输入、改变滚动可视化和不同颜色的投影线图的组合是一个非常有效的组合。
[## 观点|你解决它:你能保持在世界碳预算之内吗?
注:模拟程序显示了 2100 年不同情景下的二氧化碳排放量预测:不变:各国采取…
www.nytimes.com](https://www.nytimes.com/interactive/2017/08/29/opinion/climate-change-carbon-budget.html?mtrref=undefined&login=google)
《线后的故事》在很多方面都是开创性的,但尤其是它通过编织六个不同难民的旅程来讲述故事。
有点奇怪,但我仍然很喜欢这个项目。利用机器学习,他计算了英国议员的平均脸型。
[## 我计算了一位英国议员的平均脸型,以下是我的发现
英国议会数字服务最近发布了一份由摄影师拍摄的议员官方肖像档案…
medium.com](https://medium.com/@puntofisso/i-calculated-the-average-face-of-a-uk-member-of-parliament-and-heres-what-i-found-37f31b72b5d9)
2017 年将永远被人们记住,因为在 2016 年大选后,每个出版商都轮流发表“媒体搞错了”的专栏文章。FiveThirtyEight 的内特·西尔弗(Nate Silver)的这段话让我觉得是从统计学角度来看最合理的分析。
[## 媒体有一个概率问题
这是一系列评论 2016 年大选新闻报道的第 11 篇也是最后一篇文章,探索如何…
fivethirtyeight.com](https://fivethirtyeight.com/features/the-media-has-a-probability-problem/)
韦斯·安德森的对话+电影摄影+机器学习=这是一个不可思议的滚动故事,涵盖了安德森四部顶级电影的视觉主题。一些我最喜欢的东西的组合。
[## 机器视觉
说真的,看看这个故事。clome.info](http://clome.info/work/machine-visions/)
最好的数据集/工具
这是新的一年,但这并不意味着你不能找到一些 2017 年的伟大数据集来玩。以下是一些最好的开始:
布丁的故事电子表格(大部分时间包含每个故事的数据集)。
Tableau 的人用他们的数据集做了类似的事情,这些数据集来自#改头换面星期一挑战:
[## 数据集|改造星期一
3 1 月 16 日唐纳德·特朗普在选举期间转发的 294 个账户数据来源:特朗普推特档案注:请…
www.makeovermonday.co.uk](http://www.makeovermonday.co.uk/data/)
Instacart 发布了一个数据集,其中包含来自 20 万匿名用户的 300 万个在线订单。
[## Instacart
Instacart 一小时杂货配送
www.instacart.com](https://www.instacart.com/datasets/grocery-shopping-2017)
这是联合国世界粮食计划署的全球粮食价格数据集。
[## 全球粮食价格数据库(WFP) -人道主义数据交换
全球食品价格数据库拥有 76 个国家和一些地区的食品价格数据(如豆类、大米、鱼和糖)
data.humdata.org](https://data.humdata.org/dataset/wfp-food-prices)
每个季度,国会都被要求披露所有发生的游说活动,包括游说了哪些机构,涵盖了哪些主题,以及游说者获得了多少收入。你可以在这里下载众议院和参议院的数据集。
[## 大厅公开搜索
默认情况下,搜索结果显示在搜索按钮下方的网格中,并按房屋 id 以升序排序…
disclosures.house.gov](http://disclosures.house.gov/ld/ldsearch.aspx)
未来你的工作自动化的可能性有多大?702 个 SOC(标准职业分类)工作的数据集,它们自动化的可能性,以及每个州的工作数量可以提供一些线索。
[## 各州的职业和自动化的可能性
像我之前的数据集一样,这个数据集列出了 702 个 SOC 工作,它们自动化的可能性,以及每个工作的数量…
数据世界](https://data.world/wnedds/occupations-by-state-and-likelihood-of-automation)
佛罗里达监狱犯人纹身的公共数据库。
[## 对 OBIS 数据库的公共记录请求
回顾关于累犯率、佛罗里达监狱服刑时间、暴力职业罪犯、死囚区的最新统计数据…
www.dc.state.fl.us](http://www.dc.state.fl.us/pub/obis_request.html)
宣言项目已经为来自世界各地的数千份政治宣言的中央数据库编码。数据跨度从 1945 年到 2015 年,包括 1000 多个政党,覆盖 50 多个国家。
[## 宣言项目数据库
编辑描述
宣言-项目. wzb.eu](https://manifesto-project.wzb.eu/)
大脚怪目击数据集。不,不是玩笑。
[## 大脚怪目击-由 timothyrenner 提供的数据集
来自大脚怪野外研究者组织(BFRO)的全文和地理编码目击报告。
数据世界](https://data.world/timothyrenner/bfro-sightings-data)
在美国,超过 19,000 家餐馆和企业提供包含“taco”或“burrito”的菜单项
[## 美国出售墨西哥卷饼和墨西哥玉米卷的餐馆-由 datafiniti 提供的数据集
在美国,超过 19,000 家餐馆和企业提供包含“taco”或“burrito”的菜单项
数据世界](https://data.world/datafiniti/restaurants-burritos-and-tacos)
自 2005 年以来西雅图公共图书馆借出的所有实物记录。
[## 按标题结帐(实体项目)|西雅图市开放数据门户
编辑描述
data.seattle.gov](https://data.seattle.gov/dataset/Checkouts-by-Title-Physical-Items-/3h5r-qv5w)
一个致力于围绕 Airbnb 可能对住房市场造成的潜在危害“为辩论添加数据”的网站。
[## Airbnb 内部。为辩论添加数据。
Airbnb 内部是一套独立的工具和开放的数据,允许你探索 Airbnb 在城市中是如何使用的…
insideairbnb.com](http://insideairbnb.com/)
Face-O-Matic 是一款通过电视新闻片段抓取的软件,用于分析特朗普和美国参众两院各领导人的屏幕时间(所有数据均可下载)。
[## Face-o-Matic 数据显示特朗普占据主导地位-福克斯关注佩洛西;MSNBC 以麦康奈尔为特色
去年夏天,电视有线新闻节目每十分钟就会在屏幕上出现唐纳德·特朗普总统的脸…
blog.archive.org](https://blog.archive.org/2017/09/06/face-o-matic-data-show-trump-dominates/)
媒体云是麻省理工和哈佛的一个非常酷的项目。它在数以千计的新闻来源中爬行,以在故事和句子层面找到关键词和主题。
[## 欢迎来到媒体云
一个研究媒体生态系统的开源平台。
mediacloud.org](https://mediacloud.org/)
最好的数据可视化
图表、图形、地图、网络:2017 年我最喜欢的数据图形。
这个来自 NPR,因为它马上引出了一个问题:美国在 T2 那边做什么?
NPR
英国《金融时报》一张精彩的 gif 图,讲述了土耳其政变的故事。
世界贫困时钟无疑是 2017 年我最喜欢的实时数据工具之一。
使用数据探索情绪。
Explore full interactive from Ekmans
我喜欢布丁上的这个滚动步骤图婴儿出生时间(故事数据可在此下载)。
The Pudding
另一个伟大的 gif 图表:一个完整的故事,在一个图表中。
2017 教会了我们很多东西,但重要的一条是这个:我们。需要。敬。正常化。Choropleth。地图。
来自英国《金融时报》的旋转 D3 球。
这是一个非常棒的互动:用户可以将拉森 C 号冰山放在地图上的任何地方,以透视它的大小。
组合图!必须爱他们!地图+坡度图(第 1 页,共 3 页)。
垂直折线图+报价(第 2 页,共 3 页)。
条形图+气泡图(第 3 页,共 3 页)。
The Economist
本年度最具影响力的气候变化图表之一:
布丁在他们关于美国微型啤酒厂的文章中使用了旋转散点图后,卫报做了他们自己的拍摄,我很喜欢。
你还记得 2017 年的日食吗?你还记得 Twitter 上弹出的所有关于日食路径的精彩恶搞地图吗?
你还记得特朗普和 NFL 之间的那件疯狂的事吗?没错。那真的发生了。
我认为我选择的最美的图表设计是这篇关于巴西政府在联邦烧烤上花费多少的调查文章。在条形图中结合火热的视觉效果和火焰是天才之举。
Full story here.
就是这样!但实际上,我只触及了表面。如果你还在寻找更多的灵感,可以点击一下我以前出版的《数据好奇》。2017 年是有趣的一年(有时)。为 2018 年更多的数据故事、数据集和数据可视化干杯。
如果你欣赏这个综述,给它几个👏️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以请联系我。
数据好奇 21.08.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-21-08-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-366b8101545b?source=collection_archive---------7-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 18 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 8 月 14 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。让我们开始吧。
好的阅读、分析和教程
这份数据分析报告对纽约市的所有树木进行了非常智能的绘制。作者将数据标准化,以调整每个人口普查区域的大小,从而解释人口密度。你可以在纽约树木网站下载自己的数据。
Full piece here
Josh Devlin 写了一篇关于如何使用 pandas 分析和清理大型数据集的教程。这是他的博客文章,讲述了如何做到这一点,并将数据帧的占用空间减少 90%。
这是一篇非常酷的关于如何像 NYT 互动新闻开发者一样设置你的电脑的文章。莎拉·西蒙。
Quartz 创建了一个及时的新闻互动,允许用户输入邮政编码来找到附近所有的邦联纪念碑。
这张来自 NPR 的图表显示了对歧视的看法如何与反对川普的投票密切相关,这很有意思。这些数字来自公共宗教研究所的研究。我的意思是,尽管这并不意味着任何因果关系,但这条趋势线非常有趣。
NPR
作为我最终论文研究的一部分,我已经阅读了不少关于数据在新闻业中的作用的学术文章。这篇名为“新闻和新闻教育中的数据和统计状况:问题和争论”的论文现在塞满了我黄色的亮点和笔记。对于任何对算术教育在成为基于数据的索赔的聪明/计算消费者中的作用感兴趣的人来说,这是一本必读的书。
本教程是一个很好的关于使用 SQL 命令的介绍,特别是对于那些经常使用 Google Sheets 的人。
如果您没有将以下页面加入书签,您应该。这是用于数据分析和可视化的最有用的#ddj 工具的中心资源。
CARTO 写了一篇有趣的博文,概述了他们在联合国与 200 名地理空间专家就实现可持续发展目标举行的会议。他们的建议包括使用新数据,进行新的数据分析和接触新的受众(很多“新”东西)。
如上所示,数据可以成为造福世界的强大工具。但上周表明,不幸的是,它也可以用来针对弱势群体。《卫报》的报道最近披露,英国内政部获得了一份由大伦敦当局根据无家可归者的国籍绘制的地图。内政部随后利用这些信息将欧盟公民驱逐出境。撇开政治不谈,这种由社会工作者收集的敏感信息是为了获得支持,而不是政府的大规模驱逐。
Mapbox 的团队发布了一篇有用的文章,介绍了如何为您的数据选择正确的地图可视化以及原因。作者涵盖了四种主要的地图类型(点密度,choropleth,hexbin 和 heatmap),包括一些使用每种地图的好情况。
增强现实能否解决移动可视化? 多米尼库斯·鲍尔似乎也这么认为。他关于 AR 如何产生更多个性化数据的中型帖子有一些非常令人兴奋的想法。任何数据可视化设计师都会体会到手机屏幕空间不足的痛苦。但请将这段引文视为整篇文章的引子:
“AR 基于摄像头的物体识别的美妙之处在于,整个世界都成为了这些数据的接口:只需看一眼就能获得更多信息。”
有没有想过用神经网络做实验?现在你可以了,只需要 30 个喜欢的代码。这篇中篇文章将带你了解制作自己的简单神经网络的步骤。
我喜欢读这篇关于一位天体物理学家如何利用美国国家航空航天局的数据绘制了一张美国种族多样性的极其详细的地图的文章。你可以亲自查看完整的互动地图这里。
这里有一个超级简单的教程,教你如何用两个 SVG 三角形和 react.js 的几行代码制作一个进度条
数据集和其他资源
上周发表的许多关于美国现存邦联纪念碑的新闻都引用了南方贫困法律中心编制的数据库。这个组织最初创建了一个研究邦联纪念碑的互动地图显示他们的立场。你可以在他们的 CARTO 个人资料页面下载这些地理数据。
记录美国是一个致力于存储超过 150,000 份报纸的信息和数字副本的网站。它是由国会图书馆经营的。你可以使用他们的 API 搜索旧报纸,或者直接进入批量数据集。
上周,我在 Airbnb 上发现了,这是一个致力于围绕该公司可能对房地产市场造成的潜在危害“为辩论添加数据”的网站。该网站托管了多份通过分析数据生成的报告,你也可以自己获取数据查看 Airbnb 公寓的房源、评论、日历和邻居。
1880.出于某种原因,今年标志着我们所有现有气候数据的开始。但是为什么呢?原因如下:
拦截组织上周发布了他们正在进行的审判和恐怖数据库的更新。他们的互动数据展示了美国因可能的恐怖行为起诉了谁以及为什么起诉。您可以在他们的 Github 页面上以 CSV 格式下载人口统计案例详情数据。
这里有一个页面,包含美国原油供应和出口的每月更新(及其去向)。
上周,当我偶然发现 Open Data Soft 的全球 2600 多个开放数据门户网站的综合列表时,我开始了对开放数据的研究。这个网站和你想象的差不多,但是更好。页面顶部有一个交互式地图,让您可以找到每个国家的数据门户和找到它的链接。#已加入书签。
如果你想参加“太阳奇观”地图挑战,现在是你最后的机会。Data.world 创建了一个完整的项目页面专门用来突出显示最好的日食地图。
对于更严重的日食相关数据集,请查看美国宇航局的全日食形状文件。
为了获得更多与空间/天气相关的数据,有人汇编了一个数据集,包括所有已知的未来可能会经过地球附近的小行星。
英国国家统计局发布了一份关于英国人度假习惯的报告,将 20 世纪 90 年代与现在进行了比较。你可以在这个页面下载他们各种图表的数据。
显然,15.4%的美国人没有在 2016 年的选举中投票,因为他们“不感兴趣”…叹息。这个来自溢出数据的可视化还有其他原因。您可以通过单击 Tableau 仪表板右下角的下载按钮来下载数据集。
数据可视化
几个 Tableau 向导上周正在完成他们的#IronViz 条目。Lorna Eden 为《老友记》的每一季制作了一个交互式 Tableau 练习册。
不过,我个人更喜欢《星球大战》中的这部。
和另一个 Tableau 仪表盘,但这个不是为#IronViz 准备的。我真的很喜欢它。我对径向可视化很着迷。
AJ 实验室发布了一个很好的数据引导的解说视频,展示了英属印度是如何分裂的。
我在上周的新闻中注意到另一个创新的地图选择,这次是来自《金融时报》,而不是 NYT。地图很棒,但也许它们应该只用于更大的屏幕?
这是英国《金融时报》提供的日食地图,包含了大量的财务信息。
这张地图不太关于数据可视化,更多的是关于简单奇异。这是一个从 1920 年开始创建一个和平的欧盟的合理提议。
这张有趣的猫王脸部热图显示了 Youtube 上他最热门歌曲播放列表中每首主要歌曲的大致节奏。点击一个格子会打开这首歌的 Youtube 视频。
为@sarahslo 大声喊出来,因为它在 DataViz 中创建了这个女性 Twitter 列表。截至上周已有 181 名会员!
[## @ Sarah SLO/Twitter 上 DataViz 的妇女
从突发新闻和娱乐到体育和政治,通过所有的现场评论了解完整的故事。
twitter.com](https://twitter.com/sarahslo/lists/women-in-dataviz)
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发推特或者在下面留言。
如果你欣赏这个每周综述,给它几个👏️️ 或者与你的朋友分享。我也很想看看你最近在做什么,所以 保持联系 。下周会有更多的数据。
数据好奇 22.05.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-22-05-2017-a-roundup-of-data-stories-datasets-and-visualisations-from-last-week-e2624c01598a?source=collection_archive---------8-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 6 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 5 月 8 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
上周,我在《每日文摘》中发现了这篇名为“设计更好的数据表”的精彩文章。如果公司(尤其是政府)遵循其中的一些准则,数据记者和/或科学家的工作将会容易得多。正如作者所写的:“如果没有可视化和对数据采取行动的能力,数据是没有意义的。”本周必读。
在英国的数据新闻中,在全球开放数据排名中,英国将跌至第三位,落后于澳大利亚和台湾。全国房地产经纪人协会最近表示,英国空气质量数据可能很快成为房地产广告的强制性部分。最后,Buzzfeed 的数据分析显示了为什么大多数英国人不愿意进入房地产市场。图表本身就说明了一切,但我也认为,与一系列一遍又一遍的相同条形图相比,在可视化这些数据方面可以投入更多的创造力。
这是一个真正有趣的辩论开始。彭博的数据分析让我想起了来自一个假设的许多问题:“亚马逊不考虑顾客的种族。应该吗?”。但是我认为一个好的数据分析有时会带来更多的问题而不是答案。该作品中的地图是交互式的,允许用户通过亚马逊一日送达功能在主要城市的比赛之间进行筛选。剧透:一日送达的地区几乎全是白人。但是回到附加问题:亚马逊的目标是财富还是种族?还是两者都有?这篇文章有很多很好的出发点,但是做更多的分析会很有趣。
From Bloomberg analysis piece.
这里有一个来自 pomplamouse 乐队的有趣的帖子,描述了他们在 28 天的巡演中赚了多少钱(也赔了多少钱)。这是对作为独立乐队巡回演出背后的数据的一个很好的窥视,也可能是对作为巡回音乐家背后的经济学的一些见解的开始。
我发现这个关于数据科学家最佳资源的 Quora 帖子很有趣。这是工具和建议的混合,但大多数答案都包含了一些实际项目的建议,而不是理论练习。
Mike Bostock 刚刚发布了 d3.express,他称之为“集成发现环境”。我还没有能够深入到所有的文档中,但是因为它来自于数据可视化的教父之一,我确信它不会让人失望!
这是一份来自 fivethirtyeeight 的关于美国各县预期寿命的伟大数据分析。自 1980 年以来,美国大多数州都提高了整体预期寿命水平。但在县一级,很明显某些地区正在逆这一趋势而行。我也非常喜欢美国地图形状的折线图作为一种数据 vis 展示风格。
FiveThirtyEight
开放数据研究所利兹发表了一篇博客文章,提倡使用基于六边形的地图来可视化选举数据。这是对该工具的一个很好的介绍,也非常及时(距离英国大选还有 16 天!).
很多人都在谈论这篇 NYT 的文章,这篇文章显示了有多少人在地图上找不到朝鲜。但更重要的是,调查发现在地理上能找到和找不到这个国家的人之间有一个关键的区别:36%能成功找到朝鲜的美国人“更有可能不同意美国不应对朝鲜采取任何行动的主张”。地理很重要(尽管,可以说,伴随普通地理知识而来的其他东西也很重要,所以我们现在不要讨论相关性/因果关系)。
今天的人们有多幸福?这份最近来自《我们的世界》的幸福和生活满意度报告试图找到答案。完整的报告包括许多快速图表和地图,另外,如果你愿意,你可以自己下载所有的原始数据。
你知道有一本专门研究数据可视化的新杂志吗?相当酷。
[## market Cafe Mag(@ market Cafe Mag)| Twitter
来自 Market Cafe Mag (@marketcafemag)的最新推文。关于数据可视化的杂志。讲述…的故事
twitter.com](https://twitter.com/marketcafemag)
数据集和其他资源
上周出现了一些非常有趣的数据来源。让我们按照出现的时间顺序开始。
与去年同期相比,欧盟对世界其他地区的出口增长了 13%,达到 2023 亿欧元。这意味着€在贸易商品方面有 309 亿英镑的顺差。欧盟统计局的新闻稿包含了更多 PDF 格式的国际贸易历史数据。
你读过关于勒索软件的文章吗?起初,这似乎不是一个数据集,但有一个 Twitter 机器人正在监视与#WannaCry 勒索软件攻击相关的比特币钱包,并在 Twitter 上发布交易。真的,它很难被挖掘和分析。一个好的开始可能是使用 Python 抓取帐户,或者尝试一个快速的 Google Sheets 附加工具,如 TAGS 或 Twitter Archiver。
Data.world 上有一个联合国教科文组织语言的数据集,按照濒危程度(或者仅仅是灭绝程度)排序。你知道在英国和前英国殖民地,有 906 种濒危语言在使用吗?
观鸟者会对这个自 1970 年以来英国鸟类物种的数据集感兴趣。
谷歌托管了一个来自 QuickDraw 的涂鸦数据集,可以从下面下载。
从另一个不那么轻松的角度来看,这个来自朝鲜的导弹测试数据库将有助于绘制一些有趣的地图。数据包括导弹发射地点、最高高度、行进距离、着陆地点、发射成功/失败等。
这是来自联合国世界粮食计划署的全球粮食价格的数据集。它包含来自 70 个不同国家的 1000 个城镇的食品价格数据,并且每月更新一次。
气候鹰派,这是一个数据集,报告了全球海平面的历史数据。您可以在本页下载数据,或者在地图上预览数据这里。
如果你对分析枪支暴力感兴趣,由《芝加哥太阳时报》披露的数据库中的这个重磅炸弹显示,近 40 万人对他们卷入枪支暴力的可能性(或可能性)进行了评分,分值从 10 分到 500 分不等。
还有其他人知道维基百科语料库数据库吗?它用一句话总结了超过 120,000 个副标题中包含“情节”的维基百科条目。这意味着电影、书籍、戏剧、电视节目——凡是你能想到的。该数据集需要一些语言处理和分析,但这里有一篇来自大卫·罗宾逊的很好的博客文章展示了如何探索它。
今年我没能参加#EIJC2017(欧洲调查性新闻会议和 Dataharvest),但我设法从一周的会谈中在 Twitter 上积累了一些资源。这里有两个数据工具亮点:一个是来自 Maarten Lambrechts 的“日常新闻数据工具”演示,另一个是名为 Map Stack 的工具,用于设计更好看的地图。
你知道有一个工具可以搜索和下载维基百科的浏览量吗?在 Motherboard 的一名编辑发布了一张最近弹劾相关维基百科页面搜索量增加的截图后,我偶然发现了这个便利的工具。
数据可视化
没有上周那么多数据值得一提。显然,我把头埋在了数据的后端,但我想这并不是一件坏事。这里有几件事引起了我的注意。
我喜欢这张来自《华盛顿邮报》的图片,它展示了美国将如何退出巴黎气候协定。作为第二大二氧化碳排放国,美国将加入叙利亚和尼加拉瓜的行列,成为欧盟以外不遵守气候协议规定的国家。
在 Twitter 上向 Elijah Meeks 喊出这个灯泡数据 vis moment:
这里有一个动画饼图 FTW。上周我写了一点关于饼状图如何得到一个坏的说唱,但我认为用一个动画饼状图显示随着时间的变化是一个非常聪明的选择。
我喜欢这个欧洲啤酒仪表盘的画面。在列的顶部使用一个抽头是一个聪明的设计选择,过滤功能让您可以轻松地浏览数据(您也可以通过单击底部的“下载”按钮下载原始数据!).
太阳能工作正在击败煤,伊西米。
好吧,这个 vis 数据一点也不令人印象深刻,但我还是从这个消息中得到了乐趣:
这是经典贫困泡沫图的一个很好的互动画面,但有一个转折:它不是用国家 GDP 来衡量全球贫困,而是比较美国县级互联网接入水平。
上周就这样了。你看到我错过的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。下周会有更多的数据。
数据好奇 2017 年 7 月 24 日:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-24-07-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-9bc8d49e01ae?source=collection_archive---------8-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 15 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 6 月 19 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
上周充满了有趣的学术和实践帖子,涵盖了数据科学、可视化和认知回忆。这是一个密集的综述:希望你能找到有用的东西!
华盛顿大学的研究人员总结了他们最近关于预测可视化如何提高读者的信息回忆和理解的研究。
被提示预测和/或解释数据的参与者比只检查数据但没有明确预测或解释的参与者更准确地回忆起单个数据点 24%。
这种允许用户猜测数据,然后从他们的结果中学习的想法已经在媒体格式中使用,以理解复杂的问题。好的例子包括你画出来:在奥巴马总统任期内什么变得更好或更坏 (NYT)和你如何画一个圆?(石英)。我喜欢这种讲故事的方式,因为它让用户感觉他们在自己学习一些东西。现在, UW 互动数据实验室已经表明,它实际上对回忆也更有效。
Deborah Mesquita 使用自然语言处理对一所巴西和美国大学的学位论文进行了全面的数据分析。她发现,排名靠前的大学的论文比排名靠后的大学更容易被其他人考虑。在媒体上阅读她对的完整报道。
Carto 发表了一篇关于在网络上制作地图的 6 个设计原则的博文。这篇文章提供了一些创建清晰锐利的在线地图的好技巧。一些建议的例子:颜色应该与预期一致,标签应该有层次,位置应该符合地图的意图。
Pudding.cool 发表了一项数据分析,研究了近 35000 个漫画人物的性别表现。Amanda Shendruk 的这个庞大的项目在进行过程中有一些惊人的可视化。我也喜欢使用 8 位神奇女侠在悬停时显示工具提示信息。
公共诚信中心透露,联邦能源监管委员会一直在随意发放天然气管道许可证,丝毫不考虑科学家就环境影响发出的警告。他们的数据分析包括一些非常清晰的地图,显示了管道在阿巴拉契亚地区的分布。
虽然我自己还没有开始使用 R,但上周我偶然看到了这篇关于如何用 tidytext 描述 Twitter 追随者的有用教程,并决定把它收藏起来。你知道,为了将来的某一天,当我有一堆自我完善的空闲时间的时候。本教程一步一步地向您介绍如何在 R 中使用 tidytext 和 ggplot 来分析您的关注者的 Twitter 描述文本。
哇,对于这个来自 ProPublica 的名为移民效应的互动项目,我有太多的好话要说。我认为我最喜欢的部分是副标题讲述故事的方式:
Screenshot of ProPublica analysis.
这是一个将新闻、数据分析和互动故事结合起来的绝佳例子。三赢。我强烈建议点击“驱逐所有非法移民”按钮,看看 GDP 图表会发生什么。
BBC 学院与 BBC 数据新闻编辑约翰·沃顿、卫报数据项目团队编辑海伦娜·本特森 以及伯明翰城市大学讲师兼记者保罗·布拉德肖在新闻编辑室共同主持了一场关于数据新闻重要性的播客。这一集最喜欢的一句话:
没有数据故事。只有故事,使用数据。
这篇名为你说数据,我说系统的中型文章以 Jer Thorp 如何创建连接 9/11 纪念墙上名字的算法为例,就如何整体处理数据项目提出了一些非常有见地的观点。
Quartz 发表了一篇关于制造业和繁荣之间关系的美丽的滚动特写。剧透:数据揭穿了唐纳德·特朗普关于健康制造业=健康经济的几乎所有主张。
有一个新的免费在线教材用于学习数据可视化。你可以以 PDF 格式阅读,但在线版本有使用谷歌工作表、Tableau Public、Carto、Highcharts 等工具的教程视频和演练。
Paul Bradshaw 写了一篇关于如何在 Tableau 中制作树状图的简明教程。他还解释了为什么树形图对于某些类型的数据来说是一个好的选择,以及为什么它是简易饼图的一个好的替代品。
上周,在我的媒体推荐阅读部分,我偶然看到了这篇名为的文章,将我所知道的一切可视化。这篇文章描述了 Tim Stock 和他的团队如何分析和可视化来自设计师和人文主义者 Buckminster Fuller 的 42 小时讲座。由此产生的交互式可视化是为大量内容带来背景和意义的一个极好的例子。通过使用自然语言处理,研究人员能够识别与富勒作品相关的四个主要原型,以及每个能指如何与原型相关联。
Screenshot of Buckminster Fuller interactive
如果你想开始用 Python 编程,维哈尔·鞍马在《走向数据科学》杂志上发表了一篇名为15 分钟 Python 编程的系列文章。他刚刚发布了第 2 部分,第 3 部分也即将发布,所以请密切关注这款强大的数据处理语言的简单介绍。
康纳·杜威发布了一份推特数据分析关于《权力的游戏》新一季发布前一周#GoT 标签的活动。他的代码和数据在 Github 上开源。
最后,如果你正在寻找一篇关于可视化科学方面的长篇学术文章,我强烈推荐这篇关于叙事可视化中的时间摘要图像和注释放置的文章。
数据集和其他资源
本周最喜欢的数据集:美国 19,000 家提供包含“taco”或“burrito”菜单项的餐馆和企业恨不得找个借口把这个作为映射的练习数据集。
《福布斯》上有一篇很棒的文章,列出了如何找到超过 85 个美国城市提供的开放数据门户。
最近发表在《新英格兰医学杂志》上的一项研究显示,全球有 22 亿人肥胖或超重。目前,这大约是世界人口的三分之一。数据和结果可视化可以在 Axios 上的处找到。
据《滚石》杂志报道,金属音乐爱好者应该看看 T2 有史以来最伟大的 100 张金属专辑的数据集。
该数据集包含对全美无家可归者的估计基于各州和历史上的国家时间点测量。
每年 9 月,联合国召集会员国进行一般性辩论,200 个不同的会员国发表演讲,概述政策偏好。一组研究人员创建了一个包含 1970 年至 2016 年 7701 次演讲的转录数据集。你可以在这里下载它或者在这里使用他们的分析和可视化工具。
国际货币基金组织发布了许多不同的报告,但是世界经济展望数据库是最有趣的一个。该数据库包含对一系列指标的预测,包括通货膨胀、失业率、国家间贸易等。你可以从这份报告中找到 1980 年以来的数据。
国家公园服务和间歇泉观察和研究协会合作创建了“互联网上最全面的间歇泉喷发和观察数据数据库”间歇泉时代数据库将喷发数据与历史日志和间歇泉喷发的目击者描述结合起来,构建这种炸丨药(😉)数据库。
还记得华盛顿邮报前几周推出的超级酷的日食地球仪吗?如果没有,请点击查看。可视化很大程度上基于这个数据库,它可以让你生成地图和 KMZ 文件,显示从公元前 2000 年以来的近 12000 次日食。警告:这些文档非常专业。
数据可视化
英国《金融时报》将坡度图和越南地图结合在一起,我想知道为什么我以前从未见过这种情况。将 viz 类型与一些有品味的注释结合起来,给出随时间变化的上下文,这是一个很好的用法。
我很高兴试用这个 SVG 生成器工具,这是我上周在 Twitter feed 中偶然发现的。
从各方面来看,BBC 上周公布了一份显示人才薪酬的令人畏缩的条形图。Twitter 上了解更多的数据人员很快指出了这个误导性的错误:条形图从零开始。句号。以下是 BBC 版本的图表:
然后它看起来像是修正过的,所以 y 轴从零开始。差距不是很大,是吧?
John Burn-Murdoch 展示了 Mike Bostock 的命令行制图结合开放街道地图的强大功能。
这是一个很好的例子,展示了自 19 世纪以来全球月平均温度分布。
Peter Yeung 在 BBC 薪酬报告的后面制作了一些很好的数据分析和可视化。
这是一个很好的例子,它利用图表的页边空白来进行有帮助的注释,推动故事向前发展。
我喜欢这种在肯·弗勒拉格的神圣文本中使用词语的形象化。Tableau viz 使用起来很直观,并且真正鼓励了对数据的探索。寻找不同宗教文献之间的联系和相似之处的概念是可视化的一个伟大的非传统用途。
来自气候中心的互动令人印象深刻。搜索和过滤功能非常流畅,允许用户通过输入他们的家乡城市来个性化气候变化的影响。
我非常喜欢 Ken Flerlage 的《神圣文本》中单词用法的可视化。Tableau 可视化使用直观,并鼓励用户以清晰和引人入胜的方式探索数据。寻找不同宗教文献之间的联系和相似之处的概念是数据挖掘和分析的一个伟大的非传统用途。
Click image for interactive version on Tableau Public (by Ken Flerlage)
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。
如果你喜欢这个每周综述,拍上一张 ❤️️ 或者与你的朋友分享。我也很想知道你最近在做什么,所以 联系 。下周会有更多的数据。
数据好奇 2017 年 9 月 25 日:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-25-09-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-30a40846a787?source=collection_archive---------9-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 21 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 9 月 13 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。请在媒体上关注我的最新消息。我也是推特上的。本周有点短暂而甜蜜,但让我们尽情享受吧。
好的阅读、分析和教程
虽然他之前已经说过很多次了,内特·西尔弗上周写了为什么媒体有一个概率问题。我认为最好的解释是在他的书信号和噪音中,这本书分解了大多数人,包括媒体,在解释统计数据时遇到的更广泛的问题。
缺失数据是出了名的烦人。以下是处理来自 SocialCops 的缺失数据的 4 种有用方法。
自从开始数据好奇,我发现了很多很多不同的图表库。创建您自己的“我应该使用哪个图表?”系统最近似乎很流行。Fast Co Design 最近将其中一个系统描述为“数据可视化的维基百科”。诚然,数据 Viz 项目令人印象深刻,但这是一个相当大的索赔。我认为安迪·基尔克的图表制作者目录本身就非常好。
你以前用过 Tabula 吗?如果你需要从 PDF 文件中提取数据,你应该这样做。查看本教程视频,开始学习。
Giuseppe Sollazzo 创建了一个混搭图,上面有每个英国国会议员的脸,用来计算当选议员的平均脸型。用他自己的话来说(根据他的优秀时事通讯)“我认为完全是小众的黑客行为,结果却被浏览了数千次。”大量使用数据来创造一个没有人想到的故事。
Data Face 和 matthew_daniels 联手为《布丁制作了这篇关于说唱音乐中最多(和最少)‘嘻哈’词汇的有趣文章。
Shirley Wu 做了一个非常元的东西:过去几个月在网上流传的数据 viz 调查的数据 viz。在介质上阅读以查看可视化效果。
嗯…我还是不确定我对这个新的 AtF Spark 字体的感觉。它被描述为“一种在文本中创造火花的字体”,看起来有点像小线条或条形图。我的主要问题是:图表是用来描绘数值或分类值的,所以如果图表只是为了一点趣味,看起来你好像没有抓住要点。那是我太挑剔了。如果你感兴趣的话,这篇博文很好地介绍了如何使用 AtF Spark。
缺失数据是出了名的烦人。这里有 4 种处理 SocialCops 中缺失数据的有用方法。
斯蒂芬·特雷西在媒体上分析了《T2》40 年来的票房成功。这是一个很好的分析,看看票房销售和科幻系列的未来可能会是什么样子。
数据集和其他资源
上周没有多少新的数据集吸引了我,但这里有一些。
上周,data.world 展示了一些关于食品和营养数据的数据集。查看超过 10,000 种不同食品及其成分的数据集。
Alasdair Rae 发布了一个开放的 shapefile 数据集,包含英国的所有建筑。
上周,我想起了一个很酷的票房销售资源(上面提到的斯蒂芬·特雷西的数据分析):票房魔咒是一个很好的地方,可以找到一部电影在首映周末表现如何的数据。
数据可视化
上周,我在脸书的博客上看到了这张来自《我们的世界》的图表,我觉得这个视觉效果太惊人了。这是一个非常聪明的方法来显示相对于其他价格的变化——从 0%开始,然后显示它们如何随着时间的推移而变化。还有,能不能谈谈大学学费和教育是涨价前两位,电视更便宜,这看起来有多倒退??
Our World in Data
下面的 gif 告诉我一件事:沃尔玛正在接管这个国家,并像黑死病一样蔓延。
Reddit r/MapPorn
《华盛顿邮报》报道了一项研究,显示自水危机以来,密歇根州弗林特市的生育率急剧下降。这张图表显示了明显的下降。
以典型的经济学家风格,一张图表显示了缅甸难民外流的情况有多糟糕。我喜欢这个图形中使用的组合:气泡、条形、线条和颜色来对国家进行分组。
信息是美丽奖的参赛作品已经提交。这里是一些正在进行的项目的预览。
自 2007 年以来,NYT 记录了每一个北极海冰最小值。剧透警告:他们正在下降。
英国《金融时报》以非常有趣的方式展示了德国的政党归属。不知道该叫它什么…翻转面积图?填充竖线图?不管是什么,都很酷,我喜欢。
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。下周回到✌.
如果你欣赏这个每周综述,给它几个👏️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以请联系我。
数据好奇 26.06.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-26-06-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-aaa8ae9ab9a9?source=collection_archive---------6-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 11 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 6 月 19 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
关于本周数据的几点说明令人好奇。首先,我想感谢到目前为止一直关注此事的所有人。我非常感谢你的支持。本周你会注意到数据可视化部分可能比平时短,但不用担心:恰好这一部分(好的读物)包括了上周我最喜欢的一些 viz。所以一定要打开文章给他们看看。相比之下,数据集部分特别大,所以找到你最喜欢的数据集,然后开始吧!
这个互动来自于美国死亡 35 周年的 5 月 38 日,有一些很棒的地图。我喜欢它们让你看到随时间变化的方式,尽管看到有多少人实际使用这个功能的统计数据会很有趣。
全球调查新闻网络发布了一份关于 FOIA 状况的报告,并在世界范围内征求意见。该报告还涵盖了开放数据集的可用性。完整的报告和概述可以在这里下载,但是对于一个 TL;博士版,这个节选总结了一下:
只有 7 个国家的政府在其现行政策中默认包含了公开数据的声明。此外,我们发现只有 7%的数据是完全开放的,每两个数据集中只有一个是机器可读的,每四个数据集中只有一个拥有开放许可。尽管自 Barometer 第一版以来,越来越多的数据以机器可读格式和开放许可的形式提供,但全球真正开放的数据集数量仍处于停滞状态。
来自 NYT 的这篇精彩的能源分析文章展示了没有川普绿色能源革命将如何发生。这里有很多很棒的数据,从带注释的地图到小型多线图表。最喜欢的外卖统计数据:2004 年至 2015 年间,内布拉斯加州和阿拉斯加州是仅有的两个增加煤炭净发电量的州。
为什么这么多婴儿出生在早上 8 点左右?好问题。Nadieh Bremer 和 Zan Armstrong 合作筛选数据并找出答案。他们还用《科学美国人》中的一些漂亮的图形来展示数据。完整的分析很值得一读。
世界各地的啤酒消费量正在下降,主要是由于中国、俄罗斯和巴西的下降。
The Economist
在这篇 NYT 的文章中,Gif 热图展示了极端高温如何开始影响我们的日常生活。
NYT
这是一个关于图形符号学的很好的演示平台。每张幻灯片都介绍了信息可视化的不同组件,以及如何使用它们来显示数据。
这是一个关于如何使用 D3 和 Canvas 制作复杂交互的广泛而全面的教程。
受标签#d3brokeandmadeart 的启发,一群人举办了一场基于加拿大魁北克失败数据的新艺术展。你可以在这里阅读他们的首次展览。
下面是来自 Inc.com 的一篇有趣的文章:依赖数据可视化时你需要记住的 5 件事。这里可能有一些需要注意的地方(即作者本人似乎在数据方面没有任何重要的经验)。但我认为她的一些主要观点仍然适用,比如资料来源仍然很重要,图表并不总是讲述整个故事。
数据集和其他资源
本周有很多很棒的数据集值得一提。
这是我之前提到的《美国死亡 538 年》的数据集。
与此相关的是,这是一个很好的健康数据资源:由健康度量和评估研究所提供的我们喜欢的数据站点列表。
data.world 上的这个数据集列出了每一家财富 500 强公司及其多元化数据(或者在某些情况下,缺乏这些数据)。
未来你的工作自动化的可能性有多大?702 个 SOC(标准职业分类)职位的数据集,它们自动化的可能性,以及每个州的职位数量可以提供一些线索。旁注:如果你想要一个如何出色地使用这类数据的例子,请查看英国《金融时报》关于工作自动化的互动。
给足球迷一个:1893 年到 2016 年每一场利物浦足球俱乐部的英格兰联赛结果的数据集。
有些人可能已经知道这一点,但我的数据集发现过程很大程度上归功于我订阅的许多时事通讯。我最喜欢的是 Buzzfeed 数据团队的 Jeremy Singer-Vine 的数据是复数。每周他会发出 3-5 个有趣的数据集,你应该一定要订阅。以下是上周我最喜欢的几个:
一个的公共数据库来自佛罗里达州犯人纹身矫正部门。这里有一个如何分析《经济学人》数据的例子。
宣言项目已经对来自世界各地的数千份政治宣言的中央数据库进行了编码。数据跨度从 1945 年到 2015 年,包括 1000 多个政党,覆盖 50 多个国家。
Libraries.io 发布了超过 2500 万个开源项目的数据集。浏览数据,看看人们最常用的东西可能是什么。
饥荒预警系统网络(FEWS 网)发布了每个国家饥荒风险的地理空间形状文件。这是绘制人道主义问题的一个很好的书签资源。
斯坦福开放警务项目已经记录了美国各州警察部门的交通拦截数据。这个数据库是同类数据库中的第一个,因为没有对交通站点进行例行跟踪。第一次数据发布包括来自 31 个州的 1 . 3 亿行数据。以下是该项目迄今为止所发现的情况。
数据可视化
这张图表上周在社交媒体上引起了一些波澜,这是有充分理由的:最富有的 0.001%的美国人在 34 年的时间里工资增长了 636%。
Business Insider
下面的 d3 show reel gif 展示了动画 d3 图形的威力。但它也引入了一些关于演示的有趣问题:使用相同的数据,图表的选择如何引入对该数据的解释?
啊,是的,正在进行的关于标准化 choropleth 地图的争论(提示:你肯定应该标准化)。
看看这个像细胞一样的大液泡,将 35 年来的世界经济可视化为一个活的有机体。
我认为,有时像维恩图和流程图这样的分类可视化会因为过于简单而受到指责。但有时它们绝对是故事的最佳选择。例如:英国《金融时报》的通往英国退出欧盟之路图。
寻找灵感?这里列出了 7 个数据,即你应该在 Pinterest 上关注的人。
如果出租车旅行是萤火虫,这个就是地图的样子。
高 GDP 和献血人群之间的相关性显然非常高。
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。我也很想看看你最近在忙些什么。
如果你喜欢这个每周综述,拍上一张 ❤️️ 或者与你的朋友分享。下周会有更多的数据。
数据好奇 27.08.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-27-08-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-4c2a1c10b068?source=collection_archive---------10-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 19 周(上周的帖子是这里是)。
特别感谢:上周,你们这些了不起的读者把我推上了 2k 追随者马克的位置,自从我在大约 20 周前发表了我的第一篇数据好奇综述!很憋屈。你们很棒。好了,现在回到我们真正关心的东西:数据的东西。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 8 月 21 日那周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。我下周休假,所以下一次数据好奇将在 9 月 11 日回来。请在媒体上关注我的最新消息。我也在推特上。让我们开始吧。
好的阅读、分析和教程
ProPublica 和谷歌新闻实验室合作创建了一个新的机器学习应用程序,用于报道美国的仇恨。你可以在媒体上阅读他们应用程序的制作,记录仇恨新闻的索引、。
研究恐怖主义和应对恐怖主义的国家联盟制作了一个美国个人激进化的互动仪表板。仪表板允许你筛选美国的各种激进组织,探索哪些是暴力的,人口统计数据是什么,他们住在哪里,等等。您也可以填写表格,在此下载完整的数据集。
这里有一篇安娜·诺布尔写的关于如何改进你的下一个场景的博客文章。
最近,Quartz 越来越多地进入机器人和机器学习领域。关于 NiemanLab 的这篇文章描述了他们的最新项目:一套基于 Slack 的工具,为新闻编辑室创建简单的机器人。
你知道那些帮助你决定选择哪种数据可视化的网站吗?我找到了另一个。这个网站的设计真的很犀利,我喜欢它的互动性。
斯考特·玛瑞出版了他关于用 D3.js 创建数据可视化的新书
对于在 R 工作的数据记者来说,这里有一个不错的资源:。Rddj 是一个中心网页,提供使用 R 改进数据工作流的课程、教程和示例。
我很喜欢阅读数据研究员 Miriam Quick 提出的问题:男人和女人觉得不同的电影有趣吗?即使你不同意这些结果,在这部电影结束时,你至少会有几部电影加入到你的必看名单中。
我以前的一个同学推荐了这个麦克道尔县互动纪录片网站。可滚动的故事带你了解 30 个不同居民的生活,并探索为什么这个县是美国许多经历急剧经济衰退的县之一。漂亮的设计和交互。
反歧视行动最近成为新闻中另一个有争议的话题。《纽约时报》上周发表了一篇数据驱动的报道,展示了即使有了平权法案,黑人和西班牙裔在顶尖大学的代表性也比 35 年前更低。整篇文章中有一些非常有趣的图表,结合了斜率图和一种线形图。
Full story
作为一个经历过非常相似过程的人,我喜欢阅读这篇描述记者如何以及为什么学习编码的博客文章——我的转型故事。作者对代码和数据如何为记者和营销人员引入更好的讲故事形式有一些很好的见解。
Julia Silge 和布丁的团队发表了另一篇精彩的视觉散文。这部电影再次使用了电影剧本,采用了“他说,她说”的方式来揭示最常见的男女角色的银幕指示(提示:不幸的是,正如你所期望的那样,这是性别化的)。
Full story
这篇关于为什么使用统计图来表示人口统计数据是一个好主意的中型文章太棒了。这篇文章解释了当使用错误的地图类型时,如何绘制少数民族的地图。例如,尽管少数民族占美国人口的 26%,但他们在典型的人口分布图中只占 16%。
这里有一个关于的很好的提醒,为什么没有数据可视化分析就什么都不是。虽然我不是 100%同意这一点(洞察力只能通过数据分析获得),但这里有一些很好的观点,说明可视化对于将这些洞察力传达给不同的受众是多么重要,尤其是那些对数据不太熟悉的受众。
数据集和其他资源
本周,data.world 正在推动一个关于新泽西州阿片类药物流行的特别数据项目。这里有一个数据库,列出了从 1999 年到 2016 年全州因阿片类药物过量死亡的案例。
美国国家人文科学基金会(NEH)发布了他们自 20 世纪 60 年代末以来授予的所有资助的数据集。这个数据集可能提供了一个有趣的开端,探索 NEH 似乎把什么项目放在优先地位。
如果你在寻找地理数据来做实验,可以看看这个非洲蚊子数据库。迈克尔·周在推特上发布了一个链接,链接到非洲最大的按蚊地理编码数据库,他应该被 s/o。
如果你正在寻找一个故事,行业新闻网站 journalism.co.uk 发表了一篇文章,为调查记者列出了的 18 个数据来源。
人口参考局发布全球人口数字的新估计:到 2050 年人口将达到 98 亿。
数据可视化
谷歌趋势很快就寄希望于日食地图潮流,这张地图显示(令人震惊的)对日食地图的搜索与日食路径非常接近。
有许多日食后的地图可供选择,所以我会有所选择,只包括一个:这张来自 WaPo 的动画地图显示了飞机如何涌向日食路径。
说到日食相关数据,我被谷歌搜索的线形图逗得哈哈大笑。仔细观察线条图例。
这里有一个有趣的动画地图视频展示了从 2001 年到 2015 年记录的每一次地震。
气候地图册决定绘制过去一个世纪英国气温的变化。我真的很喜欢他们把地图放在一条水平线中的方式,这样它们几乎形成了一种由 choropleth 地图组成的热图。
阿拉斯加的永久冻土正在融化,我对此并不满意。这张来自 NYT 的 gif 动画地图显示了气候变化可能造成的损失,以及这将如何反过来加剧全球变暖。
上周,英国内政部被发现大幅高估了签证过期的国际学生人数。有趣的是,煽动对移民违反签证规则的恐惧的政治言论会对数字产生影响,是吧?
我发现这条推特非常有趣:彼得·库克总结了 7 种绘制选举数据的方法。作为通常显示投票率或党派归属的 choropleth 的替代,这感觉像是一股新鲜空气。
权力的游戏数据即?似乎是合法的。这个 Tableau 仪表板允许你在一个时间线上探索角色的死亡。
彭博公布了迄今为止 SpaceX 每一次发射的漂亮而有趣的带注释的时间表。看来每次新的发射,埃隆·马斯克都离火星越来越近了。我喜欢你滚动时出现在时间轴上的插图和图标。
Full story
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。两周后回到✌.
如果你欣赏这个每周综述,给它几个👏️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以请联系我。
数据好奇 29.05.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-29-05-2017-a-roundup-of-data-stories-datasets-and-visualisations-from-last-week-c5c73894a29c?source=collection_archive---------6-----------------------
欢迎回到我上周在网上注意到的数据驱动事物的每周综述。这是第 7 周(上周的帖子是这里,特别感谢走向数据科学发布帖子!).
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 5 月 22 日这一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
上周有很多关于新闻编码、统计分析、如何处理数据和数据指南的思考。
这里有一个有趣的问题,来自 CJR 的 Quartz 公司的大卫·亚诺夫斯基(David Yanofsky)以记者的身份谈论编码(以及这个角色是如何被广泛误解的)。
这篇名为“统计曲解的七宗罪,以及如何避免它们”的文章应该是任何对统计不熟悉的数据记者(比如我)的必读之作。实际上,我把这个页面加入了书签,因为它有很多很好的提醒,告诉我什么时候应该对图表持怀疑态度,以及如何找出数据中的重大差异。
我真的很喜欢微软数据科学家 Bill Pardi 关于如何对数据进行创新的这篇博文。数据不应被视为固有的真实和有意义的。我们都把自己的一部分带入数据中,通过我们选择如何质疑它。
本周学术数据阅读:Storybench 的“我们从对数据记者、网络开发人员和交互式编辑的三年采访中学到了什么”。
MySociety 上周在 FOI 请求网站 WhatDoTheyKnow 上发布了一篇综述。像任何好的综述一样,他们为你挑选了最有趣的版本,并暗示要定期发布。如果是这样,这绝对是一份每周文摘,可以添加到你的阅读清单中,作为发现隐藏的数据驱动的故事的一种方式。
媒体作者和读者的好消息:平台现在支持嵌入式 Plotly 图表!诚然,Plotly 不是我最喜欢的图表库,但它仍然是一个充满希望的迹象,表明 Medium 正在变得更加交互数据界面友好。
2017 年数据新闻奖的入围名单于上周公布。这一周你所有的阅读、探索和惊奇(如果你还没看过的话)都被整理好了。不客气
Pudding.cool 上周发布了另一篇令人印象深刻的视觉散文。这一次,他们报道了美国的出生率,更具体地说,分析了数据,以揭穿某些“制造婴儿的神话”。如果你想看看海量数据集,在这里下载。
脸书的数据处理人员上周公布了调查结果,地球上每个人之间的平均分离度从 6 缩小到了 3.5。这是一份令人着迷的分析,尽管遗憾的是大多数人(除非你在脸书工作)真的能够亲眼看到这种数据…
这篇关于来自 CHI 会议的 InfoVis 论文的博客文章从提交的顶级学术论文中提取了一些有趣的主题/亮点。这里有一条推文很好地总结了其中一篇论文:
这是本周我最喜欢的学术文章之一。“相同的统计数据,不同的图表”探讨了采用几乎相同的数据集并通过动画以完全不同的方式可视化它们的策略。
还好有人在检查英国保守党宣言背后的数据。保守的文件声称政府可以每年为所有小学生提供 6000 万英镑的免费早餐,但是来自教育数据实验室(他们做了一些伟大的工作)的估计数字接近 1 . 74 亿英镑。
Chart from Education Datalab.
NYT 发布了一份很好的数据互动,展示了川普的预算将如何影响政府的每一个部分。过滤功能很好,但我更希望在通过过滤放大到特定类别之前,看到一个大的、全面的变化。
这是英国《金融时报》关于欧洲最大的数据可视化实验室的一篇有趣的短文。
现在,我们来了解一些有用的操作方法、教程和工具:
Giuseppe Sollazzo 写了一个博客教程,展示了如何在 D3 中创建他的交互式投票摇摆查看器。
Blog post here.
这里有一个关于如何在 Tableau 中构建牛眼图的不错的教程。
以及来自 VizWiz 的关于如何在 Tableau 中创建虚线图表的快速视频教程。
新的 vis 工具提醒!我很兴奋地开始探索如何使用 ChartAccent ,这是一个专门研究数据驱动注释的新可视化工具。用简单的、可点击的拖放注释选项来思考。另外,您可以导出为 png 或 gif 格式。
我上周还发现了另一个名为 Datamatic.io 的 data viz 工具。听说过吗?似乎相对较新,是谷歌新闻实验室资助的数字倡议的一部分。使用一种拖放模板,这似乎是记者在故事中使用数据的一个好的切入点。该程序构建在 d3.js 之上,使用 Google API。但是不确定我是否喜欢这些图表的视觉风格…也许它们可以通过点击式下拉菜单来调整。
此外,开放数据宪章发布了一份利用数据打击腐败的开放指南。
数据集和其他资源
随着他们新的开放数据门户,国民信托正向公众开放更多的数据。他们将发布空间数据集,用于基于 GIS 的制图软件。这是使英国的“新末日”地图成为可能的部分原因。
欧盟统计局刚刚发布了其新的互动可视化工具来预览欧盟各种衡量指标(健康、经济、旅游等)的数据。)视觉效果很好,但乍一看,我找不到一种简单的方法来下载被可视化的数据。不幸的是,这似乎是我发现的许多政府相关数据门户的趋势。
免费电子书提醒数据争论!
美国国会图书馆发布了迄今为止最大的数据集:2500 万份书籍、地图、手稿等记录。
那些对分析国内激进化感兴趣的人会发现这个数据集很吸引人。它包含“关于近 1500 名暴力和非暴力极端分子的背景、属性和激进化过程的去身份化个人层面的信息,这些极端分子在美国坚持极右、极左、伊斯兰或单一问题意识形态”。数据来自马里兰大学的一个团队。
Ben Walsh 宣布了一个新的免费课程,他正在通过 Knight Center 教授如何使用 Python 处理数据。
根据开放数据晴雨表,93%的政府数据集仍然没有开放。
还记得上周我链接到 Twitter 机器人 @actual_ransom 并说如果有人挖掘它的数据会很酷吗?有人做到了。来自 Quartz 的基思·科林斯(Keith Collins)使用区块链的 API 来跟踪支付,他已经在 github 上发布了数据(他也恰好是 Twitter 机器人的创始人,所以我不能因为激发了这些而邀功)。我还发现了这个实时网络抓取工具,以及迄今为止比特币支付总额的 viz 。
精酿啤酒和数据分析似乎变得一模一样:这是为啤酒爱好者准备的另一个数据集,这次来自 CraftCans。超过 2000 罐精酿啤酒的数据集可以很容易地复制到电子表格中,使用 Textminer 这样的工具,或者您可以使用这个脚本。
数据可视化
哇,神奇的地图来了 atcha:这个互动显示谁拥有英格兰。想一个更好,更完整的末日审判书。
这是一张很好的地图,显示了目前在英国被搜索最多的政治问题。
嗯,这张来自 Nadieh Bremer 的 D3 织机图太棒了。
美国(许多)罪恶的快乐之一,现在分析和可视化的 538 年的礼貌。
我花了几分钟盯着这张地图的动画,我仍然着迷。
英国大选即将到来,这意味着时间来可视化历史选民投票率数据。
与许多选举一样,媒体对投票中的“摇摆不定”议论纷纷。BBC 的克里斯·库克的数据分析很好地展现了可能性。事实上,它是如此之好,以至于另外两个人把同样的数据变成了交互:一个条形图和一个挥杆图。
溢出的数据显示了一个很酷的美国互动地图,显示了每个州人们结婚的次数。这里有很多有趣的见解,但是 DC 是最“单身”的州,超过 55%的人从未结婚。相比之下,阿肯色州可能对整个婚姻太感兴趣了:7.8%的人结过三次或三次以上的婚。
没人会说“嘿,我们很酷,很时髦!”就像 Vox 使用表情符号作为他们的 x 轴…尽管如此,经济前景的数据仍然很有趣。
我认为这是一个非常清晰、快速的数据的好例子。这是干净的,并立即讲述了新的美国预算提案的故事:保护美国免受所有外部邪恶势力的影响,同时削减内部项目的资金。
新闻媒体很快指出,特朗普选民可能是这些预算削减的最大输家。《华尔街日报》有一些展示结果的精彩地图。
我喜欢这幅来自 NYT 的动画图片,它展示了美国国家公园冰川融化的速度。当然,我指的是数据,而不是我们星球上的一些自然宝藏正在融化的部分。
很好地使用了面积图+预测线来显示 AHCA 法案下的未投保人数。也很清晰的注释。
本周,在爱莉安娜·格兰德的一场音乐会上,曼切斯特爆炸的消息传出后,世界再次为恐怖的景象而悲伤。新闻机构争相报道这一事件的背景。路透社通过更新其在欧洲的恐怖袭击互动时间表做到了这一点。
我认为这些数据即来自《每日电讯报》的阿什利·柯克是及时的和重要的。作为数据记者/分析师,我们必须在哀悼这场悲剧的同时,也将它放在更大的背景下。
上周就这样了。你看到我错过的东西了吗?或者你只是想给我一个数字点头/击掌?给我发微博或者在下面留言。下周会有更多的数据。
数据好奇 31.07.2017:上周的数据故事、数据集和可视化综述
原文:https://towardsdatascience.com/data-curious-31-07-2017-a-roundup-of-data-stories-datasets-and-visualizations-from-last-week-da8b8cf5ea9b?source=collection_archive---------4-----------------------
欢迎来到我上周在网上注意到的数据驱动事物的每周综述。这是第 16 周(上周的帖子是这里是)。
每个星期,我都会剪辑、保存和收藏大量我在网上找到的关于用数据讲述故事的很酷的东西。以下是 7 月 24 日那一周吸引我眼球的内容。在典型的时事通讯中,我会包含一堆链接供你点击,保存起来以后再看(没关系,我们都这样做)。为了赶上下周的帖子,请在媒体上关注我的最新消息。我也是推特上的。
好的阅读、分析和教程
上周似乎是有趣的阅读和资源重,数据集轻。让我们看一看。
James Densmore 在这篇关于网络抓取道德的博客文章中总结了一套很好的原则。因为抓取立法完全是另一回事,这些自我采用的规则为道德抓取者和网站所有者提供了一个框架,以鼓励更公平和更公正的网络抓取环境。
这篇由 Aran Lunzer 和 Amelia McNamara 撰写的互动文章通过使用一些漂亮的 d3.js scrollytelling,采用了一种超级元、深入的方法来解释直方图的 DNA。他们的数据可视化是基于 Jim Vallandingham 的的,所以你想要建立一个 Scroller ,他们的代码可以在 Github 的这里找到。
我真的很喜欢这篇关于从 10 亿个 Shazam 音乐识别中创建数据可视化的文章。生成的地图是使用社交应用程序中的地理数据的一个很好的例子。我也喜欢阅读作者如何创建同一张地图的不同版本(静态和交互式)。
艾琳·加拉格尔在推特上自我发布了一篇对虚假 antifa 账户的精彩分析,这些账户意在制造虚假新闻报道。利用 Gephi 可视化技术,她展示了一个围绕一个主要用户名 OfficialAntifa 的虚假账户网络如何产生足够的可信度,以至于多家报纸在网上文章中引用了它们。
既然我们谈到了自助出版的话题,那就来点无耻的自我宣传吧:我写了一篇关于的反思,这是我在从头开始编写、编码和设计一个长格式数据驱动功能时学到的东西。如果你在一个类似的领域,或者只是想要一些关于为网络编写故事/文章的见解,我希望你能从我的经历中找到一些有用的东西。
数据可视化大师安迪·基尔克上周发布了他的新图表制作者目录的测试版。交互式矩阵允许用户根据图表系列选择图表类型,然后点击进入大量不同的教程,学习如何在各种不同的程序(D3.js、Vega、Plotly、Excel 等)中构建该图表。).该目录有超过 200+的参考和计数,所以这绝对是一个网页书签,供未来使用。
Kirk 还发布了他对自今年 1 月以来数据可视化领域最重要的发展的 6 个月综述。许多条目之前已经出现在数据好奇(英雄所见略同)上,但有些对我来说是新的,所以来看看吧。
说到值得收藏的页面,我上周在 Twitter 上看到了一个新的网络项目,名为数据驱动的叙事模式。该网站展示了用数据讲述故事的不同叙事技巧,并将每张卡片分为五类:移情、参与、框架、心流和论点。每张数据卡都有基本原理,说明为什么这是一种展示数据的聪明方法,并举例说明了有效使用该技术的方法。
我很高兴看到这个博客如何使用 xkcd 漫画来解释希尔对数据科学家的标准。谁不爱 xkcd?
上周我最喜欢的文章是伊娃·康斯坦塔斯的这篇文章,标题是《T2 利用数据重建对媒体的信任》。在她与 Mozilla 的一次较长采访的摘录中,Constantaras 写道,她通过在发展中国家教授数据新闻学的经验,学到了“提供信息,让公民生活得更好”。在她的文章中,她向新闻界发出挑战,要求他们认真审视我们如何优先考虑数据新闻:与其把我们所有的数据资源都投入到报道民意调查和制作现场选举地图上,不如我们把更多的数据新闻集中在促进当地公共利益的问题上?
这篇关于为什么数据人种学家掌握着未来最重要的设计工作的文章有趣地审视了数据集背后的文化和偏见,以及我们如何克服它们。
我喜欢 NYT 在这篇互动文章中使用的数据标题:夏天越来越热。整篇文章有一些很棒的气候数据分析。
Daniele Palumbo 创建了一个最佳数据记者和#ddj 数据工作故事的 Twitter 列表。需要注意的一点是:
这篇中型文章解释了如何使用气泡图来探索复杂的数据集。 Shir Meir Lador 展示了如何使用这个包(可在 Github 上获得)以及 Python 中的 pandas、numpy 和 matplotlib 来帮助揭示人口普查收入数据的模式。
Mapbox 发布了一篇关于位置的 7 数据可视化技术的博客,很好地概述了可视化地理数据的不同选项。
消费者旅游公司 TripHappy 创建了一张世界地图,该地图仅根据提交到其网站的 17,000 多条路线绘制而成。该团队使用 Gephi 中的聚类分析,将同一旅行中经常访问的国家指定为相同的颜色。我认为这是一个商业公司充分利用他们的数据来讲述一个有趣故事的很酷的例子。看下面的地图,阅读它是如何制作的这里。
Created by TripHappy
Data.world 为从事数据工作的数据记者和新闻编辑室开发了一些非常有用的工具。这个登陆页面很好地总结了专门为数据记者定制的工具。
数据集和其他资源
上周,我在 data.world 上发现了一个有趣的数据项目,探索党代表实际上代表了他们所属政党的人民有多好。自己探索数据,并通过发布查询和见解为项目做出贡献。
国家档案馆存有二战期间被送往集中营的日裔美国人的数据集。
看看这个来自 NBC 新闻的数据库:追踪特朗普对特朗普房产的访问。数据包括哪些物业被访问,以及该物业是否有高尔夫球场。到目前为止,总统每个月大约有 10 天会去他的房产。
博士生 Peter Bucchianeri 一直在分析影响女性候选人竞选美国众议院的因素。为了他的研究,他收集了一个从 1972 年到 2010 年众议院初选中女性候选人的数据集,其中包括候选人政党,地区人口统计,席位的在职状态等等。
当你需要证据证明你的工作很重要时,这里有一个很好的资源可以收藏:data . world 上不断增长的关于数据科学和开放数据的可分享事实和数据列表。
数据可视化
《每日电讯报》通过让读者猜测某些经济结果背后的原因,很好地利用了“令人惊讶”的统计数据。
我认为 Martin Stabe 对手机地图的评论非常有趣。来自 NYT 的数据分析显示了伦敦提议的交叉铁路计划,包括一些详细的标注地图,显示了新线路的路线。但是当你为移动设备调整屏幕大小时,地图会翻转为垂直布局。
这张斜率图显示了随着食品和饮料价格的飞涨,委内瑞拉人饮食中的食物变化。
即将到来的日食激发了推特上更多的旋转地球仪和 gif 图片。这张来自《科学美国人》的照片显示了离你最近的日食。
我真的很喜欢看到这张并排组合的径向图,它显示了自 1980 年以来的气温异常。
以下来自 pudding.cool 的视觉短文讲述了为什么当机器人抢走你的工作时共和党会赢有一些出色的数据,即工作。我最喜欢的是长长的滚动气泡图,显示每项工作自动化的可能性。数据来自弗雷和奥斯本进行的关于工作自动化的流行研究。
Screenshot of bubble plot. Full story here.
上周就这样了。你看到我应该包括的东西了吗?或者你只是想给我一个数字点头/击掌?给我发推特或者在下面留言。
如果你喜欢这个每周综述,拍上一张 ❤️️ 或者与你的朋友分享。我也很想知道你最近在忙些什么,所以请联系我。下周会有更多的数据。
数据好奇:10 月份的亮点
原文:https://towardsdatascience.com/data-curious-highlights-from-october-d0fe2b695361?source=collection_archive---------13-----------------------
这是我上个月在网上找到的最好的与数据相关的东西:值得阅读、探索、分析和学习的东西。
what I wish my workspace actually looked like
去年我开始了一项实验。每周我都会在网上(通常是通过 Twitter)找到并发布我最喜欢的数据驱动的故事、数据集和可视化。我的想法是这样的:如果我花半天时间在网上寻找视觉灵感,那么也许其他人也会从中受益。
在某种程度上,我认为这种预感是正确的。在我出版的 20 多个版本中,我从媒体读者那里得到了一些很好的反馈,并在此过程中储存了大量的创造性参考资料。然后我休息了一下…
现在又回来了!但是格式不同。《数据好奇》已经转变为每周一期的时事通讯,现在它在两件事情上更加平衡了:受启发的数据和学习的文章/教程。在这两种情况下,我通常都在寻找能引发有趣问题的东西。
我们现在有一些问题,但为了纪念一个新的开始,我想收集一些 10 月份的顶级亮点作为样本。如果你想收到完整的每周版,在这里注册(一旦对你不再有用就退订)。
开始了。
要读的东西
关于数据的文章和趣话
了解数据和数据驱动有区别吗?
Uzma Barlaskar 认为可以。在她文章的结尾,我想我同意她的观点。数据应该是众多变量中的一个,而不是唯一的变量。
[## 为什么您应该了解数据而不是数据驱动
你为你的团队/组织建立的决策框架对其成败至关重要…
hackernoon.com](https://hackernoon.com/why-you-should-be-data-informed-and-not-data-driven-76079d187989)
数据可视化是精确的还是可视化的?也就是说,所有的东西都应该是线条图还是条形图?
我重新发现了 Andy Cotgreave 关于 data viz 社区内不可避免的批评的精彩文章。他用一个普遍规律很好地总结了这一点:
“创新可视化存在的时间越长,有人说它应该是线形/条形图方法的可能性就越大。”
如此真实。但是美在让人们参与到数据中起着重要的作用。关键是找到平衡。
[## 数据可视化批评的必然性
Tableau Software 的 Andy Cotgreave 的这篇文章探讨了数据可视化的核心目的:目标是…
www.infoworld.com](https://www.infoworld.com/article/3048315/data-analytics/the-inevitability-of-data-visualization-criticism.html)
WTF 连是机器学习?
可以问——大多数周我还是会问。新技术的问题在于它们被术语所困扰。把这篇文章看作是一篇介绍性的、专业术语的解释文章。
“机器学习算法的目的是选择最合理的地方在你的数据中放置围栏。”
[## 机器学习——皇帝穿衣服了吗?
深入了解机器学习的工作原理
hackernoon.com](https://hackernoon.com/machine-learning-is-the-emperor-wearing-clothes-59933d12a3cc)
要探索的事物
受启发的数据可视化
社交媒体上的#MeToo 运动真的能激发有意义的变革吗?
这种可滚动的数据 viz 试图以一种美丽的方式发现社交媒体活动的影响。
[## 蛋氨酸
meto omenum | MeToo 运动的视觉分析|社交媒体能成为促进社会变革的工具吗?大网膜…
www.metoomentum.com](http://www.metoomentum.com/)
美国的建筑都在哪里?
给你。NYT 打破了地面数据,并在一系列漂亮的黑白互动地图上绘制了每一个数据。
[## 美国每栋建筑的地图
使用这款独一无二的交互式地图探索您的社区。
www.nytimes.com](https://www.nytimes.com/interactive/2018/10/12/us/map-of-every-building-in-the-united-states.html)
在过去的 12 年里,subreddits 有哪些发展和变化?或者:互联网在说什么?
《流动数据》的内森·尤(Nathan Yau)对微博评论的增长进行了全新的分析。
[## 子网格的增长
流动数据
flowingdata.com](https://flowingdata.com/2018/10/30/subreddit-comments/)
人们在美国国家公园逗留多长时间?
这种夜间游览公园的探索绝对是美丽的。我喜欢这种数据可视化的颜色选择,以及捕捉数据中多个变量的径向线图。
[## 星空下的夜晚|乔丹·文森特
探索在美国国家公园过夜,发现令人惊讶的模式。
jordan-vincent.com](http://jordan-vincent.com/night-under-the-stars)
要分析的事情
数据集、开放数据和 API
有多少女性获得过诺贝尔奖?
NYT 最近发表了一篇文章,纪念第三位获得诺贝尔物理学奖的女性。深入这个数据集,进行一些有新闻价值的分析。
[## 诺贝尔奖获得者 sya 数据集
1901-2016 年诺贝尔奖获得者
数据世界](https://data.world/sya/nobel-prize-winners)
美国宇航局已经发现了多少颗行星,哪些可能适合居住?
这个来自行星可居住性实验室的数据集包含了你想要的所有信息。你也可以查看他们关于可能适合居住的行星的页面……这可能会产生一些有趣的视觉效果。
[## PHL 系外行星目录-行星可居住性实验室@ UPR 阿雷西博
行星可居住性实验室(PHL)是一个致力于行星可居住性研究的虚拟实验室
phl.upr.edu](http://phl.upr.edu/projects/habitable-exoplanets-catalog/data/database)
英国不同职业的平均生活满意度如何?
《何为幸福》贴出了一份按职业划分的生活满意度分析。最令人惊讶的发现?神职人员是最幸福的,尽管他们的收入远不及金融专业人士。你可以在这里下载有关职业名称、平均满意率和年薪总额的数据,以作进一步分析。
[## 不同工作中的幸福感是怎样的?新数据、分析和案例研究
工作关系到我们的幸福,我们知道经济活动是生活满意度的主要驱动力之一。什么…
whatworkswellbeing.org](https://whatworkswellbeing.org/blog/whats-wellbeing-like-in-different-jobs-new-data-analysis-and-case-study/?mc_cid=8c485e3446&mc_eid=abfb15dd22)
哪种类型的书在 NYT 畅销书排行榜上停留时间最长?
热心读者?深入研究这个从 2011 年到 2018 年的畅销书数据集,找出畅销书中反复出现的趋势。
[## 《纽约时报》2011 年至 2018 年畅销书-提丰数据集
typhon 正在使用 data.world 与世界分享《纽约时报》2011 年至 2018 年的畅销书数据
数据世界](https://data.world/typhon/new-york-times-bestsellers-from-2011-to-2018)
营养最丰富的食物是什么?
这个来自美国农业部的综合数据库包含了生的、加工的和准备好的食物的营养信息。对相关的食物种类和营养成分的分析会很有趣。
[## 美国农业部国家营养数据库标准食品原料、加工食品和预加工食品的成分
自 1992 年以来,美国农业部营养数据实验室(NDL)网站一直以电子方式发布最新数据
data.nal.usda.gov](https://data.nal.usda.gov/dataset/composition-foods-raw-processed-prepared-usda-national-nutrient-database-standard-reference-release-27)
要学的东西
教程和演练(通常与 Python 相关,但不总是如此)
如何开始用 Python 构建聊天机器人?
聊天机器人风靡一时。但是,您不必具备全栈数据科学家的所有技能才能开始。只是一些基本的 Python 和 NLTK。
[## 用 Python 从头开始构建一个简单的聊天机器人(使用 NLTK)
Gartner 估计,到 2020 年,聊天机器人将处理 85%的客户服务互动;他们已经…
medium.com](https://medium.com/analytics-vidhya/building-a-simple-chatbot-in-python-using-nltk-7c8c8215ac6e)
在 Python 中进行分析之前,如何快速清理数据集?
"丢掉那些糟糕的数据,就像奥巴马丢掉麦克风一样."乔治·赛义夫为你提供了一个很好的关于用熊猫清理数据的介绍教程。
[## 清理数据的艺术
像奥巴马放弃麦克风一样放弃那些糟糕的数据
towardsdatascience.com](/the-art-of-cleaning-your-data-b713dbd49726)
如何开始使用散景制作交互式图表?
如果你是从零开始,这个来自 Quant Institute 的教程是一个很有帮助的开始。
[## 使用 Bokeh 的 Python 数据可视化,用于算法交易者和量化者
Python 数据可视化是数据科学家的关键职能之一,而解码可视化信息是一项重要的工作。
www.quantinsti.com](https://www.quantinsti.com/blog/python-data-visualization-using-bokeh/?utm_campaign=News&utm_medium=Community&utm_source=DataCamp.com)
我想学习自然语言处理…但是我该如何开始呢?
这是我发现的深入学习一些 NLP 方法教程的最佳起点之一。它包括情感分析、标记化、词性标注等资源的链接。另外,它是由 IBM 自然语言理解团队的一个家伙写的,所以看起来是合法的。
[## 如何成为 NLP 专家
TL;DR——按照我列出的步骤来学习 NLP
blog.goodaudience.com](https://blog.goodaudience.com/https-medium-com-ethankoch-how-to-become-an-nlp-expert-81cb94989612)
10 月份到此为止。想获得每周的灵感和资源,请点击这里获取每周一期的《数据好奇》,并在 Twitter 上向问好。
数据,数据
原文:https://towardsdatascience.com/data-data-1fedfac91c79?source=collection_archive---------13-----------------------
通过对荷西·德克勒音乐和歌词的统计探索,对他的世界进行身临其境的分析。
网上不乏关于数据分析所揭示的见解的酷文章,在这些文章中,像我这样的音乐发烧友可以满足我们对我们最喜爱的艺术家的随机事实的渴望。尽管前面提到的文章背后的数据英雄已经广泛覆盖了过多的艺术家,但同样不能说西班牙语(或唱歌?)音乐人。
当选择某人的作品进行分析时,这个问题很早就出现了。从那时起,选择荷西·德克勒的音乐的决定几乎是自动的。我最喜欢的艺术家之一,乔治的音乐来自乌拉圭;但是整个拉丁美洲都有这种感觉。从阿根延到加勒比海的民间音乐节奏和从莱昂纳德·科恩到卡耶塔诺·费洛索的影响混合在一起,他的职业生涯跨越了二十多年,他的专辑也越来越好。他的歌词被称赞为非常有文化和诗意,他的散文有时会变得非常独特。我希望通过写这篇文章,他的一点点音乐能传到非西班牙人的耳朵里,这样他们就能享受它,也许甚至像我一样。
Most probably my favorite song by him (but really, who can decide?)
技术
整个项目是用 Python 3 开发的。
我用 pandas 、 BeautifulSoup 、spot ipy(Web Spotify API 的惊人 Python 包装器) Genius API 和 Web Spotify API 创建并清理了数据库。
此外,当我放弃时,我用谷歌工作表和 MS Excel 对它们进行了修改并给出了最终的调整。
关于数据分析和数据可视化,我用了熊猫、 NumPy 、 Matplotlib 、 Seaborn 、 scikit-learn 、 SciPy 、自然语言工具包、 wordcloud 和 py-lex 。整个项目都是用 Git 版本化的,它可以在我的 Github 账户中公开获得。
如果你想知道一切是如何计算和编码的,如果你想看到探索的细节而不仅仅是亮点,如果你想克隆或派生项目,下载数据库或简单地运行代码只需点击这里访问资源库。
数据提取、创建数据库和&数据清洗预处理
就像每个数据科学家/分析师都知道(或者应该知道)的那样,获取数据并不总是容易的。然而,有一点是绝对肯定的,那就是耗时。如果我们可以谷歌*“Jorge drexler 数据库”*并且通过一些现代奇迹在 3 分钟后完成一次漂亮的清洁,我们的生活会变得多好。硬盘上的 csv 文件。
回顾过去,这是我开始犯菜鸟错误的时刻。我没有计划我的最终目标是什么,以及达到目标的最佳途径是什么。这开始只是一个用 Matplotlib 和 pandas 鬼混的小项目,它经历了不同的阶段和想法,直到我专注于这个特定的项目。当我决定哪种探索是我想要进行的时候,我已经做了一些开发,我必须把它们引向我想要的方向。我应该事先问自己的问题是:我需要什么样的数据?我能在哪里得到它?会是哪种格式?怎么才能轻松改造?如果我从源头 A 得到它会有多干净?源 B 是否会更好并节省我的时间?
话虽如此,我最终还是到达了我需要的地方,然而肯定有更容易、更直接的方法可以节省我很多时间。
首先,我使用 Genius API 进行数据提取,以获取 Jorge 的所有歌词。API 给你的是属于艺术家的每一句歌词的 url,而不是真正的歌词。因此,一些 http 请求,美丽的汤,并删除了大量的 < div > s 之后,我最终得到了一个包含重复,翻唱,现场版本和一些根本不属于 Jorge 的歌曲列表。
在删除了很多没用的功能和很多葡萄牙语的歌(?),我开始手动丰富数据(好吧,不是真的手动,而是通过使用 Python 脚本),给每首歌添加年份和专辑。
随着时间的推移,我决定也从 Web Spotify API 获取数据。这一刻,我意识到如果我一开始就决定这么做,我会更快乐。Spotify 的数据有序、整洁,不包含重复和垃圾歌曲。他们没有歌词,对吧,但有一个包含专辑中所有歌曲的数据框架会让一切变得更容易。在去除了无用的特征后,我决定了研究扩展的规则和定义。
- 这项研究只集中在官方唱片发行上:没有合辑,也没有现场专辑。分别是:拉鲁兹克萨贝罗巴尔 (1992 年)雷达 (1994 年)瓦伊文 (1996 年)卢伊夫 (1997 年)弗龙特拉 (1999 年)海洋 (2001 年)生态 (2004 年) 12 段
- 没有独立发行的单曲或歌曲。乔治的歌曲没有出现在各种艺术家的专辑中,也没有出现在其他艺术家的专辑中。
- 没有其他语言的歌曲。这就淘汰了高&干的版本在 12 segundos de oscuridad 和我一点都不担心的版本在 Amar la trama。
- Jorge 在乌拉圭独立发行了他的前两张专辑,然后在 Virgin 下发行了他的第三张专辑,这张专辑得到了更广泛的发行。这张专辑中有很多歌曲重复出现,如偷窥狂,伊甸园 & 月光女神。其中一些被重新录制。虽然我跟踪了这个事实,但在分析中我并没有考虑到什么特别的地方。分析所有专辑和它们最初包含的歌曲,不考虑重复。
在这一点上,我放弃了 Python 和 pandas 来继续我的使命,开始转向 MS Excel,然后 Google Sheets 用 Spotify db 加入歌词。令我惊讶的是,微软和谷歌都需要加强他们的 csv 管理解决方案。 MS Excel for Mac 不支持 Unicode!如果我得到的每一个“é”或“ó”都被转换成像“o”或“o”这样的废话,我怎么能分析西班牙语歌词呢?。另一方面,将 csv 导入和导出到 Google Sheets 的选项非常有限。
走完这条漫长曲折的路,我终于准备好开始分析了。
数据分析
第一个重点放在了字数上。
一旦西班牙语的停用词被删除(还有一些非感官术语,如合唱中的“na”),我就找到了乔治歌曲中最常用的词。
使用最多的 5 个词是“mar”、“tiempo”、“noche”、“luna”和“corazón”;分别表示“海”、“时间”、“夜晚”、“月亮”和“心”。
对于已经知道他的歌的人来说,仅此一点就说明了很多。让我们更上一层楼,把这五个字当作一个主题,在听他的歌的时候呈现出来。这样我们就可以分析随着时间的推移,它们的用法是如何变化的。让我们看看他所有的专辑。
来看看!有趣的见解!
- 90 年代,他喜欢谈论大海(“mar”),但随着时间的推移,他变得厌倦了。
- 在 Vaivén (1996)中,心脏(“corazón”)作为一个几乎全新的主题出现。之后它再也没有恢复领先。夜(“noche”)也是存在的。这会是一个令人心碎的记录吗?
- 在新千年的第一个十年,他没有太多地重温他最喜欢的主题。
- Bailar en la cueva (2014)超级聚焦月亮(“露娜”)和黑夜(“诺切”)。
- Salvavidas de hielo (2017 年)是关于时间的流逝(《时代报》),这是他从 Frontera (1999 年)和《夜晚》(noche)中恢复的趋势。
我们可以把这些图表变成一种不同的视觉效果,来证实我们从上一个图表中得到的结果,也许会发现一些新的东西。
- 在这个图表中,我们实际上可以看到他最流行的主题在 00 年代的低谷。
- 《月亮》(luna)在《T4》(2014)中创下历史新高。
- 时间(' tiempo ')在 Frontera (1999),海(' mar ')在 Llueve (1997)和夜晚(' noche ')在他的最后一张专辑 Salvavidas de hielo (2017)中达到顶峰。
如果我们分析他在歌曲中的用词量是如何随时间变化的,就会发现一个有趣的趋势。最上面是他 2014 年的专辑 Bailar en la cueva 超过 2400 字。
尽管并不单调,但曲线的价值确实在增长:随着时间的推移,他倾向于在歌曲中加入更多的词。
哪首歌的词比较多?以下内容:
**Guitarra y vos 以近 400 字高居歌曲字数榜首。**以下是拉卢纳·德·拉斯奎(367)贝拉·恩拉·库埃瓦(359)运动 (331)。
Yo, check that rappin’
如果没有一个漂亮的小单词云,字数统计部分是不完整的:
Most popular 500 words in his songs. The size indicates ranking.
词汇和抒情密度
在处理严格的内容分析的情况下,词汇密度的概念被认为是内容词的数量占总词数量的比例的度量——一个范围从 0 到 100 的值。一般来说,如果一篇文章的词汇密度越大,它的内容就越重——词汇密度低的文章更容易理解。
根据维基百科的公式如下:
其中 Ld 是被分析文本的词汇密度, Nlex 是被分析文本中词汇单词标记(名词、形容词、动词、副词)的数量,N 是被分析文本中所有标记的数量(单词总数)。
我不知道这有多正统,但是根据 Myles Harrison 对电台司令 T35 惊人的数据分析,听起来这只是非停用词占总数的比率——或者至少可以用它来近似。让我们看看结果如何。
所以,看看这个!随时间减少的趋势很大。从 1992 年的 T2 到 2017 年的 T4,词汇密度实际上是下降的。
Frontera (1999)在词汇密度上似乎是一张相当一致的专辑,而 Sea (2001)则是遍地开花。在得出更多结论之前,让我们继续。
现在,迈尔斯发明了另一种度量标准。基本上抒情密度就是单位时间内的字数。信息传播的速度有多快?你一秒钟能表达多少语言单位?分布如下所示:
这太神奇了。让我们回顾一下过去的经验来分析这个问题。
- 抒情密度的趋势随着时间和专辑而上升。
- 还记得单词数显示出相同的趋势吗?它们是线性相关的..所以这里的相关性肯定很高。不过,有趣的是词汇密度有相反的效果:随着时间的推移,乔治写的歌词内容密度越小,他唱得越快。他的歌词越容易理解,他唱得越快。可能是这样吗?
现在,如果我们将它们相互对照,会发生什么呢?
通过检查这个小图的异常值,我们可以看到:
- 就像我们之前说的,像 Movimiento 、 La luna de Rasquí 、guitar ra y vosyPongamos que hablo de martínez这样的歌曲带有很大的抒情密度,而词汇密度相对较低。这意味着他们每秒钟吐出很多单词(每秒钟超过 1.4 个单词!)虽然这些歌词的内容并不少见:它们既不容易理解,也不复杂。
- “格格”、 Me haces bien 和 Macarena y el espejo 这几首歌的歌词含义丰富,但唱得相当慢。
- Aquiles,por su talon es Aquiles和 Sea 唱的比较慢,含率也不是很大。基本上是德雷克斯勒作品中最容易理解的歌曲。
May not be a specially difficult song to comprehend, but it certainly is difficult not to enjoy ❤
情感分析
好了,现在我们有了一些比计算单词更有趣的东西。根据维基百科的说法,情感分析是使用自然语言处理、文本分析、计算语言学和生物统计学来系统地识别、提取、量化和研究情感状态和主观信息。
在这种情况下,我使用了一些非常好的资源来完成这项工作。首先也是最重要的, NRC 单词-情绪联想词典(又名 EmoLex) 。
**NRC 情感词典是一个英语单词列表,以及它们与八种基本情感(愤怒、恐惧、期待、信任、惊讶、悲伤、喜悦和厌恶)和两种情绪(消极和积极)**的关联。注释是通过众包手动完成的。最明显的问题是,至少对我来说,Jorge 的歌词不是英文的。EmoLex 还发布了自己的词典,通过谷歌翻译(Google Translate)自动翻译成 100 多种语言。
这是 肯定不是 100%准确的 并且会让我的结果有点偏离,但最终足以获得一些更有趣的见解。理想情况下,我会有一个愿意众包西班牙语注释的团队…也许下次吧:)。
py-lex 是一个很棒的 python 库,可以解析这个词典。
检查所有歌曲中的所有情绪,然后汇总,我想出了一个可视化的解决第一个也是最明显的问题:乔治的歌曲感觉如何?
Jorge 的歌曲表现出很多期待和悲伤。这可以被看作是渴望、兴奋、渴望、忧郁、悲伤、忧伤、荒凉或者仅仅是单纯的悲伤。对于听过他音乐的人来说,毫不奇怪,这些歌曲很少表现出愤怒或厌恶。
对于情感,他的歌曲也是积极的多于消极的。
让我们来看看是哪些词引发了每一种情绪和观点。
- 母亲带着信任、喜悦和期待出现。标记了积极和消极。
- Sol(sun)似乎与积极情绪有关:惊讶、信任、喜悦、期待,而且只被标记为积极情绪。
- Pena(怜悯、羞耻)出现在负面情绪中:恐惧、悲伤、愤怒,这只是一种负面情绪。
这种情绪如何在专辑中表现出来?哪一张专辑最悲伤,哪一张更令人期待?
- 他最悲伤的专辑是 1996 年的《Vaivén》。我很确定那是《第 12 集》,事实上……至少那是我悲伤时喜欢听的。德雷克斯勒在西班牙录制了《Vaivén 》,得到了安达卢西亚音乐传奇人物华金·萨宾娜的指导,而他则一跃将自己完全奉献给了音乐,放弃了行医。也许他渴望回家?
- 1997 年的《Frontera》和 2017 年的《T2》中的期待值最高。
让我们用另一张图来看看这些年来是如何演变的。
- 嗯,可以肯定地说,除了第 12 集中的颠簸,Jorge 已经不那么悲伤了。那张专辑中的大部分歌曲都是他在 Cabo 波洛尼奥时创作的,那是一片美丽的土地,位于乌拉圭,没有电,夜空繁星点点。12 segundos de oscuridad (12 秒的黑暗)指的是每 12 秒扫过城镇的灯塔,它周期性地打断黑暗。与前妻分居后,他把自己关在那里作为疗伤的手段。听着像 Soledad(孤独)或 Sanar(治愈)这样的歌曲,你可以感觉到歌手开始意识到他现在是孤独的,时间会治愈他破碎的心。这也许是信任在这里达到顶峰的原因:尽管他很难过,但他对事情会变好的事实有信心。
“It’s done. I’ve already let it tarnish, the illusion that living is painless” Ouch, Jorge! Right in the feels!
- 然而,他的快乐在《Eco》中达到顶峰,并且再也没有从那次挫折中恢复过来。
- 愤怒的高峰出现在 Vaivén 和 *12 segundos de oscuridad。*他最悲伤的专辑。
- 负面情绪(愤怒、悲伤、厌恶、恐惧)似乎有某种关联。让我们深入了解一下。
为了检查相关性,我在 Seaborn 中使用了 pairplot 工具,并计算了每一对变量的皮尔逊相关系数,这是两个变量 X 和 Y 之间线性相关性的度量。范围在+1 和 1 之间,其中 1 表示完全正线性相关,0 表示没有线性相关,1 表示完全负线性相关。
ρ = 0.62 and ρ=0.55 are definitely correlation degrees high enough to take into account.
和我第一次怀疑一样,悲伤和愤怒是高度相关的。也是愤怒和厌恶。
让我们快速重复上次的情绪曲线图,单独欣赏它们的曲线形状。
事实上,在 Jorge 的歌曲中,可以相当准确地说,悲伤与愤怒和厌恶相伴而生。
现在,让我们直接进入积极情绪和消极情绪。
我认为这是相当安全的,在这一点上,再次确认,乔治是一个积极的比消极的家伙。
- 他的积极峰值出现在 1999 年的 Frontera,而消极峰值出现在三年前的 vaivén(1996 年)。
- 积极度的历史最低点在 2010 年的 Amar la trama。
- 他消极情绪的最低点发生在职业生涯的开始和结束。(好吧,不是结尾…让我们希望他继续创作优美的音乐)
- 负面多于正面的专辑:vaivén(1996)12 segundos de oscuridad(2006)Amar la trama(2010)。
音乐分析
我能够提取每首歌曲的音乐特征。
要查看每个功能的详细描述,请访问此。
不过,需要声明:所有这些都是使用机器学习或信号处理技术计算出来的。这都是自动化的,所以远不是 100%准确。我通过检查唯一值和异常值进行了预分析,发现了一些小错误,如 Asilo 不在 5/4 拍号中,或者 La plegaria del paparazzo 被标记为 192 的速度,而实际上它是该值的一半。
豪尔赫使用两种类型的时间签名。小节中有三拍的和四拍的。最有可能的是 3/4 和 4/4,但 Spotify API 不提供时间签名的分母;所以没有办法知道哪个音符值相当于一拍(是啊…就是这样:用耳朵一个一个地检查。)
Eco is definitely a trend changer in the distribution of time signatures.
- 你会在他的每张专辑中找到一首三拍歌曲,除了生态专辑。
- 在 Eco 之前,他所有的专辑都包含至少两首 3/4 或其他三拍拍的歌曲。
- 在 Eco 之后,他所有的专辑都只包括其中的一张。
他歌曲的平均速度是 121 bpm。 **来自海的杜兰特是 Jorge 最快的歌曲,**拥有 178 bpm 的急速节奏。他最慢的是来自 segundos de oscuridad 的赫曼娜·杜达 T38,节奏为 64 bpm。
Slow but sure
让我们来看看他的专辑中节奏是如何分布的。
- 迄今最快专辑:海从 2001 年。这张专辑包含了最乐观的歌曲。
- 其他一切感觉都差不多。所有的歌曲都分布在 120 bpm 左右,一些节奏较慢的民谣散布在他的每张专辑中。
让我们将之前获得的一些见解与我们接下来的分析结合起来。
还记得以下内容吗?抒情密度的趋势随着时间和专辑而上升,他唱得越来越快。字数也是,因为它与抒情密度相关。词汇密度有相反的效果:随着时间的推移,Jorge 写的内容越来越少,歌词越来越容易理解。
现在曲目长度,歌曲的时长,随着岁月慢慢减少。
随着时间的推移,歌曲越来越短,但歌词却越来越长!
而且,他唱得越快,歌曲越短,越容易理解。
在乐理中,一首乐曲的键是一组音高,或音阶,它们构成了古典音乐、西方艺术和西方流行音乐的基础。
该组具有一个主音音符及其相应的和弦,也称为主音或主音和弦,它提供了一种主观的到达和休息感,并且还与同一组的其他音高、其相应的和弦以及该组之外的音高和和弦具有独特的关系。
- 有些键在他的专辑里从来没有弹过。Eb 和 Ebm,G#和 G#m,Bbm 都是吉他弹奏中处理起来不是特别舒服的键。
- 另一方面,G 和 A 是最受欢迎的。还有 E、D、c,他们 5 个人和吉他手超级友好。
是的,你猜对了。让我们检查一下专辑中按键的分布。
- Frontera 是 keywise 最单调的专辑。只有 4 把钥匙。4 首 G 调歌曲,4 首 D 调歌曲,2 首 A 调歌曲和 1 首 f 调歌曲。这无疑是最容易被吉他接受的专辑。
- Eco 几乎从不重复调,D 中的两首除外(guitar ra y vos&Transporte)。奇怪的是,这些歌都不是乔治最喜欢的调子。
- 其余的专辑都很平衡。
根据我们在 Spotify 的工作人员的说法,价是一个从 0.0 到 1.0 的量度,用来描述一首歌曲所传达的音乐积极性。高价曲目听起来更积极(例如,快乐、愉快、欣快),而低价曲目听起来更消极(例如,悲伤、沮丧、愤怒)。
所以,现在让我们试着纯粹从音乐方面来分析快乐和悲伤。
这就是了。这是音乐上最快乐的 5 首歌。
Un lugar en tu almohada、Mandato 和 Horas 是 听起来 更快乐的三首歌。
在擂台的另一边,这是音乐上最悲伤的 5 首歌。
12 segundos de oscuridad、Llueve 和 Organdí是 3 首听起来更悲伤的歌曲。
Hearts exploding with joy
现在,让我们来点更有趣的。分析完,我们来让音乐和歌词相遇。
在这篇令人惊叹的文章中,RCharlie 创建了一个名为的指标,将它们完美地结合在一起,并找出哪首是电台司令更令人沮丧的歌曲。我鼓励每个人都去看看。
Valence is Spotify’s valence value, sadness_per is the percentage of sadness in each song (which we can calculate from NRC sadness and Ly_d is lyrical density.
来,让我们为乔治的歌做同样的事!我将重新缩放它,使它从 0 到 100。
这就是了。当你把歌词和音乐结合在一起时, 12 segundos de oscuridad 是 Jorge 最压抑的歌曲。
Un lugar en tu almo hada, Bienvenida 和 Don de fluir 都是 Jorge 最开心的歌!
Gloomy, right?
现在,为了压轴戏,让我们来看看每张专辑的忧郁指数表现如何。
Here you have them, ranked.
尽管困难重重,但显然最令人沮丧的专辑是 Llueve !
最快乐的是 Eco 和 Sea ,所以现在你知道当你想让情绪高涨时该听什么了。
结论
乔治已经在《科学之路》中说过:“创作歌曲不是一门精确的科学”。分析它们也不是。虽然这项研究很广泛,但在某些地方缺乏科学的严谨性。让这个不全面的列表作为免责声明/道歉:
- Spotify 对音乐功能的衡量并不总是准确的。
- 字数统计取决于把它们转录成天才的高尚的人。如果我们想要精确,就需要建立一个标准。我们算合唱的重复吗?如果抄写者很懒,没有抄写最后一段合唱的次数,会怎么样?如果一个词在同一首歌中重复无数次(像*Estalactitas】*中的“tiempo”)是否和它出现在多首歌中一样算?歌曲中唱诗班唱的词或者次要声部唱的词算吗?
- 英文歌曲没有被考虑在内,但翻唱却被考虑在内,尽管这些歌曲不是豪尔赫创作的(比如最初由阿纳尔多·安图内斯创作的迪士尼乐园)。
- 情感分析是在一个不是由人类工作,而是由谷歌翻译的基础上进行的。
考虑到所有这些,我确实学到了很多关于数据分析及其所有的优点,如处理从纯代码生成可视化,创建和清理数据库以及项目规划的良好实践。
我也希望这个项目能够帮助乔治的作品获得普遍的关注。不是因为他需要(我觉得他已经挺大了);而是因为他的音乐一定会给你的生活带来更多的微笑!
我把这个项目献给他,以此表达我对他的感谢。
¡Muchas gracias!
参考资料:
使用 Genius API 和乔纳森·埃文斯的 NLTK 对苏菲洋·斯蒂文斯进行量化
对带有一些 TF-IDF 的熊猫的文本分析(再次)
各就各位:迈尔斯·哈里逊的《电台司令》歌词的可视化和内容分析
Preetish Panda 对泰勒·斯威夫特的歌词进行数据可视化和分析
钳工快乐 by 车工
数据,无处不在的数据和大量的饮料(向塞缪尔·泰勒·柯尔律治道歉)
原文:https://towardsdatascience.com/data-data-everywhere-and-lots-of-drops-to-drink-with-apologies-to-samuel-taylor-coleridge-3f51aab8a4fe?source=collection_archive---------3-----------------------
Photo © Michael Factor
说这是数据时代是老生常谈;社交数据、科学数据、医疗数据、智能家居数据、汽车数据和物联网(I0T)数据都在以惊人的速度产生。我们有海量的数据。但是像古代水手一样,仅仅获得这些数据是不够的。没有适当的处理,这些数据不能解渴,不能成为信息。我们需要将这些数据从盐水变成香槟,从仅仅保存数据转变为使用数据来推动社会和商业价值。在这篇博文中,我描述了从数据到价值的转变的几个云构建模块。我们还将在 3 月 19 日周日上午的 IBM 互连研究日以及随后的会议上发表演讲。
许多此类数据是在传统企业数据中心之外创建的,甚至更多此类数据存储在云中。云中使用了一系列数据存储,包括 NoSQL 数据库和对象存储。这些商店是作为现成的多租户服务提供的。例如,对象存储是可伸缩的、易于使用的、对开发人员友好的、高弹性的和成本有效的存储库,适合于存储由关键字(URI)标识的中型到大型实体。 IBM Cloud Object Storage ,在美国跨区域部署中可用,可以经受多次物理资源中断,包括整个区域的中断,而不会丢失任何数据,并且可以持续、不间断地访问任何成功存储的数据。NoSQL 云数据存储为较小的“对象”提供了更高性能、可扩展、易于使用、开发人员友好的存储库。 IBM Cloudant 是存储为 JSON 文档的高速数据的理想解决方案。
虽然我可以诗意地讲述云数据存储的好处,尽管没有塞缪尔·柯勒律治·泰勒那样的口才,但这不是我的目的。我的目的是谈一谈从数据中获取价值。简单地将这些数据放入对象存储或 NoSQL 数据库只是故事的一部分,是故事的必要和关键部分,但远非故事的全部。除了法规约束之外,存储数据的唯一合理理由是对数据做一些事情。为了处理数据,我们需要能够将存储数据的服务和处理数据的服务结合在一起。这篇文章是关于把存储在云数据存储中的数据海洋变成香槟。
Data data everywhere and lots of drops to drink. From Flicker. https://www.flickr.com/photos/lejournaldemaman/7149983961
尽管仅仅存储原始数据没有多大用处,但我们确实需要将高质量的数据存储到云数据存储中,以便从中获得价值。例如,如果我们从智能家居获取读数,这些读数通常会很小。虽然更新的数据可以保存在 NoSQL 存储中以允许快速检索,但是这些记录应该被一起批量处理并存储在更具成本效益的对象存储中以用于更长期的历史目的,例如用于机器学习的训练数据。这些数据通常会通过总线发送,比如基于开源 Apache Kafka 的 IBM 消息中心。基于 IBM Research 最初在欧盟宇宙项目背景下所做的工作,这篇博客描述了 IBM Message Hub 如何桥接到对象存储。由于对象存储最适合中等规模到大型的对象,所以桥将消息分组在一起,或者持续一段时间,或者直到看到一定量的数据,并将集合存储为单个对象。从长远来看,IBM 研究小组已经展示了如何将这些消息重新格式化,例如,转换成 Apache Parquet 格式,并智能地用元数据进行注释。
有时,从设备发送的数据需要在存储之前进行清理或重新格式化。无服务器编程模型,如open whish,可用于实现代理,该代理监听在消息中心总线上发布的消息,检索消息,重新格式化消息,然后重新发布一个经过清理的正确格式化的消息。例如,这篇博文描述了如何使用IBM open whish对来自 IBM Watson IoT 平台并放置在 Message Hub 上的消息进行重新格式化,从而在 Message Hub 桥批处理并存储为对象之前,实现更轻松的下游处理。
但是将数据放入云商店只是故事的一部分。即使数据在对象存储中被正确地格式化、清理和组织,它仍然只是数据的海洋,除非我们能够提取价值。 Apache Spark 正在迅速成为领先的分析平台,在许多情况下取代了以前用 Hadoop 完成的工作。IBM 的数据科学体验提供了一个基于 Jupyter 笔记本的用户友好界面,通过与 IBM 的对象存储和 Spark 服务的一流集成来探索和分析数据。
但是,如果我们不能让 Spark 分析存储在对象存储中的数据,那么这些数据探索都不会起作用。这种分析的一种方法,迄今为止经常被推荐的方法,是将数据从对象存储器复制到本地 HDFS 文件系统,对 HDFS 执行分析,然后将结果复制回对象存储器。但是这种方法笨重、耗时且成本高昂,因为还需要管理和调配 HDFS。另一种方法是直接处理存储在对象存储器中的数据。Hadoop 社区通过 s3a 或 Hadoop open stack(for open stack Swift)连接器等“连接器”支持这种替代方案,这些连接器可以从 Spark 等系统桥接到对象存储。但是,在推荐的配置中使用这些连接器比直接使用 HDFS 要慢得多。为了解决这个问题,我们开发了我们自己的连接器 Stocator ,它显著地提高了性能,特别是对于写密集型工作负载。Stocator 内置于 IBM 的 Spark 服务中,它的使用对于任何使用 Spark 来分析对象存储中的数据的人来说都是透明的。
虽然通常对存储在对象存储中的历史数据进行分析就足够了,例如,训练机器学习模型,但有时我们需要能够查看更近的数据,例如存储在 NoSQL 数据库(如 Cloudant)中的数据,以及作为单个数据集的历史数据。在这种情况下,我们一直致力于对存储在 Cloudant 和 IBM Cloud Object Storage 以及其他数据存储中的数据进行透明分析。简而言之,我们为 Spark 定义了一个新的外部数据源驱动程序,它允许访问多个数据存储,跟踪每个存储中包含的时间范围,并从正确的存储中检索正确的数据。
如果您有兴趣了解更多关于这些主题的信息,我将在 3 月 19 日(星期日)上午 8:50 与我在 IBM InterConnect 的同事 Dalit Naor 进行一次演讲。达利特和宝拉·塔什玛将在 3 月 19 日下午 1 点演示其中一些场景。此外,在 3 月 21 日星期二,我将与 IBM 在云存储和分析方面的技术领导者一起主持一个关于“云存储和分析:一个充满机会的世界(为准备充分的人)”的小组讨论最后,3 月 22 日星期三下午 1 点,葆拉和安德鲁·施菲尔德将共同介绍 IBM Message Hub 的一些新进展。
数据没有内在价值
原文:https://towardsdatascience.com/data-does-not-have-intrinsic-value-2824c2409d86?source=collection_archive---------7-----------------------
加上神秘感、困惑和普遍误解——数据随时随地产生的现象,导致了两个有问题的假设:
1.数据有价值。
2.更多的数据意味着更多的价值。
虽然这些说法没有错,但它们也不对。人们每天都要面对数据的概念及其假定的重要性,但他们很少面对真实的东西。很少有人接触过混乱、纠结、冗余或自相矛盾的数据集。相反,我们已经抽象出处理数据就像淘金的概念。我们设想数据科学家团队通过筛选行来发现神奇的答案或所有重要的见解。
很少有人经历过处理材料数据有多困难,以及出错有多容易。
无法以最原始的形式理解数据的意义,导致数据内容被最终有用性的假设所掩盖。我们每天都要经历并依赖数十个数据支持系统,但很少有人经历过处理重要数据有多困难。很少有人知道犯错有多容易。
Look at all the value! Many numbers. Wow.
将数据描绘成 1 和 0 的二进制位、彩色图表或详细的电子表格太容易了。假设它以某处某个人容易理解的形式存在。我们找到一个专家可以做到这一点,一切都好了。与此同时,仅仅是阅读这句话所需的时间——许多商业领袖想知道他们在商业广告中看到的具有人类名字的人工智能是否可以理解他们所有的数据。
我们不会这样看待其他材料。你不必成为一个专业的木匠来判断一把摇椅是否舒适,或者在坐上去之前猜测它是否能承受你的重量。我们知道枯树的树枝是脆弱和危险的,但同时我们相信我们的生活是由高质量的木材组成的。
我并不主张每个人都参加数据科学训练营,能够旋转 Jupyter 笔记本电脑,或者试图跟上学术界和硅谷的最新技术。我的意思是,当不同学科的团队成员都具有某种程度的数据素养时,企业会从中受益。让专家加入你的团队——但不要把问题抛给他们。与他们合作,理解潜在的问题、更大的战略和你可能还没有意识到的问题。
为什么所有物联网设备都有温度传感器?
你现在可以买到一台每次开门都会记录下来的冰箱。这些数据本身有用吗?否。但是如果数据带有上下文:事件的时间戳,关于品牌、型号和序列号的信息,那么,是的,可能是。即使是基本的统计或机器学习方法(以及一些作为训练数据的例子),一个体面的数据科学家也可以分配概率:家中有人正在接待客人、做饭、度假或有酗酒问题。然后,您典型的工作日日常事务就可以轻松建模了——将这些数据转化为对电器制造商、连锁杂货店、食品生产商、食谱汇总者或家庭用餐服务非常有价值的信息。
如果冰箱无法区分【T4 有段时间没打开过】和不能上网会怎样?这种差异让人质疑数据点之间的每一个缺口。冰箱一整天都没人用,还是数据丢失了?
这就是为什么许多物联网设备都包含温度传感器——不是因为温度数据总是有用的,而是因为它是一种廉价的传感器,可以以恒定的速率发出 ping,并充当设备的一个稍微有用的心跳。温度为数据的其他元素带来了有效性。
Samsung’s newest fridge (Family Hub) takes 3 photos every time the door closes.
我能猜猜你的 SSN 吗?
这里有一个更敏感和简单的例子:生成社会安全号码非常容易。我可以在模式中键入随机数,并可能很快匹配一个已发布的数字:652–12–7623,236–76–1230,824–01–3628。在 10 亿个可能的 SSN 中,大约有 4.5 亿个已经被发布了——所以有将近 50%的机会被命中。在 2011 年之前,这甚至更容易,前几个数字代表区号信息,一些号码范围已经完全用完。我们可以很容易地生成一个数据集,其中包含这种格式的每一个有效的、已发行的和即将发行的 SSN。然而,没有个人所有者的姓名、生日和地址等上下文,它们显然只是带有一些连字符的随机数字。
在什么情况下,一系列可能的社会安全号码真的会成为数据?如果它有十亿行,可以放在数据库中,下载和共享——但没有价值,它还是数据吗?如果我们能够以某种方式准确地给每个人分配一个状态:已发布 _ 存活、已发布 _ 死亡或尚未发布会怎么样?即便如此,随着人们的死亡和新数字的发布,我们的数据集慢慢变得无效和过时。
也许直到我们可以分配另一条个人身份信息时,它才变得有价值:姓,名,出生日期?每一条信息可能就其本身而言毫无用处,但是当把它们加在一起时,就变得异常有价值。
你不需要成为一个伟大的作家来知道如何阅读。
为了让企业发展成为真正的数据驱动型企业,它需要超越孤立的数据科学家团队,采用更广泛、多学科的方法来进行数据扫盲。当企业作为一个整体理解了什么使其数据变得重要时,关于收集什么数据、如何存储数据以及如何理解数据的决策都将得到改进。
对数据的实质和模式持批评态度——询问数据,了解它能告诉你什么,而不是仅仅假设它的最终用途。像对待任何其他材料一样对待它——用健康的实用主义和常识。没有这一点,就不会为最终目的收集数据;它会被囤积起来,最终被扔掉。
记住:仅仅因为你把它写了下来,并不意味着它有价值。
数据捐赠者:用超市积分卡的大数据预防癌症
原文:https://towardsdatascience.com/data-donors-4d31f40971f2?source=collection_archive---------8-----------------------
报纸上充斥着关于哪些食物会导致癌症的头条新闻,大多耸人听闻到了完全不准确的程度。有时,文章取自小型研究,并被赋予远远超出作者意图的严肃性。其他时候,一种单一的成分与癌症有关,一名记者自作主张地宣称,任何含有这种成分的食物,无论数量多少,都对公众构成直接威胁。
这些文章背后的前提很简单。我们吃什么就是什么。这不是比喻。食物在我们的消化系统中被分解成不同的组成部分,并被排出或运送到我们的身体各处,在那里被转化成细胞。不管怎样,癌症是由我们的食物造成的。
不幸的是,癌症发生的机制目前还不清楚。人体是一个庞大的化学过程链,我们还远未绘制出它的全貌。这样的掌握将意味着所有疾病的终结,我们将获得永生。不用说,我们还有一段路要走。
那么我们如何取得进步呢?好吧,没有掌握,我们能做的最好的事情就是估计。收集关于输入(食物)和输出(癌症发病率)的信息,并尝试计算一个因素影响另一个因素的概率,绕过目前无法计算的中间过程。这基本上就是上述研究或记者正在做的事情。问题是准确性。对这种复杂系统的小规模研究很少产生有统计意义的结果,记者们经常在不考虑任何准确性的情况下进行巨大的逻辑跳跃。
我们需要做出复杂的估计,但是系统太复杂了,我们甚至不知道从哪里开始。这就是机器学习发挥作用的地方。如果我们不知道我们需要的精确方程,我们可以收集大量的例子,并应用通用算法来创建预测模型。这个模型的准确性或多或少取决于例子的数量。因此,如果我们确切地知道每个人都吃什么,以及他们是否患有哪种类型的癌症,我们就可以创建一个模型,通过观察他们吃的食物来预测一个人是否患有癌症,这种预测非常准确。这可能会导致早期诊断,或者最好的是,我们可以通过建议人们改变饮食,从一开始就阻止人们患上某些类型的癌症。我们只需要一台超级计算机和数据。很多数据。
在英国,大多数超市都有某种类型的会员卡。购物者在收银台扫描该卡,并获得所购物品的忠诚度积分。超市和顾客获得了购买的数字记录。这是我们需要的数据。一些购物者已经收藏它很多年了。
我建议创建一个志愿者数据收集计划:数据捐赠者。一旦捐赠者注册,他们的超市账户将被匿名链接到一个中央研究数据库。如果他们患有癌症,他们的癌症的详细资料也会附在他们的账户上。这一计划的目的是对成千上万甚至数百万人进行研究。所有这些都是通过在收银台扫描一张卡来实现的。
通过将病人数据和大量的食物数据联系起来,我们将能够用目前还不可能的方法来研究癌症。可以自动发现特定成分和特定癌症之间的趋势,以准确和系统的方式指导癌症研究和公众舆论。
Riot API 的第 1 部分:数据暴雨
原文:https://towardsdatascience.com/data-downpour-b1c4b41d7862?source=collection_archive---------4-----------------------
我已经在大会上完成了一个月的 DSI(数据科学沉浸式)课程,并在我的工具包中引入了一些模型(逻辑、线性、KNN 和 SVM)。但是我只是触及了表面,我仍然没有完全摆脱“黑匣子”的感觉。在这个行业中,有点怀疑是一种理想的特质,但是人们可能会迷失在每个模型的多个抽象层次中。但是现在让我们用一些数据来弄脏我们的手。
在本周的大会上,我们玩了一把 web scrapping,这是在两周不间断的机器学习概念之后休息的好时机。我说的休息是指有更多的时间一次又一次地强化这些概念。
但是这周我花时间学习了我的第一个 API 。在阅读了文档并在论坛上发布后,我设法从原始的 JSON 请求中获得了一个可靠的数据框架。
https://science2knowledge.wordpress.com/data-science-scientists/
W 英雄联盟是什么?什么是 MOBA ?
简而言之,你有两个 5 人的团队,每个团队都有不同角色的化身/角色。
坦克:受到攻击并吸收伤害
实用程序:停止和中断事物。
支援:通常是治疗师,但提供更多的效用。
携带:造成全部伤害的角色。每个人都凑在一起,以确保这个人变得越来越强大。
你从一个标准的 3x3 通道(顶部、中部和底部)开始
谁先摧毁敌人的基地,谁就赢。每个专营权都有自己的风格,但总的来说,形式是相同的。
Solo mid or feed!
再次提醒我建议在你做任何事情之前阅读完整的文档和协议,但是这里有一些我在修补过程中发现的主要警告。
- 鉴于你“制作了”并且“激活了”(通过 Lol 发射器),你要做的第一件事就是找到你的 API 密匙并保证它的安全。如果发生了什么事情,你可以申请一个新的,但是不要在一个公开的 Git 项目或者一个表单帖子上透露你的密钥是常识。(显然这种情况经常发生)
2.记住你提出了多少个要求。明智地使用你的请求电话,因为有上限。
- 每秒 100 个电话
- 每 10 秒钟 1000 个电话
- 每 10 分钟(600 秒)60,000 次呼叫
- 每小时 360,000 次呼叫(3600 秒)
time.sleep(1)对于 python 用户来说是一个很好的解决方案。
3.缓存您的数据以减少请求调用。这是 echos point 2,我在为页面的层和层内的表格数据进行清理时使用了这种技术。逐点工作,而不是从上到下,可以节省你很多时间。
现在让我们深入研究这些数据。我目前使用的是 Python 3.5.2,我的库相当标准。
- 熊猫
- Numpy
- pprint
- json
- ppring
我的第一个请求函数调用一个特定的播放器,并接受一个用户输入字符串。下面是我的基本代码的大概样子。我会关注玩家 Doublelift,,只是因为他这个赛季打了很多比赛,大部分时间都在扮演“搬运”的角色。我就不描述了,只是把这个角色想象成主要的组织者(通常)就像足球中的四分之一后卫或者篮球中的大前锋。
#Global varsummoner_id = "https://na.api.riotgames.com/api/lol/NA/v1.4/summoner/def request(name):
time.sleep(1)
print("Request Done")
URL = "{}by-name/{}?api_key={}".format(summoner_id,name,key)
response = requests.get(URL)
return response.json()#One of the top Lol players right now is called Doublelift
# Request yields his info{
"profileIconId": 1467,
"name": "Doublelift",
"summonerLevel": 30,
"accountId": 32971449,
"id": 20132258,
"revisionDate": 1492316460000
}def main():
player_match_df_list = {}
name = input('Name: ')
raw = request(name)
player_id = (raw[name.lower()]['id'])
# Grabs 20132258 and puts it into match_list function
# which takes the match id and grabs a JSON list of that specific match. m_list = match_list(player_id)
return m_list#This yields a list of last 10 games played (This varies between player and Season)
现在,您可以使用“id”来访问更低级别的数据。
玩家 Id → 匹配者 → 匹配细节
此时,我将数据缓存到一个嵌套的字典中。现在我可以制造和打破,直到我的心满意足。在使用原始的 JSON 之后,我能够创建一个干净的数据框架来使用。
Raw JSON
Into a beautiful clean data frames
让我们通过比较 K/D/A(杀死/死亡/辅助)来看看我是如何处理官方比赛历史的
不错,事情看起来很匹配。到目前为止,我的 python 脚本设法获取了多达 10 个匹配,并将每个数据帧存储到一个字典中。
现在,有了工作中的可用且可靠的数据集,我可以继续探索和建模数据了。这才是真正有趣的地方。因此,随着我们深入研究数据,预计下周会有一些 seaborn graph。
数据驱动的内衣购物
原文:https://towardsdatascience.com/data-driven-lingerie-shopping-6dc61c57f97f?source=collection_archive---------3-----------------------
如果爱情是盲目的,为什么情趣内衣如此受欢迎?多萝西·帕克
黑色蕾丝还是红色网纱,高腰还是低腰?胸罩还是胸罩?有带子还是没有?丁字裤还是男孩裤?关于睡衣也有类似的问题。但是当我看到价格时,“这个和那个,这些和那些”就变成了“只有这个胸罩和这个内裤”。
我经常问自己:我如何比较,并得到最好的价值价格?维多利亚的秘密品种繁多,但是比卡尔文·克莱恩贵吗?汉克·朱岳鹏比卡尔文·克莱恩便宜吗?又或许梅西百货的卡尔文克莱恩比官网或者亚马逊的卡尔文克莱恩便宜?
由于包含从内衣品牌网站(美国)提取的数据的数据集被发布在 kaggle 上,我们现在可以分析哪里可以获得最佳价值。也许你会为下一次购买得到灵感,或者你会找到打折胸罩的品牌。
分析
目的:确定哪些内衣品牌的价格最低
数据集:从美国(。com)内衣品牌网站包括亚马逊和梅西百货。它包含以下信息:
- 产品名称,
- 以美元为单位的最高零售价格(MRP ),
- 以美元为单位的价格(折扣价),
- 产品类别,
- 产品描述,
- 评级数量和评级分数,
- 可用尺寸,
- 总尺寸
- 和颜色。
从分析中排除:评级数量和评级分数、可用尺寸和总尺寸。
品牌:
- 卡尔文·克莱因:官网(OW),亚马逊和梅西百货
- Topshop
- 维多利亚的秘密:OW 和亚马逊
- 汉克·朱岳鹏:噢,亚马逊和梅西百货
- 沃科尔:噢,亚马逊和梅西百货
分析的结构
在以下部分中,我们将分析不同的问题,即:
1。每个品牌提供的产品种类是什么,他们最贵的产品是什么?
2。哪些品牌有低价的文胸、内裤、胸罩?还有,维多利亚的秘密和卡尔文·克莱恩的比较。
3。总结(您可以直接跳到这里查看见解)
为了进行分析,我们将使用与群集图、小提琴图重叠的箱线图以及平均值和中间值的组合。虚拟化是用 python 的包 seaborn 完成的。
在下一篇博客 中,我们将找出哪些品牌提供的折扣最高,并看看其他一些有趣的发现。更详细的分析请访问 github 。
1。产品种类
1.1 每个品牌有多少产品?
在对数据进行广泛过滤后,我决定不考虑尺寸。制造商将通过其产品名称或型号来定义独特的产品。然而,想象只有一个胸罩模型,但是有 9 种不同的颜色。您认为它们是独立独特的产品吗?我决定我会,所以一个独特的产品是由一种颜色和一个模型来定义的。在图 2 中,我们看到亚马逊维多利亚的秘密只销售一种型号的胸罩,但颜色不同,看起来像完全不同的产品。(图 3)
Fig.2: The number of producs as defined by its name and color and a number of unique products defined only by its product name
维多利亚的秘密共有 455 款独特的产品型号。这意味着如此大量的产品(3.5K)是因为该品牌提供了大量不同的颜色。这不就是所有女人想要的吗?;有趣的是,Calvin Klein OW 的销量比梅西百货的 Calvin Klein 还要少,亚马逊 CK 的销量甚至比这两家还要少。
Fig.3: Amazon has the same model of Victoria’s Secret ultimate maximum support sport bra in 9 different colors (three are shown).
1.2 品牌提供什么好的产品?
我们将根据产品类别对产品进行总结,例如丁字裤、衬裤、平角裤等将归入“内裤”类别。bralettes 有一个相当有趣的趋势,所以我们将 bralette 与 bra 区分开来。
一些有趣的事实(快捷方式):
- 汉克·朱岳鹏、亚马逊和梅西百货的卡尔文·克莱恩提供大量包装(主要是内裤)。
- 维多利亚的秘密的主要产品是内裤和运动服(主要由运动胸罩组成),其次是胸罩和胸罩。
- 梅西百货的 Calvin Klein 比 OW 销售更多的内裤和胸罩,也有更多的产品类别。
- 华歌尔的主要产品是女裤。
- Topshop 还有母婴用品和梅西百货的 Wacoal shape 产品。
- 一些品牌出售吊带裤、紧身衣裤、婴儿装、长袍、和服、塑身衣和眼罩。
维多利亚的秘密在主要类别(内裤、胸罩、胸罩)中销售最多的产品,除了卡尔文·克莱恩的睡衣。(图 4)
Fig. 4: Number of products in each category offered by top 6 brands
1.3 最贵的物品是什么?
图 5 显示了每个品牌最贵的商品(基于最高零售价格(MRP))。
Fig. 5: Yes, Hanky Panky sells a jar full of panties for $615 (30 pairs of panties)
2。最贵或低价的品牌有哪些?
2.1 都是关于胸罩的……
基于 MRP(图 6):
- Topshop 和维多利亚的秘密的文胸(不到 31 美元)比其他品牌便宜。
- 最贵的文胸由汉克·朱岳鹏提供(但总共只有 15 款)。
- 如果你喜欢 Wacoal,先去梅西百货看看。梅西百货的 Wacoal 有第二贵的胸罩。然而,它销售更多的胸罩,也涵盖了其他代表的价格范围。
- 梅西百货的 Calvin Klein 卖的胸罩比 OW 贵,但也涵盖了 OW 的价格范围。
- Topshop、维多利亚的秘密和 Macy's Calvin Klein 都有一些非常贵的胸罩,价格超过 70 美元。
Fig. 6: MRP comparison of bras for each brand
2.2 低价内裤?
- 汉克·朱岳鹏的内裤是最贵的。内裤分两组:少的和贵的(基于小提琴剧情 MRP 双峰分布)。
- 维多利亚的秘密有 ca 最低价的内裤。1.2K 型号,大多数价格为 10.50 美元。(但是,不要忘记有些品牌有“33 美元 3 个”或“XX 美元 5 个”的优惠。)
- Topshop 的大部分内裤的 MRP 为 10 美元,但也有一些更贵的内裤。
- 大多数卡尔文克莱恩内裤的 MRP 是 13 美元。
Fig. 7: MRP comparison of panties for each brand
然而,别忘了亚马逊和梅西百货也出售卡尔文·克莱恩的成套内裤。大多数内裤的价格是 11 美元,但是亚马逊 Calvin Klein 也提供每条内裤大约 9.75 美元的包装。(图 8)
Fig. 8: MRP per panty from a pack
2.3 低价 bralettes?
- 汉克·朱岳鹏有最贵的胸罩。
- 维多利亚的秘密有最便宜的 bralettes(亚马逊 Wacoal 更便宜但只有 7 件)。
Fig. 9: MRP comparison of bralettes for each brand
2.4 卡尔文·克莱恩 vs 维多利亚的秘密
卡尔文·克莱恩几乎在所有类别都比维多利亚的秘密贵,除了“其他”。有几个昂贵的维多利亚的秘密胸罩,然而,也有许多便宜的维多利亚的秘密胸罩相比卡尔文克莱恩。(图 10)
维多利亚的秘密的 Bralettes 和 activewear 呈现双峰分布,这意味着有两个主要的价格类别。
Fig. 10: MRP comparison of categories of Calvin Klein and Victoria’s Secret
3。总结
文胸:
- 如果你是 Wacoal 或者 Calvin Klein 的粉丝,先去梅西百货看看。虽然 Macys 的文胸平均比 OWs 贵,但它提供的文胸更多,产品价格也在其他代表的价格范围内。
- Topshop 和 Victoria's Secret 的文胸比其他品牌便宜(不到 31 美元)。
内裤:
- 维多利亚的秘密有最便宜的带 ca 的内裤。11.50 美元以下的 1.2K 机型。
- Topshop 的大部分内裤都有 10 美元的 MRP。
- 大多数卡尔文克莱恩内裤的 MRP 为 13 美元,但检查一下亚马逊卡尔文克莱恩和梅西百货的包装。
小册子:
- 维多利亚的秘密有最便宜的胸罩。
祝你下次购买内衣愉快!
衡量您决策的质量,而不仅仅是您的数据
原文:https://towardsdatascience.com/data-driven-performance-6d5b5bb4c5dc?source=collection_archive---------3-----------------------
在制定更好的决策的过程中,数据总是处于次要地位。随着公司花费越来越多的时间和精力来获取组织和市场数据,这些投资的回报将取决于我们将数据转化为有效决策的能力。数据本身并不能产生相关的决策,因为决策经常受到不确定性、模糊性和复杂性的阻碍。衡量我们决策的质量可能比提高我们数据的质量更重要。让我们看看为什么衡量决策如此困难,以及为什么它有如此大的潜在回报。
当今改善决策的障碍之一来自管理挑战的多样性。在“客观”层面上,当手头的数据足以确定一个最佳的前进方向时,我们称问题为简单的,当数据在给定的环境中不能提供更多的最佳答案时,我们称问题为复杂的。在“主观”层面上,当管理者理解了摆在他们面前的选择的可能性和结果时,他或她就会评估风险。当由于这样或那样的原因,概率和结果不能被精确地确定时,管理者就面临“不确定性”。当决策者质疑问题本身的清晰性时,“模糊性”的因素就进入了等式。因此,管理的目标很少是寻找正确的答案,而主要是通过减少风险、不确定性和模糊性的来源来帮助经理和客户做出更好的决策。
衡量决策变得复杂,因为*“最佳”选择既取决于问题本身的性质,也取决于管理者的心态*。在决策科学中,我们指的是制约人类决策的四种心态。乐观主义者就像乐透玩家一样,总是在最大可能的回报上下赌注,不管可能性有多大。相反,最糟糕的愿景困扰着悲观主义者,他们会虔诚地试图将潜在损失最小化。机会主义者将运用类似于杰夫·贝索斯的后悔最小化框架的推理,关注能提供最大内心平静的结果。【ii】最后,现实主义者计算每一种可能结果的潜在回报,并试图最大化期望值。因为每个愿景依赖于不同的推理路线,所以有必要了解每个经理的心态如何与盛行的组织文化相对应。
用于衡量决策过程的指标提供了第三个层次的复杂性。在寻找更好的决策时,我们到底在试图优化(或最小化)什么?我们可以关注收益率——每种替代方案的潜在好处是什么?我们可以专注于努力——为了将选择付诸实践,必须动员多少资源和精力?也许我们应该关注速度,考虑到我们的其他职责,我们能多快找到合适的决策?最后,我们可以评估模型本身的相关性,所提出的解决方案在多大程度上解决了手头的问题?正确的衡量标准取决于组织和行业如何衡量价值。【iii】
最后,我们可以考虑经理们在给定环境下试图做出最佳决策时所面临的运营挑战。让我们以改善组织的决策过程为例。第一个复杂因素来自问题本身——对于我们所指的决策制定,组织上是否有共识?还有手头数据的相关性问题——我们今天有什么证据证明我们正在作出糟糕的决定?可以对我们试图达到的目标进行讨论(每个决策的相关性、速度、努力或收益?).最后,如何研究检验我们建议的最佳方法(抽样、模拟、调查、面对面访谈)?
像任何技能一样,提高决策能力需要分析和实践。在商业分析学院,你将学习特定环境下的挑战、心态和管理决策的衡量标准。在我们位于巴约纳的暑期学校,以及我们在欧洲的大师班,我们让数据科学为您和您的组织服务。该研究所专注于管理者数据科学的五个应用:在数字时代工作、数据驱动的决策、机器学习、社区管理和可视通信。数据驱动的决策会对你未来的工作和职业生涯产生影响。
Lee sch lenker 博士是 http://baieurope.com商业分析学院的商业分析和数字化转型教授。【www.linkedin.com/in/leeschlenker.】你可以在推特上关注我们https://twitter.com/DSign4Analytics
【I】ka sture,r .(2015)决策制定,对歧义的容忍度和后悔理论,Vivify
【ii】Stillman,J. (2016),亚马逊的杰夫·贝索斯如何做出他职业生涯中最艰难的决定之一,Inc
【iii】Blenko,m . and Mankins m .(2012)衡量决策有效性,贝恩公司
数据驱动的产品管理
原文:https://towardsdatascience.com/data-driven-product-management-by-taner-akcok-ffd421cfa8d3?source=collection_archive---------4-----------------------
每个产品经理都在谈论数据驱动的产品管理,但真正的解释是什么呢?
Photo by Mario Gogh on Unsplash
产品决策过去是基于产品经理/所有者和 C-Level 高管的愿望和本能。这些本能的主要驱动力是什么;客户反馈、竞争市场情报还是数字分析结果?答案应该是全部。在本文中,我将尝试解释关键的数据源,以及在这些数据源中应该考虑哪些指标来做出正确的产品决策。
成功的产品属于客户而不是产品经理。但这并不意味着产品经理应该只依赖客户的需求。有时甚至顾客也不知道他们想要什么,需要什么。产品经理必须用不同的数据源验证他们的客户反馈。
我强烈建议产品经理和公司高管去看看 Marvin L. Patterson 在他的书《打造一个行业飞车手罗德》中的创新引擎商业模式。
Designed by Marvin L. Patterson and adapted to Product Management by Taner Akcok
如图表所示,产品管理应考虑来自市场研究、CMI(竞争对手市场情报)、内部反馈、数字分析和客户反馈的数据,以做出数据驱动的决策并创建增值信息。听起来很容易,但是评估信息的价值并将它们与产品路线图联系起来需要付出努力。让我们一个一个地深入研究它们,我将尝试解释我是如何在我的产品管理工作中使用这个模型的。
市场调查
当我们掷硬币时,正面或反面的概率是多少?50%?可惜没有!如果我们考虑方程中的所有变量如翻转时施加的初始力、重力、空气阻力等。没有硬币的可能性。产品管理和定位也是如此。如果产品经理能够通过适当的市场调查和有用的客户反馈来考虑正确的市场指标和趋势,就没有可能制造出成功的产品。
在本文中,我不会深入探讨产品经理应该做的市场调查,但我想分享一下我在市场调查过程中使用的流程:
Market Research and Product Positioning Process on Product Management
如果你想深入产品营销领域,我强烈建议你对图中列出的项目进行研究;
确定研究指标、确定研究来源:目标市场、目标受众、客户/用户需求和行为、市场规模、**深入数据:**数据收集、数据分析、**创造洞察:**杵、SWOT、BCG 矩阵分析、GE 麦肯锡分析、波特五力、**创造假设:**价值主张假设、产品定位假设、UX 假设、走向市场假设、可视化并传达
我以后会尝试用一篇独立的博文来讨论这个话题。
此外,有许多有用的市场研究公司,产品经理可以用它们来轻松获得快速的市场洞察。但是在本文中我将只解释其中的两个; Forrester 和 Gartner 。
Forrester 提供报告剧本博客数据和事件来传播他们的研究成果。特别是市场特定的 Forrester Wave 报告对市场研究人员非常有用。Forrester Wave 研究在所有标准化研究中提供了相同的大纲。这种标准化允许研究人员轻松地将多项研究结合起来,并获得有用的见解。通常,他们的波浪报告大纲是;
Forrester Wave Report Outlines
然而, Gartner 在其研究中使用了魔力象限方法来显示厂商的市场定位。他们通过执行能力和愿景的完整性来评估主要供应商。他们把他们分为领导者、挑战者、小众玩家和远见者。通常,他们的报告大纲是;
Gartner Magic Quadrant Reports Outline
这些研究显示了市场中供应商的优势和劣势,并帮助产品经理验证他们的定位。有时候,利基产品和想法很难找到市场,或者他们可能需要根据市场趋势来验证他们的愿景和路线图。市场研究帮助产品经理验证他们的定位和产品愿景,以做出数据驱动的决策。
竞争对手市场情报
该术语在企业公司中通常被称为职能。CMI 部门不断检查其他竞争对手,监控他们的内容、年度报告,并要求演示以了解竞争对手的价值主张和差异化。使 CMI 数据可用于产品路线图的最简单方法是比较方法。这种方法的关键点是将你的产品作为一个价值主张进行比较,将你的产品作为一个功能集进行比较。
价值主张比较通常来自市场上的供应商选择标准。例如,让我们将“实施”、“及时性”、“定制化”、“准确性”和“用户界面”视为分析市场的主要供应商选择标准,并将这些价值主张的 KPI 定义为能够在 0-8 分之间进行评估。
Sample Vendor Selection Criteria for Analytics Market
关于这种评估和比较,您将有一个五边形图来显示您的公司和您的竞争对手的各个方面,如下图所示。
Sample value proposition distribution for the market
了解价值主张的优势和劣势后,这些五边形可以用作面积图,通过重叠它们来查看对比。
功能集比较用于基于产品用例和功能提供。您比较代表我们在上一段中列出的价值主张的子 KPI 的特性或用例。评估和比较功能集或用例的一般方法是给它们打 1-8 分或 0-100 分。
在这一点上,我想注意一下产品定位。 一个成功的产品并不意味着在所有价值主张和功能集比较中具有完全优势。 你的优势领域必须与你的产品定位相适应。
例如,这里有一个样本表来比较功能集,并验证一个假想的公司在分析市场中的定位,假设我们的产品在准确性方面与其他产品有很大区别。我们可以检查/看到,我们的精度相关功能在市场上是独一无二的:
Sample Feature Set Comparison for Analytics Market
比较价值主张和功能集有助于产品经理改进和优先考虑他们的竞争优势路线图。如果需要对当前产品进行改进,产品经理通常会将这些见解与他们相关的产品概念联系起来。如果它需要一个新的特性,产品经理会围绕它建立一个概念。
通常,这种比较会给你带来 4 个主要子市场定位决策或多样化的价值主张:模仿、合作、跟随、竞争。
例如,你可以说,我将在准确性上具有竞争力,在及时性上是模仿者,在用户界面上是跟随者,在定制化上与其他玩家合作。
How to act into sub-markets or diversified value propositions
内部反馈
定义正确的独特卖点(USPs)并围绕这些 USPs 的使用案例积累经验对于成功的产品管理至关重要。收集这些见解的最佳方式是内部反馈,尤其是来自“售前”、“销售”、“咨询”和“IT”部门的反馈。这些部门是产品管理决策的重要利益相关者。
每个产品都有一些“啊哈!”吸引潜在客户的时刻。售前是一个重要的利益相关者,了解哪些用例对客户最重要,以及客户第一次看到产品时对产品的想法。
覆盖重要的用例并不意味着产品足够好来满足那些用例中的客户。“销售”和“咨询”是重要的利益相关者,他们了解在那些用例中,好的产品的特性集如何满足真正的需求和愿望。例如,客户想在产品中从 A 到 B,如果产品在 B 之前将客户带到许多强制目的地,我们不能认为体验完美地覆盖了那个用例,即使产品覆盖了那个用例。“销售”和“咨询”是发现这种瓶颈的关键利益相关者。
易于集成和使用、入职体验和文档是产品经理必须考虑的另一个主题。“咨询”是这种投入的关键利益相关者。最大化咨询的收费时间,产品应该有良好的入职体验和文档。这一部分对于将 COGS(商品销售成本)保持在合理水平非常重要。
“内部反馈”的另一个重要利益相关者是 IT。了解概念背后的挑战、路线图项目的预计劳动力和投资对于在做出产品决策之前计算更准确的业务价值非常重要。此外,与产品负责人和 IT 领导同步可能有助于从不同的角度查看和评估产品团队解决方案。
内部反馈评估有一些常用方法,例如:价值与复杂性象限、加权评分、Kano 模型、购买功能、机会评分、亲和力分组或故事映射。
Common methods for feedback prioritisation
最常用的方法是价值与复杂性象限。该象限通常如下图所示:
Visual source: Hygger.io
这种方法的主要思想是定义速赢和战略机会,并优先考虑你的史诗到正确的方向。
我另一个喜欢的方法是卡诺模型。这个模型的主要思想是,你的产品总是表现在基本特性和刺激特性之间。
我将会写更多关于这些方法以及如何评估内部/外部反馈并在未来优先考虑它们的详细博客文章。
数字分析
引用爱德华·戴明的话,“我们相信上帝;其他的都带数据。”。关于像素和标签集成,在线解决方案收集了几乎所有的设备、用户和动作数据。正确的事件模式和分析结构是深入研究和获得正确数据的关键,有助于轻松了解客户行为及其痛点。
在本文中,我想提一下关于数字分析的两个重要话题。请从我的“对分析市场的 7 个预测”文章和我的下一篇文章中找到详细信息。
第一个话题是将所有数据整合到一个平台的重要性。产品经理过去常常通过数据仓库、数据管理平台或客户智能解决方案来获取组合数据。如今,企业从各种数据源和内部/外部服务收集大量数据,如 Magento 、 MailChimp 、 Zendesk 、 Salesforce 、 Olark 等。将这些平台的数据整合到一个环境中对于进行跨工具分析非常重要。例如,我们应该结合数字分析和电子邮件服务数据,并将它们与唯一标识符进行匹配,以了解有多少男性消费者打开了我们的“新一季男性吸引力产品”简讯。然后,也许我们可以根据他们的 cookie 数据和标签返回者,通过将我们的广告和 CRM 服务连接到我们的数字分析平台,在我们的数据库中自动将他们定位为“潜在的新一季产品买家”。
第二个主题是使用适当的分析和监控所需输出的正确指标,以做出数据驱动的决策。数字分析解决方案提供了一系列分析选项。在我的下一篇博文中,我将深入探讨所有这些分析,但在本文中,我将只提到几个重要的分析和指标。
**漏斗:**漏斗是监控预定义步骤之间转换的最佳方式之一。漏斗最常见的可视化方式是桑基图。产品经理或业务分析师可以创建各种渠道。例如,对于结账流程,我们可以检查一些步骤,如将产品添加到购物篮= >转至结账页面= >选择付款选项= >结账。然后,我们可以创建一些在这个漏斗中弹跳的人群,并设置一个营销触发器,向他们发送一封电子邮件,如“您需要退房帮助吗?”
然而,在现实世界中,有时漏斗可能比这更复杂。例如,顾客可能会在结账前参观其他产品。这可能会影响我们的漏斗,我们可能会认为他们是保镖。对于这种场景,我们可以将一些步骤定义为漏斗中的“可选”步骤。此外,许多分析解决方案允许为用户定义步骤的时间条件,以便在从上一个或第一个目标开始的特定时间范围内完成目标。
**falloutes:**falloutes 分析是页面流量分析和漏斗分析的结合。产品经理和业务分析师可以看到漏斗步骤之间的详细用户行为,以了解人们为什么反弹以及他们要去哪里。这种洞察力可能有助于创建更准确的漏斗或用户流。
**群组:**群组是精心设计的可视化方式,为条件化的目标群体测量期望的度量。在运行群组之前,产品经理应该用“包含性指标”和“返回性指标”来决定群组的“粒度”。包容性指标有助于您定义有条件的目标群体,如所有访客或买家等。返回指标将帮助您选择要从包含组中测量的指标。“访问”可以是返回指标的一个很好的例子。
群组最常见的用途是监控访问者对特定页面或动作的“保留率”。
**流:**流分析让用户可以可视化任何维度或维度项目的序列。此外,流分析也有利于可视化多维序列。例如,“活动”维度的入口流。如果你添加“页面”作为下一个维度,你可以很容易地想象有多少访问者通过活动而来,他们登陆了哪些页面。市场上最常见的流动分析可视化方式是“桑基图”。
产品经理可以在单个或多个维度的视角中可视化“入口维度”、“出口维度”或任何“维度项目”流。
**异常分析:**这些分析最常见的用途是可视化每个数据点的标准偏差水平,并通过使用折线图支持面积图来显示异常(超出或低于标准)。
产品经理可以注意到他们的主指标中的异常,并深入到子指标以了解异常的原因。但是现在,一些企业分析解决方案也提供了这种异常的相关子 KPI。
**分析变量比较:**分析变量比较允许用户同时比较不同时间范围或时间段或两者的指标。
正如我提到的,我将在我的下一篇博客文章中深入分析和公司指标,但我想提一下戴夫·麦克卢尔的“海盗创业指标”。它可能会给出产品经理和营销人员应该监控和深入研究的主要指标的基本概述。
Startup Metrics for Pirates by Dave McClure
根据上面的 Dave McClure 的海盗启动指标图;类别代表客户在客户旅程方面的成熟度。用户状态显示产品经理可以针对该步骤监控的指标。转换代表平均值。漏斗步骤的转换率和估计值并不代表用户的成本;它代表平均值。该步骤中每个用户的值。
产品经理应该使用正确的分析来获得对数据驱动的决策有用的见解。但是,术语“数字分析”不仅仅是可视化数据。我将在以后的文章中深入探讨这个话题。
客户反馈
客户反馈对于做出以客户为导向的产品决策具有战略意义和至关重要的作用。但是,收集、组织和评估客户反馈应该以适当的方式进行,以便能够考虑有用的客户反馈,避免无用的反馈。
为了收集和组织反馈,您应该为反馈创建过程建立面向主题的分解,并围绕当前产品功能或未来概念对这些反馈进行分类。
Sample Customer Feedback Clustering Structure
例如,根据上图,我们有三种不同的标签集成场景——容器——容器动作——删除功能。
场景 1 表示一个 bug,它应该围绕该特性聚集在一起,并用其他聚集的 bug 来解决。bug 的数量和类型可以给人一种产品特性成熟度的感觉。
场景 2 代表一个看起来像 bug 的客户问题。但是在这种情况下,假设被删除的容器在 24 小时内消失。因为一些缓存问题。在这种情况下,产品应该警告客户这种情况。这就是为什么我们可以将此场景视为知识中心增强或 UX 改进。
场景 3 代表客户对特定功能的功能要求。这些类型的请求应该被标记为一个特性请求,在这个特性的下一个版本/迭代中考虑。如果业务价值优先考虑标签集成改进,则应该考虑该反馈来决定是否与其他请求一起进行。
如果你对我的博文有任何问题或评论,请不要犹豫联系我,并继续关注我的网站或媒体账号了解我的下一篇博文。
Taner Akcok
数据、毒品和摇滚——除了摇滚
原文:https://towardsdatascience.com/data-drugs-and-rock-roll-minus-the-rock-roll-18e286a32852?source=collection_archive---------11-----------------------
几周前,我有机会分析了公告牌 2000 年 100 大热门音乐排行榜的数据集,它显示摇滚是排名第一的音乐类型。上周,我浏览了一组美国不同年龄的药物使用数据。尽管我有医疗保健的背景,并且我在该县工作,该县一度提供了全国 70%的非法麻醉品,但这个数据仍然令人大开眼界。查看人们开始滥用某些物质的年龄以及他们滥用某些物质的高峰期,以及查看哪些药物被一起使用的趋势,是我浏览该数据集的主要目标。
该数据集包括 13 种不同的物质,它按照用途、使用频率和使用时的年龄范围对它们进行了分类。不幸的是,我无法找出这个数据集是哪一年的,但我假设它是在 2000 年或之后产生的。我的第一个目标是制作一张热图,看看我能找到什么样的关联。
在上面的热图中,n 是给出特定年龄范围答案的参与者人数。在查看热图并重新聚焦于确定“门户”药物(一种与其他药物具有高度使用相关性的药物)的目标后,我决定删除年龄、n 和所有频率。
有了这张热图,我能够更好地看到 13 种物质使用之间的相互关系。然后我确定了 0.9 或更高的高相关性。我知道相关性非常高,但是选择一个较低的数字只会产生太多的匹配。通过这种方式浏览数据后,有一种物质与其他 7 种物质(超过一半)高度相关,这就是止痛药,我已经假设了这种情况,因为它们非常容易被人得到并与其他物质混合。此外,我查看了止痛药使用的高峰年龄范围,我的年龄为 20 岁和 22-23 岁,然而人们早在 12 岁就开始滥用止痛药。
我从这些数据中发现的信息非常令人不安,显示了药物滥用问题是多么的猖獗。很明显,需要设置更多的障碍来防止人们接触这些物质,我知道很多州都在这样做,但是我希望我们可以在全国范围内这样做,希望我们至少可以拯救年轻一代免受这种接触。我相信通过这样做,滥用药物的人数将在未来几代人的时间里下降。
数据工程师 VS 数据科学家
原文:https://towardsdatascience.com/data-engineer-vs-data-scientist-bc8dab5ac124?source=collection_archive---------0-----------------------
想阅读更多数据科学与工程文章?关注 Linkedin 上的数字资源!
大数据改变了世界的面貌!
随着每天创建 2.3 万亿千兆字节的数据,公司可以访问关于其用户、市场等的广泛信息。
这些数据让他们不断改进产品/服务。
公司已经理解了大数据所代表的机会。数据工程师和数据科学家职位的激增向我们展示了这一点。
2011 年,*《哈佛商业评论》*将数据科学家选为 21 世纪最性感的工作,以彰显该职业的成功!
然而,这一工作领域尚未完全成熟,数据工作仍然容易受到误解。对许多人来说,它是一个模糊的技术“东西”,可以潜在地实现他们的产品或服务。
这种误解可能导致资源利用的失败。让我们回到这些职业的基础上,并解密每个职业的价值。
我—数据工程师和数据科学家之间有什么区别?
1-了解数据流程的层次结构。
图 1 —数据科学需求层次结构—由Monica Rogati创建
当一家公司生产一种产品/服务时,他们需要有价值的信息来了解他们的市场,了解他们的竞争对手,创造一种产品,了解客户,等等。
在世界开始收集数据以提供我们所说的大数据之前,企业别无选择:
-进行自己的分析
-利用直觉做出决策
要恢复,你需要经验(或运气)来满足市场预期。
现代技术是第四次革命。大数据为创造更好的企业、组织、慈善机构等提供了大量新的可能性……
但是,利用大数据需要流程、组织、工具,最重要的是:能够管理大数据的人。
根据你想做的事情,数据工程师和数据科学家对于流程中的某些任务至关重要。
“数据科学需求层次”金字塔很好地反映了复杂的数据流程。
数据工程师收集相关数据。他们将这些数据移动并转化为数据科学团队的“管道”。他们可以根据自己的任务使用编程语言,如 Java、Scala、C++或 Python 。
(阅读关于数据工程中编程语言的文章)
数据科学家分析、测试、汇总、优化数据,并将其呈现给公司。
(阅读数据科学中关于编程语言的文章)
一些流程先进的公司用 AI 工程师、机器学习工程师或者深度学习工程师来完成团队。
参见“数据科学需求层次”图 1
可以理解的是,所有这些任务都必须划分给特定的数据专业人员。
2 —数据工程师—数据的技术部分—设计—建造—安排。
数据工程师专门从事 3 种主要的数据活动:设计、构建和安排数据“管道”。他们是数据架构师。数据工程师通常拥有计算机工程或科学背景和系统创建技能。
“数据管道是为了特定目的而应用于数据的一系列处理和分析步骤。它们在生产项目中很有用,如果人们希望在未来遇到相同类型的业务问题,它们也会很有用,从而节省设计时间和编码。例如,可以删除异常值,应用降维技术,然后通过随机森林分类器运行结果,以对每周提取的特定数据集进行自动分类。”科琳·法雷利,数据科学家/诗人/社会科学家/拓扑学家(2009 年至今)
图 2——从原始数据到最终结果数据的管道。
一个公司的数据工程师有哪些任务?
- 设计大数据基础架构并准备进行分析。
- 构建复杂的查询来创建“管道”。
- 安排编程系统中的任何问题。
数据工程师需要具备哪些能力?
- 逻辑思维
- 知道提取什么数据
- 管理和组织技能
- 与跨职能团队合作
3 —数据科学家—分析—测试—创建—展示
在一家公司中,数据科学家通常有 4 项主要任务。他分析、测试、创建并向团队展示它们。
数据科学家有数学和统计学背景。他们也乐于创建机器学习和人工智能模型。
一个公司的数据科学家有哪些任务?
- 处理干净的数据
- 利用现有数据寻找解决方案
- 与团队交流分析
- 致力于解决问题,并得到一些
数据工程师需要具备哪些能力?
- 良好的沟通技巧。
- 分析得好。
- 很好的假设。
- 在机器学习、数据挖掘、统计和大数据基础设施的不同技术方面有广泛的知识。
- 做一个解决问题的人。
如你所见,工程师和科学家需要不同的技能,他们的背景也不同。
此外,数据科学家必须具备非常好的沟通技巧,以展示数据并根据他们的工作提出决策。
4——在所有这些方面,职位空缺和薪水如何?
根据 Glassdoor 的数据,美国的平均基本工资(2018 年 9 月 26 日更新)为:
- **对于数据科学家:**平均每年 13.9 万美元
- **数据工程师:**平均 151 美元/年
“数据工程师的职位空缺数量几乎是数据科学家职位空缺数量的五倍。根据 Glassdoor 的说法,这是有道理的,因为大多数组织需要的数据工程师比他们团队中的数据科学家多。
II-数据工程师 vs 数据科学家:数据就业市场的状况如何?
1 —数据科学家:成长中的行业
数据科学家是纸上谈兵的梦想工作。
- 高薪
- 必须解决复杂问题的挑战性工作
然而,当他们在小结构中工作时,数据科学家可以转变为多任务员工。
当数据科学家必须处理所有的数据层次结构时,这可能会变得很难,因为他们不是数据工程师或软件工程师。
这可能导致专业的贬值或公司资源的浪费。
有时候,在一家公司担任数据科学家可能是这样的:
因此,研究显示,2017 年, 24.0%的数据科学家已经跳槽。
当然,数据科学就业市场是一个最允许项目员工改变的繁荣环境。
然而,这也表明,大量的数据科学家试图在市场上找到更好的位置。
2 —数据工程师的贫困
数据工程师已经成为一种稀缺商品。
Glassdoor 对超过 10.7 万个数据工程师职位空缺进行了统计。这种需求如此强烈,以至于现在每个人都被这种贫困所触动:
“即使是最热门的硅谷公司也无法达到 1 比 2 的比例。[……]你没有足够的工程人才。很贵的。”大数据中间件开发商 Gremio 的首席执行官兼联合创始人 Tomer Shiran 说。
为什么现在招聘人员很难找到数据工程师?
例如,在荷兰,招聘人员正在寻找具有特定编程工具技能的母语工程师。
然而,他们中的大多数人在发现自己的才华之前都面临着长期的等待。
那么如何找到数据工程师呢?
你首先要知道,这需要一个好的过程。
拥有一份好的数据工程师候选人名单对于选择你需要的人是至关重要的。
但是,寻找数据工程师的过程需要时间和精力,而公司不一定有。
招聘机构的一个目标就是填补需求和提供之间的差距。
通过搜索某个特定领域的日常最佳新人,我们能够回答这个重大问题。
你们公司是在招数据工程师吗?Digital Source 是一家专门从事大数据的招聘机构。点击此处联系我们,让我们讨论您的招聘需求。
寻找大数据的新机遇?点击这里,寻找新的工作机会。
数据工程师在那里,你能看见他们吗?
原文:https://towardsdatascience.com/data-engineers-are-there-did-you-see-them-9b6452e92b23?source=collection_archive---------3-----------------------
目前对数据工程师的需求很大。我可以看到工作提议在 LinkedIn 上蓬勃发展。然而,招聘一名数据工程师相当困难。我听到很多人说这与这个报价和供应平衡有关。大数据是全世界的趋势,非常需要能够驾驭这种数据的工程师。这是事实,不可否认。我今天写这篇文章的原因是,我坚信还有别的东西,或者说更多的东西。
你是说数据工程师吗?
在网上看了工作建议后,我得出结论,数据工程师的职位很难定义。我可以读到对同一个所谓的数据工程师的各种职位和技能要求,看起来每个公司都有自己对数据工程师的定义。我见过非常接近 IT 工程师的工作描述。其他的是关于发展的。令人惊讶的是,我甚至读到过一些公司在寻找一名数据科学家作为数据工程师。
这种模糊性带来了很多混乱。这让我感到不安,尽管我已经做了一段时间的数据工程师。
我确实认为数据工程师的定义中缺少了一些东西,以下是我的看法。
缺失点
我看到的大多数工作机会都需要技术技能,比如 ETL、Spark、Hadoop 或 NoSQL。这非常非常棒,但实际上这些只是工具。我们在这里谈论的是达到目的的方法。这个目的就是数据处理,对我来说,这就是全部的意义所在。我被面试过很多次,为了一份工作或者一个承包商的任务,我总是得到同样的问题:什么是 Scala 的伙伴?什么是数据流?你将如何在 Kafka 中配置分区?这些问题真的很有趣(我发现它们很有趣,因为我热爱信息学这个领域),但在那些面试中,人们都在检查我是否了解这些工具,我是否填好了表格,几乎没有人谈到我可以从中提取的价值。
举个例子,Apache Spark: Spark 已经成为你想要处理数据时的首选工具之一。很好,但是 Spark 的任务不是写作业。您可以用 4 种不同的语言编写相同的 Spark 作业。编写一些 Spark 已经变得非常容易,但是对于您的项目和最终用户来说,这能确保您的数据以最有效的方式得到处理吗?事实上,并没有。这就是数据工程师发挥作用的地方。数据工程师的真正价值是利用他的专业知识在集群中部署和分发作业,并配置资源,从而最大限度地利用集群。
给我带来一些价值
简而言之,数据工程师的价值在于数据为什么、何时、何地以及如何被处理。所以让我说一次重要的话。是的,归根结底,所有这些都是数据的问题,这正是数据工程师在这里的目的。我相信数据工程师不会从工具和技术方面考虑,而是从架构方面考虑,选择工具就像书架上的书一样。实际上,数据工程师的真正目的是理解数据,设计处理数据的方式,然后通过选择确保可靠性和性能的最佳工具配置来帮助促进数据处理。
当然,数据工程师需要对环境和上下文有很好的理解。因此,在所有这些尖端工具中进行选择需要大量的经验。但是了解这些工具并不能保证数据管道的性能。这也会导致误解你真正需要什么样的资源。维护 Hadoop 集群不是数据工程,而是 it。专门在 Spark 上开发不是数据工程,是开发。用 MLLib 建立数据模型不是数据工程,是机器学习。
当我收到一份数据工程工作的候选人时,我会努力关注他如何考虑他的技能和他将不得不处理的数据之间的相互作用。学习一个工具可能需要几周,甚至几个月。拥有良好的心态需要很多年。
期望不仅仅是掌握工具和框架
这就是为什么我认为寻找数据工程师不仅仅是验证传统大数据堆栈的专业知识。这其实是一个你想关注什么的问题。如果你的目标是在专家中找到专家,那很好,我同意你,你的研究将是一个漫长的旅程。但是,如果你关注的是工程师能提供什么,因为他关注的是数据而不是工具,那么你可能已经挑选了一个潜在的非常好的候选人。
最后,随着客户的要求越来越高,数据处理变得越来越复杂,我倾向于相信数据工程师的数量会比实际数量多得多。许多工程师在面试时被抛弃,因为他们对 HDFS 如何工作的内部细节了解不够,或者他们对 scala 了解不够。你是因为候选人不懂工具而拒绝他吗?测试他对数据的兴趣,以及他对如何从中提取价值的关注,难道不是更相关吗?一个拥有良好心态的人将会取得比仅仅使用工具更多的成就…
让我与你分享我的一个经历,来解释为什么我相信数据工程师都是关于数据的。几年前,在我以前的工作中,我遇到了一个非常奇怪的情况,我在做一个没有数据的项目!我准备好摇滚了,我的 Kafka 设置,我的 Ansible 脚本,我的 Spark 集群和我的作业都准备好运行了。问题是没有数据。此时此刻,我的工作看起来毫无意义,我意识到最重要的是数据。
为什么数据工程师都是关于数据的?因为没有数据,数据工程师就失去了他们的重要性。我们称之为相关性。
利用 R & ggplot 进行数据探索和可视化
原文:https://towardsdatascience.com/data-exploration-and-visualization-with-r-ggplot-7f33c10ec1c?source=collection_archive---------15-----------------------
从 IGN 数据库中可视化游戏流派和平台
考虑到我最近对 R 和 ggplot 的尝试,从通常的 Python jupyter 笔记本中休息一下似乎是合适的。我从符号中选择了 IGN 数据集,对数据进行快速的数据探索和可视化。
加载了包含有用包(如 ggplot2 和 dplyr)的 tidyverse 包后,我们开始阅读 csv 文件。通过将 stringsAsFactors 设置为 FALSE,我们确保字符串变量不会作为因子读入。
快速查看数据框架会发现一些有趣的变量。特别是,标题、平台、分数、流派和发行年份变量。
排名靠前的标题列表似乎不太有趣,因为有多个标题得分分别为 9 和 10。让我们看看基于特定分组的平均复习分数。
游戏类型
因为有 112 种独特的流派,让我们来看看前 10 种。
所有 122 种流派都有必要吗?这里的划分可能过于精细。有相当多的类型,如“探险,平台塑造者”和“探险,情节”有相同的“探险”的主要类型。因此,我写了一个函数,通过使用类型变量的第一个单词来得到每款游戏的主要类型。
新的 main _ 流派变量现在包括一个更容易管理的 31 种独特流派。不过,似乎有一个叫 NA 的。
有 36 行缺少流派值。由于这是 18,000 多个观察结果中的一个非常小的样本,手动标记它们将会花费不必要的精力,因此我们将这些观察结果与 NA 流派值放在一起。
让我们在此处再次检查,以确保其他值中没有任何 NA 值。这里可以使用 apply 函数在 ign 数据框的每一列上运行一个函数。这里,值为 FALSE 表示该特定列中没有 NA 值。
有了新减少的流派,让我们再来看看平均评论分数分布,这次是所有的流派。我们看到编译游戏已经下降很久了,而硬件游戏仍然是最高等级的游戏。
让我们用一个方框图再次想象一下。
似乎虽然成人、棒球和硬件游戏评论分数属于一个狭窄的范围,但几乎所有其他流派都有更多的差异和异常值。
什么是硬件游戏?
显然,它们指的是虚拟现实硬件,仅由两个条目表示。鉴于虚拟现实行业刚刚起步,这种观察的缺乏似乎是恰当的。
鉴于硬件类别只有两种观察,哪种类型的游戏最多?
鉴于上面的平均复习分数图表中有 30 个变量的条形图看起来相当狭窄,让我们在这里通过组合 geom_point 和 geom_segment 来尝试棒棒糖图表。
动作游戏的数量似乎是压倒性的,有超过 5000 个参赛作品,约占所有参赛作品的 27%。
游戏平台
有 59 个独特的平台。让我们看看前 10 名的平均评审分数。
除了 Macintosh,这是一个相当倒退的列表。
游戏数量排名前 10 的平台呢?
有没有可以在多个平台玩的游戏?通过按游戏名称对初始数据帧进行分组,我们可以找到支持特定名称的平台数量。
鉴于近年来也有如此多的平台失宠,IGN 数据库中的游戏数量是否反映了平台受欢迎程度的变化?
让我们绘制一个跨所有平台的季节性图表。
1970 年似乎太遥远了,所以 1996 年似乎是这个情节的合理起点。查看 2010 年以后的数据,似乎可以发现图书总数出现了奇怪的下降。由于这可能是一个数据质量问题,我们将重点放在 1996 年至 2010 年这 15 年。
为了防止图表混乱,我们将数据点限制在任何给定年份拥有超过 10 款游戏的平台上。
一些有趣的趋势值得注意:
- 为每一代 Playstation 列出的游戏的衰落与下一代 Playstation 游戏的崛起相吻合。
- 2010 年是手机游戏和平板电脑游戏(如 Android 和 iPad 游戏)出现的第一年,这可能标志着手机游戏的普及。
- PC 游戏的年度数量始终保持相当稳定。
- Wii 游戏在 2007-2008 年间的大规模增长是非常出人意料的,尽管谷歌趋势证实了随后对游戏机的兴趣和游戏数量的下降。
学会一种新的语言来可视化数据真的很有意思,而且在接下来的帖子中,肯定会看到这些新工具带来更有效的数据可视化!
R markdown 代码可以在这里找到,也可以在 LinkedIn 上随意连接!
黑人生活的数据:在麻省理工学院举行的首次会议
原文:https://towardsdatascience.com/data-for-black-lives-the-inaugural-conference-at-mit-b48599a248a?source=collection_archive---------3-----------------------
Data For Black Lives Animation
数据作为抗议。数据作为责任。数据作为集体行动。
我们听说过万有引力和电磁力,但还有另一个:Yeshimabeit Milner。正是她的远见推动了现在被称为“黑人生活数据”的运动。首届会议于 2017 年 11 月 17 日至 19 日在麻省理工学院举行。
当我坐在一所不熟悉的麻省理工学院大楼的大厅里时,我不安地杂耍着关于期待的零散想法。会议注册没有几个小时,但我的心在兴奋地跳动。这似乎是对这样一个事件的非常戏剧性的反应,我花了几个星期来处理我的各种情绪和智力刺激。
在宣布黑人人性被视为有争议、技术正以指数方式超越我们生活的时代,两者之间的交集是不可避免的。然而,这个数据和黑人生活相遇的空间对我们许多人来说是熟悉的。我们中的一些人是黑人“觉醒”活动家,同时也是科学家和工程师。我们中的一些人是社区组织者,利用数据为我们的人民而战。我们中的一些人是数据科学家,他们用我们所有的历史和意识形态来设计算法,并将其固化在我们的代码中。每个人都带着对家庭的渴望和一丝希望来到这个数据和黑人生活相遇的地方。
"我明天能带我女儿来见你吗?"她问我,她的完美蓬松的非洲充满活力地塑造她的脸。我笑着说她可能把我误认为值得带她女儿来见的人,并确保适当地介绍了自己。她继续说,她的女儿一直在她的中学物理课程中挣扎,看到一位黑人女性对物理感兴趣可能会受到鼓舞。当然,我告诉她我很荣幸见到她的女儿。
如果我认为仅凭我的语言就可以占据所有的空间,那我就太自大了。不可否认的是,每次我坐下来写这篇文章的时候,即使是简单的揭露一小部分的任务也会让我感到不知所措。所以,这仅仅是黑人生活数据会议开幕式上的一个片段——我试图概述一些我学到的最重要的知识。
储存在黑人想象中的潜在能量
Ruha Benjamin 博士(普林斯顿大学非洲裔美国人研究副教授)在她的开幕词中阐明,数据需要解释。我们经常将数据作为一种客观独立的物质来讨论,这种物质不言自明,可以被简单地发现。现实要复杂得多,这意味着同一组数据可能会根据观察者的不同而有不同的解释。这就引出了几个问题:迄今为止,谁在解读这些数据?数据怎么可能是主观的?谁有解读数据的自由和权力?
这些都是我在本杰明博士概述警察暴行数据的例子时开始构思的问题。她强调了黑死病和黑债之间的联系。这是一种只有当黑人的想象力被完全释放并被允许参与到对数据的解释中时才能建立的联系。
在主题演讲的最后,本杰明博士延续了许多有色人种都熟知的传统:向前人致敬。对我们中的一些人来说,这仅仅意味着在享受美好时光之前,向死去的亲人倒一些酒。对我们中的一些人来说,这意味着记住前人的贡献,这样我们就不会重新发明轮子,而是在他们工作的基础上再接再厉,与我们的祖先共同行动。这是本杰明博士在黑人生活数据中心对人群所做的。这不仅为建筑而不是创造定下了基调,也为我们在这个知识生产和想象探索的时代处于社群中奠定了基础。
我感到黑人的想象力正受到欢迎,进入这个我从未去过的地方。认识到黑人想象力的力量,然后拥抱它,而不是试图压制它。对身为数据分析师的祖先讲述生活是有意义的,尽管传统上并不这么认为。在数据分析和科学领域拥有我们自己的位置,并让它成为会议的前沿…我从未见过这样的事情。我们从一开始就围绕着黑暗和黑人的想象来定位自己。我们将自己定位在时间连续体上,在我们的祖先之后,但在下一代黑人数据生产者之前。提升过去、现在和未来。
那一刻,我知道这个空间将会是我从未允许自己想象过的。作为一名黑人科学家,我学会了对科学界的期望要合理,不要对一个有性别歧视和种族主义传统的社区期望过高。我们被告知要对进步的参照系有所讲究,所以如果我们看到至少有一个人在科学界成功了,那么与零个人相比,这就是进步。我已经习惯于以缓慢渐进的方式来思考,而不是以最终目标来思考。我被训练来管理我的想象力,让我知道科学界能真正实现什么。
在这里,我在一个空间里为黑人想象力的精神和力量树立了榜样。也许我可以释放我自己的想象力,也许这最终是一个空间?
注重系统和算法的设计
在我们实施产品或想法之前,我们通常会花时间设计它们。我们谈了很多关于设计的问题。我们能不能多想想谁从不公正的设计中获益?当我们想到我们日常交互的算法或我们说话时正在开发的算法时,意识形态实际上对那些设计师很重要。因为数据和我们对数据的解释并不像我们想的那样客观。
同样值得注意的是,科学作为一个领域,通过将自身建构为客观的而获得了什么。通过对客观性的终极要求,设计师开始定义客观和“中立”。这个定义从来不需要表达,只需要理解。我们开始明白目标是与白人和男性联系在一起。其他任何事情都被认为是种族化的,我们倾向于讨论多样性。但是,对于客观的、中立的、属于一群主要是白人和男性的人来说,这意味着什么呢?这意味着他们解释数据的方法和直觉成为标准。
算法的设计是关于直觉和解释的。到目前为止建立的标准是基于白人男性的直觉和解释。那么,一旦我们释放了黑人的想象力,它会对系统和算法的设计产生什么影响呢?也许,可能是偏离标准的东西?
被遗漏的数据非常重要
数学家、《数学毁灭的武器:大数据如何增加不平等并威胁民主》一书的作者凯茜·奥尼尔(Cathy O'Neil)谈到了算法不客观的事实,并声称“算法是嵌入代码中的观点”。她继续使用犯罪数据的例子,并指出“我们遗漏了大量(白人)犯罪……这是数据中的偏见”。她和其他小组成员向我们挑战,让我们更仔细地看看被遗漏的数据。
当设计提取数据的算法时,我们首先识别我们想要测量的变量和可能的趋势。如果遗漏了某些可能影响数据解释的变量和趋势,会发生什么呢?当前的数据科学家遗漏了哪些变量?当我们为黑人的想象创造空间时,我们如何将它融入到过程的每一步?
存在着数据无法证明的偏见和不公正。在当前的数据中隐藏着偏见和不公正。我们可以正面解决这些问题。“黑人生活数据”就是这样一个社区。
有一次,一名当地活动家站起来询问一个“数据工具包”,活动家可以用它来更好地收集信息,并战略性地使用数据分析来实现他们的目标。我们都思考过这个问题,并决定虽然我们目前没有一个,但我们将作为一个社区开发一个。房间里的数据科学家、数学家和科学家将与活动家一起开始收集、解释和利用被遗漏的数据。我们将把重点转移到通常不被关注的领域。我们将提升历史上被边缘化的人们,并以他们为中心。
叙述+数据=信息
@TheNewThinkerr :“白人至上是一种算法,我们作为数据科学家的工作就是对这种算法进行逆向工程”
如上所述,数据本身不够强大,也没有被证明足够有效,因为数据不是单独存在的。数据是用来讲故事的。数据被包装在叙述中,然后用于通知行动。当我们明白当人们使用数据来设计像白人至上这样的叙事并将其嵌入我们的社会结构时,社会意识形态得到了加强,我们可以开始将去殖民化视为一项逆向工程甚至是一项重新设计的任务。我们的数据必须用更具包容性和公平性的叙述来包装。
这种信息的交流也必须是包容性的。Github 的高级机器学习数据科学家 Omoju Miller 博士谈到了黑人社区内部知识转移的重要性。这个国家的下层阶级和中产阶级/上层阶级的黑人之间存在着隔阂。我知道,作为一个来自低收入背景的人,我与黑人中产阶级的联系为我的人际网络和职业指导提供了很多帮助。技术为我们提供了一个空间,在这里我们可以走到一起,建立技术创新和社区。诚然,这肯定不是常态。一般来说,黑客马拉松并不被认为是在引擎盖或包容性空间举行的。请记住,我们谈论的是黑人的未来,以及这种释放黑人想象力的可能性。
像黑人生活数据这样的空间可以更广泛地存在。我们可以把人们聚集在一起——社区活动家、数据科学家、科学家、教师、图书管理员、艺术家、DJ 等等。这一切都是为了释放黑人对技术创新的想象力。这可能是一个黑人社区成员之间知识转移的空间,否则他们永远不会互动。多么美好的愿景。
总而言之,这次会议对我来说意义重大,因为我身处黑人人性和科学的交汇点。这几个点只捕捉到整个空间的一瞥,这是黑人生活的数据。我非常感谢组织者:Yeshimabeit Milner、Lucas Mason-Brown、Max Clermont、Isaiah Borne 和 Nana Younge。
查看http://d4bl.org/了解更多关于黑人生活数据的信息和会议的更多细节。
在自由中,
贾梅勒
P.S .拍手秀点爱心,推荐,分享,关注我 @JamelleWD
使用熊猫进行数据处理;现实生活中的机器学习
原文:https://towardsdatascience.com/data-handling-using-pandas-machine-learning-in-real-life-be76a697418c?source=collection_archive---------7-----------------------
今天,我们将看到一些基本的技术来处理稍微复杂一点的数据,而不是我在sklearn
数据集的之前使用的例子,使用pandas
的各种特性。这篇文章将帮助你安排复杂的数据集来处理现实生活中的问题,最终我们将通过一个逻辑回归的例子来研究数据。关于数据清理的更多信息,你可以查看这篇文章。
您可以从我的 github 存储库下载名为“bank.csv”的数据文件,或者从原始的源下载,那里有数据集的详细描述。
在描述数据文件之前,让我们导入它并看看基本的形状
import pandas as pdbankdf = pd.read_csv('bank.csv',sep=';') # check the csv file before to know that 'comma' here is ';'print bankdf.head(3)
print list(bankdf.columns)# show the features and label
print bankdf.shape # instances vs features + label (4521, 17)
输出如下
bank data-set brief description
从输出中我们看到数据集有 16 个特征,标签用'y'
指定。主库中给出了这些特性的详细描述。主存储库中的数据集概述如下
该数据与一家葡萄牙银行机构的直接营销活动相关。营销活动以电话为基础。通常,为了了解产品(银行定期存款)是否认购(“是”)或不认购(“否”),需要与同一客户进行多次联系。
我们可以制作一个seaborn
计数图,看看其中一个类是如何控制输出的。
import matplotlib.pyplot as plt
import seaborn as snssns.set(font_scale=1.5)
countplt=sns.countplot(x='y', data=bankdf, palette ='hls')plt.show()
Label (‘y’) of the bank data is dominated with ‘no’ variable
我们可以用下面的一段代码来计算这个数字
count_no_sub = len(bankdf[bankdf['y']=='no'])print count_no_sub>>> 4000
因为数据集的标签是以“是”和“否”的形式给出的,所以有必要用数字来代替它们,可能分别用 1 和 0,以便它们可以用于数据的建模。在第一步中,我们将将数据集的输出标签从二进制字符串 yes/no 转换为整数 1/0。
bankdf['y'] = (bankdf['y']=='yes').astype(int) # changing yes to 1 and no to 0
print bankdf['y'].value_counts()>>> 0 4000
1 521
Name: y, dtype: int64
由于输出标签现在被转换成整数,我们可以使用 pandas 的groupby
特性来进一步研究数据集。根据输出标签(是/否),我们可以看到特性中的数字如何变化。
out_label = bankdf.groupby('y')
print out_label.agg(np.mean)# above two lines can be written using a single line of code
#print bankdf.groupby('y').mean()>>>
age balance day duration campaign pdays previous
y
0 40.99 1403.2117 15.948 226.347 2.862 36.006 0.471
1 42.49 1571.9558 15.658 552.742 2.266 68.639 1.090
首先,这里我们只看到 16 个特性中的 7 个,因为剩下的特性是对象,而不是整数或浮点数。你可以输入bankdf.info()
来检查。我们看到“持续时间”这一功能告诉我们最近一次通话的持续时间(以秒为单位),购买了产品的客户是没有购买产品的客户的两倍多。“活动”,表示在当前活动期间进行的通话次数,对于购买产品的客户来说较低。**groupby**
**可以给我们一些关于特征和标签之间关系的重要信息。**感兴趣的人可以在“教育”功能上检查类似的“分组”操作,以验证受过高等教育的客户具有最高的“余额”(以欧元表示的平均年余额)!
数据集的一些特征有许多类别,可以通过使用系列对象的****unique**
**方法进行检查。示例如下
print bankdf["education"].unique()
print bankdf["marital"].unique()>>> ['primary' 'secondary' 'tertiary' 'unknown']
['married' 'single' 'divorced']
**这些变量被称为分类变量,就pandas
而言,它们被称为“对象”。**为了使用分类变量检索信息,我们需要将它们转换成“虚拟”变量,以便它们可以用于建模。我们使用pandas . get _ dummies特性来实现。首先,我们创建一个分类变量列表
**cat_list = ['job','marital','education','default','housing','loan','contact','month','poutcome']**
然后,我们将这些变量转换成虚拟变量,如下所示
**for ele in cat_list:
add = pd.get_dummies(bankdf[ele], prefix=ele)
bankdf1 = bankdf.join(add)# join columns with old dataframe
bankdf = bankdf1#print bankdf.head(3)
#print bankdf.info()**
我们已经为每个分类变量创建了虚拟变量,打印出新数据帧的头部将会得到如下结果
Dummy variables from categorical variables
你可以理解,分类变量是如何被转换成虚拟变量的,这些虚拟变量可以在这个数据集的建模中使用。但是,我们有一个小问题。实际的分类变量仍然存在,它们需要被移除以使数据帧为机器学习做好准备。我们首先通过使用 *tolist()*
属性将新数据帧的列标题转换成一个列表。然后,我们创建一个没有分类变量的新列标题列表,并重命名标题。我们使用下面的代码来做到这一点**
**bank_vars = bankdf.columns.values.tolist() # column headers are converted into a listto_keep = [i for i in bank_vars if i not in cat_list] #create a new list by comparing with the list of categorical variables - 'cat_list'print to_keep # check the list of headers to make sure no categorical variable remains**
我们准备创建一个没有分类变量的新的数据框架,我们通过-
**bank_final = bankdf[to_keep]**
请注意,为了创建新的数据帧,我们将一个列表(' to_keep ')传递给索引操作符(' bankdf ')。如果您没有将列名列表传递给索引操作符,它将返回一个**keyerror**
。要选择多个列作为数据帧,我们应该向索引操作符传递一个列表。但是,您可以选择单个列作为“系列”,如下所示
**bank_final = bankdf[to_keep] # to_keep is a 'list'
print type(bank_final) >>> <class 'pandas.core.frame.DataFrame'>bank_final = bankdf['age']
print type(bank_final)>>> <class 'pandas.core.series.Series'>bank_final = bankdf['age','y']
print type(bank_final)>>> KeyError: ('age', 'y')**
我们可以验证新数据帧bank-final
的列标题。
**print bank_final.columns.values>>> ['age' 'balance' 'day' 'duration' 'campaign' 'pdays' 'previous' 'y' 'job_admin.' 'job_blue-collar' 'job_entrepreneur' 'job_housemaid' 'job_management' 'job_retired' 'job_self-employed' 'job_services' 'job_student' 'job_technician' 'job_unemployed' 'job_unknown' 'marital_divorced' 'marital_married' 'marital_single' 'education_primary' 'education_secondary' 'education_tertiary' 'education_unknown' 'default_no' 'default_yes' 'housing_no' 'housing_yes' 'loan_no' 'loan_yes' 'contact_cellular' 'contact_telephone' 'contact_unknown' 'month_apr' 'month_aug' 'month_dec' 'month_feb' 'month_jan' 'month_jul' 'month_jun' 'month_mar' 'month_may' 'month_nov' 'month_oct' 'month_sep' 'poutcome_failure' 'poutcome_other' 'poutcome_success' 'poutcome_unknown']**
我们能够分离特征变量和标签,这样就有可能在数据集上测试一些机器学习算法。使用下面的代码从这个新数据框中选择要素和标注
**bank_final_vars=bank_final.columns.values.tolist()# just like before converting the headers into a list
Y = ['y']
X = [i for i in bank_final_vars if i not in Y]**
由于有太多的特征,我们可以在sklearn
下用递归特征消除(RFE)选择一些最重要的特征,它分两步工作。在我以后的文章中,我可能会讨论为什么特征选择不能用逻辑回归,但是现在让我们用一个RFE
来选择一些重要的特征。首先,分类器被传递给 RFE ,带有要选择的特征数量,然后调用拟合方法。下面的代码描述了这一点
**model = LogisticRegression()
rfe = RFE(model, 15) # we have selected here 15 features
rfe = rfe.fit(bank_final[X], bank_final[Y])**
我们可以使用support_
属性来查找哪些特征被选中。
**print rfe.support_>>> [False False False False False False False False False False False False True False False False False False False False True False False False False False True False False False False True False False True False False True False True True True True False False True True True False True True]**
rfe.support_
生成一个数组,其中所选的特征被标记为真,您可以看到其中的 15 个,因为我们已经选择了最好的 15 个特征。RFE
的另一个属性是ranking_
,数组中的值 1 将突出显示所选的特征。
**print rfe.ranking_>>> [33 37 32 35 23 36 31 18 11 29 27 30 1 28 17 7 12 10 5 9 1 21 16 25 22 4 1 26 24 13 20 1 14 15 1 34 6 1 19 1 1 1 1 3 2 1 1 1 8 1 1]**
我们可以用下面的代码明确地打印出使用RFE
选择的特性的名称
**rfe_rankinglist = rfe.ranking_.tolist()
selected_columns = []for im in range(len(X)):
if rfe_rankinglist[im]==1:
selected_columns.append(X[im])
print selected_columns>>> ['job_retired', 'marital_married', 'default_no', 'loan_yes', 'contact_unknown', 'month_dec', 'month_jan', 'month_jul', 'month_jun', 'month_mar', 'month_oct', 'month_sep', 'poutcome_failure', 'poutcome_success', 'poutcome_unknown']**
我们终于可以继续了。fit()和。score()属性来检查模型的性能。
在另一篇帖子中,我将详细讨论逻辑回归背后的数学原理,我们将看到逻辑回归不能选择特征,它只是缩小线性模型的系数,类似于岭回归。下面是可以用来检查特性选择效果的代码。这里我们使用了整个数据集,但最佳实践是将数据分为训练集和测试集。作为一个小练习,你可以试试这个,记住数据集的标签是高度倾斜的,使用stratify
可能是个好主意。祝你好运!
**X_new = bank_final[selected_columns]
Y = bank_final['y']
X_old = bank_final[X]clasf = LogisticRegression()
clasf_sel = LogisticRegression()
clasf.fit(X_old,Y)
clasf_sel.fit(X_new,Y)print "score using all features", clasf.score(X_old,Y)
print "score using selected features", clasf_sel.score(X_new,Y)**
所以,让我们总结一下最重要的几点来结束这篇文章
- 我们已经学会了使用
pandas
来处理现实数据集可能存在的一些问题。 - 我们已经学会了将字符串(' yes ',' no ')转换成二进制变量(1,0)。
- 熊猫数据框的
groupby
属性如何帮助我们理解要素和标注之间的一些关键联系。 - 将分类变量改为虚拟变量,并在数据集建模中使用它们。
- 如何通过向索引操作员传递列表来选择数据帧的一部分。
- 使用 RFE 选择复杂数据集的一些主要特征。
关于数据清理和处理的更多信息,你可以查看我关于使用 pandas 处理数据的帖子。关于使用熊猫分组和交叉表的更多信息,你可以查看我的全球恐怖主义数据分析帖子。希望这篇文章能帮助你在处理现实的数据集时更自信一点。保持坚强和快乐。干杯!!
兽医数据:动物数据比比皆是!
原文:https://towardsdatascience.com/data-in-veterinary-animal-data-abound-8d8ba92bbdbc?source=collection_archive---------4-----------------------
“一只黑猫穿过你的道路意味着这只动物要去某个地方” —格劳乔·马克斯
动物相关的开放数据
在最后一篇关于开放数据的出现和好处的博客之后,我决定看看有哪些数据是专门与动物相关的。
我找到的第一个是由马普鸟类研究所主持的 Movebank 数据库 。这是一个专注于动物追踪的开放式数据库。他们的目标是“…帮助动物追踪研究人员管理、共享、保护、分析和存档他们的数据”。
在撰写本文时,该网站包含 248 个数据文件,内容涉及从“追踪美洲夜间飞行食虫动物的迁徙”到“南极海燕 3D 飞行”再到“藤壶雁的迁徙时间”。
数据集可以位于地图上,数据可以直接从网站下载。它还为您提供了最后一次数据集更新的日期,以及数据所有者的联系方式。
浏览了一会儿后,我偶然发现了一个有趣的数据集,名为“拖网蝙蝠的运动协调”。这是 2015 年进行的一项研究,该研究在短时间内跟踪蝙蝠的位置,旨在推断蝙蝠使用什么规则来协调它们的运动。作者表示“当观察成对的道本顿蝙蝠在低空觅食搁浅的昆虫时,我们发现它们有有趣的‘交通规则’——它们互相追逐,进行串联转弯,甚至减速以避免碰撞”。这项研究的论文是开放获取的,甚至是一篇国家地理文章的主题。
我下载了这个数据,玩了一把。我拿了两只蝙蝠(从数据集的参考数据中识别为“成对、协调飞行”),并用 R (一种开源统计编程语言)创建了一个动画。我分别把蝙蝠涂成红色和蓝色,并在它们之间画了一条线,随着它们之间距离的增加,这条线逐渐变淡。
同样,Zoatrack 网站也有动物追踪数据,主要集中在澳大拉西亚地区的研究。它还拥有许多分析和可视化工具,以帮助利用数据。
更专业的是 Seaturtle ,专注于追踪海龟(不足为奇)。对于本网站而言,数据的使用似乎不太“公开”,因为必须首先获得数据所有者的书面同意。
从动物追踪开始, EMPRES-i 网站(由联合国粮食及农业组织主办)包含全球动物疾病的公开数据。这个大型数据集提供了诸如猪瘟、口蹄疫和禽流感等疾病的爆发和发生的信息。所有疾病事件都附有位置(经度和纬度)、日期、死亡人数等信息。我下载了全球禽流感爆发的数据,制作了一个快速简单的动画,
不同类型的动物相关数据可在 FAOSTAT 网站上找到。同样由联合国主办,这个网站聚焦于不同国家、不同行业的贸易和生产。一个数据集显示了所有的活体动物运输,这些数据被“停止活体运输”慈善机构大量使用。我抓取了一些数据(特别是与 2013 年欧洲所有生猪出口相关的数据),并用它创建了一个交互式地图。
互动版可以在这里找到。
再次不同的是英国政府网站上的动物相关数据。在这里搜索发现了 2015 年所有的外来动物进口许可证。如果你想知道最近有多少只巨大的水獭被允许进入英国,这是给你的数据集。
查看美国政府的开放数据门户,在撰写本文时,有 16131 个数据集与“动物”一词相匹配。这些数据包括路易斯维尔的动物咬伤数据、佛蒙特州的动植物物种图谱和西雅图的宠物许可证。专门搜索“狗”会得到奥斯汀宣布的危险狗、巴吞鲁日的控制事件和安克雷奇注册狗名的数据。
将数据投入使用
上面提到的数据集仅仅触及了可用数据的表面,每天都有新的数据集被上传到这样的网站。
在一个层面上,这些数据纯粹从“看一看”的角度来看是有用的。如果你找到了与某个主题相关的数据,简单地下载并探索这些数据(通常通过简单的情节)就能揭示出感兴趣的东西。
除此之外,开放数据的真正力量源于能够将数据集合并在一起,或者使用多个开放数据集,或者更好的是,丰富你自己的私有数据。例如,在 Avacta Animal Health,我们有多年的过敏测试数据。我们最近开始结合开放的环境数据集(如英国气象局提供的数据集)来研究这些数据,以获得新的见解。
简而言之,开放数据仓库充斥着动物数据,其中许多部分可能会引起兽医专业人员的兴趣。所以,无论你有什么数据,或者你有什么兴趣,看看那里有什么,甚至可以分享你自己的数据。
兽医数据:你尚未开发的商品
原文:https://towardsdatascience.com/data-in-veterinary-your-untapped-commodity-1d6ac67c3d5e?source=collection_archive---------5-----------------------
大数据就在我们身边,但是如何最好地利用它来提升兽医职业呢?
在没有数据之前就进行理论化是一个严重的错误。不知不觉中,人们开始扭曲事实以适应理论,而不是让理论适应事实——夏洛克·福尔摩斯,波希米亚的丑闻
大数据
当古代印加人想要存储数据时,他们使用 khipus ,或“会说话的结”,用一根根细绳来编码数字信息。创建 khipus 是一项艰巨的任务,至少需要一年时间来掌握基本技能,但一旦获得了这种专业知识,这些“数据档案”就可以用于税收记录、人口普查数据,甚至军队的组织。
今天,根据 IBM 的数据,每 24 小时,全球就有 25 万亿字节的数据被创建。这些数据的来源多种多样,无处不在,正迅速融入我们生活的方方面面。从 Fitbits 到 CCTV 摄像机,社会正被以看似科幻的方式观察、衡量和分析。加上你在使用手机、信用卡和社交媒体账户时留下的长长的数字痕迹,你可以肯定老大哥在盯着你。
Photo by fabio on Unsplash
然而,随着这种数据的泛滥,随之而来的是一长串的挑战,比如如何存储它,如何分析它,如何分享它。通常,这类问题必须得到快速回答,因为一旦挖掘出“大数据”流,这种商品的大出血或滥用对于人们心目中的商业或科学问题可能是灾难性的。答案以多种 IT 工具、编程语言和数据管理流程的形式出现,许多行业正在快速整合这些工具,以便将自己带入 21 世纪。
兽医行业也不例外,充斥着从临床记录、血液检测结果到医学影像的各种数据。像 SAVSNET 和 VetCompass 这样的组织正在努力收集和分享这样的数据,导致了大量临床相关论文的发表,但这还为时尚早,手头的任务是巨大的。
过去的数据
未来数据的收集和分析对许多行业至关重要,但许多组织没有意识到的是,他们可能已经拥有大量有价值的数据。对于一些人来说,这将是纸质记录的形式,精心保存数年甚至数十年。对其他人来说,这些数据可能已经被数字化、存档,并注定要永远保存在某个被遗忘已久的硬盘上。
我们的心态应该是,这是一种巨大的浪费,而不是一种小小的耻辱,因为这样的数据不仅可以提供有趣的见解,还可以直接改善患者护理。换句话说,这些休眠数据可以拯救生命。再加上相关商业分析带来的潜在财务收益,你会开始看到打扰这个数字沉睡巨人的好处。
许多人意识到世界上潜在的数据具有潜在的价值。以医学语料库注释历史(HIMERA)项目为例。这是一次对追溯到 1840 年的数字化医疗记录进行注释的尝试,目的是利用文本挖掘技术挖掘出丢失的疾病数据。这样的知识可以与现代记录融合,扩大医学理解的广度和深度。
您的数据
这给你提出了一个问题。你有哪些数据目前存放在文件柜、Excel 电子表格或练习数据库中,但你从未看过?这些数据可以为您的实践回答以下问题,仅举几个例子,
在过去 10 年中,您见过的疾病类型细分是什么?
在什么情况下给予了什么治疗?
又看了多少例?这里有什么模式吗?
这些疾病随着时间的推移会有怎样的变化?有季节性的吗?
·地理空间怎么样?当你根据客户邮政编码绘制疾病类型时会发生什么?
也许这样的数据不会显示出什么有趣的东西,或者也许它只会加强现有的预感和怀疑。但更有可能的是,它将提供一个独特的视角和理解,这是以前无法获得的,是为你的实践定制的。
Photo by Lukas Blazek on Unsplash
接下来去哪里?
数据被认为是 21 世纪的商品,但时至今日,人们对许多组织已经封存起来的东西长期低估。我会鼓励你看看你有什么,并考虑你可以问这个宝贵的,未开发的资源什么问题。随着兽医职业朝着为执业兽医增加研究的未来发展,毫无疑问,利用这些数据的需求即将出现。
如果你是一名兽医,并且你想进一步讨论这个问题,请联系我 Avacta 动物健康(rob.harrand@avacta.com)
基于数据的 UX 设计
原文:https://towardsdatascience.com/data-informed-ux-design-29f65bdd98e7?source=collection_archive---------0-----------------------
我艰难学到的 5 件事。
It doesn’t have to be random
选择正确的指标
这可能看起来很深奥,但选择正确的指标并不总是微不足道的。此外,在业务部门看来,UX 指标通常是不够的。因此,应该使用更多面向业务的指标,如销售转化、注册转化、附加销售等。你知道吗?你仍然可以让它工作。无论 UX 的变化有多小或多大,它(通常)都会对业务度量产生一些影响。
你可能会认为,改变主页上的图标不会对顾客在三步之外将商品放入购物车的人数产生任何影响,但事实是它会产生影响。至少大部分时间(我指的是 99.9%的时间)。换句话说,如果对你的商业目标没有任何影响,你为什么要改变呢?设计师通常会说“这将增强 UX 和一致性”,但有什么比实际结果更好的方法来衡量结果。
好吧,这并不总是这样,但你得到了这个想法。有些时候,你需要定义短期目标和衡量标准,甚至对必须发生的变化视而不见。但是如果可能的话,使用实际的商业目标。
相信你的模型
数学是一门美丽的科学,我希望我有时间更深入地探索它,但在大多数情况下,你不需要知道幕后发生了什么。学会信任你的模型,即使它有时看起来不准确。
我要告诉你一个秘密…它不是。简而言之,要检测出不是在旅程后期的变化,需要一万亿的数据。如果你正在进行多项测试,可能性是无穷无尽的,即使你为谷歌工作,你也需要至少几周或更长时间才能得到一些真实的结果。
Learn when to trust your model
这种预测模型最近到处都在使用,但它们的核心是基于一个简单的想法的统计数据。样本越大,置信度越大。另一方面,如果你觉得你的设计没有经过足够长时间的测试,你需要控制局面。向你的经理证明你需要更多时间的最好方法是反复尝试同样的 A/A 测试。需要多少次压印才能变平?整整几周?
提示:如果你的测试从第二天开始就没什么变化,再等几天,然后再测试一次。你要么太幸运,要么为亚马逊或 Booking.com 工作。
增强你的启发性
设计试探法已经存在很多年了。最近,移动试探法变得更加流行。如果你做数据通知 UX,你可能没有足够的时间在你的每一个测试之前进行 UX 研究。而不是用你的勇气去设计(这已经被证明是伟大的!)花些时间让自己熟悉启发式。把它们当作一种刺激,仅此而已,但不要忽视它们。
现在的诀窍是记录你的测试分数。每个市场和受众都不尽相同,可能对一个人非常适用的东西,对另一个人可能会严重失效。个性化你选择的一套启发法(最多 10-15 个),每次你看到一些深刻的行为,就把它和相应的启发法联系起来。你很快就会发现你的数据是一组非常有力的研究成果。
学习何时停止迭代
这可能是最难实现的事情。迭代设计也是数据导向和精益 UX 的基石,但是在失败的设计上投入更多的时间并不会使事情变得正确,也许并不真的很糟糕。
深呼吸,回到最基本的。拿起你的笔、手写笔、记号笔,想想你的用户,他们的心智模型,和同事或朋友谈谈,做一些愚蠢的问题,然后从头开始画一切。毕竟,这是设计师应该做的。为不可能的问题寻找解决方案。
UCD 方法论
我最喜欢的部分。我喜欢实践以用户为中心的设计方法。我认为这是任何设计师都应该学习的第一件事,并且尽可能多的练习。也就是说,它仍然不能很好地处理现成的基于数据的 UX 流。我们缺乏工具、方法和知识来有效地做到这一点。这是否意味着我们应该忘记它?
好吧,我为我自己说,这是不会发生的。
就像我之前说的,你的数据是无价的。我们正处于一个世界的开端,在认为一切都是理所当然之前,一切都需要通过某种模型来验证,这是尽可能科学的。现在,你要做的就是利用你的数据。使用它们来创建基于数据的人物角色,发现不同用户旅程中的模式,创建现实生活驱动的场景,并学习如何设计它们。
框架已经存在,可能缺少的是一种更自动化的方式来获取数据,并将它们转换为更有意义的信息。现在需要一些手工工作,但是有了一些数据工具,将会有一些东西来帮助你加速这个过程(对于每个阅读的人来说可能是相当不同的)。
Don’t forget about the people
结论
如果你和我一样,你会觉得在这样一个时代工作很幸运。信息自由流动(…)并且收集的数据比任何其他时期都多(到 2018 年每天 50.000GB)。缺少的是我们理解它们,并把它们用在最好的地方。说到 UX,基于数据的 UX 设计才刚刚起步,但我希望你能从这些小技巧中得到一些帮助,并将其纳入你的日常工作习惯中。
数据科学家眼中的数据基础设施。
原文:https://towardsdatascience.com/data-infrastructure-through-the-eyes-of-a-data-scientist-1662488408ec?source=collection_archive---------15-----------------------
Photo by chuttersnap on Unsplash
如今,数据科学是一个热门话题,许多公司都在谈论“数据驱动”、“数据知情”或“以数据为中心”,以及他们因此在新业务模式方法上所做的改变,为什么不呢?利用数据做出更知情的影响(?)对一个问题的决策见证了商业的繁荣。很多企业天真地认为,只要按下标有“数据科学”的红色大按钮,就能得到 42 的答案,然后坐在那里看着美元滚滚而来,如果你经历过这个世界,你就会知道事实并非如此。
本文不是关于将一家公司转变为数据驱动型的战略业务流程,也不是关于在这个过程中你几乎肯定会遇到的困难(仅供参考,这主要是关于教育你的受众,处理对变化或自我的敌意)。本文主要关注构建数据基础设施的全新方法,以满足数据科学家的需求。
免责声明:技术、SLA 和您业务的特定用例对任何作者的观点来说总是不同的,这是对我们工作的概述。
当人们想到在传统业务中使用数据的前瞻性方法方面推动数据前沿的行业时;像金融服务和保险、计算机和电子、媒体和电信这样的垂直行业通常会首先出现在脑海中。拥有一个领导者当然意味着其他行业落后于数字曲线。
特别是航运业,在利用数据做出关键决策或自动化许多流程方面落后于其他行业,虽然进入游戏较晚有其缺点,但它也允许我们查看数据生态系统的现状,并尝试利用适合我们的最新设计范式和技术。
我打算在接下来的一年里写三篇关于特定领域的文章:
- 面向数据驱动型应用的云基础架构
- 数据应用生命周期管理
- 机器学习查询语言
面向数据驱动应用的云基础设施
在过去的几年中,数据科学社区在自动化流程和管道方面已经非常成熟。在“AutoML”和“AutoFeature engineering”等概念上花费了巨大的努力,以优化数据科学家重新完成相同工作流程所花费的时间,即参加任何会议,或关于“数据科学”的内部演示,会弹出下图的某个版本。
https://epistasislab.github.io/tpot/
这很好地代表了数据科学领域模型,它使我们能够将试图以某种最优方式解决我们的问题所需的过程编码。事实上,社区已经走得更远,并意识到解决这个问题是不够的,需要一个机制来生产这个解决方案。
将该解决方案归档并创建微服务是解决下一个进入生产的问题的必由之路,尽管对我来说这只是一种机制,幕后是什么意味着这可以无缝地发生?我如何确保我为未来做好准备?对我来说,创建一家数据驱动型公司意味着在公司内部创建一种数据民主,并让所有数据素养水平的用户都能访问数据,这样做就产生了需要解决的问题:
- 如何创建数据用户想要使用的环境?
- 我如何将可再现的数据环境作为一种标准的工作方式?
- 我如何部署我的解决方案而不用担心开发运营/云运营?
- 我如何创建数据操作的抽象?(包括报告、管道、并行性、持久性等。)
- 我的解决方案会无缝扩展吗?
就在您的特定业务中解决而言,前两点要温和得多,如果您的基础架构向数据用户暴露了这些问题,后三点应该会引起更深刻的共鸣
举个例子,在组建我们新的数据科学团队时,我们明确地花了大量时间专注于我们将面临的扩展挑战,并提前解决这些挑战,为终端数据用户提供一个抽象层,这些用户只是想使用基础架构,而不是陷入学习各种其他设计和架构概念的困境……你知道,我只想调查数据,尝试一系列模型,并将我的
从表面上看,这似乎是一个从 Prod 中的 R&D 迁移的生命周期管理问题,尽管这是一个真正的问题(参见围绕这个问题的精彩文章:https://medium . com/forward-data-science/understanding-ml-product-life cycle-patterns-a39c 18302452和一个库的 git repo 来解决这个https://github.com/formlio/forml),但仍然需要对某些东西进行操作。
这就把我们带到了问题的核心,创建可扩展的基础设施来支持上游数据堆栈中的其他层(管道、生命周期管理、日志记录等),但从用户那里删除了底层实现细节,那么我们如何解决这个问题呢?
首先,通过认识到数据是商品,意味着我们的大部分时间和精力应该花在访问数据的良好方法上,并消除快速发展的进入壁垒。(说起来容易做起来难)这可能意味着团队要考虑以下几点:
- 支持查询数据的通用逻辑抽象—用户不必担心身份验证凭证、租户名称或存储格式
- 启用安全层以避免不当行为(这是一个位于数据之上的层,但是一旦授予访问权限,用户就应该知道如何查询该数据)
- 支持在基础设施上交付应用和服务,提供可预测性、可扩展性和高可用性。
在不深入我们架构的代码层的情况下,我们已经有效地将基础设施层分成了几个不同的区域,这些区域将具有一些共同特征的组件组合在一起。
从运营的角度来看,这一点尤其有用,因为这些组中的每一个都可能有不同的 SLA、扩展模式或资源需求,需要不同的管理方法或策略,如避免影响彼此的组性能的隔离级别。
对于任何数据持久性,我们几乎只希望利用云 PaaS。这是一个成熟的解决方案生态系统,通常会成为事实上的标准,所以在大多数情况下,试图自己解决这些问题是很困难的;一个低成本,无与伦比的质量,车轮的重新发明。因此,我们寻求 blob 存储、数据湖、文件共享、数据库、缓存和消息队列的可用服务。
目录子集群是我们所说的一组元数据服务,具有相对较低的 CPU 和 I/O 需求,负责管理集群其余部分的全局状态。它们在设计时考虑了高可用性,并构建在前面描述的数据持久性 PaaS 之上(如果相关)。这一类别的服务通常是协调器、解析器、编排器和调度器,或者是服务器-工作器架构的主要部分。例如,我们可以命名为 Zookeeper、Hive Server、Hive Metastore、PrestoDB Coordinator、Atlas、Airflow Scheduler 和 Consul,但也可能命名为 Yarn Resource Manager、Spark Master(当处于独立模式时)等。
我们的作业子集群的特点是由非交互式按需分布式批处理操作产生的巨大而尖锐的 CPU 和 I/O 负载。它运行在无状态节点上——通常在目录子集群的控制下。它的关键属性是水平弹性,允许我们在需要时动态地增加资源池(可能增加一个大的系数),并在任务完成后释放它们。这个集群中的服务将是目录子集群中提到的组件的对应物,因此我们可以在这里找到 PrestoDB workers、Airflow workers、Superset workers 的池,以及 Yarn 节点管理器或 Spark 执行器等等。
相比之下,应用程序子集群是为相当平稳的负载而设计的,通常是与用户体验或 REST APIs 相关的交互式会话。因此,需求集中在低延迟和高稳定性上。运行在应用程序子集群上的服务引用目录集群来进行服务发现,或者引用作业集群来卸载任何批处理操作。我们的定制产品是该组的主要实例,其次是各种 ui,如超集前端或 Apache Knox 网关。
我们提到持久层将主要由 PaaS 提供,因此实际的应用程序(大)数据可以直接从中访问。然而,在有些情况下,我们需要一个专门的层(访问接口或处理阶段),它不存在于可用的 PaaS 中,但可以作为一个受管功能在其上实现。为此,有一个数据子集群为定制的 I/O 负载提供服务。
我们使用这个集群来集成我们的所有流接收,它涵盖了从消息队列到最终接收器的所有相关内容,最终接收器产生主要数据集,还产生任何次要信息,如搜索索引或 BI 聚合。该集群中可以找到的技术示例有 Kafka Streams 应用程序、Solr、RabbitMQ、Logstash,甚至可能是运行在托管 blob 存储之上的 HBase RegionServers(以防托管 NoSQL 服务由于某种原因不符合需求)。
有一系列的低级服务,我们将它们分离到自己的系统子集群中。例如,这些是提供透明授权控制、负载平衡或 SSL 供应和终止的集中式入口代理和应用网关。这里我们还应该提到一些托管服务(即使在集群之外),比如 OAuth 提供者或托管日志和指标收集器以及监控系统。
基础设施的一个特殊部分专用于我们的 R&D 资源。这是一个混合了托管和托管技术的垂直堆栈。这涵盖了各种敏捷工具、整个 CI/CD 生态系统,包括工件库、具有多用户笔记本服务和远程外壳的虚拟开发环境。关键角色显然属于弹性计算资源和必要的调度,作为一种工具,允许基于连续评估的迭代和可再现的数据科学研究。
以这种方式创建基础设施为我们提供了我们想要的抽象,为用户创建一个集成的生命周期管理,同时解决我们关注的关键领域。
这使数据用户能够在高层次上:
- 通过单个 API 使用 PrestoDB 查询已知的数据源,而不考虑数据大小(工作人员的弹性伸缩)——事实上,我们有一个内部 Python API 抽象的整个数据仓库基础架构,允许我们使用它的各种资源。
- 使用 Solr 和 Apache Atlas 在其他数据源周围搜索元数据,以扩充主数据源(全部通过 Presto 连接器),并在获得许可的情况下检索它们(Apache Ranger)
- 使用 Jupyter 笔记本电脑完成 EDA 和其他调查,并保存和与其他用户分享。
- 定义二级、转换的数据源,通过 Apache 超集向 B.I 最终用户公开,以便进一步调查。
请注意,这与将模型投入生产、重新训练或调整模型无关,因为这是堆栈的下一个阶段,也是下一篇文章的关注点。我们展示的是我们用来实现这一目标的构件,同时保持我们的首要重点是提供数据用户需要和想要使用的工具。
数据是利益相关者
原文:https://towardsdatascience.com/data-is-a-stakeholder-31bfdb650af0?source=collection_archive---------3-----------------------
设计和数据科学
设计、人种学和面向未来的数据科学
我从未打算成为一名数据科学家。我大学毕业时获得了文化人类学学位,并天真地认为我想做的研究不需要数学。完全靠运气,我进入了美国为数不多的认真对待数学的人类学研究生项目,这改变了我一点点但不是很多的视角。在我的博士野外工作中,我去了中亚研究宗教、政治和社会活动家的身份叙事,我使用了一些标准的统计工具,如主成分分析和回归模型,以及我的非数学访谈和参与者观察。
我最终获得了博士学位,并在美国陆军部找到了一份战略情报和规划的工作。他们雇用我是因为我是一名人类学家,但我很快就发现从阿富汗传来的大量数据很少有人真正利用。随着时间的推移,我扩展了工具包中的定量部分,以处理越来越大规模的数据。我把自己黑进了数据科学家,因为成为数据科学家是我工作的最佳方式。从那时起,我在公共、私营和非营利部门,以及在安全、旅游、资产管理、教育和营销技术行业建立和管理数据科学能力。
当人们知道我的背景时,他们经常会问“你怀念当人类学家的日子吗?”我对这个问题的回答总是一样的:“我仍然是一个人类学家。”人们几乎从来没有问过我这么说是什么意思,但我越想越相信,我的意思说了一些重要的事情,即面对日益自动化和公众监督,数据科学如何能够保持一个有凝聚力的职业。
好的实现需要好的设计
作为一个职业,我认为我们对设计的关注太少了。我看到的关于这个话题的相对较少的讨论给我的印象不是太笼统就是太具体。一方面,我们似乎认为“好的设计”是某种不可定义的东西——只有当我们看到它时才能知道它——而与此同时,我们似乎太快地从好的设计的重要性转移到将设计转化为实现所需的具体方法、度量标准和其他技术工具的列表。
有一次,当我女儿很小的时候,她想要一个玩具厨房。我想从二手商店买旧橱柜和五金器具,给她做一套厨房用具。最后那东西是用木胶和一厢情愿粘在一起的。我女儿喜欢它,但它是一件真正的垃圾。我的实现有两个弱点。
一方面,我只使用我已经拥有的工具,这意味着五个或大或小的螺丝刀,一个机械师在换油后放在我汽车引擎盖下的活结钳,一把我上大学时从我父亲车库里拿的锤子,以及一小袋从宜家家具商店收集的类似工具的物品。简而言之,我的技术工具集很糟糕,我真的不知道如何使用我所拥有的少数工具。
另一方面,我真的没有经验或能力详细地设想我想要建造的东西。我不知道如何将事情作为一个整体来计划,或者考虑意外情况,或者在出错后进行调整,或者预测各个部分可以或应该或将要一起进行的方式。
如果我有世界上最大、最好的硬件,我会早一点完成,最终得到一个稍微好一点的产品。不知道如何实现当然是一个大问题,但是不知道如何设计才是真正阻碍我的。
我认为在这个特殊的时刻,设计技能对于作为一门学科的数据科学来说尤其重要,因为数据科学的技术方面最终有多少将被自动化仍然是一个悬而未决的问题。训练和验证模型是这项工作的一个重要部分。在我的职业生涯中,我训练和验证的许多模型今天都可以通过像 DataRobot 这样的服务全部或部分自动化。设计技能,以及我们如何学习这些技能,值得比我们,作为一个职业,迄今为止给予它们更多的关注。
“设计”这个词与“指定”有着相同的词根:单词“signum”,意思是“一个标记”——你书写、放置或剪切的将一件事物与另一件事物区分开来的东西。换句话说,“设计”是采取一个特定的目标,并区分所有与该目标相关的任务、材料和可能性的实践。以这种方式从概念上组织某些问题是具有挑战性的,不管技术实现有多困难。我认为这些问题是数据科学未来的重要组成部分。
通过协商讲故事来设计
根据我的经验,设计技能比其他非技术技能更难学习,比如“领域专业知识”或“沟通技能”。我认为这是因为每项技能的学习是如何发生的:
- 当你需要学习一个学科领域时,你让自己与那些已经熟悉这个领域的人接触。每当有人用一个你不知道的单词,或者引用一个不熟悉的例子,或者讲述一个他们的经历来解释一个你不理解的决定时,你就获得了该领域的专业知识。
- 当你需要学习沟通技巧时,你会进行沟通,然后得到反馈,告诉你哪些地方可以做得更好。每次你学习一个新的策略,看着别人展示最佳实践,然后在你下一次交流的尝试中尝试模仿,你就获得了交流技巧。
在这两种情况下,技能本身可能很难学习,但理解如何学习它们并不特别困难。有了设计,就不一样了。学习很难,但学会如何学习也很难。这是因为让一个人在设计技能方面胜任的因素与让一个人在其他非技术技能方面胜任的因素是不同的:
(我不打算说表的“愿景”部分。这是另一篇文章的主题)。
这可以归结为,相对于其他人,你在多大程度上可以决定特定的知识或特定的行为是合理的、可接受的、“正确的”——一句话,它是否有效。对于领域专家来说,没有人有这个权力:如果一件事情发生在一个领域内,那么它就是这个领域的一部分。在交流中,其他人完全有权决定什么是有效的:如果其他人都认为你的演示很糟糕,那么你认为你的演示有多好并不重要。你不能说“我不在乎其他人说什么,我知道我是一个很好的沟通者。”这暴露了对沟通如何进行的根本误解。
在设计中,你和其他人都有权决定有效性。我不是说有效性可以由你或者其他人来决定。我的意思是有效性必须经过协商。
人类学家倾向于使用一种叫做“人种学”的方法来协商设计的有效性。这种方法有许多不同的特点,但我发现把人种学想成要求你进入或多或少陌生的情境,让你自己的直觉和假设沉睡是有用的。你从“当地人”那里获得关于他们如何看待这些情况的信息,然后你唤醒自己的直觉,以便将你所学到的东西转化为对你来说看起来连贯而合理的故事。然后你把这个故事拿回去修改,直到它对他们来说也是一个连贯合理的故事。这是重复的,协商的故事讲述。
作为一名人类学家,当我有一个研究问题时,我会找到愿意和我谈论这个问题的人。我让他们告诉我这个世界是如何按照他们的方式运作的,做笔记,最终我会编一个故事,解释那些假设、背景和环境,让他们的故事对我来说是合理的、符合逻辑的。然后我和他们分享这个故事。然后他们说我满口胡言。
我不认为我第一次尝试复述他们的故事时,有人能认出他们。他们的直觉和我的直觉相差太远了。我得到详细的批评,然后我重写这个故事。如此反复几次,我得到了类似这样的回答:“好吧,这并不完全是我说的那样,但我认为你把所有要点都说对了。”然后我找其他人聊天。这一次,我从讲述我精心构思的故事开始——告诉他们世界就是这样运转的。然后他们告诉我我错了,我请他们纠正我。
随着时间的推移,随着我与更多的人一起工作,并刻意寻找那些有曝光度或观点的人,而这些人是过去的贡献者所没有的,我精心制作了一个大多数贡献者都认为合理的故事。有时这个故事分裂成不止一个故事,因为不同的人群根本不同意。通常情况下,我会以一个讲述大部分情况的主要故事结束,然后是几个讲述重要变化的附属故事。
我不只是收集信息。我填补了个人贡献者故事之间的空白。通常投稿人自己不同意(有时强烈反对)彼此的故事,但同意我的桥。我捍卫我对这个故事的贡献,就像他们捍卫他们的一样。对我来说,仅仅认识到一个视角的存在是不够的,别人告诉我什么有效什么无效也是不够的。我需要协商一个故事,融合我对世界的看法和其他人对世界的看法,结果需要被整体接受,即使它很难被部分接受。
好的设计来自谈判故事。除了沟通技巧之外,还有一些可以学习的技巧可以让一个人成为优秀的设计师。
给数据一个声音
现在,设计是各种利益相关者协商的结果的想法当然不是什么新鲜事。事实上,这种优先级的迭代设置是软件设计敏捷方法的核心。然而,我认为数据科学中的设计不同于大多数其他工程环境中的设计,因为数据本身需要有声音。我的意思是,在很大程度上,我的意思是,项目中的每个利益相关者都需要一个声音。在一个健康的设计环境中,利益相关者不只是在设计师规定的时间和方式下给出意见。他们能够反驳。他们能够提出疑问。他们能够加入意想不到的见解。我认为,创建工具来讲述个人的数据故事,即使没有人特别要求这个故事,这也应该是数据科学家工作的核心部分。
这些讲故事的工具需要有响应性,因为设计是协商的,因此是迭代的。当利益相关者提出一系列行动来解决特定的业务问题时,讲故事工具集应该能够对此做出反应:以直观的方式显示,如果执行了这些行动,数据看起来会有所不同,并标记出故事不再有意义的任何情况。它需要尽快做到这一点:如果数据拖累了对话,它将被释放。
提高设计技能是解决数据科学当前最大挑战之一的关键:算法偏差。不难发现存在严重设计缺陷的高效且可扩展的技术解决方案的例子。例如:
- 彭博对亚马逊提供的当天送达服务进行了一项调查,调查显示贫困的、少数民族聚居的邮政编码经常被排除在外。该算法建议在亚马逊已经拥有大量 Prime 订户的地方实现当天送达,这些订户往往在较贫困的地区数量较少。
- Wired的一篇报道展示了儿童虐待保护算法如何倾向于针对贫困家庭。该算法试图考虑的虐待儿童的指标(“没有足够的食物,没有足够或不安全的住房,缺乏医疗保健,或在工作时留下一个孩子”)等。)模糊了忽视和贫困之间的界限。
- 卡耐基梅隆大学的研究人员创造了一些行为相同的虚假用户,他们的个人资料只是性别不同。谷歌的广告显示系统往往很少向那些个人资料显示为女性的用户显示高薪职位的广告。
Image credit: https://www.bloomberg.com/graphics/2016-amazon-same-day/
在上述案例中,没有任何迹象表明种族、财富或性别是明确的目标。这些工具旨在回答一个简单的商业问题:我们如何区分我们感兴趣的人、地点或情况?就我们所知,每种情况下的技术解决方案似乎都是完全合理的:选择一组替代措施,并标记出最常展示这些替代措施的人、地点和情况。然而,在构建这些系统的过程中,似乎没有任何一套工具被构建来回答这样一个问题:被标记的人、地点或情况是否在任何属性上与未被标记的人、地点或情况系统地不同?这不是技术上的失败。这是设计上的失败。
我认为这个设计工具的问题在数据科学中基本上是一个未开发的领域,尽管它在软件开发中开始受到更多关注。无论如何,这是一个比技术技能组合更能抵御自动化威胁的领域,而技术技能组合通常被提升为定义该职业的核心。
示例 1:宗地几何重叠解析
Valassis Digital 从移动设备收集位置数据,并使用这些数据帮助公司更精确地向目标受众营销。我对这些数据的大量工作涉及到位置语义的问题:我们发现某些设备倾向于聚集在特定的地理空间,但我们想了解为什么它们聚集在那里。尝试理解位置语义的一种方法是通过宗地几何。理解为什么一个设备会出现在一个特定的地方的一个方法是看谁拥有那个特定的地方。这种数据可以通过美国和加拿大的评估办公室获得。我们得到一个定义属性边界的几何定义,通过查看与几何相关联的元数据,我们找到了赋予地理位置数据意义的方法。
宗地几何质量差异很大。我们在使用这些数据时遇到的一个困难是,有时宗地几何会重叠。我们对重叠发生的原因没有很好的理解:在某些情况下,这看起来像是一个简单的草率记录的问题;在其他情况下,财产的两种定义(例如,个人财产与城市通行权)会造成宗地可能合法重叠的情况。对于我们的大多数目的来说,将一块土地与一个且仅一个地块相关联是有帮助的。因此,我必须努力检测这种重叠,这很容易,并自动解决它,这很难。考虑以下情况:
这是我们在宗地数据中遇到的非常典型的重叠。蓝色多边形表示一个宗地,黄色轮廓表示另一个宗地。看到这个例子,几个相对简单的技术解决方案出现了。例如,我们可以将重叠区域分配给两个地块中较大的一个,或者两个地块中较小的一个。我最终得出的解决方案是,将两个地块的重叠区域进行区分,以创建一个模拟,模拟每个地块在失去重叠后的样子。然后,我对照大小和形状阈值检查了每个模拟。如果模拟地块比我们通常在有用的住宅和商业地块(我们最感兴趣的两种土地)中看到的更小或更窄,我只需删除与不成功模拟相关的形状。如果两个形状都没有导致模拟失败,我将重叠区域分配给较大的形状。如果两者都导致模拟失败,我将两个形状合并在一起。
完成上述解决宗地几何重叠的过程后,我对结果进行了一些简单的描述性分析,记录了移除、编辑、合并了多少宗地等。我还浏览了几十张像上面这样的图片,以确认结果看起来合理。换句话说,我做了一些正常的结果检查。然而,我继续用多边形覆盖卫星图像——其中有几千个多边形,并且我制作了一个工具来显示我的算法结果以及原始故障。它是乏味的。但是我们有数以百万计的地块几何,我习惯于看到新的故事出人意料地出现,即使是在长时间一遍又一遍地听到相同的故事之后。结果是:
在上图中,一名评估员拍摄了一栋多层建筑,并为每层的每间公寓创建了一个地块几何图形。都叠了。我的简单算法把这种情况搞得一团糟:它实际上最终移除了整个建筑,因为与其他一些地块相比,每个地块最终都变得太窄或太小。这是宗地重叠的特殊情况,必须在运行核心算法之前单独检测和处理。在这种情况下,我寻找堆叠(合计每个地块的面积并除以所有地块覆盖的总面积-任何大于 1.0 的值都表示堆叠),在我检测到堆叠的情况下,我将所有堆叠的地块合并到一个建筑物中。这应该没问题,对吧?
仔细观察上图中的边界线。几乎所有的线路都是双倍的。事实上,这整个区域由两组宗地表示,尽管这两组宗地并不完全相同-一组与另一组略有偏移,但在许多情况下形状也略有不同。我的堆叠检测导致这整个细分合并成一个单一的建筑-不是一个最佳的结果。在这种情况下,我需要像以前一样检查堆叠,然后检查冗余层。我创建了一个网络,其中每个宗地都是一个节点,每个边都是宗地接触的情况,而不是重叠。然后,我从这个网络中取出最大的连接组件集,并将其用作基础层。然后,它会检查每隔一组连接的组件,如果重叠超过某个阈值,则删除新层,如果不重叠,则合并新层。
以上只是一个简单的例子,但它说明了为数据集创建一种对预期算法做出反应的方式的好处,有时也说明了这种必要性。它要求我创建一个新的工具集,突出重叠区域,以便我可以更直观地看到问题区域,它要求我不断“询问”数据集的部分,我的实现是否有意义。我看过的大多数图像都表明我的基本算法没有任何问题。经过几个小时的寻找,我才开始发现差距。
示例 2:位置精度校准
我们每天会得到数亿条地理定位记录。然而,并不是所有的数据都可以信以为真。在其他问题中,特定的 ISP、应用程序、设备或特定的设备配置可以以精确坐标的形式报告数据,而实际上坐标并不是精确的。这有很多原因,其中只有一个原因是,来源有时依赖于高水平的记录,这些记录将整个地区编码为一组坐标,就像美国地理中心的一个不幸的家庭十多年来一直感觉的那样。
因此,在开始时,问题似乎相当简单:标记与异常多的独特设备相关联的坐标。例如,如果一个区域中的大多数坐标对看到 1 到 10 个不同的设备,但一个坐标对有 1,527 个不同的设备,则该坐标对可能被用作默认位置。这是一个区域中前 20 个坐标对的放大图,按照独特设备的数量排序,显示了它的样子。
顺便提一下,我省略了所有精度小于三位小数的坐标,并将所有其他坐标四舍五入到六位小数。六个小数位代表一个直径约为 4 英寸的空间,这是 GPS 在没有大量三角测量的情况下所能提供的精度极限。
这里有一个有趣的分析和商业问题。上图中的红线代表了一个例子,说明如何设置一个阈值来过滤掉坐标。您可以清楚地看到设备数量的激增,但您还可以看到至少两个类似规模的增长。什么应该被认为是一个极值而不是一个非常繁忙的点?
这个问题没有好的技术答案。有多种方法可以进行变点检测,但是所有这些方法自然都有需要调整的参数。而且,据我所知,它们都没有告诉你需要注意多少变化点。如果你看到至少三次大的跳跃,就像我们在上面的图表中看到的那样,会怎么样呢?第一个是识别假位置数据的截止点吗?最后一个?即使在只有一个变点的情况下,在变点将最大的数据点与所有其他数据点分开的情况下(有很多变点),这也只能给我们一个明确的行动路线。这符合我们对默认位置问题的天真想法。但是我发现在一些情况下,变化点将许多,有时是几十个数据点从其余的数据点中分离出来。
这个问题没有明确的技术解决方案,主题领域也没有给我们明确的指导——因为我们不知道产生热点的系统,我们不知道有多少是合理的。这是一个设计挑战。
这就是数据需要发声的地方,有了地理坐标数据,让数据发声并不困难。任何一天在一个地方有一个人都是正常的——这正好符合我们对使用移动设备的人的假设。如果我们看看某一天在纽约市佩恩车站得到的位置数据,这就是我们所期望的:
麦迪逊广场花园的中间有一个高密度的坐标,这是我们所期望的,因为宾州车站的主要美国国家铁路客运公司候车区就在地平面下。如果我们只过滤那些一天内很多人在同一地点联系的坐标,我们会得到一个不同的画面:
我们仍然可以在美国国家铁路客运公司等候区看到许多点击,其中许多点击实际上是一个接一个的。我敢打赌,这些地方大多就在时间表的正前方或电源插座的旁边。在麦迪逊广场花园和宾夕法尼亚广场二号(东面的长方形建筑)之间,我们也有几个热门景点,在美国国家铁路客运公司地下一层,是长岛铁路候车区。我们也有一些在另一边的两个佩恩广场,这是一个主要的出租车接送区。换句话说,即使这些坐标附加到的设备比我们通常预期的要多(有些设备多达 50 个),这种模式也是可信的。
然而,我只能通过碰巧知道一些关于我正在看的区域的事情来认识到这种可能性。这是不可扩展的。因此,我采用了我已经组合在一起的基本地图可视化功能,并将其合并到一个工作流中,该工作流提取美国行政区划(州、县、城市和邮政编码)的 shapefiles,将设备坐标数据集与形状进行匹配,然后使用每坐标对设备的频率来让数据说明特定设备计数的正常程度。
我将唯一设备的数量除以我所查看的行政区划范围内的最大数量。在大多数情况下,绝大多数的点击量不到最大值的 1%,所以我选择了最大值的 50%或更多。然后我开始翻阅覆盖着坐标的卫星图像,寻找故事。许多看起来像我预期的那样——在整个形状中有一两点。然后我降落在沃思堡郊区的一个邮政编码区:
这是一个网格。有几个点不符合网格,自然有部分网格丢失,但那里有模式。翻阅更多的结果,我在博伊西、圣安东尼奥、科罗拉多斯普林斯的邮政编码中发现了同样的情况。这是曼哈顿的一个:
请注意,我在图像上绘制的这些圆圈比实际位置大得多——为了便于查看,我放大了它们。实际上,每个圆圈的直径约为 4 英寸。
这把我带到了一个全新的方向。我设计了一个简单的算法来自动识别网格——我获取了所有连接有许多独特设备的坐标,计算了每个坐标对相对于 x 轴的旋转角度,保留了该过程中的前四个角度,然后过滤掉所有没有连接到另一个坐标的坐标,至少有一个角度。下面地图上的每个圆圈代表我在这个过程中发现的一个网格:
这是一组网格的放大图:
网格中的每个节点都是一个 4 英寸的小块,与其他节点相隔至少 1 公里。不同地方的距离和角度都不一样——这不是一个覆盖整个世界的单一网格。它捕获了大量的坐标,这些坐标具有相对极端的设备数量。如果我没有建立一个工具,让数据根据需求创造关于什么是正常的,什么是不正常的故事,我永远也不会找到它。
这些网格的另一个特点是:几乎所有的网格都包含天气应用。然而,这些应用程序创建的不在网格内的坐标比在网格内的坐标多得多,而且许多涉及坐标的应用程序显然与天气无关。但这给了我一个想法,这可能是一个天气网格,所以我花了一周的大部分时间从美国国家气象局研究和下载天气网格投影。我终于找到了一个与我在数据中看到的粒度大致相同的设备(设备坐标用黄色表示,天气网格用白色表示):
但是网格不匹配。盯着上面这样的图片看了很长时间后,我突然意识到一些显而易见的事情:
天气网格(白色)是一个合适的网格,节点形成直角。数据网格(黄色)则不是这样。因为国家气象局只使用正确的网格,根据定义,我在数据中看到的模式不可能来自国家气象局。我被难住了,直到像民族志实地调查中经常发生的那样,我在一个看似不相关的话题上进行了一次随机对话,给了我一些突然的洞察力。在这种情况下,对话是在我汽车的前座进行的:
注意布料上的图案。想象这些六边形中间的质心。我没能找到合适的天气网格,因为我一直在搜索“天气网格”。我需要搜索“天气网格”。我一照做了:
Image source: https://mpas-dev.github.io/atmosphere/atmosphere.html
显然,气象公司(归 IBM 所有,同时也是气象频道和地下气象的所有者)与洛斯阿拉莫斯的气候组织合作开发了一种网格,这种网格可以在世界上的某些地方拉伸到更高的分辨率,而在其他地方收缩到更低的分辨率。他们的网格实现是专有的,并且可能会随着预测需求的变化而发生变化。天气频道拥有一个 API,允许其他人提供天气服务,这解释了为什么如此多的其他应用程序最终也落入六边形质心。然而,天气应用程序在这些质心之外有大量的点击,这表明它们有时只提供质心数据,也许只有在设备上禁用位置服务时。对于气象公司来说,使用某种网格或网格来决定为用户提供什么样的预报非常有意义,对于应用程序来说,在报告用户位置时简单地报告这些六边形的质心也非常有意义——大多数报告系统只需要一个简单的坐标对。在这里,理解数据生成过程的设计可以最准确地使用数据
这一系列发现改变了我解决定位精度校准问题的整个设计:
- 仅查看特定天气应用程序的坐标
- 拾取附着了多个设备的坐标。
- 将数据划分到任意的邻近坐标组中(不再需要管理形状,因为现在我知道我在找什么)。
- 选择一个组中坐标对之间最常见的前 n 个旋转角度,并选择显示每个旋转角度的坐标对之间最常见的距离。
- 遍历所有坐标(不仅仅是具有多个设备的坐标),只保留那些通过所选旋转角度之一连接的坐标,以及那些通过该旋转角度的大致典型距离分隔的坐标。
- 因为网格节点会随着时间的推移而改变。
- 使用标准的变点检测方法查找行政区划中的异常值,但只能在移除格网坐标后进行。
通过构建工具来赋予数据声音——以粗略但直观的方式向我展示在多少设备被视为“正常”的不同假设下,坐标看起来是什么样的——问题从参数化变点分析的纯技术挑战转变为如何适应广泛但系统不精确的位置报告系统的设计问题。通过提前删除网格坐标,我的变点检测变得更加简单——它大大增加了州、县、城市和邮政编码,其中只有一组坐标具有极端设备数。此外,它还标记了不可信的坐标(至少在这些坐标给出的精度上),即使这些坐标上的设备数量并不极端。
我们需要一个好的问题生成工具集
数据科学目前非常擅长提出答案。它不太擅长提出问题。我认为这需要数据科学家更加注重培养非技术技能,但我认为这也需要我们开发更多工具来促进这一过程。事实上,构建工具将在很大程度上有助于构建非技术技能。
我在本文中给出的例子是一个相对简单的用例,因为地理空间数据有助于直接、直观的交流。其他类型的数据和其他类型的业务问题将带来更大的挑战。这是一个值得接受的挑战。对设计的关注——不仅仅是意识到这一点,而是积极构建我们的设计直觉、能力和工具集——是数据科学在核心技术功能日益自动化以及公众日益怀疑算法既符合道德又可扩展的观点的严格审查中生存下来的最佳机会。
这篇文章是我个人的,不代表 Valassis Digital 的立场、策略或观点。但我非常感谢我的雇主让我写博客,记录我为他们做的一些工作。(还有 我们正在招聘 !)
数据和价值的未来
原文:https://towardsdatascience.com/data-is-the-new-dollar-the-future-of-value-79cf4347b2ce?source=collection_archive---------3-----------------------
如何将数据作为资产进行估值
历史上,公司在追求股东价值的过程中,一直将美元作为一种价值衡量标准。现金流、利润和资产价值都与美元有关。我认为,围绕数据的价值,可以增加一组额外的度量。企业不仅应该通过当前的财务指标来衡量,还应该通过他们能够获取、消费、存储和利用的货币化数据量来衡量。这并没有改变货币的作用;它只是增加了一些新的方法,通过查看公司数据的价值来评估公司。
商业正在发展
数据价值上升的一个原因是不断发展的商业格局。所有的企业都开始看起来像软件公司。在我看来,企业大多选择两条路中的一条:成为一家软件公司(至少是一部分),或者变得过时。这是因为现代软件和硬件的能力越来越强,以及我们可以利用越来越多的可用数据做些什么。现代商业的几乎每个方面都要用到数据。我想我们可以同意;软件正在接管商业。
信息价值陈述的兴起
我认为数据对企业非常重要,它将被作为一种资产来衡量和计算。甚至可能有一个“信息流”的衡量标准,即收集了多少新数据,如何使用这些数据,以及从训练新的人工智能模型中产生了多少新价值。未来的企业健康检查可能不仅仅关注公司的财务偿付能力,还会关注该组织内数据的创建、流动和应用。事实上,将公司的“信息价值陈述”理解为其财务报表的补充将变得很有价值。
价值的未来&人工智能
人工智能将使这一点变得更加明显,因为它将从当前和未来的数据集中挖掘更多价值。有可能是一个相对较小的组织,拥有丰富的当前数据和收集未来数据的能力,被认为比一个高收入但数据贫乏的公司更有价值。此外,这些大型专有数据集的所有者可能会开始发现,其他缺乏数据的公司非常需要这些数据。数据将在一个我们尚未见过的水平上成为一种竞争武器。我们这些创建和运营未来数据驱动型公司的人需要非常清楚数据的战略管理。而且,如今一些流行的大公司对竞争对手来说可能变得更加危险,因为他们可以访问大量有价值的数据集并有能力使用它们。所以,我就如何思考这个价值提出一些建议。
测量值
我们如何衡量数据的价值?下面,我推荐了七种未来评估数据的方法。可能还有更多,如果你有想法,随时联系我。
1。时间价值 *该指标衡量数据的现值,并考虑其在整个生命周期中的价值。*数据的价值将如何随时间变化?这个值会随着时间增长、减少还是波动?它保值的可能性有多大?有些数据的生命是有限的,有些数据是常青的/永远有价值的。随着时间的推移,大多数数据都会衰减,变得越来越没有价值。
2。法律限制 *该指标衡量在考虑了数据的所有法律限制后,特定数据对于许多用例的价值。*数据可能带有使用的法律限制。必须制定保护隐私和机密性的规定,但是如果数据具有高价值,它还必须能够用于有价值的未来用例。许多用途还不为人知,因此,必须在保护隐私和让法律协议更加开放(关于如何使用数据创造未来价值)之间取得平衡。
3。上下文值 *此指标与数据集有用的上下文数量相关。*具体数据可能只对某些行业有用。一个数据集可以使用的越多,它的整体价值就越大。然而,一些狭义的数据集可能非常有价值,这取决于上下文区域。一个有趣的挑战将是在上下文之间创建数据价值套利。数据所有者会希望收集价值较低但具有新用途潜力的数据,从而提高其价值。这将允许聪明人以较低的感知价值购买数据集,并将其用于新的环境中,以获取差价利润。
4。质量 *该指标衡量数据的质量。*对于有用的数据,它必须在准确性、完整性和可靠性方面具有高质量。
5。获取和存储 这些指标衡量企业获取数据并存储数据的成本。获取数据的成本必须包含获取数据的商业成本。这不仅仅是获取数据的技术成本,而是首先收集或购买数据所支付的费用。维护和存储数据也有相关的成本。这些会降低数据的价值。
6。访问 *该指标衡量公司从数据访问渠道的大小(数据量)和数量/种类两方面对数据的访问级别。*这可能是由公司在一个更大的多公司价值链中所处的位置决定的。直接从客户、合作伙伴和传感器收集的数据都属于这一措施。一个只有一个数据获取渠道的公司可能不如一个有许多数据收集渠道的公司有价值。收集的数据量也很重要。因此,这将是对公司可用的数据通道的规模和种类的综合衡量。
7。人工智能模型训练值 *这是数据可训练性的度量。*人工智能是数据的指数值将被解锁的区域。AI 系统是通过使用数据来训练的。机器学习训练中使用的数据将是其价值的一个重要指标。数据越符合好的训练数据的定义,值就越高。
人工智能创业机会 关于数据估值模型的另一个有趣的事情——就是我想用它们来建立更好的模型,来推测数据价值可能在哪里。我们正在开始人工智能创业的时代,在这个时代,发现新的业务用例、要捕捉的新数据以及旧数据的新用途将是一门非常有价值的艺术和科学。此外,正如我上面提到的,对于那些能够利用在某些情况下被低估的现有数据并在新的情况下重新定位的人来说,数据套利可能是一个巨大的机会(有时,只是通过更好的人工智能模型来产生更好的见解和模式)。
总的来说,对于知道如何使用数据的企业家来说,人工智能将加速一些数据的增值。人工智能企业家将需要创造新的工具和模型来管理如何思考这个问题。事实上,数据评估公司可能是一个全新的公司类别,需要被推出来解决这样的问题。数据经济学是衡量和运营未来公司的重要方式。理解这一点的投资者、创始人和大公司高管将比不理解的人拥有更大的优势。
在推特上关注我: @willmurphy
我是威尔,硅谷的一名技术高管和企业家。
关注我的多产:@ 威尔墨菲
数据是新的石油
原文:https://towardsdatascience.com/data-is-the-new-oil-f11440e80dd0?source=collection_archive---------1-----------------------
数据已经取代石油,成为创造巨大商业价值的燃料
Photo by Markus Spiske on Unsplash
当我谈论数据战略和人工智能战略时,我会说数据是新的石油。而且,数据是给 AI 机器加油的燃料(油)。我还会谈到如何对数据进行估值,因为它可能是最有价值的现代商业资产,但还没有被准确计算。
石油出来了,数据进来了
请看下面这张幻灯片,它是我 40 分钟演讲的一部分。它比较了 2006 年和 20016 年最大的公司(按市值计算)。看到有趣的东西了吗?
Technology companies have moved into the top slots over the past 10 years
当你比较橙色(石油/能源)和**(科技)蓝色**(科技)公司时,你会发现在短短十年间,许多能源公司跌出榜单(埃克森美孚仍在榜单上),科技公司取而代之(苹果、Alphabet、微软、亚马逊和脸书)。
Big tech companies with big data are making big bets on AI
这些公司已经能够通过使用由数据专业知识驱动的技术构建产品和服务来积累财富。现在,这些公司都在关注 AI。这非常有意义,因为他们都能够积累大量关于产品和人员的有价值的数据集,而很少有其他公司能够获得这些数据集。如果你是一家石油公司,并且坐拥大量石油,那么是时候对其进行提炼,并以其能够创造价值的多种方式将其推向市场。
如果说数据是石油,AI 就是高级提炼
石油是市场上很多很多人没有意识到的东西(成千上万的产品)的基础。它真的很有价值,因为它是许多其他东西的基础——如燃料、塑料制品、肥料、阿司匹林、蜡笔、口香糖、服装、太阳能电池板等。因此,石油与如何提炼石油的知识相结合,为我们现代的物质产品生产体系奠定了基础。数据结合 AI 将形成我们现代服务生产体系的基础。数据和人工智能如何改善一切还不清楚,也不言自明。大多数 AI 价值将隐藏在后台,使我们用数据做的一切(尤其是围绕模式识别、预测和自动化)变得更好。这就是为什么我有点喜欢石油的比喻——石油是一种基础的、有用的商业产品,它让人们无法立即意识到的许多事情成为可能。
石油与如何提炼石油的知识相结合,为我们现代的实物产品生产体系奠定了基础。
数据结合 AI 将形成我们现代服务生产体系的基础。
数据寡头/数据垄断
所以,这给竞争对手和创业公司带来了一个有趣的问题。未来的科技公司会有机会吗?这些现有的大公司可能能够开拓“数据垄断”在这种情况下,在特定细分市场中拥有最多数据的单个参与者可以从数据中产生如此多的价值,他们能够(通过利润和新数据)推动其他任何人都无法比拟的业务扩张。此外,还可能形成“数据寡头”,在那里,仅仅几个现有的大公司就自动拥有人工智能在许多领域的未来,因为他们目前坐拥大多数当前有价值的数据“房地产”。
对创新者的启示
因此,初创公司在人工智能领域需要考虑一些事情。对于消费者应用程序,存在人工智能机会,但它们存在于狭窄的消费者渠道中,如健康和健身。但是就大型的、一般的消费者智能代理而言,例如;我看不出一家初创公司会如何与亚马逊(Amazon)、谷歌(Google)或苹果(Apple)竞争。或者,他们可以提供许多其他面向消费者的产品,人工智能只是改进了当前的技术。
未来的许多技术产品和公司很可能会在这些大公司提供的现有数据/人工智能处理基础设施的基础上创建一个额外的技术层。虽然会有一些利基领域没有被大公司覆盖,但允许初创公司创造独特的价值和独特的全栈架构。大公司将有资金收购许多处于起步阶段的利基人工智能公司,因为它们已经出现在雷达上。但是,我认为一些公司会很快成为价值数十亿美元的公司。无论如何,我认为所有未来/新生的技术创业公司都需要知道数据和人工智能价值链在未来几年将如何构建。数据是新的石油,所以你需要了解你是否能够对自己独特的数据集提出主张,或者你是否将从能够在你到达那里之前收集数据的公司获得数据。
我是威尔,硅谷的一名技术高管和企业家。
跟我上多产:@ 会
通过 H-1B 信息获取工作薪金数据
原文:https://towardsdatascience.com/data-job-salary-via-h-1b-info-429338243fa2?source=collection_archive---------5-----------------------
H-1B 签证是一种非移民签证,允许美国公司雇用技术或金融等专业领域的专业人士。它受政策和法规的约束。随着美国劳工部披露雇主、工作、地点和请愿结果的信息,这些数据通常是工资信息的金矿。
因为 job_title 是一个文本列,所以第一步是清理它。我筛选了包含数据、机器学习、统计和商业分析师等关键词的职位,并进行了两种分类:
- 按职称将工作分为分析员、科学家、工程师等
- 按初级、高级、经理、主管、副总裁等分类级别
然后,根据水平时间轴绘制中值、最低和最高工资。范围很大,商业分析师的最高工资是 2.43 亿英镑(真的吗?!)申请,但该申请被驳回。绝大多数在 200 万以下,这是我们的绘图范围。
你的水平在这个范围内处于什么位置?你在哪里工作和做什么都很重要。
当按职位细分申请数量时,分析师占主要份额,其次是 DBA。有点令人惊讶的是,获得 H-1B 的分析师比数据科学家头衔的人多得多,尽管有些人的头衔可能不是“数据科学家”,而是一些时髦的名字。
请愿量最高的 5 个州是:
除了集中在加州西海岸和西雅图之外,东海岸似乎也有大量 H-1B 持有者流入。
我今天在传单地图中学到了一个有趣的技巧:这个简单的代码片段可以在不同的维度之间切换。很酷的东西。
addLayersControl(
baseGroups = c("job", "level"),
options = layersControlOptions(collapsed = FALSE)
)
addLayersControl 组提供了两种选择:
- baseGroups 显示为切换按钮:一次只能选择一个
- 重叠组显示为多选按钮:可以重叠组
更多关于 addLayersControl 的信息可以在这里找到。
我还没想好如何在媒体上发布互动传单地图,但完整代码在 Github 上
这是我关于数据可视化和数据科学的# day5 项目的#day5。
本周数据新闻集锦
原文:https://towardsdatascience.com/data-journalism-highlights-this-week-5b603d9d4b92?source=collection_archive---------11-----------------------
这是一个短暂的星期,因为银行放假,但我们仍然很忙。哦,公司现在叫 Reach 而不是 Trinity Mirror,如果你看了我的简介,想知道我是否换了工作。
欧洲电视网:他们是讨厌我们,还是只讨厌我们的烂歌?
周六是欧洲歌唱大赛决赛。如果这意味着什么的话,这意味着第一次投票后几秒钟内英国获胜的所有希望都消失了,而格雷姆·诺顿几乎毫不掩饰地暗示,陪审团制度可能不完全客观,一些国家可能,你知道,倾向于投票给他们喜欢的国家,而不是他们喜欢的歌曲的国家。
这可能是真的吗?我们决定分析自 2000 年以来每个国家在现场决赛中的每一次投票。剧透:格雷姆是对的。
最亲密的关系?嗯,土耳其和阿塞拜疆总是给对方最多 12 分。每次都是。没有失败。摩尔多瓦和罗马尼亚平均各交换 11.5 分,塞浦路斯和希腊 11.6 分。
至于英国?每个人都讨厌我们。可能除了爱尔兰,他们平均给我们 5.3 分。和马耳他,他们给我们的平均分是 4.3。
匈牙利平均给我们 0.2 分。他们真的恨我们。
无论如何,我们建立了一个互动,让你可以看到自己的全部可怕的真相。在这里尝试我们的预览,或者在明天决赛的预备阶段在 Reach 网站上寻找它。
被剥夺了受教育的权利:贫穷和逃学是如何同时发生的
旷课水平与贫困有关吗?又到了什么程度?
为了找到答案,Rob Grant 决定调查全国每所学校未经许可的缺课情况,并与这些学校所在社区的贫困水平进行比较。
结果相当明显。例如,在伯明翰,该市最贫困地区的学校的逃课率是最富裕地区的三倍。
同样的模式到处都出现了。
形成恶性循环的风险是显而易见的:如果贫困地区的儿童无法接受教育,因此无法获得体面的资格,那么摆脱贫困就变得更加困难。
你可以在这里阅读更多关于 Rob 的调查。
只有七分之一的儿童性犯罪最终被送上法庭
2017 年,英格兰和威尔士警方记录了 43,284 起儿童性犯罪。
有多少是以嫌疑人出庭告终的?才 6519。
我知道这个相当令人不安的事实,因为 Deb Aru 一直在梳理当地儿童性犯罪的犯罪结果数据。全国各地的情况略有不同,但总的主题是相同的:绝大多数记录在案的犯罪不会导致起诉。
这是为什么呢?嗯,在大约一半的案件中有“证据困难”,而在许多其他案件中,受害者选择不继续进行。
一些警察部门对 Deb 的数据做出了回应,指出他们正在努力提高这一比例,同时也承认儿童性犯罪永远是最难证明的犯罪之一。(通常很少或没有确凿的证据。)
你如何提高利率?正如 NSPCC 对 Deb 说的那样:“在整个访谈和证据收集过程中,儿童得到适当专家的充分支持是至关重要的。”
你可以在例如布里斯托尔(这里的数字接近十分之一)利兹格里姆斯比和伯明翰读到她的发现和当地势力的反应。
准妈妈世卫组织继续吸烟
这么多人。这么多。我意识到我是 a)一个男人,和 b)一个不吸烟的人(或者说是曾经吸烟的人)。但是:这看起来很疯狂。
正如你可能预料的那样,在这个国家更贫困的地区,这些数字要糟糕得多。在大曼彻斯特地区,八分之一的准妈妈在怀孕期间都在吸烟。
在默西塞德郡是七分之一,而在德比郡大致相同。全国平均水平接近九分之一。
怀孕期间吸烟的风险众所周知。它限制了胎儿的氧气供应,阻止其正常发育,并可能导致流产、死产和婴儿猝死的更高风险。
反吸烟慈善机构 ASH 表示,尽管很大一部分女性在怀孕时会尝试戒烟,但仍有一些失败的关键标志:主要是缺乏健康服务的支持,以及与继续吸烟的伴侣生活在一起。
印刷中的数据单元
我们本周的头版主要来自我之前提到的公告,包括我们对当地犯罪数字的分析和 Deb 关于袭击护理人员的信息自由请求。
哦,我和新闻公报聊了聊数据单位,我对 2018 年数据新闻的想法,“机器人”的角色,以及类似的事情。
Click here to read
祝你周末愉快。
用 N 皇后进行数据操作
原文:https://towardsdatascience.com/data-manipulation-with-n-queens-640d37e3c774?source=collection_archive---------0-----------------------
H 我们如何感知,进而如何解决问题,在很大程度上取决于给定数据的格式。事实上,通常可以将给定数据重构为一种形式,这种形式比最初呈现或收集数据的方式更有助于解决问题。在计算和数学中有一个流行的问题,它很好地证明了面向问题的数据重构的概念,它如下:
你有多少种方法可以将 n 个*(团队不可知)皇后放在一个维度为 nxn 的棋盘上,这样就没有皇后可以攻击其他的了?*
我考虑的第一种方法是将可能的解决方案表示为一个实际的棋盘,在不同的方格中放置一些皇后。一种利用这种数据格式的算法(后来证明与所提出的解决方案非常相似)包括在棋盘上的每个空间放置一个皇后。从这里开始,你可以试着把另一个皇后放在别的地方,确保第一个和第二个皇后不能互相攻击。然后对第三个皇后重复这个过程,然后是第四个,依此类推,直到你在棋盘上有了 n 个皇后。在这一点上,数数你想出了多少独特的董事会。该过程看起来像这样,为了简单起见,省略了一些内容:
你可能已经注意到了这个算法的一个或几个问题。首先,如果你严格按照流程图去做,你将会产生大量的非独特的解决方案。必须验证板是否是唯一的将浪费大量时间。第二个(也是更成问题的)问题是,每增加一个皇后,所需步骤的数量将呈指数增长。特别是,当你没有尝试每一个自由空间,并且你还没有足够的皇后,你将不得不对同一个棋盘以及一个有额外皇后的新棋盘再次执行该过程。按照这种逻辑,每次迭代都需要流程图的n * n — k
个新实例,其中 k 是棋盘上已有的皇后数。问题在于,整个棋盘包含了大量的信息,我们根本不需要回答这个问题。让我们考虑提出的问题,并尝试将数据归结为一种格式,只表达我们真正需要产生解决方案的内容。
T 这里有一些方法可以让我们避免在我们知道行不通的解决方案上浪费太多时间。首先,我们知道女王可以攻击她们行中的任何东西。考虑到这一点,如果一行已经包含一个皇后,我们可以忽略整个行。添加这个简单的功能将极大地减少我们必须验证为解决方案的板的数量,以及我们需要检查唯一性的板的数量。
“但是等等!”我听到你说,“女王也可以攻击他们队伍中的任何东西,所以我们也只使用独特的队伍吧!”当我们这样做的时候,我们可能会认为只在空对角线上放置皇后是明智的。我们会到达那里;请容忍我一会儿。在这一点上,我开始怀疑摆弄整个棋盘是否真的是解决问题的最佳方式。如果我们可以轻松地表示每个皇后的行和列,并保证每个皇后的唯一性,而不需要我们管理一大块空白空间,这不是很好吗?的确会,而且碰巧有一种方法不仅能解决笨拙的棋盘问题,同时还能让我内心的组合学博士(我做梦都能拿到博士学位)高兴:输入我喜欢称之为“棋盘地图”的东西
让我们跳回到独特的行。如果每行只能容纳一个女王(它们的个人空间非常大),那么这很适合于每行只记录一个位置:女王所在的列。类似地,既然我们知道每列只能容纳一个皇后,并且我们需要一个完整的 n 皇后在我们的小战区中,我们可以说每列必须在我们的行集合中的某个地方被表示。实际电路板图的一个示例如下:
Map: 2–5–7–1–3–0–6–4
地图2-5-7-1-3-0-6-4
与显示的棋盘完全对应,如下所示。映射中的第一个位置(位置 0)表示第一行,其中的值(本例中为 2)声明该行的 queen 存在于该行的第三列中。类似地,第五个位置(位置四)确定在其第四列(或第三列,因为我们从零开始)中存在皇后。把这个逻辑应用到整个地图上,你就会得到上面的板子。使用这种地图结构,很明显问题的任何解决方案都将是一种排列,即地图中数字的重新排序,平凡地图0-1-2-3-4-5-6-7\.
的重新排序。然而,我们仍然需要担心对角线。
事实证明,我们的新地图结构也恰好给了我们一个非常简单的方法来检查是否存在对角线冲突。在国际象棋棋盘上,如果一个皇后与另一个棋子相隔的行数和列数一样多,就有可能进行对角线攻击。根据这种推理,如果位置的差异与地图中任意两个项目的数量差异相同或相反(例如,3 是 3 的倒数),我们可以丢弃该地图,因为它不是问题的有效解决方案。考虑到这一点,我们的新算法变成:
请注意,这个操作没有分支,需要在当前迭代之后进行多个新的迭代。此外,平凡地图的每个排列保证代表一个独特的棋盘,因此我们可以完全消除测试是否已经计算了一个解决方案。我们的地图结构也先发制人地消除了大量有问题的棋盘,因为我们已经保证没有水平或垂直的攻击是可能的。因此,通过放弃原始的数据格式,转而采用针对问题定制的数据格式,我们能够显著降低解决方案的复杂性。
到总结,在开发一个问题的解决方案时,考虑数据和数据呈现的格式是非常有益的。操纵传达比回答给定问题所需更多信息的数据是对资源(在计算的情况下是时间和内存)的浪费。在 N 皇后的例子中,我提出的第一个解决方案花了一分多钟来计算从 0 到 8 的值的答案,而第二个只花了不到 30 毫秒。对于技术上更倾向于,原始解决方案在***【o(nᴺ】*处操作,其中 N 是板的尺寸(因此 n ),而第二个更简洁的数据集允许在 O(n!)。
数据市场:信息时代的圣杯
原文:https://towardsdatascience.com/data-marketplaces-the-holy-grail-of-our-information-age-403ef569fffb?source=collection_archive---------7-----------------------
这是数据深度挖掘系列的第 2 部分。 第 1 部分 描述了数据如何改变我们经济和社会的几乎所有方面,但数据经济的真正希望在很大程度上仍未实现,因为我们仍然缺乏允许标准、安全和高效的数据交换的技术。
进入数据市场
首先,什么是数据市场?就像任何市场一样,它是一个平台,可以方便地购买和销售资源(在本例中为数据)。实际上,数据市场是一种软件,数据提供者和数据消费者通过图形或后端接口连接到该软件,以从彼此购买和出售数据。
正如股票和货币在不同类型的交易所交易一样,不同类型的数据和使用情形需要不同类型的市场。举例来说,一个个人数据市场可以让个人选择向谁出售他们的个人数据,并直接将所得收入囊中;而一个商业数据市场可以让两家公司相互买卖行业数据,比如本地化的产品价格、保险理赔统计数据或某个行业最近的投资交易数据。
数据市场的关键属性
为了理解数据市场为何会成为缺失的数据经济支柱,让我们来看看 数据深度挖掘第 1 部分 中列出的阻碍其充分发挥潜力的 3 个基本障碍。
- 大多数数据都以未精炼(或非结构化)的形式存在,将它们转换为结构化数据(软件使用所需的格式)并非易事。
- 数据所有者使用不兼容的数据模型来构建他们的数据,这些数据保存在孤立的孤岛中,尽管通常会受到其他人的追捧。
- 目前还没有人知道如何高效地定价和交换数据。
尽管不同的数据市场根据其特定使用情形具有不同的属性,但一般而言,数据市场范例允许:
- **众包:**通过实现自助数据销售,他们提供了摆脱不准确/昂贵的单一来源数据的解决方案。
- **一致激励:**数据所有者/收集者将数据保持在结构化形式并提供给其他人会直接受益。
- 标准化:按照设计,市场为买卖双方定义了一个通用的数据模型和数据交换界面。
- 公平:供应商可以设定自己的价格,而消费者可以选择向谁购买,而不是拥有一个中央定价数据。
更好的知识共享模式
最终,数据市场可以被认为是一个知识共享平台,它比当前的数据源方法更好地协调了数据消费者和数据所有者的动机。
例如,手动数据收集对于数据消费者来说是一个单调乏味的过程,对数据所有者来说没有任何价值。同样,网络搜集对消费者来说是缓慢和/或昂贵的,有时甚至是非法的,对所有者来说也没有任何价值。另一方面,数据消费者和孤立的数据提供者之间的临时数据交易往往将大量权力掌握在提供者手中,使他们没有动力提供负担得起的高质量数据。
因此,矛盾的是,在我们所谓的信息时代,数据流被打破了。这使得数据获取成为一项不必要的高成本任务,同时对于经常坐拥大量未利用或未充分利用的数据的数据所有者来说,这是一个巨大的错失机会——双输。
The reality of working with data today: data scientists spend over half their time collecting, cleaning and organizing data before they can use it [Figure Eight].
然而,在市场环境中,购买者只为他们消费的数据付费,这有效地激励了数据提供商提供最高质量、最受欢迎的数据,因为这可以最大化他们的收入。同样,市场创建的基础设施和固有的数据交换标准消除了数据买方和卖方之间的摩擦,从而降低了获取数据的成本,为数据经济实现其真正潜力提供了前两个障碍的解决方案。
反过来,对消费者更好的价值可能会增加需求,从而为数据提供商提供更多的潜在收入。这最终使它成为一个比现状(想想 Airbnb)对双方都更好的交易,并形成一个正反馈循环。
最后,通过允许数据提供商设定自己的数据价格,并允许数据消费者选择向谁购买数据,数据市场不仅允许消费者表明哪些数据/卖方提供价值,而且还通过采取自由市场方法解决了数据定价难题。
由于许多组织已经将收集数据作为其正常运作的一部分,
在不久的将来,数据市场将会把现有数据的广度和深度至少扩大一个数量级,就像维基百科对百科知识所做的那样。
最后一部《大英百科全书》于 2010 年出版,涵盖了 50 万个主题。今天,维基百科有超过 500 万篇文章,每天有 600 篇新文章,每秒钟有 10 次以上的编辑。
区块链:缺失的一环
既然我们已经解决了理论问题,让我们转向实践吧。为了创建实现上述承诺的数据市场,我们需要:
- 一种让数据市场尽可能开放的方法——众包尽可能多的数据——同时保护买家和卖家免受坏人的影响。
- 一种保证数据销售者每次购买数据时都能获得报酬(并获得正确金额)的方式。
- 一个快速、安全和可扩展的微支付基础设施,允许自由使用:购买者只需支付他们消费的数据。
- 一种保证数据来源的方法,以确保购买的数据没有被篡改,并且实际上来自所谓的卖家。
区块链智能合约的出现最终创造了一种强制执行这些属性的方式,这种方式不需要数据提供者和数据消费者相互信任或市场。在处理市场参与者、数据和支付的认证时,信任是一个关键因素。事实上,信任的集中化可能是之前创建数据市场的尝试失败的主要原因之一——最明显的是微软 Azure DataMarket,它在 7 年后于 2017 年 3 月关闭。
我们现在来看看新一代的企业,它们利用区块链的技术让数据成为可交易的资产。
区块链驱动的数据市场即将到来!
数据市场就像交通工具。自行车、汽车、飞机等。每一种都构成了一种独特的技术,这使得它们在不同的使用情况下都是理想的,但是似乎不太可能存在一种通用的解决方案,可以无一例外地胜过所有其他的解决方案。
因为数据利益相关者如此多样,数据的使用案例无穷无尽,所以对数据市场进行分类的直观方法是根据它们允许参与者交换的数据类型:个人、商业和传感器数据。
Some of the key properties of blockchain-powered data marketplaces categorized by data type [The DX Network]
个人数据市场的使命是通过允许消费者根据自己的条件直接利用他们的数据赚钱来赋予他们权力。例子包括 数据 、 数据钱包 和 数据钱包 允许用户出售任何东西,从他们的电子邮件地址到社交媒体流或他们的位置。
个人数据市场的主要特征是它们具有面向消费者的组件,例如移动应用程序,其目的是收集数据,确保数据被安全地存储/交付(本地或第三方分散存储),并为用户提供管理数据购买请求的界面。在买方方面,使用 API 从目标用户处购买个体数据集,以集成到内部产品、线索生成流程、营销活动等中。
业务数据市场旨在实现高效的企业对企业数据交换,重点关注结构化数据和大型数据提供商/消费者。 海洋协议 和我们自己的 DX 网络就是这种情况,这些为交易企业知识如特定行业的数据或科学实验结果提供平台。****
商业数据市场的独特之处在于,提供商提供的数据通常与提供商本身无关。这对他们的底层技术有着根本性的影响,底层技术必须具有共享数据库的许多属性,而个人和传感器数据市场更接近于数据目录。这导致数据在市场内被聚集,从而可以立即使用。提供商和消费者都通过面向商业智能、研究、机器学习等的 API 与市场进行交互。
传感器数据市场允许从远程设备购买实时数据。例如, IOTA Data Market , DataBroker DAO 和stream提供污染、电网和车辆远程信息处理数据馈送。
传感器数据市场的特性是待售数据的实时性。目前,卖家在市场界面上列出他们的传感器,以及每期或每次读数的价格,买家使用相同的界面订阅数据流。在未来,物联网设备可以使用 marketplace APIs 自动列出自己并将其数据流货币化,和/或自主从其他设备购买数据流,以改善城市生活、交通、制造等。
**如果你知道另一个应该在上面提到的数据市场,请在下面留下评论或联系@twitter.com/itsJeremiahS
智能合同是关键
区块链驱动的数据市场是推动新兴数据经济的创新。下一次数据深度探讨将给出智能合约如何用于在数据市场中分散信任的实际细节。
数据挖掘
原文:https://towardsdatascience.com/data-mining-bc7feca95887?source=collection_archive---------0-----------------------
1.数据挖掘和工具简介
一个小序言
数据挖掘有时被称为从数据中发现知识(KDD ),就是在数据中发现模式。这个领域已经发展成为一门科学,而不仅仅是信息技术中的一个模块,因为它在所有领域都有越来越多的用例。本文是我准备发表的关于数据挖掘的系列文章的第一篇,从简单的步骤开始,向更深层次的概念发展。
为什么和如何?
在现代社会中,随着社交网络的发展,数据以非常快的速度产生。数据本身没有任何意义,除非它们被识别为以某种方式(模式)相关。这种模式的发现是 KDD,它已经成为信息技术的自然演变。数据就是金钱!所有的购物建议,生物学、医学的新发现,甚至是微小的板球预测都是一些相关数据 KDD 的结果。
如何做是最有趣的部分。数据科学已经成为一个完整的研究领域,数学、计算机科学和数据所属的所有其他科学都在其中发挥主要作用。如今,这与程序员几乎没有任何关系。这是一个非常快速的烤箱加热介绍。
弄脏手
对于本系列,我们将使用 Python,我们认为数据主要是结构化数据。这意味着数据遵循表格格式,其中属性是表格标题,数据以行的方式存在。
为什么是 python? Python 是一种解释型语言,其中大部分数据挖掘和预处理库都是 C++扩展,使得用户执行起来既快速又简单。
为什么不是 python?
Python 按照它的解释可能需要更多的 CPU 时间,在移动计算中它不是首选。节省程序员时间,代价是 cpu 时间。python 语言的并发性不是很有效,因为它是一种解释型语言,而 C/C++包装器的使用在一定程度上解决了这个问题。
基本 python 库
普通 Python 无法独自完成很多工作。我们需要一堆图书馆。让我们看看如何在我们的机器上安装和运行它们。
- Numpy —数值 Python,基本上用于线性代数目的,执行向量运算。
- 熊猫——用于操纵和执行数据结构上的操作
- Matplot 库——用于绘制和可视化输出工作
- IPython——交互式 Python,将一切整合在一起,我们将拭目以待。这是更好的安装使用 Anaconda 官方网站和使用 Spyder 从 Navigator(尝试一下,完全值得努力)。
- 科学 python,基本上是 Python 的科学计算器
这些库的安装可以通过访问我链接的官方页面来完成。最简单的方法是使用
pip
或pip3
包安装程序,它可以在所有平台上运行。
文章系列的工具
我将使用 IPython Spyder。从 Navigator 安装 Anaconda 执行 Spyder。你会看到这样的东西。
Spyder 3.1.4, The Scientific Python Development Environment
几个重要的概念
属性类型
正如我所提到的,属性与表列同义,并且种类很少。
- 被识别为分类属性的名词性名称或类别不涉及数学运算,但涉及决策运算
- 二进制
属性,即取 为真(1) 为假(0) - 序数
对排名数据有意义的属性,例如 GPA 某学生的图。 - 数字
数量属性,例如:测试案例、受害者、死亡等等,这些是大多数情况下最有趣的数字。
相关
From: http://www.statisticshowto.com/wp-content/uploads/2012/10/pearson-2-small.png
正相关是成正比的关系,负相关是成反比的关系,无相关意味着属性是正交的。相关性的识别证明了数据挖掘中的一个重要步骤。我们将在接下来的主题中看到。
页(page 的缩写)在数据挖掘的方法识别中,统计分布有着重要的表现。我们会用相关的话题来讨论它们。
下一步:数据清理、转换、合并和整形
数据挖掘
原文:https://towardsdatascience.com/data-mining-e06cf1a0b7ee?source=collection_archive---------3-----------------------
2.熊猫数据结构和基本操作介绍
Pandas Logo
我已经在我的 上一篇文章 中讨论了如何设置工具和数据挖掘的基本介绍。Pandas 基本上是作为一个库来管理数据结构的。该库还提供了一些对数据进行预处理和清理的重要操作。
将熊猫导入工作区
import pandas as pd
导入为 pd 使其更简单,手更短。
导入特定功能
from pandas import Series, DataFrame
我们将主要使用这两种数据结构
熊猫数据结构
系列
数组形式的数据结构,让标签从 0 开始,一直递增。举个例子。
In [1]: from pandas import Series
In [2]: obj = Series([1, 2, 3, 4, 5, 6])
In [3]: obj
Out[3]:
0 1
1 2
2 3
3 4
4 5
5 6
dtype: int64
您也可以使用自定义标签。
In [1]: from pandas import DataFrame, Series
In [2]: obj = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
In [3]: obj
Out[4]:
d 4
b 7
a -5
c 3
dtype: int64
一些有用的特性
*将字典转换为序列,s = Series({'age':23, 'name': 'anuradha'})
,
*直接分配索引obj.index = ['attr 1', '*attr 2*', '*attr 3*']
,
*索引可以有属性名obj.name = 'Population'
数据帧
这些是表格数据的数据结构,非常类似于电子表格,可以包含大量数据。
In [1]: data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'], 'year': [2000, 2001, 2002, 2001, 2002], 'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}In [2]: data
Out[2]:
{'pop': [1.5, 1.7, 3.6, 2.4, 2.9],
'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002]}In [3]: frame = DataFrame(data)
In [4]: frame
Out[4]:
pop state year
0 1.5 Ohio 2000
1 1.7 Ohio 2001
2 3.6 Ohio 2002
3 2.4 Nevada 2001
4 2.9 Nevada 2002
在不深入研究上述数据结构的情况下,让我们继续研究一些功能,并在以后探索更深的领域。:)
过滤
对于这个例子,让我们考虑下面这段代码。
In [1]: from pandas import DataFrame, Series
In [2]: import numpy as npIn [3]: data = DataFrame(np.arange(16).reshape(4,4), index=['Ohio', 'Colorado', 'Utah', 'New York'], columns=['one', 'two', 'three', 'four'])
In [4]: data
Out[4]: one two three fourOhio 0 1 2 3
Colorado 4 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
我们使用np.arange(16)
创建一个从 0 到 15 的元素数组,并使用reshape(4, 4)
使其成为一个 4x4 的矩阵。只是一组虚拟数据。
布尔比较
In [6]: data > 5Out[6]: one two three fourOhio False False False False
Colorado False False True True
Utah True True True True
New York True True True True
代替
我们提供了一个查询函数data < 5
和一个替换操作= -1
来用-1 替换小于 5 的值。
In [7]: data[data < 5] = -1
In [8]: data
Out[8]: one two three four
Ohio -1 -1 -1 -1
Colorado -1 5 6 7
Utah 8 9 10 11
New York 12 13 14 15
真实场景中的应用
熊猫的一个直接应用是处理缺失值。大多数时候我们进行数据挖掘得到的数据并不是干净纯粹的数据。它们包含不一致数字的缺失数字。因此,我们需要把它们过滤掉,或者用一个替代的数字来代替。
过滤掉丢失的值
创建带有缺失值(NaN 值或非数字值)的样本数组。
In [9]: a = np.array([1,2,3,np.nan,4])
In [10]: a
Out[10]: array([ 1., 2., 3., nan, 4.])
In [11]: df = DataFrame(a)
In [12]: df
Out[12]: 00 1.0
1 2.0
2 3.0
3 NaN
4 4.0
一旦我们有了缺失值/nan 的数据框,我们可以使用以下方式填充它们。这里我用-1 填充它。
In [13]: df.fillna(-1)
Out[13]: 00 1.0
1 2.0
2 3.0
3 -1.0
4 4.0
我们可以在不同的柱子上使用不同的填充物。例如,第一列为 0.5,第三列为-1。注意:列编号从 0 开始。
df.fillna({1: 0.5, 3: -1})
可以用更聪明的方式比如填充使用 mean,其中 也许 在某些情况下更有意义。
data = Series([1., NA, 3.5, NA, 7])
data.fillna(data.mean())
这是对熊猫及其常用功能的简单介绍。随着我们继续前进,我们会发现更多。感谢阅读。
娱乐和盈利的数据挖掘朋友*
原文:https://towardsdatascience.com/data-mining-friends-for-fun-profit-a08508674b27?source=collection_archive---------2-----------------------
Python 网页抓取、NLP(情感分析)、IBM Watson API & Max/MSP 音频编程
- 形象地说
最近我又一次被说服去做一些音乐/艺术方面的事情,这一次是在一个好朋友的磁带发行 &生日庆祝会上。我又一次利用这个机会做了些无聊的电脑工作。
下面是 python 代码和输出示例,我使用它们来收集公共(ish)数据,执行基本的 NLP /情感分析,并将结果输出馈送到 IBM Watson 以返回 600 个合成语音文件,然后我通过一个定制的 Max 程序处理和操作这些文件。一些代号被更改以保护无辜者😬).
用 Python 刮网,硒&美汤
(注:本节内容是欠 本 Udemy 课程 我几个月前闲着没事完成的)
作为对上述朋友生日的一种敬意,我想我应该挖掘一些他们的公共网络活动&然后… 用它做些事情。
首先,我启动了以下 python 库:
- 硒
- 假冒用户代理
- 美汤
为了避免被起诉而被遗忘,代码示例使用了一个假设的社交网络,姑且称之为……faceplace.com。(任何与真实的社交网络巨擘的相似之处,无论是活着的还是死去的,纯属巧合。让我们假设真实的 faceplace.com 不是……不管它实际上是什么。
一些调查显示,由于其流线型的布局,append face place . com 的移动网站(faceplace.com)是最容易抓取的。此外,给定年份的所有帖子都可以通过 url 结构https://m.faceplace.com/daniels_friend/year/2017/
隔离。
但是最初只加载了有限数量的帖子,然后当用户滚动到当前页面的底部时,更多的帖子就会显示出来。由于这个原因(一些讨厌的登录要求),我们不能简单地抓取页面源代码。相反,我们必须在收集页面代码之前模拟浏览器和用户动作。我不会详细解释这些步骤,但是前面提到的 Udemy 课程会详细解释。
它最终看起来像这样:
…这会给你一堆无意义的标记,开头是:
在这些混乱中的某个地方会有这样的东西:
正如你可能注意到的,唯一感兴趣的人类语言发生在<p></p>
标签之间,所以我想只提取那些位,丢弃其余的&继续我的生活。美丽的汤让这变得微不足道,&被称为正则表达式的神秘魔法允许我们移除封闭标签&任何(大部分)剩余的 html:
this left some stray html & long hashes in the data for some reason, but was adequate for my weird purposes so I didn’t attempt to improve
然后,我收到了一组来自我朋友时间线的纯文本帖子。
是时候做些事情了。
使用文本块进行自然语言处理/情感分析
几个知名的库为自然语言处理提供 pythonic 工具,功能多样,易于使用。我使用 TextBlob 是因为它的开箱即用特性集非常全面,非常适合我的快速原型需求(阅读:到处乱搞)。
在将一些文本分配给一个TextBlob()
对象后,对.sentiment
属性的简单调用返回两个值:
polarity
-浮动 x 使得 -1 ≤ x ≤ 1 ,表示积极或消极情绪subjectivity
——一个浮点数 y 使得 0 ≤ y ≤ 1 ,表示主观程度— 0 最客观&1 最主观
示例:
好吧,当然,足够近了。
现在,我可以将每个纯文本帖子输入到函数中&返回两个算法确定的浮点数。
然后呢?
IBM Watson 开发者云文本到语音合成
我知道我想最终以某种方式对我的数据采集进行声音处理。与其只是将自然语言翻译成数字用于算法组合,我想我应该直接对语言进行发音,在这个过程中使用任何定量推导作为调制参数。显而易见的解决方案是文本到语音引擎(TTS)。
经过一番探索,我选定了 IBM Watson 开发人员云 TTS 引擎,因为每月的前一百万个字符是免费的,它接受几个参数来以各种方式调制声音。我必须创建一个 IBM Bluemix 账户(免费 30 天),这很简单,然后搜罗他们的实质性文档来了解我的方位。
我不会在这里重复这些文档,但长话短说:该服务提供了几种不同的基本语音模型,其中一些接受额外的语音合成标记语言 (SSML)参数来转换&影响语音的表现力。这在他们的互动演示中得到了很好的展示。我选择了通用的沃森声音(来自 Jeopardy ),因为它允许最大的“转变”。
我编写了一个小循环来遍历帖子列表,检索 TextBlob 情感分析分数,然后将它们输入 Watson TTS api:
如上面的代码所示,有几个 SSML 变换参数(我用polarity
& subjectivity
情感分析分数的各种组合填充了这些参数):
breathiness
pitch
pitch range
rate
glottal tension
timbre
相关文件见此处。
下面是一个输出文件示例:
在遍历了我的数据集中的所有文本帖子后,我最终得到了大约 600 个这样的帖子——每一个都是我朋友的独特表达,每一个都通过几个算法过程进行了独特的合成和调制。
很好。
现在让它们发挥作用。
Max/MSP 中的随机回放和实时音频处理
我打算在这篇文章的所有部分都留在 Python 环境中,但是没有任何一个的几个包&接近从 Python 控制台进行音频回放&操作。所以表演/作曲部分我把退进 Max 。
我改编了 Abby Aresty 的这些 教程视频的大部分内容。我不太明白她为什么做一些事情,所以我也做了一些自由处理,&然后用一些参数来修饰它,以操纵音频播放:
我基本上创建了三个频道/播放列表,每个都连续播放从各自的播放列表中随机选择的文件&通过相同的信号处理链传递它们。我希望通过一些随机过程来编程控制这些参数,但没有时间编程,所以最终只能手动实时操纵信号。还有一些单独的文件(沿着右边界),我希望能够在调用时触发和循环。
我不会在这里花时间详细解释补丁;在上面链接的教程和[sfplay~](https://docs.cycling74.com/max7/maxobject/sfplay~)
(回放对象)& [comb~](https://docs.cycling74.com/max7/maxobject/comb~)
(梳状滤波器对象)Max 参考文档之间,没有太多其他的了。我把它上传到了 github repo 上,还有上面剩下的代码片段,供感兴趣的人参考。
有点不幸的是,在实际演出中,当我完成了计划持续时间的 3/4 时,马克斯崩溃了。但我很高兴事情发展到这一步,寿星和我们其他古怪的朋友似乎也很喜欢。我们还策划了一些模糊的计划,为可能的磁带发行重新审视素材和算法过程。敬请关注。
与此同时,这是表演中流产的部分:
—
在推特上关注:@ dnlmcLinkedIn:【linkedin.com/in/dnlmc】T4Github:https://github.com/dnlmc
数据挖掘简介
原文:https://towardsdatascience.com/data-mining-in-brief-26483437f178?source=collection_archive---------0-----------------------
数据挖掘是当今非常热门的话题。与几年前不同,现在一切都与数据绑定,我们有能力很好地处理这些类型的大数据。
通过收集和检查这些数据,人们能够发现一些模式。即使整个数据集是一个垃圾,也有一些隐藏的模式可以通过组合多个数据源来提取,以提供有价值的见解。这被称为数据挖掘。
数据挖掘通常与各种数据源相结合,包括受组织保护且存在隐私问题的企业数据,有时还会集成多个数据源,包括第三方数据、客户人口统计数据和财务数据等。这里可用的数据量是一个关键因素。因为我们要发现顺序或非顺序数据中的模式、相关性,以确定获得的数据量是否是高质量的,以及可用的数据是否是好的。
先说个例子。假设我们获得了一些与 web 应用程序的登录日志相关的数据。整体来看,这组数据没有任何价值。它可能包含用户的用户名、登录时间戳、注销时间、已完成的活动等。
如果我们纵观全局,这是一个整体混乱。但是我们可以通过分析来提取一些有用的信息。
例如,该数据可用于找出特定用户的常规习惯。此外,这将有助于找出系统的高峰时间。该提取的信息可用于提高系统的效率,并使用户更加友好。
然而,数据挖掘并不是一项简单的任务。这需要一定的时间,也需要特殊的程序。
数据挖掘步骤
数据挖掘的基本步骤如下
- 数据收集
- 数据清理
- 数据分析
- 解读
Basic data mining steps
- 数据收集— 第一步是收集一些数据。尽可能多的信息有助于以后的分析。我们必须确保数据的来源是可靠的。
- 数据清理— 由于我们正在获取大量数据,我们需要确保我们只有必要的数据,并删除不需要的数据。否则,它们可能会让我们得出错误的结论。
- 数据分析 —顾名思义,分析和发现模式就是在这里完成的
- 解释— 最后,对分析的数据进行解释,以得出预测等重要结论
数据挖掘模型
有不同种类的模型与数据挖掘相关联
- 描述性建模
- 预测建模
- 规范建模
在描述性建模中,它检测收集到的数据之间的相似性及其背后的原因。这对于从数据集构建最终结论非常重要。
预测建模用于分析过去的数据,预测未来的行为。过去的数据对未来给出了某种暗示。
随着 web 的飞速发展,文本挖掘作为一个相关学科加入到数据挖掘中。需要适当地处理、过滤和分析数据,以创建这样的预测模型。
数据挖掘的应用
http://slideplayer.com/6218639/20/images/21/Data+Mining+Applications.jpg
数据挖掘在许多方面都很有用。对于营销来说,可以有效应用。使用数据挖掘,我们可以分析客户的行为,我们可以通过更接近他们来做广告。
它将有助于识别市场中顾客对商品的趋势,并允许零售商了解购买者的购买行为。
在教育领域,我们可以识别学生的学习行为,学习机构可以相应地升级他们的模块和课程。
我们也可以使用数据挖掘来解决自然灾害。如果我们能收集一些信息,我们可以用它们来预测滑坡、降雨、海啸等。
如今,数据挖掘有了更多的应用。它们可以从非常简单的事情,如营销,到非常复杂的领域,如环境灾难预测等。
特殊备注
- 当特定问题有可能得到完整、准确的解决方案时,不应使用数据挖掘。当这种解决方案不可行时,我们可以使用具有大量数据的数据挖掘技术来将问题表征为输入-输出关系。
- 需要分析问题性质来确定是分类(离散输出 Ex:真或假)还是估计(连续输出Ex:0,1 之间的实数)问题。
- 输入应该有足够的信息来产生准确的输出。否则会导致不可避免的减少。
- 应该有足够的数据做出准确的结果。需要根据输入数据选择合适的算法。一些算法需要大量的数据来达到良好的精度,而另一些算法则可以快速达到。
Algorithm Comparison
感谢阅读…
干杯!
数据挖掘——注意差距
原文:https://towardsdatascience.com/data-mining-mind-the-gaps-4086e0e2fe2a?source=collection_archive---------10-----------------------
当评估您希望挖掘用于机器学习或数据分析的大量数据时,您经常会看到大量显式数据点,因此似乎很难看出您需要添加更多数据。但往往最重要的数据不是点而是点与点之间的关系。
如果我们把显式数据看作节点,那么隐式数据就变成了节点之间的连接和关系。一个简单的例子可能是一组坐标,大小,大气组成,以及更多关于我们太阳系中的物体。这组事实可能看起来很重要,也很全面,但是直观地展示它们会暴露出主要的差距。
Solar System as Nodes (Image courtesy of NASA per https://gpm.nasa.gov/image-use-policy)
虽然事实都是真实的,但最重要的事实可能是对象之间的关系。行星围绕太阳旋转,这可能会被你的快照所猜测,但不会被显示出来。冥王星可能是一颗路过的彗星。这些行星可能会撞向中心。我们不知道。
Solar System as Nodes and Connections (Image courtesy of NASA per https://gpm.nasa.gov/image-use-policy)
虽然还有更多的东西可以展示,但这张修改后的太阳系视图增加了天体之间的重要关系,即它们围绕中心太阳的轨道旋转。
在你的数据挖掘中,中心联系和关系可能不像围绕太阳运行的行星那样明显。时间可能已经过去,机构记忆也随之消逝。有些联系并不在数据本身的范围内,但需要扩展您的视野,以了解收集数据的公司(例如,2014 年的一次合并可能从根本上改变了销售的产品组合,因此合并前的数据应与合并后的数据分开处理)。
数据挖掘不仅仅是挖掘。它也是关于理解和欣赏你的数据的背景。两个独立的数据库最好被看作是相关的,而另外两个应该被看作是独立的。这些差距必须得到尊重。
实际上,定义数据的存储桶并询问存储桶之间的关系通常是很好的。谁创建了每个桶中的数据,他们如何与其他桶的创建者交互?
另一个重要的练习是询问在你的数据挖掘中需要回答什么样的问题。试着从实际问题后退一步,进入类型,尽管你可能需要头脑风暴一些具体的问题来帮助人们前进。
然后从问题中退一步,问一下遗漏了什么,假设了什么?列出假设,不管有多基本。然后,问一个机构知识为零的人会不会从数据中知道那些假设。如果没有,你已经找到了你的差距。找出如何填充或完成数据,使假设成为事实,你的数据挖掘将更加有用,不太可能掩盖重要的理解。
数据管理,透视图
原文:https://towardsdatascience.com/data-munging-a-perspective-view-783b4a3bee58?source=collection_archive---------3-----------------------
如何处理,缺失值,重复值,离群值等等很多只是用 Python 和 Azure ML
我记得我的媒体帐号后,我想写一篇文章,但我没有任何虚构的内容。这是我的技术故事。抱歉,如果它没有感动你。我正在使用 Azure Machine learning learning studio,并将对数据进行一些预处理。所以,这个故事通常会带你走过这条小径,抓紧了。
Joining data [Left Outer Join]
两个数据集被获取并使用一个键连接。
记住:这个键(列)应该出现在两个数据集中
你不必处理每一个数据,排除你不需要的列。
‘额外加工就是赔钱’
当我们看到柱面数量列时,数据的分布有点倾斜。所以我们可以对它进行分类。
就像这样
编辑元数据:它包括选择“缸数”并转换成分类数据
这里,制造了 4 组,4 个或更少组,5 个和 6 个,8 个和 12 个
缺失数据,哦…..!!
我现在该怎么办?
你也可以有其他清洁模式,但我们在这里选择'删除整行'
重复行也是如此
价格是成比例的
低价车比中价或高价车多得多
这是一种根据汽车的特点来预测其价格的方法
,但是价格分布的偏斜性质会使这种预测
变得困难。将更平衡的对数分布价格值拟合到
预测模型可能更容易。
这就是你怎么做的
您可以添加许多其他数学运算
所以这里有两列
价格和 ln(价格)
是的,很明显你可以把 1 扔出去。
你可以比较一下它的其他价值
在这里我比较一下价格,你猜怎么着?
对数图
这是 ln(价格)和城市英里数之间的图表
哪个比价格更平
这是价格和城市英里数之间的图表
对数运算减少了价格和城市-mpg 图中“异常值”的初始假设
人们可以使用其他变换
发现和可视化异常值
我们将根据重量、发动机尺寸和城市英里数来直观显示价格,并确定异常值
用 Python 可视化离群值
## Define plot columns
plot_cols = [“weight”, “enginesize”, “citympg”]
auto_scatter_simple(df,plot_cols)
return df
输出如下图所示
这个图类似于上面的图,
上面的 Python 代码只是迭代列的值,我们通过函数的参数,然后我们用 lnprice 绘制散点图。
当经过 3 列时,会生成 3 个散点图。
到目前为止,我们已经检查了数据中的关系,并确定了一些潜在的
异常值。
我们现在需要验证异常值是使用提到的阈值确认的,该阈值实际上是过滤异常值。
##Python code for detecting Outliersdef id_outlier(df):
## Create a vector of 0 of length equal to the number of rows
temp = [0] * df.shape[0]
## test each outlier condition and mark with a 1 as required
for i, x in enumerate(df['enginesize']):
if (x > 190): temp[i] = 1
for i, x in enumerate(df['weight']):
if (x > 3500): temp[i] = 1
for i, x in enumerate(df['citympg']):
if (x > 40): temp[i] = 1
df['outlier'] = temp # append a column to the data frame
return dfdef auto_scatter_outlier(df, plot_cols):
import matplotlib.pyplot as plt
outlier = [0,0,1,1] # Vector of outlier indicators
fuel = ['gas','diesel','gas','diesel'] # vector of fuel types
color = ['DarkBlue','DarkBlue','Red','Red'] # vector of color choices for plot
marker = ['x','o','o','x'] # vector of shape choices for plot
for col in plot_cols: # loop over the columns
fig = plt.figure(figsize=(6, 6))
ax = fig.gca()
## Loop over the zip of the four vectors an subset the data and
## create the plot using the aesthetics provided
for o, f, c, m in zip(outlier, fuel, color, marker):
temp = df.ix[(df['outlier'] == o) & (df['fueltype'] == f)]
if temp.shape[0] > 0:
temp.plot(kind = 'scatter', x = col, y = 'lnprice' ,
ax = ax, color = c, marker = m)
ax.set_title('Scatter plot of lnprice vs. ' + col)
fig.savefig('scatter_' + col + '.png')
return plot_colsdef azureml_main(df):
import matplotlib
matplotlib.use('agg')
## Define the plot columns
plot_cols = ["weight",
"enginesize",
"citympg"]
df = id_outlier(df) # mark outliers
auto_scatter_outlier(df, plot_cols) # create plots
df = df[df.outlier == 1] # filter for outliers
return df
那么我们用代码做什么呢?
检查这段代码,注意 auto_scatter_outlier 函数绘制 col 与 lnprice 的关系,点颜色由 outlier 决定,形状由 fueltype 决定。id_outlier 函数使用 Python 列表理解中的嵌套 ifelse 语句来标记离群值。使用熊猫过滤器提取异常值。
结果是:
如果你到现在还在这里,那么你很棒,你需要成为一名数据科学家。如果你只是向下滚动到这里,看看上面,一些很酷的东西已经完成了。
谢谢
人工智能创业的数据网络效应
原文:https://towardsdatascience.com/data-network-effects-for-an-artificial-intelligence-startup-7f6fab10ba85?source=collection_archive---------8-----------------------
将注意力从产品和数据收集转移到网络和数据共享
Photo by NASA on Unsplash
人工智能(AI)生态系统成熟,仅仅通过附加一个标签来打动客户、投资者和潜在收购者变得越来越困难。无论你在做什么。因此,从长远来看,建立一个可防御的商业模式的重要性变得显而易见。
在这篇文章中,我探索了一个人工智能初创公司如何解锁各种数据网络效应。我解释了为什么为了改进你的模型/产品,超越数据网络效应的传统定义作为一种从客户那里收集数据的方式是重要的。
数据网络效应——用它来收集更多的数据有什么错?
围绕人工智能业务建立护城河的一个被广泛引用的方法是数据网络效应,将定义为“……由于数据片段之间的紧急关系,产品的属性随着可用数据的增加而改善”。数据网络效应是一种更广泛的网络效应现象的特殊表现,当“……任何用户对产品的更多使用增加了产品对其他用户(有时是所有用户)的价值”时,就可以看到这种现象。数据网络效应与通过从用户处收集的数据来改进产品等相关联。
鉴于数据对任何人工智能初创公司的重要性,数据网络效应被视为相关的护城河也就不足为奇了。训练一个模型所需的数据很难得到,如果有偏差,你就有麻烦。因此,试图收集尽可能多的数据,并在此基础上改进产品,似乎是一个非常好的主意。在某种程度上的确如此。 然而,不应高估仅围绕数据收集和产品改进构建的数据网络效应的力量,应探索创造数据网络效应的替代方法。 为了开始区分各种类型的数据网络效应,我们先把上面描述的一种贴上数据收集网络效应的标签。
为什么拥有数据收集网络效应可能还不足以取得成功?除此之外,这是因为产品使用和产生的有用新数据之间的不对称关系。例如,只有一小部分用户在 Yelp 上写评论,也就是说,对 Yelp 的数据收集网络效果有贡献。
有时数据收集网络效应是渐近,这意味着 Yelp 上的第 5 次评论比第 30 次评论更有价值。在某个时候,新数据的价值会下降,要么是直接对用户而言(人们很难阅读关于一家咖啡馆的 50 篇评论),要么是对产品/模型开发而言(有时更好的效果来自于增加模型的复杂性,而不是注入更多的数据)。
数据收集网络效应的其他挑战与数据可用性有关。首先,数据可能被窃取/复制。其次,它的可用性越来越大。对于例,2017 年新增了 8 个公共物体检测识别数据集,而 2016 年只有 4 个。此外,还有合成数据,帮助初创公司甚至与数据丰富的巨头竞争。处理/标记数据的数据和工具的更广泛可用性使数据收集网络效应不那么有吸引力,因为它用更少的时间来破坏拥有标记数据集的人的先发优势。
尽管如此,我并不是说数据收集不是人工智能初创公司应该掌握的东西,因为专有数据仍然是一个护城河。这也是一种保险政策,帮助初创公司保持对投资者/收购者的吸引力,即使一切都不顺利。
需要强调的是,数据收集网络效应很难对所有的 AI 业务都起到很好的作用 。例如,它非常适合像 Waze 这样的人,每个用户都实时贡献有价值的数据(没有不对称性和渐进性)(如果 Waze 的数据被复制/公开,危害会更小)。但是其他类型的企业应该考虑其他类型的数据网络效应。
更广泛地了解数据网络效应——与您的网络共享更多数据
新型的数据网络效应可能来自于围绕人工智能初创公司建立更广泛的客户和合作伙伴网络,以及这些网络内的数据共享 。众所周知,有时‘……提供大部分价值的是网络,而不是应用或网站本身——这解释了为什么像易贝和 Craigslist 这样的市场产品可以在 16 年后看起来基本没有变化。
人们可能会发现大量关于数据收集网络效应(被称为“数据网络效应”,或“数据飞轮”)的文献,例如这里的、这里的、这里的、这里的和这里的。然而,网络效应在数据收集和直接用于改进模型/产品之外的应用似乎没有得到很好的涵盖。
一些作者提出了数据共享的想法 ,但没有涉及操作细节。例如,Gil Dibner 提出了网络智能系统的概念,该概念适用于“供应链中的各方”,并且“通过在客户之间共享智能来创造增值”,因此数据不仅是为了改进模型而聚合,而是在整个供应链中共享。开放数据研究所(ODI)及其五种商业模式的 框架 也在探索数据共享的思路,根据数据和算法开放程度 进行区分。例如,Nik Bostrom 在的中介绍了数据共享在人工智能生态系统发展中的基本作用。
如何建立网络?
受到上面引用的文献的启发, 人们需要从将人工智能初创公司仅视为一种产品(通过从客户/用户收集的数据来改进)转变为将它视为一个网络 ,它点燃/管理各种类型的参与者之间的各种类型的数据交换。下面,基于网络效应的文献和对各种人工智能创业公司背后的商业模式的分析,我探索如何围绕人工智能创业公司建立数据网络,以及在那里推出什么样的交易所。
人工智能创业公司网络的参与者大致可以分为两类:
1.客户/用户,直接受益于产品并产生支撑产品的数据的人;
2.通过各自的价值链/供应链与创业公司的客户互动的实体。这些实体也可以从人工智能初创公司客户产生的数据中受益。例如,如果一家人工智能初创公司为农民开发了一种自动化解决方案,那么那些制造化肥和购买农民产品的人可能会被视为其网络的参与者。
因此,一个 AI 创业公司可能会使用两个方向来构建数据网络效果,即 :
- 横向 ,通过帮助客户相互交流,创造直接网络效应,“…当一个额外的参与者使同类的其他参与者受益时”;
2.,通过将客户与其价值链/供应链的其他要素联系起来并创造间接网络效应,“…当一种类型的额外参与者增加另一种类型的参与者获得的价值时”。
三种数据交换
当理解了数据交换的方向后,问题就来了,这些交换是什么。通过探索我们投资组合内外的数百家人工智能初创公司,我可以根据它们的目的 : 重点介绍 三种类型的数据交换
1.获得洞察力;
2.支持交易。
3.整合流程。
通常以间接的方式,通过网络分享见解是数据交换的一种方式 这种方式基于从人工智能初创公司的客户那里收集的数据,并为他们各自使用的产品增加价值。
例如,移动应用营销公司 Localytics 使用机器学习来帮助客户“从被动收集应用内活动数据转向识别提高转化率的关键行为”。它还提供统计摘要和行业基准,在某种程度上帮助客户从市场中学习。Localytics 利用了直接的网络效应,因为随着越来越多的客户使用其核心产品,他们每个人都可以更好地了解更广阔的市场和竞争格局。
此外,人工智能初创公司不仅可以使用从客户那里获得的数据来改进核心产品,还可以让客户与价值链的其他参与者进行更好的交易。
例如,软件公司 Connecterra 收集并分析来自奶牛场的数据,以帮助农民。同时,它也为兽医和饲料公司打开了一个平台,他们认为这是一个与农民更好互动的平台。他们可以通过应用程序看到农场发生的事情。如果需要,兽医也可以收到警报。在没有成为兽医市场的情况下,Connecterra 通过发送预先通知来帮助价值链的两个要素(农民和兽医)进行交易。Connecterra 利用了间接的数据网络效应,因为兽医从平台上更多的农民中受益。
通常,价值链的各个要素之间需要一定程度的整合。因此, 一个 AI 创业公司可能不仅仅是直接服务于其中一个元素,而是通过数据交换可以提高这个元素与其他 的整合。
例如,TraceAair 使用无人机图像不仅帮助建筑承包商通过减少两次移动泥土来降低成本,还与土地开发商分享工地进度,使他们能够“掌握工地平衡,按时完成项目并节省应急预算”。在这种情况下,土地开发商受益于更多的承包商加入该平台,而 TraceAir 利用了间接的数据网络效应。
构建人工智能产品以改善整个价值链整合的另一个例子是 Cotrtex Health,它可以学习趋势并预测患者的负面结果,然后提醒适当的医疗保健提供商采取特定行动。Cortex 网络是围绕“…在整个护理过程中,通过与所有负责任的医疗保健提供者共享患者状态的可见性,可以改善患者结果的理念”而建立的。请注意,这种集成远远超出了为事务目的共享数据。
水平和/或垂直应用的三种类型的数据交换为 AI 初创公司提供了数据网络效应 的六个新机会(参见下面的数据网络效应矩阵)。这些新的数据网络效应的基础是通过直接/间接在网络上共享数据来使数据变得有用的能力,而更广为人知的数据网络效应(数据收集网络效应)主要基于数据的稀缺性和与收集数据相关的挑战。这些新的数据网络效应与平台的概念和的理念非常吻合,即在 21 世纪……供应链不再是商业价值的中心聚合器。一家公司拥有什么比它能连接什么更重要。
随着人工智能生态系统的成熟和数据可用性的增加,人工智能初创公司越来越有动力将自己转变为服务于复杂网络的平台,这些网络在多个价值/供应链内和跨多个价值/供应链蔓延。
非常感谢 尤里·布罗夫 和 瓦列里·科米萨洛夫 审阅本帖的早期草稿。感谢 马特·图尔克 , 吉尔·迪布纳 , 布拉德福德·克罗斯 ,NFX,以及其他帮助我写出这篇文章的人。**
披露:文中提到的 TraceAir 和connecter ra,都是*Sistema _ VC的投资组合公司,彼得是该基金的风险合伙人。*
数据网络效果矩阵
修正 & 放大
*在本帖的最初版本中,r4 Technologies 被用来举例说明洞察驱动的数据网络效应。因为这个例子不完全正确,所以在这个版本中使用了另一个例子。
好莱坞还有女人问题吗?
原文:https://towardsdatascience.com/data-on-gender-representation-in-film-ee5f15735fdd?source=collection_archive---------22-----------------------
电影中的性别表现数据
来自维基百科的好莱坞数据
维基百科是电影数据的宝库。不幸的是,这很难大规模实现。幸运的是,python wptools 库允许我们获取所有这些有趣的维基百科信息框。
我写了一些脚本来收集和清理 2000 年至 2018 年好莱坞电影的所有维基百科数据。然后,我使用 python“ntlk”男性和女性姓名语料库,按性别对所有演员、制片人和导演进行分类。当然,这个过程中存在一些误差。电影中的许多人不在这些名单中(如“雷德利”斯科特)。此外,一些男女通用的名字如“Leslie”会导致分类错误。我花了很多时间尽可能地手工清理东西。我设法得到的数据表明,不到 10%的好莱坞演员/作家/制片人不能被归类为男性或女性。
通过对 90%的数据进行分类和修正,很容易就能了解好莱坞电影中性别表现的状况。正如你在下面看到的,这个行业还有很多工作要做。
2018 年的不平等
下表显示了 2018 年参与制作好莱坞电影的男女比例。在所有情况下(演员、导演、制片人、编剧和音乐),男性都远远多于女性。
即使我们慷慨地假设大部分未分类的名字都是女性,这种不平等仍然是明显的。
下面我绘制了 2018 年好莱坞电影中表现最佳的演员的条形图,以及所有演员的整体性别代表。从蓝色的海洋来看,很明显女性的代表性远远不足。这一点在编剧、导演、配乐领域尤为明显。
演员
董事
生产者
作家
音乐
趋势
回顾 2000 年的数据,可以看出女性在电影中的惨淡表现是否有所好转。下面我画出了电影中女性比例的趋势。
演员
董事
生产者
作家
音乐家
虽然女性在表演、导演、制作和写作方面的代表性正在缓慢提高,但在女性为电影评分方面似乎没有进展。
结论
从以上数据可以明显看出,好莱坞的性别代表性仍然是一个主要问题。我个人认为,这一事实是美国国内票房收入增长乏力的部分原因。不到 15%的电影由女性编剧或导演。当这些电影不能代表一半的观众时,它们不赚钱有什么奇怪的吗?
笔记
本项目使用的所有代码和数据都可以在 https://github.com/taubergm/HollywoodGenderData[的 github 上获得](https://github.com/taubergm/HollywoodGenderData)
1—https://pypi.org/project/wptools/
2—【http://www.nltk.org/howto/corpus.html
3—【https://www.boxofficemojo.com/yearly/
有关这一趋势的其他确认,请参见:—https://www . the guardian . com/film/2018/Jan/04/Hollywood-diversity-sees-no-improvement-in-2017-report-finds
面向高数据可用性的数据管道工程
原文:https://towardsdatascience.com/data-pipeline-engineering-towards-high-data-availability-ff64ecbab4f6?source=collection_archive---------10-----------------------
从数据中提取见解并做出预测是我的主要目标,然而,在我从数据中获取价值之前,我首先需要从数据仓库中获取数据。通常我需要的数据并不容易获得,也没有工程师有资源来支持我,因此我沉浸在数据仓库的荒野中来建立我自己的数据管道,这也被称为 ETL(提取、转换和加载)。
真正的数据科学工作很难在必要的数据可用之前开始,因此建立数据管道以有效地提供可供分析的数据具有重要意义。根据我在工作中构建和使用数据管道的经验,我看到了支撑管道效率的三个要素,它们随后创建了一个高数据可用性的环境。
1.由分析单元定义的数据管道
有一天,我收到一个紧急数据请求。在听到请求细节之前,我不确定这种紧迫性是否会暂停我的其他项目。在我了解到这一需求后,我知道现有的数据管道可以满足大部分需求。我所需要的只是找到一些额外的数据元素。果然,我很快解决了这个请求。这一经历是好的数据管道带给我的众多好处之一。一个好的数据管道可能会在我的新项目到达时完成 80%,让我专注于剩下的 20%。既节省时间又让人安心(当然这里的 80%和 20%只是想象中的尺度)。
运气并不总是在身边。在一个项目中,我不得不构建一个很长的数据管道,通过从多个来源提取大量原始数据,将业务运营的全局但详细的视图放在一起。这个项目花了我很长时间才完成。即使完工,这条管道的一次通过也需要 20 多个小时。通常,我会启动管道,并在第二天收集结果。后来,我发现我们的数据工程团队已经建立了一个类似的数据管道。我决定利用他们的来缩短我的。现在,我的管道只需不到 6 个小时。在一个管道上铺设另一个管道对我来说非常有效。除了节省时间之外,还节省了大量的计算、存储和维护。
数据管道显然会带来价值。那么,如何打造有价值的数据管道呢?我认为,当管道将独立的信息汇集在一起,创建一个高度感兴趣的分析单元的丰富图片时,它往往是有价值的。例如,在信用卡支付业务中,交易是一个非常有趣的分析单元,因此一个好的数据管道是创建每个交易的端到端生命周期图的管道。使用这个管道,用户可以很容易地找到想要的细节,无论他们对交易授权还是交易争议感兴趣。在医疗保健中,患者是一个高度感兴趣的分析单位,因此一个良好的数据管道是一个包含每个患者的整个医疗保健旅程的管道,包括诊断、治疗、保险范围和再入院。人们以后可以很容易地放大到整个医疗保健过程中的一个特定部分。考虑到原始数据是如此孤立、混乱和庞大,这种方法减轻了数据科学家的负担,并使数据更容易用于分析和建模。
2.晚上睡觉时在管道中处理数据
当我的数据管道持续很多小时时,我遇到了“意大利面条”式的管理挑战。我无法断开我的笔记本电脑与互联网的连接,我运行的管道分散了我对其他工作的注意力,我忘记了我已经完成了哪些步骤。因此,我想让我的管道在服务器集群中运行,这样我就可以忘记它们,让我的笔记本电脑离线回家。Apache Oozie 是我发现的帮助我在 Hadoop 集群中管理管道的工具。
Oozie 采用了我的脚本和工作流设计,然后根据集群中的工作流执行我的脚本。Oozie 是 Apache 开源工具,详情请访问http://oozie.apache.org/。后来,我想安排我完成的管道,向我的管道添加通知并参数化我的管道,Oozie 也能够帮助满足这些需求。Oozie 几乎成了我的生产基地。使用 Oozie 让我相信,工作流管理工具(现成的或内部构建的)是数据工程师和数据科学家的必备工具,尤其是在大型项目中。除了 Oozie 之外,Airflow 是另一个非常流行的工作流管理工具,在许多公司中经常使用。
我的数据管道是 Hive、Impala、Python 和 Spark 的混合体。大多数是在蜂巢和黑斑羚。Oozie 能够促进所有这些批处理,并根据工作流规范运行它们。日志和错误会自动保存,并可用于调试和跟踪目的。当数据管道得到管理时,我可以更快、更容易地获得数据。我可以“一边睡觉一边啃大数据”。
3.挤压管道的一百种方法
数据管道工作似乎有一个缓慢的时钟。根据我的经验,一遍数据管道需要几个小时(数据大小以 TBs 为单位)。为了从数小时的流水线工作中挤出额外的效率,我们必须使用许多优化技术。在我的 Hive、Impala 和 Spark 管道中,我使用了一系列个人最喜欢的优化技巧,尽管可能有上百种技巧。
首先,我使用试错法来确定查询复杂性中的最佳点。复杂的查询对分布式文件系统来说是一个挑战,因此我试图避免不必要的复杂性。然而,将复杂的查询分解成较小的查询可能会导致太多的小步骤。通过反复试验,我可以找到一个既快速又易于维护的最佳点。第二,我努力更新元数据统计数据,并选择正确的连接来最小化文件移动。例如,由于系统内部工作方式的不同,当涉及到连接表排序时,我确保大表在 Hive 中排在后面,但是在 Impala 中最大的表排在前面。这样的安排让小桌子搬到大桌子,而不是相反。第三,我操纵设置来动态地将资源分配到需要的地方。在一个 Spark 步骤中,尽管集群中的内存和内核使用率较低,但我看到了缓慢的性能,我增加了该步骤的内存设置和内核设置,并很快完成了 Spark 任务。
好的优化技巧的列表非常长。当我需要额外的效率时,我会参考技术手册。这些技巧的使用还取决于集群环境和情况。一个单独的戏法在它能做的事情上是有限的,然而,将许多戏法结合在一起肯定会很有意义。
在学习环境中,我们被提供数据来建立模型和进行分析。在数据可用性的另一方面,我们必须自己搜索数据、获取数据和清理数据。我发现后一种情况更现实,因此我渴望磨练我的数据工程技能,并希望与感兴趣的读者分享我的数据管道经验。除了上面提到的技术性更强的因素,项目规划、进度文档等软性因素对数据管道的成功也有重要影响。我个人认为,每个数据科学家都部分是数据工程师,我们都应该不仅为创建模型对象而自豪,而且为创建数据管道而自豪。
数据管道、Luigi、气流:你需要知道的一切
原文:https://towardsdatascience.com/data-pipelines-luigi-airflow-everything-you-need-to-know-18dc741449b7?source=collection_archive---------1-----------------------
Photo by Gerrie van der Walt on Unsplash
这篇文章是基于我最近给同事们做的关于气流的演讲。
特别是,演讲的重点是:什么是气流,你可以用它做什么,它与 Luigi 有什么不同。
你为什么需要 WMS
在公司中,移动和转换数据是很常见的事情。
例如,您在 S3 的某个地方存储了大量日志,您希望定期获取这些数据,提取和聚合有意义的信息,然后将它们存储在分析数据库中(例如,Redshift)。
通常,这种任务首先是手动执行的,然后,随着规模的扩大,这个过程是自动化的,例如,用 cron 触发。最终,您会发现原来的 cron 已经无法保证稳定和健壮的性能。这已经远远不够了。
这时候你就需要一个工作流管理系统(WMS)。
气流
Airflow 是 Airbnb 在 2014 年开发的,后来开源了。2016 年,它加入了阿帕奇软件基金会的孵化计划。
当被问及“是什么让 WMS 的气流与众不同?”,Maxime Beauchemin(创造者或气流)回答:
一个关键的区别是气流管道被定义为代码,任务是动态实例化的。
希望在这篇文章结束时,你能够理解,更重要的是,同意(或不同意)这种说法。
我们先来定义一下主要概念。
工作流作为 Dag
在 Airflow 中,工作流被定义为具有方向依赖性的任务的集合,基本上是有向无环图(DAG)。图中的每个节点是一个任务,边定义了任务之间的依赖关系。
任务属于两类:
- 操作员:他们执行一些操作
- 传感器:它们检查进程或数据结构的状态
现实生活中的工作流可以从每个工作流只有一个任务(你不必总是很花哨)到非常复杂的 Dag,几乎不可能可视化。
主要组件
气流的主要组成部分有:
- 一个元数据库
- 一个调度器
- 一个执行者
Airflow architecture
元数据数据库存储任务和工作流的状态。调度器使用 DAGs 定义以及元数据数据库中的任务状态,并决定需要执行什么。
执行器是一个消息队列进程(通常是芹菜,它决定哪个工人将执行每个任务。
使用 Celery executor,可以管理任务的分布式执行。另一种方法是在同一台机器上运行调度器和执行器。在这种情况下,将使用多个进程来管理并行性。
气流也提供了一个非常强大的用户界面。用户能够监控 Dag 和任务的执行,并通过 web UI 与它们直接交互。
气流遵循*“设置好就忘了”*的方法是很常见的,但这意味着什么呢?
表示一旦设置了 DAG,调度器将自动调度它按照指定的调度间隔运行。
路易吉
理解气流最简单的方法大概就是把它比作 Luigi。
Luigi 是一个用于构建复杂管道的 python 包,由 Spotify 开发。
在 Luigi 中,与在 Airflow 中一样,您可以将工作流指定为任务以及它们之间的依赖关系。
Luigi 的两个积木是任务和目标。目标通常是任务输出的文件,任务执行计算并消耗其他任务生成的目标。
Luigi pipeline structure
你可以把它想象成一条真正的管道。一个任务完成它的工作并生成一个目标。结果,第二个任务接受目标文件作为输入,执行一些操作并输出第二个目标文件,依此类推。
Coffee break (Photo by rawpixel on Unsplash)
简单的工作流程
让我们看看如何实现由两个任务组成的简单管道。
第一个任务用一个单词生成一个. txt 文件(在本例中是“pipeline”),第二个任务读取该文件并添加“My”修饰该行。新的一行写在一个新的文件上。
Luigi simple pipeline
每个任务被指定为从luigi.Task
派生的类,方法output()
指定输出,因此目标,run()
指定任务执行的实际计算。
方法requires()
指定了任务之间的依赖关系。
从代码中,很容易看出一个任务的输入是另一个任务的输出,依此类推。
让我们看看如何在气流中做同样的事情。
Airflow simple DAG
首先,我们定义并初始化 DAG,然后向 DAG 添加两个操作符。
第一个是BashOperator
,它基本上可以运行所有的 bash 命令或脚本,第二个是执行 python 代码的PythonOperator
(为了演示,我在这里使用了两个不同的操作符)。
如你所见,没有输入和输出的概念。两个运营商之间没有信息共享。有很多方法可以在操作符之间共享信息(你基本上共享一个字符串),但是作为一个通用的规则:如果两个操作符需要共享信息,那么它们可能应该合并成一个。
更复杂的工作流程
现在让我们考虑一下我们想要同时处理更多文件的情况。
在 Luigi,我们可以用多种方式做到这一点,但没有一种是真正简单的。
Luigi a pipeline managing multiple files
在这种情况下,我们有两个任务,每个任务处理所有的文件。从属任务(t2
)必须等到t1
处理完所有文件。
我们使用一个空文件作为目标来标记每个任务完成的时间。
我们可以为循环增加一些并行化。
这种解决方案的问题是t1
开始产生输出后,t2
就可以开始逐渐处理文件,实际上t2
不必等到t1
创建完所有文件。
Luigi 中的一个常见模式是创建一个包装器任务并使用多个 workers。
这是代码。
Luigi a pipeline using multiple workers
要使用多个工作线程运行任务,我们可以在运行任务时指定— workers number_of_workers
。
现实生活中常见的一种方法是委托并行化。基本上,你使用第一种方法,例如在run()
函数中使用 Spark,来进行实际的处理。
让我们用气流来做
您还记得在最初的引用中,dag 是用代码动态实例化的吗?
但是这到底是什么意思呢?
这意味着借助气流,你可以做到这一点
Airflow a parallel DAG with multiple files
任务(和依赖项)可以以编程方式添加(例如,在 for 循环中)。相应的 DAG 如下所示。
Parallel DAG
此时,您不必担心并行化。气流执行器从 DAG 定义中知道,每个分支可以并行运行,这就是它所做的!
最终考虑
我们在这篇文章中谈到了很多点,我们谈到了工作流程、Luigi、气流以及它们之间的区别。
让我们快速回顾一下。
路易吉
- 它通常基于管道,任务输入和输出共享信息并连接在一起
- 基于目标的方法
- UI 是最小的,没有用户与正在运行的进程的交互
- 没有自己的触发
- Luigi 不支持分布式执行
气流
- 基于 DAGs 表示
- 一般来说,任务之间没有信息共享,我们希望尽可能地并行
- 没有功能强大的任务间通信机制
- 它有一个执行器,管理分布式执行(您需要设置它)
- 方法是“设置它,然后忘记它”,因为它有自己的调度程序
- 强大的用户界面,你可以看到执行和互动运行的任务。
结论:在本文中,我们了解了 Airflow 和 Luigi,以及这两者在工作流管理系统中的不同之处。我们看了一些非常简单的管道示例,以及它们如何使用这两种工具来实现。最后我们总结了 Luigi 和 Airflow 的主要区别。
如果您喜欢这篇文章,并且觉得它很有用,请随意👏或者分享。
干杯
数据污染——沉默的黑仔
原文:https://towardsdatascience.com/data-pollution-the-silent-killer-917fc33ef28?source=collection_archive---------1-----------------------
在过去的两天里,我在三个客户网站上工作——它们都表现出相似的概念问题。这个问题并不新,也不特别深奥——只是影响如此严重,让我担心。
这是我在过去 4 年里研究的将近 200 个谷歌分析配置的积累。一篇关于我从所有这些工作中学到的元水平的文章将是有用的——但我想提出的关键点之一是这一点。
我开始称之为数据污染,但在最简单的层面上,它是关于在你的计算或度量中没有测量意图或“可转换的”流量。这就是为什么“平均”网站指标在有数据污染的网站上更糟糕——因为它们默默地掩盖了数据是有偏差的。
让我们举一个最简单的例子:
假设您经营一家在线宠物用品店,您的开发团队使用与您的实时网站相同的分析标签。他们运行一个测试工具,检查网站在世界各地的直播,所以你得到所有这些访问到你的网站,他们不购买东西,但通过你的漏斗到最后。
你能想象这对你的漏斗数据会有什么影响吗?
让我们尝试一些其他的例子:
你经营着一家将工作外包到菲律宾的机构。当他们使用你网站外的网络界面时,你的团队通过你的主页登录,现在你主页超过 30%的流量来自菲律宾,直接从你的网站弹出(当他们登录管理系统时)。
你的竞争对手正在你的网站上使用机器人网络进行价格抓取。它们都显示为 Chrome 浏览器,但来自不同的 IP 地址——你的许多访问者统计数据都被抓取活动带来的大量和持续的流量注入所扭曲。
那么每个使用你网站的管理界面登录的人呢——有人让分析标签在上面运行。现在,你所有的内部员工流量都被发送到你的谷歌分析视图。
你有一堆域名或子域,但它们在谷歌分析上设置不正确——所以当人们在域名间移动时,所有的营销跟踪都会重置。因此,你不知道转换的来源,或者他们只是被标记为“直接”访问。
你的开发者、QA 团队、代理、合作伙伴或员工污染了你的现场数据。你没有过滤或寻找任何这些东西,所以你不知道它在那里,默默地与所有有用的东西混合在一起。
为什么这是一个问题?
嗯,在最简单的例子中,当您的“员工”或“第三方”污染数据时,您的所有转换指标都会降低。根据数据污染的实际位置,您的站点中的一些或所有关键站点范围或本地指标现在包含来自“无意做您想要测量的事情”的人的数据。
我见过一些网站,潜在客户的数据才是客户真正想要的。然而,他们的网站将被客户、合作伙伴、供应商使用,为整个企业服务,而不会考虑这会如何污染数据。
这就像我站在百货商店外面,用遥控器数顾客。如果送货员使用同一个入口呢?员工呢?如果我把所有人都算上,那意味着什么?
嗯——这取决于商店有多忙或者有多少外卖。在有很多快递的安静日子里,我对“真正的员工”的统计可能是可疑的,而在其他日子里,它更接近事实。
问题是,这些数据是垃圾——更重要的是,质量是可变的,很大程度上在我的控制之外,报告系统很难区分,除非它在收集层被剔除!
一个处理过的例子:
这是一个来自假想客户的完美场景(但基于真实客户):
清洁工喂!
客户提供一次性或定期清洁服务。您可以下载应用程序或访问网站来开始使用。
客户有几个人们要经历的状态。当你下载应用程序或注册时,你还没有交易。你处于数据收集和行动之间的中间状态。姑且称之为‘挂号’吧。
然后,一旦你预定了一份一次性的或固定的工作,你就提供了支付细节,安排了约会,并挑选了一个看起来不错的更干净的个人资料。让我们称之为“客户”
基于粗略的 RFM 计算和对当前 LTV 的了解,“客户”还有其他状态——基于客户保留模型。让我们称这些为“低”“中”和“高”价值界限。
我们这里还有其他演员。“干净”用户通过网站登录,使用其他人使用的相同主页。
这家“清洁用品”公司通过网站登录,再次使用其他人使用的同一主页的链接。
那么,我们的主页上有哪些用户呢?
顾客:40%
供应商:10%
前景:30%
清洁工:20%
由于这个主页是转化路径的主要部分,我现在有 60%的数据完全没有用在我营销活动的投资回报率建模上。我的跳出率完全扭曲了,我的水平漏斗模型完全被污染了,网站中有各种路径有对我没用的流量。
当然,我们可以重新设计所有的网站,以符合我们在精神上的期望——但这是不可能的,不是吗(笑)。我们正在做的是通过设计“标志”来支持他们,让我们能够识别流量。
例如,我们现在将记录一个“潜在客户”的标志,如果我们不能预测你是其他类型之一。如果我们以前见过你(使用 cookie)或者你执行了一个动作(身份验证或登录)来识别你,我们就会知道你是其他类型之一。所以,如果你让我走到这一步——如果我们不能预测你是谁,你就在潜在客户中。
现在,如果我将它扩展到这里的其他用户类型,这并不难,我得到的是一组像这样的标志:
潜在客户、已注册客户、低、中、高
(我也看到了清洁工人和供应商的旗帜)
现在,我可以用这些标志(设置为自定义维度)来创建一个 Google Analytics 视图,它整齐地围绕其中一个标志。
我可以创建一个“潜在客户”视图,在数据中没有供应商、客户或清洁工——并将我的进站流量优化工作集中在“真正重要”的东西上。当我在这个视图中查看数据时,它允许我查看、理解和模拟关于着陆、反弹、参与深度、渠道和设备混合的数据。如果我试图优化我的有机搜索或付费营销活动,当数据被污染时,我该如何做?
现在,您可以扩展该模型,以获得所有状态的视图,甚至可以包围其中的几个状态。在某些情况下,我们可能希望关注低价值客户的行为,但我们可能希望只围绕新客户——等等。最重要的是,绘制污染地图让我们能够绘制正确的东西——并为创建数据足迹的行为者的正确状态建模。
回到问题上来!
我们看到谷歌分析配置经常出现问题,设置、过滤和数据污染问题扭曲了数据。
在许多情况下,客户承认,似乎没有什么工作,他们已经变得不信任数据。对他们来说,这就像是在风中撒尿,所以他们退回到“只是猜测”作为明智的后备选择(笑)。
不是每个人都能解决所有的问题——但是我们在客户做重要的事情上取得了很大的成功。可能需要几分钟或几周的时间来找出并修复你的收集污染——但在你这么做之前,你不会知道。我们与每个人合作,最重要的是与技术和开发团队合作——快速完成工作,不会给数据带来风险。几个月后,清晰性改变了每个相关人员的工作。
想象一下,如果百货商店的收银机是可信的。从来没有人检查过抽屉里的现金是否与收银机显示的相符?从来没有人数过——他们只是把它倒在一个大箱子里。你在开玩笑吗?你会因为犯了这个基本错误而在零售业被解雇——那么为什么要在你的网站上犯这个错误呢?你实际上要检查这个——看它是否匹配,看你是否被盲目抢劫。
收集和数据污染很简单。在钱柜的例子中,让我们想象一下,我们给员工发放午餐费,这笔钱来自钱柜。我们也给顾客退款。我们卖礼券。我们从收银台向供应商付款。
所有这些都必须记录在零售中。所有这些都必须匹配。
然后——也只有到那时——它才会以原子粒子的形式组合成钱柜、部门、楼层、商店和业务级别的指标。如果你把废话推到钱柜数据和指标中,这些废话会在整个组织中流畅地向上流动,一直到董事会层面。
分析也是如此,如果你有污染,如果你不知道那里有什么或在哪里,如果你在数据中有几个用户状态,那么你就是在玩忽职守,让废话流入今年将在你公司打开的每个分析屏幕。
从零售商店拿一片树叶,校准你的数据——只要检查一下那里没有污染。几乎每个人都有一些,所以了解你的是值得的。
如果您需要审核配置方面的帮助或想要自己做,请联系。如果你只是需要有人来验证它是否工作正常,或者你有一些非常复杂的东西——一定要联系!
再见皮普。
C.
你应该知道的数据预处理技术
原文:https://towardsdatascience.com/data-pre-processing-techniques-you-should-know-8954662716d6?source=collection_archive---------1-----------------------
嗨伙计们!欢迎回来。今天,我们将讨论可以帮助您获得更高准确度的特征工程技术。
如您所知,对于数据科学家来说,数据可能非常令人生畏。如果你手里有一个数据集,如果你是一个数据科学家,那么你会开始考虑对你手里的原始数据集做些什么。这是数据科学家的天性。所以我还在成为数据科学家的学习过程中。我试图用各种数据预处理技术来充实我的头脑,因为这些技术对于了解你是否想处理数据是非常必要的。
对于这个分析,我将使用 Kaggle 提供的信用卡交易数据集。我已经写了一篇关于使用自动编码器检测信用卡欺诈的文章。链接在这里:https://medium . com/@ manisharajarathna/credit-card-fraud-detection-using-auto 编码器-in-h2o-399cbb7ae4f1
什么是数据预处理?
它是一种将原始数据转换成可理解格式的数据挖掘技术。原始数据(真实世界的数据)总是不完整的,并且这些数据不能通过模型发送。这将导致某些错误。这就是为什么我们需要在通过模型发送之前预处理数据。
数据预处理的步骤
以下是我遵循的步骤;
1。导入库
2。读取数据
3。检查缺失值
4。检查分类数据
5。标准化数据
6。PCA 变换
7。数据分割
1.输入数据
作为主库,我使用熊猫、Numpy 和 time
熊猫:用于数据操作和数据分析。
Numpy :用 Python 进行科学计算的基础包。
至于可视化,我用的是 Matplotlib 和 Seaborn。
对于数据预处理技术和算法,我使用了 Scikit-learn 库。
# main libraries
import pandas as pd
import numpy as np
import time# visual libraries
from matplotlib import pyplot as plt
import seaborn as sns
from mpl_toolkits.mplot3d import Axes3D
plt.style.use('ggplot')# sklearn libraries
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import normalize
from sklearn.metrics import confusion_matrix,accuracy_score,precision_score,recall_score,f1_score,matthews_corrcoef,classification_report,roc_curve
from sklearn.externals import joblib
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
2.读出数据
你可以在这里找到更多关于数据集的细节:https://www.kaggle.com/mlg-ulb/creditcardfraud
*# Read the data in the CSV file using pandas*
df = pd.read_csv('../input/creditcard.csv')
df.head()
Fig 1 : Dataset
df.shape
> (284807, 31)
3.检查缺少的值
df.isnull().any().sum()
> 0
因为在数据集中没有发现缺失值,所以我没有使用任何缺失值处理技术。
让我们看看数据
因此数据集被标记为 0 和 1。
- 0 =非欺诈
- 1 =欺诈
All = df.shape[0]
fraud = df[df['Class'] == 1]
nonFraud = df[df['Class'] == 0]
x = len(fraud)/All
y = len(nonFraud)/All
print('frauds :',x*100,'%')
print('non frauds :',y*100,'%')
*# Let's plot the Transaction class against the Frequency* labels = ['non frauds','fraud']
classes = pd.value_counts(df['Class'], sort = True)
classes.plot(kind = 'bar', rot=0)
plt.title("Transaction class distribution")
plt.xticks(range(2), labels)
plt.xlabel("Class")
plt.ylabel("Frequency")
Fig 2 : Class vs Frequency
4.检查分类数据
我们在这个数据集中唯一的分类变量是目标变量。其他要素已经是数字格式,所以不需要转换成分类数据。
让我们画出特征的分布
我使用 seaborn distplot()来可视化数据集中的要素分布。数据集中有 30 个特征和目标变量。
*# distribution of Amount*
amount = [df['Amount'].values]
sns.distplot(amount)
Fig 3 : Distribution of Amount
*# distribution of Time*
time = df['Time'].values
sns.distplot(time)
Fig 4 : Distribution of Time
*# distribution of anomalous features*
anomalous_features = df.iloc[:,1:29].columns
plt.figure(figsize=(12,28*4))
gs = gridspec.GridSpec(28, 1)
for i, cn **in** enumerate(df[anomalous_features]):
ax = plt.subplot(gs[i])
sns.distplot(df[cn][df.Class == 1], bins=50)
sns.distplot(df[cn][df.Class == 0], bins=50)
ax.set_xlabel('')
ax.set_title('histogram of feature: ' + str(cn))
plt.show()
Fig 5 : Distribution of anomalous features
在这个分析中,我不会放弃任何查看特征分布的特征,因为我仍处于以多种方式处理数据预处理的学习过程中。所以我想一步一步地实验数据。
相反,所有的特征将被转换成比例变量。
*# heat map of correlation of features*
correlation_matrix = df.corr()
fig = plt.figure(figsize=(12,9))
sns.heatmap(correlation_matrix,vmax=0.8,square = True)
plt.show()
Fig 6 : Heatmap of features
5.使数据标准化
数据集仅包含作为 PCA 变换结果的数字输入变量。V1、V2……v 28 是通过五氯苯甲醚获得的主要成分,唯一没有通过五氯苯甲醚转化的特征是“时间”和“数量”。因此,主成分分析受比例的影响,所以我们需要在应用主成分分析之前对数据中的特征进行比例缩放。对于缩放,我使用 Scikit-learn 的 StandardScaler()。为了适合定标器,数据应该在-1 和 1 之间整形。
*# Standardizing the features*
df['Vamount'] = StandardScaler().fit_transform(df['Amount'].values.reshape(-1,1))
df['Vtime'] = StandardScaler().fit_transform(df['Time'].values.reshape(-1,1))
df = df.drop(['Time','Amount'], axis = 1)
df.head()
Fig 7 : Standardized dataset
现在,所有特征都被标准化为单位尺度(平均值= 0,方差= 1)
6.PCA 变换
PCA(主成分分析)主要用于减少特征空间的大小,同时保留尽可能多的信息。在这里,所有的特征使用 PCA 转换成 2 个特征。
X = df.drop(['Class'], axis = 1)
y = df['Class']
pca = PCA(n_components=2)
principalComponents = pca.fit_transform(X.values)
principalDf = pd.DataFrame(data = principalComponents
, columns = ['principal component 1', 'principal component 2'])finalDf = pd.concat([principalDf, y], axis = 1)
finalDf.head()
Fig 8 : Dimensional reduction
*# 2D visualization*
fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1)
ax.set_xlabel('Principal Component 1', fontsize = 15)
ax.set_ylabel('Principal Component 2', fontsize = 15)
ax.set_title('2 component PCA', fontsize = 20)
targets = [0, 1]
colors = ['r', 'g']
for target, color **in** zip(targets,colors):
indicesToKeep = finalDf['Class'] == target
ax.scatter(finalDf.loc[indicesToKeep, 'principal component 1']
, finalDf.loc[indicesToKeep, 'principal component 2']
, c = color
, s = 50)
ax.legend(targets)
ax.grid()
Fig 9 : Scatter plot of PCA transformation
由于数据非常不平衡,我只从非欺诈交易中提取了 492 行。
*# Lets shuffle the data before creating the subsamples*
df = df.sample(frac=1)
frauds = df[df['Class'] == 1]
non_frauds = df[df['Class'] == 0][:492]
new_df = pd.concat([non_frauds, frauds])
*# Shuffle dataframe rows*
new_df = new_df.sample(frac=1, random_state=42) *# Let's plot the Transaction class against the Frequency*
labels = ['non frauds','fraud']
classes = pd.value_counts(new_df['Class'], sort = True)
classes.plot(kind = 'bar', rot=0)
plt.title("Transaction class distribution")
plt.xticks(range(2), labels)
plt.xlabel("Class")
plt.ylabel("Frequency")
Fig 10 : Distribution of classes
*# prepare the data*
features = new_df.drop(['Class'], axis = 1)
labels = pd.DataFrame(new_df['Class'])
feature_array = features.values
label_array = labels.values
7.数据分割
*# splitting the faeture array and label array keeping 80% for the trainnig sets*
X_train,X_test,y_train,y_test = train_test_split(feature_array,label_array,test_size=0.20)
*# normalize: Scale input vectors individually to unit norm (vector length).*
X_train = normalize(X_train)
X_test=normalize(X_test)
对于模型建筑,我使用 K 个最近邻。因此,我们需要找到一个最佳的 K 来获得最佳效果。
k-最近邻
来自维基百科;
在模式识别中,k-最近邻算法 ( k -NN )是一种用于分类和回归的非参数方法。在这两种情况下,输入由特征空间中的 k 个最接近的训练样本组成。输出取决于 k -NN 是用于分类还是回归。
KNN 算法假设相似的事物存在于附近。换句话说,相似的事物彼此靠近。
“物以类聚,人以群分。”
训练算法只存储数据,计算由预测算法完成。
neighbours = np.arange(1,25)
train_accuracy =np.empty(len(neighbours))
test_accuracy = np.empty(len(neighbours))
for i,k **in** enumerate(neighbours):
*#Setup a knn classifier with k neighbors*
knn=KNeighborsClassifier(n_neighbors=k,algorithm="kd_tree",n_jobs=-1)
*#Fit the model*
knn.fit(X_train,y_train.ravel())
*#Compute accuracy on the training set*
train_accuracy[i] = knn.score(X_train, y_train.ravel())
*#Compute accuracy on the test set*
test_accuracy[i] = knn.score(X_test, y_test.ravel())
我们可以通过将测试集的准确性与训练集的准确性进行绘图来找到最佳 K 值。k 的最佳值是给出最大测试精度的点。
*#Generate plot*
plt.title('k-NN Varying number of neighbors')
plt.plot(neighbours, test_accuracy, label='Testing Accuracy')
plt.plot(neighbours, train_accuracy, label='Training accuracy')
plt.legend()
plt.xlabel('Number of neighbors')
plt.ylabel('Accuracy')
plt.show()
Fig 11 : Number of Neighbors vs Accuracy
idx = np.where(test_accuracy == max(test_accuracy))
x = neighbours[idx]
我使用 Scikit-learnKNeighborsClassifier()来构建模型。
*#k_nearest_neighbours_classification*
knn=KNeighborsClassifier(n_neighbors=x[0],algorithm="kd_tree",n_jobs=-1)
knn.fit(X_train,y_train.ravel())
*# save the model to disk*
filename = 'finalized_model.sav'
joblib.dump(knn, filename)*# load the model from disk*
knn = joblib.load(filename)
在我们建立模型之后,我们可以使用 predict()来预测测试集的标签。
*# predicting labels for testing set*
knn_predicted_test_labels=knn.predict(X_test)
模型评估
from pylab import rcParams
*#plt.figure(figsize=(12, 12))*
rcParams['figure.figsize'] = 14, 8
plt.subplot(222)
plt.scatter(X_test[:, 0], X_test[:, 1], c=knn_predicted_test_labels)
plt.title(" Number of Blobs")
Fig 12 : Number of Blobs
*#scoring knn*
knn_accuracy_score = accuracy_score(y_test,knn_predicted_test_labels)
knn_precison_score = precision_score(y_test,knn_predicted_test_labels)
knn_recall_score = recall_score(y_test,knn_predicted_test_labels)
knn_f1_score = f1_score(y_test,knn_predicted_test_labels)
knn_MCC = matthews_corrcoef(y_test,knn_predicted_test_labels)
混淆矩阵
混淆矩阵是一个表格,通常用于描述一个分类模型(或“分类器”)对一组真实值已知的测试数据的性能。Scikit-learn 提供了使用混淆矩阵方法计算混淆矩阵的工具。
import seaborn as sns
LABELS = ['Normal', 'Fraud']
conf_matrix = confusion_matrix(y_test, knn_predicted_test_labels)
plt.figure(figsize=(12, 12))
sns.heatmap(conf_matrix, xticklabels=LABELS, yticklabels=LABELS, annot=True, fmt="d");
plt.title("Confusion matrix")
plt.ylabel('True class')
plt.xlabel('Predicted class')
plt.show()
Fig 13 : Confusion Matrix
结论
我试图不标准化数据,以获得更好的准确性。但是在我学会并应用这个方法后,它给出了一个有希望的结果。我还在做实验,还在学习数据预处理技术。对于这个数据集,我只使用了 KNN 算法。如果你觉得这个内核有帮助,请随意评论并投赞成票。
参考
你可以在这里找到更多关于 PCA 转换的信息:https://towardsdatascience . com/PCA-using-python-scikit-learn-e653 f 8989 e 60
数据准备和预处理与在数据科学中创建实际模型同样重要——第 1 部分
原文:https://towardsdatascience.com/data-preparation-and-preprocessing-is-just-as-important-creating-the-actual-model-in-data-sciences-2c0562b65f62?source=collection_archive---------9-----------------------
我最近报名参加了 Kaggle 上的房价:高级回归技术挑战。这个问题要求参与者在超过 75 个基本预测值的基础上预测每栋房屋的最终价格。显然,这是一个回归问题。顾名思义,它测试用户对高级回归技术的使用。
我花了近 2 周时间在工作、几门课程、几个其他项目和生活中周旋,并学到了一些关于 EDA(探索性数据分析)、特征工程和数据准备的技巧。在我带您完成以下步骤的同时,我还将分享我从挑战中的其他参与者那里学到的东西。当前版本的笔记本没有太多的建模技术。我仍在研究模型,稍后将发表另一篇关于模型选择及其基本概念的文章。
本文重点介绍数据理解和预处理的几个步骤,即基于相关矩阵、异常值处理和目标变量转换的初步特征选择。在相应的文章中,我还会谈到像缺失值处理和特征工程这样的步骤。
了解数据集
竞赛的数据部分包含一个详细的数据描述文件,解释了所有变量的定义和内容。人们应该知道的一些重要变量是:
- “销售价格”——这是目标变量,包含以美元为单位的房产销售价格。虽然此变量是为训练数据集中的所有记录填充的,但必须为 test.csv 文件中的数据预测相同的列
- “总体质量”——这一指标对房屋的整体材料和装修质量进行评级。它有从 1 到 10 的等级,1 对应“非常差”,10 对应“非常好”。这个分类变量实际上是一个变量。我们将不得不相应地对待它。
- “总体状况”——这一指标对酒店的整体状况进行评级。就像,总的来说,它对相同的类有 1 到 10 的排名。
- ' year build '-这个变量给出了房产最初建造的年份。
- yearremodaddd '-这个变量表示房产的改造日期。如果没有进行改造或添加,则该列的值应该与建造日期(建造年份)相同
- YrSold'-这包含房子出售的年份(YYYY 格式)。
- 这是房产出售的月份(MM 格式)。
- GarageYrBlt'-这是房子的车库建造的年份。
- GrLivArea'-这是许多可用的区域相关参数之一。这一项特别指出了房屋中可利用的地上(等级)居住面积(平方英尺)。
- TotalBsmtSF'-顾名思义,这个指标包含了地下室的总面积,以平方英尺为单位。
- “1stFlrSF”和“2 ndflrsf”-这些变量分别代表一楼和二楼的面积(平方英尺)
- ' GarageArea'-这个变量代表车库的平方英尺大小。
- GarageCars 这一栏包含车库的大小,以汽车容量表示。因此,该指标中的所有值都应该是整数。
- TotRmsAbvGrd'-该参数包含地面以上的房间总数。数据描述文件清楚地表明,这没有考虑到浴室。
- ' LotFrontage'-该列包含与物业相连的街道的线性英尺数。
还有一些其他指标,如“PoolQC”、“Utilities”、“Alley”、“CentralAir”等,这些指标表明酒店中某些功能的存在和质量。人们可以参考数据字典并了解如何研究和使用它。
train.csv 文件有 1461 行和 81 列(包括列标题)。另一方面,test.csv 文件有 1460 行和 80 列(不包括目标变量,即“销售价格”)。
数据探索(EDA)
相关性和主要特征选择
我在这个问题上的第一步是理解变量,评估它们,做一些基本的 EDA。我从绘制训练数据集的相关矩阵开始。
Correlation Matrix
相关矩阵的一些基本要点如下:
- 如果我们看上面的热图,所有的白色方块表示相应变量之间的高度相关性
- “GarageCars”和“GarageArea”显示出高度的相关性,也符合我们的直觉思维。车库的面积越大,车的数量就越多。此外,两者似乎都与“销售价格”有着相似(且相对较高)的相关性。这清楚地表明了多重共线性的情况。因此,我们可以删除其中一个,保留另一个。
- 此外,“TotalBsmtSF”和“1stFlrSF”再次显示高度相关性,表明多重共线性。因此,我们应该删除其中一个。
- 如果我们查看“TotalBsmtSF”和“SalePrice”之间的相关性,我们会看到一个白色方块,即高相关性。这表明应该保留 TotalBsmtSF,因为它有助于销售价格预测
- 另一组显示高相关性的变量是“YearBuilt”和“GarageYrBlt”。如果我们比较“GarageYrBlt”中缺失值的百分比,我们会看到它有超过 5%的缺失值(我们将在后面查看相同的详细分析)。此外,“YearBuilt”似乎与“SalePrice”有相当好的相关性(大约 0.5)。看来我们应该保留‘year build’而放弃‘GarageYrBlt’。
- 此外,除了‘year build’、‘GarageCars’或‘GarageArea’中的一个)和‘TotalBsmtSF’之外,我们还应该记住其他四个似乎与‘销售价格’有很好相关性的变量:‘总体质量’、‘GrLivArea’、‘全浴’和‘TotRmsAbvGrd’
- 然而,如果我们观察' TotRmsAbvGrd '与其他变量的相关性,我们会发现与' GrLivArea '的相关性很高。为了能够决定删除哪个变量,让我们再看一些分析。
然后,我绘制了一个散点图,它会给出一些列相对于其他列的数据分布的详细信息。我们选择了上面提到的列。
scatter plot of selected variables
从上面的情节我们可以推断:
- ‘GrLivArea’和‘TotRmsAbvGrd’表现出高度的线性关系。
- 当我们关注“GrLivArea”和“TotalBsmtSF”时,显示出一种线性关系,几乎有一个边界定义了该图。这基本上表明“GrLivArea”定义了“TotalBsmtSF”(地下室面积)的上限。没有多少房子会有比底层居住面积更大的地下室。
- “销售价格”显示“一年建成”几乎急剧上升,基本上表明价格随着房屋年限的减少而上升(几乎呈指数增长)。大多数最近的房子价格都很高。
为了最终决定保留上面的哪些变量,放弃哪些变量,我们将进行最后的分析。让我们放大几个具体变量的相关矩阵。
Zoomed in correlation matrix for top 10 variables
从上面的相关矩阵快照中,我决定了最终要明确考虑的变量列表和要排除的变量列表:
- 与“销售价格”相关性最高的变量是“总体质量”——保留“总体质量”
- “GarageCars”和“GarageArea”之间的高相关性+“GarageCars”和“SalePrice”之间的高相关性— 保留“GarageCars”;移除‘车库区域’
- ' TotalBsmtSF '和' 1stFlrSF '相关性高,与' SalePrice '相关性相等——保留' TotalBsmtSF ',删除' 1stFlrSF'
- 在“GarageYrBlt”和“year build”中,“year build”的缺失值较低,与“销售价格”的相关性较高— 保留“year build”,删除“GarageYrBlt”
- “TotRmsAbvGrd”和“GrLivArea”之间的相关性很强+“GrLivArea”和“SalePrice”之间的相关性更高— 保留“GrLivArea”;删除' TotRmsAbvGrd'
- 保留“全浴”,因为我们没有看到与任何其他变量的相关性,但它与“销售价格”有显著关联
在我们进入下一步之前,让我们试着理解为什么我删除了可能导致多重共线性的变量。为此,我们将不得不钻研一些简单的数学。
回归分析分离出每个预测值或自变量(x)和目标/因变量(y)之间的关系。在最后的方程中,回归系数表示在所有其他自变量都不变的情况下,相应自变量的单位变化在目标变量中引起的平均变化。
现在,在一种情况下,当独立变量相关时(这种情况是多重共线性),它表明一个变量的变化也会导致另一个变量的变化。这种相关性越强,改变一个变量而不改变另一个变量的难度就越高。这使得回归模型难以独立估计每个自变量和因变量之间的关系。这基本上导致了 3 个相互关联的主要问题:
由于预测因素导致的解释方差不可靠
系数变得对模型中的微小变化和其他独立预测因子的存在高度敏感。
它会降低方程系数的精度,从而降低回归模型的性能(用于确定独立变量统计显著性的不可靠 p 值)。
异常值处理
既然我们已经关注了导致目标变量“销售价格”最大方差的变量,让我们从这些变量中移除异常值。为什么这很重要?回归作为一种算法,试图通过数据点拟合最佳直线。为了找到最佳拟合函数,它试图适应所有点,这使得它对异常值非常敏感。虽然线性回归比其他稳健算法更敏感,但在任何回归练习之前的最佳实践是处理异常值,而不管使用什么算法。
我采用了一种启发式方法来处理异常值,这样我就可以看到和控制我正在处理的数据点。我在处理异常值时注意的一些变量是
- 格里瓦雷亚
首先,我使用散点图比较了变量“GrLivArea”和“SalePrice”。
“之前”图表中大约 4600 平方英尺和 5600 平方英尺的两个点看起来像是异常值。我通过在大于 4000 平方英尺的‘GrLivArea’应用降点条件来移除它们。制成'销售价格'低于 30 万美元。
2.总计 BsmtSF
对地下室总面积(TotalBsmtSF)也做了类似的工作。移除异常值([' TotalBsmtSF ']>3000)前后的散点图如下所示:
3.总体平等
总体质量度量是一个顺序变量。“总体质量”相对于“销售价格”的散点图有望为我们提供价格范围,以及相应的物业质量。使用散点图,我删除了 2 个数据点,看起来像离群值。使用条件( ['总体质量'] > 9) & (['销售价格'] > 700000) ),我获得了“总体质量”散点图之前和之后的以下内容:
上述练习从训练数据集中移除了 7 个数据点(或总共记录)。使用上述数据集,我继续进行下一个练习:调查目标变量,即“销售价格”
目标变量的调查和转换
在我深入研究这一步的复杂性之前,让我解释一下我们通过这一步想要达到的目的。我们正在调查问题中目标或响应变量的行为和趋势,即“销售价格”。这一步的发现还将帮助我们转换变量,以尽可能最好的方式适应我们的模型。
这对于确保模型预测更加准确非常重要。在回归算法中,残差必须服从正态分布。只是修改一下残差的定义,它被定义为因变量/目标变量的观测值( y )和预测值( ŷ )之差。
现在出现的一个明显的问题是关于正态残差的需要。为了回答这个问题,让我们试着简化这个练习背后的数学逻辑:
残差和异方差的非正态性(一个变量的可变性在用于预测它的另一个变量的值的范围内不相等的性质。)提出了一个主要问题。它基本上是说,模型中的误差量在观察或训练数据的整个范围内是不一致的。就独立变量或预测变量而言,这意味着它们所具有的解释方差(或预测能力)的数量(按β权重计算)在目标变量的整个范围内并不相同。本质上,预测因子可以解释不同水平的响应变量的不同趋势和差异。换句话说,当残差不是正态分布时,则假设它们是随机数据集,取值为“否”。这意味着模型不能解释数据集中的所有趋势(低 R 平方值)。这无疑降低了试验预测的可靠性。
我们可以通过转换因变量来纠正这一点。现在,如果预测值是正态分布的,那么残差也是正态分布的,反之亦然。一些常见的转换变量是:1。对数,2。平方根,3。反向(1/x)。根据观察到的响应变量趋势,还可以使用其他几个函数或转换。
更详细的解释也可以参考这个链接这里。
因此,我从绘制直方图开始,研究“销售价格”的分布:
Plots for original ‘SalePrice’ values
我们可以从直方图中观察到正偏度。这不完全是正态分布。此外,在概率图中,“销售价格”列的有序值不遵循线性趋势。这基本上都代表了数据的右偏度。
现在,如果我们观察到正或右偏斜,对数变换是一个很好的选择。对这些值应用对数函数应给出线性趋势,并将这组值转换为“正态分布”值。我们将看到如何。
您可以参考下面的代码片段来查看我执行了什么转换:
观察到的 mu 和 sigma 值为:均值= 12.02 和标准差。戴夫。= 0.39。我获得的图是:
Plots for log-transformed ‘SalePrice’ values
正如我们在这里看到的,分布现在看起来是正常的,并且在概率图中是线性趋势。
在这一步之后,我添加了经过处理的训练和测试数据集,以形成一个数据集:“total_df”。接下来的步骤包括缺失值处理和特征工程。我将在下一篇文章中讨论这些内容。
上述步骤的要点
正如你在上面看到的,每一步都有其背后的基本原理。分析相关矩阵以减少多重共线性。进行异常值处理是为了优化回归模型的性能。对目标变量进行分析和转换,以获得推理和直观的误差趋势。
您的用例可能需要也可能不需要这些步骤。但是,在开始构建模型之前,最好先检查一下这些情况。缺乏这些可能会错误地摆动你的模型而没有解释,或者可能会给你完全不可靠的测试预测。
我将在相应的文章中介绍其余的步骤。请留意这个空间的链接。
编辑:
链接到本系列的下一篇文章: 数据准备和预处理与创建数据科学中的实际模型同样重要——第 2 部分
Python 中的数据预处理
原文:https://towardsdatascience.com/data-preprocessing-in-python-6f04e6c2cb70?source=collection_archive---------5-----------------------
我在我的文本摘要工具中执行了数据预处理,现在,这里是详细内容。
数据预处理不过是为实验准备数据——转换原始数据以供进一步处理。
正在使用的 Python 库— NLTK 、beautiful soup、 re 。
考虑以下保存为 sample_text.txt 的文本-
这只是我用 HTML 标签、额外空格和特殊字符加上的一组随机的句子。
****目标是通过移除多余的空格、换行符、标签、特殊字符和小写单词来清理这段文本。
让我们对上述数据进行预处理-
我已经开始编写一些函数,即*【get _ text()***clean _ html()和remove _ string _ special _ characters()**-
让我们在 sample_text.txt. 上使用这些函数
首先我们从 get_text() 函数获取文本,使用 clean_html() 移除 HTML 标签,然后使用 sent_tokenize 将文本分成句子。
这些句子然后被传入remove _ string _ special _ characters()。**
然后,将几乎清理干净的句子连接起来,再次给出全文。
最后一步是使用 word_tokenize 将文本标记成单词。
单词小写并且停止单词从最终单词列表 text_words 中移除。**
所以现在我们有了一个文本中的单词语料库。
这部文集能告诉我们什么?使用一些基本方法探索内容,典型的方法是数单词。我们可以找出哪些词在语料库中出现频率最高,通过按语料库频率对词进行排序,我们可以研究语料库的词汇分布。NLP 有很多!
可以实现更多的函数来满足特定类型的文本,但以上是清理数据以供进一步处理的最常见方法。
编码快乐!
Photo by delfi de la Rua on Unsplash
数据揭示:是什么让 Ted 演讲受欢迎?
原文:https://towardsdatascience.com/data-reveals-what-makes-a-ted-talk-popular-6bc15540b995?source=collection_archive---------2-----------------------
你有没有想过是什么让一些 TED 演讲比其他的更受欢迎?
我分析了 2550 个 ted 演讲的数据集来寻找这个问题的答案。我研究了一个特定演讲的哪些可用变量,如评论数量、翻译语言数量、演讲时长、标签数量或在线发布日期,是其受欢迎程度的强有力预测因素,以浏览量衡量。
底线
在对数据集中其他可用变量的视图进行分析和回归后,揭示了一些有趣的关联。
一个高点击率的热门话题有什么特点?
- 评论数高(自然)。
- 多语种翻译(自然也是)。
- 许多评论的组合和许多翻译语言产生的浏览量远远高于它们单独使用时的预期。
- 它不应该太短。持续时间根本没有太大的影响,但如果有的话,它对更长的谈话是积极的。最受欢迎的演讲时间在 8-18 分钟之间。
- 标签数量更多,最好在 3-8 个之间。
- 它会在工作日上传,最好是星期五!
- 你可能会看到一些时髦的职业会因为他们的演讲而获得比平均水平高得多的评价,比如:神经解剖学家、安静的革命者、测谎仪、模特、拳击运动员、弱点研究员或禅宗牧师。这不具有代表性,但他们确实获得了最高的票数(这是一个不公平的游戏,但嘿)。
下面是实际数据分析。你可以在我的 R-Pubs 页面上看到完整的 R markdown 笔记本,以及我的 GitHub 上的所有文件和数据。
Edward Snowden’s Surprise Appearance at TED, Speaking with Chris Anderson and Tim Berners Lee on a telepresence robot, beaming in from a secret location in Russia. Source: Wikimedia Commons, originally uploaded from [Filckr](http://Uploaded from http://flickr.com/photo/44124348109@N01/13332430295).
让我们深入研究数据
首先,你应该意识到:不要把这个(或者从观察数据中得到的几乎任何其他结论)作为一个的因果推断。这不是一个实验,也不足以证明因果关系。对照组和治疗组或数据的各种亚组之间的观察结果不匹配,即使在回归之后,变量的解释力也不够严格。我手头现有的数字参数不足以得出这样的结论;我无法将真正重要的内容与苹果进行比较,即使使用多元回归进行控制,也不是所有的事情都是相同的(其他条件不变假设仍然不成立)。然而,我能够得到一个像样的预测器,并了解哪些变量与较高的视图计数最密切相关。
数据是什么样的?
该数据集包括 2550 场演讲的名称、标题、描述和 URL、主要演讲人的姓名和职业、演讲人数、演讲时长、TED 活动和拍摄日期、在线发布日期、评论数量、翻译的语言和浏览量。它还包括一个压缩形式的相关标签、评级和相关谈话的数组,但在数组内部,这些需要转换才能使用。有关完整列表,请参见 Kaggle 上的数据集页面。
1:直方图
首先,让我们看看每个变量是如何分布的直方图。
直方图 是表示该变量取值分布的一种方式;或者直观地表示:“一分钟有多少次谈话?两分钟?三分钟?等等……”。形式上,直方图是“由矩形组成的图,其面积与变量的频率成比例,宽度等于类间隔”。
看看下面我们的变量是什么样子的。
会谈持续时间更接近于正态分布,但在较长的持续时间内,一些会谈的右侧尾部较宽,平均值约为 14 分钟,中位数为 12 分钟。几乎所有的演讲都在 1-18 分钟之间(正常 Ted 演讲的最长时间)。
评论数量是泊松分布(视觉上类似于指数分布,但技术上不是,因为评论是以离散数字测量的),对于不受欢迎的视频,强烈偏向于 0 评论的最小值。
视图数量也是一个向左倾斜的泊松分布,视图数量的中位数是 1124524,视图数量的平均数是 1698297
最后,我们的变量分布的总体情况:
Histograms of each numerical variable: number of comments, duration, date filmed, number of languages translated, number of speakers presenting (almost always one), published date, view counts, month, year, whether it was published on a weekend, and number of tags.
从这些分布中我们看到:
- 标签数量也是向左倾斜的泊松分布,峰值在 4-7 个标签之间。
- 冷门演讲的翻译语言数量最高为 0,但大部分都在 20-40 种语言之间。
- 虽然 2012 年之前的电影日期很低,但它们都以更加统一的速度出版。
最常见的职业有哪些?
显然,作家是 TED 演讲者最常见的职业!其次是其他创造性职业和从事该职业的人数:
- 作者:45
- 艺术家:34 岁,设计师:34 岁
- 记者:33 岁
- 企业家:31 岁
- 建筑师:30 岁
- 发明者:27(显然那是一种职业!)
- 心理学家:26
- 摄影师:25
- 电影制作人:21
但是平均来说,导致最受欢迎的谈话的职业是什么?
这些职业差别很大!他们被最受欢迎的 ted 演讲中的离群值扭曲了(例如,# [4]漏洞研究员仅指布琳·布朗),因此不是代表性样本。总之,这里有一些令人惊讶的发现:
[1] **Neuroanatomist**
[2] Life coach; expert in leadership psychology
[3] Model *# okay, nature of man doesn't change*
**[4] Vulnerability researcher**
[5] Career analyst
**[6] Quiet revolutionary** *# great occupation*
**[7] Lie detector**
[8] Psychiatrist, psychoanalyst and **Zen priest**
[9] Director of research, Samsung Research America
[10] Author/educator
**[11] Illusionist, endurance artist #(really?)**
**[12] Gentleman thief**
[13] Health psychologist
[14] Comedian and writer
[15] Leadership expert
[16] Social activist
[17] Relationship therapist
[18] Vocalist, **beatboxer**, comedian
[19] Clinical psychologist
[20] Comedian and writer
2:参数之间的相关性
让我们看看每对数值变量之间的总体相关对散点图矩阵;
pairs scatter-plot matrix
为了补充这一点,可以看到一个相关矩阵,用颜色表示从 0(白色)到深蓝色(+1)或深色条纹红色(强负相关,-1)的相关强度,用星号(***)表示 p 值的显著性。
correlation matrix
大多数参数没有很强的相关性。
- 自然,出版数据和拍摄日期之间有很高的相关性。从数字和逻辑上看,拍摄日期似乎与观看次数没有太大关联——因为观众更受 ted 演讲发布日期的影响,而不是它是一个月前还是一年前录制的。
- 评论数和浏览量之间存在相对较高的正相关性,这是有道理的(更多的受众,更多的评论)
- 翻译语种数与浏览量(0.38)和评论数(0.32)呈正相关
- 时长和语言数量之间存在较小的负相关;讲话越短,翻译的语言就越多,大概是因为更容易翻译吧。
3:现在是有趣的部分,这些参数中的每一个与视图的数量有多大关联?
这些变量如何与视图相关联?是线性关系,非线性关系,还是非线性关系?了解这一点很重要,这样才能知道如何将它们插入回归中。
让我们从本周日开始,这篇讲话发表于。
因此,一周中的某一天似乎确实与平均观点有一些关联!周末发布的 Ted Talks 浏览量似乎少很多,周六最低,周五是 ted talks 发布日最受欢迎的一天。
下面是散点图,黄土弹性回归用白色表示,线性回归用粉色表示,看看线性形状与弹性移动平均线有什么不同。这向我们表明,通常,除了在这些变量的分布的故事中,只有几个异常值的数据,线性模型在某种程度上描述了这种关系。
让我们从持续时间和标签数量开始:
令人惊讶的是,持续时间与视图数量几乎没有一致的相关性;除了最受欢迎的演讲接近 8-18 分钟。标签数量在 3-8 之间似乎是最佳的,这也是更常见的标签数量;有一些特别受欢迎的谈话的异常值。
那么评论数量和翻译语言呢?
不出所料,显然,评论数量与浏览量有很好的相关性,语言数量也是如此——它们都来自于拥有大量的观众。因此,基于这些因素来预测观点是不“公平”的,在现实世界中,我们不能使用这些参数来预测,因为它们不是更多观点的原因,但是它们也是许多观点的结果,并且是一个加强反馈循环的原因:评论越多,社区就越参与讨论,并且更有可能传播;语种越多,观众能看的越多;而且观众越多,评论翻译的观众就越多。其余的有一个小的线性效应,没有偏离太多,虽然很小。
粉色线是线性回归,而白色线是黄土。与黄土回归相比,线性回归似乎不会丢失太多信息,黄土回归具有任意的灵活性,并且会显示明显的非线性形状。虽然它们中的一些确实具有非线性形状,但从更近的角度来看,它只是在数据稀缺的尾部,并且受到那里的几个数据点 和一些异常值的影响(如在注释相关性中)。因此,将回归变量作为线性拟合输入可能就足够说明问题了。
模型和结果
我首先对每个感兴趣的变量分别进行了视图数量的回归,这使得我们能够看到哪些变量具有解释力以及解释力有多强。后来,我加入了更好的解释,将它们一个接一个地添加到多元回归中,同时检查它们的添加是否真的提高了我们的性能。结果如下表所示,对于模型(1)到(8),每一列都是不同的模型。
选择的模型是最后一个模型,因为它在 R 平方、调整后的 R 平方、p 值和 F 统计方面具有最佳的解释能力,尽管它与模型(5)相比只有微小的改进,只有注释和翻译的语言。
出于预测的目的,我会选择包含所有变量的模型 8。出于解释的目的,我选择模型 5 来解释注释和语言是目前为止与视图最相关的,并解释了它的大部分差异。
模型 5 表明,每增加一条评论,就会增加 4,044 次浏览(p 值低于 0.01),每增加一种语言的翻译,就会增加 60,650 次浏览(p 值低于 0.01)。然而,常数是负的(-733)视图,这没有意义,但这伴随着线性模型的限制。这些共同解释了 0.33 的方差(包括 R 平方和调整的 R 平方)。
**Y(浏览量)=—733+4044 评论+60650 语言
然而,在模型 8 中加入所有其他变量后,R 平方略微提高到 0.336,调整后的 R 平方为 0.334。因此,如果我们追求预测的准确性,我会使用最后一个完整的模型:
***Y(浏览量)=—1455238+3931 *评论+68222 *语言+408 时长+26625 数量 _ 标签—41407 是 _ 周末
结果,尤其是模型 8,显示了总体意义。大多数变量都显示出显著性,虽然周末没有,但加入它仍然稍微提高了解释力,所以我保留它。f 统计量相对较低,R and R 平方分别为 0.336 和 0.334,但在这组模型中表现最好。常数下降得更多,给变量更多的权力来提高预测的视图计数。评论的系数(效果的估计)从 4044 减少到 3931,并且对于语言的数量重新分配到更高的系数,对于新增加的变量重新分配到新的系数:每增加一秒钟就有 408 个更多的视图,每增加一个标签就有 26625 个更多的视图,并且如果在周末发布,这通过将预测的视图数量减少 41407 来补偿。
最后,我用标签数量和持续时间的多项式进行了最终回归,最高达三次**,添加评论数量和语言数量之间的交互项做出了重大贡献,提高了准确性,R 平方为 0.436,调整后的 R 平方为 0.434。由于系数为正,这表明**与许多评论进行对话与 d m 任何语言的翻译加在一起比只与其中一个人进行对话产生更多的观点。然而,这种模型不太便于得出一般性结论,可能不太通用,容易过度拟合。并不是所有的多项式都有统计学意义,但是当我放弃其中一个时,它们仍然改善了结果。因此,在这里我不会过多地指望它的含义,但是对于类似的数据,它会是一个稍微好一点的预测模型。下面是它的表现(以及如何运行):****
Call:
lm(formula = views ~ comments + languages + num_tags + I(num_tags^2) +
I(num_tags^3) + weekend + duration + I(duration^2) + I(duration^3) +
comments * languages, data = ted)
Residuals:
Min 1Q Median 3Q Max
-26821919 -682956 -290905 234527 25305423
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -4.548e+05 3.394e+05 -1.340 0.18035
comments -5.796e+03 4.838e+02 -11.979 < 2e-16 ***
languages 3.522e+04 4.930e+03 7.145 1.17e-12 ***
num_tags -9.210e+04 7.291e+04 -1.263 0.20668
I(num_tags^2) 9.235e+03 6.441e+03 1.434 0.15174
I(num_tags^3) -2.236e+02 1.666e+02 -1.343 0.17950
weekend 1.342e+05 1.905e+05 0.704 0.48120
duration 2.038e+03 4.664e+02 4.369 1.30e-05 ***
I(duration^2) -9.895e-01 3.355e-01 -2.949 0.00321 **
I(duration^3) 1.367e-04 5.555e-05 2.462 0.01389 *
comments:languages 2.464e+02 1.171e+01 21.052 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 1879000 on 2539 degrees of freedom
Multiple R-squared: 0.4369, Adjusted R-squared: 0.4346
F-statistic: 197 on 10 and 2539 DF, p-value: < 2.2e-16
结论
这个有限模型传达的是相关性,而不是因果关系。它没有很好地传达因果关系,因为因果推理的基本问题没有用这些变量很好地解决,这些预测因子*不独立于 y 变量,*并且它们高度相关(主要是评论和语言数量,它们自然是最好的预测因子。我不相信通过这些可用的数值预测,我们可以得出一个因果推论。接下来的尝试可能会使用谈话的转录来分析内容,或使用音频来分析鼓掌的程度,或使用谈话中的视觉效果和说话者的服装来更好地预测谈话的内容。
含义
认识到这不是因果关系,这些相关性可以帮助你(1)在给定这些参数的情况下,更好地预测一次谈话的浏览量,以及(2)假设可能的因果方向,并进一步测试它们。
那么, 一段通俗的谈话会有什么特点呢?
- **评论数高。**看得越多,你得到的评论就越多,但因果关系也可能是双向的:评论越多→甚至更多的观点。因此,如果你想增加你的浏览量,让你所有的朋友都来评论并开始讨论可能会有所帮助。这可能会刺激你的视频的病毒式传播,增加浏览量,并可能增加 TED 展示它的可能性。实验一下,让我知道!
- 多种语言的翻译。这也很可能具有双面因果关系;浏览量越多→翻译量越多→能看的人越多,浏览量甚至更多。所以如果你想开始这个循环,让你的朋友或自由职业者翻译并宣传这个演讲,T2 可能会有所帮助。如果有很多评论和多种翻译语言——这时候你就知道要赌上更多的浏览量了。
- 不应该太短。久期非常轻微的正相关;最受欢迎的演讲时长为 8-18 分钟。这可能表明,通常来说,太短的谈话不够深刻,不够鼓舞人心。然而,如果你的演讲天生很短,我不认为延长它并冒着它很无聊的风险是一个好主意。
- 标签数量更多,最好在 3-8 个之间!回归表明,更多的标签有积极的影响,这是有意义的,因为足够广泛,并建议从更多的主题和其他谈话作为来源。最受欢迎的演讲有 3-8 个标签,所以这可能意味着演讲太宽泛或没有重点不是一个好主意。
- 它会在工作日上传,最好是周五!这有点令人惊讶,但显然,在周末上传有负面影响(除了在最后一个模型中,它可能被如此多的其他形式的其他变量所混淆);但不可否认的是,一周中的某一天与平均浏览量之间的相关性表明,在工作日上传的谈话,尤其是在周五,明显比周末更受欢迎。当人们在工作的时候,他们对 TED 新发布的内容了解多少?或者更具体地说,当他们在工作中偷懒时,在周五最常做的是什么?
最后,现在你可以和你的朋友继续你的 TED 狂欢派对,进行一些更有根据的猜测了!如果你赢了大奖,你也可以送我一些表示感谢的东西。
你可以在我的 R-Pubs 页面上看到完整的 R markdown 笔记本,以及我的 GitHub 上的所有文件和数据。
祝你这周过得愉快,一定要看看一个新的 TED 演讲,有 3-8 个标签,8-18 分钟长,有很多评论和语言,是在周五上传的!
数据科学项目管理方法
原文:https://towardsdatascience.com/data-sciencce-projects-management-methodologies-54339c9d5e5a?source=collection_archive---------5-----------------------
在数字化背景下,组织正在部署越来越多的数据科学项目。这篇文章揭示了一些可以指导新一代项目的项目管理方法。即使敏捷方法在 IT 中非常普遍,数据科学通常也需要更新的方法,如 Adaptive 或 Extreme。
这篇文章将快速回顾这些方法,展示每种方法的优缺点。
首先,有必要将项目方法分为两类:目标和解决方案过程。我们会选择目标是从一开始就绝对明确的(如在建筑施工中)还是不明确的(如在研究中)。第二,如果解决方案过程是明确的和预先建立的,或者如果过程是临时的和在开发项目的过程中发现的。
Project Characteristics Quadrants by Goal and Solution Uncertainty — Adapted from [1]
1 型。线性策略:
线性策略包括没有反馈回路连续阶段。项目解决方案直到最后阶段才发布。该策略的特点是明确定义的目标解决方案和要求、零或很少的范围变更要求、项目内部的常规和重复过程、使用预先建立的公式和模板。
1 型。增量策略:
这种策略类似于线性策略,但是项目的每个阶段都发布一个部分解决方案。在这个策略中,价值必须在最终阶段之前交付。
1 型或 2 型。迭代策略(例如 Scrum 或特性驱动开发)
试图对不断变化的环境进行全面规划和计划是没有效率的。因此,敏捷鼓励基于数据的迭代决策**。**例如,在 Scrum 中,主要的焦点是以小的迭代增量交付满足客户需求的产品。
类似于增量战略,但由许多重复的阶段组成。该策略包括一组阶段完成后的反馈回路。当客户满意时,循环停止,即该策略使用几个中间解决方案作为发现最终解决方案的途径。
2 型或 3 型。适应性策略(如适应性项目框架或适应性软件开发)
类似于迭代策略,但是每次迭代反馈都将调整项目的未来,以收敛到一个完整的解决方案。一次迭代可能会为客户创建一个部分的解决方案。这种策略是自适应的,因为最终的解决方案只有部分为客户所知,所以成功取决于分配频繁变化的能力。在这里,计划是以适时的方式完成的。[2]
4 型。极端战略(如研究&开发项目)
类似于适应性策略,但是每次迭代反馈,项目的目标也必须被发现,并且项目将在其上收敛。这是第 4 类策略,因为目标或解决过程都是未知的。这类项目中目标和路径的不确定性导致了高度的复杂性。通常,最终产品与最初的预期大相径庭。
Differences between traditionam project management and extreme Project Management. Figure from the book Extreme Project Manament by Doug DeCarlo [3]
从一种类型的项目管理转换到另一种类型的项目管理并不是一件简单的任务,在下面的文章中,我将解释如何从经典的方法(传统的,V-cycle)转换到本文中描述的敏捷方法。如果你想阅读它,只需点击以下链接:
[## 我们如何促进项目管理的转变?(从经典到敏捷)
项目管理过渡不一定是破坏性的,相反,我提出了一个模型来实现这一点…
medium.com](https://medium.com/agileinsider/how-can-we-facilitate-the-transformation-of-project-management-from-classic-to-agile-d0c63a20c809)
感谢阅读!!!
如果你想继续阅读这样的故事,你可以在这里订阅!
参考书目
[1] R. K. Wysocki,有效的项目管理传统的、适应性的、极端的。威利出版社,2006 年。
[2] J. A. Highsmith,适应性软件开发:管理复杂系统的协作方法,第 12 卷。2000.
[3] D. Doug,极限项目管理:在现实面前使用领导、原则和工具交付价值。,第 22 卷,第 6 号。2005.
数据科学 101:Python 比 R 好吗?
原文:https://towardsdatascience.com/data-science-101-is-python-better-than-r-b8f258f57b0f?source=collection_archive---------7-----------------------
几十年来,研究人员和开发人员一直在争论 Python 和 R 是数据科学和分析的更好语言。数据科学在包括生物技术、金融和社交媒体在内的多个行业中迅速发展。它的重要性不仅被在行业中工作的人们所认识,而且也被现在开始提供数据科学学位的学术机构所认识。随着开源技术迅速取代传统的闭源商业技术,Python 和 R 在数据科学家和分析师中变得非常流行。
“Data science job growth chart — Indeed.com
(非常)简短的介绍
Python 由吉多·范·罗苏姆发明,于 1991 年首次发布。 Python 2.0 发布于 2000 年,8 年后 Python 3.0 也发布了。 Python 3.0 有一些主要的语法修订,并且不向后兼容 Python 2.0 。然而,有一些 Python 库,比如 2to3 ,可以自动完成两个版本之间的翻译。 Python 2.0 目前计划于 2020 年退役。
r 是 1995 年由 Ross Ihaka 和 Robert Gentleman 发明的。它最初是约翰·钱伯斯在 1976 年发明的 S 编程语言的一个实现。一个稳定的测试版本 1.0.0 于 2000 年发布。目前由 R 开发核心团队维护,最新稳定版本为 3.5.1 。与 Python 不同,R 在过去没有需要语法转换的重大变化。
Guido van Rossum (left) Ross Ihaka (middle) Robert Gentleman (right)
Python 和 R 都有庞大的用户群体和支持。由 Stack Overflow 完成的 2017 年调查显示,几乎 45% 的数据科学家使用 Python 作为他们的主要编程语言。而 r 则被 11.2% 的数据科学家使用。
“Developer Survey Results 2017” — Stack Overflow
值得注意的是,Python,特别是 Jupyter Notebook ,在最近几年里获得了极大的流行。虽然 Jupyter Notebook 可以用于 Python 以外的语言,但它主要用于在数据科学竞赛的浏览器中记录和展示 Python 程序,如 Kaggle 。由 Ben Frederickson 做的一项调查显示 Jupyter Notebook 在 Github 上的月活跃用户百分比(MAU)在 2015 年后大幅上升。
“Ranking Programming Languages by GitHub Users” — Ben Frederickson
随着 Python 近年来越来越受欢迎,我们观察到用 r 编写的 Github 用户的 MAU 百分比略有下降。然而,这两种语言在数据科学家、工程师和分析师中仍然非常受欢迎。
可用性
最初用于研究和学术领域,R 已经不仅仅是一种统计语言。R 可以从 CRAN (综合 R 档案网)轻松下载。CRAN 还被用作一个包管理器,有超过 10,000 个包可供下载。许多流行的开源 ide 如 R Studio 可以用来运行 R。作为一名统计学专业的学生,我认为 R 在堆栈溢出方面有一个非常强大的用户社区。我在本科学习期间关于 R 的大多数问题都可以在 Stack Overflow 的 R 标签 Q 和 A 上找到答案。如果你刚刚开始学习 R,许多 MOOCs 如 Coursera 也提供入门 R 甚至 Python 课程。
在本地机器上设置 Python 工程环境也同样容易。事实上,最近的 MAC 电脑都内置了 Python 2.7 和几个有用的库。如果你像我一样是一个狂热的 Mac 用户,我建议查看 Brian Torres-Gil 的Mac OSX 上的 Python 权威指南以获得更好的 Python 设置。开源 Python 包管理系统,如 PyPI 和 Anaconda 可以很容易地从他们的官方网站下载。在这一点上,我可能应该提到 Anaconda 也支持 R。当然,大多数人更喜欢直接通过 CRAN 管理包。PyPI 或 Python 通常比 r 有更多的包。然而,并不是所有的 100,000+ 包都适用于统计和数据分析。
形象化
Python 和 R 都有优秀的可视化库。由 R Studio 的首席科学家 Hadley Wickham ,ggplot2创建,现在是 R 历史上最流行的数据可视化软件包之一。我完全爱上了 gg plot 2 的各种功能和定制。与 base R 图形相比,ggplot2 允许用户在更高的抽象层次上定制绘图组件。ggplot2 提供了超过 50 种适用于不同行业的地块。我最喜欢的图表包括日历热图、分层树状图和聚类图。塞尔瓦·普拉巴卡兰有一个关于如何开始使用 ggplot2 的精彩教程。
Calendar Heatmap (top left), Clusters (bottom left) and Hierarchical Dendrogram (right) in ggplot2
Python 也有很好的数据可视化库。 Matplotlib 及其 seaborn 扩展对于可视化和制作有吸引力的统计图非常有帮助。我强烈推荐你去看看 George Seif 的用 Python 编写的快速简单的数据可视化代码,以便更好地理解 matplotlib。与 R 的 ggplot2 类似,matplotlib 能够创建各种各样的图,从直方图到矢量场流图和雷达图。也许 matplotlib 最酷的特性之一是地形山体阴影,在我看来,这比 R raster 的hillShade()
功能更强大。
Topographic hillshading using matplotlib
R 和 Python 都有fleet . js的包装器,这是一个用 Javascript 编写的漂亮的交互式地图模块。我之前写过一篇文章,介绍了如何使用 follow 可视化房地产价格(follow 是 fleet . js 的 Python 包装)。Leaflet.js 是我使用过的较好的开源 GIS 技术之一,因为它提供了与 OpenStreetMaps 和 Google Maps 的无缝集成。您还可以使用 fleed . js 轻松创建吸引人的气泡图、热图和 choropleth 图。我强烈建议您查看 fleed . js 的 Python 和 R wrappers,因为与底图和其他 GIS 库相比,安装要简单得多。
或者, Plotly 是两种语言共有的令人惊叹的图形库。Plotly(或 Plot.ly)是使用 Python,特别是 Django 框架构建的。它的前端是用 JavaScript 构建的,集成了 Python、R、MATLAB、Perl、Julia、Arduino 和 REST。如果你正试图建立一个 web 应用程序来展示你的可视化,我肯定会推荐你去看看 Plotly,因为他们有很棒的带有滑块和按钮的交互图。
Plotly correlation plots of the Iris dataset
预测分析
正如我之前提到的,Python 和 R 都有强大的预测分析库。很难在高层次上比较两者在预测建模方面的表现。r 是专门作为统计语言编写的,因此与 Python 相比,它更容易搜索与统计建模相关的信息。简单的谷歌搜索logistic regression in R
会返回 6000 万个结果,这是搜索logistic regression in Python
的 37 倍。然而,对于具有软件工程背景的数据科学家来说,使用 Python 可能更容易,因为 R 是由统计学家编写的。虽然我发现与其他编程语言相比,R 和 Python 同样容易理解。
Kaggle 用户 NanoMathias 已经做了一个非常彻底的调查关于 Python 或 R 在预测分析中是否是一个更好的工具。他总结道,在数据科学家和分析师中,Python 和 R 用户的数量相当。他的研究中有一个有趣的发现,那就是从事编码工作 12 年以上的人倾向于选择 R 而不是 Python。这说明程序员选择 R 还是 Python 进行预测分析,无非是个人喜好。
Linear Discriminant Analysis with embeded scalings, R and Python user analysis
嗯(表示踌躇等)..所以普遍的共识是两种语言在预测的能力上非常相似。这有点无聊,不是吗?让我们使用 R 和 Python 将逻辑回归模型拟合到 Iris 数据集,并计算其预测的准确性。我选择 Iris 数据集是因为它很小并且缺少缺失数据。没有进行探索性数据分析(EDA)和特征工程。我只是做了一个 80-20 的训练测试分割,并用一个预测因子拟合了一个逻辑回归模型。
library(datasets)#load data
ir_data<- iris
head(ir_data)#split data
ir_data<-ir_data[1:100,]
set.seed(100)
samp<-sample(1:100,80)
ir_train<-ir_data[samp,]
ir_test<-ir_data[-samp,]#fit model
y<-ir_train$Species; x<-ir_train$Sepal.Length
glfit<-glm(y~x, family = 'binomial')
newdata<- data.frame(x=ir_test$Sepal.Length)#prediction
predicted_val<-predict(glfit, newdata, type="response")
prediction<-data.frame(ir_test$Sepal.Length, ir_test$Species,predicted_val, ifelse(predicted_val>0.5,'versicolor','setosa'))#accuracy
sum(factor(prediction$ir_test.Species)==factor(prediction$ifelse.predicted_val...0.5...versicolor....setosa..))/length(predicted_val)
95% accuracy achieved with R’s glm model. Not bad!
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix#load data
traindf = pd.read_csv("~/data_directory/ir_train")
testdf = pd.read_csv("~/data_directory/ir_test")
x = traindf['Sepal.Length'].values.reshape(-1,1)
y = traindf['Species']
x_test = testdf['Sepal.Length'].values.reshape(-1,1)
y_test = testdf['Species']#fit model
classifier = LogisticRegression(random_state=0)
classifier.fit(x,y)#prediction
y_pred = classifier.predict(x_test)#confusion matrix
confusion_matrix = confusion_matrix(y_test, y_pred)
print confusion_matrix#accuracy
print classifier.score(x_test, y_test)
90% accuracy achieved with Python sklearn’s LogisticRegression model
使用 R stat 的glm
函数和 Python scikit-learn 的LogisticRegression
,我将两个逻辑回归模型拟合到 Iris 数据集的随机子集。在我们的模型中,我们只使用了一个预测因子sepal length
来预测花的species
。两个模型都达到了 90%或更高的准确率,R 给出了稍好的预测。然而,这不足以证明 R 比 Python 有更好的预测模型。逻辑回归只是你可以用 Python 和 R 构建的许多预测模型中的一种。Python 挤掉 R 的一个方面是它构建良好的深度学习模块。流行的 Python 深度学习库包括 Tensorflow 、 Theano 和 Keras 。这些库都有足够的文档,我确信 Siraj Raval 有数百个关于如何使用它们的 Youtube 教程。老实说,我宁愿花一个小时在 Keras 中编写 dCNNs(深度卷积神经网络),也不愿花半天时间弄清楚如何在 r 中实现它们。 Igor Bobriakov 制作了一个出色的信息图,描述了 Python、Scala 和 r 中流行库的提交和贡献者数量。我强烈推荐阅读他的文章(下面提供了链接)。
“Comparison of top data science libraries for Python, R and Scala [Infographic]” — Igor Bobriakov
表演
测量编程语言的速度通常被认为是一项有偏见的任务。每种语言都有针对特定任务优化的内置特性(比如 R 如何针对统计分析进行优化)。用 Python 和 R 进行性能测试可以用许多不同的方法来完成。我用 Python 和 R 编写了两个简单的脚本来比较 Yelp 的学术用户数据集的加载时间,该数据集略超过 2g。
R
require(RJSONIO)
start_time <- Sys.time()
json_file <- fromJSON("~/desktop/medium/rpycomparison/yelp-dataset/yelp_academic_dataset_user.json")
json_file <- lapply(json_file, function(x) {
x[sapply(x, is.null)] <- NA
unlist(x)
})
df<-as.data.frame(do.call("cbind", json_file))
end_time <- Sys.time()
end_time - start_time#Time difference of 37.18632 secs
Python
import time
import pandas as pd
start = time.time()
y1 = pd.read_json('~/desktop/medium/rpycomparison/yelp-dataset/yelp_academic_dataset_user.json', lines = True)
end = time.time()
print("Time difference of " + str(end - start) + " seconds"#Time difference of 169.13606596 seconds
嗯……有意思。r 加载 json 文件的速度几乎是 Python 的 5 倍。众所周知,Python 比 R 有更快的加载时间,布莱恩·雷(Brian Ray)的 T2 测试(T3)证明了这一点。让我们看看这两个程序如何处理一个大的?csv 文件为。csv 是一种常用的数据格式。我们稍微修改了上面的代码,以加载西雅图图书馆库存数据集,它几乎有 4.5 千兆字节。
R
start_time <- Sys.time()
df <- read.csv("~/desktop/medium/library-collection-inventory.csv")
end_time <- Sys.time()
end_time - start_time#Time difference of 3.317888 mins
Python
import time
import pandas as pd
start = time.time()
y1 = pd.read_csv('~/desktop/medium/library-collection-inventory.csv')
end = time.time()
print("Time difference of " + str(end - start) + " seconds")#Time difference of 92.6236419678 seconds
呀!r 花了几乎两倍的时间来加载 4.5 千兆字节。csv 文件比 Python pandas (用于数据操作和分析的 Python 编程语言)。重要的是要知道,虽然 pandas 主要是用 Python 编写的,但是库的更重要的部分是用 Cython 或 c 编写的,这可能会对加载时间产生潜在的影响,具体取决于数据格式。
现在让我们做一些更有趣的事情。 Bootstrapping 是一种从总体中随机重新取样的统计方法。我以前做过足够的引导,知道这是一个耗时的过程,因为我们必须重复地对数据进行多次迭代。以下代码分别测试了在 R 和 Python 中引导 100,000 次复制的运行时:
R
#generate data and set boostrap size
set.seed(999)
x <- 0:100
y <- 2*x + rnorm(101, 0, 10)
n <- 1e5#model definition
fit.mod <- lm(y ~ x)
errors <- resid(fit.mod)
yhat <- fitted(fit.mod)#bootstrap
boot <- function(n){
b1 <- numeric(n)
b1[1] <- coef(fit.mod)[2]
for(i in 2:n){
resid_boot <- sample(errors, replace=F)
yboot <- yhat + resid_boot
model_boot <- lm(yboot ~ x)
b1[i] <- coef(model_boot)[2]
}
return(b1)
}
start_time <- Sys.time()
boot(n)
end_time <- Sys.time()#output time
end_time - start_time#Time difference of 1.116677 mins
Python
import numpy as np
import statsmodels.api as sm
import time
#generate data and set bootstrap size
x = np.arange(0, 101)
y = 2*x + np.random.normal(0, 10, 101)
n = 100000
X = sm.add_constant(x, prepend=False)#model definition
fitmod = sm.OLS(y, X)
results = fitmod.fit()resid = results.resid
yhat = results.fittedvalues#bootstrap
b1 = np.zeros((n))
b1[0] = results.params[0]
start = time.time()
for i in np.arange(1, 100000):
resid_boot = np.random.permutation(resid)
yboot = yhat + resid_boot
model_boot = sm.OLS(yboot, X)
resultsboot = model_boot.fit()
b1[i] = resultsboot.params[0]
end = time.time()#output time
print("Time difference of " + str(end - start) + " seconds")#Time difference of 29.486082077 seconds
r 花了几乎两倍的时间来运行引导程序。这是相当令人惊讶的,因为 Python 通常被认为是一种“慢”的编程语言。我慢慢开始后悔用 R 而不是 Python 来运行我所有的本科统计学作业。
结论
本文只讨论了 Python 和 R 之间的基本区别。就个人而言,我会根据手头的任务在 Python 和 R 之间进行转换。最近,数据科学家一直在推动在结合中使用 Python 和 R。很有可能在不久的将来会出现第三种语言,并最终在流行程度上超过 Python 和 R。作为数据科学家和工程师,跟上最新技术并保持创新是我们的责任。最后,强烈推荐你阅读 Karlijn Willems 的选择 R 还是 Python 做数据分析?一张信息图。它为我们在本文中讨论的内容提供了一个很好的视觉总结,并提供了额外的信息,包括就业趋势和平均工资。在下面评论,让我知道你更喜欢哪种语言!
感谢您阅读我的文章。
数据科学
原文:https://towardsdatascience.com/data-science-43c246d4eebc?source=collection_archive---------5-----------------------
Minder 建议引擎:
以下是如何使用随机森林进行数据分类的详细说明。
我们分析了由一个类似 Tinder 的配对网站产生的数据, Minder 面向一个特定的社区。其工作方式是,当您登录时,Minder 的引擎会根据您保存的偏好向您推荐配置文件。你可以向右滑动,即喜欢的个人资料,或者你可以向左滑动丢弃。任何显示过一次的个人资料,在任何情况下都不会再向您显示。因此,如果两个人互相喜欢对方,他们的详细资料会透露给对方。
为了增加匹配的可能性,我们显然需要了解人们的刷卡行为。我们收集了一百万条最新的刷卡数据,并决定使用由 Python 提供的流行生态系统来分析这些数据。我们用这一百万个数据点来训练我们的引擎。然后,我们的引擎预测一个人喜欢另一个人的可能性。
由于两种性别之间的性别行为非常不同(如下图所示),我们最终决定为男性和女性用户使用单独的预测分类器。
图表中的真和假值是候选人喜欢另一个还是不喜欢。我们可以看到,男性喜欢展示给他们的 58.65%的简介,而女性只喜欢 5.7%。这与男性相比甚至不到十分之一。
最终,我们实现了正确预测一个人是否会喜欢某个个人资料的结果,女性用户的准确率大约为 94%,男性用户的准确率为 83%。
详细信息分为以下三个部分:
I:使用机器学习的数据分类
首先,我们将大类分开,并确定根据性别和 T21 行为来分离数据可能是个好主意。我们决定使用由 Python 提供的流行生态系统来分析刷卡数据。我们的最终目标是创建一个 web 服务(RESTful ),通过提供两个用户的个人资料作为输入,提供一个人喜欢另一个人的大概情况。
导入库
我们将使用由 Pandas 库提供的数据帧来加载和操作数据。然后我们将使用 Matplotlib (及其衍生 Seaborn )库来可视化数据的不同方面。数字操作通常用 Numpy 数组完成,对于机器学习,我们使用 Scikit-Learn 。使用 pip 或任何其他合适的 Python 包管理器可以很容易地安装这些库。
import os
import datetime
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report,confusion_matrix
from sklearn.externals import joblib
读取数据
我们已经对数据库中的所有数据进行了反规范化,并将其转储到一个平面 CSV 文件中。
data=pd.read_csv('1M.csv')
print data.shape data.head(2)----output----
(1000000, 27)
"p1_liked","p2_liked","confirmed","unmatched","answeredFromTelegram","p1_id","p1_country","p1_gender","p1_education","p1_flavor","p1_age","p1_timezone","p1_ethnicity","p1_languages","p1_religiosity","p1_premium","p2_id","p2_country","p2_gender","p2_education","p2_flavor","p2_age","p2_timezone","p2_ethnicity","p2_languages","p2_religiosity","p2_premium"
FALSE,,FALSE,,,151606,"US","male","graduate_degree","sunni",26,"-5","{""South Asian""}","{Bengali}","3.0661764705882355",FALSE,181761,"US","female","graduate_degree","sunni",26,"-4","{""South Asian""}","{Bengali,English,Hindi,Urdu}","2.9233774038461537",FALSE
FALSE,,FALSE,,,266475,"US","female","graduate_degree","sunni",26,"-4","{""South Asian""}","{Bengali}","1.5865208360015366",FALSE,213638,"US","male","graduate_degree",,,"-6",,,,FALSE
删除无用的列
当我们决定提取数据时,我们从数据库中收集了(几乎)所有可能用到的信息。后来我们决定删除几列,因为这些不是用户决策(刷卡)过程中使用的信息的一部分。
useless_columns = ['answeredFromTelegram', 'confirmed', 'p1_timezone', 'p2_timezone', 'unmatched'] data.drop(useless_columns, axis=1, inplace=True)
附:这些文章中使用的“风味”一词是指一个特定的宗教派别。
进一步反规格化数据
刷卡数据的结构是这样的,每个刷卡行都有一个名为[p1_liked]的字段,该字段包含第一个人(p1)的刷卡结果( true 表示 like ),第一个人(p1)被展示给另一个人(p2 的)的简档。当(且如果)p2 显示 p1 的配置文件时,使用相同的行,数据存储在名为[p2_liked]的字段中。如果两个字段都有真值,那么字段【确认】被设置为真值。请注意,我们之前已经删除了确认数据。
因为这些行(其中[p2_liked]不为空)包含两组数据,所以让我们复制它们,然后在切换[p1_…]和[p2_…]数据后将它们与主数据重新合并。这将使[p2_liked]无用,我们将删除它。
第一步是复制[p2_liked]不为空 T27 的行,即不是 T28 真 T29 就是 T30 假 T31。接下来,我们将交换其列的名称,以便交换 p1 和 p2 的角色。这对我们来说是一个新的数据点。
datap2=data[data.p2_liked>=0]
print datap2.shapep2_cols={'p1_age' : 'p2_age' , 'p1_country' : 'p2_country' ,
'p1_education' : 'p2_education' , 'p1_ethnicity' : 'p2_ethnicity' ,
'p1_flavor' : 'p2_flavor' , 'p1_gender' : 'p2_gender' ,
'p1_id' : 'p2_id' , 'p1_languages' : 'p2_languages' ,
'p1_liked' : 'p2_liked' , 'p1_premium' : 'p2_premium' ,
'p1_religiosity' : 'p2_religiosity' , 'p2_age' : 'p1_age' ,
'p2_country' : 'p1_country' , 'p2_education' : 'p1_education' ,
'p2_ethnicity' : 'p1_ethnicity' , 'p2_flavor' : 'p1_flavor' ,
'p2_gender' : 'p1_gender' , 'p2_id' : 'p1_id' ,
'p2_languages' : 'p1_languages' , 'p2_liked' : 'p1_liked' ,
'p2_premium' : 'p1_premium' , 'p2_religiosity' : 'p1_religiosity' }
datap2n= datap2.rename(columns=p2_cols)data2 = pd.concat([data, datap2n], axis=0);
print data2.shape
data2= data2.rename(columns={'p1_liked':'liked'})----output----
(43089, 22)
(1043089, 22)
我们看到数据中有 43089 行,其中两个人都刷了对方的个人资料。最后,我们将新数据帧与主数据合并,并将新数据帧称为 **data2。**我们也把[p1_liked]重命名为[liked]。[liked]列有 True/False 值,这些值就是我们的分类器将分类到的类。
根据性别分割数据
让我们在[p1_gender]的基础上分割数据。我们将很快证明我们的选择。
dataf = data2[(data2.p1_gender=='female') & (data2.p2_gender=='male')]
datam = data2[(data2.p1_gender=='male') & (data2.p2_gender=='female')]
print dataf.shape
print datam.shape----output----
(344951, 22)
(695762, 22)
让我们删除更多无用的列。记住我们不需要用户*id’*s 和性别值作为分类器。
useless_columns=['p1_gender','p2_gender','p2_liked','p1_id','p2_id']
datam.drop(useless_columns, axis=1, inplace=True)
dataf.drop(useless_columns, axis=1, inplace=True)----output----
count 1043089
unique 2
top False
freq 614942
Name: liked, dtype: object
行为分析
这里有一个根据性别分离数据集的基本原理。他们的行为完全不同。
dmvc = datam.liked.value_counts()
dfvc = dataf.liked.value_counts()
df = pd.DataFrame([dmvc,dfvc])
df.index = ['Males','Females']
df.plot(kind='bar', stacked=True);
男性喜欢向他们展示的 58.65%的简介,而女性只喜欢 5.7%。甚至不到十分之一相比男性。
dmm = datam.liked.mean()
dfm = dataf.liked.mean()
df = pd.DataFrame([dmm,dfm])
df.index = ['Males','Females']
df.plot(kind='bar', stacked=True);
print " True liked values - Males- {} ({:.2%})".format(datam.liked.sum(), datam.liked.mean())
print " True liked values - Females- {} ({:.2%})".format(dataf.liked.sum(), dataf.liked.mean())----output----
True liked values - Males- 408099 (58.65%)
True liked values - Females- 19791 (5.74%)
现在保存,让分析在单独的数据集上继续进行。
datam.to_csv("1M-datam.csv", index=False)
dataf.to_csv("1M-dataf.csv", index=False)
接下来:我们将分析女性用户的行为。
二:数据分析
让我们从加载 1M-dataf.csv 开始,这个文件包含了女性用户的滑动行为。我们假设已经加载了适当的库( Pandas、Matplotlib、Seaborn、Numpy、Scikit-Learn )。
加载数据
datafile='1M-dataf.csv'
data=pd.read_csv(datafile)
print data.shape
print list(data)
print data.liked.mean()
print data.liked.describe()----output----
(344951, 17)
['p1_age', 'p1_country', 'p1_education', 'p1_ethnicity', 'p1_sect', 'p1_languages', 'liked', 'p1_premium', 'p1_religiosity', 'p2_age', 'p2_country', 'p2_education', 'p2_ethnicity', 'p2_sect', 'p2_languages', 'p2_premium', 'p2_religiosity']
0.0573733660723
count 344951
unique 2
top False
freq 325160
Name: liked, dtype: object
正如我们从上一篇文章中所记得的,在[喜欢的]列中几乎 94.7%的值(355160/244951)都是错误的。
首先,我们向我们的数据框架添加一个新列[same_country]。如果国家相同或不同,添加信息,减少了我们的交叉类别很多。对于宗教派别来说也是如此。
data['same_country']=(data['p1_country']==data['p2_country'])
data['same_religion']=(data['p1_flavor']==data['p2_flavor'])
处理数字数据和相关的 N/A
print data.shape
data.describe().loc['count',:]----output----
(344951, 19)
p1_age 332184
p1_religiosity 257957
p2_age 328447
p2_religiosity 233237
计数值的差异是缺失值,或 NaN。我们将用中间值填充缺失的[年龄]值,用平均值填充缺失的[宗教信仰]值。
print (data.p1_religiosity.mean(), data.p1_religiosity.median(), data.p2_religiosity.mean(),
data.p2_religiosity.median())
print (data.p1_age.mean(), data.p1_age.median(),
data.p2_age.mean(), data.p2_age.median())
data.p1_age.fillna(data.p1_age.median(), inplace=True)
data.p2_age.fillna(data.p2_age.median(), inplace=True)
data.p1_religiosity.fillna(data.p1_religiosity.mean(),
inplace=True)
data.p2_religiosity.fillna(data.p2_religiosity.mean(),
inplace=True)----output----
(3.07051616485, 3.03669724771, 2.79660425283, 2.96941896024)
(26.1033403174, 25.0, 28.1010147756, 28.0)
分析开始
Seaborn 库提供了更简单的 API 来创建更好的可视化。
1。国家智慧
sns.countplot(x="p1_country", hue='liked', data=data);
让我们看一下标准化的数据,以便理解。
sns.barplot(x="p1_country", y='liked', hue='same_country',
data=data, ci=None);
按国家查看喜欢的个人资料。
因为就频率而言有三个不同的组:
- 美国
- CA/GB
- 世界其他地方
让我们分别来看。
fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="p1_country", hue='same_country',
data=data[(data.liked) & (data.p1_country=='US')],
ax=ax[0]);
sns.countplot(x="p1_country", hue='same_country',
data=data[(data.like) & ((data.p1_country=='CA')|
(data.p1_country=='GB'))], ax=ax[1]);
sns.countplot(x="p1_country", hue='same_country',
data=data[(data.liked) & (data.p1_country!='US')
&(data.p1_country!='CA') & (data.p1_country!='GB')],
ax=ax[2]);
fig.show()
所以国家分为四类
- 美国
- 加拿大
- 千兆字节
- 其他人
同样,我们将删除[p2_country]数据,保留[same_country],因为来自其他国家的数据点非常少,所以我们将它们分组在一起。我们将[p1_country]重命名为[country],并删除[p2_country]。
data.p1_country[(data.p1_country!='US') & (data.p1_country!='CA')
& (data.p1_country!='GB')]='XX'
data.rename(columns={"p1_country":"country"}, inplace=True)
data.drop("p2_country", inplace=True, axis=1)
绘制上面的图表表明,数据看起来仍然有意义。
fig, ax =plt.subplots(nrows=2, ncols=3, figsize=(15,10))
sns.countplot(x="country", hue='liked', data=data, ax=ax[0,0]);
sns.barplot(x="country", y='liked', hue='same_country', data=data, ci=None, ax=ax[0,1]);
sns.countplot(x="country", hue='same_country', data=data[(data.liked) & (data.country=='US')], ax=ax[1, 0]);
sns.countplot(x="country", hue='same_country', data=data[(data.liked) & ((data.country=='CA')|(data.country=='GB'))], ax=ax[1, 1]);
sns.countplot(x="country", hue='same_country', data=data[(data.liked) & (data.country!='US') & (data.country!='CA') & (data.country!='GB')], ax=ax[1,2]);
fig.show()
2。宗教
宗教和教派信息无疑是目标群体中的一个关键因素。
fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="p1_flavor", hue='liked', data=data, ax=ax[0]);
sns.barplot(x="p1_flavor", y='liked', data=data, ci=None, ax=ax[1]);
sns.barplot(x="p1_flavor", y='liked', hue='p2_flavor', data=data, ci=None, ax=ax[2]);
fig.show()
“其他人”很少,让我们把他们和“仅仅是穆斯林”合并起来,然后重复。
data.p1_flavor[(data.p1_flavor=='other')]='just_muslim'
data.p2_flavor[(data.p2_flavor=='other')]='just_muslim'
fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="p1_flavor", hue='liked', data=data, ax=ax[0]);
sns.barplot(x="p1_flavor", y='liked', data=data, ci=None, ax=ax[1]);
sns.barplot(x="p1_flavor", y='liked', hue='p2_flavor', data=data, ci=None, ax=ax[2]);
fig.show()
2.1 宗教狂热
宗教狂热呢?这是每个用户给出的关于他/她自己的信息,他/她有多虔诚,等级为 1-5。让我们先把数据转换成最接近的整数,然后画出来。
data=data.round({'p1_religiosity': 0, 'p2_religiosity': 0})
data.p1_religiosity=data.p1_religiosity.astype(int)
data.p2_religiosity=data.p2_religiosity.astype(int)
fig, ax =plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.barplot(x="p1_religiosity", y='liked', data=data, ci=None, ax=ax[0]);
sns.barplot(x="p1_religiosity", y='liked', hue='p2_religiosity', data=data, ci=None, ax=ax[1]);
fig.show()
所以看起来宗教相关性仍然比宗教告诉我们更多,但是宗教图表中的微小差异也可能帮助我们。两个都留着吧。
3。高级用户
fig, ax =plt.subplots(nrows=1, ncols=2, figsize=(15,5))
sns.barplot(x='p1_premium', y='liked', hue='p2_premium',
data=data, ci=None, ax=ax[0]);
sns.barplot(x='p2_premium', y='liked', hue='p1_premium',
data=data, ci=None, ax=ax[1]);
fig.show()
高级用户更有可能被喜欢 **。**但这一点受到了怀疑,因为高级用户的个人资料更经常被展示。因此,让我们保留 p2 的保费数据,并在我们的培训中使用它来提高他们的概率,以便实际上不需要在最后计算保费。
p1 的先决条件也并非完全无关紧要。高级用户选择了更多的选择(右图)。但是这个事实并没有改善我们的预测。
4。教育
我们有一种预感,教育可能是一个关键因素。让我们验证一下直觉。但首先让我们打印我们的数据库中给出的独特的教育资格。
print data.p1_education.unique()array(['graduate_degree', 'college_degree', 'undergraduate', 'other',
'high_school', nan], dtype=object)fig, ax =plt.subplots(nrows=1, ncols=2, figsize=(15,5))
edu_o=['graduate_degree', 'undergraduate', 'college_degree', 'other', 'high_school']
sns.countplot(x="p1_education", data=data, order=edu_o, ax=ax[0]);
sns.barplot(x="p1_education", y='liked', hue='p2_education', data=data, ci=None, order=edu_o, hue_order=edu_o, ax=ax[1]);
fig.show()
所以教育似乎是影响决策的一个因素。既然反对这些的用户行为是相似的,让我们合并本科生,大学和其他。它们似乎同等重要。让我们称之为 BS。
data.p1_education[(data.p1_education=='college_degree')|(data.p1_education=='undergraduate')|(data.p1_education=='other')]='BS'
data.p2_education[(data.p2_education=='college_degree')|(data.p2_education=='undergraduate')|(data.p2_education=='other')]='BS'
为了确保万无一失,让我们绘制图表。
fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="p1_education", data=data, ax=ax[0]);
sns.countplot(x="p1_education", data=data[data.liked], ax=ax[1]);
sns.barplot(x="p1_education", y='liked', hue='p2_education', data=data, ci=None, ax=ax[2]);
fig.show()
既然我们已经处理完了数据,是时候继续了。
处理列
关于我们将要使用的分类器(随机森林)的一点是,它可以很好地处理数字数据或虚拟分类数据(也称为指示变量)。现在我们有了所有的列(除了多值数组:[种族]和[语言]),让我们对它们进行适当的虚拟化和类型转换。
因为我们已经清理了数字字段(适当地填充了 NaN 值),所以让我们为训练/测试创建一个新的数据副本,称为 dt 。
dt = data[['p1_age','p2_age','p1_religiosity','p2_religiosity']].copy()
现在让我们为每个分类字段创建虚拟变量:[国家、教育、宗教(风味)、溢价]。
datac = pd.get_dummies(data.country, prefix="ct")
dt = pd.concat([dt,datac],axis=1)
dt = pd.concat([dt,data.same_country.astype(int)],axis=1)datae1 = pd.get_dummies(data.p1_education, prefix="edu1")
dt = pd.concat([dt,datae1],axis=1)
datae2 = pd.get_dummies(data.p2_education, prefix="edu2")
dt = pd.concat([dt,datae2],axis=1)datar = pd.get_dummies(data.p1_flavor, prefix="rel")
dt = pd.concat([dt,datar],axis=1)
dt = pd.concat([dt,data.same_religion.astype(int)],axis=1)dt = pd.concat([dt,data.p2_premium.astype(int)],axis=1)
我们已经完成了标准数据。有两个多值字段[种族、语言]。这些多值数据需要处理,因为我们将它们表示为 JSON 数组。我们将简单地使用我们对实际实现的理解来获得语言和种族列表。我们将遍历所有语言/种族,并进行子字符串比较,以查看我们的语言/种族是否在字段数据中。让我们创建一个新的数据框,并在那里进行一些分析。
首先针对语言:
langs=["Arabic", "Urdu", "Turkish", "Spanish", "Russian", "Pashtu", "Malaysian", "Italian", "Indonesian", "Hindi", "German", "French", "Filipino", "Farsi", "English", "Dutch", "Chinese", "Bengali"]dfl = pd.DataFrame()
dl1=data.p1_languages
dl2=data.p2_languagesdfl["liked"]=data.liked.astype(int)
dfl["same_language"]=0
for l in langs:
ln1="lang1_"+l
ln2="lang2_"+l
dfl[ln1]=(dl1.str.contains(l)==True)
dfl[ln2]=(dl2.str.contains(l)==True)dfl["same_language"]=dfl["same_language"]+((dfl[ln1])*(dfl[ln1]==dfl[ln2]))fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="same_language", data=dfl, ax=ax[0]);
sns.countplot(x="same_language", data=dfl[dfl.liked==1], ax=ax[1]);
sns.barplot(x="same_language", y='liked', data=dfl, ci=None, ax=ax[2]);
fig.show()
请注意,我们还为[same_language]创建了字段,这有望使分析变得更加简单。下一站【种族】。
dfe = pd.DataFrame()
de1=data.p2_ethnicity
de2=data.p2_ethnicitydfe["liked"]=data.liked.astype(int)
dfe["same_ethnicity"]=0
ethnics=["Afghan", "African American", "Arab (Khaleej)", "Arab (Levant)", "Arab (North Africa)", "Caucasian", "East African", "East Asian", "Hispanic", "Kurdish", "Persian", "South Asian", "Sub-Sahara African", "Turkish", "West African", "Other"]
for e in ethnics:
et1="ethn1_"+e
et2="ethn2_"+e
dfe[et1]=(de1.str.contains(e)==True)
dfe[et2]=(de2.str.contains(e)==True)
dfe["same_ethnicity"]=dfe["same_ethnicity"]+((dfe[et1])*(dfe[et1]==dfe[et2]))fig, ax =plt.subplots(nrows=1, ncols=3, figsize=(15,5))
sns.countplot(x="same_ethnicity", data=dfe, ax=ax[0]);
sns.countplot(x="same_ethnicity", data=dfe[dfe.liked==1], ax=ax[1]);
sns.barplot(x="same_ethnicity", y='liked', data=dfe, ci=None, ax=ax[2]);
fig.show()
请注意,图表显示了喜欢的简介的匹配语言/声明种族的频率。让我们最后把这个数据加到 dt 上。我们还需要将目标列 *liked、*添加到 dt 中,然后将数据帧保存到一个文件中。
dt = pd.concat([dt,dfl.same_language.astype(int)],axis=1)
dt = pd.concat([dt,dfe.same_ethnicity.astype(int)],axis=1)
dt = pd.concat([dt,data.liked.astype(int)],axis=1)
print dt.shape
dt.to_csv("dataf-categorical.csv", index=False)----output----
(344951, 23)
在填充缺失值、创建虚拟(指示)变量和减少字段数量(维度缩减)之后,我们可以看到我们的数据由 23 个属性组成。在下一步中,我们将训练我们的分类器,看看我们的进展如何。
三:培训/储蓄和测试
我们将使用随机森林分类器,众所周知它在这类问题中工作得很好。同样,我们假设已经加载了适当的库( Pandas、Matplotlib、Seaborn、Numpy、Scikit-Learn )。
让我们加载数据,并提醒自己所涉及的维度。
datafile="1M-dataf-categorical"
data=pd.read_csv(datafile+".csv")
print data.shape
print ("Percentage of likes: {:.2%}".format(data.liked.mean()))----output----
(344951, 23)
Percentage of likes: 5.74%
我们有 345K 的刷记录,只有 5.74%的喜欢,其余都是不喜欢。
创建训练和测试数据集
让我们将数据分为训练数据和测试数据。我们将在每个集合中随机放置一半数量的行。
num_test = 0.5
train, test, train_target, test_target =
train_test_split(data.drop(['liked'], axis=1),
data.liked, test_size=num_test, random_state=23)
train_features = train.values
test_features = test.valuesprint "Training Data (rows, columns): {}".format(str(train_features.shape))
print "Testing Data (rows, columns): {}".format(str(test_features.shape))----output----
Training Data (rows, columns): (172475, 22)
Testing Data (rows, columns): (172476, 22)
字段[liked]已从特征数据中分离出来,并将用作训练和测试的目标类数据。
训练并保存随机森林模型
clfr = RandomForestClassifier(max_depth = 35, min_samples_split=2, n_estimators = 20, random_state = 2)start = time.time()
model = clfr.fit(train_features,train_target)
end = time.time()print("Training Time: {:.2f} seconds.".format(end - start))
print("Classifier Score: {:.2%}".format(model.score(train_features,train_target)))
joblib.dump(model, datafile+'-RFclf.pkl');
注意: clfr 是我们用一些适当的参数初始化的主 classier 对象。 fit 函数是核心训练函数,所以我们对它进行计时,以便对在我的 core-i3 linux 机器上训练大数据所需的时间进行估计。我们将分类器的准确性打印在训练数据上。记住极高的训练效率最有可能导致过拟合的问题。我们的模型使用 SK-Learm 中的 joblib 模块保存在 pkl 文件中,并且可以重复使用。
----output----
Training Time: 6.31 seconds.
Classifier Score: 97.31%
这似乎令人印象深刻。所以现在我们当然可以原样使用模型,但是仅仅为了好玩,我们将重新加载模型。
重新加载模型并根据测试数据预测结果
clf = joblib.load(datafile+'-RFclf.pkl')
pred = clf.predict(test_features)
print("Accuracy: {:.2%}".format((test_target.values==pred).mean())----output----
Accuracy: 93.34%
请注意,我们可能使用了
clf.score(test_features,test_target)
这是由 sk-learn 提供的功能,但是为了准确起见,我们使用了简单的比较计数。结果会是一样的。
所以现在这是一个很好的结果,但是通过预测每一个配置文件匹配为假,它可能很容易方便地(但显然是无用地)增加,因为它们中的 95 %应该是假的,我们将获得 95%的准确性,没有假阴性。但是输出对我们没有任何帮助。对于 95%的简档,我们可以通过随机预测不喜欢的达到 90%以上的准确率。对于“有用”的结果,我们需要通过使用所谓的混淆矩阵来分析行为。
confusion_matrix(test_target,pred)----output----
array([[160001, 2554],
[ 8929, 992]])
但这并没有给我们太多的洞察力,相反,让我们自己重新计算这些值,以了解发生了什么。
aq1=(test_target.values==pred) & (test_target.values==0)
aq2=(test_target.values!=pred) & (test_target.values==0)
aq3=(test_target.values!=pred) & (test_target.values==1)
aq4=(test_target.values==pred) & (test_target.values==1)
print " True Negative {} ({:.2%})".format(aq1.sum(), aq1.mean())
print "False Positive {} ({:.2%})".format(aq2.sum(), aq2.mean())
print "False Negative {} ({:.2%})".format(aq3.sum(), aq3.mean())
print " True Positive {} ({:.2%})".format(aq4.sum(), aq4.mean())----output----
True Negative 160001 (92.77%)
False Positive 2554 (1.48%)
False Negative 8929 (5.18%)
True Positive 992 (0.58%)
这是首次尝试。接下来,我们当然可以玩我们削减的参数(在第二部分)以及设计新功能。由于喜欢的比例已经很低,我们可能得不到足够的匹配。为了理解这一点,考虑一下预测函数是如何工作的。分类器给出一个数据点(输入行)属于某一类的可能性(概率)。如果喜欢(比如 0.6)的概率高于不喜欢 (0.4),那么预测将为真,否则为假。因此,即使我们的分类器预测到不像,它也可能是 100%到 0%的决定,而不是 51%到 49%的决定。对于后一种情况,最好将其作为可能的候选返回,因为可能的简档的数量已经非常少了。
幸运的是,预测结果可以作为类别概率而不是类别值来检索(在我们的例子中是真/假)。
print clf.predict_proba(test_features)----output----
array([[ 1\. , 0\. ],
[ 1\. , 0\. ],
[ 0.44, 0.56],
...,
[ 1\. , 0\. ],
[ 0.98, 0.02],
[ 1\. , 0\. ]])
返回的数组维数为 172476✕2.针对每一行,我们得到两个概率值,分别针对不像和像。我们可以对这个数组进行排序,并使用最好的几个结果来建议候选项。
对男性用户的数据进行同样的处理,最终达到 83%的准确率。
原载@ 努曼的博客2017 年 7 月 31 日
数据科学:成为数据科学家的 5 项技能
原文:https://towardsdatascience.com/data-science-5-skills-to-become-a-data-scientist-9a5ea6ab0a09?source=collection_archive---------14-----------------------
Photo by William Iven on Unsplash
不管你目前是否是一名数据科学家,如果你有学习新技能的冲动,总有机会成为一名数据科学家。许多年轻的 IT 人员甚至经验丰富的经理经常问我他们成为数据科学家的各种途径。几天前,我在创建一份工作描述,并在想…嗯…我应该雇用哪种数据科学家?
牢记这一点,我想在这里写下我的想法,给任何渴望成为数据科学家或寻求职业改变的人。因此,我在这里列出了我希望公司聘用的数据科学家具备的 5 项最重要的技能。
- 编程技巧
我强烈推荐的一件事是精通一种编程语言,它可以是 R、Python 或 Julia。但至少要擅长其中一项。随着数据科学中无数产品的出现,我看到了我称之为 GUI 一代的大军。我相信编程打开了你大脑的逻辑部分,这也是我感兴趣的。做数据科学家要有逻辑。
2.数学—统计&线性代数
主要是为了了解各种统计模型的“黑箱”背后发生了什么。你可能会说 Python 和 R 中有许多现成的库,你可以使用它们。然而,理解模型如何工作以及如何调整每个模型的变量以获得期望的精度是非常重要的。良好的统计和线性代数知识将是你的数据科学技能库的一个很好的补充。
3。机器学习
如果你将成为一名数据科学家,100%肯定你应该对机器学习技术和算法有很好的理解,如 KNN、朴素贝叶斯、SVM、决策树、逻辑回归等。您应该很好地了解如何使用 Python 和 R 的库来实现这些模型。拥有机器学习模型和工作流的操作化经验对于在生产中成功部署模型非常重要。尽管如此,您也应该对使用像 Numpy、Plotly、Pandas、Seaborn 等工具包有很好的理解。
4。通信
我强烈建议寻找一名数据科学家,他应该有开放的思维,渴望学习和进步新的和即将到来的技能。一个乐于自信地承担责任并带来新想法的人,这有助于改善数据平台和利用数据实现商业价值。数据科学家拥有通过数据“讲故事”的能力,将数学结果转化为可操作的见解或干预措施,这一点非常重要。处于业务、技术和数据的交汇点,个人应该具备用业务语言向每个利益相关者讲述数据科学故事的技能。可以通过使用 Tableau 等 BI 工具或使用 Python 或 R 可视化框架(如 Dash 或 Shiny)来直观地讲述一个故事。
5。数据驱动的思维模式
我强烈倾向于雇佣一个数据驱动的问题解决者。我强烈建议一个有抱负的数据科学家培养数据争论和探索的技能。学习更多关于数据架构和数据建模的基础知识以及数据库平台的动态将是一个很好的补充。扎实的 SQL 知识对数据分析和探索非常有帮助。对于数据科学家来说,拥有构建机器学习模型的领域知识非常重要。因此,努力学习更多关于业务如何运作以及哪些因素影响业务和客户行为的知识。
除了上述主要技能,我强烈建议有抱负的数据科学家使用各种开放数据平台上可用的数据集来构建他们的项目组合。在 Kaggle 上参加数据科学竞赛,因为你开始解决各种问题,这些问题可以帮助你建立数据科学领域的技能。但是你需要具备的最重要的技能是逻辑思维和思想开放。
成为一名数据科学家不仅仅是能够编写代码,还需要了解业务领域,并对数据有一个非常开放和逻辑的观点。成为一名优秀的数据科学家需要大量的探索、实践和耐心,我能给你的最后一个建议是不要落入互联网上声称能让你在几天内成为优秀数据科学家的资源陷阱。
数据科学:个人应用
原文:https://towardsdatascience.com/data-science-a-practical-application-7056ec22d004?source=collection_archive---------4-----------------------
记录 2017 年的重量挑战
我经常从学习数据科学的人那里听到的一个挫折是,很难从书本上的玩具示例跳到现实世界的问题。任何学习过程都必须从简单的问题开始,但在某些时候,我们需要超越精选的例子,进入杂乱的、人为生成的数据。这张图很好地总结了我在数据科学教育中所经历的事情,尽管我还没有翻过这座诅咒之山,但我已经通过尝试(并且经常失败)大量使用真实数据的项目爬上了一部分:
Technology Learning Curve (Source)
爬上这条曲线的最好方法是随着时间的推移建立你的信心,没有比一个与你的生活直接相关的项目更好的起点了。这篇文章将展示数据科学对我和我父亲健康的直接应用,一个有明显好处的个人问题,如果曾经有过的话!
好消息是,为了将数据科学应用于个人利益,你不需要大型科技公司的数据或资源,只需要一套一致的测量方法和免费的开源分析工具,如 R 和 Python。如果你停下来看看,你会发现你周围都是等待被跟踪的数据流。你可能每天早上都站在磅秤上,根据结果,祝贺或贬低自己,然后第二天再忘记。然而,花几秒钟时间,在电子表格中记录每天一次的体重,可以在几个月后产生一个有用而干净的数据集(,增加你达到目标的几率)。这些数据非常适合让您在实际问题上发展您的数据科学技能。
就其核心而言,数据科学从根本上讲是从数据中提取智能,这篇文章展示了数据科学如何产生改善现实世界结果的见解。数据科学是一个多学科领域,由计算机科学、统计学和工程学组成,但最重要的方面也是最容易被忽视的方面:通信。你的分析可能很棒,但归根结底,经理、教授和公众更关心最终结果,而不是确切的方法。能够清楚地传达数据科学问题的答案和分析的局限性是任何数据科学工具箱中的宝贵资产。
在这篇文章中,我省略了所有用于创建图表的代码(在 R 中完成),以便专注于结果以及我们可以从它们中学到什么,但是所有代码都可以在 project GitHub 页面上找到,以便任何想要了解神奇是如何发生的人使用。同样,这些数据在 GitHub 和 Google Drive 上以一个 csv 文件的形式提供给那些想跟进的人。我还试图为那些想了解更多的人提供特定主题的资源。现在,是时候深入了解 2017 年大体重挑战的数据科学了!
**免责声明:**首先,本项目呈现的所有数据都是真实的!我爸爸和我都相信开放数据(在一定程度上),我们绝对不在乎让自己看起来比实际上更成功。第二,我不会试图向你推销任何减肥产品(尽管我确实考虑过把这篇文章叫做“如何用数据科学减肥”)。
2017 年的重量大挑战
多年来,我和父亲一直善意地互相取笑我们各自的挣扎——我的是增加体重,他的是减轻体重——我和父亲决定最好的解决办法是体重变化比赛。我父亲的表现将以体重减轻来衡量,而我的则以体重增加来衡量。唯一的规则是:我们必须每天称重一次,比赛从 8 月 18 日开始,到 2018 年 1 月 1 日结束,输的人必须向赢的人支付赢的人体重变化的两倍,以磅为单位。因为这是一个现实世界中的问题,第一条和第二条规则都不完全成立!尽管如此,在比赛过程中(实际上在 1 月 6 日结束),我们每个人都收集了超过 100 个数据点,足以得出许多有趣的结论。
竞争对手
- 我(威尔):大学年龄,男性,5 英尺 11 英寸,起始体重 125.6 磅,学生,偶尔跑超级马拉松
- 爸爸(克雷格):壮年男性(我让你猜猜是多少岁),5 英尺 11 英寸,起始体重 235.2 磅,办公室职员,前竞技举重运动员
我们都决定尽可能开诚布公地面对挑战,并告诉家人和朋友关于比赛的事情,以迫使我们坚持到底。在收到大量善意的建议后,我们制定了各自的策略。我决定开始吃午餐,因为我已经养成了不吃午餐的不健康习惯,以便专注于我在美国宇航局的实习工作。我爸爸想吃完全相同的饮食,但减少份量。这似乎是一个明智的决定,因为这意味着他不必考虑节食,而是做同样的食物,用更小的盘子盛着。他还决定通过长距离散步进行锻炼,强调不需要短期减肥计划,而是需要更健康的整体生活方式。
结果
不妨从整个结果图开始。
Weight Challenge Results
就这样,对吗?整个比赛总结成一幅画。嗯,不完全是。这是一个好的开始,但从我们对数据的研究中还可以获得很多真知灼见。通过数据绘制的线是使用“黄土”回归方法制作的模型,而点是实际测量值。马上我们可以看到我们两个都走在正确的方向上!然而,这个图表掩盖了很多信息。我们甚至无法判断谁赢了!为此,我们可以用图表显示我们的体重从起始体重开始的变化,单位是磅。
Absolute Weight Change
我们在这里使用绝对值,所以数字越大越好。我们可以清楚地看到,虽然比赛一开始很接近,但我的父亲(克雷格)在最后拉开了距离,并以相当大的优势获胜。恭喜爸爸!另一个问题是体重测量非常嘈杂。我们尝试每天在相同的时间,早上第一件事,在相同的规模上采集数据,但是每天影响体重的因素太多以至于只看一个点毫无意义。只有通过检查一系列数据点,趋势才会出现。此外,我们体重的每次变化似乎都类似于平方根关系或对数。也就是说,有一个最初的快速增益(或损失),然后随着时间的推移变得平稳。这是意料之中的,因为最初当你有动力的时候,很容易取得进步,但是保持这种动力是很困难的。最终,我们都进入了体重平台期,最后的测量显示出轻微的改善迹象,这可能是也可能不是趋势。
这个结果的一个小问题是它没有考虑体重。如果我爸爸减掉 10 磅,相对于他的体重来说,比我增加 10 磅要小。下一张图也显示了变化,但这次是根据体重的百分比。
Weight Change Percentage
好吧,如果你支持我,这张图看起来会好得多。在比赛的大部分时间里,我的百分比变化都比较大,我一直领先,直到最后一天,我爸爸在百分比上略微超过了我。有趣的是,我们两个都适应了接近 6%的体重变化。这可能意味着我们的身体很容易在±6%的范围内波动,但除此之外,进一步的变化就更加困难了。
以下是最终的数值结果。
- 克雷格:最终重量= 219.8 磅,绝对变化= 15.4 磅,百分比变化= 6.55%
- 将:最终重量= 134 磅,绝对变化= 7.4 磅,百分比变化= 5.85%
建模
图表可以向我们展示大量信息和快速的定性趋势,但不能用定量结果来回答问题。例如,我们每个人平均每天增加或减少多少体重?用所有的数据预测一年后我们的体重是多少?这些都是我们必须求助于造型来回答的问题。
简单线性建模
对于任何有连续变量(如重量)的建模,最好的起点是简单的线性回归方法。我们将创建一个带有一个响应变量(y)和一个解释变量(x)的线性模型。我们对体重和比赛开始后的天数之间的关系感兴趣,因此,答案是体重,解释变量是天数。从图表中,我们看到这可能不是数据的最佳表示,但这是一个很好的起点,可以让我们量化各自的体重变化。
Craig 的模型结果如下所示。这里有很多信息,但我会浏览一遍并指出哪些是重要的。
Coefficients:
Estimate Std. Error t value Pr(>|t|)
**(Intercept) 227.779544** 0.481849 472.720 < 2e-16 ***
**days -0.023887 ** 0.006326 -3.776 **0.000264 *****
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 3.861 on 105 degrees of freedom
**Multiple R-squared: 0.1196**, Adjusted R-squared: 0.1112
F-statistic: 14.26 on 1 and 105 DF, **p-value: 0.0002642**
要检查的主要部分是参数,即定义模型的数字。在简单线性模型的情况下,这些是截距和斜率,如直线方程所示:y = mx + b。对于体重挑战,该模型为:体重=(每天体重变化)*天数+零天体重。上述总结中第 0 天的重量在估算栏下的(截距)行中,值为 227.78 磅。每天的重量变化在“估计”列下的“天数”行中,值为-0.024 磅/天。这意味着,在线性模型下,我爸爸平均每天减掉 0.024 磅。
上面介绍的其他统计数据稍微详细一些,但也很有信息。 R 平方表示y 变量(重量)的变化分数,可以用 x 变量(天数)的变化来解释。更高的 R 平方意味着模型更好地代表了数据,我们可以看到我们的模型只占重量变化的 11.96%。此外,我们可以查看 p 值,看看我们的模型中是否有真正的趋势,或者我们的数据是否只是噪声。p 值是一种常见的统计数据,表示在模型下观察到的数据随机出现的概率。对于 Craig 的模型,p 值为 0.0002642,远低于公认的显著性阈值 0.05(p 值越低越好,因为这意味着数据不太可能是偶然生成的)。所以,我爸减肥单纯是随机噪音的几率不到万分之三。从这个模型中,我们可以得出结论,我爸爸在比赛过程中的体重下降是一个真正的趋势!
我们现在可以转向我的简单线性回归模型进行类似的分析。
Estimate Std. Error t value Pr(>|t|)
**(Intercept) 131.9** 3.133e-01 420.843 <2e-16 ***
**days 0.0095** 3.808e-03 2.388 0.0185 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 2.679 on 121 degrees of freedom
**Multiple R-squared: 0.04502,** Adjusted R-squared: 0.03713
F-statistic: 5.704 on 1 and 121 DF, **p-value: 0.01847**
模型摘要显示截距为 131.9 磅,每日重量变化为 0.0095 磅,R 平方为 0.04502,p 值为 0.01847。我们的结论是:
- 在比赛过程中,我每天增重 0.0095 磅
- 这个模型只能解释重量变化的 4.5%
- 由于纯粹的偶然性,观察到的结果有 1.85%的几率发生
我的模型的 p 值略高于我爸爸的,但它仍然低于显著性阈值,并且模型显示了真实的趋势。
我们可以通过稍微修改完整的结果代码并将模型趋势线从“黄土”改为线性,来直观显示线性模型与数据的拟合程度。
Linear Model Performance
从线性模型中得到的启示是,我父亲和我都在挑战中向我们的体重变化目标展示了显著的进步。
广义加性模型
广义相加模型超越了简单线性模型的线性关系假设,将时间序列(在这种情况下为权重)表示为总体趋势以及日、周或年模式的组合(相加)。这种方法非常适用于经常展示特定模式的真实世界数据。我们的数据在大约 4 个月的时间里每天收集一次,所以只有周模式和总体趋势(要获得日模式需要每天进行多次观察)。尽管如此,我们仍然能够从加法模型中得出有用的结论。
我们可以先画出总体趋势。这类似于我们在完整结果图中看到的平滑线,向我们展示了体重变化的总体轨迹。
Overall Trend from Generalized Additive Model
下一张图显示了一周内每天体重增加或减少的趋势。该图提供了可操作的信息,因为它显示了哪些日子对我们的体重变化目标有问题。
Weekly Trends
虽然我爸爸和我试图去相反的方向,我们有非常相似的每周模式。在工作周的前两天,我们的体重都下降了,在工作周的其余时间体重增加了,并在周末呈下降趋势。有可能对此有太多的解读,但我自己的解释是,我倾向于在周末进行更多的锻炼(通常是几个小时的跑步),这将减少我进入工作周的体重。然后,当我忙于上课时,我会恢复体重,直到周末再次失去动力。我爸爸在周末表现更好,可能也是因为他不工作时锻炼增加了。这些结果表明,我需要努力在周末消耗更多的食物,而我的父亲需要努力减少他在一周内的消耗量。一个广义的加法模型可能看起来很复杂,但是我们可以使用结果来确定简单的行动来改善我们的健康!
预言
建模的另一个好处是,我们可以使用结果进行预测。我们可以使用线性模型或广义加性模型进行预测,但是因为加性模型更好地代表了数据,所以我们将只使用它进行预测。有两个主要关注的估计值:
- 对 2018 年 1 月 1 日的预测是根据我们前两个月(到 2017 年 10 月底)的测量结果做出的
- 对 2019 年 1 月 1 日的预测是通过所有测量得出的
第一个预测将使我们能够将我们在下半年的表现与基于上半年数据预测的表现进行比较。第二个预测会让我们知道一年后我们会在哪里。
预测的一个经常被忽视的重要方面是不确定性界限。经理们通常只想要一个单一的预测数字,但在一个不确定的世界里这是不可能的。即使是最精确的模型也无法捕捉数据中固有的随机性或不精确的测量设备。因此,为了成为负责任的数据科学家,除了单一的预测数字,我们还将提供一系列的不确定性。
根据两个月的数据对 2018 年 1 月 1 日的预测
下图显示了克雷格和我根据截至 2017 年 11 月 1 日的数据对比赛计划结束时间的预测。
Craig Prediction for Jan 1, 2018
Will Prediction for Jan 1, 2018
灰色阴影区域表示预测中最重要的部分:不确定区域。红线向我们展示了最有可能的未来结果,如果我们继续目前观察到的趋势。阴影区域是基于观察并考虑测量中的噪声的最终重量的可能范围。要正确看待这些范围,我们应该看看实际数字:
- 克雷格:预测= 213.2 磅,上限= 223.5 磅,下限= 203.2 磅,1 月 1 日的实际体重= 220.8 磅
- 威尔:预测= 135.6,上限= 143.4 磅,下限= 127.3 磅,1 月 1 日实际体重= 136.9 磅
我和爸爸的实际体重都在预测范围内。该模型在预测我们两个月前的实际体重方面做得相对较好,考虑到它正在处理大约 70 个数据点!
2019 年 1 月 1 日的预测
作为对模型的最后探索,我们可以看看从现在起一年后我们会达到什么程度。也许这些预测不会完全实现,但它们至少应该给我们明年一个目标!以下是利用所有比赛数据对 2019 年做出的预测:
Craig Prediction for Jan 1, 2019
Will Prediction for Jan 1, 2019
这些图表清楚地显示了我们从数据中推断的不确定性是如何增加的。按照这些情节,明年初我可能比我爸还重!这个练习更多的是为了好玩,而不是作为一个严肃的预测,但是如果我们继续收集更多的数据,预测可以改进。最终,有了足够的信息,我们应该能够建立一个模型,从理论上对未来一年做出准确的预测。我们将不得不在明年检查这些预测的准确性的更新!
- 克雷格:预测= 208.8 磅,上限= 230.9 磅,下限= 186.0 磅,目标体重= 215.0 磅
- 意志:预测= 147.2 磅,上限= 209.2 磅,下限= 85.5 磅,目标体重= 155.0 磅
结论
在任何数据分析结束时,你要问自己的问题是:“我现在知道哪些我可以使用的东西?”有时候答案会是不多,这是非常好的!这只是表明您需要收集更多的数据,或者您需要重新考虑建模方法。但在 2017 年大重量挑战的分析中,有一些见解需要复习并投入使用!
- 克雷格在体重变化方面轻松赢得了比赛,尽管我们都很成功:克雷格减掉了约 6%的体重,而我增加了约 6%。
- 克雷格每天减了 0.024 磅,而我每天增加了 0.0095 磅。我们俩都表现出体重变化的显著趋势。
- 我需要在周末努力增加体重,而我爸爸需要在工作日努力减肥。
- 在比赛的前半段,当体重变化始终朝着正确的方向发展时,我们两人都表现得更好,但在第三个月我们达到了平台期。
- 对明年的预测表明,我们双方都将继续走在正确的道路上,但存在相当大的不确定性。
最后,我将展示另外两个图表,对比 2018 年 1 月 1 日的预测与这一天的实际结果。
Craig Additive Model Prediction vs. Actual Weight
Will Additive Model Prediction vs. Actual Weight
我希望这篇文章展示了任何人如何在日常生活中使用数据科学为个人或社区造福。我的目标是让数据科学民主化,让每个人都能通过展示数据科学工具的真实用途来利用这个令人兴奋的领域!
一如既往,我欢迎反馈和建设性的批评。可以在 wjk68@case.edu 找到我。
棒球数据科学,第 1 部分:击球手
原文:https://towardsdatascience.com/data-science-and-hitters-in-baseball-fc42d20c5fad?source=collection_archive---------16-----------------------
将无监督学习技术应用于棒球的现代击球手
当我在回忆如何应用各种机器学习技术时,我发现自己在想它们可能会从另一组数据中揭示什么。当然,棒球比其他运动有更丰富的数据可以利用,部分原因是这些统计数据被记录了 100 多年。因此,我开始研究一些数据(可以通过 https://github.com/chadwickbureau/baseballdatabank 的从查德威克棒球局获得)。
首先,我从 1969 年至今的赛季(大致相当于黄金时代的结束)中提取了击球数据集的子集,并剔除了总共打了不到 600 场比赛的球员,以确保每个球员都有相当数量的数据可以利用。接下来,我汇总了单个玩家的统计数据,这样每行数据代表一个玩家。因为许多计数统计(HR、SB 等。)是非正态分布和右偏的,我通过跨赛季取每个测量值的中间值(而不是平均值,后者更容易受到离群值的影响)来近似每个球员的“标准”赛季。然后,我对 fielding 数据集进行了相同的聚合,并将其附加到 hitting 数据帧,以形成一个统一的数据集。
最初,我的想法是选取一些最具预测性和正交性的指标(比如,本垒打、上垒率、盗垒率和双杀率),并将这些指标作为聚类的基础。然而,在经历了几次这一过程后,我意识到有一个更简单(也许在统计学上更合理)的方法来确定最能区分击球手的因素:主成分分析。因此,我首先对数据集运行主成分(PC)分析,然后对前 6 个成分(其特征值> 1)的 PC 负载运行高斯混合模型,以将玩家聚类到不同的类别。高斯混合模型反复比较了多个可能分组的信息内容(我选择了 4 到 7 个类别),最终在数据集中找到了 6 个类别(玩家的集群):
Scatter plots of each player’s loading on the first 6 principal components (PC), colored by class identity as determined by a gaussian mixture model.
Loadings on each Principal Component for the six classes identified by GMM
尽管每个部分都有很高程度的重叠,但 GMM 似乎找到了与六个不同类别的玩家相对应的相当分离的集群。当然,主成分并不总是容易解释的:再说一遍,PC6 到底是用来衡量什么的?因此,为了调查这六个职业在棒球能力方面可能大致对应的情况,我没有在逐个球员的基础上检查个人电脑,而是回到了最初的统计数据。
首先,我查看了这六个类别中的每一个如何符合高斯混合模型所使用的每一个统计数据的摘要:
Mean values for each batting (AB through SLG) and fielding (PO through DP) statistic for each class (leftmost column).
这六个等级可能代表什么肯定有一些暗示,特别是考虑到在诸如本垒打(HR)、盗垒(SB)、在垒率(OBP)、击球率(SLG)和所有四种防守措施(出局数、助攻数、失误数和双杀数)上的明显差异。如果你把这些职业和球员的位置交叉列表,这些职业之间的差异会更加明显:
Counts of each position (rows) observed within each class (columns).
三垒手几乎完全属于一级,二级全是一垒手,几乎所有的接球手都在三级,四级全是二垒手和游击手,五级和六级主要是外野手。结合在每个类别中观察到的汇总统计数据,该数据有助于将六个类别解释如下(在每个标题下确定了最有可能属于该类别的五名玩家):
1 级—电力内场
迪安·帕尔默、迈克·施密特、佩德罗·阿尔瓦雷斯、特洛伊·格莱斯、乔希·唐纳森
路中间。倾向于打出像样的力量,他们相当灵活,但速度不够快,无法三连击或巡视外场的更深范围。
第 2 类—第一基本图例
威利·乌普肖,基思·埃尔南德斯,杰夫·巴格韦尔,乔治·斯科特,乔伊·沃托
他们不仅在角落里做得很好,而且比其他任何群体走得都多,就好像他们无法抗拒他们位置的吸引力。
3 级—缓慢而稳定
AJ Pierzynski,Carlos Ruiz,Jason Varitek,Matt Wieters,Joe Mauer
几乎每一个捕手都属于这一类,由于结合了低速度、良好的力量和持续的防守。他们最大的弱点?他们不太可能一路跑到得分最少的垒。
第 4 类—内场向导
唐·凯辛格、埃尔维斯·安德鲁斯、蒂托·富恩特斯、奥兹·史密斯、霍勒斯·克拉克
巨大的助攻和转身双杀(在一个几乎完全由 2B 和 SS 组成的团队中是可以预期的),他们也相当快地上垒,尽管他们的击球还有待改进(最低的 OBP 和 SLG)。
第 5 类——速度恶魔
迪·戈登、乔内·费金斯、胡安·塞缪尔、文斯·科尔曼、胡安·皮埃尔
投手们讨厌盯着的家伙们,这个最小的小组由一些有史以来最快的球员组成。正如你所料,他们不打太多力量球,但是他们有能力打出一垒安打和三垒安打,击败双杀,这意味着他们能得很多分。
6 级——强力外场手
斯塔林·玛特、迈克·特劳特、达里尔·草莓、卡洛斯·戈麦斯、格雷迪·西斯摩尔
打击,速度,力量:这是一个可以做到一切的群体,也是最有可能让你进入名人堂的群体。
最后,我深入到各个数据点,看看无监督类与它们所代表的实际玩家的匹配程度如何。首先,我挑选了九名著名的球员(都是明星和名人堂成员,有点双胞胎荷马的偏见)来看看他们的表现如何:
Class mixtures for nine notable players, colors match class colors in the previous figures.
简而言之,这些玩家中的大多数都非常坚定地属于这个或那个职业,很少怀疑哪个职业最适合他们(至少在算法部分)。这一组中唯一的例外是皮特·罗斯,他主要是 5 班的学生,也有相当多的 6 班学生。为了进一步探究这个问题,我观察了每个班级中不确定性最大的球员,并找出了一些更容易辨认的名字:
Class mixtures for notable players who had a high degree of uncertainty associated with their class assignment.
然后,记住之前指定的每个职业可能代表的内容(职业 1 :内场能量;2 级:一垒传奇;三级:稳扎稳打;第 4 类:内场奇才;第五类:速度恶魔;6 级:强力外场手)
布鲁克斯·罗宾逊(1&4):三垒手,拥有游击手的射程和速度。有史以来最伟大的防守三垒手之一。
威利·麦科威(二班&三班):一垒手,实力不可思议。以令人生畏的强力击球手著称。
凯文·尤基利斯( Class 2 & 3 ):身材粗壮、擅长上垒的一垒手。
布雷特·布恩(1 级& 4 ):防守型二垒手,以强力击球闻名。
皮特·罗斯( Class 5 & 6 ): MLB 在安打和单曲方面的空前领先。在创纪录的五个不同位置(1B,2B,3B,低频,高频)17 次入选全明星。
何塞·包蒂斯塔( Class 3 & 6 ):外野手,不以速度著称,但擅长保送和 HR。
我不仅同意第一批全明星球员的分类方式(大部分都是一个级别的),而且我们所知道的更多混合级别的球员有助于解释为什么 GMM 对他们有更多的不确定性。例如,也许皮特·罗斯是如此杰出的球员的原因之一是他融合了强力外野手的一些最佳特质和速度高手难以置信的跑垒。
总而言之,击球手可以根据他们的击球和防守统计数据进行分类并不令人惊讶,尽管看到 GMM 的课程与球员的现实世界位置相符是令人惊喜的。我还认为这六个职业很好地包含了经理在制定阵容时可能会寻找的“原型”人员。它甚至在比较球员数据集时提供了一些见解;例如,迈克·特劳特更像巴里·邦兹和皮特·罗斯,而不是布鲁克斯·罗宾逊或凯文·尤基利斯。这种建模可能会也可能不会打破我们对棒球的理解,但我认为它提供了一些价值,作为对相同的旧数据的新观点。
你的 Spotify 音乐听起来像什么?Spotify 数据科学(第 1 部分)
原文:https://towardsdatascience.com/data-science-and-machine-learning-with-spotify-841225bfb5d0?source=collection_archive---------16-----------------------
“MacBook Pro turned on” by sgcreative on Unsplash
介绍
音乐一直是每个人生活中不可或缺的一部分。我们听到音乐,如果不是听音乐的话,无论我们在哪里,当我们学习时,我们听到美妙的声音,当我们参加聚会时,我们听到令人兴奋的刺激和节拍,当我们和朋友旅行时,我们听到令人兴奋和有趣的拼车卡拉 ok。音乐在我们周围无处不在。
如果我们可以使用数据科学来分析我们所听的音乐,从而获得关于我们所听音乐类型的见解,会怎么样?
动机
这个系列的动机是让任何人都能发现关于他们自己和他们所听音乐的模式和见解。这样做,可以更好地理解他们在听 Spotify 时的音乐行为。
**Note:** The code to collect data and perform insights on your own music is linked below.
为了实现这一点,我们将致力于展示量化衍生数据科学项目的完整端到端周期,并将分为以下几个部分。
1。探索性数据分析(第 1 部分:数据可视化)
在这里我们将学习统计分析的基础知识。这使我们能够了解我们正在处理的数据,并获得对我们所拥有的特征的见解。探索性数据分析通常是任何数据科学项目中最重要的步骤,因为它为构建进一步的分析提供了大量见解。
我们希望回答的问题包括:
- Spotify 上经常播放什么类型的音乐?有特色的音乐通常更有声音吗?
- 我们可能喜欢哪种音乐?
- 最流行的歌曲图表,遵循某种模式吗?
2。探索性数据分析(第 2 部分:统计测试)
在这一节中,我们将学习对我们在数据可视化中所做的观察进行一些统计上的严格处理。毕竟,我们想要定量地验证我们的假设。我们将执行的一些统计测试是卡方良好适合度和 T 检验,以及查看相关性。
3. A / B 测试
在这里,我们将了解如何在回答关于我们音乐品味的问题时进行 A/B 测试,例如:
我们希望回答的问题包括:
-我听的音乐风格是否与前 100 名播放的音乐风格不同,是否与 Spotify 上播放的音乐风格不同。
- 我们听什么风格的音乐可能比 Spotify 上的典型音乐更明显
- 最后,我们是普通人吗?意思是,与最流行的歌曲相比,我们听的音乐是否遵循相似的模式。
4.机器学习(建立推荐系统,向我们推荐我们可能感兴趣的新歌)
这最后一部分将使用我们从探索性数据分析和 A/B 测试中获得的见解,开发一种机器学习算法,为我们推荐新歌!
探索性数据分析(可视化)
Spotify 上经常播放哪些风格的音乐?有特色的音乐通常更有声音吗?我们可能喜欢哪种音乐?最流行的歌曲图表遵循某种模式吗?
数据科学最重要的方面之一是将大规模数据集中到一条信息中的能力。这使我们能够回答我们可能有的问题,并更好地了解我们的个人行为和我们喜欢的音乐类型。
Spotify 上经常播放哪些风格的音乐?
数据科学的一个重要部分是理解我们收集的数据的分布。我们关心发行情况,因为它让我们了解各种音乐风格的频率,以及频率的形状,就好像它们在 Spotify 上一样。让我们先来看看 Spotify 上精选歌曲的分布情况!
Distributions of music styles featured on Spotify
通过观察分布图,我们可以立即观察到以下情况:
- 在特征语音和声音中有一个非常大的向下的斜率,我们可以注意到在接近曲线末端的分布中有一个轻微的向上的尾部。**这向我们表明,Spotify 上精选的歌曲的音乐风格总体上较少声学或言语。**上升尾向我们表明,高语音或声学的歌曲更有可能在上限附近被选择。
或者更定量地说,被评价为超过 25%的声音或语言风格的歌曲不太可能出现在 Spotify 上。
- Spotify 上展示的大多数歌曲往往不太生动,随着歌曲的生动增加,它在 Spotify 上展示的可能性降低。
- Danceability 似乎呈正态分布,分布的尾部表示出现在 Spotify 上的可能性较低。
- 属性,化合价和能量看起来大致均匀(均匀分布)。表示对那些影响 Spotify 上精选音乐选择的属性没有偏好。
总之,Spotify 上播放的歌曲往往表现出较低的声音、语音和活力,而效价和能量对 Spotify 上播放的歌曲没有显著影响。最后,大约 65%的可跳舞歌曲是 Spotify 上最常见的特色。
我们可能喜欢哪种音乐?
咚咚咚,谁在那里?这是什么音乐风格,太棒了!让我们来看看吧!
音乐品味可以很好地反映我们的情绪和感觉。它们给我们一种身份,一种安全感,更多的时候,它们是一首旋律,伴随着我们的日常生活起伏。
当我们感觉不可思议的时候!我们会听感觉像站在世界之巅的音乐!当我们心碎的时候,我们会听一些反映失去所爱之人的歌曲。这种对我们生活的内省观点,实际上可以概括在我们所听的音乐中!
所以,让我们看看我们能从目前我最喜欢的歌曲中发现什么!
Box-plot of my favorite songs by style
从上图中我们可以观察到以下情况:
- 我听的歌在声、价、舞、能上分布很正态。
- 我们可能会注意到活跃度和语速的分布集中在下限,这表明我听的音乐不是很活泼也不是健谈。
我们可以观察到,我倾向于欣赏更有声、更适合跳舞和更有活力的音乐。不太喜欢活泼或有声的音乐。
最流行的歌曲图表遵循某种模式吗?
鲍勃,为什么你的音乐如此普通!因为它们对你的口味来说毫无意义。色调色调色调
排行榜上的前 50 首歌曲无疑是全世界播放量最大的歌曲,无论你是在购买新包时听它,还是在咖啡馆与朋友交谈时听它。它无处不在。但是,我们似乎从来不介意听这些歌曲,在某些情况下,随着我们的耳朵适应音乐,它们可能会变得乏味。但是我们从来不说“伙计,我受不了听这首歌,它伤了我的耳朵”,这是为什么?
这是不是前 50 名歌曲采用的一种模式,让我们可以享受背景音乐中的歌曲,甚至有时可以跟着一起唱?
让我们来了解一下!
我们将通过绘制前 100 种音乐风格的方框图来实现这一点!
Box-plot of the top 100 charting by style
通过观察箱线图,我们可以看到大多数进入前 100 名的歌曲是:
- 非常适合跳舞和精力充沛。但是在声音、语音和生动性方面较低
排行榜前 100 名中的歌曲表现出对非常适合跳舞的歌曲的高度偏好,而语速较低。例如,泽德的《中间》,马希梅洛的《快乐》。
结论
我希望你们都非常喜欢通过可视化 Spotify 上的前 100 首图表歌曲、精选歌曲和我个人最喜欢的歌曲获得的见解!
If you would like to try this for yourselves and have a look at your own Spotify tastes and try to do this yourselves, I've attached the link to the code I've used to collect this data [here](https://github.com/Chippasaur/spotifyMe)
如果你真的喜欢这篇文章,请吧👏并分享给你的朋友。这将让我知道你们真的很喜欢这个系列的第一部,如果是这样的话,我会继续做更多。记住,你最多可以鼓掌 50 次——这对我真的很重要。
数据科学和 DPO
原文:https://towardsdatascience.com/data-science-and-the-dpo-f8bfb31c75b1?source=collection_archive---------6-----------------------
为什么雇佣一个无视数据科学的数据保护官就像买一辆装甲车开着兜圈子?
如果数据是数字经济的燃料,那么欧洲新的数据保护一般准则提供了一个法律路线图,说明我们现在可以如何处理欧洲公民的个人数据。对于所有处理个人和敏感数据的组织来说,这项新立法的关键是雇佣一名数据保护官的义务(DPO)。雇主们要小心了,因为仅仅基于他们的法律知识来雇佣 DPO 不会让你更接近你的战略目标。让我们先看看你未来的 DPO 的义务、资格和责任,然后再关注他们理解数据科学的本质和目标的需求。
在一般数据保护立法于 2018 年 5 月 25 日生效之前,指定一名数据保护官是对私营公司和私营组织的强制性要求。这项新的欧洲立法要求,任何处理或存储大量欧洲员工或客户数据的公司,无论其运营地点在哪里,都必须指定一名 DPO。还必须在定期捕获、存储或转换欧洲公民数据的组织中任命 dpo,无论其运营基础如何。任何定期、系统地监控个人数据以及处理敏感数据(健康、种族、民族、宗教等)的非军事机构。)亦须符合法例规定。考虑到这些需求的范围,难怪最近的一项研究得出结论,仅在未来几个月内,就将有 28 000 名 DPO 员工被雇佣。 【我】
数据保护官将在消费者、雇主和利益相关者面前承担广泛的组织责任。DPO 将确保组织数据流程符合 GDPR 系统。他们将被要求建立公司进行的所有数据处理活动的全面记录,包括所有处理活动的目的。他们还将进行审计,以确保合规并主动解决潜在问题。DPO 成为员工和客户的单一联系点,员工和客户希望了解他们的数据如何被使用,以及公司采取了哪些措施来保护个人信息。最后,DPO 是公司和国家数据保护机构(NPA)之间的参照点。【二】
尽管责任如此广泛,但欧洲监管机构几乎没有就 DPO 候选人必须具备哪些资格提供具体指导。第 37 条要求数据保护官具备“数据保护法律和实践的专业知识”除此之外,法规建议候选人应该对组织的 IT 基础设施和技术有透彻的了解。DPO 必须是本组织内的一个独立理事会,对如何处理数据的决定没有直接责任。公共和私人组织可以共享 DPO 的服务,但不允许以短期或定期合同雇用 DPO。
雇佣一个对数据科学知之甚少的 DPO 很可能是无效的,而且会适得其反。DPO 必须了解组织收集个人和敏感数据的原因,而不仅仅是方式。从技术上讲,个人和敏感数据不需要全部存储在组织中,因为只要数据科学团队能够访问唯一的引用,他们就可以根据需要从各种外部数据源重新构建所需的记录。他或她应该意识到,数据科学家对囤积个人和敏感数据的兴趣不如探索个人(或技术)之间的关系如何影响集体信念或动机和行动。DPO 应该是数据科学团队的一部分:因为 GDPR 的法律要求不是限制其使用数据科学的约束,而是可以指导其在您的业务中应用的考虑因素。
DPO 需要超越职能部门的责任和义务,从更大的角度探究组织收集数据的原因。今天,任何组织的成功都取决于其利用数据的能力,不仅是为了了解组织过去的表现,也是为了预测和影响未来的制造商趋势。这种开发数据流程可在组织的各个层面促进分析:扫描市场环境以了解其业务挑战的性质,鉴定手头的数据,确定解决问题的正确方法,并将数据转化为行动呼吁。DPO 需要相信并宣扬这样一种愿景,即数据不仅仅是需要监控和控制的组织副产品,而是一种变革力量,将有助于定义组织如何看待其市场、资源以及在可预见的未来的竞争优势基础。
许多培训中心可以在培训未来的残疾人组织干事方面提供帮助和援助。可以在 EC 网站以及 NPA(法国 CNIL)的网站上找到极好的信息、基准和资源来源。几所大学开始提供关于 DPO 的法律和技术角色的短期课程和/或高管学位。私人咨询公司正在关注审计、流程改进和报告等更实际的问题。在商业分析研究所,我们在会议、大师班和 DPO 证书中阐述了数据科学和 DPO 实践之间的内在联系。我们坚信雇佣一个对数据科学一无所知的数据保护官就像买一辆装甲车绕圈行驶——你可能觉得受到了很好的保护,但实际上你哪儿也去不了。
注册参加我们新的为期一天的“成为数据保护官”大师班。商业分析实践是商业分析学院的核心和灵魂。在我们位于巴约纳的暑期学校,以及我们在欧洲的大师班,我们对数字经济、数据驱动决策、机器学习和视觉通信的关注将使分析为您和您的组织服务。
Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 个人资料可以在 www.linkedin.com/in/leeschlenker.[查看](http://www.linkedin.com/in/leeschlenker.)你可以在 https://twitter.com/DSign4Analytics[的 Twitter 上关注我们](https://twitter.com/DSign4Analytics)
【I】Heimes,r .(2016),研究:至少需要 28,000 个残疾人组织才能满足 GDPR 要求
【ii】Jakubowicz,L. (2016),数据保护官(DPO):定义、形成和安全
【iii】Lord,n .(2018),什么是数据保护官(DPO)?
【第四】参见例如,DPO 角
数据科学训练营:透明的结果
原文:https://towardsdatascience.com/data-science-bootcamps-on-transparent-outcomes-8b394280201b?source=collection_archive---------7-----------------------
Image Credits : https://smallbiztrends.com/2015/10/financial-transparency.html
与编程训练营相比,数据科学训练营社区尚未广泛接受成果报告。事实上,编程训练营实际上是成果透明的先锋。Hack Reactor 和其他几个编程训练营成立了结果报告诚信委员会,你可以看到一些成员发布的排名数据。数据科学训练营社区没有理由不能复制或采用 CIRR 标准。还有一项由一些 CIRR 成员发起的请愿活动。
对结果的透明让一切都变得公开。
这是一个非常复杂的情况。数据科学训练营主要是根据他们的排名来判断的。如果数字看起来不错,一些训练营不会公布详细的安置报告,因为这可能被视为商业秘密。另一方面,如果数字很糟糕,那么公布和宣传它们并不符合他们的最佳利益,因为学生可能会决定逃跑。在一天结束的时候,那些在参加训练营之前没有做足够的尽职调查和研究的学生就会被淘汰。
我们认为,有一些中间立场,对所有相关方都有利,包括学生、训练营和潜在雇主。
如今,大多数数据科学训练营教授的大量材料正在商品化,你可以选择自学,但仍不会错过太多内容。一些做得好的训练营倾向于在训练营经历的某些方面花费大量时间,而你在自学时可能不容易复制。这些方面包括雇主介绍、拥有活跃的校友基础、导师、积极的强化等等。这些在短期和长期都有很大的价值。
参加数据科学训练营是一项高风险、高回报的投资,但一些数据科学训练营通过他们的宣传倾向于将其作为低风险、高回报的投资,这并不准确。
我们知道一个事实,一些数据科学训练营将那些在一定时间后无法找到工作的人从他们的名册中删除,并且不包括在他们的安置统计中。我们还知道一个事实,一些数据科学训练营雇用他们的一些毕业生作为项目的助教,然后将他们视为数据科学家。从表面上看,这样做实际上没有错,你可以为此提出一个很好的论点,但当数据科学训练营发布安置数字而没有说明他们是如何得出这些数字的,你可以看到这些数字是如何看起来比实际情况好得多的。
我们认为,今天运营的一些数据科学训练营已经强行推销了自己,并从本质上设定了这样一种叙事,即训练营经历的唯一积极结果应该是数据科学工作。这个非常高的门槛让他们注定失败。现实情况是,潜在的学生出于各种各样的原因选择这些课程,包括过渡到数据科学相关的机会。数据科学训练营需要捕捉这些学生的意图,并对它们非常透明。
我们认为,数据科学训练营面临的最大挑战是如何确保他们继续以非常可量化和可衡量的方式(位置或积极成果)提供价值,并以某种方式找到保持相关性的方法。
如果你是一名准数据科学训练营的学生,你肯定应该要求查看一些最近队列的详细安置统计数据。这有助于您了解根据您的目标所涉及的风险(可能并不总是过渡到数据科学工作)。这篇文章可能有助于你进行尽职调查。
这是转贴自的原创文章并做了一些修改
保持联系!
我希望你喜欢这篇博文。请随时通过 Linkedin 或 Twitter 与我联系
数据科学和业务战略
原文:https://towardsdatascience.com/data-science-business-strategy-bbfd1c2cdc17?source=collection_archive---------2-----------------------
在我从上一篇帖子中获得令人鼓舞的反馈后,我想我会继续我的旅程,接受一个更大的挑战(在回到 IBM 员工流失项目之前):使用数据科学来塑造业务战略。这是我以前从未尝试过的事情,所以我认为尝试一下是有益的,希望能学到一些东西。
我在这个项目中使用的数据来自 Kaggle 的自行车共享需求竞赛:
[## 自行车共享需求| Kaggle
城市自行车共享系统的使用预测
www.kaggle.com](https://www.kaggle.com/c/bike-sharing-demand)
数据集中包含的字段如下:
- 日期时间:小时日期+时间戳
- 季节 :
1 =春天,
2 =夏天,
3 =秋天,
4 =冬天 - 假日:该日是否视为假日
- 工作日:该日是否既不是周末也不是节假日
- 天气: 1:晴,云少,部分多云,局部多云;
2:薄雾+多云,薄雾+碎云,薄雾+少云,薄雾;
3:小雪、小雨+雷雨+散云、小雨+散云
4:大雨+冰托盘+雷雨+薄雾、雪+雾 - 温度:摄氏温度
- atemp :“感觉像”摄氏温度
- **湿度:**相对湿度
- 风速:风速
- 临时:发起非注册用户租赁的数量
- **已注册:**已启动的注册用户租赁数量
- **计数:**总租赁次数
该数据集非常有限,因为它只显示了自行车租赁需求如何随着天气条件、一天中的时间和季节性事件(节假日)而变化。该案件没有提供太多关于 Capital Bikeshare 的商业背景或商业战略的信息。这需要我做一些研究,以更好地了解业务和他们的经营更广泛的背景。
定义目标
由于我没有太多的信息可以利用,我决定保持目标尽可能简单— 超过我们当前的轨迹 。这样做绝对不仅仅是简单地预测我们的增长,我还需要知道取得成功的最佳举措。
下面是我决定使用的项目结构:
- 预测未来 3 个月的自行车共享需求(我们目前的战略将带我们走多远?)
- 调查影响需求的因素(目前什么是重要的)
- 增加需求的潜在机会(我们能做些什么来实现我们的目标)
预估需水量
为了知道我的目标是什么,我必须知道我当前的轨迹会把我带到哪里。为了做到这一点,我决定看一看脸书的 Prophet 库,它被设计用来做时间序列预测,并支持 R 和 Python。
在我继续之前,我肯定要感谢 José Roberto Ayala S 的精彩和鼓舞人心的文章,这篇文章在向我介绍脸书的先知图书馆时是非常有用的资源。如果你想了解更多关于脸书先知图书馆的信息,请访问此链接:
[## 先知
Prophet 是一个用 R 和 Python 实现的预测程序。它速度很快,并提供完全自动化的预测…
facebookincubator.github.io](https://facebookincubator.github.io/prophet/)
在我可以用数据集进行任何预测之前,我必须准备好数据,以便它可以符合我的目标,同样重要的是,与脸书的先知库兼容。我是这样创建我所使用的数据集的:
我要做的下一件事是将数据分开,用于培训、验证、测试和调整:
开始使用 Prophet 非常容易,我只用了几行代码就开始运行了:
Getting Started with Facebook’s Prophet Library
验证期间的预计租赁数量为 188186 ,但实际上,它应该更接近于 208939 。投影一点都不差(相差只有 10.45%)。我还应该指出,这个模型使用了 José提出的值。我决定做的下一件事是使用 Prophet 来查看我对 2012 年 11 月 8 日到 2012 年 12 月 19 日期间(31 天)的预测。
此期间的总项目预计为 240016 。
更深的潜水
在发现我的轨迹后,我需要知道我能做什么来改变它。我首先从一个相关矩阵开始。我认为这将是有用的,看看哪些价值有助于在给定时期的自行车租赁数量。这是我想到的:
Correlation Matrix for Bike Rental Demand Data
该矩阵显示,租赁数量与临时客户和注册客户的数量密切相关。正如你所想象的,我对自己最初的发现很不满意。所以我决定看看图表还显示了什么。我注意到“温度”、“ atemp ”和“湿度”字段与计数字段有相当程度的相关性。我还发现'天气和'季节的相关性得分也很显著。
虽然我认为这些发现是有用的,但我需要知道更多。我需要了解是否有任何我可以利用和利用的优势。操纵天气绝对不是一个选择,此外,预测天气本身就是一个挑战。
我决定采用另一种方法来发现重要变量,这涉及到发现数据集特征的重要性:
最重要的功能是“假日”功能。我发现这非常令人惊讶,但也非常有用。假期不一定是可以被操纵的,但它们可以被预期…并为计划。
然后我决定调查自行车租赁和假期之间的关系:
A graph which shows how rentals fluctuate based on the holiday.
显而易见,假期肯定与租赁数量有某种因果关系,所以我决定找出哪些假期具有最显著(和积极)的影响。租金上涨的节日有独立日、退伍军人节、劳动节和哥伦布日。值得注意的是,哥伦布日租金上涨了 35.93% ,是四次上涨中涨幅最高的一次。
发现这一点后,我意识到我已经获得了第一块拼图。
把所有的放在一起
对于这个项目,我将把商业战略定义为实现公司长期目标的决策和行动。
约翰逊和斯科尔斯将战略定义为:
“一个组织的长期方向和范围:在一个不断变化的环境中,哪个通过资源配置实现组织的优势,以满足市场的需求和利益相关者的期望。”
在思考如何利用数据科学来制定业务战略时,我想到了查看不同级别的业务战略:
- 公司战略:一家公司应该进入的市场,并通过竞争来定位自己,以实现其长期目标。
- 商业战略:公司为了实现其公司战略而必须采取的具体目标和行动。
- 职能战略:使一个组织能够实现其战略目标的日常运作的调整。
我认为,通过采用这种方法,我将有一个视角,使我能够尽可能简单地说明数据科学过程的输出和业务战略的开发之间的联系。
既然我知道租金确实会受到节假日(尤其是哥伦布日)的影响,我就有了制定商业策略的起点。我认为围绕对租金有最大影响的假期建立一个商业策略可能是有用的。我还认为,在实施我提出的策略后,预测预测的租赁数量将如何变化可能是有用的。
我问自己的第一个问题是“哥伦布日在华盛顿特区有什么可做的?”在我的研究中,我发现华盛顿州 DC 市在哥伦布日有很多可做的事情和可去的地方,包括:
- 白宫花园之旅
- 品尝华盛顿美食节
- 克里斯托弗·哥伦布纪念喷泉
- 乔治·华盛顿的弗农山
- 跳上跳下观光巴士旅游
我还对 Capital Bikeshare 做了一些研究,以了解他们提供的更多服务,这样我就对我必须要做的事情有了更好的了解。我很高兴地发现,他们有相当多的路径,他们有相当多的选择额外津贴提供给他们的客户,最明显的是提供给首都自行车共享客户的折扣。
然后我有了一个想法。我想:“如果能有一个全包的首都之旅,包括参观这些地方的一小部分,会怎么样?”我认为这肯定值得探索。我也认为这可能是明智的,让它成为一个家庭事务,并引入团体价格,使产品更具吸引力。
这将包括通过利用现有的合作伙伴关系来打造新的体验,并可能与其他企业发展新的关系,以便我们能够接触到新的客户。当我第一次想到它时,我并没有想到它,但很有可能,那些通过“旅游服务”(我现在称之为旅游服务)获得的客户中的一小部分,可能会成为回头客。
利用我们能够利用提供给我们的数据发现的东西,我们现在有了新业务战略的构建模块。
最后的想法
我当然希望今天的博文是有用的。像往常一样,我问,如果你对这篇文章有任何想法或意见,请与我分享。如果你对未来的博客文章有任何想法,请随时分享。我绝不是这方面的专家,但我想成为专家,所以我正在尽我所能寻求帮助。
为了进一步探索
用这些数据创建的其他 Kaggle 内核:
[## 自行车共享需求| Kaggle
城市自行车共享系统的使用预测
www.kaggle.com](https://www.kaggle.com/c/bike-sharing-demand/kernels)
这是资本自行车共享公司系统数据的链接。根据他们分享的内容,实际上有可能使用他们的数据来规划哥伦布日游,并决定如何实施商业计划。
[## 系统数据|首都自行车共享
开发者、工程师、统计学家和学者可以找到并下载首都自行车共享会员的数据…
www.capitalbikeshare.com](https://www.capitalbikeshare.com/system-data)
Python 中的要素选择:
[## Python 中机器学习的特征选择——机器学习掌握
你用来训练你的机器学习模型的数据特征对你可以…
machinelearningmastery.com](http://machinelearningmastery.com/feature-selection-machine-learning-python/)
如果你像我一样,目前正在培养你的商业头脑,你可以在这里了解扩大产品线的好处:
[## 扩大产品线的四个理由
对于希望增加收入或扩大市场的小型企业来说,扩大产品线是一项重要的增长战略…
smallbusiness.chron.com](http://smallbusiness.chron.com/four-reasons-expand-product-line-55242.html)
下一步是什么?
在我的下一篇文章中,我想我会看看如何构建一个自然语言生成系统。到目前为止,我所有的帖子都涉及到向用户提供某种信息,但我觉得有必要改进这种方式。这将是我的下一个挑战。
下次见。
给年轻自己的数据科学职业建议
原文:https://towardsdatascience.com/data-science-career-advice-to-my-younger-self-4c37fac65184?source=collection_archive---------3-----------------------
数据科学职业建议
我不知道这些想法是否会让年轻的我受益。我想他们会的。
If there’s such a thing as a career ladder, I think it looks something like this.
据我所知,数据科学在 2012 年左右开始成为一个普遍使用的术语,当时《哈佛商业评论》的一篇文章称其为“21 世纪最性感的工作”。当我读那篇文章时,我记得我曾想,这是我三四年来一直试图做的事情。我开始称自己为数据科学家,在我的职业生涯中,我担任过数据科学职位,并在安全和智能、旅游、资产管理、教育和广告行业建立和管理数据科学团队。
在我的职业生涯中,我对作为一名数据科学家在哪里工作以及如何工作的想法发生了很大变化。过去对我来说非常重要的事情现在已经不重要了。一些我曾经回避甚至看不起的事情,最后却给我带来了很多满足感。事后看来,我明白如果当时知道一些我现在知道的事情,我会多么感激。这篇文章是我总结其中一些教训的尝试。我希望它们可能对一些即将进入这个行业的人有用。
只有向上迈一步,如果这不是向侧面迈一步的话
我曾经在一个组织中努力晋升到一个相当有权威的职位,这个组织是同类组织中规模最大、资金最多、地位最高的组织之一。首席执行官是该行业最大的参与者之一。我进入了执行委员会,并最终领导了组织中的所有技术问题。我在组织中担任最高的技术相关职位,是董事会会议的必要出席者,诸如此类。就职业而言,这比我做过的任何事情都让我离我想要的地方更远。
不要误会我的意思:我学到了很多东西,也有很多机会,这些都有助于我达到现在的位置。但这不是升职。这是一次职业转变。我写的代码越来越少,写代码是我真正喜欢做的事情。我不得不把越来越多的设计决策交给其他人,因为我没有时间自己去做。我跑了所有我喜欢做的事情,但是我没有真正去做任何我喜欢做的事情。它越来越多地占用了我离开家人的时间。我到了那种地步,我做的几乎没有一件事是有意的——都是反应。这简直不健康。
我确信其他人可以达到更高的位置,并且比我做得或可能做得更好。此外,回过头来看,我可以看到该组织有多少功能失调。在某些方面,它甚至是有毒的。但是除了这些问题,我发现作为一个执行者比作为一个经理/主管/主管更令人满意。我真的喜欢设计东西。我并不总是选择能最大化我花在设计上的时间的职位。在我职业生涯的大部分时间里,我没有想到去思考我在工作中做的所有事情,并找出让我最快乐的事情,即使它们没有给我更多的报酬或更好的头衔。我希望我早点做那件事。
不要试图去改变世界
在我职业生涯的大部分时间里,我都在寻找工作能让我解决一些重大社会问题的方法。这就是在安全和教育领域工作吸引我的地方。当我在一家旅行社工作时,我在一家教育类的旅行社工作,这家旅行社给学生提供身临其境的体验。当我从事资产管理时,我为一家希望投资新兴经济体的公司工作。
我认为关注社会公益是一个错误。各个组织的愿景和执行能力各不相同。根据我的个人经验,更广阔的视野往往伴随着更弱的执行能力。我现在工作的公司成立时有一个非常明确的目标:想出如何在期望的时间和预算内,在期望数量的潜在客户面前投放广告。我曾经轻蔑地称这种愿景为“小部件制作”我学会了制作小部件的乐趣。因为我工作的公司已经学会了制作非常好的小部件,我们这些在那里工作的人可以自由地扩展到 R&D 的工作中。
我现在做的工作几乎都是我认为有趣的 R&D,如果该公司多年来没有短视地专注于打造一个超级好的广告小工具,以及支持它的所有基础设施,这一切几乎都不可能实现。我现在直接从事线下和线上行为的交叉,我认为这是我能从事的最有趣的事情之一。我认为,如果我寻找一家明确专注于改变世界的公司,或者甚至是一家专门为了解线下和线上行为的交集而成立的公司,我从事如此有趣主题工作的机会会少得多。当我不再试图做大事时,我得到了做大事的机会。
坚持那些重视个人贡献的组织
在我见过的大多数组织中,都有一个经理层级,但实施者的情况非常简单:一些个人贡献者被认为比其他人更有经验或更有能力,他们的薪酬和任务分配经常反映这一点,但在组织权威方面没有太大差异。在我目前的工作中,有一个明确的非管理职业阶梯,较高和较低阶梯之间的差异与设计权限有关:随着你的职位越来越高,你在实施什么以及如何实施方面被赋予了更多决策权。经理们关注的是业务需求的优先级、人际关系、确保资源的可访问性等等。
整个经历把我宠坏了。我不认为我能回到一个管理者控制实施的组织。我觉得我不能回非工程类的机构。在晋升只意味着管理的组织中,做一名技术员工是很难的。我希望我的职业生涯能少花些时间在这些类型的组织中。
位置很重要,但不是你怎么想
现在回想起来,我想当我搬到纽约市时,我偏离了方向。我意识到,我居住的弗吉尼亚州夏洛茨维尔并没有给我提供太多的发展机会:它太小了,尤其是在数据科学工作方面。所以我环顾四周,发现这个行业真正的中心,至少在当时的美国,是旧金山和纽约。我没有意识到这些市场已经饱和了,尽管它们很大。有大量的工作机会,但是有更多的申请人在竞争这些工作。
我在纽约找了一份工作,最终换了一份更高级的工作,也是在纽约。然后是时候离开那份工作了。这就是我看到在大型枢纽工作的不利之处。我要么(1)接受一个入门级的职位,拿着它的入门级工资,只是因为有太多的供应,我不能要求更多的个人贡献者职位,(2)改变职业生涯,成为一名全职经理,(3)相信我的运气和我的储蓄账户会坚持下去,因为我在等待一家公司寻找我的确切资料,(4)回到一家基本上不懂技术的公司,就像我以前工作过的一些公司一样,或者(5)搬到一个市场不那么饱和的地方。
我的家庭经济状况(是的,还有自尊心)不允许我担任初级职位。我不想再当经理了。我不愿意耗尽我们的积蓄来等待运气(因为它真的主要是运气)。我不想成为这个房间里最聪明的技术人员。那时我决定在纽约之外、比夏洛茨维尔更大的地方找工作,那时我意识到二三线城市的吸引力。
我把湾区和纽约市放在第一层,可能还有西雅图和波士顿。我把芝加哥、亚特兰大、奥斯丁、华盛顿、DC、丹佛和北卡罗来纳研究三角这样的地方放在第二层。我把哥伦布、盐湖城、印第安纳波利斯、纳什维尔等城市放在第三层。(如果你来自这些地方,不喜欢你所在的层级,不要对我大喊大叫——这是个人的启发,而不是经过验证的分类)。
与美国其他地区相比,所有这些二线城市的科技产业都非常大,而与一线城市相比,这些产业都很小。他们没有他们需要的那么多有经验的人,部分原因是一线城市正在吞噬更有经验的人(我怀疑,他们中的许多人正在接受管理工作或报酬低于他们经验所允许的工作,因为他们正在与一大批同样渴望就业的人竞争)。虽然在下一层位置可供选择的公司越来越少,但这些公司仍然在做真正有趣的事情,而且有足够多的公司在未来仍然有机会在不移动位置的情况下转移工作。
工作/生活的平衡几乎比任何事情都重要
我开始认识到,在一个承认我有权与家人共度时光的地方工作,对我的幸福是多么重要。在我目前的工作中,当我需要在家工作或早回家或晚回家处理事情时,没有不祥的摇头或皱眉。只要我能满足人们对我将交付什么以及何时交付的期望,并且不妨碍其他人满足他们的期望,我很大程度上可以按照我需要的方式安排我的时间和剩余的生活。我做过的其他工作并不总是这样。直到最近,我才意识到灵活性的缺乏在多大程度上抵消了一大堆额外津贴和福利。当然,这是个人喜好。我想说的是,我花了比我希望的更长的时间来承认这种偏好。
一份总结
当我回顾这些年来我面试过或工作过的公司时,我很少想起:
- 对他们想要达到的目标有非常明确的定义。
2.已经在政策、人员和基础设施方面进行了投资,以始终如一地做他们计划要做的事情。
3.首先是一个工程组织。
4.明确支持那些希望在不成为经理的情况下成长的个人贡献者。
5.为有家庭的人支付体面的工资,并想为退休储蓄和/或买房。
6.对聘用高级人员进入非管理领域感兴趣。
7.认可员工在工作之外拥有充实生活的权利。
8.提供持续有趣和富有挑战性的分析工作。
当我在大型科技公司面试时,我发现对第四和第六点的支持有限,对第七点几乎没有支持。当我在科技创业公司采访时,他们通常处于难以置信的早期阶段,因此在#1、#2、#5、#6 和#7 上失败了。当我采访拥有大量或不断增长的技术业务的大型非技术公司时(基本上放弃获得第三名),我发现他们几乎总是在第一名和第二名失败,而且几乎从未提供第八名。我发现最吸引我的公司都是处于创业后期的公司。在许多情况下,我仍然发现它们落在#4 和#7 上,有时落在#5 和#8 上,但这似乎提供了最多的信号和最少的噪声。
嗅觉测试
这对我来说可能有些过了,但我觉得那些最好地体现了我上面概述的优先事项的公司是那些在他们的技术访谈主题上最灵活的公司。在我上一次找工作时,我实际上拒绝了白板面试或其他技术任务。
我仍然认为这是一个好主意——除了非常初级的候选人,在这种情况下,问题应该非常简单和一般,我认为技术挑战是一种不人道的,也是无效的人力资源实践。当我开始告诉公司,如果他们坚持一项技术任务,那么我可以说这是一个糟糕的文化适应,我有几个人同意在没有白板的情况下进行面试,然后他们基本上会尝试在没有白板的情况下进行白板面试(这比使用白板更难)。
我仍然对 MaxPoint(我现在的雇主,尽管我们现在是 Valassis Digital 的一部分)印象深刻,在那里,面试官让我带他们浏览我自己认为会有帮助的代码。我的黄金标准仍然是我在英格玛经历的,在那里我和另一位数据科学家坐在房间里,我们一起计划如何开始解决一个他们自己都不知道答案的真正的业务问题。我想我可以通过观察一家公司在评估我作为候选人时的灵活性来了解这家公司。如果我的目标是其他优先事项,这可能不会是一个强有力的指标。
理想很重要
因此,如果我突然发现自己在找工作,我个人会在对我有吸引力的下一级地点寻找晚期创业公司。我会寻找一些公司,它们有足够的资金,不会试图让我累死或克扣工资,在市场上已经取得了足够的成功,我可以衡量它们是否擅长自己的工作,并且足够专注,不会假装试图改变世界。一旦候选公司在如何评估我的问题上表现出不灵活,我就会解雇他们。我知道我的经济状况并不总是能让我对工作地点如此挑剔。我仍然认为理想是一个重要的目标。
我的职业目标发生了很大变化。我已经学会了宁可夸大家庭的成本,也不要夸大特定职业变动的职业收益。我已经学会了从工作中获得极大的满足感,但我的大部分快乐来自于与我的职业完全无关的事情。对我来说,这是一个相当大的变化,我认为这是一个健康的变化。就像我说的,我不知道这对其他人来说是不是一个好的生活方式。但是,现在回想起来,我发现我做的许多选择排除了我思考工作以外的任何事情的能力,那不是一个健康的地方。
与此同时,如果没有经历过过去不同工作的雄心和挫折,我不认为我能从目前的职业状况中获得如此多的满足感。如果没有最初帮助我形成这些建议的经历,也许所有这些对年轻时的我的建议都不会有任何帮助。尽管如此,我还是希望早点知道这些事情。如果没有别的,我想这会给我一个更清晰的愿景,让我知道我的职业生涯将走向何方。
编辑:我又写了一篇关于 的帖子,给年轻的自己 。