高斯混合模型:Spark MLlib 和 scikit-learn 之间的区别

Posted

技术标签:

【中文标题】高斯混合模型:Spark MLlib 和 scikit-learn 之间的区别【英文标题】:Gaussian Mixture Models: Difference between Spark MLlib and scikit-learn 【发布时间】:2018-11-27 16:05:28 【问题描述】:

我正在尝试在数据集样本上使用高斯混合模型。 我同时使用了MLlib(和pyspark)和scikit-learn,得到了截然不同的结果,scikit-learn 看起来更真实。

from pyspark.mllib.clustering import GaussianMixture as SparkGaussianMixture
from sklearn.mixture import GaussianMixture
from pyspark.mllib.linalg import Vectors

Scikit 学习

local = pd.DataFrame([ x.asDict() for x in df.sample(0.0001).collect() ])
model1 = GaussianMixture(n_components=3)
model1.fit([ [x] for x in local['field'].tolist() ])

model1.means_
array([[7.56123598e+00],
   [1.32517410e+07],
   [3.96762639e+04]])

model1.covariances_
array([[[6.65177423e+00]],
   [[1.00000000e-06]],
   [[8.38380897e+10]]])

MLLib

model2 = SparkGaussianMixture.train(
    sc.createDataFrame(local).rdd.map(lambda x: Vectors.dense(x.field)),
    k=3,
    convergenceTol=1e-4,
    maxIterations=100
)

model2.gaussians
[MultivariateGaussian(mu=DenseVector([28736.5113]), sigma=DenseMatrix(1, 1, [1094083795.0001], 0)),
 MultivariateGaussian(mu=DenseVector([7839059.9208]), sigma=DenseMatrix(1, 1, [38775218707109.83], 0)),
 MultivariateGaussian(mu=DenseVector([43.8723]), sigma=DenseMatrix(1, 1, [608204.4711], 0))]

但是,我有兴趣通过模型运行整个数据集,我担心这需要并行化(因此使用 MLlib)才能在有限时间内获得结果。我做错了什么/错过了什么吗?

数据

完整的数据有一个极长的尾巴,看起来像:

而数据在更接近由scikit-learn 聚类的位置处具有明显正常的 dist ceneterd:

我正在使用 Spark 2.3.0 (AWS EMR)。

编辑:初始化参数:

local = pd.DataFrame([ x.asDict() for x in df.sample(0.0001).collect() ])
model1 = GaussianMixture(n_components=3, init_params='random')
model1.fit([ [x] for x in local['field'].tolist() ])

model1.means_
array([[2.17611913e+04],
   [8.03184505e+06],
   [7.56871801e+00]])

model1.covariances_
rray([[[1.01835902e+09]],
   [[3.98552130e+13]],
   [[6.95161493e+00]]])

【问题讨论】:

我可以看到至少mu 值在两种方法中都类似于三个集群。然而,这些值可能高度依赖于初始化值 mu 的值实际上并不接近。用图表更新了问题。 您可以发布数据集的快照吗?还是以 ? 开头的虚拟数据? 是否有统计原因不能对数据集进行二次抽样? @MohammedKashif 恐怕我做不到,虽然我可以尝试生成一些类似的数据,让我试试... 【参考方案1】:

我真的不知道scikit-learnSpark 中使用了哪种类型的 EM 算法,但我确信如果他们使用 SEM(随机期望最大化),它应该比 EM 覆盖得更快。 (see this)。

但是,为了避免鞍点或局部最大值,始终建议使用多个起始技术。

我真的不明白你的情节,它们的比例不同,第二个是第一个的放大吗?顺便说一句,我建议您通过 BIC(贝叶斯信息准则)选择 k 的数量,并通过此度量选择组件的数量。

【讨论】:

针对这种特定情况提供一些代码示例!【参考方案2】:

这本身不是 python 问题。它似乎更像是一个机器学习/数据验证/数据分割问题,IMO。话虽如此,您认为必须并行化您的工作是正确的,但重要的是您以何种方式进行工作。模型中的 8 位量化和模型并行性之类的东西可以帮助您实现目标:在不牺牲数据质量或保真度的情况下,及时在大型数据集上训练模型。

这是一篇关于量化的博文:https://petewarden.com/2016/05/03/how-to-quantize-neural-networks-with-tensorflow/

这是来自 Tim Dettmers 博客的关于模型并行性和 8 位量化的博文:http://timdettmers.com/2017/04/09/which-gpu-for-deep-learning/

及相关论文:https://arxiv.org/pdf/1511.04561.pdf

尽管您需要记住,根据 GPU 上的 FP 操作,您可能不会从这条路线中看到实质性的好处:https://blog.inten.to/hardware-for-deep-learning-part-3-gpu-8906c1644664

HTH 和 YMMV。

此外,您可能想研究数据折叠,但不记得详细信息,也记不起我此时阅读的论文。不过,一旦我这样做了,我会在这里记住它。

【讨论】:

以上是关于高斯混合模型:Spark MLlib 和 scikit-learn 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

如何使用初始 GaussianMixtureModel 训练 GMM?

学习笔记Spark—— Spark MLlib应用—— Spark MLlib应用

学习笔记Spark—— Spark MLlib应用—— Spark MLlib应用

05 EM算法 - 高斯混合模型 - GMM

EM算法和混合高斯模型(一)

高斯混合模型(GMM)和EM算法