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

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

Aethos 2.0 —自动化数据科学工作流程的改进方法

原文:https://towardsdatascience.com/aethos-2-0-an-improved-way-to-automate-your-data-science-work-flow-8bfb2ac3a29a?source=collection_archive---------71-----------------------

Aethos 2.0 的新特性

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

Justin Jairam 拍摄的照片来自 @jusspreme

2019 年底,我发布了 Aethos 1.0,这是自动化常见数据科学技术的第一个迭代包。从那以后,我收到了很多关于如何改进 Aethos 的反馈,我将在这里介绍。将会有很多代码示例来展示该包的强大功能和多功能性。

你可以在 TDS 上看到之前关于 Aethos 第一版的帖子。

艾托斯简介

用艾托斯造型

注意:你可以通过我的页面上的谷歌协作链接关注这篇文章。

Aethos 是什么?

对于那些不熟悉 Aethos 的人来说,Aethos 是一个自动化数据科学技术和用例的 Python 库,从缺失值插补、NLP 预处理、特征工程、数据可视化到建模、模型分析和模型部署。

要查看完整的功能以及您可以运行的其他技术和模型,请查看 Github 上的项目页面。

Aethos 1.0 的问题

Aethos 第一版的许多问题都与软件包及其 API 的可用性有关。主要问题是:

  • 由于文件和耦合包的数量,导入时间很慢。
  • 有两个用于端到端分析的对象—用于转换的数据和用于建模的模型
  • 模型对象有每一个模型,并不特定于监督或无监督的问题。
  • 不直观的 API 要求向底层数据帧添加新列
  • 随着将笔记本转换为 pdf 等外部工具的使用,报告功能变得多余。
  • API 的用例有限。没有 Aethos,你无法分析你的数据,或分析你训练的模型。
  • Aethos 和 Pandas 不可互换,在转换数据时不能一起工作。

Aethos 2.0 的新特性

Aethos 2.0 着眼于解决软件包的直观性和可用性,使其更容易使用和理解。它还解决了与 Aethos 一起使用 Pandas 数据框架的能力。

  • 通过简化和分离 Aethos 模块,缩短了软件包的导入时间。
  • 只需要一个 Aethos 对象来可视化、转换、建模和分析结果。
  • 仅查看针对您的问题的模型(分类、回归或无监督)。
  • 消除了通过 Aethos 对象向底层数据帧添加数据的复杂性。您可以使用 x_train 和 x_test 属性访问底层数据帧。
  • 删除了报告功能。
  • 访问 DataFrame 列时删除了点符号。
  • 现在可以将方法链接在一起。

Aethos 2.0 引入了新的对象来支持新的案例:

  • 分析:分析、可视化和运行统计分析(t 检验、anova 等)。)在你的数据上。
  • 分类:分析、可视化、运行统计分析、转换和估算您的数据以运行分类模型。
  • 回归:分析、可视化、运行统计分析、转换和估算您的数据以运行回归模型。
  • 无监督:分析、可视化、运行统计分析、转换和估算您的数据以运行无监督模型。
  • 分类模型分析:解释、分析和可视化分类模型结果。
  • 回归模型分析:解释、分析和可视化回归模型结果。
  • UnsupervisedModelAnalysis:解释、分析和可视化无监督的模型结果。
  • 文本模型分析:解释、分析和可视化文本模型结果。

注意: 当使用 Aethos 运行模型时,模型分析对象会自动初始化。它们也可以通过提供模型对象、训练数据和测试数据来自行初始化。

例子

!pip install aethos

进口熊猫和鹦鹉。

import pandas as pd
import aethos as atat.options.track_experiments = True # Enable experiment tracking with MLFlow

为了展示每一个物体,让我们载入泰坦尼克号数据集。

orig_data = pd.read_csv('https://raw.githubusercontent.com/Ashton-Sidhu/aethos/develop/examples/data/train.csv')

我们将描述原始数据作为参考。

orig_data.describe()

分析

分析对象主要用于快速、方便地分析和可视化数据。它没有能力运行 Aethos 的自动清理和转换技术,只有可视化和统计测试。它也不会分割您的数据,但是您可以选择提供一个测试集。

df = at.Analysis(orig_data, target='Survived')

让我们从描述我们的数据开始。

df.describe()

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

df.missing_values

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

df.column_info()

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

df.standardize_column_names()

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

df.describe_column('fare')

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

df.data_report()

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

查看多个特征的直方图。

df.histogram('age', 'fare', hue='survived')

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

创建可配置的相关矩阵。

df.correlation_matrix(data_labels=True, hide_mirror=True)

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

画出每个年龄买票的平均价格。

df.barplot(x='age', y='fare', method='mean', labels={'age': 'Age', 'fare': 'Fare'}, asc=False)

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

我们还可以观察年龄和公平之间的关系,并了解幸存者和幸存者之间的差异。

df.scatterplot(x='age', y='fare', color='survived', labels={'age': 'Age', 'fare': 'Fare'}, marginal_x='histogram', marginal_y='histogram')

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

你可以想象其他的情节,比如雨云,小提琴,盒子,成对等等。我建议查看更多示例。

最大的变化之一是能够和熊猫并肩工作。如果您想转换和处理只与 Pandas 相关的数据,分析对象将反映这些变化。这允许您将 Aethos 单独用于自动分析,将 Pandas 用于转换。

为了演示这一点,我们将使用我们创建的原始 pandas 数据帧创建一个新的布尔特征来查看乘客是否为儿童。

orig_data['is_child'] = (orig_data['age'] < 18).astype(int)
orig_data.head()

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

现在让我们来看看我们的分析对象。

df.head()

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

df.boxplot(x='is_child', y='fare', color='survived')

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

您仍然可以在 Aethos 对象上运行 pandas 函数。

df.nunique()

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

df['age'].nunique()

88

新功能

Aethos 2.0 中引入了一些新的分析技术。

预测能力得分

预测能力得分是非对称的、数据类型不可知的得分,可以检测两个列之间的线性或非线性关系。分数范围从 0(无预测能力)到 1(完美预测能力)。它可以用作相关性(矩阵)的替代方法。创建这个库需要 8080 个实验室,你可以在这里得到更多信息

df.predictive_power(data_labels=True)

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

AutoViz

AutoViz 自动可视化您的数据,并根据您的数据特征显示关键图。信用去 AutoViML 创建这个库,你可以得到更多的信息在这里

df.autoviz()

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

外加更多!它负责许多您通常会做的可视化工作,并帮助识别特征之间的关系。你可以在这里查看全部输出

系统模型化

Aethos 2.0 引入了 3 个新的模型对象:分类、回归和无监督。这些对象具有与分析对象相同的功能,但也可以像在 Aethos 1.0 中那样转换数据。对于不熟悉 Aethos 的人来说,每当您使用 Aethos 应用转换时,它会将转换应用于训练数据,并将其应用于训练和测试数据(在分类和回归的情况下),以避免数据泄漏。

在这篇文章中,我们将讨论分类对象,但是如果你正在处理一个回归或者无监督的问题,过程是完全一样的。

df = at.Classification(orig_data, target='Survived', test_split_percentage=.25)

与 Aethos 1.0 一样,如果没有提供测试数据,它会在初始化时被分割。在 Aethos 2.0 中,它使用分类问题的分层来分割数据,以确保类平衡的一些相似性。

**警告:**前面我们展示了修改原始数据帧并将其反映在 Aethos 对象中的能力。如果你没有为分类和回归对象提供一个测试集,情况就不一样了。

提示: Aethos 附带了一个清单,可以在清理、分析和转换数据时提醒您。

df.checklist()

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

df.standardize_column_names()

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

因为这是一个概述,所以让我们选择将要使用的列,去掉我们不打算使用的列。

df.drop(keep=['survived', 'pclass', 'sex', 'age', 'fare', 'embarked'])

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

让我们把我们的转变连在一起。请记住,我们的转换将适合训练数据,并自动转换我们的测试数据。

is_child = lambda df: 1 if df['age'] < 18 else 0df.replace_missing_median('age') \
  .replace_missing_mostcommon('embarked') \
  .onehot_encode('sex', 'pclass', 'embarked', keep_col=False) \
  .apply(is_child, 'is_child') \
  .normalize_numeric('fare', 'age')

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

df.x_train.head()

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

df.x_test.head()

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

现在让我们训练一个逻辑回归模型。

我们将使用 gridsearch,它会自动返回最佳模型。在网格搜索过程中,我们将使用分层 K-fold 进行交叉验证。

gs_params = {
    "C": [0.1, 0.5, 1],
    "max_iter": [100, 1000]
}lr = df.LogisticRegression(
    cv_type='strat-kfold',
    gridsearch=gs_params,
    random_state=42
)

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

一旦模型被训练,一个 ModelAnalysis 对象被返回,它允许我们分析、解释和可视化我们的模型结果。包括一个列表,帮助您调试您的模型,如果它是过拟合或欠拟合。

df.help_debug()

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

您可以通过在产生的 ModelAnalysis 对象上调用cross_validate 来快速交叉验证任何模型。它将显示所有折叠的平均分数和学习曲线。

对于分类问题,默认的交叉验证方法是分层 K-Fold。这允许保持某种形式的类平衡,而对于回归,缺省值是 K 倍。

lr.cross_validate()

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

lr.metrics() # Note this displays the results on the test data.

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

手动与自动

让我们手动训练一个逻辑回归,并查看和验证结果。

from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, roc_auc_score, precision_scoreX_train = df.x_train.drop("survived", axis=1)
X_test = df.x_test.drop("survived", axis=1)y_train = df.x_train["survived"]
y_test = df.x_test["survived"]clf = LogisticRegression(C=1, max_iter=100, random_state=42).fit(X_train, y_train)
y_pred = clf.predict(X_test)print(f"Accuracy: {accuracy_score(y_test, y_pred).round(3)}")
print(f"AUC: {roc_auc_score(y_test, clf.decision_function(X_test)).round(3)}")
print(f"Precision: {precision_score(y_test, y_pred).round(3)}")

准确度:0.848
AUC: 0.854
精度:0.882

结果是一样的。

模型分析

与建模类似,Aethos 2.0 引入了 4 个模型分析对象:ClassificationModelAnalysis、RegressionModelAnalysis、UnsupervisedModelAnalysis 和 TextModelAnalysis。在 Aethos 2.0 中,它们可以通过两种方式进行初始化:

  • 使用 Aethos 训练模型的结果
  • 通过提供模型对象、模型使用的训练数据以及评估模型性能(用于回归和分类)的测试数据来自行初始化它。

与模型对象类似,我们将探索分类模型分析对象,但对于回归、无监督和文本模型分析,过程是相同的。

从 Aethos 初始化

首先,我们将从建模的地方开始,查看逻辑回归模型的指标。

type(lr)

aet hos . model _ analysis . class ification _ model _ analysis。分类模型分析

lr.metrics()

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

您还可以根据您的业务需求来设置项目度量。

at.options.project_metrics = ["Accuracy", "ROC AUC", "Precision"]lr.metrics()

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

如果您只想查看单个指标,也有相应的功能。

lr.fbeta(beta=0.4999)

0.8380023094880403

您可以用一行代码分析任何模型结果:

  • 韵律学
  • 分类报告
  • 混淆矩阵
  • 决策界限
  • 决策图
  • 依赖图
  • 力图
  • 石灰地块
  • 莫里斯敏感度
  • 模型重量
  • 汇总图
  • 受试者工作特征曲线
  • 单个指标

而且这只是针对分类模型,每种类型的问题都有自己的一套 ModelAnalysis 函数。

lr.classification_report()

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

lr.confusion_matrix()

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

您可以将训练集中的特征提供给依赖图,否则它将只使用模型中的前两个特征。在引擎盖下,它使用 YellowBricks 决策边界可视化工具来创建可视化。

lr.decision_boundary('age', 'fare')

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

还包括自动 SHAP 用例来解释你的模型。

lr.decision_plot()

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

lr.dependence_plot('age')

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

lr.force_plot()

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

lr.interpret_model()

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

查看模型中权重最高的要素。

lr.model_weights()

性别 _ 女:1.16
性别 _ 男:-1.16
pclass_3 : -1.08
年龄:-1.03
pclass _ 1:0.98
is _ child:0.41
上船 _ S:-0.31
船上 _Q : 0.21
上船 _C : 0.10
pclass_2 : 0.10

轻松绘制 RoC 曲线。

lr.roc_curve()

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

lr.summary_plot()

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

最后,我们可以使用 FastAPI、Gunicorn 和 Docker 通过 RESTful API 生成文件来部署我们的模型。

lr.to_service('aethos2')

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

用户初始化

如果我们像之前在笔记本中所做的那样手动训练一个模型,并且想要使用 Aethos 的模型分析功能,我们可以。

lr = at.ClassificationModelAnalysis(
    clf,
    df.x_train,
    df.x_test,
    target='survived',
    model_name='log_reg'
)

注意: x_train 和 x_test 数据集必须将目标变量作为数据帧的一部分。

你现在可以做我们刚刚做的所有事情,并获得相同的结果。现在,您可以手动转换数据,训练模型,并使用 Aethos 来解释结果。我把它们放在下面以供验证。

type(lr)

aet hos . model _ analysis . class ification _ model _ analysis。分类模型分析

lr.metrics()

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

lr.fbeta(beta=0.4999)

0.8380023094880403

lr.classification_report()

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

lr.confusion_matrix()

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

lr.decision_boundary('age', 'fare')

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

lr.decision_plot()

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

lr.dependence_plot('age')

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

lr.force_plot()

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

lr.interpret_model()

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

lr.model_weights()

性别 _ 女:1.16
性别 _ 男:-1.16
pclass_3 : -1.08
年龄:-1.03
pclass _ 1:0.98
is _ child:0.41
embarked _ S:-0.31
fare:0.31
embarked _ Q:0.21
embarked _ C:0.10
pclass _ 2:0.10

lr.roc_curve()

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

lr.summary_plot()

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

lr.to_service('aethos2')

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

反馈

我鼓励所有关于这个帖子或 Aethos 的反馈。你可以在推特上给我发信息,或者在 sidhuashton@gmail.com 给我发电子邮件。

任何 bug 或功能请求,请在 Github repo 上创建问题。我欢迎所有功能请求和任何贡献。如果你想为一个开源项目做贡献,这个项目是一个很好的开端——如果你需要帮助,可以随时给我发消息。

Aethos —自动化工作流程的数据科学库

原文:https://towardsdatascience.com/aethos-a-data-science-library-to-automate-workflow-17cd76b073a4?source=collection_archive---------26-----------------------

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

照片由来自 PexelsJosh Sorenson 拍摄

作为一名行业数据科学家,我相信许多其他数据科学家都会遇到一些棘手问题:

  1. 将以前项目中的代码复制并粘贴到当前项目中,或者从一个笔记本复制并粘贴到另一个笔记本中是一件令人沮丧的事情。
  2. 对于同样的任务,每个数据科学家都会以自己的方式来完成。
  3. 用笔记本名称管理实验会很快变得杂乱无章,构建数据科学项目会变得一团糟。
  4. 当你在分析过程中记录你的过程通常会打乱你的流程。
  5. 版本控制模型,将它转换成服务,并在模型被训练后开发数据管道。
  6. 出现了大量不同的库,每一个都填补了数据科学& ML 的一个空白,每次学习一个新的 API(特别是深度学习和 NLP)或阅读文档(如果有的话)都有点令人厌倦。很讽刺,我知道。
  7. 制作哪怕是半吸引人的可视化效果通常都很耗时,有时甚至很困难。

