ゆるふわめも

東京か京都にいます。

mini-batch k-meansでデータをクラスタリングして教師データの偏りを可視化する

やること

データをクラスタリングして、各クラスタごとの教師データの分布の偏りを確かめたい。 今回は 教師データ = 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の含まれる割合だけをみればいいため、このようにしています。

結果

f:id:misos:20161022144030p:plain

それぞれの色がクラスタのラベル番号に対応。 今回はバイナリクラシフィケーションなので、 1 の割合だけをプロットしてクラスタごとの偏り具合を見ました。