Menu
CoddyTech

クラスタリング前のスケーリング

CoddyのMachine Learningジャーニー「教師なし学習」セクションの一部。レッスン 9/51。

K-meansは距離に基づいてグループ分けするため、単位の大きいほうが支配的になります。保護施設の猫を体重(グラム)と年齢(年)で分類すると、500 gの差が10年の差を圧倒してしまいます。

保護施設の猫120匹を示す2つのグラフ。横軸は年齢(年)、縦軸は体重(グラム)。左は生データをクラスタリングしたもの。成猫が体重で分けられ、若い猫と年老いた猫が混在している。右はスケーリング後にクラスタリングしたもの。子猫、成猫、高齢猫が年齢で分けられている

k-NN の場合と同様に、各特徴量が等しく扱われるよう、まず標準化します。

X_scaled = StandardScaler().fit_transform(X)
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X_scaled)

make_pipeline(StandardScaler(), KMeans(...))は、1つのモデルで両方を行います。次に、各グループを元の単位で読み取ります。つまり、元の行の平均を求めます。X[km.labels_ == c].mean(axis=0)。

challenge icon

チャレンジ

簡単

賃貸物件探しアプリは、家賃と駅までの距離に基づいて100件の物件をグループ分けします。初期コードでは元の列をクラスタリングしており、どのグループも駅から約3 kmの場所に偏っています。ドルの値がキロメートルの値を圧倒しているためです。

  1. StandardScalerで2つの列をスケーリングします。
  2. 代わりに、スケーリングした行をクラスタリングします。各グループを実際の単位で読み取るレポートはそのままにしてください。

別の都市の場合:

38 flats: $1820 a month, 0.9 km out
33 flats: $1130 a month, 4.2 km out
29 flats: $2760 a month, 1.5 km out

自分で試してみよう

import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

# 1行につき1物件:月額家賃はドル単位、駅までの距離はkm単位
flats = pd.read_csv("flats.csv")
X = flats[["rent", "station_km"]]

# これは元の列をそのまま使ってクラスタリングしている:修正する
km = KMeans(n_clusters=3, n_init=10, random_state=0)
km.fit(X)

# 各グループを実際の単位で、大きい順に報告する
sizes = pd.Series(km.labels_).value_counts()
for c in sizes.index:
    group = flats[km.labels_ == c]
    print(f"{sizes[c]} flats: ${round(group['rent'].mean())} a month, {group['station_km'].mean():.1f} km out")
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師なし学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