这就是为什么我做了艾多斯。

Aethos 是一个自动化数据科学技术和用例的 Python 库,从缺失值插补,到 NLP 预处理、特征工程、数据可视化,一直到建模和生成代码,以部署您的模型即服务,以及您的数据管道。

装置

让我们像安装其他 Python 包一样安装 Aethos:

pip install aethos

一旦安装了 Aethos,我们就可以做一些事情了。我们可以安装所有需要的自然语言处理语料库,

aethos install-corpora

安装 QGrid 等扩展,以便在与数据交互时获得更好的体验

aethos enable-extensions

创建一个数据科学项目,用完整的文件夹结构存放源代码、模型、数据和实验。

aethos create

入门指南

首先,让我们导入必要的库:

import aethos as at
import pandas as pd

在我们开始之前,让我们也配置一些选项,让我们的生活更轻松。就我自己而言,我经常写一份报告,记录我在分析过程中采取的步骤,以及我为什么要这样做,以便更好地与团队中的其他数据科学家交流我的过程,或者如果我在很长一段时间后回到实验中,也可以更好地与自己交流。在我们进行分析时,Aethos 会自动将报告写成文本文件,而不是手动编写报告(所有报告都保存在%HOME%/中)。aethos/reports/)。要让 Aethos 将报告写成 word 文档,我们只需启用选项:

at.options.word_report = True
at.options.interactive_table = True

interactive_table选项将使用 itables 库显示我们的数据,这是我个人最喜欢的库,因为它具有客户端搜索功能。

现在让我们加载数据。Aethos 以熊猫数据帧的形式接收数据,这样数据就可以像处理熊猫一样被加载。在这个例子中,我们将使用泰坦尼克号数据集。

data = pd.read_csv('titanic.csv')

要使用 Aethos,我们只需将数据帧传递给 Aethos 数据对象。

df = at.Data(data, target_field='Survived', report_name='titanic')
df

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

关于刚刚发生的事情,有几点需要注意:

  • 由于这是一个监督学习问题,我们指定了我们想要预测的列(“幸存”)。
  • 默认情况下,因为我们没有向数据对象传递任何测试数据,所以 Aethos 会自动将给定的数据分成一个训练集和一个测试集。这可以通过在初始化数据对象时设置split=False来关闭。
  • 默认情况下,分割百分比为 20。这可以通过将test_split_percentage设置为 0 到 1 之间的浮点数来改变(默认为 0.2)。
  • 我们将报告名称指定为titanic,因为我们指定要创建 Word Doc,所以在%HOME%/.aethos/reports/中将创建一个titanic.txt和一个titanic.docx

让我们从一些基本的分析开始。

分析

使用数据对象就像处理熊猫数据帧一样。

df['Age'] # returns a Pandas series of the training data in the Age columndf[df['Age'] > 25] # returns a Pandas DataFrame of the the training data where Age is > 25.df.nunique() # You can even run pandas functions on the Data object, however they only operate on your training data.

添加新的列和在 pandas 中做的一样。添加新列时,它会根据数据集的长度将新数据添加到数据集(如果数据被拆分,则进行训练或测试)。但是,您也可以指定将它添加到哪个数据集:

# based off the length of some_iterable it will add to the train set or test set (if data is split).df[`new_col_name`] = `some_iterable`# you can also specify what dataset to add it to as welldf.x_train # pandas dataframe of the training set
df.x_test # pandas dataframe of the test testdf.x_train[`new_col`] = `some_iterable`
df.x_test[`new_col`] = `some_iterable`

Aethos 提供了几个选项,让您可以从整体上了解自己的训练数据。第一个你可能很熟悉。Aethos 的describe函数扩展了 pandas 来提供一些额外的信息。

df.describe()

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

我们还可以获得关于每个专栏的更详细的信息,所有这些都可以通过 pandas-summary 库获得。

df.describe_column('Age')

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

该命令还提供了数据的直方图。每个统计值都可以通过引用其名称来访问。

df.describe_column('Age')['iqr']

另一个选项是通过 pandas-profiling 生成 EDA 报告。

df.data_report()

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

我们还可以用一行代码生成直方图、pairplots 和 jointplots(注意:为了更好地适应本文,图像大小被缩放,并且是可配置的)。

df.jointplot('Age', 'Fare', kind='hex', output_file='age_fare_joint.png')
df.pairplot(diag_kind='hist', output_file='pairplot.png')
df.histogram('Age', output_file='age_hist.png')

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

接合图、成对图和直方图(从左到右)

我们还可以随时查看两个数据集中缺失值的信息。

df.missing_values

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

让我们来处理客舱、年龄和上船列中缺失的值。

出于本文的目的,我们将用最常见的值替换Embarked列中缺失的值,用中间值替换Age列中缺失的值。然后我们将删除Cabin列。

df.replace_missing_mostcommon('Embarked')

仅仅几行代码就发生了很多事情。先说插补。

  • Aethos 使用已建立的包(sci-kit learn、nltk、gensim 等。)来做所有的分析,在这种情况下,插补。
  • 为了避免数据泄露,所有的分析技术都适用于训练集,然后应用于测试集。
  • 一般来说,当存在测试集时,对训练集所做的任何事情都将应用于测试集。
  • 当您运行一项技术时,该技术的一个简短描述会被写到报告中。
  • 所有这些对于每一种 Aethos 分析技术都是一致的,并且可以在源代码这里中查看(这个函数在 cleaning/clean.py 中)。
df.replace_missing_median('Age')
df.drop('Cabin')

让我们也删除 Ticket、Name、PClass、PassengerId、Parch 和 SibSp 列。

df.drop('Ticket', 'Name', 'PClass', 'PassengerId', 'Parch', 'SibSp')

这不是一篇关于为什么你应该在 pandas 中避免使用.apply函数的文章,但是为了 API 的覆盖范围和一致性,你也可以在 Aethos 中使用.apply。指定一个函数和一个输出列名,就可以开始了。

两个最大的区别在于,整个数据帧被传递到函数中,而 Swifter 库用于并行化函数的运行,从而减少运行时间。

def get_person(data):
    age, sex = data['Age'], data['Sex']
    return 'child' if age < 16 else sexdf.apply(get_person, 'Person')

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

就像任何其他 Aethos 方法一样,函数get_person适用于训练和测试集。Aethos 在使用.apply时提供了一个优化,但可能的话最好还是使用矢量化。

我们现在可以删除Sex列。

df.drop('Sex')

我们需要将EmbarkedPerson转换成数字变量,为了简单起见,我们只使用一键编码。我们还想删除用keep_col参数指定的原始列。因为我们使用的是 scikit-learn 的 OneHotEncoder 类,所以我们也可以将关键字参数传递给它的构造函数。

df.onehot_encode('Embarked', 'Person', keep_col=False, drop=None)

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

报告

关于当前的报告特性,需要记住的几件事情是,它按照代码执行的顺序进行记录和编写,并且它目前不为任何图像添加标题。我们还可以通过执行以下操作随时写入报告:

df.log(`write_something_here`)

结论

Aethos 是标准化的 API,它允许你用一行代码运行分析技术、训练模型等等。我所展示的只是您可以用 Aethos 完成的分析技术的冰山一角。Aethos 中有超过 110 种自动化技术和模型,更多技术和模型即将推出。

在随后的博客文章中,我将回顾训练模型和查看 Aethos 的结果。要了解更多细节,我推荐阅读 Github 上的用法部分或文档

即将推出

这只是对 Aethos 的介绍,但新功能即将推出!完整的路线图你可以在这里查看。

在不久的将来,你可以期待:

  • 使用 MLFlow 进行实验管理
  • 用更好的 API 改进现有的可视化
  • 更加自动化的可视化
  • 更多自动化技术(降维、特征工程)
  • 预先训练的模型(GPT-2,伯特等。)

反馈

我鼓励所有关于这个帖子或 Aethos 的反馈。你可以在推特上给我发信息,或者在 sidhuashton@gmail.com 给我发电子邮件。

任何 bug 或功能请求,请在 Github repo 上创建问题。我欢迎所有功能请求和任何贡献。如果你想为一个开源项目做贡献,这个项目是一个很好的开端——如果你需要帮助,可以随时给我发消息。

浓缩咖啡的经济咖啡溶解度工具(TDS ):白利糖度与 Atago

原文:https://towardsdatascience.com/affordable-coffee-solubility-tools-tds-for-espresso-brix-vs-atago-f8367efb5aa4?source=collection_archive---------2-----------------------

通过一些数据收集,我发现一个便宜的白利糖度折射仪和一个更贵的 Atago 测量咖啡萃取物一样准确。

我犹豫要不要买 TDS 表,因为我不确定它是否值得。标准的 VST 数字折射仪价格约为 700 美元,即使是价格较低的也要 100 美元。最终,我买了一个 20 美元的白利糖度计,后来,我终于决定买一个更贵的(Atago)。我收集数据来帮助理解 Atago 的工作情况,以及它与更便宜的工具相比如何。

长话短说:便宜的电表和数字电表一样精确,只是不太方便。

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

我的 TDS 历史

我不确定总溶解固体(TDS) 是否与味道相关。这当然是一个很好的衡量标准,但我不喜欢这个价格。我发表了一篇关于断续浓缩咖啡镜头的作品,主要的批评是我没有使用 TDS,而 TDS 是咖啡师世界的标准。相反,我使用一个包含 7 个指标的记分卡(尖锐、浓郁、糖浆、甜味、酸味、苦味和余味)得出最终得分。这些分数当然是主观的,但它们符合我的口味,帮助我提高了我的投篮。

最终,我屈服了,我买了一个便宜的白利折光仪。在拍摄的时候,我在检查 TDS 的过程中获得了很多乐趣,但是当然,有些人并不相信,因为这是通过目测完成的。所以我决定买一台 100 美元的折光仪,直到我看到评论很差,碰巧的是,我发现有人卖 200 美元的 Atago。通常情况下,一辆 Atago 要花费 300 美元或更多,而且在美国很难找到。

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

将白利糖度转换为 TDS 可以使用一个简单的公式:

TDS = 0.85 *白利糖度

有些人认为这个度量标准太简单了,这个问题可以通过比较 Brix 和 Atago 来解决,如下所示。

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

Atago 测试

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

首先,我想测试 Atago 在镜头冷却时处理温度变化的能力。我从我的可靠的老 Odea Giro Superautomatic 中取出一张照片,因为我不担心高 TDS 照片。

我还想在测量 TDS 之前测试过滤样品。一些人声称你应该在测量 TDS 之前过滤样本,但是一项研究表明过滤器降低了 TDS。他们确实发现过滤后的样品在测量中的可变性更小。我也想做科学家做的事情,看看我是否能快速验证他们的结果,而不用购买昂贵的 VST 注射器过滤器。为了测试过滤,我使用了 Aeropress 滤纸。

这是我的设置:

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

1)初始设置。2)正在使用的设置。3)过滤后的空气压力纸过滤器

起初,我测试了单个样本并读取了多个读数,这似乎表明差异很大,但接近 Atago 规范的+/- 0.03 TDS。

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

然后我取了 10 个未经过滤和经过过滤的样本,结果似乎遵循了的想法,即经过过滤的样本提供了更多可重复的测量

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

然后随着镜头的冷却,我进行了测量。我将一个样品放在 Atago 上,进行多次测量,以消除抽取不同样品的变量。随着温度的下降,TDS 继续上升,直到在 22.5 时达到最大值。在网上讨论了结果之后,我通过更多的测试找到了原因。随着时间的推移,样品慢慢蒸发,导致 TDS 攀升,直至达到最大值。

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

总的来说,Atago 非常容易使用,尤其是与白利糖度计相比。通常,为了获得良好的白利糖度读数,我必须将闪光灯(通常来自我的手机)举到另一端,以确保有足够的光线通过。白利糖度每 0.2 个读数就有一条线,大量使用后,你能分辨的最佳读数是 0.1 或 0.085 TDS。

白利糖度计对于多个样品来说也不是很好,因为你必须打开顶部,擦拭干净,添加另一个样品,关闭它,然后拿着它对着光,而不是只向 Atago 中添加三滴。

白利糖度与 Atago

在过去的一个月里,我拍摄了 35 张照片,测量了白利糖度和阿塔戈糖度。我通常以 1:1 的输出输入比停止拍摄,但是由于我的实验随着时间提取,我开始测量拍摄的剩余部分(我称之为秒)。这导致 35 个以上的读数。此外,我计算了一下,如果我把 1:1 的投篮和秒的投篮结合起来,打出 3:1 的投篮,我的得分是多少。

当我用 Atago 取样时,我每次用三滴。我的目标是尽可能保持这个过程的可重复性。

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

从这些结果来看,似乎 Atago 和白利米给出了类似的结果。忽略一些异常值,误差甚至没有那么大。

从输出与输入的比率来看,似乎有一个与 TDS 相关的趋势,这是正常的,因为 TDS 在较小的拍摄中开始非常高,并随着时间的推移而降低。这与比率以及 Atago 和 Brix 之间的差异没有关系。

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

Atago 提供的另一个度量是温度,所以我们可以看一下温度和 TDS,但似乎没有太大的相关性。温度似乎也不会影响白利糖度和 TDS 的比较。

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

最后,由于我们有超过 30 个样本,我们可以进行配对 t 检验来确定分布是否在统计上不同,这意味着检验的 p 值小于 0.05。在下表中,可以看到分布在统计上没有差异,因为所有的 p 值都大于 0.05。

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

这些测试非常有助于信任 Atago 仪表,也信任我之前使用白利糖度(超过 200 个样本)得出的结果。在我的实验中,Atago 计量器已经成为我更好地理解拍摄的关键,我希望这些结果能够帮助那些没有足够钱购买工具来帮助测量和改善他们的浓缩咖啡以及其他形式的咖啡的人。

如果你愿意,可以在推特和 YouTube上关注我,我会在那里发布不同机器上的浓缩咖啡照片和浓缩咖啡相关的视频。你也可以在 LinkedIn 上找到我。

我的进一步阅读:

断续浓缩咖啡:提升浓缩咖啡

通过过滤器测量浓缩咖啡萃取量

浓缩咖啡中咖啡溶解度的初步研究

浓缩咖啡模拟:计算机模型的第一步

咖啡数据表

工匠咖啡价格过高

被盗浓缩咖啡机的故事

平价咖啡研磨机:比较

浓缩咖啡:机头温度分析

浓缩咖啡过滤器分析

便携式浓缩咖啡:指南

克鲁夫筛:一项分析

非洲影响者:使用 Python 对 Twitter 用户进行细分

原文:https://towardsdatascience.com/african-influencers-twitter-users-segmentation-40753ee0a0bd?source=collection_archive---------78-----------------------

使用 Twitter 数据确定非洲最有影响力的人,以推动营销战略。

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

卢克·切瑟在 Unsplash 上的照片

简介

Twitter 是最受欢迎的社交媒体平台之一。这是一个不断更新的信息流池,在这里可以研究趋势、喜好、爱好、社区和新闻。在数百万用户中,有政治和社会影响力的人只占一小部分。这些小群体可以被确定、研究并用于各种活动和营销策略。这项研究的目的是使用 Python 来确定和排列非洲最有影响力的人和政府官员。

