web-dev-qa-db-ja.com

sklearn:テストデータセットのk-meansの精度スコアの計算

2つのクラスターを持つ30のサンプルのセットでk-meansクラスタリングを実行しています(2つのクラスがあることはすでに知っています)。データをトレーニングセットとテストセットに分割し、テストセットの精度スコアを計算しようとしています。しかし、2つの問題があります。1つは、k-meansクラスタリングに対して実際にこれ(テストセットの精度スコア)を実行できるかどうかわからないことです。第二に:私の実装が書き込みであるか間違っているかにかかわらず、これを行うことが許可されている場合。これが私が試したことです:

df_hist = pd.read_csv('video_data.csv')

y = df_hist['label'].values
del df_hist['label']
df_hist.to_csv('video_data1.csv')
X = df_hist.values.astype(np.float)

X_train, X_test,y_train,y_test =  cross_validation.train_test_split(X,y,test_size=0.20,random_state=70)
k_means = cluster.KMeans(n_clusters=2)
k_means.fit(X_train)
print(k_means.labels_[:])
print(y_train[:])

score = metrics.accuracy_score(y_test,k_means.predict(X_test))
print('Accuracy:{0:f}'.format(score))

k_means.predict(X_test)
print(k_means.labels_[:])
print(y_test[:])

しかし、テストセットのk-meansラベルを印刷すると(k_means.predict(X_test)print(k_means.labels _ [:]))およびy_testラベル(- print(k_means.labels _ [:]))最後の3行で、Xトレイン用に作成されたラベルではなく、Xトレインをフィッティングしたときと同じラベルを取得します-テスト。私がここで間違っているかもしれない何か考えはありますか? k-meansのパフォーマンスを評価するために私が行っていることはまったく正しいですか?ありがとうございました!

5
Miranda

精度の評価に関して。 k-means 分類ツールではありませんであることを覚えておく必要があります。したがって、精度の分析はあまり良い考えではありません。これを行うことはできますが、これはk-meansの目的ではありません。クラスター間の距離を最大化するデータのグループを見つけることになっています。トレーニングにラベリングを使用しません。したがって、k-meansのようなものは通常、RandIndexや他のクラスタリングメトリックのようなものでテストされます。精度を最大化するには、kNN、ロジスティック回帰、SVMなどの実際の分類器を適合させる必要があります。

コード自体に関しては、k_means.predict(X_test)returnsラベリング、内部のlabels_フィールドは更新されません。

print(k_means.predict(X_test))

さらに、python)では、配列を出力するために[:]を使用する必要はありません(使用すべきではありません)。

print(k_means.labels_)
print(y_test)
16
lejlot