接触到核密度估计是 seaborn 库中的 kdeplot (也就是核密度估计图)。它可以比较直观看出样本数据的分布特征。用到查看单个样本数据分布特征,和比较多个样本数据分布是否一致。

我目前最常用的还是在同一变量下,比较测试集和训练集数据的分布差异情况。

了解数据分布的另一种图示方法是使用直方图。但是使用起来有几个缺点。一个原因是绘制直方图需要确定组距,组距的大小就会确定分布特征。而且使用直方图展示的分布曲线并不平滑。

回到核密度估计,查阅了一些相关理论,理论讲解部分目前懂了,但是数学公式推导细节还是有些不懂。由于目前只是核密度图来查看数据集分布,所以这部分原理决定还是放一放,后续再花时间。

常用的还是 seaborn 库的 kdeplot,也就是核密度估计图。下面用 seaborn 库自带的小费数据集演示。

1
2
3
4
5
6
# 导入包
import seaborn as sns
from pandas import Series,DataFrame
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
1
2
3
4
5
6
7
# 拿到小费数据集
tips = sns.load_dataset('tips')

# 数据介绍: total_bill列为消费总金额;tip列为小费金额;sex列为顾客性别;smoker列为顾客是否抽烟;day列为消费的星期;time列为聚餐的时间段;size列为聚餐人数

# 查看前5行数据
tips.head()

image.png

1
2
3
4
5
6
7
column = tips.columns.tolist()[:2]  # 列表头
fig = plt.figure(figsize=(10, 4)) # 指定绘图对象宽度和高度
for i in range(2):
plt.subplot(1, 2, i + 1) # 1行2列子图
sns.kdeplot(tips[column[i]],shade=True)
plt.xlabel(column[i], fontsize=8)
plt.show()

output_2_0.png

1
2
3
ax = sns.kdeplot(tips['total_bill'], color="Red", shade=True)
ax = sns.kdeplot(tips['tip'], color="Blue", shade=True)
ax = ax.legend(["total_bill","tip"])

output_3_0.png
拿小费数据集为例。图一单个看 total_bill 和 tip,两个数据集分布基本一致,都是略微右偏。

另外。提一个问题:来看图二,放在一起对比就会明显。如果假设一个是测试集数据,另外一个为训练集数据。这类情况是否需要对数据处理进行处理?显然是需要的,因为测试集和训练集分布差距大,会导致模型泛化能力差。这部分根据具体情况看,如果特征足够多,常见的操作是删除差距较大的特征。