监督聚类 - 评估每个地面实况标签的指标?
Supervised Clustering - Metric to Evaluate Each Ground Truth Label?
我正在对数据集执行 K 均值聚类,但我有可用的地面实况标签。我在聚类期间使用它们来找到 V-Measure 和 Adjusted Rand 分数以获得最佳 K。
为了评估我的最佳模型,我希望每个已知标签都有一个指标来描述它的聚类程度 - 几乎类似于纯度分数,但标签分布在多个聚类中。
例如,标签 0
有 5 个数据点,因此我们有以下内容:
true_labels = [0,0,0,0,0]
cluster_numbers = [1,1,1,1,1]
(即所有标签 0
点都在同一个簇中)
--> 应该return满分1.0
如果标签的点像这样分布在多个集群中
cluster_numbers = [0,0,0,1,1]
--> return 得分 0.6
有谁知道可用于评估聚类中每个基本事实标签的指标?这不必像我上面给出的示例那样行事。
我认为您可以尝试评估混淆矩阵并检查多数票。例如我们使用鸢尾花数据集:
from sklearn.datasets import load_iris
from sklearn.cluster import SpectralClustering
from sklearn.metrics import confusion_matrix
import pandas as pd
data = load_iris()
df = pd.DataFrame(data.data,
columns=['sepal.length','sepal.width','petal.length','petal.width'])
labels = data.target
然后我们进行谱聚类:
clustering = SpectralClustering(n_clusters=3,
assign_labels="discretize",random_state=0).fit(df)
M = confusion_matrix(labels,clustering.labels_)
M
array([[ 0, 50, 0],
[ 2, 0, 48],
[37, 0, 13]])
对于每一行,您都有针对每个标签的预测。上面的纯度是:
np.max(M,axis=1)/np.sum(M,axis=1)
array([1. , 0.96, 0.74])
如果您想要一个整体协议,您可以使用:
from sklearn.metrics import adjusted_rand_score
adjusted_rand_score(labels,clustering.labels_)
0.7436826319432357
为什么不将调整后的兰特分数也用于此目的?
如果需要,您可以为每个集群计算它并跨集群计算平均值。
它忽略了对您的应用程序有利的排列
我正在对数据集执行 K 均值聚类,但我有可用的地面实况标签。我在聚类期间使用它们来找到 V-Measure 和 Adjusted Rand 分数以获得最佳 K。
为了评估我的最佳模型,我希望每个已知标签都有一个指标来描述它的聚类程度 - 几乎类似于纯度分数,但标签分布在多个聚类中。
例如,标签 0
有 5 个数据点,因此我们有以下内容:
true_labels = [0,0,0,0,0]
cluster_numbers = [1,1,1,1,1]
(即所有标签 0
点都在同一个簇中)
--> 应该return满分1.0
如果标签的点像这样分布在多个集群中
cluster_numbers = [0,0,0,1,1]
--> return 得分 0.6
有谁知道可用于评估聚类中每个基本事实标签的指标?这不必像我上面给出的示例那样行事。
我认为您可以尝试评估混淆矩阵并检查多数票。例如我们使用鸢尾花数据集:
from sklearn.datasets import load_iris
from sklearn.cluster import SpectralClustering
from sklearn.metrics import confusion_matrix
import pandas as pd
data = load_iris()
df = pd.DataFrame(data.data,
columns=['sepal.length','sepal.width','petal.length','petal.width'])
labels = data.target
然后我们进行谱聚类:
clustering = SpectralClustering(n_clusters=3,
assign_labels="discretize",random_state=0).fit(df)
M = confusion_matrix(labels,clustering.labels_)
M
array([[ 0, 50, 0],
[ 2, 0, 48],
[37, 0, 13]])
对于每一行,您都有针对每个标签的预测。上面的纯度是:
np.max(M,axis=1)/np.sum(M,axis=1)
array([1. , 0.96, 0.74])
如果您想要一个整体协议,您可以使用:
from sklearn.metrics import adjusted_rand_score
adjusted_rand_score(labels,clustering.labels_)
0.7436826319432357
为什么不将调整后的兰特分数也用于此目的? 如果需要,您可以为每个集群计算它并跨集群计算平均值。 它忽略了对您的应用程序有利的排列