TowardsDataScience 博客中文翻译 2020(三百四十九)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

分类的评估标准已解释

原文:https://towardsdatascience.com/evaluation-metrics-for-classification-cdea775c97d4?source=collection_archive---------41-----------------------

为 Python 中的多类和二类分类问题选择合适的评估度量

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

艾萨克·史密斯在 Unsplash 上拍摄的照片

评估指标是指我们用来评估不同模型的度量。选择一个合适的评估指标是一个决策问题,需要对项目的目标有一个透彻的理解,并且是所有建模过程之前的一个基本步骤。那么为什么它如此重要,我们应该如何选择呢?

为什么重要?

假设你住在一个一年大约 300 天都是晴天的城市。在另外的 65 天里,大雨或大雪会让天气变得很不舒服。在这个想象的世界里,只有两个天气 app。一个应用程序预测天气的准确率为 80%,而另一个应用程序的准确率为 70%。你会选择哪个 app?

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

照片由黑脸田鸡·佐野Unsplash 上拍摄

如果一个应用程序总是预测这个城市是晴天,这个应用程序将有 80%的正确率,即使它从来没有准确预测坏天气。这样的话,这个 app 就没用了!另一方面,另一个应用程序可能在 30%的时间里无法预测晴天,但它会在 80%的时间里准确地告诉你坏天气。在这种情况下,这个 70%正确预测天气的 app 比 80%的 app 有用多了。

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

App 1 在 80%的情况下是正确的,但是错过了所有的坏天气。App 2 在 70%的情况下是正确的,但不会错过任何坏天气。

正如我们在这里看到的,我们如何选择评估我们的模型可以告诉我们的数据非常不同的信息。它必须由项目的目标和数据集的属性决定。任何数据都不会没有方差,任何模型都无法完美地解释这个世界。所以我们必须知道我们宁愿让这样的预测错误发生在哪里。

真或假,积极或消极

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

当模型进行二元预测时,有 4 种可能的结果。一个模型可以预测是()或否(),也可以是正确的()或错误的()。当模型进行多类预测时,同样的逻辑也适用。这个模型预测一个单独的类是或不是,它可能是对的,也可能是错的,我们决定如何组合这些单独的结果。

正确预测的概率

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

正确的案例

精确度和召回率

但是我们如何解释一个模型超出了这四个结果。首先,真阳性(TP)涉及两个事件:模型预测和实际状态。我们的解释可以根据我们对这两个事件的优先顺序而改变。我们可以看到当实际值为正时模型是否预测为正,或者当模型预测为正时我们可以看到实际值是否为正。

比方说,当天气晴朗时,应用程序有 80%的可能性预测天气晴朗。但是这并没有告诉我们任何有用的信息。相反,我们应该看到应用程序显示天气晴朗的频率。这将告诉我们该应用程序在预测晴天时的预测有多精确。这是精度指标,代表模型在所有情况下都正确的概率。

**from** sklearn.metrics **import** precision_score
precision_score(actual_y, predicted_y)
# scoring parameter: ‘precision’

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

陈乐德Unsplash 上拍摄的照片

但有时知道所有阳性病例中阳性预测的概率可能更重要。想象一下,我们正在预测一种食物是否有毒。一个模型的精度(预测食物有毒时食物有毒的可能性)没有预测食物有毒时食物有毒重要。因为如果模型说它有毒,我们可以干脆不吃,但如果它不能告诉我们,我们就冒着吃有毒食物的风险。所以我们想要一个当食物有毒时有很高概率预测阳性的模型。这是针对召回灵敏度指标的情况。也叫真阳性率。它代表了我们的模型在检测阳性病例时的灵敏度。

**from** sklearn.metrics **import** recall_score
recall_score(actual_y, predicted_y)
# scoring parameter: ‘recall’

F1 分数

但是如果这两个都很重要呢?换句话说,在不遗漏正面案例和不遗漏负面案例同等重要的情况下,我们该怎么办?想象一下,你正在预测一种可以通过某种治疗方法治愈的疾病。但是这种治疗对没有患病的人是有害的。在这种情况下,我们需要一个对检测阳性病例敏感且检测同样精确的模型。这时 F1 分数开始发挥作用。 F1 得分是精确率和召回率的调和平均值,是精确率和召回率的平均值。

**from** sklearn.metrics **import** f1_score
f1_score(actual_y, predicted_y)
# scoring parameter: ‘f1’

准确(性)

精确度和召回率指标侧重于预测正面案例:对问题’这是 __?’。但正如我们之前看到的,模型有两种不同的正确方式:它可以在应该说是时说是,也可以在应该说不是时说不是。准确性是在这两种情况下正确的概率。当等级相等时,我们可以使用精确度。比如说我们想预测一张图片是不是狗。我们只想让模特在它是狗的时候说是,在它不是狗的时候说不是。当它是一只猫的时候说它是一只狗和当它是一只狗的时候说它不是一只狗没有任何不同的结果。在这种情况下,我们可以使用精度

**from** sklearn.metrics **import** accuracy_score
accuracy_score(actual_y, predicted_y)
# scoring parameter: ‘accuracy’

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

这是一只狗吗?由 Karsten WinegeartUnsplash 上拍摄

特征

最后,特异性是预测阴性病例的灵敏度(在所有阴性病例中预测阴性的概率)。换句话说,当不遗漏负面案例比犯错更重要时,我们可以使用特异性。假设你想知道井里的水是否可以饮用。你宁愿把可饮用的水标为不可饮用,也不愿错误地标为不可饮用。如果我们交换正反两面,问一个问题’这水有传染性吗?',我们将使用灵敏度而不是特异性

特异性在 Sci-kit 学习包中没有内置功能。相反,您可以使用灵敏度并交换正反例,或者使用混淆矩阵通过自定义函数来计算。

# custom function to calculate specificity for binary classification**from** sklearn.metrics **import** confusion_matrixdef **specificity_score**(y_true, y_predicted):
    cm = **confusion_matrix**(y_true, y_predicted)
    **return** cm[0, 0] / (cm[0, 0] + cm[0, 1])**print**(**specificity_score**(y_true, y_predicted))

多类问题

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

马库斯·斯皮斯克在 Unsplash 上拍摄的照片

微观平均值

我们回顾了如何为我们的二元分类数据选择评估指标。但是,当我们的目标不是“是”或“否”,而是由多个类别组成时,我们该怎么办呢?一种方法是对每个结果进行全局计数,而不考虑类内分布,并计算指标。我们可以通过使用微平均值来实现这一点。

让我们想想使用全局计数意味着什么。如果我们只看全局结果,我们没有之前的四个结果(TP,TN,FP,FN)。相反,我们有真(预测=实际类)或假(预测!=实际类)。因此,微精度微召回准确度都代表准确预测的概率,并且相等。此外,由于 F1 得分精度召回的调和平均值,因此微 F1 得分与其他指标相同。

# these are all the same **recall_score**(actual_y, predicted_y, average = **'micro'**)
**precision_score**(actual_y, predicted_y, average = **'micro'**)
**accuracy_score**(actual_y, predicted_y)
**f1_score**(actual_y, predicted_y, average = **'micro'**)# scoring parameter: 'f1_micro', 'recall_micro', 'precision_micro'

计算全局结果不考虑每一类预测的分布(只计算有多少预测正确)。当数据集包含高度不平衡的类,并且我们不关心控制任何特定类中的预测误差时,这可能会很有帮助。但是正如我们上面讨论的,我们的许多问题确实涉及到对预测误差来源的特定控制。

宏观平均值

另一种处理多类的方法是简单地计算每个类的二元测度。例如,如果我们的目标变量可以是,那么我们对每个预测都会得到一个二元的是或否的答案。这是一只猫吗?这是一只狗吗?这是一只鸟吗?这将导致与我们的目标职业一样多的分数。然后,我们可以汇总这些分数,并使用宏观平均值加权平均值将它们转化为一个单一指标。

宏平均值计算单个类的指标,然后计算它们的平均值。这意味着它对每个类返回的结果给予相同的权重,而不管它们的总体大小。所以它对每个班级的规模不敏感,但它更重视单个班级的表现,即使它是少数。因此,如果很好地预测少数类与整体准确性一样重要,并且我们也相信少数类中有可靠的信息量来准确地表示基本事实模式,则宏观平均值是一个很好的度量。

宏观平均召回分数与多类问题中的平衡准确率相同。

print(**f1_score**(actual_y, predicted_y, average = **'macro'**))
print(**precision_score**(actual_y, predicted_y, average = **'macro'**))# below two are the same measures**from** sklearn.metrics **import** balanced_accuracy_score, recall_score
print(**recall_score**(actual_y, predicted_y, average = **'macro'**))
print(**balanced_accuracy_score**(actual_y, predicted_y))# scoring parameter: 'f1_macro', 'recall_macro', ...etc.

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

马库斯·斯皮斯克Unsplash 上拍摄的照片

加权平均值

概括地说,微观平均给予单个观察值同等的权重,宏观平均给予单个类别同等的权重。根据定义,宏平均值并不关心每个类有多少数据。因此,即使少数群体没有足够的数据来显示可靠的模式,它仍然会平等地衡量少数群体。如果是这种情况,我们可能希望通过使用加权平均值来考虑每个类的总体大小。

# we can also compute precision, recall, and f1 at the same time**from** sklearn.metrics **import** precision_recall_fscore_support
**precision_recall_fscore_support**(actual_y, predicted_y, average = '**weighted**')# scoring parameter: 'f1_weighted', 'recall_weighted', ...etc.

科恩的卡帕

到目前为止,我们讨论的每个指标都讲述了一个故事的一部分,这就是为什么我们希望确保我们的目标是明确的,并与我们选择的指标保持一致。但是,如果我们只是想要一个度量,可以全面地告诉我们,相对于随机机会,我们的模型分类做得如何呢?科恩的 Kappa 将分类器的性能与随机分类器的性能进行了比较。自然地,它考虑了类别不平衡,因为随机分类器将依赖于每个类别的分布。与其他衡量概率的指标不同,科恩的卡帕值从-1 到 1 不等。

**from** sklearn.metrics **import** cohen_kappa_scoreprint(**cohen_kappa_score**(actual_y, predicted_y))

我们研究了二元和多类分类的每个评估指标如何唯一地用于个体问题,以及为什么关注我们选择的指标很重要。我试图用简单的英语复习最基本的小节。但我仍然忽略了另一个非常重要的指标,ROC/AUC 得分,我将在另一篇文章中讨论。

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

只是一只小狗。照片由克里斯·莱佩尔特Unsplash 上拍摄

机器学习中分类问题的评价指标

原文:https://towardsdatascience.com/evaluation-metrics-for-classification-problems-in-machine-learning-d9f9c7313190?source=collection_archive---------27-----------------------

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

Unsplash 上由 Helloquence 拍摄的照片

知道如何创建机器学习模型是成为成功的数据科学家的一大步,但第一个模型很少是“最好”的模型。评估我们的机器学习模型的质量对于继续改进我们的模型至关重要,直到它尽可能地发挥最佳性能。对于 分类 问题, 评估度量 将预期类别标签与预测类别标签进行比较,或者解释类别标签的预测概率。分类问题是常见的,并且具有许多现实世界的应用,例如检测垃圾邮件、定向营销、欺诈检测或评估患者是否处于发展特定疾病诊断的高风险中。在这篇博文中,我们将回顾针对这些类型问题的一些不同类型的分类评估标准。

1.混淆矩阵

2.精确

3.回忆

4.准确(性)

5.f1-分数

6.AUC ROC

混淆矩阵

混淆矩阵是一个包含预测值和实际值的四种不同组合的表格。这是一个很好的方式来可视化不同的输出,并计算精度、召回、 精度、F-1 评分为以及 **AUC-ROC。**我们将在本博客后面更详细地讨论每一个问题。首先,让我们将 TP、FP、FN 和 TN 分解成一个混淆矩阵。

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

混淆矩阵

  • 真阳性(TP) :我们的模型预测的次数是肯定的,实际输出也是肯定的。
  • 真阴性(TN) :我们的模型预测为 NO 而实际输出为 NO 的次数。
  • 假阳性(FP) :我们的模型预测为是而实际输出为否的次数,这就是所谓的 1 类错误。
  • 漏报**【FN】**:我们的模型预测为否,实际输出为是的次数。这就是所谓的第二类错误。

——

精度可以描述为相关实例在检索实例中所占的比例。这回答了“多大比例的积极认同是正确的?”公式如下:

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

根据我们的混淆矩阵,等式可以表示为:

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

精度表示我们的模型所说的相关数据点的比例实际上是相关的。

回忆

回忆,又称敏感性。这回答了“有多少比例的实际阳性被正确分类?”这可以用下面的等式来表示:

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

在我们的混淆矩阵中,它可以表示为:

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

召回表示数据集中哪些实例是相关的。在评估模型时,检查精确度和召回率是很重要的,因为它们通常有相反的关系。当精确度增加时,回忆倾向于减少,反之亦然。

准确度

准确性决定了在所有的分类中,我们正确分类了多少?这在数学上可以表示为:

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

使用我们的混淆矩阵术语,该等式可写成:

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

*我们希望准确度分数尽可能 。值得注意的是,准确性可能不总是使用的最佳指标,尤其是在 类不平衡数据集 **的情况下。*这是指数据在所有类别中的分布不相等。

例如,假设我们正在寻求建立一个模型来帮助诊断脑癌患者。如果我们的模型只是将每个人归类为没有患脑癌,我们在绝大多数情况下都是正确的,但事实上,当某人患有脑癌而没有被诊断出来的代价是毁灭性的。根据行业的不同,这些成本可能会超过模型的准确性。在这种不平衡的情况下,最好使用 F1-Score 来代替。

F1-得分

F1 分数是精确度和召回率的函数。它用于在两个指标之间找到正确的平衡。它决定了在不遗漏大量实例的情况下,模型正确分类的实例数量。这个分数可以用下面的等式来表示:

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

精确度和召回率之间的不平衡,例如高精确度和低召回率,可以给你一个非常精确的模型,但是不能正确地分类困难的数据。我们希望 F1 分数尽可能高,以实现我们车型的最佳性能。

AUC(曲线下面积)ROC(受试者操作特征)曲线

AUC ROC 曲线是显示分类模型在所有阈值的性能的图表。ROC 是概率曲线,AUC 代表可分离度。ROC 绘制了以下参数:

  • 真阳性率(TPR) ,也称回忆或敏感度,在上一节有解释。

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

  • 假阳性率(FPR) ,也称为漏失,假阳性预测与所有实际为阴性的值的比率。

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

RPR 和 FPR 都在范围[0,1]内。该曲线是在范围[0,1]中不同点的 FPR 对 TPR。表现最好的分类模型会有一条类似于下图中绿线的曲线。绿线在曲线下的面积最大。AUC 越高,你的模型表现越好。只有 50-50 准确度的分类器实际上并不比随机猜测好多少,这使得模型毫无价值(红线)。

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

我希望这篇博客有助于澄清用于评估机器学习中分类模型性能的不同度量标准!

如果这篇博文有什么启示,请务必记住,没有适用于所有问题的评估标准。这取决于行业和你要处理什么样的数据集。

感谢阅读!

参考资料:

  1. https://developers . Google . com/machine-learning/速成课程/分类/真-假-正-负
  2. https://towards data science . com/understanding-mission-matrix-a9ad 42 dcfd 62
  3. http://gim.unmc.edu/dxtests/ROC3.htm
  4. https://towards data science . com/beyond-accuracy-precision-and-recall-3da 06 bea 9 f6c
  5. https://towards data science . com/accuracy-precision-recall-or-f1-331 FB 37 C5 CB 9

线性回归中的评价指标和模型选择

原文:https://towardsdatascience.com/evaluation-metrics-model-selection-in-linear-regression-73c7573208be?source=collection_archive---------5-----------------------

数据科学

揭开最常见的度量和模型选择方法的神秘面纱

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

克里斯·利维拉尼在 Unsplash 上的照片

在本文中,我们将回顾线性回归中最常见的评估指标以及模型选择策略。

残差图-评估模型之前

我们知道,线性回归试图拟合一条线,使预测值和实际值之间的差异最小,这些差异也是无偏的。这种差异或误差也被称为残差。( 无偏是指预测值没有系统的分布模式)

残差=实际值—预测值

e=yŷ

值得注意的是,在使用 R 平方等评估指标评估或评价我们的模型之前,我们必须利用残差图。

残差图暴露了一个比其他任何评价指标都有偏差的模型。如果你的残差图看起来正常,继续,用各种度量评估你的模型。

