More Related Content Similar to Feature Selection with R / in JP (20) Feature Selection with R / in JP5. 5
自己紹介
• トルコ、アンカラ出身(1981年)
• B.Sc. & M.Sc.:Middle East Technical University(電子電気工学部)
• Ph.D.:東京工業大学( 2011年)
• 現在はソーシャルゲーム運営会社でデータアナリス
• 2003年~2012年「MatlabとC++」
• 2012年以降「R」
• 現在の業務で「R」を日次的に使用しているが、データ取得と加工は主な目的
• Excelは知らないし、じゃっかん苦手でもある
9. 9
特徴選択の種類 (2/3): ラッパー法
• 複数の特徴部分集合で分類器を学習及びテストし、最適な部分集合を探す
• テストの際に交差検定を使用する場合が多い
• 特徴選択する際に使用される分類器と、選択後に使用される分類器が同じなので、
過剰適合が起こってもおかしくない
11. 11
関連Rパッケージ
1) randomForest( 予測精度と、 ジニ不純度の平均低下による特徴重要度)
2) party(↑の予測精度の平均低下の計り方を変えたアルゴリズム)
3) Boruta(Random Forestを使用したラッパー法)
4) penalizedSVM(SVMのペナルティ関数を変えることが可能に)
5) FSelector(Wekaを元にし、複数の特徴選択法を提供)
6) CORElearn(複数の特徴選択法、10個以上のRelief系アルゴリズム)
7) ClustOfVar(特徴をグループ化し、グループ代表のみを選ぶことを可能に)
12. 12
1 2 3 P y
1
2
N
2 6 8 P y
5
6
7
9
8
N
決定木の学習用
決定木のテスト用
※Out-Of-Bag(OOB)
※ブートストラップ・
サンプルの約3分の1
1
3
2
5
第1決定木 第2決定木 第ntree決定木
(randomForestパッケージの場合)
ブートストラップ・サンプル
mtry数の特徴量が適当に
サンプルされる (mtry < P)
(randomForestパッケージの場合)
特徴行列:
{(x1, y1), (x2, y2), …, (xN, yN)}
where xn ∈ RP & yn ∈ {0, 1}
1 2 5 7 y
2
4
4
7
7 8 9 P y
1
3
7
9
Random Forestの基礎から
18. 18
my.seed <- 12345
set.seed(my.seed) # seedを設定
n_var <- 20 # 特徴量の数
n_obs <- 6000 # 観測データの数
Sigma <- matrix(0, nrow = n_var, ncol = n_var) # 適当な分散共分散行列を作る
# 最初の5個の特徴量の間の相関を高めにし、他の特徴量の間で相関がないことにする
Sigma[1:5, 1:5] <- 0.9
diag(Sigma) <- 1
A <- mvrnorm(n = n_obs, rep(0, n_var), Sigma) # 多次元正規分布に従って適当な値を作る
eps <- rnorm(n_obs, mean = 0, sd = 0.5) # 正規分布に従って1次元の適当な値を作る
# 各説明変数と目的変数の関係の重みを決める
w <- rep(0, n_var); w[c(3, 5, 10, 15, 16, 20)] <- c(5, 5, 2, -5, -5, -4)
# 0/1の目的変数を作る
Y <- A %*% w + eps
Y <- ifelse(Y < 0, 0, 1)
my.data <- as.data.frame(cbind(A, Y))
names(my.data)[1:5] <- paste("CORR_VAR", 1:5, sep = "")
names(my.data)[n_var+1] <- "LABEL"
my.data$LABEL <- factor(my.data$LABEL)
# データに目的変数と関係のない説明変数を加える
my.data$MANY_CTG <- factor( rep(1:30, each = n_obs/30) )
my.data$FEWER_CTG <- factor( rep(1:10, each = n_obs/10) )
require(randomForest)
シミュレーション
19. 19
# Random Forestを作る
set.seed(my.seed)
model <- randomForest(LABEL ~ ., data = my.data, ntree = 51, importance = T, scale = F)
# 特徴量の重要度を確認する
require(data.table)
# 1: 予測精度の平均低下による重要度
imp1 <- importance(model, type = 1)[, 1]
imp1 <- data.table(Feature = names(imp1), RealWeight = c(w, 0, 0), MeanDecreaseAccuracy = imp1)
imp1 <- imp1[order(-MeanDecreaseAccuracy)]
# 2: ジニ不純度の平均低下による重要度
imp2 <- importance(model, type = 2)[, 1]
imp2 <- data.table(Feature = names(imp2), RealWeight = c(w, 0, 0), MeanDecreaseGini = imp2)
imp2 <- imp2[order(-MeanDecreaseGini)]
require(randomForest)
シミュレーション
20. 20
予測精度の平均低下による重要度:
相関の高い説明変数が目的変数と
関係がなくても重要に見えてしまう
require(randomForest)
importance(model, type = 1)
Feature RealWeight MeanDecreaseAccuracy
1: V15 -5 30.9710765
2: V16 -5 25.1993199
3: V20 -4 20.5737122
4: CORR_VAR5 5 17.9920379
5: CORR_VAR3 5 16.6779248
6: CORR_VAR4 0 12.0445416
7: CORR_VAR1 0 9.6217582
8: CORR_VAR2 0 8.9002274
9: V10 2 6.8783696
10: V18 0 2.6212311
11: V8 0 2.3560231
12: V19 0 1.9204587
13: V6 0 1.2884192
14: V17 0 0.7733706
15: V12 0 0.7540735
16: FEWER_CTG 0 0.4667292
17: V7 0 0.3346755
18: V13 0 -0.1365008
19: V14 0 -0.1676043
20: MANY_CTG 0 -0.2604303
21: V9 0 -0.8486139
22: V11 0 -0.9929386
22. 22
require(party)
アイディア→
※“We want to measure the association between xp (説明変数) and y (目的変数)given
the correlation structure between xp and the other predictor variables inherent in the data set.
To meet this aim, Strobl et al. (2008) suggest a conditional permutation scheme, where xp
is permuted only within groups of observations (他の説明変数)with Z = z in order to
preserve the correlation structure between xp and the other predictor variables”
A toolbox for recursive partitioning
※Strobl et al., 2009, “Party on! A New, Conditional Variable Importance Measure for Random Forests Available in the party Package”
model <- cforest(formula, data = list(), control = cforest_unbiased())
varimp(model, conditional = TRUE) # 予測精度の平均低下
使い方→
23. 23
my.seed <- 12345
set.seed(my.seed) # seedを設定
n_var <- 20 # 特徴量の数
n_obs <- 480 # 観測データの数
Sigma <- matrix(0, nrow = n_var, ncol = n_var) # 適当な分散共分散行列を作る
# 最初の5個の特徴量の間の相関を高めにし、他の特徴量の間で相関がないことにする
Sigma[1:5, 1:5] <- 0.9
diag(Sigma) <- 1
A <- mvrnorm(n = n_obs, rep(0, n_var), Sigma) # 多次元正規分布に従って適当な値を作る
eps <- rnorm(n_obs, mean = 0, sd = 0.5) # 正規分布に従って1次元の適当な値を作る
# 各説明変数と目的変数の関係の重みを決める
w <- rep(0, n_var); w[c(3, 5, 10, 15, 16, 20)] <- c(5, 5, 2, -5, -5, -4)
# 0か1の目的変数を作る
Y <- A %*% w + eps
Y <- ifelse(Y < 0, 0, 1)
my.data <- as.data.frame(cbind(A, Y))
names(my.data)[1:5] <- paste("CORR_VAR", 1:5, sep = "")
names(my.data)[n_var+1] <- "LABEL"
my.data$LABEL <- factor(my.data$LABEL)
# データに目的変数と関係のない説明変数を加える
my.data$MANY_CTG <- factor( rep(1:30, each = n_obs/30) )
my.data$FEWER_CTG <- factor( rep(1:10, each = n_obs/10) )
require(party)
シミュレーション → この部分を飛ばす
24. 24
# Random Forestを作る
set.seed(my.seed)
model <- cforest(LABEL ~ ., data = my.data, control = cforest_unbiased(mtry = 5, ntree = 51))
# [1] 条件付き重要度
imp <- varimp(model, conditional = T)
fweights.party <- data.table(Feature = names(imp),
RealWeight = c(w, 0, 0),
ConditionalImp = imp)
fweights.party <- fweights.party[order(-ConditionalImp)]
fweights.party$ConditionalImp <- as.integer(fweights.party$ConditionalImp*100000)
fweights.party
# [2] 予測精度の平均低下による重要度
imp.rf <- varimp(model, conditional = F)
fweights.rf <- data.table(Feature = names(imp.rf),
RealWeight = c(w, 0, 0),
MeanDecreaseAccuracy = imp.rf)
fweights.rf <- fweights.rf[order(-MeanDecreaseAccuracy)]
fweights.rf$MeanDecreaseAccuracy <- as.integer(fweights.rf$MeanDecreaseAccuracy*100000)
fweights.rf
require(party)
シミュレーション → この部分を飛ばす
25. 25
require(party)
Feature RealWeight ConditionalImp
1: V15 -5 1359
2: V16 -5 1314
3: CORR_VAR3 5 701
4: V20 -4 311
5: V10 2 245
6: CORR_VAR5 5 245
7: CORR_VAR2 0 144
8: V6 0 44
9: V7 0 11
10: V9 0 11
11: CORR_VAR4 0 11
12: MANY_CTG 0 0
13: V8 0 0
14: V14 0 0
15: CORR_VAR1 0 -11
16: V18 0 -11
17: V19 0 -22
18: FEWER_CTG 0 -22
19: V12 0 -22
20: V13 0 -33
21: V17 0 -33
22: V11 0 -55
観測データの数は480、 ConditionalImpとMeanDecreaseAccuracyは
実際の値の10^6倍(結果を読みやすくするため)
Feature RealWeight MeanDecreaseAccuracy
1: CORR_VAR5 5 5436
2: V15 -5 3821
3: CORR_VAR3 5 3765
4: CORR_VAR4 0 3241
5: V16 -5 2662
6: CORR_VAR1 0 2495
7: V20 -4 1470
8: CORR_VAR2 0 779
9: V10 2 289
10: V17 0 245
11: V8 0 111
12: V7 0 100
13: MANY_CTG 0 89
14: V14 0 89
15: V18 0 55
16: V11 0 11
17: FEWER_CTG 0 -22
18: V9 0 -33
19: V12 0 -100
20: V6 0 -111
21: V13 0 -167
22: V19 0 -167
partyの重要度計算が時間かかるが、結果の改善が期待できる!
27. 27
require(Boruta)
A wrapper algorithm around Random Forests
1) 全ての特徴量のコピーをダミー特徴量として元データに加える(cbind)
2) ダミー特徴量だけをシャッフル
3) 拡張されたデータでRandom Forestを実行し、特徴毎に「予測精度の低下 」のZスコアを
算出
4) 重要度を決定前の特徴量とMZSAの「両側検定」を行う
5) MZSAより低く、その差の有意差がある特徴量を「重要ではない」と決め、データからは
ずす
6) MZSAより高くて、その差の有意差がある特徴を「重要ではある」と決める
7) ダミー特徴量をはずす
8) ステップ1に戻り、全ての特徴量を「重要ではない・ある」と決めるまでこのプロセスを
繰り返す
28. 28
require(Boruta)
A wrapper algorithm around Random Forests
1) 全ての特徴量のコピーをダミー特徴量として元データに加える(cbind)
2) ダミー特徴量だけをシャッフル
3) 拡張されたデータでRandom Forestを実行し、特徴毎に「予測精度の低下 」のZスコアを
算出
4) 重要度を決定前の特徴量とMZSAの「両側検定」を行う
5) MZSAより低く、その差の有意差がある特徴量を「重要ではない」と決め、データからは
ずす
6) MZSAより高くて、その差の有意差がある特徴を「重要ではある」と決める
7) ダミー特徴量をはずす
8) ステップ1に戻り、全ての特徴量を「重要ではない・ある」と決めるまでこのプロセスを
繰り返す
29. 29
require(penalizedSVM)
Feature selection by using various penalty functions with SVM
SVMと言えば、L2-normですが、このパッケージで以下の4つのペナルテー関数の使用も可
能に
1) L1-norm
2) Smoothly Clipped Absolute Deviation (SCAD)
3) Elastic net (L1 & L2-norm)
4) ELastic SCAD (SCAD + L1 norm)
閉形式解がない!
と言うのは、解決が時間が
かかる。しかもかなりかかる
svm.fs(学習データ, クラスラベル, fs.method = c("scad", "1norm",
"scad+L2", "DrHSVM"), …)
主な関数
30. 30
require(FSelector)
関数 説明 数式
相関駆動
特徴選択
linear.correlation ピアソンの相関係数
rank.correlation スピアマンの順位相関係数
情報量駆動
特徴選択
information.gain 情報量の増分
gain.ratio 情報量の割合
symmetrical.uncertainty 対称な不確実性
Selecting attributes with various methods
)特徴H()クラスH(
)特徴、クラスH()特徴H()クラスH(
2
)特徴H(
)特徴、クラスH()特徴H()クラスH(
)特徴、クラスH()特徴H()クラスH(
22
サンプル数
1n
)()(
))((
yyxx
yyxx
nn
nn
31. 31
関数 説明 補足
chi.squared カイ二乗フィルター
カテゴリデータ用ですが、
連続変数の離散化の上、使用可能。
教師あり離散化のため、discretizationパッケージ
がおすすめ。
oneR 1つのルールアルゴリズム
relief
ReliefF、特徴の重要度を
推定するアルゴリズム
Kira and Rendell 1992、元々二項分類のみ
RELIEF、RELIEFF、RRELIEFF等の延長版が多い
・・・
require(FSelector)
Selecting attributes with various methods
32. 32
require(CORElearn)
Classification, regression, feature evaluation and ordinal evaluation
このパッケージの強みでもあるReliefアルゴリズム
F1 F2 F3 y
1 0.6 0.2 0.7 1
2 0.7 0.2 0.7 1
3 0.8 0.3 0.8 1
4 0.1 0.2 0.2 0
5 0.3 0.1 0.1 0
6 0.4 0.2 0.8 0
3 0.8 0.3 0.8 1
6 0.4 0.2 0.8 0
nearMiss
2 0.7 0.2 0.7 1
nearHit
(1)
適当に1つの特徴
ベクトルを選択
(2)
選択された特徴
ベクトルに同じクラスと
反対クラスのメンバーの
中で一番近いベクトルを
2つを見つける
二項分類用の
学習データ
(3)特徴重みを以下の通りに更新する
Wn=W(n-1) – (xn - nearHit)2 + (xn - nearMiss)2
(4)ステップ1に戻り、このサイクルをN回繰り返す(n:サイクル数)
33. 33
F1 F2 F3
0.15 0.01 0.10
特徴重要度を表す
Wベクトル
Relief
F1 F2 F3 y
1 0.6 0.2 0.7 1
2 0.7 0.2 0.7 1
3 0.8 0.3 0.8 1
4 0.1 0.2 0.2 0
5 0.3 0.1 0.1 0
6 0.4 0.2 0.8 0
二項分類用の
学習データ
require(CORElearn)
Classification, regression, feature evaluation and ordinal evaluation
このパッケージの強みでもあるReliefアルゴリズム
34. 34
attrEval(formula, data, estimator, costMatrix = NULL, ...)
1 Relief
2 ReliefFbestK
3 ReliefKukar
4 ReliefFexpC
5 ReliefFavgC
6 ReliefFpe
7 ReliefFpa
8 ReliefFsmp
9 ReliefFmerit
10 ReliefFdistance
11 ReliefFsqrDistance
12 MyopicReliefF
13 DKM
14 DKMcost
15 EqualDKM
16 UniformDKM
17 InfGain
18 GainRatioCost
19 GainRatio
20 MDL
21 Gini
22 EqualGini
23 ImpurityEuclid
24 ImpurityHellinger
25 UniformGini
26 Accuracy
27 MDLsmp
28 UniformInf
29 UniformAccuracy
30 EqualInf
31 EqualHellinger
32 DistHellinger
33 DistAUC
34 DistAngle
35 DistEuclid
36 EqualHellinger
37 DistHellinger
38 DistAUC
39 DistAngle
40 DistEuclid
分類だけで40個の
特徴重要度推定法
(estimator)がある。
その中、Relief系が10個以上!
require(CORElearn)
38. 38
参考文献
1) Random Forestで計算できる特徴量の重要度、URL(最終アクセス:2014/3/25):
http://alfredplpl.hatenablog.com/entry/2013/12/24/225420
2) パッケージユーザーのための機械学習(5):ランダムフォレスト、URL(最終アクセス:2014/3/25):
http://tjo.hatenablog.com/entry/2013/12/24/190000
3) Stop using bivariate correlations for variable selection、URL(最終アクセス:2014/3/25):
http://jacobsimmering.com/2014/03/20/BivariateCorrelations.html
4) Strobl et al., 2009, “Party on! A New, Conditional Variable Importance Measure for Random Forests Available in the
party Package”
5) Becker et al., 2009, “penalizedSVM: a R-package for feature selection SVM classification”
6) 「森の神様」写真 、URL(最終アクセス:2014/3/28): http://morisong04.exblog.jp/i22/
7) Twitter icon by Nikola Lazarevic、URL(最終アクセス:2014/3/25): http://webexpedition18.com/work/extreme-grunge-
social-media-garments-icons-pack/