为了实现这一点,我们将使用 3 个指标得分:

  • 人气评分-喜欢和转发
  • 影响程度得分
  • 相关性分数-提及和回复计数

数据采集

我们从收集 twitter 句柄开始

使用 web 抓取技术来获取所需的 twitter 句柄。然后使用 Tweepy 提取分析所需的用户信息。

Python 库

from requests import get
from requests.exceptions import RequestException
from contextlib import closing
from bs4 import BeautifulSoup
import pandas as pd
import re
import numpy as np
import os, sys
import fire
import tweepy

卷筒纸报废

我们搜索列出的网站,以获得非洲高层人士和政府官员的 twitter 账号。

def simple_get(url):
    """
    Attempts to get the content at `url` by making an HTTP GET request.
    If the content-type of response is some kind of HTML/XML, return the
    text content, otherwise return None.
    """
    try:
        with closing(get(url, stream=True)) as resp:
            if is_good_response(resp):
                return resp.content  #.encode(BeautifulSoup.original_encoding)
            else:
                return None

    except RequestException as e:
        log_error('Error during requests to {0} : {1}'.format(url, str(e)))
        return None

def is_good_response(resp):
    """
    Returns True if the response seems to be HTML, False otherwise.
    """
    content_type = resp.headers['Content-Type'].lower()
    return (resp.status_code == 200 
            and content_type is not None 
            and content_type.find('html') > -1)

def log_error(e):
    """
    It is always a good idea to log errors. 
    This function just prints them, but you can
    make it do anything.
    """
    print(e)

def get_elements(url, tag='',search={}, fname=None):
    """
    Downloads a page specified by the url parameter
    and returns a list of strings, one per tag element
    """

    if isinstance(url,str):
        response = simple_get(url)
    else:
        #if already it is a loaded html page
        response = url

    if response is not None:
        html = BeautifulSoup(response, 'html.parser')

        res = []
        if tag:    
            for li in html.select(tag):
                for name in li.text.split('\n'):
                    if len(name) > 0:
                        res.append(name.strip())

        if search:
            soup = html            

            r = ''
            if 'find' in search.keys():
                print('findaing',search['find'])
                soup = soup.find(**search['find'])
                r = soup
if get_ipython().__class__.__name__ == '__main__':
    fire(get_tag_elements)

下面是通过其中一个列出的网站后的输出示例:

['@EswatiniGovern1',
 '@MalawiGovt',
 '@hagegeingob',
 '@FinanceSC',
 '@PresidencyZA',
 '@mohzambia',
 '@edmnangagwa',
 '@MinSantedj',
 '@hawelti',
 '@StateHouseKenya',
 '@PaulKagame',
 '@M_Farmaajo',
 '@SouthSudanGov',
 '@SudanPMHamdok',
 '@TZSpokesperson',
 '@KagutaMuseveni']

使用 tweepy APIs,我们可以传递从废弃网站获取的列表来废弃 twitter 中的用户信息。对于我们的例子,我们需要每个帐户的用户的屏幕名称、tweets 数量、关注、追随者、喜欢、转发、标签和提及。

下面是一个示例代码:

df = pd.DataFrame(columns=['screen_name','description','number_of_tweets','following', 'followers',
                          'likes', 'retweets', 'hashtags', 'mentions'])
def get_data(account_list):
    for target in account_list: 
        item = api.get_user(target)
        name = item.name
        screen_name = item.screen_name
        description = item.description
        number_of_tweets = item.statuses_count
        following = item.friends_count
        followers = item.followers_count
        # age of account
        account_created_date = item.created_at
        delta = datetime.utcnow() - account_created_date
        account_age_days = delta.days
        if account_age_days > 0:
            avg_tweets_per_day = float(number_of_tweets)/float(account_age_days)
        # tweets (hashtags and mentions)
        global hashtags, mentions, replies, comments  # making them global in order to intergrate them to the df later
        hashtags = []
        mentions = []
        comments = []
        retweet_count = []
        likes_count = []
        replies = []
        tweet_count = 0
        end_date = datetime.utcnow() - timedelta(days=180)
        for status in Cursor(api.user_timeline, id=target, include_rts=False).items():                
            tweet_count += 1
            if hasattr(status, "entities"):
                entities = status.entities
        process_status(status)
            #hashtags
            if "hashtags" in entities:
                for ent in entities["hashtags"]:
                    if ent is not None:
                        if "text" in ent:
                            hashtag = ent["text"]
                            if hashtag is not None:
                                  hashtags.append(hashtag)
            #mentions  (will fetch other users but will later use to do mention counts between the involved users)                   
            if "user_mentions" in entities:
                for ent in entities["user_mentions"]:
                    if ent is not None:
                        if "screen_name" in ent:
                            name = ent["screen_name"]
                            if name == target:
                                if name is not None:
                                    mentions.append(name)

数据帧作为输出返回。下面是输出的一个示例。

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

分析

根据这些指标进行分析,以确定非洲最具影响力的人物。Matplotlib 用于绘制图形和可视化分析的数据。下面是非洲政府高级官员受欢迎程度得分的柱状图。

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

基于 in-degree 影响力的非洲顶级人物条形图。

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

结论

根据上述图表所示的分析,非洲最有影响力的人物是:

  • 特雷弗·诺亚
  • 朱利叶斯·马莱马

根据分析,非洲最有影响力的政府官员是:

  • 布哈里先生
  • 卡古塔·穆塞韦尼

数字营销是营销策略的新标准。与合适的影响者合作,在商品和合适的市场之间架起一座桥梁。数据科学可以在企业中用于推动关键的营销决策。

参考

[1] Cha,m .,Haddadi,h .,Benevenuto,f .,和 Gummadi,K. (2010 年)。测量 Twitter 中的用户影响力:百万追随者谬误。从 http://twitter.mpi-sws.org/icwsm2010_fallacy.pdf取回

GitHub 库可以获得全部代码。

在 Covid 之后,AI 将转向

原文:https://towardsdatascience.com/after-covid-ai-will-pivot-dbe9dd06327?source=collection_archive---------41-----------------------

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

照片由杨奇煜·巴扎内盖在 Unsplash 上拍摄

世界刚刚改变了。对于技术领域的任何人来说,这都是一个问题。科技行业通过创新引领世界,只有当你能够预测需求并开发出满足需求的解决方案时,创新才会发生。这突然变得很难做到。当你不知道六个月后世界会变成什么样子时,将想法转化为商业成功并不容易。

这个问题对于人工智能来说尤其尖锐。人工智能产品,就其本质而言,旨在从一致的数据流中寻找有用的模式。如果你刚刚训练你的机器检测的所有模式不再意味着它们过去的意义,那不仅仅是一个问题,那是一个技术噩梦。你过去 N 年收集的所有数据现在值多少钱?你知道吗?无论您是在模拟房价、股市、城市交通、新闻文章内容、市场情绪、购买模式、投票模式、慈善行为还是医疗保健产品需求,您现有数据存储的价值都变得值得怀疑。更不用说数据流本身的一致性也不再可靠。如果数据是新的石油,一些钻井平台就着火了。

人工智能行业肯定会适应这些条件。一些应用程序甚至会从这种变化中受益。衣服还是会像衣服,牙膏还是像牙膏,所以搭配实体产品不会有问题。同样,人类生成的视频内容现在比以往任何时候都多。但是在 Covid 之后,这个数据一致性问题不会消失。事实上,情况会变得更糟。

正如我在其他 文章中指出的,在某些方面,当前的疫情构成了人类的一次非凡的幸运。鉴于全球社会和经济体系的加速 相互关联,某种形式的连锁失败是不可避免的。事实上,我们已经得到了一个很小的、早期的系统性冲击,可能会杀死仅仅几百万人,这是一个礼物——一个很难欣赏或享受的礼物,也许,但仍然是一个礼物。

后 Covid 时代的世界仍将过于相互关联和过度杠杆化,无论采取什么样的短期措施,都无法维持当前的发展轨迹。但现在,我们尝到了 21 世纪的滋味,这意味着我们有时间在下一次冲击到来之前适应。这意味着未来几十年商业的一个关键术语将是“弹性”。

模式检测和预测仍将是大赢家——事实上,比以往任何时候都大——但这些解决方案看起来不会像目前吸引硅谷注意力的那些。去看看任何新闻网站或社交媒体上关于疫情疾病建模工作的参考资料,你应该会有所发现。没有一个思想领袖使用机器学习来建立预测病床需求、呼吸机生产或经济影响的模型。这是因为这些技术在现在最重要的预期方面是没有希望的。

深度学习,以及当前场景中的其他算法宠儿,不仅仅是在一堆标记良好、平衡、统一的数据上做最好的,他们需要它们。我们在过去十年中构建的几乎所有智能工具都是为了利用这个充满同质、可管理信息的世界。在许多方面,它们很像信贷危机爆发前流行的房地产定价模型,在这种模型中,房子的价值只会上升。

我们现在可能正在目睹简单人工智能时代的终结。如果不是这样,我们肯定听到了警钟,它的时代即将结束。那么,聪明的技术专家或投资者应该做些什么呢?

幸运的是,还有其他技术可以让理解当前的世界。想知道它们是什么吗?再一次,去检查你的新闻,看看流行病学家在用什么。工具列表很能说明问题:网络模型、基于代理的模型、决策分析、因果推理。他们都有什么共同点?它们旨在扩展人类的直觉,而不是取代它。他们不会自动完成简单的任务。相反,它们使人类专家能够实现否则不可能实现的事情。它们扩大了公司行为的范围,而不是加速已经存在的行为。

在关注世界发展轨迹的思想领袖的推动下,一场围绕这一方针组织的运动在过去几年中一直在幕后缓慢而悄然地发展。那个动作叫做决策智能(DI) 。它广泛使用了强大的分析技术,这些技术在深度学习时代没有受到太多的欢迎,但现在正重新成为人们关注的焦点:场景规划、图形建模、决策理论。这些工具的优势在于它们能够以一种机器学习迄今无法做到的方式明确地表示不确定性。

谁已经在使用决策智能了?正是你所期望的垂直市场:那些总是看到理解和掌握波动性的价值的组织。公用事业公司,例如,资本管理公司,银行和电信公司。谁在开发支持这种需求的工具?在大多数情况下,像 QuantelliaLumina Decision Systems 这样有远见的小公司。他们的产品往往专注于让商业决策者将他们的直觉专业知识转化为量化模型,从而管理风险和指导战略选择,但他们的潜力远不止于此。例如,Lumina 的旗舰产品 Analytica 可以作为任何东西运行,从简单的财务规划工具到成熟的蒙特卡罗模拟器,用于任意复杂的数字模型。

DI 如何与 AI 对接?首先,它帮助你理解在不稳定的条件下你希望收集什么样的数据,以及从中得出什么样的推论可能是可靠的。它可以帮助您识别机器学习的用例,否则这些用例可能会被忽略。也许最重要的是,它可以将 ML 转变为一种组织感知,使世界的波动性更容易管理。

我在这篇文章开始时指出 ML 工具的优势在于检测一致的重复模式。当它们连接到一个组织神经系统,能够使用这些检测来驱动甚至自动化更高层次的决策时,就会发生一些奇妙的事情。这时,一个组织开始展示一种自适应的端到端智能,它融合了人类和机器的最佳能力。如果你的企业是一种动物,机器学习工具就是它大脑的视觉和听觉中心。人工智能工具代表了它的本能和适应性智能。直截了当地说,DI 告诉你钱的去向。ML 帮你嗅出来。

现有的 DI 工具能够完全实现这个承诺吗?在我看来,不完全是这样,部分原因是尽管 DI 运动的重要性日益显现,但它仍然资金不足。然而,他们非常接近。在我看来,当 DI 工具能够将来自多个不同人类来源的因果模型集成到一个能够适应新数据出现的合并表示中时,重大突破就会到来。众包和遗传算法中诞生的一些东西需要被注入到混合中,以将 DI 带到下一个水平。但我的猜测是,这样的工具最多还需要两年时间。最近由朱迪亚·珀尔的研究推动的对因果推理的兴趣激增实际上保证了它们的产生。

那么后 Covid 的 AI 格局会是什么样子呢?绝对不同,但希望因此变得更好更强。也许我们不应该哀悼 easy AI 和依赖它的公司的终结。毕竟,即使转型是痛苦的,变化也一直是推动技术创新的燃料。我们走向的以 DI 为燃料的未来肯定会更好。机器学习已经死了。机器学习万岁。

使用面部图像的年龄检测:传统机器学习与深度学习

原文:https://towardsdatascience.com/age-detection-using-facial-images-traditional-machine-learning-vs-deep-learning-2437b2feeab2?source=collection_archive---------7-----------------------

使用 scikit-learnTensorFlow 进入计算机视觉领域的初学者步骤。

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

网络摄像机视频的实时年龄分类。顺便说一下,我 26 岁了。(图片由作者提供)

我是一名有抱负的数据科学家,进行了几个月的密集数据科学学习和项目。大约一年半前,当我通过在线视频和课程学习 Python 时,我对这个领域产生了兴趣。为了提高我在该领域的理解,我决定参加由大会提供的数据科学沉浸式训练营。通过这个项目,我们接受了几个项目的任务,这些项目为我们提供了“实践”经验。作为对我为期 12 周的数据科学之旅的致敬,我很乐意分享我的最后一个,也可能是其中最引人注目的一个——我的顶点项目。该项目的核心是利用图像数据和计算机视觉,利用人脸图像建立年龄分类算法。

为什么要阅读这篇文章?在互联网上快速搜索可能会产生大量关于如何构建年龄分类器的文章、视频、GitHub 链接和研究论文。那么,我的文章在一堆相似的内容中处于什么位置呢?为什么你应该继续阅读这篇文章?嗯,这是为什么…

  • 两种方法:传统机器学习与深度学习 —听从导师的建议,我试图使用两种不同的方法为这个项目构建一个解决方案。我在网上遇到的大多数资源都直接进入了深度学习和神经网络,以建立解决这个问题的解决方案(你可能会说这应该是正确的方法)。然而,为了真正欣赏数据科学中传统的机器学习方式,并欣赏深度学习的力量和可能性,我试图探索传统的机器学习方法(图像特征提取,然后使用著名的 sklearn 库进行分类建模)。我在这个项目中利用了深度学习方法的 TensorFlow 库。
  • 最重要的是,因为我是一个业余爱好者——如果你像我一样是一个初学者,正在考虑开始(或者已经在努力)一个类似的项目,你可能会发现这篇文章很有帮助。在这里,我尝试浏览工作流程,同时讨论我在这个项目中必须做出的各种决定背后的思维过程和基本原理。我还希望,我在该领域的新手身份,加上我(相当)成功地尝试解决如此性质和规模的项目,可能是您在开始数据科学之旅时正在寻找的那种灵感。

也就是说,如果你碰巧是这个领域的专家,或者如果你有一些更好的想法来完成这个项目中的某些事情,一定要让我知道。

所以,如果我足够幸运,能让你一直保持兴趣,让我们再往前推一点,直接进入正题。

为了这个项目,我决定在我的个人电脑上使用 Google Colab 而不是 Jupyter 笔记本。这样做的主要原因是利用谷歌提供的免费 GPU 来训练我的深度学习模型。也就是说,也有可能使用传统的 CPU 来完成这个项目,只是可能需要稍微长一点的时间。对于那些刚刚接触 Google Colab 的人来说,你可以在这里读到一些关于它的内容

