2018-07-09こしあんTweetPocketscikit-learnのPCA(主成分分析)にはexplained_variance_ratio_という、次元を削減したことでどの程度分散(データを説明できる度合い)が落ちたのかを簡単に確認できる値があります。Kernel-PCAではカーネルトリックにより、特徴量の空間が変わってしまうので、explained_variance_ratio_というパラメーターは存在しません。説明分散比はPCA.explained_variance_ratio_で簡単に求めることができますが、どのような計算をしているか確認するためにNumpyで書いてみます。Irisデータセットを使います。#この2つが一緒になっていることを確認する主成分分析で2次元に削減します。axis=0)))で計算できます。次元単位で分散比を求めたい場合は外側のsumを外してください。これはsklearnのPCA組み込みのexplained_variance_ratio_と一致します。0.9776317750248034ね?一致してますよね。これがexplained_variance_ratio_の中身です。ところが、このexplained_variance_ratioはPCAだけだとうまくいくのですが、Kernel-PCAで非線形のカーネルを使う場合(例:rbfカーネル)は特徴量の空間が変わってしまうので、良い評価尺度とはいえません。そこで、PCAとKernel-PCA両方で使える分散比の評価尺度を定義します。sklearn.metrics.explained_variance_scoreを使うと、y_trueとy_predを代入することで説明分散比を計算してくれます。ここで、y_predにはPCA(またはKernelPCA)で変換した行列を逆変換したものを代入します。sklearnではinverse_transformという関数で逆変換ができます(これはPCA,KernelPCA両方あります)。主成分分析の変換は非可逆なので、transformで一度分散が落ちてしまうと、inverse_transformで元の次元に戻そうが分散が落ちた状態で返ってくるというわけです。これを説明分散比の代用とします。0.9326484048695863ただし、これはPCA.explained_variance_ratio_とは異なります。explained_variance_ratio_は逆変換したもので比較していないからです。変換→逆変換と2回分変換しているので、主成分分析の場合おそらくexplained_variance_scoreのほうがexplained_variance_ratio_よりも低くなるはずです。explained_variance_scoreの意義とは、カーネルトリックを使った場合でも主成分分析と同一の尺度で説明分散比を求めることができるということにあります。ちなみに主成分分析で変換した結果をプロットすると次のようになります。Irisの場合は決定境界は線形関数で表さそうなので、主成分分析がとてもよく機能している例です。同様にIrisをRBFカーネルで2次元にしてみます。イメージ的にはサポートベクターマシンのRBFカーネルとほぼ同じです。gammaというハイパーパラメータがありますが、説明分散比が高くなるようにチューニングします。kpca.inverse_transform(X_kpca)))上が主成分分析のexplained_variance_ratio_と同じ方法で計算した結果、下がexplained_variance_scoreで計算した結果です。0.7846466165602104明らかに値が変わっています。上の値から見ると92%も分散が落ちているように見えますが、これは特徴量の空間が変わったためで、X_kpcaとXを同一の分散で比較できなくなったためです。92%も分散が落ちていないのはプロットしてみればわかります。円形状になってしまったのは、ガウスカーネルの性質によるものです。主成分分析で92%も分散が落ちてしまったらほぼランダムに近い状態になるはずですが、円形状ではあるもののクラス(この場合はアヤメの品種)単位で似たような場所にあることが確認できます。主成分分析と同じイメージで92%も分散が落ちたとは言えません。KernelPCAの場合は下のexplained_variance_scoreの78%を見ましょう。PCAのではexplained_variance_scoreは93%でしたので、Irisで2次元に落として可視化する場合はKernelPCAよりもPCAのほうが適切ということがわかります。Irisの各パラメーターがそれぞれ線形寄りの決定境界を持っているためそれはそうですね。Kernel-PCAの次元単位の分散比KernelPCAにおいて次元単位で分散比を見たい場合(つまりどの軸がより多く分散を説明できているか)があると思います。その場合はexplained_variance_ratioのアプローチを使ってOKです。axis=0))print(kpca_var_vec)なぜOKかというと、分子も分母も同一のX_kpcaという同一の空間を用いているためです。X_kpcaとXのように異なる空間で分散を比較してはダメですよというだけです。0.21066874]プロット見ればわかるように第1軸(横軸)のほうがより多く分散を説明できていますね。まとめKernelPCAに限らずとも、「次元削減アルゴリズムでどれがいい?」となったときにexplained_variance_scoreを共通の尺度として比較するという方法は有効だと思われます。Commentコメントをキャンセルメールアドレスが公開されることはありません。