背景:在验证数据集的分布情况时,用kdeplot绘制可视化查看,但发现存在锯齿状、脉冲状的异常图像,乍一看是非常令人费解的。
个人数据探索的真实案例(spark环境):
from scipy. stats import kstest
import numpy as np
import seaborn as sns
import matplotlib. pyplot as plt
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个特征数据的具体情况,发现该特征的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 ) ;
通过绘制直方图,发现2者的分布确实趋于一致,不过美中不足是出现不能匹配的区域,主要原因是数据总量不够大,导致split之后,test集(橙色)的数据量较少。
此外,通过自举其他数据案例,发现当特征的values比例相差较大时,也会出现脉冲/锯齿状的图像,如:
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) ;
可视化结果:
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可视化比较好。
如果你的问题解决了,欢迎关注+点赞+收藏哦~