TowardsDataScience 博客中文翻译 2019(二百四十八)

原文:TowardsDataScience Blog

协议:CC BY-NC-SA 4.0

如何毫不费力地用 GitHub 页面免费创建一个网站(即使你不知道自己在做什么)

原文:https://towardsdatascience.com/how-to-create-a-free-github-pages-website-53743d7524e1?source=collection_archive---------0-----------------------

GitHub Pages 入门:创建和发布免费作品集、博客或网站的快速简便指南

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

GitHub Pages 必须是人们不知道他们已经拥有的最酷的工具。几乎 GitHub 上的任何存储库都可以通过点击两个按钮变成一个网站。

你需要一个你的工作的在线作品集,让潜在的雇主检查,但你不知道如何制作一个网站?你想创建一个博客或商业网站,但你不知道从哪里开始?有没有可能你只是不想处理(或支付)网站托管,域名,以及其他一切?

这是给你的!

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

Photo by Leonard Alcira on Unsplash

我为什么要有网站?

很难想象谁不会从拥有一个网站中受益!你可能需要向潜在客户或雇主展示你的投资组合。您可能需要以一种可以共享的方式来组织项目。你可能想创建一个关于你正在做的事情或你去过的地方的博客。你可能需要宣传你自己或你的企业或销售产品。不管你的理由是什么,很有可能你不想花太多时间就想把一些东西放在一起。更有可能的是,你不想花很多钱。

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

Photo by imarksm via Pixabay

网站是与世界联系的一种方式,也是一种强大的交流工具。这是分享你的工作、兴趣和激情的一种方式。这是你如何创造,建立和控制你的在线形象。另外,你越早建立你的网站,你就有越多的时间来建立你的网上形象,接触你想接触的人。它可以帮助你在众多竞争者中脱颖而出。

如果你不知道自己在做什么,这也不是一件容易的事情。

初学者有几种方法可以创建一个简单且完全免费的网站。主要的有 GitHub 和 Wordpress。

Wordpress 对于需要所有帮助的初学者来说非常棒。我爱 Wordpress!这就是我如何开始我的第一个博客!关于一个免费的 Wordpress 网站,很明显它是一个 Wordpress 网站。你有一个以 wordpress.com 结尾的地址,并且在每一页的底部有一个 Wordpress 标志。

如果你刚进入科技领域,你会发现如果你知道如何使用 GitHub,你会看起来更有吸引力。如果你现在已经在技术世界呆了一段时间,现在你很有可能已经在 GitHub 上有了一百万到一百万个仓库。

为什么不在 GitHub 上建立你的网站,并直接从你的库托管它呢?

GIF via GIPHY

现在在技术世界中,很多重要的事情都是为开源做贡献。在社区中公开分享你的作品是一件大事。GitHub 正是为此而设计的。把你的作品放在 GitHub 上,说明你参与了,也意识到了。(如果你想看的话,我把我的作品集放在 GitHub 的一个库中。它已经相当过时了,但它是一个用 Bootstrap 构建的、由 GitHub repo 托管的个人资料网站的例子。)

当你在 GitHub 上分享你的项目时,人们可以看到你的代码,你在做什么,以及你是如何做的。GitHub 就是关于思想的交流。

现在几乎所有的技术人员都在以某种方式使用 Git 和/或 GitHub。将你的个人资料放在 GitHub 上是举起你的手并参与进来的好方法。另外,您将在您的个人资料页面上获得一个存储库和一些提交!

如果你对 Git 一无所知,你可能想看看“Git 和 GitHub 入门:完全初学者指南”那篇文章将带您了解什么是 Git 和 GitHub 的基础知识,如“”等概念。我假设你已经知道了基本知识。如果你不知道,花几分钟去熟悉他们是值得的。

让我们开始派对吧!

有两种方法可以开始你的网站。你可能会完全从零开始!另一方面,你可能已经有了一个网站,但是你不知道如何使用 GitHub 把它变成一个免费的网站。

我从选项 2 开始。

GIF via GIPHY

我有文件,但我不知道该怎么处理它们!

这再简单不过了。说真的!GitHub 会为您完成剩下的工作。我假设你已经有一个 GitHub 帐户,并且你知道什么是资源库,但是如果你不知道,请查看Git 和 GitHub 入门文章

简而言之,一个存储库就是你的项目将要存在的地方。这是您组织项目的地方。您将在存储库中保存文件夹、文件、图像、视频、电子表格、Jupyter 笔记本、数据集以及项目需要的任何其他东西。

如果您还没有,那么继续使用存储库初始化您的项目,或者创建一个新的存储库并上传您的文件。如果你有一个名为“index.html”的文件,GitHub 会知道你想做什么。

现在你将利用 GitHub 页面。进入你的 GitHub 库,点击设置

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

向下滚动到 GitHub 页面你会看到这个:

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

现在将“ Source ”下拉菜单拖放到“ master branch ”或“ master branch/docs 文件夹”事情是这样的:如果你想从你的“docs”文件夹发布,你真的需要在你的主分支中有一个“docs”文件夹,你想从那里运行你的网站!

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

如果你是一个初学者,你可能会选择“master branch”,这意味着你想按原样发布你的库。(有几次,我需要调整一两个文件路径,这取决于我如何组织我的文件夹。)

您将看到一个通知,告知您的站点可以发布了。

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

请耐心等待一两分钟,然后刷新页面或尝试链接。一旦您的站点发布,您将看到以下内容:

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

试着点击那个链接。

噗!你有一个免费网站!

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

恭喜你!!!

现在是另一个选择:

我都不知道怎么开始!

我将在另一个时间处理像引导和基本网站设计这样的事情,并在这里关注绝对的基础。不过,我确实想让你知道,这个世界是你的!唯一限制你选择的是你实现它的动力。(嗯,可能是开车,也可能是你有多少时间……)因为这个选项是针对完全初学者的,所以我将向你展示如何在 GitHub 网站上做好每一件事。

我们将首先创建一个新的存储库。

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

填写您的存储库名称和简短描述,选中“使用自述文件初始化此存储库”框,然后单击“创建存储库

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

现在转到屏幕右上方附近的“设置,然后向下滚动到“ GitHub 页面”部分。下拉显示“”的下拉菜单至“总分行

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

首先,你会看到这个:

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

等一两分钟,然后你会看到这个:

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

现在点击链接!

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

你有网站了!恭喜你!

这看起来没什么

好吧,这看起来确实很无聊,但是你可以看到这里显示的是你的自述文件。

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

如果您想做一些快速更改,您可以继续编辑您的自述文件,以显示您希望人们看到的内容。要做到这一点,请回到您的存储库中,单击您的自述文件上的小铅笔图标,并使它变得更好!

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

Edit your README file

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

Editing the file (you’re working with a Markdown file)

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

How the file looks with a few edits!

你正在使用 markdown,你可以用 Markdown 文件做很多事情。这包括添加文本、图像、链接、颜色和一些基本的格式。这是一个非常简单的开始方式!这里是基本语法的降价指南,适合以前没有用过的人。

(请记住,如果您在自述文件中添加任何图像,您需要确保将它们上传到您的资源库,否则 GitHub 不会知道您想要什么!)

现在回到你的网站,看看你有什么!

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

请注意,这些更改有时需要几分钟才能完成。如果您没有立即看到您的更改,请等待几分钟,然后重试。我还遇到了一个问题,即使我做了更改,我的笔记本电脑还是想回到我网站的旧版本。删除我过去 24 小时的浏览器历史记录解决了这个问题。在你被复杂的事情吓到之前,尝试简单的解决方法!

GIF via GIPHY

这是一个进步,但它可能会更有趣

如果你是一个完全的初学者,你对 CSS 一无所知,但是你想要更多的视觉吸引力,试试 Jekyll 主题!它们是预先构建的主题,你可以用它们来让你的网站看起来更好,而你自己基本上不需要做任何努力。Jekyll 和 GitHub 将为您完成这项工作!你的工作就是按一两个按钮。

回到“设置”中的“ GitHub 页面”部分,点击“选择一个主题

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

让我们看看,如果我们选择第一个出现的主题,我们的网站会是什么样子。你所要做的就是按下绿色的"选择主题"按钮,等待几分钟,然后再次尝试你的网站!

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

经过几分钟的努力,我们已经有所进展了!

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

就是这样!只需几分钟,您就可以为自己的企业、博客或作品集创建一个免费网站,通过 GitHub 存储库托管它,而且它已经开始运行了。你已经准备好与世界分享了!

好样的。!!

只有几个提示:

*如果你决定你根本不想使用一个主题,没有按钮可以回到原来的版本。不过,去掉你的主题其实是完全容易的!如果你回到你的存储库,你会发现你现在有一个名为“ _config.yml ”的文件,它包含了你的主题信息。如果你删除了那个文件,你就删除了主题!

*如果您想尝试您的主题和主题选项,您会发现" _config.yml "文件是您的第一站。现在你知道了,看看你拥有的无数其他 Jekyll 选项吧!如果你想要一个简单的已经设置好的博客,你甚至可以从 Jekyll Now 主题开始。你的选择是无限的!

我等不及要看你创造的东西了!一如既往,如果你用这些信息做出了什么惊人的事情,请在下面的评论中让每个人都知道。

如果你想接触或者找到更多很酷的文章,请到内容简约来和我一起吧!

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

你可能也想看看我在 Medium 上为初学者写的其他教程!

[## 如何撰写和发表引人注目的文章

创建内容的简单技巧,易于查找,阅读起来令人兴奋

medium.com](https://medium.com/swlh/how-to-write-and-publish-articles-that-get-noticed-60e9701daed4) [## Git 和 GitHub 入门:完全初学者指南

Git 和 GitHub 基础知识,供好奇和完全困惑的人使用(加上最简单的方法来为您的第一次公开…

towardsdatascience.com](/getting-started-with-git-and-github-6fcd0f2d4ac6) [## Google Colab 入门

沮丧和困惑的基本教程

towardsdatascience.com](/getting-started-with-google-colab-f2fff97f594c)

感谢阅读!

不写代码怎么创建热图?

原文:https://towardsdatascience.com/how-to-create-a-heat-map-without-writing-code-e1d7b10cf33f?source=collection_archive---------15-----------------------

我们如何在不编写一行代码的情况下创建热图?这听起来不可能,但实际上非常容易实现。有时候,我们需要善于利用工具和学习技巧来帮助我们节省时间,提高工作效率。今天我将向你展示如何不用写代码就能制作地震热图。而我用的工具是一个数据可视化软件,FineReport。

个人版 FineReport 完全免费。想学做热图可以下载,跟着我的教程练习。

首先给大家展示一下地震图的最终效果。图为 1999 年至 2019 年地震的分布和震级。

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

上面的截图只显示了东南亚的地震。我还做了一个 3D 动态热图,显示地震的全球分布。而且我在制作过程中没有使用任何代码。

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

现在,让我们开始学习如何可视化数据

1。找到数据源

数据可视化的第一步是找到数据的来源。我们可以从 美国地质调查局 获得各个地区的地震热图数据。在这篇文章中,我们将 1999 年至 2019 年的世界地震数据导入 Excel,然后编辑成如下图所示的统一格式。

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

2.连接数据集

接下来,我们将数据导入 FineReport 设计器。 FineReport 可以连接各种数据库。

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

但是如果数据来自 Excel,我们需要把 Excel 文件放在安装 FineReport 的同一个
路径下。比如在我的电脑里,我把上面创建的 Excel 文件放入C:\ fine report _ 10.0 \ WEB apps \ webroot \ we b-INF \ reportlets,作为内置模板。

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

然后打开 FineReport 设计器,你会找到你的 Excel 文件。选择文件,设置文件类型Excel ,选择本地文件,选择刚导入的 Excel 文件,在右侧选择“首行包含列标题”,数据导入完成。

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

3.选择图表类型

我们创建一个新表单来设计仪表板,并在图表中选择热图,如下所示。

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

单击地图进行编辑。选择地图点,这里我选择模板参数,然后选择 GIS 图层选择卫星。您可以设置地图显示的中心点。这里我选择(101,0)来显示,以东南亚为中心。

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

然后将数据导入地图。设置如下。

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

4.设计热图的样式

最后,我们调整了热图的样式。

默认情况下,图例设置为渐变颜色。您可以根据需要定义最大值和最小值。选择图表属性表- >样式- >系列,可以看到系列属性分为两种设置:热点BG 区域。如果用户选择的边界/点不包含边界信息,则设置无效。热点的串联界面如下:渲染半径越大,热区显示范围越大;模糊越大,热边界的模糊程度越高。不透明度最小值和最大值,对应于图形中最小和最大值的不透明度,在此设置如下。

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

5.效果显示

点击预览,一个没有编码的热图就完成了。

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

看到这里你可能会问文章开头的 3D 动态热图是怎么做出来的?这很简单。插入图表时,只需选择结构(新)。而且我觉得后续的设置你可以自己摸索,和上面的步骤差不多。

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

最后

除了热图,如果想了解地图可视化,可以看看这篇文章 数据可视化中的 10 大地图类型

您可能也会对…感兴趣

2019 年你不能错过的 9 个数据可视化工具

2019 年 6 大数据分析工具

什么是大屏幕的数据可视化,如何实现?

数据分析师需要掌握的 6 项关键技能

业务仪表盘初学者指南

数据可视化中排名前 16 的图表类型

如何从零开始创建机器学习数据集?

原文:https://towardsdatascience.com/how-to-create-a-machine-learning-dataset-from-scratch-6a24a9fd1673?source=collection_archive---------19-----------------------

我祖母的烹饪书遇见机器学习第一部分

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

Figure 1: My grandmothers old, German cookbook: “Praktisches Kochbuch” by Henriette Davidis

我的祖母是一位杰出的厨师。因此,当我最近偶然发现她的旧烹饪书时,我试着通读了一些食谱,希望我能重现一些我小时候喜欢的菜肴。然而,这比预期的要难,因为这本书是在 1911 年左右以一种叫做frak tur的字体印刷的。不幸的是,fraktur 字体偏离现代字体在几个例子。例如,字母*“A”看起来像 fraktur 中的“U”,每当我看到 fraktur 中的“Z”时,我就会读出一个“3”*(见图 2)。

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

Figure 2: Examples of letters in fraktur and in a modern typeface (Calibri)

因此,这个想法出现了,以开发一个管道,将创建一个现代字体的 fraktur 字母的现场翻译。有了这样的工具在手,我们可以很容易地通读食谱,并专注于烹饪部分,而不是破译这本书。幸运的是,有许多优秀的开源工具可以帮助我们开发这样的管道。然而,这个项目的一些方面必须从头开始建设。主要是我们需要一个数据集来训练我们的机器学习算法。这就是我们将在本文中重点讨论的内容。但在我们开始使用数据集之前,让我们快速浏览一下摆在我们面前的所有任务:

  1. 检测图像中的单个字母
  2. 从这些字母创建一个训练数据集
  3. 训练一个算法来分类字母
  4. 使用经过训练的算法对单个字母进行分类(在线)

我们将在本文中讨论前两个主题,并在第二和第三篇文章中继续讨论主题 3 和 4。这应该给我们足够的空间来详细研究每个任务。

同样作为一个一般备注:在这些文章中,我们不会关注如何从头开始实现每个算法。相反,我们将看到如何连接不同的工具,将烹饪书翻译成现代字体。如果你对代码比对解释更感兴趣,你也可以直接去 Github 上的 Jupyter 笔记本。

检测图像中的字母

所以第一个任务是找到一种方法从烹饪书的书页中提取单个字母。这是后面一切的基础。在下一步中,我们可以从提取的字母中创建一个数据集,并最终在其上训练一个分类器。

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

Figure 3: Picture of one paragraph of the cook book

我们管道的输入将总是来自烹饪书的页面图片,类似于上面图 3 所示。这些输入可以是来自智能手机摄像头的单个高分辨率图像,也可以是来自网络摄像头的图像流。我们必须确保的是,每一张独立于其来源的图像,都以一种检测算法可以找到所有单个字母的方式进行处理。这里首先要记住的是,数码相机是以三个独立的通道存储图像的: R ed、 G reen 和 B lue ( RGB )。但是在我们的例子中,这三个通道包含冗余信息,因为字母可以在这三个通道的每一个中分别被识别。因此,我们将首先把所有图像转换成灰度。结果,我们只需要处理一个通道,而不是三个通道。此外,我们还将数据量减少到 1/3,这将提高性能。但我们的检测算法将面临另一个问题:不断变化的闪电条件。这使得从背景中分离字母变得复杂,因为整个图像的对比度发生了变化。为了解决这个问题,我们将使用一种称为自适应阈值的技术,该技术使用附近的像素来创建局部阈值,然后用于二值化图像。结果,处理后的图像将仅由黑白像素组成;不再是灰色了。然后,我们可以通过使用中值模糊滤波器对图像进行去噪来进一步优化字母检测。下面的代码概述了一个 Python 函数,它在 openCV 库的帮助下将图像从 RGB 转换为黑白。该处理步骤的结果在图 4 中进一步举例说明。

# Define a function that converts an image to thresholded image
def convert_image(img, blur=3):
    # Convert to grayscale
    conv_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # Adaptive thresholding to binarize the image
    conv_img = cv2.adaptiveThreshold(conv_img, 255,   
               cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
               cv2.THRESH_BINARY, 11, 4) # Blur the image to reduce noise
    conv_img = cv2.medianBlur(conv_img, blur) 

    return conv_img

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

Figure 4: The left image shows the original picture, middle image shows the gray scaled version and the right image shows the thresholded and blurred result.

好了,现在我们处理了图像,是时候检测字母了。为此,我们可以使用 openCV 库的 findContours 方法。代码归结为一行,由下面的函数调用。然后,我们可以将该函数找到的轮廓的边界框映射回原始 RGB 图像,以查看实际检测到了什么(图 5)。

# Define a function that detects contours in the converted image
def extract_char(conv_img):
    # Find contours
    _, ctrs, _ = cv2.findContours(conv_img, cv2.RETR_TREE,  
                 cv2.CHAIN_APPROX_SIMPLE) return ctrs

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

Figure 5: Result of detected contours mapped back onto the original image.

从图 5 中我们可以看到检测工作得相当好。但是,在某些情况下,没有检测到字母,例如,第 1 行末尾的一些*“I”。而在另外一些情况下,一个字母被拆分成两个字母,例如【b】在最后一行的末尾。另一件要注意的事情是,一些字母组合实质上变成了单个字母,并被算法相应地检测到,图 5 中的两个例子是“ch”“CK”*。我们将在后面看到如何处理这些问题。但是现在我们可以继续目前的结果。因此,由于我们有了每个字母的边框,我们可以将它们剪切下来,保存为单独的图像。png)放在我们硬盘上的一个文件夹里。如果你对如何做到这一点感兴趣,可以看看 Jupyter 的笔记本。

