TowardsDataScience-博客中文翻译-2016-2018-十三-
TowardsDataScience 博客中文翻译 2016~2018(十三)
原文:TowardsDataScience Blog
协议:CC BY-NC-SA 4.0
使用 TensorFlow 服务和 Flask 部署 Keras 模型
原文:https://towardsdatascience.com/deploying-keras-models-using-tensorflow-serving-and-flask-508ba00f1037?source=collection_archive---------2-----------------------
通常需要抽象出机器学习模型的细节,并将其部署或集成到易于使用的 API 端点中。例如,我们可以提供一个 URL 端点,任何人都可以使用它来发出 POST 请求,他们将获得模型推断的 JSON 响应,而不必担心它的技术细节。
在本教程中,我们将创建一个 TensorFlow 服务服务器来部署我们在 Keras 中构建的InceptionV3
图像分类卷积神经网络(CNN)。然后,我们将创建一个简单的 Flask 服务器,它将接受 POST 请求并进行 Tensorflow 服务服务器所需的一些图像预处理,然后返回一个 JSON 响应。
TensorFlow 提供的是什么?
服务就是你在训练完机器学习模型后如何应用它。
Know more about TensorFlow Serving here
TensorFlow 服务使模型投入生产的过程变得更加简单快捷。它允许您安全地部署新模型和运行实验,同时保持相同的服务器架构和 API。开箱即用,它提供了与 TensorFlow 的集成,但它可以扩展为服务于其他类型的模型。
安装 TensorFlow 服务
先决条件:请创建一个 python 虚拟环境,并在其中安装带有 TensorFlow 后端的 Keras。点击阅读更多。
注意:所有命令都已经在 Ubuntu 18.04.1 LTS 上的 python 虚拟环境中执行。
现在,在同一个虚拟环境中运行以下命令(使用sudo
获得 root 权限):
$ apt install curl$ echo "deb [arch=amd64] [http://storage.googleapis.com/tensorflow-serving-apt](http://storage.googleapis.com/tensorflow-serving-apt) stable tensorflow-model-server tensorflow-model-server-universal" | sudo tee /etc/apt/sources.list.d/tensorflow-serving.list && curl [https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg](https://storage.googleapis.com/tensorflow-serving-apt/tensorflow-serving.release.pub.gpg) | sudo apt-key add -$ apt-get update$ apt-get install tensorflow-model-server$ tensorflow_model_server --version
TensorFlow ModelServer: 1.10.0-dev
TensorFlow Library: 1.11.0$ python --version
Python 3.6.6
您可以通过以下方式升级到tensorflow-model-server
的新版本:
$ apt-get upgrade tensorflow-model-server
我们将要构建的目录概述
在我们开始之前,理解目录结构将有助于我们清楚地了解每一步的进展情况。
(tensorflow) ubuntu@Himanshu:~/Desktop/Medium/keras-and-tensorflow-serving$ tree -c
└── keras-and-tensorflow-serving
├── README.md
├── my_image_classifier
│ └── 1
│ ├── saved_model.pb
│ └── variables
│ ├── variables.data-00000-of-00001
│ └── variables.index
├── test_images
│ ├── car.jpg
│ └── car.png
├── flask_server
│ ├── app.py
│ ├── flask_sample_request.py
└── scripts
├── download_inceptionv3_model.py
├── inception.h5
├── auto_cmd.py
├── export_saved_model.py
├── imagenet_class_index.json
└── serving_sample_request.py6 directories, 15 files
您可以从我的 GitHub 存储库中获得所有这些文件:
[## himanshurawlani/keras-和-tensor flow-服务
使用 TensorFlow 服务和 Flask 部署 Keras 模型-himanshurawlani/Keras-and-tensor flow-Serving
github.com](https://github.com/himanshurawlani/keras-and-tensorflow-serving)
导出张量流服务的 Keras 模型
对于本教程,我们将下载和保存InceptionV3
CNN,使用download_inceptionv3_model.py
在 Keras 中使用 Imagenet 权重。您可以下载keras.applications
库中的任何其他可用模型(此处为),或者如果您已经在 Keras 中构建了自己的模型,则可以跳过这一步。
执行上述脚本后,您应该得到以下输出:
$ python download_inceptionv3_model.py
Using TensorFlow backend.
Downloading data from [https://github.com/fchollet/deep-learning-models/releases/download/v0.5/inception_v3_weights_tf_dim_ordering_tf_kernels.h5](https://github.com/fchollet/deep-learning-models/releases/download/v0.5/inception_v3_weights_tf_dim_ordering_tf_kernels.h5)
96116736/96112376 [==============================] - 161s 2us/step
现在我们有了以 Keras 格式保存的 CNN ( inception.h5
)。我们希望以 TensorFlow 服务器可以处理的格式导出我们的模型。我们通过执行export_saved_model.py
脚本来做到这一点。
TensorFlow 提供了SavedModel
格式作为导出模型的通用格式。在幕后,我们的 Keras 模型完全是根据 TensorFlow 对象指定的,因此我们可以使用 Tensorflow 方法很好地导出它。TensorFlow 提供了一个便利的函数tf.saved_model.simple_save()
,它抽象出了一些细节,对于大多数用例来说都很好。
输出:
$ python export_saved_model.py
WARNING:tensorflow:No training configuration found in save file: the model was *not* compiled. Compile it manually.
我们得到这个警告是因为我们下载了一个预先训练好的模型。我们可以按原样使用这个模型进行推理,但是如果我们想进一步训练它,我们需要在加载它之后运行compile()
函数。现在可以安全地忽略这个警告。执行该脚本后,以下文件保存在my_image_classifier
目录中:
├── my_image_classifier
└── 1
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index2 directories, 3 files
假设我们希望在未来更新我们的模型(可能是因为我们收集了更多的训练数据,并在更新的数据集上训练了模型),我们可以通过,
- 在新的 keras 模型上运行相同的脚本
- 将
export_saved_model.py
中的export_path = ‘../my_image_classifier/1’
更新为export_path = ‘../my_image_classifier/2’
TensorFlow Serving 会在my_image_classifier
目录下自动检测模型的新版本,并在服务器中进行更新。
启动 TensorFlow 服务服务器
要在本地计算机上启动 TensorFlow 服务服务器,请运行以下命令:
$ tensorflow_model_server --model_base_path=/home/ubuntu/Desktop/Medium/keras-and-tensorflow-serving/my_image_classifier --rest_api_port=9000 --model_name=ImageClassifier
--model_base_path
:这必须是一个绝对路径,否则你会得到一个错误消息:
Failed to start server. Error: Invalid argument: Expected model ImageClassifier to have an absolute path or URI; got base_path()=./my_image_classifier
--rest_api_port
: Tensorflow 服务将在端口 8500 上启动 gRPC ModelServer,REST API 将在端口 9000 上可用。--model_name
:这将是您用来发送 POST 请求的服务器的名称。您可以在此键入任何名称。
测试我们的 TensorFlow 服务器
From raw data to production models (Source)
serving_sample_request.py
脚本向 TensorFlow 服务服务器发出 POST 请求。输入图像通过命令行参数传递。
输出:
$ python serving_sample_request.py -i ../test_images/car.png
Using TensorFlow backend.
[["n04285008", "sports_car", 0.998414], ["n04037443", "racer", 0.00140099], ["n03459775", "grille", 0.000160794], ["n02974003", "car_wheel", 9.57862e-06], ["n03100240", "convertible", 6.01581e-06]]
与后续调用相比,TensorFlow 服务服务器响应第一个请求的时间稍长。
为什么我们需要 Flask 服务器?
正如我们所看到的,我们已经在serving_sample_request.py
(前端调用程序)中执行了一些图像预处理步骤。以下是在 TensorFlow 服务器上创建 Flask 服务器的原因:
- 当我们向前端团队提供 API 端点时,我们需要确保我们不会用预处理技术淹没他们。
- 我们可能并不总是有 Python 后端服务器(例如 Node.js 服务器),所以使用 numpy 和 keras 库进行预处理可能会很痛苦。
- 如果我们计划服务多个模型,那么我们将不得不创建多个 TensorFlow 服务服务器,并将不得不添加新的 URL 到我们的前端代码。但是我们的 Flask 服务器会保持域名 URL 不变,我们只需要添加一个新的路由(一个函数)。
- 提供基于订阅的访问,异常处理和其他任务可以在 Flask app 中进行。
我们正在努力消除 TensorFlow 服务服务器和我们前端之间的紧密耦合。
Multiple TensorFlow Serving servers hidden behind a Flask server
在本教程中,我们将在与 TensorFlow 服务器相同的计算机和虚拟环境中创建一个 Flask 服务器,并使用已安装的库。理想情况下,两者都应该在不同的机器上运行,因为大量的请求会导致 Flask 服务器由于正在执行图像预处理而变慢。此外,如果请求数量非常多,单个 Flask 服务器可能不够用。如果我们有多个前端调用者,我们可能还需要一个排队系统。尽管如此,我们可以使用这种方法来开发一个令人满意的概念证明。
创建 Flask 服务器
先决条件:从这里在 python 虚拟环境中安装 Flask。
我们只需要一个app.py
文件来创建我们的 Flask 服务器。
转到保存app.py
文件的目录,使用以下命令启动 Flask 服务器:
$ export FLASK_ENV=development && flask run --host=0.0.0.0
FLASK_ENV=development
:这启用了调试模式,基本上给你完整的错误日志。不要在生产环境中使用它。flask run
命令自动执行当前目录下的app.py
文件。--host=0.0.0.0
:这使您能够从任何其他机器向 Flask 服务器发出请求。要从不同的机器发出请求,您必须指定运行 Flask 服务器的机器的 IP 地址来代替localhost
。
输出:
* Running on [http://0.0.0.0:5000/](http://0.0.0.0:5000/) (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 1xx-xxx-xx4
Using TensorFlow backend.
使用前面相同的命令启动 TensorFlow 服务器:
$ tensorflow_model_server --model_base_path=/home/ubuntu/Desktop/Medium/keras-and-tensorflow-serving/my_image_classifier --rest_api_port=9000 --model_name=ImageClassifier
这里有一个脚本(auto_cmd.py
)来自动启动和停止两个服务器(TensorFlow Serving 和 Flask)。您也可以为两台以上的服务器修改该脚本。
记得在auto_cmd.py
的行第 10 处更改路径,使其指向您的app.py
目录。你可能还需要修改第 6 行以使它指向你的虚拟环境的 bin。然后,通过在终端中执行以下命令,您可以从任何目录执行上述脚本:
$ python auto_cmd.py
测试我们的 Flask 服务器和 TensorFlow 服务器
我们使用flask_sample_request.py
脚本制作一个示例请求。该脚本基本上模拟了来自前端的请求:
- 我们获取一个输入图像,将其编码为 base64 格式,并使用 POST 请求将其发送到我们的 Flask 服务器。
- Flask server 对这个 base64 图像进行解码,并为我们的 TensorFlow 服务器进行预处理。
- 然后,Flask server 向我们的 TensorFlow 服务服务器发出 POST 请求,并对响应进行解码。
- 解码后的响应被格式化并发送回前端。
输出:
$ python flask_sample_request.py -i ../test_images/car.png
[
[
"n04285008",
"sports_car",
0.998414
],
[
"n04037443",
"racer",
0.00140099
],
[
"n03459775",
"grille",
0.000160794
],
[
"n02974003",
"car_wheel",
9.57862e-06
],
[
"n03100240",
"convertible",
6.01581e-06
]
]
我们的 flask 服务器目前只有一条路由用于我们的单个 Tensorflow 服务服务器。我们可以通过在不同或相同的机器上创建多个 Tensorflow 服务服务器来服务多个模型。为此,我们只需向我们的app.py
文件中添加更多的路线(功能),并在其中执行所需的特定于模型的预处理。我们可以将这些路线交给我们的前端团队,以便根据需要调用模型。
处理跨源 HTTP 请求
考虑这样一个场景,我们使用 Angular 发出一个 POST 请求,我们的 Flask 服务器收到 OPTIONS header 而不是 POST,因为,
- 当 web 应用程序请求来源(域、协议和端口)不同于其自身来源的资源时,它会发出跨来源 HTTP 请求。
- CORS(跨源资源共享)是一种机制,它使用额外的 HTTP 报头来告诉浏览器,让在一个源(域)上运行的 web 应用程序有权访问来自不同源的服务器的选定资源。在这里阅读更多关于 CORS 的信息。
因此,Angular 没有从 Flask 服务器得到任何响应。为了解决这个问题,我们必须在我们的app.py
中启用弗拉斯克-CORS。了解更多这里。
结论
这就是我们服务于机器学习模型所需要的一切。TensorFlow 服务使得将机器学习集成到网站和其他应用程序中变得非常容易。keras 中有大量预构建的模型可用(此处),有可能用最少的机器学习和深度学习算法知识开发出超级有用的应用。
如果你觉得这个教程有帮助,请分享给你的朋友,并留下掌声:-)。如果你有任何疑问、反馈或建议,请在评论中告诉我。另外,你可以在推特和 T2【LinkedIn】和我联系。有太多的东西要与你们分享,而我才刚刚开始。敬请关注更多内容!
用 Docker 部署机器学习模型
原文:https://towardsdatascience.com/deploying-machine-learning-models-with-docker-5d22a4dacb5?source=collection_archive---------2-----------------------
有很多文章解释了如何将 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 部分)
原文:https://towardsdatascience.com/deploying-machine-learning-models-with-graphpipe-part-2-of-series-5104e3a79f3c?source=collection_archive---------19-----------------------
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 容器。
成品在我的 GitHub 上可用(我很快会添加所有的导出脚本)。此外,几天后我应该可以在 Heroku 上运行模型演示了。我已经为我的模型部署系列计划了几篇文章,包括 Kubeflow、Tensorflow 模型的 GraphPipe 部署,以及在 Java 生产应用程序中部署模型(特别强调用 Flink 进行实时流预测)。我不确定我会按什么顺序出版它们,但我确实计划最终会着手去做。最后,在某个时候,我计划做一个基准测试,看看哪些方法在预测速度方面是真正最快的。
更多资源
【GraphPipe 官方网站
GraphPipe 发布文章
杂乱的模型加载代码
在 Google 计算引擎上部署 PySpark ML 模型作为 REST API
原文:https://towardsdatascience.com/deploying-pyspark-ml-model-on-google-compute-engine-as-a-rest-api-d69e126b30b1?source=collection_archive---------20-----------------------
循序渐进的教程
Photo by Sigmund on Unsplash
这篇文章和我之前的文章有松散的联系。
分步教程: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 模型
原文:https://towardsdatascience.com/deploying-scikit-learn-models-at-scale-f632f86477b8?source=collection_archive---------4-----------------------
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 上。使用这篇文章来建立您自己的部署管道,您将再也不需要担心如何部署和扩展您的模型了!
[## 开始使用 sci kit-了解 Kaggle
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 中进行深度/呼吸优先搜索矩阵遍历[回到基础知识]
原文:https://towardsdatascience.com/depth-breath-first-search-matrix-traversal-in-python-with-interactive-code-back-to-basics-31f1eca46f55?source=collection_archive---------1-----------------------
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
无向图中的深度优先搜索
原文:https://towardsdatascience.com/depth-first-search-in-undirected-graphs-8d563ef4004e?source=collection_archive---------2-----------------------
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)
实施:
测试:
结论
深度优先搜索是一个有趣的算法,正如你可能怀疑的那样,它特别适合于检查一个图是否连通;如果深度优先搜索返回的树包含图中的所有顶点,则它是连通的,否则不是。
从全连接网络逐步推导卷积神经网络
原文:https://towardsdatascience.com/derivation-of-convolutional-neural-network-from-fully-connected-network-step-by-step-b42ebafa5275?source=collection_archive---------6-----------------------
在图像分析中,卷积神经网络(简称为 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 函数的导数
原文:https://towardsdatascience.com/derivative-of-the-sigmoid-function-536880cf918e?source=collection_archive---------0-----------------------
Sigmoid and Dino
在本文中,我们将看到在人工智能应用中使用的 Sigmoid 函数的完整推导。
首先,让我们来看看 sigmoid 函数
Sigmoid function
好吧,看起来不错!
我们读作,x 的 sigmoid 是 1/1 加上负 x 的指数 这就是方程 (1) 。
让我们看看 sigmoid 函数的图形,
Graph of the Sigmoid Function
查看该图,我们可以看到给定一个数字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 频道的链接,
[## 阿鲁纳瓦查克拉博蒂| LinkedIn
查看 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——用人工智能增强人类创造力
原文:https://towardsdatascience.com/des-ai-gn-augmenting-human-creativity-with-artificial-intelligence-bb6ff611fa2c?source=collection_archive---------6-----------------------
用神经网络混合、创造和搜索美学上连贯的设计。
人工智能和计算机科学中讨论最多的一个方面是机器**是否有创造力。这个讨论和第一台计算机一样古老,但是最近来自生成性对抗网络和类似架构的惊人结果确实使这个讨论变得更大。作为一名创意者和技术专家,我最近关注了一个相似但本质上不同的话题:人工智能能增强人类的创造力?设计师可以使用机器智能增强灵感吗?
一开始有画。如果不是第一个,也是第一个帮助创意人员发挥创造力的软件工具之一。然后,人们开始看到计算机在处理图形方面是多么酷。现在,我们有了 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。挑战在于时装设计,以及增强设计师能力和灵感的方法。这一创意被评为最佳创意,并将在未来与赞助该活动的时尚品牌和公司合作,进一步推广。
描述一次你失败的经历
原文:https://towardsdatascience.com/describe-a-time-you-failed-1f67a091f0c7?source=collection_archive---------4-----------------------
工作面试通常是一个尴尬的过程。你很紧张,你需要看起来既有个性又专业,你需要把自己推销成一个了不起的产品,同时又不要自大。更尴尬的是当面试官探究你的弱点时。这里的老一套答案是把你的缺点变成优点——我工作太努力,关心太多!
我发现这令人沮丧,因为如果我们是一个真正重视学习的社区,那么我们需要诚实地面对我们的弱点,以便我们能够克服或管理它们。我的总会职业教练在一次模拟面试中问了我一个这样的问题。问题是“描述一次你失败的经历”,这是我的答案。
失败——我有史以来最糟糕的演讲
我们在劳联-产联利用我们的会员数据做了一些惊人的工作,我被要求在一次客户政治主管会议上就此做一个简短的介绍。我需要说的是,我们为客户开发了一个新的门户网站来上传他们的数据,这使我们能够更快地向他们提供他们需要的交付品。
当热情的技术人员与非技术利益相关者混合时,我遇到的问题是常见的。我为我们团队的工作感到非常自豪,所以我想了解它是如何工作的细节。
我做了一个工具如何工作的现场演示,展示了上传他们组织的数据的过程中的每一步。问题是房间里的人是高级职员,他们可能会将此任务委派给他们的 IT 团队。我在一台不熟悉的笔记本电脑上做这件事,拖长了演示时间,使问题变得更加复杂。
房间里的客户积极地给我负面的反馈。一位客户评论说“你不应该展示这个”。
复苏——内容拯救了我
尽管有这样的负面反馈,我还是坚持给他们看了一些我们写的关于他们成员的报告。因为观众是政治指导者,他们关心关于他们成员的政治统计。随着我们的新发展,我们将定期向政治董事提供他们需要的信息,如有多少成员登记投票。
这是一款易于决策者使用和理解的产品。会后,几名政治主任与我联系,确保他们会在接收这些例行报告的名单上。
我学到的——保持简单愚蠢
他们说你应该在演讲前了解你的听众。你不仅要知道他们是谁,还要知道他们想知道什么。我知道这些观众成员是非技术利益相关者,但是我错误地认为他们会像我一样对这些新开发的技术细节充满热情。
现在,当我向非技术利益相关者演示时,我尽量不让我的热情冲昏了头脑。在这些陈述中,我关注的是我们试图解决的问题,给出我们如何解决问题的高层次观点,并解释最终结果是什么。
如果听众中有技术利益相关者在细节上向我施压,我会尝试回答他们,或者与他们进行讨论,以便我们可以更深入地讨论细节。
我希望将来社区里的人们对他们的失败更加开放。这不仅包括像我这样的技术专家对这些问题持开放态度,还要求公司真诚地提出这类问题,并承认我们都有弱点。如果我们能建立起这种信任,那么我们就能共同从失败中吸取教训。
设计思维就是做出更好的决策
原文:https://towardsdatascience.com/design-thinking-is-all-about-making-better-decisions-13e0a5bce5fb?source=collection_archive---------3-----------------------
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 命令创建您的实验设计
原文:https://towardsdatascience.com/design-your-engineering-experiment-plan-with-a-simple-python-command-35a6ba52fa35?source=collection_archive---------0-----------------------
更新(2019 年 7 月):这组代码现在以标准 Python 库的形式提供— **doepy**
。你所要做的就是在你的终端中运行pip install doepy
。然后使用这个库按照这里的文档生成设计表。
阅读 Python 库 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 上部署它
原文:https://towardsdatascience.com/designing-a-machine-learning-model-and-deploying-it-using-flask-on-heroku-9558ce6bde7b?source=collection_archive---------1-----------------------
从创建机器学习模型到在网络上部署它——简明指南
我们使用不同的机器学习算法和分类器对历史数据建立预测模型,绘制结果并计算模型对测试数据的准确性。现在怎么办?为了使用它来预测新的数据,我们必须将它部署在互联网上,以便外部世界可以使用它。在这篇文章中,我讲述了我如何训练一个机器学习模型,如何使用 Flask 在其上创建一个 web 应用程序,以及如何使用 Heroku 部署它。
训练决策树
source
决策树是一种众所周知的监督机器学习算法,因为它易于使用,弹性和灵活性。我已经在来自 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
设计由算法驱动的产品
原文:https://towardsdatascience.com/designing-a-product-driven-by-algorithms-6604a71d62c?source=collection_archive---------9-----------------------
我们已经写了很多关于实现不同算法的实用性的文章,从计算机视觉到自然语言处理。在这篇文章中,我们想把重点放在设计使用数据的产品的实用性上。我们如何才能建立一个人们会真正使用的数据产品?在我们开始之前,我们想举起手来说,我们并不自称是这方面的专家,而是想把我们从各种不同来源学到的东西结合起来,以一种我们认为可能有用的方式。
如前所述,我们已经结合了几种不同的方法,我们将在它们出现时引用它们,并使用这些方法的组合,我们试图概述我们可以如何考虑建筑产品,特别是我们应该如何将数据结合到它们的设计中。
以结构化的方式构建数据产品
Source: Wikimedia Commons
我们介绍的第一种方法是在 O'Reilly 的文章中开发的“传动系统方法”。作者是著名的数据科学家,他们开发了一个很好的框架,在构建产品时,数据是产生可操作结果不可或缺的一部分,而不仅仅是更多的数据。
方法的结构🚀
目标
定义客户目标或需求以及相关的输出/行动
杠杆
确定输入,即我们作为设计师可以控制的所有东西
数据
确定我们可以收集的数据集
型号
创建从输入到定义的输出/行动的映射,以便我们实现客户目标
作为示例,我们将介绍为 ARTimbarc 平台设计数据产品特性的过程。这一功能的目的是使平台上的内容更容易访问,并鼓励访问者参与他们可能不会参与的内容。
目标
定义目标的过程可以使用现代产品设计和管理原则来完成;首先关注公司的使命和产品特性,了解谁是目标用户,然后了解这些用户的需求。从这里开始,我们根据对产品和公司的高层次目标的理解,优先考虑用户的需求。
做功理论
这是一个引入创新理论的好时机,这一理论被称为“要做的工作”(JTBD)及其延伸客户工作(见伟大著作此处)。潜在的概念是人们使用产品和服务来完成工作;虽然产品来来去去,但潜在的工作不会消失。露华浓的首席执行官曾经说过“在工厂里,我们生产化妆品。在药店里,我们出售希望。”—客户不想要特定的产品,但他们希望完成特定的“工作”。将精力集中在解决“客户工作”的创新上比当前产品的增量创新更有成效。
对这一理论的全面描述超出了本文的范围,但我们想强调几点,我们认为在给定“客户工作”的情况下尝试创建创新产品时,必须牢记这几点。
客户工作的力量
推拉
客户工作将需求挖掘分解为两种“力量”——推动和拉动。推动是那些促使顾客想要改变他们当前行为的力量,并激励他们寻找解决方案,它们是他们寻找产品解决工作的首要原因。例如,推动购买电动汽车可能是因为附近的每个人都很环保,所以我不想看起来不关心环境。“拉”是将客户拉向某个特定解决方案的力量,因为他们觉得这个解决方案具体解决了他们的“工作”。在我们的电动汽车场景中,这可能会吸引购买特斯拉,因为在我工作的地方附近有很多充电点,所以在工作日充电非常容易。
焦虑和惰性
接下来,我们把减少需求分解成两种力量;焦虑和惰性。焦虑是客户在第一次使用产品之前的一种感觉,担心它不能解决工作,或者担心继续使用产品的行为不能解决工作。例如,电动车每天晚上充电会不会很麻烦,以至于我想在六个月后卖掉它?当客户固步自封,因此不关心新的创新或觉得改变当前解决方案太难时,惰性就会显现出来。
阐明对客户工作的这些力量的理解对于开发正确的解决方案和最终设计客户将使用的产品是至关重要的。
现在,我们已经详细了解了客户做出决策的环境及其用户需求,我们可以生成一个潜在解决方案列表,然后根据收入潜力、实施简易性、客户满意度等权衡因素,确定我们应该重点构建测试 MVP 的优先顺序。
实际例子
这与 ARTimbarc 平台有什么关系?
客户工作
发现我们知道我们会喜欢的新的和令人兴奋的文化机构
推送——我们希望能够与朋友分享他们周末看到的新画廊的故事
我们已经找到了很多关于他们城市即将举办的活动的信息,但是我们发现很难知道我们会喜欢哪一个
焦虑——我们的周末时间很宝贵,我们不想浪费在去看我们不感兴趣的展览上
惯性——我们已经习惯了我们常用的发现方法,比如暂停,所以坚持下去
鉴于我们的高层次目标是使内容更易访问,我们将把目标锁定在对其最有用的访问者,因此我们将把重点放在过去一个月在不同画廊不止一次使用该产品的用户上,因为我们将从这些观众那里获得最大的回报。该平台处于非常有利的位置,因为我们帮助各种机构放大他们的故事,并且已经拥有这个网络,我们可以利用它来帮助用户发现新的内容。
上面我们发现了我们的客户工作和相关的力量。下一步是找到合适的解决方案。出于说明的目的,我们将假设我们已经经历了适当的排除过程,并且基于他们之前的行为登陆到推荐系统来呈现个性化的相关内容。这显然并不新颖,但却是一种屡试不爽的提高参与度的方法。
现在我们有了目标——允许参观者通过展示与用户相关的内容来发现新的展览——我们可以进入驱动方法的下一阶段。
杠杆
平台的杠杆在很大程度上取决于产品的设计,但通常会围绕我们向用户展示什么以及何时展示。我们可以在用户到达场馆前,在探索区向他们展示推荐内容,或者在他们到达场馆时展示周边地区的推荐展览,或者在他们参观后展示个性化的电子邮件。我们可以控制的另一个杠杆是展示给用户的展品和展览的排名。我们有能力根据用户受欢迎程度、外部评论、定价、用户评级等对内容进行评分。
数据
我们可以收集什么样的数据来向我们的用户展示最相关的内容?首先,我们可以看看个人用户之前的行为;他们喜欢的展览,他们去过的展览,他们是否捐过款等等。我们可以看看相似的用户是如何行动的,或者他们的朋友喜欢什么。我们可以看看外部艺术评论是如何谈论展览的,以及它们是如何被评级的。我们可以查看展览和用户的位置数据。我们可以看看用户普遍支付的门票价格。我们也可以看看用户如何评价展品、展览和画廊。并且有许多其他数据源可能与建议特定用户接下来可能想要去看什么展览相关。
模型
对于传动系统方法的模型阶段,我们必须决定将我们的输入数据集映射到我们的输出(建议的展览)的最佳方法。有很多关于推荐引擎架构的文献,本文的目的并不是介绍这些机制。然而,一种常见的方法是查看一个协作过滤模型,根据具有类似行为的用户所做的事情来推荐内容。我们还可以在此基础上添加一些其他数据,如位置和场地偏好,以便我们只推荐附近的场地和我们知道用户和/或类似用户喜欢的场地。如果我们想要更加具体/有针对性,我们可以建立一个艺术评论的情感分析模型,只推荐那些有“积极”情感的评论。
摘要
我们设计了一个产品功能,以对用户有用的方式推荐内容。它不仅考虑了类似用户以前做过的事情,还根据内部评级和外部评论对内容进行评分,以便我们能够展示与我们的用户相关的最高质量的新展览。我们使用数据不仅是为了产生更多的数据,也是为了产生可操作的结果,让我们向用户展示更多相关的内容,并让他们参与更长时间。通过使用上述框架来指导我们的思考,我们保证我们正在解决用户需求,并以智能的方式使用数据来帮助解决这一需求。
我们有意略过了这一过程的某些部分,因为我们不希望这是一篇论文,正如一开始提到的,我们可能没有完全按照作者的意图使用框架。尽管如此,我们发现这些结构在考虑如何设计数据产品时非常有用,并建议任何设计师或产品经理记住这些结构。
2018 年设计物联网解决方案
原文:https://towardsdatascience.com/designing-an-iot-solution-in-2018-7fe1356e63d6?source=collection_archive---------3-----------------------
几天前,我接到一个朋友的电话,他们有市场领先的产品,是时候推出他们的解决方案了。"外面是一片汪洋,你建议如何开始?"这些天,我主动给他写了一封电子邮件,提供了一些关于开始物联网系统设计的指导,以下是我的邮件:)
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 和许多其他产品)。英伟达和英特尔直接生产他们的芯片。
Arm 提供三个主要系列的处理器,M、R 和 A 。
大多数使用 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 设备时,注意您选择的平台非常重要:
- 有足够的 I/o(线/引脚)来处理所有这些
- 您有适当的协议支持。相对于 UART 、 SPI 、I2C、…,许多系统在处理器上将具有有限的管脚集
是时候联系了
这是物联网的第一步。
在决定物理通道时,有 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
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
设计数据产品
原文:https://towardsdatascience.com/designing-data-products-b6b93edf3d23?source=collection_archive---------0-----------------------
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 年都柏林产品罐见面会上的一次演讲的部分内容。
为共鸣设计声音
原文:https://towardsdatascience.com/designing-for-empathy-5cf398c20528?source=collection_archive---------2-----------------------
一个声音人工智能设备的简短演示。
概述
人类正处于第四次工业革命的转型期。充满新机遇的新生活紧紧围绕着科技。技术的进步创造了识别模式、自然语言处理和图像识别的人工智能(A.I .)工具。每个人工智能都有有限的功能类型,从狭义的人工智能到深度学习。这项技术必须获取需要教授或训练的数据。更好地称为监督或无监督学习。然后,数据被放入一个算法方程,以提供一个输出。
定义对人工智能的需求有助于浓缩该技术需要消化的数据类型。但是什么是数据呢?人工智能技术可以收集的数据类型有限制吗?最重要的是,为这项技术收集数据的结果会是什么?问题的复杂性引发了对未来的猜测。有人担心人工智能工具的自我发展会超出人类的想象。从而危及人类的生存。
一些近期的担忧是技术的自动化将会使人们失业。在以生产率和效率为基础的资本主义经济中,这是最令人担忧的。重复模式的工作岌岌可危,因为机器可以取代人的工作。此外,人们还担心私人信息的泄露、法庭上不公正的判决以及权威人士的偏见。一方面是自动化给人类带来的负面影响,另一方面是围绕技术的神话的发展。神话是非常重要的假设,它诱使人们认为技术可以体现人类的思维和情感形式,比如拥有情感。
在帕森斯设计学院,我们的课程“为人工智能设计”正在通过特定的社区探索机会。我们试图通过解剖创造不同形式人工智能的组件来了解技术的进步。然后,我们继续研究和综合现有技术。不同的技术有助于创造一种普遍理解的通用语言和用于创造人工智能技术的原则。完成这部分流程后,我们可以将重点放在可以从技术中受益的边缘化社区。
下面的项目是基于传统和非常规形式的关于人工智能的研究,这些研究导致了一种可能的预感。这个项目被制作成一个演示,然后展示给帕森斯的同事和教员。在这个阶段之后,项目可能会也可能不会继续深入细节。
[项目]
原始预感
可穿戴设备可以利用感觉设备帮助记录基于记忆的体验。
我是从上面的概念开始的。将现有的技术结合起来形成一个新概念具有挑战性,但最重要的是,这个想法通过现有的平台得到了广泛的探索。通过一些研究和综合,我有了新的预感。
更新预感 移情可以利用狭义人工智能通过各种人类声音体验来教授。
声音经常被忽视。讲故事我们的经历可以通过视觉和书面语言表达出来。声音呢?声音可以用来制作丰富的故事来揭露我们人类的差异吗?
视觉演示
概念 利用录音设备,通过点对点互动学习共情。技术装置:窄 A.I. > >录音> >声音
焦点
受众:11-15 岁>私立&公立>地点纽约市
目的
学生可以携带录音设备,捕捉一周中独特的时刻,作为识别其社区差异的学习工具。一周后,学生将设备归还给托管地点,在那里他们将收到一个新的声音设备。然后,学生可以聆听之前用户的声音体验,以确认差异。这个概念可以在一个学校系统,一个城市,或者一个行政区起作用。
挑战
录制的声音可以暴露生活经历中露骨或戏剧性的部分?
用户可以创建有偏见或有限的声音体验。
这种设备必须改变人口统计数据,否则它不会教任何新东西。
关键反馈 定义实际的人工智能。
它是如何工作的?这项技术收集的数据到底是什么?算法是什么样子的?产量是多少?
定义共情?
声音如何传递同理心?
有哪些例子是相对于声音和共情的?
为什么用户需要使用它?
持续参与的动力是什么?
正面反馈这次演讲非常刺激。
声音作为一个概念有很多机会,非常有趣。
演讲者对这个主题非常感兴趣。
作为技术的一部分,有整合运动的空间吗?
送礼和送礼对象有一些特别之处。有重量和质感,表达一种感觉。看看艺术家 Gio Tokato 的作品(sp?)、被盗信件。
设计智能
原文:https://towardsdatascience.com/designing-intelligence-c78f9959b3b8?source=collection_archive---------10-----------------------
一个好的设计原则适用于许多环境。作为一名在设计公司工作的技术人员,我一直在将设计原则应用到技术中,有时是开玩笑的,就像在代码中添加负空间一样,有时是更严肃的。这篇文章将一个众所周知的设计原则应用于人工智能。
我的推理跨越了许多领域,并导致了智能的“语法”,这是公认的浮夸。我用思维实验和类比来支持这个论点,但不是硬实验数据。尽管如此,我的希望是,像其他领域的投机想法一样,这些想法将为那些比我有更多时间来设计张量流实验或写科幻小说的人提供思想食粮。毫无疑问,这些想法在其中一种情况下会很有用。
近年来最令人兴奋的人工智能进展模仿了人类大脑中简单、重复的结构。我从下面描述的设计原则中获得的灵感火花是,简单的机制也可能驱动最高层次的人类思维。
背景
人工智能的最新进展非常简单。软件识别人脸的线路图可以画在餐巾纸的背面。“最强大的东西是简单的,”杰夫·霍金斯在 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 检测帕金森
原文:https://towardsdatascience.com/detect-parkinsons-with-10-lines-of-code-intro-to-xgboost-51a4bf76b2e6?source=collection_archive---------7-----------------------
因此,您已经涉足了数据科学,听说过“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 年的这篇好文章!
[## pshah 123/帕金森病-人工智能
帕金森-人工智能-使用 XGBoost 和神经网络检测帕金森
github.com](https://github.com/pshah123/parkinsons-AI)
像这样,还有更多?在 Aiko AI ,我们热爱开源项目以及探索和可视化数据!
使用机器学习检测异常
原文:https://towardsdatascience.com/detecting-anomalies-using-machine-learning-e3495f79718?source=collection_archive---------13-----------------------
异常检测的 4 个类别简介
Photo by Ricardo Gomez Angel on Unsplash
什么是异常检测?
异常检测问题是机器学习领域中经常被探索的问题,已经成为一个经典问题。异常是大型数据语料库中任何不寻常的序列或模式。除非得到解决,否则这些异常通常会导致意想不到的复杂错误或效率低下。如果语料库相对较小,通过语料库搜索这些异常可能很容易,但是当它扩展到巨大的规模时,这种解决方案就变得不合理了。例如,试图在 200 个单词的段落中找到一个语法错误是很容易的,但是想象一下试图在一本 5000 页的百科全书中找到所有的语法错误。这个问题对人类来说变得更加困难。幸运的是,在机器学习的帮助下,我们能够更容易地解决这个问题。
首先,什么是机器学习?机器学习本质上是使用统计学从训练集(背景数据集)中建模和训练系统(或语料库)通常如何表现。之后,我们可以将异常行为系统(目标数据集)与我们的正常系统行为模型进行比较,并尝试发现目标中的异常。尽管主要思想听起来非常简单和直观,但这一过程存在许多复杂性,例如找到代表整个群体的背景数据集,将计算分配到不同的机器上处理大型数据集等。虽然这些问题都是软件工程师在创建一个完善的机器学习模型之前必须解决的困难障碍,但我不会谈论这些问题,而是机器学习的应用来发现异常。
异常检测问题的类型
已知数据集中的结构化异常
有四种主要类型的异常检测问题。第一种(也是最容易的)类型是检测已知语料库中的结构化异常。在这些问题中,你知道异常的结构是什么,你也知道语料库的格式。作为一个简化的类比,在语料库是一串严格递增的数字的情况下,检测从之前的数字减少的数字的问题将属于这种类型。在这个例子中,我们知道正常行为的模式(严格增加的数字),并且我们正在检测一个已知的异常(相邻数字之间的减少)。这个问题相对容易,因为我们可以清楚地测量和确定地知道什么时候某个东西是异常的,因为我们有一个清晰的结构来比较它。在这种情况下,相对容易拥有高性能的机器学习算法,并且具有可以忽略的误报率。
未知数据语料库中的结构化异常
第二类是检测未知语料库中的结构化异常。这些问题比前一个例子更困难,因为我们现在需要考虑如何解析和评估语料库以发现异常的问题。这个问题并不比前面的例子更难,因为我们仍然知道异常的结构,所以在我们解决了解析问题之后,这种类型的问题就和前面的类型一样了。然而,由于目标语料库具有未知的结构,因此很可能会比第一种类型有更多的假阴性。
已知数据集中的非结构化异常
第三种类型是检测已知语料库中的非结构化异常。同样,这类问题比前一类更复杂。尽管我们有一个定义好的结构来构建我们的解析算法,但是这些异常是非结构化的,这意味着我们必须真正理解背景语料库的启发性,以便评估目标语料库。在这种情况下,除了假阴性之外,我们还开始有假阳性,因为我们没有适当的方法来评估我们检测到的异常在没有人工干预的情况下是否是真阳性。
未知数据语料库中的非结构化异常
最后一种类型是最困难的异常检测问题,今天仍在研究和改进中。当然,剩下的类型是检测未知语料库中的非结构化异常。在这种情况下,我们不仅必须理解语料库的启发性,我们还必须基于启发性创建许多度量来评估目标语料库的每个片段有多异常。对于所有这些度量,我们需要设置阈值,根据这些阈值,我们将一个片段分类为异常。这些阈值每个都有其自己的权衡,并且找到用于检测异常的最佳阈值需要在多维空间中操作和评估性能,每个维度代表一个阈值。此外,在探索这个多维空间之后,人们可能意识到背景语料库的试探法没有被机器学习模型恰当地表示,并且必须重新开始并想出另一种方式来量化或识别语料库的模式。由于绩效反馈循环,整个过程可能非常复杂和令人沮丧。这种类型的异常检测虽然非常困难,但可能会产生惊人的结果。
结论
可以理解的是,我们可以忽略异常和语料库的结构的程度与创建算法的难度成比例。我们对异常和语料库的结构越具体,机器学习算法就越容易实现。异常和语料库的结构化程度越低,算法可以应用的问题范围就越广。然而,随着异常和语料库的结构变得更加模糊,准确度和精确度也将成为问题。在一个理想的世界里,如果我们制造了一个超级通用和精确的机器学习算法,并对其进行完美的调整以解决每一种情况,我们将能够将其应用于世界上的任何问题。在健康和医学领域,我们可以检测基因组中有问题的子序列,从而在癌症等疾病成为问题之前检测出它们。在技术领域,我们可以将算法应用于实时日志系统,并在黑客或恶意活动发生时立即发现它们。异常检测可以应用于许多其他领域,如果我们有一天能够完善它,我们就可以解决许多今天困扰科学家、工程师和研究人员的问题。
用自然语言处理检测不良顾客评论
原文:https://towardsdatascience.com/detecting-bad-customer-reviews-with-nlp-d8b36134dc7e?source=collection_archive---------1-----------------------
用 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 原始笔记本的链接:
[## jonathanoheix/酒店评论情感分析
使用 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 个人资料:
https://www.linkedin.com/in/jonathanoheix/
通过 Tensorflow 识别蝙蝠的声音来探测蝙蝠
原文:https://towardsdatascience.com/detecting-bats-by-recognising-their-sound-with-tensorflow-cdd5e1c22b14?source=collection_archive---------13-----------------------
上周我发现我的公寓后面有蝙蝠。我立即抓起我的“蝙蝠探测器”:一种将蝙蝠用来回声定位的超声波信号从听不见的频率范围转换成听得见的频率范围的装置。因此,“蝙蝠探测器”这个名字是一个谎言:你可以用它来探测蝙蝠,但它本身并不能探测蝙蝠。在本教程中,我将向你展示如何使用 Tensorflow 建立一个真正的蝙蝠探测器。
不幸的是媒体不支持音频文件。去我的博客看看有声音的版本。
问题陈述
为了解决这个问题,我将蝙蝠探测器连接到我的笔记本电脑上,录下了几个片段。在一个单独的 Jupyter 笔记本上,我创建了一个标签程序。这个程序创建了一秒钟的“声音片段”,我将其分为包含蝙蝠声音的片段和不包含蝙蝠声音的片段。我用数据和标签创建一个分类器来区分它们。
识别声音的图书馆
我导入了一些非常有用的库来构建声音识别管道。我导入的明显的库是 Tensorflow、Keras 和 scikit。我喜欢的一个声音专用库是 librosa ,它帮助我加载和分析数据。
在[1]中:
import random
import sys
import glob
import os
import time
import IPython
import matplotlib.pyplot as plt
from matplotlib.pyplot import specgram
import librosa
import librosa.display
from sklearn.preprocessing import normalize
import numpy as np
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, FlattenUsing TensorFlow backend.
用 Python 加载声音数据
在数据标签笔记本中,我们输入标签,并将声音字节保存到我们输入的文件夹中。通过从这些文件夹加载,我可以加载蝙蝠声音和非蝙蝠声音文件。取决于有多少声音文件加载此数据可能需要很长时间。我把一个压缩文件夹里的所有文件都上传到了谷歌云平台。
- 标注声音
- 原始声音
注意,这个笔记本本身也可以从 Git 库下载。显然,Jupyter 笔记本中的声音比 wordpress/medium 中的声音要大得多。你可能得把声音调大一点!
在[2]中:
# Note: SR stands for sampling rate, the rate at which my audio files were recorded and saved.
SR = 22050 # All audio files are saved like this
def load_sounds_in_folder(foldername):
""" Loads all sounds in a folder"""
sounds = []
for filename in os.listdir(foldername):
X, sr = librosa.load(os.path.join(foldername,filename))
assert sr == SR
sounds.append(X)
return sounds
## Sounds in which you can hear a bat are in the folder called "1". Others are in a folder called "0".
batsounds = load_sounds_in_folder('labeled/1')
noisesounds = load_sounds_in_folder('labeled/0')
print("With bat: %d without: %d total: %d " % (len(batsounds), len(noisesounds), len(batsounds)+len(noisesounds)))
print("Example of a sound with a bat:")
IPython.display.display(IPython.display.Audio(random.choice(batsounds), rate=SR,autoplay=True))
print("Example of a sound without a bat:")
IPython.display.display(IPython.display.Audio(random.choice(noisesounds), rate=SR,autoplay=True))With bat: 96 without: 1133 total: 1229
Example of a sound with a bat:
您的浏览器不支持音频元素。
Example of a sound without a bat:
您的浏览器不支持音频元素。
用 Librosa 可视化声音
当你用耳机听蝙蝠的声音时,当一只蝙蝠飞过时,你可以听到清晰的声音。Librosa 库可以执行傅立叶变换来提取组成声音的频率。
在构建任何机器学习算法之前,仔细检查你正在处理的数据非常重要。在这种情况下,我决定:
- 听听声音
- 绘制声波图
- 绘制频谱图(频率振幅随时间变化的可视化表示)。
在[3]中:
def get_short_time_fourier_transform(soundwave):
return librosa.stft(soundwave, n_fft=256)
def short_time_fourier_transform_amplitude_to_db(stft):
return librosa.amplitude_to_db(stft)
def soundwave_to_np_spectogram(soundwave):
step1 = get_short_time_fourier_transform(soundwave)
step2 = short_time_fourier_transform_amplitude_to_db(step1)
step3 = step2/100
return step3
def inspect_data(sound):
plt.figure()
plt.plot(sound)
IPython.display.display(IPython.display.Audio(sound, rate=SR))
a = get_short_time_fourier_transform(sound)
Xdb = short_time_fourier_transform_amplitude_to_db(a)
plt.figure()
plt.imshow(Xdb)
plt.show()
print("Length per sample: %d, shape of spectogram: %s, max: %f min: %f" % (len(sound), str(Xdb.shape), Xdb.max(), Xdb.min()))
inspect_data(batsounds[0])
inspect_data(noisesounds[0])
您的浏览器不支持音频元素。
Length per sample: 22050, shape of spectogram: (129, 345), max: -22.786959 min: -100.000000
您的浏览器不支持音频元素。
Length per sample: 22050, shape of spectogram: (129, 345), max: -58.154167 min: -100.000000
数据分析
首先,重要的是要注意,我们正在处理的数据并不完全是大数据…只有大约 100 个阳性样本,深度神经网络很可能在这个 daa 上过度拟合。我们正在处理的一个问题是,收集阴性样本很容易(只需记录一整天没有蝙蝠的情况),而收集阳性样本很难(蝙蝠每天只在这里呆 15-20 分钟左右,我需要手动标记数据)。在确定如何对数据进行分类时,我们会考虑少量的阳性样本。
可听声信号
正如我们从上面可以看到的,信号的幅度随着噪声而降低,而信号的幅度却很高。然而,这并不意味着所有有声音的东西都是蝙蝠。在这个频率下,你还会接收到其他噪音,如手指摩擦声或电话信号。我决定把每一个负面信号放在一个大的“负面”堆上,把电话信号、手指引起的噪音和其他东西放在一个大堆里。
光谱图
我希望能在我们的频谱图中看到蝙蝠产生的准确频率。不幸的是,看起来我的传感器在所有频率上都把它当成了噪音。看着声谱图,你仍然可以看到蝙蝠声音和噪音之间的明显区别。我的第一个尝试是使用这个频谱图作为卷积神经网络的输入。不幸的是,仅使用几个正样本,很难训练这个网络。因此,我放弃了这种方法。
最后,我决定采用“元数据方法”。我把每秒钟的声音分成 22 部分。对于每个部分,我确定样本的最大值、最小值、平均值、标准偏差和最大最小值。我采取这种方法的原因是因为“蝙蝠信号”在音频可视化中确实清楚地显示为非高振幅信号。通过分析音频信号的不同部分,我可以发现信号的多个部分是否具有某些特征(如高标准偏差),从而检测到蝙蝠的叫声。
在[4]中:
WINDOW_WIDTH = 10
AUDIO_WINDOW_WIDTH = 1000 # With sampling rate of 22050 we get 22 samples for our second of audio
def audio_to_metadata(audio):
""" Takes windows of audio data, per window it takes the max value, min value, mean and stdev values"""
features = []
for start in range(0,len(audio)-AUDIO_WINDOW_WIDTH,AUDIO_WINDOW_WIDTH):
subpart = audio[start:start+AUDIO_WINDOW_WIDTH]
maxval = max(subpart)
minval = min(subpart)
mean = np.mean(subpart)
stdev = np.std(subpart)
features.extend([maxval,minval,mean,stdev,maxval-minval])
return features
metadata = audio_to_metadata(batsounds[0])
print(metadata)
print(len(metadata))[0.00088500977, -0.00076293945, 6.7962646e-05, 0.00010915515, 0.0016479492, 0.0002746582, 3.0517578e-05, 0.00017904663, 5.4772983e-05, 0.00024414062, 0.00057983398, -0.00057983398, -2.8137207e-05, 8.1624778e-05, 0.001159668, -9.1552734e-05, -0.0002746582, -0.00019345093, 3.922523e-05, 0.00018310547, 0.00048828125, -0.00076293945, -0.00036187744, 0.00015121402, 0.0012512207, -3.0517578e-05, -0.00057983398, -0.00027001952, 0.00015006117, 0.00054931641, 0.00045776367, -0.00036621094, 5.9234619e-05, 5.0381914e-05, 0.00082397461, 0.00015258789, 6.1035156e-05, 0.00011447143, 1.7610495e-05, 9.1552734e-05, 0.00015258789, 6.1035156e-05, 9.3963623e-05, 1.8880468e-05, 9.1552734e-05, 0.00082397461, -0.00048828125, 7.7423094e-05, 8.6975793e-05, 0.0013122559, 0.00021362305, 6.1035156e-05, 0.00014205933, 2.5201958e-05, 0.00015258789, 0.00054931641, -0.00061035156, 2.8991699e-05, 9.5112577e-05, 0.001159668, -3.0517578e-05, -0.00018310547, -0.00010638428, 2.9584806e-05, 0.00015258789, 3.0517578e-05, -9.1552734e-05, -2.7862548e-05, 2.323009e-05, 0.00012207031, 6.1035156e-05, -3.0517578e-05, 1.8341065e-05, 1.905331e-05, 9.1552734e-05, 0.00018310547, -0.00039672852, 4.9438477e-05, 4.7997077e-05, 0.00057983398, 0.00021362305, 9.1552734e-05, 0.00017184448, 2.1811828e-05, 0.00012207031, 0.00015258789, -6.1035156e-05, 5.0659179e-05, 4.6846228e-05, 0.00021362305, 0.0, -0.00015258789, -5.4656983e-05, 2.7488175e-05, 0.00015258789, -3.0517578e-05, -0.00012207031, -9.0820315e-05, 1.7085047e-05, 9.1552734e-05, 0.0, -0.00012207031, -7.2296141e-05, 1.917609e-05, 0.00012207031, 0.0, -9.1552734e-05, -4.4189452e-05, 1.8292634e-05, 9.1552734e-05]
110
数据管理
正如每个机器学习项目一样,建立输入输出管道非常重要。我们定义了从声音文件中获取“元数据”的函数:我们可以制作音频频谱图,并简单地从音频数据中提取多个元特征样本。下一步是将我们的预处理函数映射到我们的训练和测试数据。我首先对每个音频样本进行预处理,并将低音和非低音保存在两个不同的列表中。后来我加入了声音和标签。
在这种情况下,我们处理的是少量的“阳性”样本和大量的阴性样本。在这种情况下,将你所有的数据标准化是一个非常好的主意。我的阳性样本可能不同于正态分布,并且很容易被检测到。为此,我使用了 scikit learn sklearn .预处理函数“normalize”。在培训期间,我发现我对标准化和规范化的想法与 scikit 的定义完全相反。在这种情况下,这可能不是一个问题,因为正常化蝙蝠声音可能仍然会产生不同于正常化噪音声音的结果。
在[5]中:
# Meta-feature based batsounds and their labels
preprocessed_batsounds = list()
preprocessed_noisesounds = list()
for sound in batsounds:
expandedsound = audio_to_metadata(sound)
preprocessed_batsounds.append(expandedsound)
for sound in noisesounds:
expandedsound = audio_to_metadata(sound)
preprocessed_noisesounds.append(expandedsound)
labels = [0]*len(preprocessed_noisesounds) + [1]*len(preprocessed_batsounds)
assert len(labels) == len(preprocessed_noisesounds) + len(preprocessed_batsounds)
allsounds = preprocessed_noisesounds + preprocessed_batsounds
allsounds_normalized = normalize(np.array(allsounds),axis=1)
one_hot_labels = keras.utils.to_categorical(labels)
print(allsounds_normalized.shape)
print("Total noise: %d total bat: %d total: %d" % (len(allsounds_normalized), len(preprocessed_batsounds), len(allsounds)))
## Now zip the sounds and labels, shuffle them, and split into a train and testdataset
zipped_data = zip(allsounds_normalized, one_hot_labels)
np.random.shuffle(zipped_data)
random_zipped_data = zipped_data
VALIDATION_PERCENT = 0.8 # use X percent for training, the rest for validation
traindata = random_zipped_data[0:int(VALIDATION_PERCENT*len(random_zipped_data))]
valdata = random_zipped_data[int(VALIDATION_PERCENT*len(random_zipped_data))::]
indata = [x[0] for x in traindata]
outdata = [x[1] for x in traindata]
valin = [x[0] for x in valdata]
valout = [x[1] for x in valdata](1229, 110)
Total noise: 1229 total bat: 96 total: 1229
机器学习模型
为了检测蝙蝠,我决定尝试一个非常简单的具有三个隐藏层的神经网络。由于可训练参数太少,网络只能区分无声和有声。有了太多的可训练参数,网络将很容易在我们拥有的小数据集上过度适应。
我决定在 Keras 中实现这个网络,这个库给了我最好的函数,让我可以很容易地在这个简单的问题上尝试不同的神经网络架构。
在[6]中:
LEN_SOUND = len(preprocessed_batsounds[0])
NUM_CLASSES = 2 # Bat or no bat
model = Sequential()
model.add(Dense(128, activation='relu',input_shape=(LEN_SOUND,)))
model.add(Dense(32, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(2))
model.compile(loss="mean_squared_error", optimizer='adam', metrics=['mae','accuracy'])
model.summary()
model.fit(np.array(indata), np.array(outdata), batch_size=64, epochs=10,verbose=2, shuffle=True)
valresults = model.evaluate(np.array(valin), np.array(valout), verbose=0)
res_and_name = zip(valresults, model.metrics_names)
for result,name in res_and_name:
print("Validation " + name + ": " + str(result))_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 128) 14208
_________________________________________________________________
dense_2 (Dense) (None, 32) 4128
_________________________________________________________________
dense_3 (Dense) (None, 32) 1056
_________________________________________________________________
dense_4 (Dense) (None, 2) 66
=================================================================
Total params: 19,458
Trainable params: 19,458
Non-trainable params: 0
_________________________________________________________________
Epoch 1/10
0s - loss: 0.2835 - mean_absolute_error: 0.4101 - acc: 0.9237
Epoch 2/10
0s - loss: 0.0743 - mean_absolute_error: 0.1625 - acc: 0.9237
Epoch 3/10
0s - loss: 0.0599 - mean_absolute_error: 0.1270 - acc: 0.9237
Epoch 4/10
0s - loss: 0.0554 - mean_absolute_error: 0.1116 - acc: 0.9237
Epoch 5/10
0s - loss: 0.0524 - mean_absolute_error: 0.1071 - acc: 0.9237
Epoch 6/10
0s - loss: 0.0484 - mean_absolute_error: 0.1024 - acc: 0.9237
Epoch 7/10
0s - loss: 0.0436 - mean_absolute_error: 0.1036 - acc: 0.9329
Epoch 8/10
0s - loss: 0.0375 - mean_absolute_error: 0.0983 - acc: 0.9481
Epoch 9/10
0s - loss: 0.0327 - mean_absolute_error: 0.0923 - acc: 0.9624
Epoch 10/10
0s - loss: 0.0290 - mean_absolute_error: 0.0869 - acc: 0.9644
Validation loss: 0.0440898474639
Validation mean_absolute_error: 0.101937913192
Validation acc: 0.930894308458
检测流水线的结果和实现
验证集的准确率达到了 95 %,看起来我们做得非常好。下一步是检查我们是否能在一段我们从未处理过的更长的音频中找到蝙蝠。我在蝙蝠几乎消失后录了一段录音,让我们看看是否能找到什么:
在[7]中:
soundarray, sr = librosa.load("batsounds/bats9.m4a")
maxseconds = int(len(soundarray)/sr)
for second in range(maxseconds-1):
audiosample = np.array(soundarray[second*sr:(second+1)*sr])
metadata = audio_to_metadata(audiosample)
testinput = normalize(np.array([metadata]),axis=1)
prediction = model.predict(testinput)
if np.argmax(prediction) ==1:
IPython.display.display(IPython.display.Audio(audiosample, rate=sr,autoplay=True))
time.sleep(2)
print("Detected a bat at " + str(second) + " out of " + str(maxseconds) + " seconds")
print(prediction)
您的浏览器不支持音频元素。
Detected a bat at 514 out of 669 seconds
[[ 0.45205975 0.50231218]]
结论,以及类似项目
最后,在 26 分钟的音频中,我的传感器每次检测到 1 只蝙蝠,而外面可能没有蝙蝠(但我无法证实这一点)。我会断定我的程序有效!现在,我们能够将这个程序集成到一个小管道中,以便每当外面有蝙蝠时向我发出警告,或者我们可以每天进行记录,并每天测量蝙蝠的活动。
在这个项目中,自然智能城市项目创造了 T2 蝙蝠伦敦项目。通过传感器你可以看到蝙蝠的活动。同样有趣的是,它们的传感器能够捕捉更有趣的声音,比如蝙蝠发出的社交叫声。很高兴看到其他人也对这一主题感兴趣,并且可以比较不同的方法。bats London 项目建造了漂亮的盒子,里面有一台计算机,它根据光谱图进行所有的处理。他们使用基于 3 秒声音文件的卷积神经网络,每 6 秒记录一次。将来他们甚至想开始区分不同种类的蝙蝠!他们在一个非常有趣的项目上做得非常好!
利用深度学习检测乳腺癌
原文:https://towardsdatascience.com/detecting-breast-cancer-with-a-deep-learning-10a20ff229e7?source=collection_archive---------7-----------------------
乳腺癌是女性中最常见的侵袭性癌症,是仅次于肺癌的女性癌症死亡的第二大原因。在本文中,我将构建一个基于 WideResNet 的神经网络,将幻灯片图像分为两类,一类包含乳腺癌,另一类不使用深度学习工作室(hTTP://Deep cognition . ai/)
浸润性导管癌(IDC)也称为浸润性导管癌,是最常见的乳腺癌类型。美国癌症协会估计美国每年有超过 180,000 名女性发现她们患有浸润性乳腺癌。这些癌症中的大多数被诊断为 IDC。
准确识别和分类乳腺癌亚型是一项重要的任务。基于人工智能的自动化方法可以显著节省时间并减少错误。
在这篇文章中,我将使用深度学习工作室构建一个基于 WideResNet 的神经网络,将幻灯片图像分为两类,一类包含乳腺癌,另一类不包含乳腺癌。
如果你不熟悉深度学习,看看这个:)
[## 深度学习的“怪异”介绍
有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。
towardsdatascience.com](/a-weird-introduction-to-deep-learning-7828803693b0)
如果你想了解更多关于深层认知的知识,请看这个:
[## 深度认知让深度学习变得简单
在过去的一个月里,我有幸见到了 DeepCognition.ai 的创始人
becominghuman.ai](https://becominghuman.ai/deep-learning-made-easy-with-deep-cognition-403fbe445351)
关于数据集
俄亥俄州克利夫兰凯斯西储大学的研究人员收集了这个问题的数据集。原始数据集在这里(编辑:原始链接不再工作,从 Kaggle 下载)。这个数据集是在 Kaggle 由善良的人预处理的,这是我们工作的起点。
Each slide approximately yields 1700 images of 50x50 patches
数据集中有 162 张完整的载玻片图像。这些幻灯片是以 40 倍的分辨率扫描的。最后,这些幻灯片被分成 275,215 个 50x50 像素的小块。然后将 0 或 1 的一个标签分配给这些补丁中的每一个。对于包含 IDC 的修补程序,标签为 1,不包含 IDC 的修补程序标签为 0。
3 Example of positive and negative IDC tissue. https://doi.org/10.1117/12.2043872
用宽网分类载玻片
使用剩余连接的 ResNet 体系结构在图像分类任务中非常成功。WideResNet 架构表明,可以用小得多的深度(小至 16 层)实现类似的性能。这有助于解决与非常深的结果相关的各种问题,如爆炸/消失梯度和退化。
利用文森特·冯和 T2 博客中的大量信息,我们可以对 ResNet 实际上在做什么有一些直觉。
ResNet 的核心思想是引入所谓的“身份快捷连接”,跳过一层或多层。
Residual Block
该论文的最初作者假设,让堆叠层拟合残差映射比让它们直接拟合所需的底层映射更容易。这表明较深的模型不应该比其较浅的模型产生更高的训练误差。
由于其引人注目的结果,ResNet 很快成为各种计算机视觉任务中最受欢迎的架构之一。
现在,一个宽网的存在是有原因的:每提高百分之一的精度都要花费近两倍的层数,因此训练非常深的残差网络有一个减少特征重用的问题,这使得这些网络训练非常慢。
https://dl.acm.org/citation.cfm?doid=2988450.2988454
为了解决这些问题 Zagoruyko 和 Komodakis 对 ResNet 块的架构进行了详细的实验研究(于 2016 年发表),基于此,他们提出了一种新的架构,其中我们减少了深度,增加了剩余网络的宽度。他们称之为广泛残留网络。
现在,我们将展示使用 WideResNet 架构解决此问题的逐步过程。我们正在使用深度学习工作室,它允许我们快速构建神经网络,而无需担心编码、语法和数据集摄取。
1。项目创建
当你登录到运行在本地或云中的深度学习工作室后,点击+按钮创建一个新项目。
2。数据集摄入
然后,我们在“数据”选项卡中为此项目设置数据集。通常 80% — 20%是训练和验证之间的一个很好的划分,但是如果您愿意,也可以使用其他设置。另外,如果你的机器有足够的内存来在内存中加载完整的数据集,不要忘记将内存中的加载数据集设置为“完整的数据集”。
3。创建神经网络
您可以通过拖放层来创建如下所示的神经网络。
确保在右侧的属性中将 WideResNet 设置为 100%可训练。此外,第一密集层(Dense_3)应该具有 20 个左右的具有 ReLU 作为激活功能的神经元。最终密集层(Dense_1)的输出维度应为 1,激活为 sigmoid。这是因为我们把这个问题设定为回归而不是分类。如果回归输出低于 0.5,那么我们可以说输入属于 0 类(无 IDC 癌症),否则它有 IDC 癌症。
4。 超参数和训练
我们使用的超参数如下所示。请随意更改并尝试它们。
最后,您可以从“培训”选项卡开始培训,并使用培训仪表板监控进度。
完成培训后,您可以在“结果”选项卡中查看结果。我们在一个 K80 GPU 上花了几个小时实现了超过 85%的准确率,这个 GPU 的价格大约是每小时 0.90 美元。
通过将 Deep Learning Studio 部署为 webapp 或 REST API,可以使用如下所示的部署选项卡轻松完成。
5.部署模型
部署的模型可以作为 WebApp 或 REST API 访问,如下所示:
结束语
所以你可以看到,使用 Deep Learning Studio,可以在几分钟内建立深度学习模型,并在几秒钟内部署。这种能力将使许多开发人员能够处理复杂的问题,而不用担心编码、API 等问题。
我在这里重复一下我在“深度认知使深度学习变得容易”博客中关于“黑箱问题”的话:
你脑海中会出现的事情是:好吧,我在做深度学习,但我不知道怎么做。
实际上你可以下载产生预测的代码,你会看到它是用 Keras 写的。然后,您可以上传代码,并用系统提供的笔记本进行测试。
AutoML 特性和 GUI 拥有 Keras 和其他 DL 框架的精华,只需简单的点击,它的好处是为您选择 DL 的最佳实践,如果您对这些选择不完全满意,您可以在 UI 中轻松更改它们,或者与笔记本进行交互。
这个系统建立的前提是让人工智能对每个人来说都很容易,当创建这个复杂的模型时,你不必成为专家,但我的建议是,你对自己正在做的事情有一个想法是好的,阅读一些 TensorFlow 或 Keras 文档,观看一些视频并获得信息。如果你是这方面的专家,那太好了!这将使你的生活更容易,你仍然可以在构建模型时应用你的专业知识。
感谢深度认知帮我搭建这篇文章:)
感谢你阅读这篇文章。希望你在这里发现了一些有趣的东西:)
如果您有任何问题,请在 twitter 上添加我:
[## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/FavioVaz)
和 LinkedIn:
[## Favio Vázquez —首席数据科学家— OXXO | LinkedIn
查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 15 个工作职位列在…
linkedin.com](http://linkedin.com/in/faviovazquez/)
那里见:)
在为时已晚之前检测数据泄漏
原文:https://towardsdatascience.com/detecting-data-leakage-before-its-too-late-afcfa4ea9f77?source=collection_archive---------7-----------------------
有时候好得难以置信。
更新:我开了一家科技公司。你可以在这里找到更多
在阅读了 Susan Li 的 Expedia 案例研究文章后,我想看看我是否能使用 Mind Foundry 的自动化机器学习平台来重现结果。这些数据可在 Kaggle 上获得,包含酒店预订的客户网络分析信息(对与错)。这个竞赛的目标是预测顾客是否会预订。然而,在清理数据并在 3 分钟的训练后建立我的模型后,我达到了 100%的分类准确率,这立即触发了警报。我是数据泄露的受害者。
在这篇文章中,我们将看到奥达斯是如何拉响警报的,以及我如何在第一时间避免它!
检测泄漏
目标是对客户是否会预订进行分类,因此我在 AuDaS 中启动了一个简单的分类任务,并在达到 100%的准确率后立即触发了一个模型健康警告。
Model Health Warning raised by AuDaS
在进一步检查功能相关性后,我意识到泄漏是由包含与预订相关的$值的总预订列引起的。然后,我返回到 AuDaS 中的数据准备步骤,以排除它,最重要的是,看看是否有任何其他列我应该删除。
Feature Relevance in AuDaS
利用 AuDaS 主动检测数据泄漏
我决定使用 AuDaS 的自动直方图页面来识别完美的预订预测,然后从训练数据中排除。不足为奇的是,总预订量和点击率(无论酒店是否被点击)是预订的强有力的预测因素,因为为了进行预订,我们需要点击,然后链接,然后支付!
在排除总预订量并重新启动分类任务后,我仍然达到了 99%的分类准确率,这使我能够更近距离地观察正在发生的事情。
实际上,因为预订很少,AuDaS 平衡了训练和 10%的验证目的,click bool 列是预订的近乎完美的预测。
利用 AuDaS 进行稳健建模
最后,我决定排除点击来识别预测预订(以及点击)的关键特征,因为这是 Expedia 的主要目标。
分类准确率因此降低到 72%,但 AuDaS 能够识别出一个更细微的预订相关预测指标排名。
所选型号的主要特点是:
- 酒店在搜索结果页面上的位置
- 搜索结果的 A/B 排序方法
- 资产的位置得分和价格
关键外卖
数据科学中的数据泄漏经常会被忽视,这就是为什么拥有发出警告和检测泄漏源的机制非常重要。一旦确定了泄漏,对数据的理解对于解释为什么以及如何导致泄漏是很重要的,以便决定修复泄漏的最佳方式。奥达斯帮助我们避免了一场灾难。
奥达斯
AuDaS 是由 Mind Foundry 开发的自动化数据科学平台,为构建端到端的机器学习解决方案提供了一个强大的框架。该框架有助于识别数据泄漏并及时采取行动。您可以尝试 AuDaS 这里和查看更多演示如下:
团队和资源
Mind Foundry 是牛津大学的一个分支机构,由斯蒂芬·罗伯茨(Stephen Roberts)和迈克尔·奥斯本(Michael Osborne)教授创建,他们在数据分析领域已经工作了 35 年。Mind Foundry 团队由 30 多名世界级的机器学习研究人员和精英软件工程师组成,其中许多人曾是牛津大学的博士后。此外,Mind Foundry 通过其分拆地位,拥有超过 30 名牛津大学机器学习博士的特权。Mind Foundry 是牛津大学的投资组合公司,其投资者包括牛津科学创新、牛津技术与创新基金、、牛津大学创新基金和 Parkwalk Advisors 。
使用深度学习检测面部特征
原文:https://towardsdatascience.com/detecting-facial-features-using-deep-learning-2e23c8660a7a?source=collection_archive---------7-----------------------
也许你想知道如何在实时视频聊天中在人脸上放置有趣的物体或检测情绪?在这里,我将向您展示一种利用深度学习的可能方法,并略读一种较老的方法。
在过去,一项具有挑战性的任务是检测人脸及其特征,如眼睛、鼻子、嘴巴,甚至从它们的形状中提取情感。这项任务现在可以通过深度学习“神奇地”解决,任何有天赋的青少年都可以在几个小时内完成。我将在这篇文章中向你展示这样一种方法。
【古典】法(CLM)
如果你像我一样,需要执行面部跟踪(在我的情况下,将一个人的手势从网络摄像头转移到动画角色),你可能会发现,最好的执行算法之一曾经是受约束的本地模型(【CLM】),例如由剑桥面部跟踪器或其更新的 OpenFace 化身实现。这是基于将检测任务分成检测形状向量特征( ASM )和小块图像模板( AAM ),并使用预训练的线性 SVM 来改进检测。
它的工作原理是首先粗略估计关键点的位置,然后对包含面部部分的预训练图像应用 SVM,并调整关键点的位置。重复这一过程,直到误差对于我们的目的来说足够低。此外,值得一提的是,它假设图像上的人脸位置已经被估计,例如通过使用 Viola-Jones 检测器 ( Haar cascades )。然而,CLM 过程是相当复杂和重要的,肯定不会由一个高中巫师来实现。您可以在这里看到整体架构:
Well, fairly complicated, right?
深度学习
相反,我们可以使用一个非常简单的卷积神经网络( CNN )并在我们预期包含人脸的图像部分上执行关键点检测。为此,我们需要一个训练数据集;我们可以使用由 Kaggle 为他们的面部关键点检测挑战提供的一个,包含 15 个关键点,或者一个更复杂的 MUCT 数据集包含 76 个关键点(耶!).
显然,拥有高质量的训练数据集在这里是必不可少的,我们都应该纪念那些不得不牺牲他们的时间和精力来注释一堆人脸以获准毕业的贫困本科生,这样我们就可以轻松地表演这些神奇的把戏。
下面是一张巴洛克风格的脸和它在 Kaggle 数据集中的关键点的样子:
James Madison Jr.
数据集包含分辨率为 96x96 的灰度图像和 15 个关键点,每只眼睛 5 个,嘴/鼻子位置 5 个。
对于任意图像,我们首先需要检测图像中人脸的位置;可以使用前面提到的基于哈尔级联的 Viola-Jones 检测器(如果你看看它是如何工作的,它有点像 CNN)。或者,如果你更有冒险精神,你也可以使用全卷积网络( FCN )和深度估计来执行图像分割。
OpenCV does the trick
无论如何,使用 OpenCV 是小菜一碟:
Grayscale_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)bounding_boxes = face_cascade.detectMultiScale(grayscale_image, 1.25, 6)
这段代码返回图像上所有可能的人脸包围盒。
接下来,对于 Viola-Jones 返回的每个边界框,我们提取相应的子图像,将其转换为灰度,并将其大小调整为 96x96。它们将成为我们最终的 CNN 的输入,用于推理。
CNN 架构超级猥琐;一堆 5×5 卷积层(实际上是 3 层,每层有 24、36 和 48 个滤波器),然后是另外 2 层 3×3 卷积层(每层 64 个滤波器),最后是 3 个全连接层(有 500、90 和 30 个节点)。一些防止过度拟合的最大池和减少展平参数数量的全局平均池。输出将是 30 个浮点数,表示 15 个关键点的 x,y 坐标序列。
下面是在 Keras 中的实现:
model = Sequential()model.add(BatchNormalization(input_shape=(96, 96, 1)))model.add(Convolution2D(24, 5, 5, border_mode=”same”, init=’he_normal’, input_shape=(96, 96, 1), dim_ordering=”tf”))
model.add(Activation(“relu”))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), border_mode=”valid”))model.add(Convolution2D(36, 5, 5))
model.add(Activation(“relu”))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), border_mode=”valid”))model.add(Convolution2D(48, 5, 5))
model.add(Activation(“relu”))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), border_mode=”valid”))model.add(Convolution2D(64, 3, 3))
model.add(Activation(“relu”))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2), border_mode=”valid”))model.add(Convolution2D(64, 3, 3))
model.add(Activation(“relu”))model.add(GlobalAveragePooling2D());model.add(Dense(500, activation=”relu”))
model.add(Dense(90, activation=”relu”))
model.add(Dense(30))
您可能希望选择[均方根传播](http://Root Mean Square Propagation) (rmsprop)优化器和均方误差 (MSE)作为您的损失函数和精度指标。
仅仅通过一些琐碎的技巧,如对输入图像的批量归一化,全局平均池以及正常权重初始化,你可以在大约 30 个训练时期获得 80-90%的验证准确率和损失< 0.001:
model.compile(optimizer=’rmsprop’, loss=’mse’, metrics=[‘accuracy’])checkpointer = ModelCheckpoint(filepath=’face_model.h5', verbose=1, save_best_only=True)epochs = 30hist = model.fit(X_train, y_train, validation_split=0.2, shuffle=True, epochs=epochs, batch_size=20, callbacks=[checkpointer], verbose=1)
然后,要预测关键点的位置,只需运行:
features = model.predict(region, batch_size=1)
就这样。你现在已经掌握了检测面部关键点的艺术!
请注意,预测的结果将是每个关键点的 15 对 x,y 坐标,顺序如下图所示:
Saving you some time…
如果你想做得更好,你可能需要做一些额外的功课:
- 尝试如何减少卷积层数和滤波器尺寸,同时保持准确性并提高推断速度
- 用迁移学习代替卷积部分(例外是我的最爱)
- 使用更详细的数据集
- 做一些先进的图像增强,以提高鲁棒性
你可能会发现这一切都太容易了;如果你想要一个挑战,那就转向 3D,看看脸书和英伟达是如何追踪人脸的。
显然,你可以使用这种新学到的魔法来完成一些你一直想做但不知道如何做的重要事情:
- 在视频聊天时,在脸上放置令人讨厌的物体,如太阳镜、怪异的帽子、胡子等。
- 在朋友、敌人、动物和物品之间交换面孔
- 通过允许在自拍实时视频上测试新发型、珠宝或化妆品,增加了人们的虚荣心
- 检测您的员工是否喝得太醉(或不够醉)而无法执行分配的任务
- 如果出于某种奇怪的原因,你想自动处理情绪,就要识别视频中人们的主要情绪
- 使用 GANs 进行实时面部到卡通的转换,并根据网络摄像头上你自己的面部弯曲卡通面部,以模仿你的动作、说话和情绪
现在你知道如何制作自己的视频聊天过滤器了吧!现在就写一个怎么样?
用机器学习检测财务报表欺诈
原文:https://towardsdatascience.com/detecting-firms-with-intentional-misstatements-using-machine-learning-a943191f88cf?source=collection_archive---------14-----------------------
了解机器学习如何检测会计欺诈
Photo by M. B. M. on Unsplash
查明扭曲财务报表的公司仍然被审计人员视为一项挑战,因为多年来欺诈手段变得越来越复杂——通过其他实体隐瞒损失,过早确认收入,甚至让未注册的审计人员声称财务报表真实、公平。
最近,我完成了一个机器学习项目,根据 2005-2009 年的历史数据来识别 2010 年有故意错报的美国公司。
我认为分享这个数据科学项目的方法和关键学习点会很有趣,如果你想了解更多,请继续阅读。
详细讨论的关键步骤概述:
- 特征工程
- 探索性数据分析
- 特征选择采用 t 检验和卡方检验
- 模型选择与实现
- 随机搜索 CV 模型的微调
- 模型评估
- 模型解释
第一步:特征工程
在这个项目中,第一个挑战是完全没有提供任何功能,不像大多数的 Kaggle 比赛都有训练数据。我们唯一的属性是公司识别码、年份以及该公司在该年是否实施了金融服务欺诈。
特征工程是每个数据科学项目的关键步骤,数据科学家在特征工程上花费大量的时间来创建有意义的特征,以捕捉正在观察的现象的特征。没有高质量的数据,最复杂的机器学习算法将无法胜过具有高质量特征的简单模型。
你会问,我们如何找到可以训练的功能?
- 阅读研究论文:有趣的是,这个主题被其他研究者广泛撰写——德绍(2011) 和 BCE(2018)
- 通过问正确的问题来集思广益
利用过去的研究论文
依靠过去的研究论文,如 Dechow(2011) 和 BCE(2018) 非常有助于理解可以提取实施会计欺诈的公司特征的特征类型。
以下是这些研究论文中探索的一些不同类型的变量:
- 捕捉公司财务活动的财务变量:例如,应收账款的变化、存货的变化、账面市值比以及公司是否进行了重组
- 文本风格特征捕捉财务报表的可读性、长度、语气和用词
- 捕捉业务性质的特征:例如,公司是在零售、服务还是计算机行业
将这两篇研究论文的显著特征包括在我们的初始 Lasso 模型中,R 仅能够实现 0.64 的样本外 AUC 得分,这表明该模型仅能够在 64%的时间内正确预测目标。
利用领域知识进行头脑风暴
很明显,我们需要更多的特征工程,然后问自己,如果我们是审计师、内部审计师、监管者和投资者,我们如何通过利用任何数据来发现存在故意错报的公司?假设您可以获得任何数据,您会为模型添加哪些功能。经过一番头脑风暴,我们想出了一些可能的变量:
- 审计师将有权访问重大错报的领域/数量、管理审查点的数量、审计师意见、行业以及该行业是否为高风险行业。
- 内部审计员评估公司的内部控制,他们可以得到内部控制强度的分数和内部邮件。一些可能的变量是对内部控制的看法,以及内部电子邮件是否包含表明欺诈的可疑消息。
- 监管机构将有权获得高层管理信息和薪酬详情,一个可能的变量是计算首席执行官或首席财务官的流动率,因为高层管理人员往往会在财务报表操纵期间或监管机构发现欺诈后离开公司。高层管理人员未行使的股票期权的数量也经常与激进的会计方法有关。
- 投资者由于公众可以访问财务报告和股票数据,因此可以关注股价和股票回报的波动性,因为管理层经常操纵财务报表以满足投资者或分析师的预期,从而维持股价。
考虑到可能的变量,我们从 WRDS 数据库中搜索这些变量的可用性,以获得以下变量:
- 审计意见:审计师的意见可能预示着潜在的欺诈案件。例如,反对意见、有保留意见和无保留意见。
- 对内部控制的看法:不良的内部控制增加了舞弊的机会。例如有效、不利和免责。
- 财务报表审计师:某些审计公司可能面临更大的压力,要求其签署存在重大错报的财务报表
- 行业:部分行业易受欺诈打击,且被发现与欺诈案件有关联
- CEO 更替与薪酬:该变量因数据缺失过多而未被使用
- 与股票回报和波动性相关的变量:这个变量后来没有被使用,因为这将限制我们的训练数据集只包含上市公司
第 2 步:数据清理
Photo by pan xiaozhen on Unsplash
将所有变量与给定的包含公司标识符、年份和目标变量的培训数据集合并后。进行探索性数据分析之前,检查缺失数据和重复数据的程度很重要。
- 检查重复项:统计新合并的训练数据帧的行数,并与原始数据帧进行比较,如果有重复项,根据唯一的公司标识进行删除
- 检查缺失数据:使用 R 的 Visdat package 下的 vis_miss 功能将缺失数据可视化,如果缺失数据占训练数据集的 2%以上(具有国际错报的观察结果的百分比占数据集的 2%),我会完全丢弃该变量
第 3 步:通过探索性数据分析获得见解
3.1 了解目标变量的分布:生成目标变量的频率表
从该表中,我们可以看出,由于预测问题的性质,存在不平衡的类分布,因为在整个训练数据集中只有 2%的观察结果包含有意的错报。这是分类问题中的一个常见问题,有几种方法可以处理不平衡的类分布 ns。一些解决方案包括数据集的重采样、生成的合成样本、较少偏向多数类的挑选算法以及惩罚模型。
3.2 识别有助于预测故意错报的变量:可视化所有变量的分布和相对频率
我们绘制了每个连续/分类变量的密度图和条形图,以比较错报公司和非错报公司。为了使本文简短易懂,以下是一些有趣的观察结果:
The mean of log_total_assets for observations where Restate_Int = 1 is approximately 5, while the mean of log_total_assets for observations where Restate_Int = 0 is approximately 6.5.
平均而言,故意错报财务报表的公司被发现具有较低的总资产对数值,而那些没有故意错报财务报表的公司往往具有较高的总资产对数值。看起来小公司可能会扭曲其财务报表。
As seen from the bar chart above, of all observations where Restate_Int = 0, 70% had engaged a Big N auditor for their financial statement audit. This proportion is relatively higher than the 65% of observations where Restate_Int = 1
似乎没有故意错报的事务所更有可能是雇佣了大型审计事务所的事务所。
3.3 绘制相关矩阵,以移除变量之间高度相关的变量
基于相关矩阵,我们发现与财务报表长度相关的变量倾向于彼此相关,可读性变量也是如此。
然后去除高度相关的变量,只保留一个有意义的变量。这也被称为多重共线性的问题。尽管一些机器学习模型(如 tree methods 和 Lasso)能够处理多重共线性,但是,包括高度相关的变量可能会导致算法选择“不太正确”的变量,从而影响模型结果的解释。****
步骤 4:特征选择
特征选择可以通过您自己对问题的了解来完成,或者使用选择模型(Lasso)来自动完成,或者使用简单的相关矩阵来识别与目标变量相关的特征。
最好使用第一种方法,因为使用选择模型来自动化特征选择可能会导致更难解释的结果。
对于该项目,我们对所有连续变量进行了 t 检验,对所有分类变量进行了卡方检验,以确定显著特征。
t-test in R
在 t 检验下,p 值告诉我们公司由于某一特定变量而不是由于随机抽样而不重述其财务报表的概率。因此,如果 p 值低于 0.1,我们拒绝零假设,支持替代方案。
chi-square test in R
而对于卡方检验,p 值告诉我们特征的概率独立于整个群体中的目标。
考虑到 t 检验结果、卡方检验结果和探索性数据分析结果,选择了 32 个特征。
步骤 5:模型选择和实现
有许多机器学习模型可以用来解决这个机器学习问题,列出模型选择的标准是有帮助的。
机器学习算法必须能够:
- 执行监督二元分类:因为预测一家美国公司是否故意错报其财务报表是一个二元分类问题
- 处理不均衡的班级分布
- 接受更大数量的维度
考虑到这些限制,满足这些标准的算法是支持向量机、随机森林和 LASSO。
为了比较所有机器学习模型的模型性能,我们使用了具有五倍 CV 的样本内平均 AUC 分数,以及从 Kaggle 上的公共领导力仪表板获得的样本外 AUC 分数。
在第一轮模型评估中,我们比较了所有用默认超参数训练的机器学习模型的样本外 AUC 得分。R 中的随机森林表现最好(AUC 为 0.68),其次是 Python 中的随机森林(AUC 为 0.65),Lasso (AUC 为 0.63),SVM (AUC 为 0.51)表现最差。
步骤 6:模型的微调
使用默认的超参数,最佳模型能够获得 0.68 的样本外 AUC 分数。为了进一步提高模型性能,我们使用 scikit-learn 软件包中的随机搜索交叉验证功能对随机森林和 SVM 进行了微调。
随机森林模型的超参数调整
超参数调整支持向量分类器模型
点击 查看 Python 中超参数调优的完整实现。
Lasso 不需要超参数调整,因为在 R 的 glmnet 软件包中,Lasso 默认具有内置功能,可以通过交叉验证来选择最佳的 lambda 值。
超参数调整能够将所有模型的 AUC 分数提高约 0.03-0.04。在 R 中训练的随机森林继续以 0.70 的样本外 AUC 胜过其余模型。
在私人领导委员会发布 AUC 分数后,最佳模型是随机森林(Python ),其样本外 AUC 分数为 0.74,因为它在 50%和 100%的测试数据上具有更稳定的 AUC 分数。
AUC 分数 0.74 被认为是可接受的表现,因为该模型有 0.74 的机会能够区分具有故意错报的公司。
步骤 7:模型解释——特征重要性
基于决策树的模型具有特征重要性属性来识别对模型性能贡献最大的特征。有许多方法可以计算特征重要性值,而 scikit-learn 实施了“平均减少杂质”指标,该指标用于测量随机置换变量值后出袋病例的准确性下降。如果准确度的降低很低,则该特征不太重要。
Code to visualize the feature importance in Python
驱动该模型性能的有趣特性包括:
- 财务报表中使用更多的负面词汇表明财务表现不佳,因此操纵账目的压力更大
- 平均每句话字数:该特征衡量财务报表的复杂程度和可读性。难以阅读的财务报表可能表明复杂的会计活动(需要主观判断的会计处理,因此存在更大的操纵风险)或故意措辞,使投资者更难理解以隐藏财务报表操纵
- 软资产百分比:不包括物业、厂房及设备、现金及现金等价物的总资产百分比。应收账款和应收账款是更难核实的账户,因此受到管理层操纵的风险更高
- (Loughran-McDonald 诉讼词比例):包含更多诉讼词的财务报表意味着更大的诉讼风险,因此面临更大的操纵账目的压力
- Tot 融资:杠杆率较高的公司破产风险更大,因此面临更大的操纵账目的压力
- 对内部控制持负面意见的公司有更大的机会操纵账目
最终想法
当我们尝试 Kaggle 竞赛时,通常会给出大多数变量,这并不要求我们从头开始执行特征工程。这个项目通过提出正确的问题让我体会到了特征工程的重要性。
我从这个项目中获得的主要收获是:
- 在功能工程上要有创造性,不要在头脑风暴出可能的功能之前就假设某些功能是不可用的
- 利用过去的研究论文来理解选择某些变量和相关限制的基本原理
- 可用于特征选择和处理不平衡类别分布的技术
- 始终执行超参数调整以提高模型性能
我要感谢我的队友们为这个项目付出的努力,也要感谢我们的教授给予的指导和鼓励。
使用张量流对象检测检测视频中的皮卡丘
原文:https://towardsdatascience.com/detecting-pikachu-in-videos-using-tensorflow-object-detection-cd872ac42c1d?source=collection_archive---------4-----------------------
在 TensorFlow 的众多功能和工具中,有一个名为 TensorFlow 对象检测 API 的组件。顾名思义,这个库的目的是训练一个能够识别帧中对象(例如图像)的神经网络。
在我以前的工作中,在这里找到了,我解释并完成了使用 TensorFlow 包在 Android 设备上检测皮卡丘的过程。此外,我还介绍了该库,讨论了它提供的不同架构和功能,并演示了如何使用 TensorBoard 评估培训过程。
[## 使用 Tensorflow 对象检测在 Android 上检测皮卡丘
本指南解释了如何训练一个对象检测模型,使用皮卡丘作为目标对象,目的是…
towardsdatascience.com](/detecting-pikachu-on-android-using-tensorflow-object-detection-15464c7a60cd)
继续向前,几个月后,我承担了改进我之前训练的皮卡丘检测模型的任务,目的是使用 Python、 OpenCV ,当然还有 TensorFlow 对象检测,直接从视频中检测它们。代码可以在我的 GitHub 上找到:https://github.com/juandes/pikachu-detection
Pikachu
这篇文章讲述了我实现这一目标的步骤。首先,我将陈述我在最初的模型中注意到的问题,以及我做了什么来改进它们。然后,我将继续描述如何通过使用这个新的和改进的模型,我建立了一个视频检测系统。最后,您将能够看到两个视频,其中有几个皮卡丘检测。
但在我们开始之前,这里有一个简短的 gif 展示了一些快速检测。
Pikachu being detected
That’s Pikachu
模型的改进
如前所述,在之前的工作中,我做了皮卡丘检测模型的原始训练,目标是在 Android 设备和 Python 笔记本上使用它。然而,我对模型的表现并不完全满意,这一事实激励并驱使我改进这个系统,因此,我写了这篇文章。
我主要关心的是我用来构建系统的皮卡丘图像的数量,有 230 个。其中,约 70%用于培训,其余 30%用于测试,因此用于培训的不多。虽然这在技术上不是问题(因为模特正在表演“okayish”),但我向训练集添加了 70 多张照片(不是很多,但总比没有好)。
结果,因为现在我有了更多的图像,我不得不扩展模型的训练。我没有从头开始重新训练,而是使用我早期模型的训练检查点,并从那里继续;前者在 15000 个历元训练,新的在 20000 个历元训练。接下来的两幅图显示了总损耗和精度(取自 tensor board);很容易注意到,从公元 15000 年到公元 20000 年没有太大的变化(特别是在损失方面)。
Plot of loss
Plot of precision
我做的最后一个(也是很小的)修正是修改 Android 应用程序的检测阈值。默认值为 0.6,增加到 0.85。
这些改进改变了什么吗?即使抛开我的确认偏见,我也会说,是的。我注意到一个微小的改善。我注意到的最大变化是,由于物体看起来像一个黄色斑点,Android 应用程序中的误报数量减少了;当然,这可能是因为门槛提高了。
现在,有了一个最新的(希望是)改进的模型,我准备用它来检测视频中的皮卡丘。在继续之前,我想提一下,我将跳过冻结和导入模型的整个过程,因为这在我早期的工作中已经解决了。
视频检测
从视频中执行对象检测并不像听起来那么困难或复杂。通俗地说,我们可以说视频是遵循一个序列的图像的集合,因此检测过程相当类似于从正常图像中检测。为什么相当相似?由于视频的性质,在将视频输入检测模型之前,需要解决几个预处理和帧准备的步骤。在接下来的几行中,我将解释这一点,加上我执行检测所遵循的过程,以及我如何创建一个新的视频来显示它们。
我的大部分代码都是基于 TensorFlow 对象检测 repo 中提供的一个 Python 笔记本;这段代码完成了大部分艰苦的工作,因为它包含了许多简化检测过程的函数。另外,我建议你看看我的剧本,并以此作为你阅读以下段落的指南。
从高层次的角度来看,我编写的代码有三个主要任务:
加载资源
首先,必须加载冻结的模型、数据标签和视频。出于简单的原因,我推荐一个短的中等大小的视频,因为它可能需要一点时间来处理整个电影。
迭代视频
该脚本的主要功能基于一个循环,该循环遍历视频的每一帧。在每次迭代中,读取一帧并改变其颜色空间。接下来,进行实际的检测过程,以找到所有这些漂亮的黄色鼠兔。因此,将返回皮卡丘所在的边界框的坐标(如果找到的话)和检测的置信度值。随后,将创建该帧的副本,其中包含只要置信度得分高于给定阈值,皮卡丘就应该所在的边界框。对于这个项目,我将置信度阈值设置为非常低的 20%,因为我注意到视频中被检测到的假阳性数量非常少,所以我决定“冒险”一下它的性能,以便有更多的皮卡丘检测。
创建新视频
前一步骤中讨论的携带检测框的帧的所有新创建的副本被用于构建新的视频。为了构建这个视频,需要一个VideoWriter
对象,在前面讨论的循环的每次迭代中,帧的副本将被写入这个对象(没有任何声音)。
结果和讨论
这两个视频展示了模型的表现。
第一段视频的检测结果相当不错。即使皮卡丘在整个视频中一直拿着一个番茄酱瓶子,但模型在大多数场景中都能够检测到它。另一方面,在 0:22 有一个实例没有被检测到,此外,Scyther(绿色螳螂状的东西)打破番茄酱瓶的镜头(0:40 到 0:44)是一个假阳性。
第二个视频中模型的性能不如第一个,主要问题是在帧中有两只鼠兔的场景中。在这种情况下,模型似乎将他们两个检测为皮卡丘,而不是对每个人进行一次检测——一个明显的例子是在 0:13,两只皮卡丘正在互相拍打(悲伤的场景:(,我知道)。
结论和概述
在这篇文章中,我谈到了我们如何使用 TensorFlow 对象检测包来检测视频中的皮卡丘。在开始,我讨论了一些我以前的工作,其中我使用了一个早期版本的模型在 Android 设备上进行检测。这个模型,尽管它在做它的工作,但是有一些问题我想去解决。这些改进让我做了这个项目,并为视频建立了一个检测模型。
新模型按预期工作。当然,这里和那里有一些小问题——这与假阳性有关,皮卡丘没有被检测到——但它做了它必须做的事情。作为未来的工作,我想在我的训练集中添加更多不同角度的皮卡丘图像,例如,侧视图和后视图,以使数据更加多样化,从而获得更好的结果。
感谢阅读。我真的希望这个指南对你们有些人有所帮助。如果你有任何问题,评论,疑问,或者只是想聊天,留下评论,我将很乐意帮助你。
使用 Tensorflow 对象检测在 Android 上检测皮卡丘
原文:https://towardsdatascience.com/detecting-pikachu-on-android-using-tensorflow-object-detection-15464c7a60cd?source=collection_archive---------2-----------------------
在 TensorFlow 的众多功能和工具的深处,隐藏着一个名为 TensorFlow 对象检测 API 的组件。顾名思义,这个库的目的是训练一个能够识别帧中对象(例如图像)的神经网络。
这个库的用例和可能性几乎是无限的。它可以被训练来检测图像中的人、猫、汽车、浣熊等等。由于这个原因,我开始有兴趣用自己训练的定制模型自己尝试一下。我的用例是什么?检测皮卡丘。
Pikachu
本文的目的是描述我训练自己的自定义对象检测模型所遵循的步骤,并展示我的皮卡丘检测技能,以便您可以自己尝试。首先,我将通过总结原始文件中解释的一些细节来介绍这个包。其次,我将继续讲述如何将我的皮卡丘图片转换成正确的格式并创建数据集。之后我会用 Tensorflow 的 web UI, TensorBoard ,尽可能详细的写训练过程,以及如何评价,以及最终的模型。最后,我将演示如何在 Python 笔记本中使用该模型,以及将其导出到 Android 的过程。
我用于这个项目的代码可以在我的 Github(juandes/pikachu-detection)上获得。本文档中提到的每个脚本都应该在那里可用。
在我开始之前,我确信你们大多数人都很好奇,这是皮卡丘检测的一个例子。
Yep, that’s a Pikachu (screenshot of the detection made on the app)
Tensorflow 对象检测 API
这个包是 TensorFlow 对对象检测问题的回应——即在一帧中检测真实世界对象(或皮卡丘)的过程。根据文档和介绍该库的论文,它的独特之处在于它能够以准确性换取速度和内存使用(反之亦然),因此你可以调整模型以适应你的需求和你选择的平台,如手机。该库包括许多开箱即用的对象检测架构,如 SSD (单次检测器)更快的 R-CNN (更快的基于区域的卷积神经网络) R-FCN (基于区域的完全卷积网络),以及几个特征提取器,如 MobileNet 、 Inception 、Resnet;这些提取器非常重要,因为它们在系统的速度/性能权衡中起着重要作用。
此外,该库还提供了几个已经训练好的模型,准备用于检测,在 Google Cloud 中训练的选项,加上 TensorBoard 的支持,以监控训练。
现在我们已经对这个实验所使用的系统有了一些了解,我将继续解释如何构建您自己的定制模型。
构建您自己的定制模型
装置
在我们开始之前,请确保您的计算机上安装了 TensorFlow。否则,请参见此处的说明了解如何安装。接下来,克隆包含对象检测 API 的 repo。这是链接:https://github.com/tensorflow/models。
一旦您克隆了回购,导航到“研究”目录并执行:
# From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.
这将编译 Protobuf 库。如果你没有安装 Protobuf,可以从这里下载:https://developers . Google . com/protocol-buffers/docs/downloads
最后,您需要将库添加到PYTHONPATH
中。这可以通过执行以下命令来实现:
# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
有关所需的所有依赖项的更多详细信息,请参见官方文档,可从以下位置获得:https://github . com/tensor flow/models/blob/master/research/object _ detection/g3doc/installation . MD
现在,让我们看看我是如何从拥有许多皮卡丘图像变成 TensorFlow 可读的漂亮整洁的数据集的。
创建数据集和处理图像
创建数据集是成功定型模型所需的许多步骤中的第一步,在本节中,我将介绍完成此任务所需的所有步骤。
为了这个项目,我将 230 张中型皮卡丘的图片下载到一个名为 images 的目录中。为了获得更好的效果,我试图获得不同角度和形状的皮卡丘,但老实说,皮卡丘是一种不存在的黄色长耳朵老鼠,所以要找到它的大量图像有点困难。
Some of the images used
一旦你获得了所有的图像,下一步就是给它们贴标签。这是什么意思?因为我们在做物体检测,我们需要一个物体到底是什么的基本事实。为此,我们需要在对象周围绘制一个边界框,让系统知道框内的这个“东西”就是我们想要学习的实际对象。我做这个任务用的软件是一个叫 RectLabel 的 Mac app。
这是带有边框的图像的外观:
Image of an angry Pikachu surrounded by a bounding box
在 RectLabel 中,您需要为图像的每个边界框设置一个标签,在我的例子中,标签是“Pikachu”。一旦您标记了所有的图像,您会注意到您有一个名为“ annotations ”的目录,其中有许多描述每个图像的边界框的 XML 文件。
分成训练和测试数据集
一旦所有的图像都被标记,我的下一步就是将数据集分成训练和测试数据集。在图像所在的同一个目录中,我创建了一个名为" train 和" test "的目录,并将大约 70%的图像及其各自的 XML 添加到训练目录中,剩余的 30%添加到测试目录中。
生成 TFRECORD
分离数据集之后,唯一缺少的就是将我们的图像及其 XML 转换成 TensorFlow 可读的格式。所述格式被称为“ tfrecord ”,为了从我们的图像中生成它,需要两个步骤。首先,为了简单起见,使用 datitran 的GitHub(https://github.com/datitran/raccoon_dataset)上提供的xml_to_csv.py
代码的修改版本,将来自两组 XML 的数据(训练和测试)转换成两个 CSV 文件(同样,训练和测试)。然后,使用 CSV 文件,使用脚本generate_tfrecord.py
(也来自 datitran)创建 tfrecord 数据集。请记住,在运行脚本之前,您必须在函数class_text_to_int
中指定对象的类别。
*** EDIT**(23 . 01 . 17):Will Brickner报告称xml_to_csv.py
在最新版本的 RectLabel 上无法正常工作,他编写了一个更加健壮的新脚本。这里有:https://gist . github . com/wbrickner/efed F8 ab 0 ce 1705 de 1372 C1 e2f 49 DD 98多谢:)
创建标签映射
需要一张“标签图,标明标签及其索引。这是它们的样子。
item {
id: 1
name: 'Pikachu'
}
把“皮卡丘”标签换成你的,重要的是,总是从索引1
开始,因为0
是保留的。我把这个文件作为object-detection.pbtxt
保存在一个名为培训的新目录下。
训练模型
管道
完整的训练过程由一个名为“ 管道 ”的配置文件处理。所述管道被分成五个主要结构,它们负责定义模型、训练和评估过程参数以及训练和评估数据集输入。管道的骨架看起来像这样:
model {
(... Add model config here...)
}
train_config : {
(... Add train_config here...)
}
train_input_reader: {
(... Add train_input configuration here...)
}
eval_config: {
}
eval_input_reader: {
(... Add eval_input configuration here...)
}
但是!您不必从头开始编写整个管道。事实上,TensorFlow 开发人员建议培训应该使用他们自己已经培训过的模型作为起点。这背后的原因是从头开始训练一个全新的模型可能需要相当长的时间。因此,TensorFlow 为提供了几个配置文件,这些文件只需要很少的修改就可以在新的训练环境中工作。我用的型号是ssd_mobilenet_v1_coco_11_06_2017
发现这里。
在我的训练中,我使用配置文件[ssd_mobilenet_v1_pets.config](https://github.com/tensorflow/models/blob/master/research/object_detection/samples/configs/ssd_mobilenet_v1_pets.config)
作为起点。我对变量num_classes
做了更改,因为我的类数只有一个,num_steps
用于提前停止训练,fine_tune_checkpoint
指向模型下载的位置,train_input_reader
和eval_input_reader
的input_path
和label_map_path
变量指向训练和测试数据集以及标签映射。
我不会仔细检查配置文件的每一个细节,因为老实说,我不理解它的某些部分,因为它太大了。不过,我想解释一下 SSD 和 MobileNet 是什么意思,这样你就可以对幕后发生的事情有一点了解。
SSD ,代表单发探测器,是一种神经网络架构,基于单前馈卷积神经网络。它被称为“单次拍摄”,因为它预测了图像的类别和在同一步骤中代表检测(称为锚点)的方框的位置。与此相反的是一种架构,它需要称为“提议生成器”的第二个组件来预测盒子的确切位置。
MobileNet 是一个卷积特征提取器,设计用于移动设备,用于获取图像的高层特征。
准备好管道后,将其添加到“培训目录中。然后,使用以下命令开始训练:
python object_detection/train.py --logtostderr
--train_dir=path/to/training/
--pipeline_config_path=path/to/training/ssd_mobilenet_v1_pets.config
培训期间和培训后评估模型
这个库提供了在训练期间和之后评估模型所需的代码。每次训练产生一个新的检查点时,评估工具将使用给定目录中可用的图像执行预测(在我的例子中,我使用了来自测试集的图像)。
要运行评估工具,请执行以下命令:
python object_detection/eval.py --logtostderr
--train_dir=path/to/training/
--pipeline_config_path=path/to/training/ssd_mobilenet_v1_pets.config
--checkpoint_dir=path/to/training/ --eval_dir=path/to/training/
张量板
使用 TensorFlow 的可视化平台 TensorBoard 可以看到培训和评估阶段的结果。在这里,我们可以监控几个指标,如训练时间、总损耗、步数等等。真正酷的是 TensorBoard 还可以在模型被训练时工作,这使它成为一个确保训练朝着正确方向前进的伟大工具。
要执行 TensorBoard,请运行以下命令:
tensorboard --logdir=path/to/training/
导出模型
训练完成后,下一步是导出模型以便使用。这个库提供了执行这个步骤所需的脚本,名为export_inference_graph.py
。
在导出之前,请确保培训目录中有以下文件:
model.ckpt-${CHECKPOINT_NUMBER}.data-00000-of-00001,
model.ckpt-${CHECKPOINT_NUMBER}.index
model.ckpt-${CHECKPOINT_NUMBER}.meta
您可能有几个格式相同但检查点编号不同的文件。因此,只需选择所需的检查点,并执行以下命令:
python object_detection/export_inference_graph.py --input_type image_tensor --pipeline_config_path=path/to/training/ssd_mobilenet_v1_pets.config --trained_checkpoint_prefix=path/to/training/model.ckpt-xxxxx --output_directory path/to/output/directory
输出将是一个文件,其中保存了名为frozen_inference_graph.pb
的模型的“冻结”版本。
结果
训练阶段结束时,模型的精度为 87% ,总损耗为 0.67 。但是在训练过程中,模型达到了最大精度 95% 。尽管如此,精度最高的模型并没有我预期的那么好。比如它把很多黄色物体(甚至有些人)归为皮卡丘。另一方面,我注意到精度为 87%的模型产生了更少的误报,代价是错过了一些皮卡丘。下图是 TensorBoard 制作的总损耗和精度图。
Total loss. The light orange line are the actual values; the dark one is a smoothed version
Precision metric
TensorBoard 还会自动评估评估集的一些图像。真正好的是,通过使用滑块,您可以看到预测的可信度如何根据模型的哪个检查点而变化。
More Pikachu. This detection was performed in TensorBoard
图像检测包包括一个笔记本,用于测试 TensorFlow 提供的预训练模型之一。然而,这个笔记本可以被改变以与定制训练模型的冻结版本(我们输出的那个)一起工作,我就是这样做的。下面你可以在笔记本上看到一些检测结果。
Pikachu hitting those weights
Pikachu and lil bro
Humans dressed as Pikachu. Not detected.
检测 Android 中的皮卡丘
到目前为止,我们已经训练、导出了模型,并对其进行了评估。现在是时候将它导入 Android 了,这样我们就可以用它来通过手机的摄像头检测皮卡丘了。现在,这部分有点复杂,让我很头疼,所以我会尽可能详细地解释主要步骤。然而,我真的确信你们中的一些复制这个实验的人会有一些问题,所以如果我的向导不支持你,我想事先道歉。
让我们继续讨论 TensorFlow 的 Android 部分。首先,你需要下载 Android Studio 。一旦你有了它,克隆 TensorFlow repo(你可能已经有了),在 Android Studio 中使用刚刚克隆的 TensorFlow repo 的目录导入一个新项目,名为“ Android ”。作为补充说明,我还建议通读 README 来熟悉一下这个库。
自述文件建议保持最简单的构建,并建议将 Gradle 构建的nativeBuildSystem
变量改为none
,然而,我将其改为cmake
来构建它(其他构建替代方案如 Bazel 和 Makefile 都不适合我)。
当构建完成时,下一步是将冻结的模型添加到资产目录中。然后,同样在那个文件夹中,创建一个名为“ labels ”的文件,在第一行写???
(还记得我说过第一类是保留的吗?),并在第二行写下你的对象的标签(在我的例子中我写了Pikachu
)。
然后,打开位于“ java 目录下名为“DetectionActitivity.java的文件;这是应用程序用来执行检测的代码。查找变量TF_OD_API_MODEL_FILE
和TF_OD_API_LABELS_FILE
,在第一个变量中,将其值更改为位于 assets 文件夹中的冻结模型的路径,在第二个变量中,写入带有标签的文件的路径。你应该知道的另一个有用的变量是MINIMUM_CONFIDENCE_TF_OD_API
,它是跟踪检测所需的最小置信度。试着玩玩吧!
现在我们准备好了!点击运行按钮,选择您的 Android 设备,等待几秒钟,直到应用程序安装到手机上。重要的细节,不是一个,而是四个应用程序,将被安装在手机上,然而,我们包含检测模型的是 TF Detect 。如果一切顺利,应用程序启动,找到一些你的对象的照片,看看模型是否能够检测到它们。
就是这样!快乐检测:)
以下是我在手机里做的一些检测。
My Kimono Pikachu. Straight from Kyoto
Several Pikachu. Noticed how most of them were not detected.
编辑 (05.06.2018):这项工作的延续,检测视频中的皮卡丘,可在此处获得:
[## 使用张量流对象检测检测视频中的皮卡丘
本指南解释了如何使用 TensorFlow 对象检测模型来查找视频中皮卡丘
towardsdatascience.com](/detecting-pikachu-in-videos-using-tensorflow-object-detection-cd872ac42c1d)
结论和概述
在本文中,我解释了使用 TensorFlow 对象检测库训练自定义模型的所有必要步骤。在开始时,我给出了一些关于这个库的背景信息和它是如何工作的,然后是一个关于如何标记和处理图像以生成数据集的指南。之后,我专注于如何进行训练。在这一节中,我谈到了培训管道,如何使用 TensorBoard 评估模型。然后,一旦训练完成,我就在 Python 笔记本和 Android 中经历了导出模型和导入的过程。
这个项目最困难的部分是让模型在 Android 上运行。毫不夸张地说,这花了我大约一个月的时间,因为我得到了大量的错误,(我甚至在 Github 上开了一期),我几乎要放弃了。对我来说,解决问题的方法是在export.py
文件(由export_inference_graph.py
调用)中,将参数optimize_graph
修改为False
。显然,据我所知,通过优化模型,我的模型创建了一些 Android 库无法识别的节点,因此,它崩溃了。我不是说这是一个解决方案,但它可能是你可以尝试的东西,以防它对你不起作用。我的建议是不要放弃,继续尝试,这样你就可以用自己定制的检测系统打动你的朋友。
感谢您的阅读,我真的希望这篇指南能帮助到你们中的一些人。如果你有任何问题,评论,疑问,或者只是想聊天,留下评论,我将很乐意帮助你。
利用 k-均值聚类和 RANSAC 检测故障线路
原文:https://towardsdatascience.com/detecting-the-fault-line-using-k-mean-clustering-and-ransac-9a74cb61bb96?source=collection_archive---------11-----------------------
k 均值聚类和随机样本一致性
Fig. 1- fitted plane from the last blog
在我的上一篇博文中,我使用主成分分析法(PCA)探测了帕克菲尔德附近圣安地列斯断层沿线的断层线。虽然已知断层线在该区域几乎是垂直的,但拟合的平面却相当水平(图 1)。这大概是因为 PCA 对“异常值”非常敏感,因为它是基于相关/协方差矩阵的方法。也可以假定,由于所有点的权重相同,一些远离主断层线的数据点可能使平面发生了倾斜。为了改善结果,采取了几种不同的方法,我将在这篇博客中详细介绍这些步骤。
K 均值聚类
由于断层结构非常复杂,所以在上一篇博客中,从整个数据集中随机选择一部分来拟合一个平面,而不是将一个平面拟合到整个数据集中。然而,这可能会潜在地导致一个问题,因为我们不知道所选择的点是否属于同一断层结构。因此,不是随机选择一个子集,而是应用 k 均值聚类将数据点分成更多“相似”点的聚类。
k 均值聚类是一种聚类算法,它将数据点分成 n 个聚类。通过 1)将数据点分配到最近的质心,2)将质心位置更新到所分配的数据点的中心,以及 3)将数据点重新分配到最近的质心,来确定每个聚类的最佳质心。这个过程重复进行,直到它稳定下来,一旦完成,分配给质心的数据点就形成一个簇。
轮廓系数
Fig. 2 silhouette coefficient
轮廓系数用于确定最佳聚类数(图 2)。轮廓系数,取值在-1 到 1 之间,表示每个点分配给其分类的情况。测量从一个点到它自己的聚类以及到它的相邻聚类的距离(可以使用任何种类的距离度量,在这种情况下使用欧几里德距离),并且比较这些距离。下面是推导轮廓系数 s 的公式:
其中 a 是从一个数据点到同一聚类中所有数据点的平均距离,而 b 是从该点到最近聚类中所有数据点的平均距离。
高值表示它被很好地分配给自己的簇,低/负值表示它分配得不好。如图 2 所示,3 是该研究的最佳集群数。下图左侧显示了 3 组数据点,右侧显示了拟合的平面(像上次一样使用 PCA 来拟合平面)。
Fig. 3 * black dots are the centroids of the clusters
使用 k-means,拟合的平面看起来更好。但为了进一步改善结果,使用了异常值检测方法来消除一些可能会使平面倾斜的异常值。
随机样本一致性(RANSAC)
随机样本一致性是一种检测异常值的迭代方法。迭代方法使用初始猜测来生成一系列改进的近似。它广泛应用于图像处理领域,用于去除数据集中的噪声。因为它去除了异常值,所以您需要小心它的应用— RANSAC 只有在异常值对您预测的值没有影响时才是可行的。RANSAC 算法查找异常值的方式如下:
- 随机选择一个数据子集(假设内联者)
- 使用该子集,计算模型参数
- 将整个数据集与步骤 2 中建立的模型进行比较,所有与估计模型(基于损失函数)吻合的点将组成共识集 (=内联集)
RANSAC 有一个 sklearn 库,它有一个属性 inlier_mask_,告诉您哪些数据点被视为 inlier:
ransac = linear_model.RANSACRegressor()
ransac.fit(X, y)
inlier_mask = ransac.inlier_mask_
outlier_mask = np.logical_not(inlier_mask)
对于 3 个集群的导出的内层,拟合平面。图 4 中左图上的透明点是异常值,右图显示了拟合的平面。
Fig. 4 transparent data points are the ‘outliers’
结论
使用 k-均值聚类、RANSAC 和 PCA,拟合的断层线变得更加接近现实(而不是垂直平面)。由于 PCA 对远离其他观测值的点非常敏感,RANSAC 非常有助于防止这些点扭曲拟合平面。尽管在绘制主要断层线时忽略了这些异常值,但它们可能是某些潜在断层结构的一部分。将进一步研究这些异常值,以了解断层的复杂结构。
使用机器学习和计算机视觉检测车辆
原文:https://towardsdatascience.com/detecting-vehicles-using-machine-learning-and-computer-vision-e319ee149e10?source=collection_archive---------2-----------------------
来自 Udacity 自动驾驶汽车课程的最后一个项目是创建一个软件管道,它能够从汽车上的前置摄像头识别视频中的汽车。
A snapshot from the final output of the project
课程材料建议使用有点过时的方法来检测车辆,这是我在项目中途通过阅读这篇关于自动驾驶汽车的最先进的计算机视觉的伟大论文而发现的。报纸上一小段:
在 Dalal & Triggs (2005)的工作中,线性支持
向量机(SVMs)与
方向直方图(HOG)特征相结合,最大化来自线性决策边界的所有
样本的余量,已经成为流行的
分类工具。然而,所有以前的方法都依赖于难以设计的手工制作的特征。随着深度学习的复兴
,卷积神经网络已经
自动化了这项任务,同时显著提升了性能。
事实证明,深度神经网络优于我使用的方法(线性支持向量机结合梯度方向直方图)。我一定会回到这个项目中,在这个问题上尝试这个列表中的一些最佳表现者:
Table taken from https://arxiv.org/pdf/1704.05519.pdf
检测道路上的车辆的过程可以总结为以下步骤:
训练数据分析
训练数据由 Udacity 提供,由不同角度的汽车(8792)和非汽车 (8968)物体图像组成。这里有两个例子:
Examples from the training data set
特征抽出
为了检测图像上的汽车,我们需要识别唯一代表汽车的特征。我们可以尝试使用简单的模板匹配或依赖颜色特征,但这些方法在改变物体的视角和形状时不够健壮。
为了拥有一个健壮的特征集并提高我们的准确率,我们将使用梯度方向直方图 (HOG)。该特征描述符对流量的动态变化更有弹性。本质上,你应该把特征想象成你感兴趣的物体的指纹。
Scikit-image python 库为我们提供了计算 HOG 特征所必需的 API。我已经使用 YCrCb 颜色空间及其所有通道作为猪特征提取的输入。我尝试过其他颜色空间,但 YCrCb 在训练我的预测模型时给了我最好的准确性。这里有一个车辆和非车辆图像的样本,具有与上述图像相同的 HOG 特征:
Extracted HOG features from sample training data
HOG 特征提取基于 9 个方向,每个单元 8 个像素,每个块 2 个单元。增加方向和每个像元的像素参数确实可以缩短预测时间,但模型的准确率会下降。
模特培训
为了根据我们的特征集检测汽车,我们需要一个预测模型。对于这种特殊情况,我们将使用线性支持向量机(线性支持向量机)。这是一个监督学习模型,在我们训练它之后,它将能够分类某物是否是一辆汽车。
使用标准缩放器将 HOG 特征缩放至零均值和单位方差。
我将提供的数据集分为训练集(80%)和测试集(20%)。在训练开始之前,图片也进行了洗牌。最终提取的 HOG 特征在 YCrCb 颜色空间上的线性支持向量机模型达到了 98.06%的准确率。
推拉窗
一旦我们有了预测模型,就该在测试图像上使用它了。预测模型将应用于一种称为滑动窗口的特殊技术。使用这种技术,我们将在图像的子区域上运行预测模型,该子区域被划分为一个网格。
为了提高这种方法的稳健性,我们将添加多个网格,预测模型将遍历这些网格。我们这样做是因为汽车可以根据其在道路上的位置以各种大小出现在图像上。
Multi-window appraoch for sliding window technique
这是这个概念应用于我们的测试图像时的样子:
我使用了不同的窗口尺寸(从 128x128 的靠近汽车的区域到 64x64 的远离汽车的区域)。窗口重叠设置为 65%。
消除误报
为了提高最终输出的准确性,我们将尝试在相似区域找到感兴趣对象的多个匹配项。这种方法相当于创建一个热图。
下一步是引入阈值,为了将热图中的特定命中计数接受为检测到的汽车,需要满足该阈值。在我们的例子中,阈值的值为 2。
这是一个应用热图并将其阈值设定为特定值的示例。
最后结局
最终结果并不完美,但管道本身显示出良好的潜力。
结论
如果我有机会重新做这个项目,我可能会选择深度神经网络方法。我花了相当多的时间寻找正确的色彩空间、HOG 参数和窗口幻灯片的大小。
管道的性能不是很大,可以改进。深度神经网络方法将具有更好的性能数字。
由于这种汽车检测方法是基于摄像头的,这种传感器很容易遇到常见的挑战(能见度低、反光等)。).
项目可以在我的 Github 个人资料中找到:
[## bdjukic/CarND-车辆检测
CarND-Vehicle-Detection -车辆检测项目
github.com](https://github.com/bdjukic/CarND-Vehicle-Detection)
通过 ConvNets 进行检测和分割
原文:https://towardsdatascience.com/detection-and-segmentation-through-convnets-47aa42de27ea?source=collection_archive---------6-----------------------
Computer vision — Object detection and segmentation
神经网络在计算机视觉领域有广泛的应用。稍加改变,同样的工具和技术可以有效地应用于各种任务。在本文中,我们将介绍其中的几个应用程序以及接近它们的方法。最常见的四种是
- 语义分割
- 分类和定位
- 物体检测
- 实例分割
语义分割
我们输入一幅图像,并输出每个像素的类别判定。换句话说,我们希望将每一个像素归入几个可能的类别之一。这意味着,所有带有绵羊的像素将被分类到一个类别中,带有草地和道路的像素也是如此。更重要的是,输出不会区分两只不同的羊。
解决这个问题的一个可能的方法是把它当作一个带有滑动窗口的分类问题。通过这种方式,我们获取一个输入图像,并将其分成几个相同大小的裁剪部分。然后,每种作物都会被输入到 CNN,以获取该作物的分类类别作为输出。像素级的作物将对每个像素进行分类。那是超级容易的不是吗?
Semantic segmentation using sliding window
好吧,它甚至不需要一个研究生学位就能看出这种方法在实践中的计算效率有多低。我们需要的是一种将图像的通过次数减少到最多一次的方法。幸运的是,有建立具有所有卷积层的网络的技术来一次对所有像素进行预测。
Fully convolutional layer for semantic segmentation
如你所见,这样的网络将是下采样和上采样层的混合,以便保持输入图像的空间大小(在像素级进行预测)。下采样是通过使用步长或最大/平均池来实现的。另一方面,上采样需要使用一些巧妙的技术,其中两种是— 最近邻和转置卷积。
Up sampling techniques
简而言之,最近邻只是复制其感受野中的特定元素(上面例子中的 2x2)。另一方面,转置卷积努力学习执行上采样所需的滤波器的适当权重。在这里,我们从左上角值开始,它是一个标量,乘以过滤器,并将这些值复制到输出像元中。然后,我们在输出中按输入中一个像素移动的比例移动滤波器的一些特定像素。这个,输出和输入之间的比率,会给我们想要使用的步幅。在重叠的情况下,我们只是将这些值相加。这样,这些滤波器也构成了这些网络的可学习参数,而不是像最近邻的情况那样的某个固定值集。最后,我们可以使用像素级的交叉熵损失通过反向传播来训练这整个网络。
分类和本地化
图像分类处理给图像分配类别标签。但有时,除了预测类别,我们还对图像中该对象的位置感兴趣。用数学术语来说,我们可能想要在图像中的对象周围画一个边界框,如顶部的图片所示。幸运的是,我们可以重用我们在图像分类中学到的所有工具和技术。
Convolutional network for Classification + Localization
我们首先将输入图像输入到一个巨大的 ConvNet,它会给我们每个类别的分数。但是现在我们有了另一个完全连接的层,它从早期层生成的特征图中预测对象边界框的坐标(中心的 x,y 坐标以及高度和宽度)。因此,我们的网络将产生两个输出,一个对应于图像类,另一个对应于边界框。此后,为了训练这个网络,我们必须考虑两个损失,即分类的交叉熵损失和边界框预测的 L1/L2 损失(某种回归损失)。
概括地说,这种预测固定数目集合的思想可以应用于各种各样的计算机视觉任务,而不是定位,例如人类姿势估计。
Human pose estimation
在这里,我们可以通过身体上的一组固定点来定义人的姿势,例如关节。然后,我们将图像输入到 ConvNet,并输出相同的固定点(x,y)坐标。然后,我们可以在这些点上应用某种回归损失,通过反向传播来训练网络。
目标检测
对象检测的思想是,我们从一些我们感兴趣的固定类别集合开始,并且任何时候这些类别中的任何一个出现在输入图像中,我们将在该图像周围绘制边界框,并预测其类别标签。这在某种意义上不同于图像分类和定位,在前者中,我们将只围绕单个对象分类和绘制边界框。而在后一种情况下,我们事先不知道在图像中预期有多少对象。同样,我们也可以应用强力滑动窗口方法来解决这个问题。然而,这也是计算效率低下的。相反,很少有算法被开发来有效地解决这个问题——基于区域提议的算法和 YOLO 对象检测算法。
基于区域提议的算法
给定一幅输入图像,区域提议算法将给出数千个可能存在物体的方框。当然,输出中有可能存在噪声,就像没有物体的盒子一样。然而,如果图像中存在任何对象,则该对象将被算法选为候选框。
Selective search for region proposals
为了使所有的候选盒子大小相同,我们需要将它们扭曲成某个固定的正方形大小,这样我们就可以最终把它提供给网络。然后,我们可以将一个巨大的 ConvNet 应用于从区域建议输出的每个候选框,以获得最终的类别。毫无疑问,与强力滑动窗口算法相比,它的计算效率要高得多。这是 R-CNN 背后的整个想法。现在,为了进一步降低复杂性,使用了快速 R-CNN。快速 R-CNN 背后的思想是首先通过使输入图像通过 ConvNet 来获得高分辨率的特征图,然后将那些区域建议施加到该特征图上,而不是实际图像上。当我们有大量的作物时,这允许我们在整个图像上重复使用大量昂贵的卷积计算。
YOLO(你只看一次)
YOLO object detection
YOLO 背后的想法是,通过将它重新构建为一个单一的回归问题,直接从图像像素到边界框坐标和类概率,而不是在提议的区域中进行独立的处理,来一次做出所有的预测。
我们首先把整个输入图像分成 SxS 网格。每个网格单元预测 C 个条件类概率(Pr(Class | Object))以及 B 个边界框(x,y,w,h),每个边界框都有一个置信度得分。(x,y)坐标表示相对于网格单元边界的框的中心,而宽度和高度是相对于整个图像预测的。概率取决于包含对象的网格单元。我们只预测每个网格单元的一组类概率,而不考虑盒子 b 的数量。置信度得分反映了模型对盒子包含对象的置信度。如果盒子中没有物体,那么置信度得分必须为零。在另一个极端,置信度得分应该与预测框和真实标签之间的交集(IOU)相同。
**Confidence score = Pr(Object) * IOU**
在测试时,我们将条件类概率和单个盒子的置信度预测相乘,这给出了每个盒子的特定于类的置信度得分。这些分数编码了该类出现在框中的概率以及预测的框与对象的匹配程度。
**Pr(Class | Object) ∗ (Pr(Object) ∗ IOU) = Pr(Class) ∗ IOU**
实例分割
实例分割采用语义分割和对象检测技术。给定一幅图像,我们希望预测该图像中对象的位置和身份(类似于对象检测),然而,我们希望预测这些对象的整个分割掩模,即输入图像中的哪个像素对应于哪个对象实例,而不是预测这些对象的边界框。在这种情况下,我们为图像中的每只羊获得单独的分割掩码,这与语义分割形成对比,在语义分割中,所有的羊获得相同的分割掩码。
Mask R-CNN for instance segmentation
Mask R-CNN 是这类任务的首选网络。在这个多阶段处理任务中,我们将输入图像通过一个 ConvNet 和一些学习区域建议网络。一旦我们有了这些区域建议,我们就把这些建议投射到卷积特征图上,就像我们在 R-CNN 中所做的那样。然而现在,除了进行分类和边界框预测之外,我们还为这些区域提议中的每一个预测分割掩模。
资源
[## RCNN 示例结果
我在玩一个最先进的物体探测器,Ross Girshick 最近发布的 RCNN。方法…
cs.stanford.edu](https://cs.stanford.edu/people/karpathy/rcnn/) [## YOLO 算法-对象检测| Coursera
deeplearning.ai 为课程“卷积神经网络”创建的视频。学习如何运用你在…方面的知识
www.coursera.org](https://www.coursera.org/lecture/convolutional-neural-networks/yolo-algorithm-fF3O0)
请让我在评论中知道这篇文章可以容纳的任何改进/修改。
用 Python 开发一个 NLP 模型&用 Flask 逐步部署它
原文:https://towardsdatascience.com/develop-a-nlp-model-in-python-deploy-it-with-flask-step-by-step-744f3bdd7776?source=collection_archive---------1-----------------------
Flask API,文档分类,垃圾邮件过滤器
到目前为止,我们已经开发了许多机器学习模型,根据测试数据生成数值预测,并测试结果。我们在网下做所有的事情。实际上,生成预测只是机器学习项目的一部分,尽管在我看来这是最重要的一部分。
考虑使用机器学习来检测垃圾 SMS 文本消息的系统。我们的 ML 系统工作流程是这样的:离线训练->将模型作为服务提供->在线预测。
- 用垃圾邮件和非垃圾邮件消息离线训练分类器。
- 经过训练的模型被部署为服务用户的服务。
Figure 1
当我们开发一个机器学习模型时,我们需要考虑如何部署它,也就是如何让这个模型可供其他用户使用。
Kaggle 和数据科学训练营非常适合学习如何构建和优化模型,但它们不会教工程师如何将他们带到下一步,在这一步,构建模型和实际准备好让人们在他们的产品和服务中使用模型之间存在重大差异。
在本文中,我们将关注这两个方面:为垃圾短信分类建立一个机器学习模型,然后使用用于构建 web 应用程序的 Python 微框架 Flask 为该模型创建一个 API。这个 API 允许我们通过 HTTP 请求利用预测能力。我们开始吧!
ML 模型构建
这些数据是一组被标记为垃圾短信的短信,可以在这里找到。首先,我们将使用这个数据集来建立一个预测模型,该模型将准确地分类哪些文本是垃圾邮件。
朴素贝叶斯分类器是一种流行的电子邮件过滤统计技术。他们通常使用单词包功能来识别垃圾邮件。因此,我们将使用朴素贝叶斯定理构建一个简单的消息分类器。
NB_spam.py
Figure 2
朴素贝叶斯分类器不仅易于实现,而且能提供非常好的结果。
在对模型进行训练之后,需要有一种方法来保存模型以供将来使用,而不必重新训练。为了实现这一点,我们添加了下面几行代码,将我们的模型保存为一个. pkl 文件,供以后使用。
from sklearn.externals import joblib
joblib.dump(clf, 'NB_spam_model.pkl')
我们可以像这样在以后加载和使用保存的模型:
NB_spam_model = open('NB_spam_model.pkl','rb')
clf = joblib.load(NB_spam_model)
上述过程称为“以标准格式持久化模型”,即模型以特定于开发中语言的某种格式持久化。
并且该模型将在微服务中提供服务,该微服务公开端点以接收来自客户端的请求。这是下一步。
将垃圾邮件分类器转变为 Web 应用程序
在前面的部分中已经准备好了对 SMS 消息进行分类的代码,我们将开发一个 web 应用程序,它由一个简单的 web 页面组成,该页面带有一个表单字段,可以让我们输入消息。在将消息提交给 web 应用程序后,它将在一个新页面上呈现它,这给我们一个垃圾邮件或非垃圾邮件的结果。
首先,我们为这个项目创建一个名为SMS-Message-Spam-Detector
的文件夹,这是文件夹中的目录树。我们将解释每个文件。
spam.csv
app.py
templates/
home.html
result.html
static/
style.css
SMS-Message-Spam-Detector folder
templates folder
static folder
SMS Message Spam Detector folder
子目录templates
是 Flask 在 web 浏览器中查找静态 html 文件的目录,在我们的例子中,我们有两个 HTML 文件:home.html
和result.html
。
app.py
app.py
文件包含了 Python 解释器运行 Flask web 应用程序所要执行的主要代码,它包含了对 SMS 消息进行分类的 ML 代码:
app.py
- 我们将应用程序作为一个单独的模块运行;因此,我们用参数
__name__
初始化了一个新的 Flask 实例,让 Flask 知道它可以在它所在的同一个目录中找到 HTML 模板文件夹(templates
)。 - 接下来,我们使用 route decorator (
@app.route('/')
)来指定应该触发home
函数执行的 URL。 - 我们的
home
函数只是呈现了位于templates
文件夹中的home.html
HTML 文件。 - 在
predict
函数中,我们访问垃圾邮件数据集,预处理文本,进行预测,然后存储模型。我们访问用户输入的新消息,并使用我们的模型对其标签进行预测。 - 我们使用
POST
方法在消息体中将表单数据传输到服务器。最后,通过在app.run
方法中设置debug=True
参数,我们进一步激活了 Flask 的调试器。 - 最后,我们使用了
run
函数,仅在 Python 解释器直接执行该脚本时在服务器上运行应用程序,这是通过使用带有__name__ == '__main__'
的if
语句来确保的。
home.html
以下是home.html
文件的内容,该文件将呈现一个文本表单,用户可以在其中输入消息:
home.html
style.css
在home.html
的头段,我们加载了styles.css
文件。CSS 决定了 HTML 文档的外观和感觉。styles.css
必须保存在一个名为static
的子目录中,这是默认目录,Flask 会在这个目录中查找 CSS 等静态文件。
style.css
result.html
我们创建一个result.html
文件,该文件将通过predict
函数中的render_template('result.html', prediction=my_prediction)
行返回来呈现,我们在app.py
脚本中定义该函数来显示用户通过文本字段提交的文本。result.html
文件包含以下内容:
result.html
从result.htm
我们可以看到一些代码使用了 HTML 文件中通常没有的语法:{% if prediction ==1%},{% elif prediction == 0%},{% endif %}
这是 jinja 语法,它用于在 HTML 文件中访问从我们的 HTTP 请求返回的预测。
我们快到了!
完成上述所有操作后,您可以通过双击appy.py
或从终端执行命令来开始运行 API:
cd SMS-Message-Spam-Detector
python app.py
您应该得到以下输出:
Figure 3
现在,您可以打开 web 浏览器并导航到 http://127.0.0.1:5000/ ,我们应该会看到一个简单的网站,内容如下:
Figure 4
让我们测试我们的工作!
spam_detector_app
恭喜你!我们现在已经以零成本创建了一个端到端的机器学习(NLP)应用。回过头来看,整体流程一点都不复杂。只要有一点耐心和学习的欲望,任何人都可以做到。所有的开源工具让一切成为可能。
更重要的是,我们能够将我们的机器学习理论知识扩展到一个有用和实用的 web 应用程序,并让我们能够向外界提供我们的垃圾短信分类器!
完整的工作源代码可以在这个库获得。祝你一周愉快!
参考:
本书: Python 机器学习
使用 Matplotlib 开发良好的 Twitter 数据可视化
原文:https://towardsdatascience.com/developing-good-twitter-data-visualizations-using-matplotlib-8e39906b6be6?source=collection_archive---------4-----------------------
在本文中,我们将学习如何收集 Twitter 数据并使用 Python 创建有趣的可视化。我们将简要探讨如何使用 Tweepy 收集 tweets,并且我们将主要探讨使用 Matplotlib 的 Twitter 数据的各种数据可视化技术。在此之前,将解释数据可视化和实现它的总体统计过程。
首先,什么是数据可视化?
它是数据的图示或视觉表示。我们在报纸、新闻媒体、体育分析、研究论文中看到过,有时也在广告中看到过。数据可视化模型常见的例子有:折线图,散点图,饼图,条形图(使用这些模型很容易做可视化)。
创建数据可视化模型很重要,为什么?
——一张图能说千言万语。表示多行数据的图形可以提供数据的全貌,并可以揭示数据中包含的模式。
-数据可视化是统计分析的一部分。统计学在各个领域都有很多应用。
-开发新算法可以训练你的创造力和解决问题的能力。Matplotlib 有自己的绘制数据的工具,但是我们可能不局限于它,以便有更多的模型和更多种类的可视化。
-不同的模型可以给出关于数据的不同观点。
统计过程(P-C-A-I)
该过程遵循一个简单的流程。流程从提出问题开始,例如:“NatGeo 帐户倾向于发布什么?”。有了问题之后,我们进行适当的数据收集。在收集阶段,也许有许多方法可以获得 Twitter 数据,但这里选择使用 Tweepy。收集完毕后我们将进入一分析部分。这就是我们应该选择适当的数学或统计方法来分析数据的地方。分析数据的一种方式是通过数据可视化。最后,最后一个阶段是解释结果。请注意,我们最终可能会得到另一个问题的答案,这意味着流动可能是循环的。
PCAI flow (source)
我们已经简要讨论了数据可视化和支持它的统计过程。对于我们的调查,我们已经知道要回答的问题将与 Twitter 数据相关,因此在具体定义问题之前,我们将首先查看数据收集。
收集 Twitter 数据
我们可以使用 Python 中的 Tweepy 库自动收集一个比较大的 Twitter 数据。这是一个用于访问 Twitter API 的外部 Python 库。为了使这个库有用,我们必须首先为我们的 Twitter 帐户创建一个 Twitter 应用程序。注册后,我们将获得私有信息:消费者密钥、消费者秘密、访问秘密和访问令牌。使用 Tweepy 访问我们的 Twitter API 需要这些信息。
用 Python 创建 Twitter API 对象的一个例子:
import tweepy
consumer_key = 'ecGxfboL66oO2ZwxfKkg7q3QK'
consumer_secret = 'exVRiv517gdwkPLP19PtlQMEIRjxgJr21JZCAAQYIqJCUW5vmh'
access_token = '3151279508−Ywd662Zv97Ie7E7I97dUm0e3s2X8yYBloJQd6Gr'
access_secret = 'BH5REW4V7RdGadMr31NLY9ksFypG12m8BR04S32ZF7jO3'auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
our_api = tweepy.API(auth)
现在我们可以通过**our_api**
开始使用 Twitter API 了。
我们可以通过应用方法**our_api.home_timeline()**
直接从我们的 home timeline 中收集推文,该方法默认收集 20 条最近的推文(包括转发的推文)。要调整所需的推文数量(以 100 条推文为例),请使用**our_api.home_timeline(count = 100)**
。要收集特定账户的推文(以@NatGeo 为例),使用方法**our_api.user_timeline(screen_name = 'NatGeo', count = 100)**
。
上述方法的一个缺点是,它最多只能收集 200 条推文。为了克服这一点,我们可以使用**tweepy.Cursor**
类。要收集 2000 条@NatGeo tweets,然后将文本、转发数和赞数保存在一个列表中,我们可以执行如下操作。
natgeo_cursor = tweepy.Cursor(our_api.user_timeline, screen_name = 'NatGeo')
natgeo_tweets = [(tweet.text, tweet.retweet_count, tweet.favorite_count) \
for tweet in natgeo_cursor.items(2000)]
**natgeo_cursor.items(n)**
中的每一项都是一个**tweepy.models.Status**
对象,从中我们可以获得 tweet 数据,比如文本、作者信息(以**tweepy.models.User**
对象的形式)、创建时间、转发次数、赞数和媒体。
结果:
>>> natgeo_tweets[0]
("As Chernobyl's gray wolf population increases, their influence
on the surrounding environment is called into questi… https://t.co/elsb4FJQGZ", 428, 1504)
>>> natgeo_tweets[1]
('1,058 temples in the south Indian state of Kerala that have
pledged to eliminate plastic this year [https://t.co/ltJ6mFIWpV',](https://t.co/ltJ6mFIWpV',) 268, 985)
到目前为止,我们已经看到了如何使用 Tweepy 来收集实际的 Twitter 数据。现在让我们好奇,用 Matplotlib 把它们可视化。
*代替上述结果,我们将使用各种 Twitter 数据集进行可视化。
最小数据可视化
首先,让我们看一个在我们的家庭时间轴中绘制推文的用户名频率的例子。用户名频率是在我们的数据中出现的来自特定用户名的推文数量。推文数据将是来自家庭时间轴的 200 条推文。下面是条形图结果后面的代码示例。
import matplotlib.pyplot as plthome_cursor = tweepy.Cursor(api.home_timeline)
tweets = [i.author.screen_name for i in home_cursor.items(200)]
unq = set(tweets)
freq = {uname: tweets.count(uname) for uname in unq}
plt.bar(range(len(unq)), freq.values())
plt.show()
正如你所看到的,该图显示在时间轴中有 42 个不同的 Twitter 帐户发推文,只有一个帐户发推文最多(41 条推文)。万一你想知道,最常去的账号是@CNNIndonesia。但我们必须承认,我们无法看到数据中出现的用户名,从条形图中无法收集到太多信息(尽管这仍然比完全没有可视化要好)。这就是为什么我们应该学习在 Matplotlib 之上开发自己的算法来修改数据可视化(这可以导致各种模型)。
从上面的尝试中我们能学到什么?
根据www.informationisbeautiful.net 的作者 David McCandless 的观点,一个好的数据可视化有 4 个关键要素:信息、故事(概念)、目标、视觉形式(隐喻)。信息是数据,这个元素的关键词是准确性、一致性和诚实。故事(概念)就是让数据 vis 变得有趣。目标是数据的有用性和效率。视觉形式(比喻)就是美和外观。
by David McCandless
上面的第一个条形图肯定有信息元素,数据是准确的。它还有一点目标和最小视觉形式(横条)。但它根本没有故事(概念)(只有数据的创造者 vis 才知道剧情背后的故事),它至少应该告知观者它是关于 Twitter 数据的。
为了提高我们的视觉效果,我们将应用 4 个关键要素。但是为了有趣,我们将只在 Python 中使用 Matplotlib。
在接下来的部分中,我们将会看到一些与各种 Twitter 数据相关的问题或目标,并执行数据可视化。
案例一。目标:账户对比,模型:修改后的横条图
在这种情况下,我们将使用我几个月前从我的家庭时间轴中收集的 192 条推文的数据。数据将被转换,这样我们可以按账户对推文进行分组,然后我们将通过数据可视化来比较这些数字。值得注意的是,我们将开发一个良好的数据可视化,它结合了各种 Matplotlib 特性,而不局限于它所拥有的绘图模型。
我们将在 Python 中使用的模块有:
import numpy
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
import operator
import itertools
数据表示的代码如下所示。它将按用户名对推文进行分组,然后统计推文数量(也可以被视为用户名频率)和每个用户名的关注者数量。它还将按用户名频率对数据进行排序。
home_tweets = list(numpy.load('testfile.npy'))unicity_key = operator.attrgetter('author.screen_name')
tweets = sorted(home_tweets, key=unicity_key)authors_tweets = {}
followers_count = {}
sample_count = {}
for screen_name, author_tweets in itertools.groupby(tweets, key=unicity_key):
author_tweets = list(author_tweets)
author = author_tweets[0].author authors_tweets[screen_name] = author
followers_count[screen_name] = author.followers_count
sample_count[screen_name] = len(author_tweets)maxfolls = max(followers_count.values())sorted_screen_name = sorted(sample_count.keys(), key = lambda x: sample_count[x])
sorted_folls = [followers_count[i] for i in sorted_screen_name]
sorted_count = [sample_count[i] for i in sorted_screen_name]
接下来,我们可以通过**plt.hbar(range(len(sorted_count)),sorted_count)**
轻松地执行水平条形图,然后设置图形和 x-y 轴的标题,但是让我们随机应变。我们将通过添加颜色透明度差异来添加额外的视觉形式,例如:条形的透明度可能代表账户的关注者数量。我们还将把 y 轴上的刻度标签从数字改为用户名字符串。代码如下:
colors = [(0.1, 0.1, 1, i/maxfolls) for i in sorted_folls]fig, ax = plt.subplots(1,1)y_pos = range(len(colors))
ax.set_yticks(y_pos)
ax.set_yticklabels(sorted_screen_name, font_properties = helv_8)ax.barh(y_pos, sorted_count, \
height = 0.7, left = 0.5, \
color = colors)for i in y_pos:
ax.text(sorted_count[i]+1, i, style_the_num(str(sorted_folls[i])), \
font_properties = helv_10, color = colors[i])ax.set_ylim(-1, y_pos[-1]+1+0.7)
ax.set_xlim(0, max(sorted_count) + 8)ax.set_xlabel('Tweets count', font_properties = helv_14)plt.tight_layout(pad=3)
fig.show()
请注意,我们还更改了字体样式,并使用**style_the_num**
函数为关注者计数的字符串即兴创作(将**22441917**
映射到**22,441,917**
)。以下是绘图结果:
很明显,上面的图显示了更多的信息,看起来比第一个图更好。视觉效果也有助于解释数据。剧情在故事(概念)元素上也更有价值,看起来相当活灵活现(我们不需要投入太多精力去理解可视化)。
*对不起,但也许情节应该有一个文本解释蓝色透明度的含义(这是帐户的追随者数量)。
案例二。目标:一个账号发布的图片的种类和受众的喜好,模型:图片情节
在这种情况下,我们将 1000 条@NatGeo 推文的数据集(收集于 2018 年 9 月 19 日)。1000 条推文中的每一条都可以有图片,也可以没有。因此,为了实现本案例的目标,我们必须首先收集数据中存在的所有图像。之后会介绍一个形象剧情。Python 的实现是通过创建**PlotDecorator**
类来完成的,然后使用实例来生成图像 plot。**PlotDecorator**
类有方法**gen_img(prev_img, next_img)**
、**put_below(left_img, next_img)**
和**generate(imgs, ncol)**
。对算法的解释:
-
**gen_img(prev_img, next_img)**
:
紧紧在前一幅图像的右侧绘制下一幅图像。**next_img**
参数是一个**matplotlib.image.AxesImage**
对象,而**prev_img**
是一个包含左侧图像的**AxesImage**
对象的字典。该函数使用**next_img.get_extent(...)**
和**next_img.set_extent(...)**
方法设置下一幅图像的属性,使其位于前一幅图像(左侧图像)的旁边。 -
**put_below(left_img, next_img)**
:
与上述第一种方法相似,但下一幅图像位于该行最左侧图像下方的。这是因为每行只能有**ncol**
个图像。 -
**generate(imgs, ncol)**
:
这是我们生成图像新位置的地方。**imgs**
是我们想要绘制的**AxesImage**
对象的列表。例如,如果**ncol=10**
,该功能将应用**gen_img(prev_img, next_img)**
10 次,然后应用**put_below(left_img, next_img)**
并重新开始新一行图像。
在收集和放置好图片后,我们计算每张图片的转发次数,然后只显示转发次数最多的前 3 张图片的辅助装饰。装饰只是一个紫色的圆圈,图像周围没有填充(透明度给出了等级的线索)。这是结果,它从完整的图像开始,然后放大,然后再次放大转发最多的图像:
让我们评价一下上面的数据可视化。很明显它有着视觉形式(隐喻)的体面价值(还不错)概念相当好听(很有意思)。我们得到的信息是转发数最高的前 3 张图片和图片的模式(所有图片都是很棒的照片,没有海报、引用等图片)。
*还是那句话,也许剧情应该有一小段说明剧情的意义。
案例三。目的:两个词之间的关系,模型:Twitter 维恩图
在这种情况下,我们将使用@jakpost(雅加达邮报)3214 条推文的数据集。最早的推文创建于 2018 年 5 月 8 日,最新的创建于 2018 年 6 月 22 日。我们的目标是想知道一组推文中的两个词之间是否有联系。找出答案的一个方法是检查所选的单词是否在一条推文中使用。
有一种叫做 Twitter 维恩图的方法可以用来可视化两个词在一组推文中是如何连接的。我们将采用 Twitter 维恩图,并使用 Matplotlib 进行一点即兴创作(代码示例可在此 repo 中获得)。我使用 TextBlob 从推文中收集单词。
*算法以最明显的方式编写,没有任何优化尝试。
即兴创作:代表每条推文的每个标记都有可见性值,该值代表转发计数比率(在圆圈中的推文中,转发计数最多的推文将具有最高的可见性值,即 1)。
现在让我们挑选两个有趣的词,例如,“雅加达”和“行政”。包含“雅加达”但不包含“行政”的推文将有红色标记,包含“行政”但不包含“雅加达”的推文将有蓝色标记。包含这两个词的推文将有绿色标记。下面是剧情。
上面的情节应该已经讲了意义本身。在 3214 条推文中,有 161 条推文包含“雅加达”,只有 14 条推文包含“行政”,9 条推文包含两者。转发聚集在“雅加达”圈,请注意有 3 条转发量非常高的推文。
现在让我们再举一个例子,用单词‘jokowi’和‘prabowo’。佐科维是红色的,普拉博沃是蓝色的。下面是剧情。
如果你对十字路口的一条推文感到好奇,下面是它的内容:
“普拉博沃指责佐科威政府削弱了 https://t.co/BxJ7hum7Um 的 TNI #杰克波斯特
总的来说,上面的 Twitter 数据可视化示例并不是可视化的最佳示例。但是我们已经看到了如何利用 Tweepy 和 Matplotlib,同时将良好的数据可视化的 4 个元素牢记在心。我们已经看到了如何组合不同的颜色和形状来为视觉形式(隐喻)和故事(概念)增加更多的价值。
在下面的链接中可以看到一些很棒的数据可视化示例(一般来说,不限于 Python 或 Matplotlib)。
-https://informationisbeautiful.net/
-https://datavizproject.com/
数据科学家 DevOps:驯服独角兽
原文:https://towardsdatascience.com/devops-for-data-scientists-taming-the-unicorn-6410843990de?source=collection_archive---------0-----------------------
当大多数数据科学家开始工作时,他们配备了从学校教科书中学到的所有简洁的数学概念。然而,很快,他们意识到数据科学的大部分工作涉及将数据转换成模型使用所需的格式。除此之外,正在开发的模型是最终用户应用程序的一部分。现在,数据科学家应该做的一件正确的事情是在 Git 上控制他们的模型代码版本。然后 VSTS 会从 Git 下载代码。然后,VSTS 将被包装在 Docker 映像中,该映像将被放在 Docker 容器注册表中。一旦注册,它将使用 Kubernetes 进行编排。现在,对普通的数据科学家说这些,他的大脑会完全关闭。大多数数据科学家知道如何提供带有预测的静态报告或 CSV 文件。然而,我们如何对模型进行版本控制并将其添加到应用程序中?根据结果,人们将如何与我们的网站互动?它将如何扩展!?所有这些都将涉及到信心测试、检查是否有任何东西低于设定的阈值、不同方的签署以及不同云服务器之间的协调(以及所有丑陋的防火墙规则)。这就是一些基本的 DevOps 知识派上用场的地方。
DevOps 是什么?
长话短说,开发人员是帮助开发人员(例如数据科学家)和 IT 人员一起工作的人。
Usual battle between Developers and IT
开发人员有他们自己的指挥链(即项目经理),他们希望尽快为他们的产品获得特性。对于数据科学家来说,这意味着改变模型结构和变量。他们根本不关心机器会发生什么。数据中心冒烟?只要他们得到数据来完成最终产品,他们就不会在乎。在光谱的另一端是它。他们的工作是确保所有的服务器,网络和漂亮的防火墙规则得到维护。网络安全也是他们非常关心的问题。只要机器运转良好,他们就不会对公司的客户不感兴趣。DevOps 是开发者和 IT 之间的中间人。一些常见的 DevOps 功能包括:
-集成
-测试
-打包
-部署
博客的其余部分将详细解释整个持续集成和部署过程(或者至少是与数据科学家相关的内容)。在阅读博客的其余部分之前,有一点很重要。理解业务问题,不要和工具结婚。博客中提到的工具将会改变,但是潜在的问题将会大致保持不变(至少在可预见的将来)。
源代码控制
想象一下将您的代码推向生产。而且很管用!完美。没有抱怨。随着时间的推移,您会不断添加新功能并不断开发它。然而,这些特性中的一个给你的代码引入了一个错误,严重扰乱了你的生产应用程序。您希望您的许多单元测试中的一个能够发现它。然而,仅仅因为一些东西通过了你所有的测试并不意味着它没有错误。这只是意味着它通过了当前编写的所有测试。因为这是生产级代码,所以你没有时间去调试。时间就是金钱,你有愤怒的客户。回到代码工作的时候不是很简单吗???这就是版本控制的用武之地。在敏捷风格的代码开发中,产品在一个不确定的时间周期内保持零碎的开发。对于这样的应用程序,某种形式的版本控制将非常有用。
Bitbucket Repository
我个人喜欢 Git ,但是 SVN 用户依然存在。Git 可以在所有形式的平台上工作,如 GitHub 、 GitLab 和 BitBucket (每种平台都有自己独特的优缺点)。如果你已经熟悉了 Git,可以考虑在 Atlassian 上学习更高级的 Git 教程。我推荐查找的一个高级特性是 Git 子模块,在这里您可以存储多个独立 Git 存储库的特定提交散列,以确保您可以访问一组稳定的依赖项。有一个 README.md 也很重要,它概述了存储库的细节以及必要时的打包(例如使用 Python 的 setup.py)。如果你存储的是二进制文件,可以考虑使用 Git LFS (尽管我建议尽可能避免这种情况)。
Merging Jupyter Notebooks on Git
版本控制的一个数据科学特有的问题是 Jupiter/Zeppelin 笔记本的使用。数据科学家绝对喜欢笔记本。然而,如果你把你的代码存储在一个笔记本模板上,并试图在版本控制中改变代码,当执行 diff 和 merge 时,你将会留下疯狂的 HTML 垃圾。您可以完全放弃在版本控制中使用笔记本(并简单地从版本控制库中导入数学函数),或者您可以使用现有的工具,如 nbdime 。
自动测试
从数据科学家的角度来看,测试通常分为两个阵营。你有通常的单元测试,它检查代码是否正常工作,或者代码是否做了你想要它做的事情。另一个更具体的领域是数据科学,即数据质量检查和模型性能。你的模型能给你一个准确的分数吗?现在,我确信你们中的许多人想知道为什么这是一个问题。您已经完成了分类评分和 ROC 曲线,并且该模型对于部署来说足够令人满意。嗯,有很多问题。主要问题是,开发环境中的库版本可能与生产环境中的完全不同。这将意味着不同实现、近似以及不同的模型输出。
Model output should be the same on dev and prod if integration and deployment are done right
另一个经典的例子是使用不同的语言进行开发和生产。让我们想象一下这个场景。您,这位高贵的数据科学家,希望用 R、Python、Matlab 或上周刚刚发布白皮书的许多新语言中的一种来编写一个模型(可能没有经过很好的测试)。你带着你的模型去生产团队。制作组怀疑的看着你,笑了 5 秒,才意识到你是认真的。他们会嘲笑。生产代码是用 Java 写的。这意味着将整个模型代码重新编写成 Java 用于生产。这又意味着完全不同的输入格式和模型输出。因此,自动化测试是必需的。
Jenkins Home Page
单元测试非常普遍。JUnit 面向 Java 用户,而非 ittest 库面向 Python 开发者。然而,在将代码投入生产之前,有些人可能会忘记在团队中正确运行单元测试。虽然你可以使用 crontab 来运行自动化测试,但我建议使用更专业的工具,比如 Travis CI 、 CircleCI 或 Jenkins 。Jenkins 允许你安排测试,从版本控制库中挑选特定的分支,如果有问题可以发送电子邮件,如果你想保护你的测试,甚至可以旋转 Docker 容器映像。基于集装箱化的沙箱将在下一节详细解释。
集装箱化
Containers vs VMs
沙盒是编码的重要组成部分。这可能涉及到为各种应用程序提供不同的环境。它可以简单地将生产环境复制到开发中。这甚至意味着拥有多个不同软件版本的生产环境,以迎合更大的客户群。如果您想到的最佳方法是使用带有虚拟盒的虚拟机,我相信您已经注意到,要么需要使用完全相同的虚拟机进行多轮测试(糟糕的 DevOps 卫生状况),要么为每次测试重新创建一个干净的虚拟机(根据您的需要,这可能需要近一个小时)。一种更简单的替代方法是在虚拟机上使用容器而不是完整容器。容器只是一个 unix 进程或线程,看起来、闻起来和感觉起来都像 VM。它的优势在于低功耗和低内存消耗(这意味着你可以在几分钟内随意启动或关闭它)。流行的容器化技术包括 Docker (如果您希望只使用一个容器)或 Kubernetes (如果您喜欢为多服务器工作流编排多个容器)。
Kubernetes Workflow
容器化技术不仅有助于测试,还有助于可伸缩性。当您需要考虑多个用户使用基于模型的应用程序时,尤其如此。就训练或预测而言,这可能是真的。
安全性
在数据科学领域,安全性很重要,但往往被低估。用于模型训练和预测的一些数据涉及敏感数据,如信用卡信息或医疗保健数据。在处理此类数据时,需要遵循一些法规遵从性政策,如 GDPR 和 HIPAA。不仅仅是客户需要安全。当在客户端服务器上部署商业秘密模型结构和变量时,它们需要一定级别的加密。这通常通过在加密的可执行文件(例如 JAR 文件)中部署模型,或者在将模型变量存储到客户端数据库之前对其进行加密来解决(但是,除非您完全知道自己在做什么,否则请不要编写自己的加密程序……)。
Encrypted JAR file
此外,明智的做法是在逐个租户的基础上建立模型,以避免可能导致信息从一家公司泄露到另一家公司的意外转移学习。在企业搜索的情况下,数据科学家可以使用所有可用的数据建立模型,并根据权限设置,过滤掉特定用户无权查看的结果。虽然这种方法看起来很合理,但用于训练模型的数据中的部分可用信息实际上是由算法学习并转移到模型中的。所以,无论哪种方式,用户都有可能推断出被禁页面的内容。没有完美的安全保障。但是,它需要足够好(其定义取决于产品本身)。
合作
作为一名数据科学家,在与 DevOps 或 IT 合作时,坦率地说出需求和期望非常重要。这可能包括编程语言、包版本或框架。最后但同样重要的是,互相尊重也很重要。毕竟,DevOps 和数据科学家都有难以置信的困难挑战要解决。开发人员不太了解数据科学,数据科学家也不是开发人员和 IT 方面的专家。因此,沟通是取得成功的关键。
附加说明
[## 软件开发设计原则
当人们开始成为自学的程序员时,很多时候我们想的是创建一个应用程序,简单地…
medium.com](https://medium.com/@sadatnazrul/software-development-design-principles-79d15ef765f3) [## 如何让你的软件开发体验…没有痛苦…
工作在各种形式的组织(从大型软件开发为导向的利基启动到学术实验室),我…
towardsdatascience.com](/how-to-make-your-software-development-experience-painless-2591ebcc69b6) [## 数据科学面试指南
数据科学是一个相当大且多样化的领域。因此,做一个万事通真的很难…
towardsdatascience.com](/data-science-interview-guide-4ee9f5dc778)
DevOps:做还是不做?
原文:https://towardsdatascience.com/devops-to-do-or-not-to-do-focus-on-culture-first-f82319ed346a?source=collection_archive---------14-----------------------
unsplash.com
总结
DevOps 是相对最新的“流行语”之一,它会一直存在下去——即使名字不同。DevOps 转型已被证明可以加快软件交付和运营的速度、质量和效率,并提高员工的目的性。受影响最大的将是质量保证团队——因为他们的工作将通过更好的编程工具、自动化和机器学习来解决。在整个企业范围内采用文化转型可以让您通过流程效率、员工福祉和客户幸福来提升交付能力,而这些正是现代组织的最终目标。
在过去几十年中,各组织实施了四项重大变革举措:战略规划、重新设计、全面质量管理和缩编。这些计划的目的是实现经济效益,但是大约 75%的计划失败了或者产生了严重到威胁组织生存的问题 (1) 。人们发现,忽视组织文化是这次失败的最主要原因。当观察在团队层面上采用 Scrum 而没有开发支持这种变化的环境的等级和官僚组织时,这被一次又一次地证明是正确的。在这些公司里,敏捷教练教导人们专注、勇气、尊重、开放和承诺。然而,该系统经常促进指责游戏、政治和升级途径。文化可能促进也可能阻碍公司的战略计划。DevOps 转型是发展高绩效业务的新战略,理想情况下采用自下而上的管理方法。
DevOps 转换—它是什么?
根据最近的调查,大约 50%的企业已经开始实施 DevOps。这些转变的真正成功还有待观察。
DevOps 是关于文化、人员、技术和流程的。DevOps 转型是一项巨大的工作,扩展到组织的所有级别——除了众所周知的 DevOps 承诺为软件交付带来魔力之外,所有的目标都是将组织转变为高绩效的组织思维。
从技术上来说,DevOps 定义了一种状态,在这种状态下,组织在可伸缩环境中使用最新的软件,在具有服务发现和多阶段历史支持的反馈系统的弹性容器中始终准备就绪、自动化、统一和独立的版本。拆开上面的句子,意思是:
- 始终就绪:开发、集成&工具链流程的改进
- 自动化:利用与工具链结合的配置管理工具
- 统一:除数据外,内部&生产环境完全相同。
- 独立:产品独立工作,彼此风险最小;众所周知的概念:高度一致、松散耦合
- 发布:无论何时何地需要;只要有商业意义。
- 可扩展的环境:不需要固定的资源/硬件,因为每个服务都是虚拟化的、可扩展的,而且是不可变的。
- 最新软件:不依赖遗留软件,版本独立。
- 弹性容器:失败被拥抱而不是被避免;不变性、弹性
- 服务发现:用于管理服务和资源的弹性软件
- 多阶段:所有开发阶段的自动化测试
- 历史启用:所有阶段的可靠日志的可用性
- 反馈系统:基于机器学习和动态阈值的推理,同时在任何有意义的时候利用度量标准。
为什么是 DevOps?—好处
组织的 DevOps 转换已经被证明可以加速软件交付的速度、质量和效率,提高员工的积极性和士气。它消除了筒仓(团队之间的沟通障碍)以及软件开发对单个人或团队的依赖。通过使用自动化软件来消除令人厌烦的、单调的任务,工作质量得到了进一步提高。通过建立自动化服务,与人工服务相比,现有的运营成本大大降低。随着手动工作的消除,员工可以专注于提高工作满意度的工作,目的是为组织及其客户增加真正的价值。更快的自动化过程提高了发布过程的质量,因为流水线中的步骤是标准化的,导致可预测的结果、减少的周期时间和更高的部署率。
DevOps 在企业中的实施
DevOps 诞生于敏捷软件开发运动,专注于沟通、协作、集成、自动化、反馈和学习,同时衡量 IT 运营和软件开发人员以及企业中其他 IT 专业人员之间的合作。
DevOps 之前的场景
- 孤立的强大团队导致孤立的孤岛和操作知识块。
- 团队中过度紧张和孤立的高能力专家意味着更多的责任,总体效果是达到最佳绩效,同时也成为瓶颈。
- 团队成员对于哪些能力由谁负责难以忍受的困惑?
- 软件开发团队在不知道特性如何表现的情况下编写代码?客户感觉如何,功能如何满足实际需求?
- 质量保证团队必须确保高质量标准,但不具备所需的所有工具和资源。
- 系统工程团队必须将软件投入生产,并确保其运行。如果它不能黑进去。又名部署和祈祷。
开发运维后的场景
- 由产品经理、UX/UI 专家、软件工程师和其他人组成的产品团队一起工作(质量保证不像以前那么重要了——都是流水线化和自动化的)
- 随着高效工具和技术的到位,现场可靠性团队变得更小 (2) 。
期待什么?
DevOps 已经成为为企业执行运输和运营活动的流行和标准方式,主要是那些涉及某种软件开发的企业。DevOps 转换的采用正在迅速传播,最近,DevOps 一直在沿着这些方向发展。很明显,It 文化正在发生变化,管理产品发布的传统方法变得低效、适得其反且成本高昂。DevOps 正在革新组织,提高性能,构建更多功能软件,并通过减少故障来降低成本。这是所有组织都希望实现的目标。
DevOps 是最新的“流行语”之一,它会一直存在下去(也许没有一个特别的名字——但服务于相同的目的)。DevOps 将会深深扎根于软件生产工具链和交付中,以至于它将不会被单独命名——它将被视为理所当然,它就在那里,它将成为一种商品。然而,DevOps 的文化方面将通过以员工为中心的现代组织变革来采用,而不是等级模式。当员工处于中心时,他们会与共同的动机保持一致;这与员工自身的工作目的 (3) 、组织的利益和顾客的利益直接相关。
在这种组织演变和采用中,受影响最大的将是质量保证团队——因为他们的工作将通过更好的编程工具、自动化和机器学习来解决。因此,质量保证团队成员可以更容易地为未来做准备,并提高软件生产和运输领域中的某种自动化技能。
通过以文化为重点的正确的 DevOps 转型方法,这不仅仅是可以实现的,而且一定会成功。
DevOps 转型帮助您将速度、质量和可靠性融入软件生产业务。通过在企业范围内采用文化转型来采用整体方法,使您能够通过流程效率、员工福祉和客户幸福来提高交付能力,这是现代组织的最终目标。
DFL > DNF > DNS?
原文:https://towardsdatascience.com/dfl-dnf-dns-60969b9e995d?source=collection_archive---------1-----------------------
去年,我按下了人生的暂停键,搬到了西雅图,当时是暂时的。我参加了 enlight 数据科学沉浸式项目,并在接下来的 3 个月里努力工作,尽情玩耍。
我对“玩”有一种扭曲的看法。我喜欢跑步。你可能会说,这不奇怪…
嗯,我喜欢在小径上跑步…在小径上跑很远,一口气跑 100 英里远(在那个距离上,我是 8 投 5 中)。我渴望有一天能一口气跑 200 英里。它让我能够测试可能的界限,探索自我的深度。
Mile 60 of 2016 Rocky Raccoon 100 Miler. Joy displayed may be related to the fauxhawk?
很自然地,当它来到我的顶点项目时,我想要融入我对(愚蠢的)长距离越野跑和数据科学的热爱。我只是需要正确的“业务问题”…
围绕着极端分子有一个共同的咒语:
DFL > DNF > DNS
"死在最后,总比没有完成好,总比没有开始好."
这对赛事总监来说意味着什么?
Monte Carlo Simulation for 2017 Western States Endurance Run Lottery, I had 9.6% odds of entry.
好吧,信不信由你,很多比赛很快就卖光了!知名度较高的已经上了彩票系统。三年多来,我一直试图参加西部各州的耐力赛。
了解有多少人不会出现,对于赛事总监来说是很重要的,以判断需要多长时间做一份等待名单,或者一般情况下允许多少人参加比赛。
我可以讲述一个神奇的故事,我是如何根据人们以前的表现对他们进行分类,以映射他们开始 100 英里的倾向。
人类行为是最难建模的主题之一。
见鬼,我们还没有掌握股票市场的建模。
试图确定一个特定的超跑者是否会出现在刘李 120 的起跑线上几乎是不可能的,比如一个 35 岁的男性,他的表现略高于平均水平,已经参加了 15 场比赛。
我相信这可以归结为:
- 如果有办法,超跑者将开始一场比赛。相对而言,很少有人在大型 100 英里比赛中使用域名系统。 即使训练不足或者受伤,他们也会首发,但是 DNF 到时候 。(同样,DFL > DNF > DNS)
- 根据有限的人口统计数据,预测生活环境极其困难。我不知道每个人靠什么谋生,也不知道他们的家庭结构是什么样子。 未开始的最常见原因是由于最后一分钟的工作或家庭义务,这在我的模型中没有考虑。
但并不意味着我没有尝试过。在这个项目中,我非常努力地对个人跑步者进行分类,并取得了一些成功。我还想模拟对赛事总监的财务影响,将结果放入可操作的环境中。
方法:
如果你不是一个数据人员,如果你愿意,请继续阅读,但这是我要花几分钟时间进行技术分析的地方。对于数据爱好者,这里有一些细节…
技术栈 — Python (pandas,scikitlearn,matplotlib,Flask),AWS,Javascript/Ajax,Django
Webscraping —从 ultrasignup.com 收集 39 场比赛和> 10,000 名运动员成绩的 Python 脚本。结果是 json 格式的文件,我将其解析成 pandas 数据帧。
数据清理/特征工程——有一次在 Python 中,我清理了数据,做了一些特征工程。其中一些功能有效(以前的域名数),一些功能相关性很小(年龄组)。总的来说,我的模型有 12 个特征,包括比赛特征(季节,它卖完了吗,等等。)和个人特征(ultrasignup 运动员排名、性别、年龄等。).
建模 —在这种状态下,我实现了三个不同的模型,一个简单的逻辑回归、一个随机森林和一个来自 Python 的 scikitlearn 包的梯度增强分类器。我试图使用网格搜索方法优化每个参数。
结果 —正如预测的那样,梯度增强分类器产生了本研究的最佳预测。根据我的测试/训练划分,我使用 10 倍交叉验证获得了大约 0.67-0.70 的 AUC 分数。
Results from test data split
然而,由于 DNS 类别的高度不均衡性,AUC 分数具有误导性。在任何给定的种族域名系统中只有约 5%。由于比赛只有 100-250 名参赛者,这就造成了一种情况,你可以得到很好的分数(很难不去猜测 95%的参赛者中的大多数),但仍然会错误地分类那些实际上是 DNS 的参赛者。
It performed pretty well, but still only modeled a profit equivalent to a single race entry.
我用这个模型来看看它在我用来训练模型的比赛之外是否有预测能力。再一次,由于职业的平衡,我看起来有很好的结果,通过使用这个模型,我可以节省大约 250 美元。这相当于平均 100 英里比赛的一次报名费。
因此,如果我不能可靠地预测某人是否会出现在起跑线上,并且对赛事总监来说成本节约是最小的, 我能预测运动员是否会完成比赛吗?
预测 DNF 氏症
I DNF’d this race…wonder why? Not shown, second fracture in tibia.
大多数(如果不是全部的话)超跑者想知道他们完成比赛的实际机会。在确定我们的现实机会时,我们会查看 DNF 每年关于我们感兴趣的比赛的统计数据。许多 100 英里赛跑只有不到 50%的参与者跑完全程。
DNFs 的原因多种多样,包括:
- 受伤——无论是在比赛中还是在比赛过程中,我左边的受伤发生在比赛的第 5 英里
- 训练不足——很多时候人们不得不提前一年报名参加比赛。你永远不知道在比赛日之前的几个月里你的时间表会是怎样的,所以这导致生活妨碍了训练。
- 分界点——一些比赛有激进的中间分界点。由于各种各样的情况(天气、营养等)。)跑步者可能错过这些中间的一个终点,并被迫退出比赛。
我发现社区对预测他们是否能完成一场比赛的兴趣比赛事总监优化他们的赛事后勤更大。
因此,我做了任何好奇的超跑者都会做的事情,我使用我已经准备好的数据,创建了一个预测模型,用于完成模型中训练的一场比赛!
同样,梯度增强分类器在我运行的模型中表现最好。
我的 DNF 模型的 AUC 得分为 0.64,低于我的 DNS 模型的 0.67–0.70。然而,我认为这是一个很好的结果,原因有二:
- 它的表现好于 50/50,这是人们所希望的(我没有屏住呼吸)
- 与 DNS 模型相比,它在预测谁能完成 和 方面做得更好
另外,它给了我一个很好的借口来制作一个有趣的 webapp!
对于我用来训练模型的比赛,我能够将模型集成到 webapp 中,以计算完成比赛的条件概率,只要训练得当。除了种族特有的特征之外,我使用每个年龄和性别的平均表现来输入模型。
为此,我需要学习一点 Javascript/Ajax(使用 Django)来将 webapp 集成到我的 AWS 托管模型中。
总之,这是一个有趣的 2 周激情项目,圆满结束了我在镀锌的时间。我展示了我从业务问题开始,构建我的建模方法并在终端产品中部署结果的能力。
现在掷骰子看看我是否能在 11 月完成我的下一个 100 英里跑,里约德尔拉戈…
如果我有先见之明,用我的 DNF 模型训练这场比赛…
也许是时候做更多的网络搜集了!
阅读我在 Galvanize 的经历:https://medium . com/forward-data-science/galvanizing-my-skills-a4b4d 1175 cb4
关于我的项目的更多细节,请访问我的 Github 回购:https://github.com/ophiolite/ultrasignup
要使用 webapp,请访问:http://endurostew.com/
糖尿病预测——人工神经网络实验
原文:https://towardsdatascience.com/diabetes-prediction-artificial-neural-network-experimentation-f4267796443d?source=collection_archive---------5-----------------------
作为一名数据科学专业人员,我们倾向于学习所有可用的技术来处理我们的数据,并从中推导出有意义的见解。在本文中,我描述了我用神经网络架构对数据进行探索性分析的实验。
Source : http://legacymedsearch.com/medicine-going-digital-fda-racing-catch/
这里是到我的代码库的 github 链接,我已经用它进行了探索性的数据分析,所有的架构设计都在本文中提到。我使用过 Python 3.6 以及 Pandas、Numpy 和 Keras(tensor flow 上的后端)模块。
[## bmonikraj/神经网络-sklearn
神经网络-sklearn -神经网络在 pima 印度糖尿病数据集上的实现
github.com](https://github.com/bmonikraj/neural-network-sklearn)
这是我用于探索性数据分析的数据集的链接,来自 Kaggle 网站。链接中提到了列的数据描述和元数据。
Number of Observations : 768
Number of Features : 8
Input Neurons : 8
Output Neurons : 2 (Diabetic and Non-diabetic)
Test Data size : 20%
Train Data size : 80%
[## 皮马印第安人糖尿病数据库
基于诊断方法预测糖尿病的发病
www.kaggle.com](https://www.kaggle.com/uciml/pima-indians-diabetes-database/data)
首先,我创建了 关联矩阵 ,并使用 Seaborn 模块绘制了热图和 pairs 图(数据集的每两个特征之间的图),用于数据可视化。通过相互比较,关联图给出了关于特性依赖性的概念。相关性是任何数据集的双变量分析的一部分。
Correlation Matrix
下面是描述每个特征之间的二元图的配对图,也显示了每个特征的直方图。单元格[i,i]显示直方图,其中 I 是第 I 行/列。
Pair Plot and Histogram of the dataset (Only X)
从上面的直方图可以得出一个推论,很少有特征遵循标准或已知的分布,如高斯、瑞利等,这从图的形状可以明显看出。如果需要,这种假设在建立预测模型时会很方便,因为我们已经知道(或至少假设)了数据的分布及其数学公式。
Correlation Matrix including the target (Outcome) value
从上面的情节可以得出(因为相关分数高)**【结果-葡萄糖】对和【结果-身体质量指数】对是最相互依赖的。所以密谋与培生联合密谋培生会关注他们的行为。从下面可以看出,Outcome (Target)只有两种可能的结果。
Outcome — Glucose (Pearson Correlation)
Outcome — BMI (Pearson Correlation)
Glucose — BMI (Pearson Correlation)
根据第一个皮尔逊相关图,显然‘葡萄糖’与结果高度相关,这使得‘葡萄糖’成为最重要的特征。
现在这是最有趣的部分,实验神经网络的各种可能的架构。在深入这个问题之前,我想指出关于架构决策的几个关键点。
- 输入神经元数量=中的特征数量 X
- 输出神经元数量=目标中的类别数量
-
隐藏层> 0
- 隐藏层中的神经元数 1 ~ #隐藏层中的神经元数 2 ~ #隐藏层中的神经元数 3 …隐藏层中的神经元数量(如果架构有 N 个隐藏层)
- 隐藏层中的神经元数量~ #输入神经元| #隐藏层中的神经元数量~ 2 X #输入神经元
- 权重必须随机初始化
人工神经网络是最流行的机器学习算法之一,广泛应用于预测建模和构建分类器。目前,许多先进的神经网络模型,如卷积神经网络、深度学习模型,在计算机视觉、网络安全、人工智能、机器人应用、医疗保健和许多更先进的技术领域中很受欢迎。
驱使数据科学家使用人工神经网络的几个令人兴奋的事实是
- 适应并训练自己处理复杂的非线性问题。
- 灵活应对各种问题集。
- 从根本上兼容实时学习(在线学习)。
- 在大多数情况下,构建人工神经网络需要大量的数据和快速的 GPU 来进行计算
在这个程序中,在使用的每个架构中,输出层都由' softmax '激活函数激活。中间层由' relu 激活功能激活。
由于这是一个探索性的数据分析,所以所有的指标和图表都受制于这个特定的问题集。
单一隐藏层架构
Single Layer Architecture — Accuracy vs Neurons in Hidden Layer
在我们的问题中,对于隐藏层中任意数量的神经元(基于上图的强假设),应用单层架构产生了 64.28% 的饱和精度。
两个隐藏层架构
Two hidden layer architecture — X-axis : Neurons in first hidden layer, Y-axis: Nuerons in second hidden layer, Z-axis: Accuracy
在两个隐藏层架构的情况下,观察到类似的行为,其中准确度总是饱和到 64.28%。
多重隐藏层架构
Performance of classifier based on increasing hidden layers
既然我们正在讨论用神经网络进行探索性数据分析,我想提出几个需要记住的要点
- 激活函数的选择在很大程度上影响性能。基于实验、目标类型和我们正在处理的数据选择激活函数的明智决定很重要。
- 隐藏层中神经元的数量应该与输入神经元的数量相似。如果神经元的数量足够多,这可能会提高性能,但也可能会增加复杂性。为此要保持一种折衷。
- 使用带有反向传播的动量可以帮助收敛解,并实现全局最优。
- 在决定隐藏层的架构时,尝试不同的架构会有所帮助,因为每个数据集在不同的架构下可能会有不同的表现。
- 数据的大小很重要,所以尽量相应地选择数据大小。越大越好!
- 当网络从零开始构建时,网络权重的随机初始化是强制性的(没有像初始模型那样预先训练的权重)。
在神经网络之后,我应用了一些其他算法来测试数据集和性能。结果是这样的
关键要点
在每一个现实世界的问题中,构建以解决方案为中心的模型的第一步是执行探索性的数据分析。这将为问题建立合适的模型,该模型可进一步用于调整性能和有效地解决问题。
人工神经网络的探索性数据分析处理隐藏层和激活函数。先进的大数据问题、基于图像的问题和许多其他复杂问题现在都可以用卷积神经网络来解决 (CNN) 。深度学习已经被广泛用于许多复杂的研究问题,因为它能够从大数据中获得洞察力,在许多情况下跳过数据特征提取的过程 (CNN 可以直接对图像进行处理,无需任何特征提取)。计算机视觉应用中的 CNN 的另一个好处是保持图像的空间属性完整,这对于许多基于几何的计算和推理非常有用。
参考
- 探索性数据分析—https://www . ka ggle . com/etakla/exploring-the-dataset-bivariable-Analysis
- https://keras.io/
- 熊猫—【https://pandas.pydata.org/
- https://seaborn.pydata.org/
- 皮尔逊相关性—https://en . Wikipedia . org/wiki/Pearson _ Correlation _ coefficient
- 人工神经网络—https://www . tutorialspoint . com/artificial _ intelligence/artificial _ intelligence _ Neural _ networks . htm
使用 Fastai 库和 Turicreate 从手机捕获的显微图像中诊断疟疾
原文:https://towardsdatascience.com/diagnose-malaria-from-cellphone-captured-microscopic-images-using-fastai-library-and-turicreate-ae0e27d579e6?source=collection_archive---------7-----------------------
灵感:在读了卡洛斯·阿蒂科·阿里扎的一篇文章后,我偶然发现了疟疾数据库。
Colorized electron micrograph showing malaria parasite (right, blue) attaching to a human red blood cell. The inset shows a detail of the attachment point at higher magnification. Credit: NIAID
为什么要创建深度学习模型来预测疟疾?
疟疾是一种由蚊子传播的疾病,由不同种类的疟原虫引起。它不成比例地影响世界上资源贫乏的地区,导致生命损失和巨大的经济负担。根据 CDC 网站的数据,2016 年发生了 2.16 亿例疟疾,其中 44.5 万例是致命的。其中大多数是儿童。最初,感染疟疾的患者会出现类似流感的症状。在严重的情况下,患者可能会出现呼吸困难和昏迷。尽早诊断疟疾以防止疾病在社区传播是非常重要的。诊断疟疾的金标准是在显微镜下检查血涂片。将患者的一滴血涂在载玻片上,用姬姆萨染色剂染色。当在显微镜下观察时,这种染色会使寄生虫突出。诊断取决于染色的质量和读片人的专业知识。根据世卫组织协议,受过训练的医生/技术人员必须在 100 倍的放大倍数下观察 20 个微观区域。他们必须计算 5000 个细胞中寄生虫的数量。可以想象,这是一个非常费力的过程,而且容易出错。用于检测具有高阴性预测值的疟疾寄生虫的深度学习算法将使这一过程变得不那么繁琐,并节省医疗保健人员的宝贵时间。
数据库背后的故事
国立卫生研究院意识到了上述问题,并着手创建一个图像数据库。李斯特希尔国家生物医学通信中心(LHNCBC)的研究人员开发了一种移动应用程序,可以在标准的 Android 智能手机上运行,可以连接到显微镜上。在孟加拉国,这个应用程序被用来拍摄感染和未感染疟疾患者的血液涂片图像。后来,泰国的研究人员对这些图像进行了注释。从这些照片中分割出红细胞,并创建了最终的数据库。您可以了解更多相关信息,并在 https://ceb.nlm.nih.gov/repositories/malaria-datasets/下载数据集
NIH 集团提出的当前解决方案
NIH 的研究人员使用上述数据库,使用 AlexNet、VGG-16、Resnet-50、Xception、DenseNet -121 和定制的 CCN 创建了深度学习模型。他们使用“具有英特尔至强 CPU E5–2640 v3 2.60 GHz 处理器、16 GB RAM、支持 CUDA 的英伟达 GTX 1080 Ti 11GB 图形处理单元(GPU)、MATLAB R2017b、Python 3.6.3、Keras 2.1.1(具有 Tensorflow 1.4.0 后端)和 CUDA 8.0/cuDNN 5.1 依赖项的 Windows 系统来训练该模型。”获得的最佳性能指标大多来自 ResNet-50 模型。以下是统计数据
在 15k 迭代后,他们停止运行定制模型,验证准确性停止提高,大约需要 24 小时。国家卫生研究院的文章全文可在https://lhncbc.nlm.nih.gov/system/files/pub9752.pdf获得
为什么要创建另一个模型?
最初,我想修补数据,看看我是否能赶上他们的表现,并在这个过程中提高我的深度学习技能。
项目目标
1.创建一个深度学习模型,可以在不使用 GPU 的情况下匹配 NIH 解决方案的性能。
2.创建一个小得多的模型,这样它就可以部署在手机上。
3.创建一个比 NIH 团队发表的论文中提到的性能指标更好的模型。
4.使用 Fastai ad Turicreate 减少迭代次数和训练时间,但保持性能。
5.开放源代码,这样其他人可以复制我的实验。
为什么图瑞创造?
turcreate是苹果公司的一个机器学习平台。Turicreate 可用于在笔记本电脑上创建深度学习模型,无需使用 GPU。如果 GPU 可用,也可以利用它来提高训练时间。即使没有 GPU,Turicreate 也可以在更短的时间内生成模型。您可以使用几行代码创建最先进的模型。创建的模型可以很容易地部署在 iOS 设备上。它也可以作为 web 服务来部署。
创建统计数据
SqueezeNet 型号小于 5mb。ResNet-50 也进行了尝试,没有看到太大的性能差异。点击此处访问 Github repo 上的源代码。
为什么 Fastai ?
Fastai 是一个深度学习平台,因杰瑞米·霍华德教授的在线课程而走红。新的 fastai 库可以用来用几行代码创建最先进的模型。Fastai 可以在谷歌的 Colab 上运行,Colab 提供免费的 Telsla K80 GPU,每次运行 12 小时。通过结合 Fastai 和 Colab,世界各地的任何研究人员都可以利用免费的 GPU 在更短的时间内创建模型,而不会产生任何成本。
Fastai 模型的完整代码可在这里获得。
Fastai 模型可以作为 web 服务部署。点击此处了解更多信息。
Turicreate、Fastai 和 NIH 方法的比较。
最佳统计数据以粗体显示。(请参见下面的附录)
*NIH 统计数据来自不同的模型。总的来说,NIH 研究中表现最好的模型是 ResNet-50 和 VGG-16 模型。
基于此,Fastai 模型赢得比赛!Mathews 相关系数被认为是具有二元结果的医学测试的最佳度量,Fastai 模型具有最佳 MCC。Turicreate 仅用了 13 分钟就创建了模型,而且性能不相上下。NIH 做了 5 倍交叉验证,我没有对我的模型做这个。如果有兴趣,可以看 NIH 的文章,做 5 折交叉验证。如果你有,请在下面张贴你的回复。
2018 年 11 月 13 日增编
今天,我给 NIH 研究的通讯作者 Sivaramakrishnan Rajaraman 发了电子邮件。他向我指出了细胞水平的指标以及与 Fastai 的精确比较。Rajaraman 博士制作的表格附后。
未经加工的钻石…行动号召
原文:https://towardsdatascience.com/diamonds-in-the-rough-call-to-action-90c01e0952ed?source=collection_archive---------15-----------------------
如果你一直跟随我的旅程,你知道过去的 12 个月是旋风!
我改变了我的职业轨迹,提高了我的编码技能,获得了我的第一份“正式”数据科学工作(我认为我的整个职业生涯都在做数据科学),并反思了我在第一个咨询项目中吸取的教训。然而,到目前为止,这个系列的 仅仅触及了我希望促成 的讨论的表面。
我为社区准备了 两个重要问题 :
什么是数据科学的优秀候选人?
那些没有“传统”轨迹的人如何在就业市场中成功定位自己?
这些都是加载题,超载了!
我详细讲述了我是如何获得第一份数据科学工作的。这听起来直截了当,合乎逻辑。不应该吗?我们是数据驱动的人,逻辑是我们的面包和黄油。
不是的。简直是闹剧。
它要求我…
…投入了大量的辛勤劳动、汗水和(有时)泪水。
…花 6 个月的大部分时间远离我的配偶、家人和家,以确保我们在西雅图的未来。
…在第 n 次瞬间失去领先优势后,我重新振作起来。
…当我觉得自己已经没什么可付出的时候,我有一个奇妙的支持网络来鼓励我继续努力。
然而,我仍然很惊讶…
…每次我冷淡地申请职位时,我的简历得到的关注是多么少。
…尽管我有关系,但我得到的牵引力很小。有时候,我接到一个电话,但其他人去了巨大的无底邮件坑。
我认为自己很幸运。在高度不确定的情况下,我有独一无二的机会去冒险。
我有…
…资源
…灵活性
…坚韧
像我这样的大多数人没有这些奢侈品,特别是资源和灵活性。大多数人无法提升并穿越他们的国家重新开始。许多有能力的人不会因为失败的风险而放弃。
我们如何…
- 因为数据科学家有这些困难的对话来承认职业道路的多样性?
- 让人力资源和招聘经理参与进来,在招聘实践中跳出框框?
- 从其他行业的实践中成长和学习而不是嘴上说说?
我们知道,在任何业务的核心,多元化都是必不可少的。
种族、民族、年龄、性别、性别认同、文化或社会经济背景的多样性...都是我们在谈到多样性时会想到的特征。
然而,在我的职业生涯中,一家公司能够从多元化实践中获得的最大收获是 思想上的多元化 。
所有部分的总和才是真正让我们成为组织资产的东西。
实际上很难完成这项任务。
让我们面对现实吧,尽管有增加人数的举措,但在科技行业的技术岗位上,女性的数量仍然远远超过男性。**
很贵…
筛选软件的好坏取决于它的训练集。凭借历史训练集的狭窄搜索窗口,来自非传统行业的高素质候选人将被筛选出来。
这要求认真对待多元化的公司开始拓宽筛选窗口,多看简历。工时可不便宜。然而,发现“未经雕琢的钻石”的 红利是无价的 。
作为数据科学家,我们有责任不断改进用于整理简历的算法。这对我们自己的立场尤其适用。
要么需要增加筛选容限,要么训练集需要来自更多样化的候选集。
我看待问题的方式与软件工程师不同。部分原因是因为我的地球科学背景和在能源行业的经验。然而,这不应被视为一个净负面因素。这是一个净正数。为公司面临的深层次问题和难题寻找创造性的解决方案。也就是 无形价值增加到任何组织 。
为什么我们不能让 超越 仅仅解决和改善技术领域的性别和种族平等?难道我们不能超越传统的技能和背景来提高多样性吗?一个不能引向另一个吗?
通过将数据科学家的搜索范围扩大到拥有大量技术经验的典型 CS/软件工程师之外,公司将受益于思想的多样性,但也将开始通过引进和吸引其他行业的女性人才来实现性别平等。
行动号召—
对于那些在招聘过程中负有责任的读者:
作为处于职业转折时期的求职者,我们能做些什么来最好地脱颖而出呢?
我/我们如何以建设性的方式促进这一讨论,以推进我们的职业发展和贵公司?
你如何在内部推动卓越,以创造更多不可知的工作描述来解释我们的经历?
对于求职者和候选人:
你在转换职业轨迹和行业时面临的最大的挣扎是什么?
关于你是否适合手头的职位,你希望招聘人员知道的一件事是什么?
有哪些让你的声音被听到的成功策略?
你在打造个人品牌方面取得了哪些成功?
数据科学依靠创造力与科学的结合来提供有影响力的产品和见解。
让我们以有益和建设性的方式继续讨论。做个吱吱响的轮子,大声说出来。请公开或私下与我分享您的反馈。我希望在未来的系列中纳入所有反馈,更深入地探讨数据科学/分析领域的多元化和招聘主题。
也就是说,这是我的职业支点系列的第 8 集,也是最后一集。与此同时,我将过渡到专注于营销分析以及一些有趣的数据科学副业的职位。
补上这部剧之前的参赛作品:第一集、第二集、第三集、第四集、第五集、第六集、第七集
要想快速了解为什么多元化对商业有益,请看麦肯锡的这篇文章。
要全面了解如何雇佣优秀的数据科学家,请查看乔纳森·诺利斯在 Lenati 发表的关于雇佣数据科学家的系列文章。我们的小团队目前拥有从数学和工程到地球科学和商业管理的学位,并且 40%是女性。
Booking.com 数据科学家的日记
原文:https://towardsdatascience.com/diary-of-a-data-scientist-at-booking-com-924734c71417?source=collection_archive---------6-----------------------
由 Booking.com 高级数据科学家 西康德
招聘
大约两年半前,我作为一名数据科学家加入了Booking.com**,此前我在迪拜从事了 3 年的咨询工作。从咨询转向纯粹的数据科学角色是我职业生涯中的一个重大转变,事后看来,我很高兴自己做出了这个选择。事实上,我在面试的时候就已经对这家公司印象深刻了。我最喜欢的是,我接受了已经担任相同职位的同事的面试,这让我在面试过程中有了许多【质量】互动,并再次证实了招聘人员的说法,即该公司有一个【平级结构】。面试官的背景也非常多样化和有趣——一个拥有天文学博士学位,另一个是自己创业公司的首席技术官。**
虽然我必须诚实,但办公室(以及阿姆斯特丹)的美味午餐也对我的决定产生了相当大的影响:)
上车
我还记得我第一天上班时,我的同事问我-' 你觉得你的屏幕怎么样?’。我不知道该说什么,因为我以前只在一台笔记本电脑上工作过。然后,我有了一台 Mac 笔记本电脑、两个大屏幕(主要是为了展示我的代码,让非技术观众留下深刻印象)和许多其他很酷的小工具。我已经准备好用我新的数据科学家头衔征服世界🤓。
不久后,我得到了我的第一个入职项目,其中涉及分析大量的文本,并产生一些商业见解。以前,我只有结构化数据方面的经验,所以我对这一新挑战感到兴奋。我一头扎进去,设法提高自己的技能,用文本数据做有意义的分析,但没过多久我就碰壁了:'Booking.com数据** '。****
Booking.com每 24 小时售出超过 150 万间客房,数百万人在任何给定时间浏览网站,这意味着我们作为数据科学家接触的所有数据的规模非常大。幸运的是,有一个关于使用 Spark 的分布式计算的内部培训。我立即拿起它,瞧,我的分析现在在多台机器上运行。**
项目
Booking.com Data Scientists presenting their projects at Analytics Fair
我的第二个项目是为我们的合作伙伴网站建立一个推荐相关机会的‘推荐引擎’。这也是非常令人兴奋的,因为以前我只做过标准的回归和分类模型,所以我渴望做一些新的东西。那是我第一次接触到协作过滤和因式分解机器的迷人世界。同样,由于规模的原因,我不得不在 PySpark 中使用稀疏分布矩阵来实现这个解决方案。然后我生产了代码,我们开始了 A/B 测试,看看它是否对我们的业务有积极的影响。这也是我的第一次 A/B 测试经历,但幸运的是,由于 我们出色的实验工具和围绕它的基础设施 ,设置起来并不困难。在几次迭代中,我们也能够处理冷启动问题,我很高兴我成功地完成了另一个项目。**
接下来是一个有趣的项目组合,每个项目都有自己的挑战,需要我作为一名数据科学家保持警觉并不断学习。例如,其中一个项目要求我将业务问题表示为加权网络图,并对其进行有趣的分析;而对于另一个项目,我不得不戴上顾问的帽子,通过从简单的数据分析中产生有意义的见解来验证一个重要的战略决策。
一晃两年半过去了,我现在是 Booking.com**的高级数据科学家。挑战的程度只会变得更好,因为现在我正在开发一个人工智能(AI)产品“机器翻译”,并部署神经网络和深度学习解决方案来 建立一个生产中的全面系统 。虽然机器翻译是一个活跃的研究课题,最近取得了一些突破,但我们仍然坚持业务优先的人工智能方法,专注于它如何帮助我们的客户。我很想多谈谈这个特殊的话题,但希望这是另一篇博文。****
团队结构
简单介绍一下数据科学家如何在组成团队;我们有一个我们称之为‘嵌入式’的结构,其中数据科学家与业务紧密结合。例如,我在一个由开发人员、数据科学家、产品负责人和其他专家组成的团队中。我们以这样一种方式形成,所有的能力都在团队中表现出来,以执行一个想法从概念化到实施。对于我们的日常运营,我们遵循'预约敏捷要点'的处方:每日站立、回顾、待办事项、团队目的、KPI 和 okr(目标和关键结果)。这与两周一次的 sprint 会议一起,使团队能够在小步骤中取得进展,并展示价值,或者失败,并尽快学习。********
正是因为与业务的密切互动,作为【Booking.com的一名数据科学家,人们期望他在沟通和商业意识方面表现出色,并具备技术技能。这些是我们在工作面试中测试的基本技能。
这份工作最棒的地方是人
Booking.com Data Scientist Community during weekly Analytics Talk
Booking.com拥有 120 多名数据科学家,这个社区每天都在扩大。我们每个人都有非常不同的个人资料、背景和工作偏好。对一些人来说,这是他们获得博士学位后的第一份工作,而其他人则有很多工作经验;有些是贝叶斯主义,有些是频率主义者;有的喜欢 R,有的更喜欢 Python 一些人强烈支持核外学习(Vowpal Wabbit),而另一些人则更喜欢使用 Spark 和 H2O 的分布式计算。这种多样性允许不断成长和相互学习。我们每周都有会议,比如分析讲座、期刊俱乐部等等。获得同行对分析的反馈,并讨论如何将最新研究论文中的观点应用于解决 Booking.comT21的实际问题。此外,人们自愿定期提供技术培训,主题包括 A/B 测试、Git、Hive、Python、R、Spark、H2O、TensorFlow 等。
对我来说,“人和社区”是这份工作最好的部分,因为它让我每天都能学到新东西,并从中获得乐趣。
一些挑战
像每一个成长中的数据科学实践一样,我们也面临一些挑战。
- 首先,由于我们的数据科学社区发展如此之快,有时很难以可扩展的方式分享知识。为了解决这个问题,我们不断尝试不同的形式,比如关于专业话题的谈话(比如 NLP),电子邮件,黑客马拉松等等。了解在我们成长的每个阶段分享知识的最佳方式。
- 嵌入 数据科学家接近商业也有其弊端。有时,我们在日常工作中会错过批评和友好的同事反馈。为了应对它,我们鼓励每个人经常展示他们的工作,并与同行讨论他们的最新项目。我们还有一个针对新员工的导师计划。
- 尽管我们已经对社区做出了多次贡献(您可以在这里 和 这里 找到我们的一些出版物和演讲),但在更多地向外界分享我们的一些知识和最佳实践方面,我们肯定可以做得更好。我们目前正在围绕这个问题制定一些指导方针。
我认为好的一面是,我们认识到了这些和许多其他挑战,并有专门的“任务组”来研究潜在的改进领域。
最后,我可以说,作为 Booking.com 的一名数据科学家,没有一刻是无聊的!!
Booking.com Data Scientists enjoying Amsterdam summer on a boat after office
这听起来让你兴奋吗?你也想成为 Booking.com 的数据科学家吗?来和我们一起工作吧!
此外,点击 查看更多来自 Booking.com的数据科学文章。
感谢帕维尔·莱文、帕布鲁·埃斯特维斯、卡西·希勒比和索菲·比丁在文章发表前提供了宝贵的反馈。
Google Duplex 打败图灵测试了吗?是也不是。
原文:https://towardsdatascience.com/did-google-duplex-beat-the-turing-test-yes-and-no-a2b87d1c9f58?source=collection_archive---------2-----------------------
谷歌推出了一种可以通过电话预订的人工智能。图灵测试最终通过了吗?
尽管谷歌在语音人工智能领域取得了突破性的成就,但谷歌人工智能没有通过图灵测试有两个原因(在我看来)。然而,仍然有好消息。
如果你喜欢这篇文章,想分享你的想法,问问题或保持联系,请随时通过 LinkedIn 与我联系。
什么是 Google Duplex?
上周在 I/O 期间,科技巨头谷歌首席执行官在年度开发者大会上公布了他们最新的语音技术,这是一种听起来像人类一样的人工智能。人工智能与谷歌助手一起使用,谷歌助手是亚马逊 Alexa 的竞争对手。在 7000 名与会者面前,人工智能给一名发型师打电话预约。人工智能的声音和人类的声音是无法区分的。人工智能有时会在回应前停顿一下,拉长某些单词,就好像它在为事情争取时间。它甚至使用人类的口头标记,如“嗯”和“呃”。
被叫去的理发师没有意识到她不是在对一个人说话,而是在对一个复杂的神经网络的输出说话。最终,在惊讶的观众面前,人工智能成功地完成了任命。目前,人工智能将主要用于通过电话代表你预约和预订。
什么是图灵测试?
图灵测试是评估机器智能的一种方式——要通过测试,人工智能必须以人类无法区分的方式表现。这项测试是由艾伦·图灵在 1950 年发明的。图灵提出,人类评估员将判断人工智能和人类之间的自然语言对话。人类将意识到两个对话参与者之一实际上是机器的事实。但是他不知道机器是参与者中的谁。
在谈话过程中,所有的参与者都会被分开。最后,如果评估者不能可靠地区分人和人工智能,人工智能将通过测试。应该注意的是,该测试并不检查对问题给出正确答案的能力。只是答案与人类给出的答案有多相似。
谷歌通过图灵测试了吗?不,但是…
首先让我说说为什么在我看来图灵测试没有通过。
进行测试的错误条件
如果你逐字逐句地理解测试的定义,首先我们不具备进行图灵测试的合适条件。为什么?因为观众(测试的评估者)确切地知道机器是两个对话参与者中的哪一个。根据图灵测试,评估者不应该知道这个事实。
诚然,这是一个无力的论点。一开始没有被告知这两个参与者身份的人可能看不出区别。因此,让我提出另一个相反的论点。
缩小谈话话题
人工智能和人类之间的对话被缩小到一个特定的话题——预约。人工智能可以对与预约相关的问题给出任何答案。一旦人类将对话引向完全不同的方向,人工智能就会失败。原因是人工智能只在与约会相关的真实世界对话中接受训练。AI 可以回答 AIs 用户希望约会在哪个日期和时间没有问题地进行。然而,人工智能会被一个问题淹没,比如“为什么你更喜欢我们做你的发型设计师?”。真实世界的对话可以在任何时候向任何方向转换。只要人工智能不能参与关于任何话题的普通对话,图灵测试就不会通过。
然而,…
在预约领域,我认为人工智能通过了图灵测试。考虑到人工智能所基于的神经网络仅在六年前首次实际实现,这是人工智能领域的一项巨大成就。
在未来的 10 年里,我们不可能没有一个通用的对话式人工智能,它可以用任何语言和任何人谈论任何可能的话题。
梅拉尼娅真的发微博了吗?
原文:https://towardsdatascience.com/did-melania-really-tweet-that-d8038e91e67f?source=collection_archive---------13-----------------------
我的模特说。
You are what you tweet. Wordclouds formed from the most significant words in the POTUS (orange) and FLOTUS (cyan) tweet corpora. (Want to make wordclouds like these? Use this code example that shows how to do masking and custom colorization.)
M 埃拉尼亚回来了!在离开公众视线 24 天后,她于本周早些时候出席了白宫的一个仪式,或者至少她的替身出席了。;)
她的缺席引起了媒体的诸多猜测,她在 5 月 30 日的推特上对此进行了回应。
The mystery tweet.
问题是这条推文并没有平息对她行踪的猜测,因为听起来不像她的。语气异常愤怒,听起来更像特朗普。(或者至少听起来更像特朗普的人,而不是她的人。)
这让我想起了上世纪 90 年代围绕谁写了《原色》( Primary Colors)这本书的谜团,这是一部几乎不加掩饰的小说——对一些人来说太单薄了——背景设在克林顿白宫。一位自称为“法医语言学家”和“词形学专家”的瓦萨文学教授声称是专栏作家乔·克莱因写了这本书。后来克莱恩承认了。
这位教授对他推断作者身份的精确方法持谨慎态度(他的错误和正确一样多),但这与计算词频有关。(想起什么了吗?)
这一切启发我进行了一个快速的 Python 实验,试图回答到底是谁写了上面这条愤怒的推文。
第一步:获取数据
Twlets.com 让这一步变得非常容易。你安装一个 Chrome 应用程序,访问你想要的 Twitter 用户页面,点击工具栏图标下载。
在你遇到付费墙之前,你可以下载的推文数量是最大的,但它足够高,我可以下载所有官方的波多黎各和 FLOTUS 推文。
一个障碍:数据不平衡
截至几天前,梅拉尼娅在她的 FLOTUS 官方账户上只有 307 条推文,而特朗普在他的波多黎各账户上有 3259 条推文。
从图形上看(只是为了好玩),这种不平衡看起来像这样。
All POTUS/FLOTUS tweets plotted after TF-IDF vectorization and PCA dimension reduction (we’ll get to all that below).
唐纳德的橙色弹珠太多了,而梅拉尼亚的青色弹珠太少了。超过 10 比 1 的不平衡。
像这样的不平衡很难衡量开发中的模型的准确性。考虑到这种不平衡,最简单的模型是,在默认情况下,将所有输入分类为属于特朗普阶级,即多数阶级。
梅拉尼娅的所有推文都会被这个简单的模型错误分类,但你仍然会有比 91% 更好的准确率。
然后我们需要制作一个比 91%更精确的模型。我不确定我们能否完成这个小实验,但这将是我们的目标。
(更好的办法是平衡数据。如果我再次这样做,如果我没有通过 Twlets 浏览我的免费推文下载,我会将一些梅拉尼娅的个人推文与她的官方推文混合在一起,以便我们有多少梅拉尼娅样本就有多少川普样本。我将把这项工作留给未来的研究人员。)
步骤 2:清理并分割数据
在矢量化之前,我们需要从 tweets 中删除特殊字符和大写字母。我只是使用了在许多 Github NLP repos 中找到的名为 clean_str 的简单函数,例如这个。
我将 85%的数据用于训练,剩下的 15%用于测试(在这个小实验中,我没有使用开发套件)。这给了我一个包含 2769 个样本的训练集和一个包含 489 个样本的测试集,每个样本都是特朗普和梅拉尼娅推文的随机组合。
我们将从训练集和测试集中保留谁是作者的问题。在这个练习的最后,我们会要求对它进行预测。
第三步:向量化数据
我们需要将这些推文中的单词转换成数字,这样我们就可以输入某种分类器。
我尝试了两种矢量化技术,一种旧的,一种新的。
术语频率-逆文档频率(TF-IDF)
这项技术始于 20 世纪 50 年代。那位 90 年代追随乔·克莱因的瓦萨大学教授可能已经掌握了这种技术,而且几乎肯定利用了这种技术。
TF-IDF 的维基百科定义很容易理解:
tf-idf 值与单词在文档中出现的次数成比例地增加,并被该单词在语料库中的频率所抵消,这有助于调整某些单词通常出现得更频繁的事实。
因此,一个单词在文档中出现的次数越多,它的得分就越高。但是如果同一个单词在所有文档(语料库)中也是常见的,则我们从该分数中减去。这剔除了非常常见的单词(冠词、介词、动词变化等)。),让我们在给定文档中的重要单词方面得到高分。
这是在介绍中用来制作漂亮的文字云的技术。每个单词都代表特朗普或梅拉尼娅的一条完整的推文。选择这个词是因为它在推文中的所有词中具有最高的 TF-IDF 得分。
Python 中的 sklearn 库使 TF-IDF 矢量化变得非常简单。在几行代码中,我们可以将训练集变成一个大的稀疏数组,其维数等于样本数 X 特征数。这些特征中的每一个都代表出现在语料库中某处的一个单词,用 TF-IDF 分数表示。
对于大多数文档,大多数特征将具有空值,因为相关联的单词在文档中没有出现。非空特征表示出现在文档中某处的单词,根据它们在给定文档中相对于较大语料库出现的次数进行加权。
这些数组是任何模型都可以咀嚼的谷物。该模型可以是老式的支持向量机(SVM)或新式的神经网络、卷积神经网络(ConvNet)或递归神经网络(RNN)。
单词嵌入矢量化
TF-IDF 基本上是单词计数。它没有抓住意义。单词嵌入试图捕捉意思。
解释起来很复杂,但是这个帖子做得很好。要点是深度学习技术可以用于将整个单词语料库消化到低维嵌入矩阵中。这个矩阵将和语料库中的单词数一样宽,但是高度减少到 100 或 300。如果有足够多的单词,它几乎会神奇地保留单词使用的上下文。
如果我们用一个单词查询保存这个矩阵的模型,我们将得到它的 100 或 300 高的列向量。这些是模型为这个特定单词学习的嵌入。
在文档的情况下,比如我们的 tweet,我们可以查询 tweet 中每个单词的模型,然后做一些简单的事情,比如平均向量,以创建最终的输入。
警告:我们需要大量的单词来正确地学习嵌入
Gensim 库使得学习 Python 中的嵌入变得很容易。
问题是我们的训练语料库很小(7583 个单词)。这意味着它在语义上是非常愚蠢的。
如果我们问模型类似的词,比如说,“媒体”(是的,你可以用这种模型来做!),它返回给我们一些语义上不太相关的结果。
不过,最酷的事情是,我们可以加载已经输入了非常大的语料库(比如维基百科页面)的预训练模型。如果我们这样做,我们会得到语义相关的结果
步骤 5:训练几个分类模型
我们已经把单词变成了数字特征。我们可以使用这些特征来训练任何我们喜欢的分类模型。我使用 sklearn 的随机梯度下降(SGD)分类器,因为我想做一些超快速的训练,但是,同样,你也可以使用更高级的东西(比如说 ConvNet)。
让我们在 TF-IDF 稀疏矩阵和预训练的单词嵌入向量上训练 SGD 分类器。
步骤 5:测试分类模型
我们现在已经有了几个训练好的分类模型。让我们把测试样本扔给他们,看看他们表现如何。请记住,我们想要比我们的基线 91%更好的准确性。
基于 TF-IDF 的分类
我们对测试样本进行 TF-IDF 矢量化处理,将它们提供给 SGD 分类器,然后对照真实标签评估预测结果。
95.09%!不惊人,但比我们的基线要好。这是用旧的技术。
基于单词嵌入的分类
使用语义更智能的输入功能的新技术怎么样?
只有 88.75%。事实上比我们的基线还要差。特征的语义上下文对我们的分类挑战没有太大帮助。而且,如果你浏览一下互联网,你会看到相当多的帖子(比如这个这里)在这些帖子中,老式的 TF-IDF 击败了新的技术。
第六步:回答我们的研究问题:梅拉尼娅到底有没有写那条推文?
我们有一个超过基线精度的分类模型,另一个没有。让我们问问他们俩,他们认为是谁写了这条推文。
第一,TF-IDF 美联储模式。。。
我们对有问题的单个 tweet 进行矢量化,并得到预测。
注意,从输入推文的打印输出来看,它被标记为“1”,所有 Melania 推文也是如此。
但分类器预测它的标签为“0”,这意味着它认为是特朗普写的。
从打印的对数概率中,我们可以看到它说有 71.08%的可能性他做到了。
性能较低的网络呢?我们并不真正信任它,因为它的准确性低于基线,但不管怎样,我们还是要问一下。
又是特朗普,这次有 90.74%的把握。
结论
对这一切有很多警告。
- 我们的数据是不平衡的,这也许使我们的模型更有可能预测特朗普,即使是梅拉尼娅的输入。(现在是混乱矩阵的时候了,但这已经够长了。)
- 根据训练集的随机化和为分类模型选择的超参数,我偶尔可以得到预测,即梅拉尼娅,而不是特朗普,是这条推文的作者。
- 我们正试图根据一个很小的单词样本(42 个左右)来确定作者。
简而言之,这些在法庭上都站不住脚。这对数据爱好者来说意味着乐趣。
我们可以肯定的是,许多人(包括我在内)的直觉认为这条推文听起来不像梅拉尼娅的推文,一个相当准确的模型产生了支持这些直觉的数据点。
国歌抗议导致你的地区运动队输了吗?:统计分析
原文:https://towardsdatascience.com/did-national-anthem-protests-cause-your-area-sports-team-to-lose-a-statistical-analysis-1f3dbf0245ae?source=collection_archive---------8-----------------------
上周,特朗普总统在阿拉巴马州的一次集会上发表了明确的讲话,他建议 NFL 球员应该被解雇,因为他们在国歌期间跪下抗议。NFL 球员的反应非常热烈——本周末有超过 200 名球员抗议。
昨天,右倾犯罪预防研究中心主席约翰·r·洛特在福克斯新闻频道发表了一篇文章,概述了他对这些抗议活动的统计研究。他得出结论,在 2017 年 NFL 赛季第 3 周,抗议的球员数量和球队的表现之间存在“巨大的、具有统计意义的”关系。洛特先生好心地公布了他使用的数据和他的回归结果。在本文中,我将检验洛特先生的分析,并提供我自己的观点。这将不是一个关于抗议国歌的好处的帖子,而是一个关于统计意义的帖子。
Tl;dr;这种关系没有统计学意义。洛特先生的分析包含许多统计谬误。所有的 R 代码都可以在 这里 找到。
初始回归模型
洛特先生提供的数据包含了 NFL 赛季第三周的比赛。它详细列出了截至周四和周日每支球队的抗议者人数、每场比赛的比分以及每场比赛的投注线。
该分析包含线性回归模型。该模型旨在预测一个比较主队表现与价差的指标。如果一个主队以 7 比 10 获胜,这个标准将会得到 3 分。该模型使用了一个变量来比较客队和主队抗议数量的差异。如果主队有 20 名抗议球员,而客队有 10 名,这个指标将是-10。
我在 R 中复制的模型产生了以下结果:
该模型包含 0.38 的 R 平方值。这个数字应该解释为主队表现 vs 的 38%,价差可以用各队抗议球员数量的差异来解释。该指标的 p 值为 0.02。统计显著性的标准经验法则是 p 值最大为 0.05(p 值越低,统计显著性越大)。出于这个原因,洛特先生说他的结果在统计学上是有意义的。
视觉分析
进行简单回归分析(使用单个预测值的分析)时,可视化数据总是很重要的。
查看这些数据时,您可以看到有轻微的下降趋势,但这并不完全是线性关系,回归线不会与数据紧密吻合。
统计谬误
这一分析中犯下的第一个统计谬误是目标变量(相对于价差的主队表现)。在这一分析中,洛特先生指出
“我们利用特朗普发表第一次言论的前一天,即周四的点差,预测了这些球队在周日的比赛中可能会如何发挥。之所以在周五之前这么做,是因为下注者可能已经知道特朗普制造的冲突可能会如何影响球队的表现,因此在周日之前就已经出现了价差的变化。”
从表面上看,这似乎是一个非常合理的选择。
这张图表展示了几个有趣的项目。抗议球员与他们的对手匹兹堡钢人队之间差异最大的球队,在投注线方面没有变化。许多抗议的玩家没有在比赛前宣布他们的抗议意图,所以赔率制定者在设定界限时没有办法将这些抗议考虑在内。
另外两个(在我个人看来,更相关的)原因是受伤和下注。NFL 球队密切关注哪些球员将参加比赛的信息,这些信息通常直到周日才公开。如果一名关键球员被排除在外,周日早上这条线可能会移动一两个点。此外,投注线可能会因投注的数量而变化。如果一个队得到了不成比例的赌注,线将从该队移开。
这一分析中最惊人的统计谬误是样本量。这个模型只适合于十三个数据点。这是一个危险的小样本量,并且由于它对每个单独的数据点的极端敏感性而导致不稳定的模型。在洛特先生的分析中,他从未向读者展示过这个缺点,尽管作为一名经济学博士,他肯定意识到了这一点。
选择合适的目标变量
读到这里的 NFL 爱好者可能已经意识到事实上在过去的一周里有超过 13 场比赛。这个统计模型已经删除坦帕湾-明尼苏达比赛被删除,由于缺乏周四投注数据。
当对如此小的样本量进行回归分析时,建模者应该不惜一切代价避免删除数据点。出于这个原因,周日博彩线应该是目标变量。上一节中的图表表明,抗议玩家的数量和投注线的变化之间没有关系。
坦帕湾有两名抗议球员,而明尼苏达没有。坦帕湾输了 17 分,尽管他们被看好 3 分。直觉上,人们可能会认为这将支持洛特先生的结论,即更多的抗议玩家会导致更差的表现。当我使用周日博彩线作为目标变量时,模型变得相当弱:
这里的 R 平方下降到 0.30,p 值增加到 0.042,接近被认为具有统计显著性的最大值。这证明了 14 个数据点的回归模型是多么不稳定。
美国队呢?
如果没有达拉斯牛仔队,涉及 NFL 国歌的统计分析将是不完整的。达拉斯和亚利桑那的比赛在周一晚上进行,我猜洛特先生在这场比赛结束前已经完成了他的分析。在国歌响起之前,整个达拉斯牛仔队跪在地上,以示团结。虽然从技术上讲,这不是在国歌演奏期间,但这样做的决定会像在真正的国歌演奏期间跪下一样分散团队的注意力。出于这个原因,我把所有 53 名达拉斯牛仔队队员都列为抗议队员。他们的对手,亚利桑那红雀锁定武器,但他们没有跪下抗议。当添加单个数据点时,模型完全崩溃:
R-square 已经下降到 0 . 11,我们的预测变量的 p 值已经增加到 0 . 22,大大高于被认为具有统计显著性的阈值。一个不支持原始结论的单一数据点破坏了洛特先生的“统计显著”关系。
结论
当像这样的文章发表时,在考虑结论之前回顾所用的方法总是很重要的。我赞赏洛特先生以透明的名义公布数据和回归结果,我希望这一回应能够引发关于新闻业负责任的统计数据的更大讨论。
洛特先生犯了统计学中一个不幸的普遍做法,p 值钓鱼。他的样本太少,甚至无法考虑一个会减少分析数据量的目标变量。他没有让读者意识到他的模型对于新的数据点是多么的不稳定和敏感。他声称抗议的影响“巨大且具有统计学意义”,意在欺骗。限制样本量的选择没有在专栏文章中披露,只是在统计方法部分披露了。
不幸的是,福克斯新闻频道的编辑完全让公众失望了。他们没有进行任何基本的统计审查或审查,并允许这种统计上无效的分析流传。
*我为本文编写的所有 R 代码都可以在这里找到
饮食经济
原文:https://towardsdatascience.com/diet-economy-8b5728346f1d?source=collection_archive---------9-----------------------
在过去的几年里,我一直对食物消费的问题感兴趣。我们如何吃得健康又便宜?我决定看看我目前的饮食,看看它是如何累积的。幸运的是,我的饮食很简单。我在家坚持做 3 或 4 道菜,使用几乎相同的材料,因为多样化很贵。我的大部分膳食都是素食,以某种谷物为基础,加入蔬菜、豆类、鸡蛋和奶制品。我几乎只在 Trader Joe's 购物,因为价格和选择都很合理,而且我很喜欢好的品牌。所以很容易计算出我的饮食是否合理和/或划算。我的目标是获得我平均每周摄入的所有营养数据,看看它与推荐量相比如何。有什么我还没看够的吗?有什么我可以不要的吗?然后:我的饮食划算吗?有没有我可以吃的东西能以更便宜的价格获得同样的营养?以及其他诸如此类的问题。
我们如何决定一个人需要多少营养?维基百科总结了由美国医学研究所(IOM)发布的推荐每日营养摄入水平的不同指标,称为膳食参考摄入量:
- 预计平均需求量(EAR ),预计可满足 50%人口的需求;
- 国际移民组织食品和营养委员会预计可满足 97.5%的人的需要的推荐膳食供给量(RDA);
- 充足的摄入量(AI),这是 RDA 的一个宽松的替代品;
对于这个练习,我使用 RDA(或 AI ),因为它更可能适用于我,并且 IOM 给出了宏量和微量营养素的 RDA/AI。
为了计算我的摄入量,我起草了一份我一周内所吃的典型食物的电子表格,并从标签上的营养成分表或从美国农业部食物成分数据库输入所有的营养信息。其中大部分是原料或产品,如蒸粗麦粉、大米、牛奶、奶酪、茄子、土豆、洋葱、香蕉,还有一些工业加工的东西,如蔬菜酱、泡菜、醋渍甜菜、辣酱,还有我非常喜欢的茄子酱。(最近,当我不能回家做饭时,我也开始每天喝一瓶Soylent——这有助于简化事情,因为 Soylent 的量正好涵盖了我们日常饮食中所需大多数营养的 20%。Soylent 上的全部营养信息在这里。)
经过几个小时无聊的数据输入,我得到了这张图表!(预览下面用红色突出显示的我缺乏的营养素。)
有几个地方的数据不是 100%干净的——例如,我不得不做一些谷歌搜索来找到某些蔬菜的几份大小或平均重量——大多数都记录在表格下面。有一些营养素没有确切的每日推荐量,或者在维基百科上列出,但似乎在其他地方没有提到——比如α-亚油酸(事实证明,在很多食物中没有发现它——但你可能知道它是一种ω-3 脂肪酸)。
但是它就在那里!我现在有了相对准确的数据,知道我每周的平均摄入量和我应该摄入的每种营养素的量是多少。我没有得到每天的量,而是取了每天的推荐量,乘以 7,得到一个不太精确但更容易与我自己的数据进行比较的每周量。所以这并不十分准确,但它足够接近于给我一个关于我一直处于低或高的事物的概念。我学到的一些东西:
- 我以为我吃得很少,但实际上我摄入的卡路里比我需要的要多 40%。
- 我没有摄入足够的脂肪(推荐量是你热量的 25-35%),但我所有的其他宏量营养素(如蛋白质、纤维、碳水化合物)都很好!
- 我真正缺少的是维生素,如 B7、B12、B5 和 E,以及其他营养物质,如氯、铜、氟、碘、钼、钾、硒和锌。
- 一些我认为营养丰富的食物,比如我用来做沙拉和蒸粗麦粉的调味汁中的甜菜罐,实际上大部分只是糖!茄子酱也几乎只有钠和卡路里。我真的很喜欢这些东西的味道,但它们可能没有以经济有效的方式给我提供我需要的营养。
那我在这里做什么?如何让我的饮食完整?获取任何特定的营养物质都有很多选择。我的朋友德瓦尔建议把这变成一个正式的优化问题,使用美国农业部数据库、预算和营养价值作为约束条件,以及像 Lindo 这样的线性优化软件。似乎是一个专门为这类问题设计的软件,我可能会在这篇文章的后续文章中介绍一下。目前,一个手动的、全面的方法就可以了:对于我缺乏的营养物质,比如钾,一个简单的谷歌搜索就会找到补充这些营养物质的廉价方法,比如香蕉、鳄梨或土豆。从那里,它只是计算每个选项的“钾的价格”:哪种食物是最便宜的补充钾的方法?其他营养素也是如此。我们还应该挑选与我所寻找的营养成分重叠或含有多种营养成分的食品,因为这意味着它可能更便宜。
所以在数据表的第二页,我列出了我所缺少的每种营养素的良好来源。我很快就做了几样东西,因为它们是肉或者我不喜欢吃。(那些是灰色的。)对于其中的大多数,我只是选择了出于某种原因而引起我注意的项目(我已经知道如何用它们烹饪,它们对一群人来说是常见的,我更喜欢它们)。绿色的项目是我决定添加到我的饮食中的项目(或者用类似的东西替换掉),以完成我的营养摄入。
我想通过钾的实际计算。所以在那张桌子下面,有另一张桌子,上面只有含钾的物品,它们的钾含量,以及我家附近的乔氏商店的价格。最后两列是价格除以钾含量,显示了每一项中的“钾的价格”。平托豆是最便宜的,每克钾 0.29 美元,尽管小扁豆、香蕉和土豆也不贵多少。所以我可以选择其中任何一种来补充我的钾摄入量。
营养学远不是一门精确的科学,即使在我这么做的时候,我发现我知道的信息使我的结果不一定准确(例如,就在昨天,我的室友告诉我,男性的推荐卡路里摄入量通常是 2500,而不是 2000)。但我要说这仍然是一项有益的锻炼,因为我的发现与常识非常一致:确保你吃得足够多,许多人倾向于节省钾和ω-3 脂肪酸等营养素。跟踪那些!如果你觉得自己没有 100%地工作,你的营养摄入很可能就是原因。
注意事项:
—我使用了国际移民组织提供的典型饮食建议,但任何人都可以做出自己的调整:增加热量摄入,如果你想增肥,就增加蛋白质,其他你可能缺乏的营养物质,等等。尽管做你的研究。
—在对富含氯化物和胆碱的食物进行研究后,我发现我很可能没有摄入足够的氯化物和胆碱,因为它们存在于很多食物中!所以这些被排除在“缺乏”营养素的名单之外。
排列和组合的区别
原文:https://towardsdatascience.com/difference-between-permutation-and-combination-9e12b6763ee1?source=collection_archive---------0-----------------------
长话短说
排列和组合的区别在于:
密码锁应该叫排列锁;)
说来话长
在学习机器学习的同时,在 edx.org 的上,导师用高斯分布来解释有监督和无监督的学习(如果你纯粹是想知道其中的区别,请移至前面的讨论)。当事件的发生率非常大时,高斯分布近似于二项式分布,这正是我实际上想要理解差异的地方,因为二项式分布的公式包含事件发生率的多个组合。
让我们从排列和组合的基本定义开始,并举例说明:
排列:
对象的选择,其中对象的顺序很重要。
例如:集合{a,b,c}中字母的排列是:
abc acb
bac bca
cab cba
由 n 个对象组成的集合中 k 个对象的可能排列数的公式。通常写成 nPk。
公式:
组合
n 个对象集合中 r 个对象的可能组合数。
大声朗读— n 选 r。
公式:
注意:
其中 nPr 是一次取 r 的 n 个对象的排列公式。
了解基本定义和公式后,我们可以用下面的简单方法记住它们的区别:
排列听起来很复杂——因此要记住,每个细节都很重要。吉米,开心果和元帅不同于开心果,元帅和吉米。另一方面,组合很容易相处——吉米、乔利和元帅与乔利、元帅和吉米相同。
因此,排列用于列表(顺序问题),组合用于组(顺序无关紧要)。
一个著名的笑话是:一个“密码锁”应该被称为“排列锁”。你给锁编号的顺序很重要。例如,一个真正的“密码锁”会将 17–01–24 和 24–17–01 都视为正确。
结论
组合表达式是一个排列(得到所选事件的 x 次出现的方式的数量)关系除以 x!(可以选择 x 事件的不同顺序的数量,假设所有顺序都是可区分的)。我希望这能让你明白排列和组合的区别。
在 LinkedIn 这里打个招呼—https://www.linkedin.com/in/softxide/
提高训练精度的不同方法
原文:https://towardsdatascience.com/different-ways-of-improving-training-accuracy-c526db15a5b2?source=collection_archive---------5-----------------------
Image 1: Emotion recognition // Source
在摆弄了一个情绪识别模型之后,我决定继续探索这个领域。有什么比训练自己的情感识别网络更好的方法呢?
构建正确的模型
使用来自的 fer2013 数据集,一个旧的 Kaggle 挑战,我在 Keras 中建立了一个通用的 CNN 模型并训练它,只是为了看看这将有多难。第一个模型有 7 个卷积层和 2 个漏失层:
经过训练,我意识到它无法达到 54%以上的验证准确率。
54%!光是看这个数字就让我对这个模型感到极度失望。
那我们试着把它弄大一点。我扩展了当前的层,并添加了一些卷积层和一些完全连接的层,使网络更深更广:
该模型达到了 58%的验证准确率。一个 4%的成就,当然,但代价是更大的计算能力。事实上,我试图在 MTCNN 人脸识别模型上运行这个模型,我的电脑崩溃了。一定会有更好的模式。
最后,我偶然发现了这个为科恩-卡纳德和 MMI 面部表情数据库设计的模型,并将其用于 2013 年 fer 数据集。该模型使用两个 FeatEx 块在卷积之间创建单独的连接。
Image 2: FeatEx block // Source
这款(惊喜惊喜!)能够达到 63%的训练准确率。此外,它将训练参数的数量减少到不到以前模型的一半。
确定正确的批量
当我搜索 FeatEx 模型时,我决定测试不同的批量大小,看看它是否对训练准确性有影响。
使用 my_newCNN 模型,我训练了两次:一次批量 32,一次批量 64。
批次大小为 32 的模型产生了 58.7%的验证准确度,而批次大小为 64 的模型产生了 59.7%的验证准确度。这是一个非常显著的差异。
每个数据集都有不同的属性。一些数据集可能需要较小的批量,而另一些数据集可能需要较大的批量。测试不同的批量大小以查看哪一个能为数据集产生最佳结果总是一个好主意。
数据扩充
由于 fer2013 数据集相对较小,我不得不进行数据扩充以获得更好的结果。数据扩充是指通过处理每幅图像来创建略有不同的副本,从而使现有的小数据集变大。因为我使用的是 Keras,所以我只是通过图像数据生成器传递我的训练图像。
因为我在训练情绪识别,所以水平翻转我的脸是有意义的,而不是垂直翻转。我设置了 10 度的旋转范围,因为在尝试的时候,总有一些人会稍微倾斜他/她的头。当运行预测时,我们总是会传入大小大致相同的人脸(每张图像首先经过人脸检测器,在将人脸传入情绪识别模型之前,该检测器会剔除人脸),这让我考虑不使用缩放功能。最后,我选定了 0.1 的缩放范围,决定这样做更安全,以防面部检测器裁剪过大或过小的区域。
生成硬数据
最大的改进来自生成硬数据。与其一遍又一遍地训练模型,为什么不选择模型错误标记的图像,并专门在这些图像上训练模型呢?当然,这将导致模型在这些错误标记的图像上过度拟合。所以,在用硬数据训练后,我不得不再次运行正常训练(用所有训练图像)来平衡它。
我让模型预测每个训练图像,并将不正确的图像传递到一个数组中。
然后我像往常一样继续训练:
一次训练后,验证准确率下降到 41%,而训练准确率飙升到 83%。现在,我只需再次平衡模型,以减少验证和训练准确性之间的差异。
再次运行正常训练后,训练准确率下降到 68%,而验证准确率上升到 66%!从 63%到 66%,验证准确率提高了 3%。
只是为了好玩,我想操纵数据集以达到更高的准确性。就像在生成硬数据时一样,我通过 model.predict()遍历了所有图像。然而,这一次,我计算了所有图片的数量和每种情绪的错误标记图片的数量。
这是我得到的(用硬数据训练前的 FeatCNN 模型):
- 愤怒:960/3995
- 厌恶:46/436
- 恐惧:746/4097
- 开心:591/7215
- 悲伤:1388/4830
- 惊喜:484/3171
- 中立:2033/4965
有一点让我印象深刻:与所有其他情绪相比,“厌恶”的图片明显较少。与悲伤或快乐相比,厌恶是一种不太常见的情绪,我们可能会将太多的模型用于识别厌恶。如果我把“厌恶”从数据集中完全去掉,会发生什么?
我也决定发泄愤怒。查看训练图像,愤怒(和恐惧)都与悲伤非常相似,模型可能会错误地将一个标记为另一个。由于我宁愿有一个能够准确检测悲伤而不是愤怒或恐惧的模型,我决定删除其中一种情绪。该模型目前错误地将愤怒比恐惧更多地归类,所以我选择了消除愤怒。
现在,当阅读 CSV 文件中的图像和标签时,我只是拒绝阅读任何“愤怒”或“厌恶”的图像。正如我对所有培训文件所做的那样,我使用这个新数据集通过数据扩充和硬数据运行了一个模型。因为这只是为了好玩,我将批量大小设置为 64,而没有测试不同的大小,假设消除 2 种情绪并没有对数据集产生太大的影响。
你猜怎么着?最终模型达到了 71%的训练准确率和 70%的验证准确率。这比有全部 7 种情绪的情况高出大约 4%。我们不仅创建了一个更少变化的数据集,我们还消除了类似的情绪,并将模型专注于识别所有情绪,而不是区分愤怒、厌恶和悲伤。
70%好吗?乍一看…不是…真的。但在将这个模型连接到我的网络摄像头后,它令人惊讶地运行得相当令人满意。当然,也有一些问题:显然,如果没有真正的皱眉或痛哭,你就不会悲伤,而且看起来,如果没有惊讶的表情,你就无法开口。然而,除此之外,该模型可以非常准确地识别我的情绪,即使当我的脸部分模糊时(感谢数据集中的各种图像)。
可能有更好的情感识别模型,以及更复杂的训练方法来最小化损失并提高准确性,但这些只是在处理数据集时可以轻松使用的一些技巧。
在这里下载我的代码并运行我的情绪识别模型:【https://github.com/reinaw1012/emotion-recognition
查看这篇文章,了解更多关于不同人脸检测算法的信息!
如果您有任何问题或意见,请在下面留下您的评论。如果你喜欢这篇文章,别忘了给它一些掌声!
在 Pandas 数据框架中迭代行的不同方法——性能比较
原文:https://towardsdatascience.com/different-ways-to-iterate-over-rows-in-a-pandas-dataframe-performance-comparison-dc0d5dcef8fe?source=collection_archive---------1-----------------------
为什么我对迭代的性能感兴趣
如果你是一个像我一样经常处理结构化数据集的 python 用户,你可能会出于很多原因经常使用 pandas。该软件包包含大量有用的功能,这些功能已经针对其用途和目的进行了优化(例如描述性统计、分组汇总)。大多数时候,这些功能足以满足您的需求。但是当涉及到时间序列数据时,我经常需要在我的 python 代码中遍历数据框并执行特别的滑动窗口计算。
这让我思考——迭代熊猫数据框最省时的方式是什么?
让我们使用这个简单的问题来比较各种迭代方法的性能:
N = 1000
repeats = 100
a = np.repeat(1000, N)
pd_dataset = pd.DataFrame({'a': a})# Goal is compute the column b where b(i) = a(i) + 1
b = a + 1
这实际上可以通过对整列应用一个操作符来快速解决,从而生成如上所示的新列。操作在这里并不重要,我们的想法是,如果列操作不可行,比较获得相同结果的替代方法。在这个练习中,我实现了 6 个备选方法,并对它们进行了比较。
我从这篇博文中借用了 timeit 方法,通过用@ timeit 注释方法来测量每个方法的执行时间。这是我修改过的 timeit 方法——它将执行时间附加到一个作为名为 log_time 的输入变量传入的列表中:
# Credits to [Fahim Sakri](https://medium.com/@fahimsakri?source=post_header_lockup)def timeit(method):
def timed(*args, **kw):
ts = time.time()
result = method(*args, **kw)
te = time.time()
kw['log_time'].append(int((te - ts) * 1000))
return result
return timed
让我们将 a + 1 操作封装到它自己的方法中,这样它就可以计时了。以列操作为例,下面是使用给定方法获得平均执行时间的初始代码:
**def my_compute**(x):
return x + 1
@timeit
**def use_column**(dataset, **kwargs):dataset['b'] = my_compute(dataset.a)**def time_this**(func, method_name):
*""" Execute the given function 100 times and measure the execution time for each run.
Returns a dictionary containing the statistics based on the execution times
"""* N = 1000
repeats = 100
a = np.repeat(1000, N)
pd_dataset = pd.DataFrame({'a': a})
timing = []
for i in range(repeats):
func(pd_dataset.copy(), log_time=timing)
return {'method': method_name, 'average': np.average(timing), 'min': np.min(timing), 'max': np.max(timing)} results = pd.DataFrame()
results = results.append([time_this(use_for_loop_loc,'use_for_loop_loc')])
迭代行的方法
总之,我比较了 8 种基于现有列生成新的值列的方法(需要对整个列/值数组进行一次迭代)。这些都是在一个 python 文件中实现的。
前两种是在 dataframe 列上应用列方式函数的方法:
- 使用 _ 列:使用熊猫列操作
- 使用 _ 熊猫 _ 应用:使用熊猫应用功能
接下来是在 for 循环中使用 pandas 索引方法访问变量的三种不同方法:
3 。use_for_loop_loc :使用熊猫 loc 功能
-
use_for_loop_at: 使用 pandas at 函数(访问单个值的函数)
-
use_for_loop_iat: 使用 pandas iat 函数(访问单个值的函数)
还有其他不使用 pandas 索引的方法:
-
use_numpy_for_loop :从 column 中获取底层 numpy 数组,迭代、计算并将值作为新列赋给 dataframe
-
use_iterrows :使用 pandas iterrows 函数获取要迭代的 iterables
-
use_zip :使用 python 内置的 zip 函数进行迭代,将结果存储在一个 numpy 数组中,然后在完成后将值作为一个新列赋给 dataframe
以下是每种方法的平均执行持续时间(秒),使用不同的数据集大小(N=1000、10000、10000)重复测试:
N = 1000
method average min max
use_column 0.00 0 0
use_panda_apply 1.95 1 9
use_for_loop_loc 409.69 398 474
use_for_loop_at 13.01 12 14
use_for_loop_iat 13.39 13 15
use_numpy_for_loop 9.59 9 11
use_panda_iterrows 58.31 57 60
use_zip 0.02 0 1N = 10000 method average min max
use_column 0.06 0 1
use_panda_apply 1.01 1 2
use_for_loop_loc 4220.30 4182 4418
use_for_loop_at 127.79 126 130
use_for_loop_iat 134.03 132 138
use_numpy_for_loop 94.64 93 96
use_panda_iterrows 574.54 564 579
use_zip 3.00 3 3N = 100000 method average min max
use_column 0.43 0 1
use_panda_apply 6.01 4 10
use_for_loop_loc 54340.47 53415 55124
use_for_loop_at 1263.17 1238 1431
use_for_loop_iat 1326.79 1313 1365
use_numpy_for_loop 939.02 926 956
use_panda_iterrows 5676.55 5609 6184
use_zip 28.00 27 29
我的预期和结果是正确的:
- 列操作和应用都相对较快
- 使用 at()和 iat()选择比 loc()快
- 在 numpy 数组上基于位置的索引比在 pandas 数据帧上基于位置的索引快
令人惊讶的是:
- 对于小数据集,zip()相对较快——对于 N < 1000 的数据集,甚至比 apply()更快
- iat()和 at()索引比 loc()快 30 倍
- 即使使用索引进行访问,loc()也比预期慢
基于这些结果,从现在开始我会做些什么:
- 如果我不能使用列操作或 apply()实现我想要的,我将使用 zip()代替(而不是 iterrows()!)
- 我将避免使用 loc()来更新或访问单个值,而是使用 iat()和 at()
- 考虑将基础值提取为 numpy 数组,然后执行处理/分析
张量流概率分布的可微卷积
原文:https://towardsdatascience.com/differentiable-convolution-of-probability-distributions-with-tensorflow-79c1dd769b46?source=collection_archive---------7-----------------------
Tensorflow 中的卷积运算是为张量设计的,但也可用于卷积可微分函数
在本文中,我描述了一个均匀和高斯概率分布的卷积的例子,将它们与数据进行比较,并适合高斯的宽度参数。如果我们的数据采用基础模型(本例中为均匀分布),但每个数据点都被高斯模型随机“涂抹”了一定量(例如测量不确定性),则在实践中会出现这种情况。我们假设我们不知道分辨率,并想从观测数据中确定它。这里有一个 Jupyter 笔记本,上面有本文讨论的例子的 Tensorflow 实现。
我们首先在函数参数上定义一个网格,我们将在整篇文章中使用它。尽管对于这里给出的这个简单例子,我们可以得到卷积积分的封闭形式的表达式,但在实际应用中往往不是这样。因此,我们在这个网格上离散我们的函数,有效地使它们分段常数。然而,我们可以选择非常大的箱数,使得分段近似对于我们的目的来说足够好:
然后我们在这个网格上定义一个均匀分布:
如下所示:
我们现在可以从均匀分布中抽取一个随机数样本:
并且用从已知宽度的高斯分布中提取的随机数“涂抹”每个点:
这给了我们以下分布:
现在我们定义高斯分布。请注意,我们将宽度参数 sigma 设为tf.Variable
而不是张量或占位符,因为我们希望稍后使用最大似然拟合来确定它,并因此对其进行求导:
必须考虑如何获得正确的卷积输出范围。在这个例子中,我们使用padding='SAME'
进行卷积运算,第二张量具有奇数个面元。如果我们选择第二个张量在其中间为 1,在其他地方为零(一个“居中的狄拉克脉冲”),那么卷积输出将等于第一个张量。因此,我们将高斯核置于第二张量中间面元的中心。卷积乘积的定义域与投影到第一张量的函数的定义域相同。
还发现 Tensorflow 的 1D 卷积实际上是一个互相关而不是一个卷积。这些本质上不同于第二个函数被“遍历”的方向。通过将第二个输入镜像到围绕垂直轴的卷积运算,或者等效地,翻转函数参数的符号,我们可以得到真正的卷积。
作为卷积运算的快速检查,我们将均匀分布与其本身进行卷积:
获得:
其(忽略归一化)对应于从完全解析计算中获得的结果。
回到我们最初的问题,我们定义均匀分布和高斯分布之间的卷积:
(对于 sigma 参数的原始值)如下所示:
让我们根据卷积乘积定义上面生成的样本数据的负对数似然性。由于我们必须对卷积运算进行离散化,因此我们还需要用相同的宁滨对数据进行分类:
负对数似然函数的定义是:
在下一步中,我们绘制负对数似然函数,我们期望在 sigma 的“真实”值处看到最小值,该值以前用于抽取样本。Tensorflow 可以计算负对数似然函数相对于 sigma 的导数(如下图中的箭头所示):
现在我们有了负对数似然函数及其导数,我们可以使用它的最小值。因为我们只有一个参数要优化,所以我们使用 BFGS 方法而不是随机梯度下降法。Tensorflow 有一个到 scipy 的最小化工具箱的接口:
为了监控进度,我们定义了一个回调函数:
开始最小化:
这通常在大约 23 次迭代之后收敛,并且应该给出接近原始值 0.1 的 sigma 值,该原始值 0.1 用于涂抹从均匀分布中提取的点。
我们在本文中已经表明,在 Tensorflow 这样的框架中,我们可以对概率分布的参数求导,即使我们在卷积运算的(离散版本)中使用这样的分布。
顺便提一下,当使用大量面元时,使用快速卷积算法在计算上可能更有效。事实上,Tensorflow 依赖于 cuDNN,它支持用于执行卷积的几种不同算法,包括基于离散傅立叶变换的方法。
可区分渲染
原文:https://towardsdatascience.com/differentiable-rendering-d00a4b0f14be?source=collection_archive---------9-----------------------
听起来很酷,但是…是什么?
随着我开始更多地关注机器学习,可微分渲染是引起我注意的一个话题,并且以一定的频率出现。我的第一个想法是,“cooooool 这是一个生成像素的新系统,可以利用机器学习吗?”深究题目之后,这立刻是失望,但失望最终被对实际实际应用的现实兴奋所取代。那么,什么是可微分渲染呢?
反向图形试图获取传感器数据并推断 3D 几何图形、照明、材质和运动,以便图形渲染器可以逼真地再现观察到的场景。然而,渲染器被设计成解决图像合成的正向过程。在另一个方向,我们提出了一种近似可微分渲染器(DR ),它显式地模拟模型参数和图像观察之间的关系。
-OpenDR:一个近似可微分的渲染器(论文,技术谈)
OpenDR 可以将颜色和顶点作为输入来产生图像中的像素,并从这些像素中保留导数,以便可以准确地确定哪些输入影响了最终的像素颜色。通过这种方式,它可以将图像“反渲染”回颜色和顶点。
OpenDR: An Approximate Differentiable Renderer
OpenDR 是“近似的”,因为光栅化中存在不连续性,例如由于遮挡。这只是一种不同形式的渲染引擎(光栅化引擎),但也存在其他形式的 DR,包括光线行进,基于点的技术,甚至是单一的着色表面。单一阴影表面的情况(想象一个全屏四边形)可能是最容易理解的,因为它只需要通过照明和 BRDF 传播就可以回到输入端。那么这有什么用呢?
Single-Image SVBRDF Capture with a Rendering-Aware Deep Network
可区分渲染的一个用例是在训练机器学习模型时计算损失。例如,在 SVBRDF 重建论文的中,网络产生四个输出纹理图(漫反射率、镜面反射率、粗糙度、法线),但是单独计算这四个空间中的损失是不够的。问题是,目标法线(例如)和推断法线之间的比较没有捕捉到当纹理实际渲染为光照表面时可见的感知损失。使用可微分渲染器来计算渲染图像空间中的损失;然后将损失传播回四个纹理输入,并从那里应用反向传播来训练网络。
Real-Time Height Map Fusion using Differentiable Rendering
DR 在使用微分渲染的实时高度图融合中具有类似的应用。目标是从单个单目摄像机鲁棒地重建高度图。使用三角形网格和 DR,效率和鲁棒性都得到了提高。
我们的方法的一个重要元素是在标准 OpenGL 计算机图形流水线中实现的可微分渲染器,该元素能够实现高效的操作。给定当前的表面模型和相机姿态,它可以在几乎没有额外计算成本的情况下,为每个像素渲染预测的图像和深度,以及这些量相对于模型参数的导数。
初始深度估计被转换成高度图,然后被渲染成具有顶点位移的三角形网格,以产生新的深度图,该深度图然后可用于计算损失。整个过程是可微分的,这意味着可以通过深度图、通过三角形网格、通过高度图、通过原始深度估计以及通过用于训练的网络追溯损失。
结论和补充阅读
这是对可区分渲染的快速概述,如果您和我一样,对 DR 的定义和用途感到疑惑,我希望这是有用的。我没有对这些论文的质量做任何声明,这些只是我写这篇文章时发现的相关作品。
- RenderNet:一个深度卷积网络,用于 3D 形状的可区分渲染
- 使用对抗性想象先验的计算机视觉中的逆问题
- 可微分图像参数化
- 神经场景去渲染
挖掘数据科学工具:Docker
原文:https://towardsdatascience.com/digging-into-data-science-tools-docker-bbb9f3579c87?source=collection_archive---------17-----------------------
Photo by Kyle Ryan on Unsplash
Docker 是一个创建和管理“容器”的工具,容器就像一个小虚拟机,你可以在里面运行你的代码。Docker 容器就像一个小型的 Linux 操作系统,预装了运行 web 应用程序、机器学习模型、脚本或您编写的任何其他代码所需的一切。
Docker 容器就像是一个真正的轻量级版本的虚拟机。它们使用的计算机资源比虚拟机少得多,并且可以在几秒钟而不是几分钟内启动。(性能提高的原因是 Docker 容器共享主机的内核,而虚拟机运行单独的操作系统,每个虚拟机都有单独的内核。)
Aly Sivji 对码头集装箱和海运集装箱进行了很好的比较。海运集装箱通过标准化设计提高了物流效率:它们都以相同的方式运作,我们有标准化的基础设施来处理它们,因此无论运输类型(卡车、火车或船只)和物流公司如何(所有人都知道海运集装箱并根据其标准制作模具),您都可以运输它们。以类似的方式,Docker 提供了一个标准化的软件容器,您可以将它传递到不同的环境中,并相信它们会像您期望的那样运行。
Docker 如何工作的简要概述
为了让您对 Docker 的工作原理有一个真正高层次的了解,首先让我们定义三个与 Docker 相关的术语——“Docker file”、“Image”和“Container”:
- Dockerfile :你写的一个文本文件,用来构建你需要的 Docker“映像”(见下面映像的定义)。您可以将 docker 文件想象成 Linux 命令行的包装器:在命令行上用来设置 Linux 系统的命令都可以放在 docker 文件中。“构建”Dockerfile 文件会产生一个映像,该映像表示处于您所需要的确切状态的 Linux 机器。你可以在 Dockerfile 参考页面了解语法和命令的所有细节。为了了解 docker 文件的样子,这里有一个 docker 文件,您可以使用它来创建一个包含 Ubuntu 15.04 Linux 发行版的映像,将所有文件从您的应用程序复制到。映像中的/app,在映像的 Linux 命令行中运行/app 上的 make 命令,最后运行/app/app.py 中定义的 python 文件:
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
- 图像 :您希望容器运行的环境的“快照”。这些映像包括运行代码所需的所有内容,例如代码依赖项(例如 python venv 或 conda 环境)和系统依赖项(例如服务器、数据库)。您从 docker 文件“构建”图像,docker 文件定义了图像应该包含的所有内容。然后使用这些图像创建容器。
- 容器 :图像的“实例”,类似于面向对象编程中对象是类的实例。您从图像创建(或使用 Docker 语言“运行”)容器。您可以将容器视为运行由您的映像定义的“虚拟机”。
总结这三个主要概念:您编写一个 Dockerfile 来“构建”您需要的映像,它代表您的系统在某个时间点的快照。从这个映像中,您可以使用该映像“运行”一个或多个容器。
下面是一些需要了解的其他有用术语:
- 卷 :“共享文件夹”让 docker 容器看到你主机上的文件夹(对开发非常有用,所以你的容器会随着你的代码变化自动更新)。卷还允许一个 docker 容器看到另一个容器中的数据。卷可以是“持久的”(容器停止后卷继续存在)或“短暂的”(容器一停止,卷就消失)。
- 容器编排 :当你第一次开始使用 Docker 时,你可能一次只能运行一个容器。但是,您很快就会发现您想要多个容器,每个容器使用不同的映像和不同的配置运行。例如,Docker 的一个常见用途是将应用程序部署为“微服务”,其中每个 Docker 容器代表一个单独的微服务,它与您的其他微服务交互以交付您的应用程序。由于手动管理多个容器会变得非常笨拙,因此有一些“容器编排”工具可以自动执行一些任务,例如启动所有容器、自动重启出现故障的容器、将容器连接在一起以便它们可以互相看到,以及在多台计算机上分发容器。这方面的工具示例包括 docker-compose 和 Kubernetes 。
- Docker 守护进程/ Docker 客户端:Docker 守护进程必须运行在您想要运行容器的机器上(可能在您的本地或远程机器上)。Docker 客户端是与 Docker 交互的前端命令行接口,连接到 Docker 守护进程,并告诉它做什么。通过 Docker 客户机,您可以运行命令从 Docker 文件构建映像,从映像创建容器,以及执行其他与 Docker 相关的任务。
为什么 Docker 对数据科学家有用?
你可能会想"哦,天哪,这是我在数百万我必须掌握的其他事情之外的又一个学习工具吗?值得我花时间去学吗?这项技术几年后会存在吗?
我认为答案是,是的,这绝对是一个值得您添加到您的数据科学工具箱中的工具。
为了帮助说明,这里列出了使用 Docker 作为数据科学家的原因,其中许多原因在 Michael D'agostino 的“Docker for Data Scientists”讲座以及来自 Arthur Ulfeldt 的【Lynda 课程中进行了讨论:
- 创建 100%可再现的数据分析 :由于方法和法律原因,再现性越来越被认为是至关重要的。当你在做分析时,你希望别人能够验证你的工作。Jupyter 笔记本和 Python 虚拟环境是一个很大的帮助,但是如果你有关键的系统依赖,你就没那么幸运了。Docker 确保您每次都以完全相同的方式运行代码,使用相同的操作系统和系统库。
- 文档 :如上所述,构建 docker 容器的基础是一个“Dockerfile”,它是对需要存在于您的映像/容器中的所有东西的逐行描述。阅读这个文件可以让您(以及任何需要部署您的代码的人)更好地理解容器上到底在运行什么。
- 隔离 :使用 Docker 有助于确保您的工具不会相互冲突。通过在单独的容器中运行它们,您将知道您可以运行 Python 2、Python 3 和 R,并且这些软件不会相互干扰。
- 获得 DevOps 能力 :用米开朗基罗·达戈斯蒂诺的话说,“Docker 使 DevOps 民主化”,因为它为过去只有系统/ DevOps 专家才能获得的人提供了机会:
- 如果你不感兴趣,Docker 可以让你更容易地“回避”DevOps /系统管理,因为有人可以为你创建一个容器,你所要做的就是运行它。类似地,如果您喜欢使用 Docker,您可以创建一个容器,让不太懂技术的同事在他们需要的环境中轻松运行。
- Docker 提供了从现有容器开始构建 docker 容器的能力。你可以在 DockerHub 上找到许多这样的文件,它拥有数千个预先构建的 DockerHub 文件和图像。因此,如果您正在运行一个众所周知的应用程序(或者甚至是模糊的应用程序),通常已经有一个 docker 文件可以让您快速部署您的项目。这包括许多工具的“官方”Docker 库,例如 ubuntu 、 postgres 、 nginx 、 wordpress 、 python 等等。
- 使用 Docker 有助于您与 IT / DevOps 同事合作,因为您可以在一个容器中完成数据科学工作,并简单地将其作为一个黑盒传递给 DevOps,他们无需了解您模型的所有信息即可运行。
以下是一些与数据科学相关的应用示例,您可以尝试使用 Docker:
- 创建超便携、定制的开发工作流: 在 Docker 文件中构建个人开发环境,这样你就可以在任何安装了 Docker 的机器上立即访问你的工作流。无论你在哪里,无论你在什么机器上,只需加载图像,你的整个工作环境就在那里:你工作所需的一切,以及你想如何工作。
- 创建开发、测试、试运行和生产环境 :请放心,您的代码将按您的预期运行,并能够创建与生产环境相同的试运行环境,这样您就知道当您进入生产环境时,一切都会好的。
- 在任何机器上复制你的 Jupyter 笔记本 :创建一个容器,运行你的 Jupyter 笔记本数据分析所需的一切,这样你就可以把它传给其他研究人员/同事,知道它会在他们的机器上运行。尽管 Jupyter 笔记本在进行分析方面很棒,但它们往往会受到“它在我的机器上工作”问题的困扰,Docker 可以解决这个问题。
要获得更多灵感,请查看 Civis Analytics 米开朗基罗·达戈斯蒂诺描述他们使用的 Docker 容器(从 18:08 标记开始)。这包括专门用于调查处理的容器、R shiny 应用程序和其他仪表板、贝叶斯时间序列建模和投票聚合,以及通用 R/Python 包,其中包含员工所需的所有通用包。
更多资源
如果你真的想开始使用 Docker,我强烈推荐由 Arthur Ulfeldt 教授的 Lynda 课程学习 Docker 作为起点。解释得很好,也很简洁(总共只有 3 个小时左右的视频)。我从这个课程中创建了一套 Anki 抽认卡,你可以在这里访问。我还推荐奈杰尔·波尔顿的《Docker Deep Dive》这本书。我还根据这本书制作了 Anki 抽认卡,你可以在这里访问。
这里有一些其他有用的资源,你可能想看看:
- 数据科学家 Docker,Strata 2016,米开朗基罗·达戈斯蒂诺 (YouTube 视频)
- 使用容器的数据科学工作流,作者 Aly Sivji (YouTube 视频)
- 为期 3 小时的数据科学家研讨会 (YouTube 视频)
原载于 2018 年 10 月 1 日www.marknagelberg.comT22。要访问我共享的 Anki deck 和 Roam Research notes 知识库,以及关于间隔重复和提高学习效率的技巧和想法的定期更新, 加入“下载马克的大脑”。
数字分析数据质量和网络分析师
原文:https://towardsdatascience.com/digital-analytics-data-quality-and-web-analysts-e5f6cc709f4a?source=collection_archive---------2-----------------------
我想谈谈数字分析的数据质量,这让很多初来乍到的人感到困惑。
习惯于结构化数据的分析师如果不理解数字分析的动态性,一开始会感到沮丧。在结构化数据世界中,你是基于交易数据的,交易数据是确切的数字,因为数据是在交易过程中由应用程序创建的,不涉及第三方。这意味着当交易发生时,您的数据也被创建。如果你有交易,你就有数据。
在这个新的数字世界中,我们跟踪用户的点击,数据不是从应用程序传递,而是从 web 浏览器传递。网站并不直接连接到访问者,它们之间有一个媒介:像 Firefox 或 Safari 这样的网络浏览器。访问者通过这种媒介访问公司的数字资产。因此,如果你想从访问你网站的客户那里收集数据,你需要请求浏览器向你发送数据。您通常需要使用另一个第三方分析供应商来获取这些数据。
当你看这些数据的时候,这是必须知道的。
客户点击页面上的某个东西,浏览器将这个点击作为 web 请求发送到网站,网站从其服务器给出响应,浏览器拾取这个响应并显示给访问者。在此流量期间,您将通过您的网络分析供应商收集数据。正如你所看到的,在这个由许多步骤、各方和硬件组成的交易中,有许多事情可能会出错。即使你有完美的网络分析实现,你真的不能控制访问者的电脑,浏览器性能,或访问者的互联网连接。你甚至不能 100%控制你的网站。服务器可能会出现故障,最终会出现错误,页面可能会出错。
这是你所得到的,你需要看数据,记住这一点。完美的数字数据是不存在的,你只需要运用你的商业和分析技能来理解这些数据。这就是为什么优秀的数字分析专家会关注趋势来创造见解,而不是关注原始数据。
这也是你不应该让大家做分析的原因之一。当分析师没有很好地理解数字资产的产品和基础设施时,他们最终会得出许多错误的见解。最后,他们会责怪网络分析供应商或技术实现。实现可能是错误的,但是您需要那些能够在瞬间理解数据质量的人
第二种对数据差异感到不舒服的人是那些没有使用必要的分析技能的人。当你具有高度的分析能力时,你可以很容易地在不同的报告、KPI 和业务目标之间建立联系。你会认识到错误的数据,但你也会认识到,在某些情况下,这些错误的数据不会偏离你的洞察力,你仍然会从中获得一些东西。
雇佣那些能够利用现有数据创造洞察力的人。这是我们在这个快节奏的数字世界中需要的技能。
数字经济学
原文:https://towardsdatascience.com/digital-economics-825ea18cd1f4?source=collection_archive---------7-----------------------
让我们快速了解一下数字经济是什么,以及它如何影响组织和市场 …。
在为我们关于商业分析的 2018 暑期学校课程制作海报内容时,我建议将“数字经济学”作为我们关于数据在现代经济中的首要地位的入门课程的标题。难怪当今世界上最有价值的五家公司中有四家专注于信息处理(苹果、Alphabet、微软和脸书),而第五家(亚马逊)在其商业模式的核心利用数据。【1】对于那些实践管理的人来说,“数字经济”的概念唤起了数据、商业价值和管理决策之间的相互关系。
现代经济的定义特征之一是价值是用户体验的属性,而不是供应商的产品或服务。价值链的全球化将经济主体推向更有利可图的活动,包括生产的上游和下游。如果丹尼尔·贝尔预见到现代企业将从组装产品转向聚合服务,派恩和吉尔摩强调了商业价值随后从组织服务向客户体验的转变。今天,价值被视为我们消费体验质量的同义词,无论是在休闲时间还是在职业活动中。我们感知的核心是上下文中的数据,我们用它来衡量我们的物理、增强或虚拟现实。
数据是这些人类经验的代理。尽管数据并不新鲜,但它越来越无处不在——今年创造的数据将超过之前 5000 年有记录的历史。【ii】数据是第四次工业革命的核心——互联网技术和商业分析的进步是当前可持续竞争优势的基础。【iii】数字战略超越了网站,延伸到了旨在捕捉消费者偏好、行动和动机的物联网。如果数据没有内在价值,我们将数据转化为个人和/或集体行动的能力就成为了企业和社会的支点。
数据的无处不在改变了我们看待价值的方式。收集数据不是为了简单地描述物理对象,而是为了提供多用途的算法,这些算法决定了我们对周围世界进行建模的方式。数据科学不太关心我们做什么(描述性的),而是关心我们能做什么(预测性的)或应该做什么(规定性的分析)。商业信息系统不再被设计来跟踪有形的商品,而是提供一个横向平台,利用我们作为消费者所拥有的、所知道的和所做的无形资产。数据不仅仅是数据,它已经成为现代企业的命脉。
数字经济学的课程不仅仅是对硬件、软件和自动化的回顾。数字技术不会神奇地产生将数据转化为行动的决策,而是人。卡尼曼和特沃斯基关于前景理论的工作有力地证明了人类的偏见和感知是如何影响我们看待数据的。【iv】机器学习充其量只能促进我们对价值的认知。数据科学包括理解要解决的问题的本质、手头数据的质量、应用适当的方法以及将数据转化为行动。数字经济的影响不在于产生更多的数据,而在于提高人类决策的质量。
数字经济学的研究是商业分析研究所的核心。在我们位于巴约纳的暑期学校,以及我们在欧洲的大师班,我们让分析为您和您的组织服务。该研究所专注于数据科学在管理人员中的五个应用:数字经济学、数据驱动的决策、机器学习、社区管理和可视通信。改善管理决策会对你未来的工作和职业生涯产生影响。
Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 个人资料可以在 www.linkedin.com/in/leeschlenker.查看你可以在 https://twitter.com/DSign4Analytics的 Twitter 上关注我们
派恩和吉尔摩(1999 年)。体验经济。明尼苏达州圣保罗:高桥公司。
【ii】……(2016),【ii】数字化世界中更好的公司估值方法,Knowledge@Wharton,
【三】施瓦布,K. (2017)。第四次工业革命。第一版。兰登书屋公司。
【iv】卡内曼 d;特沃斯基(1979)。《前景理论:风险下的决策分析》。计量经济学。
数字封建主义
原文:https://towardsdatascience.com/digital-feudalism-b9858f7f9be5?source=collection_archive---------2-----------------------
数据生态系统如何变得中世纪化
Queen Mary’s Psalter (Ms. Royal 2. B. VII), fol. 78v. Downloaded from Wikipedia.
不幸的是,我们的现代数字生态系统正在迅速组织成一个与我们现有的权力结构和自由并行的封建权力结构。在封建主义的普遍观念中,相对较小的食利阶级(领主)利用各种微妙和公开的政治和经济制度从生产阶级(农民)的日常生活中榨取价值,而生产阶级通常对这一制度没有什么选择或影响。用户参与平台,通常对他们提交的数据只有最起码的了解,然后这些数据被用来专门为平台所有者创造价值。但是,我们当前的数字生态系统和封建社会之间的相似之处远比粗略描述的要多得多,共同点如此惊人,以至于可以说数字生态系统,特别是社交媒体生态系统,构成了事实上的封建社会。
中世纪时期
在我们开始之前,重要的是简要讨论一下实际的历史封建主义的本质。还没完,“骑士、领主和女士们,万岁!”正如我们从大众媒体中可能想到的。这就是广义的骑士精神。更准确地说,肯定有骑士、领主和贵妇(或者任何一个特定社会用来称呼武士和贵族阶级的术语),但他们是人口中非常小的一部分,其中大部分是农奴(或者地主用来描述【乌合之众】的任何术语)。为了澄清定义,骑士精神主要包括我们喜欢在电影和书籍中看到的封建主义的所有“有趣”部分。封建主义的另一半(强迫劳动和欠贵族的农民群众)通常被称为庄园制。
正如人们对中世纪政治制度的预期,大多数封建社会主要以农业为中心。用来管理农业生产和农村生活的封建制度一般被称为庄园制。在庄园制中,领主控制着一定面积的土地,这些土地通常由更有权势的领主或国王授予他。农民居住在这片土地上,他们通常在政治上和经济上受制于领主和他的各种家庭成员和家臣的集合。更一般地说,农民可以细分为自由民,他们通常要么拥有自己的土地,要么支付某种货币租金;农奴,作为一种不自由的劳动,他们有义务为他们的主人工作土地;和奴隶,他们被视为财产,几乎没有法律权利。尽管关于从奴隶制到农奴制的转变是欧洲不自由劳动的主要形式仍有争议,但人们普遍认为,随着奴隶制在欧洲变得不那么普遍,农奴制取而代之。
在许多情况下,农奴确实拥有基本的权利,如牲畜的共同牧场和个人使用的小花园,所以他们在技术上不是奴隶。然而,农奴也被要求耕种地主的大片土地,作为一种强迫劳动,或者在更资本主义的封建制度下,支付(通常是过高的)税收。为了生活和生产足够的食物来养活自己,农奴们不得不向领主的生产要求低头。同样,由于农奴的义务与他们占有的土地直接相关,任何土地交换都意味着农奴的义务也随之转移。在许多情况下,农奴仅仅被视为土地本身的生产要素,就像一棵果树或一群鹿。
普通庄园的布局。芥末色的区域归领主所有(领地),阴影部分归教会所有(土地)。威廉·r·谢泼德,《历史地图集》,纽约,亨利·霍尔特公司,1923 年。来自维基百科。
农民,无论是农奴还是其他人,也经常被要求使用领主庄园提供的收费服务。例如,许多庄园都有谷物碾磨机,农民可以用这些碾磨机把他们的谷物产品磨成面粉,但是这些碾磨机通常也需要付费或者交出部分生产的面粉。在某种程度上,这些磨坊代表了一种地方垄断,农民的唯一选择是使用领主的磨坊并支付费用,或者根本不使用磨坊。后一种“选择”虽然在某些情况下在理论上是可能的,但在功能上是不可能的,因为面粉是少数几种容易储存的卡路里来源之一。
从司法上来说,庄园主通常负责他所有的臣民。也有一些例外(正如人们可能会从庄园制这样一个多样而悠久的制度中预料到的),中世纪封建主义的司法模式略有不同,但总的来说,领主创建并维持一个或一系列法院,裁决轻微犯罪和民事纠纷。这些封建法庭的存在也是为了执行强加给农民和领主土地的其他佃农的任何条款和条件。在领主的土地上,通常有不同的规则和条例来管理不同类型的占有者,法院通常管理这些不同的义务以及出现的任何纠纷。当然,也有更高一级的法院负责更严重的罪行,它们通常由更高层次的贵族控制。
与大多数强迫劳动制度一样,宣誓义务并成为农奴比逃离农民要容易得多。一般来说,大多数农奴被锁定在他们的社会阶层。摆脱农奴制的方法有一些,但它们因社会甚至个体领主而异。相反,不幸贫穷或遭受灾难的人往往不得不服从封建义务以求生存。这通常包括某种仪式,将个人与领主和他的庄园捆绑在一起,并可能收取某种费用来获得住所。正如所料,农奴通常缺乏机制或资源来履行他们对庄园主的义务,因此他们的家人永远被束缚在土地和庄园中,成为不自由的劳动力。
大多数庄园还居住着一定数量的自由民,他们没有义务通过强迫劳动来耕种土地,但却缴纳税款、租金和其他费用。这些自由民可以被认为是今天所谓的“下层中产阶级”的早期版本,但中世纪社会的各个阶层是如此的不稳定和复杂,以至于很难进行任何直接的比较。认为自由民的一个简单方法是,他们足够富裕,可以租赁或购买土地,但又没有富裕到让农奴为他们工作。因此,就他们从事的业务而言,他们有更多的自由,但他们仍然必须做自己的工作。这是一种过于简单化的说法,关于每个封建社会中自由和自由民的本质,已经有整本书问世,但它给出了一个关于被认为是自由民的人的体面概念。
一些读者可能已经对这场讨论的走向有了一些想法,但明确地将当前的数字生态系统与庄园制进行对比是很重要的。这场讨论将主要围绕社交媒体公司展开,这些公司是现代经济中最大、最成熟的数据技术公司。此外,更传统的技术公司经常试图在他们的许多数据实践中模仿社交媒体公司,所以这些也将受到审查。
Classes of Digital Feudalism. Lords of the manor: companies who own and manage platforms. Major gentry: companies with business models based on the manor platforms. Minor gentry: “influencers” who drive users to spend more time on the site. Serfs: people who submit to data collection for the right to exist in digital space
农奴——用户
现代社交媒体的权力结构和周围的数据科学生态系统很容易让人联想到封建社会和经济结构。除了不生产作物和牲畜,这个系统的农奴在日常生活中生产和交出数据,这个系统的主人是科技公司的高管,他们的整个基础设施都建立在收集和利用用户数据的基础上。
在我们更进一步之前,有必要解决社交媒体的“自愿参与”或同意论点。任何讨论数据科学和社交媒体生态系统公平性的人几乎不可避免地会遇到这样的论点,即参与社交媒体是自愿的。虽然这看起来像是一个很好的标准,但作为现代数字数据的范例,同意被打破并且通常无效。同意的现代方法(例如,“我们跟踪您,点击此处向我们提交您的数据,我们将对其做任何我们想做的事情,直到时间结束。”)可以看作是类似于中世纪农民“心甘情愿”地强迫自己成为农奴的方式。虽然现代社会的情况没有中世纪社会那么残酷,但在中世纪社会,几乎所有的个人和职业交流都是数字化的,不参与就是自愿排斥。在当代社会,不参与也几乎是不可能的,因为实体商店让位于在线订单,国际电话之间的任何互动都需要高昂的价格或免费的数字替代品,派对是有计划的,邀请是通过电子邮件和脸书活动发出的,在线求职申请成为唯一的求职申请。
这种表述甚至没有提到这样一个事实,即对于许多残疾人和不同能力的人来说,数字选项是唯一的选择,这使其更接近于“屈服或死亡”的境地。互联网给了许多以前孤立或依赖照顾者的人前所未有的自由。但是有了现代互联网,警告总是你点的任何东西或说的任何话都会被某人跟踪,不管它对你的生活有多必要。
如果我们接受不参与是错误的,或者至少是极其沉重的选择,那么参与这个系统就是存在的主要状态。在参与方面,中世纪庄园制和数字封建制之间的一个关键区别是,没有人必须只参与一个平台。相反,每个人都对不同的数字庄园负有义务,每一个都需要不同的数据来交换使用。对于那些关心隐私的人来说,问题就变成了他们愿意向多少个领主交出多少数据,以及他们的个人和职业生活是否能适应这些决定。
随着 Office 365 等基于云的服务大举入侵企业,这一决定变得毫无意义。传统上,你在工作中的时间不是你自己的,你的雇主一直知道你的大致时间表、产出能力和工作风格。但现在另一家第三方公司也知道所有这些事情,他们可以很容易地将它们与从其他公司收集的数据进行匹配。你的时间和工作成果可能属于你的雇主,但现在他们也为第二家公司工作,第二家公司利用他们做不属于你雇主的事情。基于云的服务对商业环境的入侵是数字空间的企业中介,因为以前的主权数字环境,如本地企业服务器,将数据存储和使用的义务和权利让给了第三方。在许多情况下,你的雇主在选择放弃他们的数据方面可能和你的情况完全一样。对于企业“云服务”客户来说,一个有用的概念框架是作为骑士或小领主,由平台的领主授予空间和访问权,并负责他们自己的农奴领地。
参与数字封建主义的社会群体之间的一个关键差异是坚持认为个人数据在功能上毫无价值,但总数据足以推动全球最大公司的估值。这种差异(或者,如果你觉得慈善的话,“规模效应”)是数字封建主义的核心,这是传统农奴不必解决的问题。农奴很容易意识到交给庄园主的谷物或其他作物的价值,而任何领主都很难合理地辩称食物毫无价值,尤其是在饥荒时期。许多革命是由干旱、价格控制和其他限制粮食供应的事件引发的,这是有原因的。饥饿是一种强大的动力,而隐私却不是。
数据收集公司利用了这些盲点,坚持认为一个人的数据除了汇总之外没有任何有意义的价值。你也可以说,在脸书 6000 多亿美元的估值中,一块钱与总体价值相比毫无价值,那么为什么不指望他们将这些“毫无价值”的钱交给创造其价值的人呢?当然,这个问题是故意有点迟钝,但它说明了数字庄园的领主和他们的用户之间的根本权力不平衡。他们决定你的数据的价值,但他们也坚持认为他们为你提供的任何好处都是同等价值的(减去他们提取的任何利润)。在数字庄园制中,平台所有者非常不愿意估计单个人数据的价值,而他们却高兴地用天文数字来评估他们的总数据。
Polish Gentry 1333–1434, Jan Matejko. From Wikimedia Commons.
贵族——企业合作伙伴和电力用户
这些权力失衡进一步加剧的事实是,数字法律体系与中世纪的封建制度也有许多相似之处。数字庄园的“低级法院”是他们选择使用的任何报告系统和工作人员,他们在其平台上监督的犯罪已经有机增长。骚扰是一种严重的合法犯罪,但对数字骚扰事件的大部分调查和惩罚权力都被交给了平台所有者。你当然可以向警方报案,但如果有人骚扰来自另一个州或国家的人,受害者除了特定平台的领主建立的那些系统之外几乎没有任何追索权。版权投诉通常遵循类似的模式,增加了一层极其严格的法律结构,要求平台所有者实施如此激进的政策,以至于数字千年版权法的撤销请求本身可能成为骚扰的工具。
正如所料,这些系统通常完全不足以捍卫“农奴”的权利,并倾向于支持数字封建结构中“同盟阶级”的权利。媒体公司花大价钱在社交媒体平台上公开或秘密地做广告,所以如果他们抱怨有人在使用他们的知识产权,那么平台肯定会扑上去。但是如果一个公司未经同意窃取了你的艺术或音乐怎么办?好吧,你最好有自己的社交媒体渠道和一大群追随者,否则他们可能会在几周后找到时间,那时他们的大客户已经获得了丰厚的利润。
在使用社交媒体平台及其数据来实现自身战略的大公司之间,隐藏着一群奇怪的“小绅士”,或“影响者”。这些人从社交媒体中获得各种津贴或收入。他们很少是媒体平台的实际员工,但他们确实通过吸引更多用户进入平台而获得报酬(通常通过“合作伙伴计划”),从而增强平台主的数据流。他们当然对托管他们的平台负有义务,但平台没有对等的义务。如果最具诱导性的内容能为他们赢得大量用户,许多平台会欣然托管这些内容,但一旦有人开始讨论抵制或广告商威胁要离开,他们就会放弃这些内容。
最成功的数字精英甚至有可能获得自己的子平台,围绕核心受众建立的网站网络,或者作为平台老板奖励的利润丰厚的全职工作。这些子平台通常用于提供一种自治感,而没有任何数据收集和利用的实际自由。通常,这涉及到额外的好处,如围绕一个“品牌”创建多个账户的能力,而大多数个人用户只能使用他们的真实身份,如果多个账户甚至是一种选择的话。许多平台明确禁止多个账户,当然,除非你在他们的平台上经营业务。当你有一个企业(或声称有一个企业)时,你对来自平台的数据的访问也增加了。但是你从来没有被给予对所有数据的完全访问权,甚至是你的子平台带来的数据,因为你的平台的主人当然“严重关注”他们用户的数据隐私。冷嘲热讽地翻译一下,这意味着亚平台所有者根本没有足够的权力或财富来保证完全的访问。
Portrait of Louis XVI, King of France and Navarre (1754–1793). Joseph Duplessis. From Wikipedia.
领主和国王——平台所有者
最后,我们来到了被广泛讨论的数字庄园主。这些人拥有并控制着巨大的平台和它们产生的所有数据。从公司实体或组织结构的角度来讨论所有权往往很有诱惑力,但这忽略了对这一群体的核心理解:他们是(大多数是白人,大多数是男性)人。他们决定自己平台的隐私和销售政策。他们从用户生成的数据中获得了惊人的收入。他们同意任何获取更多数据的新计划,或者更积极地维护自己作为数字领域主权统治者的权利。
理解数字庄园制所建立的权力结构的本质是很重要的,假设平台所有者普遍都是恶意或仁慈的是错误的。许多人试图成为好人,并可能认为自己是好人。但是他们领导公司,公司的唯一目标是创造收入。因为用户数据是他们提供的核心价值,数字领主永远被迫侵犯用户隐私并加强数据收集工作,以免他们的权力被更愿意最大限度地收集数据的人篡夺。平台所有者永远走在平衡提取数据的新方法与用户放弃其剥削性环境的风险的边缘。这与庄园主被期望向他们的赞助人或国王提供什一税、税收和征兵税,同时仍然确保他们自己的庄园繁荣昌盛是一样的。但在数字庄园制中,最终的权力不是一个国家的统治者,而是金融市场的经济力量。具有讽刺意味的是,从用户身上获取价值的组织反过来又受制于集体投资者群体,尽管它们的大多数用户永远不会富裕到拥有足够的所有权来捍卫自己的权利。
为了使这些权力失衡合法化,庄园制度几乎总是回归到某种契约忠诚机制。历史上,农奴服从或世世代代服从于由他们的领主制定的合同或协议。在现代社会,数字庄园契约是没完没了的用户协议,其中许多包含如此多的条款和剥削性条款,以至于在许多司法管辖区无法执行。用户协议很少(如果有的话)用简单的术语表述,它们通常很长,以至于需要多天的阅读,并且可能需要法律学位才能完全理解。因此,用户协议代表了另一种象征用户选择的手段。
数据共享设置是数据收集的另一个工具。表面上,这些设置允许用户手动控制他们与他人共享的数据。然而,这仅在某些情况下是正确的,并且这些设置的维护通常需要持续的警惕。在许多情况下,在更新或修改期间,用户被默认为最宽松的数据共享设置,他们必须在每次更新后手动重置他们的首选项。这些重置中最邪恶的假设是反向同意:如果您的首选项默认为共享某个特定的数据,那么平台会立即允许共享该数据的所有历史存档。这样,“隐私控制”不会阻止存储;他们只是限制这些信息的共享。
用户甚至不总是有这些虚假的同意选择。随着数据科学的发展,员工量化的新领域也在发展。不幸的是,量化工人运动只是简单的泰勒主义,表面上涂着薄薄的技术外衣,被一个过去没有劳工保护的社会所接受。但是,进行量化的服务提供商几乎总是寻找新合作伙伴的第三方数据平台,以使其数据收集策略具有强制性。制定这些政策的不再是单个雇主,而是多个有实力的雇主,甚至是政府机构,它们相互合作,最大限度地量化员工的表现。自然,这些数字企业的农奴总是被称为“用户”或“参与者”或其他一些暗示可以选择退出的术语,而他们实际上更像是主体,他们的选择是将数据交给第三方或失去工作。可以预见的是,受到这些强制性数据提取计划影响的工人可以分为成功击退这些入侵的工会工人和非工会工人,他们看到自己的生活和工作质量急剧下降,因为他们拼命努力保住自己的工作,而业绩基准却在飙升。
因此,我们不禁要问,什么样的事件会促使对用户/消费者隐私进行更严格的监管。你可能会为大规模的安全漏洞或泄密这样的事情进行逻辑论证,但这已经是一个日常问题,似乎没有公司特别担心它们。他们只是在风险管理计算中加入调查成本,然后照常进行。你打算怎么做,因为你的身份在 Equifax 事件中被盗而停止使用银行吗?你可能认为数据的安全性极其重要,但对一家数据公司来说,成功销售和安全漏洞之间的唯一区别是他们从你的数据中获得多少报酬。
前进的道路
很明显,庄园制与平等主义和自由社会是不相容的。但是,数字庄园制的趋势还相对年轻,我们有机会在它变得根深蒂固之前逆转它。越是建立的庄园系统,它们就变得越破碎,如果它们继续下去,用户可能会发现自己成为数字旧制度的主体。在不直接攻击数据科学的重大创新和机遇的情况下,有许多选项可以解决数字庄园制的问题。如果用户正在为公司创造价值,那么他们应该考虑加入工会。传统工会的大多数障碍与就业状况有关,但平台所有者非常小心地确保用户不以任何方式被视为员工。虽然各种团体试图进行社交媒体抵制或封锁,但他们往往组织不力或临时行动。持续稳定的用户联盟将提供重要的杠杆作用,以打破最恶劣的数字庄园剥削,甚至在他们开始之前阻止他们。他们还可以为受到强制性第三方数据收集的员工提供杠杆作用,并可以有意义地游说政治系统进行监管。
平台所有者和用户之间的任何持续平等都需要强有力的隐私法律和政策,这些法律和政策只能由政治机构有效制定和执行。在某些情况下(比如中国),平台所有者和政治决策者紧密结盟,如果不是同一批人的话,这代表了一种极其危险的范式。但在许多其他情况下,数据庄园的主人不同于政治机器,数字庄园主义的历史是一部政治不作为的历史。许多政治系统,特别是美国的政治系统,在技术知识方面存在重大差距,正如 2016 年选举干预丑闻后马克·扎克伯格在国会的证词所证明的那样。这使得政客们更难有效地捍卫其选民的隐私和权利,即使他们很想这样做。欧盟最近在保护用户隐私方面取得了长足的进步,出台了《通用数据保护条例》。
这种以用户为中心的政治努力的好处是,它们对那些它们没有直接保护的用户产生了连锁反应。许多数据公司都是全球性的,他们不可能在每个地区制定不同的保护措施并遵守 GDPR 和其他法规,因此他们经常采用符合最严格法规的一揽子政策。在欧盟运营的平台中出现的新通知和隐私选项中已经可以看出这一点,即使用户和公司办公室不在该管辖区。随着这些法律和政策在全球范围内激增,公司最终可能会在全面实施各种规则时变得更具选择性,但就目前而言,这些都是出色的工具,不仅可以保护一个国家的公民,还可以保护数字共享空间的所有用户。
因为这是至关重要的。互联网作为全球知识共享资源的承诺已经被分割成多个领地,而居住在这些共享资源中的用户却没有提出任何意见。如果我们现在就能改变这种趋势,在它变得根深蒂固之前,我们不仅可以提高隐私,还可以提高与数字技术互动的每个人的生活质量。
数字营销:分析优势
原文:https://towardsdatascience.com/digital-marketing-the-analytical-edge-e2fe733f82f7?source=collection_archive---------7-----------------------
Photo by Marvin Meyer on Unsplash
介绍
数字营销是一个用来描述使用互联网和数字媒体来支持营销的术语。通过使用数字技术,营销团队实现了组织中定义的营销目标。随着越来越多的消费者、客户和潜在客户出现并活跃在不同的在线平台上,数字营销需要涵盖不同种类的媒体渠道。在当今市场竞争激烈且复杂的购买环境中,需要考虑付费媒体、免费媒体和自有媒体。
付费媒体是通过广告或搜索排名为访问者付费的投资渠道。挣得媒体描述了品牌倡导者在社交媒体、博客或出版商上发布的编辑内容的使用情况。自有媒体是品牌自身拥有的渠道,由社交媒体档案、网站和移动应用组成。互联网渠道上的数字营销也实现了与客户的另一种互动。传统媒体是推送媒体,营销材料从公司广播到大量观众,而互联网使客户或潜在客户能够主动接触品牌。集客营销描述了一个市场,在这个市场中,客户积极寻找有关特定品牌或商品的信息,这要求公司提供数字营销材料,以满足潜在客户对信息的需求。互动营销还可以根据从大量在线可用数据中收集和准备的情报进行个性化营销。营销团队需要采用分析和数据驱动的营销方法,以便能够向客户和潜在客户传达量身定制的个性化营销信息。
公司的营销预算仍在上升,2016 年,公司将 12%的收入用于营销活动。在高德纳 CMO 2016 年至 2017 年支出调查中,57%的受访者预计营销计划支出将会增加。此外,CMO 在营销技术上的投入有望超过首席信息官。劳动力是营销预算中最大的一块,但排在第二位的是技术。营销部门将总收入的 3.24%用于技术,而首席信息官将 3.6%的收入用于技术。此外,营销部门将大部分预算花费在网络、数字广告和数字商务上,这证明数字营销是一个组织接触客户和潜在客户的重要方法。
在本帖中,重点将是数字营销如何需要采用一种分析的心态,以便能够利用数字营销和互联网上的大量可用数据来帮助寻求接触和留住客户。提供了关键主题的概述,随后是关键发现的讨论和结论。
数字营销、消费者、数据和算法
这篇文章将详细阐述数字营销、消费者行为、大数据和机器学习。通过对这些话题的调查,这篇文章将阐述数据驱动和分析方法对数字营销的重要性。
数字营销一个品牌越来越多的潜在客户和现有客户每天都在使用数字工具。数字营销是品牌触及客户群和潜在客户的重要工具。通过利用数字技术,数字营销被用于接触活跃在平台上的客户。通过 2016 年对 CMO 的调查,Gartner 发现公司将 12%的收入用于营销活动。首席营销官在技术上的支出也将超过首席信息官,首席营销官在技术上的支出占总收入的 3.24%,而首席信息官占总收入的 3.6%。这就需要创建首席营销技术专家,或 CMT,来弥合营销和技术之间的差距,以确保技术和营销举措的良好配合。67%的营销部门表示,他们将在 2014 年至 2017 年间在技术相关活动上投入比以往更多的资金。
消费者行为成功的公司试图在市场中占有一席之地,并为目标客户群提供服务或产品。该公司必须保持独特和个性化,以获得其细分市场的竞争优势。这一前提的假设是,消费者正在根据自己的需求和愿望做出深思熟虑和理性的决定。一个好的公司战略必须找出并回应消费者决定购买特定商品或服务的潜在意识逻辑。然而,人脑不是一台基于客观数据和深思熟虑的推理做出决策的分析机器。围绕消费者的嘈杂数据没有被彻底分析,而是由个人根据经验和直觉来填充缺失的信息。
大数据大数据用三个 V 来描述:大量数据(量)、高速生成的数据(速度)或不同格式的数据(多样性)。收集的数据通常也是非结构化的,并且包含大量噪声,但是可以使用算法和分析来发现模式和知识。研究还表明,数据驱动型组织的盈利能力比竞争对手高出 6%,生产效率高出 5%。
引入能够感知其环境并将其状态报告给云的对象和产品,将会产生大量数据。消费者和公司可以利用这些数据来改善价值创造和日常生活。大数据使公司能够衡量并获得关于其运营的更深入的知识,从而改进决策。关于客户的大量数据可以通过不同的来源获得,并且可以很容易地进行整合,从而创建客户购买习惯和交易的完整资料。一家银行的一个团队将 ATM 交易、在线查询、客户投诉和其他数据结合起来,创建了一个 360 度的客户视图,以便更好地提供客户服务。
机器学习和算法算法由为解决给定问题而采取的预定义步骤组成。另一方面,机器学习试图根据数据、统计方法和计算能力来制定规则。机器学习不是告诉算法做什么和如何做,而是帮助计算机理解数据,并从模式和相关性中推导出规则。基于观察,数据被收集并馈入机器学习算法,然后该算法创建可用于处理数据的模型。机器学习的最终目标是基于数据子集来概括发现。机器学习被用于越来越多的应用中,从识别图像中的人脸,对客户进行聚类,到制造自动驾驶汽车。
机器学习是大数据时代的一个好工具,因为它擅长分析由大量行和列组成的数据集。机器学习可以生成有帮助的个性化推荐,而无需给出任何信息,例如为什么用户喜欢他们喜欢的东西,以及如何可能改变他们喜欢的东西。利用机器学习的目的是在可以提供价值的数据集中找到一致的关系,我们希望过滤掉随机发生的相关性。
讨论
利用客户的人口统计、跨国和购买信息的大数据和高级分析模型是创建营销活动的完美工具,这些营销活动旨在为公司带来短期收益。然而,从长远来看,促销活动创造的短期收入将威胁到建立品牌的投资。赛百味首席营销官托尼·佩斯(Tony Pace)指出,如果分析模型输出的促销活动不利于在不久的将来实现销售最大化,那么客户将总是获得他们购买最多的产品的促销活动。这可能会在短期内增加收入,因为促销活动很有可能导致购买,但从长远来看是破坏性的。一个品牌目录中被多次购买的产品数量与顾客对该品牌的忠诚度之间存在正相关关系。只鼓励重复顾客行为的短期促销,对公司及其品牌来说,只会是短期的成功。大数据和机器学习对营销人员来说是一个很好的补充,但只相信结果会导致与品牌及其价值观相矛盾的促销活动。有经验的营销人员需要确保公司的品牌和价值观得到保护,不会被数据驱动的模型所破坏。
Dellarocas 等人(2007)使用公开可用的数据建立了一个模型,以更好地预测电影的销售和收入。根据历史数据和知识,口碑对电影总票房的影响,Dellarocas 等人(2007)提出了一个模型,其中在线用户评论被用作模型的输入。创建的最佳模型能够每周预测收入轨迹,平均绝对百分比误差为 10%。在线评论的数量也可以用作票房早期销售的指标,并且在线评论的人口统计可以用于预测不同细分市场的需求。正如所料,Dellarocas 等人(2007)也发现了早期在线评论量与上映前几周票房收入之间的相关性。这种模式的优势在于,电影观众的在线电影评论可以在电影首映后的几个小时内在线获得,从而使电影的营销团队能够根据免费提供的数据快速采取行动。
对于能够实施分析工作的公司,组织中需要具备三种重要的能力:
(1)能够管理和整合多个数据源
(2)建立预测和优化模型
(3)管理层必须在整个组织中支持该计划,以便模型有助于更好的决策。
同样重要的是,不要从数据开始构建模型,而是从业务机会开始,并使用数据和分析来提高绩效。整合大量数据使公司能够执行统计和机器学习分析,以识别隐藏在数据中的模式和知识。然而,如果管理人员无法利用这种洞察力来提高业务绩效,大数据和分析将不会带来什么好处。企业需要以数据科学家的心态来处理大数据,而不仅仅是通过无休止地搜索数据中的故事来进行数据挖掘。
创建分析预测模型时,这些模型通常会变得复杂,因为有许多变量用于解释数据。准确性可能很高,但随着时间的推移,管理和维护大量变量是很困难的。因此,公司应该致力于构建最小化复杂性,同时最大化性能和准确性的模型。构建的模型还需要对用户透明且易于理解。一家零售商建立了一个模型来优化其广告投资回报,但却未能利用该模型,因为做出决策的关键营销人员不理解或不信任正在建立的模型。
大数据和分析数据驱动的努力也将使跨多个营销渠道衡量营销活动变得更加容易。从历史上看,不同的营销渠道,如电视、平面广告和数字营销都是孤立分析的。大数据计划支持整合多个数据源,从而更容易创建跨渠道的所有营销计划的 360 度视图。跨渠道分析还将阐明渠道之间的互动,例如电视广告发起网络搜索,再次导致潜在客户点击广告并购买产品。
据 Nichols (2013)称,数据驱动的洞察和分析还可以使公司保持现有的营销预算,同时在营销计划方面仍能获得高达 10%至 30%的更高绩效。然而,为了成功地模拟他们的业务,公司需要收集关于市场条件、竞争活动、营销活动、消费者反应和业务成果的数据。汽车制造商福特使用预测分析发现,营销预算在数字显示上分配了过多的资金,导致对搜索相关营销计划的投资减少。大数据和分析使福特能够调整其营销支出,以最大限度地利用不同的营销渠道。福特还发现,国家和地方营销预算很少一致,因此需要更好地协调,以涵盖国家和地方战略。在分配营销资金时,从以全国为重点转向以地方为重点,这种转变带来了数千万美元的收入,而没有比以前在营销上花费更多的钱。
将营销资金分配到正确渠道的能力对于营销团队的成功至关重要。大数据和高级分析通过基于海量数据的实时分析实现了这一点,这些数据可以在数字在线空间中每天、每周、每月甚至几秒钟内采取行动。
结论
今天,市场营销的很大一部分是基于品牌向顾客发送广告,试图影响他们的购买选择。广告费用于提醒顾客下次去杂货店购物时买一种特定的产品。在地平线上,机器人和智能物体正在出现,它们将接管消费者对产品的实际采购。智能冰箱会让顾客知道他什么时候需要进货,订单会被送到离顾客最近的最便宜的杂货店。当关于购物的选择留给机器人和算法时,以消费者为目标来影响他或她的购买模式的营销将是徒劳的。在不久的将来,银行可能会分析客户的银行账户,并确定他们可以通过更换能源提供商来节省资金。如果客户接受,机器人将与能源公司的机器人对话,代表客户协商更好的交易。营销的角色正在发生变化,未来市场将会快速发展。建立品牌和开展促销活动一旦付诸行动,可能会被证明是过时的。使用包含高级分析和机器学习的数据驱动计划对于公司在营销方面取得成功至关重要。
从影响客户到影响算法的转变可能是数字营销的未来。如果机器人和算法控制了采购,那么一个品牌需要成为算法中的默认选择。对品牌的忠诚度也将更难区分。购买的结果是算法忠诚还是消费者忠诚?此外,由于客户会受到偏见和习惯的影响,当购买选择由算法和机器人执行时,营销活动可能必须以不同的方式思考,这些算法和机器人对世界的看法与人类消费者不同。
营销正迅速成为一场基于数据和知识的战斗,只有通过认真实施数据驱动和分析工作才能取得胜利。
参考
巴顿 d 和 d 法院(2012 年 10 月)。让高级分析为您服务。哈佛商业评论。
布林克和麦克勒朗(2014 年 7 月至 8 月)。首席营销技术专家的崛起。哈佛商业评论。
chaffey d .和 F. Ellis-Chadwick (2012 年)。数字营销:策略、实施和实践(第五版。).英国培生教育有限公司。
达文波特、T. H .和 d .帕蒂尔(2012 年 10 月)。21 世纪最性感的工作。哈佛商业评论。
北卡罗来纳州达瓦尔(2016 年 10 月)。购物自动化后,营销会发生怎样的变化。哈佛商业评论。
Dellarocas,c .,X. M. Zhang 和 N. F. Awad (2007 年)。探索在线产品评论在销售预测中的价值:电影案例。互动营销杂志 21 (4),23–45。
多明戈斯,P. (1999 年 12 月)。奥卡姆剃刀在知识发现中的作用。数据挖掘与知识发现 3 (4),409–425。
多明戈斯,P. (2012 年 10 月)。关于机器学习需要知道的一些有用的事情。ACM 55(10),78–87 的通信。
Horst,p .和 R. Duboff (2015 年 11 月)。不要让大数据埋没了你的品牌。哈佛商业评论,第 3–9 页。
雷富礼和马丁(2017 年 1 月至 2 月)。顾客忠诚度被高估了。哈佛商业评论,第 3–10 页。
兰茨,B. (2013 年 10 月)。R 中的机器学习:学习如何使用 R 应用强大的机器学习方法,洞察现实世界的问题。伯明翰帕克特出版有限公司。
McAfee,a .和 E. Brynjolfsson (2012 年 10 月)。管理革命。哈佛商业评论。
Ng,A. (2016 年 11 月)。人工智能现在能做什么,不能做什么。哈佛商业评论。
尼科尔斯,W. (2013 年 3 月)。广告分析 2.0。哈佛商业评论,第 2–10 页。
Sorofman,j .,A. M. Virzi 和 Y. Genovese (2016 年)。Gartner 2016–2017 年 cmo 支出调查:预算攀升(再次!)随着营销人员应对更多的需求。高德纳公司技术报告。
斯威特伍德市(2016 年 10 月)。分析思维如何改变营销文化?哈佛商业评论。
约曼斯,M. (2015 年 7 月)。每个管理者都应该知道的机器学习。哈佛商业评论。
数字化转型正在从根本上改变人们寻找工作的方式,挑战公司以不同的方式寻找候选人。
原文:https://towardsdatascience.com/digital-transformation-is-radically-changing-how-people-look-for-work-challenging-companies-to-adc1aa039e73?source=collection_archive---------11-----------------------
如果你有时雇佣招聘供应商来填补公司的资源缺口,FTSE 100 business Paddy Power Betfair 的人才主管 Charlotte Steel 的这个 Q &将帮助你了解如何从你的 PSL 公司获得更多价值,并获得更好的合格候选人。
目前你在招聘方面面临的最大挑战是什么?
“首先要找到人才。像伦敦和都柏林这样的大城市是非常有竞争力的地点。对优秀人才的需求很大——尤其是在技术领域——我们正在与谷歌、脸书和支付高薪的银行竞争。
“此外,招聘机构在将公司的提议推向市场时,并不总是正确地包装公司的价值主张,这可能——而且确实会——通过聘用不匹配的候选人来推迟招聘过程。”
你对招聘机构有什么看法?
“行业失控了!我每天都被电话和邮件轰炸。我知道许多其他招聘主管也面临着类似的挫折。
“过去,我也对那些承诺过多、兑现不足的机构感到非常失望。
“我们做过的最好的事情是,当我们将角色外包给代理商时,清理我们的首选供应商名单(PSL)。我们对它进行了彻底的审查,现在它看起来很好,并提供了更好的合格候选人。通常,如果一个公司的内部团队没有能力雇佣专业技能,那么这个公司的招聘问题可以追溯到它的 PSL。如果代理公司不理解你公司的文化或者不能提供真正的结果,那就把他们赶走!那些坐在你的 PSL 上积灰的机构是在浪费你的时间。”
你多久检查一次你的 PSL?
“很难经常进行全面的评估,但我们会努力重新审视和调整我们的《PSL 季刊》。至关重要的是,招聘机构要保持警觉,达到你设定的关键绩效指标。PSL 绝对应该是敏捷且易于调整的。
“清理我们的 PSL 给我们带来了巨大的变化,我们现在正与科技等领域最具竞争力的机构合作,这些领域对人才有巨大的需求。”
你如何决定招聘人员是否留在你的 PSL?
“有几个因素需要考虑——寻找人才的技术,以及中介机构吸引潜在候选人的方式。
“候选人的质量显然是最重要的因素,但紧随其后的是他们能够多快地管理招聘过程并让选中的候选人加入进来。如果他们不能在所有这些领域提供出色的服务,就不要与他们合作!”
一家有着有趣价值主张的新机构应该如何与像贵公司这样的公司合作?
“以下是他们不能做的事情。不要发送与我们的业务需求无关的候选人简介。听起来显而易见,但你会惊讶这种事情发生的频率!不要试图向我们推销他们的‘神奇’,也不要浪费我们的时间。
“为了吸引我们的注意力,他们需要通过电子邮件或 LinkedIn 分享相关文章和博客来吸引我们。他们需要表现出战略性,而不是绝望!”
人们在指定招聘机构时最常犯的错误是什么?
“过于关注成本而非质量。如果你知道你会得到很好的服务和最好的候选人,那么专注于费用是没有意义的。”
你如何识别和研究市场,以确保你为自己的企业选择了正确的代理机构?
“我们与其他公司和内部网络论坛交流。然后,我们会回应那些向我们提供市场见解和有用的战略内容、展示其专业知识的机构。”
你如何从招聘机构中获取价值?
“我们始终如一地检查我们的机构是否达到了关键绩效指标。我们要求他们每季度发送一次绩效指标,这意味着他们一直在努力实现目标。最重要的是,我们会定期降级那些不合格的代理商,并提升其他代理商来取代它们。”
对于希望从招聘供应商那里获得更多价值的人,你会给他们什么建议?
“花必要的时间来识别使用现代资源方法的前瞻性思维机构,并关注每个机构能够提供的候选人的质量,而不是数量,这一点至关重要。确保你了解每个机构的专业领域,并将其与你的工作类别正确匹配。在你的 PSL 上拥有这些现代机构,将极大地提高你与能够获得合适人才的公司合作的机会。”
如果您正在寻找人才来源, 与团队取得联系 ,我们绝对可以提供帮助!
mat Roche——第三共和国董事兼联合创始人
数字化转型开启通往 GDPR 的大道
原文:https://towardsdatascience.com/digital-transformation-opens-up-the-high-road-to-gdpr-8a1b11788e19?source=collection_archive---------7-----------------------
参加我们上次关于“GDPR:将义务转化为机遇”的早餐会的小组提出了一个具体的挑战。总经理、首席信息官、营销总监和数据科学家可以一起讨论哪些主题?我们建议将这一新的欧洲数据保护指令作为一项设计挑战:GDPR 如何为提高贵组织数字资产的价值提供机会?让我在这里简单地展开这个论点。
在我们关于 GDPR 的大师班中,我们建议您将精力集中在 GDPR 合规性上,而不是放在法律保护上,而是放在组织流程、平台、人员和实践如何塑造组织数据的价值上。组织流程决定了您的组织如何使用数据为员工和客户服务。平台代表您的组织与其员工和客户一起工作的工具。人们指的是公司的利益相关者如何看待他们与组织的关系的心态。最后,实践唤起了不同的组织利益相关者消耗组织资源的方式。
Processes, platforms, people, and practices — the 4Ps of Digital transformation
您在 GDPR 合规方面的工作如何加强您的业务流程?业务流程利用数据来丰富涉众与组织合作的经验。数据的价值与其在建立组织与其不同的内部和外部利益相关者之间的信任和信心的场景中的使用密切相关。新 DPIA ( 数据保护影响评估)的要求需要关注组织试图实现的目标。
物联网技术的发展正在产生大量关于人员、交易和流程的数据流。理想情况下,这些平台提供了多种机会,使您的组织与其内部和外部客户之间的互动货币化。它们不仅揭示了个人数据,还揭示了个人与其社会和物理环境的二次关系的质量。IOT 提出了个人隐私和安全的具体挑战:同意、可靠性和违反侵权的风险需要通过设计隐私和默认安全的概念来解决,以培养员工和客户的信任和参与。
GDPR 的最终目标是影响人们关于如何使用数据与员工和客户互动、提议新产品和服务以及监控绩效的心态。数字化转型不是以兆字节来衡量的,而是以塑造关于数据驱动决策的管理思维来衡量的。新法规的范围和义务超越了数据保护官的角色,涵盖了整个组织的信息工作者。未来对数据保护机构的检查将集中在管理层的意图和实践上。
最重要的是,与数据处理的总投资相比,可衡量的管理实践为组织的数字战略价值提供了更好的指标。组织数据的价值取决于数据如何转化为行动号召的使用场景。数据不仅仅是制造和/或服务过程的副产品,它还反映了人类决策过程中的步骤。设计客户(内部和外部)体验,而不是围绕数据的信息流程,是预测并最终影响利益相关者行为的关键。
组织如何将 GDPR 的“障碍”转化为改善其数字资产的新机遇?让我们总结一下我们的论点。您对 GDPR 的实施是一个绝佳的机会,可以将重点放在定义您的组织如何使用数据来倾听、构思、创新和评估其产品、服务和体验的流程和网络上。设计的隐私和默认的安全为您的组织提供了试验物联网部署的机会,并将资源集中在能够带来切实好处的地方。数据保护官的工作不是坐在办公桌后,而是站在他的同事和客户面前,宣传您组织的数字化转型将如何有助于信任和价值。实现 GDPR 合规的捷径是构建您的数字化转型愿景,回报不在路的尽头,而在沿途的每一次对话中。
有兴趣掌握设计和实施有效的 GDPR 合规框架的方法吗? 报名参加我们在前往 GDPR 的新一日大师班。商业分析实践是商业分析学院的核心和灵魂。我们对数字经济、数据驱动的决策、机器学习和视觉通信的关注将使分析为您和您的组织服务。
Lee Schlenker 是商业分析和数字化转型教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 个人资料可以在 www.linkedin.com/in/leeschlenker.查看你可以在 https://twitter.com/DSign4Analytics的 Twitter 上关注我们
作为社区努力的数字化战略
原文:https://towardsdatascience.com/digitalisation-strategy-as-community-effort-4521d644d8e3?source=collection_archive---------7-----------------------
Industrial IoT and Data Science. (Image from pexels.com)
我最近写了一篇关于企业中的数字化的长篇文章,特别是大型组织中跨职能主题的挑战,如物联网或数据科学。我假设,不明确的责任、模糊的目标和组织单位之间缺乏沟通是物联网项目和整个数字化战略失败的重要原因。
最初的文章提到权力游戏和领土行为是阻碍公司数字化转型的两个问题。我们可能都同意,一些项目需要更换所有者、调整范围、被宣布不成功并关闭,或者在成功后,不得不开放以与其他正在进行的数字化计划集成或整合,这都有很好的实际原因。然而,如果他们的项目受到威胁,预计会遭到个人和团队的强烈反对。这可能有简单的个人原因(自尊心受到伤害),但这个问题也可能深深植根于一个组织问题:如果项目经理的奖金取决于这个项目的不同绩效指标,而从他的角度来看,照原样继续下去是有意义的,那该怎么办?然后,很明显,也要小心源于职业抱负和其他个人兴趣的组织理由。很容易想象,不明确的组织目标、错位的战略、筒仓式思维和部门之间的知识障眼法,是如何为令人讨厌的公司政治提供肥沃的土壤的。正如这篇 2012 年关于企业 IT 架构的有用文章所示,这些问题并不是最近的物联网项目所独有的。
“去实施一些工业 4.0 方法”
“实施一些工业 4.0”,没有一个好的经理说过,从来没有!但是我听说它被写进了年度目标协议…基于炒作和道听途说的荒谬目标对每个组织来说都是昂贵的。“我们需要区块链!”—例如,尽管任何简单的关系数据库都可以。“我们做 Hadoop 吧!”——隐含的希望是大数据可以弥补过时的台式电脑和低效的工作程序。那没有用。
良好的数字化战略基于所有可用的数据和专业知识,定义了可实现且可明确衡量的结果,理想情况下不仅仅是金钱收益和节省。产生最低可行产品(MVP)的独立、可管理和现实的项目比全公司号召“数字化”或“做一些工业 4.0”更有意义。一个或多个不协调的计划会产生不必要的重复工作,束缚大量资源,并对公司的日常运营产生负面影响,而不是一个最终变得相互关联的MVP 的马赛克,对于偶尔的失败来说更具可持续性和健壮性。
那些 MVP 是怎么规划的?从战略角度来看,物联网项目的执行有一些框架。虽然 IT 项目管理框架非常丰富,但物联网的跨学科性质保证了它们的特殊待遇。主要是由于潜在客户对物联网战略复杂性的担忧,博世软件创新公司在 2015 年发布了 Ignite 物联网方法,行业分析师玛奇纳研究公司和其他人对此做出了贡献。他们的书企业物联网以制造业、联网汽车和智能公用事业的用例为开篇,然后探讨项目经理在这些领域必须提出的商业和技术问题。重要的是,在进入硬件和软件之前,策略、机会识别和机会管理是 Ignite IoT 方法的一部分。业务案例是这一战略的核心。AgileIoT 框架(即将成为 Eclipse 项目)更加专注于以敏捷和面向开发的方式交付物联网解决方案。然而,与 Ignite 类似,他们的原型阶段也知道愿景定义和成功定义,并处理重要的战略方面,如项目失败时的撤退选项。像公司敏捷性和公司改进这样的主题总结了他们的方法。然而,Ignite 和 AgileIoT 都假定了一些显而易见的通用用例,从业者需要在他或她的应用领域中找到一个合适的类比。但是预测性维护对于石油和天然气的现场操作人员来说到底意味着什么,它与在液化气处理中寻找类似应用的人的工作有什么不同?我呼吁社区努力识别这样的用例,以建立一个强大的项目组合。
让我们绕道进入开源软件。这是以合作方式开发的软件,通常是免费的。这意味着有人投入时间和精力来实现某些功能,而没有直接的收入预期,而其他人将该软件用于他们自己的目的。令人惊讶的是,在开源运动的初期,大多数个人都为公益贡献了时间,现在越来越多的公司选择为开源开发贡献时间,有时是整个团队。原因很简单:没有人通过编写像第七代 XML 解析器这样的商业软件获得竞争优势,但是通过重用由社区共享和测试的稳定的代码库,每个人都是赢家。
我们需要在 Ignite IoT 或 Agile IoT 之上的开放框架:可以让整个行业变得更好的想法和概念,而不仅仅是偶尔的概念验证。
类似于开源,但针对特定于垂直行业的流程…
我怀疑更擅长鼓风炉空气过滤器或类似的东西的预测性维护会成为钢铁行业的竞争优势。同样,分享生物反应器的整体设备效率(OEE)可以通过监测某些形式的沉积物来提高,这并不是生物技术公司之战的决定性因素。还有其他 USP 来区分它们。然而,前述场景是在工业 4.0 的当前阶段,每个企业似乎都在思考的问题。这是软件领域已经学会避免的痛苦的商品问题。然而,对于物联网特别是垂直行业,每个人似乎都在重新发明轮子。对于一个给定的应用领域,我们应该识别并解决每个人遇到的问题(以及哪些不会泄露 USP)。
就建筑模式而言,已经有很多人在棕色地带努力简化数字化工作。以 RAMI 4.0 为例。工业 4.0 的参考架构模型非常详细地概述了技术组件(例如预测性维护解决方案)应该如何连接,以及在将运营资产连接到企业 IT 时应该遵守哪些标准。虽然我承认不可能在每个车间的使用案例中展示这种方法的效用,但 RAMI 缺少的是关于哪些制造设备将受益于预测性维护、收集相关数据的难易程度以及相应设备的业务案例的实用指导。因此,全世界可能有数百个高炉空气过滤器的概念验证或可行性研究……我认为数字化意味着做事更有效率。
我目前正在寻找物联网在化工行业特定领域的机会。如果在相似环境中工作的每个人都分享他们的发现,这不是很聪明吗?如果巧克力工厂的查理告诉我,实时跟踪 Oompa-loom pa 人通常是浪费金钱,但用传感器装备温暖的糖果室确实是一个绝妙的想法,应该在我的 OEE 优化列表中排在第一位?
像这样的交流需要一种新的心态,并接受在某些方面,甚至你的竞争对手也可以成为合作伙伴,如果我们谈论整个行业的效率提高,没有人会吃亏。这听起来像是社会主义者的白日梦,但尤其是在能源效率和减少废物方面,对整个社会的好处应该是一种激励。
建议和愿望清单
到目前为止,这实际上只是回顾了我对形势的看法,不仅仅是在我们公司,而是在我过去几年交往过的大多数组织。我的结论是:
- 组织需要非常明确地致力于数字化。你不能只是增加技术,你需要改变流程。这大概就是它被称为第四次工业革命的原因。
- 循序渐进和概念验证是好的。然而,宣布一个组织冠军(数字领导)来协调和监督这些项目。没有复制工作的意义。只有当结果被广泛共享时,组织才能从 PoC 中学习。
- 浪费是不好的。如果成功,请确保您的 PoC 可以在生产中继续运行。这也意味着你要尽早声明你的接口(技术接口和过程接口),这样组织就可以调整并从你的工作中获益。
- 有一个互补的项目组合。当真正的组织痛点仍未解决时,评估某项技术影响的三项可行性研究有何意义?这是一个自然的发展,因为每个人都在追求唾手可得的果实,而将真正困难的问题推迟到以后的阶段。
关于最后一项,我们应该如何确定项目的优先顺序?每一个优秀的经理可能都会说“追求最大的影响”,因为这能让高层管理人员和项目发起人高兴。然而,说起来容易做起来难。
了解制造业真正痛点的人是运营工程师,而不是数字化、物联网或数据科学专家。虽然也有例外,但现实是在 OT、IT 和其他技术人员之间存在着巨大的知识鸿沟。相反,如果不了解制造流程,最伟大的数据科学家也不会增加价值,事实上,他们可能能够预测某种类型的机器故障,而这在实践中很少发生…
Would it not be great if somebody already had assessed the potential for IoT and data science, and shared it across your industry?
这让我回到了特定行业内的知识共享,类似于开源。我希望有一个比 Ignite IoT 或 AgileIoT 高一级的框架告诉我:
- 如何盘点 X 行业一个新颖的制造环境?
- Y 的制造有哪些真正的痛点?
- 在 Y 的生产中我可以预期会遇到什么类型的机械,它多久坏一次,修理要花多少钱,所说的机械对生产过程有什么影响?这种信息的效用的一个例子是:
- 在预防机器 A 的故障时,是否有更好的省钱机会?在车间里通常有几十台机器 A,它们经常发生故障,但维修费用很低。或者,是否应该对机器 B 进行昂贵的改造,机器 B 很少发生故障,但一旦发生故障,就会非常痛苦?
这些问题 OT 比任何人都更容易回答,但他们可能甚至没有意识到这些是数字化团队感兴趣的相关问题。与此同时,加班是一个关键的资源,他们只有有限的时间进行他们可能认为是学术上的闲聊。因此,不幸的是,这些对话并不像人们希望的那样频繁。围绕“X”制造过程中的数字化问题,建立一个集中的访问点将真正有益!
降维——主成分分析真的能改善分类结果吗?
原文:https://towardsdatascience.com/dimensionality-reduction-does-pca-really-improve-classification-outcome-6e9ba21f0a32?source=collection_archive---------0-----------------------
介绍
我遇到了一些关于降维技术的资源。这个主题无疑是最有趣的主题之一,想到有算法能够通过选择仍然代表整个数据集的最重要的特征来减少特征的数量,真是太好了。作者指出这些算法的优点之一是可以改善分类任务的结果。
在这篇文章中,我将使用主成分分析(PCA)来验证这一说法,以尝试提高神经网络对数据集的分类性能。PCA 真的能改善分类结果吗?我们去看看。
降维算法
在开始编码之前,我们先来谈谈降维算法。有两种主要的降维算法:线性判别分析(LDA)和主成分分析(PCA)。这两者之间的基本区别是 LDA 使用类别信息来发现新特征,以便最大化其可分性,而 PCA 使用每个特征的方差来做同样的事情。在这种情况下,LDA 可以被认为是监督算法,而 PCA 是无监督算法。
谈论 PCA
PCA 背后的思想是简单地找到一组概括数据的低维轴。为什么我们需要汇总数据呢?让我们考虑一下这个例子:我们有一个由汽车的一组属性组成的数据集。这些属性通过大小、颜色、圆形度、紧凑度、半径、座位数、车门数、行李箱大小等来描述每辆车。然而,这些特征中的许多将测量相关的属性,因此是多余的。所以要去掉这些冗余,用较少的属性来描述每辆车。这正是 PCA 的目标。例如,将车轮数量视为轿车和公共汽车的一个特征,这两个类别中的几乎每个示例都有四个车轮,因此我们可以看出该特征具有较低的方差(在一些罕见的公共汽车中,从四个车轮到六个车轮或更多),因此该特征将使公共汽车和轿车看起来相同,但它们实际上彼此非常不同。现在,考虑高度作为一个特征,汽车和公共汽车有不同的值,方差从最低的汽车到最高的公共汽车有很大的范围。显然,这些车辆的高度是区分它们的良好属性。回想一下,PCA 不考虑类的信息,它只查看每个特征的方差,因为合理的假设是呈现高方差的特征更可能在类之间具有良好的分割。
通常,人们最终会错误地认为 PCA 从数据集中选择了一些特征,而丢弃了其他特征。该算法实际上是基于旧属性的组合来构建新的属性集。从数学上来说,PCA 执行线性变换,将原始特征集移动到由主分量组成的新空间。这些新特征对我们来说没有任何实际意义,只有代数意义,因此不要认为线性地组合特征,你会发现你从未想过它可能存在的新特征。许多人仍然相信机器学习算法是神奇的,他们将成千上万的输入直接输入到算法中,并希望为他们的业务找到所有的见解和解决方案。别被骗了。数据科学家的工作是使用机器学习算法作为一套工具,而不是魔术棒,通过对数据进行良好的探索性分析来定位对业务的见解。牢记在心。
主成分空间是什么样子的?
在新的特征空间中,我们正在寻找一些在不同类别之间有很大差异的属性。正如我在前面的例子中所展示的,一些呈现低方差的属性是没有用的,它会使例子看起来一样。另一方面,主成分分析寻找尽可能跨类显示更多变化的属性来构建主成分空间。该算法使用方差矩阵、协方差矩阵、特征向量和特征值对的概念来执行 PCA,结果提供一组特征向量及其各自的特征值。PCA 的表现如何是下一篇文章的素材。
那么,特征值和特征向量应该怎么处理呢?很简单,特征向量代表主分量空间的新的一组轴,特征值携带每个特征向量的方差的信息。因此,为了降低数据集的维数,我们将选择那些方差较大的特征向量,丢弃那些方差较小的特征向量。通过下面的例子,我们会越来越清楚它到底是如何工作的。
让我们最终看到一些代码。
现在,我们到了这篇文章有趣的部分。让我们看看主成分分析是否真的改善了分类任务的结果。
为了解决这个问题,我的策略是在数据集上应用神经网络,并观察它的初始结果。然后,我将在分类之前执行 PCA,并对新数据集应用相同的神经网络,最后比较两个结果。
该数据集来源于 UCI 机器学习知识库,称为“Statlog(车辆轮廓)数据集”。该数据集存储了四种车辆轮廓的一些测量值,用于分类。它由 946 个示例和 18 个测量(属性)所有数值组成,您可以在此链接查看更多详细信息:https://archive . ics . UCI . edu/ml/datasets/Statlog+(Vehicle+Silhouettes)。神经网络将是一个多层感知器,具有四个隐藏节点和一个输出节点,所有节点都使用 sigmoid 函数作为激活函数,PCA 函数来自 R 包。
准备数据集
首先,我要为二元分类准备数据集。
我将只从两个类中选择例子,以便组成一个二元分类。这些例子将来自“公共汽车”和“北京汽车股份有限公司”类。“北京汽车股份有限公司”将被 0 级取代,“公共汽车”将被 1 级取代。下一步是将数据集分为训练数据集和测试数据集,分别占总类示例的 60%和 40%。
在之前的数据集准备之后,让我们一次使用所有特征来建模神经网络,然后应用测试数据集。
*# Load library*
**library**( dplyr )
*# Load dataset*
data = read.csv( "../dataset/vehicle.csv", stringsAsFactor = FALSE )
*# Transform dataset*
dataset = data %>%
filter( class == "bus" | class == "saab" ) %>%
transform( class = ifelse( class == "saab", 0, 1 ) )
dataset = as.data.frame( sapply( dataset, as.numeric ) )
*# Spliting training and testing dataset*
index = sample( 1:nrow( dataset ), nrow( dataset ) * 0.6, replace = FALSE )
trainset = dataset[ index, ]
test = dataset[ -index, ]
testset = test %>% select( -class )
*# Building a neural network (NN)*
**library**( neuralnet )
n = names( trainset )
f = as.formula( paste( "class ~", paste( n[!n %in% "class"], collapse = "+" ) ) )
nn = neuralnet( f, trainset, hidden = 4, linear.output = FALSE, threshold = 0.01 )
plot( nn, rep = "best" )
Figure 1. Neural Network MultiLayer-Perceptron
*# Testing the result output*
nn.results = compute( nn, testset )
results = data.frame( actual = test$class, prediction = round( nn.results$net.result ) )
*# Confusion matrix*
**library**( caret )
t = table( results )
print( confusionMatrix( t ) )## Confusion Matrix and Statistics
##
## prediction
## actual 0 1
## 0 79 0
## 1 79 16
##
## Accuracy : 0.545977
## 95% CI : (0.4688867, 0.6214742)
## No Information Rate : 0.908046
## P-Value [Acc > NIR] : 1
##
## Kappa : 0.1553398
## Mcnemar's Test P-Value : <0.0000000000000002
##
## Sensitivity : 0.5000000
## Specificity : 1.0000000
## Pos Pred Value : 1.0000000
## Neg Pred Value : 0.1684211
## Prevalence : 0.9080460
## Detection Rate : 0.4540230
## Detection Prevalence : 0.4540230
## Balanced Accuracy : 0.7500000
##
## 'Positive' Class : 0
##
不含 PCA 的结果
似乎我们得到了一些结果。首先,看看混淆矩阵。基本上,混淆矩阵表示有多少例子被分类。主对角线显示正确分类的实例,次对角线显示错误分类。在第一个结果中,分类器显示自己非常困惑,因为它正确地分类了几乎所有来自“saab”类的示例,但它也将大多数“bus”类的示例分类为“saab”类。加强这一结果,我们可以看到,准确性的价值约为 50%,这是一个非常糟糕的分类任务的结果。该分类器基本上有 50%的概率将新实例分类为“汽车”类,50%的概率分类为“公共汽车”类。类似地,神经网络为每一个新的例子抛硬币来选择它应该分类到哪个类别。
让我们看看 PCA 是否能帮助我们
现在,让我们对数据集执行主成分分析,并获得特征值和特征向量。实际上,你会看到来自 R 包的 PCA 函数提供了一组已经按降序排序的特征值,这意味着第一个分量是方差最高的那个,第二个分量是方差第二高的特征向量,以此类推。下面的代码显示了如何根据特征值选择特征向量。
*# PCA*
pca_trainset = trainset %>% select( -class )
pca_testset = testset
pca = prcomp( pca_trainset, scale = T )
*# variance*
pr_var = ( pca$sdev )^2
*# % of variance*
prop_varex = pr_var / sum( pr_var )
*# Plot*
plot( prop_varex, xlab = "Principal Component",
ylab = "Proportion of Variance Explained", type = "b" )
Figura 02. Percentage of Variance from each Principal Component
*# Scree Plot*
plot( cumsum( prop_varex ), xlab = "Principal Component",
ylab = "Cumulative Proportion of Variance Explained", type = "b" )
Figure 03. Cumulative sum of Variance
stats 默认包中的本地 R 函数“prcomp”执行 PCA,它返回所需的所有特征值和特征向量。第一个图显示了每个特征的方差百分比。可以看到,第一个分量的方差最大,约为 50%,而第八个分量的方差约为 0%。因此,这表明我们应该选择前八个组件。第二张图显示了方差的另一个角度,尽管所有方差的累积和,您可以看到前八个特征值对应于所有方差的大约 98%。事实上,这是一个相当不错的数字,这意味着只有 2%的信息丢失。最大的好处是,我们从一个有 18 个特征的空间转移到另一个只有 8 个特征的空间,只损失 2%的信息。毫无疑问,这就是降维的力量。
既然我们已经知道了将构成新空间的要素的数量,让我们创建新的数据集,然后再次对神经网络建模,并检查我们是否获得了新的更好的结果。
*# Creating a new dataset*
train = data.frame( class = trainset$class, pca$x )
t = as.data.frame( predict( pca, newdata = pca_testset ) )
new_trainset = train[, 1:9]
new_testset = t[, 1:8]
*# Build the neural network (NN)*
**library**( neuralnet )
n = names( new_trainset )
f = as.formula( paste( "class ~", paste( n[!n %in% "class" ], collapse = "+" ) ) )
nn = neuralnet( f, new_trainset, hidden = 4, linear.output = FALSE, threshold=0.01 )
*# Plot the NN*
plot( nn, rep = "best" )
Figure 04. Neural Network with new dataset
*# Test the resulting output*
nn.results = compute( nn, new_testset )
*# Results*
results = data.frame( actual = test$class,
prediction = round( nn.results$net.result ) )
*# Confusion Matrix*
**library**( caret )
t = table( results )
print( confusionMatrix( t ) )## Confusion Matrix and Statistics
##
## prediction
## actual 0 1
## 0 76 3
## 1 1 94
##
## Accuracy : 0.9770115
## 95% CI : (0.9421888, 0.9937017)
## No Information Rate : 0.5574713
## P-Value [Acc > NIR] : < 0.00000000000000022
##
## Kappa : 0.9535318
## Mcnemar's Test P-Value : 0.6170751
##
## Sensitivity : 0.9870130
## Specificity : 0.9690722
## Pos Pred Value : 0.9620253
## Neg Pred Value : 0.9894737
## Prevalence : 0.4425287
## Detection Rate : 0.4367816
## Detection Prevalence : 0.4540230
## Balanced Accuracy : 0.9780426
##
## 'Positive' Class : 0
##
嗯,我想我们现在有更好的结果了。让我们仔细检查一下。
混淆矩阵这次显示了非常好的结果,神经网络在两个类中都犯了较少的错误分类,这可以通过主对角线的值以及准确度值约为 95%看出。这意味着分类器有 95%的机会正确地分类一个新的看不见的例子。对于分类问题来说,这是一个完全不差的结果。
结论
降维在机器学习中起着非常重要的作用,尤其是当你处理成千上万的特征时。主成分分析是顶级的降维算法之一,在实际工程中不难理解和使用。正如我们在这篇文章中看到的,这种技术,除了使特征操作的工作变得更容易之外,还有助于改善分类器的结果。
最后,第一个问题的答案是肯定的,事实上主成分分析有助于改善分类器的结果。
下一步是什么?
正如我之前提到的,还有其他可用的降维技术,如线性判别分析、因子分析、Isomap 及其变体。ideia 正在探索每种方法的优点和缺点,并检查其单独和组合的结果。LDA 结合 PCA 会改善分类器的结果吗?好吧,让我们在接下来的帖子里研究一下。
完整的代码可以在我的 git hub 仓库和数据集上找到。(https://github.com/Meigarom/machine_learning
感谢你花时间阅读这篇文章。我真的很感激,随时欢迎反馈。
一会儿见。
假人的降维第 2 部分:砌砖
原文:https://towardsdatascience.com/dimensionality-reduction-for-dummies-part-2-3b1e3490bdc9?source=collection_archive---------10-----------------------
你知道吗,我们通常取笑那些出现在电视上或其他场合的人,他们自信地谈论他们实际上一无所知的事情,却忘记了我们在头脑中做着完全相同的事情:我们处理我们无法明确定义的问题,我们试图用我们确实不知道它们如何工作的工具来解决它们,我们认为知道一个概念的名称就等于理解了它。
你不能指望在没有首先确保下面所有九层的刚性的情况下建造第十层。你不能指望在没有掌握所有基本概念的情况下就能理解一个概念。为此,我们将在本文中为我们的理解建立必要的基础。
从零开始重新发明轮子是徒劳的——那会填满厚厚的书。但我至少假设你对线性代数和统计学有基本的了解。同样,在你读完《T4》第一部之前不要继续。
你卷起袖子了吗?
楼层#1 —内部(点)产品
点积就是那条红色线段的长度。就这样。
但是最简单的事情通常有最大的影响。当我告诉你之后我们所做的一切都可以用点积来解释时,你可能会感到惊讶。这样做的一个原因是,点积可以用多种方式来看:
- 是矢量(或点) a ,在定义的线上的投影长度单位矢量 b 。
- 沿定义的直线到 a 的距离最近。
- 它是矢量 a 包含在 b 方向中的‘量’或分量。
- 它衡量的是 a 与 b 的接近程度(就角度而言)。
甚至它的计算看似简单:如果 a =(1,2), b =(0.8,0.6),那么这个运算可以用矩阵乘法来完成:
If you don’t know where this came from, watch this.
类固醇上的点积
现在我们唯一的向量又多了三个朋友,我们需要组织一个聚会,把他们都投射到线上。如果我们用下式表示我们的矢量和单位矢量:
然后我们可以再次利用矩阵乘法**的简洁来得到每个向量对应的在单位向量b上的每个投影长度:**
其中 p 是每个点(向量)的投影长度。
地板# 2——外部产品
这一切都很好,直到你意识到点积给出的只是线段的长度,而不是表示它的向量。
为了求出矢量,单位矢量乘b)的点积:******
类固醇的外部产物
现在看看当我们注射类固醇时会发生什么,就像我们注射点积一样,也就是说,当我们有多个向量时:
我们要找到 w 1、 w 2、 w 3、 w 4。记住,它们是代表每个点在单位向量 b 上的投影长度的向量:
虽然看起来很复杂,所做的只是用每个投影长度 ( p 1, p 2, p 3, p 4),依次缩放单位向量 b ,并将这些缩放后的向量按行存储在矩阵 W** 中。******
现在,我们可以将代表投影长度的矢量 p 和矢量 b (我们投影的单位矢量)之间的外积定义为:
这给了我们“投影向量”,每行一个。****
第三层——翻转垫子,变成一只猫
当你遇到困难时,问问你的猫。如果它像上图那样侧着头,那么它想告诉你一些事情:
"换个角度看问题,你会发现许多有趣的事情."
或者“喵”。无论如何,让我们看看我们能做什么。假设我们有以下由 3 个示例(天)和 2 个要素(城市)组成的微小天气温度数据集,以及它的矩阵表示和 2D 散点图:
这并不特别鼓舞人心。但是如果我们像猫一样歪着头看矩阵:
我们对数据集有了完全不同的解释。现在我们的矩阵有 2 个点和 3 个维度。看起来是这样的:
完全理解这意味着什么至关重要:
- 新矩阵将日期(示例)作为轴,将城市(特征)作为点。旧的是反过来的。****
- 新矩阵中的每一行都是三维空间中的一个点。
- 第一行包含每个示例(天)的 x 坐标,每列一个。这意味着第一个点的 x 、 y 和 z 坐标分别是旧矩阵中第 1 天、第 2 天和第 3 天的 x 坐标的值。同样,第二行有 y。****
- 如果我们有超过三天的时间(示例),新矩阵将需要一个 4+维的图。然而,仍然只有两个点,代表它们的向量将定义一个平面,我们可以很容易地在纸上画出来:****
Three points define a plane: The origin, point x and point y.
所以从现在开始,我们只画那个平面。如果我们并排绘制平面和原始散点图的图,我们就得到了所谓的双标图:********
The scatter plot is called the variable space. The plane mentioned above is in the dual space.
4 楼——一个广阔的新世界
现在我们可以探索双重空间的广阔新世界。为了更好地理解它,我们必须看到两个世界之间的联系:
Red vector x represents the x-coordinates of the examples. Blue vector, y.
权利要求#1: 数据集在x-方向的 方差 是矢量 x 与自身的点积。同样适用于 y 。**
索赔#2 :数据集的 协方差 是两个向量的点积。
哇哦。
这些说法需要严肃的理由。
五楼——焕然一新
让我们达成共识,让我们的生活变得更轻松:我们将要处理的所有数据集都是以均值为中心的。这意味着我们从每个点减去每个特征的平均值,这样数据集将在原点居中。这根本没有改变我们数据的结构,但是简化了计算。
1.差异
在对偶空间中,矢量 x 的分量是每个例子的 x 坐标,即 Vx =( x1,x2,x3 )。同样, Vy =( y1,y2,y3)。记住沿 x 的方差是 x 坐标与其平均值的均方差。但是因为平均值是零,它将是:
但那正是矢量 x 与自身的点积,或者,等价地,它的平方长度:****
为了使事情变得简单,我故意忽略了因子 1/3,因为我们现在只对量的关系感兴趣。
2.协方差
还记得在第一部分中,我们将协方差解释为一种从一个变量预测另一个变量的精确度的度量。把这个用数量术语来说,我们假设最简单的一种关系: y 是 x 的某个倍数,或者 y=mx (一条穿过原点的线)。我们的变量越忠实地展现这种关系,协方差就越大,反之亦然。
如果你仔细观察权利要求#2 上面的动画,你会发现数据偏离直线,越多,两个向量之间的角度就越大,因此的点积就越小。因此,点积是协方差的一个非常自然的度量。
一个小小的观察会让你意识到这完全有道理。记住 Vx =( x1,x2,x3) 和 Vy =( y1,y2,y3 )。如果数据遵循线性关系( y=2x ,那么 Vy =(2 x 1,2 x 2,2 x 3)=2 Vx 。也就是说,向量是彼此的标量倍数,它们共线,点积最大。****
我们现在可以通过定义以下内容来正式表述这一主张:
3.协方差矩阵
方差和协方差都只是点积,可以用一个矩阵来概括:
Obviously, cov(x, y) = cov(y, x). So the matrix is symmetric.
4.一般化
将这个想法扩展到数据集中的 3 个以上的点是简单的。我们将需要 4+维绘图来表示示例,但是对于两个特征、 x 和 y 仍然只有两个向量,并且它们将定义一个可以容易绘制的 2D 平面,并且执行点积。同样的想法仍然成立。
砖房
在这一点上,我们的地板是砖做的。你不能住在砖房里,对吗?不。我们要结束了。我们需要一个屋顶来观察我们如何将这些想法结合到一个框架中来解决 PCA 问题。
这正是我们在第 3 部分中要做的。
虚拟模型的降维第 3 部分:连接点
原文:https://towardsdatascience.com/dimensionality-reduction-for-dummies-part-3-f25729f74c0a?source=collection_archive---------4-----------------------
这是一切都到位的地方。
回到第 1 部分 & 第 2 部分,我们看到我们的最终目标是找到这些定义最大方差方向的向量。鉴于我们目前所了解的情况,这个过程现在才有意义。
我假设你知道线性变换,特征向量和特征值的基础知识,因为没有必要重复已经完全建立的东西。但是如果你需要一些洞察力,请看这个很棒的教程。
让我们开始吧。
你想要什么?
你不能解决一个你没有明确定义的问题,这就是为什么我们应该考虑我们通过寻找最大方差的方向到底意味着什么。开始问自己什么是方差是很自然的。
正如我们之前看到的,沿 x 轴的方差是该轴表示的特征的方差,即数据集的 x 坐标的方差。为了将这个概念推广到空间中的任何线,一个简单的观察是适当的:
数据点的 x 坐标仅仅是它们在 x 轴上的投影。
利用这一事实,我们可以通过将我们的点投影到代表直线的单位向量上,然后计算这些投影的方差,从而很容易地找到沿着任何直线的方差。
如果 A 是我们的( n x d ) 均值居中的数据矩阵,其中 n 是实例(点数) d 是维数(特征),而 v 是我们线的单位向量,那么
其中 p 是一个( n x 1)列向量,其中每个元素是每个点的投影长度。
现在我们有了列向量中的长度,我们可以使用 Floor #5 来求它们的方差:
突然,弹出了我们数据的协方差矩阵, C !这个非常奇怪的外观将为我们提供很大的帮助。给定我们对沿任意直线的方差的定义,我们可以通过说我们想要找到向量 v 使得 σ 是最大值来重新表述我们的问题。从上面的定义可以明显看出,这个向量仅仅依赖于 C 的值,这迫使我们仔细研究这个奇怪的矩阵。
奇怪的协方差
在上一部分中,我们了解到一个( n x d )数据矩阵有一个( d x d )协方差矩阵,即一个 2D 数据集有一个 2x2 协方差矩阵。你应该知道,一个矩阵可以看做是一个线性变换,通过剪切或者旋转将向量映射到其他向量。对于我们的协方差矩阵来说,这没有什么不同。
了解线性变换矩阵的最佳方法是查看其特征向量——这些向量不会被矩阵旋转或剪切,而只会缩放与其特征值相等的量。如果 v 是特征向量,λ是其特征值,则:
然而,协方差矩阵的特征向量具有特殊的性质。协方差矩阵是对称的,具有正交特征向量——单位长度且相互正交的向量证明。这产生了以下恒等式:
特征向量的优雅来自一个简单的事实:空间中的任何向量都可以表示为一个矩阵的特征向量的线性组合。这种优雅背后的原因是,我们现在可以根据特征向量和特征值,计算由矩阵 C、表示的线性变换对任何向量 u 的影响。这将复杂的矩阵乘法程序 C.u 转化为简单的矢量缩放。要了解这是如何做到的,请注意,( 2 x 2)协方差矩阵有两个对应于每个维度的正交本征向量。任何向量 u 都可以用两个特征向量 v 1 和 v 2 表示为:
Where k1and k2 are scalars.
所以要找出协方差矩阵对任何向量的影响:
我们现在可以把我们想要最大化的量, (u^T)Cu )写成:
在最后一步中我们使用了标准正交恒等式。
大惊喜
找到最大化【σ】=(u^t)cu)的 u 就是找到 k 1 和k2**——定义 u 的特征向量的系数。但是由于我们只关心定义最大方差线的单位向量, k1 +k2 = 1 。你现在能猜出如何最大化 σ 吗?
关键是要注意,如果 λ1 > λ2 ,那么最大化σ的唯一方法,给定约束 k1 + k2 = 1,就是将 1 赋给 k 1,0 赋给 k 2,这样最大的特征值λ1 支配总和。****
这让我们大吃一惊:
最大方差的方向是具有最大绝对特征值的协方差矩阵的特征向量。
因为如果 k 1=1 并且 k 2=0,那么u变成:
即 u,方差最大的方向,是具有最大特征值的特征向量 v 1 本身。对此的一个直接结论是,第二大的方差方向对应于具有第二大的特征值的特征向量,以此类推。
另一个大惊喜
更有趣的是,如果你看我们的问题陈述:
并结合 v 为特征向量的事实,则:
即
特征向量方向上的方差是它们的特征值。
现在怎么办?
好吧。我们终于找到了我们都想要的向量。现在怎么办?
如果您还记得第 1 部分中的内容,我们通过将点投影到方差最大的线上,将 2D 数据集简化为一条 1D 线。现在我们已经有了我们需要的所有量,即数据矩阵 A 、协方差矩阵 C 及其定义我们的线的特征向量 v 1 、 v 2 ,我们可以执行投影:
**
推广到更大的维度只是用额外的组件来扩充我们的矩阵。如果我们在 3D 中,协方差矩阵有 3 个特征向量, v 1, v 2, v 3 ,从最大到最小 λ 排序。但是为了更灵活地组织我们的问题,我们使用矩阵乘法的性质。我们的问题现在可以表述为:
其中 E 是方差(特征值)的对角矩阵,而 V 是特征向量的标准正交矩阵,按列排列。取任意数量的具有最大特征值的主成分(特征向量),并将我们的数据投射到它们上面以降低维数。如果我们选择 v 1 和 v 2,最大方差的平面现在由它们定义,将这些点投影到平面上相当于投影到 v 1 和 v 2 上,然后组合这些分量:
This is just an extension to projection on a line (p = Av), where v is now a matrix V of column-wise vectors.
一般程序
求协方差矩阵的特征向量的过程称为协方差矩阵的特征分解,是求解 PCA 的方法之一。这个名字来源于这样一个事实,如果我们把我们的问题陈述重新组织成:
Using the identity V^T = V^-1 for orthonormal matrices
然后矩阵 C 被分解成它的特征向量 V 和特征值 e。
我们应该选择多少个特征向量来投影我们的数据?经验法则是选择第一个 n 个特征向量,使得它们的方差(特征值)之和大于总数的 95%。
我们现在可以总结使用 PCA 降低维数的过程:
- 平均值-通过从平均值中减去每个要素来确定数据的中心。
- 求中心数据 C =(A^T)A.的协方差矩阵
- 对 c 应用特征分解。
- 按照特征值降序排列特征向量。
- 选择解释总方差 95%的第一个 n 个特征向量。
- 创建一个矩阵 V ,其中每一列都是 n 个选择向量中的一个。
- 将数据投影到由 V 定义的子空间上:
下一步是什么
另一个非常有趣的解决 PCA 的方法是奇异值分解(SVD)。它类似于特征分解,但在实践中更通用、更广泛。但是这已经足够了,所以我把它留给下一部分。
降维:方法和直觉
原文:https://towardsdatascience.com/dimensionality-reduction-ways-and-intuitions-1b5e97592d8e?source=collection_archive---------8-----------------------
Photo of Jupiter by NASA 360 on Facebook
在大数据应用变得无处不在后,维数灾难变得比预期的更严重。因此,对于这种高维空间,可视化和分析变得更加困难。此外,我们来自 2D 和 3D 世界的洞察力和直觉(例如,距离)不再适用。另一个问题是,当预测器的数量很高时,预测模型更有可能具有高方差,这使得模型易于过度拟合。
ّThis 的文章是关于降维技术的,这是我作为数据科学硕士生第一学期学到的。对于每一种技术,我将尝试提供直觉、标准和用例,并支持 Python 中的插图。为了简单起见,我不会深入这些技术的底层数学,但我会回顾一下我第一次研究它们时想到的问题。
主成分分析法:
主成分分析是降维技术中最流行和最广泛使用的方法之一。PCA 是一种无监督的方法,这意味着它不需要对您的数据执行任何标记。首先,您应该知道数据集中的每个要素都有一些可变性(即方差),这表明您的数据围绕平均值分布了多少。PCA 是做什么的?它得到一些线性独立的分量(即,每个分量之间的相关性为零),而每个分量是原始特征的线性组合,同时尽可能多地保留数据的总方差。因此,如果您的目标是在执行降维的同时保持数据的方差,那么 PCA 是一个不错的选择。
import numpy as np
from sklearn.decomposition import PCA
*# Generate random Data of size (n x 5).* X = np.random.uniform(size=(20, 5))
*# Number of component wanted. X after reduction will be (n x 3).* pca = PCA(n_components=3)
X_reduced = pca.fit_transform(X)
*# Portion preserved from the total variance.
# If 1, means we didn't lose any variance.* print("Portion preserved from the total variance", np.sum(pca.explained_variance_ratio_))
你也可以指定想要的最小变化量,它会为你决定组件的数量。
pca = PCA(n_components=0.90)
X_reduced = pca.fit_transform(X)print("Number of components =", pca.components_)
线性判别分析— LDA:
LDA 是一种受监督的方法,这意味着您的数据需要在降维优化函数中进行标记。为什么使用标签?LDA 旨在找到最佳方向,即投影,以减少类内可变性并增加类间可变性。换句话说,LDA 最大化了类别之间的可分性。所以在高维分类问题中,可以先对数据进行 LDA,在保持可分性的同时降低维数,然后在降维后的数据上安全地建立预测模型。需要注意的是,如果你的类的数量是 C,那么你不能把维数减少到超过 C-1 维。为什么?在优化过程中,我们处理 C 个质心点,这些质心点最多位于 C-1 维空间中,因此我们可以得到的最大投影是 C-1。
**import** numpy **as** np
**from** sklearn.discriminant_analysis **import** LinearDiscriminantAnalysis
*# Generate random Data of size (n x 5), with labels (n x 1).* X = np.random.uniform(size=(200, 5))
y = np.random.randint(low=0, high=5, size=(200, ))
*# Number of component wanted. X after reduction will be (n x 3).
# Number of classes C = 5, so max number of n_components = 4.* lda = LinearDiscriminantAnalysis(n_components=3)
X_reduced = lda.fit_transform(X, y)
因子分析— FA:
在 FA 中,有带假设的建模,有建立这个模型的标准。FA 认为在我们观察到的特征背后有隐藏的因素。每个因素都会在一定程度上影响这些特征。这种假设从一个角度来看待特性,即每个特性都有自己的可变性,可以表示为一组三种类型;普通方差、特定方差和误差方差。公共方差是几个特征之间共享的方差(即同一组因素的结果)。当特征高度相关时,这种普通方差很高。特定方差是只对特定特征有贡献的因素的影响。误差方差是在观察期间由误差源产生的方差(例如,人为误差、测量误差)。)
Factor 1&2 are the source of the common variance between features. While the others are the source of the unique variance for each feature which is divided into specific variance and error variance.
FA job 是什么?找出最大化原始特征之间已解释的公共方差的因素。
**import** numpy **as** np
**from** sklearn.decomposition **import** FactorAnalysis
*# Generate random Data of size (n x 5).* X = np.random.uniform(low=0, high=100, size=(20, 5))*# Number of factors wanted. The resulted factors are (n x 3).* fa = FactorAnalysis(n_components=3)
factors = fa.fit_transform(X)
独立分量分析— ICA:
对 ICA 最好的描述不是降维技术。最好将其描述为卷积/混合信号的分离/解混技术。ICA 的一个典型用例是“鸡尾酒会问题”,其中有独立的声源(例如扬声器)和几个用于录音的麦克风。使用麦克风的录音,可以通过 ICA 单独获得对原始声音的估计。
ICA 假设源是非高斯独立的,并且依赖于 CLT,独立随机变量之和的分布趋于高斯。在每一步,ICA 改变基向量-投影方向-并测量所获得的源的非高斯性,并且在每一步,它使基向量更接近非高斯性(主要使用梯度下降)。在一些停止准则之后,它达到原始独立源的估计。
**import** numpy **as** np
**from** sklearn.decomposition **import** FastICA
*# Generate random Data of size (n x 5).* X = np.random.uniform(low=0, high=100, size=(20, 5))
*# Number of sources wanted. The resulted sources are (n x 3).* ica = FastICA(n_components=3)
sources = ica.fit_transform(X)
多维标度— MDS:
如果您想在缩减后保留数据点之间的距离,那么 MDS 应该是您的选择。如果两个数据点在原始数据集中很接近,它们在缩减的数据集中也会很接近,反之亦然。这种方法只需要物体(点)的成对距离矩阵。所以,如果你只有这个距离矩阵,MDS 可以用来恢复你想要的维数的原始物体。
MDS 可用于在 2D 或 3D 空间中可视化您的对象,以尽可能保留原始对象之间在更高维度中的距离。
import numpy as np
**from** sklearn.manifold **import** MDS
*# Generate random Data of size (n x 5).* X = np.random.uniform(size=(20, 5))
*# Number of component wanted = 3\. X after reduction will be (n x 3).* mds = MDS(n_components=3)
X_reduced = mds.fit_transform(X)
要恢复数据的 2D 表示,请执行以下操作:
*# The recovered X will be of size (n x 2).* mds = MDS(n_components=2, dissimilarity=**'precomputed'**)# D is the pair-wise distance matrix.
X_recovered = mds.fit_transform(D)
总结:
PCA 不是唯一的降维方法,还有其他的。每一种都有其用途和目标。选择哪一个取决于应用程序。
资源:
- 英格·科赫。多元高维数据分析。澳洲阿德莱德大学。
- 走向数据科学:LDA 是降维技术还是分类器算法?
- stack exchange:线性判别分析如何降维?
- 因子分析实用入门。数字研究与教育研究所。
- Aapo Hyvä rinen 和 Erkki Oja。 独立成分分析:算法与应用 。赫尔辛基理工大学。
识别数据仓库:数据库和仓储导论
原文:https://towardsdatascience.com/discerning-data-warehouses-an-introduction-to-databases-and-warehousing-cc9fc10f3283?source=collection_archive---------7-----------------------
在我作为数据科学顾问的新工作中,我立即需要学习大数据系统结构。这是我的研究中的一本入门书,可以让你对关键术语有一个基本的了解和快速的掌握。
什么是数据仓库?
一、什么是广义的仓库?这是一个很大的储物空间。举例来说,数据仓库(DWH)不是亚马逊仓库,而是存储数据的数字空间。
更具体地说,创建 DWH 的过程可以看作是通过提取-转换-加载(ETL)操作将原始数据输入移动到整合的存储系统中以用于分析。
DWH 是:
- 面向主题:数据按业务主题而不是应用程序进行分类和存储。
- 集成:从不同的来源收集给定主题的数据,并存储在一个地方。
- 时变:数据存储为一系列快照,每个快照代表一段时间。
- 非易失性:通常数据仓库中的数据不会被更新或删除。
DWH 是由什么组成的?
嗯,是的,数据,但具体来说,它保存的是遗留数据或历史数据。有了这些历史数据,战略问题就可以用趋势和可视化来回答(因为人类在很大程度上非常不擅长解释表格形式的数据)。
DWH 可以通过源遗留数据将多个数据库联系在一起,从而创建这些关系模式。有了模式,DWH 将会更快更准确。
图式到底是什么?
最简单形式的模式仅仅意味着数据库中记录的定义,例如,模式可以说记录将由以下内容组成:
- PersonID(唯一索引号),
- FamilyName (40 个字符),
- 名字(40 个字符),
- 出生日期
如果您知道模式,那么您的编程就会变得容易得多,因为您确切地知道在查询数据库时应该使用什么格式。但是,千万不要将单独托付给数据库查询返回。每次都通过代码验证返回。
本质上,模式是你在数据库中定义的东西,与数据库软件本身无关。创建数据库时,必须定义表的名称、这些表中的列、这些列将保存的数据类型,以及表和列之间的关系。这是一个模式。**
什么是数据库视图?
视图很方便,原因有几个。理解视图、的最简单方法是将其视为一个普通的 select 语句(例如,SELECT NAME FROM EMP WHERE ID>3 AND CITY = " OTTAWA "),使其看起来像一个普通的表。
任何视图的基础都是 SELECT…这就是视图的创建方式。视图允许您获取复杂的 select 语句,并将它们转换成对其他用户来说看起来很干净的表格。
一个适当设计的视图还允许一个熟练的开发人员(通常是 DBA)优化一个特定的查询供其他人使用……而不需要确切地知道查询是如何进行的。最重要的是,创作者可以调整那个视图(让它更快或者修正它),现在任何使用它的人都不必改变任何东西。
视图还可以用来限制来自不同用户组的某些信息…您可能有很多数据,只有一些用户可以看到全部,而其他人只需要看到特定的信息。为这些团队中的每一个创建视图允许他们只看到他们需要的数据,而不依赖于构建许多额外的表。把这些想象成预定义的过滤器…非常方便。不过要小心!正如我提到的,视图实际上只是在引擎盖下选择的…所以对视图的构造很差的查询(因为它们看起来像普通的表!)会导致性能不佳。
*CREATE VIEW PopularBooks AS
SELECT ISBN, Title, Author, PublishDate
FROM Books
WHERE IsPopular = 1/* an example of a SQL View creation */*
Visualization of how a View is constructed from a query.
在 DWH,物化视图可用于预计算和存储汇总数据,如销售额。这些环境中的物化视图通常被称为汇总,因为它们存储汇总的数据。它们还可以用于预先计算有或没有聚合的连接。物化视图用于消除与大型或重要查询类的昂贵连接或聚合相关的开销。
在分布式环境中,物化视图用于在分布式站点复制数据,并使用冲突解决方法同步在几个站点完成的更新。作为副本的物化视图提供了对数据的本地访问,否则就必须从远程站点访问数据。
两者的区别在于:
- 普通视图是一个定义虚拟表的查询——表中实际上没有数据,而是通过执行动态创建的。
- 物化视图是一种视图,查询在其中运行,数据保存在实际的表中。
当您告诉实体化视图刷新数据时,它就会刷新。
示例:
- 假设您在数据仓库中有一个事实表,其中包含从图书馆借过的每本书,以及日期和借书人。工作人员经常想知道一本书被借走了多少次。然后构建一个物化视图
select book_id, book_name, count(*) as borrowings from book_trans group by book_id, book_name
,设置它的更新频率——通常是仓库本身的更新频率。现在,如果有人针对某本书对book_trans
表运行这样的查询,Oracle 中的查询重写功能将足够智能地查看物化视图,而不是遍历book_trans
中的数百万行。
通常,出于性能和稳定性的原因,您会构建物化视图——脆弱的网络,或者在非工作时间进行长时间的查询。
OLTP 与 OLAP
通常,数据每月、每周或每天从一个或多个联机事务处理(OLTP)数据库流入数据仓库。OLTP 传统上与关系数据库(RDB)相关联,而 OLAP 通常与 DWH 相关联。
在添加到数据仓库之前,数据通常在一个暂存文件中进行处理。数据仓库的大小通常从几十千兆字节到几兆兆字节不等,通常大多数数据存储在几个非常大的事实表中。
OLTP vs OLAP examples
OLAP 倾向于对大量数据(如 X 地区的销售总额)进行更多的汇总操作。我们也可以有 OLAP 模式:
Star Schema vs SnowFlake Schemas for OLAP
什么是事实或维度?
事实是你的衡量标准。(例如,如果我们为一家娱乐公司使用 DWH,您的事实可以是座位数、剧院数、售出的门票等)。维度就像你的对象或分类信息。(如剧场名称、剧场城市)。
重要的是要记住:数据库中的任何东西都是对象。
业务用户发送查询时的 DWH 高级流程:
从运营系统获取数据->集成来自多个来源的数据->标准化数据并消除不一致->以适合于在任何时间轴上从集成的来源轻松访问和分析的格式存储数据。
Example DWH Architecture / Process Flow
More detailed DWH process
什么是数据性能调优?
性能调优是非常主观的,也是一种非常开放的说法。性能调优的第一步是回答这个问题,“我们真的需要对我们的作业进行性能调优吗?”。SQL 索引是最有效的调优方法,但是在开发过程中经常被忽略。
在 ETL 阶段,大量数据被加载到 DWH 中。DBA 应该在数据库设计过程中考虑到这一点。
DBA 可以使用键聚集来确保插入的行不会在数据中创建热点。一种常见的方法是根据一个按顺序升序排列的值(比如一个标识列或一个序列)给新记录分配一个键,然后根据这个键对表进行聚集。结果是新插入的行被一起添加到表的一个部分中。
这些选项必须与索引设计相协调,因为表的物理聚集可能依赖于将其中一个索引指定为聚集索引。因为向表中添加一个代理键来聚集它必然意味着为该键创建一个聚集索引,所以这可能会影响表的索引总数。
不过,数据性能调优有点超出了本文的范围。有关 SQL 索引性能调优的更多信息,请查看https😕/use-the-index-Luke . com/
他们是处于物理记忆还是短暂记忆?
瞬态数据是在应用程序会话中创建的数据,在应用程序终止后不会保存在数据库中。
而物理内存实际上保存在 RAM 或硬盘上。
什么是数据集市?
一个数据集市包含对特定业务单位、部门或用户群有价值的公司数据的子集。通常,数据集市源自企业数据仓库。(例如,一个数据集市用于财务数据、销售数据、营销数据、社交媒体数据,另一个用于运营数据)。
Data Mart vs DWH
有很多东西需要考虑,
但是我希望这对那些刚刚接触数据库、数据仓库和系统设计的人来说是一个很好的入门。在“大数据”时代,理解数据库和 DWH 对于当今的数据科学家来说至关重要。
用深度学习发现系外行星
原文:https://towardsdatascience.com/discovering-exoplanets-with-deep-learning-fcf8873391c9?source=collection_archive---------1-----------------------
TWiML Talk 117
本周早些时候,我有机会与谷歌大脑团队的高级软件工程师 Chris Shallue 谈论他的项目和论文“用深度学习探索系外行星”。
订阅:iTunes/SoundCloud/Google Play/Stitcher/RSS
这是一个伟大的故事。克里斯受到他正在读的一本书的启发,一时兴起联系了哈佛天体物理学研究员,开始了一项合作和附带项目,最终导致了太阳系外两个新行星的发现。在我们的对话中,我们讲述了克里斯寻找这两颗系外行星的整个过程,包括他如何作为局外人研究该领域,他如何获取和处理他的数据集,以及他如何构建和发展他的模型。最后,我们讨论了他的项目的结果和他在这一领域未来工作的计划。
这个播客与谷歌发布 Chris 开发和使用的源代码和数据同时发布,我们将在下面链接,所以如果你听到的东西激励你深入这个领域,你已经有了一个很好的开端。这是一次非常有趣的谈话,我很高兴能与你分享!
TWiML 在线会议
查看我们的 youtube 页面,youtube.com/twimlai,,在线聚会三月版的回顾!肖恩·德夫林(Sean Devlin)对强化学习和谷歌 DeepMind 论文进行了深入的回顾,用深度强化学习玩雅达利。前往 twimlai.com/meetup了解更多信息或注册参加下个月的活动。
关于克里斯
- 克里斯在 LinkedIn 上
- 克里斯的 Github
采访中提到
- 开源寻找系外行星
- 开源寻找系外行星——代码
- 【Loon 项目
- 图像字幕神经网络
- 机器人
- 美国宇航局开普勒望远镜数据集
- 约书亚·布鲁姆——面向明星的机器学习&产品化 AI
- 在这里报名参加人工智能大会!
- 看看@ShirinGlander 的伟大 TWiML 速写!
- TWiML 呈现:系列页面
- TWiML 事件页面
- TWiML Meetup
- TWiML 简讯
Lee Rosevere 的“稍后再谈”由 4.0 版 CC 授权
原载于 2018 年 3 月 8 日 twimlai.com。
使用数据、聚类和可视化发现我的 Spotify 音乐的相似之处
原文:https://towardsdatascience.com/discovering-similarities-across-my-spotify-music-using-data-clustering-and-visualization-52b58e6f547b?source=collection_archive---------2-----------------------
音乐品味是一个人非常独特、奇特和有特色的品质。在现存的数以百万计的歌曲和声音中,我认为许多人决定发展对一种特定风格、流派或音乐“子集”的喜爱并非偶然。我们喜欢的歌曲背后是什么?他们有什么相似之处吗?它们之间有什么相似之处?更重要的是,有没有一种方法可以根据它们的发音把它们收集起来?
这篇文章描述了我第二次尝试回答这些问题。
相当一段时间以来,我一直对我在 Spotify 中收藏的歌曲感到好奇。此外,我有兴趣通过数据研究我的播放列表对我的音乐品味有何影响。幸运的是,Spotify 的 API 提供了一种叫做音频特征的东西,顾名思义,就是一首歌的特征或特点,比如声音有多大或多大声,通过它们,我探索、研究、了解了我的音乐。
在我之前的作品《T2》中,我的 Spotify 音乐很无聊吗?,我重点回答以下三个问题:
- 我的 Spotify 保存的歌曲有多多样?
- 他们有多大作用?
- 他们有多无聊?
而且我得出的结论是,我的歌确实种类繁多,很多都是器乐化的,很枯燥(基于我推导出的一个公式)。在同一个项目中,我还训练了一个监督学习模型,目的是预测一首歌是属于我的播放列表还是朋友的播放列表,准确率达到 82%。
作为这项工作的后续,我将继续探索我的播放列表的可变性概念。使用聚类算法 k-medoids 、聚类分析和我的数据集的低维表示作为工具,我使用我的 Spotify 保存的所有歌曲来研究其聚类趋势,并确定是否有可能根据音频特征将类似的歌曲分组在一起。
这个实验分为四个部分,也代表了我要研究的主要课题。
- 我应该使用的最合适的集群数量是多少?
- 数据的聚类和查看几个聚类统计的值,例如轮廓系数和聚类之间的差异。
- 聚类有多好?每个聚类中的歌曲有多相似?聚类有意义吗?
- 聚集的数据看起来怎么样?
我们开始吧!
工具
这项工作是使用 R 和 Python 完成的。聚类部分是使用 R 和包 caret 和 cluster 完成的。Python 用于通过库 Spotipy 获取数据,并通过 Hypertools 可视化数据。报告末尾提供了代码的链接。
数据
音乐数据是使用我编写的 Python 脚本获取的,该脚本获取特定播放列表中的所有歌曲及其音频特征。在清理数据集并删除不必要的东西后,我留下了一个由 563 行(每行代表一首歌)和 5 列组成的数据集,这是音频特征。这些音频功能包括:
乐器性:该值代表歌曲中人声的量度。越接近 1.0,歌曲的器乐性越强。
声音度:这个值描述了一首歌曲的声音度。1.0 分意味着这首歌最有可能是一首原声歌曲。
Liveness :这个值描述了歌曲被现场观众录制的概率。根据官方文档,“高于 0.8 的值提供了该轨道是实况的很大可能性”。
语速:“语速检测音轨中是否存在口语单词”。如果一首歌曲的语音度高于 0.66,它可能是由口语词组成的,0.33 到 0.66 之间的分数是一首可能同时包含音乐和词的歌曲,而低于 0.33 的分数意味着这首歌曲没有任何语音。
可跳舞性:“可跳舞性描述了一首曲目在音乐元素组合的基础上适合跳舞的程度,包括速度、节奏稳定性、节拍强度和整体规律性。值 0.0 最不适合跳舞,1.0 最适合跳舞”。
*该描述是从官方 文档 中复制/粘贴而来。
确定聚类的数量
当使用基于划分的聚类算法(如 k-medoids)时,找到正确的聚类数,也称为“ k ”,不知何故,是一个模糊且关键的步骤。一方面,低的 k ,例如 k=2 ,意味着数据集的所有观察值将被聚类成 2 个簇,导致大量的误差,并且很可能是难以解释的聚类结果。第二个选择,一个更大的k将会减少误差,代价是将所有的观察结果分成许多组。因此,需要一种平衡,引用维基百科“最佳选择 k 将在使用单个聚类的最大数据压缩和通过将每个数据点分配到其自己的聚类的最大准确性之间取得平衡”。
在所有已知的检测集群数量的技术中,我使用了 轮廓系数 和 间隙统计 。
剪影系数衡量的是数据观测值与其自身聚类(内聚力)的相似程度,以及与其他聚类(分离)的观测值的相似程度。剪影的值范围从-1 到 1,其中 1 表示良好的内聚性,而-1 表示对象可能位于错误的簇中。使用这种方法,我所做的是使用不同的 k 对我的数据集进行几次聚类,然后计算并平均所有观察结果的轮廓,并选择我发现最合适的 k 。
下图显示了使用 k=2 到 k=10 对数据进行聚类时的平均轮廓。
Average silhouette coefficient for different k’s
虽然图中显示 4 的 k 值产生了最好的轮廓,但是我决定选择 k=5 的轮廓,因为我有兴趣分析更多的聚类。
对于使用的第二种方法,gap statistic,使用不同的 k 对数据集进行不同次数的聚类,每次都从所谓的预期类内平方和中减去围绕类中心的类内平方和(如果您发现术语“预期”令人困惑或含糊不清,不要担心,这个词背后涉及大量的数学知识,其解释超出了本文的范围)。这种减法的结果是差距统计,一旦我们对每一个 k 都有了差距统计,并对它们进行绘图,代表绘图的“ 【肘点】 ”的那个就对应于最佳的 k 。
下图显示了从 k=2 到 k =10 的所有间隙统计数据。喜欢剪影评分,根据差距, k=3 或者 k=4,是最好的 k ,然而我再一次决定选择 k=5 。
Gap statistic for different k’s.
因此,我的问题"的答案是,我应该使用多少个集群最合适?是 5 。
现在我们已经选择了一个 k ,下一步就是对数据进行聚类。
聚类及其分析
用于聚类数据的算法是 k-medoids 。对于那些以前使用过 k-means 并且以前没有听说过或使用过 k-medoids 的人来说,我认为它们之间的主要区别在于前者可以用于任何相似性度量,而不是像 k-means 那样最小化平方距离。除此之外,在 k-medoids 中,数据集的实际数据点被用作聚类的最中心项,这与 k-means 不同,k-means 使用特征空间中的一个点来表示聚类的中心,从而使前者对异常值更加鲁棒。
下图是聚类结果的直接输出。每一行代表一个分类,每一列是关于它的一条信息。从左边开始,第一列“大小”是每个聚类的观测值数量,“ max_diss ”是最大相异度,即距离聚类的 medoid 最远的数据点之间的距离,“ av_diss ”是平均相异度,然后我们有“直径,这是同一聚类的两个点之间的最大相异度,最后,“分离”,即
Several scores about the cluster
就大小而言,簇 4 是最大的,总共有 143 首歌曲,而由 60 首歌曲组成的第三个是最小的。该聚类也是显示最高最大相异度和平均相异度的聚类。这说明,如果与其他星团相比,这个星团的内容与它的中间体或中心是完全分离的;该集群还显示了最大的分离值,这意味着它离其他集群最远,直径也最大,使其成为距离上“最大”的集群。相反,聚类 4 是具有最低最大和平均相异度、直径和分离值的聚类。
之前,我引入了轮廓系数来使用它作为一种找到好的 k 的方法。现在,我将使用它作为一种方法来检查集群的良好性。下图显示了按分类分组的每个数据点的轮廓。
Silhouette score of each cluster
图像右侧的数字是每个集群的平均轮廓。聚类 2 具有较低的轮廓(0.27),而聚类 4 具有最好的轮廓(0.55)。分类 2 也是轮廓小于 0 的观测值最多的分类,理论上,这意味着这些案例可能属于另一个分类。
根据本节介绍的所有指标,聚类 4 似乎是最好的一个,因为它具有最好的平均聚类内距离和直径,以及最高的轮廓。因此,这是我将在下一节中使用和剖析的集群之一,以实际验证该集群是否确实是好的
聚类有多好?
了解群集是否良好的最佳方式是深入其中并查看内容,看它是否相关以及是否有某种模式,例如,属于同一张专辑、同一位艺术家、相似声音或相同风格的歌曲。在这一节中,我将呈现聚类 3 和聚类 4 中的一些歌曲,此外,我将使用聚类 4 的内容进行新的聚类,以尝试找到进一步的相似性。
在上一节中,我提到了集群 4 由 143 个观察值组成,是最大的一个。在下面的列表中,我会显示属于这个集群的一些专辑,歌曲的数量,在某些情况下,我会做一个关于专辑的说明。
- 魔戒—王者归来—完整录音(限量版) : 38 首歌曲
- 星际:电影原声带(豪华版) : 12 首歌曲
- 光明之子 : 10 首歌曲;这是一个电子游戏的配乐。
- **星际:电影原声(是的,我有这张专辑的普通版和豪华版,所以有一些重复): 10 首歌
- 《疯狂的麦克斯:狂暴之路》——电影原声带 : 9 首歌曲
- 遥远世界 II:更多来自最终幻想的音乐 : 7 首歌曲;另一个电子游戏。
- 质量效果 3 : 7 歌曲;电子游戏。
- while(1 < 2) ,bydead mau 5:7*歌曲;电子音乐。*
- **血源性:5;受血源视频游戏启发的音乐。
- 晶体管 : 5 歌曲;电子游戏。
其余的歌曲包括坎耶西、星球大战、一首星际歌曲的翻唱、一首来自机器人先生(一部电视剧)火星人(一部电影)缪斯、霍比特人等等。
这组歌曲的主要音调和风格是器乐;几乎没有任何人声的歌曲。你可能注意到了,很多都是来自电影(星际、指环王)和电子游戏(最终幻想、质量效果)的原声配乐;即使是坎耶·韦斯特的那首歌,也是没有人声的器乐插曲。
让我们看看最小的集群 3。同样,我会列出专辑和歌曲数量。
- 声,由以上&超越 : 12 歌曲组成
- 音响二、由以上&超越* : 11 的歌曲*
- 巴勃罗的一生,由坎耶西 : 6 歌曲组成
- 堡垒 : 4 首歌;一个电子游戏。
- 星际:电影原声带(豪华版) : 3 歌曲
- 魔戒—王者归来—完整录音(限量版) : 3 歌曲
- 星际:电影原声带 : 2 歌曲
- 晶体管 : 2 歌曲
乍一看,这个集群似乎比前一个更加多样化(这可能是为什么它是最不相似的一个),它有一些视频游戏音乐,更多的星际,指环王,以及一些嘻哈和说唱。但亮点在于它包含了以上&Beyond**原声专辑中的 23 首歌曲。给一点背景,这两张专辑是 Above and Beyond 的一些最著名歌曲的原声版本,我觉得奇怪的是,尽管它们是两张不同的专辑,在不同的年份发行,但根据音频功能和集群,它们遵循相同的风格。值得一提的是,第一张专辑包含 12 首歌曲,第二张专辑包含 13 首歌曲,因此集群能够捕获几乎所有的歌曲(25 首中的 23 首)。
由于集群 3 有一点多样性,我在一个新的模型中对其内容进行了聚类,以验证该算法是否可以检测到这种多样性。我特别感兴趣的是,看看声学专辑中的歌曲,嘻哈和说唱歌曲,以及电影和视频游戏中的歌曲,是否被分配到不同的集群中。和上次一样,用的是 k-medoids,这次用的是 k=4 。
前面的图形是新簇的轮廓图。平均轮廓宽度是 0.29,比上一次的 0.40 更低更差。而且,这次还有一个得分 0.10 的真的很差的集群。下面是集群的摘要。
- 集群 1:
— 以上&超越声学专辑: 6 歌曲
—说唱: 2 歌曲
—器乐: 3 歌曲
—流行音乐、电子音乐、西班牙民谣: 1 歌曲各一首
—弗兰克·辛纳特拉(爵士): 1 歌曲 - 集群 2:
— 以上&超越声学专辑: 15 歌曲( 16 ,如果算上一张从另一张专辑复制过来的)
— 魔戒带人声的歌曲:1
— 堡垒带人声的配乐歌曲:2
— 晶体管带人声的配乐歌曲:1 - 第三组:
—说唱: 6 首歌曲
—电音: 2 首歌曲 - 集群 4:
— 星际 : 5 歌曲
— 魔戒 : 2 歌曲
我对第二组取得的结果非常满意。首先,超过一半的歌曲来自原声专辑,其他的有一些相似之处(相信我)。例如, Bastion 和 Transistor 中的歌曲是轻松的歌曲,声音柔和,带有吉他的音响效果(两张专辑也出自同一位艺术家)。《指环王》中的这首歌比前几首更欢快一些,但我认为它符合主题。**
总的来说,我对聚类模型的结果感到满意。虽然聚类有时看起来很复杂,令人困惑,但我相信它能够抓住我音乐多样性的本质。在所讨论的集群中,我能够识别出几种模式,例如在一个集群中有高度器乐和管弦乐(来自视频游戏和电影),而在其他集群中有声学感觉的歌曲(吉他、一些管乐器)。关于我没有写的三个集群(来自第一个模型),其中一个显示了对说唱、嘻哈和电子音乐的关注,其余的都是垃圾(他们有所有流派和艺术家的音乐)。
形象化
当使用聚类(以及一般的数据)时,我总是想知道数据看起来是什么样的。在最后几段中,我已经谈了很多关于星团、直径、分离和一堆其他的东西,这些东西有些模糊,很难在一个人的头脑中想象出来。因此,本实验的最后一部分致力于可视化数据集和聚类。
这个项目的数据集由 5 个特征组成,如果我想制作一个所有特征的图表,我需要考虑这样一个事实,即对于我们人类来说,不可能(据我所知)体验超越三维领域的事物。一种选择是只选择 2 或 3 个特征并绘制它们,但是,我们会丢失大量信息,因为我们会丢失其他特征。老实说,在这种情况下,这并不是一个糟糕的想法,因为数据集只有 5 个维度,但是,有由数千个要素组成的数据集,在这种情况下,绘制 2 或 3 个要素不会给你一个良好的数据可视化表示。那么,我们如何解决这个问题呢?
幸运的是,有一种叫做降维的算法,它的目的是将高维数据投影到低维数据中,让我们可以做一些事情,比如将其可视化。在这些算法中,我选择使用 t-分布随机邻居嵌入(t-SNE)和主成分分析(PCA)。遗憾的是,由于它们的复杂性,我不会深入细节,老实说,我并不完全理解它们(特别是 SNE 霸王龙),所以我肯定我的解释会有所欠缺(如果有人有关于这方面的好资源,请在评论中添加它们)。
前两个图像是主聚类的 t-SNE 和 PCA 表示。
**
这两个图像显示了聚类的定义有多好,以及它们之间的重叠有多少,除了聚类 5 的一些内容似乎在聚类 2 中。在前面的章节中,提到了星团 3 的直径较大,这可以在图像中观察到,特别是在 t-SNE 星团中。如果你看一下图像的最右边部分,聚类 3 中有一个点显然在聚类 1 中,还有一个点在聚类 4 的顶部,另一个点在聚类 2 中,因此聚类 3 实际上是分散的。作为奖励,我将添加第二个 t-SNE 表示,但这次是 3D 的,虽然在 2D 有点难以理解,但它可能有助于增加对集群的额外了解。
关于对聚类 3 的数据进行的聚类,这是 SNE 霸王龙的样子。
该图的主要注释是聚类 3 的数据是如何分散的;其中 4 首歌曲在聚类 2 之上,其余的在聚类 2 之下,您可能会从讨论中回忆起,聚类 3 有 4 首来自指环王的歌曲。这 4 个点会是那些歌吗?也许吧。此外,该聚类的平均轮廓分数(0.10)是该模型中最低的一个(它具有几个负分数),因此在某种程度上期望观察到这种稀疏性。
总结这一部分,我想说的是,尽管这些图表是通过将数据从五维空间转换到二维空间(而不是用于聚类的原始数据)而创建的,但它足以产生前面部分中讨论的一些结果,并帮助我更好地理解模型中发生的事情。
结论
在这篇文章的开始,我介绍了一个好奇心,或者说是一个关于我的音乐的问题。这个问题是:“有没有可能根据音乐的音频特征在集群中找到相似的音乐?”为了回答这个问题,我把这个问题分成了 4 个不同的步骤。首先,使用轮廓系数和间隙统计,我能够确定一个合适的值 k 。随后,使用 k-medoids 对数据进行聚类,并对聚类的结果(例如,每个聚类的直径、分离度和相异度)进行解释。然后,在所有集群中,选择其中的两个来手动验证其内容。其中一个主要是由视频游戏和电影配乐组成的。第二个更多样化;它有说唱歌曲、原声歌曲、器乐歌曲和更多来自电子游戏的音乐。使用第二个聚类中的所有音乐,创建了一个新的模型来研究是否有可能将上面提到的每种音乐风格放在单独的聚类中。结果是积极的。大多数原声歌曲属于同一类,而说唱音乐则属于另一类。最后,聚类被可视化,让我们清楚地了解它们的样子,除此之外,我还能够指出在聚类分析部分观察到的一些模式。**
我对这个项目取得的成果感到满意。首先,这是一件有趣的事情。我能够更多地了解我的音乐模式,回答我脑海中的一些问题,并重新发现一些我很久没有听过的歌曲。我相信集群本身是一个好的集群(我从来没有期待一个完美的集群),从某种意义上来说,它不是那么混乱,而且每个集群的内容之间似乎有一些相关性。这种观点可能有点偏颇,因为我是确定这些歌曲肯定相似的人,但这是基于我的音乐品味,我的耳朵,以及我想从中获得积极结果的愿望。如果我决定继续从事这项工作,我想尝试不同的算法,特别是基于网格的聚类算法,如团*或基于密度的算法,如 DBSCAN。*
这个项目使用的代码,包括数据集,可以在我的 Github 上找到:https://Github . com/juandes/audio-features-unsupervised-learning
我希望你喜欢这个,并学到一些新的东西。如果您有任何问题,澄清,或发现任何不一致的地方,请留下评论。
感谢阅读:)
利用面板数据发现创新和技术对经济增长的影响
原文:https://towardsdatascience.com/discovering-the-impact-of-innovation-and-technology-on-economic-growth-using-panel-data-de47568edfbf?source=collection_archive---------18-----------------------
在当前快速变化的世界中,创新和技术推动经济增长的观点是不可否认的。众所周知,创新是通过引入新的东西来创造价值。在不同的环境和行业中,创新的定义可能会略有不同。例如,业务创新可能是寻找一种新的流程来提高绩效和增加产出;医学和药学的创新可能会发明新的疫苗,拯救百万人的生命;技术创新可以是设计新的机器来提高生产率。有大量的研究关注创新和技术对特定行业或领域的影响。在这篇文章中,我将利用 10 年间 84 个国家的数据来评估创新、技术和经济增长之间的关系。数据和 Rcode 可以在 my github 上找到!
这是游戏计划:
- 创建面板数据
- 描述性分析和数据可视化
- 诊断学
- 回归
创建面板数据
对于那些不知道的人来说,面板数据是时间序列和横截面的组合(例如:10 年内不同国家的数据)。所有数据均取自 2007 年至 2016 年词库公开数据集。原始数据集包含超过 195 个国家。然而,由于一些国家缺少数据,这项研究将只关注有可用数据的 84 个国家。在实践中,人们通过仔细调查这些国家在缺失年份发生的事情来填补缺失值,甚至根据可用数据建立模型(例如:时间序列)来预测缺失值。
GDP per capita
选择了三个变量来表示创新和技术水平,即专利申请(居民)、专利申请(非居民)和固定宽带用户。
专利申请是指居民或非居民在本国申请的专利数量。
固定宽带订阅数是互联网订阅数(包括高速和固定电话)。
自变量是人均 GDP 增长,即国内生产总值除以年中人口。
为了在 R 中创建面板数据,我使用了 reshape 包来融合 4 个宽数据集(4 个变量)并将它们合并在一起。
# use reshape package
install.packages("reshape")
library(reshape)# melt data from wide format to long format
melt.data <- melt(raw.GDP, id.vars = c("country.code", "country.name"), value.name = "GDP")
最终数据集如下所示:
描述性分析和数据可视化
这是 10 年间 84 个国家的面板数据。专利申请和固定宽带都有一些缺失的价值。因此,面板是不平衡的。
Figure 1: Descriptive Statistics
然而,如果没有问题的话,也就是说,在这个时期的中期,我不会忽略遗漏的观察。大部分缺失的数据要么是前两年(2007 年和 2009 年),要么是最后一年(2017 年)。在专利申请(居民)方面,中国在 2017 年申请的专利数量最多(1,204,981 项专利),而其他一些低收入群体国家每年仅申请一项专利。
Figure 2: Correlation plot on raw data and Correlation plot on data after a log transformation
根据图 2(左),固定宽带用户和人均 GDP(0.8)之间明显存在强正相关关系。然而,专利申请(居民和非居民)之间的相关性几乎为零。由于人均 GDP 通常呈指数增长,所以记录人均 GDP 可能有助于平滑数据。此外,其他变量的对数变换也有助于模型解释,因为系数基本上是弹性的。图 2(右)还显示,人均国内生产总值和其他独立变量之间存在正相关关系(见取对数后相关性如何变化)
诊断学
有几种计量经济学模型可能适用于面板数据集,如普通最小二乘法、混合模型(OLS)、带有虚拟变量的 OLS、组内固定效应(贬低)、和随机效应。
Figure 3: Heterogeneity across years of GDP per capita
请看图 3,在整个 10 年期间,人均国内生产总值有很大的波动和起伏,这表明数据集可能存在异质性。
常规汇总 OLS 回归不考虑国家组或多年时间段的异质性。通过将不同时期的不同国家混为一谈,Pool OLS 掩饰了上述国家间可能存在的异质性(个性或独特性)。所以这个模型不仅有偏差,而且不一致。
OLS 假人模型有几个缺点。首先,由于 OLS 虚拟引入了太多的虚拟变量,它失去了自由度。其次,由于模型中有许多虚拟变量,因此总是存在多重共线性的可能性。
Figure 4: Stationary test on log transformed data
由于面板数据是横截面数据和时间序列数据的组合,在这种类型的数据上建立经济模型时有几个假设。Dickey-Fuller 检验检查数据是否平稳,该检验的 p 值为 0.01,因此我们可以拒绝数据不平稳的空值。
回归
所以这里我只报告固定的和随机的影响:
固定效果
日志[PC。gdp]𝑖𝑡=𝛽1log[patent.res]𝑖𝑡+𝛽2log[patent.non]𝑖𝑡+𝛽3*log[fixed.broadband]𝑖𝑡+𝜇𝑖𝑡
library(plm)
fixed <-plm(log.GDP ~ log.patent.res + log.patent.non + log.fixed.broadband, data=data.final1, index=c("country.name", "year"), model="within")
summary(fixed)
Figure 5: Fixed Effects (demeaned) results
组内固定效应模型考虑了 84 个国家之间的异质性,不是通过虚拟变量方法,而是通过对样本均值周围的样本观察值进行差分来消除异质性。这种方法的好处是它返回一致的斜率估计值。
根据回归结果,保持其他变量不变,平均而言,专利申请量(居民)每增加 1%,人均 GDP 增加 0.0657%。同样,固定宽带用户数每增加 1%,人均 GDP 增加 0.1449%。这两个系数都具有统计学意义。然而,专利申请变量(非居民)并不显著。R 平方为 0.28,相对较低。但是,对于面板数据,R 平方通常不高。
随机效应
日志(PC。gdp)𝑖𝑡= 𝛽0+𝛽1log(patent.res)𝑖𝑡+𝛽2log(patent.non)𝑖𝑡+𝛽3*log(fixed.broadband)𝑖𝑡+𝜔𝑖𝑡(𝜔𝑖𝑡=𝜇𝑖𝑡+贵阳)
random <-plm(log.GDP ~ log.patent.res + log.patent.non + log.fixed.broadband, data=data.final1, index=c("country.name", "year"), model="random")
summary(random)
Figure 6: Random Effects results
如果附加误差项与模型中包含的任何解释变量都不相关,则随机效应可能是一个很好的模型。由于εi 是 wi t 的一个组成部分,因此误差项可能与解释变量相关。根据 Hausman 检验,如果随机效应中的附加误差项与解释变量相关,它将在给定的应用中告诉我们,随机效应模型是不一致的。因此,在这种情况下,固定效应是更好的模型。
# Hausman test
phtest(fixed, random)
Figure 7: Hausman Test
现在,我们继续固定效应模型。还有一些假设我们需要验证。
Figure 8: Breusch Godfrey/Wooldridge test
首先,Breusch Godfrey/Wooldridge 检验指出数据中实际上存在自相关或序列相关。
Figure 9: Breusch-Pagan test
此外,固定效应模型基本上是线性回归的扩展版本,因此确保数据的同质性是很重要的。我使用了 Breusch-Pagan 测试来检查同质性(线性模型假设),结果数据是异方差的。如果我们继续使用固定效应模型(贬低),自相关和异方差是需要注意的两件事。
Figure 10: The result of Robust covariance matrix estimation (Sandwich estimator)
我们仍然可以执行我们的回归分析来修正自相关和异方差的问题,以便我们的区间估计和假设检验是有效的。我们通过使用鲁棒协方差矩阵估计(三明治估计器)或简单的鲁棒标准误差来做到这一点。这里值得注意的是,系数在处理前后没有变化,但是标准误差和 p 值变化显著。
总之,固定效应(贬低)模型是这个面板数据集的适当模型。根据回归结果,经济增长(人均国内生产总值)与创新(居民专利申请)和技术(固定宽带用户)之间存在正相关关系。但是,模型本身和模型设置可以通过某些方式进行改进。首先,由于价值缺失和资源有限,这些数据并不完整。除了丢弃观察值之外,还有更好的方法来处理缺失值,例如输入中值或平均值。其次,自变量的选择也可以改进。R&D 支出和科学期刊数量等指标可纳入该模型。第三,不同收入群体的创新程度可能不同。创新可能有助于推动高收入国家的经济,但对低收入国家可能没有帮助。
Figure 11: Magnitude of innovation among different income group countries
图 11 表明,四个收入组的系数和截距实际上是不同的。最后,应该对专利申请制度进行更仔细的调查。一些国家实行“专利箱”政策,对专利或许可证等知识产权减税,因此高收入国家的大公司在“专利箱”国家申请大量专利。然而,这些公司实际上在本国比在申请专利的国家获益更多。
离散化。这不是一个词,但知道它的价值可以彻底改变你的决策。
原文:https://towardsdatascience.com/discretification-its-not-a-word-but-knowing-its-value-can-revolutionize-your-decision-making-b33385bed84d?source=collection_archive---------21-----------------------
决定,决定
分析的全部目的是为我们提供信息,让我们尽可能做出最佳决策。不幸的是,有时数据并不能使前进的道路变得清晰。这些困难的决定需要时间在利益相关者之间进行分类。
例如,假设你负责一个组织的营销部门,你正在测试一个特定的新活动。您选择一部分位置来展示广告,然后跟踪结果。在试用结束时,你会发现营销活动每花费 1 美元,就能为你的公司带来 4.5 美元的收入。这场运动值得推广吗?
这些类型的决策经常出现在使用分析的过程中。对于如何前进,很少有明显的答案。很明显,试验活动奏效了,但是它的效果是否足够来证明一项更重大的投资是合理的?一方面,它赚了钱!每美元 4.50 美元是一个稳定的回报,在你的业绩评估中不太可能被视为一个糟糕的决定(假设当你扩大规模时,它会显示类似的结果)。
另一方面,不仅仅是在更大的样本中表现不佳的风险,你还需要考虑如何更好地利用你的营销预算。如果你现有的营销策略每投入 1 美元就能产生 6 美元的收益,那会怎样?现在 4.50 美元的回报看起来不太好。
做决定的困难不仅仅是情绪上的负担;它耗费你公司的时间和金钱。此外,违背一个决策者的偏好以满足另一个决策者的偏好会带来政治上的复杂问题。我们如何避免做出艰难决定的漫长过程?
离散化!别费劲去谷歌了,因为你会一无所获。然而,不要因为字典里没有这个词,而让你变得更加果断。在讨论“离散化”的含义之前,让我们回顾一下两种基本的数据类型。
离散与连续数据
毫无疑问,你以前听说过这些术语,但是让我们提醒你一下,以防万一。
离散数据只适合不同的类别。这类数据的一个很好的例子是一周中的每一天。尽管星期一晚上 11:59:59 和星期二上午 12:00:00 相差一秒钟,但这几秒钟是在完全不同的日子里。其他例子包括血型、国家和流派。
连续数据是从一个值流向下一个值的度量。温度是一个很好的例子,因为有些人可能认为华氏 90 度是“热”的,而其他人认为 20 度是“冷”的,温度读数之间没有绝对的差异。
商业中永远存在的一个例子是。。。钱!说到底,无论我们做什么决定,都归结到底线,这必然是一个持续的衡量。一般来说,从离散数据中做出决策更容易。每一类都可以导致一个特定的行动过程,需要更少的讨论。
不幸的是,因为我们大部分时间都在评估投资回报,所以在做决策时,我们很可能会处理连续的数据。改变我们看待数据的方式肯定会解决这个问题,这就把我们带到了。。。
“离散化”的含义
该是笑点的时候了。
“离散化”是将连续数据离散化的机制。
如果你真的理解了这个概念,你可能会想“等一下,我们收集的数据类型本身就是离散的!数据可以是离散的,也可以是连续的,不可能两者都是!”你是对的。
但是,如果我们沿着连续的度量手动选择值,并声明它们属于特定的类别,会怎么样呢?例如,如果我们宣布 72.0 度及以上为“热”,35.0-71.9 度为“适中”,任何低于 35.0 度的为“冷”,我们就有了“离散化”的温度!我们的读数曾经是连续的,现在可以分成不同的类别。
那么,我们在哪里划分这些类别的界限呢?是什么让 35.0 度“冷”,35.1 度“中”?正是在这个关键时刻,做出了真正的决定。以这种方式应对挑战的好处在于,它是以数据为中心的,而不是以概念为中心的。让我们先在不使用离散化的情况下浏览一下我们的营销示例,然后再使用它。
您已经完成了对一项新营销活动的研究,每投入 1 美元,它就会产生 4.5 美元的收益。这个活动是你的老板营销总监的创意,他们对活动本身和结果感到自豪。
你、营销总监和营销副总裁之间召开会议,以确定该活动是否需要立即投资。您的主管敦促副总裁为该活动开绿灯;这是他们的项目,他们的鲜血、汗水和泪水表明这将有助于该组织。副总裁面临着提高营销费用利润率的压力,鉴于其他渠道的 6 美元回报,他们倾向于将资金投向其他地方。
最终,他们决定由你来决定。如果你继续这个项目,你可能会让副总裁觉得你做决定不是为了公司的利益,而是站在你的经理一边。否决这个想法,你就破坏了你和那个对你是否升职最有发言权的人的关系(更不用说每天和他们一起工作了)。
可以理解,你想尽可能小心。你需要一两周的时间来研究其他营销理念,如果资金没有投入到扩大试验活动中,这些营销理念可以用这些资金来实现。你认识的其他专业人士也会参与进来,努力帮助你做出最好的选择。
你最终决定。。。这真的重要吗?无论如何,你都在损害与关键利益相关者的关系,做出决定的过程需要时间,而时间就是金钱。
现在让我们看看,如果你把你的结果离散化,这个故事会如何发展。
在进行试验之前,你召集你、你的经理和营销副总裁开会。议程的首要任务是确定你们都同意需要达到的最低回报,以证明扩大活动规模的合理性。副总裁要求 6.50 美元,以确保这表明该部门正在提高盈利能力。你的经理平静地指着正在试用的地点,那很可能比其他人表现得更差。你的经理能够将副总裁的价格一路降到 5.75 美元作为分界点。
毫无疑问,你可以看到这将走向何方。结果显示,每一美元的花费只有 4.5 美元,远低于最低值。你只需发送一封电子邮件,通知主要利益相关者事实,并根据之前的协议停止追求新的营销策略。不需要额外的时间来考虑。
虽然你的经理可能会感到失望,但这个决定并不反映他们、他们的想法或他们的工作。它仅仅基于收集到的数据。这就是以数据为中心和以概念为中心的区别。这让所有相关人员免受政治纠纷的困扰。这是一个客观的决定,得到了所有关键利益相关者的支持。
这个过程中有一个重要的变量,它不仅对节省您和您的组织的时间和资源至关重要,而且还有助于改进决策本身!
时机决定一切
也许你听说过一个著名的实验,他们现在给孩子们一块饼干,或者在 15 分钟内给他们两块饼干。选择抑制自己追求直接回报的冲动的孩子更有可能在职业生涯中取得成功。
延迟满足对我们有益,这不是秘密。但是,它与将我们的数据离散化以帮助我们决策有什么关系呢?
将这种方法与延迟满足联系起来的基本概念是时间。几年前,科学家们创建了一个函数,该函数可以根据结果发生所需的时间来捕捉人们如何评价不同的结果:
前额叶皮层和冲动决策。金,素云,李,大韩。生物精神病学 2011 年 6 月 15 日;69(12):1140–1146
这里的要点是,人们倾向于错误地低估预期对他们影响越大的结果的价值。在我们的例子中,当研究的结果出来并且必须做出决定时,该选择的影响将在不久的将来显现。根据图表,如果你在权衡是否推进新的营销策略,你更有可能给它开绿灯。你期待很快看到回报,这意味着你更重视这个结果,而不是花时间去寻找更好的营销途径,这些途径的好处在一段时间内不会被感受到。
通过提前划定如何离散化数据的界限来做出决策,您就不太容易产生这种偏见。即使你最终为活动开了绿灯,你也会在预期直接影响之前做得很好。较少倾向于这种偏见意味着更多的客观性,因此,更好的决策。
最后让我们看一个更简单的例子来说明这个概念。在热门电视节目《一掷千金》中,参赛者会得到一个公文包,里面装着数目不详的钱。基于他们面前的箱子的价值,他们不断地被给予选择是否要卖掉他们的公文包(可能从 0.01 美元到 1,000,000 美元不等)。
一个简单的例子:还剩两个公文包,其中一个是他们自己的。其中一个箱子价值 10 美元,另一个价值 20 万美元,但参赛者不知道哪个是哪个。“银行家”为他们的案子出价 95000 美元。他们接受交易了吗?
在节目中,很多娱乐来自于观看参赛者戏剧性地考虑他们的选择,并接受他们朋友和家人的建议。因为这些参赛者将立即获得奖金,赢得这些奖金的前景会影响他们的决策。也许他们会更好地接受一笔重要的交易,但他们在想,如果他们的案子有不太可能的百万美元,那该有多好?也许这是值得的,但他们担心做出错误的决定,把钱留在桌子上,当着数百万人的面?
当我们更接近于感受这些决定的影响时,这些让我们偏离客观决策的想法很可能会影响我们。如果参赛者走进游戏时知道他们会同意的金额,这将保护他们不失去客观性。
把所有的放在一起
我们现在知道,我们不仅必须离散化我们的数据以使我们的决策更容易,而且这样做的时间和方式也是至关重要的。让我们回顾一下这个过程应该如何工作。
1.识别目标
每个组织都有具体的、可衡量的目标(或者应该有)。无论你做出什么样的决策,这些数据都应该让你的团队做好实现这些目标的准备。任何不足都不值得你付出宝贵的资源。
2.提前获得关键利益相关方的认可
最重要的决定将会受到最严格的审查。与高管团队(或任何必要的人)就如何以及为什么做出决策进行明确的沟通,不仅能让所有人达成一致,还能在事情变糟时保护你。
3.收集数据
你知道你的目标,现在是让数据说话的时候了。
4.分析并展示结果
向你的团队汇报发现了什么,提醒他们你之前设定的目标。
5.执行决定
这是现在最容易的部分。鉴于从您的数据收集中获得的洞察力,每个人都同意采取行动,剩下的只是简单地坚持到底。
如果在进行“交易或不交易”之前,参赛者认真考虑了将显著改变他们生活的金额,他们可以酌情处理提供给他们的潜在交易。他们不会被聚光灯或观众、朋友和家人的催促而动摇。他们会冷静地打开案例,立即拒绝低于目标的交易,并在交易足够时立即接受交易。
这种快速、客观、不带偏见、不带感情色彩的决策过程会让这一集变得相当无聊。也许这就是为什么没有基于决定性数据分析师的真人秀节目。
本文原载于www.strataquant.com
使用决策树的离散化
原文:https://towardsdatascience.com/discretisation-using-decision-trees-21910483fa4b?source=collection_archive---------3-----------------------
从连续到离散
Photo by Alua Magzumova on Unsplash
1.介绍
离散化是通过创建一组跨越变量值范围的连续区间,将连续变量转化为离散变量的过程。
1.1 离散化有助于处理异常值和高度偏斜的变量
离散化有助于处理异常值,方法是将这些值与分布的剩余内层值一起放入较低或较高的区间。因此,这些异常值不再与分布尾部的其余值不同,因为它们现在都在同一区间/时段中。此外,通过创建适当的箱或区间,离散化可以帮助将偏斜变量的值分散到一组具有相同数量观察值的箱中。
1.2 离散化方法
有几种方法可以将连续变量转化为离散变量。这个过程也被称为宁滨,每个面元就是每个区间。离散化方法分为两类:监督的和非监督的。
无监督方法 除了变量分布之外,不使用任何信息来创建将放置值的连续箱。
监督方法 通常使用目标信息来创建仓或区间。
在本文中,我们将只讨论使用决策树的监督离散化方法
但是在进入下一步之前,让我们加载一个数据集,我们将在其上执行离散化。
决策树离散化
决策树离散化包括使用决策树来确定最佳分裂点,这些分裂点将决定仓或连续区间:
第一步 :首先它使用我们要离散化的变量训练一个有限深度(2、3 或 4)的决策树来预测目标。
第二步: 原来的变量值然后被树返回的概率代替。对于单个仓内的所有观察值,概率是相同的,因此用概率替换等同于在由决策树决定的截止范围内对观察值进行分组。
优点:
- 决策树返回的概率预测与目标单调相关。
- 新的箱显示出降低的熵,这是因为每个桶/箱内的观察结果与其自身比与其他桶/箱的观察结果更相似。
- 该树会自动找到垃圾箱。
缺点:
- 这可能会导致过度拟合
- 更重要的是,可能需要对树参数进行一些调整,以获得最佳分割(例如,深度、一个分区中样本的最小数量、分区的最大数量以及最小信息增益)。这很费时间。
让我们看看如何使用 Titanic 数据集对决策树执行离散化。
- 导入有用的库
IN[1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
- 加载数据集
IN[2]:
data = pd.read_csv('titanic.csv',usecols =['Age','Fare','Survived'])
data.head()
3。 将数据分成训练集和测试集
IN[3]:
X_train, X_test, y_train, y_test = train_test_split(data[['Age', 'Fare', 'Survived']],data.Survived , test_size = 0.3)
因此,假设我们在数据集中没有缺失值(或者即使我们在数据集中有缺失数据,我们也对它们进行了估算)。我离开这一部分是因为我的主要目标是展示离散化是如何工作的。
那么,现在让我们将数据可视化,以便从中获得一些见解并理解变量
4。让我们使用 ***age***
构建一个分类树来预测 ***Survived***
,以便离散化 ***age***
变量。
IN[4]:
tree_model = DecisionTreeClassifier(max_depth=2)tree_model.fit(X_train.Age.to_frame(), X_train.Survived)X_train['Age_tree']=tree_model.predict_proba(X_train.Age.to_frame())[:,1] X_train.head(10)
现在我们有了一个使用age
变量预测Survived
变量的分类模型。
新创建的变量Age_tree
包含数据点属于相应类别的概率
5。检查 ***Age_tree***
变量 中唯一值的数量
IN[5]:
X_train.Age_tree.unique()
为什么只有四种概率正确?
在上面的输入 4 中,我们提到了 *max_depth = 2.*
一个深度为 2 的树,进行了 2 次拆分,因此生成了 4 个桶,这就是为什么我们在上面的输出中看到 4 个不同的概率。
66。检查离散变量 ***Age_tree***
和目标 ***Survived***
之间的关系。
IN[6]:
fig = plt.figure()
fig = X_train.groupby(['Age_tree'])['Survived'].mean().plot()
fig.set_title('Monotonic relationship between discretised Age and target')
fig.set_ylabel('Survived')
这里,我们可以看到离散变量Age_tree
和目标变量Survived
之间的单调关系。该图表明Age_tree
似乎是目标变量Survived
的一个良好预测器。
7。检查每个概率桶/箱的乘客数量是否低于离散变量的分布。
IN[7]:
X_train.groupby(['Age_tree'])['Survived'].count().plot.bar()
让我们通过捕获每个概率桶的最小和最大年龄来检查由树生成的年龄限制桶,以了解桶的界限。
8。检查树 生成的年龄限制桶
IN[7]:
pd.concat( [X_train.groupby(['Age_tree'])['Age'].min(),
X_train.groupby(['Age_tree'])['Age'].max()], axis=1)
于是,决策树生成了桶:0–11
、12–15
、16–63
、
、46–80
,生存概率分别为0.51
、0.81
、0.37
和0.10
。
9。想象这棵树。
IN[8]:
with open("tree_model.txt", "w") as f:
f = export_graphviz(tree_model, out_file=f)from IPython.display import Image
from IPython.core.display import HTML
PATH = "tree_visualisation.png"
Image(filename = PATH , width=1000, height=1000)
Tree Visualisation
从图中可以看出,我们为max_depth=2
获得了 4 个箱。
正如我前面提到的,我们可以使用决策树优化许多参数,以获得最佳的 bin 分裂。下面我将为演示优化树的深度。但是请记住,您还可以优化决策树的其余参数。访问 sklearn 网站查看还有哪些参数可以优化。
10。选择树的最佳深度
我将构建不同深度的树,并将计算为每棵树的变量和目标确定的 roc-auc ,然后我将选择产生最佳 roc-auc 的深度
IN[9]:
score_ls = [] # here I will store the roc auc
score_std_ls = [] # here I will store the standard deviation of the roc_aucfor tree_depth in [1,2,3,4]:
tree_model = DecisionTreeClassifier(max_depth=tree_depth)
scores = cross_val_score(tree_model, X_train.Age.to_frame(),
y_train, cv=3, scoring='roc_auc')
score_ls.append(np.mean(scores))
score_std_ls.append(np.std(scores))
temp = pd.concat([pd.Series([1,2,3,4]), pd.Series(score_ls), pd.Series(score_std_ls)], axis=1)temp.columns = ['depth', 'roc_auc_mean', 'roc_auc_std']print(temp)
在这里,我们可以很容易地观察到,我们使用深度 1 或 2 获得了最佳的 roc-auc。我将选择 2 的深度继续。
11。使用 树变换 ***Age***
变量
IN[10]:
tree_model = DecisionTreeClassifier(max_depth=2)tree_model.fit(X_train.Age.to_frame(), X_train.Survived)X_train['Age_tree'] = tree_model.predict_proba(X_train.Age.to_frame())[:,1]X_test['Age_tree'] = tree_model.predict_proba(X_test.Age.to_frame())[:,1]
12。检查火车集合 中转换后的 ***age***
变量
IN[11]:
X_train.head()
13。检查列车组 中每个箱的唯一值
IN[12]:
X_train.Age_tree.unique()
14。检查测试集 中转换后的 ***age***
变量
IN[13]:
X_test.head()
15。检查列车组 中每个箱的唯一值
IN[14]:
X_test.Age_tree.unique()
现在,我们已经成功地将Age
变量离散为四个离散值,这可能有助于我们的模型做出更好的预测。
如果我们想要像Fare
一样离散化剩余的变量,我们也可以执行相同的程序。
变分自动编码器的解惑:综述
原文:https://towardsdatascience.com/disentanglement-with-variational-autoencoder-a-review-653a891b69bd?source=collection_archive---------5-----------------------
可解释的因子分解表示的学习在机器学习中已经存在了很长时间。但是随着最近像变分自动编码器(VAE)这样的深度生成模型的进步,对学习这种解开的表示的兴趣出现了爆炸。由于任何生成模型的目标本质上都是捕捉潜在的数据生成因素,因此解开的表示将意味着单个潜在单元对单个生成因素的变化敏感。
由于香草 VAE 鼓励生成因子上的后验分布 q(z|x) 更接近各向同性高斯 N(0,I) ,它促进了潜在生成因子的解开。这是因为各向同性高斯的协方差∑等于单位矩阵 I,这意味着所有维度都是独立的。在 ELBO 中,这是由第二个术语推动的:
然而,有效解纠缠所需的学习压力可能还不够,因为在 VAE,我们还想对输入信号进行适当的自动编码(或重建),而重建损失(第一项)与第二项相比可能太大。受此启发,[β-VAE通过赋予第二项β > 1 权重,对潜在瓶颈产生了更强的约束。因此,他们的目标函数是这样的:
由于增加了第二项的权重,重建精度开始下降。这给许多研究者带来了重要的研究问题:“如何在不损失重构能力的情况下实现更好的解纠缠?“ELBO 的[ 手术极大地帮助了寻找这个答案的道路,其中第二个术语被分解为:
这里,第一项是索引码互信息(MI ),第二项是对先验的边际 KL。这种分解提供了一种观点,即实际上第二项对学习解纠缠表示更重要,惩罚 MI(比常规 ELBO 更多)可能是重建不佳的原因。此外,[ InfoGAN ](不是基于 VAE 的模型)最大化了相同的 MI 以实现更好的解缠。
有了这个理论基础,本文[ link ]在正则 ELBO 上增加了(-1) λ 加权 KL(q(z)||p(z)) 。但是,由于 KL(q(z)||p(z)) 已经存在于 ELBO 中,它们实际上是最小化( λ + 1)加权 KL(q(z)||p(z)) 以鼓励解纠缠。注意[ adversarialAE ]也使用对抗性损失最小化这个 KL(不是 KL(q(z|x)||p(z)))。
更深入地说,【 TC-βVAE 】进一步将这个边际 KL 分解为总相关性(TC) 【第一项】和维度 KL 【第二项】:
通过这种分解,他们认为 TC (Watanabe 1960)是一种流行的多随机变量相关性度量,是学习解纠缠表示的最重要的术语,因此用一些β权重惩罚 TC,因此他们的总体目标看起来像:
与此同时,[dfactoring]论文也承认了 TC 对于解纠缠的重要性,并在 ELBO 中增加了这个术语的权重(- λ) 。同样,由于 TC 已经存在于 ELBO 中,他们实际上是最小化( λ + 1)加权 TC 以鼓励解开。
然而,根本的挑战在于对 q(z) (聚合后验分布)的估计,这取决于整个数据集(不仅仅是一个小批量)。这导致所有这些工作在估计 q(z) 或任何涉及它的项时采取不同的方法。例如,[dfactoring]使用了带有独立鉴别器的密度比技巧。
总的来说,我相信,在不久的将来,解开与 VAE 的纠葛会变得更加有趣。(更新)针对这一点,在[ IBP-VAE ]上,我们认为,随着生成因素复杂性的增加,这些讨论过的方法中的一些方法的解开能力下降,并提出 VAE 与非参数潜在因素模型(IBP-VAE),潜在密度可以随着数据复杂性的增加而增加,表明解开能力提高。
微型自主车辆中深度学习特征地图的可视化
原文:https://towardsdatascience.com/displaying-convnets-feature-maps-on-real-time-video-with-keras-and-opencv-418b986adda7?source=collection_archive---------6-----------------------
我们开始制造 Axionaut 已经有几个月了,这是一辆迷你自主无线电控制(RC)汽车,并在巴黎的一些比赛中进行了比赛。到目前为止一切顺利,我们设法获得了好职位。然而,人们总是对控制车辆的卷积神经网络内部的实际情况感到好奇。
有一些关于如何显示特征地图和过滤器的很棒的文章,在试图理解和编码 ConvNet 的特征地图时都很有帮助。我们还看到一些很酷的 Nvidia 视频展示了自动驾驶汽车上的实时 ConvNet 神经元激活(但是,他们是如何做到的?).
所以,我们决定经历一遍,并尝试在我们的原型中复制这种体验。为此,我们使用了我们已经拥有的预训练的 Keras ConvNet 自动驾驶模型,以及在训练和比赛时从车上拍摄的一些视频。
以此为起点,我们花了几天时间寻找经典问题的答案,如“网络如何看待世界”和“网络实际关注什么”。
体验的结果如下所示:
履行
如果你对我们如何做到这一点感到好奇,你首先需要了解的是,当在卷积层的视野中检测到相关特征时,卷积层的特征图是如何“触发”的。一个非常好的解释可以在 Harsh Pokharna 的文章中找到。
在这种情况下,我们的车就成了检测车道的‘专家’了!
但是,它是怎么做到的呢?其实背后并没有显式的编程。在训练期间,我们提供了所需的输出(左转、右转或直行)和示例道路图像,因此网络会自动“学习”车道是关键。
正如人类所做的那样,在不考虑任何其他因素(其他车辆、路标、行人或目的地)的情况下,车道为我们提供了关于正确决策的相关信息。我们向左转好吗?对吗?继续直走?
好吧,让我们回到正题上来。我们应该做的第一件事是访问感兴趣的卷积层,并绘制激活的热图。为此,我们使用了这个伟大的库的稍微修改版本。
激活的完整重建必然意味着考虑“深”和“浅”卷积层的贡献,如这里的所解释的。
为了简化,我们决定从单个卷积层估计激活,执行三次插值上采样而不是去卷积。在对整个网络的所有特征地图进行视觉检查之后,我们选择了第二个卷积层。
结果如下所示:
Input image
Feature map of the second convolutive layer
在这一点上,很明显网络主要是响应车道。下一步是重叠原始输入图像和激活,以一种干净地重叠具有高响应的区域而不损害原始图像的形状或颜色的方式。
OpenCV 来救援了!第一步是创建一个二元掩模,允许我们分割最高的激活,同时排除其余的。由于激活图的尺寸较小,还需要进行上采样。在此之后,我们将应用一些位运算来获得最终的合并图像。
第一个位运算是二进制掩码和激活映射之间的“与”。这个操作可以很容易地使用 OpenCV 实现,并允许分割最高地图的激活。
Binary mask
Bitwise “and” operation between mask and feature map
正如所料,我们获得了一个干净的车道分割完全由卷积神经网络。
在这一点上,我猜你可以想象得到最终图像所需的第二个位运算:加法。冷蓝色的出现是由于 Matplotlib (RGB)和 OpenCV (BGR)颜色格式之间的差异。你可以玩这个改变 Matplotlib 的颜色图来得到不同的颜色!
瞧,我们通过对网络激活的合理估计,获得了输入图像和特征图之间的最终合并。
Final merged image
现在,让我们呈现一个。avi 视频与结果。
问题
如果你有任何问题,我很乐意在评论中回答。包括所有代码和数据库在内的公共知识库的链接在这里可以找到。别忘了在推特上关注我们。
破坏性机器学习
原文:https://towardsdatascience.com/disruptive-machine-learning-7eafd8088166?source=collection_archive---------7-----------------------
在过去的二十年里,当我们一直在学习如何互相学习——并且做得非常出色的时候,我们也在学习一些更基本的东西。
我们一直在学习如何学习。
这听起来很明显,毕竟,我们一直都在学习。人类就是这样,对吧?
但实际情况远不止如此。我们知道我们在学习,但实际上我们绝对知道我们如何学习。
直到我们试着教计算机任何东西,我们才明白这一点。
Dr. Marvin Minsky demonstrates an early AI system.
50 年前,“人工智能”的概念似乎不像是一个白日梦——在那些知道内情的人看来——而是我们在几年内就能完全解决的东西。我们有快速的计算机和聪明的计算机科学家,我们肯定会让所有这一切马上开始运行。
具有讽刺意味的是,直到我们试图让计算机学习时,我们才发现我们对自己如何学习知之甚少。
在过去五十年的大部分时间里,我们试图用我们在教室里使用的相同技术来“教”一台计算机。那根本不管用。
早在我们走进教室之前,我们就是海绵,吸收我们能找到的每一个经验,从中学习。没有教室,没有老师,只有一颗乐于接受、渴望的心。
小孩子实际上是最专注的科学家,进行实验,测试假设,发现世界规律。
我们知道这一点已经有一百年了,但是直到几年前,我们才把这个过程应用到机器上。
直到几年前,计算机还不够小或不够快,不太擅长这种学习。但是在过去的 20 年里,计算机的发展速度平均快了 1000 倍,所以我们现在有足够快的计算机,可以用类似于我们学习的方式来学习。
让我们来看两个例子——都是澳大利亚的科技初创公司。
其中的第一个,位于悉尼的prediction,提供了一个非常简单的价值主张:它们提高了车队的效率。
预感可以做到这一点,因为车队中的每辆车都有一个带智能手机的司机,而智能手机连接到非常快速的移动宽带网络,将连续的位置信息输入预感。
Premonition 知道每辆车的位置,了解实时交通和天气状况,了解拟议的车队调度,然后提出建议,优化每辆车的路线——至少在理论上是这样。
路线优化是一个众所周知的难题,在数学上被称为“旅行推销员问题”。再加上现实世界的所有额外复杂性、实时数据和路线的实时变化,这就成了一个非常困难的问题。
因此,Premonition 建立了一个机器学习系统,它可以听取所有这些信息,并提出建议。但这只是开始。预感提出建议,然后听取建议的结果。这是一个好的建议吗?很糟糕吗?预感反馈其建议的结果——它从成功和错误中学习。
这是关键点:这种不断优化和改进的过程意味着使用预感服务的公司看到车队运营成本下降了 10%或 15%——仅仅通过与预感共享他们的数据。它不会在第一天就发生,但随着预感的学习,随着它对自己提出的建议变得更聪明,这些建议会得到改善,运营效率也会提高。
预感抓住了机器学习和 21 世纪商业之间交集的本质。它无缝地滑入,倾听,学习和提高。
对于像车队这样平淡无奇的事情来说,这已经足够令人惊讶了。但是另一家初创公司——Maxwell MRI(——正朝着一个更有趣的方向发展。
Maxwell MRI 将机器学习引入医学放射学,建立了一个能够提供早期可靠的前列腺癌检测的系统。这是一件大事,因为早期前列腺癌通常很难检测出来,如果像年轻人一样具有侵略性,可能会很快导致致命的诊断。
通过数以千计的病历和扫描,Maxwell MRI 学会了如何检测前列腺癌的症状,这是一项放射科医生觉得很难——而且往往不可能——的工作。麦克斯韦核磁共振成像填补了早期诊断和早期治疗的领先优势,这应该导致更好的结果,在癌症变得致命之前抓住它。
放射科医生应该受到麦克斯韦核磁共振的威胁吗?我们经常读到这些智能机器将如何让我们所有人失业,但如果你看看麦克斯韦尔 MRI 是如何工作的——以及预感是如何工作的——你会发现它非常适合组织的工作流程。Maxwell MRI 让放射科医生的工作变得更好,但它不会取代他们。
这也意味着,在训练有素的放射科医生有限的地区,如澳大利亚地区,Maxwell MRI 提供了否则根本不会出现的诊断能力。它成倍提高了放射科医生的效率。
当 IBM 在 2014 年来到澳大利亚推销他们的用于肿瘤学的沃森(Watson for Oncology )时,他们非常小心地强调他们的产品不会取代肿瘤学家,而是“肿瘤学家耳边的安静声音”,提供尽可能好的建议,以指导实现尽可能好的结果。
有时这比任何人预测的都有效:肿瘤学沃森最近诊断了一种癌症,这种癌症难倒了日本的每一位肿瘤学家——因为它有更多的知识可以利用,成千上万的病历,远远超过任何从业者所能看到的。
很难想象,在十年左右的时间里,任何大规模运营的组织都不会有几个机器学习系统在其中运行,帮助该组织生存和发展。
这就是事情开始变得非常有趣和具有破坏性的地方。机器学习不是单行道。它不仅仅属于组织。个人也会有这些系统。
大约二十年前,Furby 成为世界上最热门的玩具。孩子们喜欢 Furby,因为当他们和它玩耍时,它似乎在学习和成长。早在 1998 年,那只不过是聪明的剧院。
今天,我们定期与苹果的 Siri 和亚马逊的 Alexa 和谷歌助手进行对话。所有这些对话都提供给庞大的机器学习系统,帮助这些系统更好地理解我们对它们说的话。
在接下来的几年里,我们会看到学习变得更加具体,更加关注我们自己的个人需求。
毕竟,如果预感可以使用机器学习来提高车队的效率,麦克斯韦尔 MRI 可以使用机器学习来提高诊断的准确性,那么我们为什么不想使用机器学习来帮助提高我们的生活质量或谋生能力呢?
我们将使用机器学习来帮助我们利用机会。
这很快就引出了一些有趣的路径,因为我们正在走进的世界在组织中有许多机器学习系统,这些系统将很快开始与个人使用的许多机器学习系统进行交互。这些系统将开始互相学习。
当预感和你的个人机器学习系统研究出如何合作,以便你可以达到你的目标,那将是一个非常不同的世界。这个世界变得非常聪明,非常快。
我们刚刚通过万维网经历的那种转变——我们变得非常聪明,非常快,因为我们都在分享我们知道的东西——即将再次发生,但这一次是机器学习。
这将是我们和我们所知道的,以及机器和它们所知道的,所有人都在以每一个可以想象的有意义的方向相互交流。
我们将被所有这些智能引导着穿越那个世界——有些是我们的,有些是其他的,有些是机器。这对我们今天来说听起来很奇怪,但我认为这只是因为这是一个非常新的想法,我们对那个世界的样子没有一个完整的概念。
但你可以把它想象成一个真正的好朋友或值得信赖的知己,他不断给你提供一些小信息,总是帮助你在任何情况下都做到最好。
过了一会儿,有了这样的东西,我们会发现很难想象没有它我们怎么生活。
这就是我们对智能手机的感觉,仅仅在 iPhone 发布十年后。
这种容量的持续提高,才是真正的颠覆。这就是改变一切的改变。这就是组织需要准备和建设的目标。
我们已经走了很远了。我们已经有了这个分享和学习的巨大结构——尽管我们主要用它来记录我们的社会生活。但是分享比脸书更有意义,事实比维基百科更有用。
我们需要学会分享,我们今天就需要这样做,因为这是开启一切的钥匙。如果你自己做不到这一点,可以与其他擅长数字化转型的企业合作。数字化转型的基石是学习如何分享。
考虑如何与不断变得更聪明、更有能力、同样渴望分享和学习并使用分享和学习工具的客户合作。
在一个地方呆得太久,你会发现你的顾客已经跑在你前面,投入到另一家企业的怀抱。
接受这个事实,这个更聪明的未来伴随着一定程度的不确定性。
我们最近才知道,我们可以获得擅长做某些事情的机器学习系统——进行诊断,或安排交付,等等——但不能告诉我们为什么他们会做出这样的决定。
几乎可以说,这些机器学习系统已经变得如此“人性化”,它们是凭直觉工作的。我们有点怀疑地捍卫这一点是对的,但仅凭这一点就拒绝它是愚蠢的。在某些方面,一个更智能的世界对我们来说有点太智能了。许多事情将会“起作用”——但是在我们理解它们为什么起作用之前,还需要相当长的时间。
这有点怪异,几乎感觉有点不可思议。所以让我用一个故事来总结这一切:
nVidia CEO Jen-Hsun Huang reveals the hardware for autonomous automobiles.
在最近的消费电子展上,我看到了一辆配备了非常强大的机器学习系统的奥迪——它安装在一块与 iPad 大小相同的电路板上。
然后,汽车被编程为向人类司机学习,后者在一周内驾驶汽车 48 小时。48 小时后,机器学会了如何驾驶。
它开起来完美吗?大概不会。但它肯定行驶得足够稳定,以至于奥迪毫不犹豫地驾驶一辆已经学会如何自动驾驶的汽车带着人们去兜风。
他们将这款车战略性地放置在展会入口的正对面,这是奥迪承诺将在不到四年内交付的未来的指针。
这就是我们善于学习的地方,也是我们善于创造学习的东西的地方。我们才刚刚开始。
Here’s the full talk given at Computershare Innovation Day, May 2017.
剖析算法
原文:https://towardsdatascience.com/dissecting-algorithms-4baf9645888d?source=collection_archive---------6-----------------------
算法是计算机科学的基石,因为我们对世界的理解需要复制成机器可读的代码,以便可以执行。
尽管人脑如此先进,但人们开始意识到机器可以更快(随着时间的推移,这令人难以置信)并且没有错误。人类会犯错,但机器不会,除非这些错误是程序的一部分。
因此,我们对现实世界问题的理解直接关系到我们能让一台机器多好地解决它,或者让一台机器解决它!
数学是人类用来解决问题的语言。
对数学概念的基本理解对于理解世界和与世界互动是必不可少的,对吗?!
一公斤芒果要 60 美元。那么 2.5 公斤你出多少钱?
以上相对容易。现在想想你每周在超市购物的情况。如此多不同数量的不同东西。有很多人和你一起在那里购物。收银员是否开始写下所有内容,然后开始计算每一项的费用?不,他或她扫描条形码,瞧,你的账单准备好了。刷卡,拿着购物袋退出!
有相当多的工作是在幕后完成的。每件商品的库存和当前价格都保存在商店的计算机上。条形码扫描仪也与电脑相连。也是支付网关。一切都是相互联系的,因此交易是自动进行的。
但是当你想到这一点的时候,你会发现这些都是由人类完成的。条形码扫描仪取代了店主对库存中所有商品及其价格的记忆。支付网关取代了人工计算的现金交易,并倾向于精确的变化。
在大学里,我们学习简单的程序。理解递归的斐波那契数列。用 2 个数字交换临时变量。一摞。一个队列。用于排序技术的数组。就其本身而言,这些只是部分。它们没有任何意义。教育给你工具,而不是如何应用工具的知识。
如果你写一个模拟现实世界问题并解决它的程序,这些部分的总和才是最重要的。这是你必须自己去发现的事情!
一开始,程序员试图解决更简单的问题。喜欢游戏:)我个人有兴趣为我玩过的所有游戏写一个程序..四连冠,数独,象棋,瓷砖,井字游戏,河内塔。除了象棋,我什么都写。象棋属于' 现实世界问题 '范畴,因为它相当复杂!
一旦你开始编写这样的程序,你就会明白为什么你需要每一部分——输入、数据结构、迭代器、循环语句。你倾向于看到“需求”并搜索相关的“部分”。我用什么来保存这个 3x3 网格的数据?我如何计算这个结果?它是整数还是分数?
一旦你通过反复试验学会了这些,你就进入了有趣的部分——算法!我如何解决游戏的这个位置?我如何移动和保持得分?我如何评估一个成功的职位?
您将理解深度优先搜索和广度优先搜索之间的区别,以及为什么您需要为您的特定场景选择其中一个,因为您尝试将这些技术应用到您的场景中,并发现其中一个不起作用。
L 赚到代码,很好玩。并发展到所使用的不同算法。了解为什么使用每一个。
而现在我们正处于神经网络和机器学习的时代。我们把一个普通的场景扔给一台计算机,它试图用我们开发的其他程序来解决这个问题。我们投入的数据越多,效果就越好。
维基百科称,神经网络是一种模仿人脑和神经系统的计算机系统。明白我之前说的将我们的理解复制到代码中的意思了吗?!
算法是通用场景的一套基本准则。如果您有这些输入,请这样做。它们令人兴奋,因为它们帮助我们理解一个给定问题的“如何”解决。我们如何解决?
拿一个你喜欢的游戏,开始用你喜欢的语言编码。那是学习算法的最好方法。
沿着这条路,你会创造出一些有价值的东西!
感谢您的阅读!
如果您喜欢,请点击💚所以其他人会在媒体上看到这个。
我很想听听你对这个问题的看法,请留下你的评论,这样我们就可以继续对话了 ☺
顶部的图片来自我的收藏!其中一个变种是在我的 Instagram 上 😃
剖析 NBA 选秀
原文:https://towardsdatascience.com/dissecting-the-nba-draft-ee175d7aec31?source=collection_archive---------3-----------------------
Photo by JC Gellidon on Unsplash
NBA 总决赛后,NBA 总经理和体育迷都期待着这个夏天唯一的篮球赛事——NBA 选秀。该草案是臭名昭著的,因为它创造了总经理的职业生涯,粉碎了球迷的希望,并创造了联盟的未来之星。
每个人都在挠头,波特兰是如何选中格雷德·奥登而不是凯文·杜兰特的,或者伊塞亚·托马斯,2017 年 NBA 季后赛的宠儿,是如何滑落到选秀的最后一个选秀权的。马后炮当然是 20–20;当时,除了第二轮,没有一个头脑正常的人会选一个 5 英尺 9 的控卫,也许开拓者真的需要一个中锋。
像奥登和托马斯的故事,典型的“破产”和“盗窃”草案,是 GMs 必须能够预测的。能够区分潜在的 NBA 成功和大学生涯对于建立一个稳固的 NBA 球队至关重要。对于挣扎着与 NBA 精英竞争的小市场球队来说,这种能力更为重要。
NBA 选秀历史
在深入分析之前,我想看看选秀权是如何产生的。
Figure 1
对于国内,在 2003 年到 2012 年之间被选中的球员,我们没有看到任何令人惊讶的事情。大多数第一年和第二年的选手都是在第一轮中被选中的。这些球员通常表现出很高的能力增长潜力,并被描述为有很高的上限。第三年的球员被分开,而大学老兵大多在第二轮。这些球员在大学里已经展示了他们的极限;他们通常会在每轮比赛的最后阶段落败,并被那些寻找角色球员而非明星的老牌球队拿下。
Figure 2
在这里,我把选秀分成了 6 个部分(也就是说,第 1-10 号选秀权是第 1 部分,依此类推),并且查看了每个部分中被选中的球员的身高。
最有趣的细胞是第一个,我们看到了高度的双峰分布。似乎在前 10 个选秀权中,球队要么选择控卫,要么选择中锋。前十个选秀权通常是抽签中的球队;这些球队挣扎了相当一段时间,急需重要的位置球员。这些球队正在寻找能给他们的球队带来价值和得分的中锋和控卫。
检查草稿结果:查看 Win Share
教师通常很难单独给小组项目的成员打分。他们通常必须回答“每个学生对成绩贡献了多少?”。幸运的是,我们不是老师,而 NBA 已经提出了胜利份额,一种确定个人对团队成功贡献的方法。此处对赢得份额的定义更加明确。
让我们来看看大学经历和选秀位置是如何与 NBA 胜率相关联的。
Figure 3
我们看到,一年球员在他们未来的 NBA 赢球份额中有更多的方差,而 4 年球员的方差较小。这一数据有力地表明,年龄较大的大学生球员确实比年轻球员有一个较低的上限,但不像年轻球员那样有风险。当总经理挑选第一年或第二年的球员来提升他们的特权时,他们是在正确的轨道上(尽管相关性并不意味着因果关系)
现在让我们来看看选秀位置与未来 NBA 胜率的关系。
Figure 4
看起来好像在草稿位置和赢股之间有负相关。在大约第 30 次选秀权之后,未来的 NBA 赢球份额似乎没有变化。然而,这张图表还有很多需要解释的地方。事实上,未来 NBA 赢球份额的最大预测因素是什么?为了理解这一点,我绘制了每所大学的统计数据与未来 NBA 胜率的对比图。让我们来看看结果。
Figure 5
快速浏览一下,我们可以看到失误,抢断,3 分率和 2 分率并没有转化为 NBA 赢球份额。但是分,助攻,篮板,盖帽之间是正相关的。这确实表明这些统计数据可能会转化为 NBA 水平,这让我们深入了解某个球员将如何在 NBA 做出贡献。
预测成功份额:实现神经网络
对于 GMs 来说,获取一名大学生球员的数据,并预测该球员在 NBA 职业生涯中的贡献将是非常有用的。我已经建立并训练了一个神经网络来做到这一点。*以下是 2017 年 NBA 选秀参与成员的预计获胜份额结果,按降序排列。请注意,成功份额高度依赖于团队。这些预期的成功份额可以被认为是职业生涯的平均值。
Figure 6
我们立即注意到,富尔茨、鲍尔、塔图姆和约什·杰克逊排在前 10 名,德阿龙·福克斯和马利克·蒙克排在前 15 名。我们确实有一些有趣的发现。T.J .利夫、卡梅隆·奥利弗和其他几位大人物也跻身前 20 名。这种方法并不意味着这些球员应该按照这个顺序被选中;这仅仅表明,这些球员在他们的 NBA 职业生涯中预计会有这些赢球份额。
识别盗窃和抢劫:SoftMax(多项式)回归
使用经过训练的神经网络*将选秀权分为第一轮、第二轮或介于两者之间的某个阶段,我们可以确定 2017 年选秀中的哪些球员属于哪一轮。结果如下:
Figure 7
我们可以很快识别出“偷东西”的人。这些玩家属于第 2 级或第 1.5 级玩家,但他们的获胜份额高于第 50 个百分点。这些球员包括弗兰克·梅森、奈杰尔·海耶斯、约什·哈特和马尔科姆·希尔。有趣的是,该算法将贾文·埃文斯和卡梅隆·奥利弗归类为一级球员,尽管许多选秀网站都预测他们将在第二轮比赛中进入球队。
我将半身像定义为被归类为 1 级玩家,但没有表现出高获胜份额潜力的玩家。使用这个定义,我可以确定奈杰尔威廉姆斯戈斯,贾斯廷·杰克逊,狄龙布鲁克斯,丹尼斯史密斯小几个。
值得注意的是,球员在选秀中的位置高度依赖于球队及其未来的具体需求。这个工具主要用于识别在大学篮球世界中可能被忽视的离群值。
方法
数据抓取
*使用 Python 的 BeautifulSoup 包,我能够从这个网站抓取到 2003 年至 2012 年期间每个国内大学生球员的以下统计数据:
- 名字
- 在校时间
- 上过的大学
- 投篮命中率(2 分和 3 分投篮)
- 助攻/比赛
- 篮板/比赛
- 积木/游戏
- 点数/游戏
- 抢断/比赛
- 以英寸表示的高度
- 以磅为单位的重量
- 赢得股份/游戏(仅限 NBA 职业生涯)
回归神经网络
使用 Python 的 Keras 包,这里是具有以下结构的全连接深度网络:
- 具有 11 个节点的输入层
- 具有 8 个节点的隐藏层,重新激活
- 具有 16 个节点的隐藏层,ReLU 激活
- 丢失 0.5 的丢失层
- 具有 1 个节点的输出层,线性激活
模型参数
- 纪元:1000,提前停止
- 损失:均方误差
- 优化器:Adam
用于分类的神经网络
使用 Keras 库,所使用的网络具有以下结构:
- 输入层:11 个节点
- 隐藏层:1 个节点,重新激活
- 隐藏层:100 个节点,重新激活
- 输出层:2 个节点,SoftMax 激活
模型参数:
- 损失:二元交叉熵
- 优化器:Adam
- 纪元:40,提前停止
- 模型达到了 66%的准确率
****这篇文章的创意归功于我的好朋友 Brian Wahlig ****
剖析 NBA 选秀:第二部分
原文:https://towardsdatascience.com/dissecting-the-nba-draft-part-2-79b6bd486a8d?source=collection_archive---------11-----------------------
Photo by Ramiro Pianarosa on Unsplash
NBA 总决赛后,NBA 总经理和体育迷都期待着这个夏天唯一的篮球赛事——NBA 选秀。该草案是臭名昭著的,因为它创造了总经理的职业生涯,粉碎了球迷的希望,并创造了联盟的未来之星。
每个人都在挠头,波特兰是如何选中格雷格·奥登而不是凯文·杜兰特的,或者 2017 年 NBA 季后赛的宠儿伊塞亚·托马斯是如何溜到最后一个选秀权的。马后炮当然是 20–20;当时,除了第二轮,没有一个头脑正常的人会选一个 5 英尺 9 的控卫,也许开拓者真的需要一个中锋。
像奥登和托马斯的故事,典型的“破产”和“盗窃”草案,是 GMs 必须能够预测的。能够区分潜在的 NBA 成功和大学生涯对于建立一个稳固的 NBA 球队至关重要。对于挣扎着与 NBA 精英竞争的小市场球队来说,这种能力更为重要。
动机
典型的选秀模式只会使用进入联盟的球员来决定被选中候选人的成功与否。这很好,但是这个模型假设这个球员会在 NBA 打球。这种类型的模型有助于确定可以成为可靠贡献者的玩家。此外,它可以量化当前大学球员的选秀“股票”
NBA 选秀数据
NylonCalculus 的合著者安德鲁·约翰逊对的伟大的威尔·施里弗提供的数据做了最好的描述。简而言之,每个大学球员都有一个条目,包含该球员在校期间每年的年度总数、高级统计数据和每 40 分钟的数据。每个条目都与个人大学毕业后的最高水平相关联。标签包括以下:NBA,国际,夏季联赛,G 联赛。
为了这个分析的目的,根据安德鲁·约翰逊的建议,我用国际标签代替了夏季联赛和 G 联赛的标签,因为这些区别在决定 NBA 的潜力时并不太相关。因此,这个问题变成了一个不平衡的二分类任务。
我还选择了只使用每个球员大学生涯的最后一个条目。对我来说,这是最合理的,因为每个潜在客户都是根据他们的最终状态进行评估的。当一个高年级学生宣布参加选秀时,他在第一年的表现没有得到评估;相反,当他准备好宣布时,他是由谁来评价的。在我的下一篇文章中,我会改变这个假设,但是现在让我们继续下去。
最后,我按职位和年份对每个特征进行了百分位数排名。通过这种方式,人们可以知道与其他竞争者相比,一个人的表现如何。
数据探索和可视化
-
-
- TL 结果在底部***
-
在深入模型构建过程之前,让我们先看看所使用的特性集。
Features to consider for Classifier
这些统计数据的解释可以在这里找到。在这里,我们可以包括一个球员的翼展和三分球命中率,因为这些品质通常决定了防守潜力和得分能力(这两种品质对 NBA 前端办公室都有吸引力)。
在创建模型之前,我们可以看看是否可以通过降低维度来分离出我们感兴趣的类别。
This graph shows how much variance in the data is explained by each principal component
为了做到这一点,我们采用了一种常见的方法叫做 PCA 。我们可以从右侧的解释方差图中看到,约 12 个分量解释了数据中约 80%的方差。利用这些信息,我们可以将数据转换到低维空间。在二维和三维空间中,我们真的看不到任何阶级的分离。
PCA/TSNE visualization of the Centers (pink and blue represent NBA players)
为了可能在另一个特征空间中得到分离,我们对数据的前 12 个 PCA 分量实施 t-sne 特征变换。然而,我们可以看到,在这种情况下,这些类也没有明显的区别。
模型构建方法
由于数据集中 NBA 实例的数量非常少,我无法使用精确度这样的指标来确定模型的有效性。在我们的情况下,我们不希望假阳性(将平庸的球员归类为 NBA 值得的球员),我们也不希望假阴性(将 NBA 口径的球员误归类为国际球员)。在我们的例子中,两者都一样糟糕(尽管其中一个可以为另一个辩护)。为了评估模型性能,我将使用 F1 分数。
最近邻方法
由于我们有一个高维数据集,k-NN 方法并不真正有效。相反,我按位置将数据分段,并将数据转换成其前两个主成分,因为似乎有一点分离(如前所示)。我本可以对 2 种成分的 231 种可能的组合进行彻底的搜索,但是那太费时间和计算量了。在对几个 k 值、加权方法和核方法(用于 PCA)进行网格搜索后,对于每个位置,我绘制了 ROC/AUC 曲线。
The area under the curve represents the model’s ability to discriminate between classes. The closer the area to 1, the better!
OOS Confusion Matrix for Guards
从上面来看,这个模型似乎有最成功的区分警卫。
尽管相当成功,这里的模型不是很好解释。我们想知道哪些特征与 NBA 潜力相关。
逻辑回归(按位置分段)方法
对于这种方法,我按照位置对数据进行分段,并利用前面描述的特征为每个位置创建一个单独的模型。我对损失函数进行加权,使其与类别频率的倒数成比例(即 NBA 标记的样本具有较高的权重,因为它们出现的频率较低)。
与 k-NN 方法相比,这里的模型稍差一些。看一看警卫的分类矩阵,我们可以看到一些有趣的东西。
OOS Confusion Matrix for Guards
与 k-NN 方法相比,该模型倾向于低估 NBA 人才。这里假阳性率低,假阴性率高。
因为我们想要可解释的特征,我们可以查看每个位置的每个模型的系数。请记住,增加对应于正系数值的特征值会将赔率推向 1,而增加对应于负系数值的特征值会将赔率推向 0。
我们可以立即注意到一些趋势。毫不奇怪,进攻/防守赢球份额、PER、使用率%、每场比赛分钟数和身高是最大的影响因素。然而,在组内,我们可以看到 PPR(纯得分率)和 PPS(每次投篮得分)是 NBA 后卫潜力的预测。对于大个子来说,翼展和防守数据,比如 BLK%和 STL%是很重要的。
有些系数很奇怪(例如,更高的 TOV%对守卫有利),但这是由于混杂效应。例如,高 TOV%可能意味着该球员经常拿球,并有望得分(即有价值的球员)。此外,高 TOV%预计来自新生的现象,因为他们正在适应大学比赛的严酷。在这种情况下,模型可能会收到一次性信号。
随机森林分类器方法
考虑到分类任务的难度,我认为利用非线性模型是有益的。在这个方法中,我没有按照位置进行分离,而是按照顺序对分类位置进行编码。该方法比一次热编码(减少的特征空间)执行得更好。我再次使用了同样的加权损失函数。
这里,曲线下的区域看起来很有希望。如果我们看一下混淆矩阵,我们会发现我们实际上做得很好。
OOS RFC Conf. Matrix
我们可以在这里进行同样的系数分析。对于决策树来说,由于涉及到非线性,所以有些不同。在这里,特征重要性表明模型认为分割特定特征有多重要。
与我们在逻辑回归模型中看到的类似,DWS/OWS、PER 和使用百分比主导着决策过程。也像逻辑回归系数的解释一样,我们可能会看到共线性的影响。例如,TOV%可能被低估,因为它包含在 PPR。
逻辑回归(再次!)方法
这里,我实现了位置的一次性编码,而不是分割数据。使用了相同的加权损失函数。
与 RandomForest 相比,这里的逻辑回归虽然不太成功,但也不错!再一次,这个模型很有可能会错过相当多的 NBA 天才球员。
讨论
对于这些 NBA 球员来说,很容易检测出正负方向的异常值。我认为困难在于对其余的人进行细微的区分。令我印象深刻的是,在只有二维数据的情况下,k-NN 分段分类器能够与逻辑(分段)分类器一样好,如果不是更好的话。我最初认为,按职位对数据进行细分可以更精确地对各组进行分类,因为职位之间的区别更容易界定。然而,这种分割方法并没有证明比简单的 RandomForestClassifier 更有效。
结果!
上述模型的应用是所有这些中最令人兴奋的部分。
识别过去的成功和失败
就像安德鲁在他的帖子里做的一样,我填充了给定的数据,并寻找最大的抢断(进入 NBA 的赔率非常低的家伙)和破产(没有进入联盟的赔率很高的家伙)。
Biggests Busts (left) and Biggest Steals (Right)
其中有些是不公平的。比如奈杰尔-威廉姆斯·戈斯,大学毕业才一年,我们就真的给他贴上国际的标签是不公平的。未来的改进可能是只关注那些离开大学时代至少 3-4 年的球员。
值得注意的缺席者包括威尔·拜纳姆、布里安特·韦伯和特洛伊·威廉姆斯,他们都为 NBA 球队做出了不可忽视的贡献。此外,有趣的是,该模型对马库斯·斯劳特、诺亚·哈特索克和艾克·奥福格布这样的多面手过于乐观。
去年的班级
出于好奇,我想知道我们是否能预测到凯尔·库兹马、塔图姆或米切尔会像他们一样出现在新秀舞台上。
这一模式在塔图姆和库兹马的评分较低,而在扮演马里克·蒙克的评分较高。这个模型并没有预测 NBA 的成功,所以重要的是要有所保留。
分析草稿库存
有了这样的模型,看看今年选秀班的股票(进入 NBA 的概率)在他们的大学生涯中是如何上升和下降的会很有用。此外,该模型可以用来预测一个球员是否应该在他职业生涯的某个特定阶段参加选秀。
回顾今年的课程,一些非一蹴而就的前景:
从左至右,我们有格雷森艾伦,彭江雨布伦森,杰冯卡特,兰德里沙梅特,米卡勒布里奇斯和迈尔斯·布里奇斯。
显而易见,一个玩家的股票可能会暴涨暴跌。以杰冯·卡特为例。大三是他最成功的一年,他有 80%的机会进入 NBA。然而,今年,他的表现使他降到了 50%以下。
格雷森·艾伦在 2017 年做出了正确的决定,回来参加高年级赛季,因为他的股票相当低。今年被大多数球探喜欢的沙梅特,预计在 NBA 的投篮命中率很低。然而,这可能是因为他的受伤限制了他的上场时间。
按职位排列今年的潜在客户
我们看到像迈尔斯·布里奇斯、艾顿、杰克森和巴格利这样的球员出现在顶级前锋中。当然,邦巴是中心班的佼佼者。有趣的是,被球探高度看好的特蕾·杨和科林·塞克斯顿并没有出现在顶级后卫中。两人都有望进入 NBA(分别为 58%和 54%)。
最近的发展
一些运动员从选秀中退出了他们的名字,而另一些则使他们自己有资格。退出选秀的几个著名的名字是 Tyus Battle(锡拉丘兹)、Jontay Porter(米佐)、Jaylen Hands(加州大学洛杉矶分校)和卢克马耶(北卡罗来纳大学)。让我们看看他们的决定是否正确。
从模型来看,最值得质疑的退出决定似乎是 Jontay Porter 的。他的股票不太可能上涨更多(统计数据)。4 个决定中最聪明的是 Hands,他今年对布鲁因斯有点失望。
选秀中最有趣的是唐特·迪文森佐,一个新诞生的比利亚诺瓦英雄。该模型预测他在 NBA 的命中率约为 50.2 %。希望一切顺利。
未来的工作
由于我们本质上是在处理多维时间序列数据,我想使用动态时间扭曲来对这些参与者进行分类。它将给出一个更全面的球员在大学时代的观点,希望它能够更好地预测 NBA 的机会。
承认
再次,我想对安德鲁·约翰逊和威尔·施里弗大声欢呼。
密码
代码可以在 Github 上的一系列 IPython 笔记本中找到。
用种族扭曲数据…
原文:https://towardsdatascience.com/distorting-data-with-race-5796edc51522?source=collection_archive---------8-----------------------
我在 JAMA 上读到一篇有趣的禁运文章。最初,我只是打算在今天上午 11 点等待禁运解除,并在几个平台上分享,但我有几天时间来思考这些发现。为了消磨时间,我读了一些引文。
从 DeSantis CE 和他的同事那里引用的话无意中非常简洁地描述了这种紧张。我们知道我们所报道的是低价值的,因为差异的真正原因是社会和政治结构,但是——管它呢——其他人都在这么做。
我们认识到种族是一种社会建构;然而,由于美国的许多健康数据是按种族报告的,种族分类对于描述国内健康的一般模式仍然有用。尽管我们可以互换使用非裔美国人和黑人这两个术语,但这里提供的数据是针对黑人的,并尽可能排除西班牙裔
人。—2016 年非裔美国人癌症统计:减少种族差异的进展和机遇
我们对“黑人”的癌症发病率了解多少?
在美国,非裔美国人承担了不成比例的癌症负担,在大多数癌症中,其死亡率最高,存活时间最短。这些不平等的原因很复杂,反映的是社会和经济差异,而不是生理差异。
例如,2014 年,26%的黑人生活在联邦贫困线以下,而非西班牙裔白人的这一比例为 10 %, 22%的黑人完成了 4 年大学教育,而非西班牙裔白人的这一比例为 36%。1,2 社会经济地位较低的人更有可能从事增加癌症风险的行为,部分原因是针对这些人群的营销策略以及环境和社区因素,如体育活动机会较少和新鲜水果和蔬菜较少。—
2016 年非裔美国人癌症统计:减少种族差异的进展和机遇
癌症趋势图中的数据有点过时。我正在从我的数据源更新数据,但我在这里的观点是,我们有足够的数据开始以更深的粒度寻找。种族数据告诉我们的很少。理解我们的基因是基于地理起源而不是我们的肤色分类的,是我们理解的一个重要支点。
当我们根据肤色进行聚合时,我们遗漏了什么?
最近的研究信(美国东部时间上午 11:00 前禁止发布)解释了为什么社会和生物代理(不存在)的假设和持续误解对任何人都没有好处…
上述数据在报告黑人男性前列腺癌发病率方面是明确的。Vastola,Yang 等人在 JAMA oncology 中报告了可能存在的潜在障碍,这些障碍不成比例地阻止了黑人患者参与临床试验。研究信中写道:
我们研究了单独使用血清肌酐(sCr)代替肾功能的种族校正测量,以及使用绝对中性粒细胞计数(ANC)阈值排除良性种族中性粒细胞减少症患者。对于任何给定的肾功能,黑人患者都有较高的 sCr,使用这种测量方法可能会错误地低估他们的肾功能。同样,6.7%至 8.0%的黑人患者患有良性种族中性粒细胞减少症,这种疾病被定义为中性粒细胞减少症(ANC<1.5 Å~ 109 cells/L)without attributable cause, may be excluded despite healthy immune systems.
JAMA Oncology 2018 年 2 月 8 日在线发表 实验室资格标准作为黑人男性参与前列腺癌临床试验的潜在障碍
有一场比赛。如果你正在读这篇文章,你就在其中。
实验室测量存在差异和变化,但我们肯定无法仅根据血清肌酐(sCr)准确地按种族对参与者进行分类。识别实际的生物差异,而不是仅仅根据肤色来聚集患者,这与不使用种族作为识别和测量健康的社会决定因素的替代物一样重要。
虽然在试验标准中采用基于种族的差异可能会在确保患者符合试验资格时增加轻微的后勤挑战,但这些调整将防止健康个体
仅仅因为其 种族 造成的良性实验室差异而被排除在外。
[我会用血统代替种族——BMcc]——实验室资格标准作为黑人男性参与前列腺癌临床试验的潜在障碍
最初发表于【www.dataanddonuts.org】。
任何事物的分布式表示
原文:https://towardsdatascience.com/distributed-representation-of-anything-14e290daf975?source=collection_archive---------11-----------------------
Photo by Riho Kroll on Unsplash
在这篇综述中,我们探索了我们在互联网上发现的任何东西的各种分布式表示——单词、段落、人物、照片。如下所示,这些表示可用于各种目的。我们试图选择看似不同的主题,而不是提供分布式表示的所有应用的全面回顾。
输入:模型目的
单词向量:情感分析
段落向量:聚类段落
人物向量(维基文章):比较
照片和单词向量:照片检索
激动吗?我是!让我们跳进来。
单词的分布式表示
这就是故事开始的地方:用定量的方式来表示一些定性的概念(例如单词)的想法。如果我们在字典中查找一个单词,我们会根据其他定性单词获得它的定义,这对人类有帮助,但对计算机没有真正的帮助(除非我们做额外的后处理,例如将定义单词的单词向量输入到另一个神经网络中)。在之前的文章中,我们介绍了单词向量的概念——定性单词的数字表示。
总之,当前的 NLP 实践经常将单词替换成固定长度的数字向量,使得相似含义的单词具有相似的数字向量。值得重新强调的训练概念是,在训练一个词的数值向量(姑且称之为中心词)时,优化中心词的向量来预测周围的上下文词。正如我们将在下面看到的,这种训练概念被扩展到新的应用中。
段落的分布式表示
word2vec 的一个有趣的扩展是段落的分布式表示,就像固定长度的向量可以表示一个单词一样,一个单独的固定长度的向量可以表示整个段落。
简单地对整个段落的单词向量求和是一种合理的方法:“当单词向量被训练来预测句子中的周围单词时,这些向量表示单词出现的上下文的分布。这些值与输出层计算的概率成对数关系,因此两个词向量的和与两个上下文分布的乘积相关。[1]" 由于字向量的求和是可交换的——求和的顺序无关紧要——这种方法不保留字的顺序。下面,我们回顾两种训练段落向量的方法。
[2]提出了两种训练段落向量的方法,这两种方法的相似之处在于,这两种表示都被学习来从段落中预测单词。
第一种方法是 PV-DM(段落向量:分布式内存)。这从上下文窗口中采样一个固定长度(比如说 3)。这三个单词中的每一个都由一个 7 维向量表示。段落向量也由 7 维向量表示。4 (3+1)个向量被连接(成为 28 维向量)或平均(成为 7 维向量)以用作预测下一个单词的输入。在小的上下文窗口中单词向量的连接考虑了单词顺序。
PV-DM illustration. Source: [2]
第二种方法是 PV-DBOW(段落向量:分布式单词包)。这从段落中随机抽取 4 个单词,并且只使用段落向量作为输入。
差异:
- PV-DM 从 4 个输入中预测 1 个字;PV-DBOW 从 1 个输入中预测 4 个单词。
- PV-DM 从目标单词的周围单词中抽取单词;从段落中画出单词。
- PV-DBOW 存储的数据较少,仅存储 softmax 权重,而 PV-DM 中同时存储 softmax 权重和字向量。
PV-DBOW illustration. Source: [2]
现在我们有了段落向量,我们可以使用这些高维向量来执行聚类。段落嵌入,无论是使用上述两种方法还是简单求和来训练,都能够使文本文章(例如医学笔记[3])被聚类。
分布式人物再现:滨崎步 vs Lady Gaga
[4]研究使用维基百科文章训练段落向量:一个段落向量代表一篇维基文章。通过将单词向量与段落向量联合训练,作者表明找到“Lady Gaga”的日语对等词可以通过向量运算来实现:
paragraph vector(" Lady Gaga ")-word vector("美国")+WordVector("日本")
≈ ParagraphVector("滨崎步")
单词向量和段落向量的混合使用是强大的:它可以用一个单词解释两篇文章的区别,也可以用一篇文章解释两个单词的区别。例如,我们可以找到近似“唐纳德·特朗普”和“巴拉克·奥巴马”的段落向量之间的差异的单词向量。
令人兴奋,不是吗?还有,Stitch Fix 已经表明我们可以对图片进行这些操作。
图像检索的分布式表示
作者已经发布了一个很棒的帖子,所以请访问了解更多关于这个迷人作品的细节。总之,如果有人喜欢服装的孕妇版本,我们可以将孕妇添加到当前服装中,并检索类似风格的孕妇版本。
Source: Stitch Fix
结论
这篇文章回顾了主题周围单词的概念是如何定义主题的,在表示单词、段落、人物甚至图片时是有用的。可以对这些向量执行数学运算,以获得洞察力和/或检索信息。
我错过了其他有趣的应用吗?请在下面的评论中让我知道!
参考文献
- Mikolov T、Sutskever I、Chen K、Corrado GS、Dean J、miko lov T、Sutskever I、Chen K、Corrado、G. S .、Dean J。伯格·CJC、博图·L、韦林·M、格拉马尼·Z、温伯格·KQ,编辑。神经信息处理系统进展。柯伦联合公司;2013;3111–3119.PMID: 903 人
- 句子和文件的分布式表示。2014;PMID: 9377276
- 从医学笔记中学习有效的嵌入[互联网]。2017.
- 用段落向量嵌入文档。2015;
发表于2017 年 12 月 7 日
原载于 2017 年 12 月 7 日joshuakyh.wordpress.com。
使用 Horovod(和估计器)的分布式张量流
原文:https://towardsdatascience.com/distributed-tensorflow-using-horovod-6d572f8790c4?source=collection_archive---------6-----------------------
通过使用许多 GPU 来减少深度神经网络的训练时间
你可以在这里阅读这篇文章的更新版本:
[## 使用 Horovod 的分布式深度学习
使用 Horovod 在超级计算机上扩展深度学习
towardsdatascience.com](/distributed-deep-learning-with-horovod-2d1eea004cb2)
云中的分布式训练:云机器学习引擎
原文:https://towardsdatascience.com/distributed-training-in-the-cloud-cloud-machine-learning-engine-9e264ddde27f?source=collection_archive---------0-----------------------
在我关于在云中训练大模型的集的这个激动人心的结论中,我将向您展示如何为机器学习扩展您的计算能力,甚至召集一些 GPU!
我们的培训会有足够的资源吗?观看视频(或阅读下文)了解详情!
在上一集中,我们讨论了当数据集太大而不适合本地机器时会遇到的问题,我们还讨论了如何通过可扩展的存储将数据转移到云中。
机器学习中的并行训练
今天,我们继续这个问题的第二部分——将这些计算资源放在一起。当训练更大的模型时,当前的方法包括并行进行训练。我们的数据被分割并发送到许多工作机器,然后模型必须将从每台机器获得的信息和信号重新组合在一起,以创建完全训练的模型。
你爱配置吗?
如果你愿意,你可以启动一些虚拟机,安装必要的库,将它们联网,并配置它们运行分布式机器学习。当你完成后,你一定要把那些机器拿下来。**
虽然对于一些人来说,这表面上看起来很容易,但如果你不熟悉安装 GPU 驱动程序、不同版本的底层库之间的兼容性问题,这可能是一个挑战。
云机器学习引擎
幸运的是,我们将使用云机器学习引擎的训练功能,从 Python 代码到训练好的模型,不需要任何基础设施工作!该服务根据需要自动获取和配置资源,并在完成训练后关闭系统。
使用云 ML 引擎有 3 个主要步骤:
1)打包您的 Python 代码
2)创建一个描述您想要的机器类型的配置文件
3)将您的培训作业提交到云
让我们看看如何设置我们的培训来利用这项服务。
步骤 1:打包您的 Python 代码
我们已经将我们的 Python 代码从 Jupyter 笔记本中转移到一个独立的脚本中。让我们把那个文件叫做task.py
。这将作为我们的 Python 模块,然后可以从其他文件中调用它。
现在我们将task.py
包装在一个 Python 包中。Python 包的制作方法是将模块放在另一个文件夹中,姑且称之为“trainer
”,并将一个空文件__init__.py
放在task.py
旁边。
我们最终的文件结构由一个名为 trainer 的文件夹组成,包含两个文件:__init__.py
和task.py
。我们的包叫做 trainer ,我们的模块路径是 trainer.task 。如果您想将代码分解成更多的组件,您也可以将这些组件包含在这个文件夹中。例如,您可能在trainer
文件夹中有一个util.py
。
步骤 2:配置文件:config.yaml
一旦我们的代码被打包到一个 Python 包中,就该创建一个配置文件来指定您希望在什么机器上运行您的培训了。您可以选择在少量机器(少至一台)上运行培训,也可以在多台机器上运行,并附带 GPU。
Using a predefined scale tier is as simple as it gets
有几个预定义的规范使入门变得格外容易,一旦你不再需要这些规范,你就可以随心所欲地配置一个定制架构。
For a custom cluster, all you need to do is specify the machine types you want
现在,我们已经打包好 python 代码,并写出了配置文件。让我们进入你们期待已久的一步,训练!
步骤 3:提交您的培训工作
为了提交一个培训作业,我们将使用gcloud
命令行工具并运行gcloud ml-engine jobs submit training
。这个调用还有一个 REST API 等价物。
我们指定一个惟一的作业名、包路径和模块名、运行作业的区域以及存放培训输出的云存储目录。确保使用与存储数据相同的区域,以获得最佳性能。
gcloud ml-engine jobs submit training \ job-id $JOB_ID \ package-path=trainer \ module-path=trainer.task \ region=us-central-1 \ job_dir=gs://cloudml-demo/widendeep
一旦您运行这个命令,您的 python 包将被压缩并上传到我们刚刚指定的目录中。从那里,包将在云中运行,在我们在配置中指定的机器上运行。
看着训练进行!
您可以在云控制台中通过进入 ML 引擎并选择作业来监控您的培训作业。
在那里,我们将看到我们曾经运行过的所有作业的列表,包括当前作业。右边是一个计时器,显示了作业所用的时间,还有一个链接指向来自模型的日志信息。
Some models take a bit longer to train than others 😉
预测呢?
我们的代码将训练好的模型导出到我们在作业目录中提供的云存储路径,因此从这里我们可以轻松地将预测服务直接指向输出,并创建一个预测服务,正如我们在第 4 集中讨论的无服务器大规模预测。
后续步骤
使用云机器学习引擎,我们可以实现分布式训练,而不用自己处理基础设施。因此,我们可以花更多时间处理数据!只需打包代码,添加一个配置文件,然后提交培训作业。如果你想看更完整的例子,你可以查看云机器学习入门指南。
如果你想知道 TensorFlow 的分布式培训模式是如何工作的,请查看来自 TensorFlow 发展峰会的深度演讲:【https://youtu.be/la_M6bCV91M
感谢阅读本集云 AI 冒险。如果你喜欢这个系列,请为这篇文章鼓掌让我知道。如果你想要更多的机器学习动作,一定要关注 Medium 上的me或订阅 YouTube 频道以捕捉未来的剧集。更多剧集即将推出!
分布语义学——从字里行间解读
原文:https://towardsdatascience.com/distributional-semantics-reading-between-the-lines-8be7a3bbded9?source=collection_archive---------4-----------------------
人类的语言在不断进化,但是这些变化在发生的时候经常被忽视。然而,如果你拿一篇几十年或几个世纪前的文章或文学作品,你肯定会注意到所用语言的变化。如果语言是这样进化的,你怎么理解一个词的定义?
模式匹配和从句子中的周围词中破译一个词的意思是理解石刻的常用方法。具有分布式相似性模型的深度学习使得机器在自然语言处理(NLP)领域做同样的事情变得可行。
J.R.Firth 的名言很好地总结了这一概念,“你应该通过它所交往的人来了解一个词!”
“透明”、“打击”和“监督”是几个词的例子,根据它们的使用方式,可能意味着完全不同的事情。一般来说,语言中有丰富的自动反义词(也可以表示相反事物的单词)和多义词(也可以表示相似事物的单词)。没有人确切知道为什么我们出于不同的目的使用同一个单词,但是我们都同意这使语言变得有趣。
通过使用正确的词语,一个人可以更好地表达,并让他人感兴趣地倾听。几个世纪以来,单词能力在世界范围内已经被很好地理解,因此,仅仅拥有一个简单的词义词典并不能帮助 NLP 中的机器。
courtesy @data_monsters
孩子们很早就开始学习语言,而不是等到学校教语法。即使是成年人。寻求词汇发展,往往被规定要在一个句子中使用他们所学的单词,并记住这种用法,而不仅仅是记忆单词及其含义。twitter、短信和 Whatsapp 的日益流行正在将人类交流浓缩成短句、首字母缩略词和表情符号。因此,用法设置、谈话时间和其他视觉线索在理解单词的意思时都起着重要的作用。
在一头扎进所有的数学之前,斯坦福 NLP 与深度学习讲座视频很好地介绍了这个话题。“向量”这个词似乎很好地捕捉了深度学习的句法和语义关系,在它的帮助下,很快,你应该能够使用 NLP 或 TLP(技术或 twitter 语言处理)预测答案😊)
西雅图-HQ1+HQ2 =?
用 Python 理解 PCA(主成分分析)
原文:https://towardsdatascience.com/dive-into-pca-principal-component-analysis-with-python-43ded13ead21?source=collection_archive---------1-----------------------
陷入变量的海洋来分析你的数据?感觉迷失在决定选择哪些功能,使您的模型是安全的,从过度拟合?有什么方法可以降低特征空间的维数?
嗯,PCA 肯定能帮到你。
在这个冥想中,我们将对癌症数据集的主成分分析进行简单的解释,并看到特征空间降维到数据可视化的例子。
不再拖延,让我们开始导入癌症数据集。
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
有时候,了解你正在使用的数据会更好,我们可以使用DESCR
来了解数据集的基本描述。
print cancer.DESCR
由此你现在知道这个数据集有 30 个特征,如平滑度、半径等。病例数为 569 例,其中 212 例为恶性,其余为良性。目标变量列为 0 和 1,只是为了确保 0 代表恶性肿瘤,反之亦然,可以检查-
print len(cancer.data[cancer.target==1])>> 357
为了更多地了解特征如何影响目标,我们可以绘制恶性和良性类别的直方图。如果这两个直方图是基于特征分开的,那么我们可以说该特征对于辨别实例是重要的。
import numpy as np
import matplotlib.pyplot as plt
# from matplotlib.pyplot import matplotlibfig,axes =plt.subplots(10,3, figsize=(12, 9)) # 3 columns each containing 10 figures, total 30 featuresmalignant=cancer.data[cancer.target==0] # define malignant
benign=cancer.data[cancer.target==1] # define benignax=axes.ravel()# flat axes with numpy ravelfor i in range(30):
_,bins=np.histogram(cancer.data[:,i],bins=40)
ax[i].hist(malignant[:,i],bins=bins,color='r',alpha=.5)# red color for malignant class
ax[i].hist(benign[:,i],bins=bins,color='g',alpha=0.3)# alpha is for transparency in the overlapped region
ax[i].set_title(cancer.feature_names[i],fontsize=9)
ax[i].axes.get_xaxis().set_visible(False) # the x-axis co-ordinates are not so useful, as we just want to look how well separated the histograms are
ax[i].set_yticks(())ax[0].legend(['malignant','benign'],loc='best',fontsize=8)
plt.tight_layout()# let's make good plots
plt.show()
如下图所示
Histogram of malignant and benign classes based on the 30 features of cancer data-set
现在,从这些直方图中我们看到,像-平均分形维数这样的特征在区分恶性和良性方面所起的作用很小,但最差凹点或最差周长是有用的特征,可以给我们关于癌症数据集类别的强烈提示。直方图在我们的天体物理学研究中是必不可少的,因为它们经常被用来分离模型。我无法抗拒把它带到这里的诱惑。因此,如果您的数据只有一个特征,例如最差周长,则足以区分恶性和良性病例。
在对这些癌症数据集使用主成分分析之前,让我们简单地了解一下主成分分析实际上是做什么的。我们知道,在一个数据集中,一些特征很有可能是相关的。让我们看一些癌症数据集中的例子——
Scatter plots with few features of cancer data set
现在,希望您已经理解了哪个图显示了特征之间的强相关性。下面是我用来绘制这些图表的代码。
imoprt pandas as pd
cancer_df=pd.DataFrame(cancer.data,columns=cancer.feature_names)# just convert the scikit learn data-set to pandas data-frame.
plt.subplot(1,2,1)#fisrt plot
plt.scatter(cancer_df['worst symmetry'], cancer_df['worst texture'], s=cancer_df['worst area']*0.05, color='magenta', label='check', alpha=0.3)
plt.xlabel('Worst Symmetry',fontsize=12)
plt.ylabel('Worst Texture',fontsize=12)
plt.subplot(1,2,2)# 2nd plot
plt.scatter(cancer_df['mean radius'], cancer_df['mean concave points'], s=cancer_df['mean area']*0.05, color='purple', label='check', alpha=0.3)
plt.xlabel('Mean Radius',fontsize=12)
plt.ylabel('Mean Concave Points',fontsize=12)
plt.tight_layout()
plt.show()
PCA 本质上是一种以新变量相互正交(即它们是独立的或不相关的)的方式降低特征空间的维度的方法。我在这篇文章的末尾放了一些参考资料,这样感兴趣的人可以真正钻研 PCA 的数学。
无论如何,从癌症数据集我们看到它有 30 个特征,所以让我们将其减少到只有 3 个主要特征,然后我们可以可视化这些新的独立变量的散点图。
在应用 PCA 之前,我们对数据进行缩放,使得每个特征都有单位方差。这是必要的,因为拟合算法高度依赖于特征的缩放。这里我们使用StandardScaler
模块来单独缩放特征。StandardScaler
从每个特征中减去平均值,然后缩放到单位方差。
我们首先实例化模块,然后适应数据。
scaler=StandardScaler()#instantiate
scaler.fit(cancer.data) # compute the mean and standard which will be used in the next command
X_scaled=scaler.transform(cancer.data)# fit and transform can be applied together and I leave that for simple exercise
# we can check the minimum and maximum of the scaled features which we expect to be 0 and 1
print "after scaling minimum", X_scaled.min(axis=0)
现在,我们准备对这个缩放数据集应用 PCA。我们像以前一样从StandardScaler
开始,在那里我们实例化,然后拟合,最后转换缩放的数据。在应用主成分分析时,你可以提出你想保留多少个主成分。
pca=PCA(n_components=3) pca.fit(X_scaled) X_pca=pca.transform(X_scaled) #let's check the shape of X_pca arrayprint "shape of X_pca", X_pca.shape
现在我们已经看到数据只有 3 个特征。PCA 的缺点是几乎不可能说出初始特征(这里是 30 个特征)是如何组合形成主成分的。现在需要注意的重要一点是,我选择了 3 个组件,而不是 2 个,这可能会进一步降低数据集的维度。可以选择n_components=2
吗?[考虑一段时间,作为一个迷你练习。你能想出一些方法来测试这个吗?]
可以通过测量主成分的方差比来检查。
ex_variance=np.var(X_pca,axis=0)
ex_variance_ratio = ex_variance/np.sum(ex_variance)
print ex_variance_ratio
>> [0.60950217 0.2611802 0.12931763]
这里可以看到,前两个因素占总方差的 87%。所以只选择 2 个组件就足够了。好了,现在有了前两个组件,我们可以跳到 PCA 最重要的应用之一,即数据可视化。现在,由于 PCA 成分彼此正交且不相关,我们可以预期恶性和良性类别是不同的。让我们根据前两个主要成分来划分恶性和良性类别
Xax=X_pca[:,0]
Yax=X_pca[:,1]labels=cancer.targetcdict={0:'red',1:'green'}labl={0:'Malignant',1:'Benign'}marker={0:'*',1:'o'}alpha={0:.3, 1:.5}fig,ax=plt.subplots(figsize=(7,5))
fig.patch.set_facecolor('white')for l in np.unique(labels):
ix=np.where(labels==l)
ax.scatter(Xax[ix],Yax[ix],c=cdict[l],s=40,
label=labl[l],marker=marker[l],alpha=alpha[l])# for loop endsplt.xlabel("First Principal Component",fontsize=14)
plt.ylabel("Second Principal Component",fontsize=14)
plt.legend()
plt.show()# please check the scatter plot of the remaining component and you will understand the difference
使用上面的代码,绘图如下所示
Plot of breast cancer classes based on the first 2 principal components of the cancer features.
看起来很棒,不是吗?这两个类别被很好地分开,前两个主成分作为新特征。尽管看起来很好,但即使是线性分类器也能很好地从测试集中识别出一个类。在另一篇文章中,我已经讨论了如何应用由 PCA 和支持向量分类器组成的流水线,并为相同的数据集绘制决策函数。一个重要的特征是恶性类别与良性类别相比是如何分布的,并回顾那些直方图。你能找到一些相似之处吗?
这些主成分仅根据特征计算,不考虑来自类别的信息。因此,主成分分析是一种无监督的方法,很难解释这两个轴,因为它们是原始特征的复杂混合物。我们可以做一个热图,看看这些特性是如何混合在一起形成组件的。
plt.matshow(pca.components_,cmap='viridis')
plt.yticks([0,1,2],['1st Comp','2nd Comp','3rd Comp'],fontsize=10)
plt.colorbar()
plt.xticks(range(len(cancer.feature_names)),cancer.feature_names,rotation=65,ha='left')
plt.tight_layout()
plt.show()#
3 PCs and dependencies on original features
实际上很难从该图中理解原始特征的相关性,但是我们总是可以使用seaborn
热图来绘制特征的相关性。但是,检查之前的相关图,看看第一主成分是如何受到平均凹点和最差纹理的影响的。您能说出哪个特性对第一台电脑的贡献更大吗?
这里我展示了这些特性的“最差”值的相关图。
feature_worst=list(cancer_df.columns[20:31]) # select the 'worst' featuresimport seaborn as snss=sns.heatmap(cancer_df[feature_worst].corr(),cmap='coolwarm')
s.set_yticklabels(s.get_yticklabels(),rotation=30,fontsize=7)
s.set_xticklabels(s.get_xticklabels(),rotation=30,fontsize=7)
plt.show()
Correlation plot of the ‘worst’ features of cancer data-set
所以,为了结束这次冥想,让我们总结一下我们所做的和所学的
- 为什么是 PCA 而不仅仅是特征分析?(回答提示:大数据集,多特征,让我们降低特征空间的维度)
- 我们从癌症数据集开始我们的例子,发现 30 个特征有 2 类。
- 为了对该数据集应用 PCA,首先我们缩放所有特征,然后对缩放后的特征应用 PCA 的
fit_transform
方法(具有 3 个主成分)。 - 我们表明,在这 3 个主成分中,有 2 个成分贡献了总方差的 87%。
- 基于这两个主要成分,我们将数据可视化,并看到“恶性”和“良性”类别之间非常清晰的区分。
希望这将有助于你掌握一些概念,并指导你有效地应用主成分分析你的数据集。作为练习,您可以立即尝试波士顿房屋数据(13 个特征)并查看结果。再次仔细阅读并记住关于最初相关特征到最终独立主成分的基本概念。
这篇文章受穆勒的书的影响,是我尝试用 CALET 探测器测量的宇宙射线来分离两种天体物理场景(脉冲星和暗物质)的垫脚石。你可以在我的 github 简介中找到所有细节。如果你对参数和详细描述感兴趣,请告诉我。使用 Akaike 标准对我们的工作进行的单独分析被选发表在国际现代物理学杂志 D 上。
关注即将到来的帖子,保持坚强,快乐!
如果你对更深入的基础机器学习概念感兴趣,可以考虑加盟 Medium 使用 我的链接 。你不用额外付钱,但我会得到一点佣金。感谢大家!!
进一步阅读的参考资料:
- 对 PCA 工作方式的深入分析:PCA 一站式商店
- 机器学习在行动;彼得·哈灵顿:曼宁出版公司,第 270-278 页。
- PCA 和图像重建
潜入无人驾驶汽车的世界
原文:https://towardsdatascience.com/diving-into-the-world-of-self-driving-cars-5355474ae630?source=collection_archive---------4-----------------------
一年前,我辞去了四大会计师事务所之一的工作,搬到了湾区,开始向我真正想进入的行业转移:技术。在我工作的最后几个月,我列出了所有我想涉足的潜在技术领域,排在首位的是自动驾驶汽车。当然,当时只有会计背景,这似乎是一个遥远的目标。
搬到旧金山湾区后,我仍然坚持做会计工作,但我特意选择了一家更注重工作与生活平衡的公司,因为我知道学习编程每周会占用大量时间。但是从哪里开始呢?起初,我还不知道自动驾驶汽车肯定会是我此后不久的目标,实际上我通过 Code Academy 开始了一些基本的网页设计(想想 HTML 和 CSS)。然后,我拿起了一本关于 Ruby 的书,这本书让我更热衷于编写真正的程序。
寻找 Udacity
正是在 2016 年年中的这个时候,我开始阅读越来越多关于自动驾驶汽车的文章,同时继续相信这对我来说是多年以后的事情。我看到 Python 编程语言在该领域非常受欢迎,并且很快阅读到 Udacity 有一个很棒的学习 Python 的编程课程(“计算机科学入门”给那些感兴趣的人——如果你想学习 Python 基础,我强烈推荐它;您将创建一个像谷歌一样的基本搜索引擎!).当我接近这门课程的尾声时,Udacity 宣布了我能想到的最令人兴奋的事情之一:无人驾驶汽车纳米学位项目。
对于那些从未听说过 Udacity 纳米学位项目的人来说,他们会教你特定领域工作所需的技能,以及有助于增强你的投资组合的项目——例如,许多招聘人员会将个人的 Github 知识库视为其能力的证据。这些纳米学位项目包括数据分析、机器学习、iOS 和 Android 开发等领域。该计划还包括各种职业研讨会,以帮助改善你的简历,面试技巧等。
机器学习
尽管我很兴奋有一个纳米学位项目完全专注于让某人做好成为自动驾驶工程师的准备,但我肯定还没有准备好。幸运的是,Udacity 对一些对该项目很重要的课程和纳米学位相当开放,该项目在 2016 年 10 月宣布后几个月就有了第一批学生。其中之一是机器学习纳米学位。虽然当我第一次开始的时候,我可能有点不知所措,但那个项目确实帮助了我最终获得了 SDC 纳米学位的第一个学期,因为它主要专注于各种机器学习技术。
如果你对这个领域感兴趣,机器学习纳米学位有一些很棒的项目。我使用监督学习来预测这样的事情,比如某个人是否会在泰坦尼克号上幸存下来,或者在学校需要 T2 的额外帮助,无监督学习来将不同的客户群分成不同的组,强化学习来教会智能出租车安全有效地到达目的地。有大量的资源可以更好地解释这些技术,而我在这里没有足够的空间。MLND 以一个顶点项目结束,专注于对深度学习等领域的深入研究——我仍在与 SDCND 合作完成我的项目,但如果你想预览,请参见我的提案或我的正在进行的顶点知识库。我正在采用基于深度学习的方法来检测道路车道。
自动驾驶汽车纳米度
与机器学习纳米学位不同,Udacity 决定限制自动驾驶汽车纳米学位的入学人数。2016 年 10 月的第一批学生将只接受大约 500 名学生(我认为这实际上比最初的人数有所增加)。成千上万的人申请了,包括我,尽管我仍然只是通过 MLND 的几个项目。我被录取了(!)—但不是到十月。从 12 月开始,我将加入第三批。这实际上非常完美,因为我只完成了 MLND 的最后一个预顶点项目,就在 12 月份的队列即将开始的时候。我非常兴奋,同时也担心我会被弄得不知所措。我不仅真正接触到了一些高级材料,而且我的会计旺季即将到来(在会计行业,一月到四月并不是很有趣)。
Project 1
所以,我一头扎了进去,希望能赶在 Udacity 为我的团队安排的时间之前。在第一个项目中,我们学习了如何使用各种计算机视觉技术,包括 canny 边缘检测、掩蔽和 Hough 变换,以便检测道路上的车道线。虽然我的项目在直线道路上看起来很棒,但我使用的方法太简单了,无法在曲线上工作,这是我很快就会学会纠正的。
Project 2’s unbalanced traffic sign data
下一个项目,分类交通标志,是我第一次真正接触到建立深度学习模型。在这里,我学会了如何使用 TensorFlow 创建一个深度神经网络,经过训练后能够对路标进行高度准确的分类。这个项目的一个有趣的挑战是,给我们的数据非常不平衡,这意味着某些标志有数千幅训练图像,而其他标志只有几百幅。这给神经网络带来了一个问题——鉴于它们试图将损失最小化,不平衡的训练集可能意味着神经网络通过简单地总是弄错某些符号来学习将损失最小化。因此,如果您不检查您的数据,您可以看到您的模型实现了 90%的验证准确性(从表面上看相当稳健),同时它仍然可能得到一些信号,即每个信号只占训练图像的百分之几,100%错误。使用来自原始训练数据的增强图像,但只针对那些低于每个交通标志平均图像数量的图像,我创建了补充的交通标志图像来帮助平衡影响,并最终获得了一个在它从未见过的图像上更加准确的模型。
Smooth sailing in Project 3
第一学期的第三个项目增加了酷的因素,特别是因为 Udacity 专门为它设计了一个模拟器。这个项目使用 Keras 深度学习框架(建立在 TensorFlow 之上),以行为克隆的概念为中心。通过行为克隆,再次使用深度学习,你可以向深度神经网络教授某种行为。在这种情况下,这意味着神经网络从模拟汽车的摄像头获得图像(类似于上图),并带有标签(即神经网络最大限度地减少损失,因此将预测汽车转向角度的图像)。虽然 Udacity 最终发布了一些他们自己的训练数据,但我选择了收集自己的数据,这产生了一些有趣的问题。在赛道上,当你直线行驶时,大部分时间转向角是零度。根据我在上面提到的项目 2,你可能已经猜到了,这会产生不平衡数据的问题。因此,我必须小心地收集足够的数据,转向角不为零,否则汽车可能总是直线行驶。另一个问题是,数据不能只从车道中心收集——否则,当汽车不可避免地发现自己稍微偏向一侧时,它可能会默认回到最有可能的结果——直行。再次,我必须确保我有足够的恢复数据,包括从奇怪的地方几乎偏离路边的非常尖锐的转弯角度。也许整个第一学期最有收获的经历是看着我的模拟汽车,根据我训练过的神经网络驾驶,独自在整条赛道上行驶。
幸运的是,我已经在第一学期的第一个月左右完成了前三个项目——我已经实现了在旺季到来之前提前完成的目标!我在学期的最后两个月完成了最后两个项目。
Project 4 — Advanced Lane Detection
还记得项目一中曲线的问题吗?项目四,高级车道线,展示了更深入的技术。再次使用计算机视觉,这次学会了如何使用不同的梯度和颜色阈值来创建二进制激活图像,其中只有道路视频图像的特定区域会被激活。然后使用技术使图像不失真(所有相机都会自然产生一定量的失真),然后对其进行透视变换(想象一下道路的鸟瞰图,然后我的模型会计算一个多项式函数来拟合这条线。给定这些多项式函数,检测到的车道以及某些信息,如道路曲率和车辆相对于车道中心的位置,可以放回到原始图像上,如上所示。看到我的最终项目视频与车道检测这里。
Car detection heatmaps for Project 5
第一学期的期末项目集中在车辆检测。我从机器学习 Nanodegree 项目中学到的知识在这里派上了用场,因为我们使用了支持向量机的算法来帮助确定汽车出现在图像的哪个位置。我之前已经用过 SVM 很多次了!当然,还有一些重要的概念需要学习。定向梯度直方图(简称为 HOGs)通过显示有汽车的图像与无汽车的图像之间的梯度差异(即,图像中像素值的变化,以进行某种程度的简化)来帮助训练 SVM。接下来,训练过的 SVM 在给定的道路图像上运行——但是他们不是 100%准确。因此,我需要消除误报,同时还要考虑到汽车可能出现的距离所导致的潜在失误。上面的热图显示了解决方案的一部分——通过移除检测次数少于一定数量的检测点,生成了上面的热图,然后用边界框标记,以显示检测到的真实车辆。看我的成品这里。
下一步是什么?
因此,我完成了自动驾驶汽车纳米学位项目的第一学期,学习了一年前我做梦都想不到的技能。如果有人真的对这个领域感兴趣,我强烈鼓励他们申请(群体规模一直在持续增加)。这确实要花很多时间——考虑到我的日常工作,我仍然很惊讶我能在学期正式结束前完成它。大多数人可能每周需要 20 个小时来做这件事。这当然比大学教育便宜,尽管每学期仍要花费你 800 美元(一共有三个学期)。
但是我该何去何从呢?我的第一个目标是在这个领域找到一份工作。在这个快速扩张的领域有很多工作机会,既有老牌汽车制造商,也有大型科技公司,还有在湾区如此普遍的初创公司。当然,其中大多数仍然需要在机器人或深度学习等各个领域的多年经验。因此,虽然我仍然缺乏许多公司想要的经验,但我会继续努力,希望做出一个能让别人刮目相看的模型。这里是我在基于深度学习的车道检测模型上的预览,它可以跳过我在上面学到的大多数基于计算机视觉的技术;我希望这是个开始。幸运的是,在硅谷,许多人更关注你能做什么,而不仅仅是你做了多少年。对 Udacity 来说,他们为我提供了一位导师和大量的职业内容,以及与一些优秀的招聘合作伙伴一起参加活动的机会,这也给了我很大的希望,我将能够直接在自动驾驶汽车上工作。
不过现在,我进入了 SDCND 的第二阶段。学期 1 是计算机视觉和深度学习,学期 2 是关于传感器融合(使用雷达和激光雷达数据来跟踪你周围的物体)、定位和控制。鉴于我在这些领域都缺乏经验,我预计这将是一个艰难的任期,但我也很高兴能在这条路上向前迈进一步。在一天结束时,虽然我的第一个目标是找到一份工作,但真正的最终目标是真正看到一辆自动驾驶汽车在路上行驶,完全可供所有想骑的人使用。这才是真正的下一步。
DIY AI:一个老学校矩阵 NN
原文:https://towardsdatascience.com/diy-ai-an-old-school-matrix-nn-401a00021a55?source=collection_archive---------1-----------------------
NN 如何运作,如何像多年前一样创建和训练 NN。部分 DIY AI 系列。
先决条件和代码
你需要 Python 和 Python IDE。如果你需要安装,请查阅 DIY AI 安装手册(这个故事你需要 Python 和控制台部件)。
你可以从 Github 这里下载完整的源代码。
此处可访问 draw.io 图。
那么,神经网络究竟是如何工作的呢?
正如我在上一篇文章中提到的,自 50 年代初以来,我们就试图模仿人脑及其最小的部分——神经元——本身。
最接近神经元的是一个感知器——它由多个输入、求和引擎、单个输出和一个激活函数组成。像这样:
Fig. 1. A perceptron
这东西是怎么工作的?它接受大量输入(输入实际上是一个数字,如 0.33,-13.7 等等),将它们乘以它们的权重(图中的 w1…wn)并求和。总和然后被馈送到激活函数,并传递到输出。
为什么我们需要一个激活函数?大多数情况下,我们需要介于 0…1 之间的输出值,如“是”或“否”。很难调整权重,使其对任何带有 1 和 0 的输入做出响应,但是,幸运的是,我们有一个逻辑函数,可以将任何数值映射到 0 和 1 之间的值(向该函数输入非常大的负数,如-10000,将返回接近于 0 的值,输入非常大的正数,将导致接近于 1 的值,如 0.99……)。
当然,我们可以将感知器连接成层,并形成网络,就像这样:
Fig. 2. Simple, feed-forward, fully connected neural network
输入被馈送到第一层上每个感知器的每个输入,然后第一层的输出被馈送到下一层的所有输入,对所有后续层重复相同的过程。最后一层的输出实际上是神经网络的输出。这种网络被称为前馈网络,因为数据只向前流动,没有反馈回路,而且这种网络是完全连接的,因为每个神经元接收来自前一层的所有神经元的输出。
为了保持广泛使用的术语,输入和输出层之间的层称为隐藏层。
如果输入是特征向量(比如:它有翅膀吗?它生活在水里吗?它有毛吗?它吃肉吗?)并且输出是向量,表示例如“它”的可能类别(像:动物-0.87,鱼-0.12),这种类型的网络可以用于动物园居民的分类。
那么,你可能会问,神奇的是什么?重量是。NN 的实际圣杯是调整和计算权重的方法,称为训练一个神经网络。我将在本文中介绍一种最简单的方法——反向传播。
我们如何编码神经网络?
每个开发人员都把神经网络想象成一组神经元,可以这样编码:
class Neuron
array Neuron weights[]
float output
function compute_output()
…等等,但这是过度工程化,因为我们可以用一个简单的东西来抽象整个层:矩阵。
在上面的例子中,第一层有 4 个输入,产生 3 个输出。输入是 4 个数字。
如果我们将输入表示为 1x4 矩阵,第一层为包含所有第一层权重的 4x3 矩阵,我们可以通过将输入矩阵(1x4)乘以第一层矩阵(4x3)得到第一层,从而创建 1x3 矩阵。这个矩阵乘以 3x6 层二矩阵,再乘以 6x2 层三矩阵,得到 1x2 结果矩阵。当然,在将结果矩阵传递给下一层之前,我们必须对结果矩阵的每个成员应用一个激活函数。
从视觉上讲,NN 来自图 2。是这样处理的:
Fig. 3. Example NN from Fig. 2 represented as matrixes, sigma represents activation function
因此,基本上,在神经网络中,整个层被抽象为矩阵,并且模拟神经网络最常用的函数是矩阵乘法。这实际上解释了为什么神经网络系统很容易被 GPU 加速——3D 可视化也大量基于矩阵代数!
我们如何训练他们?
在多层神经网络中,我们基本上只有输入和输出矩阵。然而,我们可以计算预期结果和实际结果之间的差异,但是我们如何调整具有不同神经元数量的许多层上的权重呢?
这个想法很简单,我们可以回到输入层,逐层比较层输入和层误差。每一层,不管有多深,都会造成下一层的误差;因此,我们可以通过将前一层输出乘以输出误差再乘以当前层输出得到的值来调整权重。这被称为反向传播,正式化时听起来非常糟糕和复杂,但是实现起来非常简单。
所以,让我们举一些经典的例子,比如手写数字识别。
首先,数据集
请看,我们的第一个数据集,著名的 Semeion 数据集:http://archive . ics . UCI . edu/ml/datasets/Semeion+手写+数字
数据集文件包含 1593 位数字,手写,扫描,适合 256 像素(16x16 像素见方)的黑白盒子。
像素(一行 256 个)放在数据集文件的单独行中,并附加 10 位表示实际结果(例如,0 0 0 1 0 0 0 0 0 0
表示 3)。
我们可以举一个数据集行的例子,看起来像这样:
0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 1.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1 0 0 0 0 0 0 0 0 0
如果我们删除数字的.0000
部分,并删除多余的空格,示例将如下所示:
000111111111100001111100000111000111000000001110111000000000011111000000000000111101110000000011011100000000001111100000000000111100000000000110110000000000111011000000000111001100000000111000110000011111000001111111100000000111111100000000000111000000000 1 0 0 0 0 0 0 0 0 0
如果我们将它分成 16 个字符行,我们将得到实际绘制的零:
0001111111111000
0111110000011100
0111000000001110
1110000000000111
1100000000000011
1101110000000011
0111000000000011
1110000000000011
1100000000000110
1100000000001110
1100000000011100
1100000000111000
1100000111110000
0111111110000000
0111111100000000
00011100000000001 0 0 0 0 0 0 0 0 0
理解数据集对于成功的训练至关重要。干净而精确的数据集是你的模型中最重要的部分。
好了,理论的时间结束了,我们来编点代码吧。首先,我们需要将数据集加载到 python 代码中。我会用优秀的 numpy 库进行矩阵处理。为了存储数据,我们需要定义两个 numpy 数组(samples 和 results ),并逐行读取数据集,将每行的前 256 个数字添加到 samples 数组中,将后 10 个数字添加到 results 数组中:
Em. 1. Reading Semeion dataset with Python / numpy
很棒,是吧?现在,让我们建立一个神经网络,并确保我们可以通过它运行样本!
然后,向前传球
对于这个例子,我将使用两层神经网络,其中第一层是 256x256 矩阵,第二层是 256x10。整体架构看起来是这样的(注意当数据流经神经网络时矩阵的形状是如何变化的):
图层将由 numpy 数组表示,并预先填充相对较小的随机值(范围从-0.01 到 0.01):
上面的代码实际上展示了你如何使用训练过的神经网络。由于灭的小网还没有准备好,second_output
将包含完全随机的数据。让我们修复它,训练网络!
第三,反向传播(或训练)
训练一个神经网络是一个迭代过程——我们取数据集的某一部分(我将从 100 个随机记录开始),通过神经网络传递数据集的所有样本,计算误差并反向传播误差。训练数据集的一遍被称为一个时期。
训练 NN,直到它很好或者被卡住——这意味着我们需要限制一些时期(以防止无限训练),并定义一些标准来定义 NN“足够好”。
我将使用样本误差的绝对值之和作为样本误差,使用历元的最大误差作为历元误差。当历元误差小于 0.1 时,我会认为 NN 已经完成(例如,当正确答案为0 0 1 0
时,-1 0 1 0.5
的误差为 1.5)。
同样,让我们记住我们的 NN 将如何被处理:
支持主训练循环的代码如下所示:
如你所见,我还定义了一个速率,它代表 NN 对变化的反应有多快;在大多数情况下,网络越大,它应该越小——这使得训练更慢但更精确。
获得输出矩阵后,我们需要计算输出误差(并将该值与当前历元误差相加):
正如您所记得的,所有的输出都是通过sigmoid
函数处理的,我们需要反向传递数据。因此,我们创建了一个dsigmoid
函数,它是一个sigmoid
的导数:
目前,我们有 1x10 的误差矩阵,还有 256x10 的矩阵需要调整。因此,我们必须通过将第二层误差乘以经 dsigmoid 处理的第二层输出,找出第二层上的每个重量对误差的影响程度:
现在我们需要创建一个 256x10 的矩阵来调整第二层的权重。为此,我们采用先前的(第一层)输出(1x256),将其转置为 256x1,并将其乘以新找到的第二层增量。将得到的 256×10 矩阵(乘以速率)加到第二层权重将得到新的权重,有望产生更好的结果:
我们可以对第一层重复同样的过程,但是什么是第一层错误呢?这其实很容易找到——我们通过转置的第二层矩阵传递第二层增量;抽象地说,我们发现每个第一层输出值对第二层误差有多大影响。找到误差矩阵后,我们可以重复上述相同的过程来调整第一层的权重:
我们还需要一些控制,所以在每个时期结束时,让我们计算误差并打印结果:
请下载并在进入下一章之前研究实际代码!
最后,测试
好,让我们运行模型(同样,您可以从 Github 下载完整的模型)。为了方便起见,我添加了一段简单的代码,它随机抽取 12 个样本,并根据这些样本测试神经网络:
所以…让我们针对数据集的一小部分(100 条记录)运行网络:
成功!经过 40 个时期后,神经网络收敛,并且能够从样本中正确地检测数字!
好的,让我们测试一下完整的数据集(大约 1500 个样本)。运行它(如果你从 Github 下载了代码,它已经包含了完整的数据集),aaaaand 和…
而 NN 会很惨的无限挂,误差值在~1 左右。
发生了什么事?这是过度拟合的常见情况——我们一次又一次地在同一个数据集周围拖动神经网络,神经网络变得很好,但还不够好——不足以最小化误差。它也是不变的——无论我们在同一个数据集上循环多少次,误差都不会减少。
过度拟合的模型仍然可用,例如,您可以将历元计数限制为 50,并获得可接受的结果:
…但这个例子说明了第一个故事中提到的第一个人工智能冬天的许多原因之一——例如,令人震惊的发现,你不能只给 NN 提供 10 倍多的数据,并期望它变得更精确 10 倍。你需要适应、改变你的网络结构、训练模式,并进行大量的全面实验,以使这项技术变得可用。实际的方法将在以后的文章中介绍)。
这很简单。为什么我们不能用它来造一个人工智能呢?
因为事情没那么简单。你可以从大量的数据中看出神经网络的行为是如何变化的,它还取决于训练方法、时期数和网络结构。
在 DIY AI 系列的未来故事中,我将讲述更多关于架构、方法和——最重要的——框架——的故事,它们极大地减少了您必须编写的代码量,并允许您专注于实际的数据和架构,而不是矩阵。
敬请期待!
感谢 特拉斯克 提供初始想法 UCI 机器学习知识库 提供数据集。
DIY 深度学习项目
原文:https://towardsdatascience.com/diy-deep-learning-projects-c2e0fac3274f?source=collection_archive---------0-----------------------
受阿克谢·巴哈杜尔伟大作品的启发,在这篇文章中,你将看到一些应用计算机视觉和深度学习的项目,以及实现和细节,这样你就可以在你的计算机上重现它们。
LinkedIn 数据科学社区
阿克谢·巴哈杜尔是 LinkedIn 数据科学社区给出的一个很好的例子。在 Quora、StackOverflow、Youtube、here 以及许多论坛和平台上,有很多优秀的人在科学、哲学、数学、语言,当然还有数据科学及其同伴的许多领域互相帮助。
Akshay Bahadur.
但我认为在过去的 3 年里,LinkedIn 社区在分享数据科学领域的伟大内容方面表现出色,从分享经验到关于如何在现实世界中进行机器学习或深度学习的详细帖子。我总是向进入这个领域的人推荐成为一个社区的一部分,LinkedIn 是最好的,你会发现我一直在那里:)。
从深度学习和计算机视觉开始
https://github.com/facebookresearch/Detectron
深度学习领域的研究对图像中的事物进行分类,检测它们并在它们“看到”某些东西时采取行动,这十年来一直非常重要,取得了惊人的成果,例如在一些问题上超越了人类水平的表现。
在这篇文章中,我将向你展示阿克谢·巴哈杜尔在计算机视觉(CV)和深度学习(DL)领域所做的每一篇文章。如果您不熟悉这些术语,您可以在此处了解更多信息:
[## 深度学习的“怪异”介绍
有关于深度学习的惊人介绍、课程和博文。但这是一种不同的介绍。
towardsdatascience.com](/a-weird-introduction-to-deep-learning-7828803693b0) [## 两个月探索深度学习和计算机视觉
我决定熟悉计算机视觉和机器学习技术。作为一名 web 开发人员,我发现…
towardsdatascience.com](/two-months-exploring-deep-learning-and-computer-vision-3dcc84b2457f) [## 从神经科学到计算机视觉
人类和计算机视觉 50 年回顾
towardsdatascience.com](/from-neuroscience-to-computer-vision-e86a4dea3574) [## 吴恩达的计算机视觉——11 个教训
我最近在 Coursera 上完成了吴恩达的计算机视觉课程。Ng 很好地解释了许多…
towardsdatascience.com](/computer-vision-by-andrew-ng-11-lessons-learned-7d05c18a6999)
1.使用 OpenCV 的手部运动
[## akshaybahadur 21/hand movement tracking
在 GitHub 上创建一个帐户,为 HandMovementTracking 开发做出贡献。
github.com](https://github.com/akshaybahadur21/HandMovementTracking)
来自阿克谢:
为了执行视频跟踪,算法分析连续的视频帧并输出帧之间的目标运动。算法多种多样,各有优缺点。在选择使用哪种算法时,考虑预期用途很重要。视觉跟踪系统有两个主要组成部分:目标表示和定位,以及过滤和数据关联。
视频跟踪是使用摄像机在一段时间内定位一个移动对象(或多个对象)的过程。它有多种用途,其中一些是:人机交互、安全和监控、视频通信和压缩、增强现实、交通控制、医学成像和视频编辑。
这是复制它所需的所有代码:
import numpy as np
import cv2
import argparse
from collections import deque
cap=cv2.VideoCapture(0)
pts = deque(maxlen=64)
Lower_green = np.array([110,50,50])
Upper_green = np.array([130,255,255])
while True:
ret, img=cap.read()
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
kernel=np.ones((5,5),np.uint8)
mask=cv2.inRange(hsv,Lower_green,Upper_green)
mask = cv2.erode(mask, kernel, iterations=2)
mask=cv2.morphologyEx(mask,cv2.MORPH_OPEN,kernel)
#mask=cv2.morphologyEx(mask,cv2.MORPH_CLOSE,kernel)
mask = cv2.dilate(mask, kernel, iterations=1)
res=cv2.bitwise_and(img,img,mask=mask)
cnts,heir=cv2.findContours(mask.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2:]
center = None
if len(cnts) > 0:
c = max(cnts, key=cv2.contourArea)
((x, y), radius) = cv2.minEnclosingCircle(c)
M = cv2.moments(c)
center = (int(M["m10"] / M["m00"]), int(M["m01"] / M["m00"]))
if radius > 5:
cv2.circle(img, (int(x), int(y)), int(radius),(0, 255, 255), 2)
cv2.circle(img, center, 5, (0, 0, 255), -1)
pts.appendleft(center)
for i in xrange (1,len(pts)):
if pts[i-1]is None or pts[i] is None:
continue
thick = int(np.sqrt(len(pts) / float(i + 1)) * 2.5)
cv2.line(img, pts[i-1],pts[i],(0,0,225),thick)
cv2.imshow("Frame", img)
cv2.imshow("mask",mask)
cv2.imshow("res",res)
k=cv2.waitKey(30) & 0xFF
if k==32:
break
# cleanup the camera and close any open windows
cap.release()
cv2.destroyAllWindows()
是的,54 行代码。很简单吧?你需要在你的电脑上安装 OpenCV,如果你有 Mac 来检查这个:
[## 在 MacOS 上安装 OpenCV 3
在本帖中,我们将提供在 MacOS 和 OSX 上安装 OpenCV 3.3.0 (C++和 Python)的逐步说明…
www.learnopencv.com](https://www.learnopencv.com/install-opencv3-on-macos/)
如果你有 Ubuntu:
[## OpenCV:在 Ubuntu 中安装 OpenCV-Python
现在我们有了所有需要的依赖项,让我们安装 OpenCV。安装必须使用 CMake 进行配置。它…
docs.opencv.org](https://docs.opencv.org/3.4.1/d2/de6/tutorial_py_setup_in_ubuntu.html)
如果你有窗户:
[## 在 Windows - OpenCV 3.0.0-dev 文档中安装 OpenCV-Python
在本教程中,我们将学习在您的 Windows 系统中设置 OpenCV-Python。以下步骤是在 Windows 7-64 中测试的…
docs.opencv.org](https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_setup/py_setup_in_windows/py_setup_in_windows.html)
2.睡意检测 OpenCV
[## akshaybahadur 21/睡意检测
在 GitHub 上创建一个帐户,为睡意检测的发展做出贡献。
github.com](https://github.com/akshaybahadur21/Drowsiness_Detection)
这可以被倾向于长时间驾驶可能导致事故的骑手使用。这个代码可以检测你的眼睛,并在用户昏昏欲睡时发出警报。
属国
- cv2
- 免疫系统
- dlib
- scipy
算法
每只眼睛由 6 个(x,y)坐标表示,从眼睛的左上角开始(就好像你正看着这个人一样),然后围绕眼睛顺时针旋转:。
情况
它检查 20 个连续帧,如果眼睛纵横比小于 0.25,则生成警报。
关系
总结
3.使用 Softmax 回归的数字识别
[## akshaybahadur 21/数字识别器
用于识别数字的数字识别器机器学习分类器。
github.com](https://github.com/akshaybahadur21/Digit-Recognizer)
此代码帮助您使用 softmax 回归对不同的数字进行分类。您可以安装 Conda for python,它可以解决机器学习的所有依赖性。
描述
Softmax Regression(同义词:多项式逻辑回归、最大熵分类器或多类逻辑回归)是逻辑回归的推广,可用于多类分类(假设类是互斥的)。相比之下,我们在二元分类任务中使用(标准)逻辑回归模型。
Python 实现
使用的数据集是 MNIST,图像大小为 28 X 28,这里的计划是使用逻辑回归、浅层网络和深层神经网络对 0 到 9 的数字进行分类。
这里最好的部分之一是他使用 Numpy 编码了三个模型,包括优化、前向和后向传播以及所有的东西。
对于逻辑回归:
对于浅层神经网络:
最后是深度神经网络:
通过网络摄像头执行写作
要运行代码,请键入python Dig-Rec.py
python Dig-Rec.py
通过网络摄像头显示图像的执行
要运行代码,请键入python Digit-Recognizer.py
python Digit-Recognizer.py
Devanagiri 识别
[## akshaybahadur 21/Devanagiri-识别器
使用 convnet 的 Devanagiri-Recognizer -印地语字母分类器
github.com](https://github.com/akshaybahadur21/Devanagiri-Recognizer)
这个代码帮助你使用 Convnets 对不同的印地语字母进行分类。您可以安装 Conda for python,它可以解决机器学习的所有依赖性。
使用的技术
我用过卷积神经网络。我使用 Tensorflow 作为框架,使用 Keras API 提供高级别的抽象。
体系结构
conv 2d→max pool→conv 2d→max pool→FC→soft max→分类
其他几点
- 你可以去额外的 conv 层。
- 添加正则化以防止过度拟合。
- 您可以向训练集中添加额外的图像以提高准确性。
Python 实现
数据集- DHCD (Devnagari 字符数据集),图像大小为 32 X 32,使用卷积网络。
要运行代码,键入python Dev-Rec.py
python Dev-Rec.py
4.使用 FaceNet 进行面部识别
[## akshaybahadur 21/使用 Facenet 进行面部识别
使用 Facenet 实现面部识别。
github.com](https://github.com/akshaybahadur21/Facial-Recognition-using-Facenet)
这个代码有助于使用 face nets(【https://arxiv.org/pdf/1503.03832.pdf】T4)进行面部识别。面网的概念最初是在一篇研究论文中提出的。主要概念谈到三重损失函数来比较不同人的图像。这个概念使用了已取自源码的 inception network 和取自 deeplearning.ai 的 fr_utils.py 作为参考。为了提供稳定性和更好的检测,我自己增加了几个功能。
代码要求
您可以安装 Conda for python,它可以解决机器学习的所有依赖性,您将需要:
numpy
matplotlib
cv2
keras
dlib
h5py
scipy
描述
面部识别系统是一种能够从来自视频源的数字图像或视频帧中识别或验证人的技术。面部识别系统有多种工作方法,但一般来说,它们通过将从给定图像中选择的面部特征与数据库中的面部进行比较来工作。
添加的功能
- 只有当你睁开眼睛的时候才能识别人脸。(安全措施)。
- 使用 dlib 的 face align 功能在直播时进行有效预测。
Python 实现
- 使用的网络-初始网络
- 原创论文 Google 的 Facenet
程序
- 如果你想训练网络,运行
Train-inception.py
,但是你不需要这样做,因为我已经训练了模型,并保存为face-rec_Google.h5
文件,在运行时加载。 - 现在,您需要在数据库中有图像。代码检查
/images
文件夹。你可以把你的照片粘贴在那里,也可以用网络摄像头点击它。要做到这一点,运行create-face.py
图像被存储在/incept
文件夹中。您必须手动将它们粘贴到/images folder
中 - 运行
rec-feat.py
来运行应用程序。
5.表情符号
[## akshaybahadur21/Emojinator
一个简单的人类表情分类器。
github.com](https://github.com/akshaybahadur21/Emojinator)
这个代码可以帮助你识别和分类不同的表情符号。截至目前,我们只支持手部表情符号。
代码要求
您可以安装 Conda for python,它可以解决机器学习的所有依赖性,您将需要:
numpy
matplotlib
cv2
keras
dlib
h5py
scipy
描述
表情符号是在电子信息和网页中使用的表意文字和表情符号。表情符号存在于各种类型中,包括面部表情、常见物体、天气的地点和类型以及动物。它们很像表情符号,但表情符号是实际的图片,而不是印刷字体。
功能
- 检测手的过滤器。
- CNN 训练模型。
Python 实现
- 使用的网络-卷积神经网络
程序
- 首先,你必须创建一个手势数据库。为此,运行
CreateGest.py
。输入手势名称,你将得到 2 帧显示。看轮廓框,调整手,确保捕捉到手的特征。按“c”键捕捉图像。一个手势需要 1200 张照片。尝试在框架内移动您的手一点,以确保您的模型在训练时不会过度配合。 - 对您想要的所有功能重复此操作。
- 运行
CreateCSV.py
将图像转换为 CSV 文件 - 如果要训练模型,请运行“TrainEmojinator.py”
- 最后,运行
Emojinator.py
通过网络摄像头测试你的模型。
贡献者
阿克谢·巴哈杜尔和拉格夫·帕特内恰。
最后的话
我只能说这些项目给我留下了难以置信的印象,所有这些你都可以在你的电脑上运行,或者如果你不想安装任何东西,在 Deep Cognition 的平台上运行更容易,它可以在线运行。
我要感谢阿克谢和他的朋友们为开源做出的巨大贡献,以及即将到来的所有其他贡献。尝试它们,运行它们,并获得灵感。这仅仅是 DL 和 CV 所能做的令人惊奇的事情的一个小例子,并且取决于你是否能把它变成能帮助世界变得更好的东西。
永不放弃,我们需要每个人都对许多不同的事情感兴趣。我认为我们可以让世界变得更好,改善我们的生活,改善我们工作、思考和解决问题的方式,如果我们现在就调动我们所有的资源,让这些知识领域为更大的利益而共同努力,我们就可以对世界和我们的生活产生巨大的积极影响。
我们需要更多感兴趣的人,更多的课程,更多的专业,更多的热情。我们需要你:)
感谢你阅读这篇文章。希望你在这里发现了一些有趣的东西:)
如果您有任何问题,请在 twitter 上添加我:
[## 法维奥·巴斯克斯(@法维奥·巴斯克斯)|推特
Favio Vázquez 的最新推文(@FavioVaz)。数据科学家。物理学家和计算工程师。我有一个…
twitter.com](https://twitter.com/FavioVaz)
和 LinkedIn:
[## Favio Vázquez —首席数据科学家— OXXO | LinkedIn
查看 Favio Vázquez 在世界上最大的职业社区 LinkedIn 上的个人资料。Favio 有 15 个工作职位列在…
linkedin.com](http://linkedin.com/in/faviovazquez/)
那里见:)
我是一名物理学家和计算机工程师,研究大数据、数据科学和计算宇宙学。我热爱科学、哲学、编程和数据科学。现在,我作为 Oxxo 的首席数据科学家,正在研究数据科学、机器学习和深度学习。我喜欢新的挑战,和优秀的团队一起工作,解决有趣的问题。我是 Apache Spark collaboration 的一员,在 MLLib、Core 和文档方面提供帮助。我喜欢运用我在科学、数据分析、可视化和数据处理方面的知识和专长来帮助世界变得更美好。
DIY(第 1 部分):如何创建自己的。网络机器人
原文:https://towardsdatascience.com/diy-part-1-how-to-create-your-own-net-bot-69f38302b88b?source=collection_archive---------4-----------------------
你已经听到了很多关于机器人、人工智能和机器学习的嗡嗡声。也许,你想知道一个. NET 机器人有多实用,你是否应该采用这种新的、流行的技术。总而言之,关于机器人和所有支持它们的技术,你应该知道一件事。机器人技术将会继续存在!主要原因:他们比你当地的工人便宜。如果你需要证据,可以看看我们精彩的博客帖子——人工智能机器人正在为你的测试工作而来或者只是浏览网页。
机器人会帮你省钱。尽管媒体上充斥着各种高科技,但它们的制作并不复杂。我们会告诉你如何创造你自己的。NET bot 的 6 个简单步骤和 2 篇简短博文:
DIY(第一部分)
- 的 Bot 框架介绍。网
- 创造你的第一个。网络机器人
- 让机器人更聪明
DIY(第二部分)
- 让你的机器人活起来
- 将机器人连接到频道
- 给你的机器人一个声音
的 Bot 框架介绍。网
让我们从一开始就把一切说清楚。当我们使用“机器人”这个词时,我们指的是用户以对话方式与之交互的应用程序。你总是可以从头开始创建一个合适的机器人,但是让我们把它留给数字穴居人吧。现在所有的软件都有一个框架,尤其是机器人。而且,这个。NET bot 框架将通过提供来解决一些基本问题:
- 基本输入输出(输入输出处理)
- 语言和对话技巧
- 与用户的连接
- 语言支持
这个。NET bot 框架本身包含以下工具和功能:
- Bot Builder(带 SDK。网)
- Bot 框架仿真器
- 开发者门户
- Bot 连接器服务
- 渠道 API
这一切是如何运作的?简单到你都不会相信。首先,你已经有了用于实际编码的 Bot Builder SDK,以及用于 API、数据库、Azure、机器学习等附加服务的开发者门户。此外,还有一个用于测试代码的 Bot 框架模拟器。
其次,您有一个用于管理输入输出消息传递的 Bot 连接器服务
第三,有一整套渠道 API,包括社交媒体。如果你想把机器人添加到没有提供的通道中(下图),记住这里有一个自定义的 API 构建器。换句话说,你已经得到了你第一次所需要的一切。网络机器人。
创造你的第一个。网络机器人
好了,理论说够了!让我们进入正题。遵循以下步骤:
第一步。通过 Nuget 包管理器安装 Bot Builder SDK
第二步。将 Bot 应用程序模板安装到您的 Visual Studio 中
第三步。使用 GitHub 的源代码获得一个现成的机器人
第四步。使用机器人框架模拟器,以测试你的机器人
最后一步是保护你新造的机器人。这将需要一些额外的措施。然而,获得一个好的软件总是有回报的。
有几条规则可以保证你的机器人安全:
- 仅使用 HTTPS 端点
- 通过注册您的 bot 以获取 Microsoft 应用 ID 和密码来启用 Bot 框架身份验证
- 在你的 bot 的 web.config 文件中指定它的应用 ID 和密码(寻找提示)
- 使用 Bot Builder SDK 时,使用[BotAuthentication]属性指定身份验证凭据。网
提示:身份认证是这样的。您可以在适当的字段中添加 Microsoft App ID。等待初始身份验证。将新生成的 BotID 添加到适当的字段和配置(Bot 句柄)中。就是这样!
还不解?点击这里获取微软关于如何构建你的机器人的教程。
此外,在其 Bot 框架中,微软提供了一个精彩的词汇表,其中包含了所有可能不熟悉的概念:https://docs . Microsoft . com/en-us/Bot-Framework/dot net/Bot-builder-dot net-concepts。
希望在本章结束时,你已经准备好创建你的第一个机器人了。如果不是这样,请联系我——这篇文章的作者——奥莱赫·罗曼纽克@ Linkedin 点击这里。我会确保你有一个合适的。NET bot 已创建!
让你的机器人更聪明
祝贺你——你已经走到这一步了。你的机器人还活着,你是一个骄傲的机器人父亲。然而,该机器人仍然是原始的,几乎没有用。在这一点上,微软提供了一整套解决方案来增强你的机器人的大脑,特别是用于语言理解的 5 种不同的 API。
不知道选哪个?不要惊慌。第一个是最有用的。我叫路易斯。【LUIS(语言理解智能服务) 能够使用预先构建或定制训练的语言模型来处理自然语言。它有一堆非常适合你的优点(如下图)。
没有任何进一步的介绍,让我们开始计划你的 LUIS 应用程序。你的机器人和你的生意的目的是什么?你如何看待你的机器人帮助你的客户?
对于教导机器人的聪明计划,让我们经历以下步骤:
第一步。确定你的领域——LUIS 的工作方式通常围绕特定领域的主题展开。比如你有一个卖票的 app,或者一个追踪你健身情况的 app。它们都将是不同领域的应用程序,它们需要不同的 LUIS 设置。此外,还有 20 个为您提供便利的预建域名,您可以在这里找到。
第二步。确定你的意图——意图是解释你的客户想要什么的关键词。如果你的顾客写“买票”,显然这就是他想要的。如果健身机器人在对话中看到“脉搏”这个词,很可能客户需要了解他或她的脉搏。简单明了地说,列出你的客户在与你的机器人对话时可以使用的所有关键词,并从机器人方面将它们与适当的动作联系起来。
第三步。识别你的实体——为了预订你的航班,你需要一些信息,比如目的地、日期、航空公司、机票类别和舱位等级——这就是实体。你必须添加它们,才能真正实现一个意图。
所以,这就是所有乐趣的开始。您可以创建多种类型的实体:
- 简单实体— 简单实体描述一个概念。
- 分层实体— 分层实体代表一个类别及其成员。
- 复合实体— 复合实体由构成整体一部分的其他实体组成。
- 预建实体— LUIS 为 Number 等常见类型提供了预建实体,您可以使用它们来表示门票订单中的门票数量。
- 列表实体— 列表实体是明确指定的值列表。每个值由一个或多个同义词组成。在旅游应用程序中,您可以选择创建一个列表实体来表示机场名称。
规划你的 LUIS 应用程序?确定你将使用什么意图和实体?完美!不要担心,如果你不确定所有的事情,你可以在事后改变设置。现在是时候创建一个真正的路易斯应用程序,让你的机器人更聪明!
要直接为机器人创建 LUIS 应用程序,请点击这里的按照微软手册一步一步来。
如果你已经对你的路易斯有了一个清晰的计划,创作部分不会很复杂,最多需要 10 分钟。
祝你在创建和使用你的机器人上好运。如果您在上面写的任何内容或。NET Bot Framework,你可以在 Linkedin 上随意称呼我— 奥勒赫·罗曼纽克,营销经理@ DevCom 。此外,如果上面写的一切对你来说似乎是一门火箭科学,或者你只是没有时间自己做,你总是可以在这里 用请求 寻址 DevCom。哦,别忘了看看我们的,这是一个精彩的娱乐。具有机器学习能力的网络机器人。最后,感谢访问 DevCom 博客并保持安全!
继续阅读 DIY(第二部分):如何自己创作。网络机器人
链接到原博文 。随意订阅。
作者: 奥莱赫·罗曼纽克 ,营销经理@ DevCom
用 DIY Pokedex!
原文:https://towardsdatascience.com/diy-pokedex-with-python-be32e5e3006e?source=collection_archive---------3-----------------------
随着职业和生活方式的发展,我们越来越依赖软件开发。几十年前,联合国和世界各国政府试图让所有人都能读、写和进行算术运算。将来,孩子们需要学习如何阅读、写作、数学和编码!
到目前为止,我们已经有人在麻省理工学院的刮刮乐和 T2 的代码拼写领域工作。就我个人而言,我认为 Python 是一门很棒的初级语言,特别是因为它简单的语法。这使得孩子们不用担心 main()函数和类型转换的复杂性,就像我们在 C/C++/Java 中看到的那样。
从小到大,我一直是一个超级口袋妖怪迷,并意识到我可以用它来开发一些孩子们喜欢的东西。有了这些,我就有了下面的口袋妖怪系列的 Python 编程,它的一些方面对孩子们来说足够简单,而其他部分可能会让大学生挠头。总的来说,这是一个有趣的教程。完整的 ipython 笔记本,点击这里:https://github . com/snaz rul 1/PyRevolution/blob/master/Puzzles/pokescraper . ipynb
首先,为你的 Pokedex 清理网上信息
接下来,分析数据集,寻找有用的信息
最后,构建 Pokedex 的 GUI
用于具有交互式代码的机器学习任务的 DNA /蛋白质表示
原文:https://towardsdatascience.com/dna-protein-representation-for-machine-learning-task-with-interactive-code-6aa065b69227?source=collection_archive---------5-----------------------
Image from pixabay
所以在今天的帖子中,我不打算执行任何机器学习任务,而是它是 DNA 和蛋白质数据的预处理步骤。
请注意,我从这篇博文和这篇博文中截取了部分代码。所以,如果你想了解更多关于生物信息学或热门编码的知识,去看看那些博客吧。
第 0 步——获取 DNA 和蛋白质表
所以上面的字典代码直接来自 Vijini Mallawaarachchi 的开始于生物信息学——将 DNA 序列转化为蛋白质序列,做了一些小的改变。没有终端信号,这是因为在我要执行的机器学习任务中不需要它。
步骤 1——生成 DNA 序列和蛋白质序列
如上所述,我们已经声明了一些超参数,表示训练数据的数量或蛋白质序列的长度。我们将从步骤 0 中声明的字典中随机选择一对 DNA 序列和蛋白质。
步骤 1.5——使用 1–4 法则对 DNA 进行编码
Image from Paper
因此,有几个 DNA 映射规则来编码 DNA,然而在这篇文章中,我将使用 1-4 规则。这里我们给每一个 DNA 序列分配(1*4)个向量。下面是生成的 DNA 序列,以及编码的数据。
步骤 2——验证生成的蛋白质序列
Genetic Code Chart for DNA (http://www.geneinfinity.org/sp/sp_gencode.html)
我们可以通过查看上图来验证生成的蛋白质序列是正确的。
步骤 3——蛋白质序列的一次热编码
红框→ 重复蛋白 A
绿框→ 重复蛋白 T
因此,由于我们有两个重复的蛋白质,我们只需要(1*8)个向量来表示每个蛋白质。
这就是了!非常简单,但对于机器学习来说是完美的。
交互代码
为了交互代码,我搬到了 Google Colab!所以你需要一个谷歌帐户来查看代码,你也不能在谷歌实验室运行只读脚本,所以在你的操场上做一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!
要访问代码,请点击此处。
最后的话
由于期中考试,我不能写机器学习的帖子。然而,一旦这结束了,我会回去写那些!
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你希望看到我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 这里关注我,并访问我的网站,或我的 Youtube 频道了解更多内容。如果你感兴趣的话,我还做了解耦神经网络的比较。
参考
- 从生物信息学开始——将 DNA 序列转化为蛋白质序列。(2017).走向数据科学。检索于 2018 年 3 月 9 日,来自https://towards data science . com/starting-off-in-bio informatics-turning-DNA-sequences-into-protein-sequences-c 771 DC 20 b 89 f
- 不平衡 DNA 序列中启动子识别的二元特征映射规则分析。(2018).中等。检索于 2018 年 3 月 9 日,来自https://medium . com/@ SeoJaeDuk/analysis-of-binary-feature-mapping-rules-for-promoter-recognition-in-balanced-DNA-sequence-C4 b 557 FB 3105
- j . brown lee(2017 年)。如何在 Python 中对序列数据进行热编码-机器学习掌握?机器学习精通。检索于 2018 年 3 月 9 日,来自https://machine learning mastery . com/how-to-one-hot-encode-sequence-data-in-python/
- [1]2018.【在线】。可用:https://www . research gate . net/publication/224347982 _ Analysis _ of _ binary _ feature _ mapping _ rules _ for _ promoter _ recognition _ in _ unbalanced _ DNA _ sequence _ datasets _ using _ Support _ Vector _ Machine。【访问时间:2018 年 3 月 7 日】。
- 遗传密码。(2018).Geneinfinity.org。检索于 2018 年 3 月 9 日,来自 http://www.geneinfinity.org/sp/sp_gencode.html
DNA 序列数据分析——从生物信息学开始
原文:https://towardsdatascience.com/dna-sequence-data-analysis-starting-off-in-bioinformatics-3dba4cea04f?source=collection_archive---------1-----------------------
在我的上一篇文章中,我已经介绍了 DNA、核苷酸及其排列的基础知识。你可能想知道我们如何确定 DNA 分子核苷酸的精确顺序。这就是 DNA 测序发挥作用的地方。
什么是 DNA 测序?
测序是确定给定 DNA 分子核苷酸精确顺序的操作。用于确定一条 DNA 中四个碱基 【腺嘌呤(A)鸟嘌呤(G)胞嘧啶(C)胸腺嘧啶(T)的顺序。
DNA 测序用于确定生物体的单个基因、完整染色体或完整基因组的序列。DNA 测序也成为测定 RNA 或蛋白质序列的最有效方法。
DNA Molecule (Image Source: https://pixabay.com)
测序的历史
英国生物化学家弗雷德里克·桑格完成的工作为蛋白质测序奠定了基础。1955 年,桑格完成了胰岛素中所有氨基酸的测序。他的工作提供了证据,证明蛋白质由具有特定模式的化学实体组成,而不是物质的混合物。
Frederick Sanger (Image Source: https://en.wikipedia.org/wiki/DNA_sequencing)
后来,弗雷德里克·桑格和他的同事在 1977 年发明了一种叫做桑格测序的方法,这种方法可以通过产生片段来对 DNA 进行测序。这是大约 40 年来最广泛使用的测序方法。
全基因组测序和序列组装
DNA 测序反应产生一个几百个碱基长的序列。基因序列通常有数千个碱基长。已知最大的基因是与杜氏肌营养不良相关的基因。长度大约为240 万碱基。为了研究一个完整的基因,科学家们使用了一种简单的策略,称为鸟枪测序。长 DNA 序列由一系列较短的重叠序列组装而成。让我们看看鸟枪测序法会发生什么。
猎枪测序
Shotgun Sequencing
被称为测序机器的特殊机器被用来从我们希望确定的特定基因组中提取短随机 DNA 序列(目标基因组)。目前的 DNA 测序技术不能一次读取一个完整的基因组。它能读取 20 到 30000 个碱基的小片段,这取决于所用的技术。这些小片段被称为读作。特殊的软件被用来根据它们如何重叠来组合这些读数,以产生被称为重叠群的连续串。这些重叠群可以是整个目标基因组本身,也可以是基因组的一部分(如上图所示)。
为了重建原始序列,排列和合并较长 DNA 序列片段的过程被称为序列组装。
为了获得整个基因组序列,我们可能需要产生越来越多的随机读数,直到重叠群与靶基因组匹配。
序列装配问题
顺序装配问题可以描述如下。
给定一组序列,找出包含该组所有成员的最小长度字符串作为子字符串。
Image Source: http://www.homolog.us/Tutorials/index.php?p=1.3&s=1
由于基因组中重复序列的存在以及它们之间的替换或突变,这个问题变得更加复杂。
序列组装问题可以与现实生活场景进行比较,如下所示。
假设你拿了一本书的许多副本,用不同的刀具将每一份通过碎纸机,然后你试图通过将碎片粘在一起将书的文本重新组合在一起。很明显,这项任务相当困难。此外,还有一些额外的实际问题。原文可能会有很多重复的段落,碎纸过程中可能会修改一些碎纸出现错别字。另一本书的部分内容可能也加入了进去,有些碎片可能完全无法辨认。
这听起来很令人困惑,而且很难实现。这个问题被称为 NP 完全。NP 完全问题是状态未知的问题。对于任何 NP 完全问题,还没有发现多项式时间算法,也没有人能够证明对于它们中的任何一个都不存在多项式时间算法。然而,有贪婪算法来解决序列组装问题,其中实验已经证明在实践中表现相当好。
解决序列拼接问题和进行序列数据分析的一种常用方法是序列比对。
序列对比
序列比对是一种排列 DNA、RNA 或蛋白质序列以识别相似区域的方法。被鉴定的相似性可能是序列之间的功能、结构或进化关系的结果。
如果我们比较两个序列,它被称为成对序列比对。如果我们比较两个以上的序列,这被称为多序列比对。
下一代测序
下一代测序(NGS) ,也称为高通量测序*,是用于描述许多不同现代测序技术的统称,例如,*
- Illumina (Solexa)测序
- 罗氏 454 测序
- 离子洪流质子/ PGM 测序
- 固体测序
这些最新技术使我们能够比以前使用的桑格测序更快更便宜地对 DNA 和 RNA 进行测序,并彻底改变了基因组学的研究。
最后的想法
序列数据分析已经成为基因组学领域中一个非常重要的方面。生物信息学通过提供不同的软件解决方案和省去所有繁琐的手工工作,使生物学家的分析任务变得更加容易。
你可以从 这里 找到用于 DNA 测序的软件工具列表。此外,你可以在 这里找到 的序列比对软件列表。
希望你对序列数据分析有了一个基本的概念。
在我的下一篇文章中,我将带你浏览双序列比对的细节和一些在该领域使用的常见算法。
因为我对这个领域还很陌生,所以我想听听你的建议。😇
感谢阅读…😃
机器人会看到电蓝色吗?—视觉化色彩感知的潜在空间
原文:https://towardsdatascience.com/do-androids-see-electric-blue-visualizing-the-latent-space-of-color-perception-fcd46fb8848e?source=collection_archive---------20-----------------------
Visualization of the learned color space
TL;速度三角形定位法(dead reckoning)
我想更好地理解使用神经网络将数据映射到潜在向量空间的过程。我记得这个调查要求人们说出随机呈现的颜色。因为颜色能产生引人注目的视觉效果,而且我以前没见过这样的效果,所以我认为这是一个很好的训练范例。神经网络的任务是将具有相同名称的颜色分组到新颜色空间的相似区域中。通过在学习的颜色空间中绘制每种颜色的新位置来可视化结果。
介绍
在机器学习中,向量空间可以用于对语义相似的项目进行分组。例子包括人脸识别、句子相似度和内容创建。其思想是获取可变的输入数据,例如不同光照条件下同一张脸的照片,并将其映射到向量空间中相同或相似的区域。我将使用颜色感知调查的数据来说明这个概念。以前没见过这样做的,真的很兴奋的跟大家分享。
那么,什么是潜向量空间呢?
本质上,潜在向量空间是一种输入的表示,它被编码成语义上有意义的。语义相似的条目应该被映射到相似的空间区域,即使原始输入数据非常不同。
让我们把定义分解一下:向量就是一组数字。在向量空间中,每个数字代表一个独立轴上的位置。你可以想象一个指向一个位置的向量,或者一个点,在多维空间里。潜在的被定义为“(指某种品质或状态)存在但尚未发展或显现;隐藏的或隐蔽的”。在潜在向量空间中,轴的含义是通过训练过程发现的,而不是事先确定的。
一个常见的例子是 word2vec ,其中单词被编码成一个向量。一个词的意思完全由句子中与其相邻的词来决定。这个新向量空间的轴编码了有趣的语义属性。下图显示了性别轴。
有了潜在的向量空间,我们希望发现一些隐藏的,但却存在的数据的形状或顺序。
映射颜色
理解发现这些隐藏性质的过程的一种方式是从我们已经知道的向量空间开始。这就是颜色的由来。颜色通常用 3 个数字的向量来表示,分别代表红、绿、蓝(RGB)的值。其他常见的颜色空间有 HSV、YUV、CIE 等。
训练网络需要执行一项任务,比如给一张照片贴标签,或者预测句子中的下一个单词。Word2Vec 和句子向量就是这样构造的。在单词袋模型中,一个句子片段被呈现,其中一个单词被移除。网络试图根据相邻的单词来猜测丢失的单词。
数据清理和数据集创建
网络漫画 XKCD 进行了一项调查,参与者被要求说出展示的颜色。原始调查数据由每种呈现的颜色和参与者输入的姓名组成。在使用这些数据之前,需要进行一些清理。我冒昧地组合了我认为明显是相同颜色名称的条目。例如,我组合了蓝色和浅蓝色、砖红色和砖红色、褐色和紫红色的条目。有兴趣的可以看看这个笔记本看看我到底做了什么。
Sample of the colors labeled “red”
Plot of the input colors from the survey
训练神经网络
我使用的网络是一个完全连接的网络,有一个输入,两个隐藏层和一个输出。输入层采用 3 个浮点数,对应于我们原始的 RGB 颜色值,输出 50 个值。两个隐藏层的宽度也是 50 个值。输出层将从第三层获取 50 个隐藏值,并输出 3 个浮点数。输出将是我们新的颜色空间。
当训练神经网络时,对输出进行评分,看它根据输入预测正确结果的程度。这个分数叫做损失函数。最简单的损失函数是 L1 损失,它是输出和期望值之差的绝对值。你可以在这里阅读更多关于损失函数的内容。在这种情况下,损失函数更有趣一些。我们不能使用通常的猜测游戏,因为我们要求网络创建一个新的向量,而不是对已经标记的数据进行分类。任务是为相似的输入创建彼此靠近的向量,为不相似的输入创建彼此远离的向量。实现这一点的一种方法是使用三重边际损失函数。
Sample of the triplet dataset colors. The top, middle and bottom are the anchor, positive and negative colors respectively
三重损失以三个值作为输入,输出一个分数。这三个值是锚值、正值和负值。锚色是有问题的颜色,正片是与锚色同名的颜色,底片是不同名称的颜色。训练网络时,这三个值在网络中运行,一次一个,并保存输出。然后将这三个值提供给损失函数,该函数根据锚色和正色的距离以及负色的距离产生一个分数。然后这被用作反向传播中的误差值。在每批颜色通过网络后,相似的颜色将具有彼此更接近的矢量,而不相似的颜色将相距更远。
一旦这个过程完成,我们应该有一个新的彩色地图。
但是什么地图?
在培训之前,我看到了以下几种可能性:
1)网络不训练,也就是说损失值永远不下去,网络没有学到什么有用的东西。
2)网络训练并且损失函数减小,但是结果是无意义的。这将是过度拟合的结果。
3)网络训练并产生可理解的感知色彩空间。
4)网络训练并产生颜色空间,该颜色空间对颜色进行分组,但在其他方面是独特的。
5)网络训练并产生与原始颜色值相似的 RGB 值。
在训练开始前,我的猜测是第四名。
培训结果
在训练网络和绘制颜色之后,我会说结果是#3 和#4 的混合。绿色和红色相距甚远,正如你对人类色觉所知的那样。似乎也有一个暖/冷轴以及一个亮/暗轴。绿色似乎比其他颜色占据更大的体积。一点绿色偏见也是有道理的。我不知道角落里的绿点是怎么回事。
One view of the 3D color space
结论
这就是,一台机器从调查数据中学习色彩空间。我认为这说明了机器学习系统从大量数据中提取意义的能力。这里的信号很小,只是单独的颜色/名称对,但有了如此大量的数据,就可以学习更大的结构。从头再来一次训练,看看结果会有多大的不同,这将会很有趣。如果结果非常相似,那么在给定输入和网络拓扑的情况下,最终结构不可避免地会有一些问题。
请鼓掌👏如果你喜欢这篇文章,并希望看到更多类似的。
更快地做数据科学
原文:https://towardsdatascience.com/do-data-science-faster-fe27294fd417?source=collection_archive---------8-----------------------
人工智能是许多企业的目标。但是,为了做人工智能,一个组织需要机器学习。而且,没有分析,机器学习是不可能的。没有简单、优雅的数据基础设施,分析是不可能的。简单来说,正如已经说过的,没有 IA(信息架构)就没有 AI。这两个领域的成功更多的是文化,而不是技术。
文化要么是一家公司最强大的资产之一,要么是一种障碍。大多数企业没有数据文化。许多人甚至不知道他们需要它。具有讽刺意味的是,组织的当前文化经常阻止企业知道他们需要一个新的文化(即由于树木而看不到森林)。
我认为数据文化的最大障碍是对复杂性的恐惧。本·汤普森曾写道:“文化不是导致成功的东西,而是成功的产物。”如果一个企业在数据方面没有取得可见的/实质性的成功,人们怎么可能期望它形成一种数据文化?
为了将数据转化为竞争优势,公司必须播下数据文化的种子,用切实可行的方法取得成功。换句话说,他们必须让他们的组织能够更快地进行数据科学研究。
我曾经听说数据科学项目和软件工程项目的区别在于,对于前者,你不知道它是否真的能工作。即使你是一个坚定的“快速失败”支持者,对许多人来说这也是一个太多的未知数。大多数进行投资的组织都希望了解他们将如何获得投资回报。我知道这不是硅谷的口头禅,但大多数企业的投资回报率标准与硅谷不同。没有对错,只是不同而已。许多企业更喜欢高确定性和适度回报,而不是更激进的方法。在经济学中,我们称之为对风险调整回报的容忍度。
我的观察是,大部分投入到构建和部署机器学习的时间,并没有花在算法和模型上。相反,它被花费在最平凡的任务上:数据准备、数据移动、特征提取等。这是不可避免的,也是数据科学项目中风险最大的地方;垃圾输入/垃圾输出导致低确定性。
我在每个组织中都发现了两个问题:
1)渴望大规模应用数据科学和机器学习。现在可以肯定的是。
2)迁移到云的意图,以加速数字化转型。
我们从大型数据集的假设开始。无论是在公共云、私有云、Hadoop、数据仓库还是其他环境中,理想的解决方案都支持跨所有数据类型和位置的联合。我们正在进入一个多云世界。使用一个分布式的通用 SQL 引擎,这很容易做到:多个云就像一个云一样。
一旦您可以轻松访问所有数据,下一个挑战就是应用数据科学和机器学习:构建、训练和部署模型。然后,通过反馈循环,利用这些模型进行预测,并自动执行以前的手动任务。从根本上说,这是关注数据科学的两个原因:预测和自动化。
最后,迁移到云现在就像点击一个按钮一样简单。有了私有云和公共云的通用代码库,就可以轻松地在任何需要的地方移动数据和运行应用程序。借助数据科学经验,您可以根据需要构建模型(私有云或公共云)并部署到任一环境。你的数据受限于你的想象力,而不是你的防火墙。
人工智能从根本上讲是使用机器学习和深度学习技术来实现基于数据的应用。每个渴望数据文化的组织都必须选择一个起点。深度学习将使以前无法访问的数据变得可访问;如果这会创造动力,成功的可能性很高,那就是你应该开始的地方。对于其他组织来说,更好的预测和自动化将催生一种数据文化。不管你选择哪条路,目标都是一样的:更快地研究数据科学。
— — — — —
参考:https://www . the register . co . uk/2017/09/28/IBM _ launchs _ system _ to _ bring _ analytics _ to _ data _ promises _ machine _ learning _ in _ everything/
GANs 真的模拟了真实的数据分布吗,或者他们只是在巧妙地愚弄我们?
原文:https://towardsdatascience.com/do-gans-really-model-the-true-data-distribution-or-are-they-just-cleverly-fooling-us-d08df69f25eb?source=collection_archive---------2-----------------------
自 2014 年引入以来,生成对抗网络(GANs)已经成为密度估计任务的流行选择。方法很简单:GAN 框架由两个网络组成,一个用于生成新样本,另一个用于区分真实样本(来自真实数据分布)和生成的样本。使用敌对一词是因为他们有相互竞争的目标,所以一方试图“智胜”另一方。这些网络被联合训练,使得来自一个网络的梯度反馈改善了另一个网络,直到(希望)生成器能够生成好的鉴别器不能辨别是否是真实图像的图像。
GANs 背后的理论是有希望的。事实上,如果在训练过程的每个步骤中,每个网络都被训练完成,则 GAN 目标可以被示为等效于最小化真实数据密度和模型数据密度之间的 Jensen-Shannon 散度。然而,在实践中,这些分析的假设并不成立。事实上,成功地训练 GANs 是一项众所周知的艰巨任务,在过去的两年中已经取得了许多进展。无论如何,在实践中,GANs 在多大程度上能够忠实地模拟真实的数据分布仍然是一个未决的问题。
最近的一项工作显示了非常有希望的结果,这就是 NVIDIA 著名的“GANs 渐进增长”,,其中鉴别器和生成器都在渐进增长,直到生成 1024x1024 的高质量图像。“伪名人”生成的面孔似乎暗示了对上述问题的肯定回答。是这样吗?
我们如何知道 gan 是否成功?
评估 GANs 性能的主要挑战是,没有对分布拟合程度的内在评估,这使得研究人员(在很大程度上)承担了对结果进行定性评估的任务。
仅仅查看生成的输出并惊叹人脸看起来有多逼真是不够的。众所周知,GANs 易受模式崩溃的影响,在这种情况下,目标分布没有完全建模,生成器往往会产生非常相似的图像(指真实分布的“模式”)。当训练集由成千上万的图像组成时,我们如何确定 generator 不仅仅是在训练图像之间进行平滑插值(或者在最坏的情况下,仅仅是记忆数据集)?
模式崩溃没有发生的一个很好的指示是产生的输出中的多样性。对多样性的简单检查如下:
选择两个产生真实图像的随机噪声向量,并通过从位于连接两个向量的线上的种子生成图像来生成“插值”图像。如果这些图像中有许多是合理的,那么我们就有充分的证据证明生成的分布能够产生各种各样的图像。
来自尼维迪亚的人们非常友好地提供了整整一个小时这样的插值供你欣赏:
然而,这仍然没有解决原创性的问题:如果 GAN 设法真实地模拟了数据分布,那么它生成类似于训练图像的图像的可能性很小,甚至不存在。虽然 youtube 视频显示了许多高质量生成的人脸,但 GAN 会不会只是在它收到的训练图像之间做了聪明且视觉上有吸引力的插值?它真的创造了新的名人,还是仅仅在现有名人之间创造了巧妙的融合?
关键是证明样本多样性(例如,显示生成的分布的支持是大的)是不够的。需要确定生成的输出与训练示例有显著差异。
为此,NVIDIA 论文的作者使用了最简单的方法,即显示训练集中生成的人脸的最近邻,其中使用的度量是像素空间中的 L1 距离(图像的中心裁剪)。
top: generated outputs, bottom: nearest neighbor in training set, as calculated using L1 distance in the pixel space of the center crop
我猜这里的假设是,因为人脸是归一化的(对齐的和正面的),所以在像素空间中测量距离是真实相似性的良好代理,但结果有时很差,如最右边的一对所示。
这感觉像是少了什么。一些生成的图像看起来有点眼熟,我就是想不出真实的名字。如果在训练集中真的有这些名人的图像,而比较 L1 像素强度没有发现,那会怎么样?
为了获得一些灵感,我想出了自己的测试:我向我的(不了解人工智能的)家庭成员展示生成的输出,并问他们是否认识这些图像中的任何一个。这些回答非常有趣。我得到的答案包括碧昂斯(左二)、“头发怪异的克里斯·洛克”(左四)和“女版迈克尔·道格拉斯”(最右边),这其实是一个相当不错的猜测。
left: generated image from GAN; right: Michael Douglas
除了笑,这让我想到那里可能有什么东西。我只需要一个更有条理的方法。
人脸识别救场!
如果我们用语义损失函数代替朴素的 L1 损失,在数据集中寻找最相似的人,会怎么样?这其实很简单。事实证明,在人脸识别任务中训练的网络最后一层的特征对于计算两个人之间的语义相似度是有用的(事实上,这就是脸书如何知道在你上传的图像中标记谁)。在这种情况下,我很懒,使用了 dlib ,这是一个用于面部检测和面部标志检测的长期工具。他们最近增加了预训练的人脸识别模型,让你只用几行代码就能计算出人的“语义特征”。这实际上对于大量涉及人物图像的下游任务非常有用,所以这是一个很好的工具。
我使用这种方法在 celebA 的非 HQ 版本(我唯一可以访问的版本)中搜索语义相似的图像,这是用于训练 NVIDIA 的 GAN 的数据集。下面是我找到的一些“最近邻”对。在下面的所有例子中,左边是高质量生成的图像,右边是来自 celebA 的“语义”邻居。肯定比 L1 的邻居好得多,一些相似之处也很明显。(请注意,这些不是“精选的”,我只为从他们的文章中提取的大约 10 个生成的人脸做了这件事)。
总结
- 对 GANs 的评估迫使我们求助于“适合度”的定性测量。
- 当在大数据集上训练 GAN 时,视觉上引人注目的多样化输出本身并不能证明 GAN 训练成功恢复了真实的数据分布。需要更严格的证据来证明 GANs 不仅仅是训练集的“智能记忆”。
- 如果可能的话,选择语义相似性,而不是简单地使用原始数据的欧几里德距离(特别是当你试图提出一个有意义的观点时)
- 具体到人脸,你可以非常容易地获得“现成的”高质量语义特征。对于这个项目,我使用了 dlib 的预训练人脸识别网络。再简单不过了!
人类有交配季节吗?这张热图揭示了生日和季节之间惊人的联系
原文:https://towardsdatascience.com/do-humans-have-mating-seasons-a723cad43500?source=collection_archive---------1-----------------------
动物本质上是季节性动物:鹿在秋天交配,所以它们的幼鹿正好在食物变得更加丰富的春天出生。北极熊在春末夏初寻找配偶,并在 12 月至 1 月间产下幼崽。
但是人类呢?我们是唯一没有真正交配季节的动物吗?毕竟,人类全年都有性生活,不用担心他们的婴儿是否有足够的食物过冬。
看起来我们有——某种程度上。
这张由 Visme 基于最新的联合国活产数据绘制的热图不仅揭示了出生高峰月份和季节之间令人惊讶的联系,还揭示了出生高峰月份和纬度之间令人惊讶的联系(纬度是赤道以北或以南的距离,以度为单位):
你注意到北半球高纬度国家的一致模式了吗?平均每天出生人数最多的月份是七月、八月和九月。
当你向下移动国家列表,从最高纬度到最低纬度排序,你可以清楚地观察到出生高峰期越来越向右移动,发生在一年的晚些时候。
一旦你进入中纬度地区,或热带地区,9 月和 10 月就成为平均每天活产婴儿数量排名最高的月份,其次是 11 月和 12 月,有些会延续到下一年。
排名垫底的是南半球的国家,这些国家在 3 月至 5 月期间每天平均出生人数最高。
当这些数据转化为受孕日期时,使用 40 周的妊娠期,我们还可以看到,在俄罗斯、挪威、芬兰和丹麦等高纬度国家,制造婴儿的高峰时间是 10 月,如下面用 Visme 制作的图所示。
根据同样的数据,在很多国家,12 月是另一个受孕高峰月,包括美国、英国、澳大利亚、加拿大、墨西哥和日本。
使用这个 DIY 工具,在几分钟内创建您自己的令人难忘的信息图表。免费试用
这些趋势意味着什么?
虽然这很容易归因于长期以来的假设,即较冷的温度会让我们在身体亲密关系中找到温暖,但可能的科学解释要复杂一些。
根据发表在《生殖节律杂志》上的一项研究,一年中受孕的理想时间是当太阳出来 12 个小时,温度在 50 到 70 华氏度之间。出于不完全清楚的原因,这些是受孕的完美条件,要么因为它们刺激精子生成或排卵——要么两者兼而有之。
其他研究的发现也与从这张热图中获得的见解一致。例如,发表在《英国皇家学会学报 B》上的对人类出生季节性的综合分析得出结论,出生高峰期出现在一年中你越往南走的晚些时候,如下图所示。
Image Source
邓波儿在她为 Slate 撰写的文章中也做了计算,并得出结论,北纬度国家在秋季怀孕的频率更高,而更靠南的国家则在冬季怀孕,这也在一定程度上与我们的研究结果一致。
其他研究,比如这项关于性活动季节性变化的研究,得出的结论是,事实上“在圣诞节前后,性活动和不安全性行为有所增加。”甚至对谷歌搜索的分析,作为性活动的替代指标,也表明与性和交配行为相关的查询在冬季和初夏达到高峰。
所有这一切似乎表明,这里有环境和生物两方面的因素在起作用,而且最终,我们可能无法精确地找到这些模式存在的确切原因。
我们可以肯定的是,尽管人类似乎有一个准交配季节,但这并不是一个真正的季节,因为女性全年都容易接受性行为,每 28 天排卵一次,而不是每年。与其他动物不同,人类隐瞒了排卵,因为他们没有表现出任何生物生育的外在迹象,这对科学家来说仍然是一个谜。
方法学
为了创建上面的热图,我们按月份过滤了最新的联合国活产数据,以获得 2000 年至 2015 年之间的数据(这是列出的所有国家中数据量最大的时期)。
为了说明每个日历月天数的差异,我们计算了每个月每天活产婴儿的平均数量,并对一年中的每个月进行了排名。
例如,对于美国,计算每个月每天的平均活产数。然后根据每天活产婴儿的平均数量,从最高到最低对每个月进行排名。由于 9 月份是这一时期每天平均出生人数最多的月份,因此该月份的排名为 1;八月展示了第二高的总数,因此获得了 2 的排名;诸如此类。
然后,使用与每个月的等级值(从 1 到 12)相对应的色标创建热图。通过这种方式,彩色编码的可视化将使得国家和半球之间的比较变得容易。否则,一个国家与另一个国家之间的活产婴儿数量的巨大差异将产生一个范围太广的色阶,使观众无法进行快速的视觉比较。
轮到你了
你对这些受孕和生育趋势有什么看法?你认为除了气候和季节之外还有其他外部因素吗?请在下面的评论区告诉我!
本帖 原版 最早出现在 Visme 的 视觉学习中心 。
比赛日会提升世界杯歌曲吗?
原文:https://towardsdatascience.com/do-match-days-boost-the-fifa-world-cup-soundtrack-d75d7ef785c1?source=collection_archive---------8-----------------------
音乐是足球文化的一部分。国际足联官方歌曲和当地主题曲将所有参加今年世界杯的国家团结在一起。除了提升比赛期间的气氛,这项活动还让艺术家们获得了非同寻常的世界报道和名声。我们都记得像夏奇拉的《T0》、《Waka Waka》、《T1》和皮特保罗的《T2》、《我们是一家》、《T3》这样的热门歌曲,尽管它们分别是在 8 年前和 4 年前发行的。
由于这项活动的巨大影响力和音乐在支持者中的统一性,我想知道我们是否可以追踪本届世界杯国歌的结果,看看这些是否会在比赛日增加——如果是这样,这是否因国家而异?
在俄罗斯 2018 年世界杯期间,官方国歌将由尼基·贾姆、威尔·史密斯和 Era Istrefi 代表,名为‘尽情狂欢’。出于这一分析的目的,我们将跟踪这首歌的表现,以衡量事件的影响。
数据集
对收集的数据进行简短描述,以便进行实际分析;
- 由于我没有该曲目的实际每日流媒体数据(这是不公开的),我决定偏离 Spotify 排行榜,寻找有排行榜的国家。日线图是在曲目发行日到淘汰赛第一轮之间刮出来的。
- 我们需要所有比赛的时间表,以便与 Spotify 的每日图表相匹配。这些都可以通过国际足联网站获得。
比赛日会导致更高的图表位置吗?
当我们比较参赛国家的每日图表位置,并将它们与各个国家比赛的日子进行比较时,我们可以确定在比赛日是否出现增长。当综合数据集中的所有国家并计算平均值时,我们得出结论在比赛日增加了 12 个位置。
为了让它更有趣,我在下面突出了几个国家,图表显示了当特定国家有世界杯比赛时,图表位置的增加。
看看瑞典,当他们的国家队比赛时,我们看到平均增加了 25 个位置。在 16 强决赛对阵瑞士的那天,这首歌在 Spotify 每日排行榜上从第 49 位上升到第 8 位。
Chart increase for Sweden
当所谓的红魔登台时,比利时也显示出图表位置的显著增加。同时,似乎在非比赛日有更多的高峰。
Chart increase for Belgium
冰岛的支持者总是令人印象深刻,在体育馆里制造威胁的声音。他们的比赛日平均涨幅是 30 个位置。
Chart increase for Iceland — period between May 25th and June 15th means no chart inclusion
当看法国时,我们也可以得出结论,赛道往往会在比赛日爬上图表,除了对秘鲁的比赛,赛道在法国图表中下降,但在第二天增加。
Chart increase for France — period between May 25th and June 12th means no chart inclusion
淘汰
当研究这个问题时,我首先想到的事情之一是,被淘汰出局的国家是否也会停止聆听世界杯官方国歌。当看着最受欢迎的参赛者之一巴西时,我们看到了一些值得注意的事情——这首歌在 6 月 19 日从他们的 Spotify 排行榜上消失了,而他们直到 7 月 6 日仍在争夺世界杯。巴西在这条赛道上的最高排名是第 105 位,与其他(周边)国家相比,这个排名相当低。
对于其他一些被淘汰的国家(可能比预期的要早),我们不一定会看到图表的大幅下降。像德国、阿根廷和墨西哥这样的国家在不得不离开俄罗斯后,头寸略有减少,但在失望情绪消失后的几天里,头寸仍然很大,甚至有增加的趋势。
相反,冰岛似乎已经厌倦了“尽情享受”,因为在他们输给克罗地亚两天后,我们不会在他们的本地 Spotify 排行榜上找到这首歌。
Chart positions after being knocked out
英国更喜欢其他方式
虽然原声音乐出现在一些当地的 Spotify 排行榜上,但它没有能够到达英国,甚至在比赛日也没有。英国人似乎更关心他们自己的地方国歌 三狮s(1996 年发行),迅速攀升至 Spotify 排行榜,并自今日起占据榜首。
应用与我们对 FIFA 原声所做的相同的方法,我们看到在比赛日平均增加了 118 个位置(只看原声,有多个版本)。
Chart increase for U.K. — looking at the Three Lions anthem
英格兰跟着他们的“三狮军团”国歌一起唱,我并不感到惊讶,因为我们在荷兰已经习惯了跟着唱像“Viva Hollandia”和“Wij Houden Van Oranje”这样的歌曲。虽然我不需要检查这些歌曲,这也可以解释为什么我有一些空闲时间进行这样的分析。;-)
放弃
- 这将是最准确的时候,看看每个国家的实际流计数,不管图表是否包含。因为这些都不是公开的,所以我选择使用 spotifycharts.com 的网站。很有可能在比赛日发生的其他活动会导致现金流上升,从而导致图表位置上升。
- Spotify 是唯一被考虑的流媒体服务。鉴于该服务并非在所有参与国家都可用,因此一些国家被排除在此分析之外。
- 一些国家可能会有当地的国歌在比赛期间也有所提高,但这些没有被考虑在内。
感谢阅读!如果你喜欢读这篇文章👏🏻很感激。
我写的更多故事:
[## 拉丁语和雷鬼音乐的传播
公平地说,我们很多人都在跟着当今最热门的拉丁和雷鬼音乐一起唱歌,而不一定…
towardsdatascience.com](/the-diffusion-of-latin-and-reggaeton-69113f9929dd) [## 音乐的旅行时间是多少?⏱
我们生活在一个数字世界,因此信息和音乐的传播速度比以往任何时候都快。从来没有…
medium.com](https://medium.com/@boplantinga/music-travels-but-what-s-the-travel-time-8fd7279e1aa6) [## Spotify 周日的图表与本周其他时间有所不同吗?
看看我自己的倾听行为,我经常承认我在周日倾向于有不同的偏好…
towardsdatascience.com](/does-spotifys-chart-on-sunday-differ-from-the-rest-of-the-week-d7272f300508) [## Pusha T vs. Drake:用数据备份他们的 diss 轨迹
也许没有必要花太多时间来介绍德雷克和普什塔之间的矛盾
towardsdatascience.com](/pusha-t-vs-drake-backing-up-their-diss-tracks-with-data-1083e6159c75)
更多的枪支会降低暴力犯罪率吗?(第一部分:数据可视化)
原文:https://towardsdatascience.com/do-more-guns-reduce-violence-crime-rate-part-i-data-visualization-fb3fd6a918a5?source=collection_archive---------6-----------------------
携带权利法要求美国政府向任何符合必要标准的申请人发放隐蔽携带手枪许可证。这是增加了暴力犯罪率还是降低了暴力犯罪率?
枪支对美国犯罪的影响引发了许多公众辩论。两个方向似乎都有足够的研究(说明法律有效和无效),人们总是可以挑选一个研究来支持他们的立场。事实上,在这篇文章中,一个可视化给出了一个与最终结论不同的矛盾见解。
这一系列的文章是关于分析法律的影响,在这一时期的可用数据。这篇文章(第一部分)有视觉表现,以了解携带权利法是否减少了暴力犯罪。在后面的部分,面板回归将被用来估计携带权利法对暴力犯罪率的影响。
我的 GitHub 上的 r 代码和数据:
[## saivishnuk/数据科学
在 GitHub 上创建一个帐户,为数据科学的发展做出贡献。
github.com](https://github.com/saivishnuk/Data-Science/tree/master/Do_more_guns_reduce_violence_crime_rate)
更多我的博客,请查看我的 中 和我的 GitHub 。
探索性数据分析
数据字典:数据是 1977-1999 年美国 50 个州加上哥伦比亚特区(总共 51 个“州”)的平衡面板。每个观察值都是给定年份的一个状态。总共有 51 个状态× 23 年= 1173 个观测值。
图表 1: 不同州何时出台了承运权法?
图表 1 中的见解:
- 在观察期间,51 个州中只有 29 个州有有效的携带权法律
- 在这 29 个国家中,有 4 个国家的运载权法律从观察期开始时就已经生效
- 超过 50%的州在观察期的后半段实施了该法律
在引入该法律的州,暴力犯罪率降低了吗?
图表 2: 在观察期内至少实施过一次运载权法律的国家被视为应国,其余被视为非应国
- 图表 2 中的见解:平均值的趋势。“应”和“非应”州的暴力率与“总体平均”类似。暴力犯罪率”和平均犯罪率的上升或下降。这些年来,各州的犯罪率一直居高不下
- 假设一:这个图没有得出足够的证据,因为 avg 没有划界。shall 州引入 shall 法前后的暴力犯罪率
图 3(检验假设一):将已经实施法律的州的犯罪率分为法律出台前和出台后。
例如,如果 1990 年在州“1”中引入了该法律,则在 1990 年之前,州“1”将被计入“应州平均”。在“应介绍”之前的暴力率和 1990 年之后的状态“1”将被认为是“应说明平均”。暴力 _ 率后应介绍”。
“应说明平均值。从 1997 年开始,暴力发生率将为零,因为法律实施的最后一年(观察期内)是 1997 年。
- 从图表 3 中洞察:“应州平均值”的趋势。谋杀率后,应介绍“增加了多年。
- 假设 2: 虽然这表明法律在降低犯罪率方面并不有效,但这也可能是因为在观察的初始阶段采用 shall 法律的州的平均犯罪率更低。暴力率高于在观察期后期实施该法律的州。
图表 4(检验假设 2): 在观察初期采用了该定律的州是否 avg 较少。暴力率比那些在观察期后期采用运载权法律的州高吗?
对于已经引入该法律的州,数据已经根据该法律引入的年份分成几个箱,每个箱有 5 年。
- 图表 4 中的见解:在(77–80)、(81–85)、(86–90)中引入法律的州的平均犯罪率低于在(91–95)、(96–100)中引入法律的州,这表明在观察的初始阶段采用法律的州的平均犯罪率更低。暴力率高于后一时期实施该法律的各州。
所有上述图表都没有给出法律是否有效的结论性证据。将“图 4”分成不同的子图,每个子图显示一个趋势,可以更好地理解。
图表 5(图表 4 的分割):假设有 4 个州在(77-80)期间实施了 shall 法律,那么在引入期之后(即从 80 到 99)分析这 4 个州的平均暴力率。
- 图表 5 中的洞见:在法律已经跨不同时间段实施的州中,平均。据观察,法律出台后,暴力率有所下降。这表明携带权利法在降低暴力犯罪率方面是有效的。
这只是一个直观的表象,可能有更多的因素导致暴力犯罪率的上升或下降。面板回归方法用于说明第二部分中的每个因素。下面是第二部分的链接。
[## 更多的枪支会降低暴力犯罪率吗?(第二部分:R 中的面板回归)
携带权利法是要求美国政府颁发隐蔽携带手枪的法律…
towardsdatascience.com](/do-more-guns-reduce-violence-crime-rate-part-ii-panel-regression-in-r-d3f0eafdf401)
谢谢你的阅读。如果你喜欢这篇文章,给它一些掌声👏。希望你有一个伟大的一天!
更多的枪支会降低暴力犯罪率吗?(第二部分:R 中的面板回归)
原文:https://towardsdatascience.com/do-more-guns-reduce-violence-crime-rate-part-ii-panel-regression-in-r-d3f0eafdf401?source=collection_archive---------5-----------------------
携带权利法要求美国政府向任何符合必要标准的申请人发放隐蔽携带手枪许可证。这是增加了暴力犯罪率还是降低了暴力犯罪率?
这是本系列的第二篇文章,在第一部分中,数据可视化被用来理解携带权利法对暴力犯罪率的影响。下面是第 1 部分的链接。
[## 更多的枪支会降低暴力犯罪率吗?(第一部分:数据可视化)
第一部分有视觉表现,以了解携带权利法是否减少了暴力犯罪。在后来…
towardsdatascience.com](/do-more-guns-reduce-violence-crime-rate-part-i-data-visualization-fb3fd6a918a5)
在这一部分,将使用面板回归方法来了解基于监禁率、携带权利法、人口等因素的暴力犯罪率的变化..
我的 GitHub 上的 r 代码和数据:
[## saivishnuk/数据科学
在 GitHub 上创建一个帐户,为数据科学的发展做出贡献。
github.com](https://github.com/saivishnuk/Data-Science/tree/master/Do_more_guns_reduce_violence_crime_rate)
更多我的博客,请查看我的 中 和我的 GitHub 。
在本文中:
- 将用于面板回归的所有变量的定义
- 检查每个变量的正态性
- 执行变量转换
- 检查成对相关性
- 面板回归(将使用混合和固定效应模型)
- 归纳不同面板回归模型的结果
不同变量的定义
如果运输权法在某一州和某一年有效,则变量“应”等于 1,否则“应”等于 0。
使用密度图的每个变量的正态性
- 暴力率、监禁率和人口密度具有较高的偏态性(大于 2.5)
- 这三个变量已经使用对数函数进行了转换
变量之间的成对相关性
- pb1064(该州 10-64 岁黑人人口的百分比)和 pw1064(该州 10-64 岁白人人口的百分比)高度负相关(-0.98)
- 包含高度相关的独立变量会导致标准误差的扩大
面板回归
- 以 log(暴力率)为因变量的混合普通最小二乘法
代码
结果
- 第 1 部分:Pb 1064 和 Pw1064 的估计值与零没有显著差异,有携带权利法的暴力率比没有携带权利法的暴力率降低了 28%。
- 第二部分:联合假设检验,H-Null 为 Pb1064 =0 & Pw1064=0,表明两个变量都不显著
- 第三部分:模型的监禁率-残差图具有锥形结构,这表明异方差的存在。因此,使用聚类稳健的标准误差来校正标准误差。
- 第 4 部分:使用聚类稳健 S.E 的无 Pb1064 和 Pw1064 的混合回归模型显示,所有变量在 p 值为 0.15 时都是显著的,有携带权法律比没有该法律减少了 28%的暴力率。这似乎是一个非常高的估计,这可能是因为忽略了变量偏差。
2。具有实体固定效果的固定效果模型
固定效应模型不受遗漏变量偏差的影响,遗漏变量偏差来自于随时间恒定的变量,并且在各州之间变化,而不在各州内变化。例如,人们对犯罪的文化态度不能用混合 OLS 模型来量化。
代码
结果
- 第 1 部分:实体固定效应模型显示,平均收入的估计值与零没有显著差异,有携带权利法比没有携带权利法减少了 3.7%的暴力率
- 第 2 部分:没有平均收入的实体固定效应表明,有携带权利法比没有携带权利法减少了 3.8%的暴力率,估计值仅在 0.04 的高 p 值下有意义。估计值与民意测验的估计值大相径庭。
3。具有实体固定和时间固定效果的固定效果模型
仍然可以省略变量,这些变量可能随时间变化,但在不同状态下是恒定的。通过为时间创建虚拟变量,使用具有时间固定和实体固定效应的固定效应模型,将从这些省略的变量中消除偏差。
代码
结果
- 第 1 部分:实体固定和时间固定效应模型显示,Pb1064、pop、平均收入和 pw1064 的估计值与零没有显著差异,没有携带权利法比有携带权利法增加了 2.8%的暴力率
- H-Null 为 Pb 1064 = 0 & pop = 0 & avg . income = 0 & pw 1064 = 0 的联合假设检验表明,所有四个变量都不显著
- 第二部分:没有 Pb1064、pop、avg.income 和 pw1064 的实体固定和时间固定效应模型表明,没有携带权法律比有携带权法律增加暴力率 2.8%,这也意味着有携带权法律比没有携带权法律减少暴力率 2.8%。“应”变量也很重要,估计值与集合模型相比有很大不同
结论
- 对“具有实体固定和时间固定的固定效应”和“具有实体固定的固定效应”模型的估计表明,有携带权法律比没有携带权法律降低了暴力犯罪率,但仅降低了不到 4%
- 这也与第一部分的调查结果一致,即“携带权法律在降低暴力犯罪率方面是有效的”
- 还有其他研究表明,更多的枪支导致抢劫率(入室盗窃率)上升。这项研究只关注暴力犯罪率
谢谢你的阅读。如果你喜欢这篇文章,给它一些掌声👏。希望你有一个伟大的一天!
“做一些有趣的事情”
原文:https://towardsdatascience.com/do-something-interesting-50a3876a1af3?source=collection_archive---------8-----------------------
不要用数据、AI、ML“做一些有趣的事情”——做一些以人为中心的事情
如果你是一个拥有大量数据的团队,你多久会听到经理、主管和产品人员提出“做一些有趣的事情”的要求?我猜很多。
当构建人工智能、机器学习和深度学习系统时,请求可能是“做一些比我们人类能想到的更好的事情。”
在设计领域,要求澄清之后会说“当我看到它的时候我就知道了”
但是,真的很难!你从哪里开始?
之所以这么难,是因为洞察的观念被颠倒了。不应该是看数据,告诉你一些有趣的事情。它是关于理解这个世界,理解人们所面临的问题,并通过实验来建立对这种理解的信心。
数据本身,无论有多少,都只是“是什么”,而不是“为什么”。通过理解“为什么”,我们可以为人们的问题找到更好的解决方案。更多的数据胜过更好的算法除非有更多的人类目的胜过更多的数据。
寻找偶然相关性有什么问题?它们可能会分散组织的注意力,或者在最坏的情况下,它们可能根本不存在(参见“德克萨斯神枪手谬误】)。
什么是“有趣?”
一般来说,“有趣”是指被认为新奇或出乎意料的事情。当人们寻找“有趣”的东西时,他们会尝试很多不同的东西,直到某样东西奏效或者“一拍即合”
基于新奇的方法有很多优点。在Kenneth o . Stanley 和 Joel Lehman 所著的《为什么伟大不能被规划:目标的神话》中,有一些例子说明了这种注重探索的方法是如何获得比其他方法更好的结果的。
基于新颖性的搜索地址是一个正在进行中的“欺骗”问题。朝着一个特定的目标进行更有针对性的搜索看起来你走的路是对的,但实际上并不是在通往目标的路上。
目标是问题吗?
当我们朝着“有趣”的方向努力时,我们是否在回避目标?不在高管的头脑中,因为他们往往是基于时间框架的结果。
基于新颖性的搜索会有相当多的失败,并不是所有的组织(或他们的主管)都愿意失败并等待成功。这就是战略探索和利用之间微妙平衡的来源。
我们可以从路线图和关键绩效指标中学习
产品工作中有两种类似的情况可能会有所帮助:路线图和 KPI。
当设定了错误的预期时,产品路线图往往会“失败”。路线图旨在帮助理解未来,但由于世界的复杂性,我们应该做的事情随时都在变化。路线图中应包含这样的预期:随着时间的推移,路线图会发生变化,可信度也会降低。
主题路线图试图将重点放在你试图解决的问题上,而不是你试图推出的功能上。我发现它们比基于功能的路线图更成功。
KPI 类似于目标,因为它们是组织将监控和采取行动的对象。人们并不总是理解,随着市场、客户和组织的变化,这些 KPI 也应该变化。假设它们可以设置一次并永远遵循是不恰当的。
对于路线图和 KPI 来说,了解如何关注问题并学会改变是关键。写得不好的目标可能会在你理解问题之前预设一个解决方案。当他们正在解决一个现在对某人来说很重要并且以后可以改变的问题时,他们会很有帮助。
当我们的目标不再合适时,我们如何理解?我们如何知道何时改变我们的模型?要做到这一点,我们需要从当今世界的运作方式入手,并从中学习。
以人为本
在 HBR 最近的一篇文章“当数据科学家和设计师一起工作时会发生什么”中,有一个重要的方面是数据科学家(或 AI/ML 工程师)如何:
与狭隘地专注于研究新的统计模型或构建更好的数据可视化的数据科学版本不同,设计思维方法将数据科学家视为创造性的问题解决者。
我们这样做的方式是关注人们所面临的问题。你可以通过与你希望帮助的领域的专家交谈来做到这一点。那些专家知道真正的问题是什么。从这些对话中获得的见解将帮助您利用数据来了解问题是如何表现出来的。
在你知道了真正的问题之后,你就需要让团队中许多不同的人参与到解决方案中来。这既包括行业内外的技术人员,也包括非技术人员。
在这种情况下,专家并不总是能帮上忙。事实上,他们可能会限制团队用旧的方法解决问题,而不是允许新的方法。
一旦你有了确定问题的解决方案,和你试图帮助的人一起测试你的解决方案的原型。听他们的话闭嘴。
这种以问题为中心的思维,与真正的用户交谈,共同创造是设计思维的基石。在做数据科学、人工智能、人工智能、深度学习或其他智能系统时,没有足够的时间。
在实践中
在 Philosophie ,我们发现以人为中心的设计和跨团队合作的基础为找出真正重要的东西提供了合适的平台。特别是对于人工智能和人工智能项目,可能需要几个月的时间来建立一个完全训练好的模型。
An Empathy Map for the Machine from our LA workshop
我们对机器使用移情映射、困惑映射、挑战映射、疯狂八,以及其他练习让人们达成共识,而不会陷入人工智能术语的泥潭。这对你能与之打交道的设计师、产品人员、高管和客户尤其有帮助。技术和非技术角色之间的共同创造(和彻底的合作)获得了问题的所有角度和可能的解决方案。
此外,通过原型了解问题和快速测试解决方案也非常有效。甚至在你投入巨资构建完整的解决方案之前,比如一个专注于人工智能的 MVP 。
而不是仅仅“做一些有趣的事情”,做一些有影响力的事情来解决人们的问题。
关于克里斯·巴特勒
我帮助团队理解他们应该用以人工智能为中心的解决方案解决的真正的商业问题。我们工作的团队通常被要求用他们拥有的数据“做一些有趣的事情”。我们通过偶发事件相关性帮助他们避免局部极值,并专注于解决巨大的业务问题。我的背景包括在微软、KAYAK 和 Waze 等公司超过 18 年的产品和业务开发经验。在 Philosophie,我创造了像机器的移情映射和困惑映射这样的技术,以便在构建人工智能产品时创建跨团队的一致性。如果你想了解更多或通过、、LinkedIn 或访问、http://philosophie.is/human-centered-ai与联系。
NBA 顶级球员推特账户的情感分析——第一部分数据收集
原文:https://towardsdatascience.com/do-tweets-from-nba-leading-players-have-correlations-with-their-performance-7358c79aa216?source=collection_archive---------24-----------------------
<本文其他部分的快速链接>
第一部分数据收集
Part2 推文数据清理
Part3 情感分析&聚类
Part4 绩效之间的相关性测试&情绪
摘要
我们知道,一个团队中的领军人物对赢得比赛起着至关重要的作用。因此,我们很好奇球员在比赛前的情绪是否会与他们的表现甚至比赛结果相关联。为了衡量这种影响,我们选择 twitter 作为衡量球员情绪的工具,因为大多数 NBA 球员都在 Twitter 上发表自己的观点或想法。
但是,评价联盟中每个球员的推文是很费时间的;因此,我们将只关注根据ESPN.com排名的前 10 名玩家。现在有人可能会开始争论为什么这些人是每支球队中最好的球员,但是这里我们使用了一个示例网站,而不是任何个人偏好。
在分析中,我将使用 Python 作为编程语言,这个主题将涉及诸如 web 抓取、聚类、数据可视化和自然语言处理等技术。
韵律学
既然最终目的是衡量情绪和游戏表现的相关性。这里的情感评分是通过基于极性和化合价计算正面或负面评分。我们稍后将讨论这一点。
至于性能,我们在本文中使用高效场目标(eFG) ,因为它在简单性和准确性之间取得了良好的平衡。
eFG 公式:(FG+0.5 * 3P)/FGA
第 1 部分的先决条件
在我们开始之前,这部分需要这些包:
不要慌!包的细节将在整篇文章中解释。
但是在事情开始之前,记住你应该已经有一个 Twitter 开发者账户,否则你不能继续这个过程。
请注意,consumer_key、consumer_secret、access_token 和 access_secret 应该使用您的令牌。不要与任何人分享!!
数据收集的步骤
知道我们正在寻找球员的推文和表现之间的关系。在我们开始分析之前,将有四个资源来完成数据收集。
- 从ESPN.com获得前 10 名玩家的名字
- 从 reference.com收集 NBA 球员的推特账号和他们的名字列表,将前 10 名球员的名字和他们的推特匹配
- 废弃 reference.com上匹配玩家的统计数据
- 抓取玩家的推文以及每条推文的创建时间。
下图显示了这些数据是如何连接和匹配的:
数据的前三部分将通过网页抓取技术收集。这里我们使用 Python 的 请求 和beautiful soup包进行提取。Requests 包是 Python 的高级 HTTP API,其中一半的抓取任务可以在这个函数中完成:requests . get(yout _ URL _ link)。这个功能下载 HTML 内容到你的电脑,不做任何修改。
然后,我们需要的是应用 BeautifulSoup 来解析数据。我们只需右键单击您想要的内容,然后单击“检查”然后网页源代码瞬间出来,通过 标签 找到确切内容。注意,标签是一种可以被搜索引擎检测到的标记词。通常,标签会附上不同种类的单词,称为属性。例如,术语“是标记, href 是属性名,URL 后面是属性 href 的值。当然,就是我们要找的内容。**
现在,这才是开始!
Image from ESPN.com
1.从ESPN.com获得前 10 名玩家的名字
2.收集 NBA 球员的推特账号和他们的名字
上述结果以如下的字典格式存储:
这些名字是字典的关键,他们的 Twitter 账户就是这些值:
3.废弃reference.com上匹配玩家的统计数据
现在,这部分是关于提取球员在球场上的表现的数据。我们正在统计 2016-2019 赛季的数据,但在这里我们遇到了一些问题。每个 URL 会根据每个玩家的不同而不同,URL 没有固定的模式。因此,我现在想到的唯一方法是列出每个玩家的所有 URL。之后,我们根据每个玩家的网址计时,得到我们需要的全部网址。
在我生成 URL 之后,我将它们发送到下面的函数中。在这里,我们收集了比赛时间、比赛结果、投篮命中率(FG)、尝试投篮命中率(FGA)和三分球命中率(FG3)。此外,我们有很多“如果…否则”语句的原因是,reference.com用特定的词标记记录,如果玩家没有玩游戏,例如“不活动”或“没有玩”
然后,我们将列表类型的数据改造成数据框架。在这里,我们还将数据类型转换为正确的格式,并通过将“int”类型指定为“int16”来最小化数据大小。回想一下,我们衡量玩家的表现和他们的推文。我们定义的绩效是有效飞行目标(eFG),,公式是 (FG + 0.5 * 3P) / FGA 。
该图显示了我们收集的一个玩家数据:
现在,Twitter 来了,我们开始根据刚刚得到的账户抓取推文数据。
4.获取玩家的推文以及他们每条推文的创建时间
这里的功能看起来很复杂,但它只是获取推文、关注者数量、朋友数量、最爱数量,并将他们的表现和球员姓名的统计数据组合到一个巨大的数据框架中。
注意:
记住添加 tweet_mode = 'extended' 以获得完整的字符数,否则每条 tweet 上只能获得前 140 个字符。此外,只有 tweepy。光标()。items(1000) api 可以访问超过 200 条推文。 api.user_timeline(id = ID,count = 200) API 有这个限制。
此外,我们发现科怀·伦纳德已经很多年没有发微博了。所以我们需要删除科怀·伦纳德。抱歉莱纳德。
数据收集到此结束,在下一章,我们将对 tweets 进行一些数据操作。
我们停下来想一想为什么吗?
原文:https://towardsdatascience.com/do-we-pause-and-think-why-748e67ec7e51?source=collection_archive---------13-----------------------
当我们奔向…
Fig 1: Pause….(Source: Reflections)
本文分为两部分。第一部分是数据科学/机器学习/人工智能社区。 第二部分是为工作的父母或即将为人父母的人。
我们为什么要在人工智能和相关领域做我们今天正在做的事情?我们有时间停下来思考吗?
我不会在这里回答“为什么”。我想做的是向读者提出一些问题,以便他们找到自己的答案。我们开始吧:
我们停下来试着想象一下 20 年后的世界会是什么样子吗?在某种意义上,当我们学习和应用时间序列时,我们是否会想到,我们的大脑在直观地关联所有经验和预测未来方面要好得多?我们把技术和现实生活联系起来了吗?
某些思维过程不断在我们的大脑中发生,但我们大多数时候并没有意识到它们。有时候梦能让你更好地了解他们。有一天,一件事可能会自然而然地让我们意识到什么对我们来说才是重要的。可能是读一本书,或者去一个不同的地方,或者在极端的情况下——一个人自己的家庭或朋友圈里的悲剧/健康问题可以引发更高层次的思考。
如果我们想成为数据科学家,开发更高的价值观是极其重要的。我不需要举任何例子;因为我不是一个新闻狂——我认为可以有把握地假设读者知道的比我多得多。我们都知道数据可以用来做好事和坏事。
我们想成为什么样的数据科学家?我们在忙着运行笔记本的时候会停下来思考吗?
在第一份工作中,我们可能没有选择去寻找我们的意义,但是我们能坚持多久呢?我们什么时候才能实现这种转变,去做我们关心的事情?我们是要忘记我们从哪里开始,我们是如何得到支持的,还是要把它全部向前传递?看这个例子:直接给。GiveDirectly 是一家在东非运营的非营利组织,通过手机向极端贫困的家庭无条件转移现金来帮助他们。give 直接向肯尼亚、乌干达和卢旺达的人们转移资金。听起来有点奇怪,对吧?人们可能不指望它能起作用,但它能起作用,不会被滥用。它正在得到数据科学/机器学习的帮助。这些都没有给予太多的宣传,但如果我们的心是为了做好事,我们肯定会听到。Datakind 对社会有益。所有这些都可以通过谷歌搜索“社会公益数据”找到
当我们忙于努力在工作中保持竞争力或渴望成为数据科学家(在大多数情况下还有另一份全职工作)时,我们给予配偶/孩子足够的关注了吗?
我们在育儿方面遵循同样的科学方法吗?我们中的一些人是由充满爱的一代人抚养长大的,但他们不知道养育孩子的技巧,也没有机会得到温柔的养育。我们是要把我们的一些人格扭曲遗传给我们的孩子,还是要从现有的数据中进行自我教育?
我们是要在婴儿/蹒跚学步的最初几天读几本育儿书,然后开心地忘记更新自己,还是要在他们成长的过程中不断学习,以迎合他们不断变化的情感需求?
这可能听起来像是题外话,到了段落的结尾,就不是了:
我在 LinkedIn 上看到一些让我害怕的讨论。人们对那些停下来照看婴儿的人有一种不言而喻的偏见。辞职或休息时间超过 6 周不好吗?这是否意味着这个人不是职业导向型的?或者它能告诉我们一个人的自信、分清主次的能力、将团队(在这里是家庭)置于自我之上的意愿吗?养育了两个孩子,让我写下:婴儿一点也不好玩,尤其是在晚上。他们是强硬的老板。老板通常是理性的,婴儿是感性的。他们“现在”就想要结果。他们不能说话,即使他们认为他们在说话。
休息不是为了享受孩子而不是事业。有时可能是因为缺乏支持系统。有时,这可能是父母有意识的决定,给宝宝一个难忘/安全的人生起步。这并不意味着职业不那么重要。这意味着事业同样重要,但不是当时的优先考虑。当该休息回来时,婴儿会平静地进入日托所。因此,休息一下比试图一次处理太多事情要好得多。对于不愿意休息的家长,我有一个问题。你有没有停下来想一想,这里(家)和那里(工作)你会失去什么?我也有一个类似的问题,想问那些对休息的父母有偏见的老板。你有没有停下来想一想因为不支持新父母而可能造成的损失?或者更好的是,从长远来看,支持这个高度进化的人会有什么潜在的好处?
有一个概念叫做用心育儿【谷歌一下,挑一本书】。几年前我读过一本这方面的书。它有关于为什么来自某些文化的人比其他人更友好的案例研究。他们都指出这样一个事实,即在婴儿时期,他们有机会与母亲在一起更长时间,他们的父亲在他们的成长过程中也扮演了积极的角色。
我们对情绪智能的未来和对人工智能的未来一样有意识吗?如果在使用人工智能的人当中没有同样强大的人工智能,人工智能能有什么用?
希望我们大多数人都知道,出生到 6 岁是孩子一生中最重要的时期。他们得到了终生难忘的印象。团队工作能力和心里承载的情商和善良程度密切相关,不是吗?
Simple, yet powerful quote right? (source: Quotes Valley)
我希望作为聪明的专业人士,我们也能把我们的智慧应用到个人和社会的方方面面。在这篇文章中,我可能会重复,但那只是因为我对建设一个高品质的社会有强烈的感觉。如果我们开始在家里建造它,这是可能的。
如果你喜欢我的想法,请回应或鼓掌鼓励!:)谢谢。
如果您想了解我的想法、数据科学内容,请在 Twitter 上关注我
你的团队中有数据英雄吗?
原文:https://towardsdatascience.com/do-you-have-a-data-hero-on-your-team-e4ddc318926e?source=collection_archive---------7-----------------------
商业分析和商业智能
您知道每天会产生惊人的 15pb 新数据吗?如果你想把它形象化,这相当于大约 3 亿个四屉文件柜的纸。企业如何处理所有这些数据?
答案可能会让你大吃一惊。今天的企业每天都在发现收集和使用数据的新方法,这意味着发展解释数据的能力可以在几乎所有可以想象的业务运营中做出更明智的决策。
业务分析涉及通过统计和定量分析、数据挖掘、预测建模以及其他用于识别趋势和理解推动业务变革的信息的技术,对来自许多后端系统的历史数据进行探索和分析。商业分析是使用任何东西发现洞察力的行为:任何你可以使用的工具或服务。
商业分析位于商业和数据科学的交叉点。它通过统计和运营分析获取业务数据(如客户关系指标),并得出对各种业务功能的见解。业务分析使组织更加知情,并为更好的决策提供洞察力。业务分析通过混合使用数据、统计和定量分析以及解释性和预测性建模来帮助制定可行的决策,从而使业务领导者具备提高业务绩效的技能、洞察力和理解力。此外,业务分析可以提高成本效率。它帮助组织快速响应用户对数据可用性的需求,提高竞争力,并生成组织或业务信息的单一统一视图。业务分析为能够发现、分析和监控大数据的组织提供了巨大的价值。
业务分析包括数据挖掘、预测分析、应用分析和统计,并作为适合业务用户的应用程序交付。这些分析解决方案通常附带针对行业业务流程(例如,索赔、承保或特定监管要求)的行业解决方案。
虽然它通常被称为商业智能领域,但在过去 10 年中,谷歌搜索“商业分析”的数量急剧上升,而“商业智能”的数量略有下降。
业务分析的使用在所有领域都呈指数级增长,包括医疗保健、保险、政府、零售、电子商务、媒体、制造业和服务业。
在当今不断变化的业务环境中,业务分析师的角色正在从一个专注于收集需求的角色转变为一个帮助调整和推动组织战略的角色。传统的商业智能(BI)主要集中在报告信息上。在这种方法中,报告由少数人创建,通常是报告开发人员,许多人可能知道这些职位是 SQL 报告编写人员,因为这正是他们所做的,从 SQL 数据库生成报告。然后,这些报告被分发给整个部门或组织,以采取有利于业务的行动。目前的趋势是远离这种实践,更多地进入真正的业务分析,而不是为那些对自己的数据有疑问的人提供工具来获得他们自己的答案。现在是让商业人士自己成为分析师。
其结果是,越来越需要具有分析管理方法的员工,他们能够利用数据,理解统计和定量模型,并能够做出更好的数据驱动的业务决策。
如今,企业的每个部门都应该使用业务分析。首席信息官们明白这一点,并看到这一点在他们的预算中得到了体现,各行各业中有 64%的首席信息官在大数据方面进行了大量投资。这些数据用于指导销售、营销、产品开发、生产、客户服务等。大数据洪流需要一位能够帮助职能部门从数据中获得最大洞察力的首席信息官。
由于大数据的使用和分析只是在最近几年才出现,因此很少有经理具备数据领域的高级专业知识。即使是新的管理者和领导者也不具备整合数据驱动战略的技能。大多数组织需要一种精通数据驱动的业务领域的新型人才基础。一份麦肯锡报告估计,到 2018 年,美国将面临 14 万到 19 万数据科学专业人员的短缺。即使是现在,公司也必须支付非常高的薪水来雇佣数据分析师。
数据英雄
这种新方法是对数据英雄的发展:在日益以数据为基础的商业环境中,数据英雄是不可或缺的资产。数据英雄需要了解业务,并在支持业务流程的系统如何工作方面有经验,同时能够解释流程、数据和数据使用方式之间存在的依赖关系。这个人需要成为解决问题的专家:当某件事“做不到”时,他们会挺身而出去完成任务。数据英雄将为统计分析准备数据,执行基本的探索性和描述性分析,并应用统计技术分析数据,以进行商业建模和决策。
业务分析的目标是开发成功的分析模型。它模拟场景来预测未来的情况。这是一种预测未来趋势的非常技术性的方法。这个过程有助于在分析以前和当前的数据后找到模式。该分析用于设计未来的行动方案。数据英雄、商业分析专家使用数据挖掘、描述性建模和模拟。
商业智能使用不同类型的软件应用程序来分析原始数据。在这个领域工作的专业人士研究商业信息。他们与决策经理密切磋商。他们识别现有的业务问题,分析过去和现在的数据,以确定性能质量。他们使用 KPI 和其他指标,并准备易于阅读的报告。这些报告提供了对业务运作的独特见解,并使组织能够做出最佳的业务决策。
商业分析专家帮助预测未来会发生什么。他们用数据来分析在某些特定条件下会发生什么。他们可以预测接下来的趋势和结果。
另一方面,商业智能专家帮助跟踪和监控数据和商业指标。他们能正确地识别出发生了什么和现在正在发生什么。他们可以发现某件事发生了多少次,以及这些事件是何时发生的。
随着商业智能和商业分析领域的不断发展和壮大,组织必须意识到这些术语之间的区别,并理解它们的价值。商业智能和分析工具的采用和使用没有放缓的迹象。理解这些概念对于做出最佳商业决策、保持所有行业的竞争优势以及让公司获取运营和战略价值至关重要。
您知道数据可视化中“显示数字”的三种不同方法吗?
原文:https://towardsdatascience.com/do-you-know-the-three-different-approaches-to-show-the-numbers-in-data-visualization-f5ab59faba83?source=collection_archive---------9-----------------------
Photo by Marius Masalar on Unsplash
你是想获得洞见、交流还是做艺术?
随着大数据的出现,可视化数据变得越来越流行。使用视觉通道来思考数据和获得洞察力的想法并不新鲜。1854 年,一位名叫约翰·斯诺的伦敦医生是第一批使用点阵地图来识别霍乱受害者的人之一。通过在地图上将霍乱的受害者标为一个点,并将其与附近的水井进行对比,他可以得出结论,这些水井可能是传染性细菌的来源。
然而现在,数据可视化通常包括在 Excel 中快速绘制成条形图或时间线的销售数字。
使用数据可视化有区别吗?我认为使用视觉来与数据互动有三种不同的用途,它们服务于不同的目的,但经常被混淆和互换。
首先,你可以使用数据可视化来获得洞察力 Snow 先生在这个例子中就是这么做的。
其次,你可以使用可视化来表明观点——支持一个论点,或者在数据本身中提出一个论点。
最后,数据可视化可以是纯粹的艺术,你可以从你的数据源生成美丽的颜色星座。
探索者:获得洞察力
我们收集的大多数数据,无论是在科学领域还是其他领域,都是由简单的值点字段组成的。如果你出去记录一天中每小时的温度,你会得到 24 组数据点:时间和温度。记录这些数据很可能是以表格的形式。此刻你唯一使用的渠道是数字和文本。当你用软件或简单的纸笔以任何方式绘制这些数字时,有趣的飞跃就来了。你会得到一条曲线,让你从测量中获得洞察力。正常夏日的温度曲线可能是从凉爽的早晨到炎热的下午平稳上升,随后是太阳落山时的凉爽期。平均每天的温度,并在一年内重复这项运动,你会得到一条相似的曲线,一条显示夏季和冬季之间差异的曲线。
https://en.wikipedia.org/wiki/File:AtlantaWeatherGraph.PNG
由于我们是非常视觉化的动物,将数据以视觉形式呈现出来通常能让我们看到在成堆的数字中我们无法发现的模式和联系。数据变得越大,我们就越必须依靠算法(又名机器学习)来指出显著的统计联系,或者我们必须找到将数据可视化的方法,“自己去看”。
许多科学和商业报告利用数据的展示来显示数字,但往往让读者去提取关键信息。
沟通者:表达观点
一旦你把你的数据放入一个表格,允许你检索你能得到的任何“证据”,你就可以用这些数据来支持你的主张。不幸的是,我们从未真正学会如何做到这一点——从“展示”数据到“使用”数据作为额外的证据。然而,它应该是我们交流的核心:作为作者,你有责任提出你的观点,并添加支持它的信息。
那为什么统计数据和其他可视化数据往往被置之不理,没有评论或亮点?
夸张一点,就像说:这是我的论点,后面是 300 字的清单。你可以选择这些单词中的哪些来支持我的论点。
听起来很傻?然而,在糟糕的数据可视化中,没有焦点和亮点,这几乎是读者或听众必须做的事情。
“看这些线,它们各自向上的斜度就是我所说的证据”。
如果您选择交流您的见解,并希望使用数据来支持论点,请为相关数据添加亮点,注释要点,并帮助读者理解您的图表。可读性和清晰性是这一步的重点。更多还可以在我的文章中找到。********
艺术家:作为艺术的数据
除了产生“有用”的见解,数据还可以产生艺术。我们真的不能指望从这些展示中学习任何东西,或者用它们来建立论点。然而,数据艺术和巧妙的数据可视化可以作为思考数据在我们世界中的重要性的一个有趣的切入点。
https://www.flickr.com/photos/walkingsf/4671589629/in/album-72157624209158632/ Locations of pictures taken by locals and tourists.
无处不在的数据收集会对我们的生活产生什么影响?如果我们免费提供我们的数据,这是监视吗?可以通过哪些积极和消极的方式利用这些数据?我记得有一个例子,美国军事基地出现在公共地图上,因为一个健身跟踪设备服务收集并在网上发布数据供所有人查看。
结论
视觉通道对于思考我们收集的数据很重要。如果你在处理数据,花点时间思考一下你目前的步骤是什么:你在探索数据吗?你是否试图利用这些数据进行交流——如果是的话,你是否强调了数据中的信息以帮助读者?或者你只是在寻找一种方法让数据看起来有趣而巧妙?
如果你喜欢这篇文章,请按几下“鼓掌”按钮或发表评论。我会定期在我的个人资料上发布关于技术、科学、数据可视化和创新的内容,如果这些内容与你相关,请关注我。
你知道数据贴标签机是做什么的吗?
原文:https://towardsdatascience.com/do-you-know-what-does-a-data-labeler-do-98561cb0029?source=collection_archive---------5-----------------------
日子一天天过去,但争论仍在继续,信息和通信技术部门正在通过自动化通常由人力执行的任务来消除工作岗位。据估计,由于自动化活动的兴起,到 2030 年,中国将减少 2.36 亿个工作岗位,印度将减少 1.20 亿个工作岗位,美国将减少 7300 万个工作岗位(麦肯锡全球研究所,2017 年)。事实上,随着技术的发展,人工智能和物联网的结合将不可避免地消除世界各地的许多劳动力。然而,也有很多新的机会被创造出来,数据标签只是其中之一。
数据标签是人类在机器学习和人工智能应用程序上对数据的人工管理。标记数据是必不可少的,因为计算机有无数的局限性,其中一些在没有人类干预的情况下无法简单解决。事实上,计算机可以被编程来执行艰苦的计算和自动化的活动,这些活动对我们来说太繁琐了,无法通过手动来完成,然而,如果没有适当的训练,计算机无法区分照片中的汽车和狗。总之,计算机使用算法在数据集中进行学习,这通常需要有人监督。粗略地说,我们称之为有监督的机器学习,因为计算机需要人的监督来接受训练,以执行对机器来说很棘手,但对人类来说肯定很容易的任务,如图像识别。因此需要一个数据标签。
训练一台机器的工作量可能是无穷无尽的。假设您想训练一个模型来检测街上的狗,但由于狗的大小、颜色和形状会因品种而有很大差异,您首先需要确保您的模型既不会出现高发生率的假阳性,也不会出现高发生率的假阴性。请记住,当在涉及监督机器学习的复杂现实项目中工作时,可能需要几周甚至几个月才能达到预期的结果。
由于编程技能最初不是一个要求,只要候选人喜欢技术并愿意学习新工具,几乎每个人都可以成为数据标签员。最重要的是,随着人工智能和机器学习的兴起,数据标签的数量预计将在未来几年大幅增加。像 IBM、谷歌、脸书这样的公司以及游戏行业和市场营销领域的许多公司已经在招募新人,准备立即开始工作。
你以前听说过数据标注吗?请与我们分享您对数字革命和未来机遇的看法。=)
数据科学需要研究生学历吗?
原文:https://towardsdatascience.com/do-you-need-a-graduate-degree-for-data-science-8e3d0ef39253?source=collection_archive---------2-----------------------
也许是这样。也许不是。
我跟你说实话:我是个博士辍学生。
顺便说一句,这个头衔让我受益匪浅:它暗示我读了很多研究生,但仍然保持着只有“辍学”这个词才能提供的坏蛋光环。从某些方面来说,这是一种终极的谦虚吹牛。博士毕业,万中无一。但是两年半之后,你就成了一个的急躁的书呆子。人们会想知道你接下来还会做些什么。“埃隆·马斯克从研究生院退学了,”他们会说。“这家伙可能就像埃隆一样!”
虽然从研究生院退学对我作为一个不可预测的、玩四维象棋的、躲在壁橱里的书呆子天才的名声有很大的好处,但我越来越清楚,成为一名博士退学者的两个关键因素并不适合所有人:1)开始攻读博士学位,2)退学。硕士也是如此。这对一般有抱负的 STEM 专业人士来说是正确的,但对有抱负的数据科学家来说更是如此。我马上会解释原因。
但是首先,你可能想知道我是怎么知道的。
事情是这样的:我在一家数据科学导师创业公司工作。通过这项工作,我可能采访了 1000 多名有抱负的数据科学家——有些人有博士学位,有些人有硕士学位,有些人有本科生,有些人在中间的每个阶段都辍学了。这给我留下了一件罕见而珍贵的东西:数据科学职业故事的统计显著样本。
下面是我从这些故事中学到的:在某个时间、某个地点和某个人身上,不同的学位是有意义的。但是因为大多数人求助于大学和学院的研究生导师来决定是否去读研究生,他们在签约之前往往不了解事情的全貌。
因此,听听一位前学术出身的初创企业创始人的话:不是所有的学位都适合所有人。原因如下。
1.博士学位
[警告:这将会让很多拥有博士学位的人感到不安。我提前道歉。]
“我发现很多数据科学工作都需要博士学位。我需要博士学位才能成为数据科学家吗?”
天啊,没有。什么都没有。
不要误解我的意思,在你的电子邮件结尾加上这三个额外的字母绝对是一个加分项。有时候我真希望自己只是因为这个原因才留下来。但是现实来了。
如果你的目标是成为一名数据科学家或机器学习工程师/研究员,博士学位可能是一个不错的选择。但也有两大原因可能不是这样:
- 获得博士学位需要很长时间。
- 除非你从“正确的”导师那里获得“正确的”博士学位,否则你不可能学到任何有价值的东西。
第一点:在美国或加拿大,完成一个博士学位需要 4 年到 7、8 年的时间。完成的平均时间通常是 5 或 6 年,视机构而定。现在让我们来看一下这个问题。
你知道 5 年前数据科学中没有什么东西吗?Spark,XGBoost,jupyter 笔记本,GloVe,spaCy,TensorFlow,Keras,Pytorch,InceptionNet,ResNet,强化学习(喜欢,基本上一点都不喜欢)等。
因此,除非你决定在这些东西出现时自己去了解它们(在这种情况下,我不确定研究生院是否值得称赞),否则你的博士学位可能会让你处于 2012 年被低温冷冻的人的位置,而今天却被重新激活成一个完全的新手。你会发现自己置身于一个勇敢的数据科学技术新世界,无论如何,毕业后你都必须自己学习。
关键是,数据科学和机器学习的发展非常快。他们将来只会走得更快。因此,如果你正在考虑攻读数据科学或机器学习相关领域的博士学位,并且你的目标是有朝一日在行业中工作,请记住,你实际上是在你专攻的领域上下了赌注:你指望它在你最终毕业时既相关又受欢迎。这可能是一个风险很高的赌注。
第二点:花点时间想想谁会监督你,为什么他们不在谷歌或脸书工作。
当然,也有人干脆更喜欢学术研究,而不是在工业界做数据科学或机器学习。但值得记住的是,提供给行业顶级 ML 人才的金额足够高,以至于留在学术界的人肯定会面临向下的选择压力。
当然,在某些地方,你总能找到这条规则的例外。这些通常是超级精英项目,如加拿大的 Vector Institute 或 MILA,或美国麻省理工学院和伯克利分校的数据科学项目。当你看到它们时,你会知道它们,但请记住,你的州立大学,或世界排名“前 200 名”的学校,可能不会是其中之一。
综上所述:如果你只对成为 Airbnb 的深度学习工程师感兴趣,那么当然,博士学位可能是相对较少的入门途径之一。但是,如果你没有在白金+项目中攻读博士学位,就不要指望被白金+公司聘用。
但是如果你正在寻找一个更典型的(更现实的)数据科学角色,博士学位很少是正确的选择。你最好把这 4 到 8 年的时间花在获取实际数据科学家的工作经验上,在那里你会学到新技术,在那里你会更好地预测新趋势并走在它们的前面。
哦,如果你正在考虑攻读一个与数据科学完全无关的领域的博士学位(例如,物理、生物、化学),并且你的目标是一个数据科学的角色,这里有一个有用而又苛刻的启发:如果你距离毕业还有 18 个月或更长时间(并且你真的确定你想成为一名数据科学家),就退学吧。沉没成本谬误会让你对这一策略产生怀疑(你应该这样做),但根据我的经验(从统计数据来看),这更有可能是正确的举措。
2.理学硕士。
做数据科学需要硕士吗?
看情况。这是我刚做的记分卡。把适合你的分数加起来,如果总数大于 6,那么答案是“可能硕士学位会有帮助。”
- 你有“硬”STEM 背景(物理/数学/CS 本科或其他学位/文凭): 0 分
- 你有“软”STEM 背景(生物学/生物化学/经济学本科或其他学位/文凭): 2 分
- 你有非梗背景: 5 分
- 您使用 Python 的经验不足 1 年: 3 分
- 你从未做过涉及编码的工作: 3 分
- 你觉得自己不擅长自主学习: 4 分
- 当我说这个记分卡基本上是一个逻辑回归算法时,你没有理解我的意思: 1 分
注意事项:
→需要考虑的是,你是需要一个数据科学的完整硕士学位,还是一个训练营。如果你选择参加训练营,请记住他们的动机:你是否被要求提前支付费用,但不能保证之后会被雇佣?训练营有相关的职业服务吗?
→大多数人对训练营持怀疑态度。理应如此。但大多数人忽略的是,他们应该对任何不提供安置保证的大学硕士学位持同样的怀疑态度。硕士学位是训练营。那样对待他们。如果你做了,不要关注你的成绩,关注你正在学习的东西。问问你的项目的研究生就业率是什么样的。大学有一种有趣的方式来说服他们的学生,一个简单的项目是一个好项目,或者他们让你进来是在帮你的忙。这是一个心理游戏,并且被过时的“传统智慧”所强化,即大学学位具有独立的价值。但是你的目标是被录用,而不是“投入你的时间”得到一张纸。
→即使你完成了硕士学位,你还有很多技能需要提高。可能比你想象的还要多。但是只要项目时间短(不要去 2 年以上的硕士项目),而且价格不太高,它绝对是值得的。
3.本科生
总的来说,是的,你需要一个本科学位才能成为一名数据科学家。不一定是因为你需要知识,而是因为公司还没有准备好接受自学+参加训练营和一些在线课程实际上可以让你为工作做好准备的想法(尽管在某些情况下绝对可以)。
但是本科学位有个问题。
它们不是工作。如果你和技术领域的任何人交谈,你会很快意识到技术工作>>学习技术的学校。部分原因是大学里教授的课程通常已经过时了 5 到 10 年。如果你在一个变化不大的领域,比如物理、数学或统计学,这可能没什么问题。
但是如果你在工程或计算机科学领域,你在一家很棒的公司得到了一份暑期实习,你想推迟你的学位(或退学)以获得更多的工作经验,这是你应该 100%考虑去做的事情。如果你本科的目的是找一份工作,如果你已经在一家有足够跑道让你获得前两年经验的公司获得了一个职位,那么支付更多的学费就没有什么意义了。
我绝对不是说你应该从本科退学。我想说的是,一般来说,更多的人应该更开放地接受未完成的学位,如果他们已经实习过,并转化为全职工作的具体机会。这种情况并不经常发生,但我怀疑这在很大程度上是因为许多本科生认为完成学位是“好人做的事情”
我在这里给出的建议在很多方面都是非传统的。但是在像数据科学这样一个快速发展的领域,传统往往会大大落后于最优。作为一个社会,我们对研究生教育价值的看法是传统智慧中最需要赶上现实的一个方面。
当然,这并不意味着正规教育,甚至研究生学位都不值得获得。但任何人都不应该认为需要硕士或博士是理所当然的:如果你报名攻读理学硕士只是为了符合你对良好的数据科学职业轨迹的刻板印象,你可能需要重新考虑你的策略。
你真的需要一个数据科学家吗?
原文:https://towardsdatascience.com/do-you-really-need-a-data-scientist-fcdfc226f4e4?source=collection_archive---------8-----------------------
仅仅在您的数据库中“插入”一个数据科学家不会带来预期的结果。首先,你需要确保你的数据确实有价值。
您的公司拥有数据,而且很可能是大量数据。数百万行,甚至可能是图像、音频和视频。但是还没有什么可以称之为大数据的东西。随着时间的推移,数据是通过许多系统收集的,无论是您的系统还是第三方系统,如 ERP、CRM 和其他应用程序。你把它存储在某个地方:你的关系数据库、电子表格、NoSQL 数据库或其他任何地方。它甚至可能存储在第三方数据库中(在您使用的一些软件中)。事实是:数据属于你,它被存储起来,你可以访问它。因为数据科学现在是一个热门话题,所以出现了一个常见的错觉:
如果有数据存储在某个地方,我们需要做的就是雇佣一个数据科学家。他/她一定会从数据中提取一些东西,然后转化为对我们有价值的东西。
好吧,如果你公司的现状和上面的描述有某种联系…我很抱歉。你可能真的不需要数据科学家。至少,现在还没有。让我们来探讨一个假设的场景,您雇佣了一名数据科学家。
假设场景:雇佣一名数据科学家
我在就业市场上看到的大多数数据科学家实际上只是在mooc中学过 Python、R、pandas 和 scikit-learn 的分析师。他们参加过一些 Kaggle 的比赛,没有什么职业经验。而且他们渴望在“现实世界”中展示自己的知识。
这是 21 世纪最性感的工作。 再也没有人想创建仪表盘和报表了,每个人都想和人工智能打交道。
如果你发布一份寻找数据科学家的工作,大量的候选人将会出现,你可能会面临以下情况:
- 你的面试,测试,筛选,会成功选出一个具备一些机器学习工程素质的数据科学家。他/她将具有良好的编程技能和几种算法及其应用的理论知识。
- 你将向他/她展示你的“存储在某处的数据”。然后给他/她一个开放式问题来处理。比如:我们希望降低违约风险,或者我们需要增加销售额。
- 他会尝试使用数据,应用模型和算法来回答你提出的问题。很可能会失败。
- 然后,你将开始给他一些应该交给商业智能分析师的任务,比如设计一个跟踪日常销售的仪表板,或者做一些自动化的后勤工作。
- 过一会儿,你的数据科学家会感到沮丧。他终究不能把在课程和比赛中学到的东西应用到实践中去。他将开始考虑其他公司的工作岗位,因为他们显然在做真正的数据科学——篱笆那边的草总是更绿。
- 您的企业不会从雇用数据科学家中获得预期的好处。最多,你会有一个没有动力的 BI 分析师,和一个数据科学家挣得一样多。也许你将不得不寻找一个替代的专业人士。
注意,问题不在数据科学家。他有必要的知识,并努力做好自己的工作。实际问题在于你的数据…也在于缺乏一个真正的科学家。
大多数数据科学家的最大问题是,他们实际上并不是科学家。对快速应用模型和算法的焦虑和渴望最终超过了优秀数据科学工作的重要阶段,如情境化、问题框架、实验设计和数据收集。
你的数据(很可能)是垃圾!
交易数据库(存储订单、支付、访问日志等数据的数据库)是专门为存储交易数据而开发的,交易数据支撑着应用程序。这些原始数据对数据科学来说没什么价值。构建这些数据库的开发人员没有考虑,也许也不应该考虑如何将这些数据用于分析。他们只是创建了数据模型,可以提高他们当时正在编写的任何应用程序的性能。
这些事务数据库中的数据可能格式不正确,没有文档,列名没有代表性,没有键一致性,有大量重复或缺失的行,不同来源之间的值不一致,等等。也有可能,无论是大公司还是小公司,有些流程完全依赖于电子表格。因此,您的数据库不会有变更日志或历史数据。流程和控制的缺失,会让每个事件的真相真的很难分辨。
很可能您已经在这些事务数据库上运行了一个商业智能结构。您只需将一些工具直接插入数据库或电子表格,并让一些数据分析师创建报告和仪表板。这非常有效,并为公司带来了价值。你看见了你所做的一切,一切都很好。
但是,当你开始洞察数据如何帮助你的公司增加市场份额、提高效率等等的时候,就到了。你在那里看到了所有这些数据…可用…只是用来创建一些报告和解释已经发生的事情…就等着传递更多的价值。
如果预测未来是可能的呢?优化商业政策呢?还是留住一个刚要离开的客户?你有数据——很多数据。他们在那里…焦躁不安,尖叫,催促被使用。你感觉像伊甸园里的夏娃。蛇问:“你不吃花园里任何一棵树上的果子吗?”。是的,你受到诱惑,雇佣了我在前面的假设情况中提到的那个数据科学家。
事情是这样的:将数据存储在事务性数据库中这一简单事实并不意味着你有金矿可挖。它们需要仔细加工并转化为分析基础——这个过程需要很多时间。创建分析数据库需要特定的环境,也需要了解业务特性,以便将单纯的交易转化为有意义的事情。
尽管如此,仍然存在事务性数据实际上是垃圾的情况,因为收集没有按预期进行。我遇到过这样的情况,系统没有存储所有的交易信息,或者存储了转换后的数据,使得无法返回到它们的原始组件。两年多的数据收集可能有助于开发一个奇妙的预测模型,但却增加了公司的存储成本。
让我们把事情说清楚:你有一个数据问题。你最终雇佣的数据科学家将拥有创造价值的所有工具和方法。但是,没有好的数据,他们做的任何事情都是无用的。这不是他们的错,是你的错。在这种情况下,你和数据科学家在一起的每一天,都是看到你的钱从前门离开的一天。
雇佣一个科学家。从事数据工作的人。
科学家必须处理实验的每一个步骤,从他们的构想到发表结果。他们通常是拥有物理、化学、数学、统计学或生物学学位的专业人士。他们可能不知道关于机器学习的一切,但是,在阅读的这一点上,我想我已经表达了我的观点:你不一定需要能够实现 scikit-learn 方法的人。
科研流程通常如下:
雇用知道如何这样思考的人。在面试时,不要测试候选人是否知道所有的工具和技术。相反,测试他/她是否能遵循上面的思路。寻找表明他们能够遵循科学方法中每一步的情况和证据。具备这些技能的候选人可能会在处理你的业务数据时表现出色。
科学家检验想法和假设。他失败了,学习了,最终想出了一个解决方案。如果你真的需要快速完成工作,那就雇佣一个有经验的科学家。确切了解您的数据情况,然后测试申请人的经验,验证他/她是否已经面临类似的情况。询问他采取了哪种行动,从中学到了什么。一个有经验的科学家能够更快地解决类似的问题。
学习如何使用新工具相对较快。另一方面,学习如何思考是一个漫长而缓慢的过程。通常需要四年或更长时间的自然科学学士学位,有时还需要硕士或博士学位。雇佣一个知道如何思考并具备一些数据科学工具基础知识的人,要比雇佣一个知道很多不同工具但不考虑在哪里以及如何应用它们的人好得多。这并不意味着你不应该雇用一个不知道如何编程的科学家,而是说在选择候选人时,编程技能不应该是最相关的。
你还必须重新思考你所有的流程和数据流。科学家需要了解业务环境,并了解如何收集您的数据。他/她应该对您的应用程序提出修改建议,以便在正确的时间获取正确的数据。他必须确保所有过程都是可重复的。这将要求您的开发人员改变服务,创建新的 API,并满足科学家的需求(他们必须知道如何用可靠的证据来支持他们)。您的技术团队需要给他一定的自主权,以便科学家能够创建新的数据模式、自动化流程并创建新的 ETL。
听着,这并不意味着忘记眼前的回报而只关注长远。你的科学家将致力于组织和提高数据质量。在此过程中,他/她将发现需要优化的流程,并检测一些模式。他将能够运用人类的智慧进行调整,这将在短期内产生回报。与此同时,这将使你离真正需要一个了解机器学习一切的数据科学家更近一步。
数据科学码头工人
原文:https://towardsdatascience.com/docker-for-data-science-4901f35d7cf9?source=collection_archive---------1-----------------------
Docker for Data Science
Docker 是一个为软件工程师简化安装过程的工具。来自统计背景的我过去很少关心如何安装软件,偶尔会花几天时间来解决系统配置问题。万能的上帝派来的码头工人。
把 Docker 想象成一个轻型虚拟机(我为使用这个术语向 Docker 大师们道歉)。通常有人会编写一个Dockerfile来构建一个Docker Image,其中包含了项目所需的大部分工具和库。您可以以此为基础,添加项目所需的任何其他依赖项。它的基本理念是,如果它能在我的机器上工作,它也能在你的机器上工作。
对数据科学家有什么好处?
- 时间:不安装软件包所节省的时间本身就使得这个框架物有所值。
- 可重复研究:我认为 Docker 类似于在报告中设置随机数种子。在您的机器上使用的相同的依赖项和库版本也在其他人的机器上使用。这确保了您正在生成的分析能够在任何其他的分析机器上运行。
- 分发:你不仅分发你的代码,而且还分发代码运行的环境。
它是如何工作的?
Docker 采用了(可重用)层的概念。所以你在Dockerfile
里面写的任何一行都被认为是一个层。例如,您通常会这样开始:
FROM ubuntu
RUN apt-get install python3
这个 docker 文件将在Ubuntu
层的顶部安装python3
(作为一层)。
你本质上要做的是为每个项目写下所有的apt-get install
、pip install
等等。命令放到 docker 文件中,而不是在本地执行。
我推荐阅读关于https://docs.docker.com/get-started/的教程来开始使用 Docker。学习曲线最小(最多 2 天工作),收获巨大。
Dockerhub
最后,Dockerhub 值得一提。就个人而言,Dockerhub 是 Docker 真正强大的原因。这就是 github 对于 git 的意义,一个共享 Docker 图片的开放平台。你总是可以使用docker build …
在本地构建一个 Docker 映像,但是最好将这个映像push
到 Dockerhub,这样下一个人就可以简单地pull
用于个人使用。
我的机器学习和数据科学的 Docker 图像可以在这里找到,还有它的源文件。
总结想法
就我个人而言,我已经开始在我的 github repo 的大部分(如果不是全部的话)中包含 Dockerfile。尤其是考虑到这意味着我将永远不必处理安装问题。
Docker 是软件工程师(现在是数据科学家/分析师)应该拥有的工具之一(几乎和 git 一样受到重视和尊重)。长期以来,统计学家和数据科学家忽略了数据分析的软件方面。考虑到使用 Docker 已经变得如此简单和直观,没有理由不把它作为软件开发管道的一部分。
编辑 1
如果你想看比上面提供的快速提示更有实质内容的教程,请看这个视频(跳到 4:30 左右):
Edit 2(关于 python 的 virtualenvs、R 的 packrat 等的快速注释。):
就我个人而言,我没有使用过任何其他的容器化工具,但是应该注意的是,Docker 独立于 python 和 R,并且超越了特定编程语言的容器化应用程序。
看这里是我关于机器学习和深度学习的课程(使用代码 DEEPSCHOOL-MARCH to 90% off)。
数据科学码头工人
原文:https://towardsdatascience.com/docker-for-data-science-9c0ce73e8263?source=collection_archive---------0-----------------------
如果你选择了数据科学的道路,你应该知道很多工具,比如 python 、 NumPy 、熊猫、 Matplotlib 、 SciPy 、 Jupyter notebook 、 scikit-learn ,甚至可能还有 Apache Spark …
有很多工具是为了让生活变得更简单而创造的,例如Anaconda——为开源和私人项目提供强大的协作和软件包管理。
我想展示另一个好工具——Docker。它有助于你在任何地方的工作环境。
我将展示从安装 Anaconda 和升级软件包到构建 Docker 映像并将其发布到 Docker hub 上的所有步骤。
蟒蛇
如果你刚刚开始自己的数据科学之路,你可以找到很多书籍和课程( Coursera 、Udemy……)。几乎所有地方都应该从安装环境开始。你可以使用 python 和 pip 或者安装 Anaconda。
在这里,我将向您展示如何安装 Anaconda 并更新所有依赖项。
有很好的文档如何在任何平台(Mac OS,Linux,Windows)上安装。由于我主要使用 mac,我将展示 Mac OS 的所有步骤。但是对于 Linux 和 Windows 来说,几乎是一样的。让我们打开在 macOS 上安装页面,点击Anaconda installer for MAC OS链接下载安装程序。
我来安装 Python 3.6 版本 64 位图形安装程序(569 MB) 。只需点击链接并下载它。像往常一样,在 mac 上安装软件很容易。
运行安装后,您可以看到一些步骤。单击下一步:
你可以看到一些安装信息,点击下一步:
阅读许可证:
然后单击下一步:
您需要同意许可证:
选择安装位置:
对于所有的包,我们需要将近 2 Gb 的磁盘空间。单击安装:
等待:
就这么定了。我们可以删除安装程序:
要测试它,只需打开终端并运行命令 conda :
Conda 是一个针对任何语言——Python、R、Ruby、Lua、Scala、Java、JavaScript、C/ C++、FORTRAN——的包、依赖和环境管理。
下一步是更新所有依赖项。我们需要更新 conda、anaconda 和所有软件包:
conda update conda
conda update anaconda
conda update --all
即使您刚刚安装了 anaconda,您也可能需要更新一些软件包。
最终我们可以看到
仅此而已。为了测试它,我们可以运行 jupyter notebook:
jupyter notebook
并在浏览器中查看:
为了当地的发展仅此而已。但是如果你需要为其他 PC 共享你的环境(家庭和工作或者为团队共享),你应该使用 Docker。
码头设备
要使用 Docker,我们需要安装它。打开文档页面。我们将使用社区版 (CE)版本,因为它是免费的,对我们来说没问题。
和之前一样我选择 Docker for Mac (macOS) 。
我会使用稳定频道
点击链接并下载。打开后,只需拖放它
在你的程序中有了它之后。运行它:
您会看到图标
起作用了。让我们在命令行中运行它:
我写了一篇文章,描述了一些有用的案例:使用 Docker 做正确的事情。我建议在我们继续之前阅读它。
Docker 图像
下一步是创建一个图像并保存在 github 上。我希望你有 gihub 帐户。如果没有,很容易创建它。
接下来我将展示如何创建 Dockerfile 和构建映像,运行它和停止它。但是在我们需要创建工作目录和空 Dockerfile 之前:
mkdir docker-data-science
cd docker-data-science
touch Dockerfile
并在您最喜欢的 IDE 中打开它。因为我们已经安装了 jupyter 笔记本,所以我们可以使用它:
打开它
我将为我们的映像使用 linux 的 Ubuntu 版本。这是最流行的 linux 发行版。你可以在文档中阅读如何安装 Anaconda for linux。不像 mac os 那么容易。
让我们打开下载页面,复制 Python 3.6 64 位(x86)安装程序(525 MB) 的链接。
这是我们的文档:
# We will use Ubuntu for our image
FROM ubuntu# Updating Ubuntu packages
RUN apt-get update && yes|apt-get upgrade# Adding wget and bzip2
RUN apt-get install -y wget bzip2# Anaconda installing
RUN wget [https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh](https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh)
RUN bash Anaconda3-5.0.1-Linux-x86_64.sh -b
RUN rm Anaconda3-5.0.1-Linux-x86_64.sh# Set path to conda
ENV PATH /root/anaconda3/bin:$PATH# Updating Anaconda packages
RUN conda update conda
RUN conda update anaconda
RUN conda update --all# Configuring access to Jupyter
RUN mkdir /opt/notebooks
RUN jupyter notebook --generate-config --allow-root
RUN echo "c.NotebookApp.password = u'sha1:6a3f528eec40:6e896b6e4828f525a6e20e5411cd1c8075d68619'" >> /root/.jupyter/jupyter_notebook_config.py# Jupyter listens port: 8888
EXPOSE 8888# Run Jupytewr notebook as Docker main process
CMD ["jupyter", "notebook", "--allow-root", "--notebook-dir=/opt/notebooks", "--ip='*'", "--port=8888", "--no-browser"]
我描述了每个步骤,并在 Anaconda 安装部分中放置了到 Anaconda 文件的链接。所以我们需要看到:
为了构建映像,我们需要运行命令:
docker build -t docker-data-science .
你可以看到每个步骤,从下载 Ubuntu 镜像开始:
和更新:
下载 Anaconda 安装程序:
安装 Anaconda:
和更新软件包:
您可以随时停止构建并重新运行它。Docker 保存每一步,这样你就可以从最后一点继续。如果您需要向 Dockerfile 添加一些新的包或其他依赖项并继续构建映像,它会很有帮助。
终于完成了。我们可以看到我们下载并创建的图像:
docker images
保存 Docker 文件后,不要忘记在本地停止 jupyter 笔记本,因为我们将使用 Docker 容器中的相同端口:
现在,我们可以基于新映像运行容器了:
docker run --name docker-data-science -p 8888:8888 -v "$PWD/notebooks:/opt/notebooks" -d docker-data-science
并打开 http://localhost:8888/
输入根
如果我们创建一个新文件
我们可以在子文件夹中看到它:
所以我们的地图起作用了。我们可以运行容器,创建文件,测试它,它将被保存在 PC 上。
要停止容器运行:
docker rm -f docker-data-science
我们可以在浏览器中看到:
开源代码库
现在是时候在 github 上保存我们的 docker 文件了。之后,我们开始与 Docker hub 合作。
登录 github 后,点击创建新的存储库按钮或直接打开https://github.com/new。
在我们看到添加和保存文件的步骤后:
所以让我们发出这些命令:
git init
echo "notebooks" > .gitignore
git add .
git commit -m "first commit"
命令回显【笔记本】>。gitignore 创建。gitignore 文件,我们可以把不想保存的目录或文件放在 git 中。在我们的例子中是笔记本。您只需要存储源代码。
接下来:
git remote add origin https://github.com/evheniy/docker-data-science.git
git push -u origin master
我们刚刚在 github 上保存了 docker 文件。如果我们重新加载页面,我们可以看到:
但是我们看到消息说我们需要创建 README.md 文件来描述我们的存储库。让我们来做吧:
保存并刷新页面:
现在您可以发出命令:
git clone [https://github.com/evheniy/docker-data-science.git](https://github.com/evheniy/docker-data-science.git)
并在任何带有 Docker 的 PC 上构建映像。但是如果你不想等半个小时,而它的建设,你可以建立一次,并保存在 Docker 枢纽。
码头枢纽
Docker hub 是一个类似 github 的 Docker 图片存储。你需要创建帐户,然后你可以存储自己的图像。
要存储图像,您需要点击创建存储库链接,并执行后续步骤:
- 选择一个名称空间(必需)
- 添加存储库名称(必填)
- 添加简短描述
- 将降价添加到完整描述字段
- 将其设置为私有或公共存储库
保存后,我们将它放在 docker hub 上:
之后,我们需要提升我们的形象。但是在我们需要登录之前:
docker login
接下来,我们需要设置 docker 用户
export DOCKER_ID_USER="evheniy"
制作新标签:
docker tag docker-data-science evheniy/docker-data-science
和推送图像:
docker push evheniy/docker-data-science
我们的形象是一个巨大的。
我们可以看到刚刚创建的标记:
现在我们可以运行命令了
docker pull evheniy/docker-data-science
在任何电脑上获取图像
我们可以看到更新的 docker hub 配置文件:
自动构建
手动制作图像也可以。但是如果你在 github 上修改代码,Docker hub 可以帮助你自动构建它。为此,我们需要创建自动化构建:
并链接 github 或 bitbucket 帐户—保存代码的地方:
如果你是第一个,你应该连接你的账户。让我们为我们的 github 帐户制作:
一些有用的信息:
和链接账户。我们需要达成一致:
我们可以看到结果:
现在我们可以创建自动构建:
为此,我们需要选择 github 存储库,在我们的例子中是 docker-data-science:
一些配置:
我们需要重命名构建存储库,因为我们有其他同名的存储库:
我们刚刚为我们的存储库创建了一个新的自动化构建:
让我们更新代码来运行 build:
我们看到我们的变更正在排队:
几分钟后,is 开始构建:
要构建所有步骤,我们需要等待 40 分钟:
之后我们可以看到结果:
在本文中,我们用 Anaconda 和 docker 映像创建了本地环境。每当我们在 Docker hub 上保存一个新的映像时,以及在我们创建了自动构建配置之后,跳过构建。我们将在下一篇文章中使用这张图片,在那里我将展示一些关于机器学习和大数据的有用东西。
参考
- 使用 Docker 做正确的事情
- 用 Docker 从零开始进行 TensorFlow 对象检测
- https://anaconda.org/
- https://www.docker.com/
- http://jupyter.org/
数据科学家的 Docker
原文:https://towardsdatascience.com/docker-for-data-scientists-5732501f0ba4?source=collection_archive---------8-----------------------
[## 想在数据科学方面变得更好吗?
当我在我发布独家帖子的媒体和个人网站上发布新内容时,请单击此处获得通知。](https://bobbywlindsey.ck.page/5dca5d4310)
Docker 在开发人员中很热门,虽然数据科学家不是严格意义上的软件开发人员,但 Docker 有一些非常有用的功能,从数据探索和建模到部署。由于 AWS 等主要服务支持 Docker 容器,因此使用 Docker 实现持续集成和持续交付更加容易。在这篇文章中,我将向您展示如何在数据科学环境中使用 Docker。
Docker 是什么?
这是一个软件容器平台,为我们提供了一个隔离的容器,让我们拥有运行实验所需的一切。本质上,它是一个轻量级的 VM,由一个可以进行版本控制的脚本构建而成;因此,我们现在可以对我们的数据科学环境进行版本控制了!开发人员在与同事进行代码协作时使用 Docker,他们也用它来构建敏捷软件交付管道,以便更快地交付新功能。这听起来耳熟吗?
码头术语
我有数学背景,所以很难避免定义!
容器:非常小的用户级虚拟化,帮助你构建、安装和运行你的代码
图片:你的容器的快照
Dockerfile :一个基于 yaml 的文件,用来建立你的形象;这是我们可以控制的版本
Dockerhub : GitHub 为你的 Docker 图片;您可以将 Dockerhub 设置为在 GitHub 中更新 Dockerfile 时自动构建映像
为什么 Docker 对数据科学如此重要
Source: developermemes
听过你同事的这些评论吗?
- “不知道为什么它不能在你的电脑上工作,但它能在我的电脑上工作。”
- “从零开始为 Linux、Windows 和 MacOS 安装所有东西,并试图为每个操作系统构建相同的环境,这是一件痛苦的事情。”
- "不能安装你用过的软件包,你能帮我吗?"
- “我需要更强的计算能力。我可以使用 AWS,但安装所有这些软件包和配置设置就像我在机器上安装它一样,需要很长时间。”
在很大程度上,Docker 很容易解决这些问题。目前的例外是 GPU 对 Docker 图像的支持,它只能在 Linux 机器上运行。除此之外,你很棒。
Python 和 Jupyter 笔记本的 Docker
看看这个文档。
# reference: [https://hub.docker.com/_/ubuntu/](https://hub.docker.com/_/ubuntu/)
FROM ubuntu:16.04# Adds metadata to the image as a key value pair example LABEL version="1.0"
LABEL maintainer="Your Name <some_email@domain.com>"# Set environment variables
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8# Create empty directory to attach volume
RUN mkdir ~/GitProjects# Install Ubuntu packages
RUN apt-get update && apt-get install -y \
wget \
bzip2 \
ca-certificates \
build-essential \
curl \
git-core \
htop \
pkg-config \
unzip \
unrar \
tree \
freetds-dev# Clean up
RUN apt-get clean && rm -rf /var/lib/apt/lists/*# Install Jupyter config
RUN mkdir ~/.ssh && touch ~/.ssh/known_hosts
RUN ssh-keygen -F github.com || ssh-keyscan github.com >> ~/.ssh/known_hosts
RUN git clone [https://github.com/bobbywlindsey/dotfiles.git](https://github.com/bobbywlindsey/dotfiles.git)
RUN mkdir ~/.jupyter
RUN cp /dotfiles/jupyter_configs/jupyter_notebook_config.py ~/.jupyter/
RUN rm -rf /dotfiles# Install Anaconda
RUN echo 'export PATH=/opt/conda/bin:$PATH' > /etc/profile.d/conda.sh
RUN wget --quiet [https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh](https://repo.anaconda.com/archive/Anaconda3-5.2.0-Linux-x86_64.sh) -O ~/anaconda.sh
RUN /bin/bash ~/anaconda.sh -b -p /opt/conda
RUN rm ~/anaconda.sh# Set path to conda
ENV PATH /opt/conda/bin:$PATH# Update Anaconda
RUN conda update conda && conda update anaconda && conda update --all# Install Jupyter theme
RUN pip install msgpack jupyterthemes
RUN jt -t grade3# Install other Python packages
RUN conda install pymssql
RUN pip install SQLAlchemy \
missingno \
json_tricks \
bcolz \
gensim \
elasticsearch \
psycopg2-binary# Configure access to Jupyter
WORKDIR /root/GitProjects
EXPOSE 8888
CMD jupyter lab --no-browser --ip=0.0.0.0 --allow-root --NotebookApp.token='data-science'
如果你曾经在 Ubuntu 中安装过软件包,这应该看起来很熟悉。简而言之,这个 Dockerfile 是一个脚本,用于自动构建和设置一个轻量级版本的 Ubuntu,其中包含使用 Jupyter 笔记本进行[我的]数据科学探索所需的所有必要的 Ubuntu 包和 Python 库。最好的一点是,无论我是在 MacOS、Linux 还是 Windows 上,这都将以相同的方式运行——无需编写单独的安装脚本和第三方工具来在每个操作系统中拥有相同的环境。
要从这个 Docker 文件构建 Docker 映像,您需要做的就是执行
docker build -t bobbywlindsey/docker-data-science .
鲍勃是你的叔叔。要运行映像,您有两种选择—您可以交互运行映像(这意味着您将实时看到 Jupyter 笔记本服务器的输出),也可以在分离模式下运行映像(在这种模式下,您可以进入映像的终端进行操作)。
要在 Windows 上以交互方式运行映像,请执行
docker run -it -v ~/GitProjects:/root/GitProjects --network=host -i bobbywlindsey/docker-data-science
否则,
docker run -it -v ~/GitProjects:/root/GitProjects -p 8888:8888 -i bobbywlindsey/docker-data-science
要在 linux 的分离模式下运行映像,请执行以下操作:
docker run -d --name data-science -v ~/GitProjects:/root/GitProjects --network=host -i bobbywlindsey/docker-data-science
docker exec -it data-science bash
或者对于 MacOS 和 Windows:
docker run -d --name data-science -v ~/GitProjects:/root/GitProjects -p 8888:8888 -i bobbywlindsey/docker-data-science
docker exec -it data-science bash
不算太差!我意识到键入这些运行命令可能有点麻烦,所以我看到了几个选项。您可以给这些命令起别名,也可以使用 docker-compose 文件。
使用多个容器
Source
我不会在这里过多地讨论 Docker Compose,但是作为一个例子,我必须运行一个 docker-compose 文件,用于一个 Jekyll 博客:
version: '3'
services:
site:
environment:
- JEKYLL_ENV=docker
image: bobbywlindsey/docker-jekyll
volumes:
- ~/Dropbox/me/career/website-and-blog/bobbywlindsey:/root/bobbywlindsey
ports:
- 4000:4000
- 35729:35729
有了这个文件,您的运行命令就变成了:
docker-compose run --service-ports site
但是 Docker Compose 比仅仅用它来代替运行命令要强大得多。您的 docker-compose 文件可以配置多个映像,并且通过使用一个命令,您可以一次创建并启动所有服务。例如,假设您构建了一个 Docker 映像来预处理数据,另一个用来建模数据,另一个用来将模型部署为 API。您可以使用 docker-compose 来管理每个映像的配置,并使用一个命令来运行它们。
结论
即使 Docker 可能需要一些数据科学家的学习曲线,我相信这是非常值得的努力,并且不会伤害到这些 DevOps 技能。您在数据科学工作中使用过 Docker 吗?
如果你喜欢我在这里写的东西,一定要看看我的个人博客,我在那里有一些在媒体上看不到的文章。
原载于 2018 年 7 月 16 日bobbywlindsey.com。
轻松获得数据科学的 Docker
原文:https://towardsdatascience.com/docker-without-the-hassle-b98447caedd8?source=collection_archive---------12-----------------------
(Source)
如何使用 repo2docker 自动构建 docker 映像
如果您没有使用 docker 进行数据科学,那么您可能应该使用。Docker 最好被认为是一个运行映像——环境——的轻型虚拟机,其中包含项目的所有库、数据和代码。Docker 对于可再生的数据科学来说是非常棒的,因为它使得共享代码更加容易:不用发送代码和需求,你可以制作一个 Docker 映像,当其他人运行你的映像时,你的项目就可以在他们的机器上工作。这解决了每当人们试图共享代码时不可避免地出现的“依赖地狱”问题:“它在我的机器上工作”现在是一个过去的短语,感谢 Docker。
即使拥有 Docker 的明显优势,许多数据科学家仍然没有接受这项技术。制作 Docker 映像需要编写一个 [Dockerfile](https://docs.docker.com/engine/reference/builder/)with the
命令来构建映像。虽然这并不困难,但是仅仅 [pip freeze > requirements.txt](https://pip.pypa.io/en/stable/reference/pip_freeze/)
一个 Python 环境并使用它要容易得多(不是最佳实践,但总比没有好)。幸运的是,多亏了 Jupyter 项目的[repo2docker](https://repo2docker.readthedocs.io/en/latest/)
工具,从 GitHub 库创建 Docker 映像的过程现在只需要一行代码。
使用方法:极短版本
- 安装对接器
- 安装 repo2docker :
pip install jupyter-repo2docker
- 运行
repo2docker repo-link
并在几分钟内获得图像:
repo2docker [https://github.com/WillKoehrsen/feature-selector](https://github.com/WillKoehrsen/feature-selector)
如果这对你来说足够了,那就去开始吧!否则,请继续阅读更多细节。
Repo2Docker 基础知识
Repo2Docker 的工作方式是检查 GitHub 库中的任意数量的配置文件,例如 Python 库的[requirements.txt](https://repo2docker.readthedocs.io/en/latest/config_files.html#requirements-txt-install-a-python-environment)
、Conda 的[environment.yml](https://repo2docker.readthedocs.io/en/latest/config_files.html#environment-yml-install-a-python-environment)
或构建 Python 包的[setup.py](https://repo2docker.readthedocs.io/en/latest/config_files.html#setup-py-install-python-packages)
。然后,它将这些内容翻译成 Dockerfile 文件并构建图像。最后,它运行映像并启动一个 Jupyter 服务器,在那里您可以访问 Jupyter 笔记本(甚至 RStudio)。所有这些都在一个命令中完成!
有关 repo2docker 的更多信息,请查看: Intro post 、 documentation 或 GitHub repository (随时欢迎投稿)。(repo2docker 也是 [binder](https://mybinder.org/)
背后的技术,Jupyter 的另一个项目值得一试。)
如何使用:稍微友好的版本
- 首先安装 docker。您的机器的说明可以在这里找到。 docker 入门指南对于学习 docker 如何工作是有用的,尽管我们不需要细节来有效地使用它
- 确保 docker 正在运行。如果
docker run hello-world
显示信息Hello from Docker!
,那么你就可以开始了。 - 用
pip install jupyter-repo2docker
安装repo2docker
。通过键入repo2docker -h
调出帮助选项,确认它可以工作。 - 找到一个至少有一个
requirements.txt
文件的 GitHub 库。例如,我正在为[feature-selector](https://github.com/WillKoehrsen/feature-selector)
使用 repo,这是我为机器学习特征选择制作的一个工具,它有一个setup.py
文件。 - 运行 magic line
repo2docker repo-link
,它会自动创建一个新的 docker 映像,安装所有需要的依赖项,最后在环境中启动一个 jupyter 服务。这可能需要 5-10 分钟,但请记住,这可以节省您的工作时间和挫败感。 - 命令完成后,复制 url 并导航到 docker 容器中运行的 Jupyter 记事本。
命令和最终输出将如下所示:
repo2docker [https://github.com/WillKoehrsen/feature-selector](https://github.com/WillKoehrsen/feature-selector)... Lots of steps ...
... while your Docker image ...
... is built and run ...Final output:Copy/paste this URL into your browser when you connect for the first time,
to login with a token:
[http://127.0.0.1:65375/?token=](http://127.0.0.1:65375/?token=c23a4e26bb5a8cfd7c818eb2747198f207bead7512b71eb1)randomstringofcharacters
运行笔记本,惊叹使用 docker 和repo2docker
是多么容易
Notebook running in a docker container
重要注意事项
docker 容器运行后,打开一个新的 shell 并键入[docker ps](https://docs.docker.com/engine/reference/commandline/ps/)
来查看容器进程。获取CONTAINER_ID
然后运行docker exec -it CONTAINER_ID /bin/bash
在运行容器中打开一个交互外壳 。在 shell 中,您可以在命令行上做任何事情,比如列出文件、运行 python 脚本或监控进程。
当您完成会话后,您可以使用 ctrl + c 或[docker stop](https://docs.docker.com/engine/reference/commandline/stop/) CONTAINER ID
关闭 Jupyter 服务器和容器。好消息是,当我们想要重启容器时,我们不必再次重新运行repo2docker repo-link
。整个环境被保存为我们机器上的 docker 图像,我们可以用docker image list
看到。
Output of docker image list
要再次启动该容器,选择IMAGE ID
并运行命令:
docker run -p 12345:8888 IMAGE ID jupyter notebook --ip 0.0.0.0
这将启动容器,将容器的端口 8888 发布到主机端口 12345,并运行可在 127.0.0.1:12345 访问的 jupyter 笔记本。您可以再次在浏览器中访问 Jupyter 笔记本,所有要求都已准备就绪。(感谢 t 他在 GitHub 上的问题提供了这个解决方案。此外,更多选项请参见 docker 上的文档
repo2docker
正在持续工作,如果 GitHub 库中的配置文件没有改变,有主动拉取请求自动使用预建镜像。上述命令始终有效,也可用于不是通过repo2docker
创建的图像。一旦你从repo2docker
学会了基础知识,试着阅读一些 Docker 指南,看看如何有效地利用 Docker。
结论
正如在 Keras 中构建神经网络时不必担心反向传播的细节一样,您也不必掌握复杂的命令来实践可再现的数据科学。幸运的是,数据科学的工具继续变得更好,使得采用最佳实践更容易,并有望鼓励更多不同的人进入该领域。
Repo2docker 是这些技术中的一种,它将使你作为一名数据科学家更加高效。当然,你可以是那个满腹牢骚的老人:“我花了那么多时间学习 docker,而现在这些年轻人甚至不会写 docker 文件”,或者你可以走大路,庆祝不断增加的抽象层。这些层将您从繁琐的细节中分离出来,使您能够专注于数据科学的最佳部分:通过数据做出更好的决策。
一如既往,我欢迎反馈和建设性的批评。可以通过推特 @koehrsen_will 联系到我。
停泊气流
原文:https://towardsdatascience.com/dockerizing-airflow-58a8888bd72d?source=collection_archive---------5-----------------------
面向本地工作负载的 Docker 上的 Apache 气流
Photo by Koushik Chowdavarapu on Unsplash
Airflow 是大多数数据工程师工具箱中事实上的 ETL 编排工具。它为强大的后端提供了一个直观的 web 界面,以便为您的 ETL 工作流安排和管理依赖关系。
在我的日常工作流程中,我用它来维护和管理建立在 AWS S3 之上的数据湖。我的 Airflow DAGs 中的节点包括多节点 EMR Apache Spark 和 Fargate 集群,这些集群从数据湖中聚合、删减并产生副数据。
由于这些工作流是在分布式集群(20 多个节点)上执行的,并且具有很强的依赖性(一个 ETL 的输出作为输入提供给下一个 ETL),所以使用气流来编排它们是有意义的。然而,它没有意义,有一个中央气流部署,因为我将是唯一一个使用它。
因此,我选择对接气流,这样我就可以旋转容器,轻松运行这些工作流,而不必担心气流部署。
在这篇文章中,我将回顾一下我是如何做到这一点的,并简单解释一下设计过程中的一些决定。
气流部件
在气流 ETL 中,工作流被定义为有向非循环图 ( 气流 DAG ),其中每个节点都是独立的 ETL,每个下游节点都依赖于上游节点的成功完成。
Simple Airflow DAG
气流有三个展开组件:
- web 服务器( Flask 后端用于触发和监控 Dag)
- 调度程序(调度和运行 DAG 执行程序的守护进程)
- 数据库(DAG 和 DAG 实例定义的前置层)
气流快速启动
用气流启动快速简单;
# airflow needs a home, ~/airflow is the default,
# but you can lay foundation somewhere else if you prefer
# (optional)
export AIRFLOW_HOME=~/airflow# install from pypi using pip
pip install apache-airflow# initialize the database
airflow initdb# start the web server, default port is 8080
airflow webserver -p 8080
在运行这些命令时,Airflow 将创建一个$AIRFLOW_HOME
文件夹,并放置一个airflow.cfg
文件,其默认设置可以让您快速运行。您可以在$AIRFLOW_HOME/airflow.cfg
中或者通过Admin->Configuration
菜单中的 UI 来检查文件。网络服务器的 PID 文件将存储在$AIRFLOW_HOME/airflow-webserver.pid
中,如果由 systemd 启动,则存储在/run/airflow/webserver.pid
中。
开箱即用,Airflow 使用一个 sqlite 数据库,您应该很快就能适应,因为使用这个数据库后端不可能实现并行化。它与只顺序运行任务实例的SequentialExecutor
协同工作。虽然这非常有限,但它允许您快速启动并运行,浏览 UI 和命令行实用程序。
下面是几个将触发几个任务实例的命令。当您运行下面的命令时,您应该能够在example1
DAG 中看到作业的状态变化。
# run your first task instance
airflow run example_bash_operator runme_0 2018-01-01
# run a backfill over 2 days
airflow backfill example_bash_operator -s 2018-01-01 -e 2018-01-02
停泊气流
一个容器的主要运行过程是ENTRYPOINT
和/或Dockerfile
末端的CMD
。通常建议您通过对每个容器使用一个服务来分隔关注的区域。
然而,由于我们想让Airflow Webserver
&和Airflow Scheduler
进程都运行,我们将使用supervisord
作为进程管理器。
这是一种中等重量级的方法,要求您将supervisord
及其配置打包到 docker 映像中(或者基于包含supervisord
的映像),以及它管理的不同应用程序。
然后你启动supervisord
,它为你管理你的进程。首先我们需要定义supervisord.conf
:
[supervisord]
nodaemon=true[program:scheduler]
command=airflow scheduler stdout_logfile=/var/log/supervisor/%(program_name)s.log stderr_logfile=/var/log/supervisor/%(program_name)s.log autorestart=true[program:server]
command=airflow webserver -p 8080 stdout_logfile=/var/log/supervisor/%(program_name)s.log stderr_logfile=/var/log/supervisor/%(program_name)s.log autorestart=true
然后我们将使用supervisord
作为 docker 文件的ENTRYPOINT
:
FROM python:3.6.3# supervisord setup
RUN apt-get update && apt-get install -y supervisor COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf# Airflow setup
ENV AIRFLOW_HOME=/app/airflowRUN pip install apache-airflow
COPY /dags/response_rate_etl.py $AIRFLOW_HOME/dags/RUN airflow initdbEXPOSE 8080CMD ["/usr/bin/supervisord"]
构建 Docker 映像:
docker build . -t airflow
运行容器:
docker run -d -p 8080:8080 --rm \
--name airflow_container \
airflow
启动 DAG:
docker exec airflow_container airflow trigger_dag example_bash_operator
监控 DAG 运行:
打开浏览器并导航至http://localhost:8080
以监控 DAG 实例运行。
这就是所有人,请继续关注未来的帖子,在那里我将深入定义 AWS EMR dags,定义自定义气流操作符,注入 AWS 凭证等等!
文档特征提取和分类
原文:https://towardsdatascience.com/document-feature-extraction-and-classification-53f0e813d2d3?source=collection_archive---------0-----------------------
E 非常分类问题在自然语言处理 (NLP)中被大致归类为文档或令牌级分类任务。这是关于如何用 python 实现这一切并理解其背后的理论背景和用例的两部分博客的第一部分。这篇博客的所有代码、数据和结果都可以在我的 GITHUB 个人资料中找到。这篇文章专门讨论文档分类,随后的部分将讨论标记级分类,也称为解析。
文档只不过是一组(不止一个)令牌。每一个有监督的机器学习算法都要求每一个文本文档都以向量的形式表示,以开始对这些文档进行训练,这是通过向量空间建模 (VSM)来完成的。
VSM 很大程度上可以通过两种独特且截然不同的技术来实现
- 使用 TF-IDF 的传统词汇方法(在本博客中)
- 像 doc2vec 这样的单词嵌入
在这个博客中,我使用了路透社新闻分类数据集,每个新闻文件都属于 8 个类别中的一个。我使用 tf-idf 和 doc2vec 进行特征提取,然后在 75:25 的训练:测试分割上使用逻辑回归和朴素贝叶斯分类器对这些向量进行分类
因此,工作流程是首先将所有文档转换为矢量。保留这些向量中的大部分用于训练,其余的用于测试,然后应用各自的监督分类技术。
使用 BOW :: TF-IDF 的特征提取
术语频率-逆文档频率使用数据集中的所有标记作为词汇。词汇中的标记在每个文档中的出现频率由术语频率组成,标记出现的文档数量决定了逆文档频率。这确保的是,如果一个标记在文档中频繁出现,该标记将具有高 TF,但是如果该标记在大多数文档中频繁出现,那么它将减少 IDF,因此像 an、the、i 这样频繁出现的停用词将受到惩罚,而包含文档本质的重要词将得到提升。特定文档的这些 TF 和 IDF 矩阵相乘并归一化以形成文档的 TF-IDF。
TF-IDF formulation
你必须浏览一下克里斯蒂安·佩罗尼的这个博客,在那里他用实现细节很好地解释了这个概念。
使用单词嵌入的特征提取::doc2vec
Doc2vec 是与 tf-idf 完全不同的算法,TF-IDF 使用 3 层浅深度神经网络来测量文档的上下文,并将相似的上下文短语关联在一起。
关于 doc2vec 需要注意的重要一点是,它不是像单词包那样的单片算法,它有两种不同的变体 SKIP GRAM 和 CBOW,它还可以与其他变体一起使用,如带或不带负采样和带或不带分层 softmax。
最后,doc2vec 应该在一个足够大和高质量的数据集上进行训练,以使模型生成合理的嵌入,这将导致良好的特征生成。
Doc2Vec Source
结果
整个练习的结果都符合预期。TF-IDF 逻辑回归优于 doc2vec 逻辑回归,因为 doc2 vec 的训练集不够丰富或大,不足以让模型学习实际的上下文关系来生成合理的嵌入。虽然 doc2vec LR 的表现比 TF-IDF 朴素贝叶斯要好。
值得一提的是,对于 tf-idf,实现了多项式朴素贝叶斯,对于 doc2vec 使用了高斯朴素贝叶斯,因为多项式朴素贝叶斯对于在 doc2vec 中生成的负值是失败的,并且在 tf-idf 的情况下特征肯定是非负的,因为出现频率不能是负的。
在下一篇博客中,我将尝试使用单词包技术进行令牌分类,并通过特征哈希来扩展它,实现 word2vec 嵌入。
请在 contact.ishaanarora@gmail.com 联系我,或者在这个 github repo 上开一个问题,讨论这个帖子中的任何事情,甚至是一般的生活:P 如果你已经到了这一步,你太棒了!
记录看不见的雅加达交通
原文:https://towardsdatascience.com/documenting-the-unseen-jakarta-traffic-7f4c64be4cca?source=collection_archive---------9-----------------------
量化政府政策结果的实验。
潘迪托·普拉塔马-毛拉娜·伊奇桑·吉图里
credit image: Maulana Ichsan Gituri
西安亚运会和亚残运会已经结束。与之配套的政策也是如此,单双号政策。在许多城市交通讨论中,经过长时间的辩论、批评和讨论,直到最近在印度尼西亚 ITDP的讨论,邀请了 Polda Metro Jaya 的交通总监、雅加达交通局局长、大雅加达交通管理局局长以及雅加达 PT Transportasi 的总裁,该政策成为社会的热门话题,也引发了一些问题,如:亚残运会后该政策是否会继续?如果是的话,这项政策是否会采用与以前相同的方案?政策真的让城市动起来更快了吗?
在我们跳进许多假设和偏见之前,让我们开始分析可以量化政策影响的数据。
首先,要量化政府政策的表现,我们不仅要从私家车方面看,也要从公共交通方面看。因为公共交通方面是政府可以直接采取行动的一方,而且由于其可承受的价格,它可以方便任何人。然后,我们必须着眼于最广泛的交通网络来代表雅加达道路上的所有公共交通。(通勤线路每天可能会有更多的乘客,但单双号政策只出现在基于道路的运输中。)
它实际上始于记录人们每天在交通中看到的东西的精神,而没有一个组织良好的数据文档。
看看雅加达最广的交通网络,Transjakarta。我们称这个系统为快速公交系统。简而言之,公交车有一条专用车道,使得它们快速。我们可以说,雅加达的任何人都知道,公共汽车可以与其他车辆分开行驶,因为他们有分离器,一旦你用自己的汽车/摩托车占用车道,你可能会被罚款,公众知道,不是所有的车道都有分离器。但是他们真的了解专用车道的改造吗?他们真的注意到网络的扩张了吗?我和毛拉娜以这种方式开始真正让这个雅加达的巨人有据可查。
Jakarta BRT Corridor “healthiness”, changes of the alignment of separation occur due to the many mega projects in several parts
Transjakarta’s Network Growth 2015–2018
从地图上可以看出,该网络已经快速发展了 4 年。目前,Transjakarta 不仅提供 BRT 服务,还提供支线服务,可以到达路权较小的道路。鉴于这一事实,外雅加达并不总是有无菌车道,主干道上的交通对外雅加达的表现有很大影响。
但我们如何量化单双号政策期间公共交通的表现呢?
由于谷歌地图 API 只提供私人车辆的交通流量,我们不能用它来评估公共交通的表现。幸运的是,每辆雅加达的公交车都有一个 GNSS 接收器(或者人们通常称之为 GPS,但 GPS 是美国版的 GNSS,实际上接收器捕捉到的信号可能来自伽利略,欧洲 GNSS,或 Glonass,俄罗斯 GNSS,甚至北斗,中国 GNSS,谢谢我后面的琐事:p)
GNSS raw data from Transjakarta bus
我们决定从四月和八月的几天收集数据。为什么是四月和八月?我们发现,4 月份是雅加达没有单双号政策干预的情况,4 月份我们找不到任何独特的交通季节性行为,因为没有斋月和伊斯兰长假,8 月份是该政策在 7 月份试行一个月后有效应用的地方。
这些数据是海量的数据,每天包含数百万条记录。所以电子表格不是处理我们所有数据的好主意。然后,我们使用 R 来过滤、规范化和生成我们需要的信息。过滤是必要的,因为对于这项研究,我们决定只包括在走廊的高峰时间和公共汽车的数据。所以我们清理了所有不属于这个类别的数据。不幸的是,在我们第一次尝试在地图上绘制数据时,数据移动了几米,因此我们需要先将它们标准化,这样它们才能回到正轨。最后,我们计算了四月和八月每个走廊的速度,结果相当令人惊讶。
如果你不熟悉雅加达,这是显示交通状况的地图,以及该政策实际适用的地方。
Map of Jakarta with odd-even policy segment highlighted
每一个有奇偶直接影响的走廊,速度都显著提高。
你可能想知道,单双号政策对分隔车道有什么影响?
答案是,并非所有的雅加达走廊都与其他交通分开。他们中的一些是混合交通,他们中的一些有几个路口和红绿灯,他们中的一些成为警察自由裁量权政策的受害者。所以没错,单双号政策对雅加达走廊有相当大的影响。
如果您想知道速度提升后是什么样子,这里我们将为您提供两个奇偶政策效果的空间可视化示例。
Tendean Intersection, before and after odd-even policy
Metro Pondok Indah, before and after odd-even policy
好吧,这些算好消息吗?事实上,他们是,任何大都市地区的公共交通的愿景之一是缩短旅行时间,增加市民的流动性,上面所有的地图都反映了这些愿景。
发现未知,下一步是什么?
是的,我们确实研究了这项政策对公共交通方面的影响,我们实际上担心其他部门可能会把这项政策视为一场噩梦。
零售?商业?财产?我们相信这不是一个零和游戏,所有受影响的人可能会经历一个大的冲击,因为这仍然是新的,但如果在这一点上的一致性和承诺,我们相信我们可以适应并形成一个更好的新常态。
但我们能否先欣赏一下政府为实现这一目标所表现出的勇气?现在这项政策即将结束,在此之后,单双号政策仍然适用,但不是一天一夜,从明天开始直到年底,这项政策只适用于早晚高峰,但感谢上帝,他们没有消除任何路段,仍然一样。
在这里,我们只是试图量化一项政策如何影响许多人生活的普通公民。决定一个城市的进步需要政治支持,有时,这些进步不是通过演讲,而是通过签署一揽子政策文件来实现的。
安德鲁·威金斯有努力的问题吗?
原文:https://towardsdatascience.com/does-andrew-wiggins-have-an-effort-problem-a6a13c0337bb?source=collection_archive---------15-----------------------
对于不关注 NBA 的人来说,下面是吉米·巴特勒/森林狼队迄今为止的恶作剧:
- 吉米·巴特勒是森林狼队的一名超级勤奋的球员(联盟排名前 10 -15)。
- 吉米·巴特勒与卡尔安东尼唐斯(凯特)和安德鲁·威金斯有问题,他们是他的两名队友,刚刚签署了巨额合同。
- 具体来说,吉米·巴特勒认为凯特是“软”的,尽管他是队里最有天赋的人,而威金斯没有职业道德,尽管他是队里最有天赋的人。
- 吉米·巴特勒想离开森林狼。
- 显然,吉米·巴特勒晚了一个小时才出现练习,并和一群板凳球员一起击败了首发(包括凯特和维金斯)。这是我经历过的最混蛋也是最不可思议的事情。
- 两小时后,他立即接受了 ESPN 的采访,基本上在在线篮球社区引发了一场迷因风暴和疯狂的过度反应。
那么,巴特勒的抱怨有多少道理呢?嗯,很难量化一个球员有多“软”,但我记得在 Reddit 上读到过一个评论,说维金斯只试着对抗一支球队——那支交易走他的球队,克利夫兰骑士队。
提示美国汪达尔画外音。那可能是真的吗?安德鲁·威金斯真的会吝惜一个赛季的两场比赛,而在接下来的 80 年里无所事事吗?如果威金斯努力的话,他真的能成为超级巨星吗?
Is this the face of a man who could take over the league?
安德鲁·威金斯是职业生涯场均 19.7 分 (ppg)球员,拥有 51%的真实投篮命中率 (TS,基本衡量你投篮的好坏)。19.7 分一点也不差——去年 NBA 只有 20 个左右的球员场均得分高于这个数字。两个问题是,威金斯已经有一段时间没有明显好转了,而 51% TS 真的很糟糕。
如果你有 51%的 TS,这意味着你每投一球就能得到 1.02 分。这将使你处于去年 NBA 最差球队的第 26 和第 27 名之间。这对一名球员和一支球队来说都不是好事。以下是维金斯去年与去年联盟前 100 名得分手的对比。你可以清楚地看到联盟中没有人比威金斯投篮更差,而且经常如此。
Wiggins with some other players for context
关于效率的一件重要事情:经验法则是,对于大多数球员来说,投篮次数(FGA,或投篮次数)和效率是成反比的。你拍的照片越多,质量就越差,对吗?你已经投出了那些你认为‘好’的球,现在为了投出更多的球,你必须投出那些你可能不会投的低命中率的球。
这就是有趣的地方。看看这张图表。每个点代表维金斯在不同球队 4 年常规赛中的平均数据。
Outlier time baby!
你看到右上角的那个点了吗?看起来不像是同一个数据集的一部分?
现在我明白这个理论的来源了。
场均 19 FGA 的 65%的命中率是 MVP 的统计线,维金斯保持了 8 场比赛。现在,有可能骑士只是防守太差了。根据霍林格统计,骑士队在过去的 4 年里排名第 20、10、22 和 29。这…很糟糕,但是我不认为这能让一个低于平均水平的球员成为 MVP。
Two things that are normally very uncorrelated
While not the perfect measurements of a player’s impact, these PPG and Game Scores do look kind of funky
看看这些快速和肮脏的衡量球员进攻成功的标准,克利夫兰每次都在中位数及其周围四分之一的范围之外。
在维金斯投篮次数最多的球队中,投篮次数多和投篮命中率低之间有很强的相关性。三个明显的例外——克利夫兰、多伦多和萨克拉门托。
萨克拉门托我想排除,因为他们的防守一直介于历史上糟糕和可怕的威金斯在联盟的整个时间(平均约第四最差的球队在过去 4 年)。我可以看到维金斯只是采取了许多简单的投篮对他们。
Reddit 上的另一个随机事件(/u/afraidobricks)谢谢!)指出,维金斯在对阵家乡球队(多伦多)的比赛中得分不错,这看起来有点古怪。一支防守排名第 23、第 11、第 10 和第 5 的球队在 57%的防守得分上被挑到 18.3 的 FGA,这看起来确实很奇怪(这只是的全明星/边缘巨星水平),但这似乎是那种你从结论开始并开始寻找支持它的东西的事情,所以我要把这个想法扔在那里,小心翼翼地不再提它。
为了寻找更多精选的数据来支持我的结论(我发誓这是一个笑话),我看了维金斯在骑士队 vs 所有比赛中的投篮得分表。这些图表/数据由 NBASavant 提供。
Cavaliers Only
All teams
不仅仅是投篮命中率(我们已经知道这些在骑士队的比赛中会是非常高的),我还想看看他投篮的类型。有趣的是,他从弧后变成了加拿大库里,并在对骑士的比赛中从禁区内投篮命中沙克的百分比?是的,但是这可能是不可持续的。
如果你想知道的话,这部分是一个几乎不加掩饰的借口,让我模仿一些皱巴巴的纸跳线一直在做的工作,并将其与我的老板正在制作的图表合并。
If you don’t think graph nerdery is cool, idfwu
好吧,这张图表到底向我们展示了什么?嗯,骑士队的比赛和常规比赛在投篮选择上的区别是,维金斯在整个球场上的 3 分要少得多,2 分要多得多。根据 teamrankings.com 的说法,骑士队是一支相当普通的球队,在 3 3/4 年的时间里卫冕冠军,所以我怀疑这是维金斯为了球队的弱点而调整他的比赛风格。这看起来像是维金斯有能力在他想要的时候打不同的比赛。
就像《美国破坏者》在第一季中强烈暗示了罪魁祸首,但最终没有做出彻底的谴责,我将避免对安德鲁·威金斯做出任何明确的声明(我也看他一年打 5 场比赛?这些都不是对骑士的比赛。).然而,我要说,这看起来相当糟糕。
我也将尝试提前解决统计/篮球争论启示录的四骑士,有人会在评论中提出。
- 样本量小!!!111!!111;兄弟,这是 328 场常规赛中的 8 场。我明白了。但是,如果你想提出这样的论点,并且我曾经听到你谈论一个 7 场季后赛系列赛定义一个球员的职业生涯,我会通过屏幕打你。
- 伪相关!!11!!!11!!;谁知道呢,也许这些克利夫兰的比赛恰好与水星在逆转的卡戎后面逆行相吻合,这给了威金斯超能力。但我用我的陷阱卡“奥卡姆剃刀”来反驳,它迫使你坐在那里问自己,你是否把这种程度的相关性严谨应用到你生活中的其他事情上。这并不是说我会四处乱切数据直到我得到好的结果——我实际上只是问维金斯在与骑士的比赛中得分如何。
- 眼睛测试!!11!!去看比赛吧,你这个书呆子!!11!!;不,我很好,让我安静地乱猜吧。我甚至不认为森林狼的其他球员会在外面看着维金斯。见鬼,我怀疑其他球队的球员在看他,所以不要告诉我你看过他的每一场比赛,是威金斯投篮的权威,除非你能说出他的 3 张专辑。不过,严肃地说,领域知识+统计数据通常会带来有趣的突破,但忽视统计相关性会导致你的工作被人工智能取代。我同意我可能应该在发帖前多看一些他的比赛,但是…我可以在工作中这样做,我不能看森林狼比赛崩溃,所以…
- 统计意义!!11!!p 测!!T-TEST!!11!!;请不要拿你半辈子都没想过的高中 AP 统计知识来冲我。检测和理解异常值是它自己的统计学领域,坦白说这不是我的专长,但我也不认为这是你的。如果你真的想谈论统计和方法以及不同的测试,我真的洗耳恭听。
不管怎样,谢谢你读到这里。我的数据集和 Tableau 工作表被收集在这里如果你足够关心来试着证明我是错的。否则,我希望你们像我一样对篮球赛季的开始感到兴奋。#信任流程
乡村音乐比其他流派喝的多吗?调查 5 年的歌词来找出答案
原文:https://towardsdatascience.com/does-country-music-drink-more-than-other-genres-a21db901940b?source=collection_archive---------13-----------------------
From Adam Wilson on Unsplash
感谢 Spotify 的热门乡村和乡村之夜播放列表,我最近进入了一个听乡村音乐的不寻常阶段。摇滚通常更适合我,所以这对我来说是第一次。在我立即意识到乡村是多么吸引人之后,真正让我震惊的是似乎有 那么 很多地方提到酒精和饮酒!
从下面克里斯·斯台普顿的诗句中汲取灵感。你认为他知道不含酒精的东西也可以用于比较吗?
你像田纳西威士忌一样柔滑,你像草莓酒一样甜美,你像一杯白兰地一样温暖
田纳西威士忌——克里斯·斯台普顿
或者奥斯本兄弟的这些台词。真的不是他们的错吗?
把威士忌归咎于啤酒把啤酒归咎于威士忌把早晨归咎于夜晚
这不是我的错——奥斯本兄弟
当我想到乡村音乐时,啤酒和威士忌是我脑海中的一部分,但并不比摇滚或说唱/嘻哈音乐更多。我想知道我听到更多关于酒的提及,是因为我刚到这个国家,还是不同流派之间的提及真的有可测量的差异。
我想我需要做的就是找出答案。
- 从 Billboard 网站获得不同音乐流派的流行歌曲列表,该网站有摇滚、流行、乡村等流派的具体图表。
- 获取他们的歌词
- 获取酒精和饮酒相关词汇的列表
- 数一数有多少首歌提到了这些词
这个过程可能比这四个简短的要点所表明的时间要长一点,但是下面是这个过程、分析和发现的一个步骤,希望你能喜欢!
数据收集和清理
刮了五年的图表
第一步是为每个流派创建一个歌曲数据集。我决定使用 Billboard 网站上的年终排行榜,因为它们通常有 100 个条目,所以会提供大量数据,我可以肯定它们代表了人们在这些流派中真正听的东西。这些是美国的图表,但是,由于美国往往会引领世界潮流(不管我们喜欢与否),并且拥有最大的乡村音乐听众,我觉得它们是这个项目的最佳数据源。
Billboard 网站上有摇滚、乡村、流行、 R & B/Hip-Hop 、舞蹈/电音、基督教的排行榜,我也决定把非流派特定的整体 Hot 100 排行榜收录进来,以供参考。我没有包括拉丁或国际图表,因为非英语歌曲会影响后来的分析结果。
上面的链接是 2017 年年终图表,但它们都至少可以追溯到 2013 年。我决定收集过去五年的数据,这样我就可以研究一段时间内的趋势。
我主要使用每个流派的“热门”排行榜,除了流行音乐没有“热门”排行榜。热门排行榜包括广播剧、实体销售和信息流,而流行排行榜只在广播剧中出现。但在所有情况下,它们都应该很好地代表人们在每一个流派中听到的和正在听的内容。
有些歌曲可能会出现在多个图表或年份中。我不会删除任何重复的内容,因为我不想改变任何图表的内容。
我使用 Python Beautiful Soup library 来帮助从每个网页的 html 中提取每个图表条目的歌曲和艺术家姓名。这和你在 Chrome 的网页上按 Ctrl+Shift+i 看到的 html 是一样的。
Example of song information in html from Billboard’s website
我在这样做的时候发现了一些问题,比如 2015 年 R & B/Hip-Hop 图表只有 25 个条目,而其他年份通常有 100 个。或者说 2016 热 100 因为#87 缺失只有 99 个条目。不知道这些问题背后的原因,但我确实考虑到,当我稍后进行分析时,图表长度可能会有所不同。
获取 2840 首歌曲的歌词
图表抓取找到了 3019 个图表条目,我使用 Genius.com 的 API 得到了其中 2840 个的歌词。你只需要注册就可以免费使用。在我的代码中,我使用了lyricsgiusPython 包,使得 Genius.com 的 API 非常容易使用。
在这个阶段,我遇到的问题是如何将 Genius 使用的歌曲和艺术家名字与 Billboard 匹配。例如,当一首歌由多位艺术家创作时,就会出现很多问题。Billboard 有很多组合艺人名字的方法,比如“特色”,“x”(比如 Kygo x Selena Gomez),“With”等等。但是天才更挑剔,所以我不得不尝试不同的组合。
最终,尝试发现这些问题所花费的时间不再值得。2,840 是总条目的 94%,因此我决定继续前进。下面是每张图中找到的带有歌词的歌曲数量。
摇滚:483
乡村:490
舞蹈/电子:442
流行:240
火爆 100:476
R&B/嘻哈:379
基督教:322
发现不同数量的事实不会影响后面的结果,因为分析比较的是百分比。
歌词清理
为了避免一个单词的多种时态、复数或变体导致遗漏或错误计数,我使用了 leammatisation 将单词分组到它们的词根形式。例如,动词“walked”、“walks”和“walking”都可以归为“walk”。
要做到这一点,所有的单词都需要标注词性。这些标签可以是动词、形容词、副词或名词/其他。通常情况下,你会将句子传递到词性标注器中,但在这种情况下,由于歌曲中缺少标点符号,我将歌词分成几行并传递它们。
对于这两个任务,我使用了 Python NLTK 库,它非常成功。多达 6 个单词被组合成一个共同的源单词。例如,"去"、"去"、"去了"、"去了"、"去了"和"去了"都被组合成"去"。
分析
创建饮酒和酒精词汇列表
我寻找一个预先存在的与酒精相关的关键词列表,但不幸的是没有找到任何关键词。我发现的一些研究使用了关键词列表,但没有分享它们。所以我用高度科学的方法想出了我能想到的所有关键词,并用谷歌搜索同义词试图找到更多。
我把“喝”和“射”从这个列表中排除了,因为它们对饮酒不够具体。我第一次尝试使用它们,但是它们导致了一些高错误率。这对基督教歌曲尤其不利,因为这两个词,11 首歌曲中有 8 首被识别为假阳性。
我得出的最终名单是:
醉,喝,酒精,酒精,宿醉,宿醉,白酒,鸡尾酒,豪饮,烈酒,瓶子,啤酒,苹果酒,麦芽酒,龙舌兰酒,伏特加,葡萄酒,杜松子酒,威士忌,苏格兰威士忌,朗姆酒,波旁酒,香槟,莫吉托,马提尼,代基里,雅格,雅格啤酒,百威啤酒,米勒,库尔斯,喜力,百加得,斯米尔诺夫,酩悦,轩尼诗,酒吧,品脱,消防水,霍奇,月光,烈酒,swig,烈酒
“喝醉了”和“喝了”不会计算过去时态动词“喝了”的出现次数,因为那些“喝醉了”和“喝了”会被解释为“喝了”。不过它们也可以用于其他用途,比如在“我醉了”中作为形容词,或者在“我可以带酒来”中作为名词。
测量饮酒和酒精提及
我使用的衡量标准是至少一次提到饮酒或酒精相关词汇的歌曲的百分比。
闲话少说,Billboard 排行榜中提及饮酒的歌曲比例如下:
哇!乡村音乐歌曲似乎更经常提到酒精。在我看来,40%的歌曲以某种方式提及酒精确实很高,所以我手动检查了 2017 年的乡村歌曲,发现只有一个误报(由罗素·迪克森的《你的瓶子》中的“瓶子”引起),我觉得这是一个可以接受的错误率。如果您记住年终图表用于此分析,那么高的结果更有意义。因此,这并不一定意味着所有乡村音乐歌曲中有 40%提到了饮酒,只是说过去五年中有 40%的热门歌曲提到了饮酒。
差异显著时的假设检验
是时候回答我最初的问题了:是不是更多的乡村音乐歌曲比其他类型的歌曲更多地提到了酒精和饮酒。
如下图所示,乡村音乐和其他音乐类型之间有明显的差异。然而,如果你测量两个不同的组,你会期望结果仅仅因为随机变化而有一点点不同。我想确认差异大到足以具有统计学意义,这是不太可能由随机变异引起的另一种说法。
我放弃了这个测试的热门 100 和基督教排行榜结果,因为热门 100 不是特定的流派,基督教排行榜是一个离群值,它很少提到酒精,至少对我来说,不是一个主流流派。
由于数据是分类数据,我将使用卡方检验来检验统计显著性。这是分类数据,因为歌曲要么提到要么没有提到酒精,没有中间值。巧合的是,这也是我在上一篇文章中使用的测试,用来衡量惩罚中的损失厌恶。
该测试输出一个称为“p 值”的置信度指标,如果它低于我选择的显著性水平,那么可以说测量值不同,测量的差异不是由随机变化引起的。我选择 0.05 的显著性水平,这意味着只有 5%的可能性结论是错误的。无效假设是乡村音乐中提及酒精的歌曲数量与其他流派没有区别。
结果是:
p 值= 2.71698301e-34
结论:差异显著
e-34 表示在 271…偶数开始之前,小数点后有 33 个零。对于 p 值来说,这是一个很小的结果,远远低于 0.05 的要求!无效假设可以被拒绝可以得出结论,乡村音乐歌曲比其他类型的歌曲更有可能提到酒精。
按年份来看提及酒精的歌曲的百分比进一步说明了这种差异,因为可以看出乡村音乐每年都领先。
有趣的事实
喝酒有哪些不同的流派?
苏格兰威士忌和波旁威士忌等提及率很低的饮料类型被排除在该图表之外。
这是 Psy 和 Snoop Dogg 的热门歌曲宿醉,不可思议的被提及了 154 次。几乎所有的提及都来自于在合唱中一遍又一遍重复的“宿醉”。
哪首乡村歌曲的饮酒关键词被提及次数最多?
这是一个三人平手的局面,德克斯·本特利的《醉在飞机上》、布雷特·艾尔缀奇的《醉在你的爱上》、克里斯·斯台普顿的《田纳西威士忌》各被提及 14 次。田纳西威士忌还成功登上了 2015 年、2016 年和 2017 年的排行榜。
酒精提及有趋势吗?
是的,酒精提及率在过去 5 年中上升了 5 个百分点。
在我的 Github 这里 上,图表和歌词的数据集可以作为 csv 文件,以及生成它们的 python 工作簿获得。柱状图是用 Tableau workbooks 制作的,可以在 这里 下载。
深度学习真的需要“大数据”吗?—不!
原文:https://towardsdatascience.com/does-deep-learning-really-require-big-data-no-13890b014ded?source=collection_archive---------4-----------------------
当我告诉人们应该考虑对他们的数据应用深度学习方法时,我得到的一个常见的初步反应是我(1)没有处理足够“大”的数据,以及(2)我没有足够的计算资源来训练深度学习模型。我相信这些假设来自大公司(如谷歌),它们经常喜欢通过对大型数据集进行研究来炫耀,如包含超过一百万张图片的 ImageNet ,并使用大量的 GPU。这对这些公司来说很好,但从我的印象中,一般的深度学习从业者不会处理这样大的数据集(或者甚至不需要),也没有机会访问这样大的计算资源。例如,作为一名研究生,我的资金几乎限制了我只能使用免费的资源,所以我使用谷歌云平台免费提供的(至少一年)K80 GPU 来进行我所有的深度学习。是的,我没有花一分钱进行深度学习,我只用了 1 个 GPU。
我写这篇文章是想告诉你,这些假设是不正确的。深度学习不需要大量的数据和计算资源。这些假设非常有害,因为它们限制了人们利用深度学习的数量,而我认为深度学习有可能改善世界。我举例说明了深度学习不需要“大数据”,方法是训练一个分类器来区分我最喜欢的两种鱼的图片——小丑鱼和蓝色少女(是的,我确实有一个只有这两种鱼的盐水水族馆)。我能够用训练数据集中仅有的 20 幅图像来训练一个准确率为 100%的分类器。我也借此机会举例说明我解决计算机视觉问题的常用方法。事实证明,这些方法中的一些并不一定要达到 100%的准确性,但它们通常对处理更大的数据集非常有帮助(我通常处理成千上万的图像)。代码和示例数据集可在我的 GitHub 上获得。
数据集&模型
该数据集由小丑鱼和蓝色少女的图片组成。在训练组中,每种鱼有 10 条。在验证集内有 11 条小丑鱼和 10 条蓝色少女。我通常在验证集中包含大约 20%的项目,但是这里我有 50%,因为这是一个很小的数据集。
我训练的型号是 Resnet-34 。我不会详细介绍这个模型(也许我会在以后的文章中介绍),但它是一个最先进的卷积神经网络。我们可以利用 Resent(以及许多其他卷积神经网络)已经在著名的 ImageNet 数据集上进行了训练。ImageNet 由来自 1000 个类别的 100 多万张图片组成的大型数据集。这些类别从动物到植物到无生命的物体。尽管在 ImageNet 上训练的模型被训练来区分这 1000 个类别,但事实证明,训练的层可推广到其他数据集。研究人员已经从 ImageNet 上训练的模型中可视化卷积过滤器(见下图),早期层的过滤器检测低级视觉特征,如边缘,直到后面的层,过滤器才拾取更特定于训练数据集的特征。这意味着,根据数据集的不同,预训练过滤器可能会应用于您正在使用的数据集。由于我们正在训练一个分类器来区分两种类型的鱼,并且 ImageNet 包含鱼,所以使用预训练模型可能非常容易。
Image source: https://arxiv.org/abs/1311.2901
训练模型
所以让我们开始训练模型吧!我们再次使用预训练模型。我们将弹出最后一层(区分 1000 个 ImageNet 类别)并添加一个新层,区分小丑鱼和蓝色少女。首先,我们将只训练最后一层。在我们开始训练之前,我们需要选择学习率,这在传统上被认为是很难选择的。解决这个问题的方法是使用循环学习。通过这种方法,学习速率是变化的,并且损失的变化被检查。我们从非常低的学习率开始,逐渐提高学习率。下图演示了这种方法。左图显示,随着迭代次数的增加,学习率也增加。右图是我们如何选择学习率,并显示了作为学习率函数的验证损失。通常,我们选择最高的学习率,此时损失仍在减少,但尚未达到稳定状态。由于这是一个如此小的数据集,我们应该选择什么样的学习速率并不完全明显,但是对于包含更多迭代的较大数据集,这通常更明显。在这里,我选择了 1e-2 的学习率。
我们现在准备开始训练!正如下面所看到的(参见运行的纪元的完整数目的代码),我们已经成功地训练了我们的分类器,具有 100%的准确性来区分小丑鱼和蓝色少女!不太难吧?
改进模型
在这里,我们实现了 100%的准确性,因此我们可能不需要进一步改进模型,但对于绝大多数数据集,要实现高准确性需要做更多的工作。这里有一些我在训练卷积神经网络时经常使用的技术。
数据扩充
改进计算机视觉模型的一种方法是通过数据扩充。数据增强在每个时期都会稍微改变我们的图像。在某种程度上,这就像在没有收集额外数据的情况下向训练集添加更多数据,这有时很困难,甚至是不可能的。这是一个非常强大的方法,根据我的经验,它几乎总能提高分类器的准确性。以下是数据扩充可能对图像进行更改的示例。
差异学习率
在前面的示例中,我们所做的只是训练最后一层,这对于本示例数据集来说很好,但一种强大的方法是训练所有层,但学习率不同。请记住,我们的预训练模型来自 ImageNet。如上所述,先前的工作已经确定来自早期层的滤波器检测低级视觉特征,例如边缘,并且随着我们越来越深入网络,滤波器开始拾取更高阶的视觉特征。因此,几乎总是可能出现这样的情况,即没有必要像训练更特定于训练数据集的后面的层那样训练更早的层。我们训练每一层的程度也取决于它与训练数据集的相似程度。在这个例子中,我们正在训练鱼的图片,这些图片也包含在 ImageNet 中,所以我们不打算对早期的图层进行太多的修改(或者甚至根本不修改!)作为后来的层。
重启的随机梯度下降
我的下一个技巧是使用重启随机梯度下降(SGDR)。SGDR 是学习率退火的一种变体,其中学习率随着训练的进行而逐渐降低。理论是,当我们接近最小值时,我们需要开始使用较小的学习速率,这样我们就不会错过最小值。问题是,我们可能会陷入一个不太有弹性、不能很好概括的最小值。所以我们能做的就是跳回到一个更高的学习率,再次开始降低学习率,并且尽你所能地重复这个过程。这背后的想法如下图所示。
Image source: https://arxiv.org/abs/1704.00109
我在示例 fish 数据集上使用了这种技术,如下图所示。该图显示了学习率随着迭代次数的增加而降低,但是随后学习率跳回(即重新开始)。
我们可以通过改变学习率下降的时间来做得更好,从而重新开始学习。随着训练的进行,我们的模型可能会到达一个更稳定的位置,更接近于最小值。因此,在训练的后期,我们可能不希望频繁地重新开始,所以我们可以加倍(或乘以任何你想要的数字)从最高到最低学习速率的周期。这可以在下图中看到。
结论
从这个分类问题的例子中可以看出,深度学习可以成为解决计算机视觉(以及其他)问题的一个非常强大的工具,即使在小数据集的情况下也能很好地工作。我希望这篇文章将激励目前不使用深度学习的机器学习从业者考虑将深度学习方法添加到他们的工具包中,即使他们无法访问大型计算资源。深度学习已经被证明能够解决以前很难解决的问题,因此,我相信它将继续彻底改变这个领域。同样,如果你有兴趣看代码和示例 fish 数据集,请查看我的 GitHub。
GDPR 威胁到数据科学的未来了吗?
原文:https://towardsdatascience.com/does-gdpr-threaten-the-future-of-data-science-ecf5b99a07a5?source=collection_archive---------4-----------------------
Rick Jo/Dot Magazine
如果大多数组织都知道 GDPR 的新欧洲立法,那么很少有人考虑过这个框架将如何改变数据科学的实践【I】
《一般数据保护条例》将规定商业使用个人数据的内容和方式。该立法将于 2018 年 5 月 25 日生效,适用于所有处理欧洲公民数据的公共和私人组织,无论其运营基础如何。违规罚款可达€2000 万英镑或该组织年营业额的 4%,以金额较大者为准。【ii】让我们来探讨一下为什么 GDPR 应该得到您的充分关注,这项立法是关于什么的,它将如何影响数据科学的实践,以及您可以做些什么来将这种“威胁”转化为机遇。
数据不再是业务流程的简单副产品,而是现代经济的燃料。如果说传统上收集数据是为了反映我们组织和市场的真实情况,那么今天,人们越来越多地利用数据来放大个人如何购买和消费产品和服务的微小细节。因此,组织使用信息技术创建平台来揭示、捕捉和分析消费者体验。由此产生的数据的价值与其说取决于它描述消费者、商品和服务之间关系的精确程度,不如说取决于它在构建预测和影响人类行为的场景中的用途。【iii】
这种对数据的不断追求深刻地影响了个人的隐私和保密性——个人做的、说的、甚至认为的任何事情都很难免受公众的审查。欧洲的《通用数据保护条例》在试图监管私人和敏感数据的商业使用时明确认识到了这些危险。私人数据定义为可用于识别欧洲消费者个人身份的任何信息,以及可用于识别个人身份的任何数据(个人可识别信息)。敏感数据包括对个人健康、宗教、种族背景、政治或性取向的描述,这些信息可能会被用来区分个人。最后,一个特殊的预览保护一般 16 岁以下的儿童-没有明确的父母同意,他们的个人资料不能被收集。
GDPR 推出欧洲公民数字权利法案。数据主体(公民)现在将有权知道正在收集哪些与他们有关的个人数据,收集的地点和目的。公民将有权要求组织删除他们的个人数据,和/或停止处理或进一步传播他们的数据。最后,公民可以恢复以“常用和机器可读格式提供给组织的个人数据,并可以将这些数据转移给第三方。
公司、小企业、国家政府和地方政府将被要求制定流程和内部记录保存要求,以确保符合这些新法规。这些组织,无论是数据收集者还是数据处理者,都需要在设计中实施隐私概念,这一概念基于数据保护应内置于其信息系统核心的原则。组织将被要求只收集对业务绝对必要的数据(数据最小化),并将对个人数据的访问仅限于那些需要处理数据的人。最后,所有公司都必须在 72 小时内通知客户任何可能危及“个人权利和自由”的违规通知。
在接下来的五个月里,为欧洲公民服务的企业需要制定一个行动计划,以满足 GDPR 合规性的最低要求。首先要指定一名项目负责人或数据保护官来监督数据保护战略和实施。他或她的项目团队需要识别和分析当前正在捕获、存储和处理的个人数据。他们需要了解不同的组织利益相关者如何在组织内部或通过第三方分包商处理数据。他们需要提出满足立法要求所需的措施和手段。最后,他们需要制定和实施必要的任务和流程,以确保合规性。
乍一看,GDPR 提出的数据隐私愿景似乎与数据科学家获取新数据源和开发新使用场景的基本职责截然相反。具体而言,该立法将在三个方面影响数据科学的实践:通过对数据处理和消费者档案进行限制,通过在组织使用自动决策来评估信贷申请、招聘和保险决策时赋予“解释权”,以及通过让组织对自动决策中的偏见和歧视负责。【iv】
尽管如此,从长远来看,数据科学的实践将从这些限制中受益。组织需要鼓励基于可靠数据匿名化的数据科学流程。数据科学家需要采取措施,防止来自代理变量、多重共线性和其他原因的间接偏差,以限制歧视性结果。最后,数据科学家在记录从源到目标的所有处理步骤中的数据流时,需要关注数据血统。【第五季】
有兴趣掌握设计和实施有效的 GRPR 合规框架的方法吗? 注册参加我们新的一日大师班,成为数据保护官。商业分析实践是商业分析学院的核心和灵魂。在我们位于巴约纳的暑期学校以及我们在欧洲的大师班中,我们对数字经济、数据驱动决策、机器学习和视觉通信的关注将使分析为您和您的组织服务。
Lee Schlenker 是 Pau 商学院的教授,也是 http://baieurope.com 商业分析研究所的负责人。他的 LinkedIn 资料可以在www.linkedin.com/in/leeschlenker.查看,你可以在https://twitter.com/DSign4Analytics的 Twitter 上关注我们
一份法文抄写本 ici 。
IDC 在 2017 年 5 月对 700 家欧洲公司进行的一项研究发现,25%的受访者不知道 GDPR,超过一半(52%)的人不确定其对组织的影响。在了解新法规的人中,20%的人还没有开始为新的要求做准备,只有 21%的人准备好了应对变化。http://bit.ly/2EfOGZa
【ii】【CNIL(2016)】,欧洲难民保护协议:职业改革
【三】施伦克尔,L. (2017)。关于数据,我们真正需要了解的是什么?,走向数据科学
【iv】丁斯莫尔,T. (2017)。GDPR 如何影响数据科学。
【v】数据科学创新(2015)数据科学和欧盟隐私法规——一场风暴即将来临
医疗保健需要自己的操作系统吗?
原文:https://towardsdatascience.com/does-healthcare-need-its-own-os-82be52234716?source=collection_archive---------15-----------------------
对“全栈”数据驱动的医疗保健系统的需求
作者:Sirj Goswami,Ashok Krishnamurthi,Daanish Jamal
Photo by Zhen Hu on Unsplash
医疗保健行业将从处理大数据的最新技术进步中受益。然而,信息源存在于筒仓中,限制了我们解决医疗保健最复杂问题的能力。我们预计,这些数据壁垒的分解,加上机器学习和人工智能的影响,将形成一个“医疗保健操作系统”的基础,在这个系统中,不同数据源的统一将推动应用程序缩小医疗保健成本和患者结果之间的差距。本文的范围将限于“医疗保健操作系统”的两个关键要素——打破数据壁垒并应用机器学习和人工智能,其他潜在的构建模块如安全和数据隐私没有涉及。
数据驱动的医疗保健影响医疗保健生态系统中的所有主要利益相关方,包括制药公司、保险公司、提供商和患者。作为一名患者,“医疗保健”是一切事物的一部分——从你吃的食物到你消费的药物,到你与之互动的供应商和保险公司。机器学习和大数据在这些垂直行业中的应用将实现“全栈”数据驱动的医疗保健系统。
数据驱动型医疗保健的促成因素
在深入研究数据驱动医疗保健的不同分支以及我们可以采取哪些不同的措施来加速采用之前,了解推动创建数据驱动医疗保健系统的技术、科学和政策的最新发展是有帮助的。以下是我们看到的一些例子:
大数据与富数据的结合。电子健康记录(EHR)的广泛采用从每个患者/提供者交互中收集的成千上万个数据点生成了庞大的数据集。除了标准的患者人口统计数据,EHR 还整合了一些关键信息,这些信息可以极大地提高模型和算法的预测准确性,如实验室值、用药历史和药物输送记录。
我们需要利用这些数据来提高患者护理的质量和效率,而不是将这些数据视为医疗服务的副产品。换句话说,让我们使用数据来预测和改进,而不是仅仅为了合规性的目的而存储它(使它不比他们替换的物理文件更好)。
结合诊断技术进步产生的独特数据源(“丰富数据”),来自 EHR 的大数据和来自诊断实验室的丰富生物标记数据最终将使我们能够提高诊断和治疗疾病的准确性。
新检测支持多维数据。测序成本的大幅下降使得收集基因数据变得更加经济实惠,实验也更加可行。此外,新的检测和分析允许研究人员将生物学观点(RNA 表达、表观遗传学、蛋白质组学)整合到更能代表我们生物学的预测模型中。
机器学习和云计算。通过利用云中几乎无限量的计算和数据存储,随着数据量和丰富度每年呈指数级增长,机器学习(以及其他定量方法)可以更容易地产生新的见解。
大数据和机器学习有着千丝万缕的联系。例如,向一个糟糕的机器学习模型投掷大量数据不会提高该模型的预测准确性。相反,没有足够数据的强大机器学习算法无法有效应用,几乎毫无用处。
被动数据生成。另一个因素是手机和智能手表等信息收集设备的普及。现在全球有 50 亿部手机在使用,其中近一半是智能手机,可以收集一系列实时医疗保健相关数据,这些数据涉及从身体活动、人口统计到睡眠模式的一切。移动设备还提供了与个人医疗保健消费者联系的最佳平台。
宏观层面推动基于价值的护理。新的基于价值的支付模式现在正基于成本、质量和结果进行激励。因为这些新的支付方式有可能颠覆医疗保健利益相关方的传统患者护理和业务模式,所以现在更加关注交付结果和展示护理价值,而不是根据所执行的测试和程序的数量从经济上激励提供者。
数据驱动的医疗保健类别
由于上面列出的发展,大数据和机器学习正在几个领域找到旧问题的新解决方案。当你阅读这份名单时,我们要求你记住采用新的 ML 技术的公司仍然需要克服传统的障碍。例如,在药物发现中,无论新分子是如何发现的(使用或不使用 ML),资产仍将不得不与相同的风险因素相抗衡。制药公司会购买这项资产吗?这种特定的资产与该类别中的其他尝试有何不同?这药有用吗?
更广泛地应用这一概念,理解技术如何影响生态系统中的每个参与者是很重要的。一个公司可能已经确定了一个痛点并开发了一个解决方案,但是他们定义了整个生态系统的反应吗?支付者、提供者和患者采用的激励措施是否一致?
药物发现。该分支将机器学习与基因组学、代谢组学和蛋白质组学相结合,通过识别将在药物开发早期成功的分子来加速药物发现的过程。抽象的层次有很多。联系药物的物理化学性质(如亲脂性、氢原子数量等。)到基因表达、疾病途径、代谢物和蛋白质标记,到细胞形态,甚至下游药物相关的不良事件。这一领域的前景对于药物开发来说是引人注目的。机器学习技术不仅为我们提供了预测最佳化合物的方法,而且我们还获得了对潜在疾病和药理学途径的更深入的生物学理解。
诊断。这个空间将机器学习与疾病标记和/或成像数据相结合,以检测疾病的发作。一些公司和研究小组致力于增强医疗从业者快速识别 CT 扫描或 MRI 图像上的感兴趣区域的能力,例如增强放射科医师快速识别乳房 x 光照片上的感兴趣区域的能力,从而潜在地减少假阳性的数量。几家公司还通过将液体活检与机器学习和基因组数据相结合,专注于早期癌症检测。虽然在这一领域还有一段路要走,但我们相信,随着来自细胞读数的其他数据源(如代谢物、蛋白质、表观遗传学)被整合到预测算法中,癌症的早期检测将更加强大。
人口管理。在这一类别中,医院利用机器学习的大数据来识别高危患者。根据患者的特征,一旦他/她离开医院,此人患后续中风或心脏病的可能性有多大?患者是否需要急性后护理提供者的额外关注以防止下游并发症?
精准医疗。在精准医疗领域,机器学习用于为患有特定疾病的特定患者确定最佳治疗和给药方案。背景应用药物基因组学(基因如何影响药物反应)以及其他相关的临床和人口统计学因素在阐明哪种药物和剂量对给定患者最有效方面有很大希望。例如,InsightRX 专注于利用患者人口统计数据、遗传数据和临床实验室数据,在护理点进行个性化治疗。像基础医学这样的公司从肿瘤中提取 DNA 序列,帮助确定哪种癌症疗法最有效。
临床试验匹配。临床试验操作人员努力将正确的患者与正确的试验相匹配。例如,一个阿尔茨海默氏症患者可能会找到 100 个关于 clinicaltrials.gov 的潜在试验,每个试验都有一个必须阅读和评估的资格标准的详尽列表。公司正在直接用自然语言处理和人工智能算法来解决这个问题,以便更有效地将患者与临床试验相匹配。从患者的记录中提取相关的临床特征,例如症状、诊断、治疗、诊断测量来创建多维向量,然后可以将该多维向量与临床试验资格标准进行匹配,以非常快速地找到适合试验的患者。
坚持和虚拟助手。大数据和机器学习还用于远程评估患者的症状,并仅在需要患者护理时向临床医生发出警报。从临床角度来看,这有可能减少不必要的医院就诊。它还可以减轻医疗专业人员的负担。从患者的角度来看,潜在的假设是,患者需要指南驱动的答案,但也需要有人帮助他们保持正轨。以患者为中心的虚拟健康助理可能是一个很好的选择,可以让患者全天候访问针对其医疗状况定制的最新信息,特别是如果他们不住在医疗保健提供商附近。
机器人辅助手术。认知机器人可以将术前病历中的信息与实时临床和手术指标相结合,以物理方式指导和增强医生的仪器精度。该技术结合了来自实际手术经验的数据,以提供新的、改进的技术和见解。这种改善可以提高患者的总体疗效。
我们开始思考数据驱动的医疗保健在下一波浪潮中会是什么样子。下一代医疗保健创业公司有可能由看似不同的利益相关者之间的数据统一来驱动吗?如前所述,EHR 数据与新检测技术的结合将推动机器学习应用。然而,以统一的方式访问这些数据仍然是一个瓶颈,如果这个问题得到解决,将推动下一代数据驱动的医疗保健应用。在没有定义结构组件的情况下,我们一直在考虑可以在医疗保健操作系统上创建的潜在应用程序。
精确加药。个体化药物治疗的未来将整合难以捉摸的数据类型,如药物依从性、饮食,甚至代谢反应,以优化治疗。精确给药,特别是在门诊环境中,从不同来源的不同数据的统一中受益,提供了患者药理学概况的完整图像。Otsuka/Proteus 合作开发 Abilify Mycyte 系统,该系统被动记录药片摄入的日期和时间,以及某些生理数据,如活动水平,标志着向整合看似不同的数据源和药物治疗的未来迈出了重要一步。
支付者遇到被动可穿戴设备。支付者有可能根据你的 Apple Watch 或 Fitbit 生成的健康数据来评估他们的保费吗?支付者的精算分析可以使用可穿戴健康数据作为输入并自动调整保费吗?联合医疗正在探索这个想法。
个性化健康。中国公司 iCarbonX 正在创造一种更具雄心的医疗保健操作系统。该公司正在寻求从传统诊断设备收集数据——基因组测序、血液生物标志物、代谢物、心脏数据——以及通过“智能厕所”从微生物组测试等许多其他来源收集数据。虽然最终结果仍有待观察,但将这类信息与非传统来源(如 PatientsLikeMe 等健康网站上的论坛帖子)相关联的努力可能会证明跨部门医疗数据的价值。
展望未来
电子健康记录、诊断技术、云计算的进步以及向基于价值的医疗服务的转变降低了大数据和机器学习从根本上转变医疗保健系统的激活能量。
为了改善现有的进展,我们应该考虑用不同的方式做一些事情。作为一个社区,我们需要逐渐减少我们令人愤慨的主张,并保持古怪的承诺。如果使用得当,营销是一个强有力的工具。我们需要小心,不要本末倒置,宣称尚不存在的利益。复杂性来源于用正确的数据训练模型的时间,提出正确的临床问题的时间,从科学和医学角度理解疾病的时间。
例如,当 IBM Watson 著名的 Jeopardy 亮相将人工智能推出科幻领域时,它很快成为医疗保健中机器学习应用的典范。社区希望沃森能够综合患者症状、基因序列、病理报告、医生笔记,甚至相关的期刊文章,以帮助医生进行诊断和治疗,这是一个大胆而有临床意义的目标。
然而,沃森还没有能够实现这一承诺。它最近的批评不是该公司的失败,而是源于媒体对沃森现在应该走多远过于乐观的说法。使用机器学习来提高诊断和治疗的准确性是一项艰巨的任务,这将需要时间,并且比通常认为的要复杂得多。
我们需要根据附加的临床和经济价值进行沟通,而不是通过诸如“预测”和“ROC”曲线之类的行话。此外,我们需要适当地交流统计数据,并注意我们没有滥用它来支持未经证实的说法。
我们也应该与我们使用的术语保持一致。我们都习惯于交替使用机器学习、大数据、丰富数据和人工智能等术语,这可能会造成下游混乱,并最终成为广泛采用的又一个摩擦点。
认识到机器学习和大数据最终是帮助提供指导和建议的工具至关重要。关于取代临床医生的故事已经遍布医疗保健领域,然而,医疗保健从业者决不会被取代。为了让这些工具有效地发挥作用,我们需要注意使用这些工具的关键医疗保健人员以及他们在整个患者旅程中的角色。
人类和 AI 机器在本质上是共生的。我们拥有直觉和同理心,这是高质量患者护理所必需的两个关键特征。机器可以理解大量的数据,并且(通过正确的算法和数据)在模式识别方面非常强大,使我们能够预测特定患者的未来健康状态。将直觉和同理心与精确预测的能力相结合代表了医疗保健的未来。
骑车时力量和心率是齐头并进的吗?
原文:https://towardsdatascience.com/does-power-and-heart-rate-go-hand-in-hand-when-you-ride-a-bike-37a174785f37?source=collection_archive---------10-----------------------
充分利用电表的数据分析方法。
介绍
你有功率表或者考虑买一个吗?也许你认为这样的设备是下一个收集成千上万数据却不给你任何信息的小工具?不管你的主要动机是什么,继续读下去。
在这篇短文中,我将尝试通过户外骑行期间收集的功率表和心率的数据分析来指导您。对于统计计算和图形,我使用了 R 软件,所有代码都包含在文本中,供您参考。
这种关系的理论很简单。锻炼时你付出的努力越多,你的心率就必须向你的肌肉输送更多的血液,以便输送燃料(糖原)和氧气。
并发症来自人体生理和锻炼环境。肌肉含有能量储备,可在紧急情况下立即使用。这种储存不会持续很长时间,但足以延迟心脏反应一段时间。户外环境对数据分析师来说也不是那么友好。丘陵、风或不平的道路使得骑自行车的人几乎不可能在最短的时间内保持稳定的功率输出水平。此外,大多数锻炼都设计了低功率输出和高功率输出的间隔,从而不断地来回拉动您的心率。
线性回归从 R 开始
在我们开始处理数据之前,我们需要准备一个 R 环境包,它可以很好地解释 Garmin fit 文件。如果你遇到任何问题,不要害怕在评论中提出问题。我们将同时加载所有的库,因此我们将完全覆盖这一部分。
#In order to install directly from github you have to get and use devtools
install.packages('devtools')
library(devtools)
assignInNamespace("version_info", c(devtools:::version_info, list("3.5" = list(version_min = "3.3.0", version_max = "99.99.99", path = "bin"))), "devtools")
#Library that is used to read garmin fit files is here [https://github.com/kuperov/fit](https://github.com/kuperov/fit) but it is better to use fork as this has more recent SDK.
#add CXXFLAGS=-g -std=c++11 in C:\Program Files\R\R-3.5.1\etc\i386\Makeconf
install_github("russelldb/fit")library(fit) # read fit files
library(ggplot2) # plots in R
library(TTR) # Exponential Moving Average
library(gridExtra) # Plots aggregator
library(dplyr) #lag and leadoptions("scipen"=100, "digits"=4) #print numbers in normal notation#The part that reads exported workout file from Garmin Connect
cycling <- read.fit('2951865119.fit')
现在我们有了所有可用的数据,我们可以绘制功率和心率图。
#Prepare data
record <- cycling$record # make record data frame available globally
record <- record[!is.na(record$power) & !is.na(record$heart_rate) ,] # remove NA
record$time <- (record$timestamp-record$timestamp[1])/60 # Show time in minutes
record$from_start <- record$timestamp - record$timestamp[1] # create variable seconds from start#Plot the first graph
ggplot(cycling$record, aes( x=time)) +
geom_line(aes(y = power, colour = "Power")) +
geom_line(aes(y = heart_rate, colour = "Heart Rate")) +
theme(axis.title.y=element_blank()) +
ggtitle("Power and Heart Rate")
正如你可能看到的那样,这种相关性是存在的,但是我们不应该期望有什么强的相关性。首先,测得的输出功率比我们在心率中看到的噪声(或方差)多得多。第二件事是,当你停止踩踏板时,功率为零,而心率仍然保持在高水平。
让我们从基本的线性回归开始,即心率直接取决于产生的功率。
#linear regression
linearMod <- lm(heart_rate ~ power , data=record)
summary(linearMod)
在对我乘坐的数据进行快速计算后,我得到了如HRM = 105.33 + 0.1057 * PWR
这样的模型。这两个参数都具有统计学意义,更重要的是,它们都有很好的解释。105
是我的基础心率,0.10
是力量增长比率。调整后的 R-squared: 0.29
,表明模型只在很小的百分比上解释了数据。
心率功率的高级建模
首先,让我们注意到功率比心率有更大的可变性,为了能够得到更好的解释,我们需要以某种方式重新调整它。此外,权力积累本身的内部和驱动心率在一个体积。可以用来实现它的一种方法是使用一段时间的平均值。
我们再加上一个可以反映疲劳的变量。最简单的方法是加上从健身程序开始算起的秒数。
HRM ~ moving_average(PWR, window) + time from start
我们将使用指数移动平均线而不是简单移动平均线,因为 SMA 被认为有一个被称为“吠两次”的问题。这对于耐久性数据来说尤其不方便,因为过去努力应该只有最小的影响。
现在,问题可能是最适合我们的模型的最佳窗口参数是什么。让我们把它当作一个参数来估计,我们将迭代地做 0 到 250 秒之间的窗口大小的线性回归。
iterations = 250L
variables = 5
output <- matrix(ncol=variables, nrow=(iterations))
for (i in c(1:iterations)){
print(i)
linearMod <- lm(heart_rate ~ EMA(power,n=i) + from_start, data=record)
summary <- summary(linearMod)
output[i,] <- c(i,summary$r.squared, summary$coefficients[1],summary$coefficients[2],summary$coefficients[3])
}summary.df <- data.frame(output)summary.df[summary.df$X2==max(summary.df$X2),]
window <- summary.df[summary.df$X2==max(summary.df$X2),1] #declare variable for future useggplot(summary.df, aes(x = X1)) +
geom_line(aes(y = X2, colour = "R"), show.legend=F) +
xlab("[s]") +
theme(axis.title.y=element_blank()) +
ggtitle("R over mean window")
随后的下降有明显的局部最大值,这给这种方法以信心。r 平方增加到 0.78,这是一个体面的模型拟合。自行车静息心率下降到 84,这也是更可信的值。随着功率的下降,增长率略有上升。当平均值的窗口大约为 43 秒时,模型达到最佳拟合。
最后一个值得检查的是基础 HR 和增长比率的行为。
plot1 <- ggplot(summary.df, aes(x = X1)) +
geom_line(aes(y = X3, colour = "Base HR"), show.legend=F) +
xlab("[s]") + theme(axis.title.y=element_blank()) +
ggtitle("Base HR over mean window")
plot2 <-ggplot(summary.df, aes(x = X1)) +
geom_line(aes(y = X4, colour = "Base HR"), show.legend=F) +
xlab("[s]") + theme(axis.title.y=element_blank()) +
ggtitle("Growth ratio over mean window")
grid.arrange(plot1, plot2, nrow=2)
您可以看到,随着窗口大小的增加,基础 HR 不断下降,并稳定在一个更小的值。
ne 可能会问引入移动平均是否足以让模型完美拟合,并质疑心率反应是否有立竿见影的效果。事实上,我们应该以类似的方式检查滞后或超前是否改进了模型。
新模型将会是这样的:
HRM ~ moving_average(lag or lead(PWR,difference), window) + time from start
估计也是基于迭代方法,但这次我们需要计算每个i
的滞后和超前
iterations = 125L
variables = 5
output <- matrix(ncol=variables, nrow=(iterations*2-1))
for (i in c(1:iterations-1)){
print(i)
linearMod <- lm(heart_rate ~ lead(EMA(power,n=window) ,n = i) + from_start, data=record)
summary <- summary(linearMod)
output[i+iterations,] <- c(i,summary$r.squared, summary$coefficients[1],summary$coefficients[2],summary$coefficients[3])
linearMod <- lm(heart_rate ~ lag(EMA(power,n=window) ,n = i) + from_start , data=record)
summary <- summary(linearMod)
output[iterations-i,] <- c(-i,summary$r.squared, summary$coefficients[1],summary$coefficients[2],summary$coefficients[3])
}linearMod <- lm(heart_rate ~ EMA(power,n=window) + from_start , data=record)
summary <- summary(linearMod)
output[iterations,] <- c(0,summary$r.squared, summary$coefficients[1],summary$coefficients[2],summary$coefficients[3])summary.df <- data.frame(output)summary.df[summary.df$X2==max(summary.df$X2),]
summary.df[summary.df$X4==max(summary.df$X4),]
summary.df[summary.df$X3==min(summary.df$X3),]ggplot(summary.df, aes(x = X1)) +
geom_line(aes(y = X2, colour = "R"), show.legend=F) +
xlab("[s]") + theme(axis.title.y=element_blank()) +
ggtitle("R with difference")
plot1 <- ggplot(summary.df, aes(x = X1)) +
geom_line(aes(y = X3, colour = "Base HR"), show.legend=F) +
xlab("[s]") + theme(axis.title.y=element_blank()) +
ggtitle("Base HR with difference")
plot2 <-ggplot(summary.df, aes(x = X1)) +
geom_line(aes(y = X4, colour = "Base HR"), show.legend=F) +
xlab("[s]") + theme(axis.title.y=element_blank()) +
ggtitle("Growth ratio with difference")
grid.arrange(plot1, plot2, nrow=2)
当没有超前或滞后时,达到模型的最佳拟合,并且基本 HR 的最小值和增长率的最大值同时达到。这是理想的,但是小的滞后或超前值也是可以接受的,因为可能会有一些设备记录时间不匹配。
另一件值得检查的事情是线性回归残差的分位数-分位数图。基本上,它告诉你没有被解释的部分是一个随机的正常噪音还是有一些隐藏的模式在里面。
linearMod <- lm(heart_rate ~ EMA(power,n=window)+ from_start , data=record)
summary(linearMod)
plot(linearMod)
在完美的排列中,所有的点都应该在一条直线上。在我们的例子中,尾部没有被很好地放置,这可能暗示了模型的一些改进领域。
最后一部分是用热图交叉检查一张图上的所有数据。因此,我们将同时检查窗口大小参数和滞后或超前。
#check for moving average
iterations = 201L
variables = 6output <- matrix(ncol=variables, nrow=iterations^2-1)
for (j in c(1:iterations)){
for (i in c(1:(iterations/2L))){
print(iterations*(j-1)+i)
linearMod <- lm(heart_rate ~ lead(EMA(power,n=j),n=i) + from_start , data=record)
summary <- summary(linearMod)
output[iterations*(j-1)+i+iterations/2,] <- c(i,j,summary$r.squared, summary$coefficients[1],summary$coefficients[2],summary$coefficients[3])
linearMod <- lm(heart_rate ~ lag(EMA(power,n=j),n=i) + from_start , data=record)
summary <- summary(linearMod)
output[iterations*(j-1)+iterations/2-i,] <- c(-i,j,summary$r.squared, summary$coefficients[1],summary$coefficients[2],summary$coefficients[3])
}
linearMod <- lm(heart_rate ~ EMA(power,n=j) + from_start , data=record)
summary <- summary(linearMod)
output[iterations*(j-1)+(iterations/2L),] <- c(0,j,summary$r.squared, summary$coefficients[1],summary$coefficients[2],summary$coefficients[3])
}summary.df <- data.frame(output)summary.df[summary.df$X3==max(summary.df$X3),]ggplot(summary.df, aes(x = X1,y=X2, color=X3)) + geom_point() + scale_colour_gradientn(colours=rainbow(4)) +
labs(x = "Lag value", y = "Mean", color ="R")ggplot(summary.df, aes(x = X1,y=X2, color=X4)) + geom_point() + scale_colour_gradientn(colours=rainbow(4)) +
labs(x = "Lag value", y = "Mean", color ="Base HR")
我想在这里展示的最后一件事是受过训练和未受过训练的运动员之间的比较。为此,我们有一组来自经常训练的高级选手和新手的数据。我们做了 5 分钟 150W 稳定负荷下的心率模拟。为了简化,不存在预热。
#Prepare data
cycling2 <- read.fit('Szosa-4x1395-98%FTP/2863955610.fit')
record2 <- cycling2$record # make record data frame available globally
record2 <- record2[!is.na(record2$power) & !is.na(record2$heart_rate) ,] # remove NA
record2$from_start <- record2$timestamp - record2$timestamp[1] # create variable seconds from startrobert <- lm(heart_rate ~ EMA(power,n=116) + from_start, data=record2)
marek <- lm(heart_rate ~ EMA(power,n=43) + from_start, data=record)warmUp <- rep(0,3*60)
powerPhase <- rep(150,5*60)
coolDown <- rep(0,5*60)power <- c(warmUp, powerPhase, coolDown)
from_start <- as.numeric(seq(power))experiment <- data.frame(power,from_start)
experiment$heart_rate1<-predict(robert,experiment)
experiment$heart_rate2<-predict(marek,experiment)
experiment$time <- experiment$from_start/60 # Show time in minutesggplot(experiment, aes( x=time)) +
geom_line(aes(y = heart_rate1, colour = "Heart Rate Advance")) +
geom_line(aes(y = heart_rate2, colour = "Heart Rate Novice")) +
theme(axis.title.y=element_blank()) +
scale_x_continuous(limits = c(2, 12)) +
ggtitle("Power and Heart Rate")
接下来呢?
- 构建一个出色的应用程序来处理您的数据
- 分析恢复时间,因为受过训练的运动员应该恢复得更快
- 将厌氧效果添加到模型中
如果您发现任何不清楚的地方,请留下评论或提出问题。
强化学习可以使用更多的监督吗?
原文:https://towardsdatascience.com/does-reinforcement-learning-require-more-supervision-4378e839c339?source=collection_archive---------4-----------------------
Apparently this is a popular video game. Video games are an area of apparently-relevant ML knowledge where my scope of understanding is woefully incomplete
当我最初读到这篇论文的标题通过预测未来来学习行动时,我满怀希望地认为,它将为一个我已经思考了一段时间的问题添加一个令人信服的解决方案:在头脑中没有特定目标的情况下,是否有可能教授一个强化学习模型来了解世界。这是真的:在某种意义上,这篇论文解决了这个问题,但我发现它比我希望的更有限。
本文的核心实现细节是,教导代理玩第一玩家射击游戏 Doom,而不是基于奖励值的学习,实际的学习是基于强迫我们自己建立一些小的可见测量值的良好预测:健康、耐力和杀戮。这到底是怎么回事?
Network architecture diagram from the Learning to Act… paper
网络最终产生的输出是一个向量,长度等于你试图预测的测量值的数量,乘以你可以采取的可能行动的数量,它代表了我们对我们每个可能行动的世界中的那些测量值的预测。例如,如果我们想象我们的一个动作是“向前一步”,那么向量中的元素 0、1 和 2 可能是我们对从现在起 3 步后的健康、从现在起 3 步后的死亡和从现在起 3 步后的耐力的预测,假设我们从当前状态“向前一步”采取动作。该载体有两个用途:
- 它帮助我们决定采取什么行动。在本文中,用于选择行动的代理的目标函数由权重定义,该权重指定了三个关键度量中的每一个在我们的目标函数中所占的比例。例如,我们可能对未来的健康赋予 0.5 的权重,对未来的耐力赋予 0.5 的权重,对未来的杀戮赋予 1.0 的权重。在这种情况下,我们采用模型对健康/耐力/死亡的预测,并采取行动,使加权组合在预期中最高。
- 它提供了模型训练的损失来源。一旦我们选择了要采取的行动,我们就可以观察预测测量的实际值,并可以根据预测和现实之间的差异来计算损失。这是一个简单的均方损失,用来训练我们的模型。
[下一段重点介绍如何创建预期行动预测向量的机制;如果您只是在寻找方法的整体直觉,请随意跳过]
继续向后工作,对应于每个动作的预测向量通过两个向量的组合来学习:期望向量和每个动作向量。这仅仅意味着我们两者都要学
- 代表我们平均期望的向量,例如,如果我们想象我们只是从动作分布中随机抽取动作,我们的预测会是什么,以及
- 一个向量,表示与每个动作相对应的期望值的“偏移”。例如,如果我们预测的平均期望值是(4,90,1),如果我们“向前一步”的预测是(5,88,2),那么“向前一步动作”的偏移量将是(1,-2,1)
您可能会注意到,期望向量比完整的动作偏移向量短得多,因为它总共只包含一组预测,而不是每个动作一组。而且,你可能是正确的:为了使向量数学起作用,期望向量被“平铺”,即一遍又一遍地重复,直到它与动作偏移向量的长度相同。这些“期望”和“行动”子网建立在三个输入源的基础上:当前状态的像素(进入卷积网络)、当前测量值(进入一组紧密连接的层)和当前目标向量,也就是前面在如何选择下一个行动的上下文中讨论的测量值的权重向量。如果你对为什么要添加目标向量作为输入感到困惑,我也是;我稍后会谈到这一点。
当你在普通游戏中从健康和最终杀戮的角度来看性能时,这种方法确实比两种当前非常流行的强化学习技术要好:双 Q 学习和异步优势演员-评论家(A3C)。
所以。这些都是令人印象深刻的图表。我的缺乏热情源于哪里?为了解释这一点,我认为稍微了解一下强化学习的理论是有益的。本质上不是定理或方程,而是强化学习问题的什么使它们首先变得独特和困难?
I regret nothing
在像国际象棋和围棋这样的游戏中,你需要学习长期策略,以便让自己更接近胜利。然而,至关重要的是,在任何给定的时间点,你的棋子的可见位置和预期的最终奖励之间没有人类已知的映射,例如获胜的概率。你不能说赢的本质是这里有 3 个棋子,这里有 4 个,等等,如果你达到了这个标准,你就赢了。这种映射是模型在训练过程中必须学习的。相比之下,在本文中,我们硬编码了观察变量和报酬之间的映射,因此模型需要学习的只是如何预测观察变量。
我认为这是我对论文框架感到沮丧的核心:模型预测的“度量”与其目标并没有太大的不同。目标只是测量值的加权组合。在(1,1,1)目标向量的情况下,这个模型框架相当于“预测从现在开始三步你将积累的奖励金额”。因为这些测量是由人类手工选择的,并手工映射到奖励上,它们似乎并没有真正实现我所希望的承诺:以一种更不受监督的方式从未来发生的事情中学习。
综上所述,我认为,如果你忘记了衡量与奖励的关系,只看它们相等的情况,这种模式与 DQN 和 AC3 相比的表现确实表明,在你经常获得奖励的环境中,这种模式具有很强的竞争力。在 DQN 和 AC3,行动的价值(/Q 函数)本质上是递归的:对行动和游戏结束之间将获得的奖励金额的预测。这篇论文建议,你可以通过直接优化从现在开始的几个步骤来做得很好,而不是使用更复杂的过程,通过长长的梯度传递链来到达游戏的结尾。在需要长期战略的环境中,这显然是不够的,但在更短期的情况下,这种降低的复杂性可能会提供很多价值。
总而言之,这篇论文的一个(间接)贡献是,它让我更清楚、更清晰地思考“学习一套行为”这一大伞下的不同类型的问题,以及这些问题的不同奖励结构如何能够、也应该引导你以根本不同的方式将这些问题概念化,这是我非常欣赏的。
*该论文实际上使用了一系列帧的测量结果,但就人类游戏时间而言,这是一个相对较短的窗口;3-4 秒。
Spotify 周日的图表与本周其他时间有所不同吗?
原文:https://towardsdatascience.com/does-spotifys-chart-on-sunday-differ-from-the-rest-of-the-week-d7272f300508?source=collection_archive---------9-----------------------
审视我自己的倾听行为,我经常承认,与一周中的其他时间相比,我在周日倾向于有不同的偏好。这一天,你只想以较慢的速度做事,包括 BPM。不过,我想知道,如果不仅仅是我,是否会有很多其他荷兰 Spotify 用户陪着我...根据我的经验,我注意到当你在周一看图表时(显示周日的热门曲目),你可以发现与本周其他时间相比有一些细微的差异。一些浮出水面的想法,进一步调查 Spotify 在周日和本周其他时间的前 200 名之间的差异。
数据集
- 我收集了从 1 月 5 日到 5 月 17 日荷兰的所有 Spotify 每日排行榜。这是通过网页抓取方法完成的。
- 为了更准确地了解工作日之间的差异,我必须检索所有排行榜上的艺术家的相关流派。这可以通过 Spotify 的 API 来实现。
- 为了查看声音是否有差异,我还检索了所有排行榜曲目的声学变量。这也是 Spotify 的 API 功能之一。
- 通过 Spot on Track 我设法获得了 Spotify 的 Easy on Sunday 播放列表中多个周日的曲目列表,从 1 月到 5 月。
声音的差异
在我之前在 Eurovision 发表的文章中,我描述了 Spotify 分配给音轨的声学变量。我们还可以利用这些来确定周日和本周其他时间的排行榜上的曲目之间是否有任何差异。所以基本上我们试图回答周日的星盘与本周其他时间相比是否有所不同。
如下图所示,我们可以断定声音和仪器与前几天相比表现出色。化合价(情绪)、dancebility 和能量表现略差。
看着这些指数得分,我觉得这很符合人们可能会认为周日更舒适的假设。效价(情绪)测量的指数为 0.95 也是有意义的,因为这个变量是从 0(悲伤)到 1(快乐)来测量的。
流派差异
当你在周一看 Spotify 排行榜时,你会立即注意到相当多的歌曲的流量和位置有所下降。为了更好地了解不同流派在工作日的份额,我检索了 Spotify 前 200 名中出现的歌曲/艺术家的所有相关流派。从那以后,对于每个流派,我都根据图表收录/流来计算每个工作日的份额。
与一周的其他时间相比,乡村音乐、流行音乐、创作歌手、新成熟音乐、灵魂乐、摇滚、民谣、独立音乐和荷兰流行音乐、独立音乐和摇滚音乐在周日的排行榜上所占的份额明显更高。
相反,我们看到像(荷兰)Hip Hop、Pop 和 EDM 这样的流行流派在周日有所下降,但与我们在周日看到高增长的流派相比,它们的份额在一周的其余时间里保持更加一致。
播放列表影响
Spotify 在荷兰最受欢迎的播放列表之一是他们的 Easy on Sunday 播放列表 。我以前注意到,这个播放列表的策展与周日的新图表条目有相似之处。通过查看从 1 月到现在的 19 个周日,我想更好地了解这个播放列表在那个特殊的日子对荷兰排行榜的影响。这个播放列表对周日的 Spotify 排行榜有直接影响吗?
平均而言, 32%的曲目 (32 首不同的曲目,因为播放列表由 100 首曲目组成)被放置在周日播放列表中,并在同一天(周日)出现在图表中。
可以肯定的是,它不仅仅是以流行音乐为特色,而是在整个一周内都出现在图表中,我对其他工作日做了同样的计算。事实证明,周一至周五和周六、、分别出现在排行榜和《周日轻松》中的曲目平均数量为 5.5% 和 16.6%,这意味着该播放列表在周末对排行榜有重大影响——导致相当多的新曲目仅出现一天。大多数曲目的位置范围在 101 和 200 之间,而播放列表位置高的曲目往往会进入前 100。
下图显示了在过去的几个月里,播放列表中当天就出现在排行榜上的歌曲的百分比。
放弃
- Spotify 给艺术家贴了很多不同流派的标签。对某些子类型进行了分组,以保持一个全球概览。
- 上面提到的所有分析和结果完全基于荷兰 Spotify 图表。因此,这些结果可能与其他地区不同。最后,这只是涵盖了 Spotify 平台的图表部分,不应被视为 Spotify 图表范围之外的收听行为的整体表现。
感谢阅读!如果你喜欢读这篇文章👏🏻很感激。
使用深度学习的犬种分类:一种实践方法
原文:https://towardsdatascience.com/dog-breed-classification-hands-on-approach-b5e4f88c333e?source=collection_archive---------2-----------------------
Preview of images from Stanford Dogs Dataset
问题
几天前,我注意到由 Kaggle 主办的犬种鉴定挑战赛。我们的目标是建立一个模型,能够通过“观察”狗的图像来进行狗的品种分类。我开始思考建立这样一个模型的可能方法,以及它可能达到的精确度。似乎有了像 TensorFlow 这样的现代机器学习框架,以及公开可用的数据集和预先训练的图像识别模型,这项任务可以以相当高的准确度解决,而无需付出太多努力和花费太多时间和资源。我将分享使用 TensorFlow 构建犬种分类器的端到端过程。
repo包含重现训练和使用训练好的模型运行推理所需的一切。
训练数据集
拥有一个好的训练数据集是迈向健壮模型的一大步。斯坦福狗数据集有大约 20000 张 120 个品种的狗的图片。数据集中的每张图片都标注了显示的狗的品种。你可能已经注意到,只有 120 个不同品种的大约 20000 张图片(每个品种大约 200 张图片)不足以训练一个深度神经网络。卷积神经网络(CNN)是公认的用于图像分类的最佳机器学习模型,但在这种情况下,没有足够的训练样本来训练它。它将无法从这个数据集中学习足够通用的模式来对不同的狗品种进行分类。最有可能的是,它会过度适应这少量的训练样本,从而降低测试集的准确性。有两种可能的方法来缓解缺乏训练样本的情况:
- 将 dogs 数据集与另一个更大的带有图像的数据集(即 ImageNet )合并,并在这些合并的例子上训练 CNN。
- 在一个更大的数据集上采用一个已经预先训练好的深度神经网络,切入其中,并附加一个额外的“分类头”,即几个额外的完全连接的层,Softmax 层位于它们的顶部。
第一种方法有两个很大的缺点:需要分析的数据量要大得多,而且在这个大数据集上进行训练需要花费更多的时间和资源。第二种方法似乎很有希望:必须在原始数据集上执行训练,并且训练仅具有几个完全连接的层的“分类头”将不需要大量的时间和资源。
在较小的数据集上训练带有“分类头”的预训练模型的方法被称为迁移学习。
迁移学习确实起作用的原因在于 CNN 的工作原理。有相当多的资源详细描述了这一点,例如http://cs231n.stanford.edu/。简而言之,在大数据集上训练的深度神经网络的底层捕获图像的低级图元(例如,轮廓和简单形状),使得这种知识对于所有图像是通用的,并且可以“转移”到任何图像识别问题。
神经网络模型
所以最终的神经网络模型如下:
图像被输入到初始模型中。Inception 模型的输出经过几个完全连接的(FC)层,最后 softmax 输出图像属于每个类的概率。只有代表“分类头”的 FC 层必须接受培训。初始模型保持冻结,并带有已经预定义的模型参数。
下载和准备数据
下一步是下载 dogs 数据集,并通过 Google Inception 模型进行预训练。从回购的根目录执行时,setup/setup . sh脚本将下载所有内容,进行解压缩,并放入适当的目录。下载和提取后的 Dogs 数据集是一组文件夹,在单独的文件中包含图像和注释。TensorFlow 有一个漂亮的数据集 API ,它可以更好地处理 TF Records 数据格式。这个想法是将所有的训练示例和它们的注释保存在一个文件中,所有的示例都以一个 protobuf 序列化的形式存储在这个文件中。TensorFlow Dataset API 可以有效地处理这种数据格式,并在训练期间以最少的磁盘 I/O 操作和内存需求加载所需数量的示例。有一个 python 脚本将原始 dogs 数据集转换成 TF 记录文件,以备训练使用:
它必须从回购的根目录执行。转换数据集可能需要大约 1 小时。每一个图像都被输入到初始模型中,并且它的输出与图像和其他注释一起被存储。这简化了训练,因为我们不需要在训练期间计算每个例子的初始输出,而是,它已经被预先计算并且准备好被使用。结果 TF Records 文件将在data/Stanford . TF Records . setup . sh 中脚本还下载并提取 Google 的 Inception 模型,表示为冻结的 TensorFlow 图。冻结意味着所有变量都被替换为常数并嵌入到图形本身中,这样就不需要为了将模型加载到 TensorFlow 会话中并开始使用它而将检查点文件与图形一起携带。初始模型在freezed/Inception/classify _ image _ graph _ def . Pb .中
培养
下一步是实际执行培训。首先,可能会给模型一个唯一的名称。第二,应该配置多个完全连接的层和这些层中的多个单元。可以在src/common/consts . py模块中配置。
默认情况下,有两个 1024 和 120 单位的完全连接层。并且输入层具有 2048 个单元,这等于初始模型的最后一层中的单元数量。
src/training/train . py做训练。学习率、时期数和小批量大小可以在脚本本身中配置:
另外,张量板可以启动用于训练监控:
有三个可用的度量:成本、测试集上的错误和训练集上的错误。默认情况下,错误率是针对训练集中的 3000 个示例和也有 3000 个示例的整个测试集计算的。我用以下超参数训练模型:
- 小批量= 64
- 学习率= 0.0001
- 纪元计数= 5000
以下是我在 TensorBoard 中获得的这三个指标的数据:
Cost
Test set error
Error on a sample from the training set
执行 5K 个纪元花费了大约 1 小时。培训结束后,指标具有以下值:
- 成本= 0.1
- 测试误差= 2.7%
- 训练误差= 2.5%
这两个错误在测试集和训练集上都非常低。并且由于训练集上的误差与测试集上的误差大致相同,因此不存在对训练集的严重过度拟合的症状。
冻结模型
一旦模型被训练,其优化参数被存储在的检查点文件中。/检查点目录。为了有效地重用模型进行推理,最好将它作为一个冻结的张量流图,并将参数嵌入到图本身中。这可以使用src/freezing/freezy . py:来完成
该脚本按以下顺序执行几项操作:
- 将初始模型和“分类头”模型加载到同一个 TensorFlow 会话中,并将它们一起绑定到单个计算图中,以便初始模型的输出直接进入“分类头”模型的输入。一旦绑定完成,脚本就会在文件系统上序列化图中的复合模型。此时,图形还没有冻结,因为在训练期间计算的模型参数仍然在检查点文件中。
- 使用 tensor flowfreeze _ graph函数冻结上一步生成的图形。它从检查点文件中获取模型参数,并将它们注入到图形变量中。图形变量依次被转换成常量。结果文件转到。/冻结了目录下的型号名称。
推理
一旦冷冻模型准备好了,就可以对任意图像进行分类了。src/inference/classify . py脚本能够对存储在文件系统上或作为 HTTP 资源可用的狗图像进行分类。在幕后,它加载冻结的图形并将图像输入其中。这里有两个例子来说明推论是如何对艾尔代尔梗和西施犬起作用的:**
如果你只是想玩玩推理是如何工作的,有一个 docker 容器,里面装着所有的代码和冻结的模型。它公开 Python notebook 进行推理。它实际上已经为在 docker 容器内部进行培训做好了一切准备。可以使用以下命令启动容器:
一旦容器启动,浏览浏览器到http://localhost:8888/notebooks/Inference.ipynb
,你将能够对你自己的图片进行分类。
错误分析
仔细研究机器学习模型未能正确分类的例子总是一个好主意。脚本src/analysis/training _ perf _ analysis . py生成CSV 文件(它转到 metrics/training_confusion.csv ),其中包含所有训练示例的预测和实际品种。
通过从 training_confusion.csv 加载数据,可以绘制混淆矩阵:
这里很难进行详细的分析,因为品种太多了。让我们试着找出前 30 对分类错误的品种(如何做的例子可以在 Confusion.ipynb 中找到):
Top 30 misclassified pair of breeds
可以看出,这一对“丝毛梗/约克夏梗”在错误分类方面是绝对的领导者,如果我们研究一下这两个品种的狗看起来像什么,这确实是有意义的。
丝毛梗和约克夏梗似乎经常被人混淆。更多详情在本文。
你喜欢狗吗?
如果你认为自己是个爱狗的人,你可以直接问模特你是什么品种:)就我而言,我得到了以下答案:
Miniature Pincher! What?
结论
正如我们所见,如果您可以访问预训练的深度神经网络和 TensorFlow 等现代机器学习库,即使您没有足够的训练图像和/或计算资源,也可以训练一个鲁棒的图像分类器。
那是什么品种的狗?
原文:https://towardsdatascience.com/dog-breed-identification-e3c6d6b4be84?source=collection_archive---------8-----------------------
利用深度学习确定狗的品种。
我参加了这个游乐场 kaggle 竞赛,目标是创造一个能够从照片中确定狗的品种的分类器。该数据集包括 120 种狗。下图显示了每个品种的狗的数量在 60 到 130 之间。
number of dogs VS breed
我们将使用建立在ResNeXt-50网络架构上的预训练模型。该模型在 ImageNet 数据库上训练,该数据库包括分布在 1000 个类中的 120 万个图像。
改善深度学习模型的关键实践
数据扩充:
要改进一个 DL 模型,最重要的事情就是给它更多的数据。如果你持续训练你的模型一段时间,它会开始过度拟合。
过度拟合意味着模型正在学习识别训练集中的特定图像,而不是学习可以转移到验证集中的一般图像。
如果您的训练集损失显著低于验证集损失,则模型过度拟合。它不能在验证集中再现高精度,因此,它在测试集中的表现同样差。
修复过度拟合的一种方法是有效地向模型提供更多数据。我们可以收集更多的数据,但另一种更简单的方法是数据扩充。这是指以不应该影响图像解释的方式随机改变图像,例如水平和垂直翻转、放大和缩小、改变对比度和亮度等等。
6 different versions of the same image.
学习率查找器:
学习速率决定了您希望在梯度下降的帮助下更新权重(或参数)的快慢。学习率是最难设置的参数之一,因为它会显著影响模型性能。**
如果学习率太小,梯度下降会非常慢。另一方面,如果学习率太大,梯度下降会超过最小值。它可能无法收敛,甚至发散。
为了找到最佳的学习速率,我们将使用 Leslie N. Smith 在 2015 年论文中开发的用于训练神经网络的循环学习速率的技术。
****
这个想法是不断增加学习率指数,直到损失停止下降。
最初,当学习率较低时,损失改善不多。随着学习率的增加,损失将在一段时间内显著改善,直到学习率变得太大,损失迅速增加。这是因为随着学习率变得太大,我们开始偏离最小值。
我们需要在图上选择一个损失减少最快的点。在这个例子中,当学习率在 0.01 和 0.1 之间时,损失函数快速减小。
重启随机梯度下降(SGDR):
这与学习速率退火的思想密切相关
当你越来越接近损失最小的点时,你应该开始降低学习速度,以便准确地到达正确的点。这种在训练时降低学习率的想法被称为学习率退火。****
实现这一点的“黑客”方法是逐步退火,即使用特定的学习速率一段时间,当损失停止改善时,手动降低它。一个更好的方法是使用函数形式。余弦曲线的一半似乎是完美的拟合。它会在一段时间内保持较高的学习率,然后在接近最小值时迅速下降。
当我们想避免陷入函数的局部极小值时,SGDR 就出现了。陷入局部最小值意味着我们不在重量空间的弹性部分,由于重量的小变化可能导致损失的大变化。因此,SGDR 使用的技术提高了我们的模型找到函数的全局最小值的能力。
Iteration VS Learning-Rate for SGDR
基本思想是在一定次数的迭代后重置我们的学习率,这样如果我们出现停滞,我们就可以跳出局部最小值。在实践中,这被证明是对普通 SGD 的一个重大改进。
如果周期太短,我们就没有给 SGD 足够的时间去寻找最小值。我们需要一种方法来延长我们降低学习速度的时间。我们可以以倍增的方式延长迭代次数,而不是在一定次数的迭代后重新开始。
不同的学习率:
如前所述,我们正在使用一个预先训练好的模型。这意味着我们只是在预训练模型的顶部添加一些层,并且只训练新添加的层,称为 密集层 。这是一种迁移学习。
迁移学习是使用在一个过程/活动中学到的知识并将其应用于不同任务的过程。
我们可以通过在卷积层和密集层上进行训练来改进我们的模型。虽然,我们不需要像后期的密集层那样改变前期的卷积层。这是 差异学习率的基础。
****不同的学习率意味着在我们的培训中,网络的不同部分有不同的学习率。其思想是将各层划分为不同的层组,并为每组设置不同的学习速率,以便获得理想的结果。
红色图层学习基本特征,如边缘、形状,中间的蓝色图层学习与数据集相关的特定细节。
鉴于上面的陈述,过多地改变初始层的学习权重不是一个好主意,因为它们已经擅长于它们应该做的事情(检测像边缘等特征)。中间层将了解复杂的特性,如果我们稍微修改它们,这些特性可能在某种程度上有助于我们的任务。所以,我们想稍微调整一下。
在这方面,不同的学习率有助于我们。我们现在可以把一个样本网络想象成三层组(红、蓝、绿),并设置不同的学习速率。最初的红色层将具有较小的学习率,因为我们不想过多地干扰它们,中间的蓝色层将具有比初始层更高的学习率,而最终的绿色层将具有最佳的最高学习率。
初始层和中间层的学习率的多少取决于预训练模型和我们需要的模型之间的数据相关性。例如,如果任务是创建一个狗/猫分类器,并且我们的预训练模型已经擅长识别猫,那么我们可以使用较小数量级的学习率。但是如果我们的任务是在卫星图像/医学图像上创建一些模型,那么我们的学习率会稍微高一些。
测试时间增加(TTA):
在测试阶段,我们所有的测试图像在通过我们的模型时都会被自动裁剪成一个正方形。这样做的原因是一种次要的技术细节,但如果你有不同的图像尺寸,GPU 不能够有效地执行。这可能会在未来得到解决,但就目前而言,这是我们拥有的技术状态。
这可能会导致图像的一些非常重要的特征被遗漏,而这些特征对于图像的准确预测至关重要。 在测试时间增强中,我们将随机进行 4 次数据增强,以及未增强的原始数据(中间裁剪)。然后,我们将计算所有这些图像的预测值,取平均值,并将其作为我们的最终预测值。这确保了我们在这 5 个不同的方块内捕捉到整个画面。
结果
使用上述实践,我能够在验证集上实现 92.6%的准确率,即模型之前没有见过的图片。
参考
- fast.ai
- 莱斯利·史密斯。训练神经网络的循环学习率。 arXiv 预印本 arXiv:1506.01186
- https://medium . com/38 th-street-studios/exploring-random-gradient-descent-with-restructs-sgdr-fa 206 c 38 a 74 e
- https://towards data science . com/transfer-learning-using-differential-learning-rates-638455797 f00
DOGNET:人工智能模型能骗过人类吗?
原文:https://towardsdatascience.com/dognet-can-an-ai-model-fool-a-human-85ed90c2326c?source=collection_archive---------23-----------------------
建造一只 DC 猎犬来创造金毛猎犬的图像,并通过一项调查来测试人们是否能区分真假图像
实验很简单:机器学习(ML)模型能否产生人们会误认为是真实的金毛猎犬图像?选择狗的原因…是因为狗很棒!
在我们当前的气候下,我们经常听到“假新闻”这个词,随着 ML 模型变得越来越先进,他们创建非人类内容的能力只会越来越好。因此,我认为让人们有机会测试他们辨别“真实”或“虚假”图像的能力是合适的。为创建这些图像而构建的 ML 模型被恰当地称为 DOGNET,它来自于一个称为 GANs(生成对抗网络)的模型分支。
尽管 DOGNET 大多有点好玩,但 GANs 也有现实世界的应用:它们有能力生成新内容、增强图像、填充缺失内容,甚至检测医学成像中的实体。
GAN 是如何工作的?
在 GAN 中,两个神经网络相互竞争;姑且称之为生成器和鉴别器吧。对于生产者来说,一个很好的类比是将其视为一个伪造者,试图制造假币。鉴别者的工作就像警察一样,试图发现欺诈行为,并确定货币是假币还是真币。
GAN 的目标,特别是我们的生成器,是最大限度地提高其创造假东西的能力,鉴别器会将其归类为真的。为了实现这一点,鉴别器将被给予来自生成器的例子或者真实的例子,并且它必须决定所呈现的是“真实的”还是“虚假的”。
如果生成器未能生成足够假的图像,它将受到处罚,当鉴别器说一个真实的例子是假的时,同样的情况也会发生。保持两个神经网络的训练平衡很重要:拥有一个太擅长识别假货的鉴别器会阻止生成器学习,反之亦然。
建筑狗网
DOGNET 模型是使用 TensorFlow 构建的深度卷积(DC) GAN。它在 AWS SageMaker 上使用 ml.p2.xlarge GPU 实例进行了 120,000 次迭代训练。训练数据集由 300 张金毛寻回犬图像组成,这些图像在狗的颜色、头部位置、嘴部位置和环境方面都有所不同。随着模型的训练,我们可以查看生成器组件在学习创建狗的图像时产生了什么:
Generator output images at different iteration steps
Animation of Generator training
在这个过程中,模型并不总是正确的。这里有几个我最喜欢的尝试:
Model training producing some interesting results
实验和结果
一旦模型生成了我认为不错的金毛寻回犬图像,我就想测试人们是否能从训练数据中的实际例子中区分出模型生成的图像。为此,我整理了一份简短的调查,由同事、家人、朋友和数据科学界的其他专业人士填写,共收集了 104 份调查回复。
下表总结了这些数据,受访者必须首先从四个选项中识别“真实”图像,然后从四个选项中识别“虚假”图像(正确答案以绿色表示)。
Table of survey responses: Q1. Select which image you think has not been created by our model. Q2. Select which image you think has been created by our model
结果显示,这并不是一项容易的任务:只有 24.0%的受访者正确回答了 Q1,29.8%的人正确回答了 Q2,只有 12.5%的人两个问题都答对了。
应用二项式检验表明,对于这两个问题,不存在大于预期的 25%的显著差异(Q1 p=0.63 [单侧];Q2 p=0.15 [单侧])。换句话说,在选择正确的图片方面,参与者并不比随机挑选的人强多少。
养狗会影响你的机会吗?
对于 Q1 来说,正确回答率没有太大的区别:在那些不养狗的人中,22%回答正确,在那些养狗的人中,26%回答正确。在 Q2,22%的非养狗者猜对了,相比之下养狗者只有 38%。尽管准确性有所提高,但卡方检验显示这些变量之间的关系并不显著( χ 2 [2,N = 104] = 3.08,p=0.08)。换句话说,从统计数据来看,拥有一只狗并没有增加你识别 DOGNET 产生的“虚假”图像的机会。
结束语
虽然 DOGNET 被设计成一个有趣的实验,但它确实揭示了当它与真正的狗图像放在一起时,它产生的输出对我们来说是难以区分的。与典型的照片相比,这些图像的分辨率显然较低,但它确实提出了一个有趣的问题:随着这些模型的不断发展,我们是否仍然能够在我们的在线内容中区分“事实”和“虚构”?
我将给你们留下我的狗韦斯利的最后一张照片,我可以肯定地告诉你们,它是真正的:D
Source: Christopher Doughty
在 Google 云平台的命令行上做数据科学
原文:https://towardsdatascience.com/doing-data-science-at-the-command-line-38fe9f17121d?source=collection_archive---------10-----------------------
数据工程是关于收集和收集数据,以适当的方式存储数据,进行一些处理并提供给数据科学家。
每个数据科学家在享受总是期待的建模阶段之前,都必须面对许多数据工程和数据准备任务。此外,当开始一个新项目时,你必须考虑选择正确的语言和平台的权衡。
此刻抛开平台,R,Python,Julia,Matlab,Octave 等。是数据科学中使用的一些语言吗,特别是 R 和 Python,它们在过去几年中有了很大的发展,并且有很大的社区支持。
然而,现在我想解释你如何通过使用你的操作系统命令行来面对许多初始任务,以及 shell 如何必须是你的堆栈的一部分。
我们将发现像 curl、 sed 、 jq 或 csvkit 这样的命令行程序如何通过编写更少的代码来简化您的许多重复任务,通过使用低级接口使其可移植甚至更快。
在这篇文章中,我们将一起使用这些神奇的工具,不需要任何 IDE、笔记本等就可以通过管道传输它们的命令。下载、转换、转换并加载到大数据仓库中。
这些数据由EMT de Madrid(Empresa municipal de transportes de Madrid)发布,可在http://open data . EMT Madrid . es获得,这是一组文件,记录了从 2017 年 4 月到 2018 年 8 月 BiciMad (马德里的公共自行车租赁服务)用户的所有旅行。
© Oriol Salvador (https://www.flickr.com/photos/boarderland/)
该集合 ATOW 由 17 个文件和 26.35 GB 的 28.550.144 条记录组成,其中每一条记录记录了两个自行车站点之间的自行车旅行,这两个站点的信息也在一个单独的文件中提供,我们将在后面展示。
为了下载所有这些文件,我更喜欢做一些 web 清理,这样我甚至可以自动下载并以编程方式获取新数据。
这可以使用命令行轻松完成。首先,我们必须检查所有的链接有一个共同的模式来识别所有的文件。通过使用浏览器开发人员控制台,我们可以检查 DOM 和 HTML 文档源代码来找到链接。
前面的图片显示了所有的文件都有一个共同的结构,所以,是时候做一些编码了!
可选择的
我喜欢无服务器架构和云计算,因为它们通过向每个数据科学家提供无限、可扩展、容错和廉价的资源,使数据科学民主化,而不需要特定的硬件或系统维护。谷歌云平台是我最喜欢的平台之一,我将使用它来启动一个计算引擎实例,并在那里执行所有命令。
这基本上和在我自己的笔记本电脑上做是一样的,但我将受益于谷歌云数据中心的巨大带宽。Google 还为所有机器提供了 Google Cloud SDK,无需管理本练习最后步骤所需的身份验证即可使用。这非常符合我做敏捷数据科学的想法。
我们有几种方式与谷歌云平台互动:一个令人敬畏的网络界面,强大的 API,主要编程语言的库,…和实用的 SDK。因为我将只使用 shell,所以 SDK 是我的首选。通过使用它,我也可以确信所有的德 GCP 命令可以在任何操作系统中执行,并很容易向你展示我在做什么。
如果你想自己做,你可以在这里有指令下载并在你的操作系统中设置它,但是如果你使用的是 Linux 或 Mac(我希望你这样做),它就像:
curl https://sdk.cloud.google.com | bash
exec -l $SHELL
安装完成后,您可以通过以下方式开始安装:
gcloud init
对于上一步,你需要一个谷歌云平台帐户。是免费。
现在我准备启动一个虚拟机。我不需要一个非常强大的硬盘,但必须有足够的存储空间来下载所有文件,所以我会安装一个 200G 的硬盘。
gcloud beta compute --project=datascience-open-data instances create bicimad-vm --zone=europe-west1-b --machine-type=n1-standard-2 --subnet=default --network-tier=PREMIUM --maintenance-policy=MIGRATE --service-account=874126907357-compute@developer.gserviceaccount.com --scopes=https://www.googleapis.com/auth/cloud-platform --image=ubuntu-minimal-1804-bionic-v20180917 --image-project=ubuntu-os-cloud --boot-disk-size=200GB --boot-disk-type=pd-standard --boot-disk-device-name=bicimad-vm
一旦部署了虚拟机,be 就可以从 Google Cloud Shell 或我们的本地计算机登录到它:
gcloud compute --project "datascience-open-data" ssh --zone "europe-west1-b" "bicimad-vm"
下载数据
现在,我们准备将文档源代码下载到本地文件中:
curl '[http://opendata.emtmadrid.es/Datos-estaticos/Datos-generales-(1)'](http://opendata.emtmadrid.es/Datos-estaticos/Datos-generales-(1)') > bicimad.html
我们可以检查源代码:
cat bicimad.html
在这里,我们再次检查文件链接是否具有相同的结构:
<li style="margin-bottom: 6px;margin-left: 12px;list-style-type: none;display: list-item;"><img src="/Imagenes/Extensiones-de-archivos/zip_logo.aspx"/><a target="_blank" href="/getattachment/8bb73c41-eab0-4e6a-ac92-80c8c68aacc2/201704_Usage_Bicimad.aspx" title="Datos de uso de Abril de 2017\. Nueva ventana" > Datos de uso de Abril de 2017</a></li><li style="margin-bottom: 6px;margin-left: 12px;list-style-type: none;display: list-item;"><img src="/Imagenes/Extensiones-de-archivos/zip_logo.aspx"/><a target="_blank" href="/getattachment/11054216-35d1-4003-b76b-8421c4a46eb4/201705_Usage_Bicimad.aspx" title="Datos de uso de Mayo de 2017\. Nueva ventana" > Datos de uso de Mayo de 2017</a></li>
现在我们必须得到那些文件链接。通过将sed
与一些正则表达式知识结合起来,这非常容易:
cat bicimad.html | sed -n 's/.*href="\/getattachment\([^"]*Bicimad\.aspx\).*/\1/p'
这是我们得到的结果:
现在我们只需要用域名(http://open data . EMT Madrid . es)完成远程服务器中的文件路径就可以获得完整的 URL:
cat bicimad.html | sed -n 's/.*href="\/getattachment\([^"]*Bicimad\.aspx\).*/\1/p' | sed -e 's/^/http:\/\/opendata.emtmadrid.es\/getattachment/'
我们将sed
所做的最终处理保存到一个临时文件tmp_file
:
cat bicimad.html | sed -n 's/.*href="\/getattachment\([^"]*Bicimad\.aspx\).*/\1/p' | sed -e 's/^/http:\/\/opendata.emtmadrid.es\/getattachment/' > tmp_file
这个临时文件包含指向压缩数据文件的所有 URL:
cat tmp_file
结果是:
现在,我们只需浏览之前的每个 URL,并将它们下载到我们的系统中。一种方法是结合curl
+ parallel
。这样我们可以同时下载几个文件。首先我们安装parallel
:
sudo apt-get update
sudo apt-get install parallel
安装完成后,我们读取tmp_file
,将所有链接发送到curl
:
cat tmp_file | parallel -j 4 curl -O
这个过程需要几分钟。完成后,我们可以通过在当前目录中执行ls -l
来检查下载的文件:
下一步是解压缩文件。我们需要先安装unzip
:
sudo apt-get install unzip
…然后我们解压缩所有以 Bicimad.aspx 结尾的文件:
TMP_DIR="."
ZIP_FILES=*Bicimad.aspxfor FILE in `ls ${TMP_DIR}/${ZIP_FILES} `; do
echo $FILE
unzip -o $FILE
done
所有压缩文件都在同一个文件夹中解压缩,因此ls -l *.json
显示为 Json 文件,其中包含数据:
接下来,我们将检查 Json 文件的内容,以理解提供给我们的结构化数据。为了处理 Json 文件,jq
是我们最好的朋友,所以 web 将像我们通常做的那样安装它。然后我们打印任何文件的第一行:
sudo apt-get install jqcat 201808_Usage_Bicimad.json | head -1 | jq
我们可以检查这个 Json 是否遵循了从 MongoDB 导出数据的典型模式:
{
"_id": {
"$oid": "5b6779012f384302541d6813"
},
"user_day_code": "6c30d6e283ea7a160379fa9adb20b93d2c06e16853ad0804e26485e98066f6ba",
"idplug_base": 11,
"track": {
"type": "FeatureCollection",
"features": [
{
"geometry": {
"type": "Point",
"coordinates": [
-3.7078158,
40.4127144997222
]
},
"type": "Feature",
"properties": {
"var": "28005,ES,Madrid,Madrid,CALLE SAN BRUNO 1,Madrid",
"speed": 6.19,
"secondsfromstart": 190
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-3.7071841,
40.4156114997222
]
},
"type": "Feature",
"properties": {
"var": "28012,ES,Madrid,Madrid,PLAZA MAYOR 27,Madrid",
"speed": 3.47,
"secondsfromstart": 130
}
},
{
"geometry": {
"type": "Point",
"coordinates": [
-3.7048058,
40.4167895
]
},
"type": "Feature",
"properties": {
"var": "28013,ES,Madrid,Madrid,CALLE ARENAL 1,Madrid",
"speed": 3.61,
"secondsfromstart": 71
}
}
]
},
"user_type": 1,
"idunplug_base": 7,
"travel_time": 228,
"idunplug_station": 1,
"ageRange": 0,
"idplug_station": 43,
"unplug_hourTime": {
"$date": "2018-08-01T01:00:00.000+0200"
},
"zip_code": ""
}
每条记录为我们提供了以下变量:
- _id:记录标识
- user_day_code:当天的用户标识
- idunplug_station:起点自行车站
- idunplug_base:原点自行车站中的 base
- idplug_station:落客自行车站
- idplug_base:落客自行车站中的基地
- unplug_hourTime:租赁开始时间。
- travel_time:以秒为单位,自行车拔掉插头和插上插头之间的时间
- 轨道:行程路径
- 用户类型:1。-按年订阅的用户,2。-偶尔使用者,3。-企业用户
- ageRange: 1。-[0–16]年,2。- [17–18], 3.- [19–26], 4.-[27–40], 5.-[41–65], 6.- [>66]
- zip_code:用户邮政编码。
完整描述(西班牙语)
从前面所有的变量中,有一个具有特殊的结构: track。该密钥为 GeoJson 格式,这是一种在使用过程中注册自行车位置地理数据的便捷方式。看一下这个键,你会注意到系统每 60 秒跟踪一次自行车的位置。非常遗憾的是,这些信息在提供的某些时期是不可用的。
将数据加载到 BigQuery
Google BigQuery 可能是最强大的无服务器数据仓库,是在几秒钟内处理大量数据的好地方。可以将 Json 文件导入到 BigQuery 表中,但它还不能处理 GeoJson,尽管它支持地理信息系统(GIS)。
同时,我决定皈依。json 文件转换成。csv,但是在开始之前,建议更改文件编码。所提供的是 iso-8859–1 编码,这将在一些字符串中产生一些特殊西班牙字符的问题。
我们可以使用以下代码检查文件编码:
file --mime-encoding 201808_Usage_Bicimad.json
最好的解决方案是使用iconv
将文件转换成 UTF-8:
iconv -f iso-8859-1 -t UTF-8 201808_Usage_Bicimad.json > tmp_file.json && mv -f tmp_file.json 201808_Usage_Bicimad.json
现在是时候从 Json ton CSV 转换了。正如之前指出的,并不是所有的每月 Json 文件都有带有地理位置值的track
键,我已经请求 EMT 来解决这个问题。同时,我们将只处理带有该信息的对象。
首先,我们检查track
是否存在,然后我们遍历所有的键,以获取它们的值,并以非规范化的方式将它们展平。一旦完成,我们可以使用 de '@csv' decorator 并将结果写入文件。
cat 201808_Usage_Bicimad.json | jq -r '. | select(.track != null) | .track.features[] as $track | [._id[], .user_day_code, .idplug_base, .user_type, .idunplug_base, .travel_time, .idunplug_station, .ageRange, .idplug_station, .unplug_hourTime[], .zip_code] + [$track.geometry.coordinates[0], $track.geometry.coordinates[1], $track.properties.var, $track.properties.speed, $track.properties.secondsfromstart]|[@csv](http://twitter.com/csv)' > 201804_Usage_Bicimad.csv
强烈推荐使用的处理 CSV 文件的工具是csvkit
。尽管并非绝对必要,但我们将使用它以更好的方式检查 CSV 文件。以下是运行它所需的步骤:
sudo apt-get install python-dev python-pip python-setuptools build-essential
pip install --upgrade setuptools
pip install --user csvkit
export PATH=$HOME/.local/bin:$PATH
让我们检查一些随机列的结果:
cat 201804_Usage_Bicimad.csv | head -10 | csvcut -c 1,3,10,12,13,14 | csvlook --max-columns 6 --no-header-row
是时候将 CSV 文件加载到 BigQuery 中了!因为我们不能直接从本地机器加载数据,所以让我们将文件复制到 Google 云存储桶中。以下命令创建一个存储桶并将文件上传到其中:
gsutil mb open-datasets
gsutil -m cp 201808_Usage_Bicimad.csv gs://open-datasets/bicimad
然后,我们将在 BigQuery 中创建新的数据集:
bq --location=EU mk bicimad
然后,我们必须在数据集中创建一个表。在这个例子中,我包括了表模式:
bq mk --table bicimad.usage_201808 oid:STRING,user_day_code:STRING,idplug_base:STRING,user_type:INTEGER,idunplug_base:INTEGER,travel_time:INTEGER,idunplug_station:INTEGER,ageRange:INTEGER,idplug_station:INTEGER,unplug_hourTime:STRING,zip_code:STRING,latitude:FLOAT,longitude:STRING,var:STRING,speed:FLOAT,secondsfromstart:INTEGER
最后,我们创建一个加载作业,将 CSV 文件从 Google 云存储桶导入到新表中:
bq load --source_format=CSV --replace --quote='"' bicimad.usage_201808 gs://open-datasets/bicimad/201804_Usage_Bicimad.csv
向 BigQuery 加载大量数据时,建议使用分区表。分区表使查询数据变得容易,提高了查询性能并减少了您的账单。在这种情况下,我们将每个月的数据加载到不同的表中,这是一种旧的数据分区方式,但是可以随意改进。
加载作业完成后,我们可以查询数据并检查结果:
bq query --use_legacy_sql=false 'SELECT travel_time, unplug_hourTime, var FROM `datascience-open-data.bicimad.usage_201808` LIMIT 10'
或者我们也可以使用 Google Cloud 控制台中的 BigQuery UI,这是开发 SQL 查询的推荐方式:
现在一起!
因此,将 CSV 文件加载到我们的数据库的过程。为了加载它们,我们可以编写一个小的 bash 脚本来遍历目录中的所有 Json 文件,转换成 CSV 文件,上传到云中并加载到相应的表中。
这正是transform_and_load.sh
要做的:
#! /bin/bashTMP_DIR="."REPORT_FILENAME_PATTERN=*Bicimad.jsonfor FILE in `ls ${TMP_DIR}/${REPORT_FILENAME_PATTERN} `; doBASENAME=$(basename $FILE .json)YEAR_MONTH=`echo ${BASENAME:0:6}`iconv -f iso-8859-1 -t UTF-8 "$FILE" > "$FILE.new" && mv -f "$FILE.new" "$FILE"cat $FILE | jq -r '. | select(.track != null) | .track.features[] as $track | [._id[], .user_day_code, .idplug_base, .user_type, .idunplug_base, .travel_time, .idunplug_station, .ageRange, .idplug_station, .unplug_hourTime[], .zip_code] + [$track.geometry.coordinates[0], $track.geometry.coordinates[1], $track.properties.var, $track.properties.speed, $track.properties.secondsfromstart]|[@csv](http://twitter.com/csv)' > $BASENAME.csvgsutil -m cp $BASENAME.csv gs://open-datasets/bicimadbq mk --table bicimad.usage_$YEAR_MONTH oid:STRING,user_day_code:STRING,idplug_base:STRING,user_type:INTEGER,idunplug_base:INTEGER,travel_time:INTEGER,idunplug_station:INTEGER,ageRange:INTEGER,idplug_station:INTEGER,unplug_hourTime:STRING,zip_code:STRING,latitude:FLOAT,longitude:STRING,var:STRING,speed:FLOAT,secondsfromstart:INTEGERbq load --source_format=CSV --replace --quote='"' bicimad.usage_$YEAR_MONTH gs://open-datasets/bicimad/$BASENAME.csvdone
我们将所有用户的执行权限添加到脚本中并运行它:
chmod 755 transform_and_load.sh
./transform_and_load.sh
完成后,我们可以查询所有 2018 年的数据,以获得按年龄范围划分的自行车租赁时长中位数(我不喜欢没有正态分布数据的平均值)。
SELECT
ageRange,
ROUND(APPROX_QUANTILES(travel_time/60,1000)[OFFSET(500)], 2) AS median_travel_time
FROM
`datascience-open-data.bicimad.usage_2018*`
GROUP BY
ageRange
ORDER BY
2 DESC
就自行车租赁持续时间而言,似乎最年轻的用户(年龄 1)也是最大的用户。我们可以知道检查他们是否也是最频繁的用户等等。
自行车站点数据
正如我之前告诉您的,我们将对包含每个自行车站点信息的数据集重复相同的步骤。
curl -o Bicimad_Estacions_201808.rar [http://opendata.emtmadrid.es/getattachment/8321277e-4f8b-4a45-89fd-63cbeefa1cf1/Bicimad_Estacions_201808.aspx](http://opendata.emtmadrid.es/getattachment/8321277e-4f8b-4a45-89fd-63cbeefa1cf1/Bicimad_Estacions_201808.aspx) && unrar x Bicimad_Estacions_201808.rar && rm Bicimad_Estacions_201808.rariconv -f iso-8859-1 -t UTF-8 Bicimad_Estacions_201808.json > tmp_file.json && mv -f tmp_file.json Bicimad_Estacions_201808.json
这是数据集中可用的信息:
{
"activate": 1,
"name": "Colón A",
"reservations_count": 0,
"light": 0,
"total_bases": 18,
"free_bases": 14,
"number": "106a",
"longitude": "-3.6877227",
"no_available": 0,
"address": "Calle Serrano nº 34",
"latitude": "40.4251002",
"dock_bikes": 3,
"id": 111
}
让我们转换成 CSV 格式:
cat Bicimad_Estacions_201808.json | jq -r '.stations[] | [.[]] | [@csv](http://twitter.com/csv)' > bike_stations.csv
因为这个数据集很小(12.9 MB),所以我们可以直接从本地磁盘加载到 BigQuery 中。
第一个 web 制作新表格:
bq mk --table bicimad.bike_stations activate:INTEGER,name:STRING,reservations_count:INTEGER,light:INTEGER,total_bases:INTEGER,free_bases:INTEGER,number:STRING,longitude:FLOAT,no_available:INTEGER,address:STRING,latitude:FLOAT,dock_bikes:INTEGER,id:INTEGER
然后我们创建一个加载作业:
bq load --source_format=CSV --replace --quote='"' bicimad.bike_stations bike_stations.csv
通过观察数据,我们可以看到每个自行车站点都有几个记录,记录了数据集未提供的时间段内freee_bases
和其他字段的变化。
尽管如此,我们可以查看可用自行车站的数量:
SELECT
COUNT(DISTINCT name) AS total
FROM
`datascience-open-data.bicimad.bike_stations`
加载完所有数据后,我们可以删除计算实例:
gcloud compute instances delete bicimad-vm --zone=europe-west1-b --quiet
目前就这些。在下一篇文章中,我们将使用 SQL 进行一些探索性的数据分析。也不是 R 或 Python,我保证!
在一个数据文盲组织中做数据科学
原文:https://towardsdatascience.com/doing-data-science-in-a-data-illiterate-organization-300981cbfdf6?source=collection_archive---------7-----------------------
A still from an animated visualization of shopper behavior in an instrumented grocery store.
科技媒体和行业博客充满了创新、早期采用者和数据智能公司的故事。数据科学家很容易设想在一个理解并重视他们的技术、推理和工作方式的组织中的角色。但是,当然,越来越多的传统企业正在雇佣数据科学家,并试图利用数据做出更好的决策。
我每天都与设计师、战略家、数据科学家、开发人员和研究人员组成的多学科团队一起工作。虽然我们生活在技术工作最具协作性的黄金时代,但我亲眼目睹了数据科学家在不太懂数据的环境中遇到的动荡。合法、准确、有效的科学很容易在翻译中丢失。下面我概述了一些给数据科学家的实用建议,我发现这些建议在数据盲组织中最有效。
1。询问“问题”,永远不要停止思考:我们解决的是正确的问题吗?
成功的数据密集型项目总是始于对业务目标的透彻理解——最好将其视为一个假设。作为一名数据科学家,你的工作是提出问题,并挖掘其更广泛的背景。努力弄清楚到底发生了什么,找出根本原因,并帮助引导提问者和被提问者不仅仅是一个“是”或“否”的问题,而是一个有效且相关的对手头更大问题的重构。
他们:“我们的哪个产品性能最好?”
你:“告诉我更多关于你目前定义最佳的方式?”
随着设计师、研究人员和战略家越来越多地使用数据来改善他们的决策,您需要回答的问题可能来自各种专业和领域。问题和假设通常来自数据科学领域之外的某个人——经理、设计师或研究人员。你要解开他们的问题,与提问者产生共鸣,了解他们假设的背景,并帮助他们决定前进的最佳路线。
2。 始终回答问题——即使答案是一个关于可能性而不是确定性的故事。
探索频道的节目流言终结者(2003–2016)当原始流言的结果以任何可能的方式被复制时,而不仅仅是当原始流言被终结时,才变得真正与观众相关。像亚当和杰米一样:得出没有相关性的结论是不够的,要洗手不干,继续前进。讲述一个关于相关性会是什么样子的故事,它在数据集中的什么地方出现——即使它在统计上不显著——并且用上下文来呈现它。解释如何证明他们的假设是正确的,并提供其他可能的答案作为支持证据。
当一个模型表现不佳时,过快地退出会对团队使用数据科学的态度产生负面影响。相反,尽可能向您的受众提供后续步骤:可以收集的额外数据,模型不收敛的潜在现实原因,或者描述性能确实有效的情况的子样本,以帮助解释为什么它不能达到高水平。
3。传达你的结果:准确性和细节是两回事。
想象一下,你正在建立一个预测模型来确定某件事情发生的可能性(百分比)。神奇的是,在没有你控制的情况下,在模型投入生产之前,一个邪恶的数据仙女会随机改变你所有的结果几个百分点(比如说 73%对 71%或者. 681 对. 657)。在现实世界的部署中,这些看似微不足道的数量可能意味着自动驾驶汽车乘客的生死之差。在向你的 C 级团队做演示时,这些金额的差异可能不会实质性地改变他们调整战略、营销计划或商业决策的方式。71%或 73%的市场份额(谁在乎!)将是打开啤酒的理由。
我的观点是使用环境决定一切。你的工作是了解你的工作成果将如何付诸行动,并据此设计你传达这些成果的方式。例如,在自动化生产环境中,包含尽可能多的细节。在这里,准确性很重要。你的模型可能需要学习,不断地被训练,或者适应多种可能性,没有理由回避或者抽象输出。
不同的是,对于一个人在回路的场景,你的结果需要在你的专家解释和最初询问的背景下形成。在你拿着事实和数据冲进会议之前,先想想你要表达的更广泛的观点。在这些情况下,没有人需要知道你的模型的表现有多差(或多好)——把这个细节放在你的后袋里作为支持证据。
用无关紧要的数字来压倒非数据科学家的听众,往往会分散你试图表达的更广泛的观点。当几个百分点不是生死攸关的情况时,用简单的语言给出你的结果的背景:
"这种预测模型工作得相当好,但在这些边缘情况下可以使用一些改进."
"你认为存在的相关性可能只是巧合."
4。建立共同语言并坚持下去。
像许多其他技术领域一样,数据科学非常晦涩难懂。即使通过图表直观地传达思想,代表性形式的可能性和变化也是巨大的,每一种形式都需要观众去理解,并学会如何阅读。如果你在使用口头和视觉语言的方式上不一致,很容易失去你的听众。
我见过最尖锐的演讲因不一致和定义不清的术语使用而脱轨,如模型、原始、加工过的、特征,或培训。往往是日常意义上的简单词汇引发了最大的问题。例如:“带标签的数据”在分类模型中有一个非常具体的定义,但非数据科学家可能会通过将他们自己的生活经验应用到“标签”这个词来误解你试图表达的观点Excel 中的列不是都已经标注好了吗?如果所有东西都没有标签,你怎么知道你在做什么?如果我们没有在一些数据上贴标签,这些数据是坏的吗?一致性和清晰性可以强化这些科学含义,防止你的观众自行定义术语并迷失在翻译中。要极其小心、耐心,并与你的听众保持一致。
借助视觉效果,从简单和高水平开始。不要在没有注释或解释的情况下第一次显示新的图表类型。在每一种已建立的视觉语言的基础上慢慢讲述数据的故事。使用一致的颜色、轴和符号。如果解释如何阅读图表比理解图表花费的时间更长,那你就做错了。
5。不要孤立地工作。
无论您是否注册,您现在都是组织内的教育工作者、主题专家和数据传播者。你的工作是你最好的教育材料,你的过程是最好的证据。记录一个项目的开发不仅仅是一个好的实践,它还是一个帮助他人理解你做什么和你如何做的强大工具。
我所做的绝大多数数据可视化都是为了让其他人能够了解我的思考过程,在我的团队中引发对话。努力实现一个开放、可视化的流程,让复杂的技术不仅仅被数据科学家理解。它可以帮助你以合作的方式对照最初的假设评估你的工作——突出误解、错误的假设和灵感的瞬间。
我发现,有一个空间来展示我的作品、草图和正在进行的可视化效果,对增加沟通和协作大有帮助。即使你不公开,也要让它公开。你需要成为新的数据文化的倡导者和催化剂。对于组织中的许多人来说,将数据科学视为他们永远无法理解的魔法太容易了。你有责任证明他们是错的。公开您的流程将增加您的组织对使用数据解决问题的实际意义的理解,并将数据文盲的工作场所转变为数据驱动的工作场所。
做分类项目的 EDA?pandas.crosstab 将改变你的生活。
原文:https://towardsdatascience.com/doing-eda-on-a-classification-project-pandas-crosstab-will-change-your-life-c61c1cb2c20b?source=collection_archive---------1-----------------------
探索性数据分析(EDA)是数据科学家工作的重要组成部分。事实上,根据 2017 年 O'Reilly 的数据科学调查,基础 EDA 是数据科学家最常见的任务。这是有原因的。除非完全靠运气,否则如果你不理解你的数据,你最复杂、最健壮的模型也不会有多大作用。他们肯定不会表现得像他们本该表现的那样好。
理解数据、数据特征及其分布对于任何成功的数据科学任务都至关重要,无论是推理还是预测。与你所期望的相反,EDA 的重要性并不在于技术,也与编程无关。这是将平庸的数据科学家与伟大的数据科学家区分开来的东西——决策。
作为一名数据科学家,你编程。你用统计学。你建立模型。但是你要做的最重要也可能是最困难的事情是做出许多选择。你的选择会带来后果。有时后果很严重。所以你尽你所能做出负责任的、明智的选择。EDA 是你做出选择的最佳时机。好的 EDA 是盲目工作、抱最大希望、做出深思熟虑的决定以实现目标之间的区别。
好吧,你明白了,埃达很重要。现在,让我们来看看pd.crosstab().
的魔力
最近,我做了一个项目,使用了来自 UCI 机器学习库的银行营销数据集。它看起来是这样的:
每个观察对象都是银行的潜在客户,而“y”变量是他们是否订阅了新的定期存款。如您所见,这些数据包括每个客户的个人信息,以及银行之前向该客户营销的信息。这是一个相对干净的数据集,也是一个非常有趣的项目。主要的挑战是处理不平衡的类别,因为只有大约 11%的客户订阅定期存款。就像我说的,这是一个有趣的项目,值得一看。但是回到 EDA。
首先要决定的事情之一是模型中包括哪些变量。例如,让我们看看“工作”一栏。它列出了每个客户拥有的领域或职位。该数据集中有 12 种类型的作业。要决定是否要在您的模型中使用工作信息,您必须确定一个人的工作是否与订阅存款的可能性增加相关。从极端的角度来看这个问题,如果数据集中的每个“技术人员”都订阅了押金,我将假设技术人员更有可能订阅,我将使用这些信息来进行预测。另一方面,如果每种类型的工作都有相同比例的人订阅存款,那么工作信息将不会有助于做出预测。
那么,如何计算订阅每种工作类型的人的百分比呢?下面是我曾经使用的函数:bank.groupby('job').y.value_counts()
,它将按作业类型对观察结果进行分组,并对每种作业类型的“y”出现次数进行计数。
它返回这个:
这回答了我们需要的问题,但它看起来很乱。如果我们能把 y 的值变成一个表格会怎么样?然后……这里是pd.crosstab(bank.job, bank.y)
,它给了我们这个:
Now that’s much prettier.
很好,我们有桌子了。我们可以观察一下,发现大约有 10%的女佣和服务人员缴纳了押金。很明显,更高比例的退休人员认购存款。所以我们可以对分布有个概念...但是我们想要更多。我们需要每种工作类型的订阅的准确百分比。
pd.crosstab()
让你再次得到保护。就像这样添加' normalize '参数:pd.crosstab(bank.job, bank.y, normalize='index').
现在看起来是这样的:
Looking good!
完美。目标变量的分类百分比细分。正是我们需要的。现在很清楚,工作类型可能是我们模型的相关信息。
您可以对分类任务的任何分类变量运行此函数。这是评估崩溃的完美方法。使用这个函数,并且只有这个函数,您可以获得对数据集非常重要的洞察力。明智地使用它,用好它!
用更少的数据做更多的事:在房地产估价上获得接近最先进的结果
原文:https://towardsdatascience.com/doing-more-with-less-data-achieving-near-state-of-the-art-results-on-real-estate-valuations-c2843e40097e?source=collection_archive---------5-----------------------
Photo by Maximillian Conacher on Unsplash
整个美国房地产市场的价值总计数十万亿美元,是美国公民最大的有形资产之一。2016 年,没有自有住房的人通常会租赁空间,并支付超过 4700 亿美元的租金。
抵押贷款或房租通常是家庭每月最大的支出。出于这个原因和其他原因,理解决定房价波动的力量和属性是很重要的。租房者或购买者可以通过了解其他人为类似房产支付的价格来节省资金,出租者和出售者可以通过以公平的市场价格快速转让房产来节省资金。租赁者/购买者不会支付过高的价格,原始所有者可以通过快速租赁/出售来节省资金。
在这篇文章中,我将探讨除了一个单元的内在属性(例如,卧室、浴室、平方英尺等)之外的一些影响房价的环境属性。).通过使用各州和各市提供的大量地理空间数据,我可以提高用于预测房价的机器学习模型的准确性。测试案例是旧金山,它有一个强大的地理空间数据仓库。
文章提纲 :
- 目标数据集
- 地理空间要素
- 机器学习模型
- 模型评估
- 结论
目标数据集
我选择了两个数据集进行测试:一个是租金价格,另一个是房产价值。Airbnb 内部(http://insideairbnb.com/)提供了一个全面搜集的当前房源数据集,旧金山估价办公室提供了一份房产估价记录。经过一些清理,这些数据集将作为地理空间数据作为价格预测器的测试对象。
下面的地图显示了估价人房产的样本(上图)和所有 Airbnb 房源的位置(下图)。
A small sample (N=10,000) of SF Assessor dataset property locations. Darker areas are where locations overlap.
All 5900 Airbnb locations in SF as of July 2016. Darker areas are where locations overlap.
这两个数据集的位置分布存在明显差异。估价人的房产分布更加均匀,集中在市中心的单个地点(可能是高层住宅)。Airbnb 数据集更加分散,但集中在半岛东半部的几个地区。Airbnb 的数据不共享市中心高楼的单元集中程度,这暴露了 Airbnb 的位置是匿名的。
The Assessor properties are much more evenly distributed across the city, especially in the west.
Downtown, the Assessor properties accurately show that most of the properties are in tall residential towers. The Airbnb data are anonymized and therefore don’t accurately show the locations of listings.
匿名化使一个单位在给定区域内的实际位置随机化。简而言之,Airbnb 提供了一个单元所在的大区域——给定的房产坐标位于该区域的中心。下面是一个 Airbnb 房源的地图,显示了房源的大概位置。
This is an example of the location given on the Airbnb website for a property in SF. The location coordinates given in the dataset are somewhere within the shaded ellipse — there’s a lot of uncertainty.
因为我的目标是将地理空间数据精确地绑定到每个单元,Airbnb 的匿名化做法可能会影响模型。幸运的是,评估数据集包括每个属性的精确坐标,在关联地理空间数据时会有更少的模糊性。
Table of initial dataset features, before adding geospatial features.
基线数据集包括 Airbnb 数据集的约 5900 个房源和 SF Assessor 数据集的约 300,000 个房产。虽然 Airbnb 数据集中的样本较少,但它的特征(或预测值)比评估者数据多得多。Assessor 数据集大了两个数量级,但只包含 8 个特征,而 Airbnb 有 83 个特征。
运行基线模型后,我将添加地理空间要素-环境变量,如犯罪、噪音水平、与公园的距离等。—这两个数据集。通过这样做,我增加了机器学习模型可以用来更准确地预测价格的信息量和多样性。
地理空间数据
用于改进价格模型的数据来自各种来源,其中大部分可从三藩市(【https://datasf.org/】T2)公开获得。我确定要使用的最重要的数据集是犯罪事件和 311 请求的数据集,两者都是地理定位的。尽管犯罪数据集包括无数的事件,我还是应用了九个类别。311 数据代表了广泛的类别:修复基础设施的请求、涂鸦、公民对各种违法行为的报告,以及许多其他内容。
以下是与故意破坏(上图)和盗窃(下图)相关的犯罪事件示例。
A sample of the vandalism incidents. Dark areas are where incidents overlap.
A sample of the larceny/theft incidents. Dark areas are where incidents overlap.
下面是 311 个涂鸦请求(上图)和人行道及路缘修复请求(下图)的示例。
A sample of requests to remove graffiti.
A sample of requests to repair sidewalks and curbs.
在某些街区和道路上,这些事件的发生率有明显的差异。以下是涂鸦移除和路缘/人行道修复请求的地理空间分布不同的区域示例。诸如此类的变化可能有助于预测整个旧金山的价格差异。
The larceny/theft (left) and graffiti (right) incidents have different concentrations and hotspots in western SF.
Larceny/theft (left) and graffiti (right) incidents are also distributed quite differently in central SF.
添加到数据集中的另外两个要素是旧金山县每个人口普查轨迹中报告的家庭收入中值(上图)和贫困率(下图)。这些将有望帮助区分社区之间的价格差异。
Census tracts colored by median family income. From light to dark, the income ranges from $0 (parks) to $280,000.
Census tracts are colored by percent of the population below the poverty line. From light to dark, the percentages range from 0% (parks) to 53%.
用于对这些地理空间数据(犯罪和 311 事件)进行矢量化的方法包括计算在一个物业位置的给定半径内的事件/发生次数(点)。在该要素类别中,越靠近犯罪事件集中点的属性的数量越多。
下面显示了这种计数技术的可视化,红点代表一个假设的属性或列表位置。
As an example, a region is magnified to show a specific location (red dot on right) relates to graffiti incidents.
The number of graffiti incidents are counted within the given query radius from a location. The method is repeated for every location and every specified crime incident or 311 request category.
上面的虚线圆圈表示给定位置的查询半径。对于每个位置,该算法计算犯罪和 311 个类别中的事件数量。然后,它将这些值作为新要素分配给每个位置。
这是使用 scikit-learn 的 KDTree(在邻居模块中)完成的,它的query_radius
方法非常适合这个问题。下面是一个函数,用于在给定类别列表和包含每个类别坐标的数据帧的情况下,自动向熊猫数据帧添加要素。
我使用类似的方法来加入额外的特征,这些特征表明靠近公园和高噪声水平。与之前的数据不同,这些数据集由边界(或 shapefiles 中的多边形)表示。为了应用query_radius
,我将这些线性边界转换成一系列规则间隔的点。当位置离公园和噪声边界最近时,这种方法会产生较高的计数值。这种方法的直观示例如下所示。
Another example of how perimeter boundaries are counted to approximate proximity to parks (this example) and different levels of noise.
An animation that depicts how the regularly spaced points are counted when they are within the query radius of a given property location.
这种方法也用于合并从旧金山公共卫生部获得的噪声级数据。原始噪声数据被存储为形状文件多边形,用于逐渐升高的噪声级别。然后,我将这些多边形转换成一系列规则间隔的点,并对每个地产位置进行计数。这些噪声级特征的较高值表明物业靠近繁忙区域或道路。
下面是两个噪波级别多边形的示例。左边的图像显示了最高噪波级别的多边形。右边是低噪声区域,分布更广——高噪声水平集中在繁忙的道路和高速公路沿线。
Two screenshots of GIS shapefiles for the 76 and 70 Ldn noise levels — they are just two examples of the 5 different noise levels used. The higher noise level, 76 Ldn (left), is concentrated around the busiest roads. The lower noise level, 70 Ldn (right), is much more widespread, but still absent from quite blocks in the city. The noise level is given in Ldn, which is an average from daytime and night noise estimated by a model that uses traffic data (SF Dept. of Public Health, map provided by the SF Dept. of Planning).
数据集和新增功能的总结:
对于 Airbnb 和 Assessor 数据集,我生成了 24 个新的地理空间衍生特征。通过添加/更改类别或调整查询半径,可以进一步调整所有地理空间数据,以优化模型准确性。
A table depiction of the features that will be added to the Airbnb and Assessor datasets.
机器学习模型
在吸收了所有数据之后,我测试地理空间特征是否改进了基线数据集的模型预测,基线数据集仅包括房产的内在属性(例如,卧室、浴室、平方英尺等)。).
用于评估模型准确性的指标是 Zillow 采用的指标,Zillow 还发布了租赁和销售的专有“Zestimates”。下面是最近 Zillow 模型估算租金价格的表格。Zillow 也有市区房产销售的模型结果,我们将用它来评估评估者数据模型。
A table from Zillow showing an example of the statistics they use to evaluate their models. San Francisco rents were estimated in this model but are not shown here. We mainly compare our models with the Median Error metric on the far right.
我使用的主要指标是中值误差百分比,或 ME% (上图右侧第一列)——半数模型预测的误差等于或小于 ME% 。
我还使用中位数绝对误差来判断模型在美元价值上的准确性。绝对误差中值有助于确定在试图建立公平的市场价格时,模型预测与人类估计相比有多大用处。
为了找到并改进预测租金和房地产价值的最佳机器学习模型,我使用不同的方法进行了一些初步测试:
- 线性回归(使用套索和岭正则化)
- 随机森林
- 极度随机化的树
- 梯度树提升(包括 XGBoost)
使用基线/初步测试中表现最好的模型,我通过网格搜索进行交叉验证,以找到表现最好的模型参数。
车型评测
Airbnb 数据集
平均而言,XGBoost 为 Airbnb 数据集生成了最准确的预测。在某些情况下,多个模型预测的集合平均会产生更好的结果。无论如何,地理空间特征的添加对提高预测的准确性没有什么帮助。下图显示了使用两种不同误差指标的模型的结果。这些图从左向右显示,显示了添加地理空间数据时模型的预测误差。虚线表示在评估模型之前对目标变量(价格/价值)进行对数转换时的模型误差。这对改进错误有最大的影响。
The plots showing the response of two different error metrics with the cumulative addition of geospatial features (x-axis). The two different curves show the results when target values are not log transformed (solid) and when they are log transformed (dashed).
添加地理空间要素时,模型的精度几乎没有任何提高。这个结果令人沮丧,但我知道 Airbnb 数据集很难与地理空间数据配对,因为它的坐标是匿名的。
因为清单评论中有大量的文本数据,所以我添加了来自给定清单的所有评论的 tf-idf 特性。此外,我计算了所有评论的情感分数,并将它们作为特征添加到列表中。这些特性的增加都无助于提高模型的准确性。这很可能是因为绝大多数评论都是正面的、多余的。下面是正面、负面和中性评论的百分比,以供比较。
A plot that summarizes the percentage of reviews that are more positive than negative (or more neutral than positive or negative). The review for Airbnb are all overwhelmingly positive.
评估员数据集
随机森林模型在几乎所有情况下都优于所有其他模型。使用 EC2 实例通过多重网格搜索计算出最佳参数,大大减少了处理时间。
随着地理空间特征的增加,所得到的模型得到了极大的改进,直接证实了环境属性对于做出更准确的预测是极其有益的。下面的误差曲线(就像上面显示的 Airbnb 数据集)显示,各种各样的地理空间数据显著提高了模型预测的准确性。此外,对数转换的目标变量,属性值,提高了模型的准确性;当目标值进行对数变换时,它们的分布不那么偏斜,并且可以更准确地预测。
The plots showing the response of two different error metrics with the cumulative addition of geospatial features (x-axis). The two different curves show the results when target values are not log transformed (solid) and when they are log transformed (dashed).
为了检查进一步改进这些预测的其他方法,我计算了评估者数据的学习曲线(如下)。该图显示了随机森林模型误差如何随着更大的训练数据集而改善。因为交叉验证得分曲线持续下降,我相信随着数据集的增大,模型误差会进一步降低。
Learning curve for the Assessor dataset illustrating that a larger dataset would lead to an increased accuracy of predictions (i.e., lower median absolute errors) because the cross-validation curve continues to trend lower.
结论
现在,我可以将我的模型结果与 Zillow 估计值进行比较。应该注意的是,租赁和销售 Zillow 模型都使用实际租赁和销售价值的大得多的数据集。Airbnb 数据集在技术上不是租赁价格——所有房源都是在不同的时间和频率租赁的,因此它们实际上不是公平的市场价格。类似地,评估财产价值是土地和改良的近似值,用于税收评估——实际销售价格可能相差甚远。这就是说,Zillow 有一个显著的优势,因为他们有更大和更准确的数据集。
Rental price prediction result, comparison to Zillow result for San Francisco.
Property value prediction result, comparison to Zillow result for San Francisco.
Zillow 租赁价格预测远好于我使用 Airbnb 价格的模型得出的结果。鉴于 Zillow 和 Airbnb 数据集之间的许多差异,这并不奇怪。虽然本文中没有显示,但 Airbnb 数据集的学习曲线表明,这种低准确性不会随着更大的数据集而得到改善。我们模型的绝对误差中值约为 21 美元——这意味着一半的预测与实际价格相差在 21 美元以内。
评估数据集和模型表现得更好,在 Zillow 房屋销售估计误差的一个百分点之内。由此得出的中位数绝对误差约为 37,000 美元。这一结果有力地表明了地理空间数据可以增加数据集的预测能力。由于样本比 Zillow 数据集少约 77%,我的模型误差几乎与 Zillow 的误差持平(在 0.6%以内)。
也有明确的方法可以进一步改进这个模型。这种分析没有考虑时间因素,如果将大规模市场趋势和逐年价格波动因素纳入数据集,可能会提高准确性。此外,犯罪和 311 数据集有许多类别是我的模型中没有的。每个类别都可以测试预测能力,并作为附加功能添加进去。
最后,我还想将谷歌街景图像纳入模型,用它们来预测残差。但这超出了本初步研究的范围。以后希望分享一下自己的进步。
你可以在我的 github 知识库(https://github.com/tmkilian/GA_capstone-Housing_prices)中找到本研究中使用的一些原始数据和 jupyter 笔记本。感谢阅读!
以智能方式进行 XGBoost 超参数调优—第 1 部分,共 2 部分
原文:https://towardsdatascience.com/doing-xgboost-hyper-parameter-tuning-the-smart-way-part-1-of-2-f6d255a45dde?source=collection_archive---------1-----------------------
Picture taken from Pixabay
在这篇文章和下一篇文章中,我们将着眼于机器学习(ML)中最棘手和最关键的问题之一:超参数调整。在回顾了什么是超参数,或简称为超参数,以及它们与普通的可学习参数有何不同之后,我们介绍了三种旨在搜索最优超参数组合的通用离散优化算法:网格搜索、坐标下降和遗传算法。我们报告了一个实验的结果,在这个实验中,我们使用这些方法中的每一个方法,在一个取自 Kaggle 的 ML 问题的例子上,得到了好的超参数。虽然在我们的实验中,我们关注于优化 XGBoost 超参数,但是我们将展示的几乎所有内容都适用于任何其他高级 ML 算法。
什么是超参数?
最强大的 ML 算法以通过自动调整数千(甚至数百万)所谓的“可学习”参数来提取数据中的模式和规律而闻名。例如,在基于树的模型(决策树、随机森林、XGBoost)中,可学习的参数是每个节点的决策变量的选择,以及用于决定在生成预测时是采用左分支还是右分支的数字阈值。在神经网络中,可学习的参数是在每个连接上使用的权重,用于放大或否定从上一层到下一层的激活。
超参数调谐及其目标
然而,可学习的参数只是故事的一部分。事实上,它们是容易的部分。一个算法越灵活和强大,它就有越多的设计决策和可调整的超参数。这些参数由 algo“手动”指定,并在整个训练过程中固定不变。此外,算法通常不包括任何逻辑来为我们优化它们。在基于树的模型中,超参数包括诸如树的最大深度、要生长的树的数量、构建每棵树时要考虑的变量的数量、一片叶子上的最小样本数量、用于构建树的观察分数等。对于神经网络,该列表包括隐藏层的数量、每层的大小(和形状)、激活函数的选择、退出率和 L1/L2 正则化常数。
从计算的角度来看,监督 ML 归结为最小化某个损失函数(例如,MSE 或分类误差),该损失函数取决于数据训练输入数据( X t, Y t),我们用 a 表示的可学习参数,以及超参数。这里的关键观察是,这种最小化是通过让仅可学习参数变化,同时保持数据和超参数不变来实现的。为了选择最优的超参数集,通常的方法是进行交叉验证。给定一个超参数向量 h ,,通过使用最好的一组可学习参数 a* ,针对 h 的值,对一组保留的验证数据评估损失函数,从而评估其质量。象征性地,我们做到了
介绍超参数网格
关于超参数,需要注意的一件重要事情是,它们通常采用离散值,明显的例外是像辍学率或正则化常数这样的东西。因此,出于实际原因并为了避免进行混合连续-离散优化所涉及的复杂性,大多数超参数调整方法都是通过离散化所讨论的所有超参数的范围来开始的。例如,对于下面的 XGBoost 实验,我们将微调五个超参数。我们将考虑的每个值的可能范围如下:
{"learning_rate" : [0.05, 0.10, 0.15, 0.20, 0.25, 0.30 ] ,
"max_depth" : [ 3, 4, 5, 6, 8, 10, 12, 15],
"min_child_weight" : [ 1, 3, 5, 7 ],
"gamma" : [ 0.0, 0.1, 0.2 , 0.3, 0.4 ],
"colsample_bytree" : [ 0.3, 0.4, 0.5 , 0.7 ] }
为了解释这些在 XGBost 上下文中的含义,我们建议读者参考这篇帖子。
A section of the hyper-param grid, showing only the first two variables (coordinate directions).
请注意,尽管已将(连续)learning_rate 超参数的范围限制为仅 6 个值,将 max_depth 的范围限制为 8 个值,依此类推,仍有 6 x 8 x 4 x 5 x 4 = 3840 种超参数的可能组合。所有可能超参数的这个离散子空间被称为超参数网格。在下文中,我们将使用向量符号h=【h0,h1,…,hp】来表示任何这样的组合,即网格中的任何点。
三种超参数优化方法。
穷举网格搜索
穷举网格搜索(GS)只不过是一种强力方法,它以某种顺序扫描超参数组合 h 的整个网格,计算每个组合的交叉验证损失,并以这种方式找到最优的 h* 。一般来说,不鼓励使用字典顺序,即强加于超参数向量的字典顺序,应该考虑不同的顺序。原因是,使用词典排序,搜索很有可能在相当长的时间内集中在搜索空间中相当不感兴趣的部分。一个有趣的选择是以完全随机的方式扫描整个网格,也就是说,根据整个网格的随机排列。使用这种类型的搜索,很可能在早期遇到超参数空间的接近最优的区域。我们在下面的例子中展示了一些证据。
坐标下降
坐标下降 ( CD )是最简单的优化算法之一。这是一个迭代算法,类似于梯度下降,但更简单!基本思想是,在每次迭代中,我们的搜索向量 h 只有一个坐标方向被改变。为了选择哪一个,我们检查每个坐标方向转弯,并通过改变该坐标并保持所有其他不变来最小化目标函数。然后,我们选择产生最大改进的方向。当没有一个方向产生任何改进时,算法停止。要了解所有细节,我们建议读者参考维基百科文章。
这种简单方法的主要优点是,它很容易适应完全离散的情况,对于这种情况,梯度下降法给出的任意方向不容易使用。我们在这里提供了一个实现。
遗传算法
Picture from Pixabay
遗传算法(GAs)是一整类具有相当普遍适用性的优化算法,并且特别适用于高维离散搜索空间。遗传算法试图通过模拟一个(n 优化)问题的可行解的群体来模仿自然,因为它们经过几代进化并且强制实行适者生存。从上一代生成新一代有两种基本机制。一种是杂交育种,两个个体(可行解)结合产生两个后代。另一个是突变。在给定突变概率的情况下,任何个体都可以将他们的任何参数更改为另一个有效值。适者生存是通过让更适合的个体以比不太适合的个体更高的概率杂交来实现的。个体的适应度当然是损失函数的负值。关于全部细节,我们让读者参考维基百科或 AIMA ,第二部分第四章。我们自己的实现在这里可用。
一项实验
为了感受上面提到的每一种超参数优化方法,我们使用来自目前正在 Kaggle 上举行的家庭信用违约风险二元分类竞赛的实际数据进行了一次实验。我们只考虑了 application_(train|test)数据集,并执行了一个相当简单的数据准备步骤(参见函数 prepare_data 这里的)。此外,为了保持训练和验证时间短,并允许在合理的时间内充分探索超参数空间,我们对训练集进行子采样,仅保留 4%的记录(大约。12,000).为了验证,我们使用了单独的 3.2%的记录(大约。10,000).即使有这么少量的数据,对于给定的一组超参数,单轮训练和验证也需要大约 3 秒,考虑到我们打算扫描整个超参数网格,这是不可忽略的。由于刚才提到的原因,我们得到的交叉验证 AUC 值与排行榜顶部的值没有竞争力,后者肯定是利用了竞争对手提供的所有数据集中的所有可用记录。
如前所述,我们选择了 XGBoost 作为我们的机器学习架构。由于 XGBoost 获得了出色的准确性,以及它的计算性能,对于像这样的纯“表格”问题,它可能是 Kagglers 和许多其他 ML 实践者中最受欢迎的选择。
现在,对于上述三种超参数调整方法中的每一种,我们都进行了 10,000 次独立试验。每次试验首先将随机种子重置为新值,然后将 hyper-param 向量初始化为网格中的随机值,然后按照正在测试的优化算法继续生成 hyper-param 向量序列。当测试 GS 时,试验只是根据整个网格的随机排列遍历超参数向量。使用 CD,生成的超参数向量都是在 CD 算法的中间评估中尝试过的向量。当 CD 陷入局部最优时,它会随机一致地重新开始一个新的初始向量。在遗传算法中,超参数向量是包含在每一代人的“DNA”中的向量。
顺便说一下,我们能够进行这么多的试验,尽管每次 CV 损失评估的成本很高,这要归功于一种叫做记忆化的技术(【https://en.wikipedia.org/wiki/Memoization】T2)。本质上,一旦第一次评估了超参数向量的 CV-loss,我们就将它保存在三种方法共享的查找表中,并且再也不必重新评估它。
在运行每个试验时,我们记录所有试验的超参数向量及其相应的交叉验证损失。下图显示了典型试验的行为,对于三种方法中的每一种,y 轴显示了 CV 损失的负值,在这种情况下,这就是我们最大化的 CV_AUC 指标。X 轴记录“时间”,即直到某一点的 CV-AUC 评估总数。
One trial for each of the three methods. All CV_AUC evaluations are plotted in blue and the running best CV_AUC is plotted in orange.
橙色“包络”线记录了“运行最佳”,这是在某一点之前所有函数评估中看到的最佳 AUC 值。在某种意义上,这一行是我们所关心的,因为每个方法总是返回所有被评估的超参数向量中最好的一个,而不仅仅是最后一个。请注意这三种方法在这一层的不同之处。GS 成功地逐渐最大化 AUC 完全是偶然的。坐标下降和遗传算法在寻找逐渐变好的值时所做的刻意“努力”从它们的图中也很明显。
然而,一项随机试验并不能说明全部情况。让我们来看看这三种方法中每一种方法的 30 个独立试验的“包络线”。
best-running AUC for 30 trials of each method
有趣…网格搜索和遗传算法的包络线很快就聚集到顶部,不像 CD 算法…这意味着,几乎所有 GS 和遗传算法的试验都很有可能比 CD 算法更快地给出接近最优的解。另一方面,总体最佳解决方案是通过一个 CD 试验在函数评估#40 附近实现的,我们没有看到其他方法的相同结果。此外,在函数评估#100 左右后,坐标下降法优于其他两种方法,因为所有 30 次试验都接近最优,并且显示出小得多的方差!
我们来看最后一个情节。如果我们在所有 10000 次试验中取 10%的最佳 AUC 会怎么样?这个数字很有趣,因为它让我们了解到大多数试验的最佳运行是如何随着评估次数的变化而变化的。换句话说,它给出了我们对每种方法所能预期的最坏情况的 90%的置信界限。这是:
啊哈!这是上述内容的更令人信服的证据,因为它告诉我们,在至少 90%的概率下,通过 CV-AUC 评估#90,坐标下降的随机试验将会看到 AUC 约为 0.740 或更好的超参数向量,而 GS 的相应值仅为约 0.738。这似乎是一个微小的差别,但就 ML 度量而言,这是非常重要的。也许比这更能说明问题的是,在达到稳定点之前,上图中 CD 曲线的斜率明显高于 GS 曲线。
另一方面,GA 似乎自始至终都被 GS 所主宰。这也许不应该让我们感到惊讶。一方面,遗传算法依赖于几个可调参数(在我们的公式中是超超参数),如世代大小、突变率、构建 DNA 序列的实例变量排序以及将 AUC 与杂交概率联系起来的函数。在我们的实验中,我们只尝试了几个设置。如果有不同的设置,GA 很可能会击败 gs。另一方面,众所周知(例如,参见第 148 页末尾的 AIMA ),当存在连续的基因块(在我们的例子中是超参数)时,遗传算法工作得最好,对于这些基因块,存在平均工作得更好的特定值组合。不清楚我们选择的 XGBoost 超参数的排序是否是任意的。
结论
在这篇文章中,我们阐明了在监督 ML 环境中参数和超参数之间的区别,并通过实验表明,就计算时间和电力而言,优化超参数可能是一件棘手和昂贵的事情。然而,我们看到,在发现超参数向量的速度和质量方面,有一些方法,如坐标下降,超过了普通的网格搜索。
请继续关注本系列的第二篇文章,在这篇文章中,我们将尝试另外三种优化方法:贝叶斯优化、hyperpt和自动调优。
[## CDMX 的墨西哥住宅和公寓
在 CDMX 的各个省和我们的家。他把自己的一份工作交给了我…
www.lahaus.mx](https://www.lahaus.mx/)
在 R 中使用 Sentimentr 进行第一次情感分析
原文:https://towardsdatascience.com/doing-your-first-sentiment-analysis-in-r-with-sentimentr-167855445132?source=collection_archive---------6-----------------------
从字符串中提取情感的最快最简单的方法。
R 的 Sentimentr 包有利于分析心理学或社会学研究的文本。它的第一大优势是,它使情感分析变得简单,只需几行代码就可以实现。它的第二大优势是它纠正了反转,这意味着虽然更基本的情绪分析会根据形容词好将“我不好判断为积极的,但 Sentimentr 会识别出好的反转,并将其归类为消极的。
总而言之,Sentimentr 允许你快速进行复杂的情感分析,并直接将其作为回归或任何其他进一步分析的输入。
本文涵盖了如何开始。如果您正在寻找高级分析技术,请参考其他文章,如 Tyler Rinker 的 Github Repo 的自述。在本教程中,我将分析来自 He & McAuley (2016)数据集的亚马逊美容产品评论。但是,您可以轻松地修改代码,使其适合您自己的数据集。
Photo by Obi Onyeador on Unsplash
默认情况下,Sentimentr 使用 Jockers (2017)字典,这对于大多数情况来说应该是完美的。
安装软件包并加载数据
install.packages("sentimentr")
library(sentimentr)
前两个命令安装并加载 Sentimentr 包。接下来,我加载数据。因为它是 JSON 格式的,所以我需要加载 ndjson 包。然后我可以使用这个包的 stream_in 函数来加载 Amazon Beauty 数据。
install.packages("ndjson")
library(ndjson)
df = stream_in("AmazonBeauty.json")
head(df)
我还使用了 head 函数来快速查看前几行数据。正如您在自己的机器上执行此操作时所看到的,有一个名为 reviewText 的列包含评论。
做实际的情感分析。
sentiment=sentiment_by(df$reviewText)
这个命令运行情感分析。在这种情况下,我使用了perspective _ by命令来获得整个评审的总体情绪度量。在其他情况下,您可以使用情感命令(不带 _by)来获取每个句子的情感。
当这个命令运行时(确实需要一段时间),我将讨论函数将返回什么。该示例中的情感对象将是包括以下列的数据表:
- element_id —审核的 id 号
- 字数 —评论的字数
- sd —评论中句子情感得分的标准差
- ave _ sensition—评论中句子的平均情感得分
最有趣的变量是ave _ perspective,这是一个数字中评论的情绪。该数字可以取正值或负值,并表示情感的效价和极性。
分析情感得分
我们可以看一些计算出来的情绪得分的汇总统计。
summary(sentiment$ave_sentiment)
如你所见,大多数评论倾向于适度正面,但也有一些极端的异常值,最正面的评论为 3.44,最负面的评论为-1.88。这些值与平均值和中值相差甚远,应考虑将其剔除,以便进一步分析。
我还做了一个快速直方图来查看评论的情绪。
library(ggplot2)
qplot(sentiment$ave_sentiment, geom="histogram",binwidth=0.1,main="Review Sentiment Histogram")
将你的情感分数整合到原始数据集中
因为我对情感分数最感兴趣,所以我将通过将情感分数及其标准差集成回主数据集中来结束本教程。
df$ave_sentiment=sentiment$ave_sentiment
df$sd_sentiment=sentiment$sd
不要成为数据科学的崇拜者
原文:https://towardsdatascience.com/dont-be-a-data-science-wannabe-76442ff79fc9?source=collection_archive---------4-----------------------
Picture taken from Pexels (CC0 license)
成为一名数据科学家是最热门的工作之一,我理解为什么这是一个如此有吸引力的角色。在过去的几年里,我与不同级别(初级、高级)的一些数据科学家一起工作、面谈并雇佣了他们。在我的上一份工作公开并拒绝了 80%的申请后,我决定总结一些我在招聘时要注意的要点。
我期望的事情:
心存好奇。如果你只关心事物的技术方面,你不会成功。在开始之前,您需要了解数据来自哪里,如何生成,为什么是这样,以及如何最好地预处理数据。为了理解这一点,你需要亲自学习业务流程、产品和软件架构。最重要的是,任何可能影响数据源的缺陷。
有很强的技术背景,最好有很多数学知识。理想情况下,有一个高级学位。我希望有人能够理解和解释结果,我坚信你需要理解模型背后的基础知识,而不仅仅是能够将输入数据输入到 python 库中。对于一个入门职位来说,至少要能显示出你理解概率和统计的基础知识,以及相关性和因果关系之间的区别。
弄脏你的手。从理论上理解数据科学中应用的标准模型是一回事,但 Hadoop、Python 和 AWS 等工具需要与展示这些技能投入使用的项目相结合。完成学位后,尝试去 Kaggle 获取经验或从数据工程师做起。如果你的工作申请没有展示项目成果,也没有列出一门 edX MOOC 课程来证明你的 ML 背景,那就不要称自己为数据科学家。
了解产品和软件开发生命周期。同意,数据科学家的工作不同于软件工程师的工作。在大多数情况下,结果是不容易预测的,作为一个项目经理,我不能给你一个好看的用户故事与接受标准,你可以有效地估计需要多长时间。但是你需要能够在团队中工作,将你的代码投入生产,并且你需要能够维护和改进它。
成为优秀的沟通者。最有可能的是,你将和各个层次的人一起工作,从管理层到工程师到用户。无论这个人对数据科学的理解有多深或多浅,你都需要能够清晰地表达和解释你的方法和结果。毕竟,通常情况下,你不是为了酷而解决技术问题,而是通过应用数据科学来解决业务问题。
不要被虚假的数据所迷惑
原文:https://towardsdatascience.com/dont-be-fooled-by-fake-stats-9f5f7d827d2b?source=collection_archive---------1-----------------------
作为新闻和信息的精明消费者,你应该警惕假新闻和包裹在统计数字中的谎言。
当你阅读或观看新闻时,你怎么知道你没有被欺骗或“被推动”?有了图表和图形,它可能看起来很科学,但真的是这样吗?
当你阅读新闻时,你相信作家和编辑,他们相信所呈现的是真实的。但事实并非总是如此。数据被操纵,图表被篡改来影响你的观点。有时是故意的,有时是无意的。不管动机如何,你最终都会成为假新闻的受害者。
不要做受害者。
还记得街区的珍妮曾经告诉她的粉丝们的话吗:“不要被我得到的石头所迷惑,我仍然是,我仍然是街区的珍妮!”所以,是的,不要被他们得到的数据所迷惑,他们仍然是躺在排行榜上的天才!
作为新闻和信息的精明消费者,你应该警惕假新闻和包裹在统计数字中的谎言。如果你遵循我下面的建议,你应该能够区分事实和虚构。
加载的问题和有偏见的调查
调查统计是影响公众意见的一种简单而有效的方法。你可以从调查中得到任何你想要的答案。你所需要的是向一个非随机的方便样本提出精心设计的问题。
这里有一个例子。假设你想把煤作为一种可行的能源。你是怎么做到的?你雇佣了一家市场调查公司,该公司设计了一项调查,并在大多数人从事煤炭相关业务的城镇实施。你向受访者提出以下问题:
"你认为‘清洁’煤会减少美国对中东石油的依赖吗?"
这项调查的结果产生了一个故事,内容如下:
“85%的美国消费者认为清洁煤可以减少美国对外国石油的依赖。高油价让美国中产阶级付出了代价。或许是时候重新审视一下煤炭了。等等,等等,等等……”
如果你正在阅读一篇关于某项调查的新闻,请注意陷阱,并问自己以下问题:
- 谁委托进行这项调查的?调查的发起者是否对调查结果有既得利益?在前面的煤炭示例中,您想知道煤炭行业是否赞助了该调查,或者该调查是否由环境倡导组织赞助。
- 谁回答了调查?受访者是普通的美国人还是依靠煤炭相关产业为生的人?
- 被调查者在可比较的选择中有真正的选择权吗?例如,将清洁煤与中东的石油进行比较公平吗?把煤和风能或太阳能相比怎么样?这公平吗?
你可能会认为我对煤炭行业过于挑剔。不是真的。这只是一个例子。事实上,你可以反过来想一想,如果一个可再生能源组织的意图是在光线不好的情况下展示煤炭,它可能会向调查对象提出一些有分量的问题。这里有一个例子。“你认为政府应该支持生产更多的风能和太阳能,以减少美国对‘脏’煤和中东石油的依赖吗?”
An inconvenient sequel: Are we listening yet?
但不全是脏煤或者热风?借助大数据和分析,市场研究人员对你的了解比你想知道的还要多。你认为某一类餐馆的顾客更有可能以某种方式投票吗?如果你的答案是否定的,请再想一想。
通过使用大量的数据,政治民意测验专家确定,共和党和民主党选民不仅在政治上有不同的品味,而且他们的味蕾也不同,因为他们在不同的场所吃牛排。对一些人来说是全熟,对另一些人来说是半熟!
不要被我得到的图表所迷惑
用图形和图表更容易理解。我们很容易成为假科学的牺牲品。当你看到一个图表时,不要只是相信它。首先寻找错误、遗漏和故意操纵的线索。记住那些试图欺骗你的人会试图操纵图表和夸大其词。
这里有一个来自福克斯新闻频道电视台的例子,你可能知道它不是民主党的忠实粉丝。2012 年 7 月,福克斯新闻频道公布了一张图表,突出显示了美国最高收入人群的税率变化。该网络倾向于降低税收,并认为如果对富人征税更少,他们就会花更多的钱来促进经济增长。
福克斯新闻频道想把计划中的税率变化描绘成一个巨大的增长。下面的图表显示,一旦布什总统对富人的减税政策到期,税率将会“大幅”增加。如果你比较两个柱的高度,你会注意到减税后的柱比另一个柱高很多倍。
但是如果你看这两个税率的话,还是挺像的。减税后 35%的税率与 39.6%的税率没有太大区别。但是图表夸大了差异,使用任意最小值作为纵轴。轴从 34%开始,而不是从 0%开始。
如果福克斯新闻频道选择 0 作为纵轴的最小值,你认为图表会有所不同吗?让我们自己尝试一下,因为我们已经有了绘制条形图所需的两个数据点。我只需要把上面图像中福克斯新闻频道的图表换成我的。
下面的图表显示了与福克斯新闻频道相同的信息,但是两种视觉效果截然不同。当柱状图使用 0 作为纵轴的最小值时,我们不再看到税率的大幅上升。
这张图表展示了一幅真实的画面,尽管可能很无聊,但确实是真实的。
伪科学同样致命
并非只有新闻媒体忙于夸大事实。科学家和研究人员也是夸张行业的一部分。例如,一个研究小组在 2016 年声称,他们可以使用高级分析技术通过面部识别罪犯。诡异!是的。但前提是这是真的。
让我先解释一下他们做了什么。他们将罪犯的照片(由警方提供)与普通人的照片进行了对比。他们声称他们的程序能够以 90%的准确率区分罪犯和非罪犯。
实际上,他们成功建造的是一个微笑探测器,而不是犯罪探测器。他们的程序测量一个人的鼻子和嘴唇边缘形成的角度。微笑的脸会比皱眉的脸报告更大的角度。因此,他们能够区分微笑和皱眉的脸。
你可能会问,微笑和犯罪有什么关系。没什么。
记住,在这项研究中,警察提供了罪犯的照片。现在,我不是面部照片的专家,但我知道被拘留者在被警察拍照时不太可能微笑。你不必相信我。你所要做的就是记住著名的英国演员休·格兰特在警察逮捕他和一名妓女在公共场所做出猥亵行为后是如何照顾他的。
肯定不是他的最佳时刻。
在警方公布的面部照片中,他没有笑。然而,将这张照片与电影海报中格兰特满脸笑容的照片相比,你会注意到不同之处。他的鼻尖和嘴唇边缘形成的三角形在他笑的时候比警察拍的照片有更大的角度。
On the left is the police mugshot and on the right is Hugh smiling!
基本上,研究人员能够比较从 LinkedIn 等网站上获取的笑脸和皱眉脸。研究人员可能夸大了他们的发现,从微笑和皱眉到发现罪犯。我不得不说,这是一个很大的延伸。
结论
在一个充斥着大数据和假新闻的世界里,你可能会被骗,以免提高警惕。不要轻易被数据和图表欺骗。做一个事实和新闻的精明消费者。
聪明的答案需要聪明的问题。询问关于谁收集了数据,谁支付了费用,谁分析了数据,以及谁写了这个故事。有了这些聪明的问题,你就不会被愚弄。
不要被称为江湖骗子:建立可信的模型
原文:https://towardsdatascience.com/dont-get-called-a-charlatan-building-credible-models-4f4709eb760c?source=collection_archive---------15-----------------------
如果你的客户理解你的模型,他们会更容易相信。
肖恩·惠勒(Schaun Wheeler)几周前在发表的关于数据科学伦理的明智文章触及了数据科学家的一个重要问题——客户可能会认为你是个骗子。虽然惠勒是在不同的背景下说的,但值得考虑的是,像“预测分析”和“机器学习”这样的项目据说正处于炒作的顶峰(根据 Gartner 的说法),如果这是正确的,那么反弹可能就在眼前。
这也是不可避免的,尤其是如果你正在生产的东西可以被看作是一个预测(这意味着尽可能广泛的术语),你将是错误的——“所有的模型都是错误的”,毕竟。那么,显而易见的挑战是让你的观众相信你在做有用的事情,即使你的模型是错误的。
在这种情况下,一个重要的工具就是解释你的模型的能力。如果没有对输入变量如何影响模型输出的某种形式的解释,你就无法对正在发生的事情做出任何假设。如果没有关于数据告诉你什么的假设,你就无法将结果与现有知识进行比较。这反过来又会立即束缚你利用主题专家的知识来改进模型的能力。除此之外,无法在您的模型中直接使用主题专家的知识是一个错失为您的工作赢得盟友的机会,也是一个错失改进您的模型的机会。
为了给模型提供可信度,对它正在做什么的解释需要对用户有意义。如果你把模型呈现给用户,最好的情况是你的模型至少能说明一种他们已经知道的关系,以及另一种向他们展示新东西的关系。第一个确认模型已经找到了真实的关系。第二个说明模型发现了用户以前不知道的新东西。如果你不能提供任何与用户自己观察到的东西相一致的发现,他们不太可能会接受你的模型是可信的。同时,如果你不能给他们提供任何新的东西,他们不太可能接受你的工作是值得付出的。
直觉上,有两种策略可以用来建立既准确又可解释的模型。首先是建立一个内在可解释的模型,并努力确保其准确性。另一个是建立一个准确的和工作来解释它。我们将研究以下任一策略下的一些选项。
可解释且准确的模型
解释你的模型最明显的方法是从一开始就让它可以解释。如果可能,对连续因变量使用线性回归,或对分类因变量使用逻辑回归(二项式或多项式,视情况而定)或其他适当的 GLM(例如泊松、负二项式)。
提高模型预测性能的一种方法是采用收缩方法,如套索或岭回归。这些方法减少了与逐步回归相关的问题,即变量选择过程是谨慎的,因此是贪婪的,这可能导致高方差。作为一个例子,岭回归试图通过防止系数变得太大来减少这个问题,因此在完全丢弃变量和允许它们过度影响之间采取了中间路线。
如果放松对线性关系的假设,线性模型可以模拟更复杂的关系。这可以通过使用附加模型来说明有影响的非线性预测来实现。广义加性模型(GAM)使用诸如样条的平滑函数来表示非线性关系。Harrell 支持的合理预测模型策略的一个要素是放宽关键变量的线性假设(由主题领域的知识决定)
这一领域与之前的观察结果紧密相关,即客户需要在他们的模型中看到一些他们已经知道和不知道的东西——展示了一个 GAM,该 GAM 证实了客户之前的想法,即“年龄”是一个重要因素(他们确实知道的东西),但通过展示效果有一个峰值或逐渐减小(他们不知道的东西),扩大了他们的视角,为我带来了出色的客户认同。
黑盒子里的窗户
另一种选择是有一个表现良好的不透明模型,但提供其他模型来解释它。这种想法的一个扩展是用传统上认为不可解释的随机森林这样的算法建立一个准确的预测模型,并使用先进的技术来解释它。去年年底,Grover 王子写了一篇关于如何在 Python 中解释随机森林的文章——目前作者的观点是,使用 r 可以有更多的选择。
此外,使用随机森林来发现量化关系以及进行预测是一个活跃的研究主题——例如在最近由门奇和胡克发表的论文以及他们更早的论文中。更早的论文“量化随机森林中的不确定性”特别讨论了基于 U-统计估计整个随机森林中特定预测因子对因变量影响的大小和方向的策略。在 R 这里有一个这些想法的实验性实现,以及一个使用 jacknife 对随机森林进行推理的替代方法。
R 中的 inTrees 包也借鉴了类似的主题,它创建了一个树集合的规则集概要,是当今 R 中用于解释随机森林和其他树集合的几个包中的一个很好的例子。inTrees 方法是从构成集成的树中提取规则,并根据规则的频率和错误等属性,保留最高质量的规则作为集成的解释或总结。
上述方法仅适用于树的集合,包括随机森林和梯度推进机器。解释最近出现的任何算法的结果的一个选项是使用通用模型解释器,其中 LIME(本地可解释模型不可知解释)可能是最突出的例子。
与广义加性模型等方法相比,LIME 将根据具体情况提供解释。也就是说,对于代表要评分的情况的一组参数,时间解释代表不同变量如何影响该特定情况;如果将另一种情况呈现给算法,变量的影响可能会非常不同。
解释以水平条形图的形式呈现,显示不同变量影响的相对大小,向右延伸的条形代表使分类更有可能的变量,向左延伸的条形代表使结果不太可能的变量。在高层次上,变量的影响来自敏感性分析,该分析检查与感兴趣的病例非常相似的其他病例的分类结果。
这是 LIME 的局部方面——解释是在个案的基础上给出的,而不是作为一个整体为模型提供规则或指南。这是与前面讨论的树集合的方法的显著区别。此外,LIME 目前仅适用于分类器,而非回归模型。LIME 的一个 R 实现可从这里获得。
在当前环境下,确保用户能够信任模型的可解释模型的重要性日益得到认可;与此同时,幸运的是,不仅可解释模型的预测能力被正则化等技术扩展了,解释黑盒算法的方法也开始激增。
不要忽视空头:用中位数汇总数据的陷阱
原文:https://towardsdatascience.com/dont-ignore-bears-the-pitfalls-of-summarizing-data-with-medians-3c07b4d509db?source=collection_archive---------8-----------------------
有些人非常喜欢将中位数作为汇总统计数据。我有时也是。但是它有一些很大的缺点——正如所有的统计数据一样——我希望我们能意识到这一点。
为什么人们一开始就建议使用中位数?通常是因为中位数忽略了极值。如果你要为你的初创公司雇佣一名新的平面设计师,你可能要以你所在地区的其他人的工资为基准。假设你能得到数据,你可能会找到一些在大公司工作的摇滚明星的高薪。但这不是你想要的基准:你想要的是更普遍的东西。“集中趋势”的想法是中值可以带给你的。10 万美元的家伙被排除在外。
但是这是有代价的:中位数忽略了所有异常值,因为它们忽略了数据集中的所有值,除了单个中心项的值(或者在平局的情况下两个项)。相对位置才是最重要的。这意味着每次使用中间值时,你都在丢弃数据。(统计学上的“低效率”。)自然,这会给你带来麻烦。这里有一些例子。
故障类型 1:小范围的值
当数据集的中点附近有一小组选项时,就会出现这种情况。当离散值(1,2,3 而不是 1.234 等)覆盖的范围很窄时,这种情况很可能发生。例如,假设您对某个产品有 1-5 颗星的评价。一些不好的事情会发生。
坏事 1A:夸大小差异
这两款产品的评分几乎相同。但是有一个等级——核心等级——是不同的:
**Product A**: 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 5**Product B**: 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 5
^
*Median*
查看产品排名中值,您会发现产品的值为 3 和 2。但是手段只有零点几分的不同。
坏事 1B:缺失变化
如果变化不影响中值,您将不会注意到任何变化:
**Product C**: 1 1 2 3 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4**Product D**: 2 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 5 5 5
^
*Median*
即使分布的两端都向上移动,中位数仍然保持在 3。从 2.9 到 3.5,平均值移动了 20%以上。
失败类型 2:忽略极端值
人们喜欢忽略极端情况,因为它们可能是“异常值”,意味着错误。但极端情况是大多数现实世界系统的自然特征,比如工资、工厂密度或灾难影响。这通常意味着数据向左倾斜,有几个非常大的值,还有许多小值:
极端情况会极大地抬高(算术)平均值——但这不一定是件坏事:极端情况在现实世界中也会产生巨大影响,你的分析可能需要反映这一点。生态学家不应该因为熊很大就忽视它们!
如果你在有偏差的数据上使用中位数,你就忽略了罕见的极端情况,而是专注于常见的情况。这是否是一个好主意取决于你想知道什么。想象一下,你经营着一个创客空间,拥有每周顾客受伤人数的数据:
**Injuries**: 1 1 1 1 1 1 1 1 2 2 2 3 3 5 8 16 40
^
*Median*
*Mean*: 5.2
平均值和中间值回答不同类型的问题
除了永远不再允许“战斗机器人星期四”,我们还能说什么?视情况而定:
- 如果我们想知道“这周我能期待多少伤病?”那么中间值可能工作得很好。假设过去是一个很好的预测,你有 50%的机会减少 2 次伤害。
- 如果我们想,“如果我再开两周,我还会受多少伤?”然后我们需要(算术)平均值。均值是一种假装所有日子都一样,同时保持总数不变的方法。大部分日子少于 5 次受伤;但是如果每天都有 5 个,最终什么都不会改变。如果我们更加开放,我们可以估计另外 5.2 x 2 = 10.4 人受伤。
什么时候极端很重要?
不要只选择最有吸引力的数字:2 次受伤听起来比 5 次好,但不是提前计划的好方法。两个简单的问题可以帮助你评估你是否需要一个平均值来代替中位数:
- 如果最大值大 10 倍,我会在乎吗?
- 我实际上是在问,“如果每个值都一样会怎么样?”
外卖信息
我们都需要汇总统计数据:我们不能只是直观地或以表格的形式呈现原始数据。几乎所有的回归分析都是基于它们。他们不会走的。因此,我们的选择是更好地了解不同的统计数据,以及何时明智地使用它们。
考虑您的数据中是否有小范围的值,以及极端值是否重要。如果是这样,平均值可能比中值更好。可视化您的数据。不要不假思索地使用任何统计数据!
24 小时不要学机器学习
原文:https://towardsdatascience.com/dont-learn-machine-learning-in-24-hours-3ea3624f9881?source=collection_archive---------2-----------------------
Source — https://medium.com/designer-hangout/machine-learning-and-ux-c28725b5f3a5
最近偶然看到 Peter Norvig 的一篇精彩文章——《10 年自学编程》。
这是一个诙谐且有点讽刺的标题,对那些旨在 24 小时、7 天、10 天、插入一个可笑的短时间线 教你编程的茶几编程书籍进行了挖苦。
诺维格博士提出了一个很强的理由。是的,你可能会在 24 小时内掌握一门编程语言的语法、本质和风格,但这并不意味着你已经精通编程艺术。因为编程根本不是一门语言。编程是关于智能设计,对时间和空间复杂性的严格分析,理解某种语言何时能超越另一种语言,等等。
当然你可以在 24 小时内用 C++写一个 Hello World 程序,或者在 24 小时内写一个求圆的面积的程序,但这不是重点。你把面向对象编程理解为一种范式吗?你了解名称空间和模板的用例吗?你知道你在著名的 STL 附近的路吗?如果你这样做了,你肯定不会在一周内,甚至一个月内学会所有这些。这花了你相当多的时间。你学得越多,你就越意识到深渊比它从悬崖上看起来更深。
我在当前围绕机器学习、深度学习和人工智能的整体氛围中发现了类似的情况。成千上万的博客、文章和课程到处涌现,助长了这种炒作。其中数以千计的标题都是同类的——“7 行代码的机器学习”、“10 天的机器学习”等等。这反过来导致 Quora 上的人们提出类似“我如何在 30 天内学会机器学习?”。简短的回答是,“你不能。没人能。没有一个专家(甚至是熟悉其来龙去脉的专家)做到过。”
Looks familiar? Found this on a very funny Facebook page
即使我们暂时忘记 10,000 小时规则,你也无法用 7 行代码完成机器学习。
为什么?因为这 7 行代码没有解释你在偏差-方差权衡中的表现,你的精度值意味着什么,或者精度是否是一个合适的性能指标摆在首位,你的模型是否超过了,你的数据是如何分布的,以及你是否选择了正确的模型来拟合你所拥有的数据,等等。甚至在你回答了这些问题之后,还有更多事情要做。
因为你不能解释你的模型,你调整了 sklearn 中的参数,获得了最小的精度提高,然后高高兴兴地回家。但是你真的学会了吗?
Source — http://machinelearningjourney.blogspot.in/2012/03/machine-learning-and-memes.html
简而言之,不要用 7 行代码来做。做 6 个月,一年。你会在那个时期的中期知道它是否让你感兴趣。暂时忘记魅力,真正进入这个令人惊叹的研究领域的深处。这个你绝对要看。我发现这是对这一领域新手的最好介绍。你不需要知道数学或代码来阅读它。但是在读完这篇文章后,你会意识到你需要理解的所有概念,以便在这个领域中流畅地思考,可以这么说。
确实有一些关于这个主题的有趣的博客。以下是我个人最喜欢的一些:
- http://colah.github.io/
- http://mark.reid.name/blog/
- http://karpathy.github.io/
Medium 也是一个学习的好地方。我几乎只关注这个出版物。
如果你是守旧派,就去斯坦福上吴恩达的 CS229。这比他在 Coursera 上的课程更涉及,也是一个很好的介绍。
炒作的一个不幸结果就是我们“淹没在信息中,渴望知识”。很多人都这样做,以至于我们经常忽略了大局。机器学习很奇妙。这是一个严肃的研究和开发领域,正在推动许多 21 世纪的使用案例。
只是不要在 24 小时内做。
这是彼得·诺维格的文章,是我们这个时代一位杰出的人工智能研究者的必读之作。
Seriously, though. Why not?
不要犯这个机器学习的大错误:研究 vs 应用
原文:https://towardsdatascience.com/dont-make-this-big-machine-learning-mistake-research-vs-application-bd52d5a9a8b9?source=collection_archive---------2-----------------------
想获得灵感?快来加入我的 超级行情快讯 。😎
如今,每个人都在研究机器学习。对于许多企业来说,这绝对是一个值得追求的伟大方向,因为它让他们能够以一种相当快速和简单的方式交付巨大的价值。对机器学习技能的需求空前高涨。麦肯锡做了一份很好的综合报告,关于人工智能如何塑造产业以及机会在哪里。
所以我们看到周围的每个企业都说:
嘿,我们急需一个机器学习研究团队!我们会找到有大量出版物的最好的科学家,付给他们很多钱,这样我们就可以在我们的业务中进行一些机器学习。万岁!
但是等一下……作为一家企业,你真的需要一个机器学习研究团队吗?对于今天的高价格,您的企业会有效地使用它们吗?你到底有多需要机器学习?真的有那么复杂吗?
如果你更像一个技术人员,你会全力学习如何做机器学习研究吗?
要回答这个问题,我们需要区分两种类型的方法,我们可以真正使用机器学习: 研究和应用。
机器学习研究
机器学习研究实际上是关于科学的。一位机器学习研究人员正试图推进科学的边界,特别是在人工智能领域。这些人通常拥有 CS 硕士或博士学位,并在顶级机器学习会议上发表了许多论文。他们在研究领域非常受欢迎!
如果你在做一些真正前沿的事情,机器学习研究员是很棒的。这些人习惯于为你的问题寻找定制的科学解决方案。如果你告诉他们“我们非常擅长使用人脸识别自动检测人类入侵者,准确率高达 95%。你能让我们达到 97%吗?”。ML 研究员是你要找的人!
Machine Learning researchers know this stuff
这里有一个问题:这个人可能从来没有真正将软件部署到产品中!他们可能不是将软件作为服务(SaaS)或产品交付给客户,将研究转化为实践的专家。他们不知道如何正确包装、生产和运输。
这就是下一个的切入点…
机器学习应用
机器学习应用都是关于工程的。机器学习工程师知道如何将最新的人工智能研究转化为有价值的东西。他们将研究成果转化为产品或服务。这些人非常擅长云计算服务,比如亚马逊的 AWS 或者谷歌的 GCP 。他们了解软件开发生命周期(SDLC)和敏捷方法。
不幸的是,拥有这些技能的人经常被寻求将机器学习集成到他们的产品或服务中的企业所忽视。机器学习工程师通常隐藏在众目睽睽之下,在部署尖端产品方面拥有丰富的经验,并拥有足够的机器学习知识来使用它。
机器学习工程师不像研究人员那样花哨,因为他们不像拥有博士学位和 5000 次引用的 ML 超级明星。但是如果你想把 ML 驱动的产品交付给客户,你就需要它们。
如何在你的企业中使用机器学习
决定如何在你的业务中使用机器学习并建立你的团队将取决于你试图提供的产品或服务。你正在建造的东西是超级定制的,超越了人工智能当前的最先进水平,还是在一个完全不同的方向?你可能需要一些 ML 研究员来完成工作,他们习惯于做这类事情。
对于大多数企业和团队来说,你真的不需要那个。目前的机器学习科学对许多应用来说已经足够好了。没那么复杂。你不需要重新发明轮子,你需要知道如何使用轮子让你的车变得更好的人:工程师!
归根结底,机器学习是一个工具,就像任何其他软件工具一样。研究人员创造新工具,工程师找出如何最好地使用它们。机器学习现在做了一些非常酷的事情!…但它的目的仍然主要是最终向消费者提供某种价值。
让我们通过宣传记住这一点!
喜欢阅读关于科技的文章吗?
在 twitter 上关注我,我会在这里发布所有最新最棒的技术!
不要放松:足球中的危险领先
原文:https://towardsdatascience.com/dont-relax-just-yet-dangerous-leads-in-soccer-5e5a28630f03?source=collection_archive---------9-----------------------
足球比赛中 2 比 0 的领先优势是最危险的吗?
你会听到比赛评论员说“2-0 的领先是最危险的领先”,这意味着与其他类似的比分相比,你输(或最多平局)的可能性是最大的。
这是一个有趣的理论。在“仅仅”1-0 领先的情况下,领先的球队仍然知道对手只差一球就能追平比赛,然后有可能获得心理优势。因此,领先的团队仍然保持警惕,更有效地保护领先。但是 2-0 的领先看起来很舒服:即使对手得分,你仍然领先。理论表明,这就是为什么 2-0 领先的球队比以往任何时候都更容易被得分(一次又一次),并最终输掉比赛。
这个理论有统计学上的价值吗?
数据集
我使用了这个 Kaggle 数据集——包括 2012 年至 2017 年赛季在英国、德国、法国、意大利和西班牙国内联赛中进行的 9K 场比赛的详细事件——试图为这个流行的理论添加一些数据视角。
方法论
对于数据集中的每场比赛,我得到了每一个进球和进球的一方(主场或客场)。然后我生成了每场比赛的每一个比分。例如,如果一场比赛以 2-1 结束,比赛产生的比分可能是 1-0,然后是 2-0,然后是 2-1。在这个过程的最后,有 57 个独特的得分线。请注意,评分线 2–1 不同于评分线 1–2。
然后,我减去构成得分线的两个数字,得出领先优势。正领先表示主队赢了(例如比分是 2-1,领先 1 球),负领先表示客队赢了(例如 1-2,领先-1 球)。为了能够一起分析积极和消极的线索,我将线索与最终结果进行了比较,并从领导团队的角度分配了一个“赢/平/输”。因此,如果在某个时候比分是 2 比 1,主队最终获胜,那就是领先队的“胜利”,如果客队获胜,那就是领先队的“失败”。
上述方法的一个重要注意事项是,同一个游戏可以为我们的数据集贡献多个观察值,每个观察值对应一个不同的得分线。作为一个说明性的例子,如果一个队在比赛的某一点上以 1-0 领先,那么在另一点上以 2-0 领先,最后以 2-1 领先,这就产生了 两个1 球领先的观察结果和一个主队获胜的 2 球领先的观察结果。
最后,请注意,这种方法考虑了每场比赛中除平局之外的所有可能的比分。
结果
这是领先团队的结果分布,是领先程度的函数。
Figure 1. The distribution of results for each observed lead in the dataset. Green represents victory for the leading team, Orange a draw and Red a loss.
与理论所暗示的相反(但可能并不令人惊讶),我们看到你的领先优势越高,你赢得比赛的机会就越大!领先 2 球的球队有 94%的可能性赢得比赛,相比之下,领先 1 球的球队“只有”72%的可能性赢得比赛。拥有 3 球的领先优势几乎可以保证赢得比赛(99.1%的概率)。只有一次球队领先 3 球却输掉了比赛:2011-2012 赛季意大利甲级联赛莱切和米兰之间的一场比赛,当时莱切半场 3-0 领先,但米兰扳回一局,以 3-4 获胜。
为了理解图 1 中每个条形的样本大小,这里列出了每个导联被观察的次数。请注意,在同一场比赛中,可以多次观察到相同的领先优势。
Figure 2. How many times was each lead observed. Note that there are ~9K games in the dataset overall and ~8.3K games in which at least 1 goal was scored. Each lead can be observed multiple times within the same game.
我们可以更深入地分析,根据主队和客场队的领先优势,分解结果的概率分布,例如,比较主队和客场队领先 2 球时赢得比赛的概率。
Figure 3: Distribution of results as the lead increases. For Home and Away teams.
同样,我们看到领先优势越大,你就越有可能赢得比赛,无论是主场还是客场。我们还注意到,与领先优势相同的主队相比,如果你是客场队,赢得比赛的机会就更小。如果我们考虑到主队有他们的球迷支持,因此可能比客队更有可能卷土重来,这是有道理的。领先一球的主队有 76%的可能性赢得比赛,而领先一球的客场队有 66%的可能性赢得比赛。主队以 2 球领先赢得比赛的概率是 95%,客场是 91%。在领先 3 球的情况下,获胜的概率是 99%和 98.5%。
领先 4 球的球队没有平局或输球的记录。
具体来说 2-0 领先怎么样?
好吧,不管我们怎么看,2 球领先比 1 球领先更安全,但是如果我们真的只考虑 2-0(或 0-2)比分并将其与 1-0(或 0-1)比分进行比较,“2-0 领先是最危险的领先”这一理论能得到任何统计支持吗?
没有。
Figure 4. Probability of winning depending on the scoreline
与“仅仅”1 比 0 领先的情况相比,一个 2 比 0 领先的球队更有可能赢得比赛。如果他们 3-0 领先,他们也几乎肯定会赢得比赛(虽然,我敢肯定 2005 年冠军联赛决赛米兰将不敢苟同)。
因此,对欧洲一些最大联赛(英格兰、法国、德国、意大利和西班牙)约 9K 场比赛的统计分析显示,2-0 领先是最危险领先的理论没有任何价值。数据显示,领先优势越大,团队越安全。
这个理论能在其他运动中找到支持吗?或者也许是电子足球(PES 和 FIFA)?
感谢阅读!
你可以在这里 找到所有分析 的 jupyter 笔记本。
AI 犯错是谁的错?
原文:https://towardsdatascience.com/dont-trust-ai-10a7df520925?source=collection_archive---------10-----------------------
别误会,我爱机器学习和 AI 。但是我不会盲目地信任他们,你也不应该,因为你构建有效可靠的 ML/AI 解决方案的方式就是迫使每个解决方案赢得 你的信任。
(本文中的许多建议也适用于没有 ML/AI 的数据洞察和模型,尤其是最后一段。)
盲目的信任是一件可怕的事情。
在你开始认为这和机器人或者科幻有什么关系之前,打住! ML/AI 系统不像人类,它们只是有用的东西的标签有着诗意的名字。相反,他们的不信任完全来自其他地方。我认为最好是展示而不是讲述,所以我们来看一个熟悉的例子 …
【剧透警告:这篇文章会破坏无监督学习去神秘化的乐趣,让你对我的小认知演示免疫。]
Never trust ML/AI blindly, always force it to earn your trust with appropriate testing. Image: source.
为一厢情愿的想法做准备
欢迎回到我们的猫,你们可能已经见过T21,当我们建立一个分类器将我的六张照片的原始数据集分成两组时。
The original training dataset from Unsupervised Learning Demystified. Do you see the two groups?
你看到了吗?我神奇的神奇的机器学习系统成功地返回了我所期望的确切结果!
This example works for supervised ML and for unsupervised ML, so don’t worry about that. The important thing is that the model perfectly identifies my two cats with 100% training accuracy.
答对了。这是两只不同的猫,而型号完美地回复了它们的标签,让我泪眼模糊,为我聪明的分类机器人感到自豪。这意味着我刚刚建立了一个特斯拉和赫胥黎分类器!!!…对吗?
我们的思想会捉弄我们
没那么快!那是我们人类的一厢情愿又捉弄了我们。我太沉迷于我的小猫了,以至于我可能没有注意到所有特斯拉的照片都有一个散热器作为背景,而所有赫胥黎的照片都没有。你注意到了吗?再看看。
This system was never a cat detector. I jumped to that conclusion thanks to confirmation bias, selectively noticing the evidence that confirmed the story I liked and failing to notice evidence that suggests the system is actually a radiator detector.
猫探测器还是散热器探测器?
我不知道的是,我的解决方案实际上是一个散热器探测器,而不是 Hux/Tes 探测器。用新的例子进行测试是有帮助的,所以让我们看看我们是否能以这种方式发现问题…
Turns out that using more examples from the same dataset doesn’t do much to, ahem, iron out the issue.
即使我通过给它看这些新照片,用新数据来测试它,也不会有一丝警报。哦亲爱的。有问题吗?
不是 如果 Tes 是 总 用散热器拍摄而 Hux 总 不是。如果是这样的话,谁在乎它是如何工作的呢?它 总是 起作用。它每次都会给正确的猫。没有问题。
那是一个很大的假设。如果猫搬到另一个公寓会怎样(真实故事)?如果你继承了我的分类器而没有我的笔记,并在你的照片上使用它,会怎么样?
在这些情况下,返回的标签将是“Huxley ”,任何依赖于我的 Hux/Tes 检测器的关键任务系统都将崩溃并严重燃烧。
这是谁的错?
在大火肆虐的时候,让我们做一个快速的尸检:
- 就像常见的 AI 一样,把像素转换成标签的配方是 太复杂了 。
- 我观察到的只是输入(像素)和输出(Hux / Tes 标签)。
- 因为我是 人类 ,所以我不会注意到就在我眼皮底下的东西(散热器和 Tes 总是重合的)。
- 我告诉自己的关于输入与输出之间关系的故事不仅过于简单,而且还偏离了 一厢情愿 的散热器解释。
- 没事。我不需要理解它是如何工作的,只要我能确定它确实工作。
- 检验它是否有效的方法是评估它在一系列它从未见过的相关例子上的表现。
到目前为止,一切顺利。实际上还没有问题。你相信很多东西,却不知道它们是如何工作的,例如我们很多人用来治疗头痛的扑热息痛。它确实起作用,然而科学无法告诉你如何起作用。重要的一点是,你可以验证扑热息痛是否起作用(不像在你头上绑一颗死痣)。
Don’t know how this popular 100+ year old drug works at a molecular level? Neither does science.
像思考头痛治疗一样思考复杂的人工智能系统。确保它们有效,你就没事了。好吧,在哪里解开?请击鼓!
- 不幸的是,我在不像我希望系统运行的例子上检查性能。
就在那里。这最后一个是实际上出了可怕错误的地方。只要我们用适当的例子适当地测试系统,其余的都没问题。所以,答案是:是我人类的错。
如果你为一项工作测试这个系统,然后把它应用到另一项工作中…你期望什么?
如果我用一组例子来教和测试一个学生,而这些例子并没有涵盖我希望这个学生学习的任务,那么如果以后出现混乱,我为什么会感到惊讶呢?如果我所有的例子都来自 Tes 和辐射器总是在一起的世界,那么我只能期望我的分类器在那个世界工作。当我把它移到一个不同的世界时,我把它放在了不属于它的地方。这个应用程序最好是低风险的,因为没有借口“哎呀,但是我不知道它不能在它被设计的环境之外工作。”你知道。如果你以前不知道,现在你知道了。
这就是为什么从一开始就记住你的目标和用户是如此重要。开始之前,请指定规格和设置。请让一个负责任的成年人来负责或者坚持玩具应用。
当更大的事情处于危急关头时,不要只是在不相关的数据集上抛出一些时髦的词语。
没有熟练和负责任的领导,嗯,我希望你的应用程序永远不会有任何人的健康,安全,尊严,或未来挂在上面…
常识,不是魔法
我一直用“例子”这个词代替“数据”——它们是同一个东西——来提醒你这不是魔术。 ML/AI 的重点是你在用例子而不是指令来表达你的愿望。为了让它起作用,例子必须是相关的。任务越复杂,你需要的例子就越多。你每天都用例子交流,所以你已经知道这些东西了。也许你想知道数学是否有不同的说法;并没有。请放心,常识一直是你最好的算法。
如果你想用例子来教学,例子必须是好的。如果你想信任你的学生,测试必须是好的。
盲目的信任是一件可怕的事情
除了您检查系统的条件之外,您对系统的安全性一无所知,所以请将这些提醒放在手边:
- 如果你没有测试过,就不要相信它。
- 如果你没有在[环境]中测试过,就不要在[环境]中信任它。
- 如果你没有用【用户人群】测试过,就不要用【用户人群】信任它。
- 如果你没有用[数据总体]测试过,就不要用[数据总体]信任它。
- 如果一个输入是不寻常的,不要相信你的系统会输出合理的东西。考虑使用异常检测和安全网(例如,标记一个不寻常的实例以供人工审查)。
如果你使用的工具没有经过安全验证,你造成的任何混乱都是你的错。人工智能和其他工具一样。
感谢阅读!YouTube 课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
Enjoy the entire course playlist here: bit.ly/machinefriend
喜欢作者?与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。
甜甜圈和咖啡符合城市经济
原文:https://towardsdatascience.com/donuts-coffee-meet-the-city-economy-12a540faf83b?source=collection_archive---------10-----------------------
加拿大快餐服务中的数学标度
如果你了解加拿大,你就会知道它与蒂姆·霍顿的连锁快餐店有一种特殊的关系:连锁快餐店,以便宜的咖啡、快捷的早餐和罪恶的油炸圈饼而闻名。然而,这种关系不仅仅是饮食热量的稳定供应。例证:一则新闻报道说,在阿尔伯塔省的红鹿市,一名男子挥拳猛击一只美洲狮,攻击他的哈士奇犬。只有当我们得知这一事件发生在蒂姆·霍顿酒吧时,它才被宣布为峰加拿大。
简单地说,这个品牌的快餐店在加拿大文化中有着特殊的地位。
在接下来的内容中,我使用了蒂姆·霍顿的商店位置数据,以便了解城市消费经济学中的规模。这是一个相当简单的数据集,但它打开了一个城市经济抽象质量的视野,实际上可以作为商业增长代理的基础。
商店和城市及省份的数量
在撰写本文时,整个加拿大共有 4,258 个 Tim Horton 的位置。加拿大有近 3700 万人,因此每家商店大约有 8700 名居民。
下图显示了截至 2017 年与人口普查大都市地区人口相关的商店数量。
Number of stores in census metropolitan areas; color by province, including pink=Ontario, grey=Quebec, orange=British Columbia, blue=Alberta, green=Manitoba, yellow=Saskatchewan, brown=Nova Scotia, red=New Brunswick.
散点图没有透露太多信息,除了加拿大有一个非常大的都市地区,大多伦多地区,第二和第三名分别是蒙特利尔和温哥华。
人们普遍发现,大都市的规模遵循幂律关系,而不是线性关系。这是一种数学方法,通过一个公共因子的重复相乘,而不是一个公共项的重复相加,来说明种群大小之间的关系。例如,温哥华(第三大城市)的人口相对于蒙特利尔(第二大城市)的人口是 62%,而蒙特利尔相对于多伦多(第一大城市)的人口是 65%。换句话说,乘因子几乎是相同的。
这说明了加拿大大城市中心集合的统计关系。一般的观察被标为齐夫定律。这里这里、这里、这里和这里已经详细讨论过,不再赘述。
相反,乘法关系的洞察力可用于用对数将早期的图形转换成更具信息性的东西。x 轴和 y 轴上的数据此后通过以 10 为底的对数进行转换。
市场质量不同的省份
现在我们可以开始辨别有用的关系。
Log number of stores in census metropolitan areas; color by province, including pink=Ontario, grey=Quebec, orange=British Columbia, blue=Alberta, green=Manitoba, yellow=Saskatchewan, brown=Nova Scotia, red=New Brunswick.
该图显示,人口越多,蒂姆·霍顿的位置就越多。这并不奇怪,但是有一个转折,如下一节所述。
在此之前,会出现一个数据分段。图表中的灰色和橙色标记都明显低于我们可以想象的其他标记的线性趋势线。两种不同类型的标记分别表示法语省份魁北克和最西边的省份不列颠哥伦比亚。在不列颠哥伦比亚众所周知星巴克占有更大的市场份额,而魁北克在很多方面有意无意地不同于加拿大其他以英语为母语的地区。
至少与蒂姆·霍顿的市场相比,这两个市场有着质的不同。目前,这些数据被分割,忽略了这些市场,但我会回到他们身上。
观察:尺寸折扣
剩下的非常符合线性关系(r 的平方为 0.94)。
Log number of stores in census metropolitan areas, Quebec and British Columbia removed; color by province, including pink=Ontario, blue=Alberta, green=Manitoba, yellow=Saskatchewan, brown=Nova Scotia, red=New Brunswick.
而是一扭:斜率为 0.81 。精确的等式是:
斜率的值说明了一些重要的事情。
这是一个对数标度,所以我们应该用乘法来思考。例如:将大都市地区的人口增加一倍,换句话说,将 N_population 乘以 2,这在图中相当于沿 x 轴的任意位置向右移动了大约 0.30,因此,y 轴上的值增加了大约 81%,而不是直接增加一倍会达到的 100%。有一个固定的大小折扣。
值得注意的是,这种折扣适用于所有大都市地区。换句话说:Tim Horton's 所在的消费和供应市场的一些潜在质量在 Thunder Bay 和 Kitchener-Waterloo 之间发生变化,就像 Kitchener-Waterloo 和多伦多之间的市场质量变化一样多,因此位置的数量是可预测的折扣。
故意的还是突发的,特例还是一般?
那么,我是不是逆向设计了蒂姆霍顿(Tim Horton)总部高管们盲目遵循的等式,即人口越多的城市中心,人均办公地点就越少?不太可能。但我也拒绝相信高级管理层只是在扔飞镖来解决决策。在某个时候,已经进行了商议,并对某件事情作出了有意决定。
图中的结构更像是来自于多个个人深思熟虑的经济决策的累积,从意图的聚合形式中,观察到的结构看起来好像在城市中感觉到了一种无形的选择力量。随着城市地区在经济发展和维持不断增长和变化的人口的压力下有机增长,产品和服务供应网络的某些质量在任何增长中的加拿大城市的大量但通常是共同的限制下激增。
受当前技术、心理欲望、规章制度、政治和文化遗产以及量子力学的限制,各种各样的人类活动聚集在一起,创造了任何一个单独的深思熟虑都没有想到的东西。
好吧,至少在蒂姆·霍顿的廉价膳食卡路里供应方面。然而,在过去的十年里,类似的比例关系已经在其他类型的城市供给中进行了研究。欧洲大都市地区的加油站数量和汽车经销商数量也按照与蒂姆·霍顿的位置相同的指数进行了规模折扣。相反,一些产品和服务被发现在城市人口中以加速的方式扩展,申请专利的数量就是其中之一。文献中还有其他例子,在这篇文章之后,我们又有了一个例子:Tim Horton 的位置数。
重复一句老话:城市人口的整体大于其各个部分的总和,但随着更多部分加入其中,整体越来越不同。
像这样的组织力量出现的机制是什么?这是一个因果预测调查的问题。非常有趣,但这是另一个重要的话题。
不列颠哥伦比亚省和魁北克省以及市场增长的代理人呢?
不列颠哥伦比亚省和魁北克省被排除在之前的考虑之外,因为他们的蒂姆·霍顿的经济是独特的。是时候把这些省份带回来问一问了:如果蒂姆·霍顿的公司成功地获得了与加拿大其他地方相同的市场份额,那么该公司的正确数量是多少?
首先,计算观察值和拟合线之间的差值,然后将对数转换为位置数。下表显示了不列颠哥伦比亚省和魁北克省的四个大都市地区需要观察多少家商店,才能得出已获得可比市场份额的结论。
如果忽略与人口的比例关系,将会得到当前状态和目标状态之间的不正确差异。
蒂姆·霍顿保持市场份额的能力也可以用一个代理指标来衡量。举例来说:在 2011 年至 2016 年的五年间,大多伦多地区的人口增长了约 6%。由于规模折扣,假设恒定的市场份额和固定的商业模式,蒂姆·霍顿的分店数量应该增长了约 4.8%。如果当时的实际增长偏离了这个数字,我们可以对市场的变化做出有根据的猜测。新的立法、新的竞争或贸易关系的改变的影响的大小可以通过适当的人口规模贴现从未来的数据中辨别出来。
因为它在加拿大结构中的特殊地位,Tim Horton 餐馆地理位置的相对简单的数据,与幂律知识相结合,打开了加拿大城市经济普遍质量的视野。一个有意义的假设,一点数据科学,有趣的见解就能赢得。
掌声就是货币。如果你觉得这值得一读,请按下按钮。
脚注
蒂姆·霍顿的外景拍摄于这里。加拿大人口普查数据取自这里。用 Tableau 完成的可视化。关于缩放关系的推荐通俗读物在这里。对于阴谋读者的免责声明,我与 Tim Horton's 及其竞争对手或供应商没有任何关系,我只是偶尔在那里吃早餐。
用深度学习涂鸦!
原文:https://towardsdatascience.com/doodling-with-deep-learning-1b0e11b858aa?source=collection_archive---------5-----------------------
我们的旅程与素描识别
在这篇博文中,我们描述了我们对过程的理解,对模型的拟合,以及找到一个有趣的 Google Quick,Draw 应用程序!数据集。与我们一起走过这段旅程,看看我们是如何应对成功分类“可以说是世界上最可爱的研究数据集”这一挑战的
该项目由 Akhilesh Reddy、Vincent Kuo、Kirti、Tiffany Sung 和 Helena Shi 建造。要查看使用的完整代码,请找到我们的 github :
一、背景
2016 年,谷歌发布了一款名为“快,画!”—这是一项人工智能实验,它在神经网络方面对公众进行了教育,并建立了超过 10 亿张图纸的庞大数据集。游戏本身很简单。它会提示玩家在某个类别中涂鸦一幅图像,当玩家在画画时,神经网络会在人机游戏的猜图游戏中猜测这幅图像描绘了什么。你可以在这里找到更多关于游戏的信息或者自己玩游戏!
自从在数据集中发布了 5000 万幅图画以来,ML 社区已经开始探索这些数据在改进手写识别、训练草图 RNN 模型来教机器画画等方面的应用。值得注意的是,它在 OCR(光学字符识别)、ASR(自动语音识别)& NLP(自然语言处理)方面具有强大的潜力,并揭示了世界各地的人们如何不同,但却是相同的。
二。数据
我们的总数据量为 73GB,包含 340 个标签类别中的 5000 万张图纸。每张图纸都有特定的变量:
- “字”—该图纸的类别标签
- "国家代码 " —出票人的原产国
- “时间戳”—图纸的时间戳
- “识别出”—表示 app 预测成功
- 绘图——针对涂鸦图像的笔画基础数据;每幅画都由矩阵形式的多个笔画组成
As seen here, each point in a stroke corresponds to an x-coordinate, y-coordinate, and time point
三。接近
我们首先了解构成草图的数组的结构,并对数据进行预处理。然后,我们深入研究拟合一些简单的分类器和一个基本的卷积神经网络,或 CNN。从那里,我们处理 CNN 架构,如 ResNet 和 MobileNet。最后,我们通过参加 Kaggle 竞赛与世界分享了我们的成果。
由于数据的巨大规模和对更高容量 GPU 的需求,我们在谷歌云平台上实现了 CNN 结构,该平台提供 300 美元的免费试用。要了解我们是如何做到的,请点击链接这里和这里。
四。数据预处理
对于每个类别标签的图形,数据以单独的 CSV 文件格式存在。因此,我们首先改组 CSV,用来自所有类的数据创建 100 个新文件,以确保模型接收图像的随机样本作为输入,并消除偏差。
大多数人画涂鸦的方式都差不多。例如,如果我让你画一个太阳,你会从一个圆开始,然后以顺时针方向画出从圆心向外辐射的虚线。为了捕捉这些信息,我们使用灰度/颜色编码处理来利用 RGB 通道,同时构建 CNN,以便模型可以识别每个笔画之间的差异。我们给涂鸦的每一个按时间顺序排列的笔画分配了一种颜色,这样模型就可以获得单个笔画的信息,而不仅仅是整幅图像。
Violin (left) in black & white; Mermaid (right) color-encoded
我们还通过随机翻转、旋转或阻挡部分来增加图像,以将噪声引入图像,并增加模型处理噪声的能力。在游戏过程中,一些玩家没有完成他们的涂鸦或以不同的角度画画。在这些情况下,增强可以为模型提供信息。
灰度/彩色编码和图像增强都使用了来自 keras 、的 OpenCV 和 ImageGenerator,它们从 csv 文件中加载大量原始数据,并将其转换为图像。
五、建筑模型
在完成所有的数据收集和预处理步骤之后,就该开始项目中最有趣的部分了——模型构建!
在我们进入 CNN 之前,我们尝试了一些基本的分类器来比较不同的机器学习算法,并熟悉这些数据。我们从谷歌云存储中提取了数据的 numpy 文件。该数据已经过预处理,并在 numpy 中呈现为 28x28 灰度位图。npy 格式。由于整个数据集包括超过 345 个类别,我们最终选择了仅包含以下 5 个类别的子集:飞机、闹钟、救护车、天使和动物迁徙。
随机森林
我们首先从随机森林分类器开始。我们利用 GridSearchCV 交叉验证模型并优化参数。我们发现精确度在 100 棵树后趋于平稳,所以我们使用 n_estimators = 100 作为我们的最终模型,返回的精确度为 0.8291。
KNN
其次,我们尝试了 k-最近邻(kNN)分类器,这可以说是最简单、最容易理解的模型。它的算法通过在 k 个最接近的例子中找到最常见的类来对未知数据点进行分类。我们交叉验证了 n_neighbors,发现给出的最佳模型是 k = 5,这返回 0.8752 的准确度。
多层感知器(MLP)
最后,我们尝试了 scikit-learn 的多层感知器(MLP)。我们在不同的隐藏层大小和学习率上进行交叉验证,决定隐藏层大小为(784),学习率α= 0.001,这给出了 0.8654 的准确度。
卷积神经网络
然后,我们转到一个简单的 CNN 模型,为模型性能设置一个较低的阈值,并理解模型的细微差别和执行时间。在这个模型中,我们使用数据中的绘图信息,通过 OpenCV 创建所需大小的图像。这里,我们尝试了一系列不同的参数,如下所示:
这是我们参数设置背后的一些直觉。首先,较大的批量将有助于解决由于错误标记的训练数据而产生的噪声。尺寸参数表示图像尺寸/分辨率,对精度有重要影响。例如,32x32 和 128x128 的比较表明,32x32 的大小过于像素化,无法实现精确的模型。
32x32 (left), 128x128 (right)
第一个模型使用两个卷积层,每个深度为 128。然而,这种图像尺寸的增加需要更大的感受野 conv 层或额外的 conv 层。因此,当用更大的图像尺寸训练时,我们包括了多一层。下面是我们创建的自定义 CNN 模型,在构建模型时,将卷积层数、密集层数、压差和大小作为参数。
由于我们仍在决定进一步进行分析的最佳模型,我们在初始步骤使用了有限的数据来减少执行时间。
选择优化器
继续培训之前的一个关键步骤是决定使用哪个优化器。在参考了文献并听取了各种 Kaggle 论坛上专家的建议后,我们决定比较 Adam 优化器和 SGD 优化器在我们的数据上的性能。在多次迭代之后,我们选择了 Adam 优化器,因为我们观察到它显示出比 SGD 稍好的结果并且收敛得更快。
在对每个班级的 25000 张图片运行该模型大约 3 小时后,我们在 Kaggle 的公共排行榜上获得了 0.76 的 MAP@3 分数——对于每个班级仅有 25000 张图片来说,这是一个不错的结果!客观地说,数据集中的平均类包含 150000 幅图像。然而,当我们增加模型的复杂性时,精确度略有下降,这就导致了我们的下一步:ResNet。
SE-ResNet-34,SE-ResNet-50:
当增加模型的深度时,可能会面临消失梯度和退化等问题;相比之下,更深的模型比更简单的模型表现更差。残差网络(ResNet)是一种神经网络架构,它通过使用深度残差学习,以最简单的方式解决消失梯度和退化问题。
简而言之,在反向传播过程中,当信号反向发送时,梯度总是要经过 f(x) (其中 f(x) 是我们的卷积、矩阵乘法或批量归一化等),这可能会由于涉及到的非线性而带来麻烦。
结尾的“ + x ”是快捷键。它允许渐变直接向后传递。通过堆叠这些层,梯度理论上可以“跳过”所有中间层,并到达底部而不会减小。
可以参考原文进一步了解 34 层平面网络和 34 层残差网络的比较。
在该过程的这一步中,我们训练 SE-ResNet-34 和 50 作为简单 CNN 的进一步发展。术语 SE 指的是挤压和激发网;有了它,一个额外的块给不同的通道加权。通过给出权重,SE 模块被证明提供了额外的精度,而仅仅增加了总参数的不到 10%。关于挤压和激励网络的更多信息可在这里找到。
在训练 SE-ResNet-50 时,我们对 50 到 60 个时期尝试了如下不同的参数。
最后,在所有组合中,批量大小为 512 和图像大小为 128x128 的组合对分数的改善最大,将分数提高到 0.9093。值得注意的是,更改批量大小和图像大小是基于我们使用的 GPU,这些是 Tesla k80 上我们数据的最大可能参数。
MobileNet
在与 SE-ResNet 进行多次迭代后,随着竞赛截止日期的临近,我们决定探索 MobileNet,它提供了相当的准确性,但执行速度更快。
MobileNet 由 Google 推出,旨在为客户随时随地提供最新的技术,如对象、徽标和文本识别,而不考虑互联网连接。MobileNets 基于一种流线型架构,使用深度方向可分离的卷积来构建轻量级深度神经网络。
为了正确理解这一点,标准卷积在所有输入通道上应用滤波器,并在一个步骤中组合这些值。相比之下,深度方向可分离卷积执行两个不同的步骤:
- 深度方向卷积将单个滤波器应用于每个输入通道
- 逐点卷积,一个简单的 1×1 卷积,然后用于创建深度方向层输出的线性组合
这种因子分解大大减少了计算和模型大小,因为它打破了输出通道数量和内核大小之间的相互作用。根据 MobileNet 上的原始论文,MobileNet 显示计算成本减少了至少 9 倍。更详细的内容,可以参考 MobileNet 上的原创论文。
为了简单起见,我们在 keras 中使用了简单的两行标准 MobileNet 模块。
在训练模式之前,我们确保使用所有 50 MM 图像来训练模型,并通过每个笔画的灰度梯度包括笔画信息的顺序。经过多次迭代,我们发现以下参数是最佳参数。
不及物动词结果
我们开始在谷歌云平台提供的特斯拉 P100 GPU 上用 50 毫米的图纸和 340 节课训练模型。经过 20 个小时的训练和 50 美元的 GCP 积分,我们最终在 Kaggle 排行榜上使用 MobileNet 获得了 0.9211 的分数,这帮助我们在 1316 支参赛队伍中获得了 268 名的排名!
在这里,您可以看到我们模型参数和结果的总体总结:
以下是我们预测的一些例子!
有趣的奖励!
如果你坚持读完并读到这一点,给你加分!作为一个有趣的治疗,我们决定也增加一点趣味,并创建了一个可以通过网络摄像头捕捉涂鸦的应用程序!该应用程序使用我们的模型进行实时预测。OpenCV 函数被用来从网络摄像头捕捉视频并提取所绘制的图像。
我们使用第一个简单的 CNN 模型作为我们的后端,因为它是我们运行过的最轻的模型。该模型在 15 个类别(如下所列)上进行训练,并实现了 87%的正确率来检测所画的涂鸦。
七。结论
最后,我们将总结一下这个曲折旅程中所采取的步骤:
- 绞尽脑汁理解涂鸦数据的独特结构,并想出如何连接谷歌云平台来运行模型
- 通过混洗 CSV 和用笔画信息扩充图像等执行数据清理和预处理
- 在我们的本地系统上的三个简单分类器上运行五个类的缩减数据集
- 实施深度学习模型,从简单的 CNN 到 ResNets 和 MobileNets
- 向比赛提交了成果,给了我们自己一个大大的鼓励,并通过创建一个应用程序来庆祝项目的结束!
以下是在训练深度学习网络时学到的一些经验:
- 获得该算法的一个基本实现,首先在一个较小的数据集上测试它,以节省执行时间
- 探索所有可用的 GPU 选项,并根据任务所需的计算强度在它们之间进行交替
- 随着时代的增加而降低学习率。我们有一个名为 ReduceLRonplateau 的内置函数来执行这个操作。这影响了模型在平台期的学习
总的来说,这个项目非常值得!作为研究生,我们抓住了这两个机会(希望如此!)打动我们的教授,参加有声望的比赛。我们能够第一次通过处理图像分类来挑战自己,并且得出了非常令人满意的结果。
参考
这些工作没有一项是我们自己能够完成的。查看以下参考资料,获取我们使用的所有重要资源:
https://cloud . Google . com/blog/products/GCP/drawings-in-the-cloud-introducing-the-quick-draw-dataset
https://ai . Google blog . com/2017/04/teaching-machines-to-draw . html
https://www.kaggle.com/c/quickdraw-doodle-recognition
https://www . blog . Google/technology/ai/quick-draw-10 亿次绘图-环游世界/
q = https://stats . stack exchange . com/questions/148139/rules-for-selecting-convolutionary-neural-network-hyperparameters&sa = D&ust = 1544740608219000&usg = afqjcngwjl 5 gpzwwpkmpfclt 6 qinwqnha
http://ruder.io/optimizing-gradient-descent/index.html#adam
http://cs231n.stanford.edu/reports/2016/pdfs/264_Report.pdf
多巴胺:改善强化学习和…机器的快感?
原文:https://towardsdatascience.com/dopamine-improved-reinforcement-learning-and-pleasure-for-machines-9278ef84d78b?source=collection_archive---------6-----------------------
好消息:2018 年 8 月 27 日,谷歌通过他们的人工智能博客宣布,他们发布了一个新的框架,名为多巴胺,用于“灵活和可重复的强化学习研究”。
还没从喜悦中跳出来吗?别担心,我们会经历这意味着什么,这意味着什么,希望我们都会有这样的反应。
强化学习
在我们进一步深入之前,这里有一个快速回顾,让每个人都达到相同的理解水平。机器学习(Machine Learning)是人工智能的一个分支,从数据中学习机器,主要可以分为三个部分,前两个部分是:
- 监督学习,向机器提供输入数据和预期输出。因此,机器在每次输出时都会收到反馈,并可以使用该反馈来相应地重新调整(学习)。
- 无监督学习,机器仅被提供输入数据,并自行找出任何隐藏的模式。
现在,第三个是炒作最多的地方。听说过某个 AI 打败了世界上最好的围棋手的新闻吗?或者,最近,一队 DOTA 2 玩家输给了五个训练来玩同一游戏的人工智能机器人?对于所有这些耸人听闻的说法,要感谢强化学习(也许还有媒体)。
在强化学习中,机器,更具体地说,称为代理,查看其环境的状态(这称为观察)并选择做一个动作。如果行动是好的,它会得到奖励。否则,它会受到处罚。代理被设计成能找到产生最多回报的方式。以一个游戏为例,当它赢的时候代理人收到最多的奖励。简单来说,这就是强化学习的工作原理。
A graphical representation of Reinforcement Learning (sourced from: https://en.wikipedia.org/wiki/Reinforcement_learning#/media/File:Reinforcement_learning_diagram.svg)
多巴胺
让我们回到刚刚发生的事情:谷歌发布了一个名为 Dopamine 的开源框架,用于“强化学习算法的快速原型化”,在框架的 Github 知识库中提到了这一点。顺便说一句,“多巴胺”这个名字非常合适。原因?做好准备,快速一瞥神经科学!
从神经科学的角度来看,多巴胺是大脑中的化学信使,其目的是调节器官的奖赏和愉悦中心。当你完成清单上的一项任务时,或者当你因为查看社交媒体时收到的几条通知而感到高兴时,这就是给你这种小小的感觉良好的因素(是的,它们实际上是为了让你通过多巴胺分泌感觉良好,因为代表社交反馈的通知让你兴奋,从而导致某种成瘾。如果你想要更详细的解释,这里有一篇文章。
我把最好的例子作为最后一个:多巴胺是让任何有性繁殖器官在高潮时感觉良好的物质。从种群水平来看,一个物种的目标是不断地将基因传递给下一代,从而确保其生存。当一个有机体交配时,它完成了它的一个基本任务,它的大脑以强烈的快感奖励它,作为继续传递基因的激励。令人着迷的是,我们的身体是如何想出办法让我们做到这一点的:这是做一个好男孩并传递你的基因的一个巨大奖励,现在感受一些快乐吧!
是啊,有趣的东西,但这与人工智能和机器学习有什么关系?嗯,还记得我们的大脑如何释放奖励让我们感觉良好,以鼓励我们去做事情吗?嗯,既然人工智能是要创造更接近人类的算法,那么强化学习就是利用大脑的这种奖励机制作为灵感,鼓励机器通过……嗯……感觉良好来学习。好吧,你不会让机器到处呻吟(我绝对不希望它们在任何时候呻吟!想象一下,你笨拙地坐在办公室里,甚至更糟,坐在图书馆里,而你的笔记本电脑却觉得学习太难了!).对于一台机器来说,“感觉良好”意味着积累奖励积分。
回到正题,谷歌的多巴胺现在是一个开源框架,它有以下理念,正如该框架的 Github 库中所述:
轻松实验:让新用户能够轻松运行基准实验。
灵活的开发:让新用户很容易尝试研究想法。
紧凑而可靠:为一些久经考验的算法提供实现。
可再现性:促进结果的再现性。
这将如何发展
记住谷歌开源这个框架的目标,可以预期更多的开发者和爱好者会尝试强化学习。再加上云计算和边缘计算等选项(见我的帖子关于边缘计算的最新进展),训练和评估这些机器学习模型变得更加容易。因此,强化学习领域将会比现在发展得更快。
引用路易·科佩在他的文章中的话:
机器的行为与人类有所不同,虽然进行了违反直觉的优化,但最终会得到更“优化”的结果。随着越来越多的智能系统集成到我们的日常环境中,我们可能会在未来看到越来越多的这种情况。理解我们对这些决定的判断是如何演变的将会很有趣。
这意味着,通过强化学习,机器可以通过概率数学来学习我们人类因生存本能而不敢做的事情。下面举个例子:想象一下一辆车即将发生事故的场景。如果在那一刻,加速实际上会大大降低汽车碰撞的概率呢?普通人会有勇气猛踩油门而不是刹车吗?除非受到肾上腺素的巨大刺激,否则可能不会,因为我们人类认为越慢越安全。但是机器不会感到害怕,一辆经过优化以将事故数量降至最低的自动驾驶汽车肯定会跑得更快,并拯救所有乘客。
当 AlphaZero 算法教会自己下棋时,这种奇怪(但最终是聪明)的决定被证明是非常有用的,这甚至促使著名作家兼哲学家 Yuval Noah Harari 发表评论:
由于 AlphaZero 没有从任何人身上学到任何东西,它的许多制胜之道和策略在人眼看来似乎都非常规。他们可以说是创造性的,如果不是彻头彻尾的天才。
Sourced from: https://fossbytes.com/googles-alphazero-ai-chess-program/
双 Q 学习,最简单的方法
原文:https://towardsdatascience.com/double-q-learning-the-easy-way-a924c4085ec3?source=collection_archive---------6-----------------------
理解双 Q 学习的介绍
更新:学习和练习强化学习的最好方式是去 http://rl-lab.com
Q-learning (Watkins,1989)被认为是 TD 控制强化学习算法的突破之一。
然而,在他的论文双 Q 学习中,哈多·范·哈瑟尔特解释了 Q 学习在一些随机环境中表现不佳的原因。他指出,性能不佳是由于在 Q-learning 中使用 Max Q(s ',a)而导致的动作值被大大高估。
为了解决这个问题,他提出了双 Q 学习法。
问题是
考虑一个有四个状态的 MDP,其中两个是终态。
状态 A 总是被认为是开始状态,并且有两个动作,或者右或者左。右边的动作给出零奖励,并到达终端状态 c。
左边的动作将代理移动到状态 B,奖励为零。
状态 B 有许多动作,它们将代理移动到终端状态 D。但是(这很重要)从 B 到 D 的每个动作的奖励 R 有一个随机值,该值遵循均值为-0.5、方差为 1.0 的正态分布。
已知 R 的期望值为负(-0.5)。这意味着在大量的实验中,R 的平均值小于零。
基于这个假设,很明显,从 A 向左移动总是一个坏主意。然而,因为 R 的一些值是正的,Q-Learning 会被欺骗,认为从 A 向左移动会使回报最大化。事实上,这是一个糟糕的决定,因为即使它对某些情节有效,但从长远来看,它肯定是一个负面的回报。
那么为什么 Q-Learning 会高估呢?
为了回答这个问题,我们考虑以下场景:
设 X1 和 X2 是两个随机变量,它们代表状态 b 下两个行为的回报。由于它们是随机变量,我们将计算它们的期望值 E(X1)和 E(X2)。但有一个问题,我们不知道他们的期望值,所以我们能做的是通过计算增量平均𝝁1 和𝝁2.来使用这些期望值的估计值这些估计值是无偏的,因为随着样本数量的增加,整组值的平均值越来越接近 E(X1)和 E(X2),如下表所示。
然而,Q-Learning 使用 Max Q(s ',a),在表中由 Max(𝝁).表示从表中可以清楚地看出(见红色单元格),E(Max(𝝁)不同于 Max E(X)。这说明 Max(𝝁)不是 Max E(X)的一个好的估计量。是有失偏颇!
换句话说,当用最大 Q(s’,a)更新 Q(s,a)时,Q(s,a)没有向状态 B 的动作的期望值移动,即-0.5。
这个场景直观地解释了为什么 Q-Learning 高估了这些值。正式的数学证明可以在论文中找到。
解决方案
所提出的解决方案是维护两个 Q 值函数 QA 和 QB,其中一个从另一个获得下一个状态的更新。更新包括找到在下一个状态中使 QA 最大化的动作 a(Q(s ',a) = Max Q(s ',a)),然后使用 a获得 QB(s ',a)的值,以便更新 QA(s,a)。
下面的伪代码显示了算法的行为。请注意,本文末尾有一段 python 代码,对这两种方法进行了比较。
算法的第 3 行显示了如何从两个 Q 值函数中选择动作。例如,可以合并两个 Q(平均每个动作的值),然后应用ε-greedy。
该算法以等概率的方式更新 QA 和 QB。
Algorithm taken from Double Q-learning by Hado van Hasselt
下面的图表显示了当状态 B 的动作数量连续为 10 和 100 时,双 Q 学习和 Q 学习之间的比较。
很明显,双 Q 学习比 Q 学习收敛得更快。
注意,当 B 点的动作数量增加时,Q-learning 比双 Q-Learning 需要更多的训练。
为什么有效?
范·哈瑟尔特在他的论文中证明了 E(Q2(s ',a)≤马克斯·Q1(s ',a)。
所以经过足够多的实验,Q2(s ',a)的期望值小于或等于最大 Q1(s ',a),这意味着 Q1(s,a)没有用最大值更新。
下表显示了随着发作次数的增加,状态 A 下左侧动作的 Q 值的演变。
请注意,在 Q-Learning 中,Q(A,Left)是正的,因为它受到状态 b 中存在的正奖励的影响。由于这个正值,算法对采取左边的动作更感兴趣,希望最大化奖励。正如你所看到的,直到第 50 集,左手动作的比例一直在增加。
在双 Q-Learning 中,Q1(左一)和 Q2(左一)开始时略显消极。
因此,左侧动作的百分比很早就开始下降,从而节省了训练时间。
结论
本文表明双 Q 学习有时可能低估动作值,但避免了 Q 学习高估偏差的缺陷。它还表明,对于这种类型的问题,双 Q 学习更快地达到良好的性能水平。
Python 代码
以下 Python 代码模拟了双 Q 学习和 Q 学习,并输出了这两种方法的表格和对比图。
相关文章
- TD 在强化学习中,最简单的方法
- Q vs V 在强化学习中,最简单的方法
- 数学背后的强化学习,最简单的方法
- 蒙特卡洛强化学习中最简单的方法
- 动态编程中的强化学习,简单易行的方法
下载带有脚本的城市景观数据集
原文:https://towardsdatascience.com/download-city-scapes-dataset-with-script-3061f87b20d7?source=collection_archive---------14-----------------------
City Scapes 数据集是一个非常流行的数据集,由带标签的街道图像(来自视频序列)组成。高质量标注帧 5000 个,弱标注帧 20000 个。这个数据集的网站是www.cityscapes-dataset.com
当我使用这个数据集时,我很快意识到数据集只能在登录后从网站下载。所以,没有直接下载链接。这意味着当你需要将深度学习模型部署到云机器或另一台 linux 机器时,你需要从另一个来源获得数据:Dropbox 等。有些数据文件非常大:44GB、11GB、6.6GB!!!。这个问题的解决方案是不用浏览器登录和下载数据。
首先,您需要在网页中创建一个帐户。您将在脚本的第一行使用您的用户名和密码登录到该页面。
下面是两行脚本:
wget --keep-session-cookies --save-cookies=cookies.txt --post-data 'username=myusername&password=mypassword&submit=Login' [https://www.cityscapes-dataset.com/login/](https://www.cityscapes-dataset.com/login/)wget --load-cookies cookies.txt --content-disposition [https://www.cityscapes-dataset.com/file-handling/?packageID=1](https://www.cityscapes-dataset.com/file-handling/?packageID=1)
在第一行,输入你的用户名和密码。这将使用您的凭据登录,并保留关联的 cookies。
在第二行中,您需要提供 packageID 参数,它将下载文件。
网站中的 packageIDs 映射如下:
1-> gt fine _ trainvaltest . zip(241 MB)
2->gt coarse . zip(1.3 GB)
3->left mg 8 bit _ trainvaltest . zip(11GB)
4->left mg 8 bit _ train extra . zip(44GB)
8->camera _ trainvaltest . zip(2MB)
9->camera _ train extra . zip(8MB)【中
下载页面的屏幕截图:
你可以在这里看到这个脚本的 GitHub 库。
用 Python 中的管道进行 dplyr 风格的数据操作
原文:https://towardsdatascience.com/dplyr-style-data-manipulation-with-pipes-in-python-380dcb137000?source=collection_archive---------1-----------------------
我经常使用 R 的dplyr
包进行探索性的数据分析和数据操作。除了提供一组一致的函数来解决最常见的数据操作问题,dplyr 还允许使用管道编写优雅的、可链接的数据操作代码。
现在,Python 是我的主要语言,而pandas
是我用于数据分析的瑞士军刀,然而我常常希望有一个 Python 包,允许直接在熊猫数据帧上进行 dplyr 风格的数据操作。我上网搜了一下,找到了一个叫dfply
的包,是由 基弗·卡托维奇 开发的。和 dplyr 一样,dfply 也允许用管道操作符链接多个操作。
这篇文章将关注 dfply 包的核心函数,并展示如何使用它们来操作 pandas 数据帧。完整的源代码和数据集可在 Github 上获得。
入门指南
我们需要做的第一件事是使用pip
安装包。
pip install dfply
根据该项目的 Github repo,dfply 只适用于 Python 3,因此请确保您安装了正确版本的 Python。
数据
为了探索 dfply 的功能,我们将使用dplyr简介中使用的相同数据。数据来自于交通统计局,包含了 2013 年所有从纽约市出发的 336776 次航班的信息。
from dfply import *
import pandas as pd
flight_data = pd.read_csv('nycflights13.csv')
flight_data.head()
平静的
假设您想在输出最终结果之前对数据集执行n
离散变换操作。最常见的方法是逐步执行操作,并将每一步的结果存储在一个变量中。保存中间结果的变量将用于转换管道的下一步。让我们看一个抽象的例子。
# 'original_data' could be a pandas DataFrame.
result_1 = transformation_1(original_data, *args, **kwargs)
result_2 = transformation_2(result_1, *args, **kwargs)
result_3 = transformation_3(result_2, *args, **kwargs)
.
.
.
final_result = transformation_n(result_n-1, *args, **kwargs)
这不是非常优雅的代码,写起来可能会令人困惑和混乱。这就是管道救援的地方。管道允许我们重写上面的代码,而不需要那些中间变量。
final_result = original_data -->
transformation_1(*args, **kwargs) -->
transformation_2(*args, **kwargs) -->
transformation_3(*args, **kwargs) -->
.
.
.
transformation_n(*args, **kwargs)
魔法?!不,不是的。管道的工作原理是隐式地将一个阶段的输出作为下一个阶段的输入。换句话说,每个变换步骤都处理前一个步骤的变换结果。
带供给的管道
dfply 允许在 pandas 数据帧上用>>
操作符链接多个操作。可以将操作链接起来,并将最终输出(一个 pandas 数据帧,因为 dfply 直接在数据帧上工作)赋给一个变量。在 dfply 中,一个操作链的每一步的 DataFrame 结果都用X
来表示。
例如,如果您想在一个步骤中从数据帧中选择三列,在下一个步骤中删除第三列,然后显示最终数据帧的前三行,您可以这样做:
# 'data' is the original pandas DataFrame
(data >>
select(X.first_col, X.second_col, X.third_col) >>
drop(X.third_col) >>
head(3))
select
和drop
都是 dfply 变换函数,而X
代表每个变换步骤的结果。
探索 dfply 的一些转换方法
dfply
提供了一组用于选择和删除列、子集化和过滤行、数据分组和数据整形的函数。
用select()
和drop()
选择并放下列
有时,您会处理包含许多列的数据集,但只有一部分列是感兴趣的;select()
允许您选择这些列。
例如,要选择我们之前加载的flight_data
数据帧中的origin
、dest
和hour
列,我们需要:
(flight_data >>
select(X.origin, X.dest, X.hour))
drop()
是select()
的逆。它返回除作为参数传入的列之外的所有列。
例如,获取除year
、month
和day
列之外的所有列:
(flight_data >>
drop(X.year, X.month, X.day))
您也可以通过在您想要删除的列前面放一个波浪号~
来删除select()
方法中的列。
例如,选择flight_data
数据框中除hour
和minute
列之外的所有列:
(flight_data >>
select(~X.hour, ~X.minute))
用mask()
过滤行
mask()
允许您根据逻辑标准选择 pandas 数据框架中行的子集。mask()
选择条件为真的所有行。
例如,选择 1 月 1 日从 JFK 机场始发的所有超过 10 小时的航班:
(flight_data >>
mask(X.month == 1, X.day == 1, X.origin == 'JFK', X.hour > 10))
使用arrange()
对行进行排序
arrange()
允许您根据一列或多列对行进行排序;默认行为是按升序对行进行排序。
例如,先按distance
排序,然后按航班的数量hours
排序,我们这样做:
(flight_data >>
arrange(X.distance, X.hour))
要按降序排序,可以将arrange()
的ascending
关键字参数设置为False
,如下所示:
(flight_data >>
arrange(X.distance, X.hour, ascending=False))
用mutate()
添加新列
mutate()
允许您在数据框中创建新列。新列可以由现有列组成。
例如,让我们创建两个新列:一个是将distance
列除以1000
,另一个是连接carrier
和origin
列。我们将这些新列分别命名为new_distance
和carrier_origin
。
(flight_data >>
mutate(
new_distance = X.distance / 1000,
carrier_origin = X.carrier + X.origin
))
新创建的列将位于数据帧的末尾。
使用group_by()
和ungroup()
对数据进行分组和取消分组
group_by()
允许您按一列或多列对数据帧进行分组。在group_by()
之后链接的功能应用于该组,直到数据框被ungroup()
功能取消分组。例如,要按始发机场对数据进行分组,我们需要:
(flight_data >>
group_by(X.origin))
使用summarize()
总结数据
summarize()
通常与group_by()
一起使用,将每个组缩减为单行摘要。换句话说,每个组在输出中都有一行。例如,要计算从每个机场始发的航班的平均距离,我们需要:
(flight_data >>
group_by(X.origin) >>
summarize(mean_distance = X.distance.mean())
)
用管道把它们聚集在一起
假设您想要对航班数据执行以下操作
- [第一步]:过滤掉所有不到 10 小时的航班
- [步骤 2]:使用公式[距离/(飞行时间 60)]创建一个新列 T25*
- [步骤 3]:计算从每个机场始发的航班的平均速度
- [步骤 4]:按平均速度降序排列结果
我们将使用dfply
管道操作员>>
编写操作。我们不必使用中间变量来保存每一步的结果。
(flight_data >>
mask(X.hour > 10) >> # step 1
mutate(speed = X.distance / (X.air_time * 60)) >> # step 2
group_by(X.origin) >> # step 3a
summarize(mean_speed = X.speed.mean()) >> # step 3b
arrange(X.mean_speed, ascending=False) # step 4
)
如果我们使用pandas
数据操作函数,而不是dfply
的,我们的代码看起来会像这样:
flight_data.loc[flight_data['hour'] > 10, 'speed'] = flight_data['distance'] / (flight_data['air_time'] * 60)
result = flight_data.groupby('origin', as_index=False)['speed'].mean()
result.sort_values('speed', ascending=False)
我发现dfply
版本比pandas
版本更容易阅读和理解。
结论
这绝不是对dfply
包功能的详尽介绍。 包文档 真的很好,我建议你去看看了解更多。
如果你有建议或问题,请在下面的评论区留言。也可以发邮件到 hello [at] allenkunle [dot] me 或者 tweet at me@ allenakinkulle我会尽快回复。
这篇博文的完整源代码可以在 Github 上找到。感谢您的阅读,请不要忘记分享。
本帖原载于 2018 年 1 月 3 日 艾伦·阿肯昆勒的个人博客 。
德雷克——用自然语言处理来理解他的歌词
原文:https://towardsdatascience.com/drake-using-natural-language-processing-to-understand-his-lyrics-49e54ace3662?source=collection_archive---------1-----------------------
简介 :
每隔几年,就会有一位艺术家席卷全球。在过去,这是甲壳虫乐队和迈克尔·杰克逊等人的作品。这些艺术家天生就有能力用他们的创作天才影响数百万人。似乎当我们开始 21 世纪的第二个十年时,许多艺术家都在争当第一。然而,也许出乎意料的是,一个名叫奥布里·格雷厄姆的多伦多人以艺名“德雷克”登上了顶峰。
德雷克最初成名是因为他在 21 世纪初的流行青少年情景喜剧《德格拉斯:下一代》中扮演的角色。然而,当德雷克想成为一名说唱歌手时,他离开了节目。李尔·韦恩是当时最有影响力的说唱歌手之一,他把这位土生土长的多伦多人作为自己的门生。在与韦恩的唱片公司 Young Money Entertainment 签约后,德雷克发行了他的第一张录音室专辑《T4》。它被认证为白金唱片,加速了德雷克迅速上升到嘻哈世界的顶峰。在接下来的八年里,他又推出了四张录音室专辑、一张混音带和一张播放列表,其中《蝎子》是他的最新专辑。
我们知道德雷克的作品很受欢迎,但为什么他的大多数歌曲如此受欢迎呢?是制作的原因吗?是市场营销吗?大概是多种因素综合作用。然而,我将关注的是他的歌词。德雷克的工作内容广泛,证据充分,因此获取文本数据并不是一项困难的任务。然而,弄清楚如何分析它。但是由于 NLP(自然语言处理)最近的改进,分析文本数据现在比以往任何时候都容易。
根据维基百科,自然语言处理(NLP)“是计算机科学和人工智能的一个领域,涉及计算机和人类(自然)语言之间的交互,特别是如何编写计算机程序来处理和分析大量自然语言数据。”NLP 是我认为机器学习最有趣的领域。文本以如此多的不同形式产生,它给我们提供了如此多的数据。
在过去的 5-10 年里,NLP 得到了快速发展,这与深度学习的兴起直接吻合。神经网络已经成为无数 NLP 算法的通用框架。今天,有多种多样的工具可供使用,因此从业者可以解决大量的 NLP 问题。这些工具让我得以研究德雷克的歌词。
寻找歌词来源:
在开始实际分析之前,我必须先拿到德雷克的歌词。虽然网上有几个歌词资源,但我还是决定用 Genius.com。对于那些不知道的人来说,Genius 是一个注释歌词的网站。Genius 有一个非常好用的 API 。
第一部分
哪首公鸭歌的歌词最独特?
德雷克经常受到批评的一点是他的创造力——或者说缺乏创造力。在过去,他曾被指控窃取其他说唱歌手的音乐流和雇佣代笔人。我开始观察他的批评者的抱怨是否有根据。
每首歌使用一些独特的词的灵感来自于这篇漂亮的文章,它可视化了说唱中最大的词汇。在我看来,由于当今艺术家的重复性,总字数不是衡量创造力的标准。
一旦我清理完文本数据,我就开始分析每首歌中独特的歌词数量。下面是德雷克所有歌曲中独特歌词的分布直方图。似乎他的大多数歌曲都有 100 到 200 个独特的词。没有参考其他艺术家歌曲的分布,这个直方图并没有告诉我多少关于德雷克的创造力。
更好的方法是通过专辑来了解他的创造力。下图中的情节是在 Tableau 中创作的。x 轴上是作品名称。y 轴代表唯一单词的数量。每个泡泡代表一首歌。没有一张专辑看起来更有创意(就独特的歌词而言)。不过,从独特歌词的数量来看(减去蝎子),似乎每首作品都至少有一个离群值。看到他最新发行的专辑《蝎子》(25 首歌曲)中的歌曲在独特的歌词数量上几乎没有变化,这有点令人着迷。
现在,回答这个问题,哪首歌的歌词最独特?答案似乎是纽约时间下午 6 点。其余的前 10 名在下面。
第二部分
命名实体识别
命名实体识别是“信息提取的一个子任务,它试图定位文本中的命名实体并将其分类成预定义的类别,例如人名、组织、位置、时间表达式、数量、货币值、百分比等。”(维基百科)。NER 是一项特别棘手的任务。英语的复杂性使得创建对所有文本源都准确的 NER 算法非常困难。一个算法可能在一个文本语料库(在我们的例子中是德雷克歌曲集)上表现很好,而在另一个语料库上表现很差。这种不一致性使得有必要尝试几种 NER 算法。正如你将看到的,算法不是很不准确。
我实现的第一个是由 NLTK 提供的命名实体算法。“Ne_chunk”使用分配了词性标签(词性标签)的单词列表来推断哪些单词是命名实体。从我找到的结果可以看出,NLTK 的算法本身并没有做得很好。
我尝试的第二个命名实体算法是斯坦福大学开发的。斯坦福大学的计算语言学系可以说是世界上最负盛名的。这个受人尊敬的部门开发的众多令人印象深刻的工具之一是他们的 NER 工具。
与 NLTK 的算法相比,这个工具需要更长的时间来运行,但是它也产生更精确的结果。虽然它并不完美,但这是一个巨大的进步。
第三部分
主题建模:
NLP 中最有趣的学科之一是主题建模。主题模型是一种用于发现出现在文档集合中的抽象“主题”的统计模型。主题建模是一种常用的文本挖掘工具,用于发现文本主体中隐藏的语义结构(来源)主题建模有几种比较突出的算法。其中最突出的是显式语义分析和非负矩阵分解。然而,出于本文的目的,我选择使用的是潜在的狄利克雷分配( LDA )。LDA 是由吴恩达、迈克尔·乔丹和大卫·布雷提出的一种生成统计模型。基本上,它首先学习给定语料库中固定数量主题的表示。给定这个数量的主题,LDA 学习语料库中每个文档的主题分布。
话题建模所有公鸭歌词
我想用 LDA 做的第一件事是学习德雷克所有歌曲中最突出的主题。为了做到这一点,我将所有歌曲放入一个列表中。然后,使用 SciKitLearn 的计数矢量器,我创建了一个代表所有这些歌曲的单词包。单词包是通过矩阵表示(链接)来表示单词的一种简单方式。然后,使用 SciKit learn 的 LDA 版本,我拟合了一个模型,目标是在给定的文本中找到 8 个主题。
可视化主题
我发现了两种可行的方法来可视化 LDA 模型。第一个是通过我写的函数。基本上,它输出每个主题中最突出的单词。
这里的结果很有趣,但只给我提供了适量的信息。很明显,主题 7 不同于主题 2,但是没有提供足够的信息来告诉我它们有多么不同。
LDA Topics
辅助主题没有提供足够的信息来区分彼此。出于这个原因,我制定了另一种方法来显示文本中的主题。
在 Python 内部,有一个很棒的库叫做 pyLDAvis 。这是一个专门的库,使用 D3 来帮助可视化 LDA 模型创建的主题。 D3 可以说是最好的可视化工具。但是,它是针对 Javascript 用户的。对于不太了解 JavaScript 的人来说,拥有这个插件非常有用。为了可视化数据,该库使用了降维技术。维数约减将具有许多变量的数据集压缩成更少量的特征。降维技术对于可视化数据非常有用,因为它可以将数据压缩成两个特征。对于我的特定可视化,我决定最好使用T-SNE(T-分布式随机邻居嵌入)进行降维。
Visualizing Topics
似乎从我的模型的拟合来看,德雷克的大部分歌词都可以归类到一个占据了大部分图表的巨大主题中。相比之下,其余的话题就显得微不足道了。
Drake 所有主要版本的主题是什么样的?
为了做到这一点,我遵循了与之前相同的步骤,除了运行 LDA 算法为每张专辑精确地找到一个主题。然后,我使用我之前定义的函数来显示他所有主要作品中最突出的词。
Most Prominent Words in all Drake’s Major Works
结论:
德雷克可以说是世界上最受欢迎的艺术家。当他决定退休时,他将成为有史以来最有成就的说唱歌手之一。因此,每当他发布一首新歌或一张专辑,就一定会引起一片热烈的反响。他的作品几乎总是登上流行排行榜的榜首。结果,他的歌词瞬间成为 Instagram 和脸书数周的主要标题。他的歌曲令人难忘,他的歌词是主要原因。
就我的第一个 NLP 项目而言,我认为这是成功的。我觉得通过这里的工作,我对德雷克的歌词有了更具体的理解。虽然在未来的工作中,我当然可以尝试许多其他的 NLP 任务,但是主题建模和命名实体识别是一个很好的起点。
感谢你阅读这篇文章!如果您对未来的工作有任何建议或对我的工作有任何批评,请随时评论或联系我。
注意事项 :我把歌词里的脏话去掉了,让这篇文章更亲民。
提前下结论
原文:https://towardsdatascience.com/draw-conclusions-early-with-incvisage-45c608634ca0?source=collection_archive---------3-----------------------
可视化增量生成的新范式
这篇博客文章是对我们 VLDB 17 年论文的高度概括,标题为“我已经看够了:为快速决策而逐渐改进可视化”,github 上有 代码。本文延伸版此处 。主要由 Sajjadur Rahman 撰写,我做了一些小的编辑;合著者包括 Maryam Aliakbarpour、Hidy Kong、Eric Blais、Karrie Karahalios 和 Ronitt Rubinfeld。
越来越大的数据集上的数据可视化仍然很麻烦:当数据集很大时,生成可视化可能需要几个小时,这阻碍了交互,阻止了探索,并延迟了洞察力的提取。
更快生成可视化效果的一种方法是使用采样——我们可以显示随着时间的推移逐渐改进的可视化效果,并最终收敛到对整个数据计算的可视化效果。然而,这种中间可视化是近似的,并且经常剧烈波动,导致不正确的结论。 我们提出了基于采样的增量可视化算法,可以快速揭示“显著”特征,同时最大限度地减少错误,实现快速、无错误的决策。
示例:在下面图 1 的第一行中,我们描述了当获取更多样本时当前采样算法的变化:在t1、T2、T4、T7以及当所有数据都已被采样时。这可能就是可视化标准采样算法的结果所能提供的。如果用户在任何中间时间点看到可视化,他们可能会做出错误的决定。例如,在时间 t_1 时,用户可能会得出错误的结论,即开始和结束时的值低于大多数趋势,而事实上,情况正好相反——这种异常是由于到达 t_1 时抽取的样本有偏差。在 t_2 、 t_4 和 t_7 处,可视化继续变化,数值根据抽取的样本随机波动。
Figure 1: Example
另一种方法,我们称之为 IncVisage ,并在第二行中描述如下:在每个时间点 t_i ,通过在 t_{i-1} 分割趋势线的一个线段,显示一个 i 线段趋势线的附加线段,此时工具有足够的信心这样做。因此,IncVisage 在 t_1 处非常保守,仅提供整个范围的平均值,然后在 t_2 处,它将单个段分成两个段,表明趋势向末端增加。总的来说,在 t_7 之前,该工具已经表明了趋势的许多重要特征:它从高点开始,中间有一个凸起,然后向终点增加。这种方法按照重要性的顺序揭示了最终可视化的特征,允许用户获得早期的洞察力并尽早得出结论。所提出的方法也可以应用于热图可视化——如第 4 行所示,对应于第 3 行所示的标准采样方法——在热图中很典型,值越高,颜色越深。
增量改进可视化:增量方法
我们如何着手产生这些增量呢?考虑预先知道所有组的集合(x 轴值)时的设置。因此,我们不需要执行采样,并且问题简化为仅在每次迭代 k 时寻找最佳 k 段近似。在每一次迭代中,我们最终将前一次迭代中的一个片段分割成两个新的片段。
Figure 2: Improvement Potential
现在,我们如何决定在哪里分裂?让我们看一个例子(见图 2)。给定段 S ,有许多分裂的候选——我们只显示了三个。但是我们选哪一个呢?嗯,在这种情况下,底部的候选项给了我们最大的“跳跃”——直觉上,我们希望选取一个足够大的段来分割,并且值之间的差异也很大。这种分割的想法被称为改进潜力的概念所捕捉,在这个概念中,我们考虑了价值之间的差异和细分规模。(详见我们的论文。)
我们现在将我们的方法推广到在线采样,其中我们在迭代中抽取样本。事实证明,我们可以使用相同的改进潜力测量的经验版本,并且仍然可以获得最佳结果。现在,我们应该在每次迭代中抽取多少样本来获得最佳结果?有点令人惊讶的是,如果我们在每次迭代中跨 x 轴组均匀地绘制样本,我们仍然可以满足保证。我们还推导了底层算法的采样复杂度的匹配下界。此外,我们证明了通过几何地减少在迭代中抽取的样本总数,我们获得了一个高度交互的算法,对近似的精度只有很小的影响。我们在论文中详细讨论了支持这些主张的定理。
实验外卖
那么这在实践中是如何运作的呢?以下是我们实验评估的一些要点。报纸上还有很多!
增长速度极快。
我们的方法比读取整个数据集的顺序扫描方法快几个数量级。在图 3 中,我们在三个不同大小的数据集上绘制了 Scan 的执行时间和 IncVisage 的不同迭代。黑色垂直箭头突出显示了 IncVisage 和 Scan 之间的完成时间差异。从图 3 中可以明显看出,IncVisage 通过相当快地揭示重要特性(图 3 中的迭代 5、10 和 50)促进了更快的决策制定。同时,随着数据集大小的增长,顺序扫描的执行时间也会增加,而 IncVisage 的不同迭代的执行时间几乎保持不变,与数据集无关。
Figure 3: IncVisage is orders of magnitude faster than Scan
IncVisage 提供高度可解释的可视化和更好的决策。
我们进行了两项用户研究,评估 IncVisage 的可解释性和可用性。第一项研究表明,IncVisage 生成的可视化效果具有高度的可解释性。在第二项研究中,我们将 IncVisage 与标准方法进行了比较,标准方法是在取样时描述整个可视化评估,这是根据决策能力进行的。该研究表明,在准确性方面,IncVisage 优于标准方法(IncVisage = 94.55%,标准= 45.83%),而延迟相当。此外,用户认为使用 IncVisage 更容易找到答案并尽早终止。我们在此展示一些用户反应:
“…更容易知道我什么时候想停下来,因为我首先有了总体想法。然后我就等着得到确切的答案,因为我知道它就要来了……”
“……随着时间的推移,看起来真的很有趣。特别是,起初当事物是一两个颜色块时,然后看着数据出现,然后看着不同的盒子变成某种东西……我实际上发现自己看了很长时间。”
“…我更喜欢 IncVisage,因为它可以更容易地缩小范围…与标准方法相比…如果你选择了错误的方法,你可能会犯很大的错误。”
结论
我们开发了一种逐步改进的可视化生成算法,当分析师有信心时,它会向分析师揭示见解,从而允许更快、更准确地做出决策,同时还开发了一种名为 IncVisage 的工具来实现这种算法。
我们希望 IncVisage 代表了体现这些原则的可视化工具开发的有希望的第一步——帮助用户在非常大的数据集上获得早期但自信的见解。
承认
非常感谢 NSF、NIH、Siebel Energy Institute、Adobe 和 Google 对这项研究的支持。
用深度学习画动漫少女
原文:https://towardsdatascience.com/drawing-anime-girls-with-deep-learning-4fa6523eb4d4?source=collection_archive---------4-----------------------
这篇文章是关于玛丽·凯特·麦克弗森的一个兼职项目。我们喜欢做一些辅助项目,比如音乐视频的人工智能,以及派对按钮。这个想法是尝试一种对抗性神经网络,它在对一组人类创造的动漫面孔进行训练后生成新的动漫面孔。我们从一个网上的例子开始。该作品和动画人脸数据集的原始代码可以在这里找到。
Running training on the original code from here.
正如你在上面的图像中看到的,生成敌对网络(GAN)随着时间的推移在生成逼真的图像方面不断改进。GAN 包含一个生成新图像的发生器和一个为发生器提供建设性反馈的鉴别器。生成器和鉴别器都是卷积神经网络(CNN)。
以下是训练数据的示例:
下图是最终输出的一个很好的例子。
Anime faces generated entirely using artificial intelligence.
在上面的图像中,你可以看到右下角的角色头上有一个弓,眼睛和嘴巴通常在脸上的正确位置。正如我们在第一行左起第二行看到的,一些生成的输出有点混乱。图像总体上看起来不错,尽管它们不是很大(3 个颜色通道的 64 乘 64 像素)。
这是一个很酷的结果,但是 CNN 有一些已知的限制。例如,Capsnets 比 CNN 更能理解图片中事物的位置(见下图)。
CNNs do not mind “seeing” faces when everything is in the picture, but in weird places (source here and further reading here). This is a problem capsule networks aim to address.
现在,作为一个超常发挥者, Mary Kate MacPherson 决定使用带有胶囊网络的 g an 代替 CNN 来尝试这项任务。数据集已从原始代码库转移到 capsule 网络代码库。胶囊网码来自这里的,来自胶囊网码的生成器被来自动漫项目的生成器所取代,从而做出动漫少女而不是手写数字。
Running training on the new neural architecture with capsule network.
Final output of the capsule network GAN. Some are really good. Others, like the second from left on the first and last rows, don’t have the right face parts.
我们没有看到使用胶囊网络代替 CNN 作为鉴别器有很大的改进。也许生成和区分图像的统计特征会给我们带来更好的结果(想法来自 nVidia 研究论文此处)。我们正在努力。我们向生成器的预测添加了一个维度,它生成生成图像的梯度方向直方图(HOG) 。HOG 用于帮助检测物体,因此它看起来很适合我们希望能够教会生成器神经网络更好地预测真实人脸的东西。我们也在考虑清理数据集。玛丽·凯特·麦克弗森会在我们有好结果的时候,在推特 上的一个 专用推特频道上发布这次冒险的结果。如果你有自己的发电机,我们也很乐意公布你的结果。到目前为止,这种新方法看起来并不是非常有前途,但这就是这些副业项目的进展:它并不工作,直到突然开始工作。
未来工作思路二:拥有多个胶囊网络的 GANs!
因此,总之,人工智能可以用来创造艺术,以一组现有图像的风格创造新的图像。
如果你喜欢这篇关于生成动漫女孩面孔的文章,请点击关注按钮,看看我过去读过的一些文章,比如“如何为人工智能项目定价”和“如何聘请人工智能顾问”除了与业务相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习”
编码快乐!
-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI
您可能喜欢的其他文章:
- 人工智能和不良数据
- 人工智能:超参数
- 人工智能:让你的用户给你的数据贴上标签
从比例的 A/B 测试中推断:频率主义者与贝叶斯方法
原文:https://towardsdatascience.com/drawing-inferences-from-a-b-tests-on-proportions-frequentist-vs-bayesian-approach-c85590382b14?source=collection_archive---------11-----------------------
对许多数据科学家来说,从 A/B 测试中做出推论是一项不可或缺的工作。我们经常听到频率主义者(经典)的方法,在这种方法中,我们指定 alpha 和 beta 比率,看看我们是否可以拒绝零假设而支持替代假设。另一方面,随着更多的证据变得可用,贝叶斯推理使用贝叶斯定理来更新假设为真的概率。
在这篇博文中,我们将使用 R 来遵循[1]中的示例,并将其扩展为灵敏度分析,以观察调整先验对结果的影响。[1]对频率主义者和贝叶斯的优缺点有很好的讨论,我推荐阅读。我的主要收获是:
- 贝叶斯经常因主观先验而受到批评,我们将在敏感性分析部分对此进行检验
- Frequentist 因不同的实验设置具有不同的 p 值而受到批评,我们将在下一节停止规则中对此进行研究
- “…对于任何决策规则,都有一个贝叶斯决策规则,在精确的意义上,它至少与规则一样好”——对于数据科学家来说,在进行推理时获得另一种视角不会有什么坏处
案例研究背景
实验的目的是检查硬币是否有偏差,假设进行实验的人(让我们称他为研究者)与进行结果分析的人(让我们称他为分析师)不是同一个人。
研究者有两种方法可以停止实验(停止规则):
- 投掷硬币 6 次,并报告人头的数量
- 投掷硬币,直到第一个头像出现
研究者向分析师报告 HHHHHT 和他的停止规则。然而,分析师忘记了什么是止损规则。
频繁主义方法
频率主义分析师建立了一个假设:
二项分布
在停止规则(1)下,人头数服从二项式分布。更正式地说,观测头数为~ Bin(6,0.5)
# Binomial Distribution
n = 6
num_heads = c(1:n)
pmf_binom <- dbinom(k,size=n,prob=0.5)
plot(num_heads,pmf_binom,type="h", main = "Prob mass function of a Binomial distribution")
# The following two lines are equivalent
1-pbinom(q=4,size=6,prob=0.5)
pmf_binom[5]+pmf_binom[6]
概率(6 次投掷中有 5 或 6 个头)= 0.1094
因此,我们无法在 0.05 的显著性水平上拒绝零假设。
几何分布
在停止规则(2)下,直到头出现所需的翻转次数服从几何分布。
number _ failures _ until _ 1st _ head ~ Geometric(0.5)
# Geometic Distribution
num_fails = c(0:10)
pmf_geom = dgeom (x = num_fails, prob=0.5)
sum(pmf_geom)
plot(num_fails, pmf_geom, type = "h", main = "Prob mass function of a Geometric dist.")# The following two lines are equivalent
1- pgeom(q=4,prob=0.5)
1-sum(pmf_geom[1:5])
p(在第一个磁头之前至少需要 5 次故障)= 0.0313
因此,我们在 0.05 的显著性水平上拒绝零假设。注意同样的数据如何导致相反的结论。
在 Frequentist 方法下,决定随机变量分布的停止规则必须在实验前指定。
贝叶斯方法
我们想估算θ,它被定义为硬币正面朝上的真实概率。我们使用一个贝塔分布来表示共轭先验。为了不失去案例研究的重点,我们在附录中介绍了 beta 分布。
作为先验分布,我们假设先验分布在 Beta 分布(3,3)下,这表明在 0.5 左右是一个相当平坦的分布。这表明分析师认为硬币是公平的,但使用(3,3)作为他的不确定性的指示。我们将在灵敏度分析部分研究改变这两个参数的影响。现在,我们来看看:
Theta_prior ~ Beta(3,3)
在实验过程中,我们有 6 次翻转,其中一次是正面。让我们填写下表:
# Bayesian Approach
theta=seq(from=0,to=1,by=.01)
plot(theta,dbeta(theta,8,4)
,type="l"
, ylim = c(0,6)
, col = "red"
, lwd =2
, ylab = "Prob. Density Function"
, main = "Prob. Density Function")
lines(theta,dbeta(theta,3,3),type="l", col = "green", lwd =2)
lines(theta,dbeta(theta,5,1),type="l", col = "blue", lwd =2)
abline(v=0.5, col='grey')
legend("topright",
legend = c("Posterior", "Prior", "Experiment"),
col = c("red", "green", "blue"),
bty = "n",
text.col = "black",
horiz = F ,
inset = c(0.1, 0.1),
lty = 1, lwd=2)theta=seq(from=0,to=1,by=.01)
1-pbeta(0.5, 8,4)
P(theta > 0.5 | data) = 0.89,即 0.89 是红色曲线下的面积,在 0.5 的右边。在下一节中,我们将研究改变先验分布的形状对后验概率的影响。
先验分布对后验概率影响的敏感性分析
从β(3,3)改变先验分布对θ> 0.5 的后验概率有何影响?在本节中,我们将改变分布的方差和期望值,作为敏感性分析的一部分。
(1)改变方差 —当我们注入一个方差更低的更强的先验,说明硬币是公平的,后验概率从 0.89 降低到 0.84。
## Sensitivity Analysis - change the variance
par(mfrow = c(2,2))
alpha_prior = 5
beta_prior = 5
alpha_expt = 5
beta_expt = 1
alpha_post = alpha_prior + alpha_expt
beta_post = beta_prior + beta_expt
title = paste0("Prior Beta(", alpha_prior, "," , beta_prior, ")")
# Bayesian Approach
theta=seq(from=0,to=1,by=.01)
plot(theta,dbeta(theta,alpha_post,beta_post)
,type="l"
, ylim = c(0,6)
, col = "red"
, lwd =2
, ylab = "Prob. Density Function"
, main = title)
lines(theta,dbeta(theta,alpha_prior,beta_prior),type="l", col = "green", lwd =2)
lines(theta,dbeta(theta,alpha_expt,beta_expt),type="l", col = "blue", lwd =2)
abline(v=0.5, col='grey')
# Prior Mean
alpha_prior / (alpha_prior + beta_prior)
# Prior Variance
(alpha_prior * beta_prior) / ((alpha_prior + beta_prior)^2 * (alpha_prior + beta_prior+1))
# P(theta > 0.5 | data)
1-pbeta(0.5, alpha_post,beta_post)
Above: Effect of changing prior variance whilst keeping mean constant. Green: Prior; Red: Posterior; Blue: Experiment
(2)改变均值——同样,和预期的一样,如果我们注入硬币偏向尾部的先验,当实验偏向正面时,我们就不那么有信心硬币偏向正面了。
给定均值和方差,我需要计算α和β。谢天谢地,我们有这个 stackoverflow post 帮助我们做到这一点:
为简单起见,我们将α和β四舍五入为最接近的整数。因此方差可能有点不同。
par(mfrow = c(2,2))
mean = 0.7
variance = 0.036
alpha_prior = ((1-mean)/variance - 1/mean) * mean^2
beta_prior = alpha_prior * (1/mean - 1)
alpha_prior = round(alpha_prior,0)
beta_prior = round(beta_prior,0)
alpha_expt = 5
beta_expt = 1
alpha_post = alpha_prior + alpha_expt
beta_post = beta_prior + beta_expt
title = paste0("Prior Beta(", alpha_prior, "," , beta_prior, ")")
# Bayesian Approach
theta=seq(from=0,to=1,by=.01)
plot(theta,dbeta(theta,alpha_post,beta_post)
,type="l"
, ylim = c(0,6)
, col = "red"
, lwd =2
, ylab = "Prob. Density Function"
, main = title)
lines(theta,dbeta(theta,alpha_prior,beta_prior),type="l", col = "green", lwd =2)
lines(theta,dbeta(theta,alpha_expt,beta_expt),type="l", col = "blue", lwd =2)
abline(v=0.5, col='grey')
# Prior Mean
alpha_prior / (alpha_prior + beta_prior)
# Prior Variance
(alpha_prior * beta_prior) / ((alpha_prior + beta_prior)^2 * (alpha_prior + beta_prior+1))
# P(theta > 0.5 | data)
1-pbeta(0.5, alpha_post,beta_post)
Above: Effect of changing prior mean, keeping variance constant. Green: Prior; Red: Posterior; Blue: Experiment
结论
总之,我们已经证明了小样本 A/B 测试的贝叶斯观点。我们看到,在频率主义方法中,停止规则在建立 p 值时是至关重要的,而在贝叶斯方法中不考虑停止规则。给定先验和实验结果,贝叶斯方法也给出假设为真的概率。最后,我们还观察了后验概率如何受到先验分布的均值和方差的影响。
附录— Beta 分布
贝塔分布是定义在区间[0,1]上的一族连续概率分布,区间[0,1]由两个正的形状参数参数化,用α和β表示。有三个原因可以解释为什么贝塔分布对贝叶斯推断很有用:
- 区间[0,1]适合表示概率。
- 它有一个很好的性质,即后验分布也是贝塔分布。需要明确的是,先验分布是指我们在进行任何分析之前认为θ表现出的分布,而后验分布是指我们在观察一些样本后认为θ表现出的分布。
- 我们可以通过改变 a 和 b 来指定大范围的信念——给定 a 和 b,θ的概率密度函数如下:
从上面的等式中,我们看到α和 b 控制分布的形状,事实上,它们被称为形状参数。让我们把一些值代入 R,观察形状的不同。期望值由α / (α+β)计算得出。
theta=seq(from=0,to=1,by=.01)
plot(theta,dbeta(theta,0.5,0.5)
,type="l"
, ylim = c(0,3)
, col = "black"
, lwd =2
, ylab = "Prob. Density Function")
lines(theta,dbeta(theta,1,1),type="l", col = "red", lwd =2)
lines(theta,dbeta(theta,3,3),type="l", col = "blue", lwd =2)
lines(theta,dbeta(theta,5,5),type="l", col = "yellow", lwd =2)
请注意,所有四个分布的平均值都是 0.5,可以指定不同的分布。这就是我们所说的大范围的信念可以用贝塔分布来确定。
参考
[1]杰里米·奥尔洛夫和乔纳森·布鲁姆。 18.05 概率和统计导论。【2014 年春天。麻省理工学院:麻省理工学院开放课件,【https://ocw.mit.edu】T4。许可:知识共享协议 BY-NC-SA 。
最初发表于www . Joshua Kim . io。
DREAM.ac:利用人工智能建立团队
原文:https://towardsdatascience.com/dream-ac-build-teams-using-artificial-intelligence-c4f1fdd7ee66?source=collection_archive---------11-----------------------
人工智能正在被用来解决许多人类问题,最近谷歌的 Duplex 可以通过与人对话来代表你预订座位。
我们在人力资源领域有一些非常有趣的客户,这是一个以人际互动为主的领域。我们从客户那里看到的主要问题是,如何使用人工智能来进行猎头或为候选人匹配职位。今天,我想向你们介绍我们在人力资源领域的一个客户的解决方案架构,并让你们了解如何部署人工智能来自动化和改善人力资源流程。
DREAM.ac 与 A.I .一起建立团队,让更多的项目和创业公司获得成功。激励问题很简单:68%的项目失败,90%的创业公司失败。这些失败往往可以追溯到错误的团队,领导不力,或未能筹集资金。梦想是由已经在人力资源领域的自由职业者中取得成功的创始人建立的,因此这些要求是由创业行业问题的现实经验驱动的,而不是在餐巾纸上画画。
Teams have a set of roles that need to be filled in order to complete the project.
梦之队想要首先解决的问题是建立成功的团队。早在 2000 年代,我致力于将 DVD 与人们想要的 DVD 列表相匹配(见 zip.ca )。DVD 分配问题技术名称是转运问题。考虑到一张 DVD 一次只能邮寄给一个人的物理限制,这个想法是为了最大化每个人的快乐。同样,对于梦想,我们只能用一个人来完成一项工作,一个人只能做这么多工作。
DREAM.ac connects people to projects using A.I.
为了让一个人适合某个角色,我们使用回归来给候选人列表中的每个可能的人一个适合度分数,该分数代表他们将在工作中做得很好的可能性,并延伸到团队将成功实现他们的目标。个人与工作的匹配分数基于个人过去从事此类工作的历史(经验)以及该类型的人在该类型的角色中表现良好的历史。使用聚类来“发现”人员和角色的类型。候选人按前 n 名排序,这样就可以为每个职位考虑最适合该工作的人选。这个匹配系统的目标是最大化团队的成功,而不是最大化职位的完成。为了涵盖尽可能多的一般规则和例外,我们设计了一个使用广度和深度学习的解决方案。
最终的解决方案是一个推荐系统,这是我最喜欢的,因为这是我在 T2 的博士论文的主题。
一些开源数据集在实践中证明这种想法的有效性时非常有用。Kaggle 列出了以下数据集,以及其他一些数据集,供您开始使用:
- 来自凯业必达的工作推荐挑战 (2012)
- 来自职业中心的 19K 个职位 (2017)
- Dice.com 22K 工作岗位 (2017)
- Monster.com 22K 工作岗位 (2017)
- Naukri.com 22K 工作岗位 (2017)
- 里德英国的 5 万个职位 (2018)
正如我在上一篇文章中提到的那样,拥有专有数据集是获得竞争优势的关键。DREAM 不是建立在这些公共数据集的基础上,而是围绕私人会员数据进行设计,这些数据由平台用户所有,并与公司共享,以提供培训示例。该公司只拥有衍生训练系统,而不是原始数据,用户可以选择通过关闭他们的帐户拿回。
让我们看看团队是如何建立的,目标是让团队成功。
A high level view of how teams can be assembled using a recommender system, with the overall objective of maximizing the likelihood of team success.
构建成功项目的问题是一个层次问题,需要神经网络模型来理解(建模)团队和角色。我们正在继续开发一些非常酷的技术,以解决当今传统人力资源方法组装项目的方式中的这一差距。
总之,人工智能可以用来根据角色的“适合度”(得分)来确定团队中某个职位的最佳候选人。这可以在组建团队的更大过程中完成,甚至可以在开发成功项目的更大范围内完成。
要阅读更多关于 DREAM.ac 和白皮书的内容,只需点击那些链接。
如果你喜欢这篇关于使用人工智能建立团队的文章,请点击关注按钮,看看我过去读过最多的文章,比如“如何雇用人工智能顾问”除了与业务相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“没有云和 API 的机器学习”
编码快乐!
-丹尼尔
丹尼尔@lemay.ai ←打个招呼。
LEMAY . AI
1(855)LEMAY-AI
您可能喜欢的其他文章:
- 人工智能和不良数据
- 人工智能:超参数
- 人工智能:让你的用户给你的数据贴上标签
彩色梦
原文:https://towardsdatascience.com/dream-in-color-faf1ea5190e9?source=collection_archive---------3-----------------------
一个机器学习解决方案来设计你的新娘派对
介绍
婚礼行业正在蓬勃发展。2016 年美国婚礼的平均费用估计在 35329 美元左右,高于 2006 年的 27852 美元(1,2)。同样,在科技领域,与婚礼相关的产品和解决方案也有越来越多的机会。这个项目旨在创建一个这样的解决方案。
在传统的婚礼策划中,新娘会为所有的伴娘选择一件礼服。一种被称为“不匹配的伴娘”的新趋势背离了上述传统,并且越来越受欢迎。为了达到“不相配的伴娘”的效果,每个伴娘都有不同风格和/或颜色的礼服,它们都符合一个共同的主题。这种外观很难实现,在线工具也很少。在 2016 年对伴娘的一项调查中,一位受访者引述道:
“我知道让每个人都穿不同的颜色是 Pinterest 的时尚,但这对伴娘来说是一种痛苦。”
一场婚礼平均有 5 名伴娘,打造一套巧妙搭配的礼服需要大量的协调工作。大多数在线服装零售商在其网站上只提供 12-14 种颜色的选择。在这个项目中,我的目标是完成以下工作:
- 创建一个机器学习算法,可以将服装分为几个特定的颜色类别
- 将该模型应用于目前可在线购买的服装
- 让应用程序可供新娘和伴娘使用
材料和方法
我把这个项目当作一个图像分类问题。我希望能够根据在线零售商提供的图片对服装进行分类。网上出售的每件衣服都有图片,而描述或颜色名称并不总是可用,也不总是在零售商之间保持一致。最终,一切都取决于服装的外观,而这最好通过图片来评估。
数据收集
通常需要成千上万的图像来训练一个成功的图像分类算法。我使用了两个批量图像下载应用程序,通过谷歌图像搜索、谷歌购物搜索以及一些在线服装零售网站从网络上收集图像。图像质量的范围很广,从零售/专业质量到手机图片。
为了训练算法对图像进行分类,需要对图像进行标记。我选择了 64 种可能的颜色标签,并与网络开发人员 Robb Prescott 合作,建立了一个在线标签系统(color.suprinfinity.com)。标签系统如下所示。单击第一个图像中显示的颜色组之一,会显示更多特定的颜色供标签选择。
Above: Labeling page at color.suprinfinity.com
Above: Specific color labeling groups at color.suprinfinity.com
一旦图像被标记,数据就被收集到 Postgres 数据库中。其他标签(除了颜色)被收集用于项目中的潜在用途:
- “图像细节”标签帮助我从建模中排除了某些类型的图片
- 长度和织物标签未在当前项目中使用,但可能用于未来的改进/功能。
我收集了 18,630 张图片,存储在亚马逊网络服务(AWS)的 S3 存储桶中。为了给这个项目贴上足够多的标签,我通过亚马逊土耳其机器人外包了标签任务。MTurk 是一个你可以付钱给个人来完成可追踪的在线任务的系统。
虽然 MTurk 对于完成大量标签是有效的,但是标签工作的质量并不好。在使用 MTurk 之后,我花了几天时间重新标记(清理)数据集,直到它达到可以接受的建模形状。我使用了我们标签网站的“管理服装”页面,这允许我查看所有的服装及其标签,以及查看特定标签下的所有图像。下面的截图显示了前几件标有“teal5”颜色的裙子。我最终得到了超过 10,000 张的可用的带标签的图片来训练我的模型。
Above: Admin Dresses page showing ‘teal5’ label
模型构建
为了创建一个可行的产品来实现项目目标,我希望我的模型比典型的服装零售网站有更多的颜色类别。我在我所有的模型中使用了 30 到 35 种颜色。这些颜色类别由原始 64 种颜色标签的不同组合构成。
我尝试了一些建模算法,但选择专注于卷积神经网络(卷积网),因为它们对图像分类很有效。为了增加计算能力,我通过谷歌云平台计算引擎设置了一个带有一个 NVIDIA Tesla K80 GPU 的 Ubuntu 虚拟机(8 个 vCPUs,52 GB 内存),并安装了带有 Keras 的 tensorflow-gpu 进行建模。
图像预处理和数据准备
由于每个类的图像数量相对较少,我使用 Keras 预处理工具(ImageDataGenerator)来扩充图像以进行建模。下面是这个 Keras 工具如何工作的一个例子。通过拉伸、翻转和应用其他修改,同一个图像可以多次使用,有效地增加了用于训练模型的样本大小。
卷积网络架构
我尝试了几个不同的参数,这个项目最有效的 convonet 架构如下所示。对于这个模型,我使用了校正的线性激活,50 %的丢弃,以及 16 的批量大小。这个相同的体系结构被应用于一些不同的分类安排,并且总体上比其他体系结构表现得更好。
结果
为了评估每个模型的性能,我首先查看了典型的性能指标:准确度、精确度、召回率和 f1 分数。准确性是衡量模型总体预测正确的服装数量。精确度和召回率是模型在每个颜色类别中表现如何的度量,f1 是这两者的调和平均值。
这些指标帮助我优化初始模型参数,调整颜色分类,并识别高性能和低性能模型,而无需过度耗时的评估。通过这个过程,我创建了一个有 31 个颜色类别的有效卷积网(Model_31)。
Model_31 分数汇总:
- 整体模型精确度:81 %
- 平均精度:81 %
- 平均召回率:80 %
- 平均 F1: 81 %
为了进一步评估 Model_31,我观察了每个颜色组的表现。我检查了每个单独颜色组中被算法错误分类的图像。通过这个过程,我对模型错误标记的图像进行了两个关键观察,并相应地解决了每个问题:
该模型经常预测一个非常接近的颜色组。
- 对于我的产品来说,这是一个可以接受的结果。例如,浅黄色的服装可以归类为黄色服装。它仍然属于同一个颜色系列,可能会被挑选浅黄色礼服的伴娘看到。然而,一件浅黄色的衣服被错误地归类为翠绿色是不可接受的,原因有几个。
- 由于上述原因,我创建了自己的【接近得分】指标来评估模型。我计算了 1 个和 2 个颜色组中的“接近整体模型准确度”和“接近回忆”分数。这包括将 1 或 2 个相近颜色组内的任何分类作为“相近阳性”而不是“真阳性”进行计数。
模型实际上正确地标记了一些图像(我错误地标记了它们)。
- 我发现颜色组中的一些图像在建模前被贴错了标签。例如,该模型将几件灰色连衣裙归类为米色。当我打开这些图片时,它们实际上是我贴错标签的米色连衣裙。
- 由于在评估 Model_31 时的这一发现,我回去在建立更多模型之前进一步清理了我的数据。
下图展示了这两种观察结果。它展示了来自珊瑚群的图像,这些图像被错误地标记为暗粉色或亮粉色。
*Above images and classification were from final selected model (Model_35)
型号选择
在进一步清洗标签,又尝试了几个型号后,我用上面的流程选择了我的最终型号: Model_35 。
Model_35 分数汇总:
- 整体模型准确度:79 %
- 平均精度:80 %
- 平均召回率:79 %
- 平均 F1: 78 %
- 平均关闭(1)召回率:87%
- 平均关闭(2)召回率:93%
应用
http://dreamincolor.suprinfinity.com
为了使用我的模型创建一个可行的产品,我需要收集当前可用服装的数据,以便分类并显示给用户。我从以下六家主要的网上伴娘礼服零售商那里搜集了数据:
- 诺德斯特龙
- 威丁顿路
- 卢卢斯
- Asos
- 德西集团
- 绳结
我使用 Xpath、scrapy spiders 和其他策略从这些网站收集数据。对于每件衣服,我收集了以下信息:
- 服装图片链接
- 价格
- 链接到产品
- 产品名称
- 零售商名称
在清理和编译数据后,我使用我的模型从图像中预测颜色类别,并将所有内容提供给 Robb,以便与网站集成。罗柏为 dreamincolor.suprinfinity.com 完成了所有的网页开发工作。我将生产图像存储在另一个 AWS S3 存储桶中用于生产访问,网站是通过 Heroku 和 postgres 数据库建立的。
我总共收集了3670 件衣服在网站上展示。
该网站的访问者可以一次选择多达 5 种颜色类别进行查看。该网站显示所选颜色类别中的所有服装以及与每件服装相关的所有信息。当用户点击一件衣服时,它会直接把她带到零售商的购买页面。
Above: Snapshot of Emerald Dresses displayed at dreamincolor.suprinfinity.com
生产中的模型性能
下图显示了基于验证数据的颜色组的召回分数。下面的分数与 web 应用程序的实际模型性能之间存在一些有趣的差异。三个颜色类别特别展示了这些差异。
Above: Image shows True and Close(2) recall scores across color groups. Website color names are shown and differ from class names during modeling.
无装饰的
- 这位模特在裸色服装上得分很低,可能是因为在标签上重叠了相近的颜色组。裸色、腮红、米色、金褐色和玫瑰色组都包含非常相似的服装颜色。这是一些最常见的伴娘礼服颜色,所以我想有单独的选择。更好的标注可以提高分数。这位模特在制作裸色服装时表现得非常出色。
Nude dresses
拿铁咖啡
- 这一颜色类别的分数也很低,但可能是出于不同的原因:阶级不平衡。拿铁咖啡(棕色)的图片最少。然而,巧克力色(深棕色)和金黄色也比其他颜色类别的图像少得多,但总体表现良好。缓解班级失衡可能会提高各颜色组的模型分数。再说一次,这位模特在生产过程中对拿铁礼服进行了有效的分类。
银
- 这一类别的高分表明模特应该准确地对银色礼服进行分类。在生产中,该模型的表现不如预期。这也可能是由于类别中的错误标记以及一些潜在的背景和图像质量噪声。更多的训练图像和更好的标记可能会提高这种性能
额外功能
寻找相似的服装— 从 Model_35 卷积网的最后一个密集层,我为每张产品图像提取了一个 64 维向量。这是通过构建一个具有相同架构的网络,从 Model_35 的层插入权重,并从每个图像的第一个密集层输出矢量(省略 softmax 输出层)来实现的。利用 64 维向量集,我创建了一个余弦相似矩阵。该矩阵基于卷积输出向量给出相似服装的“分数”。
我的余弦相似矩阵的目标是为网站创建一个功能,允许用户查看与他们喜欢的衣服相似的衣服。我的希望是,在神经网络的回旋中,除了颜色之外的一些服装特征可能被捕获(例如,长度、织物质地、光泽)。我看了一些例子,这似乎是成功的。
下面,我选择了一条香槟色的亮片长裙。《黑客帝国》中最相似的裙子都是长的,颜色非常相似,有些有某种光泽、纹理或亮片。
在第二次测试中(见下图),我选择了另一条亮片长裙。这条参考裙子(左上角的轮廓图)是海军蓝,但是模特把它误归类为黑色。有趣的是,余弦相似矩阵中所有最相似的裙子都被正确归类为海军蓝。他们也很长,有些有亮片或花边。
余弦相似性矩阵对于寻找相似服装的有效性看起来相当成功。更大范围内的表现仍需评估。找出这一特征中的弱点,识别多少件衣服在风格/颜色相似性上有明显的差异,将是有用的。我想这将受到参考服装颜色类别中可用服装数量的严重影响。
其他类似产品——从发饰到个性珠宝,再到指甲油和相配的坡跟鞋,伴娘的套装不仅仅是她的礼服。同样,伴郎也需要搭配(想想领结、吊带、方巾、袜子)。考虑到这一点,我想看看我的 convonet 是否可以用在其他与婚礼相关的产品上。
我首先在蝴蝶结上测试了这个理论。领带和领结的零售图像通常集中在产品上,背景简单,没有太多其他干扰。Model_35 在识别领结的小样本的颜色类别方面非常有效。下图显示了领结和模型预测颜色类别。有效性的进一步评估是有保证的,这看起来像一个非常有前途的网站的潜在功能!
未来的工作和结论
提高模型性能的一些未来策略包括进一步清理图像标注、收集更多数据、解决类别不平衡,以及尝试背景扣除或通过 RGB 值标注。我还想尝试迁移学习和具有本地化能力的应用程序。该网站本身可以在许多方面进行改进,包括更好的 UX 设计,添加上述特殊功能,以及快速清理分类错误的服装。
使用卷积神经网络对服装图像进行分类是实现我的目标的有效方法。数据收集、清理和贴标签是该项目的最重要和最耗时的部分。最终的网站比典型的在线零售商提供了更多的颜色选择,这是一个很好的起点,在许多方面都有改进的潜力。
资源
- 西弗玛姬。"全国平均婚礼费用达到 35329 美元."结。https://www.theknot.com/content/average-wedding-cost-2016。
- “婚礼$eason。” CNN 财经。http://money.cnn.com/2006/02/10/pf/weddings_costs/。2006 年 2 月 10 日。
- 安德烈·伯克。"技术利润和 3000 亿美元婚礼空间的支点."赫芬顿邮报。http://www . huffington post . com/Andre-bourque/technology-profit-and-PIV _ b _ 7193112 . html。2016 年 05 月 01 日。
- 凯特琳.肯尼。"如今当伴娘是什么感觉:调查结果."终极伴娘。http://ultimate 伴娘. com/2016/05/04/what-its-like-to-be-a-a-伴娘-今日调查-结果/ 。
- “根据 2016 年 Knot Real Weddings 研究,美国婚礼的成本创下新高,夫妇们为每位客人花费更多,以创造一个难忘的体验。” xo 组。 http://www .美通社/news-releases/the-knot-the-1-wedding-site-releases-2014-real-wedding-study-statistics-300049675 . html。2017 年 2 月 2 日。
硅谷的饮酒机器人、新技术和年龄歧视
原文:https://towardsdatascience.com/drinkbots-new-technologies-and-ageism-in-silicon-valley-26fa18172fb8?source=collection_archive---------8-----------------------
从去年到今年,发生了一些根本性的变化。
去年被认为是伟大的机器人,今年却显得老派、过时、简单、无趣。游戏变了。从根本上。在数量级上。
在某种程度上,一年一度的 DNA Lounge DrinkBot 竞赛是对整个硅谷的隐喻。
当 TikiTron 今年获得第二名时,可以听到失望的呻吟。这很令人满意,因为我也很失望,然而,我已经明白抱怨对你没有任何好处。更好的办法是学习和调整,然后变得更强。
我确切地知道我们为什么会被打败,在比赛之前就知道,低估了它的重要性,低估了它的紧迫性:
现在最重要的是新技术:机器学习和人工智能。
陈述的评判标准都是无关紧要的,除了一个。因为我们已经确定了所有的类别,除了最后一个:
评判将基于:
时尚与优雅:你的那个机器人有多聪明、多敏捷?
醉酒效率:它制作的饮料好喝吗?
全资产:半资产的反义词。这个地狱般的装置真的能工作吗,还是你必须站在那里不停地调整它?
这不会有好结果:可怕的想法和疯狂的科学会得到额外的考虑。
风格和优雅:你选择一个贴有你选择的鸡尾酒标签的提基神像,通过祈祷将神像扔进火山来献祭,你听到神像痛苦地尖叫,然后鼓声开始,你的鸡尾酒被分配到提基龙巨大的提基嘴里。
TikiTron 是纯粹的艺术。事实上,我们故意隐藏了这项技术,因为当它变得神奇时,体验会更好。当人们问它是如何工作的,回答是,“提基神知道你所有最深的渴望!”TikiTron 是一种表演。饮料本身几乎是事后的想法。
我在精心制作的东西中发现美。你可以看出什么时候有人不辞辛苦地从头开始做东西。有一种对过程的热爱,在这里创作不是关于完成,而是关于制作的旅程。这是最后的润色,最后的 10%占用了 90%的时间。这不仅仅是证明这个概念,而是把这个概念带到一个更高的存在状态。
现在不是这样的。
《神风敢死队》几乎没有任何艺术。它只是一台电脑、一台抽水设备和一张夹在框架上的塑料板。它利用面部识别将酒精喷入你张开的嘴中。
Kamikazi Blaster is insane fun: get alcohol squirted into your open mouth! (Credit: photo taken by the author) (Note the paper towels…!!!)
我问项目上的编码员是怎么训练他的模型的,他说他没有建模型,只是用了 OpenCV 里的面部识别库。
就这么简单。
今天,it 是只是为了证明这个概念。但是证明一个比以前更大的概念,这才是重点。因为有了新的可用资源,你可以在几天内从概念到成品——如果你想得更大,不加工产品,你可以利用这种加工的便利来创造更大规模的产品。你现在可以做更大更复杂的东西了。
以前,使用处理器构建主板是一个完整的过程,但 Arduino 和 RaspberryPi 已经下架,教程甚至全功能代码都已经构建好并准备就绪。硬件不再是过程的一部分,它仅仅是一个更大项目中的一个小而简单的步骤。
这就是要点:当你卸载过程,你可以在更高的水平上创造。
这改变了人类的一切思维方式。它改变了我们现在能解决的问题的层次。大项目不再用一辈子,可以用一个周末。现在一切都扩大了:需要资金?点击几下启动 kickstarter 需要捏造点什么?3D 打印出来。有如此多的软件,人们几乎不需要编码。仅仅通过把碎片放在一起,使用模板,下载库,利用像云这样的大量资源,你就可以创造出仅仅在几年前难以想象的规模。
仅仅一年前。
风格和优雅几乎无关紧要。快速构建,快速迭代,经常失败是新的思考方式。
我们这些老古董需要更新我们的游戏。
陶醉的效率:tiki tron 使用经典的鸡尾酒配方,以及精心校准的泵来提供一贯出色的鸡尾酒——如果我自己这么说的话(代码是我写的。)人们通常会对我们的鸡尾酒有多好感到惊讶。
我们的不含酒精的菜单是我女儿和她的朋友们用我为他们添加的程序创建的,他们可以分配微量的酒精,这样他们就可以尝试很多次来得到一种恰到好处的新饮料。
实用性、有用性:你交付了用户需要的功能吗?
我对 Slack 的第一次体验更加深了事情的变化。我参加了一个在线课程,该课程使用 Slack 让学生进行协作。我发现这种体验令人无法抗拒——因为“信噪比”相当低,但当信号存在时,它是高质量的,这意味着我必须费力地通过信号来获得好的金块。我的意思是有很多闲聊,但偶尔有人问了一个很好的问题,其他人给出了一个非常有见地和有用的答案。我会看到这些对话框经过,并知道我以后会需要这些信息,但我不能将它们加入书签,当它们滚动到顶部时,它们就永远消失了。
我向组织者抱怨——说因为我有家庭,所以时间有限,很难跟上 Slack,再加上好的想法没有存档供以后阅读。(我的错误。)他们的回答是,因为大多数公司都使用 Slack,即使是有家庭的大龄学生也需要学习如何使用它。年龄歧视者认为我太慢,这让我感到震惊和侮辱。我不是在抱怨它不好用。我抱怨它在整理和归档有用信息以供日后使用方面功能不佳。在课程中,好的想法应该为新学生所用——好的想法应该积累和建立,一切都随着时间的推移而改进。我认为 Stack Overflow 可能是一个更好的地方,以一种易于搜索的方式来存档想法,但 Stack Overflow 对他们来说太昂贵了,无法进行商业许可。
在快速迭代的世界里,有用性没有快速迭代重要。“那是昨天的事了”,所以应该从顶部滚下来,永远消失。懈怠是今天的工具,不是昨天的。
回到神风敢死队。我自己试过,虽然这种液体很美味,但我不会说它有效率或令人陶醉。大约是半口混合鸡尾酒,一半在我的脸上和脖子上。完全疯狂,愚蠢和有趣!
Kamikazi Blaster: about half made it into my mouth (Credit: photo by the author taken of the screen of the automatic photo taken during dispensing)
《神风敢死队》是关于体验,而不是陶醉。TikiTron 也是一种“体验”,但没有那么浮华和疯狂的乐趣!
为去年的比赛,Tikitron 在 4 个月的过程中建造,并在去年为今年进行了改进。它是由一个具有丰富建筑经验和经典蒸汽朋克艺术感的团队建造的。我不知道神风爆能有多快,但它可以在几周内,甚至一个周末内轻松完成。
这就是要点:获得你(短暂)注意力的体验比完善和精炼的体验重要得多。
我们这些老古董需要放弃完美。
我相信你现在已经知道事情的发展方向了。
TikiTron 是一件经过打磨的艺术品。它充满了细节,从手工建造的干冰烟雾机,到闪烁的“恶魔之眼”,到盛放牺牲的 tiki 偶像的宝盒,以及隐藏油管的塑料藤蔓。这确实是一件艺术品。这些提基神像是经过多年的庭院浏览精心收集的。照明经过了深思熟虑——从火山内部的 led,到 tiki hut 灯,再到照亮整件作品的聚光灯。所有的技术都是隐藏的,将艺术完全放在前面和中心。
如果我也可以说,它是精心设计的。去年和今年,代码从下午 5:30 运行到晚上 10:30,没有崩溃,没有中断,并且(今年)没有发生故障。它在用 Python 编写的 5 个类中运行 1500 行代码。所有的命令和分配的饮料都有记录。它根据杯子的大小调整饮料,灌注所有的泵而不丢失一滴,在关闭之前将液体流回瓶子,并被校准到不到十分之一盎司。设置和关闭模式让跑步变得如此简单——我会在家里打开它,为自己调制一杯鸡尾酒。外壳上布满了连接器,每一个都不一样,以免在安装时混淆。灯指示哪个泵当前正在泵送,并且计划了大多数意外情况(例如,瓶子用完了,新瓶子需要单独灌注。)整个东西可以放在大多数紧凑型汽车的后座上——让前座敞开着。我带着它去过很多地方,只是为了好玩,因为它很容易打包和安装。
神风爆能枪进行了一些微调、瞄准和调整。在夜晚结束时,它射错了站在舞台上的人(不是这张照片中的人,但是他们在摄像机的视野中,可能有危险。)
Kamikazi Blaster — the person behind might be in danger of getting sprayed! (Credit: photo by the author)
这个系统有很大的改进空间。可能有某种艺术主题。背景本可以更有趣。我对一个人说,也许应该把地板布的边缘翻起来,用胶带粘住,防止液体流出,但他似乎不在乎。他们不得不向酒吧借地垫来装液体。他们不得不手动要求顾客向前或向后移动以瞄准——他们甚至在地板上没有一个可以站立的地方。该机制可以使用一个漂亮的外壳来保持东西整洁。不确定这张桌子是不是他们的。放所有多余物品的盒子会让桌子保持整洁。在桌子上盖个布帘盖住下面的内脏会更好看。
我不能说 Kamikazi Blaster 在工程方面有多糟糕(它看起来大部分时间都工作得很好),但是,在第一次安装时,它确实需要大量的调整和测试。
简而言之,它看起来像一个正在进行的科学实验,而不是一个经过打磨的机器人。
这就是要点:一个项目组合在一起的感觉是吸引力的一部分。这看起来像疯狂的科学!这是半吊子,但它的工作。对观众来说,参与疯狂科学的体验是最有趣的部分。
我们这些老古板需要在几乎不起作用的时候,在仍然危险的时候展示正确的东西。
这不会有好结果:这让我们回到了现实,唯一重要的标准——这在硅谷很重要:你有多前沿?
TikiTron 获得了第二名,但第一名和第三名的机器人使用了最新的技术:Kamikazi Blaster 使用计算机视觉进行面部识别,史蒂夫使用语音识别。这些技术现在掌握在外行人手中,而且非常容易使用,可以整合到像 DrinkBots 这样琐碎有趣的项目中。
Old school: this bot, Chassis, was beautiful, made excellent cocktails, and was well executed. It lost. (Credit: photo by the author)
New School: this bot, Steve, had little art, and a backup plan, but it used Google Home to recognize your voice and help you decide on your ideal cocktail. It won third place. (Programmer is in the background.) (Credit: photo by the author)
我知道这是必然会发生的!我知道 ML/AI 是最新的东西,而且很重要。我甚至正在为 TikiTron 添加语音识别功能,所以你实际上必须向 Tiki 神祈祷才能得到你的饮料:
A test of voice recognition to get the TikiTron to accept real prayers for your drink!
我做了一个简单的实验——最重要的部分成功了:在一连串的祈祷中识别饮料的名字。但是这个板通过云工作,萨姆很久以前告诉我,带宽是酒吧的一个问题。(对于去年的大奖得主 N. E. Bree 8 来说,带宽是一个大问题。)所以在 Maker Faire 上,我得到了第二个语音识别板,它独立存在,没有云连接,并且正在将它从 Arduino 转换为 RasPi…
我受到了波兰语的阻碍——我希望它能一直正常工作。
我应该把那只小狗放在那里,甚至可能伪造它,甚至根本不把它集成到代码中,只是把盒子放在那里,让它识别你的声音。如果我有连接问题,我不应该担心,只是看起来很疯狂,因为我试图在演出期间让它工作。我应该熬夜让它勉强工作。
我应该使用最新的技术,并以其创造性的使用给评委留下深刻印象。
但是我回到了老学校。
那是一个非常非常大的错误。
所以我对第二名感到失望——不是因为我觉得它不值得。神风敢死队是一个…爆炸!这是疯狂的,疯狂的,有趣的,取悦大众的。我们为酒吧赚的钱可能比神风敢死队还多,但这无关紧要。
神风敢死队是疯狂的科学。
然而,结局确实很糟糕。第一名和第三名的机器人都有人工智能的所有缺点。两个人都表现出了种族偏见——一个黑皮肤的男人告诉我,神风敢死队员认不出他的脸,一个法官说史蒂夫对她的口音有问题。有时候,没有好的想法的快速原型会产生意想不到的——非常糟糕的——后果。两者都需要运营商做大量的工作。我敢打赌,没有一个人会在明年回来时变得更优雅或更有技巧。
这不会有好结果
机器学习和人工智能是已经在学术界酝酿多年的巨大话题,只适用于那些在数学和统计领域度过多年的人。但是现在 ML 和 AI 任何人都可以用,不考虑编码能力。我甚至看到教程和课程是这样工作的:那些大师仍然在线性代数和统计模型中思考,并试图从那个角度教授它。现在的学生不需要知道引擎盖下是什么。他们只需要调用一个简单的函数。《神风敢死队》的编码员并没有自己建立他的面部识别模型。他刚刚使用了图书馆调用。
这就是司机和机械师的区别。
在汽车刚问世的时候,驾驶汽车需要大量的工程知识。但是现在汽车很容易使用,你甚至不需要了解除了加油之外汽车是如何工作的。
哦,当然,如果你了解引擎盖下是什么会有所帮助,但是没有必要利用汽车的实用性。这使得越来越多的人可以使用汽车。电脑本身也是如此——因为它们容易使用,奶奶有电子邮件和 Skype。
现在 ML/AI 也一样。这些工具变得非常容易使用,以至于你不需要理解数学或统计学就能使用它们。
这种转变改变了一切。
认为世界上有一种新的方式。它已经从理解所有的部分,到把它们拼凑在一起,当东西坏了,然后试图弄清楚它是如何工作的,发生了什么。这开启了一种快速的原型制作模式,不仅更快,而且比 T4 快了很多倍。它改变了任何人都可以做的问题和项目的规模。
这种思维的转变将改变人类。
这是我们这些老古董需要学习的一课:如何停止试图理解,开始只是把东西粘在一起,直到它们起作用,然后把它们送出门。
年龄歧视和硅谷缺少什么
然而,最大的问题是,所有其他因素也很重要:风格、实用性和抛光。这些是有经验的人的领域。
年轻人根本看不到在各个层面都做得很好的事情的价值。因此老程序员的谨慎和智慧不受重视——我们看起来又慢又笨。对问题的必要思考减缓了快速创新的速度。然而,有些事情做得好就会有回报——年轻的程序员没有足够的生活经验来看到很多回报。
这就是经验的全部意义:投资的回报。
真正的答案是我现在正在走的路:学习这种超级原型的新方法,在不理解的情况下进行构建,同时利用我的经验比随机的疯狂科学做得更好。
深度学习在机器人学中的应用
原文:https://towardsdatascience.com/drone-follow-me-ed0d15e62498?source=collection_archive---------4-----------------------
W 帽子是跟我来在机器人?
“跟我来”是机器人学中的一个领域,用于在模拟中识别和跟踪目标。
像这样所谓的“跟我来”应用是许多机器人领域的关键,您在这里应用的相同技术可以扩展到自动驾驶汽车的高级巡航控制或工业中的人机合作等场景。
在这个项目中,一个深度神经网络被训练来识别和跟踪模拟中的一个目标,即一个被称为“英雄”的人,他将与其他人混合在一起。在下图中,有一个跟随“英雄”的无人机的表示。
Drone follow (mid of the image) follow a target on bottom right corner
你听说过卷积网络吗?
记住神经网络的概念,将卷积网络应用于图像识别有两个主要优点:
- 参数共享:在图像的一部分有用的特征检测器(例如垂直边缘检测器)可能在图像的另一部分也有用。
- 稀疏连接:在每一层中,每个输出值只依赖于少量的输入,这使得它具有平移不变性。
通常,卷积网络架构的结构如下:
- 卷积层
- 汇集层(通常是最大汇集)
- 全连接层
- Softmax
作为每层的激活函数,RELU 应用逐元素的非线性。
即使卷积网络是用于对象分类的现有技术,对于对象检测,必须应用架构调整来提供逐像素的网络学习。这种架构被称为全卷积网络。
W 什么是全卷积网络?
全卷积网络(FCN) 是一种允许在整个网络中保留空间信息的网络架构,这对于图像中的对象检测来说非常简洁。此外, FCN 可以接收任意维度的输入。
Fully convolution network architecture
关于架构, FCN 的架构如下:
- 编码器(上图中的前 3 个元素)
- 1x1 卷积层(上图中的第四项)
- 解码器(上图中最后 3 次)
- 跳过连接
编码器对应于上一节中描述的传统卷积网络。编码器允许学习最重要的特征,以便稍后进行上采样并获得图像中的对象分割。
一个全新的概念是 1x1 卷积层。简单来说,就是保存空间信息的卷积层。此外,1x1 通过在来自编码器的输入层上应用 1x1 滑动窗口来执行逐元素乘法和求和。最后,1x1 卷积通过降低编码器架构的深度来降低计算成本。类似地,1x1 卷积图层的工作方式类似于全连接图层,因为它线性组合深度图层并输入 RELU,尽管与全连接图层相反,它会保留空间信息。
1x1 convolution
最后,解码器由双线性上采样层、卷积层+批量归一化和与编码器层的跳跃连接组成,以改善丢失的空间特征分辨率。
让我们来分解这三个重要的概念:
- 双线性上采样
- 批量标准化
- 跳过连接
双线性上采样是一种重采样技术,它利用位于给定像素对角线上的四个最近的已知像素的加权平均值来估计新的像素强度值。加权平均值通常取决于距离。
让我们考虑这样一个场景,其中有 4 个已知的像素值,所以本质上是一个 2x2 的灰度图像。需要将此图像上采样为 4x4 图像。下图更好地展示了这一过程。
Bilinear Upsampling for 2x2 input image
让我们记住,双线性上采样方法不像架构中的转置卷积那样是一个可学习的层,并且容易丢失一些更好的细节,但它有助于提高性能。
例如,转置卷积是一种具有可学习参数而不是插值的方法。转置卷积有些类似,因为它产生的空间分辨率与假设的反卷积图层相同。然而,对这些值执行的实际数学运算是不同的。转置卷积层执行常规卷积,但恢复其空间变换。
Tranpose convolution from 2x2 to 4x4
关于转置卷积数学的更多细节,请点击这里。
第二个重要的概念是批量标准化,它基本上是指网络内每小批训练数据的正常数据。这个过程允许网络快速学习。此外,它限制了网络内部激活函数的大的变化,即在隐藏层中有一个更平滑和坚实的学习。
第三个重要概念是跳过连接,它基本上从编码器的初始层获得更高的分辨率,并与解码器层结合,以获得卷积层期间损失的更多空间分辨率。这种方法对解码器很重要,因为上采样不能恢复所有的空间信息。
Skip connection
最后,跳过连接对于训练越来越深的网络也很有用,比如 ResNet 架构。
在建立并训练了一个 FCN 之后,一个问题自然产生了:我们如何知道我们的对象检测模型是否表现良好?这时insection Over Union(IoU)度量就派上用场了。在下一节中,我们将讨论这一概念,以及为什么是对象检测性能的良好指标。
欠条是怎么回事?
IoU 测量地面真实图像与我们的 FCN 模型产生的分割图像重叠的程度。本质上,它测量了从地面和分割图像 FCN 网络的像素联合中分割的像素数量。因此,度量的数学公式是:
IoU
现在你在想,你的模型怎么办?有哪些障碍?最终结果是什么?下一节再说吧。
这个伟大的工程怎么样?
该项目分为三个主要阶段:
- 生成并预处理来自模拟器的图像
- 设计模型架构
- 对模型进行训练和评分
预处理步骤将来自 sim 的深度掩模转换成适于训练神经网络的二进制掩模。
Pre-processed image on the right
最终的模型架构可视化是:
FCN architecture (final model)
首先,使用编码器和解码器来应用图像中对象的分割是基于逐个像素的学习,而不是像在空间信息不太相关的图像分类中使用的图像不变性滤波器。用于导出模型架构的总体策略始于深度为 32 的初始卷积层的基础,其具有 3×3 滤波器、深度为 8 的 1×1 卷积以及深度与编码器相同的解码器。这样做的原因是基于图像输入尺寸 256X256X3。从这一点上,几个卷积层增加了深度(基于 2 的幂)。这种方法是基于斯坦福大学使用的 SegNet 架构来分割图像中的对象。值得一提的是,1x1 层深度增加与数据生成相关,以减少过拟合和模型性能改善。数据生成对于减少训练和验证数据集的误差(交叉熵)以及克服局部最小值和允许网络继续学习是重要的。
正如你所记得的,最终得分是由一个叫做 IoU 的指标来定义的,是 0.49。通常,将分割确认为预测对象的标准是> 0.5。虽然,对于作为 Udacity 项目的这个项目,标准被降低到 0.4。
Original image on the left; Binary mask in the middle; Prediction from model on the right
github:https://github.com/BrunoEduardoCSantos/Follow-Me
用于卫星图像分割的神经网络
原文:https://towardsdatascience.com/dstl-satellite-imagery-contest-on-kaggle-2f3ef7b8ac40?source=collection_archive---------4-----------------------
我们的卡格尔 DSTL 卫星图像竞赛项目概述。该项目在公共测试数据集上获得了 0.46 的分数,在私有测试数据集上获得了 0.44 的分数,这将在私有领导板上的 419 个团队中排名第 7。代码在我的 github 上。
数据可视化和特征合成
训练数据集包括 25 个图像,每个图像具有 20 个通道(3 个波段(3 个通道,RGB) + A 波段(8 个通道)+ M 波段(8 个通道)+ P 波段(1 个通道)),以及对象的相应标签。用等高线标注的重叠对象有 10 种( wkt 类数据),其中 0。建筑物,1。杂项,2。路,3。音轨,4。树木,5。农作物,6。水路,7。死水,8。大型车辆,9。小型车辆。
我们的策略是首先将轮廓转换成掩模,然后为每一类对象训练一个逐像素的二元分类器。下图显示了 20 个通道和标签的示例。值得注意的是,A 波段(下面中间一行)的分辨率比其他波段低得多,因此在我们的模型中没有直接使用。M 波段相对于 3 波段显示出轻微的空间偏移,并且被插值到与 3 波段相同的分辨率,并且进一步配准到 3 波段。我们还根据给定的 3、A、M 波段创建了另外 4 个指数, CCCI 、 NDWI 、 EVI 、 SAVI 。这些指数已被证明与传统 GIS 中的某些类别的对象有很好的相关性,并且可能使特征学习更容易。因此,我们总共有 16 个通道(3 个波段(3 个通道)+ M 波段(8 个通道)+ P 波段(1 个通道)+ 4 个合成通道)输入。
Examples of all channels of training data and class labels
An example of the 3-band image with class labels overlay
班级统计
与包含大约 100 万张训练图像的 ImageNet 分类挑战相比,这个训练数据集相当小,只有 25 张图像。然而,本次竞赛中的标签是在像素级别上,因此每个像素都是一个训练示例,该数据集的有效大小为 3300 * 3300 * 25 = 2.7 亿。
对所有训练图像的所有类别的百分比面积的统计显示了大多数类别的真标签和假标签之间的高度不平衡,以及真标签在类别之间的严重不平衡分布。因此,我们决定为每个类别训练一个二元分类器,而不是用单一模型来预测所有类别。
Statistics of percentage area for all classes of all the training data. (Note: on some images, the sum is over 100% because of overlap between classes.)
U 网模型
在 tensorflow 中开发了具有批量归一化的 U-net,并用作分类模型。该模型被训练 9000 批,每批包含 60 个图像补片。每个图像块都是原始图像的 144144 裁剪。类似于最初的 U-net 论文,由于边缘像素仅接收部分信息,因此仅在中心 8080 区域上计算损失。
损失函数:比较了两种损失函数,包括加权交叉熵和软 Jaccard 指数,这两种损失函数都可以解释真假标签的不平衡。发现加权交叉熵在训练期间对交叉验证数据产生振荡性能。给定评估度量是类的平均 Jaccard 指数,使用 Jaccard 指数作为损失函数是理想的。不幸的是,Jaccard 指数是不可微的。相反,软 Jaccard 指数是可微分的,并且在非常有把握的预测中接近 Jaccard 指数。交叉熵(H)和软 Jaccard 指数 (J)的组合,L = H -log(J),被用作损失函数。
优化器:使用初始学习率为 0.0001 的 Adam 优化器。虽然 Adam optimizer 应该自然地执行步长退火,但我们发现每 4000 批学习率衰减到 0.1 确实改善了训练。
批量大小:原来的 U-net 模型使用每批中的单个图像进行训练,显然不适合这个问题。从职业统计可以看出,职业分布在不同的图像中变化很大。大批量(此处为 60)是可取的,以确保每个有效批量的统计数据(考虑动量)与整个训练数据集的统计数据一致。批量大小也必须与有效训练区域妥协,因为边缘像素必须被丢弃。太大的批量将导致用于训练的中心区域非常小。
在 CPU 上创建两个独立的线程进行数据预处理,预处理后的数据被推入两个队列,并分别在 GPU 上进行训练和交叉验证。这减轻了 GPU 的负担,加快了训练的速度。所有训练数据都被预加载到 RAM 中,以避免训练期间缓慢的文件 I/O。
该项目是通过对 21 幅图像进行训练,使用另外 4 幅图像进行交叉验证而开发的。最终的模型是用所有 25 幅图像训练出来的。
训练数据扩充
训练数据扩充包括随机水平和垂直反射和平移,以及 360 度旋转(1 度步长)。旋转破坏了 CNN 的平移对称性。选择 1 度的步长,因为对于 144 的裁剪大小,围绕其中心旋转 1 度会在边缘产生约 1.3 个像素的偏移,从而为 CNN 产生不同的输入图像。有趣的是,通过实验确定旋转在多大的步长下停止改善性能。
测试时间增加
U-net 模型的一个优点是它是完全卷积的,因此用于训练和推断的输入数据的空间维度不必相同。如上所述,在训练中,相对较小的图像补片和较大的批量是可取的。然而,对于推断来说,使图像块尽可能大以减少由丢弃边缘上的预测而产生的开销是有益的。受 GPU 内存的限制,我们每次只能将大约四分之一的图像(~1900*1900)送入 U-net 进行推理。图像的每四分之一旋转 0、90、180 和 360 度,并且水平和垂直翻转,用于放大。并且最终预测掩码是 8 个掩码的算术平均值,以减少预测中的方差。与最初的 U-net 论文类似,我们在边界上应用了反射,以改进边缘像素上的预测。
预测和结果
在线评估在私人排行榜上的得分为 0.44113,在 419 分中排名第七。下图显示了 0 级建筑物的真实标签和预测标签之间的比较。
一些有趣的观察:该模型能够从训练数据中纠正一些不精确的标签。如下图所示,3 波段图像似乎有一个小的“空”区域,充满了自然光产生的阴影,位于建筑物的中间。虽然“真实”标签将整个区域作为建筑物类包括在内,但预测掩膜能够正确排除阴影区域。我们在预测中发现了几个这样的例子。
水类:我们已经注意到,对于建筑物类,如果只使用 2 个图像进行训练,U-net 会完全过拟合,但是对于≥21 个训练图像,U-net 可以很好地推广。了解确切的界限在哪里以及为什么会有意思。这也意味着深度学习在这场比赛中对水类不起作用,因为水类只在很少的图像上有实例。我们已经发现,对于水类,阈值 CCCI 优于深度学习模型。
一些评论
- 该模型主要基于其在 0 级(即建筑物)上的性能而开发。通过为每个类定制模型参数,结果肯定可以进一步改善。
- 我们的模型完全无法预测大型和小型车辆类别,可能是由于严重的真假标签不平衡和车辆的空间尺寸太小。诸如对真实标签的过采样和大批量训练等技术可能有助于前者。
伙计,我的车呢?回顾 Udacity SDCND 第 2 期
原文:https://towardsdatascience.com/dude-wheres-my-car-looking-back-at-udacity-sdcnd-term-2-e518fede30a1?source=collection_archive---------4-----------------------
Udacity 自动驾驶汽车纳米学位项目的第二个学期介绍了传感器融合、定位和控制。即使仅仅是过去的主题本身,这个术语也有许多其他重要的变化。首先,术语 1 通常侧重于您可以从已经创建的库中导入的算法(在使用深度学习进行交通标志分类和驾驶行为克隆以及支持向量机进行车辆检测的情况下),术语 2 需要更具体的编程-您必须学习实现所介绍的各种技术所需的精确数学方程。这导致了一些复杂的方程和矩阵,如下面的雅可比矩阵:
Looks fun right?
我承认,在进入第二学期的时候,意识到有多少数学是直接涉及的,这是相当令人生畏的。尽管我对自己的数学能力很有信心,但第一学期更多的机器学习/数据科学基础更在我的掌控之中。
然而,一旦你对这些方程有了感觉,它们在代码中的实际实现就没那么难了。这让我们看到了 Term 2 的第二个重大变化:Term 1 完全是用 Python 编写的,而 Term 2 完全是用 C++编写的。这给我提出了一个比数学更大的问题,因为我以前从未使用过 C++。幸运的是,这个学期的大部分内容只需要基本的 C++技能就可以完成,我还使用了一些在线资源来让自己感觉更舒服一些。这是我对第二学期有一点遗憾的地方,因为我已经决定将第二学期从最初的 12 月份的时间表提前到 11 月份的时间表,我认为在第二学期开始前多学习一些 C++或许会让我受益匪浅。
我在 Slack 上看到的关于第一学期的一大抱怨是,Udacity 的创始人巴斯蒂安·特龙&也许是自动驾驶汽车的“父亲”,在这个学期的大部分时间里都是失踪的。这在第二学期得到了纠正,尽管主要是通过使用 Sebastian 的用于机器人课程的人工智能,该课程可在 Udacity 上免费获得。如果你是一名未来的 SDC 纳米学位学生,或者正在第一学期和第二学期之间消磨时间,我强烈建议你去看看那门课,因为它将是第二学期的一大助力。由于 Sebastian 的课程是 Python,Udacity 从梅赛德斯-奔驰和优步·ATG 请来工程师对内容进行了一些更新,并涵盖了一些 C++方面的实现。
第二学期的最后一个变化也是基于我在网上看到的第一学期的一些反馈,学生们经常提出比预期更高的学期时间承诺。我当然觉得这在学期的早期得到了改善,尽管我确实认为一些后来的项目(尤其是第五个带有模型预测控制的项目)需要比 Udacity 目前提供的更多的课程;虽然课程本身是一个很小的时间承诺,这意味着你经常被困在自己试图找出一些更先进的概念。
项目一——扩展卡尔曼滤波器
Tracking a Bicycle with an EKF
第一个项目是卡尔曼滤波器概念的介绍,第二个项目是更高级的版本。课程首先介绍项目中要融合的两种传感器,雷达和激光雷达,以及它们各自的优缺点。虽然目前昂贵得多,激光雷达的分辨率确实比雷达高,但雷达可以在更广泛的天气情况下工作。雷达也可以直接测量速度(转换坐标空间后),而激光雷达不行。雷达和激光雷达传感器在输入数据中都包含噪声,在传感器融合过程中的每一步都必须考虑噪声(通常通过高斯分布的方式)。
扩展卡尔曼滤波器的工作原理是首先基于初始传感器测量值初始化值,也许是为了跟踪车辆前方的物体。对于随后的时间步长,它预测被跟踪的对象将在哪里(基于在给定单个时间步长上的先前状态的情况下获取其运动预期),获取当前传感器测量值,然后基于结合来自传感器的测量数据及其预测来更新它认为对象实际在哪里。在更新步骤中结合这些测量值和预测值有助于解决每个传感器中固有的噪声。对于雷达和激光雷达,此更新步骤必须以不同的方式完成-雷达需要线性近似(EKF 不能使用非线性函数,因为您输入的是高斯函数,而想要返回的是高斯函数)来转换到计算中使用的测量空间,这最终会给模型增加一点不准确性(参见前面提到的雅可比矩阵)。EKF 的另一个缺点是它们基于恒速的概念,这在车辆转弯时尤为明显。请注意,上图中的 KF 估计值(蓝色)沿曲线越来越偏离地面真实值,该模型预测被跟踪的对象比实际情况更远离转弯圆。
项目二——无味卡尔曼滤波器
Tracking a Bicycle with UKF. Note that the UKF estimate does a better job overlapping the ground truth (in blue), so much that it cannot really be seen above.
无味卡尔曼滤波器改进了 EKF,因为它允许跟踪非线性模型,通过使用“西格玛点”,该点是使用平均位置周围的噪声产生的。这些西格玛点被输入到非线性函数中,并有助于根据得到的西格玛点的分布进行预测。我将在这里跳过许多细节,因为它很容易成为自己的 10 分钟长的帖子,但本质上,你将再次做一个预测和更新的过程。此外,EKFs 使用恒定速度(CV)模型,UKFs 使用恒定转弯角速度和速度幅值(CTRV)模型。这个模型将偏航(转弯)和偏航率(汽车转弯的速度)添加到模型中(旧的状态空间只有 x、y 和速度)。如上所示,UKF 在沿曲线进行估计时表现得更好。
项目三——粒子过滤器(被绑架的车辆)
Localizing the vehicle using a particle filter’s observation of map landmarks
接下来是本地化的概念。你可能已经猜到了,这是基于汽车知道它在哪里。GPS 当然可以给我们一个相当接近的估计,但自动驾驶汽车需要比 GPS 所能提供的更精确的位置。由于信号中断,GPS 在高楼林立的城市等地区也很难工作。这些课程还深入研究了可用于定位的不同运动模型,在这些模型中,预测再次发生,并与测量(基于所用的传感器,测量总是有一定量的噪声)相结合,以更新到更准确的位置。
粒子滤波是一种很好的方法,因为它们可以处理多峰分布,而卡尔曼滤波只能处理单峰分布。这是有帮助的,因为汽车最初在新环境中可能相当不确定它的确切位置(本课给出了一个走廊的例子,该走廊在两侧几乎相同,直到遇到侧室中的物体)。简而言之,大量“粒子”分布在地图中,与最近的已知地图地标相关联,然后基于地标、新的预测和测量,粒子过滤器慢慢过滤掉不太可能给出某个测量的“粒子”。这是通过用相应的误差对粒子进行加权来实现的,不太精确的粒子被慢慢剔除。这里一个重要的中间步骤是坐标转换——汽车有自己的本地坐标系,而地标来自的地图也有自己的。没有这种转变,汽车将无法实现本地化。
的最终结果是一辆虚拟汽车,它可以在基于不太精确的 GPS 数据进行初始化后,根据其环境中地标的传感器测量来定位自己。
项目四——PID 控制
Back to the Udacity simulator!
第四个项目是关于比例-积分-微分(PID)控制,这有助于驾驶车辆。虽然该项目本身带回了之前在 Term 1 中用于行为克隆的 Udacity 模拟器,但这次是在没有深度学习的情况下完成的。该名称的“比例”部分来自于与跨轨迹误差(CTE)成比例的转向,或者从车道中间到汽车实际位置的距离。这很有道理,因为你肯定希望大部分时间都待在车道中间。然而,如果模型只由 P 控制驱动,它总是超调,导致它在中心来回驱动大波浪。这可以通过名字的“衍生”部分来改进。PD 控制器会考虑 CTE 的变化是正还是负,以及多少,这意味着当汽车接近车道中心时,它会减小转弯角度,有助于减少超调。
现在,你们中的一些人可能已经注意到,在把你自己的车拿到商店后,你的车倾向于向某个方向拉。把手从方向盘上拿开,车慢慢漂移出车道!在模拟器的情况下,这会在最终的转向角度中产生系统偏差——如果汽车存在这种偏差,PD 控制器将总是计算错误的角度,汽车将慢慢偏离轨道。这是通过名字的“积分”部分解决的,如果在一个给定点上所有 CTE 的总和向一个方向偏离太远,转向角将被补充以对此进行校正。
PID 控制器的主要重点是确定这些部分的系数:P、I 和 d。PID 控制器的实际基础实现非常短(如果您已经检查了上面链接的 Github),但找到这些值是该项目的真正挑战。旋转 &随机梯度下降法在这里都是潜在的方法——虽然我在选择最终值时尝试了一下这两种方法,但我最终没有在最终版本中包含它们。PID 控制器在实际应用中对我来说似乎是无效的,所以当我得知现在大多数机器都使用这种方法时,我有点惊讶!
项目五——MPC 控制
MPC, a much more advanced, yet much more accurate control method than PID
很多人类司机都是反动司机。他们几乎只是专注于保持他们的车道和速度(你们中的一些人可能也想争论),如果有问题发生,他们会对问题做出反应。然而,要成为一名好司机,你需要积极主动,能够预测在你前面会发生什么事情。如果你在高峰时间行驶在高速公路上,看到前方远处的刹车灯,你可以猜测你前面的车也将很快刹车,并可以放油门。如果你还没有从早期的项目中注意到,预测对于自动驾驶汽车来说至关重要——它们不仅需要看到车辆前方和周围的情况,还需要能够预测十字路口的行人可能会进入它的道路,或者前面的汽车突然转向意味着潜在的事故和需要刹车。一辆自动驾驶汽车提前一点刹车,甚至可以帮助其他人类司机提前一点看到尾灯,从而做出反应。
第二学期的期末项目,模型预测控制,将这一点推到了前沿。该项目不仅能够规划未来的行动以遵循一条路径(见上图中黄色的轨迹路点,绿色的汽车预测路径),而且还增加了计算时间与转向角和油门/制动的执行器值之间的延迟。我考虑这种延迟的方法是实际上根据延迟结束时汽车的预测位置为我的模型提供一个预测状态空间,从而使所有结果计算都像是实时的(当然是基于原始预测)。当然,这个项目不仅仅是延迟,我认为这可能是迄今为止整个 Nanodegree 中对我最具挑战性的,需要结合论坛、Slack 频道和查看项目 Q & A。我的 Github 文章比之前的一些文章更广泛,所以如果你想更深入地了解它,我建议在那里阅读。
到了期末
我非常惊讶地看到自动驾驶汽车纳米学位的最后一个术语!到目前为止,这是一次相当疯狂的经历,在这么短的时间里,我学到了比我想象中更多的东西。第三学期侧重于路径规划、专业化(如果你已经阅读了我关于深度学习车道检测的之前的 帖子,你可能会猜到我会关注高级深度学习专业化),以及系统,其中甚至有可能我的一些代码(以及潜在团队中的其他人的代码)会出现在 Udacity 自己的自动驾驶汽车上!那绝对会让我大吃一惊。在我开始下一个学期之前,我还有几个星期的时间,但我很兴奋地想知道接下来会发生什么。
使用 Word2Vec、XGBoost 和自动编码器的重复问题检测
原文:https://towardsdatascience.com/duplicate-question-detection-using-word2vec-xgboost-and-autoencoders-f9353d58ba34?source=collection_archive---------8-----------------------
Photo by Emily Morter on Unsplash
在这篇文章中,我解决了根据问题对是否重复进行分类的问题。这对于像 Quora 或 Stack Overflow 这样的公司来说很重要,在那里发布的多个问题是已经回答的问题的重复。如果算法发现了一个重复的问题,用户可以被引导到这个问题,并更快地找到答案。
两个重复问题的一个例子是“我如何阅读和找到我的 YouTube 评论?”以及“我如何才能看到我在 Youtube 上的所有评论?’,非重复问题是“是什么导致某人吃醋?以及‘我能做些什么来避免嫉妒某人?’。有两种方法适用于这个问题:
- 通过自动编码器方法训练的序列编码器和用于分类的动态池
- 具有逻辑回归和 XGBoost 分类器的词袋模型
ngrams = 4 且 min_df = 0 的词袋模型在 XGBoost 的情况下实现了 82 %的准确度,相比之下,在 Bi LSTM 和 attention 的文献中报告的最佳准确度为 89.5%。这里实现的编码器方法实现了 63.8%的准确度,这低于其他方法。我发现这很有趣,因为 autoencoder 的实现和这种方法考虑了可变长度序列的短语和单词之间的相似性。或许,可以通过改变动态池矩阵的维度、不同的数据清理方法以及拼写检查来提高效率。
分类器可以基于三种不同的评估指标进行比较,即对数损失、auc 和准确性。对数损失或交叉熵损失是分类器输出的概率分布相对于类别标签的真实概率分布有多不同的指示符。接收器操作特性绘制了真阳性率对假阳性率,曲线下面积(auc)为 0.5 对应于随机分类器。AUC 越高,分类器越好。准确度是一个简单的指标,用于计算正确预测标签的比例。
在这篇文章中,我使用准确性作为比较的标准,因为没有理由不这样做。完整的代码可在这里获得。
船首模型
如图所示,当 min_df 从 0 变为 600 时,对于 ngram = 4,精度从 80%降低到 72 %。min_df 根据计数对词汇表中出现的 ngrams 进行阈值处理。语料库中出现频率低于 min_df 的任何 ngram 都被忽略。不使用超过 4 的 n gram,因为当 n gram 从 3 增加到 4 时,精度变化可以忽略不计。使用 Tf-idf 矢量器而不是计数矢量器来加速计算,并且它还少量地提高了精度(对于一个数据点不到 1%)。通过 XGBoost 运行相同的输入可以获得 82%的精度。
对于 BOW 模型,参数 sweep 词汇表的大小范围从 703912 (n-grams = 4 和 min_df =0)到 1018 (ngrams = 1 和 min_df = 600)。
自动编码器和动态池 CNN 分类器
上图显示了实现的模型,类似于 Socher 等人的 Word2Vec 嵌入是根据 Tensorflow Word2Vec 开源发布,使用 skip gram 模型,以 100000 的词汇量生成的。在这些嵌入中,共享相似上下文的词具有较小的余弦距离。关键问题是处理不同长度的问题。通过训练自动编码器来压缩句子的信息内容。这种方法背后的主要动机是通过比较整个句子以及句子中的短语来找到句子之间的相似性。不同长度的问题通过如下所述的上采样和动态池来解决。
使用左图所示的方法对句子进行编码。这三个单词和两个编码被认为是生成相似性矩阵的输入。使用 Tensorflow 对自动编码器进行训练,如右图所示。右图描述了编码器和解码器的架构。我为编码器和解码器使用了单层神经网络,也可以考虑多个隐藏层。多批字被连接并馈入编码器,在理想情况下,解码器的输出应该与输入相匹配。神经网络的均方误差损失用学习率为 0.1 的梯度下降优化器最小化。1e-4 的 L2 正则化系数用于编码器和解码器权重。
这里的 autoencoder 使用任意两个词进行训练,可以批量训练。它不同于 Socher 等人使用的方法,作者对整个句子进行编码,并通过将其展开为一个问题来解码。展开自动编码器在 Tensorflow 中很难甚至不可能实现。像 pytorch 这样的动态计算图构造工具可能更适合实现完整的方法。
整个句子及其中间编码可以用作上采样和动态池阶段的输入。在上采样阶段,通过重复从向量中随机选择的编码来对所考虑的问题对的较小向量进行上采样,以匹配其他问题编码的长度。为每个短语向量生成成对的相似性矩阵,并且可变维度矩阵被汇集成 n pool×n pool 的矩阵。我用的是 npool = 28。这个矩阵被馈送到 CNN 分类器,以分类为重复或不重复。npool 的超参数优化也可以提高精度。该模型的准确率为 63.8 %。
问题
我面对一些与 sklearn 的逻辑回归有关的问题。该模型确实输出了正确的分类标签,但却输出了错误的概率。我还没有想出解决这个问题的办法。XGBoost 没有这个问题。
Github 回购
https://github.com/aspk/Quora_question_pairs_NLP_Kaggle
参考
最佳问题对匹配方法:王、志国、Wael Hamza 和 Radu Florian。“自然语言句子的双边多视角匹配。”arXiv 预印本 arXiv:1702.03814 (2017)。
理解交叉熵损失和可视化信息:【http://colah.github.io/posts/2015-09-Visual-Information/
展开递归自动编码器的方法:Socher,Richard,et al .〈释义检测的动态汇集和展开递归自动编码器〉神经信息处理系统进展。2011.
Word2Vec 嵌入式 tensroflow 开源发布:https://github . com/tensor flow/tensor flow/blob/r 1.9/tensor flow/examples/tutorials/word 2 vec/word 2 vec _ basic . pytensor flow:https://www.tensorflow.org/
DYK flexdashboard 解决了数据科学家的 javascript 文盲问题
原文:https://towardsdatascience.com/dyk-flexdashboard-solves-data-scientists-javascript-illiteracy-96b82a8d7f?source=collection_archive---------6-----------------------
Image Courtesy: https://unsplash.com/search/colors?photo=5IHz5WhosQE
问题:
I-am-a-R-coder 数据科学家的最大问题是他们在网络友好的交互式可视化方面遇到的巨大障碍。因为在大多数组织中,数据科学家的角色不仅仅是构建复杂的统计模型,更多的是从数据块中提取有价值的见解,其最终结果是(漂亮的)可视化。
这个世界还没有完全排除 Powerpoint 演示,但当前需要的是交互式仪表板,因为少即是多——仅在鼠标悬停时显示信息比将这些值刻在图表上好得多,交互式可视化也使分析师能够比静态图像输入更多的信息(需要时会显示出来)。
救援计划:
但是作为一个 R 主导的数据科学家,尤其是那些面临 js 挑战的数据科学家,移动友好的交互式可视化世界突然变得空白,这时你必须知道,有一种叫做'flex dashboard的东西,它将拯救你!
[## flexdashboard:用于 R 的简单交互式仪表板
仪表板分为列和行,输出组件使用 3 级降价标题(###)描述…
rmarkdown.rstudio.com](http://rmarkdown.rstudio.com/flexdashboard/)
虽然flex dashboard有很多不错的特性,但我想指出两点:
- 支持包含html widgets
[## R 的 html 小部件
HTML 小部件的工作方式就像 R plots,除了它们产生交互式 web 可视化。一两行 R 代码就是全部…
www.htmlwidgets.org](http://www.htmlwidgets.org/index.html)
2。灵活的 布局 (类似于自举)
[## flexdashboard 布局示例
此页面包括各种示例布局,您可以将其用作自己的仪表板的起点。
rmarkdown.rstudio.com](http://rmarkdown.rstudio.com/flexdashboard/layouts.html)
前者将 js 可视化库带到了 R 程序员的手中,而后者有助于将它们布置在一个响应性(移动友好)的网格布局中。文档使得从期望的布局开始变得非常容易(除非有非常复杂的业务需求,这是非常不可能的,因为它不是一个成熟的仪表板)
## Markdown *Code to create an interactive heatmap using d3heatmap```
library(knitr)
library(d3heatmap)
library(flexdashboard)url <- "http://datasets.flowingdata.com/ppg2008.csv"
nba_players <- read.csv(url, row.names = 1)
```### Stats by Player {data-width=650}
```{r}
d3heatmap(nba_players, scale = "column")
**还有,发货:**

Screenshot of Interactive Heatmap generated with above code snippet
一旦构建了可视化,有两个简单的部署选项:
1. [R-Shiny App](https://walkerke.shinyapps.io/neighborhood_diversity/)
2. [针织面料(如 HTML](https://beta.rstudioconnect.com/jjallaire/htmlwidgets-d3heatmap/htmlwidgets-d3heatmap.html)
通过很少的学习曲线(浏览文档和理解所需 htmlwidgets 的功能和参数的能力)和对 javascript 的零知识,
> Flexdashboard 支持 R-only 数据科学家部署交互式可视化(就像 js-wizard 一样——至少定制较少)
# 电商正在(几乎)吃掉一切。这是它的意思。
> 原文:<https://towardsdatascience.com/e-commerce-is-eating-almost-everything-heres-what-that-means-90d7328efc49?source=collection_archive---------28----------------------->

美国人口普查局的新数据显示,现代人对点击购物的喜爱正在增长。与此同时,商品目录正在减少,零售店面正在萎缩,美国就业市场的前支柱正在严重衰退。
各个行业的情况并不一致。经济的某些部分继续抵制互联网的邀请——尽管当你读这篇文章时,这种情况可能正在改变。
我们深入研究了人口普查局发布的[数据以及其他相关数据,以调查美国电子商务的现状,以及这对美国公民意味着什么。这是我们的发现。](https://www.census.gov/newsroom/press-releases/2018/estats-report.html)
# 电子商务悄然兴起
消费者仍然亲自购买他们的大部分产品,但是电子商务已经取得了重大进展。根据零售和目录销售(包括在线目录)的综合数据,2016 年消费者在网上花费了 13.5%的产品美元。
如果当前的电子商务趋势继续下去,2018 年在线购买将占所有消费品购买的近 17%,并可能主导一些子市场。2016 年,网购占业余爱好购买的 32%,包括书籍、玩具、体育用品和乐器。
这与 1999 年占消费者购买量不到 2%的电子商务相比是一个巨大的变化,这种快速变化与零售业的巨大变化相对应。

# 零售启示录
虽然网上购物让生活变得更容易,让消费者可以舒舒服服地坐在沙发上(和睡衣)点任何他们想要的东西,但所有重大的经济变革都有受害者。随着亚马逊和其他主要在线零售商的崛起,他们留下了实体零售连锁店的废墟,如 Borders,Blockbuster 和最近的[玩具反斗城](http://www.businessinsider.com/amazon-walmart-target-killed-toys-r-us-2018-3)。
更多的传统零售商可能会及时倒下。虽然梅西公司的股票自 2018 年初以来已经恢复了大约 50%,但该公司 6 月份每股 40 美元的高点与其 2015 年每股 72 美元的[高点相比相形见绌。与此同时,自 2017 年 12 月以来,西尔斯(也拥有 K-Mart)的股价一直低于每股](https://www.google.com/search?biw=1279&bih=722&tbm=fin&ei=i60eW7CpC83CzgLzkYyAAg&stick=H4sIAAAAAAAAAONgecRoyi3w8sc9YSmdSWtOXmNU4-IKzsgvd80rySypFJLgYoOy-KR4uLj0c_UNzKtyisqKeQDUEIrYOgAAAA&q=NYSE%3A+M&oq=mac&gs_l=finance-immersive.1.0.81l3.1111774.1111971.0.1113790.3.3.0.0.0.0.129.324.1j2.3.0....0...1.1.64.finance-immersive..0.3.324....0.Zt2uymnX_Bo#scso=uid_5rEeW7HhA4uV5wKDlafoDw_5:0)4 美元的[。随着世界上最大的在线零售商进军汽车维修领域,这个曾经的零售巨头已经被压低到](https://www.google.com/search?biw=1279&bih=722&tbm=fin&ei=5rEeW7HhA4uV5wKDlafoDw&q=sears&oq=sears&gs_l=finance-immersive.3..81l3.107323.108248.0.108602.5.5.0.0.0.0.101.423.4j1.5.0....0...1.1.64.finance-immersive..0.5.421....0.uMoFFTduLc0#scso=uid_U7MeW_7IFcTAzgK4y7QI_5:0)[与亚马逊](https://www.marketwatch.com/story/sears-shares-spike-after-announcing-tire-partnership-with-amazon-2018-05-09)合作的地步。
虽然分析师和评论员认为这些公司都是因为公司领导而不是电子商务而苦苦挣扎,但电子商务不可否认是它们压力的一部分。
# 专家对电子商务趋势的看法
随着实体零售商的消亡或缩减规模,它们的衰落对购物中心产生了残酷的影响。
哥伦比亚商学院(Columbia Business School)教授、包括西尔斯加拿大(Sears Canada)在内的几家零售品牌的前首席执行官马克·科恩(Mark Cohen)在一次采访中告诉我们,美国有大约 230 家顶级购物中心“不仅在生存,而且在蓬勃发展。”
然而,在顶级公司之外,许多公司都在苦苦挣扎。
瑞士瑞信银行在 2017 年报告称,预计到 2022 年,全国 1211 家购物中心中有多达四分之一将[关闭。很多](http://money.cnn.com/2017/06/02/news/economy/doomed-malls/index.html?iid=EL)[已经有了](http://www.businessinsider.com/american-retail-apocalypse-in-photos-2018-1#it-was-temporarily-used-by-religious-congregations-who-held-services-in-old-stores-in-september-2017-amazon-announced-plans-to-build-a-17-million-square-foot-fulfillment-center-in-its-place-3)。在一个特别具有讽刺意味的案例中,亚马逊买下并拆除了一个[克里夫兰地区的购物中心](http://www.crainscleveland.com/article/20170928/news/137036/amazon-makes-euclid-warehouse-go),代之以一个履行中心。这一趋势使得西蒙地产集团的股票大幅贬值,该集团拥有超过 130 家购物中心。
科恩说,在网络购物成为主要因素之前,今天失败的购物中心通常会将市场份额输给更新或更好的购物中心。他们仅靠一两家主要零售商和一小群专卖店勉强维持微薄的收入。但互联网时代迫使锚店缩减规模,导致本已疲软的商场关门。
# 固定轴环绕
科恩说,一些购物中心的业主试图通过安装健身房或攀岩墙,将他们的物业改造成“生活方式购物中心”。“一些二级商场正在实现这一目标,但很少,因为这需要大量投资。”科恩告诉我们。其他购物中心租用了呼叫中心、紧急医疗诊所、疗养院或社区大学的空间。
科恩说:“在很大程度上,他们基本上正在慢慢倒闭。”。“一个空置量越来越多的购物中心越来越像一家空荡荡的餐厅,这是许多人不想去的地方。”
随着房东收取的租金越来越少,他们也不太愿意在草坪护理或更换停车场坏灯等基本维护上投资。
科恩说:“购物中心呈现出‘不要去那里’的特点。然后它关闭,成为景观上的一个污点,损害当地经济,使当地社区迫切需要某种东西——任何东西——来取代它。
# 商业房地产卷轴
尽管这种损害在购物中心最为明显,但电子商务的兴起与零售地产的疲软有着明显的关联。
全国保险专员协会[在 2017 年](http://www.naic.org/capital_markets_archive/170601.htm)报告称,在 2009 年至 2016 年期间,约有 10%的零售物业处于空置状态。国家房地产投资者公布的数据[显示,商业地产的估值正在趋于平稳——特别是在中央商务区,PNC 房地产研究公司的数据显示,自 2015 年初](http://www.nreionline.com/finance-investment/latest-readings-show-commercial-property-prices-continuing-moderate)以来,美国累计关闭的商店多于开业的商店[。](https://www.bloomberg.com/graphics/2017-retail-debt/)

虽然在可预见的未来,美国似乎将继续失去实体零售点,但最糟糕的情况可能已经过去。总部位于芝加哥、专注于房地产行业的投资管理公司 JLL 表示,与 2017 年相比,2018 年的有效倒闭数量下降了 41%。
# 混合比
零售业的动荡改变了消费者可以进入的实体店的组合。根据美国劳工统计局的数据,美国零售商店的数量从 2008 年开始大幅下降。尽管零售商店自 2011 年以来有所恢复,但仍未达到 2001 年的数量,这是 BLS 有数据的最早年份。各个行业的复苏也不均衡。

与 2001 年相比,2017 年食品和饮料商店的数量增加了约 4%,而餐馆的数量增加了 33%。像沃尔玛这样的百货商店的数量增加了 45%以上。所有其他类型的零售商都看到自己的部门在萎缩——其中一些还急剧萎缩。电器商店、家具店、书店、体育和业余爱好商店以及杂货铺的数量都下降了至少 15%。

根据 JLL 公布的数据,这一趋势可能会继续,甚至可能会加速。在 2018 年 3 月的一次展示中,该公司表示,预计 2018 年开设的餐厅(1328 家)和一元店(1645 家)将超过其他任何一种商店的总和。
841 家服装店关门最多。虽然这并不奇怪(时尚行业是出了名的不稳定),但它们不会被取代。服装店关门比开张多 53%。

# 模糊界限
随着零售品牌努力保持相关性,它们已经整合了在线和面对面的存在,为客户提供更大的灵活性。梅西百货和其他商店已经推出了他们所谓的“[点击并收集](https://www.cnbc.com/2016/01/13/like-it-or-not-click-and-collect-is-here-to-stay.html)”,让顾客在网上购买产品,然后几个小时后在附近的商店取走。
科恩说,本质上,这些零售商把他们的商店作为一个履行网络。但不清楚这种做法对他们的底线有多大帮助,如果有的话。
他说,点击收集“非常昂贵”,因为它“完全违背了商店的组织方式。”商店支付人工成本,让一名工人先把产品搬到展示区,然后让另一名工人把它们放在旁边的房间里。
科恩说,商店希望点击收取顾客在他们访问期间购买其他东西,但不清楚这种情况发生的频率。他说,零售品牌对这些计划的成功一直讳莫如深,但值得注意的是,梅西百货[在 2017 年关闭了 68 家门店](https://parade.com/537063/sphillips/macys-releases-list-of-stores-closing-in-2017/),而[将在 2018 年再关闭 11 家](https://clark.com/shopping-retail/major-retailers-closing-2018/)。
快餐连锁店也加入了“点击领取”的潮流。星巴克在 2015 年推出了[移动点餐](https://news.starbucks.com/news/starbucks-mobile-order-pay-now-available-to-customers-nationwide),允许顾客在短暂逛店取咖啡前在线点餐和支付。Dunkin Donuts 在 2016 年通过他们的 DD Perks 应用程序推出了类似的选项,麦当劳在 2017 年跟风。
# 弹出式零售
一些品牌,包括[耐克、Birchbox 和 Kanye West](https://www.insider-trends.com/top-50-pop-up-stores/) ,已经把实体店变成了他们自己的活动。弹出式商店在一个特定的地方短时间内提供独家商品。
科恩说,弹出式商店为新企业表达和建立品牌提供了一个很好的机会,但它们也代表了一个病态零售生态系统的另一个症状。这些商店通常出现在长期休眠的零售空间,科恩说,房东大幅折扣弹出式租金,甚至可能免费提供空间。
科恩说:“房东的存在是一个空商店。
具有讽刺意味的是,[易贝](http://www.dailymail.co.uk/sciencetech/article-3982264/Is-future-shopping-eBay-pop-shop-tells-Christmas-presents-buy-based-facial-reactions.html),[亚马逊](https://www.amazon.com/b/ref=s9_acss_bw_cg_FYS_3c1_w?node=14303222011&pf_rd_m=ATVPDKIKX0DER&pf_rd_s=merchandised-search-2&pf_rd_r=091BQKWHWWW6TED0TY5G&pf_rd_t=101&pf_rd_p=486f4087-ceb1-4474-9c15-84a4cb56cce1&pf_rd_i=17608448011), [Etsy](https://www.etsy.com/pages/dossier) 和其他网络零售商都在黄金地段开设了华丽的弹出式商店。因此,正是那些造成零售地产疲软的品牌找到了直接从中受益的方法。
# 整个经济领域的电子商务趋势
虽然电子商务对零售业的影响最为明显,但在线平台仍在侵蚀经济的各个方面。

根据人口普查报告,2016 年近 65%的制造订单是在线处理的,高于 1999 年的 18%。基于制造业的电子商务在 2016 年的出货量为 3.5 万亿美元,实际上让零售电子商务相形见绌。
该部门采用电子商务的部分原因是其业务关系的性质。当企业对企业的客户定期订购同样的东西时,人类处理交易的优势会迅速减少。消费者也基本上看不到这种变化,他们通常只看到成品。
随着我们越来越接近消费者,电子商务变得不那么流行了。电子商务占制造商销售分支和办事处销售额的 46.2%,占所有其他商业批发商总销售额的 27.2%。2016 年,商店货架上的大多数产品仍然是通过电子商务平台以外的途径到达那里的。
# 自助服务
经济中的服务部门仍然对电子商务的入侵具有惊人的抵抗力。根据人口普查数据,只有 4.2%的服务销售是通过在线平台进行的。

然而,某些服务部门比其他部门更容易接受在线平台。基于电子商务的平台在航空运输部门以及旅行安排和预订部门取得了重大进展。
# 抗药性
尽管 WebMD 和其他专注于健康和保健的网站盛行,但健康和保健部门一直抵制电子商务的影响。
根据人口普查数据,即使在目录渠道,2016 年也只有 23%的药物、健康辅助设备和美容辅助设备是在网上购买的——而与此同时,健康相关产品的购买在所有渠道都有所增长。

这种脱节吸引了科技初创企业和科技巨头的注意。【2017 年 8 月,亚马逊推出了一系列药房基本药物,包括布洛芬、泻药和抗过敏药物。此举引发了连锁药店 Rite-Aid、Walgreens 和 CVS 投资者的不安,他们担心亚马逊可能会成为下一个进入处方药游戏的公司。
这种易激动是恰当的。2018 年 6 月 28 日,[亚马逊以不到 10 亿美元的价格收购了 PillPack](https://techcrunch.com/2018/06/28/amazon-buys-pillpack-an-online-pharmacy-that-was-rumored-to-be-talking-to-walmart/) 。这家总部位于波士顿的初创公司将药丸(包括处方药和维生素)预先分类并包装到一卷塑料袋中。到了下一次服药的时间,顾客拿出下一个袋子,撕开它,然后服药。到了续杯的时候,[药丸包](https://www.pillpack.com/how-it-works)会给保险公司开账单,然后送货上门。
PillPack 在这个领域并不孤单。总部位于纽约市的创业胶囊公司还将处方药送到顾客家中,并自动处理医生和保险公司的配药。虽然 Capsule 还没有被更大的公司收购,但它正在成长;根据 LinkedIn 的数据,自 2016 年以来,该公司的员工人数增加了两倍多。
# 缩小:互联网和通货膨胀
除了让消费者更容易获得他们想要的产品,电子商务可能对日常生活产生更大和更广泛的影响:保持低价。
国际货币基金组织(International Monetary Fund)发表的一篇 2017 年[论文](https://www.imf.org/~/media/Files/Conferences/2017-stats-forum/session-3-coffinet.ashx)得出结论,互联网销售在短期内缓解了通胀——尽管作者不确定互联网将如何长期影响通胀。
导致这种情况的影响错综复杂,但归结起来主要有两点:
1. 电子商务让顾客更容易比较价格,这也让零售商更难提价。
2. 电子商务减少了对昂贵的物理基础设施的需求,这使得在线零售商能够保持低价。
虽然低通胀对购物者来说是好事,但对工人来说并不总是好事。随着商店关门或削减成本,零售业的工作机会正在减少。趋势如此糟糕,以至于纽约市服装店的零售人数已经连续四年下降[。考虑到该市人口在 2010 年至 2017 年间增长了 5.5%(T5),这一下降尤为显著。](https://fred.stlouisfed.org/series/SMU36935614244810001A)
# 包裹
电子商务趋势大大小小地改变了我们的生活。它阻止了产品价格的攀升,但也削弱了美国经济长期依赖的部门。
目前,这一趋势没有停止的迹象。即使亚马逊开设了实体店,传统的小盒子零售的需求仍在继续减少。可能的结果似乎是一个购物中心更少、精品店更少、沃尔玛、一元店和餐馆更多的世界。
*本帖* [*原版*](http://blog.visme.co/ecommerce-trends/) *最早出现在 Visme 的* [*视觉学习中心*](http://blog.visme.co/) *。*
# 对脸书的每一次反应都让它更加丰富。
> 原文:<https://towardsdatascience.com/each-reaction-on-facebook-makes-it-richer-b5ea07f1bbc7?source=collection_archive---------6----------------------->
2016 年初,脸书上标志性的 like 按钮增加了 6 个反应。脸书成功地将我们所有的情感冲动浓缩成一组六种反应。用户可以自由地表达他们对新闻内容的愤怒或悲伤。但是,这是脸书帮助广告商的一个微妙举措..随着人工智能能力的增强,它可以即兴发挥到未知的极限。

Reaction set available on Facebook
反应能力增强了。现在,我们可以对您在 Messenger 上的评论和私人对话做出反应。要理解它如何为脸书增加几个数字的收入,我们需要理解它是如何做生意的,以及资金是如何流入资产负债表的。
# ***脸书提款机的心脏。***
脸书的核心业务一直是为终端用户提供广告服务。*FB 的独特销售主张(USP)一直是有针对性的广告。它的算法选择特定广告的目标受众,这有助于广告商。它通过创建你的兴趣、爱好、你去过的地方以及你是否与有相似兴趣的人联系的图表来实现这一功能。简而言之,算法确切地知道你是谁,你在那个时间点想要什么,以及你避免什么。反应往往会给这个算法增加更多的力量。这有助于脸书为广告精选提炼受众。很明显,在这个信息时代,数据是新的货币,它仔细收集关于你“惊叹”的元素和你“愤怒”的事物的数据。*
## 这是如何工作的?一个例子。
我是一个普通的脸书用户,每天要花将近 30 分钟的时间浏览新闻,回复无数的新闻,查看朋友的信息,发布产品公告。几天前,我在微软的官方页面上“惊叹”了新 Surface Book 的产品发布。脸书算法足够聪明,能够了解我对平板电脑的渴望。我看到了安卓、Windows 和 iPads 的广告。然而,几天前发生了 WWDC。我对新 iPad Pro 的发布漠不关心。我也对新 iPad 的高价感到“愤怒”。脸书的算法这次聪明了亿万倍。他们发现我需要一台 Windows 平板电脑。他们不再给我提供关于安卓和 iPads 的广告。对于 iPads 的销售者来说,我不是他们的目标受众。范围缩小了。如果没有这些反应,这显然是不可能的。
> ***在单位经济学层面,它被称为每用户平均收入(ARPU)。脸书已经非常成功地从其平台上的每个用户身上赚钱了。这些反应有助于定向广告,并直接提高 ARPU。这增加了更多的广告收入。***

ARPU of Facebook for Q1 2017\. Source — FB Investor relations.
提升在所有有进一步成长空间的地区都是可见的。
## 不仅仅是钱。它提高了用户的参与度。
沉迷于脸书是众所周知的现象。这推动了每个人的参与,这是通过新闻源实现的。新闻提要是通过多种算法为每个用户量身定制的。这些算法需要更多地了解用户来提炼提要。这些反应为他们提供了更多的数据,并反过来使他们的最终结果变得更好。新闻提要与用户建立了非常私人的关系,并使他们与平台保持联系。随着脸书在人工智能(AI)和图像识别技术方面取得的进步,我们可以期待这种馈送会更加亲密。这一切都有助于脸书继续旋转广告之轮,赚取广告收入。
## 新闻供稿和脸书的未来。
脸书希望将新闻内容个性化到几乎无法忽视的程度。它希望将生活、文化、政治和哲学的所有元素嵌入我们的饲料中,以消费和实现其关于可持续全球社区的愿景。它已经成功地获得了人工智能和机器学习方面的能力,以改善平台的各个方面。它确切地知道我们喜欢什么,不喜欢什么,我们关心什么,我们“惊叹”什么,以及让我们“生气”的事情。为了了解更多,它甚至允许我们对帖子和消息的评论做出反应。
> **所有这些关于每个用户的校准数据都将被输入到机器学习算法中,以即兴发挥用户体验的各个方面,甚至可以用于开发一种现在无法想象的新产品。它知道的越多,人工智能产生的结果就越好。这就是所谓的机器学习的正反馈定律。**
***种种的推进,正使脸书权倾一时。收集的每一点数据都增加了它对社会的影响力。从政治到社会生活,世界的每一个角落都已经感受到了影响。我们应该让脸书通过其平台上大约有近 20 亿人的庞大数据来利用其力量促进人类进步。***
# 利用卫星图像预测早期玉米产量
> 原文:<https://towardsdatascience.com/early-corn-yields-prediction-using-satellite-images-dcf49b24efab?source=collection_archive---------10----------------------->
在一个以农产品分销为主要业务的家庭中长大,决定我们何时销售产品以及销售多少产品总是一个挑战,因为这些最终取决于在季节结束时收获多少产品。如果有一种方法可以预测在赛季结束时将会得到多少,我们将会更容易做出决定。这个项目的意义不仅仅是我的家族企业。当然,大企业可以使用这个模型来优化他们的价格和库存,政府可以为粮食短缺做准备,甚至农民如果知道地区产量,也可以被告知适当的销售价格。
先前的研究表明,卫星图像可以用来预测每种作物的种植面积[1]。这就留下了知道那些种植区的产量的问题。为此,这个项目旨在利用几幅卫星图像的数据来预测一种作物的产量。在这项研究中,我们选择玉米作为样本作物。玉米通常在 10 月份收获,因此,我最终的目标是只用 10 月份之前的数据来预测玉米产量。
在这个中页,我将概述该项目的简要总结,更多详细分析请访问[这里,](https://tpjoe.gitlab.io/)和该项目中使用的代码,请到我的 Github [页面](https://github.com/tpjoe/SpringBoard/tree/master/Project%20II)。
**数据来源**:
我查询了从 3 月到 12 月的谷歌地球引擎数据集中 4 颗卫星的图片(总共 146 GB)在县一级。这些卫星包括,
1. MODIS 地表反射率
2. MODIS 地表温度
3. USDA-FAS 表层和次表层水分
4. 美国农业部-NASS(用于掩蔽)
每年为一个县收集 38 幅图像(3 月至 12 月),每幅图像共有 11 个波段(前三颗卫星的波段总数)。该年和县的相应产量从美国农业部 QuickStats 的县级数据中收集。
我收集了 2010 年至 2016 年的数据。我将使用 2010-2015 年的数据进行训练,我们将使用 2016 年的数据进行测试。如果我们将来自每一年和县的数据视为一个视频(38 帧),则总共有 7,709 个用于训练集的视频和 1,353 个用于测试集的视频。
**探索性数据分析**
同样,详细的分析可以在我的[网页](https://tpjoe.gitlab.io/)上找到,这里我只放重要的数字和简要的分析。让我们首先看看图 1 中的图像是什么样的。

**Fig. 1.** Example of the image from the first band from each satellite (Scott County, Iowa, 2010).
现在让我们看看来自每个卫星的每个通道的值是否与图 2 和图 3 中该县的年产量相关。原来是有的!

**Fig. 2\.** The correlation between yearly-averaged values in each band of MODIS Terra Land Reflectance and corn yields.

**Fig. 3.** The correlation between yearly-averaged values in each band of MODIS Land Surface Temperature and USDA-FAS Land Moisture and corn yields.
**建模结果**
即使对图像进行了预处理,但要将所有 9,062 幅图像(每幅图像有 11 个波段,平均大小约为 100 × 100 像素)放在一起,训练过程将会极其缓慢。因此,在放入模型之前,我们对图像进行了进一步的处理。具体来说,我们将每个通道中的值装入 128 个箱*,即* 1 行。例如,在 MODIS Terra Land 反射率波段 1 中,我们会将该波段中的图像值分为 128 个像元,从 0 到 4000 等分这些值,然后使用该图像波段中非零像素的总数对计数进行归一化。这将大约 100 × 100 的整个图像缩小到只有 128 个元素。这背后的逻辑是基于每个农场的产量与其周围环境无关。因此,每个县的平均产量只应与该县农场的产量分布相关。图 4 总结了从数据收集到输入模型的过程,并显示了数据的维度。这种技术来源于以前的研究[2]。

**Fig. 4\.** Summary of the workflow from data collection, preprocessing, binning, and model concept.
数据经过充分预处理后,将被输入到模型中。我们可以将这些数据视为视频或音频文件,其中每年我们最多生成 38 帧(高度和宽度分别为 1 和 128)。因此,在本研究中,我们选择了 5 个可用于视频分类问题的模型,并针对回归问题对它们进行了修改。这些包括
1. 自建卷积神经网络(CNN)后接递归神经网络(RNN)。这里,长短期记忆(LSTM)被用于 RNN,因为它通常被用于避免香草 RNN 中的梯度消失/爆炸问题。
2. 与 1 相同。但是我们用可分离的 CNN 代替。
3. 兴健等人定义的 CNN-LSTM[3]
4. 三维(3D) CNN
5. 美国有线电视新闻网-RNN 其次是 3D 有线电视新闻网。
图 4 示出了单层 CNN-RNN 的概念,其中在 RNN 编码空间数据之前,将 CNN 应用于所有输入。RNN 然后把每一帧(时间输入)作为一个输入。来自 RNN 的序列输出然后被馈送到 CNN-RNN 的另一层(*即*堆叠层)或全连接层(具有适当的丢弃和正则化),最后被馈送到激活层以产生该县在某一年的预测玉米产量。
例如,Keras 中模型 1 的代码如下所示:
def CNN_LSTM(self):frames_input = Input(shape=self.input_shape)
vision_model = Sequential()
vision_model.add(Conv2D(64, (1, 2),
activation='relu',
padding='same',
input_shape=self.image_dim))
vision_model.add(BatchNormalization())
vision_model.add(MaxPooling2D((1, 2)))
vision_model.add(Flatten())
vision_model.add(BatchNormalization())
encoded_frame_sequence = TimeDistributed(vision_model)
(frames_input)
encoded_video = LSTM(256,
activation='tanh',
return_sequences=True)
(encoded_frame_sequence)
fc1 = Dense(64, activation='relu',
kernel_regularizer=regularizers.l2(0.05))
(encoded_video)
out = Flatten()(fc1)
out = Dropout(0.5)(out)
output = Dense(1, activation='relu')(out)
CNN_LSTM = Model(inputs=frames_input, outputs=output)
return CNN_LSTM
每种类型的模型的目标是有 4,500,000 到 5,200,000 个训练参数,并通过改变退出和隐藏层数进行粗略研究。每个模型的结果如表 1 所示。请注意,平均值的百分比误差是测试集的平均产量的百分比误差。
**Table 1.** Summary of model performance in term of mean absolute error and percent error from the mean of the test set (yields from year 2016).
下一步,我们想确定我们在哪个县做得最好,在哪个县做得不好。这将有助于识别模型中的弱点,并使我们能够做出更好的决定,看看我们是否可以信任预测。图 8 显示了美国各地 2016 年的地面真实玉米产量,图 5 和图 6 显示了地面真实预测值的百分比误差。
**Fig. 5\.** The ground truth corn yields across U.S. in 2016 (test set).
**Fig. 6\.** The percent error of the predicted value from the ground truth.
到目前为止,我们已经在每个县使用 38 帧视频进行年产量预测。在这最后一节中,我们想要调查我们可以多早预测产量,*即*减少每年的帧数。图 7 显示了 2016 年使用不同帧数预测玉米产量的平均误差。请注意,第 0 帧开始于 3 月,第 38 帧在年底。结果表明,随着帧数的增加,正如人们所预期的那样,误差越低。值得注意的是,我们可以看到,通过仅使用 20 帧(大约 8 月的第二周),我们已经可以实现低至 14.57%的百分比误差(相比之下,如果我们使用全年的图像,则为 10.46%)。这是玉米通常在 10 月收获前的 2 个月,尽管在温暖的州这甚至可能在今年晚些时候。因此,该模型将允许用户能够在季节早期预测县一级的玉米产量。

**Fig. 7\.** The mean absolute error (MAE) of the model using different number of frames input per year with using just 20 frames per year (August) is sufficient to predict with only 15% error from the mean value of yields in year 2016.
总之,我们展示了不同卫星图像(包括反射率、土地温度和土地湿度)与美国玉米产量之间的相关性。我们利用这些相关性构建了一个模型,该模型可以捕捉这些数据的空间和时间信息,以预测一年的玉米产量。测试集(2016 年玉米产量)上表现最好的模型是 ConvLSTM,与平均产量的百分比误差仅为 10.46%。为了实现早期预测,我们降低了每年所需的帧数(从最大的 38 帧)。结果表明,即使仅使用 20 帧,我们仍然可以获得良好的模型性能(百分比误差 14.57%)。一年中的第 20 帧对应于 8 月份,这是大部分玉米收获前的 2 个月。这将对农业分销和相关产业的商业模式产生重大影响。
**参考文献**
1. 多时卫星图像的作物分类。
2. 萨比尼、马克、吉利·鲁萨克和布拉德·罗斯。"理解基于卫星图像的作物产量预测."(2017).
3. 卷积 LSTM 网络:降水临近预报的机器学习方法*神经信息处理系统的进展*。2015.
# 提前停止
> 原文:<https://towardsdatascience.com/early-stopping-2f92c29ce0ae?source=collection_archive---------11----------------------->
有时候不值得走到最后,尤其是在超参数调优中
M ost 机器学习模型具有由用户固定的超参数,以便在底层数据集上构建这些模型的训练。例如,在训练随机森林时,您需要指定树的深度和数量(以及其他超参数)。还有许多其他的[【真实世界】](/demystifying-hyper-parameter-tuning-acb83af0258f)超参数的例子。一旦设置了超参数,模型的训练就可以用标准的优化器如梯度下降来处理。指定不当的超参数会导致更长的训练时间或有偏差的模型。所选超参数的质量通常是在一个公开的测试数据集上测量的。
[贝叶斯优化](/the-intuitions-behind-bayesian-optimization-with-gaussian-processes-7e00fcc898a0)是一种旨在尽可能少的迭代中识别最佳超参数的方法,但每次迭代都需要在评估超参数的质量并进入下一次迭代之前完成给定超参数配置的模型训练。在许多超参数调优问题中,数据科学家可能在训练结束(或开始)之前就知道某些配置不会产生很好的结果!).在本文中,我们将研究一种叫做冻融的方法,它将贝叶斯优化中超参数调整的 ***【提前停止】*** 系统化。因此,这种方法可以更有效地利用超参数调优中的计算资源,并减少整体调优时间。
# 冻融贝叶斯优化
> [冻融](https://arxiv.org/pdf/1406.3896.pdf)使用在训练机器学习模型的过程中获得的部分信息,以便决定是否暂停训练并开始新的模型,或者恢复先前考虑的模型的训练。
在模型训练期间提供的部分信息实质上是模型的训练损失,其指示模型对训练数据的预测有多差。一个例子是均方误差,它是每个例子的平均平方损失,由以下公式给出:

例如,线性回归的最佳权重使损失最小化,这就是为什么在图 1 中,损失比第二种情况高得多(并且模型差得多)。

Figure 1: loss of the trained model (red) for linear regression models (blue) trained on data points (yellow)([source](https://developers.google.com/machine-learning/crash-course/descending-into-ml/training-and-loss))
冻融的工作原理是假设大多数机器学习模型的训练损失大致遵循朝向未知最终值的指数衰减。这种假设被编码在他们的贝叶斯优化方法的先验中,这允许他们预测部分训练模型的最终结果。
更简单地说:
* 贝叶斯优化为我们正在优化的底层函数构建了一个代理模型
* 在这种情况下,这是一个高斯过程,通过观察函数值和预测域的其他点来建立。
* 在冻结-解冻 BO 中,来自模型训练的部分信息用于预测最终损失,然后将最终损失纳入替代模型
* 换句话说,代理模型是对模型训练结束时的预测
一旦已经预测了替代物,贝叶斯优化策略适于“打包”一篮子 **B = B_old + B_new** 候选模型,这些模型已经用不同的超参数值进行了部分训练或者没有进行训练。然后,贝叶斯优化程序将确定尝试哪些新配置以及恢复哪些“冻结”配置。更详细的解释可以在他们的[论文](https://arxiv.org/pdf/1406.3896.pdf)中找到。
在众所周知的问题上,冻融法相对于其他贝叶斯优化方法的性能增益如图 2 所示。

FT vs GP EI MCMC on MNIST (a), LDA (b), PMF/Movie Lens (c)
收益是显著的,但是严重依赖于训练损失遵循指数衰减的假设。这项工作的扩展可以研究这个假设不成立的模型。提前停止是 [Mind Foundry](http://mindfoundry.ai) 的一个重要研究领域,很快将在我们的贝叶斯优化 API[opta as](https://optaas.mindfoundry.ai)中实现。
【**更新**:我开了一家科技[公司](http://www.legislate.tech)。您可以在此了解更多
1: K .斯维斯基、j .斯诺克和 R. P .亚当斯。冻融贝叶斯优化。 [arXiv:1406.3896](https://arxiv.org/abs/1406.3896) 【统计。ML]
# 数据保留:处理带有许多缺失值和少于 1000 个观察值的数据
> 原文:<https://towardsdatascience.com/easy-data-science-with-r-and-python-diabetes-among-the-pima-indians-an-exploratory-analysis-d7bc321d0fa7?source=collection_archive---------7----------------------->
当前项目中使用的数据包含皮马印第安人后裔妇女中二型糖尿病的一些诊断方法,以及该个体是否患有二型糖尿病。数据集是在([https://www.kaggle.com/uciml/pima-indians-diabetes-database](https://www.kaggle.com/uciml/pima-indians-diabetes-database))从 Kaggle 获得的。总共有 768 个观察值和 9 个变量。数据集中的变量有:
* 怀孕
* 葡萄糖——2 小时口服葡萄糖耐量试验后的血浆葡萄糖浓度。
* 血压——舒张压(毫米/汞柱)。
* 皮肤厚度——三头肌的皮褶厚度(毫米)。
* 胰岛素— 2 小时血清胰岛素(μU/ml)。
* 身体质量指数——身体质量指数(千克/平方米)
* DiabetesPedigreeFunction——基于家族史确定二型糖尿病风险的函数,函数越大,二型糖尿病风险越高。
* 年龄。
* 结果—此人是否被诊断为二型糖尿病(1 =是,0 =否)。
# 预处理
library(readr)
library(tidyverse)
library(dplyr)
library(knitr)
# 概观
glimpse(Diabetes)Observations: 768 Variables: 9
$ Pregnancies
$ Glucose
$ BloodPressure
$ SkinThickness
$ Insulin
$ BMI
$ DiabetesPedigreeFunction
$ Outcome
# 类型转换
## 因素
结果变量需要转换成分类变量。在不久的将来,它将被订购用于分析目的。
Diabetes\(Outcome <- as.factor(unlist(Diabetes\)Outcome)) Diabetes\(Outcome <- factor(Diabetes\)Outcome, levels=c("1", "0"), labels = c("Positive", "Negative")) summary(Diabetes$Outcome)Positive Negative 268 500
我们可以看到没有患糖尿病的人几乎是患糖尿病的人的两倍。虽然目标变量的行数没有统一的界限,但这应该足够了。
我们只需要确保你的模型有足够的数据来学习如何区分这两者。
## 数字的
以下变量:
`* Glucose`
`* BloodPressure`
`* SkinThickness`
`* Insulin`
`* BMI`
需要从其当前整数类转换为数值变量。这些变量具有十进制值,如果没有这些值,可能会产生误导性的结果,并扭曲这些医学测试所代表的特定风险范围。
Diabetes\(Glucose <- as.numeric(Diabetes\)Glucose) Diabetes\(BloodPressure <- as.numeric(Diabetes\)BloodPressure) Diabetes\(SkinThickness <- as.numeric(Diabetes\)SkinThickness) Diabetes\(Insulin <- as.numeric(Diabetes\)Insulin) Diabetes\(BMI <- as.numeric(Diabetes\)BMI) Diabetes\(Age <- as.integer(Diabetes\)Age)
# 处理缺失值
数据集中 6/9 的变量有许多零标记。在分别对每一列和每一行求和后,数据集中似乎有 763 个零值。令人担忧的是,这几乎代表了我们 100%的观察结果。
list( Column = colSums(Diabetes0),
Row = sum(rowSums(Diabetes0)) )$Column
Pregnancies 111
Glucose 5
BloodPressure 35
SkinThickness 227
Insulin 374
BMI 11
DiabetesPedigreeFunction 0
Age 0
Outcome 0 $Row
[1] 763
# 怀孕
值“0”不一定意味着它是缺失值。例如:*一名妇女的怀孕记录为零,因为这名妇女没有怀孕。*
这是一个例子,说明在对数据进行丢失值的预处理时,您必须非常小心。零不代表它不见了。然而,除了这一点,零值在传递给机器学习模型时可能会产生问题。当变量为零时,像回归这样的技术可以给你一个输出的估计。另一种处理零的方法是绑定变量,然后创建一个分类变量。
`Diabetes$Pregnancies <- ifelse(Diabetes$Pregnancies==0, "No", "Yes") %>% factor()`
> `summary(Diabetes$Pregnancies)`
>
> `No Yes 111 657`
# 胰岛素
胰岛素中 50%的行具有 0 值。让我们从实际的角度来看它。有时身体产生很少或没有胰岛素,这是 1 型糖尿病的一个迹象。但我怀疑这一次是不是这样。胰岛素对于糖尿病来说是一个非常重要的变量,但是当一个变量充满了缺失值时,你就必须采取措施了。你可以只是估算这些值,但这是医学数据,有一半的值是缺失的。在我看来,仅仅用它的意思来估算行是不合适的。这就是为什么再重要也要**去掉**的原因。这是你需要做出艰难抉择的时候之一。
Diabetes$Insulin <- NULL
# 表皮厚度
对于`SkinThickness`也可以这么说。31%的行的值为 0。实际上,一个人怎么可能有 0 毫米厚的皮褶。这个变量也没有给我们太多的用处。因此,我也将删除这个变量。
Diabetes$SkinThickness <- NULL
# 身体质量指数
身体质量指数可以补充其各自的肥胖标准范围。身体质量指数只有 11 0 个值,所以预计不会引起太多麻烦。如果它高得多,宁滨不会真正解决问题,因为分配的 bin 可能不是正确的 bin。
`Diabetes$BMI <- ifelse(Diabetes$BMI<19,"Underweight", ifelse(Diabetes$BMI>=19 & Diabetes$BMI<=25, "Normal", ifelse(Diabetes$BMI>=25 & Diabetes$BMI<=30, "Overweight","Obese"))) %>% factor(levels=c("Underweight","Normal", "Overweight","Obese"))`
> `list(BMI = summary(Diabetes$BMI))`
>
> `$BMI Underweight Normal Overweight Obese
> 15 108 180 465`
现在我看到`Underweight`有 15 行,这意味着有 15 行的身体质量指数小于 19,并且知道`BMI`有 11 个零值,我们知道大多数行都是零。因为太少了,所以我选择留着它。此外,我们已经删除了两个变量,我想保留尽可能多的数据,同时确保它可以增加价值。
# 葡萄糖
对于 2 小时的“口服葡萄糖耐量试验”(OGTT),如果在进行该试验 2 小时后,患者的水平低于 7.8 mmol/L,则认为患者没有糖尿病。为了对葡萄糖耐量水平进行分类,我们将使用以下标准:
- Hypoglycemia (Low Blood Sugar) - <2.2 mmol/L
- Normal/No Diabetes - >=2.2 mmol/L - <=7.8mmol/L
- Prediabetes (Hyperglycemia / High Blood Sugar) - >7.8 mmol/L - <=11.1 mmol/L
- Diabetes - >11.1 mmol/L
**虽然其中一个级别说此人患有糖尿病,但这不是最终的糖尿病。其他因素也必须考虑在内。为了避免误导,这里的“糖尿病”是指 ANME 的检测结果,而不是二型糖尿病的最终诊断结果**
该数据集中 2 小时 OGTT 的测量单位假定为毫克/分升(mg/dl)。它可以转换成毫摩尔每升(mmol/l ),这样我们就可以将定性测试结果应用于数值结果。将当前结果乘以 0.0555 会将其转换为以毫摩尔/升为单位进行测量。
Diabetes\(Glucose <- Diabetes\)Glucose*0.0555Diabetes\(Glucose <- if_else(Diabetes\)Glucose<2.2,"Hypoglycemia", if_else(Diabetes\(Glucose>=2.2 & Diabetes\)Glucose<=7.8,"Normal", if_else(Diabetes\(Glucose>7.8 & Diabetes\)Glucose<=11.1, "Hyperglycemia","Diabetes"))) %>% factor()list( Test Result
= summary(Diabetes\(Glucose) )\)Test Result
Hyperglycemia Hypoglycemia Normal
192 5 571
似乎 74%的参与者具有正常的葡萄糖水平,25%的参与者具有糖尿病前期/高血糖症/高血糖。只有 1%的人有低血糖症。
我对低血糖的主要担忧是,当我通过机器学习过程时,该水平可能不会在 k 倍交叉验证中出现。在这一点上我不能肯定地说,但这是值得注意的,并在未来牢记在心。
# 血压
测量血压时,使用两种方法:
** Systolic - Measures the pressure in blood vessels when the heart beats.
- Diastolic - Measures the pressure in blood vessels when the heart rests between beats.*
在该数据集中,仅报告了舒张压。这要求我们谨慎行事。
据疾病控制和预防中心报道,血压是用心脏收缩和心脏舒张单位来测量的。当它们被报道时,我们可以作出如下推论:
* 常态
*收缩压< 120mmHg,*
*舒张压< 80mmHg*
* 高血压前期
*收缩压> =120mmHg — < =139mmHg*
*舒张压> =80 — < =89mmHg*
* 高的
*收缩压:> =140mmHg*
*舒张压:> =90mmHg*
因为没有报道收缩压,所以我对这个变量感到不舒服。这是我的主观决定。
Diabetes$BloodPressure <- NULL
# 数字变量的可视化
# 年龄
ggplot(Diabetes, aes(y=Age, x=Outcome)) +
geom_boxplot() + geom_jitter()+ theme_bw() +
xlab("Outcome") + ylab("Age") +
stat_summary(fun.y=mode, colour="Orange", geom="point", shape=16, size=5) +
stat_summary(fun.y=mean, colour="purple", geom="point", shape=16, size=5) +
ggtitle(label="Age by Outcome", subtitle = "Orange=Most Frequent\nPurple=Average Age") +
theme(axis.text.x = element_text(face="bold",size=12), axis.text.y = element_text(face="bold",size=12), title = element_text(face="bold",size=12), axis.title = element_text(face="bold",size=12)) + scale_y_continuous(breaks=seq(20,80,4))

这个变量中似乎有很多噪声。患糖尿病的年龄没有明显的区别。
# 糖尿病谱系功能
ggplot(Diabetes, aes(y=DiabetesPedigreeFunction, x=Outcome)) + geom_boxplot() + geom_jitter()+
theme_bw() + xlab("Outcome") + ylab("DiabetesPedigreeFunction") + stat_summary(fun.y=mode, colour="orange", geom="point", shape=16, size=5) +
stat_summary(fun.y=mean, colour="purple", geom="point", shape=16, size=5) + ggtitle(label="Diabetes Pedigree Function by Outcome", subtitle = "Orange=Most Frequent\nPurple=Average Age") + theme(axis.text.x = element_text(face="bold",size=12), axis.text.y = element_text(face="bold",size=12), title = element_text(face="bold",size=12), axis.title = element_text(face="bold",size=12)) + scale_y_continuous(breaks=seq(0,3,0.5))

Scatter Plot of the Diabetes Pedigree Function with the average and most frequent amount
有趣的是,`Diabetes Pedigree Function`似乎没有给出糖尿病结果的清晰图像。这应该是一个分数,分数越高,你越有可能患有糖尿病。这也是一个有很多噪音的变量。
# 分类变量(占结果的百分比)
# 怀孕
(pregnant <- table(Diabetes\(Pregnancies, Diabetes\)Outcome, dnn = c("Pregnant", "Outcome")) ) Outcome
Pregnant Positive Negative
No 38 73
Yes 230 427pregnant %>% prop.table(2) %>% round(2) %>% kable(format = 'html') Positive Negative
No 0.14 0.15
Yes 0.86 0.85
怀孕似乎并不一定会增加患糖尿病的几率,因为患或没患糖尿病的女性中至少有一次怀孕的比例是相同的。
# 肥胖
(bmi <- table(Diabetes\(BMI, Diabetes\)Outcome, dnn = c("BMI", "Outcome")) ) Outcome
BMI Positive Negative
Underweight 2 13
Normal 7 101
Overweight 44 136
Obese 215 250bmi %>% prop.table(2)%>% round(2) %>% kable(format = 'html') Positive Negative
Underweight 0.01 0.03
Normal 0.03 0.20
Overweight 0.16 0.27
Obese 0.80 0.50
毫不奇怪,80%的糖尿病女性肥胖,16%超重。据报道,只有 3%的人体重正常。在没有糖尿病的女性中,50%肥胖,27%超重,20%正常。
# 葡萄糖
(glucose <- table(Diabetes\(Glucose, Diabetes\)Outcome, dnn = c("Glucose Level", "Outcome")) ) Outcome
Glucose Level Positive Negative
Hyperglycemia 132 60
Hypoglycemia 2 3
Normal 134 437glucose %>% prop.table(2) %>% round(2) %>% kable(format = 'html') Positive Negative
Hyperglycemia 0.49 0.12
Hypoglycemia 0.01 0.01
Normal 0.50 0.87
49%的女性糖尿病患者高血糖呈阳性,50%的女性血糖水平正常。令人惊讶的是,葡萄糖水平似乎不能清楚地区分糖尿病患者。显然,高血糖症患者更有可能患有糖尿病,但根据上表,其程度非常低。
不出所料,87%没有糖尿病的女性血糖水平正常。
# 最终数据
summary(Diabetes)Pregnancies
No :111
Yes:657Glucose
Hyperglycemia:192
Hypoglycemia : 5
Normal :571BMI
Underweight: 15
Normal :108
Overweight :180
Obese :465 DiabetesPedigreeFunction
Min. :0.0780
1st Qu.:0.2437
Median :0.3725
Mean :0.4719
3rd Qu.:0.6262
Max. :2.4200Age
Min. :21.00
1st Qu.:24.00
Median :29.00
Mean :33.24
3rd Qu.:41.00
Max. :81.00 Outcome
Positive:268
Negative:500
在我接下来的文章中,我使用这个数据集来创建一个决策树分类器。
> 如果您有任何问题或顾虑,请发表评论进行讨论,我邀请任何对此感兴趣的人加入。谢谢你
原文可以在我的博客中找到:[用 R 和 Python 实现简单的数据科学](https://easydsrp.com/posts/2018-11-06-diabetes-among-the-pima-indians-an-exploratory-analysis/)
# 带 Spark 的简单度量和立方体
> 原文:<https://towardsdatascience.com/easy-metrics-and-cubes-with-spark-32b883fe7d76?source=collection_archive---------17----------------------->
你有没有参加过这样的会议:双方在同一个指标上有两个不同的数字?从这个指标中得到的任何见解都将被遗忘,获得正确数字的斗争将会开始。从长远来看,这种情况会引发一个更大的问题,那就是对你的数据、你的方法以及最终对你的团队完全缺乏信任。

Photo by [Micaela Parente](https://unsplash.com/@mparente?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)
提供值得信赖的数据源,建立管道以便其他人不需要重复计算,并提供唯一的真实来源,这基本上是数据工程师的主要工作。
但是……我们应该建哪些管道呢?与业务最相关的指标是什么?我们需要在哪个维度打破它们?
就命名、度量和维度达成一致是一项复杂的工作。我们相信我们的分析师同事能够找到并达成最佳定义。这一部分非常耗时,所以我们希望将他们从任何样板活动中解放出来,以便从数据中分析和提取见解。
为了增加复杂性,我们希望让我们的同事能够自主工作。我们将为他们部署和维护数据管道,但在我们找到促进生产的指标之前,有一个完整的“试错”过程。
## 我们如何促进分析自主性?
命名解决方案很简单;构建 it,没那么简单:
- *为你的同事提供工具,让他们的日常工作变得简单。*
在 [Schibsted 中,我们正在构建工具](https://bit.ly/2mDUoND),以便于[访问数据](https://medium.com/@mitxino77/bigdata-sql-query-engine-benchmark-e8605f355464)。但是如果没有干净、整洁、连贯的数据,这些都是没有用的。数据民主的第二面来了:为正确的受众转换和准备正确的数据。理想情况下,只做一次。
我们在这方面的贡献是尽可能减少将数据转化为价值所需的代码行数和复杂性。为我们的同事提供一个安全的库,以便从包含数百万行的原始数据中创建聚合指标。

“A child walking along a park path to catch up with their family” by [Jelleke Vanooteghem](https://unsplash.com/@ilumire?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)
## 度量生成库
让我们从一个典型的用例开始:
> 分析师 M____ 希望从该数据集中提取指标 X、Y 和 Z,并按维度 a、b 和 c 对其进行分组。
你认为最简单的版本是什么?简单易行:
`SELECT col_1, col_2, count(*) FROM my_table GROUP BY col_1, col_2`
为什么我们要为这样简单的用例创建一个库呢?如果像 SQL 这样的东西如此简单、冗长和有意义,为什么还要把代码复杂化呢?因为我们工程师在日常工作中会遇到其他类型的问题。可靠性、可扩展性、自动化、警报和监控、质量等问题
我们需要生成一个软件,我们可以安排它在一个可伸缩的系统中运行,无论何时它需要运行,都是一致和正确的。我们需要知道什么时候出错(失败、不运行、奇怪的结果……)。我们需要将我们的同事 M____ 的这一段代码转换成适当的数据管道。
## 第一个简单指标
指标可以总结为维度组合(浏览器、城市和类别)的值(x 的数量)。我们添加了一个域来提供一些额外的上下文和一个惟一的标识符。我们也强烈鼓励在维度中包含一些时间框架值。
这个小片段非常容易在我们公司的 Jupyter 之间共享,作为交互验证的服务,也可以在以后与我们的自动化工程师共享。虽然这里还有一个问题:你用的是哪些数据?
这些指标背后的神奇之处在于,它们并不真正关心它们使用哪个数据源。让我换一种说法,有一些最低要求,如维度和`userId`列需要存在,但我们没有针对维度 A 或 B 或不同日期的特定代码。只需插入一个数据框,就可以得到指标。

Photo by [Bernard Hermant](https://unsplash.com/@bernardhermant?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)
## 事情变得复杂了
在这个简单的用例之后,分析师想要知道的经常性指标是`UNIQUE xxx`。使用 SQL 也很容易,只需添加`DISTINCT`标记就可以了。你甚至在 Spark 里还有一个`countDistinct()`的方法。那是什么问题呢?您不能合计唯一计数。Android 中的唯一用户 iOS 中的唯一用户= =移动中的唯一用户是不成立的。您可能在两个平台上有相同的用户,这意味着您将计算相同用户的副本。
我们修改了 spark 库,给我们一些我们称之为小计的东西。这样,我们就可以计算出一个维度的`ALL`值里面的唯一用户。这是一个非常有用的功能,可以防止我们手动改变数据帧来计算每个维度的`ALL`度量值。还记得阶乘增长有多快吗:2 维> 2 种排列;3>6;4>24;5>120;…
好吧,让我为我们的库给这个问题的简单性感到骄傲:列出你想要计算小计的维度,就这样。重新计算指标,您将看到类似这样的内容:
## 多维数据集与度量标准
用户从来都不容易,他们总是想要越来越多,并且他们中的每一个人都有他们一生中非常特殊的一次用例。通过生成指标而不是计算最终的 KPI,您使他们能够根据相同的指标创建和调整尽可能多的 KPI。但是您也给了他们更多的工作,因为他们需要为每个维度过滤他们需要的维度,并且他们需要在一周内汇总所有指标以获得每周值(请记住,唯一计数除外!!`7*DailyUsers != 1*WeeklyUsers`)。
也有两种使用这些指标的方法:一种是使用指标作为`metric`列中的值;以及那些喜欢将每个指标视为一列的人。简单的度量方法会给我们第一个版本,但对于探索性分析来说,第二个版本确实更容易也更安全,这被称为[立方体](https://en.wikipedia.org/wiki/OLAP_cube)。
在我们的简化范围内,我们会付出更大的努力。我们如何让我们的同事变得如此简单,以至于他们可以毫不费力地从度量方法转变为立方方法?同样,我们提供一个`MetricCalculator`类来计算数据帧的度量值,我们提供一个`CubeCalculator`来做完全相同的事情:
## 实现可重用性
这个库背后的整个想法是让我们的生活更容易,在这个过程中,我们开发了一些不错的功能。这是一个迭代的故事,从一个简单的度量开始,到一个更复杂的度量,最后到立方体。但我们也发现了开发全局函数和转换的机会,我们推广了最佳实践,并简化了为非工程师构建数据管道的过程,我们还提供了广泛的开箱即用过滤器,用于使用我们最受欢迎的数据集并转换为统一的命名约定。
我们已经开始推广这个库,并使它能够在我们所有的数据发现产品中使用,我们希望这将是通往“*单一真理来源*”之旅的又一步。
希望你喜欢这个帖子,
*- Iker*
# 使用 Udpipe 简化 R 中的文本分析
> 原文:<https://towardsdatascience.com/easy-text-analysis-on-abc-news-headlines-b434e6e3b5b8?source=collection_archive---------4----------------------->

Courtesy: [https://pixabay.com/en/news-daily-newspaper-press-1172463/](https://pixabay.com/en/news-daily-newspaper-press-1172463/)
文本分析被视为数据分析的黑箱之一。这篇文章的目的是介绍这个简单易用但有效的 R 包`udpipe`用于文本分析。
# 关于 udpipe 包
[UDPipe](https://github.com/bnosac/udpipe) — R 包提供了*语言无关的*对原始文本的标记化、标注、词条化和依存解析,这是自然语言处理中必不可少的一部分。
# 输入数据集
这包括 ABC 网站在给定时间范围内发布的全部文章。每天 200 篇文章的量和对国际新闻的良好关注,我们可以相当肯定地说,每一个重大事件都在这里被捕获。这个数据集可以从 [Kaggle Datasets](https://www.kaggle.com/therohk/million-headlines) 下载。
# 摘要
加载基本摘要所需的包:
library(dplyr)
library(ggplot2)
了解已发表新闻文章的基本分布:
news <- read.csv('abcnews-date-text.csv', header = T, stringsAsFactors = F)news %>% group_by(publish_date) %>% count() %>% arrange(desc(n))## # A tibble: 5,422 x 2
# Groups: publish_date [5,422]
publish_date n
1 20120824 384
2 20130412 384
3 20110222 380
4 20130514 380
5 20120814 379
6 20121017 379
7 20130416 379
8 20120801 377
9 20121023 377
10 20130328 377
# ... with 5,412 more rows
试图了解标题出现的频率:
news %>% group_by(publish_date) %>% count() %>% ggplot() + geom_line(aes(publish_date,n, group = 1))

在我们继续执行文本分析之前,让我们将年、月和日分开
library(stringr)news_more <- news %>% mutate(year = str_sub(publish_date,1,4),
month = str_sub(publish_date,5,6),
date = str_sub(publish_date,7,8))
让我们看看数据按年份的分布情况:
news_more %>% group_by(year) %>% count() %>% ggplot() + geom_bar(aes(year,n), stat ='identity')

# 预训练模型
Udpipe 包为各种语言(不是编程,而是口语)提供了预先训练的语言模型,我们可以使用`udpipe_download_model()`下载所需的模型
# 加载 R 包并准备好语言模型
library(udpipe)#model <- udpipe_download_model(language = "english")
udmodel_english <- udpipe_load_model(file = 'english-ud-2.0-170801.udpipe')
# 仅过滤 2008 年的数据
news_more_2008 <- news_more %>% filter(year == 2008 & month == 10)
# 注释 2008 年的输入文本数据
这是我们在`udpipe`中使用的第一个函数,用来开始我们的文本分析之旅。`udpipe_annotate()`采用语言模型并标注给定的文本数据
s <- udpipe_annotate(udmodel_english, news_more_2008$headline_text)x <- data.frame(s)
# 通用 POS
从给定文本中绘制词性标签
library(lattice)
stats <- txt_freq(x\(upos)
stats\)key <- factor(stats\(key, levels = rev(stats\)key))
barchart(key ~ freq, data = stats, col = "yellow",
main = "UPOS (Universal Parts of Speech)\n frequency of occurrence",
xlab = "Freq")

# 大多数出现的名词
既然我们已经有了带词性注释的课文,那就让我们来了解一下名词中最常见的词。
NOUNS
stats <- subset(x, upos %in% c("NOUN"))
stats <- txt_freq(stats\(token)
stats\)key <- factor(stats\(key, levels = rev(stats\)key))
barchart(key ~ freq, data = head(stats, 20), col = "cadetblue",
main = "Most occurring nouns", xlab = "Freq")

具有讽刺意味的是,仅仅在一个月内——2008 年 10 月 10 日——出现在报纸标题上的顶级名词没有一个带来乐观。
# 出现最多的形容词
很难找到一个不喜欢夸张的新闻机构,在英语中,你用形容词来夸大你的对象。所以,让我们来探索一下出现频率最高的形容词
ADJECTIVES
stats <- subset(x, upos %in% c("ADJ"))
stats <- txt_freq(stats\(token)
stats\)key <- factor(stats\(key, levels = rev(stats\)key))
barchart(key ~ freq, data = head(stats, 20), col = "purple",
main = "Most occurring adjectives", xlab = "Freq")

# 最常出现的动词
媒体的报道本质可以通过他们使用的动词的方式很好的理解。这些带来了乐观的迹象吗?还是仅仅注入了悲观情绪?动词的用法可以回答它们。
NOUNS
stats <- subset(x, upos %in% c("VERB"))
stats <- txt_freq(stats\(token)
stats\)key <- factor(stats\(key, levels = rev(stats\)key))
barchart(key ~ freq, data = head(stats, 20), col = "gold",
main = "Most occurring Verbs", xlab = "Freq")

有了像`charged`、`killed`、`drought`等等这样的词,看起来澳大利亚媒体对在公民中建立乐观心态并不感兴趣,就像任何典型的新闻机构都会寻找热点、热点、耸人听闻的新闻一样,它也这样做了。
# RAKE 自动关键词提取
是时候进行一些机器学习了,或者简单地说是算法。RAKE 是信息检索中提取关键词的最流行(无监督)算法之一。RAKE 是快速自动关键字提取算法的缩写,是一种独立于领域的关键字提取算法,它通过分析单词出现的频率及其与文本中其他单词的共现来尝试确定文本主体中的关键短语。
Using RAKE
stats <- keywords_rake(x = x, term = "lemma", group = "doc_id",
relevant = x\(upos %in% c("NOUN", "ADJ"))
stats\)key <- factor(stats\(keyword, levels = rev(stats\)keyword))
barchart(key ~ rake, data = head(subset(stats, freq > 3), 20), col = "red",
main = "Keywords identified by RAKE",
xlab = "Rake")

# 顶级名词——动词对作为关键词对
在英语中(或者可能在许多语言中),简单的一个名词和一个动词可以组成一个短语。比如,**狗吠**——用名词`Dog`和`Barked`,我们可以理解句子的上下文。对这些标题数据进行逆向工程,让我们找出热门短语——也就是关键词/主题
Using a sequence of POS tags (noun phrases / verb phrases)
x\(phrase_tag <- as_phrasemachine(x\)upos, type = "upos")
stats <- keywords_phrases(x = x\(phrase_tag, term = tolower(x\)token),
pattern = "(A|N)N(P+D(A|N)N)",
is_regex = TRUE, detailed = FALSE)
stats <- subset(stats, ngram > 1 & freq > 3)
stats\(key <- factor(stats\)keyword, levels = rev(stats$keyword))
barchart(key ~ freq, data = head(stats, 20), col = "magenta",
main = "Keywords - simple noun phrases", xlab = "Frequency")

众所周知的事实是,2008 年的金融危机不仅仅是美国市场的崩溃,而是全世界的热门话题,澳大利亚市场也不例外,这份分析将`Financial Crisis`列在首位,在几个话题之后是`Wall st`。
同样值得注意的是,这本杂志(尽管我们在上面已经看到它对突出负面新闻更感兴趣)帮助人们意识到甚至现任美国总统都不喜欢的`Climate Change`。
希望这篇文章能帮助你开始使用 R 语言进行文本分析,如果你想了解更多关于 Tidy 文本分析的知识,请查看 Julia Silge 的教程。这里使用的代码可以在 [my github](https://github.com/amrrs/text-analysis-with-udpipe) 上找到。
# 在手机上阅读漫画的简单方法:Python 3.6 和枕头
> 原文:<https://towardsdatascience.com/easy-way-to-read-comics-on-your-cellphone-python-3-6-and-pillow-104e0d38afbf?source=collection_archive---------8----------------------->
漫威还是 DC?超人还是蝙蝠侠?鸣人还是漂白剂?
所有这些都只与一件事有关…漫画!!!
当我们还是孩子的时候,总是有一种对漫画书的巨大热爱,翻开书页看到我们的英雄在行动是一种幸福。关于谁是最好的超级英雄的多次辩论,关于他们家族历史的严肃讨论,或者梦想自己拯救哥谭市,我们很多人都在童年创造了如此难忘的时刻。
时代过去了,但我们中的一些人仍然在寻找越来越多的漫画。在这个数字时代,人们可以轻松接入超高速互联网,随时随地阅读/下载自己喜欢的漫画书。然而,每当我们试图在手机上阅读漫画时,我们都会面临这样的问题:压缩页面中的每一帧,以便我们可以阅读帧中所写的内容。
每次你不得不这样做的时候,你不觉得有一种强烈的冲动,有能力削减每一帧,使其清晰和舒缓的眼睛吗?如果你的答案是“是”,并且你渴望学习 Python 中的新知识,那么这篇文章将帮助你在手机/平板电脑上轻松阅读漫画。

Spongebob Squarepants Comic(White parts have been labelled as “”GUTTER”)
我们来看看上面的《海绵宝宝》漫画。这张图片有 7 帧,如果我们将它们切片,我们将得到 7 张漫画的图片,可以在我们的手机上轻松阅读。输出在期望的位置保存为单独的图像,

Output: Individual frames images saved at desired location
在这里,我们将采取从上到下扫描图像的每一行的方法,然后绘制一幅黑白行的图片,白色用于装订线,黑色用于任何其他颜色。我们将再次从左和右列扫描图像,并绘制一张黑白图片。
这种方法将帮助我们获得每个帧的尺寸,然后将每个帧分别保存到我们的硬盘驱动器中。
我们将使用 Python v3.6 版和 PIL/Pillow(Python 图像库)包开发 Spyder v3.2 版。
## 软件要求
**Anaconda v 5.1
点击以下链接下载并安装 Anaconda for Windows、Mac
或 Linux。**
[](https://www.anaconda.com/download/) [## 下载
### 下载 1,000 多个 Python 和 R 数据科学包的 Anaconda 发行版,一个包、环境和依赖项…
www.anaconda.com](https://www.anaconda.com/download/)
**Python 3.6** 点击以下链接下载并安装 Python for Windows、Mac、
Linux 或其他。
[](https://www.python.org/downloads/) [## 下载 Python
### Python 编程语言的官方主页
www.python.org](https://www.python.org/downloads/)
**Python 映像库(PIL/Pillow)** 使用下面的
链接下载并安装用于 Windows、Mac、Linux 或其他系统的 PIL/Pillow:
[## 在 Windows 和 Mac 上为 Python 安装 PIL/Pillow/cImage
### Python 是什么?Python 是一种广泛使用的编程语言,在这里的许多计算机科学课程中都有使用
wp.stolaf.edu](https://wp.stolaf.edu/it/installing-pil-pillow-cimage-on-windows-and-mac/)
## Python 代码:
点击下面的链接获得完整的代码,
***Python 2*** Python 2 和包 *PIL* (Python 映像库)。[https://github . com/Mozilla monks/comicstrip/blob/master/comicstrip](https://github.com/mozillamonks/comicstrip/blob/master/comicstrip)
***Python 3*** 在这个版本的代码中,我们实现了使用*枕头*包代替*PIL*(Python 3 中不支持)。
*Pillow* 是 *PIL* 的一个分支,在 Python 3 中增加了一些用户友好的特性。[https://github . com/sohamsil/comicstrip/blob/master/comicstrip _ python 3.6](https://github.com/sohamsil/comicstrip/blob/master/comicstrip_Python3.6)
让我们从第一步开始,导入必要的库!
import sys
import inspect
import zipfile
import os
import PIL
import fnmatch
from math import log
from PIL import Image
from PIL.ImageFile import Parser
from PIL.ImageEnhance import Contrast
from PIL.ImageFilter import BLUR
from optparse import OptionParser
from PIL.ImageOps import autocontrast
由于大多数漫画都有白色的装订线空间,让我们创建一个名为 *gcolor* 的变量,并将值指定为 255(RGB)。此外,每个槽框的尺寸为 *gwidth* = 10 和 *gheight* = 10。
gutter color
gcolor = 255# gutter width and height
gwidth, gheight = 10, 10
我们需要从水槽中去除噪声并数字化图像,让我们通过创建一个变量*对比度*并赋值 0.8 来改变对比度。(您可以根据需要更改该值)
contrast = 0.8
在我们继续我们的方法之前,创建一个名为 *barrier* 的变量,它将帮助我们区分装订线和漫画其余部分的颜色。
***关卡*** (以 1 到 255 的刻度来表示)。如果颜色的值小于屏障的值,颜色将转换为黑色,否则将转换为白色。在我们的例子中,我们选择值为 210。
barrier = 210# debug method
def debug(switch, args):
if switch:
callerframe = inspect.getouterframes(inspect.currentframe())[1]
line, caller = callerframe[2], callerframe[3]
context = "%s:%d" % (caller, line)
print("%-20s:" % (context), " ".join(map(str, args)))def nopfn(args):
pass# We will now create our class called “page”,
class page(object):
"""A page of the book"""
现在让我们来看看我们的方法。定义一个方法***_ isGutterRow()***来判断一行是否为装订线,并返回值 TRUE 或 FALSE。
def _isGutterRow(self, left, row, right):
"""Is the row from [left, right) a gutter?"""
nongutter = [x for x in range(left, right) if gcolor !=
self.img.getpixel((x,row))]
return len(nongutter) == 0
类似地,我们为列定义了另一种方法。***_ isGutterCol()***检查一列是否为装订线,并返回值 TRUE 或 FALSE。
def _isGutterCol(self, col, top, bot):
“””Is the column from [top, bot) a gutter?”””
nongutter = [r for r in range(top, bot) if gcolor !=
self.img.getpixel((col,r))]
return len(nongutter) == 0
每遇到一行,我们都会通过 ***_getRow()*** 方法传递,进一步细化一帧的上下边界。确定一个帧的上限值和下限值后,该方法返回这两个值。
def _getRow(self, l, startRow, r, b):
debug(self.debug, "startRow:", startRow)
if startRow >= b:
return (-1,-1)# move down as long as the rows are gutter
row1 = startRow
while row1 < b and self._isGutterRow(l, row1, r):
row1 += 1debug(self.debug, "row1:", row1)
if row1 == b:
return (-1, -1)# There are no more rows , we have finished the image
We assume a frame height of at least fheight(minimum frame height)
pixels and add it to the value of row1 as those rows can be
skipped. Next we check if we have reached the bottom of the frame,
else we check more columns until we reach the bottom of the framerow2 = row1 + self.fheightdebug(self.debug, "row2 starting with:", row2)
if row2 > b:
return (-1, -1)# probably looking at the area after the last row (e.g. pagenum)
while row2 < b and not self._isGutterRow(l, row2, r):
row2 += 1debug(self.debug, "row2:", row2)
if row2 - row1 < self.fheight:
return (-1, -1) # Not a proper framereturn (row1, row2)def _prnfn(self, symbol):
print(symbol),
sys.stdout.flush()def _nlfn(self):
print
***_getRows()*** 帮助我们跟踪图像中的所有行,并让我们确定这些行的帧边界。该方法有两个参数,self 和 startRow。
***_isGutterRow()*** 和 ***_getRow()*** 被调用,第一个检查一行是否为装订线,第二个返回一帧的顶行和底行。
def _getRows(self, startRow):
top, rows = startRow, []
count = 0
l,r,b =
self.lignore,self.img.size[0]- self.rignore,self.img.size[1]-1while True:
top, bot = self._getRow(l, top, r, b)
if top != -1:
debug(self.debug, "got row:", top, bot)
rows.append((0, top, self.img.size[0]-1, bot))
top = bot + (gheight//2)
count += 1else:
debug(self.debug, "No more rows")
break
debug(self.debug, "rows:", rows)
return rows
类似于行,我们每遇到一列都会通过 ***_getCol()*** 的方法来传递,进一步细化一帧的边界。在确定一个帧的最左边和最右边的值之后,该方法返回这两个值。
def _getCol(self, startCol, t, b):
debug(self.debug, "startCol, t, b:", startCol, t, b)
r = self.img.size[0] - 1
if startCol >= r:
return (-1,-1)# move right as long as the columns are gutter
col1 = startCol
while col1 < r and self._isGutterCol(col1, t, b):
col1 += 1
if col1 == r:
return (-1, -1)
There are no more columns, we have finished the image# We assume a frame width of at least fwidth(min.frame width)pixels
and add it to the value of col1 as those columns can be
skipped.Next we check if we have reached the right most column of # the frame, else we check more columns until we reach the right
most column of the framecol2 = col1 + self.fwidth
debug(self.debug, "Starting with column:", col2)
if col2 > r:
return (-1, -1) # no frame here - just gutter area on the rightwhile col2 < r and not self._isGutterCol(col2, t, b):
col2 += 1
debug(self.debug, "col2:", col2)
if col2 - col1 < self.fwidth:
return (-1, -1) # not a proper frame
return (col1, col2)
***_getCols()*** 帮助我们跟踪图像中的所有列,并让我们确定帧的边界。该方法采用三个参数:图像文件、单个帧的顶行和底行。
***_ isGutterCol()***和 ***_getCol()*** 得到调用。第一个函数检查一列是否是装订线,第二个函数返回单个框架的左列和右列。
def _getCols(self, rt, rb):
left, cols = 0, []
while True:
left, right = self._getCol(left, rt, rb)
if left != -1:
debug(self.debug, "got column:", left, right)
cols.append((left, rt, right, rb))
left = right + (gwidth//2)
else:
debug(self.debug, "No more columns")
break
debug(self.debug, "cols:", cols)
return cols
***_getFrames()*** 整体获取一个页面,返回页面中的所有框架。
def _getFrames(self):# Get all the rows, traversing the entire height of the image
rows = self._getRows(self.startRow)
debug(self.debug, "Got rows:", rows)# Determine the left and right columns for each row
frames = []
for rl, rt, rr, rb in rows:
debug(self.debug, "Row:", rl, rt, rr, rb)
cols = self._getCols(rt, rb)
debug(self.debug, "Got Columns:", cols)
frames.extend(cols)debug(self.debug, "=== Frames:", frames)# Now try to further trim the top and bottom gutters of each
frame (left and right gutters would already be as tight as
possible) and then extract the area from the original imagefimgs = []
for (fl, ft, fr, fb) in frames:
debug(self.debug, "Refining:", fl, ft, fr, fb)
newt, newb = self._getRow(fl, ft, fr, fb)
if newt == -1 # The frame is already as tight as possible
debug(self.debug, "Cannot reduce any further")
newt, newb = ft, fbelse:
debug(self.debug, "Got:", newt, newb)fimg = Image.new("RGB", (fr - fl, newb - newt))
fimg = Image.new("RGB", (fr - fl, newb - newt))
fimg.paste(self.orig.crop((fl, newt, fr, newb)), (0, 0))
fimgs.append(fimg)
return fimgs
使用以下两种方法数字化和准备页面。
def _digitize(self, color):
if color // barrier == 0:
result = 0
else:
result = 255
return resultdef _prepare(self):
bwimg = self.orig.convert("L")
return Contrast(autocontrast(bwimg,10)).enhance(contrast)
.point(self._digitize)keys = ["startRow", "lignore", "rignore", "contents", "infile",
"pgNum","quiet","debug", "fwidth", "fheight"]
我们将为类 *page* 定义一个构造函数为 ***__init__()*** ,并根据我们将要处理的漫画页面的类型传递一个类的实例和其他参数。构造函数的参数如下:
***startRow(默认值:0)*** :从哪一行开始分析。这通常是
用于分析漫画的第一页,其中页面的某个顶部
包含标题(我们需要跳过)
***lignore,rignore(默认值:两者均为 0)***:扫描的页面可能在一侧或两侧有一些非白色的颜色,这会干扰装订线检测。当定位装订线时,这些参数告诉装订线检测算法通过 *lignore* 调整左边界,通过 *rignore* 调整右边界
***内容(默认值:True)***:
True =>*infile*是由页面内容组成的字符串
False = > *infile* 是保存要打开的页面文件名称的字符串
***infile*** :保存页面内容或页面文件名的字符串(取决于
contents 参数)
***安静*** :不打印任何状态信息
***调试*** :启用调试打印*宽度*,f *高度*(一帧的最小宽度和高度)
def init(self, **kw):
object.init(self)
[self.setattr(k, kw[k]) for k in page.keys]
quietFns = {False:(self._prnfn, self._nlfn), True:(nopfn, nopfn)}
self.prnfn, self.nlfn = quietFns[self.quiet]
if self.contents:
parser = Parser()
parser.feed(kw["infile"])
self.orig = parser.close()
else:
self.orig = Image.open(self.infile)
self.img = self._prepare()
self.frames = self._getFrames()
将每个帧作为图像文件导出到指定的目的位置,同时为每个帧的名称添加前缀和计数器。
def getargs(parser):
(options, args) = parser.parse_args()
kw = {}
kw["infile"] = options.infile
if kw["infile"] is None:
raise ValueError("Input File Not Specified")
kw["prefix"] = options.prefix
kw["startRow"] = options.startRow
kw["lignore"] = options.lignore
kw["rignore"] = options.rignore
kw["filePat"] = options.filePat
kw["quiet"] = options.quiet
kw["gwidth"] = options.gwidth
kw["fwidth"] = options.fwidth
kw["fheight"] = options.fheight
kw["debug"] = options.debug
kw["fileList"] = args
return kwparser = OptionParser(usage="%prog [options]", version="%%prog %s
(_version),description="Split a comic page into individual frames")parser.add_option("-q", "--quiet", action="store_true",dest="quiet",
help="Don't print progress messages to stdout [default:%default]")parser.add_option("-d", "--debug", dest="debug",action="store_true",
help="Enable debug prints [default:%default]")parser.add_option("-f", "--file", dest="infile",type="string",
metavar="FILE",help="Name of the input file")parser.add_option("", "--prefix", dest="prefix",
help="Prefix for outputfiles")parser.add_option("", "--left-ignore", type="int",dest="lignore",
metavar="PIXELS",help="How much of the left
margin to ignore when detecting rows [default:%default]")parser.add_option("", "--right-ignore", type="int", dest="rignore",
metavar="PIXELS",help="How much of the right margin to
ignore when detecting rows [default:%default]")parser.add_option("", "--startrow", type="int", dest="startRow",
metavar="PIXELS",help="From which line of the each page
(other than the first page) should the processing start
[default:%default]")parser.add_option("", "--gutter-width", dest="gwidth",
metavar="WIDTH",help="Minimum width of the gutter
[default:%default]")parser.add_option("", "--min-width", dest="fwidth", metavar="WIDTH",
type="int",help="Minimum width of a frame [default:%default]")parser.add_option("", "--min-height", dest="fheight",
metavar="HEIGHT",
type="int",help="Minimum height of a frame [default:%default]")parser.set_defaults(quiet=False,prefix="cstrip-",lignore=0,rignore=0,
startRow=0,gwidth=15,fwidth=50,fheight=50,debug=True)kw = getargs(parser)
## 终端中的调用:
`$ comic.py [options]`
有效选项有:
***—版本*** :显示程序的版本号并退出。
***-h,—帮助*** :显示简短的帮助信息并退出。
***-q,— quiet*** :不将进度消息打印到 stdout【默认:False】。
***-d,—调试:*** 启用调试打印【默认:假】。仅用于调试
普通用户不需要启用此功能。使用-d 选项时启用'-q'
会有所帮助,这样常规进度显示就不会
干扰调试输出(反之亦然)。
***-f 文件,— file=FILE :*** 输入文件的名称**(必选参数)。**这个
可能是一个图像文件的名称。
***—前缀=前缀*** :输出文件的前缀。**(强制参数)**
单个帧以下列格式的名称保存到文件中:
*<前缀>00.jpg、
<前缀>01.jpg
<前缀>02.jpg
…* 前导零的数量根据输出帧的数量自动调整。如果您想将输出文件保存到一个特定的目录,只需将目录前缀添加到文件前缀
(例如:前缀/tmp/foo-)
***—left-ignore = PIXELS***:当
检测行时,忽略多少左边距。
【默认值:0】有时(尤其是扫描的漫画)页面中间的
边缘会一直有阴影,使得装订线“非白色”。该
会干扰沟槽检测算法,并阻止
成功检测到沟槽。此参数告诉应用程序在检测装订线时应该忽略左侧多少像素。
注意:这并不意味着页边距左边的像素在
最终输出中被丢弃——这只是意味着它们在装订线
检测期间不被考虑。
***—right-ignore = PIXELS***: *检测行数时忽略多少右边距【默认:0】。与“-左-忽略”相同,除了这是用于
右侧。*
****—startrow = PIXELS***:*从每一页(除第一页
外)的哪一行开始处理【默认:0】。对于扫描的漫画,页面顶部的装订线
可能会有阴影,从而干扰
装订线处理算法。该参数告诉应用程序在检测页面中的行时要跳过多少个
像素,从而允许算法
跳过阴影。**
*****—gutter-WIDTH = WIDTH***:*最小的装订线宽度[默认值:15]***
******—最小宽度=宽度* :** 一帧的最小宽度【默认:100】。更精确的值加速了帧提取算法***
*****—最小高度=高度:*** 一个框架的最小高度【默认:100】。更精确的值加速了帧提取算法**
**谢谢你 Sohini Ghosh。**
# 电子商务:如何利用统计数据增加销售额?
> 原文:<https://towardsdatascience.com/ecommerce-how-to-use-statistics-to-increase-sales-1830cf7eb684?source=collection_archive---------2----------------------->

Photo by [Bench Accounting](https://unsplash.com/@benchaccounting?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)
销售分析中的回归分析和聚类案例。
在前一部分,我们看了一下电子商务商店的表现。我们从虚荣 KPI(会话)和相当好的业务 KPI(交易)的组合开始。它有着相当有趣的关系。

Number of sessions (horizontal axis, blurred) by number of transactions (vertical axis)
如何弄清楚数据的意义并理解其中的关系?在前一部分,我们探讨了相关性,这导致了更多的问题。下一步将涉及两种统计方法的使用:回归分析和聚类。
**预测销售额—回归分析** 在统计建模中,**回归分析**是估计变量之间关系的统计过程。这正是我们正在寻找的。
我们将使用 Python 和 stat 模型库构建一个模型,根据会话数预测事务数。
模型的结果可以表示为一条直线(线性回归)。

Predicting number of transactions based on number of sessions
我们的模型面临两个直接挑战。逻辑上讲不通。它无法解释没有会话或会话数量非常少的情况。如果会话等于零,模型预测有四个事务(截距值为 3.99)。
2。 [R 平方值为 0.232](http://blog.minitab.com/blog/adventures-in-statistics-2/regression-analysis-how-do-i-interpret-r-squared-and-assess-the-goodness-of-fit) 。我们的模型只解释了*23%*的数据可变性。这使得 77%的数据无法解释,从商业角度来看这是不可接受的。
让我们尝试调整我们的模型,以适应会话数量较少的情况。我们将强制截距等于零(零会话意味着零事务):

新模型在逻辑上更有意义,但*明显更差。*它只解释了 *13%的数据可变性*,令人失望。我们总是可以尝试通过使用不同的回归分析方法来改进 r 平方参数,如[套索](https://en.wikipedia.org/wiki/Lasso_(statistics))或[梯度下降](https://en.wikipedia.org/wiki/Stochastic_gradient_descent)而不是最小二乘法),但这超出了本文的范围。我们将探索另一种有趣的方法。
**了解受众——聚类分析** 聚类分析或聚类是对一组对象进行分组的任务,使得同一组(称为聚类)中的对象彼此之间比其他组(聚类)中的对象更相似(在某种意义上)。
为什么这对电子商务很重要?没有一般的用户或客户。相反,我们可以试着区分有一些共同点的不同群体(集群)。
我们通过将数据集分成几个不同的组来说明聚类的概念:

Examples of clusters
我们可以使用像 SPSS 或 BigML 这样的统计软件包来处理数据。
在下面的例子中,我们采用了两个变量:会话数和事务数。集群的数量被设置为四个。每个圆圈代表一个集群,大小代表其中的实例数量。

Diagram showing distance between clusters — level of similarity.
在这个简化的示例中,我们已经完成了四个集群。虽然它不会提供丰富的见解,但它将有助于理解集群的概念。

以上四个聚类可能比回归分析更能解释我们的受众。例如,聚类 2(非常高的事务数)是由回归分析没有捕捉到的异常值组成的。
每个集群由多个参数描述:实例(观察)的数量、事务和会话的中心点。集群中的所有实例都与他的中心点相关。直方图中显示了距该点的距离。
**从聚类分析中获得洞察力。现实生活场景。**
拥有行业知识会有所帮助。良好实践将要求在分析中包含更多相关数据。我们应该从哪里开始?我们可能要考虑以下变量:
——客户获取方式(付费、电子邮件、社交等)。),
-交易明细(如产品类别)

Adding more variables may brings better insights
聚类分析是一种很好的平衡行为。我们的目标是更好地了解电子商务受众,同时我们试图保持集群数量较低,并确保它们具有商业意义。
*下一个问题:我们能根据过去的业绩预测未来的销售吗?*
[回到第 1 部分——揭开虚荣心 KPI 的神秘面纱](https://medium.com/@maciej.piwoni/demystifying-vanity-kpis-e59557b41ab1#.47vq84xnq)
# 糟糕的地址每年给印度造成 100-140 亿美元的损失
> 原文:<https://towardsdatascience.com/economic-impact-of-poor-addresses-in-india-10-14-billion-a-year-11cc97cb40fc?source=collection_archive---------14----------------------->
对于新兴经济体来说,无组织、结构不良的寻址系统是主要的经济负担。我们估计,糟糕的地址每年给印度造成 100-140 亿美元的损失,约占 GDP 的 0.5%。
*本文大图最初出现在麻省理工学院的(*[*【MITs】)新兴世界博客*](http://mitemergingworlds.com/blog/2018/2/12/economic-impact-of-discoverability-of-localities-and-addresses-in-india) *。*
在地球上的 70 亿居民中,大约有 40 亿[1]没有合适的地址,无法在地图上以合理的精度定位他们的房屋、财产或企业。举例来说,考虑我们的一个作者在两个不同大陆的两个地址:

Figure 1: Every place needs an address. Crowded Old Delhi seen from the Jama Masjid. Photo Credit — Erik Torner
* **在美国:**【名称】,7116 Via Correto Dr,Austin,TX 78749:该地址的位置很容易找到,任何导航系统都可以在白天或晚上将您带到家门口;或好或坏的天气!这是一个结构化地址的例子。
* **在印度:**【姓名】,蒂拉学院,PO Agartala 学院,Agartala 799004:谷歌地图将这个地址解析为大约 76 平方公里的区域。公里。在阿加尔塔拉城。这个地址是非结构化的。
* 在上面的地址上添加一个地标,“蒂拉学院**靠近蒂拉学院湖**,..”将答案缩小到大约 3 平方公里。公里。到达目的地后,根据对居住者、房子或位置了解的详细程度,如果不是深夜或下雨,还需要 15-45 分钟。此外,基于地标的寻址是不常见的、不完整的并且也是不一致的。

**Figure 2: Most addresses in the developed world resolves within a narrow area, where those in India can resolve anywhere from town to a locality to (rarely) at a house level**
这些不仅仅是造成不便的一次性体验。无法为每个地址提供准确的位置,在许多方面影响了居民的生活。它抑制了当地行业的发展,如沙龙、面包店或小吃摊。它降低了便利设施的可用性,如创建银行账户和交付货物和服务(如电子商务),并延误了消防队和救护车等紧急服务。
# 对工业的经济影响
## 案例研究 1:物流和运输
如前一个示例所示,无法在合理的准确度内定位地址会影响运输商按时交付货物的能力。考虑一下电子商务行业,或者任何一个把商品送到一个地址的行业。在没有适当的地理编码的情况下,印度的大多数公司通过 PIN 码(PIN 代表“邮政索引号”)对包裹或货物进行“分类”,因为 PIN 码是在印度大多数书面地址中出现的唯一数字位置描述。
虽然按密码对交货和设施(存储交货和退货的货物)进行分类听起来是一个逻辑上可行的解决方案,但它有两个主要的实际问题:
* 在印度,大约 30–40%[2]的 pin 码书写不正确,导致货件发送路线错误,需要人工干预才能发送到正确的 pin 码
* 一个密码的平均面积约为 179 平方英尺。公里。约有 135,000 个家庭和 100,000 多个商业、教育机构、政府建筑等。对超过 25 万个地址的可交付内容进行排序,其中只有 30%的地址是结构化的,这带来了许多挑战。
我们将选择物流和运输行业中的一个领域来详细说明这些挑战。考虑一个电子商务,它正在以 30 CAGR[【3】](https://www.bloombergquint.com/markets/2017/09/28/morgan-stanley-bets-on-digital-to-forecast-6-trillion-economy-sensex-at-130000)的速度增长,受收入、消费和数字化[【4】](http://www.morganstanley.com/ideas/digital-india)增长的驱动,并且在可预见的未来预计将继续如此。印度消费者希望产品免费送货上门,这给电子商务公司带来了独特的负担,这在世界上大多数地方是看不到的。
当一个电子商务网站的产品在网上订购时,商品从卖家或仓库被取走,并被送到加工厂,在那里被分拣到目的地城市,这一过程被称为“第一英里操作”。然后在始发地和目的地城市之间进行长途运输。在“最后一英里操作”中,商品被送到配送中心,从那里被送到购物者的家里。图 3 展示了这个过程。

**Figure 3: The “last mile cost” in India is ~30% of the total cost of delivery**
在西方国家,结构化地址导致相对准确的地理编码,因此最后一英里的成本约为总成本的 10–12%[5]。在印度,同样的费用约占配送总成本的 30%;尽管印度的劳动力成本很低。额外的成本来自于司机在定位一个地址时所花费的更长的时间——多次停下来给收件人打电话或向路上的人问路,以及为寻找正确的位置而额外驾驶。
图 4。说明了向无法在内部消除歧义的地址发送邮件所面临的挑战。在缺少所需地址的经度的情况下,基于密码对地址进行分类,并且对一个密码的所有包裹进行分类、存储并从一个(或者有时是两个或更多个)递送中心进行递送。位于橙色 pin 位置的典型的基于 pin 码的分拣中心可以有 4-20 公里的递送“范围”(半径)。在缺乏对基于地址的负载分布的理解的情况下,这种中心的位置往往是不平衡的。例如,在这种情况下,一名送货骑车人行驶了大约 22 公里,而另一名骑车人行驶了大约 104 公里,几乎是第一名骑车人行驶距离的 5 倍。这些问题严重阻碍了这些中心提高生产率和降低成本的举措。

**Figure 4: The difference between a pincode-based sorting and local-address-based sorting. In this picture, the light orange area shows a typical pincode boundary. In this delivery center productivity can vary widely as optimal route planning becomes complex, as depicted by two delivery bikers’ routes**
另一方面,如果地址可以在家庭一级消除歧义,那么每个地方都可以有一个小的递送中心。在这种情况下,配送中心的平均“行程”会下降到 1-3 公里。在图 4 中,这种小型交付中心的位置用红色大头针表示,它们覆盖的区域用黄色表示。这使得能够进行基于地址的分拣的较小中心的生产率显著提高。
此外,地址地理编码的粒度更大,也使我们能够执行路线优化,并为快递员提供系统驱动的路线。我们以 Delhivery 为例,它是印度领先的电子商务公司物流供应商之一。
在 Delhivery,根据地址的类型/复杂性和地区的大小/形状,从基于密码的分拣转换到基于地区的分拣,将最后一英里操作的生产率提高了 40–60%。

**Table 1: An address-based sorting can result in a 40–60% better productivity**
这种最后一英里的高成本不成比例地影响了公司的底线。在表 2 中的一个简单分析中,我们证明了一个更好的地理编码可以将最后一英里的成本降低 40%,完全在当前技术的范围内,可以提高电子商务公司的盈利能力。

**Table 2: Illustration: An improvement in the last mile cost can swing the profitability of an e-commerce business**
即使对于印度的一个小行业,如电子商务交付,估计每年有 50 亿卢比(约 7 . 75 亿美元)的业务(截至 2017 年),更好的寻址方案每年可以节省约 65 亿卢比(约 1 亿美元)的成本。
对于物流和运输行业,同一框架可用于不同类型的货物和服务运输。即使在城市间运输的情况下,第一英里(例如,从客户或配送中心提货)或最后一英里(送货到户或企业)的交付都会受到无法解析地址的严重影响。
## 案例研究 2:贷款和金融服务
印度是一个信用匮乏的国家,有 6.42 亿人(高达 53%)被排除在正规金融产品之外,如贷款、保险和其他形式的信贷和金融服务。这对经济的影响是巨大的。麦肯锡估计,到 2025 年,印度数字金融服务的回报可以达到 7000 亿美元,并且可以额外创造 2100 万个工作岗位。
缺乏信用的原因有很多:缺乏可验证的身份(类似于美国的社会安全号码),在一个主要由现金驱动的经济中缺乏正式收入的证明,以及消除一个人的位置(无论是家庭还是工作场所)的复杂性。
因此,在过去两年中,在金融科技公司(fintech)的大型风险投资的资助下,100 多家初创公司开始提供连接借款人和贷款人的服务。
图 5 显示了这类服务之一承诺的典型流程。这个过程相当简单。一旦用户在线或通过应用程序申请并选择产品,他们通常会被要求提供 5-8 套文件,包括身份证明、地址、年龄和收入、教育资格、就业证明文件和银行对账单。

**Figure 5: Typical loan generation process promised by one of India’s many digital loan or financing start-ups**
信使从借书人那里取走这些文件。然后,这些文件(主要是纸质文件)经过扫描和代码转换,使用光学字符识别(OCR)保存在数据库中,并与借款人在贷款申请中提供的信息进行比较。
这一过程对大约 60%—70%的借款人非常有效,尤其是在大城市。根据我们对领先公司的调查,我们估计大约 70%的文档被认为是“匹配的”,并进入贷款处理的下一步,例如贷款资格分析、贷款批准等。,尽管只有一定比例的申请人有资格获得贷款。
然而,对于大约 30%的申请,申请人在申请中提供的地址与文件不符。要理解为什么,请考虑图 6 中同一栋房子的以下地址。

**Figure 6: Same address written in multiple formats in different documents**
替换为:对于同一地址:a)门牌号写为“TH-146B”、“146”、“146 单元”。b)该社区被称为"普尔瓦公园岭"和"普尔瓦公园岭",也简称为" PPR "。c)道路名称以两种方式拼写为“Goshala Road”和“Ghosala Road ”,其中一种完全省略。d)该地区被称为“哥鲁达查帕利亚”和“哥鲁达查帕利亚”。
换句话说,仅仅四个不同来源的官方地址验证文档就可以产生超过 50 种组合。因此,文件中提供的地址经常不匹配也就不足为奇了。由于这些信息的处理发生在一个集中的设施中,那里的人们不会知道“普尔瓦公园岭”和“PPR”是同一个社区。
对于 30%不匹配的文档,下面的过程开始,如图 7 所示。

**Figure 7: 30% of the applicants whose addresses do not match directly are either asked for additional documentations or have their addresses manually verified, adding to the time and cost for the service providers**
这导致贷款审批延迟,最好的情况下会延迟 5 天,有时甚至会延迟几周或几个月。这既影响了借款人,他可能急需用钱;而贷款人必须承担他在贷款最终处理之前本可以赚取的利息损失以及额外验证的成本。

**Table 3: Bad addresses delay verification and approval resulting in the loss of interest to moneylenders**
此外,居住地或企业是贷款风险评估过程中的一个关键因素,无法消除这一点在风险模型中表现出来,从而提高了利率,进而提高了贷款的总成本。
# 泛印度经济影响
我们对排名前三的行业——物流、制造业(包括消费品)和应急服务进行了类似的分析,得出了印度的成本估算。使用这种方法,我们的估计表明,不良地址**每年花费印度 100-140 亿美元,约占 GDP** 的 0.5%;参见表 4。

**Table 4: The economic cost of bad addresses in India**
还要注意的是,表 4 中的数字反映了不良地址的成本,但不包括拥有更好地址的额外好处,如生产率和收入的提高,这将导致企业和 GDP 的进一步增长等。
# 结论
容易被发现的地址对于像印度这样快速发展的经济体来说非常重要。地址不仅仅是一种便利,它对于推动自我强化的经济循环,进而改善下一个 10 亿印度人的生活和收入至关重要。消费者为了自己的方便而独立地识别和采用地址,而企业使用技术或第三方服务将这些地址解析成地理编码,以降低的成本交付产品和服务。
我们的案例研究分析表明,缺乏良好的寻址系统每年给印度造成至少 100-140 亿美元的损失,相当于其年度国内生产总值的 0.5%。随着印度经济在经济产出以及各种新业务和服务方面的持续增长,由于缺乏适当的寻址系统而导致的成本将显著增加。因此,印度需要考虑一种全新的方法来实现寻址系统的现代化,以提高效率。
# 参考
[1]40 亿人没有地址。机器学习可以改变这种情况
[2]样本来自 Delhivery 的 1000 万个地址的数据库
[3]摩根士丹利押注数字预测 6 万亿美元经济,Sensex 在 1,30000[https://www . Bloomberg quint . com/markets/2017/09/28/mor gan-Stanley-Bets-On-Digital-To-Forecast-6 万亿美元经济-sensex-at-130000](https://www.bloombergquint.com/markets/2017/09/28/morgan-stanley-bets-on-digital-to-forecast-6-trillion-economy-sensex-at-130000)
[4]摩根士丹利报告《印度的数字未来》【http://www.morganstanley.com/ideas/digital-india
[5]与亚马逊、联邦快递和史泰博电子商务的多个利益相关方的私人谈话
[6]数字金融如何促进新兴经济体的增长(2016 年 9 月)[https://www . McKinsey . com/global-themes/employment-and-growth/How-digital-finance-can-boost-growth-in-emerging-economies](https://www.mckinsey.com/global-themes/employment-and-growth/how-digital-finance-could-boost-growth-in-emerging-economies)
# 关于作者:
**Santa nu Bhattacharya 博士**是 Airtel 的首席数据科学家,Airtel 是全球最大的电信公司之一,拥有 4.5 亿多用户。他是一位连续创业家,曾在脸书 a 引领新兴市场手机,他是美国国家航空航天局戈达德太空飞行中心的前物理学家,也是麻省理工学院媒体实验室的合作者
**Sai Sri Sathya** 是麻省理工学院媒体实验室 REDX 和 Camera Culture Group 的合作研究员,之前在脸书的连通性实验室工作,专注于新兴世界的创新。他是一家致力于在边缘实现人工智能民主化的秘密模式初创公司的创始人
**Kabir rusto gi 博士**领导着印度最大的电子商务物流公司 Delhivery 的数据科学团队。他是一位已经出版的作者,之前是英国格林威治大学运筹学的高级讲师。
Ramesh Raskar 教授是麻省理工学院媒体实验室的副教授,领导麻省理工学院新兴世界项目,该项目旨在利用全球数字平台解决重大社会问题。
# 编辑命运
> 原文:<https://towardsdatascience.com/editing-fate-cdc50429757c?source=collection_archive---------4----------------------->
在世界将继续见证的所有技术进步中,就造福人类而言,很少能超过生命科学领域的突破:生物技术、流行病学和医学,仅举几例。与这些领域相关的行业,如医疗设备和药品,在未来几十年将继续经历巨大的变化。这一切都归功于允许模拟新药对身体的影响、加速化学化合物验证测试、甚至人类基因编辑的创新。
最近,通过对遗传密码具有重复出现的 DNA 序列的微生物和细菌的研究,为遗传学领域历史上最伟大的革命之一奠定了基础。这些重复被来自病毒的遗传物质片段打断,这些片段在被研究的有机体生命的某个时刻试图攻击原始细胞。这些片段作为细胞防御系统的“记忆”工作,因为它们存储了“侵略者”的身份。这种间断重复的配置被称为聚集的规则间隔的短回文重复(CRISPR,读作“crisper”)。当与一组被称为“Cas”的酶结合时,重复之间的“空间”中的遗传物质——即入侵病毒的遗传物质——可以用来引导酶,以便切除病毒并将其中和。
重大的革命在于科学家通过这种方法获得了在所需位置精确切割任何 DNA 序列的能力——并用新的预定义序列替换提取的序列。也就是说,可以更有效地研究由各种基因组变化引起的复杂疾病,最终可以在造成任何伤害之前解决许多遗传问题。多亏了这种新技术,以前科学上从未有过的程序变得触手可及。根据 Grand View Research 2017 年 3 月的一份报告,到 2025 年,基因组编辑市场估计将超过 80 亿美元。
在 2015 年 7 月为《新英格兰医学杂志》发表的一篇文章中,哈佛医学院和麻省理工学院的教员埃里克·s·兰德博士警告说,“编写”新的遗传密码(特别是在人类胚胎中)存在伦理风险。他还强调了一旦完全掌握这项技术,可以从这项技术中获得的好处。Lander 博士提到了一些例子,如与艾滋病相关的 HIV 病毒,它不会影响缺失 CCR5 基因的人。理论上,“删除”这种基因可以赋予特定生物体免疫力。血友病也可以通过编辑血液干细胞来解决,就像使视网膜细胞中的特定基因失活很可能防止某些类型的遗传性失明一样。
但是改变自然强加的生物现实的方法并不局限于 CRISPR 技术。通过采用三种现代项目发展趋势——创客运动(在这种运动中,企业家社区不是获得现成的设备,而是从现有的设备中创建自己的工具),开放架构(通过这种方式,信息可以在社区中自由共享)和开放设计(允许世界不同地区的人工作和修改特定的项目)—医生、工程师、设计师、家庭和患者通过 e-NABLE 网络参与创建假肢的过程。使用相对容易获得的设备和 3D 打印机渲染最终结果,可以为各种身体部位——手、下巴、腿——生产定制的假肢。下次我们将讨论这个话题:三维打印技术对行业和消费者的影响。到时候见。
# 对企业进行人工智能教育
> 原文:<https://towardsdatascience.com/educating-the-enterprise-on-ai-f1d206809910?source=collection_archive---------10----------------------->
采用人工智能的最大障碍是缺乏知识。企业公司和其他生态系统参与者需要学习什么?

很容易说,人工智能(AI)承诺的每个行业的变革都被夸大了。人工智能的嗡嗡声从过多的商业文章延伸到消费者意识。在[科技](https://www.vanityfair.com/news/2017/03/elon-musk-billion-dollar-crusade-to-stop-ai-space-x)和[科学](http://www.bbc.com/news/technology-30290540)领域的杰出人物甚至表达了对其快速扩散的担忧。
公司无视炒作,后果自负。机器学习和其他应用的人工智能解决方案确实对各行各业的企业产生了变革性的影响,早期采用者比那些只是涉猎的人看到了更多的价值。2017 年麦肯锡全球研究所的一项研究发现,公司对人工智能越熟悉,他们在业务中看到的机会就越多。考虑新的收入来源,而不仅仅是更多部门的成本节约。
那么,是什么阻碍了许多公司的发展呢?有几个因素,但更广泛采用的两个最大障碍是**访问**和**知识**。
在技术采用曲线的早期阶段,访问问题是常见的——干净、全面的解决方案仍然稀缺和昂贵,并且很少有供应商有跟踪记录。这一挑战现在正受到初创公司和老牌公司的机会主义者的猛烈攻击。有些在增加价值,但许多没有。你可以在各种[细分评论](https://www.techemergence.com/artificial-intelligence-industry-an-overview-by-segment/)和[厂商列表](https://appliedai.com/vendors/1)中观看他们的潮起潮落。
但是,光有渠道是不够的。从人工智能中实现价值最大化需要一种不同的思考问题和数据的方式。为了利用即将出现的新工具,需要应对几个挑战,而大企业无法独自克服这些挑战。
# 革命意味着快速变化
有些人会争辩说,我们以前也遇到过这种情况。第三次工业革命带来了无处不在的廉价计算,这是一场自 20 世纪 80 年代以来几乎没有减弱的重大技术驱动的剧变。行业已经采用和适应;有赢家也有输家。为什么当前的进步不是一种自然的进展,而是一些新的东西?
首先,数字时代的变化速度非常快。研究人员几乎一致认为,未来十年,世界数据至少每两年翻一倍。随着存储变得越来越便宜,各种设备越来越互联,产生数据来填充存储,增长率可能会加快。
数据的膨胀给各种规模和各种行业的企业带来了压力,造成了做某事的紧迫性。事实证明,做某件事很难,有几个原因。
首先,我们有前面介绍的访问问题。许多可供企业用来从数据中获得洞察力的人工智能工具仍处于研究阶段。一个典型的商业用户可以利用的人工智能应用是针对非常狭窄的用例,尽管如此,仍然可能是复杂和昂贵的。增加灵活性意味着建立一个团队,从头开始开发自己的应用程序。
但这导致了另一个问题:培训赶不上需求,人工智能专业知识的人才库很浅。虽然关于今天是否真的缺乏数据科学家的[辩论](https://www.linkedin.com/pulse/really-data-scientist-shortage-scott-nestler/),但这种辩论通常不会扩展到产品经理、运营团队和商业策略师的需求,他们知道如何以及何时应该利用人工智能来为自己服务。这整个生态系统的商业职能谁是人工智能意识是其成功应用的关键,而这种集体意识是很难实现的。
即使一家公司能够组建自己的跨职能人工智能团队,留住他们也可能是一场斗争。尤其是在拥有新生数字能力的组织中,拥抱人工智能所必需的文化和流程转型可能会来得很慢。也许数据丢失了,或者必要的数据规程丢失了。有时组织认为他们需要人工智能,但实际上只需要数据分析。或者,人工智能可能被视为对其他人工作的威胁,给办公室政治增加了一个新的困难层面。对于人工智能团队来说,这些情况会导致幻灭或沮丧,并最终导致减员。
# 工业界需要重返校园
对于希望利用人工智能的组织来说,让公司获得最新的工具和技术并不是银弹。相反,我们需要给人们提供他们需要的信息,以做出正确的决定,即人工智能可以在哪里帮助他们,以及如何在这个新的商业环境中进行批判性思考。知识是关键。
然而,大公司无法独自应对这一挑战。有几个不同的小组需要共同努力,以提高商业生态系统中的人工智能意识水平,每个小组都需要不同类型的知识。让我们来看看这些小组在努力建立对成功概念的理解时应该问自己的一些问题。
## 企业需要重新思考他们的商业模式
虽然他们可以自己创新,但在食物链的顶端,最大的组织往往是新技术的消费者。他们受益最大的是了解全局,以及推动其行业或部门职能的决策和方向的基本细节。因此,企业团队需要能够回答几个关键问题:
* 人工智能有哪些类型,它们最适合用来做什么?
* 我们需要哪些数据来支持每一种人工智能技术,我们从哪里获得这些数据?
* 我们如何准备自己的数据供 AI 使用?
* 我们的重点应该是降低成本,还是人工智能提供了一个新的收入机会?
* 我们应该雇佣内部数据科学团队,还是可以通过第三方黑盒解决方案来满足我们的需求?
最后一个问题与传统的“制造还是购买”的困境不太一样。相反,它更多的是关于知识应该生活在哪里。您是依靠第三方来告诉您如何最大限度地发挥企业数据的价值,还是应该始终在组织内部获取这些信息?这就引出了最后一个问题,哪些公司今天应该开始考虑:
* 我们的数据到底值多少钱?
能够回答这些问题的公司将成为当前工业革命的赢家。要找到答案,大企业需要在内部建立并保持对这些主题、其对行业的具体影响以及对客户的影响的广泛跨职能理解。
## 创业公司和科技公司需要重新思考产品策略
初创公司和更小、更灵活的科技公司通常是生态系统的创新者和新技术供应商。虽然他们通常更有条件(文化和人才方面,如果不是财政方面的话)来应对加速发展新技术所必需的 R&D,但他们也有自己的问题需要回答。例如,在考虑新产品时:
* 我们如何通过将人工智能添加到我们今天生产的产品中来创造独特的价值主张?
* 我们有哪些独特的数据或算法可以驱动人工智能——无论人工智能是我们的还是别人的?
* 对于一个可能被人工智能颠覆的行业或流程,我们有什么独特的见解?
* 产品经理如何将数据和人工智能融入产品战略和设计流程?
最后一个问题暗示了产品公司需要经历的必要的流程转型。如上所述,有许多初创的人工智能公司正在涌现,为行业提供解决方案。但是我们仍然处于人工智能产品开发的狂野西部时代,对于产品经理来说,还没有一种标准的方法来将数据和人工智能思维融入他们的设计中。
产品经理已经在营销、设计和技术的交叉领域工作,这个角色需要战略以及深入的分析思维、相当的沟通能力和足够的机智。要求他们也承担数据建模和机器学习算法是不是太过分了?
为了避免在产品经理的角色上倾倒太多额外的责任,我们将需要形成组织结构和过程,将人工智能的快速扩张所产生的新设计需求纳入其中。虽然他们已经有很多事情要做,但是产品经理需要在这些主题上进行自我教育,并成为转型工作的先锋。
## 学生和应届毕业生需要保持开阔的视野
第三组生态系统贡献者是刚刚进入劳动力市场的人。尽管 IBM 和谷歌等公司的人工智能项目赢得了公关,但人工智能领域的许多创新仍发生在学术机构中。因此,数据科学专业的毕业生离奇迹发生的地方很近,需求量很大。但是他们还没有完成他们的教育。
当这些人开始他们的商业生涯时,他们也应该问自己一些问题,例如:
* 我如何了解各种各样可能的人工智能解决方案,并避免陷入一个封闭的生态系统?
无论是在学术界还是在商界,在最喜欢的技术和供应商之外扩展知识都是困难的。来自微软和亚马逊等供应商的大型人工智能平台作为一站式商店很有吸引力,但它们可能很昂贵,可能不总是提供最好的数据或技术,而且供应商锁定往往阻止用户从其他地方寻找解决方案。在求职时,你的优势不仅在于保持中立,还在于拥有广泛的技术平台经验。
* 有哪些人工智能应用于不同问题的例子,使用了哪些数据?
结合最近的数据科学培训,了解人工智能如何应用于行业解决方案也将非常有用。如上所述,企业仍然在努力理解不仅是基本技术,而且如何应用它。因此,理论和实践知识的结合将成为热门商品。此外,准备好回答以下问题会让你受到欢迎,真的:
* 我可以做些什么来帮助我的同事了解在哪里以及如何使用 AI?
最近花时间探索和学习人工智能的人可能最适合向他们的新同事介绍人工智能的用途和好处。
# 人工智能的民主化需要途径和知识
我们探讨了人工智能技术的快速发展及其影响,它带来的挑战,以及商业生态系统的不同部分如何需要自我教育来应对这些挑战。虽然获得技术的机会正在突飞猛进地增长,但为了最大限度地发挥该技术对工业的价值,教育是必要的。
因此,工业界现在需要建立制度知识,在此基础上可以建立下一波应用创新。如果没有对人工智能可以解决什么样的问题、什么样的算法可以最好地解决这些问题以及需要什么样的数据来支持这些模型的内在意识,商业世界将继续朝着承诺的未来自动化乌托邦奋斗。
没有快速的解决方案,技术的企业消费者无法独自解决问题。相反,需要一种关于人工智能及其应用的*持续、系统的*教育努力,在当前产业的不同领域以及新兴劳动力中积累知识。
鉴于少数[大型平台垄断人工智能技术和数据的威胁](https://medium.com/@georgezarkadakis/we-need-to-democratize-ai-and-data-now-c760768f0084),我们的新理解不要偏向特定供应商的角度,而是代表尽可能广泛的观点,这也很重要。
每个人都应该有平等的机会用人工智能创新,让世界变得更好。
*像* [*Agorai*](https://www.agorai.ai) *这样的公司正在努力扩大人工智能技术的使用范围,不仅为企业,也为中小型企业提供一流的工具和数据。Agorai 还将通过加速器项目为教育机构和初创公司提供打折的市场准入。*
# 数据科学家的教育
> 原文:<https://towardsdatascience.com/education-of-a-data-scientist-dfe5b3574fd3?source=collection_archive---------10----------------------->
最近,有人找我帮忙设计数据科学硕士学位课程。我欣然接受了这一邀请,因为我已经招募了几位数据科学家,并对他们的教育差距有强烈的看法。
数据科学是一个广泛的学科,数据科学家的工作描述各不相同。但是我要把它们分成两个不同的类别。第一类是*算法专家*。这些数据科学家设计和实现算法,开发用于机器学习和数据挖掘的软件库,设计和实现数据管道。这些人实现了 TensorFlow,python scikit-learn 库,实现了用于训练深度网络的分布式和并行算法。他们的工作头衔包括:应用研究科学家、机器学习工程师、数据工程师等。他们几乎都有硕士学位,有时是博士学位。
第二大类是*应用数据科学家*。这些科学家应用机器学习、统计学、数据挖掘、可视化的技术来获得洞察力,建立预测模型和进行实验。他们可能为实施产品推荐的电子商务公司工作,为实施内容个性化的媒体公司工作,为建立疾病爆发预测模型或评估政策影响的公共卫生组织工作。最近,机器学习在警务、招聘和教育等领域的应用激增。
这两类人需要不同的教育和不同的技能。然而,我认为大多数大学课程都是为了迎合算法学家,很少能提供应用数据科学家需要的培训。我所在的大学正试图填补这一空白。
应用数据科学家需要的教育是什么?首先是基础知识:对统计学和概率(尤其是统计推断、实验设计、概率分布)的扎实理解是必不可少的。其次,他们需要对机器学习和数据挖掘算法有扎实的理解。在他们的职业中,他们将使用已建立的库,并且很少探究它们的内部,但是他们应该对底层的假设以及每个算法的适当使用和限制有一个坚实的理解。他们应该能够在适当的时候定制损失函数。
标准数据科学课程中通常不会教授的课程。
我提倡开设一门“决策分析”的课程。决策分析是一门成熟的学科,大多在商学院教授。数据科学家将受益于它的概念和工具。决策分析是在不确定条件下制定决策的正式学科,提供了一种评估决策方案、结果和信息影响的方法。应用数据科学家可以很好地理解大多数 ML 模型是一个更大的决策过程或系统的组成部分。产品推荐系统是大型电子商务系统的组成部分,点击预测模型是广告投放系统的一部分,为求职者评分的模型是员工招聘和管理流程的一部分。决策分析框架将帮助数据科学家评估误报和漏报的影响,并权衡获取新数据的收益和成本。
“理解数据”课程包括对数据来源、探索性数据分析和数据可视化的全面理解。每个人都知道垃圾中的垃圾,但很少有人给予足够的重视。很少有数据科学家意识到大多数大数据集是有偏见的。建模者需要理解,机器学习的模型通常嵌入在人机系统中,并影响行为。由于这种影响,由行为产生的数据表现出偏差。还有许多其他方式,生成的数据可能有偏差,或者在其他方面不适合模型训练(我将在单独的帖子中讨论这一点)。理解数据的一个关键组成部分是探索性数据分析(EDA),这似乎是一门失传的艺术。
一门关于研究设计的课程将教会初露头角的数据科学家如何为研究构建适当的描述性和解释性问题,设计数据收集策略(如调查)以及设计和运行实验。他们将学习如何从研究中得出适当的结论。强大的研究技能与沟通和说服科学受众研究结果的能力密切相关。我告诉年轻的数据科学家,数据科学本质上是用数据讲故事。这些故事讲述了一个强有力的归纳论点与说明性的视觉效果。像所有优秀的沟通者一样,他们应该能够预见问题。
我没有提到计算技能,但这是已知的。一个数据科学家应该是一个强大的程序员,尤其是使用 Python。她还应该擅长处理各种类型的数据库,包括关系数据库和 NoSQL 数据库。
一个好的数据科学家应该致力于他们所关注的领域。研究公共卫生问题的数据科学家应该以公共卫生科学家的身份出现,而不是以机器学习工程师的身份出现。为电子商务构建预测模型的数据科学家应该致力于营销和电子商务。只有这样,她才知道问重要的问题,理解数据。
由于应用数据科学完全是关于*实践,*应用数据科学课程应该包括基于项目的培训。我的建议是每个学生在一个项目中被分配两个导师——一个是项目中要部署的技术的专家,另一个是项目领域的专家。此外,在计划的项目阶段,应该鼓励学生在介绍学科概念和方法的项目领域中选择适当的课程。
让我用一个故事来结束。最近,一个研究小组在一次关于人工智能、伦理和社会的会议上展示了他们关于犯罪是否与帮派有关的自动化分类的工作([http://www . science mag . org/news/2018/02/Artificial-Intelligence-can-identify-gang-crimes-and-ignite-ethical-firestorm](http://www.sciencemag.org/news/2018/02/artificial-intelligence-could-identify-gang-crimes-and-ignite-ethical-firestorm))。他们使用了一种叫做“部分生成神经网络”的技术。研究人员认为,他们的模型可以比没有帮助的人类判断产生更快更好的结果。观众就数据和某人被误认为帮派成员会有什么影响等问题向演讲者进行了激烈的提问。演示者不确定。被这些问题逼得走投无路,他举起双手说:“我只是个工程师”!设计良好的数据科学课程应该设法防止毕业生做出这种反应。
# 特征标准化对线性支持向量机的影响
> 原文:<https://towardsdatascience.com/effect-of-feature-standardization-on-linear-support-vector-machines-13213765b812?source=collection_archive---------4----------------------->
因为支持向量机(SVM)优化是通过最小化决策向量 *w,*来实现的,所以最优超平面受输入特征规模的影响,因此建议在 SVM 模型训练之前对数据进行标准化(均值为 0,方差为 1)。在这篇文章中,我展示了标准化对双特征线性 SVM 的影响,以及一些(希望)对结果的实际解释。
我在这里使用的数据来自[大学记分卡](https://collegescorecard.ed.gov/),这是一个免费的美国教育部数据来源,包含美国大学的各种统计数据。我使用了由 Kaggle 托管的[版本的大学记分卡数据。](https://www.kaggle.com/kaggle/college-scorecard)
使用此数据源,我将训练一个 SVM 来根据(1)注册学生的平均 SAT 分数和(2)注册学生的平均家庭收入预测大学的州内学费是大于还是小于每年 2 万美元。这个模型有点做作和简单——我的主要目标不是成功地预测目标类本身,而是展示特性标准化对最终模型的影响。
在该数据集中,有 4166 所大学具有非空平均 SAT 分数和家庭收入数据。有相当多的大学在这些特征上具有空值,我在分析中排除了这些特征:

每年 2 万美元的州内学费介于该变量的第 50 和第 75 百分位之间——因此在这个目标阶层的两边都有相当数量的大学。

上面,我根据平均 SAT 分数和家庭收入绘制了大学学费。应该立即明确的是,这些数据不是线性可分的。在线性 SVM 中,没有超平面可以按照学费类别清晰地分割数据点——在模型选择的任何决策超平面中,总是会有大学位于“错误的一边”。sklearn SVM 实现将根据用户指定的超参数“C ”,搜索最佳超平面(和+1/-1 边缘超平面),该超参数确定边缘超平面“错误侧”上的数据点的惩罚程度。
对于每组特征(非标准化,然后标准化),我运行了 11 个线性 SVM 模型,C 系数为 5**-3,5**-2,…5**3。
很明显,这两种模型在运行时间上有很大的不同:

以下两个表格记录了每个拟合 SVM 的分类预测精度(字段“测量”)。顶部的结果集代表 60%的训练数据子集,而底部的结果集代表 40%的测试或维持数据子集。我还包括了每次运行的拟合决策向量 *w* 和标量 *b* 。所有模型的准确率都相似,但是 *w* 和 *b* 的拟合值却大相径庭。

下面的 6 个图显示了各种罚系数 c 值的拟合 SVM 超平面和(+1,-1)余量。上面的三个图显示了非标准化特征的拟合超平面,而下面的三个图显示了标准化特征的拟合超平面。
不难看出,非标准化数据会产生对系数 c 高度敏感的决策超平面。前三个支持向量机中的每一个都会产生肉眼明显不同的决策超平面。标准化数据跨超参数产生更加一致的 SVM 超平面。底部图之间的差异在于,C 值越低,(+1,-1)边缘超平面的范围越宽。直观地,由于边缘超平面的“错误侧”上的数据点在低 C SVM 模型中受到的惩罚越少,因此模型逻辑具有更大的自由度来拟合远离决策超平面的边缘边界。
[](https://github.com/dasotelo/Python_Projects/blob/master/SVM_College_Tuition.py) [## 达索特罗/SVM _ 学院 _ 学费. py
github.com](https://github.com/dasotelo/Python_Projects/blob/master/SVM_College_Tuition.py)
# 有效的数据科学演示
> 原文:<https://towardsdatascience.com/effective-data-science-presentations-caab621abc66?source=collection_archive---------20----------------------->

如果你是数据科学领域的新手,我想提供一些提示,告诉你如何从你在学术界的演示过渡到为行业创建有效的演示。
不幸的是,如果你的背景是数学、统计学或计算机科学,可能没人会让你准备好在工业界做一个令人敬畏的演讲。事实是,这需要练习。在学术界,我们共享 t-stats 和 p-values 的表格,并大量讨论数学公式。这基本上与你向非技术观众演示时想做的相反。
如果你的听众都是 STEM 博士,那就开始吧,但在很多情况下,我们需要调整我们思考展示技术材料的方式。
我可以没完没了地谈论这个话题,但这里我们将涉及:
1. 谈论模型输出而不谈论模型
2. 使用实际客户或输入描绘画面
3. 花时间讲述这个故事
**谈论模型输出而不谈论模型**
某些型号确实很适合这种情况。逻辑回归,决策树,它们只是尖叫着被赋予生命。

您不希望将模型输出复制/粘贴到演示文稿中。您也不希望将输出格式化成一个漂亮的表格并粘贴到您的演示文稿中。你想讲述这个故事,而记录几率肯定不会为你的利益相关者讲述这个故事。
逻辑回归模型的第一步是对对数概率取指数,这样你至少可以用概率来处理。因为这个输出是乘法的,你可以说:
“在其他一切保持不变的情况下,我们预计[变量]每增加一个单位,平均会增加 x%。”
因此,我们不讨论模型的技术方面,而是讨论不同的驱动因素如何影响输出。然而,我们可以更进一步。
**用真实客户来画图**

我*喜欢*用现实生活中的用例来展示模型是如何工作的。上面我们看到了一些类似于我在谈论我的季节性模型时所展示的东西。当然,我为这篇文章改了他的名字,但在演示文稿中,我会谈论这个人的业务,为什么是季节性的,展示明显的季节性模式,并让他们知道模型将这个人归类为季节性的。我不是在谈论傅立叶变换,我是在描述真实的人是如何被分类的,以及我们可能想如何向他们营销。像这样深入挖掘也有助于我更好地理解正在发生的事情。我们都知道,当我们深入挖掘时,我们会看到一些疯狂的行为模式。
提取特定的客户/用例也适用于其他类型的模型。你建立了一个保留模型?选择一对翻盘概率高的情侣,和一对翻盘概率低的情侣,聊聊那些人。
“这里的玛丽长期以来一直是我们的客户,但她最近参与度较低,没有做过 *x、y* 或 *z* (模特司机),所以她取消订阅的概率很高,尽管任期较长的客户通常不太可能离开。”
**花时间讲故事**
如前所述,将这些东西放在一起需要一些额外的工作。另一个很好的例子是聚类分析。您可以为每个属性创建一张幻灯片,但是人们需要仔细阅读多张幻灯片才能弄清楚世卫组织分类 1 与分类 2 的真正区别,等等。您希望为您的消费者汇总所有这些信息。我不会为我的细分市场想出俗气的名字,它只是来自于领域:)。

这里值得注意的是,如果我不按集群汇总所有这些信息,我也无法从较高的层次上谈论谁实际上进入了这些不同的集群。对我来说,这将是一个很大的失误,因为最终,您的利益相关者希望了解这些集群的整体情况。
我提出的每一项分析都花时间思考,对于数据所能讲述的故事,合适的流程应该是什么。我可能需要额外的信息,如按地理划分的市场渗透率,(或任何东西,可能性是无限的)。我的模型中可能没有按地理位置划分的小企业数量,但用谷歌搜索一下,我就能找到。做一些额外的工作来计算市场渗透率,然后创建一个地图,并使用这些信息来进一步支持我的故事。或者,也许我知道市场渗透率并不支持我的故事,我需要做更多的分析,以了解正在发生的事情的真正核心。我们是侦探。我们不仅仅是在处理模型中的数据。我们试图探索任何可能提供有趣见解并有助于讲述故事的东西。此外,如果你正在做额外的工作,发现你的故事是无效的,你只是救了自己一些心痛。当你先陈述,然后意识到你的结论是错误的时候,情况会更糟。womp womp。
**结束语**
在开始构建模型之前,您要确保输出是可操作的,对吗?在演示结束时,你当然希望谈论如何使用你的模型并增加价值的后续步骤,无论是提出如何以你认为他们会响应的新方式与客户沟通的想法,减少保留,增加获得等。但是要说清楚。花点时间想出一些具体的例子来说明人们如何使用这些输出。
我还想提一下,学习创建优秀可视化的最佳实践将会给你极大的帮助。Kate Strachnyi 的两篇文章涉及了这个话题。你可以在这里找到那些文章[,在这里](/tips-for-data-visualization-c00d505db7cf)找到[。](/an-ode-to-color-in-data-visualizations-3192399f43d0)
如果您创建了一个幻灯片,却找不到“那又怎样?”是幻灯片的一部分,它可能属于附录。当你在创作职业生涯的第一批幻灯片时,如果没有包含一张你花了很多时间的幻灯片,你可能会崩溃,但如果它没有增加一些有趣的东西,不幸的是,那张幻灯片属于附录。
我希望你在这篇文章中至少找到了一个技巧,可以应用到你的下一次演讲中。如果我能帮助一个人做一场精彩的演讲,那就值得了。
*原载于 2018 年 9 月 10 日*[*datamovesme.com*](https://datamovesme.com/2018/09/10/effective-data-science-presentations/)*。*
# 命名在数据科学代码中的作用
> 原文:<https://towardsdatascience.com/effective-naming-in-data-science-ea847c04f51b?source=collection_archive---------3----------------------->

即使有工具允许在不编码的情况下实践数据科学,它们也远远不够。数据科学家将编写和读取代码。阅读可读性差的代码是一种可怕的体验。这篇文章关注命名实体(例如变量、函数)的重要性,以及它如何容易地提高你的代码质量。
# “会有代码”
> “……我还预计特定领域语言的数量将继续增长。这将是一件好事。但它不会消除代码。”
罗伯特·c·马丁在他的书[的第一页写道](https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882)《干净的代码:敏捷软件技术手册》,第一章名为“将会有代码”。我们,数据科学家,编写和读取代码。即使有帮助工具,我们仍将编写和阅读代码。这是我们的核心实践之一。这就是我们如何分析数据、训练模型、预测结果等等。我坚信,对于一个数据科学家来说,代码是无法逃避的。
在某种程度上,我们仍然可以不用编码来实践数据科学。从早期到今天,有图形工具可以分析数据或练习机器学习。这种工具的一个例子是 [WEKA](https://www.cs.waikato.ac.nz/ml/weka/) 。WEKA 是一个带有图形用户界面的机器学习工具包。根据维基百科,它的发展始于 1993 年 [*](https://en.wikipedia.org/wiki/Weka_(machine_learning)) 。它允许用户在不编写一行代码的情况下进行机器学习实验等。那我为什么坚持说写代码和读代码是数据科学家的根本?因为会有自定义操作。
图形工具只有这么多操作。如果你不是每天都在做同样的事情,那么总有一天工具会失去你所需要的功能。这可以是一个分析,一个机器学习模型,或者一些其他的操作。您需要在某种程度上控制、定制和扩展您的操作。级别取决于任务、库或工具。由于许多问题需要新的或定制的方法,很快你就会超过那些图形工具。
我们很少单独工作。组织通常没有单一的数据科学家,而是有数据科学团队。即使事实并非如此,数据科学家也会与其他学科合作。这种协作需要良好的数据科学代码质量。
此外,如果你在为一家公司工作,你其他团队的同事会需要你的代码。为了将你的模型嵌入后端、前端或其他系统,你需要代码。一个不能部署或集成的模型对你的公司来说是没有用的。
如果你认同数据科学会有代码,那我们就来谈谈如何为数据科学写好代码。编写好的代码是一项艰巨的任务。有很好的文字解释为什么它是必要的和如何实现它。在这篇文章中,我的目标是关注其中的一点。这一点不需要培训或教育,但会显著提高您的代码质量。我将重点关注的是**命名、**,它将提高代码的可读性。
# 一个简单的技巧:重命名
阅读一段可读性差的代码是一种可怕的体验。让我们看看下面这个简单的例子:
import pandas as pddf = pd.DataFrame({"f1": [42, 12, 5, 8, 15, 65],
"f2": [172, 155, 110, 120, 158, 168]})
df2 = df[df.f1 >= 18]
out = df2.f2.mean()
out: 170.0
试着猜猜这段代码是做什么的。这段代码的作者知道每一行的目标,并且在她编写代码时知道整个代码的目标。然而,作为一个读者,你看到了一个你需要破译的代码片段。由于作者没有注意可读性,你将花费更多的时间和精力试图理解这段代码。此外,你将更容易犯错误。让我们仔细分析一下这个例子,看看它为什么不好:
* 我知道进口熊猫作为 pd 现在是非常标准的。所有与熊猫打交道的数据科学家都会理解这种简写。这不是代码中最大的问题,但我相信这是可以改进的。除此之外,短(例如 2 个字符)变量名在自动补全中也很麻烦(例如 pd vs pdb)。
* `df = ...`同样,可能是因为 pandas 教程,将数据帧命名为 df 是一种广泛应用的实践。但是它隐藏了上下文中的数据。那是什么样的数据?
* `"f1":... "f2":...`这些是我们数据框的列。然而,它不提供信息。那些列有什么样的数据?为什么它们被列举为 1 和 2?列举是否有目的(比如某事物的第一和第二),或者没有?
* `df[df.f1 >= 18]`这行中的 18 是什么意思?是某种神奇的数字吗?为什么我们要过滤大于或等于 18 的值,为什么我们要过滤 f1 列?
* `out = df2.f2.mean()`到处都是同样的问题。f2 列的意义是什么?为什么我们要取其平均值?
现在让我用更易读的方式重写它,而不是解释它的目的。我将只是重命名变量,并保持代码的其余部分不变。
import pandasphysical_data =
pandas.DataFrame({"age": [42, 12, 5, 8, 15, 65],
"height": [172, 155, 110, 120, 158, 168]})adult_physical_data = physical_data[physical_data.age >= 18]
mean_height_of_adults = adult_physical_data.height.mean()
mean_height_of_adults: 170.0
仅仅通过重命名,你只需一瞥就能理解代码片段的目标和每行中的操作。我认为现在没有必要解释代码,因为它非常清楚。
# 数据= …,但是哪些数据呢?
我相信数据科学代码中的命名可能比一般的软件代码更难。我们有更少的适合对象设计的概念,更多的抽象实体和多样化的集合。这使得数据科学中的命名更加困难。例如,考虑使用包含许多列的表。例如,一个表具有关于作为人的客户(例如,姓名、年龄)、客户行为(例如,购买)、地理信息(例如,购买的地址)和时间信息(例如,购买的时间)的列。你会如何命名这张桌子?
您可以为该表取不同的名称,但有一些常见的不好的名称。例如,不要将其命名为`dt`或`df`。即使你会在 pandas 文档的每个地方看到 df,你也必须明白它们是不属于某个项目的简短示例代码。也不要把它命名为`data`。是的,它是数据,但你会将保存年龄的变量命名为“整数”吗?“数据”作为一个名称是非常模糊的。那是什么数据?它包含什么样的信息?
不要害怕使用长名字。较长的名称通常包含关于实体的更多信息。拥有更长的名字并不是一种负担。有许多不错的具有自动完成特性的 ide,比如 [PyCharm](https://www.jetbrains.com/pycharm/download/) ,所以你不必写全名。
编码的时候,想想下一个会阅读你代码的人。她能理解剧本的主要目标以及每一句台词是如何服务于这个目标的吗?更具体地说,命名:她会仅仅通过名字就迅速捕捉到那个实体的含义吗?
# **不要为糟糕的代码找借口**
用更好的名字,不仅仅是为了你的队友,也不仅仅是为了你自己。你的队友和你自己都从这个习惯中受益。从你队友的角度来看,她会更容易更快地读懂你写的代码。从你个人的角度来看,你会写你的代码更容易,因为你将有更少的认知负荷去记忆你的实体的意义。因此,你的团队和组织将从这个习惯中受益。
首先,命名更好的习惯似乎很难养成。你可能不想把时间花在寻找更好的名字上。然而,这是一个有回报的习惯。即使你写的代码是一个原型,或者是一个小项目的一部分,你也应该实践它。在不知道的情况下,这样的代码可能会变成一个更大的项目。很多情况下,项目看起来很小,但是开发持续了很多年;设计为“一劳永逸”的项目最终对组织非常重要。这就是为什么即使是最短的代码也应该有好的命名。
如果你从来没有想过更好的命名,我希望在读完这篇文章后,你会尝试更好地命名你的实体,并看看它如何提高你的代码质量。
# 效率与清晰度
> 原文:<https://towardsdatascience.com/efficiency-vs-clarity-28241d6ece7f?source=collection_archive---------4----------------------->
作为一名数据科学家,编写代码时要考虑的一个问题是如何最好地平衡效率和清晰度。(在这里,效率=代码执行的速度,清晰性=同样的代码组织得有多好,有多容易理解。)在这种情况下,量化效率比量化清晰更容易,但是查看两组代码并确定哪一组更有组织性是很简单的。(嗯,这在理论上是真的,这意味着在现实中可能一点也不真实。)

Giphy >> computer >> download funniest GIF near top of page
一方面,代码的目标几乎总是解决一些问题——那么为什么不尽可能地高效呢?如果我们能更快地解决一个问题,那就比解决得更慢更好…对吗?
> 小故事:几年前,我的男朋友飞往加州,试图阅读安伯托·艾柯的《福柯的钟摆》。通过机场时,美国运输安全管理局把他的书签抖了出来。他后来找到了自己的位置,读了 20 分钟,意识到自己已经读完了那一部分。(这本书显然难以置信的密集。)这种情况发生了两三次,直到他最终放弃完成这本书。

Me, in grad school.
这是积极的数据科学家/程序员/开发人员/任何做过项目的人的困境。你已经上床睡觉了——没有星巴克、Soylent 或你选择的燃料——第二天早上醒来时,你不知道你在代码中的什么位置,也不知道一部分如何与其他部分相适应。也许你正在与他人合作编写代码,因此愿意为了清晰而牺牲一些效率。作为数据科学爱好者,我们认识到一些实际的限制可能会干扰最巧妙和最快的解决方案。当然,我们可以(也应该!)在我们的代码中包含注释,但这并不意味着我们不能力求清晰…只要这种清晰不影响我们的效率!

“Fizzbuzz”问题,经常在技术面试中使用(包括我自己的一个!),这是一个很好的例子,说明用不同的方法处理不同优先级的问题可以得到相同的解决方案。
TL;博士——“T2”问题需要有人描述一种算法,对于 1 到 100 之间的每个整数:
* 如果这个数能被 3 整除,打印“Fizz”
* 如果数字能被 5 整除,打印“Buzz”
* 如果数字能被 15 整除,打印“FizzBuzz”,或者
* 如果数字不能被 3、5 或 15 整除,则打印数字本身。
期望的输出将类似于:
1, 2, “Fizz,” 4, “Buzz,” “Fizz,” 7, 8, "Fizz," ...
即使你以前没有见过这个问题,你们中的超逻辑者可能已经有了一个你将如何着手解决它的心理草图。创建一个取值为 1,2,…,99,100 的变量。对于每个值,检查它与 3、5 和 15 的整除性。认识到 3、5 和 15 会有一些重叠,我们要小心。在这一点上,我们可能最好把笔放在纸上(或手指放在键盘上)并尝试一下。

Click.
在我的 Python 访谈中,我在黑板上写下了以下内容:
for i in range(1,101):
if i % 3 == 0:
if i % 5 == 0:
print 'Fizzbuzz'
else:
print 'Fizz'
elif i % 5 == 0:
print 'Buzz'
else:
print i
那时,一位面试官问我为什么要这样安排。这在我的思考中是最有意义的——我知道被 3 和 5 整除的数字会更棘手,所以我想在一开始就考虑被 15 整除的可能性。然而,退后一步,让写在白板上的面试神经稍微平静下来,它*确实*看起来很笨拙。我提到,这样可能会更有效率,因为我们运行的操作更少,但考虑到这些紧张因素,我不想强调这一点,以免我忽略了一些愚蠢的事情。
在面试官的要求下,我又做了一遍:
for i in range(1,101):
if i % 3 == 0 & i % 5 == 0:
print ‘Fizzbuzz’
elif i % 3 == 0:
print ‘Fizz’
elif i % 5 == 0:
print ‘Buzz’
else:
print i
这似乎更优雅。显然更清楚了。如果我试图教某人编码,或者如果我和一群都接触相同代码的人一起工作,这似乎是一个更好的解决方案。

Yup. Nerding out 24/7.
直到我回到家,我一直在回想哪个代码块会更有效率。当我回到家,我坐下来展示了运行我最初写的算法确实会更有效率。*(对数字 1 到 1,000,000 运行这个程序,我的第一个代码将运行 33.39 秒,而第二个代码将运行 34.80 秒。这是因为第一个代码片段对于所有不能被 3 和 5 整除的数字只需要少一次运算。)*
不幸的是,就像数据科学中的许多事情一样,效率和清晰之间几乎没有硬性的规则。说“如果许多人在同一代码上工作,你应该关注清晰性”或“如果你在‘大数据’上使用代码,那么效率可能更重要”是相当琐碎的。但是我对你的最佳实践感兴趣!
> 对编码人员来说,什么时候更重要?
>
> 对于非编码人员,格兰芬多即使读到这里也要加 100 分,但是你对日常环境中“效率与清晰”的概念有什么想法?
# 用 Scipy——有效边界解释最小风险的投资组合优化
> 原文:<https://towardsdatascience.com/efficient-frontier-optimize-portfolio-with-scipy-57456428323e?source=collection_archive---------7----------------------->

Photo by [Chris Liverani](https://unsplash.com/@chrisliverani?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)
(我的[博客](https://kylelix7.github.io/Efficient-Frontier-Explained-with-SciPy/)里也有这个帖子)
## 超越界限
给定 4 种资产的风险和回报如下,用这些资产构建的任何投资组合的风险回报可能是多少。人们可能认为所有可能的值都落在凸包内。但如果考虑资产之间的相关系数,超越债券是有可能的。也就是说,组合反向相关的资产可以构建一个风险较低的投资组合。更多细节可以在我的[上一篇](https://medium.com/@kyle.jinhai.li/reducing-risk-by-building-portfolio-8772d1ce0f21)中找到。

为了证明投资组合的风险回报可以超越这个区域,我得到了 3000 个随机加权投资组合的样本,并绘制了它们的风险回报。
## 环境设置
遵循这个[帖子](https://medium.com/@kyle.jinhai.li/collect-trading-data-with-pandas-library-8904659f2122)中的步骤 1
## 计算并可视化资产回报和风险
这是教程,我们从 4 个不同的部门挑选了 4 只股票 BA(波音),C(花旗集团),AAL(美国航空集团),NFLX(网飞)进行分析。正如我的[上一篇文章](https://medium.com/@kyle.jinhai.li/reducing-risk-by-building-portfolio-8772d1ce0f21)所说,风险是通过每日回报的标准差来衡量的。回报计算如下
K * (expected return – expected risk free rate)
k 是采样频率的平方根。这意味着如果我们用日收益率来衡量,K 就是 sqrt(250)(一年大概有 250 个交易日)。国债利率通常被用作无风险利率。在本教程中,我们将使用 0。
## 密码
散点图描绘单个资产的风险收益
import pandas_datareader.data as web
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import minimizedef get_risk(prices):
return (prices / prices.shift(1) - 1).dropna().std().values def get_return(prices):return ((prices / prices.shift(1) - 1).dropna().mean() * np.sqrt(250)).valuessymbols = ['BA', 'C', 'AAL', 'NFLX']
prices = pd.DataFrame(index=pd.date_range(start, end))
for symbol in symbols:
portfolio = web.DataReader(name=symbol, data_source='quandl', start=start, end=end)
close = portfolio[['AdjClose']]
close = close.rename(columns={'AdjClose': symbol})
prices = prices.join(close)
portfolio.to_csv("~/workspace/{}.csv".format(symbol))prices = prices.dropna()
risk_v = get_risk(prices)
return_v = get_return(prices)fig, ax = plt.subplots()
ax.scatter(x=risk_v, y=return_v, alpha=0.5)
ax.set(title='Return and Risk', xlabel='Risk', ylabel='Return')for i, symbol in enumerate(symbols):
ax.annotate(symbol, (risk_v[i], return_v[i]))plt.show()

Return and risk for BA (Boeing), C (Citigroup), AAL (American Airlines Group), NFLX (Netflix)
## 构建随机权重的投资组合
def random_weights(n):
weights = np.random.rand(n)
return weights / sum(weights)def get_portfolio_risk(weights, normalized_prices):
portfolio_val = (normalized_prices * weights).sum(axis=1)
portfolio = pd.DataFrame(index=normalized_prices.index, data={'portfolio': portfolio_val})
return (portfolio / portfolio.shift(1) - 1).dropna().std().values[0]def get_portfolio_return(weights, normalized_prices):
portfolio_val = (normalized_prices * weights).sum(axis=1)
portfolio = pd.DataFrame(index=normalized_prices.index, data={'portfolio': portfolio_val})
ret = get_return(portfolio)
return ret[0]risk_all = np.array([])
return_all = np.array([])# for demo purpose, plot 3000 random portoflio np.random.seed(0)
normalized_prices = prices / prices.ix[0, :]
for _ in range(0, 3000):
weights = random_weights(len(symbols))
portfolio_val = (normalized_prices * weights).sum(axis=1)
portfolio = pd.DataFrame(index=prices.index, data={'portfolio': portfolio_val})
risk = get_risk(portfolio)
ret = get_return(portfolio)
risk_all = np.append(risk_all, risk)
return_all = np.append(return_all, ret)
p = get_portfolio_risk(weights=weights, normalized_prices=normalized_prices)fig, ax = plt.subplots()
ax.scatter(x=risk_all, y=return_all, alpha=0.5)
ax.set(title='Return and Risk', xlabel='Risk', ylabel='Return')for i, symbol in enumerate(symbols):
ax.annotate(symbol, (risk_v[i], return_v[i]))
ax.scatter(x=risk_v, y=return_v, alpha=0.5, color='red')
ax.set(title='Return and Risk', xlabel='Risk', ylabel='Return')
ax.grid()
plt.show()
> 风险来自于不知道自己在做什么——沃伦·巴菲特
再来看风险和收益。我们确实看到区域外有蓝点。所以分散投资确实有助于降低风险。但是,我们如何找到最佳或有效的重量呢?

Return and risk of a portfolio of random weighted BA (Boeing), C (Citigroup), AAL (American Airlines Group), NFLX (Netflix) (3000 samples)
## 效率限界
来自[维基百科](https://en.wikipedia.org/wiki/Efficient_frontier),在[现代投资组合理论](https://en.wikipedia.org/wiki/Modern_portfolio_theory)中,**有效边界**(或**投资组合边界**)是一种投资组合,它占据了风险回报谱的‘有效’部分。
在这里,我们将使用 scipy 的优化器来获得不同目标回报的最佳权重。请注意,我们有界限来确保权重在范围[0,1]内,并且有约束来确保权重之和为 1,并且投资组合回报满足我们的目标回报。有了所有这些条件,scipy optimizer 就能够找到最佳分配。
# optimizer def optimize(prices, symbols, target_return=0.1):
normalized_prices = prices / prices.ix[0, :]
init_guess = np.ones(len(symbols)) * (1.0 / len(symbols))
bounds = ((0.0, 1.0),) * len(symbols)
weights = minimize(get_portfolio_risk, init_guess,
args=(normalized_prices,), method='SLSQP',
options={'disp': False},
constraints=({'type': 'eq', 'fun': lambda inputs: 1.0 - np.sum(inputs)},
{'type': 'eq', 'args': (normalized_prices,),
'fun': lambda inputs, normalized_prices:
target_return - get_portfolio_return(weights=inputs,
normalized_prices=normalized_prices)}),
bounds=bounds)
return weights.xoptimal_risk_all = np.array([])
optimal_return_all = np.array([])
for target_return in np.arange(0.005, .0402, .0005):
opt_w = optimize(prices=prices, symbols=symbols, target_return=target_return)
optimal_risk_all = np.append(optimal_risk_all, get_portfolio_risk(opt_w, normalized_prices))
optimal_return_all = np.append(optimal_return_all, get_portfolio_return(opt_w, normalized_prices))# plotting
fig, ax = plt.subplots()
# random portfolio risk return ax.scatter(x=risk_all, y=return_all, alpha=0.5)# optimal portfolio risk return for i, symbol in enumerate(symbols):
ax.annotate(symbol, (risk_v[i], return_v[i]))
ax.plot(optimal_risk_all, optimal_return_all, '-', color='green')# symbol risk return for i, symbol in enumerate(symbols):
ax.annotate(symbol, (risk_v[i], return_v[i]))
ax.scatter(x=risk_v, y=return_v, color='red')ax.set(title='Efficient Frontier', xlabel='Risk', ylabel='Return')
ax.grid()
plt.savefig('return_risk_efficient_frontier.png', bbox_inches='tight')
绿线表示有效边界。现在我们知道了给定目标回报率的最佳配置。下一个问题,总体而言,最佳配置是什么?投资组合的表现可以用收益/风险比率(称为[夏普比率](https://www.investopedia.com/terms/s/sharperatio.asp))来评估。高夏普比率表明收益和风险的良好平衡。这种分配可以通过画一条与有效边界相切的资本分配线来找到。切点是产生最高夏普比率的分配。要了解更多,你可以看看这篇[文章](https://corporatefinanceinstitute.com/resources/knowledge/finance/capital-allocation-line-cal-and-optimal-portfolio/),关于如何用资本配置线(CAL)从有效边界找到最高夏普比率。

Efficient frontier — Return and risk of optimal asset-weights at different targeted returns
现在我们知道为什么多样化可以帮助你的投资。如果你想了解更多关于机器学习的知识,educative.io 网站上有一系列[课程很有帮助。这些课程包括像基本的 ML,NLP,图像识别等主题。投资和编码快乐!](https://www.educative.io/profile/view/6083138522447872?aff=VEzk)
我的下一篇帖子——[交易策略:用 Python TA-Lib](https://medium.com/@kyle.jinhai.li/trading-strategy-technical-analysis-with-python-ta-lib-3ce9d6ce5614) 进行技术分析。
***来自《走向数据科学》编辑的注释:*** *虽然我们允许独立作者根据我们的* [*规则和指南*](/questions-96667b06af5) *发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的* [*读者术语*](/readers-terms-b5d780a700a4) *。*
推荐阅读:
[动手机器学习](https://www.amazon.com/gp/product/1492032646/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1492032646&linkCode=as2&tag=blog023b-20&linkId=e6994d31d10e7ac4d35d9889cfe5622e)
[用于数据分析的 Python:与 Pandas、NumPy 和 IPython 的数据角力](https://www.amazon.com/gp/product/1491957662/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1491957662&linkCode=as2&tag=blog023b-20&linkId=be0bbd6ab4fd578397d9c14facc76911)
[对冲基金真正在做什么](https://www.amazon.com/gp/product/1631570897/ref=as_li_tl?ie=UTF8&camp=1789&creative=9325&creativeASIN=1631570897&linkCode=as2&tag=blog023b-20&linkId=d7bb68173b008df1b500073e3a8d054e)
我的帖子:
[我关于 FAANG 访谈的帖子](https://medium.com/@fin.techology/my-posts-about-faang-interview-20e529c5f13f?source=your_stories_page---------------------------)
[我的 YouTube 频道](https://bit.ly/3bBOjtJ)
[我关于金融和科技的帖子](https://medium.com/@fin.techology/my-posts-about-finance-and-tech-7b7e6b2e57f4?source=your_stories_page---------------------------)
[从 CRUD web 应用开发到语音助手中的 SDE——我正在进行的机器学习之旅](https://medium.com/@fin.techology/from-crud-app-dev-to-sde-in-voice-assistant-my-ongoing-journey-to-ml-4ea11ec4966e?)
[全栈开发教程:将 AWS Lambda 无服务器服务集成到 Angular SPA 中](/full-stack-development-tutorial-integrate-aws-lambda-serverless-service-into-angular-spa-abb70bcf417f)
[全栈开发教程:用运行在 AWS Lambda 上的无服务器 REST API 提供交易数据](/full-stack-development-tutorial-serverless-rest-api-running-on-aws-lambda-a9a501f54405)
[全栈开发教程:在 Angular SPA 上可视化交易数据(1)](/full-stack-development-tutorial-visualize-trading-data-on-angular-spa-7ec2a5749a38)
[强化学习:Q 学习简介](https://medium.com/@kyle.jinhai.li/reinforcement-learning-introduction-to-q-learning-444c951e292c)
# Python 中的高效前沿投资组合优化
> 原文:<https://towardsdatascience.com/efficient-frontier-portfolio-optimisation-in-python-e7844051e7f?source=collection_archive---------0----------------------->

Photo by [Frank Busch](https://unsplash.com/@frankbusch?utm_source=medium&utm_medium=referral) on [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral)
我个人对金融的兴趣让我在 Coursera 上了一门关于投资管理的在线课程。这是由日内瓦大学和瑞士联合银行合作的 5 门专业课程。它不是专门为金融建模,但更多的是对投资策略及其相关理论的一般性介绍。作为一个没有任何行业经验的人,该课程确实有助于了解大局。我目前正在专业的第三个课程上,我学到了一些非常有趣的东西,叫做“现代投资组合理论”
在我学习这门课程的时候,我认为这将是一个非常好的练习 Python 技能的材料。尽管这个课程没有提供任何关于如何实际实现它的技术细节,但通过一些挖掘,我发现了一些非常有用的博客帖子,我可以参考。
由 [Bernard Brenyah](https://medium.com/@bbrenyah) 撰写的一系列媒体博客文章
* [Markowitz 在 Python 中的有效前沿【第 1/2 部分】](https://medium.com/python-data/effient-frontier-in-python-34b0c3043314)
* [Markowitz 在 Python 中的有效边界[第 2/2 部分]](https://medium.com/python-data/efficient-frontier-portfolio-optimization-with-python-part-2-2-2fe23413ad94)
布拉德福德·林奇[的博客文章](http://www.bradfordlynch.com/)
* [投资组合优化](http://www.bradfordlynch.com/blog/2015/12/04/InvestmentPortfolioOptimization.html)
基于我从课程中学到的东西,以及从上面的博客文章中,我试图用我自己的方式复制它,一路上不断调整。
*除了我将附上的简短代码块,你可以在这篇文章的末尾找到整个 Jupyter 笔记本的链接。
# 现代投资组合理论
一个好的投资组合不仅仅是一长串好的股票和债券。这是一个平衡的整体,为投资者提供了各种保护和机会。哈利·马科维茨
现代投资组合理论(MPT)是由哈里·马科维茨发展的投资理论,于 1952 年以“投资组合选择”的标题发表在《金融杂志》上。

Harry Markowitz is the 1990 Nobel Memorial Prize winner in Economic Sciences
有几个基本概念可以帮助你理解 MPT。如果你熟悉金融,你可能知道缩写“TANSTAAFL”代表什么。这是“天下没有免费的午餐”的著名缩写。这个概念也和‘风险收益权衡’密切相关。
风险越高,回报越高的可能性越大,风险越低,回报越小的可能性越大。MPT 假设投资者厌恶风险,这意味着给定两个预期回报相同的投资组合,投资者会选择风险较小的一个。因此,投资者只有在得到更高预期回报的补偿时,才会承担更大的风险。
另一个在 MPT 发挥作用的因素是“多元化”。现代投资组合理论认为,只看一只特定股票的预期风险和回报是不够的。通过投资一种以上的股票,投资者可以获得多样化的好处——其中最主要的是降低投资组合的风险。
你需要明白的是“投资组合的风险不等于投资组合中个股的平均/加权平均”。就回报而言,是的,它是单个股票回报的平均值/加权平均值,但这不是风险的情况。风险在于资产的波动性,如果你的投资组合中有不止一只股票,那么你必须考虑这些股票的走势如何相互关联。多样化的美妙之处在于,通过优化配置,你甚至可以获得比投资组合中风险最低的股票更低的风险。
我将在使用实际代码的同时尝试解释。首先,我们从导入一些我们需要的库开始。" [Quandl](https://www.quandl.com/) "是一个金融平台,它也提供 Python 库。如果你之前没有安装过,当然首先需要在你的命令行“pip install quandl”中安装包,在使用之前,你还需要在 quandl 的网站上获取一个 API key。注册并获得 API 密钥是免费的,但有一些限制。作为登录的免费用户,您最多可以在 10 分钟内拨打 2,000 个电话(速度限制),每天可以拨打 50,000 个电话(音量限制)。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import quandl
import scipy.optimize as scoplt.style.use('fivethirtyeight')
np.random.seed(777)%matplotlib inline
%config InlineBackend.figure_format = 'retina'
为了运行下面的代码块,你需要自己的 API 密匙。这篇文章选择的股票是苹果,亚马逊,谷歌,脸书。下面的代码块将获得从 2016 年 1 月 1 日到 2017 年 12 月 31 日每只股票的每日调整收盘价(2 年的价格数据)。
quandl.ApiConfig.api_key = 'your_api_key_here'
stocks = ['AAPL','AMZN','GOOGL','FB']
data = quandl.get_table('WIKI/PRICES', ticker = stocks,
qopts = { 'columns': ['date', 'ticker', 'adj_close'] },
date = { 'gte': '2016-1-1', 'lte': '2017-12-31' }, paginate=True)
data.head()

data.info()

通过查看数据的 info(),似乎“date”列已经是 datetime 格式了。让我们稍微转换一下数据,使其更容易处理。
df = data.set_index('date')
table = df.pivot(columns='ticker')
By specifying col[1] in below list comprehension
You can select the stock names under multi-level column
table.columns = [col[1] for col in table.columns]
table.head()

现在看起来好多了。让我们先来看看每只股票的价格在给定的时间框架内是如何演变的。
plt.figure(figsize=(14, 7))
for c in table.columns.values:
plt.plot(table.index, table[c], lw=3, alpha=0.8,label=c)
plt.legend(loc='upper left', fontsize=12)
plt.ylabel('price in $')

看起来,亚马逊和谷歌的股价相对比脸书和苹果要贵。但由于脸书和苹果被挤在底部,很难看到这两个移动。
另一种方法是绘制每日回报(与前一天相比的百分比变化)。通过绘制每日回报而不是实际价格,我们可以看到股票的波动性。
returns = table.pct_change()plt.figure(figsize=(14, 7))
for c in returns.columns.values:
plt.plot(returns.index, returns[c], lw=3, alpha=0.8,label=c)
plt.legend(loc='upper right', fontsize=12)
plt.ylabel('daily returns')

亚马逊有两个明显的正面峰值和几个负面峰值。脸书有一个最高的正峰值。而且苹果也有一些尖峰从剧情中脱颖而出。从上面的剧情中,我们大致可以看出,亚马逊看起来是一只风险相当大的股票,而谷歌似乎是其中最稳定的一只。
# 随机投资组合生成
我们的投资组合中有 4 只股票。我们必须做出的一个决定是,我们应该如何将预算分配给投资组合中的每一只股票。如果我们的总预算是 1,那么我们可以决定每只股票的权重,这样权重的总和就是 1。权重的值将是我们分配给特定股票的预算部分。例如,如果亚马逊的权重为 0.5,这意味着我们将预算的 50%分配给亚马逊。
让我们定义一些函数来模拟投资组合中每只股票的随机权重,然后计算投资组合的总年回报率和年波动率。
“投资组合 _ 年化 _ 绩效”函数将计算回报率和波动性,并使其作为一个年化计算我考虑 252 作为一年中的交易天数。“random_portfolios”函数将生成随机权重分配给每只股票的投资组合,通过给出 num_portfolios 参数,您可以决定要生成多少个随机投资组合。
从上面的代码块中,我想指出两点。
## 投资组合标准差
第一个是“投资组合 _ 年化 _ 绩效”函数中投资组合波动率的计算。如果你查找“投资组合标准差公式”,你会遇到如下公式。

如果我们使用矩阵表示法,这个公式可以简化。我在文章开头提到的 Bernard Brenyah 已经在[的一篇博客文章](https://medium.com/python-data/assessing-risks-and-return-with-probabilities-of-events-with-python-c564d9be4db4)中清晰地解释了如何用矩阵计算来表达上述公式

通过上面的矩阵计算,我们得到了原公式中平方根里面的部分。现在,我们需要做的就是把它们放在平方根里面。与年化回报相同,我考虑了 252 个交易日(在这种情况下,是 252 的平方根)来计算投资组合的年化标准差。
## 夏普比率
我想指出的第二点是夏普比率。为了理解夏普比率,有必要理解更广泛的风险调整回报率概念。风险调整回报通过衡量产生回报所涉及的风险来细化投资回报,这通常用数字或评级来表示。可能有许多不同的方法来表达风险调整后的回报,夏普比率是其中之一。
夏普比率是由另一位诺贝尔经济学奖得主威廉夏普于 1966 年得出的。

Sharpe was one of the originators of the CAPM (Capital Asset Pricing Model)
这个比率描述了你持有高风险资产所承受的额外波动带来的超额回报。夏普比率可以用下面的公式表示。

对于夏普比率如何使用回报率的标准差作为分母,假设回报率的正态分布,有一些批评。然而,通常情况下,金融资产的回报往往偏离正态分布,并可能使夏普比率的解释产生误导。正是由于这个原因,有其他方法来调整或修改原始夏普比率。但这是一个更高级的话题,对于这篇文章,我将坚持传统的夏普比率。
现在让我们获取函数所需的参数值。通过在带有价格数据的数据框上调用 pct_change,可以很容易地获得每日回报。平均日收益,收益的协方差矩阵是计算投资组合收益和波动性所需要的。我们将生成 25,000 个随机投资组合。最后,无风险利率来自美国财政部。1.78%的利率是 2018 年初的 52 周国库券利率。这背后的基本原理是,历史价格数据是 2016~2017 年的,如果我假设我在 2018 年初实施这一分析,最新的国债利率是从 2018 年初开始的。我还选择了 52 周的国库券利率来匹配我计算的年化回报和风险。
returns = table.pct_change()
mean_returns = returns.mean()
cov_matrix = returns.cov()
num_portfolios = 25000
risk_free_rate = 0.0178
让我简单解释一下下面的函数在做什么。首先,它生成随机投资组合,并获得结果(投资组合回报、投资组合波动性、投资组合夏普比率)和相应结果的权重。然后,通过找到具有最高夏普比率的投资组合,它将最大夏普比率投资组合显示为红星符号。对最小波动率投资组合做类似的步骤,在图上显示为绿色星号。所有随机生成的投资组合也将根据夏普比率绘制彩色地图。越蓝,夏普比率越高。
对于这两个最优投资组合,它还将显示如何在投资组合中分配预算。
display_simulated_ef_with_random(mean_returns, cov_matrix, num_portfolios, risk_free_rate)

对于最小风险投资组合,我们可以看到超过一半的预算分配给了谷歌。如果你再看一下之前的每日回报图,你会发现谷歌是四只股票中波动性最小的,因此将很大一部分股票分配给谷歌以获得最小风险的投资组合具有直观的意义。
如果我们愿意为了更高的回报而承担更高的风险,那么能给我们带来最佳风险调整回报的股票就是夏普比率最大的股票。在这种情况下,我们将很大一部分配置给亚马逊和脸书,从之前的每日回报图来看,这两只股票波动很大。谷歌在最小风险投资组合中占了 50%以上,但分配给它的预算不到 1%。
# 效率限界
从随机模拟的投资组合图中,我们可以看到它在聚集的蓝点顶部形成了一条弧线。这条线叫做有效边界。为什么有效率?因为对于给定的目标回报,沿线的点会给你最低的风险。直线右侧的所有其他点会给你带来更高的风险和相同的回报。如果预期回报是一样的,当有一个风险更低的选择时,你为什么要冒额外的风险呢?
我们找到上述两种最优投资组合的方法是通过模拟许多可能的随机选择,并挑选出最佳选择(最小风险或最大风险调整回报)。我们也可以通过使用 Scipy 的优化函数来实现这一点。
如果您是 excel 的高级用户,您可能熟悉 Excel 中的“规划求解”功能。Scipy 的 optimize 函数在给定要优化的内容以及约束和界限时执行类似的任务。
下面的函数是为了得到最大的夏普比率投资组合。在 Scipy 的优化函数中,没有“最大化”,所以作为一个目标函数,你需要传递一些应该最小化的东西。这就是为什么第一个“负夏普比率”计算负夏普比率。现在我们可以用这个作为目标函数来最小化。在“max_sharpe_ratio”函数中,您首先定义参数(这不应包括您想要为优化而更改的变量,在本例中为“权重”)。起初,约束的构造对我来说有点难以理解,这是由于它的表述方式。
constraints = ({‘type’: ‘eq’, ‘fun’: lambda x: np.sum(x) — 1})
上面的约束是说 x 的和应该等于 1。你可以把“有趣”部分的结构想象成等号右边的“1”被移到了等号的左边。
np.sum(x) == 1 变成了 np.sum(x)-1
这意味着什么?它仅仅意味着所有权重的总和应该等于 1。您分配的总额不能超过预算的 100%。
“bounds”给出了分配随机权重的另一个限制,即任何权重都应该在 0 和 1 之间。你不能给一只股票负的预算分配,也不能给一只股票超过 100%的分配。
我们还可以定义一个计算最小波动率投资组合的优化函数。这一次我们真的最小化目标函数。我们想要最小化什么?我们希望通过尝试不同的权重来最小化波动性。“约束”和“界限”同上。
正如我在上面已经提到的,我们也可以画一条线来描述给定风险率的有效投资组合应该在哪里。这就是所谓的“有效前沿”。下面我定义其他函数来计算有效边界。第一个函数“efficient_return”计算给定目标回报的最有效投资组合,第二个函数“efficient_frontier”将采用一系列目标回报,并计算每个回报水平的有效投资组合。
让我们试着用所有随机生成的投资组合来绘制具有最大夏普比率和最小波动性的投资组合选择。但这一次,我们不是从随机生成的投资组合中挑选最优的,而是使用 Scipy 的“最小化”功能进行计算。下面的函数也会画出有效的边界线。
display_calculated_ef_with_random(mean_returns, cov_matrix, num_portfolios, risk_free_rate)

我们从随机生成的投资组合中挑选,得到了几乎相同的结果。略有不同的是,Scipy 的“优化”功能没有为谷歌的最大夏普比率投资组合分配任何预算,而我们从随机生成的样本中选择的一个为谷歌分配了 0.45%的预算。小数位有些不同,但大致相同。
我们可以在图上用每只股票的年收益和年风险的相应值来绘制每只股票,而不是绘制每个随机生成的投资组合。这样,我们可以看到并比较多样化是如何通过优化配置来降低风险的。
display_ef_with_selected(mean_returns, cov_matrix, risk_free_rate)

从上面的图可以看出,风险最小的股票是谷歌,在 0.18 左右。但通过投资组合优化,我们可以实现 0.16 的更低风险,同时仍能获得比谷歌更高的回报。如果我们愿意在类似谷歌的风险水平上承担稍微多一点的风险,我们可以通过投资组合优化获得 0.30 的更高回报。
考虑到金融领域的广度和深度,我可能只是触及了皮毛。但是我在编码和试图理解这个概念的过程中获得了乐趣。我每天都在学习。做完这个实现,我肯定比昨天的我更清楚。如果我继续学习,大约几年后,我会比今天的我知道得更多。如果您有任何意见或问题,请随时留下您的评论。任何反馈都将不胜感激。
感谢您的阅读。你可以从下面的链接找到 Jupyter 笔记本。
[https://github . com/tthustlea/Efficient _ Frontier/blob/master/Efficient % 20 _ Frontier _ implementation . ipynb](https://github.com/tthustla/efficient_frontier/blob/master/Efficient%20_Frontier_implementation.ipynb)
# TensorFlow 中的特征向量投影自动编码器
> 原文:<https://towardsdatascience.com/eigen-vector-projection-auto-encoders-in-tensorflow-46a376dafb34?source=collection_archive---------8----------------------->

GIF from this [website](https://giphy.com/gifs/afvpets-afv-americas-funniest-home-videos-l41Yea1LYiWd8HBGU)
最近我一直在玩[特征值和向量以及投影](/only-numpy-having-fun-with-eigen-value-s-vectors-with-interactive-code-in-numpy-80d3443dfd22)。(通过点积)现在我想看看它们是如何被整合到神经网络中的。(自动编码器)。此外,请注意,我在这里使用的技术与执行[主成分分析(PCA](https://sebastianraschka.com/Articles/2014_pca_step_by_step.html#4-computing-eigenvectors-and-corresponding-eigenvalues) )时非常相似,但并不完全相同。(具体来说,我没有删除维度,也没有对特征值进行排序)。所以我不会叫它 PCA。在这篇文章中,我将比较不同的自动编码器,如…..
***情况 a)改变潜在向量基的自动编码器
情况 b)改变潜在向量基并增加网络参数的自动编码器
情况 c)普通自动编码器
情况 d)改变潜在向量基的自动编码器(不同的激活函数)
情况 e)改变隐藏层基的自动编码器
情况 f)改变隐藏层基的自动编码器(2)***
> **请注意,这个帖子只是为了自己表达创意。**
**网络架构/数据集**

**蓝色矩形** →卷积/全连接层
**红色矩形** →转置卷积/全连接层
如上所述,我们的网络仅由 3 个卷积运算、2 个全连接层和 2 个用于上采样的转置卷积运算组成。对于下采样操作,我选择使用下采样操作。现在我将要使用的数据集是著名的 [MNIST 数据集。](http://yann.lecun.com/exdb/mnist/)
***情况 a)自动编码器改变潜在向量的基础***

**红色部分** →自动编码器潜在向量的基础变化
由于我们要将维度从 28*28 降低到 3,因此我们实际上可以计算隐藏表示的协方差矩阵,并使用协方差矩阵的特征向量来投影原始数据。

**左侧 GIF** →生成的训练图像
**右侧图像** →训练阶段的时间成本
网络在生成原始图像方面表现不佳,大多数图像都很模糊,甚至与原始图像不接近。现在让我们来看看编码向量的潜在空间。

如上所述,在改变基底之前,我们可以看到编码器实际上在将相似图像彼此聚类方面做得很好。

然而,在投影到本征向量后,我们可以看到,现在数据已经混合在一起,显然彼此不能完全分开。
***情况 b)增加了网络参数*** 改变了潜在向量的基的自动编码器

现在,我添加了一个名为 network_effect 的参数,这是一个来自均匀分布的 3*3 矩阵。(范围 0–1)。这是因为我想让网络对投影空间有更多的控制。

**左图 GIF** →生成的训练图像
**右图** →训练阶段的时间成本
与情况 a)相比,该网络做得还不错,然而,同样,大多数生成的图像是模糊的,不可识别的。

同样,当我们可视化编码的潜在空间时,我们观察到编码器在聚类相似图像方面做得很好。(投影前)

但是,在向量投影之后,每一类之间的编码空间实际上恶化了。
***案例 c)普通自动编码器***

被上面两个网络的性能所质疑,我想知道网络架构本身是否是问题所在。所以我训练了一个普通的自动编码器。

**左侧 GIF** →生成的训练图像
**右侧图像** →训练阶段的时间成本
与其他网络相比,vanilla 在生成和分离潜在空间中的数据方面做得最好。

如上所述,每种颜色的数据点都很好地聚集在一起。
***情况 d)自动编码器改变潜在向量的基础(不同的激活函数)***

**红色部分** → Tanh 激活功能
从以前的 GIF 中,我们可以观察到生成的潜在空间的范围是巨大的。(当我们要生成数据的时候,这不是一件好事。所以我想看看当我使用一个双曲正切函数而不是一个恒等函数时,事情会有什么变化。

**左侧 GIF** →生成的训练图像
**右侧图像** →训练阶段的时间成本
不幸的是,生成的图像非常模糊,不是最好的。

如上所述,现在潜在空间在更近的范围内,但是数据点彼此之间的聚类很差。非常非常差。

然而,在投射之后,它产生了我所见过的最有趣的图案。我希望回到这件事上来,因为它太有趣了。
***情况 e)隐藏层*** 基础改变的自动编码器

现在,我想看看当我在创建潜在空间的完全连接的层后面的层上执行投影时的效果。(如果我可怕的描述没有意义,请理解为我在不同的层上做了相同的操作。)

网络实际上在生成新图像方面做得很好,当我们观察潜在空间时,我们可以观察到类似的潜在空间,当我们与普通的自动编码器进行比较时。

实际上,我认为它比普通的自动编码器做得更好。
***情况 f)自动编码器与隐藏层的基础变化(2)***

前一个实验者的自然延伸是在不同的层上执行相同的操作。(在这里,我将在前面两层上执行它。)

尽管这个网络产生了最有趣的图像模式,但实验还是彻底失败了。

当我们看到潜在空间时,我们可以看到这些数据点是无法区分的。
**互动码**

对于 Google Colab,您需要一个 Google 帐户来查看代码,而且您不能在 Google Colab 中运行只读脚本,所以请在您的操场上创建一个副本。最后,我永远不会请求允许访问你在 Google Drive 上的文件,仅供参考。编码快乐!同样为了透明,我在 github 上上传了所有的训练日志。
要访问[案例 a 的代码,请单击她的](https://colab.research.google.com/drive/1OZPXC31aa_vfNlZcU9YQN2f_N1Zvat9P) e,要查看[日志,请单击此处。](https://github.com/JaeDukSeo/Daily-Neural-Network-Practice-2/blob/master/NeuralNetwork/eigen_auto/casea/viz/casea.txt)
点击 h 查看[案例 b 的代码,点击 l](https://colab.research.google.com/drive/1JJTkQssUfBrx7FKFADktkfjHYvQHN08q) [ogs 点击此处](https://github.com/JaeDukSeo/Daily-Neural-Network-Practice-2/blob/master/NeuralNetwork/eigen_auto/caseb/viz/caseb.txt)。
要访问[案例 c 的代码,单击](https://colab.research.google.com/drive/1mI3O58MCQNHZH16L8CXEH3d7P0toqpWC) re,要查看[日志,单击此处](https://github.com/JaeDukSeo/Daily-Neural-Network-Practice-2/blob/master/NeuralNetwork/eigen_auto/casec/viz/casec.txt)。
点击此处访问 [r 案例 d 的代码,点击此处查看](https://colab.research.google.com/drive/11tKfr129M8GoF0gyt7Qd2J1TWC7BXh_A)[日志。](https://github.com/JaeDukSeo/Daily-Neural-Network-Practice-2/blob/master/NeuralNetwork/eigen_auto/cased/viz/cased.txt)
访问[案例 e 的代码点击此处,](https://colab.research.google.com/drive/1aw4PmlS7VrdBXypV0GY89hDQ9V2-yAcx)[日志的](https://github.com/JaeDukSeo/Daily-Neural-Network-Practice-2/blob/master/NeuralNetwork/eigen_auto/casee/viz/casee.txt)点击此处。
点击此处查看[案例 f 的代码](https://colab.research.google.com/drive/151eI5QtO6xUU7qAVuIUhS-QMdfIXLpp6),点击此处查看[日志。](https://github.com/JaeDukSeo/Daily-Neural-Network-Practice-2/blob/master/NeuralNetwork/eigen_auto/casef/viz/casef.txt)
**最后的话**
这是一个非常有趣的实验,通常我认为自动编码器本身就是一种降维的方法。但是现在,我越来越想知道是否可以在网络中加入额外的技术。
如果发现任何错误,请发电子邮件到 jae.duk.seo@gmail.com 给我,如果你想看我所有写作的列表,请在这里查看我的网站。
同时,在我的 twitter 上关注我[这里](https://twitter.com/JaeDukSeo),访问[我的网站](https://jaedukseo.me/),或者我的 [Youtube 频道](https://www.youtube.com/c/JaeDukSeo)了解更多内容。我还实现了[广残网,请点击这里查看博文](https://medium.com/@SeoJaeDuk/wide-residual-networks-with-interactive-code-5e190f8f25ec) t。
**参考**
1. 导入 tflearn 错误:属性错误:模块“熊猫”没有属性“计算”问题#766 tflearn/tflearn。(2018).GitHub。检索于 2018 年 7 月 11 日,来自[https://github.com/tflearn/tflearn/issues/766](https://github.com/tflearn/tflearn/issues/766)
2. 适合 ML 初学者的 MNIST。(2018).张量流。检索于 2018 年 7 月 11 日,来自[https://www . tensor flow . org/versions/r 1.0/get _ started/mnist/初学者](https://www.tensorflow.org/versions/r1.0/get_started/mnist/beginners)
3. 警告,T. (2018)。Tensorflow 导入 mnist 警告。堆栈溢出。检索于 2018 年 7 月 11 日,来自[https://stack overflow . com/questions/49901806/tensor flow-importing-mnist-warnings](https://stackoverflow.com/questions/49901806/tensorflow-importing-mnist-warnings)
4. TensorFlow,E. (2018)。张量流中的特征值问题。堆栈溢出。检索于 2018 年 7 月 11 日,来自[https://stack overflow . com/questions/43697539/tensor flow 中的特征值问题](https://stackoverflow.com/questions/43697539/eigenvalue-problems-in-tensorflow)
5. 基本功能的领域和范围。(2018).Analyzemath.com。检索于 2018 年 7 月 11 日,来自[http://www . analyze math . com/domain range/domain _ range _ functions . html](http://www.analyzemath.com/DomainRange/domain_range_functions.html)
6. tf.self _ 共轭 _eig | TensorFlow。(2018).张量流。检索于 2018 年 7 月 11 日,来自[https://www . tensor flow . org/API _ docs/python/TF/self _ 共轭 _eig](https://www.tensorflow.org/api_docs/python/tf/self_adjoint_eig)
7. (2018).Users.stat.umn.edu。检索于 2018 年 7 月 11 日,来自[http://users.stat.umn.edu/~helwig/notes/datamat-Notes.pdf](http://users.stat.umn.edu/~helwig/notes/datamat-Notes.pdf)
8. tf.random_uniform | TensorFlow。(2018).张量流。检索于 2018 年 7 月 11 日,来自[https://www . tensor flow . org/API _ docs/python/TF/random _ uniform](https://www.tensorflow.org/api_docs/python/tf/random_uniform)
9. tf.self _ 共轭 _eig | TensorFlow。(2018).张量流。检索于 2018 年 7 月 11 日,来自[https://www . tensor flow . org/API _ docs/python/TF/self _ agreement _ EIG](https://www.tensorflow.org/api_docs/python/tf/self_adjoint_eig)
10. 实施主成分分析(PCA)。(2014).塞巴斯蒂安·拉什卡博士。检索于 2018 年 7 月 11 日,来自[https://sebastianraschka . com/Articles/2014 _ PCA _ step _ by _ step . html # 4-计算-特征向量-及对应-特征值](https://sebastianraschka.com/Articles/2014_pca_step_by_step.html#4-computing-eigenvectors-and-corresponding-eigenvalues)
11. MNIST 手写数字数据库,Yann LeCun,Corinna Cortes 和 Chris Burges。(2018).Yann.lecun.com。检索于 2018 年 7 月 11 日,来自[http://yann.lecun.com/exdb/mnist/](http://yann.lecun.com/exdb/mnist/)
# Eigenfaces:从鬼魂中找回人类
> 原文:<https://towardsdatascience.com/eigenfaces-recovering-humans-from-ghosts-17606c328184?source=collection_archive---------3----------------------->

Figure #1: Casper the Friendly Ghost (source: [https://vignette.wikia.nocookie.net/christmasspecials/images/e/e8/Casper.jpg/revision/latest?cb=20121014033319](https://vignette.wikia.nocookie.net/christmasspecials/images/e/e8/Casper.jpg/revision/latest?cb=20121014033319))
用更少的拥有更多…简单!这种机器学习方法将帮助你只用一些线性代数基础知识就能在更小的空间里存储更多的信息。到那时,我们将从一些鬼影形状的混乱中恢复人脸。
你一定听说过,独立矢量以抽象的方式创造空间。现在,想象一下真实情况。所有的空间都是由向量构成的,这些空间里的东西也是如此。其中一些向量对某些事物的贡献比其他的更大。除了他们之外,其他人可能可以忽略不计,也许我们不需要知道这些,因为我们基本上不在乎,也不想带着他们的问题。这正是我在这篇文章中向你展示的特征脸。

Figure #2: not this space but also this space (source: [https://img.purch.com/w/660/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzA5Ny85NTcvb3JpZ2luYWwvc3BhY2UuanBn](https://img.purch.com/w/660/aHR0cDovL3d3dy5saXZlc2NpZW5jZS5jb20vaW1hZ2VzL2kvMDAwLzA5Ny85NTcvb3JpZ2luYWwvc3BhY2UuanBn))
我们的主题是 PCA。它是一种广泛应用于各种学科的算法。在人脸上使用它使它更容易被人类理解,所以它是最受欢迎的应用之一。本征脸是一种用于人脸识别和检测的方法,通过确定人脸图像集合中人脸的方差,并使用这些方差以机器学习的方式对人脸进行编码和解码,而不需要完整的信息,从而降低了计算和空间复杂度。尽管它在 1991 年由 Turk 和 Pentland 首次使用,并且与今天的技术相比有局限性,但它的基本原理仍然对新的实践非常有益。

Figure #3: LFW (source: [http://vis-www.cs.umass.edu/lfw/Six_Face_Panels_sm.jpg](http://vis-www.cs.umass.edu/lfw/Six_Face_Panels_sm.jpg))
在开始实现之前,我想向您简单介绍一下提到的基本概念。此外,你可以找到完整的脚本和数据集(一小部分[LFW _ 裁剪](http://conradsanderson.id.au/lfwcrop/))我用[在这里](https://github.com/n0acar/eigenfaces)。
## 特征向量和特征值
我们都知道特征向量和特征值是如何工作的。也许不完全是,但是我们听说过,好像,很多次了。这里给我这种不断遗忘的少数人一个解释。
> 让我们有一个正方形**一个**矩阵。几乎所有的矢量在乘以 **A** 时都会改变方向,就像我们预期的那样。然而,某些向量 **x** 与 **Ax** 方向完全相同。你猜怎么着?这些是我们的特征向量。特殊的……即使方向相同, **Ax** 和 **x** 仍然可能是大小不同的两个矢量。这里有一个熟悉的等式。 **Ax** =λ **x** 。使这两者相等的是λ,我们的幅度均衡器标量,特征值。这将告诉我们,我们的特征向量在相乘后是如何变化的
从上面,你可以知道为什么它们在实践中有用。为了更深入的理解和欣赏,请阅读麻省理工学院的特征值和特征向量章节。
## 主成分分析
PCA 的主要目标是降维。它在可视化、特征提取、数据压缩等方面有许多应用。其背后的思想是将原始数据线性投影到较低维度的子空间上,提供投影数据的主分量(特征向量)最大方差和/或投影的最小失真误差。最终,两者导致相同的结果,即最佳重建公式。作为旁注,这个子空间叫做主子空间。
关于方差最大化和失真误差最小化的计算,可以去 [ANU 关于 PCA 的讲义](https://machlearn.gitlab.io/isml2018/lectures/11a_Principal_Component_Analysis.pdf)。此外,youtube 上另一个名为[主成分分析-佐治亚理工学院-机器学习](https://www.youtube.com/watch?v=kw9R0nD69OU)的视频帮助我更好地理解了这些概念。
## 履行
好吧!每个人都准备实施。首先,我们将导入所需的库。我想你们都知道它们是干什么用的。我将把重点放在算法的解释部分。如果您对代码有任何其他问题,请在下面回复。
然后,我们需要一个函数来以一种好看的方式可视化我们数据集中的图像。在这里。
让我们把它放到我们的数据集上 [lfwcrop_grey.zip](http://conradsanderson.id.au/lfwcrop/lfwcrop_grey.zip) 。这里,由于计算的复杂性,我只取了前 1000 张脸,但这真的没关系。如果你想满座,那就去吧。我还将图像转换成 numpy 数组(形状为 1000,64,64)进行处理。

Figure #4: Left: The people that I thought it would be nice to viualise / Right: 16 Random Famous People that I don’t actually care from the dataset of 1000
右边的表是我将实际使用的表。我基本上可视化了 1000 个数据集中的前 16 个图像。左边的是一个数据集,当我不知道自己在做什么的时候,我从原来的数据集上收集的。然而,我注意到最好有更多的数据来更清楚地解释这些概念。
继续,下一步是定义 PCA。它的参数是图像的向量 X 和主成分的数量 n_pc。提醒一下,主成分定义了一个正交基,它可以提取原始数据中的最大方差。在我们的例子中,它的形状是(1000,4096),因为我们需要将图像转换成 PCA 的向量。然后,我们找到平均值,并将其从数据中减去,使其以原点为中心。之后,我们需要对中心数据进行奇异值分解,以找到那些被称为特征脸的主分量。

S matrix has the singular values along the diagonal while U and V are singular vectors
(SVD 很难得到,而且比那复杂得多。为了得到一个有用的例子,去麻省理工学院开放式课程视频。)

Figure #5: mean face
顺便说一下,这是数据集中所有 1000 张人脸的平均脸。我们试图找到使个人与其他人不同的特征。我希望减去每个人的平均脸和最大化方差现在更有意义。看那个。小心!有点吓人,不是吗?
接下来的步骤是操纵我们的图像成为向量,调用 PCA 函数并操纵我们的特征脸再次成为图像。

Figure #6: Bunch of ghost shaped images. Look at them in the eyes.
名为 n_components 的第一个参数决定了我们想要创建多少个特征面。这些是我们的主要组成部分,我们将从中恢复我们的数据,即人脸。除非小于 16,否则改变它不会改变这个表。然而,我可以保证只有 50 张图片是我们可以信任的,而不是一开始的 1000 张。(本征脸.形状= (50,64,64))
对于重建,我们将使用这些特征脸。正如你可能会说的,每张脸都是这些特征脸的加权组合。为了找到权重,我们应该点乘我们的中心数据和特征脸。然后,我们应该对特征脸进行加权,得到中心脸,然后再把它加到平均脸上。毕竟,我们已经准备好将恢复的人脸与原始人脸进行对比。

Figure #7: n_components=50
哇!不好看!但是,别忘了我们是从 1000 x 64 x 64 到 50 x 64 x 64 的。这样,我们保留的数据比以前少了 20 倍。尽管如此,我不会愚弄任何人。这些还不够好。很明显,我们仍然有一些重要的主要成分。让我们看看我们能做什么。我将尝试使用前 100 个组件。

Figure #8: n_components=100
越来越好,但仍然不够好。250…

Figure #9: n_components=250
这个对我来说完全令人满意。仅用我们所拥有的四分之一,我们就恢复了完全可辨别的面孔。这完全没有意义,但你可以使用 1000 个特征脸组件,并获得准确的原始结果。为了向你们展示这一点,我将运行一些计算和空间复杂度。
还在跑…坚持住…来了。
结果出来了。相当甜蜜!!!

Figure #10: n_components=1000
这篇文章实际上向你展示了用很少的数据就能获得足够好的信息,这是我们对机器学习最重要的期望之一。我希望你能看到这个应用之外的东西,并开始思考新的创新。我陈述了我在上面使用的参考文献。
再次希望你喜欢我的帖子。不要犹豫提出你的问题或给出任何类型的反馈。
干杯,
Nev
给我更多的内容和支持关注!
在 [Twitter](https://twitter.com/nevacar_) 和 [LinkedIn](https://www.linkedin.com/in/nevzat-acar/) 上与我联系……
# 人工智能中的肘聚类
> 原文:<https://towardsdatascience.com/elbow-clustering-for-artificial-intelligence-be9c641d9cf8?source=collection_archive---------1----------------------->

聚类是将一堆未分类的东西(你的数据集)根据相似性分成几堆(即聚类)的过程。这是一个无人监督的过程(不需要训练的例子)。也许最常见的方法是使用 k-means(T1),我将介绍一种不同的方法,使用高斯混合模型(GMM)和一些其他的东西(T3)。
我们今天的例子是在一个数据集中分离两种类型的图片,在你的数据集中,你实际上没有一个标签或者一个分类器。正如我们将要看到的,只要看看结果,你就能明白它的工作原理。首先,我想说明这种方法并不总是有效,因此需要一些微调。
在你的人工智能项目的每个主要步骤中,你需要记住的第一件事是 ***用你的眼睛*** 看你的数据。我再怎么强调都不为过,如果你看不到 k 均值[在做什么,它可能会愚蠢地出错](https://codeahoy.com/2017/02/19/cluster-analysis-using-k-means-explained/)。
从我在关于[图像数据集集合](/image-datasets-for-artificial-intelligence-bbb12615edd7)的文章中停止的地方继续,让我们使用 k-means 和 GMM 通过[感知哈希](https://en.wikipedia.org/wiki/Perceptual_hashing)来进行图像聚类。如果您只是想找到哪些图片与其他图片相似,在 imagehash 代码中有一个[示例可以做到这一点](https://github.com/JohannesBuchner/imagehash/blob/master/find_similar_images.py)。我们在这里尝试做的更多一些:我们想要将数据分成类别(即使我们不知道类别是什么)。[在 GitHub 上有一个这种类型的库的例子](https://github.com/zubairr/image-clustering-phash),它只被许可用于学术用途。
不管我们选择什么样的库,我们都会立即遇到一个问题:我们最终想要多少个集群?这不是[聚类库](http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html)给你的。你需要决定,决定集群的数量应该基于一些逻辑。我们应该使用……[**肘法!**](https://en.wikipedia.org/wiki/Elbow_method_(clustering))
肘法对于一个简单的想法来说是一个奇怪的名字。不断添加集群,直到你看到收益递减,然后停止。对于 k-means,这意味着从 2 个均值开始,然后是 3 个均值,以此类推,直到 k。GMM 也是同样的想法。当我们在解释方差与聚类数的关系图中看到一个拐点时,我们后退并选择看到拐点的聚类数。在下图中,您可以看到前两个点是手臂,4 处的点是肘部,前臂是 5 到 8 处的点。

Graph of explained variance vs cluster count, where the red circle shows the elbow. ([from wikipedia](https://en.wikipedia.org/wiki/Elbow_method_(clustering)))
我知道:我们计算机人现在应该停止给东西命名。[图灵机](https://en.wikipedia.org/wiki/Turing_machine),[循环赛](https://en.wikipedia.org/wiki/Round-robin_scheduling), [k-maps](https://en.wikipedia.org/wiki/Karnaugh_map) ,就是不停。
参见“ [Python Machine Learning](https://books.google.ca/books?id=_plGDwAAQBAJ&printsec=frontcover#v=onepage&q&f=false) ”第 148 页上的图,了解数据集的一些组件如何比其他组件包含更多差异(PCA)。在早期停止期间,当决定何时停止训练时,肘方法同样有效,但是在这种情况下,数据通常更嘈杂。基本上,当看起来不值得努力时,我们就停下来。
为什么这个肘法的东西不太为人所知?嗯,我想这有点主观,所以那些想知道确切数字的人会感到奇怪。此外,当我们对事物进行聚类时,我们往往会想到一些聚类,这通常是出于愚蠢的原因,但这是事实。例如,我更喜欢有一些我小小的大脑理解的集群(例如,一个小数字),而不是数学告诉我真正需要的数字。此外,我也遇到过集群数量受到硬件限制等外部因素限制的情况。可能有 299,945 种交易模式类型,但如果我在 GPU 上的时间有限空间有限的神经网络只能在有用的时间内分析 2,048 种模式类型,那么我想我们会有 2,048 个聚类。在[研究文献中有许多使用肘法](https://pdfs.semanticscholar.org/5771/aa21b2e151f3d93ba0a5f12d023a0bfcf28b.pdf)的例子。在我们的例子中,我们会看到肘法并不是唯一的游戏。
让我们继续做我们来这里要做的事情:使用感知哈希用肘方法聚类图片!让我们对来自[标准图像数据集](http://www.vision.caltech.edu/Image_Datasets/Caltech101/)的图像进行排序,看看我们最终得到了哪些子类型。这里的目标是对图像 ***进行排序,而不使用*** 使用基础事实标签来进行排序(即聚类)。我们要用 k-means 做的事情是无人监督的。它只是看着图片,把图片整理成一堆堆。使用带有标签的数据集的原因只是为了帮助在排序过程对数据集所做的事情之后进行可视化。实际上,你会用眼睛看每一组中的图片,并对它的作用有一个直观的感觉。
在我们今天的例子中,我们将使用 Caltech101 数据集的“Faces”和“airplanes”子文件夹。我们把这些图片像一副扑克牌一样混在一起,然后把它们堆成一大堆。现在想象这是一些图像抓取作业的输出。
对于上一篇文章中的叶数据集,我们最终得到的是 4102 行× 2 列,它确切地告诉我们每个图像的散列是什么。大约 20%的原始 5000+图像不会生成散列,通常是因为文件在抓取过程中不知何故被损坏。让我们更好地理解刚刚发生了什么…

Screenshot of the dataframe printing out after the hashing is completed.
我们需要解开这个鬼鬼祟祟的东西,我们称之为哈希。我们可以通过减去两个不同图像的哈希来计算图像之间的差异,但此时会出现一些奇怪的情况。尽管我们能够对这个散列值使用减法运算符,但它实际上并不做减法。通过简单地增加散列而不是减少来证明这一点,它将不会如此优雅地编译失败。那么,我们在输出端得到的这个哈希是什么呢?嗯,它是每张图片的布尔值字段。很明显,hash 字符串中的字符是十六进制的,所以打印一个元素可以揭示隐藏在这个漂亮字符串下面的 hash 的真实性质:它是一串二进制数。

The binary result of the hash is hiding inside the hex string….
那么,当我们“比较”散列时,减法运算到底在做什么呢?它执行 XOR 运算,并计算不相同的位数。换句话说,图像之间的“差异”被量化为两个图像的散列中的差异数量的计数。我们可以使用这个方便的小脚本来证明这一点…
运行该脚本时,我们会看到以下输出:

Counting the bits that didn’t match gives the same result as “subtracting” hashes.
所以,这是相当卑鄙的,但现在我们知道,散列之间的距离不是一个[可排序的](https://en.wiktionary.org/wiki/orderable)属性。它根据我们使用哪两张图像作为输入而变化。我们真正想说的是,我们计算海明距离。在 scipy land,这个指标在[距离指标列表](https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html)中排名第 8。
现在,进行聚类!我们的散列字符串中有 4 位十六进制字符,每个散列中有 16 个字符。这给了我们 64 个维度来比较图像。我们需要更新我们的 pandas 数据帧,以包括 64 个列(每个哈希特性一个)。
我们最终得到了我们想要的 64 个新列。

使用来自[这篇文章](https://datascience.stackexchange.com/questions/6508/k-means-incoherent-behaviour-choosing-k-with-elbow-method-bic-variance-explain)的代码,我们可以获得完整图像数据集的一些漂亮的图表,包括解释方差的百分比。

This figure is for hashed generated by pHash. It shows the increase in explained variance as we add clusters.
我们在上图中看到,在大约 8 或 9 个集群时,我们开始失去动力。此外,由于模型无法解释大多数方差,因此它不是一个非常有用的预测器。

This figure is for hashed generated by the average hash. It shows the increase in explained variance as we add clusters.
类似于感知哈希图,我们在上图中看到,在大约 8 或 9 个集群时,我们开始失去动力。与上图中的感知哈希相比,这种方法可以解释更多的差异(顶行是 40%,而不是 14%)。在这个图中,我们还看到了一个更好的弯头。它仍然不是一个超级有用的预测工具,但比以前好了。
现在我们有了一些答案,这意味着什么呢?每一堆都聚集了哪些图像?嗯,只有在一些受限的情况下,集群才能很好地工作。让我们看看在文章开始时混合在一起的两种图像(飞机和面孔),看看聚类是否能够将这两种图像类型分开。让我们比较一下 GMM 解混和 k-means,看看对于这个问题哪个是更好的无监督“解混器”。
首先,这是 K-means 的代码:
结果看起来像这样:

Cluster 0 is red, and cluster 1 is green. In the chart above, we can see that counting up all of the images containing faces, 90.8% ended up in cluster 0\. Similarly 62.6% of the images with faces in them ended up in cluster 0\. This is not a nice outcome.
有 800 张飞机照片和 435 张人脸照片。
正如我们在上面的饼图中所看到的,在两个集群中,飞机和人脸没有很好的分离。我们可以选择两个集群,因为我们知道有两个东西可以分成两堆。这两个类的内容最终大部分集中在 0 类中。在 GMM,我们看到了一个不同的故事。
让我们先看看 GMM 的代码,然后看看结果。
现在是几个运行示例的结果:

所以这些结果要好得多。GMM 把这些文件分成一个文件夹,里面大部分是人脸,另一个文件夹里大部分是飞机。
我们可以通过运行几次 GMM 来挑选结果,以查看何时分割看起来不错(通过对结果图像数据集的视觉检查)。我们还可以标记数据的一些子集,使用上面的代码,我们只需查看饼状图就可以了解拆分是如何进行的。这种方法比成熟的图像分类器需要更少的数据。还有 50 种其他的方法可以做到这一点,但是把这个算作第 51 种方法。
**克隆它!!**
我已经为你提供了代码,希望这能帮助你更好地处理你收集的图片。在很多课程中,这变得非常混乱,但是我有一个建议。经常发生的情况是,在很多类中,垃圾图像和重复图像聚集在一起,帮助你删除垃圾图像。然后,您可以重新集群,看看会发生什么。K-means 有时会起作用,在这种情况下,GMM 稍微好一点。世事难料。基本上,尝试很多东西,你会马上知道它什么时候起作用。
因此,总之,感知哈希可以用来将图像压缩到一组二进制维度,k-means、GMM 或其他无监督的方法可以根据这些维度将图像分类。
如果你喜欢这篇关于用 k-means 和 elbow 方法对图像进行聚类的文章,看看我过去读过的一些文章,比如“[如何给一个人工智能项目定价](https://medium.com/towards-data-science/how-to-price-an-ai-project-f7270cb630a4)”和“[如何雇佣一个人工智能顾问](https://medium.com/towards-data-science/why-hire-an-ai-consultant-50e155e17b39)”除了与商业相关的文章,我还准备了一些关于寻求采用深度机器学习的公司所面临的其他问题的文章,如“[没有云和 API 的机器学习](https://medium.com/@lemaysolutions/locked-in-a-box-machine-learning-without-cloud-or-apis-76cc54e391c8)
编码快乐!
-丹尼尔
[丹尼尔@lemay.ai](mailto:daniel@lemay.ai) ←打个招呼。
[LEMAY . AI](https://lemay.ai)
1(855)LEMAY-AI
您可能喜欢的其他文章:
* [人工智能和不良数据](/artificial-intelligence-and-bad-data-fbf2564c541a)
* [人工智能:超参数](/artificial-intelligence-hyperparameters-48fa29daa516)
* [人工智能:让你的用户给你的数据贴上标签](https://medium.com/towards-data-science/artificial-intelligence-get-your-users-to-label-your-data-b5fa7c0c9e00)
# 数据科学家的薪酬要素
> 原文:<https://towardsdatascience.com/elements-of-a-data-scientists-salary-1dc547f6d888?source=collection_archive---------4----------------------->
到目前为止,我在大会经历中最喜欢的部分是网络抓取项目。虽然在我们将在数据科学沉浸式课程中涉及的更简单的任务中,web 抓取是我最感兴趣的。我甚至写过两篇关于编写一个简单的 scraper 的博文(这篇博文的灵感来自这个项目)。
该项目的目标是找出哪些特征或变量与高薪数据科学家职位最直接相关。为了收集数据,我们在 indeed.com 运行了一个 web scraper,从美国 40 多个城市的招聘信息中提取数据。然后对数据进行处理,以创建逻辑元素,最大限度地让我们确定何时一份工作的薪酬高于全国职业的中位数。该项目得出的结论是,除了更直接的“数据科学家”术语,对决策重要的其他特征是术语“定量”、“工程师”和“机器”。没有特定的技能或编程语言成为最重要的词汇,然而,亚利桑那州和俄勒冈州都登记为负面影响特征。
# 我的方法
这些数据是使用一个 web scraper 获得的,该 web scraper 针对术语“数据科学家”迭代了 350 多个页面,并针对 42 个美国城市重复了这一过程。对于 scraper 找到的每个职位发布,它都记录了职位名称、位置、公司名称和薪水。绝大多数帖子不包括工资数据,由于它们是这个项目的目标,我只能使用包括上述数据的条目。
然后,salary 列被转换为 float,如果提供了范围,则进行平均。基于月/周/日的工资数据被转换以匹配单位:美元/年。当工资浮动数据准备就绪时,我取数据的中间值,并将高于和低于该值的任何条目分别转换为二进制 1 和 0。当我们创建模型中使用的变量时,这个过程被重复。这背后的基本原理是因为我们正在尝试使用逻辑分类来解决这个问题,它适用于二元选择。
在使用上述过程为职位和位置(按州)中的几个关键词设置变量后,我利用了一个过程,该过程对职位的所有条目中的单词进行计数,并根据它们与成功结果(即正确预测)的相关程度对它们进行排序。这个项目选择的模型是 Random Forest,这是一个分类聚合器,将使用二进制数据进行位置和“单词排序”。
# 结果

当预测与我们在实验开始前生成的测试数据集进行比较时,该模型产生了 89%的准确率。在被认为对预测很重要的显著特征中,该模型确定,除了职位名称中“数据、科学家、研究、分析师”及其组合等显而易见的词之外,还有一些其他被认为很重要的词:定量、机器、高级和技术人员,顺序如下。根据该模型,排名前 15 位的唯一一个州是亚利桑那州,排在第 10 位。

当我使用 Scikit Learn 在逻辑回归模型上运行相同的变量时,使用与上述相同的标准,我最终得到了 84%的相似准确度分数。尽管重要性的度量并不等同于系数值的排名,但我能够看到我的随机森林模型识别的特征也是逻辑回归模型中更具影响力的变量:数量、工程师、高级、亚利桑那州,这些特征都与成功的预测有非常积极或消极的关系。
下面我提供了一个简短的表格,列出了来自随机森林模型的单词作为特征及其各自的重要性,以及来自逻辑回归模型的单词及其各自的系数:

* 抱歉,尺寸有问题..
# 最后的想法…
总结从这项研究中得出的所有信息,当发布工作或寻找工作时,要注意你的用词会对薪水期望和潜在的谈判优势产生影响。在更大范围的求职中,进行像我这样的研究并不特别耗时,所以花点时间去调查市场。最坏的情况是,如果你获得了这些链接,你就有了一个很好的工作数据库和申请方法,让你的求职工作效率成倍提高。
# 带 TensorFlow hub 的 Keras 中的 Elmo 嵌入
> 原文:<https://towardsdatascience.com/elmo-embeddings-in-keras-with-tensorflow-hub-7eb6f0145440?source=collection_archive---------1----------------------->
新发布的 [Tensorflow hub](https://www.tensorflow.org/hub/) 提供了一个简单的接口,可以使用现有的机器学习模型进行迁移学习。然而,有时启动 Keras 并快速构建模型原型也是不错的。通过一些修复,很容易将 Tensorflow hub 模型与 Keras 集成在一起!
[在](https://arxiv.org/pdf/1802.05365.pdf) [Allen NLP](http://allennlp.org/elmo) 开发的 ELMo 嵌入,是 Tensorflow Hub 上许多优秀的预训练模型之一。ELMo 嵌入从双向 LSTM 的内部状态中学习,并表示输入文本的上下文特征。在各种各样的自然语言处理任务中,它的表现都优于 GloVe 和 Word2Vec 嵌入。

A bidirectional LSTM is trained on a large text corpus, and the internal states are combined to calculate rich, context sensitive features of text.
这是我们在 [Strong Analytics](http://strong.io) 的团队最近使用 Keras 中最先进的 ELMo 嵌入技术制作的一个 NLP 模型的原型。
首先,我们加载一些数据:
Load all files from a directory in a DataFrame.
def load_directory_data(directory):
data = {}
data["sentence"] = []
data["sentiment"] = []
for file_path in os.listdir(directory):
with tf.gfile.GFile(os.path.join(directory, file_path), "r") as f:
data["sentence"].append(f.read())
data["sentiment"].append(re.match("\d+_(\d+).txt", file_path).group(1))
return pd.DataFrame.from_dict(data)
Merge positive and negative examples, add a polarity column and shuffle.
def load_dataset(directory):
pos_df = load_directory_data(os.path.join(directory, "pos"))
neg_df = load_directory_data(os.path.join(directory, "neg"))
pos_df["polarity"] = 1
neg_df["polarity"] = 0
return pd.concat([pos_df, neg_df]).sample(frac=1).reset_index(drop=True)
Download and process the dataset files.
def download_and_load_datasets(force_download=False):
dataset = tf.keras.utils.get_file(
fname="aclImdb.tar.gz",
origin="http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz",
extract=True)
train_df = load_dataset(os.path.join(os.path.dirname(dataset),
"aclImdb", "train"))
test_df = load_dataset(os.path.join(os.path.dirname(dataset),
"aclImdb", "test"))
return train_df, test_df
Reduce logging output.
tf.logging.set_verbosity(tf.logging.ERROR)
train_df, test_df = download_and_load_datasets()
train_df.head()
我们接下来处理我们的数据。注意,要使用字符串作为 Keras 模型的输入,我们需要创建一个 numpy 对象数组。我已经将这些数据限制为内存的前 150 个字(ELMo 嵌入是计算密集型的,所以使用 GPU!).
Create datasets (Only take up to 150 words)
train_text = train_df['sentence'].tolist()
train_text = [' '.join(t.split()[0:150]) for t in train_text]
train_text = np.array(train_text, dtype=object)[:, np.newaxis]
train_label = train_df['polarity'].tolist()test_text = test_df['sentence'].tolist()
test_text = [' '.join(t.split()[0:150]) for t in test_text]
test_text = np.array(test_text, dtype=object)[:, np.newaxis]
test_label = test_df['polarity'].tolist()
要在 Keras 中实例化 Elmo 嵌入,我们首先必须创建一个自定义层,以确保嵌入权重是可训练的:
class ElmoEmbeddingLayer(Layer):
def init(self, kwargs):
self.dimensions = 1024
self.trainable = True
super(ElmoEmbeddingLayer, self).init(kwargs)def build(self, input_shape):
self.elmo = hub.Module('https://tfhub.dev/google/elmo/2', trainable=self.trainable, name="{}_module".format(self.name))self.trainable_weights += K.tf.trainable_variables(scope="^{}_module/.*".format(self.name))
super(ElmoEmbeddingLayer, self).build(input_shape)def call(self, x, mask=None):
result = self.elmo(K.squeeze(K.cast(x, tf.string), axis=1),
as_dict=True,
signature='default',
)['default']
return resultdef compute_mask(self, inputs, mask=None):
return K.not_equal(inputs, '--PAD--')def compute_output_shape(self, input_shape):
return (input_shape[0], self.dimensions)
现在,我们可以使用 ElmoEmbeddingLayer 构建和训练我们的模型:
input_text = layers.Input(shape=(1,), dtype=tf.string)
embedding = ElmoEmbeddingLayer()(input_text)
dense = layers.Dense(256, activation='relu')(embedding)
pred = layers.Dense(1, activation='sigmoid')(dense)model = Model(inputs=[input_text], outputs=pred)model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()model.fit(train_text,
train_label,
validation_data=(test_text, test_label),
epochs=5,
batch_size=32)
就是这样!tensorflow hub 上有很多很棒的模型,一定要全部试用!
点击这里查看 IPython 笔记本:[https://github . com/strong io/keras-Elmo/blob/master/Elmo % 20 keras . ipynb](https://github.com/strongio/keras-elmo/blob/master/Elmo%20Keras.ipynb)'
***想和芝加哥的顶级数据科学家团队一起从事各种行业中具有挑战性的 NLP、机器学习和 AI 工作吗?我们正在招聘有才华的数据科学家和工程师!***
在 [strong.io](http://strong.io) 了解更多信息,并在 [careers.strong.io](https://careers.strong.io/) 申请