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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Kaggle.com 有趣的数据集

原文:https://towardsdatascience.com/interesting-datasets-on-kaggle-com-3a4a250b0b85?source=collection_archive---------6-----------------------

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

Kaggle.com 是数据科学家和机器学习工程师中最受欢迎的网站之一。虽然 Kaggle 还没有 GitHub 受欢迎,但它是一个正在崛起的社交教育平台。

这是一个数据科学家寻找有趣数据集的好地方,他们已经做了一些预处理。你可以找到图像数据集,CSV,金融时间序列,电影评论等。此外,所有这些数据集都可以从 kaggle.com 完全免费下载。

55,000 首歌词— CSV

这个数据集是一个矩阵,由每首歌曲的快速描述和文本挖掘中的整首歌组成。需要做一些预处理,将这个数据集导入字符级递归神经网络。然而,对于这项任务来说,这是一个非常大的数据集,使用 RNN 来学习生成歌词的结果非常令人印象深刻。如果在本地笔记本电脑上运行,预计这个模型需要一点时间来训练,训练这个模型是开始在 Jupyter 笔记本电脑中使用 EC2 实例进行数据科学项目的一个很好的练习。

获取数据集

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

辛普森一家人物数据-图像

对于神经网络风格转换算法来说,这是一个非常有趣的数据集。这些算法可能很难构建,但尝试将真实人脸映射到辛普森一家角色的风格将是一个非常有趣的项目。这项技术可能会为电视节目的动画软件带来重大变革,如《瑞克和莫蒂》、《一家人》、《F 代表家庭》、《杰克骑士》等。

获取数据集

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

SF 工资— csv

开始使用 RNN/序列模型的绝佳数据集。

水果 360 数据集—图像

难以置信的图像数据集,轻量级文件,(只有 386 MB 的图像数据集)。非常适合对不同类型的水果进行分层,这些水果有可能被用于改善工业化农业。这也是一个有趣的数据集,可以用来玩生成对立网络,生成独特的水果设计。

获取数据集

通过声音识别性别—带音频统计的 csv

我希望看到这个数据集作为原始音频文件,但是,仍然有可能建立一个神经网络分类器,将能够把语音数据分为男性和女性。这些模型有一些有趣的应用程序,如 Siri 和 Alexa。

获取数据集

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

南方公园对话—包含对话句子的文本 csv

对于单词级递归神经网络来说,这可能是一个非常有趣的测试。想象神经网络算法在《南方公园》等喜剧节目中写笑话或台词,是一件很迷人的事情。这个软件对于许多不同媒介的小说作者来说非常有用。

获取数据集

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

TED 演讲— csv

非常有趣的文本挖掘数据集。使用诸如 TED 演讲的描述、持续时间、时间和地点作为 TED 演讲视频在线评论数量的预测指标。

获取数据集

各国幸福报告— csv

参与社会科学研究的人将他们的快乐程度从 0 到 10 分不等。这些参与者按照他们的国家和地区进行地理排序。对于 Google Maps API 或 D3.js 可视化库来说,这是一个很大的地图可视化问题。

关于使用谷歌地图的更多信息,请查看他们的 API 文档页面:

【https://developers.google.com/maps/documentation/

当我完成上传我的 Keras 项目,在耐克和阿迪达斯篮球鞋上建立一个图像识别分类器时。创建我自己的数据集帮助我更加欣赏 Python 中的 web 管理数据集和 web 抓取 html 解析工具。如果您对使用这些数据集之一构建图像识别模型感兴趣,请查看该项目。

[## 如何构建卷积网络分类器:耐克 vs 阿迪达斯鞋

我为#100DaysOfMLCode 做的一个实验是建立一个图像分类器,它可以区分 Nike…

blog.usejournal.com](https://blog.usejournal.com/how-to-build-a-convolutional-network-classifier-81eef880715e)

CShorten

Connor Shorten 是佛罗里达大西洋大学计算机科学专业的学生。对数据科学、深度学习和软件工程感兴趣。主要用 Python,JavaScript,C++编码。请关注更多关于这些主题的文章。

来自 R/Pharma 的有趣包装

原文:https://towardsdatascience.com/interesting-packages-taken-from-r-pharma-e89639788180?source=collection_archive---------12-----------------------

几个月前,我参加了马萨诸塞州剑桥的 R/Pharma 会议。

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

作为一个收获,我想到了我的项目,以及如何利用别人提供的解决方案进行改进。 R 中的解决方案主要是 *R 包。*我是一名在监管环境下的优秀程序员,所以我列出的解决方案主要是为了帮助你,如果你提供 a)优秀的应用程序 b)统计软件包 c)经过验证的解决方案。让我们来看看哪些 R 包我以前不知道,现在发现确实有用:

个人信息管理程序

我的大多数同事制作的是报告。实际上是大量的统计报告。由于我们在受监管的环境中工作,所有报告都要经过双重检查。意思是你给它编程,别人也给它编程。你不想浪费时间,因为有一个数学包的更新导致了数字的差异。有一个非常好的解决方案。

Packrat 允许您存储在某个会话/项目中使用的所有包。packrat 的主要指南可以在描述 it 的 RStudio 博客中找到。

Packrat 不仅会存储所有的包,还会存储所有的项目文件。它集成在 RStudio 的用户界面中。它让你可以很快地与不同的同事分享项目。

我认为主要的不足是需要一个服务器,在那里你存储所有这些包。这个应该可以用 RStudio 新的包管理器解决。另一个缺点是与一些软件包不兼容。我注意到我不能用 packrat 使用 R-3.4.2 下的 BH 包,必须找到一个解决办法。

Diffdf

我必须告诉你,我浪费了将近 30%的时间来比较数据。这是测试统计结果或用你编写的统计应用程序进行计算的一项重要任务。在制药和诊断应用中,最相关的方面之一是数据的有效性。确保我们在临床研究、质量保证或日常工作中使用的数据来自同事。对我来说,这个任务不仅很难,而且更难记录。

基兰·马丁的 diffdf 包真正解决了这个任务。它不仅为你提供了一个整洁的界面,还提供了精心安排的结果。

基本的 diffdf 示例如下所示:

library(diffdf)
iris2 <- iris
for (i in 1:3) iris2[i,i] <- i^2
iris2$new_var <- "hello"
class(iris2$Species) <- "some class"
diffdf(iris, iris2)

您可以看到,基本上新引入了一个列,在 3 个不同的数字列中更改了三个值,并且更改了一个列的类型。所有这三个变化都显示在单独的输出中。此外,还提到了没有变化的内容,如果您没有检查正在比较的数据帧是否完全相等,这可能会非常有帮助。

Differences found between the objects!

A summary is given below.

There are columns in BASE and COMPARE with different classes !!
All rows are shown in table below

  ==================================
   VARIABLE  CLASS.BASE  CLASS.COMP 
  ----------------------------------
   Species     factor    some class 
  ----------------------------------

There are columns in COMPARE that are not in BASE !!
All rows are shown in table below

  =========
   COLUMNS 
  ---------
   new_var 
  ---------

Not all Values Compared Equal
All rows are shown in table below

  =================================
     Variable    No of Differences 
  ---------------------------------
   Sepal.Length          1         
   Sepal.Width           1         
   Petal.Length          1         
  ---------------------------------

All rows are shown in table below

  ============================================
     VARIABLE    ..ROWNUMBER..  BASE  COMPARE 
  --------------------------------------------
   Sepal.Length        1        5.1      1    
  --------------------------------------------

All rows are shown in table below

  ===========================================
    VARIABLE    ..ROWNUMBER..  BASE  COMPARE 
  -------------------------------------------
   Sepal.Width        2         3       4    
  -------------------------------------------

All rows are shown in table below

  ============================================
     VARIABLE    ..ROWNUMBER..  BASE  COMPARE 
  --------------------------------------------
   Petal.Length        3        1.3      9    
  --------------------------------------------

输出易于阅读,并且包含了完成预期任务所需的所有信息:比较两个数据帧。我真正喜欢的是关于观察到多少差异的快速反馈。如果您有很多不同之处,除了您给列的每个值加了+1,您可以立即在摘要中看到这一点。

此外,详细信息不仅给出了值的差异,还给出值在表中的位置,这是一个巨大的优势。有时,分析大型患者群组,可以揭示测量值 99,880 的差异,并且您不希望在找到这一差异之前滚动“匹配”表。因此,这个详细视图相对于其他包来说是一个巨大的优势。

档案保管员

旨在改进数据分析结果管理的 R 包。该软件包的主要功能包括:

(I)管理包含 R 对象及其元数据(对象的属性和它们之间的关系)的本地和远程储存库;

㈡将 R 对象存档到储存库;

(iii)通过其独特的挂钩共享和检索对象(及其谱系);

㈣搜索具有特定属性或与其他对象有关系的对象;

㈤核实物品的身份及其创造背景。

这在可再生数据分析中非常重要。在药理学项目中,你经常需要在很长时间后重现病例。档案包允许在文件中存储模型、数据集和整个 R 对象,这些对象也可以是函数或表达式。现在,您可以将文件存储在长期数据存储器中,甚至在 10 年后,使用 packrat + archivist,您将能够重现您的研究。

任务(ii)示例—恢复模型

此示例给出了存储在包中的模型列表

library(archivist)
models <- asearch("pbiecek/graphGallery", patterns = "class:lm")
modelsBIC <- sapply(models, BIC)sort(modelsBIC)

任务(I)示例—本地存储对象

我在 https://github.com/zappingseb/RPharma2018packages文件夹里有一个 data.frame。您的任务是创建一个新的 data.frame,将其存储在arepo_new文件夹中,并将其添加到恢复的 data.frame 中。如果一切顺利,data.frames 的总和显示为位置(1,1)的 2。

library(archivist)repo <- "arepo_new"
createLocalRepo(repoDir = repo, default = TRUE)df <- data.frame(x=c(1,2),y=c(2,3))
saveToRepo(df)setLocalRepo("arepo")
df2 <- loadFromLocalRepo("4a7369a8c51cb1e7efda0b46dad8195e",value = TRUE)df_test <- df + df2print(df_test[1,1]==2)

在此任务中,您可以看到,我的旧 data.frame 不仅存储为 data.frame,而且还具有独特的可复制 md5 哈希。这使得在几年后再次找到东西并展示它正是你所需要的东西变得非常容易。

logR

logR 包可以用来记录你的分析步骤。如果您在分析中有很多步骤,并且需要知道这些步骤需要多长时间,状态是什么(错误、警告)以及确切的调用是什么,那么您可以使用 logR 来存储所做的一切。因此,logR 连接到 PostGres 数据库,并在那里记录您分析的所有步骤。我强烈推荐使用 logR,以防您不确定您的分析是否会再次运行它。logR 将检查你的每一个步骤,因此任何失败都会被存储。如果您的下一步运行只是因为设置了任何环境变量,您肯定会看到这一点。下面是来自作者的 logR 的基本示例:

library(logR)

# setup connection, default to env vars: `POSTGRES_DB`, etc.
# if you have docker then: docker run --rm -p 127.0.0.1:5432:5432 -e POSTGRES_PASSWORD=postgres --name pg-logr postgres:9.5
logR_connect()
# [1] TRUE

# create logr table
logR_schema()

# make some logging and calls

logR(1+2) # OK
#[1] 3
logR(log(-1)) # warning
#[1] NaN
f = function() stop("an error")
logR(r <- f()) # stop
#NULL
g = function(n) data.frame(a=sample(letters, n, TRUE))
logR(df <- g(4)) # out rows
#  a
#1 u
#2 c
#3 w
#4 p

# try CTRL+C / 'stop' button to interrupt
logR(Sys.sleep(15))

# wrapper to: dbReadTable(conn = getOption("logR.conn"), name = "logr")
logR_dump()
#   logr_id              logr_start          expr    status alert                logr_end      timing in_rows out_rows  mail message cond_call  cond_message
#1:       1 2016-02-08 16:35:00.148         1 + 2   success FALSE 2016-02-08 16:35:00.157 0.000049163      NA       NA FALSE      NA        NA            NA
#2:       2 2016-02-08 16:35:00.164       log(-1)   warning  TRUE 2016-02-08 16:35:00.171 0.000170801      NA       NA FALSE      NA   log(-1) NaNs produced
#3:       3 2016-02-08 16:35:00.180      r <- f()     error  TRUE 2016-02-08 16:35:00.187 0.000136896      NA       NA FALSE      NA       f()      an error
#4:       4 2016-02-08 16:35:00.197    df <- g(4)   success FALSE 2016-02-08 16:35:00.213 0.000696145      NA        4 FALSE      NA        NA            NA
#5:       5 2016-02-08 16:35:00.223 Sys.sleep(15) interrupt  TRUE 2016-02-08 16:35:05.434 5.202319000      NA       NA FALSE      NA        NA            NA

RInno——像 Windows 应用程序一样闪亮的应用程序

我们经常构建闪亮的应用程序,需要本地 PC 设置才能运行良好。例如,我们是否构建了一个闪亮的应用程序,通过用户的活动目录登录来访问 MySQL 数据库。为了在没有登录窗口的情况下获取 Active Directory 凭证,我们只需在本地运行这个闪亮的应用程序。由于部门中并非所有用户都知道如何运行 R + runApp(),RInno 对我来说听起来是一个很好的解决方案。

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

RInno 将你闪亮的应用打包成一个.exe文件,你的用户可以直接在他们的 PC 上运行。这也将允许他们在本地存储的 Excel 文件上使用奇特的 ggplot 功能。这在数据受到安全保护而无法上传到服务器的情况下非常重要。开发者给出的教程可以帮助你很好的理解这个问题以及如何解决。

码尺

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

Photo by patricia serna on Unsplash

包含评估统计模型预测能力所需的所有度量的软件包。我在第一次治疗中看到了这个包裹。每当我们想到一种恰当的方法来衡量我们的模型和数据之间的差异时,我们会讨论很多不同的方法。当然写sqrt(sum((x-y)**2))很简单,但是用标尺two_class_example %>% rmse(x, y)看起来更好。在码尺中,你知道你的数据来自哪里,你可以很容易地交换函数rmse,而在我展示的例子中,你需要重新编码整个功能。码尺以后会省去我们团队很多讨论。很高兴它出来了。

有趣的概率问题:自我修正随机漫步

原文:https://towardsdatascience.com/interesting-probability-problem-self-correcting-random-walks-30acc15ec2c6?source=collection_archive---------7-----------------------

这是另一个与众不同的问题,一个你在教科书上找不到的问题。你可以用数据科学的方法来解决它(我的方法),但是有一些空闲时间的数学家可以找到一个优雅的解决方案。与你的同事或你的学生分享,看看他们对数学有多精通。虽然我还没有找到最终的解决方案(也许你会找到),但我能够在单独使用 Excel 的 1-2 个小时的工作中取得实质性的进展。)我的包含所有计算的 Excel 电子表格可以从本文中获得。你不需要很深的统计学背景就能很快发现一些有趣的结果。从初学者到老手的计算机科学家、软件工程师、quants、BI 和分析专家也将能够享受它!

问题

我们正在处理一个随机过程,它比随机漫步复杂不了多少。随机漫步也被称为醉酒漫步,因为它们代表了一个喝醉的家伙看似随机地左右移动,并随着时间的推移而迷失的路径。这里的过程是一个自校正随机行走,也称为受控随机行走,在这个意义上,与随机行走相比,醉酒程度较低的行走者能够越来越多地校正任何偏离直线路径的情况,随着时间的推移,在每一步都略微过度或不足校正。其中一个模型参数(正参数 a )代表步行者的醉酒程度,其中 a = 0 为最差。除非 a = 0,否则校正的幅度会随着时间的推移而减小,直到最终(在许多步之后)行走者几乎直线行走并到达其目的地。该模型代表了许多物理过程,例如,在某种程度上由政府控制以避免泡沫和内爆的股票市场的行为,其定义如下:

先从 X (1) = 0 开始,递归定义 X ( k )如下,对于 k > 1:

要阅读全文和初步解决方案,请点击此处

物联网蓬勃发展 15 万亿市场

原文:https://towardsdatascience.com/internet-of-things-booming-15-trillion-market-88fde1da2113?source=collection_archive---------12-----------------------

物联网、人工智能和区块链等智能技术具有颠覆性的前景。这对市场意味着什么?

物联网是区块链、人工智能和智能技术中蓬勃发展的技术之一。新的令人兴奋的解决方案正以越来越快的速度出现,旨在解决我们这个时代的问题,如气候变化,以及缓解地球上的日常生活。

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

在开始讨论物联网之前,我们先来看看区块链、加密货币和人工智能市场。技术的结合带来了颠覆性的希望。颠覆三重奏。

T2 的加密货币 T3 市场去年蓬勃发展。在今年的下跌趋势之前,它已经接近 1 万亿美元,这导致加密货币市场下降到 2000 亿美元。尽管大幅下跌超过 70%,加密货币市场仍比去年的最低水平高出 5 倍。

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

随着首次发行硬币,区块链行业的规模不断增长,ICO 从市场上筹集了数百万美元的资金。与去年的 60 亿美元相比,今年总共筹集了 200 亿美元

世界经济论坛估计,到 2027 年,全球 GDB 100 万亿美元中,将有 10 万亿美元来自与区块链相关的技术。

人工智能 AI 正在让机器像人类一样工作,这最终将把人们从日常工作中解放出来,从事更具生产力和创造性的工作。通过提供答案和完成简单的操作,AI 已经在让我们的日常生活变得更加简单。你需要记住,机器仍然会保持逻辑,这使得它们如此令人敬畏。人类也将在未来完成创造性的任务。它需要我们训练创造力和想象力。

人工智能市场

人工智能即将创造超过 1000 亿美元的收入。

此外,麦肯锡预测,到 2025 年,人工智能将在 19 个行业的 9 项业务职能中每年创造 3.5 至 5.8 万亿美元的收入。

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

物联网

凯文·阿什顿(Kevin Ashton)有一句名言,他将物联网概念化,被许多人誉为物联网之父:

“如果我们有知道所有事情的计算机——在没有我们任何帮助的情况下使用它们收集的数据——我们将能够跟踪和计算所有事情,并大大减少浪费、损失和成本。我们会知道什么时候东西需要更换、修理或召回,它们是新鲜的还是已经过了最佳状态。我们需要让计算机拥有自己收集信息的手段,这样它们就可以自己看到、听到和闻到这个世界的所有随机荣耀。RFID 和传感器技术使计算机能够观察、识别和理解世界,而不受人类输入数据的限制。”—物联网之父凯文·阿什顿

我们每天都离阿什顿的梦想越来越近。物联网设备的数量正以前所未有的速度增长。汽车、衣服、手表等等都与互联网相连。据统计数据显示,到 2025 年,物联网设备将超过 700 亿台。(下图)

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

