ランダムフォレストが過剰適合


15

scikits-learnでRandom Forest Regressionを使用しようとしています。問題は、非常に高いテストエラーが発生していることです。

train MSE, 4.64, test MSE: 252.25.

これは私のデータがどのように見えるかです:(青:実データ、緑:予測):

フォレスト回帰のクリーンアップ

トレーニングに90%、テストに10%を使用しています。これは、いくつかのパラメーターの組み合わせを試した後に使用しているコードです。

rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1) 
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))

print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)

フィッティングを改善するための可能な戦略は何ですか?基礎となるモデルを抽出するために他にできることはありますか?同じパターンを何度も繰り返した後、モデルが新しいデータに対して非常にひどく振る舞うのは信じがたいようです。このデータに合わせようとする希望はありますか?


入力としてx軸、x <= 245のラベルとしてy軸を使用してこの周期関数をトレーニングし、x> 245をテストしていますか?それとも、あなたのプロットを誤解していますか?
ルノー

実際、x軸は観測インデックスであり、合計で300の観測値があるため、245以降、つまり、モデルの学習に使用されないテストデータ、入力特徴ベクトルは整数で構成され、形状(300,2)観測インデックスの線形関数によく似ているため、質問を複雑にしすぎないように、それに関する情報を追加しませんでした。
エリアーゼ

1
最初にデータ(およびトレンド)からサイクル(季節部分)を削除することもできます。
R.プロスト

時系列分析を検討しましたか?あなたのX軸に何があるのか​​ははっきりしていませんが、私には定期的に思えます。こちらで確認し、これが役立つかどうかをお知らせください:otexts.org/fpp/7/5
Bram Van Camp

回答:


21

間違ったツールを使用していると思います。X全体がインデックスに等しい場合、基本的にサンプリングされた関数f:RRあり、外挿しようとしています。機械学習はすべて履歴の補間に関するものであるため、この場合に壮大な失敗を記録することは驚くことではありません。

必要なのは、時系列分析(つまり、トレンドの抽出、スペクトルの分析、残りの自己回帰またはHMM処理)または物理学(つまり、そのような出力を生成するODEがあるかどうかを考え、保存された量を介してパラメーターを適合させること)です。


データから一般化可能なモデルを抽出することに関する機械学習ではありませんか?データを適切に補間する特定のセットを取得したら、たとえば相互検証を使用して、より優れた外挿/一般化プロパティを持つものを選択できます。私の理解に何か問題がありますか?
elyase

外挿は一般化とは異なります。次の実験の対象であると想像してください。画面が表示され、赤と緑のボタンがあります。最初に、画面には、他の人が画面に表示される猫、ライオン、トラの緑色のボタンを押し、次に狼と犬の赤いボタンを押して、5つのおいしいクッキーを集めた部屋のビデオが表示されます。

1
現在、画面にはボブキャットが表示されています。履歴の適切で一般化可能な補間を実行し、緑色のボタンを押すと、Cookieではなく感電が発生します。なぜこれが起こったのですか?解決策はサイクル(gggrrr)であり、動物の写真は単なる欺justに過ぎないためです。あなたはあなたの森にも同じことをしました-実際の情報を隠しながら、それをあなたのトレーニングセットの馬鹿げた複製に誘い込みました。

良い例ですが、あなたのやり方では見えません。この例では、ターゲット(gまたはr)と2つの機能(index(一時的)およびanimal)のデータがあります。このデータから、フィーチャ1または2(または両方に等しい)に多かれ少なかれ重みを付けることができる複数のモデルを適合させることができました。相互検証(十分なデータがあると仮定)は、重要度の低い機能2(動物)のモデルに到達する必要があります。私のモデルがデータを過剰適合していることがわかりますが、十分な大きさのモデル空間で、このパターンに従うモデルを抽出することができると思います(動作は変更されていないため)。
エリアーゼ

1
いや; より多くのデータを要求したとしても、実験者は動物の欺ceptionを拡大し、パターンをさらに難読化して、明白でないと判断することができます。つまり、学習では外挿を行うことはできません。定義上、トレーニングには存在しない情報が必要になるためです。この方法では、問題が内挿になるように、いくつかの仮定を適用するか追加データを収集する必要があります。

9

最大の問題は、回帰ツリー(およびランダムフォレストのようなそれらに基づくアルゴリズム)が区分的定数関数を予測し、各リーフに該当する入力に一定の値を与えることです。これは、トレーニングドメイン外で外挿する場合、トレーニングデータがあった最も近いポイントの場合と同じ値を予測するだけであることを意味します。@mbqは、一般的な機械学習手法よりも優れていると思われる時系列を学習するための特別なツールがあることは正しいです。ただし、この例ではランダムフォレストが特に悪いので、他の一般的なMLテクニックはおそらくあなたが見ているものよりもはるかに優れたパフォーマンスを発揮します。非線形カーネルを備えたSVMは、頭に浮かぶ1つのオプションです。関数は周期構造を持っているため、これはまた、周波数領域の動作を示唆しています。


