更清晰的蒙特卡罗模拟图
展示 1000 次模拟结果的快速指南
不久前,我在对投资组合配置进行蒙特卡罗模拟,试图找出如何让图表看起来更好。现在,我不是可视化大师的图形专家,但我确实想出了让它看起来更好的方法,这将只是一篇与你分享的短文!
如前所述,我运行了一些蒙特卡洛模拟,以计算出我的投资组合在 30 年后会是什么样子。如果你感兴趣,这是代码片段(但是完整的代码可以在我的 github 上找到)。我在接下来的 30 年里模拟了三种不同的基金(使用它们的均值和标准差)。我对这些基金进行了不同的加权,然后对它们进行了 1000 次模拟。
从最初的剧情可以看出,一点用处都没有。所有的 1000 个结果都是用全彩色绘制的,真的没有任何有用的信息可以从中收集到。我可以说出结果的大致范围,但除此之外,它真的不是特别有用。
我认为最重要的投资组合是(a)第 75 个百分点,(b)中间值,©第 25 个百分点,以及(d)基础投资组合(即不投资于市场的纯储蓄)
为了获得第 25、50 和 75 个百分点的投资组合的位置,我结合了分位数和指数函数,将它们转换为字符串,以便以后在绘图时可以使用它们的列名
在绘制图时,我将所有的图都设置为灰色。这将使它们淡出背景,并允许我突出重要的投资组合结果(按照前面提到的重要结果)
显然没有什么值得大书特书的,但现在至少我们有了一张空白的画布来工作!
列表中的quantiles
都是字符串。这使得我可以轻松地调用带有.loc
的特定投资组合,并引用确切的投资组合。我还创建了一个使用颜色和标签的列表。我还添加了一个图例来显示标签。就这样,这就是最终产品!
与最初的情节相比,最终的结果看起来好了很多。它给出了相同的背景信息(可能结果的大致范围),但也强调了重要的投资组合。或许更好的方法是去除异常结果。然而,出于我研究的目的,我想展示所有的结果,因此就把它留在这里了。
数据可视化是数据故事中如此重要的一部分。虽然我们可以有最酷的结果和发现,但一个传达清晰信息的好图也是至关重要的,尤其是在今天的图形密集型文化中。
最初发表于【zachlim98.github.io/me】。
清理、重构和模块化:提高 Python 代码和职业生涯的“必备”基础
一些代码习惯如何将您的开发过程和职业生涯带到一个全新的水平
“任何傻瓜都能写出计算机能理解的代码。优秀的程序员会写出人类能理解的代码。”
马丁·福勒
我们都知道,在开发过程的高峰期,我们通常更关注于让我们的程序工作,而不是让它完全可读。当我们面临一个前所未有的问题,并且有一个紧迫的期限来交付工作时,这种情况会变得更加复杂。有时,我们不得不求助于堆栈溢出来寻找解决方案,或者花些时间阅读所有类似的问题,直到找到解决问题的新思路。
“当你的程序一塌糊涂,但它做了它的工作.”
来源:Tumblr 上的凯凯
我经常使用堆栈溢出,但至少对我来说,我花在寻找解决方案上的时间减少了我通常用来使代码更干净和可读的时间(一个艰难而漫长的时间)。如果这种情况也发生在你身上,也许是因为我们更关注“如何解决”而不是让其他开发人员可以使用它,嗯… 我们想让它工作!尽管我们有时间格式化和记录一些东西,但是谁从来没有花几个小时去理解一些多年前的代码呢?原因很简单,编写干净、可读的代码是一件艰苦而累人的事情,但我们应该经常思考伟大的“鲍勃叔叔”的下面这句话:
“花在阅读和写作上的时间比远远超过 10 比 1。作为编写新代码工作的一部分,我们不断地阅读旧代码。…[因此,]让它易于阅读会让它更易于书写。”
罗伯特·c·马丁, 干净的代码:敏捷软件工艺手册
我们必须放在心里,作为开发者、程序员、软件工程师、数据科学家等等,我们真正的受众不是计算机,而是其他程序员(包括我们自己)。正如鲍勃叔叔的句子所定义的那样,我们通常花更多的时间阅读文档或其他人的代码,而不是制作新的代码,那么为什么不在这部分花更多的时间(不管有多累)并在未来帮助你或其他人呢?
来源:Thom Holwerda at OS news 漫画
这不仅会让你成为一个更好的程序员,而且还会帮助你的产品的可伸缩性和可维护性,同时减少错误的数量(这是真的)和系统复杂性/变更或增加的风险。如果这些对你来说还不够,我可以再给你一个改变旧习惯的想法!
“编写代码的时候,要把最终维护你代码的人想象成一个知道你住哪儿的暴力精神病患者。”
约翰·伍兹
那么让我们看看如何做这件事的一些方法?下面是实现高质量和干净代码的一些方法的总结。
重构
来源:XKCD 的兰道尔·门罗
重构是一种在不改变外部功能的情况下,重构代码以改善其内部结构的方法。这背后的心态是:你设法让它工作了吗?回到开头,把你的程序清晰化,模块化!当您有几个要添加的功能时,一开始就这样做似乎是浪费时间,但是一步一步地这样做将给您带来以下好处:
- 长期减少工作量;
- 更容易维护代码;
- 增加可重用性;
- 减少在未来或新项目中这样做的时间(做得越多,你在这项活动中就会变得越快)
- 如果你尝试做得比之前的重构更好,你一定会很快掌握这项技能;
- 这项技能在就业市场上非常有价值,会突出你的个人资料(看看 LinkedIn 或其他网站上的“渴望拥有”的职位就知道了)
好吧!我理解重构的优势,但是我该怎么做呢?很简单,以下是实现这一点的一些方法:
- 首先,试着理解代码复杂性在 Python 中是如何工作的,以及度量这种复杂性的度量标准(例如,代码行数、圈复杂度、 Halstead 度量标准、可维护性指数);
- 知道了复杂性是如何工作的,你现在要做的最多的事情就是重命名名字、模块、函数、类、方法,并检查你是否在你的代码中应用了一些过程编程;
- 最后,检查一些复杂性反模式 …瞧,你的程序将会大放异彩!
如果你想更深入地了解这个主题,这里有一篇优秀的文章,它一步一步地解释了如何在 Python 中实现重构,这里有一些可用的代码指标的汇编!如果你喜欢书,我建议如下:
- Python 反模式(AWS);
- 重构:改进现有代码的设计 (马丁·福勒);
一些不错的视频讲座或研讨会:
- 用老谋深算 (PyCon 2019)测量 Python 代码复杂度;
- 重构 Python:为什么以及如何重构你的代码 (PyCon 2016)。
干净的代码
来源:迷因生成器
“干净的代码”不是一种方法或一套规则,而是一种哲学,它带来了一些技术,简化了代码的编写和阅读。再次引用鲍勃叔叔的话:
“干净的代码不是按照一套规则编写的。通过学习一系列启发法,你不会成为一名软件工匠。专业精神和工匠精神来自推动学科发展的价值观。”
罗伯特·c·马丁, 干净的代码:敏捷软件工艺手册
你知道前面提到的想法吗?我们有很紧的时间来执行这项任务,我们把很多注意力放在结果上,而不是可读和干净的代码。他很清楚地说明了如何解决这个问题,编写糟糕代码的错误完全取决于编写代码的人。
“没有什么比糟糕的代码对开发项目的影响更深远、更长期了。糟糕的计划可以重做,糟糕的需求可以重新定义。不好的团队动态是可以修复的。但是糟糕的代码会腐烂发酵,成为拖累团队的不可阻挡的重量。”
罗伯特·c·马丁, 干净代码:敏捷软件工艺手册
那我们怎么解决这个问题?取决于你在哪里(你在路上用坏习惯多久?),这可能很容易,也可能很难,消除坏习惯很复杂,但不要放弃,只要使用以下步骤,随着时间的推移,你会找到窍门的!
- 一段干净的代码应该是优雅的 到令人愉悦的程度;
- 一个干净的代码必须是描述性的、隐含的类型, 例如,对布尔使用“is_”或“has_”来明确它是一个条件;
- 一个干净的代码必须一致但区分清楚, 例如,“age_list”和“age”比“ages”和“age”更容易区分;
- 干净的代码必须避免缩写,尤其是单个字母, 只对计数器和常见的数学变量使用缩写,但请记住,如果您的团队有不同的角色(例如,全栈工程师与数据科学家一起工作),可能有必要提供更具描述性的名称;
- 干净的代码必须表明长名称不同于描述性名称 ,仅具有相关信息的描述性名称;
- 一个干净的代码必须有 79 个字符左右的行,学会换行缩进 一行和/或多行;
- 一个干净的代码一定是有据可查的, 在我看来, Google 风格的例子 是最完整的,但是你可以找到你最喜欢的,开始使用它;
- 一个干净的代码必须恰当地使用空格, 用一致的缩进组织你的代码,用空行分隔各个部分;
- 一段干净的代码必须遵循 PEP 8 准则 进行代码布局;
- 一个干净的代码必须遵循 法则,对于 OOP 来说 。
幸运的是,一些工具可以帮助我们保持代码的整洁!我们可以使用 Linters 来分析它,并检测各种类型的“ lint ”,然后能够分析代码错误、危险的代码模式、代码风格和潜在的意外结果。这里是 Python 可用的 Linters 的汇编以及每一个与其他的不同之处。如果你想深入这个话题,我推荐这几本书:
- 【必备】 干净的代码:敏捷软件工艺手册 (罗伯特·c·马丁&迪安·万普勒);
- 有效 Python: 59 种具体方法写出更好的 Python(Breet Slatkin);
如果你喜欢视频和研讨会,我建议你:
- 干净代码—鲍勃大叔
- 清理 Python 中的代码(PyCon CZ);
- 将代码转换成漂亮、惯用的 Python(PyCon 2013)
模块化程序设计
编写模块化代码是软件开发中的一个重要步骤,因为它允许在模块中使用相同的代码,通过引用它来在程序的不同位置执行特定的操作。这种方法方便了大型程序的调试,增加了代码的可重用性和可读性,提高了可靠性,也有助于与多个开发人员或团队一起编程。为了继续,我认为您已经知道如何构建 Python 项目,但是如果您不知道,请在继续之前看一下这里。总之,要制作模块化代码,必须遵循以下提示:
- 不要重复自己: 概括和巩固函数或循环中重复的代码,不惜一切代价避免 意大利面代码;
- 抽象出逻辑来提高可读性: 这用描述性函数名来提高可读性,但是要小心使用,因为你可能会过度设计;
- 尽量减少实体数量: 用函数调用代替内联逻辑是有利弊的;
- 函数应该做一件事: 如果你的函数名中有一个“and”,考虑重构,你的函数也必须有少于 10 行的代码;
- 任意变量名在某些函数中可以更有效: 一般函数中的任意变量名其实可以让代码可读性更强;
- 每个函数尽量少用三个参数: 记住我们模块化是为了简化我们的代码,让它工作起来更有效率。如果您的函数有很多参数,您可能需要重新考虑如何将其拆分。
我建议你看一看的一篇优秀文章就是这篇,我认为必须看的一本书是《Python 的搭便车者指南》,可以在这里免费获得。
现在呢?
写好代码的问题,尽管在几个 IT 领域都存在,而且主要是在新手中,但在数据科学领域已经讨论了很多。这在很大程度上是由于数据科学家接触了广泛的学术学科,导致他们在编写干净和高级代码所需的一些技能方面缺乏经验(例如,软件工程原理、范例、干净代码、测试、日志)。尽管有这个问题,我们仍然有时间来解决这个问题,让我们帮助我们和其他人实现新的代码习惯!
我希望这篇文章能为那些不仅想改进代码,还想一起利用团队的人提供指导!
使用 Python 清理文本数据
安妮·斯普拉特在 Unsplash 上的照片
你需要的只是 NLTK 和 re 库。
数据格式并不总是表格格式。随着我们进入大数据时代,数据以非常多样化的格式出现,包括图像、文本、图表等等。
因为格式相当多样,从一种数据到另一种数据,所以将这些数据预处理成计算机可读的格式是非常必要的。
在本文中,我想向您展示如何使用 Python 预处理文本数据。如题所示,你所需要的就是 NLTK 和 re 库。
为了向您展示这是如何工作的,我将从一个名为的 Kaggle 竞赛中获取一个数据集。灾难推文 NLP。
我已经创建了一个谷歌 Colab 笔记本,如果你想跟着我一起。要访问,你可以点击这个链接这里
该过程
将文本小写
在我们开始处理文本之前,最好先把所有的字符都小写。我们这样做的原因是为了避免任何区分大小写的过程。
假设我们想从字符串中删除停用词,我们使用的技术是将非停用词组合成一个句子。如果我们不是小写那些,停止字不能被发现,它将导致相同的字符串。这就是为什么降低文本的大小写是必要的。
在 Python 中做到这一点很容易。代码看起来像这样,
**# Example**
x = "Watch This Airport Get Swallowed Up By A Sandstorm In Under A Minute [http://t.co/TvYQczGJdy](http://t.co/TvYQczGJdy)"**# Lowercase the text**
x = x.lower()print(x)**>>> watch this airport get swallowed up by a sandstorm in under a minute** [**http://t.co/tvyqczgjdy**](http://t.co/tvyqczgjdy)
删除 Unicode 字符
一些推文可能包含 Unicode 字符,当我们以 ASCII 格式看到它时,它是不可读的。大多数情况下,这些字符用于表情符号和非 ASCII 字符。为了消除这一点,我们可以使用这样的代码,
**# Example**
x = "Reddit Will Now Quarantine‰Û_ [http://t.co/pkUAMXw6pm](http://t.co/pkUAMXw6pm) #onlinecommunities #reddit #amageddon #freespeech #Business [http://t.co/PAWvNJ4sAP](http://t.co/PAWvNJ4sAP)"**# Remove unicode characters**
x = x.encode('ascii', 'ignore').decode()print(x)**>>> Reddit Will Now Quarantine_** [**http://t.co/pkUAMXw6pm**](http://t.co/pkUAMXw6pm) **#onlinecommunities #reddit #amageddon #freespeech #Business** [**http://t.co/PAWvNJ4sAP**](http://t.co/PAWvNJ4sAP)
删除停用词
这样做之后,我们可以删除属于停用词的单词。停用词是一种对文本意义没有显著贡献的词。因此,我们可以删除这些词。为了检索停用词,我们可以从 NLTK 库中下载一个语料库。这是如何做到这一点的代码,
import nltk
nltk.download()
**# just download all-nltk**stop_words = stopwords.words("english")**# Example**
x = "America like South Africa is a traumatised sick country - in different ways of course - but still messed up."**# Remove stop words**
x = ' '.join([word for word in x.split(' ') if word not in stop_words])print(x)**>>> America like South Africa traumatised sick country - different ways course - still messed up.**
删除提及、标签、链接等术语。
除了我们删除 Unicode 和停用词,还有几个术语我们应该删除,包括提及、标签、链接、标点等等。
要去除这些,如果我们只依赖一个定义好的角色,那是很有挑战性的。因此,我们需要通过使用正则表达式(Regex)来匹配我们想要的术语的模式。
Regex 是一个特殊的字符串,它包含的模式可以匹配与该模式相关的单词。通过使用它,我们可以使用名为 re 的 Python 库搜索或删除那些基于模式的内容。为此,我们可以这样实现它,
import re**# Remove mentions**
x = "[@DDNewsLive](http://twitter.com/DDNewsLive) [@NitishKumar](http://twitter.com/NitishKumar) and [@ArvindKejriwal](http://twitter.com/ArvindKejriwal) can't survive without referring @@narendramodi . Without Mr Modi they are BIG ZEROS"x = re.sub("@\S+", " ", x)print(x)
**>>> and can't survive without referring . Without Mr Modi they are BIG ZEROS****# Remove URL**
x = "Severe Thunderstorm pictures from across the Mid-South [http://t.co/UZWLgJQzNS](http://t.co/UZWLgJQzNS)"x = re.sub("https*\S+", " ", x)print(x)
**>>> Severe Thunderstorm pictures from across the Mid-South****# Remove Hashtags**
x = "Are people not concerned that after #SLAB's obliteration in Scotland #Labour UK is ripping itself apart over #Labourleadership contest?"x = re.sub("#\S+", " ", x)print(x)
**>>> Are people not concerned that after obliteration in Scotland UK is ripping itself apart over contest?****# Remove ticks and the next character**
x = "Notley's tactful yet very direct response to Harper's attack on Alberta's gov't. Hell YEAH Premier! [http://t.co/rzSUlzMOkX](http://t.co/rzSUlzMOkX) #ableg #cdnpoli"x = re.sub("\'\w+", '', x)print(x)
**>>> Notley tactful yet very direct response to Harper attack on Alberta gov. Hell YEAH Premier!** [**http://t.co/rzSUlzMOkX**](http://t.co/rzSUlzMOkX) **#ableg #cdnpoli****# Remove punctuations**
x = "In 2014 I will only smoke crqck if I becyme a mayor. This includes Foursquare."x = re.sub('[%s]' % re.escape(string.punctuation), ' ', x)print(x)
**>>> In 2014 I will only smoke crqck if I becyme a mayor. This includes Foursquare.****# Remove numbers**
x = "C-130 specially modified to land in a stadium and rescue hostages in Iran in 1980... [http://t.co/tNI92fea3u](http://t.co/tNI92fea3u) [http://t.co/czBaMzq3gL](http://t.co/czBaMzq3gL)"x = re.sub(r'\w*\d+\w*', '', x)print(x)
**>>> C- specially modified to land in a stadium and rescue hostages in Iran in ...** [**http://t.co/**](http://t.co/)[**http://t.co/**](http://t.co/)**# Replace the over spaces**
x = " and can't survive without referring . Without Mr Modi they are BIG ZEROS"x = re.sub('\s{2,}', " ", x)print(x)
**>>> and can't survive without referring . Without Mr Modi they are BIG ZEROS**
组合它们
在您了解预处理文本的每个步骤之后,让我们将它应用于一个列表。如果你仔细观察这些步骤的细节,你会发现每种方法都是相互关联的。因此,有必要将它应用到一个函数上,这样我们就可以同时按顺序处理它。在我们应用预处理步骤之前,这里是样本文本的预览,
**Our Deeds are the Reason of this #earthquake May ALLAH Forgive us all
Forest fire near La Ronge Sask. Canada
All residents asked to 'shelter in place' are being notified by officers. No other evacuation or shelter in place orders are expected
13,000 people receive #wildfires evacuation orders in California
Just got sent this photo from Ruby #Alaska as smoke from #wildfires pours into a school**
我们应该做几个步骤来预处理文本列表。他们是,
- 创建一个包含所有预处理步骤的函数,它返回一个预处理过的字符串
- 使用名为 Apply 的方法应用函数,并用该方法链接列表。
代码看起来会像这样,
**# # In case of import errors
# ! pip install nltk
# ! pip install textblob**import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import re
import nltk
import string
from nltk.corpus import stopwords**# # In case of any corpus are missing
# download all-nltk**
nltk.download()df = pd.read_csv('train.csv')
stop_words = stopwords.words("english")
wordnet = WordNetLemmatizer()def text_preproc(x):
x = x.lower()
x = ' '.join([word for word in x.split(' ') if word not in stop_words])
x = x.encode('ascii', 'ignore').decode()
x = re.sub(r'https*\S+', ' ', x)
x = re.sub(r'@\S+', ' ', x)
x = re.sub(r'#\S+', ' ', x)
x = re.sub(r'\'\w+', '', x)
x = re.sub('[%s]' % re.escape(string.punctuation), ' ', x)
x = re.sub(r'\w*\d+\w*', '', x)
x = re.sub(r'\s{2,}', ' ', x)
return xdf['clean_text'] = df.text.apply(text_preproc)
这是它的结果,
**deeds reason may allah forgive us
forest fire near la ronge sask canada
residents asked place notified officers evacuation shelter place orders expected
people receive evacuation orders california
got sent photo ruby smoke pours school**
最后的想法
这就是如何使用 Python 对文本进行预处理。希望你可以应用它来解决文本数据相关的问题。如果有什么想法,可以在下面评论下来。此外,您可以在 Medium 上跟踪我,以便跟进我的文章。谢谢你。
参考
[1]https://docs.python.org/3/library/re.html
【2】https://www.nltk.org/
【3】https://www.kaggle.com/c/nlp-getting-started/overview
在 Azure Databricks 中将模式漂移的 CSV 文件清理并转换为关系数据
使用 PySpark 增量处理和加载模式漂移文件到 Azure Databricks 中的 Azure Synapse Analytics 数据仓库
由 Unsplash 上的hkon grim stad拍摄的照片
数据是企业的血液。数据以不同的形状和大小出现,这使得寻找处理和消费的方式成为一项持续的挑战性任务,没有这种方式,数据就没有任何价值。
本文将介绍如何利用 Apache Spark 的并行分析功能,将模式漂移的 CSV 文件迭代地清理和转换为可查询的关系数据,并存储在数据仓库中。我们将在 Spark 环境中工作,并用 PySpark 编写代码来实现我们的转换目标。
警告: Microsoft Azure 是一项付费服务,遵循本文可能会导致您或您的组织承担财务责任。
在继续本文之前,请阅读我们的使用条款:https://dhyanintech . medium . com/disclaimer-disclosure-disclosure-terms-of-use-fb3 BF BD 1e 0e 5
先决条件
- 有效的 Microsoft Azure 订阅
- 带有 CSV 文件的 Azure 数据湖存储第二代帐户
- Azure Databricks 工作区(高级定价层)
- Azure Synapse 分析数据仓库
如果您还没有设置先决条件,请参考我们以前的文章开始:
[## 使用 Azure 将 CSV 文件转换为 Power BI 视觉效果的权威指南
使用 Microsoft Azure 产品将新冠肺炎数据转化为惊人的 Power BI 视觉效果的分步指南。
medium.com](https://medium.com/@dhyanintech/a-definitive-guide-to-turn-csv-files-into-power-bi-visuals-using-azure-4483cf406eab) [## 使用 Azure Data Factory 基于 HTTP 上的 URL 模式增量复制文件
一个创新的 Azure 数据工厂管道,通过 HTTP 从第三方网站增量复制多个文件…
medium.com](https://medium.com/@dhyanintech/using-azure-data-factory-to-incrementally-copy-files-based-on-url-pattern-over-http-569476b625fc)
登录到 Azure 门户,找到并打开你的 Azure Databricks 实例,然后点击“启动工作区”我们的 Databricks 实例将在新的浏览器选项卡中打开;等待 Azure AD SSO 自动为您登录。
Azure 门户:启动 Databricks 工作区(图片由作者提供)
接下来,我们需要创建一个节点集群,以利用 Apache Spark 无与伦比的并行处理(双关语)能力来处理、清理和转换我们的半结构化数据。
闪电般快速的统一分析引擎 Apache Spark 是用于大规模数据处理的统一分析引擎…
spark.apache.org](https://spark.apache.org/)
旋转阿帕奇火花集群
选择左侧菜单上的集群开始创建新的集群。通过选择 +创建集群开始,如图所示继续操作。这里需要注意的两个基本问题是 Databricks 运行时版本以及工作节点的最小和最大数量。我们的集群将在这些节点之间自动扩展以适应负载。等待创建过程完成。
Azure Databricks:建立一个 Apache Spark 集群(图片由作者提供)
点击开始来启动你的集群。Azure 可能需要几分钟来配置和设置您的群集资源。密切关注集群状态指示器,查看实时状态。
Azure Databricks:启动 Spark 集群(图片由作者提供)
数据砖块的真正魔力发生在笔记本中。Azure Databricks 支持用 Python、Scala、SQL 和 r 编写的笔记本,在我们的项目中,我们将使用 Python 和 PySpark 来编码所有的转换和清理活动。让我们开始创建一个 Python 笔记本。
笔记本是一个基于网络的文档界面,其中包含可运行的代码、叙述性文本和可视化效果。
PySpark 是 Apache Spark 的 Python API。Apache Spark 是用 Scala 写的。PySpark 已经发布,支持 Apache Spark 和 Python 的协作。
在左侧菜单中选择工作区,并按照所示步骤操作。你的笔记本创建后会打开;花点时间四处看看,熟悉一下 UI 和我们可用的各种选项。
Azure Databricks:创建一个 Python 笔记本(图片由作者提供)
笔记本的前几行应该告诉数据块我们的数据在哪里以及如何访问它。我们将将我们的存储帐户挂载到 Databricks 文件系统,并将其作为本地存储进行访问。
将存储帐户装载到数据块文件系统
请阅读我们的文章,了解在 Azure Databricks 中安装和访问 ADLS 第二代存储的详细步骤。我们会尽量简短。
[## 使用服务主体和秘密范围在 Azure 数据块中挂载和访问 ADLS Gen2
关于使用 Azure 密钥库支持的秘密范围和服务从数据块访问 Azure 数据湖存储 Gen2 的指南…
medium.com](https://medium.com/@dhyanintech/mounting-accessing-adls-gen2-in-azure-databricks-using-service-principal-and-secret-scopes-96e5c3d6008b)
从数据块连接和访问 Azure Synapse 分析数据仓库
我们的最终目标是将数据加载到数据仓库中,从数据中获得洞察力,并构建报告来做出决策。让我们在继续之前设置连接。
[## 在 Azure Databricks 中连接和访问 Azure Synapse Analytics 的凭据安全方式
关于如何在 PySpark 中使用秘密作用域设置 SQL Server 防火墙和从数据块连接的指南
medium.com](https://medium.com/@dhyanintech/a-credential-safe-way-to-connect-and-access-azure-synapse-analytics-in-azure-databricks-1b008839590a)
我们的连接都设置好了;让我们继续清理刚刚挂载的 CSV 文件。我们将简要解释语句的目的,并在最后展示整个代码。
使用 PySpark 进行转化和净化
首先,让我们将一个文件读入 PySpark 并确定模式。我们将设置一些选项来告诉 PySpark 列的类型和结构。
# Read the csv files with first line as header, comma (,) as separator, and detect schema from the file
csvDf = spark.read.format("csv") \
.option("inferSchema", "true") \
.option("header", "true") \
.option("sep", ",") \
.load("dbfs:/mnt/csvFiles/01-22-2020.csv")csvDf.printSchema()
PySpark:确定文件的模式(图片由作者提供)
这个文件的列数比我们从 GitHub 源得到的少,列名也不同。我们对最终功率 BI 可视化的突出显示列感兴趣。
数据源:预期的架构(图片由作者提供)
让我们读取一个较新的文件并检查其结构。
PySpark:确定文件的模式(图片由作者提供)
这个文件的结构更接近我们的来源的描述。图式的差异并没有让我们的事情变得简单。如果我们所有的文件都有相同的模式,我们可以一次加载并清理所有的文件。我们的例子是典型的模式漂移,我们必须恰当地处理它;否则,我们的 ELT(提取、加载和转换)过程将会失败。我们将设计我们的转换来解释这种漂移,并使它不会因模式改变而出错。
模式漂移是源经常改变元数据的情况。字段、列和类型可能会被更改、添加或删除。
我们将通过重命名列来开始清理,以匹配数据库中表的属性,从而在表和数据之间建立一对一的映射。我们将通过将所有字母转换为小写并删除空格、正斜杠(‘/’)和下划线(’ _ ')来实现这一点。
# Function to flatten the column names by removing (' ', '/', '_') and converting them to lowercase letters
def rename_columns(rename_df):
for column in rename_df.columns:
new_column = column.replace(' ','').replace('/','').replace('_','')
rename_df = rename_df.withColumnRenamed(column, new_column.lower())
return rename_dfcsvDf = rename_columns(csvDf)
csvDf.printSchema()
PySpark:展平列名(作者图片)
我们的列名现在看起来好多了。我们将添加一些新的列来处理我们缺少列的情况;活动、经度、纬度和源文件。我们将使用文件名作为源文件列的值。本专栏将有助于设置数据库中数据的增量加载。
首先,我们将把数据中存在的 lat 和 long 列名重命名为 latitude 和经度。接下来,我们将使用 PySpark 中的lit()
来添加缺少的活动、纬度和经度列,其中为空值,而源文件的文件名为列值。
# lit() function to create new columns in our datafram
from pyspark.sql.functions import lit# Check dataframe and add/rename columns to fit our database table structure
if 'lat' in csvDf.columns:
csvDf = csvDf.withColumnRenamed('lat', 'latitude')
if 'long' in csvDf.columns:
csvDf = csvDf.withColumnRenamed('long', 'longitude')
if 'active' not in csvDf.columns:
csvDf = csvDf.withColumn('active', lit(None).cast("int"))
if 'latitude' not in csvDf.columns:
csvDf = csvDf.withColumn('latitude', lit(None).cast("decimal"))
if 'longitude' not in csvDf.columns:
csvDf = csvDf.withColumn('longitude', lit(None).cast("decimal"))# Add the source file name (without the extension) as an additional column to help us keep track of data source
csvDf = csvDf.withColumn("sourcefile", lit('01-22-2020.csv'.split('.')[0]))csvDf = csvDf.select("provincestate", "countryregion", "lastupdate", "confirmed", "deaths", "recovered", "active", "latitude", "longitude", "sourcefile")csvDf.printSchema()
PySpark:添加额外的栏目(图片由作者提供)
让我们用display(DATAFRAME)
来看看我们在清理活动开始时查看的两个文件的数据
PySpark:显示数据框的数据(图片由作者提供)
这两个文件现在都为我们提供了固定结构的格式化数据,并准备好插入到我们的数据库中。我们已经成功地处理了漂移模式。
到目前为止,我们手动运行了两个文件的代码;我们应该自动处理一个接一个的文件。我们可以使用 Databricks 文件系统实用程序来遍历所有文件。
关于 Databricks 文件系统实用程序的进一步阅读:
[## 数据块工具
Databricks 实用程序(DBUtils)使执行强大的任务组合变得容易。您可以使用这些实用程序来…
docs.databricks.com](https://docs.databricks.com/dev-tools/databricks-utils.html#dbutilsfsls-command)
# List all the files we have in our store to iterate through them
file_list = [file.name for file in dbutils.fs.ls("dbfs:{}".format(mountPoint))]for file in file_list:
print(file)
PySpark:使用 Databricks 工具列出文件(图片由作者提供)
我们只需要处理尚未加载到数据库中的文件(增量加载)。我们可以通过查询数据库找出最后加载的文件的名称,并调整迭代器代码以忽略已经加载的文件。
# Find out the last file we loaded into the database
# This will return *null* if there's no data in the table
lastLoadedFileQuery = "(SELECT MAX(sourcefile) as sourcefile FROM csvData.covidcsvdata) t"lastFileDf = spark.read.jdbc(url=jdbcUrl, table=lastLoadedFileQuery, properties=connectionProperties)lastFile = lastFileDf.collect()[0][0]# List all the files we have in our store to iterate through them
file_list = [file.name for file in dbutils.fs.ls("dbfs:{}".format(mountPoint))]# Find the index of the file from the list
loadFrom = file_list.index('{}.csv'.format(lastFile)) + 1 if lastFile else 0# Trim the list keeping only the files that should be processed
file_list = file_list[loadFrom:]
for file in file_list:
print(file)
PySpark —概念验证:增量处理(图片由作者提供)
组合和重组我们到目前为止编写的所有代码将允许我们通过增加数据库负载来清理模式漂移文件。试试看。您可以在文章末尾找到 GitHub 的整个笔记本,用于任何故障排除目的。
结论
我们查看了我们的 CSV 文件,意识到它们有不同的模式,需要不同的处理方法,然后才能将它们加载到我们的数据仓库中。我们使用 PySpark 创建了一个创造性的解决方案来增量处理我们的文件,并设计了一个满足我们需求的解决方案。
后续步骤
如果您正在关注我们关于将 CSV 数据转化为 Power BI 视觉效果的系列文章,或者有兴趣了解如何在您的数据工厂管道中添加和执行 Databricks notebook,请阅读我们的下一篇文章继续您的旅程。
[## 使用访问令牌在 Azure 数据工厂管道中执行 Azure Databricks 笔记本
关于如何使用 Azure Key Vault 安全访问在数据工厂管道中添加和执行 Databricks 笔记本的指南…
medium.com](https://medium.com/@dhyanintech/executing-azure-databricks-notebook-in-azure-data-factory-pipeline-using-access-tokens-3326b8703432)
喜欢这个帖子?与 Dhyan 联系
让我们做朋友吧!你可以在 LinkedIn 上找到我或者在 Medium 上加入我。
使用 Matplotlib 清除图表
如何构建人们真正想要阅读和使用的 Matplotlib 图表?
艾萨克·史密斯在 Unsplash 上拍摄的照片
数据科学就是让人们信服,展示你的发现,你真正理解的模式。在这个练习中,图表走了很长的路。遗憾的是,许多科学图书馆允许你制作开箱即用的图表,如下图所示。
matplotlib 文档中的条形图(1)
你的眼睛是带着好奇心被图表吸引的吗?我个人认为不是,更重要的是,我认为非技术人员、普通公众会很快对此不屑一顾,因为你必须有意识地努力超越视觉上的不清晰。
大多数人会忽视美学的重要性,但我真的认为它是连接“技术”和“商业”人士的桥梁之一。
有助于更好的沟通。
图表是关于你想要展示的东西,读者应该提取的最重要的信息是什么?是轴心吗?你几乎不会错过黑色的框架和线条。如果要读取条形值,它会堆叠在误差条形线之间。重要的信息被隐藏了。
在这篇文章中,我以柱状图为例,假装我们测量了不同人群的分数。所需代码在帖子最后分享。
在条形图中,我希望通过重要性递减顺序清楚地看到:
- 条和它们各自的比例,
- 标题,
- 天平,
- 以及他们的价值观和团队意识。
**你可以直观的传达这个订单。**最重要的元素应该是你首先看到的。下面,我建议一个选择去那个方向。条形颜色较深,使其可见,标题和轴图例为中等灰色,不太明显,因为它是次要信息。最后,水平网格线非常浅,如果你想读取数值,这有一点帮助。没什么特别的,第一次花了一个小时,但之后主要是复制/粘贴你喜欢的配置。
plot_1.png(帖子末尾的代码)
关于颜色的一句话。不要使用默认颜色。就是不要。
如今,你有很多工具来真正地选择和谐的调色板,即使你对理论一无所知,它们也能很好地协同工作。例如,我在这里选择的颜色是在网上工具(【coolors.co】T2)上挑选的,但很可能这些工具中的任何一个都可以胜任。如果你想对百叶窗的颜色很敏感,有适合每个人的特殊调色板(【davidmathlogic.com/colorblind/】)。如果下面的图是红色代表男人,蓝色代表女人,这将会让我们很多人感到惊讶。颜色与意义和情感联系在一起,用它们来阐明你的交流。
plot_2.png(帖子末尾的代码)
总之,设计既能带来有价值的信息,又不会混淆视听的图表,可以归结为几个核心原则:
- 图表上的每个形状都有其用途和意义。如果没有,就把它去掉(如果有必要,也可以用白色/透明来隐藏)。
- 选择颜色,而不是让图书馆为你做。
- 选择每个人都能阅读的字体大小(不,不是 6pt)。如果图表的最终尺寸较小,请减小绘图区并增大字体大小。给看不懂的东西贴标签是没有意义的。
- 我们在 2020 年,使用与我们当前屏幕质量相匹配的分辨率(这里,我指定 300 dpi 或使用矢量图形)。
如果你定义了图表的外观,你可以复制它并保持一致。否则你被你使用的工具所控制,你就不是在讲故事。
这真的很简单,但我一直看到混乱和难以阅读的图表。接下来,你可能会想你通常产生的视觉效果。因为你不会说或写没有意义或目的的话,你可以把同样的逻辑应用到你的图表上。
代码:
来源:
[1]https://matplotlib . org/2 . 0 . 2/examples/API/bar chart _ demo . html
使用 Python 中的模块和包进行清晰的编码
用通俗易懂的例子!
扎克·卡道夫在 Unsplash 上的照片
当您的 Python 代码变大时,随着时间的推移,它很可能变得杂乱无章。随着代码的增长,将代码保存在同一个文件中会使代码难以维护。此时,Python 模块和包帮助你通过使用文件和文件夹来组织和分组你的内容。
- 模块是带有的文件。py" 包含 Python 代码的扩展。它们有助于在同一个文件中组织相关的函数、类或任何代码块。
- 将大型 Python 代码块分割成包含多达 300–400 行代码的模块被认为是最佳实践。
- 包将相似的模块放在一个单独的目录中。它们是包含相关模块和一个 init 的文件夹。py 文件,用于可选的包级初始化。
- 根据您的 Python 应用程序,您可以考虑将您的模块分组到子包中,例如 doc、core、utils、data、examples、test。
让我们编写一个示例 Python3 代码来进一步理解模块和包:
**""" cvs_get_module.py
This module displays the summary of the tabular data contained in a CSV file
"""**import pandas as pdprint("cvs_get_module is loaded")*def* **display_file_location(*path, file_name*)**:
print("File Location: {}".format(path+filename))*class* **CSVGetInfo:**
*def* __init__(*self*, *path*, *file_name*):
self.path = path
self.file_name = file_name
*def* **display_summary(*self*):**
data = pd.read_csv(self.path + self.file_name)
print(self.file_name)
print(data.info())
丹尼尔在 Unsplash 上的照片
导入模块
为了在外部 Python 代码块中使用一个模块,我们需要将那个特定的模块导入到我们的代码结构中。为此,使用带有"import<module _ name>"语法的 import 语句。这里的模块名是指不带的 Python 文件名。py" 扩展名。一旦我们导入模块,我们使用点符号,**.”,**访问模块内部的元素。
# **ModulesExample.py
# Importing 'csv_get_module' and accessing its elements**import **csv_get_module****data_by_genres** = **csv_get_module.CSVGetInfo**("/Users/erdemisbilen/
Lessons/", "data_by_genres.csv")**csv_get_module.display_file_location**(data_by_genres.**path**, data_by_genres.**file_name**)data_by_genres.**display_summary()****Output:** cvs_get_module is loaded
File Location: /Users/erdemisbilen/Lessons/data_by_genres.csv
data_by_genres.csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2617 entries, 0 to 2616
Data columns (total 14 columns):
通过重命名导入模块
我们可以用**‘导入< 模块 _ 名称 >作为< 替代 _ 名称>’**语法在导入的同时重命名模块。这可能有助于缩短长模块名。
# **ModulesExample.py
# Importing 'csv_get_module' and accessing its elements**import **csv_get_module** as **cg****data_by_genres** = **cg.CSVGetInfo**("/Users/erdemisbilen/Lessons/", "data_by_genres.csv")**cg.display_file_location**(data_by_genres.path, data_by_genres.file_name)data_by_genres.display_summary()**Output:** cvs_get_module is loaded
File Location: /Users/erdemisbilen/Lessons/data_by_genres.csv
data_by_genres.csv
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2617 entries, 0 to 2616
Data columns (total 14 columns):
从模块导入特定名称
我们可以导入模块的特定名称,而不是加载模块中包含的所有元素。此外,我们可以通过用逗号分隔名称来导入多个元素。
注意,这里我们不需要使用点符号,因为我们直接从<module _ name>import<element _ name>’语法中导入带有的名称。
from **csv_get_module** import **display_file_location** as **dfl****dfl**("/User/Python/","ModulesExample.py")**Output:** File Location: /UserModulesExample.py
导入模块内的所有名称
我们也可以使用星号(*)直接导入模块的所有名称,尽管这不是一个好的做法。如果导入多个包含同名元素的模块,这可能会导致名称冲突。
from **csv_get_module** import *****
隐藏模块的元素
如果我们想要隐藏模块的一些元素,我们可以用下划线 “_” 开始命名元素。这种元素不能导入到外部文件中,因为这种命名约定使该元素成为模块本身的私有元素。
区分独立脚本运行和模块加载
包含 Python 代码的文件可以作为独立脚本运行,也可以作为模块加载到另一个代码结构中。
有时,考虑到这些用途,需要将 Python 文件中的代码分开。Python 有内置的 name 属性,当文件作为模块加载时,该属性为我们提供了模块名称。当文件作为独立脚本运行时,这次它返回 main 字符串。
**""" cvs_get_module.py
This module displays the summary of the tabular data contained in a CSV file
"""**import pandas as pdprint("cvs_get_module is loaded")*def* **display_file_location(*path, file_name*)**:
print("File Location: {}".format(path+filename))*class* **CSVGetInfo:**
*def* __init__(*self*, *path*, *file_name*):
self.path = path
self.file_name = file_name
*def* **display_summary(*self*):**
data = pd.read_csv(self.path + self.file_name)
print(self.file_name)
print(data.info())if **__name__ == '__main__'**:**data_by_genres** = **CSVGetInfo**("/Users/erdemisbilen/Lessons/", "data_by_genres.csv")**display_file_location**(data_by_genres.path, data_by_genres.file_name)
data_by_genres.display_summary()
只有当脚本作为独立脚本运行时,上述 if 语句中的代码才会运行。
Python 中的包
包将相似的模块放在一个单独的目录中。它们是包含相关模块和一个 init 的文件夹。py 文件,用于可选的包级初始化。
init。py 在引用包内模块时执行一次。这个文件可以保留为空,或者可以选择实现包级初始化代码。
根据您的 Python 应用程序,您可以考虑将您的模块分组到子包中,例如 doc、core、utils、data、examples、test。由于相似的模块保存在不同的文件夹中,这使得你的整体结构得到很好的组织和维护。
Lynn Kintziger 在 Unsplash 上拍摄的照片
从包中导入模块
我们可以使用包名(文件夹名)和点“.”来导入包内的模块接线员。
from **utils.csv_get_module** import **display_file_location** as **dfl****dfl**("/User/Python/","ModulesExample.py")**Output:** File Location: /UserModulesExample.py
关键要点
- 在 Python 中,组织大型代码块由模块和包管理。
- 这简化了代码结构,增加了代码的可重用性,并简化了维护和测试工作。
结论
在这篇文章中,我解释了 Python 中模块和包的基础知识。
这篇文章中的代码可以在我的 GitHub 库中找到。
我希望这篇文章对你有用。
感谢您的阅读!
学习使用 Python 的 Scikit_learn 库通过项目开发 KNN 分类器
杰克·威瑞克在 Unsplash 上的照片
适合机器学习新手
学习机器学习概念的最佳方式是做一个项目。在这篇文章中,我将使用一个项目来描述一些关键的机器学习概念。
在这篇文章中,我将详细解释一个分类模型,它是**,一个监督机器学习的主要类型**。顾名思义,我们将要研究的模型叫做 KNN 分类器。
KNN 分类器是一种非常流行和众所周知的监督机器学习技术。本文将通过一个简单但完整的项目来解释 KNN 分类器。
什么是监督学习模型?
我来详细解释一下。但是维基百科是这么说的:
监督学习是学习函数的机器学习任务,该函数基于示例输入-输出对将输入映射到输出。它从由一组训练示例组成的标记的训练数据中推断出一个函数。
监督学习模型采用输入特征(X)和输出(y)来训练模型。该模型的目标是定义一个可以使用输入要素并计算输出的函数。
举个例子会更清楚
这是一个数据集,包含一些水果样本的质量、宽度、高度和颜色分数。
该数据集的目的是训练一个模型,这样如果我们向模型输入质量、宽度、高度和颜色分数,模型就可以让我们知道水果的名称。就像如果我们输入一块水果的质量、宽度、高度和颜色分数分别为 175、7.3、7.2、0.61,模型应该输出水果的名称为苹果。
这里,质量、宽度、高度和颜色分数是输入特征(X)。水果的名字是输出变量或标签(y)。
这个例子对你来说可能听起来很傻。但这是在非常高级的监督机器学习模型中使用的机制。
稍后,我将用一个真实的数据集展示一个实际的例子。
KNN 分类器
KNN 分类器是基于记忆的机器学习模型的一个例子。
这意味着这个模型记住了带标签的训练样本,并使用它们来对它以前没有见过的对象进行分类。
KNN 分类器中的 k 是它将检索的训练样本的数量,以便预测新的测试样本。
KNN 分类器分三步工作:
- 当给它一个新的实例或例子进行分类时,它将检索以前记忆的训练例子,并从中找到 k 个最接近的例子。
- 然后分类器查找这 k 个最接近的例子的标签(上面例子中的水果名称)。
- 最后,模型将这些标签结合起来进行预测。通常,它会预测多数标签。例如,如果我们选择我们的 k 为 5,从最近的 5 个例子中,如果我们有 3 个橙子和 2 个苹果,新实例的预测将是橙色。
数据准备
在我们开始之前,我鼓励您检查您的计算机中是否有以下可用资源:
如果您没有安装 Jupyter 笔记本,请使用您选择的任何其他笔记本。我建议用谷歌合作笔记本。跟随此链接开始。只要记住一件事,
谷歌合作笔记本不是私人的。所以,不要在那里做任何专业或敏感的工作。但对练习很有帮助。因为里面已经安装了很多常用的包。
我建议,下载数据集。我在页面底部提供了链接。如果你是为了学习这个而阅读的话,请自己运行每一行代码。
首先,导入必要的库:
%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.model_selection import train_test_split
对于本教程,我将使用来自 Kaggle 的 Titanic 数据集。我将这个数据集上传到我笔记本所在的文件夹中。
下面是我如何使用 pandas 在笔记本中导入数据集。
titanic = pd.read_csv('titanic_data.csv')
titanic.head()
#titaninc.head() gives the first five rows of the dataset. We will #print first five rows only to examine the dataset.
看第二列。它包含了这个人是否幸存的信息。0 表示该人幸存,1 表示该人未幸存。
在本教程中,我们的目标是预测“幸存”特征。
为了简单起见,我将保留几个对算法更重要的关键特征,去掉其余的。
这个数据集非常简单。仅仅从直觉上,我们可以看到有一些列对于预测‘幸存’特征来说是不重要的。
例如,“乘客 Id”、“姓名”、“机票”和“客舱”似乎不能用来预测乘客是否幸存。
我将创建一个具有一些关键特性的新数据框架,并将其命名为 titanic1。
titanic1 = titanic[['Pclass', 'Sex', 'Fare', 'Survived']]
“性别”列具有字符串值,需要进行更改。因为计算机不理解单词。它只懂数字。我将更改 0 的“男性”和 1 的“女性”。
titanic1['Sex'] = titanic1.Sex.replace({'male':0, 'female':1})
这是数据帧 titanic1 的样子:
我们的目标是根据 titanic1 数据图中的其他信息预测“幸存”参数。因此,输出变量或标签(y)是“幸存的”。输入特征(X)是“P 级”、“性别”和“费用”。
X = titanic1[['Pclass', 'Sex', 'Fare']]
y = titanic1['Survived']
KNN 分类器模型
首先,我们需要将数据集分成两组:训练集和测试集。
我们将使用训练集来训练模型,其中模型将记住输入特征和输出变量。
然后,我们将使用测试集来查看模型是否可以使用“P-class”、“Sex”和“Fare”来预测乘客是否幸存。
方法’ train_test_split '将有助于拆分数据。默认情况下,此函数将 75%的数据用于定型集,25%的数据用于测试集。如果您愿意,您可以更改它,并且您可以指定“训练大小”和“测试大小”。
如果将 train_size 设置为 0.8,则拆分为 80%的训练数据和 20%的测试数据。但是对我来说,默认值 75%就不错了。因此,我没有使用 train_siz 或 test_size 参数。
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
请记住对“random_state”使用相同的值。这样,每次进行这种拆分时,训练集和测试集都会获得相同的数据。
我选择 random_state 为 0。你可以选择一些你喜欢的。
Python 的 scikit -learn 库已经有了 KNN 分类器模型。我会进口那个。
from sklearn.neighbors import KNeighborsClassifier
将此分类器保存在变量中。
knn = KNeighborsClassifier(n_neighbors = 5)
这里,n_neighbors 是 5。
这意味着当我们要求我们的训练模型预测新实例的生存机会时,将需要 5 个最接近的训练数据。
基于这 5 个训练数据的标签,模型将预测新实例的标签。
现在,我将使训练数据适合模型,以便模型可以记住它们。
knn.fit(X_train, y_train)
你可能会认为,由于它记住了训练数据,它可以正确预测 100%的训练特征的标签。但这并不确定。为什么?
看,每当我们输入并要求它预测标签时,它会从 5 个最近的邻居那里进行投票,即使它已经记住了完全相同的特征。
让我们看看它能给我们多少训练数据的准确性
knn.score(X_train, y_train)
我得到的训练数据准确率是 0.83 或者 83%。
记住,我们有一个我们的模型从未见过的测试数据集。现在检查一下,它能多准确地预测测试数据集的标签。
knn.score(X_test, y_test)
准确率出来是 0.78 或者 78%。
祝贺你!你开发了一个 KNN 分类器!
注意,训练集的精度比测试集的精度高一点。那太合适了。
什么是过度拟合?
有时,模型对训练集的学习非常好,因此可以很好地预测训练数据集标签。但是,当我们要求模型使用测试数据集或以前没有看到的数据集进行预测时,它的表现不如训练数据集。这种现象被称为过度拟合。
用一句话来说,当训练集精度高于测试集精度时,我们称之为过拟合。
预言;预测;预告
如果您想要查看测试数据集的预测输出,以下是如何操作的:
输入:
y_pred **=** knn.predict(X_test)y_pred
输出:
array([0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0,
1, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1,
1, 1, 0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1,
0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0,
0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0,
1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0,
1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1,
1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1,
0, 1, 1], dtype=int64)
或者你可以只输入一个例子并找到标签。
我想看看当一个人乘坐“P-class”3 旅行时,“性别”是女性,这意味着 1,并且支付了 25 英镑的“车费”,如果她能按照我们的模型生存下来。
输入:
knn.predict([[3, 1, 25]])
记得用两个括号,因为它需要一个 2D 数组
输出:
array([0], dtype=int64)
输出为零。这意味着根据我们训练的模型,这个人不可能存活。
请随意尝试更多像这样不同的输入!
如果你想看一些 KNN 分类器的进一步分析
KNN 分类器对“k”或 n 个邻居的选择非常敏感。在上面的例子中,我使用了 n 个邻居 5。
对于不同的 n_neighbors,分类器会有不同的表现。
让我们看看它在不同 n_neighbors 值的训练数据集和测试数据集上的表现。我选 1 到 20。
现在,我们将计算从 1 到 20 的每个 n_neighbors 值的训练集精度和测试集精度,
training_accuracy = []
test_accuracy = []
for i in range(1, 21):
knn = KNeighborsClassifier(n_neighbors = i)
knn.fit(X_train, y_train)
training_accuracy.append(knn.score(X_train, y_train))
test_accuracy.append(knn.score(X_test, y_test))
运行这个代码片段后,我得到了不同 n_neighbors 的训练和测试精度。
现在,让我们在同一个图中绘制针对 n_neighbors 的训练和测试集精度。
plt.figure()
plt.plot(range(1, 21), training_accuracy, label='Training Accuarcy')
plt.plot(range(1, 21), test_accuracy, label='Testing Accuarcy')
plt.title('Training Accuracy vs Test Accuracy')
plt.xlabel('n_neighbors')
plt.ylabel('Accuracy')
plt.ylim([0.7, 0.9])
plt.legend(loc='best')
plt.show()
分析上图
一开始,当 n_neighbors 为 1、2 或 3 时,训练精度比测试精度高得多。因此,该模型正遭受高度过拟合。
从那以后,训练和测试的准确性越来越接近。这是最佳点。我们希望如此。
但是当 n_neighbors 变得更高时,训练集和测试集的精度都下降了。我们不需要那个。
根据上图,该特定数据集和模型的最佳 n_neighbors 应为 6 或 7。
这是一个很好的分类器!
看上面的图!当 n_neighbors 约为 7 时,训练和测试准确率都在 80%以上。
结论
本文的目的是用一个项目展示一个 KNN 分类器。如果你是一个机器学习初学者,这将帮助你学习一些机器学习和工作流程的关键概念。有这么多不同的机器学习模型。但这是监督机器学习模型的典型工作流程。
这是我在文章中使用的泰坦尼克号:
在 GitHub 上创建一个帐户,为 rashida048/Datasets 开发做出贡献。
github.com](https://github.com/rashida048/Datasets/blob/master/titanic_data.csv)
更多阅读:
机器学习中如何处理倾斜数据集
towardsdatascience.com](/a-complete-understanding-of-precision-recall-and-f-score-concepts-23dc44defef6) [## Python 中从头开始的 k 均值聚类算法:分步指南
并学习使用它来降低图像的维数
towardsdatascience.com](/k-mean-clustering-algorithm-from-scratch-in-python-and-dimensional-reduction-step-by-step-guide-9ebabe5ca433) [## Python Matplotlib 的日常备忘单
完整的可视化课程
towardsdatascience.com](/your-everyday-cheatsheet-for-pythons-matplotlib-c03345ca390d) [## 练习数据科学技能和制作优秀投资组合所需的所有数据集
一些有趣的数据集提升你的技能和投资组合
towardsdatascience.com](/all-the-datasets-you-need-to-practice-data-science-skills-and-make-a-great-portfolio-857a348883b5) [## 数据宁滨与熊猫削减或 Qcut 方法
当你在寻找一个范围而不是一个确切的数值,一个等级而不是一个分数
towardsdatascience.com](/sort-and-segment-your-data-into-bins-to-get-sorted-ranges-pandas-cut-and-qcut-7785931bbfde) [## Pandas 的 Groupby 功能详细,可进行高效的数据汇总和分析
学习对数据进行分组和汇总,以使用聚合函数、数据转换、过滤、映射、应用函数…
towardsdatascience.com](/master-pandas-groupby-for-efficient-data-summarizing-and-analysis-c6808e37c1cb)
清晰理解深度优先搜索算法及其 Python 实现:图算法
借助清晰的视觉效果进行学习。还要学习人们在深度优先搜索算法中常犯的一个错误
什么是深度优先搜索?
这是广泛使用和非常流行的图搜索算法之一。为了理解这个算法,想象一个迷宫。当我们必须解决一个迷宫的时候我们做什么?我们走一条路,一直走,直到我们找到一个死胡同。在到达死胡同后,我们会原路返回,继续前进,直到我们看到一条我们以前没有尝试过的路。走那条新路线。再次继续前进,直到我们找到一个死胡同。再走一次原路…
深度优先搜索几乎以同样的方式工作。使用这种回溯过程。从起点开始,它一直走,直到再也找不到可以走的路。然后沿原路返回,回到有未探索路径的点。它一直这样做,直到遍历完所有的节点和边。
这是我介绍深度优先搜索的最简单的方法。稍后我会更详细地解释它。
为什么深度搜索很重要
深度优先搜索有广泛的使用案例。
- 解决我上面描述的迷宫或难题
- 安排问题
- 图中的循环检测
- 网络分析
- 映射路线
- 拓扑排序
还有很多。深度优先搜索也是许多其他复杂算法的基础。
深度优先搜索如何工作?
在本节中,我们将直观地看到深度优先搜索的工作流程。这是一个图,源节点显示为节点 u。
我们可以从 u 到节点 v 或 x,我们可以去任何方向。我选择去 v,从图中可以清楚的看到,从 v 出来的路由只有一条,那就是 y。
从图中可以清楚地看到,只有一条从 v 发出的路由,即 y。因此,我们现在位于 y 中。
和以前一样,从 y 也有一个输出路径。那是到 x,所以,我们必须到 x,那是唯一的选择。
看,我们被困住了!如前所述,在这种情况下,我们采取回溯。
通过回溯,我们回到了 y。
从这里没有路可走。所以,我们再回溯一下。
现在,我们在 v. Explore v .中,但是没有从 v .再次传出的路径。所以再退一步。
我们又回到了一步,那就是我们的源节点 u。
这里我们可以看到有一条我们没有探索过的外出路径。
我们从 u 到 x,看到 x 已经被访问过了。这种类型的边缘被称为前沿。从 x 到 v 也有一条路径。节点 v 也被访问,v 是 x 的祖先。因此这条路径被称为后边缘。
我们完成了“uvyx”圆中的所有节点和边。这里我们探索一个新的节点 w。
从 w 出发,我们可以去 z 或者 y,我现在选择去 z。
注意,z 使用后沿返回 z。
从 z 处无处可去,所以我们再次回溯,回到 w 处,w 有一条未探索的边通向 y。
这种类型的连接边称为交叉边。
旅行结束了。我们走遍了所有的节点和边缘。
开发深度第五搜索算法
在开发算法之前,将上图表示为邻接表是很重要的。如果你以前没有见过邻接表,它就是一本字典。其中,每个节点都是一个键,并且在该键中用传出路径链接的节点都是列表中的值。
看下面的邻接表。节点‘u’有两条到节点‘v’和节点‘x’的输出链路。因此,“u”是键,一个包含元素“v”和“x”的列表是值。同样,我们必须每隔一个节点做一个键值对。
g = {
'u': ['v', 'x'],
'v': ['y'],
'y': ['x'],
'x': ['v'],
'w': ['y', 'z'],
'z': ['z']
}
邻接表准备好了。
我将使用递归方法来开发深度优先搜索算法。
这个想法是遍历所有的节点和顶点,就像我们在上一节的图片中遍历的那样。为了跟踪被访问的节点,我们将从一个空列表开始。
class depth_first:
def __init__(self):
self.visited = []
现在定义一个循环遍历所有节点的函数,如果有一个未被访问的节点,我们将进入那个节点,找出这个节点将我们带到哪里。
def dfs(self, graph):
for ver in graph:
if ver not in self.visited:
self.dfs_visit(graph, ver)
return self.visited
注意,在这个函数中,我们调用了一个函数“dfs_visit”。该函数应该遍历由未访问节点提供的整个未访问路线,并将这些未访问节点添加到“已访问”列表中。我们将递归地实现这个函数。
以下是“dfs_visit”函数:
def dfs_visit(self, graph, vertex):
if vertex not in self.visited:
self.visited.append(vertex)
for nb in g[vertex]:
self.dfs_visit(g, nb)
仔细看看!如果节点不在“已访问”列表中,此函数将添加一个节点。然后它会转到与其相邻的一个节点并调用自己。
这样,它将遍历以前没有访问过的整个路线,一次一个。
以下是完整的代码:
class depth_first:
def __init__(self):
self.visited = [] def dfs(self, graph):
for ver in graph:
if ver not in self.visited:
self.dfs_visit(graph, ver)
return self.visited
def dfs_visit(self, graph, vertex):
if vertex not in self.visited:
self.visited.append(vertex)
for nb in g[vertex]:
self.dfs_visit(g, nb)
现在让我们用之前描述的邻接表来测试一下。
d = depth_first()
print(d.dfs(g))
输出:
['u', 'v', 'y', 'x', 'w', 'z']
看,节点的顺序和我们预想的一样!
人们在 DFS 算法中常犯的错误
我看到许多其他网站和博客解释了深度优先搜索算法。但是他们使用的代码是这样的:
def dfs(graph, vertex, path=[]):
path += [vertex] for n in graph[vertex]:
if n not in path:
path = dfs(graph, n, path)
return path
如果你注意到,它没有通过顶点循环。它从源节点开始,并不断遍历相邻节点。它将在一个图上工作,其中每个节点都有一个连接回任何其他被访问节点的传出节点。
但是在我们正在处理的图中,节点“y”没有到“w”的输出链接,这种算法将不起作用。因为它永远不会到达 w。
让我们检查一下
print(dfs(g, 'u'))
输出:
['u', 'v', 'y', 'x']
看,它看不到节点“w”和“z”。
结论
我想尽可能清楚地介绍和解释深度优先搜索的工作过程以及如何开发该算法。希望现在对你来说很容易。
更多阅读
[## 数据科学家使用 Python 进行假设检验的完整指南
用样本研究问题、解决步骤和完整代码清楚地解释
towardsdatascience.com](/a-complete-guide-to-hypothesis-testing-for-data-scientists-using-python-69f670e6779e) [## Python 中从头开始的完整异常检测算法:分步指南
基于概率的异常检测算法
towardsdatascience.com](/a-complete-anomaly-detection-algorithm-from-scratch-in-python-step-by-step-guide-e1daf870336e) [## 熊猫数据可视化的终极备忘单
熊猫所有的基本视觉类型和一些非常高级的视觉…
towardsdatascience.com](/an-ultimate-cheat-sheet-for-data-visualization-in-pandas-4010e1b16b5c) [## 使用 Python 从零开始的多类分类算法:分步指南
本文介绍两种方法:梯度下降法和优化函数法
towardsdatascience.com](/multiclass-classification-algorithm-from-scratch-with-a-project-in-python-step-by-step-guide-485a83c79992) [## 想在 12 周内成为数据科学家?
花钱前再想一想
towardsdatascience.com](/want-to-become-a-data-scientist-in-12-weeks-3926d8eacee2) [## 学习机器学习和深度学习的优质免费课程
顶级大学高质量免费课程的链接
towardsdatascience.com](/great-quality-free-courses-to-learn-machine-learning-and-deep-learning-1029048fd0fc)
一劳永逸地澄清困惑:fig,ax = plt.subplots()
了解 Matplotlib 中的图形和轴对象
介绍
通过阅读本文,您将了解 Maptlolib 绘图中的两个核心对象:图形和轴。你终于会明白简单剧情(plt.plot
)和用plt.subplots()
创造支线剧情的区别了。
当你开始进入数据科学的旅程时,你会被介绍到 Matplotlib 作为你的第一个数据可视化库。大多数初学者教程对学生开了一个残酷的玩笑,首先向他们介绍“初学者友好的”pyplot > plt
界面。当这些穷学生冒险进入现实世界时,他们会发现 StackOverflow 上的花花公子和大多数其他人使用更灵活的面向对象方式。他们会感到困惑,很可能会转移到 Seaborn 和 Plotly。或者更糟,到 Tableau 的无代码接口,就像我差点做的那样。(由于这种混乱,我特别记得自己浏览 Quora 和 StackOverflow 线程,想知道人们是否使用 Tableau 而不是 Matplotlib)
本文将向您介绍 Matplotlib 中的图形和轴对象,以及它们相对于其他方法的优势。
[## 通过我的推荐链接加入 Medium-BEXGBoost
获得独家访问我的所有⚡premium⚡内容和所有媒体没有限制。支持我的工作,给我买一个…
ibexorigin.medium.com](https://ibexorigin.medium.com/membership)
获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:
留在循环中,不用花无数时间浏览下一个突破;我们的算法识别…
alphasignal.ai](https://alphasignal.ai/?referrer=Bex)
概观
I. Introduction II. Setup III. plt.subplots(), preliminary understanding IV. Axes methods vs. pyplot, understanding further V. plt.subplots() grid system VI. Doubling axis VII. Sharing a commong axis between subplotsVIII. Working with figure object IX. Conclusion
示例数据和文章的笔记本可在 this GitHub repo 中获得。
设置
>>> climate_change.head()
plt.subplots(),初步了解
这一切都从调用.subplots()
命令开始:
>>> plt.subplots()(<Figure size 432x288 with 1 Axes>, <AxesSubplot:>)
如果您注意的话,除了空白图之外,该函数还返回了一个由两个值组成的元组:
:(<图尺寸 432x288 带 1 轴>,<轴 Subplot: >)
每次我们调用subplots()
函数时,它都会返回这些类型的元组,这些元组总是有两个值。在 Python 中,有一种技术叫做元组解包。让我给你看一个简单的例子:
如果我们打印上面三个的值:
>>> print(ten)
10
>>> print(eleven)
11
>>> print(twelve)
12
很好,我们把一个大小为 3 的元组分解成三个不同的变量。所以,现在你会更好地理解这段代码:
我们创建了两个变量,
fig
和ax
。请记住,这些是随意的名字,但却是一个标准,我们是好人之一,所以我们将遵循惯例。
这两个变量现在包含用于所有类型的绘图操作的两个核心对象。第一个对象fig
,简称figure
,把它想象成你剧情的框架。您可以调整框架的大小和形状,但不能在框架上绘图。在单个笔记本或脚本上,可以有多个图形。每个人物可以有多个支线剧情。在这里,支线剧情与轴线同义。第二个对象,ax
,axes 的缩写,是你在上面画画的画布。或者换句话说,它是一张你可以绘制和保存数据的空白纸。一个轴对象只能属于一个图形。
轴方法与 pyplot,进一步了解
在帖子的开头,我说过pyplot
是一个更加初学者友好的与 Matplotlib 交互的方法。的确,与 axes 方法相比,pyplot
提供了一种更快、更简洁的绘图方法。它将有更少的局部变量和语法。但是为什么大多数人更喜欢面向对象的方式呢?
我们来看看pyplot
的简洁方式:
嗯,这很简单。我们只用了三句台词。现在让我们看看,如果我们试图在它旁边绘制(完全不相关的)气候变化数据,会发生什么:
在这种情况下,我们得到一个TypeError
。pyplot
本身不能创建新轴或新图形,也不能智能地绘制新数据。当我们进行更复杂的绘图时,我们需要一个更灵活的方法。
Mpl 有这个概念叫current figure
。默认情况下,pyplot
本身会创建一个current figure
轴并在其上绘图。例如,如果我们想要聚焦在那个current figure
上,并在其上绘制额外的数据,正如我们在上一个例子中所尝试的,pyplot
在给出新的绘制命令后,立即将current figure
移动到一个新的。
为了避免这种情况,让我们看看我们完全控制每个图形和轴的方法:
我们特别指出我们正在处理这个fig
对象。这意味着我们编写的任何绘图命令都将应用于属于fig
的 axes ( ax
)对象。除非我们用plt.subplots()
命令定义一个新图形,否则当前的figure
将是变量fig
。这种方式非常好,因为现在我们可以在一个图形中创建尽可能多的轴或支线剧情,并使用它们。
从现在开始,我将交替使用支线剧情和轴线术语,因为它们是同义词。
plt.subplots()网格系统
我们看到了一个创建支线剧情的例子。让我们看看如何在单个图形中创建更多:
在其他参数中,.subplots()
有两个参数指定网格尺寸。nrows
和ncols
分别用来指出我们需要的行数和列数。如果你注意的话,现在我们的第二个变量包含不是一个而是两个轴。而且现在给的是一个numpy.ndarray
。因此,我们必须解包或索引该数组,以使用我们的绘图命令:
专业提示:注意
padding
设置为 3 的fig.tight_layout()
功能。这会给支线剧情一点喘息的机会。
这两种方法完全相似,由您选择一种。让我们再看一个例子,但稍微难一点:
专业提示:正确设置
figsize=(width, height)
参数。会让你的剧情更加鲜明。
这篇文章不是特别关于绘图,而是给你对图形和轴对象的直觉。但是,让我简要地向您介绍一下 axes 对象的其他一些常用方法:
所有在pyplot
API 中可用的方法在ax.set_
中都有等价的方法。如果你使用一个通用的,ax.set()
方法,当你有多个支线剧情时,你会避免重复。但是,如果您需要为绘图的特定部分指定附加参数,请使用ax.set_
:
双重轴
有时候,我们希望一个支线剧情有不止一个XAxis
或者YAxis
。虽然用普通的pyplot
接口是不可能的,但用顶级的figure
面向对象的 API 是非常容易的。假设我们想要在一个单独的绘图中绘制climate_change
的relative_temp
和co2
列。我们希望它们共享一个XAxis
,因为数据是同一时间段的:
我们希望有一个公共的XAxis
,即date
列,所以我们使用ax.twinx()
创建了另一个轴。如果在某些情况下你想要一个通用的YAxis
,等效的功能是ax.twiny()
。
在支线剧情之间共享一个公共轴
假设我们想比较八十年代和九十年代的二氧化碳排放量。理想情况下,我们会希望在一边绘制 80 年代,在另一边绘制 90 年代。因此,让我们对这两个时间段的数据进行分组:
专业提示:如果您正在处理时间序列数据,请将日期列设置为数据帧的索引。使用
.set_index()
方法或使用pd.read_csv()
功能中的index_col
参数。这将使时间段的子集设置更加容易。
很好,我们有两个并排的图,但是如果我们仔细看,我们的图是误导的。看起来两个时间段的二氧化碳排放量没有太大的差别。其原因是两个图具有不同的YAxis
范围。为了更好的理解,让我们来纠正它:
现在,很明显,随着时间的推移,二氧化碳排放量持续增加(比现在高得多)。我们使用sharey=True
来指定我们想要相同的YAxis
给所有的支线剧情。
使用体形对象
我想你已经注意到,一旦你使用.subplots()
命令或其他方法创建了一个图形对象,几乎所有的事情都会发生在 axes 对象上。figure
对象的一个常用方法是savefig()
方法。所以,让我们开始探索吧。我们将回到二氧化碳的双轴图。让我们将它保存到本地内存:
我们传递了一个文件名作为要保存的字符串。这将在根目录中保存一个同名的图像。可以使用的图像格式:
.png
-如果你想要高质量的图片并且不在乎磁盘空间,使用png
。这种格式允许无损压缩。.jpg
-有损压缩。jpg
图像将比png
的尺寸小,质量也低。如果您希望以后将图像上传到网站或任何其他类似的方式,建议使用这种格式。.svg
-支持动画和图像编辑。如果您想使用编辑软件(如 Adobe Illustrator)修改图形,请使用这种格式。
.savefig()
的其他参数允许控制您的图形质量:
结论
我希望您现在对图形和轴对象有了清晰的理解。我们只介绍了 Matplotlib 中的一种绘图方法。如果你想进一步探索,图书馆可以深入到你想要的深度。你可以在 Matplotlib 的官方文档中了解更多关于图形和轴对象的方法。我强烈建议您尝试其他功能并进行实践!(顺便说一句,那是很多 GitHub gists!)
看看我在 Medium 上的其他作品:
[## 掌握 Seaborn 中的 catplot():分类数据可视化指南。
如果你能在锡伯恩做到,那就在锡伯恩做吧,#2
towardsdatascience.com](/mastering-catplot-in-seaborn-categorical-data-visualization-guide-abab7b2067af) [## 掌握 Seaborn 的三分之一:用 relplot()统计绘图
如果你能在锡伯恩做到,就在锡伯恩做吧
towardsdatascience.com](/master-a-third-of-seaborn-statistical-plotting-with-relplot-df8642718f0f)
解释清楚:4 种机器学习算法
你是一个涉足机器学习的数据科学家吗?如果是的话,那么你应该看看这个。
定义、目的、流行的算法和用例——都有解释
安迪·凯利在 Unsplash 上的照片
机器学习已经走过了漫长的道路,从仅仅是一个科幻小说的主题到成为最可靠和最多样化的商业工具,增强了每个商业运作的多方面。
它对各种业务表现的影响已经变得如此重要,以至于需要实施顶级的机器学习算法来确保许多行业在这个高度竞争的世界中的生存。
在商业运作中实施 ML 需要大量的资源,并且是一个战略步骤。因此,现在我们理解了机器学习算法为什么重要,下一步就是理解如何使用 ML 算法来拯救你。
实现这一目标的第一步是清楚地了解你希望使用机器学习来解决什么样的业务问题,并清楚地了解不同类型的机器学习算法所需的资源和努力,以便你能够从桌面上的许多算法中选择最佳算法。
在这篇文章中,我们将介绍机器学习算法的主要类型,解释每种算法的用途,并看看它们的好处是什么。
机器学习算法的类型
1.监督机器学习算法
监督学习算法是所有四种 ML 算法中最简单的。这些算法需要模型开发者的直接监督。在这种情况下,开发人员会标记样本数据语料库,并设置算法运行的严格边界。
这是机器学习的一个简单版本:
- 你选择什么样的信息输出(样本)给**【馈送】**算法
- 你决定什么样的结果是想要的*(例如“是/否”或“真/假”或“销售额/净信贷损失/房价”等)*
从机器的角度来看,这个过程或多或少是一个“连接点”的例行程序。
监督学习的主要目的是扩大数据的范围,并根据标记的样本数据预测不可用、未来或未知的数据。
监督机器学习包括两个主要过程:分类和回归。
- 分类 是从过去的数据样本中学习并手动训练模型以预测本质上二元结果(是/否,真/假,0/1) 的过程。例如:在接下来的 9 个月里,客户是否会流失,某人是否患有癌症等等。分类算法识别某些类型的对象,并相应地对它们进行分类,以预测两种可能结果中的一种。
- 回归 是识别模式并计算连续结果的预测的过程。例如:预测房价或下个月的销售预测等。
使用最广泛的监督算法有:
- 线性回归;
- 逻辑回归;
- 随机森林;
- 梯度增强树;
- 支持向量机(SVM);
- 神经网络;
- 决策树;
- 朴素贝叶斯;
- 最近的邻居。
监督学习算法用例
这些算法最常见的应用领域是销售、零售商业和股票交易中的价格预测和趋势预测。这些算法使用输入数据来评估可能性并计算可能的结果。
2.无监督机器学习算法
无监督学习算法不涉及开发者的直接控制。监督机器学习要求的要点是,我们应该事先知道过去数据的结果,以便能够预测未知数据的结果,但是在无监督机器学习算法的情况下,期望的结果是未知的,尚未定义。
有时候你不想准确预测结果。您只想执行一个分段或聚类。例如,一家银行希望对其客户进行细分,以了解他们的行为。这个商业问题需要使用无监督的机器学习算法,因为这里没有预测具体的结果。
两者的另一大区别是,监督学习专门使用标记数据,而非监督学习则以未标记数据为食。
无监督机器学习算法用于:
- 探索信息的结构;
- 提取有价值的见解;
- 检测模式;
- 将这一点落实到运营中以提高效率。
换句话说,无监督的机器学习试图通过筛选和理解提供给它的信息来描述这些信息。
无监督学习算法应用以下技术来描述数据:
- **聚类:**它是一种对数据的探索,用于根据数据的内部模式将其分割成有意义的组(即聚类),而无需任何组凭证的先验知识。凭证由单个数据对象的相似性以及它与其他数据对象的不同之处来定义(这也可以用于检测异常)。
- **降维:**很多时候,传入的数据中有很多噪音。机器学习算法使用降维来消除这种噪声,同时提取相关信息。
最广泛使用的无监督算法有:
- k-均值聚类;
- t-SNE(t-分布式随机邻居嵌入);
- PCA(主成分分析);
- 关联规则。
无监督学习算法用例
数字营销*(用于基于某些凭证识别目标受众群体——可以是行为数据、个人数据元素、特定软件设置或其他)和广告技术(该算法可用于开发更有效的广告内容目标,也可用于识别活动表现中的模式)*是采用无监督学习算法的主要行业。这些也用于需要探索客户信息和调整相关服务的情况。
3.半监督机器学习算法
半监督学习算法代表了监督和非监督算法之间的中间地带。本质上,半监督模型将两者的某些方面结合成一个自己的东西。
让我们理解半监督算法是如何工作的:
- 半监督机器学习算法使用有限的一组标记样本数据来形成操作的要求(即训练本身)。
- 这种限制导致了部分训练的模型,该模型随后得到标记未标记数据的任务。由于样本数据集的限制,结果被认为是伪标记数据。
- 最后,标记的和伪标记的数据集被组合,这创建了一个独特的算法,该算法结合了监督和非监督学习的描述性和预测性方面。
半监督学习使用分类过程来识别数据资产,并使用聚类过程将其分组为不同的部分。
半监督学习算法用例
法律和医疗保健行业以及其他行业在半监督学习的帮助下管理 web 内容分类、图像和语音分析。
在 web 内容分类的情况下,半监督学习被应用于爬行引擎和内容聚合系统。在这两种情况下,它都使用各种标签来分析内容,并将其排列在特定的配置中。然而,这个过程通常需要人工输入来进一步分类。
在图像和语音分析的情况下,算法执行标记以基于样本语料库提供具有连贯转录的可行图像或语音分析模型。例如,它可以是 MRI 或 CT 扫描。利用一小组示例性扫描,有可能提供能够识别图像中异常的相干模型。
4.强化机器学习算法
强化学习通常理解为机器学习人工智能。
从本质上讲,强化学习就是开发一个自我维持的系统,通过连续的尝试和失败,基于标记数据的组合和与输入数据的交互来改进自己。
加强型 ML 采用了一种叫做勘探/开发的技术。机制很简单——**行动发生,结果被观察,下一个行动考虑第一个行动的结果。**这是一种迭代算法。
使用这种算法,机器被训练来做出特定的决定。它是这样工作的:机器被暴露在一个环境中,在这个环境中,它不断地通过试错来训练自己。机器从过去的经验中学习,并试图捕捉尽可能好的知识,以做出准确的商业决策。
最常见的强化学习算法包括:
- q-学习;
- 时差(TD);
- 蒙特卡罗树搜索(MCTS);
- 异步行动者-批评家代理(A3C)。
强化学习算法用例
强化机器学习适用于信息有限或不一致的情况。在这种情况下,算法可以基于与数据和相关过程的交互来形成其操作程序。
现代 NPC 和其他视频游戏大量使用这种类型的机器学习模型。强化学习为人工智能对玩家动作的反应提供了灵活性,从而提供了可行的挑战。例如,碰撞检测功能对移动的车辆使用这种类型的 ML 算法。
自动驾驶汽车也依赖于强化学习算法。例如,如果自动驾驶汽车( Waymo )检测到道路左转——它可能会激活“左转”场景等等。
这种强化学习变化的最著名的例子是 AlphaGo,它与世界上第二好的围棋选手正面交锋,并通过计算当前棋盘位置之外的动作序列击败了他。
另一方面,市场营销和广告技术运营也使用强化学习。这种类型的机器学习算法可以通过紧密适应用户的行为和周围环境,使重定向操作在传递转换方面更加灵活和高效。
此外,强化学习用于放大和调整聊天机器人的自然语言处理( NLP )和对话生成,以:
- 模仿输入消息的风格
- 开发更多吸引人的、信息丰富的回答
- 根据用户反应找到相关回应。
总之,要记住的最重要的 ML 算法类型是监督式、非监督式和强化式。
请继续关注这个空间,了解更多关于统计、数据分析和机器学习的信息!
清楚地解释:集成学习方法,机器学习的核心
机器学习基础
去神秘化,非传统的解释,它会值得你花时间。
欧文·比尔德在 Unsplash 上的照片
我曾在“上发表过一个帖子,清楚地解释了:什么是偏差-方差权衡,过度拟合&欠拟合”。如果你是一个新手,或者只是想在全力投入整体建模的海洋之前温习一下 偏差和方差 的概念,这篇全面的文章可以作为这篇文章的重要前传。说到这里,我们继续了解更多关于系综建模的知识。我将引用一些现实生活中的例子来简化系综模型的 什么、为什么和如何的概念,重点是装袋和助推技术 。
来源: Giphy
场景 1: 你需要一副新耳机。现在,你有可能走进一家商店,买下售货员展示给你的耳机吗?在这个时代,我确信答案是否定的,因为现在我们在购买任何东西之前都非常依赖我们的“研究”。你可以浏览一些网络技术门户网站,查看用户评论,然后比较你感兴趣的不同型号,同时检查它们的功能和价格。你也可能会询问你的朋友和同事的意见。简而言之,你不会直接得出结论,而是在彻底研究之后做出明智的决定。
现在,我们可以看看集成学习方法的技术定义。
来源:灵感来自 SAS 研究所的一张图表
什么是系综法?
机器学习中的集成模型组合来自多个模型的决策,以提高整体性能。他们的操作思路与购买耳机时相似。
学习模型中误差的主要原因是由于噪声、偏差和方差。
集成方法有助于将这些因素降至最低。这些方法旨在提高机器学习算法的稳定性和准确性。
场景 2: 假设你开发了一个健康健身 app。在将其公之于众之前,您希望收到重要的反馈,以弥补潜在的漏洞(如果有的话)。你可以求助于以下方法之一,阅读并决定哪种方法是最好的:
- 你可以听取配偶或密友的意见。
- 你可以问问你的朋友和办公室同事。
- 您可以发布该应用的测试版,并接收来自 web 开发社区和非偏见用户的反馈。
没有印象分的猜测答案:D,是的,当然,我们将推出第三个选项。
现在,暂停一下,想想你刚才做了什么。你从足够多的人那里听取了多种意见,然后根据这些意见做出了明智的决定。这也是集合方法所做的。
机器学习中的集成模型将来自多个模型的决策进行组合,以提高整体性能。
**场景三:**看看下图;我们可以看到一群被蒙住眼睛的孩子在玩“触摸并告诉”的游戏,同时检查一头他们从未见过的大象。他们中的每一个人都有不同的版本来描述大象的样子,因为他们中的每一个人都接触到了大象的不同部位。现在,如果我们让他们提交一份关于大象描述的报告,他们的个人报告将只能根据他们的经验准确地描述一部分,但他们可以结合他们的观察,给出一份关于大象描述的非常准确的报告。
类似地,集成学习方法使用一组模型,与使用单个模型相比,它们的组合结果在预测准确性方面几乎总是更好。
集成是一种分而治之的方法,用于提高性能。
来源: Pixabay
现在,让我们深入一些重要的合奏技巧。
裂一点:D 你做的很棒:)来源:链接
简单的集成技术
- 取结果的模式
众数:众数是一个统计术语,指在一组数字中出现频率最高的数字。
在这种技术中,使用多个模型来预测每个数据点。每个模型的预测都被视为单独的投票。我们从大多数模型中得到的预测被用作最终预测。
例如:我们可以通过参考上面的场景 2 来理解这一点。我在下面插入了一张图表来展示我们的健康和健身应用程序的测试版从用户社区获得的评级。(将每个人视为不同的模型
输出=模式=3,因为大多数人都这样投票
2.取结果的平均值
在这种技术中,我们从所有模型中获取预测的平均值,并使用它们进行最终预测。
平均值=总和(评分*人数)/总人数=(1 * 5)+(2 * 13)+(3 * 45)+(4 * 7)+(5 * 2)/72 = 2.833 =四舍五入到最接近的整数将是 3
3.取结果的加权平均值
这是平均法的延伸。所有模型被赋予不同的权重,定义每个模型对于预测的重要性。例如,如果你的回答者中有 25 人是专业的应用程序开发人员,而其他人之前没有这方面的经验,那么这 25 人的回答会比其他人更重要。
例如:为了子孙后代,我将这个例子的规模缩减到 5 个人
加权平均值=(0.3 * 3)+(0.3 * 2)+(0.3 * 2)+(0.15 * 4)+(0.15 * 3)= 3.15 =四舍五入到最接近的整数得出 3
高级集成技术
我们现在将学习装袋和增压技术。但是,要使用它们,你必须选择一个基本的学习算法。例如,如果我们选择一个分类树,打包和提升将由一个我们想要的大小的树池组成。
1.打包(引导汇总)
自举聚合是一种集成方法。首先,我们创建带有替换的训练数据集的随机样本(训练数据集的子集)。然后,我们为每个样本建立一个模型(分类器或决策树)。最后,使用平均或多数投票来组合这些多个模型的结果。
由于每个模型都暴露于不同的数据子集,我们最终会使用它们的集体输出,因此我们会确保通过不要过于依赖我们的训练数据集来解决过度拟合的问题。因此,装袋帮助我们减少方差误差。
多个模型的组合降低了方差,尤其是在模型不稳定的情况下,并且可能产生比单个模型更可靠的预测。
随机森林技术实际上使用了这一概念,但它更进一步,通过在训练时为每个自举样本随机选择一个特征子集来进行分裂,从而进一步减少方差。
来源:链接
2.助推
来源:吉菲
提升是一种迭代技术,它基于最后一次分类来调整观察的权重。如果一个观察被错误地分类,它会试图增加这个观察的权重,反之亦然。
Boosting 总体上降低了偏差误差,建立了强预测模型。Boosting 显示出比 bagging 更好的预测准确性,但它也倾向于过度拟合训练数据。 因此,参数调整成为 boosting 算法避免过拟合的关键部分。
Boosting 是一种顺序技术,其中第一个算法在整个数据集上进行训练,后续算法通过拟合第一个算法的残差来构建,从而为先前模型预测不佳的那些观察值赋予更高的权重。
它依赖于创建一系列弱学习者,每个弱学习者可能对整个数据集都不好,但对数据集的某个部分是好的。因此,每个模型实际上都提高了整体的性能。
装袋和增压之间的差异总结
来源:链接
集合方法的优势/好处
几乎所有的 ML 黑客马拉松都使用集成方法来增强模型的预测能力。
让我们来看看使用系综方法的优势:
- 更准确的预测结果——我们可以将集合方法的工作与我们的金融投资组合的多样化进行比较。建议保持债券和股票的混合投资组合,以减少可变性,从而最大限度地降低风险。类似地,在大多数情况下,与单个模型相比,模型集合将在测试用例场景(看不见的数据)上提供更好的性能。
- 稳定且更健壮的模型 -多个模型的综合结果总是比单个模型的噪音小。这导致模型的稳定性和鲁棒性。
- 集合模型可用于捕捉数据中的线性和非线性关系。这可以通过使用两种不同的模型并形成两者的集合来实现。
集合方法的缺点
- 降低模型解释能力- 由于复杂性增加,使用集成方法降低了模型解释能力,使得最终很难得出任何关键的商业见解。
- 计算和设计时间高- 对实时应用不利。
- 选择模特来创作合奏是一门很难掌握的艺术。
因此,现在我们已经讨论了集合方法的所有基础知识,您可以着手尝试它们来进一步增强您的理解。
你可以看看我下面关于机器学习的其他帖子,这些帖子很受欢迎。
解释非常规,这将作为评估分类机器学习模型的详尽列表。
towardsdatascience.com](/top-10-model-evaluation-metrics-for-classification-ml-models-a0a0f1d51b9) [## 解释清楚:4 种机器学习算法
定义、目的、流行的算法和用例——都有解释
towardsdatascience.com](/clearly-explained-4-types-of-machine-learning-algorithms-71304380c59a)
更多关于机器学习、数据科学和统计学的定期帖子,请关注这个空间。
感谢您的阅读!😃
快乐学习:)
解释清楚:基尼系数和洛伦茨曲线
一个重要的统计经济系数——基尼系数
让我们了解基尼系数是什么和为什么以及洛伦兹曲线的一切
这篇文章将为数据科学专业人士解释基尼系数的用法和相关性,我们还将了解洛伦兹曲线,这是一种用图形确定基尼系数的方法。
基尼指数的传统定义是什么?
基尼指数或基尼系数是由意大利统计学家科拉多·基尼在 1912 年提出的一种分配的统计方法。它被用来衡量经济不平等,测量人口中的收入分配。
系数范围从 0(或 0%)到 1(或 100%),0 代表完全相等,1 代表完全不相等。超过 1 的值实际上是不可能的,因为我们没有考虑负收入。(收入最低时可以为 0,但不能为负)
因此,一个所有居民收入相同的国家,其收入基尼系数为 0。在一个国家,一个居民赚取了所有的收入,而其他人什么都没赚到,那么这个国家的收入基尼系数就是 1。
众所周知,基尼系数是分析一个国家或地区收入或财富分配的重要工具,但是,
基尼不应被误认为是对收入或财富的绝对衡量。
一个高收入国家和一个低收入国家可以有相同的基尼系数,只要收入在每个国家内分配相似:
根据经合组织的数据,2016 年土耳其和美国的收入基尼系数都在 0.39-0.40 左右,尽管土耳其的人均 GDP还不到美国的一半(以 2010 年美元计算)。
基尼指数在数据建模中的应用
基尼系数或基尼指数衡量一个变量的值之间的不平等。指数值越高,数据越分散。或者,基尼系数也可以计算为相对平均绝对差的一半。
基尼指数的图示(洛伦茨曲线)
基尼系数通常是根据洛伦茨曲线在数学上定义的,洛伦茨曲线绘制了人口总收入(y 轴)中最底层 x%的人口累积收入的比例。
因此,45 度线代表收入完全平等。
基尼系数可以被认为是位于平等线和洛伦兹曲线之间的面积(图中标记为 A,下图中标记为 A)与平等线下的总面积(图中标记为 A 和 B)之比;即 G = A / (A + B)。由于 A + B = 0.5(因为坐标轴的刻度从 0 到 1),它也等于 2A 和 1–2B。
基尼系数通常通过洛伦茨曲线来表示,洛伦茨曲线通过在水平轴上绘制收入的人口百分位数,在垂直轴上绘制累积收入来显示收入(或财富)分布。
基尼系数等于完全平等线以下的面积(定义为 0.5)减去洛伦茨曲线以下的面积,除以完全平等线以下的面积。换句话说,它是洛伦兹曲线和完全平等线之间面积的两倍。
另一种思考基尼系数的方式是作为对完全平等的偏离的衡量。洛伦茨曲线偏离完全平等的直线(代表基尼系数为 0)越远,基尼系数越高,社会越不平等。
图:图片来源- 维基百科
**示例:**以下是如何通过绘制洛伦兹曲线并计算平等线和曲线之间的面积来计算基尼系数的 excel 图示。
所以,现在基尼系数及其使用洛伦兹曲线的计算对你们来说应该是小菜一碟:)
如果你有任何问题或建议,请告诉我。
感谢您的阅读:)
请关注这个空间,了解更多关于分析、统计和机器学习的内容!
快乐学习!!
清楚地解释:机器学习如何不同于统计建模
它们彼此非常不同,所有的数据科学家都必须理解为什么和如何!
来源:灵感来自于 SAS 研究所的图表
这篇文章提出了一个非常重要的区别,作为数据科学领域的一个活跃部分,我们应该理解这个区别。上面的文氏图最初是由 SAS Institute 发布的,但他们的图没有显示统计学和机器学习之间的重叠,据我所知,这可能是一个疏忽。根据我的信息和理解,我已经重新创建了这个图表。这个文氏图非常恰当地提出了数据科学所有分支的区别和重叠。
我愿意相信数据科学现在是一个总括术语,所有其他科学都可以被描述为数据科学的分支,每个分支都不同,但又与其他分支如此相似!
**机器学习 VS 统计建模:**这是一个古老的问题,每个数据科学家/ML 工程师或任何开始这些领域旅程的人都会遇到。在研究这些领域时,有时机器学习感觉与统计建模交织在一起,这让我们想知道如何区分这两者,或者哪个标签对哪个模型来说是完美的。当然,如今机器学习已经成为一个时髦词汇,但这并不意味着我们开始将我们的统计模型贴上机器学习模型的标签,因为与流行的观点相反,它们是不同的!下面详细了解一下区别。
这个帖子的流程将是:
- 机器学习和统计建模的定义
- 机器学习和统计建模的区别
- 什么时候用哪个?
定义
机器学习
对开发计算机算法感兴趣的研究领域被称为机器学习,该算法在不依赖基于规则的编程的情况下将数据转换为智能行为。
统计建模
统计模型通常被指定为一个或多个随机变量和其他非随机变量之间的数学关系。因此,统计模型是“一个理论的正式表示”。
既然枯燥冗长的定义已经过时,让我们更深入地理解这两个领域之间的差异。
机器学习和统计建模的区别
1.历史和学术相关性
统计建模在机器学习出现之前几个世纪就已经出现了,大约在 20 世纪 50 年代,第一个 ML 程序——塞缪尔的 checker 程序被引入。
世界上所有的大学现在都在启动他们的机器学习和人工智能项目,但他们并没有关闭他们的统计部门。
机器学习与计算机科学部门和独立的人工智能部门一起教授,这些部门处理构建预测算法,这些算法能够通过学习从数据中“学习”而变得“智能”,而没有任何预先指定的规则,如上文 ML 的定义中所述。
鉴于
统计建模与数学系一起教授,数学系侧重于建立模型,这些模型首先可以找到不同变量之间的关系,然后可以预测可以描述为其他独立变量的函数的事件。
2.不确定性公差
这是这两个领域的重要区别。
在统计建模中,我们注意到许多不确定性估计*(如置信区间、假设检验)*,我们必须考虑到,在我们可以信任特定算法的结果之前,必须满足所有假设。因此,它们具有低的不确定性容忍度。
例如:如果我们已经建立了一个线性回归模型,在我们使用该模型的结果之前,我们必须检查以下假设是否得到满足:
- 因变量和自变量之间的线性关系
- 误差项的独立性
- 误差项(残差)需要正态分布
- 平均独立性
- 无多重共线性
- 需要同质性
相反,如果我们建立了一个逻辑模型,必须考虑以下假设:
- 二元逻辑回归要求因变量是二元的,而有序逻辑回归要求因变量是有序的。
- 观察必须是相互独立的。
- 无多重共线性
- 独立变量和对数优势的线性
鉴于
在机器学习算法中,需要考虑的假设很少或者没有。ML 算法比统计模型灵活得多,因为它们对共线性、残差的正态分布等没有严格的要求。因此,它们具有很高的不确定性容忍度。
3.数据要求和方法
统计模型不能在非常大的数据集上运行,它们需要具有较少属性和相当数量观察值的可管理数据集。在统计模型中,属性的数量通常不会超过 10–12,因为它们非常容易过度拟合*(在训练数据集上表现很好,但在看不见的数据上表现很差,因为它非常接近训练数据集,这是一个不希望的场景)*
同样, 大多数 统计模型遵循参数方法(例如:线性回归、逻辑回归)
鉴于
机器学习算法是学习算法,要学习它们需要大量的数据。因此,它们需要具有大量属性和观察值的数据。越大越好! ML 算法在某种程度上需要大数据。
另外, 大部分的 机器学习模型都遵循非参数方法 (K 近邻、决策树、随机森林、梯度推进方法、SVM 等。)
什么时候用哪个?
这主要取决于下面解释的因素。我们将通过例子从理论上讨论这些要点。
统计模型应该是您的首选,如果:
- 不确定性很低,因为当您开始构建模型时,大多数假设都得到满足
- 数据的大小不是很大
- 如果你想隔离少数变量的影响
- 总体预测的不确定性/边际误差是可以的
- 各种独立变量之间的相互作用在数量上相对较少,并且可以预先指定
- 需要高度的可解释性
如果,机器学习可能是更好的选择
- 当要预测的结果不具有很强的随机性时;例如,在视觉模式识别中,对象必须是
E
或者不是E
- 可以在无限数量的精确复制上训练学习算法(例如,字母表中的每个字母或要翻译成德语的某个单词的 1000 次重复)
- 当整体预测是目标时,不能描述任何一个独立变量的影响或变量之间的关系
- 人们对估计预报中的不确定性或选定预测因子的影响不太感兴趣
- 数据的规模是巨大的
- 人们不需要孤立任何特殊变量的影响
- 低可解释性和模型是一个“黑盒”是可以接受的
例如:如果你与一家信用卡公司合作,他们希望建立一个模型来跟踪客户流失,那么他们很可能更喜欢一个有 10-12 个预测值的统计模型,他们可以根据自己的业务领域知识来解释和否决这些预测值,他们不会欣赏这种情况下的黑盒算法,因为对可解释性的需求高于预测的准确性。
另一方面,如果你为网飞和亚马逊这样的客户工作,他们想要建立强大的推荐引擎,那么在这种情况下,对结果准确性的需求高于模型的可解释性,因此,机器学习模型就足够了。
这样,我们就到了这篇文章的结尾。
你可以在我的以下帖子中了解更多关于数据挖掘和机器学习之间的区别以及 4 大机器学习算法的完整细节:
定义、混淆、区别——都有解释
towardsdatascience.com](/clearly-explained-how-machine-learning-is-different-from-data-mining-4ee0e0c91bd4) [## 解释清楚:4 种机器学习算法
定义、目的、流行的算法和用例——都有解释
towardsdatascience.com](/clearly-explained-4-types-of-machine-learning-algorithms-71304380c59a)
观看此空间,了解更多关于机器学习、数据科学和统计学的信息!
快乐学习:)
清楚地解释:机器学习与数据挖掘有何不同
让我们谈一谈大数据时代以及为什么 ML 变得如此受欢迎!
定义、混淆、区别——都有解释
Artem Sapegin 在 Unsplash 上拍摄的照片
该帖子的流程如下:
- 谈论大数据时代以及为什么 ML 现在变得如此流行?
- 数据挖掘和机器学习领域的历史和混淆点
- 数据挖掘和机器学习的定义
- 数据挖掘和机器学习的区别
人类从出生开始就开始分析数据。儿童接触到大量的信号(通过眼睛、耳朵、鼻子、舌头和神经),他的大脑很快学会/适应如何分析这些信号并做出反应。继口语之后,书面语的出现创造了巨大的数据仓库,可以分析至今。
很多人说,我们刚刚进入了大数据 的 时代,但数据总是在我们周围,只是【记录】数据的数量已经开始激增,这是由于 4 个主要因素也导致了机器学习在今天变得如此流行 (以下 4 点是由 AnalyticsVidhya 发布的信息指南提出的):
- 仓储成本低
- 低计算成本
- 现在连接到互联网的设备数量非常多——到 2020 年大约有 500 亿台联网设备
- 当然,云技术给数据世界带来了民主
历史
现在,让我们多谈一点历史,以理解这篇文章所涉及的两个领域——数据挖掘和机器学习
数据挖掘产生于 20 世纪 30 年代,最初被称为数据库中的知识发现,机器学习是在 20 世纪 50 年代第一个 ML 程序 Samuel’s Checker 程序发布时引入的。
数据挖掘和机器学习之间的混淆点
- 两者都是分析过程,是数据科学行业不可或缺的一部分。
- 两者都是从它们在模式识别用例中的最初使用中产生的。
- 两者都构成了从大量数据中学习。
数据挖掘和机器学习的定义
数据挖掘
它包括在现有数据中系统地搜寻有价值的情报。
机器学习
对开发将数据转化为智能行为的计算机算法感兴趣的研究领域被称为机器学习。
现在,无聊的定义已经远离我们,让我们跳到最有趣的部分,差异!
数据挖掘和机器学习的区别
数据挖掘是商业分析的一个子集,它专注于教会计算机——如何识别大型数据集中以前未知的模式、关系或异常,然后人类可以使用它们来解决商业问题。这是一个需要人工干预和决策的手动过程。人类可以通过引入智能特征来使该过程变得智能。
例如:如果一家信用卡公司拥有大量关于客户行为的数据,并且他们希望了解客户流失的模式,那么他们将部署数据挖掘技术来找出不同客户特征之间的关联,这可以强烈地表明未来的客户流失。
鉴于
机器学习是人工智能的一个子集,它专注于教计算机——如何学习分析大型数据集,并“学习”其中的模式*(从训练数据集)*这些模式可以帮助对新数据进行预测。除了初始编程和微调,计算机完全不需要人工干预来学习数据并自行改进其预测。随着机器接收越来越多的数据,它将变得越来越智能。
例如:网飞是机器学习的一个完美例子。我今天在我的建议列表上看到了《金钱大劫案》,那么,网飞怎么知道我接下来想看什么呢?后端有一个强大的机器学习算法,它不断分析与我有类似简档的其他用户的观看偏好,因此它基于此提出建议。随着你看得越来越多,算法会了解你对该类型的偏好,你会得到基于此的建议!
结束语
实际上,所有的数据挖掘都涉及到机器学习的使用,但并不是所有的机器学习都涉及到数据挖掘。
例如:你可以应用机器学习来数据挖掘汽车交通数据,以获得与事故率相关的模式,但另一方面,如果我们谈论无人驾驶汽车,它们是基于纯粹的机器学习,不涉及任何数据挖掘。
作为延续,你可以阅读我下面的帖子来了解 4 种机器学习算法!一定要去看看!
定义、目的、流行的算法和用例——都有解释
towardsdatascience.com](/clearly-explained-4-types-of-machine-learning-algorithms-71304380c59a)
请继续关注这个空间,了解更多关于机器学习、数据分析和统计的信息!
解释清楚:正态分布
为什么每个 ML 工程师或数据科学家都必须了解这一点
这些概念有什么正常或不正常的地方?
资料来源:Giphy
每个试图踏上数据科学的旅程的人都会遇到正态分布。在这篇文章中,我将以非常清晰的方式解释它到底是什么,我们如何解释它,以及为什么它作为一个每个数据科学家都必须意识到的概念具有巨大的重要性。
什么是正态分布?
正态分布也被称为高斯分布或钟形曲线(因为它看起来像一个钟,哈哈!多么直观!),这是统计学中最重要的概率分布,有点神奇,因为我们在大自然中经常看到它。比如身高、体重、血压、测量误差、智商分数等。都遵循正态分布。
有一个原因使得它对统计学非常有用,它被称为中心极限定理,但是让我们把它留到另一篇博文中。最后给出的链接是这篇文章的完美续篇。
现在,参考上图,理解一个正态变量的值是如何分布的。这是一个对称分布,其中大多数观察值聚集在出现概率最高的中心峰值(平均值/平均值)周围,随着我们在两个方向上远离中心峰值,我们看到曲线尾部值出现的概率变得越来越小。这幅图描绘了一个人群的智商水平,可以理解的是,智商水平很低或很高的人很少出现,大多数人的智商都在平均水平范围内。
我们周围的很多很多变量都可以用这个正态/钟形分布来描述。想想你所有的同事到达办公室所花的时间,只有少数人住在 5 分钟或 2 个多小时的距离内。大多数人会在 20 分钟到 70 分钟的距离内(山顶附近的区域)。当你探索越来越多具有正态分布的变量时,我们会发现它就在我们周围,这就是为什么它如此正常,它的名字非常恰当!!
正态分布的参数
正态分布总是以平均值为中心,曲线的宽度由标准差(SD)决定。
这里有两个正态分布,x 轴是以英寸为单位的身高测量值,y 轴是与特定身高相对应的人数。
- 婴儿的分布平均值=20 英寸,标准差=0.6 英寸
- 成人的分布平均值为 70 英寸,标准差为 4 英寸
知道正态分布的标准差的重要性在于它遵循一个经验规则(在下一节中详细解释),即大约 95%的测量值落在平均值的+/- 2 标准差之间。
推断:95%的人口落在平均值+/- 2*SD 之间
- 95%的婴儿身高在 20 +/- 1.2 英寸之间
- 95%的成人身高测量值在 70 +/- 8 英寸之间
正态分布的第一个参数是平均值
平均值是正态分布的中心趋势,它决定了曲线峰值的位置。平均值的变化导致曲线沿 x 轴水平移动。****
正态分布的第二个参数是 SD
标准差是正态分布可变性的度量,它决定了曲线的宽度。SD 的变化会导致曲线变得更紧或更宽,并对曲线的高度产生反比影响。****
曲线越紧(宽度越小)——>高度越高
曲线越展开(宽度越高)——>高度越短
现在,你了解了正态分布曲线的所有基础知识。让我们继续学习与之相关的其他重要信息。
所有正态分布的共同特征
- 都是对称**(咩!我们现在已经知道了,不是吗?:p)**
- 均值=中值=众数
解码:平均值(Mean)是将总体/样本分成两半(中值)的值,是样本/总体中最常出现的值(众数)。放轻松,皮斯!
3.经验规则允许我们确定钟形曲线平均值的特定标准偏差范围内的数据百分比。(当然,您必须知道您的发行版的 SD,这样才能工作!)
这将通过一个例子变得更加清楚。请继续阅读!
让我们看一个披萨外卖的例子。假设一家披萨店的平均配送时间为 30 分钟,标准差为 5 分钟。使用经验法则,我们可以确定 68%的交付时间在 25–35 分钟之间(30 +/- 5),95%在 20–40 分钟之间(30 +/- 25),99.7%在 15–45 分钟之间(30 +/-35)。下面的图表用图形说明了这一特性。
看看当我们知道如何将统计学应用于现实生活问题时,事情变得多么直观?继续我的统计学家、数据科学家/工程师、人工智能爱好者或正在阅读这篇文章的好奇的伙伴们吧!这个世界需要更多的你来分析它的怪癖:)
在这篇文章的最后一部分,我们将了解正态分布的一种特殊情况
标准正态分布:正态分布的特例
正如我们在上面看到的,正态分布根据参数值(平均值和标准差)有许多不同的形状。然而,标准正态分布是均值= 0 且标准差= 1 的正态分布的特例。这种分布也称为 Z 分布。
标准正态分布上的值称为标准分数或 Z 分数。标准分数代表特定观察值高于或低于平均值的 SD 数。
例如,标准分数 1.5 表示观察值高于平均值 1.5 个标准差。另一方面,负的分数代表低于平均值的值。平均值的 Z 值为 0。
万岁!!我们已经涵盖了构成正态分布基础的所有内容。我的下一篇博文是关于中心极限定理的。
这实际上是最重要的统计定理之一,请继续阅读以获得简单的解释!
towardsdatascience.com](/clearly-explained-the-mighty-central-limit-theorem-b8152b94258)
请留意这一空间中对统计概念的更简单的解释。
待在家里!注意安全!**
解释清楚:皮尔逊 V/S 斯皮尔曼相关系数
数据科学领域的每个人都应该知道的基础知识
在这篇文章中了解更多何时使用哪个系数
我最近遇到一个场景,我自学了皮尔逊和斯皮尔曼相关系数之间的差异。我觉得这是媒体上数据科学领域的许多人可以利用的一条信息。我将彻底解释这两者之间的区别,以及每一种都适用的确切场景。请继续阅读!
这篇文章的内容:
- 相关性定义
- 皮尔逊和斯皮尔曼相关系数的比较分析
相关性的定义
相关性是两个变量线性相关的程度。这是双变量数据分析中的一个重要步骤。从最广泛的意义上来说,相关性实际上是二元数据中两个随机变量之间的任何统计关系,不管是不是因果关系。
要记住的一条重要规则是,相关性并不意味着因果关系
让我们通过两个例子来理解它实际上意味着什么。
- 在夏季的几个月里,冰淇淋的消费量增加了。冰淇淋单位的销售有很强的相关性。在这个特殊的例子中,我们看到了因果关系,因为极端的夏天确实推动了冰淇淋的销售。
- 冰淇淋销售也与鲨鱼袭击有很大的关联。现在我们可以很清楚地看到,鲨鱼袭击绝对不是由冰淇淋引起的。所以,这里没有因果关系。
因此,我们可以理解相关性并不总是意味着因果关系!
相关系数是多少?
相关系数是两个变量相对运动之间关系强度的统计度量。值的范围在-1.0 和 1.0 之间。相关性-1.0 表示完全负相关,而相关性 1.0 表示完全正相关。0.0 的相关性表明两个变量的移动之间没有线性关系。
2 个重要的相关系数——皮尔森和斯皮尔曼
1.皮尔逊相关系数
维基百科定义:在统计学中,皮尔逊相关系数(Pearson correlation coefficient)也称为皮尔逊的 r 或二元相关(bivariate correlation),是衡量两个变量 X 和 Y 之间的线性相关的统计量。它的值介于+1 和-1 之间。值+1 表示完全正线性相关,0 表示没有线性相关,1 表示完全负线性相关。
**要记住的重要推论:**皮尔逊相关只能评估两个连续变量之间的线性关系(只有当一个变量的变化与另一个变量的成比例变化相关联时,关系才是线性的)
**示例用例:**我们可以使用皮尔逊相关来评估年龄增长是否会导致血压升高。
以下是皮尔逊相关系数®如何随两个变量之间的关系强度和方向变化的示例。请注意,当无法建立线性关系时(参见第三列中的图表),皮尔逊系数的值为零。
来源:维基百科
2.斯皮尔曼相关系数
维基百科定义:在统计学中,以 Charles Spearman 命名的 Spearman 秩相关系数或 Spearman 的ρ,是秩相关(两个变量的秩之间的统计相关性)的一种非参数度量。它评估使用单调函数描述两个变量之间的关系有多好。
**需要记住的重要推论:**Spearman 相关性可以评估两个变量之间的单调关系——连续变量或顺序变量,它基于每个变量的排序值,而不是原始数据。
什么是单调关系?
单调关系是执行下列操作之一的关系:
(1)随着一个变量的值增加,另一个变量的值也增加,或者,
(2)随着一个变量的值增加,另一个变量的值减少。
但是,不完全是恒定的速率,而在线性关系中,增加/减少的速率是恒定的。
来源:维基百科
**示例用例:**员工完成测试练习的顺序是否与他们受雇的月数有关,或者一个人的智商与每周看电视的时间有关
皮尔逊系数和斯皮尔曼系数的比较
- 两个相关系数之间的根本区别在于,皮尔逊系数适用于两个变量之间的线性关系,而斯皮尔曼系数也适用于单调关系。
2.另一个区别是,皮尔逊处理变量的原始数据值,而斯皮尔曼处理排序变量。
现在,如果我们觉得散点图直观地表明“可能是单调的,可能是线性的”关系,我们最好的选择是应用 Spearman 而不是 Pearson。即使数据是完全线性的,换成 Spearman 也没有坏处。但是,如果它不完全是线性的,我们使用皮尔逊系数,那么我们就会错过斯皮尔曼可以捕捉到的信息。
让我们来看看我在这个网站上发现的一些信息丰富的例子:
- 皮尔逊= +1,斯皮尔曼= +1
2.Pearson = +0.851,Spearman = +1(这是一个单调递增的关系,因此 Spearman 正好是 1)
3.皮尔逊= 0.093,斯皮尔曼= 0.093
4.皮尔逊= 1,斯皮尔曼= 1
5.Pearson = 0.799,Spearman = 1(这是一个单调递减的关系,因此 Spearman 正好为 1)
注:这两个系数都不能捕捉任何其他类型的非线性关系。因此,如果散点图表明不能用线性或单调函数表达的关系,那么这两个系数都不能用来确定变量之间关系的强度。
为了进一步阅读,您可能想看看下面两篇解释等级排序和 PSI,CSI 用于模型验证和监控的文章。
继续阅读,了解更多关于分类模型中等级排序的概念和用法
juhiramzai.medium.com](https://juhiramzai.medium.com/why-rank-ordering-is-so-important-bc1ff8a48764) [## PSI 和 CSI:前 2 个模型监控指标
种群稳定性指数和特征稳定性指数
towardsdatascience.com](/psi-and-csi-top-2-model-monitoring-metrics-924a2540bed8)
关注本空间了解更多关于数据科学、机器学习和统计学的内容。
快乐学习:)
解释清楚:强大的中心极限定理
为什么每个 ML 工程师/数据科学家都必须了解这一点
这实际上是最重要的统计定理之一,请继续阅读以获得简单的解释!
资料来源:Giphy
中心极限定理(CLT)是统计学中的基本定理之一,好消息是,这是一个非常简单的概念,当你进一步阅读时就会明白。在阅读任何进一步的正态分布之前,您必须理解一个先决概念,以及它们为什么如此重要!阅读我关于正态分布的文章,它是中心极限定理的完美前传。
这些概念有什么正常或不正常的地方?
towardsdatascience.com](/clearly-explained-normal-distributions-and-the-central-limit-theorem-8d7cc5a6052f)
继续,标准定义:
中心极限定理(CLT)指出,给定足够大的样本量,无论变量在总体中的分布如何,变量均值的抽样分布都将接近正态分布。
解读冗长的^定义
让我们直接看一些例子,当我们从另一边出来时,CLT 对我们来说已经非常清楚了。
示例#1
让我们来看一个均匀分布*(它从 0 到 1,之所以称为均匀分布,是因为在 0 和 1 之间选择值的概率相等,因此它的概率密度函数(PDF)是直的水平黑线)。*现在,假设我们从该分布(绿点)中随机抽取 20 个样本,并计算这些样本的平均值,我们最终得到一个值,在本例中用黑色虚线表示为 0.5。让我们继续在直方图上绘制这个平均值。因为这个直方图到目前为止只有一个平均值,所以它并没有告诉我们什么(下图)。继续从相同的分布中提取更多的随机样本,计算各自的平均值,并再次在直方图上绘制这些平均值,我们开始得到一个有趣的输出(下图)
现在,随着我们继续从均匀分布中取出越来越多的随机样本,并继续在直方图上绘制样本均值,我们会得到以下结果,结果表明这是一个正态分布(见右曲线)。
推论:我们从均匀的数据分布开始,但是从中抽取的样本的平均值导致了正态分布。
实施例 2
在第二个示例中,让我们遵循与示例#1 相同的步骤,唯一的不同是我们这次将从指数分布中抽取样本。
我们将再次随机抽取 20 个样本,计算样本的平均值,并绘制在直方图上。从这个指数数据分布快进到大约 100 个样本,直方图开始看起来像下面这样,它的模式现在对我们来说并不奇怪。是的,你猜对了,样本的平均值是正态分布!
推论:我们从指数数据分布开始,但是从中抽取的样本的平均值导致了正态分布。
因此,在这一点上,CLT 的暗示变得非常直观。
中心极限定理意味着即使数据分布不是正态的,从中抽取的样本的均值分布也是正态的。
知道样本均值总是*正态分布的实际含义是什么?
在分析领域,我们每天都会遇到各种各样的数据,我们并不总是知道源数据的分布,但是,因为我们知道 CLT,所以我们甚至不需要关心这个事实,因为平均值总是正态分布的,我们完全没有必要担心源数据的分布。
(注——为了让 CLT 能够工作,我们必须能够计算出你的样本的平均值。有一种分布称为柯西分布,它没有样本均值,因此 CLT 不适用于它,但除了柯西,我没有遇到任何其他分布是 CLT 的例外,所以在任何其他分布的情况下,你可以肯定中心极限定理非常适用于它。)*
下面是知道均值正态分布的实际含义:
- 我们可以使用均值的正态分布来分配置信区间。
- 我们可以执行 T 检验(即,如果两个样本的平均值之间存在差异)
- 我们可以执行 ANOVA 测试(即 3 个或更多样本的平均值之间是否存在差异)
- 我们可以进行任何使用样本均值的统计检验。
这就把我们带到了这篇文章的结尾!这篇文章涵盖了我们在处理数据和样本时应该知道的中心极限定理的全部理论。
观看这个空间的更多关于分析、统计和机器学习的帖子!!
快乐学习!😃
前两种决策树的简单指南:CHAID 和卡特
机器学习基础
理解这些算法的本质
亚当·博斯在 Unsplash 上的照片
基于树的学习算法被认为是最好的和最常用的监督学习方法之一,因为它们使预测模型具有高准确性、稳定性和易于解释。与线性模型不同,它们很好地映射了非线性关系。他们善于解决手边的任何类型的问题(分类或回归)。
CHAID 和卡特是两种最古老的决策树。它们也是当今行业中最常用的决策树类型,因为它们非常容易理解,但彼此又有很大不同。在本帖中,我们将了解理解这两种决策树所需的所有基本信息。
让我们先深入了解一下 CHAID 决策树算法。
CHAID 卡方自动交互检测
这个算法最初是由 Kass 在 1980 年提出的。从这个算法的名字可以看出,它是基于卡方统计的。卡方检验产生一个介于 0 和 1 之间的概率值。卡方值越接近 0,表示正在比较的两个类别之间存在显著差异。类似地,更接近 1 的值表示这两个类别之间没有任何显著差异。
CHAID 算法中使用的变量类型:
待预测的变量,即因变量:连续变量还是分类变量
独立变量:仅限分类变量(可以超过 2 个类别)
因此,如果有连续的预测变量,那么我们需要将它们转换成分类变量,然后才能提供给 CHAID 算法。
用于确定下一个最佳分割的统计测试:
连续因变量:f 检验(回归问题)
分类因变量:卡方(分类问题)
让我们先了解 Bonferroni 调整/校正,然后再继续。
Bonferroni 调整/校正
在统计学中, Bonferroni 校正是用来抵消多重比较问题的几种方法之一。
这种调整解决了这样一个事实,即您执行的测试越多,类型 1 错误(假阳性)的风险就越大,也就是说,看起来好像您偶然发现了一些重要的东西,但实际上您没有。
上图表明,如果我们取α值为 0.05 并进行 1 次测试,那么我们有 95%的置信度,表明我们有 95%的概率能够避免 1 型错误。现在,请注意,当我们开始将测试数量增加到 100 时,我们只剩下 0。^%概率能够避免第一类错误。为了抵消这种影响,我们计算了调整后的 alpha 值和测试次数。现在,只要我们可以使用这个新的调整后的α值,理论上我们就可以处于安全区。
在 100 次测试中观察调整后的 alpha 值,它变得如此之低,以至于树将停止生长,因为它将无法找到任何可以达到超显著水平的变量。
一般来说,所有开发决策树的软件都会给建模者一个关闭它的选项。Bonferroni 调节设置应保持开启。如果我们在树没有生长的情况下关闭它,并且我们想通过关闭 Bonferroni 来进行实验,那么考虑使 alpha 值低于通常的 0.05,以小心我们上面讨论的类型 1 错误的可能性。
另外,一旦建模阶段完成,一定要验证你的树。
CHAID 算法的幕后过程
- 逐一循环遍历所有预测器,以确定相对于因变量而言**差异最小的一对(预测器)类别。**将为分类问题计算卡方统计(因变量也是分类变量),为回归问题计算 f 检验(因变量是连续变量)。
- 如果给定预测器类别对的相应测试不具有由α-合并值定义的统计显著性,则它将合并相应的预测器类别并重复第一步(即,找到下一对类别,其现在可以包括先前合并的类别)。
- 如果相应预测器类别对的统计显著性显著=小于相应的 alpha-to-merge 值,则在启用设置的情况下,它将为相应预测器的类别集计算 Bonferroni 调整后的 p 值。
- 这一步是关于选择分裂变量。具有最小调整 p 值的预测变量,即产生最显著分裂的预测变量,将被考虑用于树中的下一次分裂。如果任何预测值的最小(Bonferroni)调整 p 值大于某个α-to-split值,则不会执行进一步的分裂,相应的节点将成为终端节点。
- 这个过程将迭代地继续,直到不能执行进一步的拆分(给定α-合并和α-拆分值)。
CHAID 如何处理不同类型的变量?
标称变量:根据上述第 2 点自动分组数据
序数变量:根据上述第 2 点自动分组数据
连续变量:在执行#2 之前转换成段/十分位
CHAID 算法的本质是创建宽树。
我们现在可以开始理解 CART 决策树算法
CART-分类和回归树
这个算法是由 Breiman 等人在 1984 年向世界介绍的。
这种算法基于“纯度”和“平衡”这两大支柱。如上所述,纯度由基尼系数表示,而平衡由决策树的左和右分区中的相同人口分布表示。一个最佳的车树不会在任何一根柱子上摇摆。
- 在 CART 树上强制“平衡”会导致许多不纯的叶节点,这违背了使用决策树进行决策的目的。
- 在一个 CART 树上强制“纯洁”会给我们一个片段中很少的人口分布,这又一次违背了健康决策树的目的。
CART 算法中使用的变量类型:
1.回归树
待预测变量,即因变量:连续
自变量:连续或分类(二元)
2.分类树
要预测的变量,即因变量:分类(二元)
自变量:连续或分类(二元)
理解购物车算法的要点:
- CART 本质上是计算昂贵且缓慢的。
- CART 总是产生二进制拆分,不像 CHAID,如果需要,它可以产生两个以上的拆分。
- 回归树基于使用最小平方偏差(LSD)对节点杂质的评估,这意味着节点内的方差。
- 分类树基于基尼平等指数。基尼系数为 0 表示完全平等,系数为 1 表示最大不平等。
- 在连续变量的情况下,与 CHAID 相比,CART 能够测试更多的分界点,因为 CHAID 创建了连续变量的分段/十分位数,这些分段/十分位数通常在本质上是任意的,并且有时可以隐藏连续变量中的真实模式。
- 对于高达 5–15%的缺失数据,CART 比 CHAID 表现得更好,因为缺失值在 CART 中被视为一个单独的组,只有当两个类别之间实际上有很高的相似性时,它才会与任何其他类别组合,这与 CHAID 将缺失值与最近的组组合不同。
- 卡特形成了一棵比 CHAID 小得多的树
- 卡特有生产高而瘦的树的天性,不像 CHAID 有生产宽的树的天性。
CART 算法的幕后过程
- 选择基于变量值的规则以获得最佳分割,从而根据因变量区分观察值
- 一旦选择了一个规则并将一个节点一分为二,相同的过程被应用于每个“子”节点(即,它是一个递归过程)
- 当购物车检测到无法继续获利,或符合一些预设的停止规则时,分割停止。(或者,尽可能分割数据,然后在稍后修剪树)。
CHAID 和卡特的停车规则
- 父/子样本量
- 树的深度: CHAID 一般应保持在 5-6 的深度,而根据树木的性质,应允许大车行走到 7-8。CHAID 可以在树深度 5 捕获信息,因为它将是一个宽树,而 CART 允许一些额外的树深度级别,因为它产生高而瘦的树,需要更多的深度来正确捕获问题的本质。
- **CHAID 的置信度:**分割/合并的默认 alpha 值设置为 0.05。为了防止过度拟合,我们可以将其降低到 0.01,以将置信区间从 95%增加到 99%,在这种情况下,树将增长得更少。类似地,如果我们感觉树没有生长,那么我们可以将阈值增加到 0.1,创建 90%的置信水平,因此,树将生长得更多。这就是你如何试验所有的停止规则,直到你对你的树满意为止。每次实验结束时都要进行验证,以了解你的树在看不见的数据上表现如何。
- 【CART 的 Gini 指数:这有助于我们捕捉某个节点的杂质的某种程度的变化。假设基尼值的默认变化保持在 0.0001。如果我们给它加一个零,使它为 0.00001,那么就更容易得到一个更大的树,因为变化阈值已经降低了。另一方面,如果我们去掉一个零,使其为 0.001,那么树将不会生长得那么多,因为很难达到杂质变化的更高阈值。
我不会以这两棵树的比较来结束我的发言。有很多利弊列表可以用来比较卡特和 CHAID,但我相信每一个都适合不同的目的。你必须研究和处理你的数据,用各种各样的方法进行大量的实验,才能真正掌握什么对你试图解决的特定业务问题有好处。
我宁愿在这里列出决策树的常见优点和缺点作为结论部分:
决策树的利与弊
来源:https://rpubs.com/chidungkt/451329
优点:
- 通俗易懂: 决策树输出即使对于非分析背景的人来说也是非常通俗易懂的。阅读和解释它们不需要任何统计知识。它的图形表示非常直观,用户可以很容易地联系他们的假设。
- 在数据探索中有用: 决策树是识别最重要变量以及两个或更多变量之间关系的最快方法之一。在决策树的帮助下,我们可以创建新的变量/特征,这些变量/特征具有更好的预测目标变量的能力。也可以用在数据探索阶段。
- 需要较少的数据清理: 与其他一些建模技术相比,需要较少的数据清理。它在一定程度上不受离群值和缺失值的影响。
- 数据类型不是约束: 它可以处理数值和分类变量。
- 非参数方法: 决策树被认为是非参数方法。这意味着决策树对空间分布和分类器结构没有任何假设。
缺点:
- 过拟合: 过拟合是决策树模型最实际的困难之一。这个问题可以通过对模型参数设置约束和剪枝来解决。
- 不适合连续变量: 在处理连续数值型变量时,决策树在对不同类别的变量进行分类时会丢失信息。
在我的下一篇文章中,我将把 QUEST 和 C5 算法作为本指南的一个扩展,来理解决策树算法中实际发生的事情。
请继续关注本空间,了解更多关于数据科学、机器学习和统计学的信息!
快乐学习!!😃