Numerai

feature neutralizationによる正則化

feature neutralizationとは?

複数の特徴量を用いてモデルを作成する時に、ある特徴量とターゲットの相関が高い場合、モデルはその特徴量を使い予測値を計算する傾向があります。

しかし、それら少数の特徴量だけに強く影響を受けていると、その特徴量の分布が少し変わると予測性能もその分悪化するため、頑健なモデルとは言えません。

特に金融データなどの時系列データで、各時刻における値が独立ではない変数を扱う場合、連続して予測精度が悪いと損益のグラフが安定しない(一時的に大きく凹む)ため、運用者にとっては非常にストレスになる&最悪破産する可能性もあるため、好ましくありません。

最近、個人的に興味を持っているNumeraiという金融データを扱うコンペでは以上のことから、モデルに入力する変数とターゲットの相関値の最大値(feature exposure)をモニターして、なるべく小さくする取り組みが行われています。それを達成する一つの手段をfeature neutralizationと言います。

まずは実装はNumeraiのForumで下記のように紹介されています。

 

実装を見ただけだと何をやっているのか想像するのが難しいですが、feature neutralizationはneutralにしたい変数を、ターゲットに対して直交化して置き換える処理をしています。単純に二次元だと下記のように表されます。(ベクトル表記が正しくないですが許してください…)

ここでは、直交化したい変数aの数値ベクトルをターゲットのベクトルに対して直交化する場合を考えています。

変数aのターゲットに対する直交成分は、図のような残差ベクトルrで表されます。この時のa’ベクトルは、ターゲットを変数とした変数aに対する線形回帰の予測値(aをターゲットに投影した変数)のベクトルとなります。この時、a’ベクトルは定数βを用いて下記のように表すことができて、最小二乗法でβの値が求まります。

$$\begin{aligned}a’=\beta _{0}t\\
f=\left( a-a’\right) ^{2}\\
=\left( a-\beta _{0}t\right)^{2} \\
\dfrac{\partial f}{\partial \beta _{0}}=2\left( a-\beta _{0}t\right) \left( -t\right) \\
\beta _{0}=\dfrac{a\cdot t}{t\cdot t}\end{aligned}$$
ここで、残差ベクトルrとターゲットベクトルtの内積を計算すると

$$\begin{aligned}r\cdot t=a\cdot t-a’\cdot t\\
=a\cdot t-\dfrac{a\cdot t}{t\cdot t}t\cdot t\\
=0\end{aligned}$$

より、neutralにした残差ベクトルとターゲットは直交していることがわかります。また、相関係数はcosθと等しいため、直交していれば相関係数の値が0となります。これにより、この特徴量を入力しても、モデルが積極的に使わなくなること(Max feature exposureが下がること)が期待できます。

ここで、変換後のベクトルともとのベクトルの相関係数は、ベクトルaとターゲットベクトルの角度θを用いてsinθで計算されます。

これは、ターゲットと変換前の特徴量の相関係数の絶対値が小さければ、変換後の特徴量と元々の特徴量の相関が高くなることを意味しています。

yaaku

複雑だ…

また、変換後に元々の特徴量との相関が無くなる場合、予測力も低下することが予想されるため、neutralする具合を調整するための係数proportion(0~1)が使用されています(1の時直交)

この値を小さくするとa’ベクトルの大きさが小さくなるため、残差ベクトルと特徴量ベクトルの角度が小さくなります。つまり、変換前後の相関係数を上げることができます。

まとめ

Numeraiではターゲットに対する前処理としてNeutralizeするほか、予測値の多様性を重視していることから、参加者の多くが使用しているexampleモデルの出力に対して、自分の出力値をneutralizeするというテクニックも使用されているようです。

kaggleでもアンサンブルで多様性を上げる必要があるシチュエーションなどで、少しneutralizeしてみるというのもアリかもしれませんね。