Twitterで面白そうな記事が流れてきたので、理論的な話の解説をしようと思います。pythonコードは元記事にあるので、そっちを使ってみてください。
面白そうな記事はこれです。無料で読める記事は3記事までらしいので、無料で読みたい記事が既にある人はリンクを踏まない方が良いかもしれません。
紹介した記事の概要
上で挙げた記事には、大体、次のようなことが書いてあります。
機械学習において、特徴量選択には主に3種類の手法があるようです。
- Filter methods
- Embeddeb methods
- Wrapepr methods
上の記事では、1.Filter methods の手法3種類と、メリット、デメリットを紹介しています。Filter methodsは、基本的に統計学の知識を使う手法で、どんな機械学習手法に対しても適用する事が出来ます。1具体的には、4種類の手法が紹介されています。
- ANOVA F-Value(分散分析)
- Variance Threshold
- Mutual information(相互情報量)
- Scikit-learn’s SelectKBest
手法の解説が一言ずつされていて、後はsklearn を使うとこんな感じに出来るよ、メリットデメリットはこんな感じだよ、という記事になっています。
最後の手法以外に対して、少し真面目な解説をするのが、この記事の趣旨です
ANOVA F-Value(分散分析のF値)
ANOVAやF値については、既に解説記事を書いているので、そちらを読んでください。
大筋としては、回帰分析を行って、特徴量に対応する回帰係数をまずは計算します。
次に、注目する特徴量の回帰係数が0だと仮定してF検定を行い、その特徴量が意味を持つか調べるという感じです。
勿論、特徴量の2乗以上の項や、交互作用項は、モデルに組み込んでやらないと調べらませんし、それらの特徴量と、答えの線形の関係を仮定した時の話なので、注意が必要です。
Variance Threshold
Variance Thresholdについて解説します。
この手法は聞いたことが無かったのですが、単純に、特徴量自身の分散と自分で決めた閾値を比べて、閾値より分散が小さかったら特徴量を捨てる、という手法です。2
真面目に考えると、次のように考える事が出来ます。
特徴量 \( \{ X_i \}_{i=1 , \cdots ,N} \)たちが0,1しか値を取らないとしましょう。特徴量で、殆ど動きが無いものは捨ててしまいたいとします。
2値を取る確率分布として、ベルヌーイ分布が良く使われます。
\begin{eqnarray}
{ \rm Bern } (p) (k) =p^k (1-p)^{1-k}
\end{eqnarray}
ただし、\( k\in \{ 0,1 \} \)です。この時、\(X_i \)の分散は以下のように書けます。
\begin{eqnarray}
Var (X_i ) =p(1-p)
\end{eqnarray}
これを使うと、9割が1[だけの特徴量3を捨てたいと思ったら、分散が\(0.09 \)以下の特徴量を捨てれば良い、という感じになります。
これはデータの取り方によって分散が小さく見えるだけ、とかがあるので注意が必要です。分散=0となっているデータだけ捨てる、とかが安全な使い方です。
Mutual information(相互情報量)
相互情報量は、ベイズ風の統計を勉強すると見たことがあるかもしれません。簡単に言うと、確率変数\( (y, X) \)がある時、同時分布\( p(y,X) \)が周辺分布の積に分解できるか ? \( p(y,X) =p(y) p(X) \)を調べる量です。違う言葉で言うと、yとXが独立か調べる量です。
答え\(y \)と1つの特徴量\(X_i \) に関係があるか、全ての特徴量に対して調べる事で、関係のなさそうな特徴量を炙り出す事が出来ます。
確率変数\( y,x \)の相互情報量\( I(x,y ) \)は以下のように定義されます。
\begin{eqnarray}
I(x,y) &=& E_{X,Y} \left[ p(x,y)\log \frac{ p(x,y) }{p(x) p(y) } \right]\\
&=& KL( p(x,y) || p(x) p(y) )
\end{eqnarray}
\( KL(p || q ) \) はKLダイバージェンスと呼ばれています。この量は、確率分布として\( p =q \)となる時にのみ0となり、それ以外は0より大きな値を取る量です。確率分布同士の距離を測るような量になっており、4 初めに書いたように、相互情報量は、特徴量と答えが独立かどうかを調べる事が出来る量になっています。
全ての特徴量に対して計算を行い、0に近い順に何個かの特徴量を捨てる、といった使い方が出来ます。
相互情報量は、確率変数として独立かどうかを調べる量なので、持っているデータが偏っていない限りは信用できる量になっています。
まとめ
- 面白そうな記事を紹介した
- 分散分析のF値を紹介した
- Variance Thresholdを紹介した
- 相互情報量を紹介した
- データ自身に統計の手法を適用するので、そうなります。
- 全く動きが無い特徴量は勿論答えに対して何も意味を持たないので、捨てましょう、という感じです
- 勿論0だけでも同じ
- 詳しい原理や計算などは解説の記事があるので読んでみてください。エントロピーからKLダイバージェンスを理解する