TowardsDataScience 博客中文翻译 2019(一百七十)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

从简单到复杂的简单、引人入胜的条形图

原文:https://towardsdatascience.com/easy-bar-charts-from-simple-to-sophisticated-7270c03eced8?source=collection_archive---------15-----------------------

通过数据可视化讲述您的故事

想象一下生成数据可视化的最简单的代码。让我们从一个我们都见过并且都需要的形象化的条形图开始。

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

Beach bar chart, horizontal orientation.

条形图中的每个条形代表一个变量的类别或级别,该变量具有相对较少的唯一值,例如公司的各个部门。每个条形的高度对应于我们分配给该类别的数字。这个数字可以代表很多东西,例如,对于每个部门,雇员的平均工资,或者雇员的数量。

我们需要指令来创建一个如此简单的条形图,以至于计算机可以直接读取我们的想法。我们希望我们的默认可视化在没有编程的情况下看起来很棒。我们宁愿把时间花在分析和解释上,甚至(有时)做一些完全不同的事情,而不是弄清楚编码语法和调试。

最小的计算机输入应该提供最大的有用的计算机输出。

无论您是 R 专家还是 Python 专家,或者根本不是专家,都没有什么区别。为了简单起见,我们将条形图函数命名为BarChart。一个简单的函数调用就是一个简单的函数调用,不管是什么语言,所有人都可以访问。BarChart包含在我的 lessR 包中,是 R 生态系统的一部分。

数据帧

从哪里开始?

数据分析分析组织成表格的指定变量的数据值。

将您的数据值存储在数据表中。每一列都包含单个变量的数据值,例如下面的一些雇员的 Excel 表。

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

First six rows of data of a data table with an ID field and four variables: Years, Gender, Dept, and Salary.

用相对较少的非数字类别定义数据表中的每个分类变量,比如性别和部门。其他变量有连续的数值,如薪水。每行包含单个雇员的数据值。空白单元格表示缺少数据。

我们访问这种数据表的通用结构,无论是用 R 语言、Python 语言,还是在第一个广泛可用的数据分析系统中,都可以追溯到 20 世纪 70 年代初我的大学时代。当时,我在 IBM 360 大型机上用穿孔卡运行 SAS 和 SPSS 版进行数据分析,玩得很开心。你知道,在我们有那些连接到主机的高级终端之前,我们可以在屏幕上打字,更不用说携带我们自己的电脑了。从一开始,我们就将数据组织成分类变量和连续变量的数据表。

要开始分析,请将数据表中的数据值从某个外部文件(位于您的计算机系统或网络上)读取到存储在您正在运行的应用程序中的数据结构中。r 和 Python 把这个数据结构叫做数据帧。我们正是从数据框架开始数据分析的。

一个简单的读取函数,不出所料地被命名为Read,也是 lessR 包的一部分。Read用相同的函数调用将 Excel、text csv 逗号或制表符分隔、SAS、SPSS 或 R 数据文件读入 R 数据框。计算机不是完全哑的,所以让它弄清楚文件的类型。Read还提供各种输出来帮助你理解你的数据,并确保它被正确读取。

要使用,在响应 R 命令提示符>时,输入带数据位置的Read,用引号括起来。将输出定向到数据框。在这里,从文件的网址读取上图中引用的完整 Excel 文件。为简单起见,将我们新创建的数据框称为 *d,*是所有 lessR 数据分析函数的默认数据框名称。

d = Read("[http://web.pdx.edu/~gerbing/data/employee.xlsx](http://web.pdx.edu/~gerbing/data/employee.xlsx)")

要在您的计算机系统上浏览数据文件,而不是位置,不要在引号之间放置任何东西。

基本条形图

现在,我们有了编写最简单的函数调用所需的信息,可以创建每个部门中雇员数量的条形图。

从可视化函数创建可视化,该函数将数据作为变量名称引用。

这就是我们的函数名和我们希望绘制以获得条形图的变量。

默认条形图

要获得默认条形图,运行 R 应用程序(参见最后一节),访问 lessR 函数,读取您的数据,然后输入以下内容以响应 R 命令提示符,>。

BarChart(Dept)

如果你把你的数据框命名为 d ,就是这样。如果您愿意,可以包含参数 data ,这是一个名为 d 之外的数据帧所必需的。

BarChart(Dept, data=d)

无论哪种方式,得到以下可视化。

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

BarChart标注每个条形,如每个部门员工的百分比。从我们的可视化中,我们看到销售部门的员工比任何其他部门都多,占所有员工的 15%或 42%。金融从业人员最少,只有 4 人,占全部从业人员的 11%。

我们的默认条形图避免了枯燥的灰色。我们想要颜色,但不是任何颜色。我们希望防止一些条形(如亮红色)比其他条形(如深蓝色)更明显的感知偏差。条形图中的所有颜色都具有相同的亮度和强度。如果我们将彩色条纹放入 PhotoShop 等照片处理应用程序,并转换为灰度,所有条纹的灰度都相同。

我们想要许多易于实施的选项。如果我们愿意,可以水平翻转条形,或者用绘制的数值(这里是计数,而不是百分比)标记条形,或者完全关闭标记,甚至用灰色标记。我们希望所有这些选项都可以工作,而不必编写更多的代码行。

在创建我们伟大的图形时,我们可能会得到一些附带的统计输出。对于我们的条形图,自然输出是频率分布,我们的分类变量的每个类别的计数和比例。还包括相等类别比例的卡方检验。

进一步简化条形图函数调用的唯一方法是缩写。我们有。如果你厌倦了键入BarChart,就用bc,比如bc(Dept)

水平条形图

为了定制超出默认范围的代码,我们不想编写更多的代码。相反,请指定参数值。例如,要水平翻转图表,将参数 horiz 设置为 TRUE

BarChart(Dept, horiz=TRUE)

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

重新排列类别

默认情况下,R 按字母顺序排列类别。如果顺序是任意的,或者是按字母顺序排列的,这种方法就可以,否则就不行。

按数值对类别进行排序

一种重新排序的方法是使用参数 *sort 按数值对类别进行排序。*将值设置为“+”进行升序排序,或者设置为“-”进行降序排序,最大值优先。

BarChart(Dept, sort="-")

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

定义类别的任意顺序

r 可以将一个分类变量表示为一个因子,它允许对类别进行任何排序。用 R factor函数转换成一个因子,或者更简单更通用的 lessR 版本factors。用级别参数指定类别或级别的顺序。

在这里,将变量 Dept 转换为默认 d 数据框中的 R 因子,其中类别排序为财务第一,管理最后。然后将创建的因子保存回 d 数据框。同样,如果要转换的变量不在 d 数据框中,包括数据参数。

d = factors(Dept, levels=c("FINC", "MKTG", "SALE", "ACCT", "ADMN"))
BarChart(Dept)

现在条形图中的条形遵循指定的顺序。

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

两个分类变量的条形图

要向条形图添加第二个分类变量,请在函数调用中引用第二个变量的名称。

堆积条形图

同样,为了简单起见,让我们用来命名参数来表示第二个分类变量。

BarChart(Dept, by=Gender)

对于下面的条形图,条形图的大小与 just Dept 的第一个条形图相同,但现在每个条形图都分成两个部分。每种性别的部分相互堆叠,形成一个堆叠条形图

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

与前面的 just Dept 条形图一样,每个条形的高度对应于相关部门中的雇员数。现在我们有了额外的信息,每组变量的百分比。例如,销售部门的女性占 14%,这是基于整个分析中的员工总数。

并排条形图

你更愿意并排看到每个性别的条形图来强调他们的相对影响力吗?参数的时间在旁边。

BarChart(Dept, by=Gender, beside=TRUE)

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

BarChart不列出具有最小值的条形的百分比值。

百分比堆积条形图

另一个演示侧重于这些数据值在每个部门中的男女比例*,它代表第一分类变量的每个类别中的所有数据值。对应的条形图是一个堆积的 100%条形图,用参数 stack100 表示。*

BarChart(Dept, by=Gender, stack100=TRUE)

对于这种类型的条形图,所有的条形高度相同。每个条形代表第一个分类变量的每个类别中的所有数据值。

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

在这里,我们看到销售领域的男性人数是女性的两倍,分别为 67%和 33%,营销领域的女性人数比男性多得多,分别为 83%和 17%。

超过个计数的条形图

条形图与类别相关联的数字超出了计数的范围。对于垂直条形图,在水平轴或 x 轴上绘制分类变量的值。在纵轴或 y 轴上绘制数字。在前面的例子中,我们提供了变量 Dept 的值 x ,由此BarChart将计数计算为变量 y 的值。因此,前面的函数调用没有指定一个 y 变量。

绘制数值变量在不同类别中的平均值

为了绘制不同级别部门的可变工资的平均值,通知BarChart变量y-是基于工资的。用参数 stat 表示 yx 类别汇总的统计量。在这里画出每个部门的平均工资。

BarChart(Dept, Salary, stat="mean")

明确地说,包括 xy 参数的名称,在BarChart函数调用中写入x=Depty=Salary。或者,键入 less,如本例所示,并删除参数名。无论哪种方式,我们得到以下可视化。

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

除了“mean”,我们还可以选择统计数据“sum”“sd”“dev”“min”“median”“max”

“dev”表示每个类别相对于 y 变量平均值的偏差分数。绘制偏差分数强调了数值变量在类别间的差异。

BarChart(Dept, Salary, stat="dev")

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

在这个例子中,我们看到平均工资最高的是行政部门,平均来说,会计师的工资最低。

与典型的数值一样,更具信息性的可视化是根据它们的大小进行排序。我们再次调用排序选项。我们还包括一个新选项, fill_sort ,它为条形提供了两种颜色,在这里以 0 分割,以区分正负偏差。

BarChart(Dept, Salary, stat="dev", sort="+", fill_split=0)

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

跨类别按变量比较的级别

公司各个部门的男女平均工资有什么不同?现在我们把它们放在一个函数调用中。将第一个分类变量 x (部门)、数字变量 y (薪水)、第二个分类变量 by (性别)包括在一起,并指出 y 到每个类别组合平均值的转换。

BarChart(Dept, Salary, by=Gender, stat="mean", beside=TRUE)

当比较不同级别的平均值时,将级别绘制为相邻的条形可能更有意义,因此将参数旁边的设置为真*。*

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

BarChart的文本输出还包括标绘平均值的具体值。没有直接在横条上写数值的空间。

式样

对于特定的应用,你需要这些灰色吗?灰度和许多其他样式选项是可用的,太多了,无法在这里全部讨论。事实上,可视化的任何方面都可以定制。最有影响的两个参数是*填充、用于区域的颜色,例如条和点,以及颜色、*用于区域的边缘颜色,包括线段本身。

为了让我们的灰色不那么无聊,绘制一个从浅到深的灰度调色板。 lessR 包提供预定义的调色板,例如用于一系列灰色的“grays”。以 30 度的增量遍历色轮定义了其他 lessR 调色板:“reds”“rusts”browns”“greens”“emeralds”“turquoises”“aquas”“blues”“purples”“violets”“magentas”

BarChart(Dept, Salary, by=Gender, stat="mean", fill="grays")

性别在这些数据中只有两个值,因此结果条形图跨越两种颜色的灰色。

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

样式的另一个选项是改变整个地块的基本颜色主题,例如使用主题参数,但是我们将这个讨论留到下次。

统计数据表

之前说明的数据表包含记录的数据值,有时称为原始数据测量数据。所有之前的BarChart示例都是从读入数据框 d 的原始数据中创建可视化。从原始数据中,BarChart为您计算汇总,如计数或平均值,然后绘制计算值。

另一种可能是数据已经汇总。也许原始数据值甚至不可用。也许你在网上的某个地方看到了一些统计数据,现在你想要相应的条形图。

BarChart可以直接处理输入的统计汇总。BarChart将输入的数据评估为原始数据值或统计汇总,如计数或平均值。如果数据是原始数据值,则首先计算适当的统计概要。显示的条形图来自输入或计算的适当统计摘要。

例如,要直接从两个分类变量的列表计数中创建条形图,将相应的交叉列表作为数据表读入 R 数据框,通常再次命名为 d

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

其他都没变。BarChart函数调用与处理原始数据值时相同。当然,要确保在函数调用中包含分类变量和数值变量,如果需要的话,还可以通过包含分类变量。

所有的条形图

一个数据表可以,而且经常有许多变量,分类变量和连续变量的混合。数据分析通常始于检查分析中每个变量的分布,由每个分类变量的条形图表示。为了获得所有的条形图,不提供数据引用,即不通过变量提供 x,y,。如果您接受所有其他默认值,这意味着只有括号,根本没有输入值。

BarChart()

结果是数据框中每个分类变量的条形图和频率表。在开始分析之前,使用前述的factorfactors函数正确定义分类变量,以指定所选条形图的分类顺序。

让它发生

两个占主导地位的开源数据科学应用程序 R 和 Python 有时被视为竞争对手。与生活中的许多事情一样,计算机应用程序更倾向于相互合作。

r 和 Python 想成为朋友。

充分利用各自的优势,与同事一起工作,不管他们更喜欢 R 还是 Python。例如,在机器学习方面,很难比 Python 做得更好。并且很高兴在 r。

你更喜欢用 Python 来做数据清理和预处理,即数据分析中耗时的数据争论阶段吗?如果是这样,在您完成所有工作后,对 Python pandas [to_csv](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html)函数的简单函数调用将指定的清理数据帧写入一个 csv 文件。从那里,数据可以很容易地转移到任何数据分析系统中,比如使用前面提到的来自我的 lessR 包中的Read函数。

如果您像大多数分析师一样,从 RStudio 运行 R,您会得到通常的 R 控制台,但也会有一个用于可视化的专用窗口,可以访问您的文件目录等等。RStudio 还支持在同一个分析中混合使用 R 和 Python 代码。r 函数甚至可以直接访问 Python 数据帧,反之亦然!语言之间的障碍正在消失。

下载 r .选择 Windows ,或者 Mac (点击页面下方几段的链接,左边空白处)。

下载 RStudio 。选择第一个选项,RStudio 桌面,开源许可。

要访问 lessR 包中的功能,比如BarChart,你首先需要从官方的 R 服务器上下载这些功能。只有一次,当运行 R 时,输入以下内容进行下载。

install.packages("lessR")

你将自动下载 lessR 函数和数据集,以及几个依赖包。

从那时起,为了开始每个 R 会话,用library函数加载 lessR 函数。下面是一个完整的三行程序,它根据数据框中指定变量 Dept 的数据值创建一个条形图。在本例中,我们读取的数据与之前的员工数据文件相同,但是来自一个内置的 lessR 数据集——如果您想找点乐子,需要一些数据,并且不在互联网上,这很方便。

library("lessR")
d = Read("Employee")
BarChart(Dept)

它不是火箭科学。当然,一旦将数据值读入 R,就可以创建许多数据可视化和其他分析。

所以你有它。未来的文章将展示简单获得的其他可视化效果,包括对称为 Likert scales 的调查项目的响应的专用条形图。享受你的条形图吧。

要了解更多关于数据可视化的知识,使用 lessR 和其他可视化系统,请查看我在 CRC 出版社出版的 2020 年出版的书,R Visualizations:Derive Meaning from Data

使用 Datasist 实现简单的数据分析、可视化和建模(第 2 部分)

原文:https://towardsdatascience.com/easy-data-analysis-visualization-and-modeling-using-datasist-part-2-d2ce7fbf79e3?source=collection_archive---------33-----------------------

使用 datasist 库进行快速有效的数据分析

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

datasist logo

在这篇文章的第一部分,我们讨论了 datasist 中五个模块中的三个(structdata、feature_engineering 和 timeseries)。在这一部分,我们将讨论最后两个模块(可视化和模型)。

所以事不宜迟,让我们开始吧。

你将从这篇文章中学到什么:

  1. 使用 datasist 轻松实现可视化。

类别特征的可视化。

数字特征的可视化。

2.用 datasist 测试和比较机器学习模型。

在我们开始之前,让我们导入将用于该分析的数据集和库。如果你刚刚加入我们,我建议你阅读这篇文章的第一部分,这样你就能有效地跟进。

使用 datasist 轻松实现可视化

可视化模块是 datasist 中最好的模块之一。有很多功能可以让你用最少的代码创造出美观多彩的情节。在这篇文章中,我将重点介绍一些最重要的功能。

**注意:**可视化模块中的所有功能都在数据尺度上工作,而不是在特征尺度上。这意味着,您可以传入完整的数据集,并获得开箱即用的每个要素的可视化效果。还可以指定要打印的要素。

类别特征的可视化

分类特征的可视化包括柱状图、计数图等。让我们回顾一些可用的功能。

  1. boxplot: 该函数根据指定的分类目标列绘制所有数字特征的方框图。箱线图(或盒须图)以一种便于变量之间或分类变量水平之间比较的方式显示定量数据的分布。

注意:通过将 save_fig 参数设置为 True,可以将 datasist 生成的任何图保存为当前工作目录中的. png 文件。

ds.visualizations.boxplot(train_df, target='Claim')

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

2.**cat box:**cat box 功能用于根据指定的分类目标绘制数据集中所有分类特征的并排条形图。这有助于识别原因和模式,也有助于识别正确区分目标的特征。

