ファイナンス機械学習:特徴量の重要度 練習問題 最も重要と判断されたとくちょ重要と判断された特徴量を落とし再び重要度を測定する
PCA変換した特徴量と元の特徴量を結合し、MDI ,MDA,SFIで重要度を推定器にランダムフォレストを用いて測定したものの上位を落とし、再測定する。
def EXER8_3(numDrop=3):
n_estimators=1000
cv=10
PCAthrd=0.95
from itertools import product
import pathlib
X,cont=getTestData()
PCAX=getOrthoFeats(X)
PCAX.index=X.index
trnsX=pd.concat([X, PCAX], axis=1)
testlabel='XPCARF_R'+str(numDrop)
dict0={'minWLeaf':[0.],'scoring':['accuracy'],'method':['MDI','MDA','SFI'],
'max_samples':[1.]}
jobs,out=(dict(zip(dict0,i))for i in product(*dict0.values())),[]
pdir=pathlib.Path()
kargs={'pathOut':pathlib.PurePosixPath(pdir/testlabel),
'n_estimators':n_estimators,'tag':testlabel,'cv':cv}
for job in jobs:
job['simNum']=job['method']+'_'+job['scoring']+'_'+'%.2f'%job['minWLeaf']+\
'_'+str(job['max_samples'])
kargs.update(job)
imp,oob,oos=getFeatImportances(trnsX=trnsX,cont=cont,RandomForest=True,**kargs)
imp=imp.sort_values('mean',ascending=False)
t5=imp.index[:numDrop]
XX=trnsX.drop(t5,axis=1)
imp,oob,oos=getFeatImportances(trnsX=XX,cont=cont,RandomForest=True,**kargs)
plotFeatImportance(imp=imp,oob=oob,oos=oos,**kargs)
df0=imp[['mean']]/imp['mean'].abs().sum()
df0['type']=[i[0] for i in df0.index]
df0=df0.groupby('type')['mean'].sum().to_dict()
df0.update({'oob':oob,'oos':oos});df0.update(job)
out.append(df0)
out=(pd.DataFrame(out).sort_values(['method','scoring','minWLeaf','max_samples']))
out=out[['method','scoring','minWLeaf','max_samples','I','R','N','O','oob','oos']]
outfile=str(kargs['pathOut'])+'stats.csv'
out.to_csv(outfile)
MDI
重要度が高い順に、R1,ORT4, ORT3を落とし、再度重要度を判定する。
![](https://assets.st-note.com/img/1703440348010-571QbrWyFd.png?width=1200)
結果、I8>R3>I4>I5となり、R9の重要度は落ちている。
MDA
初めのMDAで重要度が正方向に高いと推定されたI_8,R_8,I_3を落とし、再測定した。
![](https://assets.st-note.com/img/1703591637658-xSHVkVKUg2.png?width=1200)
SFI
SFIで、最初に重要度が高いと判定されたR_1, ORT_4, R_3を落として再度重要度を推定した。
![](https://assets.st-note.com/img/1703591888667-1bpH0pwKXT.png?width=1200)
SFIは、特徴量を一つづつ使用して重要度を判定するため、重要度の高い特徴量を落として再測定しても、結果は変わらない。