AFAIK SVMには、ランダムフォレストの同じ問題があります。彼らは訓練された宇宙の外ではうまく予測していません。おそらく、ニューラルネットワークは、より良い解決策でしょう
Donbeo

データが曲線上にあり、カーネルがその曲線に適合する適切な種類のものである場合、SVMはその曲線に沿って外挿できます。データに線形トレンドがある場合、線形SVMはラインにフィットし、そのラインに沿って外挿します。より複雑なカーネルは、より複雑な動作に適合し、外挿できます。適切な種類のカーネルを持っているかどうかに依存します。これは、SVMを外挿およびTS予測に適したツールにしないが、ランダムフォレストよりも優れていることです。
ダニエルマーラー

3

これはデータのオーバーフィッティングの教科書の例です。モデルは訓練されたデータでは非常にうまく機能しますが、新しいテストデータでは崩壊します。これは、これに対処する戦略の1つです。トレーニングデータの10倍のクロス検証を行い、パラメーターを最適化します。

手順1. NM最適化を使用してMSE最小化関数を作成します。以下に例を示します。 http //glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html

ステップ2.この最小化関数内の目的は、MSEを削減することです。これを行うには、データの10分割を作成し、新しいモデルが9分割で学習され、10分割でテストされます。このプロセスを10回繰り返して、各フォールドのMSEを取得します。集約されたMSEは、目的の結果として返されます。

ステップ3. Pythonのfminが繰り返しを行います。どのハイパーパラメーターを微調整する必要があるかを確認し(n_estimators、max_featuresなど)、それらをfminに渡します。

結果は、オーバーフィッティングの可能性を減らす最高のハイパーパラメーターになります。


はい、それは過剰適合のようです(ランダムフォレスト回帰は通常そうではないため、質問です)。ここで、パラメータを変更してもRFリグレッサーではほとんど効果がないことがわかりました。現在、クロス検証では、最適化するのに十分な柔軟性のある基礎となるモデルが必要です。この種類のデータには、どの種類のMLモデル/アルゴリズムをお勧めしますか。
elyase

3

いくつかの提案:

  1. ローリングウィンドウアプローチを使用してパラメーターを調整します(を予測するためにモデルを最適化する必要があります、提供された値を予測するのではなく、時系列の値)
  2. 他のモデルを試してください(適切な機能選択と機能エンジニアリング戦略を備えたより単純なモデルでも、問題により適している可能性があります)
  3. ターゲット変数の最適な変換を学習してみてください(これも調整してください。負の線形/指数傾向があり、推定できる場合があります)
  4. おそらくスペクトル分析
  5. 最大値/最小値は、等間隔になっているようです。彼らにあなたの特徴が与えられている場所を学び(オペレータの入力なし、アルゴリズムがそれを発見してバイアスを取り除く)、これを特徴として追加します。また、機能を設計しますnearest maximum。Dunno、うまくいくかもしれないし、うまくいかないかもしれない。テストするかどうかしかわからない:)

しかし、ダニエルが彼の答えで言ったように、ランダムフォレストは、列車サンプルで観測された範囲外の値を予測することができないため、この種の問題に対して設計上機能しません。パラメーターのチューニングなどはどこにもつながりません。
ティム

1
提案#2 @ティム。また、ランダムフォレストはこのデータに対して単純には機能しませんが、巧妙な特徴抽出により機能する可能性があります。
Firebug


0

上記の投稿を読んだ後、私は別の異なる答えをしたいと思います。

ランダムフォレストなどのツリーベースのモデルの場合、トレーニングセットを超えて値を推定することはできません。だから、私はそれが過剰に適合する問題ではないと思うが、間違ったモデリング戦略だ。

それでは、時系列予測のためにツリーモデルで何ができるでしょうか?

可能な方法は、線形回帰と組み合わせることです:最初に時系列をトレンド除去します(または線形回帰でトレンドをモデリングします)、次にツリーで残差をモデリングします(残差は有界なので、ツリーモデルで処理できます)。

さらに、キュービストと呼ばれる、外挿可能な線形回帰と組み合わせたツリーモデルがあり、葉に対して線形回帰を行います。


0

グラフの範囲内で単純に予測したい場合は、データセットを分割する前に観測値をランダム化するだけで問題を解決できます。次に、示されているように、外挿から内挿の問題になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.