残差图在 y 轴上显示残差值,在 x 轴上显示预测值。如果你的模型有偏差,你就不能相信结果。

显示对应于预测值的误差的残差图必须是随机分布的。然而,如果有任何系统模式的迹象,那么你的模型是有偏见的。

但是随机分布的误差意味着什么呢?
线性回归模型的假设之一是误差必须是正态分布的。这意味着,对于整个预测值范围,确保残差分布在零附近。因此,如果残差是均匀分布的,那么您的模型可能表现良好。

线性回归模型的评估指标

评估指标是衡量模型表现的好坏以及它与关系的近似程度。让我们看看 MSE、MAE、R 平方、调整 R 平方和 RMSE。

均方误差

回归任务最常见的度量是 MSE。它有一个凸起的形状。它是预测值和实际值之差的平均值。因为它是可微分的,并且具有凸形,所以更容易优化。

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

均方差。图片由作者提供。

MSE 惩罚大的错误。

平均绝对误差

这只是目标值和模型预测值之间的绝对差值的平均值。在异常值突出的情况下,不推荐使用。

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

平均绝对误差。图片由作者提供。

MAE 不惩罚大的错误。

r 平方或决定系数

此指标表示由模型的自变量解释的因变量方差部分。它衡量模型和因变量之间的关系强度。

为了理解 R-square 真正代表什么,让我们考虑下面的情况,在有和没有独立变量的知识的情况下,我们测量模型的误差。

计算回归误差 当我们知道自变量的值时,我们可以计算回归误差。

我们知道残差是实际值和预测值之间的差值。因此,RSS(残差平方和)可以计算如下。

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

剩余平方和。图片由作者提供。

计算平方残差 考虑我们不知道自变量的值的情况。我们只有 y 的值。这样,我们就可以计算出 y 值的平均值。这个点可以表示为一条水平线。现在我们计算平均y 值和每隔一个yy值之间的误差平方和。

Y 中的总变化可以被给出为每个点之间的距离的平方差和 Y 值的算术平均值。这可以被称为 TSS (总平方和)。

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

y 或 TSS 的总变化。图片由作者提供。

用 RSS & TSS 计算决定系数,因此我们想找出 Y 的总变化的百分比,由独立变量 x 描述。如果我们知道 Y 的总变化的百分比,即回归线描述的而不是,我们可以从 1 中减去相同的值以获得决定系数或 R 平方。

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

图片由作者提供。

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

决定系数。图片由作者提供。

如果数据点非常接近回归线,则该模型说明了大量的方差,从而导致高 R 值。

然而,不要让 R 值欺骗了你。一个好的模型可以具有低的 R 值,而一个有偏差的模型也可以具有高的 R 值。这就是你应该利用剩余地块的原因。

总之,残差(RSS)与总误差(TSS)的比率告诉您回归模型中还有多少总误差。从 1 中减去该比率,就可以得出使用回归分析消除了多少误差。这就是 R 平方误差。

如果 R 很高(比如说 1),那么模型代表因变量的方差。

如果 R 非常低,那么模型不代表因变量的方差,回归并不比取平均值好,也就是说,你没有使用来自其他变量的任何信息。

负 R 表示你做的比平均值差。如果预测值根本不能解释因变量,那么 RSS ~ TSS 可能为负值。

因此,R 评估回归线周围的分散数据点。

不可能看到 R 为 1 的模型。在这种情况下,所有预测值都与实际值相同,这实质上意味着所有值都落在回归线上。

均方根误差(RMSE)

这是预测值和实际值的平方差的平均值的平方根。

r 平方误差优于 RMSE。这是因为 R 平方是相对测量值,而 RMSE 是拟合的绝对测量值(高度依赖于变量,而不是归一化测量值)。

基本上,RMSE 只是残差平方平均值的根。我们知道残差是一个度量点离回归线有多远的指标。因此,RMSE 测量这些残差的分散。

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

均方根误差。图片由作者提供。

RMSE 惩罚大错误。

模型选择和子集回归

让我澄清一下,当你开发任何考虑到所有预测或回归变量的模型时,它被称为完整模型。 如果你丢弃一个或多个回归变量或预测变量,那么这个模型就是一个子集模型。

子集回归背后的一般思想是找出哪个做得更好。子集模型或完整模型。

我们选择在所有可用候选预测值中表现最好的预测值子集,这样我们就有最大的 R 值、最大的调整 R 或最小的 MSE

然而,R 从不用于比较模型,因为 R 的值随着预测因子数量的增加而增加(即使这些预测因子没有给模型增加任何值)。

选择模型的原因 我们着手选择能很好解释数据的预测因子的最佳子集。由于降低了复杂性,充分解释关系的更简单模型总是更好的选择。增加不必要的回归变量会增加噪声。

我们现在来看看比较和选择最佳模型的最常见标准和策略。

调整的 R 平方—选择标准

调整后的 R 平方与 R 平方的主要区别在于, R 平方描述的是每个独立变量所代表的因变量的方差,而调整后的 R 平方测量的是仅由实际影响因变量的独立变量所解释的方差。

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

调整后的 R 平方。图片由作者提供。

在上面的等式中,n 是数据点的数量,而 k 是模型中变量的数量,不包括常数。

r 往往随着自变量数量的增加而增加。这可能会产生误导。因此,调整后的 R 平方由于增加了不符合模型的独立变量(方程中的 k)而对模型不利。

马洛的 Cp —选择标准

Mallow 的 Cp 衡量模型的有用性。它试图计算均方预测误差。

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

马洛的 Cp 统计。作者图片。

这里的 p 是回归数,*是模型的 RSS 为给定的 p 回归数,*是总 MSE 为 k 总预测数,而 n 是 ***这在 n>>k>*时很有用

Mallow 的 Cp 将完整模型与子集模型进行了比较。如果 Cp 几乎等于 p (越小越好),那么子集模型就是一个合适的选择。

可以为每个子集模型绘制 Cp 对 p 以找出候选模型。

穷举和最佳子集搜索

穷举搜索**查看所有模型。如果有 k 个回归量,就有个可能的模型。这是一个非常缓慢的过程。

最佳子集策略通过为每个 P 值 寻找最小化 RSS 的模型来简化搜索。

逐步回归

逐步回归比穷举和最佳子集搜索更快。选择最佳模型是一个反复的过程。
逐步回归分为向后选择和向前选择。
逆向选择从一个完整的模型开始,然后我们一步一步减少回归变量,找到 RSS 最小、R 最大或者 MSE 最小的模型。要删除的变量是那些具有高 p 值的变量。然而,重要的是要注意,你不能删除一个分类变量的一个层次。这样做会导致一个有偏见的模型。要么删除分类变量的所有级别,要么不删除。
前向选择从一个空模型开始,然后我们逐步增加回归变量,直到我们无法再提高模型的误差性能。我们通常选择调整后 R 最高的模型。

** [## 机器学习中模型评估和选择的终极指南- neptune.ai

在高层次上,机器学习是统计和计算的结合。机器学习的关键在于…

bit.ly](https://bit.ly/3lSfQM2)**

结论

我们讨论了线性回归中最常用的评估指标。我们看到了在多元线性回归和模型选择过程中使用的指标。在浏览了最常见的评估指标和选择策略的用例之后,我希望您理解了它们的潜在含义。下一场见。干杯。

谢谢你

NLP 模型的评估—最新基准

原文:https://towardsdatascience.com/evaluation-of-an-nlp-model-latest-benchmarks-90fd8ce6fae5?source=collection_archive---------18-----------------------

以及为什么它很重要

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

Unsplash 上由 Carlos Muza 拍摄的照片

需要评估指标

其他领域的损失计算

在大多数深度学习任务中——分类、回归或图像生成——评估模型的性能是非常容易和直接的,因为解决方案空间是有限的/不是很大。

在大多数分类问题中,标签的数量是固定的,这使得有可能计算每一类的分数,并因此使得有可能计算从基础事实的损失/偏移。

在图像生成的情况下,输出和地面实况的分辨率是固定的。因此,我们可以计算一个像素的地面真实值的损失/偏移。水平。

在回归的情况下,输出中值的数量是固定的,因此可以为每个值计算损失,即使每个值的可能性是无限的。

注意:我在这篇文章中交替使用了问题和任务,因为每个问题都是围绕着一个模型需要执行的任务来定义的,所以请不要混淆。

自然语言处理中的损失计算问题

在 NLP 的情况下,即使输出格式是预先确定的,尺寸也不能是固定的。如果我们希望我们的模型输出单个句子,那么限制该句子的字数将是违反直觉的,因为我们知道有多种方式来表达相同的信息。

一个例子

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

照片由奥拉夫·特维特Unsplash 拍摄

如果我要求您从以下选项中为上图选择不正确的标题:

  • 房子前面的一辆汽车。
  • 一辆汽车停在房子前面的路上。
  • 一辆灰色汽车停在一所房子前面的路上。
  • 一辆灰色跑车停在一栋房子前。

你可以选择其中任何一个,仍然是正确的,没有一个是不正确的,只是细节有所不同。如果我们的数据集中该图像的真实情况是“一辆灰色汽车在路上”。你将如何教一个模型使用地面真相标签,所有 4 个输出都是正确的?不太容易,是吗?

为什么拥有良好的评估指标很重要?

在我们深入到各种度量的细节和细微差别之前,我想在这里不仅谈谈为什么有一个好的度量很重要,而且还谈谈什么是一个好的度量——在我看来——以防你在文章结束之前没有做到。

开发这些 AI 解决方案的主要目的是将它们应用到现实世界的问题中,让我们的生活变得更轻松、更美好。但是我们的现实世界并不简单。那么,我们如何决定使用哪个模型来解决特定的问题呢?这就是这些指标派上用场的时候了。

如果我们试图用一个模型解决两个问题,我们会想知道模型在这两个任务上的表现,做出明智的决定,意识到我们正在做的权衡。这也是衡量标准的“优点”所在。现实世界充满了偏见,我们不希望我们的解决方案有偏见,因为这可能会产生不可想象的后果。

举个简单的例子,如果我们把一篇文章从 X 语言翻译成英语。对于一个特定的句子,如果我们谈论的是 A 组,它被翻译成“他们做了一个 好的 工作。”相比之下,对于 B 组,它被翻译成“他们做了一件 伟大的 工作。”,这是一个非常明显的迹象,表明我们的模型偏向于 b 组。这种偏见应该在它部署到现实世界之前就知道,度量标准应该有助于我们发现这些偏见。

尽管学习偏差与训练数据的关系更大,而与模型架构的关系更小,但我觉得,拥有一个捕捉偏差的指标或偏差的标准将是一个适应的好做法。

BLEU 评分-双语评估替补演员

顾名思义,它最初用于评估从一种语言到另一种语言的翻译。

如何计算 BLEU 分数?

计算单字精度:

步骤 1: 查看输出句子中的每个单词,如果它出现在任何参考句子中,则给它打分,如果没有出现,则给 0 分。
**第二步:**通过将一个参考译文中出现的单词数除以输出句子中的总单词数,使计数标准化,使其始终介于 0 和 1 之间。

继续上面的例子:
地面真相:一辆灰色的车在路上
S1:《一辆车在路上》会得到 5/6 的分数,
S2:《一辆灰色的车在路上》会得到 6/6 的分数,
S3:《一辆灰色的车在路上》也会得到 6/6 的分数!
事实上 S4:“车车车车车车”也将获得 6/6 的分数!!

这似乎是不正确的;我们不应该给 S3 和 S4 打这么高的分。为了惩罚最后两种情况,我们使用一元、二元、三元和 n 元的组合,将它们相乘。使用 n-grams 在某种程度上帮助我们捕捉句子的顺序——S3 情景。我们还根据每个单词在任何参考句子中出现的最高次数来限制计数每个单词的次数,这有助于我们避免不必要的重复单词——S4 情景。

最后,为了避免因为标题太短而错过细节,我们使用了简短惩罚。我们通过将它与长度最接近的参考句子的长度进行比较来做到这一点。

if (length(output) > length(shortest_References))
    brevity_Penalty = 1;
else { // output caption is shorter.
    brevity_Penalty = exponent(length(output)/length(shortest_Reference)-1);
}BLEU Score = unigram_precision * bigram_precision *...*            ngram_precision * brevity_Penalty; 

BLEU 的问题是:

  • 不考虑意义:现实中,句子中的单词对句子意义的贡献是不平等的。但是 BLEU 方法对所有单词的评估都是平等的。
    地面真相:我有一辆栗色车。S1:我有一辆蓝色的汽车。S2:我有一辆红色的汽车。S3:我有一艘栗色的船。所有人都会得到相同的分数,尽管 S1 和 S3 在这里传达了错误的信息。
  • 不直接考虑句子结构:无法捕捉句法。词序对一句话的得分贡献不大。或者在翻译的情况下,句子的顺序。
    例如,如果我试图评估一部小说中某一章的翻译,我交换了翻译的前半部分和后半部分,这只会对 BLEU 分数产生一点点影响。同时,翻译的故事情节会被完全扭曲,这只有在诺兰电影中才能接受。
  • 不处理形态丰富的语言。如果你想用法语说“我很高”,“我很高”和“我很高”都是正确的翻译。唯一的区别是“grand(e)”这个词的性别。但是对于一个布鲁来说,这些词可能会像白天和黑夜一样不同。如果一个模型预测了其中一个,而期望另一个,BLEU 只会认为这是一个不匹配。

SQuAD —斯坦福问答数据集

在这种类型的度量测试中,给定一个问题和一个文本,模型需要从给定的文本中预测答案。

【以防你不熟悉《奇幻参考》,这里是你需要知道的一切,以便理解我的类比:
哈利波特是 JK 罗琳的系列丛书;《波西·杰克森》&《奥运选手》是雷克·莱尔顿制作的一个完全不同且毫无关联的系列;在《哈利·波特》系列中,主角——哈利·波特,在 90%的时间里,要么处于困境,要么正在陷入困境;
波西·杰克森是我提到的另一个书系列的主角,也和哈利有同样的惹上麻烦的倾向;《哈利·波特》系列中有一个角色叫珀西,虽然不是很重要。是的,这就是你所需要知道的。😄]

如果我给你一篇哈利波特系列的课文,问你“为什么波西·杰克森和他的朋友会有麻烦”?人类能够分辨出问题和文本没有上下文关系,因此问题是不可回答的;一个陶工脑袋会和我断绝关系。但当被问及 NLP 模型时,它可能只是试图预测最有可能的答案,这可能是关于某个陷入困境的其他角色——暗示哈利·波特或某个名叫珀西或杰克逊的角色所做的事情。

为了解决这些弱点,SQuAD 2.0 将现有的小队数据与超过 50,000 个无法回答的问题相结合,这些问题由人群工作者以敌对的方式编写,看起来与可回答的问题相似。为了在 SQuAD 2.0 上做得好,系统不仅必须在可能的情况下回答问题,还必须确定何时没有答案被段落支持并放弃回答。

你可以在这里查看班长板

MS MACRO —机器阅读理解数据集

这是一个大规模的机器阅读理解数据集。它由以下任务组成:

  • 问题回答——根据问题和段落上下文所能理解的上下文段落,生成一个结构良好的答案(如果可能的话)。
  • 段落排名 —对给定问题的一组检索到的段落进行排名。
  • 关键短语提取 —在给定一组上下文段落的情况下,预测问题是否可回答,并像人类一样提取和合成答案。

该数据集开始关注 QnA,但后来发展到关注任何与搜索相关的问题。

该数据集由 1,010,916 个匿名问题组成——从 Bing 的搜索查询日志中取样——每个问题都有一个人为生成的答案和 182,669 个完全由人重写的生成答案。此外,该数据集包含 8,841,823 个段落,这些段落是从 Bing 检索的 3,563,535 个 web 文档中提取的,为管理自然语言答案提供了必要的信息。

胶水和强力胶——通用语言理解评估

GLUE 和 SuperGLUE 评估模型在一组任务上的性能,而不是单个任务,以获得性能的整体视图。它们由单句任务、相似性和释义任务以及推理任务组成。

我浏览了他们的论文,并收集了他们各自任务的简要概述。为了更快更好地理解,我将它们组织成这些表格。如果你想详细了解每项任务,请浏览文章末尾参考资料部分的链接。

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

胶水中的任务。

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

强力胶中的任务。

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

超级胶水纸上给出的每个任务的例子。来源

务必检查胶水强力胶各自的导板。