我们可以看到来自 IBM、微软、英特尔、甲骨文等大公司的物联网解决方案的不断发展……新的创新解决方案正在获得宣传,并已经解决了我们在日常生活中面临的实际问题。物联网与其他智能技术相结合,将在拯救我们的星球和建设地球可持续性方面发挥重要作用。因此,物联网市场正在经历高速增长,并吸引了大量投资。每年有近 1000 亿美元流向物联网市场,预计到 2020 年,物联网公司的年收入将超过 4500 亿美元(贝恩

以下是贝恩公司对不同行业年收入的划分:

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

幸运的是,当我们看到物联网的市场潜力时,这些投资有望带来一些高回报。

根据麦肯锡的报告,到 2025 年,通过连接物理世界和数字世界,每年可以产生 11.1 万亿美元的收入。与全球 100 万亿美元的 GDP 相比,这是一个相当大的数字。此外,根据商业内幕情报报告物联网 2018 ,到 2025 年可能会有近 15 万亿的物联网总投资。

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

物联网支出也在增长。这份名为 的半年度全球物联网支出指南 的报告估计,到 2021 年,支出将每年增长 1 万亿美元。

令人印象深刻的数字,但我们已经看到来自大公司和新创业公司的创新。解决现实生活问题并为所有人提供舒适生活的解决方案。

孟买的实习:事实与数据

原文:https://towardsdatascience.com/internships-in-mumbai-facts-and-figures-34064ac7d1c7?source=collection_archive---------1-----------------------

在过去的几个月里,我已经养成了通过各种方式获取数据的习惯,并试图从中找出规律或任何有用的见解。我的一次恶作剧是寻找实习数据,在一个风雨交加的圣诞节,我把这些数据拆开,试图找到可能对我或任何涉足企业界的用户有用的信息。

先说数据集。该数据集包含孟买市的 894 个实习机会,范围从全职职位到几周的短期工作。该数据集包含以下特征:

1.标题

2.组织

3.持续时间

4.定期津贴

5.组织详细信息

6.实习详情

至于是怎么获得的。我只能说它包括一个相当漂亮的图书馆。

调查结果:

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

我试图回答的第一个问题是找出支付给实习生的平均工资。这是一个小问题,因为它涉及到将每周和每件产品的销售额转换为每月付款。但是一旦这样做了,就很容易发现平均实习月薪是 卢比。6655

有趣的是,实习工资最高是 卢比。联邦快递的一个网络开发职位 3 万英镑。数据科学在薪酬方面排名第四,薪酬为 11 卢比。25000想分析

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

除了薪水,我也很好奇什么职位有最大的机会。这个结果并不令人惊讶。业务发展(又称销售)的机会最多,为 192 个。紧随其后的是社交媒体营销,81。平面设计、内容写作和人力资源也相当受欢迎。尽管 Web 开发比移动应用程序开发有更多的机会。数据录入的机会最少。

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

数据集包含 694 个唯一的雇主 。在 694 个机会中,计划我的健康机会最多(9)。他们的机会涵盖了相当广泛的范围,从营养师/营养学家到法律/法律职位。紧随他们之后的是股权风险金融公司,他们也有很多机会,包括网络开发、商业联盟和其他职位,如内容写作。有趣的是,一般来说,机会最多的地方都是初创企业。

撇开薪水、角色和公司类型不谈,实习求职者脑海中闪现的下一个问题是承诺。数据集中的大多数机会寻求 2-3 个月的最低承诺。

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

实习期限

我还试图找出组织喜欢使用的“流行语”。因此,在对每个实习描述进行分词和词干化之后,我开始根据 tf-idf 分数提取关键词。现在这种方法并不完美,在每次机会提取的 20 多个关键词中有一些噪音,但它确实非常接近。此外,由于输入源的标准化语言的性质,结果也偏向某些单词。

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

Internship Buzzwords

这篇文章仅仅是一些探索性的数据分析,可以帮助一些大学生更好地规划他们的实习和获得高价值技能的方法。当我想到新的问题来询问数据或者当我得到新的数据时,我打算更新这篇文章。请随意分享这篇文章,这样更多的人可以了解这些趋势,并可能从他们的实习经历中获得更多。此外,如果你有任何问题,请在评论中留下,我会尽我所能用我掌握的数据来回答。

解释机器学习模型

原文:https://towardsdatascience.com/interpretability-in-machine-learning-70c30694a05f?source=collection_archive---------2-----------------------

不管您的数据科学解决方案的最终目标是什么,最终用户总是更喜欢可解释和可理解的解决方案。此外,作为一名数据科学家,您将始终受益于模型的可解释性,以验证和改进您的工作。在这篇博文中,我试图解释可解释性在机器学习中的重要性,并讨论一些简单的动作和框架,你可以自己进行实验。

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

xkcd on Machine Learning

为什么机器学习中的可解释性很重要?

在传统统计学中,我们通过调查大量数据来构建和验证假设。我们建立模型来构建规则,这些规则可以整合到我们的心理过程模型中。例如,一家营销公司可以建立一个将营销活动数据与财务数据相关联的模型,以确定什么构成了有效的营销活动。这是一种自上而下的数据科学方法,可解释性是关键,因为它是所定义的规则和流程的基石。因为相关性通常不等于因果性,所以在做出决策和解释决策时,需要对模型有充分的理解。

在自下而上的数据科学方法中,我们将部分业务流程委托给机器学习模型。此外,机器学习使全新的商业理念成为可能。自下而上的数据科学通常对应于手工和费力任务的自动化。例如,制造企业可以在机器上安装传感器,并进行预测性维护。因此,维护工程师可以更高效地工作,并且不需要执行昂贵的定期检查。模型的可解释性对于验证模型所做的事情是否符合您的期望是必要的,它允许与用户建立信任,并简化从手工到自动化过程的转换。

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

In a top-down process, you iteratively construct and validate a set of hypotheses. In a bottom-up approach, you attempt to automate a process by solving a problem from the bottom-up.

作为一名数据科学家,您通常关心微调模型以获得最佳性能。数据科学通常被框定为:“给定带有标签 y 的数据 X,找出误差最小的模型”。虽然训练性能模型的能力对于数据科学家来说是一项关键技能,但能够放眼全局也很重要。数据和机器学习模型的可解释性是数据科学管道实际“有用性”的关键方面之一,它确保模型与您想要解决的问题保持一致。虽然在构建模型时很容易迷失自己,但能够正确解释您的发现是数据科学过程中必不可少的一部分。

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

Interpreting models is necessary to verify the usefulness of the model predictions.

为什么对你的模型进行深入分析是必要的?

作为一名数据科学家,关注模型可解释性有几个原因。尽管这两者之间有重叠,但它们抓住了可解释性的不同动机:

识别并减少偏见。

任何数据集中都可能存在偏差,这取决于数据科学家如何识别并尝试解决它。数据集的大小有限,可能无法代表全部人口,或者数据采集过程可能没有考虑潜在的偏差。偏差通常只有在彻底的数据分析之后或者当模型预测和模型输入之间的关系被分析时才变得明显。如果你想了解更多不同类型的偏见,我强烈推荐下面的视频。请注意,解决偏见没有单一的解决方案,但意识到潜在的偏见是实现可解释性的关键一步。

偏见的其他例子如下:

例如,word2vec 向量包含性别偏见,这是由于它们被训练的语料库中存在固有偏见。当你用这些单词嵌入来训练一个模型时,搜索“技术简介”的招聘人员会把女性简历放在最下面。

例如,当您在小型手动创建的数据集上训练对象检测模型时,通常情况是图像的宽度太有限。需要不同环境、不同闪电条件和不同角度下的各种物体图像,以避免模型只适合数据中的噪声和不重要的元素。

说明问题的背景。

在大多数问题中,您使用的数据集只是您试图解决的问题的粗略表示,而机器学习模型通常无法捕捉真实任务的全部复杂性。可解释的模型有助于您理解和考虑模型中包含(不包含)的因素,并在根据模型预测采取措施时考虑问题的背景。

提高通用性和性能。

高的可解释性通常会导致模型更好地概括。可解释性不是理解模型中所有数据点的每一个细节。扎实的数据、模型和对问题的理解的结合对于拥有一个表现更好的解决方案是必要的。

道德和法律原因。

在金融和医疗保健等行业,审计决策过程并确保其没有歧视或违反任何法律是至关重要的。随着 GDPR 等数据和隐私保护法规的兴起,可解释性变得更加重要。此外,在医疗应用或无人驾驶汽车中,一个不正确的预测就会产生重大影响,因此能够“验证”该模型至关重要。因此,系统应该能够解释它是如何得出给定建议的。

解读你的模型

关于模型可解释性的一个常见说法是,随着模型复杂性的增加,模型可解释性下降的速度至少也一样快。特征重要性是解释模型的一个基本(通常是免费的)方法。即使对于深度学习等黑盒模型,也存在提高可解释性的技术。最后,将讨论作为模型分析工具箱的 LIME 框架。

特征重要性

  • 广义线性模型

广义线性模型( GLM 的)都基于以下原则:
如果你将你的特征 x 与模型权重 w 进行线性组合,并通过挤压函数 f 输入结果,你就可以用它来预测各种各样的反应变量。GLM 最常见的应用是回归(线性回归)、分类(逻辑回归)或泊松过程建模(泊松回归)。训练后获得的权重是特征重要性的直接代表,并且它们提供了模型内部的非常具体的解释。

例如,在构建文本分类器时,您可以绘制最重要的特征,并验证模型是否过度拟合噪声。如果最重要的词不符合您的直觉(例如,名称或停用词),这可能意味着模型适合数据集中的噪声,并且它不会在新数据上表现良好。

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

An example of a neat visualisation for text interpretability purposes from TidyTextMining.

  • 兰登森林和 SVM 的

甚至诸如基于树的模型(例如随机森林)的非线性模型也允许获得关于特征重要性的信息。在随机森林中,在训练模型时,特征重要性是免费的,因此这是验证初始假设和识别模型正在学习“什么”的一种很好的方式。基于核的方法中的权重,例如 SVM 的,通常不是特征重要性的很好的代理。核方法的优势在于,您可以通过将特征投影到核空间来捕捉变量之间的非线性关系。另一方面,仅仅把权重看做特征重要性并不能公正地对待特征交互。

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

By looking at the feature importance, you can identify what the model is learning. As a lot of importance in this model is put into time of the day, it might be worthwhile to incorporate additional time-based features. (Kaggle)

  • 深度学习

由于参数的剪切数量以及提取和组合特征的复杂方法,深度学习模型因其不可解释性而臭名昭著。由于这类模型能够在许多任务中获得最先进的性能,许多研究都集中在将模型预测与输入联系起来。

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

The amount of research on interpretable machine learning is growing rapidly (MIT).

特别是当转向处理文本和图像数据的更复杂的系统时,很难解释模型实际上在学习什么。目前研究的主要焦点主要是将输出或预测与输入数据联系和关联起来。虽然这在线性模型的背景下相当容易,但对于深度学习网络来说,这仍然是一个未解决的问题。两种主要的方法是基于梯度或基于注意力。

-在基于梯度的方法中,在反向过程中计算的目标概念的梯度被用于产生一个映射,该映射突出了用于预测目标概念的输入中的重要区域。这通常应用于计算机视觉的环境中。

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

Grad-CAM, a gradient-based method is used in visual caption generation. Based on the output caption, the method determines which regions in the input image were important.

-基于注意力的方法通常用于顺序数据(如文本数据)。除了网络的正常权重,注意力权重被训练为“输入门”。这些注意力权重决定了每个不同元素在最终网络输出中的比重。除了可解释性之外,在例如基于文本的问答环境中的注意力也导致更好的结果,因为网络能够“聚焦”它的注意力。

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

In question answering with attention, it is possible to indicate which words in the text are most important to determine the answer on a question.

石灰

Lime 是一个更通用的框架,旨在使“任何”机器学习模型的预测更具可解释性。

为了保持与模型无关,LIME 通过局部修改模型的输入来工作。因此,不是试图同时理解整个模型,而是修改特定的输入实例,并监控对预测的影响。在文本分类的上下文中,这意味着一些单词例如被替换,以确定输入的哪些元素影响预测。

如果你对机器学习的可解释性有任何问题,我很乐意在评论中阅读。如果你想收到我博客的更新,请在 MediumTwitter 上关注我!

使用 XGBoost 的可解释机器学习

原文:https://towardsdatascience.com/interpretable-machine-learning-with-xgboost-9ec80d148d27?source=collection_archive---------0-----------------------

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

模型可解释性

这是一个关于错误解释你的机器学习模型的危险,以及正确解释它的价值的故事。如果您发现集合树模型(如梯度推进机器或随机森林)的稳健准确性很有吸引力,但也需要解释它们,那么我希望您会发现这是有益的。

假设我们的任务是为一家银行预测一个人的财务状况。我们的模型越准确,银行赚的钱就越多,但是由于这种预测用于贷款申请,我们也需要在法律上对为什么做出预测做出解释。在对几种模型类型进行实验后,我们发现 XGBoost 中实现的梯度提升树具有最好的准确性。不幸的是,解释 XGBoost 为什么做出预测似乎很难,所以我们只能选择退回到线性模型,或者弄清楚如何解释我们的 XGBoost 模型。没有数据科学家愿意放弃准确性…所以我们决定尝试后者,并解释复杂的 XGBoost 模型(恰好有 1,247 棵深度为 6 的树)。

经典的全球特征重要性度量

第一个显而易见的选择是在 Python XGBoost 接口中使用 plot_importance()方法。它给出了一个非常简单的条形图,代表了我们数据集中每个特性的重要性:(复制这篇文章的代码在 Jupyter 笔记本中)

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

Results of running xgboost.plot_importance(model) for a model trained to predict if people will report over $50k of income from the classic “adult” census dataset (using a logistic loss).

如果我们查看 XGBoost 返回的特征重要性,我们会发现年龄支配着其他特征,显然是收入的最重要预测因素。我们可以在这里停下来,向我们的经理报告直观上令人满意的答案:年龄是最重要的特征,其次是每周工作时间和受教育程度。但是作为优秀的数据科学家……我们看了一下文档,发现在 XGBoost 中有三个度量特性重要性的选项:

  1. **体重。**一个特征被用于跨所有树分割数据的次数。
  2. **封面。**使用某个特征在所有树之间分割数据的次数,这些树由经过这些分割的训练数据点的数量加权。
  3. **增益。**使用特征进行分割时获得的平均训练损失减少量。

这些是我们可能在任何基于树的建模包中找到的典型的重要性度量。重量是默认选项,因此我们决定尝试其他两种方法,看看它们是否有所不同:

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

Results of running xgboost.plot_importance with both importance_type=”cover” and importance_type=”gain”.

令我们沮丧的是,我们发现 XGBoost 提供的三个选项中的每一个的特性重要性排序都非常不同!对于覆盖法来说,资本收益特征似乎是最能预测收入的,而对于收益法来说,关系状态特征支配了所有其他特征。这应该会让我们在不知道哪种方法是最好的情况下,依赖这些方法来报告特性重要性时感到非常不舒服。

是什么决定了特性重要性的好坏?

如何比较一种特征归属方法和另一种特征归属方法并不明显。我们可以测量每种方法在数据清理、偏差检测等任务上的最终用户性能。但是这些任务只是对特征归属方法质量的间接测量。这里,我们将定义两个我们认为任何好的特征归属方法都应该遵循的属性:

  1. **一致性。**每当我们改变一个模型,使它更加依赖于一个特性,那么这个特性的重要性就不会降低。
  2. **准确度。**所有特征重要性的总和应等于模型的总重要性。(例如,如果重要性是通过 R 值来衡量的,那么每个特征的属性总和应该是整个模型的 R 值)

如果一致性不成立,那么我们不能比较任何两个模型之间的属性特征重要性,因为然后 具有更高的分配属性并不意味着模型实际上更依赖于那个特征

如果准确性不成立,那么我们不知道每个特征的属性如何组合来表示整个模型的输出。我们不能在方法完成后就规范化属性,因为这可能会破坏方法的一致性。

当前的归因方法是否一致和准确?

回到我们作为银行数据科学家的工作…我们意识到一致性和准确性对我们很重要。事实上,如果一个方法不一致,我们不能保证具有最高属性的特性实际上是最重要的。因此,我们决定使用两个非常简单的树模型来检查每种方法的一致性,这两个树模型与我们在银行的任务无关:

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

Simple tree models over two features. Cough is clearly more important in model B than model A.

模型的输出是基于个人症状的风险评分。模型 A 只是二元特征发烧咳嗽的简单“与”函数。模型 B 具有相同的功能,但是每当咳嗽为是时,具有+10。为了检查一致性,我们必须定义“重要性”。这里我们将从两个方面定义重要性:1)当我们删除一组特征时,模型的预期精度T21 的变化。2)当我们移除一组特征时,模型的预期输出的变化。

重要性的第一个定义度量了特征对模型的全局影响。而第二个定义测量特征对单个预测的个性化影响。在我们的简单树模型中,咳嗽特征在模型 B 中显然更重要,当发烧咳嗽都为是时,对于全球重要性和个体预测的重要性都是如此。

上面的权重覆盖增益方法都是全局特征归属方法。但是,当我们在银行部署我们的模型时,我们还需要为每个客户提供个性化的解释。为了检查一致性,我们在简单的树模型上运行了五种不同的特征归属方法:

  1. **树 SHAP。**我们提出了一种新的个性化方法。
  2. **萨巴斯。**一种个性化启发式特征归因方法。
  3. **意思是(|树 SHAP|)。**基于个体化树 SHAP 属性平均大小的全局属性方法。
  4. **增益。**与上述 XGBoost 中使用的方法相同,也等同于 scikit-learn 树模型中使用的基尼系数。
  5. **拆分计数。**表示 XGBoost 中密切相关的“权重”和“覆盖”方法,但使用“权重”方法进行计算。
  6. **排列。**当单个特征在测试数据集中被随机置换时,模型精度的下降。

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

Feature attributions for model A and model B using six different methods. As far we can tell, these methods represent all the tree-specific feature attribution methods in the literature.

**之前除了特征置换的方法都不一致!**这是因为与模型 a 相比,它们在模型 B 中对咳嗽的重视程度较低。不一致的方法无法正确地对最有影响的特征给予更多的重视。敏锐的读者会注意到,这种不一致性早在我们研究的经典特征归因方法在同一模型上相互矛盾时就已经出现了。精度属性呢?事实证明,树 SHAP、Sabaas 和 Gain 都与前面定义的一样准确,而特征置换和分裂计数则不准确。

或许令人惊讶的是,像 gain(基尼系数)这样广泛使用的方法会导致如此明显的不一致结果。为了更好地理解为什么会发生这种情况,我们来看看模型 A 和模型 b 的增益是如何计算的。为了简单起见,我们假设数据集的 25%落在每个叶中,并且每个模型的数据集都有与模型输出完全匹配的标签。

