用 Docker 部署机器学习模型
有很多文章解释了如何将 Flask 包装在你的机器学习模型中,作为一个 RESTful API。本文通过解释如何生产您的 Flask API 并使用 Docker 为部署做好准备,扩展了这一点。
动机
为什么我们需要对 Flask API 做进一步的工作以使其可部署?
- Flask 内置服务器不适合生产
- 与尝试在标准虚拟机上运行 Flask 相比,Docker 允许更平滑的部署和更高的可靠性。
在我看来,这是为什么需要进一步努力的两个最大的动机。
在这种方法中,我们将使用 nginx 、 gunicorn 和 Docker Compose 来创建一个可扩展、可重复的模板,以一次又一次地部署您的机器学习模型。
让我们来看看我们建议的文件夹结构:
.
├── README.md
├── nginx/
| ├── Dockerfile
| └── nginx.conf
├── api/
| ├── Dockerfile
| ├── app.py
| ├── __init__.py
| └── models/
├── docker-compose.yml
└── run_docker.sh
由此,我们最初的 Flask 应用程序位于api/
文件夹中,有一个单独的文件夹nginx/
存放我们的 nginx Docker 容器和配置。
nginx、gunicorn 协同工作如下:
- 客户端导航到您的网址,example.com
- nginx 处理这个 http 请求,并将请求传递给 gunicorn
- gunicorn 从 nginx 接收这个请求,并提供相关的内容(gunicorn 运行您的 Flask 应用程序,并处理对它的请求)。
如你所见,这有点复杂,但是比 Flask 的标准服务器更可靠和可伸缩。
让我们开始吧。
烧瓶+ Gunicorn + Docker
最合理的起点是我们现有的 Flask 应用程序。本节的目标是支持 gunicorn,并为我们的应用程序创建一个 Docker 容器。
我们需要做的唯一针对 Flask 的更改是确保当我们启动 Flask 时,我们指定一个主机 0.0.0.0,并且我们有debug=False
。
debug=False
很重要,如果用户遇到错误,我们不希望显示回溯。主机只是帮助我们稍后配置 nginx。
在我们创建 Dockerfile 之前,我们首先需要通过在您的终端中运行pip install gunicorn
来安装 gunicorn。gunicorn 本身将在我们创建 Docker 合成文件时进行配置。
现在也是确保 requirements.txt 文件是最新的好时机——通过在终端中运行pip freeze > requirements.txt
来实现。
嘣!现在我们继续创建 Docker 容器。要创建 Docker 容器,我们需要创建一个名为Dockerfile
的文件。这个文件充当我们运行应用程序所需的一切的“配方”。要了解 Docker 本身的更多信息,请查看 Docker 网站上的入门页面。
下面的文档相对简单。我们利用已经安装了 Python 3.6.2 的现有基础映像,然后创建应用程序文件夹并将其复制到容器中。
您可能会注意到,我们没有在 docker 文件中指定flask run
或任何等效的命令。这是因为我们想使用 gunicorn 来启动我们的 Flask 应用程序。我们还想让它和我们的 nginx 容器一起启动。因此,我们将在稍后配置 Docker Compose 时这样做。
nginx
在我们的例子中,nginx 取代了默认的 Flask web 服务器,并且比 Flask 的内置服务器更具可伸缩性和可靠性。
我们可以通过在项目根目录下创建一个新目录来设置 nginx,并使用以下内容创建一个 docker 文件:
这将下拉 nginx Docker 映像并将nginx.conf
复制到 Docker 容器中。
nginx.conf
是我们可以配置 nginx 服务器的文件,如下所示:
其中的主要部分是,我们以秒为单位设置 keepalive_time out,并告诉我们的代理监听端口 80 (http)并返回端口为 8000 的 localhost。
将它整合在一起
我们现在有了一个非常好的 Flask API/网站的材料。真的只有最后一件事要做了。
因为我们有多个 Docker 容器,所以我们需要一种方法来运行它们,并指定它们如何相互交互。这就是 Docker Compose 的用武之地。
Compose 是一个定义和运行多容器 Docker 应用程序的工具。
从 Docker 的网站上我们可以看到,使用 Docker Compose 有三个步骤:
- 用一个
Dockerfile
来定义你的应用环境,这样它可以在任何地方被复制。 - 在
docker-compose.yml
中定义组成您的应用的服务,以便它们可以在一个隔离的环境中一起运行。 - 运行
docker-compose up
,Compose 开始运行你的整个应用。
我们已经完成了第一步,所以现在我们可以安全地进入第二步。
我们的docker-compose.yml
文件看起来像这样:
关于这个文件有一些事情需要注意。
**服务:**这是我们指定个人 Docker 容器的地方,首先是我们的 API,然后是我们的 nginx。
build: 指 Dockerfile 相对于 docker-compose.yml 文件的位置。
*命令:*允许您指定运行该服务所需的命令。对于我们的 API,我们没有在 docker 文件中运行 Flask 应用程序,所以我们在这里使用 gunicorn 来运行它。
值得注意的是,我们将端口绑定到 8000,因此它与nginx.conf.
中指定的位置相匹配
我强烈建议你在这里阅读更多关于 Docker 和 Docker Compose 的内容。
我们找到了。我们现在已经配置了 nginx,对接了我们的 Flask 应用程序,并使用 Docker Compose 将其整合在一起。
您现在应该能够简单地输入docker-compose up
并且您的服务器应该启动了。
用 GraphPipe 部署机器学习模型(系列的第 2 部分)
Image from https://blogs.oracle.com/developers/introducing-graphpipe
我原本打算写我的 Kubeflow 系列的第二篇文章。然而,我陷入了大量的工作,在此期间,Oracle 推出了一个新的模型部署框架,名为 GraphPipe。我仍然计划在某个时候看看 Kubeflow,因为它有许多不错的功能(如 AB 测试/多臂 bandit 更新以重定向流量),但我发现 GraphPipe 更容易使用,至少根据网站的说法,它比 JSON 类型的 API(如 Kubeflow)快得多。
在本文中,我将介绍一个使用 GraphPipe 和我自己的模型不可知(MA)库(现在包括对 GraphPipe 的支持)部署一个经过训练的 PyTorch 模型的例子。对于这个例子,我选择了 ChexNet(来自 Rajpurkar 等人的)和 arroweng(即 weng 等人的)的实现,它们可以在 GitHub 上公开获得。
1。重构代码以支持“单一示例”处理(或者您生产所需的任何模式)。
这第一步在几乎所有情况下都是一样的。这通常也是最费时费力的。这通常需要非常仔细地阅读实现代码。我的 model_agnostic 类旨在使这一过程变得更加容易(不幸的是,尽管它仍然很糟糕)。
1(a)加载模型重量
在我们尝试重构之前,我们需要确保我们可以加载模型权重(令人惊讶的是,这会导致比你想象的更多的问题)。为此,我们从 MA 子类化 PytorchModel。现在我们不用担心预处理和 process_result 步骤。相反,我们将只关注加载模型权重。
MA generally has three methods to implement init (which is usually just a call to super), create_model, and preprocessing. Depending on your model and setup you may also want to implement process_result.
加载 PyTorch 模型有多种方式,MA 支持这两种方式。第一种方式是,如果你最初用torch.save(the_model, some_path).
保存了完整的模型,实际上这是很少见的,相反,大多数时候你只保存 state_dict,而不是整个模型(即torch.save(the_model.state_dict(), path))
)。这里 arroweng 提供了保存的 state_dict,所以我们必须实现 create_model。ChexNet 本质上只是针对 14 种条件修改的 DenseNet121。因此,我们在 create_model 中需要做的就是返回一个 DenseNet121 类。剩下的 MA 在 PytorchModel 中处理,比如将 state_dict 转换成 CPU 可用的格式(反之亦然)。最后,我们将训练模式设置为 false,因为我们只希望进行正向传播。
1(b)实现预处理和 process_result
为了测试这个设置是否有效,我们需要在一些数据上运行创建的模型。这些相同的功能也将在稍后我们部署模型时使用。所以现在是让他们尽可能瘦下来的时候了。这通常是比较耗时的步骤之一,因为代码经常成批地评估模型。此外,当我们需要使用一个单独的例子来运行时,模型通常有一个数据加载器。因此,这一过程会因您的具体型号/用例而有很大不同。有趣的是,对于这个特定的模型,arroweng 甚至在测试期间也使用 TenCrop 进行数据扩充。因此,在我的预处理方法中,我决定增加一个用户可以标记为真或假的参数。
Code for the preprocessing part of the algorithm. View on GitHub
2。将 PyTorch 模型转换为 Caffe2
这一部分相对简单,在 PyTorch 网站上有很好的记录。基本上,它涉及到 Caffe2 跟踪模型的 PyTorch 执行。
This is code I took straight from the official tutorial on the PyTorch website.
为了测试这个模型是否成功地转换成了 Caffe2,我使用了下面的代码。
You can use the NumPY testing framework to make certain that the PyTorch executed result is roughly equal to the Caffe2 executed result (to what ever number of decimal places you desire).
如果一切正常,下面的代码应该运行无误。
3。用 GraphPipe 上菜
3(a)运行 GraphPipe docker 容器
现在获取您保存的 Caffe ONNX 文件(在本例中为 chexnet-py.onnx ),并将其保存在云中或本地目录中。然后运行以下命令
docker run -it — rm -e https_proxy=${https_proxy} -p 9000:9000 sleepsonthefloor/graphpipe-onnx:cpu — value-inputs=https://raw.githubusercontent.com/isaacmg/s2i_pytorch_chex/master/value_inputs2.json — model=http://url_to_model.onnx — listen=0.0.0.0:9000`
这个命令的作用是将 GraphPipe ONNX CPU docker 映像、您的模型和其他信息拉过来运行容器。“价值输入”是你的输入值的维度。
{"0": [1, [1, 3, 224, 224]]}
因此,在本例中(如果您计划不使用裁剪放大),输入将是一批大小,三个通道(即 RGB)和一个 224x224 图像大小。如果一切正常,你应该在你的终端中看到类似“INFO[0005]监听 0.0.0.0:9000”的内容。
3(b)定义 GraphPipe 服务类
Overview of the deployment class. Sorry about the lines being cut off no matter much I broke up long lines Medium still seemed to cut it off at a point due to indentation. Please view the gist on GitHub for full view.
因此,您的预处理函数将保持不变,如果您还没有定义 process_result 函数,您将需要定义它。MA 将处理 GraphPipe docker 容器的所有后台调用。现在要使用它,你只需要做以下事情
To create the ChexNet GraphPipe object all you need is pass in the url of your container. Then simply run the standard Model Agnostic commands.
现在,您可以将这个类包装在任何 Django 或 Flask API 中来完成部署。
结论
现在你可能想知道为什么这比简单地在 Flask/Django REST API 中运行 PyTorch 要好。答案是(1)这种方法通常更快,因为 GraphPipe 优化了模型预测阶段(2)这种方法是高度可伸缩的,以及(3)这种 API 可以由任何语言的任何应用程序调用(假设您可以执行等效的预处理)。在我看来最大的好处是(2)。因为如果预测的延迟成为应用程序的瓶颈,现在很容易产生新的 Docker 容器。
更多资源
【GraphPipe 官方网站
在 Google 计算引擎上部署 PySpark ML 模型作为 REST API
循序渐进的教程
这篇文章和我之前的文章有松散的联系。
分步教程:Google Dataproc 上的 PySpark 情感分析
在我之前的帖子中,我在 Google Dataproc 上训练了一个 PySpark 情绪分析模型,并将该模型保存到 Google 云存储中。在本文中,我将向您展示如何在 Google Compute Engine 上部署 PySpark 模型作为 REST API。我将使用我在上一篇文章中训练的模型,但是我确信您可以对我将与您自己的 PySpark ML 模型共享和使用的代码进行一些小的更改。
我将整个管道保存为 pipelineModel,现在我想将该模型用于 REST API,以便它可以通过简单的 REST API 调用来提供实时预测。
我首先查看了 Google Cloud ML Engine ,看看这是否是这个特定用例的有效选项。通过通读简介,您不仅可以训练机器学习模型,还可以为您的模型提供预测服务。但遗憾的是,云 ML 引擎似乎不支持 Spark ML 模型。我找到的下一个谷歌服务是谷歌应用引擎。这项服务让任何人都可以轻松部署网络应用。但是经过几次尝试后,我意识到在通过 Google App Engine 创建的 VM 实例上设置 Java 开发包(运行 PySpark 所需的)并不容易。这也许是可能的,但至少对我来说,选择这条路不够直截了当。
经过一些考虑和尝试,以下是我发现的工作方式。我将首先一步一步地介绍这个过程,然后我还将告诉您使用 Spark ML 模型进行在线实时预测的缺点。
在本教程中,我不会再重复基本的设置过程,例如设置免费帐户,为您想要使用的服务启用 API,安装 Google Cloud SDK,但如果这是您第一次尝试 Google Cloud Platform,我建议您查看我以前的帖子,并完成设置步骤(在 GCP 上创建免费试用帐户,启用 API,安装 Google Cloud SDK)。在您继续下面的步骤之前,您必须准备好启用 Google 计算引擎 API。
克隆 Git 仓库
现在,通过在终端中运行下面的命令来克隆这个项目的 git 存储库。
git clone [https://github.com/tthustla/flask_sparkml](https://github.com/tthustla/flask_sparkml)
一旦您克隆了存储库,它将创建一个名为 flask_sparkml 的文件夹。进入文件夹,检查有什么文件。
cd flask_sparkml/
ls
您将看到三个文件和一个子文件夹。
- install.sh(创建计算引擎实例时的启动脚本)
- main.py (Flask web 应用程序,将预测作为 REST API)
- 模型(存储经过训练的 PySpark 管道模型的文件夹)
- response_time.py(测量 API 响应时间的简单 Python 脚本)
正在创建 Google 计算引擎虚拟机实例
您可以通过 web 控制台或使用 Google Cloud SDK 从您的终端创建一个实例。在创建实例之前,让我们快速看一下启动脚本 install.sh,看看它做了什么。
上面的代码将是虚拟机的启动脚本。
Web 控制台
通过访问https://console.cloud.google.com/进入您的控制台。进入控制台后,从左侧菜单中单击“计算引擎”和“虚拟机实例”。点击“创建”。
键入虚拟机实例的名称,并选择要创建虚拟机的地区和区域。对于本教程,我们不会使用任何其他 GCP 服务,因此您可以选择任何您喜欢的地区/区域,但最好考虑一旦 API 上线,大多数流量将来自哪里。
向下滚动并在身份和 API 访问部分选择“允许对所有云 API 的完全访问”,并在防火墙中勾选“允许 HTTP 流量”,以便可以从您的虚拟机外部访问它。最后,让我们添加启动脚本,以便 VM 在启动时安装所需的包。
在防火墙部分下方的屏幕上,您会看到蓝色文本“管理、安全、磁盘、网络、单独租赁”。点击展开,找到“启动脚本”下的文本框。复制并粘贴整个 install.sh 代码。
点击底部的“创建”。
谷歌云 SDK
为了能够从您的终端与 GCP 互动,您应该登录到您的帐户,并且它应该被设置为您打算进行的项目(我假设您已经在您的终端上安装了谷歌云 SDK,如果不是这样,请按照 https://cloud.google.com/sdk/上的说明进行操作)
为了检查您是否登录,请在您的终端中复制并粘贴以下命令,它会显示哪个帐户是活动的。
gcloud auth list
如果您想要检查 Google Cloud SDK 当前是否设置为您想要处理的项目,您可以从终端使用下面的命令。
gcloud config list
如果一切正常,从终端运行下面的命令,该命令位于从 Git 克隆的 flask_sparkml 文件夹中。
gcloud compute instances create flask-sparkml \
--zone=europe-west1-b \
--scopes=[https://www.googleapis.com/auth/cloud-platform](https://www.googleapis.com/auth/cloud-platform) \
--metadata-from-file startup-script=install.sh --tags http-server
这将创建一个包含以下内容的虚拟机实例
- 实例名设置为 flask-sparkml
- 区域设置为欧洲-西方 1-b
- 允许完全访问所有云 API
- 使用本地文件 install.sh 作为虚拟机的启动脚本
- 允许 HTTP 流量
创建防火墙规则
为了允许从外部访问端口 8080 上的应用程序,我们需要创建一个打开端口 8080 的入站防火墙规则。同样,您可以选择在 web 控制台上或从终端执行此操作。
Web 控制台
从控制台左侧菜单的“网络”部分找到“VPC 网络”。点击进入“防火墙规则”并点击顶部的“创建防火墙规则”按钮。这将把你带到如下所示的屏幕。
首先,给它一个描述性的名字。我将其命名为“default-allow-http-8080”。向下滚动,您会看到“流量方向”的默认设置已经设置为“入口”,并且“匹配时的操作”也设置为“允许”。由于某些原因,如果它们没有设置,请确保它们设置正确。
向下滚动到“目标标签”,给它一个标签“http-server”。这些标签说明了 GCP 如何将网络规则应用于虚拟机实例或实例模板。当我们在控制台中创建虚拟机时,我们选中了“允许 HTTP 流量”复选框。通过这样做,我们将任何带有标签“http-server”的防火墙规则附加到 VM 实例上。因此,通过创建一个新的防火墙规则与相同的标签将自动适用于您的虚拟机。接下来,为“源 IP 范围”键入“0.0.0.0/0”。这将允许从任何 IP 地址访问我们的 API。如果您想指定一些有限的 IP 范围,那么您可以在这里这样做。最后,在“协议和端口”下,在“tcp”旁边键入“8080”,然后单击底部的“创建”按钮。
谷歌云 SDK
如果您想从本地终端创建防火墙规则,您可以从终端运行以下命令。
gcloud compute firewall-rules create default-allow-http-8080 \
--allow tcp:8080 \
--source-ranges 0.0.0.0/0 \
--target-tags http-server
您还可以检查此防火墙规则是否创建正确。
gcloud compute firewall-rules list
正在连接到创建的虚拟机实例
现在,可以通过 web 控制台或从终端创建计算引擎虚拟机。为了检查启动脚本是否被正确触发,让我们连接到虚拟机。同样,您可以通过 web 控制台或终端来完成此操作。
Web 控制台
从左侧菜单转到“计算引擎”和“虚拟机实例”。您将看到一个实例从列表中运行。点击“连接”下的“SSH”。
谷歌云 SDK
如果您的默认区域被设置为创建虚拟机的区域,并且项目被设置为您正在处理的当前项目(您可以通过从终端运行“gcloud config list”来查看属性),那么您可以简单地键入以下命令来 SSH 到您的虚拟机。
gcloud compute ssh [your_Google_user_name]@flask-sparkml
检查虚拟机上已安装的软件包
现在,既然我们在我们的虚拟机上,让我们检查一些东西。我们之前提供给 VM 的启动脚本包括 Java JDK8 install 和一些 Python 包,包括 PySpark。我们可以检查它们是否安装正确。(请注意,您需要等待一两分钟,以便虚拟机有足够的时间在后台完成安装。)
java -version
Java 好像是装的。Python 包呢?
pip list
我们可以看到我们在启动脚本中指定的四个 Python 包安装在 VM 上。先不要关闭 VM 终端,因为我们稍后将需要回到这一点。
将本地文件复制到虚拟机
下一步是将 main.py 和 model 从本地机器上传到 VM。转到您的本地终端,将 CD 放入 flaks_sparkml(从 Git 克隆的文件夹)文件夹。运行以下命令,将文件安全地复制到虚拟机。
gcloud compute scp --recurse . [your_Google_user_name][@flask](http://twitter.com/flask)-sparkml:~/flask_sparkml
返回虚拟机终端,检查文件是否已上传。
cd /home/[your_Google_user_name]/flask_sparkml
ls -l
最后,我们准备运行实际的 Flask 应用程序。
运行烧瓶休息 API
在运行实际代码之前,让我们快速浏览一下代码,看看它做了什么。这方面的原始代码来自一篇中型帖子由 Nguyen Ngo 将机器学习模型部署为 REST API ,我做了一些小的修改以适应我的特定用例。感谢伟大的教程阮 Ngo !我已经在代码中添加了注释,所以我不会一行一行地解释。
是时候运行应用程序并对应用程序进行 REST API 调用,以从您自己的文本中获得情绪预测了!在您的虚拟机终端(在上面的“连接到创建的虚拟机实例”步骤中保持打开状态)上,从/home/[your _ Google _ user _ name]/flask _ spark ml 目录运行以下命令(使用“nohup”命令防止虚拟机在退出虚拟机终端后关闭)。
nohup python main.py
您将看不到 main.py 文件的日志输出,因为它会将日志写入文件“nohup.out”。让我们关闭 VM 终端,仔细检查“nohup”是否正常工作,并通过 API 调用获得实时情绪预测。为了做到这一点,我们首先需要知道我们的应用程序部署的外部 IP 地址。您可以查看 web 控制台的“计算引擎”->“虚拟机实例”
或者通过运行以下命令从本地终端进行检查。
gcloud compute instances list
对部署的应用程序进行 API 调用
要么从本地终端启动 Python,要么打开 Jupyter 笔记本,复制并粘贴下面的代码块,然后运行以查看结果。
我期望看到模型预测上述文本为负。
“Listen Morty, I hate to break it to you, but what people call ‘love’ is just a chemical reaction that compels animals to breed.”
万岁!从我们的模型预测说,它是负面的,有相当高的信心。
测量 API 响应时间
你可能已经注意到,文件夹里还有一个文件我还没有提到。在完成这个项目的过程中,我脑海中一直有一个很大的问号。我知道 Spark 可以处理大数据,这在模型训练阶段可能是有益的。但是 Spark ML 部署在对单个条目进行实时预测时,性能如何?当我在上面进行 API 调用时,感觉并不是很快。所以我在完成的 API 中添加了一个最终实验。这是一个简单的 Python 程序,设计用于对 API 进行 100 次查询并记录 API 响应时间。最后,它会显示记录的响应时间的平均值、中值、最小值和最大值。
转到您的本地终端,在 flask_sparkml 文件夹中,运行程序并检查输出。
python response_time.py http://[external_IP_address_of_your_app]:8080
这是快还是慢?没有基准,我们无从得知。所以我很努力地谷歌了一些其他人的机器学习 API 响应时间。而我终于找到了这篇中帖Falcon vs . Flask——选择哪一个由 Dat Tran 创建可扩展的深度学习 REST API 。谢谢你的信息贴,达特兰!
从 Dat Tran 的帖子来看,Keras CNN 模型在 MNIST 数据集上的平均响应时间为 60ms。我们可以看到 Spark ML 的平均响应时间是 0.99 秒,也就是 990ms。那听起来一点也不好。
当我在寻找这个问题的答案时,我看到了一张幻灯片展示了 Nick Pentreath 用便携式分析格式生产 Spark ML 管道。感谢您带来的精彩幻灯片, Nick Pentreath !PFA (Portable Format for Analytics)是 Spark ML 模型的 JSON 表示,可以跨不同的语言、平台进行传输。即使我没有将我的模型导出为 PFA,我仍然提到这一点的原因是,他在生产中经历了 Spark ML 模型的一些限制。
Image courtesy of Nick Pentreath at slideshare.net
根据幻灯片(第 9 页:Spark 特有的挑战),由于 Spark 数据帧和任务调度的开销,Spark 中的评分模型很慢,并且由于其延迟,不是用于实时评分的最佳框架。
进一步考虑
尽管我们部署了一个工作 REST API,但这似乎不是实时服务于机器学习预测的理想解决方案。我可以进一步探索将模型导出为 PFA 并比较性能。或者我也可以尝试使用 Keras 或 Tensorflow 从头构建一个新模型,并部署它来与 Spark ML 进行性能比较。目前,我更倾向于尝试后者,因为这将让我有机会探索其他 GCP 服务,如谷歌云 ML 引擎。不管怎样,我会试着在这里分享我的下一段旅程。
清洁
为了避免在你的 GCP 账户上产生不必要的费用,清理是很重要的。您可以简单地删除您创建的 VM 实例,但是如果您想知道如何终止我们用 main.py 文件启动的 nohup 进程,我将通过简单的步骤来终止在后台运行的进程。使用“glcoud compute ssh”命令从 web 控制台或本地终端转到您的虚拟机终端。进入 VM 终端后,运行下面的命令来检查在后台运行的 main.py 的进程 ID。
ps aux | grep python | grep main.py
一旦你有了当前正在运行的进程的 id,使用下面的命令杀死它们,用你的进程 id 替换[]部分。
sudo kill [PID1] [PID2]
实际删除实例部分可以在 web 控制台或终端上完成。
Web 控制台
谷歌云 SDK
gcloud compute instances delete flask-sparkml
感谢您的阅读。您可以从下面的链接中找到 Git 脚本库。
https://github.com/tthustla/flask_sparkml
大规模部署 scikit-learn 模型
The bridges of Prague at sunrise, as seen from the Prague Metronome
Scikit-learn 非常适合组装一个快速模型来测试数据集。但是,如果您想对传入的实时数据运行它,该怎么办呢?了解如何在自动扩展的无服务器环境中为您的 scikit-learn 模型提供服务!
Cloud AI Adventures: explore the art, science, and tools of machine learning.
今天,我们将采用一个经过培训的 scikit-learn 模型,并将其部署在 Cloud ML Engine 上。使用这篇文章来建立您自己的部署管道,您将再也不需要担心如何部署和扩展您的模型了!
Scikit-learn 一直是机器学习入门的流行库。然而,并不是每个人都有过…
towardsdatascience.com](/get-going-with-scikit-learn-on-kaggle-32045d238eee)
假设你有一个动物园…
假设您有一个使用 scikit-learn 模型训练的模型,现在您想设置一个预测服务器。让我们看看如何根据我们在关于动物园动物的前一集中的代码来做这件事。
为了导出模型,我们将使用来自sklearn.externals
的joblib
库。
from sklearn.externals import joblib
joblib.dump(clf, 'model.joblib')
我们可以使用joblib.dump()
将模型导出到一个文件中。我们称我们的为model.joblib
。
一旦我们提交并运行这个内核,我们将能够从内核中检索输出:
model.joblib — ready for download
手里拿着我们训练过的 scikit-learn 模型,我们准备前往 Google Cloud ML Engine 加载模型以服务于预测。
没错,我们不仅可以为 TensorFlow,还可以为 scikit-learn ( 和 XGBoost)获得所有的自动伸缩、安全 REST API 优点!这使您能够轻松地在 scikit-learn 和 TensorFlow 之间来回转换。
提供一些馅饼…和预测
将我们的模型放到云中的第一步是将model.joblib
文件上传到 Google 云存储中。
Notice my model.joblib file is wrapped in a folder called zoo_model
组织提示:要求文件的名称必须是字面上的“model.joblib”,所以你可能想把文件放在一个文件夹里,用一个你会记住的名称。否则,以后当您创建更多的模型时,它们都将与
model.joblib
同名!
让我们创建我们的模型和版本,指定我们正在加载一个 scikit-learn 模型,并选择 Cloud ML engine 的运行时版本,以及我们用于导出该模型的 Python 版本。因为我们在 Kaggle 上运行我们的培训,那是 Python 3。
给它一点时间来设置…基本上就是这样了!我们现在有一个在云中服务的 scikit-learn 模型!
你要给谁打电话?云 ML 预测!
当然,如果不能调用这些预测,一个可扩展的模型是没有用的。让我们来看看这有多简单。我已经从我们的数据中提取了一个样本行,它的答案应该是类别“4”。我们将把数据作为一个简单的数组呈现给 Cloud ML Engine,编码为一个 json 文件。
print(list(X_test.iloc[10:11].values))
在这里,我获取测试特性数据帧,并从中提取第 10 行,然后调用。值来获取基础 numpy 数组。不幸的是,numpy 数组输出的值之间没有逗号,我们真的需要逗号,所以我把 numpy 数组转换成 Python 列表并打印出来。(是的,你可以,而且可能真的应该使用json
库并对其进行适当编码,而不是依赖于print
行为!)
我已经将数组保存到一个输入文件中,现在我们可以为我们的 scikit-learn 模型调用 prediction REST API。gcloud
有一个内置的实用程序来完成这项工作。我们期待的响应是 4,这确实是我们得到的结果!万岁。
现在怎么办?
您可以按照本视频中的步骤将您的 scikit-learn 模型部署到生产环境中,或者通过将它转换为自动化管道来加快部署,这样每次您制作新模型时,它都会被部署出来,以便您可以对其进行测试!前往 Cloud ML Engine 并上传您的 scikit-learn 模型,轻松获得自动缩放预测!
关于这个主题的更详细的处理,文档中有一些很好的指南:【https://cloud.google.com/ml-engine/docs/scikit/quickstart】T4
感谢阅读本集云 AI 冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的me或订阅 YouTube 频道以捕捉未来的剧集。更多剧集即将推出!
使用交互式代码在 Python 中进行深度/呼吸优先搜索矩阵遍历[回到基础知识]
Image from Pixabay
当你想了解更多关于算法和人工智能的知识时,搜索算法是一个完美的起点。所以让我们从基本的呼吸优先搜索和深度优先搜索开始遍历一个矩阵。
请注意,代码没有在任何其他方法优化。这是暴力实现。所以要小心。
给定矩阵/问题
红框 →我们的 1 所在的位置(我们要找的东西)
黄框→ 我们开始搜索的位置
这个问题很简单,给定矩阵的 n*n 个网格,将会有一个称为“1”的元素,我们想要找到这个值,换句话说,我们想要知道元素 1 的坐标。
深度优先搜索方法
上面是递归的 DFS 实现,我们有一个名为 visited 的变量(这是一个列表)来跟踪我们访问过的所有坐标。而如果我们接下来要访问的坐标不在这个列表中,我们就要访问那个位置。为了形象化这个搜索算法的开始序列,请见下文。
呼吸优先搜索算法
BFS 算法也非常类似于 DFS。但是这次我们有一个队列变量来跟踪我们将要执行的下一个搜索坐标。另外,请注意,我们只是传递队列,而不是直接传递 x 和 y 坐标。再次想象这个算法的开始。
交互代码
为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问代码,请点击此处。
最后的话
我很喜欢实现这些算法,下次我会尝试做恒星搜索。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有的写作清单,请在这里查看我的网站。
同时,在我的 twitter 上关注我这里,访问我的网站,或者我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- python?,C. (2018)。为 python 选择除特定数字以外的随机整数?。Stackoverflow.com。检索于 2018 年 3 月 11 日,来自https://stack overflow . com/questions/17907213/choosing-random-integers-except-for-a-special-number-for-python
- Python?,M. (2018)。在 Python 中测量经过的时间?。Stackoverflow.com。检索于 2018 年 3 月 11 日,来自https://stack overflow . com/questions/7370801/measure-time-elapsed-in-python
- 8.10.队列—同步队列类— Python 2.7.14 文档。(2018).Docs.python.org。检索于 2018 年 3 月 11 日,来自https://docs.python.org/2/library/queue.html
- [复本],H. (2018)。如何在推送新对象之前检查队列中是否存在对象?Stackoverflow.com。检索于 2018 年 3 月 11 日,来自https://stack overflow . com/questions/27024881/how-to-check-if-object-exists-in-queue-before-pushing-new-object/27025015
- 修复错误-已达到最大递归深度。(2013).Python 技巧。检索于 2018 年 3 月 11 日,来自https://python tips . com/2013/08/31/fixing-error-maximum-recursion-depth-reached/
- p . j .(2013 年)。sys.setrecursionlimit @说真的,不要用这个代码!。Seriously.dontusethiscode.com。检索于 2018 年 3 月 11 日,来自http://serious . dontusethiscode . com/2013/04/14/setrecursionlimit . html
- A*搜索算法。(2018).En.wikipedia.org。检索于 2018 年 3 月 11 日,来自https://en.wikipedia.org/wiki/A*_search_algorithm
- 广度优先搜索。(2018).En.wikipedia.org。检索于 2018 年 3 月 11 日,来自 https://en.wikipedia.org/wiki/Breadth-first_search
- 深度优先搜索。(2018).En.wikipedia.org。检索于 2018 年 3 月 11 日,来自 https://en.wikipedia.org/wiki/Depth-first_search
无向图中的深度优先搜索
S. Dasgupta、C. H. Papadimitriou 和 U. V. Vazirani 所著的《算法》一书的第 3 章和第 4 章主要关注图。一个图被指定为一组顶点V
(或节点)和所选顶点对之间的边E
。使用图表的一个很大的优点是,当解决问题时,图表提供了清晰性,因为它们没有杂乱的无关信息,只有数学对象。
图表示
具有n=|V|
顶点v1,...,vn
的图可以表示为一个矩阵(n x n
的数组),其(i, j)th
条目为:
- 1 如果从
vi
到vj
有边沿 - 否则为 0
在图的矩阵表示中,可以在恒定时间内检查特定边的存在,但是它需要O(n^2)
存储空间,如果图没有很多边,这可能是浪费。图的另一种表示是邻接表。它由|V|
链表组成(每个顶点一个)。然后,顶点u
的链表保存u
具有的顶点的名称和输出边。与矩阵表示相反,验证特定边的存在现在是线性的(通过运行相应的链表),但是存储图形所需的内存是O(|E|)
。
一个图可以根据它的边数分类如下:
- 稠密图:边的数量接近于图所能拥有的最大边数
- 稀疏图:边的数量接近于图所能拥有的最小边数
这一点很重要,因为在处理图形时,它在选择合适的数据结构和算法时起着很大的作用。例如,为了将万维网存储为图(一个网页是一个顶点,并且它具有到它具有超级链接的所有其他网页的边),使用邻接表更方便,因为万维网图非常稀疏(在数十亿种可能性中,平均一个网页仅具有到大约六个其他网页的超级链接)。
无向图中的深度优先搜索
作者在第三章中考察的第一个算法是无向图中的深度优先搜索。在无向图中,连接在一起的顶点有双向边。
深度优先搜索是一种线性时间算法,它基本上回答了以下问题:
- 从给定的顶点可以到达图的哪些部分?
深度优先搜索算法的以下实现使用邻接表并返回从指定顶点可达的图的所有顶点。
深度优先搜索算法
伪代码:
procedure DFS(G,v):
label v as discovered
for all edges from v to w in G.adjacentEdges(v) do
if vertex w is not labeled as discovered then
recursively call DFS(G,w)
实施:
测试:
结论
深度优先搜索是一个有趣的算法,正如你可能怀疑的那样,它特别适合于检查一个图是否连通;如果深度优先搜索返回的树包含图中的所有顶点,则它是连通的,否则不是。
从全连接网络逐步推导卷积神经网络
在图像分析中,卷积神经网络(简称为 CNN 或 ConvNets)比全连接(FC)网络具有更高的时间和内存效率。但是为什么呢?在图像分析方面,ConvNets 比 FC 网络有什么优势?ConvNet 是如何从 FC 网络派生出来的?CNN 中卷积这个术语是从哪里来的?这些问题将在本文中得到解答。
From Pixabay
- 简介
图像分析面临许多挑战,如分类、对象检测、识别、描述等。例如,如果要创建一个图像分类器,它应该能够以高精度工作,即使存在诸如遮挡、照明变化、视角等变化。以特征工程为主要步骤的传统图像分类流水线不适合在丰富的环境中工作。即使是该领域的专家也无法给出一个或一组能够在不同变化下达到高精度的特征。在这个问题的激励下,产生了特征学习的想法。自动学习适合处理图像的功能。这就是为什么人工神经网络(ann)是图像分析的稳健方法之一的原因。基于诸如梯度下降(GD)的学习算法,ANN 自动学习图像特征。原始图像被应用到人工神经网络,人工神经网络负责生成描述它的特征。
2。使用 FC 网络的图像分析
让我们看看 ANN 是如何处理图像的,以及为什么 CNN 在时间和内存需求方面是高效的。为了简单起见,给出的例子使用小的图像尺寸和较少数量的神经元。
Figure 1. Input image
ANN 输入层的输入是图像像素。每个像素代表一个输入。因为人工神经网络处理的是 1D 向量,而不是 2D 矩阵,所以最好将上面的 2D 图像转换成 1D 向量,如图 2 所示。
Figure 2. Input image to CNN input layer
每个像素映射到向量中的一个元素。向量中的每个元素代表人工神经网络中的一个神经元。因为图像有 3x3=9 个像素,那么输入层会有 9 个神经元。将向量表示为行或列并不重要,但 ANN 通常水平延伸,其每一层都表示为列向量。
准备好人工神经网络的输入后,下一步是添加学习如何将图像像素转换为代表性特征的隐藏层。假设有一个 16 个神经元的隐藏层,如图 3 所示。
Figure 3. Parameters per Neuron
因为网络是完全连接的,这意味着层 i 中的每个神经元都连接到层 i-1 中的所有神经元。因此,隐藏层中的每个神经元都连接到输入层中的所有 9 个像素。换句话说,每个输入像素连接到隐藏层中的 16 个神经元,其中每个连接都有相应的唯一参数。通过将每个像素连接到隐藏层中的所有神经元,对于如图 4 所示的这种微小网络,将会有 9x16=144 个参数或权重。
Figure 4. Fully Connected Network
3。大量参数
此 FC 网络中的参数数量似乎可以接受。但是这个数字随着图像像素和隐藏层的数量的增加而大大增加。
比如这个网络有两个隐层,神经元个数分别为 90 和 50,那么输入层和第一个隐层之间的参数个数为 9x90=810 。两个隐藏层之间的参数个数为90x 50 = 4500。该网络中的参数总数为810+4500 = 5310。这对于这样的网络来说是一个很大的数字。另一个例子是尺寸为 32 x32(1024 像素)的非常小的图像。如果网络以 500 个神经元的单隐层运行,则总共有1024 * 500 = 512000 个参数(权重)。对于只有一个隐藏层处理小图像的网络来说,这是一个巨大的数字。必须有一种减少这种参数数量的解决方案。这就是 CNN 发挥关键作用的地方。它创建了一个非常大的网络,但参数数量少于 FC 网络。
4。神经元分组
即使对于小型网络,使参数数量变得非常大的问题是 FC 网络在连续层中的每两个神经元之间添加一个参数。不是在每两个神经元之间分配单个参数,而是如图 5 所示,可以将单个参数给予神经元的块或组。图 3 中索引为 0 的像素连接到具有 4 个不同权重的索引为(0、1、2 和 3)的前 4 个神经元。如果神经元如图 5 所示被分成 4 个一组,那么同一组中的所有神经元将被分配一个参数。
Figure 5. Grouping Neurons
因此,图 5 中索引为 0 的像素将连接到图 6 中权重相同的前 4 个神经元。相同的参数被分配给每 4 个连续的神经元。结果,参数的数量减少了四分之一。每个输入神经元将有 16/4=4 个参数。整个网络将有 144/4=36 个参数。参数减少了 75%。这很好,但仍然有可能减少更多的参数。
Figure 6. Weights per group of neurons
图 7 显示了从每个像素到每个组的第一个神经元的独特连接。也就是说,所有缺失的连接都只是现有连接的副本。假设,从每个像素到每个组中的每个神经元都有连接,如图 4 所示,因为网络仍然是完全连接的。
Figure 7. Connections after neurons grouping
为了简单起见,除了所有像素与第一组中的第一个神经元之间的连接之外,所有连接都被省略,如图 8 所示。似乎每个组仍然连接到所有 9 个像素,因此它将有 9 个参数。有可能减少这种神经元所连接的像素数量。
Figure 8. Parameters per Group
5。像素空间相关性
当前配置使每个神经元接受所有像素。如果有一个函数 f(x1,x2,x3,x4)接受 4 个输入,这意味着要基于所有这 4 个输入做出决定。如果只有 2 个输入的函数给出了与使用所有 4 个输入相同的结果,那么我们不必使用所有这 4 个输入。给出所需结果的 2 个输入就足够了。这和上面的情况类似。每个神经元接受所有 9 个像素作为输入。如果使用更少的像素会返回相同或更好的结果,那么我们应该通过它。
通常,在图像分析中,每个像素与其周围的像素(即邻居)高度相关。两个像素之间的距离越大,它们就越不相关。例如,在图 9 所示的摄影师图像中,人脸内部的像素与其周围的人脸像素相关。但它与远处像素(如天空或地面)的相关性较小。
Figure 9. Cameraman Image
基于这样的假设,上面例子中的每个神经元将只接受彼此空间相关的像素,因为对所有像素进行处理是合理的。如图 10 所示,可以只选择 4 个空间相关的像素,而不是将所有 9 个像素作为输入应用于每个神经元。图像中位于(0,0)处的列向量中索引为 0 的第一个像素将作为输入应用于具有其 3 个最大空间相关像素的第一个神经元。基于输入图像,与该像素在空间上最相关的 3 个像素是索引为(0,1)、(1,0)和(1,1)的像素。因此,神经元将只接受 4 个像素,而不是 9 个。因为同一组中的所有神经元共享相同的参数,所以每组中的 4 个神经元将只有 4 个参数,而不是 9 个。因此,参数的总数将是 4x4=16。与图 4 中的全连接网络相比,参数减少了 144–16 = 128(即减少了 88.89%)。
Figure 10. Working locally inside the first neuron inside a the first group.
6。CNN 中的卷积
至此,为什么 CNN 比 FC 网络更具时间和内存效率的问题得到了解答。使用较少的参数允许增加具有大量层和神经元的深度 CNN,这在 FC 网络中是不可能的。接下来是得到 CNN 中卷积的思想。
现在只有 4 个权重分配给同一个块中的所有神经元。这 4 个权重将如何覆盖所有 9 个像素?让我们看看这是如何工作的。
图 11 示出了图 10 中的先前网络,但是在将权重标签添加到连接之后。在神经元内部,4 个输入像素中的每一个都乘以其相应的权重。该等式如图 11 所示。四个像素和权重可以更好地显示为矩阵,如图 11 所示。先前的结果将通过逐个元素地将权重矩阵乘以当前的 4 个像素的集合来实现。实际上,卷积掩模的尺寸应该是奇数,例如 3×3。为了更好地处理,在这个例子中使用了 2x2 掩模。
Figure 11. Convolution Derivation
移动到索引为 1 的下一个神经元,它将与索引为 0 的神经元所使用的具有相同权重的另一组空间相关像素一起工作。此外,指数为 2 和 3 的神经元将与其他两组空间相关的像素一起工作。这如图 12 所示。似乎组中的第一个神经元从左上角的像素开始,并选择它周围的许多像素。该组中的最后一个神经元处理右下角的像素及其周围的像素。调节中间神经元以选择中间像素。这种行为等同于卷积。该组的一组权重和图像之间的卷积。这就是为什么 CNN 有卷积这个术语。
Figure 12. Convolution across all neurons per the first group
同样的程序也适用于其余的神经元群。每组的第一个神经元从左上角及其周围的像素开始。每组的最后一个神经元处理右下角及其周围的像素。中间神经元作用于中间像素。
7 .。参考文献
Aghdam、Hamed Habibi 和 Elnaz Jahani Heravi。 卷积神经网络指南:交通标志检测和分类的实际应用 。斯普林格,2017。
本文原载于 LinkedIn on 本页面 。
也可以在 SlideShare 上下载 PDF 文件 。
联系作者:
艾哈迈德·法齐·加德:http://www.linkedin.com/in/ahmedfgadahmed.f.gad@gmail.com
Sigmoid 函数的导数
Sigmoid and Dino
在本文中,我们将看到在人工智能应用中使用的 Sigmoid 函数的完整推导。
首先,让我们来看看 sigmoid 函数
Sigmoid function
好吧,看起来不错!
我们读作,x 的 sigmoid 是 1/1 加上负 x 的指数 这就是方程 (1) 。
让我们看看 sigmoid 函数的图形,
查看该图,我们可以看到给定一个数字n
,sigmoid 函数将在 0 和 1 之间映射该数字。
随着n
的值变大,sigmoid 函数值越来越接近 1 ,随着n
变小,sigmoid 函数值越来越接近 0 。
好,让我们开始推导 sigmoid 函数!
所以,我们要的价值是
Step 1
在上面的步骤中,我只是从 (1) 展开了 sigmoid 函数的取值公式
接下来,我们简单的用 负指数 来表示上面的方程,
Step 2
接下来,我们将应用 倒易法则 ,它简单地说
Reciprocal Rule
运用互易法则,我们进入下一步
Step 3
为了清楚地看到上一步中发生了什么,用(1 + e^(-x))
替换互易规则中的u(x)
。
接下来,我们需要应用线性的 法则 ,它简单地说
Rule of Linearity
应用线性法则,我们得到
Step 4
好的,这很简单,现在让我们一个一个地推导它们。
现在,常数的导数是 0 ,所以我们可以把下一步写成
Step 5
把 0 加到某个东西上不会有什么影响,所以我们将在下一步中去掉 0,然后进行下一个推导,为此我们将需要 指数法则 ,它简单地说
Exponential Rule
运用我们得到的指数法则,
Step 6
同样,为了更好地理解,您可以简单地将指数规则中的e^u(x)
替换为e^(-x)
接下来,由的线性规律我们可以写出的
Step 7
微分变量的导数是 1 ,应用它我们得到
Step 8
现在,我们可以简单地打开第二对括号,应用我们得到的基本规则-1 * -1 = +1
Step 9
可以写成
Step 10
好了,我们完成了求导!!
但是但是,我们仍然需要把它简化一点,以达到机器学习中使用的形式。好了,我们走吧!
首先,让我们重写如下
Step 11
然后重写为
Step 12
因为+1 — 1 = 0
我们可以做到这一点
Step 13
现在让我们把分数分开,重写为
Step 14
让我们消去分子和分母
Step 15
现在,如果我们看一看本文的第一个等式 (1) ,那么我们可以改写如下
Step 16
这样简化就完成了!
所以,sigmoid 函数的导数是
Derivative of the Sigmoid Function
sigmoid 函数的导数的图形看起来像
Graph of Sigmoid and the derivative of the Sigmoid function
感谢您阅读文章!想和我交流吗?
以下是我的 Linkedin 个人资料和 YouTube 频道的链接,
查看 Arunava Chakraborty 在 LinkedIn 上的职业简介。LinkedIn 是世界上最大的商业网络,帮助…
www.linkedin.com](https://www.linkedin.com/in/iarunava/) [## 阿鲁纳瓦(@amArunava) |推特
阿鲁纳瓦(@amArunava)的最新推文:“发表了一篇关于@ Sigmoid 函数的中等导数的文章我的第一…
twitter.com](https://twitter.com/amArunava) [## 阿鲁纳瓦
订阅深入了解 Python 里的所有东西。
www.youtube.com](https://www.youtube.com/channel/UC2ZFGaNzZt-sUy2qZT6L7Zw)
给我发消息!我们连线吧!
des . ai . gn——用人工智能增强人类创造力
用神经网络混合、创造和搜索美学上连贯的设计。
人工智能和计算机科学中讨论最多的一个方面是机器**是否有创造力**。这个讨论和第一台计算机一样古老,但是最近来自生成性对抗网络和类似架构的惊人结果确实使这个讨论变得更大。作为一名创意者和技术专家,我最近关注了一个相似但本质上不同的话题:**人工智能能增强人类的创造力**?设计师可以使用机器智能增强灵感吗?**
一开始有画。如果不是第一个,也是第一个帮助创意人员发挥创造力的软件工具之一。然后,人们开始看到计算机在处理图形方面是多么酷。现在,我们有了 Adobe 软件,比如 Photoshop,这些软件极大地增强了人类创作艺术品和编辑图片的能力,这在以前是不可想象的。下一步是什么?人工智能。为了分析这个新领域,我关注了两个不同的设计领域:室内设计和时装设计**。**
众所周知,灵感是一种 T21 缪斯。真是不可预测。伟大的想法可以从任何地方冒出来,即使一个人专注了几个星期也找不到。所以我在能够影响灵感的不同方面下了功夫:研究和创作**。**
- 研究**意味着寻找过去的设计,寻找与我们想法相似的东西来获得灵感。
- 创造**意味着在尽可能短的时间内从零开始到完成设计,从而创造出允许快速创造性实验的工具。
所以,目标很简单:彻底改变设计师使用人工智能的方式。
作为第一步,我从互联网上创建了一个椅子和沙发的小型数据集(大约 500 个样本)。我一直喜欢简单的室内设计,将 AI 与室内设计融合的想法真的让我很感兴趣。我需要实现一个神经网络架构,它可以从这些未标记的数据中提取视觉特征,并且基本上能够理解椅子的样子。因此,我实现了一个卷积自动编码器,,它学习如何将原始图像压缩到更小的尺寸(在我的例子中,从 240x240 到 15x15),然后如何尽可能地重建原始图像。
Convolutional auto encoder structure.
瓶颈结构迫使网络学习重要的视觉特征,这些特征在 15×15 维的潜在空间中用数字表示。这是我开发的应用程序背后的核心模型,我将在本文后面讨论。
Reconstruction of chair designs with convolutional autoencoders.
创建和训练自动编码器结构有什么好处?核心在于潜在的空间表现。这个小矩阵以一种通常不可预测的方式包含了网络已经学会识别的数据集的显著视觉特征,在这个空间中进行计算会更好,例如,计算距离,甚至进行代数求和。
这些工具如何让设计师能够轻松和直观地在椅子设计或纺织品/服装设计的数据集中进行搜索?将所有数据集投影到这个潜在空间中,可以让我们轻松计算样本之间的距离**,从而进行反向图像搜索。虽然有许多方法可以实现这一点,但我很好奇,想检查一下“神经”反向图像搜索的性能,在我的例子中,使用的是椅子。下面显示了一些结果:你可以选择一个图像作为查询;网络(特别是编码器)提取潜在的表示,然后你可以计算距离(欧几里德,余弦等。)在查询和数据集图像之间。这使得寻找 灵感的过程变得更加容易。**
Neural Inverse Image Search. The first chair (top) is the query, will the other two are two random samples that are similar enough. (latent space distance under a threshold)
另一个有趣的应用是混合来自数据集的不同样本以生成新的样本**,这些样本共享来自两者的视觉特征。特别是,可以混合不同椅子的设计,以获得一个新的美学上连贯的椅子,并与两把椅子共享设计细节。这再次允许设计师通过混合有趣的设计立即试验新的想法,直到一些结果激发他/她的创造力。通过平均不同椅子设计的潜在空间表现,这是可能的。一个加权平均值甚至可以给出大量的细微差别,即创造一个更接近一个或另一个“母体”的新设计。看看下面一些有趣的结果。**
Mixing different chair designs to generate a new one.
我还训练了一个深度卷积生成对抗网络来从头开始创建新的椅子设计,但小数据集不允许获得真正好的结果,同时通常会过度拟合一些数据集样本。此外,这种方法不允许直接混合不同的现有设计。
A DCGAN dreaming of chairs.
受 pix2pix 方法的启发,我训练了相同的架构,以椅子的图纸作为输入,这基本上是数据集中自动计算的图像边缘,并根据它们重建原始图片。这样,网络可以被训练从简单的图纸开始生成设计,在平板电脑上甚至用鼠标。由于我的数据集非常小(通常采用的数据集有大约 10k 个样本,而我的有大约 500 个样本),结果并不突出,但它们很有希望:从 Gimp 上用触控板制作的简单草图,网络可以生成类似椅子设计的东西。有趣的是,它是如何自动地修改**、修正、填充图纸的某个部分,这是基于它对椅子应该是什么样子的经验。**
An example of generating a chair from a drawing. Notice how the network modifies and corrects some parts of the sketch.
我在时装设计上应用了同样的技术,特别是纺织品设计**,结果相似。我和我的几个朋友进一步发展了这个项目的这个分支,我们创建了一个神经逆向图像搜索,它可以在一个网络应用程序上用简单的图画工作。在演示中,用户可以简单地画出他/她想在纺织品图案数据库中找到的图案。神经网络从绘图中提取视觉特征,并将它们与数据库图像中的视觉特征进行比较。经过一些计算后,它返回看起来最匹配的那些。**
Neural reverse image search directly from drawings.
这是在模式数据库中搜索的一种非常简单和直观的方式,可以为任何设计师节省大量的时间。
我们从网上提取的纺织品图案数据库也是一个有趣的游乐场,可以测试设计的混合,以创建一个新的设计。在几秒钟内,设计师可以通过组合现有的图案来创建新的图案,并收集大量的想法和灵感。
Neural pattern mixing. In a couple of seconds, a neural network creates new pattern starting from existing ones.
将人工智能和设计结合起来对我来说是真正鼓舞人心的,我对这两者都充满热情。我真的相信人工智能可以创造出增强艺术家,实现新的搜索和创造方式。这个领域的人们似乎喜欢这个想法,因为由于这个项目,我们赢得了最近在米兰举行的黑客马拉松CognitiveHack。挑战在于时装设计,以及增强设计师能力和灵感的方法。这一创意被评为最佳创意,并将在未来与赞助该活动的时尚品牌和公司合作,进一步推广。
描述一次你失败的经历
工作面试通常是一个尴尬的过程。你很紧张,你需要看起来既有个性又专业,你需要把自己推销成一个了不起的产品,同时又不要自大。更尴尬的是当面试官探究你的弱点时。这里的老一套答案是把你的缺点变成优点——我工作太努力,关心太多!
我发现这令人沮丧,因为如果我们是一个真正重视学习的社区,那么我们需要诚实地面对我们的弱点,以便我们能够克服或管理它们。我的总会职业教练在一次模拟面试中问了我一个这样的问题。问题是“描述一次你失败的经历”,这是我的答案。
失败——我有史以来最糟糕的演讲
我们在劳联-产联利用我们的会员数据做了一些惊人的工作,我被要求在一次客户政治主管会议上就此做一个简短的介绍。我需要说的是,我们为客户开发了一个新的门户网站来上传他们的数据,这使我们能够更快地向他们提供他们需要的交付品。
当热情的技术人员与非技术利益相关者混合时,我遇到的问题是常见的。我为我们团队的工作感到非常自豪,所以我想了解它是如何工作的细节。
我做了一个工具如何工作的现场演示,展示了上传他们组织的数据的过程中的每一步。问题是房间里的人是高级职员,他们可能会将此任务委派给他们的 IT 团队。我在一台不熟悉的笔记本电脑上做这件事,拖长了演示时间,使问题变得更加复杂。
房间里的客户积极地给我负面的反馈。一位客户评论说“你不应该展示这个”。
复苏——内容拯救了我
尽管有这样的负面反馈,我还是坚持给他们看了一些我们写的关于他们成员的报告。因为观众是政治指导者,他们关心关于他们成员的政治统计。随着我们的新发展,我们将定期向政治董事提供他们需要的信息,如有多少成员登记投票。
这是一款易于决策者使用和理解的产品。会后,几名政治主任与我联系,确保他们会在接收这些例行报告的名单上。
我学到的——保持简单愚蠢
他们说你应该在演讲前了解你的听众。你不仅要知道他们是谁,还要知道他们想知道什么。我知道这些观众成员是非技术利益相关者,但是我错误地认为他们会像我一样对这些新开发的技术细节充满热情。
现在,当我向非技术利益相关者演示时,我尽量不让我的热情冲昏了头脑。在这些陈述中,我关注的是我们试图解决的问题,给出我们如何解决问题的高层次观点,并解释最终结果是什么。
如果听众中有技术利益相关者在细节上向我施压,我会尝试回答他们,或者与他们进行讨论,以便我们可以更深入地讨论细节。
我希望将来社区里的人们对他们的失败更加开放。这不仅包括像我这样的技术专家对这些问题持开放态度,还要求公司真诚地提出这类问题,并承认我们都有弱点。如果我们能建立起这种信任,那么我们就能共同从失败中吸取教训。
设计思维就是做出更好的决策
UK EquatePlus user group
设计思维和创新有什么联系?今天在谷歌上快速搜索“设计思维学位”会出现 442 万个结果。大学和企业教育提出了 Ideo 最初愿景的一系列令人印象深刻的变体,即移情、定义、构思、原型和测试。尽管有数量惊人的项目宣扬“设计思维”,但很少有证据表明设计和创新之间有直接关系。约翰·肯尼迪断言,设计思维的主流观点往往是肤浅的和误导的。让我们指出,大多数人都忽略了一个关键点:设计思维需要一种不同的方法来看待我们试图解决的问题,我们如何使用数据,以及我们如何寻找解决方案。
设计从根本上讲是关于如何理解事物——或者像 Aaash Goel 建议的那样,“把抽象变成具体的东西”试图定义“事物”的确切含义需要仔细考虑问题的本质(服务创新?,客户参与度?,组织可持续性?)我们正在努力解决。在我们的 4P 框架中,我们建议可以通过将问题置于地点(公司、供应链或市场的愿景、事件、参与者和结果)平台(用于将产品、服务或体验的生产者和消费者聚集在一起的技术)人员(我们如何构建业务挑战和解决方案的思维模式)和实践(生产的文化、规范和程序)来分析问题。【iv】
IBMs Lara Hanlon 认为,在过去的十年里,设计已经从改变事物的外观发展到模拟事物的体验。今天,我们利用自己掌握的数据探索地方、平台、人物和活动。在我们的计划阶梯框架【VI】中,我们提出这些经验是组织战略及其数据使用之间关系的模型化愿景。在自上而下的决策过程中,远见者通常会强加一种策略,这种策略决定了策略、背景和数据收集。在自下而上的决策中,数据可以帮助领导层理解在任何给定市场中可以指导战略的背景、战术和战略。
设计思维的价值既不在于它的艺术吸引力,也不在于它的非正统性,而在于用不同的方式思考如何解决业务和组织的挑战。如果说演绎是科学管理的核心——用于“严格证明”商业法则的推理,那么归纳就是管理艺术的核心:将我们观察的前提视为市场和行业永恒真理的证据。设计思维既不依赖于演绎也不依赖于归纳,而是依赖于溯因推理,这种推理涉及在复杂环境中对更好的产品、服务和想法进行概率性押注。总之,设计思维是关于意义的:探索问题的本质,识别相关数据,并学会做出有影响力的决定。
(重新)设计我们思考价值的方式是商业分析研究所的核心。在巴约纳的暑期学校,以及在欧洲的大师班,我们让分析为您和您的组织服务。该研究所专注于管理者数据科学的五个应用:在数字时代工作、数据驱动的决策、机器学习、社区管理和视觉通信。数据驱动的决策会对你未来的工作和职业生涯产生影响。
Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析学院的负责人。 他的领英简介可以在www.linkedin.com/in/leeschlenker.查看你可以在【https://twitter.com/DSign4Analytics】T21关注我们的推特
【I】Kolko,J. (2007),设计与创新的微妙关系。Routledge 的工件,第 1 卷,2007 年第 3 期
【ii】j . Kennedy,(2016),设计思维绝不能成为管理时尚,Fjordnet
【iii】Goel,a .(2016),你想成为什么样的设计师?
【iv】sch lenker,L. (2016),DSIgn4Change —改进管理教育的 4Ps,载于 J. M. Spector 等著《数字时代教、学与教育领导的能力、挑战与变革》,施普林格。
【v】(2016)j . Kennedy,一场为生活而设计的革命正在席卷 IBM ,硅共和国
【VI】sch lenker,L. (2017) 在一个人人都更喜欢发帖而不是倾听的经济中,领导力只是一种幻觉吗?
用一个简单的 Python 命令创建您的实验设计
更新(2019 年 7 月):这组代码现在以标准 Python 库的形式提供— **doepy**
。你所要做的就是在你的终端中运行pip install doepy
。然后使用这个库按照这里的文档生成设计表。
[## DOEPY (pip 安装 doepy) - doepy 0.0.1 文档
doepy.readthedocs.io](https://doepy.readthedocs.io/en/latest/)
介绍
实验设计对于任何计划进行实验分析的科学家、工程师或统计学家来说,都是一项重要的活动。在这个数据科学和相关的统计建模和机器学习领域迅速扩展的时代,这项工作变得非常重要。一个计划良好的 DOE 可以给研究人员提供有意义的数据集,让他们根据最佳数量的实验采取行动,保留关键资源。
毕竟,数据科学的基本目标是用真实世界的数据进行最高质量的科学调查和建模。为了用数据做好科学研究,需要通过深思熟虑的实验来收集数据,以涵盖所有的极端情况并减少任何可能的偏差。
什么是科学实验?
在其最简单的形式中,科学实验旨在通过引入先决条件的变化来预测结果,这由一个或多个独立变量表示,也称为“输入变量”或“预测变量”通常假设一个或多个自变量的变化会导致一个或多个因变量的变化,也称为“输出变量”或“响应变量”实验设计还可以确定控制变量,这些变量必须保持不变,以防止外部因素影响结果。
什么是实验设计?
实验设计不仅包括选择合适的自变量、因变量和控制变量,还包括在给定可用资源限制的情况下,在统计最优条件下规划实验的实施。有多种方法可以确定实验中使用的一组设计点(独立变量设置的独特组合)。
实验设计的主要关注点包括建立效度、信度和可复制性。例如,通过仔细选择自变量,降低测量误差的风险,并确保方法的文档足够详细,可以部分解决这些问题。相关问题包括实现适当水平的统计功效和灵敏度。
在所有严肃的科学、技术甚至社会科学研究领域——计算机科学、物理学、地质学、政治学、电子工程、心理学、商业营销分析、金融分析等——都需要精心设计实验
对于现实生活中的工程问题,它出现的频率比你想象的要高。工程实验预算通常是有限的,你仍然需要建立一个机器学习模型。您将如何在不超出预算的情况下最大限度地接触数据/响应的所有方面?
…数据科学的基本目标是利用真实世界的数据进行最高质量的科学调查和建模。为了用数据做好科学研究,需要通过深思熟虑的实验来收集数据,以涵盖所有的极端情况并减少任何可能的偏差。
Python 中开源 DOE builder 包的选项?
不幸的是,大多数最先进的 DOE 生成器都是 JMP (SAS)或 Minitab 等商业统计软件包的一部分。
然而,如果存在一个开源代码,它提供了一个直观的用户界面,用于从一个简单的输入变量列表中生成实验设计计划,那么研究人员肯定会受益。
有几个 DOE builder Python 包,但单独来说,它们没有涵盖所有必要的 DOE 方法,并且它们缺乏简化的用户 API,用户可以只输入输入变量范围的 CSV 文件,然后在另一个 CSV 文件中获取 DOE 矩阵。
我很高兴地宣布一个基于 Python 的 DOE 包(带有许可的 MIT 许可证)可供任何人使用和增强。你可以 从我的 GitHub Repo 下载代码库,这里。
特征
这组代码是围绕核心包(如下所述)的函数集合,并从任意范围的输入变量为统计学家或工程师生成实验设计(DOE)矩阵。
所用基础包的限制
这两个核心包作为这个 repo 的基础,并不完整,因为它们没有涵盖设计工程师在计划实验时可能需要的生成 DOE 表的所有必要功能。此外,它们只提供低级 API,因为它们的标准输出已经规范化了 NumPy 数组。有人认为,可能不习惯直接处理 Python 对象的用户应该能够通过简化的用户界面来利用它们的功能。
简化的用户界面
用户只需提供一个简单的 CSV 文件,其中包含一个变量及其范围的表格(2 级,即最小/最大或 3 级)。 一些功能具有 2 级最小/最大范围,而另一些功能需要用户提供 3 级范围(低-中-高)。智能内置于代码中,用于处理范围输入不合适的情况,并根据给定输入通过简单的线性插值生成等级。代码将根据用户的选择生成 DOE,并将矩阵以 CSV 文件的形式写入磁盘。这样, 用户接触到的唯一 API 就是输入和输出 CSV 文件。然后,这些文件可用于任何工程模拟器、软件、过程控制模块,或输入过程设备。
设计选项
以下设计选项可从输入变量中生成:
- 全因子,
- 2 级部分因子,
- 普拉克特-伯曼公司,
- 苏哈列夫电网,
- 博克斯-贝肯,
- Box-Wilson(中央复合)带面向中央选项,
- 具有中心内接选项的 Box-Wilson(中心复合),
- 具有中心外切选项的 Box-Wilson(中心复合),
- 拉丁超立方体(简单),
- 拉丁超立方体(空间填充),
- 随机 k 均值聚类,
- 马希民重建,
- 基于 Halton 序列,
- 均匀随机矩阵
工程实验预算通常是有限的,你仍然需要建立一个机器学习模型。您将如何在不超出预算的情况下最大限度地接触数据/响应的所有方面?
怎么用?
需要哪些支持包?
首先,确保您已经安装了所有必需的软件包。您可以简单地运行。bash (Unix/Linux)和。bat (Windows)文件,从命令行界面安装这些包。它们包含以下命令,
**pip install numpy
pip install pandas
pip install matplotlib
pip install pydoe
pip install diversipy**
使用 PyDOE 的勘误表
请注意,在安装时,PyDOE 将抛出一些与类型转换相关的错误。有两种选择
- 我已经适当地修改了 pyDOE 代码,并在 repo 中包含了一个带有重写函数的文件。这是程序在执行时调用的文件,所以您应该看不到任何错误。
- 如果您遇到任何错误,您可以尝试修改 PyDOE 代码,方法是转到复制 pyDOE 文件的文件夹,并复制随此 repo 提供的两个文件
doe_factorial.py
和doe_box_behnken.py
。
生成 DOE 的一个简单命令
注意这只是一个代码库,而不是一个安装包。目前,请从 GitHub 克隆这个 repo,将所有文件存储在本地目录中,只需输入:
**python Main.py**
此后,一个简单的菜单将打印在屏幕上,并提示您选择数字(DOE)和输入 CSV 文件的名称(包含变量的名称和范围)。您必须将输入参数 CSV 文件存储在运行该代码的目录中。repo 中提供了几个示例 CSV 文件。请根据您的需要随意修改它们。您应该使用提供的通用 CSV 文件作为示例。请将因素放在列中,将水平放在行中(而不是反过来)。样本参数范围的示例如下:
是否有可用的安装程序/Python 库?
此时,无。我计划把它变成一个成熟的 Python 库,可以通过 PIP 命令从 PyPi 存储库中安装。但我不能承诺任何时间表:-) 如果有人想合作和工作在一个安装程序,请随时这样做。
例子
完全/部分因子设计
想象一个工厂中化学过程的一般例子,其中输入文件包含如上所示的参数范围表。如果我们由此构建一个全因子 DOE ,我们将得到一个有 81 个条目的表格,因为 4 个因子在 3 个水平上排列产生了 3⁴=81 组合!
显然,全因子设计发展很快!因此,工程师和科学家经常求助于使用半因子/部分因子设计,他们将一个或多个因子与其他因子混淆,构建一个简化的 DOE。
假设我们决定用第 4 个变量作为混杂因子(即不是独立变量,而是其他变量的函数)来构建这组变量的 2 级部分因子。如果函数关系为“【A-B-C-BC”,即第四个参数仅随第二个和第三个参数而变化,则输出表可能如下所示:
中心复合设计
Box-Wilson 中心复合设计,通常称为“中心复合设计”,或响应面方法学(RSM) 包含一个嵌入因子或部分因子设计,其中心点增加了一组“星点”,允许估计曲率。该方法由乔治·e·p·博克斯和 k·b·威尔逊于 1951 年提出。RSM 的主要思想是使用一系列设计的实验来获得最佳响应。
中心复合设计有三种类型。一个中心复合设计包括位于单位立方体的角上的立方体点,该单位立方体是区间[-1,1]的乘积,沿着立方体上或立方体外的轴的星形点,以及位于原点的中心点。这被称为外切(CCC)设计。
内接(CCI)设计如上所述,但是被缩放以使星点取值-1 和+1,并且立方体点位于立方体的内部。
面(CCF)设计在立方体的面上有星点。贴面设计每个因素有三个级别,而其他类型每个因素有五个级别。下图显示了三种因素的三种设计类型。
阅读这篇精彩的教程了解更多关于这种设计哲学的信息。
拉丁超立方体设计
有时,给定范围内的一组随机设计点可能会吸引实验者评估过程变量对输出的影响。蒙特卡洛模拟就是这种方法的一个很好的例子。然而,拉丁超立方体设计是实验设计的更好选择,而不是建立一个完整的随机矩阵,因为它试图将样本空间细分为更小的单元,并从每个子单元中仅选择一个元素。
在统计抽样中,当(且仅当)每行每列只有一个样本时,包含样本位置的正方形网格是拉丁正方形。拉丁超立方体是这一概念向任意维数的推广,其中每个样本是包含它的每个轴对齐超平面中的唯一样本。
当对 N 个变量的函数进行采样时,每个变量的范围被分成 M 个等概率区间。然后放置 M 个样本点,以满足拉丁超立方体要求;这使得每个变量的除法数 M 相等。这种抽样方案不需要更多维度(变量)的更多样本;这种独立性是这种抽样方案的主要优点之一。这样,可以获得随机样本点的更加*‘均匀分布’。*
用户可以选择采样点的密度。例如,如果我们选择从相同的输入文件中生成一个包含 12 个实验的拉丁超立方体,可能如下所示。当然,如果你运行这个函数,不能保证你会得到相同的矩阵,因为这些是随机抽样的,但是你得到了这个想法!
你可以在这里进一步阅读。
进一步扩展
目前,只能生成各种 DOE 并将输出保存在 CSV 文件中。然而,可以考虑一些有用的扩展,
- 基于模型信息增益的更高级的随机采样,即对超平面的那些体积进行采样,在那里可以为预期模型获得更多信息。当然,这需要了解输入/输出模型,即哪些参数更重要。
- 添加到的统计函数从 DOE 函数生成的各种实验的输出中生成描述性统计数据和基本可视化。
- 基本机器学习附加功能,用于分析各种实验的输出,并识别最重要的参数。
如果您有任何问题或想法要分享,请联系作者在tirthajyoti【AT】Gmail . com。此外,您可以查看作者的 GitHub 资源库 中其他有趣的代码片段。如果你像我一样对机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
设计一个机器学习模型并使用 Flask 在 Heroku 上部署它
从创建机器学习模型到在网络上部署它——简明指南
我们使用不同的机器学习算法和分类器对历史数据建立预测模型,绘制结果并计算模型对测试数据的准确性。现在怎么办?为了使用它来预测新的数据,我们必须将它部署在互联网上,以便外部世界可以使用它。在这篇文章中,我讲述了我如何训练一个机器学习模型,如何使用 Flask 在其上创建一个 web 应用程序,以及如何使用 Heroku 部署它。
训练决策树
决策树是一种众所周知的监督机器学习算法,因为它易于使用,弹性和灵活性。我已经在来自 UCI 机器学习知识库[的成人数据集上实现了该算法。在我以前的一篇文章中,我已经深入解释了数据集,并比较了我在其上训练的不同分类器。请随时查看 此处。
预处理数据集
它由 14 个属性和一个类别标签组成,说明个人的年收入是低于还是高于 50K。这些属性的范围从人的年龄、工人阶级标签到关系状态和人所属的种族。关于所有属性的信息可以在这里找到。
首先,我们从数据中找出并删除任何丢失的值。我已经用该列中的模式值替换了缺失的值。有许多其他方法可以替换缺失值,但对于这种类型的数据集来说,这似乎是最理想的。
为了将数据拟合到预测模型中,我们需要将分类值转换为数值。在此之前,我们将评估是否有必要对分类列进行任何转换。离散化是使分类数据更加整洁和有意义的常用方法。我对婚姻状况一栏进行了离散化处理,将它们缩小到只包含已婚或未婚的值。后来,我在剩余的数据列中应用了标签编码器。还有两个多余的列{'education ‘,’ education-num ’ },因此我删除了其中的一个。
这是数据集的样子:
拟合模型
在根据数据的输入方式对每个分类器的数据进行预处理之后,我们对数据进行切片,将标签和属性分开。现在,我们将数据集分成两半,一部分用于训练,一部分用于测试。这是使用 sklearn 的 train_test_split()函数实现的。
这样,我们可以达到大约 84%的精确度。现在,为了将该模型用于新的未知数据,我们需要保存该模型,以便我们可以在以后预测这些值。为此,我们利用 python 中的 pickle ,这是一种用于序列化和反序列化 Python 对象结构的强大算法。
使用 Flask 创建简单的 Web 应用程序
有很多用 javascript 编写的 web 开发框架,比如 Angular.js、React.js、Node.js,还有 PHP、ASP.net 等等。但是在这里,我们已经使用 python 来训练我们的机器学习模型,为什么不使用同样的方法创建一个 web 应用程序呢?Flask 是一个基于 python 的微框架,用于开发小型网站。让我们继续吧!
HTML 表单
为了从各种属性中预测收入,我们首先需要收集数据(新的属性值),然后使用我们上面构建的决策树模型来预测收入是大于 50K 还是小于 50K。因此,为了收集数据,我们创建了 html 表单,其中包含了从每个属性中选择的所有不同选项。这里,我只用 html 创建了一个简单的表单。可以从 这里 复习代码。如果你想让表单更具交互性,你也可以这样做。
Example of the form
重要提示:为了正确预测数据,每个标签的相应值应该与每个选定输入的值相匹配。
例如,在属性关系中,有 6 个分类值。这些转换成数值就像这样 { ‘夫’:0,‘非内亲’:1,‘他亲’:2,‘亲生’:3,‘未婚’:4,‘妻’:5}。 因此我们需要把相同的值放到 html 表单中。
在上面的 gist preprocessing.py 中,我创建了一个字典 mapping_dict ,它以键和值的形式存储所有分类标签的数值。这将有助于创建 html 表单。
到目前为止,我们已经创建了 html 表单,现在要托管静态页面,我们需要使用 flask。
烧瓶脚本
在开始编码部分之前,我们需要下载 flask 和其他一些库。在这里,我们利用虚拟环境,在虚拟环境中管理所有的库,并使开发和部署工作变得更加容易。
**mkdir income-prediction
cd income-prediction
python3 -m venv venv**
创建虚拟环境后,我们激活它。
**source venv/bin/activate**
现在让我们安装烧瓶。
**pip install flask**
让我们创建文件夹模板。在您的应用程序中,您将使用模板来呈现将在用户浏览器中显示的 HTML。这个文件夹包含我们的 html 表单文件index.html。
**mkdir templates**
在项目文件夹中创建 script.py 文件,并复制以下代码。
这里我们导入库,然后使用 app=Flask(__name__)
创建 flask 的一个实例。@app.route('/')
用于告诉 flask 哪个 url 应该触发函数索引(),在函数索引中,我们使用render_template('index.html')
在浏览器中显示脚本index.html。
让我们运行应用程序
**export FLASK_APP=script.py
run flask**
这将运行应用程序并启动一个简单的服务器。打开 http://127.0.0.1:5000/ 查看 html 表单。
预测收入值
当有人提交表单时,网页应该显示收入的预测值。为此,我们需要之前创建的模型文件( model.pkl ),在同一个项目文件夹中。
这里表单提交后,表单值以字典的形式存储在变量 to_predict_list 中。我们将其转换成字典值的列表,并将其作为参数传递给 ValuePredictor() 函数。在这个函数中,我们加载了 model.pkl 文件,并预测新值并返回结果。
这个结果/预测(收入多于或少于 50k )然后作为一个参数传递给模板引擎,并显示 html 页面。
创建下面的result.html文件,并将其添加到模板文件夹中。
再次运行应用程序,它应该在提交表单后预测收入。
我们已经成功创建了 Webapp。现在该用 heroku 来部署了。
这是我们项目布局的样子——
**/income-prediction
├── templates
│ └── index.html
├── venv/
├── model.pkl
└── setup.py**
使用 Heroku 部署 Flask 应用程序
Heroku 是一个平台即服务(PaaS),使开发者能够完全在云中构建、运行和操作应用。在这个项目中,我们使用heroku git进行部署。
为此,我们需要在我们的系统上安装 git 和 heroku CLI。请参考这些链接——GitHeroku】。现在,访问 Heroku 并创建一个帐户。****
让我们开始吧—
第一步:
首先我们需要将 gunicorn 下载到我们的虚拟环境 venv 中。我们可以用 pip 下载。
****pip install gunicorn****
Gunicorn 非常容易地处理请求并处理复杂的事情,如线程,当我们开发应用程序时,我们用来本地运行 Flask 的服务器不擅长处理真正的请求,因此我们使用 gunicorn。
第二步:
在我们的本地机器上,我们安装了很多库和其他重要文件,如 flask、gunicorn、sklearn 等。我们需要告诉 heroku,我们的项目需要所有这些库来成功运行应用程序。这是通过创建一个 requirements.txt 文件来完成的。
****pip freeze > requirements.txt****
第三步:
Procfile 是应用根目录下的一个文本文件,用来明确声明启动应用应该执行什么命令。这是对 heroku 的基本要求。
这个文件告诉 heroku 我们想要使用带有命令 gunicorn 和应用程序名称的 web 进程。
第四步:
在我们的项目文件夹中,我们有许多隐藏的或不必要的文件,我们不想部署到 heroku。例如 venv、实例文件夹或。缓存文件。为了不包含它们,我们创建了一个. gitignore 文件。
这是我们项目布局的样子——
****/income-prediction
├── templates
│ └── index.html
├── venv/
├── Procfile
├── requirements.txt
├── .gitignore
├── model.pkl
└── setup.py****
现在我们的项目准备推向 heroku。
第五步:
打开终端并执行以下命令—
****heroku login****
这将要求你的 heroku 证书。现在,我们需要创建一个 heroku 应用程序。
****heroku create****
这将使用系统生成的 url 创建一个 heroku 应用程序。我们可以稍后使用一组命令手动更改 url。
****git init
git add .
git commit -m 'initial commit'****
这将初始化回购,添加所有代码,并提交一条消息。
****git push heroku master
heroku open****
这将在 heroku 上推送整个应用程序,并在浏览器中打开网址。
搞定!
就这么简单。我们创建了一个机器学习模型,对其进行训练,创建了一个网络应用来使用该模型预测新数据,并使用 heroku 将其部署在互联网上。而且都是用 python 做的!
web app 的链接—https://income-predictor-from-census.herokuapp.com
设计由算法驱动的产品
我们已经写了很多关于实现不同算法的实用性的文章,从计算机视觉到自然语言处理。在这篇文章中,我们想把重点放在设计使用数据的产品的实用性上。我们如何才能建立一个人们会真正使用的数据产品?在我们开始之前,我们想举起手来说,我们并不自称是这方面的专家,而是想把我们从各种不同来源学到的东西结合起来,以一种我们认为可能有用的方式。
如前所述,我们已经结合了几种不同的方法,我们将在它们出现时引用它们,并使用这些方法的组合,我们试图概述我们可以如何考虑建筑产品,特别是我们应该如何将数据结合到它们的设计中。
以结构化的方式构建数据产品
Source: Wikimedia Commons
我们介绍的第一种方法是在 O’Reilly 的文章中开发的“传动系统方法”。作者是著名的数据科学家,他们开发了一个很好的框架,在构建产品时,数据是产生可操作结果不可或缺的一部分,而不仅仅是更多的数据。
方法的结构🚀
目标
定义客户目标或需求以及相关的输出/行动
杠杆
确定输入,即我们作为设计师可以控制的所有东西
数据
确定我们可以收集的数据集
型号
创建从输入到定义的输出/行动的映射,以便我们实现客户目标
作为示例,我们将介绍为 ARTimbarc 平台设计数据产品特性的过程。这一功能的目的是使平台上的内容更容易访问,并鼓励访问者参与他们可能不会参与的内容。
目标
定义目标的过程可以使用现代产品设计和管理原则来完成;首先关注公司的使命和产品特性,了解谁是目标用户,然后了解这些用户的需求。从这里开始,我们根据对产品和公司的高层次目标的理解,优先考虑用户的需求。
做功理论
这是一个引入创新理论的好时机,这一理论被称为“要做的工作”(JTBD)及其延伸客户工作(见伟大著作此处)。潜在的概念是人们使用产品和服务来完成工作;虽然产品来来去去,但潜在的工作不会消失。露华浓的首席执行官曾经说过“在工厂里,我们生产化妆品。在药店里,我们出售希望。”—客户不想要特定的产品,但他们希望完成特定的“工作”。将精力集中在解决“客户工作”的创新上比当前产品的增量创新更有成效。
对这一理论的全面描述超出了本文的范围,但我们想强调几点,我们认为在给定“客户工作”的情况下尝试创建创新产品时,必须牢记这几点。
客户工作的力量
推拉
客户工作将需求挖掘分解为两种“力量”——推动和拉动。推动是那些促使顾客想要改变他们当前行为的力量,并激励他们寻找解决方案,它们是他们寻找产品解决工作的首要原因。例如,推动购买电动汽车可能是因为附近的每个人都很环保,所以我不想看起来不关心环境。“拉”是将客户拉向某个特定解决方案的力量,因为他们觉得这个解决方案具体解决了他们的“工作”。在我们的电动汽车场景中,这可能会吸引购买特斯拉,因为在我工作的地方附近有很多充电点,所以在工作日充电非常容易。
焦虑和惰性
接下来,我们把减少需求分解成两种力量;焦虑和惰性。焦虑是客户在第一次使用产品之前的一种感觉,担心它不能解决工作,或者担心继续使用产品的行为不能解决工作。例如,电动车每天晚上充电会不会很麻烦,以至于我想在六个月后卖掉它?当客户固步自封,因此不关心新的创新或觉得改变当前解决方案太难时,惰性就会显现出来。
阐明对客户工作的这些力量的理解对于开发正确的解决方案和最终设计客户将使用的产品是至关重要的。
现在,我们已经详细了解了客户做出决策的环境及其用户需求,我们可以生成一个潜在解决方案列表,然后根据收入潜力、实施简易性、客户满意度等权衡因素,确定我们应该重点构建测试 MVP 的优先顺序。
实际例子
这与 ARTimbarc 平台有什么关系?
客户工作
发现我们知道我们会喜欢的新的和令人兴奋的文化机构
推送——我们希望能够与朋友分享他们周末看到的新画廊的故事
我们已经找到了很多关于他们城市即将举办的活动的信息,但是我们发现很难知道我们会喜欢哪一个
焦虑——我们的周末时间很宝贵,我们不想浪费在去看我们不感兴趣的展览上
惯性——我们已经习惯了我们常用的发现方法,比如暂停,所以坚持下去
鉴于我们的高层次目标是使内容更易访问,我们将把目标锁定在对其最有用的访问者,因此我们将把重点放在过去一个月在不同画廊不止一次使用该产品的用户上,因为我们将从这些观众那里获得最大的回报。该平台处于非常有利的位置,因为我们帮助各种机构放大他们的故事,并且已经拥有这个网络,我们可以利用它来帮助用户发现新的内容。
上面我们发现了我们的客户工作和相关的力量。下一步是找到合适的解决方案。出于说明的目的,我们将假设我们已经经历了适当的排除过程,并且基于他们之前的行为登陆到推荐系统来呈现个性化的相关内容。这显然并不新颖,但却是一种屡试不爽的提高参与度的方法。
现在我们有了目标——允许参观者通过展示与用户相关的内容来发现新的展览——我们可以进入驱动方法的下一阶段。
杠杆
平台的杠杆在很大程度上取决于产品的设计,但通常会围绕我们向用户展示什么以及何时展示。我们可以在用户到达场馆前,在探索区向他们展示推荐内容,或者在他们到达场馆时展示周边地区的推荐展览,或者在他们参观后展示个性化的电子邮件。我们可以控制的另一个杠杆是展示给用户的展品和展览的排名。我们有能力根据用户受欢迎程度、外部评论、定价、用户评级等对内容进行评分。
数据
我们可以收集什么样的数据来向我们的用户展示最相关的内容?首先,我们可以看看个人用户之前的行为;他们喜欢的展览,他们去过的展览,他们是否捐过款等等。我们可以看看相似的用户是如何行动的,或者他们的朋友喜欢什么。我们可以看看外部艺术评论是如何谈论展览的,以及它们是如何被评级的。我们可以查看展览和用户的位置数据。我们可以看看用户普遍支付的门票价格。我们也可以看看用户如何评价展品、展览和画廊。并且有许多其他数据源可能与建议特定用户接下来可能想要去看什么展览相关。
模型
对于传动系统方法的模型阶段,我们必须决定将我们的输入数据集映射到我们的输出(建议的展览)的最佳方法。有很多关于推荐引擎架构的文献,本文的目的并不是介绍这些机制。然而,一种常见的方法是查看一个协作过滤模型,根据具有类似行为的用户所做的事情来推荐内容。我们还可以在此基础上添加一些其他数据,如位置和场地偏好,以便我们只推荐附近的场地和我们知道用户和/或类似用户喜欢的场地。如果我们想要更加具体/有针对性,我们可以建立一个艺术评论的情感分析模型,只推荐那些有“积极”情感的评论。
摘要
我们设计了一个产品功能,以对用户有用的方式推荐内容。它不仅考虑了类似用户以前做过的事情,还根据内部评级和外部评论对内容进行评分,以便我们能够展示与我们的用户相关的最高质量的新展览。我们使用数据不仅是为了产生更多的数据,也是为了产生可操作的结果,让我们向用户展示更多相关的内容,并让他们参与更长时间。通过使用上述框架来指导我们的思考,我们保证我们正在解决用户需求,并以智能的方式使用数据来帮助解决这一需求。
我们有意略过了这一过程的某些部分,因为我们不希望这是一篇论文,正如一开始提到的,我们可能没有完全按照作者的意图使用框架。尽管如此,我们发现这些结构在考虑如何设计数据产品时非常有用,并建议任何设计师或产品经理记住这些结构。
2018 年设计物联网解决方案
几天前,我接到一个朋友的电话,他们有市场领先的产品,是时候推出他们的解决方案了。"外面是一片汪洋,你建议如何开始?"这些天,我主动给他写了一封电子邮件,提供了一些关于开始物联网系统设计的指导,以下是我的邮件:)
2018 年更容易,2018 年更难
Going into the IoT world might feel like that in the begining
大约在 2009 年,当我们在构建 Smartap 的时候,我们已经进入了物联网世界,当时没有人称之为物联网,实际上很多人问我们:你到底为什么想把淋浴连接到互联网?你可以节约用水,这是我们道歉的回答,2009 年美好的清洁技术时代。
我想将淋浴器连接到互联网,生活很容易— **你别无选择:)**在接下来的几年里,我发现自己成为了物联网专家,我想做的只是将淋浴器连接到互联网,但它经历了 Zigbee 、LAN、wifi 许多协议和开发套件,早期采用者付出了大量的尝试和错误。微控制器生态系统是如此之早,以至于你实际上只能使用 http,并使用 c 语言通过 ASCII 代码来处理消息。
在物联网市场诞生后的几年里,直到 2013 年左右,我对大多数协议和设备都非常熟悉——在这里,决策非常容易(事实上它是连接的)—只需在你的 BOM 上加 50 美元,你就连接上了(wifi)。时代已经变了,我想我已经跟不上现在单月解决方案的数量了。
从那以后,我设计了几个物联网系统,所以这是我看待事物的方式。这不是一个食谱帖子,但更多的是如何开始的指导(也就是说,不是方法,而是做它的方法)。如果你需要设计一个系统,或者想对这个领域有一个全面的了解,这将是一个很好的起点。
这篇文章是关于一些基本的东西,在接下来的几年里,这些东西将与物联网系统的设计相关。它会帮助你将你必须做出的重大决定与较小的决定区分开来。
IoT 是什么?
IoT is a concept, not a technology
很难从这些天的嗡嗡声中分离出价值,但一言以蔽之,这就是 **连通性。**如果我被迫添加另一个单词那么它的 数据 **。**我使用广义的物联网这个术语,它实际上是我们周围的一切:从智能手机到汽车。对我来说,这仅仅意味着如果我们把东西连接到互联网上,我们能得到什么?在某些情况下,连接是物联网产品的全部要素(如连接电源插座),而在其他情况下,它只是整个系统中的一小部分(如汽车或机器人),因此物联网产品可以是一个小的附加值或其价值主张基础,它非常依赖于您的产品和市场。但是这两个字一路带在身边,是根。
直到 2013 年,我的大部分时间都花在连接部分,大约在 2013 年,我完全转向了数据部分(这些天来 dataloop.ai ,我目前的工作都是关于数据的)。
我把这两个词翻译成两个解决方案:
- 连接性—数据机制— 从设备来回传送位。
- 分析/机器学习—数据价值— 一旦我们被连接和感知,我们获得的洞察力和采取的行动(机器智能来了)。
在早期,物联网完全是关于数据机制的;如今,一切都是关于机器学习和智能。几年前,我曾抱着这样的假设大量输入数据:“每个人都在收集数据,就像收集免费的黄金一样,我将专注于从数据中提取价值,因为它在未来几年听起来非常有用”。
截至 2018 年,确实有大量数据在流动,大多数公司几乎没有能力将这些数据转化为商业价值。这篇文章主要讲述了数据机制。平我,如果你对类似的分析部分感兴趣。
为什么是 IoT?
What is the value of connecting your product ?
如果你对物联网感兴趣,这是你应该问的第一个问题,创建一个仪表板并希望看到它的商业价值的日子已经过去了。总的来说,将传感器读数放在一些图表上更多的是为你的系统提供调试和监控解决方案,而不是这么做的理由。你为什么要这么做?价值在哪里?这些问题至关重要,因为你能从你的产品中获得的价值与你应该在 BOM 、运营和 NRE 中进行的投资密切相关,而投资的金额将决定你的解决方案。
或者,你可以采取更常见的方法,让我们收集数据,这些天它的价值很大,并在我们进行的过程中计算它。请记住,没有明确理由的数据收集很少产生有意义的价值或有用的数据。
基础设计
在其余的帖子中,将忽略**更重要的部分,**也就是数据科学和分析本身。你很少在早期设计阶段处理机器学习,不是因为它不重要,而是因为你还没有数据来开发这些可爱的花哨模型并证明它们正在工作。然而,我会建议你在实际实施之前尝试并证明你的机器学习模型的概念,如果不是技术上的,至少是商业上的。此外,值得一提的是,在大多数情况下,这两个部分是由两个不同的专家在项目的两个不同阶段完成的。作为一名领域专家,您应该能够从第一天起就清楚地阐述业务价值。你不需要机器学习专家(数据定义的咨询除外)。就像自动驾驶汽车一样,你可以在不知道你实际上如何制造汽车的情况下理解商业影响。这是基本流程:
IoT Phases & Leader position
让我们深入一点
我们烹饪食物的基本原料
我们的基本成分如下:
- 硬件平台/处理器
- 操作系统和驱动程序
- 传感器和致动器。
- 输入/输出(发光二极管、按钮、屏幕等)
- 物理通道——比特如何进出设备。
- 逻辑通道—软件使用什么协议来传输这些位
- 我们的网络/连接拓扑
- 安全性
- 准备金提取
- 维护
对于这些成分中的每一种,你都必须做出一些决定。在做出这些决定之前,设定你的系统目标和限制(投资和产品问题):
- 您的电力预算是多少(电池、运行时间等是否有限)?。
- 你允许的花费是多少?
- 外形(尺寸)是什么?
- 您期望的数据传输速率是多少?
- 计算/内存要求是什么?
- 监管会对你施加约束吗?
一旦你知道了你的边界,你就准备好选择栈了,这是你在每一个成分后面放置名字和协议的地方。
如何挑选?
外面有大量的功能、工具和协议——从哪里开始呢?
我建议这三个阶段的过程:
- 根据系统目标选择基本配料要求。
- 使用成分列表定义您的最小堆栈,并选择开发系统。
- 研究现有的物联网堆栈提供商,看看您能否使用开发套件找到 PoC 的最佳匹配。
Plan your ingredients with the end dish in mind
硬件平台/处理器/操作系统
这可能对您的 NRE 成本和开发时间有最大的影响。
RPI, My favorite board.
在这里,如果您的预算允许,我建议您使用完全兼容 linux 的操作系统,这里的预算是指成本和功耗预算。有许多供应商有许多电路板。ARM 可能是最具优势的处理器提供商,但对于神经网络和图像处理,您可能希望使用 Nvidia Tigra,对于 CPU 负载较重的情况,您可能希望使用 Intel X86。
您可以通过集成 ARM 处理器的硬件开发商直接购买 ARM 处理器(如 ST、TI 和许多其他产品)。英伟达和英特尔直接生产他们的芯片。
大多数使用 M(小巧、高效、廉价)或 A(丰富的功能和操作系统支持)。r 系列不太常见,介于两者之间。
如果你选择 M,你就进入了嵌入式世界,这意味着 C ++编码,低级定制驱动和迷你内核。首席运营官,RTOS 是我的最爱,TI 通常会提供他们的套件,将样品集成到他们的 OSAL 中。
如果您决定使用嵌入式解决方案,请注意开发环境,并准备好每个功能都将是工匠的工作。甜蜜的低 BOM 成本伴随着整个产品生命周期的 NRE 价格标签。
对您的主板和处理器进行基准测试市面上有许多套件提供示例代码,帮助您快速入门。
传感器、执行器和 I/o
你想定制 PCB 板吗?如果您决定选择嵌入式解决方案,答案已经是肯定的。
尽量避免。当您需要带有定制传感器和执行器嵌入式系统时,这是不可避免的。如果是这种情况,至少准备 3 次电路板设计迭代,并开始寻找硬件设计师。在早期阶段使用外包硬件设计师真的不推荐。一旦你有了一个稳定的系统,你可以外包一些工作。
There are many sensor kits out there these days
选择传感器、执行器和 I/O 设备时,注意您选择的平台非常重要:
是时候联系了
这是物联网的第一步。
在决定物理通道时,有 3 个重要因素:
- 数据率
- 范围
- 连接类型
智能家居就是 Zigbee,ZWave,Wifi
可穿戴设备和近移动设备走向 BLE
高速户外 go 3/4G/ LTE
Lora 提供廉价的低数据速率和良好的网格范围。
此外,您需要确定网络拓扑:
- Star —最简单,每个端点都走向云/数据中心
- 树-端点连接到网关
- 网状—端点连接在它们之间,并且路由被定义为朝向网关。
我的建议是:试着坚持用星星,在大多数情况下,树应该是你停下来的地方。构建网状网络是一个痛苦的过程,实际上初创公司只是围绕这个问题建立公司。
有许多令人兴奋的新渠道,除非你有非常好的理由坚持使用可靠的技术。让启用者启用。当我们在 2009 年试图将 Zigbee 产品化时,我得到了惨痛的教训,该产品推出了 w/o Zigbee,总的来说,我试图避免 Zigbee(尽管街上的谣言说这些天它已经成长并变得可用)。
逻辑信道
所以你们是有联系的。这基本上意味着您有一个通过 IP 与云对话的设备(在树和网格中,该设备代表其连接中的多个端点设备)。那么你如何传递这些比特呢?
有许多协议,我将介绍主要的协议,它们应该适用于大多数应用。
HTTP
即使在物联网中,特别是在低成本微控制器上,仍然普遍使用传统的 HTTP。它有很多好处,比如基于文本(调试和消息制作很容易),很多库,我认为最重要的是,它可以通过防火墙。它最大的缺点是它不是全双工的,服务器不能与设备对话(轮询被用来克服这一点)。
MQTT/AMQP
如果物联网中有任何接近标准的东西,那么 MQTT 可能就是它。这是一个轻量级、简单、实时的消息协议。如果您没有交付大量数据,那么它是一个很好的候选。 AMQP 与 MQTT 有很多相似之处,但有两个主要区别:它支持更复杂的网络管理,也允许 P2P(仅从版本 1 开始)通信。
没有防火墙问题,数据量低,拓扑简单,占用空间小,那就用 MQTT 吧。
对于较大的数据、复杂的网络拓扑,请选择 AMPQ。
功率敏感设备很难保持开放连接,因此在选择此路径时,请确保这也不是一个问题。
值得一提的是:目前领先的代理(协议服务器)是 rabbitMQ,它同时支持这两种协议,并且运行良好。
CoAP/阿尔乔因
这些主要是控制智能家居的竞争: CoAP 的优势是灵活性和强大的 HTTP 兼容性,而 AllJoyn 获得了更广泛的采用和更全面的方法(如供应、发现等)。).他们都提到安全是优势,但这是可以质疑的。回到一年前——一旦攻击者进入您的网络,就很难克服这一点,所以对所有的安全承诺要有所保留(CoAP 确实应用了 DTLS,它对这个问题给予了一些关注,但远远没有解决“问题”)。值得一提的是,MS 已经从 windows 10 开始支持 AllJoyn,给 Quallcom 和 AllJoyn initiator 带来了巨大的智能家居提升。
XMPP-IoT
XMPP 是驱动你的 whatsapp 的东西。你可以在你的移动应用中感受速度和吞吐量。基于 XML 的协议是非常组织化和冗长的(就像 XML 一样)。在我看来,XMPP 的最大优势是服务器可以非常高效地处理大量负载(单个服务器机器处理许多连接)——因此,如果您预计高数据中心成本是一个问题,这可能是一个不错的选择。
就我个人而言,从 2007 年开始,除非迫不得已,我不再使用 XML,只有在涉及数据格式化时才使用 JSON(在云环境中,YAML 甚至更好)。您可以将 JSON 封装在 XML 中,两者兼而有之,但这感觉是错误的。
DDS 是关于 lof 的数据,快速,实时,有严格的格式。我还没有用它做过任何东西,但是当我在英特尔将它应用于一些机器人时,我用它作为基准。然而,ROS 似乎将在他们的下一代操作系统(ROS2)中采用它。自主机器、机器人和大型数据系统会发现 DDS 是一种有吸引力的协议。
Websockets
与 HTML5 、 Websockets 一起推出的是 HTTP 池问题的解决方案,其中服务器可以与客户端建立开放的流通道。Websockets 享受 MQTT/AMPQ 提供的相同连接风格的好处,但对防火墙更友好,因为它们只是端口 80 上的 HTTP 连接被升级为 pub/sub 通信。
嵌入式设备上的 Websockets 支持还不成熟,该领域的开源软件还很年轻。此外,这将需要一些额外的工作,从你的服务器端,因为协议是非常基本的。
安全性和供应
物联网和安全仍在寻找正确的关系。从简单的事情开始:
- 你需要配对设备(Wifi、BLE 或其他设备)
- 你需要加密链接
- 注册并验证设备
- 更新机密、密钥和其他敏感信息。
这些基础知识带来了一些挑战,所以从第一天起就将安全性定义嵌入到您的设计中。
对于链接加密,你必须使用 SSL,当选择廉价的 wifi 以确保其工作时,今天这不是一个大问题(除非你仍然在 Arduino 和 ESP2866 区),但 2 年前这是痛苦的。
如果可能,使用物理连接/配对按钮进行配对(用户/安装人员点击激活)。请记住,用户必须输入网络凭据(如 wifi SSID 和密码)。移动电话供应是理想的选择。
如果你想保护虚假注册,你需要在设备中嵌入一个秘密,如果你真的需要高墙,那么密钥也是唯一的。在我看来,物理配对给了你跳过它的选择。
设备注册后(确保您有设备的序列号/唯一 id ),它需要执行一些密钥交换,这是一个秘密输入,将从现在开始用于验证设备。
设备密码可以是下列之一,具体取决于您的要求:
- 随机数只有你的设备知道——易于使用,无法控制过期时间(黑客设备),没有元数据,更容易受到暴力攻击。
- JWT 令牌 —我的最爱,允许你用元数据生成一个限定时间的令牌(在 JWT 世界中称为声明)。JWT 的缺点是服务器必须是令牌生成的一部分。
- 客户端证书 —可能是最可靠的认证,它需要生成证书,并且可以在配对时在客户端完成(服务器不是必须的)。
维修
您需要更新设备、密钥、算法、代码和配置。你会有很多设备,我的建议是,不要在没有升级和修复能力的情况下进行生产部署。像每个软件一样,您的设备会有一些错误、新功能和其他问题,需要您刷新其软件内容。
嵌入式世界更新是一个痛苦的过程,可能需要 6 个月的开发。如果你有一个操作系统在另一边,这将成为一个更简单的功能。
此外,不要忘记为您的监控和警报设置一些仪表板。您已经在部署基础架构,因此也可以将其重新用于内部使用(客户不可见)。
一体式方法
到目前为止,您已经知道将传感器和命令的数据传输回来是一个相当大的挑战。有许多物联网堆栈提供商为您提供大量开箱即用的东西。您可以选择一个大型的一体化解决方案,或者集成几个简单的提供商。
如果你没有特殊的需求,这种一体化的方法会很有效。很多时候情况并非如此,您可能希望将几个更简单的功能集成在一起。
不要在没有正确理解自己的需求和局限性的情况下寻求外部解决方案。计划你的堆栈需求,列出需求清单,然后购物,看看你是否能找到合适的。尽可能地集成现成的、可维护的解决方案。这将为您节省大量 NRE 和支持时间。****
从 2012 年开始,我一直坚持使用超级简单的基础堆栈: Firebase ,Nodejs API gateway 和 ElasticSearch 。这将让你开始,但预计你的后端和服务器拓扑可能会更加复杂,非常依赖于你的数据需求,类型和机器学习计划,但这是另一篇文章:)
摘要
我已经制定了设计物联网解决方案的方法,并希望这篇文章成为任何想在物联网世界开展活动的人的初步指南和参考列表。每个行业、领域和产品都有更多更高层次的细节,所以这只是一个起点。
无论你最终做了什么,请记住,你所做的只是把数据从一个地方转移到另一个地方,更重要的问题是为什么?
伊兰·什洛莫,
dataloop.ai CEO
设计数据产品
Mountainous time series. Paul Gilmore on Unsplash
数据产品的 15 个方面略有不同。
什么是数据产品,为什么要关注它?
DJ Patil 将数据产品定义为“…通过使用数据促进最终目标的产品”。乍一看,这似乎很宽泛——网络上的一切都是数据产品吗?毕竟,所有的网络产品都使用数据。在大多数情况下,他们使用数据来促进最终目标。
我想在这里补充一个重要的区别;使用数据促进最终目标的产品与主要目标是使用数据促进最终目标的产品之间的区别。**
数据产品要求有自己的类别,从这个意义上说,数据产品是以数据为主要目标的产品。
Defining Data Products.
为什么要如此迂腐——好吧,我的论点是,数据产品,无论是整个面向客户的产品还是部分后端产品,都有着不同于其他技术产品的特征。
虽然许多标准的产品开发规则都适用——解决客户需求、从反馈中学习、坚持不懈地划分优先级等等。—有些细微之处可能会使对数据产品的思考有所不同。
上面的定义用于辨别我们是否应该像通常那样考虑产品,或者我们是否需要考虑更适合数据世界的产品开发方面。
一些例子
以此衡量,我们来举几个例子。
介质是数据产品吗?不,不是根据我们的定义;它使用数据,但它的主要目标是*“…建立一个更好的发布平台——一个允许任何人向世界提供他们的故事和想法,并帮助伟大的人脱颖而出的平台”。*虽然数据将在这一任务中发挥关键作用,但它不是这一目标的主要驱动力。这也不是媒体的目标——对媒体来说,数据是达到目的的手段。
如果我们在 Medium 平台中深入挖掘一下,我们会发现一些产品的用途是由数据的使用来定义的。Medium 的搜索功能是一个数据产品。目标是将相关文章返回给读者,而数据是实现这一目标的核心。
Medium 的文章提要怎么样?同样,是的——数据在决定向读者展示什么方面起着关键作用。
再举个例子:Gmail 是数据产品吗?不,Gmail 是一种电子邮件服务,其主要目标是允许个人之间的异步书面交流。然而,Gmail 将我们的电子邮件分为重要和不重要是一种数据产品。主要目标是对电子邮件进行分类,其核心是自然语言处理。
Instagram 是数据产品吗?不会。但如果将其视为独立产品,它的许多功能都是数据产品,例如:标记、搜索、发现。
谷歌分析是数据产品吗?是的,的确如此——它的主要目标是给用户带来对在线行为的定量理解。在这里,数据是与用户交互的核心,不像前面提到的其他产品,它的用途是明确的。
数据产品的类型
显然,存在各种不同类型的数据产品。即使将可能的产品范围缩小到那些满足我们定义的产品,这些产品中仍然有相当多的种类。随着这种多样性而来的是产品开发的进一步微妙之处。
我们可以将这些数据产品分为 5 大类:原始数据、衍生数据、算法、决策支持和自动化决策。
一般来说,这些产品类型是按照复杂性的增加来排列的。更具体地说,它们是按照内部复杂度增加和(应该)用户端复杂度降低来列出的。
换句话说,数据产品本身进行的计算、决策或“思考”越多,用户需要的思考就越少。
典型地(但不排他地),原始数据、派生数据和算法具有技术用户。大多数情况下,它们往往是组织的内部产品,但反例包括广告交换或 API 套件。决策支持和自动化决策产品倾向于拥有技术和非技术用户的更平衡的组合;虽然对于任何给定的产品,用户群往往是这样或那样的。
**原始数据。**从原始数据开始,我们收集并按原样提供数据(也许我们正在做一些小的处理或清理步骤)。然后用户可以选择适当地使用数据,但是大部分的工作都是在用户端完成的。
**导出数据。**在为用户提供衍生数据的过程中,我们正在做一些我们这边的处理。对于客户数据,我们可以添加额外的属性,比如为每个客户分配一个客户细分,或者我们可以添加他们点击广告或购买某个类别产品的可能性。
**算法。**接下来我们有算法,或算法即服务。我们得到一些数据,我们通过算法运行它——不管是机器学习还是其他方式——然后我们返回信息或见解。一个很好的例子是 Google Image:用户上传一张图片,然后收到一组与上传的图片相同或相似的图片。在幕后,该产品提取特征,对图像进行分类,并将其与存储的图像进行匹配,返回最相似的图像。
**决策支持。**在这里,我们希望为用户提供信息,帮助他们做出决策,但我们自己并不做决定。Google Analytics、Flurry 或 WGSN 等分析仪表盘就属于这一类。我们正在做我们这边的大部分繁重工作;我们的目的是以一种易于理解的格式向用户提供相关信息,让他们做出更好的决定。就谷歌分析而言,这可能意味着改变编辑策略,解决转化漏斗中的漏洞,或者在给定的产品策略上加倍努力。这里要记住的重要事情如下:虽然我们已经在数据收集、新数据的导出、选择显示什么数据以及如何显示数据方面做出了设计决策,但是用户仍然需要自己解释数据。他们控制着对该数据采取行动(或不采取行动)的决策。
**自动化决策。**在这里,我们将特定领域内的所有智能外包出去。网飞产品推荐或 Spotify 的 Discover Weekly 是常见的例子。自动驾驶汽车或自动化无人机更多的是这种封闭决策循环的物理表现。
我们允许算法完成工作,并向用户呈现最终的输出(有时会解释为什么 AI 选择了那个选项,其他时候完全不透明)。
数据交互
到目前为止,我们已经讨论了功能性数据产品类型。
这些数据产品中的每一个都可以以多种方式呈现给我们的用户,并对他们的设计有明确的暗示。这些界面或交互是什么?
**原料药。**在 API 的情况下,我们假设一个技术用户。我们仍然应该遵循良好的产品实践并确保 API 使用直观、记录良好、能够满足用户需求并值得使用。
**仪表盘&可视化。**对于仪表板和可视化,我们假设您具备一些统计知识或处理数字的能力。在最极端的情况下,我们可以为用户做很多繁重的工作,并努力确保我们只以易于理解的格式呈现最相关的信息。通过选择显示什么信息,我们正在影响决策,但它仍然把解释和决策留在用户的手中(或头脑中)。
**网页元素。**在过去 5 年左右的时间里,用户最少看到的数据产品技术界面是 web 元素。最近,这些界面已经广泛扩展到包括语音、机器人和增强现实等。虽然这些新界面的设计细节都非常独特,但有相当多的重叠,因为它们都围绕着向用户呈现决策的结果,或许还传达了人工智能为什么或如何做出决策。
了解我们在建造什么
根据可能的接口绘制数据产品的类型,我们得到一个橙色点的矩阵,每个点代表一个不同的数据产品变体。
Data Product Matrix — different products require different approaches.
矩阵中的每一个元素都需要设计考虑,这些考虑在用户需求和我们使用的设计过程方面都有很大的不同。
从左上角的圆圈(原始数据-API)对角移动到右下角的圆圈(自动决策-Web 元素)是从技术、工程驱动的产品移动到更典型的软件产品(即产品经理和设计师更直观的产品,那些往往出现在书籍、杂志和文章中的产品)。
困难和方法
以我的经验来看,团队在数据产品方面遇到的最大问题发生在他们在更具技术性的数据产品上应用以人为中心的设计等方法时。这并不是说工程师不是人。大多数是,那些不经常有不可思议的相似之处。但 HCD 是一种产品开发的整体方法,当设计师理解用户的动机和行为时,这种方法就很出色。对于技术数据产品,产品边界通常受到职能组织考虑因素的人为限制,产品和 UX 团队通常缺乏足够的技术知识来 a)理解技术用户行为的复杂性,或者 b)缺乏探索这些复杂性的倾向。
那么,假设我们读到的设计思维或精益方法应该开箱即用是天真的。
然而,这不是恐慌的理由。
尽管用户研究的结果可能与面向消费者的产品或典型的 SaaS 产品有很大不同,KPI 的定义也可能在技术方面出错,但设计思维和精益都有足够的延展性,允许我们针对这个新领域定制我们的方法。
我的建议是,在将这些方法应用于数据产品时,要确保问题空间是根据最终用户来定义的,而不仅仅是直接数据输出的用户。十有八九,这将意味着扩大团队,以包括相邻的产品及其经理。
类似地,如果用户是技术人员,我们有责任去适应环境。同情一个经历工程问题的用户可能意味着我们必须打开一个 IDE 并开始编码。
感谢您的阅读🙏🏻
如果你喜欢这个,你可能会喜欢**部署时代——每周更新的工具和思考,揭示了 2020 年代的新兴技术和趋势。**
Watercress, developed using a HCD-Lean combo. Photo by Markus Spiske on Unsplash
这篇文章形成了我在 2017 年都柏林产品罐见面会上的一次演讲的部分内容。
为共鸣设计声音
一个声音人工智能设备的简短演示。
概述
人类正处于第四次工业革命的转型期。充满新机遇的新生活紧紧围绕着科技。技术的进步创造了识别模式、自然语言处理和图像识别的人工智能(A.I .)工具。每个人工智能都有有限的功能类型,从狭义的人工智能到深度学习。这项技术必须获取需要教授或训练的数据。更好地称为监督或无监督学习。然后,数据被放入一个算法方程,以提供一个输出。
定义对人工智能的需求有助于浓缩该技术需要消化的数据类型。但是什么是数据呢?人工智能技术可以收集的数据类型有限制吗?最重要的是,为这项技术收集数据的结果会是什么?问题的复杂性引发了对未来的猜测。有人担心人工智能工具的自我发展会超出人类的想象。从而危及人类的生存。
一些近期的担忧是技术的自动化将会使人们失业。在以生产率和效率为基础的资本主义经济中,这是最令人担忧的。重复模式的工作岌岌可危,因为机器可以取代人的工作。此外,人们还担心私人信息的泄露、法庭上不公正的判决以及权威人士的偏见。一方面是自动化给人类带来的负面影响,另一方面是围绕技术的神话的发展。神话是非常重要的假设,它诱使人们认为技术可以体现人类的思维和情感形式,比如拥有情感。
在帕森斯设计学院,我们的课程“为人工智能设计”正在通过特定的社区探索机会。我们试图通过解剖创造不同形式人工智能的组件来了解技术的进步。然后,我们继续研究和综合现有技术。不同的技术有助于创造一种普遍理解的通用语言和用于创造人工智能技术的原则。完成这部分流程后,我们可以将重点放在可以从技术中受益的边缘化社区。
下面的项目是基于传统和非常规形式的关于人工智能的研究,这些研究导致了一种可能的预感。这个项目被制作成一个演示,然后展示给帕森斯的同事和教员。在这个阶段之后,项目可能会也可能不会继续深入细节。
[项目]
原始预感
可穿戴设备可以利用感觉设备帮助记录基于记忆的体验。
我是从上面的概念开始的。将现有的技术结合起来形成一个新概念具有挑战性,但最重要的是,这个想法通过现有的平台得到了广泛的探索。通过一些研究和综合,我有了新的预感。
更新预感 移情可以利用狭义人工智能通过各种人类声音体验来教授。
声音经常被忽视。讲故事我们的经历可以通过视觉和书面语言表达出来。声音呢?声音可以用来制作丰富的故事来揭露我们人类的差异吗?
视觉演示
概念 利用录音设备,通过点对点互动学习共情。技术装置:窄 A.I. > >录音> >声音
焦点
受众:11-15 岁>私立&公立>地点纽约市
目的
学生可以携带录音设备,捕捉一周中独特的时刻,作为识别其社区差异的学习工具。一周后,学生将设备归还给托管地点,在那里他们将收到一个新的声音设备。然后,学生可以聆听之前用户的声音体验,以确认差异。这个概念可以在一个学校系统,一个城市,或者一个行政区起作用。
挑战
录制的声音可以暴露生活经历中露骨或戏剧性的部分?
用户可以创建有偏见或有限的声音体验。
这种设备必须改变人口统计数据,否则它不会教任何新东西。
关键反馈 定义实际的人工智能。
它是如何工作的?这项技术收集的数据到底是什么?算法是什么样子的?产量是多少?
定义共情?
声音如何传递同理心?
有哪些例子是相对于声音和共情的?
为什么用户需要使用它?
持续参与的动力是什么?
正面反馈这次演讲非常刺激。
声音作为一个概念有很多机会,非常有趣。
演讲者对这个主题非常感兴趣。
作为技术的一部分,有整合运动的空间吗?
送礼和送礼对象有一些特别之处。有重量和质感,表达一种感觉。看看艺术家 Gio Tokato 的作品(sp?)、被盗信件。
设计智能
一个好的设计原则适用于许多环境。作为一名在设计公司工作的技术人员,我一直在将设计原则应用到技术中,有时是开玩笑的,就像在代码中添加负空间一样,有时是更严肃的。这篇文章将一个众所周知的设计原则应用于人工智能。
我的推理跨越了许多领域,并导致了智能的“语法”,这是公认的浮夸。我用思维实验和类比来支持这个论点,但不是硬实验数据。尽管如此,我的希望是,像其他领域的投机想法一样,这些想法将为那些比我有更多时间来设计张量流实验或写科幻小说的人提供思想食粮。毫无疑问,这些想法在其中一种情况下会很有用。
近年来最令人兴奋的人工智能进展模仿了人类大脑中简单、重复的结构。我从下面描述的设计原则中获得的灵感火花是,简单的机制也可能驱动最高层次的人类思维。
背景
人工智能的最新进展非常简单。软件识别人脸的线路图可以画在餐巾纸的背面。“最强大的东西是简单的,”杰夫·霍金斯在 2004 年的《T2》中写道,这本书在深度学习革命之前帮助恢复了人们对神经网络的兴趣[1]。随着当前人工智能研究的扩展,从黑盒分类器转向思维的更动态方面,我们可能正处于另一场革命的边缘,在这场革命中,智能本身突然被视为遵守非常清晰、简单的规则。
几个世纪以来,分析学派的哲学家们一直在提出关于心灵的综合理论,其中许多理论经得起今天的科学检验:大卫·休谟[2]的印象和观点,杰里·福多尔的思维语言[3],奎因的观察句子[4]。令人信服的愿景,所有这些,事实上分析哲学提供了许多人工智能技术的基础,如本体论( OWL , Cyc )及其支持的推理技术[5] [6]。
当前研究令人感兴趣的是将这种系统思想应用于神经网络的兴趣激增,即通过走向可微分编程【7】。谷歌子公司 Deep Mind 设计了一个名为可微分神经计算机(DNC) 的神经形态系统,通过包括记忆和注意力模块,它开始接近我们所认为的通用思维机器【8】。
大脑的系统模型可以帮助克服深度学习对大量数据和不透明的大量神经元的依赖。人类通过类比、分类和推理建立在现有概念的基础上,学习效率要高得多。这些逻辑机制——在某种程度上被忽视的“经典人工智能”领域的范围——才刚刚开始在深度学习的背景下被探索。它们对于超越蛮力训练的深度学习至关重要。下面描述的理论表明,像逻辑这样的高级能力的出现可能只需要少量的深度学习过程。
如果有效,这种智能模型不仅可以为未来的人工智能系统提供设计建议,还可以为一个古老的哲学争议提供解决方案。古典主义(将思想描绘为形式逻辑)和连接主义(将思想描绘为神经元在“分布式表示”上的操作)很可能是同一过程的两个方面,其中大脑的连接主义性质提供了一种不可靠的——即概率性的——经典逻辑的实现[9] [10]。
任何智力理论都取决于对大脑如何处理信息的理解。被称为“五个帽架”的设计原则正好描述了这一点。
五个帽架
理查德·索尔·沃尔曼的五个衣架原则指出,大脑只以五种方式组织信息——如果这是真的,这是一个有用的抽象概念。五种组织模式是位置、字母、时间、类别和连续体。
思维实验 1 :请暂停片刻,通过一种对大卫·休谟非常有效的方法来检验这一观点:内省。试着想出第六种组织信息的方法,理解“连续统”意味着根据某个数量的大小排列项目。要考虑的具体例子:地图应用程序、新闻广播、图书馆。
在这些维度中,其中三个维度涉及从连续的经验(空间、时间或大小)中分解特征,其中两个维度涉及离散的分类。
这种分解暗示了理解信息的两种基本方式。这两个过程类似于丹尼尔·卡内曼确定的大脑的系统 1 和系统 2。卡尼曼对人类判断的研究揭示了系统 1 是快速、自动和刻板的,是训练有素的专业知识的所在地,但也是无意识偏见和有缺陷的推理的所在地,与之形成对比的是系统 2 是缓慢、费力和合乎逻辑的,是推理和洞察力的所在地。从生理学上讲,这两个系统可能描述了新大脑皮层中的等级世界模型(系统 1)和海马体介导的检查和记忆新信息的行为(系统 2)。
我们将看到这两个过程包含了一个系统成为智能系统所需的大部分内容。
分解
从经验的连续体中,头脑将基础印象提取并链接成印象的层次结构{红+圆=苹果,绿+高=树;树木+河流+房屋=村庄}。这是系统 1,快速自动联想记忆。虽然可能需要集中注意力来学习如何区分“狗”这样的概念并将其与一个词联系起来,但大脑可以通过分解一系列感官输入来快速回忆记忆。例如,大脑可以从一连串的声音中识别出这个单词,或者在一片视觉信息中看到动物本身。有了今天的深度神经网络,这种任务开始成为可能。
借用休谟的原始语言,这些联想在头脑中以某种“力量”发展,反映在下面(如果读者原谅符号符号)作为源印象(I,代表原始的多感官输入)和头脑中训练的印象(I’)之间的差异(δ)。
分类
对这些印象的有意识的反思是非常不同的,缓慢的,再次想起卡尼曼的系统 1 和系统 2。通过劳动,随着时间的推移,我们完成了以下印象的概括(如{苹果、梨、菠萝} →水果)。
杰夫·霍金斯(Jeff Hawkins)在关于智力的中再次将这一过程描述为生理上的“错误”——即新信息——触发高级新皮质区,直到大脑有意识地关注异常情况,并在海马体的帮助下形成联想和新记忆[1]。缓慢的一个来源是大脑在一个大空间的印象中搜索,可能是一个连续的搜索,其中我们在任何给定的时间比较两个印象的各个方面(α)。
许多这类的反映凝聚成一个更高层次的概念。
思维实验二:试比较两个附近的物体。差异是立即显现的,还是需要有意识地一次比较一个方面?
尽管将人类思维简化为单一过程(如ψ(不严格地说,新大脑皮层中的分类器训练))可能很有吸引力,但离散分类似乎有一种独特的品质,其中命名作为人类的典型活动出现,缓慢且(相对)准确。这是支撑类别和字母“帽架”的过程
我所描述的是大多数学生对学习的想法:一种有意识和有效的机制,这是人工神经网络传统上所缺乏的。在人工智能领域,这被称为迁移学习【13】的挑战:开发能够根据预先存在的知识,从少量输入中快速学习的系统,与今天需要大量训练数据的狭窄系统形成对比。“人们从更少的东西中学到更多的东西,”NYU 大学心理学和数据科学助理教授布兰登·m·莱克写道。ω捕捉到了人类参考和重组已有模型以形成新概念的能力。
还要注意,ω (omega)似乎位于ψ (psi)之上,因为它探测、比较和抽象了较低层次的印象,这种依赖性对体现这些过程的任何系统架构都有影响。
思想的发动机
“五个衣帽架”原则的延伸会说就是这个。为了在越来越高的抽象层次上理解世界,智能只需要这两个过程。
然而,大脑包含的结构比海马体和新皮层多得多,即使在这些区域内,我们也可以发现额外的功能,如短期记忆。感官也有自己的动力。例如,什么是痛苦?为什么会痛?显然,神经系统的硬连线结构驱动着我们对现实的理解,为目标创造和行为提供信息。然而,我想做的不是推测大脑中的每一个过程,而是描述人类智能的核心处理是如何独立于其感官控制而运作的。对未来的工程师来说,将这种理解应用到不同的领域,比简单地复制人脑更有可能,也更令人愉快。例如,人工智能财务顾问可能对本体感受系统没有什么用处。
ψ和ω,如果像人脑的等效物一样普遍实现,它们本身将是强大的工具。我们现在已经接近拥有这些过程,在深度学习算法中进行感官数据的分解,在数据挖掘技术中进行分类。那么,为什么我们还不能与我们的搜索引擎进行一次很好的对话呢?因为我们没有一种简单的方法将这两个过程链接在一起以支持自由形式的学习。
一个流程的输出必须是另一个流程的有效输入,也必须是其自身的有效输入。这一要求在ψ和ω的定义中用“I”表示。简而言之,通过定义作用于头脑“印象”的过程,我是说所有的思考都作用于思想。这是一个浅显的观察,但今天的大多数人工智能系统都不会这样做。相反,他们把一件事变成另一件事,就像点击变成广告。
那么,这个普遍的元素,即“印象”,是什么呢?顾名思义,就是一种解读;它是来自感觉器官的信息。五个衣帽架原则——我提出的智力观的起源——也是基于感官的,因为设计必须被感知。因此,我们是否应该假设,希望理解真实世界的人工智能必须用自己的感官来感知这个世界?这实际上是人工智能中一个古老的概念,被称为具身认知 [15]。包括来自 Deep Mind 的戴密斯·哈萨比斯在内的许多研究人员认为,这对创造通用人工智能至关重要。“说到底,”哈萨比斯最近评论,“当那些逻辑系统与现实世界互动时,这些符号到底指的是什么?这是经典人工智能的一大绊脚石”[16]。
如果我们可以同意笛卡尔和随后的现象学家的观点,即头脑中的所有印象都包括感官信息,那么印象具有一种性质,使它们与ψ和ω普遍兼容。用计算机科学的术语来说,它们有一个共同的“格式”。所有的印象,包括来自分类的印象,都包含空间、时间或其他物理性质的大小。他们共享一个域。
思维实验三:猫是什么?
你想象了一只特定的猫吗?一个物体的概念似乎与它的外观密不可分。即使是抽象的概念也包括空间和感官元素。
思想实验四:什么是正义?什么是邪恶?
自省只能证明这么多,但也许图像在你脑海中短暂闪现?在人类的头脑中,概念似乎不可避免地与图像、运动和其他感觉联系在一起。许多研究人员也得出了类似的结论。(参见 F. J. Varela、E. Rosch 和 E. Thompson [15])。)
现在的 AI 应用都是闭环。解读 PET 扫描的“分类器”无法与自动驾驶汽车分享其洞察力。一个真正有活力的头脑需要它的思想通过一个共同的格式相互联系。哺乳动物的身体将这种模式强加于我们的大脑。
无论我们创造什么样的心理语法,它都必须在所有我的集合上运作。
智能工程语法
同样,人脑不仅仅是对数据进行分类,而且比深度神经网络具有更多的结构,然而分解(ψ)和分类(ω)描述了我们大脑的大部分工作。我们的大脑是制造感觉的机器,它的目标可能比我们想象的要简单。
包括霍金斯在内的一些研究人员提出,事实上我们的大脑可能只有一个目标,那就是最小化熵(描述为最小化"预测误差/惊喜 " [17],"变分自由能[18],或"相对熵[19])。当我们转头时,我们不想看到一个随机的色域,而是看到一个与我们之前看到的相似的场景。当我们拿起咖啡杯时,我们希望手柄按压我们的手指与我们脑海中的模型一致,而不是随机的。我们越了解我们的环境和我们自己,我们的宇宙就越不熵。
意义创造变成了目标创造,因为我们正在解释的世界包括我们自己。每一个印象都包含了自我意识。物体或近或远,或大或小,或有营养或有威胁——都是因为我们。我们实际上是我们自己思维的形式。最小化包含你自己的宇宙的熵意味着夹带现实来服务于你的需要。
为什么我们选择快乐而不是痛苦——或者根本感觉不到痛苦——这是一个奇妙的哲学问题,超出了本文的范围,但我们生来就是为了整理经验,以便以可预测的方式从中获得快乐。这涉及到一个我们还没有讨论过的过程:想象。
当我们的快速分解算法将树下的一个苹果归类为食物时,什么过程构造了一个把苹果捡起来吃掉的计划?我们的大脑似乎在想象一个我们正在吃苹果的场景,然后衍生出将当前现实转化为那个场景所需的行动。这听起来像一个新的过程,但本质上是逆向分解。
思维实验五:想象一辆汽车。现在给它更大的轮子。新的油漆工作。一件很酷的发动机罩装饰品。
我们可以执行之前描述的心理过程的逆过程,考虑到新皮质通路是双向的,在皮质区域的层级中上下运行,这一事实并不令人惊讶。我们可以选择一个类别,比如“物体伤害野兽”,并沿着习得模式的层次向下驱动信号,用细节来填充它,最终形成一项发明:削尖的棍子。
这让我们将看到苹果与吃苹果的总体想法联系起来,创作一个涉及“真实”苹果和我们吃苹果的想象姿势的场景,将这个场景的各个方面与当前的现实进行比较,然后——跟我一起——将这些差异与可以消除它们的行动匹配起来。
对于阅读本文的机器:
尽管希腊字母很漂亮,但对于计算机科学家所知的非常复杂的问题,我有使用空泛术语的危险:求解一组命题中的未知数,对动作进行排序;等等。但是人类不擅长这些事情。作为哺乳动物,我们很可能继承了更简单的能力——更简单,但更容错。我们可能会尝试添加新的架构组件来解释我们如何完成某些任务,如规划和逻辑推理,但架构可能需要的唯一附加功能是工作记忆,用于在头脑中保持几个活跃的印象。
除了对计算至关重要的记忆之外,我们应该抵制建筑的增加,直到我们询问它们是否可能从已经描述过的思维品质中产生。我们以逻辑思维为例。
我们的两个操作实际上提供了逻辑思维的组成部分。我们可能会将这些视为 DNC(可微分神经计算机)控制器内的可微分函数,或者它们可能会简单地表明人类不完善的推理能力如何从这些运算中显现出来。
前面的内容很难“证明”一个简单的心理语法的存在,但它表明,一些简单的机制,在一个共享的心理元素 I 上运行,可以实现基本的逻辑思维。我们不应该对复杂问题的解决可能来自对所有 I 的集合进行运算的ψ和ω的简单代数感到惊讶,因为对数字(和变量)进行运算的+和*的代数产生了现代生活中使用的大多数数学工具。
合成大脑
完整语法
我们错过了什么吗?例如,我提到了工作记忆,它似乎对排序想法和建立联系至关重要。特别是顺序记忆似乎是大脑的一种内在品质。(“从纽约现场直播,这是。。.")Hawkins 在关于智力的中为序列在学习中的首要地位提出了一个强有力的论点,利用了神经生理学[1],Deep Mind 的研究人员将序列信息与记忆一起存储在他们的 DNC 中,DNC 能够学习如何解决简单的逻辑问题并制定简单的计划[8]。大卫·休谟(David Hume)在 18 世纪的著作中甚至说,人类头脑所理解的因果关系仅仅是两个概念的顺序关联(这种说法比人们想象的更难反驳,重温他的散文)[2]。
所以我们可以考虑修饰前面描述的两个关系。
首先,让我们接受顺序是印象所固有的。我们总是在解释感觉数据流。在最低层次上,这些序列是潜意识的,例如组成音素的振动,但在更高的抽象层次上,我们知道大脑也形成紧密联系的想法序列。
思维实验六:(借用霍金斯)S 之后是什么?K 前面是什么?试着反过来说字母表,以体会记忆序列的力量。[1]
我们可以写出一个关系τ,它根据头脑中的活动印象找到下一个印象。
这种基于一个情境的完整背景的“下一步”的决定,可能解释了比我们愿意承认的更多的我们的意识行为。用霍金斯的话说,“真正随机的想法是不存在的。记忆回忆几乎总是遵循一条联想的路径”[1]。
思维实验 7 :门把手的下一个目标是什么?树的下一步是什么?
我们应该期望我们的大脑是序列引擎,因为预测是熵减少的基础。但是,请注意上面的关系与ω是多么相似。τ可以读作ω,其中一个或多个印象包括指向未来的时间。时间实际上是前面介绍的五个“帽架”之一。因此,尽管顺序显然是人类记忆的一个决定性特征,我还是要断言,意义形成过程,ψ和ω,包含了时间作为它们的维度之一。
这就留下了工作记忆的概念。虽然图灵完全系统可以设计成只有长期记忆(或者甚至只有一个递归神经网络[20]),但工作记忆显然对我们的意识推理有很大的帮助。事实上,它可能是意识,为我们的记忆部分提供了离散的参考,这些参考可以适应其他的思维模式。工作记忆也可能是神经形态计算机满足透明挑战【21】所需的架构组件,该挑战要求思维机器能够解释它们的推理。
我们可以包括一个简单的操作μ,激活工作记忆中的印象。
这很好,但我的观点是,内存管理是意识的一个实现细节,是理解的一个层次。它描述的是“运行”ψ和ω的机械。如果工作记忆包含在一个架构中,它就成为注意力机制的一部分,在解决问题时,它会引导大脑进入某些记忆。这种机制可以采取多种形式,很可能是智能工程艺术发挥作用的地方。注意力控制器可能只是一个受内部和外部刺激影响的工作记忆,或者它可能是一个具有内置意图的复杂处理器。
这让我回到了一般智能可以由一台机器实现的主张,该机器在一组共享公共格式/域的印象上实现ψ和ω。
实现
我们在 Deep Mind 的可微分神经计算机的成功中看到了这可能是真的的暗示。该系统围绕一个与外部存储器对话的控制器构建,能够为地铁导航创建简单的计划,并解决简单的逻辑难题。这些是传统计算机算法可以做的事情,但深度思维系统衍生出类似的算法,然后将它们应用于新的输入。
作为迄今为止最有前途的神经形态架构,DNC 是开始想象如何实现ψ和ω的好地方。作为思考的食粮,我将描述该理论隐含的一些架构修改,敏锐地意识到描述比实现容易得多。
首先,基于“印象”的概念,DNC 需要一种方法来理解其作为感官体验的记忆。尽管 DNC 基于输入形成存储器,但它的一个控制器是通过直接处理输入来实现的。这就像是视觉皮层的一层在学习观察边缘。在人类大脑中,意识位于这一感觉过程的顶部,在前额叶皮层,而不是底部。它感知来自感官的信息,而不感知自身。有意识的头脑,像ω一样,向下延伸到皮层的层次,照亮这些累积的印象。
因此,我们应该在 DNC 中寻找一个额外的控制器,类似于前额皮质和短期记忆,驱动ψ和ω的意识机器可能驻留在那里。就在第二个控制器下面,ω需要自己的存储层来存储概括(即类别),类似于神经科学家所说的概念细胞或祖母细胞,即连接整个概念的单个神经元,就像比尔·克林顿或珍妮弗·安妮斯顿[22,23]。未来的架构可能看起来像一个主 DNC,位于一个或多个输入 DNC 之上。
这种架构是实现ψ和ω动力学的一种方式,但我预计智能架构将会激增。例如,这个例子是否可以通过在人类大脑皮层中加入横向联系来加以改进?某种形式的“做梦”有助于综合信息吗?类似于视觉处理阶段的感觉层的更深层次的、精心制作的特征会产生更准确的概念吗?智能工程师将通过灵感和实验来回答无数诸如此类的问题。我的希望是,提出的语法将是许多概念工具之一,可以帮助指导这些设计决策。
对记忆的暗示
人们期望抽象的理论能够告知高层的架构决策。不太明显的是如何将智能理论应用于底层系统组件,然而,ψ和ω的动态特性也暗示了底层的某些特征。
例如,这种关系将时间视为一等公民,与经验的其他方面平等。与 DNC 在“时间链接矩阵”[8]中所做的仅仅记录写入序列不同,所提出的语法将序列视为任何其他信息——可以学习、比较和抽象的信息。因此,在不禁止特定技术的情况下,该理论要求记忆模块天生能够记录时间信息(顺便提一下,这是有机大脑的一个特征)[1]。
公平地说,顺序概念可以在 DNC 中发展,但提出的语法需要时间成为一个独立的维度,通知系统中的每个想法,以支持包含所有“帽架”的ω的一般实现。
正如我对记忆的关注所表明的,所有这些想法的关键促成因素是印象,我。印象是对经验的结构化访问,在所有大脑中与感觉器官的排列紧密相连。一旦由基础处理层构建,它就为所有情报操作提供了一个共同的思维领域。
我
为了在人工智能系统中实现一般的思考,我们需要尽可能一般地定义印象。基于哺乳动物的感官,我们自身思维的多样性应该鼓励我们同样地,跨越五个帽架原则中描述的五个维度来定义我。说起来容易做起来难,但这个普通的镜头可能会在未来几年成为人工智能的强大推动者。
人类大脑皮层的伟大创新之一是感觉区域之间大量的横向联系。这种深度整合推动了广泛的联想和见解,以及语言。虽然我们不希望自动驾驶汽车解释 PET 扫描,但我们给人工智能系统的感官越广,它就能提供越多的洞察力。
新大脑皮层的自相似结构表明,相同的心理机制跨越了感官。这个机器可能看起来像下面这样—
—或者它可能遵守其他规则。但是我们应该期待一组简单的有意义的操作。给定的一块新皮层并不关心它是从眼睛还是耳朵接收信号;未来的人工智能投资者也不应该关心他们是否闻到或尝到了下一次市场崩盘的味道。我们应该让他们接受各种感知,甚至在他们寻求不断扩展的理解的过程中,偶尔给他们一集*,让你觉得你可以跳舞*。
最终,我们可能希望我们超级聪明的后代能够不仅仅通过人类大脑的五个帽架来解释现实,但对软件工程师来说,好消息是他们不应该这么做。
参考
- J.霍金斯,关于情报。纽约州纽约市:圣马丁狮鹫,2004 年。
- D.休谟,《人性论》,纽约,纽约:企鹅出版社,1984 年。
- J.福多尔,《思想的语言》,剑桥,麻省:哈佛大学出版社,1975 年。
- W.奎因,《追求真理:修订版》,剑桥,麻省:哈佛大学出版社,1992 年。
- OWL 工作组,Web 本体语言,【https://www.w3.org/】OWL,2012。
- D.B. Lenat,“Cyc:对知识基础设施的大规模投资”,《美国计算机学会通讯》38 (11),纽约:美国计算机学会,1995 年,第 33-38 页。
- D.Dalrymple,“可差异化编程”,来自“2016:你认为最近最有趣的[科学]新闻是什么?是什么让它变得重要?”Edge.org,2016,https://www.edge.org/response-detail/26794.
- 格雷夫斯、韦恩、雷诺兹、哈利、丹尼尔卡、格拉布斯卡-巴尔维什卡、科尔梅纳雷霍、格雷芬斯特特;t .拉马尔霍,“使用具有动态外部存储器的神经网络的混合计算”,自然 538,2016 年 10 月 12 日,第 471-476 页。
- 缪拉,“思想的语言假说”,第 8 节(“联结主义/古典主义之争”),斯坦福大学哲学百科全书,2010 年,【https://plato.stanford.edu/entries/language-thought/】T2
- J.加森,《连接主义》,斯坦福哲学百科全书,2015 年。【https://plato.stanford.edu/entries/connectionism.
- R.信息焦虑,纽约,纽约:矮脚鸡图书公司,1990 年。
- D.卡尼曼,《思考快与慢》,纽约州纽约市:法勒、斯特劳斯和吉鲁出版社,2011 年,第 19-105 页。
- 长度 Y. Pratt,“神经网络间基于可辨性的转移”,NIPS 会议:神经信息处理系统的进展 5,摩根考夫曼出版社,1993 年,第 204–211 页。
- Lake,T. Ullman,J. Tenenbaum,S. Gershman,“建造像人一样学习和思考的机器”,行为和大脑科学,40,doi:10.1017/S0140525X16001837。
- F.《具身心智:认知科学与人类经验》,剑桥,麻省:麻省理工学院出版社,1993 年,第 147-179 页。
- J.文森特,“DeepMind 的创始人说要建立更好的计算机大脑,我们需要看看我们自己的,”The Verge,2017 年 7 月 19 日, https://www .the verge . com/2017/7/19/15998610/ai-神经科学-机器学习-deep mind-demis-has sabis-面试。
- J.“预测误差最小化是头脑的全部内容吗?”大脑博客,2014 年 6 月 22 日,http://philosophyofbrains.com/2014/06/22/is-prediction-error-minimization-all-there-to-the-mind . aspx
- K.Friston,J. Kilner,L. Harrison,“大脑的自由能原理”,《生理学杂志》,巴黎,100(1-3),伦敦,英国:Elsevier,2006 年,第 70-87 页。
- 页(page 的缩写)Schwartenbeck,T. FitzGerald,R. Dolan,K. Friston,“探索、新奇、惊奇和自由能最小化”,《心理学前沿》4,2013 年,doi:10.3389/fpsyg.2013.00710。
- H.T Siegelmann,E. D. Sontag,“论神经网络的计算能力”,《计算机与系统科学杂志》,50(1),1995 年,第 132-150 页
- K.哈蒙德,“人工智能:透明不仅仅是一种趋势”,《计算机世界》,2017 年 1 月 22 日,马萨诸塞州弗雷明汉:IDG 通信。
- R.Q. Quiroga,I. Fried,C. Koch,“祖母的脑细胞”,《科学美国人》,2013 年 2 月 308(2),第 30-35 页。
- 维基百科,“祖母细胞。”https://en.wikipedia.org/wiki/Grandmother_cell
用 10 行代码拯救生命:用 XGBoost 检测帕金森
因此,您已经涉足了数据科学,听说过“XGBoost”这个术语,但不知道它是什么。我非常喜欢通过做来学习,所以让我们尝试使用 XGBoost 来解决现实生活中的问题:诊断帕金森氏症。
XGBoost 是一种流行的技术,是传统回归/神经网络的一种简洁的替代方法。它代表 EXtremeGradientBoosting,基本上是构建一个决策树来计算梯度。这里有一个来自 XGBoost 网站的流行图片作为例子:
Not so menacing now, huh?
这在实践中听起来很简单,但却非常强大。以帕金森氏症检测为例:我们有几个指标可以分析,最终我们需要诊断帕金森氏症(分类!).这对于 XGBoost 来说是一个完美的问题(特别是因为只有一个输出,所以我们不需要使用多输出包装器——稍后会详细介绍)。
让我们写 10 行代码
让我们从收集一些数据开始。在我的好朋友 Shlok 的指引下,我发现了一个格式极佳的数据集:跳到 UCI 的 ML 数据库,下载帕金森氏症数据集parkinsons.data
( 这里有一个链接)(如果它消失了,就在这个回购)。它们是 CSV,所以我们可以用熊猫快速解析它们:
df = pd.read_csv('parkinsons.data')
接下来,我们需要获取特性和标签。除了第一列(名称)之外,所有列都是数字,带有标签的列是“状态”(已经是 0 或 1)。我们暂且忽略它们的意义,盲目分析*(实践中不要这么做)*。这使得我们很方便地快速获得训练数据:
features = df.loc[:, df.columns != 'status'].values[:, 1:]
labels = df.loc[:, 'status'].values
接下来,我们需要缩放我们的要素,使其介于-1 和 1 之间,以便进行规范化。我们可以用sklearn
的聪明的MinMaxScaler
来做到这一点:
scaler = MinMaxScaler((-1, 1))
X = scaler.fit_transform(features)
目前为止我们有 5 条线。接下来,让我们把它分成训练和测试数据,这样我们可以防止过度拟合。没有太多的数据点,所以让我们将 14%分成测试数据,这次使用sklearn
的train_test_split
便利函数:
X_r, X_s, Y_r, Y_s = train_test_split(X, labels, test_size=0.14)
然后我们使用xgboost
的 XGBClassifier,它已经为分类而构建,并通过xgboost
模块(pip install xgboost
)提供:
model = XGBClassifier()
model.fit(X_r, Y_r)
这应该需要一瞬间,然后完成树的构建。我们无需花费数小时的训练就能实现融合,这不是很棒吗?
我们现在有 8 行了—缩短它!让我们用来自sklearn
的accuracy_score
函数,根据之前的测试集来评估我们的模型,从而结束这个交易:
Y_hat = [round(yhat) **for** yhat **in** model.predict(X_test)]
print(accuracy_score(Y_test, Y_hat))
您应该可以看到高达 90%的准确度(在测试集上大约为 96.42%!).这已经很惊人了,因为 2007 年的原始论文引用了 91.8±2.0%的分类准确率,2016 年的其他论文引用了 96.4% (SVM) 和 97%的带有调优(Boosted LogReg) 的准确率;通过一些调整,我们的模型可以远远超过最先进的方法!
就是这样!10 行代码,你就训练了一个完整的帕金森病 XGBoosting 分类器。您可以在Train.ipynb
Jupyter 笔记本此处找到此模型的完整源代码以及另一个 UDPRS 数据模型。
事后思考
XGBoosting 极其强大,绝对可以成为你下一个项目的有用工具!不过这要深入得多——对于多输出,您需要一个多输出模型(SciKit Learn 有一个很好的包装器),为了更加精确,您需要微调 XGBoost 模型。在之前的 Jupyter 笔记本中(以及下面链接的 repo 中),我探索了使用 Keras 处理连续数据,但是来自sklearn
的 MultiOutput 包装器几乎可以作为 Keras 模型的替代。如果你想要更高级的关于微调 XGBoost 的教程,请查看 2016 年的这篇好文章!
帕金森-人工智能-使用 XGBoost 和神经网络检测帕金森
github.com](https://github.com/pshah123/parkinsons-AI)
像这样,还有更多?在 Aiko AI ,我们热爱开源项目以及探索和可视化数据!
使用机器学习检测异常
异常检测的 4 个类别简介
Photo by Ricardo Gomez Angel on Unsplash
什么是异常检测?
异常检测问题是机器学习领域中经常被探索的问题,已经成为一个经典问题。异常是大型数据语料库中任何不寻常的序列或模式。除非得到解决,否则这些异常通常会导致意想不到的复杂错误或效率低下。如果语料库相对较小,通过语料库搜索这些异常可能很容易,但是当它扩展到巨大的规模时,这种解决方案就变得不合理了。例如,试图在 200 个单词的段落中找到一个语法错误是很容易的,但是想象一下试图在一本 5000 页的百科全书中找到所有的语法错误。这个问题对人类来说变得更加困难。幸运的是,在机器学习的帮助下,我们能够更容易地解决这个问题。
首先,什么是机器学习?机器学习本质上是使用统计学从训练集(背景数据集)中建模和训练系统(或语料库)通常如何表现。之后,我们可以将异常行为系统(目标数据集)与我们的正常系统行为模型进行比较,并尝试发现目标中的异常。尽管主要思想听起来非常简单和直观,但这一过程存在许多复杂性,例如找到代表整个群体的背景数据集,将计算分配到不同的机器上处理大型数据集等。虽然这些问题都是软件工程师在创建一个完善的机器学习模型之前必须解决的困难障碍,但我不会谈论这些问题,而是机器学习的应用来发现异常。
异常检测问题的类型
已知数据集中的结构化异常
有四种主要类型的异常检测问题。第一种(也是最容易的)类型是检测已知语料库中的结构化异常。在这些问题中,你知道异常的结构是什么,你也知道语料库的格式。作为一个简化的类比,在语料库是一串严格递增的数字的情况下,检测从之前的数字减少的数字的问题将属于这种类型。在这个例子中,我们知道正常行为的模式(严格增加的数字),并且我们正在检测一个已知的异常(相邻数字之间的减少)。这个问题相对容易,因为我们可以清楚地测量和确定地知道什么时候某个东西是异常的,因为我们有一个清晰的结构来比较它。在这种情况下,相对容易拥有高性能的机器学习算法,并且具有可以忽略的误报率。
未知数据语料库中的结构化异常
第二类是检测未知语料库中的结构化异常。这些问题比前一个例子更困难,因为我们现在需要考虑如何解析和评估语料库以发现异常的问题。这个问题并不比前面的例子更难,因为我们仍然知道异常的结构,所以在我们解决了解析问题之后,这种类型的问题就和前面的类型一样了。然而,由于目标语料库具有未知的结构,因此很可能会比第一种类型有更多的假阴性。
已知数据集中的非结构化异常
第三种类型是检测已知语料库中的非结构化异常。同样,这类问题比前一类更复杂。尽管我们有一个定义好的结构来构建我们的解析算法,但是这些异常是非结构化的,这意味着我们必须真正理解背景语料库的启发性,以便评估目标语料库。在这种情况下,除了假阴性之外,我们还开始有假阳性,因为我们没有适当的方法来评估我们检测到的异常在没有人工干预的情况下是否是真阳性。
未知数据语料库中的非结构化异常
最后一种类型是最困难的异常检测问题,今天仍在研究和改进中。当然,剩下的类型是检测未知语料库中的非结构化异常。在这种情况下,我们不仅必须理解语料库的启发性,我们还必须基于启发性创建许多度量来评估目标语料库的每个片段有多异常。对于所有这些度量,我们需要设置阈值,根据这些阈值,我们将一个片段分类为异常。这些阈值每个都有其自己的权衡,并且找到用于检测异常的最佳阈值需要在多维空间中操作和评估性能,每个维度代表一个阈值。此外,在探索这个多维空间之后,人们可能意识到背景语料库的试探法没有被机器学习模型恰当地表示,并且必须重新开始并想出另一种方式来量化或识别语料库的模式。由于绩效反馈循环,整个过程可能非常复杂和令人沮丧。这种类型的异常检测虽然非常困难,但可能会产生惊人的结果。
结论
可以理解的是,我们可以忽略异常和语料库的结构的程度与创建算法的难度成比例。我们对异常和语料库的结构越具体,机器学习算法就越容易实现。异常和语料库的结构化程度越低,算法可以应用的问题范围就越广。然而,随着异常和语料库的结构变得更加模糊,准确度和精确度也将成为问题。在一个理想的世界里,如果我们制造了一个超级通用和精确的机器学习算法,并对其进行完美的调整以解决每一种情况,我们将能够将其应用于世界上的任何问题。在健康和医学领域,我们可以检测基因组中有问题的子序列,从而在癌症等疾病成为问题之前检测出它们。在技术领域,我们可以将算法应用于实时日志系统,并在黑客或恶意活动发生时立即发现它们。异常检测可以应用于许多其他领域,如果我们有一天能够完善它,我们就可以解决许多今天困扰科学家、工程师和研究人员的问题。
用自然语言处理检测不良顾客评论
用 Python 进行情感分析和文本分类
Photo by Thought Catalog on Unsplash
介绍
情感分析是自然语言处理(NLP)技术的一部分,包括提取与一些原始文本相关的情感。这通常用于社交媒体帖子和客户评论,以便自动了解一些用户是积极还是消极以及为什么。这项研究的目标是展示如何使用 python 进行情感分析。以下是我们将使用的一些主要库:
- NLTK:NLP 技术最著名的 python 模块
- Gensim:一个主题建模和向量空间建模工具包
Gensim module
- Scikit-learn:最常用的 python 机器学习库
Scikit-learn module
我们将在这里使用一些酒店评论数据。每个观察包括对一个酒店的一个顾客评论。每个顾客评论由顾客对酒店体验的文字反馈和总体评分组成。数据可以在这里找到:
https://www . ka ggle . com/jiashenliu/515k-hotel-reviews-data-in-Europe
对于每个文本评论,我们想要预测它是对应于一个好的评论(客户满意)还是一个坏的评论(客户不满意)。评论的总体评分从 2.5/10 到 10/10 不等。为了简化问题,我们将把它们分成两类:
- 差评有总评< 5
- good reviews have overall ratings > = 5
这里的挑战是能够仅使用来自综述的原始文本数据来预测这些信息。让我们开始吧!
加载数据
我们首先从加载原始数据开始。每篇文本评论分为正面和负面两部分。我们将它们组合在一起,以便只从原始文本数据开始,没有其他信息。
Initial dataset
抽样资料
为了加快计算速度,我们对数据进行了采样。
干净的数据
如果用户没有留下任何负面反馈意见,这将在我们的数据中显示为“无负面”。默认值为“无正面”的正面评论也是如此。我们必须从课本中删除这些部分。
下一步是用各种操作清理文本数据:
为了清理文本数据,我们调用自定义的“clean_text”函数来执行几个转换:
- 降低文本
- 将文本标记化(将文本拆分成单词)并删除标点符号
- 删除包含数字的无用单词
- 删除无用的停用词,如“the”、“a”、“this”等。
- 词性标注:给每个单词分配一个标签,以确定它是否对应于名词、动词等。使用 WordNet 词汇数据库
- 对文本进行词汇化:将每个单词转换成它们的词根形式(例如,rooms -> room,sleeped-> sleep)
现在我们已经清理了我们的数据,我们可以为我们的模型化部分做一些特征工程。
特征工程
我们首先从添加情感分析特性开始,因为我们可以猜测客户评论与他们对酒店住宿的感受高度相关。我们使用 Vader,它是为情感分析设计的 NLTK 模块的一部分。维德使用词汇来找出哪些是肯定的,哪些是否定的。它还考虑句子的上下文来确定情感分数。对于每个文本,Vader 返回 4 个值:
- 中立分数
- 积极得分
- 消极得分
- 总结以前分数的总分
我们将整合这 4 个值作为数据集中的特征。
接下来,我们为每个文本添加一些简单的指标:
- 文本中的字符数
- 文本中的字数
下一步是为每个评论提取矢量表示。Gensim 模块通过使用单词出现的上下文来创建语料库中每个单词的数字向量表示(Word2Vec)。这是使用浅层神经网络来执行的。有趣的是,相似的词会有相似的表示向量。
还可以使用单词 vectors (Doc2Vec)将每个文本转换成数字向量。相同的文本也将具有相似的表示,这就是为什么我们可以使用这些向量作为训练特征。
我们首先必须通过输入文本数据来训练 Doc2Vec 模型。通过在我们的评论上应用这个模型,我们可以得到那些表示向量。
最后,我们为每个单词和每个文档添加 TF-IDF(术语频率——逆文档频率)值。
但是为什么不简单地计算每个单词在每个文档中出现的次数呢?这种方法的问题是,它没有考虑到文本中单词的相对重要性。一个出现在几乎所有文本中的单词不太可能为分析带来有用的信息。相反,生僻字可能有更多的含义。
TF-IDF 度量解决了这个问题:
- TF 计算单词在文本中出现的经典次数
- IDF 计算该单词的相对重要性,这取决于可以找到多少文本
我们为出现在至少 10 个不同文本中的每个单词添加了 TF-IDF 列,以过滤其中的一些单词并减少最终输出的大小。
探索性数据分析
为了更好地理解我们的数据,让我们稍微探究一下:
0 0.956761
1 0.043239
Name: is_bad_review, dtype: float64
我们的数据集是高度不平衡的,因为不到 5%的评论被认为是负面的。这些信息对建模部分非常有用。
现在,让我们打印一些单词云,看看哪些单词出现在我们的评论中:
WordCloud from the customer reviews
大多数单词确实与酒店有关:房间、员工、早餐等。有些词与顾客对酒店住宿的体验更相关:完美、喜爱、昂贵、不喜欢等。
Highest positive sentiment reviews
最积极的评价确实对应着一些好的反馈。
Highest negative sentiment reviews
在最负面的评论中可以发现一些错误:维达有时将“不”或“什么都没有”解释为负面词汇,而它们有时被用来表示酒店没有任何问题。幸运的是,大多数评论确实是不好的。
Sentiment distribution
上图显示了好评和差评的评论情绪分布。我们可以看到,维达认为大多数好评都是非常正面的。相反,差评往往复合情绪得分较低。
这向我们表明,先前计算的情感特征在我们的建模部分将非常重要。
造型很差
我们首先选择要用来训练模型的特征。然后我们将数据分成两部分:
- 一个用来训练我们的模型
- 一个是评估它的表现
接下来,我们将使用随机森林(RF)分类器进行预测。
Most important features
最重要的特征确实是来自前面的情感分析的特征。文本的向量表示在我们的训练中也很重要。一些单词似乎也有相当的重要性。
ROC curve
ROC(接收器操作特性)曲线通常是总结我们的分类器质量的好图。曲线在对角线基线之上越高,预测就越好。虽然 AUC ROC(ROC 曲线下的面积)非常好,但我们不应该在这里使用 ROC 曲线来评估我们模型的质量。
为什么?首先让我们提醒一下假阳性率公式,它对应于 ROC 曲线的 x 轴:FPR(假阳性率)= #假阳性/ #阴性。
这里的#负数对应于我们的好评数,因为我们的数据集不平衡,所以好评数非常高。这意味着,即使有一些假阳性,我们的 FPR 将倾向于保持很低。我们的模型将能够做出许多假阳性预测,并且仍然具有低假阳性率,同时增加真阳性率,因此人为地增加 AUC ROC 度量。
PR curve
在这种不平衡的情况下,一个更好的指标是 AUC PR(曲线下面积精度召回),也称为 AP(平均精度)。
我们可以看到,当我们提高召回率时,精确度会降低。这告诉我们,我们必须选择一个适合我们需要的预测阈值。如果我们的目标是高召回率,我们应该设置一个低的预测阈值,这将允许我们检测大多数阳性类别的观察值,但是精度较低。相反,如果我们想对我们的预测真正有信心,但不介意没有找到所有积极的观察结果,我们应该设置一个高阈值,这将使我们获得高精度和低召回率。
为了知道我们的模型是否比另一个分类器执行得更好,我们可以简单地使用 AP 度量。为了评估我们模型的质量,我们可以将其与简单的决策基线进行比较。让我们以一个随机分类器作为基线,它将预测标签的一半时间 1 和一半时间 0。
这种分类器将具有 4.3%的精度,这对应于正面观察的比例。对于每个召回值,精度将保持不变,这将导致 AP 为 0.043。我们模型的 AP 约为 0.35,比随机方法的 AP 高 8 倍以上。这意味着我们的模型有很好的预测能力。
结论
完全可以只使用原始文本作为输入来进行预测。最重要的是能够从原始数据中提取相关特征。这种数据通常可以作为数据科学项目中的一个很好的补充来源,以便提取更多的学习特征并提高模型的预测能力。
下面是 Github 上 Jupyter 原始笔记本的链接:
使用 Python-jonathanoheix/带酒店评论的情感分析进行情感分析和文本分类
github.com](https://github.com/jonathanoheix/Sentiment-analysis-with-hotel-reviews)
同样在 Kaggle 上:
[## 酒店评论的情感分析| Kaggle
www.kaggle.com](https://www.kaggle.com/jonathanoheix/sentiment-analysis-with-hotel-reviews/)
我的 LinkedIn 个人资料: