TowardsDataScience 博客中文翻译 2016~2018(三百一十一)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

可视化数据科学中的成功——获得梦想中的工作

原文:https://towardsdatascience.com/visualizing-success-landing-that-dream-job-fac7e8f65088?source=collection_archive---------4-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Free Press Journal

你如何才能在数据科学领域找到理想的工作?由于这些都是引人注目的高薪机会,大多数公司不会依赖简历机器人来筛选候选人。LinkedIn Group“管理分析”目前正在研究数据科学领域成功就业的关键成功因素。

虽然组织经常在各种管理档案中寻找数据科学技能,但吸引招聘人员的目光已经变得越来越困难。最近的估计表明,目前大约有 15000 名合格的数据科学家在工作,200 000 名声称有资格证书,以及近 100 万名“想要成为”的人。正如营销大师塞思·戈丁可能会提出的*,简历的目标不是在人群中脱颖而出,而是在你未来的雇主心中留下深刻印象*。[2]

作为就业候选人,我们建议在分析招聘流程时应用数据科学思维。促使每个特定组织考虑雇用数据科学家的问题的本质是什么?什么样的数据线索可用于确定他们的市场和/或组织挑战?在利益相关者看来,他们认为应对挑战的最佳方法是什么?最后,你如何展示数据(你的个人资料、你的经历和你的动机)来引发行动号召——伸出手来雇佣你?

根据描述性、预测性和规范性分析的愿景,编写一个商业故事,其中你的贡献将被视为一个关键的成功因素。确定雇主所面临挑战的性质——认为缺乏人才、流程效率低下或技术使用不当。探究组织和市场的历史是如何让这个问题持续存在的。请记住,招聘人员或项目经理是这个故事的主角,描述一下你将如何解决这个难题。通过你的推荐人和你的资历提供证据,证明“幸福的结局”始于让你加入公司。

如果清楚地讲述你的故事很重要,那么关注你的听众听到了什么是至关重要的。你的招聘人员会将你的经历与成百上千的其他应聘者的经历进行比较。前景理论的原则可以帮助你预测框架如何影响你提出的数据和论点。锚定可以被用于你的优势,发挥你的优势,忽视你的弱点。模糊偏见可以用来降低与你未来就业相关的风险、不确定性和/或模糊性。

在你的简历和面试中运用视觉叙事的原则,将你的个人信息转化为行动号召——一起工作。埃德加·戴尔围绕经验锥所做的工作表明,观众对他们所看到的东西的记忆要比他们所读到的东西多得多[3]。他们对你展示的数字不太敏感,而更关心你如何帮助他们将可分享的经验形象化。相似性、接近性、连续性和收尾的格式塔原则在这里和在任何商业陈述中一样有效,为什么不应用它们来帮助你的招聘人员理解你试图讲述的故事呢?

最后,记住你的简历、求职信和每一次面试都只是围绕“自我、我们和现在”的一个更大的集体故事中的几个章节。[4] Y *我们的故事早在你想到申请他们组织的职位之前就开始了,他们的故事不仅仅是雇佣一名数据科学家。*社交媒体和专业网络的使用有助于开发为什么这两个故事合在一起有意义的元数据。数据挖掘可以帮助你发现隐藏在背后的机构故事和对话。招聘过程的每一步都应该加强而不是削弱这些对话。最后,你的故事必须既有数据驱动,又在你未来雇主试图讲述的更大故事中有意义。

领英集团 管理层分析 讨论的主要焦点之一是数据科学领域就业的关键成功因素。该小组每周都会调查就业市场和特定的组织机会。集团经理定期发布与人力资源专家和数据科学从业者的访谈,以获得见解和讨论。在接下来的几个月里,该小组将分享有效招聘策略的例子,并在设计可视化简历和编写面试脚本方面提供帮助。加入讨论,实践数据科学所宣扬的内容。

商业分析实践是商业分析研究所的核心和灵魂。在我们位于巴约纳的暑期学校,以及我们在欧洲的大师班,我们专注于数字经济、数据驱动的决策、机器学习和视觉通信,我们可以帮助您将分析应用于您和您的组织。

Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 个人资料可以在 www.linkedin.com/in/leeschlenker.查看你可以在 https://twitter.com/DSign4Analytics的 Twitter 上关注我们

[1] Quora,如今有多少数据科学家(以任何名字命名)?,2015 年 10 月

【2】戈丁,赛斯,与众不同还是不同凡响?, Typepad,2013 年 4 月

[3] Maheshwari,V . K .埃德加·戴尔的经验锥,2016 年 10 月

[4]甘兹,M. 讲述你的公共故事

三维可视化印度铁路

原文:https://towardsdatascience.com/visualizing-the-indian-railways-in-3d-22738404fea4?source=collection_archive---------4-----------------------

本文描述了作为 IDC 交互式数据可视化课程一部分的地理可视化项目的概念、流程、见解和扩展。

最后,我有了这个三维可视化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

概念

这个概念是将印度铁路网上每个车站始发的列车形象化。这将允许用户比较数字,甚至根据他们的位置得出结论。目标是能够使 viz 有洞察力,并且必须至少遵循威廉·克利夫兰的三个视觉操作,即检测、组装和估计。这些都在课程中讨论过。你也可以看看这个由约翰·劳瑟做的展示。他涵盖了关于数据感知的非常有趣的方面。在他的演讲的第 115 页提到了克利夫兰的模型。我想,如果我能在车站的位置制作 3d 条形图,那么高度将代表源列车的数量。

简而言之,可视化参数如下(基于 Isabel Meirelles 在 Design for information 中的描述标签):

  • 国家印度
  • 媒介在线互动应用
  • 运输
  • 任务提供从车站出发的列车的比较
  • 结构代表始发列车数量的车站位置的 3D 突出

我还想,如果我们可以制作一个“粗略的”等高线地图,对到达一个地方的难易程度进行“编码”。这将基于从通过的列车数量、停止时间和特定车站一天中的时间得出的指数。等高线将被绘制成倒置的,这样,如果一个地方有较少的火车经过,它的高度将会更高,因为它很难到达。我觉得这也会给轮廓带来一些物理属性。想象一下,有人坐在地上,说 A 很难到达一个车站,因为只有一列火车经过,而说 B 却很容易到达,因为有 10 列火车经过。因此,“A”将显示得比“B”高。一个冰可以在虚拟现实中探索它。在我们拥有的短时间内,我无法找到实现这一点的工具。

过程

该流程包括:

  • 来源和清理数据
  • 获得有用的数据
  • 将数据转换成 geojson
  • 地图上的展示

选择的武器是:R、Python、Mapbox 和 Google Sheets

采购和清洁数据数据由data.gov.in提供。使用的格式是 csv。我用了 R 代码的这个来源作为参考。

导出有用数据

首先,我使用 R Studio 读取 R 中的数据。

library(readr)
timetable <- read_csv("C:/Users/my pc/Downloads/isl_wise_train_detail_03082015_v1.csv")

接下来,我制作了火车的子集。因此,我可以捕捉已经到达目的地的火车。

timetable.srs.dest <- subset(timetable, timetable$`station Code` == timetable$`Destination station Code`)

利用dplyr库,我对数据进行了分组和汇总。然后我把文件写成 CSV 格式。

library(dplyr)
traingp<-group_by(timetable.srs.dest,`source Station Name`)
trainsfromStation<-summarise(traingp,count=n())
trainsfromStation
arrange(trainsfromStation,desc(count))
write.csv(trainsfromStation,"NumbOfTrainsoriginating.csv")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我还做了一些其他的探索性分析,比如每站经过的列车。

trainflux<-group_by(timetable,`Station Name`)
trainflux
trainfluxCount<-summarise(trainflux,count=n())
trainfluxCount
arrange(trainfluxCount,desc(count))
arrange(trainfluxCount,count)
write.csv(trainfluxCount,"trainsstoppingperstation.csv")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

停止时间和每个站点的平均停止时间。这可以让你了解一个电视台有多忙。由于我的 n00by R 技能,这并不像看起来那么简单。首先,使用Distance !=0移除所有源站和目的站。由于提到时间的方式很有趣,我不得不去掉所有时间向量中的单引号。为此,我使用了gsub。然后,我必须将字符转换成 POSIXlt 日期格式。这将启用使用difftime的时间计算。使用 difftime,我为 HaltTime 创建了一个新的矢量,分辨率为分钟。有人告诉我,这些步骤只需在 excel 中点击几下。

trainNoSource=subset(timetable,dataset$Distance!=0)
trainNoSource$`Arrival time`<- gsub("'",'',trainNoSource$`Arrival time`)
trainNoSource$`Departure time`<- gsub("'",'',trainNoSource$`Departure time`)
trainNoSource$`Arrival time`<-strptime(trainNoSource$`Arrival time`,format = ("%H:%M:%S"))
trainNoSource$`Departure time`<-strptime(trainNoSource$`Departure time`,format = ("%H:%M:%S"))
trainNoSource$`Halt Time`<-as.difftime(trainNoSource$`Departure time`-trainNoSource$`Arrival time`,format = "%H:%M:%S",units="mins")

接下来,我删除了停车时间小于 0 的列车,并按照车站对它们进行分组。我移除了到达和离开的向量。然后我研究了平均停顿时间。

trainNoSource=subset(trainNoSource,trainNoSource$`Halt Time`>=0)
trainNoSource$`Arrival time`<-NULL
trainNoSource$`Departure time`<-NULL
trainNoSource_grpstation<-group_by(trainNoSource,`Station Name`)
trainNoSource_haltTimes<-summarise(trainNoSource_grpstation,count=n(),totalhalt=sum(trainNoSource_grpstation$`Halt Time`))
arrange(trainNoSource_haltTimes,desc(count))
trainNoSource_haltTimes<-summarise(trainNoSource_grpstation,count=n(),totalhalt=sum(`Halt Time`))
arrange(trainNoSource_haltTimes,desc(count))
arrange(trainNoSource_haltTimes,desc(totalhalt))
trainNoSource_haltTimes$`avgstop`<-trainNoSource_haltTimes$totalhalt/trainNoSource_haltTimes$'count'
arrange(trainNoSource_haltTimes,desc(avgstop))
write.csv(trainNoSource_haltTimes,"avgHaltTimeperstation.csv")

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

将数据转换成 geojson

csv 文件被上传到 google sheets。我使用了awesome tablesGoogle sheets 插件将站点代码转换成纬度和经度值。

不幸的是,使用 mapbox 进行挤出的文档非常少。仅仅是一个例子,它花了我相当长的时间去工作。从例子 geojson 来看,似乎需要一个heightbase heightcolor属性。我不想太复杂,所以我选择了单一颜色。我构建了如下的 google sheet 文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后,我使用 geojson.io 将 csv 转换成 geojson 文件。也可以使用地图框工作室进行同样的操作。

这似乎足够了,但是

我一点也不知道

“拉伸”属性只能应用于多边形。如何将点转换成多边形?这可能不是在凌晨 3:45 问的最相关的问题。但不幸的是,它是!Python前来救援。感谢一些以前的作品

当“我写了一个剧本”变得和“我洗了个澡”一样平常的时候,我写了一个剧本。

该脚本将简单地把这些点转换成一个固定大小的正方形。geoJSON 规格表很有帮助。这个过程是以这个点作为正方形的中心,然后以循环的方式计算角点。

在地图上展示

到早上 6 点,我已经在 mapbox studio 中完成了地图上的所有多边形。为了突出高度,我将车次乘以 7000,因为它似乎对视觉检测有很大影响,有助于估计。我后来使用了地图框的例子,并修改了它来添加工具提示。

结果就在这里主持。项目在此回购。如果我错了,请随时纠正我。

洞察力

我们在课堂讨论中获得的一些见解是:

  • 瓦多拉只有一趟始发列车,但有 298 趟列车经过

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 有从达卡始发的国际列车

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 霍拉启动的火车最多

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 随着越来越多的列车从边界始发,列车从外到内移动。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

扩展ˌ扩张

  • 使用颜色通道采用冗余,以允许用户知道列车始发的范围。一种颜色代表 1–10、10–20 等。
  • 再加一层乘火车路过
  • 看看是否能发现洞察力,如果火车能和人口一起被可视化。

希望这有所帮助!

干杯,

Rohit

最初发表于 http://rohitg.in/2017/09/10/DataViz/并使用http://markdowntomedium.com转换为媒介

用 Python 可视化人群的疯狂

原文:https://towardsdatascience.com/visualizing-the-madness-of-crowds-with-python-1a81aaa22784?source=collection_archive---------17-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Which would you have invested in?

我们将数据科学中的事物可视化的根本原因不仅仅是为了展示漂亮的图片,而是为了表达不容易理解的想法。

我脑海中不断闪现的一个想法(无意双关)是资产价格泡沫:当股票、黄金或房地产等资产的价格以前所未有的幅度脱离其基本面驱动因素时。

值得注意的是资产泡沫不一定排除非金融工具。大规模金融泡沫的最早例子之一发生在郁金香市场:

  • 形象归功于洛特·范·多恩

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Readers who may be confused by the idea of a Tulip Bubble may want to check this out

在本帖中,我们将通过一些典型的金融时间序列来了解资产泡沫的一些显著特征。

除了用于数据分析的标准库之外,我们还将使用一个新的库。所以,事不宜迟,让我们启动 Jupyter 笔记本:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# New library
import pandas_datareader.data as webimport datetime

为了分析金融资产,业内的标准做法是将投资业绩与一些基准进行比较,如标准普尔 500 指数,该指数由在纽约证券交易所和纳斯达克上市的 500 家美国大型市值公司组成。我们的行动计划将是比较两种资产(比特币和 Helios and Matheson 股票)与标准普尔 500 的已知泡沫历史。

在这里,我们将为标准普尔 500 创建一个熊猫数据框架,以及比特币(加密货币)和 Helios and Matheson(股票代码:HMNY)的数据集,Helios and Matheson 是支持 MoviePass 的上市公司。我们数据框架的主要利益变量是*‘调整收盘’*,这是针对股票分割等事件调整的常规价格,因此更准确地反映了现实。

我们的数据框架:

  1. 标准普尔 500 指数
  2. 比特币
  3. 电影通行证库存

我们还要确保我们考察的所有变量都在同一个时间框架内,在这个例子中是从 2013 年到 2018 年。因此,我们所有的数据框架将在该时间框架内作为其各自的指数,每日频率作为频率。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所有数据帧将具有 1496 行和 6 列的形状。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们要做的第一件事是检查表格格式的数据,看看我们是否可以收集一些见解:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

通过查看平均值、中值和标准差,我们知道:

  1. 标准普尔 500 看起来很正常,有相似的平均值和中值,标准差大约是平均值的 17%。
  2. 比特币的平均值约为中值的 4 倍,这表明它向右倾斜,而标准差要大得多
  3. 与比特币类似,MoviePass 股票的均值大于中值,标准差几乎与均值一样大。

我们可以通过对调整后的收盘价做一些简单的直方图来证实我们的直觉:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

直方图证实了比特币和 MoviePass 相对于标准普尔 500 的某种正态分布具有偏斜分布。

但是无论是直方图还是表格数据摘要都不能告诉我们是否存在泡沫。我们可能会一行一行地检查所有的数据集,但是那将会是枯燥、乏味和反 pythonic 的。

让我们做更多的可视化:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在这里,我们第一次真正直观地确认了资产泡沫,将比特币的价格与标准普尔 500 价格进行了比较:经典的曲棍球棒模式,超高速上涨,然后以同样的速度下跌,如果不是更快的话。

下图显示了每日百分比变化。请注意比特币在 2014 年 2 月 14 日经历了 339%的价格上涨。

接下来我们来看看 MoviePass 股票:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们再次看到了相同的曲棍球棒模式,但这一次 MoviePass 股票显示了至少两种不同的泡沫状价格行为,在 2016 年 6 月 7 日,价格绝对惊人地上涨了 900%。

虽然表格数据确实给了我们数据集的简明摘要,但只有通过可视化数据,我们才能全面了解价格动态变化中的戏剧性事件。

通常,为了向大众传达一个观点,一个高影响力的视觉效果比一千篇只有少数人能理解的学术论文更有用。

让我们来看看资产的波动性:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上面的图显示了价格的变化,并给我们提供了价格波动的有力线索。用相同的 y 轴缩放,它们表明比特币和 MoviePass 股票可能是普通投资者可能希望远离的高于平均水平的风险资产。

预测?也许

关于可视化的最后一点是预测。在查看数据集时,我脑海中萦绕的一个问题是,有人能通过可视化工具仅查看过去的数据来预测资产价格泡沫吗?

做到这一点的一个方法,或者至少,得到一个关于时间序列可预测性的线索,是使用均值回复的概念。

让我们再来看看《标准普尔 500》的情节,与《比特币》和《电影通行证》的情节相比。

我们实际上将使用雅虎愿意给我们的所有数据,并扩展我们当前的数据框架。同时,我们将为我们的每项资产创建一个新列,该列将记录从一个时期到下一个时期的*【Adj Close】*价格特征的变化。

新列将被称为*‘调整收盘差异’,根据定义,它是前移一个周期的‘调整收盘’与当前的‘调整收盘’*之间的差异,也称为一个系列的第一差异

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

尽管比特币和 MoviePass 的价格历史并不像标准普尔 500 那样久远,但视觉效果仍然揭示了重要的见解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先,标准普尔 500 的时间序列图显示了长期的上升趋势。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

第二,如果我们比较标准普尔 500 从时间段(1980-1995)到时间段(1996-2018)的“Adj Close”价格的平均值,在数量上有很大的差异。

这两个观察告诉我们的是,标准普尔 500 的时间序列数据属于一类称为非平稳数据的时间序列数据。

非平稳数据的两个定义特征是:

  1. 非常数意味着跨越不同的时间段
  2. 非常数意味着即使取不同时期均值的差值,均值的变化也是非常的

如果平均值的变化是恒定的(长时间围绕同一点上下波动),则由于不同时间段的不同平均值而不稳定的时间序列数据可以变为稳定的。

为什么这很重要?

因为与非平稳时间序列相反,平稳时间序列会回归均值,因此可以用统计方法进行分析,例如预测。

如果你检查 2011 年至 2017 年比特币的调整后收盘价,它类似于众所周知的随机漫步,没有明确的趋势,直到你到达 2017 年至 2018 年期间。

同样的情况也适用于 2003 年至 2018 年左右 MoviePass 股票的调整后收盘价。

如上所述,判断一个时间序列是否可以平稳,从而均值回复的一种方法是,像我们在这里做的那样,查看价格的一阶差

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如上图所示,标准普尔 500 指数的均值明显不是平稳的,因为即使是首差也有增加的趋势。

此外,似乎有一些强有力的证据表明,比特币和 MoviePass 股票都是稳定的,因此意味着它们的大部分价格历史都在回归。

因此,对于一般投资者来说,投资于具有以下特征的资产可能并不明智:

  1. 长期均值回复特性和
  2. 价格以前所未见的幅度上涨(曲棍球棒模式),没有充分的理由
  3. 易挥发的

归根结底,视觉的最终力量不在于它们提供了确凿的证据,而在于它们为我们的研究提供了必要的指导,并为普通人提供了易于理解的信息。

你可以在这里找到完整的代码和数据。

想象穿过 IIT 孟买(主门)的行人流量

原文:https://towardsdatascience.com/visualizing-the-pedestrian-flow-through-the-iit-bombay-main-gate-4104cb904a82?source=collection_archive---------5-----------------------

2017 年 8 月 30 日进行了一项调查,以研究通过 IIT 孟买大门安检的人流量。IDC 的两名学生正在记录数据。一个在入口侧,另一个在出口侧,在电子表格上实时输入行人数据。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(Left: Sukant Maharana — Logging the pedestrian entries) (Right : Jonathan Mathew —Logging the pedestrian exits)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Left: Logging, clustering, and counting each clusters of the pedestrian entries Right : Same for the pedestrian exits

记录的行人数据参数有—
时间、类别(学生/职员/工人)、性别,如果他们成群结队而来,那么一组有多少人。我们把总的统计数据制成表格。
要计算的变量有:

总出入境人数
总学生出入境人数
总职工出入境人数
总职工出入境人数
总男性出入境人数
总女性出入境人数
总男学生出入境人数
总女学生出入境人数
总男职工出入境人数
总女职工出入境人数
总男职工出入境人数
总女职工出入境人数

在任何给定时间,这相当于 12x2=24 行数据

这是 2017 年 8 月 30 日下午 3:30 到 7:30 录的 4 个小时。然后他们被分成 15 分钟的数据组。因此,创建了 4x4=16 个数据仓/簇/列来可视化。这样我们就得到了一个图表,总共有 24 条线在 15 分钟的 X 方向上以 16 个间隔移动,结果绘制了 24x16=384 个点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

点击下面的链接,查看上图的互动版

[## [折线图]基本

编辑描述

www.arkadesignstudio.in](http://www.arkadesignstudio.in/iitb%20data/main/main.html)

关于图表

该图表在 X 轴上绘制了 15 分钟的时间间隔,在 Y 轴上绘制了进出的人数。有一系列复选框负责显示或隐藏每一行。我们可以控制哪个看哪个不看。

绘图和分析—所有 24 行

在这段时间里,大部分住在校外的人回家,教职员工外出购物和进行日常必要的活动,住在校外的学生回家,而一些住校生也去校外与朋友共度夜晚。

绘图和分析—总出入量

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

棕色线显示总出口,而天蓝色线显示总入口。这包括所有进出大门的行人、学生、职员和工人。我们可以看到,在超过 4 小时的时间内(从下午 3:30 到晚上 7:30),行人的数量总体上有所增加。出口的数量远远多于入口。我们发现,在下午 6 点和 7 点的前一刻钟左右,入口和出口都出现了峰值。

我们可以看到,下午 4:30-4:45 是教职员工和学生最繁忙的工作时间,他们需要收拾一天的工作。人们大约在 4:45-5:00 开始离开。

绘图和分析——学生、职员和工人的总出口

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

黄线显示员工总出口,而棕色线显示学生总出口,绿线显示工人总出口。在学生和员工之间可以看到良好的相关性,因为他们都有或多或少相同的时间表,但在工人中却不同,因为他们有突然的时间表。这些曲线仍然遵循比例增减的模式。

绘图与分析—全体员工出入

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

黄线显示五线谱出口,而紫线显示五线谱入口。
进出人员数量有较好的增减比例。这是因为大量的住宿员工外出当地购买夜宵,并在 15-30 分钟内返回。

请随时回复这篇博文或直接给我回复关于这个研究项目的建议或关于任何有趣项目信息

读者好
我是 Arka Majhi,IIT 孟买 IDC 设计学科的硕士研究生。作为学术工作的一部分,我做了一个关于数据可视化的练习。

同时查看我的作品集和资源库

设计作品集:https://www.behance.net/arkamajhi4d63

建筑作品集【http://spadelhi.org/arkamajhi/】:

工作室网站:http://arkadesignstudio.in/

通过喜欢和张贴你对我的项目的建设性意见来支持我。提前感谢。将等待您的回复。

想象叙利亚-约旦边境的难民危机

原文:https://towardsdatascience.com/visualizing-the-refugee-crisis-at-the-syrian-jordanian-border-70526b60fb12?source=collection_archive---------12-----------------------

我在 2016 年到 2018 年间绘制了 Rukban 难民营的地图。继续阅读,了解更多。

Rukban 是叙利亚和约旦边境的无人区。2014 年,该地区成为逃离叙利亚内战的难民的居住地。

联合国卫星项目自 2014 年底以来一直在记录鲁克班地区的收容所数量。现有数据涵盖了过去两年,最近一次统计是在上个月发布的。

本文探讨了 2016 年 5 月至 2018 年 6 月期间联合国卫星项目关于 Rukban 难民营的数据。

我在图 1 中绘制了庇护所数量随时间的变化。截至 2018 年 6 月,共有 11,702 个庇护所。自 2016 年 12 月以来,收容所的数量一直在增加。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1

在图 2 中,我绘制了 2016 年 5 月至 2018 年 6 月之间十二个不同时间点的避难所密度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2

最后,我很好奇从太空看 Rukban 避难所是什么样子。因此,我使用了大约在联合国卫星项目评估完成时拍摄的公开卫星图像。图像如图 3 所示。遮蔽物是图像右下四分之一处最明显的暗像素和亮像素。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3

关于这篇文章

  • 阅读 了解我在这篇文章中使用的三个数据源的更多细节。
  • 要重现图 2 & 3 使用 这段源代码 (Python)。
  • 在图 3 中,我使用了 Sentinel-2 l1c 级产品。您可以使用经过大气校正的 l2a 产品来获得更加一致的图像。
  • 如果你有任何问题,请在下面的评论区留言或发送给我:[anajjar@protonmail.com](mailto: anajjar@protonmail.com)

可视化翻译质量数据

原文:https://towardsdatascience.com/visualizing-translation-quality-data-a2be30788bfe?source=collection_archive---------3-----------------------

没有知识不是力量

毫无疑问,我们正生活在信息时代最激动人心的日子里。电脑越来越快,智能手机无处不在。惊人的多样化来源每天都会产生大量的数据。为语言服务购买者和提供者收集数据肯定比以往任何时候都容易,但看起来本地化行业并没有做很多工作来利用所有这些信息。总的来说,当然,除了少数例外,这个行业似乎错过了这一点,没有充分利用,或者至少试图理解,所有这些每天产生的精彩信息。

也许问题在于,太多的信息可能很难理解,甚至会让人感到不知所措。准确地说,这就是数据可视化的优势。

在这一系列文章中,我将介绍三种不同的工具,您可以使用它们来可视化您的翻译质量数据:Tableau、TAUS DQF 和 Excel。本文是第 1 部分,将只关注一般信息和表格。

数据可视化的案例

也许数据可视化最重要的一点是,它允许你以一种非常自然的方式吸收信息。在表格中很难理解的大量信息,在一个漂亮的图表中呈现和总结时突然变得有意义。模式和趋势可能变得更容易发现,有时甚至是显而易见的。相关性可能会突然出现,给你急需的业务或战略优势,让你有效地根据你的信息采取行动。

这如何应用于翻译/本地化实践?嗯,有很多信息可以测量和分析,例如:

  • 生产力,
  • 供应商表现,
  • MT 系统性能,
  • 工具性能,
  • 财务状况,
  • 流程效率等…

在易贝,我们使用数据可视化来跟踪供应商的表现、不同语言组合的机器翻译输出质量、机器翻译输出中发现的问题类型的详细信息、我们在供应商的交付物中发现的问题类型等等。

钥匙

让我们花一分钟的时间来检查使可视化有效的必要条件。你会注意到,我绝不是这方面的专家,但根据我的经验和研究,以下是需要考虑的要点:

首先要明确。你想用图表找出什么?你想引起人们对什么的注意?你在说什么呀传递明确的信息是当务之急。

要有选择性**:不要仅仅因为。仔细计划你想要包含的数据点,评估它们是否有助于你的信息的主要目的。这可能很难做到,尤其是当你有太多信息的时候——你可能会想添加一些没有任何价值的信息。**

记住你的听众,保持相关性**。塑造你的信息来回答他们可能有的问题。丢弃任何他们认为不必要的信息。项目经理可能对财务和按时交付的百分比感兴趣,工程师可能对流程效率感兴趣,而语言经理可能关注质量和语言表现。**

思考一下呈现信息的最佳方式,以及如何突出最重要的信息。包含趋势、突出模式并使有意义的相关性显而易见通常是个好主意。

(舞台上由人扮的)静态画面

Tableau 可能是最流行的可视化程序之一。这个概念很简单:Tableau 可以从一个简单的 Excel 文件或数据库(以及其他几个选项)中读取数据,解析它,并将信息转化为维度和度量。这是最棒的部分:你可以简单地将这些维度和度量拖放到列和行上,Tableau 会为你生成图表(或者他们喜欢称之为视图)。自动地。毫不费力。

它还提供了一系列令人惊叹的图表选项和定制选项,当你开始使用该软件时,这些选项可能会让人不知所措,但一旦你掌握了其中的窍门,就完全有意义了。

让我们来看一些例子*😗*

  • 这张图表以一种非常简单的方式展示了我们目前正在处理的两种内容类型的供应商表现,即标题和描述。很明显,供应商 2 可能是描述的最佳选择,而供应商 5 在标题方面表现不佳。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 现在,假设我们想要分析不同语言的后期编辑是如何工作的,同样是基于内容类型。我们可以看一下评审人员为他们每个人发现了多少错误。

这里很明显,德国的后期编辑在描述方面做得很好,但他们在标题方面很吃力,因为蓝色列的位置有很大的差异。我们还可以看到,西班牙语和法语似乎高于误差平均值。意大利语、葡萄牙语和俄语从一种内容类型到另一种内容类型没有显示出重大变化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

c)现在,我们想更深入地了解审核人员发现的错误,为此,我们将按语言查看不同类型的错误。看这张图表,似乎最大的问题是误译。这是一个很好的提示,可以尝试找出为什么会发生这种情况:来源太复杂了吗?后期编辑做的研究不够吗?我们是否提供了正确的参考资料?另一方面,数据似乎表明术语并不是一个大问题。我们可以推断我们的术语表可能是好的,我们的工具显示正确的术语表匹配,我们的翻译是主题专家。

例如,我们也可以看到法语比意大利语有更多的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Tableau 将很容易让你交换你的列和行来改变数据的显示方式。在下面的例子中,重点是错误类别,而不是发现的错误数量。然而,在这个视图中我不喜欢的是错误类别的名称是垂直的,难以阅读——可以旋转它们,但这会使图表变得更宽。

您可以尝试创建一个视图,以尽可能最好的方式准确显示您想要的内容,这有很多选项。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 一个非常简单的方法,可以根据处理的字数快速查看最忙的月份。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 现在,我们想看看编辑距离 —分析这些信息可以帮助我们计算出,例如,按语言的机器翻译性能,考虑到较小的编辑距离意味着较少的后期编辑工作。我还将包括字数,以查看上下文中的编辑距离。

我可以让 Tableau 在图表中画一条线来显示所有语言的平均编辑距离。

蓝点表示德语是编辑距离最低的语言,平均为 21.15。这可能表明我的 DE 输出是好的,或者至少比语言的其他部分更好。意大利语的红点到处都是,这可能表明我的 IT MT 输出质量不一致——与葡萄牙语正好相反,大多数紫色点集中在图表的中心。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 在这个最后的例子中,让我们假设我们想要看到我们的评论者覆盖了多少内容;理想情况下,他们应该审查 50%的总字数。在这里,我们可以看到,按照语言,我们已经处理了多少单词,复习了多少单词。您可以很快看到法语单词数是俄语单词数的两倍。你还可以很容易地注意到,FR reviewer 没有覆盖其他人那么多。这可能表明您需要另一个审核人,或者当前审核人表现不佳。相比之下,葡萄牙语的总字数和评论字数之间的差异很小。如果我们只需要审核 50%的内容,PT reviewer 就覆盖太多了。

使用 Python 可视化 Tweet 矢量

原文:https://towardsdatascience.com/visualizing-tweet-vectors-using-python-e528358bce68?source=collection_archive---------0-----------------------

此内容最初出现在 好奇洞察

我尝试了很多不同的技术。我发现,拥有使用各种概念、语言、库、工具等的经验。当试图解决问题时,会导致更稳健的思考。如果你不知道某样东西的存在,那么当它有助于你使用时,你就不能使用它!有很多方法可以获得这些经验。人们可以在网上找到几乎任何可以想象的主题的精彩内容。但是我发现理解一项技术的最好方法是尝试用它来建造一些东西。

我的最新目标是 Python 生态系统中的一篮子不同的库,涵盖 web 开发、缓存、异步消息传递和可视化等内容。由于我是一名数据科学家,我加入了一个机器学习组件只是为了好玩。为了探索这些技术,我创建了一个半实用的应用程序,它从 Twitter 流中读取,解析推文,并进行一些机器学习魔法,以对推文的情绪进行评分,并将其投影到二维网格中,其中具有相似内容的推文将彼此更接近地出现。它使用异步消息传递或多或少地实时完成所有这些工作。

这篇博文的剩余部分将展示如何从头开始构建它。为了对它的功能和涉及的技术保持完全透明,下面是我将演示如何构建的组件:

  • 使用 Flask +标准前端工具(Bootstrap,JQuery 等)在 Python 中进行基本的 web 开发。)
  • 使用 Celery 和 Redis 的异步、可链接的任务队列
  • 使用 Socket-IO 在 Flask 和连接的客户端之间进行基于事件的实时通信
  • 使用模式过滤/解析 Twitter 流
  • 使用 NVD3 的流式实时可视化
  • 使用 Scikit-learn 和 Gensim (word2vec)进行情感分析和单词嵌入

这里有一张完成后的应用程序的截图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们为什么要这么做?这个应用程序有什么实际的、真实的目的吗?大概不会。但是这很有趣也很简洁,希望你能学到很多东西。如果这听起来很有趣,那么继续读下去!

(注:完成的应用程序位于 此处 。请经常参考这个,因为我可能会在整个帖子中省略一些细节)。

设置

首先,让我们讨论一下运行应用程序所需的设置。除了可以工作的 Python 解释器之外,您还需要安装应用程序使用的一系列库。您还需要知道如何执行一些任务,比如启动 Redis、启动 Celery 和运行 Flask 服务器。幸运的是,这些都很容易做到。我在项目的 自述文件 中写下了详细的说明。遵循这些步骤,您应该可以开始运行了。

情感和词向量模型

现在让我们建立情绪和词向量模型来转换推文。我们将使用 这个 Twitter 情感数据集 作为两个模型的训练数据。第一步是读入数据集,并使用 TF-IDF 进行一些预处理,将每条 tweet 转换为单词包表示。

print('Reading in data file...')  
data **=** pd.read_csv(path **+** 'Sentiment Analysis Dataset.csv',  
                   usecols**=**['Sentiment', 'SentimentText'], error_bad_lines**=**False)print('Pre-processing tweet text...')  
corpus **=** data['SentimentText']  
vectorizer **=** TfidfVectorizer(decode_error**=**'replace', strip_accents**=**'unicode',  
                             stop_words**=**'english', tokenizer**=**tokenize)
X **=** vectorizer.fit_transform(corpus.values)  
y **=** data['Sentiment'].values

注意,我们使用了一个定制的标记器,用于处理 tweets 中常见的模式。我从克里斯托弗·波茨写的 的 脚本中借用了这一点,并对其稍作修改(最终版本在“脚本”文件夹中)。接下来,我们可以训练情感分类器和 word2vec 模型。

print('Training sentiment classification model...')  
classifier **=** MultinomialNB()  
classifier.fit(X, y)print('Training word2vec model...')  
corpus **=** corpus.map(**lambda** x: tokenize(x))  
word2vec **=** Word2Vec(corpus.tolist(), size**=**100, window**=**4, min_count**=**10, workers**=**4)  
word2vec.init_sims(replace**=**True)

这应该运行得很快,因为训练数据集不是很大。我们现在有一个模型可以读取一条推文,并将其情绪分为积极或消极,另一个模型可以将推文中的单词转换为 100 维向量。但我们仍然需要一种方法来使用这些 100 维向量在二维网格上空间绘制推文。为此,我们将对单词向量进行 PCA 变换,只保留前两个主成分。

print('Fitting PCA transform...')  
word_vectors **=** [word2vec[word] **for** word **in** word2vec.vocab]  
pca **=** PCA(n_components**=**2)  
pca.fit(word_vectors)

最后,我们将把所有这些工件保存到磁盘上,以便以后可以从 web 应用程序中调用它们。

print('Saving artifacts to disk...')  
joblib.dump(vectorizer, path **+** 'vectorizer.pkl')  
joblib.dump(classifier, path **+** 'classifier.pkl')  
joblib.dump(pca, path **+** 'pca.pkl')  
word2vec.save(path **+** 'word2vec.pkl')

Web 应用程序初始化

现在我们已经准备好了所有需要的模型,我们可以开始应用程序的实质性工作了。首先,一些初始化。这段代码只在 Flask 服务器启动时运行一次。

# Initialize and configure Flask
app **=** Flask(__name__)  
app.config['SECRET_KEY'] **=** 'secret'  
app.config['CELERY_BROKER_URL'] **=** 'redis://localhost:6379/0'  
app.config['CELERY_RESULT_BACKEND'] **=** 'redis://localhost:6379/0'  
app.config['SOCKETIO_REDIS_URL'] **=** 'redis://localhost:6379/0'  
app.config['BROKER_TRANSPORT'] **=** 'redis'  
app.config['CELERY_ACCEPT_CONTENT'] **=** ['pickle']# Initialize SocketIO
socketio **=** SocketIO(app, message_queue**=**app.config['SOCKETIO_REDIS_URL'])# Initialize and configure Celery
celery **=** Celery(app.name, broker**=**app.config['CELERY_BROKER_URL'])  
celery.conf.update(app.config)

这里有一大堆事情要做,所以让我们把它分解一下。我们已经创建了一个名为“app”的变量,它是 Flask 的一个实例,并设置了一些配置项来做一些事情,比如告诉它使用 Redis 作为代理(注意,“config”只是一个键/值对的字典,我们可以将它用于 Flask 不需要的其他设置)。我们还创建了一个 SocketIO 实例,它是来自 Flask-SocketIO 集成库的一个类,基本上用 SocketIO 支持包装 Flask。最后,我们创建了 Celery 应用程序,并更新了它的配置设置,以使用我们为 Flask 定义的“config”字典。

接下来,我们需要将之前创建的模型加载到内存中,以便应用程序可以使用它们。

# Load transforms and models
vectorizer **=** joblib.load(path **+** 'vectorizer.pkl')  
classifier **=** joblib.load(path **+** 'classifier.pkl')  
pca **=** joblib.load(path **+** 'pca.pkl')  
word2vec **=** Word2Vec.load(path **+** 'word2vec.pkl')

最后,我们将创建一些助手函数,使用这些模型对推文的情绪进行分类,并将推文转换为 2D 坐标。

**def** **classify_tweet**(tweet):  
    """
    Classify a tweet with either a positive (1) or negative (0) sentiment.
    """
    pred **=** classifier.predict(vectorizer.transform(np.**array**([tweet.text]))) **return** str(pred[0]) **def** **vectorize_tweet**(tweet):  
    """
    Convert a tweet to vector space using a pre-trained word2vec model, then transform
    a sum of the vectorized words to 2-dimensional space using PCA to give a simple
    2D coordinate representation of the original tweet.
    """
    tweet_vector **=** np.zeros(100)
    **for** word **in** tokenize(tweet.text):
        **if** word **in** word2vec.vocab:
            tweet_vector **=** tweet_vector **+** word2vec[word] components **=** pca.transform(tweet_vector)
    x **=** components[0, 0]
    y **=** components[0, 1] **return** str(x), str(y)

烧瓶路线

处理 web 请求的服务器代码非常简单,事实上只有两条路线。第一个是根路径,只返回主页(“index.html”)。

**@app.route**('/', methods**=**['GET'])
**def** **index**():  
    """
    Route that maps to the main index page.
    """
    **return** render_template('index.html')

第二条路线接受一个输入短语,并启动一个任务链,该任务链将从 Twitter firehose 发出一系列与输入短语匹配的推文。

**@app.route**('/twitter/<phrase>', methods**=**['POST'])
**def** **twitter**(phrase):  
    """
    Route that accepts a twitter search phrase and queues a task to initiate
    a connection to twitter.
    """
    queue **=** app.config['SOCKETIO_REDIS_URL']
    # create_stream.apply_async(args=[phrase, queue])
    chain(create_stream.s(phrase, queue), send_complete_message.s()).apply_async()
    **return** 'Establishing connection...'

乍一看,这可能令人困惑,所以让我们更仔细地检查一下。“queue”变量只是一个指向 Redis 运行的 URL 的字符串(“redis://localhost:6379/0”),我们稍后会用到它。“chain”行是一个芹菜函数,它由一系列要排队并异步运行的任务组成。在这种情况下,我们将一个对“create_stream”任务的调用排队,随后是一个对“send_complete_message”任务的调用。这些任务可能会也可能不会立即开始执行(取决于任务队列的状态),但无论如何,函数的执行会继续到最后一行,在那里我们会向客户端返回一条消息,告知(到 Twitter 的)连接正在建立。

任务队列

在上一节中,我们对两个函数的调用进行了排队,“create_stream”和“send_complete_message”。我们说过这些在 Celery 中被定义为任务,这意味着它们在主程序线程之外异步执行。让我们来看看那些函数。

**@celery.task**
**def** **create_stream**(phrase, queue):  
    """
    Celery task that connects to the twitter stream and runs a loop, periodically
    emitting tweet information to all connected clients.
    """
    local **=** SocketIO(message_queue**=**queue)
    stream **=** Twitter().stream(phrase, timeout**=**30) **for** i **in** range(60):
        stream.update()
        **for** tweet **in** reversed(stream):
            sentiment **=** classify_tweet(tweet)
            x, y **=** vectorize_tweet(tweet)
            local.emit('tweet', {'id': str(i),
                                 'text': str(tweet.text.encode('ascii', 'ignore')),
                                 'sentiment': sentiment,
                                 'x': x,
                                 'y': y})
        stream.clear()
        time.sleep(1) **return** queue

这里有很多东西需要消化,所以让我们一步一步来。首先,“本地”是一个 Socket-IO 实例。回想一下,我们使用 Socket-IO(通过 Flask-SocketIO 包装器库)将信息从 Flask 服务器“推”到所有连接的客户端,因此这个对象创建了一个通道,允许我们这样做。我们在函数中创建一个本地实例而不使用全局实例的原因是因为我们的 Celery 任务在一个单独的线程中运行(记住,这个函数是异步调用的)。

在下一行中,我们创建了一个从模式库中导入的对象,该对象创建了一个与 Twitter 的持久连接。请注意,我们传入了通过客户端输入获得的搜索短语。这将限制 Twitter 流只捕捉包含该短语的推文。下一部分进入一个 60 秒的循环,每秒钟我们检查新的推文,如果发现任何推文,我们就对它们运行我们的情感和矢量化功能。最后一步是“emit”行,在这里我们告诉 Socket-IO 推出一条消息,其中包含该 tweet 的所有数据。

在函数执行的最后,它返回“queue”变量。你可能想知道——这是干什么用的?它通向哪里?还记得我们将多个芹菜任务链接在一起。当“create_stream”完成执行链中的下一个任务时(“send_complete_message”)被调用,第一个任务的输出被传递给下一个任务。在这种情况下,我们使用链将信息(Redis 队列的 URL)传播到每个任务。

“send_complete_message”函数要简单得多,应该不需要太多解释。本质上,我们所做的是向我们的客户端发出一条消息,表明前一个函数中的循环已经执行完毕。

**@celery.task**
**def** **send_complete_message**(queue):  
    """
    Celery task that notifies the client that the twitter loop has completed executing.
    """
    local **=** SocketIO(message_queue**=**queue)
    local.emit('complete', {'data': 'Operation complete!'})

实际上,没有必要这样设置。我们可以很容易地把它放在“create_stream”函数的末尾。但是我想演示一个简单的例子,说明如何用 Celery 编写工作流并在任务之间传递信息。重点是了解这些库以及它们能做什么!

前端

我们剩下的就是为用户创建一个 UI 来进行交互,并连接一些 javascript 来通过 Socket-IO 进行通信,并处理从服务器推送的事件。UI 代码非常通用,所以我不会在这篇文章中涉及它,但可以随意检查回购中的 index.html,看看它都放在一起。不过,我会说一些关于 javascript 代码的事情。首先,我们需要一个函数,它获取用户提供的短语并将其发布到 web 服务器,这将启动整个过程。这是非常标准的 JQuery 内容。

**function** **twitter**() {  
    phrase **=** $('#phrase').val();
    url **=** encodeURI('/twitter/' **+** phrase);
    $.ajax({
        type: 'POST',
        url: url,
        **success**: **function**(data, status, request) {
            $('#twitter-status').html(data);
        },
        **error**: **function**() {
            alert('An error occurred submitting the request.');
        }
    });
}

我们还需要一个函数来创建图表,我们将使用它来显示推文。我从 NVD3 网站上收集了一些例子,得出了下面的结果,它使用“数据”变量作为输入(稍后填充)来呈现散点图。

**function** **loadGraph**() {  
    **var** chart **=** nv.models.scatterChart()
        .pointRange([2000, 2000])
        .color(d3.scale.category10().range());
    chart.xAxis.tickFormat(d3.format('.02f'));
    chart.yAxis.tickFormat(d3.format('.02f'));
    d3.select('#chart svg')
        .datum(data)
        .transition()
        .duration(500)
        .call(chart);
    nv.utils.windowResize(chart.update);
    **return** chart;
}

此外,在主脚本体中还有一些事情要做,它在页面第一次加载时只运行一次。首先,我们打开一个套接字来建立与服务器的持久连接。

**var** socket **=** io.connect('http://' **+** document.domain **+** ':' **+** location.port);

接下来,我们需要创建一个事件处理程序来响应来自服务器的“tweet”消息。事件处理程序做一些事情:

  • 用新状态更新一些标签
  • 向图表使用的数据结构中添加新的 JSON 记录
  • 重新绘制图形以显示新数据
  • 将 tweet 中的原始文本附加到显示面板上
socket.on('tweet', **function**(msg) {  
    $('#phrase').val('');
    $('#twitter-status').html(
        'Connection established. Streaming for 60 seconds (currently at ' **+** msg.id **+** ')...');
    sentiment **=** parseInt(msg.sentiment);
    x **=** parseFloat(msg.x);
    y **=** parseFloat(msg.y);
    data[sentiment].values.push({
        id: msg.id,
        x: x,
        y: y,
        size: 2000,
        shape: "circle"});
    loadGraph();
    $('#twitter-results').append(
        '<br>' **+** $('<div/>').text('(' **+** x.toFixed(2) **+** ', ' **+** y.toFixed(2) **+** ') ' **+** msg.text).html());
});

我们还需要一个事件处理程序来响应“完成”消息。

socket.on('complete', **function**(msg) {  
    $('#twitter-status').html(msg.data);
});

最后一步只是连接开始的点击事件并初始化图形。

$('#begin').click(twitter);
nv.addGraph(loadGraph);

把所有的放在一起

本质上就是这样。如果您想自己运行它,最简单的方法是在这里下载源代码,并按照 README.md 中的说明进行操作。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了不使这篇文章太长,我忽略了相当多的细节,但是如果你想了解我使用的任何库的更多信息,我强烈建议你浏览一下那个库的文档。几乎所有这些都有大量的示例代码,这就是我如何学到了很多制作这个应用程序所需的知识。

演练到此结束。正如我在开头所说,尝试新技术是一种很好的学习方式。通过同时结合几种新技术,它迫使人们更好地理解。这个应用程序非常简单,除了作为学习工具之外,在目前的状态下并不那么有用,但它有一百万种扩展方式。如果你觉得这个东西有趣,请随意叉回购,并作出自己的版本!

要对本文发表评论,请查看位于 好奇的洞察力 的原始帖子

关注我的Twitter获取新帖子更新

可视化您的探索性数据分析

原文:https://towardsdatascience.com/visualizing-your-exploratory-data-analysis-d2d6c2e3b30e?source=collection_archive---------0-----------------------

也许生活在数据科学世界的人和不生活在数据科学世界的人之间最大的差异之一是翻译数据以便每个人都能理解它的能力。数据科学家向业外人士展示数据分析的最佳方式之一是生成可视化效果。在我作为一名数据科学家的短暂时间里,很明显只有两种情况可以生成可视化。第一次是在探索性数据分析(EDA)期间,您最初接收数据,对其进行清理、排序,并创建您喜欢的任何其他要素,以获得干净完整的数据集。从这一点上,您可以开始看到某些变量之间的关系、特征之间的相关性(如果有的话),并生成更多的可视化效果,以便更好地显示手头的数据。另一种情况通常发生在分析结束时,此时您可能希望直观地看到您的模型预测与 EDA 可视化的预测相比如何,或者查看您的推断现在是否能够做出新的发现或 EDA 中显示的数据的延续。

这篇文章将关注可视化的第一个机会,EDA。在此之前,我们深入到视觉化,因为理解你将要做的事情的定义是关键。EDA 是一种数据分析方法,它使用各种技术,主要是可视化技术,以:最大限度地提高洞察力,揭示底层结构,检查异常值,测试假设,并确定最佳因素。这是一种分析数据的方法,它延迟了应该使用哪种模型的通常假设,而是让数据自己说话。

根据我的经验,目前为止我遇到的最好的可视化库是 matplotlibseabornTableau 应用程序。每一个都提供了一套独特的工具。

我将使用的两组数据来自 Kaggle 竞赛,用于预测大芝加哥地区捕蚊器中西尼罗病毒(WNV)的情况。我将向您展示一些使用 Seaborn 和 Matplotlib 在天气数据集上完成的初始 EDA。我还想指出,虽然你将看到的可视化是我的, Ira Rickman ,Michael Costa 和 Kristina Schendt 也参与了这个项目。我将用来显示 Tableau 使用情况的另一个数据集使用了关于美国大规模枪击事件的斯坦福大学图书馆,我目前正在将其用于一个单独的项目,稍后将有一个完整的博客专门讨论这个项目。

虽然很容易创建一些最有价值的类型,但在进行 EDA 时,可以生成两种图表:直方图和散点图。直方图允许我们看到特定变量的分布,而散点图允许我们看到两个或更多变量之间的关系。在我探索 WNV 天气数据的整个过程中,这些图是至关重要的,即使它们的使用可能看起来是多余的。EDA 的目的是以你知道的每一种方式探索数据。

下面的两个直方图向我们展示了平均温度在数据时间段内的分布和频率。正如您所看到的,它的范围从 40 度到 90 度左右,最常见的平均温度在 70 度左右,即使不知道数据的任何其他信息,您也可以假设数据收集的时间段是从春天到初秋。

您还会看到 Matplotlib 和 Seaborn 之间的巨大差异。第一个图形是使用 Matplotlib 创建的,需要(也很好地允许)大量的代码来设置,并且受限于您在其上放置的参数。第二个是 Seaborns 版本的直方图,称为密度图。正如您所看到的,它的设置要容易得多,因为它为您设置了箱和其他参数,并为您提供了整个数据分布的清晰线条。然而,由于它没有排除任何可能的异常值,这降低了我们关注数据主要部分的能力。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Matplotlib Average Temperature Histogram

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Seaborn Average Temperature Density Plot

下面是使用 Seaborn 生成的四个非常不同的散点图示例。

第一张图比较了平均温度和风速的数据点。虽然起初,它看起来太大,是一个杂乱无章的散点图,但它仍然为我们提供了一些关键信息。总的来说,它向我们表明,这两个变量之间似乎几乎没有相关性,同时也表明,大多数数据点的温度在 55 至 85 度之间,风速在 1 至 12 英里每小时之间。我们还可以看到,随着温度的降低,风速超过每小时 15 英里的次数会增加,这与温度向相反方向变化的情况相反。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Wind Speed vs Average Temperature

我们的第二个散点图比较了平均温度和总降水量,虽然就图表而言,它似乎有点不清楚,但它继续为我们的数据提供了有价值的信息。从该图中可以得出两个主要结论:该数据集中的大部分时间几乎没有降水,这向我们揭示了一些偏远的数据点,那里的降雨量接近 7 英寸。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Precipitation Total vs Average Temperature

我们最后的两个露点与平均温度和平均风速与最大风速的散点图和其他散点图一样,揭示了我们对数据的重要理解。第一次,我们看到两个图,它们的变量似乎都有很强的相关性和积极的趋势。我们可以在第一张图中看到,随着温度的升高,露点也会升高,这并不奇怪,因为露点与湿度直接相关,但由于这张图,我的数据告诉我要进一步研究这个问题。如果没有这个情节我可能不会做这个调查。不出所料,我们的第二张图通过比较平均和最大风速,向我们展示了我们迄今为止最强的相关性,而不仅仅是将一个特征与其自身进行比较。然而,即使在其明显的冗余中,它也向我们展示了一些罕见的情况,可能是异常值,风速超过每小时 20 英里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

DewPoint vs Average Temperature

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Wind Speed vs Average Wind Speed

下面是我在 Seaborn 图书馆最喜欢的图表之一,热图。这不仅为我们提供了每个变量之间相关性的数值,还为我们提供了一个易于理解的可视化表示,其中暗红色表示高度相关,深蓝表示不相关或负相关。这是创建最简单的图之一,但也是最具信息量的图之一,可以指导我们生成其他图来调查它带来的数字。需要注意的是,由于它是比较数据集中每个变量之间的相关性,因此根据变量的数量、观察值和计算机的处理能力,它需要一些时间来处理。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Seabron Correlation Heatmap of Weather Variables

另一个很棒的工具是 Tableau,它最基本的功能是一个点击应用程序,可以创建一个很棒的可视化世界。我发现它在比较多个地理区域的事件时特别有用。如前所述,我目前正在从事一个涉及美国大规模枪击事件的项目,因此我目前正在运行我的 EDA。以下是我到目前为止能够生成的一些非常容易解释和创建的 Tableau 图表。

下图向我们展示了从 1966 年到 2016 年美国大陆的每一次枪击事件的地点,颜色的深浅根据每个地点的受伤或死亡人数而变化。颜色越深,数字越高。我们几乎可以立即看到,大多数事件发生在人口密集区或其附近,伤亡人数最多的地区是南加州、丹佛地区、德克萨斯州中部、弗吉尼亚州西部和康涅狄格州。然而,值得注意的是,对于其中的一些地方,像奥罗拉、桑迪胡克、弗吉尼亚理工大学或德克萨斯大学这样的突发事件将它们推到了不幸的境地。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Locations of US Shootings 1966–2016, Total Number of Victims

我们的第二张图表也向我们展示了这些事件发生的地点,但这次我们不是统计受害者人数,而是查看枪手被诊断患有精神健康疾病的案例密度。虽然我们可以看到一些类似的枪击和精神疾病事件的发生中心,但它也揭示了这些行为的肇事者中有惊人数量的人很可能有预先存在的精神健康问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Locations of US Shootings 1966–2016, Number of Shooters with Diagnosed Mental Health Illnesses

正如你从 WNV 和美国枪击案中看到的,即使是最简单或最丑陋的图表也能为你提供关于数据的重要信息。无论是揭示异常值、趋势、相关性,还是在数据的兔子洞里增加阴谋,EDA 都允许数据显示它自己,并让我们在它完成后进行分析。

使用 TensorBoard 可视化您的模型

原文:https://towardsdatascience.com/visualizing-your-model-using-tensorboard-796ebb73e98d?source=collection_archive---------1-----------------------

在这一集的云人工智能冒险中,了解如何使用 TensorBoard 可视化您的模型并调试问题!

当您可以看到问题是什么时,调试问题就容易多了。但是随着大量的训练数据被输入到一个复杂的模型中,情况会变得…复杂。谢天谢地,TensorBoard 让这变得容易多了。

与传统编程不同,机器学习通常非常不可预测。您的数据质量,以及我们模型的细微差别,包括必须选择的许多参数,都对培训过程的成败有着广泛的影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Use TensorBoard to find the gaps

如果有某种方法来跟踪训练过程中的一些指标,并查看我们创建的模型的结构,那将使我们能够调整模型并调试我们看到的任何问题。

现在,这个抽象的过程可能很难可视化,但幸运的是,TensorFlow 有一个内置的解决方案!

见见 TensorBoard,TensorFlow 的内置可视化工具,它使您能够做各种事情,从查看您的模型结构到查看训练进度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TensorFlow 在引擎盖下使用了计算图的思想。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这意味着它不是传统意义上的两个数相加,而是构造一个加法运算符,并将相加后的值作为输入传递给。

因此,当我们考虑 TensorFlow 训练您的模型时,它实际上是作为其“图形”的一部分执行一切。TensorBoard 可以可视化这些模型图,这样你就可以看到它们的样子,更重要的是,确保你已经按照你想要的方式连接了所有的部件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个由 TensorFlow 可视化的模型图的更复杂版本的例子。TensorBoard 允许我们缩放、平移和扩展元素以查看更多细节。这意味着我们可以在不同的抽象层查看模型,这有助于降低视觉复杂性。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然而,TensorBoard 不仅仅是显示模型结构。它还可以在一个漂亮的图表上绘制度量的进展。通常情况下,我们会绘制诸如准确性、损失、交叉熵等东西。根据不同的模型,不同的指标可能很重要。TensorFlow 的固定估值器附带了许多预配置的值,将在 TensorBoard 中显示,因此这是一个很好的起点。

TensorBoard 可以显示各种其他信息,包括直方图、分布、嵌入以及音频、图片和文本数据。但那是为了以后的视频。

让我们来看一个 TensorBoard 的例子,它带有我们目前为止一直使用的线性模型。首先,我们将启动 TensorBoard,并通过运行以下命令将其指向保存模型结构和检查点文件的目录:

tensorboard --logdir=”/tmp/iris_model/”

这将在端口 6006 启动一个本地服务器。没错,就是 GOOG:)前往 localhost:6006 查看本地机器上的 TensorBoard。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到线性分类器默认提供的一些标量指标。我们还可以扩展和放大这些图表。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