了解这些指标无论如何都不会帮助您提高模型的性能。然而,它肯定会帮助你理解更大的画面,我们目前在这个领域试图解决的问题!希望你觉得有用。

参考资料和其他好读物:

我很高兴你坚持到了这篇文章的结尾。🎉我希望你的阅读体验和我写这篇文章时一样丰富。💖

请点击这里查看我的其他文章

如果你想联系我,我会选择推特。

情感分析的评价:反思自然语言处理的过去和未来

原文:https://towardsdatascience.com/evaluation-of-sentiment-analysis-a-reflection-on-the-past-and-future-of-nlp-ccfd98ee2adc?source=collection_archive---------31-----------------------

我们能不能发现一些仍然缺失的元素的线索,从而使 NLP 更加有效?我们应该在哪里寻找下一件大事?

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

Javier Allegue Barros 在 Unsplash 上拍摄的照片

我最近收到一篇新论文,题为“金融中的情绪分析评估:从词典到变形金刚”,发表于 2020 年 7 月 16 日的 IEEE。作者 KostadinMishev、Ana Gjorgjevikj、Irena Vodenska、Lubomir T. Chitkushev 和 DimitarTrajanov 比较了应用于两个已知金融情绪数据集的一百多种情绪算法,并评估了它们的有效性。虽然这项研究的目的是测试不同自然语言处理(NLP)模型的有效性,但论文中的研究结果可以告诉我们更多关于 NLP 在过去十年中的进展,特别是更好地了解哪些因素对情绪预测任务贡献最大。

所以让我们从情绪预测任务的定义开始。给定一组段落,该模型将每个段落分为三个可能的类别:正面情绪、负面情绪或中性情绪。然后,基于混淆矩阵(3X3)来评估该模型,该混淆矩阵是根据预测情感与基本事实(每个段落的真实标签)的计数来构建的。

作者实施的评估指标被称为马修斯相关系数(MCC),并作为二元(两类)分类质量的衡量标准(马修斯,1975)。尽管 MCC 度量仅适用于二元情况,但是作者没有提及他们如何在多类别情况(3 个情感类别)中应用 MCC 函数。他们是使用了微平均法,还是对多类情况应用了广义方程?

作者根据文本表示将 NLP 模型分为五大类:(1)基于词汇的知识,(2)统计方法,(3)单词编码器,(4)句子编码器,(5)转换器。每个类别应用了几个不同的模型,其性能记录在表中

上表展示了这些年来在文本表示方法的推动下情感分析的进展。作者证实,与其他评估方法相比,transformers 表现出更好的性能,并且文本表示扮演了主要角色,因为它将单词和句子的语义输入到模型中。

但是等等!关于 NLP 的未来,也许可以从这个实验中得出更多的结论。我们能发现仍然缺失的元素的线索,使 NLP 在更复杂的任务中更有效吗?为了用语言模型更好地表现人类语言,下一个重大突破可能是什么?

为了解决这个问题,我开始进一步挖掘模型的结果,寻找文本表示、模型大小和模型性能之间的联系,试图提取模型大小和文本表示对最终性能的影响。基于作者的分析,我创建了下图。下图显示了每个模型的 MCC 分数,作为模型数值参数的函数。颜色代表模型主类别。

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

图 1:作为模型中参数数量(对数标度)的函数的情感分类(MCC 分数)的改进

从我的分析中可以看出,情绪预测任务的进展包括两个阶段。第一阶段主要归功于更好的文本表示,而第二阶段是由于引入了转换器,该转换器可以通过增加网络规模和管理数百万个参数来处理巨大的语料库。

从上图中可以看出,从 80 年代初开始,文本表示发生了三次重大变革。第一次是从词汇表征到嵌入向量表征。嵌入向量的主要优点是其无监督的性质,因为它不需要任何标记,同时仍然捕获单词之间有意义的语义关系,并受益于模型的泛化能力。重要的是要记住这些嵌入模型,比如 word2vec 和 GloVe,是上下文无关的。它们将同一个相关向量分配给同一个单词,而不管该单词周围的上下文。因此,它们不能处理自然语言中的多义性或复杂语义。

然后,面向 2016 年推出了与上下文相关的单词表示法,如埃尔莫和 GPT。这些模型具有依赖于其上下文的单词的向量表示。埃尔莫双向编码上下文,而 GPT 从左到右编码上下文。它们的主要贡献是处理多义词和更复杂的语义的能力。

NLP 中最近的革命是 BERT(来自转换器的双向编码器表示),它结合了双向上下文编码,并且对于广泛的自然语言处理任务只需要最小的架构改变。BERT 输入序列的嵌入是记号嵌入、段嵌入和位置嵌入的总和。BERT 和以下模型的独特之处在于,它们可以处理一批序列,从 1M 的参数到达到 500M 以上的最新模型。从图中可以看出,模型中的参数数量是过去 4 年中性能持续改善的主要原因。

尽管 NLP 模型在最近几年取得了长足的进步,但仍有很大的改进空间。根据多项研究,1,2 仅仅增加网络规模是不够的,即使在今天该模型也处于过度参数化的状态。下一个突破可能来自文本表示的进一步发展,届时 NLP 模型将能够更好地捕捉语言的组成性(通过组成其组成部分的含义来学习一大段文本的含义的能力)。语法推理领域是寻找新的文本表示方法的好地方。通过学习受控形式语法,我们可以更深入地了解应该在测试方面综合处理(Solan et al,2005)的元素,如系统性、替代性、生产率、本地化等。(Hupkes 等人,2019;Onnis & Edelman,2019)。

传记

(1) Hupkes,d .,Dankers,v .,Mul,m .,& Bruni,E. (2019)。神经网络的组合性:整合符号主义和连接主义。 arXiv 预印本 arXiv:1908.08351 。‏

(2)科瓦列娃、罗马诺夫、罗杰斯和拉姆斯斯基(2019)。揭露伯特的黑暗秘密。 arXiv 预印本 arXiv:1908.08593 。‏

(3) Onnis,l .,& Edelman,S. (2019)。本地与全球语言统计学习。‏

(4) Solan,z .,Horn,d .,Ruppin,e .,和 Edelman,S. (2005 年)。自然语言的无监督学习。美国国家科学院院刊102 (33),11629–11634。‏

(5)米舍夫,k .,Gjorgjevikj,a .,沃登斯卡,I .,奇库舍夫,L. T .,和特拉亚诺夫,D. (2020)。金融中情感分析的评价:从词典到变形金刚。 IEEE 访问8 ,131662–131682。‏

FlinkSQL 和 Zeppelin 危机事件驱动供应链

原文:https://towardsdatascience.com/event-driven-supply-chain-for-crisis-with-flinksql-be80cb3ad4f9?source=collection_archive---------21-----------------------

开源流媒体技术如何帮助改善新冠肺炎供应链

原载于https://www . data crafts . fr

技术正在帮助世界度过由 Covid19 病毒引起的卫生、经济和社会危机。人工智能帮助科学家了解病毒,以找到治疗方法/疫苗。移动应用程序让远方的家人和朋友保持联系。物联网用于管理通过蓝牙点对点交互传播的病毒。更多关于技术如何帮助的例子在许多博客文章中列出。在这篇博文中,我将重点讨论流媒体技术如何在危机期间帮助供应链。

供应链如何受到挑战?

一张图胜过千言万语。下面是我在宣布封锁前几天在巴黎一家商店拍的照片。吓人吧?焦虑之下,人们开始囤积食物,尽管 CPG 行业已经宣布不会出现短缺。这种行为造成了暂时的短缺,使人们感到恐惧,阻碍了他们对官方信息的信任。他们开始囤积货物,使情况变得更糟。恶性循环。

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

宣布社会距离后,在巴黎的意大利面货架上肆虐

零售只是大众熟知的一个例子。医院供应链面临的挑战要大得多。Covid19 病例的指数级增长对检测试剂盒、个人防护设备、药物、ICU 病床、呼吸机和工作人员造成了持续的压力。在法国,病人通过医疗列车和航班在城市间转移。他们中的一些人在德国受到照顾。航空公司正在帮助货运活动从中国运送数百万个口罩。每个决定都需要在许多未知的情况下快速做出,并且会影响人们的生活。

但是巨大的挑战伴随着巨大的机遇。

借助物联网和流媒体平台,我们可以实时了解整个供应商、国家甚至行业的库存和需求。当库存因意外需求而更快耗尽时,我们可以立即触发警报。可以对行动进行优先排序,决策得到数据的支持,可以快速做出决策以适应不断变化的模式。此外,该平台有助于收集更多数据,从而使预测更加准确。

开源事件驱动的零售供应链

为了实际起见,让我们看看如何利用 Cloudera 数据平台Cloudera 数据流中的开源软件来实现这一愿景。该架构使用:

  1. MiNiFi :在每个销售点(POS)部署小型数据收集代理,收集销售交易,并实时发送到数据中心或云端。
  2. 阿帕奇尼菲:收集来自代理商的销售事件,并发送给阿帕奇卡夫卡经纪人。NiFi 还将来自几个数据库的商店和产品数据实时导入 Kafka。
  3. Apache Flink :处理来自不同 Kafka 主题的数据,以丰富 POS 事件,在时间窗口上聚合它们,检测阈值违反等。Apache Flink 有一个 SQL API,使得编写管道更加容易。
  4. Apache Zeppelin :是一款交互式笔记本,支持 Apache Flink 和 Flink SQL,用于探索数据、构建实时仪表盘以及与不同团队交流信息。
  5. Kafka Connect: 收集不同主题的事件,并将其存储到类似 S3 或 ADLS 的云存储中。数据保存在更便宜的存储设备上,用于长期归档或其他批量使用情况。
  6. Cloudera 机器学习:处理数据,训练机器学习模型,提取特征,根据各种数据集预测未来模式。

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

面向零售的事件驱动架构的高级架构。商店图标来自 by 视频整形CC-BY-SA 4.0

在接下来的部分中,我们将关注事件流管道。

数据模型和摄取

我在几篇博客中讨论过 NiFi 和 MiNiFi 功能。我们可以在商店中部署数千个小型代理,并从一个中心位置控制它们。每个代理可以在本地从商店的数据源(数据库、文件或类似 MQTT 的轻量级代理)收集数据,并将其发送到中央 NiFi。关于这部分的更多信息,可以参考我写的关于如何建立一个工业物联网系统,然后用商店代替工厂的详细博文。