创建数据集

拥有一组提取的字母是好的,但是我们需要以一种数据集对我们有用的方式来组织它们。为此,我们必须做两件事:

  1. 删除不包含字母的图像。这可能是各种各样的伪像,例如,我们在图 5 中看到的一页上的污点或一封信的一部分。
  2. 将所有剩余图像分组。这意味着所有字母*“A”进入一个文件夹,所有字母“B”*进入另一个文件夹,依此类推。

原则上,以上两点都很容易解决。然而,由于我们从这本书的许多页中提取了几千封潜在的信件,它们构成了一个漫长而乏味的任务。从好的方面来看,我们可以自动化第一轮分组,这样我们以后“只”需要纠正这个预分组步骤的结果。但是在我们开始这个聚类步骤之前,还有一件事要做:我们必须使提取的字母的所有图像具有相同的大小。

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

Figure 6: Scatter plot of the first 3 PCA scores. Color represents the cluster.

其原因是,我们将用于聚类和分类的算法预期输入图像的大小是固定的。但是正如我们从图 5 的边界框中看到的,每个图像目前都有不同的形状。为了克服图像尺寸的多样性,我们将使用 openCV 库的 resize 方法,并将所有图像调整到相同的尺寸。然后,我们将图像存储在一个 Numpy 数组中,并通过计算它们的 z 值来归一化它们。归一化对于下一步很重要,下一步是用主成分分析(PCA)降低每幅图像的维数。然后,第一主成分的分数将作为 K-Means 聚类算法的输入,该算法将为我们进行字母的预聚类。如果你对这个过程和 K-Means 算法的细节感兴趣,你可以查看这篇文章的 Jupyter 笔记本,或者在这里了解一个不同的用例。K-Means 聚类的结果如图 6 所示,其中每个点的颜色表示它所属的聚类。查看图 6 看起来一些数据点形成的组也通过 K-Means 算法被分配到同一个聚类。然而,仅仅从图 6 中很难判断集群工作得有多好。评估结果的一个更好的方法是将一个簇中的所有图像移动到一个单独的文件夹中,然后查看每个簇的内容。图 7 显示了一个示例文件夹中的图像,在该文件夹中,集群工作得非常好。下一步是将该文件夹重命名为“a”。

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

在其他情况下,聚类效果并不好。图 8 显示了一个包含不同类型字母的集群示例。虽然大多数字母是“n ”,但在字母串中也有一些“K”和“u”。然而,我们可以通过搜索“K”和“u”集群并将图像移动到那里来轻松解决这个问题。之后,该文件夹可以重命名为“n”。

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

Figure 8: Example folder with clustered data that contains different letters

我们将继续这样做,直到所有的集群都被清理和重命名,如上所述。结果应该类似于图 9,其中大写字母用“_”标记。

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

Figure 9: Example of how the data should be organized after clustering and manual adjustments.

因此,显然需要一些手工工作来整理数据。然而,我们能够通过使用 PCA 和 K-Means 对数据进行预聚类来自动化大部分工作。数据集现在已经清理和组织好了,但是为了让我们更有效地工作,我们需要以一种比硬盘上的文件夹更方便的方式保存它。

将数据集转换为 IDX 格式

因此,最后一步是将数据集转换为 IDX 数据格式。你可能已经熟悉了这种格式,因为著名的 MNIST 数据集也是以同样的方式保存的。只是在这里,我们必须写数据,而不是从 IDX 文件中读取数据。
我们将通过使用一个 idx_converter 来实现,它采用我们上面设置的文件结构,并直接以 idx 格式保存。输出将是两个文件:一个文件包含图像,另一个文件包含标签。
由于我们希望稍后在数据上训练一个分类器,我们应该已经将图像分成训练和测试数据集。为此,我们将 30%的字母移动到测试文件夹,而剩余的字母留在培训文件夹中。您可以查看 Jupyter 笔记本中的代码,了解有关该程序实现的详细信息。

既然我们已经从头开始创建了 fraktur 数据集,我们可以继续下一篇文章,在这篇文章中,我们将比较几个分类器算法的性能,以便选择一个用于烹饪书的实时翻译。

同时,你可以在这里查看这篇文章的完整代码,在 Twitter 上关注我或者通过 LinkedIn 联系我。

如何创建一个 Plotly 可视化,并将其嵌入网站

原文:https://towardsdatascience.com/how-to-create-a-plotly-visualization-and-embed-it-on-websites-517c1a78568b?source=collection_archive---------3-----------------------

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

Examples from Plot.ly

Plotly 是一个开源的、易于使用的 python 图表库。Plotly.express 是作为 Plotly.py 的包装器构建的,使创建交互式可视化像编写一行 python ✨一样简单

plotly.express之于plotly就像seaborn之于matplotlib

有很多很酷的交互式可视化可以用 Plotly Express 创建——就像这个使用 Airbnb 数据集的可视化:

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

使用 Plotly express 创建的交互式可视化可以在大多数笔记本和 IDE 上渲染和显示。将它们嵌入其他地方则是另一回事。如果你在嵌入你的交互式可视化图形时遇到了麻烦,那你就来对地方了!

在本文中,我将介绍如何使用 plotly express 创建一个基本的交互式可视化,并生成 iframe 嵌入代码以在任何网站上显示它。

步骤如下:

  • 创建情节可视化
  • 主机可视化(在 plotly 或 github 页面上)
  • 获取 iframe 嵌入代码

创建一个情节可视化

如果您还没有,使用!pip install plotly将 plotly 安装到您的环境中,并使用import plotly.express as px导入 plotly。

运行以下代码创建一个基本的可视化:

gapminder = px.data.gapminder()
fig = px.scatter(gapminder.query("year==2007"), x="gdpPercap", y="lifeExp", size="pop", color="continent",
           hover_name="country", log_x=True, size_max=60)fig.show()

下图应该会出现在您的笔记本中:

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

现在你有了一个交互式可视化工具…让我们把它放在某个地方吧!

上传可视化到 Plotly

如果你的数据集足够小,你就可以免费将你的可视化上传到 plotly,如果不够小,当你尝试下面的部分时,它会给你一个错误。我将在下一节解释如果遇到错误如何解决。

要将可视化上传到您的 plotly 帐户,请使用!pip install chart_studio安装 chart studio,然后使用import chart_studio将其导入。

您将需要您的用户名和 api 密钥从您的 plotly 帐户连接到它从您的笔记本电脑。要获取您的 api 密钥,只需点击您的个人资料右上角的用户名,然后点击设置,然后重新生成一个新的 api 密钥。现在,您可以设置您的凭据:

username = '' # your username
api_key = '' # your api key - go to profile > settings > regenerate keychart_studio.tools.set_credentials_file(username=username, api_key=api_key)

使用以下代码行将您的可视化应用到您的帐户中:

import chart_studio.plotly as py
py.plot(fig, filename = 'gdp_per_cap', auto_open=True)

如果操作正确,这段代码应该会在你的帐户上打开一个新的可视化窗口,并返回你的笔记本中的链接。您可以使用相同的链接,然后在支持 embed.ly 嵌入的网站上嵌入,如 Medium。注意:当你在 Medium 上写文章的时候,你的可视化效果不会是交互式的,但是一旦你发布了它,它就会起作用。

这是我们创建的交互式可视化,我只需粘贴链接就可以嵌入到 Medium 中…很简单。

如果把你的可视化上传到 plotly 对你有用,那太好了。您可以跳到下一节,我将向您展示如何生成 iframe 嵌入代码。

为绘图可视化生成 HTML

当您正在处理的数据集太大时,您将从 plotly 获得一个错误,即您无法上传可视化,除非您升级您的帐户。因此,为了解决这个问题,我们将把我们的可视化图形写成 HTML。

首先,让我们创建一个大型数据集的可视化。我将使用 Airbnb 的数据,这些数据可以在这个 github repo 中找到。如果您想继续学习,可以下载 csv。

下面是创建我将使用的数据帧的代码:

下面是创建可视化的代码:

fig = px.scatter(df, x='Neighborhood', y='Price (US Dollars)'
                 ,size='Accommodates'
                 , hover_data=['Bedrooms', 'Wifi', 'Cable TV', 'Kitchen', 'Washer', 'Number of Reviews']
                 ,color= 'Room Type')fig.update_layout(template='plotly_white')
fig.update_layout(title='How much should you charge in a Berlin neighborhood?')fig.show()

输出将如下所示:

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

现在,如果您尝试使用py.plot(fig, filename='airbnb', auto_open=True)将它上传到您的 plotly 帐户,您将会看到以下错误:

PlotlyRequestError: This file is too big! Your current subscription is limited to 524.288 KB uploads. For more information, please visit: [https://go.plot.ly/get-pricing.](https://go.plot.ly/get-pricing.)

因此,我们将把我们的可视化结果写成 HTML,并放在 github 页面上。

创建 HTML

要为 plotly 可视化生成 HTML 文件,请使用:

import plotly.io as pio
pio.write_html(fig, file=’index.html’, auto_open=True)

如果操作正确,这段代码将在您的浏览器中打开本地 HTML 文件,您应该会看到可视化效果。

GitHub 页面的宿主

发布到 github 页面非常简单。你可以按照 github 这里的说明或者按照我的简要概述来做。

创建一个新的 github repo 并用 README.md 初始化。上传我们刚刚创建的 index.html 文件,并将其提交到主分支。现在,点击设置,向下滚动到 github 页面部分,在“源”下选择“主分支”。

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

现在你应该可以使用这个链接结构来查看你的可视化效果了

我刚刚做的那个可以在这里找到https://elizabethts.github.io/publish-plotly-website/

用 iframe 嵌入 Plotly 可视化

现在我们有了到我们的 plotly 可视化的链接(托管在 plotly 或 github 页面上),我们可以为可视化生成 iframe 代码。如果您能够将可视化上传到 plotly,则可以使用以下代码行生成 iframe 嵌入代码:

*import chart_studio.tools as tls
tls.get_embed('[https://plot.ly/~elizabethts/9/'](https://plot.ly/~elizabethts/9/')) #change to your url*

这将为您提供输出:

*<iframe id="igraph" scrolling="no" style="border:none;" seamless="seamless" src="https://plot.ly/~elizabethts/9.embed" height="525" width="100%"></iframe>*

如果您走的是 github pages 路线,您需要自己修改上面的 iframe 代码。把 plotly 网址换成 github 网址就行了!

最后,您可以将这个 iframe 嵌入代码放到您的站点中,您的可视化效果将会出现!注意:如果使用 github 链接,可能需要修改高度和宽度。

讽刺的是,据我所知,如果你的数据集太大,你不能在媒体上嵌入你的交互式可视化,你必须把它放在 github 上。为了解决这个问题,我强烈推荐使用 CloudApp 来筛选记录 gif,你可以轻松地将其拖放到你的中型文章中,这就是我在这篇文章中所做的。

现在,您可以创建一个交互式的 plotly 可视化,并生成 iframe 嵌入代码以在任何网站上显示它!

在推特上找到我@伊丽莎白

来源:

* [## plotly

Plotly 的 Python 图形库制作出交互式的、出版物质量的图形。如何制作线图的示例…

plot.ly](https://plot.ly/python/) [## Python 的 Plotly 入门

情节可以设置为三种不同类型隐私:公开、私人或秘密。公共:任何人都可以查看此图表。它…

plot.ly](https://plot.ly/python/getting-started-with-chart-studio/) [## ✨推出 Plotly 快递✨

Plotly Express 是一个新的高级 Python 可视化库:它是 Plotly.py 的包装器,公开了一个简单的…

medium.com](https://medium.com/plotly/introducing-plotly-express-808df010143d) [## 在 HTML 中嵌入图形

Plotly 图形可以嵌入任何 HTML 页面。这包括 IPython 笔记本、Wordpress 网站、仪表盘、博客…

plot.ly](https://plot.ly/python/embedding-plotly-graphs-in-HTML/) [## GitHub 页面

使用你最喜欢的文本编辑器,在你的项目中添加一个 index.html 文件:Hello World I hosted with GitHub Pages…

pages.github.com](https://pages.github.com)*

如何创建一个生产就绪的推荐系统

原文:https://towardsdatascience.com/how-to-create-a-production-ready-recommender-system-3c932752f8ea?source=collection_archive---------2-----------------------

我们每天在网上看到很多东西。但是你知道有多少其他的东西我们还没有看到吗?

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

Photo by Susan Yin on Unsplash

你可能每天都会看到电子商务网站。或者阅读大量博客、新闻和媒体出版物上的文章。

从你作为用户或读者的角度来看,看所有这些东西时,常见的痛点是什么?

一个简单的答案:

有很多东西可以看,当你试图发现一些东西的时候,你经常会迷失方向。

是的,这些网站上有大量的东西或文章,用户需要一个解决方案来简化他们的发现之旅。

如果你是运营电商网站或者博客的,也许你想问。何必呢?

嗯,你听说过漏斗吗?

用户在尝试做某件事的时候漏斗越少,转化就越大。这是用户体验的基本规则。那么,如果减少步骤数量可以增加你的网站页面浏览量甚至收入,为什么不呢?

如果你想阅读更多关于推荐系统或深度学习的一般内容,可以在这里 下载免费书籍

推荐系统能有什么帮助?

简单来说,推荐系统就是一个发现系统。系统从数据中学习并向用户提供建议。无需用户专门搜索该项目,该项目由系统自动带来。

听起来很神奇。

亚马逊和网飞从几十年前就开始使用这种魔法。

当你打开 Spotify 时,它已经给了你一个听歌曲的列表(发现周刊,我惊讶于它如何能挑选我从未听过的歌曲,我喜欢它)。

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

Photo by Samuel Zeller on Unsplash

关于推荐系统的深入探讨

一般来说,有两种推荐系统被我们人类所知。嗯,不全是人类。

1.基于内容的过滤

这种推荐系统很容易被我们的大脑所消化。没有短路或爆炸的迹象。

例如,你是一个狂热的小说读者。你喜欢阿加莎·克里斯蒂的《然后就没有了》。你从网上书店买的。

如果下次你打开网站,书店会给你看“美国广播公司谋杀案”,这是有道理的。

为什么?

因为它们都是阿加莎·克里斯蒂写的。

因此,基于内容的过滤模型会向您推荐该标题。

哇,这么容易!让我们利用这一点!

等等…

虽然基于内容的过滤很容易被我们的大脑消化,而且看起来很简单,但它无法猜测用户的真实行为。

例如,我不喜欢赫丘里·波罗,但我喜欢她小说中的其他侦探。在这种情况下,“ABC 谋杀案”不应该推荐给我。

2.协同过滤

这种类型将克服前面的问题。本质上,该系统记录了用户在网站上的所有先前的交互。并在此基础上提供建议。

它是如何工作的?

看一下这个场景。

有两个用户 A 和 b。

购买的项目 1

购买的项目 2

购买的项目 3

b 购买的项目 1

b 购买的项目 3

协同过滤将推荐 B 项目 2 ,因为有另一个购买了项目 1 和 3 的用户也购买了项目 2。

你可能会说,哇,它们可能是偶然凑巧一起买的。

但是,如果,有 100 个用户和用户 A 有同样的行为呢?

这就是所谓的**,群体的力量**。

那么,为什么要等呢?让我们开始在您的生产环境中创建协作过滤系统吧!

别冲动,伙计!

虽然它的性能非常好。它有几个严重的问题。更重要的是,当您试图创建一个生产就绪的系统时。

协同过滤的缺点

  1. 它不知道上下文。与推荐相似项目的基于内容的过滤相比,协同过滤不会基于相似性进行推荐。如果这是您关心的问题,那么解决方案就是混合动力。结合两种方法。
  2. 它需要大量的硬件资源,因为你需要存储一个用户条目矩阵。想象一下,如果你打开你的电子商务网站,它有 10 万用户。同时,你提供 10K 产品。在这种情况下,您将需要 10K x 100K 矩阵,其中每个元素包含 4 个字节的整数。是的,你需要 4GB 的内存来存储矩阵。甚至不做其他事情。
  3. 冷启动。一个新用户不会从系统中得到任何好处,因为你不了解他。
  4. 不可改变的。如果你没有在网站上做任何事情,推荐系统的结果将保持不变。用户会认为网站上没有什么新东西。他们会离开。

虽然第一个问题很容易通过混合动力解决,但其他问题仍然令人头疼。

嗯,解决数字 2,3,4 是这篇文章的原因。

我们开始吧。

让您的推荐系统投入生产的明确指南

我可能和你在同一个地方。我真的不知道如何让这件事成为可能。由于机器的限制,当然还有常识,我不能仅仅为了这个微小的需求就部署一个庞大的服务。

幸运的是,我偶然发现了这本书

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

Practical Machine Learning by Ted Dunning & Ellen Friedman

他们告诉我,对于一个生产就绪的系统,您可能不希望它的性能达到最佳精度。

一个有些不准确但可接受的在现实世界中最常见的用例。

关于如何做到这一点,最有趣的部分是,

  1. 一般推荐指标的批量计算。
  2. 实时查询,不使用用户-项目矩阵,而是取用户最近的几次交互,查询到系统。

当我们建立系统的时候让我解释。

基于 Python 的推荐系统

为什么是 python?嗯,python 是最容易学的语言之一。你只需要花几个小时就能理解语法。

for item in the_bag:
    print(item)

你可以打印包里的所有东西。

这么简单。

Python 网站根据你的操作系统下载安装。

对于本教程,您需要几个包

pip install numpy
pip install scipy
pip install pandas
pip install jupyter
pip install requests

Numpy 和 Scipy 是处理数学计算的 python 包,你将需要它们用于矩阵。熊猫是用于你的数据。请求用于 http 调用。Jupyter 是一个交互式运行 python 代码的 web 应用程序。

键入 jupyter 笔记本,你会看到这样的内容

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

Jupyter Notebook

在提供的单元格上编写代码,代码将交互式运行。

在我们开始之前,你需要几个工具。

  1. 弹性搜索。这是一个开源搜索引擎,可以让你快速搜索你的文档。您将需要这个工具来保存您计算的指标,以便您可以实时查询。
  2. 邮递员。一个 API 开发工具。您将需要它来模拟对 elasticsearch 的查询。因为 elasticsearch 可以通过 http 访问。

下载并安装这两个软件,你就可以开始了。

数据

对于本教程,我们来看看 Kaggle 中的一个数据集。 Retailrocket 推荐系统数据集。下载并提取 Jupyter 笔记本目录中的数据。

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

应该是那样的。

在这些文件中,对于本教程,您只需要 events.csv。

该文件由用户对电子商务网站上的商品的数百万次操作组成。

让我们来探索数据!

import pandas as pd
import numpy as np

在 Jupyter 笔记本上写下那些进口货。你已经准备好了。

df = pd.read_csv('events.csv')
df.shape

它会打印你(2756101,5)。这意味着你有 270 万行 5 列。

我们去看看。

df.head()

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

它有五列。

  1. 时间戳,事件的时间戳。
  2. Visitorid,用户的 id
  3. Itemid,项目的 id
  4. 事件,事件
  5. Transactionid,如果事件是事务,则为事务的 id

让我们查一下,有什么样的活动

df.event.unique()

您将得到三个事件,视图添加到图表事务

为了简单起见,您可能不想玩所有的事件。对于本教程,您将只玩事务。

因此,让我们只过滤事务。

trans = df[df['event'] == 'transaction']
trans.shape

它将返回(22457,5)

你将有 22K 的交易可以玩。我认为对于我们这样的新手来说已经足够好了。

让我们进一步看看这些数据

visitors = trans['visitorid'].unique()
items = trans['itemid'].unique()print(visitors.shape)
print(items.shape)

您将获得 11,719 个独特的访问者和 12,025 个独特的项目。

创建简单而有效的推荐系统的经验法则是在不损失质量的情况下对数据进行下采样。这意味着,你可以为每个用户只取 50 个最新的交易,你仍然可以得到你想要的质量,因为行为会随着时间的推移而改变。

trans2 = trans.groupby(['visitorid']).head(50)
trans2.shape

现在你只有 19939 笔交易。意味着大约有 2K 个事务被废弃。

因为访问者 id 和项目 id 是巨大的数字,你将很难记住每一个 id。

trans2['visitors'] = trans2['visitorid'].apply(lambda x : np.argwhere(visitors == x)[0][0])
trans2['items'] = trans2['itemid'].apply(lambda x : np.argwhere(items == x)[0][0])trans2

您需要其他基于 0 的索引列。你会看到这样的东西。

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

更干净。现在,在接下来的所有步骤中,您可以只使用访问者和项目列。

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

Photo by Andrei Lazarev on Unsplash

下一步:创建用户-项目矩阵

噩梦来了…

你有 11,719 个独立访问者和 12,025 个条目,所以你需要大约 500MB 的内存来存储这个矩阵。

稀疏矩阵来拯救。

稀疏矩阵是大部分元素为零的矩阵。这是有意义的,因为不是所有的用户都购买所有的商品。连接的批次将为零。

from scipy.sparse import csr_matrix

西皮有这个东西。

occurences = csr_matrix((visitors.shape[0], items.shape[0]), dtype='int8')def set_occurences(visitor, item):
    occurences[visitor, item] += 1trans2.apply(lambda row: set_occurences(row['visitors'], row['items']), axis=1)occurences

对数据中的每一行应用 set _ occurences 函数。

它会打印出这样的内容

<11719x12025 sparse matrix of type '<class 'numpy.int8'>'
	with 18905 stored elements in Compressed Sparse Row format>

在矩阵中的 1.4 亿个单元中,只有 18905 个填充了非零值。

所以基本上你只需要把这 18,905 个值存储到内存中。效率提高了 99.99%。

稀疏矩阵的缺点是,当试图实时检索数据时,它的计算量较高。所以,你不应该在这一步结束。

同现是一个更好的现象

让我们构建一个商品-商品矩阵,其中每个元素表示用户一起购买这两种商品的次数。称之为共生矩阵。

要创建一个共生矩阵,你需要将共生矩阵的转置矩阵和它本身进行点积。

我试过没有稀疏矩阵,我的电脑突然停止工作。所以,我们不要这样做。

cooc = occurences.transpose().dot(occurences)
cooc.setdiag(0)

它立即完成了一个稀疏矩阵。我很开心。

setdiag 函数将对角线设置为 0,这意味着您不想计算项目 1 的值,因为项目 1 是同一个项目,所以它们会放在一起。

反常行为更好

同现矩阵将由两个项目一起购买的次数组成。

但是有可能有一件物品。不管用户的行为如何,该商品都会被购买。可能是闪购之类的。

实际上,你可能想要真正捕捉用户的行为,从类似闪购的东西中清理出来。因为这不是你所期望的行为。

为了去除那些受影响的东西,你需要在同现矩阵上扣分。

泰德·邓宁斯在之前的书里有一个算法叫做,对数似然比或 LLR。

def xLogX(x):
    return x * np.log(x) if x != 0 else 0.0def entropy(x1, x2=0, x3=0, x4=0):
    return xLogX(x1 + x2 + x3 + x4) - xLogX(x1) - xLogX(x2) - xLogX(x3) - xLogX(x4)def LLR(k11, k12, k21, k22):
    rowEntropy = entropy(k11 + k12, k21 + k22)
    columnEntropy = entropy(k11 + k21, k12 + k22)
    matrixEntropy = entropy(k11, k12, k21, k22)
    if rowEntropy + columnEntropy < matrixEntropy:
        return 0.0
    return 2.0 * (rowEntropy + columnEntropy - matrixEntropy)def rootLLR(k11, k12, k21, k22):
    llr = LLR(k11, k12, k21, k22)
    sqrt = np.sqrt(llr)
    if k11 * 1.0 / (k11 + k12) < k21 * 1.0 / (k21 + k22):
        sqrt = -sqrt
    return sqrt

LLR 函数计算两个事件 A 和 B 同时出现的可能性。

这些参数是,

  1. k11,两个事件同时出现的次数
  2. k12,数 B 出现而无 A
  3. k21,A 出现的次数没有 B 多
  4. k22,其他一些东西出现的时候没有他们两个

现在计算 LLR 函数并保存到 pp_score 矩阵中。

row_sum = np.sum(cooc, axis=0).A.flatten()
column_sum = np.sum(cooc, axis=1).A.flatten()
total = np.sum(row_sum, axis=0)pp_score = csr_matrix((cooc.shape[0], cooc.shape[1]), dtype='double')
cx = cooc.tocoo()
for i,j,v in zip(cx.row, cx.col, cx.data):
    if v != 0:
        k11 = v
        k12 = row_sum[i] - k11
        k21 = column_sum[j] - k11
        k22 = total - k11 - k12 - k21
        pp_score[i,j] = rootLLR(k11, k12, k21, k22)

对结果进行排序,使每个项目的最高 LLR 分数出现在每行的第一列。

result = np.flip(np.sort(pp_score.A, axis=1), axis=1)
result_indices = np.flip(np.argsort(pp_score.A, axis=1), axis=1)

指标,如何推荐

结果矩阵上的第一个项目,如果足够高,可以被认为是该项目的指示器。

让我们来看看其中的一个结果

result[8456]

你会得到

array([15.33511076, 14.60017668,  3.62091635, ...,  0\.        ,
        0\.        ,  0\.        ])

看看这些指数

result_indices[8456]

会抓到你

array([8682,  380, 8501, ..., 8010, 8009,    0], dtype=int64)

您可以有把握地回答,对于高数量 LLR 分数,项目 8682 和 380 可以是项目 8456 的指示符。而项目 8501 由于分数没有那么大,可能不是项目 8456 的指示符。

意思是,如果有人买了 8682 和 380,你可以推荐他 8456。

容易。

但是,根据经验法则,您可能希望对 LLR 分数进行一些限制,这样无关紧要的指标将被删除。

minLLR = 5
indicators = result[:, :50]
indicators[indicators < minLLR] = 0.0indicators_indices = result_indices[:, :50]max_indicator_indices = (indicators==0).argmax(axis=1)
max = max_indicator_indices.max()indicators = indicators[:, :max+1]
indicators_indices = indicators_indices[:, :max+1]

现在你已经准备好把它们放在一起进行 elasticsearch 了。所以可以实时查询推荐。

import requests
import json

好了,现在你准备好把东西放进你之前准备好的 elasticsearch 里面了。

但是,要小心。如果你试图使用/_create/ API 一个一个地添加数据,那将花费你很长时间。当然,你可以,但是你可能需要半个小时到一个小时才能将我们的 12,025 个项目移动到 elasticsearch 中。

我做过一次,所以请不要重复我的错误。

那么解决办法是什么呢?

批量更新

幸运的是,elasticsearch 有 bulk API,可以很容易地一次发送多个文档。

因此,创建一个新的索引(items2,我在前面的错误中使用了 items ),让我们尝试一下

actions = []
for i in range(indicators.shape[0]):
    length = indicators[i].nonzero()[0].shape[0]
    real_indicators = items[indicators_indices[i, :length]].astype("int").tolist()
    id = items[i]

    action = { "index" : { "_index" : "items2", "_id" : str(id) } }

    data = {
        "id": int(id),
        "indicators": real_indicators
    }

    actions.append(json.dumps(action))
    actions.append(json.dumps(data))

    if len(actions) == 200:
        actions_string = "\n".join(actions) + "\n"
        actions = []

        url = "[http://127.0.0.1:9200/_bulk/](http://127.0.0.1:9200/_bulk/)"
        headers = {
            "Content-Type" : "application/x-ndjson"
        }
        requests.post(url, headers=headers, data=actions_string)if len(actions) > 0:
    actions_string = "\n".join(actions) + "\n"
    actions = [] url = "[http://127.0.0.1:9200/_bulk/](http://127.0.0.1:9200/_bulk/)"
    headers = {
        "Content-Type" : "application/x-ndjson"
    }
    requests.post(url, headers=headers, data=actions_string)

瞧,它将在几秒钟内完成。

在邮递员中点击这个 API

127.0.0.1:9200/items2/_count

您已经存储了您的数据

{
    "count": 12025,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    }
}

让我们用/items2/240708 检查你的项目数据

{
    "id": 240708,
    "indicators": [
        305675,
        346067,
        312728
    ]
}

Id 是项目的 id。而指标是成为推荐该项目的指标的其他项目。

实时查询

我们创造的最好的部分是实时查询,

{
  "query": {
    "bool": {
     "should": [
      { "terms": {"indicators" : [240708], "boost": 2}}
     ]
    }
  }
}

将请求发送到127 . 0 . 0 . 1:9200/items 2/_ search

你会得到三个结果。312728、305675 和 346067。与 240708 号物品一起购买的三件物品。

太好了!所以,需要大量资源的问题现在已经不是问题了。那么,另外两个问题呢?

在那之前,让你的眼睛休息一会儿。

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

Photo by Sean O. on Unsplash

冷启动问题:我不认识你

构建推荐系统时最常见的问题是冷启动问题。每个新用户都不会在系统中记录他们的任何行为。

那么,系统应该给他们推荐什么呢?

让我们来看看我们最近建立的推荐系统。你认为结果有什么奇怪的吗?

是的,结果只返回 3 个推荐的项目。就三个。您计划如何向客户展示?

让我们在列表末尾显示另一个不推荐的项目。只是为了用户体验好。

{
  "query": {
    "bool": {
     "should": [
      { "terms": {"indicators" : [240708]}},
      { "constant_score": {"filter" : {"match_all": {}}, "boost" : 0.000001}}
     ]
    }
  }
}

您可以使用常数分数来返回所有其他项目。

但是,对于所有不推荐的项目,您需要对它们进行排序,以便用户可能会喜欢的东西,即使没有在他们的行为中捕捉到。

很多情况下,热门单品确实很好用。

你如何计算一个受欢迎的项目?

popular = np.zeros(items.shape[0])def inc_popular(index):
    popular[index] += 1trans2.apply(lambda row: inc_popular(row['items']), axis=1)

简单,一件一件数物品外观。所以人气值最高的就是最受欢迎的。

让我们创建另一个名为 items3 的索引。和批量插入

actions = []
for i in range(indicators.shape[0]):
    length = indicators[i].nonzero()[0].shape[0]
    real_indicators = items[indicators_indices[i, :length]].astype("int").tolist()
    id = items[i]

    action = { "index" : { "_index" : "items3", "_id" : str(id) } }

#     url = "[http://127.0.0.1:9200/items/_create/](http://127.0.0.1:9200/items/_create/)" + str(id)
    data = {
        "id": int(id),
        "indicators": real_indicators,
        "popular": popular[i]
    }

    actions.append(json.dumps(action))
    actions.append(json.dumps(data))

    if len(actions) == 200:
        actions_string = "\n".join(actions) + "\n"
        actions = []

        url = "[http://127.0.0.1:9200/_bulk/](http://127.0.0.1:9200/_bulk/)"
        headers = {
            "Content-Type" : "application/x-ndjson"
        }
        requests.post(url, headers=headers, data=actions_string)if len(actions) > 0:
    actions_string = "\n".join(actions) + "\n"
    actions = []url = "[http://127.0.0.1:9200/_bulk/](http://127.0.0.1:9200/_bulk/)"
    headers = {
        "Content-Type" : "application/x-ndjson"
    }
    requests.post(url, headers=headers, data=actions_string)

在这个索引阶段,您包括热门领域。所以,你的数据会像这样

{
    "id": 240708,
    "indicators": [
        305675,
        346067,
        312728
    ],
    "popular": 3.0
}

您将有三个字段。Id 和指标像上一个,热门领域。用户购买商品的数量。

让我们将 popular 添加到前面的查询中。

函数分数,组合分数的方式

那么,你现在有多个分数来源,即指标匹配和热门,如何组合分数?

Elasticsearch 具有与此相关的功能评分。

{
  "query": {
    "function_score":{
     "query": {
      "bool": {
       "should": [
        { "terms": {"indicators" : [240708], "boost": 2}},
        { "constant_score": {"filter" : {"match_all": {}}, "boost" : 0.000001}}
       ]
      }
    },
     "functions":[
      {
       "filter": {"range": {"popular": {"gt": 0}}},
       "script_score" : {
                 "script" : {
                   "source": "doc['popular'].value * 0.1"
                 }
             }
      }
     ],
     "score_mode": "sum",
     "min_score" : 0
    }
  }
}

重做您的查询,并添加一个函数分数,将上面的常量分数稍微增加 0.1 倍。您不必坚持使用 0.1,您可以使用其他函数,甚至是自然对数。像这样,

Math.log(doc['popular'].value)

现在,您将看到您最受欢迎的项目 461686 位于第四位,就在推荐项目的下方。

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

下面还有其他受欢迎的项目。

不变的静态推荐

如您所见,每次运行实时查询时,我们的结果都保持不变。这可能是好的,因为我们的技术是可重复的,但同时,用户可能会不高兴。

书中的泰德·邓宁斯说,**推荐的点击率,在第 20 个结果之后会下降得很低。**这意味着我们在此之后推荐的任何项目都不会被用户知道。

这个怎么解决?

有一种技术叫做抖动。当查询显示最不推荐的项目,但仍然将强烈推荐的项目放在顶部时,这是在制造随机噪音。

{
  "query": {
    "function_score":{
     "query": {
      "bool": {
       "should": [
        { "terms": {"indicators" : [240708], "boost": 2}},
        { "constant_score": {"filter" : {"match_all": {}}, "boost" : 0.000001}}
       ]
      }
    },
     "functions":[
      {
       "filter": {"range": {"popular": {"gt": 1}}},
       "script_score" : {
                 "script" : {
                   "source": "0.1 * Math.log(doc['popular'].value)"
                 }
             }
      },
      {
       "filter": {"match_all": {}},
       "random_score": {}
      }
     ],
     "score_mode": "sum",
     "min_score" : 0
    }
  }
}

随机评分,它会给你所有的物品均匀分布随机噪音。分数会很小,所以最高推荐不会下降。

点击查询,并查看结果。你可以看到

积极的一面是。您的用户将不必滚动到第二或第三页。他或她只需要点击浏览器上的刷新按钮,就会有新的内容提供给他或她。

就像魔法一样。

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

Photo by Marvin Meyer on Unsplash

结论

构建一个生产就绪的推荐系统并不难。目前的技术允许我们这样做。

使用您的数据创建系统,并准备将其部署到生产环境中。

当然,你可以从这个人工智能的最佳课程中学习人工智能

干杯!

如何用 EDA 创建癌症生存预测模型

原文:https://towardsdatascience.com/how-to-create-a-simple-cancer-survival-prediction-model-with-eda-629dfa45d98b?source=collection_archive---------23-----------------------

利用 Haberman 的癌症生存数据集,使用 Python 创建一个简单的预测性癌症生存模型,对探索性数据分析技术进行全面的演练

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

Illustration by John Flores

这个博客和由此产生的癌症生存预测模型的动力是让人们一窥医疗保健行业的潜力。医疗保健继续从当前机器学习在其他行业的成功中学习宝贵的经验,以推动预测分析(也称为“健康预测”)的应用,并改善患者诊断、护理、慢性病管理、医院管理和供应链效率。[1]

这个分类项目是对 Haberman 数据集的探索性数据分析(EDA)的介绍,以确定开发一个简单的预测性癌症生存模型所必需的属性。该模型的预测将决定,手术后患者存活超过 5 年的可能性有多大?该记录最终基于三个属性自动进行患者的预后;年龄、手术年份和手术期间从患者身上切除的阳性腋窝淋巴结数目。

1.什么是探索性数据分析?

在机器学习领域,探索性数据分析(EDA)是一种哲学,或者说是一种用于分析数据集的方法。这是一种总结、可视化和熟悉数据集重要特征的技术。EDA 对于最大化洞察力、揭示底层结构、提取重要变量、检测异常值和异常值以及测试无意识/无意的假设非常有用。

虽然这个过程可能有点乏味,人们不会简单地,【插入经典的 LOTR 迷因】,跳过 EDA 过程,冲进机器学习阶段。事实上,EDA 技术是机器学习的前身,因为它用于回答以下问题:

如何定义潜在可用于机器学习的特征变量?如何选择最适合自己数据集的算法?

本质上,EDA 是为了挖掘数据能够告诉我们的超出正式建模或一般假设测试的内容,以创建适用的业务洞察力、模型和过程增强,这些对于业务利益相关者来说可能不明显或不值得调查。怎么会?通过在数据中寻找模式,从而洞察一些值得研究的有趣事物。

2.了解数据集

哈伯曼的生存数据集包含了 1958 年至 1970 年间在芝加哥大学比林斯医院进行的一项关于乳腺癌手术患者生存的研究。

您可以从下面的 Kaggle 链接轻松下载数据集:

[## 哈伯曼生存数据集

下载数千个项目的开放数据集+在一个平台上共享项目。探索热门话题,如政府…

www.kaggle.com](https://www.kaggle.com/gilsousa/habermans-survival-data-set)

属性信息:

  1. 年龄:手术时患者的年龄(数值)。
  2. :患者手术切除淋巴结的年份(年份— 1900,数字)
  3. 淋巴结:检出阳性腋窝淋巴结数(数值)
  4. 状态:生存状态(职业属性)
  • 1 =患者存活了 5 年或更长时间
  • 2 =患者在 5 年内死亡

**注意:**只是提醒一下!在深入研究 EDA 之前,对数据集和手头的问题做一些背景研究总是一个好主意。我用“节点”做到了这一点,以下是我的发现。

背景:阳性腋窝淋巴结是位于腋窝(腋窝)的豆状小器官,沿淋巴液通道起过滤器的作用。当淋巴液离开乳房并最终回到血液中时,淋巴结在癌细胞到达身体其他部位之前捕捉并捕获癌细胞。因此,腋下淋巴结中有癌细胞表明癌症扩散的风险增加。

当淋巴结没有癌症时,测试结果是阴性的。然而,如果在腋窝淋巴结中检测到癌细胞,它们被认为是阳性的。

3.环境配置:导入库和加载数据文件

下面,您将了解如何设置您的环境以重复此 EDA 过程和癌症存活模型的详细信息。导入分析所需库的目的是:

  • Pandas 用于操作数据集
  • NumPy 用于对数据集进行数学计算和统计
  • Matplotlib 和 Seaborn 用于可视化
# Import the necessary packages 
**import** pandas **as** pd
**import** matplotlib.pyplot **as** plt
**import** seaborn **as** sns
**import** numpy **as** np# Load the dataset
haberman = pd.read_csv("haberman.csv")

4.数据细节

# Print first 5 lines of dataset
haberman.head()

输出:

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

# Personal preference: convert year format from 'YY' to 'YYYY'
haberman['year'] = haberman['year'] + 1900# Again, personal preference: convert survival status 1 and 2 to #'yes' and 'no', respectively
haberman['status'] = haberman['status'].map({1:'yes', 2: 'no'})# Print first 5 lines of altered dataset
haberman.head()

输出:

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

# Print the number of rows and columns for the dataset
haberman.shape

输出:

(306, 4)

观察:

  1. 的。csv 文件包含来自 306 名患者的数据,存储在描述数据集特征的行和 4 列中。
# Print the column names in dataset and the data type
haberman.columns

输出:

索引([‘年龄’,‘年份’,‘节点’,‘状态’],类型= ‘对象’)

# Details about the dataset
haberman.info()

输出:

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 306 entries, 0 to 305
Data columns (total 4 columns):
age       306 non-null int64
year      306 non-null int64
nodes     306 non-null int64
status    306 non-null int64
dtypes: int64(4)
memory usage: 9.6 KB

观察:

  1. 该数据集中没有缺失值。
  2. 这 3 个属性是 int 数据类型,最后一个属性被转换为分类数据类型。
  3. 在“状态”栏中,最初的 int-type 被映射为“是”,这意味着患者存活超过 5 年。值“2”被映射为“否”,这意味着患者在 5 年内去世。
# Statistically describe the dataset
haberman.describe()

输出:

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

观察:

  1. 计数:每个相应列中存在的数据点总数为 306。
  2. Mean:关于年龄、年份和节点的每一列的平均值。
  3. Std(标准偏差):衡量一组数值与平均值或期望值相差多远。
  4. Min(最小值):每列中出现的最小值。
  5. 25%四分位数:1/4 的数据点低于规定值。
  6. 50%四分位数:1/2 的数据点低于提供的值。
  7. 75%四分位数:3/4 的数据点低于规定值。
  8. Max (Maximum):每列的最大值。
# Count each type of status in the dataset
haberman["status"].value_counts()

输出:

Yes 225
No 81
Name: status, dtype: int64

观察:

  1. value_counts 函数详细说明每个类有多少个数据点。这段代码描述了 5 年后有多少患者存活,有多少患者死亡。
  2. 在 306 名患者中,225 名存活,81 名未超过 5 年。
# Create a 'yes status' dataset to store 'yes' values for the patients that survived
status_yes = haberman[haberman["status"] == 'yes']
status_yes.describe()

输出:

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

# Create a 'no status' dataset to store values for the patients that did not survive
status_no = haberman[haberman["status"] == 'no']
status_no.describe()

输出:

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

观察结果:

  1. 关于年龄:否和是数据集的平均年龄和年份之间的差异没有统计学意义。**注意:**然而,有一种趋势描述了手术后 5 年未存活患者的年龄普遍增加。这种增加可以在非存活患者的最小年龄、四分位数百分比和最大年龄中看到。
  2. 年份:平均年份和否与是数据集之间的差异在统计学上并不显著。
  3. 在节点上:“是数据集”和“否数据集”的平均节点数都有显著增加。“无数据集”中的最大节点数也有所增加。无数据集的四分位数百分比也高于有数据集。**注意:**例如,对于 75%在手术后 5 年内死亡的患者,发现他们有 11 个或更多的淋巴结,相比之下,存活的患者只有 3 个淋巴结。

模型洞察:

  1. 平均而言,存活下来的人比没有存活下来的人少大约 2.5 倍的节点。存活的患者平均有 2.79 个淋巴结,而未存活的患者平均有 7.46 个淋巴结。

5.单变量分析

单变量分析是分析数据的最简单形式。这个过程不处理原因或关系,因为只涉及一个变量。相反,它的主要动机是描述;它获取数据,汇总数据,并找出单个特征中存在的模式。

5.1 概率密度函数

概率密度函数(PDF)是一种统计方法,用于衡量离散值的可能结果。PDF 绘制在一个典型的类似钟形曲线的图表上,结果的概率位于曲线之下。

这里,柱的高度表示相应组下的数据点的百分比。

PDF 背后的直觉是什么?

# Create a function for PDF analysis
def histoPDF(featureVar, classVar):
    sns.FacetGrid(data = haberman, hue = classVar, height = 5) \
    .map(sns.distplot, featureVar) \
    .add_legend(); 
    plt.title("Histogram for " + featureVar)
    plt.ylabel("density")
    plt.plot('histogram_2.png')# PDF histogram for age v. status
histoPDF('age', 'status')

输出:

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

观察结果:

  1. 观察到大量的重叠,这表明年龄不是决定患者存活率的主要因素。
  2. 给定 PDF 中的重叠量,“是”数据集和“否”数据集之间的年龄差异几乎不可见。也许另一种统计方法可以揭示年龄和生存状态之间的模式。

模型洞察:

  1. 30-40 岁的人有更高的存活率,而 40-60 岁的人则没有。对于 60 岁以上的人来说,存活的机会大约是 50/50。
# PDF histogram for year v. status 
histoPDF('year', 'status')

输出:

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

观察结果:

  1. 主要的重叠继续再次表明,患者手术的年份并不影响他们 5 年后的生存率/结果。
  2. 1965 年手术的病人死亡率有一个高峰,而 1960 年手术的病人死亡率有所下降。
  3. 在 1960-1962 年间,病人存活的可能性增加了。
# PDF histogram for nodes v. status
histoPDF('nodes', 'status')

输出:

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

观察结果:

  1. 完全分离将是理想的,以区分存活患者的确切淋巴结数量。
  2. 有 0 个淋巴结或 1 个淋巴结的患者更有可能存活。如果有 25 个或更多的节点,存活的机会很小。
  3. 该图显示,淋巴结数目似乎比年龄和手术年份更能影响患者的存活率。

模型洞察:

  1. 5 个淋巴结后,患者越来越有可能无法存活。

6.累积分布函数

CDF 创建了一个经验累积分布函数图。使用 CDF 图确定 x 轴上等于或低于给定值的数据百分比。

# CDF analysis 
count1, bin_edges1 = np.histogram(status_yes['nodes'], bins = 10, density = True)
pdf1 = count1/(sum(count1))
print(pdf1, bin_edges1);
cdf1 = np.cumsum(pdf1)
plt.plot(bin_edges1[1:], pdf1)
plt.plot(bin_edges1[1:], cdf1, label = 'Yes')
plt.xlabel('nodes')print("---------------------------------------------------------")count2, bin_edges2 = np.histogram(status_no['nodes'], bins = 10, density = True)
pdf2 = count2/(sum(count2))
print(pdf2, bin_edges2);
cdf2 = np.cumsum(pdf2)
plt.plot(bin_edges2[1:], pdf2)
plt.plot(bin_edges2[1:], cdf2, label = 'No')
plt.xlabel('nodes')
plt.legend()plt.show()

输出:

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

观察结果:

  1. 根据 CDF 汇总统计,大约 83.55%存活的患者的淋巴结在 0 至 4.6 范围内。

7.盒须图和小提琴图

盒须图也称为盒状图,显示一组数据的五个数字汇总。五位数汇总是最小值、第一个四分位数、中值、第三个四分位数和最大值。该方框从数据的下四分位数延伸到上四分位数,中间有一条线。触须从框中延伸出来,以显示数据的范围。离群点是那些超过胡须末端的点。

小提琴图是箱线图和概率密度函数(CDF)的组合。Violin 图允许可视化一个或几个组的数字变量的分布。这是箱线图的近似形式,但可以更深入地理解密度。

# Create box and whisker plot for each feature
plt.figure(1)
plt.figure(figsize = (15, 5))
plt.subplot(131)
sns.boxplot(x = 'status', y = 'age', data = haberman)
plt.subplot(132)
sns.boxplot(x = 'status', y = 'year', data = haberman)
plt.subplot(133)
sns.boxplot(x = 'status', y = 'nodes', data = haberman)
plt.show()

输出:

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

# Create violin plots for each feature
plt.figure(1)
plt.figure(figsize = (15, 5))
plt.subplot(131)
sns.violinplot(x = "status",y = "age",data = haberman,height = 10)
plt.subplot(132)
sns.violinplot(x = "status",y = "year",data = haberman,height = 10)
plt.subplot(133)
sns.violinplot(x = "status",y = "nodes",data = haberman,height = 10)
plt.show()

输出:

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

观察:

  1. 相对而言,45 至 65 岁年龄组中有更多的人没有活下来。然而,患者年龄本身并不是决定其存活率的重要参数。
  2. 在 1965 年接受手术的人中,有更多的人活不过 5 年。
  3. 超过 1 个淋巴结的患者存活的可能性更小。一般来说,越多的淋巴结意味着存活率越低。
  4. 大部分存活的患者没有淋巴结。然而,有一小部分腋窝淋巴结为 0 的患者在术后 5 年内死亡,因此没有腋窝淋巴结阳性不能保证存活。
  5. 年龄和年份参数的箱线图和小提琴图给出了相似的结果,数据点有很大的重叠。与其他特征相比,节点的箱线图和小提琴图中的重叠较少,但是重叠仍然存在,因此很难设置阈值来对两类患者进行分类。

8.双变量分析

双变量分析是定量分析的另一种简单形式。双变量分析是对两个变量(属性)的同时分析。它探讨了两个变量之间关系的概念,是否存在关联以及这种关联的强度,或者两个变量之间是否存在差异以及这些差异的意义。

8.1 散点图

散点图揭示了两个变量之间的关系或关联。这种关系通过图中的任何非随机结构表现出来。
“关系”是指存在某种结构化关联(线性、二次等。)在 X 和 y 之间。

散点图是确定相关性的有用诊断工具,但如果存在这种相关性,该图可能会也可能不会提示潜在的因果机制。散点图永远无法“证明”因果关系——最终只有研究人员(依靠基础科学/工程)才能得出因果关系确实存在的结论。记住这句话:“相关性并不意味着因果关系”。

# Create scatter plot of age v nodes
sns.set_style("whitegrid")
sns.FacetGrid(haberman, hue = "status", height = 6)\
.map(plt.scatter, "age", "nodes")\
.add_legend()
plt.show()

输出:

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

观察结果:

  1. 年龄在 30 至 40 岁之间的 0 至 15 个淋巴结的患者更有可能存活。
  2. 不考虑年龄,具有 0 至 1 个淋巴结的患者更有可能存活。
  3. 50 岁以上有 5 个以上淋巴结的患者更有可能没有存活。

8.2 对图

配对图用于理解最佳特征集,以解释两个变量/维度之间的关系或形成最大程度分离的聚类。在我们的数据集中画一些简单的线或者做线性分离,也有助于形成一些简单的分类模型。

# Create pair-plot to determine a possible relationship between the columns / attributes
sns.set_style("whitegrid")
sns.pairplot(haberman, hue = "status", height = 5)
plt.show()

输出:

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

观察:

  1. 在年龄与节点之间的配对图中,可以用两条重叠的钟形曲线来区分类别变量。
  2. 为了进一步分析,年龄和节点属性可以考虑用于模式发现,因为您可以确定关系,无论多么模糊。
  3. 然而,所有其他属性在它们的 PDF 中没有显示出太大的差异。

9.多变量分析

多元分析是一次对许多变量的统计调查。在生命科学中,大多数问题本质上都是多元的。多元分析是一组用于分析包含多个变量的数据集的技术,这些技术在处理相关变量时尤其有价值。这些技术为信息提取、回归或分类提供了一种经验方法;这些技术中的一些是最近开发的,因为它们需要现代计算机的计算能力。

9.1 等高线图

等值线图是一种图形技术,通过以 2D 格式绘制常量 z 切片(称为等值线)来表示 3D 表面。也就是说,给定一个 z 值,在 z 值出现的地方画出连接(x,y)坐标的线。

# Create contour plot for the cross section of 3D graph
sns.jointplot(x = "year", y = "age", data = haberman, kind = "kde")
plt.show()

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

# Create contour plot for the cross section of 3D graph
sns.jointplot(x = "nodes", y = "age", data = haberman, kind = "kde")
plt.show()

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

观察:

  1. 大约从 1960 年到 1964 年,在 45 岁到 55 岁之间的病人身上完成了更多的外科手术。
  2. 大多数 0 至 1 个淋巴结的患者年龄在 45 至 65 岁之间。

结论

  1. 患者的年龄和手术年份本身并不是他们生存的唯一决定因素。然而,年龄小于 35 岁的人有更大的生存机会。
  2. 存活的可能性似乎与每位患者发现的阳性腋窝淋巴结数成反比。然而,数据显示没有阳性腋窝淋巴结并不总是保证存活。
  3. 对新患者的生存状态进行分类的目标是困难的,并且可能产生不可靠的结果,因为数据集需要额外的特征和属性。

10.简单哈伯曼生存模型

在数据分析和一点 EDA 之后,我们可以从上面的统计分析和图表中提取这些见解,以勾勒出一个预测患者存活率的简单模型。这是从哈伯曼数据集确定一个介绍性生存模型的许多方法之一。根据我观察到的数据,淋巴结的数量和年龄是决定病人生死的最大因素。您可以向该模型添加额外的功能来提高其准确性。

总的想法是,你允许你从 EDA 的观察来通知你的假设。

10.1 数据洞察

模型的计算方式:

  1. 年龄分组在~10 年内,从 30 岁开始,到 83 岁结束
  2. 按年龄组计算总人数。
  3. 计算在该年龄范围内存活的总人数。
  4. 计算在该年龄范围内死亡的总人数。
  5. 计算每组的总节点数和存活状态。
  6. 节点范围由从数据细节部分获取的幸存者和未幸存者的平均值决定。
  7. 最后,计算存活节点的平均数量。
  8. 并计算存活率。

模型洞察概要

Case 1: 
       10% Chance of not surviving when: 
       Age 30–40 
       Nodes <= 7Case 2: 
       31% Chance of not surviving when: 
       Age 40–50 
       Nodes >= 8Case 3: 
       28% Chance of not surviving when: 
       Age 50–60 
       Nodes >= 9Case 4: 
       29% Chance of not surviving when: 
       Age 61–70 
       Nodes >= 6Case 5: 
       29% Chance of not surviving when: 
       Age 71–83 
       Nodes <= 2

10.2 创建模型

在 EDA 过程和收集生存模型的见解中,我得出了一个假设。我的理论或对这个模型的期望包括一个总体趋势,而如果节点数量和年龄增加,患者存活率实际上会下降。

# Create a simple Survival Prediction Model with if/else statements **def** survivalModel(age, nodes):

    **if** nodes **in** range(0, 4):            
        **if** age **in** range(30, 41): 
            print('Survival rate is approximately 90%')

        **else**:
            print('Survival rate is approximately 74%')

    **elif** nodes **in** range(4, 7):              
        **if** age **in** range(30, 51):
            print('Survival rate is approximately 75%') **else**:
            print('Survival rate approximately 47%') **elif** nodes >= 7:              
        **if** age **in** range(30, 51):
            print('Survival rate is approximately 54%')

        **else**:
            print('Survival rate is approximately 40%')

10.3 测试结果

survivalModel(32,2)

输出:存活率约 90%

survivalModel(47,5)

输出:存活率约 75%

survivalModel(55,6)

产量:存活率约 47%

survivalModel(38,21)

输出:存活率约 54%

survivalModel(60,8)

输出:存活率约 40%

10.4 生存预测模型考虑因素

如果你对医学领域或普通生命科学感兴趣,我相信你很快就会意识到,有许多其他因素导致患者被诊断患有癌症,他们的治疗选择以及癌症存活的结果。其他因素,不包括在这个数据集,有助于癌症的生存,包括病人的饮食,一般身体健康,遗传素质等。因此,为了开发一个更加精确、可靠和全面的癌症生存预测模型,我们的数据集需要包括所有这些因素,以及其他无形(抽象)的因素,如手术过程中的人为错误、药物对身体的影响、手术后护理等。

然而,作为 EDA 的初学者指南,正如您已经发现的那样,Haberman 数据集是有限的,因此我们的预测模型实际上在范围和准确性方面都是有限的,即使是在使用当今具有相同癌症诊断的患者数据时也是如此。但是对于我们所需要的来说,它非常好,并且在实现模型时没有可怕的暗示,所以不用担心。我只想提几个警告。该模型的范围有限,不应用于任何关键决策。

总之,在创建模型时,您可以使用任何分类算法,如逻辑回归和支持向量机,如果您有足够的数据,您可以尝试神经网络。这只是一个介绍,您需要识别或创建更多的功能,执行功能缩放,最重要的是识别相关性和因果关系之间的差异。

参考资料:

[1] E. Just,L. Thatcher,T. Lawry,医疗保健中的机器学习:首席执行官必须知道哪些才能在他们的组织中有效地使用它(执行报告) (2018),Health Catalyst AI 知识中心

从头开始创建一个简单的统计学习模型:在回归中强调预测

原文:https://towardsdatascience.com/how-to-create-a-simple-statistical-learning-model-from-scratch-emphasizing-prediction-in-620d6fd8b94b?source=collection_archive---------20-----------------------

在 lm 的引擎盖下发生了什么?线性回归的估计、预测和验证教程

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

学习统计/机器学习可能会令人生畏,尤其是如果你像我一样来自另一个领域(例如,社会科学、生命科学、商业等)。有数百种复杂的模型可供选择,并且有大量的方案来验证您的数据。在这里,我们将仔细研究一个简单的预测模型,如果你完成了统计学课程,你可能会遇到回归。为什么这么简单?回归可能不像其他一些方法那样吸引人,但对基础知识有更深的理解对于转向更复杂的模型无疑是重要的。

当学习回归时,重点可能不是在预测(或预测值来自哪里),而是跳到输出,检查系数,并祈祷与所述系数相关的 p 值低于. 05。回归不一定只是推断统计的工具。正如我提到的,如果你已经运行了一个回归分析,你就已经完成了一个包括计算预测值的计算。

下面,我们将解开预测如何在两种不同的背景下展开。在第一种情况下,我们将处理存在 y 值的数据,这是一种常见的情况,分析师正在对结果和预测变量之间的关系进行推断。在第二种情况下,我们将预测遗漏数据的新 y 值。我们将在没有函数或库的帮助下完成所有这些,以说明如何使用线性回归作为经典 iris 数据集的基本预测工具。

首先要做的是加载虹膜数据集:

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

在我们开始自己的计算之前,让我们先来看看如何拟合一个线性模型,并使用该模型通过“lm”函数来预测基数 R 中的一些新数据。我们将尝试从 iris 数据集中的其他 3 个数值变量来预测萼片长度。首先,我们将获取一些训练数据(70/30 分割)并拟合我们的模型。

现在,我们将创建一些测试数据,并将其与来自训练数据的模型相结合,以创建一些预测。

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

预测看起来很棒!如果有人不小心删除了花卉数据库中有关鸢尾属植物萼片长度的信息,我们可以有把握地说,我们会很好地恢复这些信息。

当然,我们在这里关心的是确定“predict”正在做什么来产生这些值。我们一会儿就来看看。但是首先,我们将在更一般的意义上检查线性回归模型的预测。

我们将从检查如何在一组数据上预测新值开始,其中y 值和预测变量都存在(使用我们创建的 iris 训练数据作为例子)。首先,我们需要把 x 值和 y 值分开。我们将用一列 1 填充 x 矩阵来表示截距。

现在,我们需要转置 X,并将其乘以自身( X’X) 。这导致平方和/叉积矩阵, SSCP 。事实证明,通过一些操作,这个矩阵可以描述一组变量之间的方差/协方差、相关性或余弦关联。如果你有兴趣听到更多关于这方面的信息,请点击这里查看我的帖子。

我们的计算与实际叉积函数的输出相匹配。

接下来,我们将计算一个投影矩阵或帽子矩阵(在它的对角线上是观察杠杆)。

这将允许我们将 y 映射成预测的 y 值。

因此,如果我们可以访问 y 值,我们可以将它们与投影矩阵结合起来获得预测。这很好,但是我们如何使用训练数据来预测测试数据中 y 的新值呢?为此,我们需要为包含 y 值和 x 值之间关系信息的训练数据计算β系数。

通过与“lm”产生的值进行比较,我们可以确保计算出的β值确实是正确的。

我们可以将模型截距加到我们的测试数据中,然后乘以β系数(截距除外),得出我们的预测值。

到目前为止,我们所学的可以很容易地扩展到 kfold 交叉验证方案。下面的函数将创建折叠并返回一个包含原始数据集的列表,其中折叠作为一个新列。此外,还将返回包含折叠索引本身的列表。

让我们创建折叠,并确保他们有意义。

并使用 5 重交叉验证来拟合我们的模型:

我们可以提取和检查预测汇总统计数据。

最后,我们可以将我们的折叠指数传递给流行的预测建模包 caret,并确认我们的计算。

通过对折叠进行平均,我们的统计数据与 caret 的输出相匹配。

总之,我们仔细研究了预测在回归环境中的作用。我们最终能够应用我们所涵盖的计算对遗漏的数据进行预测。希望本教程能让你明白,当你在一行包含“lm”函数的代码上按下 ctrl+enter 时会发生什么。

如何创建成功的数据策略

原文:https://towardsdatascience.com/how-to-create-a-successful-data-strategy-1293bacf463c?source=collection_archive---------5-----------------------

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

Image from Pixabay CC0

随着人工智能和数据科学的快速发展,数据已经成为每个企业的重要资产。因此,建立数据策略已经成为每个企业的使命,尤其是在高管层和管理层。什么是数据策略,我们如何创建正确的数据策略?我想用这篇文章来回答这两个问题。

在讨论数据策略之前,我们需要了解什么是策略。用一个简单的定义来说,战略是一个深思熟虑的计划,专注于改变当前的状态,以实现未来的愿景。换句话说,正确的战略需要从愿景开始,战略是一种做出一系列改变的方式,通常需要创新和开箱即用的思维来实现愿景。在制定数据战略之前,每个企业都必须制定好业务愿景和业务战略。数据策略应该与业务策略携手并进,并服务于实现业务愿景。另一方面,数据与技术共存,同时为企业和客户提供价值。因此,数据战略也是数据和技术的战略。

给定了什么是数据策略的定义,我们也应该能够说什么是数据策略而不是。比如上云,采用 AI,聘请数据科学家,都不是数据战略;它们是我看到的经常与愿景或战略混淆的手段和工具。这种混乱要么导致“煮沸海洋”的昂贵努力,要么因为缺乏明确的方向和目标而注定失败。技术正以前所未有的速度发展,尤其是在数据和人工智能领域。只有当新技术能够帮助实现原有技术无法实现的业务愿景时,成功采用新技术才是重要和有意义的。因此,相对于现有系统而言,新技术能够带来的最终商业价值是探索新技术并使其成为战略的一部分的正当理由。另一方面,新技术可以推动新产品的新想法或新的创收机会。在这种情况下,新产品或收入机会需要成为业务愿景和业务战略的一部分,而技术则成为数据战略中的一项投资。换句话说,新技术的探索和采用应该与业务目标和业务愿景相一致。

要创建成功的数据策略,我们应该关注 6 个方面:一致性、架构、流程、组织、人员和长期规划。

与业务战略保持一致

这大概是数据策略最重要的方面。虽然数据策略的重要性已被广泛接受,但对于许多组织来说,它的实施仍然是一个大问题。这主要是因为通常情况下,业务人员对技术和数据没有信心,科学家或技术专家过于专注于技术,而没有将技术工具融入到业务挑战中。因此,只有当双方都关注业务成果时,才能实现协调:

  1. 在业务环境中定义业务目标和战略

业务目标和策略应该围绕需要为顾客和客户实现的结果,而不是限制潜在的技术解决方案。例如,当一个商业策略说“向公司的客户交付 API”时,它立即缩小了技术人员为最终客户构建 API 解决方案的范围。虽然这可能是可能的解决方案之一,但它并没有真正反映出客户在寻找什么。更恰当的说法是“客户需要一种方便的方式,以最少的人力从任何地方检索数据。”有了这个目标,解决方案将会非常不同,事实上,将会导致一个完全不同的策略,更加强调用户体验而不仅仅是 API。我们学到的教训是,业务人员应该通过关注期望的业务结果来陈述业务问题,并且避免从一开始就定义使用哪种技术。

2。设计和实施技术解决方案,从广阔的角度真正理解业务问题

技术专家总是在寻找新的工具、新的库,甚至新的编程语言。从一项新技术实现的那一刻起,它可能会逐渐失去它的荣耀,并由于其与更新的技术相比的局限性而招致批评。因此,我多年来看到的一个严重缺陷是,实现或更新只是为了技术进步,而不是解决业务问题。有时候,这是必要的,也是不可避免的。另一方面,我们应该尽量避免跟随技术世界中的宣传,而是将技术进步集中在业务用例上,并根据业务需求做出明智的决策。

在更高的层面上,数据策略的业务需求来自 3 个方面:产品、运营/流程改进和法规遵从性。这些领域的数据策略可能会有很大的不同。产品相关战略需要快速发现和集成新数据源的能力,以及交付新用户体验的能力。运营/流程改进主要应用于内部,关注效率、成本降低和质量改进。法规遵从性侧重于数据安全性。因此,有效的数据策略应该涵盖所有这些领域。

在有很多机会的人工智能和分析领域,数据战略应该与业务战略保持一致,以便设置优先级,并确定从哪些领域开始以及接下来计划什么用例。明确定义人工智能和机器学习(ML)的优先级并不是一件容易的事情,这首先需要对方法论、机会和大胆的愿景有深刻的理解。在这种情况下,业务和产品人员应该与技术和数据科学领导者密切合作,共同创造愿景和战略。

架构:数据量至关重要

在处理数据架构时,理解现有和未来的数据资产是关键。需要提出一些重要的问题,例如,解决业务问题需要什么类型的数据,典型的使用案例是什么,3 到 5 年内的数据量增长是多少。正如我在另一篇文章(大数据性能原则)中所述,处理小数据量更简单,这保证了更快的周期和更少的投资。但是,当处理大量数据时,体系结构将变得更加复杂,因此,成本将会更高,实施时间将会更长,风险也更大。如果不同来源和应用程序的数据大小确实不同,那么应该有不同的策略来处理每种情况,从一开始就有不同的思考和规划方式。鉴于技术的不断发展和数据量的不断增加推动了大数据架构的复杂性,大数据架构的战略也应该是深远的,其愿景可能不仅局限于 3-5 年,还应着眼于更长期的发展。

大数据的典型架构包括 3 个方面:1)数据源及其暂存区;2)数据湖和数据处理平台;3)交付解决方案。针对大数据的成功数据战略应该针对这三个领域进行不同的规划,并相应地将每个领域与业务目标保持一致。特别是,为大数据重建数据湖和数据处理平台的成本非常高,可能需要很长时间和大量资源。另一方面,添加数据源或开发新的交付解决方案可以相对快速和容易地完成,从而增加收入。构建可扩展、可集成、可持续的数据处理管道和平台是实现企业长期发展的核心策略。