TL;这里是所有不同方法的准确度分数的总结。

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

源代码和数据集

这个项目中使用的源代码和数据集可以在下面给出的链接中找到。请参考随附的 README.txt 文件,了解如何在运行笔记本中的代码之前将笔记本复制到您自己的 Google Drive 中。

文件夹 1(源代码):Age _ class ification _ with _ Faces

文件夹 2(数据集): 年龄 _ 分类 _ 拥有 _ 面孔 _ 数据集

在整篇文章中,我提供了对不同源代码笔记本的引用,这些笔记本包含了以下部分的相关代码。我希望这能让你更容易理解这个项目。

如果你已经对尝试这个项目的最终产品感到好奇(就像本文开头的 GIF),要么通过从 这里 下载 Jupyter 笔记本(以及经过训练的模型)作为 ZIP 文件进行离线尝试,要么在这个 Google Colab 笔记本 中进行在线尝试。请注意,实时网络摄像头视频中的年龄检测仅适用于 Jupyter 笔记本电脑,不适用于 Google Colab 笔记本电脑。您仍然可以在 Google Colab 笔记本中对您上传的照片和视频进行年龄检测。

数据收集和探索性数据分析(EDA)

互联网上有很多带有年龄标签的面部图像数据集。一些著名的包括 IMDB-WIKI 数据集野生(LFW)数据集全年龄人脸数据集。对于这个项目,我决定使用面部年龄数据集UTKFace 数据集 ( UTKFace Cropped 是另一个来源)。这两个数据集都提供了已经被适当清理和标记的图像,使我能够跳过工作流程中最耗时的数据清理阶段。让我们更详细地看一下这两个数据集。

本节相关代码参见笔记本1 _ EDA _ dataset _ prep . ipynb

面部年龄数据集包含9778 张大小为 200x200 像素PNG 格式的面部RGB 图像。图像被分成文件夹,文件夹名称与这些文件夹中图像的年龄标签相对应。数据集中年龄的分布和范围显示在下面的柱状图中。

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

面部年龄数据集中的年龄分布和范围。(图片由作者提供)

UTKFace 数据集包含了23708 张人脸的 RGB 图像JPG 的格式,每张大小为 200x200 像素。图像的标签嵌入在文件名中,格式为[年龄][性别][种族]_[日期&时间]。jpg 。数据集中年龄的分布和范围显示在下面的柱状图中。

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

UTKFace 数据集中年龄的分布和范围。(图片由作者提供)

由于两个数据集都已经提供了标准化为 200x200 像素大小的清晰正面人脸图像(每张图像一张),因此我决定为这个项目将两个数据集合并在一起,并将所有 33,486 张图像转换为标准的 JPG 格式。下面的柱状图显示了合并两个数据集后的图像分布。

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

人脸年龄数据集和 UTKFace 数据集合并后的图像分布。(图片由作者提供)

在合并了两个数据集之后,下一步是将不同的年龄标签划分为不同的年龄范围。因为这个项目不是专门针对解决任何特定的数据科学问题,所以选择将年龄范围划分为不同的类别是非常灵活的。然而,仍有必要确定该项目背景下这一进程的一些制约因素,如下所示:

  1. 类别需要平衡 —年龄范围的类别应根据每个年龄标签可用的图像数量来建立,以使类别尽可能平衡。这将确保分类模型学会平等地对每个年龄范围进行分类。
  2. 班级数量需要足够——年龄范围的班级数量需要适当选择。太多的类别将导致非常窄的年龄范围,这可能会严重影响模型性能(通常更难预测某人的年龄精确到哪一年)。太少的类将导致非常宽的年龄范围,这可能不符合年龄分类建模本身的目的。在这种情况下,6–12 个等级可能是合适的。
  3. 每个类别都需要有足够的数据——年龄范围类别的数量也将取决于数据集中每个类别可用的图像数量。太多的类别将导致狭窄的年龄范围,从而减少可用于在每个类别上训练模型的图像数量。然而,这可能不是一个重要因素,因为数据扩充技术很容易获得,如果需要,可以用来增加每类可用图像的数量。

警告 —上面确定的约束意味着在这个项目中,我使用可用数据量作为定义我的分类问题性质的驱动因素。在现实世界的数据科学问题中,这可能不是一种理想的方法。实际上,理想的方法是首先根据手头的数据科学问题建立模型的类,然后为每个类收集足够数量的数据,以便适当地解决数据科学问题。然而,考虑到这个项目的业余性质,以及我对用于年龄分类的现成面部图像数据的有限访问,我相信这种方法在这种情况下是合理的。

经过反复试验,我决定将这些图片分成以下 11 类年龄范围,确保这些类别尽可能平衡。

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

图像按年龄范围分类的分布。(图片由作者提供)

在进行下一步之前,所有的图像都标有这些新的类别标签。

分类建模的数据准备

在对图像执行任何形式的分类或特征提取之前,有必要将组合数据集分成训练数据集和测试数据集。我使用了sk learn . model _ selection . train _ test _ split方法将数据集拆分成 70%的训练数据(23440 张图片)和 30%的测试数据(10046 张图片)

本节相关代码参见笔记本2 _ dataset _ prep _ ML _ feature _ extraction . ipynb

传统 ML:特征提取

有多种技术可用于处理从图像中提取特征以进行分类建模(例如,方向梯度直方图(HOG)滤波图像的能量和熵通道的平均像素值等)。).作为初学者,我确实发现所有这些方法理解起来有点复杂,用代码实现起来也有点复杂。

为了从我的项目的面部图像中提取特征,我决定对我的数据集中的一些图像应用一些不同的过滤器,并在视觉上尝试找出它们之间的任何显著差异。下图显示了该测试的结果。我强烈建议观看这个视频这个系列的其他视频,以更好地了解如何应用过滤器和处理机器学习的图像。

本节相关代码参见笔记本2 _ dataset _ prep _ ML _ feature _ extraction . ipynb

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

来自面部年龄数据集的面部图像的过滤版本。(图片由作者提供)

上图中的人脸随着我们从左到右(1-90 岁)年龄的增加而增加。当每个过滤器被应用于图像时,我们可以看到不同的面部特征是如何被突出显示的,以及它们是否有助于区分不同年龄的面部。

从上面的图中,我能够得出结论,在这种情况下,Canny 边缘可能是最有用的特征提取过滤器— 随着我们从年轻到年长的人脸,图像中 Canny 边缘的密度似乎会增加

既然选择的过滤器已经确定,下一步就是将过滤后的图像转换成标量,以便能够将它们输入到机器学习分类器中。为此,我决定将每个 200x200 像素的图像分解成每个 10x10 像素的部分,如下图所示。对于 400 个结果部分中的每一个,我然后计算像素值的平均值和标准偏差。这导致每幅图像有 800 个唯一的标量值,然后我将它们制成数据帧,用作机器学习分类器的特征。

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

将显示 Canny 边缘的图像分解为多个部分以进行特征提取。(图片由作者提供)

传统 ML:分类建模

对训练和测试数据集中的所有图像重复上述特征提取过程。这些特征然后被用在两个不同的分类器算法中,sk learn . ensemble . randomforestclassifiersklearn.svm.SVC 。通过将超参数的多个组合传递给 sklearn.model_selection,这两个模型都进行了精度优化。GridSearchCV。下表总结了所获得的结果。

本节相关代码参见笔记本3 _ ML _ class ification _ modeling . ipynb

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

显然,模型严重过度拟合,并且不能很好地概括看不见的测试数据(基本上是记忆训练数据)。下面的两个标准化混淆矩阵也清楚地表明了这一点——尽管对于较年轻的年龄范围(1-2 岁、3-9 岁、10-20 岁和 21-25 岁)和较老的年龄范围(66-116 岁)来说,准确性值有些高,但是对于 26-65 岁的中间年龄范围来说,存在着显著的错误分类。

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

RandomForestClassifier 和 SVC 模型年龄预测的标准化混淆矩阵。(图片由作者提供)

传统 ML:局限性及进一步改进

当然,有许多方法可以用来提高上述准确度分数并降低模型中的过度拟合程度。例如,可以使用一些其他更复杂的技术从图像中提取更好的区分特征,或者可以使用其他分类器来查看它们在这种情况下是否执行得更好。

深度学习:导入数据集

为了准备要传递到神经网络中的图像数据集,我首先尝试将图像转换成一个 Pandas Dataframe ,其中各个像素值作为列,图像作为行。然而,由于所有像素值都必须是浮点类型(从 0–255 整数缩小到 0–1 浮点),这导致了一个巨大而沉重的数据帧 (33,486 行 X 40,000 列)。就在训练神经网络之前将该数据帧加载到内存中导致了持续的**“内存不足”错误(尽管使用了 Google Colab Pro 中可用的 GPU 和 25GB 高 RAM 运行时类型)**。

为了避免这些错误,我不得不采用另一种方法,即使用 TensorFlow 的内置 来创建数据集管道。数据集**** API。这种方法显著降低了 RAM 消耗,因为当神经网络需要图像时,图像只以小得多的批量加载到存储器中(而不是像前一种方法那样将整个数据集保存在存储器中)。关于这种方法的更详细的解释可以在这篇文章中找到。

深度学习:分类建模

在正确导入数据集后,下一步是构建一个基本的卷积神经网络(CNN)模型,该模型在给定的数据和给定数量的总参数上具有合理的精度。我们的想法是获得模型性能的初始基准,然后逐步尝试不同的技术,看看它们是否能从该点提高性能。在对 CNN 架构做了一些反复的实验后,我决定从下面的架构开始。

本节相关代码参见笔记本4 _ deep _ learning _ CNN _ modeling . ipynb

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

用于图像年龄分类的初始 CNN 结构。(图片由作者提供)

我决定在训练 CNN 模型时使用TF . keras . callbacks . early stopping作为回调,以监控验证损失,从而避免过度拟合,并在验证损失开始持续增加时停止模型的进一步训练。在适合这个模型之前,图像也被从 RGB 彩色转换成灰度。在拟合 30 个时期的模型后,获得以下损失和准确度分数。

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

模型性能不是很好,但这是一个很好的起点,只有轻微的过度拟合。标准化混淆矩阵还显示,与上述传统 ML 方法类似,尽管年轻年龄范围(1-2 岁、3-9 岁、10-20 岁和 21-25 岁)和年长年龄范围(66-116 岁)的准确度值有些高,但 26-65 岁的中间年龄范围仍存在显著的错误分类。这可能归因于这样一个事实,即人们的面部外观(一般而言)在中年时期的变化不如在年轻和老年时期那么大。无论如何,这个过程的下一步是使用一些不同的技术来提高模型的性能。

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

使用灰度图像从初始 CNN 模型预测年龄的标准化混淆矩阵。(图片由作者提供)

深度学习:改进模型

首先尝试了以下两种策略来提高模型的性能:

  1. 使用 RGB 彩色图像而不是灰度图像:其背后的基本原理是,在图像中添加彩色数据可能会显示 CNN 模型中的一些特征,这可能会增强模型的整体性能。
  2. **增加训练数据集中的图像:**这背后的基本原理是增加模型训练的数据量将有助于增加数据集中的方差。这可以提高模型的准确性,同时降低过度拟合的可能性。对于每 1 幅原始图像,通过横向翻转图像并将它们旋转不同角度,创建了 9 幅其他增强图像,如下图所示。因此,增强的训练数据集总共有 234,400 幅图像(相比之下,原始训练数据集中有 23,440 幅图像)。

训练数据集数据扩充的相关代码参见笔记本4 _ 5 _ training _ data _ augmentation . ipynb

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

图像数据增强:从一幅原始图像创建 9 幅增强图像。(图片由作者提供)

使用与上述相同的 CNN 模型架构来拟合 RGB 彩色图像和增强训练数据集上的模型,并且观察到以下结果:

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

上表中的准确度分数强调了两个关键发现:

  1. 使用 RGB 彩色图像代替灰度图像可能不会提高模型性能,并且可能会导致更多的过度拟合。
  2. 增加训练数据集中的图像有助于提高模型的准确性,同时减少过度拟合(即使在训练 60 个时期后)。

深度学习:重新思考年龄范围

看一下上面所有 CNN 模型的评估,很明显准确率不是很高(最多 45%)。事实上,这是意料之中的,因为猜测一个人的年龄纯粹是基于外表,因此非常主观。就连我们人类也一直在与这个问题做斗争。有很多因素会影响一个人如何看待自己的年龄,比如遗传、生活条件和生活方式的选择(健康饮食、运动量、吸烟习惯等)。).

正如我们在上面看到的,即使增加了数据,准确率也没有显著提高。主要问题仍然是 26-65 岁这一中间年龄范围存在明显的错误分类。因此,为了避免这个问题,我决定再次将年龄范围重新分配到班级中。然而,这一次,我并不只是查看每个年龄范围内的可用图像数量,我还决定考虑人类直觉因素(我们人类可能将一个人归类到的年龄组)以及上面混淆矩阵中显示的各个类别的准确度分数。

警告 —上面详述的方法意味着在这个项目中,我操纵了数据科学问题本身,以更好地适应我试图提出的解决方案。在现实世界的大多数数据科学问题中,这显然不是一种理想的方法。然而,正如在开始提到的,由于这个项目不是专门针对解决一个数据科学问题的,所以选择将年龄范围划分成类是非常灵活的。考虑到重新分配年龄检测的年龄范围类别不会产生重大后果,我认为这种方法在这种情况下是合理的。

年龄范围被重新分为以下 7 类。

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

本节相关代码参考笔记本4 _ deep _ learning _ CNN _ modeling . ipynb

再次使用与上述相同的 CNN 模型架构来拟合训练数据集上的模型,并且观察到以下结果:

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

准确性分数显示了与第一个 CNN 模型在灰度图像上的拟合(这是预期的)相似的过度拟合程度,但是准确性分数本身明显更高。下面的标准化混淆矩阵还表明,我们可能已经解决了 26-65 岁这一中间年龄范围的错误分类问题(至少在一定程度上,如果不是完全的话)。

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

使用灰度图像和年龄范围的重新分布类别从初始 CNN 模型进行年龄预测的标准化混淆矩阵。(图片由作者提供)

深度学习:优化 CNN 架构

既然我已经探索了一些操纵数据集以提高 CNN 模型性能的技术,我决定优化 CNN 模型体系结构本身以提高整体性能。这里的想法是设计不同架构的多个模型,并比较它们在损耗和精度值方面的性能。我决定在训练多个 CNN 模型时使用TF . keras . callbacks . tensor board作为回调,以便能够比较它们在交互式(肯定更直观)剧情中的表现。我强烈建议观看这个系列视频,以更好地了解如何使用 TensorBoard 优化神经网络。

本节相关代码参见笔记本4 _ deep _ learning _ CNN _ modeling . ipynb

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

使用 TensorBoard 优化 CNN 架构以比较不同模型的性能。(图片由作者提供)

基于优化结果,在比较了 18 种不同 CNN 模型和不同 Conv2D 和密集层数的不同架构后,最终选择的 CNN 架构如下所示。

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

图像年龄分类的最终 CNN 结构。(图片由作者提供)

深度学习:构建最终模型

因此,在理解了所有上述技术对模型性能的影响之后,现在可以定义和训练最终的 CNN 模型:

  1. 灰度图像代替 RGB 彩色图像。
  2. 用**增强的训练数据集(234,400 张图像)**代替原始训练数据集(23,440 张图像)。
  3. 对于 60 个时期
  4. 对于重新分配的年龄范围等级
  5. 采用优化架构

本节相关代码参见笔记本5 _ deep _ learning _ final _ CNN _ model . ipynb

我决定在训练最终的 CNN 模型时使用TF . keras . callbacks . model check point作为回调,以便能够保存模型,因为它在 60 个时期内继续训练和改进性能。该模型的性能在 60 的第 54 时段达到峰值,损失和精度值如下。

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

准确度分数显著提高,尽管有轻微程度的过度拟合,这可能仍然是可接受的。下图显示了 CNN 模型经过 60 个时期的训练后,损失和准确性得分的变化。下面的标准化混淆矩阵也显示了 26-65 岁这一中间年龄段的错误分类显著减少。

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

该图显示了在 60 个时期中的第 54 个时期出现峰值性能时损耗和精度值的变化。(图片由作者提供)

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

使用灰度图像从最终 CNN 模型预测年龄的标准化混淆矩阵。(图片由作者提供)

深度学习:局限与进一步改进

与任何数据科学工作流一样,上面介绍的深度学习方法也有其自身的局限性。例如,这个项目中使用的数据集只有大约 33,000 张图片。CNN 模型可以用图像中有更多变化的大得多的数据集来训练,以便获得甚至更好的结果。该项目的另一种方法是使用迁移学习(使用预训练神经网络的权重),而不是从头开始创建和训练神经网络。

那么,哪种方法——传统的人工智能还是深度学习?

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

在这种情况下使用传统的机器学习方法,尽管是可能的,但并没有产生具有非常高准确度分数的模型。此外,这种方法需要大量的领域知识和图像数据处理专业知识,以便从图像中提取大量特征用于分类模型。

另一方面,深度学习和神经网络方法不需要任何重要的领域知识和图像处理专业知识,因为它不需要手动提取任何图像特征。这种方法也产生了具有更高准确度分数的更好的执行模型。因此,这个项目中两种方法之间的比较突出了神经网络深度学习的真正力量和可能性,并让我(希望你也是)更好地理解了它们近年来越来越受欢迎的背后。

所以你有它!我希望你喜欢阅读我的第一次计算机视觉冒险,我希望它能让你更好地理解如何处理这样一个性质的项目。如果您有任何问题或建议,告诉我如何以更好的方式处理此事,请务必告诉我。

另外,请随时在 LinkedIn 上与我联系。

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

普里切特大家庭的年龄分类。(视频来源:摩登家庭,ABC)

基于主体的新冠肺炎卫生经济效应模拟

原文:https://towardsdatascience.com/agent-based-simulation-of-covid-19-health-and-economical-effects-6aa4ae0ff397?source=collection_archive---------18-----------------------

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

特德沃德·奎恩在 Unsplash 上拍摄的照片

开始之前

这篇文章是发表在论文“COVID-ABS:一个基于代理人的新冠肺炎流行病模型,模拟社会距离干预的健康和经济影响”中的内容的先前(和更基本的)版本,也可作为 arXiv 中的预印本获得。

我们正生活在一个不寻常的时代,人类正受到一种微生物的攻击,这种微生物威胁着我们的健康(身体和精神)、经济、社会福利等。从短期到中期,所涉及的变量数量及其关系的复杂性正使人们疯狂地去理解他的局部行动在未来全球情景中的影响。但是我们如何预测这些未来的情景呢?政府如何知道采取这些保护措施的积极效果?

嗯,这个问题有很多可能的答案。首先,我们必须定义一个生活在领地之上的社会是一个复杂的动力系统。这类系统具有许多相互作用的变量,呈现非线性行为,其性质随时间演化。它的行为通常是随机的,它也可能依赖于它的初始条件,它可能受到邻近社会(具有不同的政策和动态)的影响,它可以显示出涌现

A 基于智能体的模拟是模拟这些动态复杂系统的一个很好的选择,因为它实现简单,与过去事件的真实数据相比,结果准确。还因为我们可以通过对模拟环境变量进行干预来设计场景,并测量其效果。

现在我们将假设离散事件用于我们的模拟,这意味着时间和系统的组件是离散的和原子的。更具体地说,基于代理的模拟(ABS)由一群代理组成,在代理运行和交互的循环中。每个代理都被认为是自治的,因为它有自己的内部状态,但是所有代理共享一个公共环境。状态变量驱动每个代理的行为,它们必须代表问题的特征。

ABS 用于模拟复杂的动态系统,使用其组件的单个状态来检测由于迭代过程中代理之间的相互作用而出现的全局行为。然后,它的主要目标是模拟系统的时间演化,存储每次迭代中从代理的内部状态导出的统计数据。ABS 允许我们模拟具有复杂的非线性变量关系、复杂的条件和限制的系统,这些系统可能很难用数学来描述。

如果说ABS 的主要优点是灵活性,另一方面,它的主要缺点是计算成本高。拥有一个封闭形式的方程(在动力系统的情况下是 ODE ),或者甚至用蒙特卡罗马尔可夫链模型进行随机模拟要便宜得多。然而,如前所述,我们并不总是能够做到这一点

我们将采用 ABS 来模拟一个动态已知的系统,用 SIR 模型及其变体来表示。

流行病模拟概述

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

照片由 Yohann LIBOTUnsplash 上拍摄

首先,我们来决定要模拟什么。流通引起的传染性传播和社会隔离的经济影响是我们的主要目标。

人口统计学

首先,我们需要生成具有国家人口相同特征的代理人(即人)。年龄 的 分布可以在https://www.census.gov/prod/cen2010/briefs/c2010br-03.pdf或者更容易在https://www.indexmundi.com/united_states/age_structure.html找到。我们可以用一个参数α= 2,β= 5 的 Beta 概率分布来表示这些分布,比如 age ~β(2,5)

传染性传播

C OVID-19 是一种高度传染性疾病,根据伦敦帝国理工学院新冠肺炎反应小组的报告 3:2019-nCoV“截至 2020 年 1 月 18 日,平均每个病例感染 2.6(不确定范围:1.5-3.5)个其他人”。

遵循 SIR 模型,每个代理必须处于以下情况之一:易感感染痊愈(也用于免疫人群)。每个模拟都有一个感染和免疫人群的初始百分比,其余人群由易感个体组成。该状态还包含死亡状态,对于那些出现 SARS-COVID-2 的严重症状并且没有抵抗的代理。

传染性传播的主要假设是媒介通过接近或接触而相互作用。因此,一个人的流动性越高,他接近感染者并被感染的可能性就越大。每个模拟都有一个传染距离,这是两个媒介发生病毒传播的最小距离。

T 受感染病原体医学状况的演变遵循一些现有的论文,如对新冠肺炎病严重程度的估计2019 年严重程度-新型冠状病毒(nCoV) 等。一旦一个病原体被感染,它可能处于以下子状态之一:无症状(也用于不住院的轻微症状)住院严重(在重症监护室住院的情况)。状态转换图如下所示:

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

来源:作者

医疗状况的演变是随机的,并遵循下表的概率:

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

来源:非药物干预(NPIs)对降低新冠肺炎死亡率和医疗保健需求的影响

这些住院意味着使用有限的医疗基础设施。每个模拟都有 临界极限 ,即医疗保健系统能够同时处理的人口百分比。当住院和重症病例的数量超过这个限度时,就没有足够的空间给每个有需要的人了。

流动模式

模拟在所有代理共享的方形二维环境中进行。每个代理在这个环境中被随机初始化,例如x ~ 𝓤(0,length)y ~ 𝓤(0,height)

每个模拟通过每个可能的代理状态定义其移动性振幅。然后,在每次迭代中,每一个智能体还会在环境中随机移动,例如其位置的增量由***【δx ~𝓝(0,1】)振幅** 和*【δy ~𝓝(0,1】)振幅 定义。

使用欧几里德距离计算两个代理 a1 和 a2 之间的接近度,例如***(a1,a2)=√((a1 . x-a2 . x)+(a1 . y-a2 . y))***

所有死亡的代理和所有感染且感染严重性等于住院或严重的代理的δx 和δy 自动设置为零。

经济影响

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

埃德温·胡珀在 Unsplash 上的照片

第二个目标是模拟流动性限制对经济造成的影响——特别是对每个代理人的收入财富的影响。这种模拟的经济动力学的基本假设是:代理人的 收入 是其流动性的函数。在现实世界中,有许多情况下这个条件不成立,人们仍然在家工作。但遗憾的是,情况并非总是如此。然后,代理的移动性由距其先前位置的欧几里德距离来定义,使得移动性=√(δx+δy)。

在模拟的初始化过程中,代理人的财富遵循相同的社会分布,根据的财富分布分享初始数量的总财富。这种分布是用五分位数来衡量的,每个五分位数代表一个社会阶层:20%的最贫困者,贫困阶层,工人阶级,富裕阶层,20%的最富有者。这些信息可以在 https://data.worldbank.org/topic/poverty,找到,这里有一个五分位收入分配的例子:https://www . world bank . org/en/topic/poverty/lac-equity-lab 1/income-inequality/composition-by-quintile。我们可以很容易地用一条洛伦兹曲线来表示这种分布,并对社会阶层的百分位数进行均匀抽样,如 财富~洛伦兹【𝓤(0,100】/5],其中/表示整数除法 **

我们定义一个固定值来代表最低收入,最低收入是由第一个五分位数(20%最穷)定义的,它将被用作每个阶层的支出和收入的单位。例如,minimal_income[20%最穷] = 1,minimal_income[20%最富] = 14。

在的每次迭代中,每个代理人的财富减少其最小固定支出,最小收入单位中的常数与其实际财富成比例,例如支出= 最小 _ 收入【财富五分位数】。 还有,在每一次迭代中,财富都是由代理人每天的收入来增加的。收入是一个随机值,与其实际财富、流动性(或经济活动)和随机比率(对应于他们业务的不确定性——盈亏交替)成比例。然后,最后的收入用**收入~ 𝓝(0,1) 流动性 minimal_income【财富五分位数】表示。

超越

可以提出许多其他问题和假设来探讨这个问题的不同方面。只是列举一些未来扩展的可能性:

  • 交通限制对环境和碳排放会有什么影响?
  • 全球变暖会受到这种减少的影响吗?
  • 电力负荷需求会因为工业活动的限制而减少吗?还是会因为国内支出的增长而增加?

这里没有探讨这些问题,我们将在我们工具的未来版本中给出这些答案。

给我看看代码!

“空谈是廉价的。给我看看代码!”(莱纳斯·托沃兹)**

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

照片由 Hitesh ChoudharyUnsplash 上拍摄

我们的模拟是使用 Python3 编程语言实现的,使用库 matplotlib 进行绘图, Numpy 进行随机采样, Pandas 进行数据处理。所有代码最初都是使用 Google Colab 框架开发和执行的。为了增加其重用性,基础代码被转移到 github 库https://GitHub . com/petroniocandido/covid 19 _ AgentBasedSimulation,实验可以在http://bit.ly/covid19_abs.执行。covid19_abs 包可以使用 pip 工具直接从 GitHub 库轻松安装。

通过年龄和财富分布控制感染严重度概率的全局变量封装在 通用 包中。

所有与代理状态相关的东西都封装在 代理 包中。可能代理的主要状态由 状态 枚举表示,被感染代理的具体情况由 感染严重性 枚举控制。

Agent 作为一个数据结构工作,包含每个 Agent 的状态值,包括状态、感染严重度、年龄、位置(x 和 y)和财富五分位数。

基于代理的仿真的主要类封装在 abs 包中。类实现了模拟动力学的所有主要方面,作为主要的模拟属性,代理的群体及其事件(移动、状态更新、与其他代理的联系)。

Simulation 类的主要方法是 execute() ,表示一个唯一的模拟迭代,执行所有 agents 的状态更新,调用其事件和交互。execute()方法还更新人口的统计数据,这是一个包含每种状态的人口百分比、感染率和每个社会阶层的财富数量的字典。

类模拟还包括两种类型的触发器*,帮助我们在达到某些特殊条件时对模拟动态进行干预。第一种触发器是针对群体的,它针对每个代理进行测试,并且能够改变其任何状态变量。第二种触发器是针对模拟本身的,并在每次迭代中进行测试。***

The classmulti population Simulation是一个模拟对象的集合体,其中一个具有其动态性,但其种群之间具有相互作用。此类允许我们模拟更复杂的情况,如两个(或更多)相邻和重叠的群体(其中每个模拟在多群体模拟环境中的位置表示它们之间的交互水平)实施不同的控制策略。在这种情况下,每个模拟都会影响其他模拟,并受到其他模拟的影响。

数据可视化的东西封装在 graphics 包中,包括主方法execute _ simulation,被调用来运行仿真和绘制图形。

一些初步结果

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

马库斯·斯皮斯克Unsplash 上拍摄

考虑到随机组件的数量,每个模拟执行都是唯一的。然而,尽管有小的特异性和罕见的异常值,一般行为——给定相同的参数集——不会变化太多。正如蒙特卡罗方法中发生的那样,考虑到平均行为及其变化,ABS 必须执行多次以产生合并结果。

下面我们讨论 5 个可能的场景,每个场景由一组控制代理移动模式的模拟参数组成,旨在模拟隔离存在或不存在的影响。我们精心选择了一个有代表性的执行来演示模拟的一般行为,但是也执行了 50 个执行来计算合并的统计数据。

值得记住的是,实验源代码和参数可在 http://bit.ly/covid19_abs.获得

场景 1:什么都不做

这就是世界上有多少政治家相信这是处理新冠肺炎问题的正确方法,并照此行事,直到(在某些情况下)为时已晚。他们认为,对策是许多极端分子,更喜欢拯救经济而不是人的生命。‘米兰永不止步’的口号变得家喻户晓。剩下的就是历史了。如果你看看经济影响图,你可以想象它并没有那么糟糕,就像每个经济自由主义者的梦想一样:经济不会停止增长。但是当你看传染演化图的时候,你可以看到医疗系统的临界极限被改变了多少,有多少人丧生。如果什么都不做,这将是灾难性的一幕。

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

使用 covid19_abs 的典型场景 1 仿真

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

场景 1 执行 50 次的平均结果

场景 2:仅对受感染的人限制移动

这是一个乌托邦式的场景,我们可以快速诊断出受感染的人(甚至是没有症状的人)并隔离他们。我说这是乌托邦,因为极其快速和精确的诊断是不存在的!这种乌托邦式的情景对经济有益,许多政治家认为这就是情景 1 中应该发生的事情。但是他们的计算是错误的。

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

使用 covid19_abs 的典型场景 2 仿真

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

场景 2 执行 50 次的平均结果

场景 3:封锁(限制每个人的移动)

这是遵循世界卫生组织建议的情况。这种情况在医疗保健中是高度保守的,但它的目标是通过最小化人们的相互作用和病毒传播来拯救尽可能多的生命。不必说生命是无价的,经济可以在以后恢复,而不必杀死生命(穷人总是最受影响的)来授予大企业利润。

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

使用 covid19_abs 的典型场景 3 仿真

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

场景 3 的 50 次执行的平均结果

场景 4:在 10%的人口被感染后限制移动,当超过 95%是安全的时,解除限制

