5

私は既知のラベルを持つデータセットを持っています。私はクラスタリングを試み、既知のラベルによって与えられた同じクラスターを得ることができるかどうかを見たい。精度を測定するには、混乱行列のようなものを取得する必要があります。scikit-learnでのクラスタリングのための混同行列

私は分類問題のテストセットのために簡単に混同行列を得ることができます知っています。私はすでにthisのようにそれを試みました。それは分類問題のために理にかなっているラベルの同じセットを、持っているために、両方の列と行を期待通りに

しかし、それは、クラスタリングに使用することはできません。しかし、私が期待しているクラスタリング問題は、このようなものです。

行 - 実際のラベル

列 - 新しいクラスタ名(すなわち、クラスタ1、クラスタ-2など)

はこれを行う方法はありますか?

編集:ここでは詳細です。

には、y_testy_predは同じ値を持ち、labelsはそれらの値のラベルであると予測しています。

それは、このような行と列の両方に同じラベルを持つ行列を与える理由です。

enter image description here

しかし、私の場合(関数kmeansクラスタ)で、実際の値は文字列であり、私はconfusion_matrix(y_true, y_pred)を呼び出す場合、推定値は数字(すなわち、クラスタ数)

あるので、それはエラーの下になります。

ValueError: Mix of label input types (string and number) 

これは実際の問題です。分類の問題については、これは意味をなさない。しかし、クラスタリングの問題では、実際のラベル名と新しいクラスタ名が同じである必要はないので、この制限は存在しません。これにより

は、私は、クラスタリングの問題のために、分類問題のために使用されることを想定しているツールを使用しようとしている理解しています。だから、私の質問は、私はクラスター化されたデータのためのそのような行列を得ることができる方法があるということです。

質問がより明確になることを願っています。そうでない場合は教えてください。

+0

サンプルサンプル –

+0

詳細を追加してください。ありがとう。 – Bee

+0

クラスタ番号を実際の結果にマップする方法がわからない場合は、どのように進めますか? –

答えて

0

私は自分でコードを書いています。

# 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])) 

編集: (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) 
+1

コードをnumpyでベクトル化して10倍高速化します。 –

1

ペアごとの交差行列を簡単に計算できます。

しかしsklearnライブラリが分類ユースケース用に最適化されている場合は、自分でこれを実行する必要があります。

+0

ありがとう、私はちょうどそれを自分で書く前にこれを行うOOTBの方法があるかどうか探していた。 – Bee

+1

このような実装は確かに存在します。たとえば、グラフ上では、通常、類似度はありますが、距離はありません。しかし、ある時点では、別々のライブラリを一緒に糊付けするのにあまりにも多くのハッキングをしてから、一度にすべてのバグに噛まれるのではなく、自分でこれらのことを書く方が簡単になります。 –

+0

私は同意する、ありがとう。 – Bee

関連する問題