クラスタリング精度向上のためのデータ変換

Pythonで学ぶ教師なし学習

Benjamin Wilson

Director of Research at lateral.io

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

  • 3種類の赤ワインからの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で学ぶ教師なし学習

クラスタと分散

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平均法では、特徴量の分散 = クラスタリングへの影響度

  • StandardScalerは各特徴量を平均0、分散1になるように変換

  • 特徴量を「標準化」する

標準化od280と標準化プロリンの散布図

Pythonで学ぶ教師なし学習

scikit-learnの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は似たメソッドを持つ

  • StandardScalerfit() / transform()を使用

-KMeansfit() / predict()を使用

Pythonで学ぶ教師なし学習

StandardScaler → k-means

  • 2つのステップが必要:StandardScalerKMeans

  • 複数のステップを組み合わせるには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で学ぶ教師なし学習

scikit-learnの前処理ステップ

  • StandardScalerは「前処理」ステップ

  • MaxAbsScalerNormalizerなどの他の手法も

Pythonで学ぶ教師なし学習

練習しましょう!

Pythonで学ぶ教師なし学習

Preparing Video For Download...