这似乎是最有可能的未来。看到疫情造成的破坏后,政府下令对所有人进行隔离。但是,一旦第一波感染减少,隔离就被取消,并导致另一波感染。这种情况会一直重复下去,直到大多数人对这种病毒产生免疫力。好的一面是医疗系统没有超负荷,但是我们会有几次隔离。

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

使用 covid19_abs 的典型场景 4 仿真

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

场景 4 执行 50 次的平均结果

情景 5:受控人群与非受控人群接触

政策大相径庭的人群之间的互动是一个奇怪的模拟场景,尤其是当他们相互影响的时候。我们的城市和州是分离的,但不是孤立的,很多时候,医疗保健系统和经济是密切相关的。这一模拟显示,即使接近未受管理的种群,被隔离的种群也能保护其公民。

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

使用 covid19_abs 的典型场景 5 仿真

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

场景 5 执行 50 次的平均结果

场景 6:垂直隔离

一些政府建议只需要隔离最危险的人,比如老人和病人,让其他人正常生活,正如这里的所看到的。除了几个先决条件之外,还有两个条件,一个是青年人的要求,另一个是青年人的要求,这就是新冠肺炎的要求。我们的模拟表明,当标准是拯救生命时,这一政策简单地不起作用。

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

使用 covid19_abs 的典型场景 6 仿真

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

场景 6 执行 50 次的平均结果

场景 7:所有人的面具

发现了使用口罩和手套作为病毒传播对策的有效证据,参见这里的。证据表明,使用口罩可以减少传染距离和传染率。假设,如果我们通过使用口罩限制移动范围(但不是完全限制)并降低感染率,会发生什么?我们的模拟结果显示了健康和经济方面的乐观结果。

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

使用 covid19_abs 的典型场景 7 仿真

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

场景 7 执行 50 次的平均结果

结论:所有的模型都是错误的,但其中一些是有用的

“所有模型都是近似值。本质上,所有的模型都是错的,但有些是有用的。然而,必须始终牢记模型的近似性质”——乔治·博克斯

各种模型都是一个过程的表示,而不是过程本身。一旦它们是复杂随机(有时是混沌)过程的近似值,我们很自然地会发现已知数据的误差和偏差。这些偏差不会使模型失效,但表明它必须改进。

我们的想法是不断改进模型,使其更加现实和数据驱动,而不仅仅是用它来模拟许多其他尚未想到的社会和环境方面。顺便说一下,我们随时欢迎您的反馈!

如果可以的话,呆在家里。但是,不管发生什么,保持健康和安全。一切都会过去,一切都会好的。

进一步阅读

感谢

我要感谢数据科学评论人员的宝贵贡献,我的同事 Paulo Vitor do Carmo Batista (也是我在{ci∂ic}的合作伙伴,数据科学和计算智能研究小组)和helder sei xas Lima,他们都来自 IFNMGMarcos Antonio alvesminds 的 frederico gade lha GUI mares,他们来自机器智能和数据科学实验室

凝聚聚类和树状图——解释

原文:https://towardsdatascience.com/agglomerative-clustering-and-dendrograms-explained-29fc12b85f23?source=collection_archive---------12-----------------------

凝聚层次聚类、树状图及其在 python 中的实现

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

活动发起人Unsplash 上的照片

凝聚聚类是一种层次聚类算法。它是一种无监督的机器学习技术,将群体分为几个聚类,使得同一聚类中的数据点更相似,而不同聚类中的数据点不相似。

  • 同一簇中的点彼此更接近。
  • 不同簇中的点相距很远。

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

(图片由作者提供),样本二维数据集

在上面的二维数据集样本中,可以看到数据集形成了 3 个相距很远的聚类,并且同一聚类中的点彼此靠近。

[## 等级聚类:凝聚和分裂——解释

聚集和分裂聚类算法及其实现综述

towardsdatascience.com](/hierarchical-clustering-agglomerative-and-divisive-explained-342e6b20d710)

凝聚聚类背后的直觉:

凝聚聚类是一种自下而上的方法,最初,每个数据点都是自己的一个聚类,随着层次结构的向上移动,更多的聚类对被合并。

聚集聚类的步骤:

  1. 最初,所有的数据点都是它自己的一个集群。
  2. 取两个最近的集群,将它们连接起来形成一个集群。
  3. 递归地进行第 2 步,直到获得所需的聚类数。

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

(图片由作者提供),**第一张图:**所有的数据点都是自己的一个聚类,**第二张图:**两个最近的聚类(被一个黑色椭圆包围)结合在一起形成一个单独的聚类。

在上面的样本数据集中,观察到两个集群彼此相距甚远。所以我们在得到 2 个集群后就停止了。

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

(图片由作者提供),样本数据集分为两个聚类

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

如何将两个集群连接成一个集群?

为了获得期望数量的聚类,聚类的数量需要从最初的 n 个聚类减少(n 等于数据点的总数)。通过计算两个聚类之间的相似性来组合它们。

有一些方法用于计算两个聚类之间的相似性:

  • 两个聚类中最近的两个点之间的距离。
  • 两个集群中两个最远点之间的距离。
  • 两个聚类中所有点之间的平均距离。
  • 两个簇的质心之间的距离。

选择上述任何一种相似性度量标准都有一些优点和缺点。

凝聚聚类的实现:

(作者代码)

如何获得最优的聚类数?

凝聚聚类算法的实现接受所需的聚类数。有几种方法可以找到最佳的聚类数,从而以如下方式将群体分成 k 个聚类:

同一簇中的点彼此更接近。

不同簇中的点相距很远。

通过观察树状图,可以找到所需的聚类数。

树状图是数据点之间层次关系的图形表示。它说明了由相应分析产生的聚类的排列,并用于观察分层(聚集)聚类的输出。

树状图的实现:

(作者代码)

点击从下载二维数据集样本。

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

(图片由作者提供),**左图:**可视化样本数据集,**右图:**可视化样本数据集的 3 个聚类

对于上面的样本数据集,观察到聚类的最佳数量是 3。但是对于高维数据集,其中数据集的可视化是不可能的,树状图在寻找最佳聚类数中起着重要作用。

如何通过观察树状图找到最佳聚类数:

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

(图片由作者提供),上述样本数据集的树状图

从上面的树状图中,找出一个最大高度不与任何水平垂直树状图线交叉的水平矩形。

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

(图片由作者提供),**左:**分成 2 簇,**右:**分成 3 簇

树状图中具有最大高度的矩形可以被切割的部分,最佳聚类数将是 3,如上图右侧所示。选择最大高度矩形是因为它表示最佳聚类数之间的最大欧几里德距离。

结论:

[## 了解 K-means、K-means++和 K-medoids 聚类算法

了解 K-means、K-means++和 K-Medoids 聚类算法及其关系的概述。这篇文章…

towardsdatascience.com](/understanding-k-means-k-means-and-k-medoids-clustering-algorithms-ad9c9fbf47ca)

在这篇文章中,我们讨论了凝聚层次聚类算法的深入直觉。该算法的缺点是空间和时间复杂度较大,不适用于大规模数据集。即使观察树状图来寻找大型数据集的最佳聚类数也是非常困难的。

感谢您的阅读

使用 Group by 和 Partition by 对 SQL 中的数据进行聚合和分组

原文:https://towardsdatascience.com/aggregating-and-grouping-data-in-sql-with-group-by-and-partition-by-fd5eaccece75?source=collection_archive---------7-----------------------

通过一个简单的例子理解 GROUP BY 和 PARTITION BY 之间的区别。

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