组织:集权与分权

新的想法和创新往往来自业务部门,因为他们更接近客户和客户,而 It 或集中式数据技术团队拥有变更管理、可扩展生产系统、流程自动化和企业级解决方案方面的专业知识。将 IT“分散”到业务部门也称为“影子 IT”。其存在的原因显而易见:它拥有集中的资源,这些资源通常无法满足快速、灵活地满足客户需求的业务需求。另一方面,业务部门既没有大型生产环境的能力,也没有企业级软件解决方案的预算。当需要重新设计解决方案并进行迁移时,这种限制最终会导致“成长的烦恼”和资源浪费。

这种冲突在数据科学和人工智能领域变得更加明显。虽然业务部门的小型数据科学团队可以快速试验人工智能和机器学习算法,但他们也应该计划好如何同时扩展和生产他们的模型。整个生命周期,从新算法的实验开始,到集成和生产化,需要在数据策略中明确地讨论和执行,包括组织结构和业务与技术部门之间的合作关系。这项工作可以提高企业级效率,同时加快创新速度。例如,数据科学家可以专注于新想法,但不需要担心支持生产,而 IT/集中化技术团队则专注于构建和支持具有最佳性能的可扩展集成生产平台。换句话说,一个好的策略允许我们将数据生命周期视为一个整体,从最初的创新到最终的生产化和业务增长。它还促使技术和业务部门以相同的目标紧密合作,以实现双赢的结果。

