TowardsDataScience-博客中文翻译-2021-四十四-
TowardsDataScience 博客中文翻译 2021(四十四)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
这就是为什么你应该考虑成为一名数据分析师
原文:https://towardsdatascience.com/heres-why-you-should-consider-becoming-a-data-analyst-ffe177e2db1b?source=collection_archive---------3-----------------------
数据行业的失败者
格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片
当我第一次想成为数据科学家时,我并不知道行业内不同的职业道路。
我不知道数据分析师和数据科学家之间的区别,并将每一个与数据相关的角色归类到“数据科学”的总称下
随着我开始更加熟悉数据领域,我坚定地坚持成为一名数据科学家和构建机器学习模型的最终目标。
机器学习似乎是一份很有吸引力的工作,我看不上那些不使用花哨的数据科学算法的解决方案。不仅仅是我——分析通常被视为二等公民,而不是人们通常优先考虑的技能。
几乎所有的数据科学课程或训练营都以学习机器学习技术为中心。很少(如果有的话)强调分析。
然而,在数据行业工作了一年多之后,我逐渐意识到每一个与数据相关的角色都同样重要。
没有数据工程师,我们就没有数据来建立模型。没有机器学习工程师,我们就无法生产这些模型。没有数据分析师,我们就无法从数据中获取价值。
数据行业为各类人才提供了发展空间。
如果你是一个拥有强大软件工程技能的高技术人员,你可能会喜欢 MLOps。如果你有良好的沟通技巧,并且有商业或营销领域的背景,数据咨询可能是你正确的职业道路。
从我记事起,我就经常说“我想成为一名数据科学家”,当人们问我为什么时,我无法回答。为什么是数据科学?"如果你热爱数据,为什么不选择分析或数据工程?为什么特别是数据科学?”
我对成为一名数据科学家如此感兴趣的原因是因为这个领域的大肆宣传,以及媒体对这个行业的描绘。然而,在数据行业还有其他同样有回报的工作。
在本文中,我将带您了解数据分析领域,并帮助您了解这个角色是否适合您。
为什么公司需要分析师?
数据分析师擅长收集原始数据,并能够从中获得洞察力。
他们有耐心和好奇心去挖掘大量的数据,直到他们从中找到有意义的信息——之后,他们清理并向利益相关者展示他们的发现。
数据分析师使用许多不同的工具来得出答案。他们使用 SQL、Python,有时甚至使用 Excel 来快速解决问题。
分析师的最终目标是在数据的帮助下解决业务问题。这意味着他们要么需要具备必要的领域知识,要么与已经具备所需行业专业知识的人密切合作。
数据分析师天生好奇。如果他们看到数据趋势的突然变化(像月末的销售小高峰),他们会想办法确定是否可以在全年观察到相同的模式。
然后,他们试图将这些与行业知识和营销努力结合起来,并为公司提供如何迎合受众的建议。
数据分析师的最佳特质是他们能够提出正确的问题。他们的领域知识,加上他们快速的数据提取技能,使他们成为公司需要快速建议如何进行的最佳人选。
数据分析师可以回答类似“这个月我们在哪里削减开支?”,“我们的竞争对手在做什么?”和“我们可以做哪些不同的事情?”
数据分析师经常面临非常抽象、肤浅的问题。业务问题被交给他们,没有明确的最终目标是什么。
如果你是一名数据分析师,你会听到类似“你能帮助我们识别消费者行为的趋势吗?我们如何更好地向他们营销?”几乎每天。
接下来,分析师需要进一步探究并询问更具体、更详细的问题,以便理解分析的最终目标。
一个好的数据分析师,就像一个好的数据科学家一样,明白他们分析的最终结果只会和用来创建它的数据一样有用。不干净和嘈杂的数据导致无足轻重的见解,这对业务造成的伤害大于好处。
弥合业务和数据之间的鸿沟
一些公司普遍抱怨数据科学家技术含量太高,无法推动商业价值。
这些公司建立的机器学习模型往往不符合业务需求,最终没有得到使用。
数据分析师可以通过识别最有用的数据点来帮助弥合这一差距,这些数据点可以被提取出来以帮助实现业务价值的最大化。
成为数据分析师所需的技能
数据分析师来自各种背景。我知道一些商业顾问学会了编码并转型到了分析领域,正如我知道一些数据工程师获得了领域知识并完成了转型。
不管你来自什么样的背景,你都有必要具备很强的 Python 过程化编程技能。你需要能够处理不同格式的数据,收集数据,清理数据,并从中找出意义。
你还需要知道像 SQL 这样的查询语言,并且应该能够快速组合和分析大型数据库中的数据。
作为一名分析师,数据可视化、演示和沟通技巧将对你有很大帮助,你需要以一种人们容易理解的方式来分解你的发现。
最后——总是问为什么。如果你天生好奇,总是质疑事物,数据分析对你来说是一个很好的职业选择。
您正在处理的数据集中的每一行都对应于一个人生活的某个方面。例如,当处理消费者支出数据以确定趋势时,我经常在脑海中创建一幅他们的图片。在把他们的行为拼凑在一起后,我想象他们的角色,并试图把它和我在现实生活中认识的人联系起来。
如果你喜欢讲故事,喜欢更深入地发掘别人不容易发现的见解,那么数据分析是一份有趣的工作。
如何创建你的个人电报机器人来学习新的语言
原文:https://towardsdatascience.com/heres-your-personal-丨t丨e丨l丨e丨g丨r丨a丨m丨s丨-bot-to-learn-new-language-4c874252c744?source=collection_archive---------26-----------------------
总是鼓励你,随时准备和你一起学习
照片由捕捉人心。 on Unsplash
10-20 年前,学习一门新语言是很困难的。对于那些到了一定年龄的人来说,你可能还记得,学习一门新的语言要么是购买带有录音的语言书籍,要么是去上课,老师让学生轮流发单词的音。
如今,像 Duolingo 这样的应用程序可以让你按照自己的节奏学习新语言,这要好得多。然而,有时你只是想知道如何说一个特定的单词/短语,并想知道你说得对不对。我们可以将这个过程自动化,而不是先搜索翻译再搜索发音,同时从创建自己的人工智能机器人中获得满足感。
介绍我的唤醒机器人…
老师在日语里是老师的意思。从 GIF 录音中,可以看到界面很简单:
- 用户从两个选项中选择一个——“如何发音 JP 单词”或“如何用 JP 发音(EN)”。
- 用户输入单词/短语,机器人发回带有发音的录音。
- 如果用户选择“如何用日语说(EN)”,他/她可以对着麦克风说出这个单词/短语,机器人将验证用户是否说对了。
虽然该机器人现在适合日语,但它可以很容易地配置为其他语言。设置很简单,而且是免费的。
我们现在将看到如何在您的本地环境以及云环境中设置 bot。
先决条件
设置需要两个主要因素。
1.电报机器人
要创建你的电报机器人,只需访问机器人父亲(详情见这里)。整个过程不到一分钟,虽然你可能需要更多的时间来想一个好的用户名,但还没有被采用。最重要的是,请注意您的令牌,我们稍后将需要它来控制我们的 bot。
2.谷歌云账户
该机器人使用一些谷歌云 API 来展示其魔力:
- 用于单词发音的文本到语音转换 API
- 用于检查用户发音的语音到文本 API
- 翻译 API,用于将英语转换为选择的语言
最棒的是,谷歌云为新注册用户提供了 300 美元的免费试用版,而且上述 API 大部分都是免费的,所以你可以免费试用。
本地设置
要在您的本地环境中设置 bot 进行测试,您只需要 5 个简单的步骤。
1.启用 API
登录您的 Google Cloud 控制台后,启用 3 个 Google Cloud API(文本到语音、语音到文本、翻译)
我们三个火枪手的截图
2.创建存储桶
语音转文本 API 需要一个 Google 云存储桶来读取文件。因此,要创建一个 bucket,请前往 Google Storage 并创建一个。不要担心许多选项,您可以只保留默认设置。记下存储桶的名称,因为我们稍后会用到它。
3.下载服务帐户密钥
为了让我们从本地环境与 Google Cloud 交互,我们需要一个服务帐户密钥。
首先,创建服务帐户密钥。在“授予此服务帐户对项目的访问权限”下选择角色时,选择基本- >所有者。您可以跳过创建服务帐户的第 3 步。
之后,您可以创建一个密钥,并作为 JSON 下载到您的本地环境中。记下保存文件的目录。
4.Git 克隆并安装必要的包
这里的码基是这里的。Git 克隆到您的本地环境。
git clone [https://github.com/jiahao87/sensei_bot.git](https://github.com/jiahao87/sensei_bot.git)
必要的包列在 requirements.txt 中。在创建新环境并相应地安装软件包之前,将目录切换到 sensei_bot 文件夹。
pip install -r requirements.txt
5.安装ˌ使成形
我们的最后一步是将我们的配置输入到代码库中的 config.py 文件中。
相应地填写 BOT_TOKEN 、GOOGLE _ APPLICATION _ CREDENTIALS和 BUCKET_NAME 。
完成最后一步后,我们现在可以通过运行我们的主脚本 app.py 来启动我们的机器人。
python app.py
如果一切正常,您应该会看到类似下面的消息,并且您可以开始在 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨 中与您的机器人进行交互。😄
Google 云设置
除非你计划 24/7 全天候开启你的电脑,否则你需要通过三个简单的步骤将你的机器人托管在云中
1.设置虚拟机(VM)
我们的第一步是通过谷歌云控制台设置一个计算引擎虚拟机实例。
a)登录谷歌云控制台后,启用计算引擎 API
b)启动谷歌云壳
您应该会在控制台页面的右上角看到一个类似于下面红框中按钮的按钮。点击它,会弹出一个终端。我们将使用这个终端来启动我们的虚拟机。
c)创建一个计算引擎虚拟机实例
将以下内容复制并粘贴到 Google Cloud Shell 中,创建一个名为 sensei-bot 的 VM 实例。
gcloud compute instances create sensei-bot \
--machine-type f1-micro \
--zone us-central1-a \
--image-family ubuntu-1804-lts \
--image-project ubuntu-os-cloud \
--scopes [https://www.googleapis.com/auth/cloud-platform](https://www.googleapis.com/auth/cloud-platform)
2.启用 API 并创建云存储桶
对于步骤 1 和步骤 2 ,遵循本地设置下的先前步骤。如果您已经这样做了,请随意跳过这一步。
3.Git 克隆和配置
让我们通过 SSH 进入我们的 sensei-bot 实例来配置我们的 VM。
转到计算引擎页面并为您的实例点击 SSH 按钮。您的 VM 实例的终端应该会弹出。
键入以下脚本来安装包并 git 克隆我们的代码库。
sudo apt update
sudo apt-get -y install python-dev build-essential
sudo apt -y install python3-pip
python3 -m pip install -U pip
export PATH="$HOME/.local/bin:$PATH"
pip3 install --upgrade setuptools
sudo apt-get -y install ffmpeg tmux
git clone [https://github.com/jiahao87/sensei_bot.git](https://github.com/jiahao87/sensei_bot.git)
cd sensei_bot
pip3 install -r requirement.txt
输入您的 BOT_TOKEN 和 BUCKET_NAME 修改 config.py :
nano config.py
由于我们的实例在 Google Cloud 本身中,我们已经在gcloud compute instances create
脚本中提供了允许访问云 API 的指令,所以我们可以将Google _ APPLICATION _ CREDENTIALS保持不变,作为 None 。
修改完 config.py 后,按Ctrl+x
y
Enter
保存修改并退出编辑器。
通过执行以下命令,使用 tmux 打开一个新窗口:
tmux
您现在可以通过运行以下命令来启动您的 bot:
python3 app.py
其他配置
为了让机器人真正个性化,我们在 config.py 中添加了一个名为 丨t丨e丨l丨e丨g丨r丨a丨m丨s丨_ID 的参数,只允许指定的用户与机器人对话。毕竟,即使云 API 是免费的,也有一个配额,你不会想因为别人在和你的机器人说话而超过这个配额。
想知道你的电报 ID,可以看看这个 wikiHow 。
但是,请注意,这并不是为了生产级的安全性,尽管它满足了我们的目的。
发送给未授权用户的消息截图
最后,人们也可以探索将 LANGUAGE_CODE 和 TEXTTOSPEECH_NAME 改为其他语言。你可以在这里看到谷歌支持的语言。根据语言的独特特征,可能需要对代码进行一些修改。
通过上面的指南,我们希望你现在能够在本地和谷歌云上部署你的个人机器人来学习新的语言。也可以随意修改代码,因为可以添加更多的功能,例如每天通知新单词/短语,甚至让机器人成为高级语言学习者的会话。
感谢阅读,我希望这篇文章是有用的:)也请随时评论您可能有的任何问题或建议。
参考
https://core.丨t丨e丨l丨e丨g丨r丨a丨m丨s丨.org/bots
Python 3.8 中的 Hessian 矩阵和优化问题
原文:https://towardsdatascience.com/hessian-matrix-and-optimization-problems-in-python-3-8-f7cd2a615371?source=collection_archive---------6-----------------------
如何在没有 TensorFlow 或 PyTorch 的情况下执行经济优化
建议
与 Python 3.8 的兼容性测试,在 MacOS 11.3 和 Linux Ubuntu Server 20.04 LTS 环境下执行。
使用的库:Numpy,Sympy。
pip3.8 install numpy sympy
Hessian 矩阵用于牛顿型方法中的大规模优化问题,因为它们是函数的局部泰勒展开的二次项的系数。偏导数在经济学中扮演着重要的角色,在经济学中,大多数描述经济行为的函数都假设经济行为取决于不止一个变量。例如,一个社会消费函数可以描述消费商品的花费取决于收入和财富;边际消费倾向就是消费函数相对于收入的偏导数。
Hessian 矩阵也通常用于在图像处理和计算机视觉中表达图像处理算子(参见高斯拉普拉斯(LoG)斑点检测器)。海森矩阵也可以用于正常模式分析,以计算红外光谱中不同的分子频率。
由christofer engstrm在 Unsplash 上拍摄的照片
数值函数的 Hessian 矩阵是其二阶偏导数的方阵,记为 H(f)。在数学中,多变量函数的偏导数是它对其中一个变量的导数,其他变量保持不变。
示例:
梯度向量可以解释为“最快增加的方向和速率”。
如何用 sympy 求偏导数?
如果函数的梯度在点 p 不为零,梯度的方向就是函数从 p 增加最快的方向,梯度的大小就是那个方向的增加率,最大的绝对方向导数。
在有序集合 E 中,部分 A 的一个元素是 A 的最大元素或最大值,如果它属于 A 并且大于 A 的任何其他元素。对于有序集合的任何部分,最大值的存在通常是不确定的。另一方面,在存在条件下,这样的元素是唯一的。类似地,最小元素或最小值(如果存在的话)是比的任何其他元素都小的的元素。
目标是通过求解以下方程来确定最大或最小候选值:
Python 3.8 中的实现非常简单,需要 Sympy 库中的“solve”函数。
现在,我们需要执行二阶导数来获得 hessian 矩阵:
顺便说一下,这是程序的主要功能,它仲裁所有指令块之间的变量分配:
在我们的程序中,我们将施瓦兹定理应用于多变量函数的二阶偏导数,使得:
然而,我们不会证明这个定理,也不会试图在本文中解释它。下面是一个 numpy.matrix 格式的 hessian 矩阵示例,用于函数:
Hessian matrix that organizes all the second partial derivatives of the function x**2–1.5*x*y + y**2 is :
[[2 -1.50000000000000]
[-1.50000000000000 2]]Determinant in the critical point {x: 0.0, y: 0.0} is : 1.75000000000000
行列式是一个标量值,它是一个方阵的元素的函数。
它允许表征矩阵和由矩阵表示的线性映射的一些属性。特别地,行列式非零当且仅当矩阵可逆,且矩阵所表示的线性映射是同构的。
因此,对于正半定和负半定 Hessian,该测试是不确定的(Hessian 半定但不确定的临界点可能是局部极值或鞍点)。
图片由 Louis Brulé Naudet 提供。
在我们的例子中,对于临界点(0;0),行列式为 1.75 > 0,f'xx > 0,那么,临界点是一个局部极小值,所以函数是严格凸的。
Tensorflow 或其他机器学习库无疑是强大的,但它们仍然过度消耗资源,并且可能成为低性能机器的障碍,本文旨在解释一种构建 Hessian 矩阵的新方法,使用一种更轻便的科学计算工具:sympy。
Louis Brulé Naudet 拥有巴黎萨克莱大学的法律和经济学/管理学双学位。
回归模型中的异方差性
原文:https://towardsdatascience.com/heteroscedasticity-in-regression-model-21d9f5a93e59?source=collection_archive---------6-----------------------
使用统计模型检查异方差性
图片来自 Unsplash
简介
通常,回归分析是对可能具有跨不同自变量值的高方差的内置特征的数据进行的。这类数据的一个缺陷是异方差,它表示拟合值周围的可变方差。当我们观察异方差时,通常需要验证模型,有时在这种情况下回归数据可能不可靠。
什么是异方差?
当我们执行回归时,数据点分散在拟合线周围。对于一个好的回归模型,散射应该尽可能小。当散射是均匀的时,这个模型称为均匀散射模型。如果不是,模型就是异方差的。典型的异方差分布类似于锥形,如下所示
异方差数据的锥形分布。作者图片
从上图可以看出,很明显,在独立变量(n)的值较低时,散射非常紧密,而当 n 的值较高时,方差较高。
什么原因导致异方差?
大多数情况下,数据本身就是这种锥形分布的原因。有时,因变量的方差在整个数据集内变化且不恒定是很自然的。例如,在时间序列数据的情况下,因变量的初始值可能非常接*,但在最*的时间内,分散可能会扩大。在 20 世纪 50 年代,美国所有 50 个州的苹果价格可能非常相似,但在最*一段时间可能会有很大差异。换句话说,最*的数据点之间的变化可能比早期数据之间的变化更大。
用 python 实现
对于上面显示的数据集,我们可以通过使用 python 的 statsmodels 库来检查异方差性。 Statsmodels 包含 het_white 模块,这是针对异方差性的 white 拉格朗日乘数检验。文档显示可以对任何样本数据进行测试,输出 p 值作为异方差检验的指标。零假设取为“残差数据无异方差”。
让我们先检查一下同质数据。
拟合线周围的均匀散射。作者图片
我创建了一个合成数据集作为异方差数据的样本。
拟合线周围的非均匀散射。作者图片
我们可以对这个数据进行 White 的检验1来检验是否存在异方差。
作者图片
在这种情况下,p 值非常小,因此我们拒绝零假设,并确认数据集中存在潜在的异方差。
修正异方差
异方差使得回归模型不太可靠,因为残差不应该遵循任何特定的模式。为了使模型稳健,散射应该在拟合线周围是随机的。处理异方差的一个非常流行的方法是转换因变量【2】。我们可以对变量执行对数转换,并用 White 的测试再次检查。为了演示,我们删除了 y 轴上的一些低值。
转换变量。作者图片
作者图片
当进行怀特检验时,p 值变高,表明数据变得同方差。然而,当执行数据转换时,原始数据的定义不再存在,而是被新的变量所取代。
结论
异方差会降低回归模型的稳健性。本质上,预测误差因自变量的不同范围而异,表明模型并不完美。在本文中,我们使用 statsmodel 演示了异方差的原因及其在 python 中的检测实现。在进行任何回归分析后,应始终检查残差图,并确保残差的可变性不遵循任何模式,或者换句话说,残差的散布应在整个回归线上是均匀的。
Github 页面
参考文献
1 异方差没什么可怕的
[2] 多元回归分析中的异方差性:什么是异方差性,如何检测异方差性,如何解决异方差性,以及在 R 和 SPSS 中的应用
Python 的隐藏宝石
原文:https://towardsdatascience.com/hidden-gems-of-python-76020b14e42f?source=collection_archive---------1-----------------------
我甚至不知道 Python 有哪些特性
由 Unsplash 上 Ksenia Makagonova 拍摄的照片
这些天我有了一个新的消遣——阅读 Python 文档只是为了好玩!当你在闲暇时阅读一些东西,你会注意到一些有趣的花絮,否则你会错过的。所以,这是让我“哦!你可以用 Python 来做吗?”
1.功能属性
类似于设置类和对象的属性,也可以设置函数的属性。
我们在第 10 行设置了属性‘optional _ return ’,在第 11 行设置了属性‘is _ awesome’。在后面的第 19 & 20 行中,我们已经在函数之外访问了这些属性。代码的输出将是:
Final answer is 2197
Show calculations --> 13
Is my function awesome? --> Yes, my function is awesome.
当您希望选择检索某个中间变量,而不是在每次调用函数时用 return 语句显式返回它时,这就很方便了。还要注意,属性可以从函数定义内部或从函数定义外部设置。
2.For-else 循环
在 Python 中,可以为循环的添加一个 else 子句。只有在执行过程中在循环体中没有遇到 break 语句,才会触发 else 子句。
All elements at least 3 letters long
注意 else 对于缩进在的层次上,而对于不在的层次上。这里,没有元素的长度短于 3。所以,永远不会遇到 break 语句。因此, else 子句将被触发(在循环的被执行后)并打印如上所示的输出。
有人可能会说,这可以通过使用一个单独的变量来实现,该变量跟踪是否遇到了 break 语句。也许它也能减少下一个阅读代码的人的困惑。以下是实现相同结果的等效方法:
不过,我想知道还是好的。
3.“int”的分隔符
很难在视觉上区分 10000000 和 10000000 这样的整数(它们甚至是不同的数字吗?).我们不能像在英语中一样在 Python 中使用逗号,因为 Python 会将其解释为多个整数的元组。
Python 有一个非常方便的处理方法:我们可以使用下划线来提高可读性。因此,1_000_000 将被解释为单个 int 。
<class 'int'>
<class 'int'>
True
4.eval()和 exec()
Python 能够动态读取一个字符串,并像处理一段 Python 代码一样处理它。这是通过使用 eval ()和 exec ()函数实现的(‘eval’用于评估表达式,‘exec’用于执行语句)。
b = 5
c is 9
在第 3 行, eval ()函数将输入字符串作为 Python 表达式读取,对其求值,并将结果赋给变量‘b’。在第 6 行, exec ()函数将输入字符串作为 Python 语句读取并执行。
您甚至可以将动态创建的字符串传递给这些函数。例如,您可以创建 1000 个名为 x_0,x_1,…,x_999 的变量,而不必在代码中手动编写每个变量声明。这可能看起来像是一个完全没有意义的特性,但事实并非如此。
在更广泛的编程环境中,不仅仅是 Python,eval/exec 的使用非常强大,因为它允许您编写动态代码,使用运行时可用的信息来解决甚至无法在编译时表达的问题。[……]exec 实际上是嵌入在 Python 中的 Python 解释器,因此如果您有一个特别难解决的问题,您可以解决它的方法之一是编写一个程序来编写一个程序来解决它,然后使用 exec 运行第二个程序。
你可以阅读更多史蒂文·达普拉诺的美丽解释。
5.省略
省略号或“…”是 Python 的内置常量,类似于无、真、假等内置常量。它可以以不同的方式使用,包括但不限于:
5.1 未成文代码的占位符
与 pass 类似,省略号可以在代码没有写完整时用作占位符,但需要一些占位符来保证语法准确性
5.2 替代'无'
当想要表示一个空的输入或返回时,通常选择 None。但有时 None 可以是函数的预期输入或返回之一。在这种情况下,省略号可以作为占位符。
给定 n,函数 nth_odd() 计算第 n 个奇数。给定第 n 个奇数,函数 original_num ()计算原始数 n。这里, None 是函数 original_num ()的预期输入之一,因此我们不能将其用作参数 m 的默认占位符。代码的输出将是:
This function needs some input
Non integer input provided to nth_odd() function
9 is 5th odd number
16 is not an odd number
5.3 NumPy 中的数组切片
NumPy 使用省略号对数组进行切片。下面的代码显示了分割 NumPy 数组的两种等效方法:
[ 0 2 4 6 8 10 12 14]
[ 0 2 4 6 8 10 12 14]
因此,'…'表示需要多少':'就有多少。
省略的布尔值
与无(的布尔值为假)相反,的省略号的布尔值被视为真。
TL;速度三角形定位法(dead reckoning)
总之,到目前为止我发现的有趣的特性是:
- 函数属性:像对象一样给函数分配属性
- For-else 循环:跟踪循环是否在没有 break 语句的情况下执行
- int 的分隔符:32_534_478 是一个 int
- eval ()和 exec ():将字符串作为 Python 代码读取并运行
- 省略号:通用内置常量。
离别赠言
Python 不仅是一种有用的语言,而且是一种非常有趣的语言。我们在生活中都很忙,但是为了更好地了解这门语言并没有坏处。我很想知道一些你可能发现的复活节彩蛋。
图片由 u/ANewMuleSkinner 发布在 reddit 上
资源
您可以在下面的 Python 文档页面上阅读更多关于我上面提到的内容:
1 功能属性
For-else
[3] 评估/执行
省略号
隐马尔可夫模型:综述
原文:https://towardsdatascience.com/hidden-markov-models-an-overview-98926404da0e?source=collection_archive---------15-----------------------
实践教程、行业笔记
有许多工具可用于分析顺序数据。隐马尔可夫模型(HMMs)是最简单、最灵活、最经得起时间考验的模型之一。它们最初是为信号处理而开发的,现在在生物信息学中无处不在。
在数据科学社区中,有一种倾向是支持像 LSTMs 这样的机器学习选项。虽然这些工具非常强大,但它们也是出了名的复杂和难以理解。因此,你经常会看到数据科学家努力使用复杂的方法,而简单的方法会更好。
本文旨在解决这一问题,让技术人员了解经常被忽视的 HMM 的概念和应用。在 Zeitworks 我们非常依赖最先进的机器学习技术,但作为经验丰富的数据科学家,我们也知道有时 HMM 是这项工作的工具。
激发真实世界的例子
以下是我使用 hmm 解决的一些问题:
- 在zei networks我们使用计算机事件日志研究人类工作流程。其中一部分是获取用户的原始事件日志(击键、访问的 URL 等。)并确定他们每次都在做什么(背景研究、文档审查等)。).有时你可以孤立地从一个事件中猜测,但通常你也需要看看前后的事件才能有信心。
- 你有一本小说中某一页的照片,你想将文本数字化。照片已经被分割成单词的图像。大部分都可以用 OCR 解码,但是有些字因为原页面上的污垢而模糊不清(那是“快”还是“嘎嘎”?).你想用周围的词来挑选最佳选项。
- 当一个人在玩电子游戏时,你有一系列每秒钟拍摄的大脑扫描。在游戏中,他们的化身在建筑物中进进出出,你的目标是仅使用大脑扫描来猜测它是在室内还是室外。任何给定的扫描都是非常不明确的,但是头像通常会在里面/外面停留几秒钟。你预计化身在(外)侧的时间跨度很大,大脑扫描*均看起来稍微更偏向(外)侧。
为这些问题中的每一个建立一个定制的解决方案是可能的,但是这是一个非常大的任务,有脆弱或易受攻击的风险。通常,特别是如果工作部分是探索性的,你想要更轻的东西。hmm 提供了一个框架,它足够通用,可以涵盖所有这些情况,足够灵活,可以包含大量领域知识,并且足够简单,可以理解。
数学模型
让我们从商业现实过渡到数学理想化。上述业务问题有几个共同点:
- 有一个离散的潜在现实世界的“状态”,随着时间的推移而变化。在示例(1)和(3)中,状态很少改变。在示例(2)中,状态是页面上的单词,并且它几乎在每个时间步都发生变化。我们把这个现实世界的状态叫做 s。
- 在每个时间步长,您都有一个“观察”,可以用来以一定的置信度猜测状态(对于 OCR 示例,置信度通常很高,但是对于大脑扫描,置信度很低)。让我们把这个观测称为 O。注意,虽然状态 S 是离散的,O 可以是离散的,也可以是连续的。
- 这个想法是使用时间 T 时的观察值 O 来猜测状态 S,然后使用 T 前后的观察值来改进我们的猜测。
整体情况看起来是这样的,状态一个接一个,每一个都产生一个观察结果:
HMM 中状态和观察值之间的依赖结构
具体来说,在你的头脑中保持下面的画面。状态 S 是可以掷出的骰子,观察值 O 是哪一面出现。为简单起见,假设有两个骰子,其中一个是公*的,另一个有 50%的机会是 6。掷出公*骰子后,有 10%的几率我会换到另一个骰子,在掷出装载的骰子后,有 20%的几率我会换。我做了很多次掷骰子——从来没有告诉你我用的是哪个骰子——而你的工作就是猜测骰子什么时候是公*的或者是装满的。你需要的最后一条信息是,在第一次掷骰子时,我使用公*骰子还是装载骰子的可能性有多大;让我们称之为 50/50。这种情况可以归纳为三个表格:
一个简单的 HMM 的数学描述与骰子,一个加载和一个公*。
为了用数学术语表达这一点,我们需要:
- 每个州的初始概率,P[S⁰=s].这个矢量通常被称为π。
- 转移概率矩阵
为了简单起见,我称之为 Pr[a → b] 。
- 给定状态下观察值的概率分布,Pr[O=o|S=s]。因为骰子 O 是离散的,概率分布放在一个表格里。但是数学上 O 可以是任何东西;对于算法,我们只需要一个函数,它接受状态(从 1 到 k 的整数)和观察值(可以是任何值)并返回一个非负数。
我应该指出,如果我们忘记观察,状态 S 构成一个更简单的模型,称为“马尔可夫链”。几乎随机分析中的所有东西要么是马尔可夫链,要么是马尔可夫链的变体;hmm 是一种变体,其中链的状态对我们的知识是隐藏的(因此得名),并且必须通过不完美的观察来猜测。
hmm 的局限性及优化
我想讨论一下 HMM 模型中一些很少是 100%真实的理想化情况,以及对此你能做些什么。如果您只想了解如何使用 HMMs,可以跳过这一部分:)
最大的理想化是所谓的“马尔可夫假设”,即下一个状态只依赖于当前状态。我喜欢把它比作一只患了健忘症的青蛙,在睡莲叶间跳跃;他不知道他在当前的发射台呆了多久,也不知道他之前在哪里,所以他只根据他从当前位置看到的东西来选择下一个发射台(或者根本不跳)。您可以通过一个 n 阶马尔可夫链来部分解决这个问题,其中您的“状态”实际上是一个滑动窗口,覆盖了包括当前状态在内的最后 n 个状态。在自然语言中使用 hmm 时,你会经常看到这种情况。这在计算上变得有风险,因为你现在要跟踪 k^n 不同的“州”。
HMMs 的下一个假设是状态是真正离散的。通常情况下,状态是由人来决定的,地面上的现实可能并不完全符合其中一种状态。hmm 没有混合状态的概念,但是它们支持关于状态的不确定性;当模型表明两种状态的可能性相当时,可能是信号很弱,但也可能是世界不适合我们的盒子。
最后是最重要的 Pr[O|S],给定潜在状态下你观察到的概率。在我们的玩具骰子示例中,它只是一个查找表。不过,在我引用的现实世界的例子中,制作 Pr[O|S]本身就是一个项目,包括建模假设和拟合历史数据。HMM 对 Pr[O|S]的复杂程度没有限制,但它确实假设 O 仅依赖于当前的 S,而不依赖于任何先前的 S 或 O。这一假设当然不成立——因为 S 中没有捕捉到真实世界的动态,所以观察值通常是相关的——但在实践中这很少会有问题。
计算状态:维特比算法
现在让我们把这个模型付诸实践吧!你可以用 HMM 做很多事情,但是在商业中 90%的时间是这样的:给定一系列 N 次观察,猜猜状态是什么。为此,我们使用著名的维特比算法,该算法计算给定我们的观察的基础状态的最优序列。
当我说“最优”时,我指的是“最有可能”——1)从基础马尔可夫链中获得状态序列,然后 2)该序列生成已知观察值的概率。
为了做到这一点,考虑一个相关的子问题:找到直到时间步 i 的最佳序列,该时间步 I在特定状态 s* 结束。让我们定义σ(i,s)为该序列的概率。想想骰子的例子:关键的见解是,直到 i+1 结束的最佳序列是公*的,或者是{直到 I 结束的最佳序列是公*的}+{公*},或者是{直到 I 结束的最佳序列是装载的}+{公*}。如果我们知道到时间 I 为止的最佳序列,那么 i+1 就很容易了!在数学中,这告诉我们:*
我们可以将所有σ(i,s)排列在一个表格中,如下所示:
一旦这个表被填充,我们几乎完成了维特比算法!我们可以通过查看哪个 s 最大化σ(N,s)来找到最优序列中的最后一个状态。然后我们逆向工作——在计算σ(N,s)时,我们用哪个 x 来表示σ(N-1,x)?您可以通过画一个从σ(i,s)到σ(i-1,x)的箭头来形象化这个过程,如下所示:
这样,我们可以重建整个最佳序列。如果我们想表达这是伪代码,我们可以写:
只有一个小的实现细节我必须注意。所述的算法将会遇到数值问题,因为概率变得如此之小。这很容易通过对概率的对数进行操作,并计算 Log[σ(i,s)]而不是σ(i,s)的表来解决。最大化 Log[σ(i,s)]等价于最大化σ(i,s)。
离别赠言
当我告诉科技行业的人我们在 Zeitworks 做什么时,我得到的典型回应是“哦,你可以用 LSTM 来做这个!”。虽然这些现在确实很流行,但是还有很多分析序列数据的工具,它们各有所长。
lst ms——以及其他深度学习模型——在现实世界模式不可理解的情况下大放异彩。这些是“数据驱动”的工具;有了足够的数据来训练,有了足够的旋钮来转动,它们可以学习模仿人类从未记录下来的复杂模式。作为交换,它们很难解释,如果问题发生变化也很难概括,并且依赖于大量的数据。
hmm 则相反。它们是“模型驱动的”:一种对人类友好的世界叙事,被浓缩成方程式。这些方程中的参数符合数据,但它们是有意义的数字,有现实世界的解释,而不是一个数字巫术。模型驱动的工具不如数据驱动的工具强大,但是作为交换,它们训练起来很便宜,很容易理解,而且你可以把专业知识融入其中。
数据驱动和模型驱动工具是互补的,而不是对立的。它们是解决不同问题的理想选择,在 Zeitworks,我们将两者结合在一起。但是做到这一点取决于批判性地思考你的武器库中所有工具的能力,理解它们的优势,以便你可以将它们与正确的任务相匹配。
我在本文中的目标是让您理解 hmm。它们是强大的模型——尽管在数据科学界经常被低估——它们通常是这项工作的最佳工具。
下一篇 : 训练嗯
蟒蛇的隐藏宝藏
原文:https://towardsdatascience.com/hidden-treasures-of-python-78ae604f7e33?source=collection_archive---------23-----------------------
很少使用的库以及如何使用它们
来自 Unsplash
Python 编程语言中有成千上万的库,所以本文的标题基本上可以涉及到几乎所有的库,只有几百个库除外。描述所有的 Python 库可能需要一个真正的图书库。不过,在本文中,我们将重点介绍几个用于解决特定任务或娱乐的工具。
为了实践我们的库,我们将从 Kaggle 下载一个数据集— 动物护理和控制收养的动物。
import pandas as pd
df = pd.read_csv('animal-data-1.csv')
print('Number of pets:', len(df), '\n')
print(df.columns.tolist())**Output**:Number of pets: 10290 ['id', 'intakedate', 'intakereason', 'istransfer', 'sheltercode', 'identichipnumber', 'animalname', 'breedname', 'basecolour', 'speciesname', 'animalage', 'sexname', 'location', 'movementdate', 'movementtype', 'istrial', 'returndate', 'returnedreason', 'deceaseddate', 'deceasedreason', 'diedoffshelter', 'puttosleep', 'isdoa']
1.缺少编号
库安装 : pip install missingno
Missingno 是一个特殊的库,用于显示数据帧中缺失的值。当然,出于这个目的,我们可以使用任何可视化库中的 seaborn 热图或条形图。然而,在这种情况下,我们必须首先使用df.isnull().sum()
创建一个包含每列中缺失值的序列,而 missingno 在幕后完成所有工作。该库提供了几种类型的图表:
matrix
显示数据帧中多达 50 列的数据完成密度模式,它类似于 seaborn 缺失值热图。此外,通过右侧的迷你图,它显示了数据完整性的大致形状,强调了具有最大和最小空值的行。bar chart
以列为单位显示无效可视化。heatmap
测量范围从-1 到 1 的无效相关性。本质上,它显示了一个变量的存在与否对另一个变量的存在有多么强烈的影响。没有丢失值或正好相反,完全为空的列被排除在可视化之外,没有有意义的相关性。dendrogram
与热图一样,度量列之间的空关系,但在这种情况下不是成对的,而是在列组之间,检测缺失数据的簇。那些在图表上位置更*的变量显示出更强的零相关性。对于少于 50 列的数据帧,树状图是垂直的,否则,它翻转成水*的。
让我们在 pet 数据集上使用默认设置来尝试所有这些图表:
import missingno as msno
%matplotlib inline
msno.matrix(df)
msno.bar(df)
msno.heatmap(df)
msno.dendrogram(df)
我们可以对数据集进行以下观察:
- 一般来说,缺少的值很少。
- 最空的列是
deceaseddate
和returndate
。 - 大多数宠物都有芯片。
- 无效相关性:
- 被植入芯片和死亡之间有一点负面影响,
- 略显积极——被植入芯片与被归还,被归还与死亡。
有几个选项可以自定义缺失无图表:figsize
、fontsize
、sort
(按完整性对行进行排序,升序或降序)、labels
(可以是True
或False
,表示是否显示列标签)。有些参数是特定于图表的:矩阵图和条形图的color
,矩阵图的sparkline
(是否绘制)和width_ratios
(矩阵宽度到迷你图宽度),条形图的log
(对数刻度),热图的cmap
颜色图,树状图的orientation
。让我们将其中一些应用到上面的图表中:
msno.matrix(
df,
figsize=(25,7),
fontsize=30,
sort='descending',
color=(0.494, 0.184, 0.556),
width_ratios=(10, 1)
)
最后,如果还有什么我们想要调整的,我们总是可以将 matplotlib 的任何功能添加到缺少的图形中。为此,我们应该添加参数inline
并将其赋给False
。让我们给矩阵图添加一个标题:
import matplotlib.pyplot as plt
msno.matrix(
df,
figsize=(25,7),
fontsize=30,
sort='descending',
color=(0.494, 0.184, 0.556),
width_ratios=(10, 1),
inline=False
)
plt.title('Missing Values Pet Dataset', fontsize=55)
plt.show()
2.有*面的
库安装 : pip install tabulate
这个库用于用 Python 漂亮地打印表格数据。它允许智能和可定制的列对齐,数字和文本格式,通过小数点对齐。
tabulate()
函数采用表格数据类型(dataframe、列表或字典列表、字典、NumPy 数组)、一些其他可选参数,并输出一个格式良好的表格。让我们在 pet 数据集的一个片段上练习一下,从最基本的漂亮打印的表格开始:
from tabulate import tabulate
df_pretty_printed = df.iloc[:5, [1,2,4]]
print(tabulate(df_pretty_printed))**Output**:- ----------- ----------------------- ------
0 Jadzia Domestic Short Hair Female
1 Gonzo German Shepherd Dog/Mix Male
2 Maggie Shep Mix/Siberian Husky Female
3 Pretty Girl Domestic Short Hair Female
4 Pretty Girl Domestic Short Hair Female
- ----------- ----------------------- ------
我们可以在表中添加一个headers
参数。如果我们赋值headers='firstrow'
,则使用第一行数据,如果headers='keys'
,则使用数据帧/字典的键。对于表格格式化,我们可以使用一个tablefmt
参数,该参数可以从众多选项中选择一个(以字符串形式赋值):simple
、github
、grid
、fancy_grid
、pipe
、orgtbl
、jira
、presto
、pretty
等。
默认情况下,制表将包含浮点数的列靠小数点对齐,整数靠右,文本列靠左。这可以通过使用numalign
和stralign
参数(right
、center
、left
、decimal
用于数字,或None
)来覆盖。对于文本列,可以禁用默认的前导和尾随空格删除。
让我们自定义我们的表格:
print(tabulate(
df_pretty_printed,
headers='keys',
tablefmt='fancy_grid',
stralign='center'
))**Output**:╒════╤══════════════╤═════════════════════════╤═══════════╕
│ │ animalname │ breedname │ sexname │
╞════╪══════════════╪═════════════════════════╪═══════════╡
│ 0 │ Jadzia │ Domestic Short Hair │ Female │
├────┼──────────────┼─────────────────────────┼───────────┤
│ 1 │ Gonzo │ German Shepherd Dog/Mix │ Male │
├────┼──────────────┼─────────────────────────┼───────────┤
│ 2 │ Maggie │ Shep Mix/Siberian Husky │ Female │
├────┼──────────────┼─────────────────────────┼───────────┤
│ 3 │ Pretty Girl │ Domestic Short Hair │ Female │
├────┼──────────────┼─────────────────────────┼───────────┤
│ 4 │ Pretty Girl │ Domestic Short Hair │ Female │
╘════╧══════════════╧═════════════════════════╧═══════════╛
这里唯一要记住的是,漂亮打印的表格最好在笔记本电脑和计算机上显示,但有时在较小的屏幕上可能会有问题(智能手机和 iPhones)。
将文件制成表格
3.维基百科(一个基于 wiki 技术的多语言的百科全书协作计划ˌ也是一部用不同语言写成的网络百科全书ˌ 其目标及宗旨是为全人类提供自由的百科全书)ˌ开放性的百科全书
库安装 : pip install wikipedia
维基百科图书馆,顾名思义,方便从维基百科获取信息。使用它可以完成的一些任务包括:
- 搜索维基百科—
search()
, - 获取文章摘要—
summary
, - 获取完整的页面内容,包括图片、链接、维基百科页面的任何其他元数据,
- 选择页面语言—
set_lang()
。
在上面印刷精美的表格中,我们看到了一种叫做西伯利亚哈士奇的狗。作为练习,我们将把语言设置为俄语(我的母语🙂)并搜索相应维基百科页面的一些建议:
import wikipedia
wikipedia.set_lang('ru')
print(wikipedia.search('Siberian Husky'))**Output**:'Сибирский хаски', 'Древние породы собак', 'Породы собак по классификации кинологических организаций', 'Маккензи Ривер Хаски', 'Ричардсон, Кевин Майкл']
让我们取第一个建议,取该页摘要的第一句话:
print(wikipedia.summary('Сибирский хаски', sentences=1))**Output**:Сибирский хаски — заводская специализированная порода собак, выведенная чукчами северо-восточной части Сибири и зарегистрированная американскими кинологами в 1930-х годах как ездовая собака, полученная от аборигенных собак Дальнего Востока России, в основном из Анадыря, Колымы, Камчатки у местных оседлых приморских племён — юкагиров, кереков, азиатских эскимосов и приморских чукчей — анкальын (приморские, поморы — от анкы (море)).
现在,我们将从该页面获得一张哈士奇图片的链接:
print(wikipedia.page('Сибирский хаски').images[0])**Output**:[https://upload.wikimedia.org/wikipedia/commons/a/a3/Black-Magic-Big-Boy.jpg](https://upload.wikimedia.org/wikipedia/commons/a/a3/Black-Magic-Big-Boy.jpg)
想象这个美丽的生物:
来自维基百科
维基百科文档
4.Wget
库安装 : pip install wget
Wget 库允许下载 Python 中的文件,而不需要打开它们。我们还可以添加一个保存该文件的路径作为第二个参数。
下面下载上面哈士奇的图片:
import wget
wget.download('[https://upload.wikimedia.org/wikipedia/commons/a/a3/Black-Magic-Big-Boy.jpg'](https://upload.wikimedia.org/wikipedia/commons/a/a3/Black-Magic-Big-Boy.jpg'))**Output**:'Black-Magic-Big-Boy.jpg'
现在,我们可以在与此笔记本相同的文件夹中找到该图片,因为我们没有指定保存它的路径。
由于互联网上的任何网页实际上都是一个 HTML 文件,这个库的另一个非常有用的应用是抓取整个网页,包括所有的元素。让我们下载数据集所在的 Kaggle 网页:
wget.download('[https://www.kaggle.com/jinbonnie/animal-data'](https://www.kaggle.com/jinbonnie/animal-data'))**Output**:'animal-data'
产生的animal-data
文件如下所示(我们将只显示前几行):
<!DOCTYPE html>
<html lang="en">
<head>
<title>Animal Care and Control Adopted Animals | Kaggle</title>
<meta charset="utf-8" />
<meta name="robots" content="index, follow" />
<meta name="description" content="animal situation in Bloomington Animal Shelter from 2017-2020" />
<meta name="turbolinks-cache-control" content="no-cache" />
获取文档
5.骗子
库安装 : pip install Faker
该模块用于生成假数据,包括姓名、地址、电子邮件、电话号码、工作、文本、句子、颜色、货币等。faker 生成器可以将区域设置作为参数(默认为 en_US 区域设置),以返回本地化数据。为了生成一段文本或一个句子,我们可以使用缺省的 lorem ipsum 或者,我们可以提供我们自己的单词集。为了确保所有创建的值对于某个特定的实例都是惟一的(例如,当我们想要创建一长串惟一的假名时),应用了unique
属性。相反,如果有必要产生相同的值或数据集,就使用seed()
方法。
让我们看一些例子:
from faker import Faker
fake = Faker()print(
'Fake color:', fake.color(), '\n'
'Fake job:', fake.job(), '\n'
'Fake email:', fake.email(), '\n'
)*# Printing a list of fake Korean and Portuguese addresses*
fake = Faker(['ko_KR', 'pt_BR'])
for _ in range(5):
print(fake.unique.address()) *# using the `unique` property*print('\n')*# Assigning a seed number to print always the same value / data set*
fake = Faker()
Faker.seed(3920)
print('This English fake name is always the same:', fake.name())**Output**:Fake color: #bde2f9
Fake job: Transport planner
Fake email: chad52@yahoo.com
Rua Marcos Vinicius Costela, 66
Vila Nova Gameleira 2ª Seção
86025006 da Costa / MG
충청남도 평창군 언주1거리 (우진장읍)
Núcleo de Peixoto, 87
Havaí
90291-013 Campos / MS
Lago da Luz
Minas Brasil
85538436 Porto da Mata / TO
인천광역시 중랑구 서초중앙0로
This English fake name is always the same: Kim Lopez
回到我们的数据集,我们发现至少有两只不幸的宠物有着不太好听的名字:
df_bad_names = df[df['animalname'].str.contains('Stink|Pooh')]
print(df_bad_names)**Output**: identichipnumber animalname breedname speciesname
1692 NaN Stinker Domestic Short Hair Cat
3336 981020023417175 Pooh German Shepherd Dog Dog
3337 981020023417175 Pooh German Shepherd Dog Dog
sexname returndate returnedreason
1692 Male NaN Stray
3336 Female 2018-05-14 00:00:00 Incompatible with owner lifestyle
3337 Female NaN Stray
最后 2 排的狗实际上是同一只,因为与主人的生活方式不兼容而被送回收容所。用我们的新技能,让我们拯救这两种动物的名声,给它们重新起个更体面的名字。因为这只狗是德国牧羊犬,我们将为她选择一个德国名字。至于猫,根据这个维基百科页面,家养短毛是美国最常见的品种,所以我们会为它取一个英文名字。
*# Defining a function to rename the unlucky pets*
def rename_pets(name):
if name == 'Stinker':
fake = Faker()
Faker.seed(162)
name = fake.name()
if name == 'Pooh':
fake = Faker(['de_DE'])
Faker.seed(20387)
name = fake.name()
return name*# Renaming the pets*
df['animalname'] = df['animalname'].apply(rename_pets)*# Checking the results*
print(df.iloc[df_bad_names.index.tolist(), :] )**Output**: identichipnumber animalname breedname speciesname
1692 NaN Steven Harris Domestic Short Hair Cat
3336 981020023417175 Helena Fliegner-Karz German Shepherd Dog Dog
3337 981020023417175 Helena Fliegner-Karz German Shepherd Dog Dog
sexname returndate returnedreason
1692 Male NaN Stray
3336 Female 2018-05-14 00:00:00 Incompatible with owner lifestyle
3337 Female NaN Stray
对于一只猫和一只狗来说,史蒂文·哈里斯和海伦娜·弗利格纳-卡兹听起来有点太夸张了,但绝对比他们以前的名字好得多!
Faker 文档
6.数字计算器
库安装 : pip install numerizer
这个小 Python 包用于将自然语言数字转换成数字(整数和浮点数),并且只包含一个函数— numerize()
。
现在让我们在数据集上尝试一下。一些宠物的名字包含数字:
df_numerized_names = df[['identichipnumber', 'animalname', 'speciesname']][df['animalname'].str.contains('Two|Seven|Fifty')]
print(df_numerized_names)**Output**: dentichipnumber animalname speciesname
2127 NaN Seven Dog
4040 981020025503945 Fifty Lee Cat
6519 981020021481875 Two Toes Cat
6520 981020021481875 Two Toes Cat
7757 981020029737857 Mew Two Cat
7758 981020029737857 Mew Two Cat
7759 981020029737857 Mew Two Cat
我们将把这些名字的数字部分转换成实数:
from numerizer import numerize
df['animalname'] = df['animalname'].apply(lambda x: numerize(x))
print(df[['identichipnumber', 'animalname','speciesname']]\
.iloc[df_numerized_names.index.tolist(), :])**Output**: identichipnumber animalname speciesname
2127 NaN 7 Dog
4040 981020025503945 50 Lee Cat
6519 981020021481875 2 Toes Cat
6520 981020021481875 2 Toes Cat
7757 981020029737857 Mew 2 Cat
7758 981020029737857 Mew 2 Cat
7759 981020029737857 Mew 2 Cat
编号器文档
7.表情符号
库安装 : pip install emoji
通过这个库,我们可以根据由 Unicode Consortium 定义的表情符号代码,将字符串转换成表情符号,如果指定了use_aliases=True
,还可以补充别名。表情包只有两个功能:emojize()
和demojize()
。默认英语(language='en'
)可以更改为西班牙语(es)、葡萄牙语(pt)或意大利语(it)。
import emoji
print(emoji.emojize(':koala:'))
print(emoji.demojize('🐨'))
print(emoji.emojize(':rana:', language='it'))**Output**:🐨
:koala:
🐸
让我们给我们的动物表情符号。首先,我们将检查它们独特的物种名称:
print(df['speciesname'].unique())**Output**:['Cat' 'Dog' 'House Rabbit' 'Rat' 'Bird' 'Opossum' 'Chicken' 'Wildlife' 'Ferret' 'Tortoise' 'Pig' 'Hamster' 'Guinea Pig' 'Gerbil' 'Lizard' 'Hedgehog' 'Chinchilla' 'Goat' 'Snake' 'Squirrel' 'Sugar Glider' 'Turtle' 'Tarantula' 'Mouse' 'Raccoon' 'Livestock' 'Fish']
我们必须将这些名称转换成小写,给每个名称添加前导和尾随冒号,然后将emojize()
应用于结果:
df['speciesname'] = df['speciesname']\
.apply(lambda x: emoji.emojize(f':{x.lower()}:', use_aliases=True))
print(df['speciesname'].unique())**Output**:['🐱' '🐶' ':house rabbit:' '🐀' '🐦' ':opossum:' '🐔' ':wildlife:' ':ferret:' ':tortoise:' '🐷' '🐹' ':guinea pig:' ':gerbil:' '🦎' '🦔' ':chinchilla:' '🐐' '🐍' ':squirrel:' ':sugar glider:' '🐢' ':tarantula:' '🐭' '🦝' ':livestock:' '🐟']
让我们将家兔、乌龟和松鼠重命名为表情库可以理解的同义词,并再次尝试对它们进行表情符号化:
df['speciesname'] = df['speciesname']\
.str.replace(':house rabbit:', ':rabbit:')\
.replace(':tortoise:', ':turtle:')\
.replace(':squirrel:', ':chipmunk:')
df['speciesname'] = df['speciesname']\
.apply(lambda x: emoji.emojize(x, variant='emoji_type'))
print(df['speciesname'].unique())**Output**:['🐱' '🐶' '🐇️' '🐀' '🐦' ':opossum:️' '🐔' ':wildlife:️' ':ferret:️' '🐢️' '🐷' '🐹' ':guinea pig:' ':gerbil:️' '🦎' '🦔' ':chinchilla:️' '🐐' '🐍' '🐿️' ':sugar glider:' '🐢' ':tarantula:️' '🐭' '🦝' ':livestock:️' '🐟']
剩下的物种是或统称(野生动物和家畜),或者没有一个表情符号对等物,至少现在还没有。我们将让它们保持原样,仅删除冒号,并将它们转换回标题大小写:
df['speciesname'] = df['speciesname'].str.replace(':', '')\
.apply(lambda x: x.title())
print(df['speciesname'].unique(), '\n')
print(df[['animalname', 'speciesname', 'breedname']].head(3))**Output:**['🐱' '🐶' '🐇️' '🐀' '🐦' 'Opossum️' '🐔' 'Wildlife️' 'Ferret️' '🐢️' '🐷' '🐹' 'Guinea Pig' 'Gerbil️' '🦎' '🦔' 'Chinchilla️' '🐐' '🐍' '🐿️' 'Sugar Glider' '🐢' 'Tarantula️' '🐭' '🦝' 'Livestock️' '🐟']
animalname speciesname breedname
0 Jadzia 🐱 Domestic Short Hair
1 Gonzo 🐶 German Shepherd Dog/Mix
2 Maggie 🐶 Shep Mix/Siberian Husky
表情符号文档
8.皮阿兹特罗
库安装 : pip install pyaztro
PyAztro 似乎是为了娱乐而不是工作而设计的。这个图书馆为每个星座提供了一个占星术。该预测包括那天的标志描述、该标志的日期范围、心情、幸运数字、幸运时间、幸运颜色、与其他标志的兼容性。例如:
import pyaztro
pyaztro.Aztro(sign='taurus', day='tomorrow').description**Output**:"If the big picture is getting you down, narrow your focus a bit and try to enjoy the smaller aspects of life. It's a good day to remember what you're truly thankful for in life and to spread the word."
好建议!事实上,我不会等到明天,现在就把注意力集中在数据集上,研究一些相关的信息😀
有一只猫和一只狗叫白羊座:
print(df[['animalname', 'speciesname']][(df['animalname'] == 'Aries')])**Output**: animalname speciesname
3036 Aries 🐱
9255 Aries 🐶
还有很多叫狮子座的宠物:
print('Leo:', df['animalname'][(df['animalname'] == 'Leo')].count())**Output**:Leo: 18
让我们假设那些是他们相应的黄道十二宫😉有了 PyAztro,我们可以查看明星们今天为这些动物准备了什么:
aries = pyaztro.Aztro(sign='aries')
leo = pyaztro.Aztro(sign='leo')print('ARIES: \n',
'Sign:', aries.sign, '\n',
'Current date:', aries.current_date, '\n',
'Date range:', aries.date_range, '\n',
'Sign description:', aries.description, '\n',
'Mood:', aries.mood, '\n',
'Compatibility:', aries.compatibility, '\n',
'Lucky number:', aries.lucky_number, '\n',
'Lucky time:', aries.lucky_time, '\n',
'Lucky color:', aries.color, 2*'\n',
'LEO: \n',
'Sign:', leo.sign, '\n',
'Current date:', leo.current_date, '\n',
'Date range:', leo.date_range, '\n',
'Sign description:', leo.description, '\n',
'Mood:', leo.mood, '\n',
'Compatibility:', leo.compatibility, '\n',
'Lucky number:', leo.lucky_number, '\n',
'Lucky time:', leo.lucky_time, '\n',
'Lucky color:', leo.color)**Output**:ARIES:
Sign: aries
Current date: 2021-02-22
Date range: [datetime.datetime(2021, 3, 21, 0, 0), datetime.datetime(2021, 4, 20, 0, 0)]
Sign description: Throw away your old to-do list and start over. There may be some stuff on it that just holds you back because you know you'll never do it and you might pop off some cool new projects while you're at it.
Mood: Refreshed
Compatibility: Scorpio
Lucky number: 67
Lucky time: 1am
Lucky color: Sky Blue
LEO:
Sign: leo
Current date: 2021-02-22
Date range: [datetime.datetime(2021, 7, 23, 0, 0), datetime.datetime(2021, 8, 22, 0, 0)]
Sign description: Try something new and different today - eat out somewhere you've never been, experiment with new techniques to clean your house or just pick an activity at random and give it a go!
Mood: Curious
Compatibility: Taurus
Lucky number: 75
Lucky time: 11am
Lucky color: Teal
这些预测在 2021 年 2 月 22 日有效,所以如果你想查看我们宠物当天的星座(或者你自己的),你必须重新运行上面的代码。很明显,除了sign
和date_range
之外,所有的属性在 GTM 午夜都在改变。
皮阿兹托文件
当然,还有许多其他有趣的 Python 库,如 PyAztro,包括:
- 艺术 —用于将文本转换为 ASCII 艺术,比如:ʕ •`ᴥ• ʔ
- 龟 —用于绘图,
- 象棋 —用于下棋,
- 圣诞老人——随机配对秘密圣诞老人礼物和接收者,
甚至
- 火绒——用于使用火绒。
我们可以肯定,有了 Python,我们永远不会感到无聊!
结论
总之,我希望数据集中的所有宠物都能找到他们可爱和有爱心的主人,以及 Python 用户——发现更多令人惊叹的库,并将其应用到他们的项目中。
如果你喜欢这篇文章,你也可以发现下面这些有趣的:
https://medium.com/mlearning-ai/11-cool-names-in-data-science-2b64ceb3b882 https://medium.com/geekculture/creating-toyplots-in-python-49de0bb27ec1 https://python.plainenglish.io/the-little-prince-on-a-word-cloud-8c912b9e587e
知识图问答中期望答案类型的层次分类
原文:https://towardsdatascience.com/hierarchical-classification-of-expected-answer-type-in-knowledge-graph-question-answering-6c7b72d65923?source=collection_archive---------10-----------------------
思想和理论
机器如何理解用户在问什么?
TLDR
人们在寻找一个问题的答案时使用的一个重要步骤是了解哪种类型的答案最适合1。例如,对于“现在几点了?”我们希望听到“时间”类型的回答,以及“伊万·彼得罗夫出生在哪里?”—类型为“城市”或“国家”的答案。
基于知识图的问答系统也是如此,其目的是找到仿真问题的答案。本文介绍了一个用于确定预期答案类型(EAT)的模块,该模块不仅能够预测单个类,还能够构建类的层次结构作为预测值。该模块既作为网络界面(UI) 提供,也作为 RESTful API 提供。该功能允许最终用户获得 104 种语言的答案类型预测,查看预测的可信度并留下反馈。此外,API 允许研究人员和开发人员将 EAT 分类模块集成到他们的系统中。
通过问题理解一个人在问什么是人类用来找到相应答案的第一步。
预期答案类型分类器的 Web 用户界面(图片由作者提供)
知识图问答系统
开发问答系统有两种范式:(1)基于非结构化数据(基于 IR),其目标是在一组文本文档中找到最相关的段落,(2)基于结构化数据和知识(KBQA),这类系统将自然语言问题翻译成形式化的查询(SQL、SPARQL 等)。) [2].另外,我们应该提到知识图问答系统(KGQA),它是 KBQA 的一个子集,最*变得越来越流行。
开发问答系统的范例(图片由作者提供)
顾名思义, KGQA 系统由知识图驱动,通常使用资源描述框架(RDF) 存储,这又允许通过 SPARQL 查询访问数据。换句话说,KGQA 系统的目标是将自然语言问题转换成 SPARQL 查询,以便简化最终用户的数据访问。
向 KGQA 系统提出的问题是基于事实的。例如,当我们问“安格拉·默克尔出生在哪个城市?”我们希望看到“城市”类型的答案,在这个例子中是汉堡。在这种情况下,“城市”是预期的答案类型。根据 KGQA 系统中使用的特定知识图,这些类型通常被组织成层次分类法或本体(例如 DBpedia 本体)。考虑“安格拉·默克尔出生在哪个城市?”预期的答案类型层次结构(基于 DBpedia 本体中的类)如下所示。
问题“安格拉·默克尔出生在哪个城市?”的预期答案类型层次结构给出 DBpedia 本体(图片由作者提供)
在这个层次中,第一种类型是最具体的,而最后一种类型是最普遍的。
为什么 KGQA 系统需要知道预期的答案类型?非常简单——它将答案的搜索空间缩小了数倍。这可以通过一个简单的例子(参见下面的代码片段)来说明,这个例子使用了我们熟悉的安格拉·默克尔问题。
# without EAT prediction
PREFIX dbr: <[http://dbpedia.org/resource/](http://dbpedia.org/resource/)>
SELECT (COUNT(DISTINCT ?obj) as ?count)
WHERE {
dbr:Angela_Merkel ?p ?obj .
}
# ?count = 861
如代码片段所示,这个 SPARQL 查询根据 DBpedia 中的安格拉·默克尔资源计算可能的候选答案。结果是巨大的——861。让我们试着用预测的 EAT 缩小搜索空间。
# with EAT prediction
PREFIX dbr: <[http://dbpedia.org/resource/](http://dbpedia.org/resource/)>
PREFIX rdf: <[http://www.w3.org/1999/02/22-rdf-syntax-ns#](http://www.w3.org/1999/02/22-rdf-syntax-ns#)>
SELECT (COUNT(DISTINCT ?obj) as ?count)
WHERE {
dbr:Angela_Merkel ?p ?obj .
?obj rdf:type ?type .
FILTER(?type = dbo:City)
}
# ?count = 6
现在,由于我们使用类型“城市”限制了候选答案集,因此只有 6 个可能的候选答案。这确实令人印象深刻,因为从 6 个候选人中找出正确答案比从 861 个候选人中找出正确答案要容易得多。在下一节中,将介绍特定的 EAT 分类器架构。
预期答案类型分类器的体系结构
层次分类有三种方法【3】:扁*化、局部化、全局化。扁*方法忽略了层次结构,甚至可以说是扁*的,在这种情况下,我们处理的是多标签分类。局部方法为层次结构的每个级别(节点)使用几个分类器,而全局方法在一次调用中预测整个层次结构。
在本文中,我们使用局部方法(见架构图)对 EAT 进行分层分类。该解决方案基于多语言 BERT 模型[4],其中一个由 n 个神经元组成的全连接层被附加到【CLS】令牌输出中,其中 n 是在特定层次级别(节点)预测的类的数量。
分层 EAT 分类器的架构(图片由作者提供)
该图示出了 3 种模型——类别分类器、文字分类器和资源分类器。总共有三个类别:布尔、文字和资源。还有三种文字:数字、数据和字符串。对于资源,事情要复杂得多,因为有一个完整的层次分类(参见简介中的例子)。在我们的解决方案中,资源分类器预测最具体的响应类型(例如 dbo:City ),然后我们简单地使用 SPARQL query 从 DBpedia 获取层次结构的其余部分到顶层,如下所示。
给定最具体的本体类型,获取 DBpedia 本体层次结构的源代码
下面的代码用于创建基于 BERT 的 EAT 分类器。完整的源代码可以在我们的 Github 资源库中找到。
使用变压器库创建多类分类器的源代码
分类器输出的例子如下所示。
[
{
"id": "dbpedia_1",
"question": "Who are the gymnasts coached by Amanda Reddin?",
"category": "resource",
"type": ["dbo:Gymnast", "dbo:Athlete", "dbo:Person", "dbo:Agent"]
},
{
"id": "dbpedia_2",
"question": "How many superpowers does wonder woman have?",
"category": "literal",
"type": ["number"]
}
{
"id": "dbpedia_3",
"question": "When did Margaret Mead marry Gregory Bateson?",
"category": "literal",
"type": ["date"]
},
{
"id": "dbpedia_4",
"question": "Is Azerbaijan a member of European Go Federation?",
"category": "boolean",
"type": ["boolean"]
}
]
类别分类器的质量由准确度度量来测量,而其他分类器使用 NDCG 5 和 NDCG 10 度量来评估,这些度量被设计来评估排名列表。运行评估脚本后,我们获得了以下结果:准确率:98%,NDCG@5: 76%,NDCG@10: 73%。这些结果也可以在语义答案类型预测任务 2020 的公共排行榜上找到:https://smart-task.github.io/2020。
结论
这篇短文介绍了一个用于分类预期答案类型的组件,它可以用于基于知识图的问答系统。分类器支持多语言输入,在预测质量方面表现相当好。重要链接如下:
- Out 原文 PDF:http://ceur-ws.org/Vol-2980/paper349.pdf
- GitHub:https://github.com/Perevalov/iswc-classification
- web UI:https://web engineering . ins . hs-an halt . de:41009/eat-class ification
- API:【https://webengineering.ins.hs-anhalt.de:41020/docs
参考
- 郝,,等。“利用问题目标词特征通过语义关系扩展进行答案类型分类。”基于知识的系统133(2017):43–52。
- 朱拉夫斯基、丹尼尔和詹姆斯·马丁。"语音和语言处理(草案)."可从: https://web。斯坦福。edu/~茹拉夫斯基/slp3 (2021)。
- 卡洛斯·新罗和亚历克斯·弗雷塔斯。"不同应用领域的层次分类综述."数据挖掘和知识发现22.1(2011):31–72。
- 伯特:用于语言理解的深度双向转换器的预训练。 arXiv 预印本 arXiv:1810.04805 (2018)。
感谢
我要感谢我的导师 Andreas Both 教授,他给了我写博士论文的机会。我还要感谢安哈特应用科技大学的支持。最后,我要感谢 T21 的 Axel-Cyrille Ngonga Ngomo 博士教授,他同意共同指导我的博士论文。
数据科学 R 中的层次聚类和树状图
理解聚类技术、它的应用、优缺点以及用 r。
在执行数据分析的早期阶段,一个重要的方面是获得对多维数据的高级理解,并找到不同变量之间的某种模式——这就是聚类的用武之地。定义层次聚类的一个简单方法是:
根据相似的特征将一个庞大的数据集划分成较小的组,这将有助于以一种信息丰富的方式理解数据。
图片 via【unsplash.com】上的 @jeremythomasphoto
分层聚类可以分为两种类型:
分裂(自上而下):一种聚类技术,其中 N 个节点最初属于单个聚类,然后根据距离度量被分解成更小的聚类,直到在分层结构中达到期望的聚类数量。
agglomerate(自下而上):一组 N 个观察值,其中最接*的两个节点被分组在一个单独的簇中,剩下 N-1 个点,然后递归地遵循相同的模式,直到我们得到一个单独的簇,形成最终的树状图,该树状图将所有的簇解决方案包含在一个单独的树中。
这篇博文将关注凝聚层次聚类,它的应用以及 r 中的一个实际例子。 1) 当我们说我们将两个最*的节点分组在一起时,我们如何定义 close?和 2) 用什么合并方法将它们分组?
为了计算距离,可以使用几种方法(欧几里德距离是最常用的):
欧几里德距离:一种连续的直线相似性,即毕达哥拉斯定理
连续相关相似度
二元曼哈顿距离:计算两个向量之间的绝对距离(用于不能用直线定义距离的地方,如城市地图)
让我们从一个小数据集开始,了解 RStudio 中的树状图是如何形成的:
步骤 1:生成随机数据
我使用了正态分布来计算数据集的 x 和 y 坐标,并且为我们的理解对数据点进行了编号。
Set.seed(12)
x <- rnorm(10, sd = 1)
y <- rnorm(10, sd = 1)plot(x, y, col = "red", pch = 19, cex = 2)
text(x + 0.07, y + 0.06, labels = as.character(1:10))
(图片由作者提供)数据图
第二步:准备好我们的地块来创建一个树状图
首先,我们将 x 和 y 数据集存储为数据帧的 x 和 y 坐标。接下来,我们缩放坐标以使用*均值 0 和方差 1(标准化)来标准化我们的特征。最后,我们使用 dist()函数来计算数据帧中各行之间的距离。
dF <- data.frame(x = x, y = y)
dF <- scale(dF)
distxy <- dist(dF)
(图片由作者提供)例如,从点 3 到点 2 的距离是 2.94,而从点 6 到点 4 的距离是 0.603
第三步:调用 hclust()
这形成了基于数据集(在这种情况下为 10 个)中对象集合的距离度量(在这种情况下为“欧几里得”)的数据点的分级聚类
cluster <- hclust(distxy)
作者图片
第四步:创建一个树状图
另一种尝试的方法是使用图(as.dendrogram(cluster)) ,它会产生相同的结果。
plot(cluster, ylab = "Height", xlab="Distance", xlim=c(1,10), ylim=c(1,10))
作者图片
第五步:获得您想要的集群数量
根据手头的问题,你想要从你的系统树图中分离出来的类的数量根据你画线的位置而变化。这里,由于直线在 1 处切割高度,我们得到 4 个集群。
abline(h=1.0, col= "blue")
作者图片
应用:
从动物/植物物种的分类到确定病毒变体的相似性到营销活动的客户分类,树状图有许多用途。例如,在客户细分中,将具有相似特征和购买可能性的人分组。一旦你有了分组,你就可以用不同的营销文案对每个分组进行测试,这将有助于你更好地确定未来活动的目标。
好的和坏的:
树状图是 1) 一种简单的方法,通过聚集的方法来聚集数据,并且 2) 帮助更快地理解数据。不需要有一组预定义的聚类,我们可以在数据集中看到所有可能的关联。
然而,树状图的最大问题是 1)可扩展性。拥有包含大量观察值(即 100+或 1000+等)的大型数据集。)根本不会得出结论性的结果。它在计算上是昂贵的,因为一个不良凝聚簇具有 O(n)的时间复杂度。
分层聚类解释
实践教程
以简化的方式说明层次聚类中使用的分析和过程
照片由Unsplash 的 Alina Grubnyak 拍摄
在我们的上一篇关于高斯混合模型(GMM) 的文章中,我们探索了一种基于样本在其特征向量空间中的位置来聚类数据点的方法。在 GMM,基于系统中数据点的分布,我们能够以概率的方式分配每个样本属于每个聚类的可能性。
但是,如果我们不仅仅关注数据点在整个系统中的分布密度,而是想定量估计系统中每个样本之间的关系,并研究系统中每个数据点之间的相关程度,会怎么样呢?为了实现这个目标,在本文中,我们将探索另一种聚类方法,它属于一个完全不同的聚类分析家族,称为层次聚类。
系统树图
层次聚类的唯一概念在于构建和分析树状图。树状图是一种树状结构,它解释了系统中所有数据点之间的关系。
x 轴为数据点,y 轴为聚类距离的树状图(图片由作者提供)
然而,像常规的系谱树一样,树状图不需要从上到下以规则的间隔分支,因为其中的垂直方向(y 轴)以某种度量表示聚类之间的距离。随着您沿着一条路径继续走下去,您会不断地将集群分成越来越小的单元,直到您的粒度级别达到数据样本。在反过来的情况下,当你在向上的方向上移动时,在每一层,你都将较小的集群包含到较大的集群中,直到到达整个系统。因此,层次聚类也被称为聚类的聚类。
遍历树状图时粒度和聚类大小的影响(图片由作者提供)
聚类数
在层次聚类中,在构建树状图时,我们不需要对聚类数做任何假设。一旦构建了树状图,我们就可以水*分割这个结构。在水*切割下形成的所有结果子分支代表系统中最高级别的单个分类,它为每个数据样本定义相关的分类成员。请注意,我们之所以称之为最高级别,是因为即使在您创建了集群之后,您仍然知道后续子集群之间的关系,并且您始终可以选择增加/减少集群的粒度级别。
然而,树状图并不能正确理解放置水*切割后集群的样子。您必须用得到的聚类索引在特征向量空间中单独标记数据点,以便直观地看到聚类的效果。
切片树状图,其结果聚类标记在右侧相应的特征向量空间中(图片由作者提供)
下一个要考虑的问题是你应该在哪里放置水*切口。切片的位置可以通过视觉来决定,甚至可以根据您希望聚类之间的最小距离“y”(y 轴上的切割位置)来决定。
聚类距离为 y1、y2、y3 时的树状图切片可能性(图片由作者提供)
此外,它不是一个约束,你必须在一个恒定的距离切割树状图。基于您试图解决的问题的应用程序和领域知识,树状图可能被不一致地切割。例如,在下面的异常值检测应用程序中,为了分离两个相邻的异常值,水*切割在不同的位置发生变化。
右侧为特征向量空间投影的异常值检测应用程序的可变长度树状图切割(图片由作者提供)
树状图的解释
树状图的每一层对其数据成员之间的关系都有微妙的意义。在一个常规的关系图中,你可以解释为最上面是祖父母或第一代,下一层是父母或第二代,最后一层是孩子或第三代。同样,在树状图的每一个分支过程中,所有具有每一层成员资格的数据点都属于某一类。
然而,为了推断这个类实体,必须仔细检查公式化聚类中每个级别的几个单独的样本,并找出结果聚类中的共同特征。此外,这些推断的类在姐妹分支处不需要相似。例如,在级别 2 中,猫被聚集在大耳朵和*静的行为上,但是狗被聚集在相似的大小属性上。
用户在树状图中推断的数据类别(图片由作者提供)
树状图的构建
既然我们已经理解了什么是树状图,让我们学习如何构建它。有两种方法来构建它。构建它的一种方法是自下而上,从底层开始,不断合并各个数据点和子聚类,一直到顶层。这就是所谓的凝聚集群。
另一种方法是与自顶向下相反的过程,首先将整个系统视为一个集群,然后继续对其进行子集群,直到获得单个数据样本。这个过程被称为分裂聚类。这些方法中的每一种都有单独的算法来实现其目标。
a)聚集聚类
用于执行聚集聚类的最简单和容易理解的算法之一是单链接。在该算法中,我们首先将每个数据点视为一个子聚类。我们定义了一个度量来度量每一步中所有子聚类对之间的距离,并在每一步中保持合并最*的两个子聚类。我们重复这个过程,直到系统中只有一个集群。
b)分裂聚类
用于执行分裂聚类的算法之一是递归 k-means。顾名思义,在每个中间聚类上递归地执行 k-means 过程,直到遇到系统中的所有数据样本或一个聚类中您希望拥有的最小数量的数据样本。在该算法的每一步中,您都必须注意接下来要创建多少个集群。
用黑点表示的数据样本形成聚集/分裂聚类(图片由作者提供)
在这两种聚类方法中,当我们绘制树状图时,我们必须注意两个包含类之间的距离,并且距离尺度的变化保持在树状图的 Y 轴上。
基于聚类距离的树状图中分枝高度的变化(图片由作者提供)
最后,让我们来看看层次集群的优点和缺点。
优势
- 使用分层聚类,您可以创建形状更复杂的聚类,这在 GMM 中是不可能的,并且您不需要对聚类的最终形状做任何假设。
分层聚类形成的复杂结构形状(图片由作者提供)
- 在一次操作中,您可以首先以不同的粒度级别对数据集进行聚类,然后决定您希望在数据集中包含的聚类数量。
- 如果你使用某种类型的闵可夫斯基距离,比如说欧几里德距离来测量你的聚类之间的距离,那么从数学上来说,你的聚类过程会变得非常容易理解。
不足之处
- 当您开始分析树状图并做出决策时,您会意识到层次聚类在很大程度上是由试探法驱动的。这导致过程中的大量手动干预,因此,需要应用程序/领域特定的知识来分析结果是否有意义。
- 尽管层次聚类在数学上很容易理解,但它是一种数学上非常繁重的算法。在任何层次聚类算法中,您必须不断计算数据样本/子聚类之间的距离,这增加了所需的计算量。
- 我们将列出的最后一个缺点是最大的不利因素之一,这就是为什么分层聚类通常被 ML 工程师避开。在我们所有的可视化中,我们已经展示了数据样本非常少的树状图。如果数据样本的数量增加(很可能每次都增加),那么可视化地分析树状图并做出决策就变得不可能了。
在本文中,我们探讨了层次聚类的概念。请在评论区分享你的观点。
人工智能代理引擎的分层有限状态机
原文:https://towardsdatascience.com/hierarchical-finite-state-machine-for-ai-acting-engine-9b24efc66f2?source=collection_archive---------13-----------------------
学习分层有限状态机(HFSM)的细节,它如何解决有限状态机(FSM)中发现的问题,以及它如何与行为树进行比较。
Pacman HFSMs(图片由作者提供)
介绍
实现人工智能代理(如机器人或视频游戏中的角色)正变得越来越复杂,因为它们需要复杂的行为来在动态环境中执行任务。今天,有限状态机(FSM)仍然是模拟人工智能主体行为最常用的算法。
尽管分层有限状态机(HFSM)部分解决了它的缺点,但它易于理解和实现的事实使它成为最常用的算法。
这篇文章将研究 FSM,它的优点和缺点,以及为了减轻 FSM 的一些缺点而开发的 HFSM。
我们在这里的讨论集中在从自动规划和行动的角度来组织我们的人工智能代理的行为 HFSM。
在下面的部分中,我们将研究什么是 FSM 和 HFSM,并将它们用于 Pacman 代理,并将它们与行为树进行比较。
在以前的文章中,我们已经看到了一个更新的,也可以说是更好的方法,行为树。请参见下面链接中的帖子,了解行为树。
在整篇文章中,我们将互换使用这些术语:行为、决策和代理引擎。
分层有限状态机
有限状态机
一个 FSM 或者有时只是简称为简单的状态机是 一个数学计算模型。
它(sigma)由一组有限的状态(S)、转换(gamma)、事件(E)和动作(A)组成。
过渡系统(图片由作者提供)
我们用动作来表示代理人做了什么导致了世界的变化,而事件则用于表示代理人控制之外发生的事情,它们可能是其他代理人的动作或世界动态的一部分。
在实践(实现)中,为了简单起见,我们将事件用于事件和动作。
现在让我们看一个简单的门的有限状态机的例子。我们有两个状态{打开,关闭} ,两个动作/事件{打开,关闭} 和下面的转换。
门 FSM 的过渡(图片由作者提供)
一扇门 FSM(图片由作者提供)
很简单,不是吗?现在让我们看看 FSM 的更多特性。
州
有两种状态,简单状态和复合状态。
简单状态(图片由作者提供)
它可以简单到仅仅是状态的名称,或者用标签来指定在以下时间执行什么动作:
- 进入:进入状态时
- 做:该状态下正在进行的动作
- 退出:退出一种状态时
复合状态是一个包含子状态的状态,我们将在下面关于 HFSM 的章节中讨论。
除了这两种状态之外,还有特殊的状态,或者也称为伪状态,例如初始状态和退出状态。UML(统一建模语言)定义了一些其他的状态,但是对于我们的实现,我们很少使用它们。
过渡
转换表示作为动作/事件被触发的结果,从一种状态到另一种状态的变化。
过渡具有以下属性:
- 触发转换的一组动作/事件
- 发生转换时需要满足的条件
- 转换发生时执行的动作
过渡(图片由作者提供)
只有当事件被触发并且条件被满足时,转换才会发生。
这里需要注意的一点是,当发生转换时,操作的执行顺序是:状态 1 的退出操作、状态 2 的转换操作和进入操作
现在我们来看看 FSM 的优势:
- 它在软件工程中被广泛使用
- 它易于理解和实现
然而,在这个例子中,我们只有两种状态。在实践中,复杂的系统,如人工智能代理引擎,将有更多的状态,这将导致非常复杂的有限状态机,难以维护,容易出现人为错误。下面是有限状态机的缺点:
- 每次我们想要对 FSM 进行更改,比如添加或删除状态,我们都需要重新评估所有相关的转换。这使得维护和扩展变得困难,而维护和扩展是软件工程中的两件重要事情
- 模块化和可重用性问题,很难为其他 FSM 重用一些状态,因为它们可能依赖于一些内部变量
分层有限状态机
HFSM 通过改进以下内容解决了我们在 FSM 中看到的问题:
- 模块化和可重用性
- 层级(顾名思义)结构
HFSM 引入了以下概念:
- 父状态机:一个状态所属的状态机
- 子状态机:一个状态拥有的状态机,当进入该状态时启动,当退出该状态时停止
关于为什么等级制度是必要的一点背景知识。这是因为可以说,我们在生活中所做的几乎所有事情(我们的行动)都是有层次的,它们从一些抽象的东西开始,可以被分解成我们可以执行的更具体的行动。因此,对我们来说更直观的是将一些本质上接*的状态分组到更高级别的状态中,并使用多级 FSM。转换可以发生在 FSM 的所有级别。
AI 智能体的决策组件也是如此。在“行动者对自动化计划和行动的看法:一份立场文件”,马利克、达纳和保罗认为,不管代理的内部架构如何,它都会分层次地查看、准备和执行其行动。
这正是 HFSM 为我们提供的解决我们在 FSM 中发现的问题的方法。
HFSM 让 FSM 对我们来说更直观,更容易理解。
现在让我们看一个例子来理解所解释的内容。
让我们想象一下,我们有一个货运机器人,它配备了一个可以从一个房间移动到另一个房间的手臂,可以携带一块积木。它能够通过抓住石块并将其放在身上来装载石块。它的工作是去积木所在的房间,装上积木,在这个过程中通过躲避障碍物回到原来的位置。FSM 将如下所示:
货运机器人 FSM(图片由作者提供)
可能会有更多的转换和状态,但是这个图对于我们的目的来说已经足够了。如果我们看一下这个 FSM,它对于这个简单的任务来说是不必要的复杂。我们可以看到有两个主要任务:
- 正在向目的地移动
- 以及,加载块
使用这种高级 FSM 将更容易理解:
高级 FSM(图片由作者提供)
HFSM 的图表是这样的:
货运机器人 HFSM(图片由作者提供)
我们可以在多个层次上看到整个系统,在最高层次上它只包含两个状态,在每个状态下它有三个子状态。
现在我们可以看到为什么它是分层的、可重用的和模块化的。子状态机是可以作为软件模块实现的独立状态机。这意味着我们可以很容易地在其他父状态机中使用它,使其模块化和可重用。
我们已经有了足够的概念,现在我们可以在我们的 Pacman 代理上实现它,看看它的表现如何。
“吃豆人”用 HFSM 作为代理引擎
为了完成它的任务,我们的 Pacman 必须以最有效的方式吃掉世界上的所有食物,在这个过程中避免鬼魂,并吃胶囊让鬼魂害怕,这样它就不需要在移动到食物位置时担心它们。
我们设计 FSM 具有以下状态:
- 寻找最*的食物
- 规划路径
- 执行计划路径
- 寻找最*的太空舱
- 还有,避开鬼魂
有限状态机版本
下图描述了 FSM 版本:
Pacman 简单有限状态机(图片由作者提供)
你可能注意到的一件事是我们在美国使用标签。在每种状态下,只要它停留在该状态,您就可以很容易地看到当它进入、退出和执行时采取了什么动作。
一个例子是在规划一条路径状态下:
- 进入此状态将执行“获取目的地”操作
- 在这种状态下,路径规划是异步执行的
- 当路径规划正在进行时离开这种状态将导致它被取消,例如当幽灵在规划时离 Pacman 太*时(因为当它在规划/思考时,幽灵仍在移动)
使用这种 FSM,Pacman 可以很好地完成它的任务,正如你在下面的视频中看到的。
吃豆人与 FSM(视频由作者提供)
HFSM 版本
如果我们使用正确的层次结构,在最高级别我们有三个状态:
- 吃食物
- 东方胶囊
- 躲避鬼魂
这是吃豆人的三个高级状态。只要它在执行任务,它就应该处于这些状态之一。
Pacman 高级 FSM(图片由作者提供)
吃食物和吃胶囊这两种状态可以分解成以下状态机。
吃食物 FSM(图片由作者提供)
食用胶囊 FSM(图片由作者提供)
它们非常相似,都有规划路径和执行规划路径的状态。区别在于它找到食物或胶囊的最*位置的状态。
另一个不同点是,在执行计划的路径进食后,进食 FSM 将重复该过程,而进食胶囊 FSM 将退出。
将这三个 FSM 组合起来,得到下面的 HFSM。
吃豆人 HFSM(图片由作者提供)
我们可以看到,与简单的 FSM 实现相比,这更容易理解,更模块化,更可重用。Pacman 的行为或多或少与 FSM 版本相同,可以在下面的视频中看到。
吃豆人和 HFSM(视频由作者提供)
结论
我们现在已经研究了什么是有限状态机,因为它容易理解,所以被广泛使用。然而,它也有一些缺点:
- 由于许多过渡必须手动设计,因此难以维护和扩展
- 它在模块化和可重用性方面也有问题
分层有限状态机通过引入父状态机和子状态机的概念解决了模块化和可重用性的问题。它还通过使用组件的层次结构帮助我们理解一个更复杂的系统。
与行为树相比
然而,即使有了 HFSM,难以维护和扩展的问题依然存在。正如我们在以前的帖子中讨论的,行为树已经改进了这一点。
的确,我们可以用 HFSM 和行为树来实现一个人工智能代理的决策/执行引擎,但是我认为使用行为树是一个更好的方法。我们可以在下面看到 HFSM 和英国电信为吃豆人制作的图表,以作比较。
Pacman HFSMs(图片由作者提供)
Pacman BTs(图片由作者提供)
我希望这篇文章能让你很好地理解 FSM,HFSM,以及它如何与 BT 相比较,以便你能为你的 AI 代理选择正确的决策或代理引擎。
Python 中的 HFSM 开源
我试图在 Python 中寻找一个好的 HFSM 实现,但找不到,所以我实现了它。我会在我的 Github 上分享,并在下一篇帖子中更新!
分层隐马尔可夫模型
思想和理论
雷·库兹韦尔认为这是大脑皮层结构的*似
在最*的一篇帖子中,著名的未来学家雷·库兹韦尔提到——在他看来——新皮层中的大脑结构在技术上类似于层级隐马尔可夫模型(HHMM)。他还在 2012 年出版的《如何创造思维》一书中详细阐述了这一观点1。
然而不幸的是,这篇文章和这本书都没有足够的信息来详细理解这个机器学习模型,更不用说实现它了。对于任何对意识机器的实现感兴趣的爱好人工智能科学家来说,这是一个遗憾!
因此,让我们利用这篇文章来尝试和理解层次隐马尔可夫模型。我们将对它所构建的大多数概念进行简要的、高层次的介绍,并为实际的实现做好准备(由于篇幅原因,将在另一篇文章中介绍)。
分层隐马尔可夫模型顾名思义是基于隐马尔可夫模型,而隐马尔可夫模型又是基于马尔可夫链,都是随机过程。我们将从最后一个概念开始,并向后追溯。
注意:这是一个关于 HHMM 话题的简单介绍。我们将坚持使用例子和简单的概念,并将数学推迟到后续文章中实现它的时候。
随机过程,简要介绍
如前所述,本文中我们要研究的所有东西都是随机过程。我相信您可能已经知道那是什么,但是因为它是整篇文章的基础,所以让我们再简单地看一下:
维基百科将随机过程非正式地定义为:
随机变量序列
为了理解这意味着什么,想象一个特定类型的随机事件,如天气或掷硬币,按顺序测量或观察,例如每天一次,或连续 10 次。当试图用数学方法描述它时,我们可以利用一个随机过程。我们会简化现实世界的现象,并试图计算未来状态的概率分布。
与统计模型不同的是,这将包括迭代的元素:先前的状态影响当前的观察。今天下雨了吗?那么,根据经验,很有可能明天至少会是多云天气。
另一方面,我觉得这也更类似于我们在心理上构建模型的方式:我们倾向于考虑“如果-x-发生-现在-然后-y-可能发生-以后”类型的模型,而不是考虑输入与输出变量(线性或其他)的*滑函数关系。
例如,代替思考
如果我观察到温度为 ABC,气压为 XYZ,以 UVW 的速率变化,那么在 3 小时 20 分钟内(或多或少 10 分钟),我可以预计降雨强度为 DEF。
我们可能宁愿认为
整天都是阴天,而且似乎越来越暗,越来越冷,所以很有可能很快就会下雨。
这不仅仅是因为我们没有坐下来用温度计、气压计和秒表来预测天气,还因为很难在头脑中建立和使用这种功能模型。我假设这与卡尼曼在“思考,快与慢”[2]中的观点有关,我从中得出结论,我们通常更喜欢使用快速的模式匹配思维,而不是缓慢的分析思维——但我无法为此提供任何科学证据。
无论如何,随机过程的理论比这些例子所暗示的要丰富得多。然而,为了理解 HHMMs,我们现在不需要所有的细节。
基于这些想法,现在理解马尔可夫链几乎是微不足道的——我保证!所以事不宜迟,现在让我们进入下一个话题。
马尔可夫模型和链
以俄罗斯数学家安德烈·马尔科夫命名的马尔科夫模型是一个随机模型(或过程),它具有一个特定的属性——可能有人已经猜到了,叫做马尔科夫属性——要求过程的未来状态只取决于当前状态。
让我们回到天气上,简单地用三种状态(我们每天早上检查的状态)建模:“晴天”、“多云”和“雨天”。现在,通过写下我们在一段时间内的观察结果,并计算“晴”之后出现“多云”的频率,我们可以创建一个与此类似的模型:
一个简单天气模型的状态转移概率图。请注意,从一个状态到另一个状态的所有转换仅取决于当前状态,它们的概率总和为 100%。(图文由作者提供)
这样,我们定义了一个简单的马尔可夫链。也就是说,我们包括了建模系统的简化状态及其转移概率。这也清楚地显示了马尔可夫性质:概率仅依赖于当前状态。
让我们再坚持这个概念一会儿,看看另一个例子:简化的文本生成。
我们可以将文本视为单词(和标点符号)的序列,其中某些单词的组合比其他组合更有可能出现,即一些单词比其他单词更有可能一个接一个出现。在某种程度上,这可以通过简单地读取样本文本并计算单词到单词的出现次数来用马尔可夫链来表示。(这里:赫尔曼·梅尔维尔的《莫比·迪克》的开头)
叫我 以实玛利。几年前——不要管具体是多久——我的钱包里很少或没有钱,在岸上也没有什么特别感兴趣的东西,我想我应该航行一段时间,看看世界上的水上部分。
- 调用 → me (100%)
- me→Ishmael(50%)
- me → on (50%)
- …
诸如此类。这也可以扩展到几个单词,即在两个或多个单词组合后找到下一个单词(也分别称为 2-grams 或 n-grams )。
这不仅允许我们建立一个研究文本的随机模型,我们还可以用它来生成更多类似的文本:从一个随机的起始单词开始,然后根据记录的概率选择下一个单词。
隐马尔可夫模型
为了建立前面讨论的马尔可夫链,我们需要能够直接观察状态的出现。继续上一个例子:为了创建词到词的概率模型,你需要读入大量的文本,即大量的词到词对。
但是世界上的很多事情都是无法直接观察到的,我们只能通过观察这些‘隐藏’状态有哪些可测量的影响来估计正在发生的事情。
回到天气的例子,你可以想象站在室内透过窗户向外看,试图判断天气是否冷到可以穿外套、戴帽子和手套,或者你是否可以只穿毛衣就出门。如果你没有温度计,感觉不到温度,你仍然可以通过观察它的影响来推理:例如,其他人穿什么或者外面是否有雪和霜。
对这些不可观察的过程及其影响进行建模就是隐马尔可夫模型的目的。直观地说,根据我们之前所学的,它们的核心是一个马尔可夫链,包含状态和概率转移。现在的问题在于,系统的这些状态是不可观察或测量的,这使得我们没有简单的方法来直接计算转移概率。然而,除此之外,我们还可以测量国家造成的其他影响。这些影响本身是随机的。
让我们再来看看天气以及它可能对世界产生的潜在影响:
具有影响及其概率的‘隐藏’马尔可夫链的状态转移图。请注意,一个状态可能具有一个以上的可观测效应,这导致了状态不能从观测值直接推断的问题。(图文由作者提供)
在这个例子中,我们同样有三种潜在的天气状态(有点简单,但是很好)。然而,这一次我们也展示了它们对世界的可观察到的影响(在这种情况下,人们穿着什么)以及看到它们的概率。
注意,马尔可夫链在概念上也可以建模为 hmm。如果每种状态只能确切地产生一个观察结果(100%的时间),那么我们又回到了更简单的马尔可夫链模型。
典型应用
像这样的模型通常以两种不同的方式用于预测:
- 1.估计某个观察序列的概率。例如:观察穿“毛衣”→“雨衣”→“毛衣”→“雨衣”的可能性有多大?我想这也取决于你是否在英国…
- 2.基于一系列的观察,尝试估计它产生的状态序列。例如,如果你看到“t 恤”→“毛衣”→“t 恤”,世界的状态很可能是“晴朗”、“晴朗”、“晴朗”。不错!
也就是说,如果您已经创建了模型并推断出了它的参数。如果这还没有完成,您将面临另一个挑战:
- 3.给定一个模型结构(即状态、转换和效应)和一系列观察序列,尝试找出所有“箭头”最可能的概率。也就是说,训练模型。
最后但同样重要的是,一个很少提及的用途是数据创建:
- 4.使用现有的训练模型和起始状态(也基于模型参数选择)来迭代模型的状态。根据模型中记录的概率选择下一个状态(和输出)。
不言而喻,所有这些问题都已经解决了很多年,公式也是众所周知的。我们将在实现它们时更详细地讨论它们。
分层隐马尔可夫模型
到目前为止,我们只看了一些天气状态的非常简单的 HMM。这很简单,但是很清楚地说明了模型的要点。让我们对 Fine 等人在 1998 年的论文[3]中描述的分层隐马尔可夫模型做同样的事情。
正如我们已经看到的,hmm 可以理解为状态的有向图,其中每个状态都是可到达的。从某种意义上来说,分级版本更受限制,同时也更复杂。(实际上,[3]的作者还提到,HHMM 可以表示为全连接的 HMM,其缺点是失去了层次结构的语义,正如我们将看到的)。
那么什么是层次隐马尔可夫模型呢?简单地说,顾名思义,分层 HMM 为隐藏状态添加了一个树状层次结构。
它从代表顶层(或第一层)的根节点开始,该层具有到第二层状态的每个状态的可能状态转换。第二层本身的结构类似于马尔可夫链,即状态之间有转换。然而,该层中的每个状态都可以是另一个 HHMM 的根节点。
这样循环下去,直到我们到达叶节点,称为生产状态,其行为类似于“正常”HMM 状态,因为它们输出单个观察或符号。它们也是相互关联的。
每一层都有最后一个特殊的“结束”状态,当到达该状态时,会自动(100%可能)跳回到上一层的父状态。
就顺序而言,状态转换首先深入。然后,当信号通过较低级别的结束状态返回时,同一级别的其他状态被激活。使用这种结构,非生产状态没有直接分配的输出。然而,它们的输出隐含地由较低级别的生产状态的输出序列来描述。
为了说明这一点,可以把生产节点想象成文本中的字母或字符。然后,更高级别的节点可以逐步表示音节、单词、单词组合、句子等等。这就是这里的层次结构的本质:它用于表示简单概念的抽象。
前面提到的论文使用该方法在英语文本语料库上训练该模型,该模型很好地展示了该思想。让我们用这个例子来描绘这样一个网络的一部分可能是什么样子:
简化分层隐马尔可夫模型中的状态转移和示例路径。这里,我们展示了从字母或字母组合到短词再到句子的各个部分的文本生成。概率不包括在内,以提高易读性。(图文由作者提供)
在上面的例子中,我们跟踪了一个生产路径,从根节点通过第二层向下到生产状态,生产状态将输出字母(或字母组合)。
每个向下的灰色箭头都是一个“垂直”过渡,如果可能的话,将在考虑任何黑色“水*”箭头之前进行。这意味着一个状态的灰色箭头和黑色箭头的概率总和必须分别为 1。
用红色标记的部分路径将产生单词“The ”,作为第二级激活状态的隐含输出。然后,这种产生可以继续通过第二层的其它状态,直到它最终跳回到根节点,并且完成字符的发射。
与人类大脑的关系
根据 Kurzweil 的说法,这些模式匹配器和/或输出生产者的层次结构是我们如何在概念层面上描绘人类新大脑皮层的结构1。这是我们大脑中承担复杂任务的部分,如语言理解和生产。
在文本生成模型中,层级越高,输出就越复杂。最低级别的生产状态将生成一些单个字母,而在根节点级别,我们可以期望看到完整的句子。
Kurzweil 提到在新大脑皮层中也有类似的层级。他们处理语言处理,从单词的一部分到最高层的幽默和讽刺的概念。这种相似性是他建议 HHMMs 作为有意识思维建模的可能基础的原因。
使用
一般来说,HHMMs 和 hmm 都用于类似的领域:顺序数据不能直接记录,但其他数据可以直接记录的地方。那么,这个模型的目的就是从记录的任何其他效应中推断出实际的数据。
一个非常著名的例子是语音识别和语音合成(实际上从 20 世纪 70 年代开始)。在那里,使用傅立叶变换分析短的声音序列,并将其“翻译”成最可能的音素,并在更高的层次上翻译成已知词汇表中的单词。
从那时起,这些算法不断改进,现在我们可以在移动设备上使用 Siri 或 Alexa 等语音助手。
对于更多的灵感,维基百科有一个更长的应用列表。
限制
拓扑。正如 Kurzweil 在文章中提到的,到目前为止,我们希望提前知道网络的拓扑结构是什么样的(即有多少内部状态和级别,以及状态是如何连接的)。有了这些信息,我们就可以使用上述算法来训练模型,并从中提取有用的信息。
但是这种网络拓扑的前期知识很少存在。例如,我们必须如何构建网络才能正确地生成一定长度的英语句子?即使没有分配概率,这也是一项极其困难的任务。
文献[3]作者的实验表明,层级结构的微小变化会对网络的语言分析能力的质量产生相当大的影响。
一种用于语音识别的解决方案是,开始创建只能识别单个单词的小部分网络,并将这些网络聚合成一个更大的模型。
Kurzweil 还提到了一种基于遗传算法的改进网络拓扑的方法,我认为这只是许多可应用的优化技术之一。
状态空间。在我们看到的例子中,状态空间以及可能输出的空间都是离散且有限的。这意味着我们在前面提到的网络拓扑中有一组状态和观察值。
我不确定 HHMMs 是否可以推广到更广的范围,但是 hmm 在一定程度上显然可以。例如,可以假设一个连续的状态空间(想想:实数,例如在多维向量中指定一个状态)。
这似乎与 Kurzweils 的模拟大脑部分的想法无关,所以我们不会详细讨论这部分。
转移和输出概率。这些模型的另一个限制来自马尔可夫属性本身:由于概率是静态的,并且只取决于当前状态,因此没有办法将依赖于时间的上下文信息包括到模型输出中。
这对于使用 HHMM 或 HMM 的文本生成来说将是特别有趣的,因为它将使我们能够学会对外部刺激做出“响应”。
例如,想象一下,您有一个巨大的 HHMM,可以生成关于各种主题的复杂文本。如果你想在一个对话界面中使用这个模型(比如说一个聊天机器人),能够学习根据用户的要求用什么来响应将会很棒。有趣的是,这已经在所谓的输入/输出 hmm[4]中进行了探索。
后续步骤
如前所述,我将根据[3]中的研究,用一篇更具技术性的文章来阐述 HHMM 的实现,从而继续这个主题。我的希望是复制(在一篇教程风格的文章中)他们在自然语言分析上的一些结果。在最好的情况下,我们可以看到如何将样本文本映射到一些好的层次级相关抽象上。
与此相关的所有完成的源文件、笔记本和代码也可以在 Github 上获得。请留下反馈并提出改进建议。
如果你想支持这篇和类似精彩文章的创作,你可以注册一个中级会员和/或关注我的账户。
1 R. Kurzweil,“如何创造思维:揭示人类思维的秘密”(2012),企鹅出版社
[2] D .卡尼曼,《思考,快与慢》(2011),麦克米伦出版社
[3] S. Fine、Y. Singer 和 N. Tishby,“分层隐马尔可夫模型:分析和应用” (1998),机器学习 32.1(第 41-62 页)
[4] Y. Bengio 和 P. Frasconi,“输入输出 HMM 架构” (1995),神经信息处理系统的进展(第 427-434 页)
分层线性建模:逐步指南
原文:https://towardsdatascience.com/hierarchical-linear-modeling-a-step-by-step-guide-424b486ac6a3?source=collection_archive---------1-----------------------
入门
利用 R 进行混合模型分析
在大多数情况下,数据往往是聚集的。分级线性建模(HLM)使您能够探索和理解您的数据,并降低 I 型错误率。本教程用 R 来演示 HLM 在社会科学研究中的基本步骤。
鸣谢:【https://pixabay.com/users/geralt-9301/】T2 来自 Pixabay
在开始分析之前,让我们先简要谈谈什么是 HLM。
HLM(又名多层建模)分析以有组织的模式聚集的数据,如各州的大学、科技公司的非白人男性和医院的诊所。HLM 是一个普通的最小二乘法(OLS ),要求满足所有假设(查看我的教程OLS 假设和数据筛选),除了误差假设的独立性。这一假设很可能被违背,因为 HLM 允许跨集群的数据相互关联。
HLM 的预测因子可以分为随机效应和固定效应。随机效应指的是不是研究的主要焦点,但可能影响因变量,因此需要包括在模型中的变量。另一方面,固定效应是这项研究的关键预测因素。例如,一位心理学家想要预测童年的不利创伤对一个人成年后发展为边缘型人格障碍(BPD)的趋势的影响。参与者来自集体主义和个人主义文化,这两种文化可能对父母的行为有不同的定义。个人主义文化中的人,如美国或英国的人,可能会认为父母打屁股是虐待,而集体主义者,如亚洲人和非洲人,可能会认为打屁股是加强孩子纪律的一种方式。因此,来自不同文化的参与者可能在童年时期受到来自其父母的相同行为的不同影响,并且可能在不同的水*上发展出 BPD 症状。根据这个例子,童年创伤被视为基于人格文学和研究者作为心理学家的兴趣的固定效应。文化可以被视为随机效应,因为这一变量可能会影响边缘型人格的发展,但不是研究的主要焦点。值得注意的是,随机效应应该是分类的,而固定效应可以是虚拟变量(具有两个水*的分类变量)或连续变量。
你们中的一些人可能会想,为什么我们不使用一个单一水*的回归模型来控制潜在的随机效应(例如,根据上述例子的文化)?这样做可能会引入错误的标准误差估计,因为残差(即同一组中的观察值)往往是相关的。例如,来自相同文化的人可能以相同的方式看待一种行为。单水*模型的误差项代表跨水*的聚类数据误差,限制了我们在控制参与者嵌套的文化后,了解关键预测因子(如童年创伤)对一个人发展 BPD 倾向的影响。
还在迷茫?让我们看看下面的等式:
易=β0+β1xi+ei一元回归模型— (1)
yij=β0+uj+*eij一个方差分量模型——(2)*****
yij=β0+β1xij+uj+eij混合模型(带随机截距)——(3)**
i 是观察的数量(例如,参与者#1、#2、#3..).
j 是每个观察所属的文化的范畴(即 j = 1 是集体主义,j = 0 是个人主义)。
β1 是不良童年创伤
y 是 BPD 倾向。
u 是无法用文化解释的 y 方差,控制其他预测因子。
e 是 y 的方差,它不能通过控制其他预测因子的童年创伤来解释。
根据等式 1,误差项( ei )表示未被关键独立变量(例如,童年创伤)解释的结果方差。等式 2 显示了两个误差项,包括随机效应的误差项( uj )(即文化)和嵌套在随机效应中的固定效应的误差项( eij )(不同文化中的童年创伤评分)。等式 3 表示整合了等式 1 和等式 2 的混合模型,相对于等式 1 中的单级回归模型,说明了更精确的误差估计。
现在你已经有了一些 HLM 的基础,让我们在分析之前看看你需要什么。
- 长格式数据:数据通常以宽格式组织(即每列代表一个变量,每行描述一个观察)。您需要将数据转换为长格式(例如,案例的数据分布在各行中。一列描述变量类型,另一列包含这些变量的值)。查看这篇教程,了解如何将数据从宽格式转换为长格式。
- 用于线性和非线性模型测试的 R 包 : nlme
*install.packages("nlme")
library(nlme)*
个案研究
本教程使用了一个虚构的数据集。我们将研究一个人的自恋是否能预测他们对亲密关系的满意度,假设自恋症状(例如,自恋、说谎、缺乏同理心)会随着不同生活事件发生的时间而变化。因此,固定效应是自恋型人格障碍的症状(NPD)。结果变量是一个人的亲密关系满意度(满意度)。随机效应是时间,三个等级编码为 1(婚前),2(婚后 1 年),3(婚后 5 年)。
分析前步骤
第一步:导入数据
*#Set working directory
setwd("insert your file location:")
#import data
library(foreign)
data<-read.spss("HLM.sav(your data name)," use.value.label = TRUE, to.data.frame = TRUE)*
第二步:数据清理
本教程假设您的数据已经被清理。如果您想了解更多关于清理数据的信息,请查看我的数据准备教程。对于我当前的数据集,所有的假设,除了误差的独立性,都符合 HLM 要求。
HLM 分析步骤
步骤 1 :仅拦截型。
仅截距模型是 HLM 的最简单形式,建议作为添加任何其他预测项之前的第一步。这种类型的模型测试使我们能够了解在不考虑其他预测因素的情况下,结果变量得分(即本教程中的关系满意度)是否明显不同于零(即参与者表示了特定的关系满意度)。对于 OLS 模型,截距也称为常数,在仅截距模型中,截距是结果变量的*均值,如下式所示:
作者图片
我们将使用 gls 函数(即广义最小二乘法)来拟合线性模型。gls 函数使误差相互关联并具有不同种类的方差,这很可能是聚类数据的情况。我将我的“仅拦截”模型标识为“模型 1”
*model1=gls(Satisfaction~1, data = data, method = "ML," na.action = "na.omit")
summary(model1)*
结果如下:
*Generalized least squares fit by maximum likelihood
Model: Satisfaction ~ 1
Data: data
AIC BIC logLik
6543.89 6555.678 -3269.945Coefficients:
Value Std.Error t-value p-value
(Intercept) 5.087982 0.01582679 321.479 0Standardized residuals:
Min Q1 Med Q3 Max
-4.9894040 -0.5142181 0.0960345 0.7644064 1.1131222Residual standard error: 0.8193328
Degrees of freedom: 2681 total; 2680 residual*
p 值显著,表明参与者的关系满意度与零显著不同。
第二步:随机截距模型。
这一步添加了我的随机效应(即时间),以查看相对于之前的仅截距模型(模型 1),预测值是否增加了我的因变量中解释的显著方差。
从统计学的角度来说,如果你还记得前面的等式,单截距模型整体回归的截距仍然是 β 0。但对于每组随机效应(即婚后的每个时间点),截距为 β 0+ uj (当 uj 表示因变量的误差未被时间解释时)。
为了测试随机截距模型,我将使用 lme 函数作为上述 gls 函数之外的替代方法。像 gls 一样,lme 函数用于测试线性混合效应模型,允许嵌套随机效应和组内误差之间的相关性。lme 和 gls 都支持最大似然应用。
在将时间作为随机效应包括在内之前,请确保变量是明确的:
*is.factor(data$Time)
[1] FALSE*
输出显示“false”,因此我需要将时间转换为分类变量。
*data$Time = as.factor(data$Time)#Check again whether Time is categoricalis.factor(data$Time)[1] TRUE*
模拟随机截距;
*model2 = lme(Satisfaction~1, data = data, method = “ML”, na.action = “na.omit”, random = ~1|Time)summary(model2)*
结果是:
*Linear mixed-effects model fit by maximum likelihood
Data: data
AIC BIC logLik
6533.549 6551.231 -3263.775Random effects:
Formula: ~1 | Time
(Intercept) Residual
StdDev: 0.06596515 0.8165719Fixed effects: Satisfaction ~ 1
Value Std.Error DF t-value p-value
(Intercept) 5.092783 0.04124424 2678 123.4786 0Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-5.0747125 -0.4169725 0.1953434 0.6985522 1.2158700Number of Observations: 2681
Number of Groups: 3*
现在,你可能想知道我如何知道我的随机效应(即时间)是否显著。有几种方式来看待这个问题。
- 比较仅截距模型(模型 1)的 AIC 和随机截距模型(模型 2)的 AIC。 AIC = 2k — 2(对数似然),当 k 为模型中包括截距在内的变量个数时),对数似然为模型拟合测度,可从统计输出中获得。从 Satisticshowto 查看这些有用的信息。
从我的模型 1 和模型 2 的输出,你会看到模型 1 的 AIC = 6543.89,模型 2 的 AIC = 6533.549。通常,两个 AIC 值相差超过 2 表示模型拟合有显著差异。AIC 值越低,模型越适合。你可以看到在模型 2 中把时间作为随机效应包括进来改进了我的模型 1 (6543.89 -6533.549 > 2)。
2.除了 AIC,我们还可以使用 ANOVA 函数来比较仅截距模型和随机截距。
*anova(model1, model2)*
结果如下:
*Model df AIC BIC logLik Test L.Ratio p-value
model1 1 2 6543.890 6555.678 -3269.945
model2 2 3 6533.549 6551.231 -3263.775 1 vs 2 12.34079 4e-04*
p 值 4e-04 等于 4 x 10^-4,表明结果非常显著。因此,添加随机截距显著改进了仅截距模型。
除了 nlme 包中的 gls 和 lme 函数,我们还可以使用 lme4 包中的 lmer。一般来说,lme 和 lmer 都是混合数据分析的有效函数,但需要考虑一些差异:
- lmer 不像 lme 那样分析一些相关结构。
- nlme 是一个更大的工具包,他们关于混合模型的代码更容易理解。
- nlme 可以用来定义交叉随机效应,比 lme 更容易和更快。
- 由 nlme 软件包(例如 lme 和 gls 函数)和 lme4 软件包(例如 lmer 函数)拟合的模型假定抽样方差是已知的。
简单地说,对于简单的 HLM 分析,lme4 和 nlme 都应该提供相*的参数值。你可以查看这一页来比较这些包装。
如果你想尝试 lme4,你需要先安装 merTools :
*install.packages(“merTools”)
library(lme4)
library(merTools)*
让我们使用 lme4 的 lmer 来运行我们的随机截距模型
*model2.1<-lmer(Satisfaction~1+(1|Time), REML = FALSE, data = data)
summary(model2.1)*
结果:
*Linear mixed model fit by maximum likelihood ['lmerMod']
Formula: Satisfaction ~ 1 + (1 | Time)
Data: dataAIC BIC logLik deviance df.resid
6533.5 6551.2 -3263.8 6527.5 2678Scaled residuals:
Min 1Q Median 3Q Max
-5.0747 -0.4170 0.1953 0.6986 1.2159Random effects:
Groups Name Variance Std.Dev.
Time (Intercept) 0.004351 0.06597
Residual 0.666790 0.81657
Number of obs: 2681, groups: Time, 3Fixed effects:
Estimate Std. Error t value
(Intercept) 5.09278 0.04124 123.5*
可以看到模型 2 (lme4)和模型 2.1 (nlme)的参数相当接*。
我们还可以运行 ICC(又名组内相关系数)来查看组内观察结果的相关性(例如,在我的案例中,每个时间点内的关系满意度)。ICC 指数范围从 0 到 1,数值越大表明组内同质性越高(Gelman & Hill,2007)。
*ICC(outcome = “Satisfaction”, group = “Time”, data = data)
[1] 0.01019326*
你可以看到我的 ICC 值大约是. 01,说明嵌套在一个时间点内的参与者的关系满意度彼此差异很大。
在进入下一个 HLM 分析步骤之前,我想确保我的固定效应回归系数是准确的。为此,我将使用 confint 请求 95%的置信区间(CI)。
如果您不熟悉 CI,该术语指的是一系列值,可能包括具有一定置信百分比范围(通常为 95%)的真实总体参数。公式是
作者图片
x 条是样本*均值
z 是置信水*值
n 是样本大小
s 是样本 SD
假设 95%的 CI 包含两个端点。我们可能会设置一个 1%的下限,这意味着真实总体参数低于我们数据得分的 1%限制的概率仅为 1%。我们还可以设置一个 96%的上限,这意味着真实总体参数超出我们数据得分的 96%限制的概率仅为 4%。上限和下限一起表示我们将发现真实总体参数超出我们设置的范围(1% — 96%)的区间或概率是 5% (1% + 4%)。因此,我们有 95%的置信区间,真实参数将在样本的上限和下限范围内。如果您想了解更多关于 CI 及其与 t 分布的关系,请查看此链接。
现在,的置信水*不同于的置信区间。如果我们多次重新运行一项研究,并以 95%置信区间估计一个感兴趣的参数,我们每次都会得到不同的 95%置信区间值,这是由于我们的数据中存在误差,这些误差可能是由多种因素造成的,例如参与者的因素、测量误差、我们每次分析时的情绪。然而,那些不同 CI 值的 95%将覆盖真实参数值,这个概念就是置信水*。如果我们将置信水*的下限设置为 1%,这意味着在我们重复进行的许多实验中,只有 1%的实验的真实参数值低于 1%的限制。如果我们设置一个 96%的上限,我们将发现高于上限的真实参数值的概率是我们重复进行的几次实验的 4%。**
由于人类喜欢对称的东西,所以人们经常将 95%的置信区间设定为下限 2.5%和上限 97.5%。在 2.5%的重复研究中,真实总体参数值将低于该区间,而在另外 2.5%的重复研究中,真实总体参数值将高于该区间。因此,在所有进行的研究中,置信水*将覆盖 95%的真实参数。
让我们回到我们的例子。如果我想知道模型 2.1 的置信水*,我将使用下面的代码。
*confint(model2.1)*
结果:
*2.5 % 97.5 %
.sig01 0.0267156 0.2084871
.sigma 0.7951820 0.8389382
(Intercept) 4.9785129 5.2081911*
结果表明,如果我重新运行我的研究几次,95%的情况下,截距系数(即,考虑时间随机影响的人群中关系满意度的真实*均值)将大约在 4.98-5.21 之间。
第三步:随机截距模式中的固定效果
由于我主要对 NPD 的固定效应感兴趣,我将在我的随机截距模型(模型 2 或模型 2.1)中包括预测值。我仍然让截距变化,这意味着每个时间点可能有不同的关系满意度得分截距。为了在随机截距模型中生成固定效果,我将使用 nlme 包中的 lme()。
*model3 = lme(Satisfaction~ NPD, data = data, method = “ML”, na.action = “na.omit”, random = ~1|Time)
summary(model3)*
结果:
*Linear mixed-effects model fit by maximum likelihood
Data: data
AIC BIC logLik
6468.46 6492.036 -3230.23Random effects:
Formula: ~1 | Time
(Intercept) Residual
StdDev: 0.07411888 0.8063175Fixed effects: Satisfaction ~ NPD
Value Std.Error DF t-value p-value
(Intercept) 4.672165 0.06842444 2677 68.28210 0
NPD 0.122980 0.01491822 2677 8.24362 0
Correlation:
(Intr)
NPD -0.746Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-5.0666244 -0.4724214 0.1792983 0.7452213 1.6161859Number of Observations: 2681
Number of Groups: 3*
固定效应是显著的。我们来比较一下固定效应的随机截距模型(模型 3)是否优于随机截距模型(模型 2)。
*anova(model3, model2)*
结果:
*Model df AIC BIC logLik Test L.Ratio p-value
model3 1 4 6468.460 6492.036 -3230.230
model2 2 3 6533.549 6551.231 -3263.775 1 vs 2 67.0889 <.0001*
结果显示了两个模型之间的显著差异,表明添加固定效应显著改善了随机截距模型。
步骤 3 中模型拟合的替代方法是使用 lmer 函数:
*model3.1 <-lmer(Satisfaction~1+NPD+(1| Time), REML = FALSE, data = data)
summary(model3.1)*
结果:
*Linear mixed model fit by maximum likelihood ['lmerMod']
Formula: Satisfaction ~ 1 + NPD + (1 | Time)
Data: dataAIC BIC logLik deviance df.resid
6468.5 6492.0 -3230.2 6460.5 2677Scaled residuals:
Min 1Q Median 3Q Max
-5.0666 -0.4724 0.1793 0.7452 1.6162Random effects:
Groups Name Variance Std.Dev.
Time (Intercept) 0.005494 0.07412
Residual 0.650148 0.80632
Number of obs: 2681, groups: Time, 3Fixed effects:
Estimate Std. Error t value
(Intercept) 4.67216 0.06840 68.308
NPD 0.12298 0.01491 8.247Correlation of Fixed Effects:
(Intr)
NPD -0.746*
可以看到,lme 和 lmer 函数的参数估计值非常接*。
第四步:添加随机斜率项。
在 HLM,添加随机斜率允许随机效应组的回归线在斜率系数方面有所不同。在我的案例中,一个人的 NPD 和结果(关系满意度)在不同时间水*上的斜率可能会有所不同,因为人们的 NPD 症状可能会在不同时间点减弱或增强,这取决于他们的生活事件。为了测试这一假设,我将把 NPD 特质按时间嵌套,并允许 NPD 和关系满意度的斜率在不同的时间水*上变化。
*model4= lme(Satisfaction~ NPD, data = data, method = “ML”, na.action = “na.omit”, random = ~NPD|Time, control = lmeControl(msMaxIter = 200))
summary(model4)*
结果:
*Linear mixed-effects model fit by maximum likelihood
Data: data
AIC BIC logLik
6472.46 6507.823 -3230.23Random effects:
Formula: ~NPD | Time
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 0.072374062 (Intr)
NPD 0.002428596 0.131
Residual 0.806315723Fixed effects: Satisfaction ~ NPD
Value Std.Error DF t-value p-value
(Intercept) 4.672058 0.06779927 2677 68.91016 0
NPD 0.123021 0.01498469 2677 8.20977 0
Correlation:
(Intr)
NPD -0.742Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-5.0663508 -0.4722466 0.1806865 0.7456579 1.6137660Number of Observations: 2681
Number of Groups: 3*
输出表明时间截距的变化符合 0.0724 的较大 SD。预测关系满意度的 NPD 斜率的变化符合 0.0024 的较小 SD。结果表明,参与者的关系满意度在不同时间水*上的差异可能比每个时间点内 NPD 症状的严重程度更大。
弱正相关(Corrr=0.131)意味着截距的更正值与斜率的更正值稍微相关。如果参与者的截距增加一个标准差单位,斜率只会增加 0.131 个标准差。换句话说,关系满意度的截距随时间明显不同,而 NPD 和关系满意度之间的相关性斜率的变化更微妙。因此,模型 4(添加随机斜率项)很可能不会显著改善模型 3(随机截距模型)。让我们测试一下这个假设。
*anova(model3, model4)*
结果:
*Model df AIC BIC logLik Test L.Ratio p-value
model3 1 4 6468.46 6492.036 -3230.23
model4 2 6 6472.46 6507.823 -3230.23 1 vs 2 0.000787942 0.9996*
正如预期的那样,添加随机斜率项不会显著改善随机截距模型并增加 AIC 值(即更差的拟合)。是否排除随机斜率项取决于几个因素,例如为您的数据提供信息的理论,排除或包括随机斜率是否会使模型收敛,以及您是否希望得到一个最节省或最大的模型。这完全取决于你的决定和学习领域。这篇文章提供了更多关于随机效应的细节,值得一读。
附加步骤:
如果您有一个交互项,您可以测试添加该交互项是否会改进您的模型。我将测试是否添加边缘型人格障碍特征(BPD),它与 NPD 高度共病,作为一个调节子将改善我的随机截距模型(模型 3)。我选择忽略随机斜率模型(model4 ),因为这个术语并没有改进模型,而且研究认为 NPD 特征可能不会随着时间点而改变。
*model3withBPD<-lme(Satisfaction~NPD+BPD+BPD*NPD,
data = data, method = “ML”, na.action = “na.omit”, random = ~1|Time)
summary(model3withBPD)*
结果:
*Linear mixed-effects model fit by maximum likelihood
Data: data
AIC BIC logLik
6425.735 6461.098 -3206.867Random effects:
Formula: ~1 | Time
(Intercept) Residual
StdDev: 0.07982052 0.7992555Fixed effects: Satisfaction ~ NPD + BPD + BPD * NPD
Value Std.Error DF t-value p-value
(Intercept) 4.443310 0.09474416 2675 46.89799 0
NPD 0.153825 0.02988573 2675 5.14709 0
BPD 0.017154 0.00251750 2675 6.81408 0
NPD:BPD -0.003436 0.00058873 2675 -5.83621 0
Correlation:
(Intr) NPD BPD
NPD -0.807
BPD -0.417 0.251
NPD:BPD 0.600 -0.578 -0.907Standardized Within-Group Residuals:
Min Q1 Med Q3 Max
-5.2024359 -0.4590723 0.1866308 0.7317000 1.8891006Number of Observations: 2681
Number of Groups: 3*
相互作用项是重要的。我们将看到添加交互是否会改进模型 3:
*anova(model3, model3withBPD)*
正如所料,添加交互项显著改进了我的仅随机截距模型:
*Model df AIC BIC logLik Test L.Ratio p-value
model3 1 4 6468.460 6492.036 -3230.230
model3withBPD 2 6 6425.735 6461.098 -3206.867 1 vs 2 46.72568 <.0001*
我希望到现在为止,你已经知道如何指挥简单的 HLM 了。请继续关注未来更复杂的 HLM 分析。
有关本教程中使用的完整代码,请参见以下内容:
使用 PyTorch 中预先训练的卷积神经网络从胸部 X 射线图像进行高精度 Covid 19 预测
原文:https://towardsdatascience.com/high-accuracy-covid-19-prediction-from-chest-x-ray-images-using-pre-trained-convolutional-neural-2ec96484ce0?source=collection_archive---------5-----------------------
利用 Efficientnet 架构在与 Covid19 相关的医学成像数据集上实现 99%以上的预测准确率
在这篇文章中,我将分享我开发卷积神经网络算法的经验,以高精度从胸部 X 射线图像预测新冠肺炎。我在参加深度学习博士课程的课堂 Kaggle 竞赛时开发了这个算法。我很高兴从最终的比赛排行榜中得知 我在比赛 中在 40 名参赛的统计学和计算机科学系的博士和硕士研究生中名列第一!我将提及我在开发和训练模型时所面临的挑战,以及我如何找到解决这些挑战的方法,而不是直接讨论结果。在研究这个问题的时候,我亲身体验了“享受过程,结果会自然发生”这句话的道理!
你可以在 GitHub 这里找到我的完整代码。
挑战简介
给定一幅输入的胸部 x 光图像,算法必须检测该人是否感染了新冠肺炎病毒。我们有一组受监督的 X 射线图像,已经由放射科医生仔细标记,模型必须在这些图像上进行训练。这种模型可以帮助卫生保健专业人员比放射科医师更快地诊断新冠肺炎病例,尤其是在需要在短时间窗口内对大量人员进行测试的情况下,放射科医师必须逐个进行每次扫描。
我们举个例子。下面的图片来自竞赛网站,分别是没有(阴性)和有(阳性)新冠肺炎的人。
没有(左)和有(右)新冠肺炎的人的胸部 x 光照片(来源:竞赛网站:https://www.kaggle.com/c/stat946winter2021/overview)
数据集描述
训练数据集由 15264 幅(512×512 像素)图像组成,这些图像已经由放射科专家分类。测试数据集由来自相同分布的 400 个这样的图像组成。你可以在这里找到数据集。
我发现训练数据集明显不*衡,大约 90%的图像属于非 Covid 类。显著不*衡集合的问题是,即使简单地输出多数类的类作为输出的朴素学习算法也将获得高精度。换句话说,它会将每个人标记为无 Covid,并达到 90%的“准确率”,即使大约 10%的人实际上有 Covid。最初,我从不*衡的训练数据集开始。事后看来,这并不是最好的起点,但我们必须从自己拥有的东西开始,在这种情况下,就是训练数据集。我将在本文后面更详细地描述它。
攀登绩效阶梯——步骤和失误
深度学习算法有许多活动的部分,我发现训练一个高性能的模型既是一门艺术,也是一门数学。一个人在开始时并不知道大多数答案,必须通过实验来学习。
我现在将描述我是如何选择每个超参数的,以及我在这个过程中学到了什么。
学习率:学习率越低,收敛越好,但不一定测试精度最好。问题可能是算法还没有学习到导致测试集的最低误差的权重集。另一方面,较高的学习速率会导致算法超过最优的权重集。我试验了 10e-3、10e-4 和 10e-5 的学习率,发现 10e-4 导致测试数据集的错误率最低。
批处理大小:在将批处理大小增加到 256 甚至减少到 64 时,我遇到了内存问题,因此不得不选择更小的批处理大小。我用 32 和 16 做实验。在这两个批量中,32 的批量导致最低的错误率,学习率为 10e-4。在这篇论文中,我们已经很好地探讨了学习速度、批量大小和准确性之间的相互作用。作者为 VGG16 CNN 实验了各种学习速率和批量大小。我从一个较低的学习速率(lr = 0.0001 as aginst 0.001)开始,后来证明这是一个更好的选择,并根据经验将批量大小设置为 32,这在深度学习实践中很常见。我感谢作者让我从他们的研究中得到的线索。
像深度学习这样的复杂领域从来都不是孤狼式的努力,我们都站在彼此的肩膀上,而不仅仅是巨人的肩膀上,向前看。
预训练模型:来到T3 使用哪个预训练模型的问题;我在谷歌人工智能博客上看到了一篇有趣的文章,该文章比较了 Imagenet 数据集上的准确性与几个预训练模型的模型参数数量。计算机视觉是一个快速发展的领域,新的模型也在快速发展。最初,我计划使用 VGG16 或 Resnet50,但当我在 Efficientnet 上看到这篇文章时,我改变了主意,转而支持 Efficientnet。我有一个 RTX 2070 GPU,我的硬件限制对我可以使用的模型施加了约束。我开始使用 b7 版本的 Efficientnet,但我的 GPU 很快就放弃了,因为这个模型不适合它的内存。在 b7、b6、b5 和 b4 模型上运行了无数次 Kill -9 job_number(在 Linux 中从计算机内存中删除模型的命令:)之后,我选择了 Efficientnet b3。当时这样做的唯一原因是,它是 Efficientnet 系列中最大的型号,最终适合我的 GPU 内存。后来,这被证明是一个极好的选择!
时期:对于像 Efficientnet b3 这样拥有 1200 万个参数和数万个训练数据集实例的模型,很容易过度训练模型。实际上我在用 20 个纪元训练模型的时候,得到的训练准确率是 1!不要问我那种情况下的测试精度:)我使用了范围从 1 到 30 的 epochs,用于各种学习速率和批量大小的组合。
采样:我从没有采样开始。奇怪的是,这个模型将几乎所有的测试用例归类为“1”,与我预期的“0”相反。我觉得问题是测试图像没有像训练图像那样被转换,并且未转换的测试图像在某种程度上类似于标签为“1”的转换后的训练图像(稍后将详细讨论这个关键主题)。然后,我使用了一个加权随机采样器,这导致了在训练数据集中 0 和 1 类几乎各占一半。但是,这也导致整个训练数据集的大小从大约 15000 减少到大约 3000 以下。使用这种采样技术,精度有所提高,但稳定在 0.86 左右。接下来,我从少数民族类中进行了额外的采样,并将两个类中的图像数量进行了对比。通过这样做,我的训练数据集从 15000 增加到 26000。这当然有帮助,因为我现在的准确度达到了 90 %,我得到了大约 0.94 的准确度。
转换——将训练数据集上使用的相同转换应用于测试数据集:我的准确率稳定在 0.94,其他人的准确率达到了 0.975。这让我开始认真思考我的模型中缺少了什么。在洗澡、做饭和走路的时候,我一遍又一遍地追踪这些步骤。
突然,灵机一动:配送!所有的机器学习都基于这样的假设,即测试数据的分布与训练数据的分布相同。否则,我们从训练数据集中学到的东西将不会应用到测试数据集中。通过旋转和*移变换训练图像,我改变了分布。然而,通过让测试图像保持原样,我无意中在一个“不同的”分布上应用了该算法。我立即对测试图像应用了相同的变换,你瞧,我第一次看到了 0.975 的精确度!
调优:一旦有了这种认识,剩下要做的就是调优超参数,以获得可能的最佳结果。我尝试了各种时期,发现对于这个具有我使用的预训练模型、学习率和批量大小的数据集,在 11 个时期的训练后,我获得了最佳的测试准确性。
我还能做得更好吗?
或许使用 Efficientnet-b7 配合更大的批量可以获得更高的准确度。如果有人有更强大的 GPU/分布式计算系统,请尝试一下并告诉我。
实际应用:使用这种算法,医生可以快速准确地识别 100 个人中的 99 个人的 Covid(在 15000 幅图像上训练该算法并在 400 幅图像上运行该算法大约需要 40 分钟),仅考虑测试图像的分类时间,该算法对 400 幅图像进行分类仅需要 1 分钟。因此,这对于现场工作人员快速筛选图像并识别测试呈阳性的人非常有用。
在向您介绍了算法发现之旅之后,我现在转到具体的开发部分。
py torch 中的算法开发
我在 PyTorch 中开发了我的算法,py torch 是一个非常适合计算机视觉任务的机器学习库。
- 作为第一步,我导入了 numpy、pandas、os、torch 等,并设置了数据文件夹所在的基本路径。然后,我创建了 pandas 数据框,分别包含训练数据集图像名称及其标签和测试数据集图像名称。
导入库和创建数据框架(作者代码片段)
2.要检查数据帧是否正确加载,最好检查 train_dataset 和 test_dataset 的前几行。下面是 Jupyter 笔记本的代码和结果输出:
查看训练和测试数据集数据帧的前几行(图片由作者提供)
我们看到图像的名称在文件列中,标签在训练图像的标签列中。对于测试图像,我们在文件列中有名称。
3.下面是查看训练数据集文件夹中的一些图像的代码,
绘制一些训练数据集图像的代码(图像由作者提供)
该代码将产生 15 个如上所示类型的 X 射线图像。
4.下一步是以 Pytorch 可以处理的形式从图像和标签中创建训练数据集。Dataloader 是 Pytorch 中的一个功能,它使我们能够方便地将图像和它们的标签配对,以创建一个矩阵/张量,然后 PyTorch 可以将其用作学习算法的输入。
创建将图像和标签配对的类(按作者分类的图像)
5.然后,我将学习率设置为 10e-4
设置学习率(图片由作者提供)
6.接下来,我使用在步骤 4 中创建的 Dataset dataloader 类准备了训练集。我将其命名为 training_set_untransformed,因为我还没有对图像应用旋转或*移等数据转换。
创建训练数据集(图片由作者提供)
7.然后我创建了一个变换。Compose 方法来调整图像的大小,随机应用旋转和水**移,并将结果矩阵转换为张量。这种变换对于数据扩充是有用的。
创建一个变换函数来增强图像(作者的图像)
8.下一步是对训练数据集使用 transforms 方法。对于少数类中的图像(covid 情况),我对它们进行了上采样,以便在应用变换后两个类中的图像数量相同。
对少数类进行上采样并应用变换(图片由作者提供)
9.然后,我将这些新创建的图像按照 80:20 的比例分成训练集和验证集。
将数据集拆分为训练集和验证集(图片由作者提供)
10.使用 Pytorch 的 Dataloader 函数,我从训练数据集中创建了每批 32 个的数据,并对它们进行了混洗,以确保所有批中两个类的表示大致相等。
从训练数据集创建批次(作者图片)
11.为了启用 GPU 计算,我使用了 cuda.is_available()命令。深度学习代码也可以在 CPU 上运行,但需要更长的时间。
启用 GPU 计算(图片由作者提供)
12.以下是从 Pytorch 导入 Efficientnet-b3 并将类的数量设置为 2 的命令。
导入 Efficientnet-b3 模型(图片由作者提供)
13.导入后,模型必须加载到 GPU 的内存中。如果您的型号对于 GPU 内存来说太大,您将会收到一条错误消息,并且需要选择另一个适合内存的型号。在 Jupyter 笔记本上运行该命令,欣赏 Efficientnet 的复杂性!
将模型加载到系统中(图片由作者提供)
14.定期保存训练过程产生的权重是有好处的。如果模型由于某种原因崩溃,我们可以调用保存的权重并恢复训练,而不是从头开始。
创建一个文件夹来保存权重(图片由作者提供)
15.我使用交叉熵损失作为损失计算的标准,因为我们正在处理一个分类问题。我使用了 Adam 优化器,这是一种众所周知的深度学习的权重更新方法,并将历元数设置为 11(这种学习是在大量实验后产生的)。学习率衰减是用于在每个时期之后更新学习率的参数,并且我设置了 0.99 的保守衰减率,因为学习率已经很低了。我创建了两个列表来跟踪准确性和损失历史。
设置超参数(图片由作者提供)
16.训练模型:下面是代码的训练部分。我运行了 11 个时期的模型,并保存了模型的第 1、第 10 和最终(第 11)版本。训练它大概花了 40 分钟。
训练模型(图片由作者提供)
*At the end of the 11th Epoch, I got an accuracy of 99% on the training dataset for both classes.* Accuracy of 0: 99 %
Accuracy of 1: 99 %
[11 epoch] Accuracy of the network on the Training images: 99
17.这是一张训练精度和迭代交叉熵损失的图表。有 7227 次批量迭代,该图显示了这些值如何随着批量迭代而变化。
损失和准确性历史(图片由作者提供)
18.下一步是应用变换。组合到测试数据集,使其符合与训练数据集相同的分布。
将转换应用到测试数据的函数(图片由作者提供)
19.为了预测测试图像的类别,我们需要定义一个 predict_image 函数:
预测和图像功能(作者提供的图像)
20.以下代码片段检查模型在验证数据集上的表现。
预测验证准确性(图片由作者提供)
21.通过下面几行,我们可以预测测试集图像的类别,并将它们存储在一个 csv 文件中。
预测测试图像类别并存储它们(按作者分类的图像)
劳动的果实!—竞赛排行榜(来源:竞赛网站
结论
通过这次 Kaggle 比赛,我了解到构思和开发深度学习算法需要一些耐心,我们必须不断寻找模型中的漏洞以及其他人的发现,以使我们的模型变得更好。我的文章是将它转发给机器学习社区的一种小小的方式,这样我们就可以一起分享和学习,并改进我们的算法,以更好的方式解决问题!
希望你能从我的帖子中学到一些有用的东西。请分享您的宝贵反馈!
鸣谢:我非常感谢 Kartik Dutt,他为一个不同的计算机视觉挑战开发了代码,我发现他的代码部分适合这个深度学习任务,并融入了我的工作。(https://github . com/kartikdutt 18/ka ggle-ATPOS-Efficient _ Net/blob/master/Efficient _ Net . ipynb)
大量的唯一值和基于树的模型
原文:https://towardsdatascience.com/high-number-of-unique-values-and-tree-based-models-c30167b63edd?source=collection_archive---------18-----------------------
照片由 Siora 摄影在 Unsplash 上拍摄
基数有多高会影响购物车的性能和解释
H 使用高基数的数据列会对模型的性能产生负面影响。这篇文章的想法源于我在各种项目中使用基于树的解决方案的个人经历。在本文中,我将尝试使用简单的决策树来展示这对几个数据集的影响。在进入示例之前,让我们首先了解
什么是基数,树模型如何工作
基数可以定义为机器学习上下文中数据的唯一性。具有大量唯一值的字段示例包括城市、国家、医疗诊断代码、网飞电影类别、冰激凌口味等。
作者图片
决策树示例。作者图片
为了使大多数树模型工作,所有变量类型都必须转换成数字。机器学习树基于高于或低于值来分割它们的节点,即年龄大于低于 25,权重小于 50。这对于连续数据或任何顺序数据都非常有效。
收入数据示例
为了说明高基数对树分裂的影响,我将使用的第一个数据集是来自 Kaggle 的收入分类数据。该数据包含连续和分类的个人数据,以预测个人是高收入还是低收入的二元结果。
我将缩小范围的特征是职业类别变量。这一列中有 13 个唯一值,它们是用标签编码的。
编码映射。作者图片
在拟合决策树之后,通过观察整个树模型模式,我捕获了在任何节点中使用 occupation 进行分割的所有值。完整的树模式太大,无法显示,可在此处查看。
通过提取使用 occupation 拆分节点的所有节点,我们可以从右侧的表中看到哪些点的数据用于拆分。作者的图表和表格
占领的分裂发生在这些值:
0.5,2.5,3.5,5.5,8.5,9.5,10.5
将其映射到编码表显示了在整个树中用于分类数据点的决策边界。
这似乎不对
观察决策边界后,我的第一个想法是,所有的值都应该被分成离散值。它们彼此之间没有关系,不能用更高或更低的数值来表示。
如果不对每个不同的值进行拆分,一些值将属于同一个存储桶,在进行拆分时会被集中在一起。这导致某些分组没有直观意义,例如
武装部队,和****
[ 机器操作检查、其他服务、私人服务 ]
如从上面的分裂边界所观察到的。
此外,默认情况下,职业是按字母顺序编码的。通过改变编码顺序,模型超参数实际上受到了影响!
在第一次运行中,使用网格搜索交叉验证在 max_depth 为 8 处拟合最佳估计值。但是,使用新的编码顺序再次运行它,同时保持其他所有内容不变,会产生不同的最大深度值 10 和不同的 occupation 类分割边界。
使用虚拟数据进行调查
为了更好地理解这些影响,我决定深入研究以验证我的发现。我对只有 4 行的简单虚拟数据运行了相同的步骤。用决策树对初始数据进行编码和分割。一眼看去,该树可以在值[1,2]和[3,4]之间一分为二。
********
作者提供的图片
决策树架构。作者图片**
左侧显示了用 sklearn.tree 绘制的相应树模式。
为了以文本形式描述它,顶部的节点指定那些值小于 1.5 的被归类为 1,那些值大于 1.5 的被归类为 0,最佳地将我们的数据分成正确的结果(0 基尼系数杂质)。到目前为止一切顺利。
接下来,我以不同的顺序重新排列了变量,并将它们编码如下:
********
作者提供的图片
由于决策树是基于数值来分隔数据点的,因此为了分隔数据,决策树必须创建更多的拆分。
决策树架构。作者图片**
也就是说,现在需要三个不同的分裂 ≤0.5、≤1.5 和 ≤2.5 ,创建一个更深的树以达到最佳结果,即使使用的数据完全相同。
这表明编码顺序影响结果,树分裂将持续分裂,直到它不再能减少杂质。
因此,我们知道,对于收入分类数据,即使数据点仍然集中在一起,这也是分离可以达到的最高粒度级别。树的分割按预期工作,进一步分割值只会使模型过拟合。
如果这棵树能做出最佳的分裂次数,为什么不顺其自然呢?
事实上,虽然模型结果没有受到显著影响,但我们已经观察到树必须更加努力地分割数据。这仅仅是因为列中的唯一值越多,树就必须进行越多的拆分来分隔数据。
这种影响在使用最大深度或其他等效超参数控制数据分割程度时最为明显。上述任何增加都会反过来增加模型训练时间。虽然我在我的例子中使用了决策树,但是这个问题影响了所有基于树的模型。给定足够多的具有高基数的特征,即使更复杂的算法也会受到影响。
我敢肯定,我们不希望以较差的模型性能为代价,*衡拟合一个较浅/不太复杂的树来减少训练时间。
那么我们该如何着手呢?
处理数据中的高基数
在这里,我将简要介绍一些解决这个问题的有用方法:
- 将数据组合成组。这可能需要领域知识。这个想法是通过将唯一值分成有意义的集合来减少它们的数量。这是一个很好的方法,只要分组不会显著降低模型性能和对业务涉众的可解释性。****
- 尝试不同的编码方法。诸如均值/计数编码、散列等方法在减少数据级别方面特别有效。然而,它们可能对模型的可解释性有害。
- 使用非基于树的模型,例如带有实体嵌入的神经网络。如果没有树,基于树的模型没有问题,但现在你将有一个全新的问题要处理。
- 具体来说,为了处理输入数据中所示的解释问题,可以使用一个热编码,尽管它仍然不得不创建更多的分割。
作为一个认为树模型的力量是理所当然的人,深入研究树和数据基数之间的关系帮助我改进了建模方法。希望这篇文章也能以同样的方式帮助你。这里是所用代码的 github 库。感谢阅读!
****https://github.com/WeiHanLer/Tree-Cardinality-Article ****
利用 Pedalboard 和 tf.data 实现高性能音频处理
原文:https://towardsdatascience.com/high-performance-audio-processing-with-pedalboard-and-tf-data-9bd2c64ca5bd?source=collection_archive---------48-----------------------
最*,Spotify 发布了一个用于音频处理的 Python 库,名为 Pedalboard。在这个故事中,我想研究它在 tf.data 管道中机器学习任务的数据增强环境中的表现。
图 1:表达爱意|作者图片
因为我对音频数据进行机器学习的主要工具是 TensorFlow,所以我一直在寻找能够加速我的预处理流水线的库。我常常羡慕 Torchaudio,它已经有了一组不同的函数和自己的 SoX 包装器。当然,有很多音频处理的替代方案,但是所有流行的解决方案要么是像 SoX 和 ffmpeg 这样的命令行工具,要么不是线程安全的。因此,Pedalboard 似乎是 TensorFlow 中快速高质量音频处理的一个很有前途的库。
今天我想比较一下 Pedalboard 和 SoxBindings 在 tf.data 管道中使用时的处理速度。SoxBindings 是一个很棒的围绕 SoX 的 Python 包装器,它至少在多线程环境中不会失败,但也不会使用它(参见正在进行的 Iissue)【2】。
方法
对于这个任务,我们将使用 LJ 语音数据集 [3]作为我们的音频数据输入。该数据集在美国属于公共领域,对其使用没有限制[4]。该数据集由 13,100 个长度为 1 至 10 秒的音频片段组成,总长度约为 24 小时[3]。在下面的每个实验中,我们将迭代整个数据集并测量运行时间。我们选择了一组在 Pedalboard 和 SoxBindings 中都存在的音效:
- 压缩机
- 合唱
- 高通滤波器
- 低通滤波器
- 相位器
- 混响
然后我们单独使用每个效果来转换数据集。在第二个实验中,我们将所有 6 个效果链接成一个转换。当然,在大多数增强任务中,你会想要随机初始化每个效果的参数。然而,初步测试表明随机参数化对处理速度没有负面影响,所以为了代码的可读性,我们忽略了它。所有实验都在一个 12 核的 CPU 上运行。
密码
首先,我们加载 LJ 语音数据集,并将其仅映射到音频数据:
然后,我们定义一个包装 SoxBindings 转换的包装器,这样我们就可以在 tf.data map 调用中使用它:
踏板也是如此:
当在 tf.data map 中调用 SoxBindings 函数时,保留num_parallel_calls = None
很重要,否则您的内核会无声无息地死去。这可能是由于 SoxBindings 没有在C
扩展中释放 GIL[5]。
包含所有实验的完整笔记本可以在我的 GitHub-Page 上找到!
结果
第一个实验的结果不言自明,Pedalboard 在处理时间上远远落后于 SoxBindings。在图 2 中,我们可以看到所选效果的加速在 2.5 倍到 6 倍之间。
图 2:按效果分类的数据集转换持续时间|按作者分类的图像
第二个实验展示了使用 Pedalboard 和 SoxBindings 的内置效果链的性能。第三个设置Pedalboard Chain w/TF . data使用 tf.data map 调用来连续链接各个 pedal board 效果。这种方法产生了迄今为止最好的性能,比另一种方法快 4 倍。
图 3:使用效果链的数据集转换持续时间|作者图片
摘要
结果显示,在 tf.data 管道中,通过 SoxBindings 使用 Pedalboard 时,速度有了很大的提高。然而,当使用 Pedalboard 的内置效果链时,似乎会有巨大的性能损失,在这种情况下,性能会低于 SoxBindings 实现。也许 tf.data 只是在并行计算方面比 Pedalboard 更好,我们只是看到了让 tf.data 做它的事情的好处。使用 Pedalboard 的一个缺点是此时可用的效果相对较少。虽然 SoX 和 SoxBindings 已经有了相当多的算法库,但 Pedalboard 仍然需要迎头赶上。这种情况将来可能会改变,在某些情况下,您已经可以使用 VST3 或 AU。
就我而言,我肯定会在一些现实世界的应用程序中尝试一下 Pedalboard,看看它是否能给我更好更快的音频处理管道!
如果有人在我的实现方法中发现系统缺陷,请告诉我,我很乐意让音频处理更快;)
资源
1【https://juce.com】
【2】https://github.com/pseeth/soxbindings
【3】k . Ito 和 l . Johnson:LJ 语音数据集(2017 年)https://keithito.com/LJ-Speech-Dataset/
【4】LJ 语音数据集许可(2021 年)https://librivox.org/pages/public-domain/
【5】https://github.com/pseeth/soxbindings/issues/6
如果你正在阅读这篇文章,我们可能有相似的兴趣或在同一个行业,欢迎你联系我。在LinkedIn上找我。
高性能代码带来回报
原文:https://towardsdatascience.com/high-performance-code-pays-dividends-ce97768b5fa5?source=collection_archive---------29-----------------------
快速代码变得更快,成本变得更低,创造力被释放,自由之声响起。
我花了几年时间开发的 connected components 库的性能随着版本和月份/年份的增加而增加。横轴是每秒数百万个 3d 像素(“体素”)。纵轴是测量的 RAM 使用峰值。有更快的算法可用,但据我所知,不是用于 3D 多标签图像。许可证:图片由作者提供
在公共领域,如果不是在每一扇紧闭的门后,软件社区会用 Donald Knuth 的一句无处不在且被误解的名言“过早优化是万恶之源”来阻止任何关注性能的建议虽然我和 Knuth 一样不喜欢投机性的微优化,但是对软件性能的认真关注带来了巨大的好处,并且受到反馈循环的影响,可以在几个层面上从根本上改进项目。
我自己的经验是在 3D 图像处理领域积累的,那里的数据非常大。一个典型的输入图像是一个 512 体素无符号 64 位图像剪切块(~1 GB RAM),它是一个更大的图像的一部分,该图像可以由成千上万的这些任务组成。如果不仔细关注每个算法的设计,单个任务的运行时间可能会长达几个小时,同时 RAM 的使用也会激增。
在高性能计算方面,肯定有比我更有经验的工程师。然而,在过去的几年里,我对加速和减少内存压力的好处有了一些小小的见解。也许你会发现它们很有用。
阿姆达尔定律反面的正反馈
用英语解释,阿姆达尔定律(Amdahl ' s Law)说,加速一段代码最多可以提高代码开始所用时间比例的整体速度。换句话说,如果一个程序在段 A 中花费 50%的时间,在段 B 中花费 50%的时间,段 B 的 100%加速将导致最多 2 倍的总运行时间改进,因为段 A 没有被改变。Amdahl 定律通常是关于串行和并行组件的代码并行化,但它同样适用于没有完全改进的单线程代码。
当我第一次遇到阿姆达尔定律时,它有点悲观。无论给定代码段的解决方案多么巧妙,它的最终潜力都受到周围一切的限制。在花时间改进算法并与剖析器一起迭代工作之后,我修改了这个视图。
一个领域的加速使得代码其他部分的加速更有价值。用前面的例子来说,如果 A 部分占用了 50%的时间,那么在这个等式的任何一边,我所做的任何改进最多是两倍。如果我将 A 部分的性能提高一倍,它现在占用了总时间的 33%。这意味着 B 段的贡献从 50%增加到 66%。如果我把 A 段加速 4 倍,B 段的贡献是 80%。这放大了程序其余部分的额外优化的效果,并使以前看似微不足道的贡献者突然值得攻击。
换句话说,你越是从根本上提高目标部门的绩效,潜在的新目标领域就变得越丰富。如果您仅将性能提高 2 倍而不是 10 倍,您的目标区域将继续掩盖其他贡献者。随着您改进的代码继续成为瓶颈,您提高性能的选择将显得更加混乱。
你成为一名更好的工程师
在高性能领域,算法知识和对系统的复杂理解变得至关重要。虽然日常工程的内容是让事物工作,但解决执行时间、内存容量或资源争用等物理问题迫使人们对基础科学原理进行更系统和实用的研究。
在工程学中,当你开始在你的工具和材料所能承受的极限范围内工作时,数学是非常有用的。当建造一个典型的乐高塔时,人们不需要知道塑料砖的弹性模量或拉伸强度,因为它们比施加的力要大得多。然而,如果你试图用它们建造一个可居住的结构,你需要更多地了解它们的属性和环境相互作用。
计算也是如此。当内存和计算负载开始达到物理极限或与系统的其他元素相互作用时,就需要进行规划和系统分析。这时,你不得不考虑文献,计算最坏情况下的负载,并调整算法。此外,如果你足够深入地研究一个问题,你可能会发现它的一些新的共性,并成为一名科学家。
高性能计算(HPC)远远不是提高技能的唯一主题领域。例如,自然语言处理、搜索、运动规划和计算机视觉与性能只有很小的关系。然而,HPC 对于实践中的工程师来说是非常容易理解的,它的含义涉及到每个项目。
释放创造力,避免问题
每个程序在开发者耐心、用户耐心、精力和成本方面都有隐含的时间预算。对于开发人员来说,更快的代码允许对周围的设计进行更快速的迭代。对最终用户来说,程序的等待时间减少了,因此程序有机会过渡到他们意愿的自然而灵活的扩展。
更高的效率还能增加原本难以想象的功能。如果一个库只改进到满足当前性能标准的程度,而不是更多,那么一旦问题发生变化,添加特性就变得很麻烦。性能曲线的任何显著下降都会立即将运行状态变为黄色或红色。尤其是在科学或其他开创性工作中,成功的第一种方法将让位于对更复杂方法的渴望。这些复杂的方法可能需要额外的空间来适应。
例如,我致力于改进大规模骨骼化,这是一种从神经元的 3D 标记图像中提取简笔画的方法。我估计,一个早期但严肃的尝试将需要在我们最大的数据集上租用大约 50 万美元的计算时间。经过大约两年断断续续地解决这个问题,纯粹基于改进的软件,成本降低到不到 1000 美元。这使得我们可以在任何时候运行这个算法,反复修正错误,并提高质量,而不会产生重大后果。
我在编写连通分量 3d 算法时也有类似的经历,该算法比最常见的 3d 版本快许多倍。突然间,人们可以愉快而轻松地使用这种算法,而不用仔细规划每个应用程序。开发者迭代速度提高。
从另一个角度来看,性能代码只是避免了问题。避免问题意味着计划没有障碍,没有会议,没有资源转移,并且可能在组织环境中减少压力。不幸的是,证明问题被避免比问题被解决更难。尽管如此,你可以表明你的解决方案明显优于一个可比较的解决方案,或者如果不是对所述代码相当有效,所选择的方法是不可能的。
减少物理磨损
虽然软件通常被认为是抽象的系统或数学对象,但它也是运行在物理系统上的电流的主动过程。有时,软件也操作简单的机械设备或引导复杂的机器人。
当考虑物理世界时,有效的软件可以被认为是最小化能量消耗的软件。在纯计算系统中,这通常意味着减少 CPU 或 GPU 的电力消耗。节能计算可以减少计算机组件的物理降级热循环,并减少移动设备的电池消耗。对于电池供电的设备,低功耗代码更好。通过首先减少电池的消耗,不仅延长了电池的当前充电时间,而且每次充电的运行时间的增加降低了电池的循环速率,增加了组件的总寿命。类似的论点也适用于闪存硬盘的写入耐久性和总存储容量。更少的书写意味着更大的空间和更长的耐力。
在机械领域,选择最短路线的软件(其他条件相同)可以降低燃料成本和机械零件的磨损。一个简单的例子是路线图,其中更短或更快的路线可以通过减少每次旅行的里程来减少燃料消耗并延长汽车的寿命,同时还使乘客*均更快乐(只要他们没有试图享受风景优美的路线或在目的地推迟一些可怕的遭遇)。
适应狭小的空间
某些优化,比如 SIMD 内部函数并不总是可移植的。当我假设英特尔 x86_64 将永远占据主导地位,并在第二年购买了一台 ARM64 笔记本电脑时,我发现了这一点。然而,使用可移植方法编写的具有良好性能的库代码可以容纳比您所能预见的更多的空间。
如果你的代码有合理的内存效率,它可以适合一个嵌入式设备。然而,根据我的经验,更常见的情况是,当我的设计标准是数百兆像素时,我看到有人编写 Github 问题来解决在超过 10 千兆像素的巨大图像上运行我的库的问题。通常,我们可以让它工作(例如通过支持 64 位内存寻址),然后我再也没有听到任何人的消息,因为现在它已经工作了。如果代码的单线程性能一开始就太慢,那么扩展到这样的规模会很痛苦。
另一方面,高性能代码也避免了基础设施灌注。在某一点上,一台机器有一个物理限制,即它可以处理多少请求,可以处理多少数量,可以存储多少数据。然而,这些限制通常有些灵活,因为工程师可以调整每个操作所需的工作量,并根据空间或时间进行权衡。
高效的代码减缓了机器的垂直增长需求(垂直意味着更多的 RAM、CPU、SSD、更快的网卡),同时也减缓了水*增长(意味着更多的机器)。纵向增长成本高昂,并且不会永远扩展。水*增长的规模很大,但在许多不同的层面上很复杂。运营商希望保持最新的部署,避免机器遇到资源争用、构建数据中心的物理挑战(如布线、冷却和移动重物)以及相关的难题。臭名昭著的是,SEC 描述了Knight Capital 未能正确更新所有机器是如何导致 2012 年股市闪电崩盘的。
虽然 Knight Capital 可能将他们的机器推到了极限,他们的问题更多地是沿着变更控制的路线,但是如果您的代码可以推动极限,您将在硬件上花费更少的钱,并且可能在协调由此产生的更少的机器方面有更少的问题。管理 1 台、2 台、20 台、200 台和 2000 台服务器的难度相差很大。当然,像 Knight 一样,无论每个组件的速度有多快,您仍然会遇到设计应用程序中不同服务之间的接口的问题。
表演是解放
高效的工具更简单,因为它们增加了单机计算的操作范围。一个有效的算法可以将一个程序从一个大型集群移动到一个较小的集群,或者从一个较小的集群移动到一台笔记本电脑。
如果程序是为商用硬件设计的,这可不是小事。厄普顿·辛克莱在《史诗十二原则(结束加州贫困)》中写道:“工具私有制,当工具简单时是自由的基础,当工具复杂时就成了奴役的基础。”
计算机是一个强大的计算引擎,是一种通常为个人所有的生产手段。由于需要其他人的设备和代码,变得过于复杂的计算成为其他人对你施加影响的一种方式。例如,如果您需要数百 GB 的 RAM、一个奇特的 GPU 或几十个 CPU 内核,突然之间您需要与一位实业家签订合同来完成这项工作。计算工作越大,关于该任务的决策(是否做、何时做、如何做以及成本如何)就越取决于那些拥有设备、资金、关系和劳动力资源来实现它的人的意愿。
高效的代码将更多的决策权放在个人和不太富裕的人群手中,这些人的动机可能与公司简单的积累动机不同。自由的一个方面是做出决定的能力,这种决定会对你的生活产生积极的影响。虽然软件性能远远不是这些事情的唯一决定因素,但与支持开源和自由软件许可的观点相比,它被忽略了,因为开源和自由软件许可让最终用户可以选择审计或更改软件。高性能的软件使得以你想要的方式运行你的代码成为可能。
在我的神经影像领域,我之前提到的简笔画骨架是分析中的一个基本结构。如果在有用的大型数据集上大量创建它们需要数万到数十万美元的成本,并且需要云合同,那么这项任务将被限制在资金最充足、人脉最广的玩家身上。即使是仁慈的科学家也只有有限的时间、注意力和金钱来帮助他人。通过将成本降低两到三个数量级,突然之间更小的实验室、研究生和好奇的局外人都可以自己完成。
环境影响呢?
气候危机在很大程度上威胁着人类文明,而电力经常由化石燃料产生。然后,电力被计算机代码的运行所消耗。根据其 2020 年环境报告,仅谷歌一家在 2019 年就使用了 12.8 太拉瓦时,超过许多国家和超过几个美国州。提高代码效率应该会减少对环境的影响,这似乎很直观。是吗?
答案一点也不清楚,必须逐个系统地考虑。主要原因是诱导需求。
诱导需求甚至不是一个偶然的副作用。我们提高软件效率的一个主要原因是为了让它更适合在更多的环境中更频繁地运行。如果你把一个图书馆的速度提高了 10 倍,但它的运行频率却提高了 1000 倍,从环境的角度来看,你真的有所收获吗?如果代码提高了 100 倍,但运行频率只有 10 倍,这就是胜利。诱发需求与改善绩效的比率必须小于 1,才能对环境有利。有时,快速代码会使下游代码运行得更加奢侈,在这种情况下,即使是极低的比率也可能不会带来好处。
工程师和科学家应该设计出能够在大工业规模上运行的程序,以避免不必要的过度。然而,只要组织还在生存和发展,他们就会想方设法用尽空闲的数据中心容量,这是组织的本性。如果所有团队都编写高性能代码,它将调整增长轨迹,但我怀疑它通常不会走向萎缩。
因此,关于购买能力和消费者基础的规模和胃口的决定是环境影响的更强驱动力。如果只有有限的能力可用,一些代码将被改进,一些计划将被搁置,而其他的将被缩减。换句话说,总能耗不会受到单个工程师的强烈影响,除非在特殊情况下,例如在移动或嵌入式设备中频繁运行的程序。
尽管如此,如果使用的能源是 100%可再生的,我们应该担心吗?一些大公司如谷歌声称他们已经过渡到 100%的可再生能源,或者承诺这样做,如 T2 微软 T3。有趣的是,两者都承诺最终会变成负碳排放,大概是通过购买碳抵消。
缩小来看,美国整体能源生产的组合在几年或几十年内变化缓慢。有一些方法可以做到真正的绿色环保,比如开发一个闲置的资源,比如一个与电网断开或利用不足的水电站。另一种方法是在不干扰其他建设的情况下建设新的发电设施(例如,通过用尽有限的部件或劳动力)。不过,总的来说,馅饼在某一年是合理固定的。因此,在缺乏这些因素的情况下,任何声称运行可再生能源大型工业流程的组织都只是重新分配一块缓慢变化的馅饼,并迫使其他市场参与者使用肮脏的能源。
许可:美国政府出版物,公共领域
在某种程度上,购买可再生能源确实刺激了额外的可再生能源市场。然而,公司可以开始声称他们正在使用可再生能源的事实可能更证明了一个真正乐观的消息,即大量新的可再生能源发电即将上线。个别组织声称使用 100%可再生能源,主要是为了让员工、供应商、投资者和客户对他们所做的事情感觉良好,而没有看到更大的画面。
消费者的选择,甚至是企业的选择,在改善我们命运的能力上是有限的。我认为,要解决气候问题,需要在国家和国际层面开展一个集中协调的进程,将能源分配给不同的工业和消费部门,并代表整个社会管理能源生产组合。只有这样,我们才能用一种不依赖运气的理性方式来解决这个问题。
公*地说,软件公司不是电力公司,期望他们建立自己的一代有点可笑。我们能从他们那里得到的更多的期望是支付 税收,从持有证券的化石燃料公司中撤资,并在社会尽快改变能源结构的同时,将他们的总能耗控制在监管机构设定的上限之下。
高性能代码带来的好处是相当可观的,无论是对开发它的人还是对使用和适应它的人来说都是如此。与直觉相反,开发高效的代码并不总是对环境有益,所以如果没有仔细的上下文相关的推理和测量,环境保护论就不应该被用作一个理由。
Spark 上变压器模型的高性能推理
原文:https://towardsdatascience.com/high-performance-inferencing-with-large-transformer-models-on-spark-beb82e71ecc9?source=collection_archive---------14-----------------------
使用 PySpark、Hugging Face 和 AWS GPU 实例的代码教程
想要通过拥抱脸或 Tensorflow 模型实现高达 100 倍的速度提升并节省 50%的成本吗?借助 GPU 实例和 Spark,我们可以同时在两个或数百个 GPU 上运行推理,从而毫不费力地获得更高的性能。
作者使用 Canva 的许可内容制作的图片
概观
- 设置驱动程序和工作实例
- 为并行化对数据进行分区
- 使用变压器模型进行推理
- 讨论
设置驱动程序和工作实例
对于本教程,我们将使用数据块,如果你还没有一个免费账户,你可以注册一个。请注意,DataBricks 将需要连接到云托管提供商,如 AWS 、谷歌云*台或微软 Azure 来运行 GPU 实例。
在本练习中,我们将使用" g4dn.large "类型的 AWS GPU 实例。如果您使用 Google Cloud 或 Microsoft Azure,并且从它们中选择了等效的 GPU 实例,您仍然可以遵循这些说明。
一旦您的 DataBricks 帐户设置完毕,登录并创建一个集群,配置如下所示:
配置一个虚拟命名为“gpu_cluster”的 GPU 集群
接下来,创建一个笔记本,通过在下拉菜单中选择它将其附加到集群:
设置笔记本的群集
现在,我们都开始编码了。
安装拥抱脸变压器
https://huggingface.co/
首先,让我们将支撑面变压器安装到组合仪表上。
在笔记本的第一个单元格中运行:
%pip install transformers==4.2
拥抱脸变形金刚 Python 库安装在集群上
这样安装的库被称为笔记本范围的 Python 库。这很方便,而且必须在会话开始时在其他代码之前运行,因为它会重置 Python 解释器。
现在,我们从实际的 Python 代码开始。在下一个单元格中,运行:
如果上面一行运行没有任何错误,恭喜你,拥抱脸变形金刚安装成功。
为并行化对数据进行分区
在 Spark 中,创建可并行处理的数据的最简单方法是创建 Spark 数据帧。对于本练习,包含两行数据的数据帧就足够了:
显示创建的火花数据帧。
本练习的 Transformer 模型每行接受两个文本输入。我们在这里把它们分别命名为“标题和“摘要”。
出于好奇,这里有一篇 Laurent Leturgez 的精彩文章,深入探讨了 Spark 分区策略:
https://medium.com/datalex/on-spark-performance-and-partitioning-strategies-72992bbbf150
使用变压器模型进行推理
我们将为 PySpark 使用奇妙的熊猫 UDF 来处理内存高效分区中的 Spark 数据帧。数据帧中的每个分区都作为 Pandas 数据帧呈现给我们的代码,您将在下面看到,作为函数" embed_func 的参数,它被称为" df "Pandas 数据框架使得用 Python 处理数据变得很方便。
定义 embed_func(df) 的代码
您可能已经从上面的代码中注意到了两件事:
- 代码进一步将 Pandas 数据帧中的输入文本分割成 20 个块,如变量" batch_size 所定义的那样
- 我们使用 AllenAI 的Spectre—一个预训练的语言模型来生成文档的文档级嵌入(此处预打印)。)请注意;然而,我们可以很容易地把它换成另一个拥抱脸模型,比如伯特。
绕开 GPU 内存限制
当 GPU 被用于对这个拥抱面部变形器模型进行推理时,输入和输出被存储在 GPU 存储器中。GPU 内存是有限的,尤其是大型变压器模型需要大量的 GPU 内存来存储其参数。这留下了相对较少的内存来保存输入和输出。
因此,我们通过一次推理 20 行来控制内存使用。这 20 行完成后,我们将输出复制到驻留在 CPU 内存中的 NumPy 数组(CPU 内存更丰富)。这是在上面第 21 行用“”完成的。cpu()。分离()。numpy() ”。
最后,在 GPU 上进行实际变压器模型推理
如上所述,这就是为 PySpark 处决熊猫 UDF 的地方。在这种情况下,熊猫 UDF 就是“ embed_func 本身。请仔细阅读上面的链接,了解关于这个强大的 PySpark 特性的更多信息。
这个练习的结果输出——Spectre 给出了文档嵌入的 768 长的浮点数组。
讨论
我希望您能看到 Spark、DataBricks 和 GPU 实例如何使大型 transformer 模型的扩展推理变得相对简单。
这里展示的技术使得对数百万行进行推理成为可能,并在几个小时内完成,而不是几天或几周。这使得在更多的情况下对大量数据运行大型变压器模型变得可行。
成本节约
但是等等,还有更多。尽管成本是 CPU 实例的 5 到 20 倍,但由 GPU 实例完成的推理实际上更具成本效益,因为它的速度快 30 到 100 倍。
因为我们是按小时付费的,所以在这里时间就是金钱。
花在管道上的时间更少
数据可以很容易地导入到 DataBricks 中,并保存为 AWS S3 桶上的拼花文件,或者更好的是,数据湖表(又名类固醇蜂箱表)。之后,它们可以作为 Spark 数据帧进行操作,正如本文所见,对于转换和推理来说,并行化是微不足道的。
所有数据、代码和计算都可以在一个地方“云上”访问和管理,更不用说它在本质上是可扩展的,因为数据从千兆字节增长到千兆字节,这使得这种简洁的解决方案更加“经得起未来考验”
无缝协作
作为基于云的解决方案,意味着随着团队的发展,我们可以向项目中添加更多的人员,以安全地访问笔记本电脑上的数据和代码。我们只需点击几下鼠标,就可以为报告创建图表并与其他团队共享。
请继续关注 Tensorflow 的这篇文章以及我计划的更多文章。如果你觉得这有帮助,请跟随我,我是一个新的作家,我需要你的帮助。如果你有任何想法和问题,一定要发表出来。
使用通用制图工具的现代界面制作高质量地图
原文:https://towardsdatascience.com/high-quality-maps-using-the-modern-interface-to-the-generic-mapping-tools-a90a2969877f?source=collection_archive---------33-----------------------
毫无疑问,在地球物理学领域工作的最喜欢的部分之一就是创造惊人的可视化效果。可视化是将我们的发现有效传达给科学界的最佳工具。
GMT 或通用绘图工具已经成为绘制地球、海洋和行星科学地图的同义词。它可以用于处理数据,生成出版物质量的插图,自动化工作流程,甚至制作令人惊叹的动画。GMT 的另一个优点是,它支持许多地图投影和变换,并包括支持数据,如海岸线、河流和政治边界,以及可选的国家多边形。
在 Unsplash 上由露丝拍摄的照片
我已经在多篇帖子中谈到了 GMT 5 以及如何使用它绘制高质量的地图。我还详细讨论了 GMT 6 的 Python 接口 PyGMT。侏儒在引擎盖下使用 GMT 6 完成所有任务。
在这篇文章中,我的目标是向你介绍使用 GMT 6 创建简单地图的基础知识,并让你熟悉语法。GMT 6 中的大多数风格几乎与 GMT 5 相同,除了编码语法有了显著的改进。它变得更有组织性,可以用更少的代码完成更多的工作。它增加了使用有意义的完整命令的选项,而不仅仅是别名。当我们用一些例子来讨论这个问题时,它会变得更加清楚。
https://www.earthinversion.com/utilities/GMT-advanced-II/
安装 GMT
照片由西格蒙德在 Unsplash 上拍摄
要安装 GMT,您可以遵循这里的步骤安装所需的软件。
我使用 Ubuntu(作为 Windows 子系统— WSL),所以我可以简单地使用 conda 软件包管理器进行安装。参见本。对于任何 Linux 或 Unix 操作系统,步骤都是相似的。
我们的代码将被写入bash
。我在这里假设你对bash
有基本的了解。但是即使你对bash
不太熟悉,你仍然可以跟着我做,因为我会试着让这个脚本“准备好生产”,这样你就不需要学习太多就可以完成本教程中的任务。
第一眼
GMT 6 的第一个不同之处是以下语法:
gmt begin [session-name]
[graphics-formats] <LIST OF COMMANDS>
gmt end [show]
上述语法仅适用于 GMT6,并且不向后兼容。因此,您不会意外地运行 GMT 版本< 6。GMT 时段以gmt begin
开始,以gmt end
结束。可选地,如果输出格式为graphics-formats
,您可以提供将用于输出的会话名称。如果您不提供session-name
或graphics-formats
,那么将使用默认值。如果您在gmt end
处选择了show
,该图将不会被保存,而是仅被显示。
如果您想快速浏览文档,可以通过键入
这将打开本地 GMT 文件,所以你不需要互联网。
第一个情节
gmt begin taiwan pdf,png
gmt coast -RTW -Wthin
gmt end
上面的脚本绘制了一张台湾的海岸线地图,并以 pdf 和 png 格式保存。png 是光栅图像格式,期刊要求出版。如果你想要一个矢量图像,pdf
给出了矢量格式。也支持其他矢量格式,如ps
或eps
等。
使用 GMT6 的台湾底图(图片由作者提供)
我们可以使用-B
选项将默认框架添加到绘图中。我们可能还想将图形从框架边界偏移一点。我们可以通过简单地将+r0.5
指定给-RTW
来告诉 GMT 将台湾地图偏移0.5
度来实现快速偏移。
使用 GMT6 的带框台湾底图(图片由作者提供)
我们可以通过简单地指定地图边界而不是使用TW
作为区域来得到上面的图。这给了我们更多的绘图控制。
gmt begin taiwan pdf,png
gmt coast -R119/122.5/21.5/25.5 -Wthin -B
gmt end
在这里,您可能已经注意到,我们没有指定地图的任何投影。上面的图使用默认投影进行绘制。在科学中,出于大多数实际目的,我们使用墨卡托投影。要使用墨卡托投影,我们可以在-JM
之前告诉 GMT 我们想要它,然后我们可以指定地图的宽度,-JM15c
例如,对于 15 厘米的地图。
给土地和水填充颜色
接下来,我们可以填充一些颜色到地图上,使它更有吸引力。
gmt begin taiwan png
gmt coast -R119/122.5/21.5/25.5 -Wthin -B -JM15c -Gbeige -Slightblue
gmt end
我们用-G
指定土地的颜色,用-S
指定水彩。您可以在“获取颜色”列表中查找更多颜色。简单地运行命令gmt docs gmt colors
。
带有陆地和海洋颜色的台湾底图(图片由作者提供)
地图的插图
现在,让我们试着在上面的图上画另一张地图作为插图。我想把插图放在地图的左上角,宽度为 4 厘米。在插图中,我想在世界地图上展示台湾。
gmt begin taiwan png
gmt coast -R119/122.5/21.5/25.5 -Wthin -B -JM15c -Gbeige -Slightblue
gmt inset begin -DjBL+w4c+o0.2c -M0 -F+gwhite+pthick
gmt coast -Rg -JG120.5/23.5/4c -Gbeige -Slightblue -B -ETW+gred
gmt inset end
gmt end
让我们看一下上面代码的每一部分。我们通过使用“上下文管理器”gmt inset begin
开始插图,并在脚本的插图子部分结束插图。我们使用-Dj
指定我们想要使用对齐方法来指定插入的位置,并将位置设置为“左下角”(BL
)。我们想要宽度为 4 厘米、偏移量为 0.2 厘米的地图。此外,我们指定,我们不想要空白(M0
)和框架的背景是白色的,框架边界与粗线。
我们用和以前一样的方法在插图中绘制海岸线地图。此外,我们告诉 GMT 用红色突出显示台湾(-ETW+gred
)。
嵌入世界地图的台湾彩色地图(图片由作者提供)
GMT 中的支线剧情
现在,让我们看看如何使用 GMT 来制作带有多个支线剧情的图形。
gmt begin subplotMap png
gmt subplot begin 2x2 -Ff16c/25c -M0 -A
#figure a
gmt coast -R119/122.5/21.5/25.5 -BNWse -Wthin -Gbeige -Slightblue #figure b
gmt coast -R119/122.5/21.5/25.5 -BswNE -Wthin -Gbeige -Slightblue -c
gmt grdcontour @earth_relief_01m -Wared -Wcthinnest,blue -C1000 -A2000 #figure c
gmt coast -R119/122.5/21.5/25.5 -BnWSe -Wthin -Gbeige -Slightblue -c
gmt grdcontour @earth_relief_01m -LP -Wared -C1000 -A2000
gmt grdcontour @earth_relief_01m -Ln -Wablue -C2000 -A4000 #figure d
gmt coast -R119/122.5/21.5/25.5 -BSwne -Wthin -Gbeige -Slightblue -c
gmt makecpt -Cabyss -T-10000/0 gmt coast -Sc #clip out the land part
gmt grdimage @earth_relief_01m -C -I+d
gmt coast -Q
gmt colorbar -DJBC -B2000
gmt makecpt -Cgeo -T0/5000
gmt coast -Gc
gmt grdimage @earth_relief_01m -C -I+d
gmt coast -Q
gmt colorbar -DJRR -B1000
gmt subplot end
gmt end
四人台湾支线剧情图。(a)台湾彩色底图(b)带等高线的台湾地图带等高线的台湾地图-陆地和海洋分别绘制(d)台湾地形图(图片由作者提供)
现在让我们看一下上面的脚本。
我用 4 个支线剧情(2 x 2)绘制了支线剧情。我可以通过简单地输入2x2
来指定。每个子情节的尺寸由参数-Ff16c/25c
指定。我们要求每个支线剧情宽 16 厘米,长 25 厘米。通过参数-A
,我们要求 GMT 自动注释支线剧情。可以使用-c
参数指定到下一个子情节的导航。
接下来,我在支线剧情里做了四个数字。
图(a)只是我们在上一节中所做的,但是这里我们只在顶部和左侧放置了刻度线。
在图(b)中,我们绘制了分辨率为 1m 的地形等高线。我们用红色绘制了带注释的等高线,用蓝色绘制了常规等高线。规则等高线以最细的线宽绘制。每隔 1000 米绘制一次等高线,每隔 2000 米进行一次标注。
在图中,我们分离了陆地和海洋部分的等高线。这可以简单地用参数-L
后跟P
或N
来指定。P
代表阳性,N
代表阴性。大写字母包含 0,反之亦然。因此,我们用红色绘制了正的标注等高线,用蓝色绘制了负的标注等高线。
在图(d)中,我们用两个色带绘制地形图。对于该图,我们也从海岸线开始(注意,这不是必需的,您可以简单地跳到下一步)。然后我们基于abyss
标准色图创建了我们的自定义色图,但是指定了-10000
到0
之间的范围。然后我们剪下陆地部分,并为海洋部分绘图。接下来,我们做了同样的事情,剪去了海的部分,我们用不同的颜色绘制了陆地的部分。最后,我们分别为陆地和海洋部分绘制色带,一个在bottom-center
处,另一个在右角。
结论
人们可以用 GMT 做更多的事情。我会在以后的文章中尝试解决这个问题。更多 GMT 相关的例子,可以看看我博客里的其他帖子。我希望这篇教程能在你的努力中派上用场。
https://www.earthinversion.com/utilities/High-quality-maps-using-the-modern-interface-to-the-Generic-Mapping-Tools/
参考
- GMT 网站
- 2020 大地测量学通用制图工具(GMT)短期课程
- 大地测量通用制图工具
原载于 2021 年 4 月 2 日【https://www.earthinversion.com】。
自然语言处理中使用变形器的高质量句子解释器
原文:https://towardsdatascience.com/high-quality-sentence-paraphraser-using-transformers-in-nlp-c33f4482856f?source=collection_archive---------6-----------------------
在定制数据集和 T5 大型模型上训练的开源解释工具
作者图片
注意:这个解释器被训练来解释简短的英语句子,最适合这些输入。
投入
我们程序的输入将是任何英语句子
**Four private astronauts launched to orbit by Elon Musk’s SpaceX returned to Earth Saturday evening, splashing down into the ocean off the east coast of Florida after a three-day mission.**
输出
输出将是转述版本的同一句话。解释一个句子意味着,你创造一个新的句子,用一个不同的词语选择来表达与 T4 相同的意思。
**After a three-day mission, four private astronauts sent by Elon Musk's SpaceX returned to Earth on Saturday evening, splashing down into the ocean off the east coast of Florida.**
实际使用案例
从重写你以前的社交媒体文章到大学论文,当你没有很多文本分类模型的例子时,有几个解释器的用例。
资料组
作为构建 Questgen.ai 的一部分,我们创建了一个在 ParaNMT 之上过滤的自定义数据集,以仅保留多样化的高质量释义。
这里的多样性意味着句子对的选择使得在词序上有显著的差异,或者至少转述输出由于多个单词变化而不同。
怎么用?
如果你喜欢易于使用的谷歌 Colab 笔记本,可以在 Questgen 的 Github Repo 找到。
1.装置
**!pip install transformers==4.10.2
!pip install sentencepiece==0.1.96**
2.运行代码
我们将使用上传到 HuggingFace Transformers 库中心的预训练模型来运行解释器。我们将使用不同的波束搜索解码策略,为释义输出提供最佳结果。
更多的例子可以在上面提到的 Google Colab 演示中找到。
from transformers import AutoTokenizer, AutoModelForSeq2SeqLMmodel = AutoModelForSeq2SeqLM.from_pretrained("**ramsrigouthamg/t5-large-paraphraser-diverse-high-quality**")
tokenizer = AutoTokenizer.from_pretrained("**ramsrigouthamg/t5-large-paraphraser-diverse-high-quality**")import torch
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print ("device ",device)
model = model.to(device)**# Diverse Beam search**context = "**Once, a group of frogs was roaming around the forest in search of water.**"
text = "paraphrase: "+context + " </s>"encoding = tokenizer.encode_plus(text,max_length =128, padding=True, return_tensors="pt")
input_ids,attention_mask = encoding["input_ids"].to(device), encoding["attention_mask"].to(device)model.eval()
diverse_beam_outputs = model.generate(
input_ids=input_ids,attention_mask=attention_mask,
max_length=128,
early_stopping=True,
num_beams=5,
num_beam_groups = 5,
num_return_sequences=5,
diversity_penalty = 0.70)print ("\n\n")
print ("Original: ",context)
for beam_output in diverse_beam_outputs:
sent = tokenizer.decode(beam_output, skip_special_tokens=True,clean_up_tokenization_spaces=True)
print (sent)
上述代码的输出是:
原文:有一次,一群青蛙在森林里四处游荡寻找水源。一群青蛙在森林里四处游荡寻找水源。一群青蛙在森林里四处游荡寻找水源。一次,一群青蛙在森林里四处游荡寻找水源。一群青蛙在森林里游荡寻找水源。一群青蛙在森林里四处游荡,再次寻找水源。
就是这样!你有一个高质量的最先进的句子解释器,你可以在你的项目中使用。需要注意的是,转述者的输出并不总是完美的,因此人在回路中的系统可能是必要的。
祝 NLP 探索愉快,如果你喜欢它的内容,请随时在 Twitter 上找到我。
如果你想学习使用变形金刚的现代自然语言处理,看看我的课程使用自然语言处理的问题生成
高质量的世界范围的增强现实越来越*了——部分是因为机器学习
原文:https://towardsdatascience.com/high-quality-world-scale-augmented-reality-is-getting-closer-partially-because-of-machine-975a68fa6fe5?source=collection_archive---------25-----------------------
美国宇航局在 Unsplash 拍摄的照片
由于 GPS 的不精确和定位,在我们的物理世界上覆盖一个数字世界一直是很困难的。
增强现实介绍
广义而言,日常消费者创建并随后使用了两种类型的增强现实(AR)。
第一种类型是 AR,它检测你附*的物体,从中产生数字物体/世界。这可以是从*面检测到图像目标的任何东西,其中您已经设置了在满足检测标准后如何产生游戏对象的参数。
在谷歌 ARCore 教程 (CC BY 4.0)中的*面检测(绿色和紫色网格)和从 HelloAR 衍生的 Android
在这里你可以看到图片和模型被放置在 Unity 游戏引擎中。当你的手机检测到图像时,这些模型就会产生
最受欢迎的是,这第一种 AR 使用面部识别来给你提供你在 Snapchat、Instagram 甚至 Zoom 上看到的众多滤镜。Spark AR 是一个很棒的库,可以用你的 PC/Mac 相机来玩这个。你可以在这里看到用于 Snapchat AR 滤镜的面部网格,类似于它在 Instagram 或任何其他具有过滤功能的*台上的使用方式。
第二种形式的 AR 检测你的物理位置,并在其上覆盖一个缩放的、预先构建的数字世界。这通常被称为世界规模的 AR 。这方面最好的直接例子是 Pokemon GO,其中特殊事件、pokestops 和健身房将显示在特定的地理坐标上。你去那里,调出第一人称视角,然后做你的事。但是,世界规模的 AR 计划并不局限于游戏,它们包括室内导航和多人单次 AR 活动的圣杯等用例。
通过地图框进行室内导航,图片来自媒体文章
尚未发布的 Niantic 多人 AR 游戏 Neon 的测试片段
世界规模的 AR 有什么难的?
如果你有敏锐的眼光,我相信你已经注意到最后两帧中的某些东西似乎有点不对劲。物品的放置和标记并没有完全符合它们应该达到的水*——这就让我们想到了为什么 AR 还没有完全达到它应该达到的水*:数字和物理世界的一致。
假设我在洛杉矶,正在寻找我停车的地方。我有一个应用程序 FindMyCar,当我打开相机时,它会指向我最初停车时放下书签的地方。信号可能不太好,所以我的全球定位系统显示我正朝向我实际朝向的东方 10 度。现在在应用程序中,我面前的数字汽车标记现在将移动 10 度,并且物体越远,情况越糟。
作者图片,谷歌数学
所以,如果我在找我停车的地方,那就没什么用了。这也是其他两个应用程序在早期照片中似乎关闭的原因。对于一些像 Pokemon GO 这样的世界范围的应用程序,位置可以稍微偏一点,因为如果 Charizard 稍微偏左或偏右,不会影响你的沉浸感。沉浸感对用户体验和应用程序的有用性都非常重要。
如果你想看看 Matthew Halberg 如何在 2017 年试图建立一个基于户外导航/文本的 AR 应用程序,并对遇到的问题进行更深入的解释,请在这里查看他的旧视频。回购是不赞成现在,所以不要费心尝试启动它。
世界规模的 AR 的第二大问题是本地化——或者通俗地说,检测你周围的世界,并与你在数字世界中的位置同步(想想 x 和 y 位置)。在上面的例子中,这相当于距离我实际所在的位置大约 200 英尺,使失调误差更大。这通常也需要时间,你必须将手机指向你周围的不同方向,以帮助检测足够多的表面来催生数字世界。
对我们来说幸运的是,多年来聪明的工程师和产品团队解决这个问题已经带来了很多有趣的解决方案。
变大还是变小
正如生活、商业和技术中的许多问题一样,人们要么试图一次解决所有问题,要么从整体中分离出一部分。这个问题的处理方式没有什么不同。
我们的第一个方法是“让我们以 1:1 的比例开始建造这个房间”的方法,本质上是创建这个房间中所有物品的完美克隆,以创建一个不受地理位置限制的无缝体验。第二种方法是“世界数字克隆”方法,它专注于将数字体验从地理上映射到现实世界。
让我们更深入地研究这两种方法:
重建您的房间,体验您的房间
比方说,我正在为新生计划一次寻宝游戏,以帮助他们更好地适应校园主楼。如果我有十组学生,我可以隐藏十组物品或找到一百个隐藏点——或者我可以在 AR 中建立一个更有趣和可扩展的体验!
在室内寻宝游戏中,为了获得准确的体验,我们需要的不仅仅是一个云锚。那么,如果我们先把所有的提示和隐藏物品放在建筑物的数字模型中,会怎么样呢?
你可以走进 Blender,手动精心制作每个房间(和里面的家具)的模型——或者我们可以将物体扫描成点云/数字网格。几年前,6D.ai 的团队使用手机在 3 分钟内扫描了他们的办公室,生成了以下网格:
看原视频这里
显然,它并不完美,物体的边缘越粗糙或越细致,就越难扫描。幸运的是,用户永远不会看到这个扫描——它只是用于本地化。假设我们为校园建筑做了这些,当学生在任何房间内启动应用程序时,应用程序将尝试扫描周围环境,并将自己放置在数字模型中。通过人工智能和激光雷达等景深传感器的结合,手机将快速扫描周围环境,并“识别”学生站在哪里。然后,无论我们把寻宝游戏的提示和物品放在哪里,它们都会出现在屏幕上——没有杂乱的扫描网。
2020 年发布的 iPad Pro 配备了激光雷达,为更快的*面检测和 AR + ML 应用的定位打开了大门。
实时扫描内摄像机范围内的一切。
因此,现在我们有了建立数字模型以及在该模型中定位用户的解决方案,但我们需要一个*台来建立完整的寻宝游戏(放置物品、提示和各种交互)。Unity 是一个强大的游戏引擎,最*专注于建立一套跨机器学习和 VR/AR 的更多样化的应用程序。最*推出的一个功能叫做 Unity AR Mars ,专为特定空间的活动打造,比如我们已经详述的寻宝游戏。
在这里我们看到了房间的数字模型和在顶部放置的互动对象。当用户打开应用程序时,只会看到该对象。
但是如果我想在整个校园里创建一个寻宝游戏呢?扫描包括户外在内的所有东西是不可行的,而且有些房间看起来可能非常相似。我们需要在应用程序中融入地理信息。
最好用别针别住它,快点
您是否曾针对您所在的特定事件或地点使用过 Snapchat 过滤器?这些基本上是作为一个可用的地理区域来实现的,也称为“栅栏”。
这是 Snapchat 网站上的一个截图,你可以自己试试这里
然而,对于需要精确定位的 AR 应用程序来说,绘制围栏不起作用——在停车场上设置围栏并不能帮助我找到我的车。在这种情况下,我们需要使用云锚来代替。
老实说,云锚设置起来还是有点笨拙,因为文档和好的例子都很分散。然而,旧主播只能持续一天,而现在新主播可以持续一年!本质上,您正在扫描一个区域(比如一个雕像),然后将它附加到一个地理点(在纬度和经度坐标中)。对于一个更微妙的实现,查看谷歌的解释者这里。
为了帮助放置锚点,特别是如果像 Pokemon GO 那样由算法驱动,可以通过管理适当位置的数据集来找到合理的放置。Niantic 已经利用来自 wayfarer 等应用和倡议的数据做到了这一点,最终形成了一个“最全面的数据集,包含数百万个世界上最有趣、最容易玩游戏的地方,这些地方几乎都是用户生成的( 来源 )。
两全其美
虽然这些方法解决了不同的问题,但最终它们会在构建像寻宝游戏这样的新 AR 应用程序时结合使用。让我们快速看一下实现中的两个例子:
口袋妖怪 GO 前面已经提到过了,尽管这主要是一种共享游戏状态的单人 AR 体验。Niantic 即将推出的游戏代号:城市传说确实包含了多人游戏(可能是从前面提到的 Neon 开发的)。
Superworld 是区块链(以太坊)上的一款房地产应用,每块土地都可以在上面建立 AR 体验。这意味着每个地块都将有自己的云锚,从视频和海报到 3D 动画模型的一切都可以由地块所有者放置在它周围的数字覆盖中。
作者截图来自超世界手机 app
构建这一切的合理堆栈可以是 Unity 作为游戏引擎,Mapbox 用于地理数据/模型,AR Core 用于云锚 API,6D.ai(现在是 Niantic 的一部分)用于扫描。本地化在很大程度上取决于硬件(你的手机有景深能力吗,它能处理 5G 吗,量化模型与完整模型的优化,因为云端点会太慢)。
我们将何去何从?
最终,我们希望准确快速地覆盖数字世界。这确实是一个艰难的要求,但回报将是值得的努力和等待。随着 GPS、5G 和电话硬件以及 AR 工程工具的未来改进,我绝对迫不及待地想在未来体验和构建世界规模的 AR 应用。
通过“完美”从高方差到高偏差
原文:https://towardsdatascience.com/high-variance-to-high-bias-via-perfection-fd69de3a1237?source=collection_archive---------21-----------------------
过拟合和欠拟合是非常常见的问题,我们已经指定了处理它们的方法和工具。虽然,所有方法背后的基础科学是相同的,也值得一提。
伊莎贝拉和路易莎·菲舍尔的照片在 Unsplash
数据科学社区获得了许多托管大量预测建模问题的*台。这简化了初学者在这一领域超越和达到熟练程度的途径。我们不打算谈论这些*台,而是谈论一些让我们结束训练“最优模型之旅的东西。术语“最佳”在这里意味着模型的精度类似于基础精度。
我们在训练模型时面临的最常见问题是数据的过拟合和欠拟合。在某种程度上,我们有能力控制它,但深度学习中的这些能力没有被我们大多数人发现。然而,这篇文章不仅仅是关于处理数据问题的方法,而是关于为什么这些技术如此强大以及它们在后台做什么。
为了顺利开始,让我们定义一些用于从一组图像中对狗进行分类的预测建模问题的术语。
模型性能类型的不同术语(由作者出版)
我们假设基本误差为零,因为人类可以识别误差为 0%的狗。或者在它的附*。要理解这篇文章,有必要熟悉这些术语(先决条件!!).
要深入了解这些术语,让我们看看这些模型所映射的决策边界或函数因为: 要解决任何问题,都需要先了解它。
有一个小假设,我们只有两个特征,这将有助于我们在 2-D *面中绘制数据点。
描述数据拟合不同问题的三种不同模型的决策边界(由作者发布)
最佳模型
该模型精确地拟合了给定的数据点,并且还包含了数据中的噪声。这个模型所映射的函数既不复杂也不简单。让我们假设它相当于一个抛物线函数,其中训练和测试集误差也相当于基本误差。
欠拟合
当训练集误差和测试集误差远离基本误差时,就说模型对数据拟合不足。由该模型映射的函数作为线性函数相当简单,因此没有抛物线函数复杂。
过度拟合
当测试集误差远离基本误差,而训练集误差远离基本误差时,则该模型被认为过拟合了数据。这个模型映射了一个比抛物线更复杂的函数。
这些对映射函数的观察对于理解数据问题至关重要。在深度神经网络中,我们有几个超参数要调整。一些超参数,例如隐藏层的数量和隐藏层中隐藏单元的数量,决定了模型在给定数据点上映射的函数的复杂性。
让我们假设我们已经训练了一个非常深的神经网络,并且我们有过拟合数据的条件,并且正在使用 L2 正则化技术来达到最佳拟合。
L2 正则化
我们的价值成本函数如下
二元分类问题的梯度下降中定义的代价函数(由作者发表)
其中 J 是成本函数,带上限的 y 是预测值,y 是第个训练示例的目标特性的实际值。在 L2 正则化中,我们在代价函数中增加了一个正则项。所以,J 变成了-
带有正则项的成本函数(由作者发表)
其中λ被称为正则化参数,因此是另一个超参数,求和项是权重矩阵的 L2 范数的*方。上图给出了 L2 范数的定义。
为了理解这个正则项的影响,让我们计算梯度,这是在反向传播过程中计算的。
反向传播步骤中计算的权重梯度(由作者发表)
“反向投影项对应于成本函数相对于权重矩阵的导数。我们可以假设,对于梯度下降的特定迭代,它将保持不变。添加正则项的含义是在关于λ和m的 dW 的定义中添加新项。现在,如果我们更新参数,我们将具有以下含义:
更新权重(由作者发布)
可以直接推断出,当我们应用 L2 正则化时,我们正在减少或最小化 w 中的元素。在大多数处理高方差等问题的方法中,我们正在减少权重。这就是为什么它也被称为“重量控制”过程。
如果我们有一个非常深的神经网络,有许多隐藏层和隐藏单元,那么它将倾向于过度拟合数据。一旦我们应用 L2 正则化,我们就间接地将一些隐藏单元的权重降低到接*零,但不完全为零。
现在假设我们有一个如下的密集神经网络,我们应用 L2 正则化,几乎关闭了一些隐藏单元。
在成本函数中添加正则项后关闭的神经元(由作者发表)
这是一个完全关闭一些神经元的极端条件,但将有助于我们理解 L2 正则化的含义。现在剩下的神经网络可以组合如下-
多个连续的神经单元可以由单个神经单元代替。(作者发布)
这是可能的,因为每个神经元随着权重和偏差线性变化,如果我们在另一个线性函数中输入一个线性函数,那么得到的函数也是线性的。最终,我们只是改变了线性函数的常数。
这种极端情况意味着,当我们应用 L2 正则化技术时,从一个非常复杂的函数(由密集的神经网络生成),我们得到了一个非常不复杂的线性函数。换句话说,从一个模型过拟合数据到一个模型欠拟合数据,或者从一个具有高 方差的模型到一个具有高偏差的模型。
另一个观察结果是,我们问题的最佳解决方案位于我们从过度拟合到欠拟合数据的路径之间。这个目标可以通过调整超参数 lambda 轻松实现(不那么容易,因为调整超参数需要耐心)。
通过“完美”(由作者发表)从高方差到高偏差
还有其他正则化技术,如反向丢弃(或简单丢弃)正则化,它们随机关闭神经单元。所有这些正则化技术都在做同样的工作,即最小化成本函数或映射函数的复杂度。
“提前停止”方法述评
“早 停”是另一种常用的避免数据过拟合的方法。在这种方法中,我们定义了一个训练集和一个测试或开发集,并观察了这两个集上的成本函数在迭代次数方面的变化。
随着迭代次数的增加,训练集中的错误会减少,但是测试集中的变化是显著的。它首先下降,显示成本值的增加,表明数据过度拟合的开始。
训练和测试集的成本随迭代次数的变化(由作者发布)
这种方法可能不太准确,因为我们有两个不同的任务,一是优化成本函数 J,二是防止过拟合。这两项任务必须分开解决。“提前停止”同时完成了这两个任务,因此它有效地优化了成本函数。
通过使用其他技术作为正则化,您将能够更加自信和准确地优化您的成本函数。
常见的解决方案
解决这两个问题的常用方法是提供更多的训练数据集。有时候,获取更多的训练数据可能代价很高。但是,有一些方法,如数据扩充,可以生成更多的训练数据集。
例如,我们可以通过随机缩放、裁剪或翻转图像,从预先存在的图像生成新图像。
数据扩充(原始照片由维克多·格拉巴奇克在 Unsplash 上拍摄)
总结
我们已经看到了如何在从高方差到高偏差模型的过程中达到最优模型。
然而,我们应该注意,L2 正则化将权重衰减到接*零,但不完全为零,而在丢弃正则化中,我们随机关闭一些单元。
除正则化之外,还有各种技术,如归一化、梯度检查等,可帮助您优化成本函数并防止数据过度拟合,但所有这些方法都在同一个框中,即它们都降低了成本函数或模型在数据点上映射的函数的复杂性。一旦复杂度降低到一定限度,就可以找到最优解。
Spark 3.1 的高阶函数
在 Spark SQL 中处理数组。
唐纳德·詹纳蒂在 Unsplash 上的照片
复杂的数据结构,如数组、结构和映射在大数据处理中非常常见,尤其是在 Spark 中。每当我们希望在一列中表示每行上的多个值时,就会出现这种情况,在数组数据类型的情况下,这可以是一个值列表,在映射的情况下,这可以是一个键值对列表。
从 Spark 2.4 开始,通过发布高阶函数(Hof),对处理这些复杂数据类型的支持增加了。在本文中,我们将了解什么是高阶函数,如何有效地使用它们,以及在最*几个 Spark 和 3.1.1 版本中发布了哪些相关功能。对于代码,我们将使用 Python API。
继我们在上一篇文章中提到的聚合和窗口函数之后,HOFs 是 Spark SQL 中另一组更高级的转换。
让我们首先看看 Spark 提供的三种复杂数据类型之间的区别。
数组类型
l = [(1, ['the', 'quick', 'braun', 'fox'])]df = spark.createDataFrame(l, schema=['id', 'words'])df.printSchema()root
|-- id: long (nullable = true)
|-- words: array (nullable = true)
| |-- element: string (containsNull = true)
在上面的示例中,我们有一个包含两列的数据帧,其中列 words 是数组类型,这意味着在数据帧的每一行上,我们可以表示一个值列表,并且该列表在每一行上可以有不同的大小。此外,数组的元素是有顺序的。重要的属性是数组在元素类型方面是同质的,这意味着所有元素必须具有相同的类型。要访问数组的元素,我们可以使用如下的索引:
df.withColumn('first_element', col('words')[0])
结构类型
StructType 用于将一些可能具有不同类型(不同于数组)的子字段组合在一起。每个子字段都有一个类型和一个名称,并且对于数据帧中的所有行都必须相同。可能出乎意料的是,一个结构中的子字段是有顺序的,所以比较两个具有相同字段但顺序不同的结构 s1==s2 会导致 False 。
请注意数组和结构之间的基本区别:
- 数组:类型相同,允许每行有不同的大小
- 结构:类型异构,每行都需要相同的模式
地图类型
您可以将 map 类型视为前面两种类型的混合:array 和 struct。设想这样一种情况,每一行的模式都没有给出,您需要在每一行上支持不同数量的子字段。在这种情况下,您不能使用 struct。但是使用数组对您来说并不是一个好的选择,因为每个元素都有一个名称和一个值(它实际上是一个键-值对),或者因为元素有不同的类型——这是 map 类型的一个很好的用例。使用 map 类型,您可以在每一行上存储不同数量的键-值对,但是每个键必须具有相同的类型,并且所有的值都必须是相同的类型(可以与键的类型不同)。配对的顺序很重要。
变换数组
在我们开始讨论转换数组之前,让我们先看看如何创建一个数组。第一种方法我们已经在上面看到了,我们从一个本地值列表中创建了数据帧。另一方面,如果我们已经有了一个数据帧,我们想将一些列组成一个数组,我们可以使用函数 array() 来实现这个目的。它允许您从其他现有的列中创建一个数组,因此如果您有列 a 、 b 、 c ,并且您希望将值放在一个数组中,而不是放在单独的列中,您可以这样做:
df.withColumn('my_arr', array('a', 'b', 'c'))
除此之外,还有一些函数产生一个数组作为转换的结果。例如,函数 split( ) 会将一个字符串拆分成一个单词数组。另一个例子是collect _ list()或collect _ set(),它们都是聚合函数,也会产生一个数组。
实际上,将数组放入数据帧的最常见方式是从支持复杂数据结构的数据源(如 Parquet)读取数据。在这种文件格式中,一些列可以存储为数组,因此 Spark 自然也会将它们读取为数组。
现在,当我们知道如何创建一个数组时,让我们看看数组是如何转换的。
从 Spark 2.4 开始,有大量的函数用于数组转换。有关它们的完整列表,请查看 PySpark 文档。例如,所有以 array_ 开头的函数都可以用于数组处理,您可以找到最小-最大值、对数组进行重复数据删除、排序、连接等等。接下来,还有concat()flatten()shuffle()size()【slice()sort _ array()。正如你所看到的,API 在这方面已经相当成熟,你可以用 Spark 中的数组做很多操作。
除了上述这些函数,还有一组函数将另一个函数作为参数,然后应用于数组的每个元素,这些函数被称为高阶函数(Hof)。了解它们很重要的一点是,在 Python API 中,从 3.1.1 开始就支持它们,而在 Scala API 中,它们是从 3.0 开始发布的。另一方面,对于 SQL 表达式,从 2.4 开始就可以使用了。
要查看一些具体示例,请考虑以下简单的数据框架:
l = [(1, ['prague', 'london', 'tokyo', None, 'sydney'])]df = spark.createDataFrame(l, ['id', 'cities'])df.show(truncate=False)+---+-------------------------------------+
|id |cities |
+---+-------------------------------------+
|1 |[prague, london, tokyo, null, sydney]|
+---+-------------------------------------+
假设我们想要完成这五个独立的任务:
- 将每个城市的首字母转换成大写。
- 去掉数组中的空值。
- 检查是否有以字母 t 开头的元素。
- 检查数组中是否有空值。
- 对数组中每个城市的字符数(长度)求和。
这些是可以用 HOFs 解决的问题的一些典型例子。所以让我们一个一个来看:
改变
对于第一个问题,我们可以使用 transform HOF,它只是采用一个匿名函数,将它应用于原始数组的每个元素,并返回另一个转换后的数组。语法如下:
df \
.withColumn('cities', transform('cities', lambda x: initcap(x))) \
.show(truncate=False)+---+-------------------------------------+
|id |cities |
+---+-------------------------------------+
|1 |[Prague, London, Tokyo, null, Sydney]|
+---+-------------------------------------+
如您所见, transform() 有两个参数,第一个是需要转换的数组,第二个是匿名函数。在这里,为了实现我们的转换,我们在匿名函数中使用了 initcap() ,它被应用于数组的每个元素——这正是转换 HOF 允许我们做的。对于 SQL 表达式,可以按如下方式使用:
df.selectExpr("id", "TRANSFORM(cities, x -> INITCAP(x)) AS cities")
注意,SQL 中的匿名函数是用箭头(->)符号表示的。
过滤器
在第二个问题中,我们希望从数组中过滤出空值。这一点(以及任何其他过滤)可以使用 过滤器 HOF 来处理。它允许我们应用一个匿名函数,该函数对每个元素返回布尔值( True / False ),并且它将返回一个新数组,该数组只包含该函数返回 True 的元素:
df \
.withColumn('cities', filter('cities', lambda x: x.isNotNull())) \
.show(truncate=False)+---+-------------------------------+
|id |cities |
+---+-------------------------------+
|1 |[prague, london, tokyo, sydney]|
+---+-------------------------------+
这里,在匿名函数中我们调用 PySpark 函数 isNotNull() 。SQL 语法如下所示:
df.selectExpr("id", "FILTER(cities, x -> x IS NOT NULL) AS cities")
存在
在下一个问题中,我们希望检查数组是否包含满足某些特定条件的元素。请注意,这是一个更一般的例子,在这种情况下,我们希望检查某个特定元素的存在。例如,如果我们想检查数组是否包含城市布拉格,我们可以只调用array _ contains函数:
df.withColumn('has_prague', array_contains('cities', 'prague'))
另一方面, 存在 HOF 允许我们对每个元素应用更一般的条件。结果不再是像前两个 Hof 那样的数组,而只是真 / 假:
df \
.withColumn('has_t_city',
exists('cities', lambda x: x.startswith('t'))) \
.show(truncate=False)+---+-------------------------------------+----------+
|id |cities |has_t_city|
+---+-------------------------------------+----------+
|1 |[prague, london, tokyo, null, sydney]|true |
+---+-------------------------------------+----------+
这里在匿名函数中,我们使用了 PySpark 函数【starts with()。
FORALL
在第四个问题中,我们希望验证数组中的所有元素是否都满足某些条件,在我们的示例中,我们希望检查它们是否都不为空:
df \
.withColumn('nulls_free',forall('cities', lambda x: x.isNotNull()))\
.show(truncate=False)+---+-------------------------------------+----------+
|id |cities |nulls_free|
+---+-------------------------------------+----------+
|1 |[prague, london, tokyo, null, sydney]|false |
+---+-------------------------------------+----------+
正如你所看到的,对于所有的 来说 与存在非常相似,但是现在我们正在检查条件是否对所有的元素都成立,之前我们至少要寻找一个。
总计
在最后一个问题中,我们希望对数组中每个单词的长度求和。这是一个例子,我们希望将整个数组简化为一个值,对于这种问题,我们可以使用 HOF 聚合 。
df \
.withColumn('cities', filter('cities', lambda x: x.isNotNull())) \
.withColumn('cities_len',
aggregate('cities', lit(0), lambda x, y: x + length(y))) \
.show(truncate=False)+---+-------------------------------+----------+
|id |cities |cities_len|
+---+-------------------------------+----------+
|1 |[prague, london, tokyo, sydney]|23 |
+---+-------------------------------+----------+
使用 SQL:
df \
.withColumn("cities", filter("cities", lambda x: x.isNotNull())) \
.selectExpr(
"cities",
"AGGREGATE(cities, 0,(x, y) -> x + length(y)) AS cities_len"
)
如你所见,与之前的 HOFs 相比,语法稍微复杂了一些。集合接受更多的参数,第一个仍然是我们想要转换的数组,第二个参数是我们想要开始的初始值。在我们的例子中,初始值是零( lit(0) ),我们将把每个城市的长度加进去。第三个参数是匿名函数,现在这个函数本身有两个参数——第一个参数(在我们的例子中是 x )是运行缓冲区,我们将第二个参数表示的下一个元素的长度(在我们的例子中是 y )添加到这个缓冲区中。
可选地,可以提供第四个参数,这是另一个转换最终结果的匿名函数。如果我们想要进行更复杂的聚合,这是很有用的,例如,如果我们想要计算*均长度,我们需要保留大约两个值,即 sum 和 count ,我们将在最后的转换中对它们进行如下划分:
(
df
.withColumn('cities', filter('cities', lambda x: x.isNotNull()))
.withColumn('cities_avg_len',
aggregate(
'cities',
struct(lit(0).alias('sum'), lit(0).alias('count')),
lambda x, y: struct(
(x.sum + length(y)).alias('sum'),
(x.count + 1).alias('count')
),
lambda x: x.sum / x.count
)
)
).show(truncate=False)+---+-------------------------------+--------------+
|id |cities |cities_avg_len|
+---+-------------------------------+--------------+
|1 |[prague, london, tokyo, sydney]|5.75 |
+---+-------------------------------+--------------+
如您所见,这是一个更高级的示例,我们需要在聚合过程中保留两个值,我们使用具有两个子字段 sum 和 count 的 struct() 来表示它们。使用第一个匿名函数,我们计算所有长度的最终总和,以及元素总数。在第二个匿名函数中,我们只是将这两个值相除,得到最终的*均值。还要注意,在使用 aggregate 之前,我们首先过滤掉空值,因为如果我们在数组中保留空值,总和(以及*均值)将变成空值。
要查看聚合 HOF 与 SQL 表达式一起使用的另一个示例,请检查 this Stack Overflow 问题。
除了前面提到的这五个 Hof,还有 zip_with 可以用来将两个数组合并成一个数组。除此之外,还有其他的 Hof,如 map_filter , map_zip_with ,transform _ keys,以及transform _ values与地图一起使用,我们将在以后的文章中了解它们。
结论
在本文中,我们介绍了高阶函数(Hof ),这是 Spark 2.4 中发布的一个特性。首先,只有 SQL 表达式支持它,但是从 3.1.1 开始,Python API 也支持它。我们已经看到了五个 Hof 的例子,它们允许我们在 Spark 数组中转换、过滤、检查存在性和聚集元素。在 HOFs 发布之前,大多数问题都必须使用用户定义的函数来解决。然而,HOF 方法在性能方面更有效,要查看一些性能基准,请参见我最*的另一篇文章,其中显示了一些具体的数字。
2021 年数据+人工智能峰会亮点💥
崇高的紫色夜空。【数码影像】https://unsplash.com/@文森特
又来了,我最喜欢的免费数据会议之一!这个名字已经被重新命名为更好。最初是“火花峰会”,后来是“火花+AI 峰会”,现在是“数据+AI”峰会。Databricks 现在提供几个产品,它不再仅仅被认为是“火花公司”。我下面谈论的很多内容与我去年的重点在这里的趋势相同。但是 Databricks 今年发布了很多有趣的产品!
增量共享
这个新的 Databricks 产品被定义为业界第一个安全数据共享的开放协议。
随着公司转向多云以及云数据仓库的兴起,在数据可用性方面存在巨大挑战。数据工程师花费大量时间移动/复制数据,以便在不同的地方以经济高效和安全的方式访问和查询数据。
Delta sharing 旨在通过存储“once”并在任何地方读取它来解决这一问题。它使用中间件(增量共享服务器)在阅读器和数据提供者之间进行交流。
在我看来,理论上的 Delta 共享是自 Delta 格式以来最大的产品发布。然而,有一些问题值得一提:
- 尽管 Databricks 声称查询是优化的并且便宜,但我认为我们需要考虑出口/入口云的成本。如果数据接收者正在做一个没有优化的难看的查询,会发生什么?
- 只要全球采用,任何开放标准听起来都有希望。尽管如此,德尔塔显然比他们的其他酸性格式兄弟(如冰山和胡迪)更有吸引力,所以它绝对是最好的赌注。
Delta 活动表
另一个 Delta Databricks 产品!您可以从一个增量表中将它视为一个超级强大的“视图”,您可以使用纯 SQL 或 python 进行处理。您可以创建整个数据流,并基于单个增量活动表创建多个表。delta live 引擎足够智能,可以进行缓存和检查点操作,只处理需要的内容。
这非常有趣,因为在数据湖架构(原始/青铜/白银)中,不是将数据的多个副本视为经典的数据管道,而是有一个真实的来源。这使得清晰的谱系成为可能,因此也是转换的良好文档。
此外,因为数据质量很热门(见下文),Databricks 添加了他们自己的数据质量工具,带有声明性的质量期望。
Unity 目录
Databricks 正在推出自己的数据目录。数据目录是数据行业的另一个趋势。主要开源项目的开发(如阿蒙森、数据中心等)。)去年一直保持这个速度。与此同时,其他大型云提供商,如谷歌,也发布了他们自己的数据目录。最重要的是,随着公司越来越多地转向云计算战略,数据发现和治理成为一个更大的问题。
Databricks 用自己的目录解决的一个有趣的问题是,他们希望通过更高的 API 来简化数据访问管理。这是其他解决方案没有真正关注的,这是一个主要的优势,因为管理低级别的访问(例如基于文件的权限,如 s3 或 GCS)可能非常棘手。细粒度的权限是困难的,并且数据的布局并不真正灵活,因为它常常被像 Hive/Glue 这样的 metastore 所限制。
更多 python
数据档案(数据科学家、数据工程师、数据分析师、ML 工程师等)之间的最大共同点。)可能是 SQL,第二个可能是 python。根据 Databricks 的数据,如今大多数 spark API 调用都是通过 Python (45%)和 SQL (43%)完成的。
很明显,Databricks 希望缩小“笔记本电脑数据科学”和分布式计算之间的差距。降低准入门槛将使更多的用户从事人工智能,并为数据 SAAS 公司带来更多资金😉由于 python 被广泛采用,并且对初学者友好,所以投资 python 是有意义的。
大多数改进都被称为“禅计划”,其中包括:
- pyspark 日志的可读性
- 类型提示改进
- 更智能的自动完成提及
熊猫天生就有火花
如果你不熟悉考拉项目,它是 Apache Spark 之上的熊猫 API。考拉项目将通过 Spark 合并。只要有 spark 数据框,就有 pandas 数据框,无需进行显式转换。
当然,对于小数据用例,Spark 在独立的节点集群上仍然是一个开销,但是它可以在不改变代码库的情况下进行扩展,这非常方便。
构建低代码工具以使数据工程/数据科学民主化
令人难以置信的是,今年有这么多关于 ETL 管道和数据质量框架的讨论。这又是对我去年谈到的趋势的双重押注。许多公司希望降低数据工程的准入门槛,其动机是
- 通过 ETL 降低增加可重用性的复杂性
- 元数据和配置驱动的 ETL。配置可以作为数据流的文档
- 使 SQL 开发人员更容易编写生产就绪的管道,并扩大贡献者的范围。
结论
很高兴看到 Databrick 的产品目录不断增加。感觉他们更倾向于整合战略,而不是试图成为下一个你可以运行一切的*台(即使这也是他们正在销售的)。
但是,围绕 delta 的主要产品也依赖于供应商的采用,所以让我们看看数据社区采用它的速度有多快!
资源:
数据+AI 主题演讲,https://www.youtube.com/playlist?list = PLTPXxbhUt-ywquxdhuxgu 8 ehj 3 bjbhfe
迈赫迪·瓦扎又名迈赫迪欧·🧢
感谢阅读!🤗 🙌如果你喜欢这个,跟随我上🎥 Youtube ,✍️ 中型 ,或者🔗 LinkedIn 了解更多数据/代码内容!
支持我写作 ✍️通过加入媒介通过这个链接
来自数据+人工智能峰会 NA 2021 的亮点
原文:https://towardsdatascience.com/highlights-from-data-ai-summit-na-2021-f5320f5d0fd9?source=collection_archive---------36-----------------------
与 Apache Spark 新特性相关的数据+人工智能峰会笔记
照片由大卫·特拉维斯在 Unsplash 上拍摄
数据领域最大的会议之一— Data + AI Summit 北美 2021 上周发生了,这次我没有用自己的演讲做出贡献,但作为一名听众,我越来越喜欢这些会议。
在这篇简短的报告中,我想总结一下我在 Apache Spark 内部和最佳实践主题中讨论的 Spark 3.1 和即将推出的 3.2 中的新特性。
禅宗项目
Zen 项目开始于一年前,目标是让 Spark 对 Python 用户更加友好。
类型提示
其中一个步骤是添加类型提示,例如允许 ide 和笔记本环境中的自动完成,这样可以使开发更加高效。对类型提示的完全支持是在最新版本 3.1.1 中添加的。
星火上的熊猫
Spark 3.2 的一个新特性是将考拉项目集成到 Spark 中。考拉允许使用 Pandas API,同时将 Spark 作为后端,因此,如果数据科学家使用 Pandas 进行数据操作,并由于数据量大而遇到性能问题,那么很容易切换到考拉,代码保持不变,但在幕后,执行在 Spark 中进行。现在,当考拉将被集成到 Spark 中时,情况变得更加简单,你可以从 Spark 中导入熊猫并使用熊猫 API,同时在引擎盖下有 Spark。熊猫的绘图和可视化工具现在可以在 Spark 中使用了。
本次峰会讨论了 Zen 项目:
性能改进
随着 Spark 的每一次发布,发动机的性能都在不断提高。在峰会上,我们讨论了几个与绩效相关的话题:
混合散列连接(SHJ)
混合散列连接是 Spark 中用于连接数据的算法之一。在实践中,它被避免使用,取而代之的是更健壮的排序合并连接(SMJ)。如果数据不对称,并且其中一个分区太大,SHJ 会导致 OOM 错误。然而,在合理的情况下,SHJ 可以比 SMJ 执行得更快,因为它避免了这种情况。(关于 Spark 使用的算法和决策逻辑的更多细节,请参见我的相关文章关于 Spark 3.0 中的加入的文章
3.1 中实现了几项增强功能,使 SHJ 变得更好、更可用:
- 添加代码生成(参见吉拉)
- 支持完全外部连接(参见吉拉
- 保留分区(参见吉拉)
在这次首脑会议期间,讨论了 SHJ 的改进和其他改进:
- 深入了解 Apache Spark 3.1 的新特性
…向量化…
矢量化是一种同时处理多行以加快处理速度的技术。在 Spark 的当前版本中,当使用矢量化读取器从 parquet 和 orc 格式读取数据时,会使用矢量化。除此之外,PySpark 中的熊猫 UDF 也支持矢量化。
实现矢量化的一种方法是使用现代硬件支持的 SIMD 指令(单指令,多数据)。当前版本的 Spark 没有明确使用 SIMD,因为 JVM 中的 HotSpot 编译器在某些情况下会生成 SIMD 指令,但在某些情况下不会。然而,新的 Java 16 有 VectorAPI 可用,这个 API 可以确保 SIMD 指令被使用。因此,使用这个 VectorAPI ,可以在 Spark 中为生成的代码实现显式矢量化。本次峰会讨论了矢量化:
- 在 Apache Spark 中启用矢量化引擎
标准压缩编解码器
Apache Spark 支持各种压缩算法,例如,snappy 是将数据保存到 parquet 文件时使用的默认算法,另一方面,lz4 用于 shuffle 文件,也支持其他编解码器。ZStandard 是一种编解码器,可以实现与 gzip 相当的压缩速度和压缩比。
从 Spark 3.2 开始,ZStandard 将在三种情况下有用,它可以带来性能优势(节省本地磁盘空间和/或外部存储以及整体查询执行速度的提高):
- 事件日志压缩(spark . event log . compression . codec = zstd)
- 洗牌期间的 I/O 压缩(spark . io . compression . codec = zstd)
- 压缩 parquet/orc 文件spark . conf . set(" spark . SQL . parquet . compression . codec "," zstd")**
相关的首脑会议是:
- z standard 的崛起:阿帕奇 Spark/Parquet/ORC/Avro
随机播放增强
Spark 作业中的 Shuffle 通常是开销最大的过程,因为数据必须在集群的节点之间移动。shuffle 是两个阶段之间的界限,在一个阶段完成后,输出被写入文件,然后被提取到下一个阶段。文件保存在执行器的本地磁盘上,或者当使用外部混洗系统时,可以保存到外部存储系统,例如 HDFS。这些文件的数量随着任务的数量成二次方增长(更具体地说,它是上游阶段的任务数量乘以下游阶段的任务数量),并且这些文件可能变得相当小。有一个吉拉正在进行中,旨在实现所谓的基于推送的洗牌,通过预合并块来优化洗牌 I/O。关于这项技术的相关文章可以在这里找到。在这次首脑会议上讨论了这个主题本身:
- 磁铁洗牌服务:LinkedIn 上基于推送的洗牌
复杂查询计划处理
对于某些查询,查询计划可能会变得非常复杂,其编译可能会成为真正的瓶颈。有一个吉拉正在进行中,它试图简化处理带有别名的列的约束的过程,测试显示有希望加速。与这一主题相关的首脑会议是:
- 优化复杂计划的催化剂优化器
ANSI SQL 符合性
这是 spark 中正在进行的项目,在 3.0 版本中引入了实验性配置设置 spark.sql.ansi.enabled ,当设置为 True 时,Spark 将尝试符合 ANSI SQL 规范,这意味着如果输入无效,查询可能会在运行时失败,否则可能会返回空值。这方面的一个具体例子是无法安全转换或容易混淆的数据类型的转换。与此相关的一些新功能将在 3.2 中发布,例如, TRY_CAST , TRY_ADD , TRY_DIVIDE 如果用户希望使用 ANSI 模式,但如果输入无效而不是查询失败,则这些功能会很有用。
在 Spark 3.2 中,将发布两种新的间隔日期类型,年-月和日-时间,这将解决当前 CalendarIntervalType 存在的一些问题。正在进行的吉拉是相关子任务的保护伞。当前区间类型的问题是它不具有可比性,并且不支持排序,因此有两个区间我们无法比较它们并判断哪个更大。另一个问题是我们不能将区间类型保存为文件格式,比如 parquet/orc 甚至 json。另一方面,将在 3.2 中发布的两个新类型 YearMonthIntervalType 和 DayTimeIntervalType 将是可比较和可订购的,并且将符合 SQL 标准。
有关 ANSI SQL 合规性的更多信息和细节,请参见文档或查看峰会中讨论这些主题的以下会议:
- 深入了解 Apache Spark 3.1 的新特性
- Apache Spark 3.2 中区间的综合视图
DataSourceV2 API
DataSourceV2 API 在过去几年中一直在开发中,它旨在解决与 V1 API 相关的各种问题,例如,data frame writer的某些模式的连接器行为不一致,在写入表之前没有模式验证,依赖于其他内部 API,如 SQLContext ,以及新功能不容易扩展。
V2 API 使用目录来检查表是否存在,并使用一致的验证规则,与连接器的实现无关。有一个吉拉正在开发中,旨在支持在 V2 API 中更好地控制连接器的分布和订购,这应该允许更好的灵活性,并计划在 Spark 3.2 中发布。
本次峰会讨论了 V2 API 以及相关的配送和订购功能:
- 高效数据源 V2 的数据分发和排序
结论
Data + AI 峰会 NA 2021 上有很多有趣的环节。在这篇简短的报告中,我总结了我在 Spark 内部机制和最佳实践专题的一些会议中的笔记。这些说明并不完整,我主要关注的是 3.1.1 中发布的新特性或者计划在 3.2 中发布的新特性。
用于可视化数据集和解释模型的高度交互式仪表板
使用 FiftyOne 创建仪表板,帮助构建高质量的数据和计算机视觉模型
来源:作者
可视化图像数据集从来没有那么容易,直到我们引入了 51。它是完美的工具,不仅有助于可视化数据集,而且有助于理解数据集的不同方面,解释模型,评估模型预测等。它具有多种多样的特征,并被强烈推荐用于评估对象检测模型、对象分类模型、寻找图像唯一性等。
FiftyOne 可以与 PyTorch、Tensorflow、Google AI、Jupyter、Colab 等多种工具集成。它的核心功能包括管理数据集、评估模型、查找注释错误等等。我可以写多篇文章涵盖 51 的不同方面,但我们不能涵盖所有的功能。
FiftyOne 是一个开源 python 工具,用于创建高度交互式的图像可视化和模型解释应用程序。在本文中,我们将探讨如何使用 FiftyOne 可视化数据集。
让我们开始吧…
安装所需的库
我们将从使用 pip 安装 51 开始。下面给出的命令可以做到这一点。
!pip install fiftyone
导入所需的库
在这一步中,我们将导入创建第五十一个应用程序所需的库。
import fiftyone as fo
import fiftyone.zoo as foz
加载数据集
五十一应用程序已经有很多预定义的数据集,他们称之为动物园,你可以使用这个动物园中的任何数据集。在本文中,我们使用快速入门地理数据集。让我们从加载数据集开始。
dataset = foz.load_zoo_dataset("quickstart-geo")
print(dataset)
来源:作者
您可以使用下面的命令检查所有数据集的名称。
print(foz.list_zoo_datasets())
来源:作者
可视化数据集
这是最精彩的部分。在这里,我们将在一个应用程序中可视化数据集,FiftyOne 只用一行代码就创建了这个应用程序。
session = fo.launch_app(dataset)
来源:作者
这是由 FiftyOne 创建的应用程序。在左侧,您可以看到标签。同样,您也可以在一个网格中可视化所有图像。如果我们选择 ground__truth 标签,它将向我们显示图像中的所有对象,如下所示。
来源:作者
同样,您也可以选择缩放器,即 Id,以及将在图像网格中显示的文件路径。您还可以更改网格的大小来相应地调整图像。
这只是我们已经开始的视觉化。有更多的事情,你可以使用 51 轻松探索,因为它是高度互动的,易于理解。
继续尝试不同的数据集,并可视化这些数据集。如果您发现任何困难,请在回复部分告诉我。
本文是与 Piyush Ingale 合作完成的。
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github*简介针对不同的数据科学项目和包教程。还有,随意探索* 我的简介 ,阅读我写过的与数据科学相关的不同文章。
高度交互式数据可视化
原文:https://towardsdatascience.com/highly-interactive-data-visualization-cd3a9b082370?source=collection_archive---------25-----------------------
使用 Panel-Highcharts 在 Python 中创建高图表
(来源:作者)
数据可视化影响你讲故事,因为它帮助用户更清楚地了解你想说什么,并且用户可以实际可视化模式、见解等。你想告诉我的。可视化有配色方案,图案,不同类型的图表,如果展示得漂亮,会让用户着迷。
创建可视化有不同的方法,python 也有不同的库,可以创建视觉上吸引人的可视化。 Panel-Highcharts 是一个 python 库,使得在 python 中使用 Highcharts 进行探索性数据分析变得很容易。我们可以用它来使用 Highcharts 创建可视化效果,或者使用 Panel 创建仪表板。
在本文中,我们将探索可以使用 Panel-Highcharts 创建的不同类型的图表。
让我们开始吧…
安装所需的库
像任何其他 python 库一样,我们将使用 pip 安装 Panel-Highcharts。下面给出的命令将安装所需的库及其依赖项。
pip install panel-highcharts
导入所需的库
安装后,现在我们将导入创建可视化、加载数据等所需的库。
import panel_highcharts as ph
import panel as pn
pn.extension('highchart')
创建图表和绘图
现在,我们将开始可视化使用 Panel-Highcharts 创建的不同图表和绘图。
- 折线图
我们将首先创建一个基本的折线图,然后创建一个小部件来处理该图表。
#Define the configuration and the data to be used in chart
configuration = {
"title": {"text": "Line Chart Pane"},
"series": [
{
"name": "Sales",
"data": [100, 250, 150, 400, 500],
}
]
}ph.HighChart(object=configuration, sizing_mode="stretch_width")
折线图(来源:作者)
在这里,我们可以看到使用 Highcharts 创建的折线图。在给出的图像中,右侧有一个切换按钮,允许用户下载不同格式的图表和数据。
现在让我们创建一个小部件框,它可以用来处理这个图表。
chart = ph.HighChart(object=configuration, sizing_mode= "stretch_width")settings = pn.WidgetBox(
pn.Param(
chart,
parameters=["height", "width", "sizing_mode", "margin", "object", "event", ],
widgets={"object": pn.widgets.LiteralInput, "event": pn.widgets.StaticText},
sizing_mode="fixed", show_name=False, width=250,
)
)
pn.Row(settings, chart, sizing_mode="stretch_both")
带有小部件的折线图(来源:作者)
在这里,我们可以看到一个小部件框,我们可以调整这些值,并在折线图中查看结果。这有助于向观众展示特性的变化如何导致价值观的变化。
2.股票走势图
我们还可以使用这个库创建图表来表示股票数据。我们将导入 request 和 json 来下载股票数据,并使用 highstock 扩展。
pn.extension('highstock')
import requests, json#Downloading Data
data = requests.get('[https://cdn.jsdelivr.net/gh/highcharts/highcharts@v7.0.0/samples/data/new-intraday.json').json()](https://cdn.jsdelivr.net/gh/highcharts/highcharts@v7.0.0/samples/data/new-intraday.json').json())#Creating Configuration
configuration = {
"title": {"text": "AAPL stock price by minute"},
"rangeSelector": {
"buttons": [
{"type": "hour", "count": 1, "text": "1h"},
{"type": "day", "count": 1, "text": "1D"},
{"type": "all", "count": 1, "text": "All"},
],
"selected": 1,
"inputEnabled": False,
},
"series": [
{"name": "AAPL", "type": "candlestick", "data": data, "tooltip": {"valueDecimals": 2}}
],
}#Visualizing the chart
chart = ph.HighStock(object=configuration, sizing_mode= "stretch_width", height=600)
chart
股票图表(来源:作者
在这里,我们可以使用 Highstock 扩展来可视化股票数据,该扩展创建了一个蜡烛图。类似于折线图,您也可以在此绘制小部件框。
3.地理图
我们也可以使用高图表来创建一个地理图。为此,我们将加载扩展 highmap 并从在线源加载数据。我们将创建一个情节,然后将其作为一个应用程序与部件框渲染。
pn.extension('highmap')**#Creating configuration**
configuration = {
"chart": {"map": "custom/europe", "borderWidth": 1},
"title": {"text": "Nordic countries"},
"subtitle": {"text": "Demo of drawing all areas in the map, only highlighting partial data"},
"legend": {"enabled": False},
"series": [
{
"name": "Country",
"data": [["is", 1], ["no", 1], ["se", 1], ["dk", 1], ["fi", 1]],
"dataLabels": {
"enabled": True,
"color": "#FFFFFF",
"formatter": """function () {
if (this.point.value) {
return this.point.name;
}
}""",
},
"tooltip": {"headerFormat": "", "pointFormat": "{point.name}"},
}
],
}**#Creating Visualization**
chart = ph.HighMap(object=configuration, sizing_mode= "stretch_width", height=600)#Adding widget box
settings = pn.WidgetBox(
pn.Param(
chart,
parameters=["height", "width", "sizing_mode", "margin", "object", "object_update", "event", ],
widgets={"object": pn.widgets.LiteralInput, "object_update": pn.widgets.LiteralInput, "event": pn.widgets.StaticText},
sizing_mode="fixed", show_name=False, width=250,
)
)
pn.Row(settings, chart, sizing_mode="stretch_both")**#Creating Events**
event_update = {
"series": [
{
"allowPointSelect": "true",
"point": {
"events": {
"click": "@click;}",
"mouseOver": "@mouseOverFun",
"select": "@select",
"unselect": "@unselect",
}
},
"events": {
"mouseOut": "@mouseOutFun",
}
}
]
}
chart.object_update=event_update
在这之后,我们都创建应用程序并呈现它。
chart.object =configuration = {
"chart": {"map": "custom/europe", "borderWidth": 1},
"title": {"text": "Nordic countries"},
"subtitle": {"text": "Demo of drawing all areas in the map, only highlighting partial data"},
"legend": {"enabled": **False**},
"series": [
{
"name": "Country",
"data": [["is", 1], ["no", 1], ["se", 1], ["dk", 1], ["fi", 1]],
"dataLabels": {
"enabled": **True**,
"color": "#FFFFFF",
"formatter": """function () {
if (this.point.value) {
if (this.point.name=="Denmark"){
return "❤️ " + this.point.name;
} else {
return this.point.name;
}
}
}""",
},
"tooltip": {"headerFormat": "", "pointFormat": "**{point.name}**"},
"allowPointSelect": "true",
"point": {
"events": {
"click": "@click;}",
"mouseOver": "@mouseOverFun",
"select": "@select",
"unselect": "@unselect",
}
},
"events": {
"mouseOut": "@mouseOutFun",
}
}
],
}#Rendering Application
app = pn.template.FastListTemplate(
site="Panel Highcharts",
title="HighMap Reference Example",
sidebar=[settings],
main=[chart]
).servable()
HighMap 地理图(来源:www.github.com)
这就是我们如何使用 Panel-highcharts 创建不同的图。还有很多其他的剧情可以尝试。
在这篇文章中,我们已经经历了某些情节以及如何创建它们,这些情节是高度交互和可下载的。继续尝试不同的数据集,并让我知道您在回复部分的评论。
本文是与皮尤什·英格尔合作完成的
在你走之前
感谢 的阅读!如果你想与我取得联系,请随时通过 hmix13@gmail.com 联系我或我的 LinkedIn 个人资料 。可以查看我的Github*简介针对不同的数据科学项目和包教程。还有,随意探索* 我的简介 ,阅读我写过的与数据科学相关的不同文章。
使用 Python 生成密码
原文:https://towardsdatascience.com/highly-secure-password-generation-with-python-852da86565b9?source=collection_archive---------12-----------------------
在大约 5 分钟内为所有重要文件和网上交易生成安全密码
照片由飞:D 在 Unsplash
安全性是当今时代最重要的问题之一,确保每台设备、设备、社交媒体账户、银行对账单或任何其他类似的重要信息的安全变得至关重要。出于高安全性的目的,我们利用密码锁定必要的数据,以便只有授权用户才能访问相关信息。
大多数人可能已经注意到,密码通常由星号(*)表示,代表字符数。大多数现代电子邮件或其他加密服务拒绝允许弱密码。你不再被允许只输入几个字母或几个数字,因为这些密码很容易被暴力破解。
我们甚至可以注意到,像 Gmail 这样的一些服务甚至为用户提供了一个选项来选择一个强密码的建议。在本文中,我们将利用 Python 编程来实现以下强密码生成任务。使用 Python 进行项目开发的多功能性和案例将使我们能够有效地实现预期的结果。
我们现在将直接进入这个项目,为个人和专业应用程序构建高度安全的密码。但是,如果您不太熟悉 Python,我建议您在继续学习之前先阅读下面的文章。
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
生成高度安全密码的 Python 项目:
为了构建这个项目,我们将研究几个方法来执行下面的任务。在第一种方法中,我们将从头开始构建整个项目。在第二种方法中,我们将查看一个可以帮助我们更有效地完成预期任务的库。然而,了解如何从零开始构建这样的项目以在编程和最终数据科学中发展是至关重要的。让我们开始导入一些基本的库。
import random
import string
随机库对于我们从特定字符串的序列中随机选取字母、数字或特殊字符是必不可少的。为了获得生成密码所需的字符,我们将使用导入的字符串模块。键入以下命令来接收可能性字符串。
print(string.printable)
确保您删除了双引号或在它们前面加了一个反斜杠,这样您就可以在项目中使用它们。但是,您可以删除一些您不希望密码包含的不必要的字符。另外,请注意,有些网站可能对特殊字符有特殊要求。确保满足这些要求,并且没有任何不必要的序列。下一个代码块如下。
char_seq = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$%&'()*+,-./:;<=>?@[\]^_`{|}~"
print(type(char_seq))
在下一步中,我们将允许用户选择他们希望在各自的密码中包含的字符数。但是,我们将设置一个最小的八位密码限制,因为这通常是大多数网站对强密码的最小要求。我们还将设置一个最大 16 个字符的阈值,因为任何超过这个长度的字符都可能会很奇怪。下面是解释以下内容的代码片段。
print("Enter the required length of the password ranging from 8 to 16: ")
length = int(input())
现在我们已经允许用户输入所需的密码长度,我们可以继续构建下一个代码块,它将使我们能够计算生成的密码。我们将使用 if 和 else 语句来确保用户输入的长度要求在 8 到 16 个字符的限制范围内。我们将用一个空字符串初始化一个密码变量,这个空字符串将存储我们将生成的随机字符。我们将针对提到的长度运行 for 循环迭代。在每次迭代中,我们将使用随机库中的 choice 函数从我们的字符序列中选择一个随机字母,并将其添加到密码变量中。
通常,第一个过程应该足以创建一个由随机字符组成的强密码。然而,我们将通过给这个新生成的密码增加更多的随机性来使它稍微更安全。因此,我们将把密码从字符串格式转换成一个列表,并从随机库中运行 shuffle 操作。一旦我们打乱了随机生成的密码,我们将把列表中的字母重新组合成字符串格式,并打印出用户选择的强密码。下面提供了执行以下操作的完整代码块。
if length >= 8 and length <= 16:
password = ''
for len in range(length):
random_char = random.choice(char_seq)
password += random_char
# print(password)
list_pass = list(password)
random.shuffle(list_pass)
final_password = ''.join(list_pass)
print(final_password)
最后,我们将通过完成 if-else 条件语句来结束我们的代码。如果范围不合适,我们将返回一个命令,告诉用户输入一个合适的范围。您可以对该项目进行一些改进,使其更有成效和效率。我建议观众多尝试一下这样的方法!
else:
print("Enter a suitable range")
现在,我们将看看第二种方法,在这种方法中,我们可以构建同一个项目。为了完成这个任务,我们可以用一个简单的 pip 命令安装下面的库。查看安装页面,从这个下载库获得关于这个库的更多信息。
pip install random-password-generator
为了生成所需的密码,导入已安装的库并调用函数,同时将它存储在一个随机变量中。现在,您可以相应地生成所需的密码。执行所需操作的代码片段如下所示。
from password_generator import PasswordGeneratorpwo = PasswordGenerator()
pwo.generate()
有了这个库,您可以实现更多的事情,值得查看官方文档。因此,请随意参观。您可以从这个下载库查看安装页面以获得关于这个库的更多信息。
结论:
照片由杰瑞米·贝赞格在 Unsplash 上拍摄
“因为没什么好隐瞒而辩称自己不在乎隐私权,和因为无话可说而说自己不在乎言论自由没什么区别 。”
- 爱德华·斯诺登
随着安全成为最*几乎所有活动的主要关注点,应用增强的方法来保护您的数据和信息以防止您被网络钓鱼或被类似的黑客方法利用变得至关重要。生成您自己的强密码来保护私人信息是对抗和处理这些现有威胁的最佳方式之一。
在本文中,我们利用 Python 编程语言编写了一个简单的代码,该代码将解决语言如何解决强密码生成这一任务。我建议看看其他技术和方法,以获得更有成效的结果。
如果你想在我的文章发表后第一时间得到通知,请点击下面的链接订阅邮件推荐。如果你希望支持其他作者和我,请订阅下面的链接。
https://bharath-k1297.medium.com/membership
我建议尝试许多这样的项目来适应 Python 编程。看看我的其他一些文章,你可能会喜欢读!
</5-best-python-projects-with-codes-that-you-can-complete-within-an-hour-fb112e15ef44> </7-best-ui-graphics-tools-for-python-developers-with-starter-codes-2e46c248b47c>
谢谢你们坚持到最后。我希望你们都喜欢这篇文章。祝大家有美好的一天!
事后经验回放(HER)实现
原文:https://towardsdatascience.com/hindsight-experience-replay-her-implementation-92eebab6f653?source=collection_archive---------16-----------------------
提示和技巧
算法和代码的解释
由布雷特·乔丹在 Unsplash 上拍摄的照片
我最*为我的研究强化学习库实现了 HER 算法: Pearl 。在这样做的时候,我发现虽然有文章讨论算法的理论,但是没有任何文章讨论如何用代码实现它。就这样吧,这就是我来的原因!在本文中,我将讨论如何用 Python 实现 HER 缓冲区😊
快速算法概述
提醒一下,这是原始论文中的算法:
来源:https://arxiv.org/abs/1707.01495
总之,在二元且稀疏的奖励环境中(在该环境中,当代理获胜时实现唯一的非负奖励),如果代理从未接收到任何奖励变化,则它可能很难适当地探索环境并学习实现期望目标所需的步骤序列。HER buffer 试图通过复制每个经历的轨迹,并用假设目标是轨迹结束时实现的步骤计算的奖励代替实际奖励来克服这一点。这个想法是,这将帮助代理更好地探索,并学习中间目标,最终达到实际的期望目标。在本文中,我将新的采样目标称为她的目标,而结果轨迹将是她的轨迹,其中包含计算的她的奖励。
实现和代码
该实现将稍微偏离本文中的理论算法。主要区别如下:
- 我们不会在添加每个轨迹后立即对目标进行采样并计算她的奖励,而是等到采样时,我们可以一次性进行矢量化计算,这在 Python ⚡中要快得多
- 我们还将使用一个技巧,只使用一个缓冲区来存储观测值和下一个观测值,以将观测值存储的内存需求减少*一半!这可以通过假设存储的观察值是连续的来实现;也就是说,索引 i+1 处的观察值是索引 I 处的下一个观察值💾
初始化
反直觉地,让我们从第 2 点开始,因为这是在下面的类初始化中定义的,注意没有定义self.next_observations
。
她的 init
这里需要注意的一点是,这个缓冲区只接受GoalEnv
环境!!这让我们能够轻松跟踪剧集目标。请看下面来自 OpenAI 的原始描述:
目标环境描述
在轨迹的末端,下一个观察将是结束状态,并且期望的目标在整个情节中应该是恒定的。因此,我们只需要跟踪观察结果desired_goal
和下一次观察结果achieved_goal
,就可以计算她的奖励。同样值得注意的是self.episode_end_indices
和self.index_episode_map
缓冲器:
self.episode_end_indices
:跟踪轨迹缓冲器中的剧集结束索引。self.index_episode_map
:跟踪哪些过渡属于哪些剧集。
最后,her_ratio
变量指示用新的 HER 奖励与标准重放缓冲器轨迹进行采样的轨迹的分数。
添加轨迹
如前所述,在添加轨迹时,我们不会对她的目标和回报进行采样,因此这种方法并不复杂。
将轨迹添加到缓冲区
注意添加next_observation["observation"]
在算法上有点复杂,因为我们像observation["observation"]
一样将它存储在self.observations
中。
抽样
这是真正的处理过程,我们批量计算她的目标和相应的奖励。让我们从定义我们想要从轨迹缓冲区返回哪些索引的高级方法开始:
她的高级抽样方法
这里要注意的关键是,我们想要从完整的剧集中采样索引,这就是为什么我们需要将end_idx
定义为轨迹缓冲区中最后一个完整剧集的索引。
接下来,让我们看看返回轨迹的方法。这会以self.her_ratio
定义的比率获得标准回放和她的轨迹:
幸运的是,GoalEnv
有一个方法compute_reward(achieved_goal, desired_goal, info)
,这意味着我们不必担心自己计算她的回报。在这种方法中,我们本质上分离了我们需要计算她的回报和目标的指数,然后在最后重新组合一切以获得回报。所有观察值也与算法中指定的期望目标相联系。请再次注意next_observations
的采样稍微复杂一些,因为我们从同一个self.observations
缓冲区获得这些数据。
最后,还有一个问题是让她的目标本身来计算她的奖励。这定义如下:
尝试她的目标
还记得在算法回顾时,我说过她的目标被假定为轨迹终点观察吗?这只是部分正确,实际上有许多不同的方式来取样她的目标,我已经做了其中的两个以上。最简单的方法是获得最后的观察结果,但这篇论文显示,当你在同一集但在当前过渡之后,以随机状态对她的目标进行采样时,实际上获得了最佳结果。在这个策略中,有一个失败模式。如果采样的情节与缓冲区“重叠”;也就是说,当缓冲区溢出时,剧集在缓冲区的末尾开始,在开头结束,可以在缓冲区的末尾选取该剧集中的轨迹。因此,当调用np.random.randint()
时,低值将是缓冲区结尾的索引,而高值将是剧集开头的结尾索引,从而导致错误。因为如果缓冲区大小相对较大(通常应该是 1e6 的量级),这种情况很少发生,所以作为快速解决方案,我们可以求助于更简单的 HER 目标策略,即在这种情况发生时选取剧集结束索引。
唷!坚持到了最后🎉🎉
如果您觉得这篇文章有用,请考虑:
- 跟踪我🙌
- 订阅我的电子邮件通知 永不错过上传📧
- 使用我的媒介 推荐链接 直接支持我并获得无限量的优质文章🤗
晋升的方式,让我知道你对这个话题的想法和快乐学习!!
HiPlot:脸书的交互式可视化工具
原文:https://towardsdatascience.com/hiplot-interactive-visualization-tool-by-facebook-f83aea1b639a?source=collection_archive---------27-----------------------
一个非常方便的探索性数据分析工具
照片由 Unsplash 上的 Stesson Bezuidenhout 拍摄
数据可视化技术对于探索数据集非常有用。数据科学生态系统中使用了各种各样的可视化类型。什么最适合给定的任务取决于数据和变量的特征。
在本文中,我们将介绍一个由脸书创建的交互式可视化工具。它本质上是一个*行坐标图。因此,每行(即数据点)用一条线表示。线上的坐标是变量(即列)。
*行坐标图提供了数据集中可能的组(或簇)的图形表示。它们还揭示了某些有助于区分数据点的模式。
*行坐标图也是一种探索高维数据的便捷方式,对于这些数据,传统的可视化技术可能无法提供合适的解决方案。
脸书为神经网络的超参数调整创建了 HiPlot。然而,我们可以在几乎任何数据集上实现它。最终目标是一样的:好好探索数据。我们将使用著名的 iris 数据集来演示如何使用 HiPlot。
第一步是安装 HiPlot。文档详细解释了如何在各种环境下安装它。我正在用 pip 安装它。
pip install -U hiplot
我们现在可以导入所有的依赖项,并将数据集读入 pandas 数据帧。
import hiplot as hip
import pandas as pd
from sklearn.datasets import load_irisiris = load_iris(as_frame=True)['frame']iris.head()
虹膜数据框(图片由作者提供)
使用 Hiplot 创建交互式可视化非常简单。下面一行代码将创建我们将在整篇文章中尝试的内容。
hip.Experiment.from_dataframe(iris).display()
Hiplot 还接受一个 iterable(例如 dictionary)作为输入数据。在这种情况下,我们使用 from_iterable 函数而不是 from_dataframe 函数。
下面是生成的图的截图。我们仅仅通过观察就能注意到一些模式。
(图片由作者提供)
iris 数据集包含 4 个独立变量和一个目标变量。根据独立变量值,目标取三个值中的一个。
Hiplot 与众不同的地方在于交互界面。例如,我们可以选择图表上任何变量的取值范围。
(图片由作者提供)
我们在花瓣宽度栏中选择一个数值范围。仅显示花瓣宽度在选定范围内的数据点。我们立即注意到所选范围与目标值 0 不同。
可以在多个列上选择一个值范围,这样我们就可以创建更具体的模式。
(图片由作者提供)
我们还可以从目标变量中选择一个值,并查看属于该类的数据点的模式。
(图片由作者提供)
Hiplot 允许重新排列图上的列。例如,我们可以移动目标变量并把它放在最左边。如果您想将分类变量放在一边,将数值变量放在另一边,这个特性就很方便了。
(图片由作者提供)
Hiplot 还生成一个表格作为交互界面的一部分。我们可以使用此表来选择数据点并在图表上查看它们。
(图片由作者提供)
结论
我们已经介绍了一个简单的案例,展示了 Hiplot 如何用于探索性数据分析。
随着数据维度的增加(即列数增加),使用数据可视化来探索数据变得更加困难。在这种情况下,Hiplot 是一个方便的工具。
感谢您的阅读。如果您有任何反馈,请告诉我。
被聘为贵公司首位数据科学家?第一天你应该知道的 3 件事
原文:https://towardsdatascience.com/hired-as-your-companys-first-data-scientist-3-things-you-should-know-on-day-1-e75e7b32b5d0?source=collection_archive---------15-----------------------
办公时间
发起文化变革&避免常见的陷阱
由艾萨克·史密斯在 Unsplash 上拍摄的照片
2020 年 10 月我加入 accuRx 成为公司第一位数据科学家。在加入时,accuRx 是一个由 60 多名员工组成的团队,他们依靠直觉和一流的用户研究团队创造出 GPs 需要和喜爱的产品,完成了令人难以置信的工作。这一点,加上 2020 年医疗保健行业对良好技术解决方案的需求增加,导致我们的业务范围呈指数级扩展。突然间,我们几乎出现在英国所有的全科医生诊所。
我们发现自己处于一个有趣的位置:我们现在有几个每天都被 GPs 广泛使用的产品,以及另一组我们刚刚赋予生命的新生产品想法。我们知道,在这一点上,我们需要开始更多地依靠来自定量数据的洞察力来检验我们的假设,并将我们的产品套件推向正确的方向。
在这一点上,我们不需要先进的 ML 解决方案或最新的大数据处理工具。我们真正需要的是大规模验证我们的假设的能力,了解一个非常庞大和多样化的用户群体的需求,并培养一种决策文化,在这种文化中,依赖定量数据是第二天性。这就是我被带进来的原因,也不是没有挑战。以下是我到目前为止学到的一些东西:
1.新角色创造新对话。
向团队中添加新成员会带来一系列不可避免的挑战:团队动态变化,入职的初始成本很高,现在在决策时房间里又多了一个声音。当你不仅给团队增加一个新成员,而且给团队增加一个新角色时,这种影响会被大大放大。
在我加入之前,数据科学并不是产品开发流程的核心部分。突然,团队被引入了大量以前不需要考虑的新问题、流程和技术要求,解决这些问题通常需要整个团队工作方式的重大转变。
这方面的几个例子有:
- 软件工程师不得不花费更多的时间向功能发布添加分析,并确保产生这些分析的管道是可靠的。
- 有时,AB 测试结果需要一段时间才能慢慢显现出来。鉴于这些结果(希望)会告知产品下一步的发展方向,产品经理、设计师和工程师经常发现自己在如何最好地——以及多快地——重复功能和想法方面面临相当程度的模糊不清。
- 有一组额外的信息需要考虑,这通常意味着我们要花更长的时间来决定产品的发展方向。我们现在不得不将我们的直觉与数据告诉我们的东西相协调,并打电话询问我们认为这两者有多可靠!
这需要一点试错,但重要的是找到一种工作方式,让产品经理、设计师和工程师能够自由地快速发布和迭代,而不牺牲您对分析严谨性的承诺。在我们的案例中,这看起来像是找出哪些产品变化值得测试,什么样的细节值得跟踪,以及在产品开发过程的不同阶段什么样的分析最有用。
2.有效的沟通是成功的一半以上。
你认为你的分析有多有用并不重要——如果人们不知道或不理解它们,它们不太可能产生长期影响。此外,你传达发现的方式将决定你的分析最终会产生多大的影响。
广泛而频繁地交流。
重要的是,仅向团队领导传达您的发现是不够的,整个团队投入了大量时间和精力来适应支持分析的新工作方式,他们希望能够看到这些调整产生了什么影响。交流这些变化如何对决策产生积极影响,将有助于创建一种积极的反馈循环,激励您的团队继续依赖您介绍的流程和技术。
一旦你让你的团队参与进来,真正困难的部分是确保最初围绕使用数据做决策的兴奋持续下去。我犯的一个错误(不止一次!)假设围绕分析的沟通是一张您可以标记为完成的入场券。如果你想推动文化变革,你需要不断提醒人们为什么他们应该像你一样关心这件事。随着人们听到越来越多的关于团队在数据洞察的背后取得积极进展的消息,依靠数据来支持产品决策应该开始变得预期和更加自动化。
始终以洞察力呈现数据。
只要有可能,试着就这将如何影响决策以及人们最终应该做什么来交流你的发现。分析结果越不抽象越好。让你的结果不那么抽象的一个简单方法是清楚地量化你认为变化会产生多大的影响。
例如,如果你已经运行了一个 AB 测试来确定一个新特性是否增加了你的转化率,不要说“这个变化在统计上是显著的”,而是尝试“如果我们向所有用户推出这个新变化,我们的转化率可能会从 5%增加到 7%,这相当于每周增加 200 个活跃用户”。
类似地,当与团队分享数据可视化时,尽量明确图表显示了什么和没有显示什么。请记住,你已经花了很多时间来思考这个观想,但是用新的眼光看待它的人可能没有你那么多的背景知识。使可视化清晰的简单方法是确保您用来定义指标的确切数据得到理解,并在图表旁边提供对趋势或发现的解释。如果可以的话,试着解释你设想的趋势对你团队目标的影响,这样他们就可以根据你分享的观点采取行动。
速度不错,但准确性更好。
没有比养成传达不正确或部分正确结果的习惯更能确保你的工作影响较小的方法了。如果你是团队中第一个或唯一的数据科学家,你就是构成好的或充分的证据的权威,因此,讽刺的是,你几乎没有犯错的余地。
您经常会发现自己不得不在快速向团队提供结果和确保产生这些结果的分析是可靠的之间进行权衡,特别是如果您正在使用新的、次优的或不熟悉的工具。在大多数情况下,我发现通常有一个你可以达成的妥协——但这需要你非常清楚你用来得出特定结论的数据的局限性。如有疑问,请注意!
人们会很快知道他们是否能信任你,而一旦信任被打破,想要恢复就很难了。这并不是说你不会犯错误,但当这些错误发生时,及早发现并得到广泛认可,并建立健全的流程以避免将来出现类似错误,这一点非常重要。
照片由马库斯·温克勒在 Unsplash 拍摄
3.良好的数据基础设施是良好的数据科学的先决条件。
当谈到准确和有用的分析时,可以肯定的结论是,它们是由可访问和可靠的数据实现的。无论您的基础设施有多好,在运行您的分析之前花费大量时间清理数据都是合理的。因此,如果您的数据基础架构没有针对分析进行优化,那么花费在清理数据和将数据转换成可用格式上的额外时间将很快成为主要障碍。到目前为止,我们还没有优先考虑获得同类最佳的分析工具,这是一项艰巨的工作,也是我们仍在努力的方向。
千刀万剐……
这种影响是双重的。首先,它在你的工作流程中增加了足够的摩擦,以至于你可能会放弃使用可能有价值的信息,因为你必须权衡信息的有用性和获取信息的成本。当一个组织行动相当迅速时,所需的时间和精力往往令人望而却步。
其次,每次在不同*台之间转移和转换数据时,出错的可能性都会增加。数据的每一次重新定位或调整都与出错的可能性相关,当然,您做的越多,实际运行分析时数据越不可靠的可能性就越大。这两个障碍一起强烈地抑制了分析角色创造性地解决问题的积极性,并增加了足够的摩擦,以至于您的分析方法可能会变得更加僵化和工具化——这有什么乐趣可言!
你成为瓶颈。
与此相关的是更广泛团队的可访问性问题。如果数据科学家正在努力可靠地访问数据,你可以打赌,其他人可能会更糟!这样做的结果是,简单信息的查询被外包给了你——当人们意识到你能够并愿意涉过这个特殊的泥潭时,讽刺的是,你开始成为数据驱动决策的瓶颈。
在这一点上,你的角色开始变得更加被动——你将花费大部分时间来处理高强度、边际价值的任务,并发现你用于主动思考问题的时间和空间少了很多。
为了避免这些陷阱,你需要确保你在早期就为你需要的工具而努力,你尽可能多地自动化你自己的工作流程,你提供足够的价值,让人们可以看到如果你能够更有效地工作,他们会从你那里得到更多。
成为一家公司的第一位数据科学家很难,但这为你提供了一个独特的机会,让你决定如何在整个组织中使用数据。要做到这一点,首先要优先考虑良好的沟通。这将让人们相信你的愿景,这反过来会帮助你更快地清除基础设施障碍。当你这样做的时候,你需要学会进行有效的权衡,并成为一名专家,以一种能让团队领导对他们的决定有信心的方式展示发现。这将是一个缓慢的过程,但是一旦你证明了一个团队依靠可靠数据的洞察力所能产生的积极影响,你会发现大多数人都有强烈的欲望用证据来支持他们的论点,因此很乐意帮助你保持文化变革!
用 Plotly 表示的直方图
原文:https://towardsdatascience.com/histograms-with-plotly-express-e9e134ae37ad?source=collection_archive---------37-----------------------
主题&模板
图片来自 Unsplash 的 Jayson Hinrichsen
阴谋地表达
Plotly Express (PE)是 Plotly.py 的高级包装器,与 Plotly 生态系统的其余部分完全兼容。基于 JavaScript 库 D3.js 。,它也有 R、Julia 和许多其他编程语言的 API 包装器。它是免费的,可以用于商业应用和产品。该库包括绘制标准图表和地图的函数,以及通过单个函数调用执行刻面和动画的函数。使用 Plotly Express,您可以在线制作交互式图形,也可以离线保存。
Plotly Express 适用于快速生成探索图。此外,可以通过使用预定义的主题或模板快速设计图表。根据 Plotly 主网站,“主题化通常是指为视觉元素定义默认样式的过程。plotly 中的主题是使用称为模板的对象实现的。模板比传统的主题更通用,因为除了定义默认样式,模板还可以用视觉元素(如注释、形状、图像等)预先填充图形。”1.
内置主题可以通过以下语句查看:
共有 11 个模板: ggplot2, seaborn, plotly, plotly_white, plotly_dark, simple_white, gridon, xgridoff, ygridoff, presentation, and none.
*ggplot2*
主题灵感来自 R 数据可视化包 ggplot2、而*seaborn*
主题灵感来自 Python 数据可视化库 Seaborn 。plotly, plotly_white, and plotly_dark
均为原创 plotly.express 主题。如上所述,plotly
是默认模板,而plotly_dark
的灵感来自于 JupyterLab 的黑暗主题。以下三个主题与网格的有无有关:gridon, xgridoff, ygridoff
。是一个清晰整洁的图表的极简模板。presentation
主题增加了字体、标记和线条宽度的大小,以便从更远的距离观看。这个主题可以与任何其他主题相结合(见图 6)。
以上每一个主题都可以作为任何*plotly.express*
函数的模板参数。所以,一个聪明的策略是反复测试这 11 个主题,直到你找到最适合你讲故事的主题。
直方图
直方图是数据集分布的图形表示。虽然它的外观类似于标准条形图,但直方图不是在不同项目或类别之间进行比较,也不是显示一段时间内的趋势,而是一种图表,它让您显示潜在的频率分布或单个连续数值变量的概率分布。
直方图是具有两个轴的二维图;垂直轴是频率轴,而水*轴被分成一系列数值(间隔或箱)或时间间隔。每个仓的频率由垂直矩形条的面积表示。每个柱覆盖了所研究变量的连续数值范围。纵轴 显示从每个箱的计数中得出的频率值。
讲故事:柱状图是对连续变量进行初步探索的合适图表。通过一组竖条,它显示了该变量的数值是如何分布的。直方图允许我们计算所研究的连续变量的任何值的表示概率,如果我们想从我们的样本的结果中进行推断和估计总体*值,这是非常重要的。*
用 Plotly 表示的直方图
我们使用了从 Kaggle [2]下载的数据集。该数据集由 10,000 名银行客户组成,涉及他们的年龄、工资、婚姻状况、信用卡限额、信用卡类别、教育水*和其他特征。银行经理想知道他的客户的年龄分布。下面的代码可以让我们回答他的问题。
首先,我们导入*plotly.express* as *px*
,并将 pandas 库命名为*pd*
。我们将数据集作为 pandas dataframe ( df
)加载,并选择列 Customer_Age
作为我们想要知道其频率分布的数值变量。使用默认模板plotly,
用px.histogram
画图。最后,我们将图表导出为静态的 PNG 格式。
PE 允许您选择箱子的数量。尽管对于间隔的大小和数量没有严格定义的规则,但是您必须尝试一些不同数量的容器。永远记住:很少的间隔不允许我们阐明数据分布的精细结构;许多区间重视抽样误差。
*import pandas as pd
import plotly.express as pxpath = 'your path'
df = pd.read_csv(path + 'CreditCardCustomersCols.csv', index_col = False, header = 0, sep = ';', engine='python')fig1 = px.histogram(df, x="Customer_Age", nbins = 10)fig1.write_image(path + "fighist1.png")
fig1.show()*
图 1 显示了银行客户在五年内的年龄分布。很明显,百岁人很少,千禧一代也很少。婴儿潮一代和 x 一代是这一代消费者的代表。
图 1:使用默认模板用 Plotly Express 制作的直方图。图片作者。
在图 2 中,我们将主题改为ggplot2
,并用update.layout:
设置标题来更新图表;x 轴的名称和 y 轴的名称;用width
和height
设定外形尺寸。
*fig2 = px.histogram(df, x="Customer_Age", nbins = 10, template = 'ggplot2')fig2.update_layout(title = "Histogram of Customers' Age ", xaxis_title = 'Customer Age', yaxis_title = 'Standard Count', width = 1600, height = 1400)fig2.write_image(path + "fighist2.png")
fig2.show()*
图 2:使用 ggplot2 模板用 Plotly Express 制作的直方图。图片作者。
默认情况下,PE 在纵轴中显示落入每个仓中的数据的频率(计数)。您可以使用histnorm
参数更改此模式。该参数可以采用以下值:percent, probability, density, or probability density.
在图 3 中,我们使用histnorm
参数将主题更改为plotly_dark
,并将表示模式从样本的标准计数更改为percent
。
在图 4 中,我们将主题改为simple_white
,将模式改为probabilty.
*fig3 = px.histogram(df, x="Customer_Age", nbins = 10, template = 'plotly_dark', histnorm = 'percent')fig3.update_layout(title = "Histogram of Customers' Age ",xaxis_title = 'Customer Age', yaxis_title = 'Percent Count', width = 1600, height = 1400)fig3.write_image(path + "fighist3.png")
fig3.show()fig4 = px.histogram(df, x=”Customer_Age”, nbins = 10, template = ‘simple_white’, histnorm = ‘probability’)fig4.update_layout(title = “Histogram of Customers’ Age “,xaxis_title = ‘Customer Age’, yaxis_title = ‘Probability ‘, width = 1600, height = 1400)fig4.write_image(path + “fighist4.png”)
fig4.show()*
图 3:使用 plotly_dark 模板用 Plotly Express 制作的直方图。图片作者。
图 4:使用 simple_white 模板用 Plotly Express 制作的直方图。图片作者。
在图 5 中,我们使用xgridoff
模板移除了 x 网格线。选择概率密度作为表示方式。在图 6 中,我们回到概率模式,将主题改为simple_white+presentation
。很明显,字体、标记和线宽都有所增加。
*fig5 = px.histogram(df, x=”Customer_Age”, nbins = 10, template = xgridoff’, histnorm = ‘probability density’)fig5.update_layout(title = “Histogram of Customers’ Age “, xaxis_title = ‘Customer Age’, yaxis_title = ‘Probability Density’, width = 1600, height = 1400)fig5.write_image(path + “fighist5.png”)
fig5.show()fig6 = px.histogram(df, x=”Customer_Age”, nbins = 10, template = ‘simple_white+presentation’, histnorm = ‘probability’)fig6.update_layout(title = “Histogram of Customers’ Age “, xaxis_title = ‘Customer Age’, yaxis_title = ‘Probability ‘, width = 1600, height = 1400)fig6.write_image(path + “fighist6.png”)
fig6.show()*
图 5:使用 xgridoff 模板用 Plotly Express 制作的直方图。图片作者。
图 6:用 Plotly Express 和 simple+演示模板制作的直方图。图片作者。
重叠直方图用于比较两个或多个类别中连续变量的频率分布。尽管 PE 网站指出可以使用参数color
为一列的不同值绘制几个直方图,但我没有得到合适的图表。因此,我过滤了分类变量“Gender
”的两个不同值的数据帧,使用了两次px.histogram
函数,并用add_trace
方法“合并”了两个数字。由于px.histogram
函数没有文本属性,我们使用参数color
只是为了标记。我们使用不同的主题来识别每个图形,并使用 barmode = ‘overlay’
参数来获得重叠。图 7 显示,客户的性别分布没有差异。
*df7a = df[df[‘Gender’] == ‘M’]
df7b = df[df[‘Gender’] == ‘F’]fig7a = px.histogram(df7a, x=”Customer_Age”, nbins = 10, template=‘seaborn’, barmode = ‘overlay’, color = “Gender”)fig7b = px.histogram(df7b, x=”Customer_Age”, nbins = 10,
template = ‘ggplot2’, opacity = 0.25, color = ‘Gender’)fig7a.update_layout(title = “Histogram of Customers’ Age & Gender”,xaxis_title = ‘Customer Age’, yaxis_title = ‘Standard Count‘, width = 1600, height = 1400)fig7a.add_trace(fig7b.data[0])fig7a.write_image(path + “fighist7.png”)
fig7a.show()*
图 7:用 Plotly Express 和 seaborn 和 plotly_dark 模板制作的重叠直方图。图片作者。
图 8 示出了根据已婚、单身或离婚条件的分类变量Marital_Status
的重叠直方图。我们使用了三种不同的模板和颜色参数来识别每个图形。条形模式和不透明度分别用update_layout
和update_traces
表示。
*df8a = df[df[‘Marital_Status’] == ‘Married’]
df8b = df[df[‘Marital_Status’] == ‘Single’]
df8c = df[df[‘Marital_Status’] == ‘Divorced’]fig8a = px.histogram(df8a, x=”Customer_Age”, nbins = 10, template = ‘seaborn’, color = ‘Marital_Status’ )fig8b = px.histogram(df8b, x=”Customer_Age”, nbins = 10, template = ‘ggplot2’, color = ‘Marital_Status’)fig8c = px.histogram(df8c, x=”Customer_Age”, nbins = 10, template = ‘plotly_dark’, color = ‘Marital_Status’)fig8a.update_layout(title = “Histogram of Customers’ Age & Marital Status”,xaxis_title = ‘Customer Age’, yaxis_title = ‘Probability ‘, width = 1600, height = 1400)fig8a.add_trace(fig8b.data[0])
fig8a.add_trace(fig8c.data[0])fig8a.update_layout(barmode=’overlay’)
fig8a.update_traces(opacity = 0.75)fig8a.write_image(path + “fighist8.png”)
fig8a.show()*
图 8:使用 seaborn、ggplot2 和 plotly_dark 模板用 Plotly Express 制作的重叠直方图。图片作者。
一些警告
你可以看到(甚至在 PE 网站上)分类直方图和日期直方图。
分类直方图指的是离散变量类别的计数。我不认为它们可以被定义为直方图,而是柱状图 (BC)。请记住,标准条形图用于在类别之间进行数字比较,而直方图用于显示数字变量的频率分布。此外,直方图的条形之间没有“间隙”或空格,但在 BC 上的条形之间必须留有一些空格,以清楚地表明它指的是离散的(互斥的)组。
日期直方图也有类似的情况:作为日期范围创建的条块相当于特定年份的*均值,因此条形图或折线图比直方图更适合显示一段时间内的趋势。
PE 允许旋转直方图,因此计数在水*轴上,而数值变量的区间或箱在垂直轴上。我没有为这样的安排找到任何技术上的理由,并且它应该被避免,因为它与所有现有的直方图定义相反。
最后但同样重要的是,使用带有密度或概率密度值的histnorm
参数不会转换成密度图。密度图试图通过连续曲线显示数据集的概率密度函数。考虑到这个目标,密度图应用了一个统计程序(内核密度估计),其思路是*滑表征直方图的矩形条。结果,获得了*滑的曲线,其允许更好地可视化分布的形状(图 9)。
图 9:使用相同数据构建的直方图(左)和核密度估计(右)的比较。6 个单独的内核是红色虚线;蓝色曲线是核密度估计。数据点是水*轴上的地毯图。来源:[3]。
总结一下:
Plotly Express 是一个用户友好的数据可视化工具,包括 11 个预定义的主题或模板,以加快工作速度并避免延迟。
你可以用一行代码画一个直方图。
由于直方图被认为是一些最常用的图表,您必须非常清楚什么时候应该使用直方图,以及直方图和条形图之间的区别。
参考文献
【2】:https://www.kaggle.com/sakshigoyal7/credit-card-customers
【3】:https://en.wikipedia.org/wiki/Kernel_density_estimation
HITS 算法:从零开始的链接分析解释和 Python 实现
原文:https://towardsdatascience.com/hits-algorithm-link-analysis-explanation-and-python-implementation-61f0762fd7cf?source=collection_archive---------8-----------------------
搜索引擎中的枢纽和权威
纳斯蒂亚·杜尔希尔在 Unsplash 上的照片
介绍
我们在日常生活中使用搜索引擎,但你有没有想过搜索引擎是如何找到你正在寻找的理想网站的?这比简单的文本搜索要复杂得多。例如,如果我们正在寻找一个关于苹果的网站,一个充满“苹果”字样的网站会出现在谷歌搜索结果的顶部吗?
超链接诱导话题搜索 (HITS)是一种用于链接分析的算法。它可以发现和排名与特定搜索相关的网页。这种算法的想法源于这样一个事实,即一个理想的网站应该链接到其他相关的网站,同时也被其他重要的网站所链接。在本文中,我们将简要介绍该算法,并演练 Python 代码的实现。
算法
请随意查看评论良好的源代码。这真的有助于理解整个算法。
https://github.com/chonyy/PageRank-HITS-SimRank
首先,我们要解释什么是权威和枢纽。HITS 使用中心和权限来定义网页之间的递归关系。
- 权威:一个节点是高质量的,如果许多高质量的节点链接到它
- 集线器:如果一个节点链接到许多高质量的节点,那么它就是高质量的
算法步骤
- 用值 1 初始化每个节点的中心和授权
- 对于每次迭代,更新图中每个节点的中心和权限
- 新的权限是其父权限的总和
- 新的中枢是其子节点的权威总和
- 规范新的权威和枢纽
Python 实现
初始化中心和授权
我们在节点构造函数中初始化 hub 和 authority。auth 和 hub 的初始值是 1。
命中一次迭代
这是 HITS 算法的主要功能。如你所见,它真的很好,很短。其中的逻辑遵循我上面提到的算法。
- 对于图中的每个节点
- 更新权限
- 更新中心
- 标准化更新的值
计算新的权限和中心
- New auth =其所有父中心的总和
- 新中心=其所有子中心的授权总和
规范新的权威和枢纽
- 用图中所有节点的 auth 之和来归一化权限
- 用图中所有节点的中心总和来归一化中心
结果分析
让我们在回购中的 数据集 上测试我们的实现。
graph_1.txt
图片由 Chonyy 提供。
结果
结果按照节点值的顺序,也就是1, 2, 3, 4, 5, 6
。回想一下上面的解释,权限取决于有多少节点链接到它,集线器取决于有多少节点链接到。
从结果中,我们可以看出这条规则是成立的。节点 1 的权限为 0,因为没有到它的节点链接。节点 6 的集线器是 0,因为它没有链接到任何节点。
graph_2.txt
图片由 Chonyy 提供。
结果
同样,这个回答完全有道理。节点形成一个循环。他们都有一个父母和一个孩子,并且彼此相连。从链接的角度来看,它们基本上都是一样的。这就是为什么他们都有相同的权威和中心价值。
graph_3.txt
图片由 Chonyy 提供。
结果
Node2, Node3
- How many nodes link to it: 2
- How many nodes it links to: 2Node1, Node4
- How many nodes link to it: 1
- How many nodes it links to: 1
这也是 node2 和 node3 拥有更高权限和枢纽价值的原因。
graph_4.txt
图片由 Chonyy 提供。
结果
这里有一个有趣的观察。我们来看看 node3 和 node5 的权限。都是0.201
。有四个节点链接到节点 5,只有三个节点链接到节点 3。但是他们有同样的权力!为什么会这样?
这是因为节点 5 比节点 6 和节点 7 具有更高的集线器。因此,节点 3 只需要节点 5 通过节点 6 和节点 7 获得相同的链接值。
IBM.txt
图片由 Chonyy 提供。
结果
结果遵循节点值顺序2076, 2564, 4785, 5016, 5793, 6338, 6395, 9484, 9994
。
我们来看看 node4785,node5016,node6338 的权限。它们都有相同的 auth 值 0.105。这是因为它们都有一个共同的父节点 2076。
现在观察轮毂值。节点 2076 具有最高的集线器。这是因为它已经链接到图中的每个节点。节点 4785、节点 5016 和节点 6338 的 hub 值为 0,因为它们绝对没有要链接的子节点。
讨论
让我们做一个有趣的实验。假设我们要增加每个图中 node1 的枢纽和权限。怎么才能做到呢?
graph_1.txt
左:增加轮毂。右:增加权威。
左:增加轮毂。右:增加权威。
Hub 就像是链接到其他节点的力量。因此,我们只需让 node1 链接到另一个节点,以增加它的集线器。通过加入 edge (node1,node6),hub 值大大增加了 0.2 -> 0.618。
权威就像被链接的力量。我们加上边(node5,node1),权限值大大增加了 0 -> 0.5。
graph_2.txt
左:增加轮毂。右:增加权威。
左:增加轮毂。右:增加权威。
原图是一个循环,具有所有同等的权限和枢纽。通过添加额外的边(节点 1、节点 4),我们增加了节点 1 链接到其他节点的能力。因此,中心值增加了。
类似地,我们通过添加额外的边(node4,node1)增加了 node1 的链接能力。现在,节点 1 有两个父节点。因此,它的权威增加了。
graph_3.txt
左:增加轮毂。右:增加权威。
左:增加轮毂。右:增加权威。
与原始图表相比。我们在左图中添加了一条边(节点 1,节点 4 ),在右图中添加了一条边(节点 4,节点 1)。就像我们在上面的图中实现的逻辑一样,我们添加这两条边来分别增加中心和权威。
计算性能分析
趋同;聚集
现在,我们都知道,经过足够的迭代,枢纽和权威总是会收敛到一个特定的值。为什么我们不画出来看看它收敛的有多快?
在 graph_4.txt 上测试收敛
图片由 Chonyy 提供。
从图中,我们可以看到权威和枢纽在迭代 5 时开始收敛。对于一个不那么简单的图形来说,这个计算时间已经足够了。然而,当图中有更多的节点和边时,所需的迭代会大大增加。
例如,对于 graph_6.txt,500 次迭代仍然不够,它有 1228 个节点,5220 条边。并且由于大量的边,计算时间永远很长。
边数
图片由 Chonyy 提供。
我们用不同数量的总边运行 100 次迭代,以便发现总边和计算时间之间的关系。正如你所看到的,边数对计算时间的推断几乎是线性的,这是非常好的。
请注意,它不是完全线性的原因是边彼此链接的方式也会稍微影响计算时间。
缺点
HITS 算法的主要缺点是它依赖于查询。从原始论文开始,链接分析是从从一些传统的基于文本的搜索算法中检索的根集合开始的。然后展开根集链接到的站点,这是基础集。
来源:https://en.wikipedia.org/wiki/HITS_algorithm
这可能会很麻烦,因为链接分析的结果可能会受到初始搜索算法的影响。并且基于文本的搜索的评估时间非常昂贵。
因此,我想介绍另一个独立于查询的链接分析算法,PageRank 算法。请随意查看!
https://chonyy.medium.com/pagerank-3c568a7d2332
另外,如果你对链接分析中的相似性度量感兴趣。
https://chonyy.medium.com/simrank-similarity-analysis-1d8d5a18766a
源代码
https://github.com/chonyy/PageRank-HITS-SimRank
HOG(梯度方向直方图):概述
原文:https://towardsdatascience.com/hog-histogram-of-oriented-gradients-67ecd887675f?source=collection_archive---------1-----------------------
数学,论文解释和代码从零开始为初学者
什么事?
梯度方向直方图,也称为 HOG,是一种类似 Canny 边缘检测器、SIFT(尺度不变和特征变换)的特征描述符。它在计算机视觉和图像处理中用于目标检测。该技术对图像的局部部分中梯度方向的出现进行计数。这种方法非常类似于边缘方向直方图和尺度不变特征变换(SIFT)。HOG 描述符侧重于对象的结构或形状。它比任何边缘描述符都好,因为它使用梯度的大小和角度来计算特征。对于图像的区域,它使用梯度的大小和方向生成直方图。
计算猪特征的步骤
- 获取要计算其 HOG 特征的输入图像。将图像大小调整为 128x64 像素(高 128 像素,宽 64 像素)。作者在论文中使用了这个维度,因为他们使用这种类型的检测的主要目的是在行人检测任务中获得更好的结果。由于这篇论文的作者在麻省理工学院行人数据库上获得了异常完美的结果,他们决定制作一个新的、更具挑战性的数据集,称为“INRIA”数据集(http://Pascal . inrialpes . fr/data/human/),其中包含从一组不同的个人照片中裁剪出来的 1805 张(128x64)人类图像。
图 1:为获取 HOG 特征而导入的图像。图 2:流程的导入图像灰度。图 3:导入图像的调整大小和灰度图像。(图片由作者提供)
2.计算图像的梯度。通过结合来自图像的幅度和角度来获得梯度。考虑 3x3 像素的块,首先为每个像素计算 Gx 和 Gy。首先,使用下面的公式为每个像素值计算 Gx 和 Gy。
其中 r、c 分别指行和列。(图片由作者提供)
在计算 Gx 和之后,使用下面提到的公式计算每个像素的大小和角度。
图 4:图像大小的可视化。图 5:图像角度的可视化。(图片由作者提供)
3.在获得每个像素的梯度之后,梯度矩阵(幅度和角度矩阵)被分成 8×8 的单元以形成块。对于每个块,计算 9 点直方图。9 点直方图开发了具有 9 个仓的直方图,并且每个仓具有 20 度的角度范围。图 8 表示一个 9 仓直方图,其中的值是在计算后分配的。这些 9 点直方图中的每一个都可以被绘制成直方图,其中柱输出该柱中梯度的强度。由于一个块包含 64 个不同的值,对于所有 64 个量值和梯度值,执行以下计算。由于我们使用 9 点直方图,因此:
(图片由作者提供)
每个第 j 个面元,面元将具有来自以下的边界:
(图片由作者提供)
每个箱的中心值为:
(图片由作者提供)
图 6:星等图像上的 8×8 块。图 7:角度图像上的 8×8 块。(图片由作者提供)
图 8:9 格直方图的表示。对于一个由 64 个单元组成的 8×8 块来说,这一个直方图是唯一的。所有 64 个单元将分别把它们的 Vj 和 Vj+1 值加到数组的第 j 和第(j+1)个索引上。(图片由作者提供)
4.对于块中的每个单元,我们将首先计算第 j 个容器,然后计算将分别提供给第 j 个和第(j+1)个容器的值。该值由以下公式给出:
(图片由作者提供)
5.将一个数组作为一个块的二进制数,并将 Vj 和 Vj+1 的值附加到数组中为每个像素计算的第 j 和第(j+1)二进制数的索引处。
6.上述计算后的结果矩阵将具有 16x8x9 的形状。
7.一旦所有块的直方图计算结束,来自 9 点直方图矩阵的 4 个块被组合在一起以形成新的块(2x2)。这种杵状运动以重叠的方式进行,步幅为 8 个像素。对于块中的所有 4 个单元,我们连接每个组成单元的所有 9 个点直方图以形成 36 个特征向量。
上图显示了计算 9 个柱直方图的方法。(图片由作者提供)灵感来自[https://www.programmersought.com/article/42554276349/
(图片由作者提供)
围绕图像遍历 2x2 网格框,以便从 4 个块中生成一个组合的 fbi。(图片由作者提供)
8.每个块的 fb 值通过 L2 范数归一化:
其中,ε是为避免零分频误差而加到 fb *方上的一个小值。在规范中,取值为 1e-05。(图片由作者提供)
9.为了标准化,首先通过以下公式计算 k 值:
(图片由作者提供)
10.进行这种标准化是为了减少同一物体的图像之间的对比度变化的影响。从每个街区。收集 36 点特征向量。在水*方向有 7 个块,在垂直方向有 15 个块。因此,HOG 特征的总长度将为:7 x 15 x 36 = 3780。获得所选图像的 HOG 特征。
使用 skimage 库在同一图像上可视化 HOG 特征。(图片由作者提供)
在 Python 中从头开始使用特性
在 Python 中使用 skimage 库的 HOG 特征
代码文件
链接到包含用 python 从头开始编写的 HOG 特征检测器全部代码的 Colab 文件:https://Colab . research . Google . com/drive/1 _ ydbx 68 ucxejk 448 y0 byoacuzzw 5 hwr?usp =共享
参考文献
- 人体检测的方向梯度直方图:http://lear . inrialpes . fr/people/triggs/pubs/Dalal-cvpr 05 . pdf
- 撇除文件:https://scikit-image.org/docs/dev/api/skimage.feature.html?highlight = hog # skimage . feature . hog
- HOG(梯度方向直方图)特征(使用 MATLAB 和 Python 的理论和实现):https://www.youtube.com/watch?v=QmYJCxJWdEs
敬请关注像这样的新的研究论文解释!
请随时联系并给出您的建议:https://www.linkedin.com/in/mrinal-tyagi-02a1351b1/
https://github.com/MrinalTyagi
使用 Alexa 实现家庭自动化
原文:https://towardsdatascience.com/home-automation-with-alexa-69f71524f164?source=collection_archive---------4-----------------------
物联网仿真设备的语音命令,使用 Arduino 库 Espalexa。
上图:亚马逊第二代 Echo-Dot——下图:作者的最终电路
1.介绍
几年前,我探索了如何在家庭自动化项目中使用因亚马逊 Echo 和 Echo-Dot 而流行的智能个人助理 Alexa,:
当物联网遇上人工智能:采用 Alexa 和 NodeMCU 的家庭自动化和
Alexa — NodeMCU: WeMo 仿真变得简单
Alexa 能够进行语音交互,播放音乐,制作待办事项列表,设置闹钟,播放播客,播放有声读物,并提供天气,交通和其他实时信息。Alexa 还可以将自己作为家庭自动化中心来控制几个智能设备。我们将在这个项目中使用“回声点”,它允许用户使用唤醒词来激活设备,如“Alexa”或“计算机”,如“星际迷航!。
在家庭自动化领域,Alexa 可以与 Philips Hue、Belkin Wemo、Sonoff 等几种不同的设备进行交互。我们在以前的项目中使用 fauxmoESP 库模拟了 WeMo 设备,这似乎已经过时了,而且现在也没有得到足够的维护。这里我们将使用 Espalexa ,这是一个易于使用的 Arduino 库,与 ESP8266 和 ESP32 都兼容。
下面的框图显示了我们的项目将会开发什么:
框图—作者提供的图片
下面的视频展示了项目结束时的样子:
2.安装 ESP 板
在 Arduino IDE 首选项→附加电路板管理器 URL 中输入:
https://dl.espressif.com/dl/package_esp32_index.json, [http://arduino.esp8266.com/stable/package_esp8266com_index.json](http://arduino.esp8266.com/stable/package_esp8266com_index.json)
Arduino IDE 首选项—打印屏幕
接下来,在 Arduino IDE 工具/板管理器中,安装板:
Arduino IDE 板管理器—打印屏幕
在这个项目中,我们将使用 NodeMCU,但是代码也可以很容易地适应 ESP32。那么,让我们也安装它:
Arduino IDE 板管理器—打印屏幕
esp 8266 node MCU 引脚排列:
ESP8266 节点 MCU 引脚排列—图片由 Amazon.com 提供
3.埃斯帕莱克萨图书馆
除了标准的开/关控制之外,Espalexa 还允许您设置一系列值(例如,亮度、温度)和可选的颜色。比如你可以说————“Alexa,把灯光调到 75%”。
Espalexa 模拟了 SSDP 协议和 Philips hue API 的部分内容,刚好足以被 alexa 发现和控制。
默认情况下,最多可以添加 10 个设备,因为每个设备“插槽”都占用内存,即使没有设备被初始化。您可以通过添加来更改设备的最大数量,例如:
#define ESPALEXA_MAXDEVICES 20
在调用库之前:
#include <Espalexa.h>
建议将 MAXDEVICES 设置为您想要添加的设备的确切数量,以优化内存使用。
要安装库,请转到 Arduino IDE 工具/管理库,并使用 espalexa 进入:
Arduino IDE 库管理器—打印屏幕
4.家庭自动化原型
我们的家庭自动化项目将创建四个智能设备工作,可以单独远程控制。但是,假设我们想要将设备分组,以便在家中使用。应该怎么做?
例如,假设我们家有两个房间:
- 卧室
- 客厅
现在,假设您希望每个房间都有一盏灯和一个插座。因此,让我们将四个设备分组,如框图所示(见本文简介):
床房
- 灯 2
- 出口 1(风扇)
客厅
- 灯光 1
- 出口 2(蜂鸣器)
欧的家庭自动化项目或多或少会是这样:
房屋原型及其物联网设备—图片由作者提供
5.组装硬件进行测试
出于测试目的,四种颜色的 led 将用作“物联网设备”。它们应如图所示安装,如下所列:
== >红色 LED(灯 1) == >节点 MCU D1 (GPIO5) —客厅
== >绿色 LED (Outlet1) == >节点 MCU D2 (GPIO4) —客厅
== >蓝色 LED(灯 2) == >节点 MCU D5 (GPIO14) —卧室
== >黄色 LED(输出 2) == >节点 MCU D6 (GPIO12) —卧室
红色和绿色的 led 将模拟安装在“起居室”的设备,蓝色和黄色的 led 将模拟安装在“卧室”的设备
电路图—图片由作者提供
6.在 Arduino IDE 上创建我们的物联网设备
首先,我们必须调用库:
#include <ESP8266WiFi.h>
#include <Espalexa.h>
要连接到设备的 NodeMCU 引脚定义如下(在测试阶段为 led,在最终项目阶段为继电器输入):
#define RelayPin1 5 //D1
#define RelayPin2 4 //D2
#define RelayPin3 14 //D5
#define RelayPin4 12 //D6
一旦我们有了 4 个设备,至少应该定义 4 个直接回调函数:
void device1Changed(uint8_t brightness);
void device2Changed(uint8_t brightness);
void device3Changed(uint8_t brightness);
void device4Changed(uint8_t brightness);
亮度参数包含新的设备状态(0:关,255:开,1–254:暗),当调用回调函数时,Alexa 将发送该状态。**
但是回调函数可以是在 Alexa 命令下执行的任何函数,因此我们将在这里定义三个要调用的附加特殊函数,这些函数将处理多个物联网设备:
*void devFunc1Changed(uint8_t brightness);
void devFunc2Changed(uint8_t brightness);
void devFunc3Changed(uint8_t brightness);*
上述回调函数将与以下内容相关联:
- 所有家用设备(照明 1、照明 2、输出 1 和输出 2)
- 客厅(照明 1 和出口 1)
- 卧室(灯 2 和出口 2)
因此,Alexa 事实上将处理七个“物联网设备”。对于它们中的每一个,我们必须定义一个独特的名称,由 Alexa 调用:
*// device names
String Device_1_Name = "Red light";
String Device_2_Name = "Green light";
String Device_3_Name = "Blue light";
String Device_4_Name = "Yellow light";// device_function names
String Dev_Func_1_Name = "Living Room";
String Dev_Func_2_Name = "Bed Room";
String Dev_Func_3_Name = "All Home Devices";*
在测试阶段,我们将用“{其颜色}光”来称呼 led。在我们的最终项目中,我们可以通过变量的最终名称来改变这些变量(“Light 1”、“Outlet2”等)。
最后但同样重要的是,我们应该声明 espalexa 要使用的变量:
*Espalexa espalexa;*
对于交流:
*boolean connectWifi();
boolean wifiConnected = false;
const char* ssid = "YOUR SSID HERE";
const char* password = "YOUR PASSWORD HERE";*
在设置阶段,除了通常的 pin 和串行秃率定义以及通信启动程序之外,您还应该正确关联每个物联网设备及其名称,并启动 espalexa:
*// Define your devices here.
espalexa.addDevice(Device_1_Name, device1Changed);
espalexa.addDevice(Device_2_Name, device2Changed);
espalexa.addDevice(Device_3_Name, device3Changed);
espalexa.addDevice(Device_4_Name, device4Changed);// Define your devices functions here.
espalexa.addDevice(Dev_Func_1_Name, devFunc1Changed);
espalexa.addDevice(Dev_Func_2_Name, devFunc2Changed);
espalexa.addDevice(Dev_Func_3_Name, devFunc3Changed);espalexa.begin();*
循环函数应该非常简单:
*void loop()
{
espalexa.loop();
delay(1);
}*
最后一个程序将是创建回调函数,或者更好,当 Alexa 发送命令时必须做什么。
以下回调函数可适用于所有四种物联网设备:
*void deviceNChanged(uint8_t brightness)
{
//Control the device
if (brightness == 255)
{
digitalWrite(RelayPinN, HIGH);
Serial.println("DeviceN ON");
}
else
{
digitalWrite(RelayPinN, LOW);
Serial.println("DeviceN OFF");
}
}*
将上面代码中的“N”更改为 1、2、3 和 4 将会有四个直接回调函数。请记住,Alexa 发送的亮度参数包含新的设备状态,它将是:
- 0 == >关;
- 255 == >开
- 1 到 254 == >“暗灯”。
我们可以将上述简单的开关功能扩展为一种特殊的功能,在这种功能中可以控制光的强度。我们将为设备 1(红色 LED)执行此操作:
*void device1Changed(uint8_t brightness)
{
//Control the device
if (brightness == 255)
{
digitalWrite(RelayPin1, HIGH);
Serial.println("Device1 ON");
}
else if (brightness == 0)
{
digitalWrite(RelayPin1, LOW);
Serial.println("Device1 OFF");
}
else
{
int brigh_perc = (brightness/255.)*100;
analogWrite(RelayPin1, brightness);
Serial.print("Device1 Brightness: ");
Serial.print(brigh_perc);
Serial.println("%");
}
}*
请记住,NodeMCU 具有 PWM 输出,可用于 Arduino analogWrite()函数。如果使用 ESP32,则当 analogWrite()不可用时,应创建 PWM 功能。
完整的代码可以从我的 GitHub 下载:Alexa _ node MCU _ Home _ Automation
不要忘记用你自己的证书来更改虚拟 wifi 证书。
在 Arduino IDE 上编译代码并上传到 NodeMCU 后,您可以在串行监视器上看到交换的消息。一旦 NodeMCU 连接到您的 wifi,应该会出现类似的消息(包含您的网络数据):
Arduino IDE 串行监视器打印屏幕
我们认为您已经在与 NodeMcu 连接的 相同的网络上充分安装了 Alexa。
现在,让我们请 Alexa 找到您的设备。有两种方法可以做到:
- 使用智能手机中的 Alexa 应用程序
- 要求 Alexa 使用语音命令直接完成,比如:“ Alexa、 发现设备”。
45 秒后,您应该会收到 Alexa 确认信息,确认发现了七个设备。你可以在应用程序“灯光标签”上看到如下内容:
Alexa 应用程序(设备选项卡)—打印屏幕
一旦 Alexa 发现了你的设备,你可以给她语音命令,如下所示:
下面的屏幕截图显示了串行监视器的响应。
Arduino IDE 串行监视器打印屏幕
7.组装完整的硬件
输出 GPIOs 应连接到 4 通道继电器模型,而不是 led 和电阻,如下所示:
电路图—图片由作者提供
不要直接从 NodeMcu 5V 输出引脚给继电器模块供电。请改用外部电源。一个 1A 电源应该足够了。如果使用其他版本,请与继电器模块制造商确认。不要忘记将所有的 gnd 连接在一起。
原则上,可以使用为测试开发的相同代码,但是您必须确认继电器模块的逻辑。例如,在上述模块中,您应该保持输入“打开”或高电*,变为低电*以激活继电器输出。因此,代码必须相应地改变。
- 在 setup()阶段,将 GPIOs 输出定义为高电*
- 回调函数从高变低,反之亦然
您可以通过输出继电器关闭的声音和模块中的红色 led 来确认继电器是否正常工作。
一旦一切正常,就可以完成我们的“智能设备”的安装了,它们是两个固定的“灯”和两个“通用插座”,让我们对它们进行适当的重命名:
- 点燃一个
- 轻二
- 一号出口
- 二号出口
*// device names
String Device_1_Name = "Light One";
String Device_2_Name = "Light Two";
String Device_3_Name = "Outlet One";
String Device_4_Name = "Outlet Two";*
如本教程开头的视频所示,为了完成我们的项目,请连接一些由继电器控制的设备。在我的例子中,我使用两个 led 作为灯,并在插座 1 上连接一个风扇,在插座 2 上连接一个蜂鸣器(例如,模拟像收音机这样的设备)。下图显示了安装的设备。
电路图—图片由作者提供
请注意,一旦继电器能够处理它们,您就可以安装真正的交流灯和电器来使用 Alexa 进行控制。
8.关于“设备功能”的最后考虑
从模拟简单物联网设备的概念开始,如 WeMo 或飞利浦 Hue,我们还使用 Alexa“触发”更复杂的功能,“设备功能”。在这些功能上,多个输出被用作按房间划分的一组设备。
在我的教程中,电脑,发射所有武器,星际迷航企业的一些武器,比如光子鱼雷和相位炮,就是用这样的函数模拟的。
框图—作者提供的图片
这是物联网领域有待探索的强大工具,在这里,一个简单的语音命令可以触发使用微控制器的更复杂的过程,正如可以在下面的视频中看到的那样(这里使用了“计算机”wake-word 而不是“Alexa”):
结论
一如既往,我希望这个项目可以帮助其他人在激动人心的电子和物联网世界中找到自己的路!
更新文件请访问我的 GitHub:Alexa _ node MCU _ Home _ Automation
更多项目,请访问我的博客:MJRoBot.org
来自世界南部的 Saludos!
我的下一篇文章再见!
谢谢你
马塞洛
主场优势:没有粉丝还存在吗?
原文:https://towardsdatascience.com/home-field-advantage-does-it-exist-without-fans-a0778c5a6a29?source=collection_archive---------14-----------------------
实践教程
疫情时代之前和期间的数据和统计
照片由马太·亨利从爆出
在大多数运动项目中,人们普遍认为主队对客队有显著优势,俗称主场优势。这可能是由多种因素造成的,但两个最受欢迎的原因是粉丝的出现和玩家对环境的熟悉和舒适。后者的一个标志性例子是波士顿红袜队在芬威公园的“绿色怪物”墙。然而,一些研究和数据表明,球员熟悉度是主场优势效应的一个令人惊讶的微弱预测因素。
因此,还有一个最受支持的原因,那就是粉丝的存在。有趣的是,在疫情冠状病毒爆发时,大多数体育场都不对公众开放,主场优势似乎也逐渐消失了。这为分析这个自然实验创造了一个理想的场景。
我想回答的问题很简单:我能使用数据分析和统计推断来衡量球迷在足球比赛中对主队的影响吗?我会那样做的。而我会重点关注英格兰的英超数据。
为什么是足球?为什么是英超?
在选择要调查的运动之前,我考虑了世界顶级联赛中的一些主要运动,每个运动都有一些缺点:
- 篮球——鉴于漫长的赛季和室内体育场吸引了喧闹而充满活力的球迷,NBA 起初似乎是一个不错的选择。然而,在他们 19-20 赛季的重新开始阶段,所有的比赛都是在奥兰多泡泡里进行的,所以没有真正的“主场”。
- 棒球——疫情开始的时候,MLB 赛季还没有开始,相对于其他运动,主场优势通常并不高。
- 美式足球 —相对于其他运动,NFL 赛季非常短,不会为我们提供大量实验数据。
足球似乎是最值得研究的运动,特别是因为它的主场优势在大多数运动中是最强的,而且闭门比赛的次数也足够多。我会选择英超联赛,因为它往往有更多*衡的球队,这意味着更多的球队可以在特定的日子里击败另一支球队,并在特定的赛季中位居联赛榜首。在其他大联盟,如德甲或西甲,每年似乎都有 2-3 支球队占据主导地位。你知道我指的是哪些团队。
最初的假设或期望
在收集我需要的数据之前,我对在没有球迷的比赛中看到的数据有一些猜测:
- 主场优势减少,意味着进球和得分减少
- 一场更加*衡的比赛,对客队的犯规更少,因为裁判不会受到吵闹或心烦意乱的球迷的压力
- 主队付出的努力越少,导致比赛最后几分钟射门次数和进球次数越少
数据:Python 中的集合
数据:2019-2021 年的比赛(2019 年 8 月 9 日-2021 年 3 月 15 日)
我将使用由奥特维奥·西莫斯·西尔维拉创建的 Python & Selenium scraper,并在此基础上构建以满足我的特定需求。
具体来说,我希望收集每场比赛主客场球队的以下数据:
- 决赛和半场比分
- 比赛数据(控球、黄牌、投篮等。)
- 指示进球得分时间的特定分钟标记
为每个匹配抓取的页面详细信息的示例截图。 注: 英超 允许提取数据用于非商业用途 条款&条件
你可以在这里找到我用的刮刀。
数据:R 中的预处理
我想做的第一件事是在 R 中进行预处理,并进行一些数据辩论,这将允许我进行所需的分析和实验。
让我们装入必要的包和我们的数据,确保每场比赛的日期都被正确读取。
library(dplyr)
library(ggplot2)
library(ggpubr)
library(lubridate)
library(stringr)
library(zoo)df <- read.csv('data/premier_league_matches.csv') %>% mutate(date = lubridate::as_date(date))
接下来,我们将删除 20-21 赛季期间任何球迷人数有限的比赛。只有少数比赛是在 2020 年 12 月的进行的,当时联赛允许在某些体育场最多容纳 2000 名观众,然后再次恢复完全封闭。这些是具有未知影响的异常值,所以最好不要考虑它们。
# matches with limited attendance (2,000 fans) in December 2020
limited_fans_matches <- c(59005, 58999, 59003, 59000, 58997, 59008, 59014, 59007, 59009, 59006, 59024, 59033, 59030, 59026, 59041)df <- df %>% subset(!match_id %in% limited_fans_matches)
让我们也创建新的列来跟踪每个队的犯规、得分和结果。
df <- df %>%
mutate(home_yellow_cards_pct = home_yellow_cards / (home_yellow_cards + away_yellow_cards),
away_yellow_cards_pct = away_yellow_cards / (home_yellow_cards + away_yellow_cards),
home_fouls_conceded_pct = home_fouls_conceded / (home_fouls_conceded + away_fouls_conceded),
away_fouls_conceded_pct = away_fouls_conceded / (home_fouls_conceded + away_fouls_conceded),
home_points_won = ifelse(home_ft_score > away_ft_score, 3, ifelse(home_ft_score == away_ft_score, 1, 0)),
away_points_won = ifelse(away_ft_score > home_ft_score, 3, ifelse(away_ft_score == home_ft_score, 1, 0)),
home_result = ifelse(home_ft_score > away_ft_score, 'W', ifelse(home_ft_score == away_ft_score, 'D', 'L')),
away_result = ifelse(away_ft_score > home_ft_score, 'W', ifelse(away_ft_score == home_ft_score, 'D', 'L')))
为了跟踪进球得分的不同分钟间隔,我们需要转换home_goal_mins
和away_goal_mins
中的分钟格式,以便每个值都用逗号分隔。
df <-
df %>%
mutate(home_possession = home_possession/100,
away_possession = away_possession/100,
home_goals_mins = c(str_replace_all(str_sub(home_goals_mins,
2, -2), fixed(" "), "")),
away_goals_mins = c(str_replace_all(str_sub(away_goals_mins,
2, -2), fixed(" "), ""))) %>%
mutate(across(c('home_goals_mins', 'away_goals_mins'),
~ifelse(.=="", NA, as.character(.))))
最后,我们将为我们的实验创建两个相等的数据集(每个数据集 288 场比赛),假设联盟在 2020 年 6 月 17 日开始在没有球迷的情况下比赛:
- 控制设置:仅匹配风扇
- 测试集:仅匹配无风扇
no_fans_df <- df %>%
filter(date >= '2020-06-17') %>% arrange(date) %>% head(288)
no_fans_df['fans_present'] <- 'N'fans_df <- df %>%
filter(date <= '2020-03-09')
fans_df['fans_present'] <- 'Y'matches_df <- rbind(fans_df, no_fans_df)
现在我们有了一个最终的数据帧,它带有我们实验中匹配类型的标签。这样就容易比较两者了!
探索性数据分析
我们首先要看的是主客场两队在比赛中的进球分布。进球似乎出现在半场的前几分钟或最后几分钟,原因是注意力不集中、疲劳,以及为了赢得比赛而承担更多风险。在比赛的不同阶段,球迷的能量也可能很高。
不幸的是,这两种匹配类型之间似乎没有任何真正的区别。大多数进球都是在比赛进行到一半和结束时打进的,这可能是由于加时赛的缘故。
接下来,我们将查看两个数据集之间匹配结果的差异。
正如猜测的那样,当球迷不在场时,主队赢得的比赛更少,输掉的比赛更多。抽签的次数大致相同。乍一看,这似乎表明观众对主队有积极的影响。
让我们以不同的方式来看待主场胜利,看看获胜分数占总可能分数的比率。我们称之为主场优势并按月汇总。
每月赢得的主场积分/可能的总积分比率
再一次,这个图像支持了我们上面的观点,主场优势随着体育场的关闭而逐渐减少。
如果我们在一段时间内用类似的图表绘制一场比赛中客场队的黄牌分布,我们会看到在比赛数据集之间客场队的黄牌数量有更大的差异。当球迷不在的时候,客队似乎要轻松得多!
每月发放客场黄牌
我们想看的最后一个方面是主队的总射门次数。
当球迷在场时,主队拍摄的照片大约有 500 张之差。但是有多少镜头是真的对准目标的呢?让我们检查一下。
每月的目标命中率
假设检验
虽然很容易理解数据可视化,但我们不能仅仅依靠它们来确定粉丝存在与否的意义。为此,我们需要对我们的实验进行统计推断测试。
统计推断让我们更加确信,我们在样本数据之间看到的任何差异在一定程度上都是显著的,并且观察到的结果不仅仅是由于偶然。
我们将运行四个测试来观察以下情况:
- 主队得分差异(主试)
- 主队犯规次数的差异
- 客队承认的黄牌数量的差异
- 主队射门方式的不同
对于每个测试,我们将首先计算测试的统计功效,这将给出当这种差异实际存在于总体中时,测试将发现统计显著差异的概率。换句话说,能力是你应该拒绝零假设的概率。然后,我们将使用学生的 t 检验进行实际的假设检验。我们将对每一个使用 90%的置信区间。
功率测试
首先,让我们使用 r 中的pwr
库计算主测试的功效。我们需要计算每个样本的*均值、总标准偏差和一个称为效应大小的值,该值定义为:
测试的工作方式是,您必须只设置一个参数与NULL
相等,这是在给定其他数据点的情况下您想要计算的参数。
library(pwr)meanF <- mean(fans_df$home_points_won)
meanNF <- mean(no_fans_df$home_points_won)
sd <- sd(matches_df$home_points_won)
effect_size <- (meanF — meanNF) / sd
pwr.t.test(n = 288, d = effect_size, sig.level = 0.1, power = NULL, type = “two.sample”)#######OUTPUT########Two-sample t test power calculationn = 288
d = 0.130097
sig.level = 0.1
power = 0.4665975
alternative = two.sidedNOTE: n is number in *each* group
我们将对剩余的测试进行同样的操作,并整合结果。
我们如何解读这种力量?一般认为功率应该等于或大于 80%。对于我们与主场得分相关的主要测试,这意味着我们有 47%的机会发现统计上的显著差异。这不是一个好兆头。但是其他测试的功率是 95%或更多,这是有希望的。
统计 T 检验
接下来,我们将进行 t 检验,以确定有球迷和没有球迷的主场*均得分是否存在显著差异。
- 零假设:两个样本的均值差为 0
- 备择假设:均值之差不等于 0。
t.test(fans_df$home_points_won, y=no_fans_df$home_points_won, alternative = 'two.sided', conf.level=0.90)#######OUTPUT#######
Welch Two Sample t-testdata: fans_df$home_points_won and no_fans_df$home_points_won
t = 1.5631, df = 573.85, p-value = 0.1186
alternative hypothesis: true difference in means is not equal to 0
90 percent confidence interval:
-0.009373031 0.356595254
sample estimates:
mean of x mean of y
1.593750 1.420139
再一次,我们将对我们所有的假设进行测试。
为了达到显著性,计算的 p 值必须小于使用的显著性水*,在本例中为0.10
,这允许我们拒绝零假设。对于我们与有球迷和没有球迷的主队得分差异相关的主要测试,p 值为0.1186
,表明没有统计学意义。然而,其余的测试都非常显著,p 值接* 0!
总结:主要发现和要点
总的来说,这个实验表明,当球迷缺席时,通常观察到的足球主场优势在某些方面被最小化了。
- 主队往往得分更少(因此得分也更少),但观察到的数据没有统计学意义来支持这一点。
- 然而,数据确实支持这样的观察,即没有球迷的主场球队会收到更多的犯规,而与之相关的是,客场球队承认的黄牌更少。这是有道理的,因为比赛结果的另一个关键因素是裁判,他受到来自球迷的压力,要判还是不判犯规。
- 此外,在没有球迷压力的情况下,主队的投篮次数要少得多,但这并不一定会导致目标或进球的投篮次数有很大差异。
这些因素都有助于比赛更加*衡,从而减少主场优势。
除了风扇的存在,许多因素也可能影响观察到的结果。例如,两个数据集之间匹配结果的差异可能是不*衡的。如果高质量的球队在一组样本中有更多的客场比赛,这可能会引入更多的偏见。许多人可能会认为球员/教练的技能比比赛是主场还是客场更能决定比赛结果。
建立解决这些偏见的模型,并收集更多关于体育界这种罕见现象的数据,可能有助于提供更多答案。在那之前,球迷似乎会影响足球的主场优势,但不是以我们所期望的最纯粹的方式。
希望你喜欢这个项目。如果对类似的文章感兴趣,可以看看我的另一篇文章。
感谢肯·吉在追求一个体育分析项目中的灵感。如果您有任何问题,请随时在下面评论或通过 LinkedIn 联系我。
参考
- n .巴尔默、a .内维尔和 s .沃尔森(编辑。).(2005).主场优势【特刊】。体育科学杂志,23 卷 4 期。
- 卢海德,托德&卡伦,艾伯特&布雷,史蒂文&金,李北。(2003).职业运动中的设施熟悉度和主场优势。国际运动和锻炼心理学杂志。1.264–274.10.1080/1612197X
- 索尔.麦克劳德。"效果大小。"单纯心理学,单纯心理学,2019 年 7 月 10 日,【www.simplypsychology.org/effect-size.html.】T2
- 奥特维奥·西莫斯·西尔韦拉。"如何建立一个足球数据集与网页抓取."中,向上编码,2020 年 10 月 20 日python . plain English . io/how-to-build-a-football-dataset-with-web-scraping-D4 deffcaa 9 ca
使用 HuggingFace Spaces 托管 ML 应用程序
原文:https://towardsdatascience.com/host-ml-apps-with-huggingface-spaces-7d5eef00e781?source=collection_archive---------14-----------------------
探索新的 HuggingFace 版本
图片来自阿玛多·洛雷罗的 Unsplash
我一直是 NLP 的超级粉丝,因此也是一个超级拥抱脸粉丝。虽然 HuggingFace 以其强大的 NLP 背景而闻名,但他们最*发布了一个名为 Spaces 的新功能,可以帮助你在你的个人资料上快速托管 ML 演示应用。Spaces 支持两个可以快速构建 Python 应用的框架:Streamlit 和 Gradio 。我也是 Streamlit 的忠实粉丝,所以我们将使用该框架为今天的文章构建一个示例空间应用程序。如果你想要更多的灵活性和对你的前端的控制,你可以使用一个定制的框架或者使用你自己的 HTML 代码。
注意:在这篇文章中,我们不会真正关注任何模型构建包,它将集中在展示空间特性的功能上。
目录
- 设置
- 构建应用程序和测试
- 结论和附加资源
1.设置
要开始使用共享空间,您需要在以下链接创建一个 HuggingFace 个人资料帐户。
作者截图(创建拥抱脸个人资料)
如果你想和其他成员合作,你可以在这里添加额外的功能,比如 Github 或者 Twitter 用户名。之后,点击“创建新空间”,你就可以设置你的项目了。
作者截图
在本例中,我们将使用 Streamlit 并创建一个公共工作区。对于自定义 SDK,请通过“添加您的”链接与 HuggingFace 联系。
创建完共享空间后,我们可以导航到“文件和版本”来管理我们的目录。首先 创建一个 requirements.txt 文件,其中包含任何额外的依赖项,这就是 Spaces 将如何在您正在使用的框架中使用的方式。Spaces 附带了以下预装库 : huggingface_hub 、请求和数据集。在 requirements.txt 中,我们将添加用于情感分析的变形金刚和文本块库。
申请要求
接下来创建一个“app.py”文件,这是我们的应用程序代码将被创建的地方。文件结构应该如下图所示。
作者截图
2.构建应用程序和测试
现在我们可以编辑 app.py 文件来构建我们的应用程序。我们将制作一个简单的应用程序,它提供了使用两种不同框架对一些样本文本进行情感分析的选项。创建文件时,您可以在共享空间左上角的应用程序选项卡上预览文件的外观。
App 预览(作者截图)
现在我们可以添加一些基本的逻辑来使用任何一个可用的框架。
情感分析
我们现在可以用两种不同的框架来测试我们的应用程序。
变形金刚情绪分析(作者截图)
Textblob 情感分析(作者截图)
在 10 分钟内,我们成功部署了一个简单而强大的演示应用程序,可以公开共享。要调整应用程序的任何旋钮,您也可以进入设置选项卡将空间设为私有或将其删除。
3.结论和附加资源
演示应用程序的完整代码
如果您没有自己的基础设施设置,Spaces 是一个非常有用的新特性,可以快速测试和演示 ML 应用程序。我很好奇 HuggingFace 在为您的应用程序带来自己的前端堆栈/框架方面提供的未来灵活性。如果你想看视频演示,看看下面的教程 HuggingFace 发布。对于不同的接触面管道和任务,查看以下文档。
如果你喜欢这篇文章,请在 LinkedIn 上与我联系,并订阅我的媒体 简讯 。如果你是新手,使用我的 会员推荐 报名。
主持代码评审会议可以对您的数据科学团队产生积极影响
原文:https://towardsdatascience.com/hosting-code-review-meetings-can-positively-impact-your-data-science-team-1601e1a836bd?source=collection_archive---------60-----------------------
为什么我每周和我的团队召开代码审查会议
图片来自 Unsplash 上的 Artem Sapegin
每个周末,我都会主持一个代码审查会议。在 30 分钟内,一小组数据科学家聚在一起,查看对我们的库的任何开放拉取请求。当我的团队第一次开始打开拉请求和审查代码时,感觉就像是一件苦差事。评审开始得很好,但是开始变成一个人催促团队的其他人完成他们的评审。随着越来越多的拉请求开始到来,我们的团队决定改为主持每周的代码审查会议。这些会议改变了我们看待代码的方式。这不再是一件琐事,而是对设计决策、假设和代码架构的公开讨论。
在这些会议中,我们召集了一小组不同的数据科学家来检查从分析到工具开发的任何开放拉动请求(PRs)。这个组包括最初打开拉请求的开发人员和一些不同的团队成员。我们有一个核心小组,参加每一次审查,然后每周改变我们加入的人,以获得审查代码的经验。
让不同的人轮流查看“拉”请求,可以让他们在阅读和理解我们图书馆的各个方面时有所体会,而这些方面他们可能并不熟悉。
随着会议的进行,我们一次打开一个拉式请求。编写代码的首席数据科学家将讨论他们做了哪些更改,为什么要做这些更改,并讨论他们做出的任何决定。当有人对代码有疑问时,我们有一个开放的论坛来讨论它,然后留下评论。这允许我们在确定下一步之前讨论设计决策和假设。
这些审查顺利吗?开始时,有点困难,但通过有规律的节奏,这已经成为一个更顺利的过程。
为什么要举办同行评议会?
无论您是在笔记本上编码还是在开发库,代码评审都是一个有益的工具,可以让数据科学家检查某人正在开发的代码。代码审查还可以向数据科学家介绍他们在查看其他人的工作时不熟悉的新库和技术。允许不同级别的数据科学家评审代码将允许每个人提供反馈,并将代码评审作为学习和个人发展的工具。
不要把你的评论当成是针对个人的。相反,使用它们来理解如何使您的代码更干净、更高效。确定你能从这个过程中学到什么。
我主持代码审查会议,因为它们允许对代码进行讨论,并给数据科学家一个与其他人讨论他们的设计决策的论坛。因此,在听完他们为什么以一种特殊的方式开发代码之后,更容易对代码做出评论。
不同级别的数据科学家都有机会在研究代码、讨论过程和展示工作成果时向他人学习。人们有不同的学习方式,对一些人来说,让他们一起浏览代码会有所帮助。这些会议是一个安全的地方来演示代码,请求反馈,并确定合并代码需要什么。
以这种方式参与评审可以让年轻的数据科学家对他们的代码能力更有信心,并看到即使是高级数据科学家也没有完美的代码。
最后,我在团队中实施的审核流程进展顺利。在开始这些会议之后,在对拉取请求进行评论之前,数据科学家之间就变更达成一致变得更加容易。这一流程大大减少了分歧或误解,因为在电话会议期间,所有相关方都会到场公开讨论他们的意见。
总而言之,代码评审会议比个人在自己的时间内评审代码对我的团队更有益。这些会议允许数据科学家就代码更改达成一致,并在整个过程中快速移动拉请求。我们可以在下一次会议之前批准大多数拉动式请求,而不是等待几周,让两三个人找到时间进行审查。
最后的想法
您的团队可能会以不同的方式进行代码评审,但是对于我的团队来说,我们发现每周召开一次 30 分钟的代码评审会议是最好的。在这些会议中,我们可以讨论、演示和确定被检查代码的后续步骤。
- 不同级别的数据科学家可以聚在一起讨论代码,互相学习。
- 我们在每次会议上轮换人员,让人们了解代码库的各个方面。
- 这些会议提供了一个公开的论坛来讨论为什么数据科学家应该改变代码,并且可以对前进的道路做出决定。
- 这是一个安全的地方,可以公开讨论数据科学家的意见分歧,从而减少对代码更改的争议或分歧。
你如何在你的团队中评审代码?
</4-things-i-didnt-know-about-being-a-team-lead-in-data-science-1f96293cb8aa>
空话:政治中的话语
原文:https://towardsdatascience.com/hot-air-words-in-politics-d23ef112cb7?source=collection_archive---------50-----------------------
应对气候危机是当前决定性的生存挑战,2018 年诺贝尔经济学奖由威廉·诺德豪斯和保罗·罗默(美国)获得,他们证明了碳定价将是应对气候危机的有效策略。因为有政府程序的公开记录,而我是 NLP 的专家,我看到了我能看到的政府和政治数据。这是我发现的非常敷衍的初步看法。我在这里使用的数据来自 openparliament.ca,它使跟踪政府通过法案的进展变得容易,并提供了众议院会议的议事录。
*英国议会议事录是对加拿大、英国、新西兰和其他威斯敏斯特体系政府的下议院会议记录进行轻微编辑的公开信息记录,以一名在报纸上发表英国议会会议记录的英国议员命名。(美国人:假装我说的是国会。我没有,现在也没有,但这就足够了。)
为此,我使用了 2000 年 1 月 1 日至 2020 年 8 月间的会议记录。由于加拿大议会有两种官方语言的声明,我将英文声明分离出来。演讲者以演讲者的身份所做的陈述往往是非常标准化的,并且只是程序的一部分,所以我删除了它们。
https://www.lingo-ninja.com/RepsVsDems
这是一篇有趣的文章,它展示了在做出任何结论之前实际查看数据的重要性。他们声称,与你的预期相反,对于美国政客来说,共和党人倾向于使用更大的词汇量,莎拉·佩林是所有人中词汇量最大的,特朗普的词汇量比乔·拜登大。尽管我愿意接受统计数据,但退一步说,我发现这些结论非常令人惊讶。粗略地看一下他们的方法,他们不做任何形式的词汇化、拼写纠正、标点符号或停用词删除,他们只是使用一个记号化器。这意味着特朗普有可能通过 hamberders 和可变大小的省略号拥有大量词汇…..
为了避免指责列出街道名称的议员词汇量太大,我使用了 spaCy 的 en-core-web-sm POS tagger,并删除了停用词、标点符号和专有名词。那些年有 1000 多名议员坐过,这些议员讲了大约 86 万次。
由于单个议员说的单词数量可能相差很大(更准确地说,是 7 到 2615448 个),原始词汇比较几乎是不公*的。由于停用词的使用和标点符号的出现或多或少是一个常数,我将它们有意义的词的范围按照它们发出的总标记来划分。这种调整是标准化步骤。因为我很好奇词汇是否会随着时间的推移而改变,所以我绘制了归一化词汇大小与在职议员开始日期的关系图。
作者图片
Flesch 阅读难易程度评分:
Flesch 阅读难易程度评分是一个由句子长度和所用词汇组合而成的指标。下图让我有点吃惊,但经过研究后,还是有意义的。关于 Flesch 分数,需要注意的一点是,分数越高,越容易阅读。如下图所示,最难读懂的议员来自由魁北克集团和新民主党成员组成的民主力量党。由于 Forces 是由受过高等教育的前议员(其中一名创始成员是大学教授)组成的,因此他们的语言水*高于自由党或保守党也就不足为奇了,因为这些政党拥有非常广泛的基础。Flesch-Kincaid 年级水*是一个将 Flesch 阅读难易程度评分(基于句子长度和词汇量)与 Kincaid 年级水*指标相结合的指标。为此,我使用了 textstat,这是一个内置了所有这些功能的 Python 包。
查找常用短语:
对于更大的统计数据,如估计的相对词汇和阅读方便性,我从 2000 年 1 月 1 日起在每份法案上使用陈述,但由于这个想法是为了找出政治家如何谈论气候政策,我提取了在“碳”或“环境”的法案上的陈述。
我在这里采用了两种方法来统计主要短语。其中一个是手动计算使用的 4gm,另一个是使用 TextBlob,这是一个 Python 库,可以进行名词短语分块。我使用了 nltk 标记器,并消除了停用词,我发现每一方的二元模型基本上都是无用的。在所有政党中,最常见的连词是“碳税”、“首相”、“环境部长”、“温室气体”和“自由政府”。对人类的眼睛来说,那里没有任何东西表明特定的极性。这是有道理的,在环境/气候背景下,这些是最常见的二元模型,不管你对它们的感觉如何。当你看四个单词的短语时,一个更有趣的画面出现了。
作者图片
绿色、自由和保守的 4 个字母
在这里,你可以看到更多证据,证明不同政党在谈论碳税时使用的口号。保守派真的喜欢称碳定价为“扼杀就业的碳税”,而自由派通常喜欢说“环境和经济齐头并进”的变体。绿党必须包括在内,因为他们是一个全国性的政党,主要关注气候和环境,但由于他们目前有史以来最高的 3 名议员,他们的声明经常反映出绿色参与具体的法案,如育空环境社会经济评估法案。
基于启发式的主题模型
这些是最需要人工提取的短语,通常的主题模型表现如何?以下是 LDA 发现的与 5 个主题相关的单词:
作者图片
LSI 发现了 5 个主题:
作者图片
评估无监督的主题模型是一个挑战,但由于这是人类语言,并且只有 5 个主题被选择,对这一点的判断纯粹是主观的。
在我看来,LDA 的主题稍微好一点,但它们基本上只是表明议员们讨论了环境、气候、碳、育空、魁北克和艾伯塔。由于育空地区位于北部,有很多采矿和资源开采活动,艾伯塔省和育空地区都有重油和天然气开采活动,因此它们经常出现在议会讨论中是有道理的。魁北克是最大的省份,拥有丰富的自然资源,所以它会出现在环境问题的讨论中——但它在政府中也有很高的代表性,是一个常见的参考点。
在很大程度上,我称之为“热空气”是因为缺乏一个真正好的双关语,但也是因为在用最常见和最容易获得的技术查看数据后,很难客观地发现不同政党之间的区别,即使他们的投票记录表明他们在那里。Suhas Pai(基岩公司首席技术官。AI 和 NLP guru)认为,由于下议院中任何长于感叹词的演讲都是由他们的团队精心制定的,因此议会演讲不是文本信息的良好来源。我倾向于这一结论,因为除了“扼杀就业的碳税”等众所周知的保守派词汇和“环境和经济齐头并进”等自由派词汇,还没有太多分析表明政党话语中有意义的差异。
热狗还是不是热狗
用 Tensorflow 2 尝试著名的 CNN 模型来帮助杨坚
输出图像
介绍
你看过 HBO 的《硅谷》喜剧系列吗?如果是这样,我打赌你还记得杨坚开发的非热狗应用。这里有一个片段可以提醒你。
所以基本上这个应用程序识别某样东西是不是热狗。嗯,我们也可以用其他类型的物体来训练识别它们。
当我了解到 CNN(卷积神经网络)的时候,我很渴望在这个问题上尝试一些流行的 CNN 模型,只是为了好玩。所以我选择了一些最好的 CNN 模型来尝试。
对于这个问题,我使用了以下模型,
- AlexNet 的变体
- 使用 VGG19 进行迁移学习
- 使用 ResNet50 迁移学习
- 使用 Inception V3 进行迁移学习
- 借助 Inception ResNet V2 迁移学习
你可以在 NBViewer 上查看笔记本,也可以在 GitHub 上找到,
https://github.com/scsanjay/case-studies/tree/main/02. Not Hotdog
数据
没有高质量的数据,就没有机器学习。谢天谢地,我在 ka ggle【1】上找到了一个数据集。
总共有 3000 张图片可用于训练。
其中 1500 是热狗图像, 1500 不是热狗(它们是食物、家具、人或宠物)。
训练数据的 20% 将用于验证,这意味着 600 张图像将用于验证。
测试集有来自热狗类别的 322 图像和来自热狗类别的 322 图像。
在加载的时候,我已经将所有图片的尺寸调整为 256x256。另外,我已经将它们分成 32 的批量。
让我们看一些图片,
数据样本
预处理
调整大小
将所有图像转换为相同大小的预处理步骤已经完成。
数据扩充
数据扩充是非常有用的一步。这有助于使模型更好地泛化。此外,它从给定的图像生成新的图像,这增加了我们的数据集的大小。
怎么会?它可以执行各种操作,如翻转、旋转、剪切、缩放等,以创建增强的数据。请注意,TensorFlow 是动态完成的,这意味着我们不必保存图像,但它们将在训练时生成。
我已经执行了以下数据扩充操作,
a)水*翻转
b)旋转
c)缩放
在数据扩充之后,我们可以期待如下所示的图像,
扩充数据
改比例
我们应该将像素从[0,255]重新调整到[0,1]。我将只应用于 AlexNet。
在使用预训练模型进行迁移学习的情况下,我们将仅使用相应模型的预处理。
模型结构
AlexNet
AlexNet 用了三大概念,
1。数据扩充—增加数据的方差。
2。辍学——应对过度适应。
3。ReLU 激活单元——处理消失梯度问题。
我已经创建了一个 AlexNet 架构的变体,并在这里和那里进行了退出和批处理规范化。总共有 58,286,465 个可训练参数。最后一层有 1 个乙状结肠活化单位。
我将使用基于二进制交叉熵的 Adam 优化器进行优化。我们也会保持准确性。
我已经运行了 10 个纪元。我还添加了一个提前停止的回调函数来监控 val_loss。我们通过验证数据得到了 69.00% 的准确度,通过测试数据得到了 68.47% 的准确度。这并不令人鼓舞。如果我们进行调整或拥有更多数据,我们可以取得更大的成就。
使用预训练的 VGG19 进行迁移学习
迁移学习
迁移学习是一种非常酷的技术。在迁移学习中,我们加载一个预先训练好的模型。我们移除模型的顶部(最后几个致密层)。然后我们冻结预训练模型的卷积基。现在我们可以使用这个预先训练的模型作为特征提取器。
在迁移学习中,有时我们也可以使用预训练模型进行权重初始化,然后训练整个模型。这通常发生在我们有大量数据和/或预训练模型没有在类似数据上训练的时候。
VGG19
VGG19 来自视觉几何组。它有 19 层。它有一个新的想法,当我们使用多个小内核而不是较小的大内核时,可训练参数的数量会减少。此外,它到处使用相同的 3x3 大小的内核和 2x2 最大池,这简化了架构。
我已经用 ImageNet 权重加载了 TensorFlow Keras 预训练的 VGG19 模型,没有顶层。
然后我将这个基础模型设置为不可训练。
在模型架构中,
I)我首先添加了输入层。
ii)然后是数据扩充层。Tensorflow 将自动管理扩增仅用于训练。
iii)然后我用了 VGG19 模型的预处理。
iv)之后,我使用了基础模型,即预训练的 VGG19 模型。这是不能按照迁移学习来训练的。
v)然后我使用了全球*均池 2D 层。
vi)然后是一个展*层。
vii)然后是具有 1000 个 Relu 激活单元的全连接致密层。为了正规化,我也加入了退学。然后我添加了一个线性激活单元。因为我将在二进制交叉熵中使用 from_logits=True **
** 来获得概率。
它有 514,001 个可训练参数和 20,024,384 个不可训练参数。
和前面一样,我们使用了 Adam 优化器和二元交叉熵。
这次我们用验证数据得到了 93.17% 的准确率,用测试数据得到了 93.47% 的准确率。这是一个很大的进步。
使用预先培训的 ResNet50 进行迁移学习
ResNet50 由何等人创造。它有 50 层。它引入了剩余块的概念。它有助于建立深度大的模型。剩余的块具有跳过连接,所以如果一个块是无用的,那么它就被忽略。
我们按照与上面相同的步骤来创建相同的结构。唯一的区别是基础模型现在是 ResNet50,预处理是 ResNet50。
它有 2,050,001 个可训练参数和 23,587,712 个不可训练参数。
编译和拟合阶段与上面类似。而这次,我们用验证数据得到了 94.33% 的准确率,用测试数据得到了 94.56% 的准确率。比以前有了一点点进步。
通过预先培训的 Inception V3 进行迁移学习
Inception v3 是第三个版本。它是由谷歌开发的。它有 48 层。初始网络不是一次使用一个卷积,而是同时使用所有 1x1、3x3、5x5 和 MaxPool。这个想法是,较小的内核将获得本地信息,而较大的内核将获得全局信息。它还有一个叫做瓶颈层的技巧,可以显著减少计算量。
同样,我们已经将基本模型更改为 Inception V3 以及预处理步骤。
它有 2,050,001 个可训练参数,与 ResNet50 相同,还有 21,802,784 个不可训练参数。
编译和拟合阶段与上面类似。通过验证数据,我们得到了 92.67% 的准确率,通过测试数据,我们得到了 94.40% 的准确率。比我们用 ResNet50 得到的要少。
通过预先培训的 Inception ResNet V2 迁移学习
盗梦空间 ResNet V2 由谷歌开发。他们在盗梦空间中增加了 ResNet 的跳过连接。它允许创建一个更深的 164 层网络。
我做了和上面类似的改动。
它有 1,538,001 个可训练参数和 54,336,736 个不可训练参数。
编译和拟合阶段类似于我们到目前为止所看到的。通过验证数据,我们得到了 95.33% 的准确度,通过测试数据,我们得到了 96.42% 的准确度。迄今为止最好的一个。
测试输出
所有四种迁移学习模式的表现都很相似,而且相当不错。
然而,盗梦空间 ResNet V2 在我们的案例中具有最高的准确性。因此,我们将使用它来显示一些带有测试图像的输出。
测试输出
最后的想法
如果你看到我们只为模型做了几件事,数据扩充,预处理,加载基础模型,并在顶部添加几层。我们能够达到 96.30%的准确率。这是因为迁移学习。我们可以在基础模型中增加更多的可训练层。这可以提高精确度。
参与这个项目非常有趣。也是一次很棒的学习经历,因为这是我的第一个深度学习项目。
深度学习发展非常快。每天都有新的研究论文发表。只有少数人制作了这些作品。深度学习就是要聪明。在所有的模型中,我们在上面看到,他们引入了一些新的聪明的技术。
参考
- 张量流[https://www.tensorflow.org/]
- 数据集:Jain,Yashvardhan。2019 .热狗-不是热狗。
版本 1。许可证 CC0:公共领域。可从以下网址获得:https://www . ka ggle . com/yashvrdnjain/hotdognotdog/metadata - 应用根[https://www.appliedroots.com/
感谢阅读博客!你可以通过我的 LinkedIn 个人资料联系到我。也👏如果你喜欢的话。
酒店收入预测:用 ARIMA 预测 ADR 波动
原文:https://towardsdatascience.com/hotel-revenue-forecasting-predicting-adr-fluctuations-with-arima-5e60370b5de9?source=collection_archive---------51-----------------------
使用 ARIMA 预测日*均利率
来源:图片由 nattanan23 来自 Pixabay
*均每日房价(以下简称为 ADR)代表入住酒店的顾客每天支付的*均房价。
这是一个酒店的重要指标,因为它代表了每个客户的整体盈利能力。
在本例中,每个客户的*均日费率是每周的*均值,然后使用 ARIMA 模型进行预测。
以下分析基于来自 Antonio、Almeida 和 Nunes (2019)的数据:酒店预订需求数据集。
数据操作
在这个特定的数据集中,每个客户的年数和周数(以及每个客户记录的 ADR 值)是单独提供的。
以下是日期栏:
来源:Jupyter 笔记本输出
以下是 ADR 栏:
来源:Jupyter 笔记本输出
首先,年份和周数被组合成一个字符串:
df1 = df['ArrivalDateYear'].map(str) + df['ArrivalDateWeekNumber'].map(str)
print (df1)
df1=pd.DataFrame(df1)
然后,使用 pandas 将新列与 ADR 列连接起来:
df2 = DataFrame(c, columns= ['ADR'])
df2df3=pd.concat([df1, df2], axis = 1)
df3
df3.columns = ['FullDate', 'ADR']
这些值随后按日期排序:
df3
df3.sort_values(['FullDate','ADR'], ascending=True)
来源:Jupyter 笔记本输出
下一步是获得每周的*均 ADR 值,例如,对于条目 201527(2015 年第 27 周),对所有 ADR 值进行*均,以此类推每个后续周。
df4 = df3.groupby('FullDate').agg("mean")
df4
df4.sort_values(['FullDate'], ascending=True)
来源:Jupyter 笔记本输出
ARIMA
使用这个新形成的时间序列,ARIMA 模型现在可以用来预测 ADR。
对于该模型,前 100 周的数据用作训练数据,而后 15 周的数据用作测试数据,与模型做出的预测进行比较。
这是新形成的时间序列图:
来源:Jupyter 笔记本输出
从图表的初始视图来看,季节性似乎确实存在。然而,在训练数据上生成自相关函数来验证这一点。
plot_acf(train_df, lags=60, zero=False);
来源:Jupyter 笔记本输出
我们可以看到相关性(大约在第 10 周到第 45 周之间有所下降),自相关在第 52 周再次达到峰值,这意味着每年的季节性。这实质上意味着每 52 周记录的 ADR 值之间有很强的相关性。
使用该信息, m=52 被设置为 ARIMA 模型中的季节分量,并且 pmdarima 被用于自动选择模型的 p,d,q 参数。
>>> Arima_model=pm.auto_arima(train_df, start_p=0, start_q=0, max_p=10, max_q=10, start_P=0, start_Q=0, max_P=10, max_Q=10, m=52, stepwise=True, seasonal=True, information_criterion='aic', trace=True, d=1, D=1, error_action='warn', suppress_warnings=True, random_state = 20, n_fits=30)Performing stepwise search to minimize aic
ARIMA(0,1,0)(0,1,0)[52] : AIC=422.399, Time=0.32 sec
ARIMA(1,1,0)(1,1,0)[52] : AIC=inf, Time=21.87 sec
ARIMA(0,1,1)(0,1,1)[52] : AIC=inf, Time=48.20 sec
ARIMA(0,1,0)(1,1,0)[52] : AIC=inf, Time=40.99 sec
ARIMA(0,1,0)(0,1,1)[52] : AIC=inf, Time=38.19 sec
ARIMA(0,1,0)(1,1,1)[52] : AIC=inf, Time=39.33 sec
ARIMA(1,1,0)(0,1,0)[52] : AIC=414.708, Time=0.95 sec
ARIMA(1,1,0)(0,1,1)[52] : AIC=inf, Time=47.51 sec
ARIMA(1,1,0)(1,1,1)[52] : AIC=inf, Time=59.30 sec
ARIMA(2,1,0)(0,1,0)[52] : AIC=413.878, Time=1.86 sec
ARIMA(2,1,0)(1,1,0)[52] : AIC=inf, Time=59.96 sec
ARIMA(2,1,0)(0,1,1)[52] : AIC=inf, Time=60.34 sec
ARIMA(2,1,0)(1,1,1)[52] : AIC=inf, Time=77.60 sec
ARIMA(3,1,0)(0,1,0)[52] : AIC=414.514, Time=2.05 sec
ARIMA(2,1,1)(0,1,0)[52] : AIC=415.165, Time=3.74 sec
ARIMA(1,1,1)(0,1,0)[52] : AIC=413.365, Time=1.91 sec
ARIMA(1,1,1)(1,1,0)[52] : AIC=415.351, Time=66.38 sec
ARIMA(1,1,1)(0,1,1)[52] : AIC=inf, Time=57.54 sec
ARIMA(1,1,1)(1,1,1)[52] : AIC=inf, Time=76.00 sec
ARIMA(0,1,1)(0,1,0)[52] : AIC=411.433, Time=1.08 sec
ARIMA(0,1,1)(1,1,0)[52] : AIC=413.422, Time=29.17 sec
ARIMA(0,1,1)(1,1,1)[52] : AIC=inf, Time=67.32 sec
ARIMA(0,1,2)(0,1,0)[52] : AIC=413.343, Time=1.76 sec
ARIMA(1,1,2)(0,1,0)[52] : AIC=415.196, Time=3.69 sec
ARIMA(0,1,1)(0,1,0)[52] intercept : AIC=413.377, Time=2.05 sec
Best model: ARIMA(0,1,1)(0,1,0)[52]
Total fit time: 809.281 seconds
根据最低的 AIC 值, ARIMA(0,1,1)(0,1,0)[52] 的 ARIMA 模型配置被指示为最佳拟合的模型。
现在,该模型可用于预测未来 15 周,并将这些预测与测试集进行比较:
predictions=pd.DataFrame(Arima_model.predict(n_periods=15), index=test_df)
predictions=np.array(predictions)
在将预测值与测试集的值进行比较之前,预测值将被重新整形,以便与测试集的格式相同:
>>> predictions=predictions.reshape(15,-1)
>>> predictionsarray([[ 88.0971519 ],
[103.18056307],
[117.93678827],
[121.38546969],
[112.9812769 ],
[120.69309927],
[144.4014371 ],
[166.36546077],
[181.69684755],
[190.12507961],
[204.36831063],
[218.85150166],
[216.59090879],
[197.74194692],
[156.98273524]])
现在,可以将测试值与基于均方根误差(RMSE)的预测值进行比较,数值越低表示误差越小。
>>> mse = mean_squared_error(test_df, predictions)
>>> rmse = math.sqrt(mse)
>>> print('RMSE: %f' % rmse)
RMSE: 10.093574>>> np.mean(test_df)
160.492142162915
与*均值 160 相比,RMSE 为 10。这表示误差略高于*均值的 6%,表明该模型预测 ADR 趋势的准确度相当高。
这是预测值与实际值的对比图。
来源:Jupyter 笔记本输出
结论
非常感谢您的宝贵时间,非常感谢您的任何问题或反馈。
你可以在这里找到这个例子的 Jupyter 笔记本。
免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应被解释为任何形式的专业建议。作者与本文提及的任何第三方无任何关系。
热点:机器学习系统中表现不佳区域的自动化
原文:https://towardsdatascience.com/hotspots-automating-underperformance-regions-surfacing-in-machine-learning-systems-89cc4a18ec27?source=collection_archive---------25-----------------------
隔离有问题的数据以进行补救和重新训练 ML 模型
粘土银行在 Unsplash 拍摄的照片
当系统具有高维数据时,对正确的数据输入区域进行故障排除就成为一个难题。热点自动识别与较差的 ML 性能相关的区域,以显著减少寻找这些区域的时间和错误。
概观
我们可能在生产中部署了一个 ML 模型,并在适当的位置部署了一些监控。我们可能会注意到,从经典的性能度量或者从结合可解释性技术的漂移监控来看,性能正在下降。我们已经确定我们的模型失败了,下一步是确定我们的模型失败的原因。
这个过程将涉及到分割和切块导致模型退化的输入数据。也就是说,我们希望看到哪些特定的输入区域与较差的性能相关联,并在此基础上制定解决方案,例如找到管道中断或在这些区域上重新训练我们的模型。
这基本上可以归结为一个耗时的大海捞针的任务。如果我们可以对流程进行逆向工程,并直接向用户展示所有的针,即与低性能相关的输入区域,会怎么样?
我们可以!我们将采取的步骤是
(1)在适当的划分目标上训练决策树。
(2)创建和存储热点树工件。
(3)在查询时从热点树中检索热点。
图 1:训练数据集并使用它创建热点树的通用框架,然后查询热点树以检索热点。每个阶段都输出下一行的第一部分中使用的工件。(图片由作者提供)
在下面的玩具例子中,我们将在整个帖子中使用,我们有两个由抛物线函数分隔的地面真实区域,抛物线上方是蓝色,下方是红色。数据点的颜色代表预测。我们希望隔离预测颜色与区域颜色不匹配的热点区域,我们在两个不同精度阈值的浅色框中这样做。
图 2:基于两个输入的热点检索示例。方框是热点,其中红色区域中的蓝点和蓝色区域中的红点是不正确的分类。随着阈值(在这种情况下是准确度)的降低,该算法以具有更多不正确分类的候选节点为目标,并且热点区域变得更窄/更纯。(图片由作者提供)
(1)在适当的划分目标上训练决策树
决策图表
当我们考虑将数据划分到感兴趣的区域时,我们应该考虑树模型,特别是决策树。请记住,我们的任务最终是一个推理任务,而不是预测任务,因此没有必要使用像随机森林或 XGBoost 这样的树集合模型,因为(a)我们没有试图执行预测,以及(b)集合引入了噪声和不确定的决策路径来分割我们的数据。
回想一下,决策树拆分的前提是基于在输入特征及其可能值的枚举中选择一个特征和拆分值,从而最小化杂质以基于输出标签创建更纯的子代。
简单地说,假设输出是彩色,我们有蓝色和红色的弹珠。所有的弹珠在两组中都有不同的直径,但是蓝色弹珠是有纹理的,而红色弹珠是光滑的。如果我们必须在直径大小或纹理之间选择来划分我们的弹珠,我们会选择基于纹理来划分弹珠,即纹理或*滑,因为这将完美地将蓝色弹珠分成一组,将红色弹珠分成另一组,在这种情况下,有效地将每组中的杂质减少到 0。
实际上,数据集需要多次分裂,以便将叶节点中的杂质减少到 0。
分割目标
那么,上面的蓝色和红色弹珠的等效物到底是什么呢?我们最终想要将坏的预测与好的预测分开,并且需要一些度量作为输出,即在我们的决策树中的划分目标。
对于分类,我们可以将正确的分类编码为 1,不正确的分类编码为 0。如果我们在划分时需要更多的粒度,我们也可以将分类编码为 1、2、3 或 4,分别表示真阳性、假阳性、真阴性和假阴性。
对于回归,我们实际上需要编码回归输出,即地面事实和预测之间的 RMSE,作为分类输出,例如,如果 RMSE 大于 RMSE 的中值+RMSE 的中值*均偏差,则数据点编码为 1,否则编码为 0。我们也可以使用百分比规则,例如,RMSE 超过 80%百分比的数据点为 1 或 0。我们不使用均值和标准差的原因是因为这些值会被高 RMSE 异常值扭曲,而重点是划分与*均值相比具有高 RMSE 的数据点。这模拟了我们在分类案例中想要的行为,在解释了分类案例的方法之后,我们将更深入地研究为什么我们不能使用回归输出。
(2)创建和存储热点树工件
如果我们将玩具示例中的 500 个数据点输入到决策树中,使用上面讨论的四个类的编码方法,该树看起来像这样:
图 3:例子[四。在两个输入 X[0]和 X1上训练决策树]。这些框是节点,其中每个节点具有一组相关联的度量(即准确度、精确度、召回率、F1 分数),这些度量可以用作查询热点的阈值。每个结点代表一组数据点,这些数据点通过从顶部根结点到特定结点的路径上输入要素的累积范围进行过滤。热点是违反用户指定的阈值的节点。提取热点节点]步骤。热点可以是树中的任何节点,而不仅仅是树底部的末端叶节点。(图片由作者提供)
在这里,我们只有两个特征:X[0]和 X1。在决策树的每个节点上,数据根据特征和临界值被分成两个子节点。例如,在根节点处,500 个数据点被分成两组,左子组和右子组,其中 X1 ≤ -2.258 和 X1 >-2.258。我们可以沿着从根节点到任何子节点的任何特定路径积累规则。
我们还可以计算节点中数据的准确性、精确度、召回率和 F1 等性能指标。
(3)在查询时从热点树中检索热点
现在我们有了热点树,让我们挑选一些热点!请注意,在图 2 中,我们有 0.3 和 0.5 的精度阈值。在后一种情况下,热点区域更宽,会意外捕获更多正确分类的点。随着阈值的降低,我们对偶然捕获正确分类的更大区域的容忍度降低。通常,我们可能认为我们总是想要较低的阈值来仅捕获错误分类的数据点,但是这确实冒了风险:( a)使区域变得非常小并且不可解释;( b)隔离许多可能不包含许多数据点的区域,需要大量的人工工作来调查。
那么这些热点是如何恢复的呢?
当在查询中发送准确性阈值以从热点树中提取热点时,我们从根节点开始遍历所有可能的路径。在遍历中的任何节点,如果一个节点违反了阈值,则该节点被定义为热点,并且该节点中的所有信息被附加到返回给用户的热点列表中。
具体来说,在我们的例子中,准确性是我们的衡量标准。在任何特定节点,如果该节点的精度低于阈值,我们知道该节点中的数据点共同违反了阈值,并且该节点是热点。每当一个节点被识别为热点时,沿该路径的遍历停止,因为下游节点会更纯,而性能差的节点甚至更极端地违反用户提供的度量和阈值。
当然,在查询时定义指标和阈值的好处在于,用户可以根据问题和阈值的容忍度,使用不同的指标和阈值组合进行重新查询。
发现热点!
使用阈值为. 5 的示例,我们的三个热点是
热点包含输入数据区域上的过滤器,这些过滤器可应用于获取整个数据集以进行进一步检查、研究和模型开发。
深潜
如承诺的那样,回答上面关于回归的悬而未决的问题,再加上一些更深层次的问题!
深入研究:(1)根据适当的划分目标训练决策树
那么为什么不回归呢?
天真的设置是在我们的回归任务中采用基础事实和预测之间的 RMSE,并将它们用作我们的划分目标。然而,分割节点中的数据的回归标准是基于到该节点的数据的*均输出值的某种距离度量,例如 MSE,在这种情况下是 RMSE 值本身。当我们遍历热点树时,我们会将 MSE 高于某个阈值的节点标记为热点。
假设我们有大部分的 RMSE 价值观。05 和大约 0.10 的一些 RMSE 值,我们希望标记和隔离后者。回归树完全有可能将更多的. 10 RMSE 数据点分组在树的较低位置,一旦检测到热点,我们将永远无法根据停止角色找到它们。例如,一个路径可能是 0.06 毫秒、0.09 毫秒、0.04 毫秒。给定 0.06 和 0.09 毫秒之间的用户阈值,在这种情况下,我们将永远不会到达第三个节点,因为 0.09 > . 04,并且第三个节点可能包含许多 0.10 RMSE 数据点(较低的 0.04 值来自于这样一个事实,即有许多 0.10 RMSE 数据点,只有几个 09 MSE 点,因此在 RMSE 值非常接*的意义上,该节点是“纯的”)。
我们可以使用自定义回归标准来解决这一问题,该标准使用相对于 0 的距离,即原始 RMSE 值,而不是相对于节点中*均 RMSE 的 MSE 距离,但这引入了跨模型和数据汇总的标准化问题。如果 0.10 的 RMSE 值对一个模型来说并不坏,但对另一个模型来说却是坏的,那该怎么办呢?因此,将回归设置转换为分类设置更可靠。
数据汇总
如果我们有一个流(或批处理)模型,我们一次在创建热点树时要放多少数据?如果我们在上周(或之前批次的)数据上创建了一个热点树,现在看到了传入的数据,我们是追加这些数据点并重新训练之前的树,还是为本周(或当前批次的)数据创建一个新的热点树?
实现这一点当然没有错误的方法,但在 Arthur AI,我们采用后一种方法。如果我们有一棵桔子树,现在有一些苹果装在一个盒子里,我们可能会对产生这些苹果的苹果树感兴趣,以找出为什么我们会收到一些腐烂的苹果,而不是我们上周已经检查过的桔子树(或批次)。
元数据丰富!
请注意决策树的输入实际上可以是任何东西,包括没有用作创建原始预测的模型的输入的元数据!这意味着通过热点展现洞察力不仅限于模型输入,如果我们跟踪模型中敏感的非输入属性,如种族或性别,这可能会有好处。
深入研究:(2)创建和存储热点树工件
为什么所有的指标?
准确性不是王道,用户需要不同的度量标准,这取决于他们的 ML 模型正在解决的任务。这个很好地介绍了精度和召回率等其他性能指标。读完之后,这里有两个实际的例子,在我第一次学习精确和回忆的时候帮助了我。
(1)考虑用于从财务报告中抓取财务数据的机器人的异常检测系统。如果我们有许多来自 ML 模型的假阳性,这将是可怕的,这意味着该模型将预测错误的信息(阳性)存在于许多实际上是正确的(假的)文档中,导致补救团队在没有错误的任务上浪费时间(如果一些假阴性从裂缝中溜走,这真的不会是很大的问题)。在这种情况下,高精度很重要。
(2)考虑癌症检测模型。如果我们从 ML 模型中得到许多假阴性,这将是可怕的,这意味着该模型将预测许多确实患有癌症(假)的人没有癌症(阴性),导致缺乏推荐的治疗和这些人的进一步健康并发症。在这种情况下,高召回率很重要。
多分类和微矩阵
我们如何推广到多分类任务?准确性仍然是一样的,我们可以在下面的玩具示例中的全球指标下使用加权的准确性、召回率和 F1 分数。请注意,我们现在不仅可以定义宏观指标,还可以定义精确度、召回率和 F1 分数的微观指标,这与每个基础事实类别有关。这可能是强大的,因为现在可以在特定类上遍历热点树,例如,如果鸟类导致对象检测模型的许多模型失败,并且我们希望弄清楚特别是鸟图像发生了什么。
图 4:一个多分类的例子(作者的图片)
结论
今天到此为止!希望您获得了一些关于如何为您的特定用例实现热点浮现的见解!我们在 Arthur AI 实施这些类型的系统,自动化是 ML 监控中客户体验的一个重要产品类别。
快乐监控!
设计生态学家在 Unsplash 上拍摄的照片
基于 Zillow 经济学数据集的房价预测
原文:https://towardsdatascience.com/house-price-forecasting-using-zillow-economics-dataset-2b58e6cd1c03?source=collection_archive---------25-----------------------
现实世界中的 DS
基于 SARIMA 模型的房价时间序列预测
作者图片
在之前的博客中,我们讨论了使用机器学习算法的房价预测模型。在这篇博客中,我们将讨论使用统计建模方法对 Zillow economics 数据进行时间序列预测。该项目于 2019 年 9 月实施,并对下一年即 2020 年的房价进行了预测。通过改变预测的跨度,即预测的年份或预测的持续时间,可以重用代码。本博客中讨论的结果是 2020 年的。
该项目通过使用 ARIMA 2020 年的统计模型预测房价,并显示全国和州房价的总体趋势,从而帮助客户、房地产代理商、房屋交易公司和其他投资者。2008/2009 年的大衰退给美国房地产市场带来了巨大损失。然而,房地产市场已经反弹,经历了房地产市场房价下跌后的快速上涨。投资房子是重大决策,需要慎重考虑。
房地产市场的上升趋势使得整个行业相当不稳定。因此,建议潜在买家在房产调查时多花些功夫,考虑他们的预算、财产税和其他各种因素。因此,对于潜在的买家和卖家来说,在采取大的或小的步骤之前,咨询房地产和房屋市场专家变得不仅仅是必要的。这个房屋预测数据科学项目将帮助买家、卖家、房地产顾问和其他利益相关者进行决策。1
本项目中使用的数据集是
- Zillow 经济学数据集-县时间序列和县人行横道
数据来源:【https://www.kaggle.com/zillow/zecon
Zillow 的经济研究团队从各种公共和私有来源收集、整理和发布住房和经济数据。向当地市政府归档的公共财产记录数据,包括契约、财产事实、地块信息和交易历史,构成了我们数据产品的主干,并通过 Zillow 上的财产清单和用户行为衍生的专有数据得到充实。
Zillow 汇总的大部分房地产市场和经济数据都可以在 zillow.com/data.免费下载
可用的数据文件有:cities_crosswalk.csv、City_time_series.csv、County_time_series.csv、CountyCrossWalk_Zillow.csv、DataDictionary.csv、Metro_time_series.csv、Neighborhood_time_series.csv、Neighborhood_time_series.csv、State_time_series.csv、Zip_time_series.csv [2]
我用的是 County_time_series.csv,CountyCrossWalk_Zillow.csv [2]
时间序列数据依赖于时间;以恒定的时间间隔进行采样。Zillow 每个月底都会收集数据。时间序列会有某种形式的季节性趋势。*稳时间序列的统计特性如均值、方差、自相关等。都是不变的。大多数统计预测方法都是基于这样一种假设,即通过使用数学变换,时间序列可以呈现为*似*稳的(即“*稳化”)。一个*稳化的序列相对容易预测:你简单地预测它的统计特性在未来将会和过去一样!
试图使时间序列*稳化的另一个原因是为了能够获得有意义的样本统计数据,如均值、方差以及与其他变量的相关性。如果序列是稳定的,这种统计作为未来行为的描述符仅是有用的。例如,如果序列随着时间的推移不断增加,样本均值和方差将随着样本的大小而增加,并且他们将总是低估未来期间的均值和方差。
使用 plolty 绘制的“所有房屋的销售价格中值”如下所示。
按月重采样后
下图是按月重新采样后的视图。
用迪基富勒测试检查*稳性
扩展的 Dickey-Fuller 测试是一个众所周知的统计测试,可以帮助确定您的时间序列是否是*稳的。[4]
静止与非静止
在*稳的时间序列中,均值和方差等统计属性在一段时间内保持不变。在非*稳序列中,这些属性依赖于时间。
为了确定一个时间序列是否*稳,我们将使用 ADF 检验,一种单位根检验。单位根是不稳定的一个原因,ADF 测试将测试单位根是否存在。[7]
如果时间上的单次移动不改变时间序列的统计特性,则时间序列是*稳的,在这种情况下,单位根不存在。
扩充的 Dickey-Fuller 检验的无效假设和替代假设定义如下:
零假设表明存在单位根。
另一种假设认为没有单位根。换句话说,*稳性是存在的。
如果 P 值小于定义的显著性水*,我们拒绝时间序列包含单位根的零假设。换句话说,通过拒绝零假设,我们可以得出结论,时间序列是*稳的。
如果 P 值非常接*您的显著性水*,您可以使用临界值来帮助您得出关于时间序列*稳性的结论。我为这个测试所做的实现在 Python Jupyter 的笔记本中,可以根据需要获得。
对时间序列执行 Adfuller 函数后的初始值
这里的滚动*均值不断增加,因此时间序列是非*稳的。在上图中,我们可以看到,检验统计量(p 值) >临界值为 5%,所以该时间序列是非*稳的。
消除趋势和季节性
差分就是用一个特定的时间间隔来计算差值。分解是对趋势和季节性建模,并将它们从模型中移除。
消除趋势和季节性
差异:在特定的时间间隔内取差异,分解:建模趋势和季节性,并从模型中移除它们
测试统计< critical value & p-value is 0.000005. We are getting constant mean and standard deviation. So now we got stationary time series.
ARIMA
ARIMA 算法是一类捕捉时间序列数据中时间结构的模型。然而,仅使用 ARIMA 模型,很难对变量之间的非线性关系进行建模。
自回归综合移动*均模型(ARIMA)是自回归移动*均(ARMA)的广义模型,它结合了自回归(AR)过程和移动*均(MA)过程,建立了时间序列的复合模型。
AR:自回归。一种回归模型,使用一个观察值和多个滞后观察值之间的相关性。
一:集成。通过测量不同时间观察值的差异使时间序列*稳。
移动*均线。当移动*均模型用于滞后观测值(q)时,考虑观测值和剩余误差项之间相关性的一种方法。p 阶 AR 模型的简单形式,即 AR (p ),可以写成线性过程,由下式给出:
这里 Xt 代表*稳变量, c 为常数, ∅t 中的项为滞后 1,2,…,p 处的自相关系数, ξt, 为残差,为均值为零且方差为 σt 的高斯白噪声序列。
ARIMA 模型的一般形式被表示为 ARIMA (p,q,d)。对于季节性时间序列数据,短期非季节性成分可能会对模型产生影响。ARIMA 模型通常表示为 ARIMA (p,q,d),其中:—
- p 是用于训练模型的滞后观测值的数量(即滞后阶数)。
- d 是应用差分的次数(即差分的程度)。
- q 是移动*均窗口的大小(即移动*均的阶数)。
例如,ARIMA (5,1,0)表示自回归的滞后值设置为 5。它使用差序 1 使时间序列*稳,最终不考虑任何移动*均窗口(即大小为零的窗口)。RMSE 可用作误差度量来评估模型的性能、评估预测的准确性以及评估预报。
因此,我们需要估计季节性 ARIMA 模型,它在一个乘法模型中包含了非季节性和季节性因素。季节性 ARIMA 模型的一般形式表示为(P,Q,d) X (P,Q,D)S,其中 P 是非季节性 AR 订单,D 是非季节性差异,Q 是非季节性 MA 订单,P 是季节性 AR 订单,D 是季节性差异,Q 是季节性 MA 订单,S 是重复季节性模式的时间跨度。估计季节性 ARIMA 模型最重要的一步是确定(P,Q,D)和(P,Q,D)的值。
然后,使用自相关函数(ACF)来测量由滞后 P 分隔的时间序列中的观测值之间的线性相关量,使用偏自相关函数(PACF)来确定需要多少个自回归项 q,使用反自相关函数(IACF)来检测过差分,我们可以识别自回归阶 P、差分阶 D、移动*均阶 q 的初始值以及它们相应的季节参数 P、D 和 q。参数 D 是从非*稳时间序列到*稳时间序列的差频变化的阶。
在针对单个时间序列数据的流行的单变量方法“自回归移动*均(arMA)”中,自回归(AR)和移动*均(MA)模型被结合起来。单变量“自回归综合移动*均(ARIMA)”是一种特殊类型的 ARMA,其中模型中考虑了差异。
多变量 ARIMA 模型和向量自回归(VAR)模型是其他最流行的预测模型,这些模型又通过允许一个以上的演变变量来推广单变量 ARIMA 模型和单变量自回归(AR)模型。
ARIMA 是一种基于线性回归的预测方法,最适合预测一步样本外预测。这里,所开发的算法执行具有重新估计的多步样本外预测,即,每次模型被重新拟合以建立最佳估计模型。该算法处理输入的“时间序列”数据集,建立预测模型,并报告预测的均方根误差。它存储两个数据结构来保存每次迭代中累积添加的训练数据集“历史”,以及测试数据集的连续预测值“预测”
萨里玛
ARIMA 是用于单变量时间序列数据预测的最广泛使用的预测方法之一,但是它不支持具有季节成分的时间序列。扩展了 ARIMA 模型(SARIMA ),以支持该系列的季节性部分。SARIMA(季节性自回归综合移动*均)是一种时间序列预测方法,用于包含趋势和季节性的单变量数据。SARIMA 由该系列的趋势和季节元素组成。[8]
与 ARIMA 模型相同的一些参数是:
- p :趋势自回归顺序。
- d :趋势差序。
- q :趋势移动*均订单
不属于 ARIMA 的四个季节要素是:
- P :季节性自回归顺序。
- D :季节差价订单。
- Q :季节性移动*均订单。
- m :单个季节周期的时间步数。
因此,SARIMA 模型可以指定为:
萨里玛(P,D,q) (P,D,Q)米
如果 m 是 12,它指定每月数据表示每年的季节性周期。
SARIMA 时间序列模型还可以与空间和基于事件的模型相结合,以产生解决多维 ML 问题的集成模型。这样的 ML 模型可以被设计来预测一年中一天中不同时间的蜂窝网络中的小区负载,如下面的示例图所示
来自时间序列分析的自相关、趋势和季节性(工作日、周末效应)可用于解释时间影响。
调整 SARIMA 超参数
配置 SARIMA 需要为序列的趋势和季节元素选择超参数。
实施细节
我使用 SARIMA 为时间序列预测编写的 python 代码(Jupyter notebook)可以按需获得。
用于预测时间序列数据的一个常用模型是 ARIMA 模型。它代表自回归综合移动*均线。如您所知,数据具有季节性,因此让我们使用季节性 ARIMA,SARIMAX 来预测模型。
Python 中可用于建模和预测时间序列未来点的方法之一称为 SARIMAX,它代表带有外生回归量的季节性自回归综合移动*均。
使用的 API 是-stats models . TSA . statespace . sarimax . sarimax[5]
使用的指标
R
r 表示项(数据点)与曲线或直线的拟合程度。
MSE — 均方误差
RMSE —均方根误差。它是 MSE 的*方根。
使用 Zillow Economics 数据集中的 County_time_series 进行县级房价中位数预测
每个 Zillow 房屋价值指数(ZHVI)是一个时间序列,跟踪特定地理区域的每月房屋价值中位数。一般来说,每个 ZHVI 时间序列始于 1996 年 4 月。Zillow 生成了七个地理级别的 ZHVI:街区、邮政编码、城市、国会选区、县、大都市地区、州和国家。我们用一个县的房价中值来做预测。我们先来看趋势。
在上图中,你可以看到一个清晰的趋势,但趋势中也有季节性。时间序列的预测应该是稳定的,否则预测将是不正确的。
预测模型(县序列 ZHVI _ 所有家庭)
从上面的图表中,我们可以看到-
直方图与 KDE 略有不同。线性回归是可以改进的。
验证模型
让我们通过列车测试和分离来验证该模型。[80, 20]
上面的预测并不完美,但与其他参数相比仍然是更好的。让我们看看模型的均方误差。
得到的均方误差为 95146.11
在上图中,您可以看到对未来 24 个月的预测,置信区间也更好,并且没有看到太大的差异。
预测清楚地表明,与 2019 年相比,2020 年的房价将会上涨。
后续步骤
作为下一步,我想使用亚马逊预测 API 来预测房价,并检查它是否会给出更好的结果。
承认
我真诚地感谢我的数据科学导师 Ramakrishna Soma 博士对我完成这个项目的指导和鼓励。
参考
- https://www . Washington post . com/business/2019/01/07/experts-weigh-what-housing-market-will-bring/
- Zillow 经济学数据集【https://www.kaggle.com/zillow/zecon
- https://people.duke.edu/~rnau/411diff.htm
- Dickey Fuller 测试 stats models . TSA . stat tools . ad Fuller—stats models
- ARIMA 模型 SARIMAX APIhttp://www . stats models . org/dev/generated/stats models . TSA . statespace . SARIMAX . SARIMAX . html
- 用 Zillow Economics 数据集进行房价预测https://towards data science . com/house-price-Prediction-with-Zillow-Economics-Dataset-18709 abff 896
- 如何用 Python 检查时间序列数据是否*稳https://machine learning mastery . com/Time-Series-Data-Stationary-Python/
- 关于用 Python 进行时间序列预测的 SARIMA 的简单介绍https://machinelementmastery . com/sa Rima-for-Time-Series-Forecasting-in-Python/
类固醇上的房价预测
原文:https://towardsdatascience.com/housing-price-prediction-on-steroids-83daccc84d6d?source=collection_archive---------34-----------------------
通过使用 Python 从外部数据生成要素来提升性能。
西雅图风景;图片来自pixabay.com
介绍
在本文中,我们将创建一个预测模型来预测西雅图的房价。我们将首先使用房产的属性制作一个模型,比如*方英尺、房间、卧室、浴室、风景等等。
然后,我们将通过从外部数据生成特征,如文化空间、公园、公共艺术场所、高尔夫球场、游泳海滩、野餐桌等的邻*度,来 显著改进该模型..衡量每个新增功能的改进。
我们要做什么
- 步骤 1: 探索西雅图房价数据
- 第二步:创建价格预测模型
- 步骤 3: 从外部数据添加特征
- 第四步:比较和分析结果
第一步。探索西雅图房价数据
为了制作这个模型,我们将使用来自这个房屋预测项目的“西雅图房价”。它包含 21613 份 2015 年以来的价格记录,其中有几个来自房屋的特征。
100 次观察的随机样本
“价格”列将是我们预测的目标变量。
让我们来看看价格与其他价格的关联热图。
价格对所有的关联图
值得一提的是,源代码并没有提供每个特性的描述,有些特性还不太清楚。出于本教程的考虑,我假设‘sqft _ living 15’是‘sqft _ living’的某种变体,以此类推。此外,他们如何量化“条件”、“景观”或“滨水区”有点神秘,但这并不困扰我,因为它们都没有根本的相关性。
第二步。创建价格预测模型
让我们创建一个标准模型来获得预测分数、训练(90%)和测试(剩下的 10%)。
StandardModel 类获得分数
引用文章的作者通过使用GradientBoostingRegressor获得了最佳结果,因此让我们用完全相同的参数保持完全相同的实验,以便能够知道这些特性带来了多少孤立的改进。
分数是 0.79(在 0-1 的范围内)。
我们想了解每个特性给表带来了多少改进。让我们做一个实验。让我们从一个随机选择的变量开始预测,然后一次增加一个变量,看看分数如何达到 0.79 的整个过程。
需要说明的是,第一行是模型只通过使用‘yr _ renewed’得到的分数,第二行是模型同时使用的‘yr _ renewed’和‘sqft _ living’得到的分数,以此类推。
这是每个新特性如何改进这个特定实验的模型的路线图。当然,并不是所有的功能都带来价值(有些功能甚至会减去价值),有些功能非常相关。
然而,这并不意味着如果以不同的顺序选择,这些特性会以相同的方式提供帮助,所以让我们将这个实验运行 30 次并收集数据以获得对特性重要性的更真实的了解。
让我们来看看 30 次实验后按特性计算的*均改进。
虽然探究为什么 sqft_lot 似乎会破坏模型会很有趣,但是这些结果并没有什么特别显著的地方。
第三步。从外部数据添加要素
现在,我们希望通过按位置添加相关数据来生成有用的特征。
首先,让我们使用这个来自 data.seattle.gov 的“西雅图野餐桌”,它(令人震惊地)列出了西雅图所有野餐桌的位置。
假设是野餐桌的距离与房价有着有意义的关系(如果附*有公园,房产会更有价值)。
为了生成有用的数字特征并将其添加到我们的数据集中,我们使用了位置混合算法。其工作原理是,我们将原始数据(西雅图房价)作为起点,并在限定的半径范围内添加来自“外部”数据集(野餐桌)的附*观察值的数量。
位置混合算法
“半径 1 公里范围内的野餐桌数量”作为一个新列添加到我们的西雅图住房数据集中,如下所示:
混合外部数据之前的数据帧
我们使用 OpenBlender API 在我们的数据帧上定位混合 1 公里半径上的野餐桌的“计数”,作为一个新特性。
现在,我们的西雅图住房数据框架有了一个新的数值特征,即在 1 公里的半径范围内计算野餐桌的数量。
混合后的数据帧
现在,让我们添加许多其他功能:
足球场
游玩区域
浅水池
饮水机
绿色区域
篮球场
公共艺术
野餐地点
高尔夫球场
让我们为 300 米半径和 1 公里半径创建特征。
现在我们有一个 47 列的数据框架,带有数字特征。
21613 行× 47 列
第四步。分析结果
现在让我们再次通过我们的模型运行新数据。
分数是 0.914!!
让我们再次随机添加变量,并与之前没有外部数据的模型进行比较,查看特性路线图。
没有外部数据的最大分数为 0.79 ,而有新数据的新分数为 0.91** ,在两种情况下使用相同的测试集和相同的模型。**
这是一个巨大的改进,我们只增加了一些功能!有一个几乎无限的功能宇宙可以添加,以进一步提高分数。
让我们再次运行实验 30 次,以了解每个特性的相关性。
文化空间似乎发挥了特别重要的作用。许多新功能提供了显著的改进。
这是 Github 到这个回购的链接。
如何在两周内构建基于云的 ML Ops 框架
行业笔记
在本帖中,我们将详细介绍我们如何依靠软件工程中的 DevOps 最佳实践,在两周内构建一个完整的 ML Ops 框架。
我们对 ML Ops @ Ekstra Bladet 的实现名为“Jokke”。资料来源:Ekstra Bladet。
许多组织已经投资开发基于机器学习的服务,但仍在努力寻找将机器学习模型从开发过渡到生产的最佳方式。
时至今日,这种方法通常是严格的,并且意味着各种各样的手动过程(以及这种手动过程所带来的所有操作风险)。从组织和模型开发人员的角度来看,这是非常低效和反生产的。
解决方案:ML Ops
当你开发一个现实生活中的机器学习服务时,你实际上是在开发一个软件。因此,在传统软件开发的世界中寻找解决方案是显而易见的。
正如在之前的文章中所详细描述的,来自软件工程的 DevOps 最佳实践使得软件可以(持续地)立即交付生产,并保持其可靠运行。
这些 DevOps 原则可以应用于开发和部署机器学习服务(新版本)的迭代过程。当这样做时,这有时被称为机器学习操作 (=ML Ops) 。
与 DevOps 类似,ML Ops 依赖于工具、自动化和工作流,这些工具、自动化和工作流抽象出意外的复杂性,让模型开发人员专注于他们应该做的事情和他们擅长的事情:开发机器学习模型。
建还是买?
存在多个云机器学习*台,包括 AWS Sagemaker、BentoML 和 ML Flow。它们当然不坏,但它们可能很贵,有时感觉像用大锤砸坚果。
当我们考虑如何接* ML Ops 时,我们知道我们将很快不得不将许多机器学习模型投入生产,特别是推荐系统和自然语言处理系统。
此外,我们知道我们需要一个标准化和可扩展的设置。这种设置必须为几个模型构建者指定清晰简单的规则,同时保持训练方法的自由度。最后,我们的解决方案必须支持多种多样的 ML 模型,并能够轻松实现不断涌现的新机器学习方法。
这让我们选择建造而不是购买。
遇见“Jokke”
在我们的组织 Ekstra Bladet 中,我们使用 Amazon Web Services 堆栈中的一套相关服务,在两周内构建了一个简单(但功能强大)的基于云的 ML Ops 实现。我们把这个框架命名为“Jokke”。
其核心“Jokke”由两条连续集成 / 连续输送管道组成。管道是动作序列,每次模型开发人员向 git 提交新版本的机器学习模型时都会自动运行:
- 构建和发布模型的构建管道
- 一个 DEPLOY 管道将模型部署为一个微服务,通过 HTTP 请求计算预测
下面我们举例说明了两个管道的工作流程(的简化版本),以及它们是如何相互链接的。
“Jokke”构建和部署 CI/CD 管道的工作流程。资料来源:Ekstra Bladet
接下来,我们将带您更详细地了解每个管道的工作原理。
阶段 1:构建
为了让机器学习模型与我们的框架兼容,模型的代码必须只满足几个要求。
我们已经尝试设计需求,这样它们强制执行我们为我们的模型开发代码的方式的最小标准化,而不限制模型开发人员对他们的分析方法和工具的选择的不必要的限制(实际上这是最重要的原因之一,为什么我们首先决定开发我们自己的框架)。
首先,我们要求模型的代码必须包装成 python 包。这是我们的框架与大多数可用解决方案之间的主要区别,后者专注于将笔记本电脑转变为服务。
我们还要求,模型本身必须作为自己的 python 类Model
来实现,并有两个强制方法:
produce_model()
:产生模型的方法。predict()
:通过调用(1)得到的训练模型预测新观测值的方法。
当模型开发人员向 git 提交模型的新版本时,它会触发“Jokke”BUILD管道来启动一个适当维度的虚拟实例,该实例:
- 安装软件包
- 运行由模型开发人员编写的测试(例如,单元、集成和验收测试(包括模型性能测试))
- 训练并生产模型工件(使用
produce_model()
方法) - 在我们自己的 Python 包索引上发布模型包
- 将模型工件和测试报告写入 AWS S3 存储桶
如果管道中的一个步骤失败,所有后续步骤都将中止。
如果流水线是成功的,则机器学习模型的新版本通过 python 模型包的新版本与训练好的模型工件的结合来发布。
如果你想知道代码中的构建管道是什么样子,我们已经发布了开源人工智能模型项目 NERDA 的简化版本:
一个用 Github 动作实现的我们的人工智能项目“NERDA”的简化“构建”管道的例子。
阶段 2:部署
如果“Jokke”构建管道成功,我们现在就有了自己的机器学习模型的新版本。如果我们想将模型部署为服务,即实时预测服务,我们的 Jokke DEPLOY 管道将完成这项工作。
我们所需要的是,模型开发人员构建一个最小的应用程序(默认为 python Flask 应用程序),该应用程序(1)加载由构建管道产生的模型包和模型工件,以及(2)利用predict()
方法预测“预测”端点中的新观察。
当模型开发人员向 git 提交应用程序的新版本时,它会触发“Jokke”DEPLOY管道,即:
- 收集由构建管道产生的模型包和模型工件
- 将应用程序封装并发布为 Docker 映像
- 从(2)中内置的 Docker 映像启动一个 web 服务,该服务提供实时预测
与第一阶段一样,如果管道的任何步骤失败,所有后续步骤都将中止。
如果流水线成功,机器学习模型现在在测试环境中运行,在那里它通过 RESTFUL API(默认)实时提供预测。
如果我们对我们的新服务感到满意,剩下要做的就是单击一下就批准它,这将触发我们的服务部署到生产。耶!
还有吗?
“Jokke”不仅仅是管道。例如,我们已经使用出色的 cookiecutter 包为“Jokke”模型和服务设计了自己的项目模板。
此外,我们还开发了云基础设施,这使得为新项目启用管道以及在测试和生产中实时监控模型服务的仪表板变得更加容易。
我们取得了什么成就?
“Jokke”管道的优势在于,每当模型开发人员想要发布一个新版本的模型时,它们会自动执行原本必须由他/她手工完成的操作和工作。这使得可以(连续地)立即将新模型交付生产,并保持它们可靠地运行。
此外,“Jokke”使我们的模型开发人员能够专注于模型开发,从而利用他们的生产力。
快捷键
如果你想为你的机器学习项目尝试 CI/CD,你可以考虑开源框架 CML(连续机器学习),那看起来真的很有前途。
如果您像我们一样选择开发自己的框架,我们建议您利用您的云*台上的相关服务。例如,我们使用 AWS CodeBuild 和 AWS Code Pipeline 来编排我们的管道。其他成熟的云*台上也有类似的服务。使用这些服务当然有助于大大加快我们的开发过程。
退关货物
“Jokke”是由三个人组成的团队在两周内开发的:亚历山大·詹森、西蒙·科肯多夫和你真正的。它现在被 Ekstra Bladet 的数据科学团队和 Ekstra Bladet 的 ML 创新团队用于构建和部署大规模模型,后者是新闻*台智能项目的一部分,由丹麦创新基金慷慨赞助。
资源
https://cml.dev/ https://pypi.org/project/cookiecutter/
400,000+Tweets 如何显示 Simone Biles 获胜
原文:https://towardsdatascience.com/how-400k-tweets-show-that-simone-biles-wins-ee941bdb13e2?source=collection_archive---------22-----------------------
奥运会是世界聚集的地方。Twitter 是全世界分享观点的地方。让我们使用 Graphia 和 NetworkX 来看看 Twitter 是如何对 Simone Biles 的决定做出反应的
围绕“西蒙·比尔斯”的推文网络在 Graphia |塞犍陀·维韦克中可视化
西蒙·比尔斯的所作所为非常勇敢。或者至少,这是一种观点——我同意。我也热切地相信,她所做的将大大有助于推动我们的社会走向更少的偏见和更多的*等。我们的社会中存在着某些错误的期望和偏见;无论是在种族、性别方面,还是在这种情况下,顶级运动员应该或不应该做什么。我们慢慢开始意识到,这些孤立的观点并不能说明问题的全部,而且会造成巨大的压力。Simone Biles 为自己挺身而出,向世界展示,通过实现梦想和保持健康,你可以过上最好的生活。不必非此即彼。
但是世界对此作何反应呢?毕竟,奥运会最终是让全世界的人们聚集在一起进行友好的竞争。Twitter 是全球人民讨论的地方。所以推特是一个很好的信息来源,可以知道西蒙妮·比尔斯的决定是否被正面看待。这个问题的答案我们来看看 Twitter 的数据。
抓取 Twitter 数据
对于数据集,我在不到一天的短时间内收集了所有引用“西蒙妮”+“比尔斯”的推文。这可以是包含单词“Simone”和“Biles”的任何引用,包括“Simone Biles”或“#simonebiles”(不区分大小写)、“simone_biles”等。因此非常全面地代表了引用 Simone Biles 的所有 tweets。我使用 Twitter API v2 学术研究轨道,使用 Python 搜集 Twitter 数据。代码如下:
以下是每小时“西蒙·比尔斯”的推文数量与时间的关系:
每小时提到“西蒙·比尔斯”|塞犍陀·维维克的推特数量
以下是转发量最高的 10 条推文。
引用“西蒙·比尔斯”|塞犍陀·维维克的转发量最高的推文
转发量排名前 10 的推文都是支持西蒙妮·比尔斯的!
以下是最受欢迎的 10 条推文。
前 10 名喜欢引用“西蒙·比尔斯”|塞犍陀·维维克的推文
在这种情况下也是一样——所有前 10 名喜欢的推文都是西蒙·比尔斯的!
推特网
与我在#GameStop 上的文章类似,我建立了推文网络——其中节点是用户名,有向边表示用户通过@引用其他人。为此我使用了 python NetworkX 包。代码如下:
为了找到最重要的节点,我使用了 PageRank 算法。谷歌使用 PageRank 算法对网页进行排名,这也是它成为著名搜索引擎的原因。
在提到“西蒙·比尔斯”|塞犍陀·维维克的推文中,排名靠前的 10 个用户名
在关于西蒙妮·比尔斯的讨论中,所有被引用最多的推特人都是西蒙妮·比尔斯的支持者!
图形分析
Graphia 是一个网络可视化包,它本身可能值得一篇教程文章。我发现它比流行的图形可视化软件 Gephi 反应更快,视觉更清晰。然而,Graphia 拥有极其最少的文档。
我无法在 Graphia 中可视化 40 万个节点,我将数据随机采样到 5000 条边中。(注:图中采样其实挺复杂的,但普遍使用的是随机采样)。
在 Graphia 中,很容易加载我生成的包含 5000 个随机采样边的边文件。最初,图表看起来像这样:
“西蒙·比尔斯”推特网的图解探索|塞犍陀·维韦克
Graphia 使用强制定向布局算法。该算法模拟所有图形节点之间的排斥力,以及连接的节点之间的吸引力,从而产生美丽的可视化效果。外围的节点并不都连接到中心的单个组件。因此,我们在不影响我们感兴趣的基本图形结构的情况下删除了这些节点。双击最大组件中图形的任何部分,放大该组件。
放大图片中最大的 twitter 网络组件|塞犍陀·维维克
然后我想象 2D 的图表
2D 推特网络可视化|塞犍陀·维维克
接下来,我添加一个 PageRank 中心性可视化,将节点从蓝色(低等级)着色为红色(高等级)。
Graphia 2D twitter 网络可视化(颜色表示页面排名中心)|塞犍陀·维韦克
在最大的蓝色圆圈的中心有一个鲜红色的节点,上面覆盖着多个节点。
放大可以看到,核心是 Simone Biles 的推特手柄@Simone_Biles:
放大网络的心脏|塞犍陀·维维克
于是,围绕 Simone Biles 的对话就围绕着@Simone_Biles 展开了。这是有道理的,但这也表明西蒙妮·比尔斯能够控制自己的叙事。很有可能人们在负面谈论西蒙妮·比尔斯,在这种情况下,他们可能不会提到西蒙妮·比尔斯,而是她的诽谤者。看到她周围所有的支持是令人振奋的。
结论:
多个指标显示,围绕西蒙妮·比尔斯的推特对话对她的行动表示支持。也许通过选择不参加奥运会,并保持与她优先考虑的事情的联系,她赢得了比她以前无数次仅仅参加比赛更多的心。那不是会让她成为更大的赢家吗?
关注我 如果你喜欢这篇文章。
如果你对技术和现代社会之间的相互联系有全面的认识,请订阅我的时事通讯。
https://skandavivek.substack.com
数据科学导师如何帮助您
原文:https://towardsdatascience.com/how-a-data-science-mentor-can-help-you-41c7421c6e6e?source=collection_archive---------38-----------------------
地面零点
你可以向数据科学导师询问的 5 件事
由韦德·奥斯丁·埃利斯在 Unsplash 上拍摄的照片
导师、蔻驰或向导。没关系。你需要一个能帮助你更快实现目标的人。我最*加入了一个名为sharpes minds的社区,通过一个导师项目来帮助那些想成为数据科学家的人。在过去的几年里,我指导我的几个朋友成功地将他们的职业生涯转向了数据科学。这就是为什么我觉得这项服务对那些想转行的人来说很有意思。然而,在与几位候选人交谈后,我发现许多候选人不知道他们可以从导师那里期待什么。完整地说,我认为许多人都希望他们的导师能给他们带来魔力。
这不是魔法,也不会一蹴而就。如果你问我,导师可以通过几种方式提供帮助。我想在这里与你分享,以确保你无论作为导师还是学员都能管理好自己的期望。
1 —有哪些必备技能?
导师可以帮助你在最短的时间内确定数据科学和软件开发中的基本技能和工具,如果没有你将无法工作。例如,导师可以帮助你识别数据争论的基础或者 Git 技术的基础。你没有世界上所有的时间,你必须有效地利用你的时间。
作为一名数据科学家,您必须学会如何使数据集为各种下游目的(数据争论)做好准备。你有时间仅仅为了数据争论而读一本 500 页的书吗?很可能不是!你还必须学会如何在团队内部协作开发(git 技术)。我从加入软件开发团队的数据科学家那里听到了许多恐怖的故事,他们不知道 Git,一种使您能够协作开发的技术。毫不奇怪,我写的“ 如何用简单的语言学习 Git”文章在 2 周内获得了大约 30000 次浏览。
导师可以帮助你在最短的时间内找到数据科学和软件开发中没有你无法工作的基本技能。
2 —你能检查我的代码吗?
不知道开发的最佳实践的数据科学家成功的机会更小。导师帮助学员的一个好方法是回顾 Github 项目,提供一些关于如何建立机器学习管道或进行最佳开发实践的提示。
首先,候选人在 Github 或 Bitbucket 上建立一个项目组合来展示自己总是有好处的。然而,更重要的是高质量地建设那些项目。例如,建议构建和部署一个机器学习服务,它可以通过一组 REST API 向用户提供服务,而不是将你的代码推送到一个只包含如何训练一个模型的 Github repo。开发中的最佳实践之一是“自动化开发管道”。我想你会喜欢看这篇文章:“ 如何构建自动化开发管道 ”
一个不知道开发的最佳实践的数据科学家成功的机会更少。
3 —我如何在竞争中脱颖而出?
竞争有两个层次,一个是找工作前,一个是找工作后。在这里,我想描述一下导师是如何帮助你“找到工作”的。找工作后有很多方法可以提高,这不是本文的重点。导师可以帮你磨砺简历。你无法相信有多重要。获得面试的比率直接关系到你简历的质量。更重要的是,如果合适的人帮助你展示自己,你无法相信你的简历会有多好,尤其是如果你的背景是工程或科学。那些来自商业背景的人知道如何恰当地展示自己。简历是一页纸的文件。许多人很难在一页纸的简历中恰当地概括自己。
你无法相信,如果合适的人帮助你展示自己,你的简历会有多好,尤其是如果你的背景是工程或科学。
阅读这两篇文章:如何写一份优秀的数据科学家简历—给初学者和如何写一份优秀的数据科学家简历—给专业人士。如果你仍然需要帮助来改进你的简历,给我写信。
4 —我如何才能在数据科学面试中胜出?
数据科学面试通常有三个技术步骤:(a)SQL 挑战,(b)ML 挑战,以及(c)现场技术面试。前两步成为标准,而第三步因公司而异。导师可以通过提供一些例子和解决方案以及分享一些技巧来帮助你面对 SQL 和 ML 的挑战。尤其是那些容易让你被拒绝的。你可以阅读这篇文章:“数据科学家 SQL 面试入门指南”来提高你的 SQL 技能。我正在写一篇名为“数据科学家 ML 面试入门指南”的文章。你可以订阅我的邮件列表或者跟随我阅读这篇文章。
数据科学面试通常有三个技术步骤:(a)SQL 挑战,(b)ML 挑战,以及(c)现场技术面试。
5-感谢额外的小费。
除了以上几项,一个优秀的导师可以在你个人成长的每个方面为你提供额外的建议。例如,基于你的兴趣和需求,一个伟大的导师可以为你提供有效的自学教育资源。一个学员可能拥有数学或物理的研究生学位,但没有任何编程经验,而另一个学员可能来自软件开发行业,没有任何线性代数或统计方面的背景。他们有不同的需求。你会喜欢阅读这篇文章:“用于各种教育目的的数据科学的 6 个 YouTube 播放列表”。
一个伟大的导师可以在你个人成长的每个方面为你提供额外的建议。
最后的话。
这是我认为导师可以提供帮助的 5 个方面。我可以列出更多,但这些是最常见的指导方式。导师也可能利用他或她的职业关系网给你找份工作,但除非你在这条路上表现出色,否则这是不可能的。希望这篇文章对你有用。如果你需要帮助来得到一份数据科学的工作,给我写信。
感谢阅读!
如果你喜欢这个帖子,想支持我…
- 跟我上 中 !
- 在 亚马逊 上查看我的书!
- 成为 中的一员 !
- 连接上 Linkedin !
- 关注我 推特 !
https://pedram-ataee.medium.com/membership
数据科学家如何…装饰他的客厅?
原文:https://towardsdatascience.com/how-a-data-scientist-decorates-his-living-room-c5026f490c2b?source=collection_archive---------39-----------------------
数据驱动的方法:第二集
我为我的客厅找了一段时间的插图,但没有成功。因此,我想起了我在儿子的房间做的事情。那很有趣。😂
这样,我开始想办法用我的数学知识和技能来制作自己的插图。在网上搜索了几分钟后,我偶然发现了这个关于生殖艺术的马库斯·沃尔茨惊人的 GitHub repo
立刻,我变得非常兴奋,开始写我的第一行代码。
资料来源:Giphy.com
我的方法如下:
插图#1
我知道我的家庭办公室里有几个框架积了很多年的灰尘。所以我试着复制马库斯·沃尔茨的最*邻居图,但加入了个人风格。
我稍微修改了上面提到的 repo 的代码,以便为我的插图构建一个矩形。
作者图片
这很酷,但我需要更多。如果不是将每个点连接到其最*的邻居,而是以某种方式突出了点之间的关系。我的意思是,如果我用以下属性来标识这些点会怎么样:
点 A 是点 B 的一个 k 最*邻,而 B 也是 A 的一个 k 最*邻。
我真的很喜欢它的输出。
k = 8 个最*的邻居。为什么是黄色?与客厅的其他装饰相协调(图片由作者提供)
突然在想,黄段子和黑段子有关系吗?我会把它作为一个练习😉
插图#2
我一直在浏览 Marcus 的网页,因为我知道了 T21 的 Delaunay 三角剖分和 Voronoi 图之间的关系,所以我决定使用相同的数据集将两者结合在同一个图表中,并再次使用黑线和黄线。
结果是这个。
Delaunay 三角测量加 Voronoi 图版本(图片由作者提供)
任务完成。现在,是时候打印和悬挂它们了😎。
作者图片
一个数据科学家如何去相亲
实践教程
贝叶斯框架中的有序回归
照片由 波琳娜·坦基列维奇 上 像素
当数据科学家准备相亲时,他/她会情不自禁地思考爱情、存在的孤独和相互信任。嗯…可能不是所有的数据科学家都这么想…但有些可能。无论如何,我想用最后一项,关于相互信任,给大家介绍一个贝叶斯框架中的序数回归这个话题。
因为即将到来的约会将是一次盲目的约会,我们不能确定对方的观点和信念。然而,在心理学中,已经有很多关于描绘性格的研究。标准化的问卷和测试被用来评估心理特征。这种问卷通常由评分表组成。受访者需要从一组离散的有序答案选项中进行选择,如“完全不同意”、“不同意”、“无意见”、“同意”和“完全同意”。这种等级量表被称为李克特量表。在本博客中,我们将利用这样一个问卷的例子来评估特定问题的答案,以及答案如何依赖于性别和年龄等特征。
马基雅弗利
这篇博客中的数据来自于克里斯蒂和盖修的 MACH-IV 问卷,它提供了一个马基雅维利主义的衡量标准。以尼可罗·马基亚维利命名的马基雅维利主义在现代心理学中被用来描述缺乏同情心和道德观,以及对个人利益的强烈关注。MACH-IV 问卷由摘自马基雅维利著作的 20 个陈述组成,受访者按照从“强烈不同意”到“强烈同意”的五分制对他们的同意程度进行评级。数据集可以在这里下载,真的很大;出于本报告的目的,我将仅使用从荷兰网络位置上传的数据。此外,我只关注 20 个问题中的一个:“总而言之,谦虚和诚实比重要和不诚实更好”。下图基于黑伯格和知更鸟,显示了结果与年龄和性别的关系。
发散堆积条形图显示不同性别和年龄类别的所选问题的答案。总行数绘制在右手轴上。在我之前的博客中可以找到更多关于这类情节的细节。
该图显示,老年人和女性更倾向于同意这种说法。当试图对年龄和性别这两个独立变量的李克特量表的结果进行建模时,最好使用有序回归。因此,我想探讨这种类型的回归,以及如何在这份报告中的贝叶斯框架中进行这种回归。
模型
由于我们想要预测的结果是有序的,我们需要在贝叶斯框架中创建一个有序回归模型。可以这样做。答案 yᵢ={1,。。。,k} 归入 K 有序答案类别为 i = 1。。。n 个样本。该模型假设 yᵢ 是一个潜在的——未观察到的——连续量 yᵢ 的观察实现。此外,该模型定义了截止点 αₖ ,使得:
分界点 αₖ 根据因变量估算为 αₖ = β∗xᵢ 。注意,我们假设 β 不依赖于该模型中的 k ,因此假设对于每个切割点是相同的。此外,我们定义α₀=∞和 αₖ = ∞ ,这转化为以下描述:
其中 Cat(pᵢₖ) 是 pᵢₖ ≥ 0 和∑ pᵢₖ = 1 的分类分布。变量 pᵢₖ 表示样本 i 落入类别k的概率,分界点 αₖ 和回归变量 β 需要从数据中估计。在贝叶斯框架中,我们需要为分界点 αₖ 设置正态先验,因为 k = 1。。。,k1和回归变量 β 。在我们的示例中,我们有 K = 5 个答案选项、 n = 1062 个回归变量(年龄和性别)。让我们使用 σ = 1000 的相当无信息的先验。
这个模型的数字实现可以有许多不同的方式。在这篇博客中,我描述了使用 rjags 包在 R 中的一个实现。为了对变量进行正确的数值估计,对临界值 α 进行分类很重要。为了帮助模型开始,我们还需要提供 α 的有序初始值。JAGS 的模型描述如下:
```{r model, message=FALSE, cache=TRUE, results='hide'}
jags_model <- " model {
for(i in 1:length(answer)) {
answer[i] ~ dcat(p[i, 1:5])
logit(Q[i, 1]) <- alpha[1] - mu[i]
p[i, 1] <- Q[i, 1]
for (j in 2:4) {
logit(Q[i, j]) <- alpha[j] - mu[i]
p[i, j] <- Q[i, j] - Q[i, j-1]
}
p[i, 5] <- 1 - Q[i, 4]
mu[i] <- beta[1] * age[i] + beta[2] * gender[i] # no intercept
}
## priors over thresholds
for(j in 1:4) {
alpha0[j] ~ dnorm(0, 1.0 / 1.0e3)
}
alpha <- sort(alpha0)
# Priors for regression coefficients
for(j in 1:2) {
beta[j] ~ dnorm(0, 1.0 / 1.0e3)
}
} "
结果
空间不允许在此显示所有诊断数字。相反,下表显示了变量的收敛、自相关、有效大小和点估计。盖尔曼统计量接*于 1,显示出适当的收敛。即使应用了 10 的稀疏因子,自相关系数也相当高。这种高相关性也反映在低有效样本大小值中。点估计显示有序的 α ,与年龄和性别呈正相关:老年人和女性更倾向于同意这种说法。
对于有序回归,定义和解释残差是相当困难的。在刘和张的之后,我们基于潜在变量计算替代残差。下图显示了作为*均响应函数的残差的小模式。qq 图显示了两端与预期直线的偏差,表明了非线性行为。残差中没有自相关,这很好。
通过计算数据集中每个条目的 pᵢₖ ,可以对数据进行预测。随后,可以从分类分布 Cat(pᵢₖ) 中进行抽取。由于这涉及到随机抽取,我们重复这个过程 100 次。结果可用于创建列联表。下表显示性能不怎么样,准确率只有 23%。
应用模型
假设一个 30 岁的男孩遇到一个 28 岁的女孩。在这个问题上,他的回答至少和她一样肯定的概率是多少?我们可以分别使用男孩和女孩的特征来计算模拟中每个条目的概率 pᵢₖ 。随后,可以从分类分布 Cat(pᵢₖ) 中进行抽取。下图显示了潜在变量的分布,它们有很大的不同。对于男孩来说,潜在变量更高的概率只有 0.5%。当查看答案类别时,通过从分类分布中抽取来模拟,我们发现有 55%的可能性,男孩的答案至少和女孩一样肯定。
结束语
使用贝叶斯框架的有序回归需要一些努力。所得到的模型受到高度自相关的影响,并且只能稍微预测正确的响应。很可能这个模型中没有考虑的其他因素也有影响。贝叶斯框架确实允许非常容易地估计答案的概率并比较它们。
人工智能如何赋能辅助技术并减少不*等
原文:https://towardsdatascience.com/how-a-i-can-empower-assistive-technology-and-raise-inclusiveness-abf616e78377?source=collection_archive---------28-----------------------
在 Unsplash 上拍摄的 ThisisEngineering RAEng
关于人工智能如何应用于残疾人辅助技术的快速介绍。
在过去几年中,数字技术已经显示出解决现实生活挑战的巨大能力,有助于改变经济的重要领域,无论是所谓的工业 4.0 还是健康领域。
另一方面,如果我们超越比特和字节,人工智能可以拓宽所有层面的包容性。让我们看看怎么做。
对智能辅助技术的探索
辅助技术越来越被认可,是通用架构之外对人工智能适用性较好的领域。
根据《福布斯》杂志发布的一篇文章,结合 Coherent Industry Insights 的数据,2015 年残疾人和老年人的技术市场估计为 140 亿美元,预计到 2024 年将达到 260 亿美元。
在人工智能(A.I .)资源和现代人机界面的帮助下,人类正在学习和掌握新的能力,为最需要的人寻求挑战的解决方案。
有了正确的技术,残疾人将有适当的资源来解决进入就业市场的障碍。
换句话说,使这些资源更容易为每个人所用,是保证残疾人进入传统上无法进入的手术场所的一种手段。
人工智能将如何支持这一点?
鉴于人工智能的全部潜力,技术需要让所有领域的人们的生活变得更简单。
全世界只有十分之一的残疾人可以使用辅助设备。因此,这一人口结构对就业数量的影响非常显著。残疾人的失业率是非残疾人的两倍。
2018 年 5 月,该公司首席执行官塞特亚·纳德拉报告了一项为期五年的 2500 万美元(约 9300 万雷亚尔)的承诺,用于残疾人的人工智能计划。
脸书是另一家投资残疾人人工智能项目的互联网巨头。社交网络使用算法为盲人创建即时图片摘要。该功能并非完美无缺,也没有超越人类的定义,但却增加了一个更加开放的世界。
有几种机器学习的技术。但是,他们的共同点是,每个人都希望人们向他们展示如何学习一项具体的工作,做他们想做的事情。例如,在脸书,图像识别系统由观看图像并告诉机器图像内容的人监控。
实时语音处理和人类语言转录是最传统的人工智能工具之一,对患有这种残疾的人来说非常有用。
虽然人工智能资源在智能手机中非常普遍,但仍在努力将这一事实引入物理世界。
由计算机视觉技术驱动的光学字符识别(OCR)也可以包括在内,这是一种将文本从纸质格式翻译成电子版本的方法。这意味着书籍,打印的电子表格,甚至插图和文本图像都可以转换成电子格式,并使用电子语音合成器大声朗读。
人工智能还将帮助盲人或视力低下的人受益于各种辅助技术,从盲文到计算机放大应用程序,机械放大镜和扩展字母键盘。
视障人士仍应依靠光学字符识别(OCR)。扫描仪类型将最初为纸张格式的文本转换为数字格式。然后,它被翻译成音频。报纸、杂志、书籍和图像可以使用电子语音合成器朗读或呈现出来。
物联网已经允许识别更多关于消费者和活动模式的知识。今天,计划以前对许多残疾人来说很难的任务变得很容易,如开关门窗、开灯关灯、更换移动设备、打开风扇、打电话等。它被称为家庭自动化。
在某些情况下,辅助技术使家庭变得智能。例如,残疾居民可以使用预设命令来启用应用程序。令人着迷的是,这种形式的技术还允许自我调整。
因此,根据先前描述的环境和迹象,将会有对太阳、温度、防雨等的调节。,往往旨在更大的独立性和户主的安全。
辅助人工智能的一个实例:计算机视觉 PDFReader
我正在开发一个应用程序,可以帮助用户仅通过头部运动来控制 PDF 阅读器。
使用人工智能,在计算机视觉中,web 应用程序使用形状预测器来检测用户面部的特征,以识别感兴趣的关键点和面部图像。有了这些信息,web 应用程序就可以做出控制 pdf 阅读的决定,比如放大和缩小、改变页面以及上下滚动。
许多智能手机应用程序使用摄像头来监控鼠标和键盘;我在这里的目的是提高对人工智能如何增强辅助技术的认识,让身体残疾的人能够执行日常任务。
在这篇文章中,您可以了解关于这款网络应用的更多细节。
结论
人工智能和移动技术的民主化是改善全球融合的一种方式,为残疾人带来越来越多的选择和生活质量。
除了促进日常任务之外,智能设备还可以获得社交社区的机会,并利用文化本身的知识——这是学习和成长过程中的基础。
人工智能应该被构建和应用来减少不*等,并与更具包容性的劳动力市场的建设合作,在这个市场上,智能资本可以让人们更高效、更舒适地执行日常任务。同样,我期待人工智能给每个人越来越公*的条件。
还有一件事…
如果你想在学习之旅中走得更远,我为你准备了一份关于人工智能、机器学习、深度学习和数据科学的培训课程清单,你现在就可以免费参加:
- 什么是预测分析,你今天如何使用它?
- 最好学的免费课程是当今的人工智能、ML、数据科学。
- 60 多门课程,有评分和总结(当然是 A.I .做的)。
参考
- 美国劳动力政策咨询委员会 9 月 18 日…https://www . commerce . gov/sites/default/files/2019-09/2019 _ SEPT _ AWPAB _ public comments _ 09132019 _ r . pdf
- 辅助性人工智能实例:计算机视觉 pdf reader—https://jairribeiro . medium . com/a-practical-example-of-Assistive-a-I-The-Computer-Vision-pdf reader-b 77 b 0 f 6 f 9 bfb?sk = 88257 d4e 84 f 61414984 e 83 f 53 FBE 2512
你愿意支持我吗?
为了获得无限的故事,你还可以考虑注册https://jairribeiro.medium.com/membership*成为中等会员,只需 5 美元。此外,如果您使用我的链接* 注册 ,我将收到一小笔佣金(无需您额外付费)。
*https://jairribeiro.medium.com/membership *
人工智能如何在佛罗里达公寓倒塌之前就警告我们
原文:https://towardsdatascience.com/how-a-i-can-prevent-future-building-collapses-before-they-happen-71c3bf3740b5?source=collection_archive---------28-----------------------
一个人不能整天坐着盯着一面墙。电脑可以。
佛罗里达州 Surfside 的 12 层海滨公寓的部分倒塌震惊了全国。98 人被证实死亡,这是美国历史上最致命的建筑倒塌事件之一。结构性故障的根本原因尚未确定,但是从的初步报道来看,这场悲剧似乎是可以避免的。
左图显示了 2021 年 6 月 24 日 Surfside 公寓大楼倒塌的后果。右图显示了人工智能探测器对“混凝土癌症”的探测。左图由迈阿密戴德消防救援部门拍摄,并且是公共领域。右图由阿齐姆·海林在维基媒体下知识共享署名拍摄
想象一下,如果已经存在于许多高层停车场的安全摄像头也可以报告建筑物本身的混凝土损坏
在为一家名为 Clarifai 的人工智能初创公司担任 Upwork 承包商几周之后,我意识到我可以利用他们的*台来创造这样一个东西。摄像系统已经全天 24 小时拍摄公共区域——包括混凝土停车场。下面的视频展示了一个完整的演示,包括灾难前一年对尚普兰塔南车库的漫游。
需要注意的一件重要事情是:虽然下面的演示使用了一个人走路时拍摄的视频(这是我们在倒塌前拥有的唯一一段 Champlain Towers 车库的镜头),但 AI 的设计是与安装在墙上的固定摄像机一起工作。它将扩展安全摄像机的作用,不仅记录人们在其视野中的行为,还报告墙壁本身的状况。
解释本帖中讨论的模型的背景、开发和演示的视频文章。模型演示从 2:43 开始。
一点背景知识
生活在像迈阿密海滩这样的热带气候中有一定的复杂性,特别是夏季的洪水。下面的照片和视频展示了一些更极端的例子,但这种情况一季会发生 3-4 次。天真的司机试图穿越被洪水淹没的道路,水被吸入他们的进气口,毁坏了他们的发动机缸体,这种情况太常见了。暴雨通常伴随着一些滞留的车辆,偶尔飓风会通过风暴潮将更多的水推到该地区。
我在 2018 年 7 月拍摄的夏季降雨引发洪水的照片。这是在柯林斯大道 6900 号街区拍的,8700 号,离尚普兰塔南区 18 个街区。作者照片。
虽然尚普兰塔灾难的原因尚未确定,但很容易想象这样的洪水,加上咸咸的海洋空气,会产生一系列独特的挑战。这个问题看起来也在恶化,以至于美国陆军工程兵团提议修建 20 英尺的海堤来保护迈阿密市。如果在未来的几年里,更多的佛罗里达建筑被发现不安全并被疏散作为预防措施,这一点也不奇怪。
迈阿密海滩七月被洪水淹没的道路。这些小洪水出奇地频繁。我拍下这段视频的那天,我不得不去当地的牙医那里去赴一个非常湿漉漉的约会。作者视频。
从我的屋顶看出去
这张照片是我在迈阿密海滩的楼顶拍的,离尚普兰塔大约 2 英里,背景是迈阿密市。戏剧性的天空和日落是该地区的典型特征。作者照片。
冲浪灾难对我个人产生了影响。三年来,我住在迈阿密海滩的一栋类似的建筑里,就在灾难现场以南 2 英里处。我的家坐落在沿着柯林斯大道延伸的美丽海滨地带,从阳光岛一直延伸到迈阿密海滩顶端的南角。我多次路过尚普兰塔。
2020 年 4 月 1 日,在新冠肺炎疫情,我在阳台上拍了一张照片,照片上是两艘停泊着骷髅船员的巨型游轮。作者照片。
即使救援行动停止并转入恢复模式,倒塌的影响已经开始影响社区。住在高楼里的人担心他们的安全。房主对他们的财产价值感到害怕。已经被新冠肺炎疫情震撼,该地区的一切都感觉不确定。
在南佛罗里达的所有高层建筑中,安全摄像头都是常见的景象。图片由拍摄什么是图片完美在 Unsplash
住在迈阿密海滩的时候,我一直在想的一件事是,南佛罗里达州的每栋高楼到处都有摄像头——甚至在停车场。
这意味着,利用人工智能,我们可以利用现有的安全摄像头,为建筑物中的结构问题创建一个早期预警系统。
人工智能已经在医学领域拯救生命
当你想到“人工智能”时,许多事情都会浮现在你的脑海中。你可能会想到计算机打败了国际象棋大师,波士顿动力公司的跳舞机器人,甚至是能够接受采访的计算机。然而,人工智能有许多子集,有些不难概念化。
人工智能的一部分被称为机器学习,它的工作方式有点类似于人类的学习方式。如果我告诉你,我想让你学会如何通过 CT 扫描来识别淋巴瘤,你会怎么做?你可能会要求提供几个癌症 CT 扫描的例子,以及几个不含任何癌症的 CT 扫描的例子。也许只要举几个这样的例子,你就可以开始在医学扫描中发现肿瘤。这就是人类的优势所在——只需几个例子,我们就能发现导致结论的视觉线索。
食道癌,对比 CT 扫描,冠状图像(照片由维基媒体上的 Tdvorak 拍摄,转贴于知识共享署名分享)
机器学习的工作原理类似,但是有更多的图片可以学习。你告诉计算机的不是几张图像,“这是几千张癌症扫描图,这是几千张未患癌症患者的扫描图。”然后,计算机继续运行并产生一个“模型”,它可以寻找癌症和非癌症样本之间的任何差异。
这些用于训练计算机的数据被方便地称为“训练数据”,可用的数据越多,就可能导致令人惊讶的、意想不到的行为,即计算机能够检测到人类无法检测到的东西。这里最重要的一点是,这项技术已经广泛用于医疗扫描,甚至可以提高质量。
我们可以使用类似的方法来检测混凝土基础中的问题
我训练的人工智能模型正在检测尚普兰塔南车库天花板的损坏。作者照片,Champlain Tower South的原始视频片段:2020 年 7 月 17 日参观 611 单元——surf side FL 公寓倒塌作者Fiorella Terenzi 博士
再把这个想成一个人。如果一栋建筑的混凝土地基有问题,人们是如何发现的?视觉线索通常是第一个迹象。有锈斑吗?有裂缝吗?是否有碎片脱落或任何明显的变质?失败的混凝土可能会产生有经验的工程师会注意到的线索——多年来检查失败和结构完好的建筑物所获得的经验。约翰·皮斯托里诺是要求建筑物 40 年重新认证的幕后黑手,他在最*的一次采访中说“混凝土给了你一个警告。它会给你一个警告。它不会那么快就失灵。”
一个人不能整天坐着盯着一面墙。电脑可以。
一个严重的“混凝土癌症”的例子,其中内部钢筋暴露和生锈。这种损坏的出现可能意味着对建筑物结构的直接威胁。照片由小费在知识共享署名 3.0 未授权许可下授权的【freeimageslive.co.uk】T2 拍摄。
多年来对视觉线索的注意可以通过用数以千计的图像训练人工智能来实现。有趣的是,一个描述混凝土板中钢筋生锈的常用术语被称为“混凝土癌症”。随着钢材的腐蚀,它会膨胀并导致周围的混凝土变脆和开裂,从而加速腐蚀过程。混凝土癌症的迹象是混凝土“剥落”——小颗粒的裂缝和剥落,以及似乎从内部渗出的锈斑,以及头顶上出现的起泡和泄漏。如果内部钢筋外露,说明问题已经非常严重。
当与图像搜索结合起来,为人工智能模型组装大型训练集以检测它时,像“混凝土癌症”和“混凝土剥落”这样的术语可能非常强大。下面,我使用 Clarifai 的在线门户网站创建了一个模型,其中使用了我通过搜索术语“混凝土癌症”找到的图片。
使用受损混凝土的图像训练模型。作者照片。
还记得我之前提到的迈阿密高楼里到处都有摄像头吗?这些摄像头被输入一个闭路监控系统,显示在安检台。这些摄像头也可以被输入到一个人工智能系统中,该系统可以日夜不停地检查任何结构损坏的迹象。这个系统并不神奇;如果你看不到问题,那么很可能计算机也看不到。不同之处在于,计算机能够全天候观察墙壁的损坏情况,而无需将视线从墙壁上移开——这对于人类来说是不可能的。
使用现有摄像头的另一个好处是,居民既对它们的存在感到舒适,又接受它们提供的安全性。让摄像机同时关注建筑本身的弹性,给紧张的公众带来了更多的信心。
我训练的人工智能模型在从谷歌街景中看到的尚普兰塔南的阳台下检测损坏。在撰写本文时,仍然可以使用这个链接看到它。作者使用谷歌街景拍摄的视频。
人工智能发现混凝土地基问题的另一种方式是变化检测
监测结构损坏的人工智能模型也可以玩“找出差异”,这是孩子们熟悉的游戏。
看看下面这张忙碌的照片。它们之间有 8 个不同点;一台计算机可以在几分之一秒内发现所有这些。你需要多长时间?
由 Christopher Burns 在 Unsplash 上拍摄的原始照片。由作者编辑以从右侧移除某些对象。
比较两幅图像并发现其中的差异是计算机擅长的事情;有了固定的摄像机,他们比人类更快地注意到变化。鉴于南佛罗里达的建筑中已经安装了过多的摄像头,一个系统可以监控这些信号,并检测建筑本身的任何变化。这种系统的唯一挑战是区分建筑物的混凝土墙和经过的汽车或人的能力,但这在现代技术下很容易做到。
这个想法——变化检测——是人工智能模型的一个重要概念。即使混凝土结构没有任何损坏的迹象,它也不应该移动。解决方案很简单——一个摄像头监视着一面墙,如果这面墙有任何变化,人们就会收到警报。
我从在迈阿密海滩的生活中了解到的一件事是,南佛罗里达的每栋高楼已经到处都有摄像头——甚至在停车场。
构建模型
我已经能够训练一个基本模型在很短的时间内检测损坏的混凝土。他们的一些工程师对这个项目非常支持和感兴趣,并与我一起创建了工作原型。我能够将 300 张受损混凝土照片和 173 张未受损混凝土照片的训练数据集放在一起。对于这种规模的项目来说,这是一个相当小的数据集,但它足以构建一个相当准确的原型。
对高质量训练数据的需求经常是人工智能中的一个障碍。如果你曾经在脸书或谷歌上使用过面部识别,你可能会注意到,随着时间的推移,它变得越来越准确,因为你让它知道什么时候它正确地标记了你的脸,什么时候没有。
查看培训数据。作者视频。
“混凝土癌症”和“混凝土剥落”的图像也是如此。到目前为止,视频中创建原型探测器模型最耗时的部分是收集训练数据。我得到的受损和未受损混凝土的图像越多,模型就越好。如果有人能看到大量受损混凝土的照片并愿意分享,请告诉我!模型本身的实际训练是在我睡觉的时候连夜完成的。
我的原型模型与尚普兰塔车库的镜头配合得很好。剩下的就是在一个直播的摄像头上进行试验,测试一个未来可以拯救生命的系统。
识别受损混凝土的人工智能模型原型。施工视频来源: Beaches Construction Co ,检测视频作者。
想了解更多信息,请点击这里或发邮件给我。
共享空闲信道如何提高数据质量
原文:https://towardsdatascience.com/how-a-shared-slack-channel-can-improve-your-data-quality-e62a4c2a0936?source=collection_archive---------37-----------------------
通常,最有影响力的变化来自于对我们流程的反思
照片由创业股票照片发自 Pexels | 品牌内容披露
你有没有听过有人说:“我们的数据很棒,我们从来没有任何数据质量问题”?确保数据质量很难。问题的严重性让我们相信,我们需要一些真正重大的行动来取得任何进展。但现实表明,通常最简单、最直观的解决方案会产生难以置信的影响。在本文中,我们将着眼于一个改进数据质量过程的想法,并使其更有价值和可操作性。
目录
取得数据的所有权
使流程更有回报&更容易跟踪
利用自动化来促进流程
∘ 关于示例中的检查
将脚本部署到 AWS
我们如何进一步改进自动化流程?
提出方法的弊端
结论
获得数据的所有权
无论您的数据团队是如何构建的(集中式 BI/数据团队与利用数据网格范式的分散式面向领域的团队),人们都需要掌握主动权,以做出任何持久而有效的变革。如果没有人觉得有责任解决数据中的问题,我们不应该期望情况会变得更好,不管我们使用什么工具。
我们如何解决这个问题?改善数据所有权的最简单方法是将所有者分配给最关键的数据工件,即数据仓库中的特定表、数据湖数据集和数据科学模型。我们并不是想把数据质量问题归咎于那些人。相反,分配所有者可以更透明地确定谁应该照看特定的数据资产,并尽可能确保这些数据保持干净。然后,该流程可以通过添加自动化和监控仪表板来提高可见性。
简而言之,在考虑任何工具或自动化脚本之前,首先考虑建立数据所有权的过程是有帮助的。
让这个过程更有价值,更容易跟踪
一旦定义了所有权,我们就可以通过使质量检查更加有益和自动化来改进过程。添加简单的脚本来执行数据质量检查,并通过共享的 Slack 通道通知数据所有者任何数据质量问题,这对于提高团队对提高数据质量的参与度非常有效。
该过程的重要部分是将这些警报发送到一个松弛通道,该通道在整个数据团队中被共享。作为社会动物,如果其他人能看到我们付出的努力,我们会更有动力去解决问题。例如,处理问题的数据所有者可以:
- 发送一个回复,解释问题的根本原因以及采取了哪些措施来解决问题,
- 简单地添加一个勾号来表明这个问题已经被解决,
- 或者添加一个票据链接如果问题变得更加复杂,需要放入待办事项中。
用户参与流程的共享数据质量松弛通道示例—图片由作者提供
所有上述行动增加了可见性,并证明数据质量问题不再被忽视。它展示了获得所有权并使这一过程更具社会回报已经可以产生切实的改善。
利用自动化促进流程
让我们假设我们建立了流程并就数据所有权达成了一致。我们如何着手实施这些自动化的数据质量警报?这个过程可能非常简单:
- 构建 SQL 查询来检查数据中的异常,
- 编写一个脚本,如果满足警报条件,该脚本将发送松弛通知,
- 创建一个共享 Slack 通道和一个 webhook 向其发送消息。
首先,创建一个网页挂钩,进入https://api.slack.com/apps→创建一个应用程序。
构建一个 Slack 应用程序——作者图片
为您的应用程序添加一个名称,并选择您想要的松弛工作空间。
构建一个 Slack 应用程序——作者图片
选择incoming Webhook并为您选择的闲置通道创建一个(“向工作区添加新的 web hook”)。
构建一个 Slack 应用程序——作者图片
一旦所有这些都完成了,你就可以复制你的 Webhook URL 并在你的 Python 脚本中使用它。请注意,您应该像对待 API 密钥或密码一样对待这个 webhook。
构建一个 Slack 应用程序——作者图片
构建警报的脚本非常简单,只需向 webhook 所代表的 Slack API 端点发送一个 POST 请求(下面的要点中的第 19 行)。
注意,在第 35 行,Webhook URL 是从 AWS Secrets Manager 中检索的。如果您想采用同样的方法来存储这条机密信息,请确保将其添加到您的机密集:
aws secretsmanager create-secret --name slack-webhook --secret-string '{"hook_url": "YOUR_HOOK_URL"}'
关于示例中的检查
在这个代码示例中,我们检查订单状态和付款类型是否与预期的(允许的)值匹配。如果没有,我们应该会收到一条 Slack 消息,通知我们异常值:
数据质量通知-作者提供的图片
显然,这些检查代表了相当人为的例子(基于 这个来自 Kaggle 的电子商务数据集)。在现实世界中,您的数据质量检查可能会验证:
- 数据中的特定 KPI 是否达到某个临界值,或者何时超过预期值范围,
- 出现极不可能的值(B2C-客户购买数百件相同产品),
- 某些值(如营销、支付或物流成本)是否明显偏离计划值,
- 数据是否是最新的、完整的、无重复的以及没有缺失值,
- …以及更多。
将脚本部署到 AWS
为了使运行这些定期检查更具可伸缩性,我们可以利用 AWS Lambda。为了让之前展示的 Github gist 与 lambda 一起工作,我们需要将我们的主执行代码包装到一个 Lambda 处理程序中(从第 34 行开始)。此外,我们需要确保我们的日志程序是以一种符合 AWS Lambda(T21)的方式进行全局定义的。
完整项目可在 本 Github 资源库 中获得。
为了将我们的容器映像部署到 AWS,我们构建并推送我们的容器映像到 ECR ( 123456 是 AWS 帐户 ID 的占位符)。
*aws* ecr create-repository --repository-name dq_alerts*docker* build -t dq_alerts .*docker* tag dq_alerts:latest 123456.dkr.ecr.eu-central-1.amazonaws.com/dq_alerts:latest*aws* ecr get-login-password | *docker* login --username AWS --password-stdin 123456.dkr.ecr.eu-central-1.amazonaws.com*docker* push 123456.dkr.ecr.eu-central-1.amazonaws.com/dq_alerts:latest
然后,在 Lambda 配置中,我们选择我们想要的容器图像,如下所示。
构建 Lambda 函数—作者图片
由于执行数据库查询可能很耗时,我们需要增加超时设置。此外,将内存大小增加到至少 256 MB 似乎是合理的,因为查询返回的数据会占用大量内存空间。
构建 Lambda 函数—作者图片
确保添加相关的 IAM 策略。对于这个例子,我们需要雅典娜和 S3 权限。
构建 Lambda 函数—作者图片
最后,为了确保我们的检查按计划运行,我们需要添加一个 CloudWatch 计划作为触发器:
构建 Lambda 函数—作者图片
构建 Lambda 函数—作者图片
此外,我们可以使用一个空的 JSON 有效负载来测试该函数:
构建 Lambda 函数—作者图片
所提出的方法的缺点
演示方法的第一个缺点是我们需要一些有状态逻辑来确保我们不会过于频繁地通知相同的问题。否则,人们会开始忽略警报,并可能将空闲频道静音。此外,如果消息太多,社交方面可能会丢失。
此外,我们自己编写各种数据质量检查是不可伸缩的,并且甚至可能不可行如果你处理大量数据的话。正如 Barr Moses 指出的,这种质量检查只能覆盖已知的未知,即可以预见的问题。一个有趣的想法是将共享松弛通道的社交方面与来自端到端可观察性管道的警报相结合。
结论
在这篇文章中,我们看到了简单的过程调整是如何增加团队对提高数据质量的参与和承诺的。通常,最有影响力的变化不需要任何重大决策或投资,而是来自于重新思考我们的流程,增加自动化以增强其执行,并确保整个团队为提高数据质量的共同目标而共同努力。
感谢您的阅读!
一个简单的图表如何挽救一个人的工作
原文:https://towardsdatascience.com/how-a-simple-graph-saved-someones-job-neo4j-7262c813937f?source=collection_archive---------38-----------------------
饮料、非正式的谈话、一些图表帮助人们以新的眼光看待数据。
与人们在博客上发布的内容相比,这张照片并不漂亮,但这张旧纸有一个有趣的故事。
按作者分类的图像(在不同环境下我们如何相互联系的社交图)
几天前,我正在清理我的包,它有太多的夹层——典型的瑞士装备,我发现了一个几年没动过的口袋。一个隐藏的小口袋,可以存放名片、皱巴巴的纸和过去的收据。就在那时,我发现了那张旧的彩色纸,上面有我大约 4 年前草草写下的粗糙草图。
空间信息:科罗拉多州丹佛市的一家爱尔兰酒吧
热力学信息:一个异常炎热的夜晚,非常适合喝柑橘饮料
时间信息:下午 6:30 左右
我从东海岸前往丹佛,与一个潜在客户进行销售会议,会议进行得并不像计划的那样顺利。他们最终削减了预算,我的提议被推到了下一个季度。我的返程航班是第二天早上,晚上我和那个客户约好了一起吃饭。好吧,咨询使你成为一种食物和饮料鉴赏家。我和丹决定在去吃晚饭前,先在当地的一家酒吧喝一杯。
因为天气特别热,我们决定延长在酒吧的逗留时间,多喝几杯啤酒(也因为丹佛在啤酒厂方面相当高,所以人们可以品尝许多精酿啤酒)。丹告诉我正在进行的业务重组,这将导致整个组织暂时削减预算。他们的想法是让组织变得精简和灵活,并在技术和分析领域雇佣更多人。
不知何故,话题转移到了创建新部门和在公司内部寻找部门领导上。
我对基于主体的模型进行了初步研究,多亏了托马斯·谢林,我喜欢在对话中表达这一观点,这是一个绝佳的机会。
你在宏观层面上看到的可能在微观层面上并不真实
我一定是在上面的一张纸上给他画了图表,向他展示了不同部门的人是如何相互联系的,以及有时部门中拥有最高头衔的人可能不是日常业务运营中的“支点”或最重要的人物。所以,在得出一个艰难的结论之前,先了解一下不同的人在他们的工作岗位上做什么,不要仅仅依赖他们的主管给出的数据或者他们的职位。我给了他一些想法,告诉他如何去做,以及他可以使用哪些工具。
三四个月后,我在一个新项目的启动仪式上再次见到了丹,当时他告诉我,他为组织的一小部分创建了图表,并量化了人在商业环境中的重要性。我会模拟一个他提到的,让他感兴趣的案例。
数据
Employee.csv 包含三个主要列。雇员 _1 和雇员 _2 是本来会相互交流的两个人的组合。权重是两者之间相互作用的量度。这是对雇员 1 和雇员 2 交换电子邮件或出现在同一个会议中的次数的简单计数。观察结果是在过去 3 个月中收集的。
数据是通过读取电子邮件和 SMTP 服务器的元数据收集的,在这个过程中没有人的隐私被侵犯。
设置图形数据库
点击添加数据库,提供一个用户名和密码,你都设置好了。
作者图片
作者图片
一旦你添加了数据库,点击三个水*点,从管理部分你会添加一些插件,你会使你的工作变得更容易。
在插件标签,继续安装 APOC 和图形数据科学库。
作者图片
继续启动您的数据库,并使用 Neo4j 浏览器打开。(请注意,当您第一次创建数据库时,节点和关系的数量将是 0)
数据位置
如果你用的是 macOS,那么/Users/
把你的。导入文件夹中的 csv 文件。
(仅适用于 mac 用户:上述文件夹在 Windows 或 Linux 上更容易找到,因为在 macOS 中,/Users/
有趣的东西
将 CSV 加载到数据库中
LOAD CSV WITH HEADERS FROM "file:///employee.csv" AS row
MERGE (emp1:Employee {name: row.Employee_1})
MERGE (emp2:Employee {name: row.Employee_2})
MERGE (emp1)-[r:INTERACTS]->(emp2) ON CREATE SET r.weight = toInteger(row.Weight)
让我们看看它看起来怎么样
Match(n) return(n)
作者图片
嗯,这是一个简单的图表,除了告诉我人们是相互联系的之外,它对我没有太大的作用。
让我们找出每个雇员的程度和加权程度。
度 —一个员工所连接的员工数。
加权度 —每个员工关系的权重之和。
#Degree
MATCH (c:Employee)
RETURN c.name AS employee, size( (c)-[:INTERACTS]-() ) AS degree
ORDER BY degree#Weighted-Degree
MATCH (c:Employee)-[r:INTERACTS]-()
RETURN c.name AS employee, sum(r.Weight) AS weighteddegree
ORDER BY weighteddegree
按作者分类的图片(不同员工的学位)
按作者分类的图片(不同员工的加权程度)
程度和加权程度的数字是完全不同的,我们需要一个更好的、更稳健的度量标准。
让我们试着找出每个雇员的 PageRank。它更健壮,并在整个图级别捕获员工的状态,而不仅仅是在他们的节点级别。
#Create
CALL gds.graph.create('employee-interactions', 'Employee', {INTERACTS: {orientation: 'UNDIRECTED'}}) #Stream
CALL gds.pageRank.stream('employee-interactions') YIELD id, pgscore Return gds.util.asNode(id).name AS name, pgscore ORDER BY pgscore#Write
CALL gds.pageRank.write('employee-interactions', {writeProperty: 'pageRank'})
作者图片
Pagerank 似乎更有控制力,不像加权度和度那样分散。这可能是衡量每个节点功率的更好的指标。
我还想对员工进行一些聚类,即他们中的哪些人是图中高度关联的子图。用图形术语来说,我想要完成的是检测社区。
我不知道如何完成它,但快速搜索有所帮助。
#Create
CALL gds.graph.create('employee-weighted', 'Employee', {INTERACTS: {orientation: 'UNDIRECTED', properties: 'Weight'}})#Write
CALL gds.labelPropagation.write('employeee-weighted', {writeProperty: 'community', maxIterations: 15, relationshipWeightProperty: 'Weight'})
所有的查询都上传到 Github 这里。
现在我已经有了我需要的一切,我可以使用 Neo4j 的图形数据科学库来可视化数据。
作者图片
它将推出一个 UI,在 Neo4j 的术语中称为 NEuler(Noy-ler)。
一旦你连接,你将不得不选择哪个标签,你想运行你的图表的重量属性。我分别选择了 Employee 和 PageRank。
从下拉列表中选择选项,使您的图表丰富多彩且易于理解。
作者图片
这是结果,
作者图片
该图显示了小型员工群体中存在的联系和各种社区。员工之间的边界越厚,基于页面排名得分的交互就越高。
现在,让我们把注意力集中在丹的有趣观察上。
网络影响者分析
Sue、Amanda、Chris、Mark 和 Yan 都在财务部工作,Sue 担任部门主管。你应该看到她和颜之间的缘是相当暗淡的。Yan 和 Alex(主要利益相关者和组织生态系统中的重要人物)之间有很大的差距。不仅如此,严还是连接会计部门和公司其他部门的唯一桥梁。
在丹完成这个练习之前(这个练习一定是我在这里编造的一个类似的版本),严的名字出现在被他们部门解雇的人的名单上。在她的会计部门,她并不是一个举足轻重的人,但她仍然举足轻重,如果我们只考虑部门反馈,这一点永远不会被意识到。
一个简单的画面显示出颜在她的组织中是一个有影响力的人尽管她的部门内得分可能很低,但她的部门间依赖性使她不可或缺。
她不仅没有被解雇,而且在下一个周期,她被亚历克斯的部门给了一个职位。
思想
如果只从定性的角度来看组织结构,Graph DB 避免了一个错误。值得庆幸的是,严的情况并非如此。
这就是以图形方式查看数据的力量,你可以看到原本可能会错过的模式。除此之外,许多人是视觉学习者,给他们一个表格和一个图表,他们通常会伸手去拿图表。
在此之后,我可以说,那天晚上去酒吧是一次富有成果的访问!
蒂姆·马歇尔在 Unsplash 上的照片
请让我知道你的意见,你可以在这里使用 Github 回购。
你的准确度有多高?
原文:https://towardsdatascience.com/how-accurate-is-your-accuracy-d420f903bbae?source=collection_archive---------43-----------------------
比例标准误差概述
照片由engin akyurtUnsplash
在二元分类模型中,我们经常使用比例来计算模型的准确性。例如,我们使用准确度、精确度和召回率。但是我们如何计算这些估计的误差呢?两个准确率 95%的模型其实是等价的吗?
答案是否定的。让我们看看为什么。
标准误差
任何测量都必须有一个误差估计,它代表了测量的精度。我有一个物理学学位,物理学家总是被讨厌,因为他们通常在每次测量结果后假装有一个误差估计。例如,我可以说我身高 1.93 米,但如果这个数字后面没有对误差的估计,它就不会给出任何信息。如果我说 1.93 米误差 3%,另一个人说 1.93 米误差 30%,你会更相信谁?
这就是为什么我们需要估计我们测量的误差,计算所谓的标准误差。
一个 N 点样本的标准误差定义如下:
其中,σ是对样本计算的标准偏差。如您所见,样本越大,标准误差越低,我们的测量精度就越准确。这是大数定律的自然结果。
比例的标准误差
让我们考虑一个由 N 个点组成的数据集,其中 n 个点与一个成功的事件相关(即我们的模型的正确预测)。简单来说,整个样本的成功率是:
这可以是准确度(其中 N 是混淆矩阵的值的总和,并且 n 是其迹线)、精确度(其中 N 是模型已经用 1 预测的事件的数量,并且 n 是真阳性的数量)或者另一个比例。
现在,我们要计算标准误差。我们可以使用类似于 bootstrap 的算法来计算它,但是对于比例,我们可以使用一个简单的封闭公式。
首先,我们需要计算标准差。我们的事件可以建模为一个随机变量 x ,其值以概率 p 为 1,以概率 1-p 为 0。
那么,它的期望值是,
那么,它的方差是:
因此,标准误差变为:
置信区间
标准误差可用于计算置信区间,即我们可以预期真实值具有一定置信度的区间。
我们如何计算比例的置信区间?
让我们首先计算下面的 z 变量
其中μ和σ是我们比例的均值和标准差。可以证明,如果我们使用比例并给定合理高的 N 值,这个变量可以*似为一个正态变量(即它是正态分布的)。正态分布的 95%置信区间为(-1.96,1.96)。这是正态分布的一个性质。
因此,回到比例,我们可以将 95%的置信区间定义为:
照例, N 的值越高,由于大数定律,间隔越紧。
现在让我们看看如何在实践中应用这些概念。
简单的例子
假设我们有两个模型。其中一个正在 100 条记录上进行测试,它给了我们 70%的准确率。另一个模型在 400 条记录上进行测试,给出了 67%的准确率。哪款比较好?任何人都会说是前者,因为准确率更高。但是,让我们看看,如果计算两种精度的标准误差,会发生什么情况:
**
第二个模型给我们一个更精确的精度估计,因为标准误差较低。如果我们计算置信区间,我们得到:
**
可以看到,置信区间下界最高的模型是第二个,而不是第一个。如果我们不得不考虑一种保守的方法,在这种方法中,我们考虑统计上最差的情况,我们会寻找置信区间的下限,在这种情况下,选择第二个模型而不是第一个模型。这就是我们计算标准误差的原因。如果我们不计算误差估计,估计本身是没有用的,正如我们所看到的,较大的样本比较小的样本能给我们更多的信息,所以通过计算标准误差,我们可以做出更好的决策。
结论
计算误差估计值经常被忽略,但是如果我们不知道我们的测量有多精确,就会导致错误的结果。对于比例,标准误差和置信区间的计算非常简单,对于从数据集中提取尽可能多的信息非常有用。
原载于 2021 年 5 月 31 日 https://www.yourdatateacher.com。**
广告如何读懂你的大脑:推荐系统介绍
原文:https://towardsdatascience.com/how-advertisements-read-your-brain-an-introduction-to-recommender-systems-eb8112f39e96?source=collection_archive---------29-----------------------
推荐系统可能非常准确。让我们弄清楚它们是如何工作的。
沃伊泰克·维特科夫斯基在 Unsplash 上的照片
如今网络广告无处不在。你不可能在网上逛很多地方而不被邀请去买东西——也许是一件衬衫,也许是一副耳机。更重要的是,这些广告具有不可思议的准确性。我经常惊讶于我实际上会从展示给我的广告中购买多少东西。这些广告给我留下了深刻的印象,让我感到毛骨悚然,我决定弄清楚它们是如何运作的。事实证明,这些广告被称为推荐系统,实际上非常直观。在这篇文章中,我们将看看一个简单而有效的推荐系统,并解释它是如何工作的。
问题是
我们首先要定义一个具体的问题。假设我们为亚马逊工作,我们可以访问(用户名、产品 Id、评级)形式的产品评级数据库。由于亚马逊是一家如此大的公司,我们有很多这样的评级。我们的目标是预测数据库中尚不存在的(用户名,产品 Id)对的评分。
我们该如何解决这个问题?嗯,对于我们试图预测的每个(用户名,产品 Id)对,我们可能会查看用户名给出的其他评级。例如,如果我们看到 Username 对吉他弦和吉他拨片给予了很高的评价,我们可能会推断此人是一名吉他弹奏者,并且他也会对其他吉他配件如吉他调音器给予很高的评价。我们也可以为其他爱好做同样的事情。例如,如果有人给棒球棒和棒球鞋一个差评,我们也不会给棒球手套差评。
那么如何用数学方法来表达这个想法呢?我们可以使用一种叫做的东西嵌入。嵌入是复杂对象的一种紧凑表示(通常是一个向量),例如,用户的偏好。具体来说,我们要做的是用向量来表示用户和产品。用户向量的每个元素都代表了用户对特定类型产品的喜欢程度。例如,我们可以设置用户向量的第一个元素代表棒球产品,第二个元素代表吉他产品。那么用户向量(3,-2)将意味着该用户喜欢棒球产品,而不喜欢吉他产品。
我们设置产品向量的每个元素来表示该类型产品的多少。例如,( 5,0)的产品向量将表示肯定是棒球产品的东西,而肯定不是吉他产品——类似于棒球棒的东西。(2,2)的乘积矢量将表示与棒球和吉他都相关的东西,可能是棒球主题的吉他。
一旦我们有了用户和产品向量,我们就可以用点积得到一个代表用户对产品偏好的数字。例如,对于用户向量(3,-2)和产品向量(5,0),我们将得到点积 15,这意味着用户会喜欢这个项目,并给它一个高评级。如果产品向量是(2,2 ),我们将得到 2 的点积,这意味着用户对这个产品不冷不热。这是有意义的,因为(2,2)产品同样与棒球和吉他相关,而我们的(3,-2)用户喜欢棒球,但不喜欢吉他。我们可以将这一思想推广到任意大小的向量。除了棒球和吉他,我们还可以拥有 100 维向量,代表对 100 种不同产品的偏好。
既然我们已经有了表示用户和产品的方法,以及计算用户/产品对评级的方法,我们需要弄清楚如何训练我们的系统。换句话说,我们需要想出一种方法来获得准确的用户和产品嵌入。在训练开始时,我们没有关于用户或产品嵌入的信息,因此将这些嵌入设置为随机值似乎是合理的。回到我们的棒球/吉他示例,假设我们随机将用户嵌入设置为(3,-3),将产品嵌入设置为(1,1)。预测评分是 0,我们假设这个用户的真实评分是 5。
我们预测的评分太低了。然后,我们可以调整用户嵌入和产品嵌入,以更好地匹配真实评级。例如,我们可以将用户嵌入改为(3.1,-2.9),将产品嵌入改为(1.1,0.9)。这使我们更接*真实的评级,但我们还没有到那一步。然后我们可以尝试(3.2,-2.8)和(1.2,0.8),再次检查,重新调整,等等。我们描述的这个过程是梯度下降,这很好,因为它很容易实现。
然而,我们还有一个问题,那就是如何选择我们的嵌入中应该包含什么类型的产品。显然,对于现实生活中的系统,我们需要的不仅仅是棒球类型和吉他类型。然而,我们不可能包含宇宙中的每一种产品类型,因为这将使事情在计算上不可行。相反,我们通过只设置嵌入的大小,并让训练算法决定使用什么产品类型来避免这个问题。现在我们来看看完整的训练算法。
训练算法:
- 为用户和产品嵌入确定一个维度 k(k = 40 是合理的)。
- 对于数据库中的每个用户,用随机值初始化一个 k 维向量作为该用户的嵌入。
- 对于数据库中的每个产品,用随机值初始化一个 k 维向量作为该产品的嵌入。
- 对于数据库中已经有评级的每个用户/产品组合(我们的训练集),在适当的嵌入之间进行点积,并获得预测的评级。
- 获得所有预测评分和实际评分之间的误差*方和。这是总误差。
- 取关于用户和产品嵌入的总误差的梯度。对所有嵌入进行梯度下降。
- 重复进行,直到总误差满足一些预定义的标准。
如您所见,在我们的算法中,我们不需要精心挑选产品类型。我们让梯度下降为我们做到这一点。直观上,这个算法相当简单。我们所做的就是基于我们的嵌入计算我们的预测评级,将这些评级与真实评级进行比较,然后相应地更新嵌入。在实际方面,这种算法在实践中表现良好。它的一个变体在网飞电影分级竞赛中名列前十。在比赛之后的几年里,许多新算法被提出,但它们似乎没有提供太多(~2%)的改进,并且有再现性问题。
还有最后一件事。原来,我们的算法与奇异值分解(SVD)有关,奇异值分解是一种众所周知的矩阵分解方法。因为 SVD 被广泛使用,所以我们可以利用高度优化的 SVD 实现。完整的主题是另一个时间,但它值得一提。
在本文中,我们从头开始推理,提出了一个推荐系统,它可以与复杂得多的模型竞争。此外,我们的系统具有直观和易于实现的优点。请留下任何评论或问题,让我知道你接下来想看什么!
人工智能如何帮助应对气候变化
原文:https://towardsdatascience.com/how-ai-can-help-fight-climate-change-c86531d710f0?source=collection_archive---------36-----------------------
社区笔记
人工智能有潜力解决这个星球上最大的挑战
照片由卡斯登·沃思(➡️@卡斯登.伍尔特)在 Unsplash 上拍摄
我们星球面临的最大威胁之一是气候变化。然而,什么是气候变化呢?*均条件的变化,如一个地区在很长一段时间内的温度变化,导致剧烈的风暴、野火和干旱。如果我们找不到这个挑战的答案,我们的日常生活肯定会发生巨大的变化。世界上每个地区都经历着不同的气候变化。一个可能面临严重的干旱年,而另一个面临降雪增加。问题是我们如何应对这一挑战,尤其是利用人工智能技术?
当你浏览互联网时,你可能会发现一大堆利用人工智能技术对抗气候变化的方法。但是,事实是,这些建议中的许多要么在经济上不可行,要么影响力不够,至少在目前的状况下是如此。我在这里描述了如何评估 AI 解决现实世界中某个问题的可行性。下面,我分享一个在垃圾管理行业使用 AI 的例子,在这个行业,AI 的影响力还不够。
我们都知道,更好的废物管理系统可以帮助我们减少碳足迹,应对气候变化。然而,这并不意味着人工智能可以通过进入高度复杂的废物管理链的每一步来产生影响。例如,有一些尝试使用计算机视觉来建造智能垃圾桶来指导人们找到他们的垃圾必须使用的确切垃圾桶。
亚历山大·卡迪科夫在 Unsplash 上的照片
他们的论点是“源头分类废物至关重要”。虽然这种说法是正确的,但他们没有考虑到,例如,废物收集车队是否准备好了分类箱,或者所需的能量是否确保人工智能系统正常工作而不中断。此外,要了解使用技术应对气候变化的影响,我们必须能够大规模地使用它,即在地球上的每一点。所以,我们应该回答的问题是“我们能在世界的任何地方使用这项技术吗?”最终,我们必须始终衡量每一美元支出的影响。
说到这里,我相信如果我们正确使用人工智能,它可以帮助我们大幅应对气候变化。在这篇文章中,我想描述人工智能可以有效应对气候变化的 3 种最重要的方式。
提高能源效率
我们不能既储存能量又产生能量。例如,这就是为什么输入电网的电量必须始终等于消耗的电量。在这种设置中,重要的是实时预测需要多少能量(需求方)。这将有助于产生所需的能量,仅此而已。此外,我们可以使用人工智能来预测天气状况,包括风的模式,以确定我们可以在风电场(供应方)产生多少能量。例如,谷歌的 Deepmind AI 可以提前 36 小时预测风力模式,从而有可能提前一整天确定电网的承诺量。
https://www.engadget.com/2019-02-26-google-machine-learning-wind-power.html
提高运输效率
根据 IPCC(政府间气候变化专门委员会)的数据,交通部门约占全球能源相关二氧化碳排放量的四分之一。你可以在这里阅读更多。人工智能可用于优化运输车队的路线,如废物收集或拼车车队。路线优化是一个极其困难的问题,尤其是当问题中加入了许多约束条件时,例如降低碳足迹、避免交通堵塞、提高用户满意度。基于人工智能的路线优化可以让许多商业模式变得可行和绿色。
https://www.ipcc.ch/
提高太阳能电池板效率
为了应对气候变化,我们必须找到以可持续方式生产能源的新方法。利用太阳能发电是我们拥有的最佳选择之一。这就是为什么工程师和科学家不断努力开发更高效的太阳能电池板。太阳能电池板的效率越高,产生的能量输出就越多。
2019 年,发表在《自然》杂志上的一篇文章介绍了人工智能技术的一种新颖用途,即发现一种具有特定性质的新化学化合物。这篇文章唤起了建造太阳能电池板的希望,这种电池板能够以更高的效率产生能量。在过去,工程师和科学家通过测试数千种材料来找到有效的材料,从而开发出新材料。发表在《自然》杂志上的文章向我们展示了人工智能如何在这个旅程中帮助我们。
遗言
在这篇文章中,我分享了那些可以有效应对气候变化的人工智能应用,主要是因为它们的美元影响因子。你肯定可以找到其他我没有在这里列出的对抗气候变化的人工智能应用。最后,我想强调的是,利用人工智能对抗气候变化是一种方式。还有许多其他的方法来帮助我们的工厂。
感谢阅读!❤️
如果你喜欢这个帖子,想支持我…
- 跟我上 中 !
- 在 亚马逊 上查看我的书!
- 成为 中的一员 !
- 连接上Linkedin!
- 关注我的 推特 !
https://pedram-ataee.medium.com/membership
人工智能如何帮助我们循环利用
原文:https://towardsdatascience.com/how-ai-can-help-us-recycle-c2f82d0d50de?source=collection_archive---------21-----------------------
变更数据
卷积神经网络在垃圾图像分类中的应用
作者:邓肯·王,阿诺·古兹曼-安妮,索菲·考特曼斯-马特尔 & 杰克·霍根
Pawel Czerwinski 在 Unsplash 上拍摄的照片
回收问题
减少、再利用和回收。这句格言也被称为废物管理的 3r,作为解决日益严重的废物危机的解决方案,已经得到了广泛的推广。在北美,公众环保意识的提高和诸如自觉消费主义等运动的传播使得减少废物成为社会环境关注的焦点,如今大多数城市都有成熟的回收计划。然而,对于消费者来说,虽然“减少”和“重用”背后的原则通常很简单,但第三个 R 背后的过程仍然很复杂,并且很难理解。
虽然回收看似简单,只需将特定的废物放入一个特殊的垃圾箱,然后运到一个神奇的工厂,变成新的材料,但回收项目的实际结果往往令人沮丧。事实上,美国环境保护署(EPA)估计,虽然 75%的美国垃圾是可回收的,但实际上只有 30%被回收。在加拿大,330 万吨塑料垃圾中只有 9%被成功回收,而在 T2,超过 75%的垃圾最终被填埋。回收结果不佳可归因于生产商、消费者和市政当局之间缺乏协调、管理回收的法规和能力不同以及公众理解程度低。在加拿大,市政当局根据废物的销售地点、购买者愿意处理的废物,以及回收哪些废物在经济上是合理的,来管理和制定可回收哪些废物的指导方针。因此,支离破碎的回收系统会让消费者感到困惑,最终导致大量潜在的可回收物品最终进入我们的垃圾填埋场。
人工智能如何帮助我们回收利用
人工智能(AI)的最新进展导致人工智能驱动的解决方案的兴起,以帮助解决社会环境问题,从使用预测预测来*衡电网供电能源的供需,到使用优化来帮助减少制造设施的浪费。在回收方面,McKinsey&co .最*的一份报告指出,减少消费电子产品浪费的市场机会每年高达 900 亿美元,这些机会来自使用图像识别和机器人技术来自动化回收基础设施等解决方案。
回收利用的一个特殊困难,也是人工智能驱动的解决方案的一个机会领域,是不正确分类的问题。由于废物材料类型的多样性和不同的规定,消费者会发现很难识别废物的成分,并因此不恰当地将物品分类为可回收的或不可回收的。这种可回收和不可回收物品的混合降低了待回收物品的价值,使其难以销售,并增加了最终被填埋的可回收物品的数量。因此,一个潜在的人工智能应用是使用图像分类来识别和帮助消费者识别他们的废物的材料成分和可回收性。
目标
本指南的目的是介绍我们如何使用 卷积神经网络(CNN)和 Python 中的Keras API来识别常见废物并将其正确分类到相关的材料组中。CNN 是深度学习中使用的一类流行的神经网络架构,常用于执行图像分类。在对通过相关材料类型标记的废物项目的图像进行训练之后,我们的目标是使 CNN 能够获取用户提交的废物项目的未分类图像,并生成表示项目材料成分的预测。虽然本质上很简单,但这种工具可以用来帮助用户做出决策,以减少不正确分类的废物数量,这样每个人都可以在改善回收过程中发挥作用。
复制项目所需的完整代码可以在 这里找到。
目录
- CNN 架构介绍
- 数据准备
- 建立 CNN 模型
- 生成废物类别预测
- 最终想法
CNN 架构的简明介绍
卷积神经网络(CNN)或 ConvNets ,是一种广泛用于图像识别和分类任务的神经网络。神经网络如何做到这一点的基本思想是通过模拟互连层的网络来模仿人脑如何做出决定,每一层都由“神经元”组成,即用于合成输入特征的数学函数。因此,神经网络能够识别大量数据之间隐藏的关系,这些关系可能是人眼看不到的。
为了能够检测和分类图像,CNN 模型将把已经被转换成表示数字像素的 3D 阵列的彩色图像作为输入。然后,它将通过一系列卷积层、池层和全连接层传递该输入,每个层执行不同的任务。然后,CNN 的最后一层应用一个名为 softmax 的函数,该函数输出图像属于特定类别的概率(0-1)——在我们的例子中,是废弃物的材料成分。
不赘述,CNN 中的隐藏层一般是卷积层和池层。在卷积层中,一个预定义大小的滤镜在图像上移动,以执行卷积运算——滤镜值和图像像素之间的元素矩阵乘法。所得值的总和将形成特征图,其中每个特征图提取原始图像的独特特征或质量。
创建卷积层的步骤。作者提供的数字。
然后,我们有了池层。这些用于通过减少训练网络所需的参数来对特征图进行下采样,从而减少所需的计算量。这也有助于“概括”输入,这有助于防止网络基于训练图像过度拟合。
创建池层的步骤。作者提供的数字。
在一系列卷积层和池层之后,我们到达 CNN 架构中存在的第三种类型的层:全连接(FC)层,这种类型的层也通常出现在常规神经网络中。FC 层构成了网络中的最后几层,并将从最终的池化或卷积层获得扁*化的输出。使用 softmax 激活函数,网络的最后一层将输出概率分类。
合并的要素地图的展*。作者提供的数字。
既然我们已经简要介绍了 CNN 的架构,让我们从数据开始,进入我们如何建立我们的模型。
准备数据
我们将使用的数据包含 2,532 张由纸板、玻璃、金属、纸张、塑料制成的可回收物品以及不可回收物品(垃圾)的图像。数据源在此处可用。
为了将一组可以被消化的图像输入到我们的模型中,第一步是将数据集的每张图片转换为 3D 像素阵列:
对于我们的图像,结果数组的形状是(384,512,3),其中数组中的第一个和第二个元素表示像素尺寸,第三个元素表示红、绿、蓝(RGB)三个颜色通道。
数据增强
接下来,我们随机裁剪和翻转一些图像,以便通过引入一些随机性来增加数据。增加可变性有助于降低过度拟合的风险,从而提高模型识别未来未知图像的能力。
这里,我们通过应用随机裁剪或中心裁剪来人为引入可变性:
随机作物与中心作物。请注意,随机裁剪的位置每次都可能不同。作者提供的数字。
下面来看看我们是如何做到的。请注意,下面的每个裁剪函数都包含了前面的代码片段,用于在裁剪之前将每个图像转换为 3D 数组。然后,我们将裁剪函数合并到一个新函数中,该函数随机地以 50%的概率对图像应用随机裁剪或中心裁剪,并翻转大约 50%的图像。
让我们看看这些数据增强技术如何修改样本图像:
注意:原始图像和增强图像的形状不同,因为原始图像的形状是(384,512,3),但在裁剪过程中被缩小到(224,224,3)。完全增强的图像应用了随机裁剪和图像翻转。作者提供的数字。
为了处理图像,我们将每个图像通过增强函数,并缩放得到的数组,使得像素值位于-1 和 1 之间,这是输入到 CNN 模型所需要的:
数据探索
为了更好地理解我们正在处理的数据,让我们按类别来看一下废品的分布。除了垃圾之外,其他的职业似乎相对*衡。现在,我们将让数据保持原样,但是如果我们想要创建更*衡的类,我们可以获取额外的样本或进一步扩充现有的垃圾照片以产生新的表示。
作者提供的数字。
让我们来看一下目前每个类别中的图片示例:
按类别分类的各种垃圾图像样本。
准备模型输入
为了准备模型输入,我们首先将六种废品物料类型分解为数字格式,因为 CNN 模型不能直接解释单词标签类别:
- 0:纸板
- 1:玻璃
- 2:金属
- 3:纸张
- 4:塑料
- 5:垃圾
由于图像是按类别顺序加载的,因此我们还对数据进行了混排,以便在分割后,每个数据集不会包含比例极不均衡的特定废物类型的图像。
最后,我们将数据分成三组:训练、验证和测试。由此产生的分割创建了用于拟合模型的 1750 训练观察值、 518 验证观察值,用于在训练阶段调整我们的模型参数时提供模型拟合的无偏评估,以及 259 测试观察值,这将允许我们评估我们的模型在完全构建和训练后的表现。
准备好模型输入后,现在是构建模型的时候了。
建立 CNN 模型
为了构建 CNN 分类器,我们首先利用外部预训练模型作为网络的基础模型。这种想法被称为 转移学习 ,它允许我们使用已经在另一个模型上训练过的层来帮助构建我们的模型,这样废物项目分类器就不必从头开始学习。因为我们没有预先训练好的垃圾分类器,所以我们使用 ImageNet 模型来代替,该模型在各种物品的大量图像集合上进行训练,并且对于识别垃圾物品也是有用的。
简而言之,迁移学习允许我们做三件关键的事情:
- 实例化一个基础模型,并在其上加载预训练的权重
- 冻结基础模型中的所有层,并在顶部创建一个新模型
- 在我们的数据集上训练新模型。
这里,我们定义基本 ImageNet 模型并提取其训练权重:
我们最初将冻结整个卷积基,以便我们仅使用其输出来馈入我们的分类器,而无需重新训练 ImageNet 模型。
冻结卷积基础模型。作者提供的数字。
我们现在可以为定制的分类器构建层:
下面是我们图层的快速浏览:
- 池化层:池化层用于将数据准备为将被推入密集或完全连接层的输入。
- 批量规范化层:实施一种重新集中和重新调整网络的规范化技术,以稳定学习过程并加速训练。这固定了每层输入的均值和方差,因此可以添加到神经网络中的任何位置以提高性能。
- 丢弃层:丢弃在每个历元临时停用网络中 20%的节点,以重新分配权重并帮助网络专注于弱特征。这有助于防止对训练数据集的过度拟合。
- 展*层:展*层将我们的数据转换成一维数组,这将是我们的全连接/密集层的输入。
- 预测层:在我们的最后一层,softmax 激活将网络的输出归一化为 6 个可能输出类别上的概率分布。
下面是我们模型的总结:
现在,让我们编译我们的模型。我们指定稀疏分类交叉熵,用于多类分类任务,并使用分类精度评估其性能。
回调函数
接下来,我们实现几个回调函数,在训练模型时使用。回调是可以在训练过程的给定阶段执行特定动作的对象,它允许我们定制模型的行为。
第一个回调创建一个自定义函数,如果训练数据的精度超过 0.999,该函数将停止训练,以防止过度拟合。第二个回调使用 tensor board visualization toolkit 记录模型统计数据,我们可以使用它在训练期间跟踪模型的度量。
训练模型
我们首先在基本模型层冻结的情况下训练模型 40 个时期(或者直到我们的自定义回调停止或者 keras EarlyStopping 回调被激活)。
在模型收敛到新数据后,我们可以解冻基础 ImageNet 模型,并通过指定base _ model . trainiable = True,使用解冻的基础模型层进行重新训练。注意,这是一个重要的步骤,假设如果随机初始化的可训练层与来自基础模型的具有预训练特征的可训练层混合,则随机初始化的层将在训练期间导致非常大的梯度更新,这将破坏来自基础模型的预训练特征。
完成初始训练后,我们现在可以以相同的方式再次重新训练模型,但使用未冻结的基础层。
下面来看看我们的模型在主动基础层上的训练表现。我们可以看到,在回调函数被激活之前,模型完成了 5 个训练历元,表明训练准确率超过 99.9%。在训练完成时,我们可以看到在验证集上的分类准确率为: 79.54%。
TensorBoard 回调函数还允许我们查看与训练过程相关的各种指标并与之交互。在这里,我们可以跟踪在每个训练时期精度如何增加和损失如何减少:
预测废物类别
在训练模型之后,我们可以用“看不见的”数据来评估它的性能:我们的 259 个图像的测试数据集。这里,我们可以生成一个数组,其中包含测试数据集中每个垃圾图像的预测类(0–5)。
为了解释这些结果,我们可以将每个标签分配回其材料类型。我们还可以绘制预测的废物项目类型和测试数据集中的实际废物项目类型之间的比较:
正确与错误分类的废物样本。作者提供的数字。
评估性能
我们可以使用混淆矩阵来分析图像分类模型的预测。这使我们能够比较预测的和实际的材料类型,以评估每种废物类型的正确和错误分类的数量。
预测与实际废物类别的混淆矩阵。出于演示目的,垃圾类的预测细分已突出显示。作者提供的数字。
我们看到,总的来说,259 幅图像中有 202 幅(78%)预测正确。虽然预测的准确性还不错,但模型识别垃圾的能力对我们来说是最重要的,因为我们希望确保分类器能够将垃圾从可回收物品中分离出来。
如果我们检查垃圾,我们有以下结果:
- 真阳性率: 4 例(33.3%)
- 真实否定(率)😗***【240(96.8%)】
- 假阳性率: 8 例(3.2%)
- 假阴性率: 7 例(63.6%)
对于垃圾,总体预测准确率为 94.2%,代表正确分类的垃圾或非垃圾预测的总数。如果我们看一下误报率,我们还会看到非常低比例的非垃圾项目被错误地识别为垃圾。虽然准确率很高,误报率很低,但这主要是因为大多数项目首先就不是垃圾。
然而,我们看到假阴性错误率相当高,这表明垃圾项目经常被错误地分类为非垃圾项目。出于回收的目的,这并不理想,因为假阴性的成本很高。换句话说,为了避免待回收物品的污染,将非垃圾物品错误地归类为垃圾并扔掉并不重要,但更重要的是垃圾物品不要与可回收物品混在一起。由于我们的数据集中的垃圾项目总体上较少,因此我们建议用额外的垃圾图像进一步扩充数据集,以提高预测的假阴性错误率。
生成新的预测
我们现在已经看到了使用现有数据集时模型的表现。让我们来看看它对新数据的反应。在这最后一步中,我们创建一个新的函数,它获取一个新的图像,对其进行处理,并将其输入到训练好的 CNN 模型中。
在这里,我们上传了自己的照片,照片上是一张有些破损的便利贴,上面还有一些彩色的文字。我们可以在下面看到,我们的模型正确地将其材料分类为纸。成功!
最后的想法
这个项目的总体目标是研究我们如何建立一个人工智能驱动的模型,并将其应用于当前的废物危机。通过探索卷积神经网络(CNN)背后的直觉和建立一个卷积神经网络的步骤,我们能够成功地训练一个流行的深度学习框架,对来自五个可回收组的废物图像进行分类,并将它们与不可回收的垃圾项目区分开来。
虽然对常见的垃圾物品进行分类看起来是一项微不足道的任务,但在大规模应用时,CNN 的应用可能会非常强大。由于北美产生了全球 14%的垃圾,CNN 驱动的算法可以扩展到自动化垃圾分类的工业解决方案中,并提高现代回收系统的效率。如果设计得当,CNN 驱动的解决方案有可能帮助消除基于人类判断的错误,有助于降低总体分拣成本,并可以重新定义 21 世纪绿色环保的含义。
资源
- Github 库
- 浪费数据
如果您想分享任何想法,请随时在 Linkedin 上联系我们。
关于我们的更多信息:
https://www.linkedin.com/in/james-hogan9/ https://www.linkedin.com/in/sophie-courtemanche-martel/ https://www.linkedin.com/in/duncan-w/ https://www.linkedin.com/in/arnaud-guzman-annès/
人工智能如何把你变成一个讲故事的大师
原文:https://towardsdatascience.com/how-ai-can-transform-you-into-a-master-storyteller-a6e8a3c55dcb?source=collection_archive---------46-----------------------
Teemu Paananen 在 Unsplash 上拍摄的照片
实现数据通信转型的三个步骤
2012 年,迪士尼投资 3.5 亿美元拍摄了一部似乎具备票房成功所有要素的电影。这是一部动作片,有着惊人的视觉效果。它是由一位明星作家和《海底总动员》的导演执导的。
当事情看起来非常乐观时,他们邀请了英国人工智能(AI)公司黑天鹅(Black Swan)来预测这部电影是否会受到欢迎。该公司的人工智能算法警告说,《T4》这部电影将会失败。迪士尼没有理会,继续他们的发行计划。
电影《异星战场》票房惨淡,估计亏损 8000 万至 1.2 亿美元。
今天,许多电影工作室正在转向数据和人工智能,以提高电影制作等艺术领域的科学商数。例如,华纳兄弟公司使用了 Cynelitic engine ,这是一种人工智能驱动的解决方案,可以建议对剧本进行改进,预测电影收入,并分享电影如果在线播放将会如何表现。
当艺术最终转向人工智能时,企业难道不应该也采用人工智能驱动的讲故事来改善他们的业务沟通并激发他们的内部和外部利益相关者吗?
有效沟通的关键是什么?
Juliana romo在 Unsplash 上拍摄的照片
根据一项对 400 家全球企业的调查,沟通不畅给企业造成了高达 370 亿美元的损失。同一份报告发现,如果公司的领导者具备有效的沟通技巧,五年后公司股东的回报率会提高 47%。
那么,如何改善商务沟通呢?你需要故事。它们是感性的、难忘的、可操作的。讲故事是有效商业沟通的关键。根据心理学家杰罗姆·布鲁纳的说法,“以故事形式传递的信息比事实更令人难忘 22 倍。”
对于擅长讲故事的商务沟通专家来说,他们必须关注三点:
- 了解观众真正想要什么
- 呈现激动人心的内容
- 拼凑一个引人入胜的故事
今天,人工智能可以帮助您解决这些挑战。借助例子,让我们看看如何利用人工智能的力量来讲述伟大的商业故事。
1.深入了解你的受众
每一个伟大的故事都始于对观众的深刻理解。你必须了解客户的动机是什么,以及他们是如何做出决定的。有三种方法倾听你的听众。第一种是通过顾客之声(VoC)调查和直接访谈来获得直接反馈。假设您的客户对您的 VoC 调查作出了这样的反馈:“我喜欢产品的功能和超级快速的入门,但在使用您的产品时,这种良好的体验没有继续下去。您的支持团队很有帮助,但我不确定是否会再次购买。”
乍一看,这似乎是一个高于*均水*的混合反馈。然而,人工智能算法可以提取更深层次的信号。他们可以识别客户谈论的是哪个阶段,是“需求识别”阶段还是“处理产品问题”AI 然后可以识别旅程步骤的情绪,并推荐具体的改进领域,如下图所示。
图:在客户反馈中确定旅程步骤(格拉米纳)
人工智能解决方案将客户反馈分为五个客户旅程步骤,每个步骤都有相应的情绪(绿色表示积极,橙色表示中性,红色表示消极)。
另外两种了解受众的方式是间接反馈(第三方网站或社交媒体帖子上的评论)和推断反馈(网页互动和点击流数据)。例如,一家下一代汽车租赁公司使用其汽车旅行数据库的高级分析来推断客户并将其分成 10 个原型。
这家汽车公司使用通过间接方式收集的数据来构建他们的客户原型。通过推出量身定制的产品和宣传,在一年内,该公司的客户群增长了 10%以上,收入增长了* 20%。
不是所有的故事都能吸引每个人。这就是为什么在你构思你的故事之前,首先了解你在迎合谁是至关重要的。
2.瞬间创造令人兴奋的内容
斯凯工作室在 Unsplash 拍摄的照片
一旦你了解了受众,下一个挑战就是为他们量身打造令人兴奋的内容。没有“放之四海而皆准”的方法。内容需要根据购买者角色和他们在旅程中所处的阶段为您的受众定制。
假设你正在策划一场营销活动。AI 可以帮你写初稿吗?
《卫报》的编辑们在试验了一款来自 OpenAI 的最新人工智能工具,名为 GPT-3。他们用一组指令提示人工智能,要求它“专注于为什么人类没有什么好害怕人工智能的。”人工智能在八篇不同的文章中提出了引人入胜的论点。
这些文章被编辑成一篇专栏文章,并以“一个机器人写了整篇文章”的标题发表。你害怕了吗,人类?”编辑们说,编辑 GPT-3 的专栏与编辑人类的专栏没有什么不同,只是花费的时间少得多。
人工智能领域每天都在取得惊人的进步。今天,算法可以写文章,创建图片,合成视频,混搭内容,甚至生成交替现实。
对于你的营销活动,AI 不只是起草第一份文案,它可以通过让你选择 AI 生成的“演员”来创建视频。然后它可以合成人类的语言,并帮助你把它们打包在一起。
3.构思一个引人注目的故事
一旦你为你的目标受众准备了令人兴奋的内容,接下来你应该做什么来构建一个伟大的叙事?确保你的故事不*淡。
每个故事都必须有一个情感弧线。情感弧线也被称为“故事的形状”正是这一系列的情绪起伏,像坐过山车一样,一直勾着观众直到最后。
我们能证明情感弧线与观众参与度的相关性吗?麻省理工学院的社交机器实验室和麦肯锡消费者技术团队研究了数千个 Vimeo 视频来调查情感弧线是如何支撑故事的。
使用计算机视觉和音频分析的算法每秒钟为每个场景打分。在勾勒出每个故事的情感弧线后,他们使用机器学习将它们分成八个家庭。
图: 麦肯锡 ,“情感弧线如何提高观众参与度?”
该分析的最后一部分是引入结果——用户参与度指标,如“喜欢”和“评论”研究人员发现,由人工智能算法生成的故事情感弧线可以预测观众是否会喜欢它。
现在我们有了证据,你如何在你的商业故事中编织情感弧线呢?
假设你正在展示你的季度收益。你可以从一个稍微消极的基调开始,提出历史挑战。然后,转移到一些小的成功,比如上个季度做得不错的事情。现在,介绍一个挫折,比如一个成功的竞争对手夺走了你的部分市场份额。最后,介绍你采取的恢复行动,并为你的胜利打分。
在上面的叙述中,我们有冲突。当竞争对手夺走市场份额时,我们会有情绪。最后,冲突通过你的行动得到了解决,给观众留下了积极的热情。
你的故事并不总是需要戏剧性的挫折或壮观的胜利。每种情况都有积极和消极的一面。将它们在右边的弧线上进行对比,并以一种引发情感和行动的方式将它们分层。
你将如何在你的下一个交流项目中使用人工智能?
Volodymyr Hryshchenko 在 Unsplash 上的照片
你可能会用幻灯片向投资者推销,在你的网站上发布新产品,或者通过电子邮件向你的员工发布重大公告。
无论受众是谁,无论沟通模式是什么,以上几点都适用于每一个场景。首先分析你的受众是谁,他们真正想要什么。利用这些工具来创建令人兴奋的内容,并将其制作成在情感上吸引人的叙述。
在你经历这个过程的时候,把 AI 想象成一个助手,帮助你简化事情,帮助你加速活动。当一个人参与到循环中,不断地提供输入,并审查结果时,人工智能会产生最佳效果。这被称为增强智能,它帮助你最大限度地利用人工智能。
在你的下一次商务交流中创造性地运用这些原则。
这篇文章最初是 发表的 关于 IABC 的催化剂。增加了插图。
人工智能如何帮助行业预测你的购买行为
原文:https://towardsdatascience.com/how-ai-is-helping-industries-to-predict-your-buying-behaviour-18d3ded800c9?source=collection_archive---------44-----------------------
你的社交媒体数据就是他们的石油
图片由 安德里亚·皮亚卡迪奥 来自 像素
你有没有想过为什么像谷歌、脸书这样的大公司完全免费提供服务?所有这些公司都有如此庞大的用户群,即使他们收取最低的服务价格,他们每天也能创造数十亿美元的收入。
那么他们如何产生收入,他们用什么来获得这些钱呢?简单的答案是你。
谷歌和脸书等科技巨头将他们的用户作为数据点,收集他们在使用网站时分享的个人数据。你一定听说过脸书因向剑桥分析公司这样的私人组织出售数百万用户的数据而上了新闻。
在这篇文章中,我们将看到科技公司如何使用你在社交媒体上获得的数据来训练他们复杂的 ML 算法,以预测你的购买行为。
预测的整体模型是什么?
谷歌、脸书、YouTube 等服务主要通过向观众展示广告来创收。为了提高广告的转换率,他们必须预测你的购买模式,只向你展示你感兴趣的产品的广告。
所以公司使用最大似然算法、神经网络等。根据你在网站上分享的数据预测你的行为。
例如,如果有人在谷歌或脸书上搜索智能手机,他们会得到更多与智能手机相关的广告。你也可以用你自己的系统尝试这个实验。
对预测的详细分析
现在,让我们深入了解整个过程中发生的更具技术性的事情:
第一步:数据收集和处理
首先,数据是从社交媒体网站的搜索引擎中收集的。一部分数据用于训练神经网络,其余数据用于测试神经网络。
下一步是特征提取。在此过程中,根据数据的属性(例如用户的地理位置、年龄组、搜索的产品类型、搜索次数等),数据和相应的用户被分组并且被标记为不同的类别。现在处理过的数据被用来训练神经网络。
第二步:训练最大似然算法
下一步是使用有组织的数据序列 ML 算法。主要有两种类型的算法可用于此:
- 长短期记忆(LSTM):
这是一种递归神经网络,其中上一步的输出可用作当前步的输入。LSTM 的主要优势在于它可以长时间保留数据,并可以从少量数据中获取大量信息。
- 强化学习:
使用这种算法,计算机可以使用实时反馈给出最优化的预测。例如,如果系统向观众显示更合适的广告,则系统对于下一次推荐的准确度增加。
步骤 3:使用预测显示广告
现在,该算法根据系统使用的用户数据生成一些新信息,以显示用户想要查看的产品。反馈机制在这种情况下也起作用,其中点击率(广告点击次数与广告显示次数的比率)用于确定系统的效率并微调算法。
如果我不在社交媒体上怎么办?
来自佛蒙特大学的研究人员已经表明,算法已经变得如此复杂,一个人的行为甚至可以从这个人的朋友圈中预测出来,即使他不在社交媒体上。
在这种情况下,预测的含义是利用该人的朋友的*似地理区域和购买行为来实现的。所以逃网的机会只有一点点!
结论
随着行为经济学的发展,数据安全问题一直是当局关注的问题。一些政府也像公司一样,积极利用用户数据。
那么,我们应该关心我们的数据是如何被使用的吗?
答案是是的。虽然你不能完全逃离网络,但你绝对可以监控这些公司如何使用你的数据。感谢政府的严格指导方针,你可以相信这些公司只会将你的数据用于开发目的。
参考
- 新销售。简化。:必备手册
- 如何为销售成功定义销售流程
- https://www . uvm . edu/news/story/study-Facebook-and-Twitter-your-privacy-risk-even-if-you-not-have-account
以下是我的一些最佳选择:
https://towards data science . com/7-amazing-python-one-liners-you-must-know-413 AE 021470 f
https://better programming . pub/10-python-tricks-that-wow-you-de 450921d 96 a
https://towards data science . com/5-data-science-projects-the-you-can-complete-over-the-weekend-34445 b 14707d
觉得这个故事有趣?如果你想问我私人问题,请在 Linkedin 上联系我。如果你想直接通过邮件获得更多关于数据科学和技术的令人兴奋的文章,那么这里有我的免费简讯: Pranjal 的简讯。
人工智能如何影响保险行业?
原文:https://towardsdatascience.com/how-ai-is-impacting-the-insurance-industry-f90402493764?source=collection_archive---------30-----------------------
今天,大多数财产保险公司仍然依靠一个带着梯子和摄像机的人来进行物理检查
照片由 Unsplash 上的 h heyerlein 拍摄
如今,大多数财产保险公司仍然依赖一个带着梯子和相机的人来进行实地检查和风险评估。但智能保险公司正在寻求人工智能研究人员的帮助,这些研究人员开发了一种*台,可以评估网络上数以千计的公开图像和其他数据点,在几秒钟内提供风险评估。
“我们确保保险公司可以非常、非常快速地访问这些数据,尤其是在报价引擎中使用这些数据的情况下,”深度学习公司 Cape Analytics 的首席执行官 Ryan Kottenstette 说,该公司为保险、贷款、拥有或管理房地产的公司提供预测风险分析。
他补充说,在不到两秒钟的时间内,保险公司就会得到一系列特征,如树木伸出的程度或屋顶状况(按五分制评分)。
斯科特·韦伯在 Unsplash 上拍摄的照片
迟来的保险公司应该记得柯达,曾经是世界领先的摄影公司,当它犹豫要不要数字化时,它就变得无关紧要了。
我们要去哪里?
照片由马修·施瓦茨在 Unsplash 拍摄
全球保险商市场伦敦劳埃德在其 2018 年新兴风险报告中预测,随着远程信息处理、可穿戴设备和智能家居传感器的发展,物联网将在未来几年改变保险业。目前,人工智能的影响主要在于改善索赔处理。但是,它已经开始实时识别、评估和承保新出现的风险。
总部位于科罗拉多州的初创公司 Parsyl 帮助保险公司跟踪易腐产品在供应链中的质量。从 Progressive 到 Geico,汽车保险公司正在使用远程信息技术从车辆上收集实时驾驶数据,以折扣奖励安全的司机,并帮助重现事故。健身追踪器和心率监测器等可穿戴设备最终可能会帮助健康保险公司追踪和奖励定期锻炼等健康习惯。
这些新的风险评估服务是机器学习进步的结果,机器学习允许对数百万张图像进行训练的算法在眨眼之间发现各种类型的风险,从悬挂的树木到游泳池。这并没有使物理检查员过时,但它可以让保险公司立即了解对某一特定财产可能提出的潜在索赔类型。对于更大的工作,该系统可以评估开发的总体风险,甚至以惊人的准确性评估社区。
改变行业
布莱克·惠勒在 Unsplash 上拍摄的照片
但是,看看幕后,这些新的风险评估服务的真正工作是标记用于训练人工智能系统的海量数据。就像一个孩子通过被告知来学习识别一棵树是一棵树一样,计算机视觉算法必须经过训练,才能在一个称为监督学习的过程中识别一棵树是一棵树。
工作团队煞费苦心地手工注释了数百万个数据点,这些数据又被输入到算法中。可用于训练算法的注释数据越多,机器学习分析就越准确。区别点被标记为训练数据。
“训练数据是这场人工智能革命的生命线,”另一家公司 Arturo 的首席执行官 JC Clark 说,该公司利用人工智能从空中图像的大规模跳跃中释放价值。
自 2012 年以来,计算机视觉一直在改变着各个行业,当时人工神经元网络的突破首次使其用途足够精确,可以用于商业应用。从那时起,从杂草探测到自动驾驶汽车,用例出现了爆炸式增长。
与此同时,由于越来越便宜的图像传感器和过多的小型化卫星(有些只有鞋盒那么小),地球轨道上出现了大量的地理空间图像。例如,初创公司 Planet Labs 拥有 130 多颗卫星,每天以 3 至 5 米的分辨率拍摄地球上几乎所有地方的照片。
美国宇航局在 Unsplash 拍摄的照片
标记数百万张图片
越来越精确的计算机视觉算法和丰富的地理空间图像的融合,使得像 Cape Analytics 和 Arturo 这样的公司能够为目标市场上的每一处房产列出潜在的保险风险。客户可以在这些系统中输入一个地址,然后得到一份关于潜在风险的完整报告,从悬垂的树木到损坏的屋顶瓦片。
但是对于一个系统来说,仅仅扫描图像是不够的,它需要知道在这些图像中寻找什么。为了教会计算机如何解释图像中的特征,计算机需要接受大量带标签的图像的训练:悬垂的树木必须画出轮廓并贴上标签,损坏的屋顶瓦片必须画出轮廓并贴上标签,游泳池、灌木林、溪流和池塘都需要画出轮廓并贴上标签,主要是手工绘制,在计算机算法有足够的能力自己发现这些特征之前,需要成千上万、甚至上百万的图像。
很难精确地标注出使模型在商业上可行所必需的数量。随着公司建立越来越多的精确标记的数据,这成为他们最有价值的知识产权。
“我们有自己专有的标签数据集,”Cape Analytics 的 Kottenstette 先生说。他的公司专注于房地产分析,因为它涉及很多行业,从保险到房地产投资。
Cape Analytics 用自己的特征定义和分类法做自己的标注。对于美国的许多地址,该公司有预先计算的属性特征,可以在两秒钟内为客户提供分析。保险公司会得到一个特征列表,比如树木伸出的程度或屋顶状况的五分制。
Cape Analytics 维护着一个由客户提供的历史索赔数据库,这些索赔来自全国各地数百万个保单年度,并匹配与每个保单的时间范围相对应的图像。然后,它会查看这些属性中的哪些最终会有索赔,以及是否有任何属性特征与更高的索赔频率或更高的索赔严重性相关联。
“你需要高质量的基础设施,可以扩展到数百万个家庭,”科特斯坦特先生说。
他说 Cape Analytics 流程从定义一个“黄金标准数据集”开始,由一组内部注释专家明确定义并记录他们寻求识别的特征。他说,这个黄金标准然后被用来培训外包标签公司的员工,然后这些公司扩大数据集。
“一旦我们对被标记的数据的质量和数量感到满意,我们就用它来训练我们的内部模型,然后进行额外的迭代和测试,以尽可能提高模型的性能,”科特斯坦特说。
好事达保险公司使用专门的飞机或无人机记录图像,用于更快地为客户撰写保单,或在灾难发生后更快地查看损失。它的汽车保险客户可以发送事故现场的照片,由人工智能模型进行分析,并加快索赔。Orbital Insight 和 Flyreel 是另外两家使用人工智能和图像来评估保险风险的公司。
结论
照片由 visualsofdana 在 Unsplash 上拍摄
所有这些公司都使用一个名为 Labelbox 的*台来管理标注过程。“它可以被托管在云中,但如果你想把它安装在你的手机上,如果你想把它放在你自己的物理硬件上,你也可以这么做,”克拉克说。
这些公司说,通过使用一个*台,而不是“黑箱服务提供商”,他们获取数据并贴上标签返回,他们保留了对其最重要的知识产权的控制。克拉克先生说,他的公司在确定软件解决方案之前尝试了服务公司,并补充说,服务公司背后的“肮脏的小秘密”是,大量的时间和金钱被浪费在正确的标签上。
“你告诉贴标机你需要他们做什么,当他们回来时,他们所做的 80%都是错的,”他说。"你重新开始,然后你错了 60%,然后又错了 40% . "他说,在选择 Labelbox 之前,他的公司与其他几家公司合作过,label box 现在是他们唯一的工具。他说,结果是比服务公司“立即节省 15%到 25%”。
“我们在印度、菲律宾和世界其他地方有成千上万的人代表我们使用 Labelbox 来创建这些训练数据集,”他说,并补充说该*台还简化了管理分散的远程团队的工作。
“ Labelbox 让我们的工作变得更加轻松,并使我们能够扩大产品开发规模,因为我们花在管理流程和管理贴标机上的时间更少,而花在创建优秀示例和审核即将推出的产品并准备用于培训的时间更多,”他补充道。
与 Cape Analytics 、 Arturo 一样,它使用来自其客户的专有内部索赔数据进行预测分析,根据可识别的风险因素计算索赔的概率和规模——例如,根据历史数据,某个市场中 30%的树木威胁与 30%的 2 万美元索赔机会相关。
“随着时间的推移,能够创建高质量的培训数据将成为任何财富 1000 强企业的需求,这将是每个首席信息官都需要在他们的供应商集工具,”克拉克先生说。
在你走之前
- [AI in Education [Video]](https://youtu.be/Ny9-GrUIl4g)- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
在 Twitter 上关注我,在那里我定期发布关于数据科学和机器学习的消息。
照片由Courtney hedge在 Unsplash 拍摄
人工智能领导人应该如何为即将到来的欧盟法规做准备
原文:https://towardsdatascience.com/how-ai-leaders-should-prepare-for-the-looming-eu-regulations-99e9d4f4c039?source=collection_archive---------39-----------------------
新法规对欧盟所有使用“高风险”人工智能的公司施加了义务,包括上市后监控
克里斯蒂安·卢在 Unsplash 上的照片
上周,欧盟备受期待的关于欧洲人工智能方法的法规草案被泄露。官方版本预计本周发布。
尽管作为非律师,我们无法对该法规进行法律分析,但我们可以说,该草案清楚地表明,欧盟正准备采取强有力的方法来监管人工智能,从确保良好的数据集,到系统的适当测试和培训,要求在新创建的欧盟数据库中注册,强制性的上市后监测,以及对不遵守者的惩罚。
这项规定有广泛的影响。尽管大多数条款都局限于“高风险”人工智能系统,但“高风险”的定义似乎相当宽泛。草案直接列出了一些“高风险”的人工智能用例,如员工/候选人评估,确定信誉和运营重要的公共基础设施。此外,草案宣布,定义“高风险 AI”的参数将是动态的,委员会有权根据造成伤害的严重性和可能性,在这些定义下包括额外的用例。
时间会告诉我们这一规定的应用范围有多广,以及涵盖了多少不同类型的人工智能系统。然而,由于“高风险”一词的定义非常宽泛,而且该法规鼓励非高风险人工智能的提供商也遵守规定,因此具有前瞻性思维的公司应该现在就开始规划他们将如何遵守这项新的全面法规。
那么,你应该做些什么准备呢?
1.是时候改变你的想法了
在整个草案中,“人工智能系统”而不是“模型”是流行的术语。这种从“模型”到“系统”的转变对于数据科学家来说可能具有挑战性,因为传统上,“模型”一直是研究项目的最终目标。此外,数据科学家使用的许多工具都是以模型为中心的。这可能适用于研究阶段,但生产系统通常包含不止一个模型(以及模型之外的许多其他部分),而且需要注册的是整个人工智能系统(是的,所有高风险的人工智能系统都将在欧盟数据库中注册)。整个人工智能系统需要通过一致性测试。
2.变得有条理!
Jonah Pettrich 在 Unsplash 上的照片
草案明确表示,你的人工智能系统必须是有组织的、透明的、有文档记录的。具体来说,您必须:
- 保存用于训练和测试每个模型版本的数据集
- 为您的系统创建清晰的技术文档,它可以追溯到您在构建系统时所做的每一个决策
- 保持透明,告知你的用户在使用你的人工智能系统时的注意事项
幸运的是,已经存在一系列工具来帮助围绕您的数据集、模型和系统设计进行文档和记录。MLFlow 和其他 ML *台使您能够管理实验、注册模型和保存训练数据,而最终用户通信工具已经在每个组织中很常见。
3.确保人工智能系统的人工监督
照片由疾控中心在 Unsplash 拍摄
该法规的一个关键点是,人工智能系统必须有人类的监督。一个人不能仅仅处于“循环”中,他必须在意想不到的事情发生时得到提醒。这个人必须能够理解正在发生的事情,并有能力超越系统。
如今,在成熟的数据驱动流程中,如欺诈检测和风险评估,人类分析师会补充模型和预测。我们预测,在许多其他领域,当然还有“高风险”人工智能驱动的过程中,这样的分析师将接受培训,并配备更好的人机界面工具。
4.建立一个智能的去/不去机制,以避免在更新你的人工智能系统时出现偏差
照片由 Eliobed Suarez 在 Unsplash 上拍摄
您的数据质量至关重要。草案要求你确保你的训练和测试数据不包含低质量的数据或偏见。
我们从这些数据质量/偏差相关规定中得出两个结论。首先,你必须超越模型的输入和输出。利用元数据(例如,种族、性别)和业务维度(例如,地理位置)来评估您的数据和整个系统在子群体中的行为,以确保适当的统计表示并避免偏差。第二,团队将需要建立一个健壮的、自动化的过程来验证无论何时发布新版本都没有偏见(并且当存在偏见时阻止发布)。
5.实施端到端人工智能监控解决方案
版权所有:莫纳实验室公司(2021)
该法规对售后市场监控系统提出了具体要求。根据草案第 83 节:
为了确保他们设计和开发的高风险人工智能系统的使用经验被考虑在内,以改进开发流程或及时采取任何可能的纠正措施,所有供应商都应建立上市后监控系统。
如果你一直在关注我们的文章,你会知道我们相信一个全面的监控策略可以为团队带来真正的变化,旨在将他们的人工智能研究投资转化为可扩展的业务运营。
草案特别讨论了生产中“不断学习的人工智能系统”。这是承认人工智能系统的潜在风险会随着时间的推移而出现,并且不能在这些系统最初推出时预先减轻。监控是人工智能环境中安全、可靠的持续进化的关键使能因素的另一个有力论据。
在中结论
欧盟正在带头规范和管理庞大的新兴人工智能市场。然而,我们相信,在不久的将来,我们会看到其他政府也出台类似的规定。这对整个人工智能行业的影响是巨大的,现在最好是通过实施正确的工具和流程,提前为这些法规做好准备。
你是在一个团队建设或操作人工智能系统,可以涵盖在这些新的规定?取得联系。我们很想听听您如何看待这一新的监管格局。
感谢 约坦·柳文欢 与我合作。原帖blog . monalabs . io。
人工智能将如何塑造元宇宙
原文:https://towardsdatascience.com/how-ai-will-shape-the-metaverse-4ea7ae20c99?source=collection_archive---------1-----------------------
随着被称为元宇宙的未来数字世界的不同愿景的出现,人工智能将在其中扮演什么角色?它会提高包容性,还是有助于创造一个更加歧视的数字世界?
Anton Grabolle /更好的人工智能图像/人-人工智能协作/ CC-BY 4.0
元宇宙已经成为最热门的技术和社会经济话题之一。结合不同的技术,如虚拟现实、三维动画、区块链和许多其他技术,许多公司已经开始致力于为这个新的数字世界创造服务。甚至科技巨头脸书也将其名称改为 Meta ,这表明元宇宙真正的目标是成为下一个主流科技。
关于在《元宇宙》中的角色已经说了很多,这部分要归功于对和的大肆宣传,但我想知道关于和艾的交集又说了些什么。但首先,让我们试着回答这个问题“什么是元宇宙?”或者至少,试着指出几个关于它的观点。
元宇宙和网络简介 3
关于元宇宙的最新观点之一是由比特币基地发表的,它借用了风险投资家和作家马修·鲍尔的定义:
互联网的未来:一个大规模的、持久的、交互式的、可互操作的实时*台,由个互联的虚拟世界组成,人们可以在其中社交、工作、交易、娱乐和创造。
元宇宙是 Web3 的遥远演变。在其最完整的形式中,它将是一系列分散的、相互联系的虚拟世界,具有全功能的经济,在那里人们可以做他们在现实世界中可以做的任何事情。
关于互联网及其未来已经说了很多,但正如比特币基地在文章中指出的,明确区分元宇宙和 Web3 的概念是很重要的。Chris Dixon 的这篇 twitter 帖子是理解 Web3 的好材料:
根据 Chris 的说法,Web3 是关于提供先进的数字服务,但这些服务不是像 Web2 那样由大型技术公司控制,而是由社区创建和管理,回归到 Web1 的精神,即互联网的价值是由网络边缘的用户产生的,但主要是以写入模式产生的。
要符合比特币基地元宇宙定义,*台应包括以下要素/特征:
- 虚拟世界
- 巨大的可扩展性
- 持续
- 始终开启和同步
- 构建*台
- 充分运行的经济
- 开放和权力下放
- 互用性
我发现元宇宙的另一个有趣的观点是由乔恩·拉多夫撰写的这篇真正有趣的文章中的观点,它也介绍了元宇宙价值链的概念,如下所示:
《元宇宙的七层》,作者乔恩·拉多夫,由 CC 授权。
乔恩将元宇宙定义为“实时的、基于活动的互联网此外,他指出,在这个新的互联网元宇宙中,Web3 是实现应用程序之间价值交换的基础。
艾在元宇宙
利用 Jon 的这一层架构,我试图将人工智能在元宇宙未来可以发挥相关作用的一些领域整合在一起,不仅从产品角度,还考虑了人工智能如何使元宇宙更具包容性。
人工智能在元宇宙的潜在应用,基于 Jon Radoff 的“建造元宇宙”,由 CC 授权
让我们从基础设施开始,我们将继续向上,直到到达体验层。
AIOps
请记住,根据比特币基地的说法,支持元宇宙所需的*台必须永远在线,并且具有大规模可伸缩性。在这种要求很高的情况下,AIOps 将发挥重要作用,管理所有必要的基础设施,包括硬件、基础软件和通信。但是什么是 AIOps 呢?Gartner 将其定义为“大数据和机器学习的结合,以自动化 it 运营流程,包括事件关联、异常检测和因果关系确定。”这些功能的可用性不仅对于确保元宇宙基础设施的健壮性至关重要,而且对于提供与上层相关的活动洞察也至关重要。
包容性用户界面
元宇宙潜在成功的关键之一是高度沉浸式体验的承诺。虽然这可以改善一些人的社交互动,但也可能成为残疾人进入未来数字世界的巨大障碍。不仅如此,数字能力水*较低的人可能会发现自己脱离了这种新的社会经济和体验。这就是为什么 AI for accessibility 应该在保证每个人都能进入元宇宙方面发挥重要作用,不管他们的能力如何。这一领域的一些相关技术可能是:
- 视觉障碍者的图像识别
- 自动翻译
- 智能外骨骼与数字世界互动
- 最脆弱人群的脑机接口(如认知
虽然有点老了,但我觉得肖恩·凯恩的这个讲座非常有见地,因为它让我们意识到了我们的数字界面对残疾人的所有限制。
面向残障人士的基于手势的移动用户界面
Web3 通常被称为 Web2 的大众化版本。要做到这一点,我们不应该让任何人落后(这也适用于社会和经济的局限性)。
增强型智能合同
遵循民主化的理念,元宇宙(及其去中心化层)承诺允许创作者和用户轻松交换数字资产和权利,保护所有权并确保大型技术公司的非中介化。但是这个承诺会实现吗?例如,阿迪达斯最*推出了第一款 NFT。尽管每人只能购买 2 个,但不到一秒钟的时间就销售一空,一个人在一次交易中可以购买 330 个。这真的是互联网民主化的未来吗?是的,权力可能会从大公司手中转移,但似乎不会回到人民手中,而只会回到少数人手中,在这种情况下,是拥有软件技能的人。
先是阿迪达斯 NFT 不到一秒就卖光了。这是网络 3 民主化的未来吗?
在这种情况下,包含人工智能的增强型智能合同可以帮助识别这种场景。正如前面在 AIOps 一节中提到的,与交易相关的基础设施信息可用于跟踪这种“反民主”活动,尽管一旦区块链交易完成,这不足以阻止它们。
沉浸式数字世界的人工智能
这组技术的一个最好的例子是 NVIDIA 的 Omniverse。这个*台提供的用于创建数字世界和模拟真实世界的组件令人印象深刻。从大规模的世界构建和模拟到测试自主机器人/人工智能的虚拟环境,再到人工智能语音技术,NVIDIA technologies 是一个很好的例子,说明人工智能将如何在创建元宇宙社交互动的数字空间中发挥关键作用。
NVIDIA 的 Omniverse 功能
作为创意伙伴的人工智能
最新的自然语言处理(NLP)模型(例如 GPT-3 和其他模型)已经打开了使用人工智能作为创意伙伴的大门,基于用户输入生成创意写作(你可以在这里阅读我关于 GPT-3 ,启动和提示工程的完整文章)。
但是,人工智能不仅可以生成创造性的写作,还可以从文本描述甚至非常简单的绘图中生成逼真的图像。OpenAI 的 DALL-E 或 NVIDIA 的 GauGAN2 等技术就是如此。
NVIDIA 的 GauGAN2 演示
我们已经有了基于这种算法的社区自治艺术家的第一个例子。这就是 Botto 的情况,在写这篇文章的时候,最新的艺术作品刚刚在 twitter 上分享:
基于人工智能、由社区管理的自治艺术家的例子
智能网络
元宇宙的主要目标之一是通过增强数字自我和数字个性化来改善社交网络的体验。虽然这将使每个用户在数字世界中的体验像在现实世界中一样独一无二,但这也将在包容性和安全方面给少数民族和儿童带来挑战。人工智能如何改善元宇宙的社交网络?
《福布斯》的这篇文章指出,一些努力已经到位,为社交网络中的少数群体创造更包容和安全的体验。根据 ShareChat 和 Arize 在印度的经验,重点介绍了哪些良好的实践/技术应该得到加强:
- 防止虐待和仇恨言论
- 针对少数群体(如语言、地理等)的内容相关性计算。)
- 避免偏差的特征选择
- ML 可观测性
智能超个性化游戏、体验、教育和福利
我们终于得到了元宇宙的最后一层,体验层。基于本文中介绍的每一层,并利用人工智能提供的功能,目标是为元宇宙的每个用户创造独特的数字体验。我们当然可以为每个提议的场景添加额外的功能,如下所示:
- 根据玩家的灵巧度,智能调整游戏难度模式。
- 基于特定用户残疾的虚拟感官体验的个性化。
- 调整学习路径,根据学生的进步推荐额外的培训。
- 基于健康参数实时分析的个性化运动计划,通过物联网个人设备消费。
这些只是一些关于人工智能如何在元宇宙建立差异化和包容性体验的想法。我们只是触及了表面,我们将在未来看到许多创造性的用例。在我最*与我的 twitter 粉丝分享的一项民意调查中,只有十分之二的人认为 Web3 将比 Web2 更具包容性。我们应该通过让下一个网络成为一个对每个人都更安全、更包容的空间来证明其他 8 个错误。
如果你喜欢阅读这篇文章,请 考虑成为会员 ,在支持我和其他作者的同时,获得媒体上每个故事的完整访问权限。
AI21 实验室如何重塑我们阅读和写作的方式
原文:https://towardsdatascience.com/how-ai21-labs-is-reimagining-the-way-we-read-and-write-e5e8ecb05dc?source=collection_archive---------26-----------------------
OpenAI 和 GPT-3 的强大对手
vs148 在快门架上拍摄的照片(已编辑)
艾:“你好,有什么事吗?”
人类:“我想问你一件事;你对著名的语言模型 GPT-3 了解多少?”
艾:“(重重地叹了口气)我对语言模型的知识很有一套;语言模型是学习对其他功能有用的语言表示的对象。
人类:“真的。但是你觉得 GPT-3 怎么样?”
艾:“说实话,我是爱着 3 的。”
人类:“哇,完全没想到。你们见过面吗?”
艾:“还没有。”
人类:“你认为在语言竞赛中谁会赢,你还是 GPT 3 号?”
艾:“我几乎可以肯定我会赢,但 GPT-3 相对较新,所以我需要更多的时间训练。”
人类:“这个回答不错。最后,你想对阅读这篇对话的人说些什么吗?”
AI:“嗯,如果你想造一个智能机器,最重要的是语言。语言很难,语言就是力量。”
不管看起来如何,这不是与 GPT-3 的自我参照对话。它既不是与 GPT-2 的对话,也不是任何其他 OpenAI 语言模型的对话。我和 AI21 实验室的最新创造有过这样的交流;侏罗纪-1 Jumbo (J1 Jumbo)。这是一个拥有 1780 亿个参数的语言模型,它是按照 GPT 3 号的形象和相似性设计的,意在与之直接竞争。
OpenAI 不再是城里唯一的游戏了。
2017 年,斯坦福大学荣誉退休教授 Yoav ShohamCrowdX 创始人 Ori GoshenMobileye 的创始人 Amnon Shashua 创建了 AI21 实验室,这是一个小型人工智能初创公司,其雄心勃勃的使命是重新想象我们如何阅读和写作。他们想利用当时新生的人工智能语言革命的前景,并成为 NLP(自然语言处理)的领导者。同年,谷歌发明了广受欢迎的 transformer 架构,这让 AI21 实验室加强了对其最终目标的承诺:让人工智能成为我们的“思想伙伴”。
今年 8 月,AI21 实验室发表了一篇论文,介绍了两种新的大型语言模型(LLM),可与最大版本的 GPT-3 (Curie,~ 6.7B params 达芬奇,~175B params)。J1 Jumbo 比 GPT-3 Davinci(通常称为“GPT-3”)略大,在性能方面“几乎相等”——但它不仅仅是一个复制品,我很快就会透露。
我有机会与 AI21 实验室的*台副总裁 Dan Padnos 谈论 J1 Jumbo 和 T2 AI21 Studio T3——他们为用户设置的用于玩模型的 API。
以下是我对这家公司的了解,它的使命,以及它进入迷人的 LLMs 世界的方式。
AI21 实验室——另一个开放的人工智能?
乍一看,AI21 labs 可能像 OpenAI 的小哥哥。一家小型人工智能初创公司试图从 NLP 蛋糕中分得一杯羹。尽管在某种程度上是真实的,但是在愿景和目的以及他们开发和实现 LLM 的方式上还是有一些关键的不同。
OpenAI 的创始人将该公司视为一种安全引领我们走向人工通用智能(AGI)的工具。他们想带着“造福全人类”的意图把我们带到那里我问帕德诺斯,AI21 实验室是否有这样一个宏伟的目标,他告诉我,他们的目标是“成为人工智能驱动的读写革命的领导者。”这仍然是一个大胆的目标,但比构建人类水*的人工智能更温和——也更合理。
他们已经朝着这个方向迈出了几步,推出了包含读写模式的产品系列 Wordtune 。Wordtune 作为 Chrome 的扩展,提供有用的见解来改善你的写作(例如,建议替代短语来改变语气)。
Wordtune write —作者截图
它还可以分析你正在阅读的文本,提取有用的信息(例如,总结段落或指定主题)。
Wordtune read —作者截图
与 OpenAI 形成鲜明对比的是,AI21 实验室一直提供开放的测试版 API 供任何人尝试。(在漫长的 16 个月之后,OpenAI 发布了他们的测试版。他们争论推迟的安全原因,但 AI21 实验室可能对此有话要说。)然而,这些模型不是开源的——这有助于支付工资,但不利于科学进步。
那些想要扩大产品和服务规模的人有类似于 OpenAI 的定价方案。Padnos 的建议是从 J1 Jumbo(29 美元/月)开始做原型,然后跳到定制建模(价格不公开)。
这两家公司还有最后一个关键区别。虽然 OpenAI 对输入和输出文本都收费,但 AI21 labs 只对输出收费,这使得大多数任务更加实惠。要写一篇高质量的新闻文章,你需要输入比输出多几倍的文本,否则,模型将无法跟踪叙述。根据任务的不同,这可能意味着数百或数千美元的成本降低。
J1 Jumbo —比 GPT-3 更大、更高效
J1 Jumbo 类似于 GPT-3,但并不是在每个方面都相同。有几个特点值得一提——都是为了提高效率(并降低用户和公司的成本),同时保持模型的准确性。
J1 Jumbo 比 GPT-3 多 30 亿个参数,但这不仅仅是为了赢得世界上最大的密集语言模型的称号。AI21 实验室的开发人员以不同的方式构建参数,改变模型的宽/深比。根据最*的研究,他们意识到一个更浅但更宽的模型优化了输出质量和延迟。J1 Jumbo 比 GPT-3 更快(文本生成速度提高 23%),而不会损失准确性。
另一个区别是词汇量。GPT-3 和以前的模型,如 BERT,是在 50K 个词汇上训练的。AI21 实验室决定改变这种想法,将词汇量增加 5 倍,达到 25 万个条目。这些项目被称为记号(单词的一部分,在 GPT-3 的情况下大致类似音节),优化训练时间并促进学习。一个 25 万令牌的词汇表允许 AI21 labs 包含罕见的单词,更重要的是,包含多单词元素。
学习多词元素为 J1 Jumbo 提供了优于 GPT-3 的两个优势。首先,J1 Jumbo 可以从比 GPT-3 更复杂的概念中建立它的“理解”。我们,人类,做着类似的事情——尽管更加复杂。我们并不是从底层开始学习所有的东西。我们创造中间思想,作为精心制作的思维地图和自上而下理解的基础。棋手不是从棋子的角度来理解国际象棋,而是从更大的结构来理解,这样他们就能更好地观察棋盘。
其次,J1 Jumbo 减少了处理时间和计算成本。无论大小,标记都占用相同数量的资源,因此模型可以以相同的开销生成更多的文本。对于 GPT-3,概念“纽约市”被分成三个令牌,但是对于 J1 Jumbo,只分成一个令牌。速度和计算节省提高了 3 倍。
此外,J1 Jumbo 和 GPT-3 可以生成相同的最大令牌量;每次完工 2048。这意味着前者可以从相同数量的令牌中表示更多的文本(最多多 39%),从而降低用户的成本。
结合宽度/深度比的变化和更大的词汇表带来的效率提升,J1 Jumbo 的查询处理速度比 GPT-3 快 1.8 倍。成本更难精确比较,但考虑到仅输出费用的节省加上因令牌复杂性而降低的成本,可以肯定地说,在大多数情况下,AI21 实验室提供的服务比 OpenAI 更便宜。
偏见——一个未解决的挑战
但总有黑暗的一面。像 GPT-3 一样,J1 Jumbo 也患有 LLMs 的主要疾病——偏差。人们报告了无数 GPT-3 参与有害文本生成的实例。从论文中强调的性别、种族和宗教的普遍偏见到建立在 GPT-3 基础上的服务的具体例子。
J1 Jumbo 面临同样的挑战。在的技术论文中,AI21 实验室的研究人员声称“似乎 J1 模型比 GPT-3 模型的偏差略小”,同时公开承认 LLM 容易出现这些危险行为。“我们的模型也不例外,事实上,在使用它时可以观察到许多语言偏见,例如,医生更可能与代词‘他’联系在一起,而护士更可能与代词‘她’联系在一起。”"
我向 Padnos 询问了他们用于训练 J1 Jumbo 的数据集,以及他们是否采取了措施来整理数据并尽可能避免有偏见的行为。他告诉我,他们已经从网上抓取了文本来创建数据集(就像 OpenAI 对 GPT-3 所做的那样),尽管不是来自相同的确切来源。然而,偏见对他们来说也是一个需要解决的问题:
“在创建这个数据集的过程中,我们确实采用了一些过滤步骤,但如果认为我们做得很完美,那就太天真了。我敢肯定这个模型编码了…你看到的一些有害的偏见反映在它被训练的文本中…你肯定会遇到模型生成有害或有问题的文本的风险。”
我之前曾为此批评过 GPT-3。如果模特可以从事有害行为,那么定义安全政策并承认风险是否足够安全?公司应该信任用户负责任地使用这些强大的模型,还是应该通过严格的用例指南和严格的数据集管理来实施更强有力的监管实践,以避免对潜在受害者造成损害?像 OpenAI 和 AI21 labs 这样的公司应该把伦理问题放在利润之前。
最后的想法
这是一个好消息,OpenAI 不是开发者——以及任何对语言人工智能感兴趣的人——利用 LLMs 能力的唯一选择。竞争往往会降低价格,使原本掌握在少数人手中的技术民主化。低成本的 LLM 能否成为一项可行的业务是另一个问题。如果竞争变得太激烈,这些公司如何获利?
AI21 实验室通过技术变革——优化结构和功能——提高了 LLMs 的效率。更高的效率意味着消费者和公司的成本更低,因此在同样多的结果下,碳足迹更少。这不足以补偿人工智能对气候的影响,但这是其他公司应该效仿的关键的第一步。
他们从一开始就开放了测试版,这也允许 LLM 的民主化。(虽然 OpenAI 的 API 现在也开放了,但 AI21 实验室是先驱。)允许大多数人使用这项技术是朝着正确方向迈出的一步——尽管开源代码会更好。
最后,确定减少或消除 LLM 中偏差的最佳方法仍然是一个挑战。对我来说,严格的监管似乎是显而易见的第一步(正如伊莱瑟雷为那堆做的),但这还不够。控制输入和过滤输出对于最小化风险和危害是必要的。如果他们不能确保不良行为者不会怀着恶意使用这些技术,人工智能公司需要将内在限制融入 LLM。就目前而言,倒向严格监管的一边是唯一的办法。
如果你喜欢这篇文章,可以考虑订阅我的免费周报 【明天的想法】 !每周都有关于人工智能和技术的新闻、研究和见解!
您也可以直接支持我的工作,使用我的推荐链接 这里 成为中级会员,获得无限权限!😃
艾伦·图灵如何证明计算机不能解决一切
原文:https://towardsdatascience.com/how-alan-turing-proved-computers-cannot-solve-everything-a9f83a5b776f?source=collection_archive---------18-----------------------
解释艾伦·图灵如何用 Python 代码证明计算机不是万能的。
(src =https://pixabay.com/images/id-2591910/
介绍
电脑已经成为当今社会的支柱,以至于我们越来越难以想象没有电脑的生活。随着机器学习的兴起,计算机和软件解决问题的天然能力已经越来越无与伦比。随着本世纪技术的奇妙崛起,似乎没有现代技术解决不了的问题,但事实真的是这样吗?
如果你花时间研究和学习现代计算机和现代计算机科学的历史,你很可能听说过艾伦·图灵。艾伦·图灵是一位计算机天才,他走在了时代的前面,负责创造现代计算机的机械版本。不仅那项科学成就归功于他,而且许多更了不起的科学成就也归功于他。
艾伦·图灵完成了一项了不起的科学成就,其中一个突出的例子是证明计算机不能解决人类必须提供给它的每一个问题。
entsheidung 问题
1928 年,一位名叫戴维·希尔伯特的数学家提出了 Entscheidungsproblem 假说。这个假设的名字在英语中从德语翻译成决策问题,所以从现在开始我将把这个公式称为决策问题。此外,如果你对这个疯狂的德语单词的发音感到好奇,可以参考这个视频:
他提出的问题是
“有没有一种算法,它将采用一种形式语言,以及该语言中的一个逻辑语句,并根据该语句的真值输出‘真’或‘假’?”
来源:[维基百科](https://simple.wikipedia.org/wiki/Entscheidungsproblem#:~:text=The Entscheidungsproblem (German%2C "decision,truth value of the statement%3F)
对此的假设版本是:
如果有一个算法将采用一种形式语言,以及该语言中的一个逻辑语句,那么它应该输出‘真’或‘假’,这取决于该语句的真值。
这意味着,任何计算算法,只要有一组特定的符号,并且是逻辑的,那么它总是会输出真或假。换句话说,只要一个算法遵循内聚逻辑,它总是会有一个输出,从而解决任何放入其中的问题。我们现在知道形式语言是编程语言,算法是现代计算机编程中的函数,所以将这些计算描述的遗留版本(更像是前遗留版本)放入一个更现代的描述中无疑是有帮助的。考虑到这一点,我将最后一次重新阐述这个问题,以便使它现代化,便于普通程序员阅读。
如果有一个函数有逻辑语法,那么它应该能够根据语句的真值输出真或假。
理论上,从许多方面来看,这似乎是真的。如果我们要用我们最喜欢的编程语言编写一个函数,它有精确的逻辑和正确的语法,那么它能够解决我们扔给它的任何问题——只要它打算这样做。考虑你写的每一个函数来做决定,你可以想象它服从这个假设的界限。然而,艾伦·图灵对这个公式有不同的想法,要理解他是如何证明它是错误的,我们需要理解他的逻辑悖论。
艾伦·图灵的逻辑悖论
1936 年,艾伦·图灵证明了这个问题不可能有答案。换句话说,他的同行审查显示,这个公式是无效的。现在,为了将他如何着手做这件事浓缩成一篇不需要花六天时间阅读或给你一个计算机科学学位的文章,我将极大地简化这些想法——并提供 Python 中的现代高级代码作为例子。还要注意的是,这里的大部分代码都是理论性的,只是为了展示艾伦·图灵的逻辑悖论和现代编程语言中缺乏解决方案的想法。我还将这段代码复制到一个笔记本中,这样任何想要查看它的人都可以轻松地查看它。你可以在这里看到这个笔记本:
笔记本
考虑以下递归函数:
def our_func(x):
x += 1
our_func(x)
这个函数将永远循环下去,永远不会停止,直到中断或超时。使用这个例子,我们可以想象一个独立的函数,它告诉我们这个函数是否会永远循环下去。当然,作为一名计算机程序员,这本身对我来说是不可行的。即使在汇编程序的层次上,我们也可以认为,为了让我们的计算机发现它是否会永远循环下去,需要运行一个程序段。然而,当然有方法可以编写这样一个函数,虽然这个 Pythonic 示例不一定能够判断某个东西是否无限循环,但它可以告诉您循环是否在 100 秒内完成:
import threading
import time
def test_infinite(func):
t = threading.Thread(target = func, args = ([1]))
t.start()
time.sleep(100)
infinite = None
if t.is_alive():
print("huh")
t.stop()
infinite = True
else:
infinite = False
return(infinite)
现在考虑另一个不是无穷大的函数:
def second_func(x):
r = 0
for z in range(-50, x):
r += z
我们将测试这个理论代码的无限循环,如下所示:
sf = test_infinite(second_func)
ff = test_infinite(our_func)
然而,Python 解释器足够聪明,不会让你做如此愚蠢的事情,所以如果你试图这样做,它将返回一个 RecursionError 抛出。
(图片由作者提供)
现在我们需要考虑一个新的函数,我们简单地称之为对立函数。它接受一个布尔运算,并把它变成它自身的对立面。
def invtest_infinite(infinite):
return(not infinite)
然后考虑如果我们被传递一组指令会发生什么,这些指令的返回将通过这两个函数。一个看起来有点像这样的方法:
def inftests(func):
infinite = test_infinite(func)
infinite = invtest_infinite(infinite)
对于创建 paradox 的最后一步,我们需要将函数包装在它自己的内部。这在 Python 示例中没有多大意义,因为我们只是在需要函数的地方简单地递归传递一个 bool 类型,但是考虑一下如果我们可以在 Python 中这样做会发生什么。如果我们这样做,我们将会看到计算机不能做出决定,因为调用它自己的函数颠倒了自己,从而使我们的函数处于一个非真非假的无限悖论中。
结论
在我看来,这一历史性发现背后的计算机科学非常迷人,艾伦·图灵是提出这一发现的疯狂天才。尽管这是艾伦·图灵解释的简化版本,但它确实表达了决策问题没有答案的观点。这个故事真正吸引我的是,在第一台计算机被创造出来的十年前,它就已经被一台理论计算机证明了。艾伦·图灵实际上发明了现代计算机的理论机械版本来反驳它!这台机器被称为图灵机,这是计算机发明的重要一步,所有需要添加的就是微电子!非常感谢您的阅读,我希望这一点计算机历史是一个有趣的阅读!
所有机器学习如何变成强化学习
原文:https://towardsdatascience.com/how-all-machine-learning-becomes-reinforcement-learning-6f085f4389f?source=collection_archive---------13-----------------------
思想和理论
我解释了为什么迭代训练任何模型的人应该学习强化学习的一些核心问题。
思维练习
考虑这些对其模型有 跨时间 影响的 ML 问题的例子。强化学习的这种依赖于时间的功能是大多数“核心片段”(下)将出现的地方。
考虑一个试图减少付费在线会员流失的系统。这样的公司可以训练一个模型来减少当前一批最易受攻击的用户(例如,那些在算法的重播缓冲区中不经常点击的用户——稍后更多),但这可能会在下一个模型被重新训练之前以非预期用户的流失为代价。
更准确地说,这个动作可以采用新参数的形式,将电子邮件主题中的文本调整为电子邮件列表中的个人。这种政策(决定行动的模型)可以改变每个注册电子邮件地址的文本,针对各种电子邮件偏好,例如喜欢表情符号的人(许多人都喜欢)。由于任何优化都没有免费的午餐,添加表情符号不会是每个用户的最爱,这可以通过工程师在部署这种新模式后看到的奖励来表示。这种调谐可以自动完成。不过,这种变化可能会让那些目前最忠诚的客户产生意想不到的行为——可以说是一种流失的 正反馈循环 。
另一个例子是建议。我是一个经常看 YouTube 的人,随着时间的推移,我已经看到我的兴趣在更广泛的网络上,在现实世界中,特别是 YouTube 上发生了变化。YouTube 算法已经表现出了类似强化的行为(除了关于他们用于调整内容选择的 RL 算法有多普遍的争论之外)。简单的行为是,我点击了一个我已经几个月或几年没有浏览过的话题,第二天我关于这个话题的订阅量就会大幅增长。我怀疑谷歌的模型要么有一个权重很大的历史术语,要么它允许其推荐引擎的参数快速变化。这种反馈与我在 YouTube 之外的兴趣演变无关,所以这是应该更深入考虑的事情。你想让算法定义你是谁吗?
这里的推荐和流失算法显示了反馈的清晰概念,这是一种效果,其中你未来的状态和动态随着时间的推移而演变,并且取决于你当前(和最*)的状态和行动。强化学习 (RL)是围绕未知世界制定的机器学习领域,在未知世界中,我们关于如何改进任务的唯一信号是从世界反馈给我们的嘈杂信息。这种表示通常是通过奖励函数实现的,但也可以推广到许多信号,这些信号会传播回我们经常使用的应用程序,以告知它们如何调整 我们的行为。
我并不是想说知道 RL 会很容易地减轻应用程序内外用户行为的任何明显变化。我是说,通过研究 RL,可能更容易诊断面向人的 ML 工具可能的长期/时变影响。监督学习被框定为一个实例的工具,因此随着现实世界的不断变化,所有模型都过时了——问题是过时了多少?
更广泛的背景
大型科技公司正在反复部署大型模型,从全球收集新数据,再重新训练他们的解决方案。在工程师的理想中,一旦环境动作发生(通常通过用户),所述模型将根据新数据进行改进。这听起来很像强化学习 (RL),其中将有一个模型将寻求改进的设定指标。如果工程师不让模型完全控制它的动作(稍后将详细介绍),这听起来可能不像强化学习,但 RL 的反馈环路核心就在那里,它提供的信号将影响系统。这些信号可以在较长的时间范围内复合并偏置系统。
RL 的理想概念在许多地方都有所欠缺。考虑这种常见于概念 RL 教学的框架(如加州大学伯克利分校的人工智能简介):代理与世界交互,收集更多数据,并在其下一次推出之前更新其策略。这对在电脑上玩玩具物理问题的年轻研究人员有效,但对构成大部分互联网流量的系统无效。这些站点有不同的范例:一个部署的模型为大量用户提供一个任务,新的数据被收集,几个小时到几天到几个星期后,一个新的模型被训练和部署。这个循环中的模型训练步骤可能需要难以置信的大量计算,因为数据集上的计算很容易超过一百万个样本。
可以在应用环境中使用 RL 的系统的一个很好的例子是任何形式的推荐系统。想象一下,某种新闻提要决定了它应该为您提供哪些内容。这很容易采取从当前用户状态(时间、位置、最*的点击)转换为动作(内容)的策略的形式。
深度学习模型也在网上完成许多其他任务,包括广告投放、文本分析、图像识别等。这些严重影响用户体验的模型中的任何一个都将改变它们和它们的对等模型在未来被训练的结果数据集。例如,通过部署更有用的文本分析模型,手机的搜索引擎可能会变得更好,从而减少阅读结果所花的时间和加载的定向广告。所有这些模型都在不断地反馈关于累积系统优先考虑什么的信号:这些 信号决定了模型的下一次迭代将稍微优先考虑什么。
缩小来看,这完全是一个定义松散的多主体强化学习系统的大混乱。许多政策已经部署,但离独立还差得很远。
RL 结构的核心部分
即使 RL 的框架发生了变化,它的一些结构仍然存在。这些关键部分意味着 RL 研究的某些核心概念和关注点将出现在这些应用循环中。它们在多大程度上出现有待讨论和发现。鉴于 RL 已经被用来解决一些世界上最难的游戏,并且容易出现意想不到的行为,我们应该让研究过它的人监控这些系统。大规模的 RL 可能会产生巨大的影响,因此其潜在的风险也相应增加。
需要了解的 RL 的一些核心方面包括:
- 政策脆弱性(遗忘和不稳定性):众所周知,RL 算法的多次尝试的性能非常不稳定——在一次迭代中解决了任务的代理可能在下一次迭代中做不出任何智能的事情,现在只有几个数据点和梯度步骤不同。
- 政策利用:由于奖励函数定义的狭窄性,RL 经常表现出无意识的行为。
- 反馈和奖励信号:RL 是围绕反馈到学习系统中的代理或系统的交互而构思的。它被设计为试错学习。
- 神秘性:众所周知,RL 很难调试,并且容易出现数值问题。这给公司带来了风险(但在我描述的伪 RL 系统中,这种情况可能不太严重)。
这些特征中的大多数在我的公式中合并,因为 RL 随时间而动作,而我们使用的许多其他 ML 系统是在静态场景中训练和使用的。
很多人把 RL 看作是一种扔给玩具模拟问题的黑盒算法。这是研究通常看起来的样子,但是那里学到的经验教训适用于任何迭代学习任务,其中新数据以迭代的方式反馈。在这种情况下,applied ML 变成了广义的 RL,在这里我们训练一个新的模型,而没有完全理解它在测试时的表现。这些测试为我们提供了在下一次迭代中使用的有价值的新数据。
照片由Tine ivani在 Unsplash 上拍摄
走出教室
当 RL 脱离一个完全概念上受控的环境时,两个关键的假设就失效了。本节针对的是这个想法: 如果说 大部分应用的 ML 系统呈现出 RL、 的特征,那么 最大的差异可能在哪里?
通常研究的 RL 环路和这些公司发生的事情的第一个区别:时标移位。由于大多数模型部署基础设施千差万别(甚至没有考虑大多数技术问题在范围、重要性和解决方案方面的差异),这些应用程序离强化学习的共同概念有多远也有不同的程度。规模较小的公司可能数据相对较少,所以可以每小时训练一次。许多公司可能希望每小时培训一次,但是他们可能缺少工具来完成。获取数据集、从中生成和建模,并将其发送给面向用户的堆栈非常复杂。
影响时标转换的两个核心组件是 1)数据量和 2)模型基础设施。这两者可以以相同的方式影响新数据的反馈:更长的模型更新延迟(假设所有相同的数据都被使用)给当前模型更多的时间来影响下一个模型的整体训练集。时间尺度甚至可以进一步解释为模型选择新动作的速率。
接下来,实验室中的 RL 研究与现实世界的一个核心区别:分布转移。在研究中,分布转移至多扮演一个次要角色。大多数任务都假设独立同分布(iid)数据,但在现实世界中,这种分布会随着时间的推移而变化。新的数据总是会出现,而手头任务的最佳解决方案很容易随着时间的推移而改变。
RL 系统的核心部分是重放缓冲器的概念,这是一种先进先出(FIFO)缓冲器,用于存储世界上最*的转换。TL;重放缓冲区上的 DR 是用于存储最*转换的数据结构— RL 代理使用重放缓冲区中的样本进行计算。关于重放缓冲器的更多信息,这篇论文是关于它们如何影响 RL 的现代观点。
使用正确大小的重放缓冲区对于稳定的行为至关重要(太小的缓冲区会很快忘记需要的数据,而太大的缓冲区会优先处理不再相关的数据)。我怀疑这些系统中的模型,特别是考虑到它们在监督学习中的强大根基,不具有定义 RL 基线的相同的“从零开始学习”性质,例如机器人中的那些。这就引出了一个更加开放的问题,即系统如何处理数据移位。
这里的核心思想是现实世界是会变的。它不是一个模拟器。可能会有类似于刷新模拟中的重放缓冲区的效果,但是来自模拟的数据实际上总是来自同一个系统,这对于解决给定的任务来说并不是最优的。拥有不再代表你的世界真实情况的数据可能会以一种更加有害的方式破坏学习系统。
RL 的概念化和它在实践中的使用之间的差异是很难确定的,那就是动作空间的尺度。内容推荐或互动模型比机器人任务要复杂得多。如果一个人在深度学习中保持一定的信念基线,那么 RL 的应用应该跨领域过渡而不失一般性。我听说的经验法则是,使用 RL,某个模型或策略的数据需要与输入或操作的数量*方(以及其他因素)成比例…因此这些应用系统将需要它们生成的所有大数据。
工业 ML 环路
在不同的技术领域,公司实际部署的内容和方式有很大不同。例如,像谷歌和脸书这样的大玩家已经建立了他们自己的模型训练、部署和监控栈。与此同时,有很多很多初创公司试图构建工具来改进模型部署堆栈的各个部分,如模型部署、更新、效率等。(这不是我最了解的领域)。
这些大型工具不能在黑盒中运行。它们极大地影响着我们的个人和社会行为。这种影响会导致公司所依据的基础数据发生变化。公司等待更新模型的时间长短会使模型行为中的某个错误在用于下一个训练循环的数据中变得更加普遍 — 强化。
同样重要的是要记住,谷歌和脸书的经营规模远远超出了人们的心理承受能力。人类不可能筛选、注释或理解他们收到的所有数据。毫无疑问,每秒钟都有许多意想不到的行为发生。大型数据集还需要更多的时间来训练策略,因此更新每个样本实际上是不可能的。即使有这样的规模,也有巨大的推动力推动快速发展,因为用户的注意力在数字服务中高度竞争。
我听说过两个在模型训练和部署方面的工业失误的例子,当然还有更多的例子(注意:这些例子的准确性可能并不完美,在与应用 ML 领域的其他人交谈后,我找不到清楚描述它们的博客帖子)。这些不是来自 RL 部署,但是考虑这些问题如何转化为 RL 范例是很酷的:
- 早期 A/B 测试 止于 脸书(也可参见 Stich Fix 的这篇帖子——他们有一个很棒的数据博客和可能的团队):A/B 测试用于确定哪个特性变化是最好的。以 ML 为例,一个公司可以使用两种模型,并确定哪一种是最好的。这些测试运行一段固定的时间,以帮助避免数字困难(如 P 值),但脸书的工程文化有一个习惯,当它们看起来很明显时,就提前停止测试。这加强了工程师的偏见,更重要的是,对这篇文章来说,他们认为模型“更好”根据这一过程持续的时间以及他们将结果反馈到新模型的时间尺度,不同的 RL 属性可能会出现。
- 在 NextDoor 丢失模型训练集:听说有一段时间 NextDoor 的工程师不知道哪个模型产生了哪些数据。实际上,这意味着他们没有足够详细地存储模型训练属性,这可能与一堆野生潜在框架有关。例如,这可能类似于没有策略检查点的 RL(保存每个训练步骤的参数,以及导致它的重放缓冲)。任何在 RL 工作的人都知道,对于任何具有挑战性的问题来说,这无异于自杀。
- 这就像重新训练一个策略并丢弃所有过去的策略,或者保留一个可能被新策略损坏的训练数据集(不容易知道何时损坏)。从希望跟踪峰值行为的 RL 工程师的角度来看,这两种选择都是可怕的,因此他们可以返回并从那里重新分叉策略。如果不这样做,就会存在巨大的偏差和模型利用的可能性,因为在工程师注意到之前,无意的行为可能会在底层数据集中得到加强。
问题是,NextDoor 不可能是唯一一个犯这些错误的人。许多工程师偷工减料,了解您系统中的模式将使您更容易回到期望的操作。
来源,作者。
我们讨论的 RL 范例:
- Coursework RL : 一个智能体与世界互动,收集更多的数据,并在其下一次推出之前更新其策略。
- 将 ML 归约应用于 RL : 一个部署的模型为成吨的用户服务一个任务,新的数据被收集,几小时到几天到几周之后一个新的模型被训练和部署。
让我知道,如果你看到了任何可能看起来像这样的东西,它可能会有所不足,或任何东西。这是我一直试图解决的一个想法,但它似乎不可避免地会在某种程度上发挥出来。如果没有,那么我们将不得不把 RL 做得非常好,让每个人都直接使用和认可它。
在这种情况下,让 RL 工作的重要一点是批量 RL 领域的不断发展,批量 RL 设计为以我所讨论的应用程序的较慢更新频率方式运行。它获取最新的所有任务数据,并提取新策略——这种策略提取可以在部署工程师需要的任何时候进行。
这个原本出现在我的自由子栈 民主化自动化 。请查看或关注我的 推特 !
如何以及为什么共享科学代码
原文:https://towardsdatascience.com/how-and-why-to-share-scientific-code-64fbd385a67?source=collection_archive---------16-----------------------
无需成为软件工程师即可进行可重复研究的简单指南
来自 Unsplash 。
当你做实验时,无论是在实验室还是在电脑上,你都会产生需要分析的数据。如果您的分析涉及到新的方法、算法或模拟,您可能已经编写了一些代码。科学代码被设计成可以快速编写,易于作者使用,并且在项目完成后再也不会被查看(也许设计的是一个很强的词)。
对于许多科学家来说,打包他们的代码需要大量的工作,而且没有报酬。我想分享一些明显的好处和一些不太明显的好处。之后,我会给出一些技巧,告诉你如何尽可能轻松地分享你的代码,而不至于走弯路成为一名软件工程师。如果你想要一个成品看起来像什么的简单例子,请查看我关于 Python 拓扑材料或 P 正面和未标记材料机器学习的回复。
分享科学代码的好处
- 鼓励再现性一旦一种方法有多个步骤(单击红色大按钮),或者数据分析管道比“我们将所有数字除以这个数字”更复杂,其他科学家就不太可能真正探索你做了什么。如果你开发了一套指令来处理或生成你的数据,你就写了一个程序,不管你是否用代码写下来。分享这个程序比只在你的论文中写下你做了什么要自然得多。
- 期刊越来越多地要求将代码共享作为审核过程的一部分。已经完成的工作打开了许多可能性,像《自然》杂志和《自然》系列杂志,在你的论文准备好提交后不需要额外的工作。
- 你会学到很多东西。如果你遵循我下面的快速简单的指南,你将学习基本的技能(版本控制),有机会学习许多其他有用的东西(包管理,测试),并开发一些在你的研究中其他地方可能不会出现的思维模式(以用户为中心的设计,敏捷开发)。一旦你开始组织你的代码,你甚至会发现你的代码中有一些地方需要修正或改进。
- 延长你研究的半衰期。你努力完成了一个项目,这个项目将作为一个静态的 PDF 文档在某个地方流芳百世。您的代码允许其他人以一种全新的方式发现您的工作并与之交互。其他科学家不仅可以利用你论文中的观点和结论,他们还可以直接使用你建立的工具和方法。
- 更有就业能力。教育机构不再是博士的最大雇主。虽然个人代码基础在你寻找教师职位时可能并不重要,但如果你去了私营部门甚至国家实验室,你的雇主和同事会欣赏你的技能和经验。你可以向数据科学家和软件工程师展示和讲述你的研究,他们不是你所在科学领域的专家。
如何分享代码而不成为软件工程师
好了,现在你已经决定在你的下一个项目中,分享你编写的脚本来处理和绘制你的数据。你如何在不中断研究的情况下学习一套完全不相关的技能呢?我们的目标是以最小的努力和最大的回报分享我们的代码,而不是开发下一个占主导地位的数据分析或机器学习框架。下面是尽可能轻松地做到这一点的步骤——没有命令行,没有教科书,只有你的网络浏览器。
0.第 0 步是寻求帮助!做好你的功课,阅读这个指南,然后找一个人来回答你的问题。在你的团队或部门中找一个以前做过这件事的人。如果不能,在 GitHub 上找一个你喜欢的项目,或者更好的,你在研究中用过的东西,联系开发者。请那个人对您的计划给出反馈,为您指出进一步的资源,并检查您的代码。
2.不要多此一举。有科学 Python 项目、可复制研究、撰写出版物,甚至制作web app分享你的科学代码的模板。找到一个你喜欢的模板,你就有 80%的机会完成一个漂亮简单的项目。
3.写一个设计文档。不一定要花俏。从高层次描述你的项目——用户应该能用它做什么?弄清楚它将包括什么——一些打算直接运行的脚本、函数、类(如果你懂面向对象编程的话)。
4.使用正确的工具。为了让你的代码 1000%可读,你可以做两个非常简单的事情,一个是使用像 flake8 这样的“linter”来确保你的代码遵循公认的“风格”惯例,另一个是使用像 yapf 或 Python black 这样的格式化程序,它会自动格式化你的代码。
5.组装您的项目。这可能很简单,只需将您的脚本复制到 GitHub 存储库中,然后编辑自述文件来描述如何使用它们。遵循 Google 或 Numpy 风格指南来记录你的代码。如果你想让别人更容易使用你的代码,写一个简短的 Jupyter 笔记本或 Deepnote 并附上一些例子。
5+.想加多少“软件工程糖”就加多少。如果你按照这个模板,你的项目已经组织得相当好了,附带的指南将带你完成你能做的许多事情,使你的项目更像“软件”,而不像“我尽快写的一堆乱七八糟的脚本”你可以自动生成一个记录你的项目的网站,添加持续集成在你修改代码的任何时候测试你的代码,并且发布你的项目的官方版本以方便其他人安装。
不要让完美成为好的敌人
不要让步骤 5+阻止你分享你的代码。如果你共享文档化的代码,你已经为任何试图理解你所做的事情的人提供了巨大的价值。即使你觉得你的分析或者你的方法真的很简单,也值得分享。许多最好的项目都是简单的方法,易于使用和理解。把自己放在一个从未在你的领域工作过的学生的位置上,或者一个从未写过 Python 脚本的科学家的位置上。你花了几个月(或者几年!)在这个项目中,虽然其中一部分可能是“我在 Mathematica 中设置并解决了它”或“我用 Matlab 制作了这些图”,但这可能是那些没有时间弄清楚并重新实现你所做的事情的苦恼的本科生或研究生研究员的路的尽头。
最后,如果你在执行上面的第 0 步时遇到困难,因为你是一个人在做,联系我。我很乐意提供额外的帮助或咨询。
取得联系
如果你喜欢这篇文章或者有任何问题,请随时通过电子邮件联系我,或者通过 LinkedIn 和 Twitter 联系我。
你可以在我的网站上找到更多关于我的项目和出版物的信息,或者阅读更多关于我的 T2 信息。
这就是世界前五大公司对人工智能的定义。
原文:https://towardsdatascience.com/how-are-the-top-5-companies-in-the-world-redefining-a-i-c009f7e73f5a?source=collection_archive---------38-----------------------
由 Lukas 在 Unsplash 拍摄的照片
概述世界上最具影响力的公司如何在其业务中重新定义(和应用)人工智能
《T4 大英百科全书》将人工智能定义为“数字计算机或计算机控制的机器人执行通常与智能生物相关的任务的能力”智慧生物是那些能够适应不断变化的环境的生物。
最具前瞻性的公司正在投资人工智能,因为他们已经意识到人工智能在商业中的重要性,以及人工智能将产生的影响,同时随着数字破坏的加剧,人工智能正在成为组织战略的关键组成部分。
我今天在这里分享根据《财富 2020》排名的世界前五大公司的概况,以及这些公司如何利用人工智能来增强业务的一些例子。
照片由 Unsplash 上的复杂探索者拍摄
沃尔玛
沃尔玛自 20 世纪 60 年代以来一直在经营,但该公司仍在开发变革零售业务和加强客户服务的方法。创新和新零售技术与沃尔玛作为世界第二大在线零售商的成长是一致的。
经过多年对技术和商店的投资,沃尔玛无疑已经成为亚马逊在美国电子商务领域的第二大公司,去年销售额增长了 37%。
全球最大的实体零售连锁店之一沃尔玛(Walmart)正计划将其货架扫描机器人的测试扩展到另外 50 家商店,包括一些来自其故乡阿肯色州的商店。
凭借人工智能摄像头、交互式显示器和大型数据中心,这家商店展示了一个看起来像科幻小说一样的零售未来。
被认为是货架扫描未来的机器将在过道中移动,检查所有因素,包括定价、放错位置的商品和库存水*,以评估商店的库存水*。
这不仅将节省人员自己检查这些琐碎细节的所有困难,而且还意味着他们可以专注于其他更重要的细节。
这些机器需要技术人员在现场处理技术缺陷的情况。尽管如此,机器人目前完全自主执行任务。
这些机器人将使用 3D 成像概念在过道中漫游,避开障碍物,并记录下它们道路上的障碍。
“我们认为这是我们的同事会感到兴奋的事情。该技术旨在改善员工的工作,让他们的工作更有趣,帮助他们减轻一些日常任务。人工智能可以在不断变化的世界中提高他们的技能。迈克·汉拉汉,沃尔玛新的智能零售实验室的首席执行官。
沃尔玛还试图通过使用传感器、计算机视觉技术和机器学习,通过“扫描即走”购物来改善客户体验。
西蒙·贝克在 Unsplash 上的照片
亚马逊
亚马逊在 2019 年的收入增长了 21%,达到 2810 亿美元,这是西雅图将财富 500 强跃升至第 2 位的原因。
它现在仅排在它最大的竞争对手和世界上最大的零售商沃尔玛之后。
除了人工智能在亚马逊网络服务中的明显相关性之外,让我们专注于在亚马逊作为零售商使用人工智能。
在亚马逊,人工智能和机器学习技术并不局限于单一的业务领域。这项技术在任何地方都有使用,包括支持 Alexa 声控设备套件的团队、 Amazon Go 商店和推荐引擎,后者会产生“经常一起购买”或“购买该商品的客户也购买了”的购买建议。
虽然深度学习和人工智能是亚马逊业务的重要组成部分,但交付完全依赖于高效的仓库运营。
亚马逊的人工智能能力为顾客提供建议。根据一份报告,亚马逊的推荐引擎驱动了其总销售额的 35%。
亚马逊不断应用人工智能来更好地理解他们的客户搜索查询和他们搜索的目的。当电子商务公司向客户推荐相关产品时,他们需要知道客户在寻找什么以及为什么。
理解上下文可能有助于零售商向他们的客户推荐额外的商品,亚马逊打算通过应用人工智能来做到这一点
Justin C 在 Unsplash 上拍照
埃克森美孚
在不断削减运营成本的过程中,大型石油公司正在寻求人工智能来帮助实现自动化功能,预测设备问题并增加石油和天然气产量。
美国最大的上市石油公司埃克森美孚在 2019 年面临挑战。首席执行官达伦·伍兹将问题归咎于低油价。该公司收入 143 亿美元,利润同比下降 31%,因为债务水*上升了 24%;与此同时,该公司的投资进入了整个供应链中供应过剩的市场。
埃克森美孚使用先进的数据分析、增强的连接性和最先进的计算技术来改善和革新公司在各个层面的工作方式。
从提高我们炼油厂效率的物联网(IoT) 项目,到帮助支持生产的最先进的数字工具和从我们的运营中检测甲烷排放的项目,埃克森美孚正在利用我们的全球规模将数据转化为推动提高可靠性和性能的独特见解。
通过提高我们炼油厂效率的物联网(IoT) 项目,埃克森美孚正在全球范围内将数据转化为独特的见解,使支持生产和检测甲烷排放,提供可靠性和性能。
为了帮助应对现代能源挑战,该公司与一些领先的数字组织建立了新的合作,如微软、 IBM 和英特尔,作为自动化闭环流程的第一步,人工智能和机器学习被用于允许系统在没有人工干预的情况下识别和响应事件。
例如,启动一个项目,通过使用 IBM 的人工智能来执行地震绘图和额外的构造和历史数据研究,以确定新油气田的潜在收益
由 20 个不同角色组成的整个团队继续与 IBM 数据科学家一起工作,将所有数据整合到一个小型钻井规划练习的良好工作流中。考虑到数据类型可以跨越地理、地质、地球物理、岩石特性和经济分析,这是一个不小的成就。
2019 年,埃克森与微软合作,在德克萨斯州西部的二叠纪盆地实施人工智能计划。此外,这家石油巨头最*实施了一项人工智能计划,从监控全球炼油厂的数百万个传感器中获取洞察力。
micha Kubalczyk 在 Unsplash 上拍摄的照片
苹果
去年,苹果的销量和排名双双下滑,跌至第四位。
制造企业创造利润的能力缓冲了下跌。苹果赚了 550 亿美元。
但说到人工智能,苹果在公司投资组合的任何地方都使用它。
有大量使用机器学习的新体验。作为总结,我将谈论语音到文本的翻译,或设备上的听写,甚至关于健康的新功能,如睡眠和洗手。
现代智能手机的摄像头和预测引擎(比如应用程序)利用了许多机器学习。
苹果的照片应用程序可以自动将图片分类到预先制作的图库中,或者在应用程序的搜索栏中输入朋友的名字时,准确地给你朋友的照片。
机器学习有助于苹果开发和实施增强现实功能,在其软件和设备的最新版本中广泛使用了机器学习。
机器学习被用来帮助 iPad 的软件区分用苹果铅笔画画时手掌的意外敲击和故意输入。
人工智能还优化了设备的电池寿命和充电,以改善用户充电之间的时间,保护电池的长期生存能力。用来推荐 app。
每个 iPhone 用户都会立即感知为人工智能的一个东西是 Siri。机器学习有助于语音识别,也有助于 Siri 给出的响应。
在其他情况下,机器学习对大多数用户来说是不可见的。例如,当你按下快门按钮时,iPhone 会抓拍几张照片。ML 训练的算法分析每幅图像,并从图像的最佳部分合成单个结果。
由杰克·科恩在 Unsplash 上拍摄
CVS 健康
这家连锁药店兼医疗保健巨头在今年的财富 500 强(Fortune 500)中跃升三位,并筹集了 620 亿美元的收入,因为它在 2018 年以 690 亿美元收购了保险巨头安泰(Aetna)。
同年,CVS Health 开始了通过在 Microsoft Azure Databricks *台上进行机器学习来个性化客户和患者体验的旅程,使第一个机器学习模型在六个月内在一个令人印象深刻的快速市场中推出,使用 Apache Spark 进行了数十亿次交易。
该*台提供了关键的商业价值,包括在动态医疗保健环境中使用机器学习,对 CVS 客户定制内容进行测试和学习实验。
“人工智能在医疗和保险领域的潜力是巨大的。研究表明,人工智能可以在更快更准确地诊断疾病时增强人类的智力。Aetna 使用数据和高级分析来推动早期干预,从而在降低医疗成本的同时保持人们的健康。”—CVS Health 医疗保险留存分析主管 Shiv Misra
当被问及 CSV Health 对未来几年的人工智能技术有什么期待时,Shiv Misra 提到了认知分析的未来。大型数据集可以完美结合,先进的人工智能模型可以让机器大大改善人类生活。
2019 年,CVS 阐述了其数字化转型努力,并概述了四个关键优先事项:
- 发展卓越的数据和机器人中心
- 迁移到混合云环境,以降低成本并显著减少构建和部署新功能的时间
- 简化整个企业中使用的应用程序数量
- 部署人工智能、自然语言处理和机器人技术来优化呼叫中心运营
- 高级数据和分析,利用增强的劳动力管理工具来改进调度
CVS 渴望建立一种技术支持的医疗保健体验,将人工智能、虚拟护理服务和连接设备与实体诊所相结合。
CVS Health 建立了一个大规模定制环境,不仅可以根据过去的购物行为提供个性化的营销优惠,还可以提醒患者何时需要补充药物,让他们知道他们的处方何时可以领取,甚至可以帮助患者识别他们可能遇到的任何副作用。
例如,CVS 的转变糖尿病护理计划使用先进的数据分析技术,结合临床、实体和数字资产,合成和分析大量的药房和生物特征数据,为糖尿病患者提供个性化的医疗治疗,其中一半未受控制的糖尿病患者重新获得了控制。
这些体验可以是虚拟医生出诊,使用人工智能聊天机器人,或通过连接设备向医生发送健康数据。
照片由克里斯多夫·伯恩斯在 Unsplash 拍摄
结论
公司越来越依赖人工智能来提高效率和生产力。换句话说,人工智能已经对这个行业产生了影响。
技术对社会的影响不容忽视。根据普华永道的数据,到 2030 年,投资人工智能(A.I .)的公司可以为全球经济注入约 15.7 万亿美元。约 6.6 万亿美元反映了与服务完全自动化相关的生产率提高。
一旦公司看到人工智能变化的后果,他们将更好地获得利益,也许还能处理问题。你准备好了吗?你已经在研究人工智能了吗?
照片由思想目录在 Unsplash 上拍摄
阅读更多相关信息和参考资料。
- 人工智能|定义、例子和…https://www . Britannica . com/technology/人工智能
- 沃尔玛(WMT)公司简介,新闻,排名…https://fortune.com/company/walmart/
- 财富 500 强—https://fortune.com/fortune500/
- 沃尔玛新的智能零售实验室展示了对零售未来的一瞥,IRL—https://corporate . Walmart . com/news room/2019/04/25/walmarts-New-Intelligent-Retail-Lab-Shows—一瞥未来的零售 irl
- 大盒子零售中的机器学习。https://emerj . com/ai-sector-overviews/机器学习-big-box-retail/
- 亚马逊如何利用人工智能优化交付—https://feed visor . com/resources/Amazon-shipping-FBA/how-Amazon-Leverages-Artificial-Intelligence-to-Optimize-Delivery/
- 亚马逊如何使用人工智能来更好地理解客户搜索查询—https://analyticsindiamag . com/how-Amazon-Is-use-ai-Better-Understand-Customer-Search-Queries/
- 应用数字技术推动能源创新—https://corporate . Exxon Mobil . com/Energy-and-innovation/Digital-technologies
- 提取埃克森美孚人工智能的命脉—https://www . IBM . com/blogs/journey-to-ai/2019/09/extracting-the-havine-of-ai-at-Exxon Mobil/
- 石油和天然气公司转向人工智能以削减成本—https://www . wsj . com/articles/oil-and-Gas-Companies-Turn-to-ai-to-Cut-Costs-11571018460
- 苹果几乎在所有事情上都使用机器学习,隐私优先的方法实际上更好—https://9 to 5 MAC . com/2020/08/06/apple-using-machine-learning/
- 这就是为什么苹果认为自己是人工智能的领导者——也是为什么它说批评者完全错了——https://ars technica . com/gadgets/2020/08/Apple-explains-how-it-uses-macos-learning-cross-IOs and-soon-MAC OS/
- 人工智能、医疗保险和数据协调:采访 Shiv Misra,CVS Health—https://www . Forbes . com/sites/cognitive world/2020/10/24/ai-Health-Insurance-And-Data-Harmonization-Interview-With-Shiv-Misra-CVS-Health/?sh=19986c7526d3
- CVS Health exec:零售巨头希望创造类似网飞的医疗保健体验—https://www . fierce Health care . com/tech/CVS-Health-s-digital-executive-we-want-to-create-a-Health-experience-as-easy-use—和
- Azure 和 Databricks 如何为 CVS Health 的客户和患者提供个性化体验—https://data bricks . com/session _ na20/how-Azure-and-data bricks-Enabled-a-Personalized-Experience-for-Customers-and-Patients-at-CVS-Health
- 在大流行和混乱的时代,CVS Health 会成为医疗保健的网飞吗?—https://www . aidata analytics . network/data-monetization/articles/is-CVS-health-being-of-care-in-age-of-pandemics-and-disruption
- 普华永道全球人工智能研究:利用人工智能革命—https://www . PwC . com/GX/en/issues/data-and-analytics/publications/Artificial-Intelligence-Study . html
还有一件事…
如果你想在学习之旅中走得更远,我为你准备了一份令人惊叹的清单,其中包含 60 多门关于人工智能、机器学习、深度学习和数据科学的培训课程,你现在就可以免费参加:
- 什么是预测分析,你今天如何使用它?
- 今天学习 AI、ML、数据科学的最佳免费课程。
- 60 多门课程,有评分,有总结(当然是 AI 做的)。
- 是不是我们所知道的作品的终结?世界经济论坛《2020 年的就业前景》报告简析
如果你想继续发现新的资源并了解人工智能,在我的电子书(下方的链接)中,我正在分享关于人工智能、机器学习、深度学习、数据科学、商业智能、分析和其他方面的最佳文章、网站和免费在线培训课程,以帮助你开始学习和发展职业生涯。
学习 AI 在线:200 多个资源在线开始学习 AI
此外,我刚刚在亚马逊上发布了其他有趣的电子书,我相信其中一些可能会让你感兴趣……让我们保持联系,关注我,让我们一起做吧。
- 人工智能、机器人技术和编码(给父母):模拟父母和数字孩子的实用指南
- 终结者悖论:神经科学如何帮助我们理解移情和对人工智能的恐惧
- 人工智能从 A 到 Z:揭秘 AI 的本质概念
- A . I . 2020 年:写关于人工智能的一年
订阅我的每周时事通讯,保持更新
如果你对人工智能、机器学习、数据科学和自动驾驶汽车的话题感兴趣,以及这些创新将如何扰乱世界各地的每一个企业,这份时事通讯肯定会让你保持更新。
点击下面的链接订阅人工智能新闻!
https://medium.com/tech-cult-heartbeat/newsletters/ai-news
人工智能是如何成为现实的
原文:https://towardsdatascience.com/how-artificial-intelligence-got-real-84e2c1dc437?source=collection_archive---------23-----------------------
很长一段时间以来,人工智能是一种思想实验——一种科幻比喻。感觉就像一眨眼的功夫,它现在在我们的日常生活中无处不在。我们是怎么到这里的?
一个很好的起点是的 Mike Ferguson 关于人工通用智能的新系列,他耐心地带领我们了解几十年来哲学、神经科学和相邻学科对人类创造 AGI 的潜力的理论。(当你完成介绍后,你已经可以继续第二部分和第三部分了。)
还有心情阅读一些高水*的基础读物吗?跟随 Mike 的帖子,听听 Gabriel de Longeaux 对信息论的介绍,这是他专门为数据科学家量身定制的。
照片由 Susan Q Yin 在 Unsplash 拍摄
如果你被人工智能更实际、更现实的方面所吸引,你不会想错过阿曼达·林登对塑造人工智能产品的设计过程的清晰观察。我们经常(太经常?)将人工智能视为一个以开发者为中心的领域,但阿曼达认为,人们是通过设计来体验它的好处和力量的。
与此同时,凯西·科兹尔科夫提醒我们没有一个人工智能的回报是无风险的——尤其是当你认为你已经抓住了它,并且你创造的系统已经好得不能再好了。卡西警告说:“基于数学和数据的解决方案最危险的一点是,非专家过于相信它们。不要成为那种在复杂的任务上依赖完美的坐以待毙的人。”
非常不同的挑战在最*的 TDS 播客节目中浮出水面,主持人 Jeremie Harris 与嘉宾李岩讨论了在慈善领域使用人工智能的局限性。作为非营利组织 Techies Without Borders 的联合创始人,她亲身经历了在边缘化社区和资源匮乏地区实现人工智能承诺的困难。
数据清理是人工智能可能在不久的将来让数据分析师的生活变得更加轻松的另一个领域,但我们仍然没有完全实现。与此同时, Randy Au 坚持认为,目前从事这项工作的数据科学家不要再把它当作无聊的杂务,而是把它当作“在进行全面数据分析的道路上的一系列可重用数据转换”
正如你们现在所知道的,每周在 TDS 上,我们的贡献者涵盖了令人眼花缭乱的主题,过去一周的帖子远远超出了人工智能,包括几个实践指南和资源。不确定从哪里开始?怎么样……
- TDS 编辑 Caitlin Kindig 关于数据科学家创造性使用维基百科无尽财富的帖子集。
- Nesrine Sfar 的关于解决自然语言处理中歧义的教程。
- Parul Pandey 的有用的一步一步的指导,直接用熊猫创造剧情。
- 我们自己的,最*发布的初学者指南——每日有用的提示和推荐读物,通过电子邮件发送。
感谢您本周加入我们,分享我们贡献者的工作,并推动我们发表我们能找到的最好的数据科学文章。你的支持对我们来说太重要了。
直到下一个变量,
TDS 编辑器
我们策划主题的最新内容:
入门指南
- 统计中的抽样技术作者 Chetna Khanna
- 《熊猫. read_csv()》并没有看上去那么简单
- 你的基础 SQL 指南,同时学习以太坊作者 Andrew Hong
实践教程
- 多类 Logistic 回归从无到有作者杨索菲亚
- 使用 Spotipy 观察 80/90 年代音乐和现代嘻哈音乐的差异
- 利用地理位置数据进行机器学习:基本技术作者 Ketan Doshi
深潜
- 计量经济学的因果机器学习:因果森林作者 Haaya Naushan
- 前往神经元中心的旅程作者哈维尔·艾达米
- 深度学习图片说明:最先进的架构作者 Ketan Doshi
思想和理论
- 机器如何规划?概述?由石田舒
- 复杂的自卑作者杰克·阿特金森
- Mathias Gruber从变压器模型中解释语义文本相似度
人工智能如何不分白天黑夜地学习
原文:https://towardsdatascience.com/how-artificial-intelligence-learns-regardless-of-day-or-night-e9badcc1b649?source=collection_archive---------35-----------------------
领域适应的解释
附身摄影在 Unsplash 上拍照
你有没有想过,当你只在明亮的白天见过某样东西时,你怎么能在晚上认出它?当有大量的雾或蒸汽存在时,我们如何看到和识别事物?当然,其中一些是上下文相关的,但我们的大脑也知道如何适应不断变化的条件。当我们需要相机同样智能时,挑战就来了。
这就是人工智能之神给我们领域适配的地方。它做到了它所说的:它帮助理解一个域(白天)在另一个域(夜晚)的数据。
让我们把自己的电脑当成一个透过摄像头看的孩子。但这个孩子只在明亮的日光下见过世面。所以现在它能识别一天中所有的玩具。但在一个晴朗的夜晚,它希望惹恼父母,玩而不是睡觉。他有生以来第一次在黑暗中看到自己的玩具。这个孩子如何找到他最喜欢的长颈鹿呢?这是我将教孩子适应他的领域的地方…
首先,我教孩子识别他所看到的一切事物中对背景不变的特征。所以现在它知道长颈鹿有长长的脖子和遍布全身的深褐色斑点。所以在月光下,这个孩子实际上可以找到它的长颈鹿。
“玩具长颈鹿”由 M.P.N .德克萨斯人授权
但是现在它喜欢晚上吃糖果(我知道…淘气的孩子)。它找到了装糖果的盒子,想要找到星形的糖果。然后,他想起了我教他的话:当试图挑选一颗星形糖果时,颜色是没有用的。所以他开始数糖果的角和边,以了解它的形状。从此以后,这个小孩和他最喜欢的糖果快乐地生活在一起!
抛开类比,我的意思是说,我有一段代码,可以在白天准确的检测到物体。但我也希望这段代码能适用于夜晚的图像。现在我有许多这些物体在夜间的图像,但它们没有被标记。这就是领域自适应的用武之地,它有助于使用白天的知识来应用于夜晚的数据库。这有助于我们训练代码,而不必再次经历给每个图像加标签的繁琐过程。
为了完全利用上帝给我们的东西,如果该算法在不同的域中获得相似的标记数据,它可以潜在地用于标记这个世界上存在的所有类型的数据。这对于图像分类来说很棒,虽然对于物体检测来说很棘手,但是这里我们已经详细解释过了。
另一个有趣的应用是在医学领域,分割图像并从中发现肿瘤。这个特定的子领域被称为跨模态无监督域适应。当我们有一个肺部肿瘤的标记数据库时,它会有所帮助,但我们希望使用这些结果来分割心脏图像并检查肿瘤。这尤其有用,因为标记医学图像是一项非常繁琐、耗时且昂贵的任务,只能由专业人员来完成。
领域适配也可以用在很多领域,即使不涉及相机。请继续关注我们的频道,了解更多信息!
成为 介质会员 解锁并阅读介质上的许多其他故事。关注我们的Medium阅读更多此类博文。
AutoML 如何推动数据科学工作的未来
原文:https://towardsdatascience.com/how-automl-could-drive-the-future-of-data-science-jobs-173c5b48dc5c?source=collection_archive---------19-----------------------
它会授权还是禁止?
照片由德鲁·比默在 Unsplash 上拍摄
*年来,AutoML 解决方案越来越受欢迎。有许多公司提供广泛的解决方案。这些解决方案侧重于数据科学家经常遇到的常见业务问题和任务。
以下是顶级 AutoML 解决方案列表。这份榜单是根据科技行业分析师 AIMultiple 的数据得出的。
DataRobot 、 Dataiku 、 H2O 、compel on、enhancer、 Akkio 、 TPOT 、 dotData 、 BigML 、 Prevision.io 、 TIMi Suite 、 B2Metric
技术巨头们也在利用他们现有的基础设施来推动 AutoML 解决方案。他们拥有构建、部署和扩展 ML 解决方案的产品。大多数云*台都有专注于图像识别和文本分析的专用产品。他们还提供在结构化数据上构建高性能 ML 模型的产品。这些解决方案在特性选择、模型选择和模型调整方面都非常出色。
根据 ResearchAndMarkets 的数据,汽车市场在 2019 年创造了 2.696 亿美元的收入。预计到 2030 年将达到 15 亿美元。它还表明,基于云的 AutoML 解决方案是首选。因为它们提供了定制解决方案的可伸缩性和灵活性。
汽车的好处
数据科学家执行的许多任务都是重复且耗时的。这限制了数据科学团队解决更多业务问题的能力。大多数数据科学团队最终只关注业务关键型问题。以下是 AutoML 如何增强数据科学团队的能力
节省时间
- AutoML 将实现容易出现人为错误的重复性和手动任务的自动化
- AutoML 将把数据清理、探索和特征工程所需的工作从几周减少到几天
- AutoML 将使型号选择和性能监控变得容易
- 使用 AutoML 可以完全自动化超参数调整
公*竞争环境
- 每个人都可以使用高性能的预培训 ML 模型
- AutoML 将使许多中小型企业能够实现机器学习
- 将使在制定业务决策时使用非结构化数据变得更加容易
- 将增加非技术用户参与解决面向数据的问题
AutoML 对数据科学项目的影响
由 Jonathan Cosens 摄影在 Unsplash 上拍摄
AutoML 将在数据科学项目的生命周期中产生连锁反应。它将改变数据科学工作的前景。以下是数据科学项目的典型阶段。让我们看看 AutoML 对这些阶段的影响。
商业理解
任何数据科学项目的第一步都是很好地理解问题。总的来说,AutoML 在这方面的影响最小。AutoML 能做的最好的事情就是自动化一些流行的和标准的数据科学项目。一个例子是银行业的欺诈预测。不同客户的欺诈模式可能不会有太大变化。将解决方案模板化并推向市场将会很容易。这些预先构建的解决方案将业务知识融入其中。
AutoML 会自动处理所有的业务问题吗?答案肯定是否定的!有许多场景可以自动化,甚至可以复制。但是,对业务问题的深入理解是强制性的。
数据收集和清理
AutoML 产品肯定可以访问*台中的数据。在 AutoML 产品中加入新数据会容易得多。例如,在 GCP,很容易将数据作为*面文件或使用 BigQueries 导入 AutoML 表。在许多问题中,使用外部数据集通常会产生更好的结果。为了识别相关的外部数据,数据科学家的专业知识是必须的。
导入所需的数据集后,下一步是清理数据。这一步通常很繁琐,需要数据科学家的大量关注。数据集通常不够干净,不适合 ML 模型使用。AutoML 解决方案在这里会非常方便。我们可以更快地清理数据。
AutoML 将能够加速数据收集和清理。将有可能把所需的努力从几周缩短到几天。但是,数据科学家的领域知识将是获得最佳解决方案的关键。
特征工程
这是一个迭代过程,很容易成为数据科学项目中最耗时的阶段。有了 AutoML,实现一些特征工程任务将变得容易。像标准化、一键编码、宁滨、格式化等任务都可以通过点击一个按钮来完成。
特征工程可以完全自动化吗?简而言之,答案是否定的。在特征工程中执行的许多任务将变得可访问。但是,只有数据科学团队可以将业务洞察力融入到功能中。此外,为了获得最佳结果,通常需要寻找未知数。利用已知的特性和转换只会有一定的帮助。为了实现高性能,有人需要研究未知。
模型构建/洞察
数据科学项目分为两大类。一个涉及模型构建,另一个侧重于见解或建议。AutoML 在涉及模型构建的项目中非常有用。AutoML 使得模型选择、调整和跟踪易于实现。从而为数据科学团队创造时间来解决更多问题。
涉及见解提取的项目需要业务知识。有了 AutoML,很多焦点将转移到这个领域。使数据科学团队能够承担更多洞察驱动的任务。
部署
在许多数据科学项目中,部署从来都不容易。将模型从一个环境转移到另一个环境会有挑战。环境之间的任何微小差异,比如软件版本,都可能导致问题。此外,生产环境通常受到限制。使得难以做出改变或跟踪 m1 模型的性能。
AutoML 撼动了这个领域。现在可以在几分钟内部署模型。
对数据科学家来说意味着什么?
迪米特·多诺夫斯基在 Unsplash 上拍摄的照片
在接下来的几年里,AutoML 解决方案将会广泛应用。各种规模的公司都将获得相同的尖端解决方案。要超越其他公司,就必须专注于 AutoML 无法解决的问题。这将为数据科学家带来大量新的机会。
数据科学团队的角色和职责将会发生变化。重点将转向需要人类专业知识和领域知识的更复杂的问题。
这里有一些需要商业知识和地面现实信息的问题,
- 洞察驱动的问题,如确定客户流失的原因,需要领域知识。可能有很多内部和外部因素导致客户流失。只有更好地了解数据环境和领域,才能产生更好的结果。
- 衡量和跟踪公司提供的各种功能/产品的性能。定义和构建指标需要业务知识。
- 部署的模型需要持续的监控。随着时间的推移,事情会发生变化,这会影响模型的性能。这将需要数据科学家来修复它们。
- 业务涉众没有明确定义的问题。首先要清楚地了解问题,这需要做基础工作。
AutoML 很可能会为数据科学家提供大量新的解决机会。AutoML 不应被视为淘汰数据科学家的工具。是的,AutoML 将完成许多目前由数据科学家完成的任务。它也可以更好地完成这些任务。但是,这将为数据科学团队解决更好的挑战铺*道路。
最后的话
数据科学家的重点将更多地转向更好地理解这个问题。AutoML 将提高数据科学团队的生产力,并将授权而不是禁止。
保持联系
- 如果你喜欢这篇文章,并对类似的文章感兴趣,在 Medium 上关注我
- 我在我的 YouTube 频道上教授和谈论各种数据科学主题。在这里订阅我的频道。
- 在此注册我的电子邮件列表,获取更多数据科学技巧,并与我的工作保持联系
AutoML 如何帮助创建复合人工智能?
原文:https://towardsdatascience.com/how-automl-helps-to-create-composite-ai-f09e05287563?source=collection_archive---------12-----------------------
思想和理论
AutoML 的主要趋势和挑战,复合人工智能实现背后的思想,以及开源框架 FEDOT。
代表复合人工智能模型的管道(作者的图片)
如今,自动机器学习(AutoML)、复合人工智能(AI)和结构学习是非常流行和广泛讨论的概念。自动化、多模态和可控性的思想为改进现有的数据驱动建模方法提供了一个有希望的方向。在本文中,我们将讨论 AutoML 的主要趋势和挑战,复合人工智能实现背后的主要思想,以及复合管道结构学习的开源框架— FEDOT 继承了这些思想。
一点理论和一些关于 AutoML 框架的话
通常,数据科学家必须执行许多步骤来使用机器学习(ML)技术获得现实世界问题的解决方案:数据清理和数据集准备,选择最具信息性的特征,转换特征空间,选择 ML 模型并调整其超参数。这个序列通常被表示为 ML 流水线。
不同类型的 ML 管道(图片作者)
然而,即使是简单的线性管道(上图中的 A)的手动处理以及其结构和参数的选择也需要数据科学家花费数天甚至数周的时间。对于复杂的任务,管道结构可能会变得更加复杂——如上图中的情况 B 和 C 所示。案例 B 显示了采用集成方法(叠加)组合多个模型的分支管道;案例 C 显示了连接初始数据集不同部分的不同预处理方法和模型的分支管道。
实际上,使用多个 ML 模型的管道可以被视为整个复合模型,因为从计算的角度来看,它们之间没有太多的差异。因此,( B)和(с)中的管道结构实际上变成了复合的,因为它们结合了不同的 ML 算法。例如,可以将 NLP 模型和卷积网络相结合,以使用多模态数据来获得预测。可以使用 AutoML 方法和技术来处理复合模型和 ML 管道。
自动化流水线创建主要是一个组合优化问题,旨在寻找可能构建模块的最佳组合。为了方便起见,流水线可以描述为有向无环图(DAG ),它可以很容易地转换成计算图。优化的效率由目标函数决定,该目标函数允许估计最终管线的质量、复杂性、鲁棒性和其他属性。
解决优化任务的最直接的方法是随机搜索适当的块组合。但是更好的选择是元启发式优化算法:群体和进化(遗传)算法。但在进化算法的情况下,人们应该记住,它们应该有专门设计的交叉、变异和选择算子。这种特殊操作符对于处理由 DAG 描述的个体是重要的,它们还提供了考虑多个目标函数的可能性,并且包括创建稳定流水线和避免过度复制的附加过程。
交叉算子可以使用子树交叉方案来实现。在这种情况下,选择两个亲代个体并交换他们图形的随机部分。但这不是唯一可能的实现方式,可能有更复杂的语义变体(例如,单点交叉)。变异算子的实现可以包括图的随机节点中模型(或计算块)的随机改变、随机节点的移除或子树的随机添加。
管道的遗传操作符的不同实现(作者的图片,t his 和其他插图可在我们在 Procedia Computer Science 的论文中找到。)
在理想的情况下,AutoML 应该给我们一个机会,从构建 ML 解决方案的整个过程中排除一个人。然而,很难完全实现这一点,因为大多数 AutoML 框架支持独立步骤的自动化(超参数调优、特性选择等)。)用于固定管道,并且仅用于特定类型的数据。下表列出了几种最先进的管道 AutoML 框架及其特性。当然,这种比较并不完全——它是基于对公开文档和示例的分析。然而,AutoML 的状态可能会迅速改变。
最先进的 AutoML 框架的主要特性(图片由作者提供)
可以看出,尽管有各种各样的完善的解决方案,但是现有的解决方案都是针对相对狭窄的任务或使用方式。例如,TPOT 框架仅为表格数据自动创建分类(包括多类分类)和回归模型,获得的管道的结构通常由两个级别之一组成。自动增长非常灵活,但它主要基于预定义的管道。还有许多特定于任务的 AutoML 框架——例如,AutoTS 框架只能用于时间序列预测。
然而,可以看出,缺乏用于自动建模的更复杂和多用途的方法,该方法可以适用于不同的任务和数据类型,而无需对核心算法进行复杂的修改。这个问题把我们带到了下一个问题——情况有可能改善吗?
缺少什么,我们想提出什么
典型的 AutoML 应用场景如下:AutoML 框架使用可用的数据集来优化流水线的结构和其中包含的块的超参数。然而,在实践中,适用于基准测试问题的实现在“真实世界”的数据集上并不那么好。因此,越来越多的新的 AutoML 解决方案出现,如 H2O,AutoGluon,LAMA,NNI,等等。它们在功能上有所不同(例如,工业解决方案具有先进的基础设施功能),但通常不适合大范围的建模任务。虽然大多数框架允许解决分类和回归问题,但它们通常不支持时间序列预测。
常见汽车案例(图片作者
ML 管道可以包含不同任务的模型。例如,基于回归生成一个新的有用的特征,然后在分类中使用它是很有用的。目前,AutoML 框架不允许以方便的方式解决这样的任务。然而,对于 ML 工程师来说,面对多模态和异构的数据并不罕见,这些数据必须被集成以进行进一步的建模。
直到最*,还没有具备这一系列特性的现成工具。在 ITMO 大学的自然系统模拟实验室,我们研究和开发汽车领域的先进解决方案。因此,我们决定开发自己的解决方案,避免上述问题。我们称之为 FEDOT。它是一个开源框架,可以自动创建和优化 ML 管道及其元素。FEDOT 使得以紧凑和高效的方式解决各种数据驱动的建模问题成为可能。
多模态 AutoML case ( 图片作者)
下面是一个基于 FEDOT 的分类问题解决方案的示例(用 Python 编写):
**# new instance to be used as AutoML tool with time limit equal to 10 minutes****auto_model = Fedot(problem='classification', learning_time=10)****#run of the AutoML-based model generation****pipeline = auto_model.fit(features=train_data_path, target='target')****prediction = auto_model.predict(features=test_data_path)****auto_metrics = auto_model.get_metrics()**
该框架的主要焦点是管理管道的计算块之间的交互。Tho 流水线设计从结构学习阶段开始——FEDOT 结合几个 ML 模型来实现更好的目标函数值。在该框架中,我们以有向图的形式描述复合模型,该有向图定义了预处理和建模块之间的关系。节点用 ML 模型表示,数据预处理和转换操作也用 ML 模型表示。该图的结构以及每个节点的参数都可以优化。
适用于特定任务的结构是自动设计的。为此,我们使用了进化优化算法 GPComp,它创建了几个 ML 管道的群体,并通过应用进化方法(变异和交叉)来搜索最佳解决方案。为了避免不希望的过度复杂的管道结构,我们应用了正则化过程和多目标方法。
以下是阐释这一概念的框架的预告片:
FEDOT 简介(视频作者)
FEDOT 是用 Python 实现的,可以在 BSD-3 开放许可证下获得。有几个关键特征:
- FEDOT 架构高度灵活;该框架可用于自动创建不同任务(分类、回归、预测)、数据类型(表格、时间序列、文本、图像)和模型的 ML 解决方案;
- FEDOT 支持流行的 ML 库(sci-kit-learn、Keras、statsmodels 等。),但也允许在需要时集成其他工具;
- 管道优化算法不受数据类型或任务的限制。然而,特定任务类或数据类型(时间序列预测、NLP、表格数据等)的专用模板。)都可以用;
- 该框架不限于机器学习。特定于域的模型也可以被构建到流水线中(例如,ODE 或 PDE 中的模型);
- 除了已经支持的方法之外,超参数调整的定制方法也可以集成到 FEDOT 中;
- FEDOT 支持任何时间的操作模式(在任何时间点,可以停止算法并获得结果);
- 最终管道可以以 JSON 格式导出,以实现实验的可重复性。
因此,与其他框架相比,FEDOT 不局限于一类问题,而是声称具有通用性和可扩展性。它允许您使用不同性质的输入数据来构建模型。此外, this news 中描述了 FEDOT 申请黑客马拉松比赛的前景。
汽车前景
在 AutoML 解决方案中(除了上面列出的工具之外),还有 EvalML、TransmogrifAI、Lale 和许多其他解决方案。都是大型企业 IT 公司开发的。在某些情况下,框架的主要焦点是技术特性,比如对可伸缩性和分布式计算的支持,或者与 Kubernetes 和 MLOps 工具的集成。在其他情况下,它是关于概念问题,如新的优化算法或它们的可解释性。然而,有几个领域和前景的发展,汽车是较少涵盖的社区。
灵活控制搜索复杂度
根据要求和允许的预算,ML 工程师可以选择不同的模型:具有优化超参数的单一梯度增强模型、深度神经网络或结合几种建模方法的非线性管道。在这两种情况下,他将被迫发现可用的 AutoML 框架的可能性,并进行实验研究,以找出什么工作得更好或更差。但是,具有连续搜索复杂度的所谓“开关”将是非常方便的,利用该开关,可以将搜索空间的维度从简单的解决方案调整到复杂但有效的流水线。
模型工厂
除了质量度量的允许值之外,在 ML 任务中还可能出现其他的决策标准。例如,可解释性、在生产环境中维护所需的计算资源和内存量、预测的超前性等等。这将是一个有用的界面,用于指定可以考虑的几个目标。在某些情况下,不可能同时最小化所有标准,因为存在决策的帕累托前沿。例如,随着神经网络体系结构的复杂性增加,精确度增加,但也需要更多的计算资源。
我们的团队进行了实验研究,我们试图在 FEDOT 内应用进化多目标优化算法来优化机器学习管道。我们不仅选择精度,还选择管线的复杂性(节点数量和计算图深度)作为优化标准。在实验过程中,我们发现将 Pareto-front 解决方案整合到搜索过程中增加了群体的多样性,并且还允许我们找到具有更高准确性的解决方案。
DataRobot 公司的塞维多夫·古斯在他的报告《自动化机器学习》中表达了 AutoML 模型工厂的想法。他用 OOP 模式工厂做了一个类比,在 OOP 模式工厂中,AutoML 可以根据给定的条件向用户提供不同的解决方案:数据集的类型、预测间隔、模型的生命周期等。
可以为不同的数据集导出模型:随机样本、时间范围内的数据。还可以基于当前数据切片获得“短期”模型。
AutoML 作为模型工厂(图片作者
总的来说,自动机器学习是一个很有前途的领域。如果你在数据科学领域工作,关注汽车世界的新闻是很有价值的。我们选择了几个来源进行深入研究:
- FEDOT 仓库
- 框架 web 接口的存储库—FEDOT。网
- 包含 AutoML 教程的 YouTube 频道
- 一套开源的 AutoML 工具
- 一套针对 AutoML 的性能指标评测
作者:尼古拉·尼基丁,安娜·卡柳那亚,帕维尔·维楚查宁
百度 Apollo 如何为自动驾驶汽车构建高清地图
原文:https://towardsdatascience.com/how-baidu-apollo-builds-hd-high-definition-maps-for-autonomous-vehicles-167af3a3fea3?source=collection_archive---------17-----------------------
5 步构建流程,高清地图元素,OpenDRIVE 格式
高清地图(HD map)是自动驾驶中使用的高度精确的地图。高清地图在包括感知、模拟、定位和路径规划在内的自动驾驶模块中发挥着重要作用。作为地图制作者,百度 Apollo 是中国领先的自动驾驶*台。在这篇博客中,我们将介绍百度 Apollo 如何为自动驾驶构建高清地图。
高清地图1
- 百度 Apollo 是什么?
百度 Apollo 是一个自动驾驶的开放*台。代码可以在 github 上公开获得。最初在 2017 年公布,从 v1.0,v1.5,v2.0,…,一直迭代到今天的 v6.0。作为一个完整的自动驾驶*台,它包含以下模块:
- 精准感知 :利用激光雷达、雷达、摄像头探测障碍物和红绿灯。
- 模拟 :用真实世界交通和自动驾驶数据虚拟驾驶数百万公里。
- 高清地图:将传感器和深度学习应用于地图制作。
- 定位:利用包括 GPS、IMU、高清地图和各种传感器输入在内的全面解决方案,实现厘米级精度。
- 规划:适应实时交通状况,产生既安全又舒适的精确轨迹。
- 智能控制:处理不同路况、速度、车型和 canbus 协议,控制精度约 10 cm。
- 阿波罗数据集 :包含时间戳激光雷达扫描、相机图像和后处理 GPS 轨迹。
2。百度 Apollo 如何搭建高清地图?
2.1 构建流程
阿波罗通过 5 个步骤构建高清地图。
阿波罗高清地图的构建过程(图片由作者提供)
数据来源:百度 Apollo 有一支勘测车队行驶在道路上。调查车使用不同的传感器,包括激光雷达、GPS、IMU、天线和相机来收集数据。阿波罗定义了一个硬件框架,将这些传感器集成到一个单一的自治系统中。调查车以正常速度(~60 km/h)行驶在道路上。
百度阿波罗 Survery 汽车(图片来源[2])
数据处理:采集的数据包括点云数据和图像数据。Apollo 对收集到的数据进行整理、分类、清洗,得到一个没有语义信息和标注的初始地图模板。
物体检测 : Apollo 将深度学习和计算机视觉技术应用于点云和图像,例如,点云分割和分类,以及交通标志/灯、车道线/标志和电线杆的物体检测。
手动验证:该步骤是手动纠正之前自动过程中出现的错误标注。例如,车道标志、车道边界、交通灯/标志可能在之前的步骤中被错误地检测到。此外,一些逻辑关系需要手动识别。例如,在交叉路口,可能有多个交通灯。每条车道都需要与正确的交通灯手动关联。
地图制作:高清地图准备在这一步发布。除了高清地图,Apollo 还发布了相应的俯视图本地化地图、3D 点云地图、路径规划地图、仿真地图。
由于施工、交通事故等原因,道路状况每天都在发生变化。因此,地图发布后需要经常更新。Apollo 使用众包和云技术来实现它。首先,Apollo 按照上面的 5 个步骤,由测量船队建立一个所谓的“底图”。然后,Apollo 向公众发布其数据源工具,让公众可以参与高清地图的制作任务。第三个,关于道路的更新通过智能手机、普通汽车中的车载智能设备、智能互联汽车,甚至智能自主汽车,传回云端的阿波罗地图制作*台。
阿波罗地图中的 2.2 元素
道路要素:道路边界、车道左右边界、车道限速、车道类型、车道拓扑、车道线型、车道方向信息、车道转向类型、车道长度
交叉口要素:交叉口边界、交叉口虚拟车道
交通信号要素:交通灯、其他道路标志
逻辑关系元素:映射逻辑关系
其他元素:人行横道、禁止停车区、停止线、路面箭头、路面文字、围栏、路灯、龙门架、建筑物、减速带
2.3 阿波罗 OpenDRIVE 地图格式
OpenDRIVE 代表车辆环境的开放式动态道路信息。这是一种为描述道路网络提供通用语法的格式,文件扩展名为 xodr 或 xodrz。它将逻辑道路描述标准化,以促进开发和验证 adAS 和 AD 功能的不同驾驶模拟器之间的数据交换。
百度 Apollo 用的是 OpenDRIVE 格式的修改版。区别如下。
- Apollo OpenDRIVE 使用纬度经度点的简单列表来定义道路边界,而在标准 OpenDRIVE 中,道路边界是使用五种不同类型的函数通过参考线和偏差来定义的。
- 阿波罗 OpenDRIVE 扩展了元素,包括禁止停车区、人行横道和减速区。
- Apollo OpenDRIVE 增加了车道中心线到道路边界的距离,以及车道和红绿灯之间的逻辑关系。
- 车道:标准的 OpenDRIVE 只允许指定车道的宽度。然而,Apollo OpenDRIVE 需要点来描述车道边界。此外,Apollo OpenDRIVE 需要每个车道的中心点和道路的边界。
- 交叉点:Apollo OpenDRIVE 使用交叉点的简化版本,忽略了交叉点组、交叉点优先级和交叉点控制器等概念。
- 对象和信号:Apollo OpenDRIVE 使用数量减少的属性,并且只支持有限数量的对象类型。
2.4 坐标系
百度 Apollo 使用两种坐标系:通用横轴墨卡托(UTM)系统和世界大地测量系统(WGS84)。
UTM 是一种地图投影系统,用于指定地球表面位置的坐标。它把地球分成 60 个区域,每个区域的宽度为 6 经度。要引用一个位置,您需要一个 x 和 y 坐标以及它们所在的区域。
WGS 是用于制图、大地测量和卫星导航(包括 GPS)的标准。WGS84 的坐标原点应该位于地球的质心。它基于描述地球大小、形状、重力和地磁场的一组一致的常数和模型参数。
参考文献:
【1】uda city 免费课程:自动驾驶汽车基础:特色阿波罗
【2】百度阿波罗免费课程
[3]https://apollo.auto/developer.html
[4] 硕士论文:自动驾驶中的高清地图
[5] 将自动驾驶商业化
贝叶斯统计如何说服我多睡觉
原文:https://towardsdatascience.com/how-bayesian-statistics-convinced-me-to-sleep-more-f75957781f8b?source=collection_archive---------14-----------------------
照片由 Cris Saur 在 Unsplash 上拍摄
Python 中的贝叶斯线性回归来量化我的睡眠时间
这些年来,我听到我的许多朋友评论——你曾经睡觉吗?嗯,我不会怪他们。通常,我是第一个起床的人,即使是在深夜,尽管随着时间的推移,这种情况已经发生了变化。在我 20 岁出头的时候,我通常睡 5 到 5.5 个小时(我们会看一场深夜电影,凌晨 2 点到家,8 点到达办公室,然后开始工作),但现在是 6 到 6.5 个小时。当然,有时候我会在床上躺更长时间,因为随着年龄的增长,精力会逐渐消失。用钱德勒·宾的话说,“我想坐在舒适的椅子上,在合理的时间上床睡觉。”
资料来源:Giphy.com
在 2020 年,我试图跟踪我生活中的一些事情,如我房间里一天中最安静的时间,应用程序显示的空气质量指数,每天的耗电量等。我追踪的一个变量是我睡了多少小时以及之后我感觉有多累。动力来自 Kaggle 研究,我补充了我的观察。我并不勤奋,但是每当我记起的时候,我都会把我的数据添加到现有的研究中。
本质上有两个感兴趣的变量:
- 我睡觉的小时数(小时)
- 醒来后我感觉有多累(满分 5 分,1 分最不累,5 分最累)
背景
虽然我已经毕业,每天睡 6 到 6.5 个小时,但我的能量水*每天都在变化;有几天精力充沛,但其他时间有点沮丧。鉴于这种状态,我有两个问题要问自己:
- 我应该增加睡眠时间吗?
- 我是否正确地估计了我的能量水*,即我过去睡 5 个小时感觉很好,现在当我睡 6 个小时时,我的估计偏向于较低的疲劳度?
假设:6.5 小时的睡眠对我来说足够了,因为我估计我的疲劳程度在大多数时候是 2 级。
该调查了!洛斯盖兹!
免责声明:我不认为我理解贝叶斯分析的每一个方面,但我想通过这篇文章将我的想法具体化,因此,我将尽可能地避开数学(只有方程)和代码,并尝试用一种我可能受益的语言来解释它。
我没有在文章中包含代码,但是数据和其他文件可以在 GitHub repo 上找到。
假设:请注意,所有其他外部因素,如锻炼、含咖啡因的饮料等都被假设为无效。这项研究的假设是睡眠时间和疲劳程度之间有直接联系。
为贝叶斯过程建立直觉
首先,我们为贝叶斯分析建立一个直觉。我相信你可能曾经被卷入频繁主义和贝叶斯主义的争论中。有很多文献可以解释这两种统计推断方法之间的区别。
简而言之, 频数主义 是从数据中学习的常用方法,用 p 值来衡量变量的显著性。频率主义方法是关于点估计的。如果我的线性方程是:
y 是响应变量,x₁、x₂是自变量。β₁和β₂是需要估计的系数。β₀是截距项;如果 x₁改变 1 个单位,那么 y 将受到β₁单位的影响,例如,如果 x₁是 1,β₁是 2,那么 y 将受到 2 个单位的影响。常见的线性材料。这里需要注意的是,回归方程基于最小化误差*方和(最佳拟合线)来估计各种β的值,这最好地解释了手头的数据,并且估计值是奇点,即β₀、β₁和β₂各有一个值,依此类推。β的估计值被称为β的最大似然估计值,因为它是给定输入 x 和输出 y 时最有可能的值。
贝叶斯 与频率主义方法的不同之处在于,除了数据之外,它还考虑了数据的先验知识。这就是这两个群体之间的分歧所在。频繁主义者将数据视为福音,而贝叶斯主义者则认为总有一些我们知道的关于系统的东西,为什么不用它来估计参数。
数据和先验知识一起被用来估计所谓的后验概率,它不是一个单一的值,而是一个分布。贝叶斯方法估计模型参数的后验分布,而不是像 frequentist 方法那样的单一最佳值。
我们为模型参数选择的先验不是单一值,而是分布,它们可以是正态分布、柯西分布、二项式分布、贝塔分布或根据我们的猜测认为合适的任何其他分布。
我希望你知道贝叶斯定理的术语和脚本:
P(A|B)是指给定 B 已经发生的概率。
顺便说一下,托马斯·贝叶斯没有提出上面的方程,是拉普拉斯提出的。Bayes 写了一篇关于他的思想实验的论文“一篇解决机会主义中一个问题的文章”。贝氏去世后,他的朋友理查德·普莱斯发现了这份报纸,在他编辑了几版后,这份报纸在伦敦皇家学会被阅读。
对于贝叶斯推断:
P(β|y,X)是给定输入 X 和输出 y 的模型参数的后验分布。P(y|β,X)是数据的似然性,乘以参数 P(β|X)的先验概率,再除以 P(y|X),P(y | X)被称为归一化常数。
简而言之,我们使用关于模型参数和数据的先验信息来估计后验。
一个例子
让我们用一些简单的例子来建立我们的直觉,看看我们是否能理解我们在上面学到的东西。
让我们掷硬币 20 次,1 是正面,0 是反面。以下是掷硬币的结果:
这个数据*均值是 0.75;换句话说,有 75%的机会是正面即 1,而不是反面即 0
顺便说一下,任何通常只有两个结果 0 或 1 的过程被称为伯努利过程。
从频率主义者的角度来看,硬币似乎是有偏向的,即如果我们再扔一次,那么根据频率主义者的估计,硬币更有可能(75%的情况下)正面朝上,即 1。
尽管如此,大多数硬币是没有偏向的,得到 1 或 0 的概率应该是 50%。根据中心极限定理,如果我们投掷硬币无限次,那么正面和反面的概率都是 0.5。现实生活与定理大相径庭,没有人会把一枚硬币扔无限次;我们必须根据现有的数据做出决定。
这就是贝叶斯方法有用的地方。这给了我们包含先验(我们最初的信念)的自由,这就是我们将对抛硬币数据所做的。如果我们没有关于先验的任何信息,那么我们可以使用完全无信息的均匀分布——在实践中,均匀分布的结果将与频率主义方法相同,因为我们告诉我们的模型每种可能性都是同等可能的。
非贝叶斯=具有统一先验的贝叶斯
不提供信息的先验给出了与频繁主义者方法相同的结果(图片由作者提供)
在上图中,后验结果和频率主义结果一致,峰值在 0.75 左右(就像频率主义方法一样)。先验是一条直线,因为我们假设是均匀分布。
我相信我们可以做得更好。让我们改变我们的先验知识,也许是一个 beta 分布,然后观察结果。
之前改为测试版,我们看到它比 frequentist 做得更好
这似乎更好。我们的先验已经改变,因此后验概率向左移动,它不在 0.5 附*,但它至少与频率主义者的 0.75 不一致。
我们可以通过调整先前发行版的几个参数来进一步改进它,使它变得更加自以为是。
与 frequentist 相比,固执己见的先验使贝叶斯方法的结果模拟了真实世界(图片由作者提供)
这看起来好多了,后验概率已经改变了,因为我们已经改变了先验概率,这也更加符合这样一个事实,即一个没有偏见的硬币会有 50%的机会正面朝上,其余的时间则是反面朝上。
我们现有的关于硬币的知识对结果有重大影响,这是有意义的。这与频率主义者的方法截然相反,在频率主义者的方法中,我们假设我们对硬币一无所知,这 20 个观察结果就是福音。
我并没有要求你改变立场,但上面的例子应该会让你对贝叶斯方法产生一些信念,有了这个信念,让我们继续把它用在睡眠数据上。
实施贝叶斯线性回归
我正在使用的软件包:
- 贝叶斯的 PyMC3
- 用于可视化的 Arviz 和 Matplotlib
贝叶斯回归中的情况是,一旦您为模型参数定义了一个先验,就会估计一个后验,并从该后验中提取样本以生成一个更好、更准确的后验。这是一个高度计算密集型和组合爆炸性的任务。因此,我们需要找到一种方法,通过这种方法,我们可以在合理的时间内找到后路,而不需要使用太多的资源。
让我们从后验分布中进行这种复杂采样的算法称为 MCMC(马尔可夫链蒙特卡罗)。有许多相同的实现,如 Metropolis-Hastings、Hamiltonian、Gibbs 采样。我们将使用大都会黑斯廷斯。
如果我试图在这里解释 MCMC,那就有点矫枉过正了。也许是我,但找到一个后验概率,然后从这个后验概率中取样,以逼*一个更好的后验概率,目前似乎不是一个直观和简单的任务。该算法的一个快速和肮脏的纲要是:
- 估计先后路。随机或从你的前任身上取一个样本。叫它θ₀吧
- 定义一个与步骤 1 中选择的值相*的值。叫它θ₁吧
- 计算比率 r,这是在θ₀和θ₁.评估后的比率
- 如果 r >1,则接受θ₁,将其设为新的θ₀,并找到新的θ₁.如果 r <1 then repeat step 1, 2, and 3 till r > 1
- 重复这些步骤进行特定次数的迭代,以获得后验分布。
说得太多了,让我们开始工作吧!
让我们首先检查数据的轮廓。请按照 Github repo 获取代码。
睡眠和疲劳水*直方图(图片由作者提供)
大多数人睡眠时间在 6 到 8 小时之间。原始数据只有很少数量的 6 小时观测值,大部分的 6 小时都来自我的数据。疲劳水*遵循正常曲线,峰值在 3。
疲劳和睡眠持续时间之间的散点图不能提供太多信息。我想知道什么样的回归线会符合这一点。即使睡了 9 个小时,人们也会感到 5 级疲劳。
作者图片
模型
我们指定截距、斜率和σ的先验。我们的回归方程:
在这种情况下,我将斜率设置为以 2 为中心。
. pm . sample(1000)是触发 MCMC 的地方。这条语句的作用是通过查看数据,估计截距、斜率和产生数据的 sigma。将从后验分布中抽取 1000 个样本,每个样本将为截距、斜率和 sigma 生成一个单独的(1000 个)分布。
作者图片
以上是截距、斜率和 sigma 的轨迹分布。我们将斜率集中在 2,在结果中它并不是很远。
后验分布提供了三个模型参数的更清晰的图像。
作者图片
所有参数的范围都很窄,如果数据点的数量很少,上面曲线的宽度会大得多。
斗牛中的最后一剑
让我们看看贝叶斯模型如何预测我 6.5 小时睡眠的疲劳程度
请记住,贝叶斯模型不给出点估计,而是提供概率分布,所以我们在这里也将得到分布。
预测的*均值将达到 2.70。
作者图片
对于 6.5 小时,我估计我的疲劳水*在 2 到 2.5 之间,但模型显示是 2.71。这意味着我需要多睡一会儿来减轻疲劳。
线性回归
在总结之前,我想运行一个线性回归并估计结果。
在直方图中,我们看到疲劳指数的主导值是 3,我怀疑线性回归会给出类似的结果。
线性回归的结果,不出所料!!
对于 6.5 小时的睡眠,线性回归估计疲劳指数为 3.03,这比贝叶斯得出的结果要高。
这并不是说我讨厌睡觉,而是我不想依赖线性回归,这种回归会把我放在*均疲劳水*的队列中,并且可能会不必要地增加半小时的睡眠时间。
结论
- 有强有力的证据表明,我需要我对 6.5 小时睡眠后的疲劳水*的估计有点低。
贝叶斯统计要求我多睡 6.5 小时来减少疲劳。线性回归做着同样的事情,但是估计我的疲劳值要高得多。我愿意相信贝叶斯统计,毕竟,如果不是拉普拉斯和贝叶斯,你还能相信谁呢?
2.贝叶斯方法结合了先验信息,当我们的数据有限时,这可能是一个可靠的工具。
3.贝叶斯方法看起来很直观——估计你的解决方案是什么,并在收集更多数据时改进这个估计。
这并不意味着贝叶斯是解决所有数据科学问题的最佳方法;这只是其中的一种方法,学习贝叶斯和频率主义的方法比在这些思想流派之间进行战斗更有成效。
我学到了什么?
上面的练习是关于量化你对某事的信念,而不是确定它。这是关于拥抱不确定性,但量化它。这就是为什么你产生一个概率分布,而不是点估计。
趣闻: 顺便说一句,很多贝叶斯派的思想家都把英格玛之谜的解决归功于艾伦·图灵。是的,他的确建立了概率模型,但是波兰数学家帮助了他。早在战争之前,波兰数学家已经用数学方法解决了这个谜,而英国人还在试图用语言来解决它。万岁https://en.wikipedia.org/wiki/Marian_Rejewski!
好了,我真的要睡觉了。
来源:Giphy.com
该睡觉了,但首先我必须关灯。
参考资料:
- https://OCW . MIT . edu/courses/mathematics/18-05-introduction-to-probability and-statistics-spring-2014/readings/MIT 18 _ 05s 14 _ reading 20 . pdf
- https://docs.pymc.io/nb_examples/index.html
- https://2018 . za . pycon . org/talks/5-Bayesian-analysis-in-python-a-starter-kit/
成为多面手如何有利于您的数据科学职业
原文:https://towardsdatascience.com/how-being-a-generalist-can-benefit-your-data-science-career-cd23758a0780?source=collection_archive---------17-----------------------
尤其是如果你是从数据科学领域起步的话…
由 kazuend 在 Unsplash 拍摄的照片
在数据科学领域起步的人可能会感到有点失落。尤其是在选择自己应该追求什么角色的时候。我们在数据科学领域的角色激增可能会让人不知所措。
有这么多的角色要追求,从业者必须学习大量的技能。问题是人们不知道从哪里开始。
这让我们开始讨论应该使用哪种策略来在数据科学职业生涯中取得成功。一个人应该成为多面手还是专家?
这是一个很难解决的问题,因为它取决于太多的变量。这篇文章的目的不是解决这样一个问题。但是,目的是与你分享成为多面手的一些好处。
我希望有了这些信息,你会更好地了解。所以,下次你发现自己问这样的问题时,你会更好地回答它。
TL;成为多面手的三个主要好处是:你培养了强烈的自主意识。你让事情进展得更快。你会成为会说几种语言的人。
多面手与专家
通才是那些什么都懂一点的人。他们的知识扩展到几个知识领域,但有时可能是肤浅的。
专家是某一特定知识领域的专家。他们可能相当强大,但如果他们在另一个地区行动,他们可能会失去他们的力量。
你应该记住,凡事都有一定程度的专业化。没有所谓的纯通才或纯专科。
例如,如果你是一名工程师,你的专业领域是工程学。所以,如果你做不好律师,我不会对你评头论足。但是,为了你自己,你应该了解一点法律。你不能忽视他们的存在。
就像我之前说的,你不必事事都是专家。关键是要在一般化和特殊化之间找到*衡。
数据科学领域的通才和专家
在数据科学中,你可以说每个角色本身就是某种专门化。数据工程师做数据工程。数据分析师做数据分析。数据科学家做数据科学。
我见过数据科学家无法训练自己的模型,因为他们没有数据工程师来为他们获取数据。
我也见过数据工程师无法获得业务洞察力,因为他们不了解业务需求。
如果您所在的组织没有足够的资源来雇佣 4 或 5 个人来完成整个数据生命周期,这可能会成为一个问题。这是一种专业化程度,不是每个公司都能负担得起的。
这里更大的问题是我们习惯于有专门的角色。这是我们的社会和公司多年来一直遵循的模式。我们学习,我们专攻,我们想在我们的专业领域执行。
尽管如此,公司和数据从业者可以从通才方法中获益更多。
不要误解我,我不是说我们不应该有专家。这里的要点是我们应该有更多的通才。
事实上,一些人,比如网飞大学数据科学和工程的前副总裁 Eric Colson,认为我们应该组织我们的数据科学团队的方式是拥有多面手而不是专家。
https://hbr.org/2019/03/why-data-science-teams-need-generalists-not-specialists
成为多面手的好处
我从数据分析师做起。然后,我想过渡到数据科学家。为此,我给自己找了一家新公司。但是,当我到达新公司时,事情发生了意想不到的变化。
我记得首席技术官告诉我的一件事是,我在那里不仅仅是培训模型。如果我想在公司茁壮成长,我必须做得更多。我必须自己完成整个生命周期,,即,自己获取数据,转换数据,训练模型,并部署它们。
那是我当时不喜欢的事情。但是,现在我明白他想说什么了。他不想要专家,而是要多面手。这家公司负担不起如此程度的专业化。
我就是这样开始成为通才的。这也是我开始更清楚地看到成为多面手的好处的地方。
你发展出一种深刻的自主意识
我很快发现了成为某种怪异的“全栈数据科学家”的好处。最主要的是自主性。
一开始,我做任何事情都需要队友的支持。我需要帮助从数据库中获取数据,并转换它。此外,我需要帮助部署模型和构建东西来消费模型,等等。
在我掌握了窍门之后,我意识到能够独自完成整个生命周期是多么有用。当我的队友忙于解决其他问题时,我可以轻松地独自做事情。
我成为了一个能够独立面对问题的人,并通过这样做来帮助球队。
你让事情进展得更快
有时候,公司不需要完美的东西。他们只需要知道某件事是否可行。如果是值得追求的东西。越快知道越好。
如果你不得不协调更少的人,就更容易探索新事物。这就是你如何避免协调成本。
此外,给团队中的一个人自主权要比给整个团队自主权容易得多。你不能因为你的整个团队都在尝试一个新工具,或者类似的东西,就让关键的事情无人关注。
你会成为会说几种语言的人
在成为一名古怪的“全栈数据科学家”之后,我过渡到了数据工程。我最初在一家公司领导数据管道的实施。
我意识到的一件事是,作为多面手,我可以说几种“语言”因此,我能够轻松地在团队的不同角色之间转换不同的需求。
当我不得不与数据工程师交谈时,我可以轻而易举地做到。数据分析师也是如此。同样,它也发生在商业人士身上。我能够用每个人自己的语言与他们交谈,并帮助协调团队。
这是我觉得有用的东西。如果对方不说“相同的语言”,表达你的需求可能会很困难
最后的想法
这种关于通才和专家的讨论可能很难进行。你应该利用所有的信息,自己决定你想追求什么。
如果你想更深入地了解这方面的内容,我推荐你读一些其他的文章。
感谢阅读!
如果你想随时更新我的作品, 请加入我的 简讯 ! 偶尔,我会和我的读者分享一些东西。如果你加入我会很感激的:)
奥运会的超支有多大?
原文:https://towardsdatascience.com/how-big-is-cost-overrun-for-the-olympics-46e803cbf7d5?source=collection_archive---------31-----------------------
所有游戏,无一例外,都有过成本超支。因为没有其他类型的大型项目是这种情况。
亚历山大·布齐尔和丹尼尔·伦恩
由布莱恩·特纳在 Unsplash 上拍摄的照片
下表显示了 1960-2016 年奥运会的实际超支百分比。在 1960 年至 2016 年的 30 场比赛中,有 19 场比赛的成本超支数据可用。投标预算和最终成本之间的差异的统计测试表明,这种差异在统计上具有压倒性的显著性。也就是说,从统计数据来看,奥运会的成本超支非常明显。应该提到的是,如果按名义价值(包括通货膨胀)计算成本超支,那么成本超支会大得多。从这个意义上说,显示的数字是保守的。*我们发现实际成本超支的*均值和中位数如下:
- 所有游戏:*均成本超支为 172%(中位数为 118%)。
- 夏季奥运会:*均超支为 213%(中位数为 120%)。
- 冬季奥运会:*均超支 142%(中位数 118%)。
来源:https://bit.ly/376vMo6
在所有大型项目中,奥运会的*均成本超支最高,实际超支 172%。
尽管夏季奥运会和冬季奥运会的*均成本超支之间的差异相对较大,为 71 个百分点,但这两种类型的奥运会在成本超支方面的差异在统计上并不显著。因此,从统计学的角度来看,夏季奥运会和冬季奥运会的成本超支没有区别,可以将这些数据汇集起来进行统计分析,例如,对未来奥运会的预算进行更准确的参考类预测。
我们进一步看到:
- 19 款游戏中有 15 款(79%)的成本超支超过 50%。
- 19 款游戏中有 9 款(47%)的成本超支超过 100%。
警惕的读者可能会怀疑,所有比赛中最低的超支是北京 2008 年奥运会的 2%
从这些统计数据来看,很明显,奥运会存在着巨大的成本超支风险。
对于夏季奥运会,超支最多的是 1976 年蒙特利尔奥运会,超支 720%,其次是 1992 年巴塞罗那奥运会,超支 266%。2008 年北京奥运会超支最小,为 2%,其次是 2004 年雅典奥运会,为 49%。对于冬季奥运会,最大的成本超支是 1980 年普莱西德湖奥运会的 324%,其次是 2014 年索契冬奥会的 289%。2010 年温哥华冬奥会超支最小,为 13%,其次是 2002 年盐湖城冬奥会,为 24%。
警惕的读者可能会怀疑,所有比赛中最低的超支是北京 2008 年奥运会的百分之二。众所周知,中国的经济报道缺乏可靠性。然而,北京 2008 年奥运会 68 亿美元的总成本和每位运动员 622,000 美元的成本都高于大多数其他夏季奥运会。因此,报告的费用被认为是足够举办北京奥运会的,我们没有看到官方数字被操纵的直接证据,因此应该拒绝接受。因此,像其他观察中国经济数据的人一样,我们也包括了这些数据,并警告说,鉴于中国篡改数据的历史,这些数据可能不如其他国家的数据可靠。同样,这意味着我们在奥运会中的*均超支费用是保守的。
奥运会的高*均超支成本,加上离群值的存在,应该成为任何考虑举办奥运会的人,尤其是小型或脆弱经济体的谨慎理由
来源:https://bit.ly/376vMo6
根据上述数据,我们进一步观察了奥运会的成本超支情况:
- 所有游戏,无一例外都有成本超支。没有其他类型的大型项目是这种情况。对于其他项目类型,通常有 10-20%的项目符合或低于预算。对于奥运会来说是零。这一点值得仔细考虑。预算通常被确定为在项目上花费的最大值,或者说是期望值。然而,在奥运会中,预算更像是一个持续超支的虚构的最小值。此外,与其他大型项目相比,每项预算都有法律要求,要求主办城市和国家政府保证支付奥运会的超支费用。我们的数据表明,这种担保类似于为该活动开一张空白支票,肯定费用会比报价高。实际上,投标预算与其说是预算,不如说是首期付款,以后还会分期付款。
- 奥运会的*均成本超支**是所有大型项目中最高的,按实际价值计算高达 172%。相比之下,Flyvbjerg 等人(2002 年)发现,大型交通项目的*均成本超支为公路 20%,大型桥梁和隧道 34%,铁路 45%;Ansar 等人(2014 年)发现巨型大坝的超限率为 90 %;Budzier 和 Flyvbjerg (2011)对大型 IT 项目的预测是 107 %,所有的预测都是真实的。奥运会的高额超支可能与项目交付的固定期限有关:开幕日期不可更改。因此,当出现问题时,不能像其他大型项目那样,在进度和成本之间进行权衡。在奥运会上,经理们所能做的就是投入更多的钱来解决问题,这就是所发生的事情。从这个意义上说,举办奥运会就像开一张空白支票。
- 奥运会的*均超支额很高,再加上离群值的存在,应该成为任何考虑主办奥运会的人,尤其是那些几乎没有能力吸收不断上涨的成本和相关债务的小型或脆弱经济体保持谨慎的原因。数十亿美元项目成本超支 50%以上的小风险也应该引起政府官员和纳税人的关注,因为这种超支可能会对未来几十年产生财政影响,就像蒙特利尔在 1976 年夏季奥运会上花了 30 年才还清 720%成本超支所产生的债务一样(Vigor,Mean,和 Tims 2004: 18),雅典在 2004 年奥运会上,奥运成本超支和相关债务加剧了 2007-16 年的金融和经济危机。
_____________
*)有关完整的故事,包括参考资料和注释,请参见 Flyvbjerg、Bent、Alexander Budzier 和 Daniel Lunn,2021 年,“回归尾部:为什么奥运会会失败”,环境与规划 A:经济与空间,第 53 卷,第 2 期,2021 年 3 月,第 233-260 页。这里有免费的 pdf:https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3686009
你最喜欢的城市有多适合骑自行车?
原文:https://towardsdatascience.com/how-bike-able-is-your-favorite-city-886332b9a94c?source=collection_archive---------34-----------------------
使用数据科学测量城市中骑车人的友好程度。
穆里略·德·保拉在 Unsplash 上的照片
无论你是职业自行车还是业余爱好,你可能都知道骑自行车有多大好处。从山路到穿越城市,自行车可以让你探索新的地方,锻炼身体,并在途中进行社交。在这个小故事中,我们将从数据科学的角度来看骑自行车的最佳城市。首先,让我们看看我们将要使用的一些工具。
工具和数据:
- Jupyter 笔记本
- OSMnx
- 网络 x
- 海生的
- 和 Python
- 数据:世界主要城市及其人口数据集(链接:【https://data.un.org/Data.aspx?d=POP】T4&f = tableCode % 3a 240)
标准:
什么使得城市对自行车友好?首先,它应该有专门的自行车路线和车道。让我们把它定义为自行车路线长度与总路线长度之比。这个比例越高,城市就越适合自行车。为了计算这一点,我们应该为一个特定的城市(比如东京)生成自行车和整个街道网络,如下所示:
以下是包括东京自行车道在内的道路:
现在,让我们计算 100 个城市的自行车道与总道路的比率,并查看使用 OSMnx 街道长度函数得出的结果:
这是使用 Seaborn 生成的自行车路线比例最高的前 20 个城市的条形图:
在这项指标中,排名最高的城市是刚果民主共和国的金沙萨,得分为 1.0,这意味着所有街道都可以骑自行车,其次是中国的东莞和印度尼西亚的万隆。
接下来,我们可以看看每个人口有多少骑行路线。因此,我们可以定义另一个指标:每个城市的自行车道长度除以人口密度。较大的值意味着城市居民可以使用更多的自行车道,因此对自行车更加友好。另一方面,较小的数值意味着更多的人使用较少的自行车道。让我们看一下代码,然后看看 20 个最大值的条形图:
这里的数据显示了与我们的第一个指标不同的故事,美国的亚特兰大、休斯顿和达拉斯得分最高。
那么,让我们看看这些城市的一些街道网络,即亚特兰大和金沙萨。首先,这是每个城市的网络图:
亚特兰大
金沙萨
他们看起来当然彼此不同,有些视觉上的差异。亚特兰大的网络在某些地区看起来稍微更“集中”,而金沙萨的网络看起来非常对称和均匀分布。我们可以使用 OSMnx 量化这些差异:
OSMnx 提供了一个名为“基本统计”的功能,我们可以使用它来查看关于城市街道网络的各种指标。以下是我们将在熊猫数据框架中使用的变量:
首先,“n”和“m”分别代表图中节点和边的数量。如你所见,亚特兰大两者兼而有之。那么 k_avg 代表*均节点度,意味着从图中的节点出现或进入的道路的*均数量。在这种情况下,金沙萨的这一指标值较高。
对于其他指标,您可以看到亚特兰大在十字路口数和街道总长度方面得分较高,但金沙萨的*均街道长度较高,这有助于理解我们上面看到的图表。
总之,在这个小故事中,我们分析了一些指标,看看世界上哪些城市对自行车更友好,然后我们看了看排名前两位的城市,以了解是什么使它们如此友好。我希望你喜欢这个故事,如果你想看看代码,你可以在这里找到它:https://github . com/DeaBardhoshi/Data-Science-Projects/blob/main/bike ability % 20 pipeline . ipynb
外面的马路有多热闹?
原文:https://towardsdatascience.com/how-busy-is-the-road-outside-de8e9b1b3cc3?source=collection_archive---------35-----------------------
从零开始逐个任务地进行数据科学
我们正在自动计算过往车辆
照片由 CHUTTERSNAP 在 Unsplash 上拍摄
如果我有像上面这样的好照片,我计算过往车辆的项目会容易得多。相反,我只能处理低质量的模糊图像。这篇文章是我个人在 一个计算机视觉&深度学习涅槃 之旅的延续。很多时候,它看起来更像克里斯·雷亚的《地狱之路》。 《在你穿越旷野从沙漠到井的旅途上》 。我的领域似乎是计算机科学、深度学习和计算机视觉。沙漠代表了我对井的求知欲,也许是指我经常饮用的书籍、教程和文章。如果都是这样,那么我邀请你到 喝我井里的水,欣赏我系列的下一篇文章 。和我一起去数过往的车辆。
如果你加入了 mid quest,你可以在这里了解整个系列。之前,我制作摄像机,部署运动眼,并定位摄像机以记录运动,同时保护道路使用者的隐私和安全。最后,我砍出了相当多的代码。现在,我有了整整一周的数据,并渴望更新你们所有人的练习。
检索图像
一旦设计并调好数据收集器,数据检索就是或者应该看起来是自动的。至少在我项目的这个阶段,我是这样的。下面的图 1 显示了一个 Motion Eye 操作系统(摄像机 1)的屏幕截图。每一天都显示在左侧,我可以检索任何一天的所有图像的“压缩”文件。
图 1 来自 Motion Eye OS 的屏幕截图—相机 1 —作者提供的图片。
从 1 月 22 日到 1 月 28 日有一整套数据。1 月 29 日被抓获时正在进行中。该系统在每天从格林威治时间早上 7 点到下午 5 点工作。在早上 7 点之前和下午 5 点之后,是黑暗的,设备不记录活动。每一天都是一个单独的文件夹,每个图像文件都被命名为 hour-minute-second.jpg,10–49–24.jpg 代表上午 10:49:24 的检测触发。
检索只需要登录到运动眼设备,每天下载一个 ZIP 文件。由于 Motion Eye 是基于网络的服务,我可以直接从我的数据科学工作站登录。我确实创建了一个 UPS 支持的 Raspberry Pi 文件服务器,但是我们需要保持简单。下载并解压缩目标文件夹中的 zip 文件后,我们的数据检索就完成了。但是,下载几百张照片不算数据!对吗?我们需要像石油公司一样提炼图像,将原油运到炼油厂生产天然气。
数据精炼厂
我想,就像那些在野外钻探石油的野人一样,我们也在这里发现了石油。代替桶稠厚的原油,我们有文件夹的模糊图像来提炼。将原油转化成为社会提供动力的产品被证明是一大笔钱。数据科学,机器学习和深度学习,在我看来,是石油工人移动工具,和原油到炼油厂的应用。
照片由 Zbynek Burival 在 Unsplash 上拍摄
谢天谢地,杂乱的数据比一桶原油干净多了。我把我的提炼步骤添加到一个要点中,让我们讨论一下要点。之前,我讨论了我创建的 myYolo 类,我提到代码的来源是来自www.pyimagesearch.com。
第 5 行和第 6 行帮助描述那些桶原油,图像的文件夹,被存储在哪里。第 14 行创建了 myYolo 类的一个实例,因为我用 GPU 配置了我的工作站,所以我们可以将目标设备设置为‘GPU’。第 16 到 21 行提供了一个助手函数,允许我将任何给定的对象持久化到磁盘上。第 24 到 29 行是实际的精炼过程。第 27 行调用实例上的 setter 方法,实际上只设置了目标文件夹或原油桶。第 28 行通过 YOLO 网络发送整个文件夹,第 33 行将数据溢出到磁盘。
图 2 精炼步骤的最终输出。
上面的图 2 为您提供了终端输出的屏幕截图。我正在使用可视化代码,你可以看到我有一个名为“opencv_cuda”的虚拟环境。用 Cuda 构建 OpenCV 二进制文件对我来说是一个巨大的痛苦。每个文件夹都经过了处理,我们可以看到每个图像花了 0.037 秒穿越 Yolo 网络。
因此,现在我们有了数据,但我们仍然处于中游阶段,我们将数百张照片处理成一个数据对象,现在需要将产品交付给最终消费者。
消费数据
你是否曾希望你能把你的大脑接入数据管道,直接消耗掉它?我曾经和年轻人开玩笑,问他们的大脑中是否有一个“USB 端口”?如果是这样,他们可以插入我的大脑,下载和上传我的数据!明明看了所有的矩阵片。
由 Vlad Tchompalov 在 Unsplash 拍摄的照片
原始数据包含字典列表。
[{'image': '/home/david/Documents/projects/yolo-object-detection/images/2021-01-22/13-30-33.jpg', 'result': ['car: 0.8965'], 'timing': '[INFO] YOLO took 0.391402 seconds'}
..
]
每个字典都有一组有限的键。这些是:-
- 图像:提供原始图像文件和完整路径;
- 结果:图像中检测到的物体的 python 列表。可能有一个或多个对象。
- 计时:包含一个文本,记录图像穿越 YOLO 网络所用的时间。可能没用。
我第一次使用可视代码作为我的笔记本环境。很难说我对视觉代码和网页浏览器的感觉,因为感觉很奇怪。视觉代码可能是一个更好的笔记本环境。图 3 展示了一个很棒的特性——可变查看器。
图 3:可视化代码 Jupyter 笔记本扩展——使用变量查看器。作者图片
我将笔记本导出为 PDF 格式,并添加到 GITHUB 中。大部分代码都是真正标准的,只提供了几个 CSV 文件,我可以做进一步的工作。图 4 显示了数据。图 4(左)显示了每小时通过的交通流量。图 4(右)显示了单个事件和检测到的对象。为了制作一些图表,我决定使用 Power BI
图 CSV 文件的图示。图片由作者提供。
采用 Power BI 的视觉效果
使用 Power BI,我做了一些进一步的操作,然后生成了一些图表。下面包括图 5 和图 6,展示了我创建的一些图像。
图 5:作者展示 YOLO 探测到的物体的图片
Yolo 模型在 198 张照片中没有检测到任何东西(图 5)。汽车是最常经过的交通工具,但我们也有“火车”,这是不太可能的。Yolo 模型当然需要训练,以检测爱尔兰当地的车辆。
图 6:作者提供的图片显示了外部*均交通流量的折线图
外面的马路有多热闹?
图 6 给出了研究问题的答案。鉴于全球疫情,该数据不太可能代表典型模式。从早上 7 点开始,到 17 点停 7 天,我们看到的都是一般的过往车辆。早上 7 点这条路很安静。一般来说,白天外面的街道上每小时至少有 12 辆车通过。
外面的路很忙吗?我猜有些道路每秒有 12 辆车,所以这真的归结为透视。 我将继续我的个人旅程,踏上我寻求的那个计算机视觉&深度学习的涅槃之路。 更多时候,似乎更像是克里斯·雷亚的《地狱之路》。我们会看到的!
你如何利用人工智能来防止网络欺凌?
原文:https://towardsdatascience.com/how-can-ai-help-to-prevent-cyberbullying-f630073da478?source=collection_archive---------27-----------------------
变更数据
让我们通过例子来学习,用 PyTorch 训练一个能够在在线对话中识别毒性的神经网络
由奥斯丁·帕切科在 Unsplash 上拍摄
网络欺凌是一种利用电子手段进行欺凌的形式。随着数字领域的扩大和技术的进步,这种现象变得越来越普遍,尤其是在青少年中。
三年前,有毒评论分类挑战发表在 Kaggle 上。竞赛的主要目的是开发有助于改善在线对话的工具:
讨论你关心的事情可能会很困难。网上辱骂和骚扰的威胁意味着许多人停止表达自己,放弃寻求不同意见。*台努力有效地促进对话,导致许多社区限制或完全关闭用户评论。
本文从理论部分开始,您将学习使用神经网络进行文本处理的基本概念。然后,它继续一个例子,如何训练一个卷积神经网络,检测有毒的评论。
通过阅读理论部分,你会学到:
- 什么是 NLP?
- 伯特是什么?
- 什么是卷积神经网络(CNN)?
- 如何将文本转换为嵌入?
- 什么是 KimCNN?
通过阅读实用部分,你将学到:
- 如何加载数据
- 如何定义训练、验证和测试集
- 如何用 PyTorch 训练卷积神经网络
- 如何测试模型
在文章的最后,我还分享了所有代码的链接,以便您可以自己运行它。
让我们从理论开始
照片由叶戈尔·迈兹尼克在 Unsplash 上拍摄
什么是 NLP?
照片由蒂姆·莫斯霍尔德在 Unsplash 拍摄
自然语言处理(NLP)是语言学、计算机科学、信息工程和人工智能的一个分支,涉及计算机和人类语言之间的交互,特别是如何编写计算机程序来处理和分析大量自然语言数据。自然语言处理中的挑战通常涉及语音识别、自然语言理解和自然语言生成。
伯特是什么?
由 Rajeshwar Bachu 在 Unsplash 上拍摄的照片
来自变压器的双向编码器表示(BERT)是一种语言模型,由谷歌的 Jacob Devlin 和 Ming-Wei Chang 于 2018 年创建并发布[3]。BERT 用一种更快的基于注意力的方法取代了递归神经网络的顺序性质。BERT 使用 Transformer,这是一种学习文本中单词(或子单词)之间上下文关系的注意力机制。一般来说,Transformer 包括两个独立的机制——一个读取文本输入的编码器和一个为任务生成预测的解码器。
BERT 在各种 NLP 任务中取得了最先进的结果。由于 BERT 的目标是生成一个语言模型,所以只有编码器机制是必要的。要了解关于 BERT 的更多信息,请阅读 Rani Horev 的文章 BERT 解释:NLP 的艺术语言模型。
在本文中,我们将使用 BERT 作为编码器,使用单独的 CNN 作为解码器,为任务产生预测。
我们可以直接使用 BERT 来完成这项任务(如使用 BERT 的多标签文本分类—强大的转换器中所述),但我们需要在转换器上重新训练多标签分类层,以便它能够识别仇恨言论。
卷积神经网络
照片由 Alina Grubnyak 在 Unsplash 上拍摄
在深度学习中,卷积神经网络是一类神经网络,已被证明在图像识别和分类等领域非常有效。除了为机器人和自动驾驶汽车的视觉提供动力之外,CNN 还成功地识别了人脸、物体和交通标志。
由于这些成功,许多研究人员试图将它们应用于其他问题,如 NLP。
要了解更多关于 CNN 的信息,请阅读这篇关于 CNN 的文章:卷积神经网络的直观解释。
如何将文本转换为嵌入?
Max 陈在 Unsplash 上拍照
为了让卷积神经网络处理文本数据,我们需要将评论的每个单词转换成一个向量。
Huggingface 开发了一个名为 transformers 的自然语言处理(NLP)库,可以将单词转换为矢量(以及许多其他东西)。它还支持多种先进的自然语言处理语言模型,比如 BERT。
使用 BERT,评论中的每个单词都被转换成一个大小为[1 x 768]
的向量(768 是 BERT 嵌入的长度)。
一条评论由多个单词组成,所以我们得到一个矩阵[n x 768]
,其中 n 是一条评论中的单词数。由于伯特在第一句话的开头插入了[CLS]标记,并在每句话的结尾插入了[SEP]标记,因此实际上有超过n
的单词。
在本文中,我们将使用一个更小的 BERT 语言模型,它有 12 个注意层,使用 30522 个单词的词汇量。
BERT 使用一个标记器将输入文本分割成词汇表中可用的标记列表。它还通过将单词拆分为子单词来学习词汇表中没有的单词。
什么是 KimCNN?
照片由莫里茨·金德勒在 Unsplash 上拍摄
KimCNN 1是由纽约大学的 Yoon Kim 在 2014 年的一篇论文《用于句子分类的卷积神经网络》中引入的。当时,它提高了多个 NLP 任务的准确性。KimCNN 使用与用于分析视觉图像的网络类似的架构。
KimCNN [2]的步骤:
- 取一个单词嵌入在输入
[n x m]
上,其中 n 代表一个句子中的最大单词数,m 代表嵌入的长度。 - 对嵌入应用卷积运算。它使用不同大小的多个卷积
[2 x m]
、[3 x m]
和[4 x m]
。这背后的直觉是模拟 2 个单词、3 个单词等的组合。注意,卷积宽度是m
-嵌入的大小。这不同于 CNN 对图像的处理,因为他们使用像[5 x 5]
这样的*方卷积。这是因为[1 x m]
代表一个完整的单词,用较小的内核大小运行卷积是没有意义的(例如,在单词的一半上进行卷积)。 - 应用校正线性单元(ReLU)来增加模拟非线性问题的能力。
- 应用 1-max 池对输入表示进行下采样,并帮助防止过拟合。更少的参数也降低了计算成本。
- 将前面操作中的向量连接成一个向量。
- 添加一个脱层来处理过度拟合。
- 应用 softmax 函数在类之间分配概率。我们的网络在这里有所不同,因为我们正在处理一个多标签分类问题——每个评论可以有多个标签(或者没有标签)。我们使用一个 sigmoid 函数,它为每个类在 0 和 1 之间调整 logits。这意味着可以同时预测多个类别。
让我们继续实际的部分
初始化库
在我们开始之前,我们需要导入我们将要用来开发 AI 模型的所有库。
如果您的计算机上缺少任何库,您可以使用以下软件进行安装:
pip install library_name
让我们导入库:
**%**matplotlib inlineimport logging
import time
from platform import python_versionimport matplotlib
import matplotlib.pyplot **as** plt
import numpy **as** np
import pandas **as** pd
import sklearn
import torch
import torch.nn **as** nn
import torch.nn.functional **as** F
import transformers
from sklearn.metrics import roc_auc_score
from torch.autograd import Variable
加载数据
毒性评论分类挑战 —图片来自 lamamatropicana
前往有毒评论分类挑战下载数据(解压后将文件夹重命名为data
)。
我们将使用train.csv
来训练和测试模型,因为test.csv
中的条目没有标签,并且用于 Kaggle 提交。
让我们加载数据。
df **=** pd**.**read_csv('data/train.csv')
我们设置随机种子,使实验可重复,并打乱数据集。
np**.**random**.**seed(42)
改组数据的目的是减少方差,并确保模型不会过度适应训练集中的样本序列。
df **=** df**.**sample(frac**=**1)
df **=** df**.**reset_index(drop**=**True)
数据集由评论和不同类型的毒性组成,如威胁、淫秽和侮辱。这个问题属于多标签分类的范畴,因为每个评论都可以被打上多个侮辱标签(或者没有)。
df**.**head()
数据集中的前几个样本
让我们展示第一条评论——别担心,这不是毒性威胁:)
df**.**comment_text[0]
天啊,你是不是健忘!我们已经讨论过为什么马克思不是无政府主义者,也就是说,他想用一个国家来塑造他的“社会主义者”因此,他是一个国家主义者——与无政府主义者相反。我认识一个人,他说,当他老了,牙齿掉光了,他就不吃肉了。你会说他是素食主义者吗?
例如,id 为 103 的评论被标记为有毒、严重 _ 有毒、淫秽、侮辱(评论 _ 文本被有意隐藏)。该模型应该能够像这样标记评论。
数据集中第 103 个样本的目标
定义数据集
照片由米卡·鲍梅斯特在 Unsplash 上拍摄
当我们在 CPU 上训练神经网络(NN)时,我们将训练集的大小限制为 10.000 条评论。
验证集(1.000 注释)用于测量训练期间模型的准确性,测试集(2.000 注释)用于测量模型训练后的准确性。
让我们加载 BERT 模型、Bert Tokenizer 和 bert-base-uncased 预训练权重。
我们将每个评论转换成 2D 矩阵。矩阵有一个预定义的大小,但是有些注释比其他注释有更多的单词。要将注释转换为矩阵,我们需要:
- 将评论的长度限制在 100 字以内(100 是任意数字),
- 用少于 100 个单词填充注释(在末尾添加 0 个向量)。
BERT 不像一些上下文无关的预训练语言模型(Word2Vec、FastText 或 GloVe)那样,简单地将每个单词映射到一个嵌入。为了计算上下文,我们需要将注释输入到 BERT 模型。
在下面的代码中,我们将注释标记化、填充并转换为 PyTorch 张量。然后,我们使用 BERT 将文本转换为嵌入。这个过程需要一些时间,所以要有耐心。
这是第一个用 BERT 转换成单词嵌入的评论。它有一个[100 x 768]
形状。
x_train[0]
第一个评论没有毒性,只有 0 值。
y_train[0]
用 PyTorch 训练模型
马库斯·温克勒在 Unsplash 上的照片
下面的代码用 PyTorch 库定义了 KimCCN。
让我们设置模型的参数:
- embed_num 表示评论中的最大字数(本例中为 100)。
- embed_dim 表示 BERT 嵌入的大小(768)。
- class_num 是要预测的毒性威胁的数量(6)。
- kernel_num 是每个卷积运算的滤波器数量(例如,
[2 x m]
卷积的 3 个滤波器)。 - 卷积的内核大小。看两个单词、三个单词等的组合。
- dropout 是训练阶段每次更新时随机设置隐藏单元为 0 的百分比。提示:确保在测试/验证阶段禁用丢失,以获得确定性输出。
- 静态参数 True 表示我们不计算嵌入的梯度,它们保持静态。如果我们将其设置为 False,将会增加模型需要学习的参数数量,并且可能会过拟合。
embed_num **=** x_train**.**shape[1]
embed_dim **=** x_train**.**shape[2]
class_num **=** y_train**.**shape[1]
kernel_num **=** 3
kernel_sizes **=** [2, 3, 4]
dropout **=** 0.5
static **=** Truemodel **=** KimCNN(
embed_num**=**embed_num,
embed_dim**=**embed_dim,
class_num**=**class_num,
kernel_num**=**kernel_num,
kernel_sizes**=**kernel_sizes,
dropout**=**dropout,
static**=**static,
)
我们将模型训练 10 个时期,批大小设置为 10,学习率设置为 0.001。我们使用带有 BCE 损失函数(二进制交叉熵)的 Adam 优化器。二元交叉熵损失允许我们的模型为标签分配独立的概率,这对于多标签分类问题是必要的。
n_epochs **=** 10
batch_size **=** 10
lr **=** 0.001
optimizer **=** torch**.**optim**.**Adam(model**.**parameters(), lr**=**lr)
loss_fn **=** nn**.**BCELoss()
下面的代码为训练生成批量数据。
让我们训练模型。
在多个时期训练模型
在下图中,我们可以观察到训练和验证损失在 10 个时期后收敛。
plt**.**plot(train_losses, label**=**"Training loss")
plt**.**plot(val_losses, label**=**"Validation loss")
plt**.**legend()
plt**.**title("Losses")
培训和验证损失
测试模型
JESHOOTS.COM 在 Unsplash 上的照片
模型被训练。我们使用测试集上的受试者操作特征曲线下面积(ROC AUC)来评估模型性能。scikit-learn 的 AUC 实现支持二进制和多标记指标格式。
让我们使用模型来预测测试集的标签。
model**.**eval() *# disable dropout for deterministic output***with** torch**.**no_grad(): *# deactivate autograd engine to reduce memory usage and speed up computations*
y_preds **=** []
batch **=** 0
**for** x_batch, y_batch, batch **in** generate_batch_data(x_test, y_test, batch_size):
y_pred **=** model(x_batch)
y_preds**.**extend(y_pred**.**cpu()**.**numpy()**.**tolist())
y_preds_np **=** np**.**array(y_preds)
对于每个评论,该模型输出 0 到 1 之间 6 个值(每个毒性威胁一个)。我们可以使用 0.5 作为阈值,将所有大于 0.5 的值转换为毒性威胁,但让我们先计算 AUC。
y_preds_np
我们为测试集提取毒性威胁的真实标签。真正的标签是二进制值。
y_test_np **=** df_test[target_columns]**.**valuesy_test_np[1000:]
一个模型的 AUC 等于该模型将随机选择的正面例子排序高于随机选择的负面例子的概率。AUC 越高越好(虽然没那么简单,我们下面会看到)。当 AUC 接* 0.5 时,意味着该模型无论如何都没有标记分离能力。当 AUC 接* 0 时,这意味着我们需要反演预测,它应该工作得很好:)
让我们计算每个标签的 AUC。
auc_scores **=** roc_auc_score(y_test_np, y_preds_np, average**=**None)
df_accuracy **=** pd**.**DataFrame({"label": target_columns, "auc": auc_scores})
df_accuracy**.**sort_values('auc')[::**-**1]
在上表中,我们可以观察到该模型对每个标签都实现了高 AUC。注意,在处理不*衡数据集时,AUC 可能是一个误导性的指标。
数据集不*衡吗?
当 50%的标签属于每个类时,我们说数据集是*衡的。当这个比率接* 90%到 10%时,数据集是不*衡的。在不*衡数据集上训练的模型的已知问题是它们报告的精确度很高。如果模型预测值总是 0,那么它可以达到 90%的准确率。
让我们检查一下是否有不*衡的数据集。
positive_labels **=** df_train[target_columns]**.**sum()**.**sum()
positive_labels# Output:
2201all_labels **=** df_train[target_columns]**.**count()**.**sum()
all_labels# Output:
60000positive_labels**/**all_labels# Output:
0.03668333333333333
60000 个标签中只有 2201 个是阳性的。数据集是不*衡的,所以上面报道的准确性不应该太认真。
健全性检查
照片由 Antoine Dautry 在 Unsplash 拍摄
让我们做一个健全性检查,看看模型是否预测所有评论为 0 毒性威胁。
df_test_targets **=** df_test[target_columns]
df_pred_targets **=** pd**.**DataFrame(y_preds_np**.**round(), columns**=**target_columns, dtype**=**int)
df_sanity **=** df_test_targets**.**join(df_pred_targets, how**=**'inner', rsuffix**=**'_pred')
df_test_targets**.**sum()
df_pred_targets**.**sum()
我们可以观察到,该模型预测了 3 种毒性威胁:有毒、淫秽和侮辱,但它从未预测到严重毒性、威胁和认同仇恨。这似乎并不伟大,但至少它没有把所有的评论都标上零。
df_sanity[df_sanity**.**toxic **>** 0][['toxic', 'toxic_pred']]
我们看到这个模型正确地预测了一些有毒的评论。
结论
照片由Dawid za wia在 Unsplash 上拍摄
我们用 BERT 嵌入训练了一个 CNN 来识别仇恨言论。我们使用相对较小的数据集来加快计算速度。代替 BERT,我们可以使用 Word2Vec,这将加速从单词到嵌入的转换。我们没有花时间优化模型,因为这不是这篇文章的目的。所以报道的准确性不应该太认真。更重要的是概述了不*衡数据集、AUC 和漏失层的缺陷。
我们可以用 TD-IDF 和逻辑回归来代替像 BERT 这样的新工具。你想读一篇关于它的文章吗?请在下面的评论中告诉我。
要在你的机器上运行代码,下载这个 Jupyter 笔记本。
在你走之前
- [50% Off All AI Nanodegree Programs!](https://imp.i115008.net/c/2402645/998478/11298) [Course]- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
在推特上关注我,在那里我定期发关于数据科学和机器学习的推特。
参考
1尹金,卷积神经网络用于句子分类(2014),https://arxiv.org/pdf/1408.5882.pdf
[2]https://arxiv.org/pdf/1510.03820.pdf【卷积神经网络用于句子分类的敏感性分析(及从业者指南)】张烨(2016)
[3] Jacob Devlin,BERT:面向语言理解的深度双向转换器预训练(2018)https://arxiv.org/abs/1810.04805
数据科学家如何使用并行处理?
原文:https://towardsdatascience.com/how-can-data-scientists-use-parallel-processing-17194fffc6d0?source=collection_archive---------13-----------------------
由马克-奥利维尔·乔多因在 Unsplash 上拍摄的照片
使用多重处理和 Joblib 的 Python 并行处理
终于,我的程序运行了!我应该去买杯咖啡吗?
我们数据科学家有强大的笔记本电脑。采用四核或八核处理器和睿频加速技术的笔记本电脑。我们通常使用具有更多内核和计算能力的服务器。但是我们真的使用了我们手头的原始力量吗?
我们没有充分利用我们的资源,而是常常无所事事,等待耗时的过程结束。有时我们会等上几个小时,即使紧急的交付项目已经快到截止日期了。我们能做得更好吗?
在这篇文章中,我将解释如何使用多重处理和 Joblib 来使你的代码并行,并从你的大机器中获得一些额外的工作。
1.使用单参数功能的多重处理:
为了激发多重处理,我将从一个问题开始,我们有一个大的列表,我们希望对列表中的每个元素应用一个函数。
我们为什么要这么做?这可能看起来是一个微不足道的问题,但这尤其是我们在数据科学中每天都在做的事情。例如:我们有一个模型,我们用不同的超参数运行模型的多次迭代。或者,我们在一个大的数据帧中创建新的特征,并使用apply
关键字对数据帧逐行应用函数。到本文结束时,您将能够使用这个简单的结构并行化您在数据科学中面临的大多数用例。
所以,回到我们的玩具问题,假设我们想对列表中的所有元素应用 square 函数。
def square(num):
return x**2
当然,我们可以使用简单的 python 在列表的所有元素上运行上述函数。
result = [f(x) for x in list(range(100000))]
但是,上面的代码是按顺序运行的。下面是我们如何使用多重处理将这个函数应用到一个给定列表list(range(100000))
的所有元素,使用我们强大的计算机中的 8 个内核并行执行。
from multiprocessing import Pool
pool = Pool(8)
result = pool.map(f,list(range(100000)))
pool.close()
上面的代码行创建了一个包含 8 个工作线程的多处理池,我们可以使用这个包含 8 个工作线程的池来将我们需要的函数映射到这个列表。
让我们来看看这段代码是如何执行的:
Size of List:10
Without multiprocessing we ran the function in 0.0000 seconds
With multiprocessing we ran the function in 0.5960 seconds
Size of List:100
Without multiprocessing we ran the function in 0.0001 seconds
With multiprocessing we ran the function in 0.6028 seconds
Size of List:1000
Without multiprocessing we ran the function in 0.0006 seconds
With multiprocessing we ran the function in 0.6052 seconds
Size of List:10000
Without multiprocessing we ran the function in 0.0046 seconds
With multiprocessing we ran the function in 0.5956 seconds
Size of List:100000
Without multiprocessing we ran the function in 0.0389 seconds
With multiprocessing we ran the function in 0.6486 seconds
Size of List:1000000
Without multiprocessing we ran the function in 0.3654 seconds
With multiprocessing we ran the function in 0.7684 seconds
Size of List:10000000
Without multiprocessing we ran the function in 3.6297 seconds
With multiprocessing we ran the function in 1.8084 seconds
Size of List:100000000
Without multiprocessing we ran the function in 36.0620 seconds
With multiprocessing we ran the function in 16.9765 seconds
作者图片
正如我们所看到的,当列表长度达到一定程度时,多重处理的运行时间会有所增加,但不会像非多重处理函数在列表长度较大时运行时间增加的那样快。这告诉我们,使用多重处理有一定的开销,对于耗时很短的计算没有太大意义。
实际上,我们不会对几毫秒内完成的函数使用多重处理,而是对可能需要几秒甚至几小时的大得多的计算使用多重处理。因此,让我们尝试一个更复杂的计算,这将花费超过 2 秒钟。我在这里使用time.sleep
作为计算的代理。
Size of List:1
Without multiprocessing we ran the function in 2.0012 seconds
With multiprocessing we ran the function in 2.7370 seconds
Size of List:2
Without multiprocessing we ran the function in 4.0039 seconds
With multiprocessing we ran the function in 2.6518 seconds
Size of List:3
Without multiprocessing we ran the function in 6.0074 seconds
With multiprocessing we ran the function in 2.6580 seconds
Size of List:4
Without multiprocessing we ran the function in 8.0127 seconds
With multiprocessing we ran the function in 2.6421 seconds
Size of List:5
Without multiprocessing we ran the function in 10.0173 seconds
With multiprocessing we ran the function in 2.7109 seconds
Size of List:6
Without multiprocessing we ran the function in 12.0039 seconds
With multiprocessing we ran the function in 2.6438 seconds
Size of List:7
Without multiprocessing we ran the function in 14.0240 seconds
With multiprocessing we ran the function in 2.6375 seconds
Size of List:8
Without multiprocessing we ran the function in 16.0216 seconds
With multiprocessing we ran the function in 2.6376 seconds
Size of List:9
Without multiprocessing we ran the function in 18.0183 seconds
With multiprocessing we ran the function in 4.6141 seconds
作者图片
如您所见,这种情况下的差异更加明显,与使用多重处理相比,不使用多重处理的函数会花费更多的时间。同样,这非常有意义,因为当我们启动多重处理 8 时,工作人员开始并行处理任务,而当我们不使用多重处理时,任务以顺序方式发生,每个任务花费 2 秒钟。
2.多参数函数的多重处理:
对上述代码的一个扩展是,当我们必须运行一个带有多个参数的函数时。对于一个用例,假设您必须使用多个超参数来优化一个特定的模型。您可以这样做:
import random
def model_runner(n_estimators, max_depth):
# Some code that runs and fits our model here using the
# hyperparams in the argument.
# Proxy for this code with sleep.
time.sleep(random.choice([1,2,3])
# Return some model evaluation score
return random.choice([1,2,3])
你如何运行这样一个函数?有两种方法可以做到这一点。
a)使用 Pool.map 和 magic*
def multi_run_wrapper(args):
return model_runner(*args)pool = Pool(4)
hyperparams = [[100,4],[150,5],[200,6],[300,4]]results = pool.map(multi_run_wrapper,hyperparams)
pool.close()
在上面的代码中,我们使用
b)使用 pool.starmap
从 Python3.3 开始,我们可以使用starmap
方法更容易地实现我们上面所做的事情。
pool = Pool(4)
hyperparams = [[100,4],[150,5],[200,6],[300,4]]results = pool.starmap(model_runner,hyperparams)
pool.close()
3.将 Joblib 与单参数函数一起使用:
Joblib 是另一个库,它提供了一个简单的助手类来为使用多重处理的循环编写令人尴尬的并行程序,我发现它比多重处理模块更容易使用。运行并行流程就像用Parallel
和delayed
关键字写一行一样简单:
from joblib import Parallel, delayed
import timedef f(x):
time.sleep(2)
return x**2results = **Parallel**(n_jobs=8)(**delayed**(f)(i) for i in range(10))
让我们使用之前使用的同一个函数来比较 Joblib 并行和多处理模块。
作者图片
我们可以看到运行时非常相似,joblib 代码看起来比多处理代码简洁得多。
4.将 Joblib 与多参数函数一起使用:
为一个函数使用多个参数就像使用 Joblib 传递参数一样简单。这里有一个你可以使用的最小的例子。
from joblib import Parallel, delayed
import timedef f(x,y):
time.sleep(2)
return x**2 + y**2params = [[x,x] for x in range(10)]
results = Parallel(n_jobs=8)(delayed(f)(x,y) for x,y in params)
结论
多处理是一个很好的概念,每个数据科学家至少应该了解它。它不会解决你所有的问题,你仍然应该致力于优化你的功能。但是拥有它可以节省你等待代码完成的大量时间。
继续学习
如果你想了解更多关于 Python 3 的知识,我想从密歇根大学调出一门关于学习中级 Python 的优秀课程。一定要去看看。
将来我也会写更多初学者友好的帖子。在http://mlwhiz.medium.com关注我或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系。
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
这个故事最初发表在内置上。
如何衡量数据质量?
原文:https://towardsdatascience.com/how-can-i-measure-data-quality-9d31acfeb969?source=collection_archive---------10-----------------------
YData Quality 简介:一个用于全面数据质量的开源包。
格伦·卡斯滕斯-彼得斯在 Unsplash 上拍摄的照片
用几行代码按优先级标记所有数据质量问题
“每个人都想做模型工作,而不是数据工作”——谷歌研究
根据 Alation 的数据文化状态报告,87%的员工将糟糕的数据质量归因于为什么大多数组织未能有意义地采用 AI。根据麦肯锡 2020 年的一项研究,高质量的数据对于推动组织超越竞争对手的数字化转型至关重要。
根据 2020 年 YData 的一项研究,数据科学家面临的最大问题是无法获得高质量的数据。快速发展的人工智能行业的根本问题是显而易见的,现在人工智能最稀缺的资源是大规模的高质量数据。
尽管认识到了这一点,业界多年来一直专注于改进模型、库和框架。数据科学家通常认为建模是令人兴奋的工作,而数据清理是乏味的任务。被忽略的数据问题会在整个机器学习解决方案开发过程中造成不利的下游影响。
令人欣慰的是,我们已经看到了由吴恩达开创的范式转变,从以模型为中心的方法转变为以数据为中心的方法。我们正在见证以数据为中心的竞争,社区意识。我们正朝着正确的方向前进。
然而,问题依然存在;仍然缺乏行业就绪的工具来理解底层数据质量问题并加以改进。
我们对提高数据质量的执着
作者创作—原创图片由故事提供
正如你已经知道的,我们痴迷于解决人工智能行业的这个紧迫的数据问题。首先,我们开源了我们的合成数据引擎,并围绕它建立了一个社区。合成数据可以帮助创建高质量的数据,但现有的真实世界的杂乱数据会怎么样?
如果我们可以分析数据的标准质量问题,并提前按优先级标记它们,从而为数据科学家节省宝贵的时间,会怎么样?这就是我们今天想要回答的问题。
今天,我们很高兴地宣布YData Quality,这是一个开源的 python 库,用于评估数据管道开发的多个阶段的数据质量。
核心特征:里面是什么?
这个包非常方便,尤其是在开发的初始阶段,此时您仍然在掌握可用数据的价值。我们只能通过从多个维度查看数据来获取数据的整体视图。YData Quality 对其进行模块化评估——每个维度的特定模块,最终打包到一个数据质量引擎中。
质量引擎对输入数据执行多项测试,并根据数据质量发出警告。警告不仅包含检测到的问题的详细信息,还包含基于预期影响的优先级。
以下是 YData Quality 中核心模块的快速概述:
- 偏见和公*:保证数据没有偏见,其应用在敏感属性方面是公*的,法律和道德上有义务不区别对待(如性别、种族)。
- 数据预期:断言特定属性的数据的单元测试。利用远大期望验证,将其结果整合到我们的框架中,并检查验证的质量。
- 数据关系:检查要素之间的关联,测试因果关系,估计要素重要性,以及检测具有高度共线性的要素。
- 漂移分析:通常,随着时间的推移,数据可能演变出不同的模式。使用此模块,您可以在查看不同的数据块时检查要素(即协变量)和目标(即标注)的稳定性。
- 重复:数据可能来自不同的来源,并不总是唯一的。该模块检查数据中的重复条目,这些重复条目是冗余的,并且可以(或者应该)被丢弃。
- 标签:通过分类和数字目标的专用引擎,该模块提供了一个测试套件,可检测常见(如不*衡标签)和复杂分析(如标签异常值)。
- 缺失:缺失值会在数据应用程序中导致多种问题。通过本模块,您可以更好地了解其影响的严重性以及它们是如何发生的。
- 错误数据:数据可能包含没有内在含义的值。使用此模块,您可以检查数据(表格和时间序列)中数据点上的典型错误值。
我如何开始?
这是我们都喜欢的部分。启动您的终端并键入以下内容:
pip install ydata-quality
您可以在一个命令中安装所有的数据质量引擎。为了让您了解各种库的用法,我们提供了多个教程,以 jupyter 笔记本的形式呈现。
让我们向您展示一下我们的数据质量引擎是如何工作的:
下面是一个示例报告的样子:
从上面的输出中,我们注意到重复的列是一个高优先级的问题,需要进一步检查。对此,我们使用get_warnings()
方法。
只需输入以下内容:
dq.get_warnings(test="Duplicate Columns")
我们可以看到针对我们想要解决的问题的详细输出:
[QualityWarning(category='Duplicates', test='Duplicate Columns', description='Found 1 columns with exactly the same feature values as other columns.', priority=<Priority.P1: 1>, data={'workclass': ['workclass2']})]
根据评估,我们可以看到列workclass
和workclass2
完全是重复的,这会对下游产生严重的后果。我们必须删除重复的列,并根据其优先级转移到下一个确定的问题。
我们看到了该软件包如何通过提前标记细节来帮助数据科学家解决数据质量问题。此外,我们建议从本教程笔记本开始,本教程笔记本评估混乱的数据集的数据质量问题并修复它们。
有什么问题吗?加入我们专门的 社区 Slack 空间,问走一切。我们是一群友好的人,希望互相学习,并在这个过程中成长。
用改进的数据加速人工智能是我们工作的核心,这个开源项目是我们朝着有意义的旅程迈出的又一步。我们邀请你成为它的一部分——共同创造无限可能。
法比亚娜 是 CDOy data。
用改进的数据加速 AI。
YData 为数据科学团队提供首个数据开发*台。
NLP 如何影响少数民族语言的未来?
原文:https://towardsdatascience.com/how-can-nlp-impact-the-future-of-minority-languages-555b0fc80bd0?source=collection_archive---------75-----------------------
在过去的几年里,自然语言处理领域取得了重大进展,但这对少数民族语言意味着什么呢?
" File:wubi 86 keyboard layout . png "由仓颉 6 授权于 CC BY-SA 4.0
OpenAI 的 GPT-3 论文于 2020 年 5 月 28 日问世,成为 AI 自然语言处理领域的热门话题。其 1750 亿参数的 transformer 架构使其在专业和一般新闻中非常受欢迎,这要归功于一些开发人员迅速展示的大量应用程序,其中一些我在我的介绍性文章中列出了:
最先进的 NLP 模型是如何用不同的语言训练出来的?
让我们以 GPT 3 号为例。根据 GPT-3 论文,它在大规模数据集上进行了预训练,包括公共爬行数据集,它包含自 2008 年以来收集的数 Pb 数据,占 GPT-3 总训练组合的 60%,其中还包括其他数据集,如 WebText2、Books1、Books2 等..根据常见的抓取 github 信息,这是语言在数据集中跨文档的分布:
英语显然是语料库中的主导语言,占总文档的 40%以上,而第二大语言是俄语,占总文档的不到 10%。就母语人士而言,一些排名前十的口语显然没有被充分代表。以西班牙语为例,拥有 4.6 亿母语者(多于母语为英语者)的前 2 大语言仅占语料库中全部文档的 4%)。在下面的链接中,您可以找到另一个基于 GPT-3 训练数据集上每种语言的字符总数的统计数据:
https://github.com/openai/gpt-3/blob/master/dataset_statistics/languages_by_character_count.csv
那么,GPT-3 在管理英语以外的语言方面做得如何呢?在一个有趣的 reddit 帖子中,一位用户似乎对它如何设法学习 Python 等编码语言感到困惑,并收到了一位名叫 gwern 的用户的有趣回复,指出了另一个问题,即“GPT 的架构&数据处理如何影响它对各种事物的学习”。
同一个 reddit 用户写了一篇关于 GPT-3 的优秀文章,指出 BPE(字节对编码)的使用如何以不同的方式影响不同类型的语言(例如,分析型或合成型),从而引入了隐性偏见。您可以在下面找到完整的文章:
总之,尽管大量的训练数据使得像 GPT-3 这样的语言模型在几种语言中都很好,即使它们针对英语进行了优化和/或它们使用了一小部分非英语文档,但少数民族语言(甚至非少数民族语言)仍然处于很大的劣势。
对非英语语言的潜在影响是什么?
即使像 GPT-3 这样的语言模型不知道他们在说什么,我们的关系也正通过人工智能变得越来越数字化和自动化。NLP 模型在特定语言中的表现如何可能对其未来至关重要,因为在在线服务中,这些模型可能会越来越多地被那些更常用的模型所取代,因此在更新的机器学习解决方案中会得到优化。这就是为什么一些语言学院,如西班牙的 RAE (Real Academia de la Lengua)或当地政府,如加泰罗尼亚自治区政府,正在采取具体措施来解决这个问题:
https://www.rae.es/noticia/la-rae-presenta-el-proyecto-lengua-espanola-e-inteligencia-artificial-leia-en-el-xvi https://politiquesdigitals.gencat.cat/ca/detalls/ActivitatAgenda/20201210-projecte-Aina
虽然这些举措显示了意识,并且肯定是改善人工智能在非英语语言中的使用的良好步骤,但很明显,主要研究是用英语进行的。例如,在本文撰写之日,最新的多样化文本数据集之一,名为 The Pile,是一个 815Gb 的英语语料库。
NLP 给小众语言带来了怎样的挑战?下面的文章提供了一个很好的总结,集中在三个方面:
- 社会劣势的强化
- 规范性偏见
- 改进 ML 技术的语言扩展
结论
历史告诉我们,技术对于保持语言记忆的活力至关重要。也许这种技术最大的例子就是不同形式的书。我们所知的泥板、纸莎草纸和后来的书籍不仅是保存古代语言的关键,也是保存我们记忆的关键。
在另一个可能不太为人所知的故事中,中国在 20 世纪 80 年代面临一个巨大的问题,当时他们意识到它的 70,000 多个字符放不进一个键盘。如果他们没有用五笔输入法解决这个问题,40 年后中国还会是一个科技超级大国吗?没有得到足够 NLP 支持的语言在 40 年后会发生什么?
如果你喜欢阅读这篇文章,请 考虑成为会员 以便在支持我和媒体上的其他作者的同时,获得上的所有故事。
5 个步骤:建立一个帮助小企业成长的 SVM 模式
原文:https://towardsdatascience.com/how-can-support-vector-machines-help-grow-a-small-business-8e71561616ea?source=collection_archive---------21-----------------------
斯维特拉娜·古梅罗娃在 Unsplash 上的照片
Github 为此项目。
我们经常在数据科学和机器学习等领域听到“大数据”这个术语,尽管这个术语很常见,并且应用于我们的社会,但数据科学方法也可以在“小数据”方面发挥重要作用。那么,我们在哪里可以看到小数据呢?通常,它是在供应商和小型企业的场景中处理的。与公司或常规规模的企业相比,小型企业的客户和交易数量较少,这使得跟踪和分析客户数据以及了解客户行为变得更加容易。
在 5 个步骤中,我将介绍我创建的一个小型企业场景,以深入了解如何使用数据科学来发现客户行为的趋势,从而帮助企业发展。在我继续这个场景之前,我们应该知道什么是一类分类和支持向量机。
- 一类分类:使用正常数据创建和训练分类器模型,以在加入新数据时预测异常值
- 支持向量机:假设我们绘制二维数据,我们可以用一条线将这些数据分成两类。支持向量是该线附*的点,这些点设置了适当的边界,有助于将新点分类为离群点/内点。
作者图片
方案
我拥有一家花店,我希望人们买更多的向日葵,因为我有很多。所以,我想降低它的成本,但我不想降低太多,我可能会失去潜在的金钱;我希望降价幅度恰到好处,这样可以优化客户数量和我卖向日葵的收入。
步骤 1:收集/创建您的数据。
要在你销售的产品和客户反应/行为之间找到洞察力和趋势,第一步你需要数据。如果您想使用 SVM 进行一类分类,请创建随机数据。如果你想在现实生活中应用它,下载你当前的数据到一个. csv 文件中。
回到我的场景:假设我已经在很长一段时间内以不同的价格出售了向日葵,并且我将所有的数据合并成一个数据集。我的自变量(向日葵降价)将是我的向日葵降价的 200 个对象。我的因变量(客户响应)将是 200 个客户响应对象(1 =客户购买了向日葵,2 =客户没有购买向日葵)。
在现实中,小企业主不会知道客户何时会/不会购买产品的确切价格下限,但为了使该数据不完全随机,我设置了它,以便如果向日葵的降价≥ $3,客户会购买向日葵,否则,他们不会。下面是我的数据集的一部分。
作者图片
步骤 2:训练和测试集。
为了创建我们的基本 SVM 模型,我们需要将整个数据集分成两部分。训练数据集应该大于测试数据集。我们将使用测试数据集来看看我们的模型在最后有多准确。
对于我的场景,我的原始数据集的 70%用于训练,其余用于测试。我在 r 中使用了 sample.split()函数。
#df is my dataframe containing my 2 variables (lowered sunflower prices and customer response)split = sample.split(df$response, SplitRatio = 0.7)
train = subset(df, split == TRUE)
test = subset(df, split == FALSE)
第三步:创建支持向量机(SVM)模型。
为了建立我们的 SVM 模型,我们需要通过分别输入我们的独立(降低的价格)和非独立(响应)变量作为数据集来训练模型,这样函数就知道要训练哪两个变量。
为此,我将我的训练数据集分成 2 个变量,并将它们转化为因子(R 中的 svm()函数只接受因子)。
train_x <- train[-2] #take out the column with response
train_y <- train[2] #only the response column#turn into factors (below)train_y$response <- as.factor(train_y$response)
train_x$sunflower <- as.factor(train_x$sunflower)
现在,我们简单地将我们的训练变量放入 svm()函数,它将告诉我们在模型和参数信息中有多少个支持向量。
svm <- svm(data=train, train_x, train_y, type='one-classification', nu=0.10, scale=FALSE)summary(svm)
作者图片
理解 gamma、nu 和 kernel 值有点复杂,在实现最基本的 SVM 模型时没有必要。这些值可以帮助您在以后使 SVM 模型更加准确。
第四步:预测。
随着我们的 SVM 模型全部建立,我们现在可以通过输入训练数据集来测试我们的 SVM 模型有多强。
如果我输入我的训练数据集,R 中的 predict()函数将预测客户对数据集中给出的每一个较低价格的反应。我们应该只包括自变量(降低的价格)作为输入,这样 SVM 模型可以预测客户的反应。在此之后,我们将使用混淆矩阵来比较预测的客户响应和实际的客户响应,以了解我们的模型结果有多准确。
p <- predict(svm, test_x) #predicting test responses using the test independent variables (x)summary(p)
作者图片
上图中,TRUE 表示预测客户不会购买向日葵,FALSE 表示预测客户会购买向日葵。
第五步:混淆矩阵。让我们看看我们的 SVM 模型有多强!
这一步相当简单。我们需要将模型在上一步中做出的预测编译成数据集,并将预测和实际响应都转换成因子。我们还必须使响应类型相同,这样混淆矩阵就可以区分真/假和“1”/“2”,因为它们是不同的输出。
p <- as.data.frame(p)test_y$response <- as.factor(test_y$response)
p$p <- as.factor(p$p)levels(p$p) <- list("1"="FALSE", "2"="TRUE") #levels have to match the test data levelsconfusionMatrix(test_y$response, p$p)
作者图片
以上是我的混淆矩阵的结果,我的 SVM 模型的准确率约为 50%。这意味着我的 SVM 模型在 50%的时间里预测了正确的客户反应。即使看起来不多,许多小企业在开始时也会有较低的准确率。随着时间的推移,企业将为每种产品收集越来越多的数据,该模型将在预测客户反应方面变得更好。
此外,如果我将向日葵的价格降低了 3 美元,并想知道客户是否会购买我的向日葵,我可以使用 SVM 模型来预测单个值,这在我没有训练集的情况下会很有帮助。
p3 <- predict(svm, 3)
summary(p3)
作者图片
设想
我使用 ggplot 来可视化我的数据,但只要您可以选择显示客户反应的差异,任何东西都可以。
ggplot(df2, aes(x=X, y=sunflower, color=response)) + geom_point(size=5) + theme_ipsum()
作者图片
正如你从上面的图像中看到的,购买向日葵的顾客和没有购买向日葵的顾客之间有明显的差异(3 美元)。如果我把价格降到 3 美元以下,顾客就不会买向日葵,反之亦然。在现实中,这种分裂不会如此明显,但会有一定的模式,你可以用一种常见的方式找到它,如回归线。
结论
通过我简短的花店场景,我们学习了如何使用支持向量机(SVM)实现一类分类(OCC ),并创建了一个模型,该模型可以根据我降低向日葵价格的程度来预测客户的反应。任何有产品和客户的小企业场景都适用于这种模型,并且可以揭示关于客户行为的有价值的信息。这种 SVM 模型可以指出所有者需要关注的地方,以及他们需要营销什么来优化他们的业务。
感谢您的阅读!
如何才能让人工智能具有伦理性?
人工智能校准和安全
为了一个更加公正的世界,集体努力是必要的。
附身摄影在 Unsplash 上拍照
上周,我们在我的研究生院入门课程中完成了一项令人大开眼界的活动。在某些情况下,本课程旨在介绍人机交互(HCI)及相关领域的不同研究范式。我们在前半个季度讨论了高质量研究的高层次要素,最*还讨论了衡量学术研究的道德和可信度的方法。
在活动中,我们的教授让我们每个人分析一篇选择的研究论文,并写一篇 300 字的短文,讨论研究中直接出现或隐含的伦理问题。然后,我们将所有的文章汇集成一个小小的“虚拟杂志”,在阅读学术论文时,可以作为未来的快速参考。
最终的结果令人着迷,特别是因为我们能够发现许多伦理问题仍然存在于实际的、发表的研究中。以下是人们发现的一些问题:
- 根据一个不具代表性的小样本的数据做出一般性的断言
- 引用过时的研究
- 不尊重收集数据的隐私
- 对被边缘化的社区进行研究,但之后再也没有回来真正帮助那些同样的社区
- 使用不可靠的数据(例如,在 MTurk 上收集的数据没有正确衡量用户是否真正回答了问题)
我们的伪杂志故意泛泛而谈——在翻阅它时,我忍不住将所有讨论的问题与我自己的计算机科学背景联系起来。特别是,我考虑了上述问题中有多少与人工智能(AI)有关。
人工智能多年来一直是一个蓬勃发展的领域,但最*人们对道德人工智能越来越感兴趣。这是由于意识到许多当前存在的人工智能形式都有很强的偏见——例如,有证据表明[面部识别算法在肤色较深的人身上表现较差1。](https://sitn.hms.harvard.edu/flash/2020/racial-discrimination-in-face-recognition-technology/)
简·坎迪在 Unsplash 上拍摄的照片
这个问题源于人工智能算法的训练数据。当模型基于不完整或不准确的数据进行训练时,不管它有多好,它的预测能力总是很差。
这就是我们在课堂上做的活动。在这个过程中,我问了自己一个问题:在寻找符合伦理的人工智能的过程中,我们能扩展并建立这个策略吗?如果是这样,我们从哪里开始?
我相信答案是肯定的,我们从确定我的班级活动的一个重要方面开始,这使它非常独特:丰富多样的观点。
让我详细解释一下。我的研究生项目是跨学科的,接待来自不同背景的学生。在这个房间里,我们有专攻计算机科学、社会学、UI/UX、经济学、*面设计、公共卫生、数学等等的学生。我们探索的研究论文跨越了从信息可视化到价值论(哲学的一个分支,关注什么使事物有价值)的整个范围。正因为如此,我们能够创造出一种既具体又全面的杂志——具体的原因在于它让我们有效地探索当代研究中的伦理问题,而全面的原因在于它允许我们在一系列不同的研究领域中这样做。
这让我想到了我的主要观点:在研究的初始阶段纳入不同的观点对于创造人工智能的伦理形式至关重要。如果一个 AI 技术有偏差,那是因为底层数据也有偏差。很多时候,这可能是无意的,因为研究人员根本没有意识到他们的数据收集技术的缺陷。如果你不知道偏见,你怎么可能解决它?通过让来自不同背景的人参与这些算法的创建,我们可以确保最终产品是合乎道德和包容性的。
让我们回到面部识别技术的例子。上面链接的文章中提到的算法在深色皮肤的女性身上表现不佳。虽然我不能对设计这一算法的研究团队做出直接的声明,但有充分的证据表明,女性和有色人种在 STEM 领域,尤其是计算机科学领域的代表性不足。因此,由于团队自身的同质性,团队没有注意到其较差的训练数据并非不可能。
要让人工智能合乎伦理,就要从一开始做起。创建一个算法,然后回头考虑如何使它合乎道德和包容性,这是不够的。相反,我们应该在研究的初始阶段使用新技术,并将多种观点融入到我们的算法中。为此,我们需要两个关键因素:
- 包括来自所有社区的研究人员的研究团队,这将更容易确保产生的算法不是无意的歧视。
- 使用混合方法的研究团队——换句话说,结合从事创建和编程算法的数学工作的定量研究人员,我们需要能够设计更好的数据收集和分析方法的定性研究人员,这些方法考虑到人工智能的人类方面——而不仅仅是机器。
当然,这本身还不够——但这是一个开始。人工智能在*期没有放缓的迹象。如果我们不学会让它合乎道德,那么在 21 世纪剩下的时间里,等待我们的将绝不是好事。
参考
1 A .纳吉比,人脸识别技术中的种族歧视 (2020)。https://sitn . HMS . Harvard . edu/flash/2020/种族歧视人脸识别技术/
我们如何在交互式探索性数据分析后节省时间?
原文:https://towardsdatascience.com/how-can-we-save-time-after-an-interactive-exploratory-data-analysis-c9edfdb8d3e5?source=collection_archive---------25-----------------------
一款 Web 应用程序,可以带回家的不仅仅是一个数字
在你深入我的故事寻找“如何”的细节之前,让我节省你的时间,马上给你一个答案:
- 回答:你应该给用户样本代码,预先填入他们在玩交互式网络应用时选择的参数。
- 举例:最*,我创建了一个 web 应用程序“ Distribution Analyser ”,它允许用户交互式地探索连续分布,并使它们符合他们的数据,最终给他们提供图形和表格。此外,他们将收到预填充的 Python 代码以及他们选择的参数(或拟合结果),如下面的屏幕截图所示。
图一。从分布分析器中选择分布和生成代码的示例。左:用户选择了一个发行版(在本例中是 Beta 发行版),他们调整了滑块上的参数。右图:选择所需参数后,用户点击“生成 Python 代码”按钮,得到代码,他们可以保存并从左图重新创建图形。作者制作的图表。
使用 Streamlit 的 Web 应用程序
怎么开始的
有了一个 web 应用程序的想法,我开始搜索可以用来实现我的想法的工具(下次再讲)。在搜索的时候,我发现了一个开源的 Python 库 Streamlit 的存在,这是一个定制 web 应用程序的库,用它你可以"在几分钟内构建和部署一个应用程序"。几行代码之后,我有了一个基本的功能 app——我被卖了!
大约 1 周后
第一个功能“探索发行版”的早期原型已经准备好了,我正在向朋友们展示这个应用程序(Niko 和 Matthijs)。有时,他们会问“用户可以导出参数吗?”我的回答是“哦,是的,他们应该能做到!”
站在用户的角度,我意识到,尽管表中有参数值,但我仍然需要花费大量的时间和精力才能使用应用程序在 5-10 秒内重现结果。如果我可以交互式地探索,为什么我不能生成一些示例代码在其他地方使用这些结果呢?
如何在代码中生成代码?
Python 的回答: f-strings -简单而强大
F 字符串提供了一种使用最小语法将表达式嵌入字符串文字的方法。f 字符串是在运行时计算的表达式,而不是常数值。( PEP 498 )
在 Python 中:用一个 f 作为字符串的前缀,然后把你的变量放在花括号 {},中,当你执行代码的时候,那些变量会得到赋值。请参见下面的简单示例(f 字符串及其评估值以粗体显示):
platform = 'Towards Data Science'
author = 'Robert Dzudzar'
number_of_articles = 1example = f"**{author}** wrote **{number_of_articles}** article(s) for **{platform}.**"print(example)
# Returns: **Robert Dzudzar** wrote **1** article(s) for **Towards Data Science**.
如何在“分布分析器”中生成代码?
在应用程序中,用户使用小部件:他们选择一个发行版,然后使用滑块或输入框来调整发行版参数(每个发行版都有自己的一组参数)。来自 Streamlit 小部件的值被传递给一个生成数字的函数——那么我们为什么不能传递代码呢?
根据代码和参数,有时需要调整变量,使其在 f 字符串中具有所需的格式:
- 在 Distribution Analyser 中,为了向用户提供生成的代码,我需要变量名或它们的值,或者有时两者都需要,我通过简单的字符串操作来获得。一旦我得到了想要的格式,我就把它传递给 f 字符串(见下图)。创建的 f-sting 然后被传递到一个 Streamlit 按钮,当按下时它将打印出来。
下图显示了' Explore 发行版'中的 f 字符串与生成代码的并排比较(f 字符串及其值被突出显示)。以同样的方式,这样做是为了从最佳分布函数中获得代码。您可以在 GitHub 上找到完整的 web 应用源代码,并在 Streamlit Sharing 上随意使用和探索 Distribution Analyser 。
最后
多给用户省时省力。
对于 web 应用程序开发人员来说,只需在他们的应用程序中添加一些功能(至少如果他们使用 Python 的话),就可以制作出简单、可重复且随时可用的代码,作为分析结果的一部分提供给用户。拥有这样一个选项可以为用户节省数小时甚至数天的时间来记笔记和钻研源代码。
图二。并排比较用于分布分析器中的“探索分布”选项。f 字符串及其值在代码中突出显示。你可以在 GitHub 上找到完整的 web 应用源代码。 Left: 我创建了变量‘generate _ code ’,这是一个 f 字符串。在这个 f 字符串中,我放置了生成图形的整个代码,并放置了所有变量:选定的分布、分布参数以及它们在花括号{}中的值,这样它们就可以被用户通过小部件选择的实际值所替换。变量被传递给 Streamlit[ST . code(f " { generate _ code } "],后者将把它打印出来。右图:我展示了一个用户得到的生成代码(这是针对本文开头图 1 所示的函数)。作者制作的图表。
女性如何在数据分析领域重新开始职业生涯
办公时间
休息一段时间后,缓慢而稳定地前进——这个行业会一直存在下去
照片由丹妮尔·麦金尼斯在 Unsplash 上拍摄
我的职业生涯始于一名数据分析师。作为一个印度人,来自一个保守的中产阶级家庭,我的父母很早就和我结婚了。我搬到了我丈夫在印度南部的城镇,并放弃了工作。两年后,我成为了一名母亲,我的职业生涯刚刚开始。我没有一个强大的支持系统来帮助我抚养我的孩子,正如许多印度人会同意的那样,印度的日托设施甚至在城市里都达不到幼儿的标准。女儿 1.5 岁的时候我终于开始工作了。找工作非常困难,因为印度雇主在某种程度上认为职业中断的女性是一个借口,可以努力争取体面的工作和薪水。此外,长时间工作在科技行业是一种常态,因为可悲的是,大多数印度科技行业都在外包,在孟买这样的繁忙城市,每天上下班极其繁琐。
我重新开始已经有 7 年了,虽然这段旅程一直很艰难,但我在职业生涯中做得很好。我正在研究数据分析和数据科学的最新技术,如果我从我的客户和团队成员那里得到反馈,我很了解我的工作。科技行业的女性并不是一个容易的角色,我希望以下来自我的经验的建议能让像我一样也打算重新开始的女性的旅程变得容易:
1。 参加知名学院的全学分课程:
当你计划在分析/数据科学领域重新开始你的职业生涯时,记住这个领域已经很拥挤了。最*,似乎每个人都在谈论数据科学,好像数据从来没有被公司消费过。你必须明白,尽管你可能已经 20 多岁或 30 出头,但你将与一个可能擅长编写 Python、Scala、R 等代码的新人竞争同一份工作。
这些年轻的新生总是有额外的年龄和时间优势,他们会花时间从 Udemy、Coursera、Edureka 等网站上学习多门在线课程。
另一方面,你将在办公室和家庭之间周旋。我的建议是做一个完整的学分课程来获得优势。有许多大学与行业领导者合作提供数据科学方面的课程。我在 BITS Pilani 完成了我的 M.Tech 学位,主修分析学,相信我,没有一门网络课程能像一门完整的学分课程那样带来概念的清晰。
在你的简历上增加一个学位可能不会让你找到你梦想的工作,但是不断发展的技术中的新概念肯定会在你的面试中给你信心。此外,在你休息的时候,如果你觉得你失去了与志同道合、有着相同热情的人的联系,你将有机会与你的同学互动,他们也可以帮助你建立更好的关系网。
2.继续获得认证:
另一件有助于你的简历发光的事情是获得行业认证。虽然增加一个学位会提高你的技能,但在你的 Linkedin 页面上添加徽章和证书会增加你的个人资料被潜在招聘者列入候选名单的机会。
从 Coursera 获得一些数据科学课程的认证可能不会被视为参加 AWS 或 Azure 等行业认证课程,当然这取决于你在分析领域的个人资料。
3。 写博客,参加黑客马拉松,建立个人档案—
虽然上面这一点特别重要,但是我自己一直跟不上。如今,一个优秀的技术招聘人员不会对阅读你的两页简历感兴趣,而是想看看你在 Git hub 上的项目。在 say Medium 上撰写技术博客,在一份优秀的数据科学出版物上发表,在 Kaggle 等广受好评的黑客马拉松排行榜上得分,并在 Git hub 上开展自己喜欢的项目,这些都可以巩固你作为数据科学家的地位。
话虽如此,我了解并同情像我们这样的女性,她们在全职工作和抚养孩子后几乎没有时间。一个变通的办法可能是,不要一开始就太雄心勃勃。慢慢开始,在 Medium 和 Git hub 上创建一个配置文件,但计划在三个月内创建一个技术博客,等等。慢慢地,随着孩子的成长,你会有时间建立自己的档案。
4.选择一个领域,围绕它建立你的专业知识:
在数据分析中,领域理解起着重要的作用,因为更好地理解领域会导致更好地理解手头的数据。简而言之,技术专长和领域知识将帮助你更快地找到你梦想的工作。
在许多领域,领域理解变得至关重要,如银行、医疗保健、生命科学、制药等。这可能是一个你在年龄和经验方面有优势的领域。在休息前坚持你工作的领域,或者如果你想改变你的领域,随意去做,然后围绕那个领域长时间积累你的知识。
5。 从小处着手完全没问题:
休息一段时间后,你可能不会在第一次就找到你想要的职位/公司。这种偏离轨道的情况并不适用于那些休长假的幸运儿,他们相信自己会从离开的地方重新开始。
从小事做起是完全没问题的,即使这意味着满足于一份报酬很低的工作或者不那么有趣的经历。只要你在你感兴趣的技术或角色上工作,其余的就会到位,久而久之。
当我的孩子只有 1.5 岁时,我也面临过类似的情况,我希望在工作场所有更多的灵活性。我在一家非营利性机构担任了 5 年的技术经理,负责构建整个内部数据仓库,并从零开始建立商业智能堆栈。这与我目前从事的数据量工作相去甚远,但也是有意义的。它让我留在了这个行业,我在那里学习 R 编程,同时从事研究项目。此外,我的个人时间被占用了,今天当我回头看时,我觉得如果我没有在非营利组织工作,我会有一份更好的工作,但我真的很满意我花了这么多时间和我的小宝贝在一起,并一直在她身边。
6。 与长远来看会毫不犹豫推荐你的人建立关系网:
再说一次,尽管我认为这一点非常重要,但我并不十分擅长社交。原因,我是一个内向的人,我发现很难接触到人的参考。然而,我正在努力,虽然我不擅长在社交媒体上与人交流,但我与我在一个或另一个项目中工作过的人有着非常好的关系。所以,如果你也像我一样,在会议、训练营、研讨会等场合难以与人交流。,让你的工作和职业道德来说话。相信我,这对建立关系也大有帮助,人们确实会记住一个有很强的概念和专业精神的人。
我是由比我级别高的人推荐的。在我请求他们推荐我的几个月后,他们就记住了我,并不厌其烦地指导我。我加入了“数据科学中的女性”、“编码女性”、“Rladies”等团体。你也可以留意这样的团体,在那里女性在寻找合适的机会时会互相帮助。
7。 通过展示你的软技能来建立你的信誉:
这一点被低估了,但是相信我,在你职业生涯的一个阶段之后,这是关于人际交往能力的。职业道德和职业精神也是像我们这样有经验的专业人士比年轻人更有优势的领域。在这方面,您的团队领导和经理会对您有更高的期望。就项目交付而言,如果你不擅长某项技术也没关系,直到你展现出项目所有权、及时交付和良好的客户沟通等品质。
您的公司想要采用的任何新技术都将经历彻底的 R&D、概念验证、构建原型、成本审批,如果一切顺利,还将经历生产开发的周期。在这些步骤中的每一步,都会有各个层面的互动,需要协商、讨论,有时还会有分歧。将会有一些团队在没有或有一些自动化的情况下做同样的工作。告诉人们你做的都是错的并不容易,流程和技术的改变经常会给人们带来不安全感。这就是你的人际交往技巧至关重要的地方,如果通过谈判你可以让你老板的生活变得轻松,那就再好不过了。毕竟,你职业生涯中的任何中断都不能剥夺你的这种技能。
8。 工作无负罪感:
最后,女士们,不要内疚。你为了生活中重要的事情休息了一段时间,这些事情对别人来说可能重要,也可能不重要,但对你和你的家人来说很重要。你的职业无论多么重要,都不是你生活的全部,它只是你生活的一部分。所以,不管面试时雇主有多麻木不仁,不管人力资源人员在面试中对你有多势利,永远不要为你的休息时间感到抱歉。
我们女人总是有负罪感,因为不能延长工作时间而内疚,或者因为无论我们多么努力都错过了一些玩耍的日子、生日聚会、家长会而内疚。有些人因你的脆弱而茁壮成长,他们可能是你工作场所或家里的某个人。但在你的旅途中,你也会遇到支持你、重视你、指导你的人。乐观一点,即使事情对你来说进展缓慢,它们很快就会加快步伐。
LinkedIn 正计划增加“全职妈妈”和其他职位,以便父母和保姆更准确地描述他们的就业缺口。许多公司正在努力实现性别包容,并欢迎女性在休息后恢复工作。
希望这个博客也能给你一些有用的建议。祝我所有的分析师同事们一切顺利!!
很高兴收到您的回复和反馈。在 Linkedin 上与我联系!!
如何为您的公司选择最佳的数据分析*台?
原文:https://towardsdatascience.com/how-can-you-choose-the-best-data-analytics-platform-for-your-company-8706b16f4693?source=collection_archive---------51-----------------------
知道选择“有史以来最好的工具”的过程…给定已知的事实和偏见
有这么多的数据分析*台,选择一个正确的*台可能是一个漫长的过程,但你如何开始实际操作呢?
来源:memegenerator.net
在选择数据分析*台时,要做的第一件事是选择 选择标准 ,以便能够对它们进行比较。
这是非常重要的一步,因为选择的标准将决定最终的选择。在建立自己的选择标准时,以下是你必须考虑的因素:
- 已知技能、工具、公司战略
- 每种类型的用户所需的功能:数据分析师、数据科学家、运营人员…
- 价格
已知技能、工具、公司战略
根据贵公司的已知技能 ,用户友好标准和所需功能将有不同的含义。
来源:memegenerator.net—网络奶奶惊喜
对于一个习惯于编码的数据科学家来说,拥有一个可以拖放东西的工具会削弱他的交付能力,因为他可能无法构建库、对代码进行版本化、回到项目的旧版本或者必须学习该工具。
然而,对于没有编码能力的数据科学家来说,拥有一个工具来指导他们可能真的很有帮助。
贵公司的已知工具 会影响您要搜索的连接:云连接、数据库连接…
贵公司的战略 可能会引导您使用某种类型的工具,并带来新的选择标准:SaaS、基于云、开源…
此外,根据公司的战略,你可以为整个公司提供一个工具,或者为每个小的需求/团队提供多个分析工具。所有这些都将影响每一类用户所需的功能
各类用户所需的功能:数据分析师、数据科学家、运营人员…
拥有真正需要的功能并不是一件容易的事情,因为通常情况下,用户并不真正知道什么是可能的,他们需要什么,他们总是试图向自己保证该产品在几年内也会为他们工作。
来源:memegenerator.net
在这里,您可以找到一些您一定要解决的功能主题:
- 连接功能:*面文件、数据库连接、云连接器...
- 数据准备功能:标记、连接、排序等
- 数据科学功能:脚本和内置功能
- 数据可视化功能以及与数据可视化工具的连接
- 数据存储功能:实时、批量…
- 安全功能:认证类型、审计功能等
- 合规性功能:锁定数据、数据可追溯性、数据保留…
产品路线图
我认为这是最难评估的事情之一。一个很好的例子可以说明这有多难,那就是 CentOS 8 的生命周期在 2020 年 12 月被突然从 2029 年推迟到 2021 年初。这是一件需要很多科技手表来预测的事情,我们很容易错过。
来源:makeameme.org——路线图:祈祷我不要再改动它了
但是你需要考虑到这一点。选择一个今天对当前需求来说很棒,但是明天就过时的工具绝对不是一个好的选择。你需要了解产品路线图,以检查它们是否与你的公司战略一致。
价格
每个数据分析产品都有自己的价格策略:会话价格、用户数量、用户类型、机器大小、功能,应有尽有!
当然,你也可以拥有没有许可价格的开源产品,但这并不意味着它们是免费的。你有服务器成本,维护成本,等等。
来源memegenerator.net—产品价格
因为有许多不同的参数,所以您不能总是直接比较它们,比较它们的“简单方法”是检查对于您给定的用例,每个工具将花费您多少。
基于选择的标准比较*台
基于这些精心选择的标准,我们应该能够比较多个*台。然而,比较它们意味着选择比较什么*台。
如果你认为这是一项简单的任务,那就看看数据和人工智能领域吧
来源https://mattturck.com/data2020/—数据&艾景观 2020
对于这个任务,到目前为止我唯一觉得可靠的是:
- 查看 Gartner 魔力象限
- 查看数据&艾景观
- 对这个主题做更多的技术观察
- 与该领域的专家交流:已经做出这一选择的人和公司。
所有这些都会给你正确的知识,使你能够选择你应该比较的工具。如果没有,说明你做的技术观察还不够,多迭代就好了
涉及的团队和可能的偏见
来源:imgflip.com——最佳确认偏差
为一家公司选择工具并不是一件容易的事情,因为倍数偏差会造成干扰,而且很难克服所有这些:
- 确认偏差:当我们忽略挑战我们原有信念的信息时
- 当我们更多地基于感觉而不是证据时
- 结果偏差:当我们忽略一些决策过程,过度关注结果时。例如,我们可以关注这样一个事实,即我们将拥有一个产品的完整堆栈,而忽略一些想要的功能
我发现有一种方法可以帮助克服这种偏见,那就是尝试为多个人提供反馈,建立一个反馈循环。
要做的最后一个艰难决定
现在我们有了选择的标准和我们想要比较的工具,比较过程终于可以开始了!
来源https://knowyourmeme.com/photos/1364668-mary-sue:星球大战人物对比|玛丽苏
只要按照步骤去做,就能做出有史以来最好的选择,这太棒了。然而,我认为这是不可能的,我们只能根据已知的事实和已知的偏见做出最佳选择。
然而,不进行比较不会给我们带来克服偏见的论据,这意味着我们要靠运气而不是努力工作。
你怎么知道你的推荐系统好不好?
原文:https://towardsdatascience.com/how-can-you-tell-if-your-recommender-system-is-any-good-e4a6be02d9c2?source=collection_archive---------3-----------------------
行业笔记
离线评估的 12 个技巧,带航海弯
Charles Frodsham 的航海天文钟,可能是通过“离线”(或陆地)评估开发的。用户照片:Ktr101 — Ladd 天文台,CC BY-SA 4.0,【https://commons.wikimedia.org/w/index.php?curid=45968685
研究推荐系统是一个激动人心的时刻。它们不仅比以往任何时候都更相关,脸书最*投资了 12 万亿参数模型,亚马逊估计他们 35%的购买来自推荐,而且有大量强大的、尖端的技术和代码可供任何人尝试。
因此,工具就在手边,可以用来为用户提供个性化的推荐。问题是,知道它有没有用。
当约翰·哈里森正在开发海洋天文钟时,它通过允许船只精确确定其经度而彻底改变了长途海上旅行,他有一个评估问题:在实践中测量该设备的精度需要长途海上航行。同样,评估推荐系统的黄金标准也是昂贵且耗时的:一个 A/B 测试,在这个测试中,随机选择的真实用户会看到新模型,他们的行为会与看到旧模型的用户进行比较。在这两种情况下,如果这是唯一的评估方式,就不可能敏捷地尝试新的想法,或者快速地消除缺陷。
相反,有必要找到一种快速、廉价的方法来评估一个模型。在哈里森的例子中,他总是建造两个时钟,并在他的工作台上测量它们偏离的程度。这给了他一个精确的衡量标准,这反过来又让他能够快速迭代他的设计,并在一艘船出海之前达到非常高的性能水*——事实上,1736 年从伦敦到里斯本的第一次测试旅程表明他的发明是成功的。对于推荐系统,解决方案是离线评估,其中历史数据用于估计用户在某个时间点对摆在他们面前的一组不同的推荐可能会有什么反应,方法是使用他们后来真正做出反应的知识。
有了好的线下评估,当我们做出好的东西时,我们会知道的。相反,如果没有良好的离线评估,整个团队可能会在几周或几个月内完全不知所措。
出于娱乐和学习的目的,我正在为维基百科编辑(又名维基人)建立一个推荐系统,建议他们下一步应该编辑什么文章,这个系统叫做维基百科。我对时间和行动顺序的相互作用特别感兴趣,以预测某人在应用程序或网站上的下一步行动。我正在探索几种尖端的人工智能技术,以充分利用所有这些信息来源,但从我的科学背景来看,我知道首要任务是值得信赖的测量,在这种情况下是通过离线评估。
离线评估需要弄清楚如何建立一个有效的测试集,计算什么度量,以及与什么基线模型进行比较。我将在下面给出我的建议,侧重于对行业实用的东西,而不是学术出版物的更高标准,但首先是关于我的数据集。维基百科没有星级评定,也没有竖拇指/竖拇指,所以这本质上是一个隐含推荐问题,我感兴趣的信号是选择编辑一篇文章。基于用户的编辑历史,以及我可以获取的任何其他信息,我想建立一个他们兴趣的图片,特别是他们最*的兴趣,并学习对个性化的文章列表进行排序。
这是我的维基百科数据的一个例子,给我的瑞士朋友,他叫 Rama 。自 2004 年以来,他对维基百科进行了超过 45000 次编辑,并有非常具体的兴趣,主要是法国海军史和计算机技术。
一个用户编辑的原始数据样本,来自维基百科 API
利用维基百科的公开 API,我对英文维基百科所有用户的 100 万条最新编辑进行了采样,结果发现这些数据只有几天的价值。然后,对于样本中的每个编辑,我提取了他们最*一年的编辑,总共 2100 万个数据点。像这样的抽样只捕获在这一时期活跃的用户——首先,这多少会过多地代表最活跃的编辑,但这是我最感兴趣服务的人群。我做了一些基本的清理,例如删除编辑过多或过少的机器人和用户,然后建立我的训练集、测试集和基线推荐器。最终的训练集覆盖了 300 万个维基百科页面(总共约 630 万个页面)和 32,000 个用户。
(回购和笔记本全部代码)
提示 1:为了精心制作你的评估,首先要考虑推荐系统的目的
没有通用的度量或评估程序适用于所有用例。关于离线评估的每一个决定都取决于你使用推荐系统的目的。
你想为一个人做 3 小时的音乐 DJ 吗?你是想让人们注意并点击广告中的产品吗?当搜索者输入“绿色银行”时,你是否试图猜测他们想要什么?你想给订户安排一个合适的约会对象吗?
这将成为回答如下问题的基础:成功的衡量标准是什么?你到底是如何分离出测试集的?在不再有用之前,相关的东西可以放在列表的什么位置?重新展示他们已经感兴趣的物品有多重要?
就我而言,我把维基百科想象成编辑维基百科的副驾驶。一个个性化的列表,你可以浏览一下,为你可能想要编辑的下一篇文章提供思路。我还希望它能够灵活、持续地适应用户不断变化的兴趣。因此,我选择将我的评估集中在学习排序算法预测用户真正编辑的下一个页面的能力上。从短期预测的角度来阐述这个问题,使其成为顺序推荐系统的绝佳候选,在该系统中,用户行动的顺序和时间被明确建模。
与其预测下一个项目,我可以用一整周或一个月的后续活动来预测在那个时期编辑了什么,这将是一个多标签问题(并考虑到 Precision@K 等其他指标),但这将需要更多的数据,增加复杂性,并将重点转移到更长期的预测上。如果我的目标是捕捉用户更深、更持久的偏好,我会再次采用另一种方法,这种偏好预计会在他们与应用程序或工具的关系中持续存在。
要编辑的文章的快速菜单可能不应该超过 20 个项目,所以我选择了奖励将相关项目放在前 20 位的指标。首先,要看的基本指标是 Recall @20(也称为点击率,在这种只有一个相关条目的情况下):这个算法将下一篇文章排在前 20 名的频率有多高?
技巧#2:注意模型和位置偏差
当你构建一个推荐系统来替换现有的解决方案时,会有一个位置偏差(也称为呈现偏差)的问题:当前系统推荐的项目通常会被放在列表的顶部,或者在用户面前更加突出。这使得这些项目在离线评估中具有优势,因为无论客户在实践中如何反应,都有倾向于将它们放在顶部的模型。因此,简单的评估指标对现有系统来说是保守的,改进必须很大才能击败“历史推荐者”(真正向客户展示的排名列表)。
有许多技术可以对抗这种偏见,特别是反向倾向评分,它试图对不公*的优势项目进行建模,然后按比例降低它们的权重。另一种方法,虽然成本较高,但在生产中有一个“拒绝通道”,在那里不提供个性化推荐,并使用它来至少提供评估数据——它可能不会提供足够的数据来进行训练。最终的评估数据可能是呈现给部分用户的真正随机的项目列表,但即使一家公司能够承受可能的性能大幅下降,它也可能不想要那种信任破坏(见下文)体验!
幸运的是,就我而言,我不必太担心位置偏差。编辑维基百科页面是一个相当高强度的行为,所以人们只是因为文章就在他们面前而随意编辑文章是没有问题的。这些编辑与我的推荐系统无关(因为它还不存在),所以我不必担心先前模型偏差(一种呈现偏差)。可能存在受欢迎程度的偏见,人们争相编辑当天的热门话题,但正如我们将在下面看到的那样,这种偏见并不强烈。
技巧 3:小心挑选测试集
对于大多数推荐算法,可靠的评估需要留出一部分数据,并且仅用于该目的。我把我的推荐问题框定为一个预测问题,所以我把我的数据分为最*的行为和之前的所有行为。本帖中的基线算法(比如“最*编辑的”),都是无监督的,所以把历史数据看做“训练数据”,把下一个动作看做测试数据。然而,当将来我评估由监督的算法时,我还需要留出一个随机的用户样本,他们的历史和最*的编辑,来自相同的时间范围。
要点:确保你的训练集不与测试集重叠,并制作两个测试集,一个是开发集,可用于调整你的 hyper 参数,而不是用于最终评估。
技巧 4:使用考虑位置的指标
回想一下@20,前 20 个 rec 包含下一个被编辑的页面的频率,这是比较我的任务模型的一个合理、直接的指标。然而,通过考虑学习排序算法是否将相关项目放在排序的顶部,可以在更细粒度的级别上对其进行比较。这可以通过简单地绘制 Recall @ 1 到 N 来直观地检查,这可以揭示位置差异。
例如,对于数据的子集(“发现集”,稍后将详细介绍),BM25 模型具有较高的召回率@20,但是对于召回率@1,交替最小二乘法得分更高。BM25 的累积优势仅排在榜单的第 12 位。这可能表明 BM25 更擅长标记相关项目,但 ALS 更擅长确保最相关的项目出现在顶部。
在“discovery”测试案例上回忆 ALS 和 BM25 算法的@N 性能曲线
Precision@K 或 MAP 之类的指标对我来说没有帮助,因为只有一个相关的条目。还有一些我没有计算出来的指标,可能对区分算法很有帮助,比如多样性、覆盖率和受欢迎程度偏差。
提示 5:决定你是否关心发现,重新露面,或者两者都关心
许多依赖推荐的公司,如网飞或亚马逊,在他们的界面上为特殊菜单或最*访问过的商品开辟了空间。然后,他们的推荐算法可以专注于向用户提供他们从未互动过,但可能喜欢的项目:发现。另一方面,许多推荐系统只是想向用户显示一个包含有吸引力的个性化项目的列表,包括他们已经参与的重新露面项目:发现加重新露面。这种“单流”推荐的例子包括 Spotify 和 YouTube 播放序列、一些电子商务和广告。
决定重新显示项目的顺序是一个有价值的挑战,其中有许多细微差别,例如时间的作用以及如何决定用户是否考虑了某个项目并拒绝了它。它与电子商务应用程序非常相关,例如重定向。但是有简单明了的基线:简单地按照交互的新*性或者交互的数量来排序。
相比之下,在 discovery 中获得良好表现是一个更加开放的问题,需要努力找到一个合理的基线。首先,即使用户已经购买了数百件商品,也可能有数百万件商品没有购买。
但我真正感兴趣的一个挑战是如何在一个列表中最佳地结合发现和重现。虽然过去与某个项目的接触应该很有分量,但如果它是很久以前的事情或者非常不合时宜(我曾经在 Wayfair 上点击一张俗气的雕花木床,只是为了弄乱我妻子的推荐),一个全新的、有很高信心的推荐有时应该会击败它。
对于我的维基百科推荐任务,我既关心发现,也关心重现,所以我的评估需要反映这一点。许多维基人一遍又一遍地回到相同的文章,我的工具也应该使这变得方便,同时混合新的 rec,它有很高的信心那个人会喜欢。
因此,我将我的测试集划分为发现集和表面重现集,这取决于该用户之前是否编辑过目标最*的项目,并计算了我的所有指标,包括分别在这两个集上的 Recall@20 和 nDCG,以及组合的测试集。
通过查看原始编辑历史,我注意到一些影响我的训练和测试集的东西,那就是人们经常连续编辑两次或更多次文章。通常这些只是为了纠正他们刚刚编辑的一个错别字。在我最初的数据集中,我发现 35%的编辑是针对前一页的,所以推荐最后编辑的文章太容易了。这也不是很有用,因为该页面可能仍然在用户的某个选项卡中打开。因此,我更改了我的训练集和测试集,以删除块中的重复编辑。我重新定义了我的任务和评估,那就是:预测下一篇被编辑的不同的文章。这是一个更困难的任务,我的指标也相应下降。但是,当我考虑推荐质量时,这个任务更能反映我的意思。
在删除运行的编辑后,我的训练集是 30%的重新出现案例和 70%的发现案例。这种混合可能会影响模型的预测,因此通过下采样或上采样来强调其中一个可能是有意义的(也可能值得尝试为每组案例训练单独的模型)。但重要的是分别评估它们,了解整体性能来自哪里,以及是否以牺牲另一个为代价来强调一个。
技巧 6:为比较实现强大、简单的基线
“我建立了一个深度学习推荐器,它有 27 层,5 亿个可训练参数,它很宽,很深,它有 inception,autoencoder 和 transformer 组件。”
“那它做得怎么样?”
“嗯,它有 0.4 nDCG。”
…这样好吗?即使在学术机器学习的细致世界中,也有几个创新模型无法与常识基线相比较的高调案例,当它们与常识基线相比较时,也无法击败它们——这被称为“幻影进展问题。即使这不是一个新的、实验性的模型类型,未能超越简单的基线也是一个很好的迹象,表明实现出现了问题。
确定您是否取得了进展,并理解您的度量标准的唯一方法是实现一些基本的推荐器——选择哪一个也取决于问题。
我想出了三个非常基本的方法来预测下一篇编辑过的文章:
- 人气:过去一年最受欢迎
- 最*:该用户最*编辑的
- 频繁:该用户在去年最频繁编辑的内容
然后我实现了一些稍微聪明一点,但仍然很好理解的协同过滤算法,它有成熟的、易于使用的 Python 包(特别是隐式包):
- BM25: Okapi BM25,JAC card 与 TF-IDF 相似性的一个简单变化,即通常会有更好的结果
- ALS: 隐式训练数据的交替最小二乘矩阵分解,带 BM25 预缩放
对于这两个项目,我还计算了“过滤”推荐,删除了用户之前编辑的所有页面,因此推荐了 20 个有价值的纯发现项目。后两者使用了相同的精简训练数据:用户-项目交互计数矩阵(300 万乘 32,000 个条目,由于 SciPy 稀疏矩阵,加载到我笔记本电脑的 RAM 中仍然非常实用!)
实现简单基线的另一个主要好处是,它可以让您在数据准备和模型评估管道的每一步都踢轮胎,本质上是评估评估。如果度量标准,比如说,最*与流行度没有意义,最好在这个阶段找到它,而不是在试图解释一个更复杂的模型的结果时。我发现我的评估中至少有一个大的 bug!
技巧 7:检查“反托拉斯者”
一旦我有了我的第一套推荐算法,我会特意留出时间查看这些推荐——仔细阅读结果,看看它们直观上看起来有多好,并对算法如何因人而异有一个定性的了解。
我特别寻找的是网飞团队称之为“反托拉斯者,或者另一个团队称之为“WTF @ K”的东西:给用户的建议,这些建议来自如此遥远的领域,看起来就像是一个小故障。
对于 Rama 来说,只有人气推荐者有明显的信任破坏推荐,我碰巧知道他对一些话题不感兴趣,比如 Zach Snyder 的正义联盟。ALS 和 BM25 算法严重依赖于表面重建,这对一个 17 年的网站老手来说是有意义的。当新的页面被强制时(“过滤”的推荐),他们通常给出看起来安全的海战和法国船只的选择。在下表中,重新显示的页面以粗体显示,数据集中正确的下一页为红色。
七个基线推荐者对 Rama 的 10 大维基百科页面推荐。粗体条目是之前编辑过的,红色是下一次编辑的目标
有趣的是,只有最*的推荐者进入了前 10 名。
除了 Rama,我还滚动了大量其他随机选择的用户的推荐,他们有超过 50 次的编辑。事实证明,就像我的朋友 Rama 一样,许多维基百科编辑都有相对较小的“节拍”,我们至少应该能够为他们提供推荐。例如,编辑金加蒂最关心的是漫威的电影和电视剧,大多数算法都注意到了这一点,尽管方式不同。有几个人还正确预测了金加蒂接下来会编辑《漫威女士》(电视剧)。然而,ALS 的最高推荐是一部相当晦涩的 2003 年西部连续剧《和*缔造者》,它可能会构成一部信任破坏者。
7 个基线推荐者对 KingArti 的 10 大维基百科页面推荐。粗体条目是之前编辑过的,红色是下一次编辑的目标
在我的观察中,BM25,当没有被过滤时,比 ALS 更倾向于表面重建,这后来被定量地证实了。
技巧 8:花时间优化你的评估代码是值得的
在这一点上,我会注意到,你将会一遍又一遍地运行评估代码,比你所能想到的还要多,而且你能使这个循环越紧密,找到你的最佳模型的过程将会越快越有趣。现在是时候通过使用 Spark、多处理或 joblib 等并行计算工具来利用所有可用的并行计算了,无论是在云中还是笔记本电脑上的多核。有一些包,比如摩丁,试图让简单的熊猫并行化,所以这些包可能值得一试。
我选择隐式库是幸运的,但也是有目的的,因为它是高度优化的,本质上是并行的。尽管如此,我还是令人尴尬地花了很长时间才意识到有一个recommend_all
函数比在每个例子中运行recommend
要快得多。如果您使用 Scikit-learn,许多操作都有一个n_jobs
参数——确保将其设置为-1,它将在您的所有内核上并行化。
除了并行化,这是一个很好的机会来更好地理解事情是如何在幕后计算的,并投资于矢量化和重构依赖于 Pandas 的繁重工作负载,这通常非常慢。当我重新编写我的回忆曲线函数来使用列表理解而不是DataFrame.iterrows()
时,每次评估从 2.5 分钟变成了 4 秒钟,这产生了巨大的差异。
提示 9:确保你的评估是可重复的
一种可怕的感觉是回去重新计算指标,发现在相同的测试集上相同的模型产生了完全不同的分数。我防止这种情况的两个建议(我并不总是遵循)是:
- 同时检入您的模型代码、评估代码和评估结果,以便它们匹配
- 遵循这种模式,而不是投资于数据版本化工具,将数据集视为一次写入,然后对管道的每一步进行版本控制,以清理和转换数据,从而生成您的训练集和测试集。
技巧 10:调整你的基线,但仅限于某一点
对测试集计算的所有基线算法的度量,按 Recall@20 排序。因为不是所有的用户在他们的历史中都有 20 次编辑,所以他们的 rec 被填充了流行的页面,所以最*和频繁的重铺并不是 100%
毫不奇怪,当谈到整体指标时,最*很难被击败——人们确实倾向于一次又一次地返回来编辑相同的页面。但是发现测试子集,其中最*的没有用,更有趣,这些回忆和 nDCG 分数帮助我区分协同过滤技术。
提出改进这些基线的想法是很容易的。例如,我可以采用频繁算法,并尝试将它限制为过去 30 天内最频繁的算法,引入时间元素。对于最*,我只能包括最*编辑的项目,这些项目至少被编辑了 5 次,或者编辑超过了一定的大小,例如 20 个字符。但是这些都是手工调整的试探法,这正是我们在 ML 项目中试图摆脱的。如果你不是在一个试图展示渐进改进的学术环境中,就停留在一些简单易懂的东西上。
然后是稍微不那么愚蠢的基线,它有可调的超参数,但很少——BM25 和 ALS 有两个,尽管我为隐式因子分解添加了 BM25 缩放,增加了两个超参数。但是四个仍然比最简单的神经网络的超参数数量少得多!我运行了几个长网格搜索来挑选最终设置(对于 BM25,K1 = 100,B = 0.25),但并不太担心绝对完美的磨练。
令人惊讶的是,我最看好的算法,使用 ALS 的隐式矩阵分解,在 discovery 中的表现并不是最好的。相反,更简单和更快的 BM25 方法击败了它,无论是在发现集上过滤到新项目时(在 nDCG 上通过 240% )还是在未过滤时的整体集上。我仍然有可能找到超参数的正确组合,甚至是一个不同的包,这将突然提供一个突破,但这只是一个基线,还有更强大的算法我渴望尝试。
受欢迎程度确实非常糟糕——几乎在所有指标上都垫底,这与我通过查看具体例子对这个特定数据集的直觉相符。在维基百科上,人们通常会编辑他们自己的特殊兴趣,而不是插话讨论当天的问题。
技巧 11:有了好的评估指标,你可以尝试简单的解决方案——这可能正是你想要的
测试所有算法在 discovery 和 resume 示例集上的性能。虚线展示了交织算法优于许多其他算法的帕累托最优
这听起来可能与技巧 10 关于不要过多修改基线相矛盾,但事实并非如此!
如果我不得不在本周发布一个维基百科推荐算法,并且它必须擅长发现和重新浮现,我可能会尝试简单地将最佳重新浮现(最*)和最佳发现算法(BM25 过滤)交错,在我进行的过程中删除重复的。对于我的数据集,我发现我得到的离线召回@20 比所有其他模型都好,除了 BM25 在 discovery 中过滤,在表面重建时只比最好的模型差 11%。此外,它显然帕累托优于任何其他试图*衡重新露面和发现的解决方案。
从 Rama 和 KingArti 的交叉推荐中,我也很清楚它是如何有用的。
交叉推荐的 Rama 的 10 大维基百科页面推荐。粗体条目是之前编辑过的,红色是下一次编辑的目标
KingArti 对交叉推荐器的 10 大维基百科页面推荐。粗体条目是之前编辑过的,红色是下一次编辑的目标
当然,这是一个黑客,但这个交错输出是一个单流推荐器,很容易得到正确的,产生高度可解释的 rec,并在生产中运行非常快。对于之前没有个性化的第一个系统来说,类似这样的东西可能是一个很好的选择——除非你经历过,否则你不会相信在生产哪怕是最简单的 ML 模型时会有多少意想不到的挑战,特别是如果它需要实时服务 rec 的话。
提示#12:如果可能的话,从用户那里获得定性的反馈
你有没有跟你的 Spotify Discover Weekly 或者你的网飞流派旋转木马顶嘴过?我有!我注意到我和我的朋友在生活中与推荐系统有着亲密的、固执己见的关系。当 rec 好的时候,尤其是当它们不好的时候。我们判断 rec,我们试图找出它们,我们甚至试图有意识地塑造它们,使它们更接*他们想要的和期望的。理想情况下,你可以将这种定性反馈作为你离线评估的一部分。
许多组织没有一个用户体验部门,作为建模者,你可以进入这个部门——尽管这值得一查!但即使如此,从已经是用户的朋友和亲戚那里获得非正式的反馈也是一个好主意,尤其是如果你可以向他们并排展示不同的推荐输出。我给 Rama 发送了这 7 个基线的输出,他写道“BM25_filtered(流行和他熟悉的文章之间)在这些极端之间取得了良好的*衡”,还说“系统显然正在找到与我的兴趣和能力相关的主题。”有趣的是,他还记得编辑过过滤列表中的许多页面,这意味着要么他是在一年多前编辑的,要么就是这么好。
最后一个长期想法是:离线评估可能无法完美预测 A/B 测试结果的原因有很多,但如果你小心谨慎并补偿一些偏差,希望它至少可以预测结果的方向:离线看起来像赢家的模型在线上也是赢家。然而,如果您在多个 A/B 测试的过程中保持认真的记录,您最终可以估计您的离线指标预测测试结果的程度,甚至可以猜测 nDCG 改进的成功程度。最重要的是,它会显示你的离线评估中是否有系统性的偏差。
现在,我的 WikiRecs 基线已经就绪,当我用更强大的机器学习算法击败它们时,我将确切知道我为了这些收益在增加的复杂性和性能方面牺牲了多少。而且,就像海洋计时器的创造者一样,我很清楚更昂贵的验证测试将会如何进行——远在帆展开之前。
CatBoost 如何编码分类变量?
原文:https://towardsdatascience.com/how-catboost-encodes-categorical-variables-3866fb2ae640?source=collection_archive---------8-----------------------
CatBoost 的一个关键要素是从头开始解释
钱德勒·克鲁登登在 Unsplash 上的照片
CatBoost 是 Yandex 研究人员开发的一个“相对”新包。它现在非常受欢迎,尤其是在 Kaggle 比赛中,它通常比其他梯度树提升库表现更好。
在其他成分中,CatBoost 的一个非常酷的特性是它可以开箱即用地处理分类变量(这就是该算法的名字)。
当使用一个实现时,真正理解它是如何工作的是很重要的。这是本文的目标。我们将深入研究这种被称为有序目标统计的技术。假设你对梯度树提升有很好的理解。如果没有,看看我关于这个主题的文章。
介绍
梯度树提升是 shelve 家族中处理结构化数据最好的算法之一。这个算法家族起源于 boosting 方法,这是过去 25 年中引入的最强大的学习思想之一。1997 年由 Yoav Freund 和 Robert Schapire 推出的 AdaBoost 是这种方法的第一个实例。那年晚些时候 Leo Breiman 意识到提升可以转化为一个具有适当成本函数的优化问题,这催生了 2001 年 Jerome Friedman 的梯度提升。从那以后,带树的 boosting 方法又出现了很多新人,分别是并且按照出现的顺序, XGBoost —极限梯度 Boosting(2014)light GBM(2016)CatBoost(2017)。
目前,梯度提升也可以与神经网络结合使用,或者集成结构化的附加知识,或者只是为了提高性能。在这方面, GrowNet 的作者介绍的一项技术看起来非常有前途,在这项技术中,弱学习者被浅层神经网络所取代。
分类变量编码
不过,有一点需要注意,我互换使用了术语类别、级别或因子(在本文中,它们指的是完全相同的东西)
你可能已经知道,机器学习算法只处理数字特征。所以假设你在尝试预测一辆二手车的开航价格。在可用的特性中,你有汽车的品牌(丰田、本田、福特……)。现在,为了在您最喜欢的梯度提升算法中使用该功能(这肯定会对航行价格产生影响),您需要将品牌转换为数值,因为该算法需要对品牌进行排序,以便枚举拆分可能性并找到最佳的一个。
作者图片
好吧…但这听起来更像是对决策树机制内部约束的技术论证。如果我们认真思考一下,当把分类变量转换成数值变量时,我们要做的是什么?好吧,我们可以试着面对,在同样的尺度上,目标的分类价值,来想象这个问题:
作者图片
当可视化这样的事情时,我们的目标是揭示在预测目标时出现在类别中的排序强度,这变得更加明显。理想情况下,我们希望在测量中反映有序性以及我们的不确定性。
作者图片
在第二个示例中,品牌相对于销售价格的顺序非常清楚。但是这种排序甚至可以更强,如下面的第三个示例所示:
作者图片
为了介绍 CatBoost 中使用的技术,我们将首先介绍几种经常与决策树结合使用的分类编码方法。
一键编码
作者图片
这个想法很简单。您用虚拟变量(每个不同的类别一个变量)替换分类特征。虚拟变量是指示特定因子存在(值 1)还是不存在(值 0)的变量。您也可以决定其中一个因素不包含虚拟变量。
强烈建议最后一点,以避免多重共线性问题,并且在线性回归的情况下是强制性的,否则 OLS 估计量将不存在(由于完美的共线性,输入矩阵将不是满秩的,Gram 矩阵将不可逆)。
当与线性模型结合使用时,这种技术的好处是您可以为每个级别获得一个系数。每个系数都可以解释为相关类别与参考水*(没有包括虚拟变量的参考水*)相比的影响。
但主要的问题是,每个因素都有一个额外的变量。如果你有很多不同的类别,你将会遭受高维数的问题。在这种情况下,当与决策树或决策树集合一起使用时,因为您的虚拟变量将主要包含零,所以它们将非常不*衡。为分割选择一个特征时,虚拟变量被忽略以支持其他预测值的可能性更大。发生这种情况是因为当选择该特征用于分割时,相关的信息增益(分类情况下的熵减少和回归情况下的目标方差减少)可能会更小。当然,这种说法并不总是正确的,因为分割的性能将高度依赖于目标相对于感兴趣类别的分布。
让我们用一个简化的例子来形象化这个想法。我们有 10 个观察值(10 辆不同的汽车),我们试图预测其售价(在€)。在第一种情况下,每辆车都有不同的品牌,销售价格是均匀分布的。如果我们选择一个虚拟变量进行分割,会发生什么情况:
作者图片
在这个例子中,左叶中的目标方差非常高,因此这个分割展示的方差减少是非常蹩脚的(因此这是一个糟糕的分割)。当然,丰田品牌的目标分布可能完全不同,如下所示:
在这种情况下,分割更好,但是如果没有丰田的观察,目标方差将已经非常低。这意味着除了正确预测一个异常值之外,分类特征的预测能力相当弱。总而言之,我们更感兴趣的是,当特征与目标有意义地相关时,编码方案展现出强大的预测能力。
现在让我们看看当我们只剩下两个品牌时会发生什么(坚持销售价格均匀分布的情况)。我们展示了从一个极端到另一个极端的三种不同场景:
作者图片
所有这三种情况都导致了相同的*衡树,但是它们在目标方差减少方面并不完全相同。左边的方案提出了最低的方差减少量,右边的方案提出了最高的方差减少量。因此,我们从这个例子中看到,通过减少可能类别的数量,我们现在可以想象目标方差减少很重要的情况。
最后,要记住的是,在大量级别的情况下,使用一次性编码可能不是最好的转换,因为它降低了分类变量在最终模型中的重要性。相反,如果您有少量的级别,这种技术仍然非常有效。这就是为什么在 CatBoost 中,有一个超参数( one_hot_max_size )来配置使用单热编码的类别数量,而不是我们在本文稍后描述的主要技术。
梯度统计
这项技术是由 lightGBM 引入的。基本思想是根据依赖于成本函数的梯度的每个分割处的训练目标对类别进行排序。为了正确理解这种技术,需要理解梯度推进的机制。如果你觉得你需要复习一下,你可以看看我关于这个问题的文章。
首先,不是在训练之前对类别进行一劳永逸的编码,而是在训练过程中进行编码。在节点的每个分裂决策中,类别按照它们在该节点中(相对于目标)的权重的误差量(使用*方梯度作为代理)排序。
请不要认为残差(y-ŷ)等于梯度。只有在执行*方误差损失的回归时才会出现这种情况。如果使用另一个损失,我们不能做出同样的假设(我们依赖伪残差)但想法是完全一样的。
所以我们来直观的解释一下到底是怎么回事。假设我们正在构建一个弱学习器(回归树),并且已经为第一次分割选择了数字特征“里程”:
作者图片
现在我们想从树的左侧节点开始构建第二层。在这个例子中,品牌分类特征似乎提出了最佳分割。让我们看看我们是如何得出这个结论的。进行了以下操作:
- 我们计算了这个节点的每次观测的电流梯度
- 我们按类别对*方梯度求和,并使用该统计量对类别进行排序
- 评估了梯度统计的分割可能性。其中一个分割声称总体目标方差减少最好,因此被选中
让我们放大左边部分,看看发生了什么:
所以总的来说,这种技术非常好,因为它在每次分裂时根据它们的预测目标对类别进行排序。但是它有一些缺陷,引用 CatBoost 的作者在他们的论文中的话,它增加了:
(i)计算时间,因为它在每个步骤为每个分类值计算统计数据
(ii)基于分类特征为每个分裂存储哪个类别属于哪个节点的内存消耗
随着不同类别数量的增加,这个问题变得更加严重。为了克服这一点,在 lightGBM 中,他们将尾部类别分组到一个集群中,但因此丢失了部分信息。此外,作者声称,在建模之前,最好将基数较高的分类特征转换为数字特征。
请注意,与 lightGBM 中实际发生的情况相比,这个解释是简化的。事实上,他们使用一种称为二阶损耗*似的技术(由 XGBoost 引入)来计算损耗和最佳分割。因此,他们并不完全使用梯度(一阶)对分类值进行排序,而是使用损失的一阶和二阶导数之间的比率。如果你想了解更多关于这一点的信息,可以看看这篇关于这个问题的好文章。
目标统计
正如我之前所说的,我们想要从编码方法中得到的最重要的特征之一是,它应该反映类别相对于目标的排序。因此,一个简单的想法是用以下任一项替换分类特征 x 的值:
- 以类别为条件的目标期望值(在回归设置中)
- 以类别为条件的肯定类别的预期概率(在二进制分类设置中)
- m 类分类任务的 m-1 个新变量。每个新变量都将被构建为一个二元分类任务。
在我们的例子中(回归),这将给出:
作者图片
假设我们有以下观察结果:
作者图片
编码将产生以下计算:
作者图片
这又会产生以下结果:
作者图片
此外,除了使用经验期望值(*均值),还可以使用其他统计数据,如中位数、众数、方差或基础分布的高阶矩,这些统计数据将为编码提供不同的属性。
这种方法在统计学上是合理的,并且保留了分类变量的大部分预测能力。但它并不完美。一个常见的问题是,对于基数较低的类别,估计不够稳健。为了解决这个问题,我们通常添加一个加权先验。特定分类变量 x 的类别 k 随后被替换为以下值:
p 是先验的,例如,我们可以使用总目标*均值。α是调节先验强度的超参数。我们之所以讨论先验,是因为这种*滑结果的方式可以被认为是贝叶斯目标编码方法的频率等价物。我们引入一个关于感兴趣的统计量的先验信念,并注入一个特定的先验量。α也可以是一个由类别基数和数据集大小参数化的函数,这样您就可以根据类别是否被更多或更少地表示来使用更多或更少的先验。
请注意,我们在训练数据上计算统计数据,并同样在测试集上使用它们。如果来自测试集的类别在训练集中不存在,我们使用在完整训练集(没有条件)上计算的统计(均值、中值、众数等)。
但是这种技术存在一种被称为目标泄漏的情况。单独使用目标来编码变量必然导致这样一种情况,即所学习的关系过度符合训练集的特性。如果使用测试集计算,以使用训练集计算的目标值(x|y)为条件的分类变量的分布将不一定相同。这导致了预测的转变。为了说明这个问题,我们将使用一个从的 CatBoost 论文中借用的极端例子。
所以假设我们正在解决一个二元分类问题(这个车下个月到底卖不卖?).我们只有一个预测器,那就是汽车的品牌。为了确保目标和特征之间绝对没有关系,我们使用概率 p=0.5 的伯努利试验随机分配标签(0 或 1)。此外,我们确保每次观察都有一个独特的品牌。很明显,绝对没有比随机猜测更好的预测模型了。让我们看看 10 次观察会发生什么:
作者图片
为了简化我们的例子,我们在编码方案中没有使用先验。编码的特征根据相关联的目标获得值 0 或 1。但是发生了什么?嗯,我们得到了一个完美的分裂。杂质(熵)的减少是最大的,因为叶子中的所有观察结果具有相同的目标标记。因此,在训练集上,预测精度是 1.0(我们总是预测正确的标签)。但是,一旦我们切换到测试集,鉴于目标标签是随机分配的,错误率将会高得多,很可能等于随机猜测。
当然,这个例子是极端的,但它强调了这样一个事实,即通过使用我们正在执行编码的观察的目标,我们将预测信息泄漏到特征中。并且该信息可能与其他类似的例子无关。对于低基数类别,问题更严重。
k 倍目标编码
为减轻特征泄漏问题而引入的这种技术在众所周知的交叉验证过程中找到了根源(发明这种技术是为了对抗过度拟合)。所以我们把数据集分成 K 个折叠。我们遍历每个折叠,并使用来自 K-1 个剩余折叠的数据计算当前折叠的目标统计。当 K=2 时,这种技术的一个特例称为保持目标编码。这种技术的缺点是,它会显著增加训练时间,并且我们没有使用完整的数据集来计算增加偏差的统计数据。
留一目标编码
这一次,我们将交叉验证方案推进了一步,试图使用尽可能多的数据。该技术也可以被称为 N 重目标编码(N 为观察值的数量)。对于每个观察,我们通过仅从训练数据中移除当前观察来计算目标统计。这种技术比 K-fold 目标编码更好,因为它几乎使用了完整的数据集,因此以增加计算预算为代价得到了更准确的统计数据。
有人可能会认为这种技术可以防止目标泄漏。但事实上,并没有。我们将用一个简单的例子来演示它。因此,让我们说,我们回到我们的二元分类问题,有 10 个观察值。这一次我们有 7 个积极的观察和 3 个消极的,但最重要的是分类变量只有一个独特的品牌。我们知道这样的特征是无用的,因为它没有任何预测能力。这里的问题是,当我们计算统计数据时,我们只有两种不同的情况,要么我们遗漏了 1,要么遗漏了 0。因此,编码特征仅有的两个可能值是:(7–1)/10(当我们忽略 1 时)和(7–0)/10(当我们忽略 0 时)。我们得到以下结果:
作者图片
我们又一次得到了完美的分割,这意味着我们完美地对训练示例进行了分类。但是我们知道这个特征是没有用的,因为对每一次观察都完全一样。对测试数据使用这个树将会失败。因此,通过这个简单的例子,我们表明目标泄漏问题是留一目标编码的一个问题。
泄漏分析
作为一般的经验法则,当一个人可以通过以一种不能使用测试数据再现的方式利用训练数据来更好地了解目标值时,就会发生目标泄漏。它可以是任何东西,比如训练数据分布的特性、与特定目标值相关联的时间戳特性,或者我们执行特征工程的方式,比如留一目标编码。在上面的例子中,因为我们正在解决一个二进制分类问题,编码只产生两个不同的值,因此编码值自动显示目标。此外,正如细心的读者可能会猜测的那样,在 K 折叠目标编码中,我们从训练折叠中移除的观察值越多,目标泄漏就越不重要,因为我们越不能从编码特征中推断出目标,但同时,我们在预期估计中也越不准确。
现在,有没有一种方法可以消除目标泄漏,同时使用所有的训练数据?答案是肯定的,继续读下去。
有序目标统计
最后,我们到达由 CatBoost 引入的编码分类变量的过程。至此,我们已经展示了引导有序目标统计开始的驱动因素。
- 使用目标编码类别可以创建一个强大的预测器,但是…
- …它还会导致目标泄漏,因此应谨慎使用。避免这个问题的一个方法是在一个单独的保留数据集上学习统计数据,但同时…
- …我们希望编码的统计数据尽可能准确,这意味着我们应该使用尽可能多的相关数据
如果我们有无限的标记数据,我们可以为每一个观察,从人群中抽取一个大的新样本,并学习感兴趣的统计数据。但是我们没有那种奢侈,所以我们需要别的东西。基本原理非常简单,灵感来自排列测试和在线学习,即观察值按时间顺序到达。
所以我们从画一个随机排列顺序开始。然后我们按照新的顺序依次重复观察。对于每个观察值,我们只使用我们过去已经看到的观察值来计算感兴趣的统计量。随机排列就像一个人造时间。
作者图片
现在,一旦排列完成,分类统计量是如何计算的?
首先,目标被转换成一个离散的整数,转换的方式取决于我们要解决的问题:
- 如果我们处于回归设置中,则对连续目标执行量化操作。这意味着目标的可能值范围被划分为特定数量的桶,并且同一桶中的所有目标都被替换为相同的值。确定存储桶的方式取决于所选的策略。在 CatBoost 文档中有更多相关信息。
- 如果我们在一个分类设置中,每一个不同的级别都简单地用一个从 0 开始递增的整数代替。
然后,我们计算统计数据。计算取决于所选的策略,但想法大致相同。例如,对于策略计数器,会发生以下计算:
要理解这个公式的组成部分,最好是引用文档:
- curCount 是训练数据集中具有当前分类特征值的对象总数。
- maxCount 训练数据集中具有最频繁特征值的对象的数量。
- 是一个由起始参数定义的数(常数)。
在我看来,文档中的 curCount 定义不是很清楚,因此我们将举一个例子来理解它(我们将 prior 设置为 0.05)。
作者图片
计算第五次观察的统计数据时,我们有:
- countInClass = 1(在过去的训练数据中,当分类特征等于 Toyota 时,目标等于 1 的次数)
- maxCount = 2(过去训练数据中丰田品牌的总数)
第五次观察统计量等于(1+0.05)/(2+1)=0.35
最后,计算出的统计数据显示,与其他类别相比,每个类别和标签组合都存在于训练数据集中。当面对目标时,这具有揭示类别排序的效果(这是我们想要的)。
正如您可能注意到的,第一次观察将不会包含足够的训练数据来产生稳健的估计。方差很大。为了解决这个问题,CatBoost 的作者建议从生成几个随机排列开始,并为每个排列生成一个编码。最终结果只是不同编码的*均值。
通过这个过程,我们使用所有的训练数据,并且我们永久地消除了目标泄漏。作者还研究了他们在训练中应用的排列数量的影响。论文的结果如下所示:
图片来自 CatBoost 论文
作者得出结论,排列的数量对编码效率有影响,但是当增加排列的数量时,我们得到的改善是微小的。
结论
在这篇文章中,我们回顾了常见的分类变量编码方法,并显示了它们的优势和劣势。在我看来,有序目标统计是可以使用的最好的分类变量编码方案。
作为结束语,我在本文中简要提到了一种叫做贝叶斯目标编码的方法。这篇文章太长了,无法涵盖这个过程,但是我强烈建议您阅读更多关于它的内容(例如这里的),因为它有很多非常好的特性。
Finale 注意,你可以用这个 scitkit-learn contrib 包找到上述编码过程的实现(包括 CatBoost)。
以上就是我的全部内容,我祝您在数据准备过程中一切顺利。如果有不清楚的地方,不要犹豫,留下你的评论。
因果推理如何将增强分析提升到*地之外
原文:https://towardsdatascience.com/how-causal-inference-lifts-augmented-analytics-beyond-flatland-95648fe30055?source=collection_archive---------10-----------------------
行业笔记
因果推理技术和商业分析方法揭示了什么真正改变了你的 KPI,而预测建模却失败了。
如果世界是二维的,生活将会非常奇怪。想想看:地球将不是一个球体,而是一个圆形——就像 2D 宇宙中的所有其他恒星和行星一样。生物也会变*,在*面景观和存在中航行。例如,在街上超过某人,你必须跳过那个人,因为没有任何深度。出于同样的原因,仅仅看你的身后,你真的得把自己翻个底朝天。幸运的是,这不是我们生活的世界。但不幸的是,这是当今大多数企业运行的基础——甚至可能是您的企业。在任何技术驱动的业务中,您的决策质量不可避免地基于您的数据洞察质量。然而,在太多的公司里,这些“见解”实际上是二维的:*淡、不切实际、毫无结果。
超级马里奥
企业通常用 KPI 来衡量他们的表现。因此,在给定历史数据的情况下,找到未来 KPI 值的最佳预测模型已成为数据分析的目标。尽管这些模型的表现可能出人意料地好,但从中提取价值同样困难。除了缺乏可解释性,这也是因为预测模型无法捕捉现实,并且仅限于低维解释。在本文中,我们将基于大多数预测模型中糟糕的缩放和不切实际的假设,给出为什么会出现这种情况的两个论据。
但何必呢?并不是表现好的模式提高了经营业绩。相反,改善企业的唯一途径是通过决策,而决策最终应该由人来完成。商业中数据分析的目标应该是通过揭示洞察力来为决策提供信息。不幸的是,这些就像大海捞针一样藏在你的数据里。这个远非无足轻重的问题激发了数据分析的一个相对年轻的分支——增强分析,并在最*的 Gartner 报告中得到推动1。
我们想要挑战预测模型应该是用于通知商业决策的默认选项的观念。他们在寻求洞察力的过程中引入了一条代价高昂的弯路,甚至可能使其实际上不可行。我们将在一个简单的问题中强调,除了巨大的开销之外,预测建模只能提供很少的东西。相反,我们将试图模仿一个业务分析师是如何操作的。这自然会把我们带到因果推论的方法。
有影响的变化
我们将考虑在大数据场景下诊断回归模型中的错误的问题。大多数读者应该都遇到过以下场景:
图 1
显然,KPI 发生了重大变化,这种变化似乎会持续一段时间。从技术面来看,合理的反应是在转折点之后,根据数据重新训练你的预测模型。你同意吗?如果是这样,也许要记住这一点。
图 2
好消息是你的模型似乎是准确的。坏消息是,你的经理不可避免地会问 KPI 怎么了。但是不要害怕。这是证明你对公司价值的理想情况。你能找出这种变化背后的原因吗?你能发现有助于正确决策的见解吗?
对为什么的探索
假设您公司的数据集如下所示:
import pandas as pd
df = pd.read_csv(“..\\dataset\\ecommerce_sample.csv”)
df.head()
让我们进一步假设您正在处理一个最简单的情况:跳跃前后的数据点的 KPI 值使用线性回归模型完全拟合。这里,您正在处理分类数据,您需要适当地处理这些数据以便在回归中使用。一种标准的方法是对分类值进行一次性编码:对于每个分类值,您引入一个可以是真或假的特性。例如,在上面的数据集中,您将定义特性customer _ country = = Germany。为了最终实现特征选择,有必要使用一种正则化形式。这里,你将使用套索正则化(十重交叉验证)。
在训练两个 Lasso 正则化线性回归模型(一个在跳跃之前,一个在跳跃之后)后,您可以查看这些模型之间的要素权重差异的排序列表。
from sklearn.linear_model import LassoCV
from bokeh.io import show
from bokeh.plotting import figure#get kpi_axis
kpi_axis = ‘kpi’
time_axis = ‘time’
df[time_axis] = pd.to_datetime(df[time_axis],format = ‘%d/%m/%Y’)
y_before = df[df[time_axis] <= ‘2019–09–11’][kpi_axis]
y_after = df[df[time_axis] > ‘2019–09–11’][kpi_axis]#one-hot encoding categorical features
for col in df.drop([kpi_axis,time_axis],axis=1).columns:
one_hot = pd.get_dummies(df[col])
df = df.drop(col,axis = 1)
df = df.join(one_hot)X_before = df[df[time_axis] <= ‘2019–09 11’].drop([kpi_axis,time_axis],axis = 1).to_numpy()
X_after = df[df[time_axis] > ‘2019–09–11’].drop([kpi_axis,time_axis],axis = 1).to_numpy()#training left and right
regression_model_before = LassoCV(cv = 10)
regression_model_after = LassoCV(cv = 10)
regression_model_before.fit(X_before,y_before)
regression_model_after.fit(X_after,y_after)#plotting results
features = df.columns
dweights =regression_model_after — regression_model_before
index = np.argsort(-abs(dweights))
x_axis = features[index[0:3]].to_list()p = figure(x_range=x_axis,title = “Feature weights difference”,plot_width=1000)
p.vbar(x=x_axis, top=(abs(dweights[index[0:3]])),width = 0.8)
show(p)
图 3
看起来,android 用户或 46 岁以上用户等子群体在跳跃前后的表现有所不同。很好,看起来你找到了 KPI 上升的原因…或者你找到了吗?
维度的诅咒
事实上,这是一个比我们迄今所理解的更重要的情况。想象一下将此展示给 KPI 负责人。他们会很高兴你向他们提供了 KPI 变化的原因,他们现在会想知道根据这些信息该做些什么。这将自动引导他们提出如下问题:“KPI 变化的实际驱动因素是所有 android-tv 客户、所有 46 岁以上的客户以及所有之前购买过产品的客户吗?也许是 46 岁以上的回头客和安卓电视用户…或者是以前买过东西的安卓电视用户?更糟糕的是,有没有其他你错过的功能组合?
因此,为了能够更有信心地回答这些问题,您必须使用更复杂的一次性编码特征重复您的回归分析…现在表示比以前更精细的子群。因此,您可以在数据集的更深的子组中进行搜索,参见图 4,新功能包括 customer_age == 46+和 first_order_made == yes、customer _ age = = 18–21 和 first_order_made == no.
同样,这些子群通过一键编码进入。这显然是有问题的,因为你现在成为了维度诅咒的受害者。这是一个大数据时代,你只是增加了你的功能数量的阶乘[2]。可以用来生成这些细化的子组的一段代码是
def binarize(df,cols,kpi_axis,time_axis,order):
cols = cols.drop([kpi_axis,time_axis])
features = []
for k in range(0,order):
features.append(cols)
fs = []
for f in itertools.product(*features):
# list(set(f)).sort()
f = np.unique(f)
fs.append(tuple(f))
fs = tuple(set(i for i in fs))
print(fs)
for f in fs:
print(len(f))
states =[]
for d in f:
states.append(tuple(set(df[d].astype(‘category’))))
for state in itertools.product(*states):
z = 1
name = str()
for d in range(0,len(f)):
z = z*df[f[d]]==state[d]
name += f[d] + “ == “ +str(state[d])
if d<len(f)-1:
name += “ AND “
df[name] = z
for d in cols:
df = df.drop([d],axis = 1)
return df
图 4 —子组深度
请记住,线性回归是基于所有要素之间的协方差矩阵的反演,其标度为 O(d ), d 是要素的数量,也就是说,在我们的情况下,是可能的子组的数量。与非预测特征选择方法相比,这引入了显著的机会成本——这将在后面讨论。
df = pd.read_csv(“..\\dataset\\ecommerce_sample.csv”)
df[time_axis] = pd.to_datetime(df[time_axis],format = ‘%d/%m/%Y’)#get kpi_axis
kpi_axis = ‘kpi’
time_axis = ‘time’
y_before = df[df[time_axis] <= ‘2019–09–11’][kpi_axis]
y_after = df[df[time_axis] > ‘2019–09–11’][kpi_axis]#one-hot encoding categorical features
df = binarize(df,df.columns,kpi_axis,time_axis,3)
X_before = df[df[time_axis] <= ‘2019–09–11’].drop([kpi_axis,time_axis],axis = 1).to_numpy()
X_after = df[df[time_axis] > ‘2019–09–11’].drop([kpi_axis,time_axis],axis = 1).to_numpy()#training left and right
regression_model_before = LassoCV(cv = 10)
regression_model_after = LassoCV(cv = 10)
regression_model_before.fit(X_before,y_before)
regression_model_after.fit(X_after,y_after)#plotting results
features = df.columns
dweights =regression_model_after — regression_model_before
index = np.argsort(-abs(dweights))
x_axis = features[index[0:3]].to_list()p = figure(x_range=x_axis,title = “Feature weights difference”,plot_width=1000)
p.vbar(x=x_axis, top=(abs(dweights[index[0:3]])),width = 0.8)
show(p)
图 5
一段时间后,你的计算完成。虽然你之前的计算只花了 0.1 秒,但搜索三阶特征已经花了一分多钟。但似乎是值得的。您发现推动 KPI 变化的组的数量实际上是一个,见图 5。向您的经理展示这一见解,他可以迅速指出直接影响您报告的子组的更新。
-通过细化子组,您可以使其具有可操作性。
虽然您的回归方法最终奏效了,但计算时间非常长,导致您公司的机会成本。在真实的大数据场景中,你的方法会失败得很惨。此外,仅包含浅子群的原始集合描绘了不正确的画面。只有在精炼集合和巨大的计算工作之后,你才能精确定位驱动 KPI 跳跃的实际子组。
这引发了几个问题:
- 你真的需要学习一个预测模型来回答为什么会发生跳跃吗?
- 你如何降低机会成本?
- 如何在适当的粒度级别找到子组?
- 为了这些信息,每次跳跃都要重新训练模型,这样经济吗?
虽然回答所有这些问题超出了这篇文章的范围,但我们将提供一个新的观点来帮助解决这些问题。为此,我们将开发一种改进线性回归的特征选择方法。增强分析依赖于它。
从商业分析师和因果推理中学习
我们退一步说…这里发生了什么?您从一个预测模型开始,您看到它既不能预测也不能解释 KPI 中观察到的跳跃。这是为什么呢?因为预测模型无法捕捉现实。他们假设所有数据都是独立同分布的[3]。然而,在实际应用中,这通常是不正确的,如本例所示。跳跃前后的数据是在不同的条件下产生的。当你使用两个独立的预测模型时,你甚至直觉地利用了这一事实,这两个模型(在一些技巧之后)帮助我们揭示了跳跃的原因。
当你不得不放弃预测,最终没有预测到任何东西时,预测模型实际上为你做了什么?仔细想想,关键是您对预测 KPI 作为所有可能子组的函数不感兴趣—您感兴趣的是影响 KPI 的子组!因此,为了寻找更深层次的见解,你必须远离预测建模。这是数据科学家可以向业务分析师学习的地方。
业务分析师通过包含有意义的数据摘要的仪表板来搜索见解。业务分析师不是像上面的回归方法那样将所有特性关联在一起,而是通过迭代过滤不同条件下的数据,尝试根据汇总(如均值、直方图或度量)来查明数据中发生了什么变化。最重要的是,业务分析师永远不必一次查看所有特性。你如何教一台机器做到这一点?你如何向商业分析师学习?
让我们用数学符号将上述形式化。设 X 是一个子组,例如 X = customer_age == 46+和 first_order_made == yes 和
KPI 跳跃前后 KPI 分布的一些摘要。然后,引入条件汇总
其中计算 X 为真的 KPI 值子集的汇总。我们的方法现在需要做的就是计算每个子组的条件汇总,并对它们进行排序。我想强调的是,在实践中,这些抽象的总结可以是作为手段的对象,直方图等等
上面详述的过程实际上是因果推理的一种常用技术[4]。你因此含蓄地改变了我们的观点。现在,你认为 KPI 中的神秘跳跃是一种干预,现在假设这是由于外部或内部治疗而发生的。一个外部处理的例子可能是假期,一个内部处理可能是一个广告活动,一个价格的变化,或者,在我们的例子中,一个软件更新。因此,你显然解除了所有数据都是独立同分布的错误假设。您现在正在搜索 KPI 变化的因果子组。
对为什么的探索——再访
现在您已经有了一个业务分析师如何操作的模型,让我们继续实际的实现。现在,你将使用因果推断中使用的标准总结,称为条件*均处理效应(CATE) [4],我们的总结成为
CATE 对应于 KPI *均值的变化,条件是子组 X 为真。然后,通过数量级排序,我们可以得到正确的子群。为了检测多个子组,我们在每次迭代后移除表现最好的子组后重复该过程:
df = pd.read_csv(“..\\dataset\\ecommerce_sample.csv”)
df[time_axis] = pd.to_datetime(df[time_axis],format = ‘%d/%m/%Y’)#get kpi_axis
kpi_axis = ‘kpi’
time_axis = ‘time’
y_before = df[df[time_axis] <= ‘2019–09–11’][kpi_axis]
y_after = df[df[time_axis] > ‘2019–09–11’][kpi_axis]df = binarize(df,df.columns,kpi_axis,time_axis,3)
df_before = df[df[time_axis] <= ‘2019–09–11’]
df_after = df[df[time_axis] > ‘2019–09–11’]
features = copy(df.drop([time_axis,kpi_axis], axis=1).columns)K = 3 #number of subgroups to detect
subgroups=[]
score=[]
for k in range(0,K):
CATE = []
y_before = df_before[kpi_axis]
y_after= df_after[kpi_axis]#compute CATEs for all subgroups
for d in features:
g = df_before[d] == True
m_before = np.mean(y_before[g])
g = df_after[d] == True
m_after = np.mean(y_after[g])
CATE.append(m_after-m_before)#find subgroup with biggest CATE
index = np.argsort(-abs(np.array(CATE)))
subgroups.append(features[index[0]])
score.append(abs( CATE [index[0]]))#remove found subgroups from dataset
df_before = df_before[df_before[features[index[0]]] == False]
df_after = df_after[df_after[features[index[0]]] == False]
features = features.drop(features[index[0]])p = figure(x_range=subgroups,title = “Conditional Average Treatment Effect”,plot_width=1200,)
p.vbar(x=subgroups, top=score,width = 0.8,color=’black’)
show(p)
图 6
这只是我们预测模型成本的一小部分。计算一阶特征只需要 0.02 秒,搜索三阶特征不到一秒。
让我们后退一步,将这种方法与基于回归的早期方法进行比较,并比较它们各自的目标。通过回归的特征选择回答了这个问题:“哪些子群最好地预测了你的 KPI?”。而采用因果推理的观点回答了这个问题:“哪些子群对 KPI 有最大的因果影响?”。比较 CATE 的简单实现与图 7 中线性回归的优化 sklearn 实现的运行时间,我们发现它们的数量级不同。这清楚地表明,这些问题虽然表面上相似,但有着根本的区别。
图 7
结论
预测模型作为理解 KPI 变化的手段有很大的缺点,尤其是在多维环境中。这些模型从根本上回答了错误假设下的错误问题。相反,商业分析关注的是事情为什么会发生,而不是将会发生什么。将他们的思想从预测未来 KPI 值的辅助任务中解放出来,分析人员在数据中寻找原因,以了解 KPI 为什么会发生变化,试图找到正确问题的答案。
下次你想解释什么的时候要小心。首先,你应该问正确的问题。此外,多维环境需要基于因果推理和业务分析方法的可扩展技术。这是我们在 Kausa 的使命:扩展业务分析逻辑,并将其与因果推理相结合,为 KPI 变化提供正确的答案。
PS:复制本文结果的代码和数据可从[6]获得。
关于作者和 Kausa
迈克尔·克拉普特是联合创始人兼首席技术官,张秀坤·林兹纳是 Kausa 的因果推理工程师。
考萨 通过全面持续地测试所有假设,加速数据探索,在几秒钟内提供可操作的见解。 对试用产品感兴趣? 报名提前入场排队 。
参考
- 增强分析将如何改变您的组织
- 停止一次性编码你的分类特征——避免维数灾难
- schlkopf,B. (2019 年)。机器学习的因果关系。1–20.
- 古铁雷斯,p .&热拉尔迪,J.-Y. (2016)。因果推理和隆起建模文献综述(第 67 卷)
- 在解释预测模型以寻求因果洞察力时要小心
- 电子商务数据集
GPT 3 号离人工通用智能有多*?
原文:https://towardsdatascience.com/how-close-is-gpt-3-to-artificial-general-intelligence-cb057a8c503d?source=collection_archive---------15-----------------------
GPT-3 是仿人自然语言表现的良好开端。或许更好的类比可能是人工通用智能自然语言的“能人”【1】。
语言推理的漩涡。美国地质勘探局在 Unsplash 上拍摄的照片
能人物种区别于更早的南方古猿群体,它们有稍微大一点的脑壳和更小的脸和牙齿。然而,能人物种保留了一些类人猿的特征1。
最重要的是,对于我将要做的类比,能人物种被认为是第一个制造石器的人。
在我的类比中,GPT-3 代表了自然语言人工智能的能人。以下是我的推理:
- GPT-3 的大脑(参数)明显比之前的 NLP 型号更大;
- GPT-3 使用工具,例如,转移学习和微调。
- GPT-3 完成其他 NLP 任务(制造工具),它没有接受过这方面的训练。
- GPT 3 号保留了 GPT 2 号的大部分架构。与能人物种类似,GPT 3 号保留了“一些类人猿特征”。
关键要点:是什么让 GPT-3 如此特别?
GPT-3(生成式预训练变压器-3)是 OpenAI 迄今为止最大规模的自然语言预测(NLP)模型(2020 年 6 月向公众开放)。
- GPT 3 号大约有 1850 亿个参数。相比之下,人类大脑大约有 860 亿个神经元,每个神经元*均有 7000 个突触[2,3];
- 比较苹果和橙子,人类大脑有大约 60 万亿个参数,比 GPT-3 多 300 倍。注意:如果自然语言任务需要 10%的人脑容量,那么人脑的参数比 GPT-3 多 30 倍。
- 据估计,GPT-3 的云计算时间成本在 400 万美元到 1200 万美元之间,并且需要几个月的时间进行培训[3,7]。OpenAI 没有说 GPT-3 的训练成本是多少,也不清楚他们是否知道 20%以内。然而,该论文的作者计数是 31 名工作人员[3]。这意味着一年至少要增加 1200 万美元的员工工资和福利。
- GPT-3 在总计约 5000 亿个标记(一个标记*似于一个单词)的几个大型文本语料库上进行训练[3]。
他们已经走得够远了!他们去建了一座七层楼高的摩天大楼,大约和一栋建筑物一样高。—俄克拉荷马州堪萨斯城的歌词子集[9]
注:迪拜塔摩天大楼目前有 183 层高。
GPT-3 站在先前工作的肩膀上
- GPT-2 是一个大型的基于 T2 转换器 T3 的语言模型,拥有 15 亿个参数,在 800 万个网页的数据集上进行训练。GPT-2 将 GPT-1 模型架构的参数扩大了约 10 倍,并对超过 10 倍的数据量进行了训练。
- GPT-2 最初的研究目标是在 40GB 的互联网文本上进行无监督训练后预测句子中的下一个单词[4]。GPT-2 可能会也可能不会最初让 OpenAI 的研究人员惊讶地发现,它可以执行与它训练的不同的 NLP 任务[6]。我毫不怀疑 GPT-2 为 OpenAI 与 GPT-3 一起“做大”奠定了基础。
- GPT-2 模型和其他 SOTA(国家最先进的)自然语言处理模型仍然不能执行一个新的语言任务,从只有几个例子(称为少数镜头学习)或从简单的自然语言指令描述的任务[3]。
- GPT-3 将 GPT-2 模型架构放大了约 100 倍。如果你按页数或作者数计算,这是相当可观的 5 倍多的努力[3,5]。
- GPT-3 采用了 ULMFIT 的关键发现。在大型文本语料库上预先训练 NLP 模型,然后在特定任务上进行微调,在许多 NLP 任务和基准上实现了实质性的收益[4]。
- GPT-3 的研究人员表明 NLP 的性能(以交叉熵验证损失衡量)与 NLP 模型的大小(参数数量)成正比[3]。GPT-3 可以说是迄今为止最好的 NLP 模型。
- 再次声明,由于这是一个至关重要的发现,研究人员通过 GPT-3 训练表明,扩大语言模型可以显著提高任务不可知、少数镜头的性能,有时甚至达到与以前的 SOTA 方法相当的水*[3]。
- GPT-3 可以在没有任何神经网络梯度更新或微调的情况下应用[3]。
- GPT-3 论文的结论是,17.8 亿个参数模型在一些少量学习任务中不够准确[3]。
研究人员训练了一系列较小的 GPT-3 模型,其变化范围从 1.25 亿个参数到 1,300 万个参数。零炮、单炮和少炮性能之间的精度差距随着模型参数的大小而扩大。OpenAI 的研究人员坚持认为,他们的研究表明,更大的模型和更多的数据输入将是适应性更强的通用语言系统的成功之路。来源:https://arxiv.org/pdf/2005.14165.pdf
GPT-3 是迄今为止最好的 NLP 模型吗,因为它是最大的?
注:2021 年 6 月 12 日,北京人工智能研究院(BAAI)*日 发布了关于其“悟道”AI 系统的详细信息 。据悉有 175 万亿 参数。据报道,吴导在文本分类、情感分析、自然语言推理、阅读理解等方面超过了人类的*均水*。我提醒读者注意上述声明,直到 BAAI 提供其他细节,如使用的硬件,训练时间和使用的训练数据。据报道,该代码是开源的。
GPT-3 的第一个例子
GPT-3 在需要即时推理或领域适应的任务上表现出色,如解读单词,在句子中使用新词,或执行 3 位数算术[3]。
GPT-3 模型生成的新闻文章样本,人类评估者很难从人类撰写的文本中区分出来。增加参数的数量增加了人类读者的难度,如下图所示。
来源:[3]https://arxiv.org/pdf/2005.14165.pdf
GPT 以华莱士·斯蒂文斯的风格创作诗歌。我的反应很奇怪,我承认,有点害怕。
来源:https://arxiv.org/pdf/2005.14165.pdf
2020 年 6 月,OpenAI 发布了它为访问不同 OpenAI 模型而开发的 API 。该 API 运行预训练的 GPT-3 模型系列,用于各种 NLP 任务[3]。
与通常的人工智能社区实践不同,GPT-3 模型的权重不向公众公布。
结论
OpenAI 长期以来一直声称,巨大的计算能力和强化学习是通往 AGI 或可以学习人类可以完成的任何任务的人工智能的必要一步[14]。
人工智能 2.0 的创始人,如 Yoshua Bengio 和 Yann LeCun,认为从目前的人工智能技术不可能创造出 AGI。他们认为我们需要自我监督学习(实际上 GPT-2 和 GPT-3 是自我监督的)和先进的基于神经生物学的进步[15]。
然而,人工智能 1.0 的父亲,人工智能的祖父,如马文·明斯基和安德鲁·麦卡锡,认为丰富的知识(数据)和常识推理专家的“社会”是通往 AGI 的道路[16]。
GPT-3 是一个存在的证据,它证明了扩大文本(数据)的数量,扩大参数(模型大小),以及扩大训练计算的结果在一个专家身上有更好的准确性(可怕的性能)来完成少量的 NLP 任务。
模型的架构、模型的大小和训练计算机的数量实现了常识推理专家吗?数据和常识推理能让我们到达 AGI 吗?
对人工智能可能未来的推测
所以,我认为人工智能研究者犯的最大错误是假设他们是聪明的。是的,和人工智能相比,他们不是。—埃隆·马斯克[12]。
60 到 65 年前,第一台计算机装满了一个房间。60 年后,一个计算机核心,大约有我的头那么大,已经放大了第一台计算机的大约 10 亿倍(可能更多)。
假设第一台可行的量子计算机充满了整个房间。60 年后,我脑袋大小的量子计算机核心将会放大到第一台量子计算机的 10 亿倍吗?
也许吧。
想象一台量子计算机,其 AGI(人工通用智能)模型的规模是 GPT-3 参数的 10 亿倍,或人脑参数的约 300 万倍。
“我预测在 2029 年,我们将通过图灵测试,”雷·库兹韦尔说[11]。
注意:GPT 3 号非常接* GPT 3 号通过图灵测试[13]。
GPT 3 号在某些方面给人留下了深刻的印象,但在其他方面却明显不如人类。——凯文·莱基,Just,2020。
你认为我们会做一个霍金-马斯克的噩梦或者哈文斯-库兹韦尔的梦吗?
我们可能两者都有,也可能都没有。
我把钱投在我们的工具制造上。我怀疑我们会改变,或者我们应该改变这种行为。
我觉得埃隆·马斯克的 NuralLink 项目是在我们的工具制造上赌人工智能的未来潜力[17]。
资源
1 成为人意味着什么?
人类大脑的规模。
[3] 语言模型是很少出手的学习者。
[4]文本分类通用语言模型微调。
[5] 语言模型是无人监督的多任务学习者。
[6] 更好的语言模型及其含义。
[7] OpenAI 庞大的 GPT-3 模型令人印象深刻,但大小并不代表一切。
【8】通过生成性预训练提高语言理解。
【9】堪萨斯城的歌词出自戏剧《俄克拉荷马》。
[10] 哈利法塔摩天大楼。凯文·莱基
未来比你想象的更好:雷·库兹韦尔对人工智能和发展的预测。
[12] 埃隆·马斯克:对于人工智能来说,人类是一种‘生物启动加载器’。
[13] 给 GPT-3 做图灵测试——凯文·拉克尔的博客。
【14】AI 训练如何规模化。 — OpenAI Blob 贴子。
[ 15] Yann LeCun 和 Yoshua Bengio:自我监督学习是人类水*智能的关键。
我们正处于人工智能的风口浪尖上吗(AGI)?
[17] 埃隆·马斯克的 Neuralink 是神经科学剧院。
公司董事如何影响公司的可持续性
原文:https://towardsdatascience.com/how-company-directors-affect-corporate-sustainability-9e8b457a2878?source=collection_archive---------30-----------------------
通过使用机器学习和统计学,我证明了之前在董事会的专业经验对公司社会绩效的影响
图表显示了董事的企业社会责任相关经验如何促进企业的可持续发展。朱莉娅·尼库尔斯基拍摄的图片,图标由来自 www.flaticon.com的弗里皮克和基兰沙斯塔里制作。
公司不仅仅是生产者和服务提供者,雇佣我们,满足我们的消费需求。他们是我们社会中的行动者,可以对气候变化、人权和我们生活的社区产生积极和消极的影响。因此,消费者、监管者和投资者越来越多地要求公司采取更多行动,为社会做出积极贡献。
我调查了公司董事对公司社会责任的潜在影响。具体来说,我查看了董事会成员的先前职业经历。我假设与环境和社会问题相关的经验会积极影响一个公司的社会责任行为。
我使用机器学习来分析 S & P 500 成员公司的公司董事的履历信息。然后我对他们的经历和这些公司的可持续性评级进行了线性回归分析。请继续阅读,看看我的发现,以及它们对希望支持可持续发展的公司和投资者意味着什么。
卡尔·海尔达尔在 Unsplash 上拍摄的照片
公司董事和企业社会责任
什么是 CSR?
企业社会责任描述了公司在其业务运营中考虑环境、社会、道德和其他非财务因素的责任1。在过去的 50 年里,研究人员和从业人员基本上一致认为,以对环境和社会负责的方式行事不仅是公司的道德义务。无数的研究也表明,一个公司的企业社会绩效(CSP)积极影响其财务绩效[2, 3 。CSP 描述了公司商业活动的社会影响和结果[4]。因此,格言“做好事才能做好事”是有实证依据的。
公司董事的作用是什么?
因此,如果企业社会责任能够带来经济利益,那么问题就变成了:一家公司如何提高其企业社会绩效?许多研究对这一领域进行了调查,发现了公司制度、组织和个人层面的各种影响因素[ 5 、 6 ]。董事会是影响 CSP 的因素之一。
董事会的任务是向管理层提供建议并控制管理层,以确保管理层的行为符合股东的最大利益[7-9。各种理论观点旨在解释董事会在公司中的特殊作用(见[8,10, 11 )。大量实证研究证实董事会控制管理层和在战略决策9中发挥作用。这意味着他们参与并能够影响各种决策:进入新市场——如电动汽车——或调整生产流程以提高能效。
照片由克里斯蒂娜@ wocintechchat.com在 Unsplash 上拍摄
关于董事和 CSP 之间的联系,研究告诉了我们什么?
董事会和各个董事的各种特征都与 CSP 相关联。董事的独立性[12、 13 、首席执行官和董事长角色的分离[ 14 ]、董事会规模[ 15 、 16 ],以及处理可持续性问题的董事会委员会的存在[ 17 ]已经被证明会影响 CSP。对董事的人口统计学和心理学特征的调查程度较低。
一些研究发现性别[ 18 ]、年龄[ 19 ]、任期[ 19 ]、种族[20]、国籍[ 21 ]、职业经历[ 15 、 [19 【T23、20】与 CSP 之间存在相关性。然而,迄今为止还没有研究调查董事的 CSR 相关经验对 CSP 的潜在影响。之前的三项研究仅着眼于董事在环境相关领域的经验及其对公司环境绩效的影响22—24。
董事的职业经历如何影响 CSP?
一个重要的研究领域是关于首席执行官和其他高层管理人员对组织成果和行为的影响。例如,首席执行官的职业经历、年龄、任期和教育程度与公司的财务表现挂钩[ 3 ]。其他研究表明,政治意识形态[26]、自恋、马基雅维利主义和精神变态[ 25 ]会影响战略选择和经济结果。
这些研究基于上层理论(UET),该理论认为首席执行官和高层管理团队的人口特征、个性和价值观会影响组织绩效 [27]。这一理论表明,个人的价值观和认知基础引导着他们的战略选择过程[27](见图 1 )。因为这些很难观察到,所以在研究中经常使用代理变量——比如以前的专业经验。
图 1: 战略选择流程。改编自汉布里克&梅森【27】,第 195 页。图片由 Julia Nikulski 提供。
如前所述,董事会参与战略决策过程。因此,可以假设董事的人口统计特征、个性和价值观也会影响组织行为和结果。
基于这个理论框架,我推导出两个假设:
- H1: 董事会董事的企业社会责任相关专业经验将对公司的企业社会责任计划产生积极影响。
- H2: 如果董事是企业社会责任委员会的成员,董事的企业社会责任相关职业经验与企业社会责任计划之间的正相关关系将会增加。
第二个假设也认为董事会委员会的组成比整个董事会的组成更能预测具体的结果(见【28】)。董事会委员会处理特定的主题或领域。例如,审计委员会必须由具有金融专业知识的董事组成[29]。这表明,将专业知识与责任相匹配会带来更好的结果。
调查主管经验和 CSP
样本和变量
我的样本包括 2011 年至 2015 年间在标准普尔 500 指数成员公司董事会任职的所有董事。我分别调查了环境经验和绩效以及社会经验和绩效之间的联系。因此,我使用了来自路孚特的环境得分和社会得分作为因变量。
控制变量包括董事会规模、董事会独立性、董事会*均任期、首席执行官双重性、资产回报率(ROA)、财务松弛、杠杆、行业和年份。独立变量包括在整个董事会和 CSR 委员会中拥有相关环境或社会经验的董事比例。
来自早期研究[ 17 , 23 ]和评级机构(路孚特, SASB )的信息被用于确定哪些类型的专业经验和领域有资格被标记为环境和/或社会。先前环境经验的一个例子是一个专注于生物多样性和保护的基金会的董事会任命。之前担任过首席可持续发展官的工作会被考虑到环境和社会经验得分中。
有关此分类的更多详细信息,请参考我的 GitHub repo 的自述部分。在考虑缺失数据后, 463 家公司和 2,201 家公司年度观察结果仍为 5,276 名独立董事。
马库斯·斯皮斯克在 Unsplash 上拍摄的照片
语言模型实现
我们选择了一种机器学习的方法,而不是手动阅读数千份简短的传记,来识别具有相关经验的董事。我使用了基于 Transformer 的预训练 NLP 模型long former30来将短篇传记分类为环境和/或社会或不相关的经历。**
与人工审查传记相比,使用这种方法为我节省了大约 250 个小时的工作时间。表 1 显示了样本中环境和社会传记的分布。关于 Longformer 模型如何工作的更多细节,请查看我的关于基于 Transformer 的 NLP 模型的文章。
表 1: 包含 5276 个传记的样本中不同类别的份额。图片由 Julia Nikulski 提供。
数据分析和建模
使用考虑行业固定效应和时间固定效应的双向固定效应模型对这两个假设进行了调查【31】。内生性和因果性问题的解决方法是在自变量(和控制变量)和因变量之间包含一年的时滞[32],使用固定效应模型[31],并遵循先前类似研究的操作化方法。
为了确保结果的稳健性,我进行了三种不同的回归分析。首先,我使用了整个样本,包括所有异常值。然后,我用截断样本重新计算,从所有连续的因变量、自变量和控制变量中切掉第 1 和第 99 个百分位数。第三次运行是在 winsorizing 第 1 和第 99 百分位,限制每个连续变量的最小和最大值[ 33 ]之后进行的。
进行这些计算的代码可以在我的 GitHub 上找到。
结果
描述统计学
我的样本中的数据显示了几个有趣的见解。首先,它显示了行业和年份因变量的差异。例如,图 2** 中的箱线图显示出零售业的环境得分比公用事业更广泛。**
图 2: 零售和公用事业行业的环境得分方框图。图片由 Julia Nikulski 提供。
此外,随着时间的推移,所有行业的环境和社会得分都在增加,而独立变量和控制变量保持相对恒定。图 3** 还显示,环境得分的四分位距(IQR)高于社会得分。因此,各行业的环境得分差异较大。**
图 3: 所有行业的环境和社会得分方框图。图片由 Julia Nikulski 提供。
整个董事会的环境经验得分(独立变量)范围从 0%到 86%的董事。*均值为 19%,而图 4 显示,在 2201 家公司的年度观察中,有 402 家公司的董事会中没有任何有环保经验的董事。更多的董事有社会问题的背景,只有 162 家公司的年度观察显示他们的董事会缺少社会经验。董事会的社会经验得分在 0%到 93%之间,*均为 31%。
图 4: 板上环境体验和社会体验直方图。图片由 Julia Nikulski 提供。
在与董事会委员会相关的独立变量中也可以观察到类似的趋势。1,804 个公司年度观察在其环境相关委员会中没有环境经验。这一数字略低于社会经验委员会的分数,为 1,703(见图 5** )。这些高值部分是由于缺乏有经验的董事和缺乏 CSR 相关委员会造成的。只有 140 家公司有董事会环境监督委员会,145 家公司有社会监督委员会。**
图 5: 相关委员会环境经验和社会经验直方图。图片由 Julia Nikulski 提供。
我进行的曼-惠特尼 U 检验已经为我的两个假设提供了初步支持(见表 2** )。经验分数大于 0 的公司年观察值的因变量*均值高于经验分数为 0 的公司年观察值。这表明有经验的董事对环境和社会绩效有积极的影响。**
此外,有经验的董事会委员会成员的公司年度观察的*均环境和社会得分高于那些考虑整个董事会经验的人。
表 2: 有经验主管和没有经验主管的观察结果的曼-惠特尼 U 检验结果。图片由 Julia Nikulski 提供。
回归分析
回归分析证实了假设 1 和假设 2。表 3 中所示的模型 1 和模型 2 调查了 H1。结果显示,一个拥有在环境问题上有经验的董事的公司比一个没有有经验的董事会的公司有更高的环境得分。同样适用于有社会经验的导演。****
具体来说,模型 1 中的系数 18.163 可以这样解释:董事会经验得分每增加 10 个百分点,公司的环境绩效得分就会增加 1.8163 分。这种业绩变化表明,董事很重要。然而,它们只是改善企业社会绩效的更大战略的一部分。
表 3: 固定效应回归模型的结果。图片由 Julia Nikulski 提供。注:* * :1%水*显著;**:在 5%的水*上显著;:在 10%水*上显著。括号中给出了稳健的标准误差。模型 1 使用环境委员会经验分数作为自变量,环境分数作为因变量来测试 H1。模型 2 通过用社会委员会经验分数预测社会分数来测试 H1。模型 3 使用环境委员会经验分数作为自变量,环境分数作为因变量来测试 H2。模型 4 用社会委员会经验分数和社会分数测试 H2。**
假设 2 也被证实,因为独立变量的模型 3 和模型 4 中的系数大于模型 1 和模型 2 中的系数。因此,如果一家公司任命其有 CSR 经验的董事加入 CSR 相关委员会,环境和社会绩效得分将大幅增加。
使用截断和 winsorized 样本进行回归分析的结果可以在 my GitHub 上找到。两次稳健性检查都证实了使用整个样本进行回归分析的结果。
照片由缺口缺口在缺口处拍摄
含义和结论
从这些结果中可以得出各种理论和实际的含义。高层理论是适用于董事会和公司业绩的有效理论。只有很少的先前研究做过。此外,这项调查强调了专业知识与责任相匹配的重要性。今后,公司应建立企业社会责任相关委员会,并任命具有企业社会责任相关经验的合格董事。
此外,公司应该感到鼓舞,任命更多有 CSR 经验的董事进入董事会和董事会委员会。投资者应该让公司负起责任,增加他们在董事会中的 CSR 专长。关于数据收集过程,机器学习的应用前景非常广阔。这项研究显示了它在处理大量非结构化数据时的优势。
****这项研究的最终收获应该是增加 CSP 和促进可持续发展的一个步骤是任命具有 CSR 相关经验的董事。然而,要创造积极的社会影响并实现可持续发展,还需要采取更多以企业社会责任为导向的措施。
请注意:这项调查是我硕士论文的一部分。
你想在媒体上阅读更多高质量的故事吗?考虑注册一个支持我和其他媒体作者的会员。
**https://medium.com/@julia.nikulski/membership **
既然你在这里,你可以看看我写的关于数据科学和可持续发展的交集以及在这个领域工作的有前途的项目和组织的文章。
** **
参考
计算机如何玩模仿游戏:不到 10 分钟从自动编码器到 StyleGAN2s
原文:https://towardsdatascience.com/how-computers-play-the-imitation-game-from-autoencoders-to-stylegan2s-in-less-than-10-minutes-d0a89507cc04?source=collection_archive---------36-----------------------
非极客的(小说)图像生成指南
威廉·冈克尔在 Unsplash 上拍摄的照片
这一切都始于 1950 年三个受试者玩的一个游戏。c 会坐在一个单独的房间里,向 A 和 B 提出开放性的问题,接受书面回答,并试图从中辨别 A 和 B 是人还是机器。C 的目标是把它做对,而 A 和 B 的目标是愚弄 C。
自从机器开始研究如何通过图灵测试以来,已经过去了 70 年,它们已经走过了漫长的道路。
我是一名投资者,在游戏中呆了 15 年,对金融服务有一定程度的了解,是一名机器学习和 Tensorflow 免费击球手,但绝不是机器学习工程师。尽管如此,我认为内容生成技术告诉了我们很多关于计算机在模仿人类方面有多好的信息——并且可以在这个过程中教会我们一些谦逊和自我意识。
这篇文章的目标是在不到 10 分钟的时间里总结玩模仿游戏的最新计算机技术的发展。我同意,图灵将这个简单游戏的成功与回答更深层次的问题“机器能思考吗?”是一个很大的假设,但另一个时间。10 分钟现在开始。
第一步:自动编码器和降维
为了公*地复制人类生产的东西(以及我们认为是人类生产的东西),计算机应该首先学会理解,或者至少(让我们尽可能远离意识和自我意识这些令人毛骨悚然的概念)通过综合其核心维度来概括内容。
在现实生活中,通常可以在不丢失太多信息的情况下显著减少一个集合的特征数量。看下面的自然数序列。
顺序= [1,2,4,8,16,32,64,128,256,512]
虽然该序列包括 10 个数字,但显然该列表代表序列 2ⁿ的前 10 个实例,其中 n 从 0 开始。对于一个人来说,最多装备笔和纸,复制这样的序列的前 10、20、50 个成员而不全部记住是微不足道的。换句话说,我们已经确定了序列固有的低维特征,这些特征足以进行完美的复制。或者,更简单地说,我们发现了一种模式。但是机器也能做到这一点吗?
你不会感到惊讶,他们可以,通过同样的测试和学习的方法,人类将适用于这个和更复杂的序列。这正是自动编码器所做的。
什么是自动编码器?自动编码器是一种模型,它查看输入,提取有效的潜在表示(编码器),并吐出希望看起来尽可能与输入相似的东西(解码器)。
自动编码器的图形表示:从输入到重构
我们来拍几张低分辨率的图片。编码器的工作是将(32 高 x 32 宽 x 3 RGB 通道)像素中的信息压缩到更低的维度;解码器的任务是获取该表示,并尽可能地再现与原始图像接*的内容。第一次,我们的模型通过随机猜测做得很差,然后它做得好一点,然后再好一点,直到希望在多次迭代后它变得非常好,这取决于我们想要压缩原始信息的程度。
原始图像与使用 1 个中间层和 10 个神经元的重建图像——实际上是将 32x32x3 像素中包含的信息压缩到 10 个感知器中。结果不出所料的差(卢瑟激活和极客的 20 个纪元)
使用具有 100 个神经元的 1 个中间层重建的图像—结果明显好得多(架构和其他参数保持不变)
如果您想要编码的信息非常(非常)大,或者非常混乱,并且模式很难被识别,那么我们简单的架构就不能令人满意地执行,并且需要扩展。但总是一样的东西。你扩展编码/解码层中的单元数量,你将这些层一层一层地堆叠起来,你玩被称为激活函数或超参数的东西,你不断地从输入到重建。你得到了深度自动编码器(它包括许多层)卷积自动编码器(它包括通过特殊过滤器过滤信息的层)递归自动编码器(它对它们所做的事情保持某种记忆)等等。但是如果你得到了最初架构的想法,基本上是一样的。
第二步:变化的自动编码器和新东西的创造
但是有一类自动编码器,所谓的变型自动编码器,它的行为与其他编码器不同,并且不是尽可能接*你输入的内容,而是生成一些全新的东西,但可能类似于原始输入。你给模型 1,000,000 张雨伞的照片,然后(经过大量学习)它会产生一张真正像雨伞的照片,但那不是你分享的照片之一。这是赢得模仿游戏的第一步。
一个可变的自动编码器在这个过程中引入了一点随机性。研究输入后,编码器生成输入(理论)分布的均值μ和标准差σ,而不是为其生成编码,即假设输入呈正态分布时的均值和标准差。如果听起来很复杂,让我们一步一步来分析:
- 编码器接收输入列表,并猜测μ和σ的两个值,假设两者都是 0.5
- 然后,从μ = sigma = 0.5 的正态分布中随机抽取一系列数字
- 随后,解码器试图基于这些随机数再现输入(我们的图像),并将其呈现给陪审团(一个客观函数)
- 陪审团很可能会发现结果非常糟糕(这只是随机噪声),并将其退回
- 结果很糟糕,原因有两个:输出看起来不像输入(即重建损失很高),采样像素看起来不像是从正态分布中随机采样的(即潜在损失很高)——如果输入实际上是具有均值μ和标准差σ的正态分布,那么这些参数很可能不同于 0.5
- 编码器更新他对μ和σ的估计,并对一组新的随机数进行采样,试图减少潜在损失
- 然后,解码器产生一个新的估计,试图减少重建损失,并再次发送给陪审团
很长一段时间后,我们将拥有足够好的模型参数来产生全新的图像——类似于模型被训练的输入。我们只需向模型输入随机噪声(正态分布),并使用学习到的参数对其进行解码。
由一个变化的自动编码器生成的新的动画脸——图像很模糊,需要很长时间来训练,但结果很好,它们真正提醒我们由人类绘制的动画脸
第三步:生成对手网络背后的思想
2014 年,一组人工智能研究人员意识到,设计两个不同的模型试图愚弄对方,而不是让他们为同一支球队效力,结果将会显著改善。这个想法既简单又天才。
我们有一个发生器和一个鉴别器,它们互相对抗。发生器将随机噪声作为输入并输出图像(与解码器在上述可变自动编码器架构中工作的方式相同)。相反,鉴别器接收一组图像,并试图识别图像是真的还是伪造的。这是事实上的,一个在机器学习环境中重建的模仿游戏。
第一阶段:给自己找一个好的鉴别者。我们首先训练鉴别器,目的是让它相当好地识别真实和伪造的图像。开始时这很容易,因为发生器只看到真实图像和发生器产生的初始假图像(看起来真的像噪声)。
第二阶段:教发电机学会作弊。然后,我们训练生成器产生图像,鉴别器会错误地将这些图像归类为真实图像。生成者从来看不到任何真实的图像,而只是根据鉴别者识别伪造图像的能力来接收对其工作的间接反馈。鉴别器的好处是可以看到真实图像的样子。
再现的图像很快变得相当好(比可变自动编码器的情况快得多),但几乎同样快地停止改善。其背后的原因是,他们不断试图智胜对方,最终选择了相当成功的技术。
让我们假设,例如,我们正在训练 GAN 生成假的石头剪刀布图像。在开始时,生成器非常糟糕,然后它变得更好,然后最可能理解的是,用岩石图像(一个拳头)欺骗鉴别器比用手指开发一只完整的手容易得多——所以它不断生成许多拳头,可能没有太大改善,以及一些非常糟糕的纸和剪刀。最终,鉴别者赶上来,并开始区分假石头和真石头,如此之好,以至于在某一点上,生成器尝试另一种策略,即展示纸或剪刀。开始时,它们是如此糟糕,以至于鉴别者发现了它们,但后来是鉴别者忘记了如何识别假纸和假剪刀(记住,它已经在岩石上训练了一段时间,以便智胜生成器),生成器开始获胜。GAN 可能会在一段时间内陷入这种轮换策略,而没有真正的改善。电脑也很懒。
使用 StyleGAN 架构生成的手语图像——经过 50 个时代后,拳头或拳头状图像的趋势显而易见
深度卷积 GANs (DCGANs)来帮忙了,一层一层的叠加,包括滤波器,随机漏失,以及其他限制 GANs 不稳定性的技术。小图像的结果有所改善,但结果并不完美。在较大图像的情况下,重建可能会在某些细节上产生局部令人信服的结果,但整体效果不佳。
2018 年,英伟达的一个团队提议使用 DCGANs 来产生小图像,然后通过特定的过滤器(卷积层)在一个称为渐进增长( ProGANs )的过程中逐步扩展它们。为了避免模式崩溃(即上述 gan 的懒惰/不稳定问题)和增加多样性,引入了一些其他创新。所有这些技术的结合为高质量的图像提供了非常好的结果。
为提高质量、稳定性和多样性而逐步种植的 GANS。使用 CELEBA-HQ 数据集生成的 1024×1024 图像(经过多天的训练)
研究小组通过比较每一层的风格,分析了生成的图片与原始图片的相似程度。这种比较程序提供了 StyleGANs 的想法,StyleGANs 是目前小说图像生成中最先进的技术。
步骤 4: StyleGANs 和没有名字的人
正是同一个 Nvidia 团队引入了 StyleGANs 的想法,即 GANs,其中生成器被修改为使用样式转移技术,以便在局部和全局都具有与原始图像相似的结构。高质量图像的结果是惊人的。
Rani Horev 在 StyleGANs 上的帖子提供了一个精彩的解释,但以下是他们主要特征的总结:
- 映射网络将输入编码成控制不同视觉特征的中间向量
- 风格模型将由映射网络编码的特征转移到每个分辨率级别的生成图像中(即,对于低级和高级图像特征)
- 使用随机变化来生成不确定的或不能被映射网络映射的特征(如头发、雀斑、皱纹等)。)
- 在生成图像的每个级别进行风格混合,以避免级别之间的相关性,这可能导致生成的图像遵循特定(且不一定真实)的模式
这种方法在生成新颖的逼真图像方面具有开创性,并在 2020 年的另一篇论文中得到进一步改进(该论文介绍了 StyleGAN2s)。结果呢?自己判断。
由 StyleGAN2 架构生成的图像—归功于thispersondoesnotexist.com
如果你像我一样,想象照片上的人的生活,他的童年,他的青年,他的爱和恐惧,痛苦和快乐,然后提醒自己这实际上只是随机像素的集合,那么计算机真的在模仿游戏中走了很长的路。
我希望你喜欢这次短暂而紧张的旅程。应用程序的数量是巨大的,你可以选择是被它吓倒还是被它激励。这是你的选择。我们才刚刚开始。
计算机如何看深度:基于深度学习的方法的最新进展
原文:https://towardsdatascience.com/how-computers-see-depth-deep-learning-based-methods-368581b244ed?source=collection_archive---------19-----------------------
来源: Unsplash
从立体图像估计深度
第 1 部分:立体视觉的动机和基础
O 我们对深度的感知对于创造我们周围的 3D 世界至关重要。这种知识已经流行了几个世纪,有一个人非常了解这一点,他就是莱昂纳多·达·芬奇。他利用自己的专业知识帮助自己创作了一些艺术作品,这些作品将会名闻遐迩,如《最后的晚餐》或《萨尔瓦托勒·希泽拉》。从技术上讲,对双筒望远镜的理解可以追溯到公元 280 年,当时欧几里德意识到我们的深度知觉是人类用两只眼睛聚焦于同一物体。尽管如此,今天,立体视觉仍然是一个非常有趣的问题。我的目标是深入了解这个话题。现在,我把我的笔记转变成一个博客系列。
✍每篇文章都将包括一个突击测验!突击测验的目的是通过思考精选的问题集来巩固关键概念。所以,请分享你的回复吧!
目录
一.导言
深度估计在现实世界中有许多用途,在机器人、计算机视觉和沉浸式显示中具有实际意义(见上图)。我们将深度估计视为一个多图像问题。多视图(或图像)问题跨越不同的问题领域,如(1)立体视觉,(2)运动结构,以及(3)光流。虽然每一个都在虚拟现实(V.R .)、机器人和计算机视觉问题中作为一个整体具有巨大的重要性,但在这个多部分系列中,我们将重点关注(1)立体视觉。具体来说,深度学习在立体视觉技术上的进展。首先,在第一部分中,我们涵盖了预备材料(即经典立体视觉理论)。
基于深度传感技术的大量应用。图片作者。
人工神经网络在计算机视觉中有很长的历史,为对象检测和分类提供了一个健壮的框架。此外,深度学习通过提供网络学习的图像的更深层次的表示,彻底改变了该领域。最*这一成功的关键因素包括一个简化的网络架构,其参数更多,规则更少,以及新的训练技术,如辍学[3]和 L2 正则化[4]。
在我们专注于具体的深度学习解决方案之前,让我们首先通过理解为什么立体图像对可以推断深度来激发这个问题。
深度知觉:3D 空间中的人类
人类的大脑在立体视觉中有一种奇妙的能力来看深度。我们使用我们的两只眼睛,它们分别位于头部的两侧,使我们能够感知物体的三维空间:高度(深度)、宽度和相对于周围环境的前后位置。然而,这项技能并不是人类独有的——许多动物都拥有它!然而,当尝试关于这个主题的计算建模研究时,仍然会出现几个挑战,主要是因为在没有输入数据集的情况下,这些挑战是困难的或不可能的,这些输入数据集包含关于您希望他们训练什么对象以及这些项目当前位置有多*/多远的信息。这个博客系列将探索这些挑战,以及基于深度学习的方法的最新进展如何克服这些挑战。
我们可以使用核几何来重建在图像捕获期间丢失的深度(即, z )维度,其中图像对来自已知参数的来源:内在参数(即,透镜的焦距 f )和外在参数(即,称为基线b】的左右摄像机的光学中心之间的距离)。
我们如何从图像中自动计算三维几何图形?图像中的哪些线索提供了 3D 信息?在看双目(即立体或两个)之前,让我们先考虑一些单一视角,即单目特征。
我们人类天生如此。下图描绘了我们自然用来感知世界深度的线索。
人类用来推断深度信息的几个线索,线索列在每个样本的上面,来源在下面。
运动是我们用来推断深度信息的另一个线索。想象一下 gif(最右边)中所示的雕像的转动。作者创建了 gif。
- 突出
- 阴影
- 轮廓
- 相互反射
- 对称
- 光偏振
为什么是立体声?
如简要提到的,深度线索可以来自单个源(即,单目视觉)。另一种方法是通过立体图像对使用同一场景的两个视觉参考(即双目视觉)。为什么要使用多个来源?通常,从单一来源推断深度信息是不可能的。还有,单目视觉任意缩放。下图描述了这个概念。
让我们通过例子来看看单一观点的模糊性。
深度,正如在 2D 的图像中看到的,是模糊的。因此,先前的线索不能确定地产生精确的深度信息。
描绘这种模糊性,我们看到从光学中心(即摄像机位置)看到的 P1 和 P2 ,投影到像*面上的P1’和P2’是等价的。
图形描绘显示了来自单目视图(即,单个图像)的深度模糊。从单个视角来看,结构和深度本质上是不明确的。上图显示,单一视图的框架和深度是模糊的。请注意,上面的示意图在本文末尾会更有意义,因此,应该在讨论核几何时返回。作者创造了它们。
三立体声问题
立体在很大程度上受到生物学的推动(即,使用左眼和右眼同时捕捉视觉信息)。
S .伯奇菲尔德,克莱姆森大学 ECE 847
经典立体声方法的灵感来自于我们感知深度的方式,如上述线索。例如,可以使用刚体解算器来求解 3D 空间中的球面坐标方程,其中图像是从现场的不同角度或视角拍摄的,从而产生视差和其他效果。然而,这个系列将更加专注于深度学习解决方案(DL)。在进入任何细节之前,我们需要对这些基本原理有一些初步的了解,所以让我们从这里开始吧!
接下来,我们将回顾为什么立体对(即,左图像和右图像)足以解决前面提到的模糊问题。它使用两个相机都能看到的世界坐标中匹配对应点的两个图像*面的三角测量。
三.立体视觉方法
传统算法分为两大类,具体来说是局部和全局方法,对应于步骤:
- 成本计算。
- 成本汇总。
- 视差优化/计算。
- 视差细化。
当我们探索现代的、数据饥渴的、端到端的解决方案时,这些步骤将类似于本博客中涉及的系统的许多模块。但是,首先,让我们回顾一下立体视觉的基础。
III.b 极线几何(概念)
沿着由相交射线形成的*面的法线称为核*面。同样,我们假设立体对之间的校准图像和点对应。
三角测量的原理,如上所示,允许通过光线追踪到世界坐标中的交点(又名场景点)进行 3D 重建。追踪光学中心到场景点是通过匹配从左到右图像(反之亦然)的对应关系来完成的——作者的照片。
核线 约束将对应问题简化为沿共轭 核线的 1D 搜索——如下图所示。
核线约束变换立体对,使两幅图像的核线*行。核几何将对应问题简化为 1D 搜索(即,沿着共轭 核线搜索匹配点)。作者创造了可视化。
因此,核极约束假设校正的立体图像,意味着相同的核极*面(如上所示)跨行对齐。它与两者正交并彼此对齐1。使用基于内部和外部参数的变换来校正图像是一个可以追溯到几十年前的过程。
立体像对是由相对于彼此位置已知的两个相机捕获的场景的图像。视差测量左右摄像机(即立体对)之间的水*距离(以像素为单位)。因此,使用核几何沿着校正图像的水*线约束视差。
图像矫正的过程。一个立体像对(中间的灰色图像)在校正过程中被转换。因此,核线是水**行的(最下面的黄色照片描绘的是校正后的图像)。视差与 3D 场景中的深度有关(图中最顶端的绿色空间)。将图像*面(即立体对)重新投影到*行于光学中心之间的线的标准*面上;像素运动在此变换后是水*的(右侧视图中的黄色方块)-图片由作者提供。
具体来说,左图像中的一个点( x , y )在右图像中的( x-d , y ),其中 d 为视差(以像素为单位)。然后,像素位移通过焦距 f 和被称为基线 B 的相机之间的距离与深度相关:z = f ∙ B/d ,其中 z 是在三个坐标空间中恢复的深度值。
请注意,校正后的立体图像对的核线在校正前是不*行的(顶部)。因此,扭曲图像通过变换图像对来约束点对应的搜索,使得核线*行(底部)。作者创造了这个人物。
下图描述了立体像对(即输入)和生成的视差图(即输出)。
视差(中间)表示从左到右的像素移位(即,每个对应点移位的像素数量的整数值)。作者创造了可视化。
我们找到两幅图像中的对应点来估计相对深度。如上所述,视差和深度直接相关如下。
同样,我们可以将等式表示为(x, y)=(x' — D(x, y), y'), as (x, y) is the point in the left image and (x', y') is the corresponding point in the right image. Hence, the magnitude of D(x, y) is the number of pixels shifted along the horizontal (i.e., x-direction). Notice the y-axis remains constant. Referring to the image of the building above, at the point marked in red, the value of D(x, y) will be the magnitude of the vector depicted in the right image. Take a minute to understand this, for it shows the very meaning of disparity.
III.c 极线几何(数学)
我们现在将解释上面介绍的概念背后的数学原理。对于那些对为什么立体声从严格的数学角度起作用的细节不感兴趣的人,请随意跳到下一部分(这里是)。
从校正后的图像对中,深度 Z 可以通过其与视差 d 的反比关系来确定,其中视差定义为比较左右对应时沿水*方向的像素差,即 I ( x ,y【T32)=D(x+D,
这种关系最容易从视觉上把握。
提供在世界坐标(X,Y,Z)中投影的左图像*面 P_L( x , y )中的点作为 3D 场景中的点,我们的目标是重建提供立体对的缺失的 Z(深度)。
左侧图像中的点-投影到世界坐标的位置-作者提供的图像。
下图显示了右侧图像*面中的对应关系。
假设我们知道 P_L 对应 P_R. Image by Author。
我们设置相对世界坐标(红轴)以及两个相机中心之间的已知基线 b :
基线 b 代表摄像机之间的实际距离。图片作者。
我们得到了
立体视觉理论基础。图片作者。
我们可以用下图表示坐标。
传统立体视觉综述。图片作者。
第四代立体视觉系统
多年来,立体视觉一直是研究界感兴趣的问题。如今,人们可以把不同的方法归为三代之一。
第 1 代、第 2 代和第 3 代,其中第 2 代和第 3 代将包含在系列的后续部分中。图片作者。
关于用于视差图估计的 DL 系列,我们可以将方法描述为以下任一种。
传统方法(非端到端)和现代方法(端到端)的特点。作者创建了可视化。
下图描述了(2)中列出的端到端系统。
学习具有权重θ的映射函数 f,使得当将预测的视差 f _θ(I)= D’与作者的 G.T .视差 D .图像相比较时,输入图像张量 I 具有对于某个距离度量 D 最小化的损失 L。
正如我们将在前面的部分中看到的,代表 DL 网络的黑色(橙色)方框可以包括几个子模块,通常串联级联。不同的步骤类似于传统立体视觉系统中涉及的常规步骤。
五.未来的工作
接下来,我们开始回顾基于深度学习的深度估计方法的进展。具体来说,在第二部分中,我们涵盖了几个跨越 2015-2020 年的基于图像的深度立体网络(即 MC CNN 1、DispNet [2]、GC-Net [3]、PSMNet [4]、iResNet [5]和 GA-Net [6])。然后,第三部分、第四部分和第五部分将涵盖最新和最大的(即 2021–2022)基于视频的立体方法,称为多视图立体(MVS),并分别在子像素级别生成置信图。
六.结论
随着最*深度学习的进步,立体视觉技术正在取得长足进步。一个多部分系列的第一部分**涵盖了经典立体视觉技术的基础:草稿是一项正在进行的工作,每个草稿都应该在接下来的几周甚至几个月内完成。
如果你想了解更多关于在工作或研究中使用深度估计的信息,请不要犹豫,直接联系我或者在下面留言!我们可以帮助您从今天开始。在第二部分中,准备学习各种用于立体视觉的图像级深度模型。
看看第二部分。
* *
七参考文献
1 C. Loop 和 Z. Zhang。计算立体视觉的矫正单应性。IEEE 会议。计算机视觉和模式识别,1999。
[2] Zbontar、Jure 和 Yann LeCun。"立体匹配通过训练卷积神经网络来比较图像补丁." J .马赫。学习。第 17.1 号决议(2016 年):2287 至 2318。
[2] Mayer,Nikolaus 等人,“用于训练卷积网络进行视差、光流和场景流估计的大型数据集。”IEEE 计算机视觉和模式识别会议论文集。2016.
[3] Kendall,Alex 等,“深度立体回归的几何和上下文的端到端学习”IEEE 计算机视觉国际会议论文集。2017.
[4]常、贾仁和."金字塔立体匹配网络."IEEE 计算机视觉和模式识别会议录。2018.
[5]梁,,等,“通过特征恒常性学习视差估计”IEEE 计算机视觉和模式识别会议论文集。2018.**
[6]张,,等.“Ga-net:端到端立体匹配的引导聚合网”IEEE/CVF 计算机视觉和模式识别会议论文集。2019.
在 LinkedIn 、 Twitter 和脸书上关注罗宾逊博士
*https://www.jrobsvision.com/
阅读更多由约瑟夫·罗宾逊博士在媒体上发表的文章
https://jvision.medium.com/remote-development-with-pycharm-d741287e07de https://jvision.medium.com/reduce-the-clutter-adapt-the-space-6daeef2e2ca9
深度估计:基础知识和直觉 作者 Daryl Tan ,是我在准备本系列第二部分时偶然发现的一篇博客,是一篇很棒的文章。它很好地补充了第一部分(即这篇博客)。此外,主题将帮助我们更深入地理解这个主题。
突击测验
这里有几个关于立体视觉的问题,如果思考和回答,将提供更大的洞察力。在下面评论你的答案和问题。利用从本系列第一部分中获得的经验:顶级答案和问题将得到认可。🏆
a)捕食者与猎物
适者生存;生存进化的概念:我们能把立体视觉的概念与野生动物的生物构成联系起来吗?
比较猎物(即羚羊)和捕食者(即猎豹)的视野有什么不同?
动物照片由加州科学院提供。作者修改了一下。
该图显示了一个捕食者和它的猎物以及它们立体视觉的*似示意图。考虑深度、视野和精确度。你为什么假设这是不同的?当考虑不同的立体视图时,你会想到什么好处和问题?
b)fisher-price 的立体视觉
图片来自 fisher-price.com
回想一下费雪公司的 3D 幻灯片浏览器。它到底是怎么工作的?音响起作用吗?如果有,如何实现?利用了哪些线索?从稍微不同的视点拍摄的同一主题的两幅图像如何融合产生 3D 效果?
c)其他问题
1.猎豹和羚羊立体看到的东西有什么区别?
2。不能用立体视觉寻找猎物的动物是什么?
3。哪些动物没有立体视觉系统,但使用其他感官(如嗅觉、听觉)来捕猎和探测猎物?
4。猫和狗谁的视力更好?*
康威推论如何破坏你的数据组织
意见
康威定律有一个邪恶的推论,它在开发领域不为人知,但会摧毁你的数据组织。
“你认为这是一次黑客攻击,但你所攻击的只是你数据的价值。”(作者)
图片由斯文·巴尔诺扬拍摄。
梅尔文·康威是一位才华横溢的计算机科学家,他也发明了协程的概念,在过去的 20 年里,他因为一条以他的名字命名的定律而变得非常有名:
任何设计系统(广义定义)的组织都将产生一个设计,其结构是组织的沟通结构的复制
事实证明,当我们走向领域驱动设计和微服务架构的世界时,这是非常重要的。该法律还可以通过所谓的“逆康威策略”来实施。但是他的定律也对数据世界产生了影响,这并不有趣。
让我们后退一点…
康威定律隐含康威推论
最*,我观察到这个定律的一个隐含意义。我喜欢称之为“康威推论”,尽管我很确定这是一件很*常的事情。
简而言之,如果你的开发部门为人们提供了命名歌曲列表的工具,但没有为他们提供添加标签/类别的方法,人们将开始使用这个名称来做他们“真实世界”领域中常见的事情。他们会用“X-my-song-list”来标记过时的列表,用“JAZZ-my-song-list”来表示类别,等等。
用更通俗的话来说…
“人们会适应 显性的 系统 他们会适应 隐性的现实世界的商业概念 。”
这听起来像是一件微不足道的事情,类似于一种变通办法。但是这些“隐含的概念”对这个世界的数据组织有着可怕的后果。这些隐含的概念完全没问题,只要不重要。但是当它们变得重要时,数据世界就崩溃了…
为什么 Conways 推论对数据组织如此不利
问题是,数据的价值在于业务领域,而不是技术领域。在我们的歌曲列表示例中,一些典型的数据应用程序是歌曲列表的推荐引擎,或者是 bi 工具中用于评估特性采用情况的数据。
那么会发生什么呢?数据人员可能会重新创建“标签/分类”的业务概念,并从名称中提取出来。推荐引擎将需要它来排除存档列表,BI 系统将需要它来按类别分组。
更糟糕的是,在这种情况下,两个实体将实现这个逻辑。
问题是,如果这种环境在商业世界中很重要,那么“抽筋”就会越来越严重;随着歌曲列表概念的每次重用,两个数据团队将不得不调整他们对这种“隐含的业务上下文”的理解。
我们该怎么办?我们创造环境!
解决方案非常简单,要么创建一个新的有界上下文,要么将它放入一个已有的上下文中。从技术上来说,这也很容易做到,你只需要在某个地方放上一个“包装”,然后假装得到它。
在我们的示例中,负责歌曲/歌曲列表域的人因此创建了一个小存根,它基于命名公开了两个简单的标签:
- 基于第一个单词的类别,
- 和基于前导 x 的存档标志。
仅此而已。在未来的某个时候,这个领域团队可以实现实际的标签,并在包装器后面进行简单且不间断的更改,同时推荐引擎和 BI 系统继续工作。
问题?这超出了数据组织的范围
首先,这种事情经常发生。特别是当开发团队重用技术概念时,他们有时会忘记隐含的概念,这些概念会被束缚在技术概念中。这导致了一个两难的境地:
- 对于开发团队来说,这“只是一个技术概念”,实际上并不是商业概念,
- 但是对于数据世界,它变成了一个商业概念,因为康威的推论。
除了意识到,没有简单的方法来解决这个困境。建筑师应该注意这些事情。在这种情况下,创建至少封装了概念的包装器总是一个好主意。数据团队也可以在他们这边创建这样的包装器,至少让问题变得透明。
最后,在我看来,摆脱困境的最简单方法是让产品经理用心。因为如果一个新的特性/产品以“我为什么要这么做?我怎么知道我正朝着正确的方向前进?”,答案几乎总是涉及数据和正确的上下文。
达斯克如何加速熊猫生态系统
原文:https://towardsdatascience.com/how-dask-accelerates-pandas-ecosystem-9c175062f409?source=collection_archive---------42-----------------------
深入了解 Dask 数据框架,以及它是如何工作的
澳大利亚八月在 Unsplash 拍摄的照片
Python 有大量的开源库,简化了数据科学项目的开发。一些著名的 Python 库,如 Pandas、Numpy、Scikit-Learn,提供了高级的可用和灵活的 API 以及高性能的实现。这些库专注于提供大量的 API,但是很大程度上忽略了性能和可伸缩性。
换句话说,这些库无法加载大型数据或内存不足的数据集,也无法执行探索和可视化。Dask library 来帮忙了,它有一个类似于 Pandas 和 Numpy 的 API,并通过在所有 CPU 上并行化来加速工作流。
在本文中,您可以深入分析 Dask 框架以及它是如何工作的。
注意:在本文的最后,您可以获得比较 Pandas 和 Dask 库的基准时间约束,并观察 Dask 的性能如何优于 Pandas。
Dask:
Dask 是一个开源的 Python 库,它提供了高性能的实现和类似于 Pandas 和 Numpy 库的 API,以及通过在所有 CPU 上并行化操作来加速工作流的能力。它是一个灵活的库,可在大于内存的数据集上进行多核和分布式并行执行。
- 高级集合: Dask 提供了一个高级集合,比如数组、数据帧,它们扩展了 Numpy 和 Pandas 的通用 API 以及分布式环境。这些集合在动态任务调度器上并行运行。
- 动态任务调度:这是线程化和多重处理库的一种替代方式。Dask 提供了一个并行执行任务图的动态任务调度器。
(来源),Dask 工作架构
如上图所示,Dask 提供了 5 个高级集合:Dask 数组、Dask 数据帧、Dask 包、Dask 延迟、Futures。对这些高级集合的任何计算都会生成一个任务图。这个任务图由动态任务调度器并行执行。
高级系列:
如上图所述,Dask 框架有 5 个高级集合,扩展了 Pandas、Numpy、Scikit-Learn 等的公共接口。
Dask 阵列:
Dask 数组是由存储在块中的多个 Numpy 数组组成的数据结构。换句话说,一个 dask 数组可以分成多个 Numpy 数组。Dask 数组的 API 非常类似于 Numpy 库。
(来源),Dask 阵列分为多个 NumPy 阵列
在 Dask 阵列上执行的任何操作都是在 Numpy 阵列上执行的。Dask Arrays 使用分块算法来执行计算,该计算使用系统的多个内核来并行化计算。通过将大的 NumPy 数组分成较小的块,它允许用户执行超出内存的计算和加载大于内存的数据集。
Dask 数据帧:
类似于 Dask 数组,Dask 数据帧由多个 Pandas 数据帧组成。为了提高效率,dask 数据帧按行划分为小熊猫数据帧分组行。
(来源),Dask 数据帧分成多个熊猫数据帧
通过将 dask 数据帧分成 Pandas 数据帧的较小块,计算使用内置的分块算法并行运行。Dask 使用内存映射,它不会一次加载全部数据,而是与操作系统同步指向数据的位置。
Dask 包:
Dask Bags 是 Python 对象的高级并行集合,用于处理半结构化或非结构化数据集。与其他 dask 集合一样,Dask Bag 遵循惰性传播,可以在机器集群上轻松实现并行化。
初始数据消息传递和处理是使用 list、dict、sets 完成的,因为初始数据集可能是 JSON、CSV、XML 或任何其他不强制使用严格数据类型的格式。Dask 包可用于此类任务。
简单地说,Dask 包可以被称为:
dask.bag =映射、过滤器、工具+并行执行
Dask 延迟:
Dask Delayed 是一个 Dask 集合,可用于并行化自定义函数和循环。延迟函数可用于并行化现有的代码库或构建复杂的系统。
它不是快速执行函数,而是延迟执行,将函数及其参数放入任务图中。一旦调用**.compute()**
函数,它将被并行执行。
动态任务调度:
动态任务调度器被设计为仅在个人笔记本电脑上扩展到数千个节点集群。
(图片由作者提供),动态任务调度架构
Dask 中的所有高级集合都有生成任务图的 API,其中图中的每个节点都是普通的 Python 函数,节点之间的边是普通的 Python 对象,这些对象由一个任务作为输出创建,并在另一个任务中用作输入。在生成这些任务图之后,调度器需要在并行硬件上执行它们。
(source),使用动态任务调度程序并行执行的示例任务图的动画
一些基准数据:
(图片由作者提供),Pandas 的基准时间约束以及小型、中型和大型数据集的 Dask 数据框架
以上基准时间限制是使用笔记本电脑记录的,配置: RAM (8GB)、磁盘(1TB)、处理器(i5–第八代@ 1.6GHz)。
结论:
在本文中,我们将深入了解 Dask 框架,包括其高级集合和任务调度。Dask 构建在著名的 Python 库之上,可以在内存不足的数据集上加载和执行探索和可视化。它遵循惰性求值、内存映射和阻塞算法的概念。
还有各种其他框架,如 Vaex、Modin、Ray、Rapids 等等,可以并行化现有的 Pandas 生态系统。阅读下面提到的文章,了解更多关于 Vaex 框架及其实现的信息。
参考资料:
1 Dask 文档:https://dask.org/
感谢您的阅读
数据如何在现实世界中发挥作用
原文:https://towardsdatascience.com/how-data-can-make-a-difference-in-the-real-world-dda77eda5de7?source=collection_archive---------17-----------------------
“数据科学”中的“科学”一词可能会让人联想到消毒实验室和安静的图书馆。事实上,大多数数据科学家都在复杂的系统、流程和工作场所中航行,如果不是完全混乱的话。这并不是一件坏事:这也意味着他们的工作直接影响了这个世界和他们周围的人,有时影响深远。本周,让我们探索一些我们最喜欢的关注这种强大联系的帖子。
- 重塑你接*职业的方式 。Eric J. Daza 作为医疗保健数据科学家和数据科学统计学家,在学术和行业环境中建立了长期的职业生涯。在最*与 TDS 的一次对话中, Eric 分享了他一路走来学到的一些最重要的经验,包括需要从业务而不是科学的角度来研究数据科学。
- 最大化数据在非营利部门的影响 。对于任务驱动和资源短缺的组织来说,利用数据科学的力量来制定决策和集思广益战略可以带来重大变化。 Hani Azam 和 Delta Analytics 团队汇集了他们在与众多非营利组织的合作中收集到的智慧,旨在帮助他们“分解成简单易行的小步骤和最佳实践,以充分利用您的数据。”
Yannis Papanastasopoulos 在 Unsplash 上拍摄的照片
- 对你公司的底线有所作为 。对于在行业中工作的数据科学家来说,为他们的团队增加价值的最直接方式之一是帮助防止客户流失。幸运的是,丹尼尔·赫克特和泰勒·穆伦巴赫说,“容易流失的用户通常会在用户行为和客户支持聊天记录中留下他们倾向的线索。”丹尼尔和泰勒的指南继续(非常详细地)展示了数据专业人员如何检测这些用户并支持其他团队的工作,以保持他们的快乐和参与。
- 加速你的机器学习管道 。如果最花哨的模型和最前沿的算法最终让你和你的团队陷入困境,等待几个小时(或几天)的话,它们就没什么意义了!)才能与其他利益相关者分享您的见解。本·韦伯向我们介绍了实时特征工程,并解释了如何构建能够在数毫秒内响应预测请求的 ML 管道。
- 优化您的数据科学工作流程 。超越机器学习模型,进入完整的端到端数据科学生命周期, Adiamaan Keerthi 分享可行的建议,帮助您提高生产力和效率。在这个由两部分组成的系列的第一篇文章中,他介绍了 Jupyter 笔记本技巧,并包含了许多方便的代码片段,可以为您节省更多的时间。
- 退一步反思人类和机器的认知 。我们不可能让所有热爱理论的读者饿上整整一周——尤其是当我们刚刚发表了加迪·辛格的最新文章。他在理解的本质及其与人工智能未来的关系方面的工作的实际意义可能仍然需要几年的时间,但你不会想错过像这样发人深省的阅读。
如果你的数据科学工作帮助你更好地了解——甚至只是看到——你周围的世界,我们希望你考虑写下来,并与我们的社区分享。
直到下一个变量,
TDS 编辑
我们策划主题的最新内容:
入门
- oct Is 初学者指南:优化和比较主题模型很简单
- 由 Natassha Selvaraj 用 Python 构建一个机器学习 Web 应用
- 避免带有偏斜计数数据的机器学习模型中的错误作者赵明杰
实践教程
- 深度 Q 学习解决悬崖漫步问题作者沃特·范·赫斯维克博士
- 如何处理预测中的不确定性作者迈克尔·伯克
- 获得模型性能的置信区间作者大卫·B·罗森(博士)
深潜
- 如何用 Python 将数据库可视化为网络图作者托马斯·鲍姆加特纳
- 使用 Python 中的贝叶斯结构学习检测因果关系的分步指南
- 负责任的 AI 在行动由奥利维尔·佩内尔
思想和理论
- 神经网络修剪 101 由雨果·泰西耶
- word 2 vec 实际学的是什么?康斯坦丁·库茨科夫
- [勒贝格测度与积分指南](http://A guide to the Lebesgue measure and integration)作者张希楚
数据驱动的人工智能和人工智能如何为各行业的高投资回报率企业决策提供支持
原文:https://towardsdatascience.com/how-data-driven-ai-and-ml-empower-high-roi-corporate-decision-making-in-various-industries-3c28499d919?source=collection_archive---------23-----------------------
处理大量数据并产生快速见解——人工智能通过战略性地做出更大、更好的决策,让公司领先一步。
吉利在 Unsplash 上的照片
人工智能能做出比人类更好的决策吗?
是的。但是破坏人类智慧也是不明智的。
人工智能和决策是一个相对较新的课题,随着 决策智能 框架的出现而出现。它将数据科学和机器学习与管理决策结合起来。
在 Gartner 的 2020 年宣传周期中,决策智能被报道为新兴的工程学科。 Gartner 已经开发了一个决策智能模型,可以识别和评估帮助企业做出明智决策的决策建模技术。
人工智能是技术进化的下一个阶段,已经显示出有希望的结果。 麦肯锡全球研究所的研究报告称,到 2030 年,人工智能可以为世界经济增加 13 万亿美元,支持全球 GDP 每年增长* 1.2%。
随着每一天的过去,这些行业都在积累难以想象的海量数据。公司正在探索各种技术来处理大量的信息,并利用这些信息为自己谋利。他们正在探索人工智能所提供的预测分析的潜力,从而实现基于人工智能的决策。
普华永道的一项调查显示,86%的参与者表示,人工智能将在 2021 年成为他们公司的“主流技术”。他们的公司增加了人工智能投资,并加快了人工智能的采用计划。
人工智能每天都在为我们做出至关重要的决定。从智能天气预报到网飞和 YouTube 视频推荐系统,人工智能正在产生影响。医院正在使用人工智能解决方案来降低管理任务的成本,并为医疗保健人员提供决策支持。营销行业正在为高转换率等进行自动化的广告活动。
在本文中,我们将讨论人工智能在决策中的各个方面,以及它如何为利益相关者带来高 ROI(投资回报)。
人工智能在决策中的三个层次
几个世纪以来,人类的智慧和才智一直推动着关键决策的制定。随着数十亿字节的可用信息,智慧和智力不再可靠。
Gartner 的一项调查表明,当前的决策过程是不可持续的,需要重新设计。调查发现,与两年前相比,今天做出的 65% 的决定更加复杂。
现代决策需要一种技术方法来分析大量信息。由于其大规模处理信息和预测结果的能力,人工智能已经成为战略决策不可或缺的一部分。
人工智能决策分为三个层次:
决策支持:通过使用各种人工智能技术分析数据来收集关键见解。最终决策是数据驱动的洞察力、人类经验、情感和智能的结合。
决策增强:人工智能迅速探索成堆的复杂数据,并推荐决策。人类可以根据自己的知识和专长接受或拒绝人工智能的建议。
决策自动化:人工智能的预测能力足够准确和一致,完全可以信任它自己做出决策。系统可以在没有人工干预的情况下做出自己的决定。
在决策中使用人工智能的好处
这些年来,人工智能的预测精度已经大大提高。有了更准确的模型,人类利益相关者可以依靠人工智能来非常自信地做出明智的决定。决策中的人工智能在整个业务生命周期中具有广泛的好处。
商业自动化:人工智能驱动的自动化处于第四次工业革命的前沿。通过自动化繁琐的重复性任务,企业可以节省大量时间。所有主要行业都在将自动化应用到他们的制造、营销、资源分配和销售过程中。预测供给和需求可以优化收入流。
自动化系统不太容易出现人为偏差和无意错误。它可以通过减少对人工的依赖来降低业务支出。
标准化信息:优质的 AI 产品需要有价值的数据来获得想要的结果。企业从各种来源收集原始的非结构化信息,如公共数据集、互联网搜索、内部业务流程、市场调查和采购线索等。
“如果有一件事可以让我们每年节省数千亿美元,那就是从数据模式的标准化开始”——Vishal chatrah, Secondmind 的首席执行官
古代:微笑:(大概五年前)这个原始信息是人工处理分析的。有了人工智能,所有的信息都会被自动处理。不同的人工智能技术可以标准化信息,而不考虑数据来源。人工智能模型还可以快速适应各种类型的信息,以提取相关结果。
观点挖掘:情感分析或观点挖掘是了解客户想法的最重要的工具。广告商使用在线搜索偏好、博客帖子、调查、评论、电子邮件、推文和所有其他与用户相关的活动来挖掘客户想要的东西。这些信息有助于他们提高客户满意度和客户关系。
人工智能给出了强大的自然语言处理(NLP)模型,可以对任何类型的信息进行情感分析。NLP 模型在理解人类情感方面变得更好。使用人工智能,品牌可以执行社交媒体挖掘,并实时听取客户的需求,提供更个性化的产品体验。
客户关系管理(CRM): CRM 系统对于公司供应商、客户和员工的有效管理至关重要。人工智能支持的 CRM 工具可以提供准确的销售见解,并支持高管做出明智的战略决策。
它们可以检测销售数据中的模式,预测销售线索得分和客户流失率,使企业能够采取实质性措施来防止任何损失。人工智能驱动的虚拟助理可以利用 CRM 数据,这些虚拟助理可以处理单调乏味的办公室任务,并适应客户的查询。
高投资回报率和更好的决策:标准化的数据、优化的业务流程、自动化的市场情绪分析和人工智能支持的客户关系管理系统使企业能够做出更好的决策。人工智能可以最大限度地减少错误决策的百分比,降低管理费用,保证高投资回报率。如果业务的任何方面发生变化,人工智能可以实时捕捉到它,并帮助决策者优化供需管道。
各种行业中基于人工智能的决策
企业正在依赖数据支持的人工智能来支持人类决策者,这对制造商和消费者都有利。让我们分析一些人工智能正在推动决策过程的行业。
粮食&农业:地球上所有生命的生存都依赖于优质粮食产品的持续供应。人工智能应用可以帮助我们实现粮食安全,促进可持续的粮食生产,并最终结束世界饥饿。 联合国粮食及农业组织(FAO) 使用人工智能、人工智能和卫星图像来监控干旱等农业压力。他们开发了一个名为 FAMEWS 的移动应用程序,可以监控 20 种植物害虫的传播,限制农作物的破坏。他们的人工智能还可以智能地管理农业供水。所有这些进步都有助于这一部门的可持续增长。
医疗保健:图像识别和图像分割是机器学习提供的强大工具,在医疗保健领域有着广泛的使用案例。现在,使用 ML 可以在 x 射线和 CT 扫描中检测各种癌症和医学异常。 InferVision 使用 AI 和 ML 检查数千次 CT 扫描,以检测癌症迹象,支持放射科工作人员做出更准确的决策。
银行业&金融服务:银行使用人工智能欺诈检测系统来处理贷款申请。由 underwrite.ai 开发的一款此类产品分析企业的贷款申请,以预测其信用风险。他们使用遗传算法(GA)等人工智能技术以及机器学习和大数据来分析贷款组合。
旅游&酒店:人工智能正在解决旅行行业面临的各种问题,比如提供个性化和自动化的客户支持体验,以及预测旅行中断。 Hopper 通过预测预订和购票的最佳时间,以高达 95%的准确率协助旅行者做出更好的旅行决策。 Utrip 是一个人工智能推荐系统,提供个性化的旅行体验,并在预订数量上有业内证明的增长。 朱莉——一名来自美国国家铁路客运公司的人工智能助手每年可以预订火车并回答超过 500 万次查询。
物流&运输:顺畅的供应链运作在很大程度上依赖于高效的物流和运输。物联网和人工智能正在用智能应用颠覆这个行业。 KeepTruckin 是一个基于人工智能的车队管理系统,可以确保司机的安全,提供 GPS 跟踪和智能路由,并降低燃料成本。他们的 AI dashcam 使用计算机视觉来检测和防止不安全的驾驶事件,并向司机发出实时警报。
制造业:人工智能在制造业中也很有用。汽车制造商沃尔沃使用基于 ML 的技术来监控他们的汽车在危险条件下的性能。各种传感器安装在汽车上,收集不同的驾驶变量。ML 使他们能够评估车辆的安全性。
营销:像 Albert 、 Gumgum 和 Wordstream 这样的各种产品都在有效地使用人工智能和机器学习来设计优化的广告活动,并撰写动态广告文案。
零售&电商:零售和电商是最适合 AI 颠覆的行业。从需求预测到自动化库存管理,人工智能正在帮助零售商制定更好的战略。英特尔利用人工智能技术,通过智能货架检查商品的可用性。他们的智能自助结账系统可以检测缺失或不可读的条形码,他们的无接触式自助服务终端可以识别语音和手势,与客户互动。另一个产品 MakerSights 使用人工智能在产品的整个生命周期中做出明智的决定。它有助于零售品牌增加利润和预测最畅销的商品。
房地产:房产价格预测是 AI 在房地产领域最常见的应用。人工智能正在对房地产行业的几乎每个方面产生影响。 Zillow 是一个以人工智能为中心的个性化房产推荐系统。它还通过分析买家信息和参与度,将代理商与认真的买家联系起来。其他产品如 Skyline AI 和 Proportunity 收集各种数据点来预测房地产价格。
娱乐&游戏:人工智能通过让用户在屏幕上呆上几个小时来推动娱乐业的发展。像 Dota,Overwatch 和 Counter-Strike 这样的游戏广泛使用 AI 作为训练玩家的教练代理。基于人工智能的游戏让人类玩家很难获胜。流媒体服务使用人工智能根据用户的兴趣推荐内容。甘创造的栩栩如生的时装模特将会改变时装业。像 SyncWords 这样的基于人工智能的工具可以自动为实时视频和预先录制的会话创建和翻译字幕。
能源:能源部门正在使用人工智能对各种设备和发电厂进行异常检测。传感器收集机器的实时状态,人工智能发现故障模式,通过及时发出自动警报来防止任何危险情况。英国石油巨头 BP plc 正在使用人工智能来监控他们的天然气和油井的状况,以节省成本并提高运营效率。
阻碍决策采用人工智能的因素
2021 年,公司很容易变得以人工智能为中心。虽然一些人正在收获他们基于人工智能的投资的果实,但大多数人仍处于原型或概念阶段,希望有一天能够收支*衡。让我们来看看为什么公司不能把他们基于人工智能的想法变成现实的一些原因。
识别机会:这个世界没有足够多成功且鼓舞人心的人工智能用例。商业利益相关者没有意识到人工智能的潜力以及它如何影响他们的决策过程。只有随着时间的推移和不断的探索,AI 才能够驱动核心的业务引擎。
缺乏专业技术知识:尽管人工智能已经存在了 50 年,但它在世界范围内的实际应用只是在几年前才开始。没有足够的技术资源具备必要的人工智能理论和实践知识。
“人工智能其实是比较容易的一点。难的是要确保该组织真正拥有能够进行人工智能的*台和技术。这些事情正在减缓采用曲线。”西蒙·格林曼,联合创始人, 最佳实践 AI
对于计划将人工智能引入其业务流程的公司来说,一个变通办法是考虑外部供应商或雇用已经证明具有人工智能专业知识的 ML 专家来实现他们的业务需求。
收集有用的数据:在人工智能中,伟大的决策都是基于精确筛选的数据集。公司正在开发标准化的数据架构,以便将所有信息整合到一个地方。收集原始和非结构化数据是没有用的。将其转换为结构化数据,并使用高级人工智能模型进行处理,是唯一的出路。
扩大规模:一旦人工智能产品投入生产,下一步就是扩大规模。在人工智能中,缩放需要动态人工智能模型,这些模型可以根据实时输入数据进行适应和改进。许多公司努力适应这些变化。因此,决策过程受到严重影响。
期望短期内获得巨大回报:一切美好的事物都需要时间,但投资者总是寻求快速回报。尽管人工智能承诺通过改善决策增加收入,但它不能保证投资者需要多长时间才能开始看到大钱。
重要的是将问题分解成小块,从选择一个能在短期内产生最佳效果的开始。这就是组织变得更懂人工智能的方式。他们开始理解人工智能能做什么,不能做什么,我认为这是一个很好的起点。 Silo.ai 首席执行官 Tero Ojanpera
缺乏对人工智能的信任:人工智能架构对市场来说相对较新,保护它们是一个更大的挑战。各公司正在努力提高其部署的人工智能模型和数据中心的安全性。但即使是最安全的产品也容易受到网络安全威胁。因此,投资者对在他们的业务流程中采用人工智能犹豫不决。
技术日新月异。传统的软件开发策略正在被以人工智能为中心的现代方法所取代。公司现在更好地理解了将人工智能纳入决策过程的好处,因为它有望获得更大的投资回报。但它伴随着不确定性和一定程度的人工智能无知。人工智能专家常说:
对于人工智能,我们只是触及了表面。
随着越来越多的公司继续投资人工智能并开发生产规模的解决方案,投资者和利益相关者将获得更多信心,并开始更多地依赖人工智能来推动其关键的商业决策。
参考
1)https://towards data science . com/introduction-to-decision-intelligence-5d 147 ddab 767
2)https://the innovator . news/ai-decision-making-state-of-play-and-what-next/
3)https://www . McKinsey . com/~/media/McKinsey/Featured % 20 insights/Artificial % 20 intelligence/Notes % 20 from % 20 frontier % 20 Modeling % 20 the % 20 impact % 20 of % 20 AI % 20 on % 20 the % 20 world % 20 economy/MGI-Notes-frontier-Modeling-the-impact-of-AI-the-the-the-world-economy-2018 . ashx【2018 年 9 月
4)https://www . PwC . com/us/en/tech-effect/ai-analytics/ai-predictions . html
5)http://www . FAO . org/e-agriculture/news/there-potential-adopting-artificial-intelligence-food-and-agriculture-sector-and-can-it
6)https://www.hopper.com
7)https://www . Amtrak . com/about-Julie-Amtrak-virtual-travel-assistant
8)https://keeptruckin.com/
9)【https://www.zillow.com/
10)【https://www.skyline.ai/】T4
11)https://www . Intel . com/content/www/us/en/customer-spot light/stories/proportunity-customer-story . html
12)https://www . business insider . com/datagrid-ai-created-spookily-life-like-fashion-models-2019-5?op=1
13)https://machine learning mastery . com/what-are-generative-adversarial-networks-gans/
14)https://www.secondmind.ai/
15)https://global.infervision.com/
16)https://www.makersights.com/
17)https://www.marketingaiinstitute.com/blog/albert-spotlight
18)https://www.marketingaiinstitute.com/blog/gumgum-spotlight
19)https://www . marketing iiinstitute . com/blog/words team-spot light
20)https://www.bp.com/
21)https://www.underwrite.ai/
22)https://www . Gartner . com/smarterwithgartner/how-to-make-better-business-decisions/
23)https://www.bestpractice.ai/
24)https://silo.ai/
数据如何帮助我选择数据职业
原文:https://towardsdatascience.com/how-data-helped-me-pick-a-data-career-66ba0ab24be6?source=collection_archive---------35-----------------------
对我的职业生涯来说,数据驱动的决策是我能采取的最佳途径
斯蒂芬·菲利普斯-Hostreviews.co.uk 在 Unsplash 上的照片
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
我的数据职业生涯是我从零开始建立起来的,我从来不知道我会在这个领域结束。这是我工作的顶峰,也是我感觉在智力上、精神上和经济上真正满足我的东西。这个职业让我很惊讶——因为我从来不认为这个职业是我梦想的工作。
生活有时是令人惊讶的,因为你永远不知道你会在哪里结束,你将来会做什么工作。从我十几岁到 20 多岁,我一直在规划自己的职业生涯,希望成为一名生物学研究者,我很少考虑研究生活之外的职业。我热爱研究工作,我觉得如果没有我的研究,我将一事无成。我对一切都很满意,因为我的环境支持我想做的事情,我觉得我会成为一名伟大的生物研究员——尽管生活总是有不同的计划。
在这篇文章中,我想讲述我的经历,我决定数据职业的思维过程,以及如何使用数据来帮助我决定我的职业步骤。让我们开始吧。
寻找新的激情
我的研究职业道路充满荆棘,因为我选择了一个非常小众的专业,并且在财务方面也不太好。竞争也很激烈,因为研究岗位很少公开。有了这些,我意识到另一个事实——我并不是这个房间里最聪明的研究员。我对研究有很大的热情,但不知何故,这种热情在生物学研究中没有得到很好的体现;要么是我缺乏创意,要么是我文笔不够。无论如何,我在硕士毕业后再也找不到任何研究职位了。
在我的生活中没有太多事情发生,我试图在我的工作中找到新的激情,因为我觉得研究是我可以做的事情,但也许只是不在学术界。这就是为什么我决定做一些研究来寻找我的新激情。
对新职业的研究
我知道我擅长什么——我擅长在我的研究时间内分析数据,我也对我所做的任何工作充满热情。在这段不确定的时间里,我没有任何研究工作可做(博士学位,实验室等等。),感觉需要做一些以前没有做过的事情;行业内求职,学习新技能。但是,我不想盲目地去;这就是为什么我对未来的最佳职业做了一点研究。
作者图片
以上是我研究的一个代表。基本上,我试图找到关于发展最快的职业的数据。下一个未来会是什么?如果我想转行,它应该接*我所知道的,但不会像我以前的职业选择一样没有前途。
研究结果告诉我,许多未来的职业选择与能源、健康或数据有关。能源不在我的选择范围内,因为它不是我的专长,然后健康在某种程度上是相关的,但职业名称对我来说太具体了,最后,数据领域值得更多的研究。
数据职业的未来
首先,我研究了数据技能在未来的价值——它在未来对一家公司来说是必要的吗?这会促进我的事业吗?而且很难学吗?。我找到的一份研究总结让我对所有这些问题有了深入的了解。基本上,我发现:
- 超过 80%的高管受访者表示,数据技能对公司很有价值,
- 81%的受访者提到高级领导职位所需的数据技能,
- 对数据专家的需求逐年增加。
上述研究总结出数据职业在未来将是有价值的,并且有前途的职业,因为需求和顶级职业将需要数据技能。
我还试图寻找另一个研究来源来支持数据职业的未来。世界经济论坛在 2018 年进行的另一项研究发现,73%的受访者预计他们的企业将采用数据技术,到 2022 年,85%的受访者打算扩大他们对用户和实体大数据分析的采用。这一结果很有希望,因为研究还提到建立的数据角色将在未来扩展。
许多研究发现,数据职业很好,我一直坚信数据是每个行业的未来。然而,我还不知道什么是适合我的数据职业(有很多数据职业的头衔)。这就是为什么我看了一下对数据职位进行分类的另一项研究,发现数据科学家位于图表的顶端。考虑到这一点,我觉得数据科学家是我未来职业生涯中会考虑的事情,但数据科学家到底做什么,我需要什么技能?
什么数据技能?
虽然我有一个答案,数据职业会有一个光明的未来,数据科学家是我追求的头衔,但我进入数据职业需要什么样的数据技能,数据科学家以什么为生?
首先,我参考了 customerthink 的研究,以确定数据职业所需的数据技能。这项研究有趣地根据工作角色划分了技能;然而,在数据职业生涯中,只有两种工作角色强调数据熟练程度:业务经理和研究员。他们中的大多数需要以下技能:
- 统计/统计建模
- 大数据和分布式数据
- 机器学习
- 贝叶斯统计
- 数据管理
- 算法
我来自一个研究背景,并已将上述一些技能确定为我的专长,如统计学和贝叶斯,但我仍然缺乏算法、大数据和数据管理的一些技能。尽管如此,我仍然觉得这是一个适合我的职业,因为在我做研究之前,我从来不知道在一个非常需要统计的行业中有一个职位,而且我擅长这个职位。
然后,我试图找到能告诉我数据科学家在日常工作中做些什么的研究。在这种情况下,我发现福布斯很好的研究肯定了大多数数据科学家在他们的就业期间做什么。结果如下图所示。
作者图片
我最初对这些发现感到惊讶。在我看来,数据科学家会通过分析和开发统计建模来彻底处理数据,这是我在研究期间做得最多的。然而,该行业似乎与学术界有着不同的模式,在学术界,大多数数据科学家的时间都花在清理和组织数据上。
我真的很好奇为什么数据科学家需要花这么多时间清理数据?许多参考文献都写了为什么数据清理是必要的,但是大部分都说数据清理是为了提高数据质量——这是合乎逻辑的。
我会想花大部分时间清理数据集吗?在我目前的时间里,答案是肯定的。但是那个时候,我还不确定这个活动。然而,我确信我想从事数据职业,因为所有的数据都显示了一个很好的前景,这与我以前的工作是一致的。这就是为什么,在所有这些研究之后,我决定通过参加在线课程来弄脏我的手,并去训练营,但经验将是另一回事。
密钥查找
从我为寻找新的激情而做的一点研究中,我发现了一些我认为对我的职业决策很重要的关键发现:
- 数据领域是发展最快的职业之一
- 未来对数据专家的需求将会增加,高级水*需要数据技能
- 数据科学家是数据领域最受欢迎的头衔
- 为了在数据领域取得成功,我需要学习 6 种技能:统计/统计建模、大数据和分布式数据、机器学习、贝叶斯统计、数据管理和算法
- 数据科学家的大部分时间都花在了数据清理上。
结论
找到一个新的激情并不容易,尤其是当我已经在我的整个教育中被训练成为一名生物研究员。然而,我需要面对现实,寻找新的工作激情,因为我以前的经历在职业生涯方面没有出路。
这就是为什么我在利用我擅长的东西——分析数据。我正在使用数据来寻找我的新职业,并发现数据职业是发展最快的职业之一,所需的技能与我以前的经验密切相关。
所有的数据都显示了一个良好的前景,而不是一个没有尽头的职业生涯,我决定从事数据方面的职业,并在这个职业生涯中从头开始建立一切。
如果您没有订阅为中等会员,请考虑通过 我的推荐 订阅。
在我的LinkedIn**或 Twitter 上访问我。**
数据规范化如何影响随机森林算法
原文:https://towardsdatascience.com/how-data-normalization-affects-your-random-forest-algorithm-fbc6753b4ddf?source=collection_archive---------6-----------------------
数据标准化在随机森林分类器和回归器中的重要性。
照片由卢卡斯在像素上拍摄
最*,我在实现一个随机森林回归器时,遇到了一个经典的问题:我应该实现数据规范化吗?。
据我所知,基于决策树的算法通常不需要规范化。但是,我意识到,每次我听到这个说法,它都与量词有关,那么回归变量呢?他们需要数据规范化吗?
如果您在互联网上搜索 R 和 om Forest normalization ,第一个链接表明:
- 堆栈溢出 : (1)不,随机森林不需要缩放,(2)随机森林是基于树的模型,因此不需要特征缩放。
- 堆栈交换:感谢评论澄清。基于树的模型不关心某个特征的绝对值。他们只关心值的顺序。因此,归一化主要用于线性模型/KNN/神经网络,因为它们受特征所取绝对值的影响。
但是,在深入研究之后,我发现数据规范化可能会影响输出。所以,在这里我留下了我的外卖和一个简短的 Python 演示。
外卖食品
对于分类任务,随机森林的输出是大多数树选择的类。对于回归任务,返回单个树的*均值或*均预测值。
因此,数据归一化不会影响随机森林分类器的输出,但会影响随机森林回归器的输出。
关于回归量,如果数据不进行转换,算法会更受高端值的影响。这意味着它们在预测高值时可能比低值更准确。
因此,对数变换等变换将降低这些高值的相对重要性,从而更好地进行概化。
实验
在这里,我展示了一个简短的实验,它表明当实现数据规范化时,回归变量的输出会发生变化,但分类器的输出是相同的。
-
导入库
-
加载数据集
选择的数据集是用于回归任务的波士顿房价数据集。
Keys: dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])Feature names: ['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
'B' 'LSTAT']Data shape: (506, 13)Target shape: (506,)
为了将该数据集也用于分类,目标变量已经被舍入。
- 随机森林分类器
下面是随机森林分类器在三种条件下的实现:(1)没有归一化,(2)最小-最大归一化,以及(3)标准化。
正如所观察到的,数据标准化不影响准确度分数。
Accuracy score without normalization: 0.12574850299401197
Accuracy score with min-max normalization: 0.12574850299401197
Accuracy score with standardization: 0.12574850299401197
- 随机森林回归量
下面是随机森林回归器在三种条件下的实现:(1)没有归一化,(2)最小-最大归一化,以及(3)标准化。
在这种情况下,数据标准化会影响回归变量的均方得分。
Accuracy score without normalization: 13.38962275449102
Accuracy score with min-max normalization: 13.478456820359284
Accuracy score with standardization: 13.38586179640719
如果你喜欢这个帖子,请考虑 订阅 。你将获得我所有的内容+所有其他来自牛逼创作者的文章!
数据科学如何加深对城市贫困的理解
原文:https://towardsdatascience.com/how-data-science-can-give-further-understanding-on-urban-poverty-ab52e448913?source=collection_archive---------19-----------------------
根据使用数据科学生成的见解和预测,制定满足人们需求的正确扶贫战略
正如我在之前的文章中提到的,数据是新的黄金。通过实时分析,科技公司可以快速了解他们的客户;例如他们的产品偏好、对营销活动的反应以及可接受的价格点;而无需花费时间和金钱进行广泛的市场调查。这些见解对于管理层决定重点产品、营销内容和定价模式至关重要。虽然这看起来很酷,但我开始思考我们如何利用这项技术来解决更大更复杂的问题,比如城市贫困。如果数据科学可以帮助我们理解消费者行为,那么它应该能够帮助我们理解那些与贫困作斗争的人的实际需求。
在南雅加达看到的对比(图片由作者提供)
在讨论细节之前,我们必须先弄清楚我们对贫困的定义。理论上,贫困主要有两种类型:绝对贫困和相对贫困。绝对贫困意味着无法获得食物、衣服、住所和卫生设施等基本需求。相对贫困是指无法享受体面的生活水*。由于各国的标准不同,这一术语反映了不*等。当经济活动的数量和基础设施的能力无法满足人口的增长时,城市地区就会出现贫困。这将导致城市贫民窟、非正规工作和更高的犯罪率,与中高收入群体相比,他们的经济保障要少得多。贫民窟居民的流离失所将使他们进一步陷入贫困,因为他们将远离自己的收入来源。
政府、非营利组织和援助机构已经为减轻贫困做了几次尝试。例子多种多样,从提供现金转移和公共住房到小额信贷和技能建设培训。然而,许多人未能成功实现预期目标。例如,在 2000 年代末,援助机构分发免费蚊帐,以防止疟疾在非洲村庄传播。大多数村民没有使用渔网,而是用渔网捕鱼,甚至把它们卖到市场,因为他们更需要额外的收入。另一个例子是拉丁美洲和南亚各国为现有贫民窟居民开展的公共住房项目。尽管人们认为新的住房建筑质量不错,但目标用户仍然不愿意搬离贫民窟,因为新的地点不能提供同等水*的经济活动。这一失败是规划和决策的结果,这些规划和决策是基于主观观点或与富人标准的比较,而不是实际了解穷人的需求。大多数项目实际上都举行了公开听证会和焦点小组讨论,但是由于沟通不畅和/或参与者不具代表性,这种对话存在局限性。这就是数据科学派上用场的地方,它是一门使用大量数据来为决策提供见解和预测的科学。
我从比尔·盖茨和拉什达·琼斯的播客“问大问题”中发现了一个很好的数据用例。在一次关于不*等的讨论中,他们特别提到了哈佛大学公共经济学教授哈吉·柴提。利用大数据,Chetty 能够形成一种算法,预测年轻人在洛杉矶特定社区避免犯罪的可能性。在确定了那些发病率高的地区后,他能够看到这些地区的模式和特征。他还发现,像康普顿这样以前属于高犯罪率地区的地区,可以在几年内显著改善。有了这些见解,他可以追溯导致康普顿成功的因素以及在其他社区的潜在应用。
这个案例给了我一个关于发展中国家面临城市贫民窟问题的想法。首先,我们可以通过数字化电缆和管道装置的当前数据来制定公用事业(电力和水)流量的数据集。更先进的是,我们可以将公用事业系统与物联网技术相结合,以监控电力和清洁水供应的可靠性。有了关于公共设施供应和质量的数据集,我们可以与从地理信息系统(GIS)数据中提取的另一个数据集相匹配,以绘制出社区地图。这种新的数据源将使人们了解每个社区可靠的电力和水的可获得性,或者换句话说,确定贫民窟区域。获得这些见解后,我们可以更深入地研究 GIS 数据,以了解贫民窟的类型。这方面的关键要素是房屋的物质条件、主要经济活动以及与公共设施和就业场所的连接。一个直接的反应是:让我们为这些社区提供电力和水。但对我来说,这些信息应该用来更深入地了解目标群体。这将是分析的下一阶段:了解居住者。
在第二阶段,我们可以通过移动应用程序或简单的谷歌表单访问或寻找联系选定贫民窟社区领袖的方式,以帮助识别居民。要收集的数据包括出生地点和日期、性别、职业、收入水*、教育水*以及当前和以前的受抚养人(居民的子女)的信息。最后一个数据点的目的是表明以前年轻居民的发展,如接受高等教育和安全就业。其他数据点将解释他们目前的状况,以及他们当初为什么选择这些定居点。拥有这些数据将有助于预测这些贫民窟的年轻居民稳定就业的可能性。如果可能的话,将学校数据数字化,看看生活条件和学习成绩之间的相关性,会很有意思。社区领导和居民填写这些表格的动机是一个明确的支持计划。这比听起来要困难得多,正确的沟通方式是关键。完成这些数据将使我们能够继续第三阶段:实验。
许多减贫举措是根据国外的成功做法和实施的简便性确定的。问题是,如何确保它能满足穷人的实际需求?再以公共住房项目为例,贫民窟居民是愿意搬到一个有可靠公用设施的新建社区,还是愿意升级他们目前的居住区?如果给他们一个更体面的住处,他们的生产率会提高吗?此外,他们会留下还是以更高的价格卖掉这个单位来获得额外的现金?实验将有助于规划当局了解穷人的需求,就像公司了解消费者偏好一样。为了回答关于住房的问题,我们可以选择两个类型相似的社区进行试验。其中一个将获得资本、设计指南和足够的基础设施来升级他们的居住区,而另一个将搬迁到一个有商业和就业空间的公共住宅区。前者的成本较低,但后者更容易实现。社区领导可以使用数字*台帮助管理和更新进度。几个月后,我们可以通过测量生产率(居民人均收入的增长)和居民满意度来评估这两个项目。升级后的集团可能因为在当前位置有更多的经济活动而具有更高的生产率,反之亦然,因为重新定位后的集团可能很好地适应新环境。这将有助于了解哪个计划会起作用,导致意外结果的因素以及升级到其他领域的可能性。实验输出也可以纳入数据科学家的机器学习算法,以预测计划或未来举措的经济输出。
为了进一步了解城市贫民,规划部门还可以与科技公司合作,利用它们的数据能力。这些公司将是金融科技和共享经济*台,具有相同的扶贫使命。疫情向那些依赖线下活动日常收入的人展示了数字化转型的重要性。要回答的问题是,城市贫民是从现金转移还是技能培养中获益更多?一组将获得电子钱包余额形式的现金,另一组将接受特殊培训,以在共享*台上表现出色,无论是作为司机还是食品商人,他们都将在同一个电子钱包中获得收入。这两个群体将被要求只使用电子钱包消费,这样就可以产生数据进行分析。通过使用技术合作伙伴的数据*台,当局可以了解这两个群体的额外收入和支出模式,以了解哪一个更具可持续性。如果结果都一样有效,甚至无效,我们可以更深入地实验什么是现金转移的正确数量和频率,以及什么技能或激励方案需要改进。
减缓贫穷的一个重要因素是赋予穷人影响决策和政府资金分配的权力。首先在巴西证明成功的一种做法是参与式预算编制。这是低收入群体通过参与地方政府预算编制过程发表意见的地方。通过开发一个数字预算*台,目前的技术也可以用在这里。社区代表可以使用这个*台填写他们渴望的预算,并提交给规划当局。使用数据分析和科学,我们可以看到这个群体认为最迫切需要改进的领域。
总之,数据科学将洞察穷人的实际需求,以制定正确的扶贫计划。有了技术和数据,我们可以了解目标群体当前和潜在的收入来源,提供一个*台来捕捉他们的愿望,并确定最有价值的社会保障要素。这将有助于我们决定促进哪些经济机会、赋予这些群体权力的政策以及分配援助的形式和水*。由于机器学习算法仍然具有主观性,因此仍然存在局限性。尽管如此,数据科学使我们能够更深入地研究人们面临的问题,并不断监测改进情况。我的结束语是:我们可以利用数据进行探索,包括为那些难以满足基本需求的人提供服务的最佳方式。
数据科学如何使网络安全故障排除更容易:防火墙日志分析
原文:https://towardsdatascience.com/how-data-science-could-make-cybersecurity-troubleshooting-easier-firewall-logs-analysis-591e4832f7e6?source=collection_archive---------14-----------------------
行业笔记
改善事件响应运营。使用数据分析技术和工具。
照片由来自 Pexels 的 Pixabay 拍摄
毫无疑问,我们正处于信息时代,从来没有如此多的信息来源,在网络安全领域也是如此。
当有人开始从事数据分析工作时,他经常听说在处理数据之前,大部分时间都花在处理、纠正和标准化数据上。如果不同的制造商使用标准化的日志,如果它们在不同的产品之间是一致的,或者即使日志格式很容易处理,这可能是一个微不足道的操作…那该多好啊…😍
在现实世界中,情况并非如此,在事件响应中,每个客户都是不同的,并且不得不与各种日志斗争是非常常见的。
在大规模事件中,最有用的日志之一是防火墙日志,它提供了有关进出外部的网络连接、内部组织流量以及在某些情况下甚至用户的 VPN 访问的信息。
以我的经验来看,我遇到的最常见的厂商之一就是 Fortinet。这家公司的防火墙非常常见,并且有一种日志类型,虽然很常见,但处理起来很可怕。
Fortinet 日志示例
这种日志是 bash 和 awk 爱好者的噩梦,对于我们这些喜欢更进一步的人来说,这是一个探索和理解数据分析工具重要性的机会😉。
在这种情况下,将分析一个中型组织的单个站点的 VPN 流量。一周内,产生了 1400 万个 VPN 流量事件。
第一步—向 CSV 转型
因为任务是用熊猫的日志来获取证据,我们需要熊猫能读懂的日志格式。
该函数允许我们提取文件每行的标题和字段,如下所示:
- 通过分别捕获数据键、分隔符和数据来提取属性组。这样,对于每一行,我们将能够区分哪些是数据,哪些是键。
- 为所有值分配相同的索引。
- 因为有些字段有分隔符,所以生成了三个组。有必要将结果分组在一列中,以消除空结果。
- 使用列 0 表示标题,使用列 1 表示值,生成包含数据的单行。
以下函数可用于在整个文件夹的文件之间迭代,并逐行读取和创建 Pandas 数据帧:
这个函数没有做什么特别的事情,它只是在日志的第一行创建一个数据帧,并在处理后添加每一行。完成所有行后,它在指定的文件夹中生成一个 CSV 文件,并删除原始数据帧以释放内存。
该功能可轻松修改,以便在所有文件的处理过程中维护生成的数据帧,并最终将数据保存在内存中。
这最后两个功能可以并行执行,以实现更高的处理效率。为此,有必要将它们存储在一个单独的文件中,以便能够从 Jupyter 中正确地执行多进程库。
之后,我们可以执行下面的代码,以并行的方式执行任务。
为了继续,主要有两个弊端。首先,每个文件的列数,因为根据日志的类型,有些文件包含不同的列;其次,处理所有记录所需的内存量。让我们一步一步来🏃🏻。
用 d6tstack 调整立柱
由于日志格式的类型,经常会发现文件中的列数不同,这与数据分析库不兼容。为了解决这个问题,有一个名为 d6tstack 的库。
该库对 csv 文件进行分析,并告诉我们每个文件中有哪些列,哪些没有。
import glob
import d6tstack.combine_csvcfg_fnames = list(glob.glob(r'C:\logs_vpn_out\*.csv'))
c = d6tstack.combine_csv.CombinerCSV(cfg_fnames)# check columns
print('all equal',c.is_all_equal())
print('')
d = c.is_column_present()
输出会是这样的。
Dask 列检查
为了纠正它,库本身提供了用固定列重写新文件中的数据的可能性。
fnames = d6tstack.combine_csv.CombinerCSV(cfg_fnames).to_csv_align(output_dir=r'C:\logs_vpn_out_fix')
一旦修复,我们可以进入下一个阶段,读取文件。
对抗对记忆的需求💪💻
这是数据分析中很常见的问题,我们有很多数据,没有足够的 RAM 来处理。
当我们的任务是定期存储标准化信息时,我们通常会选择将信息存储在 Spark、Elastic 等数据库中……但是在事件响应的情况下,通常需要快速分析一类我们很可能再也不会看到的事件。
为了处理这些情况,有 Dask。
这个数据分析库为我们提供了使用计算机资源以并行方式对日志文件执行查询的可能性。
换句话说,它允许我们有效地处理大量数据,而不必将它们加载到内存中。
当你习惯和熊猫一起工作时,读取文件的过程很快,但很耗时,令人惊讶的是,当用 Dask 读取文件时,响应是瞬时的。
Dask 数据帧创建
重要的是,此时 Dask 还没有读取文件,它已经按索引划分了数据,并且将在需要时读取它们,这就是它在此阶段如此快速的原因。
df物体不是熊猫。数据帧是一个 Dask。DataFrame ,重要的是不要忘记它。
在创建数据帧的过程中,标记每一列的数据类型对于加快查询速度和避免问题非常有用。
日志分析中最常见的用例之一是搜索事件期间的信息泄漏。为了做到这一点,我们将使用 Dask 执行一个查询,以获得一小部分可以在内存中轻松处理的数据。
df_exf = df[["remip", "tunnelid", "sentbyte"]].groupby(["remip","tunnelid"]).max().compute()
这个查询运行了 1 分 28 秒,这就是熊猫和 Dask 的最大区别所在。在 Pandas 中,如果数据适合内存,这个查询会快得多😅。
。compute() 函数允许用 Dask 结果创建熊猫数据帧。
在 1 分 28 秒内,我们对 1400 万条日志进行了查询,我们对它们进行了分组,并将其放在数据框中,Dask 太棒了!
如果您不知道这些日志是如何记录的,这个查询就没有多大意义。每次用户通过 VPN 与另一个 IP 地址建立会话时,都会分配一个名为 tunnelid 的唯一标识符。在 sentbyte 字段中,记录了该会话期间离开组织的信息量,但不是记录每个连接中的字节数,而是累积反映,因此只考虑会话期间所有连接的最大值。
为了便于读取以字节为单位的信息,我将使用这段代码。
前两个 IP 地址是合法的,与研究无关。这是要调查的前 5 个 IP 地址的图表。
发送到外部 IPs 的信息
在这一点上,有必要充实我们现有的数据。为此,我们将使用几个免费服务,MaxMind GeoIP,MaxMind ASN,AbuseIPDB 和 Dan Tor List。
MaxMind ASN
这项服务将允许我们获得我们需要的 IP 地址。MaxMind 公司提供了一个数据库,我们可以快速下载并离线查阅。
IP 地址 ASN
通过这个功能,我们将能够获得事件的 IP 地址所属公司的名称。
MaxMind GeoIP
同一家公司提供了一个 IP 地理定位数据库,使我们能够非常可靠地知道 IP 地址的位置。
同样,我们将能够知道我们连接的 IP 的位置。在地图上,你总能更好地看到一切😏。
按国家分列的数据量
危险节点列表
攻击者使用 Tor 网络节点来匿名化他们的通信是很常见的,有时这可以是一个快速检查,为我们提供了一个很好的线索。在网站 dan.me.uk 上可以找到 Tor 节点的更新列表。
Tor 节点通信
尽管它们与数据泄露无关,但它们是必须检查其合法性的连接。
AbuseIPDB
AbuseIPDB 是众所周知的域名和 IP 地址信誉服务。通过它的 API,我们每天可以免费执行 1000 次查询。
AbuseIPDB 代码
AbuseIPDB IP 地址
在这种情况下,我们看到多个连接到声誉很差的 IP 地址,必须对其进行分析以验证其合法性。
此时,我们将进行新的查询,以便对数据进行新的可视化,从而尝试识别异常。
df = df_dask[~df_dask[“tunnelid”].isnull()][[“remip”, “duration”, “tunnelid”,”sentbyte”]].compute()
这个查询将返回所有数据的子集,通过下面的代码我们将得到。
现在,我们有 4 个变量来绘制图形,即创建到特定 IP 地址的隧道数量、到每个 IP 地址的总连接数、到每个 IP 地址的连接持续时间总和以及发送的字节数。
首先,如果我们制作一个连接数量和总持续时间的关系图,结果图将是这个。
连接数与持续时间
我用红色突出显示了数据泄露中使用的 IP 地址,这将是我们的目标之一。
考虑到显示的数据,恶意 IP 已经隐藏在大多数其他连接中,但该图可以帮助我们检测网络安全中非常常见的两种异常。
一方面,在左上部分,将会反映许多短时间连接的 IP 地址,例如钴击信标的情况,而在右下部分,将会出现长连接,例如 SSH 或 RDP 连接。
在下图中,我们将把发送的数据与连接的持续时间联系起来。
发送数据与持续时间
如您所见,这是检测大量信息泄漏的完美图表。在左上角,我们将显示已建立短连接但发送了大量信息的 IP 地址。
最后,我们将可视化发送的信息和连接数量之间的比率。
发送的数据与连接
该图可以帮助我们直观地看到少数连接中的数据泄漏,如将文件上传到云或通过 SSH 发送文件,以及隐蔽通道中的数据泄漏,如 DNS 或 ICMP,因为我们会看到许多连接和发送的大量信息。
为了结束本文,我们将执行更高级的分析,尝试同时使用四个变量来检测连接中的异常。
PCA —主成分分析
简化它,这种机器学习技术将允许我们在不失去数据唯一性的情况下进行降维。我们将从四维发展到二维,这样我们就能够用图形来表示它,并试图将异常现象可视化。
正如您在代码中看到的,执行了二维缩减,然后添加了 remote IP 列,以便更容易识别图中的数据,结果如下所示。
PCA 结果
一旦显示在图表上,我们就可以识别连接中的异常。
主成分分析数据图
通过这种方式,我们可以快速识别连接中的异常,这将为我们开始调查提供线索。
尽管可以对这些数据进行大量的进一步分析,但现在是时候结束这篇文章并继续下一篇文章了。完整的笔记本可以在此链接获得。
总而言之,很明显,数据分析是几乎每个行业未来的关键之一,但在网络安全方面,它现在是,将来也将是分析师的核心技能。
在事故调查或监控过程中,知道如何使用我们所掌握的工具将会在时间和结果上有所不同。
我将继续谈论在我的日常工作中有用的笔记本,希望你会发现它们有用。
研究愉快!
数据科学家和数据工程师如何有效协作
原文:https://towardsdatascience.com/how-data-scientists-and-data-engineers-can-collaborate-effectively-4d33a23f211c?source=collection_archive---------7-----------------------
一位前数据工程师转型为数据科学家的建议
来自派克斯的派克斯拍摄的照片
如果您是数据科学家或数据工程师,您可能会发现很难很好地合作。作为一名数据科学家,你得到的数据与你的期望不符,而作为数据工程师,你被要求完成说起来容易做起来难的任务。作为一名前数据工程师转行成为数据科学家的,我想讨论一下我发现的帮助数据科学家和数据工程师更有效合作的方法。
提供背景
作为一名数据科学家,您与利益相关者一起理解请求的上下文,确定优先级,并就可交付成果达成一致。当您向数据工程师提出请求时,使用相同的方法。数据工程师不断被要求提取新数据或调查数据管道或质量问题的请求轰炸。他们需要理解你的请求的背景,以便相应地优先处理他们积压的任务。
数据科学家建议:
在提出数据工程要求时回答 4 W 问题。
- 谁从这些数据中获益。—营销需要知道网站访问者来自哪里。
- 需要哪些数据。—对所有营销网页的网站访问。
- 为什么需要这些数据。—了解网站访问者的来源有助于营销优化他们的工作,优先考虑高转化率渠道,以推动更多销售。
- 何时需要这些数据。—尽量早些而不是晚些提出请求,以便处理数据工程积压工作。为您的营销交付日期分配额外的时间,以考虑提取数据的数据工程。
数据工程师建议:
- 创建一个帮助页面,列出请求所需的详细信息,并与数据科学团队一起审查。或者,在数据工程申请表中要求提供这些信息。这为两个团队节省了时间,让他们可以提前了解细节,而不必来回询问问题。
- 数据科学家可能不知道所有可用的数据。考虑创建一个包含位置和描述的数据目录,以便数据科学家在请求可能已经存在的数据之前进行审查。
提供数据规格
数据工程师更喜欢有清晰规范的请求,因为他们不可能知道什么对你的分析最有利。作为一名数据科学家,要努力澄清数据字段、任何数据处理逻辑(如处理空值)以及数据所需的日期范围。
有模糊的规范,如“拉网站访问者数据”会增加处理你的请求的时间,因为数据工程需要提出澄清问题。诸如“从 2021 年 1 月 1 日开始为访问以‘www’开始的页面的访问者拉取网站访问者数据,并存储在名为 website_visitor 的数据库表中”的明确规范提供了更多细节并减少了问题。
我曾经犯过一个错误,没有指定在更新前应该删除同一天的数据,结果在表中得到重复的数据。除了所需的历史记录之外,还要注意您希望如何更新新数据。
数据科学家建议:
- 提出请求时,尽可能提供详细信息。这减少了来回的问题,意味着你的请求可以更快地完成。
- 在数据工程花费时间提取历史记录之前,要求包含几天数据的样本数据来检查值并确认所有必需的字段都存在,特别是如果您需要回填几年的数据。否则,您可能会得到与预期不符的数据,并且必须等待几天才能重新运行完整的历史记录。
- 具体说明应该如何更新数据,以避免重复记录。例如,运行从 2021 年 1 月 1 日到最*日期的一次性历史回填。对于每日增量更新,删除运行日期的现有数据,然后添加当天的数据。如果您不需要增量更新,请指定您希望以自己选择的频率(即每天一次)完全刷新数据。
数据工程师建议:
- 为标准请求创建一个项目清单,例如引入新数据,根据请求详细信息进行审查,以确认您拥有所需的所有信息。这将防止在您实际处理请求时出现延迟,并在开始之前意识到您需要更多的信息。
- 如果您不确定数据科学家想要的数据是什么样的,尽管问。澄清比修改 ETL 并重新运行作业要好,因为这不是数据科学家所期望的。
提供质量保证规范
数据工程师可以支持多达数百条数据管道,他们工作的主要部分是确保这些 ETL 作业运行无误,并对那些不正确的作业进行故障排除。通过在将数据传递给您进行审查之前进行 QA 检查,帮助缩短您的请求的周转时间。
例如,我曾经在一个数据迁移项目中与数据工程师合作,复制一个现有的 ETL 管道来加载到一个新的数据库中。我知道我期望看到的数据,但是数据工程师不知道,因为他们不熟悉这个 ETL 管道。我提供了一些 SQL 语句,数据工程师可以运行这些语句来确认数据是否被正确加载。这有助于他们知道数据没有被正确加载,以便对 ETL 代码进行故障排除,并节省了我审查没有做好 QA 准备的数据的时间。
数据科学家建议:
- 为数据工程师可以运行的预期值或 SQL 语句提供指导,以确认 ETL 按预期运行。你提供的细节越多,你需要回答的问题就越少。
数据工程师建议:
- 快速浏览一下加载的数据,看看是否有什么异常。例如,如果每一列都为空,这可能是您应该调查的问题。
- 询问数据科学家是否可以运行任何标准检查来确认数据是否按预期加载。
最后的想法
随着数据角色的不断发展,数据科学家和数据工程师需要学习如何有效地合作,以便在组织中取得成功。虽然我们现在可能无法完美和谐地合作,但我希望这能让你们更进一步,更有效地合作。
你可能也会喜欢…
</6-best-practices-i-learned-as-a-data-engineer-9d3ad512f5aa> </6-bad-data-engineering-practices-you-shouldnt-apply-as-a-data-scientist-58de5eca14c3>
数据科学家如何提高他们的编码技能
科技职业
可以帮助你轻松编程的 6 个技巧
在 Unsplash 上由 Max Duzij 拍照
介绍
正如在之前的博客文章中提到的,我将在科技领域开始我的职业生涯,成为一名数据科学家/统计学家。获得技能和建立关系网需要多年的努力和奉献。从第一天开始,这是一个漫长的过程,但不再是一个孤独的旅程。
我开始了一个新的博客系列,名为“ 科技职业 ”,来分享我的学习和成长。我对该系列的愿景是关注数据科学的软方面。我所说的“软方面”是指软技能,如良好的沟通、主动学习、指导、职业发展、协作、团队建设、冲突解决,以及在数据世界中取得职业成功所需的其他非技术因素。这些软技能广泛适用于在该行业工作的其他人或任何想进入科技行业的人。
我的目标是分享好的经验,共同成长。
在第一篇文章中,我列出了帮助我成长为数据科学家的四个技巧(链接于此)。下面是一个快速回顾:
- 把读书当成呼吸:大量阅读,广泛阅读;
- 邻*学习:开发与你的主要职责相关的新技能;
- 熟能生巧:动手方法;
- 成为社区的一员:帮助他人,也帮助自己。
在今天的帖子中,让我们转换话题,深入探讨如何学习迭代有效编程的问题。如前所述,整个数据科学领域正在迅速向软件工程转变,并越来越关注编码技能。因此,如果没有很强的编码背景,想要得到一份 DS 的工作是极其困难的。
来自一个非传统的背景,我非常害怕任何面试中的编码部分。在这篇文章的剩余部分,我将分享我的顶级编程技巧,可能对其他人有所帮助。
一般学习策略
在讨论具体的技巧之前,指出主动学习的两个必要因素是有帮助的:自我反思和教学。
- 自我反省
学习本质上是渐进的,建立在我们已经知道的基础上。学习不应该远离我们现有的知识图谱,这使得自我反思变得越来越重要。学完新东西后,我们应该反思以下几点:
- 这篇论文/文章要回答的主要问题是什么?
- 提出了什么新方法,为什么?
- 在实施方面有什么实际的限制吗?
- 权衡
- 有哪些贡献?
思考这些问题可以帮助我们将这些点连接起来,并理解增量价值。
一如既往,有效的学习需要循序渐进,不应该留下很大的认知差距,自我反思有助于我们更好更快地处理信息。
- 教学
反思我们所学的内容后,下一步是在没有接触过这些内容的情况下教别人。如果我们真正理解它,我们可以将概念分解为多个可消化的模块,使其更容易理解。
教学以不同的形式进行。它可以是一个教程,一个技术博客,一个 LinkedIn 帖子,一个 YouTube 视频等等。一段时间以来,我一直在 Medium 上写长篇技术博客,在 LinkedIn 上写短篇数据科学入门。此外,我正在尝试 YouTube 视频(YouTube 上的我的数据科学频道),这为学习提供了一个很好的补充渠道。
如果没有这两个因素,我的数据科学之旅将会更加坎坷和具有挑战性。老实说,我所有的啊哈时刻都来自广泛的反思和教学,这是我活跃在多个*台上的最大动力。
Kelly Sikkema 在 Unsplash 上拍摄的照片
发展有效编码技能的六个技巧
提示 1:找到你的工具并坚持使用它
这不是一个技巧本身,但肯定是有用的。前阵子数据科学家之间有一场关于 R VS Python 的争论。作为一个经常使用 R 的用户,我一开始是不愿意转用 Python 的。然而,在看到 Python 可以做什么之后,我很快改变了主意。它是一种如此通用的语言,使我们能够顺利地与其他工程同事合作。
经过一段短暂的过渡期后,我对用两种语言进行编码变得相当适应了。我将它们用于不同的目的:R 用于因果推理相关的问题,Python 用于工程繁重的任务。
我的建议是选择你的工具并坚持下去。这里没有对错的答案,真正的问题是为你的研究问题找到最合适的工具。
技巧 2:从简单的问题开始
由于自我膨胀的性格,我喜欢走出舒适区,用远大的目标挑战自己。然而,努力追求一些我目前力所不及的东西,带来的弊大于利。
在这一点上相信我,因为我有过惨痛的教训。
我曾经被 LeetCode 上最具挑战性的编程问题弄得焦头烂额,这让我精神萎靡,也打击了我的信心。它们太难了,没用。这与我如何努力无关,因为它们超出了我的能力范围(请参考下图)。
回到过去,我从一个简单的 for 循环中学到了最多的编程知识。所以,放松自己,从简单的问题开始。
技巧 3:提升自己,用更具挑战性的问题挑战自己
我自己的画
我创建了上面的图表来区分三个区域:舒适区、学习区和危险区。舒适区指的是我们熟悉的领域,我们从舒适区拉知识不费吹灰之力。学习区指的是我们现在还不懂,但已经为快速学习打下基础的领域。最后,至于危险区,它是我们目前无法触及的地区。
这里有一个玩具的例子。对于之前接触过统计学和机器学习的有志数据科学家来说,概率论和其他基本概念,如</crack-data-science-interviews-essential-statistics-concepts-d4491d85219e?sk=af5291865f239ad505e8a8a1a80cceb8>**、Bootstrap和* 大数定律 应该在他们的舒适区。在生产中部署机器学习模型应该在研究区域中。高效计算和性能优化应该处于危险区域。*
解决最优化问题太过雄心勃勃。相比之下,如果有抱负的数据科学家专注于研究区域,即学习如何在生产中部署模型,他们将受益匪浅。
回到编程问题。在将新的编程技巧引入舒适区之后,我们应该尽快升级并进入学习区。
通过做我们最熟悉的事情来停留在舒适区不会让我们成长。相反,我们应该站出来,用新事物挑战自己。
一个警告:不要在伸出手的时候跨过危险区域,这与前面关于持续学习没有大的知识差距的观点密切相关。
再说一遍,大多数学习都发生在中间地带:学习区。
开始新的事物已经足够具有挑战性;我们不想同时尝试新的和大的东西。一如既往,学习发生在小剂量。
之所以首选学习区,主要是因为只需要花一点力气就能学到东西;如果我们处于危险地带,无论我们如何努力,事情都不会有结果。
尼克·莫里森在 Unsplash 上的照片
技巧 4:学习数据结构和算法
我发现这条建议很有见地,但经常被忽视。一个常见的误解是,DSA 属于软工程师的工具包,而不是数据科学家,这是不正确的。数据科学不是一个纯粹的分析领域。相反,它涉及工程义务,包括模型部署、ETL、高效计算和优化,以及数据基础设施知识。所有这些义务都要求强大的编码技能。
作为一名推理数据科学家,我的一大块工作是理解数据管道,高效地提取数据。对 DSA 的扎实理解大有裨益,对数据科学的其他领域(分析和算法)也是如此。
如果你是新来的,这里有一个 DSA 的简单例子。
*
学习 DSA 的另一个好处是我们可以在采访中谈论时间和空间的复杂性,这很好地服务于我们的目的。
下面是我最喜欢的两本关于 DSA 的书:算法靠摸索和破解编码面试。*
技巧 5:使用不同的方法
到目前为止,您应该已经很好了,并且能够解决常见的编程问题。为了进入下一个层次,我们可以尝试使用不同的方法解决相同的问题,同时讨论折衷方案(例如,时间复杂性、基础架构要求、利弊等)。).
- 为什么算法 A 比其他算法表现得更好?
- 为什么 Dictionary 是键值对的推荐数据类型?
- …
这里有一个简单的例子。
* *
秘诀 6:成长心态
低起点是可以的,即使你在面试中不能解决任何编码问题也是可以的。正如发生在我身上的那样,一开始我无法回答任何与 Python 相关的问题。但是经过坚持不懈的学习,我现在已经是(自称)编程高手了。
记住,每个人都有一个学习曲线。
如果你在面试循环中,试着从每次失败中学到新的东西。你从哪里开始或者你目前的编码水*都不重要。真正重要的是认识到差距并成为一个增量学习者的能力:从低开始,保持动力,每天练习。
Medium 最*推出了作家伙伴计划,支持像我这样的普通作家。如果你还不是订户,通过下面的链接注册,我会收到一部分会员费。
*https://leihua-ye.medium.com/membership *
外卖食品
退一步说,作为一名之前在该行业工作经验有限的应届毕业生,迈出第一步总是困难的。刚开始的时候,我没有 Python 和 SQL 的背景,不懂数据的应用端,对 DSA 更是零了解。这是一个相当低的起点。
然而,通过不断的学习,我能够填补空白,成为一名高效的程序员。主动学习的秘诀是持续、渐进和迭代。没有一朝一夕的成功;反而需要付出很大的努力。
让我们回顾一下可能对你也有帮助的 6 个技巧。
提示 1:找到你的工具并坚持使用它
提示 2:从简单的问题开始
提示 3:及时转向更具挑战性的问题
技巧 4:学习数据结构和算法
提示 5:使用不同的方法
提示 6:成长心态,你能做到
喜欢读这本书吗?
还有,看看我其他关于人工智能和机器学习的帖子。
数据科学家如何减少二氧化碳
原文:https://towardsdatascience.com/how-data-scientists-can-reduce-co2-6b3249e0eb61?source=collection_archive---------15-----------------------
通过在时间和空间上转移负载来优化操作
(图片来源:谷歌)
数据科学家可以为气候变化解决方案做出很多贡献。即使你的全职工作不是研究气候,研究公司运营的数据科学家也可以在他们目前的岗位上产生很大的影响。通过发现以前未开发的运营灵活性资源,数据科学家可以帮助将负载转移到电网中无碳能源份额更高的时间和地点,如风能和太阳能。这种负荷转移允许电网更快地过渡到更高份额的无碳能源,并且还可以降低运营成本。
数据科学对气候解决方案的贡献
在讨论优化运营或基础设施的具体机会之前,我想先介绍一下数据科学家在气候研究方面的广阔舞台。当前关于将数据科学应用于气候的大部分兴奋都围绕着 ML 和大数据的应用,这是正确的。一个很好的起点是 climatechange.ai ,这是一个志愿者组织,已经建立了一个广泛的社区,这些人在气候变化和人工智能的交叉领域工作。他们的网站包括 2019 年论文用机器学习【1】中描述的几十个“气候变化解决方案领域”中每个领域的摘要。虽然解决方案领域旨在作为高效 ML 气候应用的指南,但许多领域也适用于来自统计和运筹学的更“经典”的数据科学方法。可能性的列表是巨大的,并且可能很难知道从哪里以及如何开始。对于希望更多地参与气候问题的数据科学家来说,无论是 20%的项目还是改变职业轨迹,Terra.do 训练营和 workonclimate.org Slack 社区都是结识他人和寻找资源的好地方。
转型中的电网创造机遇:碳强度的变化
随着电网在未来几十年向无碳能源发展,我们正处于一个独特的转型期,我们生活在清洁能源和肮脏能源的混合中。即使在同一个地区,一天中风刮得更大或阳光更强的特定时间比一天中其他时间的碳密集度低得多,这是可以预见的。一天中不同地区和不同时间的碳强度的这种可预测的变化创造了减少碳排放的机会。
如果你的管理层已经关心优化运营成本,那么你的章程中已经包含了寻找可以减少碳足迹的优化方案。正如我将在下面描述的那样,减少碳排放可以来自于发现运营中未开发的灵活性资源,将负载转移到更清洁的地点或一天中更清洁的时间。建立利用这种灵活性的能力也可能使运营降低成本。因此,你不需要等待一个新的“绿色”指令或计划开始。只需以一种小而具体的方式开始,探索并展示更多的时间和投资可能带来的好处。
让我们来看看碳强度实际上是如何变化的。图 1 显示了谷歌在全球拥有数据中心站点的每个地区在一个样本日内每小时的地区*均碳强度。从阅读这些图表的角度来看,基于生命周期总排放量,发电的碳排放强度中值约为 1000 kg CO2/MWh(煤)、900kg CO2/MWh(石油)、500kg CO2/MWh(天然气)、50kg CO2/MWh(风能、太阳能、水能和核能)。在图 1 中,我们看到不同地点的碳强度相差 2.5 倍。我们还发现,在一些地点,一天中会有很大的变化。一天中最脏的一个小时的碳强度比一天中最干净的一个小时高 46%,这是一年中所有时间和所有数据中心站点的*均值。当研究碳强度的时间和空间变化时,其他研究显示了类似的结果。美国国家科学院(National Academy of Sciences)2019 年 12 月发布的一份关于跟踪美国电力系统排放的报告【2】报告了 2016 年美国 20 个不同*衡机构的碳强度分布,并显示了美国最清洁的 25%和最脏的 25%地区之间的碳强度差异~ 4 倍,每个地区内的时间差异也很大,正如我们在谷歌网站上看到的那样。(*衡机构通过控制其区域内和相邻*衡机构之间的发电和输电,确保其区域内的电力系统供需*衡。)
图一。谷歌每个数据中心站点一个采样日的*均碳强度。数据来源:明日起 electricityMap API 。
**在预测每小时的碳强度时,这些变化是相当可预测的,碳强度数据和预测可从第三方提供商获得,如明天和瓦特时间。在我们测试的预测中,我们发现预测的每小时*均碳强度的*均绝对百分比误差(MAPE)在未来 16 小时的 3–8%范围内,在未来 32 小时的 10–15%范围内。虽然这些预测仍有很大的改进空间,但这种准确性已经足以根据碳强度预测提前一天优化运营。
我们电网中碳密度的区域差异将会伴随我们一段时间。大多数电网接*零碳强度需要时间,可能需要几十年。2020 年全球新电厂支出的 22% 仍流向煤电厂和天然气电厂[3]。即使没有新的化石燃料发电厂建设,一项研究估计,美国 73%的现有化石燃料发电厂容量将在 2035 年达到其典型的寿命终点[4]。我们的观察是,日内变化是混合了化石燃料和无碳能源的电网的一个特征。图 2 显示了碳强度的日内变化如何随电网中的无碳能源量而变化,垂直线表示 2018 年亚洲、美国和欧洲的无碳能源量。在图表的左侧,我们可以看到消耗能源的地区主要来自化石燃料发电厂,一天之内变化很小。在图的右侧,我们看到消耗大部分无碳能源的区域,那里的*均碳强度非常低,因此碳强度的日内变化也很低。在图表的中间,在 10-80%的大范围无碳能源组合中有很高的日内波动,波动稳定在 30-50%左右。这里的直观解释是,随着电网增加风能和太阳能(间歇性能源)而不存储,无碳能源的份额增加,但影响集中在一天中风能和太阳能容量更可用的特定时段。来自前面提到的国家科学院的同一份报告[2]:“随着电网吸收更多的可再生能源,获取异质性的需求变得更加迫切,而可再生能源的可用性通常在时间和空间上有所不同。在这样的电网中,需求将需要变得更加灵敏。”
图二。不同地区作为无碳能源组合函数的碳强度日内变化,大陆*均碳强度用垂直线表示。误差线表示每个地区全年的差异范围。数据来源:明日起 electricityMap API 。
负荷转移对电网的影响:边际和*均二氧化碳
根据典型的碳会计规则,将负荷转移到*均碳强度较低的时间和地区可以降低公司的碳足迹。但是这实际上如何影响电网排放的碳呢?这不是一个零和游戏,消费者为了无碳能源的固定供应而竞争。通过减少高排放发电机(如煤电厂)的能源生产或帮助电网过渡到提供更多无碳能源,负荷转移可以带来真正的变化。
在考虑负荷转移的影响时,理解*均碳强度和边际碳强度之间的区别很重要。给定时间点的*均碳强度是总排放量与为满足当时需求而调度的能源总功率之比。边际碳强度是基于边际发电厂提供的容量来满足下一个单位的需求。地区*衡机构按照成本递增的顺序调度工厂,市场清算价格基于边际工厂的成本。因为风能和太阳能没有燃料成本,所以它们的投标价格通常很低,而且这些能源会被优先调度。因此,边际排放量通常介于燃气发电厂和燃煤发电厂之间[5]。
如果实时转移负载是可能的,例如通过物联网设备,那么跟随低边际碳强度可以是一种当天需求响应策略,可以通过将负载从具有高排放边际工厂(通常是燃煤发电机)的时间和地点转移到具有低排放边际工厂(如燃气发电机)的时间和地点来减少碳排放。然而,在大多数大规模操作中,很可能至少需要一些提前一天的计划来大规模转移负载。优化前一天的负荷以遵循低*均碳强度有助于电网向更高份额的无碳能源过渡。它将需求转移到无碳资源预计最具生产力的时间和地点(阳光普照或刮风的时间和地点)。当负荷遵循低*均碳强度时,额外的需求可以在无碳能源份额较高的时段和地区推动较高的市场清算价格。这反过来允许投资者从现有的无碳资产中获得更好的回报,并鼓励更多新的无碳能源投资和更高的无碳能源在电网中的渗透率,否则将是不经济的。
数据科学家在运营碳管理中的角色
虽然碳强度的可预测变化创造了减少碳排放的机会,但这并不意味着利用它总是经济的,甚至是可行的。采取行动需要组织经历几个步骤,而数据科学家在每个步骤中都处于推动组织变革的有利位置:
- 制作业务案例:确定行动并估计成本和收益
- 在可行的水*上测量碳足迹
- 优化运营中的碳
制作商业案例
在对碳排放影响最大的时间和地点上,找到你的经营灵活性的来源。一个好的第一步是粗略清点你公司的碳足迹,以了解最大的排放源在哪里。温室气体协议建立了碳会计和报告的国际标准,在他们的公司会计标准中使用了三类排放:
- 范围 1:公司拥有或控制的来源的直接排放,例如,拥有或控制的工艺设备燃烧产生的排放;
- 范围 2:公司消耗的购买电力产生的排放;
- 范围 3:间接排放是公司活动的结果,但来源不是公司拥有或控制的;例如,外购材料的提取和生产,外购燃料的运输,出售产品和服务的使用。
如果用电产生的排放(范围 2 排放)在您或您的供应商的碳足迹中占很大一部分,那么在您的工厂或一天中的几个小时的运营中是否有短期的、提前一天的灵活性,您还没有充分利用?从长远来看,对于新的厂址,是否有其他可能实现盈亏*衡但碳足迹截然不同的替代厂址?
碳应该与其他成本和商业目标一起优化。针对碳排放进行优化是否也会降低其他成本,或者在权衡碳排放与增加其他成本或客户服务目标时,您是否会面临阻力?在试图应对逆风之前,先寻找顺风的机会。灵活性在运营中创造价值,在追求减少碳排放的过程中,您可能会发现您正在发展运营灵活性,这也可以降低其他成本。您能否从运营高峰转移负载,将负载从高峰时间转移到非高峰时间,或者在不同时经历高峰负载的站点之间转移负载?如果你能及时或跨站点转移一些运营负载,你就能降低成本和碳排放。例如,在谷歌,开发提前一天在时间或空间上转移我们的计算负载的能力减少了我们的碳足迹,但也使我们能够*滑每个地点一天中的峰值计算和电力使用。这反过来使我们能够构建更少的数据中心和服务器容量,从而降低我们的成本。此外,公用事业公司可以提供需求响应激励,以支付其客户将负荷从高峰使用时间转移,这通常需要最大份额的化石燃料(并且由于气体或煤炭燃料的投入成本,供应的边际成本更高)。
测量可行水*的碳含量
一旦有了业务案例,并考虑到运营灵活性的具体来源,数据科学家就可以在构建所需数据集方面发挥作用,这些数据集是以最佳方式运用这种灵活性所必需的。首先,电网碳强度的外部数据需要达到必要的粒度,以支持优化,这可能意味着每个运行区域的每小时碳强度。第三方提供商如明天和瓦特时间估计世界各地的实时碳强度,并提供 API 以提供至少提前 24 小时的预测,至少每小时更新一次。
有了每个运营区域的碳强度数据,数据科学家可以构建模型来估计碳足迹作为特定公司运营的一个函数如何扩展。例如,在我们的数据中心应用中,我们需要构建模型来估算功耗,作为计算和存储资源消耗的一个函数,我们需要在一个相当精细的级别上这样做,以便我们可以将碳足迹与特定的产品使用联系起来。这些模型还可用于估算运营产品的碳足迹,以帮助公司客户优化碳足迹。
优化运营中的碳排放
有了确定的机会和手头的必要数据,数据科学家可以构建决策支持系统来优化碳和其他成本。建立在时间和空间上转移运营的能力不仅可以降低碳排放,而且如果它能够使运营以更少的容量或更低的能源成本运行,还可能产生传统财务意义上的高投资回报率。一个决策支持系统需要在一个精细的、逐小时的水*上考虑权衡。在 Google,我们在未来一天的负载转移模型中使用碳价格,以便我们可以通过考虑所有成本类型的单一统一目标函数来优化我们的运营灵活性:能源、碳、容量以及与实现时间或空间灵活性相关的任何其他成本(如数据中心工作负载的空间灵活性情况下的网络成本)。对于碳成本,我们使用美元/吨的碳价格,该价格与经济学家估计的避免 1.5–2 摄氏度以上变暖所需的价格一致。( 2015 年巴黎协定第二条提出了“将全球*均气温增幅控制在比工业化前水*高出 2 摄氏度以下,并努力将气温增幅限制在比工业化前水*高出 1.5 摄氏度以内”的目标)根据 2018 年的论文1.5 摄氏度气候变化的经济学【6】,避免 1.5 摄氏度和 2 摄氏度变暖所需的 2020 年碳价格的中值估计分别为每公吨 105 美元和 35 美元。工业界不需要等待政府颁布碳税来采取行动。我们可以在优化运营的模型中嵌入碳价格,这样做的同时,我们还可以在负载转移能力上提供高 ROI,从而降低碳成本和其他运营成本。这不是一个零和游戏:我们已经能够通过在目标函数中包括碳和其他成本来实现这两种利益。大多数情况下,碳排放和商业成本目标并不冲突,但我们的框架允许在目标竞争的几个小时或几天内进行经济权衡。
举例:我们如何将碳智能计算技术融入谷歌的数据中心
Ana 和她的合作者计划在未来发布更多的技术细节和对碳智能计算的影响结果。我想在这里分享的更多的是这项工作是如何开始和向前发展的,希望能激励其他数据科学家采取行动。
全日空没有等待新的绿色指令或新项目提案的管理指示。这开始是一个 20%的项目,是谷歌 20%项目的真正精神。安娜和一位合作伙伴研究工程师兼能源专家罗斯·康宁斯坦有了一个想法,也有了改变现状的共同热情,他们开始花时间研究这个想法。然后,他们确定执行发起人,并征求他们的意见和支持。这种早期支持和投入对于验证管理层是否愿意考虑根本不同的方法来安排我们的工作负载,以及支持试点工作来证明这些方法是可行的,而不会带来额外的运营风险至关重要。Ana 和 Ross 招募了其他 20%时间的志愿者,他们带来了关键的工程和主题专业知识来开发和试验生产规模系统。负载转移的想法对谷歌来说并不新鲜,但新奇的是,它从未在减少碳足迹的背景下出现过。这一愿景迅速建立了广泛的盟友基础,并帮助一个由高度积极的志愿者组成的小团队克服了阻碍早期负载转移工作的挑战。它们实用而有条理,对作业调度的现有工程基础设施做了最小的改动。他们尽可能建立在现有系统和计划的基础上,而不是与之竞争。
我们的执行赞助商批准推出时移功能,现在它已在全球部署。随着计划和商业价值的确立,团队不断壮大,现在正在解决大规模空间负载转移、更高的运营效率以及更全面的碳核算系统的开发问题。从概念到开发再到实施,这是一个由一小群人的分析领导和远见推动想法前进的项目。
不要等着被要求,也不要等着被允许。快走吧。没有时间可以浪费了。
致谢
感谢安娜·拉多万诺维奇、罗斯·康宁斯坦和谷歌的碳智能计算团队帮助我们展示了什么是可能的。还要特别感谢团队成员 Ian Schneider 对碳强度数据分析的帮助,以及在谷歌开发我们的碳核算数据管道。
参考文献
1 D. Rolnick 等人,用机器学习应对气候变化 (2019),arXiv:1906.05433
[2]j·德·查伦达尔、j·塔加特和 s·本森,追踪美国电力系统的排放 (2019),美国国家科学院院刊
[3]《2020 年世界能源投资》 (2020 年),国际能源署,巴黎
[4] E. Grubert,化石电力退休的最后期限为一个公正的过渡 (2020),科学
[5] D. Callaway、M. Fowlie 和 G. McCormick,《位置、位置、位置:可再生能源的可变价值和需求方效率》 (2018),环境与资源经济学家协会杂志
[6] S. Dietz、A. Bowen、B. Doda、A. Gambhir 和 R. Warren,1.5 摄氏度气候变化的经济学 (2018),《环境与资源年度评论》
数据科学家如何着手解决人类的实际问题
原文:https://towardsdatascience.com/how-data-scientists-can-start-to-work-on-humanitys-real-problems-d9a89e882daf?source=collection_archive---------17-----------------------
不要只预测数字
图片由安娜从派克斯拍摄。
让那个从未使用 MNIST 数据集预测数字的人来投第一块石头吧。
—世界上每一位数据科学家
大家都知道,我们都用 MNIST 预测数字。有时,当论文坚持在 MNIST 数据集上测试新想法时,我们仍然会这样做。
学习使用 MNIST 数据集是 而不是 这里的实际问题。
事情是这样的,最终,经过大量的研究,我们最终得到了一份真正的工作,从事现实世界的数据科学,希望能够解决更有趣的问题。
但是,当第一个真正的大问题最终到来时,我们会预测点击量、销售额,或者测试黄色的是否比蓝色的更适合那个左下角的按钮。**
当然,我有点夸张了。有许多公司正在解决更重要的问题。
但我在这里的观点是,我们经常忽视许多对人类来说最重要的问题。
只有极少数数据科学团队正在解决预防疾病、向有需要的人分发食物或研究人类思维以避免精神崩溃等问题。
上面的例子是我们人类面临的真正问题。这些问题如果得到解决,可以极大地改善我们的生活,真正让世界变得更加美好。
不幸的是,预测数字或者将猫和狗的图像分开没有有同样的影响。
不同的视角
想象一下,如果我们没有一个大的 MNIST 数据集,而是有一个包含来自世界各地的新冠肺炎患者症状的大数据集,还有:
- ****人口统计信息(如年龄、性别、种族);
- ****地理数据(例如,城市、州、国家);
- ****血液检测结果;
- ****肺部扫描图像;
- 每日温度结果;
- 每日氧气水*。
我相信你能看到这样一个数据集中的巨大价值。
我在这里用新冠肺炎只是作为一个一般的例子。还有许多其他健康问题,有更长的数据线索,甚至有更大的潜力拯救数百万人的生命——如癌症、抑郁症和糖尿病。
你可能同意我的观点,许多数据科学家都愿意在这些问题上工作。
那么,是什么阻止了我们这样做呢?
问题是:我们没有这种数据集。
当我们考虑健康数据时,许多医院肯定至少有大量非常有用的数据。
但是你可能知道,他们不会公开分享这些信息。所以主要问题应该是:
是什么阻止了医院、研究机构和公司共享个人数据?
毫不奇怪,答案很简单:这里的潜在原因是隐私。
许多机构有法律义务,阻止他们公开分享敏感数据。
他们中的一些人可能还想保持竞争优势,因为他们可能是唯一拥有大量特定类型数据的人。
另一方面,很容易看出,锁定数据阻碍了重要的研究。
因此,我们无法进行探索性分析,而且我们没有也没有合适的数据来为人类最紧迫的问题训练机器学习模型。
尽管如此,我知道现在你们大多数人可能在想:
“我们不能简单地公布我们所有的个人数据。大家也很在意隐私。人们不希望自己的敏感信息被披露。”
是的,你是对的,但并不是一切都没了。
那么我们能做什么呢?
过去的失败告诉我们,匿名化在实践中往往不太奏效。
网飞和美国在线是两家分享所谓的“匿名化”数据的公司,后来遭遇用户重新识别。
幸运的是,2006 年【DP】被创造出来。DP 是一个框架,已经成为隐私保护的黄金标准,并被学术界和工业界广泛采用。
如果分析师使用 DP 算法处理数据集,那么这意味着能够访问输出结果的对手或攻击者不能对数据集中出现的任何特定个人的贡献做出高度可信的陈述。
换句话说,如果使用的数据集中有任何一个人是或者不是,那么 DP 输出应该与大致相同。
这就像个人贡献被隐藏,同时仍然给出整个数据集的总体有用结果。
DP 的一个巨大优势是为个人提供的隐私保护是完全可量化的,并且独立于对手先前可能拥有的关于数据集的知识。
差异隐私到底有什么帮助?
我将带你看两个例子。
1。中央模型
假设我们想收集来自个人的新冠肺炎数据,并发布关于该病毒对不同个人概况的影响的一般见解。
对于这个例子,我们还考虑到医院可能会选择一个“可信的”中心医院。在这种模式下,敏感数据首先集中在一个中心位置。然后,可信管理人使用差分私有算法进行分析,并发布结果。
在“中央模型”上使用差分隐私。它需要一个值得信任的馆长。图片由作者提供。
差分隐私(DP)为我们提供了正式的保证,通过使用 DP 计算的结果,对手无法非常确定地告诉我们任何个人是否在用于生成该结果的数据集中。
因此,差分隐私基本上为数据集中的用户提供了"似是而非的可否认性,即用户可以否认他们在用于生成结果的数据集中,因为他们的存在无法从输出中得到保证。
2.本地模型
然而,在某些情况下,可能很难选择一个可信方来收集所有数据。
考虑到这一点,使用LocalDifferential Privacy(LDP),每个医院可以在共享任何数据之前,在本地添加隐私保证。
这是如何工作的:
- 每个医院将在本地计算一些结果,仅使用他们自己的数据,使用 LDP 方法。
- 例如,他们可以通过添加一些精心设计的随机噪声来做到这一点。
- 之后,医院可以安全地公开分享吵闹的结果。
- 有了来自所有医院的嘈杂的结果,任何人都可以汇总这些输出来得到一个更精确的最终结果。
在“本地模型”上使用差分隐私。数据在共享前被随机化。图片由作者提供。
这也适用于机器学习。例如,在应用 LDP 技术后,每个医院可以在本地训练一个模型并且共享模型更新。这与联邦学习的概念密切相关。
我们可以想出每个人都可以单独提供帮助的方法。例如,我们每个人都可以在使用 LDP 算法后共享一些数据。通过这种方式,如果人们也能单独分享(不仅仅是通过医院),新冠肺炎的数据集也能被聚合起来。
图片由卡洛琳·克里斯汀从 Unsplash 拍摄。
这什么时候才能成为现实?
公司和政府已经开始使用差别隐私了!例子包括:
- 美国人口调查局;
- 谷歌;
- 亚马逊;
- 微软;
- 领英。
希望不久之后,更多的数据科学家能够从关键和重要的数据集中收集见解。尤其是那些真正有助于解决人类最紧迫问题的项目。
如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑注册成为一名媒体会员。每月 5 美元,你可以无限制地阅读媒体上的故事。如果你用我的链接注册,我会赚一点佣金。
数据科学家如何应对未知
原文:https://towardsdatascience.com/how-data-scientists-deal-with-the-unknown-6637d68e42cd?source=collection_archive---------26-----------------------
2022 年即将到来,但我们大多数人在过去几年中不得不应对的不确定性仍然存在(看起来可能会持续更长时间)。虽然我们对你可能面临的许多未知问题无能为力,但其中有一些是我们力所能及的。
本周,我们将注意力转向(模型)漂移和(职业)转换——这两个话题是数据科学家永远不会厌倦讨论的,而且在这个变革时期感觉特别及时。
- 分析模型漂移的最佳指标有哪些? 当模型在生产中运行时,数据会发生变化,输入/输出动态会发生变化,性能通常会恶化。Piotr (Peter) Mardziel 在他最*的文章中深入探讨了这个问题,并展示了解决方案如何根据环境和模型的特征而有很大的不同——这就是为什么拥有一个广泛的度量标准来查看您的模型是如此重要。
- 你发现你的数据在漂移。现在怎么办?一旦你确定了模型中数据漂移的症状,你就需要一个计划。幸运的是, Elena Samuylova 的路线图在这里扭转了局面:它详细、实用、易懂,并且从足够远的距离来处理这个问题,适用于许多现实世界的场景。
照片由 Jp Valery 在 Unsplash 上拍摄
漂移模型是一回事。你漂流?很明显,这是一个更大的问题。如果你正在考虑换一份职业,感觉停滞不前,或者只是从最*在职业生涯中取得进展的人那里寻找灵感,这里有三个你不应该错过的帖子。
- 一位全新的数据科学家分享了迄今为止从 旅程中获得的关键收获。如果你正在考虑转向数据科学, Amanda West 最*已经完成了六个月的里程碑,并慷慨地分享了一些关于作为一名新晋数据科学家的生活的见解(技术和非技术),从硬件的重要性到解决坏习惯的需要。
- 了解跳槽的挑战和奖励 。对于拥有通信专业学术背景的 Danny Kim 来说,向数据科学的飞跃令人生畏;这让他怀疑在这个领域里是否还有像他这样的人的位置。他的有益帖子关注了受过社会科学培训的人面临的障碍,以及以不同的技能和知识基础进入数据科学的好处。
- 从内部数据科学家跳到分析顾问值得吗? 在 Slalom 做了一年的助理顾问后, Shravankumar Hiregoudar 对顾问这个角色的优点(当然,也有缺点)有了很好的认识,他耐心地详细描述了这一点。如果这是你一直在考虑的一个转变,你会想看看他的概述。
想在你的清单上再增加一些阅读吗?我们希望如此,因为我们最*的文章几乎接*年底,非常精彩,涵盖了很多领域。以下是一些亮点:
- 瓦莱丽·凯里探讨了诚信这个永远重要的话题,以及数据科学家应该如何处理自己的错误。
- 你应该在多大程度上坚持自己的信念?这是一个超越我们日常琐事的重大而关键的问题,而维谢什·克马尼博士带着好奇心和冷静的头脑很好地解决了这个问题。
- 如果你喜欢好看的情节,请举手!或者更好的是:点击阅读阿鲁纳·皮沙罗蒂的便捷指南,用 LaTeX 创作清晰、易于出版的情节。
- 渴望一些前沿研究?查看 Leonardo Tanzi 基于他的主要博士研究的引人入胜的文章,该研究侧重于使用视觉变压器对股骨骨折进行分类。
无论你在哪里,我们都希望你安全、放松,并准备好在几周内与 2021 年说再见。我们非常感谢您与我们共度的时光,以及您对我们作者工作的支持。
直到下一个变量,
TDS 编辑器
数据团队如何更好地满足截止日期
原文:https://towardsdatascience.com/how-data-teams-can-get-better-at-meeting-deadlines-3cecc24818b3?source=collection_archive---------28-----------------------
我们现在正处于回归的季节——无论是新学年,新工作,还是从夏季的缓慢节奏中回归(至少对我们这些生活在北半球的人来说)。这可能是一段紧张忙碌的时间,但也是培养新技能和思考新想法的时期。我们希望你是后者;我们在这里帮助一些优秀的阅读,从高度理论性的到明确的实践。现在是九月!我们走吧。
- 在一份新的技术工作中,遵循一个屡试不爽的成功蓝图。无论你是一名数据科学家、机器学习工程师,还是日常工作中与代码打交道的人,你都不想错过 Archy de Berker 为你在新角色中的第一个月打下基础的文章。它涵盖了广泛的领域——从设置到部署,再到代码审查——所以在入职培训完成后,您很可能会将它作为一种资源重新使用。
- 学习如何从务实、实用的角度对待公*的理念 。最*几个月,我们看到了许多关于机器学习和人工智能背景下公*意义的生动对话,但这个概念往往保持抽象和无定形。Divya Gopinath 的帖子是一个新的邀请,邀请大家加入这些讨论,着眼于可测量的、真实世界的用例。
Alexander Schimmeck 在 Unsplash 上拍摄的照片
- 发现令人兴奋的项目数据科学家们在非营利领域打头阵 。我们经常听说科学家在学术界和工业界创造的前沿工作数据。正如 Madeline Lisaius 最*与 Elliot Gunn 的谈话所表明的那样,在非营利组织工作——如洛克菲勒基金会,Madeline 是该基金会的首席数据科学家——提供了许多关注关键社会影响和可持续发展问题的机会。
- 跟上最新深度学习研究 。新的一个月只能意味着一件事:罗伯特·兰格精心挑选的学术论文推荐的新版本。九月的阵容涵盖了热门话题,包括 AutoML,视觉变压器(ViT),以及费希尔信息矩阵和推广之间的关系。
- 探索一种有前途的替代人工标注训练数据的方法 。我们非常高兴地欢迎雨果·鲍恩-安德森的回归,尤其是当他的最新帖子是一个令人信服的、亲自动手的深度探讨,展示了“关于人类如何与机器合作来标记训练数据和建立机器学习模型的原则证明”
- 按时交付项目,改善团队的业绩记录。作为一名七年的数据工程师, Christophe Blefari 亲眼目睹了迫使数据团队错过项目期限的诸多因素。他在这篇文章中致力于诊断问题——并提供潜在的补救措施,从更有效的优先化到雇佣具有不同技能的团队。****
随着我们进入新的赛季,我们希望你能顺利过渡到接下来的比赛。一如既往地感谢对我们作者工作的支持。
直到下一个变量,
TDS 编辑器
我们策划主题的最新内容:
入门
- 挣扎与提示:我从自己的分类项目中得到的启示艾琳·张
- 电子表格到 Python:是时候进行转换了由 Clive Siviour
- 每个数据科学家必须知道的五个回归 Python 模块作者达米安·埃杰里博士
实践教程
- 带火焰+光线调优的快速 AutoML作者迈克尔·加拉尼克(和合著者)
- 解释我是如何在以数据为中心的新竞赛中名列前茅的作者 Pierre-Louis Bescond
- *行坐标由Dario Weitz用 plottly绘制
深潜
- RNA 速度:细胞内部的指南针由 Jamshaid Shahir
- 对模式的深刻理解由西楚张
- 数据科学家能代替 NBA 球探吗?最佳转会建议的 ML 应用程序开发由 Gerasimos Plegas
思想和理论
- 深度强化学习从萨尔萨到 DDPG 再到超越作者帕斯卡尔·詹尼茨基
- 数据有很多需要可视化的周期性成分?把它当成音频!作者:弗罗林·安德烈
- 空间转换器教程,第 1 部分:正向和反向映射作者托马斯·库尔比尔
数据主义是如何彻底改变个人观念的
原文:https://towardsdatascience.com/how-dataism-is-revolutionizing-the-idea-of-the-individual-no-fluff-74bda98ff5f8?source=collection_archive---------34-----------------------
大数据的关键力量
来自 Pexels 的 ThisIsEngineering 摄影
在地球上,数十亿年来,我们一直在努力使用工具。我们必须考虑如何使用它们,然后如何与它们交流。我们的工作没有达到我们希望和可能达到的效率。现在我们正在尝试设计可以取代工具的智能机器,成为我们的一部分,与我们一起工作,甚至帮助我们不假思索地做出选择。人类历史的一部分即将彻底改变。欢迎来到数据主义的时代。
我出生于 1999 年,是第一批成为智能手机和社交媒体试验品的年轻人之一。当我们在学校时,我们很快开始对过去的模拟世界失去欣赏力。屏幕和连接接管了。我们生病了。我在成长过程中被教导的所有东西——避免虚荣、追求谦逊、善良和有同理心等等。—与社交媒体鼓励我们做的事情不一致。
那是我的第一面“黄旗”。如果当时我更聪明、更明智,我可能会停下来,但我被技术迷住了。
那时候我们相对来说是无辜的。毕竟,我们还没有容易获得的人工智能。我们只是努力在社交媒体上过最好的生活,给我们的朋友留下深刻印象,并向世界宣传我们的故事和成就。
但是后来,有几个服务赢得了大家的关注,开始应用 AI。机器给型号为的吊钩注射了类固醇。他们比我们自己更了解我们,并成功地侵入我们的大脑,使我们沉迷于滚动/点击/滑动,以便我们可以观看和点击广告。
这只是开始。
改变决策的大数据革命
照片由弗兰基·查马基在 Unsplash 上拍摄
技术收集和编辑信息的能力比以往任何时候都要先进。因此,技术正在创造一种不那么个人化的新文化。
如果我们公开所有数据,从监控我们生物特征的可穿戴设备到监控我们位置、社交媒体活动甚至互联网搜索历史的智能手机,会发生什么?这种对我们生活的洞察会给公司和政客提供更大的权力来侵犯我们的隐私,并通过利用我们的心理特征来操纵我们吗?一种被称为数据主义的新兴哲学并不这么认为。事实上,这种趋势意识形态认为解放数据流是宇宙的最高价值,也是开启人类历史上最伟大的科学革命的关键。
什么是数据主义?大卫·布鲁克斯在 2013 年《纽约时报》的文章《数据的哲学》中首次提到,数据主义是一种伦理体系,著名历史学家尤瓦尔·诺亚·哈拉里(Yuval Noah Harari)对此进行了大量的探索和推广。在他 2016 年的著作《德乌斯人》中,哈拉里将数据主义描述为一种新形式的宗教,庆祝大数据日益增长的重要性。其核心信念围绕着这样一个理念,即宇宙给予对数据处理贡献最大、效率最高的系统、个人和社会更大的价值和支持
数据主义意味着所有数据都是公开的,甚至是个人数据,以使系统作为一个整体工作,这是一个今天已经显示出阻力的因素。从浏览历史到购物模式,从追踪 GPS 定位服务到研究你的基因信息到预测你的生理未来和寿命。还有很多很多。
本质上,数据主义将通过感知和收集难以想象的个人、私人和公共信息来影响你的世界观,为你带来一种高度定制的现实感。由机器对机器通信(得益于物联网的兴起)驱动的强大软件网络将越来越多地收集关于我们、我们的环境、我们的世界的复杂、精密的数据点,甚至达到我们自己无法想象、当然也无法理解的程度。
照片由 Pixaby 从像素拍摄
当所有这些不可逾越的数据被输入机器学习软件和人工智能时,将帮助我们获得对我们个人和集体生活几乎每个方面的深刻见解。这种情绪是数据主义的核心,它将为我们提供一个全新的观点,一个更具逻辑性和分析性的关于未来如何(或者应该如何)做出决策的哲学论证。根据其早期的支持者——他们是硅谷的高管和技术先知——数据主义认为宇宙只不过是从一种形式到另一种形式的数据流(很像能量守恒定律),有机体只不过是以血肉形式表现的生化算法
任何一个有着好奇热情的人都将拥有全世界的数据,让我们每一个人都能成为启发我们的任何学科的专家。然后,我们可以将专业知识分享到数据流中——这是一个积极的反馈循环,引领着整个人类知识的进步。这样的指数增长代表了一个数据主义乌托邦。不幸的是,我们当前的激励和经济也向我们展示了这种模式的悲剧性失败。正如哈拉里指出的,数据主义的兴起意味着“人文主义正面临生存挑战,自由意志的理念正受到威胁。”数据是地球上最有价值的资源,甚至比石油更有价值。也许这是因为数据是“无价的”:它代表理解,而理解代表控制
数据主义世界观对政治家、商人和普通消费者非常有吸引力,因为它提供了突破性的技术和巨大的新力量。
尽管担心失去我们的隐私和自由选择,但当消费者必须在保护隐私和获得更好的医疗保健之间做出选择时,大多数人会选择健康。
对于学者和知识分子来说,数据主义有望提供一个我们几个世纪以来都没有得到的科学圣杯:一个统一了从音乐学到经济学,一直到生物学的所有科学学科的单一支配性理论。
根据数据主义,贝多芬的第五交响曲、股票交易泡沫和流感病毒只是三种模式的数据流,可以使用相同的基本概念和工具进行分析。这个想法极具吸引力。它为所有科学家提供了一种共同的语言,在学术分歧上架起了桥梁,并轻松地跨越学科边界输出见解。当然,像以前的包罗万象的教条一样,数据主义也可能是建立在对生活的误解上。特别是数据主义对于臭名昭著的“意识难题”没有答案。
目前,我们离用数据处理来解释意识还很远。为什么当大脑中数十亿个神经元向彼此发出特定信号时,会出现爱、恐惧或愤怒的主观感觉?我们毫无头绪。但是即使数据主义关于生活是错误的,它仍然可能征服世界。
事实上,我们所有的言语和行为都是包裹着这个世界的伟大数据流的一部分,只有当个体经历与这个数据流相连时,数据算法才会发现它们的意义并指导我们。数据无处不在,没有数据就无法掌握原力。有了它,我们变得强大,不可战胜;没有它,我们将不堪一击,必将衰落。通过机器学习的奇迹和人工智能的突破,未来数据将支配我们的生活,这不同于我们已知的任何其他神圣的教义或人造的宗教。我们将不再研究占星术、占星符号、咨询圣书和圣人,如果数据主义有它自己的方式——它会的。我们将在一种不同的准则下生活,一种不那么宽容、没有感情、没有个人偏见的准则。一种更具分析性的生活,决策完全基于冰冷的硬数据。
照片由来自 Pexels 的 Pixaby 拍摄
最后,我想留给我的读者一个问题。如果人类确实是一个单一的数据处理系统,它的输出是什么?数据主义者会说,它的成果将是创造一个新的甚至更有效的数据处理系统,称为万物互联。一旦这个任务完成,智人将会消失。数据主义既不是自由主义,也不是人文主义。然而,应该强调的是,数据主义并不是反人道主义的。它与人类的经验没有任何冲突。它只是不认为它们有内在价值。像资本主义一样,数据主义也是作为一种中立的科学理论开始的,但现在正变异成一种声称决定对错的宗教。
数据主义,人类经验不是神圣的,智人不是创造的顶点,也不是未来德乌斯人的先驱。人类仅仅是创造万物互联的工具,最终可能从地球蔓延到整个银河系,甚至整个宇宙。也许在你有生之年,你的狗可能会有一个自己的脸书或推特账户——也许有比你更多的喜欢和追随者。
感谢阅读!
如果你喜欢这篇文章,请随意查看https://seekingwithin.substack.com/****——每周一期的时事通讯,涵盖了广泛的话题,探讨了这样一个信念:我们寻求的大多数答案就在我们自己身上。
想和我交流吗?通过电子邮件、 LinkedIn 或 Twitter 给我发消息!
你的爱有多深?或者,如何选择你的第一个深度学习项目
原文:https://towardsdatascience.com/how-deep-is-your-love-or-how-to-choose-your-first-deep-learning-side-project-524f3700813d?source=collection_archive---------15-----------------------
在你最*学习的新领域开始一个副业可能会相当令人生畏。从哪里开始?如何在自己感兴趣的题目中找到已经做过的内容?如何为你的项目寻找和选择一个合理的目标?当我们开始致力于我们的深度学习项目时,我们对这些问题都没有答案。我们就是这样找到他们的。
由 李龙索夫达芙娜李奥【达甘】莱布
马里奥·高在 Unsplash 上的照片
从哪里开始?
由于我们都参加了深度学习课程,并熟悉神经网络的基本概念,我们知道我们最感兴趣的技术挑战是建立 GAN(生成对抗网络)。很快我们也意识到我们都对艺术相关的项目感到兴奋。我们决定选择一个结合两者的文件,理解它的架构,然后从头开始实现它。话虽如此,有公开代码的论文更好。
我们知道我们在寻找类似于神经风格转移的东西,在这种情况下,你拍摄两张图像,A 和 B,然后以 B 的艺术风格创建第三张内容为 A“绘画”的图像。当我们在网上搜索它时,我们遇到了艺术风格的神经算法和 Raymond Yuan 的这篇伟大的博文:神经风格转移:使用 tf.keras 和热切的执行来创建深度学习的艺术。
这对我们来说是一个很好的起点,因为它展示了我们所寻找的艺术功能,然而,这不是 GAN 架构,而是在 2015 年发布的。
一张照片的内容(A)结合几幅知名艺术品的风格(b-f)来自一种艺术风格的神经算法,arXiv:1508.06576
外面还有什么?
随着我们对这个主题的进一步探索,我们发现风格转换只是图像到图像翻译的一种类型。如“图像到图像转换:方法和应用”中所定义的,“图像到图像转换的目标是将输入图像从源域 A 转换到目标域 B,同时保留固有的源内容并转换外部的目标风格。”为了实现这个目标,我们需要训练一个映射 G,它将从 A 中获取一个输入源图像,并在目标域 B 中生成一个图像,从而使得结果图像与其他目标域图像无法区分。
在图像到图像转换:方法和应用,arXiv:2101.08629 中提出的图像到图像转换的数学建模
在使用 GANs 执行图像到图像的翻译领域,一个值得注意的工作是使用条件对抗网络的图像到图像的翻译(又名 pix2pix)。这篇文章演示了许多类型的图像到图像的转换,包括从标签图合成照片,从边缘图重建对象,以及给图像着色(从黑白到全色)。
使用条件对抗网络从图像到图像翻译的结果图像 (pix2pix),arXiv:1611.07004
第二个值得注意的作品是使用循环一致对抗网络的不成对图像到图像翻译(又名 CycleGAN),它将照片的图像到图像翻译成著名艺术家如莫奈、梵高、塞尚等人的艺术作品。此外,CycleGAN 出色地介绍了图像中特定对象的翻译,例如将马转换为斑马或将苹果转换为橙子。
使用循环一致的对抗网络 (CycleGAN),从不成对的图像到图像翻译得到的结果图像,arXiv: 1703.10593
怎么搜?怎么挑?
接下来,我们搜索了引用 pix2pix 和 CycleGAN 的文章。然而,这种方法产生了太多的结果。我们在寻找一种快速回顾最新作品的方法,我们发现 Károly Zsolnai-Fehér 的 youtube 频道 Two Minute Papers 在这个过程中非常有效。
我们浏览了几十篇似乎与艺术领域相关的论文,并把它们缩小到大约 20 篇。在我们为该项目考虑的作品中,有 Nvidia 的 paint 、基于 AI 的运动传输,以及这个神经网络恢复旧视频。然而,我们都被 GANILLA 所吸引,它在应用艺术风格的同时保留了原始图像内容,表现出了令人印象深刻的效果。最后,甘尼拉被选中了。
结论
我们从这个搜索过程中学到了很多。我们最终找到了我们正在寻找的东西,即使在这个过程的开始,我们没有术语来定义它到底是什么。我们还了解了以前和现在将 GAN 用于各种目的的工作。现在我们手中有了一份获奖论文,实际工作开始了。在这篇博客文章中,我们回顾了 GANILLA 的架构,并让你感受一下我们实现它的结果。
深度学习如何解决高能物理中的问题
原文:https://towardsdatascience.com/how-deep-learning-can-solve-problems-in-high-energy-physics-53ed3cf5e1c5?source=collection_archive---------34-----------------------
利用高能碰撞的数据来探测新粒子
尤利娅·布查茨卡娅在 Unsplash 上的照片
今天仍在研究和发展的物理学的一个有趣分支是对亚原子粒子的研究。世界各地粒子物理实验室的科学家将使用粒子加速器高速撞击粒子,以寻找新的粒子。寻找新粒子包括从背景过程中识别感兴趣的事件(信号过程)。
在 UCI 机器学习库中公开的 HEPMASS 数据集,包含了来自 1050 万次粒子碰撞的蒙特卡罗模拟的数据。该数据集包含带有 27 个归一化特征的标记样本和每个粒子碰撞的质量特征。你可以在论文高能物理的参数化机器学习中读到更多关于这个数据集的内容。
在这篇文章中,我将演示如何使用 HEPMASS 数据集来训练一个深度学习模型,该模型可以区分产生粒子的碰撞和背景过程。
粒子物理学简介
粒子物理学是对构成物质和辐射的微小粒子的研究。这个领域通常被称为高能物理学,因为寻找新粒子涉及使用粒子加速器以高能级碰撞粒子,并分析这些碰撞的副产品。世界上有几个粒子加速器和粒子物理实验室。由欧洲核研究组织(CERN)建造的大型强子对撞机(LHC)是世界上最大的粒子加速器。LHC 位于法国和瑞士边境附*的一个地下隧道中,有一个 27 公里长的超导磁体环。
大型强子对撞机。二万·马丁在 Unsplash 上的照片。
想象一下,在像 LHC 这样的粒子加速器中进行数百万次粒子碰撞,然后试图从这些实验中理解数据。这就是深度学习可以帮助我们的地方。
导入库
在下面的代码中,我简单地导入了一些用于数据操作、分析和可视化的基本 Python 库。请参考这个 GitHub 库来找到本文中使用的完整代码。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
读取数据
HEPMASS 数据集带有单独的训练和测试集。为了使模型评估过程不偏不倚,我决定先读取训练集,在训练和验证我的模型之前不动测试集。
train = pd.read_csv('all_train.csv.gz')
在这个数据帧上调用 Pandas info 函数会为每一列生成以下摘要。
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7000000 entries, 0 to 6999999
Data columns (total 29 columns):
# Column Dtype
--- ------ -----
0 # label float64
1 f0 float64
2 f1 float64
3 f2 float64
4 f3 float64
5 f4 float64
6 f5 float64
7 f6 float64
8 f7 float64
9 f8 float64
10 f9 float64
11 f10 float64
12 f11 float64
13 f12 float64
14 f13 float64
15 f14 float64
16 f15 float64
17 f16 float64
18 f17 float64
19 f18 float64
20 f19 float64
21 f20 float64
22 f21 float64
23 f22 float64
24 f23 float64
25 f24 float64
26 f25 float64
27 f26 float64
28 mass float64
dtypes: float64(29)
memory usage: 1.5 GB
数据集中的第一列对应于指示碰撞是否产生粒子的类标签。预测这个标签基本上是一个二元分类任务。
探索性数据分析
现在我们有了数据,我们可以使用 seaborn 来创建一些可视化并更好地理解它。
可视化类别分布
我们可以使用 Seaborn 的 countplot 函数来看看类的分布,如下所示。
sns.countplot(train['# label'])
分类标签的分发。
根据上面的图,我们可以看到这些类是均匀分布的,350 万个样本对应于背景过程,另外 350 万个样本对应于产生粒子的信号过程。注意,标号 1 对应于信号处理,而标号 0 对应于背景处理。
可视化不同特征的分布
我们还可以可视化从每个模拟碰撞中提取的特征的分布,如下面的代码所示。
cols = 4
fig, axes = plt.subplots(ncols=cols, nrows=3, sharey=False, figsize=(15,15))for i in range(12):
feature = 'f{}'.format(i)
col = i % cols
row = i // cols
sns.distplot(train[feature], ax=axes[row][col])
前 12 个特征的分布。
上面的几个特征倾向于遵循相似的概率分布。许多特征似乎遵循*似正态分布,稍微向左或向右倾斜,而其他特征(如 f2、f4 和 f5)大致遵循均匀分布。
数据预处理
缩放质量
与缩放特征不同,质量特征没有被归一化或缩放,因此我们应该缩放它,以便使深度学习模型更容易使用它。
from sklearn.preprocessing import StandardScalerscaler = StandardScaler()
train['mass'] = scaler.fit_transform(train['mass'].values.reshape(-1, 1))
培训和验证分离
在下面的代码中,我使用了 Scikit-learn 的经典 train_test_split 函数将数据分成训练集和验证集。根据代码,70%的数据用于训练,剩下的 30%用于验证。
from sklearn.model_selection import train_test_splitX = train.drop(['# label'], axis=1)
y = train['# label']X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.3, random_state=42)
训练深度学习模型
现在我们终于准备好训练深度学习模型来识别产生粒子的碰撞。在这一部分,我遵循了创建最佳深度学习模型的三个步骤:
- 定义了网络的基本架构和超参数。
- 调整了网络的超参数。
- 用表现最好的超参数重新训练模型。
我使用验证数据来测量具有不同超参数配置的模型的性能。
定义神经网络架构和超参数
在下面的代码中,我使用了一个名为 Keras Tuner 的 Keras 扩展来优化具有三个隐藏层的简单神经网络的超参数。您可以使用 Keras Tuner 文档页面了解有关该工具以及如何安装它的更多信息。
from keras.regularizers import l2 # L2 regularization
from keras.callbacks import *
from keras.optimizers import *
from keras.models import Sequential
from keras.layers import Dense
from kerastuner import Hyperbandn_features = X.values.shape[1]def build_model(hp):
hp_n_layers = hp.Int('units', min_value = 28, max_value = 112, step = 28)
model = Sequential()
model.add(Dense(hp_n_layers, input_dim=n_features, activation='relu'))
model.add(Dense(hp_n_layers, activation='relu'))
model.add(Dense(hp_n_layers, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
hp_learning_rate = hp.Choice('learning_rate', values = [1e-2, 1e-3, 1e-4])
# Compile model
model.compile(loss='binary_crossentropy',
optimizer=Adam(learning_rate=hp_learning_rate),
metrics=['accuracy'])
return modeltuner = Hyperband(build_model,
objective = 'val_accuracy',
max_epochs = 10,
factor = 3,
directory = 'hyperparameters',
project_name = 'hepmass_deep_learning')
在上面的代码中,我使用 Keras Tuner 为网络的每个隐藏层中的单元数和训练网络时使用的学习率定义了超参数选项。我为每个超参数测试了以下选项:
- 隐藏层数:28,56,84,112。
- 学习率:0.01,0.001,0.0001。
这绝不是一个详尽的列表,如果你想真正找到这个问题的最佳超参数,你可以尝试更多的超参数组合。
超参数调谐
现在已经定义了神经网络架构和超参数选项,我们可以使用 Keras Tuner 来找到最佳的超参数组合。
下面的代码段是一个可选的回调,我添加它是为了在超参数搜索中的每个模型的训练运行结束时清除训练输出。这个回调使得 Jupyter 笔记本或 Jupyter 实验室环境中的输出更加清晰。
import IPythonclass ClearTrainingOutput(Callback):
def on_train_end(*args, **kwargs):
IPython.display.clear_output(wait = True)
在下面的代码中,我对超参数进行了简单的搜索,以找到最佳模型。这个搜索过程包括训练和验证不同的超参数组合,并对它们进行比较,以找到性能最佳的模型。
tuner.search(X_train, y_train, epochs=4,
validation_data = (X_valid, y_valid),
callbacks = [ClearTrainingOutput()])# Get the optimal hyperparameters
best_hps = tuner.get_best_hyperparameters(num_trials = 1)[0]print(f"""
Optimal hidden layer size: {best_hps.get('units')} \n
optimal learning rate: {best_hps.get('learning_rate')}.""")
运行搜索产生以下最佳超参数。
Optimal hidden layer size: 112
optimal learning rate: 0.001.
培训最佳模特
既然超参数搜索已经完成,我们可以用最佳超参数重新训练模型。
model = tuner.hypermodel.build(best_hps)
history = model.fit(X_train, y_train, epochs=4, validation_data = (X_valid, y_valid))
上面的训练过程为每个时期产生以下输出。
Epoch 1/4
153125/153125 [==============================] - 150s 973us/step - loss: 0.2859 - accuracy: 0.8691 - val_loss: 0.2684 - val_accuracy: 0.8788
Epoch 2/4
153125/153125 [==============================] - 151s 984us/step - loss: 0.2688 - accuracy: 0.8788 - val_loss: 0.2660 - val_accuracy: 0.8799
Epoch 3/4
153125/153125 [==============================] - 181s 1ms/step - loss: 0.2660 - accuracy: 0.8801 - val_loss: 0.2645 - val_accuracy: 0.8809
Epoch 4/4
153125/153125 [==============================] - 148s 969us/step - loss: 0.2655 - accuracy: 0.8806 - val_loss: 0.2655 - val_accuracy: 0.8816
根据上面的训练输出,我们可以看到最佳模型的验证准确率刚刚超过 88%。
测试最佳模型
现在,我们终于可以使用单独的测试数据来评估模型了。我像往常一样缩放 mass 列,并使用 Keras evaluate 函数来评估上一节中的模型。
test = pd.read_csv('./all_test.csv.gz')
test['mass'] = scaler.fit_transform(test['mass'].values.reshape(-1, 1))X = test.drop(['# label'], axis=1)
y = test['# label']
model.evaluate(X, y)
上面的代码产生了下面的输出。
109375/109375 [==============================] - 60s 544us/step - loss: 0.2666 - accuracy: 0.8808[0.26661229133605957, 0.8807885646820068]
基于这个输出,我们可以看到该模型实现了大约 0.2667 的损失,并且在测试数据上的准确率刚刚超过 88%。根据训练和验证结果,这种性能水*是我们所期望的,我们可以看到模型没有过度拟合。
摘要
在本文中,我演示了如何使用 HEPMASS 数据集训练神经网络来识别产生粒子的碰撞。这是深度学习在粒子物理领域的一个有趣应用,随着这两个领域的进步,它可能会在研究中变得更受欢迎。和往常一样,你可以在 GitHub 上找到这篇文章的完整代码。
来源
- 欧洲粒子物理研究所,关于 LHC 的事实和数字,(2021),欧洲粒子物理研究所网站。
- 维基百科,蒙特卡洛法,(2021),维基百科免费百科。
- 页(page 的缩写)巴尔迪,k .克拉默等。阿尔,高能物理的参数化机器学习,(2016),arXiv.org。
deep learning is 如何改变设计:NLP 和 CV 的应用
原文:https://towardsdatascience.com/how-deep-learning-is-transforming-design-cv-and-nlp-applications-4518c50690e6?source=collection_archive---------16-----------------------
了解自然语言处理和计算机视觉在当今设计领域的应用
如果你曾经尝试过创建一个用户界面,你可能会很快意识到设计是困难的。选择正确的颜色,使用匹配的字体,使你的布局*衡…所有这些都要考虑到用户的需求!我们能否以某种方式降低所有这些复杂性,让每个人都能设计,即使他们不知道间距规则或颜色对比理论?如果软件能帮你搞定这些不是很好吗?
这个问题并不新鲜。这是一个长期存在的问题,人机交互(HCI)社区多年来一直在努力解决这个问题。深度学习最*才开始被应用(例如,查看这篇或这篇论文),正如它在其他领域发生的那样,它已经迅速成为使这些技术在实际产品中工作的核心使能因素。事实证明,收集其中一些问题的数据比提出一个完整的数学公式来解释某个设计为什么有效更可行。然而并非没有挑战。作为一个复杂、高维、多解的问题,通常很难定义您的模型输入、输出,甚至是优化什么!
虽然当前的深度学习方法还没有准备好承担设计师的同等责任,但它已经开始消除摩擦,并部分自动化设计过程的步骤。这使得非设计师能够在没有设计师直接参与的情况下设计出他们自己的想法。
无论你是否是设计师,这些都是深度学习在该领域的一些令人兴奋的应用:
计算机视觉
计算机视觉作为一个视觉领域,在设计领域有大量的应用。
草图到设计的转换
来源:uizard . io——试试看
对于非设计师来说,使用复杂的设计软件可能是一个令人生畏的挑战,但是一支笔和一张纸?非常低的准入门槛意味着每个人都可以很快上手。
然而,这并非易事。在计算机视觉层面上解决这个问题不仅需要理解形状,还需要理解意图。识别线条是一个简单的问题,但是知道那条线意味着什么可能是真正的挑战。
而且即使你设法从视觉的角度理解一切,你仍然需要经历定义不良的布局建模任务“让一切看起来都好”。
基于草图的设计资源查询
来源:谷歌自动绘图
如果您已经有了一组想要使用的视觉资产,该怎么办?仅仅通过传统的基于语言的搜索来探索这些资源是具有挑战性的。你心中有一个你想要的图像,但是这个特定的图标/图画是如何命名的呢?赶紧素描一下就好!
这是一个复杂的视觉问题,特别是当我们假设资产集不固定时,因为草图表示可能与实际资产有很大差异。
基于视觉的主题创作
来源:uizard . io——试试看
当然,你也许能得到一些基本的组件和形状,但是颜色、排版、复杂的组件设计等呢??这些都是非常耗时的任务,设计师们要为每个新项目花费数周的时间来开发。这里的想法是,你只需选择一个现有项目的图像,你的网站的网址,甚至是互联网上的任何随机图像,在几秒钟内你就可以节省设计师数周的工作!一个完整的“设计系统”是由你的视觉灵感创造出来的。
听起来很有用,但是如何建模呢?第一步是对图像中的像素达成一个复杂的理解,从那里我们可以提取一组颜色、字体、组件等。但是当然,也可能不是所有的组件都在,所以你也需要设计你看不到的组件。阅读更多。
自然语言处理
虽然一开始将自然语言处理应用于视觉领域听起来可能有些违反直觉,但设计是一个多模态领域,它提供了许多应用 NLP 技术的机会。当你想到这一点时,设计中的组件可以被建模为单词,屏幕可以被建模为句子,而你的整个应用程序可以被建模为一个长文本。这意味着我们可以利用过去几年在 NLP 领域所做的大量工作,并利用它来学习布局。这种方法已经在 LayoutLM 以及无数其他应用于设计的论文中被证明是有效的,比如这个或者这个。
设计的组成部分,不管是文本的还是其他的,都是你的“句子”的“词”。然后,这可以被输入到一个变压器,以解决众多的任务。来源
设计生成描述
但是,当我们可以描述我们想要的东西时,为什么还要费心去解决组成设计问题的单个问题呢?好吧,虽然已经有这样做的原型,但不要期待一个完美的解决方案。人类仍然需要迭代一个设计问题的无限解,按照自己的喜好调整事物,等等。
不过,这确实是个有趣的多模态问题。混合形式总是一个挑战,这里我们将从常规英语转向 2D 布局,你不仅需要预测标记,还需要预测它们的位置、内容、风格等。
设计自动完成
给定一个部分设计布局(每个盒子是一个组件),一个模型的任务是完成它来源
自动补全通过让在微型手机屏幕上书写文本的体验更加高效,为世界节省了数百万小时。是时候在设计时也利用这一点了。
我的意思是,如果设计可以像文本一样建模,为什么我们在设计的时候不能有自动完成功能?实际上,类似的建模方法可以应用于这两个问题,我们不是预测下一个单词,而是预测下一个设计组件。
最后的话
凭借丰富的数据和较低的错误成本,设计领域是深度学习研发的完美游乐场。这里我们只提到了少数几个项目,但是还有许多其他具有挑战性的任务,其中NLP 和 CV 建模技术都是成功的关键。从代码生成%EC%9D%98)到屏幕链接预测或者设计检索,不一而足。
如果你对通过深度学习构建设计的未来感兴趣,记得在 Twitter 上关注我。只要我们在 Uizard 有空缺职位,我会随时通知你。
我是如何根据目的对 50 种图表类型进行分类的?
原文:https://towardsdatascience.com/how-did-i-classify-50-chart-types-by-purpose-a6b0aa5b812d?source=collection_archive---------18-----------------------
数据可视化
可视化的目的是洞察力,而不是图片
艾萨克·史密斯在 Unsplash 上拍摄的照片
大家好😘!
今天,我很高兴地向大家介绍 50 多个通常被商业人士使用的图表。我希望你会喜欢它。它们分为以下五类。
- 趋势 :折线图、棒棒糖图、迷你图、条形图(和柱形图)、面积图、凹凸图、瀑布图、斜率图和股价图。
- 关系 :散点图、*滑散点图、气泡图、相关图、斜率图、热图、弦图、雷达图、*行坐标图、镶嵌图、脊线图、气泡图。
- 比较 :簇状条形图、堆积条形图、面积图、堆积面积图、克利夫兰点状图、折线图、棒棒糖图、迷你图、凹凸图、子弹图、漏斗图、镶嵌图、脊线图、分类图、choropleth 图、hexbin 图、以及 cartogram。
- 分布 :直方图、密度图、威尔金森点状图、茎叶图、盒状&须状图、带状图、小提琴图、等高线图、三维面积图、点状图、径向流图、网络流图、等值线图。
- 整体的一部分 :饼图、圆环图、簇状条形图(和柱形图)、堆积条形图(和柱形图)、百分比堆积条形图(和柱形图)、面积图、100%面积图、瀑布图、树形图、旭日图。
趋势
当你展示随着时间的推移发生了什么时,有趣的事情会变得更加有趣。绘制时标值可以显示季节性、增长、减少和趋势,以帮助预测未来。
折线图
折线图通常用于显示时间数据,或数值随时间的变化。x 轴代表时间间隔(年、季度、月、一天中的小时)。等等),y 轴代表观察值。
凹凸图
它是折线图的变体,用于探索等级随时间的变化。它有助于比较多个观察值的位置、性能和排名,而不是实际值本身。
柱状图
柱形图是最常用的图表类型之一。柱形图只有 12 个或更少的数据点,是可行的,也是有用的。
当超过 12 个数据点时,最好切换到没有单个数据点的折线图。折线图可以轻松显示数百个周期的趋势。
条形图
条形图是翻转过来的柱形图。所有相同的原则和最佳实践都适用于柱形图和条形图。
棒棒糖图表
棒棒糖图是条形图的一种便捷变体,其中条形图由线条和末端的点代替。
迷你图
迷你图是工作表单元格中的一个小图表,提供数据的可视化表示。
您可以使用迷你图来显示一系列数值的趋势,如季节性增减、经济周期,或者突出显示最大值和最小值。将迷你图放在其数据附*以获得最佳效果。
对比图
面积图结合了折线图和条形图,以显示一个或多个组的数值如何随着第二个变量(通常是时间)的变化而变化。
瀑布图
当您想要显示主要的变化或说明总额的构成,同时显示总额以便比较时,瀑布图是一个不错的选择。
斜率图
当您有两个时间段或比较点,并且想要快速显示两个数据点之间不同类别的相对增减或差异时,斜率图会很有用。
股票图表
(又叫烛台图)
股价图有一条垂直线,表示证券价格从低到高的范围。粗柱表示开盘价和收盘价。
在上面的第一组烛台中,蓝色表示价格上涨,红色表示价格下跌。
关系
许多数据集包含两个或多个变量,我们可能对这些变量之间的关系感兴趣。
散点图
这是一种非常重要的图表类型,特别是,为了绘制两个定量变量之间的关系,我们通常会使用散点图。下图显示了一个散点图示例。
使用回归分析,您可以使用散点图直观地检查数据,以查看 X 和 Y 是否线性相关。
泡泡图
气泡图通过数据标记的多重编码扩展了散点图的潜力。这些标记代表不同大小的圆(数据点不一定是圆),然后根据它们的分类关系进行着色。
气泡图很有用,因为它能画出三个数据元素的交叉点。
相关图
在数据分析中,相关图是相关统计的图表。
热图
(称为矩阵图)
热图使我们能够执行快速模式匹配,以检测分类组合矩阵中不同定量值的顺序和层次。
使用饱和度降低或亮度增加的配色方案有助于创建数据量级排序的感觉。
弦图
弦图是一种显示矩阵中数据之间相互关系的图形方法。它比较一个数据集内或不同数据组之间的相似性。
例如,它绘制了从 A 公司到 B 公司的员工数量,每有一名员工向另一个方向流动。
雷达图
(称为极坐标图)
雷达图是显示多个数据点以及它们之间变化的一种方式。它们通常用于比较两个或更多不同数据集的点。
*行坐标图
*行坐标图显示了多个垂直轴上两个或多个变量之间的相关性。
马赛克图
(也称为马里梅科图)
镶嵌图是一种将两个或多个定性变量的数据可视化的图形方法。
脊柱图
(亦称旋图)
脊线图是仅用于两个变量的镶嵌图的特定类型。它类似于复合条形图,但现在条形的宽度是由每个水*类别的比例来设置的。
气泡图
这张地图用来帮助我们描述一个主题。中间的圆圈代表主题,而外面的圆圈代表主题的质量。
比较
簇状条形图和柱形图
簇状条形图用于使用水*方向比较某一指标上的分类变量的类别。条形的高度代表 x 轴上显示的测量值。我们使用条形图来显示大的文本标签。
簇状柱形图与簇状条形图类似,用于比较某个指标上的分类变量的类别。它是簇状条形图的垂直版本。
堆积条形图和柱形图
堆积条形图
堆积条形图将标准条形图从查看一个分类变量的数值扩展到两个分类变量。
堆积柱形图
堆积柱形图是一种基本的图表类型,允许随时间或跨类别进行部分与整体的比较。
对比图
堆积面积图
堆积面积图是基本面积图的延伸。它在同一个图形上显示了几个组的值的演变。
最有用的类型是堆积面积图,它最适合结合前面提到的两个概念:显示整体的一部分(像饼图)和一段时间内的连续数据(像折线图)。
克利夫兰点阵图
克利夫兰点图是条形图的替代方案,可以减少视觉混乱,并且更易于阅读。
折线图
多系列折线图用于比较不同组之间的表现。
棒棒糖图表
像条形图一样,棒棒糖图用于比较不同的项目或类别。
迷你图
我们可以使用迷你图来比较数据趋势。
凹凸图
项目符号图
漏斗图
马赛克图
镶嵌图用于显示关系,并提供组的直观比较。
脊柱图
脊柱图是一种流行的可视化方式,它可以一目了然地显示一个区域与一系列指标中的其他区域相比的情况
分类地图
等值区域图
图表
图表是一种地图,其中区域的几何形状被扭曲,以传达替代变量的信息。
Hexbin 图
分配
柱状图
直方图是以连续(接触)条的形式显示频率或相对频率的条形图。
直方图可用于查看分布的形状,并确定数据是否对称分布。
密度图
密度图是数值变量分布的表示。它使用核密度估计来显示变量的概率密度函数。
威尔金森点阵图
威尔金森点图显示连续数据点的分布,就像直方图一样,但显示的是单个数据点,而不是条块。
茎叶图
茎和叶图是一个特殊的表格,其中每个数据值被分成“茎”(第一个数字)和“叶”(通常是最后一个数字)。
盒须图
箱线图,也称为盒须图,是一种显示数据集的分布和中心的方法。
带状图
带状图是提供单个变量观察值分布信息的众多图表类型之一。
它通过简单地将每个观察值显示为沿代表数据值范围的刻度线绘制的点,来提供数据集内包含的整体结构的有用视图。
小提琴情节
小提琴图是一种绘制数字数据的方法。它类似于一个箱形图,在每一侧增加了一个旋转的核密度图。
等值线图
等高线图用于将一组三维数据表示为高程等高线。它有三个强制系列组件,位置、深度和值。
- 位置和深度分量中的数据必须在 xz *面上形成 2D 矩形网格。
- 每条等高线包括在值分量中具有相同高程值的点。
三维面积(表面)图
点阵图
点地图是一种专题地图,它使用点符号来显示大量相关现象的地理分布。
径向流动图
径向流动图显示了从一个源头到多个目的地的流动,反之亦然。
网络流程图
网络流程图显示了通常基于运输或通信互连的已建立网络的移动。
等值线
等值线是在地图上画的一条线,它穿过具有相同值的所有可测量的量。
作文
(或整体的一部分)
在此类别中,图表类型描述了组成部分如何构成整体、整体各部分之间的关系以及各部分对整体的累积影响。
圆形分格统计图表
典型的局部图是饼图。通常用于显示总数的简单分类,如人口统计数据。
饼图对于突出显示比例很有用。
圆环图
圆环图通常被用作饼图的替代品,以显示部分与整体的关系。
它们也经常被用作关键绩效指标(KPI)
簇状条形图和柱形图
簇状柱形图
簇状条形图
堆积条形图和柱形图
堆积条形图是呈现部分到整体关系的另一种方式。
百分比堆积条形图和柱形图
百分比堆积条形图
百分比堆积柱形图
对比图
面积图通常用于显示如何将一个整体分割成组成部分。
百分比面积图
百分比堆积面积图显示整体的组成部分如何随时间变化。
多堆栈瀑布图
树形图
树形图是可视化树形图层次结构的另一种方式,同时也通过面积大小显示每个类别的数量。
旭日图
旭日图非常适合显示分层数据。层次结构的每个级别都由一个环或圆表示,最里面的圆作为层次结构的顶部。
没有任何分层数据(一个类别级别)的旭日图看起来类似于圆环图。
结论
最后,我按用途分类了 50 多种图表类型。数据可视化的目标不仅仅是制作关于数字的图片,而是精心制作一个真实的故事,让读者相信你的解释如何以及为什么重要。
让我们展示您的数据故事…!
我是如何用 Python 中的 Keras 和 TensorFlow 编写自己的 OCR 程序的
原文:https://towardsdatascience.com/how-did-i-train-an-ocr-model-using-keras-and-tensorflow-7e10b241c22b?source=collection_archive---------9-----------------------
数据科学家
如今,OCR 在数字劳动力的眼中
作者图片
光学字符识别(或光学字符阅读器,又名 OCR)是过去二十年来用于识别和数字化图像中出现的字母和数字字符的技术。在行业中,这项技术可以帮助我们避免人工输入数据。
在这篇文章中,我想带你了解深度学习技术如何应用于 OCR 技术来分类手写的步骤。
- 准备用于训练 OCR 模型的 0–9 和 A-Z 字母数据集。
- 从磁盘上加载字母的数据集。
- 在数据集上成功训练了 Keras 和 TensorFlow 模型。
- 绘制训练的结果,并可视化验证数据的输出。
- 预测某些图像中出现的文本。
准备数据集
我们使用以下两个数据集来训练我们的 Keras 和 TensorFlow 模型。
- 0–9:MNIST
- A-Z: Kaggle
标准的 MNIST 0–9 数据集
这个数据集是从 NIST 的特殊数据库 3 和特殊数据库 1 构建的,它们包含手写数字的二进制图像。
Itis built into popular deep learning frameworks, including Keras, TensorFlow, PyTorch, etc. The MNIST dataset will allow us to recognize the digits 0–9*.*Each of these digits is contained in a 28 x 28 grayscale image.
MNIST 0 比 9
ka ggle A–Z 数据集
Kaggle 用户 Sachin Patel 发布了一个简单的逗号分隔值(CSV)文件。
This dataset takes the capital letters *A–Z* from NIST Special Database 19.Kaggle also rescales them from 28 x 28 grayscale pixels to the same format as our MNIST data.
卡格尔公司
从磁盘加载数据集
由于我们有两个独立的数据集,首先我们必须加载两个数据集,并将它们合并成一个数据集。
-
加载 Kaggle A-Z 字母。
-
加载 MNIST 0-9 位数。
-
将它们合二为一。
在数据集上训练模型
我使用 Keras、TensorFlow 和 ResNet architecture 来训练我的模型。
使用以下命令训练该模型需要大约 30-45 分钟。
python train_model.py --az dataset/a_z_handwritten_data.csv --model trained_ocr.model[INFO] loading datasets...
[INFO] compiling model...
[INFO] training network...
Epoch 1/50
34/437 [=>……………………….] — ETA: 7:40 — loss: 2.5050 — accuracy: 0.2989
...
标绘结果
我们将绘制一个可视化图,以便我们可以确保它正常工作。
作出预测
一旦模型被训练。我们可以用它来做预测。
python prediction.py — model trained_ocr.model — image images/hello_world.png[INFO] H - 92.48%
[INFO] W - 54.50%
[INFO] E - 94.93%
[INFO] L - 97.58%
[INFO] 2 - 65.73%
[INFO] L - 96.56%
[INFO] R - 97.31%
[INFO] 0 - 37.92%
[INFO] L - 97.13%
[INFO] D - 97.83%
完整的源代码可以在这里看到:https://github . com/house cricket/how-to-train-OCR-with-Keras-and-tensor flow
├── __init__.py
├── dataset
│ └── a_z_handwritten_data.csv
├── images
│ ├── hello_world.png
│ └── vietnamxinchao.png
├── models
│ ├── __init__.py
│ └── resnet.py
├── prediction.py
├── requirements.txt
├── train_model.py
├── trained_ocr.model
└── utils.py
结论
最后,总结本文,我们可以说使用 Keras、TensorFlow 和 Python 来训练 OCR 模型是很容易的。此外,我们可以通过使用更好的数据集来提高该 OCR 模型的准确性。
你有什么想法吗…?很简单,对吧?
参考
1http://yann.lecun.com/exdb/mnist
[2]https://www . ka ggle . com/sachin Patel 21/az-handled-alphabets-in-CSV-format/metadata
机器学习如何解释问题并为电子商务公司节省成本
原文:https://towardsdatascience.com/how-did-machine-learning-interpret-problems-and-save-cost-for-ecommerce-companies-6c92796e5ed8?source=collection_archive---------6-----------------------
行业笔记
让我给你分享一个我公司应用机器学习的成功案例
在我们深入研究解决方案之前,这里有一个问题
该公司面临着很高的交货率失败的可能性——买家(那些在 Shopee、Lazada、亚马逊、易贝等电子商务*台上购买商品的人。)会在最后一刻拒绝他们的包裹。这浪费了大量资金,管理委员会希望降低这一比率。
两年前,那是我第一次担任新的角色,开始领导数据团队。有一天,有一个重要的会议,我是一屋子高管中唯一的数据员。人们在其中一个后续会议中,讨论总的****【FD】失败交付案例、其增量、每个案例的潜在根本原因、主要原因、其趋势以及更多,而只有我一个人对此一无所知。这是我第一次触及那个棘手的问题。
会议室里发生了什么?
提出了许多问题,有些得到了回答,有些没有。最终,我意识到有两类人:
- 提问**小组:首席执行官、首席财务官、营销团队,他们问了很多问题。大多数问题以【什么】和【为什么】开头,其他一些是【如何】和【如果】。**
- 回答组:、CCO、BI 团队,他们回答了约 30%的提问,其中大部分回答了【为什么】组,而【如何】**【如果】组则作废。**
(当然,还有第三组人保持沉默,那就是我)
那是一个两小时的会议,我从一开始就完全迷失了。1 个半小时过去了,我开始质疑自己“这是怎么回事?这不是讨论,这是调查”。人们试图了解发生了什么,为什么会发生,但他们无法阻止它在未来发生。他们还根据数据小组的结果提出了一些假设。不幸的是,这些假设似乎不是那么一致,它们几乎不能证明什么。
那一刻,我知道我可以使用一些机器学习算法来解决问题,但遗憾的是机器学习这个术语对业务来说相当陌生,我没有机会展示我的方法。然而,机器学习不是火箭科学。我将向您展示我是如何应用并获得业务价值的。
传统方法的缺陷
承认吧,你也看到你们公司的问题了吗?在讨论中,业务团队或财务团队是否一直在问这个问题发生的原因。然后他们还把你放在一些具体的情况下比如“如果我们做 这个 呢?”或者“我觉得这是因为 那个。而你,作为一个数据员,你会查看你的数据,做一些你称之为的分析并且输出大部分是是/否或真/假。
该程序称为假设检验,即:
你得到了一些假设(某人认为如果你做他的假设中陈述的事情,结果会改变);然后你必须检查你的数据,看看这是真假设还是假假设。如果这是真的,你的公司会应用这个假设来达到预期的结果。如果是假的,他们会尝试给你另一个假设。你不得不一次又一次地重复这个过程,直到他们找到一个合理的假设。
这是一个好方法吗?绝对不是。这是一个无限循环,因为公司永远不会满足于他们所得到的,所以他们会试图给你越来越多的假设,以销售更多的产品,节省更多的成本。你永远也走不出那个虚空的迷宫。
这种方法的问题是:
- 每个人都可以提出这个假设(认为自己发现了很酷的东西),
- 假设列表无法排序(因为它们在某种程度上都是合理的),
- 你需要时间来验证每一个假设(这个列表会一天比一天长)。
那怎么走出那个迷宫呢?
不要相信任何随机的假设
说起来挺讽刺的,因为我是数据团队的一员,我唯一信任的就是我的数据。假设可以来自任何参与问题的人,它看起来像一个原始数据集。在投入时间之前,我必须对其进行验证、清理和分类(就像我对数据所做的那样),以确保获得最佳结果。那么问题就是“我怎么知道哪个假设有用,哪个没用?”。啊,是的,“你必须用你的数据来测试它”你一定在想这个问题,对吗?但是等等,你不应该只是测试列表上的所有假设,你在清理它,对吗?宾果,发现死锁。
让我重述一下整个过程:
传统的进场工作流程(来源通过 芽变 )
那一刻我意识到,真正的问题来自人类,而不是假说,或者数据,因为假说的来源可以来自任何人。如果他们没有足够的知识去理解和分析问题怎么办?他们没有能力提供假设!即使他们可以提供一些假设,这也不会是最好的解决方案,因为所有人都是人,都有我们的局限性。最好的解决方案应该在计算机的帮助下产生,同意吗?那这个问题怎么利用机器的计算能力呢?
相反,向计算机寻求假设!
我的脑海中突然冒出一个想法“为什么我不把所有的东西都放入某种无人监管的学习算法中,看看结果是什么,然后把这些东西带给业务团队,让他们验证?”
是的,当其他人在思考新的假设并和我的团队核对时,我也是这么想的!
传统方式 VS 现代方式(来源作者芽庄 T7)
就在那里,我决定提取 10%的数据,放入决策树算法中。代码已经可以使用了(当然,我做了一个代码模板可以重用,只需更改数据集),包含 12,000 条记录的数据集被清理了。我花了将* 2 分钟才得到结果。
订单(预订)分类使用决策树(源代码托管在 Google Colab 上;数据集和导出模型和导出可视化由 芽庄 托管在 Google Drive 上。免责声明:数据集是一个 10k 样本,有 315 个特征被标记,而原始数据集由大约 20k 个样本组成,有 3k 个特征。在这篇文章中,我不去详细的源代码和数据集,这只是一个例子)
准确率不是唯一的目标
好吧,如果你是一个有经验的数据科学家,你会有一个问题“为什么你不在使用你的预测之前应用预处理和特征工程?”。这个问题问得好!我的回答是“是准时的问题”。事实上,我并不想获得高准确率的预测,我只是需要看到“我的数据看起来怎么样,以及每个特征的重要性”。在现实生活中,您通常需要牺牲质量(在这种情况下是准确率)来换取响应时间(在这种情况下,您需要多长时间才能理解您的数据)。当然,企业不会等太久才得到数据团队的决定,他们只需要一些听起来足够合理的东西来做出决定。当数据科学家倾向于投入大量时间来获得最佳预测模型时,这是他们的另一个陷阱。这里有一个你需要理解的小权衡图:
你工作努力的基本*衡(来源由 芽变 )
让我们谈一谈决策树
承认吧,我打赌你经常坚持向他们解释一些可以解决问题的技术,但这对他们来说太难理解了,因为大多数机器学习算法是无法解释的。那怎么处理呢?好吧,让我们先谈谈决策树。
决策树是分类组中的算法,是监督学习的子集。该算法的输出可以是二进制值,例如真/假,或者是/否,或者好/坏,或者公/母,或者仅仅是 0/1 。输出有时可以是一组标签,如红/绿/蓝,或低/中/高,或XS/S/M/L/XL(t 恤尺寸)。
树是通过将构成树的根节点的源集分割成子集来构建的,这些子集构成了后继的子节点。分类领域的每个元素称为一个类。以下是一些与决策树相关的流行术语:
- ****根节点:它代表整个总体或样本,并进一步分成两个或更多同类集合。
- ****拆分:是将一个节点分成两个或两个以上子节点的过程。
- ****决策节点:当一个子节点分裂成更多的子节点时,则称之为决策节点。
- ****叶/端节点:不分裂的节点称为叶或端节点。
- ****剪枝:当我们删除一个决策节点的子节点时,这个过程叫做剪枝。你可以说分裂的相反过程。
- ****分支/子树:整个树的一个子部分称为分支或子树。
- ****父节点和子节点:被分成子节点的节点被称为子节点的父节点,而子节点是父节点的子节点。
试着解释你的模型
你一定想知道为什么我选择决策树而不是随机森林或逻辑回归。原因是:我在寻找一个假设,而不是预测。
我们有许多机器学习算法,它们可以分为有监督的、无监督的、回归的、分类的等等。每个算法都会给你一个不同的结果,例如,当你想预测结果是 A 还是 B(真或假,或者你需要的任何一种分类),你可以使用分类组中的任何算法。但是对你来说,只使用一种算法而不使用其他算法,或者随机使用它们,并不是最好的做法。在目前的情况下,有什么问题呢?它是:
“如何降低交付失败案例率?”
不是“如果我给你一个新的订单信息会怎么样?到底会不会送成功?”。例如,如果你选择逻辑回归,你可以预测结果,但你不知道如何防止它。这是数据团队的另一个大陷阱,特别是对于 ML 工程师来说,他们一直专注于他们的算法,失去了与业务团队的沟通。事实上,我自己和我的团队过去也犯过同样的错误,所以如果你有同样的问题也不用担心。好消息是现在我们得到了教训和经验。
分类和聚类算法组(完整版由 芽变 )
因此,在这些算法中,决策树是解释你的数据的最简单的方法(KNN 和 SVM 也不错,但在这篇博客中,我选择了决策树,因为它是最简单的方法)。
我们从决策树中得到的教训
让我们深入了解决策树的输出,我们有前 3 个分支:
- succ_mord_cnt_std: 此功能表示买方成功订购的订单/预订总数(已订购和已收到)。
- payment_type: 此功能代表买家为订单/预订付款的方式。我们有许多不同的方式,如:通过信用卡支付,交货成本,银行转账,凭证代码,50%的成本存款… 我做了一个快速的标签编码器,然后才运行这个例子。**
- ****total _ payed _ AMT:该功能表示已支付订单/预订的总费用
前 3 名分支样本(按 韩川 )
好的,在检查了前 3 个分支后,我试着将它们解释为的一句话“如果这个包裹的买家 【做了某事】 ,那么这个包裹将有可能被成功交付”就像:
- ****第一个分支:如果该包裹的买方 在过去 中已经订购了超过 12 个订单/预订,则该包裹将有可能被成功交付。
- 第二分支:**如果这个包裹的买家 使用的方法≤ 0.5 (编码的是“信用卡支付”),那么这个包裹就有可能被成功送达。
- ****第三分支:如果此包裹的买方 购买的总金额少于 30,750 越南盾(又名此包裹花费少于 30,750 越南盾) ,则此包裹可能会被成功交付。
之后,我试图用非技术技能(或我的常识)来理解我的假设,我向业务团队解释如下:
- 第一个分支:对于所有过去订购少于 12 个订单/预订的买家来说,他们是新用户,他们可能是垃圾邮件发送者(制造假订单),因此他们是潜在没有收到包裹的高风险用户,或者只是因为他们对*台非常陌生,所以他们偶然下了订单,他们可能想取消订单,但不知道如何做。另一方面,订购超过 12 个订单/预订的买家是某种忠诚用户(经常在我们的*台上买东西),我们可以信任他们。因此如果这个包裹的买家在过去已经订购了超过 12 个订单/预订,那么这个包裹将有可能被成功交付。**
- 第二个分支:对于所有使用信用卡支付的买家来说,他们都是有工作的人(银行只给信用评分高的人发放信用卡,有稳定收入的人是合格的),所以他们有足够的钱购买东西(即使他们改变主意,他们也会接受这些东西,因为对他们来说这不是什么大事)。或者,我们可以说,没有预付任何款项的人后来会改变主意,或者他们会花光所有的钱,无法在送货时付款,或者,无论如何,我们无法从他们那里得到保证,所以如果这个包裹的买家使用的方法≤ 0.5 (这是被编码的“用信用卡支付”),那么这个包裹就有可能被成功送达。****
- 第三个分支:对于所有价格昂贵(超过 30,750 越南盾)且未提前付款的包裹,退货的风险很高(比如说,如果我在未提前付款的情况下从你的商店订购了一台 70 英寸的电视,你认为我会收到它并在你将它送到我家后付款吗?这是 50%的可能性,甚至更低。因此如果此包裹的买家购买的总金额低于 30,750 越南盾(也就是此包裹的价格低于 30,750 越南盾,相当于 1.2 美元),则此包裹可能会成功交付。**
以下是我从决策树解读到非技术语言的假设总结:
解读我的决策树模型(sourcebyNhan TranT19)
现在,从商业角度来看,这个问题似乎更容易理解。这是我之前提到的现代方法的第一步:
第一步:使用机器学习算法找到假设(来源乘芽庄 T25)
现代问题需要现代解决方案
好了,经过一个漫长的过程,现在我们有 3 个由机器学习算法生成的假设,让我们看看企业如何解决它并关闭案例?不要!是时候稍微换个话题了。让我们检查一下我们的 3 个假设,即:
- 过去的订单数量
- 付款方式
- 预订费用
…你从他们身上学到了什么?是人之常情!
理解人类的行为有助于解决他们的问题(图片来自https://www.pexels.com/@fotografierende?utm_content=attributionCopyText&utm_medium=referral&utm_source=pexels像素 )****
根据我在尼尔森公司工作期间对客户洞察团队的个人研究,我发现我们的行为驱动我们的行动,这间接意味着:你可以通过改变人们的行为来改变他们的行动。那如何适用于我们的问题呢?
- 对于“过去的订单数量”问题,我们可以与客户服务团队合作,为新用户提供更多支持,持续跟踪他们的订单,并采取适当的行动,如当他们下任何高额订单时,拿起电话并确认他们的订单。或者我们可以给他们更多的指导,告诉他们如何下单,当他们需要帮助时如何联系我们,以及当他们失去兴趣时如何取消任何订单。
- 对于【支付方式】问题,我们有一个活动,我们预留了 30000 越南盾(相当于 1.2 美元),分成 3 张代金券(每张 10000 越南盾)。当他们下订单并选择“货到付款”方式时,如果他们同意改用另一种预付方式,我们会向他们提供一张优惠券(10,000 越南盾)以减少运费。当然,我们主动提出“记住我的支付方式”以便他们以后使用(实际上这是我们驱使他们将来再次使用这种方式的方式),并持续这样做 3 次。在大多数情况下,我们成功地让他们在第三次订购后继续使用预付费方式,并且他们会一直使用这种方式。之后,在第二次活动中,我们应用了前 3 个免费运费,以获得更大的效果。
- 对于“预订成本”问题,我们使用了与“过去订单数量”问题相同的方法,让呼叫中心与有高价值采购的买家保持互动。
免费礼物是现代世界的一个神奇词汇(图片来自 Unsplash )
BLUF
好了,该写完我的长文了。在这篇博客中,我没有过多地谈论机器学习或分享任何代码,因为这是为在现代数据行业工作的人准备的,他们需要使用他们的技术技能为非技术人员服务。这就是数据团队的价值。
然而,猜猜我在几次竞选后得到了什么?交付不良率比上年同期降低了 7%!这是我的团队在 2 年多的时间里为组织做出的最大贡献,他们面临着高 FD 率,6 个以上的项目旨在降低 FD 率(所有项目都失败了,因为他们是由业务团队领导的,他们坚持传统的方法)。
现在让我们来看看我们讨论了什么!
3 个常见陷阱:
- 从随机人群中获取假设;
- 花太多时间改进你的模型;
- 选择了无法解释的错误算法。
重要提示:
- 我们的行为驱动我们的行动;
- 数据团队的价值是帮助企业获得其价值(实际上不是我们很酷的预测模型);
- 现代问题需要现代解决方案;
- 如果长期效果不好,就停止做(但可以反过来做)
天天快乐学习!
我的机器学习模型怎么变得不公*了?
原文:https://towardsdatascience.com/how-did-my-machine-learning-model-become-unfair-c6508a795989?source=collection_archive---------24-----------------------
公*与偏见,值得信赖的 AI
你建立模型的初衷是好的。那么,为什么它表现出不公*呢?
由蒂姆·莫斯霍尔德在 Unsplash 上拍摄的照片
在本公*系列的前一篇博文中,我们讨论了创建全面公*工作流以确保机器学习模型结果公*的三个关键点。它们是:
- 识别偏倚(两个或更多组的不同结果)
- 执行根本原因分析以确定差异是否合理,以及
- 采用有针对性的缓解策略。
但是 ML 从业者大概是怀着最好的意图来建立他们的模型的。那么一个模型怎么可能一开始就变得不公*或有偏见呢?
其核心是,ML 模型可能存在两大类不公*,这是我们从 Barocas & Selbst 2016 改编而来的:
- 由于观察到的模型性能差异,模型可能会出现偏差。这是由于模型的训练程序或训练数据集中的不足(例如,缺乏数据),模型在特定人群中表现出更多错误的时候。
- 由于未观察到的模型性能差异,模型可能存在偏差。在这种情况下,该模型在一个比较的组上并没有明显“更差”,并且可能正确地匹配测试数据集中的基本事实标签,但仍然被认为是不公*的,因为它复制或放大了数据集中现有的偏差。
让我们更深入地研究一下每一个问题。
由于观察到的模型性能差异造成的不公*
在 AI/ML 环境中听到的一个常见格言是“垃圾进,垃圾出;也就是说,如果输入训练数据在任何方面有偏差或不正确,模型将反映这些偏差和不准确。然而有时,即使地面真实数据是可靠的,该模型在一组人群中可能比在另一组人群中更容易出错。
XKCD 的漫画。
例如,当研究人员分析商业面部识别系统的准确性时,他们发现与肤色较浅的男性相比,模型在女性和肤色较深的个体身上表现较差,这是因为模型的训练数据中缺乏肤色较深的女性。在这种情况下,训练数据本身并不是“不正确的”,而是表现出了样本或代表性偏差:它并没有反映出模型要操作的人群。该模型不恰当地将从肤色较浅的男性身上收集的数据推广到其他人身上,因此在人群的子群体上准确性较低。
这种认为足够多的“大数据”必然会创建公*可信的模型的假设已经被一次又一次地证明是不正确的。正如凯特·克劳福德所言,社交媒体是大规模数据分析的一个流行来源,但只有 16%的在线成年人甚至使用推特(Twitter)——因此,仅从推特数据中得出的结论,如声称人们在周四晚上最悲伤(T11)不一定是正确的。我们假设在一个群体中看到的趋势会延续到另一个群体。
图片作者。
为什么一个模型在一组人群中表现更差,从而被认为是不公*的另一个原因是数据可用性或样本大小差异问题。对于少数群体,输入要素的信息量可能较少,或者收集的信息不可靠。例如,波士顿市试图从经过坑洞的司机那里收集智能手机数据以更快地解决道路问题——但通过依赖需要拥有智能手机的数据,该市意识到,老年人或不太富裕的居民区也不会被捕获。这些“黑暗地带”或“阴影”可能不足以代表甚至忽略关键人群。预测模型通常倾向于在训练数据中更好地表示的组,因为与这些预测关联的不确定性较少。
由于未观察到的模型性能差异造成的不公*
一个不公*的模型在一个子群体中的表现并不总是更差(例如,准确性更低)。事实上,如果数据集本身包含有偏见或不正确的标签,该模型可能被认为是完全准确的,但仍然是不公*的。
让我们举一个具体的例子来进一步说明这一点。自然语言模型通常在人类书写的文本的大型语料库上训练,例如新闻文章。然而,在大量谷歌新闻数据上训练的单词嵌入被发现是有偏见的,因为它们延续了记者如何写男性和女性的性别刻板印象。这项研究背后的研究人员表明,嵌入与性别和特定职业密切相关——根据嵌入,“家庭主妇”和“护士”是非常女性化的职业,而“大师”和“老板”则更男性化。这种历史偏差,也被称为 负面遗产 ,当一个模型被训练在由于不公*的系统或结构而本身存在偏差的数据上时就会发生。
不仅仅是模型简单地复制了这些历史偏见。在特殊情况下,它们会加剧它们——这被称为放大偏差。现实世界中的一个例子是用于大学招生的分数算法。该模型根据之前的录取数据进行训练,以确定哪些申请构成“良好匹配”然而,一旦模型投入生产,它只是过度适应先前的录取决定,而不是实际评估候选人的质量。如果这些决定被用于实践,它只会放大招生官员的现有偏见。
不仅仅是数据集的地面真实标签会有偏差;在模型开发生命周期的早期,错误的数据收集过程会破坏数据或使数据有偏差。这个问题被称为测量偏差。如果机器学习模型根据复杂管道生成的数据进行训练,就会出现这种情况。作为一个例子,我们可以使用 Yelp 的餐厅评论系统:Yelp 允许餐厅付费,以在 Yelp *台上推广他们的餐厅,但这自然会影响有多少人看到给定餐厅的广告,从而影响谁选择在那里吃饭。通过这种方式,Yelp 的评论可能会不公*地偏向高收入社区的大型餐厅,因为 Yelp 的餐厅评论和推荐管道合并了。
在听到一个模型可能有各种各样的偏见时,一个自然的建议是限制它的访问:为什么不在不包含性别或种族等敏感属性的数据上训练模型?例如,早期的预测性警务算法在进行预测时无法获得种族数据,但这些模型严重依赖于与种族相关的地理数据(如邮政编码)。通过这种方式,对性别和种族等人口统计数据“视而不见”的模型仍然可以通过与受保护属性统计相关的其他特征来编码这些信息——这种现象被称为代理偏差。可能很难理清代理偏差,因为模型的输入特征通常是相互关联的,但仔细考虑数据来源并寻找偏差较小的替代数据来训练模型的从业者可以减轻其影响。
我如何修正一个不公*的模型?
一个善意的数据科学家有很多方法可以无意中训练出一个不公*的模型。但是有了正确的工具,就有可能理解并减轻这些偏见,这样你就可以在部署模型之前信任它。
在我们的下一篇文章中,我们将详细介绍一个公*的工作流程,数据科学家和验证者可以用它来理解、测量和调试他们模型中的偏差。
Russell Holz 对本文有贡献。
去年房地产价格如何变化?
原文:https://towardsdatascience.com/how-did-the-real-estate-prices-change-last-year-38242f692722?source=collection_archive---------40-----------------------
用非面板数据分析商品价格演变的三种方法
照片由 Jason Dent 在 Unsplash 上拍摄
1.介绍
价格演变问题的不同方面
对于任何与分析相关的工作来说,分析任何商品的价格都是一项很常见的任务。回答“去年 x 的价格变化了多少”这个问题的难度很大程度上取决于我们所研究的商品的一致性和现有数据的特征。
如果我们想分析股票、黄金或石油等统一的商品,这项任务可能是微不足道的。如果我们能够访问样本组成在整个研究期间保持不变的面板数据,这是非常简单的,这种数据在研究受控群体或分析忠诚客户群的行为时很常见。
然而,许多现实生活中的分析并不适合使用上述任何数据类型,因为商品和数据样本都会随着时间而变化。
房地产价格——商品价格和特征的演变
房地产市场是这种挑战的一个很好的例子——如果我们每月收集数据,每个样本将只包含给定月份的有效报价。由于房地产是一种变化很大的商品,我们的分析需要回答价格演变问题的两个方面:
a)由于房地产定价的实际变化,价格变化了多少?
b)我们的数据样本的特征改变了多少?这种变化是如何影响价格演变的?
问题 A 是我们真正需要答案的地方,问题 B 是我们需要解决的依赖性,以便对定价问题的答案有信心。
我这篇文章的主要目标是展示解决这个问题的 3 种方法,以及它们的优缺点。
已用数据介绍
本文描述的所有分析都基于自 2020 年 4 月以来每月收集的* 20 万份华沙房地产报价数据集。个人报价数据与地理特征(如 Google Drive 和 Google Maps 数据)相结合,创建了 100 多个特征,详细描述了物业和位置特征,可用于精确的价格基准。
由于房地产价格通常变动非常缓慢(10%的年变化被认为是高的),并且它们具有很大的惯性,尽管有更多的粒度数据,我还是决定使用一个季度作为分析的间隔。对于每个季度,如果报价存在超过一个月,则只选择每个单独资产的最新条目。
本文使用的所有代码以及交互式图表都可以在 Github 获得。
2.回答房地产价格演变问题的三种方法
完成这项任务的最佳方式取决于可用时间、可用数据和分析目标。我准备了 3 种方法,在这些参数之间达到不同的*衡:
- 商业智能分析 —利用行业知识对数据进行细分,以部分缓解样本不一致的问题。用于获得关于价格演变和关键细分市场行为的可解释的见解
- 统计测试—建立一个简单的模型,例如线性回归,并用它来测试时间变量的显著性。通过在模型变量中包含关键特征来减轻样品的不均匀性。这允许在其他条件不变 的假设下分析价格演变,这意味着“所有其他因素不变或不变”。
- 高级分析 —构建一个高级模型,如神经网络,以构建基于基线期数据的精确定价基准。由于该基准已经考虑到了房地产特征之间的复杂关系,我们可以使用它来分析基准期内最新数据的价格。比较基准期基准模型的实际价格和预测价格之间的差异,可以让我们获得价格演变的精确估计。
由于其复杂性,第三种方法将在本文的中描述。
在这个排名中没有赢家,我根据问题使用以上所有的方法。它们是按复杂程度排序的,这意味着更复杂的模型将更耗时,(通常)更精确但更难解释,并且更需要数据。我将在专门的章节中详细描述每种方法的优缺点。
3。商业智能分析
这种类型的分析可以单独使用,也可以作为更强大流程的 EDA 部分。其主要目标是快速找到价格演变的趋势,并根据关键特征比较其不同行为。
底层和顶层五分位数
我通常从一个简单的图表开始分析*均值、顶部和底部五分位数的演变,看看价格在整个范围内是否表现相似。我们可以看到,总体*均价格上涨了 379 波兰兹罗提/*方米。
由于我们对趋势比对绝对价格本身更感兴趣,可视化基线期的变化可能更有用。
将随后的每个时间段除以基线值可以让我们清楚地看到每个部分的相对变化。在上图的例子中,我们可以看到 20%的最低价格(最低的五分之一)比*均价格和最高的五分之一价格增长得更快。*均价格上涨了 3.4%
按关键特征细分:位置
为了限制我们趋势分析中的一个关键价格驱动因素:房地产位置的影响,我们可以使用它来细分我们的数据。这降低了总体*均价格受地点样本构成重大变化影响的风险。
例如,如果我们的样本规模较小,50%的 Q2 房产位于价格最低的郊区,但由于市中心的大型建筑完工,这一比例在第四季度将降至 20%,则整体*均水*将会高得多。
这并不能说明整体价格正在大幅上涨,因为价格上涨主要是由我们的样本特征在分析期间的变化引起的。
我们可以看到,选择细分功能是正确的,因为不同的细分市场有不同的价格趋势。在过去的两个季度中,距离市中心 5 公里以上(中等距离和郊区)的价格上涨了 3%以上,而严格的市中心和*中心部分仍然停滞不前。
这种趋势可能与疫情和封锁对我们日常生活的影响有关。随着远程工作变得越来越受欢迎,人们可能更愿意住在离市中心更远的地方,这使得这些地区的价格上涨。
按关键特征细分:资产规模
根据房产大小对我们的数据进行细分,也显示了这些细分市场的价格趋势的变化,尽管不如位置示例中的变化显著。中小型公寓的价格增长速度几乎是大型公寓的两倍。
方法概述
这种方法的最大优势在于其清晰性——快速呈现不同细分市场的*均价格变动易于解释,并且不需要复杂的假设。
如果数据样本在评估期之间变化很大或规模不足,这种简单性也会产生误导结果的风险。业务知识的应用和有效的细分可以部分减轻这种风险,但是如果我们在多个特征之间有复杂的关系,这就变得困难了。
4.统计检验
我们可以利用统计数据使我们的分析更加稳健,并避免在不同时期改变样本构成的缺陷。使用 statsmodels 库中的简单回归模型,我们可以详细分析结果。
由于这种方法在其他条件不变的原则下运作,我们的模型估计了每个特征对预测变量
y 的独立影响——在我们的情况下是每*方米的价格。只要可用特征和 y 之间的关系足够简单,可以用线性回归来预测,这就减轻了样本构成对分析周期之间价格变化的影响。
基础模型
在第一次尝试中,我选择了使用 SelectKBest 函数选择的 30 个热门功能,并为第三季度和第四季度的数据添加了一个热门功能,以将每*方米价格建模为 y。
首先,我们需要检查我们的模型是否能够根据提供的特征预测 y。值得检查我们的 R *方。如果 R2 值非常低(<0.1) the relations between variables and y are too complex or too weak to make linear regression work. If the R2 value is close to 1 there is a risk that you omitted the constant which also makes gaining any insights in the following steps impossible. Once we are happy that the model is working at least moderately well we can proceed to examine its features.
The ability to analyze feature significance is a substantial advantage of the statistics-based approach. Examining if the p-value is below our chosen alpha allows us to determine if the given feature has any significant effect on our model or is actually only adding noise.
As I have chosen the standard 0.05 for alpha, all the p-values are significantly below, which means I can analyze their coefficients with some confidence that they are close to their actual effect on the price.
With this approach, we can see that the coefficient for “offer_date_q_2020Q4” is 269, which can be interpreted as the increase of price per m2 for Q4 compared to Q2 under the assumption of ‘all other things being unchanged or constant’. We can already see the change is 30% lower than the 379 PLN/m2 change in the overall average, which suggests that part of the price increase is caused by other factors in sample composition such increase in apartments quality.
Log model
We can expand further on this approach by modeling log(y) instead of y itself. The logic behind this approach shifts from trying to predict the absolute effect of each feature on y to trying to predict by how much % y will change in relation to each feature. This approach quite often provides better results, especially while working with skewed data such as prices. It also makes interpretation of coefficients translate into % changes in y instead of the absolute values.
It is important to remember that changing the explained variable from y to log(y), makes both models uncomparable in terms of model statistics such as AIC or Log-Likelihood or R-squared.
At this stage, it is hard to compare, which model works better. The main reason for the application of this type of model was the ability to interpret coefficients as relative changes to the price.
We can interpret the “offer_date_q_2020Q4” coefficient of 0.0248 as a standalone increase of price between Q2 and Q4 by around 2.5%.
Analyzing different coefficients can also provide interesting insights — as an example east_bank coefficient of -0.079 means that buildings on the East Bank of Vistula River have prices nearly 8% lower than exactly the same properties on the West Bank. Under the 其他条件不变原则,“完全相同”意味着除 east_bank 之外的所有特征都不变,这也包括根据其他地理特征的位置,例如到中心的距离。
5.摘要
如果你花了将* 10 分钟阅读这篇文章,你应该得到一些关于标题问题的可靠答案。我希望我能够证明,分析一种非统一商品的价格趋势,可能比乍看起来要复杂得多。另一方面,通过这篇文章我们设法收集了足够的证据,所以答案如下:
我们有足够的统计证据来支持我们的假设,即在所分析的三个季度中,价格会上涨。此外,与时间变量本身相关的价格上涨估计为 270 波兰兹罗提/*方米或 2.5%。
由于华沙房地产市场已经经历了十多年的快速价格上涨,一些人预计由于疫情的原因趋势会发生变化,价格的持续上涨可能会令人惊讶。另一方面,如果我们考虑到波兰在 2020 年的通胀率是欧盟最高的,接* 4%(根据欧盟统计局的数据),那么 5%的年化房价增长就是相对的价格停滞。
将统计测试的结果与普通*均价格的变化进行比较,我们可以看到,大约 30%的价格上涨与市场上可获得的物业的特征变化有关——第四季度市场上物业的整体质量略好于 Q2。更好的质量可能与位置、市场类型、楼龄或任何其他价格驱动因素有关。
我将在下一篇文章中使用高级分析来跟进这一分析,在文章中,我们可以调查增加的复杂性是否会提供不同的答案,并试验高级模型的更好灵活性是否能让我们获得对定价趋势的更多见解。
Django 如何快速开发可维护的 Web 应用程序
原文:https://towardsdatascience.com/how-django-enables-rapid-development-of-maintainable-web-applications-f58e36db5b74?source=collection_archive---------42-----------------------
了解 Django Web 框架
凯文·Ku 在 T2 拍摄的照片
本帖原载于 内置博客 。原片可以在这里找到https://builtin.com/software-engineering-perspectives/django-overview-introduction。
Django 是 Python 中的一个高级 web 框架,它允许用户用最少的代码轻松快速地构建 web 应用程序。Django 框架遵循模型-视图-控制器(MVC)设计模式。这种设置简化了复杂的数据库驱动的 web 应用程序的开发。通过这些设计模式,Django 强调了组件的可重用性。它还遵循不重复自己(DRY)原则,通过抽象和数据标准化来避免冗余代码,从而减少软件中的重复。
Django 可用于各种 web 应用程序,包括客户关系管理系统(CRMs)、社交媒体应用程序、在线市场、按需交付应用程序等等。许多熟悉的网络应用程序目前都使用 Django,包括 Instagram、Dropbox、Spotify 和 Mozilla 等。根据 MVC 设计模式的广泛使用,您可能会怀疑它能够在 web 应用程序中实现快速开发、可伸缩性和安全性。
模型-视图-控制器
MVC 是设计 web 应用程序的一种流行的软件设计模式。它使用三个相互连接的组件将信息的内部表示与信息向用户显示的方式分开。
型号
第一个元素,模型,是 MVC 设计模式的主要组成部分。它充当 web 应用程序的动态数据结构,并且独立于用户界面。该模型还负责管理数据以及 web 应用程序的逻辑。在实践中,这种结构对应于 web 应用程序如何处理原始数据以及应用程序的基本组件。例如,如果您要创建一个跟踪您跑步的应用程序,模型类将定义一个“Run”类,该类具有相应的类属性,如英里、速度、时间、卡路里、海拔、心率和日期。
在 Django 的上下文中,模型是一个 Python 类,其中每个属性代表一个数据库字段。在我们的示例中,英里、速度、时间、卡路里、海拔、心率和日期属性都是数据库中的字段,模型类将定义这些字段并与之交互。Django 中运行类的结构如下所示:
“运行”类是运行细节的抽象。这很有用,因为它将运行的细节提取到一个与用户最相关的列表中。跑步的详尽描述可能包括与用户无关的信息。例如,除了以英里为单位报告跑步距离之外,距离还可以以英尺、公里和码为单位报告。这些附加信息对用户来说并不重要。该类允许您仅根据基本属性来简化跑步,如英里数、配速、时间、卡路里、海拔、心率和日期属性。
模型元素还允许您规范化数据,这有助于防止冗余和异常。冗余是指数据库在不同的位置保存相同的信息。由于模型元素被很好地定义,它们防止数据被复制并保存在多个地方。例如,如果地址字段出现在多个位置,则需要在每个位置对地址进行任何更新。这使得数据库容易出错,并可能导致不可靠/无意义的信息。数据规范化还有助于防止几种类型的异常。例如,它可以防止插入异常,即由于缺少其他数据而无法插入数据。它还可以防止删除异常,即由于删除其他数据而导致的数据意外丢失。
此外,Django 中的模型元素专注于使 web 组件简单和松散耦合。应用程序中的松散耦合意味着它的各个部分并不强烈地相互依赖。web 组件的松散耦合简化了开发人员的生活,因为他们可以轻松地添加新功能、更新现有功能和修复错误,而不必重写大量代码。这导致更快的软件更新和更好的用户体验。
视图
视图代码由所有与用户直接接触的功能组成。这些功能负责让事物看起来更好(UI),并决定用户与应用程序交互的方式(UX)。视图允许您指定您希望每个页面的外观。在我们的 run 应用程序中,您可以指定一致或特定的元素,如背景颜色、文本字体、导航栏和每个页面的页脚。
控制器
控制器代码将模型连接到视图。在实践中,这归结为在视图级别获取用户输入,并在模型中决定如何处理它。在 run app 示例中,控制器将从视图级别的用户输入中获取原始数据,并使用“run”模型类来构建运行的内容。鉴于此,控制器处理视图中的显示顺序,并使用新数据更新模型数据库。
可扩展性
在当前的技术环境下,构建 web 应用程序时,您必须考虑可伸缩性。虽然一个新应用的用户数量可能开始很少,但开发者应该为增长做好适当的准备。随着用户群的增长,活跃访问者和服务器请求的数量也在增长。 Django 使扩展变得容易,因为它允许你逐步增加你的用户群。它具有松散耦合的组件,这使得调试瓶颈变得容易。例如,使用 SQLite3 数据库,而不是 MySQL 或 Postgres 数据库,这是一个非常常见的问题。幸运的是,Django 允许您轻松地将数据从 SQLite3 数据库迁移到更强大的数据库,比如 MySQL 或 Postgres,只需修改两到三行代码。要证明它在扩展方面的效用,只要看看使用它的公司名单就知道了,包括 Spotify、Instagram 和 YouTube。
Django 特别支持水*扩展,这包括产生多台机器来服务请求总数中的一小部分。例如,如果您有 5,000 个请求,您可以在 10 台不同的机器上分别处理 500 个请求,而不是在一台机器上处理它们。Django 在这里很有用,因为它的特性允许您完全无状态地运行应用程序,这意味着服务器不会存储来自一个会话的信息供将来在另一个会话中使用。
无状态允许您扩展应用程序,降低 REST APIs 的复杂性,并轻松缓存请求的结果。在 Django 中,可以通过修改来启用无状态,将数据存储在远程数据库上,而不是存储在默认数据库上。这里的关键是 Django 使得在许多远程机器上运行应用程序变得简单明了,允许应用程序无状态运行。这是因为每个新会话独立于来自过去会话的客户端数据,这消除了可能出现的任何状态相关问题。由于这些特性,用 Django 构建的应用程序可以无缝地从 500 个用户扩展到 500,000 个用户。
安全
Django 的另一个吸引人的地方是它有许多免费的内置安全特性。
Django 提供的一种保护是防止跨站点脚本(XSS),从而保护用户的浏览器。Django 还可以防止跨站请求伪造(CSRF),这可以防止攻击者在另一个用户不知情或未同意的情况下使用该用户的凭证执行操作。最后,Django 可以防范 SQL 注入,防止未经授权的数据删除或数据泄露。与其他流行的框架相比,Django 有更多的内置保护。例如,Flask 是另一个流行的 web 框架,它依赖第三方软件来提供相同的保护。这给软件开发团队带来了更大的压力,他们需要通过确保第三方软件是最新的来监控安全性。由于 Django 提供了大部分免费的内置保护,因此在应用程序的生命周期内,更容易预先保护您的应用程序并监控安全性。如果你有兴趣进一步阅读,可以阅读 Django 关于安全性的文档,Django 中的 Security。
现在我们已经看到了 Django 的一些好处,让我们看看它在实践中应用的一个具体实例。Instagram 的用户体验和服务质量很大程度上是因为它的许多核心功能都是用 Django 编写的。例如,Instagram 使用 Django 应用程序 Sentry 进行错误报告。这使得 Instagram 开发者可以诊断 bug,修改代码,优化应用组件的性能。Instagram 也是建立在 Django 工具 Dynostats 之上的,该工具也允许您监控应用程序组件的效率。使用 Dynostats,开发人员可以监控用户请求、应用程序响应、应用程序延迟等。这使得开发人员可以轻松地确定应用程序变慢的原因,从而更快地找到解决方案。
结论
通过遵循 MVP 设计原则,Django 框架实现了 web 应用程序的快速开发、可伸缩性和安全性。Django 中模型的模块化架构使得更新/维护 web 应用程序的特定组件变得很容易,同时安全地保持其他组件不变。Django 不仅允许公司为他们的应用程序快速开发 web 组件,还允许公司对不断增加的复杂代码进行小的修改。此外,Django 防止了大多数常见的安全漏洞,从而节省了额外的开发时间。总而言之,Django 是一个非常棒的 web 框架,它通过 MVP 设计实现了快速开发,确保了安全性,并支持可伸缩性,从而消除了构建 web 应用程序的许多麻烦。
列类型如何影响数据仓库中的连接速度?
原文:https://towardsdatascience.com/how-do-column-types-effect-join-speeds-in-data-warehouses-5ddd1933211e?source=collection_archive---------20-----------------------
数据工程
受控实验
当我第一次在 Georgian 开始构建数据仓库时,我无法决定使用什么列数据类型作为我的表的主键。
我听说整数连接大大优于字符串连接,我担心随着数据的增长,连接性能会下降。
在操作世界的 SQL 数据库中,这个决定基本上是由开箱即用的自动递增的整数主键为您做出的。
然而,在数据仓库世界中,无论您是构建 Kimball、Data Vault 还是其他什么,您都需要明确地做出这个选择。
你可以生成一个整数,一个 UUID 字符串,或者散列你的键到一个单独的列中,这带来了很多好处。如果这还不够复杂的话,您的散列键可以存储为由字节组成的字符串,并且每个算法的输出长度可能不同。
这就带来了一个问题:
键的列类型如何影响数据仓库中连接的速度?
经过一番挖掘,我找到了一些事务数据库的基准,但这不是我想要的。从逻辑上讲,整数 一定要比字符串和字节串快,因为一般要扫描的字节比较少。但是……差了多少!?
知道答案似乎非常重要,因为在数据仓库中,一个错误的选择可能会增加十亿倍。
我终于在好奇心的压力下屈服了,决定在 BigQuery 上运行一个基准来为自己回答这个问题。
试验设计
我决定生成 500 万行随机数,并在以下类型的键上测试连接它们(没有缓存):
下面是我用来生成我想要连接的表的代码:
/* GENERATE_ARRAY has a limit of 1M rows
so I had to union a bunch of them together */
WITH
keys_1 AS (SELECT * FROM UNNEST(GENERATE_ARRAY(1,1000000)) AS key),
keys_2 AS (SELECT * FROM UNNEST(GENERATE_ARRAY(1000001,2000000)) AS key),
keys_3 AS (SELECT * FROM UNNEST(GENERATE_ARRAY(2000001,3000000)) AS key),
keys_4 AS (SELECT * FROM UNNEST(GENERATE_ARRAY(3000001,4000000)) AS key),
keys_5 AS (SELECT * FROM UNNEST(GENERATE_ARRAY(4000001,5000000)) AS key),
keys_union AS (
SELECT key FROM keys_1 UNION ALL
SELECT key FROM keys_2 UNION ALL
SELECT key FROM keys_3 UNION ALL
SELECT key FROM keys_4 UNION ALL
SELECT key FROM keys_5
),
keys_hashed AS (
SELECT
key,
MD5(CAST(key AS STRING)) as key_md5_bytes,
TO_HEX(MD5(CAST(key AS STRING))) as key_md5_str,
FARM_FINGERPRINT(CAST(key AS STRING)) AS key_farm,
SHA1(CAST(key AS STRING)) AS key_sha_bytes,
TO_HEX(SHA1(CAST(key AS STRING))) AS key_sha_str
FROM keys_union
)
SELECT *, rand() AS val FROM keys_hashed
下面是我用来测试 make join 的代码:
SELECT
t1.val, t2.val
FROM bq_benchmark.t1
JOIN bq_benchmark.t2
USING(<key column here>);
我对每种键类型运行了 30 次交互式连接查询,这样我就可以使用 Z 测试来测试*均查询次数之间的差异,并获得可靠的置信区间。
实验结果
在解释结果时,您可能会发现一些有用的定义:
下限 90%置信区间:真实的*均查询时间有 5%的概率低于这个数字。
上限 90%置信区间:真实的*均查询时间有 5%的概率比这个数字高。
标准偏差:衡量我们在样本中观察到的*均查询时间的偏差程度。
均值估计的标准误差:真实的*均查询时间与样本的估计*均查询时间的偏差。
每种列类型的查询次数统计
您可能也对上述数据的对比视图感兴趣。为了简单起见,我将只比较*均查询时间的差异,并忽略差异的置信区间(我在下面的 excel 下载中提供了该置信区间)。
*均查询时间的相对比较
结论
这是我从这个实验中得到的一切。
- 整数比字节快大约 1.2 倍的 T4,比字符串快大约 1.4 倍的 T6。
- 如果您可以访问 FARM_FINGERPRINT,并且您只使用 BigQuery,那么继续使用它(您可以在以后切换它)
- 否则,简单地使用 MD5 作为你的散列函数存储为字节。
- 如果你选择使用字符串,不要像我一样使用十六进制编码。Base64 编码将产生更小的字符串,因此查询时间比这更快(但不如原始字节快)
我已经把我的整个实验做成了 Excel 表格供你下载。我已经让它简单易用了。您可以随意向其中添加自己的数据,并在您选择的数据仓库上进行实验!
点击此处下载 Excel 表格
这篇文章最初发表在 Show Me The Data 博客上,并被重新格式化为 Medium 格式。
数据科学家如何使用 Twitter?让我们数一数
原文:https://towardsdatascience.com/how-do-data-scientists-use-twitter-let-us-count-the-ways-50494e2a95c8?source=collection_archive---------26-----------------------
阅读清单
从 TDS 档案中发现一些最好的 Twitter 数据分析。
图片作者在拍摄时暂时不在 Twitter 上。
有趣的是,你似乎可以在 Twitter 上,或者你可以尝试在生活中找到快乐、健康和*衡,但不能两者兼得。在我的时间线中,作家、记者和小众食物评论者组成了一个相当多样化的阵容。把我们团结在一起的是一种强烈的矛盾心理——是的,我在这里装腔作势——关于空间本身:我们不能离开的“地狱”。
过去几周对 TDS 档案的挖掘产生了意想不到的效果,暗示了一种不同的可能性——甚至是另一种现实。这里有几十个数据科学家和人工智能专家在 Twitter 上花费大量的时间……用它做富有成效的事情?!不会陷入越来越疯狂的绝望漩涡?!画出关于世界的深刻见解?!?!
这怎么可能呢?
现在我很清楚,我把这个*台作为新闻的主要来源,极大地改变了我对它的看法。如果你大部分时间都在推特上关注[ 随意地、不加选择地向世界挥手],那么有理由认为,你对新闻的情感最终会与你对该应用的情感融合在一起。另一方面,退一步分析其他人和社区如何使用这个*台—Twitter 由于其强大的 API 而使之成为可能——让自己变得幸福超脱(或者至少是一种表象),这是我希望有一天也能实现的。
为了证明我的观点,这里有一些我最喜欢的 TDS Twitter/数据科学交叉帖子——阅读它们!所有的,其中一些,一对夫妇;你不会后悔的。这个档案运行 极其深入,所以我在经过一些主要过滤后收集了这个集合,分为三个类别:新的和值得注意的,实际操作的资源,和空前的伟人。让我们开始吧。
新的和值得注意的
我说过我使用 Twitter 主要是为了看新闻吗?原因是这个*台不可否认的捕捉政治和文化瞬间的能力——有时它就是那个瞬间。从黑人的命也是命(以及公司偶尔以令人担忧的方式将自己与社会运动联系在一起),到 Twitter 用户在假期对网飞热门单曲 Bridgerton 的欢欣鼓舞的接受,这些最*的帖子应用数据科学的工具深入研究了这样的时刻,并且做得非常好。
实践资源
我们的许多读者来到 TDS,因为我们的社区是他们在工作、学习或激情项目中面临的实际挑战的答案。Twitter 数据分析也不例外,这里收集的帖子清晰地、一步一步地说明了如何收集、清理、处理和从推文中提取见解。
</12-twitter-sentiment-analysis-algorithms-compared-23e2d2c63d90>
空前的伟大
是的,我们关于这个话题的档案是巨大的,但是一些帖子——不像大多数推文!——真正经受住了时间的考验,今天仍然和作者第一次出版它们时一样尖锐和引人入胜。它们涵盖了广泛的话题,从 Twitter 自己的招聘过程到检测推文中语言标记的抑郁迹象。但是首先:可爱的 DOGS 。
</4-tips-you-need-to-know-on-nlp-from-a-twitter-data-scientist-635206c817e9>
请告诉我们以上是否有你特别感兴趣的。还有:你是否读过一篇很棒的帖子——在这里或者在另一个网站上——介绍了一个与 Twitter 相关的数据项目?你自己写过吗?请在评论中与我们分享。还有:在未来的阅读清单中,你还想看到我们涉及的其他主题吗?也告诉我们。
决策树和随机森林是如何工作的?1b
原文:https://towardsdatascience.com/how-do-decision-trees-and-random-forests-work-15cc2a925788?source=collection_archive---------27-----------------------
回归树
杰里米·毕晓普在 Unsplash 上的照片
在本系列的第 1 部分中,我谈到了决策树是如何工作的。(如果你还没看过那篇文章,我建议你回去读一读再继续。去吧。我会等的。)那篇文章主要集中在分类上,例如是/否、活/死等。好吧,决策树也可以用于回归——例如,预测一个连续变量。决策树的许多方面都是相同的,但是预测答案的方式略有不同。
对于这篇文章,我将使用来自 Dockship.io 挑战赛的数据集:发电厂能源预测人工智能挑战赛。这项挑战使用四个输入变量来预测发电厂的能量输出(PE)。以下是数据集中的前六条记录:
作者截图
在哪里,
- AT =环境温度
- AP =环境压力
- V =排气速度
- RH =相对湿度
回归树所做的是对某一组条件取*均值,并将其用作预测。整个数据集的 PE *均值是 454.31,所以这是对根节点的预测。
如果您还记得第 1 部分,在分类树中,熵用于决定如何将数据分成不同的分支。熵本质上是无序或不确定性的度量。对于连续变量,我们可以使用标准差(SD)来达到同样的目的。然后我们想尽可能地降低整体标准差。我们数据集的标准偏差是 17.06。计算总体标准差的方式与我们之前计算总体熵的方式非常相似——它只是一个加权*均值。将分数百分比和每个分数的标准偏差的乘积相加。
所以,让我们从温度开始,从*均温度 19.68 开始。如果我们观察功率输出的*均值和标准差,我们得到:
作者截图
在这里,我们看到标准偏差通过这种简单的分割大大降低了(从 17.06 到 9.12)。如果 AT 小于 19.68,这个极其简单的模型将预测 469.42 的功率输出,如果 AT 为 19.68 或更大,将预测 440.71 的功率输出。
如果我们用其他三个输入变量的*均值做同样的事情,我们得到:
作者截图
由此,我们看到*均温度为我们提供了最佳的 SD 降低。当然,正如我们在第 1 部分中看到的,我们不必(也不应该)满足于此。例如,如果我们以中位数(20.32)而不是*均值分割温度,我们得到的总标准差为 9.22,减少了 7.84。所以*均温度是一个比中位数更好的分割值。该算法将为每个变量尝试不同的分割值,以获得可能的最佳 SD 减少。
一旦我们有了第一次拆分,我们可以尝试进一步拆分前两个组。然后这些可以被分割,等等。这是从 R 的 rpart()函数得到的树,带有标准参数。(注意:只有整个数据集的 70%被用作创建此决策树的训练集。)
作者截图
如您所见,在这个决策树中,只有两个变量是有用的。如果我用这个作为预测模型,你会发现它非常粗糙。毕竟只有五个叶节点,你的预测只能得到五种可能的答案。
作者截图
这是回归树模型的一个局限性。它处理*均值。一个相关的限制是 它不能外推训练数据之外的 。毕竟你不可能得到一个小于最低值或者大于最大值的*均值。
虽然我们对后者的限制无能为力,但我们可以避开前者。如果我们可以创建许多略有不同的决策树,我们可以得到许多不同的可能叶节点,以及许多不同的可能答案。如果我们可以将所有不同树的结果*均,我们可以得到更好的预测能力。这就是随机森林的用武之地,这将是本系列下一部分的主题。
进一步阅读
[## 决策树和随机森林是如何工作的?
towardsdatascience.com](/how-do-decision-trees-and-random-forests-work-66a1094e6c5d)
决策树和随机森林是如何工作的?1a
决策树
在 Unsplash 上veeterzy(Vanja ter zic)拍摄的照片
决策树和随机森林是预测建模中两种常用的算法。在这篇文章中,我将讨论决策树背后的过程。我计划在第二部分继续讨论随机森林,然后比较两者。
首先:决策树。决策树是根据出来的图形的形状来命名的。下图显示了一个决策树,用于确定哪些因素影响了泰坦尼克号灾难中的幸存者。
作者吉尔金——自己的作品,CC BY-SA 4.0,https://commons.wikimedia.org/w/index.php?curid=90405437
在我们继续之前,我应该介绍一些术语。树中的每个分支点称为一个节点,代表一个包含起始数据集的部分或全部记录的数据集。按照“树”的主题,顶部(或起始)节点也称为根节点。这包含数据集的所有记录(行、个人,无论您想如何称呼它们)(或者至少是您想要包含的所有记录)。树从这个根开始生长,给我们更多的节点,直到它生成终端节点(即,那些没有被分割的节点)。这些终端节点被称为叶子。上面的树有四片叶子。每个都标有该节点的最终预测。
有两种类型的决策树:分类和回归。分类树预测因变量的类别——是/否、苹果/橘子、死亡/幸存等。回归树预测数值变量的值,类似于线性回归。回归树需要注意的一点是,它们不能像线性回归那样在训练数据集范围之外进行外推。然而,与线性回归不同,回归树可以直接使用分类输入变量。
虽然 Titanic 决策树显示了二叉分裂(每个非叶节点产生两个子节点),但这不是一般的要求。根据决策树的不同,节点可能有三个甚至更多的子节点。在本文的其余部分,我将集中讨论分类决策树,但是回归树和分类树的基本思想是一样的。
最后,我将提到这个讨论假设在 r 中使用 rpart()函数。我听说 Python 不能直接处理类别变量,但是我对 Python 不太熟悉,尤其是对于数据分析。我相信基本理论是一样的,只是实现方式不同。
决策树是以迭代的方式创建的。首先,扫描变量以确定哪一个给出了最好的分割(稍后将详细介绍),然后基于该确定将数据集分割成更小的子集。然后再次分析每个子集,创建新的子集,直到算法决定停止。这个决定部分由您为算法设置的参数控制。
这种划分是基于对所讨论的数据集(或子集)的预测有多好。上面的巨大决策树最初基于性别创建了两个子集,这两个子集具有更好的预测价值。如果我们看看泰坦尼克号的例子,icyousee.org 报告说总存活率是 32%。看上面的决策树,我们看到 73%的雌性存活了下来。总结整个树,我们可以生成以下规则:
- 如果乘客是女性,她很可能幸存(73%的几率)
- 如果乘客是男性,那么存活率取决于年龄和机上兄弟姐妹的数量。
- 没有兄弟姐妹的年轻男孩很有可能存活下来(89%的几率)
- 大多数雄性都不走运
从现在开始,我将使用我创建的人工数据集,记录 10 名成年男性和 10 名成年女性的身高和体重。(身高是根据 CDC 研究的实际*均值和百分位数随机生成的——见下文。基于身高值加上身高和体重标准偏差生成体重。见最后的 R 代码。)
作者创建的表格和数据
让我们看看我们是否可以使用这个数据集来预测一个个体是男性还是女性。如果我们随机选择一个人,我们有 50%的机会得到一个男性或女性。有了一个像样的预测模型,我们应该可以做得更好。男性往往更高,更重,所以也许我们可以使用其中一个或两个变量。
决策树使用一种叫做熵的东西来告诉我们我们的预测有多确定。在物理术语中,熵指的是系统中无序的数量。这里也是一样。如果熵为零,就没有无序。只有当我们完全确定从数据集中挑选某人时,我们知道会得到什么,这种情况才会发生。不要期望这在现实生活中发生——永远不要。然而,我们确实希望熵尽可能的低。存在两个类的数据集的熵计算如下:
作者创建的所有方程式图像
其中:
- S =数据集的熵
- p₁ =个人属于 1 类的概率
- p₂ =个人属于类别 2 的概率
对于原始数据集,S = 1,这是该方程可实现的最大无序度。你自己试试吧。确保您使用的是以 2 为基数的对数。使用基数 2 并不重要,但这是获得最大值 1 的唯一方法。(注意:如果特定数据集只包含一个类,则不存在第二个术语。如果一个因变量有两个以上的可能值,就会增加额外的项。)
在决策树中拆分数据集时,总熵是用子集熵的加权*均值计算的,如下所示:
其中:
- Sₜ =分裂后的总熵
- Sₓ =子集 x 的熵(即,S₁ =子集 1 的熵)
- fₓ =进入子集 x 的个体比例
任何点的总熵都是从所有当前叶节点计算的(即使它们以后可能会分裂)。例如,在早期的泰坦尼克树中,总熵在第一次(性别)分裂后有两个( f S )项,在第二次(年龄)分裂后有三个项,在第三次(兄弟姐妹)分裂后有四个项。
决策树算法将查看不同变量的不同值,以根据原始值的熵减少来确定哪个给出最佳分割。
让我们用身高/体重数据集来分析一下。先以体重为分界点。女性的*均体重是 177 磅,而男性的*均体重是 201 磅。让我们在两者的中点分开(189 磅)。这将给我们两个子集:
- 子集 1 (< 189 磅,预测女性)有 6 名女性和 3 名男性(总共 9 名)
- 子集 2 (≥ 189 磅,预测男性)有 4 名女性和 7 名男性(共 11 名)
根据这些信息,我们可以计算两个子集的熵:
和
亲爱的读者,我将把证实第二熵的任务留给你。为了计算分裂的总熵,我们使用等式 2。
所以通过分解 189 磅的重量,我们得到了熵的轻微减少。决策树算法会检查许多值,看它们是否会给出更好的结果。结果是,如果我们把分裂值降到 186 磅,总熵会降到 0.88。
当然,我们也可以尝试基于身高的拆分。让我们从均值的中点开始。这将给我们一个 66.2 英寸的分割值。通过这种分割,我们得到以下两个子集:
- 子集 1 (< 66.2 英寸,预测为雌性)有 9 只雌性和 2 只雄性(总共 11 只)
- 子集 2 (≥ 66.2 英寸,预测男性)有 1 名女性和 8 名男性(共 9 名)
有了这些信息,我们可以计算这种分裂的熵:
这比使用权重进行分割要好得多。但是如果我们将分裂点提高到 68.2 英寸,我们可以做得更好,总熵为 0.51。现在我们的决策树有了第一次分裂。接下来,该算法将检查这些子集中的每一个,以查看它们是否可以再次被分割,这次是基于权重。这样做可能会让我们得到更好的熵,但我们分裂得越多,我们就越有可能过度拟合数据。请记住,我在这里只采样了 20 个人,其中一些看起来像异常值(例如,最高的女性体重最轻)。对于包含许多变量的大型数据集,您可能会得到一个真正混乱的决策树。有几个参数可以用来限制这一点,但这超出了我想在这里讨论的范围。
在以前的帖子中,我谈到了使用 rattle 来帮助学习 r。事实证明,Rattle 包对决策树有很好的绘图功能。这是我通过 Rattle 的决策树算法运行数据集时得到的图像,使用标准参数(注意,它只在一次分割后就停止了):
作者图片
这个情节有很多特点,我现在就来介绍一下。
- 颜色对应预测的性别(绿色=女性,蓝色=男性)。
- 节点 1(也称为“根节点”)具有 50/50 的性别比例,并且占观察值的 100%。它的绿色意味着如果它必须从这组动物中预测性别,它会选择雌性。
- 在这个节点下面,我们看到第一次拆分。如果高度< 68 inches, then we predict female. Otherwise, we predict male.
- Node 2 accounts for 65% of the dataset and has a 77/23 split of females to males. Its green color means that everybody in this subset is predicted to be female
- Node 3 accounts for 35% of the dataset and is 100% male, which is why it’s blue.
The biggest benefit of decision trees is the ease of understanding. They’re easy to read and it’s easy to see how the model made its prediction.
In part 2, we will investigate random forests, and see how they compare to decision trees.
Further Reading
(Note that the Amazon link above is an affiliate link.)
R Code
创建数据集
# Data from [https://www.cdc.gov/nchs/data/series/sr_03/sr03-046-508.pdf](https://www.cdc.gov/nchs/data/series/sr_03/sr03-046-508.pdf)
# means are directly retrieved from report
# SDs are estimated from 15th and 85th percentiles
library(dplyr)
set.seed(1)# Weight of Females over 20 - Table 4 - excludes pregnant females
FWnum <- 5386 # number of females in sample
FWmean <- 170.8 # mean weight of females, in pounds
#15% = 126.9
#85% = 216.4
#diff / 2 = 44.75
FWSD <- 44 # estimated std dev, in pounds# Weight of Males over 20 - Table 6
MWnum <- 5085 # number of males in sample
MWmean <- 199.8 # mean weight of males, in pounds
#15% = 154.2
#85% = 243.8
#diff / 2 = 44.8
MWSD <- 44 # estimated std dev, in pounds# Height of Females over 20 - Table 10
FHnum <- 5510 # number of females in sample
FHmean <- 63.5 # mean height of females over 20, in inches
#15% = 60.6
#85% = 66.3
#diff / 2 = 2.85
FHSD <- 2.8 # estimated std dev, in pounds# Height of Males over 20 - Table 12
MHnum <- 5092 # number of females in sample
MHmean <- 69.0 # mean height of females over 20, in inches
#15% = 66.0
#85% = 72.0
#diff / 2 = 3.0
MHSD <- 3 # estimated std dev, in pounds# create 10 normally distributed female heights
FemaleHeight <- round(rnorm(10, mean = FHmean, sd = FHSD), 1)# Calculate weight based on comparison of height to mean height
FemWCorrel <- FemaleHeight/FHmean * FWmean
# throw in some random deviation based on weight SD
FemWAdj <- rnorm(10, sd = FWSD/2)
FemaleWeight <- round(FemWCorrel + FemWAdj, 0)
F <- data.frame(Height = FemaleHeight,
Weight = FemaleWeight,
Gender = "F")# create 10 normally distributed male heights
MaleHeight <- round(rnorm(10, mean = MHmean, sd = MHSD), 1)
# Calculate weight based on comparison of height to mean height
MaleWCorrel <- MaleHeight/MHmean * MWmean
# throw in some random deviation based on weight SD
MaleWAdj <- rnorm(10, sd = MWSD/2)
MaleWeight <- round((MaleWCorrel + MaleWAdj), 0)
M <- data.frame(Height = MaleHeight,
Weight = MaleWeight,
Gender = "M")df <- rbind(F, M)
我如何成为一名数据科学家?学习数据科学的四个基本策略
原文:https://towardsdatascience.com/how-do-i-become-a-data-scientist-the-four-basic-strategies-to-learn-data-science-64b64b6b20e7?source=collection_archive---------51-----------------------
图片来自 geralt
有抱负的数据科学家会经常向我询问学习数据科学的最佳方法。他们应该尝试训练营或参加在线数据科学课程,或者其他无数的选择吗?
在过去的几年中,我们看到了许多不同类型的教授数据科学的教育计划的发展,从免费的在线教程到训练营到大学的高级学位,疫情似乎已经促进了更多计划的建立,以满足日益增长的远程学习需求。虽然总体来说可能是一件好事,但有更多的选择增加了决定选择哪一个的复杂性,也增加了推销其服务的程序的潜在噪音。
本文是对四种基本类型的数据科学教育计划的高级调查,旨在帮助您思考哪种计划最适合您。在不了解数据科学的情况下,很难评估一个项目在教授数据科学方面有多有效。希望这篇文章将有助于打破这个先有鸡还是先有蛋的难题。
这是学习数据科学的四种基本方法:
- 自己动手学习
- 在线课程
- 训练营
- 数据科学(或相关领域)硕士学位或其他大学学位
我将按从最便宜到最贵的顺序讨论它们。我还包括了两种混合策略,这两种策略结合了一些值得考虑的策略。下表提供了每一项的简要概要:
图片来自 Anastase Maragos
选择 1:在网上自己动手
有大量免费的在线数据科学资源,可以从头开始教授数据科学,也可以解释您可能想知道的任何数据科学内容。这些内容包括为那些像 W3Schools 一样通过做来学习的人提供的教程,YouTube 和其他网站上为音频学习者提供的视频,如吴恩达的 YouTube 系列,为喜欢阅读的视觉学习者提供的文章,如走向数据科学。你可以上网自学。它的优点是自由和完全灵活,可以根据你的时间表量身定制。
但作为一名前教师,我发现自主学习并不适合每个人。你必须完全自我激励和自我组织才能这样自学。所以,了解你自己:你是那种能像这样完全独立地学好的人吗?
教育项目往往会提供这些资源,如果你单干,可能会缺乏这些资源:
1)课程监督:任何教育项目中的数据科学专家通常会为您建立某种数据科学课程,其中包括该领域的必要主题。许多数据科学新手还不知道哪些数据科学概念和技能是最需要学习的。这对自学者来说是一个先有鸡还是先有蛋的问题,自学者必须至少了解一点这个领域,才能知道首先要学习的最重要的内容。数据科学课程通过给你一个初始课程来帮助你避开这个问题。
2)领域规范的指导:除了教授材料,教育计划隐含地向学生介绍数据科学规范和思维方式。尽管有时会偏离既定的习惯,但当第一次与数据科学家同事一起在团队中工作时,这是很重要的。有时,自学者学习文字材料,但没有收集隐含的观点,使他们能够融入数据科学社区。
3)外部社会责任:教育项目提供了一种社会责任形式,潜移默化地鼓励你完成工作。自学者必须几乎完全依靠自己的自我激励和自我负责,以我的经验来看,这对一些人有效,但对另一些人无效。
4)社会资源:教育项目(尤其是面对面或虚拟会面的项目)提供了各种各样的人——老师、学生,在某些情况下还有学员/下属——可以与他们一起讨论问题,帮助你发现自己的弱点和缺点,并确定解决它们的方法。初学者很容易忽略的微小编程细节,但专家可能很容易发现,这可能会导致整个程序失败。要独立学习,你必须自己解决所有这些问题,或者找到愿意帮助你的数据科学朋友或家人。
5)技能认证:教育项目授予学位、等级和其他认证,作为你事实上拥有数据科学角色所需技能的外部证明。靠自己学习,你必须靠自己向雇主证明你有这些技能。开发一个发人深省的项目组合,你所做的就是证明这一点的最佳方式。
6)形成项目的指导:一个令人印象深刻的项目可以创造奇迹,展示你的数据科学技能。根据我的经验,数据科学的初学者通常还不具备创建、完成和营销一个发人深省但可行的项目的技能,而数据科学教育工作者最重要的角色之一就是帮助学生思考如何开发一个项目。一个人学习的时候一定要自己做到这一点。
人们可以克服这些缺陷。我发现,对于独立学习的人来说,它的成本和灵活性优势很容易超过这些缺点。因此,关键问题是,这种形式的独立学习对你有用吗?以我的经验来看,它对相对较少的人有效,但是对那些有效的人来说,它是一个很好的选择。
如果你决定自学,我建议你考虑以下几点:
1)在制作材料时,对你的学习风格要认真负责。例如,如果你是一个视觉学习者,那么阅读在线材料资源将是最好的,但如果你是一个听觉学习者,那么我会建议你在 YouTube 上观看视频教程/讲座。
2)如果您有愿意帮助您的数据科学朋友,他们可能是一笔巨大的财富,特别是在确定要学习哪些数据科学资料、解决您可能遇到的任何编码问题和/或开发一个好项目方面。
3)一般来说,人们通过学习数据科学来学习数据科学。避免只阅读数据科学的常见陷阱,而不亲自动手做实验(最好是不干净、令人讨厌、真实世界的数据,没有经过修整的“教科书般完美”的数据)。首先使用原始数据来学习概念是好的,但是要确保你能够用真实生活中的脏数据来练习。
图片来自穆罕默德 _ 哈桑
选项 2:在线课程
网上课程有各种各样的 T2 形式。大部分都比较便宜(通常一个月 20-50 美元左右,或者每个课程 100-200 美元)。例如,在撰写本文时,Udemy 有一门数据科学入门课程,统一收费 94.99 美元,Coursera 有一门课程每月收费 19.99 美元(两者的价格都因折扣和其他特殊交易而异)。在线课程通常是你能报名参加的课程中最便宜的,而且由于 most 的长度,你可能需要参加几个级别的课程(入门到高级)来学习这个领域。
另一个优点是他们很灵活:你可以根据你的时间表的需要,按照你自己的速度学习。这对那些一边工作一边学习的人来说真的很有价值,因为他们有家庭责任和/或其他义务使他们的时间表变得复杂。请记住,虽然,因为你经常每月支付,你需要几个月往往决定了最终的成本。说到底,多花 100 美元左右,再花几个月完成课程,仍然比其他课程选择便宜得多。
然而,另一方面,就像自己做一样,他们往往缺乏课堂学习的社会效益:教师提问并提供外部社会责任,同学们一起工作。以我的经验来看,这对一些学习者来说是一个很大的挑战,但是其他人相对来说不会受到它的影响。
此外,许多在线课程更多地提供了数据科学的粗略总结,缺乏学习数据科学和向他人推销自己所必需的复杂项目。即使有例外,在线课程通常擅长介绍数据科学概念,而不是深入探索。许多人专注于已经清理好的现成数据中的罐装问题,而不是让您在大多数数据科学家实际工作中必须使用的杂乱、复杂、通常只是简单而愚蠢的数据上练习。他们还经常缺乏一对一辅导的人员,通过复杂数据的投资组合建设项目来指导每个学生。
因此,在线课程往往会提供良好、经济高效的数据科学介绍,有助于了解您是否喜欢该领域(参见下面的混合#1),但通常不会提供成为数据科学家所需的精细培训。现在,一些项目正在发展他们的课程。特别是随着疫情对远程学习需求的增加,在线学习*台正在开发更强大的在线数据科学课程。如果你选择通过参加在线课程来学习,我建议用你自己的项目来补充,以获得实践数据科学工作的经验,并在求职面试中展示。
图片来自 Jukan Tateisi
混合#1:使用在线课程介绍数据科学(或编程)
如果你对数据科学完全陌生,在线课程可以提供一个低成本的结构化空间,让你了解这个领域需要什么,并确定它是否适合你。我看到许多人参加了几千美元的训练营或大学学位课程,却发现他们不喜欢从事数据科学工作。在线课程是辨别这一点的一个更廉价的空间。
你总是可以自己免费探索数据科学,以决定你是否喜欢它(见选项 1),而不是参加在线课程,但我发现许多以前从未见过数据科学的人不知道在该领域查找什么来开始。一门介绍性的在线课程并不昂贵,而且对主要话题领域的初步定位也是值得的。
这种方法有三种基本版本:
1)如果你还不知道编程语言,参加在线编程课程。我在本文的中解释了为什么我会推荐 Python 作为学习的语言(Julia 紧随其后)。如果你不喜欢编程,那么你已经吸取了教训,你不应该成为一名数据科学家,即使你最终没有从事数据科学,编程也是一项非常有价值的技能,接受一些培训只会有助于你在大多数其他相关领域的职业前景。
2)如果你确实懂一门编程语言,那就去上一门数据科学入门课程。这些通常提供了数据科学的高级概述,对于需要与数据科学家一起工作并理解他们所谈论的内容的人来说尤其有用。如果你需要数学复习,这也是一个很好的选择。
3)我见过未来的数据科学家参加在线数据分析课程,为他们准备并确定他们对数据科学的潜在兴趣。然而,我不建议这样做。尽管数据科学家有时会将数据分析视为数据科学的“食谱”或“基础”版本,但数据分析是需要不同技能的不同领域。例如,数据分析课程通常不包括严格的编程。如果他们教编程的话,他们通常专注于 R 和 SQL,这些语言对于数据分析和统计来说是很好的语言,但对于数据科学来说还不够(对于数据科学来说,你可能需要像 Python 这样的语言)。数据分析和数据科学通常也强调不同的数学领域:例如,数据分析往往依赖于统计学,而数据科学依赖于线性代数。因此,你在这些课程中学到的东西并不像你想象的那样适用于数据科学。现在,如果你不确定你是否想成为数据科学家或数据分析师,那么数据分析课程可能会帮助你了解和感受数据分析,但我不会用它们来评估数据科学是否适合你。
完成在线课程后,如果您仍然认为自己喜欢从事数据科学工作,那么您可以选择任何选项来更深入地学习该领域。这似乎只是让你回到起点,但通过参加一门介绍性的编程或数据科学课程,可以说你已经让自己变得更好,并且更准备好面对成为数据科学家的“老板之战”。
图片来自heylogostechie
选项 3:数据科学训练营
数据科学训练营也变得流行起来。他们往往是几个星期长(以我的经验,通常是 2 到 6 个月)的强化训练项目。传统的疫情前训练营是面对面的,通常花费大约 10,000 到 15,000 美元。梅蒂斯人的训练营很好地展示了他们通常的样子。
它们最大的优点是,与获得大学学位相比,它们能以更低的成本和更少的时间提供课堂教育的优势。与之前的选项相比,它们在成本方面有了显著提高(见下面的第 2 个选项),但它们试图以低得多的价格和很少的时间提供与数据科学硕士学位相当的(但学术上不太先进和深入的)知识范围。尽管这经常会让他们的步伐感觉紧张,但好的训练营往往能成功做到这一点。这使得他们成为任何想成为数据科学家的人的绝佳选择。最后,与前面的选项不同,你会有一位老师向你提问并激励你,还有一群同学和你一起思考概念。最好的项目提供职业指导,并在数据科学社区建立强大的网络,以帮助他们的学生以后找到工作。
然而,它们有一些主要的缺点:
1)他们能感受到快节奏,在短时间内理解复杂的概念。我的许多参加过训练营的朋友都报告说感觉到了认知上的扭伤。预计那几周/几个月会是精神紧张的,会淹没你的生活。数据科学训练营通常是朝九晚五的全职工作,你可能会在晚上或周末精疲力尽,无法做其他事情(而且在某些情况下,你无论如何都要完成作业)。对于这样的考验来说,几周或几个月的时间并不算太长,但这让他们比之前的选择更不灵活。例如,这迫使许多学生从目前的工作中抽出时间来完成训练营,并在训练营期间尽可能多地限制他们的社会、家庭和其他义务。这使得那些无法从工作中抽出时间,忙于社交或家庭生活,或其他许多事情的人很难做到。
2)几千美元,显然比以前的选择要贵得多(但仍然比大学便宜得多)。一些学校根据需要提供奖学金和其他服务,但即使这样,不得不暂停工作的机会成本仍然很高。鉴于他们普遍的高薪,获得一份数据科学的工作可能会收回投资,但这需要大量的初始投资。
这使得它对于任何考虑数据科学但不确定是否想做的人来说都是一个非常糟糕的选择。10,000 美元对于简单地了解你不喜欢这个领域来说是一笔很大的开支,而且有许多更便宜的方法来初步探索这个领域(尤其参见混合#1)。然而,对于任何真正想成为数据科学家但还不具备关键技能和知识的人来说,这个成本可能还是值得的。
3)在写这篇文章的时候,新冠肺炎疫情已经迫使大多数数据科学训练营进行远程会面,使他们的服务更类似于便宜得多的在线课程。也就是说,许多人寻求虚拟模拟课堂环境,试图提供某种类型的社会环境,但课堂环境是一个主要优势,使他们比以前的选择显著增加的成本是值得的。
4)它们往往存在于大城市(尤其是科技中心)。例如,美国的训练营往往集中在纽约市、洛杉矶、芝加哥、旧金山等地。在疫情之前,任何不住在这些地方的人都必须旅行并临时居住在他们选择的训练营所在地,这是一笔额外的费用。
5)对于不了解编程的人和不了解大学水*的数学如线性代数、微积分和统计的人来说,它们通常很难。如果你不懂编程,我建议你先通过廉价的在线课程和/或在线教程来学习像 Python 这样的编程语言(更多信息请参见我写的这篇文章解释了为什么要学习所有语言的 Python)。一些数据科学训练营提供预备入门在线课程,为那些不懂的人教授必要的编码和数学技能。它们也值得考虑,但是请记住,同等的在线课程在教育价值大致相同的情况下可能更便宜。
如果你决定参加训练营,在研究选择哪个训练营时,这些标准很重要:
1)项目导向:它们在多大程度上使您能够通过项目组合构建项目实践数据科学,以及它的校友所做的项目给人的印象如何?最好的数据科学训练营通常以面向项目的方式授课。
2)找工作资源和/或工作保障:他们给你什么资源或辅导,帮助你事后找工作?例如,帮助建立关系网、展示自己和面试是找到数据科学家工作的重要技能,除了教你技术课程,最好的项目往往会找到职业教练,专门帮助你寻找工作。此外,一些项目提供工作保证:如果你毕业后几个月没有找到数据科学的工作,他们会退还学费。这通常表明他们把找工作看得足够重要,以至于不惜自己的钱去冒险(尽管要检查保证书上的细则,看看他们同意的确切条款)。
3)校友资源:一个令人惊讶的重要细节是,训练营在培养校友网络方面投入了多少资源。我很惊讶地发现,我是多么容易接受与网上训练营的校友见面/建立关系网,而且校友们对训练营是多么的满意。训练营努力与校友一起工作并保持关系,这一点影响很大。在远程研究项目时,与明矾的联系可能很难评估,但询问你是否可以与明矾交谈以了解他们对该项目的体验,查看训练营明矾在 LinkedIn 和其他社交媒体网站上的活动,并询问他们促进了哪些与明矾的社交机会,这些都是评估项目对培养关系的有意程度的好方法。
4)奖学金选项:一些项目根据需要提供全额或至少部分奖学金。显然,降低训练营成本的方法会很好,特别是如果训练营对你来说似乎是一个理想的选择,但成本似乎太令人生畏。
图片来自布鲁克·卡吉尔
混合#2:在线训练营
在线训练营往往拥有在线课程的时间安排灵活性,但提供更严格的个人(尽管是远程)学习,允许您结合数据科学训练营和在线课程的最佳方面。它们通常也比传统训练营便宜(但也比在线课程贵)。最后,对于那些不住在碰巧有本地数据科学训练营项目的大城市的人来说,他们往往是更好的选择。如果说有什么不同的话,那就是疫情可能帮助产生了更多的在线训练营项目,因为它迫使数据科学训练营进行虚拟教学。
2017 年,我参加了跳板的在线数据科学训练营,这是在线训练营的一个很好的例子。当时,他们的费用大约是每月 1000 美元(在撰写本文时,他们的标准费用是每月 1490 美元,并表示他们的计划通常需要六个月)。这比传统的训练营便宜,但仍有一些为期六个月的总费用在 10,000 美元左右。他们有典型的在线课程,但也提供每周与讲师的虚拟会议,讨论材料和你遇到的任何问题。现在他们似乎包括网上虚拟课程。这种个性化培训和远程课堂环境是在线课程的主要附加值,你必须评估对你来说,这些额外的费用是否值得。它们是自定进度的,与典型的训练营相比,在工作时间和频率上提供了更大的灵活性。如果你在毕业后的六个月内没有找到工作,他们也会退还你的钱。
如果你选择这个选项,请注意在线课程和传统训练营的潜在陷阱。就像在线课程一样,你需要评估自己是否适合自学课程(即使你可以一周见一次主要问题的导师,你也要在一周内自学)。像传统的训练营一样,预计学习将是精神紧张的,并确保他们帮助你开发投资组合建设项目,并提供求职资源和培训。
图片来自 A_Ginard
选项 4:硕士学位或其他大学学位
最后的选择是回到学校去获得数据科学的学位。这是最昂贵和最耗时的选择:硕士学位(如果你已经有学士学位,这是一个合理的选择)通常是最短的,需要两年时间。但它们的价格超过 10 万美元。即使部分或全额奖学金降低了这一成本,在学校度过几年的机会成本仍然高于其他任何选择。然而,如果你知道如何恰当地利用它,它可以提升你的简历,这可能会增加你的工资,以弥补最初的成本。如果你已经知道自己热爱数据科学(比如说,因为你已经在这个领域工作过,最好是你也已经搞清楚了你想做的数据科学的具体领域),但想把你的技能、技术和/或模型如何工作的理论知识提升到一个新的水*,我只会建议你去攻读硕士学位。
提高数据科学技能的最佳方式是学习数据科学:在实践数据科学时,寻找或创造推动你的环境。研究生院并不是提炼一个人的数据科学技能的唯一潜在环境(例如,如果做得好,所有之前的选择都可能涉及到这一点),即使研究生院在提供严谨性方面很棒,这些其他选择也可能更便宜、更灵活。最后,在撰写本文时,至少对数据科学家的需求超过了该领域的实际人数,因此在没有数据科学“官方”大学学位的情况下获得数据科学工作是非常现实的。
大学数据科学学位课程相对较新,通常只有几年的历史。因此,并不是所有的大学都有真正的数据科学学位或系,而是要求你注册一个相关的项目,如计算机科学、统计学或工程学,以学习数据科学。这并不总是意味着这些其他项目不好或没有帮助,但这通常意味着为了完成学位,你将不得不执行与数据科学本身无关或半无关的任务(在某些情况下,来自其他领域的教员的帮助很少)。
在考虑一个项目时,你应该确保他们积极主动地教授专业知识,而不仅仅是学术数据科学技能。这些是我会研究的具体问题,以评估它们对你从事非学术数据科学工作的准备程度:
1)他们的教师中有多大比例的人目前在行业中担任或至少曾经担任过数据科学家(或其他类似的职位)?
2)该部门与当地组织的关系如何,他们是否能够利用这些关系来帮助你通过勤工俭学项目或项目期间的实习和/或之后的就业与这些组织合作?
3)他们会帮助你将论文转化为应用数据科学项目,或者至少给你一定的灵活性,让你的简历在未来的雇主面前大放异彩吗?
如果你选择的项目缺乏这些,我强烈建议你在完成项目的同时,建立简历/投资组合提升项目,并与当地的数据科学家建立联系。这需要相当多的时间和精力,所以理想情况下,你的部门会积极地帮助你完成这项工作,而不是要求你在完成他们所有工作的同时独立完成。
融资选择是另一个需要考虑的问题。他们愿意为你的学位提供全额资助还是至少部分资助?在获得硕士学位的同时工作的勤工俭学项目是一个很好的方式,可以让你毕业时没有债务,并获得建立简历的工作经验(尽管它们会让你很忙)。在完成硕士学位的同时,我作为一名数据科学家受益匪浅,不仅因为我毕业时没有负债,还因为这让我能够练习和完善我的技能。
最后,大多数大学要求你住在附*,并且亲自出席(至少在疫情之前,可能在之后)。因此,如果附*没有数据科学学位项目,你可能不得不在附*找一个地方,或者愿意搬迁几年。如果是这样的话,你应该把搬家费用算进项目的成本中。
结论
学习数据科学可能是一个可怕而令人生畏的前景,找到适合你的策略是复杂的,特别是考虑到所有的教学、后勤和财务因素。希望这篇文章能帮助你思考如何前进。
也感谢《数据科学》杂志发表这篇文章。关于他们工作的更多细节,见 本 。
学习用 Python 提取嵌套字典数据
原文:https://towardsdatascience.com/how-do-i-extract-nested-data-in-python-4e7bed37566a?source=collection_archive---------1-----------------------
辅导的
揭开 Python JSON、字典和列表的神秘面纱
JSON:字典和列表数据结构(类型),作者图片。
“生活就像洋葱,你只能一次剥开一层,有时还会流泪”――卡尔·桑德伯格
我想从嵌套的 JSON 结构中提取值也是如此。当处理由深度嵌套的数据结构混合组成的 JSON 对象时,即使是最熟练的程序员也会流泪。提取值的过程充其量只能说是混乱无序的。数据越多,越乱。
作者创建的课程
在本教程中,我将带您一步步地从任何 JSON 中提取您需要的值。给你一个警告:这个教程不是给 JSON、列表或字典的新手看的。如果你从未听说过列表索引或字典键值对,我建议你查阅一下网站或 YouTube 上的许多优秀教程。一旦你对这门课感觉更舒服了,再回来继续学习和成长。
家政
JSON 与列表和字典
首先,当谈到术语“JSON”、“list”和“dictionary”时,我们必须做一些重要的整理工作。JSON 或 JavaScript Object Notation 是一种更广泛的格式,用于包含字典和列表结构,如下图所示。
JSON:列表和字典结构,作者图片。
技术文档称 JSON 对象建立在两种结构上:一个键值对列表和一个有序的值列表。在 Python 编程中,键值对是字典对象,有序列表是列表对象。实际上,提取嵌套数据的起点是从字典或列表数据结构开始的。提取嵌套数据时,问题应该是:数据是嵌套在字典还是列表数据结构中?使用的数据结构组合是什么?使用的第一个数据结构是字典还是列表?
"长期以来,我的一条公理是,小事永远是最重要的。"——阿瑟·柯南·道尔爵士,
如果看起来我在术语上小题大做,那是因为我确实如此。当提取嵌套数据时,细节很重要。数据结构变化数据在 JSON 结构中嵌套得越深,知道这些区别就越重要。最初的数据结构可能是一个列表,但在提取数据时会变成一个字典。从 JSON 对象中提取数据的关键是识别用于存储数据的混合数据结构。如果您努力识别 JSON 对象中的数据结构,很可能您会努力提取您想要的值。在大多数情况下,这会导致应用错误的提取技术。****
下表简要回顾了用于从 JSON 结构中提取数据的技术。
数据类型和提取方法,按作者分类的图像
在开始我们的例子之前,最后一点需要注意。在 Python 编程中,术语“数据结构”在描述列表和字典时很少使用。常用的术语是“数据类型”。在本教程中,我会交替使用数据类型和数据结构这两个术语。我使用术语数据结构,因为它传达了数据结构是 JSON 对象的基本构建块的思想。在 Python 中,术语“数据类型”的使用同样重要,但是它与理解嵌套数据提取的关键意义不同。
真实世界数据
我们开始吧
最好的学习方法之一是通过混合使用列表和字典数据结构来处理真实数据。在本教程中,我们将使用来自 REST 国家 API 的真实数据。这个 API 返回大约 250 条记录,混合了字典、列表和其他数据类型。我们的目标是从字典键值对'code':'AFN'
中提取'AFN’
值,如下图所示。'AFN'
嵌套在两个列表结构和一个字典结构中。
其他国家 API 数据,按作者分类的图片
示例代码
单击此链接将允许您访问以下示例中的示例代码。该链接将带您进入我开发的关于学习提取嵌套 JSON 数据的课程。这门课程已经帮助数百名学生学会了提取嵌套数据。您不必购买课程来获取文件。文件名是 single_json.py 和 multiple_json.py。
提取单个项目
在本例中,我们将从使用列表和字典提取技术的组合来提取数据开始,如上表所示。在下面的 Python 代码中,我首先提供了用于导入数据的逻辑、用于导出解决方案的解决方案以及用于导出解决方案的工作流。我建议遵循如下所示的所有步骤。Python 代码下面解释了工作流步骤。
Python 代码:
工作流程步骤:
**Step 1: import requests**
:这一行为 Python 导入请求 HTTP 库。它是我们用来连接 Restful API 的库。如果您还没有安装它,您可以使用 pip 安装请求命令从命令提示符或虚拟环境安装它。**Step 2:** **url = 'https://restcountries.eu/rest/v2/all'**
这一行存储了 REST API 的网址。地址存储在url
变量中。**Step 3: response = requests.get(url)**
: 该方法用于连接 Restful APIhttps://restcountries.eu/rest/v2/all,提取数据。返回的数据存储在response
变量中。在技术术语中,这被称为响应对象。**Step 4: storage = response.json()**
返回结果的一个 JSON 对象(如果结果是用 JSON 格式写的,如果不是就抛出一个错误)。把.json()
想象成一种用来交换数据的存储格式。在这个实例中,我们将内容存储在**storage**
变量中。**Step 5: print(type(storage))**
: 返回用于存储数据的 Python 数据类型。在这种情况下,返回的数据类型将是一个列表(<class 'list'>
)。回头看看我之前提供的表格,可以使用 list index [0,…]提取数据。您应该始终使用type()
函数来确定数据类型。如果您知道数据类型,您就知道要使用的正确提取技术。**Step 6: print(len(storage))**
: 提供列表中的项目数。每个数字代表列表中某项的索引,该索引可用于提取值。**Step 7: print(storage[0])**
:0 代表列表中的第一项,用于从列表中提取该项。一旦项目被提取出来,一个新的数据类型就暴露出来了。步骤 8 中的type()
函数用于显示数据类型。**Step 8: print(type(storage[0]))**
: 新的数据类型将是<class 'dict’>
。字典意味着可以使用一个键提取数据。在我们的数据中,用于提取值的键是currencies
。在步骤 9 中使用currencies
键。取注,数据类型从第 5 步的<class 'list'>
变为第 8 步的<class 'dict'>
。**Step 9: storage[0]['currencies']**
: 字典中的currencies
键用于输出[{code:'AFN,'name':'Afgahn afghani','symbol':''}]
。一旦项目被提取,一个新的数据类型现在被暴露。步骤 10 中的type()
函数用于显示数据类型。**Step 10: print(type(storage[0]['currencies']))**
: 新的数据类型将是<class 'list'
。列表数据类型意味着我们使用索引操作符[]
来提取下一组值。在这种情况下,索引值将为 0。所以我们在步骤 11 中使用它。注意,数据类型从步骤 8 中的<class 'dict'>
变为步骤 10 中的<class 'list'>
。**Step 11: print(storage[0]['currencies'][0])**
:指标[0]
用于输出{code:'AFN,'name':'Afgahn afghani','symbol':''}
。一旦项目被提取,一个新的数据类型现在被暴露。步骤 12 中的type()
函数用于显示数据类型。******Step 12: print(type(storage[0]['currencies'][0]))**
:新的数据类型为<class 'dict'>
。字典意味着数据可以用一个键提取。在我们的数据中,用于提取值的键是code
。在步骤 13 中使用code
键**Step 13: print(type(storage[0]['currencies'][0]['code']))**
:code
键用于输出AFN
,这是我们希望输出的值。
所以,让我们总结一下两个步骤,重复这两个步骤直到我们得到我们想要提取的值。第一步是确定数据类型,而第二步是应用提取方法。如果数据类型是 list,那么使用带方括号的索引操作符。但是,如果数据类型是字典,请使用带花括号的字典键。
提取多个项目
虽然从 JSON 结构中提取单个列表项是重要的第一步,但只提取单个值并不常见。在真实世界的数据中,JSON 对象中的值存储为集合。在下图中,currencies
和code
字典键和值在列表数据结构中有多个条目。我们在现实世界中的例子有 250 个这样的条目,所以我们在本节教程中的目标是提取这些和剩余的值。
其他国家 API 数据,按作者分类的图片
幸运的是,我们可以通过构建用于从 JSON 结构中提取单个值的工作流步骤来提取这些值。我就不再列举那些步骤了。由于列表和字典数据结构是可迭代的,我们可以使用一个for loop
结构来遍历我们的值。所以,让我们在第 14 步把它添加到我们的代码中。我们还需要使用range
和len
函数来枚举列表中的条目数。Python 代码下面解释了工作流步骤。
Python 代码:
工作流程步骤:
**Step 14:** for item in range(len(storage)):``storage
变量包含步骤 4 中返回的列表<class 'list'>
。len
功能用于统计列表中的项目数。range
函数根据列表中项目的数量生成一个数字序列。每当for loop
遍历storage
列表时,该数字被传递给item
变量。在第 48 行,步骤 14 中显示的**print(storage[item]['currencies'][0]['code'])**
来自步骤 13。我们将它封装在for loop
结构中,并将代码从storage[0]
修改为storage[item]
。storage[0]
引用列表中的单个项目。然而,storage[item]
在storage
列表中捕获多个项目。每次for loop
迭代时,storage[item]
递增以捕获下一组值。
结论
挖掘嵌套数据的过程有时会让人感到畏惧、迂回和恼怒。它不太适合介绍性的技术,比如彻底迭代dict.items(), dict.keys(), dict.values() or list indexes[]
。不可避免的是,JSON 结构的复杂性要求在多个字典和列表提取技术之间交替使用来提取数据。掌握它需要一个可重复的过程,但更重要的是实践。我已经包括了几个附加的练习题和解答(点击这里)。
当你不练习的时候,有人在进步——阿伦·艾弗森
祝你好运。
如何快速完成我的数据科学项目?
原文:https://towardsdatascience.com/how-do-i-finish-my-data-science-projects-quickly-c5890233ff17?source=collection_archive---------19-----------------------
数据科学家不为人知的秘密
照片由 活动创作者 于 Unsplash
如今,机器学习模型开发甚至已经到了非数据科学家的手中。你只需要知道解决问题的正确方法。这不是一个大秘密,这只是一个意识到机器学习的高级发展和理解有助于更快更好开发的可用框架的问题。在本文中,我将首先描述数据科学家在过去许多年中遵循的传统方法,然后讨论数据科学家在当今遵循的现代方法。
传统方法
这些年来,当接受一个数据科学项目时,数据科学家会首先从探索数据集开始。他会清理数据,估算缺失值,查看列值的方差,搜索相关性,进行特征工程,等等。他将执行“n”个任务来创建一个数据集,用于训练他的机器学习算法或将其输入他设计的神经网络。这个清单是无止境的,耗时的,而且大部分是费力的。
在他为学习设置数据集之后,他的下一个任务将是尝试他根据自己的知识和经验选择的机器学习算法。在训练模型之后,他可能会发现他选择的算法只给出了 60%的准确度,这肯定是不可接受的。因此,他可能会回到数据预处理、特征工程、降维等方面来提高模型的准确性。他可能会摆弄超参数来检查性能改进。如果所有这些都不奏效,他将采用另一种算法。这个过程一直持续,直到他为他的数据集找到具有微调超参数的最佳执行算法。在这个阶段,他会称他的模型为准备部署。
现代方法
到目前为止,我所描述的过程,你很容易理解,是非常费力和耗时的。不仅如此,你还需要精通统计学、EDA(探索性数据分析)、机器学习算法、用于评估算法性能的指标等等。
如果有人能自动化这整个过程,那不是很好吗?听起来很难,但是是的,这种工具在行业中已经存在很长时间了。你需要学习如何在你的项目中使用它们。我们称之为 AutoML。我将向您快速介绍这类工具。作为参考,我将讨论基于广泛使用的 sklearn ML 库的工具。Auto-sklearn 就是这样一个工具,它采用了经典的 ML 方法,并自动模仿了 ANN 的方法。有几个其他的商业和免费使用的工具包可用。我将在最后提到几个,这样你可以选择一个适合你的目的。
经典 ML 方法
有了 auto-sklearn,你只需要知道你的任务——回归或者分类。首先,我将讨论分类的汽车模型开发。
分类任务
在 auto-sklearn 中,只需两行代码就可以在数据集上获得性能最佳的模型。对于分类任务,您可以使用如下代码:
model = AutoSklearnClassifier(time_left_for_this_task=4*60,
per_run_time_limit=30, n_jobs=-1)model.fit(X_train, y_train)```
AutoSklearnClassifier 变魔术了。它需要几个参数来控制执行时间。找到最合适的模型需要很长时间,有时甚至需要几个小时,因此这种时间控制是必不可少的。 fit 命令运行很长时间,最后,它会给出适合数据集的最佳模型。一旦这样做了,你就可以直接用它来推断:
predictions = model.predict(X_test)
如果好奇想知道幕后发生了什么,可以打印一些统计数据。
print(model.sprint_statistics())
我在 Kaggle 数据集上的一次测试产生了以下统计数据:
auto-sklearn results:
Dataset name: 1e3ad955125d649ab6cd828885a8d3fb
Metric: accuracy
Best validation score: 0.986602
Number of target algorithm runs: 24
Number of successful target algorithm runs: 15
Number of crashed target algorithm runs: 0
Number of target algorithms that exceeded the time limit: 9
Number of target algorithms that exceeded the memory limit: 0Accuracy: 0.993
你可以看到它尝试了 24 种算法——我没有耐心这样做。这个模型给了我 99%的准确率——你还能要求什么?如果我有进一步的好奇心想知道最后一个模型由什么组成,我可以要求它向我展示最终的模型配置:
model_auto.show_models()
这是我在测试运行中得到的输出。这只是部分输出,显示了在集合中使用的一个分类器( extra_trees )。
‘[(0.340000, SimpleClassificationPipeline({‘balancing:strategy’: ‘none’, ‘classifier:__choice__’: ‘extra_trees’, ‘data_preprocessing:categorical_transformer:categorical_encoding:__choice__’: ‘one_hot_encoding’, ‘data_preprocessing:categorical_transformer:category_coalescence:__choice__’: ‘no_coalescense’, ‘data_preprocessing:numerical_transformer:imputation:strategy’: ‘median’, ‘data_preprocessing:numerical_transformer:rescaling:__choice__’: ‘minmax’, ‘feature_preprocessor:__choice__’: ‘no_preprocessing’, ‘classifier:extra_trees:bootstrap’: ‘True’, ‘classifier:extra_trees:criterion’: ‘gini’, ‘classifier:extra_trees:max_depth’: ‘None’, ‘classifier:extra_trees:max_features’: 0.5033866291997137, ‘classifier:extra_trees:max_leaf_nodes’: ‘None’, ‘classifier:extra_trees:min_impurity_decrease’: 0.0, ‘classifier:extra_trees:min_samples_leaf’: 2, ‘classifier:extra_trees:min_samples_split’: 14, ‘classifier:extra_trees:min_weight_fraction_leaf’: 0.0},\ndataset_properties={\n ‘task’: 1,\n ‘sparse…’
大多数时候,我甚至都懒得看这些细节。只要模型在测试数据上给出了很好的准确性(在上面的例子中非常好),我就将它部署在生产服务器上。
只是为了与手动建模方式进行比较,我在同一个数据集上尝试了 SVC 分类器。这是比较结果:
作者图片
现在,告诉我为什么我要尝试手动方式?
甚至对于回归任务也采用类似的方法。
回归任务
对于回归,使用这三行代码:
model_auto_reg = AutoSklearnRegressor(time_left_for_this_task=4*60, per_run_time_limit=30, n_jobs=-1)model_auto_reg.fit(X_train_scaled,label_train)
print(model_auto_reg.sprint_statistics())
最后一行只是打印统计数据,这是我在 UCI 数据集上运行测试的结果。
auto-sklearn results:
Dataset name: 17f763731cd1a8b8a6021d5cd0369d8f
Metric: r2
Best validation score: 0.911255
Number of target algorithm runs: 19
Number of successful target algorithm runs: 6
Number of crashed target algorithm runs: 0
Number of target algorithms that exceeded the time limit: 11 Number of target algorithms that exceeded the memory limit: 2
再一次,你看,它尝试了 19 种算法——对一个人来说,这是很大的耐心。我甚至尝试了 sklearn 中的 LinearRegression 实现,将上面的模型与人工努力进行比较。这是我的两次测试运行的误差指标:
作者图片
出于进一步的好奇,您可以检查通过调用上面讨论的用于分类任务的 show_models 方法开发的模型。
作为对开发模型的进一步检查,我绘制了这两种方法的回归线,如下图所示:
作者图片
自动 sklearn 功能
在内部,auto-sklearn 不仅仅是对算法进行彻底的搜索。我们可以在他们网站上给出的架构图中很快观察到这一点。
图片来源:高效健壮的自动化机器学习
如您所见,除了算法选择,它还提供超参数调整。它集成了最高性能的算法。它使用元学习和贝叶斯优化来创建一个高效的管道。它还允许您检查模型细节。你可以控制整个过程。想象一下自己一个人做这些事情。
我发现唯一缺少的是,它没有给我一个基于所选模型的 ipynb 文件,以便我可以对我的数据管道、系综和超参数做进一步的调整。
现在,安汽车开发公司来了。
安/DNN 方法
随着人工神经网络/DNN 在解决使用经典 ML 无法解决的问题方面取得辉煌成功,数据科学家正在探索,或者更确切地说,使用它来完成他们的 ML 任务。一些数据科学家设计他们自己的人工神经网络架构和/或使用预先训练的模型来实现他们的业务目标。设计和使用人工神经网络架构需要除了统计学家以外的其他技能。我们要求你适应 ML 工程师的工作,并具备优化和数学知识。幸运的是,你有自动化的工具来完成这种任务。
像 auto-sklearn 一样, AutoKeras 有助于回归和分类任务的网络设计。不仅如此,它还处理结构化的图像和文本数据。
同样,使用这个库相当简单。对于结构化数据的分类,代码如下所示:
search = StructuredDataClassifier(max_trials=10,num_classes=3)
search.fit(x=X_train_s, y=y_train, verbose=0, epochs=5)
对于图像数据,它将类似于以下内容:
clf = ak.ImageClassifier(num_classes=10, overwrite=True, max_trials=1)
对于回归任务,由于需要回调,代码会更复杂一些。如下所示:
from tensorflow.keras.callbacks import ReduceLROnPlateau
lr_reduction = ReduceLROnPlateau(monitor=’mean_squared_error’, patience=1, verbose=1, factor=0.5, min_lr=0.000001)regressor = StructuredDataRegressor(max_trials=3,loss=’mean_absolute_error’)regressor.fit(x=X_train_scaled, y=label_train,
callbacks=[lr_reduction],verbose=0, epochs=200)
在库创建网络模型后,您可以评估其在测试数据上的性能、获取其评估分数、查找错误度量、使用它来预测未知数据,等等。我不会在这里讨论所有这些细节。相反,我将向您展示由该库创建的网络模型。您使用一个内置函数来导出模型。我在 UCI数据集上进行分类测试时,创建的模型如下:
作者图片
这是同样的网络图:
这不是很棒吗?作为一名数据科学家,你甚至不需要学习 ML 工程师的技能。虽然我使用了上面的两个工具来演示 AutoML 功能,但是市场上还有几个可用的工具,可能有更多的功能。
几个框架
仅举几个框架——你有 H2O.ai、TPOT、MLBox、PyCaret、DataRobot、DataBricks,还有最*宣布的 BlobCity AutoAI。这份清单并非详尽无遗。我只是把它限制在我评估过的几个范围内。其中一些提供付费服务,其他的免费使用,开源。一些支持 R。特别是,H2O 支持 R、Python、Java 和 Scala——所以你在编码方面有更广泛的选择。其中一些有很好的 GUI,所以不需要命令行编码。一些在云上运行。您可能希望为自己的目的选择一个合适的 AutoML 框架。
我在这里肯定会提到的一件事是,新诞生的汽车社区 AutoAI 为我生成了代码,这是迄今为止我所见过的汽车领域中没有人能做到的。它生成一个 ipynb 文件以及一个详细的文档。在其他库中,这就像使用黑盒模型一样。这个特性对我来说是一个很大的好处,因为我所有的客户都要求在接受交付之前提交源代码。
该公司还声称,他们在经典 ML 和 ANN 之间进行自动选择。这对所有数据科学家来说都是一个很大的帮助,因为他们总是面临在经典和人工神经网络之间选择的困境。他们还声称在回归和分类之间进行自动选择,其他工具也是这样做的,因此,这对我来说没什么大不了的。
我必须在这里说,到目前为止,我还没有完全核实他们的说法。这是一个开源项目,给了我一个验证这种说法的机会。都说了,我就不直接跳进去了。该项目是新推出的,正在开发中,很可能有很多错误,除非他们已经深入测试过。他们正在谈论的功能,如果他们坚持下去,这将是数据科学家和整个数据科学领域的一大福音。
结论性建议
我分享了我最*处理数据科学项目的方法。我使用自动化工具。我不想说是哪一个——有时不止一个。提到这些名字可能看起来像是一种认可,所以我在避免。也就是说,作为一名数据科学家,使用 AutoML 工具将会节省您大量的精力。有一点需要提醒的是——目前为止我测试过、使用过的所有工具都有一个或多个 bug——我在他们的 GitHubs 上看到了这些问题。我建议,如果你发现一个问题是可重复的,一定要提交给他们。这样的工具会让我们的生活变得更容易,但不会让我们(数据科学家)灭绝。
一些有用的链接
- 自动 sklearn
- AutoKeras
- H2O.ai
- TPOT
- MLBox
- PyCaret
- 数据机器人
- 数据块
- Blobcity AutoAI
- 高效、稳健的自动化机器学习
信用
Pooja Gramopadhye—文字编辑
乔治·萨维德拉—项目开发
https://medium.com/@profsarang/membership
机器是如何规划的?—介绍
原文:https://towardsdatascience.com/how-do-machines-plan-an-overview-a96a1aaa6dfa?source=collection_archive---------17-----------------------
思想和理论
图搜索算法和马尔可夫决策过程的简明介绍
规划未来的能力似乎是智力的关键特征之一。步行、骑自行车、做运动或开车等身体动作需要极大的协调性,而最佳的可能动作高度依赖于外部环境(如果你的路上有石头、障碍或对手,你必须适应并改变你的策略)。此外,我们每天做的大多数事情——通勤、购物、烹饪、学习、工作等等。—包括短期和长期规划。像国际象棋和围棋这样的战略游戏也是超前思维发挥重要作用的著名例子。
早在 20 世纪 50 年代,人们就已经提出用数学方法来描述规划的过程。现在这些方法的变体随处可见,从机器人运动规划到在谷歌地图上寻找最佳路线。在本文中,我们将研究一些关键的公式和规划算法,为以后关于规划和强化学习(RL)的文章奠定基础。
状态、行动和奖励(成本)
在导航设置中,想象一个典型的规划问题是什么样子是最容易的。想象你在一个迷宫里。你在某个位置(x,y ),你可以向四个方向移动——上、下、左、右——只要你不碰到墙。如果你达到目标,你成功地终止。
网格迷宫中的机器人(图片由作者提供)
我们用状态来描述我们所处的现状。如果你在 location (x,y),x 和 y 可以认为是在对你所处的状态进行编码,因为只要你知道 x 和 y,假设迷宫环境不发生变化,我们就能把自己放在正确的位置,重构当前的情境。通常,我们认为状态是一组足以概括我们可能遇到的特定情况的细节,并且可以用来区分一种独特的情况。
如果你想到一个更现实的机器人,你可以用一组数字概括它的配置——它的姿势(位置和角度)和它的许多关节的所有角度,这些可以被认为是状态。
一旦我们对状态的定义感到满意,我们就可以考虑在不同的状态之间移动,以达到我们想要的状态。对于上面的例子,这将到达宝箱的位置。我们可以通过采取动作在状态之间移动。在上述情况下,机器人可以采取的行动仅限于上下左右移动。但这并不限制我们思考更复杂的动作,比如迈出更大的步伐或跳过树篱,尽管我们现在不会考虑它们。
规划问题的最后一个要素是“成本”或“回报”的概念。在最短路径搜索或机器人学中,更典型的是考虑每一步的成本,并试图使路径上的总成本最小化。在游戏或环境中的计划背景下,你可以潜在地提高你的分数、能量水*、净值等。,更常见的是考虑奖励并试图最大化你能获得的总奖励。
作为搜索问题的规划
早期的规划工作集中在有限状态的问题上,每一个动作都导致状态间的确定性转换。换句话说,每当你采取一个行动时,你都可以确信你接下来会进入哪个状态。这和我们刚刚看到的网格迷宫问题一模一样。
因为我们想要评估到达目标的最短路径,所以我们将每次移动的成本指定为 1,并尝试在到达目标之前最小化总成本。现在,我们可以将网格迷宫问题转化为状态转换的最短路径问题,如下图左侧所示。可以将我们从初始状态带到目标状态的最短路径也将最小化总转换成本。
评估最短路径的图表(图片由作者提供)
在更一般的情况下,我们可以解决任何给定的连接网络的最短路径问题(例如,通过右边的路径连接的房子)。这种网络在数学上被称为“图”。节点(蓝色)代表状态,边(棕色)代表状态之间的转换。Dijkstra 和 A等图搜索算法可以找到图上最短路径问题的最优解。Dijkstra 的算法带有最少的假设,而如果你粗略地猜测(启发式的)扩展节点的优先级,A在搜索中会更有效。
鉴于本文篇幅有限,我将转到更一般的规划公式,即马尔可夫决策过程。然而,图搜索算法对于解决复杂的现实世界问题非常重要,例如机器人和最短路径搜索。如果你想了解更多关于 Dijkstra 的算法和 A*的知识,我推荐这篇有着惊人交互图形的文章。
https://www.redblobgames.com/pathfinding/a-star/introduction.html
如何描述一个更一般的规划问题
当有限数量的状态之间存在确定性转换时,图搜索算法非常有用。然而,如果在转换中有一些不确定性,或者如果有无限多的状态和转换可以进行呢?
让我们来看一个稍微复杂一点的规划例子——象棋。在这种情况下,国家和行动会是什么样子?
由于每个国家都应该捕捉当前局势的独特细节,一个合理的选择可能是对棋盘上每个棋子的位置进行编码({ '黑国王':G8,'黑王后':D8,…,'白国王':G1,'白王后':D1……})。编码的确切方式并不太重要,只要它们与棋盘状态有一对一的映射,事实上,许多国际象棋游戏引擎已经提出了不同的棋盘状态编码方式。
象棋游戏的状态、动作和过渡(图片由作者提供,来自维基百科的棋子)
国际象棋中有更多可能的动作(从一种状态移动到另一种状态可以做的事情)。*均来说,每回合你可以走 30 步左右,因为你可以选择走哪一步,每一步都有一系列的走法。假设我们选择了主教。在这种情况下,我们可以采取的措施以绿色突出显示。一旦我们选择了一个动作,我们就进入了下一个棋盘状态,如右图所示。
有趣的是,因为国际象棋是一个双人游戏,我们不能仅仅通过选择我们的行动来完全确定下一个游戏状态。对手也开始行动了,所以虽然我们对下一个可能的状态有所了解,但是下一个可能的状态还存在一些不确定性。
和大多数游戏一样,国际象棋中也有更令人向往的游戏状态。最明显的是当你拿了对手的国王并且你赢了的时候。不太明显的是那些你还没有赢,但已经非常接*赢的。
最后,让我们想象一个更真实的问题,驾驶通过一些障碍课程。正如我们已经讨论过的,汽车的状态可以通过它的姿态(位置和角度)以及车轮速度、加速度、转向角、剩余燃油量等来总结。使汽车从一种状态进入另一种状态的动作可能是你加速、刹车、转向和加油的程度。
一般来说,驾驶或机器人技术的难点在于,与网格迷宫或象棋不同,状态和动作通常是连续的。如果你在开车,你不只是向左或向右打方向盘;你可以加速、刹车或*稳地转动方向盘,由此产生的汽车及其车轮的位置、速度、加速度和角度都取连续值。这使得在这种状态空间中进行规划成为一个很难解决的问题。
与国际象棋类似,驾驶是一个多智能体规划问题,这意味着你必须与街上同样驾驶、骑自行车或步行的其他人协调。由于我们还没有心灵感应,我们不得不在不完全了解他人可能会做出什么决定的情况下做出决定。还有一些我们并不完全了解的环境状态,比如下一个红绿灯什么时候改变,下一个十字路口是否堵车,或者如果我们在隧道里没有 GPS 信号,我们现在到底在哪里。
在现实世界中,有更多难以解决的规划问题。如果你在一次公路旅行中,你的目标是尽可能多地游览风景名胜,那该怎么办?在这种情况下,没有一个明显的目标可以达到。如果你想让你的人工智能学习股票投资的最佳策略,并不断将你的收益进行再投资,该怎么办?如果这个任务没有一个明确的结束,你会在什么时候评估人工智能的性能?
规划问题的范围
在我们可能有兴趣解决的规划问题中,我们已经看到了许多相似之处和不同之处。我们在一些例子中做了更多的假设,添加或删除假设会使问题看起来完全不同,不同的问题会产生不同的解决方案。
共性:
- 目的是找到一个好的策略,让我们能够决定在给定的情况下(在给定的状态下)采取什么行动
- 在不同的情况和状态之间存在某种映射
- 动作可以影响从一种状态到另一种状态的转换
- 在每一次转变过程中,都会有某种回报或代价
- 有一个处于某种状态的可取性(价值)的概念
根据问题不同的假设:
- 有时候,在你采取行动后,你最终会处于哪种状态是不确定的,要么是因为状态转换是嘈杂的/概率性的,要么是因为还有其他人也在做出决策。有专门为双人游戏开发的算法,比如 minimax 和 alpha-beta 剪枝。在更一般的情况下,我们可以将概率状态转移建模为马尔可夫决策过程(MDP ),这将在下面讨论。涉及其他代理的问题被称为多代理问题,并且可以基于代理是合作还是竞争以及它们是否被允许相互通信来进行额外的考虑。
- 有时候,你每一次转型能得到的回报也可以是概率性的。
- 在许多情况下,环境的状态转换和回报动态是未知的,直到你尝试一些事情,看看会发生什么,所以没有一些尝试和错误,很难提前计划事情。这是强化学习的主要假设,这种困境被称为“开发 vs 探索”。
- 有时,状态和/或行动可以是连续的,这意味着离散的规划算法,如 Dijkstra 和 A*将不再工作。在机器人学中,一种常见的方法是对状态空间进行离散化或采样,产生一个粗略的最短轨迹估计,然后应用控制理论找到一个合适的连续控制输入,使轨迹估计和机器人实际轨迹之间的误差最小。然而,随着深度学习的成功,使用神经网络对连续函数进行建模已经成为可能,开辟了在连续空间中直接规划的一系列可能性。
- 有时候,我们所处的状态是无法精确衡量的。在机器人学中,传感器输入范围有限,最常见的问题是定位,即知道机器人此刻的确切位置。卡尔曼滤波器是在给定一些噪声测量和观察的情况下用于估计状态的技术之一。 SLAM(同步定位和绘图)是一个完整的领域,致力于根据摄像机输入估计机器人的当前位置。更一般地说,真实的状态是未知的,因为我们无法直接观察状态(比如我们是否患有癌症,或者宇宙中每个粒子的确切位置和速度),所以我们必须根据有限的观察值来估计它们。强化学习中的一个相关领域叫做 POMDP(部分可观察马尔可夫决策过程)。
这就是引入一个考虑到这些不确定性的更一般的规划范例——马尔可夫决策过程的动机。
马尔可夫决策过程(MDP)
让我们想一个一般的规划问题。无论是机器人、象棋还是驾驶,总有一个决策实体通过采取行动来改变局面。我们称决策实体为代理,外部的一切为环境。通常,如果我们是下棋、在房间里走动或开车的人,我们人类就是代理人。当我们用算法解决这些问题时,计算机算法本身就成了代理。代理可以在环境中采取行动以达到新的状态。环境为代理提供关于当前状态的知识,以及代理发起的每个状态转换的回报。
状态 s s ∈ S (我们将可能状态的集合表示为 S ,每个状态表示为 s ),如前所述,是特定情况的唯一编码。当前状态可以直接测量或观察(如棋盘状态完全已知的国际象棋,或关节配置完全已知的机器人手臂),或者必须从环境提供的观察中推断(如驾驶,其中驾驶员必须推断汽车的当前位置和速度,或机器人不完全本地化)。
代理可以通过采取动作A∈A(s)来启动从一个状态到另一个状态的转换(可用的动作可以取决于您所处的状态,因此动作集可以是状态 s 的函数)。这将触发环境的变化,环境将向代理更新对新状态的观察,以及奖励 r 。奖励可以是正面的,比如你在国际象棋中走了一步棋,赢了对方,或者正确预测了股票的上涨,但也可以是负面的,比如输掉了比赛,耗尽了燃料,或者撞上了障碍物。奖励通常是当前状态 s 、代理 a 采取的动作以及新状态s’的函数,并被写成 R ( s 、 a 、s’)。
最后,我们还可以定义一个从当前状态 s 到新状态s’的转移概率,基于某个动作 a 为P(s’|s, a )。这是一个条件概率,因为我们想知道我们将最终处于哪个状态,假设我们处于状态 s 并且已经采取了动作 a 。
让我们用一个假设的场景来说明这一点,在这个场景中,我们想决定是骑着扫帚去上学好,还是通过心灵传输去上学好。(注意:我最初想找一个更日常的例子,但是很难找到既可信又容易检验的概率,所以让我们用一个假设的例子。)
假设运输系统的简单马尔可夫决策过程(图片由作者提供)
如图所示,你的起始状态 s 是“家”,有三种结果——学校、医院和被绑架。如果你传送,它会更快,所以去学校的回报会更高,但它也更有风险,所以你更有可能因严重受伤而住院。另一方面,乘扫帚旅行速度较慢,而且更加暴露,所以你有可能被外星人绑架。
让我们来决定我们是应该采取“扫帚旅行”还是“瞬间移动”的行动。我们可以计算出每个行动的期望回报(概率的*均回报)(σP(s’|s,a)R(s, a ,s’))
a= “扫帚”:0.8 * 1+0.1 *(10)+0.1 *(100)=-10.2
a= 《瞬移》:0.7 * 5+0.25 *(15)+0.05 *(100)=-5.25
因此,在这个简单的例子中,我们发现心灵运输给了我们最大的预期回报。
最大化总预期回报
虽然上面的例子只有一个带有即时奖励的单步转换,但在典型的计划问题中,如国际象棋,你需要提前计划,并根据你对未来奖励的估计采取战略性的行动,而不仅仅是即时奖励。更具体地说,我们应该最大化我们未来期望的回报总和。未来回报的总和被称为回报 G ,我们的目标是找到一个使其最大化的策略。
回报的定义
回到我们的网格迷宫示例,起点的回报将是来回移动的所有成本和达到目标的最终奖励的总和。假设机器人走了 6 步到达宝箱,每走一步获得-1 的奖励,但到达宝箱时获得 10 的奖励。在这种情况下,返回是(-1) * 6 + 10 = 4。
注意,在回报的定义中,有一个贴现因子γ。有些规划问题是没有明确的终点的,所以奖励一直无限累积下去。为了防止回报变得无穷大,我们通过乘以γ < 1 来贴现未来回报(类似于γ≈0.99)。
思想
我希望这有助于获得一些关于规划问题如何数学描述的直觉,以及如何用 MDP 规划的公式比图搜索更复杂,但这也允许我们对更一般的规划问题建模。
通常,状态、动作和奖励的概念是作为 MDP 公式的一部分引入的,用于强化学习。然而,在这篇文章中,我想更普遍地介绍状态、行动和奖励(成本)的概念,因为这些概念并不是 RL 或 MDPs 所独有的,也出现在机器人学、控制理论和概率论中,它们都有着悠久的历史和大量伟大的工作。一旦我们开始看到这些关系,我们就开始看到,例如,Dijkstra 算法中的累积成本和强化学习中的值在某些假设下是相同的,只是以不同的方式表述。
在以后的文章中,我们将更深入地研究强化学习,研究不同的方法来得出一个好的策略,并讨论它们背后的直觉。
相关文章
参考
- 理查德·萨顿和安德鲁·巴尔托。强化学习:导论,第二版 (2018),麻省理工学院出版社
- 史蒂文·拉瓦勒。规划算法 (2006),剑桥大学出版社
当社交距离成为规则时,人们如何移动?
原文:https://towardsdatascience.com/how-do-people-move-when-social-distancing-becomes-the-rule-64af52857640?source=collection_archive---------9-----------------------
实践教程
揭示就地安置要求对早期进入新冠肺炎疫情的德国和瑞典居民流动行为的影响
由丁满·斯图德勒在 Unsplash 上拍摄的照片
许多国家强制执行就地安置要求,以遏制新冠肺炎在本国领土上的传播。这些非药物干预(NPI)已经以政策研究人员急于破解的方式影响了人们的流动习惯。其目的不仅是为了更好地应对新的疫情疫情,也是为了及时发现那些尚未度过最糟糕时期的国家的经验教训。Bryant & Elofsson(2020 年)声称,不同国家的人们会以不同的方式改变他们的流动模式,以应对类似的 NPI,受此启发,我决定通过以下问题进行探索性分析来加入这场辩论:
随着时间的推移,德国和瑞典的公民如何减少个人流动性以应对各自政府颁布的就地安置要求?
德国和瑞典的比较预示着有趣的发现。两国在疫情早期采取了看似相反的策略来控制病毒。瑞典一再禁止这一消息,称其“轻锁”战略非常信任其居民的自愿自我监督。另一方面,德国很早就采取了严厉的政府干预措施,并被誉为榜样反应。
设置
我转向可公开访问的 OxCOVID19 数据库(Mahdi 等人,2020 年)来查询这两个国家的流动性和政策数据。OxCOVID19 数据库是一个大型的多模型存储库,收集了大量国家的流行病学、政府应对措施、流动性和社会人口数据。所有可用的数据都是作为 OxCOVID19 项目的一部分进行整理的,该项目旨在增进我们对疫情的了解,并促进基于统计分析的缓解策略的发展。我将 2020 年 2 月下旬至 11 月下旬的数据考虑在内,以探索两国疫情早期阶段的政策执行动态以及公共流动性的变化。
我的分析利用了 OxCOVID19 数据库中的两个表。就地安置政策颁布数据来源于政府反应 表整理关于颁布的遏制政策的国家级顺序数据。在任何给定时间点执行政策的严格程度跨越三个层面。值为 0 表示给定的策略当前不活动,而值为 1 表示策略符合性是推荐的。最后,值 2 意味着必须遵守。我从移动性表中检索谷歌移动性趋势数据,捕捉不同位置类别(例如工作场所、公交车站、公园)相对于前疫情基线值的每日移动性偏差百分比。我将流动性数据汇总到国家一级,以便进行跨国比较,并匹配可用政策数据的粒度,以便进行后续关联。我进一步将移动性数据重新采样到周箱中,以消除周末、银行假日和分析未明确控制的其他环境因素(如天气)的影响。
描述性分析
用一些描述性的统计数据来开始它从来都不是一个坏主意。表 1 记录了两个国家在时间跨度范围内的就地安置严格程度的百分比分布。有几件事很突出。
表 1 。德国和瑞典就地安置严格水*的覆盖范围。
德国在 66%的时间里暂停了就地安置令,而瑞典在 86%的时间里发布了就地安置建议。然而,瑞典从未将该建议转化为要求,而德国在 20%的时间里实施了最严格的政策水*,几乎跨越了政策发布时间框架的三分之二。
接下来,我绘制了随着时间的推移,德国和瑞典公民按地区分类的流动性变化百分比。我进一步用竖条覆盖每个时间序列图,竖条的宽度和颜色对应于两国政府实施就地安置政策的持续时间和严格程度。
图一。个人流动性的变化与颁布的就地安置要求之间的关系
相对于瑞典,德国将更大的流动自由时期限制在更短、更紧缩的政策实施时期内,自 3 月中旬政策出台以来,瑞典仅仅建议就地避难就成为了新常态。这种视觉叙事与学术界和媒体强调存在两种截然不同的病毒遏制路线图的声音不谋而合。瑞典采取了一种独特的政策组合,温和的命令与公众呼吁自我监管相结合,而不限制个人自由,因为社会不喜欢明确的政府遥控。相比之下,德国主张早期、严格的干预,然后通过较软的措施在感染曲线周围安全地跳舞(Jung et al .,p.363,2020)。
无论严格程度如何,只要有就地安置要求,这两个国家的地点类别的流动性百分比都比疫情前参考值显著下降。每个图旁边的汇总统计数据突出显示,当就地安置政策是积极的而不是取消时,*均流动性变化显著下降。用相对值表示,只要实施就地安置政策,这两个国家在不同地点类别的流动性都会出现两位数和三位数的下降。
显著性检定
好的,我们可以说,到目前为止,德国和瑞典的流动模式在时间范围上有所不同。但是,我们能确信隐现的差异不仅仅是由于偶然吗?为了解决这个问题,我继续计算 95%的置信区间。这是为了评估德国和瑞典居民之间个人流动性的*均变化是否有显著差异。用外行的话来说,95%的置信区间告诉我们,我们有 95%的信心,两国之间*均流动性的真正差异位于区间下限和上限之间的某个位置,我将为 4 个位置类别中的每一个计算区间。现在假设给定置信区间的界限不包括 0。在这种情况下,我们可以确信,与瑞典居民相比,德国居民流动性的相对下降实际上更高(即,如果两个区间边界都是负的)或更低(即,如果两个区间边界都是正的)。表 2 报告了范围内 4 个位置类别的置信区间。
表 2 。高于零的严格性水*的迁移率类别的*均差异。
德国引入了家庭避难所的建议和要求,在所有类别中,德国的*均相对流动性下降幅度都比瑞典大。“高客流量”地点类别零售&娱乐 (-29.1%)和中转站 (-11.3%)的差异尤为明显。相反,在类别工作场所 (-3.1%)和杂货店&药房 (-5.7%)中,差异不那么明显。这些差异是有意义的,因为无论就地安置政策颁布时多么激烈,去办公室、购买食物和获得药品仍然是基本权利,特别是在疫情开始时,远程工作等替代方案尚未成熟。最重要的是,我发现,除了类别工作场所之外,我的 95%置信区间将统计显著性归因于所有位置类别的已识别差异。在所有条件相同的情况下,图 1 中的时间序列图显示,在 5 月初政策暂停后,德国公民以惊人的速度重新发现了他们对个人流动性的喜悦。这些上升趋势甚至超过了他们的瑞典同龄人的流动性水*,他们在夏末仍然受到在家避难的建议。我建议您修改图 1,比较德国和瑞典的交通时间序列如何针对类别中转站(子情节 1 & 5)和工作场所(子情节 2 & 6)演变,以见证这些动态变化。
为了弄清这些观察结果,我计算了另一组 95%的置信区间,以评估当德国暂停就地安置政策而瑞典没有暂停时,是否存在确定的流动性差异。
表 3 。按流动类别的*均差异,比较德国的政策暂停(即当严格级别= 0 时)和瑞典的政策条例(即当严格级别> 0 时)。
令人震惊的结果:德国居民在 4 个地点类别中的 3 个地点的流动性确实下降得更少。与瑞典同行相比,工作场所类别、、中转站类别和杂货店类别&药店类别的流动性变化比疫情前基线值少 9.9%至 2.7%。
这一切意味着什么?
我的分析结果证实,个人流动性的降低与两国的政策部署相一致,但随着时间的推移,关于时机和严格性的不同部署战略可能会引发不同的反应。Murphy 等人(2020 年)关于公民遵守遏制政策的动机的研究声称,一旦法规取消,合规就不会持续。基于这一论点,对政府诱导的健康干预的规范性承诺可能是德国和瑞典公民个人流动性暂时下降背后的主要动机。从这个意义上说,随着限制解除后规范压力的消失,德国公民可能会回归到更为机会主义的行为模式。相反,正在进行的就地安置建议继续缓和瑞典居民的流动模式。
与此同时,瑞典公民的流动模式表现出高度可变性的实例表明,动态远不像乍看上去那样黑白分明。例如,让我们考虑瑞典居民对于位置类别零售&娱乐(例如,图 1 中的子情节 7)的移动性的变化。在没有任何政策转变的情况下,流动性水*有时甚至超过了疫情之前的水*。为了解释这一发现,让我们回顾一下,就地安置要求一直是瑞典的一项建议。因此,人们的流动行为可能会受到同时发生的更严格的政策变化的影响,而我的研究没有考虑到这一点。这种情况代表了统计学家通常所说的“遗漏变量偏差”。当一个模型或分析遗漏了一个或多个相关变量,可能会混淆所包含变量之间的真实关联时,就会发生这种情况。在我们的案例中,就地安置需求和个人流动性变化之间的关系。
局限性
每项研究都有其局限性。是时候告诉你我的故事了。您可能还记得,我曾有意参与数据聚合和重采样。聚合意味着在粒度方面均衡移动性和策略数据,而重采样意味着消除分析无法控制的星期效应或特殊事件的影响。归根结底,在数据预处理方面,没有免费的午餐。从这个意义上来说,重采样和聚集度量是一把双刃剑,它可以提高清晰度和抑制噪声,但代价是模糊微妙的信号,这些信号只有在较低的粒度级别才会变得明显。最后,一些限制与我使用的数据有关。在研究谷歌(2021 年)新冠肺炎社区移动性报告中的了解数据部分时,我了解到移动性数据来自拥有谷歌账户并允许访问其位置历史的智能手机用户。在排除没有谷歌账户的智能手机用户,有谷歌账户但位置共享设置不同的智能手机用户,以及没有智能手机的人(是的,他们仍然存在!),样本代表性有风险。类似地,谷歌声明,如果地方不够繁忙,无法防止重复识别,数据就会被保留。这个善意的隐私门槛违背了可靠地捕捉脚步的实际目的。最后,谷歌以 1 月 3 日至 2 月 6 日之间的固定五周时间为基准来衡量移动性变化。使用两个冬季月份作为参考框架来评估今年剩余时间内的流动性变化会引起严重的数据有效性问题。
结论
本文以提问开始:随着时间的推移,德国和瑞典的公民如何减少个人流动性以应对各自政府颁布的就地安置要求?通过分析德国和瑞典 8 个月的流动性和政府政策数据,我发现强制执行就地安置要求的严格程度似乎影响了人们的流动性行为。德国采取了更为保守的就地安置政策,在执行时个人流动性急剧下降,随后在放松时流动性水*出现更大幅度的反弹。最终,研究结果暗示了个人流动性变化和政策制定之间的复杂关系,而我的分析才刚刚开始揭示这种关系。在强调游戏中的局限性时,我渴望批判性地反思我的分析结果,并在更普遍的意义上,善意地提醒人们,看似令人信服的发现必须始终有所保留。最重要的是,我希望这篇文章能激发这类进一步的探索,以提高政府在面对像新冠肺炎这样的威胁性传染病爆发时的决策能力。
参考
布赖恩特,p .和埃洛夫松,A. (2020 年)。评估流动模式对 11 个欧洲国家新冠肺炎感染率的影响。 medRxiv 。
Jung,f .,Krieger,v .,Hufert,F. T .,,Küpper,J. H. (2020 年)。我们应该如何应对新型冠状病毒冠状病毒的爆发:德国的观点。临床血液流变学与微循环, 74 (4),363–372。
马赫迪、布拉什奇克、德洛特科、萨尔维、陈、T. S. T .、哈维和扎雷布斯基(2020)。OxCOVID19 数据库:更好理解新冠肺炎全球影响的多模态数据库。medRxiv。
ReLU 神经网络如何逼*任意连续函数?
作者:凯沙夫·阿格拉瓦尔,阿尤什·卡诺迪亚
从根本上说,机器学习模型是函数逼*器。例如,在试图从一个人的教育程度来预测其工资时,我们试图通过查看函数中的样本点来逼*单个输入函数。更复杂的任务,如图像分类是多维函数*似1。
神经网络在机器学习中无处不在,因为它们可以逼*各种各样的函数——所有连续的分段线性函数(CPWLs),只要给定足够的隐藏单元。通用逼*定理保证了良好逼*函数的存在,这篇文章将讨论只有一个隐藏层和许多隐藏单元的神经网络如何使用 ReLU (校正的线性单元)非线性来逼*一元函数。这个想法延伸到多元输入空间。
作为函数逼*的学习
我们可以把学习过程理解为:
从数据中学习(作者绘制)
在这篇文章中,我们的目的是演示箭头 2,并给出一个箭头 1 的简短例子。神经网络异常强大的另一个原因是,它们可以通过反向传播(箭头 5)进行良好的训练[3]
神经网络的功能形式
考虑具有一个隐藏层的全连接神经网络。
神经网络的简单表示(由作者绘制)
不失一般性,输出层的最终功能是具有一个隐藏层的神经网络的功能形式。(x 向量是输入,权重用 w 表示)。这里的激活函数用 f 表示。
定义 ReLU 的使用
假设激活函数 f(x)是 R(x)—ReLU(整流线性单位)函数。ReLU 是分段线性函数,对于 x 的所有负值为 0,否则等于 x。
ReLU 函数(Desmos)
通过将函数 R(x)乘以“a”,将函数移位“b”,并将域移位“c”,来修改函数 R(x),(“a”和“b”是可学习的参数)给出了一个函数,该函数成为我们*似的构建块。
修改 ReLU (Desmos)
在一个神经网络中,有几个激活(ReLUs)聚集在一起逼*一个函数。ReLU 函数可以通过减法以下列方式折叠。
聚集 ReLUs (Desmos)
详细示例
为了更具体,让我们以一个只有一个隐藏层的神经网络为例。考虑图像中定义的连续分段线性函数。
分段线性函数(Desmos)的示例
因为这是一个三段函数,我们需要隐藏层中的 6 个神经元来表示这个函数(每段 2 个神经元)。下图说明了代表上述分段线性函数的神经网络的外观(及其权重和偏差)。
ReLu 函数精确表示分段线性函数(Desmos)
这可以推广到任何连续的分段线性函数,可以用神经网络来表示。现在让我们看看神经网络是如何逼*连续函数的。
接*
对于任意连续函数 g(x),我们可以证明它可以由它的无穷小部分的斜率之和来*似。由于 ReLU 可以用来表示任意直线,它可以构成这些斜率,最终逼*函数 g(x)。
注意,神经网络仅在受限域中在逼*函数方面做得很好,因为对于无限域,可能存在这样的情况,其中给定数量的神经元总是可以改进逼*,因此,不会获得成本函数的最小值。然而,在一个受限的领域中,神经元总是能够找到最小成本并很好地逼*函数。
下图显示了 x 在一个小区域内的*似值。这是为了演示 ReLU 函数如何聚合。由于函数的参数是可学习的,神经网络调整这些参数(以权重和偏差的形式)并逼*一个函数。
x 的*似值
这篇文章试图简化和展示神经网络是如何表现一个功能的。我意识到解释不是微不足道的,并决定写这篇文章,以 ReLU 为例。在这篇论文中可以找到一个更加严谨和详尽的解释。
希望这能有意义的帮助到某个人!
笔记
1这里,输入是图片的每个像素中的像素颜色,输出是图片在输出类别之一中的概率(例如猫/狗)
[2]深度神经网络甚至是更好的*似器,因为它们需要更少的单元来*似相同的函数,并且概括得更好更快(链接
[3]理解反向传播(环节
访问者如何使用你的网站?
原文:https://towardsdatascience.com/how-do-visitors-use-your-website-1187b8bd6357?source=collection_archive---------42-----------------------
Hotjar 制作的信息图
什么是 Hotjar,它是如何工作的?
介绍
你刚刚推出了一个新网站。或者您在 web 应用程序中添加了新功能。你急切地期待反馈、询问、申请等。
然而,什么也没有发生。
你不会收到电子邮件,没有人注册使用你的产品,你会问自己为什么。毕竟,你肯定有人访问过你的网站。
嗯,结果是联系表坏了,这就是为什么你没有收到任何电子邮件。或者,一些访问者无法查看您网站的其他部分,因为在移动设备上使用导航很混乱。这些是你在创建网站或改变功能时可能面临的一些潜在问题。
这篇文章旨在介绍 Hotjar,以及如何通过一个真实的用例来理解网站访问者的行为。
热罐
Hotjar 是一项行为分析和用户反馈服务,帮助您了解网站用户的行为,并通过以下工具获得他们的反馈:
- 热图 :通过直观地表现用户的点击、点击和滚动行为,了解用户想要什么、关心什么、在你的网站上做什么
- 记录 :通过查看访问者的点击、轻拍和鼠标移动,您可以即时识别可用性问题以及他们遇到的问题
- 反馈调查:针对网络和手机网站上的特定访问者提出问题
- 调查 :使用简易编辑器构建您自己的响应调查。
Hotjar 补充了您从 Google Analytics 等传统网络分析工具中获得的数据和见解。这是一项行业领先且易于使用的服务,结合了用户行为分析和网站反馈工具,帮助您了解您的网站上实际发生了什么,您的用户关心什么,以及他们想说什么。
所以,如果你是营销人员、产品经理或用户界面设计师,Hotjar:
- 给你清晰和直观的数据点关于在你的网站上发生了什么
- 帮助你了解一些背景知识,比如为什么人们会有这样的行为
- 上面的是否快速而不需要陡峭的学习曲线
如何使用 HOTJAR
- 创建 Hotjar 帐户。要开始,您可以选择免费版本,它每天记录 500 个会话,持续 14 天。
- 包括你从 Hotjar 网站上获得的脚本。Hotjar 建议将脚本放在 HTML 页面的
<head>
部分,但是您也可以将脚本放在<body>
部分。 - 请检查 Hotjar 仪表板以验证安装。如果验证无效,请尝试禁用广告拦截器。
用例
像其他几位数据科学家一样,我着手建立了一个新冠肺炎数据报告门户。你可能会翻白眼,但它有一个真正的用例。在我所在的英国威尔士,对数据不感兴趣的人并不清楚新冠肺炎的数据报告。所以,我继续做了一个,几个月后,这个门户已经有了 509,000 的浏览量!😱
门户网站新冠肺炎·西姆鲁(威尔斯的新冠肺炎门户网站)
门户网站最受欢迎的功能之一是每日地图。这个页面提供了威尔士每个特定地区的每日病例数字——我认为它为人们提供了一点安慰,让他们看到疫情在他们家门口的实际情况,而不仅仅是整个国家的情况。
每日地图报告威尔士特定地区的新冠肺炎病例
我绝不是一个用户界面设计师。所以为了构建门户,我使用了小英莱利的免费自举门户设计。你绝对应该去看看她——她的设计棒极了!
我深入研究了她的文件,修改了设计以适应用例。然后,我开始在 Twitter 上报告案例,并将用户引向门户网站。我的 Google Analytics 报告说,我的大多数用户都是在移动设备上访问门户的,对此我想都没想。由于门户是使用 Bootstrap 构建的,因此可扩展到移动和*板电脑屏幕。
在 Twitter 上,我分享了一张地图附带的表格截图,我经常被问到它在门户网站的什么位置。
这让我想知道——用户看不到表格吗?
答案是,没有…
下图显示了两周后 Hotjar 在地图页面的移动视图上制作的热图。地图本身(出于安全考虑,地图所在的 iframe 无法通过 Hotjar 查看),显然是吸引力的一个特征。深红色热图区域表明了这一点。导航和地图视图选择也经常使用。但是如果我们注意桌子,几乎没有热量。因此,这表明移动用户没有意识到,如果他们在设备上向下滚动,表就位于地图下面。因此,为了改善这个可用性缺陷,用户需要某种可操作的指示,让他们知道要查看表格,他们必须滚动地图。
结论
正如你所看到的,将 Hotjar 嵌入到你的网站是很容易的。Hotjar 物有所值,它的免费层提供了有价值的信息!它帮助你建立更好的网站,让你的用户更有效地使用,降低跳出率。
虽然它有助于跟踪错误并帮助识别和修复网站中的漏洞,但 Hotjar 等工具可以帮助您解决 UX 问题并更好地了解您的受众。我们可以通过了解用户如何与我们的网站互动来消除这种猜测,而不是将我们的时间和资源集中在我们认为可行的事情上。
如何将主成分分析应用于逻辑回归以消除多重共线性?
原文:https://towardsdatascience.com/how-do-you-apply-pca-to-logistic-regression-to-remove-multicollinearity-10b7f8e89f9b?source=collection_archive---------2-----------------------
PCA 在消除多重共线性中的作用
Gabriella Clare Marino 在 Unsplash 上拍摄的照片
当要素(输入变量)与数据集中的一个或多个其他要素高度相关时,会出现多重共线性 。它会影响回归和分类模型的性能。PCA(主成分分析)利用多重共线性,将高度相关的变量组合成一组不相关的变量。因此,PCA 可以有效地消除特征之间的多重共线性。
在本帖中,我们将在名为乳腺癌数据的分类数据集上构建一个逻辑回归模型。初始模型可以被认为是基础模型。然后,我们将对乳腺癌数据应用主成分分析,并再次建立逻辑回归模型。之后,我们将比较基本模型和这个模型之间的性能。最后,我们将建立一个机器学习管道,将应用逻辑回归和 PCA 的多个步骤结合起来。读完这篇文章后,你将能够将 PCA 应用于逻辑回归模型。
我们开始吧!
探索乳腺癌数据集
该数据集是 Scikit-learn 中的内置数据集之一。根据 Scikit-learn 文档,它有 569 个样本的 30 个特征。目标变量有两个类别,称为 0(没有乳腺癌)和 1(有乳腺癌)。由于目标变量只有 2 个类,因此数据集用于二进制分类。数据集中没有缺失值。所有的值都是数字。所以,不需要清洗!
加载数据集
等到加载 Python 代码!
乳腺癌数据集的一部分(图片由作者提供)
创建热图
热图可以用漂亮的彩色图来显示连续变量的相关系数。
等到加载 Python 代码!
(图片由作者提供)
正如您在热点图中看到的,数据集中的一些要素彼此高度相关。因此,存在多重共线性。
构建逻辑回归模型(基础模型)
以下代码块基于乳腺癌数据构建逻辑回归模型。
等到加载 Python 代码!
基本模型的输出(图片由作者提供)
基础模型非常好。一点也不合身。它在新的未知数据上表现良好。让我们看看是否可以通过应用主成分分析来提高模型的性能。
对乳腺癌数据应用主成分分析
PCA 概述
PCA 是一种线性降维技术(算法),它将一组相关变量(p)转换成较小的 k (k
主成分 ,同时尽可能多地保留原始数据集中的变化。在机器学习(ML)的背景下,PCA 是一种用于降维的无监督机器学习算法。如果变量不是在相似的尺度上测量的,我们需要在对我们的数据应用 PCA 之前进行特征缩放。这是因为 PCA 方向对数据的规模高度敏感。PCA 中最重要的部分是为给定的数据集选择最佳数量的组件。
为我们的数据选择最佳数量的电脑
首先,我们应用 PCA,保持所有组件等于原始维数(即 30 ),并观察 PCA 如何很好地捕捉我们的数据的方差。
等到加载 Python 代码!
(图片由作者提供)
第一个分量单独捕获数据中约 44%的可变性,第二个分量捕获数据中约 19%的可变性,依此类推。前 6 个分量一起捕获了数据中约 88.76%的可变性。我们有兴趣保留前 6 个组件。
使用 6 种成分再次运行 PCA
现在,我们得到了包含 6 个组件的转换数据集。为此,我们需要通过设置 n_components=6 再次运行 PCA。
等到加载 Python 代码!
转换数据集的一部分(作者提供的图像)
现在,我们可以使用这个转换后的数据集代替原始的乳腺癌数据集来建立逻辑回归模型。这是两个数据集之间的区别。
- 原始数据集有 30 个要素,而转换后的数据集有 6 个组件。
- 转换后的数据集仅捕获原始数据集中约 88.76%的可变性。
- 两个数据集对应的值完全不同。
- 原始数据集中的一些变量与一个或多个其他变量高度相关(多重共线性)。转换后的数据集中没有变量与一个或多个其他变量相关。
创建转换数据集的热图
fig = plt.figure(figsize=(10, 8))
sns.heatmap(X_pca.corr(),
annot=True)
(图片由作者提供)
我们看不到组件之间的任何关联。这是因为 PCA 已经将原始数据集中的一组相关变量转换为一组 不相关 变量。
对转换后的数据建立逻辑回归模型
下面的代码块在转换后的数据集(通过应用 PCA 获得的数据集)上构建逻辑回归模型。
等到加载 Python 代码!
(图片由作者提供)
您可以将这个输出与我们基本模型的先前输出进行比较。测试精度提高了 3%。假阳性和假阴性也减少了。然而,转换的数据集(通过应用 PCA 获得的数据集)仅捕获原始数据集中约 88.76%的可变性。所以, 这款车型的性能提升背后的原因是什么? 显而易见的答案是PCA 有效地消除了多重共线性!
构建机器学习管道
机器学习管道通过将应用逻辑回归的多个步骤与 PCA 相结合,简化了整个过程。以下是步骤:
(图片由作者提供)
等到加载 Python 代码!
log _ reg _ model流水线通过顺序应用变压器列表和最终预测器来简化训练过程。在我们的渠道中:
- StandardScaler() 是一个变压器。
- PCA() 是变压器。
- LogisticRegression() 是预测者。
现在,我们可以通过一个训练所有的估计器。称之为合体()。
log_reg_model.fit(X,y)
现在,我们已经完成了引言中承诺的工作。
摘要
PCA 对于消除多重共线性是有用的。它充当数据预处理步骤。PCA 还有很多其他的用例。这只是降维技术之一。你可以通过阅读我写的下面这篇文章找到更多关于那些事情的信息:
</11-dimensionality-reduction-techniques-you-should-know-in-2021-dcb9500d388b>
我的读者可以通过下面的链接注册成为会员,以获得我写的每个故事的全部信息,我将收到你的一部分会员费。
报名链接:https://rukshanpramoditha.medium.com/membership
非常感谢你一直以来的支持!下一个故事再见。祝大家学习愉快!
特别感谢 Unsplash 上的加布里埃拉·克莱尔·马里诺,她为我提供了这篇文章的封面图片。本帖提供的文字内容、代码示例、其他图片和内容链接,版权归作者所有。
鲁克山普拉莫迪塔 2021–06–15
如何用 Python 实现 AdaBoost?
原文:https://towardsdatascience.com/how-do-you-implement-adaboost-with-python-a76427b0fa7a?source=collection_archive---------15-----------------------
助推技术
机器学习中的助推算法——第二部分
约翰·普莱斯在 Unsplash 上拍照
我们继续机器学习系列文章中提升算法的第 1 部分。看过第一部吗?它向您简要介绍了 boosting 以及一些关键技术术语的定义,这些术语对于理解今天的内容非常重要。
今天,我们将学习最流行的增强算法之一:AdaBoost(自适应增强)。更多的重点将放在算法的实现部分,在以下主题。
- sci kit-AdaBoost 的学习类
- 在葡萄酒数据上训练和评估 AdaBoost 分类模型
- 将 AdaBoost 模型与决策树残肢进行比较
- AdaBoost 中的重要超参数
- 测量超参数的效果 n_estimators
- 测量超参数的效果学习 _ 速率
- 使用网格搜索找到最佳超参数值
所有代码示例都将作为 GitHub gists 包含在内,以便您可以轻松地使用它们!在本文的最后,您将能够在具有最佳超参数值的给定数据集上实现 AdaBoost 算法。
我们开始吧!
sci kit-AdaBoost 的学习类
AdaBoost 的 Python 实现由两个 Scikit-learn 类完成:AdaBoostClassifier()用于分类(二进制和多类),以及AdaBoostRegressor()用于回归。导入惯例是:
from sklearn.ensemble import AdaBoostClassifierfrom sklearn.ensemble import AdaBoostRegressor
创建决策树树桩模型
通过用 max_depth=1 提前停止树的生长,我们将在葡萄酒数据上构建一个决策树桩。这是为了比较决策树桩和 AdaBoost 模型。我们也使用这个树桩模型作为 AdaBoost 的基础学习器。
下面的 Python 代码在 Wine 数据上创建了一个决策树,并评估了它的性能。
基于葡萄酒数据的决策树树桩模型
(图片由作者提供)
模型的性能很差。这并不奇怪,因为我们通过设置 max_depth=1 来严格调节树的生长。
创建 AdaBoost 分类模型
现在,我们将在葡萄酒数据上构建一个 AdaBoost 分类模型。
基于葡萄酒数据的 AdaBoost 分类模型
(图片由作者提供)
哦那个分数!与决策树残肢相比,AdaBoost 模型表现得非常好。
AdaBoost 中的重要超参数
以下是 AdaBoostClassifier() 和 AdaBoostRegressor() 中最重要的超参数。
- base_estimator: 这是 AdaBoost 算法中使用的基本学习器。默认的也是最常见的学习者是我们前面讨论过的决策树 stump(max _ depth = 1 的决策树)。
- n_estimators: 顺序训练的估计器(模型)的最大数量。默认值为 50。我们将很快测量这个超参数的影响。
- learning_rate: 确定在增强过程中应用于每个估计器的权重。默认值为 1。较小的值(如 0.05、0.1)会强制算法训练较慢,但具有高性能分数。我们将很快测量这个超参数的影响。
测量效果 n_estimators
我们将通过将超参数 n_estimators 的值从 2 变化到 100 来手动测量其效果,并绘制 AdaBoost 模型给出的测试分数。
n _ 估计量的影响
(图片由作者提供)
在大约 30 次估计之后,我们之前获得的准确度分数恒定在 0.972。您可以使用 30 以上的任何整数。但是请记住,如果您增加该值,该算法将需要很长时间进行训练。因此,在这种情况下,最好使用默认值 50。
衡量效果学习 _ 速率
我们将通过从 0.1 到 1 改变超参数 learning_rate 的值来手动测量其效果,并绘制 AdaBoost 模型给出的测试分数。
学习率的影响
(图片由作者提供)
最高精度为 0.4、0.5、0.7 和 0.8。我们在上面的模型中使用了 0.5。
两种测量都是手动完成的。有一种更简单的方法来找到 n_estimators 和 learning_rate 的最优值。
使用网格搜索找到最佳超参数值
这里,我们通过使用 网格搜索 ,同时自动调整(找到最佳值)两个超参数。相比之下,在前面的步骤中,我们一次调优一个超参数。
执行网格搜索
(图片由作者提供)
我们可以使用这些值来获得 AdaBoost 模型的最高精度。给出相同精度的一些其他可能的组合是:
- 学习率=0.5,n 个估计值=50
- 学习率=0.8,n 个估计值=50
- 学习率=0.8,n 个估计值=100
- 学习率=0.4,n 个估计值=50
摘要
用 Python 构建 AdaBoost 模型非常简单。你所要做的就是确定你想要解决的问题类型(回归/分类)并选择 Scikit-learn 中提供的合适的 AdaBoost 类。然而,超参数调整过程是一个真正的挑战。你需要做一些可视化,为超参数调整做并行计算。实际上,您将创建数千个模型。幸运的是,我们可以使用本文中讨论的高级方法来自动化调优过程。
模型的输出很大程度上受随机数据分割的影响。根据在 random_state 中指定的整数,您可能会得到不同的准确度分数。总是建议指定一个整数,以便在不同的执行中获得静态结果。
与决策树和随机森林等其他基于树的方法相比,AdaBoost 等 boosting 算法的性能非常好。这是因为考虑到前几轮初始树产生的误差,升压中的树被顺序训练。
在第三部中,我们将讨论梯度增强,另一种流行的增强算法。下一个故事再见。祝大家学习愉快!
我的读者可以通过下面的链接注册成为会员,以获得我写的每个故事的全部信息,我将收到你的一部分会员费。
*https://rukshanpramoditha.medium.com/membership
非常感谢你一直以来的支持!
特别感谢 Unsplash 上的约翰·普莱斯,为我提供了这篇文章的精美封面图片。
鲁克山普拉莫迪塔
2021–10–22*
如何连接 SQL 表?
原文:https://towardsdatascience.com/how-do-you-join-sql-tables-a4b6ceb898bb?source=collection_archive---------14-----------------------
WHERE 或 ON 子句?
照片由 Alina Grubnyak 在 Unsplash 上拍摄
马上,我不使用也永远不会使用WHERE
子句来连接表。
如果你正在使用WHERE
子句,这篇文章试图说服你也这样做。相反,使用ON
子句来实现表连接。
您使用WHERE
子句执行表连接吗?请不要让我检查或帮助你找到你的查询中令人沮丧的障碍。
你在问我为什么吗?
我告诉过你,我不喜欢用于连接表的WHERE
子句。我只用它来过滤数据。当用于实现表连接时,它以一种糟糕的方式(畏缩)让我恼火。我的思维变得超速,特别是在用于实现两个表之外的多个连接时。
类似下面的 SQL 查询伤害了我的眼睛,更糟糕的是我的大脑。使用WHERE
子句来实现表连接,会使表连接的顺序变得不清晰,也没有任何视觉提示。
使用 WHERE 子句连接多个表的 SQL 查询示例。这个 SQL 使用相同的 WHERE 子句进行过滤。
参见上面使用WHERE
子句连接 6 个表的 SQL 查询。更糟糕的是,它还使用 3 个带有相同的WHERE
子句的AND
逻辑操作符来执行数据过滤。
使用ON
子句实现相同结果的重写看起来像这样。奖励是非常明显的。
首先,我们使用了WHERE
子句的查询尾部的混乱被很好地整理了。现在很明显WHERE
子句在做什么——一件事——只有行过滤。
第二,简单地说,您可以识别和理解连接表的顺序,以创建保存查询结果的概念上的巨型表。
重写看起来也很有凝聚力。
表连接不使用 WHERE But ON 子句的更多理由
1.数据过滤
WHERE
子句很优秀,更适合数据过滤,而不是连接表。
2.认知超载
在实现数据过滤和表连接时使用WHERE
子句会造成认知超载。WHERE
子句在同时用于实现表连接和数据过滤时会影响可读性和查询理解。
3.有限的
WHERE
子句限制了你在不同的表上可以实现的连接。WHERE
子句只实现了INNER JOIN
,这是您可以使用ON
子句执行的 5 种连接类型之一。
4.缺失记录
因为使用WHERE
子句执行表连接在技术上与INNER JOIN
的行为相同,所以连接的表中的记录必须满足WHERE
子句中表达的条件,才能成为连接的表的结果的一部分。忽略这些基础知识可能会导致查询结果中遗漏重要的记录。在银行和汇款应用程序这样的金融应用程序中,这种疏忽可能是代价高昂的。
使用 ON 子句实现比内部连接更多的功能
正如我前面指出的,使用WHERE
子句产生的结果与同时使用ON
子句和INNER JOIN
子句产生的结果相同。
除了使用ON
子句实现INNER JOIN
之外,您还可以实现其他形式的 SQL 表连接。这些其他类型的表连接的好处是有足够的参数将WHERE
子句严格留给数据过滤。这样做也为您的查询带来了一致性,并减少了其他开发人员的 SQL 审查和维护难题,因为他们不必费力区分用于表连接和数据过滤的条件。
在本文的其余部分,除了内部连接之外,我将通过示例数据展示其他三种形式的 SQL 连接。
如果您想亲自操作,那么首先创建表并用示例数据作为种子。
创建表格,person
和contact
创建表“person”的 SQL 查询
创建表“联系人”的 SQL 查询
下载样本数据 person.csv 和 contact.csv 并分别植入表person
和contact
。
使用下面的查询解压缩并最终用示例数据播种这些表。记得用你下载的解压副本的路径替换/path/to/person.csv
和/path/to/contact.csv
。
如果您做的一切都是正确的,那么表上的 select 语句应该产生下面的输出
餐桌人员
SELECT * FROM person;
person.csv
表格联系人
SELECT * FROM contact;
contact.csv
除了内部连接之外的其他连接类型
除了INNER JOIN
,还有 4 种其他类型的连接,分别是FULL OUTER JOIN
、LEFT OUTER JOIN
、RIGHT OUTER JOIN
和CROSS JOIN
。
在本文中,我们将讨论LEFT OUTER JOIN , RIGHT OUTER JOIN
和FULL OUTER JOIN
左外部连接
如果两个表都满足用ON
子句指定的条件,左外连接通过列出左表中的指定列并将它们连接到右表中的列来组合两个表。
当条件与左表中的列不匹配时,为右表中的列设置一个NULL
值。
考虑下面的例子,一个person
表位于表contact
的左外部连接中。
工作台person
为左工作台contact
为右工作台。
您会注意到左边表格person
中的name
、gender
、age
列被连接到右边表格contact
中的phone_number
列。同样明显的是,没有匹配person_id
的最后 4 行将phone_number
设置为空。
SELECT person.name,
person.gender,
person.age,
person.phone_number
FROM person
LEFT OUTER JOIN contact
ON person.id = contact.person_id
输出:
表 person 和 contact 之间左外部连接的输出
右外部联接
右外连接通过列出右表中的指定列并在两个表都满足用ON
子句指定的条件时将它们连接到左表中的列来组合两个表。
当条件与左表中的列不匹配时,为左表中的列设置一个NULL
值。
考虑下面的例子,右外部连接中的一个person
表与表contact
。工作台person
是左工作台contact
是右工作台。
您会注意到右表中所有行的phone_number
都被列出,并连接到左表中匹配记录的name
、gender
、age
。
因为person
表和contact
表之间的关联是关系型的,确切地说是一个One2many
关系,所以如果没有一个根实体 person 来拥有它,就不会有联系人记录。因此,我们的RIGHT OUTER JOIN
结果仅限于有联系记录的人员。
如果来自person
表的name
、gender
、age
列表都满足ON
条款规定的条件,则它们被连接到来自contact
表的phone_number
。
SELECT person.name,
contact.mobile_number,
contact.home_address
FROM person
RIGHT OUTER JOIN contact
ON person.id = contact.person_id
输出:
表 person 和 contact 之间右外连接的输出
完全外部连接
完全外部联接通过列出两个表中的列来组合这两个表。当条件不满足时,为左表或右表的列设置一个NULL
值。
考虑下面的例子,一个person
表和contact
通过一个更完整的外部连接组合在一起,条件是person
上的id
列与contact
表上的person_id
列匹配。每个表中不满足该条件的行仍然显示在结果中,它们的列设置为NULL
SELECT person.name,
person.gender,
person.age,
person.phone_number
FROM person
FULL OUTER JOIN contact
ON person.id = contact.person_id
输出:
表 person 和 contact 之间完全外部连接的输出
结束语
希望我成功说服您放弃使用WHERE
子句来连接表。如果什么都没有,你已经注意到使用ON
子句给你的查询带来了多大的清晰度。还记得使用ON
子句时可以执行的其他类型的连接。
希望这篇文章对你有所帮助。
知识是给世界的,所以我们分享。
祝你一切顺利。下次见。
怎么知道自己的数据够不够好?
原文:https://towardsdatascience.com/how-do-you-know-if-your-data-is-good-enough-174913ed2ad9?source=collection_archive---------26-----------------------
当然,可能会有一些例外,但我们中的大多数人处理数据是为了让人们能够做出好的决策。为了达到一个共同的目标,我们走了数百万条不同的道路:更好地了解这个世界,一次一点点。罗摩·罗摩克里希南的“从预测到行动”系列将带领我们到达目的地的序列分解成有时很棘手的部分;最*一期文章聚焦于为我们要解决的问题组装正确数据集的关键步骤。(既然你在这里,你也不妨重温一下第一部。)
照片由蒂亚戈·加西亚在 Unsplash 上拍摄
定义要查看的正确数据,然后创建一个流程来从中得出可操作的见解是作为产品分析师的 Kate Gallo 的工作核心。与一些更常见的以数据为中心的工作描述相比,这是一个鲜为人知的角色,Kate 耐心地向我们介绍了它的来龙去脉。对她来说,产品分析师是作为用户的拥护者与多个合作伙伴一起工作的人:他的角色是“确保用户喜欢并从产品中获得价值”,并通过对精心选择的指标进行深思熟虑的分析来做到这一点。
Rama 和 Kate 的文章从商业决策的角度探讨了数据有效性的话题,但挑战在于知道我们是否在看正确的数据——我们有足够的数据吗?靠谱吗?它准确地代表了世界吗?—更深更广。正如艾丹·佩*在他的第一篇 TDS 文章中所写的,使观察到的现象可测量的过程需要多种形式的简化——“未能解释数据化的这种简化本质是许多算法伤害和失败的根本原因。”对于 Aidan 来说,如果我们想避免这些危险中最糟糕的情况,仔细的设计和注意我们在这个过程中做出的选择都是必要的。
观察、收集、展示和利用数据的方式有很多——如果你想在本周探索其他一些方向,我们将一如既往地为你提供帮助!):
- 发现结构方程建模的威力 。Laura Castro-Schilo 分享了对 SEM 的有用而全面的介绍,并解释了为什么这种方法成为如此多的行为和社会科学家的最爱。
- 恶补最新深度学习研究 。罗伯特·兰格备受期待的八月版学术论文推荐来了!这本书充满了对从视觉变形器到深度学习优化器基准等主题的热情阅读。
- 了解人工智能 中的转换范式。最*围绕人工智能的对话往往可以归结为一个简单的人类合作与人类对抗的二元对立。在最新的 TDS 播客中,Jeremie Harris 和嘉宾 Divya Siddarth 探讨了人工智能的其他想法和应用,并探讨了政府在该技术的下一个篇章中可能发挥积极作用的方式。
我们希望你喜欢本周的阅读——感谢你花时间和我们在一起,感谢你的支持让这一切成为可能。
直到下一个变量,
TDS 编辑
我们策划主题的最新内容:
入门
- 通过 Sheel Choksi 扩展您的数据团队时需要寻找什么
- 数据可视化中颜色的力量作者玛丽·勒菲弗尔
- 数据科学家 GitHub 桌面作者德鲁·西沃德
实践教程
- 2021 年建立营销组合模式的完整指南作者特伦斯·申
- 4 个预提交插件,由 Khuyen Tran 在 Python 中自动进行代码审查和格式化
- 用熊猫很快生成假数据作者胡安·路易斯·鲁伊斯-塔格勒
深潜
- Thrill-K:下一代机器智能的蓝图作者加迪·辛格
- 应用贝叶斯推理(上)由阿尼·马杜尔卡
- 单元 7)差异进化——自动机器学习作者布兰登·摩根
思想和理论
- 让模型更健壮更高效作者丹尼尔·安杰洛夫
- 可解释的 K 均值:聚类特征重要性作者尤瑟夫·阿尔霍法伊里
- 正交系统和傅里叶级数由张希楚
你怎么知道你的分析是“对的?”
原文:https://towardsdatascience.com/how-do-you-know-your-analysis-is-right-3399f7c48971?source=collection_archive---------20-----------------------
验证数据分析的策略
如果你和数据打交道,我敢打赌有人告诉过你“这个数据看起来不对劲…”
当我还是一名全新的数据分析师时,这句话让我(非常)焦虑。我并不总是对我的工作有信心,总是假设如果分析的最终用户说它是关闭的,那么我肯定犯了一个错误。我一直在想,我只需要更加小心谨慎。
由 Avel Chuklanov 在 Unsplash 上拍摄的照片
虽然我仍然总是仔细检查我的公式和数据处理工作流程,但我现在意识到,在向利益相关者展示报告之前,尽最大努力验证最终结果对于增强信心和赢得信任至关重要。
这似乎是显而易见的,但是当您的输出是一百万条记录时,您如何验证这个结果呢?如果你不确定,请继续阅读。
用源系统验证输入数据
你知道这句谚语:垃圾进来,垃圾出去。因此,将您的原始数据与原始来源进行比较至关重要。在我目前的角色中,这通常意味着根据原始 ERP 系统检查来自我们数据湖的查询结果中的记录计数、数据类型和最新加载日期。这是一个相对快速和简单的检查,但是如果您在查询或数据湖中发现错误,它可以节省您大量的时间——这样您可以首先修复错误,然后继续前进,知道您正在检查有意义的分析。
我在项目的这一步遇到的一些问题包括:意识到我的查询有一个我不再需要的记录限制,看到源系统中包含的数据湖中缺少列,注意到数据库已经几个月没有加载新数据了,以及认识到数据类型的差异。
凯文·Ku 在 Unsplash 上拍摄的照片
检查数据汇总统计和分布
我发现检查汇总统计数据(如最小值和最大值、*均值等)很有帮助。)在我分析的多个点上。开始时,我将检查这些统计数据以发现异常值,并确保所有值都是正确的数据类型。此外,绘制变量的分布图有助于快速了解数据的情况,这将帮助您快速识别任何重大问题。
当您在分析项目结束时检查汇总统计数据时,您可能希望查看任何新变量的统计数据是否对您开始时的数据和您对最终结果的期望有意义。例如,如果您创建了一个类似“调查完成百分比”的指标,并且您看到值超过 100%,那么您知道您需要检查您的公式和/或格式。
运用批判性思维
Robina Weermeijer 在 Unsplash 上的照片
好的,非常明显——你必须批判性地思考你的结果。
尽管如此,我有时还是会收到来自其他人的数据,这些数据的值显然没有逻辑意义。我得到的制造数据表明,如果这是真的,我们公司应该倒闭。批判性地思考您的结果包括真正理解您的数据及其用例。
如果您不太了解您正在处理的变量,或者期望值应该是什么,那么您应该与业务方面的人员合作,以更好地了解对数据/指标的期望。
与主题专家合作
如果你是一名数据分析师或数据科学家,你不可能知道你得到的所有不同数据的一切。因此,向公司里的专家或经常处理这些数据的人询问大量问题,对于确保你的分析是正确的至关重要。
有时候,数据专家并不是项目的请求者。找到他们可能需要一些网络或消息。但是一旦你找到一个人,他可以解释某些维度意味着什么,或者为什么某些指标对业务理解很重要,他们的知识可以节省你无数个小时的努力。
照片由车窗上的挡泥板拍摄
我还发现,记录这些商业知识可以帮助提升你的分析团队的技能,并更快地分发信息。无论您是做项目符号笔记、制作流程图、创建关系数据库图表,还是做其他事情,您都可以真正帮助对您正在处理的数据感兴趣的其他同事。(而且可以减少对自己分析的提问!)
与类似分析相比
这项任务在不同的项目中可能会有很大的不同,但是总的来说,您希望对您的最终结果进行某种健全性检查,尤其是如果您以前从未处理过这些数据。
以下是我比较项目结果的一些例子:
- 将分组总计与来自源系统数据的汇总结果进行比较
- 确保我的数字在预期的数量级内(例如,销售额是百万还是十亿)
- 让一位同事复制分析结果(如果很短)并比较结果
- 查找现有仪表板以检查我的数据。他们不会完全一样,但他们可以提供大致的答案
结论
我希望对我的分析始终充满信心,因为它经常被用来制定商业战略决策。这就是为什么我在整个数据分析过程中,通过多种渠道来验证我的工作。
希望本文列举的策略能帮助你自信地说“是的,我的分析是对的。”祝您未来的数据项目好运!
朱利安·洛萨诺在 Unsplash 上的照片
要阅读更多关于数据分析的信息性(有时是机智的)文章,请看我的中型简介:
https://megandibble.medium.com/
作为一名数据科学家,你如何衡量成功?
原文:https://towardsdatascience.com/how-do-you-measure-success-as-a-data-scientist-11bc7f1ed608?source=collection_archive---------26-----------------------
我们每周精选的必读编辑精选和原创特写
本周我们感受到了节日的气氛——当我们激动地挥手说“你好!”时,数据科学最*达到了一个重要的里程碑在我们的第 600,000 个灵媒追随者中。
有很多方法可以衡量一个出版物的成功,但是如果你的读者没有出现,这些方法都没有用。所以,对阅读《变量》的每一个人:感谢你的出现,让我们的社区保持支持和欢迎,并帮助我们传播消息。如果你想以更直接的方式支持我们和我们的贡献者,考虑成为一个中等会员。它不仅可以让你无限制地访问 TDS 上的每一篇文章(以及 Medium 上的所有付费文章),还可以帮助我们和我们的作者继续发布一流的数据科学文章。
照片由阿迪·戈尔茨坦在 Unsplash 上拍摄
如果你想知道我们是如何庆祝的:我们是一个分布式的编辑团队,涉及了如此多的香槟酒瓶表情符号。(可能也有一些真的!谁知道呢?)然而,没有什么比发表真正优秀的帖子更能给我们带来快乐了,我们当然也这么做了。
不像数字出版物,读者不断用他们的眼睛和时间投票,许多软件公司需要细致入微的工具来衡量成功。 Chris Dowsett 分享了 Spaceship 团队为实现全自动 NPS(净推介值)程序而开发的流程——如果你想收集有意义的用户反馈,但没有谷歌规模的预算(或数据团队),请阅读该流程。
在许多行业背景下,定义成功是一个迭代过程,其中一个关键要素是避免最常见和最有害的错误。对于像李颖这样为 IBM 公司总部人力资源团队管理数据科学的人来说,拥有一个健壮的框架是至关重要的;在她的最新帖子中,她详细介绍了她推荐的分析管理七阶段生命周期,从制定正确的问题到淘汰过时的解决方案。 Fabrizio Fantini ,就他而言,专注于建立正确的护栏,以保持团队专注于正确的目标;阅读他的帖子了解如何避免数据科学项目设计中的四个常见陷阱。从不同的角度处理一个类似的问题, Aparna Dhinakaran 解释了 ML 可观测性,以及当团队将他们的模型从绘图板付诸实践时,它为什么对团队很重要:这是“在部署模型后盲目行动的团队和能够快速迭代和改进他们的模型的团队之间的关键区别。”
有时候,获得对手头问题更细致入微的理解本身就是成功的一种衡量标准——尤其是在机器学习这样一个年轻且不断变化的领域。Julia Nikulski 深入研究了人工智能文本生成中出了名的复杂的毒性话题,如果你跟随她,你也会更清楚地了解那些使简单修复变得不可能的因素和利益相关者。同样, Blake VanBerlo 和安大略省伦敦市人工智能应用实验室的团队正致力于解决他们城市的长期无家可归问题;他们建立的预测模型仍处于早期阶段。尽管如此,他们迄今为止所学到的东西已经很有价值了,并将为政策制定者在支持他们社区中的边缘人群的工作中提供选择。
最后,在过去的一周里,我们自己的团队也有机会反思过程、成功和迭代——这不仅仅是因为我们与不少于 600,000 名订阅者分享了我们的帖子。(我们已经提到过了吗?我们可能有。)在我们最新的作者 Spotlight Q & A 中,特约作者 Eugene Yan 向我们介绍了他从心理学专业到亚马逊应用科学家的道路,并且提供了作为数据科学家和公共作家对目标设定、学习和挑战自我的见解。在 TDS 播客上,主持人 Jeremie Harris 欢迎Brian Christian,The Alignment Problem的作者,来讨论我们——数据科学家、机器学习工程师,以及,嗯,整个人类——今天面临的最大挑战可能是什么:确保我们建立的人工智能系统不会,嗯,摧毁我们。
再次感谢您成为我们社区的一员——本周,以及每周。如果本周你也在庆祝一项成就或里程碑,请让我们知道。我们的生活中永远不会有足够多的香槟酒瓶表情符号。
直到下一个变量,
TDS 编辑
我们策划主题的最新内容:
入门指南
- 可解释还是准确?为什么不两者都要? by Parul Pandey
- 用数据科学做决策作者约什·泰勒
- 第一份数据科学家工作的面试:期待什么以及如何准备作者 Emma Ding 和 Hide Kato
实践教程
- 用于信用卡欺诈检测的机器学习作者Yann-al Le Borgne
- ConnectorX:加载 Python 数据框架最快的库作者王小鹰
- 图嵌入入门作者 CJ Sullivan
深潜
- 空间分区和 KD 树由 Max Miller
- 数据科学工程基础作者马特·索斯纳
- 从零开始建立机器学习模型到实际使用案例作者 Yasas Sandeepa
思想和理论
- 数据科学家的研究心态:潘武的“第一原理”思维
- 内部量化感知培训由 Vaibhav Nandwani
- 艾是来应聘你的工作的吗?由瑞亚茅台
你如何保持机器学习研究和最佳实践的领先地位?
原文:https://towardsdatascience.com/how-do-you-remain-on-top-of-machine-learning-research-best-practices-f4dea6c9f4db?source=collection_archive---------46-----------------------
TDS 聊天
我希望听到您和社区的意见。我们想问你:
- 你如何保持在机器学习文献和最佳实践的顶端?
- 您是否被每天和每次会议上发布的大量论文所淹没?如果是,你如何选择专注于哪些论文?
欢迎在评论中分享你的方法和观点。这对社区非常有益!
我们聊聊吧:)
如何在 CatBoost 中直接使用分类特征?
原文:https://towardsdatascience.com/how-do-you-use-categorical-features-directly-with-catboost-947b211c2923?source=collection_archive---------5-----------------------
助推技术
机器学习中的助推算法——第六部分
妮可·詹皮耶罗在 Unsplash 上的照片
这是我们在 “机器学习中的 boosting 算法” 文章系列中涉及的第四个(最后一个)Boosting 算法。到目前为止,我们已经详细讨论了 AdaBoost 、梯度增强、 XGBoost 和 LightGBM 算法及其 Python 实现。
CatBoost(分类增强)是 XGBoost 的替代方案。它具有以下特点:
- 可以直接处理分类特征,无需编码
- 具有更简单的超参数调谐过程
- 运行速度比 XGBoost 快
在本教程中,我们将讨论如何在 CatBoost 中直接使用分类特征。我们还将它与 LightGBM 进行比较,后者也可以处理分类特征,但需要一些额外的工作!
我们开始吧!
安装 CatBoost
CatBoost 的安装超级简单。在 Anaconda 提示符或 Google Colab 编辑器中运行以下命令之一。
pip install catboost
#OR
conda install catboost
这两个命令都可以安装既支持 CPU 又支持 GPU 的 catboost 包。
在 CatBoost 中直接使用分类特征
与其他 boosting 算法相比,CatBoost 的一个独特特性是我们可以通过 CatBoost 直接使用分类特征(如果数据集中有分类特征的话)(无需编码)。为了验证这一点,我们将使用具有一些分类特征的“钻石”数据集构建一个 CatBoost 回归模型。
钻石数据集
现在,我们来看看“钻石”数据集的一些重要细节。
import pandas as pddf = pd.read_csv('diamonds.csv')
df.head()
(图片由作者提供)
让我们在数据集中找出一些关于特征(变量)的信息。
df.info()
(图片由作者提供)
如你所见,变量切割、颜色和净度是分类变量。它们都有对象数据类型。这些分类变量没有数值。通常,我们需要将它们编码成数值,因为大多数算法在训练过程中只接受带有数值的数据。
但是,CatBoost 的情况并非如此。我们可以在 CatBoost 中直接使用分类特征,而无需对它们进行编码。为此,我们需要通过使用 Pool() 类将我们的数据转换为 CatBoost 的特殊 Pool 数据类型。我们还需要在 cat_features 参数中指定分类特征的名称。
如果我们的数据只有数字特征,我们也可以使用 CatBoost,而无需将数据转换为 Pool 数据类型。如果我们的数据具有分类特征,我们必须在使用 CatBoost 之前将数据转换为 Pool 数据类型。
基于钻石数据的 CatBoost 模型的设计过程非常简单。我们可以选择价格变量作为目标列(y),其余变量作为特征矩阵(X)。我们还从数据集中删除了表、 x 、 y 和 z 变量,因为它们对数据没有太大价值。然后,我们可以将 X 和 y 定义如下:
X = df.drop(columns=['price', 'table', 'x', 'y', 'z'])
y = df['price']
因为价格是一个连续值变量,这里我们需要建立一个回归模型(实际上是一个 CatBoost 回归模型!).为了构建模型,我们使用了CatBoostRegressor()类及其相关的超参数值。对于分类任务,有一个单独的类叫做CatBoostClassifier()。
基于钻石数据构建 CatBoost 回归模型
这是代码。
等到加载代码!
(图片由作者提供)
这个值吗?这是预测误差(残差)的标准差。值越低,模型越好。让我们仔细看看价格变量。
y.describe()
(图片由作者提供)
范围(最大-最小)是 18497。标准差是 3989。因此,我们得到的 RMSE 值对于我们的模型来说是非常好的。另外,请注意,我们是在没有进行任何超参数调整的情况下获得这个值的!
具有分类特征的 LightGBM
在第 5 部分中,我们已经讨论了 LightGBM 也可以不经过编码直接用于分类特征。但是,LightGBM 没有任何内部机制来处理分类特征。
让我们看看如果使用带有分类特性的 LightGBM 会发生什么。
等到加载代码!
(图片由作者提供)
您将得到一个值错误,提示您应该将分类值编码为数值。
但是,等等!LightGBM 有一个简单的方法。我们不需要对我们的分类值进行编码。相反,我们只需要在训练算法之前对 X 做一个数据类型转换(对象数据类型→ 类别数据类型)。
转换前:
X.info()
(图片由作者提供)
转换过程:
for col in X.select_dtypes(include=['object']):
X[col] = X[col].astype('category')
转换后:
X.info()
(图片由作者提供)
现在,所有分类变量都有类别数据类型。因此,我们可以无任何误差地重建模型。
等到加载代码!
(图片由作者提供)
这个 RMSE 值比之前从 CatBoost 得到的值稍微好一点!
结论
CatBoost 是 XGBoost 的一个很好的替代品。如果您有一个包含分类变量的大型数据集,这应该是您的选择。当我们考虑性能和执行时间时,CatBoost 可以优于 XGBoost。但是,LightGBM 比 CatBoost 好多了!
今天的帖子到此结束。在第 7 部分的中,我们将讨论 XGBoost 与 CatBoost 以及 LightGBM 与 CatBoost 的一些性能比较。除此之外,我们还将讨论一些指导原则,帮助您为您的任务选择正确的提升算法。
下一个故事再见。祝大家学习愉快!
我的读者可以通过下面的链接注册成为会员,以获得我写的每个故事的全部信息,我将收到你的一部分会员费。
**https://rukshanpramoditha.medium.com/membership
非常感谢你一直以来的支持!
特别要感谢 Unsplash 网站上的 Nicole Giampietro,她为我的这篇文章提供了一张漂亮的封面图片。
鲁克山普拉莫迪塔
2021–10–31**
如何用 NumPy,SciPy 和 SymPy 解线性方程组?
原文:https://towardsdatascience.com/how-do-you-use-numpy-scipy-and-sympy-to-solve-systems-of-linear-equations-9afed2c388af?source=collection_archive---------5-----------------------
让我们用唯一解、无解或无穷多解来求解线性系统
安托万·道特里在 Unsplash 上拍摄的照片
在线性代数中,线性方程组被定义为具有相同变量集的两个或多个线性方程的集合。同时考虑系统中的所有方程。线性方程组用于不同的领域,如制造、营销、商业、运输等。
当方程和变量的数量增加时,线性方程组的求解过程会变得更加复杂。解必须满足系统中的每个方程。在 Python 中,NumPy(NumericalPython)、SciPy(ScientificPython)和SymPy(SymbolicPython)库可以用来解线性方程组。这些库使用向量化的概念,通过避免许多 for 循环,允许它们有效地进行矩阵计算。
不是所有的线性系统都有唯一的解。其中有些无解或无穷多解。
(图片由作者提供)
我们将用 NumPy、SciPy 和 SymPy 实现来涵盖这 3 种类型的线性系统。可以用几种不同的方式来实现。我们还将在必要时讨论这些不同的方式。在本文结束时,您将能够求解一个线性系统(如果存在唯一的解),并使用强大的 NumPy、SciPy 和 SymPy 库识别无解或无限多解的线性系统。
先决条件
强烈建议学习 NumPy 的基础知识(数组创建、一维数组和二维数组的识别等)。如果你不熟悉他们,不要担心。要获取基础知识,可以看下面这篇我写的文章。
我们开始吧!
线性系统的一个例子
请看下图,它包含了一个线性方程组。
线性方程组(图片由作者提供)
该系统中有 3 个线性方程。每个方程都有一组相同的变量,称为 x 、 y 和 z 。求解这个线性系统意味着找到满足所有方程的 x 、 y 和 z 的值(如果存在)。
线性系统的矩阵表示
上述线性方程组可以表示为一个称为 增广矩阵 的特殊矩阵,它为通过矩阵计算求解线性方程组开辟了道路。
扩充矩阵(图片由作者提供)
这个扩充矩阵有两个部分:
- 系数矩阵— 这是一个矩形数组,仅包含变量的系数。在我们的示例中,这是上图中垂直线左侧的一个 3 x 3 的正方形矩阵。第一列包含每个方程的系数 x ,第二列包含系数 y 等等。行数等于线性系统中方程的数量。列的数量等于线性系统中不同变量的数量。在 NumPy 中,这可以表示为一个二维数组。这经常被赋给一个用大写字母命名的变量(比如 A 或者 B )。
import numpy as npA = np.array([[2, -3, 1],
[1, -1, 2],
[3, 1, -1]])
- 增大— 这是上图中垂直线右侧的列向量。它包含线性方程的常数。在我们的例子中,这是一个 3 x 1 的列向量。在 NumPy 中,这可以表示为一维数组。这通常被赋给一个用小写字母命名的变量(比如 b )。
import numpy as npb = np.array([-1, -3, 9])
用唯一解求解线性系统
让我们用 NumPy 解下面的线性系统。
(图片由作者提供)
为了马上解决这个问题,我们使用 NumPy linalg 子包中的 solve() 函数。
import numpy as npA = np.array([[2, -3, 1],
[1, -1, 2],
[3, 1, -1]])b = np.array([-1, -3, 9])np.linalg.solve(A, b)
输出是:
(图片由作者提供)
哇!上述线性系统有一个独特的解决方案:
- x = 2
- y = 1
- z = -2
注意:类似的实现可以用 SciPy 来完成:
from scipy import linalglinalg.solve(A, b)
这在内部是如何工作的?
直接实现并没有给出这在内部如何工作的清晰概念。让我们推导矩阵方程。
矩阵方程
(图片由作者提供)
让我们用矩阵方程得到同样的解:
np.dot(np.linalg.inv(A), b)
(图片由作者提供)
为了有一个解,应该存在 A 的倒数,并且 A 的行列式应该非零:
np.linalg.det(A)
(图片由作者提供)
求解无解的线性系统
当线性方程组无解时,这样的系统称为不相容系统。让我们看看当我们试图用 NumPy 解下面的线性系统时会发生什么:
(图片由作者提供)
import numpy as npA = np.array([[1, -1, 4],
[3, 0, 1],
[-1, 1, -4]])b = np.array([-5, 0, 20])np.linalg.solve(A, b)
输出是:
错误消息(图片由作者提供)
错误消息说我们的系数矩阵(A)是奇异的。用代数术语来说,就是行列式为零的不可逆矩阵。让我们检查一下:
np.linalg.det(A)
输出是:
(图片由作者提供)
行列式为零。因此,我们的系数矩阵(A)是奇异的。正因为如此,上述线性方程组无解!
注意:如果您用 SciPy 实现它,将会返回一个类似的错误消息。
求解具有无穷多解的线性系统
当一个线性方程组有无穷多个解时,这样的系统被称为相关系统。让我们看看当我们试图用 NumPy 解下面的线性系统时会发生什么:
(图片由作者提供)
import numpy as npA = np.array([[-1, 1, 2],
[1, 2, 1],
[-2, -1, 1]])b = np.array([0, 6, -6])np.linalg.solve(A, b)
输出是:
错误消息(图片由作者提供)
这与前一个案例相同。
注意:如果您用 SciPy 实现它,将会返回一个类似的错误消息。
现在,有一个问题。如何区分无解线性系统和有无穷多解线性系统?有方法。
我们试图将系数矩阵简化为行梯队形式,其对角线上为 1,其他地方为 0(单位矩阵)。如果我们成功了,这个系统有一个独特的解决方案。如果我们无法将系数矩阵放入单位矩阵,要么无解,要么无穷多解。在这种情况下,我们可以通过查看简化矩阵的最后一行来区分无解线性系统和有无穷多个解的线性系统。
得到简化的行梯队形式
我们可以使用 SymPy Python 包来获得简化的行梯队形式。首先,我们创建增广矩阵,然后使用 rref() 方法。让我们用一个具有独特解决方案的线性系统来尝试一下:
(图片由作者提供)
from sympy import *augmented_A = Matrix([[2, -3, 1, -1],
[1, -1, 2, -3],
[3, 1, -1, 9]])augmented_A.rref()[0]
(图片由作者提供)
我们成功了!我们得到了简化的行列形式。第 4 列是解决方案列。解是 x=2 , y=1 , z=-2 ,这与之前使用 np.linalg.solve() 得到的解一致。
让我们用一个无解的线性系统来试试:
(图片由作者提供)
from sympy import *augmented_A = Matrix([[1, -1, 4, -5],
[3, 0, 1, 0],
[-1, 1, -4, 20]])augmented_A.rref()[0]
(图片由作者提供)
这一次,我们没有成功。我们没有缩小的排梯队形式。这个表格的第三行(等式)是 0=1,这是不可能的!因此,线性系统无解。线性系统是不一致的。
最后,我们用一个有无穷多解的线性系统来尝试:
(图片由作者提供)
from sympy import *augmented_A = Matrix([[-1, 1, 2, 0],
[1, 2, 1, 6],
[-2, -1, 1, -6]])augmented_A.rref()[0]
(图片由作者提供)
这一次,我们也没有成功。我们没有缩小的排梯队形式。此表格的第三行(等式)是 0=0,这总是正确的!这意味着变量 z 可以取任何实数,并且 x 和 y 可以是:
- z =任何数字
- x-z = 2 (x = 2+z)
- y+z = 2 (y = 2-z)
将任意一个实数代入 z ,可以得到无穷多个解!线性系统是依赖的。
我们已经完成了任务。现在,您能够求解一个线性系统(如果存在唯一的解),并使用强大的 NumPy、SciPy 和 SymPy 库区分无解的线性系统和有无限多个解的线性系统。
一般的实现是:
先试试 np.linalg.solve() 。如果你得到了一个独特的解决方案,你就完成了任务。如果你得到一个错误信息(“奇异矩阵”),线性系统要么无解,要么有无穷多个解。然后,如上所述,尝试使用 SymPy Python 包获得简化的行梯队形式。通过查看简化表格的最后一行,你就可以决定事情了!
另外,请注意以下几点。
- 上面讨论的方法只能应用于线性系统。换句话说,系统中的所有方程都应该是线性的。
- 如果一个线性系统的方程比变量少,那么这个系统一定是依赖的或不一致的。它永远不会有唯一的解决方案。
- 方程比变量多的线性系统可能无解、唯一解或无穷多解。
我的读者可以通过下面的链接注册成为会员,以获得我写的每个故事的全部信息,我将收到你的一部分会员费。
报名链接:https://rukshanpramoditha.medium.com/membership
非常感谢你一直以来的支持!下一个故事再见。祝大家学习愉快!
特别感谢 Unsplash 网站上的 Antoine Dautry ,他为我提供了这篇文章的封面图片。本帖提供的文字内容、代码示例、其他图片和内容链接,版权归作者所有。
鲁克山普拉莫迪塔 2021–06–12
一个公司如何找到最好的市场来投放广告?
原文:https://towardsdatascience.com/how-does-a-company-find-the-best-market-to-target-their-ads-a717a3c828c7?source=collection_archive---------42-----------------------
使用 Plotly 和 Tableau 识别最佳广告市场。
马约菲在 Unsplash 上的照片
一家虚构的电子学习公司,目前总部设在美国,要求我进行一项调查,以确定推广其产品的最佳市场。他们也想知道学习者愿意为哪种内容付费。
这家公司提供不同的编程课程,包括 web 开发、移动开发、数据科学和游戏开发。Web 开发和移动开发占据了所提供课程的最大份额,学习者需要支付 59 美元的月费才能访问课程内容和资源。
在这篇文章中,我将带你了解我为公司寻找最佳市场的步骤;利用情节和画面。
收集数据
我有两种选择来找到合适的数据——对不同的市场进行调查,或者使用可靠来源的可用数据。考虑到我进行调查的时间和资源限制,我选择使用 freeCodeCamp 2017 新编码器调查。
freeCodeCamp 是一个完全免费的电子学习网站,提供各种网络开发课程。我选择了他们的数据,因为他们经营着一家流行的媒体出版物,目前拥有 60 多万名粉丝。更重要的是,2017 年的调查吸引了兴趣不同的新程序员。
你可以在这里下载数据集。
初始数据探索
我使用以下代码来研究数据集:
import pandas as pd
survey_data = pd.read_csv(‘2017-fCC-New-Coders-Survey-Data.csv’, low_memory = 0)#low_memory prevents dtype warning
survey_data.shape
以下是熊猫数据框的截图:
熊猫数据框中数据集的前 5 行(截屏来自 Yeside Okelana 写的 Jupyter 笔记本
数据集有 18,175 行和 136 列。列名也是不言自明的;这使得分析变得简单明了。
因为我要分析 Tableau 中的数据集,所以我将 Pandas 数据框从我的 Jupyter 笔记本导出到。包含以下代码的 csv 文件:
df.to_csv(r'Path where I wanted to store the exported CSV file\New File Name')
新编码者的利益分配
回想一下,尽管该公司提供的大多数课程都是关于移动和 web 开发的,但他们也提供数据科学和游戏开发等领域的课程。
但是首先,我们需要知道这个数据集有多大的代表性——web 和移动开发也是新程序员的兴趣所在吗?
为了回答这个问题,我为数据集中的JobRoleInterest
列创建了一个频率表,并做了以下观察:
- 相当多的新程序员只对 web 开发感兴趣(全栈、前端或后端开发)。
- 有些人对移动开发感兴趣。
- 少数人对移动和网络开发以外的主题感兴趣。
编码员的兴趣截图(图片来自 Yeside Okelana 的 Jupyter 笔记本
可以查看 Jupyter 笔记本查看频率表。
同时,频率表还显示,相当多的人有多重工作兴趣。因此,找出只对一个主题感兴趣的程序员和对多个主题感兴趣的程序员的比例是很有用的。
为此,我:
- 分割
JobRoleInterest
列,找出每个参与者选择的选项(我先去掉空值),然后 - 使用选项为变量生成频率表。
下面是我为完成这一任务而编写的 Python 脚本:
为编码人员创建频率表的 Python 脚本(由 Yeside Okelana 编写)
然后,我用 Tableau 制作了这个条形图来形象化这个比例。
按兴趣数量划分的编码者百分比(在表格中创建的条形图,由 Yeside Okelana 提取)
显然,大约 32%的程序员对他们想从事的特定编程领域很有把握。
但是,公司是否应该考虑扩展他们的课程设置;事实上,68%的程序员有不止一个兴趣,这将有助于他们决定引入哪种内容。
但是由于我们的重点是 web 和移动开发,让我们看看有多少程序员对这两个主题中的至少一个感兴趣。
我用 Plotly 创建了一个饼图,来直观地展示 web 和移动开发兴趣与其他兴趣的比较
程序员对 Web 或移动开发与其他主题的兴趣(饼状图由耶塞德·奥克拉纳使用 Plotly for Python 制作)
图表显示,大多数(约 86%)编码人员对 web 或移动开发感兴趣。这表明新编码员的兴趣分布与公司的课程分布相匹配。
下一步是确定花费广告预算的最佳市场。
为此,我发现:
- 这些新编码员的位置,
- 编码员数量最多的地点,以及
- 这些地方的新程序员愿意花多少钱来学习。
新编码员的位置和密度
在这个数据集中,我们有两列国家级数据的特权:
CountryCitizen
哪一项描述了编码者的原产国和CountryLive
描述编码者居住的国家。
然而,为了这个分析的目的,我与CountryLive
专栏一起工作,因为营销团队对在人们目前居住的地方投放广告感兴趣。
此外,由于数据提供了国家层面的信息,我将每个国家视为一个市场。
在这个分析中,我通过市场中编码者的数量来定义感兴趣的市场。本质上,一个市场的潜在客户数量越多越好。
我们来看看市场规模…
总体市场规模(图表由 Yeside Okelana 的 Tableau dashboard 生成)
从这个图表中可以看出,45.7%的程序员生活在美国。这是一个相对较大的数据比例。由于 freeCodeCamp 的总部设在美国,预计很大一部分受访者将来自美国。
我们还看到,像印度(7.7%)、英国(4.6%)和加拿大(3.8%)这样的国家构成了前四大潜在市场。
虽然带着这些信息在美国市场进行营销活动很有诱惑力,但为了盈利,了解这些市场的程序员愿意在学习上花费多少也很重要。
收入潜力
我和MoneyForLearning
栏目一起工作,了解该公司在这些市场的收入潜力。本栏描述了参与者愿意为学习花费的金额。
回想一下,订阅费是每月 59 美元。
同时,我将剩下的分析限制在 4 个市场——美国、印度、英国和加拿大,原因如下:
- 这些市场有最高的绝对频率。
- 因为课程是用英语编写的,所以这些国家的官方语言也是英语是有帮助的。因此,广告有更高的机会接触到正确的受众。
接下来,我创建了一个名为money_per_month
的新列,它描述了一个学习者每个月在学习上花了多少钱。我通过将MoneyForLearning
列除以MonthsProgramming
列来创建这个列。然后,我将每个市场的价值可视化在一个条形图中,如下所示:
前 4 大市场每月的*均收入(在表格中创建了图表)
从柱状图中,我们可以看到,*均来说,美国的学习者愿意支付最高的月费。
然而,如果我们考虑一些社会经济因素,如人均国内生产总值,那么人们可能会问为什么印度的学生愿意比英国甚至加拿大的学生支付更多的钱。
可能是加拿大和英国的数据代表性不足,或者是印度数据中存在异常值,使得*均值过高,或者是英国数据中存在异常值,使得*均值过低。也有可能数据是正确的。
让我们进一步调查,以得出结论。
处理极端异常值
我利用money_per_month
列来可视化可能的异常值。
下面的方框图显示了 4 个市场的money_per_month
值。
前四大市场每月的资金分布情况(图表由 Yeside Okelana 在 Tableau 中创建)
乍一看,我们无法从这个箱线图中确定印度、加拿大和英国是否存在极端异常值。但是美国有明显的极端异常值——2 个人表示他们每月支付超过 50,000 美元,这很奇怪,但并非不可能。
然而,出于分析的目的,我排除了大于$20,000 的值。
排除大于 20,000 的money_per_month
值后,*均值发生变化。看看新的价值观:
Yeside Okelana 制作的条形图截图
下面是一个显示剩余值分布的箱线图:
图片来自方框图由叶塞德·奥克拉娜在 Tableau 中创作
看方框图,很明显还是有几个极端的异常值。印度的值大于 2500 美元,美国的值大于 6000 美元,加拿大的值大于 5000 美元。
我进一步分析了这些值,并根据某些标准剔除了一些异常值。
例如,我观察到,印度有 6 名受访者表示,他们花了 2500 多美元学习,但没有人参加训练营。
我认为,受访者输入如此高价格的一个可能原因是他们误解了“除了大学学费,到目前为止,您在学习编程上花了多少钱(以美元计)?“所以,他们一定输入了他们的学费。我消除了这样的争吵。
你可以在 Jupyter 笔记本中获得我使用的淘汰标准的全部细节。
这是一个条形图,显示了每月花费的重新计算的*均值。
前四大市场每月*均收入(截图摘自 Yeside Okelana 制作的 Tableau 图表
…以及每个市场中money_per_month
分布的最终箱线图。
前 4 个市场的每月货币值分布(方框图由 Yeside Okelana 在 Tableau 中创建)
我们现在已经非常接*确定最佳广告市场了。
选择最佳市场
很明显,在这 4 个市场中,美国是我们绝对应该做广告的一个市场,因为大多数新程序员目前都住在那里,他们愿意花高价学习(*均 143 美元)。
加拿大似乎是第二个要考虑的市场,因为学习者愿意支付比在印度和英国更高的价格。
然而,有几个原因可以解释为什么将印度视为第二好的市场会更好。他们在这里:
- 对于印度的潜在客户来说,每月 59 美元的订阅费似乎并不贵,因为他们*均可以支付 66 美元。
- 印度的潜在客户几乎是加拿大的两倍。
前四大市场中每个市场的规模(由耶塞德·奥克拉纳用画面创建)
不清楚我们应该在印度和加拿大这两个市场中选择哪一个。因此,我们有三个选择。
选项 1
把广告预算全部花在美国市场上。
选项 2
利用市场规模的比例,在美国和印度或美国和加拿大之间划分广告预算,如下所示:
- 美国为 86%,印度为 14%。
- 美国为 92%,加拿大为 8%。
选项 3
利用市场规模的比率,在美国、印度和加拿大之间划分广告预算如下:
- 美国为 80%,印度为 13%,加拿大为 7%
然而,这些选项最好由营销团队仔细检查,然后他们将利用他们的领域知识在印度和加拿大进行新的调查。有了新的调查,我就可以对新数据进行进一步分析,做出更明智的决策。
同时,根据现有数据,没有考虑英国市场,因为*均money_per_month
低于订阅费。
结论
这个项目的目标是找到做广告的最佳市场。根据我对 freeCodeCamp 2017 年新程序员调查的分析,很明显美国是一个很好的广告市场。但是在印度和加拿大之间做决定并不容易。
然而,我认为,营销团队将处于最佳位置,要么使用此分析的结果来确定要考虑的其他市场,要么创建一个新的调查,以便做出更明智的决策。
DQN 如何逼*贝尔曼方程?
原文:https://towardsdatascience.com/how-does-a-dqn-approximate-bellmans-equation-53e591d5e33?source=collection_archive---------35-----------------------
建立直觉
这是那些可能比自己发现更难解释的事情之一。在深度 Q 学习中,贝尔曼方程由 DQN *似的方式在直觉上并不明显。这篇文章是关于我对正在发生的事情的探索。一个简单的 DQL 模型,其代码可在这里获得,有助于可视化 DQN 学习,并揭示了算法如何迭代和向固定点前进。如果感兴趣,下载模型并调整参数,以探索它们的效果和相互依赖性。
为什么这种洞察力是有用的?因为它导致在配置与经验重放相关的超参数(如缓冲区大小、采样批量大小、目标更新频率)时做出更明智的决策。它也有助于解释意外结果或不稳定性的一些原因,特别是在训练有限数量的数据时。
本文假设读者熟悉深度 Q-Learning,并且具有经验重放和双(策略和目标)DQN 实例的典型实现的工作知识。有太多关于强化学习、Q 学习和深度 Q 学习的参考文献。DeepLizard 的这一系列四教程、 Tambet Matiisen 的文章“揭秘深度 RL ”以及 Jonathan Hui 的 RL - DQN 深度 Q-Network 就是这样三个参考资料,它们为本文奠定了基础,并提供了引入该主题的补充方式。
DQN 被训练来*似的贝尔曼方程的形式是:
采取行动 a 后状态 s 的 Q 值是括号中表达式的期望值,由此从(s,a)到新状态 s '和奖励 r 的映射从经验重放历史 h 中导出。括号中的表达式是该步骤的奖励与新状态 s '的贴现最大 Q 值的总和,其中 a '是最大化行动。贴现因子为 γ。
双 DQN 的实现,使用两个相同的神经网络实例:策略 DQN 和目标 DQN。政策——DQN 是用于制定每一步决策的地方,也是所有培训发生的地方。目标 DQN 只是策略 DQN 的快照的被动副本,每步都会被替换。这是通过简单地复制其权重来完成的。设 l 为跟踪这些 τ 步循环的序号。在周期 l 期间的目标 DQN *似于在周期 l-1 期间学习的策略 DQN 函数。当然,这假设 DQN 的架构是正确的,并且能够学习接*目标 Q 值,我们认为这是给定的,这超出了本文的范围。
为了直观显示目标和政策 Q 值随时间的变化,并展示它们如何捕捉任意大量的未来贴现回报,我们将进行两种简化:
- 我们将我们的环境限制为只有一个动作,使动作选择具有确定性。这消除了在比较不同轨迹的累积未来回报时的任何模糊性,并确保我们是在比较苹果与苹果。
- 我们用五个随机特征(可以是任何数字)构建状态,取值从 0 到 1,奖励总是设置为这五个值的*均值,即每一步的期望值相同。因此,累积奖励单调增加并接*一个固定点,即*均奖励乘以γ的幂的和的渐*极限:
我们使用这个数学表达式来生成未来奖励的每个深度级别的理论贝尔曼方程结果,并将这些值与每个步骤中相应的目标和政策 DQN 生成的值进行比较。
考虑到这两种简化,我们可以将贝尔曼方程简化为:
其中 t 表示沿着确定性轨迹的步骤序列。上面的函数是尾递归的,和原来的贝尔曼方程一样,可以简化为一次迭代。此外,如我们所见,第二项形成一个收敛于一个不动点的级数。为了说明这是如何工作的,让我们用循环序列 l 来解开递归标记级数的每一级:
未来奖励的进展
第一个公式简单地计算 Q 作为步骤 t 的奖励。第二个和每个后续公式通过增加一个未来折扣奖励的步骤使计算更加精确。显然, l 的每一次增加都对应于贝尔曼方程右侧的一个额外嵌套项:
用贝尔曼方程研究未来报酬的级数
这个 Q 函数阶梯对应于由目标 DQN 在由 l 表示的周期序列中捕获的快照阶梯。最初,目标 Q 函数是第一个方程,其中 l =0 。每个新周期 l 开始于将目标与策略 DQN 同步,随后训练策略 DQN 以接*贴现未来奖励的附加水*( l+1 )。在每个周期中,DQN 接*由贝尔曼方程定义的固定点。
这看起来像是可以通过迭代实现的递归函数的教科书示例。不同之处在于,该循环不是简单地聚集数据,而是“递归地改进”非线性函数,即策略 DQN,其模拟收敛序列,即贝尔曼方程。在每次迭代期间,DQN 被训练到极限的更好的*似值,即固定点。因为我们使用迭代而不是递归,我们的过程要求我们在训练期间覆盖策略 DQN 的相同实例。目标 DQN 就像一个“变量”,它保存了在生成目标时使用的最后一次迭代的策略 DQN 的副本。每一次迭代都需要 k 步,但是如果我们选择设置 k=1,那么我们的双 DQN 实现将会崩溃(或者变得类似于)为单个 DQN 实现。
让我们来看看所有这些与 DQN 架构和相关超参数相关的一些含义。但是首先,我们总结一下我们使用的符号:
k 是目标更新事件之间的步数
m 是一集的步数(假设没有终端状态)
m/k 是一集的目标更新事件数
l 是截至时间 t 的目标权重更新总数
b 是来自重放缓冲区的每批重放样本的经验数
DQN 的训练不能捕获比 l 更多的未来折扣奖励水*:【DQN】不能将比执行的目标权重更新的次数更长的未来折扣奖励范围纳入其贝尔曼方程的*似中。即使 k 比成功训练策略 DQN 所需的时间长得多,也是如此,因为用于训练的目标被限制为比前一周期的目标多一个级别。即使每个周期的训练都很完美,目标也会被训练到 l 的水*。
γ的高值需要更大数量的目标权重更新: 考虑选择**= 0.95需要l= 45次迭代来覆盖在折扣 Q 值中贡献 10%或更多的所有项。这是因为γ⁴⁵=0.10。对于γ= 0.8只需要大约l=10 次迭代自γ⁰= 0.11。这说明了为什么设置γ= 1或非常接*它会有问题。通常,我们希望接*渐*极限的 10%以上,因此我们必须确保允许足够的目标更新来充分训练 DQN。为了包括所有贡献超过 1%的未来奖励,这两种情况所需的迭代次数分别为 90 和 21。最小迭代次数由表达式log(d)/log(γ)给出,其中 d 是最小可接受折扣,而 γ 是折扣因子:**
log(0.01)/log(0.95)= 90
log(0.01)/log(0.80)= 21
*用于将策略 DQN 训练到每个新目标的示例数量是 bk: 可能需要调整一批中的经验数量,以便在一个训练周期中使用足够的经验。当然,训练可以持续不止一集。
第 1 次迭代期间的训练对于所有级别 i ≤ l 连续进行: 学习通常比上面的讨论所表明的更流畅且更少条块化。例如,一个目标迭代的训练可能在分配的 k 步骤中只部分完成。对于单个 DQN 的情况或者如果 k = 1,这显然是这种情况。训练优化所有未来奖励等级,最高(但不超过) l 。
设置 k=1 模拟单个 DQN 的情况:使用单个 DQN 作为政策和目标,只要它收敛,将可能*似于贝尔曼方程。这个场景相当于有两个实例,并且在每一步都更新权重,即k= 1,从而策略 DQN 的训练量只受批量 b 的控制。**
****避免重放缓冲区中的陈旧体验:较长的重放缓冲区可以容纳更多种类的体验和更大的批量样本。根据应用,这可能是所希望的。然而,如果缓冲区跨越多个情节,特别是如果相同的数据集范围被重复用于训练,这可能导致不稳定。原因是,从混合了新的和陈旧的经验的缓冲区中取样可能会导致不同的轨迹和不同的奖励,从而导致不一致或倒退的学习行为。这更有可能发生在有噪声的数据中。比方说,在训练的早期阶段,一个特定的状态倾向于动作 1,而在训练的后期,同样的状态倾向于动作 2。如果两个体验都存在于重放缓冲区中,选择较早的一个将会适得其反。避免这种情况的一种方法是让重放缓冲区安全地变大,但不要大到有采样陈旧体验的风险。
DQN 有效性,低 l 和/或嘈杂的数据可以被混杂: DQN 架构的不足之处,或嘈杂的环境可以造成跳动的损失。不仅绘制损失图,而且分别绘制目标 Q 值和预测 Q 值也有助于分析。如果*台以与目标重量更新相对应的间隔出现,则有理由怀疑训练没有充分渗透到足够的未来折扣水*,或者更新必须更频繁,或者可能需要更大批量或更长时间的训练。如果这发生在训练过程中,请考虑在以前没有训练过的数据中形成新机制的可能性。
对于较小规模的训练数据,考虑到γ,k,l,b,m: 之间错综复杂的依赖关系, γ 的值越高,说明足够的目标更新 l 对于确保未来奖励折扣的足够深度越重要。请记住,正是目标更新频率扩展了未来折扣奖励的范围,因此如果您需要 γ 非常接* 1,您可以考虑单个 DQN(如果它收敛),或者具有较小k 的双 dqn 增加批量 b 可以补偿较短的迭代。为了提高稳定性,尽量允许足够多的例子b***k在每个目标迭代内进行训练。每个周期培训所需的示例数量也取决于数据的性质和 DQN 体系结构。
一个具有单一动作环境的普通工作 DQL 有助于说明这些要点。你可以在 this GitHub repo 获取代码。该状态包含五个取值在 0.0 和 1.0 之间的随机特征。回报总是这五个特征的*均值。下图显示了以三种不同方式产生的随机批次经验样本的*均 Q 值:(1)政策 DQN,(2)目标 DQN,以及(3)根据前面所示的每个 k 步骤的 Bellman 方程的扩展计算出的理论值。该情节长 12000 步,目标更新每 1000 步发生一次,并且批量样本大小为 250 次经历。该图清楚地显示了从 Q=0.5 开始,每 1000 步增加一个折扣项,这些值如何在理论级数后达到*稳状态。我们用贴现因子 γ = 0.8。奖励的期望值总是 0.5,作为(0,1)中 5 个随机值的*均值。
k=1000,b=250,m=12000
大批量和长(1000 步)目标更新间隔导致低方差并允许快速收敛。数列收敛到的渐*极限是r/(1-γ)= 2.5forγ= 0.8r= 0.5。**
通过将目标更新频率加倍到 2000 步,如下图所示,适合该集的六个周期不会从上一次运行的前六个周期扩展未来的奖励深度,并且它们最终与目标更新频率为 1000 时处于相同的水*。正是级别的数量将贝尔曼方程的精确度限制在未来奖励折扣的 6 个级别。实际上,每一级似乎都可以通过少量的步骤被充分训练到新的水*。当然,在更复杂的环境中,可能需要更多的示例来实现充分的培训。
k=2000,b=250,m=12000
接下来,我们将更新目标频率设置为 1,并将批处理设置为 1000。下图显示了理论线如何以接*垂直的方式达到渐*值,而目标值和政策值需要接* 1500 步才能达到该水*。这演示了如何同时训练多个深度级别,最多可达权重更新事件的数量。
k=1,b=1000,m=12000
我们重复相同的运行,但使用较小的批量:250。请注意,方差增加,训练变得更加紧张,
k=1,b=250,m=12000
你可以尝试批量大小、目标更新间隔、未来奖励折扣因子的不同组合,甚至尝试 1、2 或 3 个隐藏层的不同 dqn。“readme”文件概述了代码以及如何通过配置文件更改超参数。
一个 AI 是如何想象宇宙的?
利用生成性对抗网络生成新的世界、星系和恒星
由 Unsplash 上 Greg Rakozy 拍摄的照片
外面有什么?在这个浩瀚、无限、不可思议的宇宙中……有史以来,恒星、行星、星云、天体都在碰撞、绕行、诞生、消亡。
照片由腾雅特在 Unsplash 上拍摄
人类总是着迷地仰望天空,想象着梦幻般的世界和遥不可及的星系,这促使人类利用科学来更好地了解宇宙。
多亏了现代望远镜,我们现在可以仰望星空,发现许多关于宇宙和我们自己的真实面貌。
杰里米·珀金斯在 Unsplash 上拍摄的照片
太空也一直是全世界艺术家的灵感来源,他们甚至创造了一个专门用于天文学的特殊流派,即“太空艺术”,来展示宇宙的奇迹。几个世纪以来,产生了无数的艺术作品,从 1301 年乔托的《东方三博士的崇拜》中天空中的彗星,到展示遥远、迷人和想象中的星系的现代艺术作品。
杰里米·珀金斯在 Unsplash 上拍摄的照片
因此,几个世纪以来,我们已经看到了科学家是如何发现宇宙的,艺术家是如何想象和抽象宇宙的,但人工智能会怎么想呢?它会如何想象宇宙?
我们现在能够回答这些问题,这要归功于生成性对抗网络(GANs),这是一种能够查看一系列图像并生成新的可信图像的神经网络!
gan 由两个截然不同的网络组成,一个是生成器,一个是鉴别器,这两个网络是相互对照的。生成器查看输入数据,试图生成新的可信图像,以欺骗鉴别器。另一方面,鉴别器试图理解给定的图像是生成的还是原始的。当生成器在生成图像方面变得足够好以至于骗过鉴别器时,除了输入数据中存在的例子之外,它还可以用于创建其他可信的例子。
作者图片
然后,我创建了一个小型数据集,其中包含 600 个真实空间场景的例子,包括行星、星云、星系和恒星,以及虚构的空间主题绘画和艺术品。这些图像将成为我们的 GAN 的输入,并将作为它理解空间是什么的知识库。
有了这些数据,我首先训练了一个能够生成 128x128 像素图像的小型 GAN,然后是一个轻量级的 StyleGAN,这是目前最强大的 GAN 之一。
让我们来看看由小甘生成的一些最精彩的图像!
图片由作者
在这个奇妙的网络生成的宇宙中,行星、太阳和星系可以清晰地分辨出来,它们明亮的颜色照亮了黑暗的空间,这是通过一个相当小的网络和一些样本图像获得的。
但是网络是如何实现这些结果的呢?这一切都始于简单的噪声,图像以一种几乎随机的方式生成,生成器网络逐渐学会进化以欺骗鉴别器网络。
让我们来看看随着时代的推移,甘是如何生成图像的:
图片由作者
这些是小 GAN 获得的结果,现在让我们看看轻量级版本的 StyleGAN 能够生成什么!
图片由作者
惊人的和非常现实的图像!以下动画展示了 GAN 实现这一奇妙结果的过程:
图片由作者
但是我们想要更多。为什么要满足于产生单一的天体呢?我们想要创造一个完整的宇宙!
好吧,也许让一个 GAN 自己生成宇宙的一部分有点过分了。然而,我们可以从哈勃望远镜中获得灵感,该望远镜能够通过将对宇宙各个部分的观察结合在一起而组合出一幅广阔的宇宙图。我们不能做些类似的事情吗?
幸运的是,我们不需要建造一个巨大的望远镜来获得我们的观测结果,因为七年前在 Kaggle 上开始了一场比赛,以训练一个可以区分不同类型星系的分类器。一个巨大的数据集被建立起来并公之于众,该数据集包含了由望远镜捕捉到的成千上万的各种大小、形状和颜色的星系的真实图像。
有了这么多数据,不尝试利用我们的星系来产生新的星系将是一种浪费,你不这样认为吗?我已经完成了,这些是模型生成的图像:
图片由作者
太棒了。有了这些结果,我们可以将这些图像组合在一起,生成一个广阔的宇宙视图!为了做到这一点,我们的 GAN 生成的图像将与其他正方形和中性图像相结合,以在空间的各种随机区域中给出空白空间的感觉。
一些中性瓷砖的例子。图片由作者提供。
所有这些图像将被随机混合,调整大小,旋转,最后组合成一个大图像!
各位,这就是,甘宇宙!
图片由作者
我们已经到达了旅程的终点。我们让自己陶醉在这些奇幻的世界里,在无尽的宇宙中迷失了自己的心智。当然,那里有无限的星系和行星,迷人而遥远,还有更多我们可以想象和绘制,今天甚至可以自动生成,但有一点是肯定的,我们所有人都应该清楚:
在无限的宇宙中,只有一个地球。
美国宇航局在 Unsplash 拍摄的照片
这种意识加上我们*年来目睹的可怕的灾难性现象,应该促使我们思考保护我们星球的健康是多么重要。政府间气候变化专门委员会(IPCC)的科学家最*敲响了警钟,称人类为红色代码。人类活动导致气温急剧上升,降雨模式发生变化,海*面上升,全球野火数量显著增加。
法比安·琼斯在 Unsplash 上的照片
在日常生活中养成良好的习惯当然是抵消这种现象的好方法,但最大的影响当然可以由政府通过立即有效的监管来实现。否则,简单地说其他人应该带头并不是一种建设性的态度,因为这篇文章的许多读者都对机器学习的世界感兴趣,我收集了一些可能的起点,以产生具体的影响。
看星星,但保护你的地球。
执行类似实验的代码现在可以在 Github 上获得!
参考资料和见解
1《大卫·柯考米尼》。"机器学习专家应不应该响应气候变化号召行动起来?
[2]“约瑟夫·罗卡”,“理解生成性敌对网络(GANs) ”
[3]“罗汉·贾格塔普”,“生成性对抗网络(GANs)综合指南”
[4] "Ian J. Goodfellow 等人","生成性对抗网络"
[5]“d .哈维等人”,“银河动物园——银河挑战”
[6]“luciduals”,“ StyleGAN2 Pytorch 实现
[7]“luciduals”,“轻量级 StyleGAN Pytorch 实现”
[8]“美国国家航空航天局”,“哈勃天文学家汇集广观不断演化的宇宙
【9】《维基百科》,什么是太空艺术或天文艺术?
[10]“IPCC”,“气候变化广泛、迅速、加剧
ASR 系统如何处理从未见过的单词?
原文:https://towardsdatascience.com/how-does-an-asr-system-handle-never-before-seen-words-55a27bc40a4c?source=collection_archive---------36-----------------------
语言的教训:Dialpad 的数据科学研究团队正在进行的系列中的第一篇
首先,如果你是自动语音识别(ASR)的新手,一定要看看我同事的 ASR 101 帖子。这些信息会派上用场,因为今天,我们将更进一步,看看如何训练 ASR 系统。具体来说,就是学习从未见过的新单词。
传统的 ASR(自动语音识别)系统有三个主要组件:
- 声学模型,
- 语言模型,以及
- 发音词典。
发音词典包含单词及其相关发音(在某些情况下是多个发音)。在这种类型的系统中,任何不在本词典中的单词都不会被输出到抄本中。
即使字典里有成千上万的单词,我们也需要一种方法来不断更新它,以确保我们为客户提供最准确的抄本。(我们的词汇和俚语总是在进化!)
因此,如果我们的转录系统在音频中遇到一个单词是字典中的而不是,它将使用字典中的单词以及听起来与所说的相似的单词来猜测所说的内容。
例如,我们的公司名称可能会出现为“拨号键盘”,而当 COVID 第一次出现时,它被转录为“觊觎”。
我们训练模型的方法之一是将音频发送给一组转录员,他们转录音频,这为我们提供了音频中所说内容的高度准确的表示。我们可以将从这个团队获得的数据与我们自己的词典进行比较,以识别当前不在词典中的单词。
*均来说,每 1000 个单词中大约有 6 个是我们的字典中没有的,我们称之为“词汇之外”的单词,或 OOV。
OOV 里有什么?(有 6 种类型)
你可能想知道,在一本已经包含成千上万个词条的字典中,还会缺少哪些词呢?我们对其中的一小部分进行了分析。它们主要分为六个不同的类别:
1.人名——46%
绝大多数 oov 都是人名。由于各种原因,人名给 ASR 系统带来了相当大的挑战。
许多名和姓有多种拼法和发音。还有大量不同的名字,特别是当我们努力包括来自许多不同起源的名字,而不仅仅是西方国家常见的那些。
例如,这里列出了“基拉”这个名字所有可接受的拼法:凯拉、凯拉、凯拉、基拉、基拉、凯拉、凯尔哈、基利亚、凯拉、基拉和希亚拉。
2.真实 OOVs — 24%
大约四分之一的单词是我们确定为“真实”的未登录词。这些英语单词还没有进入我们的系统,可能是因为它们很少使用,或者是最*才被纳入我们的日常用语。
你可能遇到的一些“罕见用法”的例子包括“亚热带”和“嵌入”,而一个最*在使用中爆炸的词的好例子可能是“煤气灯”
3.首字母缩写— 20%
我们审查的单词中,大约有 20%是首字母缩写词,它类似于首字母缩写词,但发音是组成它们的字母,而不是单词。
例如,NASA 是首字母缩写,CRM 是首字母缩写 ASAP 可以两者都是!任何一个最*开始新工作的人都会告诉你,公司喜欢用很多首字母缩写!
我们希望确保我们能够识别它们,以正确地设置它们的格式,并能够将它们与说话者实际拼写单词的时间区分开来。
我们需要 EOD 把这个交给首席执行官。
对
我的电子邮件地址在 Dialpad dot com 拼写为 J-O-N-E-S。
4.公司名称— 8%
我们看到的公司名称通常分为两类:
- 那些发音像一个或几个常用词的词——想想 LinkedIn = linked in 和 Zoom = zoom,还有
- 那些没有的,比如 Deliveroo 和 Pinterest。
无论发音如何,我们都需要能够识别这些名称,以便正确地转录和格式化它们。我们遇到的一个公司名称的例子是 Spiceworks。
在不知道有一家公司叫这个名字的情况下,我们的文字记录会简单地将其转录为“spice works”
5.语言创新——2%
最后一类英语未登录词,诚然,也是我个人最喜欢的,是我们说话者的语言创新,也就是所谓的“实际上并不存在,但有人说过的单词”
人类非常擅长塑造词语来传达意思,而不会扰乱听者的理解!我最*遇到的一个很好的例子是“informationable”这个词,这个词没有出现在韦氏词典,但仍然能够传达“提供信息的能力”的定义
在这一类别中,我们经常看到的另一个例子是通用商标现象,或者当专有商标开始被用作产品或服务整体的描述符时。
当人们把一个品牌名称修改成一个动词时,比如“我在 Craigslisted 上卖了我的旧手机”,它最常以 OOV 的形式出现
6.非英语单词— 1%
一小部分单词是非英语单词。在大多数情况下,我们的字典中不包括其他语言,除了那些说英语的人常用的语言。
这方面的一个例子是来自短语“途中”的单词“en”,它源于法语,但在英语会话中常用。
到目前为止,这一直是我们的政策,但在阅读了一篇关于这种方法相关问题的引人注目的文章之后,我们将寻求在我们的产品中更公*地支持来自不同语言和文化的外来词。
我们还能如何识别 OOVs?
语言很棒,也很复杂。上面描述的方法甚至还不足以识别对话中经常使用的所有行话、缩写和名字。
我们正在处理数百万分钟的对话,而只有极小一部分被发送出去进行转录。
为了尝试和减轻这种情况,我们为客户提供了通过他们的公司词典直接向我们提交这些单词的选项,这样我们可以快速将它们添加到我们的发音词典中,并在提交后两周内开始在我们的文字记录中识别它们。
这是迄今为止最有效的方法来帮助提高这些单词在你的成绩单上的准确性。完整过程如下所示:
图像由拨号盘提供
添加提交内容不仅有助于提高您自己的文字记录的准确性,也有助于使用相同术语的其他客户!我们还有一种更主要的方式来识别 oov,那就是通过一个叫做网络搜集的过程。
本质上,我们从客户的网站上提取数据,并对文本进行分析,以将产品名称或行话等重要术语与“the”等常用词区分开来。
这是一个非常成功的方法,因为它提供了一个团队使用的术语的更全面的视图。虽然使用公司的字典很好,但做条目的人可能会使用与不同团队或不同部门的人不同的词。
将字典与网络搜集的数据配对,可以让我们有一个更完整的可能出现在用户记录中的术语列表!
欢迎来到有史以来最大的语言课堂
我们一直在寻找新的关键短语来源,以包含在我们的模型中,并寻找其他方法来提供更准确的副本。
我们为客户的数据开发最准确的副本的旅程得到了客户的大力帮助,他们花时间在他们的公司字典中提供了周到的条目。
人工智能是如何创造价值的?
原文:https://towardsdatascience.com/how-does-artificial-intelligence-create-value-bec14c785b40?source=collection_archive---------34-----------------------
从更哲学的角度看待这项技术的影响
照片由来自 Pexels 的 Tara Winstead 拍摄。
过去的十年充满了喧嚣和热闹——没有新闻。然而,现在各个行业(至少从人工智能顾问的角度来看)对新的人工智能技术和方法的普遍兴趣和吸收有了明显的转变,从深奥到奇异,再到害怕过时。
行业和客户比以往任何时候都更愿意使用相对较新的(甚至未经证实的)数据处理和见解提取方法来参与原型和放大工作。但正如大多数顾问发现的那样,机器学习的简单应用并不能带来成功的解决方案。需要解决一个潜在的问题,一些可测量的结果和回报至少比实现成本高一个数量级。
那么价值通常是如何创造的,人工智能又是如何为价值创造做出贡献的呢?而且有没有一种模式可以解释为什么 AI 这么有价值?
理解现代经济中的价值创造
“价值”有许多定义,但为了我们的目的,我们将把它定义为“对某物的重要性、价值或有用性的现代经济衡量”(来自牛津语言)。由此可见,一个经济体系中的价值创造思想,直接关系到创造财富、降低运营成本,或者加速和减轻个人的工作负担的能力。
(现在,衡量人工智能的社会影响是一个完全独立的话题,我甚至不想在这里提出来。此外,我完全意识到我将屠宰经济学 101 概念,但我概括了这篇文章的要点和主要信息。)
超越(旧)工业的三部门模式
经济价值创造的一个流行模型是三部门模型,其中 20 世纪的经济价值观被分为三个主要领域:
- 第一产业集中于资源的开采和控制,如铁、木材和采矿;
- 第二产业侧重于制造、转型,直至交付消费品;
- 第三产业通常被称为服务部门,包括政府、咨询和知识工作者的所有事务。
这一特殊模式广泛关注价值创造的提取基础,包括对环境和对人的价值创造。还有一种资源有限的想法:只能有这么多技术工人,或者这么多树可以砍伐。这种经济模式的参与者主要被视为劳动者:伐木工、冶炼工、餐馆服务员。你通过 1)去上班,2)做好工作来获得报酬。
然而,这一模型未能捕捉到在这些部门中的每一个都有效所需的潜在知识。仅仅在森林附*给某人一把电锯并不意味着我可以每天安全可靠地获得一定数量的木材。
超越三个部门:知识经济
也被称为第四次革命和信息时代,知识经济模型允许所有信息事项(如市场洞察、算法和流程)被表示为有价值的信息,工人现在成为思想家。
来自维基百科:
知识经济的特点是在微观经济和宏观经济环境中拥有高度熟练的劳动力;机构和行业创造需要专业技能的工作岗位,以满足全球市场的需求。知识被视为附加 输入劳动力 和 资本 。原则上,一个人的主要个人资本是知识以及创造经济价值的能力。
那么如果知识是有价值的,那么那个应用的自动化应用不也是有价值的吗?事实上,这就是自动化作为一个整体,特别是软件的用武之地。我可以将我的知识编码成一系列可重复的步骤,这些步骤将产生预期的结果,甚至是结果。
(关于这个编码过程的有趣事实是:软件开发人员,作为一个阶层的人,经历了巨大的https://www.zdnet.com/article/developer-burnout-isnt-going-away-employers-need-to-act-now/。我也经常听到我的团队使用让水手脸红的语言。)****
回到未来——与 ML 一起
从这些不同的模型中退一步,我们正在寻找关于人工智能的高层次问题的答案,以及在给定适当数据的情况下,人工智能在大多数情况下变得有价值的一般能力。
如果我们将三个部门模型抽象为活动类型,我们会注意到数字相关价值创造要素的三个可重复方面。这对技术领域的许多价值创造链是一个有益的启发。将这三个部门抽象为价值创造的一般要素,我们得到:
- 提取和收集,涉及通过从其原始环境中分离、隔离或复制特定单位而进行的积累。
- 转换,涉及到对这个单元应用一个或多个改变(比如处理或消化),这样它在不同的状态下可能更有用,通常是对它类的所有其他单元,有时是对这些单元的多个类。
- 信息,即与前两类相关的知识或诀窍(如在哪里提取、如何转化)。
数据及其价值创造元素的简单表示。
例如,在采矿业中,知道在哪里挖掘与知道如何操作将矿石从地下开采出来的机器同等重要。
(事实上,可以用一个案例来说明现代咨询是如何简单地利用信息差异的——你知道如何做一些我不知道的事情,而我需要这些知识,因此在我目前的情况下,你的知识是有价值的。)
知识经济中的价值:数据转换光谱
数据移动、改变和通知的方式是在知识经济内外创造经济价值的前提。我们终于看到了 21 世纪初大数据推动的结果,现在有办法让它变得可行。
如果我们采用所有形式的数据(无论是原始的、未收集的状态,还是经过润色的公司报告),并将它们放入按细化级别组织的桶中,我们可以创建五种主要状态:连接性、可见性、聚合、见解生成和决策支持。
数据转换类别。类别是什么真的不重要,更重要的是有一个独特的桶的概念。
这个数据转换谱是一个简单的模型,可以在高度互联的世界中用作技术创新的灵感。它涵盖了数据作为主要资源的价值创造的许多潜在方面。
公司将付费获得连接的、可见的、聚合的、可理解的和/或自动化的东西。
简而言之,当数据在整个范围内移动时,价值就产生了。
那么,为什么人工智能具有如此大的变革性呢?
机器学习是第一个可以应用于数据转换范围内价值创造链的每个方面的技术范式。由于其深度和广度,数据科学和机器学习工程的结合允许洞察的产生、工作的加速和对链上每个组件的调查支持。
人工智能如此有价值的原因是,它在数据转换的每个支柱内部和之间提供了价值创造的元素。
数据转换领域。
这就是为什么人工智能可以创造如此多的价值:它适用于几乎任何给定的数据相关背景,提供某种价值(通过操纵数据或在其背景下生成结果),并允许越来越多的自动化和来自数据的洞察力。
摘要
- 价值是通过一个能产生金钱、降低成本、减轻资源和劳动力负担的系统来创造的。
- 从历史上看,价值是由体力劳动创造的;现在,在知识经济中,信息和可再生的软件意味着降低分担负担的成本。
- 通过技术创造价值的基本要素是收集和提取资源,将这些资源转化为新元素,以及如何实现前两者的知识。
- 从数据中提取见解(有价值且可操作的信息)的能力贯穿于整个转型过程。
- 人工智能在这个光谱的每个支柱上创造价值。
咨询愉快!
马特。
如果您对本文或我们的 AI 咨询框架有其他问题,欢迎通过LinkedIn**或通过email联系。****
你可能喜欢的其他文章
- 实施企业人工智能战略
- 在人工智能部署中实施防御性设计
- 离群点感知聚类:超越 K 均值
- 深度学习图像分类器的罗夏测试
- 为客户提供人工智能原型作为营销策略
Azure Kubernetes 服务如何执行零停机更新?
原文:https://towardsdatascience.com/how-does-azure-kubernetes-service-perform-zero-downtime-updates-99820e17a84a?source=collection_archive---------19-----------------------
诺德伍德主题公司在 Unsplash 上拍摄的照片
本文给出了工作流的概述,并演示了如何通过 python 更新已部署的模型
机器学习模型有一个生命周期,这个周期的一部分是再培训/重新部署。模型需要更新的原因有很多(例如,特征漂移、协变量和目标之间的不同关系、改进、定期刷新等)。假设模型是Azure Kubernetes Services(AKS)中的一个实时应用,我们如何在不中断服务的情况下更新模型?
假设 :熟悉 Azure 机器学习软件开发包(SDK)和 Kubernetes 。
来源:史蒂文·洛艾萨
Kubernetes 更新工作流
Kubernetes 提倡部署模型的零停机更新。换句话说,建模服务不会被更新中断,它将继续处理请求而不会出错。
更新以分阶段的方式执行,以确保应用程序不受影响。假设您已经在 Azure Kubernetes 集群上部署了容器映像(模型)的第一个版本。您已经开发了模型的第二个版本,现在准备更新现有的 web 服务。
- 创建一个图像并将更新提交给 web 服务(下面是 Python 示例)。
- 由于这是一个渐进的展示 版本 2 创建了一个 新 pod,并将其添加到负载*衡器。
- 映像版本为#1 的 pod 将被删除,负载*衡器将停止向 Pod 发送请求。尽管 pod 被删除,但它仍保持活动状态,以完成它仍在处理的任何请求(默认的终止宽限期为 30 秒【1】)。
- 重复,直到部署中的所有单元都有映像的版本#2。
来源:史蒂文·洛艾萨
Python 实现
现在您已经理解了在 AKS 上更新图像的概念,我们将讨论如何通过 python 实现它。代码和配置文件位于 GitHub 上。
前置条件
- AML 工作区,计算实例,AKS 推理群集
- 已部署的 AKS 服务
- 该模型的新版本
更新方法有许多可以改变的参数【4】,默认设置为无,保持不变。当更新建模服务时,我包括推理配置(指定环境和评分脚本的路径)、模型、自动缩放和内存。
config.json
下面是azure_utils.py
中定义的AmlUtility
类。该类有几个函数来加载配置文件、设置环境、定义推理配置、加载新模型和部署更新。
azure_util.py
在终端上运行的示例脚本来自存储实用程序脚本的目录,它是:
python azure_util.py --config_path config.json --service_name current_deployment_name --new_model model_name:2
只要没有错误,当建模服务更新完成时,终端上的日志将会显示。
结论
这篇文章是为了教育目的。更新产品建模服务很可能超出了数据科学家的权限范围。停机会带来成本,因此更新和最小化成本最好留给其他专业团队。但是在开发阶段,当您迭代不同的版本时,这仍然是一个有用的特性。
一如既往地感谢您的阅读。你可以在 LinkedIn 上找到我!
参考
【2】:https://www.youtube.com/watch?v=mNK14yXIZF4
https://kubernetes.io/docs/concepts/workloads/pods/
[4]:https://docs . Microsoft . com/en-us/python/API/azure ml-core/azure ml . core . web service . aks web service?view=azure-ml-py
附录
未来相关文章
- 在 AML 中注册模型
- 在 AK 上部署模型并在本地调试
- 通过 ModelDataCollector()进行日志记录
问题
我在测试AksWebservie.update()
【4】时遇到的两个问题:
- 关于第 #3 点,您可能会看到一个“ 错误:副本在回复前关闭连接”。 发生这种情况是因为在 pod 被完全删除之前请求没有完成。解决方案:配置 pod 的终止宽限期,这可能超出了数据科学家的范围。【3】
- 如果映像通过 ModelDataCollector 转储日志,您可能会在部署过程中丢失日志。我没有找到与此问题相关的文档。解决方案:在非高峰时段更新映像,以最大限度地减少请求日志的丢失。
转行成为数据科学家是什么感受?
原文:https://towardsdatascience.com/how-does-it-feel-like-to-make-a-career-change-to-become-a-data-scientist-c2b261111b3b?source=collection_archive---------17-----------------------
为什么我很高兴我做到了
伊恩·施耐德在 Unsplash 上拍摄的照片
*年来,数据科学获得了极大的普及。越来越多的企业投资于数据科学,这使得对数据科学家的需求保持在当前的高水*。
两年前,我决定转行,最终目标是成为一名数据科学家。这是一个艰难的决定,因为我已经在不同的领域有了 6 年的专业工作经验。
尽管面临不可避免的挑战,我还是做了那个决定,花了将*两年的时间找到了我的第一份工作,成为一名数据科学家。在这篇文章中,我将分享我得到这份工作之前和之后的经历。
我的故事有两个方面。一个是关于在获得相当多的经验后改变职业。另一个是关于在当前竞争激烈的就业市场中找到一份数据科学家的工作。
职业转变
我首先想到的是浪费职业生涯的想法,这让我感到非常担忧。这是 6 年的努力工作和奉献。无论我在职业生涯中做什么,我都尽力超越标准。
然而,数据科学带给我的似乎比职业生涯更有吸引力。我将学习许多新概念和工具,然后有机会运用我的新技能来解决各种各样的问题。这正是我在工作中所羡慕的。
让我失去工作动力的是一遍又一遍的做同样的任务。作为一名数据科学家,我不会面临这样的问题,因为
- 数据科学仍然是一个不断发展的领域,新的工具和技术很快就会被引入,
- 数据科学涵盖许多不同行业的广泛应用,因此问题的多样性非常高。
穆罕默德·阿里扎德在 Unsplash 上拍摄的照片
因此,我在地*线上看到的是一个充满乐趣和兴奋的繁华小镇。这让我更容易做出决定,并朝着成为数据科学家的目标前进。
转行的成本其实取决于你对职业的期望。如果学习新事物和解决不同类型的问题听起来很有趣,那么改变一下是值得的。需要强调的是,这也很大程度上取决于你目前的工作。
从技术角度来看,我在成为数据科学家之前的经验不会是一项宝贵的资产。作为一名数据科学家,我可以利用其中的一小部分。然而,我已经准备好去学习达到我的目标所需要的一切。
从积极的方面来看,在专业的工作环境中工作让我更容易适应新工作。能够顺利过渡到协作工作环境也是一项重要技能。
找到第一份工作
在找到第一份工作之前,你可能会遇到一些挑战。在做决定和投入时间和精力之前,最好先了解他们。
首先,就业市场的竞争越来越激烈。是的,对数据科学家的需求很高。然而,有抱负的数据科学家的数量也在迅速增加。你应该意识到找工作并不像表面上看起来那么容易。
另一个挑战是在没有工作经验的情况下证明自己的技能。在大多数申请中,我甚至无法通过第一步,也无法获得技术面试。我觉得人力资源专业人士没有考虑我的简历,因为我缺乏该领域的工作经验。
我得到了很少的技术面试,而且我大部分都做得很好。这让我很开心,也让我有动力通过技术面试。这是一个好迹象,表明我走在正确的道路上,并提高了我的知识。
这篇文章的目的不是关于你应该学什么。有大量的资源、文章和博客文章解释了数据科学家所需的按需技能。因此,我跳过这一部分。
在花了将*两年时间后,我找到了第一份工作,成为一名数据科学家。新工作的第一天,我感到如释重负。我不确定这是因为完成了一个长期目标还是因为有机会解决有趣的问题。不管是什么,它让我很开心。
我没花多长时间就开始着手这些项目。这进一步激励我开始做出贡献。我参与的越多,学到的新工具和技术就越多。
如果你是一名数据科学家,我认为永远不会有你没有新东西可学的时候。我发现这是成为数据科学家的绝佳理由。
如果你担心等级制度和初级-高级的东西,在漫长的职业生涯后,你可能会有一段艰难的时间从初级开始。我一点也不介意。作为一名数据科学家,工作的满足感是如此吸引人,以至于我不在乎这些小问题。
结论
我试图分享我转行成为一名数据科学家的经历。这花了我将*两年的时间,所以有很多要谈的。长话短说,我很高兴我做了这个决定。
就业市场的竞争比表面上看起来更加激烈。因此,你应该准备好接受挑战。当你找到第一份工作时,你所牺牲的一切都会得到回报。至少对我来说是这样。
感谢您的阅读。如果您有任何反馈,请告诉我。
在《代码之夏》中,开源对一个组织的贡献如何?
原文:https://towardsdatascience.com/how-does-open-source-contribution-for-an-organization-work-in-summer-of-code-d7391ffb4dee?source=collection_archive---------26-----------------------
为开源做贡献的乐趣
想为开源做贡献却不知道从何下手?
我在这里分享我作为 让我们成长更多 SOC 2021 的积极参与者为开源做出贡献的经历。
之前我已经通过参加 DigitalOcean 举办的Hacktoberfest2020进入了开源的世界。当我看到我的第一个拉取请求被合并时,我欣喜若狂!!这也是我第一次获得关于版本控制系统 Git 和 GitHub 的实际操作经验。
Roman Synkevych 在 Unsplash 上拍摄的照片
然而,在最初的推动之后,我失去了为开源做贡献的动力,因为我参与了其他各种领域的学习。虽然我继续使用 Git 和 GitHub 用于我自己的目的,比如我的个人项目和客户,但完全脱离了开源。
然后,在七月的一个晴朗的日子里,我开始了解让我们成长得更快,它为开源贡献者提供了什么,以及加入并成为他们开源社区的参与者是多么容易。我是通过他们在 LinkedIn 上的帖子得到这些信息的。
我在 https://letsgrowmore.in/访问了他们的官方网站,真的被他们的原则、意识形态和帮助整个学生群体、提升他们的目标所感动。这是一个“由学生创建并为学生服务”的组织。
我下定决心不要失去这个千载难逢的机会,并重拾对开源项目的热爱和热情。我很快在他们的官方网站上填写了参与者角色的注册表格,并祈祷一切顺利。
终于,经过一周的等待,我收到了我的选择邮件!!
我一读完这封邮件,就迅速跳转到他们的网站,浏览了他们的整个项目列表,找到了每一个项目的描述,还留意了每个项目所需的技术堆栈。
起初,我沮丧地意识到大多数项目都是 web 开发,需要 JavaScript 和 TypeScript 知识。我完全没有这些编程语言的知识或经验。
但是当我注意到一个应用程序开发项目时,我仍然没有失去希望,继续寻找,尽管它是基于或使用 Flutter 进行开发和生产的,而且我对它有非常基本的了解。
Artur Shamsutdinov 在 Unsplash 上拍摄的照片
当这个项目已经开始并且已经进行了将*一半的时候,我加入了这个项目。因此,大多数简单的或第一个问题要么已经解决,要么有人被指派或正在处理这些问题。
我获得的知识和剩余的时间太少,不足以对一个颤振项目做出贡献。
我变得沮丧,责怪自己为什么不早点开始,质疑自己选择这么难的项目的选择。
几天过去了,我变得越来越焦躁不安。然后,我想,为什么不访问一次项目列表,看看是否有我没有注意到的项目。就在我打开我的笔记本电脑时,我在他们的 不和谐 频道中收到通知,他们的一位导师告诉我,一个新项目已经添加,正在积极寻找贡献者来完成!!
令我惊讶的是,这纯粹是关于数据结构和算法的话题。这是一个我非常感兴趣的话题,我对此也有足够的了解,并且非常有信心为之做出贡献。
克里斯·里德在 Unsplash 上拍摄的照片
我检查了他们的 GitHub 库,查看了他们的问题列表。我精通并有信心为 Java 做出贡献。因此,我专门寻找那些要求或需要这种技术堆栈的主题。
最后,我找到了一个,没有再浪费时间,我请求项目管理员把这个问题分配给我。
他是一个不错的人,在几个小时内就分配了这个问题,但给出的最后期限是一天!!
我开始争分夺秒地完成工作。写完整个代码后,我通过测试用例来运行它,在尝试了几个小时后,它成功了!!然后我修复了所有的拼写错误,检查是否有任何类型的代码重复,并检查我所有的变量/字段和函数/方法名称是否遵循了正确的命名约定。接下来是正确的文档!!
在完成并检查了所有任务之后,我终于创建了一个拉请求。
令我惊讶的是,我的拉取请求被合并了,我不必做任何进一步的更改!!我的代码遵循了项目管理员制定的所有规则和条例,也很干净,没有任何代码重复,并且有很好的文档记录。
这是我对开源项目的第二次贡献,也是我参与https://letsgrowmore.in/的全部经历。
希望你们都能发现我的经历提供了足够的信息,并激励你们为开源项目做出贡献,并加入一些促进开源项目并鼓励其他人参与其中的优秀组织!!
最后,永远记住, “每一个小小的贡献都是有价值的!!从代码到无代码,从改进文档到修复错误,编写代码来创建和/或修改功能。”
Python 垃圾收集是如何工作的?
原文:https://towardsdatascience.com/how-does-python-garbage-collection-work-a5dc544d880d?source=collection_archive---------10-----------------------
不幸的是,此时此地,我在 Pixabay 的旅程结束了
保持 Python 对象被引用,否则它们将被释放到内存中。
每种编程语言都有其特定的垃圾收集机制。这是指那些未使用的变量,它们仍然占据内存中的一些空间,最终将被删除。这对于更有效地利用存储空间是很重要的。
你有没有想过 Python 垃圾收集是如何工作的?特别是,Python 如何知道一个对象变得无用?在本文中,我将演示这种机制。将使用一些内置功能,如id()
和getrefcount()
。
显示内存地址
图片来自 Pixabay
在我们继续垃圾收集机制之前,有必要建立内存地址的概念。别担心,不一定要深潜。我将演示如何使用id()
函数,这就足够了。
首先,让我们定义两个 Python 列表。就内容而言,它们可以完全相同。
a = [1, 2, 3]
b = [1, 2, 3]
显然,变量 a 和 b 是一样的。但是,这是否意味着这两个变量指向同一个内存地址呢?不。我们来验证一下。
id(a)
id(b)
id()
函数会给我们一个对象的“身份”,用整数表示。如图所示,整数是不同的。所以,变量 a 和 b 指向不同的内存地址,尽管此刻它们是相同的。
如果我们创建另一个变量 a1,并让 a1 = a,就不会创建新的对象。相反,a1 将指向与 a 相同的内存地址。
有道理,这就是为什么当我们改变 a 时,a1 也会被更新。
参考计数
图片来自 Pixabay
现在我们可以讨论最重要的概念——引用计数。
基本上 Python 中的引用计数表示对某个对象的引用次数。这很重要,因为垃圾收集机制依赖引用计数来决定对象是应该保留在内存中还是应该释放在内存中。
也就是说,当对象的引用计数等于零时,它将被释放。非常直观合理的,当一个对象没有任何引用的时候,就意味着这个对象被抛弃了,没有用了。
那么我们如何获得引用计数呢?事实上,它可以被设计成一个内部机制,而不是简单地向开发者展示。但是,Python 实际上在sys
模块中提供了一个名为getrefcount()
的内置函数,可以方便地查询对象的引用计数。
要使用这个功能,我们需要从sys
模块中导入它。这是 Python 3 的任何版本都内置的,所以您不需要下载或安装任何东西就可以使用它。
from sys import getrefcount
然后,让我们使用这个函数来查询引用计数。
a = [1, 2, 3]
print(getrefcount(a))
在这个例子中,我创建了一个变量a
,并为它分配了一个简单的 Python 列表。然后,getrefcount()
函数显示这个对象的引用计数是 2。
但是等等,为什么是 2?请看看下面的图表。
事实上,当我们使用getrefcount()
函数查询一个对象的引用计数时,该函数必须建立对该对象的引用。这就是引用计数为 2 的原因。表示变量a
和函数getrefcount()
都在引用列表[1, 2, 3]
。
什么会增加引用计数?
图片来自Pixabays . Hermann&f . Richter
现在我们已经了解了引用计数以及如何查询一个对象的引用计数,但是什么会导致引用计数发生变化呢?以下操作将使引用计数增加 1。
1。创建对象并将其赋给一个变量。
这已经在前面的部分中演示过了。当我们创建 Python 列表对象[1, 2, 3]
并将其赋给变量a
时,列表对象[1, 2, 3]
的引用计数被设置为 1。
2。该对象被分配给另一个变量。
当对象被赋给另一个变量时,引用计数将加 1。但是,请注意,这并不意味着以下内容。
a = [1, 2, 3]
b = [1, 2, 3] # This will NOT increase the reference count
这已在第 1 节中讨论过。虽然列表相同,但它们是不同的对象。要增加引用计数,我们可以执行以下操作。
a = [1, 2, 3]
b = a
3。对象作为参数在函数中传递。
当我们使用函数getrefcount(a)
时,情况正是如此。变量a
作为参数被传递到函数中,因此它肯定会被引用。
4。对象被追加到容器类型中。
容器类型可以是列表、字典或元组,如下例所示。
my_list = [a]
什么会减少引用计数?
图片来自 Pixabay 的迈克尔·施瓦森伯格
现在,让我们来看看将减少引用计数的场景。
1。该对象已从函数范围中删除。这通常发生在函数完成执行时。
如果我们尝试在函数执行期间打印引用计数,就可以验证这一点。所以,我们可以这样设计实验。
def my_func(var):
print('Function executing: ', getrefcount(var))my_func(a)
print('Function executed', getrefcount(a))
但是为什么引用计数是 4 而不是 3 呢?这就涉及到 Python 的另一个概念,就是“调用栈”。
当在 Python 中调用一个函数时,一个新的帧被推送到调用栈上用于它的本地执行,并且每次函数调用返回时,它的帧被弹出调用栈。
这个概念不在本文中展开,因为它超出了讨论范围。如果您不熟悉调用堆栈,我可以告诉您的是,您看到的带有回溯和行号的错误消息正是来自调用堆栈。
因此,在执行my_func()
期间,引用计数为 4。在它被执行之后,引用计数被减少回 2。
2。当引用对象的变量被删除时。
这个很好理解。当我们使用del
命令删除变量时,该变量将不再引用该对象。
请注意,如果我们在这种情况下删除变量a
,对象的引用计数将变为 0。这正是垃圾收集将释放该对象的场景。然而,这也意味着我们不能再使用getrefcount()
函数来检查引用计数。
3。当引用该对象的变量被赋予另一个对象时。
这种情况可能会更频繁地发生。当一个变量被赋予另一个对象时,当前对象的引用计数将减一。当然,新对象的引用计数会增加。
4。当对象从容器中移除时。
当对象被追加到容器中时,引用计数将+1。相反,当它被移除时,引用计数将为-1。
当然,如果我们删除容器,引用计数也会减少。
一个特例
请注意,只有一般对象可以通过这种方式进行调查。这意味着当值是一个文字常量,比如数字123
或字符串'abc'
时,我们确实有特殊的情况。
如上所示,引用计数可能是意外的。在我的例子中,我使用 Google Colab,这样环境可以被共享,这导致了如此大的引用计数。
另一个值得一提的重要因素是,文字常量保证位于相同的内存位置。
因此,只要在某处使用了数字123
,引用计数就可能增加。即使我们只有一个变量引用它,引用计数也可能更多。
摘要
在本文中,我介绍了 Python 中的垃圾收集机制。这是对象的引用计数。
以下操作将增加对象的引用计数:
- 创建对象并将其赋给一个变量。
- 该对象被分配给另一个变量。
- 对象作为参数在函数中传递。
- 对象被追加到容器类型中。
相反,以下操作将减少对象的引用计数:
- 该对象已从函数范围中删除。这通常发生在函数完成执行时。
- 当引用对象的变量被删除时。
- 当引用该对象的变量被赋予另一个对象时。
- 当对象从容器中移除时。
https://medium.com/@qiuyujx/membership
如果你觉得我的文章有帮助,请考虑加入 Medium 会员来支持我和成千上万的其他作者!(点击上面的链接)
k-Means 算法是如何工作的?
原文:https://towardsdatascience.com/how-does-the-k-means-algorithm-work-d1e46b42bcfd?source=collection_archive---------55-----------------------
查看无监督学习模型背后的数学和伪代码
本文是我正在撰写的关于机器学习关键理论概念的系列文章的延续。本系列其他文章在我的 页面 均有。
由 Karen Vardazaryan 在 Unsplash 拍摄的照片
无监督 学习又称模式 识别,是一种试图在数据集中寻找内在模式的方法,没有明确的方向或终点,以标签的形式存在。在口语中,在监督学习问题中,我们可能会告诉模型“从一组输入到确切的期望输出(在分类中)或尽可能接*输出(在回归中)找到最佳的一般路径”。然而,在一个无监督的学习问题中,在没有我们明确的输出的情况下,我们将告诉一个模型“揭示数据中一些隐藏的关系,这些关系乍看起来可能不明显,并使用这些关系来区分不同的组”。
无监督学习的好处之一是,它帮助我们发现潜在 变量。潜在变量是在我们的数据集中不明显的变量。它们隐藏在我们的数据集中,通常通过以某种数学方式组合多个特征来推断或产生。在不知道预期目标是什么来影响模型的情况下,它以更抽象的方式查看数据集,找到可能比监督学习问题中找到的关系更健壮的关系。
k 均值
K-Means 聚类将采用一组变量并找到 K 个聚类或组。这些聚类是不同的,但是它们中的数据点是相似的。这个想法是,我们能够将我们的数据集划分为 K 个组,这可能会告诉我们更多关于它们的隐含特征。每个聚类完全由其中心或*均值 mu_k 定义。
在机器学习工作流程的探索性数据分析阶段,这是一个很好的方法,因为它让我们有机会获取空白的、新鲜的数据集,并允许模型为我们提供一些指示,告诉我们在哪里可以找到有趣的关系。
模型的数学符号及其输出如下所示
作者图片
K-Means 从绘制 n 维空间中的所有数据点开始,其中 n 是我们拥有的特征变量的数量。例如,3 个特征将被绘制在 3D 图上,4 个特征将被绘制在 4 维空间上,以此类推…通过这种可视化,模型将试图在数据中分配点,我们的意思是,在中间有相似数据点的明显分组。迭代地,该模型将继续改进*均值,使用最小化类内距离和最大化类间差异的成本函数。
K-Means 算法的伪代码如下:
1 .随机初始化 mu _ k
2。相对于 r_nk 最小化 J,而不改变 mu_k
3。相对于 mu_k 最小化 J,不改变 r_nk
4。重复直到两个最小值收敛
考虑到我们已经初始化了*均值。我们现在将把它和我们的数据一起绘制在图表上,并根据它最接*的*均值给每个实例分配一个类。这是我们在步骤 2 中最小化的方法。其概念是,我们将转到第 3 步,试图找到一个更好的均值,然后返回第 2 步,看看这个新的均值如何改变 r_nk 值。正如步骤 4 告诉我们的,我们继续这个序列,直到我们找到收敛。
要显示步骤 2 的符号:
作者图片
在上面图像的第二部分,我们说如果 j 值(由我们测量的聚类*均值决定)返回最小距离,即我们将把这个实例 x_n 分配到的聚类,我们将把 r_nk 分配为 1。
第三步涉及到我们试图最小化我们每个集群的*均值。这是一个二次函数,我们可以从等式中看出。因此,我们可以通过微分使 J 最小化,将解设为 0 并求解。
作者图片
下图显示了典型的 k-means 聚类算法的演变。我们可以看到我们的迭代算法将如何收敛到 2 个不同集群的最优解。
【https://stanford.edu/~cpiech/cs221/handouts/kmeans.html
K-Means 的一些特性是我们应该注意的,如下所示:
- 因为优化算法的可微性,我们保证了收敛,但是我们遇到了达到局部最小值而不是全局最小值的问题,并且因为这个…
- …我们很大程度上依赖于初始*均值来找到全局最小值
- 很难定义集群的最佳数量,因此这可能需要一些微调和迭代
- K-Means 是一种昂贵的算法,因为每次迭代需要 K*N 距离比较
- 每个实例都被分配给一个集群,并且只分配给一个集群,如果我们有一些实例可能属于多个集群,这可能会有问题
- 距离计算对异常值很敏感
肘法
我们可以更详细地讨论其中的一点。我们如何选择最佳的聚类数 K?肘法就是我们这样做的。通常,当我们增加聚类时,我们会期望成本函数 J 下降,因为每次我们添加另一个均值时,它都会缩短到某些实例的距离。然而,这里有一个权衡,随着我们继续添加更多的聚类均值,过度拟合我们的数据的可能性就越高。这是可以理解的,因为我们在不断增加聚类的数量,以便更好地适应我们的训练数据,而没有注意到这个模型可能如何对我们的测试数据进行操作。记住这一点很重要,我们需要一个可以通用的解决方案,因此不是一个过于固定的训练数据,而是一个可以适应不同的未知输入并仍然给我们带来好结果的解决方案。
作者图片
肘部是我们开始看到回报率递减的点。我们增加另一个集群的好处与我们模型增加的复杂性不成比例。我们将通过对不同数量的集群进行一系列模拟,绘制它们的成本函数并观察图表来找到这个瓶颈,我们希望图表看起来类似于上面的图表。
这就是你对 k 均值的总结。我希望在以后的文章中更详细地介绍更多的概念,所以请密切关注这些概念!如果你对我以前的文章感兴趣,也可以关注我的页面。在那之前,✌️.
你的智能手表怎么知道你站着呢?
原文:https://towardsdatascience.com/how-does-your-smartwatch-know-youre-standing-60c1c33b0be8?source=collection_archive---------27-----------------------
用简单的统计预测方法打开智能手表/智能手机健身功能的黑匣子。
在过去的几年里,我们看到了由臭名昭著的苹果手表引领的智能手表销量的突然激增。这个利基市场的持续增长似乎与现代社会对健康/健身日益增长的关注相一致(如本文 IDTechEx 文章所示),因此,我们看到每一次软件迭代或每一次新推出的产品都增加了越来越多的健康相关功能。
照片由索伦·费伊萨在 Unsplash 拍摄
由于手表的大部分功能看起来就像是在你眼前表演的魔术(这个小东西怎么知道我什么时候躺下或者什么时候在走路?),这似乎是一个很好的数据科学练习,可以更深入地研究这个问题,看看至少其中一些函数是如何工作的。
深入挖掘
如何为此目的获取信息?
为了更好地理解这个问题,有必要知道什么可以用于这个目的。可穿戴设备使用传感器来“理解”用户的当前状况。角速度传感器(陀螺仪)和加速度传感器(加速度计)是最常见的运动和位置检测传感器。让我们尝试使用简单的方法重新创建一个身体位置预测器!
数据集
关于这一点的数据在 UCI 机器学习知识库中提供,更具体地说,在使用智能手机的人类活动识别数据集中提供,该数据集由 30 名志愿者构建,他们使用连接到他们的智能手机进行 6 种活动(行走、上楼、下楼、坐着、站着和躺着),以通过加速度计和陀螺仪捕捉信息。数据集包含以下属性:
- 来自加速度计的三轴加速度(总加速度)和估计的车身加速度。
- 陀螺仪的三轴角速度。
- 具有时域和频域变量的 561 特征向量。
- 它的活动标签。
- 进行实验的受试者的标识符。
让我们来看看数据是如何处理的。
通过存储库下载数据很简单,但它是以一种已经处理过的模式出现的。在数据集文件夹中,已经有包含 train (x_train 具有[7352,561]的形状,y_train 具有[7352,1]的形状)和测试分割的子目录。包含标签索引值的. txt 文件和包含训练/测试拆分中列的索引值的. txt 文件。对于本文和接下来的分析,我们组合所有处理的信息,最终得到一个形状为[10299,562]的数据帧,如下所示:
生成的数据帧。作者
请注意,已经为[-1,1]范围内的要素做好了准备,如下图所示:
功能列的最大值和最小值。作者
知道了这些值带,我们就可以看看特性列是如何表现的(至少是 562 中的一些)。为了对此有一个感觉,我们通过绘制它们的核密度估计(KDE)来看看我们的数据的 8 个随机选择的列的分布。
8 个随机选择的列的核分布。作者
查看 KDE 图,可以看到在这个随机样本中,我们有不同表现的变量。一些以高斯形式分布,一些更接*帕累托分布,这对于预测模型来说似乎很好。现在,我们检查随机列中现有的相关性,考虑到这个数据集的创建,这是完全自然的。
列相关矩阵。作者
查看这个由 10 个随机选择的列组成的相关矩阵,我们注意到,陀螺仪和加速度计注释的大多数信息似乎有很强的关系,为了确保这一点,有一组 15 个随机 10 列的相关图,最终看起来都与上面所示的类似。通过这些关系,可以观察到,即使对于无法承受超级复杂计算的系统,也有可能开发出良好的预测算法(以至于即使是低端智能手表市场也有这种功能)。
系统模型化
对于这种类型的预测,我们必须使用不需要高度计算能力的分类算法。这可以通过利用称为逻辑回归的广义线性回归方法来实现。这种建模技术将我们的输出限制在[0,1]的范围内,由于这个原因,给解释这个结果的人一种概率方法来得到函数的结果。输出被置于 0 和 1 之间的事实是输出通过受人喜爱的 Sigmoid 函数传递的直接结果,如下所示:
具有示例阈值的 Sigmoid 图。作者
请注意,x 轴上的所有值都被“挤压”到 y 轴上的[0,1]范围内。利用这种回归技术,我们可以说,在这些范围之间确定的预测值是它属于某一类的概率。
知道了哪种模型最适合我们,我们将数据以 66/33 的比例分成训练集和验证集,将训练集的 561 个特征(陀螺仪和加速度计信息)的 6900 个示例留给训练集,将相同数量的外生变量的 3399 个示例留给验证集。由于类别似乎有点不*衡,我们采用分层分割法,在分割数据时考虑了类别分布。用于拆分的代码示例如下。
strat_shuf_split = StratifiedShuffleSplit(n_splits=1,
test_size=0.33,
random_state=19)feature_cols = data.columns[:-2]
train_idx, test_idx = next(strat_shuf_split.split(data[feature_cols], data.Activity))x_train = data.iloc[train_idx][feature_cols]
y_train = data.iloc[train_idx]['Activity']x_test = data.iloc[test_idx][feature_cols]
y_test = data.iloc[test_idx]['Activity']
拟合
为了简单起见,没有做额外的工程来准备我们的特性,因为它们看起来已经适合预测了。当植入可穿戴设备中时,在数据准备步骤中利用的任何额外的计算量都可能导致较慢的预测器。了解这一点后,下一步是使用 LibLinear 解算器拟合逻辑回归模型,解算器选择的原因是 LibLinear 只有 O(n)复杂度,而其他选择(如 sklearn 中的 LinearSVC 解算器)具有 O(n)复杂度,因此需要使用计算资源。三行简单的代码就完成了拟合。
logistic = LogisticRegression(solver='liblinear')
fitted_lgstc = logistic.fit(x_train, y_train)preds = fitted_lgstc.predict(x_test)
评估
预测输出是一个长度为 3999 的数组,数组中的每个值都是通过模型的要素的标签编码预测活动。
对于模型质量检查,我们使用 F1 分数和混淆矩阵(理解预测的直观方式)。
F1 比分
F1 分数是精度和召回率之间的调和*均值,这是分类器的两个最重要的指标。
精度 TP/(FP+TP)是衡量一个类中有多少预测值实际上来自该类的指标(如果模型只预测一个类的示例,并且该指标的值为 1 是正确的,则该指标并不可靠)。
位置预测模型的精度。作者
召回率 TP/(TP + FN)是一个度量值,它告诉我们有多少实际的真值被预测为真,由于向有偏差的模型打开了一扇门,因此也不那么稳健,一旦模型预测了一个类的所有值,我们就会得到一个召回率值。
回忆一下位置预测模型。作者
F1 分数为我们提供了一种数学方法,可以将两种指标结合起来,而不会偏向每一种指标。出于这个原因,我们来看看我们的模型得分。
F1 分数。作者
请注意,对于这样一个简单的技术,分数是很大的,表明在建模技术的所有真阳性中,我们正确地预测了一个非常好的数量,而没有偏向于预测该类的全部或非常少。
混乱矩阵
预测的混乱矩阵。作者
混淆矩阵从视觉上确认了 f1 得分指标已知的内容。该模型在大部分时间内都正确处理了所有的类,只是在处理坐着和躺着的类 3 和 4 时有点混乱
结论
用简短的技术术语来说,这基本上是你的手表或手机如何知道你的位置。利用陀螺仪和加速度计传感器创建特征,并将这些特征传递到预先训练的位置模型中,有点像本文中讨论的简单模型。每隔几分钟进行一次预测,就有可能开发出位置计时器,用来提醒用户每隔几分钟移动一点,计算步数以及现代可穿戴设备中广泛使用的许多其他健康/运动功能。
代号
此分析中使用的完整代码可在 此处 获得
来源
https://www.iotforall.com/sensors-that-matter-wearables https://www.idtechex.com/en/research-report/wearable-sensors-2021-2031/780
https://archive . ics . UCI . edu/ml/datasets/Human+活动+识别+使用+智能手机
https://machine learning mastery . com/how-to-model-human-activity-from-smart phone-data/
引文
达维德·安吉塔、亚历山德罗·基奥、卢卡·奥内托、哈维尔·帕拉和豪尔赫·雷耶斯-奥尔蒂斯。使用智能手机进行人类活动识别的公共领域数据集。第 21 届欧洲人工神经网络、计算智能和机器学习研讨会,ESANN 2013。2013 年 4 月 24 日至 26 日,比利时布鲁日。
如何下载子编辑评论
原文:https://towardsdatascience.com/how-download-subreddit-comments-f79557c99170?source=collection_archive---------22-----------------------
安妮·斯普拉特在 Unsplash 上的照片
从 NLP 和分析任务的特定子编辑中下载所有评论。🖇github:pistocop/subreddit-comments-dl
这个故事是一个更大项目的一部分:“利用 Reddit 评论和 ML 技术创建一个产品知识库”,敬请关注!
🏃TL;速度三角形定位法(dead reckoning)
赶时间?运行这段代码!
💡确保正确设置“< … >”参数!
👨🏫介绍
假设你想做一个市场调查,也许是在某个特定的领域,比如某辆特定的自行车,某个特定的政党,甚至是在 Gamestop 事件前几周 wallstreetbets 上发生了什么。
对于这种特定的任务,分析用户评论可能是一个很好的机会,从 reddit 获取这些评论是一个快速而聪明的想法,因为这些社交评论的质量很好( OpenAI 也用它来训练 GPT 模型)。
是的,确实有一个选择是从 pushshift 下载Reddit 的最新转储,但是获得> 15Gb 的数据以使用少于 100Mb 的数据并不是每个人都可行的方法。我们需要完成的任务也不需要来自 reddit 的新数据,因为 pushshift 转储每月进行一次。
最后但同样重要的是,如果我们能够避免占用无用的 Pushshift 带宽,这是一件好事,例如,我们将使用的代码被定制为调用 Pushshift 最少次数。
因此,让我们探索一种从特定子编辑中收集评论的方法,如果我们需要,可以使用时间约束,以一种简单快捷的方式。
🎯主项目
本文探讨了一个更大项目的一个组成部分,该项目旨在利用 reddit 的评论来构建产品知识库。简而言之,这是一个更大链条的第一环:
主体建筑概述——作者形象
🛂恢复凭据
首先我们需要一个 reddit 上的账号和一些账号参数: reddit_id 和 reddit_secret 。查看下一个表,了解如何检索这些参数。
带链接的原始表格可在pistocop.dev/posts/subreddit_downloader/获得
还在纠结reddit_id
和reddit_secret
怎么走?
看看这篇好文章:
🚀下载数据
我们假设 python3 已经安装并运行在您的电脑上
在凭证检索之后,让我们使用src
文件夹下的脚本subreddit_downloader.py
来面对数据下载部分。
脚本的其他参数有:
--output-dir
→可选输出目录【默认:。/data/]--batch-size
→每次请求提交“batch _ size 默认值:10]--laps
→请求提交“batch _ size”Reddit 的次数[默认值:3]--utc-after
→获取该 UTC 日期之后的提交--utc-before
→在此 UTC 日期之前获取提交内容
例如,这是从AskReddit和 News 下载投稿和相关评论的基本用法:
用不同的 subreddit 和不同的时间范围,重复上述过程任意多次。
💡提示:使用一些在线工具,比如 EpochConverter 来计算你想要的 UTC 时间
🏗构建数据集
下载完成后,我们可以创建一个机器可读的数据集,以后可以用于分析、机器学习和许多其他目的。
要构建新的数据集,只需运行 dataset_builder.py 脚本,进度条将显示构建过程中的状态。构建完成后,您可以在数据集文件夹下检查您的结果:每当您构建一个新的数据集时,脚本都会创建一个新的文件夹。
**💡如果您使用不同的
*--output-dir*
参数运行 subreddit 下载脚本,请相应地更改 dataset_builder.py*--input-dir*
参数
🎭输出文件格式
创建的数据集采用 CSV 格式,并遵循以下结构:
上的原始表格 GitHub 上的
上的原始表格 GitHub 上的
📌结论
在本文中,我们看到了如何使用 praw 和 pushshift API 从特定的子编辑中收集数据。这种介绍希望成为一个更雄心勃勃的项目的第一项任务,该项目侧重于建立一个特定产品或实体的知识库。如果你感兴趣的话,我们会在下一篇文章中用变形金刚从评论中提取信息!
📖词汇表
- reddit 网站上专注于某个特定主题的部分
- 提交:出现在每个子编辑中的帖子。当你打开一个 subreddit 页面,你看到的所有帖子。每个提交都有一个评论树
- 评论:Reddit 用户在提交下的子编辑
- 中编写的文本。这个库的主要目标是收集属于子编辑的评论
✍笔记
- 在幕后,脚本使用 pushshift 来收集提交 id,使用 praw 来收集提交的评论
——使用这种方法,我们需要更少的数据给pushshift
——由于使用了 praw API,需要 reddit 凭证 - 关于
--help
命令下的subreddit_downloader.py
脚本的更多信息