Bee*_*Bee 5 python cluster-analysis scikits confusion-matrix scikit-learn
我有一组带有已知标签的数据.我想尝试群集,看看我是否可以获得已知标签给出的相同群集.为了测量准确度,我需要得到类似混淆矩阵的东西.
我知道我可以轻松地为分类问题的测试集获得混淆矩阵.我已经尝试过这样的了.
但是,它不能用于聚类,因为它希望列和行具有相同的标签集,这对于分类问题是有意义的.但对于聚类问题,我期望的是这样的.
行 - 实际标签
列 - 新的群集名称(即群集1,群集2等)
有没有办法做到这一点?
编辑:这里有更多细节.
在sklearn.metrics.confusion_matrix中,它期望y_test
并y_pred
具有相同的值,并且labels
是这些值的标签.
这就是为什么它给出了一个矩阵,它对于行和列都有相同的标签.
但在我的情况下(KMeans Clustering),实际值是字符串,估计值是数字(即簇号)
因此,如果我调用confusion_matrix(y_true, y_pred)
它会给出以下错误.
ValueError: Mix of label input types (string and number)
Run Code Online (Sandbox Code Playgroud)
这是真正的问题.对于分类问题,这是有道理的.但是对于群集问题,不应该存在此限制,因为实际标签名称和新群集名称不需要相同.
有了这个,我理解我正在尝试使用一个工具,它应该用于分类问题,用于聚类问题.所以,我的问题是,有没有办法可以为may集群数据得到这样的矩阵.
希望问题现在更加清晰.如果不是,请告诉我.
我自己写了一段代码。
# Compute confusion matrix
def confusion_matrix(act_labels, pred_labels):
uniqueLabels = list(set(act_labels))
clusters = list(set(pred_labels))
cm = [[0 for i in range(len(clusters))] for i in range(len(uniqueLabels))]
for i, act_label in enumerate(uniqueLabels):
for j, pred_label in enumerate(pred_labels):
if act_labels[j] == act_label:
cm[i][pred_label] = cm[i][pred_label] + 1
return cm
# Example
labels=['a','b','c',
'a','b','c',
'a','b','c',
'a','b','c']
pred=[ 1,1,2,
0,1,2,
1,1,1,
0,1,2]
cnf_matrix = confusion_matrix(labels, pred)
print('\n'.join([''.join(['{:4}'.format(item) for item in row])
for row in cnf_matrix]))
Run Code Online (Sandbox Code Playgroud)
编辑: (Dayyyuumm)刚刚发现我可以使用Pandas Crosstab轻松做到这一点:-/。
labels=['a','b','c',
'a','b','c',
'a','b','c',
'a','b','c']
pred=[ 1,1,2,
0,1,2,
1,1,1,
0,1,2]
# Create a DataFrame with labels and varieties as columns: df
df = pd.DataFrame({'Labels': labels, 'Clusters': pred})
# Create crosstab: ct
ct = pd.crosstab(df['Labels'], df['Clusters'])
# Display ct
print(ct)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3693 次 |
最近记录: |