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

时间:2018-06-18 18:49:25

标签: python scikit-learn pyspark apache-spark-mllib gmm

我试图在数据集的样本上使用高斯混合模型。 我同时使用MLlibpyspark}和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)才能在有限的时间内获得结果。我做错了什么/遗失了什么吗?

数据

完整的数据有一个非常长的尾巴,看起来像: enter image description here

而数据显然是正常的,距离scikit-learn聚集的地方更近:

enter image description here

我正在使用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]]])

2 个答案:

答案 0 :(得分:1)

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

但是,始终建议使用多次启动技巧以避免出现鞍点或局部最大值。

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

答案 1 :(得分:0)

这本身不是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。

此外,您可能想研究数据折叠,但是不记得详细信息,也不记得我此时所读的论文。不过,这样做后,我会将其放在这里以记住。