了解和预测新加坡转售 HDB 公寓价格
一个简短的案例研究,涉及数据收集,探索,可视化和机器学习,以了解在新加坡转售 HDB 单位价格
简介
超过 80%的新加坡居民居住在住房发展局(HDB)的公寓里,这些公寓是新加坡政府于 1960 年设计的,旨在解决城市综合住房的需求。由于新加坡土地稀缺,HDB 的公寓通常建在高层建筑中,以有效利用空间。对大多数新加坡人来说,结婚后就能拥有一套 HDB 公寓。HDB 公寓的一个独特之处是与之相关的 99 年租约:公寓的租约期限为 99 年,从公寓完工开始计算,到期后土地归还政府。这意味着在新加坡购买 HDB 公寓并不意味着拥有传统意义上的公寓,而是在剩余租约的特定期限内从政府手中租赁该公寓。
尽管如此,这并不意味着新加坡人必须在他们拥有的 HDB 公寓里度过余生。HDB 的公寓可以出售(尽管如果公寓是全新购买的话,要在 5 年后),这就是这个迷你项目的核心——HDB 公寓转售市场。作为一个年轻的成年人,也许很快就会想拥有一套 HDB 公寓,了解 HDB 转售公寓背后的价格并预测它们似乎是一个有趣的工作项目。
特征工程
原始数据集从 https://data.gov.sg/dataset/resale-flat-prices 的获得。该数据集提供了 2017 年至 2020 年 HDB 所有转售公寓交易的信息。
从 data.gov.sg 提取的原始数据的数据框架
该数据集中的显著特征如下:
i) 城镇:关联 HDB 公寓的城镇
ii) 公寓 _ 类型:关联 HDB 公寓的公寓类型。在新加坡,有 1 室公寓到 5 室公寓,还有比 5 室公寓稍大的行政公寓。(剩下的公寓类型:多代同堂的公寓,少之又少)。
iii) block :关联 HDB 公寓的 block
iv)street:关联 HDB 公寓的 street
v)storey _ range:关联 HDB 公寓的楼层范围。在该数据集中,给定的楼层范围在 3 的范围内(例如,10 到 12,这意味着公寓基于第 10 到 12 层)。
vi) 楼层 _ 面积 _ 平方米:关联 HDB 单位的建筑面积平方米
vii) 剩余 _ 租约:关联 HDB 单位的剩余租约年月
viii) 转售 _ 价格:关联 HDB 单位的转售价格
在假设可能影响 HDB 转售公寓价格的因素时,我想到了三个突出的因素。到最近的捷运/LRT 的距离——这是 HDB 公寓与铁路网连接程度的一个指标。
2。距离最近的购物中心的距离——新加坡的购物中心是一切(购物、食品、杂货、服务)的一站式目的地。
3。到最近的小学的距离 —附近有一所小学对父母来说是非常方便的,因为他们的孩子可以选择放学后步行回家,而不是选择其他交通安排。
捷运/轻轨、购物中心和小学的详细列表是从维基百科获得的。为了获得以下特征,使用 Onemaps API 获得了所有独特的 HDB 转售街区、MRT/lrt、购物中心和小学的纬度和经度。
For-loops 用于计算每个独特的 HDB 转售街区与所有 MRT/lrt、购物中心和小学之间的距离(使用哈弗森公式)。最近的捷运/LRT、购物中心和小学,以及它们到每个独特 HDB 街区的 HDB 公寓的相关距离(以 km 为单位)存储在数据帧中,如下所示。
显示每个独特的转售 HDB 区块及其相关的最近设施的数据框架。
需要注意的是,在 8836 个唯一 HDB 块中,405 个搜索地址返回了多个邮政编码差异很大的结果。结果,这 405 个地址被丢弃,因为它的纬度和经度无法从 Onemaps API 中准确识别。
接下来,变量 flat_type 、 storey_range 和 remaining_lease 被整数编码。此外,使用https://mrt.sg/fare,变量 time_to_raffles_place 通过从最近的 MRT/LRT 到 Raffles Place MRT 的时间创建,将其添加到从 HDB 到最近的 MRT/LRT 的步行时间(假设步行速度为 15 分钟/公里)。这一点意义重大,因为莱佛士广场地铁站是新加坡中央商务区的心脏,这里有许多新加坡劳动力的办公室。
最后,两个分类变量, **MRT?和到期遗产?**之所以被添加,是因为人们认为,与轻轨相比,更靠近轻轨的公寓可能存在价格溢价,到目前为止,其他列对此未作解释。同样,相对于非成熟屋而言,位于成熟屋的单位可能有溢价。
将 8431 个独特的 HDB 块与包含 77,895 个数据点的初始数据集合并。产生 NAs 的行(从先前删除的 405 行中)被删除,产生如下所示的最终数据集。
数据清理和特征工程后的最终数据集
最后,使用 describe()函数,可以对数据进行感觉检查,并找出特征工程中是否有错误。例如,到购物中心的最小距离输出为 0.000 公里。经过调查,发现出现这种情况是因为购物中心位于德惠里 137 号楼的正下方。
该图说明了为什么到购物中心的最小距离为 0.000 公里
经过几次类似的调查,发现工程特征的极限是令人满意的。
探索性数据分析和数据可视化
使用 describe()函数,观察到的汇总统计信息如下:
- 转售价格——公寓价格从 14 万美元(Toh Payoh)到 123.2 万美元(Pinnacle@Duxton)不等,平均价格为 44 万美元
- 楼层面积——公寓的面积从 31 平方米到 249 平方米不等,平均面积为 98 平方米
- 租赁——公寓的剩余租赁期从 45 年到 98 年不等,平均为 75 年
- 楼层-整数编码的楼层范围从 1 到 17(从 1 楼到 51 楼),平均值为 3(7 楼到 9 楼)
- 城镇——42%的转售公寓属于成熟地产;剩余的 58%属于未到期的遗产
- 最近的购物中心——从公寓到最近的购物中心的距离在 0.00 公里到 3.21 公里之间,平均值为 0.66 公里
- 最近的小学——从公寓到最近的小学的距离在 0.05 公里到 3.31 公里之间,平均为 0.40 公里
- 最近的地铁站/LRT——公寓到最近的火车站的距离在 0.002 公里到 3.50 公里之间,平均为 0.66 公里。此外,80%的转售公寓比 LRT 更靠近地铁站。
- 到莱佛士广场的旅行时间——从公寓到莱佛士广场的旅行时间在 11 分钟到 1 小时 36 分钟之间,平均 45 分钟
接下来,使用相关矩阵来理解每个预测因子之间的相关性。
预测值之间的相关矩阵
可以看出,转售价格的最大预测因素是楼层面积平方米,以及户型编码。还可以注意到,这两个相同的预测值具有 0.93 的高成对相关性,这是可以预期的,因为公寓类型越大(即房间数量越多),公寓的预期地板面积就越大。
转售价格相关条形图
观察相关性的符号,注意到符号与最初的假设一致:也就是说,与预期一致的是,距离预测值以及到莱佛士广场的时间与转售价格负相关(因为你离某些设施越远,公寓就越不值钱)。
还构建了地理价格热图,以了解整个新加坡转售公寓的位置和价格分布。
转售单位的地理价格热图
图右侧的色标有助于理解热图。可以观察到,黄色的平面倾向于位于中心区域附近。尽管如此,可以观察到东北部地区以及 Pasir Ris 的公寓比其他一些街区的颜色更浅。也许这是因为这些社区的 1-2 室公寓较少,价格最便宜。
箱线图也被用来了解公寓类型和转售价格之间的关系。
相对于转售价格的扁平型箱线图
可以看出,有相当多的异常值,尤其是在 3 室、4 室和 5 室公寓中。经过调查,发现其中一些 3 室公寓实际上是 6 室公寓,即两个相邻的 3 室公寓合并成一个新的单一单元。虽然 flat_type 仍然将这些公寓反映为三居室公寓,但 floor_area_sqm 反映了新合并单元增加的建筑面积。
据认为,其他预测因素可以帮助解释支付额外保费的原因,这些额外保费与从该箱线图中观察到的异常值有关。
利用机器学习预测 HDB 二手房的价格
设置训练&测试集
数据集有 74459 行。前 59649 行数据(~80%)用作训练集,其余 14810 行数据(~20%)用作测试集。train_test_split 不用于随机分配训练和测试数据,因为数据集遵循时间顺序,并且使用过去的数据来预测未来的数据更有意义。
包含在 x_train 中的特征是上述相关矩阵中的所有特征,不包括 flat_type_coded ,因为它与 floor_area_sqm 高度相关。
实施&评估机器学习模型 三种不同的机器学习回归模型被用于预测 HDB 公寓的转售价格:线性回归、决策树回归以及随机森林回归。
用于评估这些模型的三个标准是 r 平方(r2)、均方误差(MSE)以及均方对数误差(MSLE),结果如下所示。一篇非常有用的文章展示了 MSE 和 MSLE 之间的差异,可以在这里找到。
机器学习模型的评估标准
可以看出,随机森林回归模型表现最好,这是所有三个指标都同意的。它具有最高的 r2,以及最低的 MSE 和 MSLE 值。可以理解的是,由于它采用了使用决策树模型作为其基础模型的集成学习,因此预期它比决策树回归表现得更好。
下图显示了基于所选随机森林回归模型的要素重要性。可以看出,该模型定义的三个最重要的特征是其建筑面积、前往莱佛士广场的时间以及其剩余的租约。
基于随机森林回归模型的特征重要性
了解随机森林回归模型对城镇的影响 计算了 HDB 公寓实际转售价格与随机森林回归模型预测价格之间的差异。正的差异可能意味着公寓价格过高,而相反的差异可能意味着公寓价格过低(表明购买很划算)。
使用 groupby 和 pivot_table 函数,可以了解 town 和 flat_type 的预测值与实际值的平均差异。
实际值的平均差异-按城镇和平面类型预测
一室多代的大量 0 背后的原因是因为在测试集中没有这样的公寓可用于预测;这些公寓在 HDB 所有公寓中只占很小的比例。
通过观察,我们可以看到一些城镇,如 Kallang/Whompoa 和 Pasir Ris,在不同的公寓类型中显示出持续的负平均差异,这可能意味着这些城镇的房地产被低估了。
假设我现在正在新加坡寻找一套四居室公寓:下面的条形图描绘了新加坡各城镇四居室转售公寓的实际价格和预测价格之间的平均差异。
按城镇划分的 4 室转售 HDB 公寓的实际预测差异
从这个柱状图来看,Tampines、Pasir Ris、Jurong East 和 Ang Mo Kio 的 4 室公寓似乎很划算,我可能会考虑购买其他城镇的 4 室公寓。
局限性和结论
计算距离这可能不是最准确的函数,因为在某些情况下,到某个设施点的位移可能很短,但由于障碍物(例如中间的高速公路),到达该处的实际行程时间可能很长。这可以通过使用付费 API(例如 Google Maps API)来了解两个位置之间的行程时间,而不是简单地依赖位移来改善。
未说明的预测因子
虽然这个项目试图整合各种预测因子,但可以理解的是,它并不是一个详尽的列表。影响房价的不仅仅是这个项目中的预测因素。例如,转售公寓是走廊公寓(私密性较低)还是角落公寓(私密性较高)也会产生价格差异。靠近捷运/LRT,虽然是与公共交通可达性相关的一个因素,但不是公共交通可达性的决定性因素,因为公共汽车服务也存在,这在模型中没有说明。此外,随着新加坡的不断升级,价格也可能受到公寓附近未来发展的影响(例如,一条新的捷运线,或政府为提高房地产成熟度而进行的周边基础设施建设)。
结论
本文以一个问题陈述开始,并从特征工程着手。然后,它转移到数据探索和可视化。然后,机器学习被用来预测转售价格,以及它对寻求购买转售 HDB 公寓的新加坡人的影响。最后,本文以一些局限性结束。我希望这是一篇有益的阅读,它丰富了您对如何使用数据来解决问题的理解(这是我关于介质的第一篇文章)!
感谢李·任杰、李·肖辉和塞缪尔·蔡对本项目的投入和贡献。
理解和使用 k-最近邻(kNN)进行数字分类
什么是分类?
在机器学习和统计学中,分类是使用新观察的特征/变量来发现新观察的类别的任务。这种分类是使用基于训练数据训练的分类器来完成的。训练数据是许多观察值的集合,这些观察值用适当的类名正确标记。监督学习涉及用正确标记的观察值进行训练,因此分类被认为是监督学习。
分类示例:
- 使用电子邮件的文字、图像和附件等电子邮件特征将电子邮件标记为“垃圾邮件”或非垃圾邮件。
- 使用患者的特征,如性别、年龄、体重、血压和观察到的症状,将患者标记为“健康”或“患病”。
有许多模型可以用于机器学习中的分类任务,但我们将使用 k 近邻,因为它使用简单但功能强大。
k 近邻:
这是一种基于新数据点与其他数据点组的接近程度对其进行分类的算法。来自一个组的新数据点的接近度越高,它被分类到该组的可能性就越高。
数据点之间的距离通过距离度量来测量,如欧几里德距离、曼哈顿距离、闵可夫斯基距离、马哈拉诺比斯距离、切向距离、余弦距离等等。
对于具有 n 个特征的数据点 X 和 Y:
闵可夫斯基距离公式是:
闵可夫斯基距离当 p = 1 时是曼哈顿距离,当 p =2 时是欧几里德距离,当 p = ∞时是切比雪夫距离。闵可夫斯基距离是欧几里得距离的推广形式。
使用距离度量,我们创建新数据点的 n 个最近邻居的邻域。
为了获得新数据点的类别,我们查看在所创建的邻域中具有更多数据点的类别组,以及与邻域中的其他组相比更接近我们的新数据点的类别组。基于这两个因素,我们确定新数据点的类别。
让我们通过一个例子来更好地理解这一点。
举例:
考虑将顾客分为快乐和不快乐两类的任务。您可能希望事先知道哪些客户不满意,以便通过提供折扣来防止他们转向竞争对手的服务。
在图中,红色代表不满意的客户,他们已经转向另一家竞争对手,而蓝色代表对我们满意的客户,他们仍在使用我们的服务。
现在,我们有一个用绿色圆圈表示的新客户,我们想知道他对我们使用 kNN 算法的服务是满意还是不满意。
蓝色:快乐的顾客,红色:悲伤的顾客,绿色:新顾客
如果我们使用 3 个邻居,并且我们对每个数据点使用相等的权重,那么我们在邻居中有 2 个红色点和 1 个蓝色点,绿色点,即新的数据点被分类为红色。
具有统一权重的 3-最近邻示例
如果我们使用 5 个邻居,并且我们对每个数据点使用相等的权重,那么我们在邻居中有 3 个蓝点和 2 个红点,并且绿点被分类为蓝色。
具有统一权重的 3-最近邻示例
如果我们使用 5 个邻居,并且我们使用欧几里德距离来计算每个数据点的权重,那么我们在邻居中有 3 个蓝点和 2 个红点。数据点之间的欧几里德距离用线表示。
使用欧几里德距离度量的权重的 5-最近邻示例
为了使用欧几里得距离计算权重,我们将取距离的倒数,以便更近的点具有更高的权重。对于每个类,我们将计算权重的总和,具有较高总和权重的类成为预测类。
红色等级的权重总和:
1/3 + 1/4 = 0.5833
蓝色等级的权重总和:
1/5 + 1/8 + 1/6 = 0.4912
因为红色类别具有较高的权重,所以我们对新数据点的预测类别是红色类别。
使用 Scikit 的 kNN-learn:
kNN 超参数:
在机器学习中,在我们可以使用任何算法之前,我们需要为该模型选择超参数的值。在 kNN 的情况下,重要的超参数是:
- 邻居的数量。
weights
:如果设置为uniform
,每个邻域中的所有点对预测类的影响相等,即预测类是邻域中点数最高的类。如果设置为distance
,较近的邻居将比较远的邻居具有更大的影响,即具有更多靠近新数据点的点的类成为预测类,为此,我们在计算权重时取距离的倒数,以便较近的点具有更高的权重。metric
:当weights
设置为distance
时使用的距离度量。默认值为minkowski
,这是计算两个数据点之间距离的一种方法。我们可以更改默认值以使用其他距离度量。p
:是minkowski
度量的功率参数。如果 p=1,那么距离度量是manhattan_distance
。如果 p=2,那么距离度量是euclidean_distance
。如果愿意,我们可以试验更高的 p 值。
# kNN hyper-parametrs
sklearn.neighbors.KNeighborsClassifier(n_neighbors, weights, metric, p)
通过交叉验证尝试不同的超参数值可以帮助您为最终模型选择正确的超参数。
kNN 分类器:
我们将建立一个分类器,将手写数字从 0 到 9 分类。我们将使用的数据来自 MNIST 数据库,这是一组 60,000 个 28×28 像素的黑白图像,包含 0 到 9 之间的手写数字。
导入库:
# To load MNIST image data
from sklearn.datasets import load_digits# kNN Classifier
from sklearn.neighbors import KNeighborsClassifier# Confusion matrix to check model performance
from sklearn.metrics import confusion_matrix# To split data into training and testing set
from sklearn.model_selection import train_test_split# For plotting digit
import matplotlib.pyplot as plt
正在加载数字的 MNIST 数据:
digits = load_digits()
转换数据以用于 kNN 分类器:
# Number of images
n_samples = len(digits.images)# Changing shape from 28x28 pixel values to a sequence of values
X = digits.images.reshape((n_samples, -1))# Getting the already known targets for each image
y = digits.target
创建我们的培训和测试集:
# Splitting data to train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
创建和培训模型:
# Creating model
clf = KNeighborsClassifier(n_neighbors=3)# Training model
clf.fit(X_train, y_train)
获得测试数据的预测:
# Predictions for test data
predicted = clf.predict(X_test)
使用混淆矩阵比较实际目标值和预测目标值:
# Print confusion matrix
confusion_matrix(y_test, predicted)
分类数字混淆矩阵
在矩阵中,行代表实际目标值,其中第一行代表 0 标签,第二行代表 1 标签,依此类推。同样,列表示预测,其中第一列表示 0 标签,第二列表示 1 标签,依此类推。
以黄色突出显示的矩阵对角线上的值是预测正确的值。
考虑在第 4 列第 9 行用蓝色突出显示的值。这是一个错误。我们的模型将3 误分类为 8。
总的来说,我们的模型在将数字分类为误分类方面做得很好,即除对角线以外的值大多为零或小于 2。
查看前 10 幅图像和预测:
# Zip image with prediction
image_with_prediction = list(zip(digits.images, clf.predict(X)))# for first 10 images
for pos, (image, prediction) in enumerate(image_with_prediction[:10]):
plt.subplot(3, 4, pos+1) # Create 3x4 grid
plt.axis('off') # no axis
plt.imshow(image, cmap=plt.cm.gray_r) # show image in gray scale
plt.title("Prediction: %i" % prediction) # set title to predicted value
plt.show() # show plot
所有的预测看起来都不错,除了第 6 张看起来更像 5,但我们的模型认为它是 9。
结论:
当在你自己的问题上使用 kNN 时,确保每个特征的距离根据该特征的重要性进行缩放。如果出现房价问题,我们的特征年龄和房价将具有非常不同的比例,您必须缩小房价特征的比例以提高模型性能。
如果您的数据具有大量维度,则您可能希望通过使用要素缩减和要素工程技术来缩减要素,因为维度越高,数据的准确性越低。
kNN 在 MNIST 数据集上工作得很好,因为它是一个受控的数据集,即数字的位置在所有图像上都是一致的。此外,所有图像的像素值具有相似的颜色梯度。当处理具有大量空间信息的图像的分类问题时,即图像中物体位置的变化和颜色梯度的变化,您可能希望使用专门为此类任务构建的卷积神经网络。
kNN 也可用作回归算法,即,代替预测离散类,它也可用于预测连续数字,如房价。
希望这有助于你理解 kNN。
感谢阅读。
基于高斯混合模型的 Python 异常检测。
这里我们将通过一个例子来学习如何用高斯混合模型实现异常检测。
首先,我们需要理解数据集中什么算异常。异常可以被视为数据集中罕见或不寻常的观察结果。例如,在信用卡交易数据集中,欺诈交易是异常的,因为与大型数据集中的正常交易相比,欺诈案例的数量非常少。
在异常检测中,我们试图识别在统计上不同于其余观察的观察。
今天我们来看看高斯混合模型,这是一种无监督聚类方法。在这种方法中,与 K-Means 不同,我们对数据进行“K”高斯拟合。然后,我们找到高斯分布参数,如每个聚类的均值和方差以及聚类的权重。最后,对于每个数据点,我们计算属于每个聚类的概率。
在数学上,我们可以用如下两种方式编写高斯模型:
1]单变量情况:一维模型
单变量高斯模型
和
其中 μk =平均值&T2σk=第 k 个分量的方差。 ϕk =聚类‘k’的权重。
2]多元案例:多维模型
其中μk= mean&σk=第 k 个分量的协方差矩阵。 ϕk =聚类‘k’的权重。
总之,该方程描述了 K 高斯分布的加权平均值。
该算法在这 K 个集群上训练。因此,给定一个新的数据点,算法找到它与每个分布的距离&从而得到该点属于每个聚类的概率。因此,如果对于特定的聚类,如果概率非常低,则表明数据点是异常的。
所以让我们从实际实现开始吧。
首先,我们将导入所有必要的模块并创建一个数据集。
Import.py
这里我们使用来自 scikit-learn 的 make_blobs 来生成用于聚类的高斯 blob。可以在此处找到详细参数的完整文档:
[## sk learn . datasets . make _ blobs-sci kit-learn 0.22 文档
sci kit-learn:Python 中的机器学习
scikit-learn.org](http://scikit-learn.org/stable/modules/generated/sklearn.datasets.make_blobs.html)
您得到的输出是一个数据集,其中有些点是主分布的异常值。
在上面的数据集中,我们可以用眼睛发现异常值,但我们应该如何让机器做同样的事情呢?
这就是高斯估计器的用处。由于我们的数据集只有一个中心,我们将使用单个高斯。如上所述,我们将使用第一个等式来计算数据集的均值和方差。为了做到这一点,我定义了函数,它返回输入分布的均值和方差。
均值 _ 方差. py
在上面的函数中输入我们的数据集后,
现在我们有了基本的参数,我们将计算每个点,由我们的分布产生的概率。因此,属于同一聚类的点将具有高概率&离群点将具有低概率。
为此,我们有一个函数。我用的代码是标准代码。这很容易理解。我们使用 Numpy 线性代数模块来实现上面提到的 N( x ∣ μi , σi ) 方程。
高斯. py
为了可视化这些概率,我们可以用它们的概率绘制相同的数据集,如下所示。
plot_prob.py
我们可以看到,同一个集群中的点有很高的概率&当我们向外走时,即离群值,概率趋于零。
现在,我们可以选择概率的阈值,将它们标记为异常值。这里我选择它为 0.02 &再次绘制数据。该值将根据分布和随机状态而变化。
mark_outliers.py
太好了!我们的模型在单个集群上表现得相当好。但是,我们可以对多个集群使用相同的策略吗?只有一个方法可以知道:)
这里,我使用了与上面生成单个集群相同的代码。唯一的区别是,这里不是 1 个集群,而是生成 5 个。
mixture_data.py
现在,让我们使用与之前相同的方法,看看它的性能如何。代码将是类似的。尝试不同的阈值并观察。这里我将使用一个固定值。
plot_mixture.py
我们可以看到,我们的模型在多个集群上表现糟糕。它没有认识到异常值。这就是为什么现在我们将转移到高斯混合。这里我们使用了**sk learn . mixture . Gaussian mixture .**你可以在这里看到文档。
[## sk learn . mixture . Gaussian mixture-sci kit-learn 0 . 22 . 1 文档
class sk learn . mixture . Gaussian mixture(n _ components = 1,协方差 _type='full ',tol=0.001,reg_covar=1e-06…
scikit-learn.org](https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture)
高斯 _ 混合物. py
如果您遵循文档,您将看到 predict_proba() 方法。我们将使用相同的方法来找出每个点属于五个聚类中任何一个的概率。
混合物 _ 预测 _ 概率
我们可以看到,该模型将点分类到 K 个聚类 & 之一,这有助于我们识别离群点。我们可以通过找到任何集群都不希望自己拥有的点来做到这一点。
此公式返回数据点由我们适合的任何一个高斯随机产生的概率。因此,我们想要从上面的公式中过滤掉任何具有低概率的数据点。
如果你觉得这篇文章有用,请为它鼓掌,它会有很大的帮助!!
关注我的 中的 获取更多此类教程&文章。
如果您想联系,请在LinkedInT3 上添加我。
如果您有任何疑问或发现代码/概念中的任何错误,请随时在评论中写下。这是我的第一个博客,试图与世界分享我在数据科学领域所知道的一切!
了解 Apache 拼花地板
数据仓库|数据湖|拼花地板
理解为什么拼花地板应该用于仓库/湖边储物
Apache Parquet 是一种列存储格式,适用于任何项目[…],无论选择的是数据处理框架、数据模型还是编程语言。
——https://parquet.apache.org/
这个描述很好地总结了这种格式。这篇文章将讨论这种格式的特性,以及为什么它有利于数据仓库或 lake 中的分析数据查询。
数据一行接一行地存储,每行包含所有列/字段
https://www.ellicium.com/parquet-file-format-structure/
第一个特征是格式的列存储特性。这仅仅意味着数据是按列而不是按行编码和存储的。该模式允许分析查询为所有行选择列的子集。Parquet 将列存储为块,还可以在每个块中进一步拆分文件。这允许将磁盘 i/o 操作限制到最低限度。
要提到的第二个特性是数据模式和类型。Parquet 是一种二进制格式,允许编码数据类型。与某些格式不同,可以用特定类型的布尔、数字(int32、int64、int96、float、double)和字节数组来存储数据。这使得客户端在读取和写入 parquet 格式的数据时,可以轻松高效地序列化和反序列化数据。
除了数据类型之外,Parquet 规范还存储元数据,这些元数据在三个层次上记录模式;文件、块(列)和页眉。每个文件的页脚包含文件元数据。这记录了以下内容:
- 版本(拼花格式)
- 数据模式
- 列元数据(类型、值的数量、位置、编码)
- 行组数
- 附加键值对
拼花元数据https://parquet.apache.org/documentation/latest/
元数据总是写在文件的页脚,因为这允许单遍写入。简单地说,首先写入数据,然后知道写入数据的所有位置、大小和编码,就可以准确地写入元数据。许多格式将它们的元数据写在头中。但是,这需要多次传递,因为数据是在标题之后写入的。Parquet 使得读取元数据和数据本身非常有效。另一个优点是文件可以以任何期望的大小分割。例如,如果您将它与 Spark 或 Amazon Redshift 一起使用,您可以指定写入 1GB 大小的文件以提高加载效率。
单独的元数据文件是规范的一部分,允许引用多个拼花文件。因此数据集可以任意大小,以适合单个文件或多个文件。当在数据湖中处理千兆字节或兆兆字节的数据时,这尤其有利。今天的大多数应用程序和仓库都允许并行读取。多个文件意味着可以并行读取数据以加快执行速度。
将模式和元数据与可拆分文件相结合,使拼花成为一种灵活的格式。该模式可以随着时间的推移而发展。一个例子是,如果一个字段/列被添加到数据集,这只是在新的块和文件中编码。元数据文件被更新以记录只有某些文件和行组包括新块。因此,模式演化和合并很容易发生。如果文件不包含新字段,它们只会导致该字段不存在。如果读取多个文件,其中一些文件包含字段,而其他文件不包含字段,null
值用于表示缺失的列值。
最后,该格式本身支持文件内的压缩。这意味着当数据按列为中低基数时,可以有效地压缩数据。当数据基数较高时,可以在不同的文件中对这些列分别执行压缩。这允许不同字段和数据类型的编码和压缩的可变性。当以高吞吐量高效读取数据时,这是另一个优势。
总的来说,Parquet 以列格式存储数据以及模式和类型化数据的特性允许高效地用于分析目的。它通过压缩、编码和可拆分格式为并行和高吞吐量读取提供了更多好处。元数据支持所有这些,同时提供存储和模式演化的灵活性。Parquet 已经成为分析数据湖和数据仓库的事实上的格式。许多工具和框架都支持这一点,如 Hadoop、Spark、AWS Redshift 和 Databricks 平台。Databricks 还为 Parquet 提供了一种新的风格,允许数据版本化和使用 Delta Lake 格式进行“时间旅行”。(预告:可能会有即将发布的关于 Delta 格式的帖子。)
了解 ARIMA(时间序列建模)
杰克·希尔斯在 Unsplash 上的照片
利用过去来预测未来
那句老马克·吐温的名言是什么来着?“历史不会重演,但它经常会重复。”
我喜欢分析时间序列。所以当我说我认为马克·吐温是对的时,我可能是有偏见的。我们绝对应该以怀疑的态度对待所有的预测——未来本质上是不确定的,无论多少计算或数据都无法改变这一事实。但是通过观察和分析历史趋势,我们至少可以解开一小部分的不确定性。
ARIMA 模型是线性回归模型的一个子集,它试图使用目标变量的过去观察值来预测其未来值。ARIMA 模型的一个关键方面是,在其基本形式中,它们不考虑外生变量。更确切地说,预测纯粹是用目标变量的过去值(或从那些过去值精心制作的特征)做出的。
ARIMA 代表自回归综合移动平均线。让我们浏览一下 ARIMA 模型的每一部分,以便充分理解它。
AR:自回归
这是最简单的部分。**自回归意味着我们对目标变量自身的过去值进行回归。**也就是说,我们使用目标变量的滞后值作为 X 变量:
Y = B0 + B1*Y_lag1 + B2*Y_lag2 + ... + B***n****Y_lag***n***
这很简单。这个等式说的是 Y 的当前观察值是它过去的 n 值的某个线性函数(其中 n 是我们选择的一个参数;以及 B0、B1 等。是我们在训练模型时适合的回归 betas)。前面的等式通常被称为 AR( n )模型,其中 n 表示滞后的数量。通过稍微改变符号,我们可以很容易地预测未来:
Y_forward1 = B0 + B1*Y + B2*Y_lag1 + B3*Y_lag3 + ... B***n******Y_lag***(n-1)***
现在,我们使用当前值及其过去的滞后值来预测未来值(提前 1 个时间步)。
I:集成
集成表示我们对数据应用差分步骤。也就是说,不是像下面这样运行回归:
Y_forward1 = B0 + B1*Y + B2*Y_lag1 + ...
我们这样做:
Y_forward1 - Y = B0 + B1*(Y - Y_lag1) + B2*(Y_lag1 - Y_lag2) + ...
第二个方程的意思是,Y 的未来变化是 Y 的过去变化的线性函数,为什么要用差分呢?原因是差异通常比原始的无差异值更稳定。当我们做时间序列建模时,我们希望我们的 Y 变量是均值方差平稳。这意味着一个模型的主要统计特性不会因为取样时间的不同而改变。建立在静态数据上的模型通常更稳健。
以真实 GDP(真实意味着它已经被通货膨胀调整)为例。从图中可以明显看出,原始 GDP 数据不是稳定的。它的上升使得图表前半部分的平均 GDP 比后半部分的低很多。
美国实际国内生产总值(来源:圣路易斯美联储银行)
如果我们对这些数据求差,就会得到下面的曲线图。请注意,它现在明显更加稳定(多年来平均值和方差大致一致)。
实际国内生产总值的变化更加平稳
马:移动平均线
当我第一次研究时间序列时,我假设移动平均只是 Y 变量的移动平均(例如,200 天的移动平均)。尽管它们在精神上有些相似,但它们是不同的数学实体。
移动平均模型由以下等式总结:
Y = B0 + B1*E_lag1 + B2*E_lag2 + ... + B***n****E_lag***n***
类似于 AR 部分,我们在这里用历史值做一些事情,因此所有的滞后。但是这个 E 是什么?在对 MA 模型的大多数解释中,e 通常被称为误差,它表示模型和目标变量之间的随机剩余偏差(如果您问我们在拟合模型之前怎么可能会有误差,请稍等片刻)。
基本回归模型的完整等式是:
Y = B0 + B1*X + E
我们需要方程中的 E 来表明回归输出 B0 + B1*X 仅仅是 y 的近似值。左边的图说明了我的意思。黑点是我们试图预测的,蓝线是我们的预测。虽然我们成功地捕捉到了总体趋势,但总会有一些无法捕捉的特殊变化。E 项说明了这个未被捕获的部分——换句话说, E 代表精确答案和我们的模型提供的近似正确答案之间的差异。
因此,如果你一直在仔细阅读,你可能会问,“难道我们不需要先有一个模型,然后才会有模型错误吗?”你完全正确。e 是我们所说的不可观测的参数。与 Y(我们的目标变量)或外生 X 变量的滞后值不同,E 不可直接观察到。另一方面,这也意味着我们不能用 OLS 来拟合 ARIMA 模型(因为我们有不可观测的参数)。相反,我们需要像 MLE(最大似然估计)这样的迭代估计方法,它可以同时估计β参数和残差(以及残差项上的β)。
所以 MA 模型使用模型过去的误差来预测 Y(类似于 AR 模型,我们告诉它我们希望它考虑多少过去的误差)。
让我们花一点时间来思考一下为什么会这样。考虑以下简化的 MA(1)模型:
Y = u + B1*E_lag1where u = the mean of YE = Y - predicted
第一项,u,意味着我们的模型围绕 Y 的均值进行预测(就像说不知道别的,我就猜均值)。第二项 B1*E_lag1 是误差所在。让我们假设现在我们估计 B1 是 0.2。而误差(E)被定义为 Y 的实际值减去模型的预测值。
**这意味着如果最近的误差(E_lag1)为正(意味着实际误差大于我们的预测),我们将把预测误差上调 1/5。**这具有使模型的错误稍微减少的效果(因为第二项 B1*E_lag1 将模型的预测稍微推向正确答案)。
那么,如果模型知道自己的错误,那么为什么它不经常过度拟合(换句话说,为什么我们不通过不公平地给它一些答案来偏置我们的模型)?除了过度拟合,MA 模型没有固有的偏差,因为模型误差是独立的,并且近似正态分布(误差是一个随机变量)。因为它们是随机变量,误差(E_lag1)可以根据它们被观察的时间步长而呈现出非常不同的值。误差中的这种固有噪声意味着,仅用一个β(B1)来拟合,几乎不可能找到一个 B1 来完美地调整每个误差,以便他们的产品完美地填补实际和预测 Ys 之间的每个漏洞。换句话说,MA(1)模型只能利用它对误差的了解,非常近似地将自己推回到正确的方向。
当然,像任何其他模型一样,我们可以通过允许更多的特征来过度拟合 MA 模型,在这种情况下,将会有越来越多的滞后误差(这意味着拟合更多的 betas)。但是这样一个过度拟合的模型在样本之外会表现得很糟糕。
ARIMA 实际国内生产总值预测
让我们通过建立一个 ARIMA 模型来预测实际 GDP,从而将所有这些放在一起。我们将使用 ARIMA 的 statsmodel 实现。我从 FRED(圣路易斯美联储银行的数据仓库)中提取了真实 GDP 的数据。
statsmodel 中的 ARIMA 函数至少需要两个参数:
- 数据——在这种情况下,我们给它一个熊猫系列的原始实际 GDP 值(我们不需要提前求差,因为 ARIMA 算法会为我们做)。
- 第二个参数 order 告诉 ARIMA 函数,在下面的序列中要考虑每种模型类型的多少个组件— (AR 滞后,差值之间的时间步长,MA 滞后)。
让我们看看 AR(4)模型是什么样子的(没有 MA)。我们采用 1 个时间步长差值,使数据保持稳定:
from statsmodels.tsa.arima_model import ARIMAmod = ARIMA(master_df['GDP'], order=(4,1,0))
mod.fit()
predictions = mod.fit().predict()
我们的预测绘制在下图中。如果你仔细观察,橙色线(我们的预测)落后于蓝色线(实际)。这很糟糕。这意味着我们的预测总是落后于现实;因此,如果我们遵循这种模式,我们将永远落后几步。但这是 AR 模型的预期,AR 模型试图通过推断最近的过去来预测未来(如果有那么简单就好了)。
AR(4)模型
同样重要的是要注意,在这个演示中,我并没有将一个训练集和一个测试集分开;我使用整个数据集来拟合我的参数(而不是扩展窗口)。在实践中,我们希望对模型的样本外预测能力进行更加稳健的测试。因此,我们希望使用时间点数据(而不是修正后的 GDP 数据)和扩展窗口回归,以便在每个时间点,我们仅使用历史上该时间点的可用数据来估计参数。
现在,让我们将 2 MA 元件添加到模型中:
mod = ARIMA(master_df['GDP'], order=(4,1,2))
mod.fit()
predictions = mod.fit().predict()
我们已经通过允许模型考虑其误差的大小和方向,赋予了模型稍微修正航向的能力。这是以更长的模型估计过程为代价的——最大似然估计需要一些时间来收敛,而 OLS 则非常快。让我们看看我们的新预测是什么样的:
具有 4 个 AR 滞后和 2 个 MA 滞后的 ARIMA
也好不到哪里去。但是我们不应该期望仅仅通过增加几个 MA 组件就能获得巨大的改进。AR 和 MA 分量都来自目标变量的过去值,因此它们都是通过外推过去来预测未来的尝试。你可能会认为这在平静时期行得通,但在试图预测转折点时会遭遇惨败。
结论
因此,在经历了这一切之后,我们最终得到了一个乏善可陈的模型。但是不要绝望。ARIMA 模型并不意味着是一个完美的预测工具。相反,这是第一步。从我们的目标变量的过去值导出的特征意味着是外生变量的补充而不是替代。因此,在现实中,我们的 GDP 模型不仅包括 AR 和 MA 组件,还包括与 GDP 密切相关的外生组件,如通货膨胀、股票回报、利率等。
此外,拟合的测试版本身也常常令人感兴趣。例如,如果我们正在构建实际 GDP 的模拟,那么我们需要测量 GDP 的自相关性(自相关性是指 GDP 的当前变化与其过去值之间的相关性)。因为如果存在自相关,那么我们肯定不想建立一个 GDP 模型,在这个模型中,我们模拟每个季度的 GDP 变化,而不考虑其他因素。那将是错误的,我们的模型将产生脱离现实的结果。因此,分析 ARIMA 模型的贝塔系数有助于我们更好地理解感兴趣的目标变量的统计特性。
如果你总体上喜欢这篇文章和我的写作,请考虑通过我在这里的推荐链接注册 Medium 来支持我的写作。谢谢!
理解人工神经网络
检查深度学习模型和神经网络的基础
图片作者:特里斯特·约瑟夫
大约从 2013 年 11 月开始,“深度学习”一词开始流行起来,尤其是在数据科学界。这一趋势出现在 2010 年“大数据”热潮和 2011 年“数据科学”热潮之后不久。兴趣的上升并不令人惊讶,因为公司现在意识到,他们需要能够从目前的信息海啸中解读洞察力的个人。
随着数据科学现在被称为“几乎所有与数据有关的事物”,数据利用的过程已经超越了数据收集和分析。现在,可以使用大型数据集来精确地模拟事件和创建数据应用程序。这种激增使得训练计算机和机器执行各种任务成为可能,其中一些可能被视为今天的标准做法。
现在,当一项复杂的任务需要建模时,深度学习几乎是首选方法。这是一个强大的过程,通过自动提取未来决策所需的最有用的信息,使计算机能够模仿人类行为。它是人工智能(AI)和机器学习(ML)的一个分支,深度学习的目标是使用计算方法,允许机器直接从数据中理解信息,而不依赖于预先确定的方程作为模型。
图片作者:特里斯特·约瑟夫
ML 模型和深度学习模型都希望从数据中学习一些东西,这些数据可以用来帮助通知未来的决策。然而,深度学习模型比 ML 更进了一步。其思想是,典型的 ML 算法试图在数据中定义一组规则,这些规则通常是手工设计的。因此,当置于开发环境之外时,ML 模型可能表现不佳。另一方面,深度学习模型直接从原始数据中学习复杂的特征,不一定需要一套手工设计的规则。
深度学习模型建立在“神经网络”的思想之上,这就是允许模型从原始数据中学习的东西。回想一下,这类模型的目标是以某种方式让机器模仿人类行为。因此,想想类似于人脑的深度学习模型中的神经网络。大脑由数十亿个被称为神经元的细胞组成。每个神经元都有多个连接向它传递信息,一个连接向它传递信息。
随着这些神经连接的建立,大脑开始发育,人类通过一个叫做神经可塑性的过程进行学习。这是大脑中的神经网络通过生长和重组来改变的能力。当重组发生时,神经元之间的新路径得到发展,大脑可以删除不再必要的连接或加强发现更重要的连接。本质上,大脑会给每条路径分配一个权重,其中被认为更重要的连接会比那些被认为不重要的连接获得更高的权重。因此,一组输入沿着具有特定权重的路径被馈送到神经元,信息被处理,然后输出以执行一些任务。
图片作者:特里斯特·约瑟夫
类似地,人工神经网络(ANN)包含一组沿加权路径输入的输入,然后对这些输入进行处理,并产生一个输出来执行某些任务。与神经可塑性一样,如果发现神经网络中的路径在模型中更重要,则它们可以具有更高的权重。
这个想法有助于建立神经网络的基础;也就是感知器(或者单个神经元)。通过具有一组输入 x ,信息通过该系统向前传播,并且每个输入具有相应的权重 w 。输入还应包括独立于 x 的“偏置项”。给定手边的问题,偏差项用于相应地移动所使用的函数。然后将每个对应的输入和权重相乘,并计算乘积之和。然后,该和通过非线性激活函数,并且产生输出 y,。
非线性激活函数可以采取多种形式。然而,常见的一种是 sigmoid 函数。这是一条介于 0 和 1 之间的 S 形曲线,其中负输入值被指定为小于 0.5 的输出,正输入值被指定为大于 0.5 的输出。激活函数的选择很大程度上取决于手头的情况,尤其是因为不同的函数包含不同的属性。这个函数的重要性在于它的非线性。在“现实世界”的问题中,大部分数据是非线性的。将线性形式应用于非线性问题无疑会导致较差的性能。
图片作者:特里斯特·约瑟夫
现在我们了解了感知器是如何工作的,一个深度神经网络本质上是由多个连接的感知器组成的。如果所有输入都密集连接到所有输出,这些层被称为密集层。但是,与感知器不同,深度神经网络可以包含多个隐藏层。
隐藏层基本上是神经网络的输入和输出之间的点,在那里激活函数对输入的信息进行转换。它被称为隐藏层,因为它不能从系统的输入和输出直接观察到。只有一个隐含层的神经网络称为单层神经网络,而具有更多隐含层的神经网络称为深度神经网络。神经网络越深入,网络就越能从数据中识别。
必须注意的是,尽管从数据中学习尽可能多的东西是目标,但深度学习模型也可能会遭受过度拟合。当模型从训练数据中学习了太多内容(包括随机噪声)时,就会出现这种情况。然后,模型能够确定数据中非常复杂的模式,但这会对新数据的性能产生负面影响。训练数据中拾取的噪声不适用于新的或看不见的数据,并且该模型不能概括所发现的模式。像感知器一样,非线性在深度学习模型中非常重要。虽然模型将从多个隐藏层中学到很多,但是将线性形式应用于非线性问题仍然会导致较差的性能。
图片作者:特里斯特·约瑟夫
深度学习的重要性(以及 ANN 的延伸)植根于这样一种理念,即通过从数据中了解更多信息,可以做出更好的数据驱动决策。人类有能力通过识别旧的模式,发展新的联系,并以新的视角感知他们所学的东西来开发新的有效的过程,从而自发地将信息整合在一起。但是人类并不擅长处理高度复杂的情况,大多数“现实世界”的问题都是高度复杂的。如果计算机更像人脑,那不是很好吗?
参考文献:
digital trends . com/cool-tech/what-a-artificial-neural-network/
deepai . org/machine-learning-glossary-and-terms/hidden-layer-machine-learning #:~:text = In % 20 neural % 20 networks % 2C % 20a % 20 hidden,inputs % 20 enter % 20 into % 20 the % 20 network。
ncbi.nlm.nih.gov/pmc/articles/PMC4960264/
towards data science . com/introduction-to-artificial-neural-networks-ann-1 EAE 15775 ef9
explainthatstuff.com/introduction-to-neural-networks.html
neuralnetworksanddeeplearning.com/
其他有用的材料:
https://www.inertia7.com/tristn
youtube.com/watch?v=aircAruvnKk
youtube.com/watch?v=bfmFfD2RIcg
https://towards data science . com/what-is-deep-learning-ADF 5d 4 de 9 AFC
理解语音识别系统的音频数据、傅立叶变换、FFT 和频谱图特征
使用 python 进行音频数据分析(声音分析)的介绍
概观
几乎每个组织每天都会产生大量的音频数据。当数据科学家可以轻松访问音频数据以推动人工智能引擎和分析时,音频数据会产生大量的战略见解。已经意识到来自音频数据的信息的力量和重要性的组织正在利用 AI(人工智能)转录的对话来改善他们的员工培训、客户服务和增强整体客户体验。
另一方面,由于以下障碍,有些组织无法更好地利用他们的音频数据— 1。他们没有抓住它。2.数据质量很差。这些障碍会限制他们将要实施的机器学习解决方案(AI 引擎)的潜力。捕捉所有可能的数据并保证数据质量非常重要。
本文提供了从音频数据处理开始的分步指南。虽然这将有助于您开始基本分析,但在进入这一领域之前,对声波和基本信号处理技术有一个基本的了解也不失为一个好主意。你可以点击这里查看我关于声波的文章。那篇文章提供了对声波的基本理解,还解释了一些不同的音频编解码器。
在进一步讨论之前,我们先列出本文将要涉及的内容。让我们依次讨论以下每个主题—
- 读取音频文件
- 【傅立叶变换】
- 【快速傅立叶变换】
- 谱图
- 利用声谱图特征进行语音识别
- 结论
1.读取音频文件
利布罗萨
LibROSA是一个 python 库,它几乎拥有你在处理音频数据时需要的所有工具。这个丰富的库提供了大量不同的功能。这里有一个关于这些特征的快速展示—
- 加载并显示音频文件的特征。
- 光谱表示法
- 特征提取和操作
- 时间-频率转换
- 时间分割
- 顺序建模…等等
由于这个库很大,我们不打算讨论它的所有特性。为了便于理解,我们将只使用一些共同的特征。
这里是你如何快速安装这个库
***pypi** : pip install librosa
**conda** : conda install -c conda-forge librosa*
将音频加载到 Python
Librosa 支持大量的音频编解码器。虽然 。wav (无损)在涉及音频数据分析时应用广泛。一旦你成功地在你的 jupyter 笔记本上安装并导入了 libROSA。只需将 file_path 传递给librosa.load()
函数,就可以读取给定的音频文件。
**librosa.load()**
— >函数返回两个东西— 1。振幅数组。2.采样率。采样率是指录制音频文件时使用的【采样频率】*。如果您保留参数**sr = None**
,它将以其原始采样率加载您的音频文件。(**注:*您可以根据自己的需求指定自定义采样率, libROSA 可以为您对信号进行上采样或下采样)。看下面这张图片—
sampling_rate = 16k 表示这段音频是以 16k 的采样频率录制(采样)的。换句话说,在记录这个文件时,我们每秒钟捕获 16000 个振幅。因此,如果我们想知道音频的持续时间*,我们可以简单地将样本数(振幅)除以采样率,如下所示*
“是的,你可以播放你笔记本里的音频.”
IPython 为我们提供了一个通过笔记本播放音频文件的小部件。
可视化音频
我们从 librosa 得到了振幅和采样率。我们可以很容易地绘制出这些振幅随时间的变化曲线。 LibROSA 提供了如下所示的效用函数 waveplot()
**
这种可视化被称为给定信号的时域表示。这向我们展示了声波的响度(振幅)随时间的变化。这里振幅= 0 代表静音。(从声波的定义来看——这个振幅实际上是由于声音引起的大气压力变化而振荡的空气粒子的振幅)。
这些振幅不太能提供信息,因为它们只谈论录音的响度。为了更好地理解音频信号,有必要将其转换到频域。信号的频域表示告诉我们信号中存在哪些不同的频率。傅立叶变换是一个数学概念,可以将连续信号从时域转换到频域。让我们了解更多关于傅立叶变换的知识。
2.傅立叶变换
音频信号是由多个“单频声波”组成的复杂信号,这些声波在介质中作为扰动(压力变化)一起传播。当声音被记录时,我们只捕捉那些多重波的 合成振幅 。傅立叶变换是一个数学概念,可以 将信号分解成其组成频率 。傅立叶变换不仅给出信号中存在的频率,还给出信号中存在的每个频率的幅度。
傅立叶逆变换与傅立叶变换正好相反。它将给定信号的频域表示作为输入,并对原始信号进行数学合成。
让我们看看如何利用傅立叶变换将音频信号转换成其频率成分
3.快速傅立叶变换
快速傅立叶变换(FFT)是计算给定序列的离散傅立叶变换的数学算法。FT(傅立叶变换)和 FFT 的唯一区别是 FT 考虑连续信号,而 FFT 将离散信号作为输入。DFT 将一个序列(离散信号)转换成它的频率成分,就像 FT 对连续信号所做的一样。在我们的例子中,我们有一个从连续音频信号中采样的幅度序列。DFT 或 FFT 算法可以将这种时域离散信号转换到频域。
FFT 算法概述
简单正弦波理解 FFT
为了理解 FFT 的输出,让我们创建一个简单的正弦波。下面这段代码创建了一个正弦波,其 采样率= 100,振幅= 1,频率= 3 。每隔1/100 秒(采样率)* 计算一次振幅值,并存储到一个名为 y1 的列表中。我们将传递这些离散幅度值,使用 FFT 算法计算该信号的 DFT。*
如果您绘制这些离散值(y1 ),保持 x 轴上的样本数和 y 轴上的振幅值,它会生成一个很好的正弦波图,如下图所示——
现在我们有一个振幅序列存储在列表 y1 中。我们将把这个序列传递给由 scipy 实现的 FFT 算法。该算法返回在信号中找到的频率 的 复值振幅的列表 yf。该列表的前半部分返回正频率项,另一半返回与正频率项相似的负频率项。您可以选择任何一半,计算绝对值来表示信号中存在的频率。以下函数将样本作为输入,并绘制频率图—
在下图中,我们使用上述 fft_plot 函数绘制了正弦波的频率。可以看到,该图清楚地显示了正弦波中的单一频率值,即 3。此外,它还显示了与该频率相关的幅度,对于正弦波,该频率保持为 1。
为了检查一个信号的 FFT 输出,该信号具有超过一个频率的频率,让我们创建另一个正弦波。这次我们将保持 采样率= 100,幅度= 2,频率值= 11 。下面的代码生成这个信号,并绘制正弦波——
生成的正弦波如下图所示。如果我们提高采样率的话,会更平滑。我们保持 采样率= 100 ,因为稍后我们将把这个信号添加到我们的旧正弦波中。
显然,对于该波,FFT 函数将显示频率为 11 的单个尖峰。但我们想看看,如果将这两个采样速率相同但频率和幅度值不同的信号相加,会发生什么情况。这里序列 y3 将代表合成信号。
如果我们画出信号 y3,它看起来像这样—
如果我们将这个序列(y3)传递给我们的 fft_plot 函数。它为我们生成了下面的频率图。它显示了合成信号中两个频率的两个尖峰。所以一个频率的存在不会影响信号中的另一个频率。另外,需要注意的一点是,频率的 幅度与我们生成的正弦波的 一致。
对我们的音频信号进行 FFT
我们已经了解了 FFT 算法如何给出给定信号的所有频率。让我们尝试将原始音频信号传递到这个函数中。我们使用的是之前加载到 python 中的相同音频剪辑,采样率为 16000。
现在,看下面的频率图。这种**【3 秒钟长】*** 的信号是由数千个不同的频率组成的。频率值> 2000 的幅度非常小,因为这些频率中的大部分可能是由噪声引起的。我们绘制的频率范围是 0 到 8kHz,因为我们的信号是以 16k 采样率采样的,根据奈奎斯特采样定理,它应该只拥有≤ 8000Hz (16000/2)的频率。*
强频率范围从 0 到 1kHz 只是因为这个音频片段是人的语音。我们知道,在典型的人类语言中,这个频率范围占主导地位。
我们得到了频率,但是时间信息在哪里?
4.光谱图
为什么是声谱图
假设您正在处理一项语音识别任务。您有一个音频文件,其中有人在说一个短语(例如:你好吗)。你的识别系统应该能够以同样的顺序预测这三个单词(1。怎么样,2。是,3。你’)。如果您还记得,在之前的练习中,我们将信号分解为频率值,这些值将作为我们识别系统的特征。但是,当我们对信号应用 FFT 时,它只给出了频率值,我们失去了时间信息。现在,如果我们使用这些频率作为特征,我们的系统将无法判断先说的是什么。我们需要找到一种不同的方法来计算我们的系统的特征,这样它就有了频率值以及它们被观察的时间。这里 光谱图 进入画面。
给定信号的频率随时间变化的直观表示称为频谱图。在谱图表示图中,一个轴代表时间,第二个轴代表频率,颜色代表在特定时间观察到的频率的幅度(振幅)。下面的屏幕截图显示了我们之前讨论的同一音频信号的频谱图。明亮的颜色代表强频率。与之前的 FFT 图类似,较小的频率范围(0–1 khz)很强(明亮)。
创建和绘制光谱图
想法是将音频信号分成更小的帧(窗口)并计算每个窗口的 DFT(或 FFT)。这样,我们将获得每个窗口的频率,窗口号将代表时间。因为窗口 1 在前,窗口 2 在后…等等。保持这些窗口重叠是一个好习惯,否则我们可能会丢失一些频率。窗口大小取决于您正在解决的问题。
对于典型的语音识别任务,推荐使用 20 到 30 毫秒 长的 窗口。一个人不可能在这个时间窗口内说出一个以上的音素。所以保持窗口这么小,我们在分类时不会丢失任何音素。框架(窗口)重叠可以根据您的需要从 25%到 75%不等,通常为语音识别保留 50%。
在我们的谱图计算中,我们将保持窗口持续时间为 20 毫秒,窗口之间的重叠为 50%。因为我们的信号以 16k 频率采样,所以每个窗口将具有 (16000 * 20 * 0.001) = 320 振幅。对于 50%的重叠,我们需要前进 (320/2) = 160 个幅度值,以到达下一个窗口。因此,我们的步幅值是 160。
看看下图中的声谱图函数。在第 18 行中,我们制作了一个加权窗口(Hanning ) ,并在将其传递给第 20 行中的 FFT 函数之前,将其与振幅相乘。这里使用加权窗口来处理这个小信号(来自单帧的小信号)的不连续性,然后将其传递给 DFT 算法。要了解为什么需要加权窗口的更多信息— 点击此处 。
一个计算声谱图特征的 python 函数—
FFT 算法的输出是复数列表(size = window _ size/2),表示窗口内不同频率的幅度。对于大小为 320 的窗口,我们将得到一个包含 160 个振幅的频率仓的列表,在我们的例子中,这些频率仓代表从 0 Hz — 8kHz (因为我们的采样率是 16k)的频率。**
接下来,计算这些复数值幅度的绝对值并归一化。由此产生的 2D 矩阵就是你的声谱图。在这个矩阵中,行和列代表窗口帧号和频率仓,而值代表频率的强度。
5.利用声谱图特征的语音识别
我们现在知道如何生成频谱图,它是一个 2D 矩阵,表示给定信号的频率幅度和时间。现在把这个声谱图想象成一幅图像。您已经将音频文件转换为下图。
这就把它归结为一个 的图像分类问题 。这个图像适时地从左到右代表你所说的短语。或者把这个想象成一个图像,你的短语从左到右写,你需要做的就是识别那些隐藏的英文字符。
给定一个平行的英语文本语料库,我们可以训练一个深度学习模型,并建立一个我们自己的语音识别系统。这里有两个众所周知的开源数据集可以试用—
***Popular open source datasets —
1\. [LibriSpeech](http://www.openslr.org/12/) ASR corpus
2\. [Common Voice](https://voice.mozilla.org/en) [Massively-Multilingual Speech Corpus](https://arxiv.org/abs/1912.06670)***
深度学习架构的流行选择可以从以下优秀的研究论文中得到理解—
6.结论
这篇文章展示了如何从头开始处理音频数据和一些音频分析技术。此外,它还为构建语音识别系统提供了一个起点。尽管上述研究显示了识别系统非常有前途的结果,但是仍然有许多人不认为语音识别是一个已解决的问题,因为存在以下缺陷
- 研究人员提出的语音识别模型非常大(复杂),这使得它们难以训练和部署。
- 当多人在交谈时,这些系统不能很好地工作。
- 当音频质量不好时,这些系统不能很好地工作。
- 他们对说话者的口音非常敏感,因此需要针对每一种不同的口音进行训练。
这个研究领域有巨大的机会。可以从数据准备的角度(通过创建更好的特征)进行改进,也可以从模型架构的角度(通过呈现更健壮和可扩展的深度学习架构)进行改进。
原刊此处。
引用本文:谷歌学术链接
感谢您的阅读,请告诉我您的意见/反馈。
理解自动文本摘要-1:抽取方法
布雷特·乔丹在 Unsplash 上的照片
怎样才能自动汇总我们的文档?
一些网站和应用程序通常使用文本摘要来创建新闻提要和文章摘要。由于我们繁忙的日程安排,这对我们来说变得非常重要。我们更喜欢包含所有要点的简短摘要,而不是阅读整份报告并自己总结。因此,已经进行了几次尝试来自动化总结过程。在这篇文章中,我们将讨论其中的一些,看看它们是如何工作的。
什么是总结?
摘要是一种缩短长文本的技术,这样摘要就包含了实际文档的所有要点。
主要有四种类型的摘要:
- 单一文件摘要:单一文件的摘要
- 多文档汇总:来自多个文档的汇总
- 查询摘要:特定查询的摘要
- 信息摘要:它包括全部信息的摘要。
自动摘要的方法
主要有两种类型的总结:
**基于抽取的摘要:**抽取方法包括从文档中提取最重要的短语和行。然后,它将所有重要的行组合起来创建摘要。所以,在这种情况下,摘要的每一行每一个字实际上都属于被摘要的原始文档。
**基于抽象的摘要:**抽象方法包括基于深度学习的摘要。因此,它使用新的短语和术语,与实际的文件不同,保持要点不变,就像我们实际总结的方式一样。因此,这比提取方法要困难得多。
据观察,提取摘要有时比抽象摘要工作得更好,可能是因为提取摘要不需要自然语言生成和语义表示。
评估方法
有两种类型的评估:
- 人类评估
- 自动评估
人工评估:人工专家根据概要覆盖要点的程度、回答问题的程度以及语法性和非冗余性等其他因素来分配分数。
自动评估
ROUGE: ROUGE 代表面向回忆的替角,用于吉斯丁评价。它是通过将它与作为参考的由人类做出的其他摘要进行比较来确定摘要的质量的方法。为了评估该模型,有许多由人类创建的参考和由机器生成的候选摘要。这背后的直觉是,如果一个模型创建了一个好的摘要,那么它必须与人类参考有共同的重叠部分。它是由加州大学的林金耀提出的。
常见的 ROUGE 版本有:
ROUGE-n: 基于 n-grams 的机器生成输出与参考输出的比较度量。一个 n -gram 是来自给定文本或语音样本的 n 项的连续序列,也就是说,它只是一个单词序列。二元模型表示两个词,三元模型表示三个词,以此类推。我们通常使用二元模型。
”其中 p 是“候选与参考摘要之间共有 n 元文法的个数”,q 是“仅从参考摘要中提取的 n 元文法的个数”。- 来源
ROUGE-L: 它表示两个文本中最长的公共子序列越长,它们就越相似。因此,它比 n 元语法更灵活。它根据一个序列的长度来分配分数,这对于机器生成的候选人和人类参考来说是常见的。
**胭脂素:**它带来了一个概念跳过双字和单字。基本上,如果两个词之间有其他词,它允许或认为是一个二元词,即二元词不必是连续的词。
胭脂-2 最受欢迎,由以下机构提供:
其中对于每个二元模型‘I ’,我们计算它在生成文档 X 和参考文档 S 中出现的次数的最小值,对于所有参考文档,除以每个二元模型在所有参考文档中出现的总次数。它基于 BLEU 分数。
基于特征的摘要:由 IBM 的 H. P Luhan 于 1958 年开发。该论文提出句子的重要性是文档中高频词的函数。详细地说,该算法测量文档中单词和短语的频率,并考虑句子中的单词及其频率来决定句子的重要性。它指出,如果句子中有出现频率较高的单词,这是很重要的,但这里我们不包括像“a”、“the”这样的常见单词。等等。
抽取摘要:“ 抽取摘要技术通过选择原始文本中句子的子集来产生摘要”。- 来源
提取摘要器首先创建一个 中间表示 ,其主要任务是基于该表示突出显示或提取要摘要的文本的最重要信息。有两种主要的表现形式:
- 主题表征:侧重于表征文本中所表征的主题。有几种方法可以得到这种表示。我们在这里将谈论其中的两个。其他包括潜在语义分析和贝叶斯模型。如果你也想研究其他人,我会鼓励你查阅参考资料。
- 频率驱动方法:在这种方法中,我们给单词分配权重。如果这个词与主题相关,我们就给 1 分,否则就给 0 分。取决于实现方式,权重可以是连续的。主题表示的两种常用技术是:
- 单词概率:它只是简单的用单词出现的频率作为单词重要性的指标。单词 w 的概率由该单词出现的频率 f (w)除以总共有 N 个单词的输入中的所有单词给出。
对于使用单词概率的句子重要性,句子的重要性由句子中单词的平均重要性给出。
- **TFIDF。(Tern Frequency Inver Document Frequency)😗*这种方法是对单词概率法的一种改进。这里,TF-IDF 方法用于分配权重。TFIDF 是一种为在大多数文档中频繁出现的单词分配低权重的方法,直觉地认为这些单词是停用词或类似“the”的单词。否则,由于术语频率,如果一个单词以高频率唯一地出现在文档中,则它被赋予高权重。
- 主题词处理方式:这种方式类似鹿晗的方式。主题词技术是一种常见的主题表示方法,旨在识别描述输入文档主题的词。- 来源 这种方法计算单词频率,并使用频率阈值来找到可能描述主题的单词。它将一个句子的重要性分类为它包含的主题词数量的函数。
- **指示符表示:**这种类型的表示依赖于句子的特征,并基于这些特征对它们进行排序。因此,在这里,句子的重要性不取决于它所包含的单词,正如我们在主题表征中看到的那样,而是直接取决于句子的特征。这种类型的表示有两种方法。让我们看看他们。
- 基于图形的方法:基于页面排名算法。它将文本文档表示为连通图。句子被表示为图的节点,节点或句子之间的边是两个句子之间相似性的度量。我们将在接下来的部分详细讨论这一点。
- **机器学习方法:**机器学习方法将摘要问题作为分类问题来处理。这些模型试图根据句子的特征将句子分为摘要句和非摘要句。为了训练模型,我们有一组训练文档及其相应的人类参考文献摘要。这里通常使用朴素贝叶斯、决策树和支持向量机。
评分和选句
现在,一旦我们得到了中间表述,我们就开始给每个句子分配分数,以确定它们的重要性。对于主题表征,句子的得分取决于它所包含的主题词,而对于指示表征,得分取决于句子的特征。最后,具有最高分数的句子被挑选出来并用于生成摘要。
基于图形的方法
北德克萨斯大学的 Rada Mihalcea 和 Paul Tarau 的一篇论文首先介绍了基于图形的方法。该方法被称为文本排名算法,并受到谷歌的页面排名算法的影响。这个算法主要是试图找出一个给定图形中顶点的重要性。
现在,算法是如何工作的?
在这个算法中,我们已经了解到,每一个句子都被表示为一个顶点。连接两个顶点或两个句子的边表示这两个句子是相似的。如果任何两个句子的相似性大于特定阈值,则表示句子的节点由边连接。
当两个顶点连接在一起时,它描绘了一个顶点在给另一个顶点投票。特定节点(顶点或句子)的票数越多,该节点和所代表的句子就越重要。现在,投票也是有权重的,每一票的权重和重要性都不一样。投票的重要性还取决于投票的节点或句子的重要性,投票节点的重要性越高,投票的重要性就越高。所以,投给一个句子的票数和这些票数的重要性决定了这个句子的重要性。这是谷歌网页排名算法背后的相同想法,以及它如何决定和排名网页,只是节点代表网页。
如果我们有一个段落,我们会把它分解成一组句子。现在,假设我们将每个句子表示为顶点‘VI ’,那么,我们获得一组顶点 V。如所讨论的,边将一个顶点与同一组中的另一个顶点连接起来,所以边 E 可以表示为(V×V)的子集。在有向图的情况下,In(V{i})是节点的输入边的数量,Out(v{j})是给定节点的输出边的数量,顶点的重要性分数由 S{j}给出。
页面排序算法
根据谷歌页面排名算法,
其中 S(V{i})是所考虑的主题节点的分数,S(V(j))表示具有到 V{i}的外出边的所有节点。现在,V{j}的分数除以 V{j}的出度,这是对用户将选择该特定网页的概率的考虑。
细想一下,如果这是图,站在 A,作为一个用户,我可以同时去 B 和 C,那么我去 C 的几率就是,即 1/(A 的出度)。因子 d 称为阻尼因子。在最初的页面排名算法中,因子 d 包含了随机性。1-d 表示用户将移动到随机网页,而不是连接的网页。该因子通常设置为 0.85。在文本排序算法中实现了相同的算法。
现在,问题来了,我们如何获得分数?
让我们先检查页面排名算法,然后将其转换为文本排名。正如我们在上面看到的,有 4 个顶点,首先,我们给所有的顶点分配随机分数,比如,[0.8,0.9,0.9,0.9]。然后,概率分数被分配给边缘。
矩阵是图的邻接矩阵。可以观察到,相邻矩阵的值是概率值,即该节点或顶点的 1/出度。因此,实际上页面排名图变得不加权,因为等式只包含给出权重的项。
现在,整个等式变成了,
我们可以看到,旧的得分矩阵乘以邻接矩阵得到新的得分矩阵。我们将继续这一过程,直到新得分矩阵和旧得分矩阵的 L2 范数变得小于给定常数,通常为 1 x10^-8.这是一个基于线性代数和特征值与向量理论的收敛性质。为了简单起见,我们将跳过数学。一旦达到收敛,我们就从得分矩阵中获得最终的重要性得分。
对于文本排名算法,方程和图被修改为加权图,因为在这里,仅仅除以出度不会传达全部的重要性。结果,等式变成:
w 代表权重因子。
文本排序的实现包括两个不同的自然语言过程:
- 关键词提取任务,选择关键词和短语
- 一个句子提取任务,这确定了最重要的句子。
关键词提取任务
以前,这是使用频率因子完成的,结果相对较差。文本排名论文介绍了一个完全无监督的算法。根据该算法,对自然语言文本进行标记化和词性标注,并将单个单词作为节点添加到单词图中。现在,如果两个单词相似,相应的节点用一条边连接起来。使用单词的共现来测量相似性。如果两个单词出现在 N 个单词的窗口中,N 从 2 到 10 变化,则这两个单词被认为是相似的。具有最大数量的重要关联边的单词被选为最重要的关键词。
句子抽取任务
它的工作方式也类似于关键词提取,唯一的区别是在关键词提取中,节点代表关键词,这里它们代表整个句子。现在,为了形成句子排序的图,算法为文本中的每个句子创建一个顶点,并添加到图中。句子太长,所以不能应用共现度量。因此,本文利用两个句子之间的内容重叠来使用两个句子之间的“相似度”,换句话说,相似度取决于两个句子中出现的共同单词标记的数量。作者在这里提出了一个非常有趣的“推荐”见解。它们表示两个相似句子或顶点之间的边的连接,好像它在建议读者阅读另一行,这与他/她正在阅读的当前行相似。因此,我感觉的相似性表示两个句子之间的相似内容或兴趣。为了防止长句被推荐,重要性被乘以一个标准化因子。
两个句子之间的相似性由下式给出:
其中给定两个句子 Si 和 Sj,一个句子由出现在该句子中的 Ni 个单词的集合来表示:
最重要的句子是以与我们提取关键词相同的方式获得的。
这是一个关于文本排名如何运作的整体视图,请浏览原文以了解更多信息。
在实践中,对于摘要抽取,我们使用余弦相似度来决定两个句子之间的相似度。使用这种方法,我们可以得到几个连通的子图,这些子图表示整个文档中重要主题的数量。子图的连通部分给出了对相应主题重要的句子。
“ Pytextrank ”库允许直接在 python 上应用文本排名算法。
import spacy
import pytextrank
# example text
text = "Compatibility of systems of linear constraints over the set of natural numbers. Criteria of compatibility of a system of linear Diophantine equations, strict inequations, and nonstrict inequations are considered. Upper bounds for components of a minimal set of solutions and algorithms of construction of minimal generating sets of solutions for all types of systems are given. These criteria and the corresponding algorithms for constructing a minimal supporting set of solutions can be used in solving all the considered types systems and systems of mixed types."
# load a spaCy model, depending on language, scale, etc.
nlp = spacy.load("en_core_web_sm")
# add PyTextRank to the spaCy pipeline
tr = pytextrank.TextRank()
nlp.add_pipe(tr.PipelineComponent, name="textrank", last=True)
doc = nlp(text)
# examine the top-ranked phrases in the document
for p in doc._.phrases:
print("{:.4f} {:5d} {}".format(p.rank, p.count, p.text))
print(p.chunks)
由源码实现 Pytextrank 库。
有关应用详情,请参考 GitHub 链接。
结论
在本文中,我们已经看到了基本的摘要方法和 Textrank 算法的细节。对于抽象方法,请随意阅读本文的第 2 部分。
我希望这有所帮助。
参考
text rank:https://web . eecs . umich . edu/~ mihalcea/papers/mihalcea . em NLP 04 . pdf
概述:【https://arxiv.org/abs/1707.02268v3
基于机器学习的方法:http://www . csie . ntnu . edu . tw/~ g 96470318/A _ trainible _ document _ summarizer _。pdf
理解自动文本摘要-2:抽象方法
布雷特·乔丹在 Unsplash 上的照片
怎样才能用深度学习来概括课文?
这是我关于文本摘要的第二篇文章。在我的第一篇文章中,我谈到了总结文本的提取方法和使用的度量标准。在本文中,我们将讨论抽象总结。我们将看到深度学习如何用于总结文本。所以,让我们开始吧。
抽象总结者
抽象摘要器之所以被称为抽象摘要器,是因为它们不从最初给定的文本段落中选择句子来创建摘要。相反,他们使用不同于原始文档的词汇集,对给定文本的主要内容进行解释。概括地说,这与我们人类的行为非常相似。我们在大脑中创建文档的语义表示。然后,我们从我们的通用词汇表(我们常用的单词)中挑选符合语义的单词,以创建一个简短的摘要来表示实际文档的所有要点。正如你可能注意到的,开发这种摘要器可能很困难,因为他们需要自然语言生成。让我们看看最常用的解决问题的方法。
序列间 rnn 的应用
这个方法是由 IBM 的 Ramesh Nallapati、Bowen Zhou、Cicero dos Santos、卡格拉尔 Gulcehre 和 Bing Xiang 在一篇论文中提出的。使用术语“序列到序列模型”是因为模型被设计成从输入单词序列创建输出单词序列。在所考虑的情况下,输入序列是实际的文本文档,输出序列是缩短的摘要。
该文提出了一种受注意力递归神经网络编码器-解码器模型启发的模型,该模型由德国雅各布大学的 Dzmitry Bahdanau 首先提出用于机器翻译。
尽管如此,问题与你已经感觉到的有很大不同。首先,对于机器翻译,我们需要无损失的翻译,因为我们需要翻译形式的准确句子,但是对于摘要生成,我们需要压缩原始文档,以创建摘要,所以它需要有一点损失。其次,对于摘要生成,摘要的长度不取决于原始文本。这两点是问题给出的问题中的关键挑战。
在讨论本文的应用细节之前,我们先来看看编码器和解码器网络,以及使用注意力层的原因。
编码器和解码器网络
如果我们考虑一个一般的 LSTM(长期短期记忆)层,它看起来就像下面给出的图表。它或者为每个输入产生一个输出,或者它创建一个特征向量,该特征向量随后被密集神经网络层用于应用 softmax 层的分类任务。例如,情感检测,我们通过 RNN 传递整个句子,并使用适合 softmax 层的特征向量来产生最终结果。
但这里要意识到的一件事是,对于当前的问题,或者像这样的问题,包括机器翻译,更一般地说,我们可以说这个问题是一个序列到序列的问题,这种特殊的模型方法不能应用。主要原因是输出的大小与输入的大小无关,两者都是序列。为了解决这个问题,引入了编码器-解码器网络模型。
模型的基本架构如上图所示。
编码器负责接收输入句子或原始文档,并生成最终状态向量(隐藏状态和单元格状态)。这由图中的内部状态表示。编码器可能包含 LSTM 层、RNN 层或 GRU 层。由于消除了爆炸和消失梯度问题,大多数情况下使用 LSTM 层。
上图显示了我们的编码器网络。在编码器网络中,一个字在一个时间步长被馈送,最后,在第 n 个输入字被馈送到 LSTM 层之后,隐藏状态和单元状态成为我们的最终状态或特征向量。单元状态 Cn 和隐藏状态 Hn 被发送到解码器的第一组 LSTM 层。
这是我们的解码器模型的样子。现在,第一层接收来自编码器最终状态的输入,即隐藏和单元状态激活。解码器模型接收输入并产生输出序列的预测字,给定先前产生的字。因此,对于时间步长 1 的 LSTM,解码器具有 0 个向量输入,Y1 是生成的预测字,对于时间步长 2,Y1 作为输入被馈送到 LSTM 层,Y2 是生成的字,依此类推。解码器一步一步地生成单词,直到面对标签。
这可能会提出一个问题,单词是如何生成的?。好吧,这就是答案。编码器-解码器模型是在单词的目标集合或词汇表上训练的。现在,在解码器的每个步骤中,LSTMs 隐藏激活通过 softmax 层发送,该层生成词汇表中每个单词被预测为下一个单词的概率。选择具有最大概率的单词作为该时间步长的输出。现在,模型如何知道哪个单词完全符合语义呢?为此,该模型在数据集上进行训练,并将问题转化为监督分类问题。此外,模型通常使用词汇中单词的单词嵌入,这些单词来自众所周知的嵌入向量,如 google 的 word2vec 或 Standford NLP 的 Glove。单词嵌入有助于获得关于单词的多种见解,例如给定的单词是否与给定的单词相似。有时 TFIDF 矢量化也用于生成上下文单词的意义。
我们来举个例子。假设我们有一个数据集,其中有一个长格式报告及其人工摘要的集合。这些信息可以用作训练我们的编码器-解码器网络的标签和目标。我们将矢量化我们的标签和目标,形成一个词汇表。接下来,我们将从 word2vec 或 Glove 中为我们的词汇表中的单词选取嵌入内容,然后将标签和目标与我们的训练模型相匹配。
但是这个特殊的总结问题有一个问题。原始文档可能非常大。假设文档有 100 行。现在,当我们人类从 1-5 行中总结时,我们需要考虑第 100 行吗?没有对吗?当我们手动总结时,我们会更多地关注第 1-5 行,然后慢慢向前。这一方面不能通过普通的编码器-解码器模型来实现,因此引入了注意机制。
注意机制
该机制旨在仅关注来自输入的一些特定序列,而不是整个输入序列来预测单词。这种方法与人类的方法非常相似,似乎可以解决问题。
上图是 TensorFlow 对注意力层的实现。我们可以看到,为了预测一个单词,输入序列中的每个单词都被赋予了一个权重,称为注意力权重。矢量化的注意力权重的总和用于形成用于预测的上下文向量。
让我们详细检查一下。该论文建议编码器由双向 GRU RNN 组成,解码器将具有单向 GRU RNN。编码器和解码器将具有相同数量的隐藏层和单元。
我们来看看这里的注意机制。
上面的绿色层显示解码器,Y1 和 Y2 是时间步长输出。X1,X2 是编码器的输入。“af0”是输入 0 的前向激活,“ab0”是时间步长 0 的后向激活,依此类推。
假设‘an’是(‘ABN’,‘afn’)在时间步长 n 的组合激活,那么,a0=(af0,ab0),即,向前和向后组合。“Wmn”确定在预测解码器在时间步长 n 的输出时,在时间步长 m 应该给予输入多少权重。
上下文向量是注意力权重的加权和。它由下式给出:
C < n > = Sum(W )。一个用于输入时间步长中的所有 m。
对于输入中的所有 m 个时间步,即,如果输入中有 x 个字,则 x 个时间步,上述等式表示时间步 n 的上下文向量等于在时间步 m 给予输入的权重和时间步 m 的组合激活的总和。
那么,单词是如何获得的呢?
W =所有 m 的 softmax(e )
其中我们使用具有单一隐藏状态的神经网络来获得 e。网络接收 S(n-1)和 a(m)(时间步长 m 的组合激活)并给出 e(m,n)作为输出。用于获得‘e’的神经网络也在我们的编码器-解码器模型的训练期间被训练。
我们使用 softmax,因此分配给所有输入时间步长的所有权重之和始终等于 1。
这是注意力模型的整体机制。
大词汇绝招
我们之前已经讨论过,解码器预测的字是使用 softmax 生成的。现在,如果我们使用我们的词汇表中的所有单词作为我们的目标单词集,softmax 将有大量的输出节点,并且预测在计算上将是低效的。本文提出了蒙特利尔大学的塞巴斯蒂安·让提出的大词汇量的方法来解决这个问题。该模型在小批量中被训练。每个小批量的目标单词集或解码器词汇表被限制到该特定小批量的源文档。现在,如果我们对每个小批量使用不同的解码器词汇子集,目标词汇就有可能变得长度不等,这是非常明显的,因为不同的样本具有不同的行数和不同的字数。因此,我们将总词汇表中最常用的单词添加到子集词汇表中,使它们具有固定的大小。这降低了时间要求并加快了收敛,因为随着目标集大小的减小,softmax 层也缩短了。
提取关键词
之前,当我们讨论编码器-解码器模型时,我提到过我们通常使用单词嵌入来表示矢量化后的文档中的单词。现在,让我们试着想一想,为了进行总结,我们实际上需要这些词来表示什么。我们将意识到嵌入是不够的,因为对于摘要,我们需要关注文本片段中的上下文和关键词。嵌入有助于对一个词有一个大概的了解,但它与文本的上下文无关。因此,该论文提出考虑像词类标签、命名实体标签和单词的 TFIDF 统计以及嵌入来表示单词这样的因素。我们使用箱将连续的 TFIDF 值转换成分类值。最后,我们获取单词的所有特征和嵌入,并为单词创建新的嵌入。所以,基本上 TFIDF,POS 标签让我们了解单词在文档的上下文中有多重要,单词嵌入让我们了解单词的一般情况。接下来,我们将它们连接成一个长向量,并馈入网络。需要注意的一点是,我们只使用单词嵌入来表示目标端的单词。
接下来,我们将研究论文提出的另一个非常重要的方面。
切换发电机指针
在自然语言处理中,当我们使用监督模型训练模型时,我们经常需要处理一些我们的词汇表中不存在的单词。这样的词被称为 OOV 或词汇之外。在正常情况下,我们使用“UNK”标签来处理它们。但是在总结的情况下,这是不正确的,因为这些词在总结中可能具有某种意义。本文提出了一种开关解码器指针来处理这种情况。在解码器的每个时间步,都有一个指针指向输入文本。每当解码器面对 OOV 术语时,它指向输入中的术语,并直接使用输入文本中的术语。因此,解码器在一个时间步长内基本上有两个动作,它可以从目标字典生成一个单词,或者它可以指向并复制一个单词。这个决定是使用开关作出的,如果开关接通,它产生一个字,否则它从输入端复制一个字。
现在,问题是开关是如何操作的?该切换是在特定解码器时间步长下整个上下文向量上的 sigmoid 激活函数。它由下式给出:
来源于
“其中 P(si = 1)是开关在解码器的第 I 个时间步长打开的概率,hi 是隐藏状态,E[oi1]是来自前一个时间步长的发射的嵌入向量,ci 是注意力加权的上下文向量,Ws h、Ws e、Ws c、bs 和 vs 是开关参数”——来源
在每个时间步长的指针必须指向一个单词,以便复制该单词,这是基于该解码器时间戳的注意力权重分布来决定的。
“在上面的等式中,pi 是摘要中第 I 个字位置处的指针值,从文档字位置 j ∈ {1,.。。,Nd},其中 P a i (j)是解码器中第 I 个时间步长指向文件中第 j 个位置的概率,h d j 是编码器在 j 位置的隐藏状态“- 来源
在训练神经网络的过程中也训练开关。下面给出的函数在训练期间进行了优化。
“其中 y 和 x 分别为摘要词和文档词,gi 为指标函数”——来源 *。*每当 OOV 面对解码器词汇时,指示器功能被设置为 0。这将关闭开关,并从输入文本中复制一个单词。
这是用于文本摘要的序列到序列模型的概述。我鼓励您仔细阅读参考资料,了解更多实现细节。
需要注意的一点是,作者为长文档提出了层次化的注意层。如果文档非常非常长,我们有时可能需要用关键词来识别关键句子。为此,我们需要一个分层次的注意机制。一个层次负责句子的重要性,另一个层次负责单词的重要性。这两个注意层同时在两个层面上运作。
另外两种最著名的方法是:
脸书的模型
这种方法是由脸书人工智能研究所的 Alexander Rush 在 2015 年提出的。
上图描述了 facebook 的模式。它有三个编码器:
- 一个词袋编码器:它只使用输入句子的词袋表示,忽略与相邻词的关系。解码器接收编码向量或单词包,并在时间步长预测单词。
- 卷积编码器:卷积层用于从输入向量的字嵌入中生成特征向量,然后解码器用于在时间步长上创建字
- 基于注意力的编码器:这个编码器在注意力层 RNN 上工作,正如我们在前面的方法中所讨论的。
最后,对结果进行波束搜索,以获得摘要文本。
谷歌的指针生成器模型
这个模型是由斯坦福大学的 Abigii See 提出的。
我觉得这个模型类似于 IBM 的模型,但是这个模型使用了一个覆盖机制来减少序列到序列网络的重复问题。
你可以通过报纸了解更多的细节。我将提供参考中的链接。
结论
在本文中,我们讨论了深度学习用于文本摘要的几种方法。
我希望这有所帮助。
参考
IBM 的方法:https://arxiv.org/abs/1602.06023
谷歌的方法:https://arxiv.org/abs/1704.04368
https://arxiv.org/abs/1509.00685脸书的做法
神经机器翻译:https://arxiv.org/abs/1409.0473
大词汇绝招:https://arxiv.org/abs/1409.0473
关注层:https://www . tensor flow . org/tutorials/text/NMT _ with _ attention
了解 Azure Cosmos DB 中的自动驾驶模式
有了自动驾驶模式,计算您需要在 Cosmos DB 中提供多少吞吐量变得更加简单!
2019 年 11 月,Azure Cosmos DB 团队宣布了一系列很酷的功能,使得开发和管理 Cosmos DB 应用程序变得更加容易。
到目前为止,我最喜欢的功能是新的自动驾驶模式。在这篇文章中,我将谈论自动驾驶模式的好处,如何在启用自动驾驶模式的情况下供应数据库和容器,以及当前的限制是什么(毕竟它仍然是一个预览功能!😂)
开始时
在 Azure Cosmos DB 中,您提供吞吐量来管理您的工作负载。在 Autopilot 出现之前,您必须为一个容器或一个数据库可以拥有的请求单位/秒(RU/s) 设置一个硬性的最大限制。这是很难做到的,因为您必须猜测您需要多少吞吐量,并期待最好的结果。
即使你没有达到最高限额,你仍然被收取预订费。因此,您可以将最大吞吐量级别设置为 10K RU/s,但在一天中只使用 15 分钟。
我们可以使用一些工具来改变所调配的吞吐量。我们可以使用传送门(像穴居人一样)或者使用。NET SDK 以编程方式更新金额(这只是增加了代码的复杂性😥).
我试图计算出我需要调配多少吞吐量。来源:https://encrypted-tbn0.gstatic.com/images?q = tbn:and 9 gcrmf 4-sgz 3 rato qpcv 01 zreyvt 83 yj 99 _ tbnnuusbfmjw 4 _ kDX&s
激活自动驾驶模式!
进入自动驾驶模式😃我们可以在 Cosmos DB 中的容器和数据库上设置 Autopilot,而不是自己手动设置吞吐量,这将自动即时扩展所提供的吞吐量,而无需我们做任何事情,也不会影响我们应用程序的可用性。
Autopilot 目前在一个分层系统上工作,在这个系统中,您可以设置容器或数据库上不希望超过的最大吞吐量水平。容器或数据库可以在 0.1(最大值)到最大值之间瞬间伸缩。目前有 4 层可供选择:
- 4000 RU/s*(最大存储容量 50GB)*
- 20,000 RU/s (200GB 最大存储)
- 100,000 RU/s (1TB 最大存储)
- 500,000 RU/s (最大存储容量 5TB)
自动驾驶有什么好处?
首先,它更加灵活!我不能告诉你多少次,我不得不打破古老的算盘,计算出我不得不为宇宙(以及某些时候)提供的许多 RU。
这也使你的代码更加整洁。为了避开 429 错误。NET SDK 确实允许您在达到最大分配吞吐量时升级数据库或容器的吞吐量。但是这并不能避免我必须计算出我需要多少个 RU 来满足我的应用程序的需求。
自动驾驶也可以为你节省一些严重的现金!我曾经遇到过这样的情况,我们团队中的一名工程师在 Cosmos 中做了一些测试,将配置的 RU 提高到 20K。测试成功了,一切都很好,直到我们收到那个月的账单……
来源:https://I . kym-cdn . com/entries/icons/original/000/000/554/Picard-face palm . jpg
有了 Autopilot,你只需为你的 Cosmos DB 账户按小时使用的资源付费。因此,以 20K 为例,如果我们使用自动驾驶仪达到 RU 要求的水平,我们将只需支付我们需要 RU 水平达到 20K 的小时数,而不是整个星期,工程师都忘记将它降下来。
我什么时候会使用自动驾驶?
如果您的 Cosmos DB 帐户收到的工作负载是变化的或不可预测的,启用 Autopilot 可确保您有足够的吞吐量来满足工作负载的需求。这样就不需要自己更改调配的吞吐量,因为 Autopilot 会在一个层内为您增减吞吐量。
如果您正在开发一个新的应用程序,或者您只是在做一些测试,启用自动驾驶功能可以帮助您评估部署应用程序后需要提供多少吞吐量。
告诉我怎么做!
在自动驾驶的情况下创建数据库和容器是非常简单的。我将假设您知道如何提供一个 Cosmos DB 帐户,所以为了节省时间,我将跳过这一步。
让我们创建一个启用了自动驾驶的容器。如果你愿意,你也可以在数据库级别启用自动驾驶,但是我只用容器作为例子。在你的 Cosmos DB 账户中,点击 New Container。
就像我们在 Cosmos 中创建新容器时通常会做的那样,我们会给容器一个名称、分区键值,然后要么创建一个新数据库,要么给它分配一个预先存在的数据库。单击为容器调配专用吞吐量的选项,您应该会看到两个选项:
- 自动驾驶仪(预览)。
- 手动。
因为这是一个关于实现自动驾驶的教程,你可以继续选择那个选项😊
如果是这样,你必须为你的容器选择一个自动导航层。现在只需选择 4K 层,然后单击“确定”。
如果您稍后需要更改等级,请进入容器的’*比例和设置’*选项卡,您可以选择一个新的等级。您可以上升或下降一个级别,这取决于哪些需求会影响您的容器。
如您所见,设置起来相当简单😊
有什么蹊跷?
就目前的情况而言,当谈到自动驾驶时,你需要注意几个问题。希望当这个特性普遍可用时,这些问题会得到解决,但是如果你不想等那么久……
你可以在 Cosmos 中的容器和数据库上启用自动驾驶的唯一方式是通过门户。如果您使用 CLI、Powershell 或 REST APIs 通过 CI/CD 管道部署这些,您目前将无法做到这一点。
我设法解决这个问题的一个方法是在门户中提供自动引导的容器,然后测试我的部署脚本,看它们是否恢复到手动提供的容器。好消息是自动驾驶功能仍然存在。这是一个有点黑客,但它的工作🤷♂️
您不能在现有的容器/数据库上启用自动驾驶😥就像如果你想改变一个容器的分区键,你必须重新创建这个容器。我真的希望当 Autopilot 正式发布时,我们可以更新这个(提示提示宇宙团队中可能读到这个的任何人😊)
*你可以关闭自动驾驶,切换到手动,但是不能再回去了。*再次,有点限制,但我非常希望当 Autopilot 正式上市时,我们将能够根据需要改变。
Autopilot 还会考虑你的容器/数据库当前存储了多少数据。例如,如果我们创建一个最大吞吐量水平为 4,000RU/s 的容器,我们的最大存储限制也将是 50GB。一旦我们在容器中超过 50GB 存储,我们将自动升级到 20,000 RU/s。如果您不需要在 Cosmos 中存储这些数据,并且希望降低成本,您可能需要考虑如何归档数据,以保持在该自动驾驶层的存储限制内。
结论……
希望在本文中,您看到了在您的 Cosmos DB 数据库和容器中使用 Autopilot 的好处。虽然这是到目前为止的结尾,因为它仍然是一个预览功能,所以当它变得普遍可用时,我很确定我将不得不再次写这篇文章!😂
在为 Cosmos DB 开发和管理应用程序时,我不能强调这是多大的游戏改变者。我们不再需要自己花时间摆弄吞吐量调配了!
一如既往,如果你有任何问题,请在下面的评论区提问!
了解轴和维度| Numpy |熊猫
知道如何沿数据的不同轴应用函数。
照片由 Ridham Nagralawala 在 Unsplash 上拍摄
我要解释一个非常基本但重要的话题,轴和尺寸。很多人觉得挺混乱的,尤其是在多维数据上应用一个函数的时候使用 axis。
轴或尺寸是一个非常通用的概念。无论是在 Numpy 、 Pandas、TensorFlow 、**、**还是另一个库中处理数据,都要经常碰到。我将要解释的概念在所有这些库中都是通用的。
轴心是什么?
简单来说,轴就是代表数据的维度的东西。让我们通过各种例子来理解它的核心。
零维数据
一个标量是零维数据。它没有维度或轴。
4
一维数据
一个向量是一维数据。Vector 是标量的集合。Vector 有一个形状(N,)
,其中 N 是其中标量的数量。
[1,2,3,4]
矢量只有一个轴,因为它是一维的。所以你只能跨axis-0
应用一个函数。轴的索引始终为 0。
np.sum([1,2,3,4], axis=0)>> 10
二维数据
矩阵是二维数据的一个例子。矩阵是向量的集合,形状为(N,M)
,其中N
是其中向量的数量,M
是每个向量中标量的数量。
以下示例矩阵的形状将是(2,3)
。
[[1,2,3],
[4,5,6]]
矩阵是二维数据,因此它有两个轴。让我们看看如何沿两个轴应用一个和函数。
应用求和函数
对axis-0
求和意味着我们对所有向量求和。
data = [[1,2,3],[4,5,6]]np.sum(data, axis=0)>> [5, 7, 9]
对axis-1
求和意味着,我们对一个向量中的所有标量求和。
data = [[1,2,3],[4,5,6]]np.sum(data, axis=1)>> [6, 15]
您也可以选择不在参数中提供任何轴。这样你将得到所有元素的总和。Means 函数适用于数据中存在的所有元素,与坐标轴无关。
data = [[1,2,3],[4,5,6]]np.sum(data)>> [21]
三维数据
类似地,3D 数据是 2D 数据点(矩阵)的集合。3D 数据的形状将是(N,M,P)
。会有形状为(M,P)
的N
矩阵。
下面的三维数据的形状将是(2,2,3)
。
[[[1,1,1],
[3,3,3]], [[2,2,2],
[4,4,4]]]
应用求和函数
- 对
axis-0
应用求和函数意味着你将所有矩阵求和。 - 对
axis-1
应用 sum 函数意味着您对每个指标内的所有向量求和。 - 对
axis-2
应用 sum 函数意味着对每个向量中的所有标量求和。
概括概念
让我们把这个概念推广到任意维数。维度为n
的数据将具有以下形状。
(N1, N2, N3 ..... Nn)
- 沿着
axis-0
有N1
个形状(N2, N3 .. Nn)
的数据点。对axis-0
应用函数意味着您正在这些N1
数据点之间执行计算。 - 沿着
axis-0
的每个数据点将具有形状(N3, N4 .. Nn)
的N2
数据点。这些N2
数据点将与axis-1
一起考虑。对axis-1
应用函数意味着您正在这些N2
数据点之间执行计算。 - 同样的,还在继续。
注意
您也可以对轴使用负索引。axis -1
将是最后一个轴,axis -2
将是倒数第二个轴。
多个数据点
我们在单个数据点内应用函数。让我们看看当我们在多个数据点之间应用一个函数时,轴是什么意思。
让我们看看下面的例子,我们在axis-0
上的两个不同的数据点上应用了 Sum 函数。
data1 = [1,2,3]
data2 = [4,5,6]np.sum((data1, data2), axis=0)>> [5, 7, 9]
由于有 2 个长度为 3 的向量,这些数据点将被视为形状为(2,3)
的单个数据点,如下所示。
[[1,2,3],[4,5,6]]
类似地,如果有N
不同的数据点,您可以将其视为一个组合的单个数据点,并像在单个数据点中应用一样应用任何函数。
熊猫的轴心
同样,在 Pandas 中,您可以将系列作为一维数据处理,将数据帧作为二维数据处理。
数据帧
例如,在数据帧中,行被认为是沿着axis-0
的,而列被认为是沿着axis-1
的。跨axis-0
应用任何函数意味着在所有行之间执行计算,跨axis-1
应用函数意味着在所有列之间执行计算。
在这篇博客中,我举了一个 Sum 函数的例子,但是您可以使用 axis 执行更多的函数。写这篇博客是为了给你的轴和维度打下基础。随着练习越来越多,你会越来越好。
下一个
与标准 Python 列表的比较。
towardsdatascience.com](/how-fast-numpy-really-is-e9111df44347)
了解神经网络的批处理规范化
了解批处理规范化如何使您的深度学习模型学习得更好,以及如何在 PyTorch 中从头实现它。
来源:链接
在训练学习系统时所做的主要假设之一是假设输入的分布在整个训练中保持不变。对于简单地将输入数据映射到一些适当的输出的线性模型,这个条件总是满足的,但是当处理由相互堆叠的若干层组成的神经网络时,情况并非如此。
在这种架构中,每一层的输入都受到前面所有层的参数的影响(网络参数的微小变化会随着网络变深而放大)。因此,在层内的反向传播步骤期间所做的小的改变可以产生另一层的输入的巨大变化,并且最终改变特征图的分布。在训练期间,每一层都需要不断地适应从前一层获得的新分布,这减慢了收敛。
批处理标准化[1]克服了这个问题,同时通过在训练期间减少内部层内的协方差移动(由于训练期间网络参数的变化而引起的网络激活分布的变化)以及使用批处理的优点,使训练更有效。
本文将涵盖以下内容
- 批处理规范化如何减少内部协方差偏移,以及这如何改进神经网络的训练。
- 如何在 PyTorch 中实现一个批处理规范化层?
- 一些简单的实验显示了使用批处理规范化的优点。
通过小批量统计减少内部协方差变化
一种减少或消除神经网络内部协方差偏移的不良影响的方法是标准化层输入。该操作不仅强制输入具有相同的分布,而且白化它们中的每一个。该方法受到一些研究[2]的启发,这些研究表明,如果网络训练的输入被白化,则网络训练收敛得更快,因此,加强每层输入的白化是网络的期望属性。
然而,每层输入的完全白化是昂贵的,并且不是完全可微分的。批处理规范化通过考虑两个假设克服了这个问题:
- 我们将单独归一化每个标量要素(通过设置平均值为 0 和方差为 1),而不是联合白化图层输入和输出中的要素。
- 我们没有使用整个数据集来标准化激活,而是使用小批量作为*,每个小批量产生每次激活的平均值和方差的估计值*。
对于具有 d 维输入的层,x = (x1,x2,…xd)我们通过以下公式获得归一化(通过批次 B 计算期望值和方差):
但是,简单地标准化图层的每个输入可能会改变图层所能表示的内容。例如,标准化 sigmoid 的输入会将它们限制在非线性的线性范围内。这种行为对于网络来说是不期望的,因为这将降低他的代表能力(这将变得等同于单层网络)。
sigmoid 函数图
为了解决这个问题,批量标准化还确保网络中插入的变换可以表示身份变换(模型仍然在每一层学习一些参数,这些参数在没有线性映射的情况下调整从前一层接收的激活)。这是通过引入一对可学习的参数 gamma_k 和 beta_k 来实现的,这两个参数根据模型学习的内容来缩放和移动归一化值。
最后,结果层的输入(基于先前层的输出 x)由下式给出:
批量标准化算法
训练期间
完全连接的层
全连接层的实现非常简单。我们只需要得到每一批的平均值和方差,然后用之前给出的 alpha 和 beta 参数来缩放和移动特征图。
在向后传递期间,我们将使用反向传播来更新这两个参数。
mean = torch.mean(X, axis=0)
variance = torch.mean((X-mean)**2, axis=0)
X_hat = (X-mean) * 1.0 /torch.sqrt(variance + eps)
out = gamma * X_hat + beta
卷积层
卷积层的实现几乎和以前一样。我们只需要执行一些整形,以适应我们从上一层获得的输入的结构。
N, C, H, W = X.shape
mean = torch.mean(X, axis = (0, 2, 3))
variance = torch.mean((X - mean.reshape((1, C, 1, 1))) ** 2, axis=(0, 2, 3))
X_hat = (X - mean.reshape((1, C, 1, 1))) * 1.0 / torch.sqrt(variance.reshape((1, C, 1, 1)) + eps)
out = gamma.reshape((1, C, 1, 1)) * X_hat + beta.reshape((1, C, 1, 1))
在 PyTorch 中,反向传播非常容易处理,这里重要的一点是指定我们的 alpha 和 beta 是在反向阶段更新它们的参数。
为此,我们将在我们的层中把它们声明为nn.Parameter()
,并用随机值初始化它们。
在推理过程中
在推断过程中,我们希望网络的输出仅取决于输入,因此我们不能考虑对我们之前考虑的批次进行的统计(它们与批次相关,因此它们根据数据而变化)。为了确保我们有一个固定的期望值和方差,我们需要使用整个数据集来计算这些值,而不是只考虑批次。然而,计算所有数据集的这些统计数据在时间和计算上都是非常昂贵的。
[1]中提出的方法是使用我们在训练期间计算的移动统计。我们使用参数β(动量)调整当前批次上计算的期望值的重要性:
这个移动平均值存储在一个全局变量中,该变量在训练阶段更新。
为了在训练期间在我们的层中存储这个移动平均值,我们可以使用缓冲区。当我们用 PyTorch 的方法register_buffer()
实例化我们的层时,我们初始化这些缓冲区。
最终模块
然后,最后一个模块由我们之前描述的所有模块组成。我们在输入数据的形状上添加一个条件,以了解我们正在处理的是全连接层还是卷积层。
这里需要注意的一件重要事情是,我们只需要实现forward()
方法。因为我们的类继承自nn.Module
,所以backward()
函数将自动继承自这个类(谢谢 PyTorch ❤️).
MNIST 实验
为了观察批规范化对训练的影响,我们可以比较没有批规范化的简单神经网络和具有批规范化的另一个神经网络之间的收敛速度。
为了简单起见,我们在 MNIST [3]数据集上训练这两个简单的全连接网络,而不进行预处理(仅应用数据归一化)。
无批量规范的网络架构
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.classifier = nn.Sequential(
nn.Linear(28 * 28, 64),
nn.ReLU(),
nn.Linear(64, 128),
nn.ReLU(),
nn.Linear(128, 10)
)
def forward(self, x):
x = x.view(x.size(0), -1)
x = self.classifier(x)
return x
具有批处理规范的网络体系结构
class SimpleNetBN(nn.Module):
def __init__(self):
super(SimpleNetBN, self).__init__()
self.classifier = nn.Sequential(
nn.Linear(28 * 28, 64),
CustomBatchNorm(64),
nn.ReLU(),
nn.Linear(64, 128),
CustomBatchNorm(128),
nn.ReLU(),
nn.Linear(128, 10)
)
def forward(self, x):
x = x.view(x.size(0), -1)
x = self.classifier(x)
return x
结果
下图显示了我们的SimpleNet
第一层后获得的激活分布。我们可以看到,即使在 20 个时期的训练之后,具有批次范数的激活分布仍然是高斯分布(具有小的尺度和在训练期间学习到的移位)。
我们还可以看到收敛速度方面的巨大改进。绿色曲线(使用批处理规范化)表明,使用批处理规范化,我们可以更快地收敛到最佳解决方案。
结论
使用批量标准化进行训练的优势
- 小批量损失的梯度是对训练集梯度的估计,其质量随着批量的增加而提高。
- 由于 GPU 提供的并行性,批量规模的计算比单个示例的多次计算更有效。
- 在每一层使用批量标准化来减少内部协变量偏移,极大地提高了网络的学习效率。
参考
[1]约夫,谢尔盖和克里斯蒂安·塞格迪。"批量标准化:通过减少内部协变量转移加速深度网络训练."arXiv 预印本 arXiv:1502.03167 (2015)。
[2]下代拉,英敏。"通过加权对数似然函数改进协变量移位下的预测推断."统计规划与推断杂志90.2(2000):227–244。
[3]http://yann.lecun.com/exdb/mnist/ MNIST 数据集,
密码
我在神经网络上做的所有实验的集合——sinitame/神经网络——实验
github.com](https://github.com/sinitame/neural-networks-experiments/tree/master/batch_normalization)
理解 BERT —(变压器的双向编码器表示)
《变形金刚》第 2/3 部分 vs 谷歌 QUEST 问答标注(Kaggle top 5%)。
这是一个由 3 部分组成的系列,我们将经历变形金刚,伯特,和一个动手的 Kaggle 挑战— 谷歌任务 Q & A 标签 来看看变形金刚的行动(在排行榜上排名第 4.4%)。
在这部分(2/3)中,我们将关注 BERT(变形金刚的双向编码器表示)以及它如何成为各种现代自然语言处理任务的最新技术。
由于 BERT 的架构是基于变压器的,所以您可能想要检查变压器的内部结构,这可以在第 1/3 部分中找到。
我们意识到了这样一个事实,即在过去的几年里,迁移学习已经给计算机视觉领域带来了革命性的变化。像 VGG、YOLO、UNET、RESNET 等经过预训练的网络已经在计算机视觉的不同领域表现出了突破性的性能。
我们在自然语言处理领域也看到了类似的方法,如 Word2Vector、GloVe,但 BERT 将它提升到了一个全新的水平。
BERT 是谷歌人工智能语言的研究人员在 2018 年底发表的一篇论文,从那时起,它已经成为许多自然语言处理任务的艺术状态。BERT 采用不同的方法,它同时考虑输入句子的所有单词,然后使用注意机制来开发单词的上下文含义。
这种方法对许多 NLP 任务都很有效,正如最近 ELMo(来自语言模型的嵌入)论文中所示。
在这篇博客中,我们将通过 4 个分主题来讨论 BERT
- 伯特和以前的嵌入技术的区别。
- 引擎盖下看一看: 伯特内部架构。
- 前期训练的 BERT 是如何训练出来的: 让 BERT 如此高效的不同训练方法。
- 输入输出: 如何使用 BERT
BERT 与 Word2Vector 或 GloVe 等其他嵌入生成算法有何不同?
BERT 和 W2V 或 GloVe 的主要区别在于:
- W2V 和 GloVe 单词嵌入是上下文无关的。这些模型只为每个单词输出一个向量(嵌入),将单词的所有不同含义组合成一个向量。例如在给定的句子中:
“如果两个家伙***同时打成平手,这场比赛将导致一场平手。”
Word2Vector 或 GloVe 将无法捕捉到句子中的所有 3 个单词 tie 具有不同的含义,并将简单地为所有 3 个单词返回相同的嵌入。
而 BERT 是上下文相关的,这意味着 3 个单词中的每一个都将具有不同的嵌入,因为 BERT 在生成嵌入之前关注相邻的单词。*** - 因为 W2V 和 GloVe 是上下文无关的,所以我们不需要用于每次训练向量来生成嵌入的模型。我们可以简单地在单词语料库上训练向量一次,然后生成保存单词和它们各自的训练向量的表格或数据库。
而在 BERT 的情况下,由于它是依赖于上下文的,所以每次在生成嵌入或执行任何 NLP 任务时,我们都需要预训练的模型。
现在我们已经对 BERT 有了一些了解,让我们来理解它是如何工作的。
在引擎盖下看一看
BERT 的架构源自变压器。在 BERT 内部有几个堆叠的编码器单元,类似于我们在《变形金刚》中看到的。请记住,在转换器内部,编码器单元如何用于读取输入句子,解码器单元如何用于预测输出句子(逐字逐句),但在 BERT 的情况下,由于我们只需要一个读取输入句子并生成一些可用于各种 NLP 任务的特征的模型,因此只使用了转换器的编码器部分。
BERT 中的双向部分来自于它同时读取所有输入单词的事实。
来源:http://jalammar.github.io/illustrated-bert/
如我之前所说,编码器单元类似于我们在变压器中看到的。有自关注头然后是前馈神经网络。注意头和前馈神经网络也是定义不同类型 BERT 模型的参数。
来源:http://jalammar.github.io/illustrated-bert/
如果我们看看两种伯特架构,即伯特基和伯特大,伯特基和伯特大都采用 512 维输入。
来源:http://jalammar.github.io/illustrated-bert/
- BERT base — 12 层(变压器块),12 个注意头,1.1 亿个参数,输出大小为 768 维。
- BERT Large — 24 层(变压器块),16 个注意头,3.4 亿个参数,输出大小为 1024 维。
来源:【https://medium.com/r/? URL = https % 3A % 2F % 2f towards data science . com % 2 funder standing-Bert-is-it-a-game-changer-in-NLP-7 CCA 943 cf 3 ad
在小队 v1.1 上,BERT 取得了 93.16%的 F1 分数,甚至超过了人类 91.2%的分数:BERT 还在极具挑战性的 GLUE 基准测试(一组 9 个不同的自然语言理解(NLU)任务)上提高了 7.6%的绝对水平。
*本文将编码器单元称为变压器模块。
训练模型
伯特是一个预先训练好的模型。它是在包括整个维基百科(25 亿字)和书籍语料库(8 亿字)在内的大型未标记文本语料库上进行预训练的。让我们来看看用来训练伯特的两种训练方法。
- 屏蔽语言模型(MLM): 在这种方法中,模型被输入一个句子,使得句子中 15%的单词被屏蔽。
BERT 面临的挑战是在给定非屏蔽词的上下文的情况下正确预测屏蔽词。
需要记住的几点是:
-最终编码器模块的输出不直接用于预测,而是在两者之间添加一个具有 GELU 激活的全连接层。然后,该层的输出被转换为 vocab,并应用 softmax 函数来预测屏蔽字。
-损失函数仅考虑屏蔽词的预测值,这使得学习更加基于上下文。
- 下一句预测(NSP): 在这种方法中,模型被输入两句话。伯特面临的挑战是预测两个句子的顺序。
比如,假设这两句话是:
*【我有一支笔】【笔是红色的】。在训练时,如果第一句在第二句之后,BERT 将返回 1,如果第二句在第一句之后,BERT 将返回 0。*
在训练 BERT 模型时,同时使用上面讨论的两种方法。
输入和输出
输入:
了解了 BERT 的架构和训练过程后,现在让我们了解如何在给定一些输入文本的情况下使用 BERT 生成输出。
特殊记号:在为 BERT 生成输入时,会用到一些特殊记号或关键字。主要有【CLS】**【九月】**。
**【CLS】用作添加在输入句子开头的第一个标记。【SEP】在传递多个输入句子时,用作不同句子之间的分隔符。
我们来考虑一个例子:假设我们要将两个句子“我有一支笔”和“这支笔是红色的”传递给 BERT。分词器会先把这些句子分词为:
[‘[CLS]’,‘我’,‘有’,’ a ‘,‘笔’,’[SEP]‘,’ The ‘,‘笔’,’ is ‘,’ red ‘,’[SEP]'] 然后转换成数字记号。
BERT 接受 3 种类型的输入:
- 记号嵌入 : 记号嵌入是输入句子中单词的数字表示。还有一种叫做子词标记化的东西,BERT 使用它首先将较大或复杂的单词分解为简单的单词,然后将它们转换为标记。例如,在上图中,在生成令牌嵌入之前,看看单词“playing”是如何被分解为“play”和“##ing”的。标记化中的这一调整创造了奇迹,因为它利用了一个复杂单词的子单词上下文,而不是像对待一个新单词一样对待它。
- 片段嵌入 : 片段嵌入用于帮助 BERT 区分单个输入中的不同句子。对于来自同一个句子的单词,这个嵌入向量的元素都是相同的,并且如果句子不同,该值也会改变。
我们来考虑一个例子:假设我们要将两个句子“我有一支笔”和“笔是红色的”传递给 BERT。分词器首先将这些句子分词为:
[‘[CLS]’,‘我’,’ have ‘,’ a ‘,’ pen ‘,’[SEP]‘,’ is ‘,’ red ‘,’[SEP]'] 并且这些句子的段嵌入看起来像:
【0,0,0,0,0,0,1,1,1,1,1,1] 注意对应于第一个句子中的单词的所有元素如何具有 - 由于伯特采用 512 维输入,假设我们只有 10 个单词的输入。为了使标记化的单词与输入大小兼容,我们将在末尾添加大小为 512–10 = 502 的填充。连同填充符一起,我们将生成大小为 512 的屏蔽令牌,其中对应于相关单词的索引将具有 1 s,对应于填充符的索引将具有 0 s。
- 位置嵌入: 最后是在 BERT 内部生成的位置嵌入,它为输入数据提供了一种有序感。这和我们在《变形金刚》中讨论的是一样的。
输出:
请记住,对于输入中的每个单词,BERT 库在内部创建了一个 768 维的输出,但是对于分类这样的任务,我们实际上并不需要所有嵌入的输出。因此,默认情况下,BERT 只考虑对应于第一个令牌【CLS】的输出,并丢弃对应于所有其他令牌的输出向量。
这对于垃圾邮件检测之类的分类任务非常有用,对于给定的输入文本,我们需要预测它是否是垃圾邮件。
我们为输入句子生成 token _ embeddings、segmentation _ embeddings 和 mask_tokens,将它们传递给 BERT,它生成 768 维的输出。最后,我们将此输出传递到一个前馈网络,该网络类似于一个具有 2 个节点的密集层,并将 softmax 作为激活函数。
来源:http://jalammar.github.io/illustrated-bert/
上面输出的问题是,对于我们需要更多关注句子语义的任务,比如机器翻译,它并不那么有效。对于这样的任务,建议使用编码器隐藏状态的汇集或平均输出。这有时也被称为特征提取。
在对哪种向量作为情境化嵌入效果最好进行了大量实验后,论文提到了 6 种选择。
来源:http://jalammar.github.io/illustrated-bert/
事实证明,对于大多数任务,将最后四个编码器的隐藏状态串联起来似乎效果最好。
要了解更多关于输入参数和我的 BERT 返回的值,你可以查看这里的官方文档:https://huggingface.co/transformers/model_doc/bert.html
可用性
最后,让我们看看根据本文,BERT 可以执行哪些任务。
来源:http://jalammar.github.io/illustrated-bert/
(一)。对一对句子进行分类,例如一个问答对是否相关。
(二)。对单个句子进行分类,例如检测输入的句子是否是垃圾邮件。
(三)。生成给定问题标题和段落的答案。
(四)。单句标记任务,例如命名实体识别,必须为输入中的每个单词预测标记。
这就是伯特的博客,希望阅读愉快。
我要感谢所有的创作者,他们创作了我写这篇博客时提到的精彩内容。
参考链接:
- 应用人工智能教程:https://www.appliedaicourse.com/
- https://arxiv.org/abs/1810.04805
- https://towards data science . com/Bert-explained-state-of-art-state-language-model-for-NLP-F8 b 21 a9 b 6270
- http://jalammar.github.io/illustrated-bert/
- 【https://www.youtube.com/watch?v=BhlOGGzC0Q0】
- https://towards data science . com/understanding-Bert-is-it-a-game-changer-in-NLP-7 CCA 943 cf 3 ad
最终注释
感谢您阅读博客。我希望它对那些渴望做项目或学习 NLP 新概念的人有用。
在第 1/3 部分中,我们报道了变形金刚如何成为各种现代自然语言处理任务及其工作的艺术。
在第 3/3 部分中,我们将经历一次动手的 Kaggle 挑战——Google QUEST Q&A Labeling以观看变形金刚的行动(在排行榜上排名第 4.4%)。
在 LinkedIn 上找到我:www.linkedin.com/in/sarthak-vajpayee
和平!☮
理解偏差——方差权衡:示例和简单解释
本教程涵盖了你需要知道的关于偏差和方差的一切
偏差和方差是一些很容易理解但很难掌握的主题。因此,在本教程中,我将解释偏差和方差,这样你就再也不用担心它了。不浪费太多时间,让我们开门见山吧。
偏差 101:
偏差与训练集误差有关,也与欠拟合有关。
让我们从上面关于偏见的陈述中理解我的意思。
想象你有一个分类器,任何分类器,你在训练集上训练分类器,然后计算训练集误差;然后,如果训练集误差高,我们可以说我们的模型具有高偏差。并且如果训练集误差低,那么我们可以说我们的模型具有低偏差。
简而言之,高训练集误差对应于高偏差。高训练集误差背后的主要原因是我们的模型对训练数据拟合不足。这就是为什么高偏差也与欠拟合有关。
差异 101:
方差与测试集误差(与训练集误差相比,测试集误差有多大)相关,也与过拟合相关。
让我们再一次理解我上面关于方差的陈述是什么意思。
在训练分类器并获得训练集误差之后,我们必须获得测试集误差,并将训练集误差和测试集误差相互比较。
如果训练集和测试集误差之间的差异更大(测试集误差比训练集误差高得多),那么我们可以说我们具有高方差。获得 0.5%的训练集误差和 10%的测试集误差意味着我们的模型不能很好地概括,这意味着我们的模型也是过度拟合的。
简而言之,当测试集误差比训练集误差大得多时,我们有高方差。当这种情况发生时,我们的模型也是过度拟合的。
偏差-方差权衡 101:
偏差-方差权衡之所以出现是因为,
减少偏差会增加方差&减少方差会增加偏差。
简而言之,如果你试图减少太多的偏差,那么这将导致模型更加复杂和不通用。意味着你会过度适应模型。
如果你试图减少太多的方差,那么这将导致一个更一般化和更简单的模型。也就是说你会低估这个模型。
因此,我们的目标是在偏差和方差之间找到正确的平衡。
可视化不同的偏差-方差情景:
现在,为了更好地理解,让我们在一个包含两个维度(x1 和 x2)和两个标签(o 和 x)的数据集上可视化不同的偏差-方差场景。对于所有不同的偏差-方差情况,我们讨论了不同的决策边界。
这个图有四种不同的偏差-方差情况,你可以在其中找到自己。为了更好地理解,让我们把它们形象化。
Low Bias & High Variance:
如果我们的训练集误差较低(0.5%),而测试集误差较高(10%)。然后,我们有低偏差和高方差条件,这也被称为模型的过拟合。低偏差和高方差的例子可以在二维双标签数据集中看到。
High Bias & Low Variance:
如果我们有一个高的训练集误差(13%),而测试集误差(13.50%)与训练集误差相比并不高,那么我们就有高偏差和低方差的情况。也称为欠拟合。上面可以看到在二维& 2 标签数据集上的例子。
High Bias & High Variance: ***The worst case scenario.***
如果我们有高训练集误差(12%)和高测试集误差(20%),那么我们有高偏差和高方差条件。这是下装和上装的结合。其示例可以在上面的图像中看到,上面显示了二维 2 标签数据集。
Low Bias & Low Variance: ***This is what we want***.
如果你有低训练集误差(0.5%)和低测试集误差(1%),那么我们可以说我们有低偏差和低方差的完美模型。其例子可以在上面看到。
解决高偏差和高方差问题:
如果你有一个高偏差或高方差的问题,那么尝试上述解决方案将会奏效。但是要小心!当你试图减少偏差时,注意方差,因为你不想让偏差太低,因为那会增加方差。这一切都是为了找到偏差和差异的最佳点。
结论:
所以,你将不得不处理偏差-方差权衡,现在你明白了什么是偏差-方差权衡,以及如何解决偏差-方差问题。我想你会更轻松地处理这些事情。
我希望你现在没有任何疑虑。如果您有任何疑问,请在下面留言,我们将在 24 小时内回复。
如果你没有任何疑问,并且喜欢阅读它,或者它以任何方式帮助了你,那么请为它鼓掌。它在这个令人沮丧的新冠肺炎时代激励着我。
平安无事:)
理解 Google 的 Big bird——它是 NLP 的另一个重要里程碑吗?
谷歌研究人员最近在 arXiv 上发表了一篇题为《大鸟:更长序列的变形金刚》的论文。
图片由皮克斯拜的 Gerd Altmann 提供
去年,谷歌的研究人员发布了 BERT,这被证明是自 RankBrain 以来最高效和最有效的算法变革之一。看看最初的结果,BigBird 也有类似的迹象!
在本文中,我介绍了:
- 基于变压器的模型的简要概述,
- 基于变压器的模型的局限性,
- 什么是大鸟,还有
- 大鸟的潜在应用。
我们开始吧!
基于变压器的模型概述
自然语言处理(NLP)在过去的几年中有了很大的改进,基于变形金刚的模型在其中扮演了重要的角色。尽管如此,仍有许多事情有待发现。
Transformers 是 2017 年推出的自然语言处理模型,主要用于提高处理和理解文本翻译和摘要等任务的顺序数据的效率。
与在输入结束之前处理输入开始的递归神经网络(RNNs)不同,变压器可以并行处理输入,从而显著降低计算的复杂性。
BERT 是 NLP 中最大的里程碑式的成就之一,它是一个开源的基于 Transformers 的模型。一篇介绍 BERT 的论文,与大鸟一样,由谷歌研究人员于 2018 年 10 月 11 日发表。
来自变压器的双向编码器表示(BERT)是基于变压器的高级模型之一。它在大量数据(预训练数据集)上进行预训练,BERT-Large 在超过 25 亿个单词上进行训练。
话虽如此,BERT 是开源的,允许任何人创建自己的问题回答系统。这也有助于它的广泛流行。
但是 BERT 不是唯一的上下文预训练模型。然而,与其他模型不同,它是双向的。这也是其成功和应用多样的原因之一。
这个预训练模型的结果绝对令人印象深刻。它被成功地用于许多基于序列的任务,如摘要、翻译等。甚至谷歌也采用 BERT 来理解其用户的搜索查询。
但是,像其他基于变形金刚的模型一样,BERT 也有其自身的局限性。
以前基于变压器的模型的局限性
虽然基于变压器的模型,尤其是 BERT,比 rnn 有很大的改进和效率,但它们也有一些限制。
伯特工作在一个完全自我关注的机制上。这导致每个新输入令牌的计算和存储需求呈二次增长。最大输入大小约为 512 个令牌,这意味着该模型不能用于大型文档摘要等任务的较大输入&。
这基本上意味着在将一个大字符串作为输入应用之前,必须将其分解成更小的片段。这种内容碎片还会导致大量的上下文丢失,从而限制了它的应用。
那么,什么是大鸟,它与 BERT 或者其他基于变形金刚的 NLP 模型有什么不同?
介绍大鸟—适用于更长序列的变压器
如前所述,BERT 和其他基于变形金刚的 NLP 模型的一个主要限制是,它们运行在一个完全的自我关注机制上。
当谷歌的研究人员在 arXiv 上发表了一篇题为 “大鸟:更长序列的变形金刚” 的论文后,这种情况发生了变化。
BigBird 运行在一种稀疏注意力机制上,这种机制允许它克服 BERT 的二次依赖性,同时保留完全注意力模型的属性。研究人员还提供了大鸟支持的网络模型如何超越以前的 NLP 模型以及基因组学任务的性能水平的实例。
在我们进入 BigBird 的可能应用之前,让我们来看看 BigBird 的主要亮点。
大鸟的主要亮点
以下是 BigBird 的一些特性,这些特性使它优于以前基于 transformer 的模型。
- 稀疏注意机制
假设您收到一张图片,并被要求为其创建一个相关的标题。你将从识别图片中的关键物体开始,比如说一个扔“球”的人。
作为人类,识别这个主要对象对我们来说很容易,但是为计算机系统简化这个过程在 NLP 中是一件大事。注意力机制被引入来降低整个过程的复杂性。
大鸟使用稀疏注意力机制,这使它能够处理
序列长度比使用 BERT 可能达到的长度多 8 倍。请记住,这个结果可以使用与 BERT 相同的硬件来实现。
在 BigBird 的上述论文中,研究人员展示了 BigBird 中使用的稀疏注意机制如何与完全自我注意机制(在 BERT 中使用)一样强大。除此之外,他们还展示了*“图灵完全编码解码器有多稀疏”。*
简而言之,BigBird 使用稀疏注意机制,这意味着注意机制是一个令牌一个令牌地应用的,不像 BERT 那样,注意机制只应用于整个输入一次!
- 可以处理长达 8 倍的输入序列
BigBird 的一个关键特性是它能够处理比以前长 8 倍的序列。
研究小组设计了 BigBird,以满足像 BERT 这样的完整变形金刚的所有要求。
使用大鸟和它的稀疏注意力机制,研究小组将 O(n)(伯特的)复杂性降低到仅为 O(n)。这意味着限制为 512 个记号的输入序列现在增加到 4096 个记号(8 * 512)。
创造大鸟的研究人员之一 Philip Pham 在一次 黑客新闻讨论 — 中说,“在我们的大部分论文中,我们使用 4096,但我们可以使用更大的 16k+”
- 根据大型数据集进行预训练
谷歌研究人员在大鸟的预训练中使用了 4 个不同的数据集——琐事-QAHotpotQA-分心物&WikiHop。
虽然 BigBird 的集体预训练数据集远不如 GPT-3 的大(在 1750 亿个参数上训练),但研究论文的表 3 显示,它的表现优于 RoBERTa(一种稳健优化的 BERT 预训练方法)和 Longformer(一种用于长文档的类似 BERT 的模型)。
当一位用户要求 Philip Pham 比较 GPT-3 和大鸟时,他说—“GPT-3 只使用 2048 的序列长度。“大鸟”只是一种注意力机制,实际上可能是 GPT-3 的补充。”******
这篇文章讲述了这个疫情如何给了人工智能-人工智能阿朵急需的推动,以及这个新发现的…
towardsdatascience.com](/the-story-of-newly-found-friendship-ai-ml-and-the-pandemic-6ceb02376ebd)
大鸟的[可能]应用
一篇介绍大鸟的论文是最近才推出的——2020 年 7 月 28 日。因此,大鸟的全部潜力还有待确定。
但是这里有几个可能的应用领域。其中几个应用也是 BigBird 的创作者在 原创研究论文 中提出的。
- 基因组处理
深度学习在基因组数据处理中的使用有所增加。编码器将 DNA 序列片段作为任务的输入,如甲基化分析、预测非编码变体的功能效应等。
BigBird 的创建者说: “我们引入了一种基于注意力的模型的新应用,其中长上下文是有益的:提取基因组序列(如 DNA)的上下文表示”。
在使用 BigBird 进行启动子区域预测时,该论文声称已经将最终结果的准确性提高了 5%!
- 长文档摘要&问答
由于 BigBird 现在可以处理 8 倍长的序列长度,它可以用于 NLP 任务,如较长文档形式的摘要和问题回答。在大鸟的创建过程中,研究人员还测试了它在这些任务中的表现,并见证了“最先进的结果”。
- 谷歌搜索大鸟
谷歌于 2019 年 10 月开始使用 BERT 来理解搜索查询,并为其用户显示更多相关结果。谷歌更新搜索算法的最终目的是比平时更好地理解搜索查询。
随着 BigBird 在自然语言处理(NLP)方面优于 BERT,开始使用这一新发现的更有效的模型来优化 Google 的搜索结果查询是有意义的。
- Web &手机 App 开发
十年来,自然语言处理取得了显著的进步。有了一个 GPT-3 驱动的平台,它可以将你的简单语句转化为已经到位的功能性 web 应用程序(以及代码), 人工智能开发者 可以真正改变你开发 web & web 应用程序的方式。
由于大鸟可以处理比 GPT-3 更长的输入序列,它可以与 GPT-3 一起使用,为您的业务高效快速地创建 web &移动应用 。
结论
虽然关于 BigBird 还有很多有待探索,但它绝对有能力彻底改变自然语言处理(NLP)。你对大鸟及其对 NLP 未来的贡献有什么看法?
参考资料:
【1】曼齐尔·扎希尔和他的团队,《大鸟:更长序列的变形金刚》(2020),《T9》arXiv.org
[2]Jacob Devlin,张明蔚,Kenton Lee,Kristina Toutanova,BERT:用于语言理解的深度双向转换器的预训练,arXiv.org****
了解乳腺癌筛查数据
如何利用数据的流行病学基础来更好地训练和理解人工智能模型
2020 年的头几个月可能会成为现代史上最伟大的疫情的开端。来自世界各地的流行病学家争先恐后地想出紧急计划来控制这种疾病。巨大的生命损失掩盖了更好的消息:人工智能令人印象深刻的进展,特别是筛查性乳房 x 线照相术[1,2]。
人工智能在医学领域的成功应用通常至少与调整数据和调整模型一样重要。不管你给 VGG 或雷斯内特喂狗和猫的照片,他们都学不会在乳房 x 光检查中发现癌症。了解您所处理的数据的流行病学基础真的会有所不同。
然而,进入这个领域可能会令人生畏,因为它需要从过去 60 年的医学文献中提取精华。此外,该领域往往不像大多数人工智能从业者起源的工程或数学等硬科学那样结构化。
这篇文章旨在简要介绍(基于乳房 x 线摄影的)乳腺癌筛查数据及其主要方面,这些方面对于开发人工智能应用程序和理解各种最近关于乳房 x 线摄影的人工智能论文的结果非常重要。
乳腺癌筛查流程
乳腺癌是一种常见疾病:八分之一的女性会在一生中的某个时候患上乳腺癌。大多数欧洲国家、美国和一些亚洲国家通过定期乳房 x 光检查(x 光图像)对超过一定年龄的无症状妇女进行乳腺癌筛查。几项随机对照试验显示死亡率显著降低,因此筛查可以挽救生命[3]。这个筛选过程的执行方式因国家而异。大多数欧洲国家都有国有化的项目,由政府机构用一封信邀请妇女,美国没有。
如果一名妇女参加筛查,乳房 x 线照片会被记录下来。如果这项检查发现可疑,她被召回进行诊断检查,其中可能包括进一步的成像。如果这仍然是不确定的,进行活检。在一些国家,女性会跳过官方邀请,直接进行诊断检查,这被称为灰色筛查。图 1 提供了一个示例。
图一。乳腺癌筛查流程概述,即在欧洲普遍执行的方式。在一些国家(如德国),并非所有被邀请的妇女都参加常规筛查,但有时会投机性地进行诊断性乳房 x 光检查。这被称为“灰色筛选”。(图片作者提供)
除了确切的过程,筛选政策的参数也因国家而异。下面是几个重要的变量。
首次筛查年龄
患癌症的风险随着年龄的增长而增加。在年轻时进行筛查通常是不必要的。例外情况是高危人群中的妇女(例如,因为基因突变使其更有可能患乳腺癌),她们通常从比普通人群更年轻的年龄开始筛查,并进行补充成像,如 MRI。除了风险之外,组织成分会随着年龄的增长而变化,这使得年轻女性很难发现癌症。在大多数欧洲国家,筛查从 50 岁开始(尽管有些例外是瑞典和英国)。在美国和东亚,这一比例通常为 40。
当一名妇女第一次接受筛查时,发现癌症的几率更高,因为你会发现癌症已经发展了几年。第一轮和随后的筛查通常分别称为患病率和发病率筛查。
筛选轮次之间的时间
筛查之间的时间,或筛查间隔从美国的一年到英国的三年不等,在英国大多数欧洲国家使用两年的间隔。与筛查开始和筛查周期的年龄类似,间隔时间在一定程度上决定了每次筛查中检测到(或可能检测到)的癌症数量。图 2 对此进行了说明。
y 轴代表人群中可检测到的癌症数量,x 轴代表时间。一个人在筛查之间等待的时间越长,被检测出的癌症就越多。请注意,这是一种简化,在实践中,并不是群体中的所有女性都被同时筛查。还要注意的是,可检测到的癌症数量不会下降到零:有些癌症被遗漏了,我们将在这篇文章的后面谈到这一点。
图二。说明两种不同的筛查间隔及其对可检测癌症数量的影响。红线表示可检测到的癌症数量,黄线表示一轮筛查。你在两次检查之间等待的时间越长,你发现的癌症就越多。请注意,“一轮筛查”是指所有患者同时接受筛查的单一事件。实际上当然不是这样(图片由作者提供)。
除了上面提到的变量之外,还有一些参数可以通过“比率”来获取,这些参数主要是(除了参与率之外)在计划的敏感性和特异性之间进行权衡的结果。以下是一些常用的费率。
- 参与率在全国性的筛查项目中,政府通常会发出邀请函。参与率描述了实际参加筛查的女性比例,通过所有收到邀请的人进行标准化。请看图 3,我们可以用橙色圆圈除以灰色圆圈来得到参与率。
- 召回率在所有参与筛查的女性中,只有一小部分被召回(被邀请进行后续检查)。这个比例很大程度上取决于筛查项目和/或中心。在美国,召回率通常很高:约为 10%,而在欧洲,这一数字接近 3%。患病率筛查的召回率通常也更高。在图 3 中,用暗红色的圆圈除以橙色的圆圈可以得到召回率。
- 活检率当女性被召回进行后续检查时,他们有时会进行第二次乳房 x 光检查(诊断性乳房 x 光检查),进行超声波检查或活检,如果他们仍然不确定的话。大约 50%的诊断检查会导致活检。活检率是通过将图 3 中的蓝色圆圈除以深红色圆圈获得的。
- 癌症检出率癌症检出率(CDR)就是每 1000 名患者中检出的癌症数量。再次使用图 3 中的斑点,这是通过取亮红色圆、亮蓝色圆的交集并除以橙色圆获得的。就像召回率一样,CDR 通常在患病率筛查上更高。
图三。筛选过程中不同“比率”的说明。大的灰色斑点代表该年龄组中所有接受筛查的女性,橙色圆圈代表所有实际参加筛查的女性,深红色圆圈代表所有被召回的女性,亮蓝色圆圈代表所有接受活检的病例,亮红色圆圈代表所有癌症(图片由作者提供)。
错过的癌症
注意,在图 2 中,可检测的癌症的数量在一轮筛选后没有下降到零,并且在图 3 中,亮红色斑点不是暗红色斑点的子集。这是为了说明癌症被遗漏了。其中一些是在两次筛查之间检测到的,这些被称为*间期癌。*有些在下一次筛查时被查出。
间断性癌症通常用于评估筛查项目的质量。如果有很多,这意味着许多癌症可能在筛查过程中被遗漏,灵敏度太低。然而,间隔癌症并不直接意味着在筛查过程中遗漏了癌症。研究表明,约 20-30%的间隔期癌症和下一轮筛查中检测到的大致相同数量的癌症被遗漏[4,5,6](即,在先前的乳房 x 光片中可检测到)。这是因为癌症可以在最后一轮筛查后开始生长,或者在乳房 x 光片上根本看不到。图 4 提供了这一过程的图示。
图 4。乳腺癌筛查中癌症检测过程的图示。左侧的亮红色圆圈表示在筛查时间 t 内检测到的所有癌症(筛查检测到的癌症)。中间的斑点是一组间隔期癌症,右边的斑点是在下一轮筛查中检测到的癌症(时间 t +间隔期 I)。大约 20 到 30 个间歇期癌症和在下一轮筛查中检测到的癌症在先前的筛查中已经是可见的。所有亮红色斑点代表时间 t 时所有可检测的癌症(图片由作者提供)。
定义标签
定义标签很重要,没有它,人工智能模型就不能很好地学习。对于医学数据来说,这通常没有自然图像简单,因为并不总是清楚“真相”是什么。有时会区分参照标准和黄金标准。在第一种情况下,这是一组读者的最佳猜测,在第二种情况下,它具有一些更多的信息,例如来自组织病理学的信息,读者不能仅通过查看图像来知道。
不幸的是,选择哪一个也不是那么明显。例如,当构建用于筛查的人工智能工具时,你应该只检测癌症还是检测放射科医生认为可疑的一切?如果您选择前者,并使用该工具来协助放射科医生,他们可能会认为奇怪的是,该系统没有标记他们认为非常可疑的东西。但是,如果系统只能访问相同的信息,要比放射科医生好得多就很难了。下面将进一步解释这两种选择。
比拉德分数—参考标准
在大多数欧洲国家,考试是由两个认证的放射科医生阅读。在美国,这通常只是一个人。看完试卷后,她给出一个分数:比拉德分数[7]。这是在乳房 x 线照相术的国际标准化报告系统中定义的等级。这些分数可以解释为[8]:
- 这是个好消息,考试是空的,没有发现。
- 这也是好消息,但是发现了一些良性异常。
- BIRADS 3 在这种情况下,放射科医师不确定,需要半年左右的随访。这个分数在一些国家是不允许的,因为读者会倾向于过多地使用它。
- BIRADS 4a 这意味着在乳房 x 光片上发现了可疑之处,需要进行诊断检查。然而,这实际上是癌症的可能性仍然很小。
- 这意味着患癌症的几率比 4A 略高。这个分数也不是在所有国家都使用,因为 4A 有足够的理由召回这个女人。
- BIRADS 4C 发现了一个非常可疑的病变,读者非常确定这个检查描述的是癌症。
- 这意味着发现了一种或多种教科书上的癌症,并且读者非常确定检查描述的是恶性肿瘤。
从技术上来说,BIRADS 分数不是一个序数量表,因为 BIRADS 1 和 2 具有相似的可疑程度。因此,不应如此解释。
组织病理学结果—金标准
如果诊断检查不能排除癌症,临床医生进行乳腺活检。这通常通过(真空辅助)针芯活检来完成,由此从可疑部位提取一小块组织。放在显微镜下的组织以确定它到底是什么。病理学家通常同意它是否是癌症,但对确切的亚分类有不同意见。
常见的(乳腺癌)分类系统是根据它们的起源组织。乳房中的大多数癌症是癌,这意味着它们起源于上皮组织。乳房由小叶和导管组成,负责乳汁的产生和运输。癌症可以是原位的,这意味着它们没有增殖到其来源组织之外,或者是侵入性的/浸润性的,这意味着癌细胞开始迁移。
取其笛卡儿积,我们得到四种主要类型:浸润性导管癌(最常见)、浸润性小叶癌、导管原位癌和小叶原位癌。在最近的乳腺病理学指南中,最后一种不再被认为是真正的癌症[9]。侵袭性癌症是最危险的,绝对不应该被人工智能系统遗漏。这只是冰山一角,还有其他几十种病理和分类系统[9]。
定义积极和消极
阳性的最常见定义是简单地观察组织病理学结果,即是否为癌症。然而,通过这样做,我们还没有到达那里。因为筛选过程具有时间成分,我们还需要定义何时获得特定结果。(至少)有三种选择:
检查后立即通过活组织检查确诊癌症这是阳性的最常见定义。然而,使用这个定义,很难表明一个算法比人类具有更高的灵敏度,除非你通过阅读来区分它们,或者让读者再次阅读相同的案例。
这个定义相当于只取筛查出的癌症,图 4 中左边的大红色斑点。相应的人的操作点在图 5 的 ROC 图中用红叉表示。
癌症通过活组织检查确认,直到下一次筛查检查这通常用于确定筛查程序的灵敏度,因为它很容易从癌症注册表中计算出来。你可以简单地将筛查检测到的癌症数量除以筛查检测到的+间隔期癌症。这通常会导致 70–80%的灵敏度。尽管它在评估研究中并不常用。
在图 4 中,这意味着将左边的大红色斑点和中间的两个斑点中较大的一个作为阳性。相应的人工操作点由图 5 中的黄色十字表示。
在下一次筛查检查后三个月,通过活检确诊癌症deep mind 在最近的《自然》杂志论文中使用了这个定义【1】。使用这种方法的原因是他们称之为“看门人效应”的东西:通过只将筛查出的癌症视为阳性,你会使结果有偏差,并使人类看起来更好。然而,另一方面,许多将在未来几年发展的癌症在当前的检查中还不可见,这意味着敏感性显著下降。
我们通过将图 4 中的所有大斑点视为阳性来得到这个定义。相应的人工操作点是图 5 中的蓝色十字。
最后一个也可能是最纯粹的定义阳性的方法是简单地观察所有“可检测的癌症”(图 4 中所有的亮红色斑点)。然而,这可能是乏味的,因为它需要确定错过了什么,这只能通过再次阅读案例来评估。
图五。ROC 图中不同阳性定义的不同人为操作点的图示。红色:只有筛查出的癌症被认为是阳性。黄色:筛查出的和间隔期的癌症为阳性。蓝色:检查后两年内发现的癌症被视为阳性(图片由作者提供)。
对人工智能研究的启示
那么这一切和人工智能有什么关系呢?首先,如何定义数据以及如何将数据呈现给模型非常重要。这是人工智能产品的秘密成分的一部分,所以我不会在这里详述。在评估模型并将结果与文献进行比较时,考虑上述变量也是很有趣的。以下是最近文献中的几个例子:
- 如上所述,DeepMind 最近在《自然》杂志上发表的论文[1]使用了一个有点不寻常的积极的定义。这意味着这篇论文的结果看起来比其他论文差很多(包括读者和算法),这让许多人感到困惑。
- 乳房 x 线摄影梦想挑战[10]的最新评估论文展示了两个数据集的模型结果。第一个是由挑战组织者提供的美国数据集,第二个是瑞典数据集。该模型是在第一个数据集上开发的,但当应用于第二个数据集时,表现出更好的性能。作者假设(除其他因素外),这是因为第二组筛查的筛查间隔和癌症构成更长:筛查间隔时间越长,发现的浸润性癌症越多。这些可能更容易被发现。
- 一些人工智能论文结合了筛选和诊断数据[2,11]。虽然癌症在诊断和筛查检查中可能看起来几乎一样,但从诊断数据而不是筛查数据中获得阴性结果可能意味着“更难”(当然也取决于你如何训练你的模型)获得阴性结果,因为这些结果会在常规筛查中被召回,这意味着其中可能有可疑之处。这可能低估了模型在纯筛选数据上的表现。
- 美国和欧洲的筛查存在相当大的差异,这使得方法的比较变得困难。美国通常每年筛查一次,召回率更高。美国的癌症检出率更高,这意味着更多微妙的癌症可能在阳性结果中,可能更难检测到。Yala 等人[12]报告的 AUC 值约为 0.8,与欧洲的研究相比可能显得较低,但可能只是更硬的数据的结果。
总之,乳房 x 线摄影人工智能的最新进展令人兴奋,可能意味着朝着更好的医疗保健迈出了一大步。将数据中的临床和流行病学因素考虑在内有助于理解结果并提高性能。然而,比较研究仍然很复杂。目前最好的比较可能是简单地将每种方法与放射科医生进行对比[13]。
参考文献
[1]麦金尼、西耶克、戈德博勒、戈德温、安特罗波娃、阿什拉菲安、巴克、切苏斯、克拉多、乔治·c、达尔齐和埃特马迪,2020 年。乳腺癌筛查人工智能系统的国际评价。自然, 577 (7788),第 89–94 页。
[2] Kim,H.E .,Kim,H.H .,Han,B.K .,Kim,K.H .,Han,k .,Nam,h .,Lee,E.H .,Kim,E.K .,2020 年。使用人工智能的乳腺 x 线摄影中癌症检测和假阳性回忆的变化:一项回顾性、多读者研究。《柳叶刀》数字健康, 2 (3),第 e138-e148 页。
[3] Marmot,M.G .,Altman,D.G .,Cameron,D.A .,Dewar,J.A .,Thompson,S.G .,Wilcox,m .,2013。乳腺癌筛查的益处和危害:一项独立综述。《英国癌症杂志, 108 (11),第 2205–2240 页。
[4]hov vind,s .,Geller,b .,Vacek,P.M .,Thoresen,s .和 Skaane,p .,2007 年。使用欧洲指南评估挪威乳腺癌筛查项目。《欧洲流行病学杂志》, 22 (7),第 447 页
[5]霍夫、亚伯拉罕森、萨姆塞特、杰赫、维格兰、克莱普和霍夫温德,2012 年。乳腺癌:错过的间隔和筛查-全数字化乳腺摄影和屏-片乳腺摄影检测到的癌症-来自一项回顾性综述的结果。放射学, 264 (2),第 378–386 页。
[6]n . Perry,m . Broeders,c . de Wolf,s . t rnberg,r . Holland 和 von Karsa,l .,2008 年。欧洲乳腺癌筛查和诊断质量保证指南。—总结文件。肿瘤学年鉴, 19 (4),第 614–622 页。
[7] Sickles,EA,D’Orsi CJ,Bassett LW,等. ACR BI-RADS 乳房 x 线照相术.载于:ACR BI-RADS 图谱,乳腺成像报告和数据系统。弗吉尼亚州雷斯顿,美国放射学院;2013.
[8]https://www . Hopkins medicine . org/breast _ center/
[9]朱利亚诺、埃奇、S.B .和奥尔托巴依、G.N .,2018 年。AJCC 癌症分期手册:乳腺癌。外科肿瘤学年鉴, 25 (7),第 1783–1785 页。
[10] Schaffter,t .,Buist,D.S .,Lee,C.I .,Nikulin,y .,Ribli,d .,Guan,y .,Lotter,w .,Jie,z .,Du,h .,Wang,s .和 Feng,j .,2020 年。结合人工智能和放射科医师评估来解释筛查乳房 x 光片的评价。 JAMA 网开, 3 (3),pp.e200265-e200265。
[11] Rodriguez-Ruiz,a .,Lå ng,k .,Gubern-Merida,a .,Teuwen,j .,Broeders,m .,Gennaro,g .,Clauser,p .,Helbich,T.H .,Chevalier,m .,Mertelmeier,t .和 Wallis,M.G .,2019 年。能否通过人工智能自动识别正常检查来减少乳腺 x 线筛查的工作量?可行性研究。欧洲放射学, 29 (9),第 4825–4832 页。
[12]亚拉,a .,舒斯特,t .,迈尔斯,r .,巴兹莱和雷曼,c .,2019 年。一个深度学习模型来分类筛查乳房 x 光片:一项模拟研究。放射学, 293 (1),第 38–46 页。
[13] Lotter,w .,Diab,A.R .,b .,Kim,J.G .,Grisot,g .,Wu,e .,Wu,k .,Onieva,J.O .,Boxerman,J.L .,Wang,m .和 Bandler,m .,2019 年。使用注释有效的深度学习方法在乳房 x 线照相术和数字乳房断层合成中进行鲁棒的乳腺癌检测。 arXiv 预印本 arXiv:1912.11027 。
理解中心性度量
中心性度量是让您更好地了解数据集的工具。它们指向你的分布中心。
中心性度量在数据分析的探索阶段非常有用。在对数据管道的输出进行健全检查时,或者在开始回答一个新产品问题时,您可能会用到它们。
当你读完这篇文章的时候,你会意识到你已经使用中心性度量很长时间了,甚至没有注意到。
为什么您应该关注中心性指标
我们每天都会在某个时候查看数据,无论是在工作中还是在查看我们最喜欢的运动队的数据。
如果您是一名数据科学家,并且正在用数据回答一个产品问题,中心性指标可以帮助您:
- 显示您正在处理的数据的分布中心。
- 定义更简单、更容易解释的指标。大多数时候,您只需要将正确的中心性指标应用到您的问题的上下文中。
- 传达您正在处理的数据的一些重要特征。
- 解读仪表板并发现是否有问题。
这些度量将你指向分布的中心。它们告诉你大多数数据点聚集在哪里。
对于这些图中的每一个,您认为大多数数据点接近什么值?
我们将学习如何回答这个问题。
我们可以用中心性度量来回答这个问题,例如,通过计算
- 平均
- 中位数
- 方式
如果这些名字听起来很陌生,不要担心!我相信你从小就使用过这些指标。你甚至可以根据它们做决定。
让我们来看看这些中心性指标中的每一个。
平均
我们都知道这是平均值
你可能不会称之为卑鄙,但你可能熟悉平均的概念。
例如,如果我告诉你一个 MLB 球员在的平均击球率是 0.3,你就会知道我是通过以下方式得出这个数字的:
这就是我们所说的平均,花哨的数学名称是算术平均。简而言之,大家都称之为卑鄙。
要计算平均值,您需要:
- 将你感兴趣的所有观察值相加,比如一个 MLB 玩家的总点击次数,
- 用它除以你观察到的总数,就像,蝙蝠的总数。
如果我们要使这个公式更通用,我们应该:
其中 obs_1 到 obs_n 为你关心的观察值,n 为你看到的观察值总数。
这就是每个人提到手段时都在谈论的,但是,如果你好奇的话,还有几种其他类型的手段。
诠释意义
当我告诉你一个 MLB 球员的平均击球率是 0.3 时,我的意思是每 10 次击球中,那个球员会击中其中的 3 次。
这是一个令人敬畏的见解,因为现在你有一种方法来比较不同球员的击球率。
这种方法还有一个有趣的特性,它的工作原理就像一种秤或者一场拔河比赛。添加过高或过低的数据点,平均值将向那个方向移动。
如果我给你看一个例子,就很容易发现这一点。
你想学习新的聚会技巧,所以你决定练习倒立。为了看看你是否有进步,你也要计时你能倒立多长时间。
在练习的第一天,你尝试做 5 次倒立:
- 有一次你倒立了一秒钟,
- 下一次你拿着它两秒钟的时候,
- 然后持续 3 秒钟,
- 随着你的进步,接下来的几次你保持 4 秒,然后 5 秒。
第一天倒立练习后的数据集。
第一天练习后,如果你要计算倒立的平均时间,你会做:
太好了,你倒立平均保持了 3 秒钟!
在接下来的练习中,你感觉不舒服,所以你只做了几次倒立。第一次尝试时,你保持 1 秒钟,第二次尝试时,你保持倒立 3 秒钟。
如果我们查看到目前为止您所有练习数据的数据集,我们有:
- 上次练习的数据点,
- 两个新的数据点,聚集在 1 和 3 周围。
第二天倒立练习后的数据集。
你认为这些新数据点将如何影响平均值?让我们计算一下最新的保持时间。
您已经向数据集添加了两次以上的尝试,但是这些保持时间更短。因此,您的平均等待时间现在更短了。
但是你对目前的成绩不满意,想改进你的倒立游戏。所以你决定休息一会儿,改天再练习。
在下一次练习中,你首先做一个倒立 1 秒钟,然后再做一个 3 秒钟,然后打破你的个人记录:做一个倒立 10 秒钟!
第三天倒立练习后的数据集。
请记住,平均值就像一场拔河比赛,所以如果您添加的数据点与您之前看到的数据点大相径庭,平均值就会被推向这些值。
在第三个练习中,您添加了两个数据点,即 1 秒和 3 秒的观察值,这两个数据点将平均值拉向一个较低的值。如果您停在那里,您的平均等待时间确实会更短:
但是你用 10 秒倒立打破了你的个人记录。这个保持时间比你之前的最好时间要长,所以你的平均保持时间会增加。
我们可以说平均值对极端观测值很敏感,因为它向数据集中更极端的值移动。
中位数
中间的数据点
为了计算中位数,你要寻找正好在分布中间的点。所以你要:
- 对数据集进行排序。
- 取中间的值。
- 如果数据集中间有两个数字,求它们的平均值。
从第一天的实践中获取数据集,我们想把它分成大小相等的两部分。我们可以通过分离数字 3 来实现。
第一次练习后倒立保持时间的中位数。
这是我们的中位数,3 秒,这意味着:
- 在这个练习的一半尝试中,你做了长达 3 秒钟的倒立,
- 另一半时间,你手倒立 3 秒以上。
现在,如果我们看看练习的第三天,中间值就不那么容易发现了。我们实际上有两个值,在分布的中间。但是没关系,我们可以将它们平均来计算中位数。
第三次练习后倒立保持时间的中位数。
中位数的力量在于你现在用百分比来思考。您不需要知道数据集的大小来完全解释您的结果,因为您知道 50%的分布将低于中位数,而另外 50%将高于中位数。
如果你仔细观察,当 10 秒倒立将平均值从 3 秒提高到 3.3 秒时,中位数保持不变。这就是为什么我们可以说,中位数对极端的观察更稳健。
方式
最受欢迎的数据点
该模式捕获数据集中最频繁出现的值。
让我们再回顾一遍倒立练习的第一天,画出保持时间的直方图。我们可以看到,在我们的例子中,有两个值是最常见的 1 秒和 3 秒保持时间。
第一次练习后倒立保持时间直方图。
你可能认为,像均值和中值一样,众数必须是一个单一的值。但事实并非如此。该模式将显示更频繁出现的值,它将告诉您分布向哪个值倾斜。
例如,第一次练习的保持时间分布有两个峰值,因为有两个值是最常见的。
在 1 秒内有一个峰值,在 3 秒保持时间内有另一个峰值。因为我们的分布有两个模式,我们说它是双峰的。但是,如果我们的分布只有一个峰值,如一个模式,它将是一个单峰分布。
因为重点是频率而不是值的顺序,所以不需要对数据集进行排序来计算模式。
而且,像中位数一样,该模型对异常值也是稳健的。
如果我们看一下第三次练习,即使记录保持时间为 10 秒,模式也保持不变。我们仍然可以看到 1 秒和 3 秒处的两个峰值,因为这是我们数据集中最常见的值。
第三次练习后倒立保持时间直方图。
该模式的另一个特点是它不局限于数值数据集。您也可以计算分类数据的模式。
如果您的数据集是关于在美国不同州度过的假期,您可以计算数据集的模式。过程是一样的,你绘制直方图或者你去过每个州的次数,模式是你去过最多的州。
既然您对中心性度量有了更多的了解,回答这个问题就很容易了。
对于这些图中的每一个,您认为大多数数据点接近什么值?
现在你知道我们是如何得到这些平均值、中间值和众数的了😀
感谢阅读!