feature neutralizationとは?
複数の特徴量を用いてモデルを作成する時に、ある特徴量とターゲットの相関が高い場合、モデルはその特徴量を使い予測値を計算する傾向があります。
しかし、それら少数の特徴量だけに強く影響を受けていると、その特徴量の分布が少し変わると予測性能もその分悪化するため、頑健なモデルとは言えません。
特に金融データなどの時系列データで、各時刻における値が独立ではない変数を扱う場合、連続して予測精度が悪いと損益のグラフが安定しない(一時的に大きく凹む)ため、運用者にとっては非常にストレスになる&最悪破産する可能性もあるため、好ましくありません。
最近、個人的に興味を持っているNumeraiという金融データを扱うコンペでは以上のことから、モデルに入力する変数とターゲットの相関値の最大値(feature exposure)をモニターして、なるべく小さくする取り組みが行われています。それを達成する一つの手段がfeature neutralizationと呼ばれています。
実装はNumeraiのForumで下記のように紹介されています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import pandas as pd import numpy as np def neutralize_series(series, by, proportion=1.0): scores = series.values.reshape(-1, 1) exposures = by.values.reshape(-1, 1) # this line makes series neutral to a constant column so that it's centered and for sure gets corr 0 with exposures exposures = np.hstack( (exposures, np.array([np.mean(series)] * len(exposures)).reshape(-1, 1))) correction = proportion * (exposures.dot( np.linalg.lstsq(exposures, scores)[0])) corrected_scores = scores - correction neutralized = pd.Series(corrected_scores.ravel(), index=series.index) return neutralized |
実装だけだと何をやっているのか理解が難しいですが、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となります。これにより、この特徴量を使用しても、モデルが積極的に使わなくなること(feature exposureが下がること)が期待できます。
ここで、変換後のベクトルともとのベクトルの相関係数は、ベクトルaとターゲットベクトルの角度θを用いてsinθで計算されます。

これは、ターゲットと変換前の特徴量の相関係数の絶対値が小さければ、変換後の特徴量と元々の特徴量の相関が高くなることを意味しています。
また、変換後に元々の特徴量との相関が無くなる場合、予測力も低下することが予想されるため、neutralする具合を調整するための係数proportion(0~1)が使用されています(1の時直交)

この値を小さくするとa’ベクトルの大きさが小さくなるため、残差ベクトルと特徴量ベクトルの角度が小さくなります。つまり、ターゲットに対する予測成分をどの程度残すかを調整することができるようです。
まとめ
Numeraiではターゲットに対する前処理としてNeutralizeするほか、予測値の多様性を重視していることから、参加者の多くが使用しているexampleモデルの出力に対して、自分の出力値をneutralizeするというテクニックも使用されているようです。
kaggleでもアンサンブルで多様性を上げる必要があるシチュエーションなどで、少しneutralizeしてみるというのもアリかもしれません。