如果我们将均方误差(MSE)视为我们的损失函数,那么在模型 a 中进行任何分割之前,我们从 1200 的 MSE 开始,这是来自 20 的恒定均值预测的误差。在模型 A 中拆分了发烧之后,MSE 下降到 800,因此 gain 方法将这 400 的下降归因于发烧特性。在咳嗽特征上再次分裂导致 MSE 为 0,增益方法将这 800 的下降归因于咳嗽特征。在模型 B 中,同样的过程导致发烧特征的重要性为 800,咳嗽特征的重要性为 625:

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

Computation of the gain (aka. Gini importance) scores for model A and model B.

通常,我们认为靠近树根的特征比靠近树叶的特征更重要(因为树是贪婪地构建的)。然而,增益方法偏向于将更多的重要性归于较低的分裂。这种偏见导致了不一致,当咳嗽变得更重要时(因此它在根上分裂了),它的归属重要性实际上下降了。个性化的 Saabas 方法(由 treeinterpreter 包使用)在我们沿着树向下时计算预测的差异,因此它也遭受了同样的偏向于树中较低位置的分裂。随着树木越来越深,这种偏见只会越来越大。相比之下,树 SHAP 方法在数学上等同于对所有可能的特征排序的预测差异进行平均,而不仅仅是由它们在树中的位置指定的排序。

这不是一个巧合,只有树 SHAP 是一致和准确的。假设我们想要一个既一致又准确的方法,那么只有一种方法来分配特性的重要性。详细内容在我们最近的 NIPS 论文中,但总结是,来自博弈论的关于利润公平分配的证明导致了机器学习中特征归属方法的唯一性结果。这些独特的值被称为 Shapley 值,以 Lloyd Shapley 在 20 世纪 50 年代得出的值命名。我们这里使用的 SHAP 值是与 Shapley 值相关的几种个性化模型解释方法的统一。树 SHAP 是一种快速算法,可以在多项式时间内准确计算树的 SHAP 值,而不是传统的指数运行时间(见 arXiv )。

自信地诠释我们的模型

坚实的理论证明和快速实用的算法相结合,使 SHAP 价值观成为一个强有力的工具,自信地解释树木模型,如 XGBoost 的梯度推进机。有了这个新方法,我们回到解释我们的银行 XGBoost 模型的任务:

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

The global mean(|Tree SHAP|) method applied to the income prediction model. The x-axis is essentially the average magnitude change in model output when a feature is “hidden” from the model (for this model the output has log-odds units). See papers for details, but “hidden” means integrating the variable out of the model. Since the impact of hiding a feature changes depending on what other features are also hidden, Shapley values are used to enforce consistency and accuracy.

我们可以看到,关系特征实际上是最重要的,其次是年龄特征。由于 SHAP 值保证了一致性,我们不需要担心在使用增益或分割计数方法之前发现的矛盾。然而,由于我们现在对每个人都有个性化的解释,我们可以做的不仅仅是做一个条形图。我们可以为数据集中的每个客户绘制特征重要性图。 shap Python 包让这变得简单。我们先叫 shap。TreeExplainer(模型)。shap_values(X)来解释每个预测,然后调用 shap.summary_plot(shap_values,X)来绘制这些解释:

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

Every customer has one dot on each row. The x position of the dot is the impact of that feature on the model’s prediction for the customer, and the color of the dot represents the value of that feature for the customer. Dots that don’t fit on the row pile up to show density (there are 32,561 customers in this example). Since the XGBoost model has a logistic loss the x-axis has units of log-odds (Tree SHAP explains the change in the margin output of the model).

这些特征按平均值(| SHAP 树|)排序,因此我们再次将关系特征视为年收入超过 5 万美元的最强预测因素。通过绘制特征对每个样本的影响,我们还可以看到重要的异常影响。例如,虽然资本收益在全球范围内并不是最重要的特征,但对一部分客户来说却是最重要的特征。按特征值着色向我们展示了一些模式,比如年轻会降低你挣 5 万美元以上的机会,而高等教育会增加你挣 5 万美元以上的机会。

我们可以在这里停下来向我们的老板展示这个图,但是让我们更深入地挖掘其中的一些特性。对于年龄特征,我们可以通过绘制年龄 SHAP 值(对数几率的变化)与年龄特征值的关系来实现:

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

The y-axis is how much the age feature changes the log odds of making over $50K annually. The x-axis is the age of the customer. Each dot represents a single customer from the data set.

在这里,我们看到了年龄对收入潜力的明显影响,正如 XGBoost 模型所捕捉到的那样。请注意,与传统的部分相关图(显示更改特征值时的平均模型输出)不同,这些 SHAP 相关图显示了交互影响。尽管数据集中的许多人都是 20 岁,但是他们的年龄对他们预测的影响程度是不同的,正如 20 岁时点的垂直分布所示。这意味着其他特征正在影响年龄的重要性。为了了解这种影响的部分特征,我们用受教育的年数来给这些点着色,结果发现,在 20 多岁时,高教育水平会降低年龄的影响,但在 30 多岁时会提高这种影响:

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

The y-axis is how much the age feature changes the log odds of making over $50K annually. The x-axis is the age of the customer. Education-Num is the number of years of education the customer has completed.

如果我们绘制另一张每周工作小时数的依赖关系图,我们会看到,每周工作 50 小时左右会有更多的好处,如果你已婚,额外工作不太可能意味着高收入:

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

Hours worked per week vs. the impact of the number of hours worked on earning potential.

解释你自己的模型

这个简单的演练旨在反映您在设计和部署自己的模型时可能会经历的过程。 shap 包很容易通过 pip 安装,我们希望它能帮助你满怀信心地探索你的模型。它包含了比本文更多的内容,包括 SHAP 相互作用值,模型不可知的 SHAP 值估计,以及其他可视化。笔记本可以在各种有趣的数据集上展示所有这些特征。例如,你可以在一个解释 XGBoost 死亡率模型的笔记本中,根据你的健康检查,找出你将死的主要原因。对于 Python 以外的语言,树 SHAP 也被直接合并到核心的 XGBoost 和 LightGBM 包中。

具有附加模型的可解释 ML

原文:https://towardsdatascience.com/interpretable-ml-with-additive-models-a3a4100643cc?source=collection_archive---------6-----------------------

今年早些时候,我去听了微软研究院 Rich Caruana 的精彩演讲,他讲述了如何为医学应用构建可解释的 ML 模型。作为可解释 ML 的支持者,Rich Caruana 去年在 NIPS 与 Yann LeCun 在进行了一场激烈的辩论。这里我总结一下他的想法,并给出自己的解读。

主要的想法是,我们可以建立一个人类可解释的 ML 模型,通过使它与明确指定的交互相加。那么什么是加法模型呢?想想好的旧回归模型。在简单的回归模型中,一个变量的影响不依赖于其他变量,它们的影响加起来就是总的影响。如果我们能够单独理解每个变量或者稍微理解一下**,我们就能够解释整个模型。然而,在存在相互作用的情况下,这将不再是真实的。**

两个变量之间的相互作用是指两个变量的影响相互依赖。交互会使模型更难解释。即使我们理解了每个变量是如何改变模型预测的,当几个变量发生变化时,我们仍然无法计算出模型预测。就像有几种有益的药物,结合起来就变成了毒药。当有许多变量和许多相互作用时,就不可能解开变量的影响。

这正是大多数 ML 车型的问题所在。在决策树中,我们可以先用一个变量分裂分支,然后再用另一个变量分裂;这实质上是创造互动。我们可以通过跟随分裂来解释一个小的决策树,但是当树变得更大或者形成一个随机的森林时,这很容易变成一个痛苦。在多层神经网络中,由于每个隐藏单元是输入的非线性组合,因此当通过隐藏层传播时,会隐式地创建交互。

我们可以通过允许每个变量具有更灵活但仍有附加效应来使简单的回归模型更强大。我们不会假设每个变量都有线性效应,而是用任意函数 f 来建模变量的边际效应,为了保持模型的可解释性,我们将显式地添加交互作用;同样,每个交互都可能产生任意效果。

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

这不是一个全新的想法,因为它显然类似于广义加法模型。然而,在 GAMs 中,平滑样条通常用于 f在论文中,里奇·卡鲁阿纳增加了一个更 ML 的转折;函数 f 用随机森林建模(针对每个变量)。我认为高斯过程可能同样有效,如果不是更好的话;尽管实际上随机森林更方便。

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

我们可以通过查看每个变量的边际效应来解释模型。代替读取回归模型系数,模型预测如何作为感兴趣变量的函数而变化的图明确地讲述了一个相当完整的故事。正如我们在上面看到的,呼吸率似乎在 30 到 60 之间有很强的正效应,这种效应在 30 之前不会出现,在 60 以上就会减弱。如果我们有一个简单的回归模型,估计的影响在整个范围内会是适度的正的和线性的。通过更好地模拟每个变量的边际效应,我们可以得到一个更准确的模型。其实这个模型和其他黑箱 ML 模型一样好。

最后一部分是我对此的看法。为了更好地模拟边际效应,另一种方法是变量转换或“特征工程”,这是本书中最古老的技巧。根据我的经验,当处理偏斜变量时,标准的预处理方法通常不会很好地工作;而用他们训练出来的 ML 模型会很差。百分点转换可以解决这一问题,因为它强制每个变量不偏不倚,并且在同一尺度上。为了解释这个模型,我们可以像 Rich Caruana 一样进行反向转换(反向百分位数)并绘制边际效应。

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

例如,感兴趣的变量是谷歌对本地企业的评级,这在整体上是高度倾斜的,并且在不同的企业类型之间是不同的。直接使用原始评级不会产生好的模型。在执行百分位数转换后,我们可以更好地捕捉在谷歌搜索中被推荐的概率的边际效应。当评分较低时(0 到 3),几乎没有任何影响。但当评分高于 3 时,随着评分的增加,这种影响实际上会稍大一些。这个结果是有道理的,因为谷歌可能永远不会推荐二星级的企业;在评级较高的企业中,0.1 的增长将产生平局打破效应。

归根结底,所有的模型都是错的。很难说变量应该总是有累加效应。但是实践中的大多数 ML 模型都是由人类使用或为人类使用的。重要的是我们能够理解 ML 模型。假设可加性和更好地模拟边际效应肯定会给我们更多可解释的模型。

可解释神经网络

原文:https://towardsdatascience.com/interpretable-neural-networks-45ac8aa91411?source=collection_archive---------3-----------------------

解释黑盒模型是机器学习中的一个重大挑战,可以显著减少采用该技术的障碍。

之前的一篇文章中,我讨论了使用形状值解释复杂的机器学习模型。总而言之,对于特定的特征,当模型可以看到该特征时和当它不能看到该特征时,会比较模型对于特定数据点的预测,这种差异的大小告诉我们该特征对于模型的预测有多重要。

在下面的例子中,我们建立了一个模型来预测某人是否想要冰淇淋,它由三个特征组成:他们是否喜欢冷食,他们现在所处的季节以及他们是否喜欢甜食。Shap 值允许我们解释单个数据点的模型输出—在本例中,对于 Bob:

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

Inspired by the diagrams in the shap values paper

这个冰淇淋模型有两点需要注意:首先,当模型看不到特征时,特征的效果与模型预测的基线进行比较。其次,特征重要性的总和(红色和蓝色箭头)是该基线和 Bob 的模型实际预测之间的差异。

不幸的是,虽然某些机器学习算法(如 XGBoost)可以处理空特征值(即看不到某个特征),但神经网络不能,因此需要一种略有不同的方法来解释它们。迄今为止,最常见的方法是考虑输入相对于预测的梯度。

在这篇文章中,我将讲述使用这些渐变背后的直觉,以及由此产生的两种具体技术:集成渐变和深度提升。

使用梯度解释神经网络

可能最难解释的模型——也是我们将用作灵感的模型——是回归。在一个回归中,每个特征 x 被分配一个权重 w ,这直接告诉我该特征对模型的重要性。

具体来说,对于特定数据点的第 i 个特征,该特征对模型输出的贡献为

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

这个重量 w 代表什么?因为回归是

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

然后

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

换句话说,分配给第 i 个特征的权重告诉我们该特征相对于模型预测的梯度:模型的预测如何随着特征的改变而改变。

方便的是,这个梯度对于神经网络来说很容易计算。因此,与回归一样,一个特性的贡献是

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

,也许梯度可以用来解释神经网络的输出。

在尝试使用这种方法时,我们会遇到两个问题:

首先,特性的重要性是相对的。对于梯度增强决策树,特征的 shap 值告诉我,相对于没有看到该特征的模型,特征如何改变模型的预测。由于神经网络不能处理空输入特征,我们需要重新定义一个特征相对于其他东西的影响。

为了克服这一点,我们将定义一个新的基线:我的输入与什么进行比较?一个例子是 MNIST 数字数据集。因为所有的数字都是白色的,背景是黑色的,所以一个合理的背景应该是全黑的图像,因为这不代表关于数字的任何信息。

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

Some MNIST digit examples, and a reasonable baseline for them

为其他数据集选择背景要简单得多——例如, ImageNet 数据集的背景应该是什么?我们稍后将讨论这个问题的解决方案,但是现在让我们假设我们可以为每个数据集找到一个基线。

第二个问题是,使用输出相对于输入的梯度对于线性模型(如回归)很有效,但对于非线性模型则很快失效。为了了解原因,让我们考虑一个仅由一个 ReLU 激活组成的“神经网络”,其基线输入为 x=2

现在,让我们考虑第二个数据点,在 x = -2

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

ReLU(x=2) = 2 ,而 ReLU(x=-2) = 0 ,所以我的输入特征 x = -2 相对于基线改变了我的模型的输出 2。我的模型输出的这种变化必须归因于 x 的变化,因为它是这个模型的唯一输入特征,但是 ReLU(x)在点 x = -2 的梯度是 0!这告诉我 x 对产出的贡献是 0,这显然是一个矛盾。

出现这种情况有两个原因:首先,我们关心函数中的一个有限差(当 x = 2 时的函数和当 x = -2 时的函数之差),但是梯度计算的是无穷小的差。其次,ReLU 函数可能会饱和——一旦 x 小于 0,它变小多少都无关紧要,因为该函数只会输出 0。正如我们在上面看到的,这导致了不一致的模型解释,其中输出相对于基线发生了变化,但是没有特征被标记为引起了这种变化。

这些不一致正是 Integrated Gradients 和 DeepLIFT 试图解决的问题。他们都认识到,最终,我们关心的不是点 x 的梯度。我们关心当输入从基线改变时,输出如何从基线改变*。*

集成渐变

积分梯度所采用的方法是提出以下问题:我可以计算什么,它类似于也承认基线存在的梯度?

部分问题在于基线处的梯度(相对于输入的输出)将不同于我测量的输出处的梯度;理想情况下,我会考虑两点的梯度。但是这还不够:考虑一个 sigmoid 函数,其中我的基线输出接近 0,我的目标输出接近 1:

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

这里,我的基线和数据点的梯度都接近于 0。事实上,所有有趣的——也是信息丰富的——梯度都在两个数据点之间,所以理想情况下,我们也会找到一种方法来捕捉所有这些信息。

这正是积分梯度所做的,通过计算基线和感兴趣点之间的梯度积分。实际上,计算梯度的积分是很难的,因此,相反,它们是使用赖曼和来近似的:梯度是在基线和感兴趣的点之间的许多小步长上获得的。

这非常容易实现——事实上,Integrated Gradients 的作者在他们的 ICML 演讲中演示了一个七行代码的实现:

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

然而,缺点是,由于我们是在近似一个积分,我们的解释也将是一个近似。此外,这种方法非常耗时;理想情况下,我们的 Reimann 和中的步长较小,因此我们可以非常接近积分,但每一步都需要网络的反向传递。

深层提升

采用的方法 DeepLIFT 在概念上非常简单,但实现起来很棘手。DeepLIFT 认识到我们关心的不是梯度,它描述了在点xT15 处 y 如何随着 x 改变而改变,而是斜率,它描述了 y 如何随着 x 与基线不同而改变。

事实上,如果我们考虑斜率而不是梯度,那么我们可以将特征的重要性重新定义为

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

这是很好的动机,因为我们关心与基线相关的一切。将此应用于我们的网络:

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

这个方法告诉我们,输入 x 的重要性值为-2。或者,换句话说:“与基线相比,输入 x = -2 改变了模型的输出-2”。既然事实如此,这种方法就很有意义。

现在,对于每一层,我将计算斜率而不是梯度,其中

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

Note that the inputs and outputs here are of a certain operation — so here, y and x are the outputs and inputs of (for instance) a certain layer in the network.

DeepLIFT 将这个斜率称为“乘数”,并将其象征性地表示为 m 。既然我们已经将梯度重新定义为一个乘数,正常的链式法则(因此也是反向传播法则)就适用了,但是一切都是相对于基线进行的。

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

Chain rule with multipliers works the same as chain rule with gradients

因此,您现在可以沿着这些乘数反向传播,以找到输入相对于模型输出的斜率,从而轻松定义要素的重要性。

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

Note that I am calculating the ‘partial slope’ of Y, similar to calculating the partial derivative.

DeepLIFT 对模型互操作性的方法的问题在于,它重新定义了梯度的计算方式,这意味着你需要非常深入地挖掘大多数深度学习框架的内部来实现它。

其优点是速度快(只需要模型的一次反向传递来计算特征重要性值)且精确(因为与积分梯度不同,没有发生近似)。

选择基线

正如所承诺的,我们现在将回到挑选基线。除了一些非常明显的例子(例如上面的 MNIST 例子),决定基线输入是非常重要的,可能需要领域的专业知识。

手动选取基线的替代方法是考虑已训练模型的先验分布。这可以让我们很好地了解模型在完全没有信息的情况下在想什么。

例如,如果我在 ImageNet 上训练了一个模型,它之前的假设是什么,它看到的一张新照片是一只猫鼬吗?如果 ImageNet 数据集中有 2%的照片是猫鼬,那么模型会认为它看到的新照片有 2%的机会是猫鼬。当它真正看到照片时,它会相应地调整它的预测。衡量输入相对于先前假设的影响是有意义的。

那么,我如何选择一个 2%猫鼬的基线呢?好吧,一个好的方法可能是取数据集的平均值,简单地将数据集中的图像平均在一起。这是在 shap 库的集成渐变和深度提升实现中使用的方法。方便的是,它消除了作为领域专家为被解释的模型选择合适基线的需要。

结论

模型可解释性仍然是机器学习中一个有趣的挑战。最大的问题是,没有一种定量的方法来衡量一种解释是否优于另一种解释;我们所能做的最好的事情就是定义我们希望我们的解释具有什么样的属性(比如特征重要性的总和等于预测与基线的差异)。