流程:数据治理

任何数据策略的主题都是公司的数据资产。成功的数据战略应该有一个清晰的计划,说明如何释放数据资产的价值来服务于业务目的。数据治理是根据所有权、完整性、合规性、质量、内容以及与其他数据集的关系来管理这些数据集的过程。如果没有既定的治理,企业将缺乏对其数据集的清晰性和洞察力,这可能导致不一致或重叠的数据策略。正如 mime 的前一篇文章(主数据管理:数据策略的重要部分)中所述,为了确保主数据管理成为数据策略的一部分,数据治理流程对于策略的成功至关重要。数据治理是一个过程,其有效性通过交付的结果来衡量。其目的是提供透明度和效率,而不是混乱和官僚主义。考虑到数据治理在管理数据资产中的重要作用,数据治理应该是数据战略的一部分,应该有一个关于如何建立、实施和持续改进企业数据治理流程的更具体的计划。

人:人才与文化

人也应该是任何企业战略的一部分,数据战略也不例外。数据战略的不同之处在于,技术人才很难找到,而数据也需要机构知识才能产生成效。对现有人才的评估以及在培训或建立新人才管道之前的计划对于成功的数据战略来说至关重要。在这个领域,留住人才和发现新人才同等重要。建立具有多样化、互补的技能组合和多层次经验的团队应该是成功的数据战略的一个重要方面。

