深度学习的最佳资源
深度学习教育资源
深度学习是一种使用神经网络进行预测任务的机器学习方法。深度学习方法可以用于各种任务,包括对象检测、合成数据生成、用户推荐等等。在这篇文章中,我将浏览一些开始深度学习的最佳资源。
我们开始吧!
在线资源
有几个在线资源非常适合开始深度学习。
Sentdex 是一个 YouTube 频道,由哈里森·金斯利运营,其中有几个关于如何用 python 实现机器学习算法的教程。虽然该频道包含许多关于其他机器学习算法的优秀教程,如支持向量机、线性回归、基于树的模型和 k 近邻,但如果你想尝试深度学习,关于深度学习的教程是一个很好的起点。播放列表使用 Python 的机器学习有一个关于学习实现各种神经网络的 14 部分系列,如简单的多层密集网络、递归神经网络、长短期记忆网络(LSTMs)和卷积神经网络。该系列还介绍了 tensorflow 基础知识、预处理、训练&测试以及安装 tensorflow 的 GPU 版本。该频道还有一个名为从头开始的神经网络的播放列表,其中有关于如何从基本组件开始构建神经网络的教程。这是一个学习神经网络如何在引擎盖下工作的好地方。
DataCamp 是一个基于订阅的平台,非常适合那些开始从事数据科学和机器学习的人。它有许多学习如何实现神经网络的课程。具体来说,我推荐深度学习入门课程。本课程通过 DataCamp 的互动学习平台,为您提供关于如何使用 Keras 进行深度学习的实践知识。这意味着在视频间隙,您可以通过编写和运行实际代码来应用您所学到的东西。它涉及基本概念,如前向传播,激活函数,神经网络层和学习表示。它还详细介绍了使用反向传播的神经网络优化,将神经网络应用于回归和分类,以及如何进一步微调神经网络模型。学完基础,推荐 Keras 的《高级深度学习》课程。这将详细讨论 Keras API 以及如何使用功能构建块构建神经网络。它还深入探讨了神经网络中有关分类嵌入、共享层和合并层的一些高级概念
我上面列出的资源主要集中在实现和实际应用上。对于神经网络的更多理论处理,我推荐吴恩达关于深度学习的讲座。讲座涵盖了许多基础知识,包括梯度下降及其背后的微积分,矢量化,激活函数,反向传播,模型参数和超参数等等。如果你对神经网络背后的数学和理论感兴趣,我强烈推荐这些讲座。
书
*用 Scikit 实践机器学习——Learn&tensor flow,*作者 Aurelien Geron
如果你使用书本更有效地学习,这本书是开始学习如何实现神经网络的好地方。这本书涵盖了许多机器学习主题,包括许多神经网络的基础知识,包括如何建立简单的多层密集神经网络,卷积神经网络和递归神经网络。
伊恩·古德菲勒的《深度学习》
这本书涵盖了各种神经网络架构背后的理论和数学。这本书涵盖了神经网络背后的先决数学概念,许多现代神经网络背后的数学,甚至概述了在深度学习研究中正在做的工作。
结论
在这篇文章中,我们讨论了几个对开始深度学习有用的资源。首先,我们讨论了 Sentdex YouTube 频道,它涵盖了许多关于如何用 python 构建神经网络来完成分类和回归任务的实际例子。如果神经网络的理论和数学让你害怕,但你仍然想开始构建神经网络模型,这是一个很好的起点。我们还参观了 DataCamp,它提供了一个很好的互动学习平台,你可以在视频间隙解决编码练习。一旦你对实现深度学习算法的代码感到舒适,吴恩达的课程对于加深你对深度学习背后的理论和数学的了解是非常棒的。如果你更适合从书本中学习,那么 Hands on Machine Learning 包含了许多讨论如何用 python 实现神经网络的精彩章节。如果你有兴趣从一本书上学习理论,伊恩·古德菲勒的深度学习是一个很好的资源。我希望你觉得这篇文章有用/有趣。感谢您的阅读!
掌握 Python 的最佳资源
学习 Python 的全面资源列表
Python 是一种高级解释编程语言,可用于各种软件开发任务,包括科学计算、机器学习、数据分析、图像分析等等。在这篇文章中,我将介绍一些掌握 python 的最佳学习资源。
我们开始吧!
在线学习
科里·斯查费 YouTube 频道
我开始使用的学习 python 的第一个学习资源是科里·斯查费的 YouTube 频道。如果你刚刚入门,或者你是一个经验丰富的 python 开发者,并且对尝试 python 的新东西感兴趣,Corey 的频道是很棒的。该频道有以下主题的播放列表:
这是不言自明的。该播放列表包含全面的视频,以易于理解的方式学习 python 基础知识。在这里,您将了解类型、列表、元组、字典、条件、循环和迭代、函数、操作系统模块、python 标准库等等。对于那些对 Python 感到恐惧的人来说,这确实是一个很好的起点,因为它对任何观众来说都是非常容易理解的。
2.熊猫教程
Pandas 是一个强大的 python 库,用于数据分析和数据操作。Corey 的频道提供了一个教程视频播放列表,讨论如何对数据执行各种任务。这些包括读取和写入数据,过滤数据,选择数据,添加/删除行,汇总数据和更多!
Corey 的频道还包含 Django 的教程,Django 是一个基于 python 的 web 框架。如果您已经有了一些 python 开发经验,并且对学习如何构建高度可伸缩和安全的 web 应用程序感兴趣,我强烈建议您查看 Corey 的 Django 教程。
Sentdex YouTube 频道
Sentdex 是由哈里森·金斯利(Harrison Kinsley)运营的 YouTube 频道,提供 python 语言的深度机器学习教程。Sentdex 在我作为数据科学家的早期学习中发挥了重要作用,我向任何有兴趣深入研究该领域的人强烈推荐该频道。该频道涵盖了许多基本的机器学习算法,如线性回归,神经网络,随机森林,支持向量机等等。
数据营
DataCamp 是一个基于订阅的平台,提供关于 python 和机器学习的高质量视频教程。Python Track 的数据科学对于那些想尝试使用 Python 进行机器学习的人来说尤其重要。它也是强化数据科学和机器学习基础以及探索利基行业垂直领域的一些应用的好地方。
书
如果你通过书籍学习更有效率,以下文本是学习 python 的绝佳资源:
- 学习 Python ,马克·卢茨&大卫·阿舍尔
*马克·卢茨的《学习 Python》*是开始学习 Python 的好地方。它涵盖了许多基本概念,比如类型&操作符、列表、字典、元组、条件、函数、模块、类等等。
2.**Python 食谱,布莱恩·比兹利&布莱恩·k·琼斯
如果你有一些 python 经验,Python 食谱是一个很好的资源,可以让你的技能更上一层楼。顾名思义,这本书作为一个有效执行各种开发任务的食谱目录。这本书讨论了数据结构&算法,使用正则表达式的字符串&文本操作,HTML & XML 解析,处理日期&时间,使用生成器和迭代器,网络和 web 编程等等!
*3.*有效的 Python,布雷特·斯拉特金
这是另一个非常有助于加深您的 python 知识的中间文本。它涵盖了如何编写 pythonic 代码,即如何以简单明了的方式编码,同时最大限度地提高可读性。在 pythonic 思想的框架内,它涵盖了一些基本概念,包括函数、类、元类、并发性、内置模块等等。这种用 python 开发的方式可以帮助你写出清晰易读的代码,这使得使用这种语言变得更加愉快。
4.用 Scikit-Learn 进行机器实践学习& TensorFlow ,Aurelien Geron
一旦你有了坚实的 python 基础,如果你有兴趣尝试机器学习,我推荐用 Scikit-Learn & TensorFlow 动手学习机器。本文涵盖了机器学习的基础知识,包括如何构建分类模型&回归模型、降维、构建深度神经网络、构建卷积神经网络、构建递归神经网络等等。如果您是一名对机器学习入门感兴趣的 python 程序员,这是一个很好的资源。
结论
在这篇文章中,我们讨论了掌握 python 编程语言的几个资源。对于那些真正刚刚入门的人,我强烈推荐科里·斯查费的马克·卢茨的《学习 Python 的频道》。这些资源将使你充分熟悉这门语言,并为你可能有的其他兴趣打开大门。无论你是想用 Django 构建下一个 Instagram,还是想在 Keras 使用深度学习构建下一个面部识别技术,这个列表都足以让你开始你的 Python 之旅。我希望你觉得这篇文章有用/有趣。谢谢你的阅读,祝你好运!
适合初学者的最佳简单 Python 项目
在你的周末做这些小项目,在学习 Python 的同时获得一些乐趣。
读者们好,在这个故事中,我们来谈谈制作一些有趣的 Python 项目,以便更好地了解 Python,并在玩 Python 及其令人惊叹的库时获得一些乐趣。
这些项目很小,你可以在 1-2 小时内轻松完成。这些将帮助你更好地理解 Python 及其各种库。这些都是初学者友好的,所以每个人都应该尝试一下这些项目。
所以,事不宜迟,让我们一个一个地深入研究这些项目。
1)文本到语音
这是一个非常简单的 python 项目,但也是一个有趣的尝试。它利用了 Python 的 Google Text to Speech API,因此我们需要首先使用下面的命令导入库:
**pip install gTTS**
现在,在我们安装了所需的库之后,我们可以构建我们的 python 程序来将文本转换成语音。
如果我们想听程序中的音频,我们可以在 python 代码中导入 os 库。
所以,让我们来写程序的代码。下面是必需的代码:
#importing the gTTS library **from gtts import gTTS**#Asking the user for the required text **mt = input("Enter the required text:\t")**#Setting the output language **language = ‘en’**#Converting text to speech and choosing speed as fast **voice = gTTS(text=mt, lang=language, slow=False)**#Saving the speech as mp3 file **voice.save(“conv.mp3”)**
因此,通过这种方式,你可以很容易地使用 Python 进行文本到语音的转换。该文件将保存在执行该 python 代码的同一文件夹中(当前工作文件夹)。
你可以用很多方法让它变得更好,比如你可以从 pdf 中提取文本,然后把它转换成语音来完整地读出 pdf。你也可以从图像中提取文本,然后做同样的事情。
那么,让我们转到第二个简单的 Python 项目。
2)从图像中提取文本
您可以轻松地从图像中提取文本。我们将使用开放的 CV 和 pytesseract 库。
我们需要首先安装 openCV 和 pytesseract 库。为此,我们将使用以下命令在系统中安装 openCV。
**pip install opencv-python**
要安装 pytesseract,我们需要执行更多的任务。这是教程中最难的部分。
首先,我们需要使用以下命令:
**pip install pytesseract**
然后,我们需要下载下面的文件并安装在我们的系统中。从这里下载最适合你系统的文件。
完成所有这些工作后,我们就可以开始编写程序的最终代码了。
#Importing the libraries **import cv2
import pytesseract**
**pytesseract.pytesseract.tesseract_cmd = r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'**#Opening the image with open-cv
**image = cv2.imread('pic.png')**#Extracting text from image
**st = pytesseract.image_to_string(image)**#Printing the text
**print(st)**
因此,在 pytesseract 库的帮助下,我们可以很容易地从图像提取器中提取文本。
它在从图像中检测文本方面具有很高的准确性。因此,用相对简单的代码,我们已经从图像提取器中获得了高精度的文本。
3)玩 pdf
我们可以使用 Python 对 pdf 做很多事情。我们可以将它转换成文本,分割 PDF,合并 PDF,添加水印等等。所以,让我们写一个简单的 Python 代码来使用 Python 在 pdf 上执行所有这些很酷的东西。
我们将使用 PyPDF2 库对 PDF 执行操作。这个库帮助我们获得这样做的所有能力。
因此,让我们使用以下命令来安装这个库:
**pip install PyPDF2**
该命令将把所需的软件包安装到您的系统中。现在,我们已经准备好编写 Python 代码了。
因此,首先,让我们导入包并加载所需的 pdf。
#Importing the package
**import****PyPDF2**#Loading the PDF file
**pdffile =****open('first.pdf', 'rb')**#Reader object to read PDFs
**Reader =****PyPDF2.PdfFileReader(pdffile)**
现在,让我们从 PDF 中提取一些信息。
#Display the number of pages
**print(Reader.numPages)**#Getting a page by page number
**page = Reader.getPage(1)**#Extracting text from the page
**print(page.extractText())**
我们还可以合并 PDF 文件,旋转 PDF 文件中的页面,将 PDF 文件分割成多个部分等等。但是,我们不能在这里涵盖所有这些。
有关这个库及其用法的更多信息,请访问 PyPDF2 这里。
4)语言翻译
有一个神奇的 API 可以帮助我们从一种语言翻译成另一种语言。这是谷歌翻译 API。我们需要在系统中安装 goslate 来运行执行翻译所需的 Python 代码。
**pip install goslate**
现在,让我们深入研究实际的 Python 代码。我们可以翻译成多种语言,这些语言都是由谷歌翻译 API 支持的。我们将把来自用户的输入作为一个字符串,但是我们也可以把输入作为一个文本文件的形式,转换成一个字符串并对它执行操作。
此外,我们可以制作一个实时翻译器,在其中我们可以大声说话,代码将转换语言。这将需要在这个主题上做更多的挖掘,所以我们改天再讨论它。
现在,我们将构建一个简单的语言翻译器。
#Importing the library package
**import goslate**#Taking input from user
**text = input("Enter the text:\t")**#Calling the goslate function
**gs = goslate.Goslate()**#Translating the text to our preferred language
**trans = gs.translate(text,'hi')**#Displaying the output **print(trans)**
所以,上面的代码为我们做了必要的工作。它把一个英语句子翻译成印地语。你可以选择任何你喜欢的语言。
因此,通过上面的四个 Python 项目,我希望你能学到一些东西,并通过更多的选项和更深入的分析做出这些简单项目的更好版本。
将这些项目作为起始代码,并使用它们来构建更好的项目。一旦掌握了正确的技能,您还可以创建更多的 Python 项目。所以,继续练习,继续前进。
在你读完这本书之后,我想推荐几个更好的故事给你读,它们提供了好的知识,帮助你学习新的东西。
[## 用 MERN 堆栈构建一个电子商务网站——第 1 部分(设置项目)
让我们使用 MERN 堆栈(MongoDB,Express,React 和 Node)建立一个简单的电子商务网站,用户可以在其中添加项目…
shubhamstudent5.medium.com](https://shubhamstudent5.medium.com/build-an-e-commerce-website-with-mern-stack-part-1-setting-up-the-project-eecd710e2696) [## 用 Node,Express 和 MongoDB 构建一个 REST API
让我们使用 Node、Express 和 MongoDB 构建一个遵循 CRUD 原则的 REST API,并使用 Postman 测试它。
medium.com](https://medium.com/javascript-in-plain-english/build-a-rest-api-with-node-express-and-mongodb-937ff95f23a5) [## 使用 React 构建一个简单的 Todo 应用程序
让我们用 React 构建一个简单的 Todo 应用程序,教你 CRUD 的基本原理(创建、读取、更新和…
medium.com](https://medium.com/javascript-in-plain-english/build-a-simple-todo-app-using-react-a492adc9c8a4) [## 用 Django 构建求职门户——概述(第 1 部分)
让我们使用 Django 建立一个工作搜索门户,允许招聘人员发布工作和接受候选人,同时…
shubhamstudent5.medium.com](https://shubhamstudent5.medium.com/build-a-job-search-portal-with-django-overview-part-1-bec74d3b6f4e) [## 使用 Django 构建一个社交媒体网站——设置项目(第 1 部分)
在第一部分中,我们集中在设置我们的项目和安装所需的组件,并设置密码…
towardsdatascience.com](/build-a-social-media-website-using-django-setup-the-project-part-1-6e1932c9f221)
感谢您阅读这篇文章。我希望你喜欢这篇文章。
最佳 Spyder 替代方案— VS 代码
如果你是 Spyder 或 R Studio 的粉丝,你一定会喜欢 Visual Studio 代码。
萨法尔·萨法罗夫在 Unsplash 上拍摄的照片
当我开始 Python 编程时,Spyder 一直是我的最爱。我喜欢它的变量浏览器,IPython 控制台和项目目录选择器。变量资源管理器允许我检查和调试变量,而不用打印它们。IPython 控制台允许我在写入脚本之前进行任何快速测试,而项目目录选择器允许我在不使用命令行的情况下更改目录。多方便啊!
最近在 Visual Studio 代码中的 Python 开发在过去的一年中有了显著的改进,这激起了我的兴趣。我已经用了几个月了,我真的很喜欢 Visual Studio 代码。以下是我认为 VS Code 是 Spyder 最佳选择的原因。
1.熟悉的用户界面
Spyder 3 vs Visual Studio 代码
在我们开始之前,您应该在 VS 代码扩展市场安装 Python 扩展。
与 Spyder 类似,VS Code 也有一个变量浏览器。Python 交互式窗口为您提供了与 IPython 控制台相似的功能。您可以在这里做一个快速代码测试,并在变量浏览器中探索您的变量。
VS Code 还提供了 Python 调试控制台,用于 Python 中的调试。更多细节可以参考 VS 代码博客。
[## Visual Studio 代码 Python 入门教程
在本教程中,您将使用 Python 3 在 Visual Studio 代码中创建最简单的 Python“Hello World”应用程序。由…
code.visualstudio.com](https://code.visualstudio.com/docs/python/python-tutorial)
2.轻松改变 Python 虚拟环境
只需单击位于左下角的 python 版本,即可轻松更改当前的 Python 工作环境。
是的,就像那样。
3.Jupyter 笔记本支持
这是我最喜欢的 VS 代码的另一个特性。早在 9 月份,它就推出了对 Jupyter 笔记本的本地支持。你现在可以用 VS 代码打开你的 Jupyter 笔记本,而不必一次打开这么多窗口。
[## 在 Visual Studio 代码中使用 Jupyter 笔记本
Jupyter(以前的 IPython)是一个开源项目,它让您可以轻松地将 Markdown 文本和可执行 Python…
code.visualstudio.com](https://code.visualstudio.com/docs/python/jupyter-support)
4.开源免费!
Visual Studio 代码是免费和开源的,在许可的 MIT 许可下发布。开源意味着它将拥有巨大的社区和在线支持。你也可以把它带到任何地方,因为它可以在 Windows、Mac OS 和 Linux 上使用。
5.一堆主题和扩展
嗯,谁不喜欢 2020 年的黑暗模式?黑暗模式是 2020 年代码编辑器的必备模式。如果你不是黑暗模式的粉丝,不要担心,在 VS 代码中有很多主题可用,或者你可以自己定制主题。
开源也意味着人们可以通过开发 Visual Studio 代码的扩展来改进它。以下是我最喜欢的 VS 代码扩展:
- gitLens -一个 Git 扩展,可以帮助你一目了然地可视化代码作者,无缝地导航 Git 库。
- emojisense -一个 emoji 扩展,在 VS 代码中自动完成和显示 emoji。
- vscode-icons -一个图标扩展,美化你在 VS 代码中的图标视图。
- 一个帮助你检查拼写的扩展。它也适用于骆驼套!
希望这篇文章能帮助你熟悉 Visual Studio 代码。如果你对 Visual Studio 代码有什么好的或有趣的扩展,请和我分享!
干杯!
你必须拥有的终极字符串超级技能:REGEX
通过这个超级简单的介绍,摆脱 Python 中文本字符串处理问题的困扰。
照片由 Prateek Katyal 在 Unsplash 上拍摄
当处理数据时,总是有可能不得不处理文本。做好准备,当时机到来时,在 Python 中一个强大的朋友的帮助下,您将会很好地发现、处理和处理字母数字字符串。
我说的是 REGEX 。Regex 代表正则表达式,它描述了一个特殊的字符序列,用于搜索和操作文本字符串中的单词、数字或其他字符。
这篇介绍性的内容旨在为您提供一个很好的方法,并为您提供一些(更多的)初步知识,这些知识对于您熟悉 Regex 是必不可少的。
因为 Regex 是如此强大、庞大和复杂,我敢打赌,您也将分享同样的观点,即无限多的 pythonic 可能性展现在我们面前。让我们来看看一些基本命令。
首先,除了 Pandas,让我们导入**re**
模块,解锁 python 中所有与 Regex 相关的内容。
import pandas as pd
import re
我们还需要定义一个文本,我们将在这篇文章的一些例子上工作。
我选择了 Mat Velloso 写的一句话,以一种非常好奇的方式试图用简单的术语来区分机器学习和人工智能。
Mat Velloso 是微软首席执行官的技术顾问,也是开发者的忠实拥护者。https://twitter.com/matvelloso
让我们剪切并坚持较短的文本部分,使其更简单:
text = "If it is written in PYTHON, it's probably machine learning"
re.findall()
re
模块有一组函数,允许我们搜索、返回和替换一个字符串或字符串的任何部分。我们从 findall() 函数开始,它返回一个包含所有事件的列表。
rx = re.findall(r'.*PYTHON', text) print(rx)
['If it is written in PYTHON']
理解:首先,findall()
函数按照它找到的顺序返回一个事件列表。其次,**‘r’**
是在开始时确保字符串被视为“原始字符串”。
移动到‘.*PYTHON’
部分。我们希望返回所有内容,直到单词 PYTHON,inclusive。因此,**.***
是某种王牌符号,从某种意义上说,*****
将所有内容重复零次或更多次,直到它找到星星,而**.**
告诉星星返回它找到的所有内容,无论是字母、数字、符号还是空格。
如果我们颠倒命令,我们会收到句子的另一半,请看一个例子。
rx = re.findall(r'PYTHON.*', text) print(rx)
["PYTHON, it's probably machine learning"]
将re.flags
设置为 ignore-case,以便它匹配出现的大小写。
rx = re.findall('python.*',text, flags=re.IGNORECASE) print(rx)
["PYTHON, it's probably machine learning"]
从这一点开始,我们可以建立一系列的可能性。
rx = re.findall(r'written.*machine', text) print(rx)
["written in PYTHON, it's probably machine"]
rx = re.findall(r'tt.*bl', text) print(rx)
["tten in PYTHON, it’s probabl"]
接下来看看其他符号,这些符号用于检查字符串是否以、(符号**^**
)或开始,以特定字符(符号**$**
)结束。
**^**
评估并匹配字符串的开头(与**\A**
相同)**\w+**
匹配并返回字符串中的字母数字字符
如果我们去掉符号**+**
,我们只收到第一个字符。
text = "If it is written in PYTHON, it's probably machine learning"
rx = re.findall(r'^\w+', text) print(rx)
['If']
rx = re.findall('learning$', text) print(rx)
['learning']
如果不匹配,我们会收到一个空列表。
每当一个字符尽可能匹配时,它就被认为是贪婪的。符号**?**
检查下一个字符是否从该精确位置开始匹配 0 次或 1 次。意思是它指定了一个非贪婪版本的*****
和**+**
。
rx = re.findall(r' .*? ', text) print(rx)
[' it ', ' written ', ' PYTHON, ', ' probably ']
字符大括号 **{b,n}**
用于当我们想要检查至少**b**
次,并且最多**n**
次的图案时。
text = "If it is written in PYTHON, it's probably machine learning"
rx = re.findall(r'(t{1,4}|i{1,})', text) print(rx)
['i', 't', 'i', 'i', 'tt', 'i', 'i', 't', 'i', 'i']
在下一个例子中(如下),我们要求检查至少 1 个**t**
和最多 4 个**t**
,我们得到了这个精确的结果。
另一方面,我们还检查了至少 1 个**e**
和最多 3 个**e**
,但是正如您所看到的,一行中有 4 个**e**
,这意味着这 4 个**e**
将被分成 3 个一组,这就是我们得到剩余的单个**e**
的原因。
rx = re.findall(r'(t{1,4}|e{1,3})', 'listttt compreheeeension') print(rx)
['tttt', 'e', 'eee', 'e']
使用方括号 **[]**
指定我们想要匹配的一组字符。比如**[abc]**
和**a**
有 1 个匹配,和**cab**
有 3 个匹配,和**hello**
没有匹配。
因此,我们可以使用方括号内的(符号**-**
)来指定值的范围。因此,**[a-d]**
与**[abcd]**
相同,范围**[1-4]**
与**[1234]**
相同,以此类推。
按照同样的推理,范围**[a-z]**
匹配任何小写字母,范围**[A-Z]**
匹配任何大写字母。如果设置了**[a-zA-Z]**
的组合,我们就同时检查上下两种情况。让我们用一些例子来试试。
# assigning new text
alpha_num = "Hello 1234"
rx = re.findall(r'[a-z]', 'alpha_num') print(rx)
['e', 'l', 'l', 'o']
rx = re.findall(r'[a-zA-Z]', 'Hello 1234') print(rx)
['H', 'e', 'l', 'l', 'o']
rx = re.findall(r'[a-zA-Z0-9]', 'Hello 1234') print(rx)
['H', 'e', 'l', 'l', 'o', '1', '2', '3', '4']
如果我们加上符号**+**
,会发生什么?
rx = re.findall(r'[a-zA-Z0-9]+', 'Hello 1234') print(rx)
['Hello', '1234']
提示:如果集合内的第一个字符是**^**
,那么集合外的所有字符都将被匹配。
rx = re.findall(r'[^a-zA-Z ]+', 'Hello 1234') print(rx)
['1234']
这些对你来说有意义吗?厉害!
现在来说说特殊序列。这些用反斜杠**\**
写,后跟所需的字符(及其含义)。
- \ w——如前所述,返回字符串包含字母、数字和下划线的匹配项
- \ W-返回每个非字母数字字符
- \ d-返回一个匹配项,其中字符串包含从 0 到 9(0–9)的数字。
如果星号*****
重复所有事情零次或更多次,符号**+**
重复所有事情一次或更多次。那么有什么区别呢?让我们创建另一个字符串来举例说明,并仔细看看。
# assigning new text
letters_numbers = "The letter A, the character * and the numbers 11, 222 and 3456."
rx = re.findall('\w', letters_numbers) print(rx)
['T', 'h', 'e', 'l', 'e', 't', 't', 'e', 'r', 'A', 't', 'h', 'e', 'c', 'h', 'a', 'r', 'a', 'c', 't', 'e', 'r', 'a', 'n', 'd', 't', 'h', 'e', 'n', 'u', 'm', 'b', 'e', 'r', 's', '1', '1', '2', '2', '2', 'a', 'n', 'd', '3', '4', '5', '6']
相反,如果我们加上符号**+**
,会有什么不同?
rx = re.findall('\w+', letters_numbers) print(rx)
['The', 'letter', 'A', 'the', 'character', 'and', 'the', 'numbers', '11', '222', 'and', '3456']
rx = re.findall('\W', letters_numbers) print(rx)
[' ', ' ', ',', ' ', ' ', ' ', '*', ' ', ' ', ' ', ' ', ',', ' ', ' ', ' ', '.']
仅提取数字:
rx = re.findall('\d+', letters_numbers) print(rx)
['11', '222', '3456']
rx = re.findall('\d{3,}', letters_numbers) print(rx)
['222', '3456']
现在,假设我们想从两个元素组成的字符串中只提取大写单词。
upper_extract = "Regex is very NICE for finding and processing text in PYTHON"
rx = re.findall('([A-Z]{2,})', upper_extract) print(rx)
['NI', 'CE', 'PY', 'TH', 'ON']
重新拆分()
split 方法非常方便,因为它在找到匹配项时会拆分字符串,并返回精确拆分后的字符串列表。
numbers = 'The air we breath is made up of 78% nitrogen, 21% oxygen and 1% of other stuff.'
rx = re.split(r'\d+', numbers) print(rx)
['The air we breath is made up of ', '% nitrogen, ', '% oxygen and ', '% of other stuff.']
如果模式不匹配,则返回原始字符串。
一个有用的资源是设置可能发生的最大拆分。我们可以通过将maxsplit
参数传递给re.split()
方法来进行设置。
rx = re.split(r'\d+', numbers, 1) print(rx)
['The air we breath is made up of ', '% nitrogen, 21% oxygen and 1% of other stuff.']
在下一个示例中,只在第一次出现的五个空格处设置拆分。
rx = re.split(r'\s', numbers, 5) print(rx)
['The', 'air', 'we', 'breath', 'is', 'made up of 78% nitrogen, 21% oxygen and 1% of other stuff.']
re.sub()
Sub 代表 SubString,使用这个方法,您可以在任何时候用任何文本替换任何匹配。
语法很简单:re.sub(pattern, replacement, string)
。
可以添加其他参数,例如替换发生的最大次数、区分大小写等。
text = "If it is written in PYTHON, it's probably machine learning"
rx = re.sub(r'written', 'coded', text) print(rx)
If it is **coded** in PYTHON, it's probably machine learning
rx = re.sub(r'it', 'THAT', text) print(rx)
If **THAT** is wr**THAT**ten in PYTHON, **THAT**'s probably machine learning
在下一个例子中,我们想要的是用“THAT”替换“it ”,但只在第一次出现时。
rx = re.sub(r'it', 'THAT', text, count=1) print(rx)
If **THAT** is written in PYTHON, it's probably machine learning
在下一个示例中,将通过单词“PYTHON”前后的空格进行拆分,并替换为“code”。如果我们以这种方式键入“PYthon ”,那么设置 ignore-case so 并不重要。
rx = re.sub(r’\sPYthon,\s’, ‘ code, ‘, text, flags=re.IGNORECASE) print(rx)
If it is written in **code**, it's probably machine learning
re.subn()
re.subn()
产生与re.sub()
相同的结果,除了它返回替换的数量。
rx = re.subn(r'it', 'THAT', text) print(rx)
("If **THAT** is wr**THAT**ten in PYTHON, **THAT**'s probably machine learning", 3)
如果你喜欢这篇文章,我相信你会发现这些也很有趣。
有许多最常用的函数和方法的例子
towardsdatascience.com](/pandas-made-easy-the-guide-i-81834f075893) [## 机器学习:营销活动的成本预测(探索性数据分析——第一部分)
预测营销活动最佳目标候选人的数据科学方法
towardsdatascience.com](/machine-learning-costs-prediction-of-a-marketing-campaign-exploratory-data-analysis-part-i-758b8f0ff5d4)
结论
作为 Regex 能力的初步探索,我猜想到现在为止,在处理字母数字字符串时,您会更多地考虑应用这些技术。
Regex 将对您在 Python 上的工作效率产生巨大影响,所以我希望您继续研究并投入一些时间,因为一旦您对它感到满意,您就会意识到几乎有无限的可能性,只有天空才是极限。
随时和我联系,我会很高兴的。谢谢大家!
联系人
好的阅读,伟大的编码!
数据科学最佳 TED 演讲
数据科学,TED,值得传播的想法
这里列出了最精彩的 TED 演讲,这些演讲启发了你,并向你展示了数据的力量。
ED 是一个多元化的全球社区,通过简洁而有力的演讲传播改变世界的想法。代表技术、娱乐和设计的 TED 始于 1984 年的会议。今天,它在全世界用 100 种语言涵盖了从科学到商业,再到气候变化等全球性问题。
TED 演讲是一个很好的学习新事物的媒介,甚至可以激发你以前从未意识到的好奇心和隐藏的激情。话题如“什么造就了美好的生活?和伟大的领导者如何激励行动只是激励行动和成长的改变生活的想法的几个例子。
也就是说,蓬勃发展的数据科学领域现在也是 TED 演讲者的对话和想法。有许多演讲强调数据的力量,数据的好的一面和坏的一面等等。其中每一个都将为您提供与数据相关的见解。
因此,无论你是数据科学家还是对我们周围数据的指数增长感到好奇的人,这里有一些关于数据科学的最佳 TED 演讲,它们将拓展你的思维,并为你提供世界上最有价值的东西之一——知识。
会谈
Teemu Paananen 在 Unsplash 上拍摄的照片
**Index** 1\. How not to be ignorant about the world
2\. The Beauty of Data Visualization
3\. Three ways to spot a bad statistic
4\. Big Data is better data
5\. The human insight missing from Big Data
6\. Your company’s data could end world hunger
7\. Who Controls the World
1.如何不去无知这个世界
ted.com
主题:数据可视化
演讲人:《真实》
想法的作者汉斯·罗斯林:使用数据分析和可视化来揭穿我们头脑中的固有偏见和媒体对非常事件的不再现,这些事件植入了世界问题正在恶化的概念。他使用了一系列问题,向我们展示黑猩猩比我们人类更善于拥有正确的世界观,并让我们相信世界可能是坏的,但同时也在变得更好。
引用:
如果你对今天有一个基于事实的世界观,你可能有机会了解未来会发生什么。
2.数据可视化的美妙之处
ted.com
主题:数据可视化
演讲嘉宾 : 大卫·麦坎德斯,知名数据记者。
创意:将复杂的数据集转化为直观的图表,利用好的设计改变我们看待世界的方式。
引用:
设计是解决问题并提供优雅的解决方案,信息设计是解决信息问题。
3.识别错误统计数据的三种方法
ted.com
主题:统计学
演讲者 : Mona Chalabi,数据记者
想法:提问、解释和真正理解图表上的数字实际上在说什么的有用技巧。
引用:
但是你如何质疑政府的统计数据呢?你只是不停地检查一切。找出他们是如何收集数据的。确定您是否看到了图表上需要看到的所有内容。但不要完全放弃数字,因为如果你这样做,我们将在黑暗中做出公共政策决定,除了私人利益之外,什么都不用做。
4.大数据是更好的数据
主题:大数据
演讲人:肯尼斯·库基尔,《经济学人》
理念的数据分析师:大数据为我们提供了以不同方式看待我们生活的世界的工具,它可以通过增强机器学习等技术工具来解决人类最大的一些难题。
引用:
我们现在需要重新审视“我”这个信息,它不太明显,但在某些方面更重要。人类最终可以从收集到的信息中学习,这是我们了解世界和我们在其中的位置的永恒追求的一部分,这就是为什么大数据是一件大事。
5.大数据中缺失的人类洞察力
ted.com
主题:大数据
演讲嘉宾 : Tricia Wang ,全球科技民族志学者
观点:揭开大数据及其弊端的神秘面纱,建议世界重视“厚数据”——来自人们的有价值、不可量化的见解——以做出推动成功的最佳商业决策。
引用:
让我们把大数据和厚数据结合起来。让我们带着圣贤的圣殿指南,无论这项工作发生在公司、非营利组织、政府,甚至是软件领域,所有这些都很重要,因为这意味着我们共同致力于创造更好的数据、更好的算法、更好的产出和更好的决策。
6.你公司的数据可以结束世界饥饿
ted.com
主题:数据的价值
演讲人:UPS 高级技术组首席数据科学家 Mallory Freeman 博士
理念:私营企业如何通过捐赠未开发的数据而非金钱,为解决气候变化和世界饥饿等重大问题做出贡献。
引用:
数据慈善有很好的商业意义,也有助于人道主义世界的革命。如果我们在人道主义行动的所有主要方面协调规划和后勤,我们可以为成千上万的人提供食物、衣服和住所,公司需要站出来发挥作用,我知道他们可以在这场革命中发挥作用。
7.谁控制着世界
ted.com
主题:复杂性理论
演讲人:瑞士科学家詹姆斯·b·格拉茨菲尔德
观点:关于复杂性的开创性研究,以及它如何揭示经济如何运作。以及权力如何集中在少数人手中造成了我们社会的脆弱性。
引用:
与金融、经济、政治、社会相关的想法经常受到人们个人意识形态的影响。
播放列表
Clem Onojeghuo 在 Unsplash 上拍摄的照片
TED.com 网站上有很多精彩的播放列表,其中包括一系列与数据相关的演讲。从数据如何拯救生命的话题,到你在互联网上的数字足迹对你的影响。
1\. How data can save lives
2\. Making sense of too much data
3\. The dark side of data
4\. Art made of data
5\. What your data tells about you
1.数据如何拯救生命
一项关于我们可以做些什么来拯救每天聚集大量数据的世界的调查。
该播放列表包含 4 个讲座
以下是数据如何拯救生命
www.ted.com](https://www.ted.com/playlists/495/how_data_can_save_lives)
2.理解太多的数据
现在是大数据时代。但是,我们到底该如何处理这些信息呢?这些演讲探索了理解近乎无限的数据的实用的、道德的——以及壮观的可视化的——方法。
该播放列表包含 5 个讲座
这就是大数据时代
www.ted.com](https://www.ted.com/playlists/56/making_sense_of_too_much_data)
3.数据的阴暗面
数据可以用来做好事,用来推动社会进步,但也可能被滥用。了解大数据的一些隐藏的黑幕用途。
该播放列表包含 14 个讲座
以下是如何利用数据做好事…
www.ted.com](https://www.ted.com/playlists/130/the_dark_side_of_data)
4.数据构成的艺术
看到模式,创造美——数据可视化已经成为一种艺术形式。会见前卫艺术家,他们使用电子表格、档案和数字数据作为他们的颜料和画布。
该播放列表包含 5 个讲座
以下是数据如何被用于观察模式和创造美
www.ted.com](https://www.ted.com/playlists/201/art_from_data)
5.你的数据揭示了你的什么
你在网上分享的东西会比你想象的暴露更多吗?通过这些见解深刻的谈话,探索你的个人数据对你的影响。
该播放列表包含 10 个讲座
以下是你在网上的数字足迹如何揭示你的
www.ted.com](https://www.ted.com/playlists/374/what_your_data_reveals_about_y)
行动计划
由 Unsplash 上的 Ragnar Vorel 拍摄
T4:当你感到筋疲力尽,或者感到乏味时,去看看 TED 演讲。我发现 TED 演讲非常有教育意义和鼓舞人心,激励我继续朝着我的激情努力。
这些数据科学策划的 ted 演讲对于那些寻找数据及其在这个以人类为中心的时代的潜力的直观解释的人来说是有益的。此外,它们为未来提供了深刻的见解。
所以,不要在 Instagram 上翻来翻去,也不要看《网飞》,现在就去听一场 TED 演讲,做些笔记,花些时间反思并思考它如何应用到你的生活中。知识就像复利,学得越多,积累得越多。因此,让观看 TED 演讲成为一种日常习惯。你未来的自己会感谢你。
感谢您花时间阅读这篇文章,我希望它能激励您学习并帮助您更好地理解我们身边每天都在传播的指数数据。
请在评论中留下我错过的任何其他 TED 视频!
看看我的文章!
这里是我列出的最好的 ML 和数据科学网站,可以提供有价值的资源和新闻。
medium.com](https://medium.com/swlh/top-20-websites-for-machine-learning-and-data-science-d0b113130068)
联系人
如果你想了解我的最新文章,请关注我的媒体。
其他联系方式:
快乐学习!
可视化比例的最佳方法
可视化比例数据的三个关键图表
比例数据示例
无论您的数据分析和数据科学应用是什么,到处都有比例。比例是关于理解组成一个整体的不同部分。
比例很大程度上只是给定分类变量中某事物的计数。这可能是不同行业的客户数量、不同地区的销售电话数量、各种活动类型的活动数量,或者各种口味的冰淇淋甜筒的销售数量。如果你能数出来,并把它分成几组,那么你就得到了比例数据!
基本比例可视化
无论你是否熟悉“探索性数据分析”的概念;基本统计数据的简单绘图对任何分析都非常有帮助,尤其是当你正在建立理解的基础,这将通知你更复杂的分析。
甜蜜的想象
我将分解三种分析比例的可视化类型,它们将被证明是非常有用的:饼图、华夫饼图和条形图(想象它们实际上是枫糖条形图或糖果条形图,以“糖果”为主题)
馅饼时间
饼图的陷阱
- 显示角度和偏移角度的比例;会使饼图很难解释
- 一旦你在一个给定的馅饼中得到超过 3-5 个类,就很难比较相对比例——这里的全部目的…
- 好吧,让我们说是的,你可以对你的分类变量的任何给定水平或值的一般分配有一个概念…但是我们经常缺乏精确性,或者对任何给定的值集之间的差异的精确考虑。
使用饼图的可取之处
- 相反,饼状图对房地产来说是惊人的。它们很小,可以在一个小空间里包含大量的信息,而不是占用大量的空间。
- 根据你的受众,饼状图可以很容易让不知情的群体快速吸收一个给定的想法。
我们开始吧!
从使用 mtcars 数据集的组开始,让我们构建一个饼图。
首先,安装并加载ggplot2
(install.packages('ggplot2),然后是库(ggplot2),然后你就可以开始比赛了)
ggplot
的快速故障,
- 首先包括您正在处理的数据框架,在本例中是 mtcars
- 然后指定
aes()
-thetics……也就是你希望不同的变量出现在图上的地方 - 第一个是 x,所以不管你的分类变量是什么,你的桶,你的容器,你的冰淇淋口味;加在那里。
从这里开始,在底部抛出geom_bar()
,让你确切地知道你想要看到什么类型的图表。我们将直接进入语法,但是使用ggplot
,您可以有效地创建可视化对象,然后告诉该对象您想要如何使用它。
首先给你一个数据的快速概念;下面你可以看到我们正在按 cylinders 变量分组,并计算每个变量中的记录数。
counts <- mtcars %>%
group_by(cyl) %>%
summarise(n = n())
让我们把它扔进馅饼里!
ggplot(counts, aes(x = 1, y = n, fill = cyl)) +
geom_col()+
coord_polar(theta = 'y')
嘣!这是你的第一张饼状图。你会看到,无论你分组的分类变量是什么,都进入了颜色,而我写的计数或 n 进入了 y 美学。
你可能还会注意到geom_col()
命令和coord_polar()
为了说明coord_polar()
的目的,我将只运行geom_col()
ggplot(counts, aes(x = 1, y = n, fill = cyl)) +
geom_col()
如您所见,这是一个堆积条形图,其中包含了相关部分。打开coord_polar(theta = 'y')
,我们就可以将这个柱状图打包成一个饼状图。
馅饼的绝佳替代品?华夫饼!
好吧,所以你不喜欢派…华夫饼图表是一个很好的选择。虽然华夫饼图表类似于饼图,但它们实际上将分类变量的每个级别、类别或值编码为正方形的比例。
华夫饼图表的陷阱
- 与饼图类似,华夫饼干图很快会因为包含太多的类而陷入困境
- 绝对不要尝试分割华夫饼或饼状图…这不利于对“相对比例”进行合理的比较,而“相对比例”才是全部目的。
要为华夫饼图表准备数据,您需要将数值缩放到 1–100,加起来就是 100。为此我们将使用dplyr
( install.packages('dplyr')
,library(dplyr)
)。
您将在下面看到的是,我们根据分类对数据集进行分组,然后根据计数或n()
进行总结。然后,我们使用mutate
创建一个名为 percent 的新变量。这里最重要的是在我们的mutate()
函数中,我们正在创建这个缩放到 100 的值。
我们将设置 case_counts 的名称,然后运行waffle()
count <- mtcars %>%
group_by(cyl) %>%
summarise(n = n()) %>%
mutate(percent = round(n/sum(n)*100))case_counts <- count$percent
names(case_counts) <- count$cylwaffle(case_counts)
好了,我们上路了!
让我们用条形图来总结一下
对很多东西来说,棒线只是更好地建立了价值与价值的相对可比性。让我们展开馅饼,把它扔进酒吧。还要注意,这不是直方图。我们将气缸数视为一个分类变量。
library(ggplot2)
ggplot(mtcars, aes(x = as.factor(cyl))) +
geom_bar()
堆积条形图的最佳实践:不要孤立地制作它们,三个以后就没什么用了
关键是被比较的整体都共享同一个 y 轴
需要记住的是,任何超过三个变量的东西都很难解释。
为了对你的条形图重新排序,你需要确保分类变量是一个因子as.factor()
,然后改变级别到你想要的显示顺序
Ggplot 根据它在数据集中看到变量的顺序对条形图和图例进行排序。要覆盖这一点,将 disease 列转换成一个带有levels
的因子,按照我们希望我们的图使用的顺序。
mtcars %>%
factor(levels = c('2', '4', '6'))
这在组织你的情节以优化解释能力时经常会起到很大的作用
结论
享受使用比例图表和分类相关数据可视化的乐趣。随着您熟悉不同的图表技术,考虑不同的图表工具作为您可能在给定的数据类型和情况下使用的工具会对您有好处。
祝数据科学快乐!别忘了关注我的博客,获取更多与机器学习、数据可视化、数据争论和所有数据科学相关的博客!datasciencelessons.com。
贝塔分布——直觉、例子和推导
何时使用 Beta 版
贝塔分布是关于概率 T3 的概率分布*。例如,我们可以用它来模拟概率:你的广告的点击率,客户在你的网站上实际购买的转化率,读者为你的博客鼓掌的可能性,特朗普赢得第二个任期的可能性,乳腺癌女性的 5 年存活率,等等。*
因为贝塔分布模拟一个概率,所以它的范围在 0 和 1 之间。
1.为什么 Beta 发行版的 PDF 看起来是这样的?
维基百科摘录
直觉是什么?
我们暂且忽略 系数 1/B(α,β) 只看分子**x(α-1)*(1-x)(β-1)**因为 1/B(α,β) 只是一个归一化常数使函数积分为 1。
然后,分子中的术语——x 的乘方乘以 1-x 的乘方——看起来很熟悉。
我们以前见过这个吗?
👉是的。在二项分布中。
当我们从二项分布的角度来看时,对贝塔分布的直觉开始发挥作用。
X ~二项式(n,p)与 X ~β(α,β)
二项式和贝塔式的区别在于前者模拟成功的次数(x),而后者模拟成功的概率§。
换句话说,概率是二项式中的一个参数;在 Beta 中,概率是一个随机变量。
α、β 的解释
你可以把 α-1 想成成功的次数,把 β-1 想成失败的次数,就像二项式中的 n & n-x 项一样。
您可以选择α和β参数,但您认为它们应该是。如果你觉得成功的概率很高,就说 90%,对α 设 90,**对β设 10。**如果你不这么想,β90,α10。
随着 α 变大(更多成功事件),大部分概率分布将向右移动,而 β 的增加将分布向左移动(更多失败)。
同样,如果 α 和 β 都增加,分布将变窄,因为我们更加确定。
2.例子:概率的概率
假设某人同意和你约会的可能性遵循贝塔分布,其中 α = 2, β = 8。你的成功率大于 50%的概率是多少?
P(X>0.5)=1-CDF(0.5)= 0.01953
不好意思,很低。😢
爱荷华大学的 Bognar 博士制作了 Beta 分布的计算器,我觉得它既有用又漂亮。您可以试验不同的 α 和 β 值,并想象形状如何变化。
3.为什么我们使用贝塔分布?
如果我们只想用概率分布来模拟概率,那么(0,1)上的任意分布都可以。创建一个应该很容易。随便取一个在 0 到 1 之间的任何地方都不会爆炸并保持正值的函数,然后从 0 到 1 积分,简单地用那个结果除函数。你只是得到了一个概率分布,可以用来模拟概率。既然如此,为什么我们坚持使用贝塔分布而不是任意概率分布呢?
贝塔分布有什么特别之处?
贝塔分布是贝叶斯推理中伯努利分布、二项式分布、负二项式分布和几何分布的共轭先验(看起来那些是涉及成功&失败的分布)。
使用共轭先验计算后验概率是非常方便的,因为可以避免贝叶斯推理中涉及的昂贵的数值计算。
如果你不知道共轭先验或贝叶斯推理是什么,
先看
贝叶斯推理的艺术在于你如何实现它…](https://medium.com/@aerinykim/bayesian-inference-intuition-and-example-148fd8fb95d6)
然后
有两件事使得后验计算很昂贵。首先,我们计算每一个…](https://medium.com/@aerinykim/conjugate-prior-explained-75957dc80bfb)
作为一名数据/ML 科学家,你的模型永远不会完整。随着更多数据的到来,你必须更新你的模型(这就是为什么我们使用贝叶斯推理)。
贝叶斯推理中的计算可能非常繁重,有时甚至难以处理。但是如果我们可以使用共轭先验的封闭公式,计算就变得轻而易举了。
在我们的日期接受/拒绝示例中,beta 分布是二项式可能性之前的共轭分布。如果我们选择使用贝塔分布作为先验,在建模阶段,我们已经知道后验也将是贝塔分布。因此,在进行了更多的实验(请更多的人和你去约会)之后,你只需将接受和拒绝的次数分别加到现有的参数α,β上,就可以计算出后验概率,而不用将可能性乘以先验分布。
4.贝塔分布非常灵活。
贝塔分布的 PDF 可以是有渐近端的 U 型,钟型,严格递增/递减甚至直线。当您改变 α 或 β 时,分布的形状也会改变。
a .钟形
请注意, α = 8 和 β = 2 的 PDF 图形是蓝色的,而不是读取的。x 轴是成功的概率。
如果 α + β 足够大并且α & β近似相等,则β分布的 PDF 近似正态。
b .直线
测试版 PDF 也可以是直线!
c. U 形
当 **α < 1,β < 1,**β的 PDF 为 U 型。
形状背后的直觉
为什么 Beta(2,2)是钟形的?
如果你把 α-1 想成成功的次数,把 β-1 想成失败的次数,β(2,2) 表示你得到了 1 次成功,1 次失败。所以成功的概率最高为 0.5 是有道理的。
此外, Beta(1,1) 意味着头部和尾部都是零。那么,你对成功概率的猜测在整个[0,1]中应该是一样的。水平直线证实了这一点。
对于 Beta(0.5,0.5)有什么直觉?
为什么是 U 型?头尾为负(-0.5)是什么意思?
这个我还没有答案。我甚至在 Stackexchange 上问过这个问题,但还没有得到回复。如果你有关于 U 型 Beta 的好主意,请告诉我!
下面是生成上面美丽图形的代码。
5.经典推导:顺序统计量
我在学校学贝塔分布的时候,是从顺序统计量推导出来的。顺序统计并不是 Beta 分布最广泛的应用,但是它帮助我更深入地思考这个分布并更好地理解它。
让x1,x2,。。。、 X_n 为 iid 随机变量,PDF f ,CDF F 。
我们按照升序重新排列它们,这样 X_k 就是第 k 个最小的 X ,称为第 k 阶统计量。
a.最大 X 的密度是多少?
(不熟悉“密度”这个术语?阅读“PDF 不是概率”
b.k 阶统计量的密度是多少?
注意,我们不需要选择也不需要排列比 x 大的 X s。
c.如何利用 k 阶统计量推导出贝塔分布?
如果我们设置 X_1 , X_2 ,,会发生什么?。。, X_n 为 iid 均匀(0,1)随机变量?
为什么统一(0,1)?因为β的定义域是[0,1]。
均匀分布(0,1)的 CDF 为 x 。
在这里,我们有测试版!
6.β函数作为归一化常数
我之前提议过:
我们先忽略系数 1/B(α,β) …因为 1/B(α,β) 只是一个归一化常数使函数积分到 1。
要使β的 PDF 积分为 1, B(α,β)的值应该是多少?
B(α,β) 的值应该是多少?
B(α,β) 是从 0 到 1 的βPDF图下的面积。
7.用伽玛函数简化贝塔函数!
这一部分是给像我这样的瘾君子看的。
你可能已经看到了根据伽马函数的编写的测试版 PDF。β函数是每个参数的γ函数的乘积除以参数总和的γ函数的比值。
维基百科摘录
怎样才能证明 *B(α,β)=γ(α)γ(β)/γ(α+β)?
让我们以 α 和 β 为整数的特殊情况为例,从我们上面推导的内容开始。
我们得到了一个递归关系 B(α,β) = (α-1) * B(α-1,β+1) / β。
我们应该如何利用这种关系?
我们可以试着得到基本情况 B(1,*)。
证明得很漂亮!
心理科学更好的方框图
介绍
随着“复制革命”开创了行为科学数据透明的新时代,期刊编辑正在寻找不仅仅传达样本均值的数据可视化。
嗒哒!进入箱线图。因为它捕获了如此多方面的数据,所以箱线图有机会满足您所有的数据可视化需求。
唉,正常的盒子情节是不够的。主要原因是经典的箱线图倾向于描绘诸如中位数和四分位距之类的东西——不用于生成统计推断的数据方面。
盒子情节需要改头换面。
在本文中,我介绍了一个名为my_boxplot
的函数,它创建了一个“现代”箱线图,显示与统计推断相关的样本统计数据。它提供了各种各样的论点,让您可以轻松地定制您的情节。
总的来说,目的是帮助每个人轻松地在 r 中制作透明且信息丰富的盒状图。
本帖是“我的 _ 函数” 文章系列 的第二篇,呈现简单的函数,方便 R 初学者对数据的分析和可视化。第一个帖子使得 运行和打印线性回归的结果 。本文中的所有代码,连同函数脚本,都可以在我的 github 资源库 中找到。
背景
如果你和我一样,你第一次遇到盒子情节是在中学。在经典盒图中,盒中心代表组中值;方框边缘分别反映了第一个和第三个四分位数临界值的值;触须表示异常值的商定值(远离中值的两个四分位数范围)。
作者图片
在 R 的 ggplot()中创建时,盒状图通常如下所示:
require(tidyverse)ggplot(iris, aes(x = Species, y = Sepal.Width)) +
geom_boxplot()
ggplot 箱线图的默认设置。图片作者。
在上图中,我使用了iris
数据集来绘制不同鸢尾物种的萼片宽度。如你所见,刚毛藻似乎有最大的萼片宽度。我们还注意到 setosa 和 virginica 样本中的一些异常值。
缺点
传统上构建盒状图的问题在于,当涉及到行为科学时,它们没有告诉你任何你需要知道的东西。例如,在上面的图中,没有办法容易地目测物种之间的差异是否具有统计显著性。唯一容易推断出这一点的方法是,如果你有每个样本的标准误差或置信区间。经典的盒子剧情,这些都没讲!
重新思考盒子情节
为了社会科学的目的,是时候重新考虑盒子情节了。通过创造我们称之为“现代箱线图”的东西来做到这一点现代箱型地块的布局如下:
现代盒子情节
- 框中心:样本均值
- 盒边:平均值的标准误差
- 盒须 : 95%置信区间
通过这种方法,我们可以通过我们过去学过的标准目测过程,获得关于两个样本是否有显著差异的所有信息。它也比解决这个问题的其他 方法更干净、更美观。
该功能
我创建了一个名为my_boxplot
的函数,它允许您使用 R 和 ggplot()快速生成现代盒图。该函数包括几个参数,允许您自定义盒状图的外观。所有代码都可以在我的 github 库中获得。
让我们从最简单的版本开始,这将有助于我们看到函数的默认设置。这个函数调用iris
数据集,它内置于 base R 中
my.boxplot(iris,
x = "Species",
y = "Sepal.Width")
my_boxplot 的默认输出。图片作者。
该图描绘了与从 ggplot 默认设置中获得的信息非常不同的信息。具体来说,方框显示的是组平均值;方框边缘反映平均值的标准误差;盒须反映了 95%的置信区间,所有单独的数据点通过geom_dotplot
方法显示。
这样做的一个直接好处是,你可以很容易地看出两个平均值之间的差异是否显著。具体来说,我们可以说 setosa 样本明显大于任何其他物种。
调用my_boxplot
自动将两条有用的信息打印到控制台:一是显示每个盒子级别精确值的汇总表;第二,单向 ANOVA 检验样本均值之间的差异是否显著。
当您进行数据探索时,将这些元素自动打印到控制台可以节省大量时间。
在下一部分,我将解释在引擎盖下发生了什么。
它是如何工作的
my_boxplot
调用my_summary
函数,该函数生成相关信息的表格,包括平均值和置信区间的标准误差。然后,它通过使用反映这些参数的自定义值调用geom_boxplot
函数来绘制这些信息。
my_boxplot
还包括许多参数,允许对你的盒子图的外观进行几乎无限的定制,我将在下一节中介绍。
定制输出
所以你想让你的方框图漂亮。或者您想调整输出的某些方面。my_boxplot
允许使用许多不同的参数来定制您的方框图的外观和感觉。
显示数据
也许最重要的是,my_boxplot
允许你定制你想要的单个点在你的图形中出现的方式。我提供了三种不同的设置供您选择:“点图”(默认)、“抖动”和“计数”您也可以关闭数据点。
代码如下:
my.boxplot(iris,
x = "Species",
y = "Sepal.Width",
points = "none")my.boxplot(iris,
x = "Species",
y = "Sepal.Width",
points = "jitter")my.boxplot(iris,
x = "Species",
y = "Sepal.Width",
points = "count")
points = "none “、” jitter “和” count "的 my_boxplot 输出作者图片。
标签和颜色
您可以自定义 x 轴和 y 轴标签,以及框填充颜色。这里我也自定义抖动点的高度。在下面的例子中,我使用mtcars
数据集来绘制不同气缸(4、6 或 8)的汽车每加仑行驶的英里数。
注意,对于 mtcars 数据集,我必须将cyl
转换成一个因子,然后才能将其插入my_boxplot
所需的(分类)x 轴。我还使用了管道 %>%
操作符:这是magrittr
包中的一个救命特性,允许您以直观的方式将函数串在一起。
fills <- c("#838B8B", "#E0EEEE", "#79CDCD")mtcars %>% mutate(cyl = factor(cyl)) %>%
my.boxplot(x = "cyl",
y = "mpg",
points = "jitter",
jitter.height = 0,
xlab = "Cylinders",
ylab = "Miles Per Gallon",
fill = fills)
带有自定义填充颜色和轴标题的 my_boxplot。图片作者。
附加参数
篇幅不允许我展示函数中的所有参数,您可以使用这些参数来定制您的盒状图的外观。这里是函数参数的完整列表(如果您希望我在函数脚本中添加其他参数,请告诉我!):
xlab
: x 轴标题ylab
: y 轴标题width
:框宽fill
:填充颜色alpha
:框透明jitter.height
:垂直抖动量。宽度预设为条形宽度的 1/8。ci
:你想要的置信区间宽度。例如,您可以将设置为 90% (.9)或 99% (.99)points
:默认:"dotplot”
其他选项:"none”
、"count”
、"jitter”
text.angle
:这是 x 轴标签的角度。例如,如果需要适合长标签,请设置为 45。默认值= 0。text.size
:轴标题文本大小。默认值= 12。
更多定制
该函数(以及一般的 ggplot)的优点是,在调用该函数后,您总是可以在图形输出中添加限定符,就像向 ggplot 对象添加元素一样。在这里,我决定翻转坐标,并为图表添加一个标题。我还调整了盒子的宽度,以获得更具吸引力的外观:
my.boxplot(iris,
x = "Species",
y = "Sepal.Width",
width = .5) +
coord_flip() +
ggtitle("Species and sepal width") +
theme(plot.title = element_text(hjust = 0.5)) # center title
图片作者。
分组箱线图
行为科学经常关注两个变量之间的统计交互作用。所以有一个绘图选项是很有用的,它包括绘制交互和结果统计的能力。输入my_grouped_boxplot
。这个函数包含了它更简单的同类函数的所有功能,但是允许您包含一个额外的双向交互变量。(此处见脚本。)
这里我们使用内置的 R 数据集 ToothGrowth,它包含了一项研究不同剂量的维生素 C(“剂量”)和补充类型(“supp”)对豚鼠牙齿生长(“len”)的影响的实验结果。
ToothGrowth %>% mutate(supp = factor(supp,
labels = c("Orange Juice",
"Ascorbic Acid")),
dose = factor(dose)) %>%
my_grouped_boxplot(x = "dose",
y = "len",
group = "supp",
xlab = "Vitamin C Dose (mg/day)",
ylab = "Tooth Length") +
labs(fill = "Delivery Method")
图片作者。
这个函数带有基本版本中所有相同的参数。有益的是,我们还可以自动获得带有交互项的完整 2 x 2 方差分析的输出,以评估显著性。
结束语
本文的目的是提供一些方便的代码,用于轻松创建更适合心理科学的箱线图,因为它们可以轻松地比较均值和置信区间。
其他人已经开发了许多其他的方法来做这件事;例如,我的同事比利·布雷迪(Billy Brady)编写了一个脚本,用于创建一个定制的点状图(T1),以及其他一些方便的方法(T3),用于框状图可视化。
如果您在代码中遇到任何错误,或者您希望与我交流我在这里提供的任何信息,请联系我,我很乐意收到您的来信!你可以在这里找到我的电子邮件地址。
*引用本文:*尤德金,d . a .(2020 年 10 月)。"心理科学更好的方框图."中等。检索自https://medium . com/@ dyudkin/better-box plots-for-psychological-science-5 FBE 552 B2 eef。
关于作者
我是宾夕法尼亚大学社会和行为科学倡议的行为科学家,也是More Common的研究助理主任。我研究道德和政治极化。你可以在我的网站找到更多关于我工作的信息。
更好的数据加载:表格数据的 PyTorch 速度提高了 20 倍
一个简单的改变可以大大加快你的深度学习训练
深度学习:对速度的需求
在训练深度学习模型时,性能至关重要。数据集可能非常庞大,低效的训练意味着更慢的研究迭代、更少的超参数优化时间、更长的部署周期和更高的计算成本。
尽管如此,很难证明投入太多时间来加快速度是合理的,因为有许多潜在的死胡同需要探索。不过还好有一些速战速决的可用!
我将向您展示我在 PyTorch 中对表格数据的数据加载器所做的一个简单更改如何将训练速度提高了 20 倍,而没有对训练循环做任何更改!只是 PyTorch 标准数据加载器的简单替代。对于我看到的模型,16 分钟的迭代时间减少到了 40 秒!
并且不需要安装任何新的包,不需要进行任何底层代码更改,也不需要更改任何超参数。
研究/行业脱节
在监督学习中,快速浏览一下 Arxiv-Sanity 告诉我们,目前的顶级研究论文要么是关于图像的(无论是分类还是生成的 GANs),要么是文本的(主要是 BERT 的变体)。这些在传统机器学习没有机会的领域非常棒——但需要专业知识和大量的研究预算才能很好地执行。
另一方面,许多公司持有的大部分数据已经以漂亮的表格形式存在于数据库中。一些例子包括终身价值评估、点击优化和金融时间序列数据的客户详细信息。
表格数据有什么特别之处?
那么,为什么研究和工业之间的裂痕对我们来说是个问题呢?嗯,最先进的文本/视觉研究人员的需求与那些在表格数据集上进行监督学习的研究人员的需求非常不同。
表格形式的数据(即数据库表、Pandas 数据帧、NumPy 数组或 PyTorch 张量)在几个方面使事情变得更简单:
- 通过切片,可以从连续的内存块中获取训练批次。
- 没有每个样本的预处理成本,允许我们充分利用大批量训练来获得额外的速度(记住要提高学习率,这样我们就不会过度适应!).
- 如果你的数据集足够小,它可以一次性加载到 GPU 上。(虽然这在技术上对于文本/视觉数据也是可能的,但是那里的数据集往往更大,并且一些预处理步骤在 CPU 上更容易完成)。
这些优化对于表格数据是可行的,而对于文本/视觉数据是不可行的,因为有两个主要的不同之处:模型和数据。
**模型:**视觉研究倾向于使用大型深度卷积神经网络(CNNs 文本倾向于使用大型递归神经网络(rnn)或变压器;但是对于表格数据,简单的全连接深度神经网络(FCDNN)可以做得很好。虽然并非总是如此,但一般来说,视觉和文本模型需要更多的参数来学习比表格数据中变量之间的交互更细微的表示,因此向前和向后传递可能需要更长的时间。
数据:视觉数据往往被保存为充满图像的嵌套文件夹,这可能需要大量的预处理(裁剪、缩放、旋转等)。文本数据可以是大文件或其他文本流。这两者一般都会保存在磁盘上,从磁盘上批量加载。这不是问题,因为磁盘读/写速度不是这里的瓶颈—预处理或向后传递才是。另一方面,表格数据有一个很好的特性,可以很容易地以数组或张量的形式加载到连续的内存块中。表格数据的预处理往往是预先单独完成的,要么在数据库中进行,要么作为对数据集的矢量化操作进行。
不同类型监督学习研究的比较
PyTorch 和数据加载器
正如我们所看到的,加载表格数据真的非常容易和快速!因此,PyTorch 在默认情况下对表格数据非常有效……对吗?
原来不是!😩
就在上周,我在一些表格数据上训练 PyTorch 模型,并想知道训练需要这么长时间。我看不到任何明显的瓶颈,但出于某种原因,GPU 的使用率远低于预期。当我深入分析它时,我发现了罪魁祸首… 数据加载器。
**什么是数据加载器?**数据加载器做的事情与您想象的完全一样:它们将您的数据从任何地方(磁盘上、云中、内存中)加载到您的模型需要使用它的任何地方(RAM 或 GPU 内存中)。除此之外,他们还负责将您的数据分成不同的批次,进行重组,并在必要时对单个样本进行预处理。将这些代码封装在一个数据加载器中比分散在各处要好,因为这样可以让您的主要训练代码保持整洁。【PyTorch 官方教程也推荐使用数据加载器。
你如何使用它们?这取决于您拥有的数据类型。对于表格数据,PyTorch 的默认数据加载器可以接受一个 TensorDataset。这是训练所需张量的轻量级包装器,通常是 X(或特征)和 Y(或标签)张量。
data_set = TensorDataset(train_x, train_y)
train_batches = DataLoader(data_set, batch_size=1024, shuffle=False)
然后,您可以在训练循环中使用它:
for x_batch, y_batch in train_batches: optimizer.zero_grad() loss = loss_fn(model(x_batch), y_batch) loss.backward() optimizer.step() ...
**为什么这样不好?**这个看起来不错,当然也很干净!问题是,每次加载一个批处理时,PyTorch 的 DataLoader 对每个示例调用一次数据集上的__getitem__()
函数,并将它们连接起来,而不是一次性读取一个批处理作为一个大块!所以我们最终没有利用我们的表格数据集的优势。当我们使用大批量时,这尤其糟糕。
我们如何解决这个问题?简单——用下面的两行替换上面的前两行,并从这个文件中复制FastTensorDataLoader
的定义(这要归功于杰西·穆,对于这个答案在 PyTorch 论坛上):
train_batches = FastTensorDataLoader(train_x, train_y, batch_size=1024, shuffle=False)
FastTensorDataLoader
只是一个小型的定制类,除了 PyTorch 之外没有其他依赖——使用它不需要对你的训练代码做任何修改!它也支持混排,尽管下面的基准是针对非混排数据的。
**这有什么区别?**在我使用的基准测试集上,定制表格数据加载器的速度比基准测试快了 20 倍。在这种情况下,这意味着 10 个历元的运行不再需要 15 分钟,而是需要不到 40 秒——迭代速度的巨大差异!
两次几乎相同的跑步——除了一次超过 15 分钟,另一次不到一分钟!
这个基准测试是在的这篇自然论文中使用的希格斯数据集上运行的。它有 1100 万个示例,是比大多数公共表格 ML 数据集(可能很小)更真实的深度学习基准。).这是一个二元分类问题,有 21 个实值特征。很高兴看到,在进行任何超参数优化之前,我们可以在短短 40 秒的训练时间内,在测试集上达到超过 0.77 ROC AUC!虽然我们离报纸上的 0.88 还有一段距离。
我希望这有所帮助,并且你能够在你自己的训练代码中看到类似的速度提高!在实现了这一点之后,我发现了一些进一步的优化,导致了接近 100 倍的总加速!如果你想看更多,请留下评论,我们可以在后续文章中讨论这些内容。
关于如何自己运行基准代码,请参见附录。该示例包括运行默认 PyTorch 数据加载器(更快的自定义加载器)的代码,以及对结果进行计时和记录到 TensorBoard 的代码。
这篇文章是在 创世纪云 的计算能力的帮助下完成的:云 GPU 以令人难以置信的成本效率运行在冰岛的一个数据中心,使用 100%可再生能源。 注册 即可获得 50 美元的免费积分,让你在 GTX 1080Ti 上驾驶超过 160 小时!
关于作者:Harald 从事股票分析师工作超过八年,目前是一名自由研究员和作家。他的个人博客在www.harald.co。他经营着 ML 竞赛——一个正在进行的机器学习竞赛的目录——以及一个 云 GPU 比较 站点。
同一作者:
附录:运行基准测试
所以你可以自己看看结果,这是复制实验的说明。如果您已经安装了本地 GPU 和 PyTorch,您可以跳过前两步!
- 用你最喜欢的 GPU 云提供商创建一个新的 Ubuntu 18.04 实例(我用的是Genesis cloud——你注册时可以获得 100 美元的免费积分,这足够运行这个实验几百次了!).
2.使用 Lambda Stack 一气呵成的安装 CUDA 和 PyTorch:(做完这个别忘了重启!)
LAMBDA_REPO=$(mktemp) && \
wget -O${LAMBDA_REPO} [https://lambdalabs.com/static/misc/lambda-stack-repo.deb](https://lambdalabs.com/static/misc/lambda-stack-repo.deb) && \
sudo dpkg -i ${LAMBDA_REPO} && rm -f ${LAMBDA_REPO} && \
sudo apt-get update && \
sudo apt-get — yes upgrade && \
sudo apt-get install — yes — no-install-recommends lambda-server && \
sudo apt-get install — yes — no-install-recommends nvidia-headless-440 nvidia-utils-440 && \
sudo apt-get install — yes — no-install-recommends lambda-stack-cuda
3.下载数据集:
wget [http://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz](http://archive.ics.uci.edu/ml/machine-learning-databases/00280/HIGGS.csv.gz)
4.克隆存储库:
git clone [git@github.com](mailto:git@github.com):hcarlens/pytorch-tabular.git
5.运行基准脚本:
python3 pytorch-tabular/higgs_benchmark.py
如果你运行的是 GTX 1080 的实例,比如我使用的 Genesis Cloud,你应该会得到如下结果:
ubuntu@genesis:~$ python3 pytorch-tabular/higgs_benchmark.py
2020-04-12 15:05:55.961134: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0
Epoch 0 done.
Epoch 1 done.
Epoch 2 done.
Epoch 3 done.
Epoch 4 done.
Epoch 5 done.
Epoch 6 done.
Epoch 7 done.
Epoch 8 done.
Epoch 9 done.
Epoch 0 done.
Epoch 1 done.
Epoch 2 done.
Epoch 3 done.
Epoch 4 done.
Epoch 5 done.
Epoch 6 done.
Epoch 7 done.
Epoch 8 done.
Epoch 9 done.
Standard dataloader: 124.55s/epoch.
Custom dataloader: 5.24s/epoch.
使用蜂群图表实现更好的数据可视化
让我们使用 D3.js 创建一个交互式蜂群图表,以便更好地可视化您的数据。
单个数据集可以用来向观众传达许多不同的信息。这完全取决于你如何可视化数据。换句话说,这取决于你选择哪种图表或图形。大多数时候,人们只是抓住一个条形图或饼图。然而,你可以用更有趣的图表或图形将数据中的信息传达给你的观众——其中之一就是蜂群图表。
注:本文中的所有源代码(包括文档)都可以在 https://github.com/MartinHeinz/charts找到。
现场试玩可在https://martinheinz.github.io/charts/beeswarm/进行
蜜蜂-什么?
第一次听说蜂群图?好吧,让我们先来谈谈它到底是什么:
**beesworm图表是一维图表(或绘图)——或者换句话说——在单个轴(通常是 X 轴)上显示所有信息的图表。它将值显示为类似于散点图的点的集合。
当您想要一次显示大量数据点时,这种图表非常有用,例如,每个国家一个节点,这对于条形图或饼图来说是个问题。想象一个有 150 个楔形的饼图——不,谢谢。
此外,这使得发现离群值变得容易,因为它们不会是群体的一部分。
此图表的另一个特点是,您可以很好地可视化不同的比例(线性和对数)以及它们之间的转换,并为点着色以添加额外的维度(例如,国家的大陆)。
说得够多了,让我们来看一个例子:
实际上,我们将在这里使用的数据集是什么?嗯,在 kaggle.com上可以找到世卫组织自杀统计数据。可能是奇怪的选择,嗯?实际数据非常符合这种图表。所以,让我们看看我们能把它用得多好!
我们需要什么
在深入研究代码之前,让我们看一下我们将使用的库:
对于所有的绘图和可视化,我们将使用 D3.js 和普通的旧 Javascript。如果你不熟悉 D3.js —它代表数据驱动文档*,是操纵数据的 Javascript 库。D3.js 的主要优势在于它的灵活性——它给你的只是有效操作数据的函数。*
在本文中,我们将使用 D3.js 第 5 版,你需要做的就是在你的 HTML 中包含<script src="https://d3js.org/d3.v5.min.js">
(完整的代码清单在这里)。
除了 D3.js 我们还将使用材质设计精简版(MDL)来带来更好的用户体验。这是非常可选的,但每个人都喜欢一些花哨的材料设计按钮和下拉菜单,对不对?
类似于 D3.js ,我们只需要包含一个script
标签就可以开始使用了——<script defer src="https://code.getmdl.io/1.3.0/material.min.js"></script>
(完整代码清单此处)。
代码
搭建舞台
在我们开始操作任何数据之前,我们首先需要做一些初始设置:
首先,我们为width
、height
和margin
定义了一些全局变量,以及 3 个数据结构,用于比例、数据测量和绘图图例,我们将在余下的代码中使用它们。我们还使用这些来定义图表的初始状态,它存储在chartState
变量中。
接下来我们要定义的是图中所有节点(圆圈)的颜色:
为了创建一个配色方案,我们使用d3.scaleOrdinal
来创建从域(洲名)到范围(色码)的映射。然后,我们将这些颜色应用于 CSS IDs,它们被赋予 HTML GUI 中的复选框。
现在我们进入实际图表的代码。以下几行将准备 SVG,这将是我们的绘图区域:
上面创建svg
变量的第一个调用找到 ID 为svganchor
的<div>
,并将我们之前定义的宽度和高度的 SVG 元素附加到它上面。接下来,我们创建一个名为xScale
的函数——这个函数与前面使用的d3.scaleOrdinal
非常相似。它还创建了域和范围之间的映射,但域是连续的,而不是离散的。您可能已经注意到了,但是我们没有在这里指定域——这是因为我们还不知道数据集的范围,所以我们暂时保留它的默认值([0, 1]
)。
之后,我们将<g>
元素容器添加到现有的 SVG 元素中。这个元素将被用作 X 轴及其刻度的容器——这些将在我们实际绘制线条时添加。然而,我们现在可以设置它的 CSS 样式并把它移到 SVG 的底部,这样我们以后就不必处理它了。
这段代码的最后部分创建了一条线,当鼠标悬停在所述圆上时,该线连接 X 轴上的节点和点。你可以在下图中看到:
在开始操作数据集之前,我们想做的最后一件事是创建简单的 noes 工具提示:
目前,工具提示只是我们放入图表锚中的一个<div>
。我们也使它现在不可见,因为我们将在处理鼠标移动事件(悬停)时动态设置它的内容和不透明度。
加载数据
现在终于到了加载数据的时候了。我们使用d3.csv
函数来实现。该函数使用 fetch API 从 URL 获取 CSV 文件,并返回 Promise ,这需要以下代码结构:
我们剩下的所有代码都属于上述匿名函数的主体,因为加载的数据在那里对我们可用。
以下是数据加载前后的示例,以便更好地显示其结构:
之前:
之后:
听众
在进一步处理数据之前,让我们首先设置侦听器,它将对 GUI 中的按钮点击做出反应。我们希望用户能够在可视化与【总量】或【人均】测量以及线性或对数标度之间切换。
我们的 HTML GUI(源代码可以在这里找到)包含 2 组按钮。第一组——负责在“总数”和“人均”之间切换,可视化附带了 CSS 类.measure
。我们使用这个类来查询这组按钮,正如你在上面看到的。当单击这两个按钮中的一个时,我们获取被单击按钮的值,并相应地更改图表状态和图例文本,图例文本显示所使用的度量类型。
第二组(对)按钮在线性和对数刻度之间切换,也附加了 CSS 类(称为.scale
)并且与前一组类似——基于哪个按钮被点击来更新图表的状态。
这两个侦听器还会触发整个图表的重绘,以反映配置更改。这是通过使用redraw
功能来实现的,我们将在下一节中介绍。
除了这 4 个按钮,GUI 中还有几个复选框。点击这些过滤器,会显示各大洲的国家。
处理这些复选框点击是上述监听器的责任。它所做的只是触发filter
函数,该函数根据哪些复选框被选中,哪些没有被选中,在选择中添加/删除节点。
我们这里的最后一个事件侦听器是一个大事件。当鼠标悬停在乡村圆圈上时,它会显示和隐藏工具提示:
上面的代码看起来可能很复杂,但实际上非常简单。我们首先使用.countries
CSS 类选择所有节点。然后,我们将mousemove
事件绑定到所有这些节点。在事件期间,我们设置 HTML 的工具提示来显示关于这个节点的信息(国家名称,死亡人数)。此外,我们改变它的不透明度,使它在用户指向圆圈时可见,并将其位置设置在鼠标光标的右侧。
该函数体的其余部分呈现连接圆和 X 轴的虚线,以突出显示值在刻度上的位置。
我们还需要处理当我们将鼠标移出圆圈时的事件,否则,工具提示和线条将总是可见的,这就是mouseout
事件处理程序所负责的——它将这些元素的不透明度设置为0
,使它们不可见。
这些事件侦听器很好,但是我们需要实际处理和绘制数据来使用它们。所以,让我们就这么做吧!
画下一切
大部分数据处理是在一个名为redraw
的函数中完成的,我们在页面第一次加载时以及在各种事件中调用这个函数,我们在上一节中已经看到了。
该函数使用chartState
来决定如何绘制图表。开始时,根据chartState.scale
将刻度类型设置为线性或对数,并通过根据chartState.measure
的值在数据集的total
或perCapita
列中查找最小/最大值来决定图表域的范围*😗
我们需要基于chartState
创建的另一个东西是 X 轴。考虑到图表的方向,我们将使用底部轴(axisBottom
)并给它 10 个刻度。如果我们要可视化总数,我们将使用带有 SI 前缀(s
)和 1 个有效数字(.1
)的十进制符号。否则,它将是定点符号(f
),也有一个有效数字。
当轴和刻度准备好后,我们执行一个 1 秒钟的转换。在这 1 秒钟内,.call(xAxis)
通过执行axisBottom
发生器生成底部轴。
接下来是沿着 X 和 Y 轴将节点移动到其所需位置的模拟:
这是本文中比较复杂的片段之一,所以让我们一行一行地检查一下。在第一行,我们用指定的数据集创建模拟。在这个模拟中,我们应用定位力将节点沿着 X 轴推向期望的位置。该期望位置由xScale
函数返回,该函数通过将【总计】或【perca pita】列映射到图表的物理大小(范围)来计算。之后,我们使用strength
函数提高模拟速度。
与我们沿 X 轴施加力的方式相同,我们也需要沿 Y 轴施加力,这一次将节点推向图表的中线。我们应用的最后一个力是碰撞力,它防止节点碰撞,更具体地说,它使它们的中心相距 9 个像素。最后,我们调用stop
函数来停止模拟自动运行,而是在它下面的for
循环中执行。
我们创建并运行了模拟,但是针对什么呢?嗯,由以下代码创建的节点(圆圈):
这里,我们首先查询所有节点,并将数据集中的国家名称连接到这些节点。接下来对exit
和enter
选择的两个调用分别处理节点被移除和添加到选择中的情况(例如,复选框被勾选/取消勾选或页面被加载)。首先,对于退出选择,我们创建一个 1 秒钟的过渡,并将 X 轴上的中心点设置为零,将 Y 轴上的中心点设置为图表的中间。这样,当这些节点被添加回图表中时,它们将从单个点出来,就像您在演示中单击复选框时看到的那样。转换完成后,节点将被移除。
代码片段的其余部分——enter selection——实际上是设置节点的所有属性。我们设置它的 CSS 类,它的 X 轴和 Y 轴中心点,它的半径,并根据它所属的大陆用颜色填充它。然后,我们将这个选择合并到其余的节点(圆)中,并创建一个过渡,在接下来的 2 秒钟内将它们移动到所需的 X 和 Y 坐标。
结论
在本文中,我们深入研究了用 D3.js 实现蜂群图表*。本文的要点不应该是这种特定的实现,而是下一次可视化数据时,您可能希望考虑非传统类型的图表和绘图,因为这可能有助于您更好地向受众传达所需的信息。*
如果您想查看本文的完整代码清单,请访问我的知识库:https://github.com/MartinHeinz/charts。在这个报告中,您还可以找到使用的数据集和源,以及用 D3.js 实现的其他图表和绘图,就像这个平行坐标图(下一篇文章😉):
本文最初发布于martinheinz . dev
让我们在实现真实的 2D 物理模拟和可视化的同时享受一下 JavaScript 的乐趣吧!
towardsdatascience.com](/implementing-2d-physics-in-javascript-860a7b152785) [## 使用 PostgreSQL 的递归 SQL 查询
公共表表达式是 SQL 的一个鲜为人知的特性,它使得编写递归查询成为可能。
towardsdatascience.com](/recursive-sql-queries-with-postgresql-87e2a453f1b) [## 你可以用 GitHub API 和 Python 做的所有事情
GitHub REST API 允许您管理问题、分支、回购、提交等等,所以让我们看看您如何使用…
towardsdatascience.com](/all-the-things-you-can-do-with-github-api-and-python-f01790fca131)*
在石油和天然气勘探和生产中使用机器学习进行更好的决策
石油和天然气行业
石油和天然气是世界上最大和最重要的产业之一。它的范围不仅仅是为运输和发电提供燃料,而是支持这些活动和交易的众多服务。
根据2019财富全球 500 强,仅前 9 大石油天然气和能源公司创造的收入就达到了惊人的 3 万亿美元。
2019 年财富全球 500 强能源
原油价格的变化不仅仅是燃料价格的变化。食品、电力和消费品价格也将受到影响。为了寻找石油和天然气以满足不断增长的能源需求,地球物理学家收集并处理卫星图像,以检测地球重力和磁场的细微变化或异常,确定可能圈闭石油或天然气的岩石类型、地层和结构。探测到这些感兴趣的特征后,将使用能量波或地震波进行更详细的测绘。在海洋环境中,使用装备有能源的勘测船。能量源向水柱中反复发射压力波。在地面上,装有振动器的特殊卡车用于振动地面。在这两种情况下,能量源被发射到地下。这些波在岩石类型属性改变的界面上被反射。
如果附近有井可以获得现有的测井数据,地质学家和地球物理学家可以利用这些数据更好地开发现有和新地震剖面交叉的地质模型。不管是生产石油和天然气的井、干井还是废弃井,这些井都有可能是用放在钻孔中的地球物理传感器记录的。因此,地质学家可以对潜在油气储层的位置做出有根据的猜测。
测井
20 世纪 20 年代,法国兄弟康拉德和埃米尔·斯伦贝谢发明了一种被称为电缆测井的技术,开创了测井技术,这种技术至今仍在使用。他们后来成立了世界上最大的油田服务公司,斯伦贝谢公司。
电缆测井由测井车进行。嵌入有传感器以进行井下测量的金属圆筒被连接到电缆上,并被下放到井筒中。收集数据并传输到地面进行进一步分析。
钻井时,要仔细研究岩心样本、岩屑、测井记录和测试结果,以便尽可能多地了解井眼周围的区域。测井记录是一种收集有关已钻穿的地质地层的信息的手段,以确定地层深度、石油储量和许多其他关键信息。
我们经常想起大型石油公司获得的巨额收入和利润。事实上,从《财富》全球 500 强中获得的数据表明,这是千真万确的。然而,我们往往忽略了随之而来的巨大成本和高风险。事实上,并不是所有石油公司承担的项目都能盈利。或许,失败风险最大的领域莫过于该行业的上游勘探或生产部门。
多年来,石油和天然气技术和专业知识不断进步,勘探井的成功率从 1973 年的约 20%提高到 2012 年的约 70%。在油井中成功发现石油或天然气后,石油公司会在其附近钻探更多的油井。这些井被称为开发井。许多开发井没有 100%成功。
很可能一口井不经济,需要堵塞和废弃。关于是否完井或弃井的决定使其成为钻井过程中的一个点,称为套管点。这是钻井过程中的一个点,在此之后,油井已经到达目标储层,但是在生产套管已经安装和固井到位之前。
在本文中,我使用机器学习来解决这些挑战,方法是建立机器学习模型,从测井数据中预测经济上可行的油井或生产井。
机器学习平台
来自加利福尼亚州山景城的初创公司 H2O(www . H2O . AI)无人驾驶 AI (DAI) 的 AutoML 平台被用于根据测井数据预测经济上可行的油井。它内置了最先进的机器学习算法和可解释性功能。
戴为数据科学家配置机器学习实验提供基础和专家设置。在基本设置中有 4 个配置选项—准确性、时间、可解释性和计分器,如我之前发表的关于使用 DAI 解决 制药 和 音乐 行业的业务挑战的两篇文章中所述。
简而言之,准确性决定了在执行 ML 训练时使用哪些 ML 算法、集成模型和交叉验证。时间选项根据允许的迭代次数指定了相对时间,但是如果存在收敛,DAI 可能会执行提前停止。可解释性选项影响数据转换的复杂性,进而影响其可解释性。更多信息可在 H2O 文档页面获得。
在该实验中使用了以下配置:
这个实验中使用的 H2O 无人驾驶人工智能设置
数据
本实验使用的大型 ASCII 标准(LAS) 格式的测井数据来自堪萨斯大学 堪萨斯地质调查局 。
堪萨斯地质调查局数据下载页面
数据处理
LAS 文件有两个部分。标题部分包含元数据和关于测量井的一般信息。数据部分包含油井中各种参数的实际测量值。
随后在 R 进行探索性分析,以获得初步见解和数据质量。为了简洁起见,本文不讨论数据争论和洞察的详细步骤。
编写了一个 python 程序来将 LAS 原始文件解析为 CSV,以便在用于机器学习实验之前进行进一步处理。
下图显示了 LAS 数据文件的结构。它有两个部分,一个标题和一个数据部分。来自数据部分的细节用于构建机器学习训练的最终表格。
将 Python 中的 LAS 文件解析为 CSV
标签策略
数据的状态 2 栏用作标记的基础。具有表明经济上可行的石油和天然气生产商的状态的井被标记为 is_producer = 1 。状态 2 列的值如下:
- 生产
- 重新完成
- 转换为 EOR(强化采油)井
- 转换为生产井
具有状态 2值的记录被认为在经济上不可行,并被标记为 is_producer = 0。
对标记数据的状态列进行了进一步研究,以识别不打算用于油气生产的井,如服务井。这些记录已从数据中删除。标签数据的 5% 被留出用于样本外评估。其余的以 80:20 的比例分成 ML 训练集和测试集。
探索性数据分析
在 ML 训练开始之前,研究了由 DAI 生成的可视化。以下可视化图形是关联图,用于显示特征之间的关联:
在相关图中,中度相关的要素显示为蓝色线条,而高度相关的要素显示为红色。这些都是潜在的泄漏。因此,特性 FEFC 、 LWTLB 、 NPRS 、 PE 、仰角被排除在 ML 训练之外。
对所有特征进行了进一步的数据分布检查。那些只有单一值的,如下面的直方图所示,也被删除。
单值列的直方图示例
与 ML 训练无关的特征,如经度和纬度,海拔和其他几个被排除。
最后,钻孔越深,我们就越有可能发现是否有石油或天然气及其经济可行性。因此,深度造成泄漏风险,也排除在 ML 培训之外。在提供的 200 多项 ML 培训中,共有 64 项特征被排除在外。
模型性能
ML 训练后的实验设置和模型性能的结果总结如下:
模型性能总结
可变重要性
戴总共执行了 31 次迭代来构建 73 个模型,给出最佳 AUC 的最终模型是 LightGBM 。发现 48 个特征是重要的。下表按降序列出了 15 个最重要的排名:
样本外评估
样本外预测汇总
基于机器学习的商业决策
正确评估油井的生产潜力至关重要。如果油井被废弃,将无法收回花费在钻井上的资金,这些资金可能高达数百万到数亿美元。同时,完成一口井的成本通常等于或大于将井钻到套管点的成本。
在该实验中展示的这种高准确性表明了机器学习在辅助石油和天然气勘探和生产中的决策过程中的潜在应用。以下段落解释了本实验中构建的机器学习模型可以部署在决策管道中的何处。
钻井所涉及的费用可分为三个阶段 — 套管点前,套管点后和放线后。
在第一阶段,油井向下钻至目标储油层。这是在套管点之前进行的。在下套管时,必须根据测井数据分析和专家经验决定是否继续完井。如果储层可开采油气储量的利润不足以支付油井的总成本,此时封堵和弃井通常比完井更具成本效益。在这一阶段,没有收入,只有地质学家产生钻探前景、租赁面积、获得必要的钻探许可和准备钻探场地的成本。
下表描述了开发油井成本的不同阶段。第二和第三阶段的成本通常比下套管点之前高得多。该表还显示了机器学习模型在管道中的位置,以补充和改进决策过程。
未来的改进
油气生产的另一个挑战是废弃井。报废井主要是由于维护活动出错,留下送入工具、电线、塞子和其他材料被丢弃并经常卡在井中。
由于腐蚀、侵蚀、热应力等原因,油管或套管经常发生故障,导致套管损坏,进而引发油井水淹。当油井从生产井转为注入井时,也经常出现报废井。盐和页岩等可移动的岩层也是一些可能的原因。
目前,由油田服务公司(如 Schlumberger 和 Baker)提供的测井服务与使用软件(如 Landmark 和 Paradigm)的油管应力分析相结合,经常被用来解决报废井的问题。
通过使用机器学习,可以将来自测井记录、油管应力分析和服务提供商资料的数据输入 ML 算法,以生成准确的模型,从而在决定将油井从生产井转换为注入井之前预测遇到废弃油井的概率。这种方法可以帮助石油公司和服务提供商更好地做出决策,以防止废弃油井的发生。
更好、更快、更强的 Python 探索性数据分析(EDA)
用 4 行代码探索、清理和争论数据集
探索性数据分析(EDA)是理解大多数数据科学项目的基本步骤,无论是开发机器学习模型还是商业分析。该过程包括处理缺失数据、编码数据类型(连续、分类)、计算特征之间的关联-相关性、形成数据结构、构建设计图表(直方图、箱线图、时间序列等)…).由于数据量巨大,使用自动化库寻找更快分析的技巧是成为独角兽数据科学家的一个关键优势。在本文中,我们将回顾 4 个最成功的开源短 python 代码行,它们可以组合在一起构成一流的 EDA。在这篇文章中,我们将分析你可以在这里找到的巧克力棒评级数据集样本:巧克力棒。
- 熊猫 UI
Pandas_ui 是 bamboolib 的一个高效的开源替代方案。该软件包减少了数据预处理时间,结合 python 库(如 plotly、pandas、qgrid、ipywidgets 和 pandas profiling)创建了有用的可视化。使用此软件包,您可以删除列、编码分类要素、合并要素、过滤排序行、分组要素、数据类型、唯一值和缺失值计数、替换值、分位数统计(Q1 中值、Q3、最大值、范围、四分位间距)、描述性统计(平均值、众数、标准差、总和、中位数绝对偏差)、异常值、可视化(直方图)、相关性(皮尔逊矩阵)。最终专注于您的机器学习目标,节省数据探索步骤的时间。要使用这个包,你的电脑上需要一个装有 python 3.7 的 jupyter 笔记本(或 jupyter lab)。更多细节请参考本 github 。
pip install pandas_uijupyter nbextension enable — py qgrid — sys-prefixjupyter nbextension enable — py widgetsnbextension — sys-prefixfrom pandas_ui import *pdf =pandas_ui(“**../input/chocolate-bar-2020/chocolate.csv**”)pdf.to_file(output_file=**”pandas_ui1.html”**)get_df() # to get the data frame#get_meltdf() or get_pivotdf() # to get melt or pivot dataframes if you have created any.
巧克力评级数据集**上的 plot _ correlation(**图片由作者提供)
2.熊猫简介
Pandas_profiling 是一个开源的单行代码,它从 csv 数据集创建一个完整的 HTML 分析报告,用于快速准确的数据分析。使用此软件包,您可以轻松获得数据类型、唯一值和缺失值(计数、热图和树状图)、分位数(Q1 中值、Q3、最大值、范围、四分位数范围)、描述性统计数据(均值、众数、标准差、总和、中值绝对偏差、变异系数、峰度、偏斜度)、异常值、直方图等可视化、相关性(Spearman、Pearson 和 Kendall 矩阵)、文本分析(大写、空格、脚本和 ASCII 块)、文件和图像分析(尺寸、截断图像扫描)。要使用这个包,你的电脑上需要一个装有 python 3.7 的 jupyter 笔记本(或 jupyter lab)。
从 pandas 数据框架生成配置文件报告。pandas df.describe()函数很棒,但对于严肃的探索性数据分析来说有点基础。pandas_profiling 使用 df.profile_report()扩展了 pandas 数据帧,以便进行快速数据分析。
pip install pandas-profilingorconda install -c anaconda pandas-profilingfrom pandas_profiling import ProfileReportdf = pd.read_csv(‘**../input/chocolate-bar-2020/chocolate.csv**’)pr = ProfileReport(df)pr.to_file(output_file=”**pandas_profiling1.html**”)pr
巧克力评级数据集**(作者**图片)上的 matrix_correlation
更多细节请参考这个 GitHub 。
Photo by 甜心之枪 Sweetgun on Unsplash
- Sweetviz
Sweetviz 是一个很棒的两行代码,可以创建高密度的可视化 HTML 报告。使用此软件包,您可以通过目标值可视化对照其他特征(目标特征 y 的 A 与 B)轻松选择特征,比较两个数据集(训练 vas 测试)。此外,您还可以获得缺失值、分位数和描述性统计数据、直方图、不确定性相关性(分类-分类)、相关比率(分类-数值)。要使用这个包,你的电脑上需要一个装有 python 3.7 的 jupyter 笔记本(或 jupyter lab)。
安装 Sweetviz(使用 pip install sweetviz)后,只需像平常一样加载 panda 的数据帧,然后根据您的需要调用 analyze()、compare()或 compare_intra()(更多信息见下文)。完整的文档可以在 GitHub 上找到。现在,让我们从手头的案例开始,按如下方式加载:
df = pd.read_csv(‘**../input/chocolate-bar-2020/chocolate.csv**’)from sklearn.model_selection import train_test_splittrain, test = train_test_split(df, test_size=0.3)!pip install sweetvizimport sweetviz as svsweetviz_report = sv.analyze([df,”data”],target_feat=’rating’)sweetviz_report.show_html(‘**viz.html**’)df1 = sv.compare(train, test)df1.show_html(‘**Compare.html**’)
我们现在有 2 个数据框架(训练和测试),我们想分析目标值“评级”。这里互动报道更详细:这里
使用 Sweetviz (作者提供图片)进行训练和测试的比较
正方形代表分类特征相关变量的相关性。注意,为了清楚起见,平凡的对角线是空的。
4。Autoviz
Autoviz 是一个开源的单行代码,可以从 csv 数据集为大小数据集创建完整的 HTML 分析报告。有了这个软件包,您可以获得可视化效果,包括条形图、直方图、相关性热图、分位数和描述性统计。Autoviz 提供了一个一键式引擎 Auto Viz.io,您可以在线上传数据,并直接将完全免费的报告发送到您的电子邮件中。
AutoViz 可以通过 4 个简单的步骤实现:
!pip install autovizfrom autoviz.AutoViz_Class import AutoViz_ClassAV = AutoViz_Class()dft = AV.AutoViz(filename = “”, sep= ‘,’ , depVar=’rating’, dfte= df, header=0, verbose=2, lowess=False, chart_format=”svg”, max_rows_analyzed=2500, max_cols_analyzed= 21)dft.to_file(output_file=”**autoviz_profiling.html**”)
巧克力评级数据集**(作者提供**图片)上 autoviz 包的绘图功能
如果你有空闲时间,我建议你看看这个:
https://medium . com/swlh/EDA-explorative-data-analysis-e0f 453d 97894
总结
请参考此链接巧克力评级 EDA ,使用这些工具和其他众所周知的可视化工具对巧克力评级进行完整的 EDA 分析。
这个简单的概述提醒我们在数据科学中使用 python 进行探索性数据分析的重要性。这篇文章涵盖了制作完整的探索工作流的 4 个基本 Python EDA 工具,以及有用的文档。
希望你喜欢,继续探索!!!
mikita-yo 在 Unsplash 上拍摄的照片
基于树的模型的更好特性
树模型能看到什么,不能看到什么
当您了解模型如何工作时,创建成功的特征就变得容易多了。这是因为您可以推理模型的优缺点,并相应地准备特征。让我们一起来看看基于树的模型可以理解哪些特性,以及哪些特性对它来说更难使用(以及在这种情况下我们如何帮助模型)。
基于树的模型如何使用特征
我们将从仔细观察基于树的模型内部开始。
基于树的模型示例(由作者从 LightGBM 模型生成)
基于树的模型的主要构件是二元决策。它获取特定特性的值,并根据该值进行分割。许多这样的决策形成了决策树。许多树预测平均起来给出了模型预测。当然,这是对基于树的模型的非常简化的解释,但是它非常适合于理解成功的特性需要什么属性。
所需分裂(或所需二元决策)的数量是该特征的一个重要属性
鉴于二元性,基于树的模型擅长处理主要信号可以通过几次分割提取的特征。让我们来看看具有这种属性的一些特性。
为了更好地推理所需的分割,我们将使用“特性与目标”图。在 X 轴上,我们将特征值从最小到最大排序。在 Y 轴上,我们有每个特征值对应的目标值。此外,我们将使用分割线来区分我们希望考虑的低目标值和高目标值。
下面是一些需要一个或几个分割的特性的“特性与目标”图的例子,基于树的模型可以很好地处理这些特性。
需要一次/几次拆分的简单功能(作者可视化)
如您所见,基于树的模型擅长处理特征,其中图形不会经常从向上到向下改变方向,反之亦然。特征不需要是线性的,主要要求是它们不需要许多分裂点来分隔低和高目标值。
此外,基于树的模型的优点是处理特征交互的能力。这是指对于较小的要素 B 值,要素 A 以一种方式运行,但对于较大的要素 B 值,其行为会发生变化。不是所有的模型都能捕捉到这样的交互,但是基于树的模型处理起来非常自然。
现在让我们来看看一些特性,这些特性对于基于树的模型来说更难处理。
需要许多分割的硬特征(作者可视化)
一个特征捕获完整信号所需的分裂越多,所需的树就越深。但是有很多叶子的更深的树意味着更高的过度拟合风险。允许模型生长更深的树,并不意味着它将只对我们想要的特征进行分割。它可以使用分割来不必要地分割一些其他特征,从而导致捕捉噪声。
特征工程示例
现在,对我们的基于树的模型需要什么类型的特征有了一些直觉,让我们看一些如何实际转换特征以使它们更好的例子。
捕获重复模式
具有重复模式的特征(作者可视化)
这里我们可以看到一个具有某种重复模式的特征。具有类似模式的特征的一个真实例子是日期。在许多数据集中,有一个或多个日期要素。他们可以指定注册日期、出生日期、测量日期等等。日期要素的一个典型属性是,有时它们具有季节性成分。例如,目标变量可以取决于工作日——在周末,目标变量的行为与工作日不同。
我们的模型很难提取这样的信息。因为每个周末都需要两次分裂——把它从两边分开。另一个缺陷是,对精确的日期值进行分割将无助于预测未来看不见的数据,因为日期不会重复。
帮助我们的模型的最好方法是将模式提取为更简单的二进制特征“is_weekend”,其值“1”表示周末,“0”表示工作日。或者使用“工作日”特性更有效,每个工作日的值从 1 到 7。当我们在前面的例子中直观地看到这意味着什么时,我们正在减少必要的分割,以完全捕捉数据中的信号,从而使该功能对基于树的模型更加友好。
减少了基于树的模型捕获特征信号所需的分割(作者可视化)
基本上,我们将所有重复的时间间隔(如周)放在一起,让模型使用平均值来决定拆分。在上面的示例中,这允许我们将所需的拆分数量从 8 个减少到 2 个。如果您想知道这是如何在代码中实现的——我们简单地将这里的x mod 25
作为新的特征值,因为原始特征的重复间隔长度为 25。
我们可以通过减少模型捕捉信号所需的分割数量来改进特征
消除噪音
基于树的模型可能需要一些帮助的另一种情况是非常嘈杂的数据。考虑一些特征,其中的值非常嘈杂,但实际上,只有一个点是有意义的。如果我们知道这一点,我们可以通过自己进行必要的拆分来帮助模型。这可以通过将原始特征转换成二进制特征来实现。
噪声特征示例(作者可视化)
例如,我们在不同的日期在一家商店购买了很多东西,并且知道这家商店在某一天搬到了另一个地方。如果我们检查移动前后的平均值,相应的平均值将是 25 和 30。但是给定一个从 0 到 60 变化的高方差,模型很难确定正确的分割点。
在这个特殊的例子中,假设平均值发生了变化,最有可能的是,模型将设法在正确点附近的某个地方进行分割。但是,它可能会选择某个点向一侧或另一侧移动,从而导致围绕该移动点的预测更差。我们可以通过引入明确指定这一点的新特征来帮助该模型,例如,这可以是“new_location”特征,在移动之后所有行的值为 1,在移动之前的值为 0。
没有噪音的新功能(作者可视化)
当然,这样的转换需要一些领域知识和“专家决策”来选择正确的拆分点。但是当这是可能的时候,这样的特征可以极大地帮助模型避免不必要的错误分割,这可能导致对噪声的过度拟合。
更多关于基于树的模型能做什么/不能做什么
到目前为止,我们探索了基于树的模型如何使用特性,并查看了一些如何使用这些知识来修复或设计更好的特性的示例。
现在让我们谈谈在使用基于树的模型时可以帮助我们的其他考虑事项。
注意已知区间之外的特征值
基于树的模型的一个弱点是不能外推。简单地说,基于树的模型通常无法预测小于训练数据中最小值的值,或者大于训练集中最大值的值。
考虑特征 X 值和相应的目标 Y 值如下:
- X=1,Y=2
- X=2,Y=3
- X=3,Y=4
- X=4,Y= ?
任何简单的线性模型都会捕捉 X 和 Y 之间的线性关系,并且会正确地猜测最后的 Y 值。但是基于树的模型最有可能预测出 4 左右的值。而不是 5,这显然是正确的值。
为了理解原因,我们应该回忆一下基于树的模型是如何使用特征的——通过对它们进行分割。如果模型从未见过大于 3 的特征 X 值,它就没有办法对更大的值进行分割。因此,所有大于 3 的 X 值将被基于树的模型完全相同地对待。
现在,我们能帮助一个模型克服这一点吗?一般来说——不,我们不能以任何方式强迫一个模型在已知的特征区间之外进行分割。
基于树的模型无法对训练数据中出现的间隔之外的特征值进行拆分,因此无法区分它们。
围绕这一限制实际上存在一些方法,但是这些方法通常涉及目标值的转换——因此我在这里不考虑它们,因为在本文中我只想关注转换/创建特性。我可以给你一些关于这些方法的方向的线索。例如,有时有可能预测的不是实际目标值,而是与某个先前值的差值,并且最终通过逐个递增地添加与先前值的预测差值来重建实际目标值。
不需要缩放或标准化
使用基于树的模型时,不需要缩放或标准化数据。为什么?因为在从 0 到 1 的区间中以 0.8 进行分割与在例如从-100 到 900 的区间中以 700 进行分割一样困难(或容易)。
为了直观地看到它,让我们为一些随机特性绘制“特性与目标”图,这些特性的值在 30 到 130 之间。让我们为相同的特征绘制相同的图,但是在归一化到区间(0,1)之后。
规范化不会影响所需的拆分数量(作者的可视化)
注意,唯一改变的是 X 轴的比例。该模型将需要与标准化之前完全相同的分割,以分离低目标值和高目标值。
类似地,基于树的模型对特征中的异常值不敏感(与例如线性模型相反)。
结论
尽管最近深度学习取得了不可否认的进步,但基于树的模型仍然非常有竞争力。如果我们谈论表格数据,在许多(如果不是大多数)情况下,具有精确特征工程的基于树的模型仍然可以胜过深度学习方法,这被许多 Kaggle 竞赛结果所证明。在基于树的模型中,特征工程是成功的关键。但是理解模型的基础结构和操作是成功的特征工程的关键。
弗兰基·查马基在 Unsplash 上拍摄的照片
希望你在这篇文章中找到一些有趣的、有用的东西,感谢你的阅读!关注我,不要错过更多关于机器学习的文章。
使用冰山来管理利益相关者的期望
数据洞察冰山有助于管理数据项目中的预期
在数据科学/数据洞察/数据可视化项目的早期阶段,管理利益相关者的期望可能特别具有挑战性。对于不太熟悉数据项目挑战的非技术涉众来说尤其如此。
数据来源和相关分析可能特别耗时。这些工作的大部分是不可见的,很难交流,因此出现了数据洞察冰山。
数据洞察冰山是表现这些项目的好方法。大部分工作都在水下进行。
来自 TAR 解决方案的数据洞察冰山
幸运的是,并非所有这些“水下”工作对于所有数据洞察项目都是必要的。每个公司都有不同级别的数据基础设施和成熟度。
数据洞察冰山的水面下发生了什么?
洞察和分析项目需要一个关键要素。没有这个要素,项目甚至在开始之前就会失败。优质数据。
然而,在获取数据之前,了解客户/用户想要什么是很关键的。
一般来说,人们很难清楚地说出哪些信息对他们有用。他们真正想要的是什么。通常这是因为他们不知道。他们有一种感觉,他们想要类似 X 的东西,但直到他们开始看到 X,他们才真正知道。
在知道您是否有高质量的数据之前,那些可能“松散”的需求需要工作到可能的数据源系统中。
下一步是从确定的系统中获取数据。来源于真实数据,而不是测试数据。如果您向业务用户展示一个带有测试数据的仪表板,您可能收到的唯一反馈是,“这个数字是错误的”。
获取数据可能非常耗时。如果没有数据提供者的充分合作,这可能会非常耗时。
假设获取数据一切顺利,每个数据集都需要分析和理解。
数据看起来正确吗?它与源系统匹配吗?应该怎么用?有需要了解的业务规则吗?它如何连接到其他数据源?
有许多关于数据的问题,它们都需要一个答案。理解数据对于提供准确的见解非常重要。
然后,这些数据源需要连接/混合。这通常意味着编写 ETL 过程来适当地映射数据。这也需要时间。
在加入过程结束时得出的数据是准确的,这一点很关键。这些 ETL 输出构成了产生业务洞察的基础。
一旦数据步骤完成,将数据转换成有用的业务信息才真正开始。
洞察力通常呈现在仪表板中。这些是企业希望看到的;吃水线以上的那块冰山。
最终,利益相关者将会如何评价你的项目。
管理利益相关者的期望
由于所有的工作都发生在水线以下,很难管理利益相关者的期望。
在数据基础设施相对成熟的组织中,快速创造洞察力更加简单。因此,管理预期要简单得多。
如果你能从好的数据开始,那么很快就能产生洞察力。
然而,对于那些数据基础设施不太成熟的组织来说,这可能更具挑战性。
开始需要获取大量数据的项目在开始时往往比较棘手。大量的时间将花在冰山的底部,在水线以下工作。
当工作对业务涉众不可见时,管理期望就变得更加重要。
最好的选择是创建一个显示已知数据源的矩阵。该矩阵应:
- 指明来源提供商
- 标记数据是否已获得—有时这可能需要几个月的时间
- 指出是否已对其进行分析
- 显示所含数据的质量
- 标记发现的任何问题
这可能是向企业高级管理层展示进展的最佳选择。对于许多利益相关者来说,PowerPoint 幻灯片比展示 ETL 工作流更容易阅读和理解!
最终,这些冰山项目中的沟通必须是稳固的。
这可能不是开发商的过错,事情比预期的时间长。然而,这也往往容易归咎于开发商。
因此,管理涉众的期望可能是项目成功和失败的区别。
TAR Solutions 专注于 Tableau 和 Alteryx,为金融服务机构 提供数据洞察项目。
在 R 中使用因子模型蒙特卡罗获得更好的投资组合绩效
摩纳哥。蒙特卡洛赌场的位置。由马克·德容在 Unsplash 上拍摄的照片
来自《走向数据科学》编辑的提示: 虽然我们允许独立作者根据我们的 规则和指导方针 发表文章,但我们并不认可每个作者的贡献。你不应该在没有寻求专业建议的情况下依赖一个作者的作品。详见我们的 读者术语 。
评估投资组合经理时的一个常见问题是,回报的历史通常很短,因此对风险和业绩衡量的估计可能非常不可靠。在测试新的交易策略时,也会出现类似的问题。即使你对策略的表现有相当长的历史,但你通常只对一个市场周期进行观察,这使得很难评估你的策略在其他市场的表现。如果你交易股票,你可能听过这样一句话:“我从未见过糟糕的回溯测试”。
解决这一缺陷的一种方法是通过因素模型蒙特卡罗(FMMC) 。FMMC 可以用来估计一个因素模型的基础上,一套金融和经济因素,可靠地解释了基金经理的回报。然后,我们可以模拟回报率,以确定经理在各种市场环境下的表现。最终的结果是一个模型,它产生了比我们简单地使用可用的收益序列更好的风险和性能估计。
任务和设置
在这个案例研究中,我们将分析新对冲基金王高对冲基金的回报;以下简称 AHF 。对冲基金的案例尤其有趣,因为对冲基金可以使用杠杆,投资于任何资产类别,做多或做空,并使用许多不同的工具。对冲基金通常对自己的策略和持股非常保密。因此,有一个可靠的风险模型来解释他们的回报来源是至关重要的。
请记住,王高的对冲基金不是真正的对冲基金(我是王高,我没有对冲基金),但这是一个真实的系列收益。我获得了我们在我工作的地方投资的对冲基金的运营回报,因此这项研究的结果适用于现实世界。
我们有王高对冲基金从 2010 年 1 月到 2020 年 3 月的数据。为了这篇文章的目的和评估我们模型的准确性,我们将假设好像 AHF 是一个非常新的场景,我们只有 2017 年 1 月到 2020 年 3 月的数据。为了克服数据不足,我们将在此“观察数据”的基础上建立一个因素模型,然后利用整个数据系列来评估我们评估风险和性能统计的模拟的准确性。
下图显示了自 2010 年 1 月以来 AHF 的累计回报。红线右边的数据代表“观察周期”。
我们将在 R 中使用大量可用的软件包进行分析,包括:性能分析和 quantmod 。除了对冲基金收益系列,所有的因素数据都可以从雅虎免费获得。金融,美联储圣路易斯银行弗雷德数据库,以及瑞士瑞信银行对冲基金指数;你必须在瑞士瑞信银行注册才能访问这些指数,但仍然是……免费的。
模型估计
经验金融学的一个常用技巧是基于一组常见的风险因素来解释资产价格的变化。最简单和最著名的因素模型是威廉夏普的资本资产定价模型(CAPM)。资本资产定价模型规定如下:
其中:
- ri =资产“I”的返还
- m =市场指数“m”的回报
- ∞=超额回报
- =暴露于市场风险因素
- ɛi =特殊误差项
市场风险,或“系统性”风险,是对金融资产所面临的所有风险的一种概括衡量。这可能包括经济衰退、通货膨胀、利率变化、政治动荡、自然灾害等。市场风险通常由大型指数(如标准普尔 500 指数)的回报来代表,不能通过分散投资来降低。
(即 Beta)代表资产的市场风险敞口。β= 1 意味着资产和市场一样有风险,β> 1 意味着比市场风险更大,而β< 1 意味着风险更小。
ɛ是一种特殊风险,代表无法用市场风险因素解释的那部分回报。
我们将扩展 CAPM 以包括额外的风险因素,文献表明这些因素对解释资产回报很重要。王高的对冲基金使用许多不同的资产类别和工具来运行一个复杂的策略,因此它暴露于传统市场指数之外的更广泛的风险当然是合理的。我们的因素模型的一般形式如下:
上面所说的是收益®由一组风险因子 j=1…k 来解释,其中 r j 是因子“j”的收益,j 是风险敞口。ɛ是一个特殊的错误。因此,如果我们可以估计 j,那么我们就可以利用长期的因素回报(r j)来计算 AHF 的条件回报。最后,如果我们可以合理地估计ɛ的分布,那么我们就可以在 AHF 的收益序列中建立随机性。这使我们能够充分捕捉我们可以观察到的各种回报。
FMMC 方法将分为三个部分:
- A 部分:数据采集、清理和处理
- B 部分:模型估计
- C 部分:蒙特卡罗模拟
A 部分:数据采集、清理和处理
对于因子模型,我将使用一组金融和经济变量,旨在衡量不同来源的风险和回报。同样,本研究中使用的所有数据都可以从 Yahoo!金融、弗雷德数据库和瑞士瑞信银行。
我们将从弗雷德的数据开始。在每个变量旁边,我放置了唯一的标识符,您可以从数据库中查询。
弗雷德变量:
- 未来 5 年的 5 年通胀预期。(T5YIFRM)
- 期限利差:10 年减 3 个月国债收益率利差。(T10Y3M)
- 信用利差溢价:穆迪的 Baa 公司债券收益率减去 10 年期美国国债收益率。(BAA10Y)
- 3 个月期国库券利率。(DGS3MO)
- TED 利差:3 个月 LIBOR 减去 3 个月国债收益率。(TEDRATE)
- 国际债券收益率:欧元区 10 年期政府债券收益率。(IRLTLT01EZM156N)
- 公司债券总回报指数:ICE BofAML Corp 债券总回报指数;分层次。(BAMLCC0A0CMTRIV)
- CBOE 波动率指数(即 VIX)。(VIXCLS)
- 美国 10 年期国债(即 VIX 国债)的 CBOE 波动率指数。(VXTYN)
FRED API 有一些不足之处,不允许您以一致的方式提取数据。AHF 的回报是每月的,所以我们的模型将需要使用每月数据进行估计。但是,FRED 以最高的可用频率检索数据,因此每日数据总是以每日形式出现。此外,数据是从系列的开始检索的,所以您最终会得到许多 NAs。因此,在我们继续之前,我们需要做一些清理工作。
下面的 R 代码段展示了如何将标识符加载到变量中,并分别向 FRED 查询每日和每月的数据。每日数据被清理并转换为每月频率。我已经尽可能多地注释了代码,这样你就可以看到发生了什么。
弗雷德的数据准备好了。我们需要的另一组变量是金融市场指数。增长、价值和规模指数在资产定价模型中占据显著地位,如 Fama-French 三因素模型,我在这里采用了同样的方法。金融指数的回报来自历史悠久的雅虎!金融。
雅虎!财务变量:
- 价值:罗素 1000 价值指数(^RLV)
- 增长:罗素 1000 增长指数(^RLG)
- 规模:罗素 2000 指数(^RUT)
- 市场:标准普尔 500 指数(^GSPC)
- 国际:EAFE 摩根斯坦利资本国际公司
- 债券:巴克莱综合债券指数(AGG)
最后,我们将加载瑞士瑞信银行(CS)提供的对冲基金特定指数。获取指数需要一些额外的步骤,因为数据需要从瑞士瑞信银行网站手动下载到 Excel,然后加载到 r 中。每个指数对应一个特定的对冲基金策略。
瑞士瑞信银行变量:
- 可转换债券套利指数
- 新兴和前沿市场指数
- 股票市场中性指数(EQ_Neutral)
- 事件驱动索引(DRV EVT)
- 困境机会指数
- 多策略事件驱动索引(MS_EVT)
- 事件驱动风险套利指数(RISK_ARB)
- 固定收益套利指数
- 全局宏索引(GL_MACRO)
- 股票多空指数
- 管理期货指数(MNGD_FT)
- 多策略对冲基金指数(MS_HF)
B 部分:模型估计
回想一下,出于本案例研究的目的,我们“假装”好像我们只有从 2017 年 1 月到 2020 年 3 月(即样本期)的 AHF 数据。事实上,我们有 2010 年 1 月的数据。我们将使用样本期的数据来校准因子模型,然后将模拟结果与 2010 年 1 月至 2020 年 3 月期间的长期风险和绩效进行比较。
模型估计有 2 个步骤:
- **估计因子模型:**使用资产和因子回报的普通“短期”历史,计算具有截距、因子βj = 1…k 和残差的因子模型
- **估计误差密度:**使用因子模型的残差来拟合合适的密度函数,我们可以从中得出。
我已经提出了 27 个风险因素来解释 AHF 的回报,但是我不知道哪一个是最好的预测。可能有些因素是不相关的,降低了模型的解释力。为了选择一个最优的模型,我使用了一个基于调整 R2 的最佳子集选择算法。leaps 对建议的变量进行详尽的基于回归的搜索,并选择具有最高调整 R2 的模型。该算法提出以下 14 因素模型,调整后 R2 为 0.9918:
- 罗素 1000 价值(RLV)
- 罗素 2000 指数
- 标准普尔 500 (GSPC)
- 摩根士丹利资本国际 EAFE 公司
- 巴克莱综合债券指数
- 公司债券总回报指数
- 维克斯
- VIX 财政部(VIX)
- 可转换债券套利指数
- 股票市场中性指数(EQ_Neutral)
- 多策略事件驱动索引(MS_EVT)
- 股票多空指数
- 管理期货指数(MNGD_FT)
- 多策略对冲基金指数(MS_HF)
现在,我们已经选择了我们的变量,我们可以估计校准因子模型,看看它是如何做的。
基于回归的结果,我们观察到急性心力衰竭明显暴露于传统的风险来源。具体来说,AHF 似乎交易股票和债券,并可能利用衍生品进行对冲或投机。
对标准普尔 500 (GSPC)和摩根士丹利资本国际(EFA)指数的积极投资表明,AHF 交易全球股票,并有长期偏好。AGG 的正值进一步表明,他们交易固定收益产品,但基于公司债券总回报指数(corp. tr)的负系数,他们可能略微偏好美国国债。各种对冲基金策略的总体显著结果表明,AHF 采用了复杂的交易策略,并可能使用期货等衍生品(对 CS 管理的期货指数 MGND_FT 而言具有非常重要的价值)。期货可用于对冲头寸或进入特定市场。
AHF 的已实现回报与模型拟合值的关系图显示了很高的拟合度和解释力。
C 部分:模拟
参数和非参数蒙特卡罗方法都广泛应用于实证金融学,但都给估计带来了挑战。
因子密度的参数估计需要拟合一个大的多变量、厚尾概率分布;在我们的具体例子中包含 14 个变量。众所周知,相关性是不稳定的,对方差-协方差矩阵的不准确估计会使我们从中得出因子收益的分布产生偏差。这个问题可以通过使用 copula 方法来解决,但这增加了模型的复杂性。总的来说,如果可能的话,我们希望避免参数估计。
一个潜在的替代方法是非参数估计。为了进行非参数模拟,我们可以引导观察到的离散经验分布,该分布为 t=1…T 的每个观察到的因子回报分配 1/T 的概率。这将作为因子回报的真实密度的代理,并允许我们绕过估计相关性的混乱过程。然而,bootstrap 重采样会导致一些值的重复和其他值的遗漏,虽然这可能适合于推断,但在我们的应用中并没有提供明显的优势。
一个更有效的方法是简单地取给定的相对长历史的因子回报,并加上每个残差。简而言之,我们有 123 个月的因子回报(2010 年 1 月至 2020 年 3 月)和 39 个残差(基于 2017 年 1 月至 2020 年 3 月的校准组合结果)。如果我们将 39 个残差中的每一个添加到 123 个因子回报中,我们可以为 AHF 的回报产生 123×39 个场景(总共 4797 个观测值)。这个大样本应该能够为我们提供对 AHF 收益率分布尾部的深入了解,并且具有利用所有观测数据的优势。
模拟过程如下:
- 使用校准后的模型和因子回报,对 2010 年 1 月至 2020 年 3 月的 AHF 回报进行预测。
- 对于每个“I”,i = 1…123,估计回报,加上每个“j”,j=1…39,残差。
技术性能分析
回想一下,当我们介绍这个练习时,我们假装只有 AHF 从 2017 年 1 月到 2020 年 3 月的业绩历史。如此短暂的业绩历史仅提供了对基金经理在相对狭窄的市场条件窗口内的风险/回报特征的有限洞察。为了解决这一缺点并提供更准确的性能描述,我们建议使用因子模型蒙特卡罗(FMMC)。因子模型是使用因子和基金回报的简短、共同的历史来校准的。蒙特卡洛实验使用更长时间范围(2010 年 1 月至 2020 年 3 月)的因子回报和已实现因子模型残差来构建 AHF 的 4797 个模拟回报。
为了评估我们的模型的性能,我们将重点关注平均年回报率和波动性的结果,以及古老的夏普和索蒂诺比率。让我们看看我们做得怎么样。
1。平均回报率
下表描述了因子模型蒙特卡罗(FMMC)、AHF 完整历史(2010 年 1 月-2020 年 3 月)和截断/“观察”历史(2017 年 1 月-2020 年 3 月)的平均年回报率:
我们很快就能看到 FMMC 模型在截断周期内的改进。FMMC 模型能够完全捕捉 AHF 的回报动态,而截断的回报大大低估了全部历史均值。
2。波动性
仅仅对平均值的精确估计不能支持我们的模型是稳健的这一说法。同样重要的是波动性。下表显示了所考虑的每个时期的年化波动率(即标准差):
FMMC 估计值和截断估计值都略微低于整个时期内 AHF 的实际波动率。然而,两者估计非常接近。
3。夏普比率
有了均值和波动率估计,我们现在可以计算夏普比率。夏普比率计算如下:
在测试期的大部分时间里(2010 年 1 月至 2020 年 3 月),3 个月期国债收益率代表的无风险利率非常接近 0%。为简单起见,我们将采用 0%作为计算的无风险利率。下表显示了结果:
FMMC 估计表明,在估计急性心力衰竭的夏普比率时,比截断估计有显著的改进。这并不奇怪,因为上面我们显示了截断期的平均收益很差,而 FMMC 的估计值非常接近。这自然会反映到夏普的结果中,但是,结果再次显示了 FMMC 方法的效用。
4。排序比
最后,我们转向索提诺比率。Sortino 与 Sharpe 相似,但它关注的不是总体波动性,而是所谓的“下跌波动性”;或者低于规定阈值的回报率的标准差。通常,阈值被设置为 0%;这种观点认为,不稳定的正回报并不被认为是“坏的”,因为你仍在赚钱,但不稳定的负回报表明出现巨额亏损的可能性极大。更高的比率被认为更好。Sortino 比率计算如下:
下表描述了结果:
FMMC 的估计非常接近整个时期,准确地表达了下行回报的波动性。由于较低的平均回报率和更大的下行波动性,我们看到了比截断估计值更低的显著改善。
结论意见
经理评估是投资金融中最古老、最常见的问题之一。当基金经理的业绩记录很短时,可能很难评估该策略的有效性,这对基金经理和基金分配者都有影响。
在这篇文章中,我们介绍了因子模型蒙特卡罗(FMMC) 作为短期历史问题的一种可能的解决方案,并使用了真实世界的例子王高的对冲基金(AHF) 来展示它的功效。通过使用一个因素模型和共同的,基金和因素回报的短期历史,我们估计了 AHF 暴露于不同来源的经济和市场风险。然后,我们能够模拟 AHF 的回报,以构建更长的回报历史,从而更好地了解基金的长期表现。
FMMC 方法的结果显示,与单独使用短期历史回报相比,有了显著的改进。使用 AHF 的全部回报历史作为比较,我们看到 FMMC 方法准确地模拟了该基金的回报、波动性、夏普和索蒂诺比率。相比之下,被截断的回报历史严重低估了 AHF 的表现,这将导致误导投资者的后果。
因素模型蒙特卡洛已被证明是一种有效的技术,为复杂的战略风险和回报建模,并作为一个强大的补充基金分析师的工具包。
下次见,感谢阅读!
王高·莱克丝。
原载于 2020 年 8 月 28 日http://light finance . blog。