randomforestで高次元の変数重要度を見る #japanr lt
TRANSCRIPT
Randomforestで高次元の変数重要度を見る
Janitza,S.,Celik,E.,&Boulesteix,A.L.(2015).AcomputaAonallyfastvariableimportancetestforrandomforestsforhigh-dimensionaldata.
20161127:Japan.RLT@Yahoo!:TwiTer:@siero5335
機械学習で重要な課題といえば? 特徴量の抽出!
特にデータが高次元の場合、どれが重要な特徴量なのかわかりにくい
機械学習で重要な課題といえば? 特徴量の抽出!
特にデータが高次元の場合、どれが重要な特徴量なのかわかりにくい
特徴量抽出についての参考資料
hTp://www.slideshare.net/Keiku322/r48rtokyor hTp://www.slideshare.net/sercantahaahi/feature-selecAon-with-r-in-jp
XgboostのGBDTfeature,FeatureHashing詳細 RFのジニ係数から特徴選択
機械学習で重要な課題といえば? 特徴量の抽出!
特にデータが高次元の場合、どれが重要な特徴量なのかわかりにくい
特徴量抽出についての参考資料
RFだとGini係数あるいはpermutaAonから出す変数重要度があるが今回はpermutaAonの変数重要度に基づいた手法
hTp://www.slideshare.net/Keiku322/r48rtokyor hTp://www.slideshare.net/sercantahaahi/feature-selecAon-with-r-in-jp
XgboostのGBDTfeature,FeatureHashing詳細 RFのジニ係数から特徴選択
変数重要度の分布を計算できれば仮説検定もできるはず
Randomforestで高次元の変数重要度を見る
Janitza,S.,Celik,E.,&Boulesteix,A.L.(2015).AcomputaAonallyfastvariableimportancetestforrandomforestsforhigh-dimensionaldata.
どうやって使うの?
hTps://cran.r-project.org/web/packages/vita/index.html
randomforestとvitapackageを組み合わせて使うのが普通だが、ranger内に関数が用意されてて早くて楽なので今回はそっちを使う
どうやって使うの?rangerのすがた library(ranger)#>version0.5.0library(mlbench)
data(Sonar,package="mlbench")Sonar[,61]=as.numeric(Sonar[,61])-1Sonar<-as.data.frame(Sonar)
testRF<-ranger(Class~.,data=Sonar,mtry=5,importance="permutaAon")
どうやって使うの?rangerのすがた library(ranger)#>version0.5.0library(mlbench)
data(Sonar,package="mlbench")Sonar[,61]=as.numeric(Sonar[,61])-1Sonar<-as.data.frame(Sonar)
testRF<-ranger(Class~.,data=Sonar,mtry=5,importance="permutaAon")
importance_pvalues(testRF,method="janitza",conf.level=0.95)
importanceが信頼区間,p-value付きででてくる
どうやって使うの?caretのすがた library(ranger)library(caret)library(mlbench)
data(Sonar,package="mlbench")
train.x=data.matrix(Sonar[train.ind,1:60])train.y=Sonar[train.ind,61]
tr=trainControl(method="repeatedcv”,number=5,repeats=5)
grid=expand.grid(mtry=1:20)
set.seed(71)ranger_fit=train(train.x,train.y,method="ranger",tuneGrid=grid,trControl=tr,importance="permutaAon")
importance_pvalues(ranger_fit$finalModel,method="janitza",conf.level=0.95)
おおまかなしくみ
VIj:変数Xjの変数重要度,0以上であれば判別に寄与してる
(Xjを使うより、Xjの独立したコピーであるXj*を使ったほうが誤分類率が高い)
通常であれば下記のように、OOBから変数重要度を求める
おおまかなしくみ Hold-outなら2個,CVならk個のモデルをつくり、それぞれのモデルにおける変数重要度を求めることもできるSlを使って算出
Holdout K-foldCV
(目的変数がカテゴリの場合)
おおまかなしくみ Hold-outなら2個,CVならk個のモデルをつくり、それぞれのモデルにおける変数重要度を求めることもできるSlを使って算出
Holdout K-foldCV
(目的変数がカテゴリの場合)
今回はこっちを使う Vitapackageだとkも指定できる
おおまかなしくみ
1. 元データをランダムに半分こ
2. 下記の感じでF^0を算出する
3. p-valueを より算出
例:変数重要度が負のやつ全て
例:変数重要度が0のやつ全て
例:変数重要度が負のモノすべてに-1を掛けた値
:empiricalcumulaAvedistribuAonfuncAon
馴染み深いp-valueが出てくるのでカットオフラインがわかりやすい
どうでもいいこと
著者はメディカルインフォマティクス畑の人D論が出てるので熱心な方は以下参照(今年の?hTps://edoc.ub.uni-muenchen.de/19671/1/Janitza_Silke.pdf
EnjoyfeatureselecAon!
どうやって使うの?vitaのすがた
hTps://cran.r-project.org/web/packages/vita/index.html
randomforestとvitapackageを組み合わせて使うのが普通だが、ranger内に関数が用意されてて早くて楽なので今回はそっちを使う
Vitapackageの場合の使い方cv_vi=CVPVI(X,y,k=2,mtry=3,ntree=1000,ncores=4)cv_p=NTA(cv_vi$cv_varim)summary(cv_p,pless=0.1)
cl.rf=randomForest(X,y,mtry=3,ntree=500,importance=TRUE)pvi_p=NTA(importance(cl.rf,type=1,scale=FALSE))summary(pvi_p)
または