seaborn.kdeplot绘制图像显示异常问题

背景:在验证数据集的分布情况时,用kdeplot绘制可视化查看,但发现存在锯齿状、脉冲状的异常图像,乍一看是非常令人费解的。

个人数据探索的真实案例(spark环境):

from scipy.stats import kstest
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 定义函数kde_plot,kde默认选择高斯分布gau,绘制2个数据集的特征分布情况
def kde_plot(dataset_1,dataset_2,feature_num):
    
    plot_01 = np.array(dataset_1.select('features').collect())[:,0,feature_num]
    plot_02 = np.array(dataset_2.select('features').collect())[:,0,feature_num]
    
    sns.kdeplot(plot_01,legend=True)
    sns.kdeplot(plot_02,legend=True)

#可视化
plt.figure(figsize=[16,9])

for i in range(1,12):
    plt.subplot(3,4,i)
    kde_plot(train,test,i-1)

运行以上代码,进行可视化输出:

发现倒数第2个图出现异常,因为在此之前已经过KS检验,2者数据特征分布一致,具有统计显著性。

发现倒数第2个图出现异常

为了一探究竟,我查看了倒数第2个特征数据的具体情况,发现该特征的values大小相差较大。为了验证此现象,我特意自制一个max和min差异很大的数据集,进行验证:

make_list = [1.22,1.23,1.25,2.34,5.33,2.11,2,0.001,100.55,1000]
make_array = np.array(make_list)
sns.kdeplot(make_array);

脉冲状图像

果然也出现类似脉冲状的图像,而不是平滑的高斯分布。

所以针对此类离散数据的可视化比较,或许只能简单通过直方图hist来观察:

x = np.array(train.select('features').collect())[:,0,9]
y = np.array(test.select('features').collect())[:,0,9]

plt.hist(x,bins=30)
plt.hist(y,bins=30);

hist可视化

通过绘制直方图,发现2者的分布确实趋于一致,不过美中不足是出现不能匹配的区域,主要原因是数据总量不够大,导致split之后,test集(橙色)的数据量较少。

此外,通过自举其他数据案例,发现当特征的values比例相差较大时,也会出现脉冲/锯齿状的图像,如:

#当0和1的比例比较接近1:1时
make_list03 = [1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0]
make_array = np.array(make_list03)
sns.kdeplot(make_array);

可视化结果:

平滑的分布曲线

#当0的数量明显大于1时
make_list03 = [0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0]
make_array = np.array(make_list03)
sns.kdeplot(make_array);

可视化结果:

锯齿状曲线

可以发现,结果输出的不仅不平滑,连0和1的比例都失真了,此类情况还是通过hist可视化比较好。

如果你的问题解决了,欢迎关注+点赞+收藏哦~

猜你喜欢

转载自blog.csdn.net/weixin_45281949/article/details/105310108
今日推荐