注意: catbox 将只绘制具有有限数量的唯一类的分类特征。

ds.visualizations.catbox(train_df, target='Claim')

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

3.计数图:计数图简单地绘制了所有分类特征的柱状图,以显示它们的类别计数。

ds.visualizations.countplot(train_df)

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

数字特征的可视化

数字特征的可视化包括散点图、直方图、kde 图等。我们可以使用 datasist 中可用的函数在数据范围内轻松做到这一点。下面我们来回顾一下其中的一些。

4。直方图:这个函数绘制一个数据集中所有数字特征的直方图。这有助于显示特征的分布。

**注意:**要使用该功能,指定的要绘制的特征不能包含缺失值,否则会抛出错误。

在下面的示例中,要素 Building Dimension 和 Date _ of _ Occupancy 都包含缺失值。我们可以决定在绘图之前填充这些特征,或者我们可以传入我们想要的特征列表。

我会选择第一个选项,即填充缺失的值。

#fill the missing values 
df = ds.feature_engineering.fill_missing_num(train_df)ds.visualizations.histogram(df)

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

2.散点图:该函数根据指定的数值目标,绘制数据集中所有数值特征的散点图。它有助于显示特征之间的相关性。

feats = ['Insured_Period',
         'Residential',
         'Building Dimension',
         'Building_Type',
         'Date_of_Occupancy']ds.visualizations.scatterplot(train_df,num_features=feats, 
                                target='Building Dimension')

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

5。plot_missing: 顾名思义,这个函数可以用来可视化数据集中缺失的值。白色单元格表示缺失,黑色单元格表示未缺失。右上角的颜色范围显示缺失的强度。

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

  1. autoviz : Autoviz 是懒人的终极可视化功能。使用这个函数,您只需一行代码就可以可视化任何数据集。

要在 datasist 中使用 autoviz,首先必须安装 autoviz 包。要通过 pip 安装,请使用以下命令。

pip install autoviz

现在,让我们演示如何在 datasist 中使用 autoviz。

ds.visualizations.autoviz(train_df)

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

那不是很值得一看吗?只用一行代码就能快速完成任务,这真是令人惊讶。

可视化模块中可用的其他功能有 plot_auc、plot_confusion_matrix、violin_plot 等。要了解这些功能的更多信息,请访问此处

用 datasist 测试和比较机器学习模型

模型 模块包含测试和比较机器学习模型的函数。当前版本的 datasist 仅支持 scikit-learn 模型。我将重点介绍本模块中的一些重要功能,并演示如何使用它们。

首先我们从数据科学尼日利亚获取一个数据集,2019 新兵训练营竞赛页面这里 。任务是根据建筑观察预测保险索赔(1 =索赔,0 =无索赔)。我们会做一些基础的数据预处理,为建模做好数据准备。

注意:这个分析的目标是演示如何使用 datasist 中的模型模块,所以我们不会做任何繁重的特性工程。

接下来,让我们看看特性定义,以了解变量。

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

接下来,我们做一些处理。首先,我们删除 Id 列(客户 ID ),然后填充缺失的数字和分类特征。

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

现在我们有了一个正确填充的数据集,我们将根据唯一类的数量使用标签编码或一种热编码对所有分类要素进行编码。

#check the unique classes in each categorical feature
ds.structdata.class_count(train)

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

我们将标记 encode Geo_Code,因为唯一的类很大,而 one-hot-encode 其余的类。

现在,让我们讨论一下模型模块中可用的函数,我们可以在处理过的数据集上使用这些函数。

  1. compare_model :这个模型将多个机器学习模型作为参数,并返回一个显示每个模型性能的图。这可用于选择基础模型以进行进一步优化。 compare_model 也返回一组训练好的模型和它们相应的分数。

现在,让我们看看这个函数的运行情况。我们将比较三种模型(RandomForest、LightGBM 和 XGBoost)。

**注意:**在这篇文章中,我们不会执行任何高级超参数调整。目标是向您展示如何使用 datasist 中可用的函数,而不是大量的超参数调优。

此外,在尝试这一部分之前,您必须安装 lightgbm 和 xgboost。或者,您可以使用 scikit-learn 中的默认模型。要安装 lightgbm 请转到她的 e ,要安装 xgboost, 请转到这里。

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

从结果图来看,LGBMClassifier 是目前最好的模型。假设我们对这个模型满意,我们可以通过访问返回的模型列表进行预测。

pred = models[1].predict(Xtest)

2.get _ class ification _ report:我们可以通过get _ class ification _ report函数得到一个分类任务的详细指标报告。它接受预测类和真值作为参数。

ds.model.get_classification_report(pred, ytest)

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

3.plot _ feature _ importance:该函数将数据集中最重要的特征绘制成一个条形图,供训练模型使用。

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

注意:我们用一个分类问题演示了这里的例子。您可以将相同的函数应用于您的回归问题,它会工作得很好。

查看 API 文档 了解模型模块中可用的其他功能。

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

而我们已经到了这篇文章的结尾。我相信你现在很渴望在你的下一个项目中使用 datasist。

随着我们添加更多功能,datalist 将会继续发展。如果你想让它变得更好,请查看我们的投稿指南这里,如果你想报告一个 bug 问题或对一个功能有想法,请访问我们的 GitHub 问题页面这里。如果这个项目对你有用,别忘了在 GitHub 上给我们留下一颗星。

最后,如果您在您的项目中使用了 datasist,请告诉我们,以便我们可以在我们的页面上展示您。

点击 找到我们的投稿人名单

链接到 GitHub 上的 datasist repo

链接到文档

链接 举例用法

TwitterLinkedIn上找我

给我发邮件:risingodegua@gmail.com

简单的一键式 Jupyter 笔记本

原文:https://towardsdatascience.com/easy-devops-for-data-science-with-saturn-cloud-notebooks-d19e8c4d1772?source=collection_archive---------33-----------------------

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

What society thinks Data Scientists look like. Source

我为学习者写了一份名为《强大的知识》的时事通讯。每一期都包含链接和最佳内容的关键课程,包括引文、书籍、文章、播客和视频。每一个人都是为了学习如何过上更明智、更快乐、更充实的生活而被挑选出来的。 在这里报名

数据科学可以是一件有趣的事情!

事实上,我们所做的大部分事情都是在挖掘数据的同时试图提取隐藏的信息。这就像我们在一个未知的丛林中寻找宝藏!

但它并不总是有趣和游戏。

在幕后,建立数据科学家用于工作的实际平台需要做很多工作。创建服务器、安装必要的软件和环境、建立安全协议等等。

完成所有这些工作通常需要一名专门的 DevOps 工程师。了解云服务、操作系统、网络的来龙去脉,至少了解一点数据科学和机器学习软件的知识,以便正确设置它。

但是,如果有一种方法,我们可以绕过所有繁琐的开发工作,直接进入我们的数据科学呢?

一项名为土星云的新服务让数据科学家可以做到这一点:跳过繁琐的设置,直接进入数据科学!

数据科学的土星云和 DevOps

花点时间想想为数据科学家有效工作而设置环境所涉及的所有事项。对于许多公司来说,这看起来像是:

  1. 创建和配置服务器。理想情况下,这些应该在服务器能力和实例数量方面都很容易扩展
  2. 在所有服务器上安装软件。软件应该易于更新
  3. 配置安全性。保护任何敏感数据、代码或 ML 模型
  4. 配置网络。服务器应该可以在特定的端口被特定的人访问。

所有这些都需要大量的时间,尤其是第 1 步和第 2 步。许多数据科学家甚至从未见过这些事情发生——他们只看到最终产品。但是设置所有这些基础设施是一个真正的挑战,其中一些需要不断更新。

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

DevOps engineers constantly catering to the ever-changing needs of Data Scientists

Saturn Cloud 自称为云托管数据科学,它允许数据科学家轻松地在云上提供和托管他们的工作,而不需要专门的开发人员。然后,您可以在 Juptyer 笔记本中工作,该笔记本位于您指定的服务器上,由系统创建。

所有软件、网络、安全和库的设置都由 Saturn Cloud 系统自动处理。然后,数据科学家可以专注于实际的数据科学,而不是围绕它的乏味的基础设施工作。

这个想法是,用户(你和我,数据科学家)可以简单地指定我们想要的计算,输入我们想要的软件库列表,土星云系统将处理其余的设置。

如何使用托管的 Jupyter 笔记本

要开始,只需进入土星云网站并创建一个账户。基本计划是完全免费的,所以你可以先在环境中摸索一下。

登录后,点击“您的仪表板”选项卡,开始创建一个托管 Jupyter 笔记本的服务器。下面的视频展示了如何创建你的服务器!

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

您将基本上经历以下步骤:

  1. 为笔记本指定一个名称
  2. 指定您想要的存储量
  3. 指定您想要使用的 CPU 或 GPU
  4. 如果需要,设置自动关机
  5. 列出您希望安装在系统上的任何软件包或库

一旦你点击创建按钮,你的服务器将自动创建所需的设置和软件。当创作完成时——瞧!您的云托管 Jupyter 笔记本已准备好用于数据科学!

在您的仪表板顶部,您会看到启动、停止、编辑和删除笔记本云服务器的按钮。对于本教程的下一部分,我已经编辑了我的服务器,安装了 pandas 和 matplotlib。

要访问您的云托管 Jupyter 笔记本,请点击“转到 Jupyter 笔记本”链接。将打开一个选项卡,其中有 Jupyter 笔记本界面设置,您可以从中创建 Python 3 笔记本!

我已经在下面的视频中创建了我的笔记本。一旦你的笔记本创建完成,你就可以开始编码了!我提前准备了一些代码来绘制鸢尾花数据集。土星云能够平稳无缝地运行一切。

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

除了托管 Jupyter 笔记本,土星云还允许你公开或私下发布你的笔记本。当您发布您的笔记本时,您将获得一个 URL,然后您可以与任何想要运行您的笔记本的人共享该 URL:随时随地。查看我的这里

喜欢学习?

在 twitter 上关注我,我会在这里发布所有最新最棒的人工智能、技术和科学!也在 LinkedIn 上和我联系吧!

使用 TensorFlow 2.0 轻松进行图像分类

原文:https://towardsdatascience.com/easy-image-classification-with-tensorflow-2-0-f734fee52d13?source=collection_archive---------2-----------------------

G etting 从 TensorFlow 2.0 alpha 的改进高级 API 开始

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

具有重大优势的主要版本

在 2019 年 TensorFlow Dev 峰会上,谷歌推出了 TensorFlow 2.0 的 alpha 版本。从历史上看,TensorFlow 被认为是机器学习框架的“工业车床”:一个强大的工具,具有令人生畏的复杂性和陡峭的学习曲线。如果你过去用过 TensorFlow 1.x,你就知道我在说什么。这个 2.0 版本代表了为提高 TensorFlow 的可用性、清晰性和灵活性所做的共同努力。以下是一些亮点:

  • 默认情况下,会启用急切执行,而不会牺牲基于图形的执行的性能优化。
  • API 更干净,更一致,冗余更少。
  • 作为高级 API 的更紧密的 Keras 集成。
  • 还有更

因此,TensorFlow 2.0 更加 Pythonic 化,学习起来不那么令人畏惧,同时保留了较低级别的定制和复杂性(如果需要的话)。让我们从 TensorFlow 2.0 开始,探索如何在经典图像分类设置中应用其高级 API。

在 Colab 上安装 TensorFlow 2.0 alpha

谷歌合作实验室让在云中设置 Python 笔记本变得非常容易。由于每次可以免费访问 GPU 长达 12 小时,Colab 很快成为我进行机器学习实验的首选平台。

让我们通过 pip 在一台 Colab 笔记本上安装 TensorFlow 2.0 alpha 版本(GPU 版)。

!pip install tensorflow-gpu==2.0.0-alpha0

要验证其安装是否正确:

import tensorflow as tf
print(tf.__version)# Output: 2.0.0-alpha0

你应该可以走了!如果您遇到问题,请在“编辑”>“笔记本设置”中仔细检查您的 Colab 运行时是否将“GPU”作为运行时加速器。

使用 tf.data.Dataset 加载数据

让我们使用 Kaggle 上的空中仙人掌识别比赛的数据集。我们的任务是建立一个分类器,能够确定一个航拍图像是否包含柱状仙人掌。该数据集是 Cactus 航空照片数据集[1]的修改版本(Kaggle 将每个图像的大小调整为 32x32 像素)。

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

Example image with cactus

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

Example image with no cactus (upscaled 4x)

例如从 Kaggle 下载/解压缩数据集的代码,请参见完整笔记本,此处为

让我们使用 pandas 将图像文件路径及其相应的标签加载到列表中,然后使用 sklearn.model_selection 创建一个 90–10 的训练验证分割。

train_csv = pd.read_csv('data/train.csv')# Prepend image filenames in train/ with relative path
filenames = ['train/' + fname for fname in train_csv['id'].tolist()]
labels = train_csv['has_cactus'].tolist()train_filenames, val_filenames, train_labels, val_labels = 
  train_test_split(filenames,
                 labels,
                 train_size=0.9,
                 random_state=42)

现在我们已经将图像文件名和标签分成了训练集和验证集,我们可以创建各自的 tf.data.Dataset 对象。

train_data = tf.data.Dataset.from_tensor_slices(
  (tf.constant(train_filenames), tf.constant(train_labels))
)val_data = tf.data.Dataset.from_tensor_slices(
  (tf.constant(val_filenames), tf.constant(val_labels))
)

然而,我们的数据集仍然只包含图像文件名,而不是实际的图像。我们需要定义一个函数,可以从文件中加载图像,并执行任何必要的预处理。当我们这样做的时候,让我们也对数据集进行洗牌和批处理。

IMAGE_SIZE = 96 # Minimum image size for use with MobileNetV2BATCH_SIZE = 32# Function to load and preprocess each image
def _parse_fn(filename, label):
    img = tf.io.read_file(img)
    img = tf.image.decode_jpeg(img)
    img = (tf.cast(img, tf.float32)/127.5) - 1
    img = tf.image.resize(img, (IMAGE_SIZE, IMAGE_SIZE))
    return img, label # Run _parse_fn over each example in train and val datasets
# Also shuffle and create batchestrain_data = (train_data.map(_parse_fn)
             .shuffle(buffer_size=10000)
             .batch(BATCH_SIZE)
             )val_data = (val_data.map(_parse_fn)
           .shuffle(buffer_size=10000)
           .batch(BATCH_SIZE)
           )

构建迁移学习模型

迁移学习通过使我们能够重复使用现有的预训练图像分类模型来加速训练,只需要重新训练网络的顶层来确定图像可以属于的类别[2]。

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

Diagram illustrating transfer learning

让我们使用 TensorFlow 2.0 的高级 Keras API 来快速构建我们的图像分类模型。对于迁移学习,我们可以使用预训练的 MobileNetV2 模型作为特征检测器。MobileNetV2 是由 Google 发布的 MobileNet 的第二个迭代,目标是比 ResNet 和 Inception 等模型更小、更轻量级,以便在移动设备上运行[3]。让我们加载在 ImageNet 上预训练的没有顶层的 MobileNetV2 模型,冻结其权重,并添加新的分类头。

IMG_SHAPE = (IMAGE_SIZE, IMAGE_SIZE, 3)# Pre-trained model with MobileNetV2
base_model = tf.keras.applications.MobileNetV2(
    input_shape=IMG_SHAPE,
    include_top=False,
    weights='imagenet'
)# Freeze the pre-trained model weights
base_model.trainable = False# Trainable classification head
maxpool_layer = tf.keras.layers.GlobalMaxPooling2D()
prediction_layer = tf.keras.layers.Dense(1, activation='sigmoid')# Layer classification head with feature detector
model = tf.keras.Sequential([
    base_model,
    maxpool_layer,
    prediction_layer
])learning_rate = 0.0001# Compile the model
model.compile(optimizer=tf.keras.optimizers.Adam(lr=learning_rate), 
              loss='binary_crossentropy',
              metrics=['accuracy']
)

注意,建议使用 TensorFlow 优化器训练tf.keras模型。在 TensorFlow 2.0 中,之前tf.traintf.keras.optimizersAPI 中的优化器已经统一在tf.keras.optimizers下,其中原来的tf.keras优化器已经被升级后的 TensorFlow 优化器所取代【4】。因此,应用 TensorFlow 优化器现在是一种更简单、更一致的体验,完全支持使用tf.keras API,并且不会牺牲性能。

训练模型

TensorFlow 2.0 中的tf.keras API 现在已经完全支持tf.data API,因此我们可以在训练模型时轻松使用我们的tf.data.Dataset对象[5]。同样,现在默认情况下,训练会被急切地执行,而不会牺牲基于图形的执行的性能优势。

num_epochs = 30
steps_per_epoch = round(num_train)//BATCH_SIZE
val_steps = 20model.fit(train_data.repeat(),
          epochs=num_epochs,
          steps_per_epoch = steps_per_epoch,
          validation_data=val_data.repeat(), 
          validation_steps=val_steps)

经过 30 个时期后,模型的验证精度从大约 0.63 提高到 0.94。

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

Accuracy and loss over 30 epochs of transfer learning

微调模型