希望这篇文章直观地展示了两种强大的解释技术以及它们之间的区别,但是还有很多内容我没有涉及(比如 Integrated Gradients 和 DeepLIFT 的作者在开发他们各自的技术时优化了哪些属性),所以我鼓励大家看看这些论文。

最后,如果你想试验这些方法, shap 库有两者的多框架实现。

来源/延伸阅读

综合梯度 : 穆昆德·孙达拉拉詹,安库尔·塔利,奇奇颜深度网络公理化归属,2017

DeepLIFT : 两代情·什里库马尔,佩顿·格林塞德,安舒尔·昆达耶通过传播激活差异学习重要特征,2017

SHAP 价值观 : Scott M. Lundberg,Su-In Lee, 解释模型预测的统一方法,2017

解释随机森林和其他黑盒模型,如 XGBoost

原文:https://towardsdatascience.com/interpreting-random-forest-and-other-black-box-models-like-xgboost-80f9cc4a3c38?source=collection_archive---------1-----------------------

在机器学习中,在表现解释之间有一个反复出现的困境。通常,模型越好,越复杂,越难理解。

一般来说,有两种方式来解释一个模型:

  1. 总体解读:确定哪些变量(或变量组合)最有预测力,哪些最没有预测力
  2. 局部解释:对于一个给定的数据点和相关的预测,确定哪些变量(或变量组合)可以解释这个特定的预测

根据您使用的模型类型,可能会有特定的方式来解释您的模型。例如,决策树模型可以简单地通过绘制树并观察分裂是如何进行的以及叶子的组成来解释。

然而,RandomForest 或 XGBoost 没有具体的方法来做到这一点,它们通常更擅长进行预测。

整体解读

在 Python 的大多数模型中,整体解释已经开箱即用,具有“feature_importances_”属性。下面的例子:

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

Example of feature importances for a given model, what I call “feature importances table” in this article (sorted by feature importance in descending order)

解释这个输出非常简单:根据模型,变量越重要,就越相关。这是一个很好的方式

  1. 确定具有最佳预测能力的变量
  2. 提出问题/纠正错误:相对于其他变量来说太重要的变量。
    示例:在之前的项目中,我们处理有偏差的数据:类 1 的数据在变量中有许多缺失值,而类 0 的数据没有。我们直到看了特性重要性表才意识到这一点。该模型了解到,如果数据丢失,则它属于类别 1。我们通过从类 0 的数据中抽取缺失值来解决这个问题
  3. **用新变量更新您的模型。要查看新变量是否与您的模型相关,计算之前的模型(无新变量)和之后的模型(有新变量)的特征重要性。分析新变量在要素重要性表中产生的变化。
    举例:在进行特征工程时,你可以提出一个更相关的特征,但是在你的数据中引入它可能会降低与新特征直接相关的特征的重要性。
  4. 比较不同的模型:通过比较变量的重要性来比较两个不同模型(例如 RandomForest 和 XGBoost)的特性重要性。它有助于了解模型是否掌握了变量的预测能力。
    例:比较不同深度的 XGBoost 模型,可以帮助你理解当你使用特定深度时,特定变量变得有用。

到目前为止,对模型的整体理解还不错。

现在你如何解释一个给定数据点的预测?

本地解释

在这里,我将定义什么是本地解释,并提出一个解决方法来处理您拥有的任何模型。

如何定义地方解读?

这里启发我的是我从数据机器人那里得到的一个演示,他们想预测贷款违约。在他们的演示中,对于每个单独的预测,他们还输出了增加违约概率最多的前 3 个变量,以及减少违约概率最多的前 3 个变量。

让我们保留这个例子(用模拟数据),为了更好的可读性,让我们仅用 3 个变量来表示局部解释,如下所示:

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

Illustration of local interpretation: for each data point, we identify the 3 variables with the most impact on the prediction of default. Variable Var_1 increases the probability of default in the first 2 predictions (resp. +34% and +25%), but decreases it in the 3rd (-12%)

从这个解释中最有趣的收获是

解释每个单独的预测可用于:

  1. 理解个别情况下预测的原因。
    例如:两个人有很高的违约概率,但原因完全不同(即变量不同)
  2. 了解被过滤人群最常见的预测原因。这和特性重要性是不一样的!
    举例:考虑一个欺诈检测用例。这是一个典型的多数类问题(0.1%的 1 类数据 vs 99.9%的 0 类数据),特征重要性偏向 0 类。因此,查看第 1 类的每个单独预测,并对最能解释第 1 类的前 3 个变量进行分组,将非常有助于了解哪些特征会导致最大的风险。

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

For all predictions of defaults (probability > 50%), we rank the variables that are the most frequent in the top 3 variables, to understand which variables explain the most the default. Variable Var_1 is in 43 cases the most contributing variable for the prediction of default, in 15 cases the second, in 12 cases the 3rd

用 Python 实现

Python 中的tree interpreter库允许我们精确地计算每个特性对随机森林模型的影响。我让好奇的读者查看了包作者的两篇惊艳文章( 12 )。

对于其他模型,我们将做一个快速的解决方案:运行一个随机森林模型,并在您的模型和随机森林模型之间的预测匹配时进行局部解释(当它们同时预测违约或非违约时)。这是我在一个客户项目中选择的解决方案,在这个项目中我有一个 XGBoost 模型。在这种情况下,Random Forest 的本地解释很有意义,但是没有专门针对 XGBoost 的框架仍然是一个令人沮丧的解决方法。

由于计算需要一些时间(取决于随机森林模型中的树的数量),我建议在本练习中使用您的预测的子集。例如,根据模型,最有可能违约的 10 个人。

For each individual prediction, we compute the individual contribution of each variable in the prediction with the treeinterpreter package

注意,treeinterpreter 既有可变贡献,也有整体偏差。更深入的了解,推荐原创博文

有一点要记住

假设您有一个变量“年龄”,它的贡献足够高,可以位于前 3 个变量中,从而有助于特定的预测。你可能会对年龄感兴趣,因为你(或专家)会对 18 岁或 35 岁有不同的解释。因此,查看变量的贡献及其值是一个好习惯(就像上面的代码,其中有两列“value_variable”和“contribution_variable”)

超越 treeinterpreter

解释黑盒模型一直是许多研究论文的主题,目前也是,特别是当涉及到深度学习解释时。试验并采用了不同的方法:石灰偏相关图defragTrees

对于 treeinterpreter,如果有其他基于树的模型,比如 XGBoost、LightGBM、CatBoost 或其他梯度提升方法,那就太好了。

最近偶然发现一篇很棒的关于随机森林模型解读的文章:https://medium . com/usf-MSDS/intuitive-interpretation-of-random-forest-2238687 CAE 45,有瀑布图和部分依赖图。

感谢阅读,如果你觉得这篇文章有用,请考虑给它至少 50 个掌声:)

解读 SHAP 的深度学习模型

原文:https://towardsdatascience.com/interpreting-your-deep-learning-model-by-shap-e69be2b47893?source=collection_archive---------0-----------------------

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

Photo by JESHOOTS.COM on Unsplash

前面的提到过,模型解释非常重要。这篇文章继续这个话题,但分享另一个著名的库是夏普利附加解释(SHAP)[1]。Lundberg 等人提出了解释模型预测的统一方法。

看完这篇文章,你会明白:

  • 什么是沙普利值
  • 沙普利添加剂解释(SHAP)
  • 用例
  • 外卖食品

沙普利值

在介绍 SHAP 之前,我们先来看看合作博弈理论中的解概念——沙普利值。

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

让我们以一个开发团队为例。我们的目标是交付一个深度学习模型,它需要完成 100 行代码,而我们有 3 个数据科学家(L,M,N)。他们中的 3 个人必须一起工作来完成这个项目。鉴于:

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

Contribution among coalition

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

Marginal Contribution by different orders

我们有 3 名球员,所以总组合是 3!也就是 6。上表显示了不同联盟顺序的贡献。

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

根据 Sherley 值公式,我们有上表。虽然 M 的能力比 N 大 6 倍(30 比 5),但是 M 应该得到 41.7%的奖励,而 N 应该得到 24.17%的奖励。

沙普利添加剂解释(SHAP)

这个想法是用博弈论来解释目标模型。所有特征都是“贡献者”,并试图预测“游戏”任务,而“回报”是实际预测减去解释模型的结果。

在 SHAP,特征重要性被分配给每个特征,其等同于所提到的贡献。让我们以汽车贷款(车贷)为例。我们有“新司机”、“有孩子”、“4 门”、“年龄”。

理论上,组合数是 2^n,其中 n 是特征数。鉴于我们想知道“年龄”的 Shapley 值。我们将预测以下所有带有和不带有“年龄”特征的组合。提到了一些优化

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

All possible combinations

通过使用沙普利公式,SHAP 将计算所有上述情况,并返回平均贡献和。换句话说,当特定功能错过了时,没有谈论差异。

用例

SHAP 为不同类型的模型提供了多种解释者。

  • TreeExplainer:支持 XGBoost、LightGBM、CatBoost 和 scikit-learn 模型,由 Tree SHAP 开发。
  • DeepExplainer(深度 SHAP):通过使用 DeepLIFT 和 Shapley 值支持 TensorFlow 和 Keras 模型。
  • GradientExplainer:支持 TensorFlow 和 Keras 模型。
  • KernelExplainer(内核 SHAP):通过使用 LIME 和 Shapley 值应用于任何模型。

下面的示例代码将展示我们如何使用 DeepExplainer 和 KernelExplainer 来解释文本分类问题。

深度解说

explainer = shap.DeepExplainer(pipeline.model, encoded_x_train[:10])
shap_values = explainer.shap_values(encoded_x_test[:1])x_test_words = prepare_explanation_words(pipeline, encoded_x_test)
y_pred = pipeline.predict(x_test[:1])
print('Actual Category: %s, Predict Category: %s' % (y_test[0], y_pred[0]))shap.force_plot(explainer.expected_value[0], shap_values[0][0], x_test_words[0])

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

内核解释器

kernel_explainer = shap.KernelExplainer(pipeline.model.predict, encoded_x_train[:10])
kernel_shap_values = kernel_explainer.shap_values(encoded_x_test[:1])x_test_words = prepare_explanation_words(pipeline, encoded_x_test)
y_pred = pipeline.predict(x_test[:1])
print('Actual Category: %s, Predict Category: %s' % (y_test[0], y_pred[0]))shap.force_plot(kernel_explainer.expected_value[0], kernel_shap_values[0][0], x_test_words[0])

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

外卖食品

要访问所有代码,你可以访问我的 github repo。

  • 当你阅读 Christoph 的博客 时,你可以参考上面代码的 Shapley 值解释部分。
  • Shapley 值是在不同情况下预测的特征的平均贡献。换句话说,当特定功能错过了时,这就是没有谈论差异。
  • SHAP 包括多种算法。你可以查看关于石灰、深度提升、夏普利值计算的更多细节。
  • 有可能 DeepExplainer 和 KernelExplainer 引入了不同的结果

延伸阅读

关于我

我是湾区的数据科学家。专注于数据科学、人工智能,尤其是 NLP 和平台相关领域的最新发展。你可以通过媒体或者 Github 联系到我。

参考

[1]伦德伯格 S. M .,李素英。解释模型预测的统一方法。2017.http://papers . nips . cc/paper/7062-a-unified-approach-to-interpretation-model-predictions . pdf

[2] Lundberg S. M .,Erion G. G .,Lee Su-In .树集成的一致个性化特征属性。2017.https://arxiv.org/pdf/1802.03888.pdf

进入黑暗的文本中心

原文:https://towardsdatascience.com/into-a-textual-heart-of-darkness-39b3895ce21e?source=collection_archive---------5-----------------------

通过仇恨言论分类在 NLP 中从零到不太英雄

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

Image courtesy of Peggy and Marco Lachmann-Anke, CC0 license.

互联网是一个丛林。在这里,丰富的多样性和奇妙的色彩结合起来,创造了一个独特的生态系统,使新的技术和通信方法。但是在这个明亮的树冠下是不受控制的互联网的黑暗下层——在这个地方,匿名的安全性模糊了公民话语的界限。

在这里,你会发现侮辱和侮辱,辱骂和嘲笑。在这个勇敢的新世界里,人仅仅是一个抽象概念,与他或她所说的事情无关。在这里,整批的人被妖魔化和诋毁,而不是因为他们自己的过错。值得庆幸的是,其中一些是网络钓鱼者的结果——精心构建的评论假装无知并激起愤怒。

一些。但是,不是全部。

其中一些评论是真正的偏见和恶意的产物。我想看看我是否能找到一种方法来构建一个模型,能够检测和分类这些评论,并将它们从其他评论中分离出来。作为一个对自然语言处理技术知之甚少的人,我很想看看自己在两周内能走多远。

“太恐怖了!恐怖!”

为了限制我的调查范围,我想专注于令人反感的评论的一个特定类别——仇恨言论。虽然这个词越来越多地被使用,但它也越来越多地被误解。Alito 法官在他对 Matal 诉 Tam 案的书面意见中对仇恨言论以及我们与仇恨言论的关系做了如下定义:

基于种族、民族、性别、宗教、年龄、残疾或任何其他类似理由贬低他人的言论是令人憎恶的;但我们言论自由法理最值得骄傲的是,我们保护表达“我们讨厌的思想”的自由。

令人惊讶的是,在美国,仇恨言论在联邦一级不受管制,并一直受到第一修正案的保护。然而,像大学这样的机构经常定义行为和礼仪规范,对言论加以限制,但效果有限。

随着互联网提供的匿名性,以及它提供的与后果的隔离,仇恨言论肯定在增加,并且越来越受到寻求保持文明的社区和平台的关注。

数据

首先,我需要一些仇恨言论。快速的网络搜索让我找到了一个由人类标注的推文集合。这些数据构成了论文“自动化仇恨言论检测和攻击性语言问题”的基础。对数据的粗略浏览揭示了我所面临的问题:

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

A sample tweet from the data, classified as offensive, but not hateful.

数字列从左至右对应于:

  • tweet 的索引或条目编号
  • 查看该推文的人类读者数量
  • 认为推特上有仇恨言论的人类读者数量
  • 认为这条推文令人不快的读者人数
  • 认为推文不属于以上两种情况的读者人数
  • 最终分类,即多数意见

每条推文至少有三名读者阅读,对于更模糊的陈述,阅读人数会增加一倍。

由于我的挑战是只根据推文的文本对推文进行分类,所以除了最终的分类决定,我忽略了所有的数字列。

倒垃圾

推文本来就乱;互联网交流是非正式的,不固定的——重复的强调字母、非常规的缩写和不断演变的俚语只是其中的一些东西,它们既给平台带来了活力,也让文本变得更加难以处理。为了对我的数据中的单词进行任何形式的准确阅读,我需要标准化和规范化。

为了做到这一点,我从一些关于古腾堡项目的书籍中生成了一个单词列表。不幸的是(也是可以理解的),互联网上的许多脏话和行话不是这些经典文学作品的一部分,需要手动添加。这是一个非常不完美的系统,因为对我来说不可能解释所有的事情,但是它保留了我需要的脏话,并规范了我的大部分文本。

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

An example from my normalization workflow. Note the repeated ‘yyy’ in ‘crazy’ is corrected, though ‘bahaha’ is interpreted as an unrelated word.

我希望大多数遗漏的内容至少会以一致的方式被错误地规范化,从而限制潜在的影响。

分解它

有了(大部分)修改过的文字,我就可以把我的推文转换成机器可读的东西了。处理文本的一种常见方法是将文本分成单个单词或单词组,称为

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

Partial n-grams for a normalized tweet, with corresponding part-of-speech tags (discussed later).

这些 n-gram 然后被转换成机器可读的数字向量,数字对应于每个 n-gram 的 tf-idf 权重。

术语频率-逆文档频率( tf-idf )可以被认为是一个单词对于一类文档的独特性或独特性的度量。确定一个单词有多重要的一种方法是简单地计算它出现的次数(术语频率)。

不过,我们有个问题。有些词只是在所有文档中更频繁地出现,例如“and”、“the”或“a”。如果不删除这些词,简单的术语频率将被这些不可区分的词所支配,从而隐藏真正的信息。

tf-idf 的构想是通过惩罚出现在多个文档中的单词来纠正这一点。虽然“the”可能有很高的术语频率,因为它出现在几乎每个文档中,但它的 tf-idf 得分将受到影响,从而使真正独特的描述性单词浮出水面。

在我的例子中,“冒犯”和“憎恨”类共享了很多词汇,比如骂人的话。我的希望是,tf-idf 将允许独特的诋毁,使仇恨言论是什么出现。

保持优雅

我执行了两个主要的分类步骤——词性标注,以及最终的分类,即仇恨、冒犯或两者都不是。

最高级,不定式和分词,天啊!

现在我坦率地承认我不是语法迷。直到五分钟前,我才知道什么是“语义最高级形容词”。但是词性可能会帮助我从现有的数据中收集一些额外的信息,所以我开始认真准备一些核心的语言学指导。

现在,更聪明的人已经在之前走过这条路,并且优秀的代码已经存在以最小的努力标记文本。但是以学习的名义,我决定自己造一个低劣的模型来做同样的工作。以一个预先标记的语料库为例,我使用了一个简单快速的算法,一个朴素贝叶斯分类器来完成这项工作。

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

The result of my part-of-speech classifier.

正如“天真”可能暗示的那样,这种类型的分类器头脑简单,做出假设,用准确性换取简单性和速度。简单而迅速;在几行代码中,我启动并运行了我的 tagger,准确率为 85%。当然还有改进的空间,但已经足够了:我渴望进入问题的核心——检测仇恨言论本身。

***回顾:*现在,我已经清理了我的原始推文,附加了词性标签,将我的文本分解成小块的单词,并将它们转换成一大堆数字。我已经准备好迎接重头戏了。

Off-平衡

我第一次浏览数据时,针对我的六种类型的特征中的每一种,我训练了五种不同类型的模型:一个、两个或三个单词的组块及其相应的词性标签。

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

Average F1-Score. Each number corresponds to a distinctly trained model.

第一遍看起来不错,对吧?我的最高 F1 分已经在 80 多分,通过优化,我有信心可以推得更高。

不幸的是,我的数据没有这么好。当我试图构建一个仇恨言论分类器时,我最感兴趣的指标是针对仇恨言论的 F1 分数*;只显示数据描绘了一幅完全不同的画面。***

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

F1-Score for “hate speech” classification of tweets.

这是怎么回事?可悲的是,在我的兴奋和匆忙中,我没有勤奋地执行我的探索性数据分析。如果我做得更彻底,我可能会注意到我的数据有些不太对劲。

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

Class 0: hate speech. Class 1: offensive speech. Class 2: neither offensive nor hateful.

