SVDによる次元圧縮の効果を見てみる
SVD入門
SVDについてはwikipediaやteramonagi大先生のRcppEigen & singular value decompositionを参照していただきたく思います。
今回やっていることを手順ごとに簡単に書くと、
1.行列XをX=UΣV^Tと分解
2.情報量の多い上位k個の特異値を用いk列の正規直交ベクトルV_kを得る
3.XV_kを計算することで情報量を圧縮した空間に元々の行列XをX_kに写像する
情報が落ちるというマイナス面はあるのですが、ノイズ軽減、計算時間削減などの効果もあります。
今回はディスプレイ広告をクリックするか否かを広告の情報などから学習するモデルの構築をSVDを使った例として挙げています。
といっても、ノイズの多いスパースなデータをSVDで圧縮してC-SVM(ソフトマージンSVM)にかけるだけの簡単なお仕事です。
今考えると発生させたデータはスパースなのでLanczos法などを用いる方が合理的だったかもしれません。。
以下pythonのコードを記載します。
コード
SVDで圧縮しない場合、まともな結果が出てきませんので試しにやってみてください。
※発生したデータによってはSVDの段階でエラーが発生する場合があります。その場合は再度実行し、それでもエラーが出る場合はrandom seedの値を変更して再実行してください。
参考
上で記載したSVD(特異値分解)やSVMなどがわかりやすく書いてありますので以下の書籍ご参考にされると良いと思います。
まとめ
例で発生させたデータが汚いのでSVDによる効果が見えやすいのではないかと思います。
ただ、SVDはデータを一箇所に集める必要があり分散処理には向かないという欠点があります。しかし、他の手法と比較しても効果の高さは実証されており、次元圧縮の有効な手段であることには変わりありません。
SVDの有効性に関しては
Scalable Supervised Dimensionality Reduction Using Clusteringを参照してください。
今回は横着してSVDやSVMの説明は外部に譲ってしまいましたが、
次回以降余裕があれば詳細な説明も記載していこうと思います。
追記
SVMかける前に正規化した方がいいですね。。。初歩的な事忘れてました。。。