数据缺失的坑,无监督学习这样帮你补了

2018-05-24 17:31:12 浏览数 (1)

大数据文摘作品

编译:Chole、糖竹子、saint

经常被数据里的NaN值困扰,又不想昧着良心用均值填充?本文介绍了几种常见的数据缺失值处理方法,其中一些用到了聚类算法。

无监督学习(UL)有很多没开发的潜力。它是一门从“未标记”数据中推导一个函数来描述其隐藏结构的艺术。但首先,从数据中找到其结构是什么意思呢? 让我们来看以下两个例子:

Blobs

气泡状分布:这个简单。任何人看到这张图都会认为它是由三个不同的簇组成的。如果你对统计学非常熟悉,你可能还会猜想它由三个隐藏的高斯分布构成。对一个新的数据样本,查看它的位置,人们就能推断出它属于哪一簇。

Wavy hi

波浪分布:这个就有难度了。它有明确的结构,但我怎么教计算机提取出这一结构呢?为了让你更好地理解这个问题,想象一下我找来1000人,问他们在这张图中看到了几个簇。结果很可能是这样,回答2的人最多,也有人回答3、4,甚至1!

所以说对数据的结构,连人都无法达成共识,那怎么可能教计算机学会呢?这里的症结在于,对于什么是簇,或者广义地说什么是“结构”,没有统一的定义。人们可以研究一下日常生活的某个方面,看它有没有结构,但这也会根据环境或其中涉及的人的变化而变化。

很多著名的无监督学习算法,比如层次聚类,K-Means,混合高斯模型或隐马尔可夫模型,对同一问题可能得到不同的答案,依我拙见,对于找结构问题,没有所谓更好的或更正确的普适方法(真的吗?又是没有免费的午餐定理?)

那么让我们动手探索吧——

聚类方法

  1. K-Means(scikit learn)
  2. 模糊K-Means(scikit fuzzy)
  3. 混合高斯模型(scikit learn)

用K-Means算法产生簇通常被称为“硬划分”,因为对一个样本和一个簇,只有属于和不属于两种关系。K-Means的改进版模糊K-Means算法是“软划分”或“模糊”,因为一个样本对每个簇都有隶属度。基于这些隶属度来更新簇的质心。

混合高斯模型https://github.com/abriosi/gmm-mml

这个包是论文Unsupervised learning of finite mixture models(有限混合模型的无监督学习)中提出的方法,用一个算法实现估计和模型选择。

数据集

1. 占有率检测:

这是一个没有缺失值的时间序列数据集,因此要人为刻意地进行空缺数据补全。

这一数据集相对较小,有20560个样本和7个特征,其中一个模型预测变量为是否占有。(二元分类问题)。

2. Sberbank俄罗斯房价市场数据集:

这也是一个时序数据集,来自数月前结束的Kaggle竞赛。

将训练数据与俄罗斯宏观经济和金融部门的数据合并后,得到30471个样本,389个特征,其中一个是要预测的价格(回归问题)。

它有93列有缺失数据,有些NaNs(非指定类型数据)占比很大(> 90%)。

3.子宫颈癌(危险因素)数据集:

这一数据集有858个样本和32个特征,4个目标变量(不同医学测试指标的二元输出)取众数转化成1个目标变量。

它有26个特征有空缺值,有些NaNs(非指定类型数据)占比很大(> 90%)。

数据缺失值补全过程

先删去训练集和测试集中所有含有缺失数据的特征。利用留下的特征,对训练集应用聚类算法,并预测两组中每个样本的簇。加上删去的列,计算按照簇分组后每个特征的平均值(或均值,如果是定性的话)。所以现在我们有了每个簇未补全时的特征的平均值。

“普通”和加权补全方法:

这里“普通补全”指的是每个样本都用以计算其所属簇的平均值/众数。

加权方法则用样本对每个簇的“归属度”。比如,在混合高斯模型(GMM)中,归属度是样本属于各个簇的可能性,在K-Means方法中,归属度基于样本与各个簇的质心的距离。

评分方法

除标准化之外,几乎没对数据集做任何处理。

对于时间序列数据集,从第一个样本算起对时间标记排序,在占有率检测数据集中转化成按秒计数,同理在俄罗斯房价市场数据集中按天计数。

完成插补后,用XGBoost在测试集进行评分。用负对数损失和均方误差作为评分度量。

得到簇的数目

最初考虑了“肘”或者说“膝”方法。当簇的数量取值在一定范围内时,画出不同聚簇方法的得分并从图中寻找肘部。