让我们试着进一步提高我们模型的准确性。当我们应用迁移学习时,我们只训练模型的新分类头,冻结来自 MobileNetV2 的权重。如果我们最初不冻结这些权重,模型将“忘记”它开始时的所有知识,因为新的分类头是随机初始化的[2]。然而,现在我们已经首先训练了分类头,我们可以在预训练的模型中解冻层,以在这个特定的数据集上进行微调。

*# Unfreeze all layers of MobileNetV2*
base_model.trainable = **True**

*# Refreeze layers until the layers we want to fine-tune*
**for** layer **in** base_model.layers[:100]:
  layer.trainable =  **False**# Use a lower learning rate
lr_finetune = learning_rate / 10# Recompile the model
model.compile(loss='binary_crossentropy',
              optimizer = tf.keras.optimizers.Adam(lr=lr_finetune),
              metrics=['accuracy'])# Increase training epochs for fine-tuning
fine_tune_epochs = 30
total_epochs =  num_epochs + fine_tune_epochs # Fine-tune model
# Note: Set initial_epoch to begin training after epoch 30 since we
# previously trained for 30 epochs.model.fit(train_data.repeat(), 
          steps_per_epoch = steps_per_epoch,
          epochs=total_epochs, 
          initial_epoch = num_epochs,
          validation_data=val_data.repeat(), 
          validation_steps=val_steps)

在另外 30 个时期的微调后,该模型达到了 0.986 的验证精度。基于准确度和损失图,更多的时期可能导致更大的改进。

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

Accuracy and loss with additional 30 epochs of fine-tuning

摘要

在这篇文章中,我们了解了 TensorFlow 2.0 对可用性、清晰度和灵活性的关注如何使 TensorFlow 在机器学习实验中的入门变得不那么令人生畏。热切的执行和改进的高级 API 抽象出了 TensorFlow 通常的复杂性,使其更容易快速实施和运行典型的图像分类实验。

在撰写本文时,这只是 TensorFlow 2.0 的 alpha 版本,最终版本预计将在今年晚些时候发布。显然,TensorFlow 团队正在打造一个更加直观的 TensorFlow 迭代。这可能会全面提高机器学习工程师的生产率,降低通常的复杂性,同时为那些需要的人保留较低层次的控制。此外,虽然 TensorFlow 已经是机器学习专家的热门选择,但更平滑的学习曲线也使其对初学者更具吸引力。

请在评论中告诉我你对 TensorFlow 2.0 目前为止的看法!另外,如果你对本教程的完整代码感兴趣, 参见笔记本这里的 。如果你有任何问题,也不要犹豫,在评论区提问。

参考

本教程的灵感来自于使用 TensorFlow.org 的预训练网络进行迁移学习。阅读教程原文,见此处

[1]Kaggle.com j .瓦斯奎兹-戈麦斯仙人掌航拍照片 (2019)

[2] 利用预训练的 ConvNets 进行迁移学习 (2019),TensorFlow.org

[3] M. Sandler,A. Howard,m . Zhmonginov,L. C. Chen, MobileNetV2:反向残差和线性瓶颈 (2019),谷歌公司。

[4] F. Chollet, TensorFlow 2.0:优化器统一 (2018),TensorFlow GitHub

[5] 路线图 (2019),TensorFlow.org

浏览器中的简易机器学习:实时图像分类

原文:https://towardsdatascience.com/easy-machine-learning-in-the-browser-31b225d6cee0?source=collection_archive---------24-----------------------

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

Photo by Kasya Shahovskaya on Unsplash

利用 Tensorflow.js KNN 模块和 Angular 在浏览器中训练实时图像识别模型

将机器学习应用部署到生产环境中曾经是一个令人望而生畏的过程,因为它需要在许多不同的环境中处理复杂的操作。随着 Tensorflow.js 的引入,使用 javascript 在 web 浏览器中开发、训练和部署机器学习应用程序变得超级容易。

为了演示这一点,我将使用 Angular 创建一个简化版本的可示教机器演示应用程序。这个演示应用程序教你的计算机使用你的网络摄像头在网络浏览器中实时识别图像。

为了实现这一点,我将使用 Tensorflow.js 提供的 KNN 模块。该模块使用的 K-最近邻算法创建一个分类器。它不是为模型提供权重,而是使用另一个模型的激活来创建 KNN 模型。

为此,mobilenet 图像分类模型是一个非常好的选择,因为它是轻量级的,可以在 Tensorflow 中使用。机器学习中的这一过程被称为迁移学习,因为我们使用的是另一种机器学习模型的表示。

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

Photo by Andrii Podilnyk on Unsplash

在深入细节之前,让我们首先更好地了解应用程序中遵循的步骤是什么;

Step1:

用户应提供并标记用于训练的 3 组输入图像。网络摄像头和浏览器上的按钮可用于此目的。

第二步 :

一旦为所有输入图像提供了标签,将通过将输入图像转储到 mobilenet 模型中来预测激活张量。然后,这些激活张量将被用作 KNN 分类器的输入,以创建具有分配给所提供的每个激活张量的标签的数据集。培训过程将在这一步完成。

步骤三:

对于预测,从网络摄像头捕捉的图像将被实时输入 mobilenet 模型,以获得激活张量。这些将被输入到训练好的 KNN 模型中,以识别图像的类别。

一开始看起来有点复杂,但是一旦用例子一步一步地解释,就很容易理解了。

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

Photo by Robert Baker on Unsplash

在开始编码之前,让我们进一步了解 K-最近邻算法和 Tensorflow.js KNN 模块是如何工作的。

K 近邻算法是如何工作的?

k 近邻(KNN)是一种简单、易于实现的机器学习算法,在推荐系统和基于相似性的分类任务中有许多实际用途。

它将示例存储为带标签的类。当你需要预测一个新例子的类别时,它会计算这个新例子和所有其他已经被标记和已知的例子之间的距离。k 是最近邻居的数量。此时,通过邻居的多数投票来完成分类。

你可以点击这个链接获得更多关于 KNN 算法的信息。

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

Photo by Nina Strehl on Unsplash

Tensorflow.js KNN 模块

要使用 Tensorflow.js KNN 模块,必须将已知示例添加到分类器中。这是通过 addExample 方法完成的。在我们的例子中,已知的例子将通过身体姿态图像生成,这些图像是从实时网络摄像头获取的。这将是 KNN 算法的训练阶段。一旦完成,我们将能够用预测类方法预测未知的身体姿势。

***//importing tensorflow.js KNN module***
import * as knnClassifier from ‘@tensorflow-models/knn-classifier’;***//instantiating the classifier***
classifier = knnClassifier.**create()*****//adding examples to the KNN model for training***
classifier.**addExample**(example: tf.Tensor,label: number|string): void;***//predicting unknown examples with the trained KNN classifier***
classifier.**predictClass**(input: tf.Tensor,k = 3): Promise<{label: string, classIndex: number, confidences: {[classId: number]: number}}>;

这是足够的理论!

让我们把这个理论付诸实践吧!

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

Photo by Jakob Owens on Unsplash

此时,我们必须生成我们的 Angular WebApp。下面介绍的所有打字稿代码都必须在 app.component.ts.

如果你想了解更多关于如何生成 Angular WebApp,你可以查看我以前的帖子。

[## 使用 Tensorflow.js 和 Angular 构建实时对象检测 WebApp

张量流。射流研究…

medium.com](https://medium.com/@erdemisbilen/building-realtime-object-detection-webapp-with-tensorflow-js-and-angular-a4ff5062bdf1)

让我们首先启动网络摄像头和模型。

init_webcam()
{
***// Get the HTMLVideoElement*** this.video = <HTMLVideoElement> document.getElementById("vid");***// Start webcam stream***
navigator.mediaDevices.getUserMedia({audio: false, video: {facingMode: "user"}}).then(*stream* *=>*{
this.video.srcObject = stream;
this.video.onloadedmetadata = () *=>* {this.video.play();};});
}async init_models()
{
***// Initiate the KNN classifier***
this.classifier = await knnClassifier.create();
*console*.log('KNN classifier is loaded')***// Load mobilenet model***
*const* mobilenet =  await tf.loadLayersModel('https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_224/model.json');
*console*.log('Mobilenet model is loaded')***// Modify the mobilenet model so that we can get the activations from 'conv_preds' layer*** *const* outputLayer=mobilenet.getLayer('conv_preds');
this.mobilenetModified = tf.model({inputs: mobilenet.inputs, outputs: outputLayer.output, name: 'modelModified' });
*console*.log('MobilenetModified model is generated')
}

下一步是创建一个函数,将示例添加到我们刚刚启动的 KNN 分类器中。这个函数接受定义我们添加的示例类的参数 className

addExample(*className*)
{
***// Get the image from the video feed and convert it to tensor*** *let* img=tf.browser.fromPixels(<HTMLVideoElement> document.getElementById("vid"));***// Get the activations from the mobilenet model*** *let* logits = <tf.Tensor> this.mobilenetModified.predict(img.expandDims());***// Add the activations as an example into the KNN model with a class name assigned*** this.classifier.addExample(logits, className);***// Show the stored image on the browser*** *let* canvas = <HTMLCanvasElement> document.getElementById("canvas");
*let* ctx = canvas.getContext("2d");
ctx.drawImage(<HTMLVideoElement> document.getElementById("vid"),0,0,224,224)
*console*.log('KNN example added')
}

然后我们需要创建一个函数来预测未知的例子。

***// Calls detectFrame with video, mobilenet and KNN arguments***
predict()
{this.detectFrame(this.video,this.mobilenetModified, this.classifier);
}***// Performs real-time predictions continuously by generating the activations of images produced from video feed. Then it predicts the class of the image based on the similarity with stored examples.***detectFrame = (*video*, *mobileNetModel*, *KNNModel*) *=>* {*const* predictions= <tf.Tensor> mobileNetModel.predict(tf.browser.fromPixels(video).expandDims());KNNModel.predictClass(predictions).then(*result=>* {this.renderPredictions(result);requestAnimationFrame(() *=>* {
this.detectFrame(video, mobileNetModel, KNNModel);});});
}***//Writes KNNClassifier results to the console***
renderPredictions = *result* *=>* {*console*.log(result)};

最后一步是修改app.component.html,将必要的UI 元素放到应用程序中。

<h1>Easy Machine Learning in the Browser: Real-time Image Classification</h1><video  id="vid" width="224" height="224"></video>
<canvas id="canvas" width="224" height="224"></canvas><button mat-button (click)="addExample('0')">Add Example Class1</button>
<button mat-button (click)="addExample('1')">Add Example Class2</button>
<button mat-button (click)="addExample('2')">Add Example Class3</button><button mat-button (click)="predict()">Predict</button>

干得好!

您已经做了这么多,并且创建了一个 web 应用程序来对浏览器中的图像进行分类。

在地图上绘制地理数据的简单步骤 Python

原文:https://towardsdatascience.com/easy-steps-to-plot-geographic-data-on-a-map-python-11217859a2db?source=collection_archive---------0-----------------------

A 假设你在一家创业公司工作,需要对用户的地理数据进行空间数据分析和预测。或者,您的公司运行大量的交付操作,您的工作再次分析、可视化并可能预测司机或用户的地理数据。因此,在地图上可视化您的数据(可能是预测的数据)将是非常必要的。

在本文中,我将介绍如何使用 Python 在任何地图上绘制地理数据的简单步骤。我发现它在我以前的项目中非常有用和有帮助,使用相同的语言:Python-检查我的文章:交通管理的空间数据分析

当然,当我们提到地理数据时,我们脑海中浮现的是数据点的坐标:经度和纬度。这是真的,它们只是地图上特定点的 X 和 Y 坐标。然而,还有其他类型的地理数据,如多边形、线数据。这里主要关注如何在地图上可视化点数据。我们可以开始了吗?

加载库和数据集

首先,让我们从加载库开始

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

加载空间数据集

df = pd.read_csv(‘C:/.. …/SpatialDataSet.txt’)

看一看数据集

df.head()

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

我的数据集很简单(1444 行× 2 列)。为了这次演示,我在利雅得市收集了随机的地理数据点。

定义边界框

现在,我们必须定义边界框。边界框是由两个经度和两个纬度定义的区域,它将包括所有的空间点。