我的班级比例严重失衡。第 0 类,仇恨言论——我最感兴趣的一类——只占我总数据的 7%多一点。由于“仇恨”和“冒犯”类在语言上的相似性,我的模型很难看出仇恨和冒犯的界限在哪里。

团队里没有“我”

我最好的模型只有 25%左右的表现,显然我的方法不起作用。因为我的独立模型不能胜任这项任务,所以我考虑结合我最好的——一个穷人的随机森林。

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

The five models I selected for my ensemble approach.

我最终选择的五个模型都是决策树或其变种。对于每一条推文,我把多数决定作为我的分类;如果三个模型预测为 0 级,这将是我对该推文的分类决定。这种方法让我的 0 级 F1 分数达到了 21%。这比我以前所取得的成就要少。

时间不多了,我开始担心。即使是多数决定,我的模型也不能得出正确的结论。但是这给了我第二个想法——如果我的大多数模型都把仇恨言论分类错了,也许他们一直都错了。如果有某种模式的话,我可以把这五个决定输入到一个新的分类器中,这个分类器能够理解这一切。

我的策略得到了回报:将我的模型输入输入到一个新的朴素贝叶斯分类器中,做出最终决策,这让我的 F1 分数达到了 31% ,当然,这不是一个非常显著的改进,但仍然是一个改进。

结束语

虽然我对仇恨言论的成功分类并不令人印象深刻,但它提供了一个良好的开端。虽然这可能有些老生常谈,但比我的准确性或精确性更重要的是,我对良好的代码和数据分析的理解增加了,这只能来自于犯错误和拥有愚蠢的代码架构。

至于模型本身,我当然可以做得更多,尤其是以我现在所知道的。从优雅地处理类不平衡到探索更高级的算法或单词嵌入,唯一可走的路就是 up。

为大家介绍数据分析;第三部分!

原文:https://towardsdatascience.com/intro-to-data-analysis-for-everyone-part-3-d8f02690fba0?source=collection_archive---------7-----------------------

我们希望你已经喜欢这个数据分析和数据科学介绍的前两部分(第一部分第二部分)。

在接下来的几节中,我们将查看不同的数据集,提出问题并提出可能的停止点,您可以尝试思考您可能会从数据和可视化等中做些什么或得出什么结论。

我们一直忙于最近的一些项目,所以我们有点落后于这个职位!

在第一部分。我们将使用来自 Kaggle.com 的这个人力资源数据集。它已经聚合并且干净…

任何一个数据工程师或数据科学家都知道数据不会整齐地打包。相反,通常会有无数的问题,如丢失数据、重复数据、垃圾数据等。

获得一个干净的数据源并不容易。它需要主题专家和数据团队一起工作,以确保每个人都使用同一种语言。

有大量的标准化、测试和记录来确保项目启动时数据馈送保持一致。

清理数据仍然是数据专业人员工作的一大部分。下面的图 1 汇总了我们团队成员在过去工作中的几天。有新的工具使这些工作的某些部分变得更容易。然而,有些是不可避免的。

典型的数据科学家工作日

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

figure 1 A Data Scientists Average Day

聊够了,回到数据分析

如果你还记得我们之前的部分。我们展示了满意度和员工离职之间已经存在某种关联。这是影响员工离职的唯一因素吗?

人力资源数据集的相关矩阵

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

figure 2 Correlation Matrix Of HR Data Data Set

如果这就是分析的结束,那么数据分析师可以去找他们的老板,简单地说:“满意度在你的员工离职中起着重要作用!你应该去鼓舞士气。那会解决你所有的问题!

现在给我升职?

也许…但这并不能真正告诉数据分析师的老板为什么员工要离开。

好的数据科学家要多提问!而且很多时候,那些问题不会横向移动。参见下面的图 3。

问为什么!

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

figure 3 A Data Scientists Daily Struggle

标准化数据

首先,我们获取所有数值数据点,并对它们进行归一化。这是获取一系列数字并在数据集中的最小值和最大值之间创建线性关系的过程。

我们是什么意思?图像有一组介于 1–1000 之间的数据和另一组介于 0–10 之间的数据。现在,这些数字之间的贬低可能会混淆算法。因此,我们将它们规范化。

而不是 1–1000 和 1–10。我们希望将范围限制在 0-1。这意味着您将使最大值=1,最小值= 0,然后在两者之间创建一条线,其中每个数字都适合。因此,对于 1-10,5 大约是 0.5,对于 1-1000,500 大约是 0.5。这样可以减少噪音。

你如何使数据正常化?

这里有一个快捷的函数,它将在 python 中规范化您的数据

normalized = (x-min(x))/(max(x)-min(x))

从数学上讲,它看起来像下面这样:

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

加载数据分析库

当使用 python 执行数据分析时,这些是您将需要的典型 python 库。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

标记离开的员工

我们决定根据谁走谁留来寻找聚类。下面是我们使用其中两个字段输出的数字之一。在图 4 中,红色代表离开的员工,蓝色代表留下的员工。

你看到了什么?似乎有 3 个集群,对吗?

有一群员工满意度很高,平均每月工作时间也很长。这可能是高绩效者,但他们为什么离开?如果不是他们离开。大多数离开的员工都是那些满意度低的人。这很有道理。

这也将使早先简单地提高士气的结论变得正确。

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

figure 4 Red = Employees That Have Left ; Blue = Employees That Haven’t Left

用颜色创建基本散点图

X = hr_data_s[['average_monthly_hours','satisfaction_level']]  # we only take the first two features.
y = hr_data_s.left
plt.scatter(X['average_monthly_hours'], X['satisfaction_level'], c=y, cmap=plt.cm.coolwarm)
plt.xlabel('Average Monthly Hours')
plt.ylabel('Satisfaction Levels')
plt.title('Average Monthly Hours by Satisfaction Levels')
plt.legend()
plt.show()

作为这家公司的一部分,分析师还应该问,留住每一类员工的投资回报率是多少。

我们没有足够的信息来判断哪些离职的员工是最有价值的。然而,常识告诉我们,图 4 右上角的组可能是。纯粹从我们目前所关注的指标来看,他们似乎是非常有价值的员工。

那是真的吗?

在本文中,我们将敦促您回头看看图 3。记住“问为什么”这个数字!

单从这个数据来看,很难说哪个群体最有价值。看起来有很高价值的群体可能是那些被要求完成适量工作从而表现出色的员工。他们也可能是工资最低、替换成本最低的员工。

这就是为什么,重要的是在分析中,继续问为什么!为什么有 3 个独立的组?他们每个人都不一样吗?怎么做,为什么?

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

figure 5 figure 4 Red = Employees That Have Left ; Blue = Employees That Haven’t Left

看一下图 5,似乎也很少有高薪员工离职。图中离职的员工都是中低薪员工。这个,更有道理一点。

员工为什么会离职?

下一节将分析上面列出的各组之间的一些差异。

让我们从计算“已经离开的员工”组中的员工总数开始。

14999 名员工中离职的总人数为 3571 人。

从这里开始,我们将在下表中检查每个组的大小。我们已经根据迄今为止所看到的特征对每个组进行了标记。

下面的组只是我们个人的假设,为什么我们会看到这些不同的组。简单地将它们标记为组 1、2、3 等以避免确认偏差可能不是一个坏主意。

因此,评估分数高、工作时间长的那一组人就是“高绩效者”

小时数低、评价分数低的那一组是“低绩效者”

小时数高、评价分数低的群体“过劳”

然后,有一个离群组,针对的是没有完全融入这些集群的每个人。

离职员工明细

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

figure 6 Breaking down the employees that have left

细分下来,各组加起来就是 3571。这太棒了!

任何类型的数据专家。这应该是一个目标,在这个过程中创建这样的检查,以确保您的数字继续增加。数据总是有可能突然消失或增长。尤其是在 SQL 中。

数据分析 讲的是为什么

请记住,这不仅是数据科学,也是数据分析。我们可以很容易地将这个数据集放入算法中,让计算机替我们思考。python 和 R 中有很多库会很乐意为你做这些。

重要的是培养对数据的直觉,不要完全依赖预先制定的算法。

因此,让我们只看看那些离开的人,并尝试看看我们是否可以创造一个故事来告诉经理。

我们接下来的几个数字将是项目数量、平均每月小时数和评估分数的分布。

这很好,因为不像平均可以隐藏实际的传播,我们将能够可视化的雇员。

项目分布数量

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

figure 7 Distribution Of Number Of Projects Per Group

创建分布图

sns.distplot(hr_data_s[‘last_evaluation’][hr_data_s.clutser == ‘Poor Performers’], label=’Poor Performers’);
sns.distplot(hr_data_s[‘last_evaluation’][hr_data_s.clutser == ‘High Performers’], label=’High Performers’);
sns.distplot(hr_data_s[‘last_evaluation’][hr_data_s.clutser == ‘Overworked’], label=’Overworked’);
plt.title(‘Last Evaluation Distribution’)
plt.legend()
plt.show()

请看图 7,我们看到超负荷工作的员工承担了大量的项目。这很奇怪吗?为什么工作过度、满意度较低的员工会得到更多的项目?那没有意义…是吗?

上次评估分布

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

figure 8 Last Evaluation Distribution

然后我们看一下图 8,可以看到有很大一部分高绩效者有着惊人的评价。如果我们找到曲线下的区域(积分…哦,不),从那里,表现较好的人的最终峰值开始于 0.9 左右,结束于 1,我确信大约有 20%的人比“过度工作”的人得分更高。

当然,在这一点上表现不佳的人既不能在评估中得分,也不能得到很多项目。

平均月小时分布

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

figure 9 Distribution Of Monthly Hours

现在,为了使其完整,我们在图 9 中再次引入了小时。根据图 1,我们已经知道平均每月工作时间和项目是正相关的。所以图 9 不应该是一个惊喜

这仍然是很好的检查,因为也许“高绩效者”和“过度工作者”仍然具有与图 9 中相同的分布,但是转换了图 7 中的分布。

然后,人们可能会假设“过度工作”的那一组之所以慢,是因为他们每小时做的项目比“高绩效者”少。

事实并非如此!

组和职务类型分解透视

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

figure 10 Pivot Table Breakdown Of Groups to Job Type

最后,对于这一部分,我们有图 10。这并不优雅,但目的是展示每种工作类型在每组中是如何分解的。

这很奇怪,如果你真的看薪水的话。“高绩效者”的平均工资比“低绩效者”和“过度工作者”都低。

此外,现在我们已经找出了所有这些组,我们可以看到每个组的满意度有多低。

“过度工作”通常接近 0.01(正常)…这与“表现不佳”的人相比非常不同

怎么回事!

小学亲爱的沃森

基于这些信息,现在。到目前为止,你的结论是什么?

到目前为止,你已经注意到了哪些事实?

假设你是夏洛克·福尔摩斯。看目前的线索?

  • 我们看到三个不同的群体
  • 每一组都有不同的工作时间
  • 两组好像满意度都很低?
  • 一个评估分数比高绩效者低的群体也有高项目量?他们为什么被信任?
  • 你还注意到了什么其他特征

作为一名分析师或数据科学家。得出结论是你的工作!和可操作的步骤!

同样,我们希望你想出一个结论。请在下面随意回答你现在的想法。继续之前。您的结论应该能够为经理或您的团队创建可操作的步骤。这是关键。

你越深入问题,你就越能找到根本原因。你就越有可能想出一个清晰的解决方案,并向经理解释为什么你会看到你所看到的趋势。

为什么不直接把这个扔进算法里呢?

如果你把这个数据集扔进一个像决策树这样的算法里。它实际上会给你一个相当精确的输出。然而,现在向你的经理解释一下?

我们认为,告诉一位经理“算法”证明了这一点,从来都不太管用。

做一个讲故事的人

作为一名分析师,能够讲述数据的故事是很重要的。上面的一些数字可以开始讲述这个故事!然后你可以把它和决策树或者逻辑回归算法结合起来。

那就不仅仅是一堆你甚至不理解的抽象数学了…

我们在第 1 部分中讨论过这个问题。你必须是一个好的沟通者,一个“数据故事讲述者”。不要隐瞒为什么!

一些机构让人们觉得,你需要做的只是通过算法运行数据,然后把结果当作福音来宣扬。

我们相信为了让真正的经理们接受。需要一份可靠的报告,让他们了解你是如何得出最终结论的。单纯的从数据探索到结论并不能证明你的观点,也不科学。

科学领域的理论需要多份研究论文一遍又一遍地证明同一个结论!

数据分析师也应该有证据证明他们超越了某种算法。这样,当你的经理问他们如何知道原因时,他们就可以回答了!

为了进一步阅读数据科学和分析,这里有一些很棒的文章

人人数据分析简介第 1 部分

使用 Kafka 流分析预测预算

如何将数据科学应用于实际业务问题

数据科学家的统计回顾

伦理机器学习

为什么使用数据科学

数据科学简介

原文:https://towardsdatascience.com/intro-to-data-science-part-1-numpy-and-pandas-49d98740661b?source=collection_archive---------7-----------------------

第一部分:熊猫和熊猫

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

Photo by geralt on Pixabay

作为一名科学家,数据在我的日常生活中无处不在。但是分析数据的方法本身就是一门艺术。在“数据科学导论”中,我综合了来自 Udacity 的一门课程,在那里你会发现一个有抱负的数据科学家应该知道的所有基础知识。

在第 1 部分中,我们将看到如何使用 Numpy 创建和操作数组,以及使用 Pandas 创建和操作系列数据帧。最后,您将能够:

  • 创建、索引、切片、操作 numpy 数组
  • 创建一个带有 2D 数字阵列的矩阵
  • 对 numpy 数组应用算法
  • 对 numpy 数组应用数学函数(平均值和点积)
  • 创建、索引、切片、操作熊猫系列
  • 创建熊猫数据框
  • 通过切片、单独索引(iloc 或 loc)、布尔索引选择数据框行

数据科学中常用的工具:Numpy 和 Pandas

Numpy

Numpy 因增加了对多维数组和矩阵的支持而广受欢迎。它还增加了许多基础 python 所缺乏的数学函数。这些函数对于统计分析非常有用(一个数组的平均值、中值、标准差……)。array object 类是 Numpy 的基础,Numpy 数组就像 Python 中的列表,只是数组中的所有内容都必须是同一类型,比如 int 或 float。

>>> [1\. 4\. 5\. 8.]  
>>>[[1\. 2\. 3.]
    [4\. 5\. 6.]]

可以对 Numpy 数组进行索引、切片和操作,就像处理 Python 列表一样。

>>> [1\. 4\. 5\. 8.]  
>>> 4.0
>>> [1\. 4.] 
>>> 5.0

矩阵索引和切片的作用。

>>> [[1\. 2\. 3.]  
     [4\. 5\. 6.]]  
>>> 5.0  
>>> [4\. 5\. 6.]  
>>> [3\. 6.]

下面是一些可以用 Numpy 数组做的算术运算。

>>> [6\. 4\. 9.]  
>>> [-4\.  0\. -3.]  
>>> [ 5\.  4\. 18.]

同样的算术运算,但这次用的是矩阵。

>>> [[ 6\.  8.]  [10\. 12.]]  
>>> [[-4\. -4.]  [-4\. -4.]]  
>>> [[ 5\. 12.]  [21\. 32.]]

除了标准的算术运算,Numpy 还有一系列的
其他数学运算可以应用于 Numpy 数组,比如
均值和点积。

>>> 2.0 
>>> 7.0  
>>> [44.]

熊猫

另一方面,Pandas 允许以适合数据分析的方式构建和操作我们的数据。Pandas 还从 R 中吸取了很多最好的元素,并用 Python 实现了它们。我们将关注熊猫、系列和数据框的主要概念。

您可以将序列视为一维对象,类似于数据库中的数组、列表或列。默认情况下,它将为系列中的每个项目分配一个从 0 到 N 的
索引标签,其中 N 是
系列中项目的数量减 1。

0           Dave 
1      Cheng-Han 
2        Udacity 
3             42 
4    -1789710578


创建系列时,您也可以手动为系列中的项目分配索引,并使用索引从系列中选择特定项目。

>>>
Instructor               Dave 
Curriculum Manager    Cheng-Han 
Course Number               359 
Power Level                9001>>> Dave>>>
Instructor                 Dave 
Curriculum Manager    Cheng-Han 
Course Number               359

您也可以使用布尔运算符从系列中选择特定的项目

>>>
Cockroach    1 
Fish         2 
Mini Pig     3 
Puppy        4 
Kitten       5 >>>
Cockroach    False 
Fish         False 
Mini Pig     False 
Puppy         True 
Kitten        True >>>
Puppy     4 
Kitten    5 

通常,Pandas 中的数据包含在一个称为数据帧的结构中。数据框是具有列的 2D 标签数据结构,如果需要,列可以是不同的类型(字符串、整数、浮点或布尔)。例如:

要创建一个 dataframe,您可以将一个列表字典传递给 Dataframe
构造函数:
1)字典的键将是列名
2)关联列表将是该列中的值。

>>>
   losses     team  wins  year 
0       5    Bears    11  2010 
1       8    Bears     8  2011 
2       6    Bears    10  2012 
3       1  Packers    15  2011 
4       5  Packers    11  2012 
5      10    Lions     6  2010 
6       6    Lions    10  2011 
7      12    Lions     4  2012

Pandas 还有各种功能,可以帮助您了解有关数据框的一些基本
信息。代码中提到的这些函数有:

  1. dtypes:获取每列的数据类型
  2. describe:用于查看数据帧的数字

    的基本统计数据 3) head:显示数据集的前五行
  3. tail:显示数据集的后五行
>>>
losses     int64 
team      object 
wins       int64 
year       int64 
dtype: object>>>
          losses       wins         year 
count   8.000000   8.000000     8.000000 
mean    6.625000   9.375000  2011.125000 
std     3.377975   3.377975     0.834523 
min     1.000000   4.000000  2010.000000 
25%     5.000000   7.500000  2010.750000 
50%     6.000000  10.000000  2011.000000 
75%     8.500000  11.000000  2012.000000 
max    12.000000  15.000000  2012.000000>>> losses     team  wins  year 
0       5    Bears    11  2010 
1       8    Bears     8  2011 
2       6    Bears    10  2012 
3       1  Packers    15  2011 
4       5  Packers    11  2012>>> losses     team  wins  year 
3       1  Packers    15  2011 
4       5  Packers    11  2012 
5      10    Lions     6  2010 
6       6    Lions    10  2011 
7      12    Lions     4  2012

注意:
1)从数据帧中选择单个列将返回一个序列
2)从数据帧中选择多个列将返回一个数据帧

