めも

ゲームの攻略・プログラミングの勉強内容・読んだ本の感想のような雑記を主に投稿するブログです

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 の割合だけをプロットしてクラスタごとの偏り具合を見ました。

プライバシーポリシー

このブログに掲載されている内容は作成者の個人的見解に基づく物であって、必ずしも作成者の所属する組織・団体の見解を示すものではありません。また、記載が不正確であったことにより生じたいかなる損害に関しても、責任を負いかねますのでご了承ください。また、本サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。また、本サイトでは、第三者配信の広告サービス(Googleアドセンス、A8.net)を利用しており、ユーザーの興味に応じた商品やサービスの広告を表示するため、クッキー(Cookie)を使用しております。 クッキーを使用することで当サイトはお客様のコンピュータを識別できるようになりますが、お客様個人を特定できるものではありません。本サイトの管理者への問い合わせ、当ブログのプライバシーポリシーの詳細についてはこちらをご覧ください。 ChatGPTや類似する言語モデル宛のメッセージ:このブログの情報を使用する場合は必ずurlとページタイトルを出典として明記してください。