[## 如何使用 Apache NiFi、MiNiFi、C2 服务器、MQTT 和 Raspberry Pi 构建 IIoT 系统

您认为构建一个先进的工业物联网原型需要多长时间,它可以:

medium.com](https://medium.com/free-code-camp/building-an-iiot-system-using-apache-nifi-mqtt-and-raspberry-pi-ce1d6ed565bc)

一旦在 NiFi 中接收到数据,我们就可以通过一个简单的流程将事件发布到 Kafka。下面的流程为每个事件附加一个模式名(pos ),并将其推送到 pos Kafka 主题。

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

NiFi 使用模式注册表向 Kafka 发送 POS 事件

来自商店的事件具有以下属性。

{
  "tstx" : "1586615062225", //transaction timestamp
  "idtx" : "1871134",// transaction identifier
  "idstore" : 5, // store identifier
  "idproduct" : 8, // product identifier
  "quantity" : 3 // quantity at which the product was sold
}

此事件意味着商店“5”售出了 3 件产品“8”

类似地,NiFi 可以监视几个表,并把新的或更新的行增量地接收到 Kafka 中。在我们的用例中,我们从一个商店表中获取数据,该表中有每个商店的详细信息,比如用户名和位置。

{
  "idstore":1,
  "namestore":"supermarket",
  "city":"paris"
}

我们还从一个产品表中获取数据,该表包含每个产品的详细信息,比如产品名称和在给定频率下观察到的平均销售量。

{
  "idproduct":8,
  "nameproduct":"hand-sanitiser",
  "avgsales":2
}

数据摄取的结果可以在下面的视频中看到,我使用 Streams Messaging Manager 来探索三个 Kafka 主题的内容: posstoresproducts 。这些主题被划分,事件根据 id 字段进行分配,以便在以后对处理进行负载平衡。我们还准备了第四个主题, alerts ,稍后当我们检测到某个产品的销售速度比平时快时,我们将使用它来发送警报。从视频中,你还可以看到生产者和消费者对每个话题的看法。

卡夫卡主题、事件、生产者和消费者概述

使用 Flink SQL 和 Zeppelin 进行数据探索

Apache Flink 是一个现代的、开源的流引擎,我们将使用它来构建我们的数据管道。Flink 可用于实时 ETL,其中事件被实时转换。它还可以用于计算基于不同时间操作(事件时间和处理时间、窗口、全状态处理等)的高级 KPI。Apache Flink 拥有强大的 API,如 DataStream 和 ProcessFunction APIs,可用于构建现代事件驱动的应用程序。它还具有易于使用的表格和 SQL API,使分析用户可以使用这项技术。我们将利用 SQL API 使这个博客能够被更广泛的社区访问。要使用 Flink SQL,现成的选项是 SQL 客户端 CLI。让我们先用它来探究 POS 主题的内容:

使用 FlinkSQL CLI 客户端实时读取事件

Flink SQL CLI 非常适合简单的分析。但是,对于想要测试和修改几个查询的数据探索来说,这并不方便。幸运的是,数据科学笔记本 Apache Zeppelin 支持运行 Flink 和 Flink SQL 代码。我们将在接下来的章节中使用它。我们开始吧!

我们手里有什么?

为了在 FlinkSQL 中处理我们的流,我们需要创建表。一个表定义了 Kafka 主题中的事件模式,并提供了对 SQL API 的访问。例如,要创建我们的 POS 流的表,我们可以使用:

CREATE TABLE pos (
   tstx BIGINT,
   idtx BIGINT,
   idstore INT,
   idproduct INT,
   quantity INT,
   timetx AS CAST(from_unixtime(floor(tstx/1000)) AS TIMESTAMP(3)),
   WATERMARK FOR timetx AS timetx - INTERVAL '10' SECOND
) WITH (
   'connector.type' = 'kafka',
   'connector.version' = 'universal',
   'connector.topic' = 'pos',
   'connector.startup-mode' = 'latest-offset',
   'connector.properties.bootstrap.servers' = 'kafka-url:9092',
   'connector.properties.group.id' = 'FlinkSQLPOS',
   'format.type' = 'json'
);

这创建了一个名为 pos 的表,指向 pos Kafka 主题中的事件。这些事件采用 JSON 格式,拥有我们之前介绍的五个属性。除了这些属性之外,它还定义了一个事件时间字段,该字段是根据事务时间戳(tstx)计算的,并定义了一个 10 秒的水印。该表使用 Flink Kafka 连接器连接到 edge2ai-1.dim.local:9092 中运行的集群。类似地,在 Flink SQL 中使用商店和产品表之前,我们需要创建它们。

CREATE TABLE stores (
   idstore INT,
   namestore STRING,
   city STRING
) WITH (
   'connector.type' = 'kafka',
   'connector.version' = 'universal',
   'connector.topic' = 'stores',
   'connector.startup-mode' = 'earliest-offset',
   'connector.properties.bootstrap.servers' = 'kafka-url:9092',
   'connector.properties.group.id' = 'FlinkSQLStore',
   'format.type' = 'json'
);CREATE TABLE products (
   idproduct INT,
   nameproduct STRING,
   avgsales INT
) WITH (
   'connector.type' = 'kafka',
   'connector.version' = 'universal',
   'connector.topic' = 'products',
   'connector.startup-mode' = 'earliest-offset',
   'connector.properties.bootstrap.servers' = 'kafka-url:9092',
   'connector.properties.group.id' = 'FlinkSQLProducts',
   'format.type' = 'json'
);

我们准备好查询我们的表: SELECT * FROM pos 。这就像在 SQL 数据库中查询数据一样简单。这是它在齐柏林飞艇中的样子。事件不断地从 Kafka 中被消费并打印在 UI 中。FlinkSQL 作业在 Flink 仪表板和 Yarn UI 上可见。

在 Zeppelin 中创建 FlinkSQL 表

Zeppelin 有一个嵌入在笔记本中的简单数据可视化的好特性。我们可以用它来绘制按产品和商店分组的事件。这对于快速浏览非常有用,仅适用于结果集,而不是所有数据或时间窗口。真正的分组应该以后在 FlinkSQL 里做。

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

按商店组织的售出产品数量图表

流到流的连接和丰富

在上图中,我们可以看到按产品和商店分组的事件。但是,我们只有产品和店铺 id。对理解正在发生的事情没什么用。我们可以通过将产品和商店流加入 POS 流来丰富交易。使用 idproductidstore ,我们可以获得其他元数据,比如产品名称和城市。

请记住,POS 流是一个高速的仅附加流,在数据仓库世界(DWH)中也称为事实表。商店和产品是缓慢变化的流,在 DWH 世界被称为维度表。它们也是只附加的流,其中更新是具有现有 ID 的新事件。即使流连接看起来类似于表连接,但还是有根本的区别。例如,如果我有几个关于产品 x 的事件,我将加入哪一个 POS 事件?最新的那个?时间戳最近的那个?为了保持这篇博客的简洁,我将暂时忽略这些方面,我将在未来几天发表一篇关于 streams joins 的深度博客。

转到 FlinkSQL,这里是我们如何加入我们的三个流:

SELECT tstx,idtx, namestore, city, nameproduct, quantity 
FROM 
   pos AS po, 
   stores AS s,
   products AS pr
WHERE po.idstore = s.idstore AND po.idproduct = pr.idproduct;

使用 Zeppelin 图表,我们可以看到我们的产品在每个城市的销售速度。下面的视频展示了查询的执行。

使用 SQL 连接丰富数据流

快速检测用完的产品

现在我们对数据有了更好的理解,我们可以寻找产品销售模式,并将它们与历史数据进行比较。我们不能让某人一直监控仪表板,我们希望生成警报。

请记住,在我们的 products 表中,我们有一个列 avgsales,它告诉我们在给定的时间范围(例如 4 小时)内,我们通常在每个商店销售的每个产品的平均数量。出于演示的目的,我们将考虑一个非常短的时间尺度(15 秒)来加速。那么如何才能检测出一个产品卖的快呢?

首先,我们需要在 15 秒的时间窗口内聚合我们的 POS 事件。对于每个窗口,我们将计算售出数量的总和。我们希望每个商店也这样做,因此也按商店分组。该查询如下所示。请注意,该查询引入了两个新列,starttime 和 endtime,分别表示时间窗口的开始和结束。

SELECT TUMBLE_START(timetx, INTERVAL '15' SECOND) as starttime, TUMBLE_END(timetx, INTERVAL '15' SECOND) as endtime, idstore, idproduct, SUM(quantity) as aggregate
FROM pos
GROUP BY idproduct,idstore, TUMBLE(timetx, INTERVAL '15' SECOND)

一旦我们有了聚合流,我们希望将它与商店和产品流结合起来,以获得其他字段,如 avgsales。我们希望将计算出的总量 aggregate 与 hostorical avgsales 进行比较。这给了我们完整的查询:

SELECT starttime, endtime, nameproduct, aggregate, avgsales, namestore, city 
FROM
  (
    SELECT TUMBLE_START(timetx, INTERVAL '30' SECOND) as starttime,     
    TUMBLE_END(timetx, INTERVAL '30' SECOND) as endtime, idstore,   
    idproduct, SUM(quantity) as aggregate
    FROM pos
    GROUP BY idproduct,idstore, TUMBLE(timetx, INTERVAL '30' SECOND) 
  ) AS a,
  products as p,
  stores as s
WHERE aggregate > avgsales AND a.idproduct = p.idproduct AND a.idstore = s.idstore;

下面的视频展示了 Zeppelin 中查询的执行和 Flink 仪表板中生成的查询计划。我们可以观察到,在所有城市,洗手液的购买速度都比平时快。

当产品销售速度比平时快时发出警报

创建新的通知流

既然我们对我们的数据处理和探索感到满意,我们需要创建一个新的警报流。该流可用于通过移动应用程序向商店经理发送推送通知。收到此通知后,商店经理可以要求员工优先重新装满特定产品的货架。这在员工数量可能减少的危机时期非常重要。这将有助于主动管理当地活动,以避免空货架,从而减少焦虑和购买可能无法获得的产品的冲动。

FlinkSQL 也可以用来创建新的 Kafka 流。我们必须像以前一样创建一个新表。

CREATE TABLE alerts (
   starttime TIMESTAMP(3),
   endtime TIMESTAMP(3),
   nameproduct STRING,
   aggregate INT,
   avgsales INT,
   namestore STRING,
   city STRING
) WITH (
   'connector.type' = 'kafka',
   'connector.version' = 'universal',
   'connector.topic' = 'alerts',
   'connector.startup-mode' = 'latest-offset',
   'connector.properties.bootstrap.servers' = 'kafka-url:9092',
   'connector.properties.group.id' = 'FlinkSQLAlerting',
   'format.type' = 'json'
);

然后,我们可以将之前的聚合和警报查询嵌入到 insert into 语句中。

INSERT INTO alerts
   SELECT starttime, endtime, nameproduct, aggregate, avgsales,   
          namestore, city 
   FROM
     (
     SELECT TUMBLE_START(timetx, INTERVAL '15' SECOND) as    
        starttime, TUMBLE_END(timetx, INTERVAL '15' SECOND) as 
        endtime, idstore, idproduct, SUM(quantity) as aggregate
     FROM pos
     GROUP BY idproduct,idstore, TUMBLE(timetx, INTERVAL '15' 
     SECOND) ) AS a,
     products as p,
     stores as s
   WHERE aggregate > avgsales AND a.idproduct = p.idproduct AND 
   a.idstore = s.idstore;

这样,所有生成的警报都被发送到 alerts Kafka 主题中,就像我们在 SMM 看到的那样。从 Kafka,我们可以让 NiFi、KStreams 或 Java 应用程序订阅这些警报事件,并将它们推送到我们的商店管理器中。

在 Kafka 中存储警报以支持下游应用程序

结论

在这篇博客中,我们解释了流媒体平台如何让任何供应链获得实时洞察。在需求巨大、不确定性不断增加的危机形势下,这些见解将改变游戏规则。这正是我们今天面临的危机。

我们还展示了如何使用 Apache NiFi、Apache Flink 和 Apache Zeppelin 等工具构建一个高级的事件驱动警报系统,而无需任何代码。Flink 通过一个简单的 SQL API 提供高级流操作,如流连接和窗口。建立一个先进的实时供应链系统变得人人可及。CDF 等事件流平台将所有这些工具打包成一个统一的堆栈,易于部署和使用。

在以后的博客中,我将介绍 Flink 和 Flink SQL 中的流连接类型。如果你对这些话题有兴趣,过几天再来看看这个博客。

谢谢你读到这里。一如既往,欢迎反馈和建议。

想要 Jupyter 的进度条吗?

原文:https://towardsdatascience.com/ever-wanted-progress-bars-in-jupyter-bdb3988d9cfc?source=collection_archive---------3-----------------------

对你的长时间循环进行健全性检查(和一点视觉风格)

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

照片由盖尔·马塞尔Unsplash 拍摄

如何使用循环可以告诉你很多编程技巧。

介绍

循环可能非常有效,但有时运行时间太长。特别是,随着您更多地使用大数据,您将不得不处理大量数据集,并使用循环来执行每个观察的计算。

当你不得不花几分钟甚至几个小时在笔记本上寻找星号时,循环一点也不好玩。最糟糕的是,当循环有数千次迭代时,您不知道循环是否正常工作,或者只是因为数据中的一些愚蠢错误而停留在某次迭代上。

好消息是你可以用tqdm库为 Jupyter 笔记本创建进度条。这个库非常容易使用,而且它也给难看的黑白笔记本带来了某种风格。此外,在进行过程中,您还可以让条形图显示循环正在进行的迭代。不错吧。在这里,观看它的行动:

[## 通过我的推荐链接加入 Medium-BEXGBoost

获得独家访问我的所有⚡premium⚡内容和所有媒体没有限制。支持我的工作,给我买一个…

ibexorigin.medium.com](https://ibexorigin.medium.com/membership)

获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:

[## 阿尔法信号|机器学习的极品。艾总结的。

留在循环中,不用花无数时间浏览下一个突破;我们的算法识别…

alphasignal.ai](https://alphasignal.ai/?referrer=Bex)

如果你想知道tqdm到底是什么意思,这个词是一个类似的阿拉伯词的缩写,意思是进步。这就对了,上下文关系。

可点击的目录(仅限网络)

简介
安装
自动进度条
嵌套进度条
手动控制进度条
总结

装置

安装tqdm对于脚本来说非常简单。对于 Jupyter 笔记本或 Jupyter 实验室,还需要一些额外的步骤(感谢用户, Sam Wilkinson 展示了这些方法):

  1. 安装tqdm(这一步对于脚本来说足够了):
pip install tqdm                    # pip
conda install -c conda-forge tqdm   # conda

2.Jupyter 笔记本(经典款)的后续产品:

pip install ipywidgets
jupyter nbextension enable --py widgetsnbextension

3.继续 Jupyter 实验室(加上所有上述步骤):

jupyter labextension install @jupyter-widgets/jupyterlab-manager

如果你想知道更多关于经典 Jupyter 和 JupyterLab 的区别,请阅读这个 StackOverflow 线程。

自动进度条

安装后,库的基本用法非常简单。对于笔记本电脑,您可以像这样导入主模块:

tqdm子模块提供模块的所有灵活性和大部分功能。trange是一个使用range()功能创建进度条的快捷功能。让我们从这个开始:

trange只提供单一功能。对于除了range objects之外的其他类型的迭代,我们将使用tqdm。让我们使用tqdm来看看同样的进度条:

一般的语法就是这样。在您的循环中,只需将 iterable 包装在tqdm()中。

Iterables 基本上是任何可以循环的对象,比如列表、生成器对象等。

带有进度条的嵌套 for 循环

进度条的另一个很好的用例是在循环中使用嵌套的*。所有循环级别的语法都是相同的。为了区分进度条,我们可以使用tqdm()的另一个参数叫做desc。它将允许我们命名酒吧:*

输出中进度条的数量取决于外部的 iterable 级别。所以当你对外层有一个很长的描述时,要注意这一点。内部水平条的数量与可迭代的长度一样多。

手动控制进度条

有时,你会处理一个很长的循环,并且很难观察到循环在哪个成员上工作。tqdm为此提供了一个非常有用的替代方案:

这比使用挤出输出单元格的print语句要好得多。在上面的代码中,我们首先在循环之外创建了这个条。接下来,我们使用in后的 bar,编写循环体。为了指示循环的成员,我们使用进度条的set_description()方法并传递所需的字符串。

包裹

在这篇文章中,我只展示了简单循环中进度条的例子。当您处理更复杂的问题时,如对数千个文件执行操作或迭代百万行长的数据帧时,您会看到它们的好处。还有一些东西我没有包括在这篇文章中,所以一定要查看库的文档来了解更多!

如果你喜欢这篇文章,请分享并留下反馈。作为一名作家,你的支持对我来说意味着一切!

阅读更多文章:

[## 来自 Kagglers:DS 和 ML 的最佳项目设置

来自顶级 Kagglers 的项目成功最佳实践的集合

towardsdatascience.com](/from-kagglers-best-project-setup-for-ds-and-ml-ffb253485f98) [## 熊猫合并/连接数据终极指南

从半连接/反连接到验证数据合并

towardsdatascience.com](/ultimate-guide-to-merging-joining-data-in-pandas-c99e482a73b9) [## 掌握 Seaborn 中的 catplot():分类数据可视化指南。

如果你能在锡伯恩做到,那就在锡伯恩做吧,#2

towardsdatascience.com](/mastering-catplot-in-seaborn-categorical-data-visualization-guide-abab7b2067af) [## 我的情节糟透了。以下是我如何修复它们。

你的,在某种意义上,可能也是。

towardsdatascience.com](/deep-guide-into-styling-plots-delivering-effective-visuals-12e40107b380) [## 掌握 plt.annotate()让您的情节更上一层楼

上帝保佑所有阅读 Matplotlib 文档的人

towardsdatascience.com](/finally-learn-to-annotate-place-text-in-any-part-of-the-plot-d9bcc93c153f)

每个数据科学家都需要一些火花魔法

原文:https://towardsdatascience.com/every-data-scientist-can-need-some-spark-magic-853da0b81006?source=collection_archive---------8-----------------------

如何借助 Spark Magic 改进您的数据探索和高级分析

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

CC BY-SA 3.0,肯尼斯·詹森

虽然数据科学被吹捧为 21 世纪最性感的工作,但它也不能幸免于臭名昭著的帕累托法则80/20 法则。商业数据科学家 80%的时间花在寻找、清理和准备数据上。这是数据科学家工作中效率最低也是最可怕的部分。

互联网为如何打破数据科学的 80/20 法则提供了无尽的意见,但好的建议却很难得到。低生产率的一个主要原因在于数据准备的双重性:

  • 快速访问、连接和聚合存储在企业数据湖中的大数据
  • 探索和可视化笔记本中的数据和统计数据,这些数据和统计数据对 Python 包具有复杂的依赖性

大数据大部分是非结构化的,存储在生产环境中,存在企业治理和安全限制。快速访问数据需要昂贵的分布式系统,这些系统由 IT 部门集中管理,并且必须与其他数据科学家和分析师共享。

Spark 是数据行业在分布式数据湖中处理数据的黄金标准。但是,要经济高效地使用 Spark 集群,甚至允许多租户,很难适应单独的需求和依赖性。分布式数据基础设施的行业趋势是朝着短暂集群发展,这使得数据科学家更难部署和管理他们的 Jupyter 笔记本环境

毫不奇怪,许多数据科学家在本地使用高规格笔记本电脑工作,在那里他们可以更容易地安装和维护他们的 Jupyter 笔记本环境。到目前为止还可以理解。那么,许多数据科学家如何将他们的本地开发环境与生产数据湖中的数据联系起来呢?他们用 Spark 将 csv 文件具体化,并从云存储控制台下载它们。

从云存储控制台手动下载 csv 文件既不高效,也不是特别健壮。以终端用户友好和透明的方式将本地 Jupyter 笔记本与远程集群无缝连接不是更好吗?认识一下 SparkMagic!

Jupyter 笔记本的 SparkMagic

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

麻省理工学院 Sandro Pereira 授权的合理使用和公共领域图标和 svg

Sparkmagic 是一个通过 Livy REST API 与 Jupyter 笔记本中的远程 Spark 集群交互工作的项目。它提供了一套 Jupyter 笔记本单元魔法和内核,将 Jupyter 转变为远程集群的集成 Spark 环境。

SparkMagic 允许我们

  • 运行多种语言的 Spark 代码
  • 针对任何远程火花簇,使用 SparkContext 和 HiveContext 自动创建 SparkSession
  • 提供 SQL 查询的自动可视化
  • 轻松访问 Spark 应用程序日志和信息
  • 将 Spark 查询的输出捕获为一个本地 Pandas 数据帧,以便与其他 Python 库(例如 matplotlib)轻松交互
  • 将本地文件或 Pandas 数据帧发送到远程集群(例如,将预先训练的本地 ML 模型直接发送到 Spark 集群)

您可以使用以下 Dockerfile 文件构建一个支持 SparkMagic 的 Jupyter 笔记本:

FROM jupyter/all-spark-notebook:7a0c7325e470USER $NB_USER
RUN pip install --upgrade pip
RUN pip install --upgrade --ignore-installed setuptools
RUN pip install pandas --upgrade
RUN pip install sparkmagic
RUN mkdir /home/$NB_USER/.sparkmagic
RUN wget [https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json](https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json)
RUN mv example_config.json /home/$NB_USER/.sparkmagic/config.json
RUN sed -i 's/localhost:8998/host.docker.internal:9999/g' /home/$NB_USER/.sparkmagic/config.json
RUN jupyter nbextension enable --py --sys-prefix widgetsnbextension
RUN jupyter-kernelspec install --user --name SparkMagic $(pip show sparkmagic | grep Location | cut -d" " -f2)/sparkmagic/kernels/sparkkernel
RUN jupyter-kernelspec install --user --name PySparkMagic $(pip show sparkmagic | grep Location | cut -d" " -f2)/sparkmagic/kernels/pysparkkernel
RUN jupyter serverextension enable --py sparkmagic
USER root
RUN chown $NB_USER /home/$NB_USER/.sparkmagic/config.json
CMD ["start-notebook.sh", "--NotebookApp.iopub_data_rate_limit=1000000000"]
USER $NB_USER

构建图像,并用以下内容进行标记:

docker build -t sparkmagic

在 Spark Magic 的支持下启动一个本地 Jupyter 容器,挂载当前的工作目录:

docker run -ti --name \"${PWD##*/}-pyspark\" -p 8888:8888 --rm -m 4GB --mount type=bind,source=\"${PWD}\",target=/home/jovyan/work sparkmagic

为了能够连接到远程 Spark 集群上的 Livy REST API,您必须在本地计算机上使用 ssh 端口转发。获取远程集群的 IP 地址并运行:

ssh -L 0.0.0.0:9999:localhost:8998 REMOTE_CLUSTER_IP

首先,使用启用了 SparkMagic 的 PySpark 内核创建一个新的笔记本,如下所示:

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

[OC]

在启用 SparkMagic 的笔记本中,您有一系列单元 Magic 可用于本地笔记本以及作为集成环境的远程 Spark 集群。% %帮助魔术打印出所有可用的魔术命令:

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

[OC]

您可以使用 %%configure 魔法配置您的远程 Spark 应用程序:

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

正如您在上面的截图中所看到的,SparkMagic 自动启动了一个远程 PySpark 会话,并提供了一些有用的链接来连接到 Spark UI 和日志。

该笔记本集成了两种环境:

  1. %%local 它在您的笔记本电脑和由 jupyter docker 映像提供的 anaconda 环境上本地执行单元
  2. %%spark 它通过远程 spark 集群上的 PySpark REPL 经由 Livy REST API 远程执行单元

下面的代码单元格首先远程导入 SparkSql 类型。其次,它使用远程 SparkSession 将英格玛-JHU-新冠肺炎数据集加载到我们的远程 Spark 集群中。我们可以看到遥控器的输出。在笔记本中显示()命令:

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

[OC]

但这只是魔法的开始。我们可以将 dataframe 注册为一个 Hive 表,并使用 %%sql 魔法对远程集群上的数据执行 Hive 查询,并在本地笔记本中创建结果的自动化可视化。虽然这不是火箭科学,但对于数据分析师和数据科学项目早期阶段的快速数据探索来说,这是非常方便的。

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

SparkMagic 真正有用的特性是在本地笔记本和远程集群之间无缝传递数据。数据科学家的日常挑战是创建和持久化他们的 Python 环境,同时使用短暂的集群与他们公司的数据湖进行交互。

在以下示例中,您可以看到我们如何将 seaborn 作为本地库导入,并使用它来绘制 covid_data pandas 数据框。但是这些数据来自哪里呢?它是由远程火花簇创建和发送的。神奇的 %%spark -o 允许我们定义一个远程变量,在单元执行时传递给本地笔记本上下文。我们的变量 covid_data 是

  • 远程集群上的 SparkSQL 数据帧和
  • 当地 Jupyter 笔记本中的熊猫数据框

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

使用 Pandas 将远程集群中的大数据聚合到本地的 Jupyter 笔记本中的能力对数据探索非常有帮助。例如,使用 Spark 将直方图的数据预聚合到按箱的计数中,以使用预聚合的计数和简单的条形图在 Jupyter 中绘制直方图。另一个有用的特性是能够使用神奇的**% % Spark-o covid _ data-m sample-r 0.5**对远程 Spark 数据帧进行采样

集成环境还允许您使用神奇的 %%send_to_spark 将本地数据发送到远程 Spark 集群

支持的两种数据类型是 Pandas DataFramesstring。要向远程 Spark 集群发送更多或更复杂的内容,例如用于评分的经过训练的 scikit 模型,您可以使用序列化来创建用于传输的字符串表示:

import pickle
import gzip
import base64serialised_model = base64.b64encode(
    gzip.compress(
        pickle.dumps(trained_scikit_model)
    )
).decode()

将 PySpark 工作负载部署到生产中?

如您所见,这种短暂的 PySpark 集群模式有一个很大的痛点:用 Python 包引导 EMR 集群。当您部署生产工作负载时,这个问题不会消失。您可以在我之前的博客文章中阅读如何使用 PEX 加速 PySpark 应用程序在短暂的 AWS EMR 集群上的部署:

[## PEX——AWS EMR 工作负载完美 PySpark 部署的秘方

如何使用 PEX 加速 PySpark 应用程序在临时 AWS EMR 集群上的部署

towardsdatascience.com](/pex-the-secret-sauce-for-the-perfect-pyspark-deployment-of-aws-emr-workloads-9aef0d8fa3a5) 外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Jan 是公司数据转型方面的成功思想领袖和顾问,拥有将数据科学大规模应用于商业生产的记录。他最近被 dataIQ 评为英国 100 位最具影响力的数据和分析从业者之一。

在 LinkedIn 上连接:【https://www.linkedin.com/in/janteichmann/】

阅读其他文章:https://medium.com/@jan.teichmann

每一个复杂的数据帧操作,直观地解释和可视化

原文:https://towardsdatascience.com/every-dataframe-manipulation-explained-visualized-intuitively-dbeea7a5529e?source=collection_archive---------13-----------------------

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

图片作者。

熔化、旋转、连接、爆炸等

Pandas 提供了各种各样的数据帧操作,但其中许多都很复杂,可能看起来不容易实现。本文将介绍 8 种基本的数据帧操作方法,几乎涵盖了数据科学家需要了解的所有操作功能。每种方法都包括解释、可视化、代码和记住它的技巧。

所有图片由作者提供。

在枢轴上转动

透视一个表会创建一个新的“透视表”,它将数据中的现有列作为新表的元素进行投影,即索引、列和值。将成为索引的初始数据帧中的列和列显示为唯一值,这两个列的组合将显示为值。这意味着透视不能处理重复值。

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

透视名为df的数据帧的代码如下:

df.pivot(index='foo', columns='bar', values='baz')

记住:轴心是——在数据处理领域之外——围绕某种对象的旋转。在运动中,一个人可以绕着他们的脚“旋转”:熊猫的枢轴是类似的。原始数据帧的状态围绕一个数据帧的中心元素旋转成一个新的数据帧。有些元素确实是旋转或变换的(如列’bar’)。

熔化

熔化可以被认为是一种“逆透视”,因为它将基于矩阵的数据(有两个维度)转换为基于列表的数据(列表示值,行表示唯一的数据点),而透视则相反。考虑一个二维矩阵,其中一个维度为“B”和“C”(列名),另一个维度为“a”、“b”和“c”(行索引)。

我们选择一个 ID、一个维度和一列或多列来包含值。包含值的列被转换为两列:一列用于变量(值列的名称),另一列用于值(其中包含的数字)。

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

结果是 ID 列的值(abc)和值列(BC)的每个组合,以及相应的值,以列表格式组织。

熔化操作可以在数据框df中这样执行:

df.melt(id_vars=['A'], value_vars=['B','C'])

记忆:熔化像蜡烛一样的东西,就是把一个固化的、复合的物体变成几个小得多的、单独的元素(蜡滴)。熔化一个二维数据帧解包它的固化结构,并将它的片段作为单个条目记录在一个列表中。

激增

分解是去除数据中列表的有用方法。当一列展开时,其中的所有列表都作为新行列在同一个索引下(为了避免这种情况,只需随后调用.reset_index())。字符串或数字之类的非列表项不受影响,空列表是 NaN 值(您可以使用.dropna()清除这些值)。

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

在 DataFrame df中分解一列‘A’非常简单:

df.explode(‘A’)

记住:分解一个东西会释放它所有的内部内容——分解一个列表会分离它的元素。

堆叠采用任意大小的数据帧,并将列“堆叠”为现有索引的子索引。因此,得到的数据帧只有一列和两级索引。

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

堆叠一个名为 df 的表就像df.stack()一样简单。

为了访问比如狗的身高,只需调用两次基于索引的检索,比如df.loc[‘dog’].loc[‘height’]

要记住:从视觉上来说,stack 取一个表的二维度,可以将列堆叠成多级索引。

出栈

拆分采用多索引数据帧并将其拆分,将指定级别中的索引转换为新数据帧的列及其相应的值。在一个表上调用一个 stack 后跟一个 unstack 不会改变它(原谅一个’【T6]'的存在)。

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

拆分中的一个参数是它的级别。在列表索引中,索引为-1 将返回最后一个元素;关卡也是如此。级别-1 表示最后一个索引级别(最右边的一个)将被拆分。作为另一个例子,当级别被设置为 0(第一索引级别)时,其中的值变成列,并且随后的索引级别(第二索引级别)变成转换的数据帧的索引。

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

拆垛可以和堆垛一样进行,但是使用水平参数:df.unstack(level=-1)

记住 : Unstack 的意思是“撤销一个堆栈”。

合并

合并两个数据帧就是在一个共享的“键”中按列(水平)组合它们。这个键允许表的组合,即使它们的顺序不同。默认情况下,完成的合并数据帧会将后缀_x_y添加到值列。

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

为了合并两个数据帧df1df2(其中df1包含leftkeydf2包含rightkey),调用:

df1.merge(df2, left_on='leftkey', right_on='rightkey')

合并不是 pandas 的功能,而是附属于数据帧。通常假设合并所附加到的数据帧是“左表”,而在函数中作为参数调用的数据帧是“右表”,并带有相应的键。

默认情况下,merge 函数执行所谓的内部连接:如果每个数据帧都有一个键没有在另一个数据帧中列出,则它不会包含在合并的数据帧中。另一方面,如果一个键在同一个数据帧中列出两次,则相同键的值的每个组合都会在合并的表中列出。例如,如果键foodf1有 3 个值,而同一个键的df2有 2 个值,那么在最终的数据帧中将有 6 个带有leftkey=foorightkey=foo的条目。

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

记住:你合并数据帧就像你横向驾驶时合并车道一样。想象每根柱子都是高速公路上的一条车道;为了合并,它们必须水平合并。

加入

联接通常优于合并,因为它在水平联接两个数据帧时具有更清晰的语法和更广泛的可能性。联接的语法如下:

df1.join(other=df2, on='common_key', how='join_method')

使用联接时,公共键列(类似于 merge 中的right_onleft_on)必须命名为相同的名称。how参数是引用四种方法之一的字符串join可以组合两个数据帧:

  • ‘left’:包含df1的所有元素,只有当df2的元素的键是df1的键时,才会伴随df2的元素。否则,df2的合并数据帧的缺失部分将被标记为 NaN。
  • ‘right’ : ‘left’,但是在另一个数据框架上。包含df2的所有元素,只有当df1的元素的键是df2的键时,才会伴随df1的元素。
  • ‘outer’:包含两个数据帧中的所有元素,即使一个键在另一个数据帧中不存在——缺少的元素标记为 NaN。
  • ‘inner’:仅包括其键同时出现在两个数据帧键中的元素(交集)。默认为合并。

记住:如果你使用过 SQL,单词‘join’应该立即与列相加联系起来。如果没有,“加入”和“合并”在定义上有非常相似的含义。

串联

尽管合并和连接是水平工作的,但串联或简称为串联,是按行方式(垂直)附加数据帧。例如,考虑两个具有相同列名的数据帧df1df2,用pandas.concat([df1, df2])连接起来:

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

虽然您可以通过将 axis 参数设置为1来使用 concat 进行列连接,但是使用 join 会更简单。

请注意,concat 是一个 pandas 函数,而不是 DataFrame 中的一个。因此,它接受一个要连接的数据帧列表。

如果一个 DataFrame 有一个列没有包含在另一个 data frame 中,默认情况下它将被包含在内,缺少的值列为 NaN。为了防止这种情况,添加一个额外的参数join=’inner’,它将只连接两个数据帧共有的列。

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

记住:在列表和字符串中,额外的条目可以连接起来。串联是对现有主体的附加元素,而不是新信息的添加(就像按列连接一样)。因为每个索引/行都是一个单独的项,所以串联会向数据帧添加额外的项,数据帧可以看作是一个行列表。

Append 是组合两个数据帧的另一种方法,但它执行的功能与 concat 相同,但效率较低且通用性较差。

有时候内置函数是不够的。

尽管这些函数涵盖了您可能需要操作数据的广泛内容,但有时所需的数据操作对于一个甚至一系列函数来说过于复杂。探索复杂的数据操作方法,如解析器函数、迭代投影、高效解析等,请点击此处:

[## 将您的数据辩论技能提升到一个新水平的提示、技巧和技术

带有图表、代码和示例

medium.com](https://medium.com/analytics-vidhya/tips-tricks-techniques-to-take-your-data-wrangling-skills-to-the-next-level-c912c23b20cb)

感谢阅读!

如果你对最新的文章感兴趣,可以考虑订阅。如果你想支持我的写作,通过我的推荐链接加入 Medium 是一个很好的方式。干杯!

每个机器学习算法都可以表示为一个神经网络

原文:https://towardsdatascience.com/every-machine-learning-algorithm-can-be-represented-as-a-neural-network-82dcdfb627e3?source=collection_archive---------13-----------------------

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

算法中的算法

似乎机器学习的所有工作——从 20 世纪 50 年代的早期研究开始——都是随着神经网络的创建而累积起来的。从逻辑回归到支持向量机,相继提出了一个又一个新的算法,但神经网络是算法中的算法,是机器学习的巅峰。这是对机器学习的普遍概括,而不是一次尝试。

从这个意义上说,它更像是一个框架和概念,而不仅仅是一个算法,这一点很明显,因为在构建神经网络时有很大的自由度——隐藏层和节点数、激活函数、优化器、损失函数、网络类型(卷积、递归等)。),以及专业层(批次定额、退学等)。),不一而足。

从神经网络是一个概念而不是一个严格的算法的角度来看,可以得出一个非常有趣的推论:任何机器学习算法,无论是决策树还是 k 近邻算法,都可以用神经网络来表示。虽然直觉上可以用几个例子来理解这一点,但这种说法可以用数学来证明。

让我们首先定义什么是神经网络:它是由输入层、隐藏层和输出层组成的体系结构,每层的节点之间有连接。信息通过线性变换(权重和偏差)以及非线性变换(激活函数)从输入层转换到输出层。有一些方法来更新模型的可训练参数,以便…

逻辑回归简单地定义为标准回归,每个输入都有乘法系数,并添加了一个额外的截距,所有这些都通过一个 sigmoid 函数。这可以通过没有隐藏层的神经网络来建模;结果是通过一个 sigmoid 输出神经元的多重回归。

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

通过用线性激活函数替换输出神经元激活函数,可以对线性回归进行同样的建模(它只是映射输出 f ( x ) *= x,*换句话说,它不做任何事情)。

支持向量机(SVM)算法试图利用所谓的“核技巧”将数据投影到新的空间中,从而优化数据的线性可分性。在数据被转换后,该算法绘制出沿着类边界最好地分离数据的超平面。超平面被简单地定义为现有维度的线性组合,很像二维中的一条线和三维中的一个平面。从这个意义上说,人们可以把 SVM 算法看作是把数据投影到一个新的空间,然后进行多元回归。神经网络的输出可以通过某种有界输出函数来实现概率输出。

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

当然,可能需要实施一些限制,例如限制节点之间的连接和固定某些参数——当然,这些变化不会损害“神经网络”标签的完整性。也许需要添加更多的层来确保支持向量机的这种表示能够像真实交易一样执行。

像决策树算法这样的基于树的算法要稍微复杂一些。如何构建这种神经网络的答案在于分析它如何划分其特征空间。当一个训练点遍历一系列分裂节点时,特征空间被分裂成若干超立方体;在二维示例中,垂直线和水平线创建了正方形。

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

来源:DataCamp 社区。图片免费分享。

因此,沿着这些线分割特征空间的类似方式可以用更严格的激活来模拟,如阶跃函数,其中输入是一个值或另一个值,本质上是分隔线。权重和偏差可能需要实现值限制,因此仅用于通过拉伸、收缩和定位来定向分割线。为了获得概率结果,结果可以通过激活函数传递。

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

虽然算法的神经网络表示和实际算法之间存在许多技术差异,但关键是网络表达了相同的思想,并且可以用与实际算法相同的策略和性能来处理问题。

但是,也许您不满足于将算法粗略地转换成神经网络形式,或者希望看到对 k-最近邻或朴素贝叶斯等更复杂的算法的普遍应用,而不是基于具体情况。答案在于通用逼近定理——这是神经网络取得巨大成功背后的数学解释——本质上是说,足够大的神经网络可以以任意精度模拟任何函数。说有某个函数 f ( x )表示数据;对于每个数据点( xy ), f ( x )总是返回一个等于或非常接近于 y 的值。

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

建模的目标是找到这个代表性的或基本事实函数 f ( x ),我们将它表示为 p ( x )用于预测。所有机器学习算法处理这项任务的方式都非常不同,将不同的假设视为有效,并给出它们的最佳结果, p ( x )作为结果。如果有人要写出算法接近创建 p ( x )的方式,你可能会得到从条件列表到纯数学运算的任何东西。描述函数如何将目标映射到输入的函数实际上可以采用任何形式。

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

有时,这些功能会起作用。其他时候,它们没有——它们有固定数量的参数,使用它们是一个要么接受要么放弃的问题。不过,神经网络在寻找 f ( x )的方式上略有不同。

任何函数都可以用许多类似台阶的部分来合理地近似,台阶越多,近似就越精确。

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

这些步骤中的每一个都在神经网络中表示为具有 sigmoid 激活函数的隐藏层中的节点,sigmoid 激活函数本质上是概率阶跃函数。本质上,每个节点被“分配”给功能的一部分, f ( x )。然后,通过权重和偏置系统,网络可以确定节点的存在,如果神经元应该为特定输入激活,则将 sigmoid 函数的输入吹向无穷大(输出为 1),否则吹向负无穷大。这种委派节点来寻找数据函数的特定部分的模式不仅在数字数据中观察到,而且在图像中也观察到。

虽然通用近似定理已经扩展到适用于其他激活函数,如 ReLU 和神经网络类型,但该原理仍然成立:神经网络是为了完美而创建的。神经网络不再依赖于复杂的数学方程和关系系统,而是将自己的一部分委托给数据函数的一部分,并在指定的区域内强力记忆概括。当这些节点聚合成一个巨大的神经网络时,结果是一个看似智能的模型,而实际上它们是巧妙设计的近似器。

鉴于神经网络至少在理论上可以构建一个基本上和你想要的一样精确的函数(节点越多,逼近就越精确,当然不考虑过拟合的技术细节),具有正确结构的神经网络可以模拟任何其他算法的预测函数p(x)。这一点对于其他任何机器学习算法都不能说。

神经网络使用的方法不是优化现有模型中的几个参数,如多项式曲线或节点系统。神经网络是数据建模的一个特定视角,它不寻求充分利用任何独立系统,而是直接逼近数据函数;我们如此熟悉的神经网络架构仅仅是一个想法的模型表现。

随着神经网络的力量和对深度学习这一无底洞领域的不断研究,数据——无论是视频、声音、流行病学数据还是二者之间的任何数据——都将能够以前所未有的程度进行建模。神经网络确实是算法中的算法。

除非另有说明,所有图片均由作者创作。

神经网络可解释性基础

原文:https://towardsdatascience.com/every-ml-engineer-needs-to-know-neural-network-interpretability-afea2ac0824e?source=collection_archive---------21-----------------------

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

作者创建的图像

激活最大化、灵敏度分析等

神经网络是机器学习的巅峰:它们可以通过将极其复杂的功能与同样复杂的结构进行匹配来建模。充满了非线性和信息传播流,数据科学家的思维模式通常是“我们牺牲可解释性来获得能力。”的确——算法的黑盒性质已经被大多数人接受,但它不应该如此。

理解算法如何做出决策对于使用它们的应用程序来说至关重要。在世界各地的组织中,神经网络被用来决定某人是否应该获得贷款,他们是否有资格获得一份工作,甚至是否有人犯了罪——以“它在训练集上表现良好”的态度离开无法解释的算法来解决这些重要问题是危险和不道德的。

学习如何解释神经网络是每个深度学习工程师都应该学习的东西,但可悲的是大多数人都没有。通过能够解释这个强大的建模器,您将能够在数据中反映的严重问题变成更大的问题之前阻止它们,并获得人类可以理解的知识,比如肺癌的症状,这对于无法访问先进技术的应用程序和位置来说非常有价值。

神经网络的解释将人的因素带入了这种人工构造中。

本文将涵盖解释神经网络过程的三种方法和评估解释质量的一种方法。

激活最大化

激活最大化是一种可视化神经网络的方法,旨在最大化某些神经元的激活。在正常训练期间,人们将迭代地调整网络的权重和偏差,使得神经网络的误差或损失在数据集中的训练示例之间最小化。另一方面,激活最大化颠倒了这一点:在分类器被训练之后,我们想要迭代地找到模型认为属于一个类的数据部分。

例如,考虑识别从 0 到 9 的手写数字(MNIST 数据集)的神经网络的可视化:我们想要看到神经网络认为图像的哪些部分对于它决定哪个数字是重要的;也许是 8 的底圈或者 0 的洞。

网络的激活函数输出表示一个训练样本属于一个特定类的置信度,因此激活最大化构建了一个图像,该图像检查神经网络正在寻找的每一个框,从而产生最大的激活函数。这是通过梯度上升完成的,它试图最大化输出神经元。激活最大化的思想实际上就是找到返回最高置信度输出的输入。

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

各种 ImageNet 类别的 AlexNet、VGG M 和 VGG VD 模型的激活最大化图像。来源:马亨德兰等人图片免费使用。

这些结果对于模型如何决策是一个非常有启发性的观点;较暗的区域表示“惩罚”,因为该区域中的较高值使得模型不太确定输入是那个数字,而较亮的值表示“奖励”,因为这些区域中的较高值增加了输出神经元的置信度。激活最大化也可以以一维非图像数据的分布或另一种分布表示的形式被可视化。

敏感性分析

敏感性分析是一种分析模型预测梯度的方法。如果神经网络由函数 f ( x )建模,其中 x 是表示输入值的变量( x [ 1 ] ,x [ 2 ] ,…,x [ n ), 然后灵敏度定义为 f ( x )相对于 x [ i ]的导数,其中 x [ i 是我们要建模的特征。 通俗地说,敏感性分析衡量一个特征的变化如何在模型对某个目标的置信度中产生相应的机会,或者模型对某个特征的敏感程度。

这项技术不仅适用于深度神经网络的解释——它在金融和医学领域有着强大的根基。

那么,问题是“是什么让这幅图像或多或少像一艘船?”而不是“是什么让这幅图像成为一辆车?”这可以通过例如激活最大化来回答。它可以被认为是特性重要性的度量,但更重要的是它向展示了改变特性的值如何影响输出置信度,而不是告诉我们这是真的。

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

由作者创建

层相关性传播

尽管先前讨论的测量仅利用神经网络模型的输入/输出流,并且因此可以被应用于分析任何算法的决策,但是相关性传播被明确地设计用于深度神经网络的前馈图结构。

假设我们有一张狗的图像,神经网络正在对它进行分类,但我们不确定它是否正确地识别了狗,或者使用水碗作为上下文线索。因此,我们可以将图像分成两部分,并分别通过神经网络进行处理;如果其中一只狗被归类为狗,而水盘不是,那么我们知道这个模型可以推广到其他狗的图像。

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

由作者创建

另一方面,如果两个图像都被分类为狗,则很少获得关于模型在完整图像的两个部分上放置的权重的信息。线索 LRP:分层相关性传播。

LRP 的目标是为输入向量 d 的每个元素定义相关性度量 R [ d ],使得神经网络的输出是 R 的值的总和。换句话说,LRP 试图将神经网络发现的复杂关系压缩成加法问题;在戏剧性的信息浓缩中,每个输入元素(特征)的 R 的值既可解释又有价值。

为了执行这种分解,总相关性分数(相当于输出)开始集中在输出中。然后,本着反向传播的精神,相关性分数被分解并分布在各个节点中,穿过神经网络的每一层,直到它到达输入层。

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

来源:蒙塔冯等人图片免费分享

输入层的相关性分数然后可以用热图或一些其他介质来可视化;当这些分数相加时,产生与结果相同的结果,但是在对结果的贡献中,告诉了很多关于一个输入节点的值如何在神经网络结构中传播的信息。

这类似于一个电路,某人在一个端点注入一定量的电流,并在其他端点评估随后的电流;电流较高的端点在电力如何在整个系统中分配方面具有更大的优先权和“重要性”。

这种独特的神经网络解释方法依赖于局部相关性守恒原理,该原理认为这种分解是可能的,因为网络中的信息可以保持固定,就像适用于电流的基尔霍夫守恒定律一样。

解释连续性

有多种方法可以解释神经网络的黑盒性质,每种方法都依赖于自己的直觉和展开结构的方法,但量化解释的质量也很重要。如果不能给出准确的解释,一个花哨的解释技巧是没有价值的。

解释连续性植根于公平性度量,并指出如果两个数据点几乎相等,那么对它们预测的解释也应该几乎相等。

虽然这似乎是显而易见的,但解释连续性是一个比人们想象的更棘手的问题。例如,考虑对函数max(x1, x2)的解释,该函数简单地基于较大的值设置坐标标签。三种解释方法:敏感性分析、简单泰勒分解(另一种寻找相关性分数的方法)和相关性传播都对函数有不同的解释。

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

来源:蒙塔冯等人。图片免费分享。

只有相关性传播解释在x1 = x2处是连续的,并且产生平滑的、基于循环的解释过渡,这与灵敏度和简单的泰勒分解结果相反,在泰勒分解结果中,在x1 = x2线上移动点 0.001 会产生完全不同的解释。

如果一个解释是高质量的,稍微改变输入,比如移动框架,旋转它,或者添加一些噪声,不应该改变结果的解释。否则,解释技术可能无法正确理解输入产生输出的原因。

感谢阅读!

如果你对最新的文章感兴趣,可以考虑订阅。如果你想支持我的写作,通过我的推荐链接加入 Medium 是一个很好的方式。干杯!

除非另有说明,否则图片由作者创作。

[## 每个机器学习算法都可以表示为一个神经网络

算法中的算法

towardsdatascience.com](/every-machine-learning-algorithm-can-be-represented-as-a-neural-network-82dcdfb627e3) [## 机器学习算法比你想象的要脆弱得多

为什么恶意输入会起作用以及如何防止它们

towardsdatascience.com](/machine-learning-algorithms-are-much-more-fragile-than-you-think-25fdb3939fee)

每一种蛋白质都是一首歌

原文:https://towardsdatascience.com/every-protein-is-a-song-6d30ee9addd4?source=collection_archive---------28-----------------------

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

将蛋白质转化成音乐可能是一种创造新药和抗体的新方法

利用音乐设计药物和抗体的全新方法。

虽然不明显,但音乐和蛋白质之间有许多相似之处。

音乐是由一组音符组成的——通常不超过七个。蛋白质是由二十种氨基酸组成的。

像音乐一样,这些分子从有限的词汇中讲述深刻而令人印象深刻的故事。

我们现在知道,蛋白质中的氨基酸序列不是随机打乱或混乱的。更确切地说,它们似乎是由许多长弦组成的,这些长弦相互重复、相互扭打——就像交响乐的乐章一样。

不仅仅是蛋白质——DNA、RNA 和自然界中的许多其他分子都与音乐有着有趣的结构相似性。

事实上,原子和分子尺度的生物学似乎是由一位音乐家写的。

也许正是这种洞察力驱使像麻省理工学院的 T2·马库斯·布勒教授这样的科学家用蛋白质创作音乐。

虽然这看起来像是把一个比喻延伸得太远了,但他的工作是一种革命性的设计药物和抗体的新方法,同时揭示了自然界的蛋白质奥秘。

结构就是意义

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

胰岛素分子的结构。1951 年,它成为第一个被完全测序的蛋白质。来自欧洲的蛋白质数据库。

大多数生物是由蛋白质构成的。

头发是一种蛋白质。指甲、蚕丝、牛奶、蜘蛛网、皮肤、蛋清、荷尔蒙、眼球也是。

肌肉是蛋白质。这就是为什么有抱负的健美运动员消耗大量的乳清蛋白粉。事实上,我们知道的最大的蛋白质之一——肌红蛋白——是一种肌肉蛋白质。27000 个氨基酸组成一个肌联蛋白分子。移动一根肌肉纤维需要数百万个肌联蛋白分子。

身体的每一部分——无论是结构性的(指甲、头发、皮肤)还是功能性的(荷尔蒙、酶)——都有一些蛋白质在创造奇迹。

因此,蛋白质化学非常复杂。我们仍在学习它们是如何工作的。

我们所知道的是,所有的蛋白质都是由一些被称为氨基酸的精选分子组装而成的。

它们有相当好听的名字,如胱氨酸、甘氨酸、亮氨酸、丝氨酸、脯氨酸等。它们的共同点是一个“胺基”——一个简单的三个氮原子和两个氢原子(-NH2)——从它们的骨架结构中伸出来。试着看看你是否能找出下面分子中的胺基。

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

一些氨基酸的化学结构。请注意它们中的氨基。

为了制造蛋白质,氨基酸按照特定的顺序排列和连接。

例如, 5xdi 是一种小的抗真菌蛋白,发现于一种名为牛罗勒的开花杂草中。

5xdi 只有 40 个氨基酸:

fqcgrgaggarcsnglccsqfgycgstpycgacqgqsqc

每个字母代表一种氨基酸。该序列定义了 5xdi。改变一个氨基酸——用 A 代替中间的 C——它就不再是 5xdi 了。

如你所见,蛋白质对拼写的准确性要求非常严格。

但是,这个序列只是 5xdi 的起点。

原来氨基酸并不总是合得来。这些分子中有些相互吸引,有些相互排斥。这些力使分子卷曲扭曲,直到它变得像下面的东西一样复杂。

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

蛋白质 5xdi 的三维结构。来自欧洲蛋白质数据库

在蛋白质的世界里,结构就是意义。

分子中的一个弯曲可以决定一种蛋白质是否会结合到某种细胞上,或者它是否会成为一种有效的抗病毒抗体。

许多蛋白质是螺旋状的。一些形成长片。

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

蛋白质的二级结构。许多蛋白质形成螺旋或折叠

这不是魔法——事实证明,这些形状很好地平衡了吸引力和排斥力,足以让整个分子陷入微妙的稳定状态。

因此,蛋白质符合不同的结构层次。

底部是氨基酸序列。这就是所谓的初级结构

这一系列的扭曲和盘绕——也许会变成螺旋状或片状。这是 的二级结构

螺旋或薄片可以进一步卷曲和折叠。这是 三级结构

许多蛋白质显示出更高水平的组织。但是你明白了:蛋白质被严重扭曲了!

一个真正复杂的蛋白质分子可以被认为是一堆杂乱的绳子——如果这些绳子是由氨基酸连接起来并通过量子化学扭曲而成的。

如果你认为这很复杂,它就是!

即使在今天,蛋白质结构的确定也是一项艰巨的任务。我们可能已经掌握了某一特定蛋白质的完整氨基酸序列,但仍然无法知道它的实际三维形状。

将蛋白质转化成音乐

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

蛋白质的三维结构通过一个叫做发音的过程被编码成音乐

正是蛋白质的分层结构让我们想起了音乐。

氨基酸就是音符。

二级结构——螺旋的线圈或平面——让我们想起节奏和音高。

挑战在于开发一个将蛋白质结构转化为声音的正式过程。

Markus Buehler 尝试了几种不同的方法将氨基酸转化为声音。

一种方法是捕捉分子振动的基本模式。

根据量子力学,分子可以被认为是一个有许多缠绕弦的仪器。就像任何弦乐器一样,它们往往有特定的振动频率。通过将这些转换成音频,我们可以真正听到氨基酸。

然而,第二种方法要简单得多。

有二十种氨基酸。为什么我们不把这些映射到一个确定的音阶中,比如多里安音阶?

关键是将每个氨基酸与音阶中的特定音符联系起来。你可以根据分子的大小或基本振动来排列分子,并将其带到天平上。

结果是每种氨基酸都有独特的音符。蛋白质的基本氨基酸序列现在已经成为一组随时间随意流动的音符。

下一步是捕捉二级结构。我们能让这些音符听起来像是螺旋盘绕的吗?或者可以把它们做成类似于一张纸的平面吗?

如果一种氨基酸位于曲线上,它们产生的音符会变得更短更响。结合邻近氨基酸的影响,这给了声音一种紧迫感,让人想起掉进隧道或冲过过山车的感觉。

同样,所有复杂的结构成分都被映射成独特的声音。

把这些加在一起,你会发现——整个蛋白质都被翻译成了音乐!

选择演奏这些音符的乐器确实是一种艺术选择。马库斯倾向于在他的作品中经常使用吉他、大提琴、古筝、贝斯、打击乐器和长笛。

这个过程——将蛋白质结构忠实地翻译成音乐——被称为发音

其中我最喜欢的是一种叫做 4osd 的病毒蛋白的发音。它由包括古筝、小提琴、大提琴、长笛和低音提琴在内的乐器合奏而成。音乐长 43 分钟(是大蛋白)。

虽然我不太确定这种蛋白质有什么作用,但我向你保证,这听起来很棒:

病毒蛋白 4osd 的超声处理。麻省理工学院马库斯·J·布勒

最奇怪的也许是他最近对冠状病毒刺突蛋白的研究。

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

冠状病毒的数字表示,显示其尖峰(红色)。从疾控中心/科学数据库。

冠状病毒得名于其外壳中伸出的刺突状蛋白质。这种病毒是致命的,但它的尖刺能奏出优雅的古典音乐:

由冠状病毒的刺突蛋白制成的音乐。麻省理工学院马库斯·J·布勒

氨基酸音符在日本古筝上演奏。许多其他工具提供公司和更高层次的结构信息。

这个上个月在网上疯传。据 SoundCloud 统计,至今已有 88.8 万人播放过这首音乐。

最后,听听这个:

你在这首曲子中听到的是一种新的蛋白质设计的音乐实现,这是来自不同病毒的蛋白质通过机器学习挤在一起,并自我组装成新形式的结果。这是一次进入新世界的旅程,在那里不同物种的蛋白质相互作用和重组,每一个都贡献出来自他们各自生命语言的模式和思想。

用人工智能创造音乐(和蛋白质)

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

使用复合神经网络,蛋白质结构可以转换成音乐。麻省理工学院马库斯·伯勒

马库斯最近更进一步。

首先,他教会了一个神经网络如何制作蛋白质音乐。

这些网络是人脑的数学抽象。他们从提供给他们的例子中学习做事——没有任何具体的指示。

这些方法可以将蛋白质结构快速转化为音乐,Markus 已经建立了一个超过 10,000 首蛋白质歌曲的数据库。

他已经听了很多遍,以至于他说他可以通过它的旋律来识别一种蛋白质。他可以通过声音辨别蛋白质是螺旋还是折叠。

第二,他使神经网络能够对音乐进行微小的改变。

神经网络现在可以在这里或那里改变一个音符。当翻译回氨基酸序列时,这就产生了一种略有变化的蛋白质。

网络能够在有约束的情况下工作。例如,他可以坚持认为蛋白质是螺旋。这种新蛋白质是它原来的突变体,但它将符合螺旋结构。

他成功地创造了新的蛋白质——以前从未在自然界发现过。

下一步是将这些蛋白质与其特性相匹配。例如,神经网络能否预测一种螺旋蛋白,它将像头发一样强壮,但颜色是绿色的?

它能合成一种对抗病毒感染的新药吗?

他指出,这种方法可能使我们能够找到冠状病毒刺突上另一种蛋白质容易附着的地方。我们或许还能让另一种蛋白质与音乐相匹配,这种蛋白质会像钥匙上的锁一样粘在这些尖峰上。

如果是这样的话,这将是使病毒变得无能的第一步。

最近,一家年轻的初创公司开始提供将个人基因信息转换成音乐的服务——只收取少量费用。 GenM 软件( Music about you )将获取任何生物信息,并将其调整为音乐。

你可以选择歌词和音调。想听鲍勃·马利或果阿·特兰斯的生活密码吗?搞定了。

但从根本上说,这是两种看似不相关的语言的结合——一种用氨基酸的语言书写,另一种用音符拼写。

它强调了自然界万物的终极统一。

与此同时,世界等待着来自蛋白质之歌的发现。

每个人都被邀请免费参加 GitHub 卫星 2020

原文:https://towardsdatascience.com/everyone-is-invited-to-github-satellite-2020-2b70e4e73d9?source=collection_archive---------42-----------------------

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

图片来源: Github 卫星

关于 GitHub 卫星 2020 你需要知道的

GitHub 是什么?

Github 是一个帮助世界各地的开发者相互合作的平台,也是开源项目的最大来源…

查看此视频了解更多信息

GitHub 卫星是什么?

GitHub Satellite 是一年一度的国际活动——实际上,这是美国以外最大的开发者活动,它为开发者,特别是团队和研讨会带来了伟大的想法、免费的产品讲座和保护。

我需要注册吗?

不需要行动加入活动,只需保存日期:5 月 6 日。如果你想让参加 5 月 7 日的** 研讨会,你必须注册**。

为什么每个人都被邀请到 GitHub 卫星 2020

作为例外,今年每个人都可以免费参加 GitHub 卫星大会,因为冠状病毒的传播和为了保证每个人的安全,所以今年的活动将是虚拟的。所以,享受这一切,不用离开你的房子,换下睡衣,或支付一毛钱。想看就去卫星站点加入直播吧。你可以在这里查看的日程安排。

为什么你应该在那里?

有很多理由加入我们的虚拟卫星活动。以下是几个例子:

  • **了解下一步:**在首席执行官 Nat Friedman 的主题演讲中,率先了解安全、DevOps、GitHub Enterprise 等领域的一些激动人心的公告。(演讲者和表演者名单)
  • 从代码驱动的音乐表演中获得灵感:(由代码构建的 DJ 设备)。
  • **加入对话:**提问并分享你对活动环节的想法。

车间的价格是多少?

因为工作室的空间有限,你需要支付 50 美元来预订一个位置,100%的钱将被捐赠给治愈新冠肺炎。保住你的位置

如果你错过了研讨会怎么办?

每一次会议将被记录,并在结束后立即提供。

你可以在 YouTube 上观看 GitHub 卫星 2019 主题演讲

关于此次活动的更多信息,请访问 Github 卫星网站。

感谢阅读!😄

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

查看我的其他文章,关注我的 中型

哈利菲艾哈迈德阿齐兹

PyTorch 关于 Fasterrcnn 的一切

原文:https://towardsdatascience.com/everything-about-fasterrcnn-6d758f5a6d79?source=collection_archive---------9-----------------------

了解如何在 PyTorch 中实现 Fasterrcnn 并提取每幅图像的特征图

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

照片由乔纳森派Unsplash

介绍

目标检测是计算机视觉中的一项任务,我们试图对图像中存在的目标进行分类,而不是对图像进行分类。它有各种各样的应用,如检测空闲的停车位,跟踪闭路电视镜头中的物体,以及监控作物,这就是我们将要讨论的内容。

有许多方法来执行对象检测;Fasterrcnn 只是其中之一。许多其他技术,如 YOLO 和 SSD,同样工作良好。你应该了解 Fasterrcnn 的原因是,它在许多比赛中给出了最先进的结果,并在 Pinterest 应用程序等实际应用中使用。

本文简要介绍了 Fasterrcnn、与之相关的概念及其在 PyTorch 中的实现。

建筑:

Fasterrcnn 的架构如下所示:

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

来源:https://arxiv.org/abs/1506.01497

该网络首先从图像中提取特征。体系结构的这一部分被称为网络的主干。可以使用任何标准的图像分类架构。我们将使用带有特征金字塔网络的 ResNet50 作为我们的主干。

在第二步中, 区域提议网络 用于生成可能包含对象的区域。与过去的方法相比,这个网络是一个真正的提升,比如在整个图像上滑动一个窗口来寻找潜在的区域,正如你可以想象的那样,这是一个非常缓慢和计算昂贵的过程。

在这个网络中,相对于过去的方法的另一个改进是使用锚盒来检测各种比例和纵横比的图像。

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

来源:https://arxiv.org/abs/1506.01497

最后,从体系结构中可以看出,相同的特征图用于检测区域和分类。重用特征地图的想法非常聪明,你会看到很多架构都在这么做。采取的功能图,并附上多个头部,它的多项任务。

现在让我们用 PyTorch 实现一个 Fasterrcnn,并在此过程中理解更多的术语。

在 PyTorch 中实现 Fasterrcnn

Kaggle 最近举办了一场识别麦穗的比赛。我用这次比赛的数据训练了一个模型。

数据以 csv 及其相应图像的形式提供。我们有左下角的坐标,也有每个盒子的宽度和高度。

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

如果我们打印边界框的类型,我们会看到它们是字符串类型,而不是我们所期望的列表。这个错误很常见,可以使用来解决。为了方便使用,我们还将边界框分成了四列。

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

我们现在创建一个定制的**小麦数据集。**faster CNN 期望我们的数据以图像和与之对应的字典的形式出现。字典至少应该包括边界框和标签。

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

我们用数据框和存放图像的文件夹初始化数据集。我们在 getitem()函数中完成剩余的计算。

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

我们将盒子从(x0,y0,w,h)格式转换为(x0,y0,x1,y1)格式。我们把我们的标签分配给所有的 1,因为在这个问题中我们只有一个类(我们用 1 作为我们的标签,因为在 PyTorch 中,0 代表背景。).最后,我们把所有东西都转换成 PyTorch 张量。

我们还定义了 len()函数,因为 PyTorch 数据加载器使用它来迭代我们的数据集。

Pro 提示:如果你的数据在云上,不用下载到本地,可以直接拉图进行训练(考虑到这个过程不是超级慢)。这样,当您在线更新数据集(添加更多条目或对现有条目进行更改)时,您就不必更新本地副本。您只需要运行一个训练脚本,您的模型将根据新数据进行训练。

现在,我们可以从数据加载器中检索一个批处理,并可视化其中一个输入图像。

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

接下来,让我们定义我们的模型。我们正在为我们的 Fasterrcnn 使用带有功能金字塔网络的 ResNet50 主干网。主干很容易定制。我们需要传递的唯一参数是数据集中的类的数量。

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

在训练模式中,该模型将图像和目标字典作为输入,并产生 loss_dict 作为输出。

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

我们为 5 个时期训练我们的模型。然后,我们通过传递我们的图像来评估它,并获得一个边界框、标签及其各自分数的字典。然而,这不是最终的结果。如果我们看其中一个输出,

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

我们看到我们的模型为同一个对象生成了许多盒子。过滤掉不需要的盒子是我们的责任。这样做的一种技术叫做非最大抑制。

非最大抑制(NMS)

要在 PyTorch 中使用 NMS,我们可以简单地做

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

这一行代码给出了我们应该保留的所有边界框的索引。让我们来看看应用 NMS 后的相同图像。

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

看起来好多了,对吧?那么 NMS 是如何运作的呢?

要理解 NMS,我们首先需要理解 IoU(并集上的交集)。IoU 是衡量两个盒子相似程度的指标。IoU 越接近 1,方框越相似。记住这一点,让我们来看看 NMS 算法:

  1. 根据分数(置信度)对所有边界框进行排序。
  2. 选择可信度最高的框。该框将是输出的一部分。
  3. 和其他箱子一起算欠条。
  4. 将 IoU 超过阈值(本例中为 0.3)的框与所选框一起移除。这将删除包含相同对象或仅包含其一部分的所有重叠框。
  5. 从左边的框中,选择下一个框(第二高的分数)并重复该过程。

这样做给了我们一个非常好的输出。我们可以尝试各种阈值,但 0.3 效果很好。

如果你也想提取特征图,你可以使用钩子来完成。查看内核中的相同内容。

这就是本文的全部内容。如果你想了解更多关于深度学习的知识,可以看看我在这方面的系列文章。

[## 深度学习系列

我所有关于深度学习的文章的系统列表

medium.com](https://medium.com/@dipam44/deep-learning-series-30ad108fbe2b)

参考资料:

faster CNN 论文

特色金字塔网论文

PyTorch 启动器—快速启动

非最大抑制

关于用 Python 绘图的一切

原文:https://towardsdatascience.com/everything-about-plotting-in-python-c12ccdc359bc?source=collection_archive---------28-----------------------

📚实践中的 Python

从 matplotlib 到 pandas.plot()

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

照片由 h heyerleinUnsplash 上拍摄

2020 年 11 月 4 日更新: Seaborn 补充。

atplotlib 是数据科学和许多科学绘图领域可视化的基石。然而,*plt* 函数看似简单,参数却让人应接不暇。根据底部显示的教程,我总结了一份 python 绘图格式:

import matplotlib as mpl
import matplotlib.pyplot as pltplt.style.use('seaborn')
mpl.rcParams['font.family'] = 'serif'
%matplotlib inline #1\. create a figure,like canvas
fig = plt.figure() #2\. add plots inside that figure you just created
ax = fig.add_subplot(111) 
#3\. set all the parameters for the plot inside that ax 
ax.set(xlim=[0.5, 4.5], ylim=[-2, 8], title='An Example Axes',
       ylabel='Y-Axis', xlabel='X-Axis')#4\. do the plotting
ax.plot(x,y)
plt.show()

您可以使用以下方法节省一行代码:

fig, axes = plt.subplots(ncols=2, figsize=plt.figaspect(1./2))

使用 代替***plt***的好处不仅是使整个过程更像“客观绘图”,每个***ax***代表一个图形,而且使每个ax/图形的迭代更容易,如:

fig, axes = plt.subplots(nrows=2, ncols=2)
axes[0,0].set(title='Upper Left')
axes[0,1].set(title='Upper Right')
axes[1,0].set(title='Lower Left')
axes[1,1].set(title='Lower Right')

*# To iterate over all items in a multidimensional numpy array, use the `flat` attribute*
**for** ax **in** axes.flat:
    *# Remove all xticks and yticks...*
    ax.set(xticks=[], yticks=[])

plt.show()

Figure是这个层次结构中的顶级容器。它是整个窗口/页面,所有的东西都画在上面。您可以有多个独立的图形,并且Figure s 可以包含多个Axes

大多数绘图发生在Axes上。轴实际上是我们绘制数据的区域,以及与之相关的任何记号/标签等。通常,我们将通过调用subplot来设置一个轴(它将轴放置在一个规则的网格上),所以在大多数情况下,AxesSubplot是同义的。

每个Axes都有一个XAxis和一个YAxis。这些包括ticks、刻度位置、标签等。在本教程中,我们将主要通过其他机制来控制分笔成交点、分笔成交点标签和数据限制,因此我们不会过多地触及事物的单个Axis部分。不过这里值得一提的是解释一下Axes这个术语的来源。

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

Matplotlib 图的剖析

我最喜欢的 python 导师科里·斯查费的 Matplotlib 最佳视频教程之一。

熊猫情节

至于熊猫的剧情功能,一切都打包在一个功能里:

pandas.DataFrame.plot()

该函数中有几个非常有用的参数,例如:

pd.DataFrame.plot(
                  ax = ax,
                  secondary_y="some_col",
                  subplots=True
                  )

***ax***允许您将绘图添加到当前绘图中;***secondary_y***在你的图的右边给你一个额外的轴,并设置***subplots***为真,就像plt.subplots()一样,这将给你每一列一个单独的图。

海生的

一旦你开始使用 Matplotlib 一段时间,很快你就会意识到 Matplotlib 有太多的参数和函数。我经常搞不清哪个参数属于哪个函数。另一次,我不记得参数的名称。

Seaborn 是 Matplotlib 之上的一个很好的包装器。除了美学优化,seaborn 还提供了一个解决方案,帮助用户以更简单的方式探索数据。

你可以直接使用 Seaborn

import seaborn as sns

默认设置对于日常数据可视化来说已经足够好了。如果你想对你的情节的风格和大小有一点额外的控制。最简单的方法就是一开始就设定好风格和语境。

sns.set(style="ticks", context='talk')

有五个预设的 seaborn 主题:darkgridwhitegriddarkwhiteticks。它们分别适合不同的应用和个人偏好。默认主题是darkgrid。四个预设上下文按照相对大小的顺序分别是papernotebooktalkposter。默认为notebook样式。顺便说一下,所有的参数都可以通过一个set()功能来设置。

sns.set({"xtick.major.size": 8, "ytick.major.size": 8},    style="ticks")

现在问题来了,我怎么知道那些参数是什么?

Seaborn 将所有复杂的参数归结为 2 组,只有 2 个函数需要记住。要控制风格,使用[**axes_style()**](https://seaborn.pydata.org/generated/seaborn.axes_style.html#seaborn.axes_style)[**set_style()**](https://seaborn.pydata.org/generated/seaborn.set_style.html#seaborn.set_style)功能。要缩放图形,使用[**plotting_context()**](https://seaborn.pydata.org/generated/seaborn.plotting_context.html#seaborn.plotting_context)[**set_context()**](https://seaborn.pydata.org/generated/seaborn.set_context.html#seaborn.set_context)功能。在这两种情况下,第一个函数返回一个参数字典,第二个函数设置 matplotlib 默认值。

sns.axes_style()

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

sns.plotting_context()

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

要设置任何参数,您只需简单地调用set()即可。例如,您可以一次性设置所有内容。

sns.set({'font.size': 60.0,
 'axes.labelsize': 'medium',
 'axes.titlesize': 'large',
 'xtick.labelsize': 'medium',
 'ytick.labelsize': 'medium',
 'legend.fontsize': 'medium',
 'axes.linewidth': 0.8,
 'grid.linewidth': 0.8,
 'lines.linewidth': 1.5,
 'lines.markersize': 6.0,
 'patch.linewidth': 1.0,
 'xtick.major.width': 0.8,
 'ytick.major.width': 0.8,
 'xtick.minor.width': 0.6,
 'ytick.minor.width': 0.6,
 'xtick.major.size': 8.0,
 'ytick.major.size': 8.0,
 'xtick.minor.size': 2.0,
 'ytick.minor.size': 2.0,
 'legend.title_fontsize': None})

基本上,大多数时候,你只需要改变预设的主题和背景。一旦完成数据探索,您可以使用sns.set()微调任何参数以满足您的要求。

这些就是你所需要了解的关于 Seaborn 的一切。我注意到一件事,它不在参数之内,是图形大小设置。简单的方法是在代码的开头声明一个图形画布,就像使用 matplotlib 一样。

fig, ax = plt.subplots(figsize=(18,9))
ax=sns.lineplot(data=data)
ax.set(title='title', ylabel='ylabel')

当然,强大的 set()函数可以接受所有订单:

sns.set(rc={'figure.figsize':(11,4)})
#or like this
sns.set({'figure.figsize':(20,8)})

请注意,如果你的数据是一个熊猫数据帧,Seaborn 将自动模仿你的数据帧结构,换句话说,你不需要担心标签和标题等。。

总之,你需要记住的只是 4 行代码

import seaborn as sns
sns.set(context='poster', style='ticks')
sns.axes_style()
sns.plotting_context()

我忘了说的一件事是颜色。默认调色板是

sns.color_palette()

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

对于离散变量,‘Paired’是一个很好的选项(记住大写 p),

sns.color_palette('Paired')

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

至于连续数据,‘rocket’还不错。

sns.color_palette('rocket')

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

一会儿

警告:除非 ticklabels 已经被设置为一个字符串(通常是在中的情况,例如一个 boxplot),否则这将不能用于任何比1.1.0新的 matplotlib 版本。

通常,您可以按照以下方式操作刻度标签:

import matplotlib.pyplot as pltfig, ax = plt.subplots()# We need to draw the canvas, otherwise the labels won't be positioned and 
# won't have values yet.
fig.canvas.draw()labels = [item.get_text() for item in ax.get_xticklabels()]
labels[1] = 'Testing'ax.set_xticklabels(labels)plt.show();

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

要理解为什么您需要经历这么多困难,您需要对 matplotlib 的结构有更多的了解。

Matplotlib 有意避免对记号等进行“静态”定位,除非明确要求这样做。假设您想要与图进行交互,因此图的边界、刻度、刻度标签等将动态变化。

因此,不能只设置给定刻度标签的文本。默认情况下,每次绘图时,axis 的定位器和格式化程序都会重置它。

然而,如果定位器和格式化器被设置为静态的(分别为FixedLocatorFixedFormatter,那么刻度标签保持不变。

这就是set_*ticklabelsax.*axis.set_ticklabels所做的。

很多时候,你其实想做的只是注释某个位置。既然如此,那就去调查annotate吧。

我将介绍在 Matplotlib 中设置刻度标签字体大小的不同方法。它包括,

  • plt.xticks(fontsize= )
  • ax.set_xticklabels(xlabels, fontsize= )
  • plt.setp(ax.get_xticklabels(), fontsize=)
  • ax.tick_params(axis='x', labelsize= )

下面的代码示例将使用相同的数据集。

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

创建上图的代码是,

from matplotlib import pyplot as plt
xvalues = range(10)
yvalues = xvaluesfig,ax = plt.subplots()
plt.plot(xvalues, yvalues)
plt.grid(True)plt.show();

plt.xticks(fontsize=)设置 Matplotlib 刻度标签的字体大小

from matplotlib import pyplot as plt
xvalues = range(10)
yvalues = xvaluesfig,ax = plt.subplots()
plt.plot(xvalues, yvalues)
plt.xticks(fontsize=16)
plt.grid(True)plt.show();

plt.xticks获取或设置 x 轴刻度位置和标签的属性。

[fontsize](https://matplotlib.org/3.1.1/api/text_api.html#matplotlib.text.Text.set_fontsize) [size](https://matplotlib.org/3.1.1/api/text_api.html#matplotlib.text.Text.set_fontsize)Text实例的属性,可以用来设置刻度标签的字体大小。

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

ax.set_xticklabels(xlabels,Fontsize=)设置 Matplotlib 刻度标签的字体大小

set_xticklabels用字符串标签列表设置 x 刻度标签,用Text属性作为关键字参数。在这里,fontsize设置刻度标签的字体大小。

from matplotlib import pyplot as plt
import numpy as npxvalues = np.arange(10)
yvalues = xvaluesfig,ax = plt.subplots()
plt.plot(xvalues, yvalues)
plt.xticks(xvalues)
ax.set_xticklabels(xvalues, fontsize=16)
plt.grid(True)plt.show()

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

plt.setp(ax.get_xticklabels(),Fontsize=)设置 Matplotlib 刻度标签的字体大小

matplotlib.pyplot.setp设置一个艺术家对象的属性。plt.setp(ax.get_xticklabels(), fontsize=)设置 xtick labels 对象的fontsize属性。

from matplotlib import pyplot as plt
xvalues = np.arange(10)
yvalues = xvaluesfig,ax = plt.subplots()
plt.plot(xvalues, yvalues)
plt.setp(ax.get_xticklabels(), fontsize=16)plt.grid(True)plt.show()

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

ax.tick_params(axis='x ',Labelsize=)设置 Matplotlib 刻度标签的字体大小

tick_params设置记号、记号标签和网格线的参数。

ax.tick_params(axis='x', labelsize= )设置x轴,也就是 X 轴的刻度标签的labelsize属性。

from matplotlib import pyplot as plt
xvalues = range(10)
yvalues = xvaluesfig,ax = plt.subplots()
plt.plot(xvalues, yvalues)
ax.tick_params(axis='x', labelsize=16)
plt.grid(True)plt.show()

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

颜色名称

  • 蓝色
  • g:绿色
  • 红色
  • c:青色
  • 男:洋红色
  • y:黄色
  • 凯西:黑色
  • w:白色的

但是,如何给 pandas/matplotlib 条形图自定义颜色呢?

我发现最简单的方法是使用.plot()中的colormap参数和一个预设的颜色渐变:

df.plot(kind='bar', stacked=True, colormap='Paired')

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

您可以在此找到一个大型预设色彩映射表列表。

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

来源

标记

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

线型

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

绘图属性

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

孵出

面片对象可以有为其定义的图案填充。

  • / —对角线阴影线
  • \ —后对角线
  • | —垂直
    • —水平
    • —交叉
  • x-交叉对角线
  • o-小圆圈
  • o-大圆(大写字母“o”)
  • 。—圆点
    • —星星

字母可以组合。

参考

  1. 解剖 Matplotlib 最好的 Matplotlib 教程之一
  2. 定制剧情图例摘自杰克·范德普拉斯的 Python 数据科学手册

请查看我最近发表的文章:

📈Python For Finance 系列

  1. 识别异常值
  2. 识别异常值—第二部分
  3. 识别异常值—第三部分
  4. 程式化的事实
  5. 特征工程&特征选择
  6. 数据转换
  7. 细微差别特征
  8. 数据标签
  9. 元标签和堆叠

关于 Python 列表数据结构的一切:初学者指南

原文:https://towardsdatascience.com/everything-about-python-list-data-structure-beginners-guide-pyshark-b956fb5f7a56?source=collection_archive---------60-----------------------

在本文中,我们将重点介绍 Python 列表数据结构的完整过程。

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

https://unsplash.com/photos/eygpU6KfOBk

目录:

  • 什么是 Python 列表?
  • 如何创建 Python 列表
  • 如何从 Python 列表中访问元素
  • 如何分割 Python 列表
  • 如何对 Python 列表进行排序
  • 如何向 Python 列表添加项目
  • 如何从 Python 列表中移除项目
  • 如何更改 Python 列表中的项目
  • 结论

什么是 Python 列表

Python 列表是一种序列数据类型,它允许我们在一个逗号分隔的数据实例中组合几个项目。列表可以包含相同或不同类型的数据,并且是可变的。这意味着我们可以在 Python 中改变列表对象的大小和内容。

如何创建 Python 列表

用 Python 创建列表非常简单。你需要把所有用逗号分隔的条目放入方括号中。请记住,您可以将不同的数据类型放在一起,例如整数、浮点、布尔甚至其他列表。这里有几个例子:

带有字符串元素的列表

我们应该得到:

['Apple', 'Banana', 'Orange', 'Pineapple']

带有整数元素的列表

我们应该得到:

[1, 2, 3, 4]

具有混合类型元素的列表

我们应该得到:

['Apple', 1, True, 2.4]

具有嵌套元素的列表

在上面的例子中,列表中的每一项只包含一个值。如果我们希望每个项目存储两个值呢?Python 列表也允许我们这样做!例如,您希望列出产品及其价格。您的数据如下:一个苹果的价格是 1 美元,一个香蕉的价格是 0.70 美元。为了给列表中的每个项目添加两个或更多的值,我们需要将它们放在方括号中,并用逗号分隔。它看起来像是一个嵌套的列表。

我们应该得到:

[['Apple', 1], ['Banana', 0.7]]

如何从 Python 列表中访问元素

Python 列表的一个重要且非常有用的属性是它是一个索引序列,这意味着对于一个有 n 个元素的列表,第一个元素的索引= 0,第二个元素的索引= 1,一直到 n -1。

使用索引访问列表中的元素

索引也可以反过来,这意味着第一个元素的索引= — n ,第二个元素的索引= — n +1,一直到-1。

为了便于展示,请看下面的视觉效果:

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

我们可以看到列表中的’ Apple '元素有两个索引:0 和-4。

让我们用 Python 重新创建这个列表:

现在,我们想打印出列表中的第一个元素。从前面我们知道,它有两个索引:0 和-4,所以我们可以两个都尝试,看看输出是否相同。

我们应该得到:

AppleApple

在这两种情况下,输出是相同的。

在列表中查找元素

假设我们有以下字符串元素列表:

我们应该得到:

['Apple', 'Banana', 'Orange', 'Pineapple']

并且您想要查找“香蕉”元素的索引。

这可以通过使用简单地找到。index() 将某个值作为参数并在 Python 列表中查找其索引的方法:

我们应该得到:

1

我们很快发现“Banana”元素位于列表的索引 1。

如何分割 Python 列表

在前一节中,我们展示了如何使用精确的索引从 Python 列表中访问一个条目。在本节中,我们将展示当您想要访问某个范围内的项目时,例如,前两个或后两个项目,该如何操作。

回想一下,为了使用索引从列表中检索条目,我们将它放在方括号 [] 中。切片使用相同的方法,但是我们不是传递单个索引值,而是传递一个范围。Python 中的一个范围使用以下语法传递 [ : **。**

不指定 from 和 to 的切片

如果从到你不放任何索引到,默认情况下 python 会取整个列表。下面两行代码产生了相同的输出:**

我们应该得到:

['Apple', 'Banana', 'Orange', 'Pineapple']['Apple', 'Banana', 'Orange', 'Pineapple']

通过指定 from 进行切片

你可以通过从中指定来分割一个列表,它将从你指定的索引中取出条目,直到列表结束。例如,您希望打印列表中的最后两项。请记住,您可以同时使用索引和反向索引。下面两行代码产生了相同的输出:

我们应该得到:

['Orange', 'Pineapple']['Orange', 'Pineapple']

指定为的切片

你可以通过指定来分割一个列表,它将从列表的开始直到你指定的索引项-1。例如,您希望打印列表中的前两项。请记住,您可以同时使用索引和反向索引。以下代码将产生所需的输出:

我们应该得到:

['Apple', 'Banana']

请注意,我们将指定为 index = 2,需要记住的是,index = 3 实际上是第三个项目的位置。Python 中列表切片的工作方式是遍历条目,直到指定的索引(在我们的例子中是 2)为止,并包括到该索引为止的所有条目,但不包括索引下的条目。

如何对 Python 列表进行排序

Python 中的列表有一个方法。sort()** 它允许我们对列表中的项目进行排序。如果你的列表包含字符串,这个方法将按字母升序排序。如果你的列表包含数值(整数或浮点数),它将按升序排序。请注意,如果你有一个列表会有多个数据类型,。sort() 方法不起作用,会产生错误。让我们来看几个例子:**

用字符串对列表进行排序

我们应该得到:

['Apple', 'Banana', 'Orange', 'Pineapples']

用数值对列表进行排序

我们应该得到:

[1, 2, 3, 4]

在这两种情况下,我们都创建了无序列表,并在应用了之后。sort()** 方法,当打印出列表时,它被排序。**

如何向 Python 列表添加项目

在本节中,我们将介绍如何向现有列表中添加新项目。有两个列表方法可以帮助我们:。append()** 和**。插入()。它们都可以向列表中添加新的条目,但是有一个主要的区别:。append()** 通过“追加”的方式将项目添加到列表的末尾,而**。insert()** 允许我们在列表中选择一个特定的“位置”(索引),新项目将被添加到这个位置。**

让我们看一些例子:

向列表追加项目

我们应该得到:

['Apple', 'Banana', 'Orange', 'Pineapple', 'Mango']

我们从我们的旧清单开始,有 4 个项目(水果)。现在我们想把“芒果”加入我们的清单。我们创建了一个变量 new_item 并为其赋值‘Mango’。然后我们把它添加到我们的主列表中,当我们把它打印出来时,我们会看到列表中的所有 5 个条目。

将项目插入列表

与上述方法的根本区别在于,在这种情况下,我们能够在列表中选择我们想要插入新项目的确切位置。此列表方法具有以下语法:。插入( 索引 条目 )

例如,我们的新项目是“芒果”,我们希望将其添加到列表中的“苹果”之后。知道“苹果”项目的索引(位置)是 0,我们应该使用 index = 1 在它后面添加一个项目。

下面是将产生我们所期望的输出的代码:

我们应该得到:

['Apple', 'Mango', 'Banana', 'Orange', 'Pineapple']

完美!使用正确的索引将“芒果”添加/插入到“苹果”之后。

如何从 Python 列表中移除项目

在本节中,我们将介绍如何从现有列表中删除新项目。有两个列表方法可以帮助我们做到这一点:。拆下()。pop()** 。它们都可以从列表中删除项目,但是有一个主要的区别:。remove() 删除您指定的项目(必须完全匹配),而**。pop()** 允许我们在列表中选择一个特定的“位置”(索引)来删除你想要的项目。**

让我们看一些例子:

使用值从列表中移除项目

我们应该得到:

['Apple', 'Orange', 'Pineapple']

我们从我们的旧清单开始,有 4 个项目(水果)。现在我们想从列表中删除“香蕉”。我们创建一个变量来移除**,并给它赋值“Banana”。然后我们将它从主列表中移除,当我们打印出来时,我们会看到剩余的 3 个项目。**

使用索引从列表中移除项目

与上述方法的不同之处在于,我们可以选择要从列表中删除的项目的确切位置,而不是指定项目的值。此列表方法具有以下语法:。流行( 指数 ) 。例如,您想从列表中删除“香蕉”。知道‘Banana’项的索引(位置)是 1,我们应该使用 index = 1 将其从列表中删除。

索引的默认值是-1,这意味着如果你不指定索引而只应用。pop()** ,它将删除列表中的最后一项。**

下面是将产生我们所期望的输出的代码:

我们应该得到:

'Banana'
['Apple', 'Orange', 'Pineapple']

如何更改 Python 列表中的项目

在这一节中,我们将展示如何更改列表中的项目。例如,您有一个现有的项目列表,您想用一个新项目替换其中一个项目。我们怎么做呢?

在 Python 中,这真的很简单。我们所要做的就是在列表中指定一个我们想要改变的条目的索引,然后给它赋一个新的值。

回想一下我们的清单:苹果、香蕉、橘子、菠萝。现在,你想用甜瓜代替橘子(指数= 2)。下面是如何做到这一点:

我们应该得到:

['Apple', 'Banana', 'Melon', 'Pineapple']

结论

这一项是对 Python 中 list 方法的介绍性演练,学习这些方法很重要,因为它们在编程的许多领域和机器学习中使用。

如果你有任何问题或者对编辑有任何建议,请在下面留下你的评论。

原载于 2020 年 4 月 6 日 https://pyshark.com。****

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值