查看原文
其他

来自kaggle最佳数据分析实践

Bex T 大邓和他的Python 2022-07-09

翻译: 大邓

作者: Bex T

标题: Weekly Awesome Tricks And Best Practices From Kaggle

链接: https://towardsdev.com/tricks-and-best-practices-from-kaggle-794a5914480f

Kaggle是个很棒的地方,对于数据科学家和机器学习工程师来说,这是一个知识的金矿。可以在同一地点找到由本领域专家带来的高质量,高效,可重现,很棒的代码。自推出以来,它已经举办了164场比赛。这些比赛吸引了来自世界各地的专家和专家加入该平台。结果,每场比赛以及Kaggle提供的大量开源数据集都有许多高质量的笔记本和脚本。

在数据科学之旅的开始,我将去Kaggle查找数据集以练习我的技能。每当我查看其他内核时,我都会对代码的复杂性感到不知所措,然后马上回避。

但是现在,我发现自己花费了大量时间阅读其他笔记本并提交竞赛文件。有时候,有些东西值得您度过整个周末。有时,我会发现简单但致命的有效代码技巧和最佳实践,这些技巧和最佳实践只能通过观察其他专家来学习。

在整个系列中,您会发现我在典型的数据科学工作流程中可能有用的任何内容,包括与通用库相关的代码快捷方式,Kaggle的顶级行业专家遵循的最佳实践等,这些都是我在学习过程中学到的。

1. 只绘制相关系数矩阵的下三角部分

好的相关矩阵可以说明数据集中目标变量之间的相关性

import pandas as pd

df = pd.read_csv('data/melbourne_housing_raw.csv')
df.head()

import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(1612))

cmap = sns.diverging_palette(25015, s=75, l=40,
                             n=9, center="light", as_cmap=True)

sns.heatmap(df.corr(), center=0, annot=True,
             fmt='.2f', square=True, cmap=cmap)

plt.show()

但上图中,数据集中存在大量的特征,导致相似矩阵过于庞大,让人看起来不知所措。

相关矩阵大部分沿主对角线对称,因此它们包含重复数据。同样,对角线本身也没有用。让我们看看如何只绘制有用的一半:

import numpy as np

# 计算相关系数
matrix = df.corr()

# 创建遮罩(为了只显示下三角)
mask = np.triu(np.ones_like(matrix, dtype=bool))

# 定制调色板
cmap = sns.diverging_palette(25015, s=75, l=40,
                             n=9, center="light", as_cmap=True)

# 设定图片尺寸
plt.figure(figsize=(1612))

# 绘制相似矩阵热力图
sns.heatmap(matrix, mask=mask, center=0, annot=True,
             fmt='.2f', square=True, cmap=cmap)

plt.show()

由此产生的可视化图更容易解释并且没有视觉干扰干扰。

  • 首先,我们使用DataFrame的.corr方法构建相关矩阵。
  • 然后,我们使用dtype设置为bool的np.ones_like函数来创建一个True矩阵,其形状与DataFrame相同:
np.ones((55))
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
np.ones_like(np.ones((44)), dtype=bool)
array([[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True]])

将布尔方阵传递给Numpy的.triu函数,该函数将返回一个二维布尔蒙版,其中包含矩阵下三角的False值。

np.triu(np.ones_like(np.ones((44)), dtype=bool))
array([[ True, True, True, True], [False, True, True, True], [False, False, True, True], [False, False, False, True]])

然后,我们可以将其传递给Seaborn的heatmap函数,以根据此蒙版对矩阵进行可视化

ns.heatmap(matrix, mask=mask, center=0, annot=True, fmt='.2f', square=True, cmap=cmap)

2. value_counts考虑缺失值

使用value_counts时,可将dropna设置为False来查看任何列中缺失值的比例。通过确定缺失值的比例,可以决定是否丢弃含有缺失值的记录。

#字段CouncilArea的数据分布情况df.CouncilArea.value_counts(dropna=False, normalize=True).head()
Boroondara City Council 0.105431Darebin City Council 0.081791Moreland City Council 0.060877Glen Eira City Council 0.057549Melbourne City Council 0.056000Name: CouncilArea, dtype: float64

但是,如果要查看所有列中缺失值的比例,则value_counts不是最佳选择。相反,您可以执行以下操作:

  1. 首先,通过将缺失值的数量除以DataFrame的长度来找到比例。

  2. 然后,您可以过滤掉0%的列,即i。e。只选择缺少值的列。

missing_props = df.isna().sum() / len(df)missing_props[missing_props > 0].sort_values(ascending=False)
BuildingArea 0.605761YearBuilt 0.553863Landsize 0.338813Car 0.250394Bathroom 0.235993Bedroom2 0.235735Longtitude 0.228821Lattitude 0.228821Price 0.218321Propertycount 0.000086Regionname 0.000086CouncilArea 0.000086Postcode 0.000029Distance 0.000029dtype: float64