BBox = ((df.longitude.min(),   df.longitude.max(),      
         df.latitude.min(), df.latitude.max())> (46.5691,46.8398, 24.6128, 24.8256)

拿你的地图

进入 opestreetmap.org 网站,首先输入边界框数据,将所需地图导出为图像。我按照下图中的解释做了同样的事情(这里也提到了更多的细节:导出地图图像的步骤)。

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

返回编码环境并加载地图图像:

ruh_m = plt.imread('C:/.. … /Riyadh_map.png')

最后一步:绘图

最后,在’ ruh_m ‘地图图像上绘制’测向经度’和’测向纬度’坐标作为散点。注意,根据边界框’ BBox '设置 X 轴和 Y 轴很重要

fig, ax = plt.subplots(figsize = (8,7))ax.scatter(df.longitude, df.latitude, zorder=1, alpha= 0.2, c='b', s=10)ax.set_title('Plotting Spatial Data on Riyadh Map')
ax.set_xlim(BBox[0],BBox[1])
ax.set_ylim(BBox[2],BBox[3])ax.imshow(ruh_m, zorder=0, extent = BBox, aspect= 'equal')

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

使用 Python 实现简单的文本到语音转换

原文:https://towardsdatascience.com/easy-text-to-speech-with-python-bfb34250036e?source=collection_archive---------1-----------------------

文本到语音

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

Photo by Oleg Ivanov on Unsplash

文本到语音(TTS)技术大声朗读数字文本。它可以将电脑、智能手机、平板电脑上的文字转换成音频。此外,各种文本文件都可以大声朗读,包括 Word、pages 文档、在线网页都可以大声朗读。TTS 可以帮助阅读困难的孩子。有许多工具和应用程序可以将文本转换成语音。

Python 附带了许多方便易用的库,在本文中,我们将探讨如何使用 Python 实现文本到语音的转换。

为了将文本转换成语音,Python 中提供了不同的 API。其中一个 API 是 Google 文本到语音转换,通常称为 gTTS API。这是非常容易使用的库转换输入的文本到一个音频文件,可以保存为 mp3 文件。它支持多种语言,语音可以以两种音频速度中的任何一种传送,快或慢。更多详情可在这里找到

将文本转换成语音

代码:

导入 gTTS 库和“os”模块以播放转换后的音频

from gtts import gTTS 
import os

创建一个我们想要转换成音频的文本

text = “Global warming is the long-term rise in the average temperature of the Earth’s climate system”

gTTS 支持多种语言。请在这里查阅文档。选择’ en’ - >英语并存储在语言变量中

language = ‘en’

创建一个名为 speech 的对象,并将文本和语言传递给引擎。标记为 slow = False,告知模块转换后的音频应具有高速。

speech = gTTS(text = text, lang = language, slow = False)

将转换后的音频保存在名为“text.mp3”的 mp3 文件中

speech.save(“text.mp3”)

使用 Windows 命令“开始”,后跟 mp3 文件名,播放转换后的文件。

os.system(“start text.mp3”)

输出

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

text.mp3 file

The output of the above program saved as text.mp3 file. Mp3 file should be a voice saying, 'Global warming is the long-term rise in the average temperature of the Earth’s climate system'

将文本文件转换成语音

这里,将文本文件转换成语音。读取文本文件并传递给 gTTS 模块

密码

导入 gtt 和 os 库

from gtts import gTTS 
import os

读取文本文件并存储到名为 text 的对象中。我的文件名是“draft.txt”

file = open("draft.txt", "r").read().replace("\n", " ")

选择语言英语

language = ‘en’

将文本文件传递到 gTTS 模块并存储到语音中

speech = gTTS(text = str(file), lang = language, slow = False)

将转换后的音频保存在名为“voice.mp3”的 mp3 文件中

speech.save("voice.mp3")

播放 mp3 文件

os.system("start voice.mp3")

输出

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

已将 draft.txt 文件转换为 voice.mp3

Draft.txt file saved as a voice.mp3 file.Play the Mp3 file to listen the text presented in the draft.txt file

注意:

GTTS 是一个将文本转换为语音的简单工具,但它需要互联网连接才能运行,因为它完全依赖谷歌来获取音频数据。

感谢阅读。请继续学习,并关注更多内容!

你也可以在 KDnuggets 上阅读这篇文章。

用 BeautifulSoup 和 ElementTree 解析 eCFR

原文:https://towardsdatascience.com/ecfr-parsing-with-beautifulsoup-and-elementtree-8cf9d3ef8178?source=collection_archive---------21-----------------------

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

Photo by Fabian Irsara on Unsplash

想象一下,你正试图理解在标题 16 商业惯例联邦法规(CFR) 中公布的一般和永久规则。目前,您拥有联邦法规电子代码(eCFR) 供您使用。然而,在浏览之后,你意识到要找到你需要的信息需要太多的点击。如果您可以提取所有内容并将其保存到一个数据集,会怎么样?嗯,你可以,有了像 ElementTreeBeautifulSoup 这样的 Python 库。

下面是我所有的全注释代码,我用它们中的任何一个库来解析 eCFR 标题 16 的 XML。作为奖励,我也只用 BeautifulSoup 写了 PySpark 代码,所以如果你对那个感兴趣,点击这里

用 BeautifulSoup 解析

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

在上面的代码片段中,我导入了我需要的所有库——创建数据帧的 Pandas、发送请求的 requests、使用正则表达式的 re 和用于解析的 BeautifulSoup。然后,我向 url 发送请求以检索其数据,并将其存储在变量xml_bs中。然后我将xml_bs传递给bs,后者返回一个 BeautifulSoup 对象,将 XML 文档表示为一个嵌套的数据结构。

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

虽然代码被完全注释掉了,但我将在下一个代码片段中提供更多的上下文。我创建了一个空列表,迭代地追加我检索到的所有数据。然后,我使用.find_all()找到所有的DIV3元素,并将它们存储在变量chapters_bs中。从那里,我开始遍历我的soup对象,寻找与DIV3元素相关的属性或标签,并将它们保存到各自的变量中。我继续像这样嵌套我的 for 循环并访问父对象 prior,这允许我保留我的 XML 文档的层次结构。请注意,我在部分级别附加了我的所有数据。

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

上面接下来的几个步骤非常简单——我将我的数据保存到 Pandas DataFrame,编写一个 for 循环来删除任何前导或尾随空格,编写一个正则表达式来删除我的section_text列中的标签和 ASCII 字符,并显示我的数据的前五行。

使用 ElementTree 解析

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

同样,在上面的代码片段中,我导入了我需要的所有库——除了用于解析的 ElementTree 之外,所有库都是相同的。我向 url 发送了一个请求来检索它的数据,并将其存储在变量xml_et中。然后我传递xml_etfromstring(),后者将来自我的响应内容的 XML 解析成一个元素,这个元素是解析树的根元素。

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

这里的大部分代码保持不变,但是我将从头到尾再看一遍,以防您跳过。我创建了一个空列表,迭代地追加我检索到的所有数据。然后,我使用.iter()找到所有的DIV3元素,并将它们存储在变量chapters_et中。从那里,我开始遍历我的root对象,寻找与DIV3元素相关的属性或标签,并将它们保存到各自的变量中。我继续像这样嵌套我的 for 循环并访问父对象 prior,这允许我保留我的 XML 文档的层次结构。请注意,我在部分级别附加了我的所有数据。

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

同样,上面接下来的几个步骤很简单——我将我的数据保存到 Pandas DataFrame,编写一个 for 循环来删除任何前导或尾随空格,编写一个正则表达式来删除我的section_text列中的标签和 ASCII 字符,并显示我的数据的前五行。

一如既往,感谢阅读。

Ecom 数据系列:什么是电子商务数据科学?

原文:https://towardsdatascience.com/ecom-data-cooler-series-what-is-data-science-f803d1e07cb4?source=collection_archive---------19-----------------------

让电子商务数据科学概念变得简单,一次一个主题。

大多数人都无法接触到数据科学。

Ecom Data Talk Episode 1: What is Data Science?

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

Photo by Mein Deal on Unsplash

大多数人都无法接触到数据科学。

在过去的一年里,作为一名企业家,我有机会与许多大大小小的电子商务商店以及娱乐/金融行业的客户合作。我发现的事实是,作为一名数据科学资深人士,我认为理所当然的事情(如业务增长的数据驱动型决策)在科技公司之外仍然很少发现或不存在。这种差距的存在让我对我们让数据科学变得可及的使命更有激情,现在比以往任何时候都更有激情。什么是无障碍?对我来说,获得意味着信息的可用性(意识),手段的可用性(解决方案),同时是可理解的和可负担的。由于意识(关于什么是可能的)仍然是一个这样的问题,让我们在我们的新系列——Ecom 数据冷却器谈话中谈论它。【你也可以在这里看视频

什么是数据科学?

数据科学是利用来自不同数据元素的信息来支持业务增长的实践。其主要目的是通过自动化和优化不同的运营领域,以及帮助利益相关者利用数据做出更好的决策,帮助企业更好地服务于客户。

这种做法本身并不新鲜;事实上,它已经以商业分析师和金融分析师的形式存在了几十年。数据科学的独特之处在于,在互联网和大数据时代,技术进步带来了新的挑战,使以前的数据分析方法变得低效和过时。因此,一批新的开拓者想出了更适合挑战的收集和总结数据的新方法。

这些新方法通常需要跨多个领域(如计算机编程和统计)的专门培训和经验,还需要其他技能,如商业敏锐度和沟通技巧,这就是为什么很难在所有领域都表现出色,而机构更难生产它们。

为什么数据科学很重要?我为什么要在乎?

数据无处不在,而且呈指数级增长。如果互联网是最大的均衡器,那么数据就是最大的区分器。当你看到亚马逊的图书和网飞的 DVD 时,这两家公司都是从相对较小的利基市场起步的,在这个领域都有巨头。他们能够取代竞争对手,市值增长到数千亿美元,很大程度上是因为他们对客户数据的深刻理解。他们知道你读什么,你看什么,你喜欢什么,你住在哪里,结合这些信息是非常强大的,他们能够通过提供更好的价值来更好地服务他们的客户,最终消费者做出了他们的选择,并用他们的钱投票。

你应该关心什么?你可能会说,John,我们没有时间和金钱来处理数据。的确,就在几年前,大多数财大气粗的公司都在竞相为数字时代转变业务。然而,随着云基础设施、开源工具和电子商务平台的出现,数据成本大幅下降。现在的问题是,大多数电子商务商店都没有充分利用他们的数据,这是一个巨大的增长机会。

为什么数据科学能为我做什么?

简而言之,就是要让业务指标清晰,让有待改进的领域浮出水面,帮助你更好地了解你的客户。除此之外,还有自动化工具和工具来帮助简化事情。例如,你是否正确地衡量了你的利润?如果你仍然使用总收入,包括运输成本和税收,那么你就做错了。你可能还想知道谁是你最好的顾客,他们一生中会花多少钱在你身上。换句话说,你想知道客户的客户终身价值,这对于大多数人来说是一个难以捉摸的指标。或者,你可能想分析客户的购物行为,以建立不同的细分市场,并个性化你的营销工作,我们都知道这是有效的,但有时并不简单。

还有更多的应用,但都归结为这三件事:从数据中提取洞察力,直观地总结它们,并推断未来的结果,以在今天做出更好的决策。

在数字时代,规模经济创造了垄断,垄断了数据、人才和资源市场。通过支付职业运动员水平的工资,科技巨头有效地使大多数人无法接触到数据科学。不一定是这样的。数据就是力量,我们希望将电子商务数据的力量还给人们,甚至是分数。立即加入我们,与您的数据一起成长。

制成

LinkedIn脸书上找到我们。

【tresl.co】原载于

Ecom 数据系列:什么是 RFM 分割?

原文:https://towardsdatascience.com/ecom-data-cooler-series-what-is-rfm-segmentation-8c4d6c2c0fc0?source=collection_archive---------22-----------------------

让电子商务数据科学概念变得简单,一次一个主题。

简单、有效的市场细分,提高打开、点击和转化

Ecom Data Talk Episode 2: What is RFM segmentation?

传统上,营销人员根据人口统计进行细分👨👩🐈👶。然而,今天大多数电子商务品牌更喜欢应用数据科学来开发基于购买行为的行为细分。例如,他们在🛒观看/购买什么产品?他们通过什么途径到达您的网站📍?(意识与意图)。此外,他们的 engagement🖱️水平如何(使用/打开/点击/查看)?

细分有什么好处?虽然有很多,但我会在这里列出我最喜欢的三个:

  1. 聚焦和个性化营销
  2. 降低营销成本
  3. 更好的产品开发

根据行为对客户进行分组可以实现情境化营销,而不是电子邮件群发,从而降低营销成本。通过锁定目标客户子集(细分市场!)有了类似的属性,你可能会获得更好的打开率、更高的转化率和广告支出回报率(ROAS)。最重要的是,你可以让未来的产品迎合顾客的口味。

什么是 RFM?

RFM 是一种用于分析客户价值的数据建模方法。它代表新近性、频率和货币,这只是描述客户行为的三个指标。最近度衡量的是从客户上次订购到今天的时间(通常以天为单位)。频率衡量客户的订单总数,货币是他们从这些订单中花费的平均金额。

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

Photo by Hoster on Unsplash

RFM 始于直销时代,至今仍是零售和电子商务中最简单、最有效的工具之一。要创建 RFM,您需要转换您的数据并从高到低分配一个分数。下面是一个简单的示例,它有三个级别(高、中、低)—在一列中对客户的订单进行排序,并为没有订单的客户分配 3 分,为有一个订单的客户分配 2 分,为有两个或更多订单的客户或回头客分配 1 分。这给你你的频率度量。然后,你重复这个过程的新近性和货币。最后,你会得到三个价值,每个价值代表 RFM 的一个支柱,描述了每个客户的价值,其中一个是最好的。

为什么 RFM 很重要?我为什么要在乎?

RFM 是必不可少的,因为它允许你快速地将你的客户从最好到最差进行排序和安排,并且它在描述客户行为方面非常有效。有了 RFM 分数,你可以创造许多有用的客户群。我们从 MVP 开始,他们是您的最佳客户,在所有三个维度上都有最高分。高消费的新客户在新近度货币度上得分高,但在频率上得分低,因为他们最近才购买。相反,你有高价值的流失客户,他们已经有一段时间没有购买了。他们在最近金钱上得分较高,但在最近上得分较低。最后,低价值客户在所有三个维度上都得分很低,不太可能有任何价值。你可以通过抑制这些用户来节省营销费用提高打开率和点击率。

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

Photo by Austin Distel on Unsplash

你为什么要在乎?我们已经看到,前 5%的顾客平均花费是其他人的 10 倍,占总收入的三分之一。顶级客户往往有更高的平均订单价值,更有可能成为你品牌的忠实粉丝。忠诚的粉丝往往会产生口碑和推荐,这让他们更有价值。

简而言之,你应该花更多的时间让你的顶级客户开心,RFM 可以帮你弄清楚该关注哪里,做什么。

为什么 RFM 能为我做什么?

如果你还没有,开始利用 RFM 为你的营销活动创建客户细分,并开始优化。您可以:

  • 为你的贵宾铺上红地毯。
  • 为最有可能购买的客户设计培育活动。
  • 为即将流失的客户创建个性化的优惠和提醒。
  • 重新瞄准流失的高价值客户,赢回他们。

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

Photo by Alvaro Reyes on Unsplash

RFM 有更多的使用案例。您将能够创建更多相关的、情境化的活动,以不同的方式针对不同的客户。细分有助于提高打开次数和点击量,并带来更多的营销收入。如果你还没有这样做,你绝对应该这样做。我们的一位客户发现,多亏了 RFM,她在年度计划中多了 20%的高价值客户。

总之,RFM 代表近期、频率和货币,近期是最重要的。为什么?那是因为网购是非契约性的商业行为,人们可以自由来去。你只能假设顾客是“活着的”,并且对你感兴趣,当他们通过最近的购买告诉你这一点的时候。

找到你的 RFM。开始将你的客户从最好到最差进行分类,并将这些细分纳入你的营销活动中!

不要忘记,数据就是力量,我们希望将电子商务数据的力量还给人们。立即加入我们,与您的数据一起成长。

制成

LinkedIn脸书上找到我们。

原载于tresl.co

[1]彼得·s·法德尔、布鲁斯·g·s·哈迪·卡洛克·李、RFM 和 CLV: 使用等值曲线进行客户群分析 (2004)

时间序列分析的计量经济学方法 Python 中的季节性 ARIMA

原文:https://towardsdatascience.com/econometric-approach-to-time-series-analysis-seasonal-arima-in-python-28f5782ee23?source=collection_archive---------5-----------------------

自相关,时间序列分解,数据转换,Sarimax 模型,性能指标,分析框架

在这篇文章中,我们将讨论带有趋势和季节成分的时间序列数据的分析。将采用计量经济学方法来模拟数据的统计特性。这里的业务目标是预测。我们试图解释时间序列建模中涉及的各种概念,如时间序列成分、序列相关性、模型拟合、度量等。我们将使用 statsmodels 库提供的 SARIMAX 模型来模拟数据中的季节性和趋势。萨里玛(季节性 ARIMA)能够同时模拟季节性和趋势,不像 ARIMA 只能模拟趋势。

内容:

  1. 时间序列数据的定义
  2. 项目和数据介绍
  3. 季节分解和时间序列成分:趋势、季节性、周期、残差
  4. 时间序列数据的平稳性及其重要性
  5. 自相关和偏自相关
  6. 数据转换:对数转换和差分
  7. 模型选择和拟合
  8. 结论

从 GitHub 库访问完整的 Python 代码:https://GitHub . com/jahangimmadov/sarima/blob/master/Seasonal % 20 time % 20 series % 20 analysis . ipynb

1.时间序列数据的定义?

时间序列数据是在时间间隔内测量的一系列数据点。换句话说,数据是时间 f(t) = y 的函数。
数据点可以每小时、每天、每周、每月、每季度、每年测量,也可以用更小或更大的时间尺度测量,例如几秒或几十年。

2.项目和数据介绍

我们在本文中使用的数据是 2000 年至 2019 年间美国 20 个主要城市的月度房屋销售指数。(https://fred.stlouisfed.org/series/SPCS20RPSNSA)。您可以从这个来源免费下载许多不同的代表美国经济的经济时间序列数据。你可能会看到相同数据的两个不同版本,季节性调整和非季节性调整。在这篇文章中使用的版本没有进行季节性调整,因为我们想模拟季节性和趋势。你可能会问为什么人们要在行业中使用季节性调整的数据。嗯,有时企业可能想知道经济事件对特定数据的真实影响,这可能与一个季度重叠。在这种情况下,季节性可能会掩盖或低估/高估经济事件的影响。例如:取暖油生产商可能想研究汽油价格下降对取暖油价格的影响。然而,尽管取暖油是一种汽油物质,冬季取暖油的价格却在上涨。汽油价格的下降应该反映在取暖油价格的下降上。然而,冬季取暖需求很大,导致价格略有上涨。通过从时间序列数据中去除季节性影响,您可能会看到取暖油价格实际上呈下降趋势。价格的轻微上涨是季节性的影响。在第 3 节中,我们将更详细地讨论季节分解。

如果我们观察数据的时间序列图,我们可以观察到 2000-2006 年的增长趋势,由于严重的金融危机,从 2007 年到 2012 年房屋销售的下降趋势,以及到 2018 年的增长趋势。我们还可以观察数据中的季节性,因为通常住房市场在年初并不活跃,销售通常在年中达到高峰,到年底销售又会下降。似乎是温暖的季节,尤其是夏天是美国房地产市场的好季节。

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

3.季节分解和时间序列成分:趋势、季节性、周期、残差

时间序列数据 Y 由趋势、周期、季节性和残差的组合组成。显然,你可能会遇到没有趋势、周期或季节性的时间序列。因此,识别时间序列数据的组成部分是您的任务。术语的定义如下:

趋势— 长期向上或向下的运动。
周期— 因经济运动而产生的周期性变化。它不同于季节变化。周期是时间序列数据的自回归分量的变化。周期发生在较长的时间间隔内,例如每 6-10 年,而季节变化发生在较短的时间间隔内。
季节性 季节性影响导致的数据变化。冰淇淋的销量在夏天很高,取暖油的销量在冬天很高,但在夏天很低。
残差— 在时间序列数据中计算并去除其他分量后剩下的分量。它是随机、恒等和独立分布的。残差,R~ N(0,1)。

Statsmodels 库有一个函数叫做 seasonal_decompose,将时间序列 Y 分解成趋势、季节性和残差。虽然这是一个简单的分解算法,但在实践中,它非常直观,并且适用于 T、S 和 R 明显的时间序列数据。在解释下面的图表之前,我想谈谈这些组件之间的相互作用。
时间序列数据 Y 可以采用加法或乘法形式。在加法形式下,时间序列 Y 由时间序列分量之和构成,即 T,S,C,R:
Y = T+C+S+R

以乘法形式出现的时间序列 Y 是由时间序列分量的乘积形成:
Y = T * C * S * R

那么,房屋销售指数是乘法还是加法呢?如果你仔细观察住房指数的时间序列图,你可能会注意到,当趋势下降时(2008-2013 年),季节性变化(季节性)变小,而当趋势上升时(2014-2019 年),季节性变化变大。这种情况发生在乘法时间序列中,趋势 T 的小值导致小的 S,因为我们将 S 乘以 T。在加法时间序列中不会出现这种现象。

我们使用 statsmodels 中的**季节性分解(原始数据,‘乘法’)**函数将时间序列数据分解为趋势、季节性成分和残差。如果函数返回所有 3 个部分,即使您假设它们对于特定的时间序列数据不存在,也不要感到惊讶。在现实中,这些组件是由一个简单的算法生成的,这就是为什么分解函数不能说一个组件不存在,尽管计算出的值并不显著。因此,对于任何时间序列数据,您都会看到这三个组成部分。你必须知道如何阅读结果,并决定哪个模型(ARIMA 或萨里玛)适合数据。

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

Plot of seasonal decomposition from statsmodels library

我们将尝试自己将数据分解成组件,以便更好地理解它们的派生和用法。可以采用窗口大小= 12 的移动平均来计算趋势。下图与统计模型库生成的趋势非常相似。

Moving average with window size=12

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

Plot of Moving average window size=12

还记得乘法模型, Y = T C S R* 吗?将 Y 除以 T 可以得到 Y/T=CSR** 我们假设残差对于该数据来说太小,因为时间序列图看起来很平滑。我们的数据非常少,因此我们无法检测经济周期。我们把时间序列除以趋势得到一个季节成分, S=Y/T

Code snippet for seasonality decomposition

季节性的图形有点难理解,但是,这里给出的解释已经足够了。 *y=1.2(红色标记)*表示 2000 年 7 月-2000 年 7 月的销售额增加了 20% 。换句话说,六月的季节效应为+ 20% 或 1.2 *T。另一方面,2003 年 2 月的 *y=0.8(绿色标记)*显示销售额下降 20% 。因此,对于一些不属于这种特殊情况的时间序列数据,您可能会看到季节性影响非常小,即 y=0.0001 。它显示了一个非常小的季节性影响,甚至不应该被认为是显著的。

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

Seasonal Component

残差可以计算为 R = Y/(ST)*

Code snippet for residuals decomposition

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

Resiudals component

还有其他一些方法来检测季节性。在下面的图表中,绘制了每年的月度房屋销售,正如你所看到的,每年都遵循几乎相同的模式,只是略有不同。房屋销售在夏季较高,冬季较低。

Code snippet for the monthly home sales graph

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

Monthly sales per year

4.时间序列数据的平稳性及其重要性

当我们在时间序列数据中有趋势和/或季节性时,我们称之为非平稳的。

平稳性是指数据的统计属性,如平均值、方差和标准偏差在一段时间内保持不变。

为什么我们希望统计属性随着时间的推移保持不变?因为我们在建立模型的过程中对样本数据进行了统计假设(一个很好的例子是 OLS 假设),而模型只能在这些假设下运行。当数据的统计属性改变时,模型不再能够代表数据的真实性质。

这就是为什么我们的预测/预测结果将不再有效。改变均值/方差将要求我们拟合另一个模型,而这个模型可能在短时间内有效,我们必须再次放弃它并拟合一个新的模型。看,这个过程看起来是多么的低效和不可靠。在拟合模型之前,我们必须使时间序列数据稳定。我们可以通过转换数据使时间序列平稳。通常,差分用于使数据稳定。我们将在下面的第 6 节中讨论它。

那么,如何检验一个时间序列数据是否平稳呢?第一个是目测时间序列图,并确定趋势或季节性。如果它们中至少有一个存在,那么时间序列数据就不是静态的。其次,您可以将数据分成 3 组,计算每组的均值和方差,并确认每组的均值和方差是否有实质性差异。第三种选择是使用 statsmodels 库中提供的统计测试之一。

扩展的 Dickey-Fuller 检验是其中最流行的,其中零假设,h0 =数据不是平稳的。ADF 测试结果提供测试统计和 P 值。p 值> = 0.05 意味着数据不是平稳的,否则,我们拒绝零假设,说数据是平稳的。

我们假设你知道什么是假设检验,以及 P 值意味着什么。如果你对这些术语不太熟悉,那么看看 p 值,如果它小于 0.05 (p 值< 0.05) then data is stationary if p-value > = 0.05 数据不是静止的。ADF 检验证实原始时间序列数据不是平稳的,其 p 值约为 0.08

Code snippet for ADF test

Time series data is not stationary. Adfuller test pvalue=0.0803366374517756

5.自相关和偏自相关

在建模之前,我们必须看一下 ACF 和 PACF 图,因为从现在起我们将会大量使用这些图。

自相关图显示时间序列数据与其自身滞后值的相关性。例如,滞后=1 时的自相关表示 y_t 和 y_t-1 之间的相关性。在滞后=2 时,corr(y_t,y_t-2)。在滞后=12 corr(y_t,y_t-12)时。在这个特定的例子中,与时间 t-12、t-24 等的数据点高度相关的时间 t 的每个数据点表示季节性。

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

Autocorrelation plot of original home sales index data

下面的代码片段和散点图可以帮助您更好地理解滞后值之间的相关性,即自相关性。

Code snippet for correlation of lags

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

Correlation between lag values — highly correlated

回到 ACF 图,自相关图的蓝色阴影区域显示显著性水平。因此,阴影区域内的相关系数在这些滞后处表现出弱相关性,我们认为它们在分析中并不重要。
偏相关函数(PACF)给出了平稳时间序列与其滞后值的偏相关。

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

Partial autocorrelation plot of original home sales index data

PACF 去除了其他滞后的相关性贡献,给出了两个滞后之间的纯相关性,而没有其他滞后的影响。

我们使用 ACF 和 PACF 为 ARIMA 模型的 AR§和 MA(q)组件/特征选择正确的顺序。对于 AR 阶数 p,查看 PACF 图并选择一个滞后值,该值在相关性变得不明显之前具有显著的相关系数。对于 MA 订单 q,查看 ACF 图,并执行相同的操作。不要忘记你应该只从平稳时间序列的 ACF 和 PACF 图中得到这些值,而不是从上面的图中。上面给出的 ACF 和 PACF 图是原始数据的图,其是非平稳的。

6.数据转换:对数转换和差分

因此,让我们转换数据,使其稳定,这样我们就可以开始模型构建阶段。我们将原始数据分为训练数据和测试数据。训练数据将包含 2000 年至 2018 年的美国房屋销售数据,测试数据将包含 2018 年至 2019 年的数据。别忘了,你不能像对待横截面数据那样进行随机抽样。我们必须保持时间序列数据的时间行为(依赖于时间)。

房屋销售指数数据可以公式化为一个乘法模型,其中 Y= TSR。我忽略了周期,因为它实际上并不存在于该数据中。(S)ARIMA 模型是线性模型,如线性回归。我们无法将线性模型 SARIMA 拟合到由 Y = TSR 过程生成的数据。我们必须在拟合线性模型之前使 Y 为线性。从数学 中你可以知道 Log(ab) = log(a) + log(b)* 。我们必须对数据进行对数变换,使其呈线性。log(Y)= log(T)+log(S)+log®。 Log 变换使数据线性、平滑。

log_transformed_data = np.log(training_data)
plot_data_properties(log_transformed_data, ‘Log tranformed training data’)

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

Properties of log transformed data

有时,日志转换本身可以使数据保持不变,但这里的情况并非如此。

test_stationarity(log_transformed_data)
Time series data is not stationary. Adfuller test pvalue=0.22522944188413385

差分是一种基本的操作或数据转换。是时间=t 时的 y 和时间=t-x 时的 y 之差diff _ 1 = y _ t—y _ t-1

差分使数据保持不变,因为它从数据中删除了时间序列成分,而您得到的是不同时间段之间的变化。注意,一阶差分只带走了趋势,而不是季节性。数据仍然不是静态的,因为它包含了季节性的影响。

logged_diffed_data = log_transformed_data.diff()[1:]
plot_data_properties(logged_diffed_data, 'Log transformed and differenced data')

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

Log-transformed and 1st order integrated: non-stationary

test_stationarity(logged_diffed_data)
Time series data is not stationary. Adfuller test pvalue=0.20261733702504936

我们必须采用 12 阶差分来消除季节性。你可能会问,我们是如何决定采用 12 阶差,而不是 6 阶、8 阶或其他阶差的。通常,月数据的季节性滞后=12,周数据的季节性滞后=4,日数据的季节性滞后=30。或者你可以从 ACF 图中得到。对于这个特定的数据,第 12、24、36 个滞后高度相关。

数据现在是固定的。如果你看下图的直方图,它看起来像正常的钟形曲线。平稳数据是随机同分布的,图看起来像白噪声。白噪声只是平稳时间序列数据的一个例子。

seasonally_diffed_data = logged_diffed_data.diff(12)[12:]
plot_data_properties(seasonally_diffed_data, 'Log transofrmed, diff=1 and seasonally differenced data')

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

Stationary data

test_stationarity(seasonally_diffed_data)
Time series data is stationary. Adfuller test pvalue=0.0006264163287311492

7.模型选择和拟合

由于转换后的数据是稳定的,现在我们可以进入模型拟合阶段。我们之前简单聊过萨里玛。我想详细说明一下这个特殊的模型。季节 ARIMA 是 ARIMA 家族中的一个特殊成员,它可以对时间序列数据的季节成分进行建模。简单重述一下 ARIMA 的意思:

AR —自回归模型是对时间序列数据的滞后值进行回归。滞后值成为自变量,而时间序列本身成为因变量。

y = A0+a1 * y t-1+a2 * y t-2,……,a_k*y_t-k.

这里的主要任务是选择多少时间步长作为独立变量。不要让时间序列或滞后值这个词迷惑你,它们只是自变量。在线性回归中,您可以查看自变量和因变量之间的相关性,并选择高度相关的变量作为您的特征。在这里你也应该这样做。但是,您不必计算滞后值和目标变量之间的相关性,因为您可以使用 PACF 来确定要使用多少滞后。平稳数据的 PACF 在滞后=1 时具有显著的自相关,而在滞后=2 时下一个自相关变得不显著。理想情况下,AR 订单 p 应该为 1。由于 AR§和 MA(q)项相互影响,从自相关图中观察到的初始 p 和 q 值不再可靠,应作为起点。我们必须在 p 上进行参数搜索,以找到最优值。初步猜测将有助于定义网格搜索使用哪些值。在这种情况下,p =[0–2]就足够了。

积分的顺序:基本上,你对数据求了多少次差。我们有过一次 d=1。当您设置参数 d=1 时,不要忘记使模型适合无差异数据,因为算法将对其进行区分。如果您将模型拟合到静态数据,那么您就不再需要差分。可以让 d=0。我们需要差分来使数据稳定。

MA —移动平均模型:时间序列 y 在残差 w 上回归

y = A0+a1 * w1+a2 * w2+…。+ a_k*wk

查看 ACF 图,确定 ARIMA 模型的 MA 阶(q)。ACF 建议 ARIMA 模型的 MA 部分的阶数 q=1。但是,我们应该进行网格搜索,以找到一个最佳模型。我建议查看值 q =[0–2]

季节性模型—季节性特征必须与 AR 和 MA 一起添加到模型中,它有 4 个参数(P、D、Q、s)。
认为 P、D 和 Q 参数类似于 ar、I 和 MA 参数,但仅用于序列的季节性成分。

看 PACF 选择 P,看 ACF 选择 Q。季节差异的数量是 d,季节效应的频率是 s。

P = 1 —因为我们在滞后=12 时有显著的相关性,但是,它们不够强,我们可能不需要在模型中有 AR 变量。这就是为什么我们应该在 P =[0–2]上进行网格搜索

D=1 —我们对季节性进行了一次差分

q = 1——根据 ACF 图,我们在滞后=12 时有很强的相关性。让我们也对参数 Q =[0–2]执行网格搜索。

s=12 —季节性频率,每 12 个月一次

下面的 best_sarima_model 函数对(P,D,Q)和(P,D,Q,s)参数进行网格搜索,以 AIC、BIC、HQIC 的统计指标作为评估标准,找到最佳模型。下 AIC,BIC,HQIC 意味着更好的模式。这些指标奖励拟合优度(对数似然),惩罚过度拟合。在我们的例子中,有许多滞后特征会导致过度拟合。AIC、BIC 和 HQIC 平衡了可能性和自由度之间的权衡。你可以在他们的公式中看到这个属性。我不会深入讨论其他指标的细节,但会在下面举一个例子来支持我使用 AIC 的观点:

-k 是模型中估计参数的数量,换句话说,是特征(滞后项)的数量。
-L 是似然函数的最大值。
AIC = 2k — 2ln(L)

我在行业中见过许多只使用其中一个指标作为模型选择标准的例子,但您可能会遇到这样的情况:一个模型的 AIC 可能比另一个模型低,而 BIC 却较高。这就是为什么如果 3 个指标中有 2 个较低,就要尝试选择一个模型。

Code snippet for model selection

请注意,我们正在为对数转换数据拟合一个模型,因此。我们已经设置了 d=1 和 D=1 参数,以便模型自己进行差分。如果您要将模型拟合到静态数据,则必须将积分阶数(D,D)设置为 0。我们用上面确定的参数评估了 SARIMA 模型。下面的总结显示了最好的模式,或者说最低的 AIC,BIC,HQIC。最好的模型建议我们不需要有 AR 特征,只需要 MA 和季节性 MA 特征。

best_model, models = best_sarima_model(train_data=log_transformed_data,p=range(3),q=range(3),P=range(3),Q=range(3))

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

Model Summary of the best Sarima model

ARIMA 或萨里玛模型是通过使用最大似然估计和 OLS 假设适用于这一系列的模型。这些假设我不想在这里细说。这是另一篇文章的主题。然而,我们必须确认我们的模型符合这些假设。系数的 p 值< = 0.05。残差是平稳的和均方的。残差之间没有序列相关性。

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

Endog vs Residuals Scatter plot

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

Residuals Autocorrelation plot: No correlation

我们将预测 2018 年 1 月 1 日至 2019 年 1 月 1 日的房屋销售情况。我将使用 MAPE——平均绝对百分比误差来评估模型性能。我们得到的最佳模型是 SARIMA(order=(0,1,2),seasonal_order=(0,1,1,12)。我更喜欢时间序列分析中的 MAPE 误差度量,因为它更直观。Sklearn 不提供 MAPE 度量,所以我们要自己编码。公式:

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

MAPE formula

Code snippet for MAPE

使用预测函数时,需要注意其参数的一些细微差别:

  1. type =“levels”意味着预测值将与 endog/training 值处于同一水平,在我们的情况下,它们是经过对数变换的,根本没有差异。然后,如果你注意到我们用 np.exp()将预测值换算成原始数据。记住,np.exp(np.log(a)) = a .所以,np.exp(np.log(原始数据))=原始数据
  2. dynamics = True,则使用 time = t 的预测值作为 time = t+1 的预测值。
preds_best=np.exp(best_model.predict(start=test_start_date,end='2019-01-01', dynamic=True, typ='levels'))
print("MAPE{}%".format(np.round(mean_abs_pct_error(test_data,preds_best),2)))MAPE:6.05%

我们大约制造。我们的预测误差为 6%。这并不意味着模型会在 6%的时间里表现不佳。相反,它转化为预测值将偏离实际值平均 6%。

用原始数据绘制预测值并查看结果。从下图中我们可以推断出什么?嗯,很多!该模型可以成功地捕捉季节效应,但是,不能捕捉趋势。房屋销售呈下降趋势,然而,该模型不能很好地捕捉它。它知道销量会下降,但由于季节效应,2018 年后会有下降趋势,这很难预测。这是因为我们得到的训练数据很少。

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

Forecasted data

如果我们有一个更大的数据集,我们可以识别一个经济周期,并对其建模。很可能,每 6-7 年的房屋销售就会减少一次。或者,如果这种下降趋势在 2019 年继续,我们对 2020 年的预测肯定会捕捉到这一趋势。

另一个更快捕捉趋势的选择是在模型中添加 AR 项。如果我们在模型中加入 1 或 2 个 AR 项,它可以更快地对趋势做出反应,并具有更少的 MAPE。下图显示了各型号的 MAPE。在 MAPE 测试中表现优于最佳模型的模型显示为绿色。

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

我们在模型中添加了 AR 术语,并且我们在测试指标方面有所改进。

agile_model = SARIMAX(endog=log_transformed_data,order=(1,1,2), seasonal_order=(1,1,2,12),enforce_invertibility=False).fit()
agile_model.summary()

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

Model summary

测试 MAPE 现在是 5.67%,比 6.05%有所提高,这是最优模型的测试 MAPE。

agile_model_pred = np.exp(agile_model.predict(start=test_start_date,end=’2019–01–01', dynamic=True, typ=’levels’))
print(“MAPE{}%”.format(np.round(mean_abs_pct_error(test_data,agile_model_pred),2)))MAPE:5.67%

然而,如果你看看 AIC、BIC 和 HQIC,我们会得到更高的值,这意味着我们牺牲了模型的通用性。我们知道我们只有很少的数据点大约 300 个,在线性模型中有 6 个特征可能会导致过度拟合。如果你看一下上面的模型总结,特征系数的 P 值为 ar。马萨诸塞州 L1。阿肯色州 L2。马萨诸塞州第 12 中学。S.L12 和马。S.L24 高于 0.05%。

8.结论

我们在上面已经讨论了许多不同的概念,这些概念在分析和模型构建阶段都会用到。以下步骤总结了我们采取的方法,可用作类似项目的指南或框架:

  1. 确定模型是乘法的还是加法的
  2. 识别时间序列的组成部分:趋势、周期、季节性、残差
  3. 将数据转换成线性
  4. 如果数据不稳定,则使其稳定
  5. 根据步骤 2,选择 ARIMA 或萨里玛模型
  6. 为每个模型变量/特征定义订单参数
  7. 做网格搜索,选择一个基于 AIC,BIC,HQIC 的最优模型
  8. 检查模型残差是否符合 OLS 假设
  9. 预测并计算预测误差:MAPE、梅等。

简单线性回归背后的计量经济学

原文:https://towardsdatascience.com/econometrics-behind-simple-linear-regression-ae5037de92c9?source=collection_archive---------17-----------------------

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

准确描述机器学习的方法之一是找出现实世界问题的数学优化。有时,当试图使用机器学习解决现实世界的问题时,我们可能希望检查某些因素是否与某种影响有任何关联。

例如,一个家庭的周收入是否与一段时间内在某个地方花在食物上的钱有关联。在这个特殊的例子中,家庭的周收入是预测变量(自变量 X),在食物上的花费是响应变量(因变量 Y)。

简单线性回归是在因变量和自变量之间建立关系的方法。最简单的情况是检查单个动作是否与响应有任何关系。这被称为简单的线性回归。在本文中,让我们看看简单线性回归背后的计量经济学。

目录

  1. 简单回归模型
  2. 假设
  3. 普通最小二乘法(OLS)
  4. 使用 OLS 导出参数估计值
  5. 超越建筑模型

经济理论使用模型暗示了经济变量之间的许多关系。对于一个变量的给定值,这些模型用于估计/预测另一个变量的相应值。我们可以使用回归模型找到许多现实生活变量之间的关系,如收入-支出、学习时间-分数、身高-体重等。

1。)简单回归模型

y= β1+ β2x+e

简单线性回归对于寻找两个连续变量之间的关系很有用。

在这个模型中,我们通常指

y —因变量/解释变量/回归变量

x 自变量/探索变量/回归变量

在这篇文章中,我们找到了收入和教育之间的关系。因此,相应的回归方程变成了

收益= β1+β2Educ+e
β2,β2
—模型参数(常数)
e —误差项/不可观测误差(包括除教育以外影响收益的因素)

人们可以使用工作人群的随机样本数据来估计这个模型的参数。

2。)假设:

我们的估计从关于误差项的一些假设开始。

a.)u 的平均值,总体中的误差项为 0。随机误差的期望值为 E(e) =0

b.)误差项,将有恒定方差, Var(e) =常数

c.)我们需要假设 u 的平均值不依赖于 x
x、u 都是独立的(对于给定的 x:u 不受影响)。即 E(e│x)=E(e)=0=f(e)

