0
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

自動車の燃費を予測してみた。【signate練習問題】その3

Last updated at Posted at 2022-10-12

 こちらの記事をご覧いただきありがとうございます。
 ↓の続きです。

 前回の簡単なまとめをしておきます。

  • kmeansを試したらカテゴリ変数が使えなかったのであまり有意義な感じがしなかった。
  • Gower距離行列に変換してからkmeansを試した。
  • サンプルをザックリ分けるとcylindersで分かれる。もう少し分けるとoriginで分かれる。

 前回はkmeansでいろいろしたので、今回はkmeansとは違うクラスタリング手法を試します。

ward法

 ward法とは、ザックリ言えばクラスタごとに分けるときにクラスタ間の距離(類似度と言えるかもしれない)を測ってくれます。よくデンドログラムと一緒に用いられます。
 こういうのは見たほうが早いと思うので、さっそく試します。

前処理

 前処理の手法はkmeansの時と同じです。
 欠損値処理 -> 標準化 -> Gower距離行列に変換 -> ward法 の順で進めます。Gower距離行列への変換まで前回行っているので、それをそのまま使用します。

モデルで学習

 sklearnにもward法とデンドログラムは実装されていますが、微妙に使い勝手が悪い(というより僕がちゃんと使い方を調べていないだけな気がする)ので、scipyを使います。

ward法とデンドログラム
# fclusterは後で使います。
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
# デンドログラムの作成
result = linkage(df_train_gw, method='ward')
dendrogram(result)
plt.show()

なんか警告が出た
デンドログラム.png

 デンドログラムを書くことに成功しましたが、警告も出てきました。
 警告を要約すると、君が入れたデータって凝縮されていない距離行列じゃね?ってことらしい。確かに、Gower距離行列に変換したデータなのでおっしゃる通りでございます。何か良くないのか?と思って調べると、linkageは凝縮された距離行列を想定して設計されているのでただの距離行列をそのまま使うのが良くないらしいです。
 距離行列は対称性がある+自分との距離が0の情報も入っているので、確かに情報の半分以上が無駄だよなーという想定がありましたが、確信があるわけでもないので距離行列の凝縮についてさらに調べました。そこで以下のサイトが見つかりました。

 詳しくはサイト内を見て欲しいのですが、要するに距離行列のいらないところ(対称にある情報と自分との距離の情報)を削って1次元に変換することができるらしいです。この変換をすればデンドログラムに利用できるとかなんとか。この表現方式を「condensed distance matrix」と呼ぶらしいです。和訳すると「凝縮距離行列」です。言われてみれば確かに、さっきの警告文の中にもuncondensed distance matrixって書いてありますね。
 なんのこっちゃって思った人も、もう少し先で図解しますのでぜひそこまでご覧ください。
 この凝縮距離行列に変換してからもう一度デンドログラムを試みます。まずは凝縮距離行列に変換します。

凝縮距離行列に変換
from scipy.spatial.distance import squareform
# 距離行列を凝縮距離行列に変換
df_train_gw_1d = squareform(df_train_gw)
print(df_train_gw_1d)

それっぽいものが生成された
凝縮距離行列.png

 Gower距離行列をまっすぐに伸ばしたようなものが生成されました。変換前と比較します。

変換前
凝縮する前と後.png

変換後
凝縮距離行列.png

 囲った部分が共通になっていることがわかります。このあたりで凝縮の仕方が分かりました。

こういうことらしい
凝縮の仕方.png

 黄色の部分が対称の情報または自分との距離(0)で不要な情報です。これをなかったことにして、赤の矢印に沿って情報を1次元に直しています。無駄な情報がなくなりました。メモリにやさしいですね。

 凝縮距離行列に変換したところで、もう一度デンドログラム生成を試みます。
 ※コードは省略します。

うまくいっているっぽい
デンドログラム1d.png

 警告が出なくなりましたので、うまくいっていそうです。一応、凝縮距離行列に変換していない時のデンドログラムと比較します。

←凝縮前 凝縮後→

デンドログラム凝縮前.pngデンドログラム1d.png

 ぱっと見はそんなに違いもないのか…?と思いましたが、よく見ると細かいところで結構違いますね。一番違うのが、縦軸のスケールでしょうか。結果にかなり差が出るので、手法をうっかり間違えると誤解になってしまいますね。

 最初に見たらわかるって言っておきながらここまでデンドログラムの説明をまるでしていなかったのでここで説明します。
 トーナメント表みたいな感じになっていますが、一番下にはサンプルのデータ点がひとつづつ並んでいます。トーナメント表を下から進んでいくと別のデータ点にぶつかりますが、ぶつかったらそのデータ点同士は似ていると判断できます。
 トーナメント表を上から見れば最初に2つに分かれますが、全てのデータ点を2グループに分けるならこう分けるという主張をしています。ザックリオレンジと緑のグループは似ているということです。
 またトーナメント表の縦棒の長さにも意味があり、他のデータ点とぶつかるまでの縦棒が短いほどよく似ていることを表します。オレンジと緑のグループがぶつかるまでに縦棒が結構長いので、2つのグループはあまり似ておらず、結構な違いがあることがわかります。

 さて、グループが何を基準に分かれているか確認します。手法はだいたいkmeansと同じです。
 まずはward法を基準にクラスタ分けをします。

ward法でクラスター分け
# fclusterでクラスタ分け。tはデンドログラムの縦軸と同じ。
result = linkage(df_train_gw_1d, method='ward')
cluster = fcluster(result, t=2.5, criterion='distance')
df_train_cy_ye['cluster'] = cluster

各データ点が2つに分かれる
デンドログラムでクラスタ分け.png

 クラスタ分けに成功したので、あとはkmeans法と同様に散布図や棒グラフを作成して違いを比べます。
 一番違いが分かりやすかったやつを載せます。

cylindersとクラスタ分け
cylinders_dendrogram2.png

 はい。cylindersの違いでクラスタが分かれています。kmeans法のときと同じですね。
 ということはデンドログラムでもクラスタ数を3にするとcylindersの違いで分かれてくれるのでしょうか?と思ったので試します。
※過程を省略します。

cylindersと3つのクラスタ分け
cylinders_dendrogram3.png

 はい。予想通りですね。クラスタ分けとcylindersが一致しています。kmeans法の時は一部混ざっていてここまできれいに分かれていませんでした。ward法ではcylindersでキッチリ分かれています。
 ほんじゃ、kmeansがoriginで分け始めたように、クラスタ数増やしたら今度はoriginを基準にして別れるんか?と思ったので試します。
 結論を申し上げますと、kmeans法とward法でほぼほぼ同じ結果になりました。ward法でクラスタを5つに分けた時の結果を出します。

originと5つのクラスタ分け
origin_dendrogram5.png

 このグラフはkmeans法でクラスタ分けしたときとだいたい同じです。同じような分け方になるんやなーって思いました。

※今回のデータで行った場合にほぼほぼ同じ結果になったというだけで、kmeans法とward法がほぼほぼ同じものという主張ではありません。データが変われば違う結果を出してくれることもあるでしょう。

次回に続きます。

 今回はさらに次元削減とクラスタ分けの組み合わせまでやりたかったですが、警告の処理で思ったより長くなってしまったのでここまでにします。次回は次元削減します。その次に回帰予測します。
 …Qiita書くのって思ったより大変ですね。なるべく早めに次回以降を書きます。
→書きました。↓からぜひご覧ください。

0
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?