アセットマネージャーのためのファイナンス機械学習:特徴量の重要度分析 アンサンブル学習を用いたMDI

平均不純度減少量MDI

サイズ$${N}$$の特徴量が$${F}$$個あるとし、$${\{X_f\},f=1,\dots F}$$で表し、ラベルを$${y_i,i=1,\dots,N}$$と表す。
 決定木の分類(回帰)アルゴリズムは、各ノード$${t}$$で、ある特徴量$${X_f}$$を選び、閾値$${\tau}$$以下の$${X_f}$$に対応しているノード上のラベルを右に、それ以外を左に分割する。この右と左のサンプルについて、その不純度をラベル$${y}$$の分布のエントロピーやGini不純度で評価する。サンプルが一種類のラベルのみを持つ場合、純度は高く、各ラベルの分布が一様分布な場合、純度は最も低くなる。
 この分類の結果として獲得する情報利得を、不純度の減少と定義すれば、ノード$${t}$$における分離前のラベルの不純度を$${i[t]}$$、左サンプルのラベルの不純度を$${i[t^l]}$$、右サンプルのラベルの不純度を$${i[t^r]}$$、以下の式で情報利得を表せる。
$${\Delta g[t,f]=\displaystyle{i[t]-\frac{N_t^l}{N_t}i[t^l] - \frac{N_t^r}{N_t}i[t^r]}}$$
ここで、$${N_t}$$は分割前のノード$${t}$$にあるデータ数、$${N_t^l}$$はノード$${t}$$で左に振り分けられたデータ数、$${N_t^r}$$はノード$${t}$$で右に振り分けられたデータ数である。
 分類アルゴリズムでは、ノード毎に、$${\{X_f\},f=1,\dots F}$$のそれぞれについてのこの情報利得$${\Delta g[t,f],f=1\dots N}$$を評価し、各特徴量に対する$${\tau_f}$$を決め、最大の$${\Delta g[t,f],f=1\dots N}$$を得る特徴量を使用する。
 これを使えば、情報量の重要度は、その特徴量が選択された全てのノードにの情報利得$${\Delta g[t,f]}$$の荷重和で与えられる。全特徴量の重要度の総和は$${1}$$に正規化されており、全ての特徴量が等しく(非)情報的である場合の重要度の値は$${\frac{1}{F}}$$となる。
 決定木やランダムフォレストでこの重要度測定法を適用する場合は、max_features=1の設定が必要である。
 スニペット6.2で与えられているMDIの実装と、バギングを用いた決定木でのアンサンプルの実装は、ファイナンス機械学習のスニペットと同じである。

def getFeatImpMDI(fit,featNames):
    # in-sample measurement
    df0={i:tree.feature_importances_ for i,tree
         in enumerate(fit.estimators_)}
    df0=pd.DataFrame.from_dict(df0,orient='index')
    df0.columns=featNames
    df0=df0.replace(0,np.nan) # b/c max_features=1
    imp=(pd.concat({'mean':df0.mean(),
                    'std':df0.std()*df0.shape[0]**-0.5},
                   axis=1))
    imp/=imp['mean'].sum()
    return imp

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import BaggingClassifier
X,y=getTestData(40,5,30,10000,sigmaStd=.1)
clf=DecisionTreeClassifier(criterion='entropy',max_features=1,
                               class_weight='balanced',
                               min_weight_fraction_leaf=0)
clf=BaggingClassifier(estimator=clf,n_estimators=1000,
                          max_features=1.,max_samples=1.,
                          oob_score=False,n_jobs=n_jobs)
fit=clf.fit(X,y)
imp=featImpMDI(fit,featNames=X.columns)

MDIは、特徴量の重要度を荷重和で得る計算方法により、分布に対する誤りを持つかもしれない強い仮定を必要とせず、ツリーベイスの分類器は帰無仮説や対立仮説も必要としない。
 アンサンブル学習を使うことにより、決定木の数を増やすことで、分散を減少させ、偽陽性の確率を減らすことができる。
 しかしながら、代替効果による推定の強固性、またインサンプルで計算される値であるため、アウトサンプルでも同じ結果が得られるとは限らない。

いいなと思ったら応援しよう!