3. 使用Pandas的Styler

我们中的许多人从未意识到pandas的巨大潜力。pandas的一个被低估且经常被忽视的功能是其对DataFrames进行样式设置的能力。使用pandas DataFrames的.style属性,可以将条件设计和样式应用于它们。

作为第一个示例,让我们看看如何根据每个单元格的值来更改背景颜色:

diamonds = pd.read_csv('data/diamonds.csv')diamonds.head()

pd.crosstab(diamonds.cut, diamonds.clarity).style.background_gradient(cmap='rocket_r')

几乎没有使用Seaborn的热图功能的热图。在这里,我们使用pd.crosstab对钻石切割(cut)和净度(clarity)的每种组合进行计数。

将.style.background_gradient与调色板配合使用,您可以轻松地发现哪种组合出现得最多。仅从上面的DataFrame中,我们可以看到大多数钻石都是“ VS2”净度类型。

我们甚至可以通过在交叉表中找到每种钻石切割cut和净度clarity组合的平均价格来进一步做到这一点:

pd.crosstab(diamonds.cut, diamonds.clarity, aggfunc=np.mean, values=diamonds.price).style.background_gradient(cmap='rocket_r')

通过将.format方法与格式字符串{:.2f}链接起来,我们指定了2个浮点数的精度。

agg_prices = pd.crosstab(diamonds.cut, diamonds.clarity, aggfunc=np.mean, values=diamonds.price).style.background_gradient(cmap='rocket_r')agg_prices.format('{:.2f}')

4. matplotlib默认全局设置

在进行探索性数据分析时,您可能想对所有绘图应用自定义调色板,对刻度标签使用更大的字体,更改图例的位置,使用固定的图形大小等。

对绘图自定义参数的更改是一项非常无聊,重复且耗时的任务。幸运的是,您可以使用Matplotlib的rcParams为绘图设置全局配置。

rcParams只是一个普通的Python字典,其中包含Matplotlib的默认设置:

from matplotlib import rcParams
import warnings
warnings.filterwarnings('ignore')

rcParams
RcParams({'_internal.classic_mode': False,
'agg.path.chunksize': 0,
'animation.avconv_args': [],
'figure.dpi': 72.0,
....
'legend.fontsize': 'medium',
'legend.framealpha': 0.8,
'legend.frameon': True,
...
'ytick.minor.right': True,
'ytick.minor.size': 2.0,
'ytick.minor.visible': False,
'ytick.minor.width': 0.6,
'ytick.right': False})

您可以调整每个图的任意参数设置,一般的图像设置如固定图形大小,刻度标签字体大小以及其他一些参数。

通过这种设置,可以减少很多重复的代码量

# 去掉顶部和右侧的线条Remove top and right spines
rcParams['axes.spines.top'] = False
rcParams['axes.spines.right'] = False

# 设置图的尺寸Set fixed figure size
rcParams['figure.figsize'] = [129]

# 设置图片像素清晰度 Set dots per inch to 300, very high quality images
rcParams['figure.dpi'] = 300

# 设置自动调整布局Enable autolayout
rcParams['figure.autolayout'] = True

# 设置全局字号Set global fontsize
rcParams['font.style'] = 16

# 刻度字号Fontsize of ticklabels
rcParams['xtick.labelsize'] = 10
rcParams['ytick.labelsize'] = 10

5. Pandas全局设置

就像Matplotlib一样,pandas具有可以使用的全局设置。当然,它们大多数与显示选项有关。

  • get_option() -  获取pandas单个选项
  • set_option() — 设置pandas单个选项
  • reset_option() — 重置pandas选项值
#最大显示的列数
pd.get_option('display.max_columns')

df.head()

我更喜欢显示所有的列,lets go

pd.set_option('display.max_columns'None)
df.head()

本文代码可到 github 中下载,  https://github.com/thunderhit/DaDengAndHisPython


扫码免费领1万代理IP,高并发不限制,稳定速度快,快去薅羊毛吧!

精选文章

系列视频|Python网络爬虫与文本数据分析
语法最简单的微博通用爬虫weibo_crawler
B站视频 | Python自动化办公
SciencePlots | 科研样式绘图库
使用streamlit上线中文文本分析网站
bsite库 | 采集B站视频信息、评论数据
texthero包 | 支持dataframe的文本分析包
爬虫实战 | 采集&可视化知乎问题的回答
reticulate包 | 在Rmarkdown中调用Python代码
plydata库 | 数据操作管道操作符>>
plotnine: Python版的ggplot2作图库
读完本文你就了解什么是文本分析
文本分析在经管领域中的应用概述  
综述:文本分析在市场营销研究中的应用
plotnine: Python版的ggplot2作图库
Wow~70G上市公司定期报告数据集
漂亮~pandas可以无缝衔接Bokeh  
YelpDaset: 酒店管理类数据集10+G  

    分享”和“在看”是更好的支持


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存