重塑熊猫的数据框架
用 python 重塑数据帧的终极指南
介绍
Pandas 无疑是 python 中使用最多的包之一。对于阅读本文的大多数人来说,这可能并不奇怪。许多人用熊猫来做不同种类的数据分析等等。但是,在某些情况下,我们可能希望以不同于最初提供的格式来重塑或可视化数据。这可能是由于各种原因。这可能是因为人们发现不同的表达方式更容易理解。这也可能是因为你想有一个特定的格式来运行你的代码。无论原因是什么,重塑数据框架可以被视为我们大多数人在作为数据科学家/分析师的旅程中所做的一项常见任务。本文将简要介绍一些有用的函数,这些函数可以用来重塑熊猫的数据帧。
作者图片
我喜欢认为重塑函数有两种类型。第一类功能简单的改造现有的数据框架。例如,它们将列更改为行,将行更改为列。第二种类型的功能将聚合信息并对其进行重组。在大多数真实情况下,我们会使用第二种类型的函数,因为它可以根据需要让我们看到更高级别的汇总或聚合。
类型 1:没有聚集的重整
理想情况下,没有聚合的重组可以而且应该应用于存在唯一选择组合的数据。否则,他们很可能会对某些函数抛出错误。
为了解释没有聚集的重整,我们将首先声明一个数据框架。声明和数据框架如下:
使用这个数据框架,我们可以看到一些对改造/整形有用的功能。
在枢轴上转动
Pivot 方法通常用于创建数据的透视样式视图,用户可以在其中指定行(在 python 中称为索引)和列。这两个参数将为视图提供一个结构,而要填充的信息将来自用于创建 pivot 的数据。也可以使用 values 参数有选择地填充信息。现在让我们看一些例子来更好地理解它。
df.pivot(index='Date', columns='Class', values='Numbers')
作者图片
正如我们从上面所看到的,一旦指定了索引、列、值,就形成了新的透视样式数据帧的结构,并相应地填充了索引、列对的组合所特有的信息。
请记住,建议始终填充索引和列参数,因为这将决定最终数据帧/视图的结构。让我们看看如果不声明 values 参数会发生什么。
df.pivot(index='Date', columns='Class')
作者图片
如果我们不指定 values 参数,pandas 将创建所有各种可能的视图,同时将所有列名与上面指定的索引和列分开。因此,对于具有多个列的大型数据集,建议也指定 value 参数。
然而,使用上面的代码并稍微调整一下,还有另一种方法来提取关于一列的信息。这将是如下。
df.pivot(index='Date', columns='Class')['Numbers']
作者图片
如果我们提到上面给出的列名,而没有指定 values 参数,那么结果输出将是相同的。这样做的唯一缺点是需要更长的时间来执行。需要注意的是,列名声明类似于数据帧子集的语法。这是因为我们确实正在这样做。使用上面的代码,pandas 首先获得所有列的结果,然后使用括号中指定的列名,pandas 对数据帧进行子集化并显示出来。这也是为什么这个方法的执行时间比我们使用 values 参数的方法要长。
注意:使用 pivot 函数时,如果行*列的组合有多个条目,该函数将抛出一个错误,因为 pivot 不会进行任何类型的聚合。
熔化
Melt 是一个用于将列转换为行的函数。这意味着当用户希望将一列或多列信息放入行中时,这个函数非常有用。该函数将通过删除除 id_vars 参数中提到的列之外的所有其他列来创建两个新列,并在一列中显示列名,在另一列中显示其值。让我们看一个例子来更好地理解它。
df.melt(id_vars=['Date','Class'])
作者图片
在数据帧 df 中,我们有四列,其中在 id_vars 参数中提到了日期和类别。这将给我们留下列号和列号 2。正如我们在上面看到的,该函数创建了两个名为 variable 和 value 的新列,并用列名和 Date+class+列名组合的唯一值填充它们,同时删除列号和 Numbers2。
如果只有特定的列要以这种方式转换,而不是所有的列,那么参数 value_vars 将帮助我们实现这一点。
df.melt(id_vars=['Date','Class'], value_vars=['Numbers'])
作者图片
正如我们所看到的,当 value_vars 参数中提到特定的列名时,只有该列的信息会根据需要进行融合。还有两个额外的参数 value_name 和 var_name,它们将通过参数中提到的字符串来重命名列 value 和 variable。让我们看一个例子来更好地理解这一点。
df.melt(id_vars=['Date','Class'], value_vars=['Numbers'], value_name="Numbers_Value", var_name="Num_Var")
作者图片
正如我们所看到的,列被重命名为参数中指定的列。
堆叠和取消堆叠
Stack 和 Unstack 分别执行列到行和行到列的操作。这两个功能肯定是熊猫整形中较少使用的功能之一,因为人们会使用 pivot 来实现他们大多数时间想要的结果,因此不需要它。我们仍将研究它们,以了解它们是如何工作的,因为它们在一些特定的场景中可能是有用的。
stack 和 melt 之间的主要区别是 stack 需要将 id_vars 设置为 index,而不是必须单独将它们作为参数传递。让我们看一下 stack 来理解它做什么。
df.set_index(["Date","Class"]).stack()
作者图片
正如我们所观察到的,它具有与 melt 相同的功能,将列转换为行。
另一方面,拆分与堆叠正好相反。它将行带到列,像堆栈一样,它需要索引才能按预期运行。
df.set_index(["Date","Class"]).stack().unstack()
作者图片
正如我们所看到的,如果没有输入,unstack 基本上会撤消堆叠操作。当更改拆分括号内的数字输入时,输出会有所不同。如果你对这个话题感兴趣,这将是一个很好的话题。
类型 2:通过聚合进行改革
与类型 1 函数不同,类型 2 函数提供了信息的汇总视图。如果用户想要对数据进行某种类型的汇总,这将非常有用。我们将使用用于类型 1 函数的相同数据框架来研究类型 2 函数。
为了解释没有聚集的重整,我们将首先声明一个数据框架。声明和数据框架如下:
使用这个数据框架,我们可以看到一些对改造/整形有用的功能。
分组依据
Group by 是我使用最频繁的函数,超过了本文中提到的任何其他函数。这是因为,它使用起来非常直观,并且具有非常有用的参数,可以帮助用户查看不同列的不同聚合。让我们通过语句来研究一个简单的组。
df.groupby('Date')["Numbers"].mean()
作者图片
在 group by 语句中,我们在第一个括号内指定需要对数据进行分组的一列或多列。这里,我们既可以给出一个单独的字符串,也可以给出与列名相关的字符串列表。下一个括号是指定要聚合的数据,最后我们调用聚合应该使用的方法。在上面的例子中,我们使用平均聚合来聚合日期的列数。
请注意,输出不是数据帧,而是看起来类似于熊猫系列。要将其转换为 dataframe,我们可以使用 reset_index 方法,或者也可以使用 group by 语句中可用的参数。我将使用后者。
df.groupby('Date', as_index=False)["Numbers"].mean()
作者图片
如上图所示,as_index 参数可用于将 group by 的结果转换为 dataframe。
让我们再看一个例子,在这个例子中,我们使用一种方法对多个列进行聚合。
df.groupby(['Date','Class'], as_index=False)["Numbers"].mean()
作者图片
正如我们在上面看到的,我们可以使用一个字符串列表(列名)在多个列上聚合多个列,而不是指定一个字符串(列名)。但是,我们也可以对不同的列使用不同的聚合函数。让我们看一下下面的例子,以了解如何做到这一点。
df.groupby(['Date'], as_index=False).aggregate({"Numbers":"sum", "Numbers2":"mean"})
作者图片
在上图中,我们用 sum 函数聚合日期列上的数字列,同样,我们用 mean 函数聚合日期列上的数字 2 列。
数据透视表
数据透视表的功能与透视表相同。然而,pivot table 有一个额外的重要参数,它指定了我们将用来聚合数据的聚合函数。让我们看下面的例子来更好地理解它。
让我们从一个简单的数据透视表开始。
df.pivot_table(index="Date", columns="Class")
作者图片
注意,pivot table 的方法调用是 pivot_table,它不同于 pivot 的 pivot。如果未指定聚合函数,将使用默认函数 mean 来聚合信息。
df.pivot_table(index="Date", columns="Class", aggfunc="sum")
作者图片
但是,如果用户想要指定一个特定的函数,他们可以在参数 aggfunc 中这样做,如上图所示。
交叉表
本文中的最后一个函数是交叉表。默认情况下,该函数会给出两个不同列的值之间出现的次数或频率。让我们看一个例子。
pd.crosstab(df.Date, df.Class)
作者图片
上面的视图意味着在 1A 班级和 2019-02-02 日期的组合中有两个不同的条目可用。类似地,其他信息也可以被解释。
在代替出现频率的情况下,如果用户希望有一些其他的聚合函数,可以使用 aggfunc 参数。
pd.crosstab(df.Date, df.Class, values=df.Numbers, aggfunc='sum')
作者图片
pd.crosstab(df.Date, df.Class, values=df.Numbers, aggfunc='mean')
作者图片
上面的图片给人一种如何使用它的感觉。即使输出看起来与数据透视表相似,但实现的方式是不同的。但是人们更喜欢使用数据透视表而不是交叉表函数。
结论
我们已经在本文中看到了多个函数,并理解了各种参数及其用法。
总之,每个人都知道实践使人完美。这句话也适用于技术领域,对吗?为了让你更容易实践我们在本文中讨论的多个概念,我创建了一个 Jupiter 笔记本,你可以在这里下载。练习的好时光!!!
如果有任何疑问、建设性的批评和任何反馈,请随时联系我这里的。
重塑熊猫数据框架
熔化、堆叠和旋转功能
Pandas 是一个非常强大的 Python 数据分析库,可以加速项目的预处理步骤。Pandas 的核心数据结构是 DataFrame ,它以表格的形式表示数据,带有标记的行和列。在这篇文章中,我将尝试解释如何通过修改行列结构来重塑数据帧。
由保罗·斯科鲁普斯卡斯在 Unsplash 上拍摄
有多种方法可以重塑数据帧。我们可以选择最适合手头任务的一个。重塑数据帧的函数:
- 融化
- 堆叠和拆分
- 枢轴
一如既往,我们从进口熊猫开始:
import pandas as pd
import numpy as np
融化
Melt 用于将宽数据帧转换为窄数据帧。我所说的宽是指具有大量列的数据帧。一些数据帧的结构是连续的测量值或变量用列来表示。在某些情况下,将这些列表示为行可能更适合我们的任务。
考虑以下数据帧:
df1 = pd.DataFrame({'city':['A','B','C'],
'day1':[22,25,28],
'day2':[10,14,13],
'day3':[25,22,26],
'day4':[18,15,17],
'day5':[12,14,18]})
我们有三个不同的城市,在不同的日子进行测量。我们决定用一列中的行来表示这些日子。还会有一列显示测量结果。我们可以通过使用熔化功能轻松实现这一点:
df1.melt(id_vars=['city'])
默认情况下,变量和值列的名称是给定的。我们可以使用 melt 函数的参数 var_name 和 value_name 来指定新的列名。如果我们按城市列对数据进行排序,效果会更好:
df1.melt(id_vars=['city'], var_name = 'date', value_name = 'temperature').sort_values(by='city').reset_index(drop=True)
堆叠和拆分
堆栈函数增加了数据帧的索引级别。我所说的提高水平是指:
- 如果 dataframe 有一个简单的列索引,stack 返回一个系列,其索引由原始 dataframe 的行列对组成。
- 如果数据帧有多级索引,stack 增加索引级别。
用例子解释更好。考虑以下数据帧:
df1 有 3 行 6 列,具有简单的整数列索引。如果将 stack 函数应用于 df1,它将返回 3 x 6 = 18 行的序列。序列的索引将是[(0,‘城市’),(0,‘第 1 天’),…,(2,‘第 5 天’)]。
让我们也检查一下形状和指数:
df1.shape
(3,6)df1.stack().shape
(18,)df1.stack().index[0] #multilevel index
(0, 'city')
栈和非栈功能更常用于具有多级索引的数据帧。让我们创建一个具有多级索引的数据框架:
tuples = [('A',1),('A',2),('A',3),('B',1),('A',2)]index = pd.MultiIndex.from_tuples(tuples, names=['first','second'])df2 = pd.DataFrame(np.random.randint(10, size=(5,2)),
index=index, columns=['column_x', 'column_y'])
如果我们对该数据帧应用堆栈功能,索引级别将会增加:
df_stacked = df2.stack().to_frame()
df_stacked
现在,列名(column_x 和 column_y)是多级索引的一部分。因此得到的数据帧有一列和一个 3 级多索引。
len(df_stacked.index.levels)
3len(df2.index.levels)
2
拆垛与垛正好相反。如果我们对堆叠的数据帧应用拆分,我们将得到原始的数据帧:
df_stacked.unstack().index
MultiIndex(levels=[['A', 'B'], [1, 2, 3]],
codes=[[0, 0, 0, 1, 1], [0, 1, 2, 0, 1]],
names=['first', 'second'])df2.index
MultiIndex(levels=[['A', 'B'], [1, 2, 3]],
codes=[[0, 0, 0, 1, 1], [0, 1, 2, 0, 1]],
names=['first', 'second'])
支点
Pivot 函数也可以被认为是从不同的角度看待数据帧的一种方式。它通过允许以不同的格式表示数据来探索变量之间的关系。
考虑以下数据帧:
我们想看看城市名对的值是如何变化的。我们可以用城市名称和列的索引来创建这个数据帧的新表示。
如果城市名对不存在,则用 NaN 填充相应的单元格。
我们不必一次看到所有的值。可使用值参数过滤数据框中的值:
我认为熊猫的成功和流行来自于其多功能、强大且易于使用的操作和分析数据的功能。和熊猫一起完成一项任务几乎总是有多种方式。由于花在数据科学项目上的大部分时间都花在数据清理和预处理步骤上,所以非常鼓励学习 Pandas。
感谢阅读。如果您有任何反馈,请告诉我。
ResNet:计算机视觉时代最流行的网络
计算机视觉工作者的必备知识
使用计算机算法对图像进行分类似乎很有挑战性。令人惊讶的是,最近在计算机视觉领域的一项研究取得了成功,在名为 ImageNet 的数据集上出现了 1.3%的前 5 名错误。2020 年,最先进的图像分类技术变成了由谷歌研究团队发布的 EfficientNet。然而,在很长一段时间内,名为 ResNet 的网络在图像分类领域表现出色。此外,许多研究人员使用 ResNet 作为他们的网络主干,以提高他们的性能。这篇文章将帮助你直观地理解什么是 ResNet 以及它是如何被激发的。
链接:https://papers with code . com/sota/image-class ification-on-imagenet
退化问题
深度神经网络在学习过程中遇到许多困难。计算机视觉研究人员提出了它们的解决方案,例如用批量标准化解决消失/爆炸梯度问题。(【https://arxiv.org/pdf/1502.03167.pdf】T4)ResNet 论文介绍了一个具有挑战性的问题,名为“退化问题”在阅读之前,我们先思考一下下面的问题。
层数越多,准确度越高?
在网络上添加图层会扩大输出的多样性,这似乎很直观。如果每个添加的图层都是身份映射,则新网络可以输出与原始网络相同的值。因此,训练有素的网络层数越多,分类精度越高,这是有说服力的。不幸的是,事实并非如此。
当您使用普通网络(在 ResNet 之前)估计精度时,随着模型复杂性的增加,其精度会迅速下降。这个问题是一个退化问题。这不是一个过度拟合的问题;然而,随着模型复杂性的增加,网络的性能下降。作者声称平面网络不适合近似身份映射;因此,添加层并不保证添加层的网络能够表达添加层之前网络的所有值。ResNet 的动机是建立一个适合身份映射的网络。
快捷连接
为了使身份映射适用于网络,作者使用了一个名为的快捷连接的方法。这种方法的主要直觉是与其学习函数 F(x),不如学习函数 F(x) + x .学习一个恒等式映射更容易;由于层权重都调整为 0,它将产生一个身份映射,而不是零映射。此外,它是可区分的,因此端到端是可训练的。
快捷连接的另一个考虑是在恒等式中增加投影。由于快捷方式连接的层之间的尺寸可以不同,因此有三个考虑因素。a)在增加的尺寸上补零,B)投影快捷方式仅用于尺寸改变的部分,C)所有快捷方式都是投影。下表是对每种情况的估计。(ResNet-34 后面的 A、B 和 C 表示在 ResNet-34 中应用的 A)、B)和 C)
关注第二行框
结果显示在身份上进行投射并不会严重影响绩效。改变参数的数量使得与普通网络的比较更加困难。因此,作者简单地在网络中使用了身份映射。
整体主干
要参考网络的详细结构,请参考论文。
链接:【https://arxiv.org/pdf/1512.03385.pdf
实验
他们比较了两个网络:普通网络和 ResNet。两个网络使用相同的层;然而,只有 ResNet 具有快捷连接。他们在两个数据集上进行了实验:ImageNet 和 CIFAR-10。下面的图表是实验的结果。
(细曲线表示训练错误,粗曲线表示验证错误)
ImageNet 上平面网络的性能
从图中可以看出,训练误差随着层数的增加而增加。这意味着普通网络正遭受退化问题。ResNet 怎么样?
ResNet 在 ImageNet 上的性能
不再有退化问题 。随着层数的增加,它们的训练误差减小。
ImageNet 上的实验结果
作者在 ResNet 中添加了更多层,以制作更复杂的模型。正如所料,增加层数可以提高性能。当在 CIFAR-10 上进行实验时,这种趋势是相似的。
CIFAR-10 的实验结果
但是,我们可以观察到,在网络上使用 1202 层,性能会显著下降。论文认为这是由于过度拟合造成的。即使性能有显著下降,它仍然优于原始方法。
结论
ResNet 的动机是解决退化问题。通过直观的方法,他们设计了适合身份映射近似的网络。实验表明, **ResNet 很好地解决了退化问题,**然而,它对于极深的网络工作不佳。
我很感激对我的文章的任何反馈,对于任何讨论,欢迎你给我发电子邮件。如果有什么不对或者误解的地方,请告诉我。😃
联系我:jeongyw12382@postech.ac.kr
进一步阅读
D2 匹配解释:
用冯·米塞斯的随机性公理解决圣彼得堡悖论
在这篇文章中,我们将提出一个全新的观点来解决博弈论中一个最重要的悖论。所用的方法源于对非遍历系统的研究。这种情况可能会造成结果之间的依赖性,而这种依赖性通常极难检测和量化,例如在金融领域。因此,从可能相关的数据中获得的预期增益具有难以确定的统计值,因此不能用于决策目的。因此,在这种情况下,必须找到在决策过程中使用的替代参数。解决方案开发通过利用关于系统的有用信息,将焦点从结果转移到以认知方式操作的策略能力。为了从数学的角度确定一个策略是否是认知的,我们使用冯米塞斯的随机性公理。基于这个公理,有用信息的知识因此产生不能随机复制的结果。在这种情况下,有用的信息可以被看作是接收者当前或未来决策过程的重要数据。总之,这个悖论中的无限行为可以被看作是一个能够使预期收益不能用于决策目的的因素。结果,我们被迫用不同的观点来面对这个问题。为了做到这一点,我们通过利用关于系统的有用信息,将焦点从结果转移到策略以认知方式操作的能力。最后,通过从这个新的角度来解决这个悖论,我们将证明一个趋向于无穷大的预期收益并不总是认知和非随机策略的结果。因此,这个结果引导我们定义了决策中的价值等级,其中认知方面,其统计结果是与随机行为的背离,被证明比预期收益更重要。
介绍
圣彼得堡悖论是博弈论中最重要的悖论之一。用于求解的经典解决方案使用实现边际效用概念的特殊效用函数[1]、[2]、[3]。这种方法受到了强烈的批评,因为效用函数试图从数学的角度将社会学行为形式化,这就是为什么效用函数总是带有主观性的原因。此外,许多行为经济学研究[4],[5]强调了人们的行为通常是非理性的。因此,解决这一矛盾仍然是一个公开的挑战,正如我们将看到的,寻找替代解决方案可能有助于我们改善战略评估期间的决策过程。
为了理解本文提出的解决圣彼得堡悖论的方法,我们必须首先解释这个方法的起源。开发这种方法是为了研究在非遍历系统上运行的策略。特别是,主要应用领域的特点是研究金融市场上的定量交易算法。非遍历条件可以使结果相互依赖。因此,在这种情况下,数据之间会产生依赖性,就像在金融领域一样,难以检测和量化。
为了向你解释这种情况在决策层面上可能产生的后果,我提出下面的例子:想想对一枚硬币的一百次投掷下一百次赌注,赢了一百次。在这种情况下,你将获得一百个彼此独立的胜利,这些胜利将与一个非常高的预期收益相关联。因此,你会得出正确的结论,即用来预测抛硬币的策略很可能是正确的。现在让我们改变开始的场景,假设我们在一次掷硬币中下 100 次相等的赌注,获得 100 次胜利。显然,由于赌注完全相互依赖,在这种情况下,它们不能用于计算预期收益。事实上,这基本上就像我们做了一个单一的赌注。现在让我们想象一下,作为第三个也是最后一个场景,你看不到抛硬币的人:如果我们赢了所有的 100 次,我们不知道他们是相互依赖还是相互独立。第三种情况产生了一个非常重要的决策问题,因为如果我认为结果是独立的,而它们不是,我就有高估策略的风险。这种错误的评估会导致我做出使用无用策略的非理性选择。在金融学中,结果的非独立性产生了一种叫做聚类的统计现象。这种统计特征决定了高收益组与低收益组的交替形成。换句话说,这意味着回报不是均匀分布的,而是趋向于聚集在一起。聚集现象在金融领域有着灾难性的影响,因为当你经历成功阶段时,你会被引导去考虑那些彼此独立的操作。这意味着从我们错误地认为是独立的数据中计算出来的预期收益被高估了,因此对策略的评估也将是不正确的。因此,这种行为会让我们面临意想不到的风险。关于这个话题,我们提出了一个悖论,我们称之为“职业交易者悖论”。这个名字来源于这样一个事实,即我们倾向于认为我们的操作总是独立的,因此当我们面对一系列赢的赌注时,我们倾向于高估所使用的策略。
总之,从可能不独立的数据中获得的预期增益不能用于决策目的,因为它具有难以确定的统计值。因此,从这个例子中我们了解到,在某些情况下,比如在非遍历系统中,预期增益不再是可靠的参数。因此,我们可以认为,其他情况可能存在,如在这种悖论的无限行为的情况下,预期收益是一个不能用于决策的数据。
我们开始理解,解决圣彼得堡悖论的问题可能源于考虑预期收益及其变体(效用函数),作为评估战略的唯一可能的观点。所以,我们要问自己的问题是:有没有一个参数比预期增益更好?
我们对这个问题的回答是,从统计学的角度来看,如果一个策略通过利用系统中有用的信息以一种认知的方式运作,我们就能够理解。在这种情况下,有用的信息可以被看作是经过分析的数据,使其对接收者现在或将来的决策过程具有重要意义。为了从数学上确定一个策略是否是认知的,在刚才描述的意义上,我们利用了冯米塞斯的随机性公理。公理定义了必须有一个序列才能被认为是随机的统计特征。公理如下:“将一个序列定义为随机序列的基本要求在于,完全没有任何规则可以成功地应用于改进对下一个数的预测”。
这个公理的含义如下:当我们理解一个数字序列服从的一组规则时,我们可以获得结果,作为对序列的下一个数字的预测,随着预测次数的增加,随机再现的概率趋于零。
因此,用一种游戏策略获得的结果,实现了对提高我们获胜概率有用的信息,产生了不能随机再现的结果。基本上,与使用有用信息的认知策略相比,使用随机策略获得更好结果的概率随着预测次数的增加而趋于零。
这个公理实际上是一种统计方法,用于评估所获得的结果,而不考虑预期增益的绝对值。事实上,这种方法仅仅基于这样一个事实,即能够区分结果是通过随机策略获得的,还是通过执行系统服从的一组规则的认知策略获得的。
通过这种方式,我们在分析一类特殊的零和博弈的策略时获得了一个基本结果,在这类博弈中,参与者之间存在一种平衡。平衡意味着没有一个玩家相对于其他玩家有明显的优势。著名数学家丹尼尔·伯努利将这类特殊的游戏定义为:“数学上公平的机会游戏”。
这类博弈在博弈论中起着特别重要的作用,因为它代表了金融等各种利益领域中非常频繁的情况。
如果我们分析通过大量重复圣彼得堡悖论中描述的机会游戏所获得的结果,在下一段中,我们将证明通过使用随机策略,可以以接近 50%的概率获得更好的利润。在实践中,一个纯随机博弈策略的结果往往相对于从悖论中描述的策略中得出的预期理论收益对称分布。这一结果表明,每次输钱后的双倍下注策略没有利用任何有用的信息,因此它是一种完全非认知的游戏方法。因此,通过将认知方面作为一个用于决策的参数,并证明了在策略中的完全缺失,我们能够通过证明博弈方法的不合理性来解决悖论。
在本文中,我们想介绍认知方面,即通过利用关于系统的有用信息以非随机方式行动的意义,作为改进决策理论的基本要素。事实上,这个悖论有助于让我们理解,关于系统的有用信息的知识,能够增加我们的胜利概率,总是涉及预期收益的增加。然而,反之则不成立:一个趋于无穷大的预期收益并不意味着策略利用了关于系统的知识,因此是认知的而不是随机的。因此,就产生了一个价值层次,在这个层次上,对于决策来说,认知方面比预期收益更重要。
圣彼得堡悖论的解决
在这一段中,我们将通过证明每次输掉赌注后的双倍下注策略是一种非认知策略来解决圣彼得堡悖论,这种策略没有实施任何可用于提高成功概率的有用信息。
为了做到这一点,我们必须定义随机策略,我们将使用它来计算获得比悖论中定义的赌博方法更好结果的概率。事实上,如前一段所述,如果被评估的策略是实现有用信息的认知策略,这种概率应该趋于零。首先,我们定义一些参数,这些参数是表征我们的随机参考策略的基础。
我们需要的第一个参数是每次赌输后使用双倍下注策略得到的博弈的期望值 EV。假设掷骰次数等于 L,赢的概率为 50%,第一次下注的价值等于 1,我们有:
第二个参数是平均赌注 AB。通过进行价值为 Bn 的 L 次下注,我们得到:
已知第一次下注 B1 等于 1,并且在每次下注失败后加倍下注,并且当我们赢得下注时返回到值 1,我们有:
此时,随机游戏策略将被定义如下:给定等于 L 的翻转次数,将进行 AB 常数值的 L 次下注,随机选择每次下注是正面还是反面。要计算这种类型的策略与悖论的策略的期望值 EV 相比是否能获得更好的结果,只需使用二项式分布公式。
P =获胜的概率
K =获胜次数
L =投掷次数
通过使用二项式分布公式,给定 L 值,我们可以获得使用上述随机策略获得更好结果的概率。范围从 10 到 200 的 L 值的结果如图 1 所示。看这个图,我们看到概率是如何渐近地趋向于 50%的。因此,我们有 50%的机会得到更好或更坏的结果。基本上,悖论中描述的策略逐渐趋向于随机策略。因此,双倍下注策略结果证明是一种不执行有用信息来提高我们获胜可能性的策略。因此,使用认知方面作为评估方法已经证明了该策略的不合理性。
我们使用非常相似的方法,将被评估的策略与金融领域中的等效随机策略进行比较,以分析交易策略产生的结果[7],[8]。
图 1:给定范围从 10 到 200 的 L 次投掷次数,用随机策略获得更好结果的概率。
结论
在本文中,我们使用圣彼得堡悖论来引入一个与战略的认知方面相关的参数,作为一个基本元素来帮助我们在预期收益被证明是一个不可靠参数的所有情况下做出决策。这种方法是通过研究非遍历系统开发的。在这种情况下,结果可能是非独立的,因此预期增益变成了具有难以确定的统计值的参数。因此,它不能用于决策,需要找到一个新的参数。选择的参数与策略以认知方式运行的能力相关(认知术语表示策略通过利用关于系统的有用信息以非随机方式运行的能力,能够使我们增加胜利的概率)。
为了从数学上确定一个策略是否是认知的,我们使用了冯·米塞斯的随机性公理。基于这个公理,实现关于系统的有用信息的策略产生不能随机再现的结果。因此,我们从总下注价值的角度比较了悖论策略和完全随机但等价的策略。从这个比较中,我们证明了随机策略得到更好的结果,随着投掷次数的增加,概率趋向于 50%。基本上,这个策略倾向于收敛到一个随机策略,而不是像我们从认知策略中预期的那样发散。事实上,如果一个策略在系统上实现了有用的信息,随机地
获得更好的结果趋向于零。这一结果表明,每次输掉赌注后的双倍下注策略不是利用关于系统的有用信息的认知策略,因此,通过将认知方面作为评估参数,我们已经解决了悖论。
总之,圣彼得堡悖论告诉我们,趋于无穷大的预期收益并不总是意味着认知和非随机策略的存在。因此,知识,意味着利用有用的信息,能够使我们增加胜利的概率,总是意味着预期收益的增加,但反之则不然;在缺乏系统知识的情况下,也可以获得趋于无穷大的期望增益。因此,从决策方面来看,我们可以创建一个价值等级,其中知识比预期收益更重要。事实上,在非遍历系统的情况下,胜利的期望可能难以估计,或者如果所开发的策略具有高度的过度拟合,则胜利的期望可能是无用的数据。在所有这些情况下,随机获得相同结果的概率的计算成为更可靠的参数,因为该数据仅受我们对系统的真实了解的影响,而不受噪声的影响。事实上,一个统计数据并不代表一个有用的信息,只有当它有可能证明它不是以随机的方式获得时,它才成为一个有用的信息。实际上,随机获得相同结果的概率必须非常低,才能认为该结果是有用的。
参考
[1]保罗·萨缪尔森,(1977 年 3 月)。《圣彼得堡悖论:被切割、剖析和历史描述》。经济文献杂志。美国经济协会。15 (1): 24–55.JSTOR 2722712。
[2]罗伯特·J·奥曼(1977 年 4 月)。“圣彼得堡悖论:对最近一些评论的讨论”。经济理论杂志。14 (2): 443–445.doi:10.1016/0022–0531(77)90143–0。
[3]罗伯特·马丁(2004 年)。“圣彼得堡悖论”。在爱德华·n·扎尔塔。斯坦福哲学百科全书(2004 年秋季版。).加州斯坦福:斯坦福大学。ISSN 1095–5054。检索于 2006 年 5 月 30 日。
[4]丹尼尔·卡内曼和阿莫斯·特沃斯基(1979)“前景理论:风险下的决策分析”,计量经济学,47(2),263–291。
[5] Hersh Shefrin,(2002)“超越贪婪和恐惧:理解行为金融学和投资心理学”。牛津大学出版社。
[6]安德烈·贝尔东迪尼,《职业交易者的悖论》,(2018 年 11 月 20 日)。在 https://ssrn.com/abstract=3287968.的 SSRN 有售:
[7] Andrea Berdondini,“冯·米塞斯的随机性公理在关于由数字序列描述的非平稳系统的动力学的预测上的应用”(2019 年 1 月 21 日)。可在 https://ssrn.com/abstract=3319864或 http://dx.doi.org/10.2139/ssrn.3319864.的SSRN 买到
[8] Andrea Berdondini,“来自经济物理学的方法论描述作为财务战略的验证技术”,(2017 年 5 月 1 日)。在 https://ssrn.com/abstract=3184781. SSRN 有售:
我希望在开始从事数据科学时就知道的资源
蒂姆·莫斯霍尔德在 Unsplash 上的照片
面向严肃数据科学家的强大学习指南
数据科学可能会让人不知所措。有很多人会告诉你,为了成为一名数据科学家,你必须学习繁重的数学和计算机科学——统计学、微积分、线性代数、分布式计算、聚类等等。
很容易感觉自己像一只被车灯困住的羚羊——不知道从哪里开始。
我理解你的感受——不久前我也处于你的处境。
这篇文章是献给我作为数据科学初学者所希望拥有的资源的。我希望在这篇文章中分享我的经验将使你走上追求数据科学职业的正确道路,并使你的学习之旅更加愉快。
如果你想开始深度学习,这里有一个 1.5 小时的免费速成课程:
数据科学适合你吗?
照片由 Isaac Smith 在 Unsplash 上拍摄
在你前进之前,你需要分析数据科学是否适合你。数据科学很性感——薪水很高,随之而来的是巨大的声望。
问问你自己:这是你转向数据科学的原因吗?
如果是,马上转回来!数据科学不适合你。
数据科学的问题是,即使你对它充满热情,你也不能强迫自己热爱这个过程。如果你不喜欢数据科学带来的感觉,那么从长远来看,你很难保持动力。
我给你的建议是:做你的研究
在你下定决心之前,研究,研究,研究!
观看视频,阅读关于数据科学家日常生活的文章。
数据科学家的一天 —霍马理工大学
数据科学:现实与期望 —马特·特兰
开始的时候,做一点调查,会对你做出正确的选择大有帮助。
PS:这是玛丽维尔大学的一份方便的数据科学职业指南,你可以用它来衡量你的兴趣!
强大的学习途径
如果你正在读这篇文章,你可能已经决定继续从事数据科学。恭喜你!
学习数据科学是巨大的。吃大象的唯一方法是一次咬一口。
这与任何其他具有挑战性的任务没有太大的不同。取决于你从哪里开始,你可能需要吃更多的东西,但是这并没有什么魔力;没有捷径。只是一次吃一口。
下面的学习路径包括两个主要部分——数学和技能。从数学开始是个好主意,这样你就可以判断数据科学是否适合你。对于一些人来说,数学可能令人望而生畏,因为数据科学主要使用许多数学概念。一开始就认识到这一点,可以避免你以后后悔。
总而言之,
从数学开始
第一部分:数学
3 数据科学中最重要的主题是线性代数、微积分和统计学。但是对于大多数任务,您可以只使用统计数据。即便如此,我还是在这三个概念下链接了有用的资源,如果你想了解更多的话。
线性代数
线性代数在数据科学中(几乎)无处不在。在大多数计算中,你的计算机会用到大量的线性代数。在神经网络中,网络的表示和处理使用线性代数。很难想象有哪个模型不是用这个数学分支实现的。
但是这看起来很重要,在大多数情况下,你不会在你的数据集中应用矩阵变换的手写代码。你真正需要的是对其核心原则的良好直觉。
如果您看到此消息,这意味着我们在网站上加载外部资源时遇到了问题。如果你是…
www.khanacademy.org](https://www.khanacademy.org/math/linear-algebra)
如果你想学习线性代数的理论并在代码中应用这些理论,请使用下面的资源:
线性代数也许是计算科学中最重要的数学分支,包括机器…
www.udemy.com](https://www.udemy.com/course/linear-algebra-theory-and-implementation/)
结石
像线性代数一样,微积分也在数据科学中发挥着重要作用,特别是在机器学习中使用的算法。同样,和前者一样,你不需要成为微积分大师才能掌握数据科学。你需要的是理解它的核心原则,以及这些原则如何影响你的模型。
从国家研究型大学高等经济学院学习机器学习线性代数的第一步…
www.coursera.org](https://www.coursera.org/learn/first-steps-in-linear-algebra-for-machine-learning)
统计与概率
统计和概率是一个**你真的不得不学习的话题。**这将占用你大量的时间,但好消息是这些概念并没有那么难,所以你没有理由不掌握这个主题。
如果您看到此消息,这意味着我们在网站上加载外部资源时遇到了问题。如果你是…
www.khanacademy.org](https://www.khanacademy.org/math/statistics-probability)
数学中的其他主题
作为一名初学数据的科学家,你可能不会在日常生活中用到这些话题,但如果你想提高自己的水平,它们会特别有用。
- 图论
“图论是对关系的研究。给定一组节点——可以用来抽象从城市到计算机数据的任何东西——图论以非常深入的方式研究它们之间的关系,并为许多安排、联网、优化、匹配和操作问题提供答案。它的力量在于能够用来抽象出如此大量的实际问题。”— 弗兰克·汉纳里
如果您希望为物流公司建立优化路线的模型,或者建立欺诈检测系统,基于图的方法有时会优于其他解决方案。
我们邀请你进入图论的迷人旅程-一个连接绘画的优雅和…
www.coursera.org](https://www.coursera.org/learn/graphs)
2。离散数学
离散数学是数学的一个分支,它研究的对象只能具有不同的、分离的值。离散对象通常可以用整数来描述,而连续对象则需要实数。
一旦你开始在机器上使用数学,你就进入了离散数学的世界,在这个世界里,每个数字只能用有限的“比特”来表示。
[## 什么是离散数学?
连续数学与离散数学数学世界可以大致分为两个领域:连续数学和离散数学
cse.buffalo.edu](https://cse.buffalo.edu/~rapaport/191/S09/whatisdiscmath.html) [## 计算机科学离散数学导论| Coursera
为你的 IT 职业打下基础。掌握驱动我们生活的数学,为你的软件工程师或…
www.coursera.org](https://www.coursera.org/specializations/discrete-mathematics)
如果你害怕数学,无视数学方程,你就不会有作为数据科学家的乐趣。然而,如果你愿意花时间来提高你对概率和统计的熟悉程度,并学习微积分和线性代数的基本原理,数学不应该成为你成为专业数据科学家的障碍。
PS:数学真的很有趣。随着你对数学的深入研究,你也将分享数据科学家对数学无拘无束的热情。
第 2 部分:技术技能
现在到下一个/稍微更有趣的部分。每天产生 2.5 艾字节的数据(1 艾字节= 10 ⁸字节),如果不使用计算机来分析这些数据的一小部分(称为“大数据”),那将是荒谬的。
“数据科学需要多少编程,尤其是统计分析和机器学习?”
很多。实际上,大多数数据科学工作都需要您编写代码,原因如上所述,还因为大多数公司都需要一些数据清理、实施和产品化,以及使算法适应他们自己的特定目的。如果你不能将自己的解决方案应用到产品中,那么你就不是一个有用的员工。(来源)
计算机编程语言
Python 是迄今为止世界上在数据科学中使用最广泛的编程语言。在 JetBrains 2016 年的调查中,几乎五分之四的开发人员表示 Python 是他们的主要语言。
我建议你专注于 Python,同时也花一点时间在 R 上。
** [## 学习 Python——Python 的搭便车指南
Learnpython.org 是介绍 Python 的一种简单而不吓人的方式。该网站采用了相同的方法…
docs.python-guide.org](https://docs.python-guide.org/intro/learning/) [## 面向所有人的编程(Python 入门)| Coursera
从密歇根大学学习面向所有人的编程(Python 入门)。本课程旨在教授…
www.coursera.org](https://www.coursera.org/learn/python) [## 学习 Python 3 | Codecademy
学习世界上最流行的编程语言的最新和最棒的版本!
www.codecademy.com](https://www.codecademy.com/learn/learn-python-3)
稀有
Python 将满足您的大多数数据科学项目,但是要真正被称为全面的数据科学家,您的工具包中需要有 R。在 R 和 Python 中不一定要成为宗师。选择一个,学习另一个的基本原理。
权威指南 R 是一种编程语言和环境,通常用于统计计算、数据分析…
www.datamentor.io](https://www.datamentor.io/r-programming/)
使用 Python 进行数据分析(Numpy、Pandas 和 Matplotlib)
如果你专门为了数据科学而学习 Python,你需要知道如何分析数据,特别是如何加载、操作和可视化数据。
[## Python Numpy 教程(有 Jupyter 和 Colab)
本教程最初由贾斯廷·约翰逊提供。我们将使用 Python 编程语言进行所有…
cs231n.github.io](https://cs231n.github.io/python-numpy-tutorial/)
用 Python 进行机器学习
机器学习算法是数据科学的核心。投入一些时间来掌握它们的理论和应用。
[## amueller/introduction _ to _ ml _ with _ python
这个库包含了 Andreas 即将出版的书《Python 机器学习入门》的代码…
github.com](https://github.com/amueller/introduction_to_ml_with_python) [## 机器学习速成班|谷歌开发者
学习和应用基本的机器学习概念的速成课程,获得现实世界的经验与…
developers.google.com](https://developers.google.com/machine-learning/crash-course)
结构化查询语言
SQL,或者结构化查询语言,对于数据科学家来说是极其重要的。数据建模的一个基本过程是首先提取数据。这通常会涉及到对数据库运行 SQL 查询。
面向专业开发人员的一站式 SQL 备忘单
medium.com](https://medium.com/swlh/want-to-learn-sql-heres-everything-you-need-baffadc89291) [## SQL 备忘单(2020)| websitesetup.org
在本指南中,您将找到一个有用的备忘单,它记录了一些更常用的 SQL 元素,甚至…
websitesetup.org](https://websitesetup.org/sql-cheat-sheet/)
生产系统
如果你在工作,你将利用公司的计算资源来提取、转换和分析数据。使用单台机器来执行这些任务是不够的。
值得花时间专门了解这些工具,因为它们在当今的行业中被广泛使用。
SQL 是当今使用的工具之一。像亚马逊网络服务(AWS) 、谷歌云和微软 Azure 这样的云计算平台被大量企业广泛使用。
另一个有用的技能是 版本控制 。
获得实践经验
遵循我上面提到的资源只会给你带来一半的好处。为了应用你刚刚学到的知识,你需要通过练习来应用这些知识!
要真正掌握这些概念,您需要在一些项目中使用这些技巧,这些项目非常类似于现实世界中的应用程序。你将会遇到问题——这是不可避免的——去处理诸如错误的数据,并在数据科学方面发展真正深厚的专业知识。
这里有几个好地方,你可以从那里获得这种实践经验(免费):
卡格尔
机器学习竞赛服务于许多目的。它们是解决问题和集思广益的渠道。 Kaggle 是最知名的数据科学平台之一。这是应用你新学到的技能的好方法。
这里列出了 10 个数据科学竞赛,供您磨练技能:
这里有一个网站列表,供您练习数据科学技能,参加在线黑客马拉松和…
towardsdatascience.com](/10-data-science-competitions-for-you-to-hone-your-skills-for-2020-32d87ee19cc9)
UCI 机器学习知识库
UCI 机器学习库是一个公共可用数据集的大型来源,你可以用它来组合你自己的数据项目。
值得注意的是,在 Github 上公开存储你的项目是一个好主意,因为这可以创建一个展示你的技能的作品集,用于未来的工作申请。
UCI ML 知识库
为开源做贡献
一个可以考虑的好选择是为开源项目做贡献。有许多 Python 项目依靠开发者社区来维护。Github 是一个很好的起点。
Numfocus 是这类项目的一个很好的例子。
结束语
在的这篇文章中,我描述了一条学习路径,它将引导你踏上数据科学之旅。
黄金法则,
比一般的数学家更擅长编程。
比一般程序员更擅长数学
数据科学是多个领域的混合体。你不应该只在一件事上努力做到最好,而是在每件事上都做得足够好。
牢记大局。
我想指出的是,如果你不愿意投入时间,这些资源不会为你工作。数据科学是一场马拉松,而不是短跑。前面还有很长的路要走。如果你遵循这条道路,你进入数据科学的道路将会更加顺畅,而不是更加容易,你将会在数据科学的道路上继续你的职业生涯。
快乐学习!
直到下一次…**
立即开始机器学习和人工智能之旅的资源
立即开始您的数据科学之旅
数据是新的石油,今天我们有大量的数据。我们需要一些更好的资源来学习人工智能和机器学习技术,以及更好的计算机器来训练和评估我们的模型,以便更好地利用数据和使用该模型。对于一个技术相关的人来说,了解数据科学是很有必要的,因为在未来,大多数工作都是关于数据科学技能的。
本文将分享一些学习数据科学的更好资源,以及我们如何开始为成为数据科学家做准备。从数据科学开始,首先,我们必须选择一种编程语言来帮助我们建立数据科学的模型。我们发现,大多数数据科学家在他们的数据科学项目中使用 python,因为有大量的社区和资源可供 python 使用。
This article contains some resources for which the author may get some part of the product's commission. [Learn more](https://www.amazon.com/gp/help/customer/display.html?ie=UTF8&nodeId=508088)
用于数据科学的 Python
在开始我们的数据科学之旅之前,我们必须熟悉 python 编程及其强大功能。有本书叫用 Python 把枯燥的东西自动化;这对初学者有好处。它使用门外汉的方法让你在更短的时间内成为 python 编程的专家。
用 Python 自动化枯燥的东西——作者 Al Sweigart
数据科学统计
统计在数据科学中扮演着重要的角色。每个机器学习算法都使用统计原理。它有助于数据科学中的决策,这在获得更好的模型准确性方面起着重要作用。有一本名为统计学习的要素的书以一种更好的方式展示了统计学。
统计学习的要素——作者特雷弗·哈斯蒂(Trevor Hastie)、罗伯特·蒂伯拉尼(Robert Tibshirani)、杰罗姆·弗里德曼(Jerome Friedman)
数据科学的机器学习
机器学习充满了帮助处理不同类型数据的算法。有一本书叫 Python 机器学习用 Python 搭配机器学习来演示不同的机器学习算法。
Python 机器学习——Sebastian rasch ka(作者)、Vahid Mirjalili(作者)
面向数据科学的深度学习
如今,我们更喜欢使用深度学习来处理大量的图像、视频、文本和音频数据。它使用人工神经元试图复制人类大脑的结构。 Grokking 深度学习是我能建议的最好的一本书,可以更好地理解深度神经网络。
探索深度学习——作者安德鲁·特拉斯克(Andrew Trask)
GPU 和数据科学机器
我们一般用 TensorFlow 做深度学习项目。并且,TensorFlow 使用英伟达GPU。为了更好的深度学习体验,建议至少使用英伟达 GTX 1050 Ti GPU。一些配备英伟达显卡的好笔记本电脑有戴尔 I 7577–7425 blk-PUS Inspiron和 Razer Blade 15 游戏笔记本电脑 2019 。它们都配备了英伟达 GTX 1060 显卡。
结论
开始您的数据科学之旅永远不会太晚。如果你对探索新事物有热情,那会有所帮助。在本文中,我们讨论了作为初学者学习数据科学的一些更好的资源,我们还讨论了一些更好的显卡 enabled-machine 来构建深度学习模型。
继续享受数据科学吧!
开始数据科学之旅的资源
开启数据科学之旅的全面资源列表
图片来源: Pixabay
互联网上与数据科学相关的内容如此之多,以至于对于任何打算开始这一领域之旅的人来说,在学习内容上做出正确的选择都变得有点困难。
根据我过去 5 年在这一领域的经验,以及我的数据科学家朋友&同事的建议,我列出了我在 2016 年开始旅程时开始参考的资源。
博文议程:
- 数据科学基础
- 机器学习和深度学习的资源
- 通过参加数据科学竞赛和黑客马拉松来学习。
- 获得免费的 GPU 计算!(新增)
- 在线硕士课程的详细信息。
- 最后的想法。
数据科学基础
由 Mirko Blicke 拍摄的图像,在取消绘制
“你不可能在薄弱的基础上建造一座伟大的建筑。如果你要有一个强大的上层建筑,你必须有一个坚实的基础。
以上引用适用于任何领域。我已经列出了几门课程,并指向了下面的 YouTube 频道,这些频道将帮助任何人从事数据科学的基础方面的工作。
帕德海四分之一实验室
PadhAI 是 IIT 马德拉斯的初创公司“四分之一实验室”(One-Fourth Labs)的一项举措,该公司致力于为印度提供负担得起的高质量在线课程,为印度进入人工智能时代做好准备。数据科学基础课程在他们的网站上,内容涵盖了 Python 编程、统计学、概率和 T21 的基础知识。如果你是学生,你可以通过提供有效的身份证来获得折扣!
在线报名参加 PadhAI 的数据科学课程,加速您作为数据科学家的职业生涯。接受 IIT·马德拉斯的训练…
padhai.onefourthlabs.in](https://padhai.onefourthlabs.in/courses/data-science)
3 蓝色 1 棕色
3Blue1Brown 是格兰特·桑德森创建的 YouTube 数学频道。该频道提供了许多高级数学概念的惊人的视觉视角。下面我列出了线性代数&微积分 YouTube 播放列表的链接,这些链接在开始学习不同的机器学习算法之前非常重要。
链接到线性代数播放列表。
链接到微积分播放列表
【Coursera 的机器学习数学
机器学习专业的数学来自伦敦帝国学院,由 3 门课程组成多元微积分、线性代数和降维 : PCA,每周有测验,也有少量编码作业。Coursera 的优势在于,你可以随时旁听课程,免费获取课程内容。如果你是一名学生,你可以提供有效的理由申请经济援助,并获得课程内容,包括测验,作业和免费获得证书。
从伦敦帝国理工学院学习机器学习的数学。对于很多机器方面的高级课程…
www.coursera.org](https://www.coursera.org/specializations/mathematics-machine-learning)
机器学习和深度学习的资源
计算机科学家、Coursera 顶级讲师 Andrew NG 教授的机器学习和深度学习课程。
这两门课程都非常有名,都涉及每周的测验和编码作业。对于机器学习课程,作业在 Octave/Matlab 中(语法非常类似于 python 中的 NumPy 库),对于深度学习课程,作业在 TensorFlow 中。
机器学习是让计算机在没有明确编程的情况下行动的科学。在过去的十年里…
www.coursera.org](https://www.coursera.org/learn/machine-learning) [## deeplearning.ai 的深度学习| Coursera
从 deeplearning.ai 学习深度学习,如果你想打入人工智能(ai),这个专精…
www.coursera.org](https://www.coursera.org/specializations/deep-learning)
FastAI
机器学习和深度学习课程由杰瑞米·霍华德、Kaggle 特级大师和三藩市大学教授主讲。这些课程的好处是免费提供,杰瑞米·霍华德采用自上而下的方法解释各种 ML/DL 概念。
程序员机器学习入门!
欢迎来到程序员机器学习入门!由杰瑞米·霍华德教授(卡格尔 2 年来的头号竞争对手…
course18.fast.ai](http://course18.fast.ai/ml)
程序员实用深度学习!
欢迎光临!如果你是所有这些深度学习的新手,那么不要担心-我们将带你一步一步地完成它…
course.fast.ai](https://course.fast.ai/)
通过参加数据科学竞赛和黑客马拉松来学习
数据科学竞赛托管平台。
一旦你熟悉了基础概念+各种机器学习/深度学习概念,是时候通过参加数据科学竞赛或黑客马拉松来弄脏你的手了。
我看到许多人说,做 Kaggle 或 Analytics Vidhya 竞赛没有多大用处,因为大多数竞赛没有描述真实世界的数据/真实世界的问题。但我要说,这些平台肯定提供了接触各种问题陈述的机会,而这些问题陈述在学生生活或公司世界中可能没有机会得到。
- 摇摇晃晃:【https://www.kaggle.com】T2
- 【https://datahack.analyticsvidhya.com 分析】维德希亚:
- Crowdanalytix:https://www.crowdanalytix.com/community
- **黑客帝国:**https://www.hackerearth.com
获得免费的 GPU 计算!!
图片来源:https://www.nvidia.com/en-in
是的,你没看错!!谷歌实验室和 Kaggle 向他们所有的用户提供免费的 GPU 计算。如果你有一个庞大的数据集,并希望训练一个深度学习模型,只需将数据集上传到这两个平台中的任何一个,你就可以轻松地将你的 DL 模型的训练时间从几天减少到几个小时!!
Google Colab 上的 GPU 内存
每周在 Kaggle 上,人们可以获得 30 小时的免费 GPU 计算,它配备了 P100 GPU 和 16GB 的 GPU 内存。最近这两个平台都开始免费提供 TPU 计算!!在 Kaggle,一个人每周可以使用 30 个小时的 TPUs,一次最多可以使用 3 个小时。现在是你探索更多的时候了:)
在线硕士课程
如果有人想在日常工作之外继续攻读硕士课程,以增强他们在数据科学方面的知识,我列出了一些大学,这些大学提供相当于校园课程的 MS 学位 ,而没有在学位证书上提及“在线”交付模式,并且还提供职业服务!!
佐治亚理工学院的 OMSCS 项目:
[## 主页| OMSCS |佐治亚理工学院|佐治亚州亚特兰大
跳转到内容主页你准备好获得计算机科学硕士学位但不准备停止工作了吗?你想要…
www.omscs.gatech.edu](http://www.omscs.gatech.edu/)
单门课程(3 学分)持续时间: 4 个月(需要完成 10 门这样的课程)
单科费用: $510 +每学期 $310。
所以这个学位的总花费不会超过 8200 美元。这里可以看到详细的计算。
亚利桑那州立大学 MCS 项目:
[## 在线计算机科学硕士(MCS) | ASU 在线
在线计算机科学硕士(MCS)计划,提供了一个创新的合作伙伴关系,亚利桑那州立大学的…
asuonline.asu.edu](https://asuonline.asu.edu/online-degree-programs/graduate/computer-science-mcs/)
单门课程(3 学分)时长: 2 个月(需完成 10 门此类课程)
单次课程费用: $1500。
因此,这个学位的总费用是 15000 美元。
参考以下链接其他硕士课程的详细信息,您可以参考以下链接:
探索一流大学的在线硕士学位,其价格仅为校园课程的一小部分…
www.edx.org](https://www.edx.org/masters) [## 顶尖大学的在线硕士和学士学位
Coursera 提供数据科学、计算机科学、信息技术、工程、工商管理硕士等在线硕士学位
www.coursera.org](https://www.coursera.org/degrees)
相信我,如果求职者没有硕士学位,某些组织会直接拒绝他们的简历。我个人认为,只看他/她拥有的学位而不是他/她拥有的技能来做决定是不正确的。但无论如何,拥有一个学位将会增加你的知识,并抓住这个非常重要的主题。
最终想法
我希望这篇文章有助于提供一个全面的资源列表,以开始您的数据科学之旅。
他们中的许多人可能仍然会说"难道我们不能仅仅通过知道如何使用 sklearn、Keras、TensorFlow、PyTorch 等库来在数据科学领域生存吗?而忽略任何机器学习或深度学习算法背后的基本概念或数学??"
我对他们的回答是一个大大的不。只要您的模型按预期工作,拥有库级别或包级别的理解就可以工作,但是如果模型没有按预期工作呢?你如何修理它??
如果您有任何想法或问题,请随时在下面留下评论,不要忘记点击👏如果你喜欢博客的内容。
我以前的一些博客:
关注我 中 阅读更多此类博客。
[## Rajesh Shreedhar Bhat - Medium
阅读 Rajesh Shreedhar Bhat 在媒体上的文章。数据科学家-沃尔玛实验室| Kaggle 竞赛专家|…
medium.com](https://medium.com/@rajesh_bhat)
应对大规模紧急事件和中断:人工智能和决策优化可以有所帮助
安全、快速、无浪费地重新分配您的资源
照片由埃德温·胡珀在 Unsplash 上拍摄
什么是应急响应?
在写这篇文章的时候,我们正在深入新冠肺炎疫情。医院、超市和政府机构等都被对服务的巨大需求所淹没,同时试图管理他们有限的资源和资产,同时努力保证人们的安全。现在应该如何分配资源以便它们正好用在病人和医生最需要的地方?如何根据不断变化的需求和地理位置,在遵守安全法规和出行限制的同时,随着时间的推移重新分配呼吸机?不管这意味着什么,一旦一切开始恢复“正常”,我们该如何安全地重返工作岗位?**
由于其前所未有的性质,像新冠肺炎疫情这样的事件的自动化决策是复杂的,需要仔细的分析,准确的数据可能不容易获得,更不用说任何政治和行政方面的考虑。
这种真实而大规模的中断正在吞噬着这个世界,但这只是需要快速而准确的响应、管理有限资源并确保运营成本不会飙升的紧急情况的一个例子。 正如我们将看到的,高效的应急响应需要人工智能技术的结合,特别是机器学习和决策优化。
本文中讨论的方法可以应用于处理各种类型的大规模中断。我们将特别关注天气突发事件,如暴风雪,因为它们的影响可能是毁灭性的。根据国家环境信息中心和 NOAA Climate.gov的数据,自 1980 年以来,美国已经遭受了 258 次天气和气候灾害。这 258 个事件的累计成本超过了 1.75 万亿美元。
示例:应对大规模天气事件
埃里克·麦克莱恩在 Unsplash 上拍摄的照片
当恶劣天气事件即将发生时,无论是暴风雪、洪水还是地震,一个州或地区的运营经理都必须迅速决定如何最好地满足对资源和资产(如扫雪机、水、警察和救援车辆)的需求。
让我们具体看看如何应对暴风雪。对扫雪机的需求取决于降雪预报,一些地区可能会比其他地区受到更严重的影响,当风暴来袭时,需要更多的扫雪机。机器学习模型可以预测每个县的卡车需求,同时考虑所有相关信息,如降雪预测、安全指南和过去的暴风雪历史(图 1)。
首先,我们需要准确的需求预测
图 1:机器学习预测每个时间段每个县对扫雪机的需求
然后,我们需要决定如何将这些资产从低影响地区重新分配到高影响地区,例如,将多少资产从 C1 和 C2 县转移到 C3、C4 和 C5 县,确保每个县都有足够的扫雪机来满足需求。
然而,我们不要忘记,降雪预报每隔几个小时就会发生变化,因为暴风雪会穿过该州,所以我们需要不断移动卡车,同时考虑到天气预报和当时的积压水平(积雪)。
我们需要一种有效的方法来重新分配扫雪机和其他资产
为什么预测资源需求是关键,但不足以解决应急响应问题?
如果我们一次考虑一个县,并且没有冲突的优先事项,我们的机器学习模型生成的预测可能足以做出决定。然而,一旦我们开始引入一些现实生活中的复杂性、依赖性和有限的资产,确定最佳的重新分配计划就变得更加具有挑战性。
例如,如果该州相对两侧的两个县在风暴开始时预计会收到最多的降雪,该怎么办?在这种情况下,如果我们没有足够的雪犁来满足所有需求,我们应该把雪犁送到哪里,送多少?
预测不会告诉我们如何分配有限的资源
在风暴开始时,C1 县最需要资源,但几个小时后,该州另一边的 C2 和 C3 也需要资源,这种情况会怎样?我们会把扫雪机搬到 C1 吗,即使在它们被暴风雪袭击之前把它们运到 C2 和 C3 是不可能的?这种延迟会如何影响积雪和道路安全?
我们所做的决定是相互依赖的,因此我们必须一起做出决定
为了创建一个可行的计划,我们在风暴开始时做出的关于如何分配资产的决策需要与风暴后期的重新分配决策结合起来。此外,我们不能孤立地为一个县和其他县做出决策,因为它们都在争夺同样有限的资源。
最后,有几个决定?例如,让我们考虑 2000 台扫雪机和 60 个县。假设我们考虑在 24 小时的暴风雪中每 4 小时重新分配它们。有多少种重新分配的可能性?在 6 个时间段中的任何一个时间段,我们可以决定从 60 个县中的任何一个县向 60 个县中的任何一个县移动 0-2,000 台扫雪机。在不考虑距离、可用性、积雪积压、需求约束和多种资产类型的情况下,做一个非常粗略的估计,我们可能需要考虑的选项数量是 60 * 60 * 2000 * 6 = 43200000!没有人能够手动确定这些决策中的哪一个是最佳的。
涉及重新分配的决策很容易需要评估 43,000,000 多个选项!没有人能够人工确定这些选项中哪一个是最好的。
人工智能和决策优化有什么帮助?
决策优化使用来自机器学习的见解来做出最佳决策
决策优化使用非常专业的算法和技术来有效地搜索和评估数以百万计的潜在解决方案,而无需一一列举。
虽然机器学习可以考虑所有可用的数据和过去的历史,以预测每个县或地区在任何给定时间对扫雪机和其他资源的需求,但决策优化(DO)可以更进一步,并生成在整个规划范围内对整个州最优的计划,受限于有限的资源(例如,扫雪机)其他约束和依赖性(可用资源的类型和数量, 每个扫雪机的当前位置、行驶距离和时间)和优化指标(最小化总成本、最大化安全性/客户满意度、最小化卡车总行驶距离)。 它不仅为我们提供了有价值的见解,而且还生成了一个可操作的时间表或计划(图 2)。**
图 2:结合机器学习和决策优化的力量进行应急响应
与任何决策支持解决方案一样,仅仅创建一个模型是不够的。我们的最终目标应该是在业务用户和决策者手中交付一个解决方案。构建这样一个解决方案通常需要几个关键部分(图 3):
- 一个强大的数学优化引擎,如 CPLEX,它可以运行和求解决策优化模型,找到一个最优解决方案
- 构建人工智能模型(机器学习和决策优化)的高效建模环境
- 假设场景分析和仪表板,用于为业务用户测试模型、分析场景和原型可视化
- 一种将模型作为 web 服务部署到决策支持应用程序中的机制,以便规划者可以实时运行场景
图 3:使用 IBM 数据和 AI 平台的决策优化应用程序开发和部署
更具体地说,将上述内容应用到我们实施应急响应计划解决方案的具体示例中,该过程可以总结为以下三个步骤:
步骤 1 :建立一个机器学习模型,按地点和时间段预测对资源(扫雪机)的需求。
第二步:建立一个决策优化模型,在暴风雪来临之前和期间,根据需求和可用性,确定如何最佳地重新分配资源。该模型将业务需求转化为数学优化引擎可以使用的术语。
第三步:部署模型,并将它们嵌入到您的规划应用程序中
让我们更详细地看看这三个步骤。无论使用什么技术,方法都是相似的。在这里,作为一个例子,我们概述了如何使用 IBM 数据和人工智能平台来构建一个紧急响应解决方案。
第一步:建立一个机器学习模型来预测需求
这可以通过多种方式实现,具体取决于您使用的工具。例如,IBM 数据和人工智能平台(IBM Cloud Pak for Data 或 IBM Watson Studio Cloud 中的 IBM Watson Studio)包括 AutoAI,它可以自动选择正确的算法,构建机器学习管道,执行超参数优化(HPO)和特征选择,并根据指定的评估指标确定最佳模型(图 4)。另一种选择是使用 SPSS Modeler 的拖放界面来创建自己的机器学习管道。如果您喜欢从头开始构建您的模型,您可以使用开源包(如 scikit-learn)用 R 或 Python 实现它们。一旦模型被训练、验证和测试,它就可以被部署为在线模型,使用 REST APIs 进行访问。
图 4: AutoAI 体验:自动生成预测扫雪机需求的最佳模型
步骤 2:建立一个决策优化模型来重新分配资源
决策优化模型的关键要素是决策变量、优化指标和约束。**
需要做出的决策(建模为决策变量)决定了在每个时间段内要在每对县之间重新分配的资产(例如扫雪机)的类型和数量。这些值不是我们输入数据的一部分,而是由优化引擎自动确定的。**
优化指标定义了我们优化的目标(最小化/最大化)。在紧急响应的情况下,这些指标可以是以下指标的任意组合:
- 最小化重新分配卡车的成本(基于重新分配的总次数,以及基于行驶里程的可变成本)
- 最小化未降雪
- 最大限度提高安全性
- 最大化客户/通勤者满意度
最后,优化模型需要考虑许多约束条件,包括:
- 在给定的时间段内,在一个位置可用的任何现有的积雪和铲雪能力与对铲雪机的预测需求(ML 模型的输出)相平衡
- 任何重新分配的决定必须是可行的,也就是说,在任何给定的时间和地点,我们移动的卡车数量都不会超过可用的数量
决策优化仪表板显示我们 DO 模型的输入和输出。关键输入是雪犁的需求预测和初始分配(图 5):
图 5:决策优化仪表板场景输入:雪犁的预测需求和初始分配
这里我们看到了按时间和位置(ML 模型的输出)对扫雪机的需求,以及资产的当前分布,即按位置的数量。
然后,我们创建三种不同的假设情景:
- 方案 S1(基准方案):不执行任何重新分配(无优化,仅计算 KPI)
- 场景 S2(风暴前重新分配):重新分配一次资产,为暴风雪做准备(局部优化)
- 场景 S3(风暴期间重新分配):随着暴风雪的推进,每隔几个小时重新分配资产(完全优化)
在解决了这三个场景之后,我们在 DO 仪表板中并排比较结果(图 6):
图 6:决策优化仪表板:假设分析
我们可以清楚地看到,优化程度最高的场景,即 S3 场景,产生的积压最少(是没有优化的基准场景 S1 的 1/4,或者是部分优化的场景 S2 的 1/2)。当然,这是需要评估成本的。情景 S3 的成本最高(176,324 美元),因为重新分配的次数最多,相比之下,情景 S2 为 51,061 美元,情景 S1 为 0 美元(无重新分配)。
比较这三种情况,计划者将评估较小的积雪积压与较高的重新分配成本的优势。如果需要,总成本也可以表示为这里使用的两个优化指标的加权和,即每个场景的总积压和重新分配成本的组合。规划者可能还想在做出最终决定之前运行几个额外的场景,例如,她可以看看从附近的州借几台扫雪机是否会产生明显更好的解决方案。
步骤 3:部署模型并将它们嵌入到您的规划应用程序中
一旦模型准备好并经过测试,它们就可以作为 web 服务进行部署,并嵌入到我们的规划应用程序中。如果使用 IBM 数据和人工智能平台,在沃森机器学习中部署模型只是点击几次的事情。然后,每个模型通过 REST API 端点变得可用。最后一步是构建和部署 web 应用程序(例如 Node.js 或 R Shiny),或者在现有的应用程序中嵌入服务,并通过访问已部署的 ML 和 DO 模型来生成我们的优化重新分配计划。
这个演示是使用一个 R Shiny 应用程序实现的(图 7):
图 7:注入了 ML 和 DO 模型的示例应急响应计划应用程序
当雪地作业经理 Alex 登录到她的应急计划门户网站时,她需要掌握所有必要的信息来做出决策。她看了看纽约州,迅速评估了实时更新的降雪预报,并用地图上的颜色表示。颜色越深,对应的县预计降雪量越大。右上角的滑块可用于选择不同的时间段,以查看情况如何随时间变化。
Alex 注意到 Chautauqua 预计在风暴开始时会有最多的雪,他在地图上选择了该县以查看更详细的信息,例如确切的积雪英寸数、可用的扫雪机数量与预测的需求量以及预期的积压量。预测需求是从我们部署的 ML 模型中实时获得的。
然后,Alex 选择了一个即将到来的箭头,并观察到 20 辆卡车正在从利文斯顿县重新分配。这很有道理,因为目前那里的降雪量很小。
Alex 将时间滑块向右移动,以查看建议的卡车重新分配,这些卡车重新分配对应于因暴风雪席卷整个州而不断变化的需求。下表中也提供了相同的卡车重新分配建议。它们是使用我们部署的决策优化模型实时获得的。
如果亚历克斯对推荐的计划感到满意,她可以继续批准它。她可能还会选择运行一些假设场景,尝试潜在地增加一些可用的扫雪机,或者手动指定一些重新分配。在解决了这些额外的情况并比较了由此产生的变动和相应的 KPI 后,Alex 将对如何继续做出最终决定…
当然,这只是一个使用 IBM 数据和 AI 平台、决策优化和 R Shiny 实现的演示的简单示例。至于你能做什么以及如何在你自己的应用程序中呈现信息,这种可能性是无穷无尽的。
摘要
应对大规模紧急情况和干扰是一个关键问题,需要立即采取行动。使用有效的应急响应解决方案的好处是巨大的,包括但不限于:
- 减少规划/调度时间和工作量
- 提高安全性和合规性
- 降低运营成本
- 提高资源利用率
- 提高客户满意度
创建最佳资产重新分配计划是一个具有挑战性的问题,最好使用机器学习和决策优化的组合能力来解决。虽然机器学习可以考虑所有可用的数据和过去的历史,以预测在给定时间每个位置对资源的需求,但决策优化可以更进一步,生成对一组位置最优的计划,该计划受有限资源、其他约束和依赖性以及优化指标的限制。优化不仅能提供有价值的见解,还能生成可操作的时间表或计划。**
有效应对大规模中断需要为业务用户提供有效的决策工具。即使我们建立了伟大的人工智能模型,它们的力量也只能通过将它们放在计划者和决策者的手中来加以利用。嵌入了嵌入式人工智能模型的应用程序允许决策者在实施最终决策之前试验各种场景并并排比较收益,所有这些都不需要理解人工智能模型背后的实施细节。
如果您的组织正在寻找更好的方法来优化对中断的响应,分配和重新分配资源,或者解决其他预测和优化挑战,请不要犹豫,寻求帮助。IBM 数据科学精英团队的使命是帮助我们的客户在他们的人工智能之旅中取得成功,作为这一使命的一部分,我们免费提供初始启动服务。我们很高兴在数据科学/人工智能项目上与您合作。更多信息,请参考ibm.co/DSE-Community。
附加链接
* [## 2010-2019:美国数十亿美元天气和气候灾害的标志性十年| NOAA…
2019 年,美国经历了 14 次独立的灾害,每次损失至少 10 亿美元。自 1980 年以来,258…
www.climate.gov](https://www.climate.gov/news-features/blogs/beyond-data/2010-2019-landmark-decade-us-billion-dollar-weather-and-climate) [## 数据科学精英——IBM 数据科学社区
www.ibm.com](https://www.ibm.com/community/datascience/elite/) [## 紧急响应加速器(IBM 云包数据)
community.ibm.com](https://community.ibm.com/community/user/cloudpakfordata/viewdocument/emergency-response-management?CommunityKey=c0c16ff2-10ef-4b50-ae4c-57d769937235&tab=librarydocuments) [## 决策优化
IBM Decision Optimization 是一个产品系列,旨在使用规范性分析来改进优化,以…
www.ibm.com](https://www.ibm.com/analytics/decision-optimization) [## IBM Cloud Pak for Data -概述
IBM Cloud Pak for Data 是一个数据平台,它统一并简化了数据的收集、组织和分析
www.ibm.com](https://www.ibm.com/products/cloud-pak-for-data) [## 沃森工作室-概述
了解更多关于 Watson Studio 的信息。通过为您的团队提供一个最佳的工作环境来提高工作效率…
www.ibm.com](https://www.ibm.com/cloud/watson-studio)*
负责任的人工智能:在采用人工智能驱动的工具之前,企业应该知道什么
AI 会好到不真实吗?商业用户应该问的问题。
过去,我们预计机器学习支持决策的唯一广泛使用的地方是科技公司。我们知道亚马逊已经使用人工智能来帮助筛选简历,网飞使用机器学习驱动的推荐系统来猜测你还想看什么节目。这种情况正在改变。
机器学习模型现在以自动贷款 assessments⁴的形式嵌入到我们的银行系统中,并通过生成风险分数来通知 sentencing⁵.,嵌入到我们的刑事司法系统中除了这些定制的模型,从 enforcement⁵法律到 retail⁶,更多的组织正在购买由人工智能默默驱动的软件。
随着这些工具被广泛采用,商业领袖需要向他们的软件提供商、数据科学家和机器学习专家提出正确的问题。
当设计、部署和集成不当时,机器学习工具可能会产生严重的后果。
严重后果?比如什么?
如果你的人工智能驱动工具的应用程序对人或社区进行评估或决策,歧视性偏见就会发生。在你没有意识到的情况下,机器学习算法可以从训练数据中学习偏差。在过去,这导致恢复了对妇女有偏见的筛选工具或犯罪预测模型,导致对 communities⁵.族裔的过度监管
即使出于最好的意图,这种情况也会发生。你是一所试图利用机器学习更好地瞄准招聘活动的大学吗?您是否是一家利用大数据来识别需要资助的社区的非营利组织?如果历史对某一特定人群有偏见,那么你用来训练模型的数据就反映了这种偏见的结果。如果你不小心,你可能会使历史偏见永久化,即使是出于最好的意图。
概念漂移发生在支撑你的机器模型的条件发生变化,导致你的预测不再准确的时候。我们工作的世界瞬息万变,人类会根据这些变化的条件来调整我们的决策。如果我是一名企业校园招聘人员,我可以根据我对大学课程变化的了解来调整我的简历筛选标准,这些变化会导致不同的 GPA 分布。
受过训练的模型会忽略这些差异。随着时间的推移,模型被定型时的世界和模型进行预测时的世界之间的差异会扩大。在最好的情况下,业务用户会注意到差异,并相应地进行调整。最坏的情况是,一家企业可能会因为将核心功能委托给过时的模式而失去竞争力。
每个模型(或模型集)都有其局限性,因为它们在某些情况下高度准确,而在其他情况下可能是随机猜测。通常,当有大量训练数据可供学习模式时,模型表现良好,而在与之前看到的差异太大的示例中,模型表现不佳。
不知道在您的环境中,一个模型在什么情况下工作得好,什么情况下工作得差,意味着您不能构建考虑其缺点的业务流程。例如,如果我们知道某个算法在我们从未招聘过的大学可能表现不佳,那么让我们手动筛选来自新大学的候选人。
作为企业用户,我可以做些什么来准备我的组织?
在采用人工智能驱动的工具之前,请与您的人工智能专家进行讨论。
- **询问模型或工具在准确性之外的性能指标。**有时候,你会关心不同群体的准确性,比如少数民族是否得到与多数民族相似的预测。在其他情况下,您可能不太关心准确性,而更关心我们没有遗漏任何潜在的案例(回想一下)。
- **为模型部署后的监控制定一个计划,并确定重新评估和潜在重新训练模型的触发因素。**情况会发生变化,除非您积极监控情况,否则您和您的组织可能不会注意到这一点。确定指标以监控基础人群的分布。实现反馈机制来监控模型的准确性(或其他性能指标)。定期检查这些反馈,并积极主动地维护您的模型。
- 了解你的模型的局限性,并在周围业务流程的设计中解决它们。在不同条件下对你的模型进行压力测试。你的模型表现如何?例如,如果它是一个影响客户的工具,在这些情况下的性能是否可以接受?如果没有,通过在需要的地方进行人工干预来计划这些限制。
Monique 是一名前管理顾问,也是一名训练有素的数据科学家。你可以在 medium.com/@monique_wong 的查看她关于数据科学和商业的其他文章
[1]杰弗里·达斯廷。(2018 年 10 月 9 日)。https://www . Reuters . com/article/us-Amazon-com-jobs-automation-insight/Amazon-scraps-secret-ai-recruiting-tool-show-bias-against-women-iduskcn 1 MK 08g
[2]利比·普卢默。(2017 年 8 月 22 日)。https://www . wired . co . uk/article/how-do-Netflix-algorithms-work-machine-learning-helps-to-predict-what-viewers-will-like
[3]詹姆斯·文森特。(2018 年 1 月 12 日)。https://www . the verge . com/2018/1/12/16882408/Google-种族主义者-大猩猩-照片-识别-算法-ai
4 凯瑟琳·瓦尔希。(2019 年 7 月 26 日)。https://www . Forbes . com/sites/Douglas Merrill/2019/04/04/ai-is-coming-to-take-your-mortgage-disease/# 195 ee2b 87567
[5]郝凯伦。(2019 年 1 月 21 日)。https://www . technology review . com/2019/01/21/137783/algorithms-criminal-justice-ai/
【6】AI 创业公司。(2020 年 3 月 12 日)。https://www.ai-startups.org/top/retail/
用 R 实现可靠的流行病数据可视化
告知来激发意识,而不是恐惧。
马库斯·斯皮斯克在 Unsplash 上的照片
D 与任何其他分析不同,与疫情相关的数据可视化会带来无数风险,从在公众中虚假传播恐惧到甚至误导决策当局。最近强调了许多明智和负责任的数据可视化措施。最著名的是来自丽莎·夏洛特·罗斯特、阿曼达·马库雷克和埃文·佩克的。让我们深入采纳他们的一些建议,并使用 R 软件生成类似的适当的可视化。
步骤 1:获取和提炼数据
让我们从两个来源获取数据— 约翰·霍普斯金大学新冠肺炎存储库和牛津大学政府响应跟踪系统(OxCGRT) 。
df<-read.csv('Cases.csv') **#Data from John Hopkins** df2<-read.csv('Database2.csv') **#Data from Oxford CGRT**
第一个数据库给出了国家和日期的确诊、痊愈和死亡。一个单独的现役列是通过从中减去已康复中的数字和从中减去死亡中的数字计算出来的。让我们检查数据库的前几行和前几列。
head(df)[,1:15]
第二个数据库看起来像:
head(df2)
很明显,第二个数据库需要一些改进和重塑,如下所示:
**#Convert the Date column from numeric to datetime type** df2 <- transform(df2, Date = as.Date(as.character(Date), "%Y%m%d"))**#Combine Confirmed Cases and Deaths into a single column for labels**
df2<-gather(df2,Case_Type,Cases,ConfirmedCases:ConfirmedDeaths) **#Modified database:**
head(df2)
第二步:基本可视化
最基本和最常见的新冠肺炎可视化是累积条形图。
很容易通过使用 R 中的 ggplot2 包获得—
ggplot(data=dfsumcases, aes(x = Date, y = ConfirmedCases))+ geom_bar(stat = 'identity')
在全球累计确诊病例图表中,我们可以看到病例从 1 月底开始出现(数据库限制:我们知道这不是真的,因为中国的病例比那早得多。数据库中没有 Jan 的数据记录)。
注意到病例数量的突然增加了吗?
在最初的两个月中,案例总数达到了 70 万(1k=1000),但随后在不到一个月的时间里,几乎翻了一番,达到了 200 万。
在死亡人数上也可以观察到同样的模式。
然而,除了死亡人数相对于确诊病例明显较低之外,很难解释这两个图表之间的差异。
这让我们想到了下一个问题——我们真的需要把死亡人数单独想象成一个看起来可怕的指数增长吗?公共卫生专家阿曼达非常恰当地放下笔 —
“新冠肺炎不是死刑,我们的观想需要反映这一点。包括恢复的案例是可视化案例编号的一个重要背景。”
第三步:前进,负责任的观想
我们必须清楚地传达数据向我们揭示了什么—
- 死亡的部分作为总确诊病例的子集。
- 强调恢复的数量作为总确诊病例的子集。
资深数据科学家罗伯特·伍德在这方面做得很好。在我们的例子中,使用第一个数据库可以解决这两点,如下所示—
df %>%
filter(!grepl('Confirmed', Case_Type)) %>%
group_by(DateTime, Case_Type) %>%
summarise(Cases = Total/1000) %>%
ggplot(aes(x = DateTime, y = Cases, fill = Case_Type))+
geom_bar(stat = 'identity')+
theme(axis.title.x=element_blank())+
scale_fill_manual("legend", values = c("Active" = "steelblue4", "Deaths" = "black", "Recovered" = "goldenrod3"))
确诊病例总数分为 3 部分——活动期、死亡期和恢复期
马上我们可以看到,这不仅在视觉上吸引人,而且更适合这个敏感的场景,因为它迎合了上述两个重点。
注意手动颜色填充的故意使用?原因?
不幸的是,已经有许多与 COVID 相关的死亡。然而,不要用令人担忧的红色来呈现这些案例,而是采用不同的颜色,比如黑色(表示尊敬)。
现在,如果我们想获得 3 个组件中每一个的估计值,我们可以将位置参数设置为减淡,在几何 _ 条内
df %>%
filter(!grepl('Confirmed', Case_Type))%>%
group_by(DateTime, Case_Type)%>%
summarise(Cases = Total/1000)%>%
ggplot(aes(x = DateTime, y = Cases, fill = Case_Type))+
geom_bar(stat = 'identity', position = 'dodge')+
theme(axis.title.x=element_blank())+
scale_fill_manual("legend", values = c("Active" = "steelblue4", "Deaths" = "black", "Recovered" = "goldenrod3"))
与新冠肺炎相关的全球活跃、康复和死亡的累计登记病例
如果我们想在一个国家接一个国家的基础上观察同样的情况呢?我们可以利用 facet_wrap 选项—
df2 %>%
filter(grepl('China|Korea|United States|United Kingdom|Italy|Spain',CountryName) & Date > '2019-12-31') %>%
group_by(Date, Case_Type, CountryName)%>%
summarise(Cases = sum(Cases))%>%
ggplot(aes(x = Date, y = Cases, fill = Case_Type))+
geom_bar(stat = 'identity', position = 'dodge')+
scale_fill_manual("legend", values = c("ConfirmedCases" = "steelblue4", "ConfirmedDeaths" = "black"))+
facet_wrap(~CountryName)
注意到上图的一些问题了吗?
- 很难单独观察确诊病例和确诊死亡病例,这是因为美国的病例数量非常高。
- 显示的国家好像没有顺序(最好是最大案例降序排列?)
让我们使用 ggpubr 包中的 ggarrange 函数来解决这些问题。但首先,让我们按照确诊病例的降序排列数据库。
maxconfirmed <- df2 %>% filter(Case_Type=="ConfirmedCases") %>% group_by(CountryName) %>% arrange(-(Cases)) %>% distinct(CountryName, .keep_all = TRUE)head(maxconfirmed)
现在,我们可以在面网格中选择这些排名靠前的国家。然而,对于 ggarrange,我们需要每个国家都有单独的 ggplot 对象。让我们首先创建一个函数来完成这项工作。然后把它应用到所有想要的国家。
countryplot <- function(x) {
df2 %>%
filter(CountryName == x & Date > '2019-12-31')%>%
group_by(Date, Case_Type)%>%
ggplot(aes(x = Date, y = Cases/1000, fill = Case_Type))+
geom_bar(stat = 'identity', position = 'dodge')+ggtitle(x)+
theme(plot.title = element_text(hjust = 0.5),
plot.margin=unit(c(0.1,0.1,0.1,0.1), "cm"),
axis.title.x=element_blank(), axis.title.y=element_blank(),
axis.text.x = element_text(angle = 45))+
scale_fill_manual("legend", values = c("ConfirmedCases" = "steelblue4", "ConfirmedDeaths" = "black"))}pus<-countryplot('United States')
pit<-countryplot('Italy')+ coord_cartesian(ylim = c(0, 180))
psp<-countryplot('Spain')+ coord_cartesian(ylim = c(0, 180))
pge<-countryplot('Germany')+ coord_cartesian(ylim = c(0, 180))
pfr<-countryplot('France')+ coord_cartesian(ylim = c(0, 180))
puk<-countryplot('United Kingdom')+ coord_cartesian(ylim = c(0, 180))
pch<-countryplot('China')+ coord_cartesian(ylim = c(0, 180))
既然我们已经有了所有国家的单独 ggplot 对象,我们就可以使用 ggarrange 了。让我们在左边分开,在右边跟随 6 个国家作为 3x2 矩阵。
plc1<-ggarrange(psp,pit,pge,ncol = 3,legend = "none")
plc2<-ggarrange(pfr,puk,pch,ncol = 3, legend = "none")
plc3<-ggarrange(plc1,plc2,nrow = 2, legend = "none")
plc4<-ggarrange(pus,plc3,widths = c(1,3),common.legend = TRUE, legend = "bottom")annotate_figure(plc4,bottom = text_grob("Data source: The Oxford COVID-19 Government Response Tracker (OxCGRT)", color = "blue", hjust = 1, x = 1, face = "italic", size = 10),left = text_grob("Cases (in thousands)", color = "black", rot = 90))
所有这些真的算不上什么进步。因此,第 4 步:真正的交易
之前的观想非常简单。我们必须做得更多。但是这些都是细微的差别,我们必须小心谨慎—
- 如果我们想安全地更深入地挖掘数据,而不仅仅是显示累计数字,该怎么办?
- 如何看待每个国家都经历了病例和死亡的增加?而这同时又不受与数据记录相关的不确定性的可能威胁?
- 我们能否利用对数标度来获得改进的感觉?
流行病概况是指数曲线,随着曲线的上升,很难看到和捕捉重要的(可能有用的)细节。世界经济论坛的资深作家肖恩·弗莱明精彩地强调了这种对数标度的好处,以获得疫情数据背后的更大图景。这些进一步反映在丽萨在 datawrapper 的优秀的疫情可视化页面上。
让我们看看对数刻度能得到什么。然后嘣——
y 轴是累计确诊病例,用对数标度的七天滚动平均值平滑。否则,该刻度上的直线对应于指数增长。
在疫情的情况下,我们必须把微观水平的数据分析和解释留给流行病学家。此外,我们必须注意每个国家的所有数据收集和记录的不确定性。这促使使用七天滚动平均值来平滑累积确诊病例的概况。可以使用滚动平均函数计算滚动平均值—
df3<-df2[df2$Case_Type == "ConfirmedCases", ]
df3<-df3[order(df3$CountryName,df3$Date),] %>%
group_by(CountryName) %>%
mutate(roll_mean = rollmean(Cases, 5, na.pad = T))
此外,请注意,x 轴对应于自每个国家登记第 100 例病例以来的天数。因此,在有条件地删除案例数小于 100 的行之后,让我们创建一个单独的列作为日计数器(dc)。这将使所有国家的确诊病例配置文件从第和 天开始= 100 。
*df3<-df3[!(df3$Cases<10),]
df3<-df3 %>% group_by(CountryName) %>% mutate(dc = row_number())*
最后,让我们用两个变量,breaks 和 minor_breaks,在对数标度上表示滚动平均值与直流的关系。
*breaks <- 10^(-10:10)
minor_breaks <- rep(1:9, 21)*(10^rep(-10:10, each=9))
ggplot() +
geom_line(data=df4,aes(x=dc, y=roll_mean, group=CountryName),color="gray68") +
geom_line(data=df4 %>% filter(CountryName =='United States'),aes(x=dc, y=roll_mean),color="steelblue4",size=1) +
geom_line(data=df4 %>% filter(CountryName =='Italy'),aes(x=dc, y=roll_mean),color="darkseagreen4",size=1) +**#(Repeat the geom_line() step to bold as many countries as you want)** scale_y_log10(breaks = breaks, minor_breaks = minor_breaks) +
annotation_logticks(sides=c("l")) +
coord_cartesian(xlim = c(0, 60)) +
theme_bw()*
同样,由于国与国之间确诊病例总数的不确定性,最好对死亡总数进行同样的可视化,以衡量每个国家的表现。复制以上死亡的所有步骤给我们—
现在,如果我们想观察数字的变化率,比如 5 天内的变化,我们可以从数据中获得更多的见解。我们可以使用 lag()函数来获取以前的实例值。
*df7<-df2[df2$Case_Type == "ConfirmedCases", ]
df7<-df7[order(df7$CountryName,df7$Date),]
growth_rate = df7 %>% group_by(CountryName)%>%
mutate(Cases_1 = lag(Cases),
Cases_2 = lag(Cases_1),
Cases_3 = lag(Cases_2),
Cases_4 = lag(Cases_3),
Cases_5 = lag(Cases_4),
Diff_growth = Cases - Cases_5,
Rate_percent = ((Diff_growth/5)/Cases * 100))*
我们这次使用 3 天滚动平均值平滑增长率,增长率与日计数器图给出了—
y 轴是 5 天期间的病例变化率(%),用 3 天滚动平均值平滑
我们可以立即注意到变化率的正弦曲线行为,虽然增长率总体下降,但印度和日本等一些国家比其他国家更容易出现增长率上升。
同样,想象死亡案例总是分析新冠肺炎行动的一个更安全的赌注。因此,对死亡人数重复同样的步骤会给我们—
y 轴是 5 天期间死亡率(%)的变化率,用 3 天滚动平均值平滑
我们在这里看到一些惊人的启示。同样,死亡人数的变化率普遍下降。然而,日本的情况令人担忧,在过去的近 10 天里,变化的速度越来越快。同样,美国也开始经历变化率的增加。
关键要点
在疫情的情况下,数据可视化需要高度的正念和谨慎。我们必须意识到,通过在公共领域分享作品,我们冒着误导人们和在大众中煽动恐惧的风险。否则,目标应该是让人们意识到并帮助决策,以在危机情况下实现最佳的健康、福祉和经济繁荣。以下是收集到的一些关键点—
- 数据一下载, 探索 it, 理解 it,获取 上下文 。想象一下如何最好地利用它来迎合你心目中的基于数据的调查。在我的分析工作中,我使用了两个不同的数据库来帮助我。
- 注意图表的装饰方面,如颜色、形状、数字和大小。最好将 【死亡】**【恢复】**当前活跃病例 作为 总确诊病例 的子集显示,避免选择红色作为颜色强加不必要的警报和恐惧。在我的分析中,我展示了如何满足这些观点。
- 在试图汇总数据以发明任何指标度量时要小心谨慎。计算和分析 病死率 很诱人,但是,没人知道分母有多精确?确诊病例总数是否包括所有有症状的病例?确诊病例占总感染病例的比例是多少?因此,除了简单的增长率之外,我的工作中没有应用任何汇总。
- 由于不同国家有不同的数据收集方法、获得护理的机会和护理质量以及检测包的可获得性,因此不一致,跨国比较可能有风险。此外,平均人口年龄,免疫力和空气质量,以及健康习惯加在一起造成了不一致。在我的研究中进行的跨国分析试图忽略一些外部因素,因为我们只是在 n 个病例已经登记后才开始可视化,所有国家都来自一个共同的点。对数据进行了平滑处理,以进一步减少不一致性。
所有这些图形和数据库的源代码都可以在我的 github 库中找到。
免责声明
迈向数据科学 是一份主要基于数据科学和机器学习研究的媒体出版物。我们不是健康专家或流行病学家,本文的观点不应被解释为专业建议。想了解更多关于疫情冠状病毒的信息,可以点击 这里 。
餐馆收入预测
开发预测餐馆收入的经典模型
餐馆是一个国家经济和社会的重要组成部分。无论是为了社交聚会,还是为了吃快餐,我们大多数人都至少经历过一次拜访。随着最近弹出式餐馆和快餐车的兴起,企业主必须弄清楚何时何地开设新餐馆,因为这样做需要花费大量的时间、精力和资金。这就带来了寻找开一家新餐馆的最佳时间和地点的问题。拥有许多大型连锁餐厅的 TFI 在 Kaggle 上提供了他们餐厅收入预测的人口统计、房地产和商业数据。这里的挑战是建立一个健壮的模型,能够预测餐馆的收入。
数据
看了一下数据,训练集中有 137 个样本,测试集中有 10 万个样本。这非常有趣,因为数据的分布通常是相反的。这里的目标是基于训练集中的 137 个样本对收入进行建模,并查看该模型在测试集中的 100,000 个样本上的表现如何。每个样本的数据字段包括样本中每个餐厅的唯一餐厅 ID、餐厅的开业日期、城市、城市组、餐厅类型、几个非任意 P 变量以及作为目标变量的收入。对这个带有噪声的小训练数据集使用复杂模型将导致模型过度适应数据集。为了防止这种情况发生,肯定需要使用线性回归的正则化技术。
空值
简单查看一下训练数据后,似乎没有空值,这是一件好事。然而,对于 P 变量,情况可能并非如此,我们将在后面的数据探索中看到这一点。
数据预处理和探索特性
类型
上面的两个图显示了训练集和测试集中餐馆类型的数量。仔细看,在训练集中似乎没有出现一个“MB”类型。“MB”标牌代表流动餐馆,“DT”标牌代表得来速餐馆。由于移动餐馆与免下车餐馆的关系比直营餐馆和美食广场更密切,因此测试集中的“MB”样本被替换为“DT”类型。
城市集团
“城市组”功能似乎不需要任何更改。训练集的“大城市”样本略多于“其他”样本,但这在我们创建模型时应该不成问题。这也应该是直观的,餐馆在城市的收入比其他地区。
城市
(df['City'].nunique(), test_df['City'].nunique())
Out[10]: (34, 57)
对于“城市”功能,测试集中似乎存在不在训练集中的城市。还值得注意的是,一些非任意 P 变量已经包含地理位置信息,因此两个数据集都删除了整个“城市”特征。
开业日期
import datetime
df.drop('Id',axis=1,inplace=True)
df['Open Date'] = pd.to_datetime(df['Open Date'])
test_df['Open Date'] = pd.to_datetime(test_df['Open Date'])
launch_date = datetime.datetime(2015, 3, 23)
*# scale days open*
df['Days Open'] = (launch_date - df['Open Date']).dt.days / 1000
test_df['Days Open'] = (launch_date - test_df['Open Date']).dt.days / 1000
df.drop('Open Date', axis=1, inplace=True)
test_df.drop('Open Date', axis=1, inplace=True)
开业日期是餐馆第一次开业的日期。这在预测收入方面没有多大用处,但知道餐馆从开业之日起营业了多长时间会很有用。出于这个原因,我决定使用 2015 年 3 月 23 日作为比较日期来计算餐厅已经营业的天数。然后,我选择将开放的天数缩减 1000 倍,以略微提高模型性能。
P-变量
该数据有 37 个 p 变量,它们都是混淆数据。根据 Kaggle 竞赛页面上的数据字段描述,这些要素包含人口统计数据、房地产数据和商业数据。
最初,我认为 p 变量是数字特征,但在阅读了比赛中的一些讨论后,发现其中一些特征实际上是使用整数编码的分类数据。更有趣的是,这些特性的大部分值为零。再一次,在深入讨论之后,人们得出结论,这些零值实际上是空值,如上图所示。通过链式方程(也称为 MICE)的多变量插补用于替换这些特征中的缺失值。它的工作方式是使用整个可用数据集来估计缺失值。
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
imp_train = IterativeImputer(max_iter=30, missing_values=0, sample_posterior=True, min_value=1, random_state=37)
imp_test = IterativeImputer(max_iter=30, missing_values=0, sample_posterior=True, min_value=1, random_state=23)
p_data = ['P'+str(i) for i **in** range(1,38)]
df[p_data] = np.round(imp_train.fit_transform(df[p_data]))
test_df[p_data] = np.round(imp_test.fit_transform(test_df[p_data]))
分别对训练集和测试集的所有 p 变量使用估算器。在估算者取平均值之前,缺失值被估算几次。在将这些平均值输入模型之前,需要将其四舍五入为最接近的整数。
一个热编码
为了处理数据中的对象类型,将使用一种热编码来将这些特征转换成可以提供给机器学习模型的数字形式。虚拟编码也可用于避免冗余。将被编码的要素是“类型”和“城市组”,因为它们是数据集中仅有的对象类型。
columnsToEncode = df.select_dtypes(include=[object]).columns
df = pd.get_dummies(df, columns=columnsToEncode, drop_first=False)
test_df = pd.get_dummies(test_df, columns=columnsToEncode, drop_first=False)
目标变量分布
从分布来看,收入是右偏的。似乎也有异常值,这将导致模型训练中的问题。由于我们将试验线性模型,目标变量将被转换为正态分布,以改进模型解释。目标变量已进行了对数变换,因此最终预测将需要进行指数运算,以将结果重新调整回正常值。
模型实验
我决定尝试的模型是几种不同的线性模型,KNN,随机森林和梯度增强模型。这里的目标是找到最好的超调模型来集成最终模型。在我们训练任何模型之前,我们将把训练集分成训练集和验证集。
df['revenue'] = np.log1p(df['revenue'])
X, y = df.drop('revenue', axis=1), df['revenue']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=118)
岭线性模型
岭回归是一种正则化的线性模型。如前所述,需要使用正则化技术来防止过度拟合,特别是因为我们的训练集非常小。在我们在训练上训练一个脊模型之前,我们需要找到模型的最优参数。为了做到这一点,网格搜索和 k-fold 交叉验证被用来寻找导致最佳分数的最佳参数。
然后,使用训练集和测试集将最佳参数用于模型评估。这里的 RMSE 实际上是 RMSLE,因为我们已经取了目标变量的对数。
套索线性模型
现在我们对套索模型重复同样的步骤。套索模型的工作方式不同于岭模型,因为它缩小了不太重要的要素的系数。这可以在稍后的特征重要性图中看到。
我们可以看到,lasso 模型比仅使用“开放天数”特征的 ridge 模型概括得更好。它能够实现与使用所有特征的岭模型几乎相同的测试误差,这显示了这些正则化技术的真正潜力。
弹性网
ElasticNet 是一个结合了 ridge 和 lasso 正则化技术的线性模型。我们将使用 ElasticNetCV 通过交叉验证来选择最佳的混合模型。
使用弹性网模型几乎没有改善。我们可以看到线性模型之间的训练分数和测试分数都差不多。
在特征重要性方面,弹性模型减少了 72%的特征。即使有这种减少,该模型似乎也没有给出相对于脊或套索模型的改进的分数。这可能是由于小数据集和线性模型倾向于过度拟合。
KNN
对于 KNN,我们将使用 sklearn 的 KNeighborsRegressor。我们应用相同的过程来寻找最佳邻居参数。
令人惊讶的是,在测试集上,KNN 模型似乎比线性模型表现得好一点。
随机森林
随机森林是非常强大的模型,与袋装决策树略有不同。与袋装树不同,随机森林会随机选择一个要素子集,并在每个节点找到要分割的最佳要素,而袋装树则考虑在每个节点使用所有要素进行分割。随机森林还提供独特的超参数来减少过度拟合。我们将基于这些超参数中的几个来调整我们的模型。
我们可以看到,与上面使用的线性模型和 KNN 相比,训练分数有了显著提高。该模型还能够使用几乎所有的数据来实现这一点,如下面的特征重要性图所示。
LightGBM
LightGBM 为决策树提供了增强功能。它是 XGBoost 的一个很好的替代品,我们将在后面测试它。
根据训练分数,由于测试分数没有提高,模型似乎过度适应了训练集。稍后在我们的系综中包含这个模型可能不是最佳的。
XGBoost
XGBoost 是决策树的另一种提升算法。让我们来看看在优化超参数之后它与 LightGBM 相比如何。
该模型似乎没有 LightGBM 那样过度拟合。训练和测试分数似乎也低于随机森林模型。这解释了为什么这个模型在任何问题设置中都被大量使用。
在增强模型中很容易过度拟合,因此我们将添加早期停止参数以减少过度拟合。这给了我们一个更好的模型,仍然能够很好地概括测试集。
组装
根据上述模型的实验,很明显,线性模型和 KNN 不是该数据集的最佳模型。因此,它们不会被用作合奏的一部分。正如我们从上面的训练和测试错误中看到的,集成的最佳模型是随机森林和 XGBoost 模型。我决定使用随机森林集合,因为在这个场景中,boosting 模型有过度拟合的趋势,如 LightGBM 模型所示。对于合奏,我决定使用堆叠合奏。这样做的好处是创建一个单一的模型,该模型具有几个基本模型的良好性能。基本模型是不同的调整随机森林模型,元模型将是一个简单的模型,如线性回归。
我在整个数据集上拟合了堆叠模型,并根据 Kaggle 私人排行榜进行了测试。这款车型表现惊人,以 1741680.77896 的 RMSE 分数在私人排行榜上排名第四。作为参考,私人排行榜的第一名解决方案是 RMSE 1727811.48553。
得分
挑战和经验教训
最初,我没有为这个项目计划很多事情。在我阅读 Kaggle 竞赛中的一些讨论之前,我假设 p 变量实际上是数值。考虑到这一点,我对这些变量进行了对数转换,最终使线性模型更好地预测了目标变量。这是有意义的,因为每个特征都是归一化的,使得线性模型更容易预测。在发现 p 变量是有许多缺失值的分类变量后,插补是一个好得多的方法。这带来了一个教训,即理解您正在处理的数据非常重要,尤其是如果它是一个小数据集。我也试验过许多模型,手动调整超参数,直到我发现网格搜索在寻找最佳模型时节省了时间和精力。这些只是我在处理这个数据集时学到的一些东西。未来可能尝试的几件事是根据相关特征拟合模型,并包括更多样化的模型集合。
参考
Python 中的 RESTful APIs
什么是 RESTful APIs 和在 Python 中实现 GET
API 是两个软件之间的假想契约。Web APIs 使得跨语言应用程序能够很好地工作。
应用程序编程接口通常用于从远程网站检索数据。为了向远程 web 服务器发出请求并检索数据,我们使用了提供 API 的 URL 端点。每个 URL 被称为一个请求,被发回的数据被称为一个响应。
RESTful API 是一个应用程序接口,它使用 HTTP 请求来获取、上传、发布和删除数据。基于 REST 的交互使用熟悉 HTTP 的任何人都熟悉的约束。并且交互使用标准的 HTTP 状态代码来传达它们的状态。
为什么使用 API 而不是可以下载的静态数据集?
- 数据是不断变化的
- 您想要更大的数据池中的一小部分
API 请求
API 托管在 web 服务器上。
当我们在浏览器的地址栏中键入www.google.com时,计算机实际上是在向www.google.com服务器请求一个网页,然后它将这个网页返回给浏览器。
API 的工作方式非常相似,除了不是网络浏览器请求网页,而是程序请求数据。
这些数据以 JSON 格式返回。
为了获得数据,我们向 web 服务器发出请求。然后,服务器用数据进行回复。在 Python 中,我们利用requests
库来做这件事。
“请求”
最常用的请求是 GET 请求,用于检索数据。GET 请求将是本文的重点。
端点/路由
根端点是我们请求的 API 的起点。它完成了确定被请求的资源的路径。例如-https://www.google.com/maps。
/地图 是终点,是起始网址。
方法
- 获取—从服务器获取资源。
- POST —在服务器上创建新资源。
- 上传、修补—更新服务器上的请求。
- 删除—从服务器中删除资源。
状态代码
- ***1xx:信息:*传达传输协议级信息。
- ***2xx:成功:*客户的请求被成功接受。
- ***3xx:重定向:*客户端必须采取一些额外的动作来完成它们的请求。
- ***4xx:客户端错误:*客户端错误。
- ***5xx:服务器错误:*服务器端错误。
JSON 数据
JSON 是数据在 API 之间来回传递的主要格式,大多数 API 服务器将以 JSON 格式发送响应——包含一个 JSON 对象的单个字符串。
JSON 是一种将列表和字典等数据结构编码成字符串的方法,以确保它们易于被机器读取。
因此,列表和字典可以转换成 JSON,字符串可以转换成列表和字典。
JSON 看起来很像 Python 中的字典,存储了键值对。
进入 Python
我们将实现一个单一案例场景,它弥补了大多数 GET 请求的场景。
进口货
*import json
import requests
import urllib.parse*
一些 GET 请求由端点组成,这些端点具有不可选的路径参数,并且是端点的一部分,例如-/volunteer/{ volunteerID }/badge/{ badgeID }**
需要将 volunteerID 和 badgeID 传入完整的 URL,以完成 GET 请求。
这就是我们利用urllib.parse
的地方。
假设我们在一个 JSON 文件中有一个 volunteerIDs 和 badgeIDs 的列表,我们希望将它输入到端点中,调用 API 并获得结果信息。
***#reading in the JSON file**
with open(‘volunteer_data.json’, ‘r’) as text_file_input:
data=text_file_input.read()**#loading that file as a JSON object**
obj = json.loads(data)*
下一步是设置 URL。
*API_ENDPOINT = ‘https://registeredvolunteers.xyz.com/volunteer/{}/badge/{}'*
现在,让我们运行一个for
循环来调用 API。
***#we pass on the arguments volunteerID and badgeID**
for i in obj:
r=requests.get(API_ENDPOINT.format(urllib.parse.quote(
i[‘volunteerID’]),
i[‘badgeID’])
)
print(r.text)**#outside for loop**
text_file_input.close()*
注意,如果你期待一个 JSON 输出,r.text
会给你一个由 JSON 对象组成的字符串。为了从中提取 JSON 对象,我们:
*output_json = json.loads(r.text)**#or directly use** r.json()*
要获得请求的状态代码和状态代码的原因,
*r.status_code
r.reason*
最终意见
上面的场景涵盖了 GET 请求的不同情况——是否需要传递 URL 参数,以及传入的这些参数是否存储在文件中;以及 GET 请求的不同属性,您可以研究这些属性来理解接收到的数据。
获得 REST APIs 的领先优势!
恢复多维空间的直觉
尝试使用数学和 python 来理解 N 维空间在对机器学习有用的上下文中的行为。
我见过的最强大的极光。马尔维克 2019。(私人图片)
如果我们不诅咒事物,我们就不是人类。作为被限制在三维世界中的生物,每当我们在可视化扩展到三维以上的数据方面遇到问题时,我们往往会责怪空间。从科学书籍和期刊论文到简单的博客文章和评论,“维度诅咒”这个术语像咒语一样不断重复,几乎让我们相信,任何物体,只要其本质不仅仅是“3D”,我们的大脑就无法触及。
本文既不讨论数据可视化,也不试图符合高维空间不可理解的普遍观点。
恰恰相反:高维空间不是不可理解的。这很奇怪,也不太直观。幸运的是,利用一些数学工具,把它们作为一张“免费票”来获得更多的直觉。更准确地说,我们将展示三条“路线”,我们可以用它们来更好地感受“第二空间”中的事情是如何进行的
可能性的空间
我们经常听说优化问题中的一个可能的失败发生在优化器“陷入局部最小值”的时候。想象我们的任务只是最小化一个变量的函数,我们只能向两个方向移动:向左或向右。如果试图向任何方向移动都会使函数增大,我们会发现自己处于局部最小值。除非这也是一个全球最小值,否则我们有点不走运。
现在,考虑给空间增加一个维度。在二维空间中,即使我们在其中一个轴上找到了局部最小值,也总有机会在另一个轴上取得进展。空间中特定点的函数值达到极值(最小值或最大值)的情况称为临界点。如果这个点在一个轴上是最小值,但在另一个轴上是最大值,它被称为鞍点。
(全局)最小值(左)和鞍点(右)的示例。
鞍点为优化器提供了一个“逃跑”方向。虽然给定一个维度时不存在,但给定更多维度时,任何给定临界点是鞍点的可能性应该会增加。
为了说明这一点,让我们考虑所谓的 Hessian 矩阵,它是 f 关于所有自变量的二阶导数的矩阵。
由于 Hessian 矩阵是对称矩阵,我们可以对角化它。
临界点最小的条件是海森矩阵是正定的,这意味着 h₁,h₂,…,hₙ > 0。
假设 f 是一个复杂的函数,不偏向任何正值或负值,我们可以假设对于任何临界点, P(hᵢ) > 0 ,以及 *P(hᵢ) < 0,*为 *1/2。*此外,如果我们假设 hᵢ 不依赖于任何其他 hⱼ ,我们可以将 p(hᵢ) 视为独立事件,在这种情况下:
类似地,对于最大值:
我们的临界点是鞍点的可能性是,它既不是最大值也不是最小值。因此,我们可以看到:
因此,高维空间似乎是可能性的空间。维度的数量越多,就越有可能感觉到鞍点为优化器的工作提供了方向。
当然,因为我们可以找到不符合这个陈述的函数的例子,所以这个陈述不是证明。然而,如果函数 f 对它的自变量有某种复杂的依赖性,我们至少可以预期,维数越高,空间就越“宽容”(平均而言)。
超级大球
圆形、球形或超球形——对这些物体的数学描述都很简单。
这个方程描述的只是一组点到原点的距离小于或等于一个常数的点(不考虑维数)。可以看出,对于任意数量的维度,该物体的总体积(或超大体积)可以使用以下公式来计算:
观察它与 n 的比例关系,我们可以看到:
如果我们尝试为任意维数的单位超球( r = 1)绘制这个方程,会发生一件有趣的事情:
单位半径超球的体积。
正如我们所看到的,在最初的几秒钟里,球体的体积增加了。但是,一n5,就迅速下降到一个很小的数字。
单位超球在失去质量是真的吗?为了了解质量的去向,让我们定义一个密度参数:
其中ε用于定义任意厚度的“壳”。同样,将 r 设为 1,将ε从 0 扫到 1,我们可以得出一个有趣的观察结果:
N 维球的体积浓度。
随着维度数量的增长,事实证明几乎所有球的质量都集中在它的边界周围。
如果我们考虑从属于高维空间的某个邻域中抽取样本,那么高维空间的这一特性就特别重要。在电脑上,和马克·库利提供了有趣的插图,试图展示当 N 变高时会发生什么。感觉就好像空间的维度使空间发生了偏转,使得被限制的点想要逃离或者推向终点,就好像它们试图探索可用的额外自由度一样。
多维蛋糕
让我们考虑一个立方体蛋糕,我们想把它切成 N 片 N 片来创建一些小块。如果我们的蛋糕是一个三维立方体(我们现在将使用 K 来描述维度),我们可以将它分成的最大数量由以下序列描述:
在哪里
是二项式系数。
和以前一样,我们可以将数学扩展到更多的维度。
有一个尺寸为 K 的多维蛋糕和一把用于切片的多维刀,使用( K-1 )维超平面,计算“超块”的数量:
其中后一个公式是完全等价的,但是更容易计算。
现在,让我们看看超级件数将如何与 N 和 K 成比例。
import numpy as np
import pandas as pd
form itertools import productdef cake(n, K):
c = 0
for k in range(K + 1):
term = [(n + 1 - i) / i for i in range(1, k + 1)]
c += np.array(term).prod()
return cN = 10 # cuts
K = 10 # dimensions
p = list(product(range(1, N + 1), range(1, K + 1)))
X = pd.DataFrame(pd.DataFrame((p,)).to_numpy().reshape(N, K)
X.index = range(1, N + 1)
X.columns = range(1, K + 1)
C = X.applymap(lambda x: cake(x[0], x[1])).astype(int)
ns = X.applymap(lambda x: x[0])
ks = X.applymap(lambda x: x[1])
C_normed = C / (nx * ks)
N,K——蛋糕数(左):显示使用 N 次切割的 K 维空间的最大切片数。标准化蛋糕数 C/(N * K)显示了添加尺寸或切割时切片数的比例。
看左图,我们看到上面公式的直接结果。尽管它看起来接近指数,它仍然是一个多项式表达式。直觉上,维度越多或切得越多,我们能从蛋糕中产出的部分就越多。
但是,如果我们将 C 除以 N * K 的乘积进行归一化,我们可以看到,对于某些固定的切割次数,具有 N 的切片数量的增加不再那么快。换句话说,似乎空间被分割成更独特的区域的潜力在某种程度上是饱和的,并且对于任何数量的切割 K ,存在一个“最佳”维数 N ,空间“更喜欢”被分割。
考虑到,例如,对于密集的神经网络层,输出状态通过以下向量矩阵乘法获得:
其中 g 为激活函数,且
N 和 K 都可以操作。正如我们之前看到的,增加 K (也就是 x 的特征数量)或 N (也就是超平面的数量)会导致更多区域的定义,这些区域会对与这些片段相关联的 y 的独特“触发”模式做出贡献。我们拥有的片段越多,我们应该期望的性能越好,但同时增加 N 和 K 也意味着更多的操作和更大的内存占用。因此,如果对于给定的 N ,每增加一个额外维度的切片数量不再增长,那么就资源消耗而言,保持密集层较小可能是有利的?
结论
在这篇文章中,我们探讨了空间多维性的三个方面。由于我们无法将它可视化(我们甚至没有尝试…),我们利用一些数学机制来更深入地了解这个世界的奇怪行为。尽管没有任何终极证据的支持,但我们希望刚刚提出的数学推理能够激发一些灵感、直觉和想象力,这是在处理 N 维度时经常需要的东西。
如果你有你的想法或观点(或者你想指出一些不一致的地方),请在下面的评论中分享。
还会有更多…
我计划把文章带到下一个层次,并提供简短的视频教程。
如果您想了解关于视频和未来文章的更新,订阅我的 简讯 。你也可以通过填写表格让我知道你的期望。回头见!
利用深度学习恢复旧航拍图像
以感知损失函数和真实图像作为输入的超分辨率
介绍
在超分辨率的帮助下,我给我居住的城市的旧航拍照片带来了生命。使用高分辨率图像训练的神经网络,我能够创建细节,使旧的航空图像看起来质量更高。
原始图像在顶部,预测图像在底部。图片:马尔默市
超分辨率
超分辨率的工作原理是放大图像数据,并为其提供比使用双线性或最近邻插值放大时更多的细节。我相信你们中的很多人都尝试过在 Photoshop 中放大照片,并看到了模糊的结果。超分辨率和升迁完全不同。它以一种非常令人信服的方式编造从未有过的细节。
为了训练一个超分辨率模型,你需要一对描绘同一事物的图像,一个低分辨率,一个高分辨率。创建训练数据的常用方法是从模型中用作目标的高分辨率图像中生成低分辨率输入图像。这为您提供了具有相应像素的图像对——良好的训练数据。
我决定用一种稍微不同的方式来尝试。也许有更简单的方法?由于地理数据与地面上的位置相关,因此也与所有其他地理数据相关,我想我不必创建自己的训练数据,我已经有了我需要的数据。
由于我的数据是 1998 年拍摄的图像,而我从 2017 年开始在同一地区拍摄分辨率更高的图像,所以我已经有了“降级”的图像和目标。
这样我就可以得到所有我想修复的缺陷,包括那些我没有想到的或者那些我不能手工复制的缺陷。通过使用来自同一来源的数据,我后来想增强,我得到了所有自然发生的缺陷——模糊,色偏等。这可以让我不费吹灰之力就获得现成的训练数据。
如前所述,地理数据的一大优势是,一切都与地面上的一个点相关,并用坐标来描述它。这使得从不同数据集中剪切出具有完全相同范围的部分变得容易。在这种情况下,这意味着创建覆盖城市中同一区域的输入和目标图像。使用航空影像时会有一些潜在的问题,我将进一步讨论这些问题。
我使用的过程是基于 fast.ai 的 MOOC v3 的工作实例。最大的不同是数据扩充部分,在这里我使用了一组变换,这些变换以前给了我很好的航空影像效果。
数据
正射影像
正射影像是由飞机或无人机拍摄的几张重叠照片组成的图像。它经过校正,以创建类似地图的图像,可用于测量精确的距离和角度,就像在地图中一样。图像中的一切似乎都是从垂直的自上而下的视角拍摄的。
潜在的问题
正射影像的问题在于它们并不总是正交的。航空图像,尤其是旧的,没有足够的重叠。正是这种重叠使得每张照片的中心部分,也就是垂直于地面的部分,被用于制作最终的照片。缺少重叠,物体从某个角度被描绘。这是一个问题,尤其是对于其中有高层建筑的图像,导致屋顶从覆盖区偏移,建筑的立面变得可见。有时这是想要的效果,但大多数时候不是。在我的例子中,它导致输入图像的内容与目标图像不同,特别是在有高楼的区域。
来源:Pieter Kuiper,维基共享(公共领域)
当使用真实的低分辨率图像而不是生成的图像训练模型时,内容的差异仍然是一个问题。房屋被建造、拆除、道路被重绘、树木被种植等等。一个城市在 19 年里发生了很多事情,使得目标与投入不同。不过,这并没有引起我想象的那么大的问题。我的总体印象是,尽管存在差异,但该模型做得很好。
在为我的训练集选择区域时,我很小心地选择了这样的区域:a)存在于 1998 年,b)自那以后变化不大。
原始数据:
输入 1998 年的航拍影像(正交镶嵌图)(25cm/像素)
输入 2017 年的目标航拍影像(正交镶嵌图)(10cm/像素)
训练数据:
1 万对图像瓦片
每个瓦片为 500 x 500 像素,覆盖地面 50 x 50m = 10cm/像素
共 25 km
~ 5 GB 的数据
模型和培训
我不会详细讨论感知损失的概念,因为许多其他人对此做得更好:
贾斯廷·约翰逊等人关于感知损失的原始论文
Christopher Thomas 的深入文章
简而言之,对于像超分辨率这样的任务,感知损失函数是使用 GAN 的替代方案。它的相似之处在于,它使用第二个模型来决定第一个模型的表现——“它创造的东西像我们想要的东西吗?”。不同的是,第二个模型,鉴别器,在这个过程中没有被训练。在我的例子中,模型是在 ImageNet 上预先训练的用于图像分类的神经网络,VGG16。
来源:实时风格转换和超分辨率的感知损失:https://arxiv.org/abs/1603.08155
在这种情况下,主模型是 U-Net,其中编码器部分是预训练的 resnet34 架构。通过 VGG 获取预测值和目标值来拟合模型。然后,在 VGG 内部,我们比较它们的激活并计算损失。通过这种方式,我们可以得到模型表现如何的数字,例如,在应该有草地的地方创建一个草地,或者模型在生成一个有尖角的房子方面做得不好。
损失取决于模型如何预测特征和风格,而不仅仅是比较像素值。这有助于我们的模型知道什么是重要的。例如,一个建筑角可能不会占据图像中的许多像素,但对于图像的感知却非常关键。感知损失函数认识到这些像素的重要性。
超高分辨率使屋顶更清晰、更分明。左边是原始图像,后面是预测图像和目标图像。注意输入和目标之间的差异,以及模型如何模仿目标图像的风格,而不是内容。图片:马尔默市
在一个 16GB 的 GPU 上,10,000 个图像对的数据集花费了大约两个小时来训练总共 20 个时期。
结果和后处理
结果显示更明确的屋顶线和更少的噪音。植被通常显示更多细节,但有时看起来模糊不清。在带有大面积灰色区域(如道路)的图像拼贴中,颜色通常看起来有点淡。当创建一个用于推理的自动化工作流程时,我会加入一些基本的图像处理来给它们更多的对比度。
我相信有很多方法可以让模型表现得更好。如果有什么可以帮忙的,请随时通知我!
不幸的是,由于版权和隐私问题,我不能展示很多例子,但如果你是高分辨率航空影像的幸运拥有者,我建议你尝试一下。下面是这个项目中使用的代码的链接。
推断是使用与原始输入相同大小和分辨率的图块进行的。在创建它们的时候,我还做了一个空间参考文件(。wld)。
将预测图像保存为与。在 GIS 软件中使用时,wld 将预测图像与地面相关联。结果是一个与空间相关的超分辨率航空影像,可用作 web 地图或任何其他应用程序的背景。
结论
这太有趣了!1998 年的画面以一种我从未见过的方式鲜活起来。当然,它不是真实的,因为你无法提取从一开始就不存在的细节,而是它可能看起来的样子的再现。请记住,当模型进行预测时,它不知道目标是什么,只是知道或了解详细的航拍图像应该是什么样子。剩下的就是模特有资格的猜测或者说是幻觉/代入缺失的细节。这不是真的,但看起来很像。
我很惊讶这个模型表现得如此之好,尽管输入图像和目标图像之间的差异比用降级方法创建的要大得多。几乎没有进行任何预处理,只是将两个图像集的子集切割成小块。感知损失函数的使用有助于缩短训练时间,从而有望使更多拥有大量地理数据的市政当局或其他组织能够使用这样的项目。
我不知道内容的偏斜度和差异对模型的效率有多大影响。如果两个图像集都是真正正交的,或者如果我有早些年的高分辨率图像并在两个图像集之间获得较短的时间跨度,可能需要的训练数据会更少。不可避免的是,图像之间的东西会有所不同,即使是在建筑物保持不变的区域。我发现,在 1998 年和 2017 年,很少有汽车停在同一个地方。
Kaggle 上的笔记本链接:
https://www . ka ggle . com/peterahlstrom/super-resolution-aerial-images-fastai
作为电影评论推荐系统的受限玻尔兹曼机(下)
关于如何使用 Pytorch 创建用于电影分级预测的 Boltzmann 机器的技术演练
通过链接改编自 unsplash 的 Img
本文是如何构建一个受限波尔兹曼机器(RBM)作为推荐系统的第 2 部分。
在第一部分中,我们专注于数据处理,这里的重点是模型创建。你将学到的是如何从头开始创建一个 RBM 模型。它分为三个部分。
- 模型结构
- 模特培训
- 模型检验
📣📣这是一篇技术驱动的文章。现在让我们开始旅程🏃♀️🏃♂️.
- 模型构建
本质上,RBM 是一个概率图形模型。
为了构建模型架构,我们将为 RBM 创建一个类。在类中,定义 RBM 的所有参数,包括隐藏节点的数量、权重以及可见节点和隐藏节点的概率偏差。
有 4 个函数,第一个函数是初始化类,第二个函数是在给定可见节点的情况下采样隐藏节点的概率,第三个函数是在给定隐藏节点的情况下采样可见节点的概率,最后一个函数是训练模型。
1.1 init 函数
**在 init 函数中,我们将初始化所有需要优化的参数。**注意, nv 和 nh 分别是可见节点数和隐藏节点数。W 是可见节点和隐藏节点的权重。我们使用平均值为 0、方差为 1 的正态分布来初始化权重和偏差。 a 是给定可见节点时隐藏节点概率的偏差, b 是给定隐藏节点时可见节点概率的偏差。注意我们为批处理添加了一个维度,因为我们将在 Pytorch 中使用的函数不能接受只有一维的向量。
class RBM():
def __init__(self, nv, nh):
self.W = torch.randn(nh, nv)
self.a = torch.randn(1, nh)
self.b = torch.randn(1, nb)
1.2 隐藏节点采样功能
这个函数是关于在给定可见节点概率的情况下对隐藏节点进行采样。我们为什么需要这个?因为我们需要概率来采样隐藏节点的激活。
假设我们有 100 个隐藏节点,这个函数将对隐藏节点的激活进行采样,即按照一定的概率 p_h_given_v 激活它们。 p_h_given_v 是给定 v 的值,隐藏节点等于 1(激活)的概率。
注意,该函数接受参数 x ,这是可见节点的值。我们用 v 来计算隐藏节点的概率。记住, h 给定v(p _ h _ 给定 _v )的概率就是 v 的 sigmoid 激活。因此,我们将可见节点的值乘以权重,再加上隐藏节点的偏差。我们扩展了偏置 a 的尺寸,使其与 wx 具有相同的尺寸,从而将偏置添加到 wx 的每一行。
def sample_h(self, x):
wx = torch.mm(x, self.W.t())
activation = wx + self.a.expand(wx)
p_h_given_v =torch.sigmoid(activation)
reutrn p_h_given_v, torch.bernoulli(p_h_given_v)
注意返回的是 p_h_given_v ,以及采样的隐藏节点。这里,我们做了一个伯努利 RBM,因为我们预测了一个二元结果,即用户喜欢或不喜欢一部电影。假设有 100 个隐藏节点, p_h_given_v 是 100 个元素的向量,每个元素为每个隐藏节点被激活的概率,给定可见节点的值(即用户对电影的评分)。但问题是如何激活隐藏节点?这里我们使用伯努利采样。假设,对于一个隐藏节点,它在 p_h_given_v 中的概率是 70%。我们取 0 到 1 之间的一个随机数。如果低于 70%,我们将不会激活隐藏节点。通过对 p_h_given_v 中的所有隐藏节点重复伯努利采样,我们得到 0 和 1 的向量,其中 1 对应于要激活的隐藏节点。
这是吉布斯采样✨✨.需要的第一个函数
1.3 可见节点采样功能
**遵循同样的逻辑,我们创建了对可见节点进行采样的函数。**给定隐藏节点的值(1 或 0,激活与否),我们估计可见节点的概率 p_v_given_h ,即每个可见节点等于 1(被激活)的概率。
因为有 1682 个电影和 1682 个可见节点,我们有 1682 个概率的向量,每个概率对应于等于 1 的可见节点,给定隐藏节点的激活。我们使用伯努利采样来决定是否对这个可见节点进行采样。最后,函数返回可见节点的概率 p_v_given_h ,以及一个 1 和 0 的向量,其中 1 对应于要激活的可见节点。
def sample_v(self, y):
wy = torch.mm(y, self.W)
activation = wy + self.b.expand(wy)
p_v_given_h =torch.sigmoid(activation)
reutrn p_v_given_h, torch.bernoulli(p_v_given_h)
1.4 对比散度函数
RBM 是一个基于能源的模型,这意味着我们需要最小化能源函数。
能量函数取决于模型的权重,因此我们需要优化权重。另一方面,RBM 可以被视为一个概率图形模型,它需要最大化训练集的对数似然性。显然,对于任何神经网络,为了最小化能量或最大化对数似然,我们需要计算梯度。这里我们使用对比散度来近似似然梯度。
对比分歧是关于近似对数似然梯度。代替需要大量计算资源的梯度的直接计算,我们近似梯度。在训练过程中,我们朝着能量最小化的方向调整重量。类似于通过梯度下降最小化损失函数,其中我们更新权重以最小化损失,唯一的区别是我们使用对比散度算法来近似梯度。
具体来说,我们从输入向量 v0 开始,基于 *p_h_given_v,*的概率,我们在第一次迭代时采样第一组隐藏节点,并使用这些采样的隐藏节点来采样可见节点 v1 与 p_v_given_h. 重复这个过程 K 次,这就是关于 K 步对比发散的全部内容。
在这个函数中,我们将使用本文概述的算法更新权重、可见节点的偏差和隐藏节点的偏差。我强烈推荐这本RBM paper 如果你喜欢更深入的了解。
在函数内部, v0 是包含用户对所有电影的评级的输入向量。 vk 是从可见节点到隐藏节点进行 k 采样后得到的可见节点。 ph0 是给定 v0 的第一次迭代时隐藏节点概率等于 1 的向量。 phk 是给定可见节点 vk 在第k 次迭代时隐藏节点的概率。
def train(self, v0, vk, ph0, phk):
self.W += torch.mm(v0.t(), ph0) — torch.mm(vk.t(), phk)
self.b += torch.sum((v0 — vk), 0)
self.a += torch.sum((ph0 — phk), 0)
1.5 RBM 对象创建
为了初始化 RBM,我们创建一个 RBM 类的对象。首先我们需要可见节点数,也就是电影总数。隐藏节点的数量对应于我们想要从电影中检测的特征的数量。很难确定最佳的功能数量。但是这个参数是可调的,所以我们从 100 开始。我们还定义了批量大小,这是我们用来更新权重的一批中的观察次数。我们再次从 100 开始。
nv = len(training_set[0])
nh = 100
batch_size = 100
rbm = RBM(nv, nh)
2.模特培训
祝贺你通过了第一部分,因为这是最难的部分👍👍。现在让我们来训练 RBM 模型。
我们首先将 nb_epoch 设置为 10。对于每个时期,所有观测值将进入网络,并在每批数据通过网络后更新权重。最后,我们得到最终的可见节点,这些节点对最初没有评级的电影有了新的评级。在每一批中,我们将进行 k 步对比散度来预测随机行走 k 步后的可见节点。因此,我们将有 3 个循环,一个用于历元迭代,一个用于批量迭代,最后一个用于对比发散。
对于损失函数,我们将测量训练集中预测评级和真实评级之间的差异。有几个选项,包括 RMSE,它是预测收视率和实际收视率之间的平方差的均值的根,以及预测收视率和实际收视率之间的绝对差。我们在这里取一个绝对的差值。
在批处理循环中,我们有输入向量 vk ,它将通过对比散度进行更新,并在随机行走 k 步后作为 Gibbs 采样的输出。但开始时, vk 是一批用户所有评分的输入批次。 v0 是将与预测值进行比较的目标值,预测值是该批用户已经评定的等级。 ph 0 是给定可见节点 v0 时隐藏节点的初始概率。
在对比发散循环中,我们将进行吉布斯采样。基本上,它包括建立 Gibbs 链,这是从可见节点到隐藏节点的几次往返。在每一轮中,可见节点被更新以获得良好的预测。从可见节点 vk 开始,我们用伯努利采样法对隐藏节点进行采样。在 10 次随机行走结束时,我们得到第 10 个采样的可见节点。请注意,我们不会对 RBM 进行等级为-1 的培训,这些等级在开始时并不作为真实等级。
利用 v0 、 vk、ph0、phk ,我们可以应用训练函数来更新权重和偏差。最终,与电影特征最相关的概率将获得最大的权重,从而导致正确的预测。在每一批结束时,我们记录训练损失。同样,我们只记录已经存在的评级损失。
nb_epoch = 10
for epoch in range(1, nb_epoch+1):
train_loss = 0
s = 0.
for id_user in range(0, nb_users — batch_size, 100):
vk = training_set[id_user: id_user+batch_size]
v0 = training_set[id_user: id_user+batch_size]
ph0, = rbm.sample_h(v0)
for k in range(10):
_, hk = rbm.sample_h(vk)
_, vk = rbm.sample_v(hk)
vk[v0<0] = v0[v0<0]
phk, _ = rbm.sample_h(vk)
rbm.train(v0, vk, ph0, phk)
train_loss += torch.mean(torch.abs(v0[v0>0]-vk[v0>0]))
s += 1
print(‘epoch: ‘+str(epoch)+’ loss: ‘+str(train_loss/s))
经过 10 个历元迭代的训练,我们得到了一个 0.15 的损失。相当准确的✌✌.
3.模型测试
与训练循环相比,我们去除了历元迭代和批量迭代。我们将通过 RBM 循环每个观测值,并逐个进行预测,累积每次预测的损失。
注意下面,我们使用训练集作为输入来激活 RBM,同样的训练集用于训练 RBM。但不同的是,在测试阶段,我们没有删除用户最初没有评级的评级,因为这些是用于测试目的的模型的未知输入。还要注意,我们没有像在训练阶段那样进行 10 步随机行走。这是因为对于获得最佳预测的测试,1 步优于 10 次迭代。
test_loss = 0
s = 0.
for id_user in range(0, nb_users):
v_input = training_set[id_user: id_user+1]
v_target = test_set[id_user: id_user+1]
if len(v_target(v_target>=0)):
_, h = rbm.sample_h(v_input)
_, v_input = rbm.sample_v(h)
test_loss += torch.mean(torch.abs(v_target[v_target>0]-
v_input[v_target>0]))
s += 1
print(‘test loss: ‘ +str(test_loss/s))
太好了。我们获得的损失为 0.16 ,接近训练损失,表明轻微过度拟合。
仅此而已。希望这能让你了解如何创建一个 RBM 作为推荐系统。如果需要源代码,请访问我的 Github 页面🤞🤞。
作为电影评论推荐系统的受限玻尔兹曼机器创造(上)
关于受限波尔兹曼机器的直观介绍以及使用电影分级数据进行模型训练的详细数据处理步骤
通过链接改编自 unsplash 的 Img
这是如何建立一个受限波尔兹曼机器(RBM)作为推荐系统的第一部分。这里重点是数据处理。
您将学习如何将原始电影分级数据转换为准备训练 RBM 模型的数据。它分为三个部分。
- RBM 简介
- 问题陈述
- 数据处理
现在让我们开始旅程🏃♂️🏃♀️.
- RBM 简介
首先,让我们从玻尔兹曼机(BM)说起。BM 是一种无监督的神经网络。如图 1 所示,BM 有三个明显的特征。
- 没有输出图层
- 连接之间没有方向
- 每个神经元彼此紧密相连,甚至在输入节点(可见节点)之间也是如此
图 1 玻尔兹曼机器图(作者创建的 Img)
为什么 BM 这么特别?从根本上说,BM 并不期待投入。相反,它自己生成模型的状态或值。因此,BM 是一个生成性模型,而不是确定性模型。BM 不区分可见节点和隐藏节点。可见节点只是我们度量值的地方。
然而,BM 有一个问题。随着节点数量的增加,连接的数量呈指数增长,这使得不可能计算完整的 BM。因此,建议采用 RBM,如图 2 所示。
图 2 受限玻尔兹曼机器图(作者创建的 Img)
与完全 BM 相比,RBM 不允许隐藏节点之间的连接和可见节点之间的连接。这是唯一的区别📣📣。
通过训练过程,我们向 RBM 输入大量数据,RBM 学会了如何分配每个隐藏节点来表示电影的特征,如流派、演员、导演等。换句话说,调整每个节点的权重,使得隐藏节点更好地反映特征。
具体来说,RBM 将接受从可见节点到隐藏节点的输入。它尝试基于隐藏节点值来重构输入值。如果重构值不正确,则调整权重,RBM 再次重构输入。最后,RBM 被训练成最能代表生成所有数据的系统。好处是所有权重都经过优化,RBM 可以了解系统的正常和异常情况。
2.问题陈述
给出大量的电影分级数据来建立 RBM。任务是预测一个用户喜欢一部电影是 1,不喜欢是 0。
3.数据处理
数据 MovieLens 100K 电影收视率来自群镜头研究这里。简单看一下图 3 中的数据, Movies 数据包含电影的名称和类型, Ratings 数据包含用户 ID、电影 ID、从 0 到 5 的用户评级和时间戳, User 数据包含用户 ID、性别、年龄、工作代码和邮政编码。
图 3 源数据集片段
3.1 导入数据
数据集包含 80,000 行训练集和 20,000 行测试集。让我们读一读。具体来说,
training_set = pd.read_csv(‘ml-100k/u1.base’, delimiter = ‘\t’)
training_set = np.array(training_set, dtype = ‘int’)test_set = pd.read_csv(‘ml-100k/u1.test’, delimiter = ‘\t’)
test_set = np.array(test_set, dtype = ‘int’)
**注意,我们将 Dataframe 转换为 Numpy 数组,因为我们将使用 Pytorch 张量,它需要数组作为输入。**图 4 显示了训练/测试集,包括用户 ID、电影 ID、评级和时间戳(对于模型训练是不可逆的)。
图 4 训练和测试数据集片段
3.2 数据结构创建
**为了准备训练/测试数据,我们需要以数组格式创建训练/测试集,每行代表一个用户,行中的每个单元格代表每部电影的评级。**这是 RBM 的预期输入。
为此,我们需要将用户总数作为行号,将电影总数作为列号。
nb_users = int(max(max(training_set[:, 0]), max(test_set[:, 0])))
nb_movies = int(max(max(training_set[:, 1]), max(test_set[:, 1])))
我们创建了一个数据转换函数,它返回一个列表列表。每个子列表代表一个用户对所有电影的评级。如果用户没有对电影进行分级,则将分级初始化为 0。
def convert(data):
new_data = []
for id_users in range(1, nb_users + 1):
id_movies = data[:,1][data[:,0] == id_users]
id_ratings = data[:,2][data[:,0] == id_users]
ratings = np.zeros(nb_movies)
ratings[id_movies — 1] = id_ratings
new_data.append(list(ratings))
return new_data
通过上面的转换,我们转换了训练集和测试集。
training_set = convert(training_set)
test_set = convert(test_set)
图 5 显示了最终的训练集。同样,每行包含用户对所有电影的评级。
图 5 最终训练数据集的片段
最后,我们将 list 类型的列表转换为张量**,因为我们将使用 Pytorch 构建 RBM。**
training_set = torch.FloatTensor(training_set)
test_set = torch.FloatTensor(test_set)
3.3 二进制数据转换
我们的任务是预测用户是否喜欢电影为 1,不喜欢为 0。RBM 将采用用户的电影评级,并试图预测未被用户评级的电影。因为要预测的评级是根据原始输入计算的,所以我们必须以一致的方式保持输入评级和预测评级。
具体来说,先前设置为 0 的评级被重置为-1,给出 1 或 2 的电影被设置为 0(不喜欢),评级超过 3 的电影被设置为 1(喜欢)。
training_set[training_set == 0] = -1
training_set[training_set == 1] = 0
training_set[training_set == 2] = 0
training_set[training_set >= 3] = 1test_set[test_set == 0] = -1
test_set[test_set == 1] = 0
test_set[test_set == 2] = 0
test_set[test_set >= 3] = 1
太好了。我们成功地将原始评级数据转换为二进制评级数据,准备好训练模型。
太好了!这就是第 1 部分的全部内容。接下来的 篇 将一步步走完如何打造一个 RBM。如果需要源代码,请访问我的Github页面🤞🤞。