另一个方面是在组织中建立数据能力和数据文化。这并不是说任何访问数据的人都应该能够进行 SQL、Python 编程或运行机器学习算法。一个例子是,大多数人能够处理 Excel 电子表格中的数据。应该为人们建立相同级别的范围和能力,以便使用组织内的标准化工具轻松访问数据,这样人们就可以提取、分析和使用数据来改进决策和工作效率,而无需技术人员的帮助。这当然取决于公司内部的几项能力:轻松的数据访问、清晰的数据编目、带有访问和分析数据插件的自助服务工具的可用性,以及大量的培训。建立数据能力和强大的数据文化需要长期的努力,但对于一个组织来说,充分发现和实现其数据集对业务增长的价值是数据战略的重要组成部分。

长期能力和竞争力

数据是公司的资产,因此,处理数据是一项长期的工作,数据战略需要长远的眼光。事实上,一个成功的数据战略应该有一个超越业务战略的总体规划,以便为未来的业务战略和增长奠定长期基础。这是因为建立数据平台、基础设施、人才、文化需要时间,结果随着数据一起成为公司的资产。使用数据资产与构建程序或界面非常不同。它需要精心管理、长期投资和坚持不懈的努力。具有坚实基础和能力的稳定性对于一个公司在最少干扰和挫折的情况下高效快速地发展是至关重要的。虽然我们并不确切知道技术前景将会如何,但成功的数据战略将有助于企业做好准备并接受它,而不是以磕磕绊绊的方式应对它。在这方面,有效数据战略的优势在于强调数据资产和人员提供的价值,而不是新技术,新技术只是提取和实现数据价值的工具和方法。

总结

虽然数据战略与业务战略具有相同的组成部分,但它在战略领域仍相对较新。建立正确的数据策略首先需要业务愿景,并与业务策略保持一致。数据战略还应被视为长期愿景的促成因素,为未来的业务战略奠定基础。最后,防止数据策略纯粹是技术性的或以 IT 为中心是其成功的关键。换句话说,组织应该采取全面的方法来采用长期的数据战略,优化技术投资、人员和流程,以实现持续的业务增长。毕竟,正如吉米·罗恩所说:“成功是 20%的技能和 80%的策略。你可能知道如何成功,但更重要的是,你的成功计划是什么?”。

如何在 Excel 中创建显示覆盖在样本指标上的正常范围的可视化?

原文:https://towardsdatascience.com/how-to-create-a-visualization-showing-normal-range-overlaid-on-sample-metrics-in-excel-c73fc08c05b5?source=collection_archive---------3-----------------------