这意味着, E(y│x)= β1+β2x=f(y)

举例:让 e —员工的能力。同样的受教育年限,两个员工的能力不一样。

下面是一个总体回归函数,它将 f (y)解释为 x 的线性函数,其中对于任何 x,y 的分布以 f (y)为中心

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

Source: Principles of Econometrics, 4th Edition

3。)普通最小二乘
到目前为止,我们还没有看到数据。回归背后的基本思想是从样本中估计总体参数β1, β2 。让我们从一个总体中选择一个大小为 n 的随机样本{( ): i = 1,2,…,n}。
对于每个观测样本的回归方程,
yi= β1+ β2xi+ei

下面是人口回归线,从人口和相应的误差条款

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

Source: Principles of Econometrics, 4th Edition

目的 : 利用数据确定变量之间的真实关系

未知 : 真实关系,参数

由于误差项 e ,实际结果与真实关系不同

4。)使用 OLS 导出参数估计

我们的估计从一些假设开始。让我们回忆一下之前的假设,

E(e│x)=E(e)=0
Cov(x,e)=E(xe)-E(x)E(e)
Cov(x,e)=0

原因 : E(e) =0(根据假设) Cov(x,e) =0(根据相同假设加上独立性)那么 E(xe) =0

我们现在有两个方程,

