より良いクラスタリングのための特徴量変換

Pythonで学ぶ教師なし学習

Benjamin Wilson

Director of Research at lateral.io

ピエモンテのワイン・データセット

  • 3種の赤ワイン(Barolo、Grignolino、Barbera)から178サンプル

  • 特徴量は化学組成(例: アルコール度数)

  • 「色の濃さ」などの視覚特性

1 出典: https://archive.ics.uci.edu/ml/datasets/Wine
Pythonで学ぶ教師なし学習

ワインのクラスタリング

from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
labels = model.fit_predict(samples)
Pythonで学ぶ教師なし学習

クラスタ vs. 品種

df = pd.DataFrame({'labels': labels, 
                       'varieties': varieties})
ct = pd.crosstab(df['labels'], df['varieties'])

print(ct)
varieties  Barbera  Barolo  Grignolino
labels                                
0               29      13          20
1                0      46           1
2               19       0          50
Pythonで学ぶ教師なし学習

特徴量の分散

  • ワインの特徴量は分散が大きく異なります!

  • 特徴量の分散は値のばらつきを示します

feature     variance
alcohol         0.65
malic_acid      1.24
...
od280           0.50
proline     99166.71

od280 変数と malic_acid 変数の散布図

Pythonで学ぶ教師なし学習

特徴量の分散

  • ワインの特徴量は分散が大きく異なります!

  • 特徴量の分散は値のばらつきを示します

feature     variance
alcohol         0.65
malic_acid      1.24
...
od280           0.50
proline     99166.71

od280 変数と観測番号の散布図

Pythonで学ぶ教師なし学習

StandardScaler

  • k-means では、特徴量の分散=その影響度

  • StandardScaler は各特徴量を平均0・分散1に変換します

  • これを「標準化」と呼びます

標準化後の od280 と標準化後の proline の散布図

Pythonで学ぶ教師なし学習

sklearn の StandardScaler

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaler.fit(samples) StandardScaler(copy=True, with_mean=True, with_std=True)
samples_scaled = scaler.transform(samples)
Pythonで学ぶ教師なし学習

似たメソッド

  • StandardScalerKMeans は似たメソッドを持ちます

  • StandardScaler には fit() / transform() を使います

  • KMeans には fit() / predict() を使います

Pythonで学ぶ教師なし学習

StandardScaler の後に KMeans

  • 手順は2つ: StandardScaler の後に KMeans

  • 複数手順は sklearn のパイプラインで結合

  • データは各手順へ順に渡ります

Pythonで学ぶ教師なし学習

パイプラインで複数手順を結合

from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
scaler = StandardScaler()
kmeans = KMeans(n_clusters=3)

from sklearn.pipeline import make_pipeline
pipeline = make_pipeline(scaler, kmeans)
pipeline.fit(samples)
Pipeline(steps=...)
labels = pipeline.predict(samples)
Pythonで学ぶ教師なし学習

標準化でクラスタリングが向上

【標準化あり】

varieties  Barbera  Barolo  Grignolino
labels                                
0                0      59           3
1               48       0           3
2                0       0          65

【標準化なし(悪い結果)】

varieties  Barbera  Barolo  Grignolino
labels                                
0               29      13          20
1                0      46           1
2               19       0          50
Pythonで学ぶ教師なし学習

sklearn の前処理ステップ

  • StandardScaler は前処理ステップ

  • MaxAbsScalerNormalizer も例です

Pythonで学ぶ教師なし学習

Passons à la pratique !

Pythonで学ぶ教師なし学習

Preparing Video For Download...