本文简介:创建图表的分步指南,该图表显示覆盖在多个数据系列的平均值、最小值和最大值上的正常范围。换句话说,实际与目标图表。本教程结束时,您将能够在 MS-Excel 中生成如下内容:

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

上面的图像来自我在 T2 发表的一篇研究论文,研究儿童接种疫苗的及时性。我们展示了自出生以来,儿童接受某种疫苗的天数范围。在此基础上,我们还在同一图表中显示了该疫苗的理想时间窗口。这有助于比较各种疫苗接种时机的好坏。

将定量变量的正常或理想范围覆盖在实际结果之上是可视化这种比较的常用方法。为了在 Excel 图表中实现这一点,我们依赖于为正常范围窗口和实际结果创建单独的数据系列。然而,为了获得不错的结果,我们需要滥用【Excel 提供的工具;我们用散点图而不是条形图来表示数据。如果你想自己练习,完整的教程文件在这里可以找到

第一步:整理数据

创建图表需要三组数据*:你想要显示的实际结果,代表要覆盖的正常范围的数值,第三组是在 y 轴上放置标签的数据。让我逐一解释。*

系列 1:实际结果需要显示

这个系列有 6 个栏目。前三个是:

  • 样本中的儿童在出生后接受某种疫苗接种的最小中位数最大天数。例如,对于我收集的数据中的卡介苗,这些值分别为 0、13 和 304 天。稍后,中位数将在散点图中绘制为 x 值。

下一个是 y 值列:

  • y 值:包含每个 x 值的 y 值。这些是手动创建的,不是来自数据。当我们创建散点图时,您会看到这些值只是用来在 y 轴上垂直分布 x 值。

除此之外,还需要两列:

  • err_neg =中值—最小值
  • err_pos =最大值—中值

上面两列计算的数字将用于在中间值的两侧创建适当长度的误差线。您的数据表现在应该看起来像这样:

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

您可能会发现上表中列的位置有点奇怪。我这样做只是为了以后创建散点图更容易一些,只要正负误差的公式正确工作,列的顺序真的不重要。

系列 2:您需要显示的正常范围窗口

塑造这个系列的过程与第一个系列完全相同,有两个不同之处:

  1. 该系列中的最小值和最大值代表给定类别的任何正常范围的最小和最大极限。例如,儿童出生后应接种卡介苗的正常/适当天数的最小值和最大值分别为 0 天和 40 天。
  2. 这种情况下正常范围的‘中位数’是一个计算值,我们可以通过这个公式得到: =MEDIAN(min,max)

该系列的数据表应该如下所示:

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

系列 3:放置在 y 轴上的分类标签

我们可以简单地使用图表本身提供的 y 轴,但是我发现要将标签正确地放置在正确的距离上,并且没有显示 y 轴本身,这是非常烦人和困难的。因此,我使用了另一个数据系列来绘制标签,就像数据点一样。这给了我们更多的控制标签出现的地方。在本系列中,我为每个类别创建了 x 和 y 值列。下面的截图可以帮助你准备这个系列:

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

步骤 2:创建散点图

要创建第一个散点图,作为以后添加的所有内容的基础,首先选择前面创建的第一个系列(结果)的中间值和 y 值列。然后在功能区菜单中找到“插入”选项卡,选择第一种类型的“散点图”。

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

这应该给出下面的基本散点图。在这里,将轴调整正确是很重要的。如果你做得对,数据点应该对下面显示的 x 轴值有意义。

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

提示:如果您不确定散点图中的哪一列是 x 或 y 值,您可以通过右键单击图表,选择“选择数据”,然后单击相关系列的“编辑”按钮进行检查。这将显示哪个范围被选择为 x 值,哪个范围被选择为 y 值。

现在让我们清理一些图表垃圾,给我们一些喘息的空间。单击 y 轴以及垂直和水平网格线,然后按“Delete”键将其删除。

现在,我们将数据点标记从圆形转换为向上的三角形。双击任何数据点以选择整个系列。如果格式工具栏还没有打开,这应该会打开它。找到线条和标记设置,并从标记选项的内置选项中选择三角形。将“深红色”填充颜色(或您喜欢的任何颜色)应用于同一工具栏中的标记,并将相同的颜色应用于标记的边框。

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

现在你应该有这样漂亮的尖角标记:

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

现在,为了在中间值周围添加代表最小值和最大值的条,我们将使用误差线。单击图表顶部附近的“添加图表元素”按钮(或从功能区菜单中),然后单击“误差线”将水平和垂直误差线添加到数据点。然后点击垂直误差线,按“删除”键,只留下水平误差线。

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

现在单击水平误差线,在属性工具栏中,为误差量选择“自定义”选项。然后单击“指定值”按钮。这将打开一个对话框,询问正负误差量的数据范围。对于正误差,单击并拖动系列 1 的 err_pos 值,然后使用如下所示的 err_neg 值对负误差进行同样的操作。现在点击确定。

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

现在,您应该可以看到适当长度的误差线:

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

步骤 3:将第二个系列添加到散点图中

现在是时候添加代表正常窗口的第二个系列了。选中图表后,单击图表工具菜单中的“选择数据”。然后在“数据源”对话框中单击“添加”,添加新的一系列数据。在出现的下一个对话框中,通过单击并拖动第二个系列的 win_midy 值列下的值范围,添加这个新系列的 x 和 y 值(见下文)。您也可以从单元格 A8 中添加一个系列名称,但它以后不会显示在任何地方。现在单击确定,然后再次单击确定。

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

新系列应显示为代表正常范围窗口中点的点:

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

最终,我们将不再需要这些数据点,但为了便于选择,我们会暂时保留它们。对于这个系列,我们将再次使用误差线来创建一个正常的范围窗口。添加误差线的过程与我们在之前的系列中所做的完全相同。首先选择新系列的数据点,然后点击“添加图表元素”按钮,点击“误差线”选项添加误差线。然后选择垂直的并删除它们。

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

现在选择水平误差线,并在属性工具栏中为误差量选择“自定义”选项。然后点击“指定值”打开数值范围输入框。对于正误差,拖动第二系列数据中 err_pos 的值,对于负误差,使用 err_neg 下的值。然后单击确定。

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

在误差线仍处于选中状态的情况下,在误差线选项中选择“无帽”端样式。在填充和线条选项卡中,选择“实线”选项,并应用所示的绿色。然后改变透明度为 50%,宽度为 14 磅。

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

最后,要使中间的数据点消失,请单击任意数据点将其选中。然后在系列选项中选择“无填充”和“无线条”选项。

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

现在你应该有这样的东西:

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

步骤 4:创建标签系列

现在,我们将添加第三个也是最后一个系列,以显示图表中每个类别的标签。一般来说,这个过程与第二个系列相同,只是这里我们不使用任何误差线,而是从数据中添加标签。

选中图表后,单击图表工具菜单中的“选择数据”打开系列对话框。在这里,单击“添加”添加一个新系列。在接下来打开的范围输入框中,通过单击并拖动电子表格中第三个系列的 label_xlabel_y 列下的值,添加适当的范围(见下图)。然后单击确定,再单击确定。

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

沿着图表的左边界,你会看到新的系列只是点状的小点。右键单击这些点,然后从菜单中单击“添加数据标签”来添加标签。

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

标签还没有显示任何有意义的东西,所以让我们来解决这个问题。单击任意数据标签以选择所有数据标签。然后在属性工具栏中找到“标签选项”,点击“单元格中的值”。这将打开一个范围输入框。现在单击并拖动电子表格中第三个系列的标签列下所有类别的名称,添加这个范围。单击确定。

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

要清理它,取消选中标签选项中的“Y 值”和“显示引线”选项,并选择“左”作为标签位置。要为标签留出空间,请单击中央图表区,然后向右拖动此矩形的左边界(见下图)。

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

最后,要删除点标记,请单击标签系列的任何数据点,然后为系列中的标记选项选择“无填充”和“无线条”选项。

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

至此,该图表在技术上已经完成,除了一些调整:

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

第五步:简化和美化

在这最后一步,我们将做一些最后的润色,使图表看起来更加专业和完善。

  • 去掉 x 轴上的十进制数字:

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

  • 添加有意义的图表标题:

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

  • 使最小/最大条变粗并减少黑色:

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

  • 添加横轴标题,并将其命名为“Days”。
  • 最后,让字体稍微大一点,让文字更易读。

恭喜你!现在您已经准备好了最终的图表:

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

我个人喜欢做灰度图表,这里有一个灰度版本,可以获得更多灵感:

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

在此下载完整的教程文件

如何在 5 分钟内创建一个天气机器人

原文:https://towardsdatascience.com/how-to-create-a-weather-bot-in-5-minutes-7d83b1052269?source=collection_archive---------12-----------------------

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

创建天气机器人来获取 Hala.ai 聊天中的天气信息。在本教程中,我们将使用服务https://weatherstack.com来获取当前天气的信息。

**第一步。**去https://weatherstack.com注册一个免费账户

**第二步。**注册后,转到https://weatherstack.com/quickstart并复制为您的帐户生成的 API 访问密钥和基本 URL

**第三步。**转到 Hala 平台上的Integration部分,添加新的 integration REST API,并传递您在上一步中复制的值。保存您的结果。

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

**第四步。**转到哈拉平台上的Actions段,新建一个action。提供操作的名称并选择集成。

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

**第五步。**对你的 API 服务进行配置。您可以在 API 提供者的文档中找到关于构建 API 的更多信息。在我们的例子中,你可以在这里阅读这个服务的 API 文档。完成后,保存您的更改。

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

**第六步。**您已经设置了整合和行动。现在,您需要创建一个意图来识别关于获取天气的用户输入。转到哈拉平台上的Intents部分,按下New Utterance

**步骤 7。**要更改意向的默认名称,点击默认值旁边的铅笔图标,或者您可以点击默认值,然后您将能够修改它。

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

**步骤 8。**指定意图的名称并回车

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

**步骤九。**现在你需要提供最终用户如何撰写天气预报的例子。你需要提供至少五个例子。

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

第十步。 Save你的变化和train model

**第 11 步。**现在,您需要创建一个实体来识别我们需要提供天气的城市。转到平台上的Entities部分,按下New Entity

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

Save你的变化和train model

**第十二步。**进入哈拉平台Skill Kit部分,按下Create skill按钮创建技能

**第十三步。**提供技能的名称、描述和标签(最后两个是可选的)。按“下一步”创建对话流。

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

**第十四步。**你将进入创建对话流程界面。按下按钮Add new创建第一个根节点

**第十五步。**打开已创建的对话框节点并填充。

  • 字段名称—您可以输入任何值,例如“用户询问天气预报”
  • 条件——这里需要指定创建意图intent.get_weather

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

  • 操作—跳过此部分
  • 上下文—跳过此部分
  • 输出—这里我们需要询问用户我们需要为哪个城市提供天气预报

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

**第十六步。**现在您需要创建一个子节点来识别用户关于城市的输入。

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

**第十七步。**打开子节点,填充。

  • 字段名称—您可以输入任何值,例如“表单成功”
  • 条件—这里需要指定实体entity.city

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

  • 动作——当我们获得关于城市的信息时,我们可以向气象服务发送 API 请求。我们需要添加之前创建的操作。

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

查找并添加操作

当您添加操作时,您需要指定存储天气服务响应的上下文变量,例如context.weatherResponse

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

  • 上下文—这里我们需要将城市名保存到上下文变量中,该变量将被发送到天气服务。

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

  • Output —在 Output 中,您可以这样写“请稍候,我正在检查信息。”

**第十八步。**创建一个新的子节点来处理来自天气服务的 API 响应。

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

打开创建的节点并填充它:

  • 字段名称—您可以输入任何值,例如“提供结果”
  • 条件—指定在先前步骤中为动作响应创建的上下文变量:context.weatherResponse

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

  • 操作—跳过此部分
  • 上下文—跳过此部分
  • 输出—在输出中,我们需要提供关于天气的信息。要从 API 响应中访问数据,您需要使用下一个前缀context.weatherResponse.,然后指定所需数据的路径。所有的 API 提供者都有关于使用他们的 API 的信息。您可以阅读这些信息来创建正确的数据提取路径。

你可以使用下一段文字:

Weather forecast for {{context.weatherResponse.request.query}}Local time: {{context.weatherResponse.location.localtime}}Temprature: {{context.weatherResponse.current.temperature}}Wind speed: {{context.weatherResponse.current.wind_speed}}

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

**第 19 步。**按下“保存更改”按钮保存更改。现在,您已经创建了具有一个对话框节点的简单技能。

请记住保存您的更改。

**第二十步。**检验结果。使用下一个链接https://chat.hala.ai/进入哈拉网络聊天,并在聊天中键入第一条消息。您可以键入一个经过训练的短语,也可以使用未在意向训练中指定的新短语。

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

恭喜你!您已经创建了技能(机器人)并测试了它。

如何创建令人惊叹的数据科学产品组合

原文:https://towardsdatascience.com/how-to-create-an-amazing-data-science-portfolio-1ea4bc74ceee?source=collection_archive---------4-----------------------

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

Photo by Skye Studios on Unsplash

最近,我写了一篇文章,提出了进入数据科学领域的建议。如果你感兴趣,你可以在这里找到这篇文章:

[## 在数据科学家的海洋中脱颖而出

进入数据科学领域的建议

towardsdatascience.com](/standing-out-in-a-sea-of-data-scientists-c82e42a1e62b)

其中一条建议是“获得定义和解决端到端机器学习问题的经验。”我对如何有效地做到这一点有一些疑问,所以我想更深入地了解一下我将如何开始构建数据科学投资组合。

热情

你不太可能有充足的空闲时间,因此致力于构建你的数据科学投资组合肯定需要投入和牺牲。根据我的经验,只有当你追求一个你充满激情的项目时,你才会成功。激情也不一定要很明显。就我个人而言,我对写作一点也不热衷,但我热衷于分享想法。写作是一个很好的媒介,通过它我可以追寻我对想法的热情。也许你真的想做一个深度学习的项目,但缺乏动力。但也许你对音乐充满热情。你可以通过使用深度学习创作音乐来开始你的作品集。当你很想放弃的时候,将你的努力集中在你的激情上可以极大地帮助你坚持下去。

定义你自己的问题

在 Kaggle 等平台上围绕预定义的问题构建辅助项目是非常诱人的。虽然这无疑使过程更容易,但它有效地消除了数据科学过程中最重要的部分之一:定义问题。在行业中,通常最大的挑战之一是将业务问题转化为数据科学问题。在编写任何代码之前,请仔细考虑以下事项:

  • 我想解决什么问题?
  • 我认为我可以如何使用数据科学来解决这个问题?
  • 如果我能解决这个问题,会创造什么价值?

你的答案可能很简单,我想创作听起来像我最喜欢的乐队的音乐;我做了一些研究,看起来深度学习在解决这个问题上取得了一些成功;如果我能解决它,我将拥有无限的听起来像我最喜欢的艺术家的音乐!

