使用分数度量评估高斯混合模型?
Posted
技术标签:
【中文标题】使用分数度量评估高斯混合模型?【英文标题】:Evaluating Gaussian Mixture model using a score metric? 【发布时间】:2020-05-06 16:26:08 【问题描述】:我有 1D 数据(在列数据上)。我使用高斯混合模型 (GMM) 作为密度估计,在 Python 中使用此实现:https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html。通过依靠 AIC/BIC 标准,我能够确定组件的数量。在我拟合 GMM 之后,我绘制了原始观测值的核密度估计 + 从 GMM 中提取的采样数据的核密度估计。原始和采样密度的情节非常相似(很好)。但是,我想要一些指标来报告拟合模型的好坏。
g = GaussianMixture(n_components = 35)
data= df['x'].values.reshape(-1,1) # data taken from data frame (10,000 data pints)
clf= g.fit(data)# fit model
samples= clf.sample(10000)[0] # generate sample data points (same # as original data points)
我在实现中找到了分数,但不确定如何实现。我做错了吗?或者除了直方图或核密度图之外,还有什么更好的方法可以显示拟合模型的准确性?
print(clf.score(data))
print(clf.score(samples))
【问题讨论】:
【参考方案1】:我最好使用交叉验证,并尝试查看训练模型的准确性。
使用拟合模型的predict
方法预测未见数据的标签(使用交叉验证并报告准确性):https://scikit-learn.org/stable/modules/generated/sklearn.mixture.GaussianMixture.html#sklearn.mixture.GaussianMixture.predict
玩具示例:
g = GaussianMixture(n_components = 35)
g.fit(train_data)# fit model
y_pred = g.predict(test_data)
编辑:
有多种方法可以衡量您的无监督案例的表现。对于基于真实概率的 GMM,最常见的是 BIC 和 AIC。它们立即包含在 scikit GMM 类中。
【讨论】:
据我所知,交叉验证仅在我们有 2D 时才有效,例如 X 和 y,我们通过 X,预测 y 并将其与原始 y 进行比较(计算平均绝对误差等)。就我而言,我只有 X,所以当我采样时,我得到的数字可能完全不同。如果我错了,请纠正我! 我明白你的意思。如果您将 GMM 用作无监督模型,则无法使用我的答案。换句话说,如果你没有标签 (y
),你就不能使用这个提议的交叉验证方案。查看我的编辑
谢谢。我已经使用 AIC/BIC 来指导我了解组件数量。但我正在寻找评估准确性,我只找到了我不太了解的分数。【参考方案2】:
您可以使用normalized_mutual_info_score
、adjusted_rand_score
或silhouette
分数来评估您的集群。所有这些指标都在sklearn.metrics
部分下实现。
编辑:您可以查看link 了解更多详细说明。
总结一下:
Adjusted Rand Index:衡量两个分配的相似度。
标准化互信息:衡量两个分配的一致性。
剪影系数:衡量每个点的分配情况。gmm.fit(x_vec)
pred = gmm.predict(x_vec)
print ("gmm: silhouttte: ", silhouette_score(x_vec, pred))
【讨论】:
您能否提供一个示例或如何将其应用于我的案例以及如何解释结果。 sklearn 的文档并不总是对我有帮助。谢谢 我认为这些指标用于分类任务。我正在做的是使用高斯混合的密度估计。不过还是谢谢! 您可以将剪影指标用于无监督任务。它计算一个对象与其自己的集群相比与其他集群的相似程度。 @MWH 谢谢。我遇到错误“ValueError:预期的二维数组,而是得到一维数组:”。这应该只处理一列(X)的数据吗?我传递了 x 个“原始数据”和 y 个“采样数据”,它们都有相同的数据点“行”。 @MWH 我在回答中添加了一个小示例,您可以如何为集群使用轮廓分数指标。以上是关于使用分数度量评估高斯混合模型?的主要内容,如果未能解决你的问题,请参考以下文章