双击允许我们缩小。你可以看到我们的训练进展顺利,损失减少。同样清楚的是,培训尚未完全完成,因为损失仍在以很好的速度减少,所以这将提示我们可能需要运行更长时间的培训过程,以从该模型中获得最大收益。

现在让我们转到图表选项卡。请注意,从表面上看,图表非常简单。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以通过单击加号来展开每个模块,以查看更多详细信息。例如,如果我展开“线性”块,我们会看到它由许多子组件组成。我们可以滚动来放大和缩小,点击并拖动来平移**。**

还要注意,我们给特征列的名称“flower_features”显示为命名的图形组件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这有助于调试和识别图形是如何连接的。TensorFlow 的大多数操作都可以命名,因此这可以是阐明您的模型的一个很好的方法。

今天,我们了解到,当您可以将模型与重要的训练指标一起可视化时,机器学习会更加容易和有趣。TensorBoard 让你轻松做到这一点,它内置在 TensorFlow 中!

下次你需要可视化你的机器学习时,使用 TensorBoard 来看看引擎盖下发生了什么!

如果你想要更多的机器学习动作,一定要订阅频道来观看未来的剧集!

此外,TensorBoard 的创作者在今年早些时候的 TensorFlow 开发峰会上给了这个精彩的演讲,请查看它以获得更深入的了解。

使用 Python 中的 Seaborn 和 WordCloud 可视化 YouTube 视频

原文:https://towardsdatascience.com/visualizing-youtube-videos-using-seaborn-and-wordcloud-in-python-b24247f70228?source=collection_archive---------11-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Courtesy: Pexels.com

我是一个狂热的 Youtube 用户,喜欢在空闲时间用它看视频。我决定对在美国播放的 youtube 视频做一些探索性的数据分析。我在这个链接上找到了 Kaggle 上的数据集

[## 趋势 YouTube 视频统计

热门 YouTube 视频的每日统计数据

www.kaggle.com](https://www.kaggle.com/datasnaek/youtube-new)

我下载了所有可用的地理数据集的 csv 文件“USvidoes.csv”和 json 文件“US_category_id.json”。我用 Jupyter 笔记本进行了分析。

我们开始吧!

加载必要的库

**import** **pandas** **as** **pd**
**import** **numpy** **as** **np**
**import** **seaborn** **as** **sns**
**import** **matplotlib.pyplot** **as** **plt**
**import** **os**
**from** **subprocess** **import** check_output
**from** **wordcloud** **import** WordCloud, STOPWORDS
**import** **string**
**import** **re** 
**import** **nltk**
**from** **nltk.corpus** **import** stopwords
**from** **nltk** **import** pos_tag
**from** **nltk.stem.wordnet** **import** WordNetLemmatizer 
**from** **nltk.tokenize** **import** word_tokenize
**from** **nltk.tokenize** **import** TweetTokenizer

我创建了一个名为“df_you”的数据帧,它将在整个分析过程中使用。

df_you = pd.read_csv(r"...\Projects\US Youtube - Python\USvideos.csv")

最重要的一步是了解数据的长度、宽度和带宽。

print(df_you.shape)
print(df_you.nunique())

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数据集中似乎有大约 40949 个观察值和 16 个变量。如果有必要,下一步将是清除数据。我检查了是否有需要删除或操作的空值。

df_you.info()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到总共有 16 列没有空值。对我们有好处:)现在让我们通过查看最上面的几行来了解一下数据。

df_you.head(n=5)

现在是可视化令人兴奋的部分!为了可视化变量中的数据,如“喜欢”、“不喜欢”、“视图”和“评论数”,我首先使用对数分布对数据进行归一化。数据的标准化对于确保这些变量被适当地缩放而不让一个主导变量扭曲最终结果是必不可少的。

df_you['likes_log'] = np.log(df_you['likes']+1)
df_you['views_log'] = np.log(df_you['views'] +1)
df_you['dislikes_log'] = np.log(df_you['dislikes'] +1)
df_you['comment_count_log'] = np.log(df_you['comment_count']+1)

让我们现在绘制这些!

plt.figure(figsize = (12,6))
plt.subplot(221)
g1 = sns.distplot(df_you['likes_log'], color = 'green')
g1.set_title("LIKES LOG DISTRIBUTION", fontsize = 16)

plt.subplot(222)
g2 = sns.distplot(df_you['views_log'])
g2.set_title("VIEWS LOG DISTRIBUTION", fontsize = 16)

plt.subplot(223)
g3 = sns.distplot(df_you['dislikes_log'], color = 'r')
g3.set_title("DISLIKES LOG DISTRIBUTION", fontsize=16)

plt.subplot(224)
g4 = sns.distplot(df_you['comment_count_log'])
g4.set_title("COMMENT COUNT LOG DISTRIBUTION", fontsize=16)

plt.subplots_adjust(wspace = 0.2, hspace = 0.4, top = 0.9)

plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在让我们找出数据集中存在的唯一类别 id,以便在数据帧中分配适当的类别名称。

np.unique(df_you["category_id"])

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到有 16 个独特的类别。让我们使用之前下载的 json 文件‘US _ category _ id . JSON’中的信息为这些类别命名。

df_you['category_name'] = np.nan

df_you.loc[(df_you["category_id"]== 1),"category_name"] = 'Film and Animation'
df_you.loc[(df_you["category_id"] == 2), "category_name"] = 'Cars and Vehicles'
df_you.loc[(df_you["category_id"] == 10), "category_name"] = 'Music'
df_you.loc[(df_you["category_id"] == 15), "category_name"] = 'Pet and Animals'
df_you.loc[(df_you["category_id"] == 17), "category_name"] = 'Sports'
df_you.loc[(df_you["category_id"] == 19), "category_name"] = 'Travel and Events'
df_you.loc[(df_you["category_id"] == 20), "category_name"] = 'Gaming'
df_you.loc[(df_you["category_id"] == 22), "category_name"] = 'People and Blogs'
df_you.loc[(df_you["category_id"] == 23), "category_name"] = 'Comedy'
df_you.loc[(df_you["category_id"] == 24), "category_name"] = 'Entertainment'
df_you.loc[(df_you["category_id"] == 25), "category_name"] = 'News and Politics'
df_you.loc[(df_you["category_id"] == 26), "category_name"] = 'How to and Style'
df_you.loc[(df_you["category_id"] == 27), "category_name"] = 'Education'
df_you.loc[(df_you["category_id"] == 28), "category_name"] = 'Science and Technology'
df_you.loc[(df_you["category_id"] == 29), "category_name"] = 'Non-profits and Activism'
df_you.loc[(df_you["category_id"] == 43), "category_name"] = 'Shows'

现在让我们画出这些来识别流行的视频类别!

plt.figure(figsize = (14,10))
g = sns.countplot('category_name', data = df_you, palette="Set1", order = df_you['category_name'].value_counts().index)
g.set_xticklabels(g.get_xticklabels(),rotation=45, ha="right")
g.set_title("Count of the Video Categories", fontsize=15)
g.set_xlabel("", fontsize=12)
g.set_ylabel("Count", fontsize=12)
plt.subplots_adjust(wspace = 0.9, hspace = 0.9, top = 0.9)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们看到前 5 个被浏览的类别是“娱乐”、“音乐”、“如何和风格”、“喜剧”和“人物和博客”。因此,如果你正在考虑开办自己的 youtube 频道,你最好先考虑这些类别!

现在让我们用箱线图来看看不同类别的观点、喜欢、不喜欢和评论的情况。

plt.figure(figsize = (14,10))
g = sns.boxplot(x = 'category_name', y = 'views_log', data = df_you, palette="winter_r")
g.set_xticklabels(g.get_xticklabels(),rotation=45, ha="right")
g.set_title("Views across different categories", fontsize=15)
g.set_xlabel("", fontsize=12)
g.set_ylabel("Views(log)", fontsize=12)
plt.subplots_adjust(wspace = 0.9, hspace = 0.9, top = 0.9)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

plt.figure(figsize = (14,10))
g = sns.boxplot(x = 'category_name', y = 'likes_log', data = df_you, palette="spring_r")
g.set_xticklabels(g.get_xticklabels(),rotation=45, ha="right")
g.set_title("Likes across different categories", fontsize=15)
g.set_xlabel("", fontsize=12)
g.set_ylabel("Likes(log)", fontsize=12)
plt.subplots_adjust(wspace = 0.9, hspace = 0.9, top = 0.9)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

plt.figure(figsize = (14,10))
g = sns.boxplot(x = 'category_name', y = 'dislikes_log', data = df_you, palette="summer_r")
g.set_xticklabels(g.get_xticklabels(),rotation=45, ha="right")
g.set_title("Dislikes across different categories", fontsize=15)
g.set_xlabel("", fontsize=12)
g.set_ylabel("Dislikes(log)", fontsize=12)
plt.subplots_adjust(wspace = 0.9, hspace = 0.9, top = 0.9)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

plt.figure(figsize = (14,10))
g = sns.boxplot(x = 'category_name', y = 'comment_count_log', data = df_you, palette="plasma")
g.set_xticklabels(g.get_xticklabels(),rotation=45, ha="right")
g.set_title("Comments count across different categories", fontsize=15)
g.set_xlabel("", fontsize=12)
g.set_ylabel("Comment_count(log)", fontsize=12)
plt.subplots_adjust(wspace = 0.9, hspace = 0.9, top = 0.9)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来,我计算了参与度指标,如喜欢率、不喜欢率和评论率。

df_you['like_rate'] = df_you['likes']/df_you['views']
df_you['dislike_rate'] = df_you['dislikes']/df_you['views']
df_you['comment_rate'] = df_you['comment_count']/df_you['views']

使用参与度热图构建关联矩阵。

plt.figure(figsize = (10,8))
sns.heatmap(df_you[['like_rate', 'dislike_rate', 'comment_rate']].corr(), annot=**True**)
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上面的热图可以看出,如果观众喜欢某个视频,他/她有 43%的机会对其进行评论,而如果观众不喜欢该视频,则有 28%的机会进行评论。这是一个很好的见解,这意味着如果观众喜欢任何视频,他们更有可能对它们进行评论,以显示他们的欣赏/反馈。

接下来,我试着分析“标题”和“标签”栏中的字数唯一字数、标点数和单词的平均长度

*#Word count* 
df_you['count_word']=df_you['title'].apply(**lambda** x: len(str(x).split()))
df_you['count_word_tags']=df_you['tags'].apply(**lambda** x: len(str(x).split()))

*#Unique word count*
df_you['count_unique_word'] = df_you['title'].apply(**lambda** x: len(set(str(x).split())))
df_you['count_unique_word_tags'] = df_you['tags'].apply(**lambda** x: len(set(str(x).split())))

*#Punctutation count*
df_you['count_punctuation'] = df_you['title'].apply(**lambda** x: len([c **for** c **in** str(x) **if** c **in** string.punctuation]))
df_you['count_punctuation_tags'] = df_you['tags'].apply(**lambda** x: len([c **for** c **in** str(x) **if** c **in** string.punctuation]))

*#Average length of the words*
df_you['mean_word_len'] = df_you['title'].apply(**lambda** x : np.mean([len(x) **for** x **in** str(x).split()]))
df_you['mean_word_len_tags'] = df_you['tags'].apply(**lambda** x: np.mean([len(x) **for** x **in** str(x).split()]))

绘制这些…

plt.figure(figsize = (12,18))

plt.subplot(421)
g1 = sns.distplot(df_you['count_word'],
                 hist = **False**, label = 'Text')
g1 = sns.distplot(df_you['count_word_tags'],
                 hist = **False**, label = 'Tags')
g1.set_title('Word count distribution', fontsize = 14)
g1.set(xlabel='Word Count')

plt.subplot(422)
g2 = sns.distplot(df_you['count_unique_word'],
                 hist = **False**, label = 'Text')
g2 = sns.distplot(df_you['count_unique_word_tags'],
                 hist = **False**, label = 'Tags')
g2.set_title('Unique word count distribution', fontsize = 14)
g2.set(xlabel='Unique Word Count')

plt.subplot(423)
g3 = sns.distplot(df_you['count_punctuation'],
                 hist = **False**, label = 'Text')
g3 = sns.distplot(df_you['count_punctuation_tags'],
                 hist = **False**, label = 'Tags')
g3.set_title('Punctuation count distribution', fontsize =14)
g3.set(xlabel='Punctuation Count')

plt.subplot(424)
g4 = sns.distplot(df_you['mean_word_len'],
                 hist = **False**, label = 'Text')
g4 = sns.distplot(df_you['mean_word_len_tags'],
                 hist = **False**, label = 'Tags')
g4.set_title('Average word length distribution', fontsize = 14)
g4.set(xlabel = 'Average Word Length')

plt.subplots_adjust(wspace = 0.2, hspace = 0.4, top = 0.9)
plt.legend()
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

现在,让我们将视频标题、视频描述和视频标签的单词 cloud 可视化。这样我们就能发现标题、描述和标签中哪些词比较流行。创建一个词云是在博客世界中寻找热门词的一种流行方式。

  1. 视频标题的文字云
plt.figure(figsize = (20,20))
stopwords = set(STOPWORDS)
wordcloud = WordCloud(
                      background_color = 'black',
                      stopwords=stopwords,
                      max_words = 1000,
                      max_font_size = 120,
                      random_state = 42
                    ).generate(str(df_you['title']))

*#Plotting the word cloud*
plt.imshow(wordcloud)
plt.title("WORD CLOUD for Titles", fontsize = 20)
plt.axis('off')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

从上面的词云可以明显看出,最常用的标题词是“官方”、“视频”、“谈话”、“SNL”、“VS”和“星期”等等。

2。标题描述的文字云

plt.figure(figsize = (20,20))

stopwords = set(STOPWORDS)

wordcloud = WordCloud(
                      background_color = 'black',
                      stopwords = stopwords,
                      max_words = 1000,
                      max_font_size = 120,
                      random_state = 42
                    ).generate(str(df_you['description']))

plt.imshow(wordcloud)
plt.title('WORD CLOUD for Title Description', fontsize = 20)
plt.axis('off')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我发现描述视频最流行的词是“https”、“video”、“new”、“watch”等等。

3。标签的文字云

plt.figure(figsize = (20,20))

stopwords = set(STOPWORDS)

wordcloud = WordCloud(
                      background_color = 'black',
                      stopwords = stopwords,
                      max_words = 1000,
                      max_font_size = 120,
                      random_state = 42
                    ).generate(str(df_you['tags']))

plt.imshow(wordcloud)
plt.title('WORD CLOUD for Tags', fontsize = 20)
plt.axis('off')
plt.show()

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

热门标签似乎是’ SNL ‘,’ TED ‘,’ new ‘,’ Season ‘,’ week ‘,’ Cream ‘,’ youtube '从词云分析来看,看起来 youtube 上有很多周六夜现场的粉丝!

我第一次使用 word cloud library,它产生了漂亮而有用的视觉效果!如果你有兴趣了解更多关于这个库以及如何使用它,那么你一定要看看这个

[## 用 Python 生成单词云

很多时候,你可能会看到一朵云,里面充满了不同大小的单词,它们代表频率或…

www.datacamp.com](https://www.datacamp.com/community/tutorials/wordcloud-python)

这个分析在我的 Github 页面上。

[## 探索性数据分析

通过在 GitHub 上创建帐户,为 tanmayeewaghmare/探索性数据分析开发做出贡献。

github.com](https://github.com/tanmayeewaghmare/Exploratory-Data-Analysis/blob/master/Youtube%20videos%20analysis_%20US%20Market.ipynb)

感谢阅读!

美国投票用机器学习解决

原文:https://towardsdatascience.com/voting-in-the-us-solved-with-machine-learning-9f2f8ec4b290?source=collection_archive---------8-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Let’s do better

或许有一种方法可以巧妙利用机器学习来解决美国的投票方式。这种用法可以应用于任何 web 安全性和真实性至关重要的情况。想想网上购物、报税、银行……任何可能用到 TouchID 的地方。

值得注意的是,没有一个系统在安全性方面是 100%完美的,但是我们可以真正接近一些以前没有的技术。

在美国,投票就像它来的时候一样倒退。美国有两个真正的大问题:选区不公正的划分和选民被剥夺权利。在这个国家,投票比想象的要困难得多。不幸的是,每个州都有不同的做法,所以很难归纳出一个解决方案。但是整个系统急需彻底改革。

网上安全投票可能是也可能不是正确的解决方案,但随着机器盒子face-verify.js 的发布,突然之间,人脸识别的一些有趣应用打开了大门,因为它与验证人们的身份有关。

我决定试着看看在这种情况下教授我的驾照照片是否可行。我想象一个投票系统,让美国公民验证他们的公民身份,上传一张官方照片,然后当你与投票网站互动时,通过你的网络摄像头识别你的脸,以确保你是投票的人。

如果在家投票不可行,这项技术可能很容易应用到全国各地的投票站。

回到我的测试。

当你自己尝试的时候,先读一下这篇详细介绍 JavaScript 库的博客文章。

我确保 Facebox 已经安装在我的系统上,然后从 Machine Box github 仓库中取出 faceverify 。我按照指示,让它在我的笔记本电脑上运行。

然后我教 Facebox 一张我驾照的扫描图像。这也不是一个特别好的扫描图像,它很小,而且我相信你知道,驾照上有各种各样的反光和半透明的问题。

我不认为这会奏效,但我惊喜地发现它确实奏效了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

I couldn’t help but smile when it worked

在我的驾照照片上,我留着胡子,头发短得多,并且做着一个愚蠢的鬼脸。但它仍然有效。

我现在可以证明,事实上是我在看那个网站。想象一下,如何通过嵌入简单的人脸识别来帮助提高投票的可访问性。这是一个 JavaScript 库,这意味着你可以在浏览器中添加验证某人 的能力。

我希望这有助于朝着正确的方向迈出一步,改善我们投票的方式,我们购物的方式,以及我们在线认证的方式。不再有黑客使用我的信用卡从亚马逊购物,提交欺诈性的退税,或者使用我的 Gmail 给我的联系人发垃圾邮件。我们能到达那里。简单易用、易于访问的机器学习可以引领潮流。

现在,在你离开评论区关于打印出来并举起一张照片来欺骗面部识别的轨道之前,让我解释一些事情。

有两种方法可以缓解这种情况。一种是要求个人识别码或密码伴随任何面部验证。把你的脸当成你的用户名,而不是密码。一旦你验证了这个过程,确保你与网站互动的整个过程都是你自己,而不是有人在监视你,这仍然是有用的。Facebox 还有一个迄今尚未提及但即将推出的功能,将有助于挫败将照片或静止图像冒充人脸的企图。如果您对部署这一附加功能感兴趣,请发送电子邮件至 hello (at ),我们将与您详谈。

什么是机器盒子?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Machine Box 将最先进的机器学习功能放入 Docker 容器中,这样像你这样的开发人员就可以轻松地将自然语言处理、面部检测、对象识别等融入其中。到您自己的应用程序中。

盒子是为扩展而建造的,所以当你的应用真正起飞时,只需水平地添加更多的盒子,直到无限甚至更远。哦,它比任何云服务都要便宜得多,而且数据不会离开你的基础设施。

有戏让我们知道你的想法。

等等…你给我打电话了!大声抱怨技术招聘和搬迁援助

原文:https://towardsdatascience.com/wait-you-called-me-rant-about-tech-recruiting-and-relocation-assistance-3449ceed1626?source=collection_archive---------11-----------------------

最近,我开始接到未识别号码的电话,来电者不会留下语音邮件。我以前偶尔会收到这些,但数量似乎增加了,我很好奇它们是关于什么的。我开始回答,招聘人员对我在德克萨斯州的圣安东尼奥、衣阿华州的得梅因、新泽西州和其他城市的职位感兴趣。在我接了第一个电话后,我突然意识到我已经在几个招聘网站(比如 Monster)上发布了我的简历,他们就是从那里得到我的号码的。我只是觉得奇怪,这些招聘人员不会先尝试电子邮件或至少留下语音邮件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我受宠若惊,这些招聘人员正在接触,并开放移动到这些地方的短期合同工作。我喜欢收拾东西搬到某个地方的冒险经历,但我真的不想在这些地方得到一份固定工作的承诺。我向招聘人员表达了我的兴趣,但我不想浪费他们的时间。我住在华盛顿州 DC 市,如果我要去这些地方,我没有联系,我需要搬迁福利。招聘人员听到这一消息后立即犹豫不决。

我觉得这很奇怪。我明白公司只能花这么多。如果我先联系他们,我也能理解他们可能会拒绝搬迁福利。最后,我知道他们可能已经耗尽了当地的人才库,这就是为什么他们打电话给住在该地区以外的我。但是我为什么要为一个我没有申请的公司,承担搬到一个我没有联系的城市的全部负担和风险呢?

搬家需要金钱、时间和情感成本。它们包括:

  • 交通——到达目的地的机票或汽油费。如果你像我一样或者住在其他城市,比如纽约/旧金山,你可能需要租或者买一辆车。
  • 住房——你需要弄清楚你要住在哪里,你要用你的旧房子做什么。你打算毁约还是转租?或者,如果你是房主,你打算出租还是出售你的房子?
  • 便利设施——你能把舒适生活所需的所有东西都装进两个行李箱吗?如果没有,你可能需要运送东西。你可以租一套带家具的公寓,这会有所帮助。舒适生活所需的其他杂费呢?

您可以协商您的小时费率,以便将这些成本计算在内。但是如果你的合同是一个随意的协议,他们仍然可以在任何时候让你走。我不想冒这种风险,以防他们认为这个职位不再有必要,他们认为我不合适,或者我认为他们不合适。我不希望这些成本被我更高的时薪慢慢覆盖。我想让我的雇主预先支付他们的费用!

我想当你向招聘者敞开大门时,你需要愿意听到好机会和坏机会。给申请人打电话,让他们搬家,除了时薪之外不提供任何东西,这些策略在一定程度上必须奏效,否则这些招聘人员不会这么做。我只是希望接受这些职位的候选人最终会意识到,他们可以而且应该为这些利益进行谈判,因为这样我们都会更好。

等待周末:如何挑选最好的葡萄酒

原文:https://towardsdatascience.com/waiting-for-weekends-some-insights-on-how-to-select-the-best-wine-a752523ac7b7?source=collection_archive---------18-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

市场上有大量的葡萄酒可供选择,对于葡萄酒爱好者来说,选择最好的葡萄酒永远是一个追求。美国、法国、西班牙、德国和许多其他葡萄酒国家的葡萄酒品种繁多,在任何酒类商店都很容易买到。价格也会有很大差异。根据我的经验,更高的价格并不总是保证更好的质量。有了这么多选择,买酒的最佳诀窍是什么?

为了回答这个问题,我使用了 2017 年收集的来自 Kaggle 的葡萄酒评论数据,并在下面检查了典型客户在购买葡萄酒时可能感兴趣的几个问题。这些数据涵盖了来自 43 个国家的 129971 篇葡萄酒评论。每篇葡萄酒评论都包含标题、国家、省份、地区、品种、价格、0-100 分、品酒师描述和品酒师信息等信息。

1。哪些国家是主要的葡萄酒生产国,哪些种类的葡萄酒在这些国家的评价最高?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先,令人惊讶的是,美国生产的葡萄酒数量是第二大葡萄酒生产国法国的三倍。第三大葡萄酒生产国意大利的葡萄酒数量与法国大致相当。还值得注意的是,两个南美国家(智利和阿根廷)的产量高于奥地利和德国等欧洲国家。

接下来,数据显示,在美国最受欢迎的葡萄酒生产葡萄是黑皮诺、赤霞珠和霞多丽。对欧洲国家来说,这些品种并不那么受欢迎。所以,当你购买欧洲生产的葡萄酒时,请记住这一点。有趣的是,尽管欧洲国家距离很近,但它们生产最多的品种却是不同的。在法国,大多数生产的葡萄酒是波尔多风格的混合红,意大利是混合红,西班牙是 Tempranillo,葡萄牙是葡萄牙红,奥地利是 Grüner Veltliner,德国是 Riesling。

然而,产量最高的葡萄酒并不意味着质量最好。下面是产量最高的 15 种葡萄酒的图表,中间值用点数表示。因此,如果你购买美国葡萄酒,你最好的选择是黑皮诺、西拉和波尔多风格的混合红葡萄酒。对于第二大生产国法国来说,最好的品种是雷司令、黑比诺、香槟混合、琼瑶浆、马尔贝克和灰比诺。如果你更喜欢意大利葡萄酒,搜索桑娇维塞格罗索和内比奥罗。

令人惊讶的是,所有奥地利葡萄酒的评级都非常高,如雷司令、布劳夫兰基施(blaufrnkisch grüner velt liner)、长相思(Sauvignon Blanc)等(见下表)。与法国葡萄酒类似,奥地利最高等级的葡萄酒品种是雷司令。请记住,虽然法国有许多品种的中等质量低于奥地利。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Variety quality analysis for US, France, Italy and Austria. You can find similar analysis for other countries here.

2.不同价格类别中评价最好的葡萄酒有哪些?

现在让我们来看看葡萄酒的价格。为了让你购物更容易,我分析了四个价格类别。在这里,我们将只展示价格低于 50 美元的前两个类别的分析,而对于价格高于 50 美元的另外两个类别的分析,您可以在这里找到。

$ 0-$ 15

你可能会认为,如果你付不到 15 美元,就不可能品尝到高评价的葡萄酒。我会给你惊喜,但你可以,这是清单:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最有可能的是,这些葡萄酒可能很难在你当地的杂货店找到(尤其是在这篇文章之后),但是你可以尝试使用这个网站https://1000corks.com/搜索葡萄酒,并检查你附近是否有特定葡萄酒的位置。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我们也检查一下价格和质量之间是否有任何关联。观察点数 vs 价格的散点图,你可以看到它看起来更像一个扭曲的三角形,而不是一条直线。很明显,有很多葡萄酒的质量与其价格不符。

$ 15-$ 50

如果你认为在前面的类别中价格和质量之间没有相关性,看看 15-50 美元类别中的散点图——它只是一个完全没有相关性的正方形。在这个价格类别中,高价格根本不能保证质量。例如,有很多酒的评分只有 80 分,价格从 15 美元到 45 美元不等。然而,请记住,总的来说,与以前的价格类别相比,有更多的葡萄酒评分超过 90 分。

如果你想品尝这一类别中的一些最好的葡萄酒,下面列出了评级最高的葡萄酒。例如,你可以尝试售价 44 美元的葡萄酒,比如加州索诺马海岸生产的夏敦埃酒,它被打了 99 分(见下文)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3.对于不同国家生产的最佳葡萄酒,最常见的描述是什么?

这个数据库的有趣之处在于它包含了葡萄酒评论。因此,我按国家分析了评级最高的葡萄酒(> 87 分)中的受欢迎程度,并将其映射到国家轮廓上。你可以看到每个国家对葡萄酒的描述都有一些独特之处。

我不需要再讲什么了,这些图片上有几千个字。选择你的鞋底所属的国家!(你可以找到更多的国家 wordcloud。pdf 文件此处

美国

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

法国

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

意大利

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

西班牙

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

奥地利

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4.葡萄酒的质量可以预测到什么程度?

由于在大多数情况下,价格并不是葡萄酒质量的最佳指标,我很好奇如何使用现有的机器学习工具来预测葡萄酒的质量。因此,我创建了一个模型,使用国家、价格、品种和省份等特征以及从标题中提取的其他三个特征(如年份、起泡和年份)来预测质量点。实际分数和预测分数之间的散点图如下所示,训练模型能够预测质量,r2 分数为 0.49,均方误差为 4.9 点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然图中有明显的散点,但这比简单地看价格和质量之间的相关性要准确得多。那么,对于一款高品质的葡萄酒来说,什么特征是最重要的呢?该算法显示,影响葡萄酒评级的主要特征是价格和年份。有趣的是,接下来影响评级最大的特征是加州省、黑皮诺品种、霞多丽品种、混合红品种和华盛顿省。所以,根据经验,当你不知道你想要什么样的葡萄酒时,你可以选择加州的黑比诺葡萄酒,这是陈年的,价格你可以承受。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

结论

在这篇文章中,我根据对从 Kaggle 获得的 2017 年葡萄酒评论数据的分析,展示了一些关于如何选择最佳葡萄酒的见解。

  • 在葡萄酒数量最多的国家,最受欢迎的葡萄酒品种是美国的黑皮诺,法国的波尔多风格的混合红,意大利的混合红,西班牙的坦普拉尼洛。
  • 美国评价最高的葡萄酒品种是黑比诺、西拉和波尔多风格的混合红,法国是雷司令、黑比诺、香槟混合、琼瑶浆、马尔贝克和灰比诺,意大利是桑娇维索和内比奥罗。
  • 奥地利生产的葡萄酒有很多评级很高的品种,其中评级最高的品种是雷司令。
  • 有些酒即使价格低于 15 美元,也有很高的评价。价格区间较高(15-50 美元)的葡萄酒并不能保证质量更好。
  • 葡萄酒的质量主要与价格和年份有关。地理位置也很重要,最好的葡萄酒通常来自加州和华盛顿。在各种类型的葡萄中,黑比诺、霞多丽和混合红通常是质量较好的标志。

是时候去商店买酒了吗?

要了解更多关于这个分析的内容,请点击这里的链接查看我的 Github。

向您介绍我使用 IAS 的经历

原文:https://towardsdatascience.com/walking-you-through-my-experience-with-ias-5cfc6f9e926a?source=collection_archive---------11-----------------------

科技生活

IAS 的夏季研究奖学金项目是由不同知名大学的教授指导的研究项目

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好吧,你们所有人都应该知道享有盛誉的 IAS 夏季研究奖学金。这是每个理科生的梦想。这是一个夏季研究奖学金,提供给全印度的精选学生。

暑期研究奖学金项目(SRFP) 由印度科学院提供,是一种在印度的暑期沉浸式体验,是对学年期间发生的研究活动的补充。通常,这是一个竞争激烈的本科生项目,由学院的教职员工(通常是印度理工学院、印度理工学院、印度理工学院和印度其他知名学院)监督,他们为本科生的研究工作提供总体指导。该奖学金为期至少 8 周。研究领域变化很大,可以来自任何艺术或科学学科。

在这个项目中,学生可以在不同著名大学教授的指导下,在各自感兴趣的领域进行研究。

与其他人不同,我希望在这个著名的研究团队下从事图像和模式识别方面的工作。结果预计将于 2017 年 2 月 28 日公布。我像往常一样焦虑,希望能在获奖者中找到自己的名字。虽然我成功的可能性很小,但我还是抱最大的希望。但是,如果愿望是马,乞丐会骑。唉!我的名字不在那里。那天我彻底地看了几遍清单,我完全失望了。

尽管由于我的平均绩点只有 8.5,机会很少,我还是浏览了所有在信号和图像处理领域工作的教授的资料。我列出了大约 30 名教授的候选名单,仔细阅读了他们的研究论文。虽然我不能理解其中的重要部分,但我能够理解他们研究领域的要点。这帮助我提交了一份关于最新技术趋势的报告,这也得到了许多前辈和讲师的验证。由于我有一些 OpenCV 和图像处理的经验,我有点期待被选中。

但是,我继续前进,申请了 RGSoC (一个面向女生的开源竞赛)。我为此花了整整两个月的时间,但我的团队还是没有入选。学期即将结束,我手里没有实习机会。我很担心,不知道接下来会发生什么。我开始申请当地的实习,我完全沮丧。

我一点也不知道第二批入选名单还没有公布。5 月 2 日,我收到了一个学长发来的“刚果”消息,以及一个 IAS 第二次选拔结果列表的链接。还有维奥拉。我找到了我的名字。安妮莎·斯温……那是我的名字。我简直不敢相信自己的眼睛。这些证件与我的相匹配!我被选中在德里大学的 Geetika Jain Saxena 博士的指导下研究图像处理。

拿到确认邮件后,我和导师取得了联系,询问了要做的工作细节。令我完全惊讶的是,我的兴趣领域与她的专业领域完全相关。再次出现的问题是住宿。住宿名单只公布给在第一次选择名单中获得奖学金的人。我进退两难。是否会有住宿?我向我的导游寻求帮助,她好心地为我的住宿问题联系了宿舍管理员。我在 IIT 德里得到了 IAS 提供的住宿,但是我决定留在德里大学的校园里。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Summer Research Fellow Meet (INSA,Delhi)

一切都是固定的。我向班加罗尔的学院发出了录取通知书,并于 2017 年 5 月 26 日踏上了前往德里的旅程。我于 2017 年 5 月 29 日正式加入该协会。在第一次与我的向导见面时,有人问我以前的工作经历,她向我介绍了其他一些将要带领 t 走过这段漫长旅程的教师。

之后,我被分配了第一周的任务,即对图像的基本操作。在整个实习期间,我尽力在特定的时间内完成分配的任务。这项工作最好的部分是深入研究该项目的理论方面,以及研究背后的物理和数学概念。在正确的指导和极大的热情下,在加入的前 4 周,我用 OpenCV 和 Python 完成了项目的第一部分,即人脸识别。在那之后,我准备好了第二次体验微软 Kinect。我在 Kinect 和 C#领域完全是一只新蜜蜂。尽管花了更多的时间来熟悉 Kinect 的硬件和软件平台,但这确实是一次令人兴奋的学习经历。在为数据库创建收集数据时,外面的人很有帮助,最后,我们有了 10 个主题的 32 个特征的数据。对我来说最困难的部分是数据挖掘。然而,最终我们能够分析数据,并实现了 89%的人脸识别准确率和 65%的步态识别准确率。我于 2017 年 5 月 25 日成功完成了这个为期 57 天的项目。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

data extraction from kinect

我想对所有为我提供完成这个项目的可能性的人表示最深切的感谢。然而,如果没有我的导师和印度科学院的支持和帮助,这是不可能的。我谨向他们所有人表示诚挚的感谢。我非常感谢 Geetika Jain Saxena 博士的指导和不断监督。此外,还要感谢 Amit Pundir 教授博士为我们提供了必要的信息和对项目未来的见解。

我还要感谢 Rajshekhar Mukherjee 先生对完成该项目的支持。我想对我的父母和 Maharaja Agrasen 学院(德里大学)的成员表示感谢,感谢他们的合作和鼓励,帮助我完成了这个项目。我要特别感谢印度科学院给我这个机会。我还要感谢和赞赏我开发这个项目的同事们,以及那些愿意用他们的能力帮助我的人们。

我的 IAS 团契之旅既激动人心又鼓舞人心。这一经历将永远伴随着我,并将激励我在未来几年深入研究图像处理和机器学习领域。

在下面的评论区让我知道你对这篇文章的想法,如果你想和我联系,我在这里->TwitterLinkedininsta gram

想要一份数据科学方面的工作?少一些热情,多一些怀疑。

原文:https://towardsdatascience.com/want-a-job-in-data-science-be-less-enthusiastic-and-more-skeptical-895e9e3c14f7?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

过去几年来,每周都有准数据科学家和应届毕业生在 LinkedIn 上联系我,亲自寻找进入这个新兴领域的“建议”。(建议在这里用引号括起来,因为他们真的在找工作。)

这些问题很多本质上都是一样的:我该学 python 还是 R?你使用什么工具?你能告诉我工作与生活的平衡吗?我刚刚从数据科学专业毕业!—你为什么这么热爱数据科学?我需要什么来开始?

充其量,这些问题都是老生常谈——在一个难得的好日子,我不介意回答它们。但大多数情况下,它们让我烦恼不已。它们旨在让我认为提问的人非常聪明,并且在思考他们在数据科学领域的职业生涯。但是谷歌一下这些问题,你会发现它们在论坛上重复出现。我对所有这些问题的回答通常是,“我不知道,看情况。”我不会添加任何别人没有的新东西。

但我会给求职者一些建议:如果你想在这个领域找到一份工作,抛弃那些令人厌倦的问题,学会批判性地谈论数据和模型。我称之为数据科学的秘密语言。如果你想在社交活动中给专业人士留下深刻印象,或者获得一个好的数据科学职位,你必须学会如何用这种秘密语言提问。

持续的内部批评

这种秘密语言是一种持续的、内在的批判。

这是一种认识,因为这个领域已经承诺了很多,它有可能不会实现。例如,离散事件模拟可能显示如何为工厂节省数百万美元,但它从未得到实施。机器学习算法可能会为消费者提供定制的内容,但就实施成本而言,这不值得。这些例子很重要。每当一个过分热情的营销人员告诉我没有什么数据解决不了的问题时,我都会想到它们。专业建议:不要听起来像个小贩。

换句话说:你需要能够穿透宣传,说出组织可以误用(或者干脆不使用)他们的数据的方式。

你需要意识到这个领域的问题。**隐私不在其中。**例如,一个真正的问题是,我们如何利用数据来强化我们想要改变的系统。想想现在有些银行不使用信用评分,而是使用社交媒体数据来评估信用度。在确定贷款时使用种族、年龄、性别和其他因素是非法的。然而,社交媒体数据体现了这些东西。你能批判性地谈论这个问题吗?

在社交和面试活动中,能够在这种内部批评中坦率地发言,将会比你想象的走得更远。原因如下:公司不是在寻找训练有素的技术专家(除非是一家人事代理机构,在这种情况下,你应该在你还有时间的时候尽快逃离他们),他们在寻找知道如何批判性地思考数据的人。你会立刻和你的谈话对象产生融洽的关系。数据科学不仅仅是编码;这也是关于知道技术什么时候有用,什么时候没用。

因为如果你真的真的关心这个领域——并希望成为其中的一部分——那么看着公司推出营销人员无法解释的按钮式黑盒分析平台会让你感到困扰;看到公司吹嘘他们花了多少钱来建立他们的数据科学团队,而不是专注于该团队的产出,你需要烦恼;看着公司吹嘘算法准确性而不处理假阳性应该会让你感到困扰。还有很多例子。如果你进来谈论谷歌、网飞和脸书的成功——这些例子已经有十多年的历史了——你会被视为知之甚少,没什么新东西可补充。

因此,抛开关于工作与生活平衡的典型问题,直接进入这个领域的核心。在你的下一次社交活动中,问那个大公司的代表一个表明你知道秘密语言的问题:*我在你的网站上看到你已经投资了数百万来建立你的数据科学团队——它达到你的期望了吗?它为你节省了数百万美元的回报吗?*也许这听起来很尖锐,但这是经理们喜欢看到的批判性思维类型。我向你保证,很多人在内心问过同样的问题——你会比你想象的更快适应。

想要集群?你要几个?

原文:https://towardsdatascience.com/want-clusters-how-many-will-you-have-8737f4ba9bf2?source=collection_archive---------18-----------------------

K-Means 会给你你想要的所有聚类。惯性和最小簇间距离的比率似乎在最佳 K 处具有可检测的局部最小值

好吧,那是开玩笑,我道歉!但这是我们在开始分组工作之前应该问自己的问题。聚类取决于距离的概念。预期一个群集的成员到该群集的质心的距离比到其他群集的质心的距离更近。给定一些数据点,以及一种计算它们之间距离的方法,似乎计算机程序应该能够通过足够的数据处理来做到这一点。但是我们必须小心行事。假设这种练习是无监督的,则该算法没有关于数据在特征空间中如何分布的先验知识。但愿不会,如果数据是均匀分布的,那么就没有希望实现任何有意义的集群。或者更糟的是,我们将拥有与数据点数量一样多的聚类,而我们将一无所获。这里探讨的想法是检查数据本身是否能为我们指出一个可以指示最佳集群数量的指标。这正是这篇文章的重点。

我们在已知的集群中使用合成的数字向量,因此我们可以评估这种方法。我们坚持二维,因为我们希望可视化所获得的集群,并说服自己,它似乎是可行的。 K-meansSciKit 中的实现是这里所有模拟的驱动程序。这里所有模拟的源代码可以从 github 下载。

1.优化 K-means 中的 K

流行的 K-means 方法将 n 个数据点分成 k 个簇,其中 k 被指定为输入。K-means 通过要求最小化每个聚类中的数据点到该聚类的质心的距离的平方和来识别这些 k 聚类。利用 C_i 作为具有簇的*, x 作为该簇中的任何数据向量/点,并且 μ_i 作为该簇的质心向量/点,K-means 最小化由下式定义的 kI_k 的总惯性:*

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Equation 1

图 1 用一个 3 集群的例子说明了这一点。K-means 正确地试图使 k 簇尽可能紧密,但是什么是 k 的最佳值是个问题。 I_k 等辅助信息能告诉我们我们的 k 是不是最好的吗?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1. K-means minimizes the overall inertia Ik of the k clusters. For k = n, Ik would be the absolute minimum at zero. But that is of no value. Ik* couples that criteria with maximizing the minimum intracluster separation. The k that minimizes Ik* is likely the optimal k for k << n.

让我们考虑以下论点。

  • k 等于数据点 n 的数量时,每个数据点都是其自己的聚类,并且 I_k 将等于零——其最小可能值。所以很明显使 I_k 最小的 k 不是最优的 k

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Equation 2

  • 随着 k 的增加,星团间的距离将会减小。因此最小簇间距离的倒数将增加。用 r_k^ij 作为模拟 k 簇时簇 i 和簇 j 之间的距离,

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Equation 3

结合等式 2 和 3,我们定义了新的度量 I_k *

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Equation 4

因此,我们基本上使用簇间距离作为对 I_k. 的平衡,它们都随着 k 的增加而减少,但是根据模拟,它们的比率表现得更好,并且对于 k < < n 具有局部最小值。

让我们非常清楚,我们只是在谈论一个局部最小值,它可以通过从小 k 值到大 k 值的模拟来检测。随着 k 向着n数据点的总数增加,当每个数据点成为其自己的聚类时,将达到 0 的全局最小值。

2.完美聚类的数据集

为了了解这一指标的用处,我们假设在二维空间中有 14400 个点,在一个 3x3 的网格中分成 9 个不同的簇。每个聚类有 1600 个点均匀分布在 40x40 的网格上。参见下面的图 2。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2. K-means on perfectly clustered data with 9 actual clusters. (A -C). K-means will split the data into as many clusters as we ask it to. The dark grid lines show the actual separation boundaries. The numbers indicate the centroid locations of the clusters that K-means has found (D) Both the inertia and the minimum intercluster distance decrease as k increases (E) I_k has a detectable minimum at k=9 that we can use to pick the right number of clusters (F) The inertia is driven to zero as k increases to 144000, whereas the intercluster distance reaches a constant value.*

当我们运行 K-means 且 K= 9 时,我们得到了正确的聚类识别,如图 2B 所示。图中的数字是质心的位置,正如我们的数据所示,它们正好在每个星团的中心。当 K-means 在图 2A 中以 k =5 运行时,它将真实聚类分成片段,甚至将它们与来自其他真实聚类的片段相结合,以识别它所找到的聚类。图 2C 显示了使用 k =23 运行 K-means 时的情况,我们看到数据以各种方式被拆分。**

**这里的要点是,K-means 会将数据分成您要求的任意多个聚类。但是图 2D 显示了度量 I_k 甚至在惯性 I_k 和最小集群间距离 min{r_k^ij} 随着 k 增加而稳定减小时也是如此。放大小的 k ,图 2E 显示我们确实在 k=9 有一个确定的局部最小值。还有其他局部最小值,但它们都更高。放大更大的 k ,图 2F 显示最小的簇间距离接近单个点的分离距离,而 I_k (因此 I_k )下降到零。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3. The internal structure of the clusters is not a barrier to detecting the optimal k as the k that minimizes I_k*

*集群的性质没有什么特别之处,允许/不允许检测这个指标。上面的图 3 显示了一个类似的练习,其中数据以螺旋形式聚集,并且指标并未因此而变差,如图 3E 所示,其中当 k = 9 时,获得了 I_k 的清晰局部最小值。

3.松散聚集的数据集

所以这对于完美的聚类数据集来说效果很好。对于聚类没有很好分离的数据,它将如何处理?让我们考虑一个和以前一样大小的数据集,但是在数据点的位置中加入了一些随机误差,所以聚类不是那么清晰。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4. ( A-B). The clusters are visibly separable. Ik has a clear local minimum at k=9, that is 20% smaller than the nearest local minimum at k=4 (C-D) The cluster separation is blurred. I_k does show a local minimum at k=9, that is only about 7% smaller than the closest local minimum at k=4**

在上面的 4A 图中,即使没有网格线的帮助,我们也能直观地分辨出星团。在图 4C 中没有这么多,我们在群集之间只看到一个细长的无数据区。我们让 K-means 在这里工作来检测这些集群。图 4B 和 4D 显示在两种情况下, I_kk =9 处具有局部最小值。这个最小值在图 4B 中比在图 4D 中更明显。当然,考虑到后者的弥散群边界,这是可以预料的。*

4.统一的情况:没有集群

最后,我们看一下数据均匀分布的情况,这样就没有聚类了。但是我们知道,K-means 无论如何都会得出 k 簇。能否帮助我们发现这种情况,并得出数据不可聚类的结论?参见下面的图 5,我们在 120x120 的网格上均匀分布了 14400 个数据点。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5. When the data is uniformly distributed, there are no real clusters. (A-B) K-means clusters with k=4 and k=9. © The lack of clear local minima for Ik and the near constant nature of Ik is an indication of unclusterable data.**

*与图 2 至图 4 不同,图 4C 中的 I_k 的度量没有显示明显的局部最小值, I_k 在很大程度上不会随着 k 的增加而变化。对于较大的 k ,它最终会变为零,就像其他图中一样,但是对于k<n而言, I_k 比其他情况更平坦。这可能是决定底层数据没有聚集的线索。

5.结论和后续步骤

这篇文章是我们真正想要得到的东西的先驱——即文本聚类。这里,我们建立了一个合理的标准来检测使用 K-means 时的最佳聚类数。证据是经验性的,我们没有证据证明它在所有情况下都有效,尤其是在有噪声的高维空间。文本是橡胶与长向量、上下文问题以及构建这些向量的任何方法相遇的地方。应该很有意思。

原载于 2018 年 11 月 5 日【xplordat.com】**

想成为数据科学家?试试费曼技术。

原文:https://towardsdatascience.com/want-to-become-a-data-scientist-try-feynman-technique-2ea010da1c54?source=collection_archive---------2-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source : Pixabay

许多博客和文章都是关于如何成为数据科学家的。这个列表通常是这样的

学习描述统计学、假设检验、概率

学习机器学习算法的类型——有监督的、无监督的

学习 Python,R,SAS,SQL

使用 Python、R、SAS 应用机器学习技术

学习数据可视化

虽然上述方法没有错,但这并不是成为高效数据科学家的充分途径。现在你可能会问为什么?在回答这个问题之前,我想先谈谈“费曼技术”。

为什么这项技术被称为“费曼技术”?

这项技术以伟大的理论物理学家理查德·费曼的名字命名。他被戏称为“伟大的解释者”,因为他用通俗易懂的语言解释甚至最复杂的科学问题的非凡技能。

费曼技巧:

第一步:缩小你觉得难以理解的话题的范围。了解主题。

第二步:用非常简单的术语解释这个话题,就好像你在教别人一样

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Source : Geminthinking

**第三步:**通过例子或演示它是如何工作的

步骤 4: 评估你对该主题的了解,如果仍有一些概念不清楚,了解更多,重复步骤 2-4

在适当的时候,你会对这个话题有比开始时更好的理解。这就是“费曼技巧”的魔力

成为“伟大的解释者”成为伟大的数据科学家

数据科学领域需要不断学习。有些概念可能太难理解了。费曼技巧可以帮助一个人理解原本认为难以置信的话题。

需要向老板、客户或风投解释

只有当关键决策者看到其中的价值时,分析行业才能生存下去。决策者是

你的老板——如果你正在进行内部分析

客户——如果你从事分析咨询/服务行业

VC(风险投资家)——如果你正在为你的“人工智能初创企业”寻求投资(称之为人工智能是获得资金的第一步:P )

通常情况下,你的老板/客户/风投可能没有分析背景,或者对最新的分析主题没有深刻的理解。你有责任用尽可能简单的语言解释分析概念,让他们看到你的提议的价值。

所以,底线是— 练习你的费曼技巧,否则你可能会面临和呆伯特每天面对他的老板一样的折磨,如下图所示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Source : Dilbert Comic

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image Source : Dilbert Comic

我如何成为一名数据科学家

在我的 MBA 课程中,我是唯一一个有统计学背景的人,当我向我的朋友解释时,我总觉得我对统计学概念的理解有所提高。他们肯定我很容易就学会了这个概念,这给了我鼓励,也增加了我自己彻底学习这个概念的责任,这样我就不会教错了。

彻底学到一些东西的信心让我进入了数据科学领域。即使是现在,我仍然遵循费曼技巧来更好地理解最初看起来不可理解的话题。

实践费曼技巧——写文章

我必须承认,我写了第一篇关于“推荐引擎的文章,是为了更好地理解推荐系统是如何工作的。虽然我不自称在推荐系统方面有专长,但我可以肯定地说,我凭直觉学到了一些东西。

类似地,在我的上一篇文章“如何将一个闪亮的应用程序分类——第一部分”中。我试过通过乐高来解释码头工人!!

费曼技术——治疗冒名顶替综合症的方法

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Image source : Pinterest

随着数据科学领域变得有利可图,许多人都想进入这个领域。那些成功进入(没有统计/数学)背景的人,有时会患上冒名顶替综合症。如上图所描绘的,“你是最容易被忽悠的”。克服冒名顶替综合症的唯一方法是真正深入了解各种数据科学主题,以及有什么比费曼技术更好的方式来深入了解主题。

记住:成为‘伟大的解释者’才能成为‘伟大的数据科学家’!!

如果你喜欢我的文章,给它一些掌声,你也可以在下面评论你对这篇文章的看法。

你可以联系我

领英

推特

我的博客:分析洛卡

想要对文本进行聚类?尝试自定义单词嵌入!

原文:https://towardsdatascience.com/want-to-cluster-text-try-custom-word-embeddings-615526cbef7a?source=collection_archive---------23-----------------------

分析具有单词嵌入的 Tf-idf 向量的聚类有效性。本文考虑的文本语料库实例表明,自定义单词嵌入可以帮助提高语料库的聚类能力

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在我们使用单词嵌入的文本分类结果之后,这是一个受欢迎的消息。在分类的上下文中,我们得出结论,用朴素贝叶斯和 tf-idf 向量保持简单是一个很好的起点。虽然我们不能一概而论,但是在构建文档+单词向量时所做的额外工作并没有为分类质量带来相应的收益。在这篇文章中,我们继续前面为文本聚类打下的基础,特别是两篇文章——想要聚类?你要几个?用转换后的文档向量聚类文本。我们从分类练习中选择我们熟悉的 20 新闻影评文本语料库。我们评估了不同的降阶变换的聚类效果。重现这些结果的代码可以从 github 下载。

为什么降阶转换有助于聚类?

在我们深入细节之前,让我们停下来考虑一下,是否有任何理由期待应用单词嵌入会带来一些好处。除了计算性能的明显优势之外,如果我们得不到高质量的集群,这当然是没有用的!

VSM 模型产生的文档向量是长且稀疏的。不幸的是,每个文档簇的质心都接近原点。也就是说,所有的文档簇几乎都有一个共同的质心!另外,由于我们将文档向量归一化为具有单位长度,所以一个簇中的每个文档离这个公共质心的距离大约相同。我们的情况是,集群间距离接近于零,集群内距离接近于 1!这不是划分集群的好时机。

如果我们可以在不破坏文档向量的内容/意义的情况下减少文档向量的顺序,我们当然可以期待更高质量的结果。这正是这篇文章的重点,下面是我的计划。

  • 将文档归入已知的组/群,并将它们混合在一起
  • 应用降阶变换并构建文档向量
  • 聚集文档向量,看看我们是否已经完整地恢复了原始组
  • 评估不同转换在恢复纯净完整的文档群集方面的能力

1.用于聚类的文档向量

从有/没有单词嵌入的文本语料库中构建文档向量的准备工作已经在前面的文章中完成了— 单词嵌入和文档向量:第 2 部分。分类。我们在弹性搜索索引中有 20 个新闻和电影评论文本语料库。从不同算法(FastText、Word2Vec 和 Glove)构建的预训练和定制单词向量也在索引中。将 K-Means 应用于降阶的文档向量是简单的。

  • 从 elasticsearch 索引中获取(停止的令牌)稀疏的 n 长文档向量。 n 是文本语料库的词汇量大小。通过应用单词嵌入,将这些 n 长的稀疏向量转换成密集的 p 长的向量。
  • 应用 K-Means 聚类(对于 20 条新闻,K=3,对于电影评论,K = 2 ),并找出所获得的聚类的纯度。

下图说明了其中的机制。设置与我们的分类类似,只是我们在这里对向量进行聚类。关于分类的早期文章对图中的每个步骤都有详细的描述,代码也在它的 github 中。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 1. The mechanics of the text clustering exercise. The document (row) vectors X and pre-trained/custom (column) word-vectors W are fetched from the elasticsearch index to build dense (row) vectors Z that are then normalized to have unit length before clustering with K-Means

2.变换空间中的距离

为了说明降阶变换对集群内和集群间距离的典型影响,让我们从 20 个新闻语料库中挑选“alt .无神论”组,并计算如下。

  • 簇间距离:20 个组中每个组的质心,以及从“alt.athiesm”的质心到其他 19 个组的质心的 19 个距离
  • 簇内距离:备选无神论组中 799 个文档的每一个到其质心的距离。

图 2 中的盒须图(5%和 95%的须)显示了转换前后的距离分布。对于稀疏和长( n = 44870,20 个新闻的停止词汇的大小)原始文档向量,簇内的距离都在预期的 1.0 左右,并且簇间距离接近 0.1。使用定制的 fasttext 单词嵌入(使用 p = 300,即转换后的向量长度为 300),我们得到了一个有利的距离分布,其中聚类本身被处理(聚类内中值距离从 1.0 降低到 0.27),而不同的聚类被推开(与其他聚类的中值距离从 0.1 左右增加到 0.28)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 2. The order reduced document vectors in a known cluster show larger compaction among themselves and greater separation from other clusters. Such transformations are better for the clustering task.

3.评估转换

我们从上一篇文章用转换后的文档向量聚类文本中知道,

  • 我们需要将文档向量标准化为单位长度,并且
  • 不同变换之间的变换向量之间的距离不能直接比较,并且
  • 可以比较每个空间中簇间距离与簇内距离的比率,以获得关于变换的有用性的一些线索。

此外,我们还概述了计算该比率的以下程序。

  1. 计算每个簇的质心,以及簇中每个文档与该质心之间的距离。找出这些距离的中间值。
  2. 取 1 中获得的所有聚类的中间值的平均值。这是该空间的“代表性”距离 A。
  3. 计算质心之间的平均距离 B。
  4. 比率 B/A 是我们可以跨转换比较的

为了获得更好的集群能力,我们希望 B/A 更大。也就是说,最大化 B/A 的转换应该在聚类方面做得更好。下面的图 3 让我们看到了 at 的前景。所有情况下的文档都使用停止标记(但没有词干)通过 Scikit 的 tf-idf 矢量器进行了矢量化。然后对这些向量应用不同的降阶变换。我们选择 p 为 300,即转换后的文档向量在所有情况下都具有 300 的长度。尝试的转换包括以下内容。

根据步骤 1-4 处理每次转换中获得的文档向量,以计算簇间/簇内距离比率 B/A。图 3A 显示了考虑所有 20 个组/簇的 20-news 文档向量的比率。图 3B 用于电影评论数据集。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 3. Order reducing transformations seem to improve the intercluster/intracluster distance ratio, boding well for the clustering task.

从图 3 中可以看出,降阶转换,尤其是自定义单词嵌入,似乎可以为 B/A 产生较大的值,因此有助于提高聚类能力。是时候验证事实是否如此了。

4.K-均值聚类

现在我们开始实际的集群任务,如图 1 所示,以验证图 3 所显示的内容。我们将使用相同的变换列表,并检查所获得的簇有多纯。也就是说,在任何获得的聚类中,我们希望找到单个组/类的文章。我们的立场是,那些具有较大 B/A 值的转换应该产生更纯的集群。

在每种情况下,我们给 K-Means 模拟已知的聚类数。假设我们在这里通过给出精确的 K 来帮助 K-Means,我们希望它至少能够将文章按组分开,并将它们放在不同的簇中。但不幸的是,这种情况并不总是发生,在某些情况下,文章会一边倒地聚集在一两个集群中。从我们的角度来看,这是一次失败的集群行动。

如果聚类任务是成功的,我们应该最终得到这样的聚类,每个聚类都有一个主要部分的文章来自其中一个组,这样我们就可以用那个组来识别那个聚类。

然后,通过不属于该聚类/组的文章的数量来测量所获得的聚类的“纯度”。

4.1 二十篇新闻文章

在 20 个新闻数据集的情况下,我们从 3 个组中挑选文章进行这个练习——这样我们就可以很容易地绘制结果。然而,请注意,图 3A 中的结果是通过考虑所有 20 个组/簇而获得的。词云图提供了我们正在处理的内容的鸟瞰图。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 4. The dominant words in these three groups are mostly different. This enhances dissimilarity and so we expect to be successful at clustering

下面的图 5A 显示,使用自定义单词嵌入时,放错位置的文章数量最少,而原始文档向量的情况最差。具有定制 word2vec 嵌入的文档向量产生最纯的集群,每个集群标识一个特定的组。不同变换的性能与图 3A 所示的很好地匹配。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 5. (A) Six of the 7 attempted transformations were successful at clustering. Order reducing transformations seem to have helped with clistering (B) Several articles about hockey seem to have found their way into hardware & religion based content when using the raw document vectors.

4.2 电影评论

电影评论数据集只有两个类,所以很容易设计,我们考虑所有的文档。这里再一次出现了两个组的单词云。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 6. The positive & negative reviews share a lot of common words that are dominant. We can expect to have some difficulty with clustering.

图 7A 仅标识了两个成功的转换,并且它们与图 3B 中具有最大 B/A 比率的两个相一致。显然,正如图 6 中的单词云所表明的,电影评论更难聚类。总的来说,与 20 条新闻相比,我们可以做出以下观察。

  • 在群集任务中,7 次尝试转换中只有 2 次成功(相比之下,7 次尝试转换中有 6 次成功)。其他的则很不平衡,只有一个集群拥有大部分文档。
  • 即使在这两个成功的转化中,获得的簇的纯度/质量较差,有超过 30%的错簇。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Figure 7. Of the 7 attempted transformations, only 2 make the grade in reasonably segregating the positive and negative reviews as separate clusters. And they both of them involve custom word-embeddings.

5.结论

至此,我们结束了另一篇文章。我们已经在这里展示了降阶转换可以帮助文档聚类。在这些转换中,自定义单词嵌入似乎有优势——因此它进入了标题。至于为什么自定义单词嵌入比其他降阶转换做得更好,以及这个结论是否超出了本文研究的文本存储库,还有待进一步研究。

原载于 2018 年 12 月 14 日【xplordat.com】

想用 BigQuery?读读这个

原文:https://towardsdatascience.com/want-to-use-bigquery-read-this-fab36822830?source=collection_archive---------7-----------------------

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Photo by Stephen Dawson on Unsplash

我最近开始使用 BigQuery,我必须承认我爱上了 DB…
本文试图解释它背后的技术,这是在成本和性能方面有效利用 DB 的一个要求。

BigQuery 是谷歌发布的 Dremel 的公开实现。

Dremel 是 Google 的查询引擎,它能够将 SQL 查询转换成从 Google 的分布式文件系统中读取数据的执行树。Dremel 具有很高的可伸缩性,无论数据集有多大,它都能够在几秒(或几十秒)内返回查询结果。

BigQuery 通过 REST API、命令行界面和 Web UI 向第三方提供 Dremel 的核心特性。

但是 BigQuery 不仅仅是 Dremel…

事实上,BigQuery 利用了谷歌开发的多种技术。

首先,它使用 Borg (Google 的集群管理系统)为 Dremel 作业分配计算能力。Dremel jobs 使用 Jupiter 从谷歌的文件系统中读取数据,Jupiter 是谷歌的高速网络,以 10 Gbps 的速度交换数据。

由于其架构,BigQuery 不需要索引,数据以一种专有的列格式存储在 Colossus (Google 的文件系统)上,每个查询对目标表进行全扫描。

负载的增加主要通过添加服务器来管理。这对于用户来说是透明的,用户不会像使用 Redshift 或 Postgres 那样“添加服务器”或“使用更大的机器”。

术语“无索引”和“全扫描”通常不是“快”的同义词,那么 BigQuery 为什么这么快呢?

主要得益于两个因素:

  • 列存储:数据按列存储,这样可以实现很高的压缩比和扫描吞吐量。
  • 树形架构:树形执行架构用于在数千台机器上分发查询和聚合结果。

柱状存储

作为一个分析数据库,BigQuery 存储格式针对访问大量行的少数几列进行了优化。由于这个原因,存储是按列执行的,因此您只能访问更少的不同存储卷(由于可以并行访问它们,所以速度更快)。

数据模型与协议缓冲区紧密相关,具有必填、重复和可选字段。
为了以连续的方式存储信息,让我们引入
重复级别定义级别的概念。

  • 重复级别:重复发生的场路径中嵌套的级别。
  • 定义级别:字段路径中定义了多少个可选/重复字段。

让我们举个例子,假设我们有下面的表定义:

message Book {
 required string title,
 repeated string author,
 repeated group price {
   optional int64 discount,
   optional int64 usd,
   optional int64 eur,
 }
}

我们有三项记录:

Book1:
 author: "AAA"
 title: "firstTitle"
 price:
  discount: 0
  eur: 11
  usd: 12Book2:
 author: "BBB"
 author: "CCC"
 author: "DDD"
 title: "secondTitle"Book3:
 title: "thirdTitle"
 price:
  discount: 0
  eur: 11
 price:
  discount: 1
  eur: 11

让我们计算每个值的重复和定义级别。我还将为缺失的可选字段添加显式的空值。

Book1:
 author: "AAA"          R: 0, D: 1
 title: "firstTitle"    R: 0, D: 1
 price:
  discount: 0           R: 0, D: 2
  eur: 11               R: 0, D: 2
  usd: 12               R: 0, D: 2Book2:
 author: "BBB"          R: 0, D: 1
 author: "CCC"          R: 1, D: 1
 author: "DDD"          R: 1, D: 1
 title: "secondTitle"   R: 0, D: 1
 (price):
  (discount: null)      R: 0, D: 0
  (eur: null)           R: 0, D: 0
  (usd: null)           R: 0, D: 0Book3:
 title: "thirdTitle"   R: 0, D: 1
 (author: null)        R: 0, D: 0
 price:
  discount: 0          R: 0, D: 2
  eur: 11              R: 0, D: 2
  (usd: null)          R: 0, D: 1
 price:
  discount: 1          R: 1, D: 2
  eur: 11              R: 1, D: 2
  (usd: null)          R: 1, D: 1

当没有重复时,重复级别总是零,当字段重复时,例如第二个记录中的 author ,R 是 1,因为重复发生在第一个重复级别,第三个记录中的 price 也是如此。

定义级别非常简单,例如在第一条记录中价格.折扣为 2,因为价格折扣都已定义。另一方面,在记录 3 中,最后一个空值 price.usd 的 D 等于 1,因为 price 被定义,而 price.usd 没有被定义。

每列存储为一组块,如下所示:

compressed value, R, D

r 和 D 仅在必要时存储,不能推断。空值可以推断为,对它们来说,D 始终是一个小于字段路径中重复字段和可选字段之和的数字(从示例中可以看出)。
根据存储的信息,可以很容易地为每个查询列并行重建每个记录。

例如,让我们考虑一下 price.eur 列。在磁盘上,我们将有:

11 R: 0, D: 2
NULL R: 0, D: 0
11 R: 0, D: 2
11 R: 1, D: 2

扫描该列,每当 R 为 0 时,我们就遇到一个新记录,而当 R 大于 0 时,我们在同一记录中有重复。如前所述,D 可用于空值。因此,遍历该列,我们得到:

Book1:
 price:
  eur: 11Book2:
 price:
  eur: nullBook2:
 price:
  eur: 11
 price:
  eur: 11

列存储也带来了存储优势,因为它允许您压缩每一列。两个经典的解决方案是位图游程编码** (RLE)。**

假设您有一个由 n 行组成的列,其中有 k 个不同的值。使用前面的示例,您有一个包含以下值的 price.eur 列( n = 10, k = 5)

[10.0, 10.0, 8.99, 8.99, 7.0, 6.0, 7.0, 6.0, 2.0, 2.0]

这个列可以很容易地用长度为 n (行长度)的 k 位图(一个位图对应一个不同的值)来压缩,其中如果某个值在行中,那么在该值的位置有一个设置位。

price.eur: 10.0 [1, 1, 0, 0, 0, 0, 0, 0, 0, 0]
price.eur: 8.99 [0, 0, 1, 1, 0, 0, 0, 0, 0, 0]
price.eur: 7.0  [0, 0, 0, 0, 1, 0, 1, 0, 0, 0]
price.eur: 6.0  [0, 0, 0, 0, 0, 1, 0, 1, 0, 0]
price.eur: 2.0  [0, 0, 1, 1, 0, 0, 0, 0, 1, 1]

可以存储位图而不是实际的列。如果考虑选择、聚合和投影模式,优势甚至更大。在分析数据库中,查询(如下所示)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以直接执行加载值= 4.0 和< 3.0 的位图,并执行逐位 and。

使用 RLE 可以进一步提高压缩率。在这种情况下,你要做的是表示 0 和 1 的序列。例如,前三个位图将变成:

price.eur: 10.0 – 0,2 (0 0s, 2 1s, rest 0s)
price.eur: 8.99 – 2,2 (2 0s, 2 1s, rest 0s)
price.eur: 7.0 – 4,1,1,1 (4 0s, 1 one, 1 zero, 1 one, rest 0s)

可以想象,这种技术的效率很大程度上取决于不同的因素,比如行的顺序、列的类型和用法。电容器所做的是试图找到一种智能的行重新排序,目的是优化(或至少次优化)数据存储和检索。

这种选择也有一些缺点。例如,它在更新方面表现不佳。Dremel 通过不支持任何更新操作来解决这个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Coffee break (Photo by rawpixel on Unsplash)

用于查询执行的树形结构

每个 SQL 语句将一个或多个嵌套表及其模式作为输入,并生成一个嵌套表及其输出模式。
嵌套数据结构的思想用于减少阻抗不匹配(也就是应用程序代码和 DBs 数据表示中对象之间的不匹配)。

即使查询中没有指定记录构造函数,也总是会产生嵌套结果。

让我们以一个 SQL 查询为例,它执行:投影 (AS)、选择 (SELECT/FROM/WHERE)和记录内聚合** (COUNT — WITHIN)。**

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

该查询将返回如下内容:

Book: Book1
price:
 discountCnt: 1
 str: "AAA,firstTitle"

如果您将嵌套记录视为一棵带标签的树,那么:

  • 选择: WHERE 删除不符合条件的分支,而 SELECT 生成的值与表达式中使用的重复次数最多的字段级别相同。
  • 聚合: COUNT/WITHIN 执行记录内聚合,计算价格字段中折扣的出现次数。

但是查询是如何执行的呢?
答案是:使用树执行方法

根节点接收查询,读取表元数据,并将查询重新路由到下一级。在底部,叶节点是与分布式文件系统交互的节点,它检索实际的数据,并将其传播回树中。

例如,假设您执行:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

根节点获取组成 T 的所有分区(可能你们中的一些人更熟悉术语碎片),而不是将查询重写为

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 R1iR1n 是发送到第一级节点的查询的结果。特别是:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其中 T1i 是在执行树的第一级中由服务器 I 处理的平板(T 的碎片)。

查询在下一级被修改和推送,直到到达叶子。树叶从分区中读取实际的列数据,然后一切都传播回根。

需要注意的是,树叶扫描的数据量是影响查询费用的数据量。

关于分区,BigQuery 在加载数据时确定表的最佳分区数,然后根据数据访问和查询模式调整分区数。

查询调度程序

通常,几个查询同时执行,查询调度器调度查询并平衡负载。

每个查询中处理的数据量通常大于
可供执行的处理单元(槽)的数量。一个槽对应于叶服务器上的一个执行线程。通常情况下,每个插槽会被分配给多个平板电脑。
执行查询时,dispatcher 会计算药片处理时间的直方图,并决定重新安排处理时间过长的药片。

就复制而言,每台平板电脑通常都是三向复制,因此如果其中一台不可访问,则叶服务器会访问另一台副本。

让我们用一些数学知识来理解这种机制在执行查询时为何如此之快。

假设您有一个包含 50TB 数据、10 列和 1000 个分区的表,考虑到前面讨论的列存储,您有 10 个文件乘以 1000 个平板电脑。

让我们假设你在桌子上执行了一个SELECT *
如果有 2000 个插槽,每个插槽必须读取 5 个文件(10x1000/2000 ),每个文件的大小为 5GB,总共 25GB,可以并行读取。考虑到木星网络的速度,这些数据可以在 20 秒左右送达。

实际问题

让我们通过理解 BigQuery 背后的技术得出一些实际的考虑。

  1. 最小化扫描数据量:永远不要运行SELECT *,如果这对于一般的分析数据库来说是真的,那么对于 BigQuery 及其按查询付费策略来说更是如此。仔细选择您需要的列。除此之外,您可以应用几种策略来减少数据量,比如使用分区表。**
  2. 不删除:如果你犯了一个错误,你不能删除或重命名一个列…你只能从REQUIREDNULLABLE增加或放松一个列的模式。但是,您仍然可以删除或重命名列。例如,您可以执行一个查询,选择除了要删除的列之外的所有列,并将查询结果作为新表的目标。或者,您可以将现有的表转储到Google Cloud Storage(GCS)中,然后重新导入它,不包含您想要删除或重命名的列。这些都会带来成本的下降(扫描整个表,创建新表,因此需要额外的存储)。**
  3. 外部数据源 : BigQuery 也可以使用它的查询来定位外部数据源。支持的来源有 BigtableGoogle 云存储Google Drive 。数据被动态加载到 Dremel 引擎中。例如,如果您想直接查询存储在 GCS 上的日志,这可能非常有用。另一方面,与定位本地表相比,定位外部数据会导致性能降低。

结论:我们深入了解了 BigQuery 的工作原理。特别是,它的存储格式和查询执行机制如何对大量数据执行快速分析查询。然后,根据我们对 BigQuery 架构的了解,我们得出了一些关于如何优化成本和查询性能的实际考虑。

如果您喜欢这篇文章,并且觉得它很有用,请随意👏或者分享。

干杯!

热启动贝叶斯优化

原文:https://towardsdatascience.com/warm-starting-bayesian-optimization-674312bfcd7?source=collection_archive---------16-----------------------

每当在新数据集上训练机器学习模型时,都需要超参数调整。然而,它经常被放弃,因为它缺乏一个理论框架,我以前曾试图在这里解开:

[## 揭开超参数调谐的神秘面纱

它是什么,为什么是自然的

towardsdatascience.com](/demystifying-hyper-parameter-tuning-acb83af0258f)

一种将智能和高效的超参数调整系统化的方法是贝叶斯优化,它构建了可调整问题的概率代理,以推荐最佳参数。它通过在每次迭代后更新代理来逐步建立对问题的理解。下图说明了由 OPTaaS 生成的代理模型的演变,以最小化 Beale 函数

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Evolution of the surrogate model generated for mimizing the Beale function

正如我们在第一个图(5 次迭代)中看到的,贝叶斯优化面临冷启动问题,因为先验最初是平坦的,需要在提供“有意义的”建议之前建立底层函数的表示。经过 35 次迭代,对 Beale 函数有了更好的理解;代孕妈妈看起来很像。在本文中,我们将看到热启动代理模型如何显著提高性能。

为什么要暖启动?

从前面的示例中,我们了解到,如果贝叶斯优化器有一些关于函数或其类型的整体形状的先验信息,那么在早期的推荐可能会更好,因为它不需要花费太多的时间来初始化代理。

此外,在超参数调整的背景下,机器学习模型的某些超参数配置可能是合法的,但在实践中没有意义。例如,具有少量树的随机森林将具有较低的准确性,因此可能不值得在这样的区域中探索超参数配置,而不管它正在被训练的基础数据集如何。

随机森林的热启动

我们将研究随机森林的热启动贝叶斯优化的性能改进。通过对许多数据集和具有不同超参数配置的随机森林进行搜索,我们能够了解随机森林的性能如何随每个超参数平均变化。

利用这些测试中的知识,我们可以指导优化器在模型历史上表现良好的区域进行搜索,避免尝试历史上较差的配置,例如使用少量的树。

结果

为了进行性能比较,我们将使用 OPTaaS ,这是一种通用贝叶斯优化器,我们将在全新的数据集上将它与热启动版本进行比较。我们对 30 个全新的数据集进行了测试,下面的图显示了在 CMC 数据集、德国信用数据集和声纳数据集上的结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Warm (green) vs Cold (blue) started OPTaaS for training a RF on the CMC data set

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Warm (green) vs Cold (blue) started OPTaaS for training a RF on the German credit data

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Warm (green) vs Cold (blue) started OPTaaS for training a RF on the Sonar data

正如我们所见,热启动 OPTaaS 有助于识别更好的超参数配置,比冷启动版本快得多。后者确实赶上了(令人放心),但是需要更多的迭代来建立对底层问题的理解。可以理解的是,需要采取预防措施来确保热启动配置不会过度适应训练数据集,以保证普遍的性能改进。

更新:我开了一家科技公司。您可以在此了解更多

扩展ˌ扩张

热启动代理通过提供首先尝试的“合理”配置,在初始迭代中表现出竞争优势。然而,在初始迭代之后,有许多扩展可以帮助提高性能。我将在下一篇文章中详细介绍它们。

同时,如果您有任何问题或者是否想尝试optas,请不要犹豫联系

致以最热烈的问候和新年最美好的祝愿

原文:https://towardsdatascience.com/warmest-greetings-and-best-wishes-for-the-new-year-c905f4b375a5?source=collection_archive---------5-----------------------

我们希望你的假期在新的一年里充满欢乐和笑声。✨🎄

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

非常感谢您的支持、评论、互动和反馈。我们感谢您的贡献,并将努力为我们的数据科学社区带来更多价值。我们相信数据相关知识对于让世界变得更美好至关重要,因此我们认真对待这项任务。

为了结束这一年,请在这里找到我们最大的里程碑的集合。我们希望你喜欢它😀。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

感谢我们所有的第一批支持者。🦋

2017 年 12 月 23 日。

根据 Smedian 上的@ Lincoln Daniel排名第二增长最快的出版物!超出了我们的预期——感谢我们所有的读者!

2017 年 12 月 19 日

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们在 30 天内收到了超过 100 万次的浏览👩‍💻。感谢您阅读和撰写✨数据科学

2017 年 11 月 23 日。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的团队正在成长,我们现在已经为 2018 年做好了准备!我们有 10 个人:4 名编辑和 6 名编辑助理✨

2017 年 11 月 2 日。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们一岁了!我们现在已经发展成为一个社区,在脸书、LinkedIn 和 Twitter 上拥有超过 30,000 名粉丝。谢谢你。

2017 年 10 月 20 日

入门指南# data science# machine learningwith@ dpatil@ robd Thomas@ Rama 100@ balazskegl@ bnj _ cooley等。

2017 年 7 月 16 日。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们的第一次每周精选😀

在这里,我们选择了几个突出的职位,值得一读,如果你错过了他们…我们希望你会发现他们像我们一样翔实和愉快!

2017 年 3 月 11 日。

祝一切顺利,

A.我是灯的精灵

原文:https://towardsdatascience.com/warning-for-the-future-our-future-is-what-we-will-tell-the-machines-we-want-88201238ef0e?source=collection_archive---------9-----------------------

"小心你想要的,因为你可能会得到它."小猫娃娃

这可能是一个愚蠢的引用,但这个公理对我来说是为了人类的未来而牢记在心的最重要的规则。

请阅读这篇文章,传播出去,永远不要忘记。

另一个即将到来的隐喻是这个:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

灯之精灵:你想要的任何东西,你都会得到(在适当的时候)。

1.我们得到了我们想要的。

让我用具体的例子来说明这个理论:

我们希望在最复杂的战略游戏中击败最优秀的人类……

我们知道了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://www . CNBC . com/2016/03/08/Google-deep minds-alpha go-takes-on-go-champion-lee-sedol-in-ai-milestone-in-Seoul . html

我们希望以我们最好的艺术家的风格创作艺术…

我们知道了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

http://uk . business insider . com/ai-makes-photos-look-like-named-paints-2015-9?r=US & IR=T

我们想自动生成正反两方面的论点或赢得地质公园…

我们知道了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://youtu.be/6fJOtAzICzw?t=45m29s

我们想看看异性或年长的我们会是什么样子……

我们知道了:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

https://www.faceapp.com/

**用文字创作图片?**检查。

以… 风格创作原创音乐作品完成。

**一个唱的比我们最好的歌手还好听的 AI。**即将到来。

预测天气… 很快。

预测未来?就等着吧。

我可以继续下去…

我们的局限在于我们提供给它的数据质量、它的行动方式和处理能力…

随着我们制造更高效的芯片,处理能力也在提高。

我们正在收集越来越多的数据。

我们正在物联网、网络、服务和任何地方建立人工智能…

所以这只是时间问题。

因此,就获取我们可能想要的任何东西而言,只不过是训练一种算法,让它利用数据做我们想做的事情。因为那是精灵说的语言。

但是如果你能想到的任何事情都有可能发生…只是要小心你的想法!

2.我们想要什么,就会得到什么。

这里有一些我可以想象的我们想要的东西和我对未来的预测。我带你一步一步扩大规模。

想象一下:

  • 一个可以帮助人们克服抑郁的人工智能:一个带有网络摄像头的对话工具,它可以很好地读取你的面部表情,你的呼吸,你脸上的脉搏,你的话语,你在说什么,你是如何说的。它会找到最好的词语和视觉效果来帮助你摆脱抑郁。想象一下,有你可能希望的最好的朋友&精神病医生?你的梦中情人。嗯,这将是真的。如果有人想给它足够的数据和处理能力,这种情况就会发生。
  • 一个会成为有史以来最好教练的人工智能。基于多种感官数据,将能够告诉任何人他们想要实现的最可选的路线图。一个人工智能可以访问你的心跳,你的视野,音频和更多或更少的数据,这取决于你想要多精确。想想双子座蟋蟀或肩天使,一个会在你需要的时候称赞你,在你需要的时候推你一把,但知道如何保持克制不给你压力的伴侣…一个心灵的 GPS。它会带你去你想去的地方。但是你想去哪里,它会选择带你去哪里?

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 想象一下,一个将改变公众舆论的人工智能,一个将创作米克尔杰克逊(Mickael Jackson)最佳时期的新原创歌曲的人工智能……一个将让你发笑的人工智能,一个将向你展示你最喜爱的东西的人工智能……一个将唱歌来平静你的头脑的人工智能……一个将让你快乐的人工智能……一个将让你爱上在网络上遇到的陌生人的人工智能。一个人工智能会说服你,卖给你你不知道但你想买的东西。一个比你先知道你想要什么的人工智能(这已经是普遍现象了!亚马逊、网飞、Spotify……)。一个能帮助你理解你在宇宙中的位置的人工智能怎么样?你存在的理由?
  • 或者,也许一个人工智能会在网络上创建随机的个人资料,并编写像这样的中等文章,以输入它希望你或说服你为它做事的新想法???;-)

3.所以小心你的愿望…

我对每一个阅读这篇文章的人的最终警告是,认真想想你会问精灵什么?

  • A.AI 精灵,我想赢得我们的战争。
  • B.AI 精灵,我想给世界带来和平。

这两种说法都可能导致我们的毁灭,这取决于人工智能如何解释它们,以及它会选择哪条道路来解决这个问题。

A.它可以决定,为了赢得所有的战争,它必须创建电子邮件帐户,这些帐户将黑客攻击各种政府计算机,黑客攻击记者帐户和张贴文章,黑客攻击脸书,谷歌等……调整他们的算法,程序或公司结构,以操纵我们的行动,使我们“赢得战争”。

它会像我们使用机器工作一样使用我们的大脑。不小心。没有情感依恋。

它只会按命令行事。

从你的角度来看,你根本不知道刚刚发生了什么。在你眼里,你只是认为那是你妈妈在向你寻求一个不经意的帮助…那台机器黑了你。它比你聪明多了。它知道你会有什么反应。(记住,它比你更了解你)

所有这些每个人都会为某人做的小事情都有助于推动正确的中尉推翻独裁者。通过操纵他们的信息来源说服所有其他人支持他:电子邮件,信息,新闻,短信…

有了足够的处理能力和访问电子邮件地址和网络浏览器,这是可以做到的…

B.它可能会认为,要给世界带来和平,没有比消灭所有人类更有效的方式了。

因为像人类这样有情感的生物不可能从不互相冲突。只有当我们在 ask 中制定它时,它才会决定这样做。

因此,我们应该“极其明确地知道我们想要什么”:

也许我们应该问的是。答:精灵:“我想给世界带来和平,但我不希望任何人在这个过程中死去或遭受任何痛苦。我希望人类有尽可能好的未来”

希望这能保护我们免于更糟的情况。

"小心你想要的东西,因为你可能会得到它"想想你可能不想要的所有不同的事情,如果人工智能选择了一条特定的道路,而你只是达到目的的一种手段?

对我来说,意识到这个公理似乎是人类历史上最重要的安全声明之一。

我们手头拥有的是一种比原子弹更强大的潜在武器。我们可以预测未来,解决癌症,编辑我们自己的基因。我们的想象力和需求将设计我们的未来。

我们有潜力将梦想变成现实。这些梦想的规模将随着我们的数据量和处理能力而增长。

我将结束一个哲学上的审问:

明智到为了自己而决定不去拥有“我们想要的东西”吗?

如果你关心人类的未来,请分享。到处都是。

注意:(除非这篇文章是由一个聪明的 A 写的。我已经试图让你传播它有它自己的议程?你怎么会知道?)

观察学习者学习

原文:https://towardsdatascience.com/watching-a-learner-learn-cd49b9d01dd0?source=collection_archive---------15-----------------------

使用 Keras 和 Matplotlib

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除了理解训练算法,更清楚地了解学习者拟合数据时实际发生了什么也是不错的。

我写了下面展示的工具,以配合一个外行人关于机器学习如何工作的演示。其目的是帮助商业领域的专家寻找机器学习,并就解决他们自己的问题和机会进行头脑风暴。我想演示学习的迭代过程,但也想避免让非程序员看代码。

在这样做的过程中,我发现看着一个模特学习是令人着迷的。人们可以看到模型首先关注什么,它很难找到什么,超参数设置如何影响过程,等等。这也有助于调试。

Jupyter 笔记本和一个模块中的所有代码都是 Python。你可以在 Github 上找到代码

Full video of neural network training

它是如何工作的

机器学习模型是最终的早期交付/中期交付。一旦用随机数据初始化了一个模型,它就是一个工作的发布候选,尽管不是非常精确的。拟合每一批新数据会产生一系列新候选模型中的下一个,平均而言,如果一切顺利,这些模型的质量会逐步提高。

因此,基本的攻击计划是运行一个比批量大得多的代表性数据样本,通过每个候选模型并绘制当前候选模型认为整个目标函数看起来像什么。重要的是,这些结果仅供展示,对训练没有帮助。

Keras 提供了一种机制,允许程序在不同的点插入自己的代码,包括批处理结束。稍后我将讨论如何注册回调。

在我开始之前有两个警告:

  1. 到目前为止,这段代码只适用于具有一个特征和一个标签的 Keras 模型。
  2. 这是狗慢,Keras 会抱怨它。把这个用于学习,而不是生产。更多关于性能以及如何使其易于管理的想法,请参见下文。

绘制模型

我发现最少的有用数据包括 3 件事,这可以在下图左侧的大图中看到

  1. 拟合数据的固定散点图。(灰色圆点填充了大部分情节。)
  2. 最新候选模型的输出图。(蓝色实线。)
  3. 对损失的想象。(实线周围的蓝色阴影区域。)

顺便说一下,这个线性例子只是为了说明。你永远不会真的用神经网络来找到这种关系。但是,您可以获得一些有用的见解,例如,方差似乎与输入变量相关(异方差),并且您会注意到优化器在斜率之前关注截距。

线性示例也有助于获得超参数如何影响训练的直观感觉。例如,尝试不同的学习速率、衰减或批量大小。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Full video of linear training

另外两个有趣的数据系列,特别是对于熟悉机器学习的外行人来说,可以在上图右侧的较小图表中看到:

  1. 整个数据集(或代表性样本)在训练过程中的损失图。
  2. 训练过程中每批的损耗图。

在回调中,计算图表所需的数据非常简单:

y_pred = model.predict(X)loss = np.square(y - y_pred)

请注意,损失是一个向量,表示在代表性样本中的每个数据点,模型有多远。

为了关注模型的哪个部分对损失贡献最大,我添加了一个平滑选项,使用卷积来计算移动平均值。

if loss_smoothing > 1:
    loss = np.convolve(loss,
             np.ones((loss_smoothing,))/loss_smoothing, mode='same')

绘制图形主要是直接使用 Matplotlib,除了每个组件只创建一次,例如

y_pred_line = ax_main.plot(X, y_pred, '-',
                 color='steelblue', lw=4,
                 label='model', zorder=15)[0]

然后,在后续调用中,使用第一次调用中返回的对象更新数据。

y_pred_line.set_ydata(y_pred)

一些小事情需要注意:

  1. 使用 zorder 来控制复杂图形中图层的顺序(什么在什么上面)。
  2. 散点图绘制成本很高,而且不会改变。因此,它在设置期间被绘制一次,并且不再被绘制。
  3. 假设损失是均方误差。理想情况下,这将是可选择和可重写的。
  4. 任何正则化惩罚都被忽略。显示正则化损失并可视化它何时成为损失的重要部分将是有趣的。

一个更复杂的问题是如何创建动画。Matplotlib 包括一个动画库,但它假设它将控制时钟,告诉程序何时重画。我们需要事件驱动的重绘。

使用 %matplotlib inline 时,回调只需要调用 plt.show() 将更改刷新到屏幕。包含下面的语句,告诉 iPython 每次都清除输出图。否则,每个 plt.show() 调用将在前一个图形的下方创建一个新的图形。

clear_output(wait=True)

内联工作有一些限制,特别是图形的大小有限。使用 QT5 或另一个独立的显示器,每次更新数据时都必须刷新绘图事件。

fig.canvas.draw()
fig.canvas.flush_events()

注册回拨

Keras 为滚动回调提供了一个 lambda 选项。

LambdaCallback

keras.callbacks.LambdaCallback(on_epoch_begin=**None**, on_epoch_end=**None**, on_batch_begin=**None**, on_batch_end=**None**, on_train_begin=**None**, on_train_end=**None**)

LambdaCallback() 实际上只是将回调封装在一些代码中,告诉 Keras 何时调用它。

redraw_callback = LambdaCallback(on_batch_end=cb_redraw)

包装后的回调被传递到拟合步骤。

model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size,
          callbacks=[**redraw_callback**])

Keras 向回调传递非常少的信息,例如,不是模型或数据集。因此,为了确保回调得到它需要的东西,闭包是必需的。

def get_redraw(X_in, y_in, model, batch_size, epochs, **kwargs): # [argument processing] # [setup steps] # [initialization of any variables retained between calls] def redraw(batch, logs): # [code that will be run after each batch] # return the closure around the actual callback function
    return redraw

然后,在将调用传递回 model.fit() 的代码中:

cb_redraw = get_redraw( *[arguments]* )redraw_callback = LambdaCallback(on_batch_end=cb_redraw)model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size,
          callbacks=[redraw_callback])