>>>
0    2010 
1    2011 
2    2012 
3    2011 
4    2012 
5    2010 
6    2011 
7    2012 
Name: year, dtype: int64 >>> ... Same as above
>>> year  wins  losses 
0  2010    11       5 
1  2011     8       8 
2  2012    10       6 
3  2011    15       1 
4  2012    11       5 
5  2010     6      10 
6  2011    10       6 
7  2012     4      12

行选择可以通过多种方式完成。一些基本和常用的方法有:
1)切片
2)单个索引(通过函数 iloc 或 loc)
3)布尔索引

您还可以通过布尔
操作符,如& (and)或| (or)来组合多个选择需求

>>>
   losses   team  wins  year 
0       5  Bears    11  2010     
>>>
   losses   team  wins  year 
0       5  Bears    11  2010     
>>>
   losses     team  wins  year 
3       1  Packers    15  2011 
4       5  Packers    11  2012>>>
   losses     team  wins  year 
0       5    Bears    11  2010 
3       1  Packers    15  2011 
4       5  Packers    11  2012>>>
   losses     team  wins  year 
3       1  Packers    15  2011 
4       5  Packers    11  2012

接下来的课程将是关于数据争论

数据科学简介

原文:https://towardsdatascience.com/intro-to-data-science-part-2-data-wrangling-75835b9129b4?source=collection_archive---------6-----------------------

第 2 部分:数据争论

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

Photo by Markus Spiske on Unsplash

真实世界的数据通常是杂乱无章的。数据科学家应该具备的最重要的技能之一是提取和清理数据的能力。这通常被称为数据争论或数据咀嚼。

我们获取数据的三个最常见的来源是文件、数据库或通过 web APIs 从网站获取数据。

如果我们想要处理和分析我们的数据,理解数据本身的结构是至关重要的。

在第 2 部分中,我们将学习:

  • 我们可以在线获取的数据格式及其结构(csv、xml、json)
  • 如何将 csv 文件加载到熊猫数据框中(pd.csv_read())
  • 为什么关系数据库有用?(复杂查询、可伸缩性、模式)
  • 如何制定简单和复杂的查询(SELECT、FROM、LIMIT、WHERE、GROUP BY、聚合函数、pandasql.sqldf())
  • 什么是 API 以及如何从 API 获取数据(request.get()、json.loads())
  • 健全性检查数据(描述()、部分删除、插补、fillna())

获取数据

网上的很多数据都存储在文本文件中,尤其是在政府网站上,往往只是从网站上下载文件的问题。例如,让我们得到所有美国职业棒球大联盟统计数据的数据库,我们可以在这里找到。在页面上,我们可以看到数据有多种格式。三种最常见的格式是 csv、xml 和 json。

我下载了名为“ 2016 —逗号分隔版本—2017 年 2 月 26 日更新”的 csv 格式的数据。查看 AllstarFull.csv 文件时,前两行是:

playerID,yearID,gameNum,gameID,teamID,lgID,GP,startingPos
gomezle01,1933,0,ALS193307060,NYA,AL,,1

在 csv 格式中,我们通常有一系列的行,每行对应一个条目。条目由逗号分隔。文件顶部的标题行对应于标识符,如球员 ID,yearID…如果我们查看第一个球员的条目,我们可以看到相同顺序的相应数据。如果一个数据丢失了,我们会看到两个逗号连在一起,中间没有空格。

在 xml 文档的情况下,我们最终会得到与 html 非常相似的东西。我们可以有一个打开的文档元素,也可以有一系列打开的表格。该表有许多对应于上述值的子表。如果数据丢失,字段以斜杠结尾打开(例如:)

<Document Element>
  <Table>
    <playerID>gomezle01</playerID>
    <yearID>1933</yearID>
    <gameNum>0</gameNum>
    <gameID>ALS193307060</gameID>
    <teamID>NYA</teamID>
    <lgID>AL</lgID>
    <GP/>
    <startingPos>1</startingPos>

在 json 文档中,我们有许多用花括号表示的 json 对象。json 文档很像 python 字典。我们有键,对应于 csv 文件中的标题行,后跟值。在缺少值的情况下,我们只需打开和关闭引号

{ "playerID":"gomezle01"
  "yearID":1933
  "gameNum":0
  "gameID":"ALS193307060"
  "teamID":"NYA"
  "lgID":"AL"
  "GP":""
  "startingPos":1
}

xml 和 json 的好处是它们支持 csv 文档所不能支持的嵌套结构,尽管 csv 仍然是一种非常流行的存储数据的方式。

CSV 数据

将 csv 数据加载到 Pandas 数据框中只需一行代码。每一列都可以通过提及它们的名称来检索。我们还可以通过以矢量化的方式操作列,在数据框上创建新列。例如,如果我们想要一个新的列,它是每个球员的身高和体重的总和,我们可以编写 to 列的算法,如下所示。

也可以将数据写入一个新的 csv 文件,该文件包含我们刚刚用 to_csv()函数添加的新列。

>>>
    playerID  birthYear  birthMonth  birthDay birthCountry ...
0  aardsda01     1981.0        12.0      27.0          USA ...    
1  aaronha01     1934.0         2.0       5.0          USA ...      
2  aaronto01     1939.0         8.0       5.0          USA ...      
3   aasedo01     1954.0         9.0       8.0          USA ...      
4   abadan01     1972.0         8.0      25.0          USA ...     
>>>
0    290.0
1    252.0
2    265.0
3    265.0
4    257.0

关系数据库

我们现在知道如何从 csv 这样的平面文件中加载数据。现在让我们看看如何处理存储在关系数据库中的数据。关系数据库类似于电子表格的集合。在每个电子表格中,都有列和行。列指定一个值及其类型,如 playerID。每一行包含每一列的值,我们称每一组行和列为表格,而不是电子表格,这些表格通常以某种方式相互关联。

关系数据库非常有用,主要有三个原因:

  • 用复杂的查询提取数据很简单。
  • 它伸缩性很好
  • 它确保所有数据的格式一致

事实上,与平面文件相比,使用数据库选择年龄大于 50 岁、体重小于 50、城市等于孟买的人的所有记录很容易。

拥有数十万或数百万条目的数据库并不少见。由于所有信息都理想地存储在一个位置,所以很容易以可伸缩的方式更新、删除和向数据库添加新数据。

最后,关系数据库总是有一个模式。模式是告诉数据库我们计划如何存储数据的蓝图。例如,人的年龄不能是字符串,而其他人的年龄是整数。此外,模式规定对于给定的表,每一行或每一项都有对应于相同值的完全相同数量的列,并且每一列的值都以相同的方式格式化。

问题

我们如何从关系数据库中获取数据?通常使用结构查询语言(SQL)从关系数据库中检索数据。如果我们想要选择所有(*)的数据,查询应该是:

SELECT * FROM database_name;

我们可以通过在 SQL 命令的末尾添加 limit 20 来限制行数。

SELECT * FROM database_name LIMIT 20;

我们也可以只要求特定的列,如姓名和年龄。

SELECT name, age FROM database_name LIMIT 20;

让我们将这个查询编写在一个 python 文件中,并将数据存储在“database_solution”中。

我们还可以执行更复杂的查询。以下查询选择与国家冰岛对应的所有数据。

SELECT * FROM database_name WHERE country = "Iceland";

SQL 中存在一些函数,如 group by 和 aggregate。聚合函数接受一组值,通常是数字,并对它们执行数学运算。例如,sum()是一个聚合函数。

每个地区 50 岁以上的人登记在数据库中的总人数是多少?以下查询首先选择每个地区有多少男性和女性注册。因为我们使用的是聚合函数,所以我们需要包含一个分组依据和非聚合字段,在本例中是地区和性别。最后,我们希望将此限制在 50 岁以上的男性和女性。因此,我们在表名后包含 where 子句,其中 age > 50。

SELECT gender, district, sum(database_generated) 
FROM database_name
WHERE age > 50
GROUP BY gender, district

应用程序编程接口

我们现在知道如何从文件或数据库中获取数据,但是像 Twitter 这样的网站上的数据呢?通过搜索或抓取网站来获取所有数据可能会变得复杂。幸运的是,许多公司允许用户和开发人员通过 API 以简单的、机器可读的格式直接访问数据。有几种不同类型的 API,但最常见的一种,也是 Twitter 使用的一种,是表示状态转移或 REST API。

让我们以 last.fm API 为例,看看我们如何与之交互。正如您在左侧看到的,有几个不同的 last.fm API 方法,我们可以与之对话并从中检索信息。例如,让我们检查一下图像中紫色方块中的 Album.getInfo 方法。

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

last.fm API

当点击 Album.getInfo 链接时,我们会看到一个页面,描述 API 方法将返回的数据类型,如艺术家姓名、专辑名称等

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

正如你所看到的,这个页面告诉我们 API 方法将返回的数据类型,如艺术家姓名、专辑名称和一系列其他信息,如语言或专辑中的音乐大脑 ID。

但是我们如何从 API 中获取数据呢?

  1. 获得一个 API 账号。然后,您将收到一个 API 密钥。
  2. 返回到 Album.getInfo 页面并点击其中一个示例 URL(在紫色方块中)
  3. 您应该会看到一条错误消息,提示您需要一个 API 密钥。

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

4.复制您的 API 密钥并将其粘贴到 url 中,而不是您的 _API_KEY 中。现在你应该看到数据了。

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

注意这个 URL 有一些有趣的地方。

http://ws.audioscrobbler.com/2.0/?method=album.getinfo&API _ KEY = YOUR _ API _ KEY&艺人=雪儿&专辑=相信

API 参数定义在问号之后,如 method、api_key、artist 和 album。例如,如果我们想让蕾哈娜大声说出专辑中的信息,我们可以简单地写:

http://ws.audioscrobbler.com/2.0/?method=album.getinfo&API _ KEY = YOUR _ API _ KEY&艺人=蕾哈娜&专辑= 大声

现在让我们在一个简单的 python 程序中实现它,该程序使用 json 和请求库。

首先,我们像前面看到的那样指定一个 URL。函数 requests.get()将从. txt 中的 url 获取数据。查看 json 对象,我们会看到一个很难处理的字符串格式,但是由于 json.load()函数,json 库允许与 json 数据进行非常简单的交互。现在,json 数据被转换成 Python 字典。

健全性检查数据

既然我们已经获得了数据,无论是非正式的平面文件 sequel(如关系数据库)还是 API,我们都需要在进行任何分析之前对数据进行完整性检查。健全检查允许我们确定数据是否有意义。我们不会深入讨论细节,但是为了进行最基本的健全性检查,Pandas DataFrames 有一个非常有用的方法叫做 describe()。

为了说明 Panda 的 describe 函数是如何工作的,我们将使用上面的 baseball_data。

>>>birthYear  birthMonth  birthDay  deathYear  deathMonth
count  18973        18803     18656       9441        9440   
mean    1931            6        15       1964           6   
std       41            3         8         31           3   
min     1820            1         1       1872           1   
25%     1895            4         8       1942           3   
50%     1937            7        16       1967           6   
75%     1969           10        23       1990          10   
max     1996           12        31       2017          12 deathDay        weight    height  
count   9439         18251    18320  
mean      15           186       72  
std        8            21        2  
min        1            65       43  
25%        8           170       71  
50%       15           185       72  
75%       23           200       74  
max       31           320       83

函数 describe()返回一个数据帧。对于每个数字列,我们可以看到计数、平均值、标准偏差、平均值。我们可以做一些快速检查,以确保有些数据通常是有意义的,例如月份包含在 1 到 12 之间,日期包含在 1 到 3 之间。有没有异常值?查看最小值和最大值是否远大于第 25 或 75 百分位对应的值…

您可能会注意到,每一列的计数都不同。这说明我们可能有一堆缺失值。值可能丢失的原因有很多,例如收集数据失败、数据丢失、无响应值。缺失值会使您的发现无效,因此设计数据收集方法非常重要。可以使用不同的方法来减轻这些缺失值对我们分析的影响。

存在两种方法,部分删除插补。部分删除就像它听起来的那样,将我们用于分析的数据集限制在我们可用的数据范围内。我们可以使用的一种方法叫做列表式删除。在我们执行列表删除的情况下,我们将从所有分析中排除特定的数据点,即使存在一些有用的值。

当我们没有太多数据时,或者移除缺失值会损害样本的代表性时,我们会使用插补。仅仅因为缺少值就丢弃一堆条目可能会严重影响我们试图执行的任何分析的统计能力。在这种情况下,对我们的数据中缺失的值进行智能猜测(如近似值)可能是有意义的。例如,我们可以用所有其他值的平均值替换所有缺失值,或者使用线性回归来估计缺失值。然而,插补给数据集带来了偏差和不准确性。这是一个非常困难的问题,新技术也在不断发展。存在更复杂和健壮的方法。

在下面的代码中,我们计算“weight”数组的平均值,并通过将“weight”列中的任何缺失值设置为平均权重来估算它们。

在下一篇文章中,我们将深入实际数据分析!

数据科学简介

原文:https://towardsdatascience.com/intro-to-data-science-part-3-data-analysis-71a566c3a8c3?source=collection_archive---------3-----------------------

第 3 部分:数据分析

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

Photo by Markus Spiske on Unsplash

我们将看到统计学和机器学习中分析数据的基本方法。统计使我们能够确保我们正在从数据中进行合理的推断,并检查统计意义,了解置信区间…它们为比较和评估数据提供了一个正式的框架,并使我们能够评估我们的数据集中的感知效果是否反映了整个人群的差异。

在这一部分,我们将看到:

  • 正态分布的 t 检验(韦尔奇检验)
  • 如何处理非正态数据(夏皮罗-维尔克检验),非参数检验(曼-惠特尼 U 检验)
  • 线性回归
  • 如何在 Python 中实现渐变下降

统计检验

您可能用来分析数据的许多统计测试都假设了数据将遵循的概率分布。有许多不同的概率分布,但最常见的是正态分布,它有时也被称为高斯分布或钟形曲线。

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

Normal distribution

正态分布有两个相关参数。平均值(μ)和标准偏差(σ)。这两个参数插入到概率密度函数中,该函数描述了高斯分布。正态分布关于它的平均值是对称的。了解正态分布将有助于理解我们接下来将看到的参数测试。

T 型测试

我们可能用来比较两组数据的最常见的参数检验之一是 t 检验。t 检验允许检查两组数据之间是否有显著差异。这就是描述统计学和推断统计学的区别。使用描述性统计数据,如平均值,您只能描述我们拥有的样本,但除此之外我们无法进行概括(例如,如果我掷硬币 10 次,得到 7 个正面,而一个朋友得到 5 个正面,这并不意味着我更有可能得到正面,我们也不能说我将总是得到更多正面)。像 t 检验一样,推断统计不仅仅描述我们拥有的样本,还告诉我们可以从我们没有的样本中得到什么。它允许我们超越正在测试的样本进行归纳。t 检验只是测量组间的差异,并将其与组内的差异进行比较。t 值越小,各组越相似,反之,t 值越大,各组越不同。当我们想要比较两个不同的样本检验时,我们进行两个样本的 t 检验。我们将讨论这种称为韦尔奇 t 检验的变体,它不假设相等的样本大小或相等的方差。在 Welch 的 t 检验中,我们使用以下等式计算 t 统计量。

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

我们还想用下面的等式估计自由度的数量(ν)。

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

一旦我们有了这两个值,我们就可以估计 p 值。p 值是获得至少与实际观察到的一样极端的检验统计的概率。如果 p 值=0.05,这意味着 t 值大于或等于的概率为 5%。t 检验的目标是接受或拒绝一个零假设。无效假设是我们试图通过测试来否定的陈述。在进行统计检验时,我们通常设置一个 p-临界值。如果 p 值<是 p 临界的,那么我们将拒绝零假设。

计算 p 值可能很繁琐,幸好在 Python 中有一种简单的方法。让我们把这个应用到一个例子中。我们想确定右手和左手击球手的表现是否有差异。无效假设是“惯用右手和惯用左手的击球手之间没有区别”。

首先,我们需要将棒球数据集加载到熊猫数据帧中

 name handedness height weight    avg   HR
0  Brandon Hyde          R     75    210  0.000    0
1   Carey Selph          R     69    175  0.277    0
2  Philip Nastu          L     74    180  0.040    0
3    Kent Hrbek          L     76    200  0.282  293
4   Bill Risley          R     74    215  0.000    0

然后我们分割数据来比较我们的两个子集(右手和左手)

 name handedness height weight    avg  HR
0     Brandon Hyde          R     75    210  0.000   0
1      Carey Selph          R     69    175  0.277   0
4      Bill Risley          R     74    215  0.000   0
6  Steve Gajkowski          R     74    200  0.000   0
7        Rick Schu          R     72    170  0.246  41 name handedness height weight    avg   HR
2      Philip Nastu          L     74    180  0.040    0
3        Kent Hrbek          L     76    200  0.282  293
9      Tom Browning          L     73    190  0.153    2
13        Tom Brown          L     70    168  0.265   64
15  Floyd Bannister          L     73    190  0.175    0

我们使用 ttest_ind()函数执行 t-test。当指定 equal_var = False 时,我们指出我们是否认为两个样本的方差相等。这个 equal_var=false 参数使得 t-test 的这个特定调用等于 Welch 的 t-test。这个函数将返回一个元组。第一个值是数据的 t 值。第二个值是双尾检验的相应 p 值。该函数返回的值假设我们正在执行双边 t 检验,我们只检验两个样本的均值是否不同。

我们选择 p-critical = 0.05,这意味着如果 p-value < 0.05 we would reject the null hypothesis and we could say that there is no significant difference between right-handed and left-handed batters.

Ttest_indResult(statistic=-9.935702226242094, pvalue=3.810274225888738e-23)There is a significant differenceFalse

Non-Normal Data

When performing a t-test, we assume that our data is normal. But we can also encounter probability distribution that are not normal. In this case, we have to use other statistical tests. If we are uncertain, we first need to determine whether or not our data is normal. The shapiro-wilk 检验测量样本取自正态分布总体的可能性。shapiro()函数返回两个值。第一个是夏皮罗-维尔克检验统计量。第二个值是我们的 p 值,我们应该用解释 t 检验的 p 值的方式来解释它。也就是说,给定该数据来自正态分布的零假设,我们观察到夏皮罗-威尔克检验统计值至少与我们看到的一样极端的可能性有多大?

非参数检验

假设我们刚刚确定我们的数据是非正态的,仍然有一些非参数检验,我们可以用来比较两个样本。非参数检验是一种统计检验,它不假设我们的数据来自任何特定的潜在概率分布。一种这样的测试是曼-惠特尼 U 测试,它有时也被称为曼-惠特尼威尔科克森测试。这是对两个群体相同的零假设的检验。mannwhitneyu()函数返回两个值,即 Mann-Whitney 检验统计量和该检验的单侧 p 值。

