前提・実現したいこと
kmeans法を用いたクラスタリングで、各クラスタに正しいデータが含まれていることを確認したい
発生している問題・エラーメッセージ
クラスタ分けは上手くいっているように見えるのですが正答率が異常に低かったりすることがあります 正しいクラスに分類する方法が分からず困っています
該当のソースコード
python
1from matplotlib import pyplot as plt 2from sklearn import datasets, preprocessing 3from sklearn.cluster import KMeans 4from sklearn.metrics import accuracy_score 5import numpy as np 6import pandas as pd 7from sklearn.metrics import silhouette_samples 8# datasetの読み込み 9#data = datasets.load_iris() 10data = datasets.load_wine() 11#data = datasets.load_breast_cancer() 12# DataFrameに変換 13df = pd.DataFrame(data.data, columns=data.feature_names) 14print(df.head()) 15 16# データの整形 17#X=df[["sepal length (cm)","petal width (cm)"]] 18X = df[["malic_acid","ash"]] 19#X = df[["mean radius","mean texture"]] 20sc=preprocessing.StandardScaler() 21sc.fit(X) 22X_norm=sc.transform(X) 23# クラスタリング 24cls = KMeans(n_clusters=3) 25result = cls.fit(X_norm) 26# 結果を出力 27plt.scatter(X_norm[:,0],X_norm[:,1], c=result.labels_) 28plt.scatter(result.cluster_centers_[:,0],result.cluster_centers_[:,1],s=250, marker='*',c='red') 29plt.title('VABC-Kmeans clustering') 30plt.show() 31# シルエット値の計算 32from sklearn.metrics import silhouette_samples 33result = cls.fit_predict(X_norm) 34silhouette_vals = silhouette_samples(X_norm,result,metric = 'euclidean') 35silhouette_avg = np.mean(silhouette_vals) 36 37 38from sklearn.metrics import accuracy_score 39print(data.target) 40print(cls.labels_) 41accuracy_score(data.target,cls.labels_)
試したこと
何度か動作させると正答率が変化してしまい疑問に思いました。
元のデータのクラスとクラスタリング後のクラスを見比べて、配置はおおよそあっているのにクラスが違うため正答率が低くなっていると考えています。
ですが、正しいクラスに分類するする方法が分からず困っています。
補足情報(FW/ツールのバージョンなど)
python3.7.4 jupyter
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。