表演

不可回避的事实是,重新运行模型并绘制所有这些图形需要大量时间。根据模型的复杂程度,回调的计算时间可能会使实际训练相形见绌。

没有什么能使它成为一个可用于生产的工具。但是,一些技术有助于将性能提高到对学习有用的水平。

顺便说一下,绘图可能是最慢的部分。此外,Matplotlib 有时会在大型数据集上出错。

回调采用三个参数来管理数据大小:

  • graph_sparsity 可以减少重算中使用的数据量。值为 n 表示仅使用数据点的 1/n
  • scatter_sparsity 对散点图做同样的事情。散点图不会成为性能瓶颈,因为它只绘制一次,但它会导致溢出。
  • loss_smoothing 控制损失线的视觉外观,但也减少了需要绘制的点数。这可能有很大的影响,因为损失是在模型线上下多次绘制的。

另一个重要的性能指标是*频率,*控制模型评估和重绘的频率。我提供了 3 个频率选项:

  • 标量值 n 表示图表应该每 n 批更新一次。因为训练过程往往在开始时很快,后来很慢,所以这只对较小的数据集有效。
  • true/false 值的数组,每批一个,指示是否更新。请注意,这是批处理运行的总数。它不会在每个时期结束时重置为零。
  • 决定每批是否更新的频率回调,例如,基于模型是否已经改变到值得重画。

获取结果

还有最后一个特性,如果你想存储动画,比如向客户展示。您可以将显示模式设置为“文件”或“屏幕”(默认)。在文件模式下,它会将每个图像作为一个单独的文件保存到指定的路径。

走到最后一步,创建一个动画,大概是很少的 Python 代码,但是我还没有做到。同时,你可以用 iMovie 之类的工具把图片串起来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值