这些只是我们在对数据进行统计测试时可以使用的一些方法。正如您所想象的,有许多其他的方法来处理来自不同概率分布的数据或者看起来不像来自任何概率分布的数据。数据科学家可以执行许多统计程序。但是理解数据集的底层结构是至关重要的,因此,在给定数据的情况下,哪些统计测试是合适的。

既然我们知道分析现有数据,我们就可以看看是否有办法对数据进行预测。

机器学习

机器学习是人工智能的一个分支,专注于从大量数据中学习来进行预测的系统的构建。但是统计学和机器学习有什么区别呢?

总之答案是不多。这两个领域越来越多地融合在一起,它们共享许多相同的方法。然而,这两个主题之间有一些重要的哲学差异。一般来说,统计学专注于分析现有数据,得出有效的结论,而机器学习专注于做出预测。这意味着:在统计学中,我们非常关心我们的数据是如何收集的,并使用概率模型得出关于现有数据的结论。例如,我们可能试图回答这样一个问题:从统计学上来说,左撇子击球手比右撇子更好吗?在机器学习的情况下,我们更专注于做出准确的预测,如果有更准确的方法根本不使用概率模型,我们就不太愿意使用概率模型。只要我们的机器学习方法持续做出准确的预测,例如,一个球员会打多少个本垒打,我们就不会太担心模型做出什么假设。

机器学习问题有许多不同的类型,但两个常见的是监督学习非监督学习。机器学习通常涉及到针对我们试图解决的问题生成某种类型的模型。我们将把数据输入这个模型,然后试着做出预测。在监督学习中,有标记的输入,我们在其上训练我们的模型。训练我们的模型韦尔奇的测试简单地说就是告诉模型答案是什么样的。监督学习的一个例子是估计一栋新房子的成本,假设我们有许多例子,我们知道一些特征,如平方英尺、房间数量或位置。我们也知道那栋房子卖了多少钱。假设我们知道所有相同的参数,我们可以训练一个模型,然后预测未来的房子会卖多少钱。这是一个回归的例子。

当执行无监督学习时,我们没有任何这样的训练示例。相反,我们有一堆未标记的数据点,我们试图了解数据的结构,通常是通过将相似的数据点聚集在一起。例如,如果我们给一个无监督学习算法提供一堆照片,它可能会将这些照片分成不同的组,比如人的照片、马的照片、建筑物的照片,而不需要事先知道这些组应该是什么。它可能不知道这些群体是人、马还是建筑,但它可以知道这些不同的群体存在。

线性回归

回到我们的棒球数据集,我们想要创建一个模型来预测一个不在我们的数据集中的球员一生中的本垒打数。我们可能能够解决这个问题的一个方法是使用线性回归,机器学习的一个基本实现是通过使用梯度下降来执行线性回归。

当进行线性回归时,我们通常有许多数据点(下面的图中从 1 到 m)。每个数据点都有一个输出变量(Y)和一些输入变量(X1 到 Xn)。在我们的棒球例子中,Y 代表一生中本垒打的次数,X1 到 Xn 代表他们的身高和体重。

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

目标是通过将输入变量乘以某组系数(θ1 至θn)来构建一个模型,该模型可预测每个数据点的输出变量的值。我们称每个θ为模型的一个参数或权重。它表明了某个输入变量 X 对于输出变量 y 的预测有多重要。该模型的建立方式是,我们将每个 X 乘以相应的θ,并将它们相加,得到 y。从等式中可以看出,θ越小,θ和 X 的乘积越小,反之亦然。计算θ时,对于在预测 Y 时不太重要的输入 X,θ较小,而对于贡献较大的输入 X,θ较大。最佳等式是最小化我们预测的 Y 和我们观察到的 Y 之间所有数据点的差异的等式。我们需要做的是找到产生最佳预测的θ,这是由于梯度下降而最小化这种差异。

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

为了进行梯度下降,我们首先需要定义以下成本函数 J(θ)。

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

成本函数旨在衡量我们当前的θ集在数据建模方面的表现。所以我们想最小化成本函数的值。正如我们在上图中看到的,成本函数只是误差平方和的一半。请注意,x 上标 I 代表我们的整个 x 的集合。所以预测的 Y 等于我们在上面看到的两个图中 x 和θ的乘积之和。

那么,我们如何找到θ的正确值来最小化我们的成本函数 J(θ)?梯度下降是一种算法,它对θ进行一些初始猜测,并迭代地改变θ;使得 J(θ)不断变得越来越小,直到它收敛到某个最小值。

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

实现梯度下降算法

现在,让我们实现梯度下降算法的基本功能,以在一个小数据集中找到边界。首先,我们将从 plot_line()函数开始,它将帮助我们绘制和可视化数据。注意 gradient_descent()函数将 alpha 作为参数。Alpha 被称为学习率,它基本上设置了每次迭代的步骤。在更新权重方面迈出大步会让你超越权利等式。另一方面,小步前进会增加达到收敛所需的迭代次数。它通常涉及一个微调过程,以找到正确的平衡。

数据集应该是这样的:

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

我用蓝色标出了初始化线。这条线通常是随机设置的

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

每 10 次迭代,我就打印一次成本。请记住,成本应该一直降低,直到达到可能的最低点(收敛)。

('\n========== Epoch', 0, '==========')
Cost:  16.004954
('\n========== Epoch', 10, '==========')
Cost:  7.52057727374
('\n========== Epoch', 20, '==========')
Cost:  3.71424722592
('\n========== Epoch', 30, '==========')
Cost:  2.0064263714
('\n========== Epoch', 40, '==========')
Cost:  1.23996949709
('\n========== Epoch', 50, '==========')
Cost:  0.895797093343
('\n========== Epoch', 60, '==========')
Cost:  0.741057191151
('\n========== Epoch', 70, '==========')
Cost:  0.671295578372
('\n========== Epoch', 80, '==========')
Cost:  0.639655519089
('\n========== Epoch', 90, '==========')
Cost:  0.625117716849

在这里,我们可以看到不同的步骤,在这些步骤中,直线朝着更好的回归方向更新。您可以随意使用这段代码并调整不同的参数。你可以改变时代,学习率(阿尔法),改变数据集…

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

初学者的深度学习

原文:https://towardsdatascience.com/intro-to-deep-learning-d5caceedcf85?source=collection_archive---------0-----------------------

如果你在技术领域工作,或者对技术领域感兴趣,你可能会经常听到“深度学习”这个词。计算机科学的新兴领域正在彻底改变人工智能,使我们能够建造未来的机器和系统。虽然深度学习让我们的生活变得更容易,但理解它的工作原理可能很难。我花了相当多的时间探索深度学习的世界,主要是计算机视觉应用,我学到了一两件关于它的事情,因此我在这里分享我学到的东西。

首先,在你理解深度学习之前,知道什么是机器学习很重要。很简单,机器学习是人工智能(AI)的一个领域,允许计算机“学习”。传统上,我们总是通过向计算机提供一组严格的指令(也称为计算机程序)来让它做事情。机器学习使用一种非常不同的方法。我们不是给计算机一套如何做某事的指令,而是给它如何学习做某事的指令。我们通过给它数据和编程,让它使用各种数学和统计模型来理解数据,并学习根据数据做出决策。例如:想象一个系统,可以将动物的图片分类为‘猫’、‘狗’、‘老虎’、‘狮子’或者‘大象’。你可以给计算机编程,让它接受这些动物的图像,并自己找出不同动物图像之间的视觉模式和差异,而不是手动从这些动物的图像中找到独特的视觉特征和模式,然后对其进行编码。这可以通过一系列不同的算法来实现。这里的想法是,计算机可以自己“学习”,而不是被专门编程来完成某项任务(在这种情况下,对不同动物的图像进行分类)。教计算机的过程(即给它学习的数据)被称为训练

深度学习,顾名思义,是机器学习的一个分支。深度学习主要涉及使用深度人工神经网络(算法/计算模型,大致受人脑启发)来解决机器学习问题。回到我之前举的例子,今天最先进的图像分类解决方案使用深度学习。注意:有时,使用决策树和/或其他机器学习算法也可以称为深度学习,但在大多数情况下,深度学习涉及到神经网络的使用。

那么,什么是神经网络?这里有一个类比:把神经网络想象成一系列一个接一个的门,把你自己想象成神经网络的“输入”。每次你打开一扇门,你就变成了一个不同的人(也就是说,你在某些方面发生了变化)。当你打开最后一扇门的时候,你已经变成了一个完全不同的人。当你从最后一扇门出去时,你就成了神经网络的“输出”。在这种情况下,每扇门代表一个。因此,神经网络是以某种方式转换输入以产生输出的层的集合。神经网络中的每一层都由“权重”和“偏差”组成——这些只是增加输入的数字。神经网络的总体思想是,它接受一些输入(通常是代表某些东西的数字的集合,例如图像中像素的红-绿-蓝值),使用其层中的权重和偏差对输入应用一些数学变换,并最终输出。如果你以前上过线性代数课,你可以把输入、输出和权重看成矩阵。输入矩阵通过一系列矩阵(即各层的权重和偏差矩阵)进行转换,成为输出。当然,这是一个关于神经网络如何工作的非常简单的描述,但是你已经明白了(我希望)。

一个深度神经网络只是一个有许多层的神经网络(当你在另一层上堆叠层时,神经网络不断变得“更深”)。多少才算多?嗯,有一个由 16 层组成的 VGG16 神经网络架构(用于图像分类),还有一个由 152 层组成的 ResNet 架构(也用于图像分类)——因此,范围相当广。深度学习的基本思想是使用多层神经网络。

现在,问题是:一个神经网络如何学习?反向传播!正如我之前所说,神经网络由层组成,这些层由权重和偏差组成(这些只是数字的集合)。在训练阶段,神经网络试图找到导致最准确输出的正确权重/偏差。它使用一种叫做反向传播的方法来实现。在训练神经网络之前,随机地或者根据先前训练的模型初始化权重/偏差。无论哪种方式,当训练发生时,神经网络根据它“学习”的内容改变这些权重和偏差。当我们建立一个神经网络时,我们必须决定(即选择或设计)一个叫做成本函数的东西。成本函数基本上只是一个数学函数,它接受来自神经网络的输出(对于给定的输入)和基本事实数据(即对于给定的输入,来自神经网络的预期输出),并计算来自神经网络的结果有多差。使用像梯度下降这样的优化技术,计算机计算如何改变权重和偏差,以使成本函数最小化(如果你以前学过微积分,这将对你更有意义——还记得优化/最小化/最大化函数吗?).随着它对越来越多的数据进行训练,它会一直这样做(从神经网络获得输出,计算成本并反向传播以改变权重)。随着时间的推移,权重和偏差会随着数据进行调整,(希望)您最终会得到一个具有高输出精度的神经网络。请记住,神经网络的实际有效性或准确性在很大程度上取决于用于训练它的数据;因此,构建或选择合适的数据集非常重要。没有好的数据(和大量的数据),很难训练出精确的神经网络。

PS:代价函数基本上衡量的是神经网络的不精确程度;当我们通过改变权重/偏差来最小化成本函数时,我们本质上是试图使神经网络在数学上更精确(如成本函数所定义的)。然而,这种准确性取决于它接受训练的数据;因此,低成本并不一定意味着神经网络得到了充分的训练。

至此,你应该对什么是机器学习、深度学习、神经网络有了基本的了解。这就是我想通过这篇文章分享的全部内容。我知道网上的许多资源可能看起来非常技术性或吓人,所以我尽量保持简单。当然,我写的很多东西都是过度简化的,旨在帮助任何人获得深度学习的基本概念。如果你想知道更多,你应该考虑在这个领域做更多的研究——这对我来说是一次非常有益的经历!

最后,这是给那些想了解更多深度学习的人的。如果你以前从未研究过机器学习,你可以考虑参加 Udacity 上的机器学习入门课程。我认为这是一个非常好的开始,尤其是如果你完全没有机器学习的经验或知识。进入深度学习将需要你熟悉微积分和线性代数,至少在基本水平上理解正在发生的事情。如果你了解这一点,我会推荐你参加斯坦福大学的 CS231N 课程(可在此链接免费在线获得),但这只是因为我在深度学习方面的大部分经验都是在计算机视觉方面,这也是该课程的重点。斯坦福大学还提供了另一门名为 CS224N 的课程,专注于深度学习的自然语言处理。这两者都应该是一个很好的起点。然而,在一天结束时,大多数学习都是在你试图自己构建东西时发生的,所以如果你想更深入地进行深度学习,请整理好基础知识,并开始尝试神经网络。此外,寻找关于神经网络的研究论文(架构、应用等。)并阅读它们!我自己也在学习,所以如果你遇到任何有趣的学习材料,请一定和我分享。

期待由人工智能和深度学习驱动的激动人心的未来!

描述统计学简介

原文:https://towardsdatascience.com/intro-to-descriptive-statistics-252e9c464ac9?source=collection_archive---------0-----------------------

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

描述性统计分析帮助你理解你的数据,是机器学习非常重要的一部分。这是因为机器学习就是做预测。另一方面,统计学就是从数据中得出结论,这是必要的第一步。在本帖中,你将了解最重要的描述性统计概念。它们将帮助你更好地理解你的数据试图告诉你什么,这将导致整体更好的机器学习模型和理解。

目录:

  • 介绍
  • 正态分布
  • 集中趋势(平均值、众数、中位数)
  • 可变性的度量(范围,四分位范围)
  • 方差和标准差
  • 形式
  • 歪斜
  • 峭度
  • 摘要

介绍

对数据集进行描述性统计分析绝对至关重要。许多人跳过了这一部分,因此失去了许多关于他们数据的有价值的见解,这往往会导致错误的结论。慢慢来,仔细运行描述性统计,确保数据满足进一步分析的要求。

但是首先,我们应该回顾一下统计学到底是什么:

统计学是数学的一个分支,处理数据的收集、解释、组织和解释。

在统计学中,有两个主要类别:

1。描述性统计:在描述性统计中,你通过数字计算或图表来描述、展示、总结和组织你的数据(总体)。

**2。推断统计:**推断统计是由更复杂的数学计算产生的,它允许我们根据对样本的研究来推断趋势,并对总体做出假设和预测。

正态分布

正态分布是统计学中最重要的概念之一,因为几乎所有的统计检验都需要正态分布的数据。它基本上描述了大样本数据在绘制时的样子。它有时被称为“钟形曲线”或“高斯曲线”。

推理统计和概率计算要求给出正态分布。这基本上意味着,如果你的数据不是正态分布的,你需要非常小心你应用的统计测试,因为它们可能会导致错误的结论。

如果您的数据是对称的、钟形的、居中的和单峰的,则给出正态分布。

在完美的正态分布中,每一边都是另一边的精确镜像。它应该看起来像下图中的分布:

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

你可以在图片上看到,分布是钟形的,这仅仅意味着它没有严重见顶。单峰意味着只有一个峰值。

集中趋势

在统计学中,我们必须处理均值、众数和中位数。这些也被称为“集中趋势”。这只是三种不同的“平均值”,当然也是最受欢迎的一种。

平均值是简单的平均值,被认为是对单个样本的总体趋势做出假设的最可靠的度量。集中趋势确定数据值围绕其平均值、众数或中位数聚集的趋势。平均值由所有值的总和除以值的个数计算得出。

**众数是数据中最常出现的值或类别。**因此,如果没有重复的数字或没有相同的类别,数据集就没有模式。一个数据集可能有多种模式,但我将在下面的“模态”一节中介绍这一点。
该模式也是可用于分类变量的集中趋势的唯一衡量标准,因为您无法计算变量“性别”的平均值。您只需将分类变量报告为数字和百分比。

中位数是数据的“中间”值或中点,也称为“第 50 百分位”。请注意,中位数比平均值受异常值和偏差数据的影响要小得多。我将通过一个例子来解释这一点:假设您有一个房屋奖励数据集,大部分奖励从 10 万美元到 30 万美元不等,但包含一些价值超过 300 万美元的房屋。这些昂贵的房子会严重影响价值,因为它是所有价值的总和,除以价值的数量。中位数不会受到这些异常值的严重影响,因为它只是所有数据点的“中间”值。因此,中位数是一个更适合用来报告数据的统计数字。

在正态分布中,这些度量都落在同一中线点。这意味着平均值、众数和中位数都是相等的。

差异量数

最受欢迎的变异性度量是极差、四分位差(IQR)、方差和标准差。这些用于测量数据中的分布或变化量。

范围描述数据中最大和最小点之间的差异。

四分位数间距(IQR)是上四分位数(第 75 个)和下四分位数(第 25 个)之间的统计离差的度量。

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

范围衡量的是数据点的开始和结束位置,而四分位数范围衡量的是大多数值的位置。

对于初学者来说,标准差和方差之间的区别往往有点难以理解,但我会在下面详细解释。

方差和标准差

像范围和 IQR 一样,标准差和方差也衡量我们的数据有多分散(例如离差)。因此,它们都是由平均值派生出来的。

方差的计算方法是找出每个数据点与平均值之间的差值,将它们平方,求和,然后取这些数字的平均值。

在计算过程中使用正方形,因为它们比接近平均值的点更重视异常值。这可以防止平均值以上的差异抵消平均值以下的差异。

方差的问题在于,由于平方,它与原始数据的度量单位不同。

**假设您正在处理一个包含厘米值的数据集。你的方差是平方厘米,因此不是最好的测量。

这就是为什么标准差用的比较多,因为它是在原单位。它只是方差的平方根,正因为如此,它被返回到原始的度量单位。**

让我们看一个说明方差和标准差之间区别的例子:

假设一个数据集包含 1 到 15 之间的厘米值,其平均值为 8。对每个数据点和平均值之间的差求平方,并对平方求平均,得到 18.67(平方厘米)的方差,而标准偏差是 4.3 厘米。

当标准偏差较低时,您的数据点往往接近平均值。高标准偏差意味着您的数据点分布在很大的范围内。

当数据为单峰时,最好使用标准差。在正态分布中,大约 34%的数据点位于平均值和高于或低于平均值的一个标准差之间。由于正态分布是对称的,68%的数据点落在平均值以上一个标准差和平均值以下一个标准差之间。大约 95%落在低于平均值的两个标准偏差和高于平均值的两个标准偏差之间。并且大约 99.7%落在平均值以上三个标准偏差和平均值以下三个标准偏差之间。

下图完美地说明了这一点。

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

通过所谓的“Z 得分”,您可以检查特定数据点有多少标准差低于(或高于)平均值。对于熊猫,您只需使用“STD()”功能。为了更好地理解正态分布的概念,我们现在将讨论模态、对称性和峰值的概念。

形式

****一个分布的模态是由它包含的峰的数量决定的。大多数分布只有一个峰值,但也有可能遇到有两个或更多峰值的分布。

下图显示了三种形态的视觉示例:

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

单峰意味着分布只有一个峰值,这意味着它只有一个频繁出现的分数,聚集在顶部。双峰分布有两个频繁出现的值(两个峰值),多峰分布有两个或几个频繁出现的值。