这一步是必不可少的,因为它为你的项目故事搭建了舞台。这将帮助你更好地向他人解释你为什么选择这个项目,并展示你解决问题时的战略思维。

收集你自己的数据

如果您定义了自己的问题,这一步几乎肯定是强制性的。你的问题可能是独特的,因此你需要花一些时间收集数据。这太棒了!根据我的经验,我发现我花了大量的时间来思考收集数据来帮助解决我的问题的最佳方式。现在,您可以在您的项目中展示该技能。对于我们的音乐示例,它可能包括检查包含高质量合法音频下载的免费音乐档案库。我保证,通过探索如何获取和收集您自己的数据,您将学到数据科学过程中至关重要的一步,也是学校不常教授的一步。

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

Photo by Craig Whitehead on Unsplash

展示数据探索

正如安德烈·卡帕西所说:

与数据融为一体

任何机器学习项目的第一步都是花时间检查和分析你的数据。不要跳过这一步。它不仅重要,而且还允许你创建一些非常棒的可视化效果。深入挖掘您的数据,查看以下内容:

  • 有没有异常值?
  • 你的特性分布是怎样的?
  • 绘制特征和目标之间的相关性
  • 看看你的数据的实际例子

在这一步中,您还可以做更多的事情,但是这些都是一个很好的起点。使用 seaborn 让你的情节更漂亮,或者如果你有野心,试着让可视化与类似 Plotly 的东西互动。此处的目标是向他人展示您如何分析数据以发现他人可能忽略的智慧,这将使您的模型变得更好。

构建多个模型

太多时候,我看到项目只展示最好的模型。一个伟大的作品集项目可以让人了解你的思维过程,所以请给我们看看!为了有效地做到这一点,我推荐以下过程:

  • 首先,创建一个非机器学习基线。这个基线应该是合理的,比如历史平均值。这是评估你的第一个基于机器学习的模型的关键一步。
  • 其次,创建你的第一个机器学习模型。描述你为什么选择从这个模型开始,并与你的基线进行比较。
  • 第三,建立你的第二个机器学习模型。**这一步的关键部分是清楚地解释为什么这是下一个最好的步骤。**您的模型是否过拟合,因此您需要使用不太复杂的模型或添加正则化?也许您使用了相同的模型,但是基于错误分析开发了额外的特性。
  • 第四,重复第三步,直到你对结果感到满意。

最后,你不仅应该在你的项目中有多个模型,而且你将有一个逻辑故事来解释你如何考虑开发一个伟大的机器学习模型。

讲故事

在这一点上,你已经有了很多关键的组件,你可能会觉得你就要完成了。没那么快!你现在需要回去,把你所有的工作联系起来,讲一个伟大的故事。

伟大的数据科学家是伟大的故事讲述者

这是为你的作品集创造一个令人惊叹的项目的最重要的一步。如果你跳过这一步,你可能只是 GitHub 上的一堆代码。那不是投资组合。使用博客平台,如 Medium,或者你甚至可以创建自己的博客,并解释你的旅程。写下项目的目标,突出关键的探索性分析,包括你的建模结果和思考过程,告诉我们你的项目是如何创造价值的。

把这想象成你如何向主管们展示你的项目。你不需要包含任何代码(但是一定要链接到你在 GitHub 上的代码)。

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

Photo by JOSHUA COLEMAN on Unsplash

重复

现在你的投资组合中有了一个漂亮的项目。你现在要做的就是重复这个过程。:)这确实需要大量的工作和时间,但通过持续、专注的努力,你会发现自己有一些利用机器学习在你感兴趣的领域创造价值的故事(确保你在 LinkedIn 和简历上突出了你的投资组合)。这是一个惊人的数据科学产品组合,肯定会帮助您脱颖而出。寻找一些灵感?查看蒂姆·德特默斯的数据科学作品集。

这篇文章也可以在这里找到。

获取免费指南来帮助你学习部署你自己的项目的步骤。

如何在 R 中创建一个带有自动 Amazon 附属链接的交互式书单

原文:https://towardsdatascience.com/how-to-create-an-interactive-booklist-with-automatic-amazon-affiliate-links-in-r-7c1304dec43?source=collection_archive---------24-----------------------

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

Photo by Piotr Cichosz

介绍

B 书目是分享你读过的书籍、推荐给其他读者和/或推广你所写的书籍的有用方式。它可以简单到在你的个人网站或博客上显示的一系列书名。然而,你可能希望以一种更复杂的方式来呈现这份书单,比如在一个表格中列出书名、作者和购买链接。

在这篇博文中,我将向你展示如何在 r 中创建一个带有自动 Amazon 附属链接的交互式书单。此外,我所说的自动亚马逊联盟链接指的是直接重定向到亚马逊网上商店中有问题的书的 URL(当然是你的联盟链接),而不是手动为每本书创建一个链接。

这种技术对那些列表中有数百本书的人特别有用,因为你只需要创建一次 URL,它就会自动适应所有的书。如果这还不清楚,请看这里的一个实例

要求

为了用你的会员链接建立这个扩充的书单,你需要:

  • 一个亚马逊协会的账户。如果您还没有帐户,请在此注册
  • 书单(你推荐和/或你写的)

创建书单

你有两个选择:

  1. 在 Excel 中创建它,然后导入到 R
  2. 直接在 R 中创建它

在 Excel 中创建它,然后导入它

最简单的方法是遵循以下步骤:

  1. 打开一个 Excel 文件,用两列填写:(I)一列是标题,(ii)第二列是作者(见下图)
  2. 以. csv 格式保存(在 Excel 中,文件>另存为…>选择 CSV 文件格式并保存)
  3. 将其导入到 R 中(如果您在导入过程中遇到困难,请参见如何导入. csv 文件)
  4. (如果您以后需要编辑该列表,请直接在。csv 文件而不是 Excel 文件)

下面是你在 Excel 中创建的书单的样子(你的书单里应该有更多的书):

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

Step 1: Booklist created in Excel

我们现在将它导入 RStudio,并将数据集重命名为dat(参见这里的为什么我总是使用通用名称而不是更具体的名称):

dat <- read.csv("booklist.csv", # name of your file with .csv extension
  header = TRUE, # names of variables are present
  sep = ","
) # values are separated by a comma

您可以通过运行head(name_of_dataset)View(name_of_dataset)来检查您的书目是否被正确导入。

直接在 R 中创建它

您可以使用命令data.frame()直接在 R 中创建您的图书列表:

# Create the data frame named dat
dat <- data.frame(
  "Title" = c(
    "A Random Walk Down Wall Street",
    "Naked Statistics",
    "Freakonomics"
  ),
  "Author" = c(
    "Burton G. Malkiel",
    "Charles Wheelan",
    "Steven D. Levitt and Stephen J. Dubner"
  ),
  stringsAsFactors = FALSE
)
# Print the data frame
dat##                            Title                                 Author
## 1 A Random Walk Down Wall Street                      Burton G. Malkiel
## 2               Naked Statistics                        Charles Wheelan
## 3                   Freakonomics Steven D. Levitt and Stephen J. Dubner

让它互动

为了能够按作者或书名搜索书籍,我们使用 DT 包中的datatable()命令。下面的代码为带有默认选项的表格:

library(DT)
datatable(dat)

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

Example of interactive table with the {DT} package

让我们通过以下方式改进此表:

  • 删除行号
  • 在“标题”和“作者”列上添加过滤器
  • 增加了复制或下载表格的可能性
  • 仅显示前 5 个条目,而不是 10 个
  • 按书名升序排列书籍
datatable(dat,
  rownames = FALSE, # remove row numbers
  filter = "top", # add filter on top of columns
  extensions = "Buttons", # add download buttons
  options = list(
    autoWidth = TRUE,
    dom = "Blfrtip", # location of the download buttons
    buttons = c("copy", "csv", "excel", "pdf", "print"), # download buttons
    pageLength = 5, # show first 5 entries, default is 10
    order = list(0, "asc") # order the title column by ascending order
  )
)

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

Improved interactive table

将带有代销商链接的 URL 添加到表格中

我们现在要在上面的互动表格中添加取决于书名和作者的网址(包括你的会员链接)。为此,我们首先需要提取作为 URL 基础的附属链接,然后在 URL 末尾添加书名和作者。事实上,我们在 URL 的末尾添加了书名和作者,这使得它是自动的。事实上,最终的 URL 将重定向到该书的搜索页面(由于书名和作者作为关键字),并包括您的附属链接(因为我们使用附属链接作为基本 URL)。

提取附属链接

要提取代销商链接,请遵循以下步骤(参见下图获取帮助):

  1. 转到您的亚马逊协会帐户
  2. 点击产品链接>链接到任何页面
  3. 点击“搜索结果链接”选项卡
  4. 为产品系列选择“书籍和教科书”
  5. 输入你想要的任何关键字和你的链接的名称(这两个将在以后改变,所以你输入什么并不重要)
  6. 点击“获取 HTML”按钮
  7. 将预览(右窗格)中显示的代码复制到剪贴板中(Windows 上为 CTRL+c,Mac 上为 cmd+c)

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

Step 2: Link to Any Page on Amazon associates account

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

Step 3 to 7: Create Amazon affiliate link for a search page

您刚才复制的代码应该是这样的(虽然不完全相同,因为它包括您的个人会员链接):

<a target="_blank" href="https://www.amazon.com/gp/search?ie=UTF8&tag=antoinesoetew-20&linkCode=ur2&linkId=a587bdd780cbbfb6d3f4569f7fb358fc&camp=1789&creative=9325&index=books&keywords=BOOK TITLE">BOOK TITLE</a><img src="//ir-na.amazon-adsystem.com/e/ir?t=antoinesoetew-20&l=ur2&o=1" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

从这段长代码中,删除所有跟在keywords=后面的内容,但保留keywords=(这就是为什么你在上面的步骤 5 中键入的内容并不重要)。按照我们的示例,我们只剩下这段代码:

<a target="_blank" href="https://www.amazon.com/gp/search?ie=UTF8&tag=antoinesoetew-20&linkCode=ur2&linkId=a587bdd780cbbfb6d3f4569f7fb358fc&camp=1789&creative=9325&index=books&keywords=

复制这个缩短的代码。

追加书名和作者使其自动化

我们现在将连接(即,将几个字符串附加在一起)Amazon affiliate 链接(我们刚刚复制的代码)、书名和作者,然后是一个带有paste0()命令的结束 HTML 标记。结果将是一个 URL,它以附属链接为基础,以书名和作者为关键词,使它自动适应你书单上的每本书。为此,在 R 中运行以下命令:

# Do not mix " and ', they are different in this case!
link <- paste0(
  '<a target="_blank" href="https://www.amazon.com/gp/search?ie=UTF8&tag=antoinesoetew-20&linkCode=ur2&linkId=a587bdd780cbbfb6d3f4569f7fb358fc&camp=1789&creative=9325&index=books&keywords=', # affiliate link
  dat$Title, " + ", dat$Author, # book title and author
  '">Amazon</a>' # closing HTML tag
)

你的链接应该看起来像这样,所有的书都有相同的附属链接和结束标签,但有不同的关键字,对应于书名和作者:

head(link)## [1] "<a target=\"_blank\" href=\"https://www.amazon.com/gp/search?ie=UTF8&tag=antoinesoetew-20&linkCode=ur2&linkId=a587bdd780cbbfb6d3f4569f7fb358fc&camp=1789&creative=9325&index=books&keywords=A Random Walk Down Wall Street + Burton G. Malkiel\">Amazon</a>"   
## [2] "<a target=\"_blank\" href=\"https://www.amazon.com/gp/search?ie=UTF8&tag=antoinesoetew-20&linkCode=ur2&linkId=a587bdd780cbbfb6d3f4569f7fb358fc&camp=1789&creative=9325&index=books&keywords=Naked Statistics + Charles Wheelan\">Amazon</a>"                   
## [3] "<a target=\"_blank\" href=\"https://www.amazon.com/gp/search?ie=UTF8&tag=antoinesoetew-20&linkCode=ur2&linkId=a587bdd780cbbfb6d3f4569f7fb358fc&camp=1789&creative=9325&index=books&keywords=Freakonomics + Steven D. Levitt and Stephen J. Dubner\">Amazon</a>"

向交互式表格添加链接

既然 URL 是特定于每本书的,我们可以将它们添加到前面构建的交互式表格中:

dat$Link <- link

最后,我们可以显示带有标题、作者及其 URL 的交互式表格:

datatable(dat,
  rownames = FALSE, # remove row numbers
  filter = "top", # add filter on top of columns
  extensions = "Buttons", # add download buttons
  options = list(
    autoWidth = TRUE,
    dom = "Blfrtip", # location of the download buttons
    buttons = c("copy", "csv", "excel", "pdf", "print"), # download buttons
    pageLength = 5, # show first 5 entries, default is 10
    order = list(0, "asc") # order the title column by ascending order
  ),
  escape = FALSE # to make URLs clickable
)

这与之前的代码完全相同,只是我们需要添加escape = FALSE来使 URL 可点击。

决赛成绩

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

Final result of the interactive booklist with affiliate links

通过点击不同的链接来检查一切是否正常。如果您没有错过任何步骤,它会将您重定向到亚马逊商店,在搜索栏中显示书名和作者,从而在搜索结果中显示有问题的书。

感谢阅读。我希望这篇文章能帮助你建立一个交互式书单,并自动链接到你书单上的每本书。如果你想看一个活生生的例子,请看我的个人书单

和往常一样,如果您有与本文主题相关的问题或建议,请将其添加为评论,以便其他读者可以从讨论中受益。

相关文章:

原载于 2019 年 12 月 26 日【https://statsandr.com】

内容概要:本文详细介绍了一个基于Java与Vue的食品安全溯源与智能分析系统的设计与实现,涵盖项目背景、目标意义、面临挑战及解决方案,并阐述了系统的整体架构与核心技术模块。系统通过集成物联网设备实现全流程数据采集,采用分布式数据库保障大数据存储与高效访问,结合机器学习算法进行风险预测与智能预警,同时利用可视化技术呈现溯源链路与分析结果,实现了食品从生产到销售全过程的透明化、智能化管理。文中还提供了关键模块的代码示例,如数据清洗、特征提取、决策树模型训练与预测、溯源接口开发等,增强了项目的可实施性与参考价值。; 适合人群:具备Java开发基础、熟悉Spring Boot和Vue框架,有一定前后端开发经验的软件工程师或计算机专业学生,尤其适合从事食品安全、物联网、大数据分析等相关领域技术研发的人员; 使用场景及目标:①构建食品全链条溯源体系,提升企业对食品安全事件的快速响应能力;②实现生产流程数字化管理,支持政府监管与消费者透明查询;③应用机器学习进行风险建模与智能预警,推动食品行业智能化转型; 阅读建议:建议结合文中提供的模型描述与代码示例,深入理解各模块设计逻辑,重点关注数据处理流程、算法实现与前后端交互机制,可基于该项目进行二次开发或拓展应用于其他行业的溯源系统建设。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值