どうやら、次元削減というのが、機械学習では重要らしい。データの前処理で。
ということで、以下の流れで、次元削減について理解してみる。
いろんな次元のグラフ
いろんな次元のグラフを眺めて
- 1次元(数直線)、2次元(折れ線グラフ)は、なじみがある
- 3・4次元は見たことなくて、グラフの見方がわからない・・・
次元削減とは
先ほどの感想の2番目、「高次元のグラフは、なに書いてあるかわからない」問題を解決させるためにあるのが、次元削減。
読んで字のごとく、「次元を削減する」。
4次元→3次元に、3次元→2次元に、2次元→1次元にすることを、次元削減という。(たぶん)
次元が高れば良いってわけではないってこと。人間が直感的に認識できるのは、せいぜい3次元ぐらい。
まあ、4D→5D→6D・・・と技術の進歩は止まらないから、今後もいろんなものが高次元化していくだろうけど、可視化の目的が「全体像を把握する」である以上、かっこつけないで、直感的に把握できる次元に落としましょう、というのが次元削減の目的。
使用するデータ
社員の通知表を想定した、3列×10行のデータフレーム
次元削減の実行
使用するアルゴリズム
- PCA
- SVD
- t-SNE
- PCA
- SVD
- t-SNE
実装したコード
- PCA
from sklearn.decomposition import PCAmodel_pca = PCA(n_components=2)vecs_list = model_pca.fit_transform(data)vecs_list
import matplotlib.pyplot as pltX = vecs_list[:,0]Y = vecs_list[:,1]plt.figure(figsize=(8, 8))sns.scatterplot(x=X,y=Y)for i,(x_name,y_name) in enumerate(zip(X,Y)):plt.annotate(df.index[i],(x_name,y_name))plt.show() - SVD
from sklearn.decomposition import TruncatedSVDmodel_svd = TruncatedSVD(n_components=2)vecs_list = model_svd.fit_transform(data)
import matplotlib.pyplot as pltX = vecs_list[:,0]Y = vecs_list[:,1]plt.figure(figsize=(8, 8))sns.scatterplot(x=X,y=Y)for i,(x_name,y_name) in enumerate(zip(X,Y)):plt.annotate(df.index[i],(x_name,y_name))plt.show() - t-SNE
from sklearn.manifold import TSNEmodel_tsne = TSNE(n_components=2, perplexity=2)vecs_list = model_tsne.fit_transform(df)
import matplotlib.pyplot as pltX = vecs_list[:,0]Y = vecs_list[:,1]plt.figure(figsize=(8, 8))sns.scatterplot(x=X,y=Y)for i,(x_name,y_name) in enumerate(zip(X,Y)):plt.annotate(df.index[i],(x_name,y_name))plt.show()
結果からわかること
- PCAとSVDは、若干似ている
- t-SNEは、ほぼ直線上に並んでいる
まとめ
今回実行した3つ以外にも、次元削減で使えるアルゴリズムはたくさんあるので、機会があれば試してみようと思った。呼び出すモジュールが違うだけで、手順がほとんど同じなので、次元削減という堅苦しい言葉に惑わされないように恐れず実行していきたいなと思う。