E(e) = 0 → (1)

E(xe) = 0 →(2)

用其他变量重写e:x,y,β1,β2

e = y — β1- β2x

在上述两个等式中代入 e

E (y — β1 — β2x) = 0

E [x(y — β1 — β2x)] = 0

现在我们有两个方程,两个未知数( β1,β2 )

E(X) 是总体分布的算术平均值。 E(X) =∑( Xi /n)

将上述方程整形如下
(∑(易- β1- β2x))/n=0
(∑ xi(易- β1- β2x))/n=0

使用上述等式求解 (β1,β2) 得到
Y- β2X= β1
(∑(xi-X)(易-Y))/(∑(xi-X) )= β2

其中 X,Yx,y 的算术平均值

:β2的分母,即 ∑(xi-X) 必须为> 0。但也有可能是零。
分母= 0 意味着 var(x) = 0

具有相同教育水平的每个人→β2-斜率估计量变得无穷大(形成一条平行于 y 轴的线)

因此,我们需要(x)中的一些变化来辨别(x)和(y)之间的关系
简而言之, β2 (斜率估计)是(x,y)之间的样本协方差除以(x)的样本方差

(Cov(x,y)/(Var(x))= β2

如果 x 和 y 正相关,斜率将为正
如果 x 和 y 负相关,斜率将为负
只需要 x 在我们的样本中变化就可以得到估计值。

5.)超越建筑模型

在建立经济模型时,确保独立变量中存在小的方差(因为这会导致回归方程的斜率无穷大)。建立模型后,我们需要检查估计量的性质。这些属性包括对偏倚、一致性和效率的测试。因为这些性质将决定我们的估计有多精确。

结束注释

我希望你喜欢阅读这篇文章。然而,在回归模型和应用中仍有很多东西需要探索,我鼓励你们去阅读“计量经济学原理—第 4 版,作者:Carter Hill | Grifftiths | LIM”。如果您有任何建议/推荐,请在下面的评论中留下您的反馈。

感谢阅读。

基于 Gretl 的计量经济学——建立银行流失的地理分割模型

原文:https://towardsdatascience.com/econometrics-with-gretl-building-a-geosegmentation-model-for-bank-churn-265cd6814866?source=collection_archive---------25-----------------------

使用逻辑回归、方差膨胀因子和优势比分析银行流失数据

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

格雷特是什么?

Gretl 是一个开源的统计软件包,是为计量经济学开发的,但也可以用于各种各样的数据。该程序是用 C++编写的,有许多扩展核心程序的社区源包。

该程序可以在这里下载,本教程中使用的数据可以在 Kaggle 这里找到。

看一看数据

可以从文件选择下载的 csv 文件将数据加载到 Gretl 中。程序会提醒用户数据没有更新,并询问是否应该尝试构建一个时间序列,对于这个数据集,我们不需要这样做。

有两个窗口,一个包含名为 string_table.txt 的变量字符串值,主 Gretl 窗口显示数据中存在的变量的完整列表。

虚拟变量

变量性别地理位置需要进行数字编码,这可以在 Grelt 中通过右击主屏幕中的变量并选择 Dummify 来完成,然后对所有值进行编码。为了使事情更简单,展开 Geography 和 Gender 变量并编辑值的属性。例如,右键单击“地理”下的“法国”并选择“编辑属性”,将“名称”字段从 DGeography_1 更改为法国

检查变量

Exited 是因变量,因为它是利息的结果,本案例研究考察了可能与一个人离开或留在银行有关的因素。RowNumber、CustomerID 和 Surname 等变量不会影响一个人是留在银行还是离开银行,因此不使用这些列。剩下的变量将是回归变量。

  • 信用评分——客户的信用评分会影响他们的决策
  • 地理 —客户所在的区域数据
  • 性别——顾客的性别可能会影响他们的去留
  • 年龄 —顾客的年龄
  • 任期——客户与银行交易的持续时间——更长的任期可以建立忠诚度
  • 余额——客户的银行余额——可能会影响促销、利率和账户费用
  • NumOfProducts —客户订购了多少产品——更多的产品可能会导致更高的入住率
  • HasCrCard——不管客户是否有银行信用卡——增加银行在客户生活中的存在
  • 活跃会员 —过去 6 个月内客户与银行的活动——活跃客户更有可能留下来
  • 估计工资 —银行对客户工资的估计——高收入者可能在银行有更多投资
  • 退出 —客户是留在银行还是离开

构建模型

Gretl 使得数据建模变得非常容易。这是通过进入主窗口中的模型选项卡,导航至有限因变量(因为 exited 是一个离散变量),然后导航至 logit(逻辑回归),最后导航至 binary。

  • 模型->有限因变量-> logit ->二元

然后,Gretl 将提示用户选择因变量(退出)和回归变量(上面的列表)。为了确定模型中变量的重要性,应勾选显示 p 值框。运行模型。

删除变量

运行第一次回归迭代会产生以下系数和 p 值:

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

Model iteration 1

可以看出,西班牙的 p 值最高,这表明它不是一个显著变量,因此我们可以将西班牙排除在模型之外。在没有西班牙的情况下再次对数据进行建模时,精度没有提高,R 平方值也略有增加:

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

Model iteration 2

HasCrCardEstimatedSalary 被删除,因为这些变量具有次高的 p 值(高于 0.05)。在没有这两个变量的情况下再次运行模型后,精确度和 R 平方得分略有增加。理想情况下,不应该有 p 值超过 0.05 的变量,但任期在 0.087 左右。任期可能会被取消,但从逻辑上讲,客户与银行关系的持续时间对他们的去留有一定影响。现在,模型显示没有 p 值高于阈值的变量(除了任期):

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

Model iteration 3

对数转换—平衡

由于 balance 的范围很大,从 1000 美元到 2000 美元增加一个单位会产生双倍的效果,而从 10,000 美元到 11,000 美元增加一个单位只会产生 10%的增长,因此需要对值进行转换,以便进行缩放。为了做到这一点,将记录日志,并在每一行增加 1,以防余额为 0。

在 Gretl 中,这是通过定义一个新变量并输入等式 log10(balance + 1)来完成的。以下是用 log_balance 替换 Balance 的结果:

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

Model iteration 4

衍生变量——财富积累

派生变量可以更准确地表示一些字段,如余额和年龄。例如,随着年龄的增长,年轻人的余额可能较小,而老年人的余额可能较大。或者,一个年轻人可能有一份收入丰厚的工作,与可能失去储蓄的老年人相比,他可能有更多的存款。该指标可以更好地代表客户的财务状况。

为了创建这个衍生变量,银行账户的对数余额可以除以账户持有人的年龄。这个变量被称为财富积累。以下结果是用财富积累作为等式的一部分得出的:

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

Model iteration 5

处理多重共线性

模型中包含 Wealth_Accumulation、Log_Balance 和 age 可能会显示精度下降和高 p 值,因为可能存在多重共线性。Gretl 可以检查共线性和方差膨胀因子(VIF)。对数余额和财富积累的 VIF 比其他变量高得多:

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

VIF with Log_Balance and Wealth_Accumulation

当去掉 Log_Balance 时,财富积累系数缩小:

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

VIF with only Wealth_Accumulation

仅包含财富积累的模型的指标是:

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

Model performance with Wealth_Accumulation

采用财富积累的对数可能是比未转换变量更好的度量。包括对数平衡和对数财富积累显示了共线性的影响,两个 VIF 分数都在 700 左右。

这种共线性效应可以通过取财富积累的对数并将其包含在 Log_Balance 旁边的等式中来进一步观察:

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

VIF with Log_Wealth_Accumulation and Log_Balance

包含 Log_Balance 和 Log_Wealth_Accumulation 变量的模型的指标是:

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

Model performance with Log_Wealth_Accumulation and Log_Balance

仅使用 Log_Wealth_Accumulation 评估绩效时,衡量标准如下:

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

Model performance with only Log_Wealth_Accumulation

最终确定模型

当比较其中一个仅使用 Log_Wealth_Accumulation 而另一个仅使用 Log_Balance 的两个模型时,具有 Log_Balance 的模型导致更高的 R 平方得分(0.151006),并且准确性仅差 Log_Wealth_Accumulation 准确性一个正确预测(8127 对 8128)。

结果——哪些变量影响最大?

为了确定哪些变量在确定银行流失率时最重要,需要计算每个系数的优势比。

计算优势比

简单逻辑回归方程:

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

赔率等式:

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

将比值代入逻辑回归方程(也称为对数比值):

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

取每边的指数:

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

简化:

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

将变量增加一个单位:

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

指数表明增加一个单位会导致倍增效应:

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

计算格雷特的优势比

这些比率可以在 Gretl 中使用功能包“优势比率”进行计算:

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

结论—银行可以瞄准谁来减少客户流失?

结果显示,最有影响力的变量是德国人、女性和积极成员。在这种情况下,优势比是看哪些因素导致客户离开。因此,当观察这家银行的客户流失时,一个住在德国或搬到那里的客户离开的几率增加了 2.1119 倍。此外,女性顾客离开的几率增加了 1.6934 倍。另一方面,成为活跃会员表明客户仍在银行工作。最终,如果银行想要减少客户流失并留住他们的客户群,他们必须瞄准他们的德国客户,尤其是德国女性,并努力增加这些客户在银行的活动。

数据科学经济学

原文:https://towardsdatascience.com/economics-of-data-science-648beaaf0af8?source=collection_archive---------37-----------------------

一条失败多于成功的道路

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

无论我们在哪里看,数据科学——也许就像凯西·科济尔科夫的一篇文章中所说的那样,只是统计学、机器学习和分析的结合——正在火热进行中。产生了这么多数据,有这么多问题要问。

我们可以用这些数据做什么?

它会把我们带到哪里?

会改善我们的生活吗?

它如何改变世界?

让我们不要忘记…我们能从中赚钱吗?

首先,免责声明

正是这种不舒服的感觉让我们开始反思数据科学…这与很久以前一个人不太记得的梦所留下的感觉没有什么不同。

随着时间的流逝,在经历了太多的 WTF 时刻后,我们感到更加焦虑,这些点似乎连接得更清楚了。

他们似乎在暗示,在追逐专业知识、职业和商业的时候,我们可能不知何故在我们的理想和目标上分心了……或者被误导了……

数据科学是所谓的“21 世纪最性感的工作”的来源,它有一个强大的黑暗面,在赶时髦时似乎很容易被忽视。

慎选!

大家都去哪了?

如今,大多数大中型组织都有专门的分析团队。随着时间的推移,我们已经习惯于认为,如果我们密切了解我们的数据,我们可以用它来增加收入或降低成本。

为了鼓励我们,世界继续在工具、算法和技术上投入大量的时间和资金。然后,它教会我们将技术与人类行为结合起来,这样我们就可以专注于消费者真正想要的东西……并以某种方式影响他们的非理性购买决策。

解决更大更好的问题,人类也许就能获得人工智能的圣杯——感知。

数据科学能给我们这一切吗?

从外面看,很难知道炒作在哪里结束,现实在哪里开始。在泡沫中,我们还有机会吗?

或许是一门生产科学

在数据科学中,和所有其他领域一样,项目会成功,也会失败。

通过…失败。好…坏。准时…迟到。赚钱…赔钱。似乎总是二元的。

搜索网页,很容易得出结论,浪费的数量一定很大**。**毕竟,失败的故事无处不在——2017 年 Gartner 的一项研究甚至声称 85%的项目崩溃和烧毁率!

假设这些数字是可信的,人们可能会不寒而栗地想象,有多少宝贵的时间和金钱永远浪费在生产率低下的经济荒原上。

不出所料,被引用最多的文章也是引用数字最多的文章。巧合吗?

不管是否有成效,在某种程度上,我们开始承认数据科学可能没有我们想象的那么重要。毕竟,它似乎什么也没有生产——没有食物,没有衣服,没有住所。

更有可能的是,它只会影响生产。更好,更快,也许更干净,永远更高。

但是这种情况发生的频率有多高?

从气泡内部

无论成功还是失败,我们只有自己的经历可以沉迷和评判。

虽然宣传我们在数据科学上的胜利很诱人,但真正让我们屈服的是失败*。不一定是大的或坏的,而是在一个成功的项目之后发生的失败。*

事情可能是这样的——在商业案例上花费数周时间乞求签署,煞费苦心地清理(如果你可以称之为)数据,绝望地希望有一个可靠的模型,令人头晕目眩的几个小时的分析……最后……洞察力被很好地、真正地可视化,准备好接受一面坚实的数字。

以前有效的方法。

然后,什么都没有了………一个被沉默摧毁的项目,沉得无影无踪。为什么?

这么多问题没有得到解答。动摇的信心。那些阴险的自我怀疑开始蔓延。

接下来去哪里?

"教你的舌头说我不知道,你就会进步."哲学家迈蒙尼德(1135-1204)

鉴于数据科学的潜力塑造了我们如此多不确定的未来,也许有必要寻求那些经常被问及的问题的帮助,那些没有数据驱动答案的问题。

那么,我们敢不敢通过一个不同的、不那么透明的透镜来看待这个领域呢?一个有很多灰色阴影的?并探究隐藏之手的影响…其微妙的含义和微妙的细微差别只能来自人类在玩。

为了更好地理解为什么有些事情会以这种方式发生,数据科学项目是如何在勾选了所有选项后失败的……而另一些人在他们可能不应该成功的时候成功了。

也许,仅仅是也许,我们可能会得到这个领域在世界上真实表现的线索。

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

(Sep 2019) Book Fair, Bangsar Village 2, Kuala Lumpur

ecoVIZ

原文:https://towardsdatascience.com/ecoviz-39a8e50c6c1?source=collection_archive---------31-----------------------

墨西哥城公共自行车共享系统的视觉探索

埃斯特万·卡斯蒂略·蒙德拉贡

杰洛尼莫阿兰达巴罗瓦

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

Cover page. The first 10,000 trips of September 2019