照片由 [卡斯帕卡米尔·鲁宾](http://Caspar Camille Rubin)Unsplash

简介

聚合函数是一个非常强大的工具,可以用来分析数据和获得有用的业务洞察力。最常用的 SQL 聚合函数有SUM、MAX、MIN、COUNT、AVERAGE。为了汇总数据,聚合器通常与分组功能结合使用。在这个故事中,我将向您展示如何使用聚合函数和分组函数的组合。

得到💬任何数据科学或编程问题的 GPT 式答案。为成千上万的人生成摘要和学习笔记📚只需一次点击即可获得学习资源。👉

** [## 面向数据科学家和开发人员的免费学习资源。精选的博客、教程、书籍和…

机器学习和人工智能工程师的培训课程、黑客马拉松、活动和工作

aigents.co](https://aigents.co/learn)**

准备一些样本数据

让我们使用下面的脚本为这节课准备一些样本数据。你可以使用自己选择的不同平台,例如 SQL FIDDLEKHAN ACADEMY 等。

CREATE TABLE Customer (id INTEGER , name TEXT, product TEXT, OwnershipPercentage numeric(4,3) , Effective_date numeric);INSERT INTO Customer VALUES (1, “BankA”, “A01”, 0.028, 20180223) ;
INSERT INTO Customer VALUES (1, “BankA”,”A02", 0.018, 20181224) ;
INSERT INTO Customer VALUES (2, “BankB”,”B01", 0.025, 20190101) ;
INSERT INTO Customer VALUES (2, “BankB”,”B02", 0.045, 20200101) ;select * from Customer;

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

表客户

问题

现在您可以看到,对于每个客户,都有多个(在本例中是 2 个)关于不同产品的所有权百分比和生效日期的记录。比方说,我需要为我的老板制作一份报告,并希望做一些数据分析来支持我的报告。根据我想要看到的内容,我将使用不同的聚合函数。在这节课中,我将给出使用 SUM()和 MAX()函数的例子。您可以想出不同的场景来使用其他功能。

解决方案

例如,我希望看到与之前的报告相比,每个客户的投资组合随着时间的推移发生了怎样的变化**。为此,我希望看到每个客户的总所有权百分比,而不考虑产品。有两种方法可以做到这一点:使用分组依据和分区依据**

使用分组依据

很简单,我能做的就是使用 aggregate SUM()函数,后跟一个“GROUP BY”子句。在查询中,SUM()函数会将一个数字列(OwnershipPercentage)中的所有值相加。GROUP BY 子句将列中所有相同的值分组,这些列是我们选择的属性,在本例中是客户 ID 和名称。

SELECT ID,
Name,
sum(p.ownershippercentage) AS onwership_percentageFROM Customer GROUP BY ID, Name

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

****按分组的结果

使用 OVER 和 PARTITION(BY)

获得类似结果的另一种方法是使用 OVER 和 PARTITION(BY)函数。要使用 OVER 和 PARTITION BY 子句,只需指定要对聚合结果进行分区的列。Over(partition by)子句将要求 SQL 只将每个分区内的值相加(在本例中为客户 ID)。

SELECT ID, 
Name,
ProductID,
OwnershipPercentage,
sum(OwnershipPercentage) over(partition by ID) as total_ownership_percentageFROM Customer c

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

结果为过(分区通过)

通过上面的查询,我将得到一个名为 total_ownership_percentage 的列,它是每个客户的所有权百分比值的总和。

现在您可能已经意识到 GROUP BY 和 OVER(PARTITION BY)的输出之间的差异。GROUP BY 通过使用我们指定的属性汇总数据,从本质上减少了返回记录的数量。OVER(PARTITION BY)同时提供汇总的数据,而不汇总所有记录。在这种情况下,通过使用 PARTITION BY,我将能够返回每个客户的每个给定产品的 OwnershipPercentage 以及同一行中每个客户的总百分比。这意味着我将拥有每个客户的总所有权百分比的重复数据,但好的一面是,在聚合过程中没有数据丢失——与 GROUP BY 的情况相反。

SELECT ID,Name, 
p.OwnershipPercentage,
max(c.OwnershipPercentage) as ownership_percentage FROM Customer c GROUP BY ID,Name

使用上面的代码,我将收到这条消息:*‘客户。“OwnershipPercentage”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句*** 中。这是因为 GROUP BY 将只返回每个组的唯一结果,并且选择列表只能包含作为 GROUP BY 子句一部分的聚合函数或列。

因此,根据您想要得到的结果,您可以使用不同的函数来获得最佳输出。当您需要每个组有一个唯一的记录时,请选择 GROUP BY,当您不想丢失任何数据但仍想进行聚合时,PARTITION BY 将是最佳选择。

使用聚合最大值()和分组依据

下面是另一个使用 MAX()的场景。假设我现在想知道最近添加的产品及其每个客户的所有权百分比。

一种解决方案是在子查询中应用 aggregate Max()函数和 GROUP BY。子查询是另一个 SQL 语句中的 SELECT 语句。

select c.Name, 
c.ownershippercentage,
c.Effective_date as effective_date
from Customer cinner join (select Name, 
max(Effective_date) as max_date
from Customer group by Name) don c.Name = d.Name
and c.Effective_date = d.max_date

子查询将返回一个我称为“d”的表。通过这个子查询,我获得了表“d”中每个客户的最新生效日期。在此基础上,我在表“Customer”和表“d”之间执行了一个连接,以得出最近生效日期的 OwnershipPercentage。上述查询将给出您想要的输出,但不是最佳解决方案。我们必须在子查询中使用 JOIN 语句以及 aggregate MAX()和 GROUP BY 的组合,这增加了复杂性。在下面找到更有效的代码:

SELECT c.ID, c.Name, c.ProductID, c.OwnershipPercentage, c.Effective_DateFROM Customer cWHERE c.Effective_Date = (SELECT MAX(p.Effective_Date) FROM Customer p WHERE p.ID = C.ID)

任何一种方法都会得到如下相同的结果:

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

感谢您的阅读。希望这对学习有帮助。

聚合、转换、过滤——如何以及何时使用它们?

原文:https://towardsdatascience.com/aggregation-transform-filter-how-and-when-to-use-them-31ed7eb88d2e?source=collection_archive---------38-----------------------

熊猫:从熟练工到大师——来自受害者的声音。

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

信用:帕斯卡·米勒Unsplash

如果你想知道,当我说“受害者”时,那是因为我太被熊猫的能力宠坏了,直到我遇到了Aggregation, Transform, Filter
他们让我很难理解引擎盖下的机制。在花了一些时间钻研之后,我对它有了更好的理解。现在,让我们开门见山地说吧。

我始终相信简单数据集对于方法说明的作用。因此,本文将使用一个非常简单的数据集:不同国家/地区的人口和预期寿命。

您可能已经熟悉带有基本计算的groupby聚合,如mean(), sum(), median()等。聚合、转换和过滤将 goupby 带到了另一个层次。

首先,我们来看一下groupby功能是如何工作的。2011 年,Hadley Wickham 在他的论文“数据分析的拆分-应用-组合策略”中引入了“拆分-应用-组合”的思想,使得groupby函数具有了说明性。一般来说,groupby功能由三个步骤组成:分割、应用和组合。split步骤根据指定的关键字将数据帧分解成子集数据帧。然后,apply步骤将函数应用于这些子集数据帧。最后,combine步骤将这些结果连接成一个输出数组。

聚合🐺

记住上面的过程,我们就很容易理解aggregation。基本上,aggregation对一列和多列应用多个函数。首先,它基于“区域”将完整的数据帧分成子数据帧。然后对“预期寿命”应用均值函数,对“人口”应用和函数。最后,它将结果组合成可以通过“reset_index”转换成数据帧的序列。最后,您将得到一个不同的数据帧,其长度是 groupby 键的唯一值的数量(在我们的例子中是“Region”)。下面是aggregation的视觉流程。

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

改变🐣

与聚合相比,transform多了一个叫做“广播”的步骤。它将结果从子数据帧广播到原始的完整数据帧。你可以把结果合并到原始的完整数据帧中。因此transform将总是返回一个与原始完整数据帧长度相同的序列。下面是transform的视觉流程。

transform的一个典型用例是计算组总数的百分比(在我们的例子中,是其所在地区的国家人口比例,例如印度在南亚地区的人口比例。

df[‘PopShare’]=df.groupby(‘Region’)[‘Population’].transform(lambda x: x/x.sum())

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

过滤器🐳

与 transform 相比,filter多了一个步骤。从这些子数据帧中获得结果后,它对这些结果应用一个过滤器(在我们的例子中,它是“RegionAverageLife”>75)。然后,这些过滤的结果将广播到原始数据帧中的匹配条件。因此,在这种情况下,您将获得完整数据帧的缩减版本。下面是filter的视觉流程。

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

总之,下面是Aggregation, Transform, and Filter.的最佳使用场景以及它们在 SQL 中的等效格式。

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

最后

保持乐观!感谢阅读!如果你想取得联系,可以在这里 联系我

敏捷数据科学的一个案例——迭代开发对数据科学来说很自然

原文:https://towardsdatascience.com/agile-data-science-data-science-can-and-should-be-agile-c719a511b868?source=collection_archive---------52-----------------------

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

敏捷对于数据科学来说是完美的(图片由i̇rfan·辛萨尔通过 Unsplash 提供)

TL;DR;

  • 我在数据科学社区遇到了很多反对敏捷方法,特别是 scrum 框架的阻力;
  • 我不这么看,并声称大多数学科将通过采用敏捷思维模式而得到改进;
  • 我们将通过一个典型的 scrum sprint 来强调数据科学过程和敏捷开发过程的兼容性。
  • 最后,我们讨论了什么时候 scrum 不适合遵循。如果你是一名顾问,同时在许多项目上工作,或者你的工作需要专注于一个狭窄的问题(狭窄,这样你就可以独自解决它)。

我最近发现了一个中型帖子,声称 Scrum 对数据科学来说很糟糕。恐怕我不同意,我想为敏捷数据科学做一个案例。

这篇文章的想法很大程度上受到了敏捷数据科学 2.0 书(我强烈推荐)和个人经历的影响。渴望知道其他经历,请在评论中分享。

首先,我们需要就什么是数据科学以及它如何解决业务问题达成一致,这样我们就可以研究数据科学的过程以及敏捷(尤其是 Scrum)如何改进它。

什么是数据科学?

网上有无数的定义。比如维基百科给出了这样的描述:

数据科学是一个跨学科领域,它使用科学的方法、流程、算法和系统从许多结构化和非结构化数据中提取知识和见解。

在我看来,这是对数据科学试图实现的目标的准确定义。但是我会进一步简化这个定义。

数据科学通过结合商业理解、数据和算法来解决商业问题。

与维基百科中的定义相比,我想强调的是,数据科学家的目标应该是解决业务问题,而不是提取知识和见解。

数据科学如何解决商业问题?

所以数据科学是来解决商业问题的。在此过程中,我们需要完成几件事情:

  1. 了解业务问题;
  2. 确定并获取可用数据;
  3. 清理/转换/准备数据;
  4. 为给定数据选择和拟合合适的“模型”;
  5. 将模型部署到“生产”——这是我们解决给定问题的尝试;
  6. 监控绩效;

与所有事情一样,有无数种方法可以实现这些步骤,但我会试图说服您,敏捷(增量和迭代)方法给公司带来最大的价值,给数据科学家带来最大的快乐。

敏捷数据科学宣言

我从敏捷数据科学 2.0 这本书的第 6 页摘录了这一点,所以鼓励你阅读原文,但这里是:

  • 迭代,迭代,迭代-表格,图表,报告,预测。
  • 船舶中间输出。即使失败的实验也有产出。
  • 执行任务的原型实验。
  • 在产品管理中整合数据的专制观点。
  • 在工作时,沿着数据价值金字塔上下攀爬。
  • 发现并追求通向杀手级产品的关键路径。
  • 获取 meta。描述过程,而不仅仅是结束状态。

并非所有的步骤都是不言自明的,我鼓励你去阅读 Russel Jurney 所说的,但我希望主要思想是清楚的——我们共享和中间输出,我们迭代实现价值。

鉴于以上的预备工作,让我们回顾一下 scrum 团队的标准周。我们假设一周的冲刺。

Scrum 团队冲刺

第一天

sprint 的结构有很多变化,但是我会假设计划是在周一早上完成的。团队将决定产品待办事项中的哪些用户故事将被转移到 Sprint 待办事项中。从积压订单排名中可以明显看出,我们业务最紧迫的问题是客户欺诈——欺诈性交易导致我们宝贵的客户离开我们的平台。在之前的 backlog 精化会议期间,团队已经讨论了这个任务,产品负责人从欺诈调查团队获得了额外的信息。因此,在会议期间,团队决定从一个简单的实验开始(并且已经在考虑进一步有趣的迭代)——一个基于交易和参与用户的简单特征的初始模型。工作被分开,以便数据科学家可以去看看为这个问题确定的数据团队。数据工程师将建立将模型输出集成到 DWH 系统的管道,全栈工程师开始为欺诈调查小组建立交易审查和警报系统页面。

第二天

周二开始时,所有团队聚集在一起,分享进展。Data scientist 展示了一些图表,表明即使功能有限,我们也会有一个不错的模型。与此同时,数据工程师已经完成了系统设置的一半,以便使用新模型对传入的交易进行评分。全栈工程师也进展顺利,仅仅几分钟后,每个人都回到自己的办公桌前处理商定的任务。

第三天

与周二一样,团队从周三开始召开全体会议,分享他们的进展。已经有一个简单的模型构建和一些准确性和错误率的数字。数据工程师展示交易评分的基础设施,团队讨论特征如何到达系统,以及需要做什么来为算法做好准备。全栈工程师显示管理面板,其中显示了关于事务的元数据和触发机制。接下来的另一个讨论是关于模型输出触发欺诈分析师消息的阈值。团队同意我们需要能够调整这个值,因为不同的模型可能有不同的分布,而且,根据其他变量,我们可能希望增加和减少批准的事务的数量。

第四天

周四,团队已经有了所有的部分,在站立会议期间,讨论如何整合这些部分。该团队还概述了如何在生产中最好地监控模型,以便可以评估模型性能,并在造成任何实际损害之前检测到退化。他们一致认为,一个简单的监控准确性和错误率的仪表板就足够了。

第五天

星期五是演示日。在站立期间,团队讨论交易欺诈检测的第一次迭代遗留的最后问题。团队成员准备与将使用此解决方案的欺诈分析师会面。

在演示过程中,团队展示了他们为欺诈分析师构建的内容。该团队展示了绩效指标及其对欺诈分析师的影响。所有的反馈都转化为未来冲刺的任务。

Sprint 的另一个重要部分是回顾会议——团队讨论三件事。冲刺阶段什么进展顺利;

2.哪些方面可以改进;

3.在下一次冲刺中,我们将致力于改进什么;

沿着这条路走下去

在下一个冲刺阶段,团队正在处理产品待办事项中另一个最重要的项目。这可能是欺诈分析师的反馈,也可能是产品负责人认为对整体业务改善最大的其他东西。然而,该团队密切监控解决方案初始版本的性能。它将继续这样做,因为 ML 解决方案对模型关于数据分布的基本假设的变化很敏感。

讨论

以上是对数据科学解决方案的 scrum 过程的一个相对“干净”的阐述。现实世界很少是这样的,但我想传达几点:

  1. 数据科学无法独立存在。如果我们要影响现实世界,我们必须在一个跨职能团队中合作,它应该是一个更大团队的一部分;
  2. 迭代在数据科学中是至关重要的,我们应该向我们的涉众公开那些迭代的工件,以便尽快得到反馈;
  3. Scrum 是一个为迭代开发设计的框架。因此,它非常适合数据科学工作;

然而,它不是任何努力的框架。如果你的工作需要你深入思考几天,那么 Scrum 和敏捷可能会非常具有破坏性和反作用。此外,如果你的工作需要你处理大量不同的小型数据科学相关的任务,跟随 Scrum 是不合适的,也许应该考虑看板。然而,典型的产品数据科学工作并不是这样的。迭代是王道,快速获得反馈是为业务问题提供正确解决方案的关键。

概括起来

数据科学非常适合 Scrum,只需要一个简单的修改——我们不期望发布完整的模型。相反,我们交付我们工作的工件,并从我们的涉众那里征求反馈,这样我们可以更快地取得进展。项目经理可能因为进展的不可预测性而不喜欢数据科学,但是迭代没有错,它是唯一的前进方式。

我想知道你对敏捷数据科学的看法?什么对你和你的团队有效?什么没用?希望大家留下评论!

敏捷开发 101——科技界的雷吉娜

原文:https://towardsdatascience.com/agile-development-101-5faf54df5dcc?source=collection_archive---------27-----------------------

当目标可能在一夜之间改变时,敏捷方法给予开发人员和数据科学家同样的适应性和灵活性。

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

戴维·特拉维斯在 Unsplash 上拍摄的照片

在技术部门工作,敏捷开发很可能在你的项目中被利用。使用敏捷方法为开发人员提供了工具,以便在客户可能在一夜之间改变其目标的时候具有适应性和灵活性。使用敏捷将允许团队毫不犹豫地适应。

什么是敏捷开发?

敏捷开发指的是一组专注于迭代开发的方法。开发过程中的需求和解决方案在整个过程中不断发展。这种发展是由不同职能团队之间的合作推动的。scrum 和看板就是其中的两种方法。两者都鼓励对项目的频繁反思,以便开发过程与业务需求相一致,例如客户目标。

当一个开发方法声称与敏捷一致时,它是基于敏捷宣言。这个宣言是 2001 年由 17 个人在犹他州的一个滑雪小屋创作的。在他们相遇之前,主要的开发方法被称为瀑布方法。由于需要持续更新,这种传统方法已经过时。敏捷支持这一关键的业务需求。

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

原始照片由 Szabo ViktorUnsplash 上拍摄

什么是敏捷宣言?

敏捷宣言基本上是一个宣言,旨在帮助开发者和企业找到一种对两者都有效的方法。这是一种让企业继续成长和适应而不会让开发人员筋疲力尽的方式。

4 价值观是宣言的核心:

  1. 流程和工具上的个人和交互
  2. 工作软件综合文档
  3. 客户协作合同谈判
  4. 根据计划应对变化

宣言指出,左边的项目(粗体)比右边的项目更有价值。两者都很重要,但把更多的重量放在左边。

该宣言有 12 条原则:

  1. 我们最优先考虑的是通过早期和持续交付有价值的软件来满足客户。
  2. 欢迎不断变化的需求,即使是在开发的后期。敏捷流程利用变化为客户带来竞争优势。
  3. 频繁地交付工作软件,从几个星期到几个月,优先选择较短的时间尺度。
  4. 业务人员和开发人员必须在整个项目中每天一起工作。
  5. 围绕有积极性的个人建立项目。给他们需要的环境和支持,相信他们能完成工作。
  6. 向开发团队传达信息的最有效的方法是面对面的交谈。
  7. 工作软件是进步的主要衡量标准。
  8. 敏捷过程促进可持续发展。发起人、开发人员和用户应该能够无限期地保持恒定的步调。
  9. 对技术优势和良好设计的持续关注增强了敏捷性。
  10. 简单——最大化未完成工作量的艺术至关重要。
  11. 最好的架构、需求和设计来自自组织团队。
  12. 团队定期反思如何变得更有效,然后相应地调整自己的行为。

当一个团队同意应用敏捷方法时,他们坚持这些价值观和原则。

Scrum 敏捷开发?

Scrum 是敏捷开发的一个子集,它依赖于冲刺阶段的每日会议。sprint 通常需要 1-4 周的时间来完成一个项目。在这个冲刺阶段,团队将定期会面,交流他们的进展。这个简短的会议是开发人员陈述他们已经完成了什么,他们计划在下一次会议之前完成什么,以及他们是否面临任何障碍的时候。这些会议由一个 Scrum 大师领导,他的主要工作是帮助开发人员通过路障。这些快速的会议被称为站立会议,因为每个人都是站着进行的。取决于你的团队,他们可能会也可能不会这样做。

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

优 X 创投Unsplash 上的照片

每个团队和企业都有自己的 Scrum 变体。它通常包括每日站立,冲刺,以及最后的冲刺回顾。有些人会让开发人员写出一个用户故事来解释新特性背后的原因。每个版本之间的结构将具有相同的骨架。

看板敏捷开发?

看板是一种可视化的敏捷方法。它依赖于使用卡片和一块板,想想 Trello 或便利贴和白板。这使得团队可以看到工作流将由什么组成,并尽早找到瓶颈。这可能在某个时候需要一个团队成员或者需要购买设备。这是一种非常主动的方法。

该板,又名看板板,上面将有列。这些列被称为看板泳道。每个人将给出一张卡片,进行分类,以区分任务和项目。有些泳道可能是待办事项、正在进行的事项和已完成的事项。这种可视化允许整个团队在有限的会议时间内处于项目流程的同一页面上。

Gif via giphy

什么是常见的敏捷方法实践?

这是一个很好的问题。尽管每种方法都有自己的蓝图,但每种方法都有一些共同点。以下是一些敏捷实践:

结对编程

顾名思义,它是指两个程序员同时在同一代码上一起工作。这通常包括一个程序员作为打字员,另一个问他们的思维过程是什么。这也可能只是排除程序故障。当进行结对编程时,有一个时间间隔来交换角色将有助于防止双方都筋疲力尽。

Gif via giphy

客户参与

与客户沟通项目进展对退货业务至关重要。敏捷开发为客户提供了参与当前开发的机会。不是字面上的意思,而是为了快速简单地了解项目在哪里。如果客户打电话来询问项目进展如何,项目经理会很快知道应该让客户知道什么。

燃尽图

燃尽图是一种很好的方式,可以直观地显示项目还剩多少时间。如果一个项目剩下太多的元素,那么这就给了开发团队一个适应环境的机会。这可能是让项目经理与客户沟通,或者对某些元素进行优先排序。

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

https://en . Wikipedia . org/wiki/Burn _ down _ chart # Reading _ Burn _ down _ charts

测试驱动开发(TDD)

测试驱动开发是将需求转化为下一次迭代的测试用例的实践。这使得以前的需求不会因为急于修补特性而变得过时或被遗忘。这绝对不是任何人想要的情况。

敏捷开发是一种迭代方法,有助于持续的更新/发布。这些方法允许开发人员/人的需求和业务需求在中间相遇并被理解(希望如此)。

在我们重新学习之前,

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

原载于【https://reginaoftech.com】

人工智能在银行业的应用

原文:https://towardsdatascience.com/ai-adopting-in-banking-get-it-right-with-a-tech-formula-part-1-6eac6bab36c6?source=collection_archive---------39-----------------------

用技术公式正确解决问题(第 1 部分)

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

你已经听到了传言:人工智能(AI)是金融领域炙手可热的新商品。但你能在你的核心银行系统上撒点“智能”就称之为胜利吗?几乎没有。

形式化一个人工智能用例,甚至运行一个成功的试点是容易的部分。部署和扩展人工智能算法是事情变得复杂的地方。

//只有 22%使用机器学习(ML)的企业成功地将模型部署到生产环境中。//

让人工智能正确很难,但是谁需要它呢?

如果想保持长期竞争力,大多数银行都会这么做。根据 Temenos 的一份报告,77%的银行高管表示,人工智能的成功实施将在未来几年内区分银行领域的领导者和落后者。

显然,最先解决人工智能扩展和部署挑战的人将获得最大的市场回报。

但是如果不知道前面有什么障碍,你就不可能赢得比赛。

为什么在金融领域实施人工智能很难

法规、合规性、隐私和数据偏差——这些是研究人工智能的金融机构普遍关注的问题。但是让我们暂时假设这些都不存在,从纯技术的角度来衡量复杂性因素。

想象一下:一群高管被新的决策分析引擎所说服。理论上,这个项目看起来很完美

  • 预测分析可以调整销售价格
  • 下一个最佳行动(NBA)组件可以提高追加销售/交叉销售
  • 分析组件可以减少支付中的误报数量
  • 投资回收期可能只有一两年

“酷豆,”领导说。“让我们把引擎发动起来!让 ML 团队尽快解决这个问题。”

现在有趣的部分来了:机器学习团队深入项目,却遇到了一个又一个障碍:

  • 巨大的数据仓库和缺乏统一的数据管理流程颠覆了准备所需数据集的流程。
  • 关键数据所在的遗留基础设施需要重新搭建平台或完全替换,以避免中断核心系统。
  • 需要组装和配置具有大量 GPU 的新云基础设施,以支持算法的测试和部署。
  • 很少有人能真正完成所有这些事情。

这就是一个在纸面上有着极高投资回报率的盈利试点如何变成一个正在失去吸引力的大额投资,并最终在一个试点(和一些宣传)后被取消。

那么,为什么如此多的金融公司在早期的人工智能投资中遭受损失,并且未能超越试点?

有几个原因:

  • 由于过时(或不存在)的数据治理流程,缺乏生产就绪数据和足够快速地访问这些数据的能力。
  • 人工智能算法需要关注,尤其是在部署的最早阶段,包括监督、维护、合规和网络安全等。是的,AI 可以自我学习,但它永远不会完全不用手。
  • 一个弱的或者不存在的集成开发环境产生了测试和部署瓶颈。
  • 人工智能部署在核心银行系统中创建了一个新的架构层,这些系统需要与遗留系统共存,而不会中断它们。
  • 将一个算法打包成一个有吸引力的面向客户的解决方案来增加价值需要额外的时间和专业知识。

那么,我们是在建议你完全放弃你的人工智能梦想,让数字原生竞争获胜吗?

一点也不。引入人工智能是昂贵的错误。但是您可以通过坚持自下而上的方法来最小化风险、成本和采用时间表。可以用这个公式来概括:

(遗留+前端转换)× AI =现代银行

这是一篇由两部分组成的文章。在这一部分中,我们将关注遗留系统。如果您想先了解前端转换,请点击这里的(但是您也应该认真阅读这一部分!).

银行业人工智能的传统转型:需要解决的 4 个领域

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

图片由 Intellias 提供

金融领域的人工智能需要几个关键构件:

  • 数据治理和管理平台
  • IT 治理框架和架构优化
  • 云计算和云 GPU
  • MLOps

三分之二的银行业高管(66%)表示,人工智能、云和 DevOps 等新技术将在未来五年继续推动全球银行业转型。"泰梅诺斯报告

数据治理和管理平台

连接和整合内部和外部数据源的统一数据管理平台是每个人工智能实施的支柱。

除了为您提供一系列用于分析的初始数据集,数据治理平台还可以帮助您:

  • 提高数据可追溯性和可问责性
  • 增强数据安全性和合规性
  • 支持人工智能用例的扩展,因为你总是有精简的数据用于分析。

您需要组装的数据管理平台需要得到 IT 治理框架的进一步支持。

IT 治理框架和架构优化

大多数遗留银行系统的问题是它们陈旧、混乱、僵化,没有给新的元素留下空间。

IT 治理过程的目标是帮助你弄清楚在你当前的架构难题中把 AI 放在哪里。

本质上,这样的框架被设计来帮助您挑选和探测您的遗留软件,以查看哪些系统组件可以被解耦和现代化,而不会点燃核心(也就是说,打个比方)。

因此,正如我在另一篇关于银行业遗留现代化的文章中所写的那样,你可以在系统层面进行现代化,一次一个元素地发展你的平台,而不是试图一举取代核心(冒很大的风险)。

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

Intellias 制作的信息图

迁移到更松散的架构将有助于您:

  • 分配新人工智能服务的位置
  • 将更多数据源连接到您的数据管理平台
  • 弄清楚新算法如何与其他服务集成。

云计算和云 GPU

下面是对 AI 的一个非常简单的解释:

AI =(代码+数据)×计算能力

考虑到您已经组织了您的代码并简化了对数据的访问(并且可能将它迁移到了云中),您现在可以开始寻找计算能力了。

毕竟,深度神经网络和其他复杂的 ML 算法是耗电的生物,需要大量的计算能力来操作给它们的数据并产生预测。

本质上,神经网络是在训练和预测阶段对网络输入(您的数据)执行大量矩阵乘法的结果,以便您可以获得良好的输出(预测或洞察)。

根据任务的复杂程度,网络可以使用 10、100 甚至100 亿个参数来识别给定数据中的模式并产生结果。

为了运行这些操作,你的算法需要计算能力,这就是GPU(图形处理单元)发挥作用的地方。这些芯片可以帮助您加快计算速度,更快地获得结果。

你可以在内部储备一批 GPU,或者从服务提供商那里租赁云 GPU 容量——这将允许你在未来自动化和扩展更大的算法部署(或者避免在你的培训比预期更复杂时争夺资源)。

考虑到 GPU 即服务市场预计到 2025 年将达到 70 亿美元,你可以猜到大多数公司更喜欢做什么。现在,除了计算能力,您还需要一些额外的资源来存储您的数据、测试集、实验、版本控制和测试结果。同样,将所有这些都保存在云中是大多数公司选择的路线。

这就把我们带到了下一个要点:保持你的人工智能项目有组织并准备好部署。

MLOps

机器学习+ DevOps = MLOps,这是一个新的运动,旨在创建一种建立、测试和部署 ML/AI 模型的简化方法。

MLOps 的目标是帮助您采用和自动化机器学习(ML)模型的持续集成(CI)、持续交付(CD)和持续培训(CT)。谷歌云

更高程度的自动化增加了开发过程的可预测性,并减少了由于小错误而导致模型失败的机会。

以下是您从 MLOps 获得的信息:

  • 用于推出新模型的可重复使用的管道和可重复的工作流程
  • 改进的数据集成和统一的数据治理
  • 自动化的模型设置、培训和测试(针对类似的项目)
  • 一键式复制和自动化版本控制
  • 热键访问项目所需的所有库、框架和集成

因此,你的人工智能团队可以直接行动起来,以更快的速度、更低的成本和更少的风险运行新的实验,而不是浪费时间来组装新的人工智能项目的所有细节。

总结等式的遗留转换部分:

  • 评估你的系统,为你的人工智能找到最佳位置。
  • 分离数据源,并将它们连接到新的数据管理平台。
  • 寻找进一步整合和现代化的机会。
  • 为新的人工智能测试分配云基础设施。
  • 获得您需要的 GPU 容量。
  • 使用 MLOps 原则制定清晰的路线图。

好了,我们已经完成了等式的第一部分— 遗留转换

因为它已经相当不错了,我们保留了等式的第二部分——前端和人工智能转换——作为本文 的第二部分

人工智能在银行业的应用

原文:https://towardsdatascience.com/ai-adopting-in-banking-get-it-right-with-a-tech-formula-part-2-fd1a53520403?source=collection_archive---------46-----------------------

用技术公式正确解决问题(第 2 部分)

注来自《走向数据科学》的编辑: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语

银行业的人工智能是一大福音,但往往也是一大祸害。

权衡是巨大的,但是实施一个简单的解决方案的挑战通常会阻碍银行的创新。正如我们在本系列 的第一部分 中提到的,许多人工智能飞行员在测试或部署阶段都失败了。

原因?缺乏强大的技术基础,配以清晰的技术路线图来依次升级系统的所有关键元素,然后再用人工智能增强它们。

正如我们在上一部分中所讨论的,核心银行遗留系统的分离和现代化是您路线图上的第一要务。

您议程上的下一步是前端转换。

让你的前端适应人工智能的采用

人工智能经常被认为是解决低效流程的良方。公司可能会说让我们发送 RPA 来处理发票为什么 ML 算法不能为客户做所有的报告?

然而,很少有金融领袖倾向于问这个问题:这个特定的过程甚至需要人工智能增强吗?

因为让我们面对现实吧:很多前台银行流程都有些过时了。为了客户的房贷申请,你需要在分行收集一吨的纸质文件吗?No. 挪威的银行 ID 经验表示,你可以完全无纸化,只需向你的客户发放数字 ID(看不到人工智能),就可以将申请过程从 16 天减少到 1 天。

当您的移动银行应用程序仍然为您的客户提供糟糕的数字开户体验时,为您的移动银行应用程序添加人工智能驱动的语音礼宾有意义吗?没有。不会有太大的不同。

//为了从人工智能的采用中获得最大的影响,传统的财务流程需要重新配置。否则,投资回报率将难以捉摸。//

这就是转变前端流程是第二个核心要素的原因。

好吧,那么我该如何重新配置旧的来为新的铺平道路呢?

这里有一个简单的蓝图:

  • **让你的候选人排队接受人工智能增强。**将所有可能的用例分成两类:面向客户和面向员工的流程/解决方案。从可行性、时间表和可能的节约/投资回报方面评估每个解决方案。
  • **依靠设计思维。**采取基于旅程的方法来选择你的候选人。从最终用户的角度评估你的清单。新技术可以在哪些方面增加更多价值,为什么?
  • 从零开始。与其尝试去适应一个低价值的流程,不如想想如果你 a)完全摆脱它,b)用一个干净的版本代替它,或者 c)代替它,并考虑新流程如何进一步补充和加强你的设置中的其他流程,会发生什么。

最后一点尤其重要,因为银行业有大量漏洞百出的流程,金融科技公司很早就开始着手解决:令人生畏的开户流程、复杂的信用卡订购流程、缺乏负担得起的贷款、冗长的信用卡审批等等。

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

开立一个新银行账户所需的平均天数。图片由为火星建造

基于这些数据,很容易假设仅仅增加一些人工智能算法不会帮助汇丰奇迹般地名列榜首。他们的数字银行前台需要更大的提升。

因此,如果你觉得自己在竞争中落在了后面,试试下面的数字银行前台转型方法:考虑层次,而不是单个流程或解决方案。

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

Intellias 提供的信息图表

排列和扩展银行业中的人工智能用例

我们终于到达了我们一直在准备的部分——在银行业实现人工智能!

正如前面几节所述,让人工智能做好准备是一条漫长的道路,至少有两个主要的障碍:改造遗留系统和适应前台系统流程。

记住:根据埃森哲的数据,只有 16% 的高管能够扩大人工智能项目的规模。正如埃森哲的数据进一步指出的那样,大多数人都遇到了我在本文开头描述的相同的人工智能采用困难。

与此同时,那些成功度过最初试点阶段、实现战略扩展的企业,终于看到了承诺的红利:

与处于人工智能之旅概念验证阶段的公司相比,战略规模公司从人工智能投资中获得的回报接近三倍。埃森哲

尤其是在银行业,扩展以下类型的人工智能计划会带来最高的回报:

信用评分

移动数据和机器学习被证明是吸引信用薄弱的消费者的强大组合,这些消费者是目前被传统金融机构(但不太被金融科技公司)抛弃的无银行账户、银行服务不足和首次贷款者。

由 ABCD 技术堆栈(人工智能、区块链、云和数据)支持的即时和负担得起的消费贷款已经帮助三家全数字化的中国银行(作为超级应用运营)每年处理超过 1000 万份贷款申请,并保持平均 1%的不良贷款率。

基于替代数据来源的贷款现在正在欧洲、东南亚甚至美国迎头赶上,在美国,FICO 刚刚发布了一项新服务,允许消费者提交额外数据以增加他们的信用评分。

如果银行不在短期内采取行动,就有可能在消费者和中小企业贷款竞赛中失利。

对话式人工智能(聊天机器人)

聊天机器人的未来是语音引导的智能财务顾问,可以为客户和团队提供礼宾服务。基于人工智能的智能顾问能够:

  • 提供个人理财辅导
  • 协助日常账户管理
  • 为资产/财富管理提供机器人咨询服务
  • 提供基本的客户支持
  • 提供个性化的产品/服务推荐。

去年,12%的消费者使用语音功能支付账单,10%的消费者使用语音功能向他人转账。

考虑到语音支付在 2020 年越来越受欢迎,可以肯定的是,语音在银行业的使用也将进一步攀升。

个人理财

由人工智能驱动的新一代个人财务管理应用程序可以为预算增添乐趣(fudgeting,有人吗?).

人工智能模型可以被配置为教会用户有意识地消费,并为以下方面提供个性化建议,而不是敦促用户停止在鳄梨吐司上浪费金钱:

  • 抑制开支
  • 账单规划
  • 增加净值
  • 提高信用评分
  • 无债一身轻
  • 为退休或大学做打算。

事实上,早期趋势表明,在 5 到 10 年内,个人理财领域可能会完全自主。

对银行来说,赶上这股金融扫盲潮流可以降低账户转换率,提高客户终身价值。

风险管理

根据 Emerji 的说法,风险监控是银行业最受欢迎的人工智能功能之一,已经占供应商产品提供能力的 26.9%。特别是,银行正在考虑采用智能模型来预测投资风险,并为各种交易决策制定更好的行动方案。

例如, Kensho 利用历史和实时市场数据以及自然语言处理能力和视觉图像识别来收集全面的市场数据,并对股票表现做出高度准确的预测。

金融欺诈

还可以配置机器学习模型来保护客户的资产。ML 在欺诈监控方面比人类团队(或由所述人类编程的传统的基于规则的引擎)更有效,因为机器学习算法:

  • 可以近乎实时地操作大量数据
  • 全天候运行
  • 可以扩展以覆盖更广的防御面
  • 可以根据个人用户的消费模式进行个性化设置
  • 随着时间的推移自我改进,并能够应对以前看不到的威胁。

财富管理

ML 模型可以根据存储在数据湖中的数据,为您的客户和顾问提供预测性和规范性的投资建议。例如,Credit Karma 为每个用户收集了超过 2600 种不同的数据属性,他们的人工智能模型评估了大约 80 亿个关于每个客户下一步最佳行动的预测。

除了机器人建议之外,在财富管理领域已经得到验证的人工智能用例包括:

  • 业务流程优化和报告
  • 个性化客户入职
  • 高级作战情报。

包扎

我可以继续列举其他的人工智能用例,但是这条线需要在某个地方画出来。具体来说,我们应该考虑成功的早期试点与规模化人工智能部署之间的界限。你在进行遗留转换上拖得越久,这条线就离得越远,因为它会被更敏捷的竞争者推得更远。

是的,在新技术、客户偏好和不断变化的市场需求快速发展的生态系统中,致力于部署人工智能是很困难的。

但你不必一头扎进人工智能的采用中。相反,建立你的上(遗产)和下(前端)身体力量,然后在上面设置一个智能(人工智能)头。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值