比如,上图的肘部在8到12之间。缺点是这种方法需要人的参与来选择肘部,而实际应用上应该自动。但自动选择肘部效果并不理想,因此可以考虑一种新方法。

通过交叉验证,得到了一种比较有效但计算成本昂贵的方法。它是怎么工作的呢?首先选择一个分类器,然后对于一系列质心数目,进行无监督插补,并用该分类器进行K-fold交叉验证。最后选择在交叉验证中表现更好的质心数目。

结果

在条形图中,用红线标记平均值插补的分数,以便进行比较。

占有率检测数据集:

诚如之前提到的,这个数据集并没有缺失数据,所以只能模拟补缺行为。

对将要补缺的数据特征和样本应当谨慎挑选。不仅特别选择了数据特征,而且对是否选择样本设定了概率。如果概率为0.5,有50%的机会该样本将被丢弃。由于每次填补缺失值的样本选择都不同,我们将每三轮不同样本补缺的评分结果取均值,最后再对所有结果取均值。

房产市场数据集:

由于该数据集的数据量过大,怎样在有限的内存中完成聚类分析值得研究一番。我们放弃了使用全量数据做归类计算的打算,随机抽取了适合电脑内存的样本数据量(本次测试我选用了5000条记录)。

在原始数据集中使用随机抽样的方法抽取样本,也尽量保持了数据的时间结构。样本的数据量越大,反映的时间结构越准确。

子宫颈癌数据集:

结果分析

根据结果,在数据分群的基础上选择补缺方式的表现比一般方法要好。

对于占有率检测数据集,表现最优的是GMM_MML分类算法,而对于房产市场数据和宫颈癌数据集,K_Means聚类算法更好。我们并没有对房产市场数据使用GMM_MML算法,因为它包含太多特征,而协方差的计算对于多特征数据比多样本量数据更加困难。

在增加占有率检测数据集的缺失数据后,整体上可以观测到,无监督的补缺方法比均值补缺表现要好。因此,当数据集有缺失值占比较高时,先探索数据结构再补缺方法反而形成一种优势

大家会注意到,当使用检测数据集的缺失数据特征从2个增加到4个,且用于聚类的特征数量减少时,无监督补缺方法比均值补缺表现稍好。这种反常的现象可能是由于特定的数据集和选择的特征造成的。

同时,自然的,当缺失数据占比增加时,评分与基线分数的差距越来越大。

在三种K_Means算法中,普通型表现优于其他两种。这种算法每次迭代的计算量也最小,是最佳选择。

基于GMM方法的表现优于K-Means算法,这一现象十分合理,因为K-Means算法是GMM算法在欧式距离计算上的启发式算法。欧式距离能有效测量低维数据,但在高维空间上,其含义开始失真。如想了解更多信息,请看这里(https://stats.stackexchange.com/questions/99171/why-is-euclidean-distance-not-a-good-metric-in-high-dimensions/)。GMM算法是基于样本所属概率密度函数的可能性,能更好的衡量高维空间距离。

结论

尽管基于聚类的缺失值补充算法没有明显高过其他算法的优胜者,我们还是建议选择基于GMM的算法

想找到模型混合的最佳数量,使用交叉验证法会更好。尽管AIC准则和BIC准则需要大量计算,他们可以用于检测模型混合数量的范围。最佳数量会令准则值达到最小。

计算协方差矩阵有很多方法。这里介绍两种最常使用的:

对角协方差:每个部分都有自己的对角矩阵。 全协方差:这种协方差用于统计检测。每个部分有自己的广义协方差矩阵。

数据集中如果特征维度太多,使用GMM算法计算协方差矩阵,可能因为样本量不足计算错误,也可能因为使用全量数据耗时太久。因此建议使用对角协方差,更加平衡模型大小和计算质量

如果数据量大大超过内存容量,应当从训练集中生成随机样本做聚类分析。

均值补缺的表现没有比基于聚类补缺方法差很多,因此也可以考虑使用。

后续工作

数据整理也可以尝试新方法:不再丢弃有缺失数据的特征,可以用均值或中位数填补缺失值,对修改后的数据集使用聚类分析。补缺可以在每个样本被标记后完成。

Finite Mixture Models (McLachlan和Peel著)这本书中提到NEC和ICL都是很好的方法。

也有更多无监督方法值得研究检测,例如,不同距离度量方法下的分级聚类。当然,普适的方法可能并不存在,毕竟没有免费的午餐。

原文地址:<https://machinelearnings.co/missing-data-filling-with-unsupervised-learning-b448964030d>

0 人点赞