使用 Python 和美汤进行 5 分钟的网页抓取
用 Python 和美汤刮西甲统计
埃米尔·佩龙——Unsplash的照片
E 从网站上提取数据可以节省大量的时间和精力。感谢美汤,刮网之路变得更加顺畅。在这篇文章中,我们将使用 Python 从一个网站上收集西甲 2019–20 的统计数据。
导入库
import pandas as pd
import requests as rq
from bs4 import BeautifulSoup
首先,必须导入所有有用的库。我已经导入了熊猫来存储数据框中的统计数据。导入 Requests 库是为了向 HTTP 服务器发送请求,同时引入漂亮的 Soup 用于 web 元素检索。
与网页通信
get_url = rq.get("https://www.msn.com/en-us/sports/soccer/la-liga/player-stats")
get_text = get_url.text
soup = BeautifulSoup(get_text, "html.parser")
我们必须获得目标 URL,然后使用漂亮的 Soup 库解析它。一旦创建了汤对象,就可以开始了。
提取网页元素
rank = [i.text for i in soup.findAll('td', {
"class" : "hide1 rankvalue"
})]
player_name = [i.text
for i in soup.findAll('td', {
"class" : "playername"
})
]
team_name = [i.text
for i in soup.findAll('td', {
"class" : "teamname"
})
]
team_la = [i.text
for i in soup.findAll('td', {
"class" : "teamtla"
})
]
games_played = [int(i.findAll('td')[4].text) for i in soup.findAll('tr', {
"class" : "rowlink"
})]
goals_scored = [int(i.findAll('td')[7].text) for i in soup.findAll('tr', {
"class" : "rowlink"
})]
assists = [int(i.findAll('td')[8].text) for i in soup.findAll('tr', {
"class" : "rowlink"
})]
使用漂亮的 Soup 方法,您可以访问 web 元素及其项目。我主要使用了*“find all”*方法,将“class”作为一个参数来获取所有项目的列表。
存储在数据帧中
laliga_stats = pd.DataFrame({
"Rank" : rank,
"Player Name" : player_name,
"Team Name" : team_name,
"Team" : team_la,
"Games Played" : games_played,
"Goals" : goals_scored,
"Assists" : assists
})
laliga_stats.set_index('Rank',inplace=True)
最后,使用 Pandas 库将数据存储到数据框中。并且,你可以进行你的分析了。
你只要写一行代码,就能获得 2019-20 西甲赛季的前 10 名射手:
laliga_stats[0 :10]
2019-20 赛季西甲十大射手
所有需要的是 Python 和美丽的汤的奇迹刮一个网站。所以,在一个新的标签上打开 Beautiful Soup 的文档,开始刮吧。
如需反馈和讨论,请在 Linkedin 联系我!
5 分钟创建一个 AWS Lambda 函数,以保持对您所在地区的新冠肺炎的更新
几个简单的步骤,确保您始终拥有最新的信息
以下是如何利用 AWS 在当地政府更新新冠肺炎信息时给自己发短信的方法。我们将使用这些 AWS 资源:
注意:我将使用 AWS web 控制台来完成这些步骤,但您也可以使用 boto3 和 Cloud Formation 等工具。
步骤 1:创建一个 S3 存储桶
我们将创建一个 S3 存储桶来保存我们想要监控的当前网页的副本。这样,每当 lambda 函数查看网页的当前版本时,我们就可以将其与以前的版本进行比较。
如果您使用的是 web 控制台:
- 导航至 S3 仪表盘
- 点击“创建存储桶”
- 输入存储桶名称。我用了
covid-bucket
(记住你用的名字) - 继续点击“下一步”接受默认设置
现在从你的电脑上传一个文本文件。我给我的取名current_webpage.txt
。它可以是一个空的文本文件,很快就会被覆盖。
注意:确保它是一个 **.txt*
文件。并记住这个文件名以备后用。
步骤 2:创建一个 Lambda 函数
注意:在 SNS 支持的 这些区域 中的一个进行。
对于此步骤,请确保您拥有以下信息:
- 当地政府用来发布新信息的网站。(我住在明尼苏达州,所以我用的是卫生部的网页
- 您希望向其发送更新的电话号码
- 您刚刚创建的 S3 存储桶和文件名
导航至 Lambda 仪表盘并点击“创建功能”。使用“从头开始创作”选项。
给你的函数起一个名字,并选择一个 **Python3 运行时。**现在使用默认权限。
您可以将下面的代码复制并粘贴到控制台的文本编辑器中。确保填写网站 URL、本格式中的电话号码以及 S3 桶名。
import boto3
import urllib3# Define URL
url = 'https://PUT_YOUR_URL_HERE.gov/virus-updates'# Set up http request maker thing
http = urllib3.PoolManager()# S3 object to store the last call
bucket_name = 'covid-bucket'
file_name = 'current_webpage.txt'object_s3 = boto3.resource('s3') \
.Bucket(bucket_name) \
.Object(file_name)# List of phone numbers to send to
phone_numbers = ['+1REDACTED','+1REDACTED']# Connect to AWS Simple Notification Service
sns_client = boto3.client('sns')def lambda_handler(event, context):
# Ping website
resp = http.request('GET',url)
new_page = resp.data
# read in old results
old_page = object_s3.get().get('Body').read()
if new_page == old_page:
print("No new updates.")
else:
print("-- New Update --")
# Loop through phone numbers
for cell_phone_number in phone_numbers:
try:
# Try to send a text message
sns_client.publish(
PhoneNumber=cell_phone_number,
Message= f'Local COVID19 Update: {url}',
)
print(f"Successfuly sent to {cell_phone_number}")
except:
print(f"FAILED TO SEND TO {cell_phone_number}")
# Write new data to S3
object_s3.put(Body = new_page)
print("Successfully wrote new data to S3")
print("done")
return None
步骤 3:更新函数的 IAM 角色
现在我们需要给 lambda 函数以下权限:
- 从我们的 S3 桶中读写
- 使用社交网络发布消息
导航到 IAM 仪表板,点击侧边栏上的角色。
找到为您的职能创建的角色。命名约定将包括你的 lambda 函数的名字<function name>-role-******
。
单击“附加策略”
搜索“ S3 和“社交网络”,并添加完全访问策略。
点击附加策略
步骤 4:添加一个调度程序来调用 Lambda 函数
回到 web 控制台中的 lambda function dashboard,然后单击“添加触发器”。然后选择“云观察事件”
用“规则”下拉菜单:
- 选择“创建新规则”
- 输入规则名称和描述
- 为“规则类型”选择调度表达式
- 在“计划表达式”文本字段中输入
rate(5 minutes)
- 点击“添加”
结论
运行这个应用程序应该会让您保持在这些 AWS 服务的自由层(这不是一个保证)。
您可以通过在 web 控制台中单击 lambda 函数配置屏幕顶部的“test”按钮来创建和运行测试。这个测试的输入是什么并不重要,因为输入并不用于 lambda 函数代码中。
或者你可以等 5 分钟,看看是否收到短信。
感谢阅读。注意安全。访问疾病预防控制中心网站获取更多关于新冠肺炎的信息。
每个数据科学家都应该避免的 5 个错误
数据科学项目中需要采取的预防措施
当一个具有挑战性的数据科学项目到来时,我们有时会在兴奋或试图做出一个完美的模型时,以犯错误而告终。不时地反复检查工作并对工作保持谨慎是很重要的。在这篇博客中,我将讨论数据科学家经常犯的五个错误。
1.数据泄露
数据泄漏是当模型根据预测时不可用的信息进行训练时发生的情况。结果可能是一个模型在训练和测试时表现很好,但在现实生活中性能会急剧下降。原因有时是意外地在测试和训练数据集之间共享信息,而不是保持测试数据不可见和不被触及。
一些可能的数据泄漏包括:
在预处理期间
当使用 PCA (主成分分析)进行降维时,我们通过从使用训练数据创建的协方差矩阵中学习特征向量,将 n 维数据降维到 k 维(k < n)。通过在前 k 个特征向量的方向上投影 n 维数据,训练数据被变换到 k 维空间。然后我们训练模型。
在测试过程中,正确的方法是通过将 n 维测试数据投影到前一步学习的前 k 个特征向量的方向上,将测试数据转换到 k 维空间,然后进行模型预测。但是,如果错误地将 PCA 应用于整个数据(训练+测试数据),会造成不必要的数据泄漏,模型性能会受到影响。
类似地,当应用像 NMF (非负矩阵分解)这样的算法时,关于如何学习这两个矩阵的训练发生在训练期间。在测试时,只使用学习将测试数据转换成所需的矩阵。但是,如果错误地将 NMF 应用于整个数据(训练+测试数据),**就会造成不必要的数据泄漏。**阅读这篇写得非常好的博客了解更多关于数据泄露的细节。
2.过多的冗余功能
具有高度相关的要素会影响模型的性能。这也被称为维数灾难。由于拥有过多冗余功能而面临的主要问题是:
- 过拟合 :多余的特征试图过拟合模型,导致高方差。这也会影响模型在测试期间的准确性。
- 没有清晰的特征重要性图:需要了解哪些预测因子对理解特征重要性贡献更大。这些信息有助于数据科学故事讲述和要素排名。由于具有冗余特征,模型表现异常,并且特征重要性的清晰图像丢失。
- 计算时间:随着冗余特征导致的特征空间增加,计算时间增加。在我们需要快速结果的情况下,这可能会导致一个问题,因为许多模型的运行时间与特征的数量成平方关系。
冗余功能过多的问题可以通过以下方式避免:
- 增加特性:主要思想是保持模型简单。使用向前和向后选择等技术逐步添加要素。我们只希望重要的特性在最后成为模型的一部分。
- 检查 多重共线性 并删除冗余特征:我们可以检查特征的相关性并删除冗余特征。
- 执行降维技术:像 PCA 、自动编码器、 NMF 这样的降维技术有时在去除冗余信息时非常有用。
- 正则化:每当模型试图过度拟合时,正则化技术就会惩罚它。点击阅读更多信息。
3.未来不可用的功能
很多时候,为了改进训练数据,我们会使用在测试过程中可能无法直接或立即获得的特性。
我在工作中遇到的一个这样的例子是天气数据。如果我们将天气数据用于预测应用,我们应该记住,在预测期间,未来的实际天气数据是不可用的,我们能得到的最好的是天气预测。训练期间的实际天气数据和测试/实际运行期间的可用天气预测可能会有很大偏差,从而降低模型性能。
4.错误的数据结构选择和糟糕的编码风格
我曾经遇到过由于错误的数据结构选择导致应用程序速度大幅下降的问题。
如果应用程序需要快速查找元素的存在,请使用 Dictionary 或 python 中的 Set,避免使用 List。
字典/集合是具有快速搜索需求的应用程序的正确数据结构
正确的数据结构使具有搜索功能的应用程序速度更快
谈到编码风格,最佳实践是拥有模块化的代码以及良好的变量和函数命名风格。它增加了可理解性、可解释性,并更容易地合并新的需求和变更。查看此链接了解最佳编码实践。
5.在验证多个测试周期、数据和人口统计数据的结果之前,报告模型性能
很多时候,数据科学家在有限的数据中进行测试后,最终会报告模型性能。在满怀信心地揭示模型性能之前,模型需要在生产中的大量测试数据中进行测试。
- 如果这是一个预测项目,测试模型在多个时间段的性能/预测。
- 如果这是一个金融营销模型,测试模型在不同人口统计的不同市场中的性能。
- 如果是零售领域模型,测试跨类别、部门等的模型性能
结论
在这篇博文中,我想指出数据科学家最终会犯的 5 个常见但关键的错误。通过这个博客,一点点的谨慎和意识可以拯救你,并有望让事情变得简单一点。如果你觉得还有更多的东西可以添加到常犯的错误列表中,请发表评论。
我的 Youtube 频道更多内容:
嗨,伙计们,欢迎来到频道。该频道旨在涵盖各种主题,从机器学习,数据科学…
www.youtube.com](https://www.youtube.com/channel/UCg0PxC9ThQrbD9nM_FU1vWA)
关于作者-:
Abhishek Mungoli 是一位经验丰富的数据科学家,拥有 ML 领域的经验和计算机科学背景,跨越多个领域并具有解决问题的思维方式。擅长各种机器学习和零售业特有的优化问题。热衷于大规模实现机器学习模型,并通过博客、讲座、聚会和论文等方式分享知识。
我的动机总是把最困难的事情简化成最简单的版本。我喜欢解决问题、数据科学、产品开发和扩展解决方案。我喜欢在闲暇时间探索新的地方和健身。在 中 、Linkedin或insta gram关注我,查看我以前的帖子。我欢迎反馈和建设性的批评。我的一些博客-****
- 以简单&直观的方式分解时间序列
- GPU 计算如何在工作中真正拯救了我?
- 信息论& KL 分歧第一部分和第二部分
- 使用 Apache Spark 处理维基百科,创建热点数据集
- 基于半监督嵌入的模糊聚类
- 比较哪种机器学习模型表现更好
5“更多”开源工具,轻松开始数据可视化。
数据可视化并不一定困难或昂贵。
里卡多·戈麦斯·安吉尔在 Unsplash 上的照片
想知道为什么这篇文章的标题有“更多”而不是“ 5 个开源工具来开始数据可视化”?原因是这是我不久前写的一篇关于同一主题的文章的延伸👇
使用这些简单直观的工具,直接进入数据可视化流程。
towardsdatascience.com](/10-free-tools-to-instantly-get-started-with-data-visualisation-d7fadb5f6dce)
在上面的文章中,我写了一些开源工具,它们可以让初学者立即开始构建漂亮的视觉效果。本文中包括的工具有:
本文建立在上一篇文章的基础上,包含了更多的开源数据可视化工具。这些工具使创建图表和地图变得容易,并把你的想象力放到画布上。
1.挥舞
fruit是一个数据可视化工具,也是一个讲述故事的工具。用户无需编写代码,就可以创建交互式的、有吸引力的、移动友好的图形。蓬勃发展的互动模板可以真正使您的数据生活。您可以选择一个模板,然后用您自己的数据替换它。除了其他基本图表,fluore 还提供 3D 地图和赛车条形图,可以将整个讲故事的体验提升到另一个水平。公版绝对免费,非常适合评测或教育使用。
使用
来源:https://flourish.studio/examples/
2.图表块
Chart Block 是一个可视化工具,能够在几分钟内构建漂亮的交互式图表。即使对初学者来说,这也是一个很好的工具,因为它不涉及任何编码。然后可以定制几十种图表类型来满足用户的需求。
生成的图表可以嵌入到任何网站或使用社交媒体工具共享。此外,图表还可以导出为 illustrators 和其他图形包的可编辑矢量图形。图表块包括一个免费的个人计划,这是理想的个人。
使用
视频来源:https://www.chartblocks.com/en/
3.数据工作室
Data Studio 是谷歌的免费报告和仪表板工具。它使用起来毫不费力,你可以在相当短的时间内上手。因为 Data Studio 完全基于云,所以它是可伸缩的。这也消除了下载它的需要。只要你有一个浏览器,你应该是好的。Data studio 的工具包中有以下产品:
- 连接到各种数据源
图片来源:https://datastudio.google.com/data
- 使用交互式报告和仪表盘快速可视化数据
图片来源:https://datastudio.google.com/data
- 与他人共享这些报告和仪表板。
使用
视频源:数据工作室
4.数据浏览器
Matthew Renze创建的 Data Explorer 是另一个数据可视化工具,它通过简单的用户界面产生强大的可视化效果。这是一款面向所有人的免费开源交互式数据可视化工具。由于 UI 简单,对于初学者来说,入门并进行有效的探索性数据分析极其简单。它的一些显著特点是:
- 能够从 CSV 文件导入数据并自动检测数据类型
- 拖放功能
- 使用交互式导航树浏览您的数据。
- 平移和缩放功能的可用性
- 使用用户友好的交互式过滤器过滤您的数据。
- 最后,共享整个项目或选择感兴趣的数据并复制到其他应用程序中。
使用
视频来源:https://www.data-explorer.com/
5.数据 GIF 生成器
Data GIF Maker 是比较两个术语的简单工具。最棒的是,你可以直接制作动画 gif,导出来在任何平台上分享。这个工具被有意地保持简约。这并不稀奇,但肯定可以用在演讲或写作中,来创造一个引人入胜的故事。用户可以使用三种模板,即矩形、跑道和圆形。以下是官方博客对这款工具的评价:
我们通常用这个工具来表示竞争搜索兴趣,但它也可以显示你想让它显示的任何东西——投票数、销售额或一个赛季的进球。
使用
作者提供的视频
结论
数据可视化是数据科学生态系统的重要组成部分。探索性数据分析有助于提供一些对任何数据分析工作流都至关重要的重要见解。一个好的数据可视化工具有助于保持对数据的关注,而不是工具。本文重点介绍了一些免费的数据可视化工具,它们可以让整个可视化过程变得直观而优雅,同时让数据自己说话。
5 更好的绘图工具和技术
来源:艾萨克·史密斯@ unsplash-免费库存图片
充分利用您的数据
大约四个月前,我写了第一篇关于绘图的文章( 10 个提高绘图技巧)。因为,正如我当时所说,在现实生活的数据科学中,绘图确实很重要。
在我的日常生活中,我花在绘制和分析这些图表上的时间比做其他任何事情都多。让我解释一下,我在 Ravelin 技术公司工作。我们的业务是数据,特别是为在线商家分析和预测欺诈。该公司的主要产品结合使用机器学习、网络分析、规则和人类洞察力来预测交易是否可能是欺诈。我们为我们的每一个客户都建立了一个专门的机器学习模型,但这个模型的建立是在与他们建立关系的开始,然后它主要需要维护。
怎么维护?有时是为了引入新功能,或者是因为顾客行为的改变。然而,也可能是我们收到的数据发生了变化。或者可能是因为我们第一次建立模型时没有足够的数据,所以我们最初遗漏了一些东西。也有可能是客户或我们在我们的预测中发现了一些不可靠的表现,例如,在一个特定的国家。无论是哪种情况,通常都会进行广泛的调查,以找出问题所在和/或我们可以做得更好的地方。为了给出更多的上下文,对我们来说,分析一个模型的性能通常意味着拥有数百万行和数千列的数据集。这只能通过绘图来解决。仅仅通过查看数据,几乎不可能找到模式或见解。绘图允许我们比较特性的性能,查看随时间的演变、值的分布、平均值和中值的差异等。等。等。等。
正如我在之前的故事中所说,在我们的领域中,我们必须同等重视可解释性和可解释性的重要性。现实生活中的数据科学永远不会发现你在一个项目中独自工作,你的同事和/或客户通常不太了解你将使用的数据。能够解释你的思维过程是任何数据相关工作的关键部分。这就是为什么复制和粘贴是不够的,图表个性化成为关键。
今天我们将学习 5 种技巧来制作更好的图表,我发现这些技巧在过去很有用。其中一些是日常使用的工具,而另一些你会不时地用到。但是,希望手头有这个故事,在那一刻到来时会派上用场。我们将使用的库包括:
import matplotlib.pyplot as pltimport seaborn as sns
具有以下样式和配置:
plt.style.use(‘fivethirtyeight’)%config InlineBackend.figure_format = ‘retina’%matplotlib inline
1.更改轴中的范围和步长
matplotlib 或 seaborn 设置范围和步骤的默认配置通常足以可视化数据,但有时我们会希望看到轴中的所有步骤被显式显示。或者,我发现有用的东西是绘制所有数据,但只包括特定范围的 y 轴或 x 轴的轴标签。
例如,假设我们正在绘制模型预测的分布图,我们希望专注于 30 到 50 之间的值,每两个单位一步,同时不忽略其余的值。我们最初的 seabon 的“distplot”应该是这样的:
我们现在有两种选择来实现上面的想法:
ax.set_xticks(range(30, 51, 2))ax.xaxis.set_ticks(np.arange(30, 51, 2))
在这两种情况下,我们都需要指定起点、终点和步骤。注意终点是如何遵循“小于”的逻辑,而不是“等于或小于”。结果将是下图:
另外,请注意我是如何从“ax”对象调用这两个选项的,因为这是默认设置。当我们创建任何类型的图表时,都会自动创建轴(’ ax ‘)和图形(’ fig ')。我们也可以用下面的方法做同样的事情:
myplot = sns.distplot(mydata)myplot.set_xticks(range(30,51,2))
2.旋转刻度
这是一个简单但非常有用的技巧,例如,如果我们处理的是文本标签而不是数字。我们可以通过使用“set_xticklabels”中的“rotation”超参数来做到这一点:
ax.set_xticklabels(labels=my_labels, rotation=90)
请注意我是如何将“my_labels”传递给“labels”超参数的,因为在使用“xticklabels”时这是强制的。但是,如果你正在绘制一个“distplot ”,你可以简单地传递要显示的数值范围,而对于任何其他图表,你可以传递与你为 x 轴指定的数组完全相同的数组。此外,您可以像这样将这种方法与第一种方法结合起来:
range_step = np.arange(30, 51, 2)ax.xaxis.set_ticks(range_step)ax.set_xticklabels(labels=range_step, rotation=90);
获得以下结果:
3.更改绘图之间的间距
通常情况下,我们会希望同时绘制几个图表来比较它们的结果,将它们可视化,或者可能只是为了节省时间和/或空间。无论如何,我们可以用一种非常简单的方式通过使用“支线剧情”来做到这一点:
fig, ax = plt.subplots(figsize=(18,10), nrows=2)
我们指定了两行,因此我们将绘制两个图表:
sns.distplot(mydata, ax=ax[0])sns.lineplot(x=mydata[‘xaxis’], y=mydata[‘yaxis’], ax=ax[1])
现在,有时,不是只有两张图表,我们可能有更多。也许我们需要包括他们所有人的标题。我们可能还有一些带有文本标签的图表,需要旋转它们以提高可读性。在这种情况下,我们可能会在图之间有一些重叠,增加图表之间的空间可以帮助我们更好地可视化它们。
plt.subplots_adjust(hspace = 0.8)
请注意,图的高度保持不变(在本例中为 10),但图表之间的空间增加了。如果你想保持你的图表的大小,你必须通过“figsize”超参数来增加你的图形大小。
此外,超参数“hspace”跟随水平空间。如果你在画多列而不是多行,你可以用超参数“vspace”来完成同样的工作。
顺便说一下,如果你想知道如何为你的图表设置标题,你可以在我的前一篇文章中找到这个技巧和其他一些更好的绘图技巧。
注意:就像我上面指定要画两行一样,你也可以指定固定的列数。在这种情况下,图表的索引将遵循双索引逻辑,如 ax=[0,1]。
4.定制您的混淆矩阵
不幸的是,这不是深入解释混淆矩阵如何工作或者它有什么用的空间。尽管如此,如果你想了解更多,我总是推荐这个来自 M. Sunasra 的故事。
现在,如果你已经熟悉了这个概念,你可能在过去遇到过这样的情况,有时由“sklearn.metrics”库中的“plot_confusion_matrix”创建的默认热图会出现上下方格被截断的情况,如下图所示:
来源:https://gis.stackexchange.com/
我们可以用一些线条从头开始绘制我们自己的混淆矩阵来解决这个问题。例如:
fig = plt.figure(figsize=(12,10))cm = skplt.metrics.confusion_matrix(real_y, pred_y)labels=[0,1,2,3,4]ax = sns.heatmap(cm, annot=True,annot_kws={“size”:12}, fmt=’g’, cmap=”Blues”, xticklabels=labels, yticklabels=labels)bottom, top = ax.get_ylim()ax.set_ylim(bottom + 0.5, top — 0.5)ax.set(ylabel=’True label’)ax.set(xlabel=’Predicted label’)plt.show()
我们在这里做的是:
- 我们创造了一个空的形象。宽于高,因为我们将在热图的右侧添加注释
- 我们通过‘skplt . metrics . confusion _ matrix’获得混淆矩阵的值
- 我们根据类别的数量指定了“标签”
- 我们使用第 2 点中的值创建一个热图,并指定:I)’ annots '等于 True,ii) 'annot_kws '用于指定注释的字体大小(在本例中为 12),iii) 'fmt '用于传递字符串格式代码,iv) 'cmap '用于颜色模式,v)最后我们指定两个轴的标签(在混淆矩阵中,两者是相同的)
- 我们得到 y 轴视图限制,并再次设置为± 0.5
- 最后一步:将 y 和“xlabels”分别设置为真和预测标签
结果应该是这样的:
5.绘制累积分布图
当然,我不需要估计绘制累积分布有多有用,无论是为了更好地理解元素百分比达到某个值,还是为了比较我们数据中的两个不同组。
您可以通过 Seaborn 的“distplot”图表本身轻松获得这种图表,只需设置以下内容:
sns.distplot(my_data, label=’my label’, color=’red’, hist_kws=dict(cumulative=True))
我们可以通过设置 x 轴的界限来使图表看起来更好:
sns.distplot(my_data, label=’my label’, color=’red’, hist_kws=dict(cumulative=True)).set(xlim=(0, my_data.max()))
正如我在故事开始时所说的,这些工具或技巧中的一些我一直在使用,而另一些只是偶尔使用。但是,希望了解这些快速修复和技术将帮助您做出更好的图,并更好地理解您的数据本身。
最后,别忘了看看我最近的一些文章,比如‘分类变量编码:什么,为什么和如何? 或 官方说法:时间不存在讲的是如何对待机器学习的数据集中的时间特征。此外,我们离圣诞节已经有点远了,但你可能会喜欢阅读这份 2020 年 9 本数据科学相关书籍的清单。
还有如果你想直接在你的邮箱里收到我的最新文章,只需 订阅我的简讯 😃
中号见!
你应该知道的 SQL 中最有用的 5 个窗口函数
让您的 SQL 技能更上一层楼
在 Unsplash 上由 Fabrizio Verrecchia 拍摄的照片
介绍
在我的上一篇文章中,我解释了什么是 SQL 窗口函数以及如何使用它们。在这篇文章中,我将分享我认为最有用的 5 个窗口(分析)功能。
如果您在工作中与数据打交道,我强烈建议您尝试理解这些(即数据分析师、产品分析师、数据科学家、数据工程师等)。它们肯定会派上用场的!
说到这里,让我们开始吧。
为了帮助您理解这 5 个窗口功能是如何工作的,我将使用下表作为示例:
1.行号
它有什么作用? ROW_NUMBER 简单地返回每一行的编号,第一条记录从 1 开始。
什么时候有用? 当你想得到一个特定表格的第一条或最后一条记录时,行号是非常有用的。例如,如果您有一个客户购买的表,并且您想获得每个客户的第一次购买,您可以按客户(姓名/id)进行分区,并按购买日期进行排序。然后,您可以筛选行数= 1 的表。
示例: 使用我上面的示例,假设我想对每一行应用一个行号,按性别并从最高 GPA 到最低 GPA 进行拆分。然后,我可以执行以下查询来获得以下结果:
SELECT *,
ROW_NUMBER() OVER (PARTITION BY Gender ORDER BY GPA DESC) as rn
FROM
students
请注意,因为按 GPA desc 排序,GPA 最高的女性和男性的行号为 1。
2.总和/计数
它有什么作用? SUM()和 COUNT()是聚合函数,它们或者对列中的值求和,或者对列中非空的值进行计数。
什么时候有用? 通过在窗口函数中使用 SUM()或 COUNT(),可以计算累计总和或累计计数。如果您想要创建显示特定指标(即订单数量、收入等)随时间增长的图表,这将非常有用。
虽然这个例子不一定公正,但它会让你了解它是如何工作的。
SELECT *,
SUM(GPA) OVER (PARTITION BY Gender ORDER BY GPA DESC) as GPA_sum
FROM
students
请注意 GPA_sum 列是如何计算累积 GPA 的(给定行的 GPA 加上之前所有行的 GPA)。
3.最小/最大
它是做什么的?
就像在聚合函数中使用 MIN()/MAX()一样,你也可以在窗口函数中使用它。
什么时候有用? 如果你想比较每一行的最高/最低值,最小/最大是有用的。
例子: 在下面的例子中,我们可以用这个来比较每个学生的 GPA 与每个性别的最高 GPA。您可以更进一步,创建一个新列来计算两者之间的差异。
SELECT *,
MAX(GPA) OVER (PARTITION BY Gender ORDER BY GPA DESC) as Max_GPA
4.滞后/领先
它是做什么的?/什么时候有用? LEAD()和 LAG()在想要比较前几行或后几行的值时很有用。
示例: 假设我想比较每个学生的平均绩点与下一个学生的平均绩点,后者刚好低于他/她的平均绩点。我可以使用 LAG()函数来实现这一点。
SELECT *,
LEAD(GPA) OVER (ORDER BY GPA ASC) as Lower_GPA
FROM
students
请注意,第一行是空的,因为它没有可以引用的前一行。
5.稠密秩
它有什么作用? DENSE_RANK 类似于 ROW_NUMBER,只是对相等的值返回相同的秩(NUMBER)。
什么时候有用?当您想要根据一个或多个特定变量对数据进行排序时,DENSE_RANK 非常有用。
例如: 如果我们想将学生的 GPA 从最低到最高排序,我们可以使用下面的代码来实现。
SELECT *,
DENSE_RANK() OVER(ORDER BY GPA ASC) as Dense_rank
请注意,Martin 和 Jason 有相同的 GPA,因此,他们的 Dense_rank 都等于 4。
感谢阅读!
通过阅读这篇文章,你不仅应该知道什么是窗口函数,还应该很好地掌握它的通用性和功能性。你可以用更多的方式来使用窗口函数,但是这五个绝对是我职业生涯中最有用的!
特伦斯·申
- 查看 我的免费数据科学资源 每周都有新素材!
- 如果你喜欢这个, 在 Medium 上关注我 了解更多
- 让我们连线上LinkedIn
神经网络中使用的 5 个必须知道的激活函数
非线性的本质
照片由德鲁·帕特里克·米勒在 Unsplash 上拍摄
通用逼近定理意味着神经网络可以逼近将输入(X)映射到输出(y)的任何连续函数。表示任何函数的能力是神经网络如此强大和广泛使用的原因。
为了能够逼近任何函数,我们需要非线性。这就是激活功能发挥作用的地方。它们用于向神经网络添加非线性。在没有激活函数的情况下,神经网络可以被认为是线性模型的集合。
神经网络是包含许多节点的层的组合。因此,构建过程从一个节点开始。下面是一个没有激活功能的节点。
没有激活功能的神经元(图片由作者提供)
输出 y 是输入和偏置的线性组合。我们需要以某种方式添加非线性元素。考虑下面的节点结构。
具有激活功能的神经元(图片由作者提供)
非线性是通过将激活函数应用于输入和偏置的线性组合的总和来实现的。增加的非线性取决于激活函数。
在本帖中,我们将讨论神经网络中 5 种常用的激活方式。
1.乙状结肠的
sigmoid 函数的取值范围介于 0 和 1 之间。它也用于逻辑回归模型。
(图片由作者提供)
无论 sigmoid 函数的输入值是什么,输出值都将在 0 和 1 之间。因此,每个神经元的输出被标准化为范围 0-1。
(图片由作者提供)
当 x 值接近 0 时,输出(y)对输入(x)的变化更敏感。随着输入值远离零,输出值变得不那么敏感。在某个时间点之后,即使输入值有很大的变化,输出值也几乎没有变化。这就是 sigmoid 函数实现非线性的方式。
这种非线性也有不利的一面。我们先来看 sigmoid 函数的导数。
(图片由作者提供)
当我们远离零时,导数趋向于零。神经网络的“学习”过程取决于导数,因为权重是基于梯度更新的,梯度基本上是函数的导数。如果梯度非常接近零,则以非常小的增量更新权重。这导致神经网络学习速度非常慢,永远无法收敛。这也被称为消失梯度问题。
2。Tanh(双曲正切)
它与 sigmoid 非常相似,只是输出值在-1 至+1 范围内。因此,我们说 tanh 是以零为中心的。
(图片由作者提供)
sigmoid 和 tanh 之间的区别在于,对于 tanh,梯度并不局限于在一个方向上移动。因此,双曲正切函数可能比 sigmoid 函数收敛得更快。
双曲正切激活函数也存在消失梯度问题。
3.整流线性单位
relu 函数只对正值感兴趣。它保持输入值大于 0。所有小于零的输入值都变成 0。
(图片由作者提供)
神经元的输出值可以设置为小于 0。如果我们将 relu 函数应用于该神经元的输出,则从该神经元返回的所有值都变成 0。因此,relu 允许抵消一些神经元。
我们能够用 relu 函数仅激活一些神经元,而用 tanh 和 sigmoid 激活所有神经元,这导致了密集的计算。因此,relu 比 tanh 和 sigmoid 收敛得更快。
对于小于 0 的输入值,relu 的导数为 0。对于这些值,权重在反向传播期间从不更新,因此神经网络无法学习。这个问题被称为将死再禄问题。
4.泄漏 ReLU
它可以被认为是对垂死的 relu 问题的解决方案。漏 relu 为负输入输出一个小值。
(图片由作者提供)
尽管 leaky relu 似乎正在解决垂死的 relu 问题,但一些人认为在大多数情况下准确性没有显著差异。我想这可以归结为尝试两者,看看对于一个特定的任务是否有什么不同。
5。Softmax
Softmax 通常用于多类分类任务,并应用于输出神经元。它所做的是将输出值归一化为概率分布,使概率值加起来等于 1。
Softmax 函数将每个输出的指数除以所有输出的指数之和。结果值形成一个概率分布,其概率总和为 1。
我们来做一个例子。考虑目标变量有 4 个类的情况。以下是 5 个不同数据点(即观察值)的神经网络输出。
每一列代表一个观察的输出(图片由作者提供)
我们可以将 softmax 函数应用于这些输出,如下所示:
(图片由作者提供)
在第一行中,我们将 softmax 函数应用于矩阵 a 中的值。第二行将浮点精度降低到 2 位小数。
这是 softmax 函数的输出。
(图片由作者提供)
如您所见,每列中的概率值加起来为 1。
结论
我们已经讨论了神经网络中使用的 5 种不同的激活函数。为了增加非线性,必须在神经网络中使用激活函数。
天下没有免费的午餐!就计算复杂性而言,激活函数也给神经网络带来负担。它们也对模型的收敛有影响。
了解激活函数的属性以及它们的行为方式非常重要,这样我们就可以选择最适合特定任务的激活函数。
通常,激活函数的期望属性是:
- 计算成本低
- 零居中
- 可微的。激活函数的导数需要携带关于输入值的信息,因为权重是基于梯度更新的。
- 不会导致消失梯度问题
感谢您的阅读。如果您有任何反馈,请告诉我。
通过 Prince 的 5 个必须知道的降维技术
减少功能对您的数据科学项目有好处
Alexander Schimmeck 在 Unsplash 上的照片
答根据维基百科的说法,降维是将高维空间数据转换到低维空间。
换句话说,降维将数据从大量特征转换成少量特征。我们先说从一百个特性变成两个特性。
但是我们为什么需要降维呢?如果我们的机器学习模型有许多功能,这不是很好吗?嗯,技术上来说是的,但只是到某一点。更多的特性可能会增加你的度量,但它会在某个地方达到峰值,然后下降。
此外,当我们拥有太多功能时,会出现一些问题,包括:
- 较高数量的特征会增加数据的方差,这可能会导致过度拟合— 尤其是在观察数量少于现有特征数量的情况下。
- 数据之间的密度和距离变得不那么有意义,这意味着数据之间的距离是等距的或者是相同的相似/不同的。这影响了聚类和异常值检测,因为数据中的关键信息被低估了。
- 组合爆炸或大量值会导致计算上难以处理的问题,这个过程需要太长时间才能完成。
和其他一些问题,但你明白了。太多功能没用。这就是为什么我们需要降维技术。
你可以认为降维技术是建模之前的一个中间步骤;无论你的目标是聚类还是预测。您是否只想看到隐藏的潜在变化或使用结果作为另一个特征是您的自由裁量权。
说到结果,所有这些 降维技术的结果都是奇异值分解或者 SVD** 。这个术语在这篇文章中可以找到。我不会在这里过多讨论,因为 SVD 只是把矩阵分解作为一个过程来处理,而不是主要的焦点。**
头脑:知识和商业理解永远胜过任何一种技术。尽管降维的目的是在特征空间中找到相关性,但是具有许多相关特征比变换不那么相关的特征更好。
很少有 Python 包来处理降维问题;一个例子是王子套餐。在本文中,我将概述 prince 包中可用的五种降维技术。
维度缩减技术
王子包标榜自己是 Python 因子分析库。虽然不是所有的维度技术都是因子分析方法,但有些是相关的。这就是为什么王子包,包括技术,也与因素分析。
prince 包可用于降维的技术有:
在本文中,我不会详细解释每种技术的理论,因为我计划创建一篇关于它的更详细的文章。相反,我将给出这些技术的一个简短概述,以及您应该在什么时候将它与示例一起应用。
何时使用该技术取决于特性,下面是根据 prince 包何时应用该技术的总结表。
作者创建的表格
关于 prince 的一些注意事项是,prince 包使用了奇异值分解的随机版本(SVD )。这比使用更普遍的完全方法要快得多,但是结果可能包含很小的内在随机性。大多数时候,你不需要担心,但是如果你想要可重复的结果,那么你应该设置 **random_state**
参数。
SVD 的随机化版本是一种迭代方法,Prince 的每种应用 SVD 的算法都拥有一个n_iter
参数,该参数控制用于计算 SVD 的迭代次数。一般来说,该算法收敛非常快,因此建议使用较低的 **n_iter**
,尽管较高的数值可以给出更精确的结果,但计算时间较长。
现在,在我们开始之前,让我们先安装软件包。
pip install prince
1.主成分分析
我认为主成分分析是降维概念中介绍最多和教科书式的模型。PCA 是现代数据分析中的标准工具,因为它是一种简单的非参数方法,用于从混乱的数据集中提取相关信息。
主成分分析旨在减少复杂的信息,并提供隐藏在高维数据下的简化结构。PCA **的主要优势在于计算每个维度对描述数据集可变性的重要性。**例如,六个维度的数据可能在一个维度上存在大部分变异。如果你想了解更多关于 PCA 及其局限性的信息,你可以在这里阅读教程论文。
那么,我们什么时候用 PCA 来降维呢?根据 prince 准则,当所有尺寸都是数值(全数值特征)时为**。让我们用数据集示例来尝试一下。**
#Importing the necessary packageimport pandas as pd
import seaborn as sns
from prince import PCA#Dataset preparation with only numerical featuresmpg = sns.load_dataset('mpg')mpg.dropna(inplace=True)
mpg_test = mpg.drop(['name', 'origin'], axis =1, inplace = True)
mpg_test.head()
现在我们有了包含所有数字特征的 mpg 数据集。让我们尝试将主成分分析应用到数据集中,以将特征减少为两个主要成分。请注意,您可以设置与输入到模型中的特征数量一样多的主成分。在这种情况下,它是 7,但这意味着根本没有降维。
#Setup our PCA, n_components control the number of the dimension
pca =PCA(n_components = 2, n_iter = 3, random_state = 101)Training and transform our data
pca.fit(mpg_test)
mpg_pca = pca.transform(mpg_test)
mpg_pca.head()
这样,我们将七维数据集缩减为二维(两个 PC),但是这个二维解释了原始维度的多少变化?
pca.explained_inertia_
似乎 PC1 解释了大约 71%,PC2 解释了大约 12%,所以我们的二维特征解释了原始维度的大约 83%。那还不算太坏。我们可以试着想象我们的两台电脑以及附加标签。以‘原点’特性为标签来试试吧。
ax = pca.plot_row_coordinates(mpg_test,
color_labels=mpg['origin'])
二维特征有助于区分美国和其他国家,尽管欧洲和日本的标签有点困难。
让我们试试 prince 提供的另一种方法 PCA。我们可以获得原始变量和主成分之间的相关性。
pca.column_correlations(mpg_test)
我不确定是哪种相关方法,但我假设是皮尔逊相关。我们还可以知道每个观察值对每个主成分的贡献有多大。
pca.row_contributions(mpg_test).head()
2.对应分析
CA 是一种降维技术,传统上应用于列联表。它以与 PCA 相似的方式转换数据,其中心结果是 SVD。需要列联表中数据的 CA 的固有属性意味着更适合将 CA 应用于分类特征。让我们用一个数据集示例来尝试一下。
#Creating Contigency tablesflights = sns.load_dataset('flights')
pivot = flight.pivot_table(values = 'passengers', index ='year' ,columns = 'month' )
这是我们的飞行数据列联表,我们可以看到这里有如此多的信息。我们将使用 CA 来降低维度,并从中提取额外的洞察力。
#Preparing CAfrom prince import CA
ca = CA(n_components=2,n_iter=3,random_state=101 )#Fitting the data
ca.fit(pivot)
与 PCA 不同,没有数据转换,所以我们需要从类本身访问结果。让我们尝试获取行值(行坐标)。
ca.row_coordinates(pivot)
以上是列联表相对于行(在本例中是年)的变动信息。如果您想要从列的角度获得信息,我们也可以用下面的代码来完成。
ca.column_coordinates(pivot)
如果你想画出坐标,你可以用下面的代码。
ax = ca.plot_coordinates(X = pivot, figsize = (6,6))
通过绘制坐标,我们可以知道数据实际在哪里。我们可以看到数据倾向于聚集在一起。这就是我们如何从列联表中获得隐藏的洞察力。
另外,您可以使用下面的代码访问 CA 解释的变体。
ca.explained_inertia_
3.多重对应分析
MCA 是 CA 对两个以上分类特征(三个或三个以上)的扩展。这意味着 MCA 适用于特定的分类特征。MCA 的思想是将 CA 应用到数据集的独热编码版本中。现在让我们尝试使用一个数据集示例。
#Dataset preparationtips = sns.load_dataset('tips')
tips.drop(['total_bill', 'tip'], axis =1, inplace = True)
以上是仅包含我们将使用的分类特征的数据集(大小特征被视为分类特征)。让我们尝试将 MCA 应用于数据集。
from prince import MCA
mca = MCA(n_components = 2, n_iter = 3, random_state = 101)mca.fit(tips)
tips_mca = mca.transform(tips)
tips_mca.head()
结果类似于 PCA 或 CA 结果,两个主成分以 SVD 结果作为值。就像以前的技术一样,我们可以将坐标绘制成二维图形。
mca.plot_coordinates(X = tips)
MCA 使用与 CA 相同的方法来获取它的列和行坐标,上面的图总结了这一切。我们可以看到彩色的是列坐标,灰度的是行坐标。我们可以看到似乎有两种数据聚类,左侧和右侧。
最后,您可以使用下面的代码访问模型解释的差异。
mca.explained_inertia_
4.多因素分析
多因素分析(MFA)寻找所有特征中存在的共同结构。当您有一组数字或分类特征时,使用 MFA。这是因为 MFA 用于分析由几个组特征描述的一组观察值。MFA 的主要目标是整合描述相同观测值的不同特征组。
对于数据集示例,我将使用 prince 包中的教程。在教程数据集中,是关于三个专家对六种不同的葡萄酒给出他们的意见。对每种葡萄酒的意见都被记录为一个特征,我们希望在对每种葡萄酒有一个总体了解的同时,考虑每位专家的不同意见。MFA 适用于这种分析。
让我们试着建立数据。
X = pd.DataFrame(
data=[
[1, 6, 7, 2, 5, 7, 6, 3, 6, 7],
[5, 3, 2, 4, 4, 4, 2, 4, 4, 3],
[6, 1, 1, 5, 2, 1, 1, 7, 1, 1],
[7, 1, 2, 7, 2, 1, 2, 2, 2, 2],
[2, 5, 4, 3, 5, 6, 5, 2, 6, 6],
[3, 4, 4, 3, 5, 4, 5, 1, 7, 5]
],
columns=['E1 fruity', 'E1 woody', 'E1 coffee',
'E2 red fruit', 'E2 roasted', 'E2 vanillin', 'E2 woody',
'E3 fruity', 'E3 butter', 'E3 woody'],
index=['Wine {}'.format(i+1) for i in range(6)]
)
X['Oak type'] = [1, 2, 2, 2, 1, 1]
以上是我们的数据集,对每种葡萄酒的看法,以橡木类型作为额外的分类变量。现在,在 prince 中使用 MFA,我们需要指定组类别。所以,让我们创建一个。
groups = {
'Expert #{}'.format(no+1): [c for c in X.columns if c.startswith('E{}'.format(no+1))] for no in range(3)}
groups
在小组成员在场的情况下,让我们尝试应用 MFA 来降低维度。
from prince import MFA
mfa = MFA(groups = groups, n_components = 2, n_iter = 3, random_state = 101)mfa.fit(X)
mfa.transform(X)
在这里,我们获取每种葡萄酒的全局行坐标,在这里我们已经将特征简化为二维。就像之前一样,我们可以尝试绘制行坐标。
mfa.plot_row_coordinates(X=X, labels = X.index, color_labels=['Oak type {}'.format(t) for t in X['Oak type']])
我们可以看到一个清晰的葡萄酒分离和密切的每种葡萄酒的橡木类型作为标签。如果你愿意,我们也可以得到组中每个数据的行坐标。
mfa.partial_row_coordinates(X)
我们也可以画出这些组的行坐标。
mfa.plot_partial_row_coordinates(X =X , color_labels=['Oak type {}'.format(t) for t in X['Oak type']])
当您需要访问模型解释的方差时,您可以像前面的技术一样访问它。
mfa.explained_inertia_
5。混合数据的因子分析(FAMD)
最后,FAMD 是一种致力于对包含定量和定性特征的数据集进行降维的技术。**这意味着 FAMD 适用于具有分类和数值特征的数据。**通过考虑混合类型的特征来分析观察值之间的相似性是可能的。此外,我们可以探索所有功能之间的关联。
粗略地说,FAMD 算法可以被看作是 PCA 和 MCA 的混合。
让我们用一个数据集示例来尝试一下。
#Using the tips dataset, change the size feature to string object
tips = sns.load_dataset('tips')
tips['size'] = tips['size'].astype('object')from prince import FAMD
famd = FAMD(n_components =2, n_iter = 3, random_state = 101)#I leave out tips as I want the sex feature as the label
famd.fit(tips.drop('sex', axis =1))
famd.transform(tips)
就像之前一样,我们通过将维度缩减为二维来获得全局行坐标。我们也可以画出行坐标。
ax = famd.plot_row_coordinates(tips,color_labels=['Sex {}'.format(t) for t in tips['sex']] )
FAMD 在他们的分析中使用了 PCA 和 MCA 技术。这就是为什么坐标的构建块由分类特征和数字特征组成。如果您想访问这两个分析结果,我们也可以这样做。
famd.partial_row_coordinates(tips)
我们也可以画出来。
ax = famd.plot_partial_row_coordinates(tips, color_labels=['Sex {}'.format(t) for t in tips['sex']])
最后,如果你想知道模型解释了多少方差。您也可以用下面的代码来访问它。
famd.explained_inertia_
结论
在本文中,我解释了 prince 包提供的五种不同的降维技术。它包括:
- 主成分分析
- 对应分析
- 多重对应分析
- 多因素分析
- FAMD(混合数据的因子分析)
何时使用这些技术取决于你所拥有的特性。
希望有帮助!
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
熊猫 5 个必知的串线操作
熊猫让字符串操作变得简单
阿玛多·洛雷罗在 Unsplash 上的照片
我们必须用数值来表示每一位数据,以便由机器学习和深度学习模型进行处理和分析。然而,字符串通常不会有一个好的和干净的格式,需要预处理来转换成数值。Pandas 提供了许多通用函数来高效地修改和处理字符串数据。
在这篇文章中,我们将会发现熊猫是如何操纵绳子的。我将字符串函数和方法分为 5 类:
- 分裂
- 剥离
- 更换
- 过滤
- 合并
让我们首先创建一个示例数据框架来处理示例。
import numpy as np
import pandas as pdsample = {
'col_a':['Houston,TX', 'Dallas,TX', 'Chicago,IL', 'Phoenix,AZ', 'San Diego,CA'],
'col_b':['$64K-$72K', '$62K-$70K', '$69K-$76K', '$62K-$72K', '$71K-$78K' ],
'col_c':['A','B','A','a','c'],
'col_d':[' 1x', ' 1y', '2x ', '1x', '1y ']
}df_sample = pd.DataFrame(sample)
df_sample
1。分割
有时字符串携带多条信息,我们可能需要分别使用它们。例如,“col_a”包含城市和州。熊猫的拆分功能是一个非常灵活的拆分字符串的功能。
df_sample['col_a'].str.split(',')0 [Houston, TX]
1 [Dallas, TX]
2 [Chicago, IL]
3 [Phoenix, AZ]
4 [San Diego, CA]
Name: col_a, dtype: object
现在,每个元素都根据用于拆分的字符转换成一个列表。我们可以很容易地从这些列表中导出单个元素。让我们创建一个“state”列。
df_sample['state'] = df_sample['col_a'].str.split(',').str[1]df_sample
警告:下标([1])必须与 str 关键字一起应用。否则,我们将获得指定行中的列表。
df_sample['col_a'].str.split(',')[1]
['Dallas', 'TX']
拆分可以在任何字符或字母上进行。
如果扩展参数设置为真,分割功能返回一个数据帧。
df_sample['col_a'].str.split('a', expand=True)
拆分与再拆分
默认情况下,从左侧进行拆分。要在右侧进行分割,请使用 rsplit 。
考虑下面的系列:
让我们应用分割功能,并使用 n 参数限制分割次数:
categories.str.split('-', expand=True, n=2)
仅执行左侧的 2 次拆分。如果我们用 rsplit 做同样的操作:
categories.str.rsplit('-', expand=True, n=2)
完成相同的操作,但在右侧。
2。剥离
剥就像修剪树枝。我们可以删除字符串开头或结尾的空格或任何其他字符。
例如,“col_b”中的字符串开头有$字符,可以用 lstrip 删除:
df_sample['col_b'].str.lstrip('$')0 64K-$72K
1 62K-$70K
2 69K-$76K
3 62K-$72K
4 71K-$78K
Name: col_b, dtype: object
类似地, rstrip 用于从末尾开始修剪字符。
字符串的开头或结尾可以有空格。考虑我们数据框架中的“col_d”。
这些前导和尾随空格可以用 strip 删除:
df_sample['col_d'] = df_sample['col_d'].str.strip()
3。更换
熊猫替换函数用于替换行或列中的值。类似地,替换为字符串操作用于替换字符串中的字符。
让我们用“z”代替“col_d”中的“x”字母。
df_sample['col_d'] = df_sample['col_d'].str.replace('x', 'z')
4。过滤
我们可以根据第一个和最后一个字符过滤字符串。要使用的函数有 startswith() 和 endswith() 。
这是我们的原始数据框架:
下面是一个经过筛选的版本,只包含“col_a”以字母“x”结尾的行。
df_sample[df_sample['col_a'].str.endswith('X')]
或者,“col_b”以“$6”开头的行:
df_sample[df_sample['col_b'].str.startswith('$6')]
我们也可以通过提取某些字符来过滤字符串。例如,我们可以通过 str[:2] 得到一列或一系列字符串的前 2 个字符。
“col_b”表示一个数值范围,但数值隐藏在字符串中。让我们用字符串下标提取它们:
lower = df_sample['col_b'].str[1:3]
upper = df_sample['col_b'].str[-3:-1]
5。组合
Cat 函数可用于连接字符串。
我们需要使用 sep 参数传递一个参数放在连接的字符串之间。默认情况下,cat 忽略缺失值,但是我们也可以使用 na_rep 参数指定如何处理它们。
让我们通过用“-”分隔符连接“col_c”和“col_d”来创建一个新列。
df_sample['new']=df_sample['col_c'].str.cat(df_sample['col_d'], sep='-')df_sample
额外收获:对象 vs 字符串
在 pandas 1.0 之前,只有“object”数据类型用于存储字符串,这导致了一些缺点,因为非字符串数据也可以使用“object”数据类型存储。Pandas 1.0 引入了一种新的特定于字符串数据的数据类型,即string type。到目前为止,我们仍然可以使用 object 或 string type 来存储字符串,但是在将来,我们可能会被要求只使用 string type。
这里需要注意的一件重要事情是,对象数据类型仍然是字符串的默认数据类型。要使用 StringDtype,我们需要显式声明它。
我们可以通过“字符串或 pd。StringDtype() 参数为 Dtype 参数为 string 数据类型。
感谢您的阅读。如果您有任何反馈,请告诉我。
计算机视觉领域你必须知道的 5 种神经网络架构
在这篇文章中,我列出了计算机视觉的前 5 个神经网络架构,排名不分先后
卷积神经网络
历史
卷积的概念是由福岛国彦在 T2 的论文中首次提出的。 neocognitron 引入了两种类型的层,卷积层和下采样层。
然后下一个关键进展是由 Yann LeCun 等人提出的,他们使用反向传播从图像中学习卷积核的系数。这使得学习自动化,而不是费力的手工制作。根据维基百科,这种方法成为了现代计算机视觉的基础。
然后是 2012 年由 *Alex Krizhevsky,Ilya Sutskever,Geoffrey E. Hinton,*撰写的“使用深度卷积神经网络的 ImageNet 分类”,这被广泛认为是卷积神经网络方面最有影响力的论文。他们创建了 Alexnet,并凭借他们的模型赢得了 2012 年的 Imagenet 竞赛。
机制
我不会深入探究 CNN 的机制,但想简单概述一下它是如何工作的。
常规的香草神经网络在计算 WX + b 的层上训练,其中 W 是通过反向传播学习的权重矩阵,卷积神经网络使用称为过滤器的权重。
卷积运算。图片来自https://giphy.com/explore/convolution。
你可以想象一个卷积的内核或过滤器,就像输入矩阵上的滑动窗口。在上面的 gif 中,过滤器是带有红色数字的橙色阴影矩阵。输入矩阵是带有黑色数字的绿色矩阵。在每个阶段,滤波器与输入矩阵的重叠部分逐元素相乘,然后对值求和。这给出了第一个输出。然后过滤器向左移动一步,依此类推,如 gif 所示。
可以根据滤波器值计算输出和标签的损失,通过反向传播,我们可以学习滤波器的值。
当你展开内核和输入时,卷积神经网络实际上只是矩阵乘法。这在这篇非常好的博文中有所展示。CNN 非常强大有两个主要原因。
- 它们每层的参数明显更少,因此可以堆叠形成更深的层。
- 它们处理输入的位置。图像中像素的局部性得以保持,因为内核一次只作用于图像的一部分,并且输入中接近的像素会创建同样接近的输出值。这不同于不考虑位置的传统网络。
剩余网络
残差网络是由、等人在他们极具影响力的论文《图像识别的深度残差学习》中引入的。来自微软研究团队的论文赢得了 2015 年 Imagenet 竞赛。
跳过连接。图片由作者提供。
ResNets 有一个非常简单却非常优雅的想法。这个想法是添加跳过连接或快捷连接,这创造了一个梯度公路。这使得梯度在后退过程中流动得更好,大大增加了收敛,训练时间,减少了梯度爆炸和消失。
Resnets 的微妙之处在于,最好的情况是跳过连接主动添加到输出中并计算有用的信息,最坏的情况是忽略跳过的连接,最坏的情况是与没有跳过连接的网络相同。因此,跳过连接增加了如此多的价值,而且没有负面影响!
u 网
U-Net 是由 Olaf Ronneberger、Philipp Fischer 和 Thomas Brox 在他们的论文“U-Net:生物医学图像分割的卷积网络”中介绍的,你可以在这里阅读。这篇 2015 年的论文对于图像分割来说是革命性的。图像分割的任务是用类别标记图像中的每个像素。
U-Net 架构。图片取自原 U 网论文。
u 网有两部分,收缩路径(下采样路径)和扩展路径(上采样路径)。在传统的图像分类卷积网络中,图像被送入执行卷积和汇集操作的网络,这两种操作都降低了输出的高度和宽度,但增加了输出的深度。随着高度和宽度的损失,获得的深度向分类输出添加了特征。
然而,在分割任务中,我们希望输出与输入图像具有相同的形状,并添加标记像素的特征。因此,传统 Conv 架构的下采样由上采样路径补充,以将图像的高度和宽度添加回输出,同时保持特征。有许多上采样方法,但大多数库中最常用的方法是转置卷积上采样。你可以在这里阅读这个方法。
YOLO
YOLO 最初是由约瑟夫·雷德蒙、桑托什·迪瓦拉、罗斯·吉斯克、阿里·法尔哈迪在他们的论文《你只看一次:统一的实时物体检测》中介绍的,你可以在这里阅读。该论文被提议作为 2015 年物体检测的快速、最先进的模型。多年来,YOLO 有 4 个官方版本(论文发表的地方)。前三个是由原作者,最后一个是由不同的作者。我现在不会讨论 YOLO 的版本,也许在另一篇文章中;-)
YOLO 建筑。图片取自原 YOLO 纸。
YOLO 代表你只看一眼。当这篇论文发表时,目标检测的流行方法是重用分类器对图像的局部区域进行分类,并使用滑动窗口方法来检查图像的每个区域是否有目标。YOLO 通过将目标检测作为一个回归问题提出来,改变了这种范式,在这种情况下,他们仅对整个管道使用一个单一的网络,并一次性处理整个图像,而不是在区域中处理。
YOLO 把输入图像分成一个 SxS 网格。并且对于每个网格,预测对象的中心是否存在于网格内。如果对象的中心在网格中,则网格将预测具有 5 个值的边界框,x,y,w,h,c。(x,y)是对象中心相对于网格的坐标,(w,h)是对象相对于整个图像的宽度和高度,以及©是对象的类别。
“YOLO 有三大优势。松散引用自原论文【1】。
首先,YOLO 速度极快。由于论文将检测框架作为一个回归问题,因此不需要复杂的流水线。
第二,YOLO 在做预测时会对图像进行全局推理。与基于滑动窗口和区域提议的技术不同,YOLO 在训练和测试期间看到整个图像,因此它隐式地编码了关于类及其外观的上下文信息。
第三,YOLO 学习对象的概括表示。由于 YOLO 是高度概括的,当应用于新的领域或意想不到的输入时,它不太可能崩溃。"
生成对抗网络
伊恩·j·古德费勒、让·普盖-阿巴迪、迈赫迪·米尔扎、徐炳、大卫·沃德-法利、谢尔吉尔·奥泽尔、亚伦·库维尔、约舒阿·本吉奥在他们的论文《生成对抗网络》中介绍了生成对抗网络,你可以阅读【生成对抗网络】
甘形象。图片由作者提供。
GANs 是通过对抗过程训练的神经网络对。GAN 的两个部分是发生器和鉴别器。生成器的作用是生成类似于训练数据的高质量数据,而批评家的作用是区分生成的数据和真实的数据。发电机的目标函数是使批评家的损失最大化,批评家的目标函数是使其损失最小化。
把这个过程想象成一个小偷和警察。小偷想愚弄警察,不断改进他们的工具和技术,而警察想抓住小偷,所以他们也在改进。发电机就像小偷,批评家就像警察。
GANs 有许多应用,并且一直有许多新的应用出现。但是因为这篇文章是关于计算机视觉的,GANs 的两个非常有趣的应用是:
- 超分辨率
超分辨率是指拍摄低质量的图像,并从中生成高质量的图像。英伟达的新 DLSS 可能会使用这种技术。
来自 fast.ai 的 Jeremey Howard 有一个非常有趣的方法,叫做超分辨率的 noGAN 方法。这个过程是对 GANs 的一种预训练,其中高质量的图像被转换成较低质量的图像用于生成器的训练数据,并且评论家在生成的图像上被预训练。这样,生成器和评论家都有一个良好的开端,并且这种方法被发现可以显著地提高 GANs 的训练时间。 - 深度假货 相信大家都从媒体上听说过深度假货。深度假货也是 GANs,其中生成器被训练来执行假货操作,而评论家的任务是检测假货。发电机可以被训练足够长的时间来愚弄大多数人类。这是一种有点危险的技术,在互联网上需要注意。
参考
[1] 约瑟夫·雷德蒙,桑托什·迪夫瓦拉,罗斯·吉尔希克,阿里·法尔哈迪,《你只看一次:统一的、实时的物体检测》(2015), arXiv:1506.02640
你应该知道的熊猫 1.0 的 5 个新特性
动态窗口功能,更快的应用和更多。
来自 imgflip.com 的熊猫迷因
熊猫 1.0 于 2020 年 1 月 29 日发布。版本从 0.25 跳到了 1.0,并没有像一些熊猫用户期望的那样有太大的变化。版本的增加仅仅反映了数据处理库的成熟。
虽然没有多少突破性的变化,但有一些你应该知道。
这里有几个你可能会感兴趣的链接:
- [Labeling and Data Engineering for Conversational AI and Analytics](https://www.humanfirst.ai/)- [Data Science for Business Leaders](https://imp.i115008.net/c/2402645/880006/11298) [Course]- [Intro to Machine Learning with PyTorch](https://imp.i115008.net/c/2402645/788201/11298) [Course]- [Become a Growth Product Manager](https://imp.i115008.net/c/2402645/803127/11298) [Course]- [Deep Learning (Adaptive Computation and ML series)](https://amzn.to/3ncTG7D) [Ebook]- [Free skill tests for Data Scientists & Machine Learning Engineers](https://aigents.co/skills)
上面的一些链接是附属链接,如果你通过它们进行购买,我会赚取佣金。请记住,我链接课程是因为它们的质量,而不是因为我从你的购买中获得的佣金。
要升级你的熊猫游戏,请阅读:
一个开源项目,简化了熊猫与实时数据的连接,测试假设和可视化…
towardsdatascience.com](/pandas-analytics-server-d9abceec888b)
1.具有滚动功能的动态窗口大小
处理时间序列数据时,滚动窗口函数非常有用(例如,移动平均值的计算)。以前版本的 pandas 要求我们传递窗口大小参数,例如计算 3 个周期的移动平均值。在 pandas 1.0 中,我们可以绕过这个要求,如下例所示。
让我们计算值的移动平均值,直到当前数字不大于 10。首先,我们创建一个数据帧,其中 3 个值大于或等于 10。
df **=** pd**.**DataFrame({'col1': [1, 2, 3, 10, 2, 3, 11, 2, 3, 12, 1, 2]})
df
车窗功能应展开,直到没有达到大于或等于 10 的值。
use_expanding **=** (df**.**col1 **>=** 10)**.**tolist()
use_expanding # output
[False,
False,
False,
True,
False,
False,
True,
False,
False,
True,
False,
False]
对于动态大小窗口函数,我们需要实现一个自定义索引器,它继承自 pandas BaseIndexer 类。BaseIndexer 类有一个 get_window_bounds 函数,它计算每个窗口的开始和结束。
from pandas.api.indexers import BaseIndexer**class** **CustomIndexer**(BaseIndexer): **def** **get_window_bounds**(self, num_values, min_periods, center, closed):
start **=** np**.**empty(num_values, dtype**=**np**.**int64)
end **=** np**.**empty(num_values, dtype**=**np**.**int64)
start_i **=** 0
**for** i **in** range(num_values):
**if** self**.**use_expanding[i]:
start[i] **=** start_i
start_i **=** end[i] **=** i **+** 1
**else**:
start[i] **=** start_i
end[i] **=** i **+** self**.**window_size
**print**('start', start)
**print**('end', end)
**return** start, end indexer **=** CustomIndexer(window_size**=**1, use_expanding**=**use_expanding)
我们将索引器类放入滚动函数中,并计算每个窗口的平均值。我们还可以观察每个窗口的开始和结束索引。
df**.**rolling(indexer)**.**mean()
2.更快的滚动应用
Pandas 使用 Cython 作为滚动应用的默认执行引擎。在 pandas 1.0 中,我们可以将 Numba 指定为执行引擎,并获得不错的加速。
有几件事需要注意:
- 需要安装 Numba 依赖项:pip 安装 numba,
- 第一次使用 Numba 引擎运行函数会很慢,因为 Numba 会有一些函数编译开销。但是,滚动对象将缓存该函数,后续调用将会很快,
- Numba 引擎具有较大数量的数据点(例如 1 百万以上),
- raw 参数需要设置为 True,这意味着该函数将接收 numpy 对象而不是 pandas 系列,以获得更好的性能。
让我们创建一个包含 100 万个值的数据框架。
df **=** pd**.**DataFrame({"col1": pd**.**Series(range(1_000_000))})
df**.**head()
some_function 计算值的总和并加 5。
**def** **some_function**(x):
**return** np**.**sum(x) **+** 5
让我们用 Cython 执行引擎来测量执行时间。
**%%**timeitdf**.**col1**.**rolling(100)**.**apply(some_function, engine**=**'cython', raw**=**True)4.03 s ± 76.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
Cython 计算这个函数需要 4.03 秒。Numba 更快吗?让我们试一试。
**%%**timeitdf**.**col1**.**rolling(100)**.**apply(some_function, engine**=**'numba', raw**=**True)500 ms ± 11.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
我们看到 Numba 在这个玩具例子中快了 8 倍。
3.新 NA 值
熊猫 1.0 引入了新的实验性 pd。表示标量缺失值的 NA 值。
我知道你在想什么——又一个空值?已经有 nan,None 和 NaT 了!
pd 的目标。NA 将提供跨数据类型的一致性。它目前由 Int64、boolean 和新的 string 数据类型使用
让我们创建一系列无整数。
s **=** pd**.**Series([3, 6, 9, None], dtype**=**"Int64")
s
让我惊讶的是,NA == NA 产生 NA,而 np.nan == np.nan 产生 False。
s**.**loc[3] **==** s**.**loc[3]# output
<NA> np**.**nan **==** np**.**nan# output
False
4.新字符串类型
熊猫 1.0 终于有了一个专用的(实验性的)字符串类型。在 1.0 之前,字符串是作为对象存储的,所以我们不能确定这个系列是只包含字符串,还是混合了其他数据类型,如下所示。
s **=** pd**.**Series(['an', 'ban', 'pet', 'podgan', None])
s
当我们无意中将字符串与整数或浮点数混合在一起时,将字符串存储为对象就成了一个问题——数据类型仍然是对象。
s **=** pd**.**Series(['an', 'ban', 5, 'pet', 5.0, 'podgan', None])
s
为了测试新的字符串 dtype,我们需要设置 dtype='string '。
新的字符串数据类型返回序列中整数或浮点数的异常。进步很大!
s **=** pd**.**Series(['an', 'ban', 'pet', 'podgan', None], dtype**=**'string')
s
5.忽略排序数据帧上的索引
当我们按某一列对数据帧进行排序时,索引也会被排序。有时候我们不想这样。在 pandas 1.0 中,sort_values 函数采用忽略索引,正如参数名称所示。
df **=** pd**.**DataFrame({"col1": [1, 3, 5, 2, 3, 7, 1, 2]})df**.**sort_values('col1')
df**.**sort_values('col1', ignore_index**=**True)
结论
根据我的观点,这是 5 个最有趣的熊猫特征。从长远来看,缺失值的新 NA 可以给熊猫带来很多清晰度。函数如何处理丢失的值,它们是否跳过它们。
折旧政策也有变化:
- 次要版本(如 1.1.0)中将引入弃用,
- 在主要版本(如 2.0.0)中,将强制实施不推荐使用和突破 API 的更改。我们应该升级还是继续使用当前的熊猫版本
新的弃用政策提出了这个问题:“我应该更新熊猫吗?”比较好回答。似乎我们还可以期待未来更频繁的重大发布。要了解更多关于熊猫 1.0 的新特性,请阅读 1.0.0 的新特性。
在你走之前
在推特上关注我,在那里我定期发关于数据科学和机器学习的推特。
照片由Courtney hedge在 Unsplash 上拍摄
新冠肺炎疫情期间,你可以免费参加 5 门在线课程
莎伦·麦卡琴在 Unsplash 上的照片
在这个无情的时代,学习至关重要
随着冠状病毒的肆虐,随着学校和大学继续停课,全球对 MOOCs 的需求巨大。
所以,我觉得像 Coursera 这样的 提供商在他们的网站上免费提供大量优秀课程很棒, 但在所有付费课程中很难找到。
虽然这些课程不提供认证证书,但在我看来,知识比几个证书更重要。
TLDR;随着成千上万的人在这场危机中被解雇,我认为现在向人们提供学习资源是至关重要的。因此,这里列出了一些很棒且可以免费学习的课程。
1.机器学习
来源:免费课程是一条路要走
是的,你没听错,Coursera 正在免费提供吴恩达的游戏规则改变者 机器学习课程 。
至于我的评论,我认为这是每个对机器学习感兴趣的人都应该做的一门课程。首先,它包含了许多机器学习算法背后的数学知识,其次,吴恩达是一位伟大的导师。信不信由你,在我刚开始学习数据科学的时候,吴恩达不仅教了我,还激励了我。
至于课程,这门课什么都有——回归、分类、异常检测、推荐系统、神经网络,还有很多很棒的建议。
在学习本课程的过程中,您可能还想看看我的一些帖子:
对特征工程技术的详尽研究
towardsdatascience.com](/the-hitchhikers-guide-to-feature-extraction-b4c157e96631) [## 每个数据科学家都必须知道的 5 个分类评估指标
以及具体什么时候使用它们?
towardsdatascience.com](/the-5-classification-evaluation-metrics-you-must-know-aa97784ff226) [## 每个数据科学家都应该知道的 5 种特征选择算法
额外收获:是什么让一个优秀的足球运动员变得伟大?
towardsdatascience.com](/the-5-feature-selection-algorithms-every-data-scientist-need-to-know-3a6b566efd2) [## 3 个决策树分裂标准背后的简单数学
🌀理解分割标准
towardsdatascience.com](/the-simple-math-behind-3-decision-tree-splitting-criterions-85d4de2a75fe)
2.算法
算法和数据结构是数据科学不可或缺的一部分。虽然我们大多数数据科学家在学习时没有上过适当的算法课程,但它们仍然是必不可少的。
许多公司在招聘数据科学家的面试过程中会询问数据结构和算法。
它们将需要像你的数据科学面试一样的热情来破解,因此,你可能想要给一些时间来研究算法和数据结构以及算法问题。
罗伯特·塞奇威克大学提供的这一系列两门课程涵盖了所有基本的算法和数据结构。本课程的 第一部分 涵盖了基本的数据结构、排序和搜索算法,而 第二部分 则侧重于图形和字符串处理算法。
你可能也想看看我的一些帖子,同时试图理解这些课程中的一些材料。
数学更少,代码更多
towardsdatascience.com](/three-programming-concepts-for-data-scientists-c264fc3b1de8) [## 面向数据科学家的链表简单介绍
或者说,什么是链表,为什么我需要了解它们?
towardsdatascience.com](/a-simple-introduction-of-linked-lists-for-data-scientists-a71f0eb31d87) [## 数据科学家的动态编程
DP 如何工作?
towardsdatascience.com](/dynamic-programming-for-data-scientists-bb7154b4298b)
3.贝叶斯统计:从概念到数据分析
“事实是顽固的东西,但统计数字是易驾驭的.”
――马克·吐温
一个常客和贝叶斯之间的战争永远不会结束。
在本 课程 中,你将学习最大似然估计、先验、后验、共轭先验,以及大量其他我们可以使用贝叶斯统计的实际场景。总之,这是一门精心设计的课程,解释了统计的频率论和贝叶斯方法。
从课程网站:
本课程介绍了统计的贝叶斯方法,从概率的概念开始,到数据的分析。我们将比较贝叶斯方法和更普遍教授的频率主义方法,并看到贝叶斯方法的一些好处。
4.实用时间序列分析
你听说过 ARIMA 模型,时间序列的平稳性等吗?并被这些条款所困扰?本课程旨在从数学的角度教授时间序列。我在相当长的一段时间里没能找到这样一个球场 。现在它对所有人都是免费的。
从课程网站:
在实际的时间序列分析中,我们关注代表序列信息的数据集,如股票价格、年降雨量、太阳黑子活动、农产品价格等等。我们来看几个数学模型,它们可能被用来描述产生这些类型数据的过程
如果您想使用 XGBoost 或基于树的模型进行时间序列分析,请看看我以前的一篇文章:
简单的时间序列建模
towardsdatascience.com](/using-gradient-boosting-for-time-series-prediction-tasks-600fac66a5fc)
5.机器学习 AWS 入门
秘诀:重要的不是你知道什么,而是你表现出什么。
在构建一个伟大的机器学习系统时,有很多事情需要考虑。但是经常发生的是,作为数据科学家,我们只担心项目的某些部分。
但是我们有没有想过一旦有了模型,我们将如何部署它们?
我见过很多 ML 项目,其中很多注定要失败,因为他们从一开始就没有一套生产计划。
拥有一个好的平台,并了解该平台如何部署机器学习应用程序,将在现实世界中产生很大的影响。这个关于 AWS 的课程是为了实现机器学习应用程序,它承诺了这一点。
本课程将教你:
1。如何使用内置算法的 Amazon SageMaker 和 Jupyter Notebook 实例构建、训练和部署模型。
2。如何使用亚马逊人工智能服务构建智能应用程序,如亚马逊理解、亚马逊 Rekognition、亚马逊翻译等。
你也可以看看我的这篇文章,在这里我试着谈论应用并解释如何计划生产。
[## 如何为数据科学家使用简单的 Python 编写 Web 应用?
无需了解任何 web 框架,即可轻松将您的数据科学项目转换为酷炫的应用程序
towardsdatascience.com](/how-to-write-web-apps-using-simple-python-for-data-scientists-a227a1a01582) [## 如何使用 Amazon Free ec2 实例部署 Streamlit 应用程序?
10 分钟内将数据应用程序上传到网上
towardsdatascience.com](/how-to-deploy-a-streamlit-app-using-an-amazon-free-ec2-instance-416a41f69dc3) [## 通过这 5 个简单的步骤将您的机器学习模型投入生产
或者为什么机器学习项目会失败?
towardsdatascience.com](/take-your-machine-learning-models-to-production-with-these-5-simple-steps-35aa55e3a43c)
更多免费课程
还有,如果你不想学上面那几个也不用担心。在写这篇文章之前,我收集了一些高评级课程的列表,这些课程可以免费审核。你可以在这里下载 excel 文件。所以尝试一下你想学的东西。
继续学习
将来我也会写更多初学者友好的帖子。在 中 关注我,或者订阅我的 博客 了解他们。一如既往,我欢迎反馈和建设性的批评,可以通过 Twitter @mlwhiz 联系到我。
此外,一个小小的免责声明——这篇文章中可能会有一些相关资源的附属链接,因为分享知识从来都不是一个坏主意。
5 PEP8 必须记住的准则
遵循这些提示来创建有效且易读的代码
每当你写代码的时候,有一件事你必须记住——它必须是可读的。就像你在学校必须手写文章一样,如果你的老师看不懂,你的文章内容就毫无意义。每个编码人员都有自己独特的风格和怪癖,这使得他们能够完成工作。但是,如果你打算开源分享你的作品给任何人看,它应该在外观和可读性上保持一致。在这篇文章中,我将分享在 Python 中创建有组织和清晰的代码的五个技巧。我们开始吧!
1.)线路长度
我想从这个技巧开始,因为它又快又切题——将每行代码限制在 79 个字符以内。就是这样。
2.)变量名
一般来说,您希望尽量避免变量名只有一个字母或数字。然而,不管出于什么原因,如果你决定使用一个单字母变量,有三个字母是你绝对需要避免的。那些字母是‘O’(可与数字‘0’混淆)‘I’(可与字母‘l’混淆)和‘l’(可与数字‘1’混淆)。当你读这句话的时候,你感到困惑吗?如果你是,那就证明了我的观点。
此外,确保不要使用 Python 中受保护的单词(拼写时变成绿色的单词)作为变量名,例如 list 、 dict 或 str 。除了可能导致混乱之外,如果您尝试运行您的代码,它还会引发错误。
3.)缩进
这主要适用于编写函数和/或条件语句的时候。如果你的缩进是关闭的,你的代码将不会工作。但是与此同时,如果在任何给定的函数中需要一个以上的参数,您需要有适当的缩进。例如,具有良好缩进的函数可能如下所示:
**def** fake_function(var_one, var_two,
var_three, var_four):
**print**(var_two)result = fake_function('var_one', 'var_two',
'var_three', 'var_four')
您可以很容易地看到,函数的参数与函数将要执行的操作是有区别的。松散的缩进可能如下所示:
**def** fake_function(var_one, var_two,
var_three, var_four):
**print**(var_two)result = fake_function('var_one', 'var_two',
'var_three', 'var_four')
因为缩进是关闭的,所以很难确切地说出函数中的参数是什么,以及函数的动作应该是什么。
4.)操作员位置
类似于缩进方面,如果您的代码使用了操作符— =、+、-等。—您希望确保操作符位于易于阅读的逻辑位置。例如,好的操作符位置如下所示:
income = (gross_wages
+ taxable_interest
+ (dividends — qualified_dividends)
— ira_deduction
— student_loan_interest)
操作符清楚地放在每个变量的之前,你可以很容易地看出发生了什么,尤其是在第 3 行。
错误的操作符位置如下所示:
income = (gross_wages +
taxable_interest +
(dividends - qualified_dividends) -
ira_deduction -
student_loan_interest)
虽然理解第 1 行和第 2 行中发生的事情可能很容易,但是一旦到了第 3 行,理解这段代码的走向就变得非常困难和模糊了。因此,一般的经验法则是在代码中将操作符放在变量之前,这样可以使每一步更加连贯。
5.)空白
回到 operators from 部分,您需要确保在变量名和操作符本身之间有一个空格。这个空白区域就是所谓的空白区域。尽管上面最近的例子中的操作符位置不正确,但是在变量和操作符之间有很好的空格位置。这也适用于文本运算符,如、、、或中的等。下面是一些好的空白用法的例子:
i = 1
i = i + 1
i += 1
x = i*2 - 1
y = x*x + i*i
z = (x+x) * (i-i)
我想指出我在上面第 4、5 和 6 行(或者变量 x、y 和 z)中陈述的一个重要的例外。注意,例如,在第 4 行中,i2 不包含空格。这是因为它向读者清楚地表明,这是那一行的数学计算的第一步,减法将是第二步。哪个数学属性具有最高优先级(记住 P.E.M.D.A.S!),你不想*在那个步骤中包含空格。
感谢你阅读这篇文章,我希望它有助于提高代码的可读性!
从 5 个角度看为什么辍学如此有效
五分钟后
Dropout 的工作原理是在训练过程中随机阻断一层中的一小部分神经元。然后,在预测期间(训练之后),Dropout 不会阻塞任何神经元。这一实践取得了巨大的成功——赢得竞争的网络几乎总是将辍学作为架构的重要组成部分。
要理解辍学到底为什么有效可能有点令人困惑。首先,我们实际上是在模型中插入了随机性,因此,当某些重要的节点被阻塞时,人们会认为它的预测会有很大的不同。在这样一个不稳定的环境中,很难想象有用的信息是如何传播的。再者,预测时突然消除随机性,适应这样随机环境的网络如何表现良好?
辍学为什么有效有许多观点,尽管其中许多观点是相互联系和相关的,但理解它们可以全面而深刻地理解这种方法为什么如此成功。
这里有一种方法:因为网络是在节点可能被随机阻塞的环境中训练的,所以有两种可能性:
- 被阻止的节点是“坏节点”,或者不提供任何信息的节点。在这种情况下,网络的其他节点通过反向传播接收到正信号,并且能够在没有负节点的情况下更好地学习。
- 被阻止的节点是“好节点”,或者为预测提供重要信息的节点。在这种情况下,网络必须学习其他神经元中数据的单独表示。
在这种 Dropout 的观点下,无论 Dropout 阻塞了什么节点,网络都可以从中受益。这种方法的观点认为它是一种干扰,一种从外部引入的随机来源,用来激发加速学习。
辍学的另一个角度是作为一个整体。在经常成功的随机森林算法中,根据随机选择的数据子集训练几个决策树,这一过程称为装袋。通过在模型中加入随机性,模型的方差实际上被抑制了。作为直观的理解,考虑以下数据,一个具有大量正态分布噪声的正弦波:
从这些数据中,我们得到几十条近似曲线,它们沿着原始曲线随机选择点。然后,这些近似曲线通过平均值聚合,结果是一条更清晰的曲线:
透明线是近似曲线。
Bagging 适用于高方差数据,因为它是一个可以以毒攻毒(噪声比噪声大)的实例。在这种情况下,通过重复随机选择曲线的部分,我们忽略了其他数据点,这有助于降低方差。
同样的想法也适用于辍学。当有数百甚至数千个信号从深层神经网络的前一层传入时,尤其是在训练开始时,必然会有大量的变化,甚至可能是不正确的信号。通过随机选择先前信号的子集并传递它们,Dropout 充当了一个近似器,并为反向传播留下了一个更纯净的信号。
我们可以从这个角度看得更远。每次在迭代中重新应用 Dropout 时,人们可能会认为正在创建一个新的网络。比方说,在用决策树打包时,每个模型都有不同的架构,正是这些不同的特征映射和数据子集中的特性的集合允许对整个特征空间的丰富理解。最终模型受到子模型学习的影响。
每次训练迭代,都会创建一个“新网络”,并且更新权重以反映新网络的学习。虽然实现的方法不同——更多的是一维的而不是二维的——但它本质上是作为一个整体执行相同的任务。经过足够的迭代后,网络学会寻找所谓的“通用权重”,即无论架构如何变化都表现良好的参数。像系综一样,Dropout 允许网络从许多更详细、更集中的网络中学习。
辍学也被视为正则化的一种形式,这是一系列防止神经网络过度拟合的方法。通过随机切断从一层到下一层的部分信号流,我们防止了过度详细的数字涌向网络的末端,这将通过反向传播遇到同样复杂的更新流。
辍学的另一个观点源于过度拟合问题,其基本思想是网络过度拟合是因为它们试图同时更新数百万个参数。当神经网络被初始化时,它们的参数不适应数据集,并开始探索误差范围。当所有这些个体探索被总结成一个巨大的网络时,它就像海啸一样冲向反向传播,这个网络迅速发展并迅速溢出。
辍学-特别是通过深度网络广泛实施的辍学,并且具有高比例的辍学神经元(40%至 50%)-让网络以更慢和更渐进的方式学习,以随机的方式一部分一部分地更新网络。
要更新的网络的每个新的随机选择的部分必须不仅更新它自己,而且注意其他先前更新的参数。因此,尽管这看起来有些矛盾,但增加随机性有助于模型以更可控的方式学习。
它是如何工作的——又是如何如此有效的?
towardsdatascience.com](/batch-normalization-the-greatest-breakthrough-in-deep-learning-77e64909d81d)
所有图片均由作者创作。
使用 Matplotlib 可视化数据的 5 个强大技巧
入门
如何使用 LaTeX 字体,创建缩放效果,发件箱图例,连续错误,以及调整框填充边距
数据可视化是用来以一种更直观、更易于理解的方式显示数据。它可以形成直方图、散点图、线图、饼图等。很多人还在用 Matplotlib 作为他们的后端模块来可视化他们的剧情。在这个故事中,我会给你一些技巧,5 个使用 Matplotlib 创建优秀情节的强大技巧。
- 使用乳胶字体
默认情况下,我们可以使用 Matplotlib 提供的一些漂亮的字体。但是,有些符号不够好,无法用 Matplotlib 创建。例如,符号 phi (φ),如图 1 所示。
**图一。**符号“phi”的示例(图片由作者提供)
正如你在 y 标签中看到的,它仍然是 phi (φ)的符号,但对于某些人来说,它还不足以成为一个情节标签。为了让它更漂亮,你可以使用乳胶字体。怎么用?下面是答案。
您可以在 python 代码的开头添加上面的代码。第 1 行定义了绘图中使用的 LaTeX 字体。您还需要定义字体大小,大于默认大小。如果你没有改变它,我想它会给你一个小标签。我为它选择 18。应用上述代码后的结果如图 2 所示。
**图二。**使用 LaTeX 字体的符号“phi”示例(图片由作者提供)
您需要在符号的开头和结尾写双美元($ … $),就像这样
如果您有一些错误或者没有安装使用 LaTeX 字体所需的库,您需要通过在 Jupyter 笔记本单元中运行以下代码来安装它们。
!apt install texlive-fonts-recommended texlive-fonts-extra cm-super dvipng
如果您想通过终端安装它们,您可以移除**!**,所以
apt install texlive-fonts-recommended texlive-fonts-extra cm-super dvipng
当然,你可以使用一些不同的字体系列,像衬线,无衬线(上面的例子)等。要更改字体系列,您可以使用以下代码。
plt.rcParams['font.family'] = "serif"
如果您将上面的代码添加到您的代码中,它将给出如图 3 所示的图。
图 3 。使用 LaTeX 字体的符号“phi”示例(图片由作者提供)
你能意识到图 3 和图 2 的区别吗?Yups,仔细分析的话,区别就是字体的尾部。后一个图使用衬线,而前一个是无衬线。简单来说, 衬线 表示尾部, sans 表示没有,如果你想了解更多关于字体家族或者字样的知识,我推荐这个链接。
字体是字体的设计,可以包括各种变化,如超粗体,粗体,常规,轻,斜体…
en.wikipedia.org](https://en.wikipedia.org/wiki/Typeface)
您也可以使用 Jupyterthemes 库设置字体系列/字样。我已经做了使用指南。只需点击以下链接。木星主题也可以改变你的木星主题,例如黑暗模式主题。
一个关于自定义 Jupyter 笔记本主题和轻松调整 Maptlotlib 参数的故事
medium.com](https://medium.com/@rizman18/how-can-i-customize-jupyter-notebook-into-dark-mode-7985ce780f38)
我们想给你一个插入 Matplotlib 的复杂文本,如图 4 的标题所示。
**图 4。**matplotlib 中使用 LaTeX 字体的复杂符号(图片由作者提供)
如果您想创建图 4,您可以使用这个完整的代码
如果你对代码有什么问题,请写在评论里。
2。创建放大效果
在这个技巧中,我将给出一个代码来生成一个图,如图 5 所示。
**图 5。**Matplotlib 中的缩放效果(图片由作者提供)
首先你需要了解 plt.axes ()和***PLT . figure()****的区别。*你可以在下面的链接里回顾一下。Code plt.figure() 覆盖了单个容器中的所有对象,包括轴、图形、文本和标签。Code plt.axes() 只是涵盖了具体的支线剧情。图 6 可以给你一个简单的理解,我觉得。
**图 6。**Matplotlib 中图形和轴的区别(图片由作者提供)
黑色方框位于 plt.figure() 下方,红色和蓝色方框位于 plt.axes() 下方。在图 6 中,有两个轴,红色和蓝色。您可以查看此链接以获得基本参考。
[## 用 Matplotlib 实现 Python 数据可视化——完全 Python 初学者第二部分
在这一部分中,我们将学习使用 Jupyter Notebook 在 matplotlib 中调整颜色、轴限制和制作网格…
medium.com](https://medium.com/datadriveninvestor/python-data-visualization-with-matplotlib-for-absolute-beginner-python-part-ii-65818b4d96ce)
理解了之后,就可以分析如何创建图 5 了。简单来说,图 5 中有两个轴。第一个轴是一个大图,从 580 到 650 的放大版本,第二个轴是缩小版本。下面是创建图 5 的代码。
如果你需要代码的基本解释,你可以访问这个链接。
[## 用 Matplotlib 实现数据可视化——绝对初学者第一部分
这是使用 Matplotlib 和 Jupyter Notebook(一个强大的 phyton 模块)可视化我们的数据的教程。
medium.com](https://medium.com/datadriveninvestor/data-visualization-with-matplotlib-for-absolute-beginner-part-i-655275855ec8)
我也给出了另一个版本的缩放效果,你可以使用 Matplotlib。如图 7 所示。
**图 7。**Matplotlib 中的缩放效果(图片由作者提供)
要创建图 7,需要在 Matplotlib 中使用 add_subplot 或另一种语法( subplot )创建三个轴。在这里,我只是使用 add_subplot 并避免使用循环来使它更容易。要创建它们,可以使用下面的代码。
代码将生成一个图形,如图 8 所示。它告诉我们,它将生成 2 行 2 列。Axes sub1 (2,2,1)是支线剧情中的第一个轴(第一行,第一列)。该序列从左上侧到右侧开始。第二轴 sub2 (2,2,2) 放置在第一行第二列。最后的轴, sub3 (2,2,(3,4)),是第二行第一列和第二行第二列之间的合并轴。
**图 8。**Matplotlib 中的三个复杂轴
当然,我们需要定义一个模拟数据,以便在您的图中可视化。这里,我定义了线性和正弦函数的简单组合,如下面的代码所示。
如果您将该代码应用到前面的代码中,您将得到一个图,如图 9 所示。
图九。Matplotlib 中的复杂轴(图片由作者提供)
下一步是在第一和第二轴( sub1 和 sub2 )中限制 x 轴和 y 轴,在 sub3 中为两个轴创建遮挡区域,并创建作为缩放效果代表的connection patch【T35(s)。这可以使用完整的代码来完成(记住,为了简单起见,我没有使用循环)。****
该代码将为您提供一个出色的缩放效果图,如图 7 所示。
3。创建发件箱图例
你的图有很多图例要在图中显示吗,比如图 10?如果是,您需要将它们放置在主轴之外。
****图 10。五个不同的情节和一个糟糕的传说(图片由作者提供)
要将图例放置在主容器之外,您需要使用以下代码调整位置
plt.legend(bbox_to_anchor=(1.05, 1.04)) # position of the legend
1.05 和 1.04 的值在朝向主容器的 x 和 y 轴坐标中。你可以改变它。现在,将上面的代码应用到我们的代码中,
运行代码后,它会给出一个图,如图 11 所示。
****图 11。五个不同的情节和一个美好的传说(图片由作者提供)
如果想让图例框更漂亮,可以使用下面的代码添加阴影效果。它将显示一个图,如图 12 所示。
plt.legend(bbox_to_anchor=(1.05, 1.04), shadow=True)
****图 12。Matplotlib 中奇特的发件箱图例(图片由作者提供)
4。创建连续误差图
在过去的十年中,数据可视化的风格被转移到一个干净的绘图主题。通过阅读国际期刊或网页上的一些新论文,我们可以看到这种转变。最流行的一种方法是可视化带有连续误差的数据,而不是使用误差线。您可以在图 13 中看到它。
****图十三。Matplotlib 中的连续误差图(图片由作者提供)
使用 fill_between 生成图 13。 在 fill_between 语法中,需要定义上限和下限,如图 14 所示。
****图 14。定义上下限(图片由作者提供)
要应用它,您可以使用以下代码。
plt.fill_between(x, upper_limit, lower_limit)
自变量 上限 和 下限 可以互换。这是完整的代码。
5。调节盒垫边缘
如果你分析上面的每个代码,你会得到一个语法*PLT . save fig()*后面跟一个复杂的实参: bbox_inches 和 pad_inches。当你在撰写一篇期刊或文章时,它们是在为你提供便利。如果不包括它们,保存后,您的绘图会有更大的余量。图 15 显示了带 bbox_inches 和 pad_inches 和不带它们的不同曲线图。
****
**图 15。**左:**保存无页边距设置的图,**右:有页边距设置(图片由作者提供)。
我认为你看不出图 15 中两个图的区别。我将尝试用不同的背景颜色来呈现它,如图 16 所示。
****
**图 15。**左:**保存无边距设置的图,**右:有边距设置(图片由作者提供)。
同样,当你把你的情节插入一篇论文或一篇文章时,这个技巧会帮助你。你不需要裁剪它来节省空间。
结论
Matplotlib 是一个多平台库,可以玩很多操作系统。这是一个用来可视化你的数据的老库,但是它仍然很强大。因为开发人员总是根据数据可视化的趋势进行一些更新。上面提到的一些技巧就是更新的例子。我希望这个故事可以帮助你更有趣地可视化你的数据。
如果你喜欢这篇文章,这里有一些你可能喜欢的其他文章:
** [## 使用 Matplotlib 实现 Python 数据可视化—第 1 部分
完成了从基础到高级的 Python 绘图的 Matplotlib 教程,包含 90 多个示例
towardsdatascience.com](/visualizations-with-matplotlib-part-1-c9651008b6b8) [## 用于科学绘图的 Matplotlib 样式
为您的科学数据可视化定制 Matplotlib
towardsdatascience.com](/matplotlib-styles-for-scientific-plotting-d023f74515b4) [## 在 Matplotlib 中创建色彩映射表
从颜色列表中创建和定制自己的色彩映射表的指南
towardsdatascience.com](/creating-colormaps-in-matplotlib-4d4de78a04b8) [## 在 Matplotlib 中自定义多个子情节
使用 subplot、add_subplot 和 GridSpec 在 Matplotlib 中创建复杂 subplot 的指南
towardsdatascience.com](/customizing-multiple-subplots-in-matplotlib-a3e1c2e099bc) [## Vaex 大数据简介—读取 12.5 亿行的简单代码
用 Python 高效读取和可视化 12.5 亿行星系模拟数据
towardsdatascience.com](/introduction-to-big-data-a-simple-code-to-read-1-25-billion-rows-c02f3f166ec9)
仅此而已。感谢您阅读这个故事。喜欢就评论分享。我还建议您关注我的帐户,以便在我发布新故事时收到通知。**
5 强大的熊猫数据预处理可视化
“一个眼神胜过千言万语。”分析数据点的探索性数据分析(EDA)是在为算法建立数据模型之前制定假设的正确步骤。
由作者使用文中提到的 Python 代码绘制
我在相对初级的数据科学家和机器学习专业人员中反复观察到的最常见的陷阱之一是,花数小时为他们的项目寻找最佳算法,而没有花足够的时间首先理解数据。
处理数据科学和机器学习项目的结构化方法始于项目目标。同一组数据点可以推断出几件事情的有意义的信息。基于我们正在寻找的东西,我们需要关注数据的不同方面。一旦我们明确了目标,我们就应该开始考虑同样目标所需的数据点。这将使我们能够专注于最相关的信息集,而忽略可能不重要的数据集。
在现实生活中,大多数时候从几个来源收集的数据都有空白值、打字错误和其他异常情况。在进行任何数据分析之前,清理数据至关重要。
在本文中,我将讨论五个强大的数据可视化选项,它们可以立即提供数据特征的感觉。甚至在正式建模或假设测试任务之前,执行 EDA 就传达了许多关于数据和特性之间关系的信息。
在本系列的下一篇文章中,我已经讨论了探索性数据分析(EDA)的高级可视化
步骤 1- 我们将导入包 pandas、matplotlib、seaborn 和 NumPy,我们将使用它们进行分析。
我们需要 pandas 中的散点矩阵、自相关图、滞后图和平行坐标来绘图。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import autocorrelation_plot
import seaborn as sns
from pandas.plotting import scatter_matrix
from pandas.plotting import autocorrelation_plot
from pandas.plotting import parallel_coordinates
from pandas.plotting import lag_plot
步骤 2- 在 Seaborn 包中,有一个很小的内置数据集。我们将使用“mpg”、“tips”和“attention”数据进行可视化。在 seaborn 中,使用 load_dataset 方法加载数据集。
"""Download the datasets used in the program """
CarDatabase= sns.load_dataset("mpg")
MealDatabase= sns.load_dataset("tips")
AttentionDatabase= sns.load_dataset("attention")
Hexbin 地块
我们经常使用散点图来快速掌握变量之间的关系。只要图中没有过于拥挤的密集数据点,获得洞察力真的很有帮助。
在下面的代码中,我们绘制了“mpg”数据集中“加速度”和“马力”数据点之间的散点图。
plt.scatter(CarDatabase.acceleration ,CarDatabase.horsepower,marker="^")
plt.show()
散点图中点密集,从中获取有意义的信息有点困难。
由作者使用文中提到的 Python 代码绘制
Hexbins 是解决重叠点散点图的一个非常好的替代方案。在 hexbin 图中,每个点不是单独绘制的。
在下面的代码中,我们在“加速度”和“马力”之间绘制了一个具有相同数据集的 hexbin。
CarDatabase.plot.hexbin(x='acceleration', y='horsepower', gridsize=10,cmap="YlGnBu")
plt.show()
我们可以清楚地推导出加速度和马力值范围集中在赫克斯宾图和变量之间的负线性关系。六边形的大小取决于“网格大小”参数。
*自我探索:*我鼓励你改变网格大小参数,观察 hexbin 图的变化。
用文章中提到的代码绘制
热图
热图是我个人最喜欢查看不同变量之间的相关性。那些在 Medium 上关注我的人可能已经注意到我经常使用它。
在下面的代码中,我们计算 seaborn“mpg”数据集中所有变量之间的成对相关性,并将其绘制为热图。
sns.heatmap(CarDatabase.corr(), annot=True, cmap="YlGnBu")
plt.show()
我们可以看到“气缸”和“马力”是紧密正相关的(正如汽车中所预期的),重量与加速度成反比。只需几行代码,我们就可以快速理解所有不同变量之间的指示性关系。
用文章中提到的代码绘制
自相关图
自相关图是确定数据点是否随机的快速试金石。如果数据点遵循某一趋势,那么一个或多个自相关将显著非零。图中的虚线显示 99%,置信带。
在下面的代码中,我们检查“tips”数据库中的 total_bill 金额是否是随机的。
autocorrelation_plot(MealDatabase.total_bill)
plt.show()
我们可以看到,对于所有时滞,自相关图都非常接近于零,这表明 total_bill 数据点是随机的。
用文章中提到的代码绘制
当我们为遵循特定顺序的数据点绘制自相关图时,我们可以看到该图明显不为零。
data = pd.Series(np.arange(12,7000,16.3))
autocorrelation_plot(data)
plt.show()
用文章中提到的代码绘制
滞后地块
滞后图还有助于验证数据集是一组随机值还是遵循某种趋势。
当绘制来自“tips”数据集的“total_bills”值的滞后图时,如在自相关图中,滞后图表明它是到处都有值的随机数据。
lag_plot(MealDatabase.total_bill)
plt.show()
用文章中提到的代码绘制
当我们绘制一个非随机数据序列时,如下面的代码所示,我们得到一条平滑的线。
data = pd.Series(np.arange(-12*np.pi,300*np.pi,10))
lag_plot(data)
plt.show()
用文章中提到的代码绘制
平行坐标
将我们的头脑包裹起来并可视化三维以上的数据总是一个挑战。绘制高维数据集平行坐标非常有用。每个维度由一条垂直线表示。
在平行坐标中,“N”条等间距垂直线代表数据集的“N”个维度。顶点在第 n 轴上的位置对应于该点的第 n 个坐标。
扑朔迷离!
让我们考虑一个小样本数据,它包含大小不同的小部件的五个特性。
垂直线代表小部件的每个功能。一系列连续的线段代表“小”和“大”部件的特征值。
用文章中提到的代码绘制
下面的代码绘制了 seaborn 中“attention”数据集的平行坐标。请注意,群集的点看起来靠得更近。
parallel_coordinates(AttentionDatabase,"attention",color=('#556270', '#C7F464'))
plt.show()
用文章中提到的代码绘制
如果您还没有使用探索性数据分析,我希望您开始使用这些开箱即用的图来执行探索性数据分析。我想听听你最喜欢的 EDA 可视化情节。
了解 Scikit-Learn 于 2020 年 5 月推出的复合估算器和管道的交互式可视化。
阅读我关于探索性数据分析(EDA)的高级可视化的文章,了解关于这个主题的更多信息。
如果你想了解深度学习模型中的张量板和可视化,那么请阅读文章深度学习中的准确性可视化
如果你想学习一种结构化的方法来识别适当的独立变量以做出准确的预测,那么请阅读我的文章“如何识别机器学习监督的正确独立变量。
"""Full code"""import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pandas.plotting import autocorrelation_plot
import seaborn as sns
from pandas.plotting import scatter_matrix
from pandas.plotting import autocorrelation_plot
from pandas.plotting import parallel_coordinates
from pandas.plotting import lag_plotCarDatabase= sns.load_dataset("mpg")
MealDatabase= sns.load_dataset("tips")
AttentionDatabase= sns.load_dataset("attention")plt.scatter(CarDatabase.acceleration ,CarDatabase.horsepower, marker="^")
plt.show()CarDatabase.plot.hexbin(x='acceleration', y='horsepower', gridsize=10,cmap="YlGnBu")
plt.show()sns.heatmap(CarDatabase.corr(), annot=True, cmap="YlGnBu")
plt.show()autocorrelation_plot(MealDatabase.total_bill)
plt.show()data = pd.Series(np.arange(12,7000,16.3))
autocorrelation_plot(data)
plt.show()lag_plot(MealDatabase.total_bill)
plt.show()data = pd.Series(np.arange(-12*np.pi,300*np.pi,10))
lag_plot(data)
plt.show()parallel_coordinates(AttentionDatabase,"attention",color=('#556270', '#C7F464'))
plt.show()