ecobici 网络是一个为大量用户提供服务的系统,因此,它是一个拥有 480 个站点的复杂系统,每月约有 600,000 次旅行。众所周知,骑自行车对健康有好处,可以节省用户的短途旅行时间,同时有助于保护环境,减少城市交通拥堵。

网络状态

ECOBICI 产生的数据量是巨大的,因为每个行程产生一个记录,这些行程中的每一个记录字段,例如:

  • 用户的年龄和性别。
  • 撤站和到站。
  • 撤离和到达时间。
  • 除其他外。

为了开始理解 ECOBICI 系统,让我们从开始可视化一周内的行程分布。

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

Figure 1. Distribution of withdrawals during a week of March 2019 every hour.

当我们将取款视为一个时间序列时,这些为工作日、周五和周末定义的模式立即凸显出来,让我们看看 2019 年 4 月每种类型的平均分布。

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

Figure 2. Withdrawal daily distribution in April 2019

看到工作日和周末之间的明显区别是很有趣的。除了星期五下午之外,工作日之间的分布似乎是相同的。在节假日,这在**图 2 中。**恰逢复活节假期周的日子,分布与周末几乎一致。工作日是出行次数最多的日子,这些日子具有双峰分布,高峰与工作日的出入时间一致。在周末,该系统在中午达到最大使用率。

工作日

工作日是最活跃的,在上午和下午有两个明显的高峰时间,看到前面的图表,我们可以毫无顾虑地确认工作日实际上是相同的,这就是为什么我们认为可视化工作日中的活动足以理解系统中的大多数活动。

以下视频显示的是 ECOBICI 在 2019 年 6 月 12 日的总活动量,选择这一天是因为在样本中是一个普通工作日,注意不要因为天气或其他原因选择非典型日。这一天共有 32,363 次出行,高峰时段每小时 3,738 次。

在高峰时段(大约早上 8 点和晚上 8 点)可以随意暂停。).

Figure 3. Activity throughout June 12, 2019

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

让我们花点时间来理解前面的图表,从而能够提取它给出的所有信息。让我们从把车站想象成每个圆圈开始。圆圈的大小对应于该站每小时的取款和到达的总和,140 次到达加上取款是该站每小时的最大活动。这些站里里外外都是彩色的。内部颜色响应每小时显示的余额,也就是说,在该站一小时内是否有更多的提款或到达。深红只代表撤回,深蓝代表到达,白色代表完美的平衡。外观颜色对应的是站点的状态,即 ECOBICI 在该时间段在该站点所占的自行车位比例,暗红色表示站点没有可用的自行车,白色表示站点已满。行程由两个站点之间的直线定义,显示每小时的行程次数。

视频的再现可以正确识别高峰时间,也可以看到早上公共交通附近的车站,如 Polanco 和 Buenavista 地铁站,是大多数旅行的起点,旅行的终点是高劳动力区域,如 Polanco 和 Reforma Avenue 的某些部分。这种现象在下午几乎完全相同,但方向相反,现在劳动力密集的区域变成了起点,而到达点是与更高范围的公共交通的交叉口。让我们来看看早高峰时段的一帧视频。

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

Figure 4. ECOBICI June 6 8:30 am. 2019

显示屏突出显示系统外围的饱和度。这表明该系统的大部分用户来自其他地方,他们可能对该系统的更广泛覆盖感兴趣。

此外,如果我们关注车站的状态(每个圆圈的边缘),可以看到在到达和离开的每个突发之后,车站是满的和空的,具有许多到达的车站变得饱和(白色边界),与具有许多撤回的车站变得空(黑色边缘)相反。

共享自行车系统的特殊动态表明,通过再平衡来强调库存优化,如 *— Castillo,2019 所示。*避免饱和和缝隙。

一点透视和尺度

ECOBICI 的用户是哪些人?通过工作日的旅行分布,我们可以推断,一般来说,这些用户对应于工作人员。让我们再深入一点,通过下面的图片来更好地理解他们的简介。

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

Figure 5. Percentage of trips by sex in September 2019

看到性别在使用上的巨大差异可能是一个警告,表明存在性别问题,在更深入的分析中,这种差异可以在每个车站中可视化,以表明在 ECOBICI 覆盖的城市全景中妇女或多或少的安全区域。

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

Figure 7. trips by age histogram in September 2019.

另一方面,年龄的分布突出了社会项目的机会领域,如将青少年纳入系统,或鼓励 40 岁以上的人参加体育活动的可能性。

现在,让我们稍微放松一下对 ECOBICI 的关注,从的规模获得一些视角,让我们看看这个城市所包裹的系统。

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

Figure 7. ECOBICI and Mexico city.

ECOBICI 占据了墨西哥城很小的面积!然而,重要的是要明白,墨西哥城的近三分之一被密尔沃基和埃尔阿胡斯科周围的森林地区占据,所以让我们通过放大一点来只关注市区。

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

Figure 8. ECOBICI, subway(orange dots) and urban area.

扩展该系统的机会是巨大的,包括可能与墨西哥州的城市地区整合,以及与覆盖范围更广的其他交通系统整合。这也引发了人们的想象,即能够将农村地区的山区生态社区纳入其他肯定会促进社会福利的可能项目中。

汇总系统信息

由于本文是一个可视化练习,我们创建了下面的图表,目的是可以在大尺寸的打印中观察到它。它显示了 2019 年 9 月期间 ECOBICI 的总活动量。如果我们放大图表,我们可以详细观察每个车站的名称、其活动、车站之间的流量以及系统附近的地铁站。

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

Figure 9. Flow during September 2019 (Click here to see image full size)

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

接近这种视觉化可以让你对一个可能的新自行车道和站点网络产生一个相当健壮的第一想法。免除要求,因为这些路线中的许多已经被占用,在公共道路上为这些生态自行车手和骑自行车的人留出一些咪表将认可他们,并为他们提供政府的安全保障,此外,即使对他们存在少数激励措施,也支持智能移动系统。扩大这些形式的流动性将改善许多目前处于红色数字的社会变量。

  • 通过增加体育活动来增进健康。
  • 由于碳氢化合物驱动的运输减少,空气质量提高。
  • 道路拥堵减少。
  • 减少其他公共交通系统的超载,特别是在著名的最后一英里。
  • 除了使用自行车造成的其他已知影响之外。

结论

对当代社会项目规模的适当关注是其成功的最重要的变量之一,这就是为什么我们相信合作。我们还确信,公共解决方案的搜索和验证必须是一项集体工作,因此,在这个项目中开发的所有分析都可以复制,因为所有脚本都可以在这个公共存储库中获得。最初的西班牙文文章是在 Jupyter 笔记本中设计的,而内容 50%是用 Pythonmatplotlib 图形制作的,50%是用 Rggplot 制作的,以提及一些被占用的自由软件库。我们自豪地宣布,它在由 CIMAT 举办的数据可视化竞赛中获得了第一名!

对数据的正确解读可以为公共政策的有效实施提供必要的杠杆,我们庆祝最近由交通部长发布的公告ECOBICI 系统的新招标,我们希望获胜者考虑现有的信息,以前的解决方案是成功的,但是它已经达到饱和。如果新的解决方案能更好地被妇女和年轻人以及来自不同殖民地的人们所采用,那就太好了。

我们希望除了在读者的头脑中产生其他的东西之外,这些形象化的东西足以支持我们的叙述。

二战期间气象站的 EDA

原文:https://towardsdatascience.com/eda-of-weather-stations-during-wwii-bddfff8e8872?source=collection_archive---------29-----------------------

与 GeoPandas 和 Seaborn 一起讲述一个不同的战争故事

第二次世界大战是人类历史上最致命的冲突之一,夺去了数百万人的生命,并塑造了我们至今的政治、社会和经济环境。除了武器和子弹,天气在冲突中也扮演了重要角色。

诺曼底登陆日本不应该在 6 月 6 日,但由于恶劣的天气条件而推迟了。太平洋剧院的部队不得不在战斗间隙承受相当大的降雨量。更不用说德军不得不面对温特将军。

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

气象站数据集

在战后几十年的今天,由于 国家环境信息中心 的努力,任何人都可以方便地下载战争期间许多国家的天气数据,但数据集也可以在 Kaggle (以及互联网上的许多其他地方)获得。

这里的目标是检查气象站在全球的空间分布情况,并了解有多少气象站位于不同的国家。假设你要用一点代码更新 NCEI 的地图。

DataFrames制作地图

像往常一样,首先从工具箱中拿出工具:

除了通常的Pandas 之外,为了制作地图,你将使用[GeoPandas](http://geopandas.org/)[Shapely](https://shapely.readthedocs.io/en/stable/manual.html)包的组合,你可以安装:

现在你已经做好了一切准备,用Pandas读取数据集:

如果你从 Kaggle 下载数据集,你可能会看到两个文件:一个是实际的天气数据,另一个是关于气象站的信息,也就是你在上面读到的那个,所以我们将把天气分析留到另一个时间。数据集如下所示:

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

到目前为止,那只是另一个普通的DataFrame,所以你怎么能把它做成地图呢?首先,您需要创建另一个包含每个气象站的'Longitude''Latitude'的列,然后是applyPoint函数,这样GeoPandas就可以了解位置:

顺便说一下,您的DataFrame现在包含了'Coordinates'列,看起来像这样:

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

'Latitude''Longitude'的值共同构成一个Point像一个有序的对被绘制在一个笛卡尔平面上,有了这个信息你可以构成一个不同类型的DataFrame:一个由GeoPandas解释的GeoDataFrame

最后,一切准备就绪,您可以看到二战期间全球气象站的分布:

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

GeoPandas可以读取你可能有的各种形状文件,但这里你使用的是来自自然地球的简单标准naturalearth_lowres形状。

从表面上看,气象站的数量并不令人印象深刻,甚至与我们今天拥有的气象站相差甚远。除了这里和那里的几个点,没有关于美国天气的数据,更不用说饱受战争蹂躏的欧洲,但从好的方面来看,我们有一些非洲和太平洋剧院的电台,显然巴西也有一些。在这一点上,你应该花一分钟考虑一下在战争期间保存天气信息有多困难,你会看到上面的数量是相当可观的。

总共有 161 个气象站,但是每个国家有多少个?使用Pandas,这个问题很容易回答。

各国气象站

活动这一部分的目标是groupby将每个站点分配到其所在的国家和count总数量,这可以通过Pandas轻松完成:

你不喜欢Pandas有多优雅吗?任务已经完成,但是用Seaborn的手来策划一下也无妨:

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

单个来看,大多数国家只有一个自己的气象站,而澳大利亚和日本等太平洋沿岸国家明显高于平均水平。查看这些信息的另一种方式是通过直方图,这也很容易通过Seaborn获得:

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

现在,正如你所看到的,这里考虑的大多数国家在二战期间只有一个空间站,但我们并没有抱怨。虽然直方图非常简单,但它能很好地展示任何时间序列的频率分布。

结论

第二次世界大战气象站数据集非常有趣,如果你是一个历史迷,它也可以提供一些不错的新的好奇心。它也是空中轰炸数据集的同伴,所以也来看看这个。

只需一点探索性数据分析(EDA),您就可以提供关于数据的新见解和信息,因此有时简单是最好的,一些工具永远不会过时。

如果你想下载源代码和上面的图表,有一个资源库你可以直接到这里去获取。

干杯!

基于网络的图形 EDA x

原文:https://towardsdatascience.com/eda-on-graphs-via-networkx-a79d2684da53?source=collection_archive---------20-----------------------

利用 networkx 库探索生态小区生境分类学

介绍

探索性数据分析(EDA)旨在发现数据中隐藏的结构。基于手头的数据,EDA 可能包括特征和标签的相关性分析、样本的分布分析、散点图、直方图等等。EDA 对于从建模和预测阶段可以利用的数据中获得洞察力非常有用。

从某种意义上说,图是一种特殊的数据结构,因为已知某些样本(相邻顶点)在某种程度上更相关。与大多数 ML 数据集不同,图可能没有明确的特征。在这种情况下,发现图中的结构变得更加重要,因为这是唯一的事情。

在这个故事中,我们将考虑细菌栖息地的分类。作为语义搜索项目的一部分,我和赛仑·帕拉尔对这个分类法很感兴趣。个体生态位是细菌可以生存的环境层次。个体生境通过定义栖息地(顶点)之间的关系来指定层次,这是数据中唯一的交互类型。然而,每个顶点都与一个在本体中标识它们的 ID 和一个映射到真实名称的名称相关联。在 BioNLP 任务下共享了 OntoBiotope,其 2016 版可以在这里找到。

图表统计

我们对生态小区进行处理以创建一个无向图,其中两个节点是相邻的,如果它们之间有一个*关系。让我们先看看有多少个节点和边。注意,我们将 networkx 图存储在一个名为 graph 的变量中。*

print(graph.number_of_nodes(), graph.number_of_edges())
2320, 2528

由于个体生态位是一种分类学,因此预期边的数量少于具有这么多节点的常规图。为了分析图形结构,让我们计算深度、直径和最大团大小。为了计算深度,我们计算从根到每个其他节点的最短路径,并找到最大最短路径距离。

depths_graph = nx.shortest_path_length(graph, source='OBT:000000')
depth = max(depths_graph.values())
diameter = nx.algorithms.distance_measures.diameter(graph)
max_clique_size = nx.algorithms.clique.graph_clique_number(graph)print(depth, diameter, max_clique_size)
10, 20, 3

我们看到离根最远的节点距离为 10,而最远的节点对距离为 20。假设我们的图有一个树状结构,直径是深度的两倍是一个普通的结果。另一方面,我们可以看到它不是一棵树,因为它包含一个 3 的团,这是树的一个禁忌结构。下面我们可以看到一个来自个体生态位的 3-集团。

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

A 3-clique from OntoBiotope.

节点统计

看了一下整个图的结构,现在让我们单独考虑节点。中心性度量经常用于描述节点的特征。尽管有许多变体,我们将考虑唯一的度和特征值中心性,因为大多数变体的行为相似。多亏了 networkx,计算这些分数非常简单。

degree_cent = nx.degree_centrality(graph)
eigen_cent = nx.eigenvector_centrality(graph)

当我们分析结果时,我们看到实验介质在两种情况下都具有最高的中心性分数。这个节点位于深度 1,并且与许多栖息地相邻,因为它有一个相当全面的定义。

改进

基于我们目前的分析,我们可以说,生态小区是一个具有小集团和很少中心节点的松散连接的图。因此,我们需要丰富其内容,以获得更多的洞察力。为此,我们利用分类提供的 PubMed 摘要。在提供的摘要中,对这些栖息地的提及已经被注释。

假设在抽象中共存的栖息地是相关的,我们可以在图中使它们相邻。

当我们使用这个假设时,我们在现有的图中引入了更多的边,并创建了新的关系。我们现在可以重新计算之前的统计数据。

depths_graph = nx.shortest_path_length(enriched_graph, source='OBT:000000')
depth = max(depths_graph.values())
diameter = nx.algorithms.distance_measures.diameter(enriched_graph)
max_clique_size = nx.algorithms.clique.graph_clique_number(enriched_graph)print(enriched_graph.number_of_edges, depth, diameter, max_clique_size)
3610, 10, 16, 15

这里我们看到边的数量显著增加。相应地,直径从 20 缩小到 16,集团数量从 3 增加到 15,这是一个巨大的变化!另一方面,树的深度仍然相同,这意味着从根到叶子的距离没有改变。然而,根据直径的减小, 我们可以得出结论,新的路径是由树叶之间的共现关系引入的。

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

The larges clique in the enriched OntoBiotope

现在让我们观察中心性的变化。我们一起绘制两个图的度和特征值中心性的直方图。我们采用中心性分数的对数来处理小数字。

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

Degree centrality histograms of the original and enriched graphs.

在上面的直方图中,我们看到富集导致了向高中心性节点的转移。 这意味着某些节点在 PubMed 摘要中比其余的 被提及得多。因此,低中心性节点的频率降低。

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

Eigenvalue centrality histograms of the original and enriched graphs.

特征值中心性直方图具有不同于度中心性的特征。我们观察到,在初始图中,中心性主要集中在同一个箱中。使用浓缩物,将这群人分散到两边。 因此,富集在数据中创造了一种方差,这种方差可以被机器学习模型所利用。

结论

在这个故事中,我们从几个不同的方面分析了生物群落分类。在分析过程中,我们观察到该图的信息并不丰富,我们应用了基于文本共现的丰富。重新计算统计数据,我们已经看到中心性和扩大的子结构(如 15 人集团)的方差增加。请注意,EDA 是一个永无止境的迭代过程,它为建模阶段提供信息,也被建模阶段提供信息。如果你有兴趣,可以从这个回购开始关注我们项目的状态。

参考

[1]http://2016.bionlp-st.org/

用这段 Python 代码自动编辑你的视频!

原文:https://towardsdatascience.com/edit-your-videos-automatically-with-this-python-code-c704cc413a1?source=collection_archive---------13-----------------------

是的,这是真的,小心编辑!!谢谢 Python。

时候到了!我正在为商业科学和 T2 科学等令人惊叹的公司制作课程,我正在编辑视频,这是一件痛苦的事情!!我在这里给你展示的软件是由伟大的卡里克开发的。

该系统的目标是编辑视频中令人讨厌的沉默,我们犯的错误,以及几乎所有你喜欢的东西。

它不会把你的视频变成一个美丽的视频,但至少它会让你省下一小时又一小时听自己失败的时间。

如果你不是视频制作者,但你在网上观看视频,这可以帮助你更快地观看。我记得当我在学习的时候,我看了很多斯坦福和麻省理工的视频,花了我几个小时,很多时候教授甚至不说话。所以这个也能帮上忙。

装置

我在 MatrixDS 上测试了这个系统,matrix ds 是在几秒钟内免费推出终端和 Jupyter 笔记本的最佳工具之一。所以你可以在那里复制它。

您需要做的第一件事是克隆回购:

[## 卡里克/jumpcutter

自动编辑 vidx。这里解释一下:https://www.youtube.com/watch?v=DQ8orIurGxw-卡里克/jumpcutter

github.com](https://github.com/carykh/jumpcutter.git)

git clone [https://github.com/carykh/jumpcutter.git](https://github.com/carykh/jumpcutter.git)

然后安装要求:

cd jumpcutter
pip install --user -r requirements.txt

你还需要 ffmpeg。如果你在 Ubuntu 上:

sudo apt update
sudo apt install ffmpeg

如果您在 MatrixDS 中,您需要成为 root 用户,因此:

sudo su
apt install ffmpeg

使用

现在是有趣的部分!我制作了一个简单的视频来测试这一点。这里可以看到原视频:

我在 MatrixDS 里做的是把视频上传到克隆的 repo 的同一个文件夹里。然后在运行该命令后:

python3 jumpcutter.py --input_file auto_2.mp4 --sounded_speed 1 --silent_speed 999999 --frame_margin 2

我在几秒钟内就编辑好了我的视频。秒!!

您可以在这里看到结果:

这简直太棒了:)

现在还没有太多关于这个软件的文档,但是代码是开源的,所以你可以去回购看看所有的东西。

基本命令是

python jumpcutter.py --input_file path/to/file.mp4

您可以使用以下选项:

optional arguments:
  -h, --help            show this help message and exit
  --input_file INPUT_FILE
                        the video file you want modified
  --url URL             A youtube url to download and process
  --output_file OUTPUT_FILE
                        the output file. (optional. if not included, it'll just modify the input file name)
  --silent_threshold SILENT_THRESHOLD
                        the volume amount that frames' audio needs to surpass to be consider "sounded". It ranges from 0 (silence) to 1 (max
                        volume)
  --sounded_speed SOUNDED_SPEED
                        the speed that sounded (spoken) frames should be played at. Typically 1.
  --silent_speed SILENT_SPEED
                        the speed that silent frames should be played at. 999999 for jumpcutting.
  --frame_margin FRAME_MARGIN
                        some silent frames adjacent to sounded frames are included to provide context. How many frames on either the side of speech
                        should be included? That's this variable.
  --sample_rate SAMPLE_RATE
                        sample rate of the input and output videos
  --frame_rate FRAME_RATE
                        frame rate of the input and output videos. optional... I try to find it out myself, but it doesn't always work.
  --frame_quality FRAME_QUALITY
                        quality of frames to be extracted from input video. 1 is highest, 31 is lowest, 3 is the default.

是啊!你甚至可以通过一个 YouTube 视频链接,它会下载原来的视频,并改变视频创建一个新的。为此,该命令将如下所示:

python3 jumpcutter.py --url [https://youtu.be/2MjlMpEzDA8](https://youtu.be/2MjlMpEzDA8) --sounded_speed 1 --silent_speed 999999 --frame_margin 2 --frame_rate 3

仅此而已。

可爱的作品。顺便说一下,这些代码只有 203 行代码!这些天来,Python 的力量让我感到惊讶。

感谢你阅读这篇文章。如果您有任何问题,请在此写信给我:

[## 法维奥·瓦兹奎——science y Datos | LinkedIn 创始人/首席数据科学家

加入 LinkedIn ‼️‼️重要提示:由于 LinkedIn 技术限制,我现在只能接受连接请求…

www.linkedin.com](https://www.linkedin.com/in/faviovazquez/)

祝学习愉快:)

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

教育技术和算法透明性

原文:https://towardsdatascience.com/edtech-algorithmic-transparency-76b7985fa018?source=collection_archive---------16-----------------------

对卡米拉·坎贝尔 SAT 成绩的调查提醒人们透明和可解释的人工智能的重要性

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

Photo by NeONBRAND on Unsplash

围绕佛罗里达州高中生卡米拉·坎贝尔的 SAT 分数调查的最近新闻为日益增长的教育技术领域中围绕算法透明度的问题提供了一个有趣的视角,该分数被大学委员会标记为可能作弊。虽然很可能只有一部分用于标记考试的过程是自动化的,但双方的回应凸显了在越来越被不透明算法主导的教育领域将变得司空见惯的问题。

背景

据 CNN 和其他媒体报道,Campbell 的第二次 sat 考试取得了 330 分的进步,但在发现她的答案与其他学生的答案非常相似后,被大学委员会扣留并进行调查。由民权律师本·克伦普代理,坎贝尔请求及时公布她的 SAT 成绩,以便她被大学录取并申请奖学金。克伦普说:“【1230 分(分数)对她是否能进入梦想中的大学以及她是否负担得起有很大影响。

大学委员会发布了一份声明,澄清了他们的审查过程,该过程着眼于各种因素,以确定学生的分数是否应该因涉嫌作弊而被保留或取消。作弊的证据可能包括一个学生的答案与一组其他学生的答案之间的高度相似性,存在(在该组中)以前被取消分数的学生,答案与被没收的“小抄”的相似性,以及学生的测试手册中没有草稿。大学委员会发给坎贝尔的这封信引用了“(她)在考试的一个或多个得分部分的答案与其他考生的答案基本一致”作为将考试标记为审查的原因。虽然在原始文章或评论声明中没有说明,但这个初始标志可能是该过程中唯一自动化的部分。

人工智能与教育技术的相关性

不管审查过程的结果如何,也不管坎贝尔对公布分数的要求如何,围绕这个故事的言论凸显了对教育科技行业来说很重要的几个问题,即在人工智能和机器学习方面投入巨资作为其未来。

透明度

克伦普向美国有线电视新闻网明确表示,过程的透明度是一个关键问题,他说*“她现在被指控作弊。为什么呢?他们说,‘哦,你只需要相信我们的话,我们发现有些事情是错的,’”*,T4 补充道,“他们需要告诉我们(他们看到了什么)。”

这提醒我们,当大部分技能或能力评估完全自动化时,透明度是多么重要。大学委员会最初的信,以及他们后来发布的声明,试图通过概述他们的过程来解决这个问题,但它的不完整性留下了许多问题。—标记过程是自动化的吗?答案需要有多相似才能被标记出来?这个截止日期是如何选择的?高于此临界值的相似性的假阳性率是多少,它是如何确定的?—这些问题的答案是存在的,但是它们是否已经有效地传达给了相关的利益相关者?

欧洲委员会人工智能高级专家组(AI HLEG)已经为他们所谓的“值得信赖的人工智能”起草了道德准则,并且他们提供了关于透明度的特别建议。他们建议供应商“以清晰和主动的方式向利益相关者提供关于人工智能系统的能力和局限性的信息……”,进一步建议他们必须“努力促进人工智能系统的可审计性,特别是在关键的环境或情况下。尽可能地设计你的系统,使之能够追踪个人决策到你的各种输入;数据、预先训练的模型等。此外,定义人工智能系统的解释方法。”

一个担忧可能是:大学董事会能提供多少信息而不冒人们试图“玩弄系统”的风险?用 AI HLEG 的话说,“要注意不同目标之间可能存在根本性的矛盾(透明度可能会为滥用敞开大门;识别和纠正偏见可能与隐私保护形成对比)。沟通并记录这些权衡。”

Crump 选择关注透明度的事实很能说明问题,EdTech 的教训是,在部署评估算法之前,必须充分考虑这些问题。

有责任

Crump 公布分数的另一个重点是相互问责的问题。他认为“他们希望这些学生对他们负责,但是这个系统不对任何人负责。…好吧,这一次,他们也必须对此负责。”

这一信息应该会引起那些开发和部署算法解决方案来评估、评分、测量和预测人类技能和行为的人的强烈共鸣。机器所做决策的后果以潜在的重要方式影响着现实中的人,当出现问题时谁该负责的问题变得越来越恰当。 Forrester Consulting 的一项调查(受毕马威国际公司委托)发现,62%的受访者将归咎于开发导致自动驾驶汽车事故的故障软件的公司,54%的人还将归咎于安装该软件的制造商,以及本可以手动控制的司机(这是一个“选择所有适用的”问题)。在 EdTech 中的类比是,创建人工智能软件的供应商在出现错误的情况下陷入困境,紧随其后的是购买该软件的学区或机构以及选择使用它来代替直接人工评估的教育工作者。

这并不意味着大学委员会做错了什么,或者人工智能没有令人难以置信的潜力来改革和民主化教育,但 Kamilah Campbell 案件提出的问题确实给了 EdTech 创新者停下来仔细考虑开发过程中每一步的透明度和问责制问题的理由。

用 BCI.js 在 Node.js 中进行脑电运动想象分类

原文:https://towardsdatascience.com/eeg-motor-imagery-classification-in-node-js-with-bci-js-d21f29cf165?source=collection_archive---------14-----------------------

检测与想象动作相关的脑电波

脑机接口(BCI)允许只使用你的思想来控制计算机和其他设备。实现这一点的一种流行方法是用脑电图(EEG)检测运动想象。本教程将介绍运动想象的检测和分类。我把它分成了五个部分:

  1. 加载数据
  2. 特征抽出
  3. 训练分类器
  4. 测试和分析结果
  5. 改善结果

您可以在其 GitHub repo 中找到本教程中使用的完整代码和数据。

第 1 部分—加载数据

首先,为项目创建一个新目录。然后,在项目目录中,将数据下载到名为“data”的文件夹中。我们将使用在 http://bnci-horizon-2020.eu/database/data-sets 的发现的‘四级运动想象(001–2014)’数据集。我已经将数据集制作成 CSV 文件,您可以从下面下载:

您还可以使用 bash 的这个脚本或 PowerShell 的这个脚本下载数据。

如果您想试验来自不同主题或数据集的数据,可以使用。mat 文件可以在本教程的 GitHub repo 中找到。您还可以在 data/ 目录中找到包含其他想象运动的 CSV 文件。

我们将使用 BCI.js 将数据加载到 Node.js 中。如果你没有安装 Node.js,可以在这里下载

一旦安装了 Node.js 和 NPM,通过在项目目录中运行以下命令来安装 BCI.js

npm install bcijs

现在我们可以从项目目录的根目录下的 classify.js 开始。首先需要 BCI.js 并加载相关的 CSV 文件。由于 CSV 加载方法是异步的,我们必须将它们包装在一个异步函数中,并使用 await 关键字,这样 Node.js 在文件加载之前不会继续:

第 2 部分—特征提取

一旦数据被加载,我们将使用公共空间模式 (CSP)作为特征提取方法的一部分。CSP 试图设计数据,使得当想象脚运动时,第一个信号将具有高的方差,而最后一个信号将具有最低的方差,而当想象右手运动时则相反。考虑到这一点,我们可以使用每个 CSP 信号的方差作为分类的特征向量。

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

本教程遵循 Christian Kothe 在他的 CSP 讲座中描述的方法。如果你想了解更多,他有关于 CSP 和 BCIs 的精彩讲座。

现在我们可以开始研究特征提取方法了。CSV 中的每 750 个样本来自单独的 3 秒试验。我们可以使用 BCI.js 中的 windowApply 方法从每个试验中选择数据。第三个参数是窗口的大小,最后一个参数是窗口每次迭代应该走多少步:

对于每次试验,我们将数据分成大约四分之一秒的窗口或时段,我们可以使用 CSP 生成一个特征向量。取方差的对数使数据更加正态分布,这将有助于以后训练分类器。

我们传递 epochSize/2 作为窗口步长,因此窗口之间有 50%的重叠。方法 bci.features.logvar 用于计算每个 CSP 信号方差的对数。值“columns”被传递,因为在 2d 数组“cspSignals”中,每一列是一个信号,每一行是一个样本。最后,我们将每次试验的特征连接成一个长的特征向量阵列。

第 3 部分—训练分类器

现在我们有了特征,让我们学习一个分类器。线性判别分析(LDA)是 BCIs 的一种常用分类器。它使用训练集数据的均值和标准差来绘制两个类之间的分界线(或更高维度中的超平面)。你可以在 https://bci.js.org/examples/lda/找到关于 LDA 如何工作的视频演示。

要学习 LDA 分类器,您可以使用 ldaLearn 方法:

第 4 部分—测试和分析结果

现在我们已经学习了一个分类器,让我们使用测试集来评估它。为此,我们将使用 ldaProject 方法。当预测是第一类时,它返回负数,当预测是另一类时,它返回正数。如果它返回一个接近零的值,那么它对分类就更加不确定。

一旦我们使用 ldaProject 来预测训练集数据的类别,我们就可以使用混淆矩阵来评估它的性能。混淆矩阵将数据放入 2x2 矩阵中,其中每个单元代表以下内容:

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

我们可以使用混淆矩阵方法计算这个混淆矩阵。最后,我们计算平衡的准确度(脚运动的准确度和右手运动的准确度的平均值),以查看我们的分类器执行得有多好(完整的脚本可在此处找到):

通过运行这段代码,我们获得了以下结果:

混淆矩阵:

1243  275
198   1342

平衡精度:

0.84513

这是一个不错的结果,在 3058 个特征中,2585 个被正确分类。然而,当 ldaProject 返回值接近零时,我们可以通过让分类器返回“unknown”来实现更高的准确性。

通过过滤掉 LDA 预测接近零的值,我们可以看到添加“未知”会如何影响我们的结果:

通过这种修改,我们得到以下结果:

混淆矩阵:

925  81
67   940

平衡精度:

0.92647

34.17%的分类被返回为未知。虽然这是一个很高的百分比,在每秒四个分类的情况下,大约每三个结果中就有一个被丢弃仍然会产生相当快的响应时间。代价是,我们达到了 92.6%的准确率。通过一些改进,我们可以得到更高的结果。

第 5 部分—改善结果

带通滤波

我们可以通过对数据进行带通滤波来去除噪声和不需要的频带,从而进一步改善结果。在 Christian Kothe 关于 CSP 的讲座中,他建议在 7 到 30 赫兹之间进行过滤。我们可以使用 fili 添加一个带通滤波器:

npm install fili

然后,修改特征提取方法以包括带通滤波器:

这一修改为我们提供了以下结果:

混淆矩阵:

898  54
54   960

平衡精度:

0.94501

除了准确率上升到 94.5%,分类为未知的结果的百分比下降到 21.4%。

在修改后的代码中,您可以看到我们将 filterOrder 设置为 128。高阶滤波器意味着它可以更精确地过滤 7 到 30 Hz 之间的频率。Fili 包含一个关于滤波器阶数如何影响滤波器的互动演示。例如,传入以下参数:

类型:FIR,Fs: 250,Fc: 7,Fc2: 30,FIR 阶数:32,计算:Sinc 带通

我们得到:

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

但是将滤波器阶数从 32 改为 128,我们得到:

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

在第一个例子中,只有大约 19 Hz 保持接近 100%,而其他频带被最小化。然而,在具有高阶滤波器的第二示例中,7 和 30 Hz 之间的值保持接近 100%,而其他频带被过滤到大约 0。

最后,如果我们允许更多的未知数,我们可以达到更高的精度。通过将分类方法中的阈值从 0.5 更改为 1,我们将未知百分比增加到 47.7%,并得到以下结果:

混淆矩阵:

672  16
22   599

平衡精度:

0.97066

逻辑回归

我们还可以将 LDA 视为一种降维方法,并将输出传递给逻辑回归,逻辑回归估计样本在每个类别中的概率。为此,我们可以使用 js-regression :

npm install js-regression

上述代码将 58.4%归类为未知,并给出以下结果:

混淆矩阵:

568  10
11   451

平衡精度:

0.97944

就是这样!

这是我的第一个教程。我感谢任何反馈,并将回答任何问题。如果你对更多与 BCI 相关的帖子感兴趣,你也可以在 Twitter 上找到我。

GitHub 上的 BCI.js:

[## pwstegman/bcijs

JavaScript — pwstegman/bcijs 中的脑电信号处理和机器学习

github.com](https://github.com/pwstegman/bcijs)

BCI.js:

[## bcijs

脑电信号处理和机器学习

www.npmjs.com](https://www.npmjs.com/package/bcijs)

其他库:

fili —一个用于 JavaScript 的数字过滤器库

js-regression —线性回归和逻辑回归的 JavaScript 实现

早在 2017 年,我就开始了 WebBCI 的工作,后来它变成了 BCI.js。我后来在 WebBCI 上发表了一篇论文,并讨论了初步的基准测试以及用 JavaScript 处理脑电图的有效性。如果你很好奇或者想在发表的作品中使用 BCI.js,请查看我关于这个主题的论文:

页(page 的缩写)Stegman,C. Crawford 和 J. Gray,“WebBCI:建立在现代网络技术上的脑电图工具包”,载于《增强认知:智能技术》,2018 年,第 212-221 页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值