# set up functionality for modelling down the track
library(xgboost) # extreme gradient boosting
library(nnet) # neural network
library(ranger) # for random forests
library(rpart) # for demo single tree
library(rpart.plot)
library(viridis) # for palette of colours
library(grid) # for annotations
# sample data - training set
set.seed(134) # for reproducibility
x <- 1:100 + rnorm(100)
y <- 3 + 0.3 * x + rnorm(100)
# extrapolation / test set, has historical data plus some more extreme values
extrap <- data.frame(x = c(x, 1:5 * 10 + 100))
mod_lm <- lm(y ~ x)
mod_nn <- nnet(y ~ x, size = 8, linout = TRUE)
# XG boost. This is a bit more complicated as we need to know how many rounds
# of trees to use. Best to use cross-validation to estimate this. Note -
# I use a maximum depth of 2for the trees which I identified by trial and error
# with different values of max.depth and cross-validation, not shown
xg_params <- list(objective = "reg:linear", max.depth = 2)
mod_cv <- xgb.cv(label = y, params = xg_params, data = as.matrix(x), nrounds = 40, nfold = 10) # choose nrounds that gives best value of root mean square error on the training set
best_nrounds <- which(mod_cv$test.rmse.mean == min(mod_cv$test.rmse.mean))
mod_xg <- xgboost(label = y, params = xg_params, data = as.matrix(x), nrounds = best_nrounds)
mod_rf <- ranger(y ~ x)
p <- function(title) {
plot(x, y, xlim = c(0, 150), ylim = c(0, 50), pch = 19, cex = 0.6,
main = title, xlab = "", ylab = "", font.main = 1)
grid()
}
predshape <- 1
par(mfrow = c(2, 2), bty = "l", mar = c(7, 4, 4, 2) + 0.1)
p("Linear regression")
points(extrap$x, predict(mod_lm, newdata = extrap), col = "red", pch = predshape)
p("Neural network")
points(extrap$x, predict(mod_nn, newdata = extrap), col = "blue", pch = predshape)
p("Extreme gradient boosting")
points(extrap$x, predict(mod_xg, newdata = as.matrix(extrap)), col = "darkgreen", pch = predshape)
p("Random forest")
fc_rf <- predict(mod_rf, data = extrap)
points(extrap$x, fc_rf$predictions, col = "plum3", pch = predshape)
grid.text(0.5, 0.54, gp = gpar(col = "steelblue"),
label = "Tree-based learning methods (like xgboost and random forests)\nhave a particular challenge with out-of-sample extrapolation.")
grid.text(0.5, 0.04, gp = gpar(col = "steelblue"),
label = "In all the above plots, the black points are the original training data,\nand coloured circles are predictions.")
しかし、線形モデルがy=ax+bの式で外挿すると完璧に外挿されるのに、フォレストが最も近い既知の隣人を用いて外挿すると何もしないのはなぜでしょう?どちらのアルゴリズムも存在する権利があります。
何も数えてない、例と記事の束を見せただけ。LRが完璧にこなそうが、そうでなかろうが、何の違いがあるのだろう。ポイントは、RFは建設的に、決して、どんな状況でも外挿できないのに対し、LRは比較と明確化のために与えられていることです。
私はそれを聞いているのであって、なぜそれが間違っていると思うのかの例を理解することを求めただけです :)
それが「記事」とどう関係するんだ?冗談だろう?MLだけでニュートンみたいなミンスキーが大失敗した例を出したのに、ハブラ上のゴミとかRのスクリプト(読み方:自分でアルゴリズムを作っていない、パラメータをじゃらじゃらつけただけ)の話かよ。
C++でforestを自作していれば、MLPのような「外挿」を行うことが推測できたのですが、Rでは......。ゴッドスピード(Godspeed)...
私はミンスキーもポジャースキーも知らないし、あなたのチャートに何が書かれているのか理解できないのですが、RFに0から10または100までのターゲットを設定し、意図的に100を超える答えを与える必要があり、RFは100だけを与える必要があります。
ここで筆者は、記事の中で
私はRをよく理解していませんが、100から150までのRFは、他のモデルのように適切な結果を予測するはずでしたが、そうはならなかったということだけは理解しています。
そうではないはずです。Knn (準最適分類器) のような、より粗い最近接点の局所補間を行うことができます。RFツリーのベースローテーションを知らないだけで、「サイコロ状」に見えるのですね。
前の投稿で、スクリーンショット付きのコードを追加したのですが、何が「間違って」いるのでしょうか?
フォレストアルゴリズムでは,木は1つの特徴で直交するように点を分割します,基底を回転させるとMLPと同じになります,これについては,フォレストコードに入って修正するか,自分でフォレストを書く必要があります)))
すみません、それは違う種類の森でしょう。 クラシックバージョンのことです。
そこにあるものを掴んで、何かを書こうとしている......。
その結果、古典的なRFは、外挿の仕方を知らない。
MLには "古典 "はなく、うまくいくもの、問題を解決するものがあるのです。他人のアルゴリズムを多様に使いこなすのは、コドベースやマーケットの全ての指標のコードを理解するのと同じで、合理的ではありません...。
MLには基本的なヒューリスティックはあまり多くありません。あなたが「指から転がり落ちる」ように、夜中に目が覚めて30分ほどC++ gradient bustingを記憶からタイプするだけで、(冗談です)思ったほど難しくありませんし、ホバー記事からアルゴリズムの100500バリエーションを自分で生成することができるように、手動でマスターしなければならないでしょう。
おほほ...。
トレーダー博士は 2回繰り返した、あなたにも繰り返す、3回目、彼らは神と言い、汚れた者は3回聞きたがる、それは何か意味がある、神秘的な文脈で......。
物理的な時間との関係でPRINCIPLE SPACEの新しい点は点の床の外に厳密には位置されない、時間は時間である、チップであなたはチップである、よく例えば運動量またはスペクトルと直線的に物理的な時間を関連付けない。外挿された」点は、特徴空間の内側と外側のどこにでも存在することになる。
そうではなく、古代の構造は、ターゲットのすべての学習値によってramifyされると、モデルはramifyされたものを厳密に出力し、新しい値を出力することはできないと言っただけです... 少なくとも、例の記事にはそう書いてありますね。私の例を作ってお見せします :)あなたが訓練で100の目標値の限界にあった場合、それは100以上を与えることができない出力...100以上のすべての値は、シート100に入るので、それは純粋に物理的に100以上の値を持つシートを持っていないです。
トレーニング時にターゲットの限界値が100だった場合、100以上の値はすべて100シートに入るため、100以上の出力はできない......というわけです。
ノーマライゼーションは理由があって発明されたものです。
は理解できるとして、原理的な問題は、木の機能についての問題です。どのように正規化しても、新しいデータの異常値は、ツリーは外挿せず、自分の知っている極値を与えることになります。だから、ツリーのデータを正規化する必要はないのです。
は理解できるとして、原理的な問題は、木の機能についての問題です。どのように正規化しても、新しいデータの異常値は、ツリーは外挿せず、自分の知っている極値を与えることになります。だから、ツリーのデータを正規化する必要はまったくないんです。
は理解できるとして、原理的な問題は、木の機能についての問題です。どのように正規化しても、新しいデータの異常値は、ツリーは外挿せず、自分の知っている極値を与えることになります。だから、ツリーのデータを正規化する必要はまったくないんです。
この場合の解決策は簡単で、フィードバックを利用することだと思います。
謹んで申し上げます。
この場合の解決策は簡単で、フィードバックを導入することだと思います。
謹んで申し上げます。
私は1つ持っています :) 外挿ができなくても、できても気にしません...モデルは既知のセットで予測します...ただ一般的な教育のためです
libにモデル誤差があり、セットが小さいほど誤差が小さくなる、rpicolはまだ理解できていない