歪斜

偏斜度是对分布对称性的一种度量。

因此,它描述了一个分布与正态分布有多大的不同,或者向左,或者向右。偏斜值可以是正数、负数或零。请注意,完美的正态分布的偏斜度为零,因为平均值等于中位数。

下面你可以看到不同类型的偏斜度:

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

如果数据堆积在左边,使得尾部指向右边,我们称之为正偏斜。

如果数据堆积到右边,会出现负偏斜,使得尾部指向左边。注意,正偏斜比负偏斜更频繁。

对分布的偏斜度的一个很好的度量是皮尔逊偏斜系数,它提供了对分布对称性的快速估计。要计算熊猫的偏斜度,你只需使用“skew()”函数

峭度

峰度测量数据集与正态分布相比是重尾还是轻尾。峰度高的数据集尾部重,离群值多,峰度低的数据集尾部轻,离群值少。请注意,直方图是显示数据集的偏斜度和峰度的有效方法,因为您可以很容易地发现数据是否有问题。概率图也是一个很好的工具,因为正态分布是沿着直线的。

在下图中,您可以看到正倾斜数据集的两种情况:

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

用数学方法测量分布的峰度的一个好方法是 fishers 峰度测量法。

现在我们将讨论三种最常见的峰度。

正态分布称为中峰度**,峰度为零或接近零。与正态分布相比,宽峰分布具有负峰度,并且尾部非常细。尖峰分布的峰度大于 3,厚尾意味着该分布产生更多的极值,并且具有相对较小的标准偏差。**

如果你已经认识到一个分布是偏斜的,你不需要计算它的峰度,因为这个分布已经不正常了。在 pandas 中,您可以简单地通过调用“Kurt osis()”函数来查看峰度。

摘要

这篇文章给了你一个正确的描述统计学的介绍。您学习了正态分布的样子以及它的重要性。此外,您还了解了三种不同的平均值(平均值、众数和中位数),也称为集中趋势。之后,您学习了极差、四分位差、方差和标准差。然后我们讨论了三种类型的模态,你可以用偏斜度来描述一个分布和一个正态分布有多大的不同。最后,你学习了薄黑洞、中黑洞和宽黑洞的分布。

这篇文章最初发表在我的博客上(【https://machinelearning-blog.com】T2)。

数据科学的描述统计和概率介绍

原文:https://towardsdatascience.com/intro-to-descriptive-statistics-and-probability-for-data-science-8effec826488?source=collection_archive---------2-----------------------

目录:

  • 介绍
  • 集中趋势的度量(平均值、众数、中位数)
  • 可变性测量(范围、IQR、方差、标准差)
  • 概率(伯努利试验,正态分布)
  • 中心极限定理
  • z 分数

简介:

在描述统计学中,你通过数字计算、图表或表格来描述、展示、总结和组织你的数据。在描述性统计中,一些常用的度量是集中趋势,另一些是数据集的可变性。

描述性统计分析帮助我们理解我们的数据,并且是机器学习的非常重要的部分。对我们的数据集进行描述性统计分析绝对至关重要。许多人跳过了这一部分,因此失去了许多关于他们数据的有价值的洞察力,这常常导致错误的结论。

集中趋势的测量:

它用代表其分布中心的单个值来描述一整套数据。有三种主要的集中趋势测量方法:

  1. 均值:是观察值之和除以样本量。这不是一个稳健的统计数据,因为它受到极值的影响。因此,非常大或非常低的值(即异常值)会扭曲答案。
  2. 中位数:数据的中间值。它将数据分成两半,也称为第 50 百分位。与平均值相比,它受异常值和偏差数据的影响要小得多。如果数据集中的元素数量是奇数,则最中间的元素是中值。如果数据集中的元素数量是偶数,则中位数将是两个中心元素的平均值。
  3. 模式:数据集中出现频率较高的值。因此,一个数据集没有模式,如果没有类别是相同的,也可能一个数据集有一个以上的模式。这是唯一可以用于分类变量的集中趋势的量度。

可变性测量

可变性的度量也称为数据的分布,描述了一组观察值的相似性或差异性。最受欢迎的变异性度量是极差、四分位差(IQR)、方差和标准差。

  1. 范围:范围描述数据中最大和最小点之间的差异。范围越大,数据越分散。
  2. IQR :四分位数间距(IQR)是对上四分位数(第 75 个)即第三季度和下四分位数(第 25 个)即 Q1 之间的统计离差的衡量。你可以通过下面的例子理解这一点。

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

虽然范围衡量的是数据点的开始和结束位置,但四分位数范围衡量的是大多数值所在的位置。

3.**方差:**是均值的均方差。方差的计算方法是找出每个数据点与平均值之间的差值,将它们平方,求和,然后取这些数字的平均值。

方差的问题在于,由于平方,它与原始数据的度量单位不同。

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

4.**标准差:**标准差因为是原单位,所以用的比较多。它只是方差的平方根,正因为如此,它被返回到原始的度量单位。

当标准偏差较低时,您的数据点往往接近平均值。高标准偏差意味着您的数据点分布在很大的范围内。

当数据为单峰时,最好使用标准差。在正态分布中,大约 34%的数据点位于平均值和高于或低于平均值的一个标准差之间。由于正态分布是对称的,68%的数据点落在平均值以上一个标准差和平均值以下一个标准差之间。大约 95%落在低于平均值的两个标准偏差和高于平均值的两个标准偏差之间。并且大约 99.7%落在平均值以上三个标准偏差和平均值以下三个标准偏差之间。

下图完美地说明了这一点。

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

通过所谓的“Z 得分”,您可以检查特定数据点有多少标准差低于(或高于)平均值。

可能性

我将简单介绍一下概率。在给出概率的实际定义之前,让我们先看看一些术语。

  • 实验:实验可能类似于——德里每天是否下雨。
  • 结果:结果是单次试验的结果。如果今天下雨,今天的审判结果就是“下雨了”。
  • 事件:事件是实验的一个或多个结果。对于德里每天是否下雨的实验,事件可能是“下雨了”或“没下雨”。
  • 概率:简单来说就是事件发生的可能性。所以如果今天有 60%的可能性下雨,那么下雨的概率是 0.6。

伯努利 试验

像掷硬币一样有两种结果的实验叫做伯努利试验。

n 次伯努利试验中成功次数的概率分布称为二项式分布

二项式分布的公式如下。

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

Binomial distribution Formula

具有不同成功概率和 100 个随机变量的二项分布的概率质量函数

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

Probability Mass Function

连续随机变量(变量可以取两点之间的任何可能值)的概率分布称为概率密度函数。在连续随机变量的情况下,将有无限个试验。

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

概率密度函数下的面积给出了随机变量在该范围内的概率。

如果我有一个总体数据,我从数据中随机抽取相同大小的样本,样本均值大致呈正态分布。

正态分布

它基本上描述了大样本数据在绘制时的样子。它有时被称为“钟形曲线”或“高斯曲线”。

推理统计和概率计算要求给出正态分布。这基本上意味着,如果你的数据不是正态分布的,你需要非常小心你应用的统计测试,因为它们可能会导致错误的结论。

在完美的正态分布中,每一边都是另一边的精确镜像。它应该看起来像下图中的分布:

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

Normal Distribution

在正态分布中,均值、众数和中位数都相等,并且落在同一中线点。

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

Normal Distribution Function

均值为 0,标准差为 1 的正态分布称为标准正态分布。标准正态分布曲线下的面积为 1。

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

中心极限定理

  • 如果我们从一个分布中取随机样本的平均值,并画出平均值,当我们取了足够多的这种样本时,图表就接近正态分布。
  • 该定理还指出,均值将近似等于样本均值,即总体均值。

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

标准偏差较高的正态分布更平坦,即与标准偏差较低的正态分布相比,分布范围更广。

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

z 分数

以标准偏差数表示的距离,即观察值远离平均值的距离,是标准分数或 Z 分数。

正 Z 值表示观察值高于平均值 Z 个标准差。Z 分数为负表示该值低于平均值。

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

观察值= +zσ [是平均值,σ是标准偏差]

从上图来看,平均值 2 附近的标准偏差为 0.95,这意味着数据位于该范围内的概率为 0.95。

对于特定的 Z 得分,我们可以查看 Z 表,找出值小于该特定 Z 值的概率。

所以,我希望这篇文章给了你一个正确的描述统计学的介绍。

Excel 超级用户熊猫简介

原文:https://towardsdatascience.com/intro-to-pandas-for-excel-super-users-dac1b38f12b0?source=collection_archive---------2-----------------------

我和微软 Excel 认真交往多年。它伴随着我度过了大学时光和两份分析师工作。我非常了解 Excel 它所有的曲线和边缘,它的捷径和不完美。虽然它不是最有效的工具,但它完成了工作,不需要我学习如何编码。

然后,大概八个月前,我开始读研,被介绍认识了 Python。我们成了即时的朋友。随着 Python 的出现,出现了一种叫做熊猫的东西。一开始我不确定我对熊猫的感觉。老实说,感觉有点像这样:

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

在 Excel 中花了我 10 秒钟的分析将需要 10 多分钟的谷歌搜索和反复试验。然而,随着时间的推移,我越来越喜欢熊猫了。它能做 Excel 能做的一切,甚至更多,只是更快、更灵活、完全可复制。我每天都在学习一些关于熊猫的新知识,但是还没有达到我和 Excel 之间的亲密程度。

与此同时,我想通过分享一些常用的 Excel 函数/工具来传播这种爱,这些函数/工具可以在熊猫身上进行分析。在下面的例子中,我们将探索来自芝加哥公立学校 2016-2017 学年的学校进度报告数据。数据包含学校级别的详细信息,每行一所学校。

表示数据

Excel :数据在 Excel 表格中用列、行、单元格表示。对于不同的数据集,我们可以有不同的工作表。

Pandas :数据的“表格”存储在数据帧中。我们可以从头开始创建数据框架,或者更常见的是,从 csv 文件导入数据:

import pandas as pd

sy1617 = pd.read_csv('CPS-Progress-Reports_SY1617.csv', index_col='School_ID')

列将被标记为它们在 csv 中的样子。行也标有唯一标识符,称为“索引”我们选择了 School_ID 列作为索引,因为每个学校 ID 唯一地标识一个学校行。如果我们在加载 csv 时没有明确地指定一个列作为索引,Pandas 将自动生成一个索引,标记从 0 开始的行。

要快速查看数据框的顶部:

sy1617.head()

访问数据

Excel:Excel 的一个好处就是数据随时都在我们眼前。我们使用基本点和点击命令或键盘快捷键来选择数据。

Pandas :有几种不同的方法来访问特定的行、列和单元格。

若要访问单个列,请使用方括号。输出是一个 Series 对象,它是一个一维数组:

sy1617['School_Type']

若要访问多个列,请指定列名列表。输出现在是一个数据帧:

sy1617[['School_Type', 'Primary_Category']]

我们可以通过索引标签来访问一行:

sy1617.loc[400062]

我们也可以改为指定行号:

sy1617.iloc[0]

要访问单个单元格,只需按行和列划分子集:

sy1617.loc[400062]['School_Type']

基本汇总统计

Excel :应用计数、平均值、中位数、百分位数等。跨所需列或行的函数。

熊猫:描述方法可以显示所选列的汇总统计数据。输出的统计类型将取决于列的数据类型。

文本列将输出计数、唯一、最常见和最常见的频率:

sy1617[['School_Type', 'Primary_Category']].describe()

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

数字列将输出计数、平均值、标准差、最小值、最大值以及下限、50%和上限百分点:

sy1617[['School_Survey_Student_Response_Rate_Pct', 'Suspensions_Per_100_Students_Year_1_Pct']].describe()

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

过滤

Excel :通过特定值或某些条件将过滤器应用到子集数据的列。

熊猫:子集 a 数据帧按某种条件。首先,我们将一个条件语句应用于一个列,并获得一系列真/假布尔。然后,我们将这些结果放入方括号中,以便只为满足条件(即 True)的行划分数据帧的子集。

例如,筛选“特许”类型学校的数据框架:

is_charter = sy1617['School_Type'] == 'Charter'
sy1617[is_charter]

我们可以使用 isin 方法在一列中查找多个值,例如“特许”和“磁铁”学校:

charter_magnet = sy1617['School_Type'].isin(['Charter','Magnet'])
sy1617[charter_magnet]

筛选学生调查回复率至少为 80%的学校:

gt80 = sy1617['School_Survey_Student_Response_Rate_Pct'] >= 80
sy1617[gt80]

我们可以用&和|组合多个条件:

sy1617[is_charter & gt80]

整理

Excel :按某一列或一组列对数据进行排序。

Pandas :使用 sort_values 方法对数据进行排序。例如,按小学/初中/高中和学校名称的字母顺序排序:

sy1617.sort_values(by=['Primary_Category', 'Short_Name'])

数据透视表

Excel:数据透视表是我在 Excel 中的首选。拖放功能使得以任何方式聚集和过滤数据变得容易。下面是一个数据透视表示例,它在行中按学校类型分组,在列中按小学类别分组,并计算表中学校调查学生响应率百分比的平均值。

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

熊猫:我们可以使用 pivot_table 函数在熊猫中生成同一个表。得到的数据帧并不漂亮,但是它完成了任务!

pd.pivot_table(sy1617, values='School_Survey_Student_Response_Rate_Pct', index='School_Type', columns=['Primary_Category'], aggfunc=np.mean)

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

视频库

Excel: VLOOKUP s 是我在 Excel 中的首选。简而言之,VLOOKUP 函数在一系列单元格中搜索一个特定的值,然后返回一个与该值位于同一行的值。

我过去非常依赖 VLOOKUPs 将一个数据集的相关列与另一个数据集连接起来。例如,假设我们有芝加哥公立学校前一年的学校进度报告,在一个标题为“SY1516”的表中。我们想知道 SY1617 数据集中每所学校的 sy 1516 Student _ achievement _ Rating,以便我们可以分析两年间评级的变化。

我们可以通过创建一列 VLOOKUPs 来引入这些数据,使用 School_ID 作为查找值:

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

如果我们想从 SY1516 表中引入任何其他列,我们需要为每个列添加一个额外的 VLOOKUP 列。

Pandas: 在 Pandas 中,连接两个数据集要简单得多。我们可以用数据帧做很多事情,你可以在这里找到一些很好的合并、连接和连接的例子。

现在,让我们使用 Pandas 来复制上面的 VLOOKUP 示例。 merge 函数允许我们使用它们的索引(School_ID)作为一种“查找值”来组合两个数据集。

# read in the csv for prior year's data
sy1516 = pd.read_csv('Chicago_Public_Schools_-_School_Progress_Reports_SY1516.csv', index_col='School_ID')sy1617_short = sy1617[['Student_Attainment_Rating', 'Long_Name']]
sy1516_short = sy1516[['Student_Attainment_Rating']]
pd.merge(sy1516_short, sy1617_short, how='right', left_index=True, right_index=True, suffixes=('_1516','_1617'))

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

注意:how='right '确保我们从第二个/right (SY1617)数据帧中捕获所有学校 id;这类似于 SQL 中的右外连接。

或者,由于 School_ID 是两个数据帧的索引,我们可以使用 join 方法来获得相同的结果:

sy1617_short.join(sy1516_short, how='left', lsuffix='_1617', rsuffix='_1516')

使用合并和连接,我们可以根据需要轻松地从上一年的数据中提取尽可能多的列。

这些只是熊猫可以执行 Excel 功能的许多方法中的一些,还有更多。我希望这能激励你考虑离开 Excel,给熊猫一个机会!

【使用教程】 一、环境配置 1、建议下载anaconda和pycharm 在anaconda中配置好环境,然后直接导入到pycharm中,在pycharm中运行项目 anaconda和pycharm安装及环境配置参考网上博客,有很多博主介绍 2、在anacodna中安装requirements.txt中的软件包 命令为:pip install -r requirements.txt 或者改成清华源后再执行以上命令,这样安装要快一些 软件包都安装成功后才算成功 3、安装好软件包后,把anaconda中对应的python导入到pycharm中即可(不难,参考网上博客) 二、环境配置好后,开始训练(也可以训练自己数据集) 1、数据集准备 需要准备yolo格式的目标检测数据集,如果不清楚yolo数据集格式,或者有其他数据训练需求,请看博主yolo格式各种数据集集合链接:https://blog.csdn.net/DeepLearning_/article/details/127276492 里面涵盖了上百种yolo数据集,且在不断更新,基本都是实际项目使用。来自于网上收集、实际场景采集制作等,自己使用labelimg标注工具标注的。数据集质量绝对有保证! 本项目所使用的数据集,见csdn该资源下载页面中的介绍栏,里面有对应的下载链接,下载后可直接使用。 2、数据准备好,开始修改配置文件 参考代码中data文件夹下的banana_ripe.yaml,可以自己新建一个不同名称的yaml文件 train:训练集的图片路径 val:验证集的图片路径 names: 0: very-ripe 类别1 1: immature 类别2 2: mid-ripe 类别3 格式按照banana_ripe.yaml照葫芦画瓢就行,不需要过多参考网上的 3、修改train_dual.py中的配置参数,开始训练模型 方式一: 修改点: a.--weights参数,填入'yolov9-s.pt',博主训练的是yolov9-s,根据自己需求可自定义 b.--cfg参数,填入 models/detect/yolov9-c.yaml c.--data参数,填入data/banana_ripe.yaml,可自定义自己的yaml路径 d.--hyp参数,填入hyp.scratch-high.yaml e.--epochs参数,填入100或者200都行,根据自己的数据集可改 f.--batch-size参数,根据自己的电脑性能(显存大小)自定义修改 g.--device参数,一张显卡的话,就填0。没显卡,使用cpu训练,就填cpu h.--close-mosaic参数,填入15 以上修改好,直接pycharm中运行train_dual.py开始训练 方式二: 命令行方式,在pycharm中的终端窗口输入如下命令,可根据自己情况修改参数 官方示例:python train_dual.py --workers 8 --device 0 --batch 16 --data data/coco.yaml --img 640 --cfg models/detect/yolov9-c.yaml --weights '' --name yolov9-c --hyp hyp.scratch-high.yaml --min-items 0 --epochs 500 --close-mosaic 15 训练完会在runs/train文件下生成对应的训练文件及模型,后续测试可以拿来用。 三、测试 1、训练完,测试 修改detect_dual.py中的参数 --weights,改成上面训练得到的best.pt对应的路径 --source,需要测试的数据图片存放的位置,代码中的test_imgs --conf-thres,置信度阈值,自定义修改 --iou-thres,iou阈值,自定义修改 其他默认即可 pycharm中运行detect_dual.py 在runs/detect文件夹下存放检测结果图片或者视频 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值