やること
データをクラスタリングして、各クラスタごとの教師データの分布の偏りを確かめたい。 今回は 教師データ = 0, 1 の2クラスを想定。 可視化をするためのデータは 主成分分析を使って次元削減する。
コード
クラスタリング
# kmeans def r():return random.randint(0, 100) from sklearn.cluster import MiniBatchKMeans labels = MiniBatchKMeans(random_state=r(), n_clusters=50).fit_predict(train_X) # pca for vizualization from sklearn.decomposition import PCA train_X_pca = pd.DataFrame(PCA(n_components=2).fit_transform(train_X))
PCA(n_components=2)
はデータを次元削減してグラフ上にプロットするために必要です。
クラスタリングは次元削減をする前のデータで行いたいので、pcaの前に行いました。
プロットするためのデータ準備
# label data labels_data = pd.DataFrame(labels) labels_data.columns = ['km_label'] labels_data = pd.concat([train_X_pca, labels_data], axis=1) # random color r = lambda: random.randint(0,255)
kmeansのラベルであるlabels
を pcaの結果に連結しています。
これは、単に detaframeで扱いたかったために行いました。
グラフ作成
# plot data plt.figure(figsize=(10, 5)) for i in labels_data['km_label'].unique(): cond = labels_data['km_label'] == i plot = labels_data[cond] color = ('#%02X%02X%02X' % (r(),r(),r())) plt.subplot(211) plt.scatter(plot.ix[:, 0], plot.ix[:, 1], marker='x', c=color) plt.subplot(212) plt.bar([i], [train_y[cond].mean()], color=color)
color = ('#%02X%02X%02X' % (r(),r(),r()))
でランダムに色を作成してプロット。
train_y[cond].mean()
は今回2クラス分類なので 1の含まれる割合だけをみればいいため、このようにしています。
結果
それぞれの色がクラスタのラベル番号に対応。 今回はバイナリクラシフィケーションなので、 1 の割合だけをプロットしてクラスタごとの偏り具合を見ました。