2023年のランダムフォレスト:パワフルな手法の最新拡張
「2023年ランダムフォレストの最新拡張:力強い手法の進化」
ランダムフォレストは長い道のりをたどってきました
機械学習のタイムラインにおいて、Breimannの画期的な論文で紹介されたランダムフォレスト(RF)は、古代の手法です。その年齢にもかかわらず、その性能には驚かされると同時に、研究の話題になっています。この記事の目的は、ランダムフォレスト手法がどれほど多目的のツールボックスになったかを強調し、汎用ランダムフォレスト(GRF)と分布型ランダムフォレスト(DRF)に焦点を当てることです。
簡単に言えば、両方の手法の基本的な考え方は、RFによって暗黙的に生成される重みを、条件付きの期待値以外の目標を推定するために使用できるということです。GRFのアイデアは、対象とする条件(例:条件付き平均、条件付き分位数、条件付き処置効果)に適応した分割基準を使用したランダムフォレストを使用することです。DRFのアイデアは、分割基準を適応させることにより、条件付き分布全体を推定することです。このオブジェクトから、さまざまなターゲットを2番目のステップで導出できます。実際には、この記事では主にDRFについて話しますが、私自身がこのメソッドによく知っているため、より使いやすいです(幅広いターゲットに対してただ1つのフォレストをフィットする必要があります)。ただし、上記の図で示されているすべての利点はGRFにも当てはまります。実際、RのDRFパッケージはGRFの専門的な実装に基づいて構築されています。また、GRFフォレストの分割基準が対象に適応されるため、DRFよりも優れたパフォーマンスを発揮することがあります。特にバイナリYの場合、probability_forests()を使用する必要があります。したがって、DRFについての話が多くなっているとはいえ、この記事全体を通してGRFを念頭に置いておくべきです。
この記事の目的は、対応するセクションへの深いリーディングへのリンクを含めた概要を提供することです。上記の図の各ポイントを時計回りに進め、対応する記事を参照し、それを少しの例で強調します。まず、以下にさらなる読み物への最も重要なリンクを簡単にまとめます:
多機能性/パフォーマンス:VoAGI記事およびオリジナル論文(DRF/GRF)
- アリエル・カッツ、H1のCEO兼共同創設者-イスラエルとガザの支援、GenosAI、トライアルイノベーション、医療分野でのAIの影響、現代医学におけるデータの役割、スタートアップのアドバイス
- 「Pythonによる3D地理空間データ統合:究極のガイド」
- あなたのラップトップでデータサイエンスのポテンシャルを引き出す
欠損値の組み込み:VoAGI記事
不確実性の測定:VoAGI記事
変数の重要度:VoAGI記事
例
X_1、X_2、X_4、…、X_10を(-1,1)の一様分布から独立して取り、X_1とX_3の間に多少の依存関係を作ります(X_3 = X_1 + 一様誤差)。その後、Yを以下のようにシミュレーションします
## Load packages and functions neededlibrary(drf)library(mice)source("drfnew_v2.R")## The function drfnew_v2.R is available below, or on ## https://github.com/JeffNaef/drfupdate## Set parametersset.seed(10)n<-1000##Simulate Data that experiences both a mean as well as sd shift# Simulate from Xx1 <- runif(n,-1,1)x2 <- runif(n,-1,1)x3 <- x1+ runif(n,-1,1)X0 <- matrix(runif(7*n,-1,1), nrow=n, ncol=7)Xfull <- cbind(x1,x2, x3, X0)colnames(Xfull)<-paste0("X", 1:10)# Simulate dependent variable YY <- as.matrix(rnorm(n,mean = 0.8*(x1 > 0), sd = 1 + 1*(x2 > 0)))##Also add MAR missing values using ampute from the mice packageX<-ampute(Xfull)$amphead(cbind(Y,X)) Y X1 X2 X3 X4 X51 -3.0327466 -0.4689827 0.06161759 0.27462737 NA -0.6244630792 1.2582824 -0.2557522 0.36972181 NA -0.04100963 0.0095180473 -0.8781940 0.1457067 -0.23343321 NA -0.64519687 -0.9454263054 3.1595623 0.8164156 0.90997600 0.69184618 -0.20573331 -0.0074042985 1.1176545 -0.5966361 NA -1.21276055 0.62845399 0.8947034226 -0.4377359 0.7967794 -0.92179989 -0.03863182 0.88271415 -0.237635732 X6 X7 X8 X9 X101 -0.9290009 0.5401628 0.39735433 -0.7434697 0.88075582 -0.2885927 0.3805251 -0.09051334 -0.7446170 0.99353113 -0.5022541 0.3009541 0.29424395 0.5554647 -0.53418004 0.7583608 -0.8506881 0.22758566 -0.1596993 -0.71619765 -0.3640422 0.8051613 -0.46714833 0.4318039 -0.86740606 -0.3577590 -0.7341207 0.85504668 -0.6933918 0.4656891
関数amputeを使用して、miceパッケージから、Missing not at Random (MAR)欠損値をXに置くことで、GRF/DRFが欠損値を処理する能力を強調しています。また、上記のプロセスでは、X_1とX_2のみがYを予測するために重要であり、他の変数は「ノイズ」変数です。このような「スパース」な設定は、実際のデータセットでは実際に一般的かもしれません。
この例では、この後使用するテストポイントを選択します:
x<-matrix(c(0.2, 0.4, runif(8,-1,1)), nrow=1, ncol=10)print(x) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8][1,] 0.2 0.4 0.7061058 0.8364877 0.2284314 0.7971179 0.78581 0.5310279 [,9] [,10][1,] -0.5067102 0.6918785
汎用性
DRFは、単純な重みの形式で条件付き分布P_{Y|X=x}を推定します:
これらの重みから、さまざまなターゲットを計算するか、条件付き分布からシミュレーションすることができます。その汎用性の良い参考資料は、元の研究論文です。そこでは、多くの例が使用され、それに対応するVoAGI記事もあります。
この例では、まずこの分布からシミュレーションを行います:
DRF<-drfCI(X=X, Y=Y, B=50,num.trees=1000, min.node.size = 5)DRFpred<-predictdrf(DRF, newdata=x)## Sample from P_{Y| X=x}Yxs<-Y[sample(1:n, size=n, replace = T, DRFpred$weights[1,])]hist(Yxs, prob=T)z<-seq(-6,7,by=0.01)d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))lines(z,d, col="darkred" )
プロットは、真の密度と重ね合わせた条件付き分布からの近似的なドローを示しています。これを使用して、条件付き期待値と条件付き(0.05, 0.95)分位点をxで推定します:
# Calculate quantile prediction as weighted quantiles from Yqx <- quantile(Yxs, probs = c(0.05,0.95))# Calculate conditional mean predictionmux <- mean(Yxs)# True quantilesq1<-qnorm(0.05, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))q2<-qnorm(0.95, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))mu<-0.8 * (x[1] > 0)hist(Yxs, prob=T)z<-seq(-6,7,by=0.01)d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))lines(z,d, col="darkred" )abline(v=q1,col="darkred" )abline(v=q2, col="darkred" )abline(v=qx[1], col="darkblue")abline(v=qx[2], col="darkblue")abline(v=mu, col="darkred")abline(v=mux, col="darkblue")
同様に、GRFでは多くのターゲットを計算できますが、この場合は各ターゲットごとに異なるフォレストを適合させる必要があります。特に、条件付き期待値にはregression_forest()、パーセンタイルにはquantile_forest()を使用します。
GRFは、DRFと同様に、多変量ターゲットを扱うことはできません。
パフォーマンス
パワフルな新しい(非パラメトリックな)方法、例えばニューラルネットワークなどのツリーベースの手法が、常に表形式のデータで競合他社を打ち負かすことができます。たとえば、この魅力的な論文や、この分類のRFの強みに関する古い論文などをご覧ください。
公正を期すために、パラメータ調整を行うと、XGboostなどのブーステッドツリー手法がクラシックな予測(条件付き期待値の推定に相当)においてはリードを取ることがよくあります。それにもかかわらず、RFの堅牢なパフォーマンスは、調整なしでも顕著です。さらに、Random Forestのパフォーマンスを改善するための研究も行われており、hedged Random Forestアプローチなどがあります。
欠損値の組み込み
「属性の欠損組み込み基準」(MIA)は、欠損データを扱うためのツリーベースの手法を可能にする非常にシンプルで非常にパワフルなアイデアです。これはGRF Rパッケージに実装されており、DRFでも利用可能です。詳細については、この論文や、このVoAGIの記事でも説明されています。このコンセプトは非常にシンプルですが、実際の応用では非常にうまく機能します。上記の例では、DRFは訓練データの大規模なMAR欠損を問題なく処理しましたX(!)
不確実性の尺度
統計学者として、私は(分布の)点推定だけでなく、私のパラメータの推定の不確実性を測定する尺度も必要です(たとえ「パラメータ」が私の分布そのものであっても)。DRF/GRFに簡単な追加のサブサンプリングを組み込むことで、大きなサンプルサイズの場合に合理的な不確実性の量子化が可能になります。DRFの場合の理論は、この研究論文で導出されていますが、このVoAGIの記事でも説明しています。GRFには、この理論が元の論文に含まれています。
上記の例に適用しています:
# 不確実性を計算する
alpha<-0.05
B<-length(DRFpred$weightsb)
qxb<-matrix(NaN, nrow=B, ncol=2)
muxb<-matrix(NaN, nrow=B, ncol=1)
for (b in 1:B){
Yxsb<-Y[sample(1:n, size=n, replace = T, DRFpred$weightsb[[b]][1,])]
qxb[b,] <- quantile(Yxsb, probs = c(0.05,0.95))
muxb[b] <- mean(Yxsb)
}
CI.lower.q1 <- qx[1] - qnorm(1-alpha/2)*sqrt(var(qxb[,1]))
CI.upper.q1 <- qx[1] + qnorm(1-alpha/2)*sqrt(var(qxb[,1]))
CI.lower.q2 <- qx[2] - qnorm(1-alpha/2)*sqrt(var(qxb[,2]))
CI.upper.q2 <- qx[2] + qnorm(1-alpha/2)*sqrt(var(qxb[,2]))
CI.lower.mu <- mux - qnorm(1-alpha/2)*sqrt(var(muxb))
CI.upper.mu <- mux + qnorm(1-alpha/2)*sqrt(var(muxb))
hist(Yxs, prob=T)
z<-seq(-6,7,by=0.01)
d<-dnorm(z, mean=0.8 * (x[1] > 0), sd=(1+(x[2] > 0)))
lines(z,d, col="darkred" )
abline(v=q1,col="darkred" )
abline(v=q2, col="darkred" )
abline(v=qx[1], col="darkblue")
abline(v=qx[2], col="darkblue")
abline(v=mu, col="darkred")
abline(v=mux, col="darkblue")
abline(v=CI.lower.q1, col="darkblue", lty=2)
abline(v=CI.upper.q1, col="darkblue", lty=2)
abline(v=CI.lower.q2, col="darkblue", lty=2)
abline(v=CI.upper.q2, col="darkblue", lty=2)
abline(v=CI.lower.mu, col="darkblue", lty=2)
abline(v=CI.upper.mu, col="darkblue", lty=2)
上記のコードから分かるように、私たちは基本的に毎回計測を行うことができるBの部分木を持っています。B個の平均値と分位数のサンプルから、分散を計算し、図の破線で表される(漸近的な)信頼区間を得るために正規分布の近似を使用することができます。また、これらのすべてはX(!)における欠損値の問題があるにもかかわらず実行可能です。
変数の重要度
ランダムフォレストの最終的な重要なアスペクトは、効率的に計算される変数の重要度の指標です。伝統的な指標は多少特異的ですが、伝統
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles
- 「では、なぜ私たちはレコメンデーションシステムを気にする必要があるのでしょうか…?フィーチャリング:トンプソンサンプリングへの優しい紹介」
- 「VSCodeをDatabricksと統合して、データエンジニアリングのパイプラインとモデルを構築および実行する」
- 「LLMsを活用してリコメンデーション知識グラフを完成させる」
- 「ChatGPT Visionをデータ分析に活用する5つの方法」
- データから真実を解読する:大きな言語モデルが真実をモデル化するためにパーソナを使用する方法
- リフレックスを使って、純粋なPythonでChatGPTに似たWebアプリを作成する
- OpenAI API — イントロ&ChatGPTの背後にあるモデルの11の実践的な実装例