ぺーぱーの日々

上機嫌でいること、夢中でいることを目標に、今日も色んなことに手を出します。

MENU

どうして次元削減が必要なのか

どうやら、次元削減というのが、機械学習では重要らしい。データの前処理で。

ということで、以下の流れで、次元削減について理解してみる。

いろんな次元のグラフ

1次元

2次元

3次元

4次元

いろんな次元のグラフを眺めて

  • 1次元(数直線)、2次元(折れ線グラフ)は、なじみがある
  • 3・4次元は見たことなくて、グラフの見方がわからない・・・

次元削減とは

先ほどの感想の2番目、「高次元のグラフは、なに書いてあるかわからない」問題を解決させるためにあるのが、次元削減。

 

読んで字のごとく、「次元を削減する」。

4次元→3次元に、3次元→2次元に、2次元→1次元にすることを、次元削減という。(たぶん)

 

次元が高れば良いってわけではないってこと。人間が直感的に認識できるのは、せいぜい3次元ぐらい。

 

まあ、4D→5D→6D・・・と技術の進歩は止まらないから、今後もいろんなものが高次元化していくだろうけど、可視化の目的が「全体像を把握する」である以上、かっこつけないで、直感的に把握できる次元に落としましょう、というのが次元削減の目的。

使用するデータ

社員の通知表を想定した、3列×10行のデータフレーム

次元削減の実行

使用するアルゴリズム

  • PCA
  • SVD
  • t-SNE
  • PCA

PCAによる次元削減
  • SVD

SVDによる次元削減
  • t-SNE

     

    t-SNEによる次元削減

     

    実装したコード

  • PCA
    from sklearn.decomposition import PCA
    model_pca = PCA(n_components=2)
    vecs_list = model_pca.fit_transform(data)
    vecs_list

    import seaborn as sns
    import matplotlib.pyplot as plt
     
    X = vecs_list[:,0]
    Y = vecs_list[:,1]
     
    sns.set(font="Hiragino Maru Gothic Pro")
    plt.figure(figsize=(88))
     
    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 TruncatedSVD
    model_svd = TruncatedSVD(n_components=2)
    vecs_list = model_svd.fit_transform(data)

    import seaborn as sns
    import matplotlib.pyplot as plt
     
    X = vecs_list[:,0]
    Y = vecs_list[:,1]
     
    sns.set(font="Hiragino Maru Gothic Pro")
    plt.figure(figsize=(88))
     
    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 TSNE
    model_tsne = TSNE(n_components=2, perplexity=2)
    vecs_list = model_tsne.fit_transform(df)

    import seaborn as sns
    import matplotlib.pyplot as plt
     
    X = vecs_list[:,0]
    Y = vecs_list[:,1]
     
    sns.set(font="Hiragino Maru Gothic Pro")
    plt.figure(figsize=(88))
     
    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つ以外にも、次元削減で使えるアルゴリズムはたくさんあるので、機会があれば試してみようと思った。呼び出すモジュールが違うだけで、手順がほとんど同じなので、次元削減という堅苦しい言葉に惑わされないように恐れず実行していきたいなと思う。

参考サイト

https://analysis-navi.com/?p=3267