发布模型以从 Rest API 获得对新数据的预测
通过使用 TensorFlow 服务托管的模型从 Rest API 获取数据预测。
所以,你有一个漂亮的模型,它在数据上非常有效。现在,您希望将该模型投入生产,并根据新数据进行预测。
让我向您介绍 TensorFlow 服务系统,该系统旨在为生产中经过培训的模型提供服务。默认情况下,它与 TensorFlow 模型无缝集成,但功能也可以扩展到其他模型。
保存模型
所以,让我们说,在遵循了这篇文章中的步骤之后,你有了一个训练有素的模型,并且你正在使用 Google Colab。
TensorFlow 服务的模型必须与版本和变量一起保存,这可以通过下面的代码来完成:
检查我们刚刚保存的模型
如果在 TF 服务中有几个模型,而我们不知道这些模型的细节,这是很有帮助的。这段代码变得非常有价值,在这种情况下,它将显示已保存模型的内容。
为模型服务并获得预测
服务使我们能够管理模型的版本,并确定使用哪个版本的优先级。这对于重新训练模型或者在不损害平台架构完整性的情况下促进迁移学习特别有用。
现在让我们使用 TensorFlow Serving 的 REST API 进行预测:
本主题到此结束,它涵盖了前面提到的文章中所涵盖的构建模型的端到端过程,然后托管模型以使用 Rest API 获得新数据的预测。
使用服务有多种方式,这个主题本身扩展并联系了使用 Google Cloud 服务模型。
从 Jupyter 笔记本发布到媒体
约翰·马特丘克在 Unsplash 上拍摄的照片
在媒体上创建技术职位的更有效方法
程序员们,当我们写一篇技术文章时,我们都知道写一个笔记本然后不得不将代码复制并粘贴到介质中的困难…头痛!让我高兴的是,可能也是你高兴的是,我发现了一个包,我相信它是我们关于媒体灾难的编程的拯救之恩。
Jupyter-to-Medium是由一位媒体作家同行 Ted Petrou 创造的。Ted 将这种挫折感转化成了我认为非常有创意的方案——点击此处 阅读更多。
我在这篇文章中的动机很简单。我的目标是演示并测试 Jupyter-to-Notebook 包的全部功能,然后添加我对该包的想法以及对那些决定将它作为其博客工作流程一部分的人的建议。
免责声明:我不是付费推广人,也没有被要求以任何方式在 Jupyter-to-Medium 上写这个故事——我只是觉得这是个很酷的想法。
概观
那些精通 Jupyter 笔记本的人会知道 LaTex 是一个内置功能——如果你不知道,现在你知道了。我经常发现自己不得不在谷歌上搜索数学表达式的图像(这不违反任何版权协议),或者在最糟糕的情况下,我不得不在将它作为图像导入 Medium 之前,自己动手设计它。
这一过程可能极其费力,更不用说它有多乏味了。有很多帖子我不得不推迟一个小时发表,因为我正在创建我的数学表达式的图像——不将 LaTex 纳入媒体的想法是一场灾难,但如果有合理的理由说明为什么不这样做(或者如果我不知道如何做),那么我就收回。
如前所述,LaTex 是 Jupyter 笔记本的一个特性,所以我希望当我在笔记本中实现 LaTex 时,它会在导入到介质中时自动解析为图像。但是—
$ $ \ hat { y } = \ theta _ { 0 }+\ theta _ { 1 } X _ { 1 }+\ theta _ { 2 } X _ { 2 } $ $
显然事实并非如此(上面的是我在 Jupyter 笔记本中写的 LaTex 代码的一个例子)。
尽管如此,每当我打开 Jupyter 笔记本环境时,通常不是为了在 markdown 单元格中编写 LaTex 代码。相反,我通常使用笔记本来执行一些类型的原型制作、可视化、分析等。因此,这个属性不符合我最初的期望,无论如何不会损害这个包的前景。
在 Medium 上写技术故事的一个非常恼人的壮举是,当你不得不将你在 Jupyter 笔记本上写的所有代码复制并粘贴到 Medium 上时——想想它就让我更加恼火!
Jupyter-to-Medium 将我们写在笔记本上的代码单元翻译成 Medium 中的代码块,然后发布到其他地方。
*# example of code cell being translated to code block on medium
print("Hello World")Hello World*
挺酷的吧!
进一步来说,当在我们的 Jupyter 笔记本环境中工作时,我们经常有一些我们试图探索的数据。我不知道其他人如何将他们的数据框架整合到他们的技术博客中,但我必须对每个单独的数据框架进行截图并裁剪,以便我可以将其作为图片上传到我的媒体故事中——这又是一个花费不必要时间的过程!
必须截图,然后在上传前保存也是相当漫长和繁琐的。当数据框有很多列时,笔记本会在数据框和滚动条上添加省略号,以显示更多的列……我想看看 Jupyter-to-Medium 如何处理这一壮举,令我高兴的是,我被深深打动了。
在图 1* 中,您可以看到省略号是存在的,但是解析器提取了表格并以合适的大小将其粘贴到介质上。*
演示数据来自 Kaggle 分类特征工程竞赛— 点击此处 访问数据集。
*import pandas as pd
df = pd.read_csv("../data/categorical_feature_engineering_raw/train.csv")
df.head()*
图 1
我经常使用 Plotly 来实现我的可视化,然而当我最初试图在这篇博客文章中使用它时,我的文章导致了 60 分钟的阅读,内容与我当前的文章完全相同。经过进一步的检查,我意识到我所有的 Plotly 代码都被转换成了一长串数字(我也不小心把这个发表到了《走向数据科学》上— 对不起,伙计们)。
长话短说,我用 Matplotlib 做这个概述。
合并 Plotly 的失败可能会让那些已经从静态情节完全转换到交互情节的人,以及那些甚至没有体验过 matplotlib 的人感到不安。但是,如果你对框架不是那么挑剔,你会做得很好,而且 matplotlib 非常容易学习!
注:我没有测试 Seaborn,所以如果你使用它,请让我知道结果 t.
*# https://matplotlib.org/api/pyplot_api.html
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 5, 0.1);
y = np.sin(x)
plt.plot(x, y)
plt.show()*
图 2
*# https://matplotlib.org/3.1.1/gallery/images_contours_and_fields/image_annotated_heatmap.html
vegetables = ["cucumber", "tomato", "lettuce", "asparagus",
"potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening",
"Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]
harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],
[2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],
[1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],
[0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],
[0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],
[1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],
[0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])
fig, ax = plt.subplots(figsize=(8, 10))
im = ax.imshow(harvest)
# We want to show all ticks...
ax.set_xticks(np.arange(len(farmers)))
ax.set_yticks(np.arange(len(vegetables)))
# ... and label them with the respective list entries
ax.set_xticklabels(farmers)
ax.set_yticklabels(vegetables)
# Rotate the tick labels and set their alignment.
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
rotation_mode="anchor")
# Loop over data dimensions and create text annotations.
for i in range(len(vegetables)):
for j in range(len(farmers)):
text = ax.text(j, i, harvest[i, j],
ha="center", va="center", color="w")
ax.set_title("Harvest of local farmers (in tons/year)")
fig.tight_layout()
plt.show()*
图 3
那些关注我的故事的人会知道我喜欢给我的照片贴标签。如果你想知道我是在 Jupyter 笔记本上还是在 Medium 上标注数字,答案是“我在 Medium 上做的”。
最后但并非最不重要的,动画。我以前从未用过动画,所以我想尝试一下可能会很酷。
*# http://louistiao.me/posts/notebooks/embedding-matplotlib-animations-in-jupyter-as-interactive-javascript-widgets/
from matplotlib import animation
from IPython.display import Image
%matplotlib inline
fig, ax = plt.subplots()
ax.set_xlim(( 0, 2))
ax.set_ylim((-2, 2))
line, = ax.plot([], [], lw=2)
def init():
line.set_data([], [])
return (line,)
def animate(i):
x = np.linspace(0, 2, 1000)
y = np.sin(2 * np.pi * (x - 0.01 * i))
line.set_data(x, y)
return (line,)
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=100, interval=20,
blit=True)
anim.save('animation.gif', writer='imagemagick', fps=60)print("Static plot")
Static plot*
图 4
*anim.save('animation.gif', writer='imagemagick', fps=60)Image(url='animation.gif')*
图 5
注意:我确实不得不手动导入 gif,但这可能只是因为我对使用 gif 不熟悉,因为在 Ted done 的主要文章中有一个完整的 gif。
图 6:我的文章从 Jupyter 笔记本上发表的确认
要获得完整的代码,请点击下面的链接,但请注意,从我的 Jupyter 笔记本上最初上传的是我的第一份草稿,因此你可能会注意到笔记本上的大幅修改。
permalink dissolve GitHub 是超过 5000 万开发人员的家园,他们一起工作来托管和审查代码,管理…
github.com](https://github.com/kurtispykes/demo/blob/master/notebook/kpy_jupyter_to_medium_test.ipynb)*
我的概述
我想我已经清楚地表达了我的观点——我认为这个软件包非常有创意,我真诚地建议每个在 Medium 上写技术文章的人应该避免使用这个软件包。尽管如此,我还是要警告任何决定采用这种包装的人,要小心 Jupyter 笔记本和介质的用途形成了明显的对比,这一点应该被考虑在内。
媒体上的共享被优化以使写作更像样,Jupyter 笔记本是用来做整洁的探索的。当我们从笔记本中发布到 Medium 时,这一点变得非常明显,因为要让您的 Medium 故事看起来像样,至少在我看来是这样的。我不认为直接从 Jupyter 笔记本发布是一个好主意,你几乎总是想要编辑格式和样式(例如,首字下沉)。
我最好的建议是利用这两个平台的优势,这样你就可以对你最初的 Jupyter 笔记本进行调整,但同时,重要的是要意识到大部分繁重的工作已经为你完成了!
如果你想和我联系,最好的方式是通过 LinkedIn
* [## Kurtis Pykes -人工智能作家-走向数据科学| LinkedIn
在世界上最大的职业社区 LinkedIn 上查看 Kurtis Pykes 的个人资料。Kurtis 有一个工作列在他们的…
www.linkedin.com](https://www.linkedin.com/in/kurtispykes/)*
在网络上发布您自己的数据科学文档/书籍
关于如何使用免费的 MkDocs 和 GitHub 页面在线发布您自己的项目文档/书籍的指南。
帕特里克·托马索在 Unsplash 上的照片
介绍
你有没有想过图书馆通常如何在线发布他们的文档?在线发布项目文档最常见的方式之一是使用 MkDocs 。
MkDocs 是一个静态站点生成器,它只使用一个 Markdown 文件列表和一个 YAML 配置文件来立即生成自己的网站,然后可以使用 GitHub 页面在一行代码中免费部署。
如果你正在寻找一个使用 MkDocs 生成的网站的例子,你可以在这里找到我写的关于我的研究项目“通过游戏和机器学习缓解儿童健康问题”的书,我在我的上一篇文章中谈到过它(图 1)。
图 1: 使用 Mkdocs 创建的示例文档项目。
在本文中,我将带您快速了解如何生成您自己的在线项目文档。
创建项目
首先,我们需要安装 MkDocs Python 库。
pip install mkdocs
一旦安装了这个库,我们就可以为我们的项目创建一个文件夹,并从这个位置打开一个命令提示符。运行以下命令,将自动为我们创建一个 Mkdocs 项目。
mkdocs new my-project-name
该项目将具有如下所示的结构:
-- my-project-name
-- mkdocs.yml
-- docs
-- index.md
将使用 mkdocs.yml 文件来设计我们网站的结构,而 docs 文件夹中的所有 Markdown 文件将用于创建网站每个不同页面的内容。如果你不熟悉如何使用 Markdown 创建文本文件,你可以在这里找到介绍指南。
通过创建 mkdocs 项目自动生成的一个简单的 mkdocs.yml 文件如下所示:
site_name: MkLorum
nav:
- Home: index.md
然后我们可以修改它来选择我们想要的网站名称(而不是 MkLorum ),并在网站导航栏上添加多个页面,只需在导航标签下添加新页面即可(在左侧指定导航按钮名称,在右侧指定 docs 文件夹中的文件名)。最后,也可以使用预装的主题(例如 readthedocs )或者从 Mkdocs 社区中选择一个主题来设计我们的网站。
下面是一个更加个性化的 mkdocs.yml 文件示例。
site_name: my_website_name
nav:
- Home: index.md
- About: about.md
- Contacts: contacts.md
theme: readthedocs
在 docs 文件夹中,我们可以找到一个自动创建的 index.md 文件,然后我们可以为自己的网站定制这个文件。然后,我们可以通过在 docs 文件夹中添加新的 Markdown 文件,然后在 mkdocs.yml 文件中引用它们,向网站添加任意多的页面。
在开发阶段的每一点,我们都可以通过在命令行中从我们的项目位置运行以下命令来观察我们网站的外观:
mkdocs serve
这将激活一个本地服务器,然后我们就可以在这个地址看到我们的网站: http://127.0.0.1:8000 。一旦我们的本地服务器运行,如果我们修改任何文件(并保存更改),它们将自动显示在网站上。
将所有内容添加到网站并检查其显示是否正确后,我们可以通过运行以下命令来构建 HTML 和 CSS 文件:
mkdocs build
至此,我们已经准备好用 GitHub 库初始化我们的项目了。之后,我们可以从命令运行我们的最后一个命令,然后我们的项目将在线部署:
mkdocs gh-deploy
在命令提示符下,将会显示我们的网站将被激活的链接。或者,我们可以通过访问我们的存储库设置并查找 GitHub pages 选项来找到相同的链接(运行上面显示的命令,实际上会自动生成一个名为 gh-pages 的新分支,GitHub 将使用它来托管我们的文档网站)。
联系人
如果你想了解我最新的文章和项目请关注我的媒体并订阅我的邮件列表。以下是我的一些联系人详细信息:
使用简单的 Python 包提取和分析金融数据
我们演示了一个简单的 Python 脚本/包来帮助您提取财务数据(所有您能想到的重要指标和比率)并绘制它们。
图片来源: Pixabay(免费商业使用)
介绍
股票市场分析和良好的投资(为了长期增长)需要仔细检查财务数据。各种指标和比率经常在这种分析中使用,即评估股票的内在质量。你可能在金融和投资专家的谈话中听说过其中一些。
比如 市盈率 或者市盈率。它是股价与年收益/每股的比率。
或者, 每股账面价值 。它是一家公司的普通股除以其发行在外的股票数量的比率。当一只股票被低估时,它的每股账面价值相对于它在市场上的当前股价会更高。
市盈率(P/E)是投资者和分析师用来确定股票价格的最广泛使用的指标之一
www.investopedia.com](https://www.investopedia.com/investing/use-pe-ratio-and-peg-to-tell-stocks-future/)
通常这些数据可以从雅虎财经这样的网站上获得。但是,除非您使用某种付费的注册服务,否则您不能以编程方式下载或抓取数据。
在雅虎财经,你可以获得免费的股票报价、最新新闻、投资组合管理资源、国际市场…
finance.yahoo.com](https://finance.yahoo.com/)
然而,有许多微服务通过简单的 API 调用提供这样的数据。为了利用这一点,我们将在本文中展示,如何编写一个简单的 Python 类脚本来与 金融数据微服务 进行交互。
图片来源:作者截屏(网站)
使用这个 Python 类,您可以通过调用一系列简单的方法来提取数据并构建一个包含几乎所有重要财务指标和比率的 Pandas 数据框架。
我们还提供简单的图表方法(条形图和散点图)来图形化分析数据。
注意,你需要从网站获取自己的秘密 API key(免费)并在实例化类对象后注册。
也就是说,让我们研究一下 Python 包/类和它附带的各种方法。
Python 类和各种内置方法
核心 Python 类在我的 Github repo 上可用 。请随意开始和叉回购,并对其进行改进。您可以简单地克隆存储库,并开始在您自己的笔记本中使用脚本。
**> mkdir My_project
> cd My_Project
> git clone** [**https://github.com/tirthajyoti/Finance-with-Python.git**](https://github.com/tirthajyoti/Finance-with-Python.git) **> cd financeAPI**
为了保持代码的整洁,在本文中,我们在一个测试 Jupyter 笔记本中展示了该类的用法。
我们从导入常规库和类对象开始。
从文件中读取秘密 API 密钥并注册它
注意,您需要在与代码文件相同的目录中有一个名为Secret_Key.txt
的文件。没有它,你就不能进步。
在这里报名:https://financialmodelingprep.com/login
创建一个类实例
它有一个描述
不注册密钥,我们无法访问数据
我们肯定想现在就开始提取数据。假设我们想为苹果公司(股票代码为“AAPL”)构建一个数据字典。我们可以尝试,但不会成功,因为我们还没有向类对象注册密钥。
所以,我们注册了密钥
现在让我们建立一个数据字典
对于这个类中的所有方法,我们必须传递公司的股票代码(在美国金融市场上)。对苹果公司来说,这是“AAPL”。
如果我们检查这个字典,我们会注意到大量的数据是从 API 端点提取的。下面提供了部分截图。
用多家公司的数据构建一个数据框架
使用 Python 字典很好,但是对于大规模数据分析,我们应该考虑构建一个 Pandas 数据框架。我们提供了一个内置的方法来做到这一点。构建一个数据框架就像传递一个股票代码列表一样简单,代码会为您完成所有的数据搜集和结构化工作。
假设我们想下载以下公司的所有财务数据,
- 推特
- 脸谱网
- 微软
- 英伟达
- 苹果
- 销售力量
一个格式良好的数据帧已经准备好供您使用了!
究竟什么样的数据是可用的?
我们可以很容易地检查从 API 服务中提取的数据类型。注意,我们传递一个参数“profile”、“metrics”或“ration”,并获取相应数据项的列表。
开始绘图—可视化分析
在这个包中,我们已经包含了对数据进行简单可视化分析的代码。
在简单的条形图中检查各种指标和财务比率通常很有帮助。为此,只需传递您想要绘制的变量的名称。您还可以包含常见的 Matplotlib 关键字参数,如颜色和透明度(alpha)。
您还可以绘制简单的散点图,直观地分析财务指标之间的相互关系。
您还可以传递第三个变量,用于缩放散点图中标记的大小。这有助于以一种间接的方式,在一个二维图中可视化两个以上的变量。例如,我们在下面的代码中将股价参数作为第三个变量传递。
使用底层数据框架进行自定义分析
通常,投资者可能希望利用现有数据创建自己的过滤器和投资逻辑。
例如,我们可能只想考虑那些市值超过 2000 亿美元的公司,然后在条形图中查看企业价值相对于 EBIDTA 的度量。
我们可以访问底层数据帧,创建自定义数据帧,然后将该自定义数据帧分配给新的financeAPI()
对象,以利用现成的图表方法。
这样,我们就不需要再向 API 请求数据了。我们要尽量避免数据读取,因为 free API key 读取数据的数量有限制。
然后我们根据这个自定义数据框架(嵌入在自定义类对象中)绘制一个条形图。
摘要
我们展示了一个简单 Python 类/包的实现和用法,该类/包可用于从微服务中提取各种财务指标和比率。
需要向服务注册才能获得免费的 API 密钥。当然,就免费帐户读取的数据数量而言,这种使用是有限的。该网站还有无限使用的付费计划。
请注意,这项工作侧重于年度财务报表中可用的静态财务数据,而不是动态时序股票市场定价数据。它应该被用来衡量一家公司的长期财务实力,以进行增长型投资。
作为一名数据科学家,您可能经常需要编写定制的类/包来从微服务 API 中提取和分析数据,希望本文(以及相关的代码库)能够为您提供简单而有效的知识介绍。
图片来源: Pixabay(免费商业使用)
答另外,你可以查看作者的 GitHub 知识库中机器学习和数据科学的代码、思想和资源。如果你和我一样,对人工智能/机器学习/数据科学充满热情,请随时在 LinkedIn 上添加我或在 Twitter 上关注我。
[## Tirthajyoti Sarkar - Sr .首席工程师-半导体、人工智能、机器学习- ON…
通过写作使数据科学/ML 概念易于理解:https://medium.com/@tirthajyoti 开源和有趣…
www.linkedin.com](https://www.linkedin.com/in/tirthajyoti-sarkar-2127aa7/)
将金融时间序列数据引入 Python:一些免费选项
将股票价格数据直接导入 Python 进行下一步分析
获取金融时间序列数据集可能会很麻烦。幸运的是,互联网上有很多方法可以将金融时间序列数据直接导入 Python 进行分析。更好的是,这些选项中有许多是免费的。在本教程中,我们将使用以下免费 API 选项将金融时间序列数据导入 Python:
在这两个 API 之间,我们应该能够访问绝大多数金融数据集,包括每日和当天的股票价格数据。
使用 Alpha Vantage API 提取数据
总部位于马萨诸塞州波士顿的 Alpha Vantage 是历史和实时股票数据、实物货币数据和加密货币数据的免费 API 的领先提供商。获得一个免费的 API 密钥来访问它的数据库很简单。进入该网页,按照提示填写您的联系方式:
填写您的联系方式,申领您的免费 API 密钥
一旦你完成了,Alpha Vantage 会在它的网页上打印一个 API 密匙供你个人使用。您可以使用这个键将数据直接拉入 Python 进行分析。
下载所需的库
Alpha Vantage 有一个专门针对其 API 的 Python 库。进入命令提示符并输入以下内容来下载 Alpha Vantage 的 API 包:
pip install alpha-vantage
当天时间序列数据
通过 Alpha Vantage 的 API 提取时间序列数据有几个选项,这取决于您想要的数据频率级别。我们将介绍的第一种方法是日内数据,我们希望提取数据频率为 1 小时或更少的时间序列。
我们使用以下代码提取 Google 股票的时间序列数据,数据频率为 15 分钟:
谷歌股价(高位),15 分钟间隔数据
返回的当天 Google 股票时间序列数据快照。数据包括开盘价、最高价、最低价、收盘价和成交量信息。
我们使用*pull _ intraday _ time _ series _ alpha _ vantage()*函数提取时间序列数据。该功能允许 1 分钟、5 分钟、15 分钟、30 分钟和 60 分钟的采样频率。
我们将 API 键、股票代码名称(’ GOOGL ')和期望的采样频率作为参数传入。该函数以 15 分钟的数据采样频率返回包含股票数据(包括开盘价、最高价、最低价、收盘价和成交量数据)的数据帧,以及与时间序列相关联的元数据数据帧。
每日时间序列数据
除了日内数据之外,Alpha Vantage 的 API 还允许您提取每日时间序列数据。提取每日数据的调用方法类似于提取当天数据的调用方法,如下面的代码片段所示:
伯克希尔·哈撒韦公司股价(高位),每日数据
返回的每日伯克希尔哈撒韦股票数据的快照。数据包括开盘、盘高、盘低、收盘、调整收盘和成交量信息。
在上面的代码块中,我们提取了伯克希尔哈撒韦公司股票的每日时间序列数据,追溯到 100 天前。我们在 main() 块中调用*pull _ daily _ time _ series _ alpha _ vantage()*函数。该函数接受我们的 API 键,股票代号(在本例中是“BRK。b”)和 output_size 作为参数。 output_size 变量与我们希望返回多少数据有关。默认设置“compact”返回股票过去 100 天的每日数据。如果我们将 output_size 设置为“full ”,则返回完整的时间序列。这可能是二十多年的日常数据!
上面的例子只是对 Alpha Vantage 的 API 功能的简单介绍。有关使用他们的 API 的更多信息,请查看完整的 API 文档:https://www.alphavantage.co/documentation/
使用 Quandl API 提取数据
Quandl 位于加拿大多伦多,拥有超过 400,000 名用户,并提供对开放、商业和替代数据集的访问。数据以易于理解的格式提供,非常适合数据分析。
就个股数据而言,Alpha Vantage 胜过 Quandl,因为 Quandl 对访问大多数日内数据集收费(不过,每日股价数据是免费的)。然而,Quandl 免费提供了大量其他数据集。快速浏览他们的“免费”数据集页面会发现一个免费数据集的宝库,包括:
- Wiki 连续期货数据,其中包含 600 个期货的连续合约。基于芝加哥商品交易所、洲际交易所和伦敦国际期货交易所的数据。
- Zillow 房地产数据,包括房屋供求数据。该数据集还包括按大小、类型和层级划分的住房和租金数据,这些数据可以是按邮政编码、社区、城市和州划分的子集。
- 美联储经济数据,包括美国的增长、就业、通胀、劳动力和制造业数据。
出于本教程的目的,我们将通过 Quandl 的 API 提取美联储数据,以及每日股票价格数据。
获取您的 Quandl API 密钥
要获得免费的 Quandl API 密匙,在这里注册一个 Quandl 账户。
Quandl 报名页面
一旦您成功创建了一个帐户,您应该会收到一封来自 Quandl 的电子邮件来验证您的帐户。验证并激活您的帐户后,请访问您的个人资料页面,该页面清楚地显示了您的 API 密钥:
Quandl 个人资料页面,其中包含您的 API 密钥
下载所需的库
Quandl 有一个特定的 Python 包来处理它的 API。转到命令提示符并输入以下内容来下载 Quandl API 库:
pip install quandl
提取时间序列数据
美联储经济数据
在我们编写任何代码之前,让我们通过其 Quandl 文档页面查看一下美国美联储经济数据(FRED)下可用的不同时间序列集:
FRED 数据集中可用的一些时间序列的快照,可通过 FRED 文档页面 获得
正如您在上面的快照中看到的,有许多时间序列集可供使用。为简单起见,我们来拉一下国内生产总值(GDP)的时间序列。在下面的代码片段中,我们将季度美国 GDP 时间序列数据放入 Python:
季度 GDP 数据
返回的 GDP 时间序列快照
我们将 Quandl API 键定义为 quandl。ApiConfig.api_key 参数。我们使用 quandl 的 get() 函数调用 GDP 数据。“FRED/GDP”作为数据集名称传递——这是我们的时间序列的特定标识符。我们首先通过它所属的主数据存储库引用一个特定的数据集名称—在本例中是‘FRED’—后跟一个斜杠,然后是特定的数据集名称(这里是‘GDP’;该值可在主数据集的文档页面中找到。
日终股价数据
尽管 Quandl 不像 Alpha Vantage 那样提供免费的当日股价数据,但它确实提供每日收盘时的股价数据。我们可以使用以下代码获取微软股票的每日价格数据:
每日微软股票价格,开盘价
上面的代码与前面的例子略有不同,因为我们使用了 quandl 的 get_table() 函数,而不是它的 get() 函数。函数的作用是:返回一个包含多列的熊猫数据帧。相比之下, get() 返回单个时间序列。由 get_table() 调用返回的数据集快照如下所示:
每日微软股票数据,通过 quandl 的 get_table()函数返回
如您所见,返回的 Microsoft stock dataframe 包含股票的开盘价、最高价、最低价、收盘价、成交量和调整值的时间序列数据。
除了上面列出的两个例子,Quandl API 还提供了许多其他功能。有关 Quandl 的 Python API 插件的更多信息,请查看他们在 这个 Github repo中的文档。
结论
本文中涉及的两个 API 都免费为您的下一个时间序列分析提供了广泛的财务数据(如果您正在寻找一个特定的数据集,可以使用高级选项)。获取高质量的数据是数据科学中最大的挑战之一。幸运的是,像 Quandl 和 Alpha Vantage 这样的 API 服务使得获取用于数据探索和算法开发的金融时间序列集变得前所未有的容易。
我关于使用免费 API 将金融时间序列数据导入 Python 进行分析的教程到此结束!关于本教程中使用的完整代码,请查看 Github repo 。
查看我的其他时间序列分析教程:
[## 使用季节性 ARIMA 模型的时间序列预测:Python 教程
时间序列预测中研究最广泛的模型之一是 ARIMA(自回归综合移动…
techrando.com](https://techrando.com/2020/01/04/time-series-forecasting-using-a-seasonal-arima-model/) [## 使用 Python 分析电价时间序列数据:时间序列分解和价格…
欢迎来到科技兰多博客!本教程涵盖了时间序列分解和向量自回归(VAR)…
techrando.com](https://techrando.com/2019/07/19/analyzing-electricity-price-time-series-data-using-python-time-series-decomposition-and-price-forecasting-using-a-vector-autoregression-var-model/) [## 时间序列中离群点检测的无监督机器学习方法
在这篇文章中,我将介绍一些我最喜欢的检测时间序列数据中异常值的方法。有许多不同的…
techrando.com](https://techrando.com/2019/08/23/unsupervised-machine-learning-approaches-for-outlier-detection-in-time-series/)
原载于 2020 年 1 月 12 日【https://techrando.com】。
将推文拉入 R
链接 Twitter 的 API 的教程
Kon Karampelas 在 Unsplash 上拍摄的照片
在本教程中,我将向您展示建立 Twitter 开发者帐户所需的步骤,这样您就可以利用他们的 API,然后将 tweets 直接拉入您的 R Studio 环境中。
1.申请一个 Twitter 开发者账户
你需要一个 Twitter 开发者账户,因为它可以让你访问一个个性化的 API 密匙,这是我们以后需要的。这个密钥对每个帐户都是唯一的,所以你不能共享它。
访问 Twitter 开发者并创建一个账户。如果你愿意,你可以使用相同的登录凭证登录你的个人 Twitter 账户。
您将需要申请一个帐户,所以请确保按照步骤操作。设置帐户可能需要一些时间,因为您需要回答几个问题。大多数问题需要大量的输入,所以尽你所能回答它。
如果你被卡住了,这是一个关于如何申请的极好的视频。
申请开发者账号
2.创建 Twitter API 应用程序
开发人员帐户可能需要几个小时或几天才能获得批准。这取决于你对申请的回答有多好。有时他们可能会联系你以获取更多信息。
批准后,前往导航栏的右上角,选择应用程序。在这里,您将希望创建一个应用程序,它是生成 API 密钥的一部分。
如果你迷路了,这是一个很好的 API 密匙后续视频。
现在你已经设置好了,让我们从 R Studio 开始吧!
创建应用程序后,您应该会在仪表板上看到您的第一个应用程序。
3.安装/加载 twitteR 包
twitteR 是一个 R 包,提供对 Twitter API 的访问。支持 API 的大部分功能,偏向于在数据分析中比日常交互更有用的 API 调用。
install.packages("twitteR") #install package
library(twitteR) #load package
4.将 API 链接到 R Studio
对于这一步,您需要访问您的 Twitter 开发者帐户,并导航到您创建的应用程序。如果您还没有这样做,请生成新的 API 密钥和访问令牌。
Twitter 应用程序密钥(为了隐私,我的密钥被隐藏了)
consumer_key <- 'XXXXXXXXXXXXXX'
consumer_secret <- 'XXXXXXXXXXXXXX'
access_token <- 'XXXXXXXXXXXXXX'
access_secret <- 'XXXXXXXXXXXXXX'
使用 R,复制上面的代码并将你的键粘贴到它们各自的变量中。(包括引号)
5.设置身份验证
使用函数 setup_twitter_oauth() 将您的键链接到 twitter 的 API。
setup_twitter_oauth(consumer_key, consumer_secret, access_token, access_secret)
运行上面的代码后,您会得到一个提示。您可以选择是否使用本地文件来缓存访问,但我通常不这样做。如果不想使用本地文件,请输入数字 2 并按 enter 键。
6.拉推文
既然我们已经完成了设置 API 的所有步骤,现在我们可以拉推了。下面我们来分解一下功能。
virus <- searchTwitter('#China + #Coronavirus', n = 1000, since = '2020-01-01', retryOnRateLimit = 1e3)virus_df = twListToDF(virus)
第一行代码使用了 searchTwitter 函数。我们传递尽可能多的与我们的搜索相关的#标签,在这个例子中,是#中国和#冠状病毒。
目前是 2020 年 2 月 4 日,此时, 冠状病毒 已经引起世界恐慌,因为它蔓延到中国以外的更多国家。
- n 参数是我们想要获取的推文数量。
- 因为— 是您想要推文的时间段
- retryOnRateLimit —指示当速率受限时是否等待并重试。仅当期望回报(n)超过可用请求的剩余限制时,此参数才有意义
最后一行代码使用了 twListToDF 函数,该函数将推文保存到数据帧中。
所有推文的数据框架
查看所有的推文,我们可以看到,有一个独特的列可以帮助识别他们的推文活动。
7.后续步骤
现在你已经把你的推文保存在一个数据框中,最好开始分析和发现任何模式或趋势。一个很好的开始方式是将推文标记化,并从文字中提取见解。如果你有兴趣了解更多,请查看我的符号化教程。
通过引导获取您的数据
什么是自举,我们为什么要使用它?
沙哈达特·拉赫曼在 Unsplash 上拍摄的照片
如果你使用任何大型数据集,你可能听说过 bootstrapping。如果你是一名新兴的统计学家或生物信息学家,这是你计算工具集的一部分。使用这个功能有什么意义?更重要的是,自举到底是什么?
布拉德利·埃夫隆在 1979 年首次发表了自举的观点。随着计算能力变得越来越便宜和可用,这种计算机密集型技术变得越来越流行和有用。事实上,研究人员已经引用了 bootstrapping 方法超过 2 万次。
当处理大型数据集时,我们的目标是对从中提取数据的总体进行推断。虽然我们可以计算平均值或中位数,但我们不知道这种估计的确定性。如果我们增加样本量,我们可以减少误差,接近总体参数。然而,如果我们正在进行 RNA 测序或收集大量数据,增加样本量是昂贵的,甚至是不可能的。Bootstrapping 是一种重采样方法,可以帮助我们确定误差和置信区间。无论你是在看股票市场数据、系统进化树还是基因转录本丰度,来自后来的自举的结果都会告诉你结论。
定义引导
自举是一种使用替换进行重采样的方法。我们将通过一个例子来解释这是如何工作的,以及这种方法的假设。
假设我们有一个数据集,显示篮球运动员在生日时露面的费用。但是,你很难联系到 8 个以上的玩家,所以你的数据集,本例中的 *D,*包含 8 个值。因为我们与各种不同的篮球运动员交谈,从冷板凳队员,以确保你的样本足够类似于整个群体的球员。
这就是我们的统计假设:我们的数据样本接近总体分布。
*D* = {100, 200, 200, 300, 500, 1000, 1000, 750}
这里我们样本的平均值是 506.25。如果我们对这个样本进行几次引导,我们将对这个数据集中的方差有一个更好的了解。引导包括替换重采样。我们重新采样的引导程序每个将有 8 个值,但是由于它们是用替换重新采样的,相同的值(即 100)可能会出现多次。这样,引导每次运行时都会生成不同的估计值。然而,有了足够的引导,我们可以生成数据中方差的近似值。请注意以下事项:
- 我们不会向数据集添加任何新点。
- 每个重新采样的 bootstrap 都包含与原始样本相同数量的值。
- 由于我们使用替换进行重采样,因此在整个引导过程中,对任何值进行重采样的概率都是相同的。每个值都被绘制为独立的事件。如果我们重新采样的第一个值是 200,这不会改变该引导中第二个值也是 200 的概率。
*D₁* = {100, 1000, 500, 300, 200, 200, 200, 100}
*D₂* = {300, 1000, 1000, 300, 500, 100, 200, 750}
*D₃* = {750, 300, 200, 200, 100, 300, 750, 1000}
D₁、D₂、D₃的平均值为 325,518.75,450。然后,我们可以使用这些值来生成标准误差、置信区间和其他感兴趣的度量。使用 Python、R 或其他语言,很容易生成 50、100 甚至 1000 个自举样本。了解样本的偏差、方差和分布有助于我们对样本总体做出更好的推断。它有助于你将样本的稳健性融入到其余的推理中。
为了这个例子,我们使用了一个小的数据集。一般来说,自举不适用于小数据集、有许多离群值的数据集或涉及相关数据度量的数据集。
如果你在可视化这个方法上仍然有困难,我已经在下面展示了在一个软糖数据集上的引导过程。
由西蒙·斯皮切克创作
使用 Bootstrap 进行生物信息学研究
例子 1:系统进化树
Bootstrapping 帮助我们确定系统发育树中特定分支的置信度。我们可能正在寻找蛋白质的氨基酸序列或基因的核苷酸序列。我们的原始样本可以快速重采样 1000 次,重建 1000 棵自举树。如果你的原始树显示一个特定的蛋白质或基因序列分支,你可以检查你的引导树,看看这个分支出现的频率。如果它出现超过 950 次,您可以相当确定您的数据是健壮的。如果它只出现 400 次左右,那么它可能是由异常值引起的。
实施例 2:估计基因转录丰度
Sleuth 软件使用 bootstrap 方法估计基因转录丰度。通过重新采样我们的下一代测序读数,我们可以计算出一个更可靠的转录丰度估计值。重新采样让我们了解了数据中的技术可变性。当估计特定基因或转录物在数据集中是否增加时,技术变异与生物变异一起使用。
自举的其他用途包括为集成机器学习进行聚合。基本上,我们的数据集被多次重采样。每个自举样本然后通过我们的分类器或机器学习模型运行。我们可以一起使用所有的输出来生成更准确的分类器。这可以防止我们根据有限的样本过度拟合数据。
参考文献
- 自助方法:对折刀法的另一种看法。安。统计学家。第 7 卷(1979 年),第 1 号,第 1 至 26 页。doi:10.1214/aos/1176344552。https://projecteuclid.org/euclid.aos/1176344552
- 埃夫隆,布拉德利,伊丽莎白哈洛兰和苏珊·霍尔曼。"种系发生树的引导置信水平."美国国家科学院学报93.23(1996):13429–13429。
- https://hbctraining . github . io/DGE _ workshop _ salmon/lessons/09 _ sleuth . html
常用 Viz 的用途—数据科学和分析
在数据分析领域工作了 3 年多,我可以说数据可视化在提供有见地的建议方面发挥了巨大的作用。
无论是参加面试还是招聘分析师,我总是希望在准备面试时能有快速笔记。我走上前,提出了一些我多年来工作过的地块的集体信息。
以下是数据分析和数据科学领域中一些最广泛使用的图。这些只是对它们何时被广泛使用的快速注释。
散点图:
- 双变量分析
- 两个变量之间的趋势和模式
- 理解两个变量之间的关系
结对剧情:
- 多个散点图显示两个以上变量之间的关系
- 稍微调整一下,可以帮助我们了解变量之间的回归程度
热图:
- 基于该措施的彩色视觉效果
- 配对图—了解正相关和负相关
- 混淆矩阵,用于根据 TP、TN 指标确定模型执行的好坏
条形图:
- 双变量和多变量分析
- 比较分类变量的数字、频率
- 例如:活动前与活动后的表现
计数图:
- 从组中找到最常用的类别
- 单变量分析(年龄或性别频率)
堆积条形图:
- 对整体的各个部分进行分类和比较
- 例子:在男性和女性群体中,有多少人幸存?
折线图:
- 分析一段时间或特定变量的趋势和模式
- 例如:时间序列分析图
方框图:
- 数据准备的许多重要步骤之一
- 找出数据中的异常值
- 为我们提供四分位数范围(IQR)
直方图:
- 允许我们分析数据分布
- 找出偏斜度——正偏斜度还是负偏斜度
仪表图:
- 主要用作目的/目标指标
- 提供关于目标是否实现或指标绩效如何的见解
饼图:
- 变量占总数的比例
- 饼图的视觉变体是圆环图
左图是“甜甜圈图”,右图是“饼图”
漏斗图:
- 了解一段时间内的数据流
- 最广泛用于分析活动和网站绩效
带指标的表格图:
- 简单显示带有 KPI(关键绩效指标)指标的数据
- 帮助我们显示绩效比率(例如,下图表示每周运动-开盘价)
树状图:
- 数据的层次结构,由具有父子层次结构的嵌套矩形组成
- 根据颜色和大小提供深刻的分析
奖励:
热图和树状图的区别:
在热图中,一个度量可以分配给颜色,另一个度量可以分配给大小。布局类似于值被编码为颜色的表格
在树形图中,使用 1 个或多个维度&最多 2 个度量来创建。节点越大,值就越大。这些嵌套矩形的大小从图表的左上角到右下角,最大的位于左上角,最小的位于右下角。
将显卡视觉效果提升到 Power BI 的新水平
为传统的 Power BI 视觉效果注入新的活力,并了解如何通过简单的变通方法实现扩展/折叠功能
照片由 Nati Torjman 在 Pexels 上拍摄
我喜欢 Power BI,因为它提供了一整套可视化和开箱即用的解决方案来将几乎每一个业务请求转换成一个闪亮的报告。不要误解我的意思,Power BI 不仅仅是一个数据可视化工具,它可以作为一个全面的 ETL 解决方案在许多场景中使用。
然而,当涉及到特定的用户请求时,Power BI 当然有一些限制。在这些情况下,为了实现期望的功能,一些变通方法和调整是必要的。
展开/折叠功能
其中之一是扩展/折叠矩阵之外的视觉功能。即使在 Matrix visual 中,在 2019 年 11 月更新之前,也无法使用“+”符号进行扩展。
对于来自 SSRS 世界的我们来说,这是如此的奇怪和出乎意料。好了,矩阵已经包括在内了,但是如果我们想把同样的功能应用到其他视觉效果上,比如卡片视觉效果。
请继续关注,我将向您展示一个解决方法,这样您就可以实现这个目标。像往常一样,我将使用 Contoso 示例数据库进行演示。
方案
假设我有一个报表页面,在中间显示一个堆积柱形图,在右上角显示两个卡片图像,显示销售数量和销售金额:
现在,假设我想让我的用户有可能更深入地了解这些数字的细节。使用工具提示页面,我在这篇文章中描述过,是一个简单快捷的解决方案。但是,工具提示是静态的,它们只显示底层数据,没有提供与之交互的机会。
因此,我决定用书签来模拟展开/折叠功能。书签是 Power BI 中非常有用的技术,我经常使用它们。
简而言之,书签捕获报告页面的当前状态(所有 可见 视觉效果都在上面),您可以通过将 Action 属性设置为 bookmark,使用按钮/图像在不同的书签之间导航。
关于书签的更广泛的解释超出了本文的范围,所以请记住,书签是一种非常有用的技术,可以定制您的报告并改善整体用户体验。
步骤 1 —插入图像并创建书签
我们需要做的第一件事是给我们的用户一个提示,告诉他们可以用卡片视觉效果做什么。我已经为“+”和“-”符号导入了两个透明图标,我相信这足够直观了。
将两个图标一个放在另一个上面,如下图所示:
对销售数量卡片视觉效果做同样的操作,我们也将在卡片中间放另一对。该图标将使用户能够同时展开/折叠两张卡片,而小图标将处理特定的卡片。
现在,真正的魔法需要被创造出来。在“视图”选项卡下,启用书签和选择窗格。我们将需要为每一个单独的场景两个书签:展开/折叠销售数量卡只;仅展开/折叠销售金额卡片;展开/折叠两张卡片。
这是我创建的书签窗格的屏幕截图:
步骤 2-设置书签内的可见性
现在,我们需要定义每个书签的外观。这意味着,当我打开报告页面时,只有“+”图标应该是可见的(这意味着我需要隐藏“-”图标)。
之后,您需要根据用户的选择设置所有视觉效果的显示/隐藏属性。说明每一个步骤需要花费大量的时间和图片,但是让我们只显示销售数量(销售金额的逻辑保持不变)。
打开“操作”字段,选择“类型”下的“书签”,然后选择“扩展书签数量”。这样,我们“告诉”这个图标将我们导航到一个专门创建的书签,该书签显示了我们需要显示的报告页面的捕获状态。
一旦您按住 CTRL 键并单击“+”号,您将看到报告页面发生了变化:
您首先会注意到的是一个新的折线图,它显示了每月的销售数量。此外,符号“+”消失了,取而代之的是“-”图标,提示用户一旦决定折叠这个扩展视图,就可以点击它。
第三步——摆弄书签
现在,如果用户点击销售金额“+”图标,会发生以下情况:
视觉已经改变,以显示每月的销售额数字!此外,同步“+”和“-”图标以跟随用户选择。
最后,如果用户想要通过一次点击来扩展两个卡片的视觉效果,他可以通过点击卡片之间的大“+”号来实现:
很酷吧,哈?
最后,这是最终的解决方案:
结论
正如我之前提到的,你可以通过工具提示页面给用户更多的洞察力,这也是一个合理的解决方案,但是它们是静态的。通过对书签的巧妙使用,你可以设置不同类型的额外视觉效果来满足用户的要求。此外,这些图像可以像常规图像一样用于交叉过滤或向下钻取,这是这种技术的最大优势。
成为会员,阅读 Medium 上的每一个故事!
订阅这里获取更多有见地的数据文章!
用 Pytorch 中的数值变量转换提高机器学习模型的精度
这个故事提供了在 Pytorch 中实现转换技术和提高代码准确性的完整指南
概观📙
任何机器学习的实践者都陷入了提高模型预测性能的困境。他们主要着眼于使用更强大的 SOTA 模型和更长的训练时间进行权衡。然而,在机器学习中,时间是宝贵的,模型的性能可以通过简单的一步,即**数据再处理,以更快的速度达到更好的结果。**这一步往往被遗忘或低估。
数据预处理的一些例子包括用插补技术【1】填充缺失值**,用编码**【2】转换或编码分类变量,通过标准化或规格化【3】转换为数值变量。因此,本文旨在为转换数值变量提供强大的方法论,以帮助机器学习模型捕捉数据中有意义的信息。
转化技术📄
的确,当变量的分布是正态分布时,许多机器学习算法(如线性回归和逻辑回归)会表现得更好,换句话说,对于非标准概率分布的变量,性能会下降。
钟形的正态分布是一个连续随机变量的概率函数,它出现在现实生活中的各种场合:人的身高、血压或考试成绩。其他非线性算法可能没有这一事实,但当数值变量具有高斯分布时,通常表现更好。
本文中介绍的各种有用的技术可以用来将变量转换成高斯分布,或者更可能是高斯分布。这些方法是分位数变换、幂变换和离散化变换。
- 分位数变换【4】是一种非线性变换,它用同一等级或分位数的所有其他特征值的平均值替换某个特征值。这听起来很奇怪,但实际上非常简单。如下图所示,首先,数据按值排序。然后计算排序数据集所有列的平均值,并用平均值替换原始值。最后,将数据集返回到原始顺序,但保留规范化的值。
分位数标准化示意图(图片由作者提供)
- 幂变换【5】属于参数单调变换家族,用于稳定方差和最小化与异方差(非恒定方差)相关的偏度问题,或其他需要正态性的情况。另一方面,当回归线周围的方差对于预测变量的所有值都不相同时,就会出现异方差。这种自动功率变换有两种流行的方法: Box-Cox 变换和 Yeo-Johnson 变换。λ是一个超参数,用于控制幂变换的性质,也是将变量变换为高斯概率分布的最佳方法。以下是 lambda 的一些常见值:
Lambda(图片由作者提供)
- ****离散化转换【6】过程将定量
数据转换为定性数据,也就是说,从数值属性
转换为具有有限数量
间隔的离散或名义属性,从而获得连续域的非重叠划分。对于用户和专家来说,离散的特性更容易理解、使用和解释。在实践中,离散化可以被视为一种数据简化方法,因为它将数据从大量的
数值映射到一个大大减少的离散值子集,从而使学习更加准确和快速。离散化技术包括许多方法,如宁滨、直方图、聚类、决策树、相关性等…注意:在线性不可分数据集上,特征离散化提高了线性分类器模型的性能。然而,在线性可分的数据集上,特征离散化会降低线性分类器模型的性能(更多信息可以查看此处
波士顿住房数据集实验
在本教程中,我将使用波士顿住房数据集,其中包含波士顿各种房屋的信息。有 506 个样本和 13 个特征变量。目标是使用给定的特征来预测房子的价格。首先是导入和加载数据
**import pandas as pd DATASET_URL = "https://raw.githubusercontent.com/selva86/datasets/master/BostonHousing.csv"# read data
DATA_FILENAME = "Boston_Housing.csv"
TARGET_COLUMN = 'medv'
dataframe = pd.read_csv(DATASET_URL)
dataframe.head()**
数据集信息
检查输入要素的分布
**dataframe.drop('medv', axis=1).hist();**
输入要素的分布呈偏态和非正态分布
基线模型
接下来,我将创建一个简单的线性模型来预测房价。
然后,我将输入和输出数据加载到 PyTorch 数据集并训练模型。
训练 10 个周期后,结果显示如下。
分位数变换
接下来,我将使用分位数转换来使数字变量更加高斯化。我可以使用 sklearn 中的 QuantileTransformer 类应用分位数转换,并将“ output_distribution ”参数设置为“ normal ”。我还必须将“ n_quantiles ”参数设置为小于训练数据集中观察值的值,在本例中为 100。
**from sklearn.preprocessing import QuantileTransformer transformer = QuantileTransformer(n_quantiles=100, output_distribution='normal')
inputs = transformer.fit_transform(inputs_raw)**
通过分位数转换将输入变量转换为正态概率分布后,输入分布如下图所示。
通过分位数变换变换后输入特征的分布
然后,我用上面同样的线性模型来预测波士顿的房价。
**注意:在用**变换技术变换输入数据后,我可以设置更高的学习率(在这种情况下学习率= 1e-2)以加速收敛到全局最小值。对于原始数据,如果学习率设置得太高,我们将面临不收敛误差。
训练 10 个周期后,结果显示如下。
电力转换
在这个演示中,我使用了功率变换的 Box-Cox 变换技术。
注意: Box-Cox 变换假设它所应用的输入变量值严格为正**。这意味着不能使用 0 和负值(在这种情况下,我可以使用 Yeo-Johnson 变换)。在输入数据集中,我有负数据,因此,我必须在馈入 Box-Cox 变换之前使用 MixMaxScaler 变换 。**
from sklearn.preprocessing import PowerTransformer, MinMaxScaler transformer = PowerTransformer(method='box-cox')
pipeline = Pipeline(steps=[('s', scaler),('t', transformer)])
scaler = MinMaxScaler(feature_range=(1, 2))
inputs = pipeline.fit_transform(inputs_raw)
现在,输入分布如下图所示。
通过功率变换变换后的输入特性分布
同样,我将使用上面 10 个时期的相同线性模型
离散化变换
最后但同样重要的是,我将应用强大的转换技术,离散化转换。统一的离散化变换将保持每个输入变量的概率分布,但会使其离散于指定数量的有序组或标签。我可以使用 KBinsDiscretizer 类应用统一离散化转换,并将“策略”参数设置为“统一”我还将通过“ n_bins ”参数设置的箱数设置为 10。
from sklearn.preprocessing import KBinsDiscretizer transformer = KBinsDiscretizer(n_bins=10, encode='ordinal', strategy='uniform')
inputs = transformer.fit_transform(inputs_raw)
输入数据的分布会像这样变化
通过离散化变换变换后的输入特征分布
最后,我用 10 个时期运行上面相同的线性模型
最终想法📋
本文想展示一些将数字输入数据转换成类高斯分布的技巧。但是,如果输入数据已经近似于正态分布,这种技术将不会提高模型的性能。这个实验只使用默认的 hyper 参数,你可以自由地改变并应用到你的数据中以获得最优的结果。要进一步阅读,你可以参考下面的参考部分。最后,我想总结一下本文中所有实验的结果。
和平!
作者图片
参考
[1] Stef vanBuuren,缺失数据的弹性插补,第二版,CRC 出版社,2018。
[2]Suresh Kumar Mukhiya Usman Ahmed,使用 Python 进行探索性数据分析:执行 EDA 技术以理解、总结和调查您的数据,Packt Publishing Ltd,2020 年。
[3]彭春燕,利用 SAS 进行数据分析,第七章|数据转换,2009。
[4] Amaratunga,d .,Cabrera,j .对来自病毒 DNA 微芯片的数据的分析。美国统计学家协会,2001 年,第 96 期。
[5] S. Gluzman,V.I. Yukalov,外推问题中的自相似幂变换,统计力学,2006。
[6]刘欢、法尔哈德·侯赛因、丘里姆·谭和马诺兰詹·达什,《离散化:一种使能技术》,2002 年。
[7]萨尔瓦多·加西亚;朱利安·卢恩戈;何塞·安东尼奥·塞斯;维多利亚·洛佩斯;弗朗西斯科·埃雷拉,离散化技术调查:监督学习中的分类和实证分析,2013 年。
用熊猫挑战极限
熊猫的能力超乎你的想象。
Pandas 是一个非常强大和通用的 Python 数据分析库,可以加速项目的预处理步骤。Pandas 不仅用于预处理,还用于探索数据。你可以也应该挑战极限,看看熊猫有什么能力。在这篇文章中,我将重点讲述如何过滤数据帧,但更重要的是,我将努力传达这样的信息:
你在数据分析中使用熊猫越多,它就越有用。
Photo by 贝莉儿 DANIST on Unsplash
一如既往,我们从进口熊猫开始:
import pandas as pd
import numpy as np
我将使用 Kaggle 上的电信客户流失数据集的一部分。
df.head()
熊猫的好处是有多种方法来完成一项任务。Pandas 核心数据结构 DataFrame 由带标签的行和列组成。Pandas 在行和列上可以做什么方面非常灵活,这使得它非常容易处理存储在 DataFrame: data 中的内容。
尝试挑战极限,你会惊讶于熊猫的能力。
在这一节中,我将写下您在处理数据时可能会遇到的一些问题。然后用熊猫展示一个寻找答案的方法。请记住,几乎总是有其他方法来做同样的事情。所以请随意用不同的方式寻找答案。我认为这将是一个很好的练习。
注意:我还将把代码放在文本中,以防你想容易地修改或尝试不同的东西。
- 成为客户不到 10 个月的客户的互联网服务类型分布是什么?
df[df.tenure < 10]['InternetService'].value_counts()
任期变量显示客户持有合同的时间,以月为单位。
- 使用电子支票付款的客户每月平均费用是多少?
df[df.PaymentMethod == 'Electronic check']['MonthlyCharges'].mean()
- 有多少客户使用电子支票或邮寄支票付款,这些客户的平均月费用是多少?
method = ['Electronic check', 'Mailed check']
df[df.PaymentMethod.isin(method)].groupby('PaymentMethod').agg(['count','mean'])['MonthlyCharges']
- 入住不到三个月,使用 DSL 上网服务的客户流失率是多少?
注意:我们需要首先将 Churn 列中的值转换成数字值,以便能够计算聚合。“是”将转换为 1,“否”将转换为 0。然后我们可以应用聚合函数。
churn_numeric = {'Yes':1, 'No':0}
df.Churn.replace(churn_numeric, inplace=True)df[(df.tenure < 3) & (df.InternetService == 'DSL')].Churn.mean()
- 7 个月前 DSL 合同出现问题,持续了三个月。我想看看这个问题对流失率的影响。在此期间,未签订合同的客户流失率是多少?
df[(~df.tenure.isin([7,6,5])) & (df.InternetService == 'DSL')]['Churn'].mean()
注意:波浪号(~)运算符用作 NOT。
- 我想根据客户成为客户的时间长短将他们分为 3 类,并找出每一组的平均流失率。
df['tenure_cat']= pd.qcut(df.tenure, 3, labels=['short','medium','long'])df[['tenure_cat','Churn']].groupby('tenure_cat').mean()
- 我想大致了解一下流失率是如何根据性别、合同类型和是否是高管而变化的。
df.pivot_table(index=['gender','SeniorCitizen'], columns='Contract', values='Churn', aggfunc='mean', margins=True)
- 在该任期月份内,根据客户数量,属于前三名任期值的客户的互联网服务分布情况如何?
df[df.tenure.isin(df.tenure.value_counts().index[:3])]['InternetService'].value_counts()ORdf[df.tenure.isin(df.tenure.value_counts().nlargest(3).index)]['InternetService'].value_counts()
这只是你能为熊猫做的一小部分。你用它做得越多,你就会发现越多有用和实用的方法。我建议用不同的方法处理问题,永远不要给自己设限。
熟能生巧。
当你努力寻找问题的解决方案时,你学到的东西几乎总是比手头问题的解决方案多。您将逐步提高自己的技能,以建立一个强大而高效的数据分析流程。
感谢阅读。如果您有任何反馈,请告诉我。
利用部分卷积推进深度图像修复的极限
基于部分卷积的不规则孔洞图像修复
图一。使用部分卷积的一些修复结果。图片来自刘桂林等人的论文 [1]
你好。今天我想讲一个好的深度图像修复纸,它打破了以往修复工作的一些局限。简而言之,以前的大多数论文都假设缺失区域是规则的(即一个中心缺失矩形孔或多个小矩形孔),本文提出了一个部分卷积(PConv) 层来处理不规则孔。图 1 显示了使用建议的 PConv 的一些修复结果。他们好吗?大家一起来把握 PConv 的主旨吧!
动机
首先,先前的深度图像修复方法将丢失像素和有效像素视为相同的,在这种意义上,它们将固定像素值(归一化之前/之后为 255 或 1)填充到图像中的所有丢失像素,并将标准卷积应用到输入图像以完成修复任务。这里有两个问题。 i) 将缺失像素的像素值固定为预定义值是否合适? ii) 不管像素是否有效,是否适合对输入图像进行卷积?因此,仅对有效像素执行操作可能是一个好的选择。
图二。使用规则掩蔽图像和提出的部分 Conv 训练的先前深度修复方法的视觉比较。图片来自刘桂林等人的论文 [1]
其次,现有方法假设缺失区域是规则的/矩形的。其中一些采用本地鉴别器来区分生成内容和真实内容。对于固定大小的中心缺失孔的情况,他们将填充的中心孔输入到局部鉴别器以增强局部纹理细节。但是不规则的缺失区域呢?有没有可能在不使用鉴别器的情况下获得精细的局部细节?如果您尝试使用现有的方法来处理不规则的蒙版图像,您会发现修复结果并不令人满意,如图 2 所示。对于实用的修复方法,它们应该能够处理不规则的掩蔽图像。
介绍
与我以前的帖子类似,我假设读者对深度图像修复有基本的了解,如网络架构、损失函数(即 L1 和对抗性损失),以及相关术语(即有效像素、缺失像素等)。).如果你需要或者想要,请快速回忆一下我以前的帖子。在这一节中,我将简要介绍我认为不太重要的内容,因此我们可以有更多的时间来深入本文最重要的思想,部分卷积。
本文的作者采用了一个具有跳跃连接的类似于 U-Net 的网络,其中所有标准卷积层都被提议的部分卷积层所取代。如果你对他们的网络架构感兴趣,你可以参考的论文,他们提供了他们模型的详细表格。
有趣的是,在这项工作中没有使用鉴别器。除了标准的 L1 损失和全变差损失(TV 损失)之外,作者采用了两种高级特征损失来完成具有精细纹理的掩蔽图像。后面我会详细介绍这两个损耗。
解决方案(聚焦)
正如在 Motivation 中提到的,关键思想是在卷积过程中从有效像素中分离出丢失的像素,使得卷积的结果只取决于有效像素。这就是所提出的卷积被命名为部分卷积的原因。基于可以自动更新的二进制掩码图像,对输入执行部分卷积。
方法
部分卷积层
让我们定义 W 和 b 为卷积滤波器的权重和偏差。 X 表示被卷积的像素值(或特征激活值), M 是相应的二进制掩码,表示每个像素/特征值的有效性(0 表示缺失像素,1 表示有效像素)。计算建议的部分卷积,
其中,⦿表示逐元素乘法,而 1 是一个与 M 形状相同的 1 的矩阵。从这个等式可以看出,部分卷积的结果只取决于有效的输入值(如 X ⦿ M )。sum(1)/sum(M)是一个比例因子,用于调整结果,因为每个卷积的有效输入值的数量是变化的。
在每个部分卷积层后更新二进制掩码。所提出的更新二进制掩码的规则非常简单。如果当前卷积的结果以至少一个有效输入值为条件,则相应的位置将被视为对下一个部分卷积层有效。
正如您在上面看到的,更新规则很容易理解。
图 3。提议的部分卷积的图解说明。作者图片
图 3 给出了一个简单的例子来说明所提出的部分卷积。我们考虑一个简单的 5×5 输入及其相应的 5×5 二进制掩模图像(1 代表有效像素,0 代表孔洞像素)和一个具有固定权重的 3×3 W 。假设我们希望保持与输入大小 5×5 相同的输出大小,因此我们在进行卷积之前执行零填充。我们先考虑左上角(橙色有界)。该卷积的 X 和 M 在图中清楚示出,有效输入值的数量为 3。因此,这个位置的输出是-9+ b 。此外,更新后的二进制掩码中相应位置的值为 1,因为有 3 个有效输入值。
考虑中间(紫色有界)的框,这一次,如您所见,对于这个卷积没有有效的输入值,所以结果是 0+ b 并且更新的掩码值也是 0。右下角(蓝色边框)是另一个卷积示例,用于显示比例因子的作用。通过缩放因子,网络可以区分由 3 个有效输入值计算的-3 和由 5 个有效输入值计算的-3。
为了方便读者,图 3 的右上角显示了部分卷积层之后的更新二进制掩码。可以看到更新后的二进制掩码中的零更少了。当我们执行越来越多的部分卷积时,二进制掩码将最终更新为全 1。这意味着我们可以控制信息在网络内部传递,而不管缺失区域的大小和形状。
损失函数
总的来说,在它们的最终损失函数中有 4 个损失项,即 L1 损失、感知损失、风格损失和电视损失。
L1 损失(每像素损失)
该损失是为了确保逐像素重建精度。
其中 I _ out 和 I _ gt 分别是网络和地面真实的输出。 M 是二进制掩码,0 代表孔洞,1 代表有效像素。NIgt是一幅图像中像素值的总数,等于C×H×W, C 是通道大小(RGB 图像为 3), H 和 W 是图像的高度和宽度 I 可以看到 L _ 孔和 L _ 有效分别是孔像素和有效像素的 L1 损失。
感知损失(VGG 损失)
感知损失是由 Gatys 等人[2]提出的,我们之前已经介绍过这种损失。简单地说,我们希望填充图像和地面真实图像具有由像 VGG-16 这样的预训练网络计算的相似特征表示。具体来说,我们将地面真实图像和填充图像馈送给预训练的 VGG-16 来提取特征。然后,我们计算所有层或几层的特征值之间的 L1 距离。
上式中, I _ comp 与 I _ out 相同,只是有效像素直接被地面真实像素代替。ψ^Ip是预训练的 VGG-16 在给定输入 I 的情况下计算出的第 p 层的特征图。nψ**I**_*p*是*ψ*I_p中元素的个数。根据 Gatys 等人[2],当完整的图像在语义上接近其基础真实图像时,这种感知是小的。也许,这是因为更深的层(更高的级别)提供了图像的更多语义信息,并且相似的高级特征表示表示完成的更好的语义正确性。供读者参考,VGG-16 池 1、池 2、池 3 层用于计算感知损失。
风格丧失
除了感知损失,作者还采用了如上所示的风格损失。你可以看到,风格损失也是使用预先训练的 VGG-16 给出的特征图来计算的。这一次,我们首先计算每个特征图的自相关性,它在[2]中被称为 Gram 矩阵。根据[2], Gram 矩阵包含图像的风格信息,如纹理和颜色。这也是这种损失被命名为风格损失的原因。因此,我们计算完整图像和地面真实图像的格拉姆矩阵之间的 L1 距离。注意ψ^Ip的大小为(hp×wp×cp,其克矩阵的形状为c_p×*c K _ p 是一个归一化因子,它取决于第 p 层特征图的空间大小。*
总变异损失
最终损失函数中的最后一项损失是电视损失。在我之前的帖子中,我们已经讨论过这种损失。简单来说,采用这个损失是为了保证完成图像的平滑度。这也是很多图像处理任务中常见的损失。
其中NIcomp是 I _ comp 中像素值的总数。
最终损失
这是训练建议模型的最终损失函数。用于控制每个损失项的重要性的超参数是基于对 100 幅验证图像的实验来设置的。
消融研究
图 4。使用不同损失项的修复结果。(a)输入图像(b)没有风格损失的结果©使用完全损失的结果(d)背景事实(e)使用小风格损失权重的输入图像(f)结果(g)使用完全损失的结果(h)背景事实(I)没有感知损失的输入图像(j)结果(k)使用完全损失的结果(l)背景事实。请放大以便看得更清楚。图片来自刘桂林等人的论文【1】
作者做了实验来显示不同损失项的影响。结果如上面的图 4 所示。首先,图 4(b)展示了不使用风格损失的修复结果。他们发现在他们的模型中使用风格损失是必要的,以生成精细的局部纹理。然而,风格损失的超参数必须仔细选择。正如您在图 4(f)中看到的,与使用完全损失的结果(图 4(g))相比,样式损失的小权重会导致一些明显的伪像。除了风格上的失落,感性上的失落也很重要。他们还发现知觉损失的雇佣可以减少网格状的人工制品。请参见图 4(j)和(k)了解使用感知损失的效果。
事实上,的高级功能损失的使用还没有被充分研究过。我们不能 100%说感知损失或风格损失一定对图像修复有用。因此,我们必须自己做实验来检查不同损失项对于我们期望的应用的有效性。
实验
图 5。掩模图像的一些例子。1、3、5 具有边界约束,而 2、4、6 没有边界约束。图片来自刘桂林等人的论文
在他们的实验中,所有的掩模、训练和测试图像的尺寸都是 512×512。作者将测试图像分为两组, i) 边缘附近有孔的掩模。 ii) 靠近边框无孔口罩。具有距离边界至少 50 个像素的所有孔洞的图像被分类到第二组。图 5 显示了这两组掩码的一些示例。此外,作者根据孔与图像的面积比生成了 6 种类型的掩模:(0.01,0.1),(0.1,0.2),(0.2,0.3),(0.3,0.4),(0.4,0.5),和(0.5,0.6)。这意味着最大的蒙版将遮蔽 60%的原始图像内容。
**训练数据。**与之前的工作类似,作者在 3 个公开可用的数据集上评估了他们的模型,即 ImageNet、Places2 和 CelebA-HQ 数据集。
图 6。ImageNet 上不同方法的视觉比较。(a)输入图像(b) PatchMatch © GLCIC (d)上下文注意(e) PConv (f)地面真实。图片来自刘桂林等人的论文
图 7。不同方法在场所上的视觉比较 2。(a)输入图像(b) PatchMatch © GLCIC (d)上下文注意(e) PConv (f)地面真实。图片来自刘桂林等人的论文
图 6 和图 7 分别显示了 ImageNet 和 Places2 上不同方法的可视化比较。PatchMatch 是最先进的传统方法。 GLCIC 和上下文注意是我们之前介绍过的两种最先进的深度学习方法。如你所见,GLCIC ©和上下文注意(d)不能提供具有良好视觉质量的修复结果。这可能是因为这两种先前的深度学习方法是针对规则屏蔽图像而不是不规则屏蔽图像训练的。如果您感兴趣,请放大以更好地查看修复结果。
图 8。CelebA-HQ 上不同方法的视觉比较。(a)输入图像(b)上下文注意© PConv (d)背景事实。图片来自刘桂林等人的论文 [1]
图 8 显示了 CelebA-HQ 数据集上的修复结果。您可以放大以更好地查看结果。
表 1。各种方法的定量比较。6 列代表 6 种不同的掩模比率。n 表示没有边界(即孔可以靠近边界),B 表示有边界(即没有孔靠近边界)。刘桂林等人的数据来自他们的论文
表 1 列出了几个客观的评估指标,供读者参考。显然,所提出的 PConv 在几乎所有情况下都提供了最佳数字。注意,IScore 是用作视觉质量估计的初始分数,并且越低,估计的视觉质量越好。
除了定性和定量的比较,作者还进行了人类主观研究,以评估不同方法的视觉质量。感兴趣的读者可以参考论文进行研究。
限制
图 9。当缺失孔洞越来越大时,通过 PConv 进行修复。图片来自刘桂林等人的论文 [1]
图 10。一些失败的案例,尤其是当场景非常复杂的时候。图片来自刘桂林等人的论文【1】
在文章的最后,作者还指出了现有深度图像修复方法的一些局限性。首先,很难完成如图 9 右侧所示的大面积缺失的图像。第二,当图像包含复杂的结构时,也很难完成如图 10 所示的具有良好视觉质量的图像。目前还没有一种综合的方法来处理超大尺寸的复杂图像。因此,你可以尝试提出一个好的解决方案来解决这个极端的图像修复问题。😃
结论
显然,部分卷积是本文的主要思想。希望我这个简单的例子能给大家解释清楚,部分卷积是怎么进行的,每一个部分卷积层之后,一个二值掩码是怎么更新的。通过使用部分卷积,卷积的结果将仅取决于有效像素,因此我们可以控制网络内部的信息传递,这对于图像修补任务可能是有用的(至少作者提供了部分卷积在他们的情况下是有用的证据)。除了图像修复,作者还试图将部分卷积扩展到超分辨率任务,因为它与图像修复有相似性。强烈推荐感兴趣的读者参考他们的论文。
外卖食品
毫无疑问,我希望你能明白什么是部分卷积。从本文开始,后来的深度图像修复方法可以处理规则和不规则掩模。再加上我之前跟图像修复相关的帖子,也希望你能对图像修复这个领域有更好的了解。你应该知道一些常见的技术和图像修复的挑战。例如,膨胀卷积、上下文注意层等。当图像中的孔太大并且图像具有复杂的结构时,填充图像也是困难的。
下一步是什么?
下一次,我们将看另一篇论文,它利用额外的信息来帮助填充蒙版图像。希望你喜欢!让我们一起学习吧!😃
参考
[1]刘桂林、菲特瑟姆·a·瑞达、凯文·j·施、廷-王春、安德鲁·陶和布赖恩·卡坦扎罗,《利用部分卷积对不规则孔洞进行图像修复》、 Proc .2018 年欧洲计算机视觉会议 ( ECCV )。
[2] Leon A. Gatys,Alexander S. Ecker,and Matthias Bethge,《艺术风格的一种神经算法》, arXiv 预印本 arXiv:1508.06576 ,2015。
感谢您阅读我的帖子!如果您有任何问题,请随时给我发电子邮件或在这里留言。欢迎任何建议。再次非常感谢,希望下次再见!😃
把你的数据分析放在一个 R 包里——即使你不发表它
如何利用 R 的软件包开发环境来组织、记录和测试您的工作
一个数据分析项目由许多不同的文件组成:原始数据、脚本、降价报告和闪亮的应用程序。我们需要一个合理的项目文件夹结构来保持有序。为什么不利用 R 已经建立的包开发工作流程呢?
在 R 包中进行分析有四个好处:
- r 包提供了一个标准化的文件夹结构来组织你的文件
- r 包提供功能给文档的数据和功能
- r 包提供了一个框架来测试你的代码
- 将精力放在第 1-3 点可以让你重用和共享你的代码
在本文中,我们将一步一步地在一个 R 包中完成一个数据分析例子。我们将看到这些好处几乎不需要任何开销。
对于数据分析示例,我们将:
- 下载和保存数据文件
- 编写一个脚本和一个 R 函数来处理数据
- 创建一个最小的探索性数据分析报告
- 用 Shiny 开发一个最小交互 R flexdashboard
最终结果可以在 GitHub 上找到。
要求
我假设你用 RStudio。建议有 R 包开发经验,但不是必需的。我们需要以下 R 包:
- r 包开发: devtools,usethis,roxygen2
- r 代码测试: assertive,testthat
- 数据分析:gg plot 2,dplyr
- R Markdown 和闪亮:针织机、rmarkdown、flexdashboard、闪亮
1.创建 R 包
在 RStudio 中,导航到计算机上要创建包的文件夹。以下命令将打开一个新的 RStudio 会话,并创建一个名为“WineReviews”的准系统包。
*devtools::create("WineReviews")*
请注意附加选项卡构建是如何变得可用的。
R 包开发的附加工具
如果您在 RStudio 中配置了版本控制,导航至工具、版本控制、项目设置*,并从下拉菜单中选择您的版本控制软件。我们将选择 Git,它用一个初始化一个本地 Git 存储库。gitignore 文件。*
为此项目启用 Git
我们将使用 R 包 roxygen2 为我们的函数和数据自动生成文档。导航到工具、项目选项、构建工具*,勾选“用 Roxygen 生成文档”前的复选框。我们将使用以下配置:*
配置 Roxgen
在描述文件中,我们写入项目的基本信息:
*Package: WineReviews
Title: Your data analysis project belongs in an R package
Version: 0.1.0
Authors@R: person("Denis", "Gontcharov", role = c("aut", "cre"),
email = "[gontcharovd@gmail.com](mailto:gontcharovd@gmail.com)")
Description: Demonstrates how to leverage the R package workflow to organize a data science project.
License: CC0
Encoding: UTF-8
LazyData: true*
我们最初的包结构如下所示:
***.** ├── .gitignore
├── .Rbuildignore
├── .Rhistory
├── DESCRIPTION
├── NAMESPACE
├── **R**
└── WineReviews.Rproj*
让我们检查一下我们的包构建,看看是否一切正常。我们将定期这样做,以确保我们整个工作项目的完整性。
*devtools::check()*
我们的初始包结构通过了检查
2.使用数据
保存和访问原始数据
在本例中,我们使用了来自 Kaggle 上葡萄酒评论数据集的两个 csv 文件。我们创建了一个文件夹 inst/ ,其中包含一个子文件夹 extdata/ ,我们在其中保存了两个 csv 文件。(包构建时, inst/ 的子文件夹是安装的。)
***.** ├── .gitignore
├── .Rbuildignore
├── .Rhistory
├── DESCRIPTION
├── **inst**
│ └── **extdata**
│ ├── winemag-data-130k-v2.csv
│ └── winemag-data_first150k.csv
├── NAMESPACE
├── **R**
└── WineReviews.Rproj*
为了使这些文件可用,我们必须清理并重建这个包。这将在您的计算机上安装 R 包。
清理并重建以访问 inst/文件夹中的文件
为了在 inst/ 中检索文件的路径,我们使用system.file()
如下:
*system.file(
"extdata",
"winemag-data-130k-v2.csv",
package = "WineReviews"
)*
操纵数据
我们现在将把这些原始数据处理成有用的形式。葡萄酒评论分为两个 csv 文件。假设我们要把这两个文件合并成一个数据框,里面有四个变量:“国家”、“积分”、“价格”、“酒厂”。让我们称这个数据框架为“葡萄酒 _ 数据”。
下面的代码用脚本 wine_data 创建了 data_raw/ 文件夹。R
*usethis::use_data_raw(name = "wine_data")*
下面的代码创建了我们想要的数据框。我们把它加到 wine_data 里吧。R 脚本并运行它。
*## code to prepare `wine_data` dataset goes here# retrieve paths to datafiles
first.file <- system.file(
"extdata",
"winemag-data-130k-v2.csv",
package = "WineReviews"
)second.file <- system.file(
"extdata",
"winemag-data_first150k.csv",
package = "WineReviews"
)# read the two .csv files
data.part.one <- read.csv(
first.file,
stringsAsFactors = FALSE,
encoding = "UTF-8"
)data.part.two <- read.csv(
second.file,
stringsAsFactors = FALSE,
encoding = "UTF-8"
)# select 4 variables and merge the two files
wine.variables <- c("country", "points", "price", "winery")
data.part.one <- data.part.one[, wine.variables]
data.part.two <- data.part.two[, wine.variables]
wine_data <- rbind(data.part.one, data.part.two)# save the wine_data dataframe as an .rda file in WineReviews/data/
usethis::use_data(wine_data, overwrite = TRUE)*
最后一行创建了 data/ 文件夹,数据帧存储为 wine_data.rda 。在我们清理并再次重建之后,该数据可以像任何其他 R 数据一样加载到全局环境中:
**data(“wine_data”, package = "WineReviews")**
记录数据
记录您创建的数据是一个很好的做法。数据的所有文档应保存在一个单独的 R 脚本中,该脚本保存在 R/ 文件夹中。让我们用下面的内容创建这个脚本,并将其命名为 data。R :
**#' Wine reviews for 51 countries.
#'
#' A dataset containing wine reviews.
#'
#' [@format](http://twitter.com/format) A data frame with 280901 rows and 4 variables:
#' \describe{
#' \item{country}{The country that the wine is from.}
#' \item{points}{The number of points rated by WineEnthusiast
#' on a scale of 1–100.}
#' \item{price}{The cost for a bottle of the wine.}
#' \item{winery}{The winery that made the wine.}
#' }
#' [@source](http://twitter.com/source) \url{[https://www.kaggle.com/zynicide/wine-reviews](https://www.kaggle.com/zynicide/wine-reviews)}
"wine_data"**
为了基于这个脚本创建文档,我们运行:
**devtools::document()**
Roxygen 将上面的代码转换成一个 a wine_data。Rd 文件,并将其添加到 man/ 文件夹中。我们可以通过在 R 控制台中键入?winedata
在帮助窗格中查看该文档。
我们的包结构现在看起来像这样:
****.** ├── .gitignore
├── .Rbuildignore
├── .Rhistory
├── **data**
│ └── wine_data.rda
├── **data-raw**
│ └── wine_data.R
├── DESCRIPTION
├── **inst**
│ └── **extdata**
│ ├── winemag-data-130k-v2.csv
│ └── winemag-data_first150k.csv
├── **man**
│ └── wine_data.Rd
├── NAMESPACE
├── **R**
│ └── data.R
└── WineReviews.Rproj**
3.中间检查
通过运行以下命令来定期检查我们的包的完整性是一个很好的做法:
**devtools::check()**
我们得到一个警告和一张便条。
定期检查你的包裹,尽早发现问题
关于 R 版本依赖的警告是在调用usethis::use_data(wine_data, overwrite = TRUE)
之后引入的,并通过在描述文件中添加Depends: R (>= 2.10)
来解决。
将第 14 行添加到描述文件中
因为 inst/extdata 中的数据超过 1 MB,所以该注释警告我们关于包的大小。我们不想在 CRAN 上发布这个 R 包,所以我们可以忽略它。但是,我们将通过将 inst/extdata/ 文件夹添加到来解决这个问题。Rbuildignore** 。**
**^WineReviews\.Rproj$
^\.Rproj\.user$
^data-raw$
^inst/extdata$**
现在devtools::check()
显示一切正常:
第二次检查完美地通过了
4.插图中的数据分析
现在我们可以探索处理过的数据。我喜欢用 R 包插图写报告,因为它们有 R 用户熟悉的简洁布局。如果你不喜欢使用简介,你可以在一个标准的 R Markdown 文档中执行这些步骤,而不是简介,如第 7 章所示。
下面的函数用 wine_eda 创建了一个 vignettes/ 文件夹。我们将用于探索性数据分析的 Rmd 插图。
**usethis::use_vignette(name = “wine_eda”, title = “Wine Reviews EDA”)**
我们将使用流行的 dplyr R 包来操作数据。在描述文件中声明我们使用的每个 R 包很重要。别担心:如果你忘了这个devtools::check()
会丢一张纸条。用以下内容申报包裹:
**usethis::use_package(“dplyr”)**
让我们向小插图添加一些代码来加载数据并显示摘要:
**---
title: “Wine Reviews EDA”
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Wine Reviews EDA}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = “#>”
)
``````{r setup}
library(WineReviews)
``````{r}
# load the previously created wine_data data frame
data(wine_data)
``````{r}
summary(wine_data)
****
**winedata 缺少 22691 个价格值**
**葡萄酒价格缺少 22691 个值。让我们转换数据来填充这些缺失的值。r 是一种函数式编程语言:我们应该通过应用函数来转换我们的数据。**
> **要理解 R 语言中的计算,有两个口号很有帮助:存在的一切都是对象。发生的一切都是函数调用。”**
>
> **—约翰·钱伯斯**
**这是我们将分析放在 R 包中的决定将会得到回报的部分:包开发使得编写、记录和测试函数的过程变得非常顺利。**
# **5.使用函数**
**让我们用那个国家葡萄酒的平均价格来代替缺失的价格。从统计学的角度来说,这不一定是个好主意,但它将有助于证明这一点。**
## **编写和记录函数**
**替换将由一个名为“fill_na_mean”的函数来完成。我们创建一个新的 R 脚本**变量 _ 计算。R** 并将其保存在 **R/** 文件夹中。请注意,我们可以如何方便地将函数的文档写在其代码之上。(保留@export 标签,否则@examples 将不起作用。)**
#’ Replace missing values with the mean
#’
#’ @param numeric.vector A vector with at least one numeric value.
#’
#’ @return The input whose NAs are replaced by the input’s mean.
#’
#’ @export
#’
#’ @examples fill_na_mean(c(1, 2, 3, NA, 5, 3, NA, 6))
fill_na_mean <- function(numeric.vector) {
ifelse(
is.na(numeric.vector),
mean(numeric.vector, na.rm = TRUE),
numeric.vector
)
}
**为了创建文档,我们再次运行:**
devtools::document()
**与记录数据的情况一样,Roxygen 将把这个文档转换成一个文件 **fill_na_mean。Rd** 并将其保存在 **man/** 文件夹中。我们可以通过在 R 控制台中键入`?fill_na_mean`在帮助窗格中查看该文档。**
**如果您希望在关闭或重启 R 会话后恢复工作,运行以下命令来加载您的函数以及在**描述**文件中声明的包:**
devtools::load_all()
**接下来,我们将为新创建的函数编写两个测试:**
1. **每次调用函数时运行的**运行时测试**警告*用户*输入错误。**
2. **一个**开发时** **测试**,它根据命令运行以警告*开发者*在编写或修改函数时的错误。**
## **运行时测试**
**R 包*断言*提供运行时测试*的功能。***
usethis::use_package(“assertive”)
**我们的简单测试由一行代码组成,它检查输入是否是一个数字向量,如果不是,就抛出一个错误。注意,运行时测试不依赖于我们的包开发环境,因为它们是函数的一部分。**
fill_na_mean <- function(numeric.vector) {
assertive::assert_is_numeric(numeric.vector) # -> the run-time test
ifelse(
is.na(numeric.vector),
mean(numeric.vector, na.rm = TRUE),
numeric.vector
)
}
## **开发时测试**
**与运行时测试相反,使用*测试的开发时测试表明* R 包需要一个活动的包开发环境。让我们为函数编写一个单元测试,测试`fill_na_mean(c(2, 2, NA, 5, 3, NA))`是否返回向量`c(2, 2, 3, 5, 3, 3)`。**
**首先我们建立了*测试和*框架:**
usethis::use_testthat()
**以下命令创建脚本 **test-variable_calculations。R** 包含对 **variable_calculations 中定义的函数的单元测试。R** :**
usethis::use_test(“variable_calculations”)
**我们修改了**测试变量计算中的代码。R** 代表我们的测试:**
context(“Unit tests for fill_na_mean”)
test_that(“fill_na_mean fills the NA with 3”, {
actual <- fill_na_mean(c(2, 2, NA, 5, 3, NA))
expected <- c(2, 2, 3, 5, 3, 3)
expect_equal(actual, expected)
})
**下面的命令运行所有的测试并返回一个漂亮的报告:**
devtools::test()
****
**我们的单元测试成功通过**
# **6.(重新)组织你的代码**
**现在,我们可以填充我们的数据分析中缺少的值 **wine_eda。Rmd** 。但是如果我们想在其他报表或应用程序中做同样的事情呢?我们应该在每个文件中重复这个过程吗?**
**事实上,这个功能处理的是数据处理,而不是探索性分析。因此,它属于**葡萄酒数据。生成 **wine_data.rda** 的 R** 文件。将此代码放入 **winedata。R** 而不是 **wine_eda。Rmd** 有两个优点:**
1. **我们的代码变得模块化:用于数据处理的代码与我们的数据分析报告明显分离。**
2. **只有一个脚本生成所有其他文件使用的已处理数据。**
**填充缺失值后,六个观察值仍然没有葡萄酒价格,因此我们选择删除它们。这是最终脚本的样子:**
**## code to prepare wine_data
dataset goes here
retrieve paths to datafiles
first.file <- system.file(
“extdata”,
“winemag-data-130k-v2.csv”,
package = “WineReviews”
)
second.file <- system.file(
“extdata”,
“winemag-data_first150k.csv”,
package = “WineReviews”
)
read the two .csv files
data.part.one <- read.csv(
first.file,
stringsAsFactors = FALSE,
encoding = “UTF-8”
)
data.part.two <- read.csv(
second.file,
stringsAsFactors = FALSE,
encoding = “UTF-8”
)
select 4 variables and merge the two files
wine.variables <- c(“country”, “points”, “price”, “winery”)
data.part.one <- data.part.one[, wine.variables]
data.part.two <- data.part.two[, wine.variables]
wine_data <- rbind(data.part.one, data.part.two)# fill missing prices with the mean price per country
wine_data <- wine_data %>%
dplyr::group_by(country) %>%
dplyr::mutate(price = fill_na_mean(price))# some countries don’t have any non-missing price
we omit these observations from the data
wine_data <- wine_data %>%
dplyr::filter(!is.na(price))# save the wine_data dataframe as an .rda file in WineReviews/data/
usethis::use_data(wine_data, overwrite = TRUE)**
**因为我们改变了原始数据的处理方式,所以我们必须在**数据中记录这些变化。 **data-raw/** 文件夹中的 R** 文件:**
#’ Wine reviews for 49 countries.
#’
#’ A dataset containing processed data of wine reviews.
#’ Missing price values have been filled with the mean price for
#’ that country
#’ six observations coming from countries with no wine price were
#’ deleted.
#’
#’ @format A data frame with 280895 rows and 4 variables:
#’ \describe{
#’ \item{country}{The country that the wine is from.}
#’ \item{points}{The number of points WineEnthusiast
#’ rated the wine on a scale of 1–100}
#’ \item{price}{The cost for a bottle of the wine}
#’ \item{winery}{The winery that made the wine}
#’ }
#’ @source \url{https://www.kaggle.com/zynicide/wine-reviews}
“wine_data”
**并更新文档:**
devtools::document()
**让我们编织我们的小图案。请注意,即使我们没有更改插图中的代码,也不再有丢失的值。在 **wine_data 中删除缺失的值。R** 脚本。在插图中,我们只是加载处理过的 **wine_data.rda** 。**
****
**wine_data 摘要不包含缺失值**
# **7.使用 R Markdown**
**我们可以将任何 R Markdown 文件添加到我们的包中。类似于原始数据,我们在 **inst/** 文件夹中创建一个子文件夹 **rmd/** 。让我们创建一个简单的仪表板来查看每个国家的葡萄酒价格分布。我们创建一个 R Markdown 文件 **wine_dashboard。 **rmd/** 中的 Rmd** 内容如下:**
**—
title: “Wine dashboard”
output:
flexdashboard::flex_dashboard:
orientation: columns
runtime: shiny
—```{r setup, include=FALSE}
library(flexdashboard)
library(ggplot2)
data(wine_data, package = "WineReviews")
```Inputs {.sidebar data-width=150}
-------------------------------------
```{r}
shiny::selectInput(
"country",
label = "select country",
choices = sort(unique(wine_data$country))
)
```Column
-------------------------------------### Wine points versus price
```{r}
shiny::renderPlot(
ggplot(wine_data[wine_data$country == input$country, ],
aes(points, log10(price), group = points)) +
geom_boxplot() +
labs(x = "points scored by the wine on a 100 scale",
y = "Base-10 logarithm of the wine price") +
theme_bw()
)
```Column
-------------------------------------
### Wine price distribution
```{r}
shiny::renderPlot(
ggplot(wine_data[wine_data$country == input$country, ], aes(price)) +
geom_density() +
labs(y = "Price density function") +
theme_bw()
)
```
```
**让我们用*运行文件*查看仪表板:**
****
**按“运行文档”查看仪表板**
****
# **8.使用版本控制**
**我们的数据分析示例现在已经完成。这是我们最终项目结构的样子:**
```
****.** ├── .gitignore
├── .Rbuildignore
├── .Rhistory
├── DESCRIPTION
├── **data**
│ └── wine_data.rda
├── **data-raw**
│ └── wine_data.R
├── **inst**
│ ├── **extdata**
│ │ ├── winemag-data-130k-v2.csv
│ │ └── winemag-data_first150k.csv
│ └── **rmd**
│ └── wine_dashboard.Rmd
├── **man**
│ ├── fill_na_mean.Rd
│ └── wine_data.Rd
├── NAMESPACE
├── **R**
│ ├── data.R
│ └── variable_calculation.R
├── **tests**
│ ├── **testthat**
│ │ └── test-variable_calculations.R
│ └── testthat.R
├── **vignettes**
│ └── wine_eda.Rmd
└── WineReviews.Rproj**
```
**这种结构是合适的版本控制。跟踪有代码的文件,而不跟踪 **inst/extdata** 中的原始数据和 **data/** 中的已处理数据。我们可以使用 **data-raw/** 中的 R 脚本从(重新)下载的原始数据中生成经过处理的数据。我建议将以下条目添加到**中。gitignore** :**
```
**.Rproj.user
.Rhistory
data/
inst/extdata/
inst/doc**
```
# **概述**
**下面是我们如何利用 R 包组件的:**
* ****描述:**给出了项目及其依赖项的概述**
* ****R/** :包含 R 脚本,其函数在整个包中使用**
* ****测试/** :包含我们函数的开发时测试**
* ****inst/extdata/** :包含我们的原始数据文件**
* ****data-raw/** :包含将原始数据处理成整齐数据的 R 脚本**
* ****数据/** :包含整齐的数据存储为。rda 文件**
* ****man/** : 包含我们的对象和函数的文档**
* ****vignettes/** :包含数据分析报告作为包 vignettes**
* ****inst/rmd** :包含报告或应用程序的 R Markdown 文件**
**我希望你喜欢这篇文章。你会考虑用 R 包来存储你的作品吗?你喜欢如何组织你的项目?
在评论里告诉我吧!**
****
**照片由 chuttersnap 在 Unsplash 上拍摄**
# 结束不可靠的分析
> 原文:<https://towardsdatascience.com/putting-an-end-to-unreliable-analytics-386431bb4e56?source=collection_archive---------55----------------------->

来源:Pixaby 的 TheToonCompany
当构建一个产品或服务时,知道输入数据将是预期的是必要的。如果信息来自另一个部门,依靠他们不改变它不可避免地以失望告终,因为他们可能甚至不知道他们的数据正在被使用,当然也不知道如何被使用。
优秀的工程师知道这一点,并测试一切以确保他们能捕捉到任何变化或错误。从本质上来说,人类容易犯错误,一个好的工程师有一种谦逊的感觉。通过质量测试,您可以在错误进入生产服务器之前发现它们。
代码现在相对容易测试。编译器和测试套件有助于确保代码在单一环境中正常运行。不幸的是,在集成点发生错误仍然很常见,而且代价非常高——一个系统将数据或任务交给另一个系统。
集成点无处不在。每当使用不同的技术时,或者当服务在团队之间移交时,就会发生这种情况。在移交过程中确保准确性和一致性的最流行的方法之一是通过构建良好记录的 API,这些 API 被维护并直接向其他团队公开。这实质上是亚马逊 2002 年的微服务战略。
API 有助于实现跨技术/团队的交流,因为它们为每个服务提供了一个框架来验证它们发送或接收的数据。如果出现问题,可以快速返回错误,从而实现可靠性和健全性,因为问题会导致失败,因此可以快速修复。不幸的是,实现和维护它们的成本很高。每个 API 都需要有文档记录和支持的持续可用的服务。因此,企业[花费数万](https://medium.com/yourapi/how-much-does-it-cost-to-build-an-api-925b1bf90da9#:~:text=Making%20some%20assumptions%20about%20average,integration%20is%20between%2020%E2%80%9330)来持续实施和维护终端。
分析工作负载通常会集成来自许多不同来源的数据,而不进行任何运行时验证,这会导致运行时崩溃或更糟的错误结果。许多组织中的“数据产品”依赖于集成来自各种来源的信息,经常利用复杂的转换来将各个部分组合在一起。但是这些“数据产品”通常具有非常弱的测试覆盖率,并且测试它们的最先进技术是非常新的或者是刚刚建立的。 [JSON schema](https://json-schema.org/) 可以是一种通过验证集成来自任何来源的数据的轻量级方法,而不需要重量级 API。它本质上是一个框架,用于确保传输中的数据呈现出预期的形状和结构。因此,在数据进入系统之前,可以通过在系统边缘验证有效性来捕捉运行时错误。可以编写更简单的测试来确保坏数据不会离开或进入。
我们已经在 Protobuf 和 OpenAPI 等其他技术中看到了这种趋势。它们都已经发展到至少提供一些现成的模式检查和验证,解除了开发人员进行请求/响应验证的责任。虽然两者都不完美,但通过[完全采用](https://swagger.io/specification/) JSON 模式,OpenAPI 似乎正朝着正确的方向前进。
主要问题是这些框架走得还不够远。我们需要一个更全面的管道,将 OpenAPI 风格的输入和输出预期引入数据管道,在 API 服务完成后,数据管道负责事件。我们应该能够拥有一个既可以用来针对 OpenAPI 构建 API,又可以深入数据管道、服务和存储的 schematic truth 来源。
使用这些原则并结合 JSON schema 等工具,我们将走向一个未来的世界,不仅在一个团队维护的代码中进行端到端测试,而且跨越边界。在某种程度上,具有前瞻性思维的企业会将模式集中化,以便更改可以简单地过滤到使用它的所有产品和服务。数据集成和产品开发将变得更快、更可靠;开发它们看起来更像是构建软件,而不是搭建技术基础设施。
分析是一个包含大量低级点解决方案的空间,这些解决方案需要连接在一起,而不需要在它们之间进行原生错误检查。它的主要焦点是集成,而不是处理。我们应该从基本原则后退一步,想想我们需要什么样的数据分析框架来帮助我们做到这一点。一个可用的系统不仅应该在测试中验证数据,还应该在生产中验证数据,并在每个系统的边界进行检查。
# 用人工智能把病人放在第一位
> 原文:<https://towardsdatascience.com/putting-patients-first-with-artificial-intelligence-751c49ab97a0?source=collection_archive---------32----------------------->

克里斯蒂安·鲍文在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上的照片
我们总有一天会用到医疗保健系统。然而,即使在过去的几十年里有了巨大的飞跃,仍然有几个缺点。健康信息系统与人工智能(AI)相结合,可以极大地改变患者的生活,同时帮助卫生从业人员开展日常工作。
重要的是要认识到情况并不总是像今天这样。在世纪之交,医学研究所报告说,在美国,每年大约有 100,000 人由于医疗失误而丧生。这一事实的可悲之处在于,许多这样的错误是很容易避免的。
已经有几例医生给对药物过敏的病人开了药。在这些案例中,医生没有注意到患者记录中的过敏记录,这一错误导致了患者的最终死亡。计算机化的系统有助于在系统内精确地建立类似的制衡机制,从而减少人为错误,使整个过程对病人来说更加安全。
如今,大多数现代医院已经有了这样的系统,但随着人工智能的最新进展,它们现在可以进入下一个阶段。以下是我们医院目前正在开发或使用的人工智能系统的一些例子。它们涉及三个非常不同的方面;第一个帮助医院管理,第二个帮助病人护理,第三个支持护理人员。

freestocks.org 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上[拍照](https://unsplash.com/@freestocks?utm_source=medium&utm_medium=referral)
医院一直在努力提高效率,同时不牺牲给病人的服务。他们中的许多人正在部署医用机器人,旨在帮助医生和护士开出正确的药方。这种机器人能够追踪他们提供给病人的所有药物;他们可以准备准确的剂量,并仔细检查病人档案中指定的任何条件。一辆智能手推车能够自己在医院导航,然后将药物送到特定的病房。这种系统消除了处方错误,为医院节省了大约 30%的库存,并消除了与过期药物相关的所有损失。

由 [Jesper Aggergaard](https://unsplash.com/@aggergakker?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片
病人是医疗保健系统的核心。正因为如此,组织努力提高他们的服务,特别是当年轻的人参与进来的时候。许多医院正在使用[虚拟现实(VR)头戴设备来帮助年轻患者转移注意力](https://researchtrustmalta.eu/research-projects/virtual-reality-in-healthcare/);从他们正在接受的治疗到娱乐性的东西,如电脑游戏。这种方法被称为注意力分散疗法,效果出奇的好;在某些情况下,患者报告疼痛减轻了近 50%。注意力分散疗法的伟大之处在于,患者不需要服用任何药物,从而降低了过敏、止痛药成瘾和其他许多风险。

照片由 [Jesper Aggergaard](https://unsplash.com/@aggergakker?utm_source=medium&utm_medium=referral) 在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄
护理人员做得很好,但我们都知道他们的工作很有挑战性,在某些情况下很乏味。正因为如此,人工智能正被用来促进那些可以自动化的任务。AI 的使用并不意味着它将取代护理员,远非如此。护理职业中人的因素仍然至关重要,而且短期内不会有任何变化。然而,人工智能将接管那些需要重复分析的任务,并帮助护理人员加快整个过程。一个恰当的例子是对人体运动的研究,通常称为“步态分析”。在这种情况下,一个摄像机跟踪系统拍摄病人的移动镜头。物理治疗师然后分析获得的大量数据。这一过程通常持续数小时;然而,人工智能系统可以将时间缩短到几秒钟。当然,人类的直觉对于验证自动化分析仍然非常重要,但是至少,对于护理人员来说,总体上节省了时间。

贾法尔·艾哈迈德在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片
> 重要的是要记住,这种转变的核心是病人
在本文中,我们只选择了三个在许多医院都能找到的简单用例,但我们仅仅触及了冰山一角。医疗保健行业在许多应用中使用人工智能,例如在识别癌细胞、药物研发过程中、指导机器人外科医生、健康监测和许多其他方面。重要的是要记住,这种转变的核心是病人。人工智能是人类创造的最强大的工具,它的医疗应用将在未来几年拯救更多的生命。
【https://www.businesstoday.com.mt】本文原载于[](https://www.businesstoday.com.mt/people/people/517/interview__alexiei_dingli_malta_ideal_place_to_launch_and_deploy_ai_solutions)
*[**阿列克谢·丁力教授**](http://www.dingli.org/) 是马耳他[大学](https://www.um.edu.mt/)的 AI 教授。二十多年来,他一直在人工智能领域进行研究和工作,协助不同的公司实施人工智能解决方案。他的工作被国际专家评为世界级,并赢得了几个当地和国际奖项(如欧洲航天局、世界知识产权组织和联合国等)。他出版了几本同行评审的出版物,并且是马耳他[的一部分。由马耳他政府成立的人工智能工作组,旨在使马耳他成为世界上人工智能水平最高的国家之一。](https://malta.ai/)*
# PyCaret 2.0 已经发布了,有什么新内容吗?
> 原文:<https://towardsdatascience.com/pycaret-2-0-is-here-whats-new-34baa87a951e?source=collection_archive---------37----------------------->
## 机器学习爱好者的 3 大新功能
毫无疑问,PyCaret 是我最喜欢的机器学习库。它比 Scikit-Learn 对开发人员更友好,并提供了内置功能来轻松处理主要的机器学习任务。*那么,这个版本有什么新内容?*读一读就知道了。

[粘土银行](https://unsplash.com/@claybanks?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 拍摄的照片
如果你以前没有使用过这个库,请随意查看下面的文章。它们是分类和回归任务的良好起点。
* [PyCaret:用 Python 实现更好的机器学习](/pycaret-better-machine-learning-with-python-58b202806d1e)
* [用 PyCaret 回归:一个更好的机器学习库](/regression-with-pycaret-a-better-machine-learning-library-e02762a0615c)
* [用 PyCaret 分类:一个更好的机器学习库](/classification-with-pycaret-a-better-machine-learning-library-cff07a10a28c)
几天前发布了 2.0 版本,并带来了一些新功能。大多数都是次要的,但仍然值得一提,因为它们会节省您的时间或为您提供一些额外的信息。
这是完整的变更日志。
我们将在下一节看到如何安装这个库。
# 库安装
首先,打开终端/CMD 并执行下面一行:
```
pip install pycaret==2.0
```
我假设您已经安装并配置了 *Python* ,无论是作为独立安装还是通过 *Anaconda* 。由于大量的依赖项,安装将需要一分钟左右的时间才能完成。
完成后,您可以打开笔记本环境,导入库,并检查版本。
```
import pycaretpycaret.__version__ **>>> ‘2.0.0’**
```
这就是安装的基本内容。接下来我们将讨论最有用的新特性。
# 1.训练时间
这个特性无论如何都不是突破性的,但是拥有它很好。例如,在调用`compare_models()`函数时,您现在会得到一个表示训练时间的附加列:

这是原始虹膜数据集的性能。我们可以看到用明显的黄色标记的最佳算法,以及在最右边添加的以秒为单位的训练时间,作为一个新列。
这是一个很好的功能,因为它显示了体面的 QDA 速度训练速度的改善,而不是额外的树分类器算法,同时提供相同的性能。如果速度是一个问题,这些功能可能是有用的。
# 2.保存可视化效果
我在 PyCaret 上的前几篇文章展示了根据您的模型性能制作好看的可视化效果是多么容易。缺少的一件事是把情节保存到你的设备上。
使用 2.0 版,很容易将各种图保存到您的设备中。这里有一个例子:
```
plot_model(model, plot=’confusion_matrix’, save=True)
```
如您所见,这里唯一的新参数是`save`参数。当设置为`True`时,绘图保存在您的设备上。让我们快速浏览一下:

# 3.MLFlow UI
对于那些不知道的人来说, *PyCaret* 2.0 嵌入了一个 *MLflow* 跟踪组件,作为日志记录的后端 API 和 UI。你可以在这个链接上阅读更多关于 MLFlow [的内容,但总而言之,这是一个管理机器学习生命周期的很好的 GUI,在这种情况下,比较模型性能。](https://mlflow.org)
下面是导入数据、比较模型和启动后端服务的完整代码:
```
from pycaret.classification import *
from pycaret.datasets import get_datairis = get_data(‘iris’)clf = setup(
iris,
target=’species’,
session_id=42,
**log_experiment=True,
experiment_name=’exp1'**
)compare_models()!mlflow ui
```
这两行粗体字对于在应用程序中选择适当的实验特别重要,稍后您会看到原因。
执行完这段代码后,只需进入`[http://localhost:5000](http://localhost:5000)`查看应用程序:

# 在你走之前
根据我目前使用该库的经验,这是一篇相当快速的文章,展示了 PyCaret 2.0 最有用的新特性。你的答案可能会有所不同,所以请记住这一点。对于完整的变更日志,[请访问此链接](https://github.com/pycaret/pycaret/releases/tag/2.0)。
此外,你可以自由地自己进一步研究官方文档,因为这是最好的文档之一。
感谢阅读。
*喜欢这篇文章吗?成为* [*中等会员*](https://medium.com/@radecicdario/membership) *继续无限制学习。如果你使用下面的链接,我会收到你的一部分会员费,不需要你额外付费。*
[](https://medium.com/@radecicdario/membership) [## 通过我的推荐链接加入 Medium-Dario rade ci
### 作为一个媒体会员,你的会员费的一部分会给你阅读的作家,你可以完全接触到每一个故事…
medium.com](https://medium.com/@radecicdario/membership)
[**加入我的私人邮件列表,获取更多有用的见解。**](https://mailchi.mp/46a3d2989d9b/bdssubscribe)
# PyCaret 2.1 已经发布了,有什么新内容吗?
> 原文:<https://towardsdatascience.com/pycaret-2-1-is-here-whats-new-4aae6a7f636a?source=collection_archive---------8----------------------->

PyCaret 2.1 现在可以使用 pip 下载。[https://www.pycaret.org](https://www.pycaret.org)
我们很高兴宣布 py caret 2.1—2020 年 8 月的更新。
PyCaret 是一个用 Python 编写的开源、**低代码**机器学习库,可以自动化机器学习工作流。它是一个端到端的机器学习和模型管理工具,可以加快机器学习实验周期,让您的工作效率提高 10 倍。
与其他开源机器学习库相比,PyCaret 是一个替代的低代码库,可以用来替换数百行代码。这使得实验快速有效。
如果你以前没有听说过或使用过 PyCaret,请查看我们的[之前的公告](/announcing-pycaret-2-0-39c11014540e)快速入门。
# 正在安装 PyCaret
安装 PyCaret 非常容易,只需要几分钟。我们强烈建议使用虚拟环境来避免与其他库的潜在冲突。参见下面的示例代码,创建一个 ***conda 环境*** 并在该 conda 环境中安装 pycaret:
```
**# create a conda environment**
conda create --name yourenvname python=3.6 **# activate environment**
conda activate yourenvname **# install pycaret**
pip install pycaret**# create notebook kernel linked with the conda environment** python -mipykernel install --user --name yourenvname --display-name "display-name"
```
如果您已经安装了 PyCaret,您可以使用 pip 更新它:
```
pip install --upgrade pycaret
```
# **PyCaret 2.1 功能概述**

由[paweczerwiński](https://unsplash.com/@pawel_czerwinski?utm_source=medium&utm_medium=referral)在 [Unsplash](https://unsplash.com?utm_source=medium&utm_medium=referral) 上拍摄的照片
# 👉GPU 上的超参数调整
在 PyCaret 2.0 中,我们宣布了针对某些算法(XGBoost、LightGBM 和 Catboost)的支持 GPU 的培训。2.1 中的新功能是现在你还可以在 GPU 上调整这些模型的超参数。
```
**# train xgboost using gpu**
xgboost = create_model('xgboost', tree_method = 'gpu_hist')**# tune xgboost** tuned_xgboost **=** tune_model(xgboost)
```
在 **tune_model** 函数中不需要额外的参数,因为它自动从使用 **create_model** 函数创建的 xgboost 实例中继承 tree_method。如果你对小比较感兴趣,这里是:
> **100,000 行,88 个特征,8 个类的多类问题**

GPU 上的 XGBoost 培训(使用 Google Colab)
# 👉模型部署
自从 2020 年 4 月 PyCaret 的第一次发布以来,您可以简单地使用笔记本上的中的 **deploy_model** 在 AWS 上部署训练好的模型。在最近的版本中,我们增加了一些功能来支持在 GCP 和微软 Azure 上的部署。
## **微软 Azure**
若要在 Microsoft Azure 上部署模型,必须设置连接字符串的环境变量。可以从 Azure 中您的存储帐户的“访问密钥”中获取连接字符串。

https:/portal . azure . com-从存储帐户获取连接字符串
一旦复制了连接字符串,就可以将其设置为环境变量。请参见下面的示例:
```
**import os** os.environ['AZURE_STORAGE_CONNECTION_STRING'] = 'your-conn-string'**from pycaret.classification import deploy_model**
deploy_model(model = model, model_name = 'model-name', platform = 'azure', authentication = {'container' : 'container-name'})
```
嘣!就是这样。只需使用一行代码**,**你的整个机器学习管道现在就装在微软 Azure 的容器里了。您可以使用 **load_model** 函数来访问它。
```
**import os** os.environ['AZURE_STORAGE_CONNECTION_STRING'] = 'your-conn-string'**from pycaret.classification import load_model** loaded_model = load_model(model_name = 'model-name', platform = 'azure', authentication = {'container' : 'container-name'})**from pycaret.classification import predict_model** predictions = predict_model(loaded_model, data = new-dataframe)
```
## 谷歌云平台
要在 Google Cloud Platform (GCP)上部署模型,您必须首先使用命令行或 GCP 控制台创建一个项目。创建项目后,您必须创建一个服务帐户,并以 JSON 文件的形式下载服务帐户密钥,然后用它来设置环境变量。

创建新的服务帐户,并从 GCP 控制台下载 JSON
要了解更多关于创建服务账户的信息,请阅读[官方文档](https://cloud.google.com/docs/authentication/production)。一旦创建了服务帐户并从 GCP 控制台下载了 JSON 文件,就可以开始部署了。
```
**import os** os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'c:/path-to-json-file.json'**from pycaret.classification import deploy_model** deploy_model(model = model, model_name = 'model-name', platform = 'gcp', authentication = {'project' : 'project-name', 'bucket' : 'bucket-name'})
```
模型已上传。现在,您可以使用 **load_model** 函数从 GCP 存储桶访问模型。
```
**import os** os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'c:/path-to-json-file.json'**from pycaret.classification import load_model** loaded_model = load_model(model_name = 'model-name', platform = 'gcp', authentication = {'project' : 'project-name', 'bucket' : 'bucket-name'})**from pycaret.classification import predict_model** predictions = predict_model(loaded_model, data = new-dataframe)
```
# 👉MLFlow 部署
除了使用 PyCaret 的本地部署功能,您现在还可以使用所有 MLFlow 部署功能。要使用这些,您必须使用**设置**功能中的 **log_experiment** 参数记录您的实验。
```
**# init setup**
exp1 = setup(data, target = 'target-name', log_experiment = True, experiment_name = 'exp-name')**# create xgboost model** xgboost = create_model('xgboost')..
..
..# rest of your script**# start mlflow server on localhost:5000**
!mlflow ui
```
现在在你喜欢的浏览器上打开 [https://localhost:5000](https://localhost:5000) 。

[https://localhost:5000](https://localhost:5000) 上的 MLFlow UI
点击**【运行名称】**左侧的**【开始时间】**,可以看到运行的详细信息。你在里面看到的是一个训练模型的所有超参数和评分指标,如果你向下滚动一点,所有的工件也会显示出来(见下文)。

MLFLow 伪影
经过训练的模型以及其他元数据文件存储在“/model”目录下。MLFlow 遵循包装机器学习模型的标准格式,这些模型可用于各种下游工具中——例如,通过 REST API 或 Apache Spark 上的批处理推理进行实时服务。如果您愿意,您可以使用 MLFlow 命令行在本地为该模型提供服务。
```
mlflow models serve -m local-path-to-model
```
然后,您可以使用 CURL 将请求发送给 model 以获得预测。
```
curl [http://127.0.0.1:5000/invocations](http://127.0.0.1:5000/invocations) -H 'Content-Type: application/json' -d '{
"columns": ["age", "sex", "bmi", "children", "smoker", "region"],
"data": [[19, "female", 27.9, 0, "yes", "southwest"]]
}'
```
*(注意:Windows 操作系统尚不支持 MLFlow 的这一功能)。*
MLFlow 还提供与 AWS Sagemaker 和 Azure 机器学习服务的集成。您可以使用 SageMaker 兼容环境在 Docker 容器中本地训练模型,或者在 SageMaker 上远程训练模型。要远程部署到 SageMaker,您需要设置您的环境和 AWS 用户帐户。
**使用 MLflow CLI 的示例工作流**
```
mlflow sagemaker build-and-push-container
mlflow sagemaker run-local -m <path-to-model>
mlflow sagemaker deploy <parameters>
```
要了解有关 MLFlow 所有部署功能的更多信息,[请单击此处](https://www.mlflow.org/docs/latest/models.html#)。
# 👉MLFlow 模型注册表
MLflow 模型注册组件是一个集中式模型存储、一组 API 和 UI,用于协作管理 MLflow 模型的整个生命周期。它提供了模型沿袭(MLflow 实验和运行产生了模型)、模型版本化、阶段转换(例如从阶段转换到生产)和注释。
如果运行您自己的 MLflow 服务器,您必须使用数据库支持的后端存储来访问模型注册表。[点击此处](https://www.mlflow.org/docs/latest/tracking.html#backend-stores)了解更多信息。然而,如果你使用的是 [Databricks](https://databricks.com/) 或者任何托管的 Databricks 服务,比如 [Azure Databricks](https://azure.microsoft.com/en-ca/services/databricks/) ,你不需要担心设置什么。它配有你所需要的所有铃铛和哨子。

[https://data bricks . com/blog/2020/06/25/announcing-ml flow-model-serving-on-data bricks . html](https://databricks.com/blog/2020/06/25/announcing-mlflow-model-serving-on-databricks.html)
# 👉高分辨率绘图
这并不是突破性的,但对于使用 PyCaret 进行研究和发表文章的人来说,确实是一个非常有用的补充。 **plot_model** 现在有一个名为“scale”的附加参数,通过它您可以控制分辨率并为您的出版物生成高质量的绘图。
```
**# create linear regression model**
lr = create_model('lr')**# plot in high-quality resolution** plot_model(lr, scale = 5) # default is 1
```

PyCaret 的高分辨率残差图
# 👉用户定义的损失函数
这是自第一版发布以来最受欢迎的特性之一。允许使用自定义/用户定义的函数调整模型的超参数为数据科学家提供了巨大的灵活性。现在可以通过使用 **tune_model** 函数中的 **custom_scorer** 参数来使用用户自定义损失函数。
```
**# define the loss function**
def my_function(y_true, y_pred):
...
...**# create scorer using sklearn**
from sklearn.metrics import make_scorermy_own_scorer = make_scorer(my_function, needs_proba=True)**# train catboost model** catboost = create_model('catboost')**# tune catboost using custom scorer** tuned_catboost = tune_model(catboost, custom_scorer = my_own_scorer)
```
# 👉特征选择
特征选择是机器学习中的一个基本步骤。您丢弃了一堆特征,并且希望只选择相关的特征,而丢弃其他的特征。目的是通过去除会引入不必要噪声的无用特征来简化问题。
在 PyCaret 2.1 中,我们介绍了用 Python 实现 Boruta 算法(最初用 R 实现)。Boruta 是一种非常智能的算法,可以追溯到 2010 年,旨在自动对数据集执行特征选择。要使用它,你只需在**设置**函数中传递**特征选择方法**。
```
exp1 = setup(data, target = 'target-var', feature_selection = True, feature_selection_method = 'boruta')
```
要阅读更多关于 Boruta 算法的内容,请点击这里。
# 👉其他变化
* `compare_models`功能中的`blacklist`和`whitelist`参数现更名为`exclude`和`include`,功能不变。
* 为了在`compare_models`功能中设置训练时间的上限,增加了新参数`budget_time`。
* PyCaret 现在与 Pandas 分类数据类型兼容。在内部,它们被转换成对象,并以与处理`object`或`bool`相同的方式进行处理。
* 在`setup`功能的`numeric_imputation`中添加了数字插补新方法`zero`。当方法设置为`zero`时,缺失值被常量 0 替换。
* 为了使输出更易于阅读,由`predict_model`函数返回的`Label`列现在返回原始值,而不是编码值。
要了解 PyCaret 2.1 中所有更新的更多信息,请参见[发布说明](https://github.com/pycaret/pycaret/releases/tag/2.1)。
使用 Python 中的轻量级工作流自动化库,您可以实现的目标是无限的。如果你觉得这有用,请不要忘记给我们 GitHub repo 上的⭐️。
想了解更多关于 PyCaret 的信息,请关注我们的 LinkedIn 和 Youtube。
# 重要链接
[用户指南](https://www.pycaret.org/guide)
[文档](https://pycaret.readthedocs.io/en/latest/)
[官方教程](https://github.com/pycaret/pycaret/tree/master/tutorials) [示例笔记本](https://github.com/pycaret/pycaret/tree/master/examples)
[其他资源](https://github.com/pycaret/pycaret/tree/master/resources)
# 想了解某个特定模块?
单击下面的链接查看文档和工作示例。
[分类](https://www.pycaret.org/classification)
[回归](https://www.pycaret.org/regression) [聚类](https://www.pycaret.org/clustering)
[异常检测](https://www.pycaret.org/anomaly-detection) [自然语言处理](https://www.pycaret.org/nlp)
关联规则挖掘