みなさん、こんにちは
JMPジャパンのテスター、小野祐介です。
k分割検証を使用すると、予測値が非常にうるさくなることがあります。以下のスクリーンショットをご覧ください。これは、1つのX変数を持つモデルの予測値のプロットです。5分割検証が使用されます。

予測値は、以下のように簡単に計算することをお勧めします。
(0 + :Name( "y Predictor FoldA==1" ) + :Name( "y Predictor FoldA==2" ) +
:Name( "y Predictor FoldA==3" ) + :Name( "y Predictor FoldA==4" ) +
:Name( "y Predictor FoldA==5" )) / 5
現在の予測式は以下の通りです。
If( :N Val > 0,
(0 + :Name( "FoldA==1" ) * :Name( "y Predictor FoldA==1" ) + :Name( "FoldA==2" )
* :Name( "y Predictor FoldA==2" ) + :Name( "FoldA==3" ) *
:Name( "y Predictor FoldA==3" ) + :Name( "FoldA==4" ) *
:Name( "y Predictor FoldA==4" ) + :Name( "FoldA==5" ) *
:Name( "y Predictor FoldA==5" )) / :N Val,
(0 + (1 - :Name( "FoldA==1" )) * :Name( "y Predictor FoldA==1" ) + (1 -
:Name( "FoldA==2" )) * :Name( "y Predictor FoldA==2" ) + (1 -
:Name( "FoldA==3" )) * :Name( "y Predictor FoldA==3" ) + (1 -
:Name( "FoldA==4" )) * :Name( "y Predictor FoldA==4" ) + (1 -
:Name( "FoldA==5" )) * :Name( "y Predictor FoldA==5" )) / :N Trn
);
ご意見をお聞かせください。
この現象を再現する手順
(1) 以下のスクリプトを実行して、サンプルデータセットを作成します。
Names Default To Here(1);
Random Reset(111111111);
n = 10000;
x = J(n, 1, Random Uniform(-10, 10));
y = Sin(x) + J(n, 1, Random Normal());
As Table(x||y,<<COLUMN names=""></COLUMN>
(2) 選択する [アドイン] > [XGBoost] > [K折りたたみ柱を作る] 。
2-1。「1」を入力 [作成するK折りカラムの数] 。
2-2。「y」を指定 [Y、応答] 。
2-3。クリック [行く] 。
(3) 以下のスクリプトを実行します。
XGBoost(
Y( :y ), X( :x ),
Validation( :FoldA ),
Fit( max_depth( 3 ), alpha( 10 ), lambda( 10 ), iterations( 50 ) ),
);
(4) 選択する [予測式を保存] 「Model 1」のアウトラインの赤い三角形のメニューで。
(5) 以下のスクリプトを実行して、保存された予測値を確認します。
Graph Builder(
Size( 1209, 478 ),
Show Control Panel( 0 ),
Variables( X( :x ), Y( :y Predictor ) ),
Elements( Line( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "x", ScaleBox,
{Format( "Fixed Dec", 12, 1 ), Min( -3 ), Max( 3 ), Inc( 1 ),
Minor Ticks( 1 )}
)
)
);
(6) 以下のスクリプトを実行して、私の提案のプロットを確認してください。
New Column( "My Suggestion",
Formula(
(:Name( "y Predictor FoldA==1" ) +
:Name( "y Predictor FoldA==2" ) +
:Name( "y Predictor FoldA==3" ) +
:Name( "y Predictor FoldA==4" ) +
:Name( "y Predictor FoldA==5" )) / 5
)
);
Graph Builder(
Size( 1209, 478 ),
Show Control Panel( 0 ),
Variables( X( :x ), Y( :My Suggestion ) ),
Elements( Line( X, Y, Legend( 5 ) ) ),
SendToReport(
Dispatch( {}, "x", ScaleBox,
{Format( "Fixed Dec", 12, 1 ), Min( -3 ), Max( 3 ), Inc( 1 ),
Minor Ticks( 1 )}
)
)
);
添付のデータテーブルには、これらの結果があります。プロットを表示するには、テーブルスクリプトを実行してください。
よろしくお願いします。
これらは、祐介に尋ねる良い質問です。 プロセス全体を2つの主要なステップに分割する場合、最初に、1つ以上の妥当なXGBoostモデルを決定します。 このため、k分割交差検証または同様のものが非常に重要です。 2つ目は予測を行うことです。これを現在のトレーニングデータと新しいテストデータの予測に分けてみましょう。 トレーニングデータの予測では、同じデータでトレーニングされた任意のモデルを使用すると、一般に過剰適合で非現実的に優れた予測が得られるため、範囲外予測が最も理にかなっています。 新しいテストデータの場合、提案したとおり、データを確認していないすべてのモデルからの予測を平均化することは適切です。 (実際には、アドインはYが欠落しているすべての行に対して既にこれを行っています。)相互検証によって決定されたパラメーターを使用して、検証なしで完全なデータに対して後続の最終的な近似を実行することもできます。 私の経験では、平均化k倍(「バギング」)からの予測と完全データフィットからの予測は非常に似ている傾向がありますが、平均化することもできます。たとえば、0.5 *(バギングk倍予測)+ 0.5 *(完全なデータフィットからの予測)。 k分割モデルの近似の中で「最良」を見つけようとすることは、試してみる価値があるとは思いません。これらは操作上同等であり、そのような選択では過剰適合のリスクがあるからです。
お返事ありがとうございます、ラス。
JMPのXGBoostによるこれらの範囲外予測は、モデルの評価、異常値の検出、およびアンサンブルモデルの作成に使用できることを理解しました。
これらは、k交差検証を使用するときに最終的な予測モデルを作成するいくつかの方法だと思います。
- すべてのデータに対して選択した調整パラメーターを使用してモデルを再フィットします。(<これはあなたのアドバイスです。)
- 平均kモデル。(<これは私の提案です。)
- k個のモデルの中で「最良の」モデルのみを使用します。
最終的な予測モデルを取得するには、通常、最初の方法が2番目および3番目の方法よりも優れていると思いますか?
質問と、JSLでそれを再現する方法についての非常に良い説明をありがとうございました。 JMPの他の予測モデリングプラットフォームと比較して予測値を計算する際のアドインの動作の重要な違いに直面しました。 アドインからの予測は「範囲外」です。つまり、各予測値は、その観測を除外するモデルフィットからのみ計算されます。
例として基本的な5分割を取り上げ、データの最初の行が分割3に割り当てられていると想定します。 アドインは5つのモデルに適合し、各フォールドアウトを順番に保持しますが、その最初の行の予測値は、フォールド3を除く3番目の適合のみに基づいています。 同様のロジックがすべての行に使用されます。 なぜこれを行うのですか?いくつかの理由:
1。範囲外予測は、モデルが将来の目に見えないデータに対してどのように実行されるかを現実的に評価します。 実際、「検証」というラベルの付いたすべての出力統計およびグラフィックは、範囲外予測に基づいています。 お気づきのとおり、これらの予測の変動性は、「インフォールド」データで計算された予測よりもはるかに大きくなる可能性があります。つまり、同じデータがトレーニングと予測に使用される場合です。
2。範囲外予測列は、トレーニングセット全体でモデルが引き起こした可能性のある外れ値とエラーを探すための優れた方法です。 Kフォールドは、各観測が正確に1回だけ実行されるという点で優れているため、すべての行に対してフォールド外予測が行われます。
3。フォールドオブフォールド予測列を使用して、他の優れたモデルから作成された同様の列をアンサンブルできます。 これは、単純な平均化によって、または「スタック」と呼ばれることが多い手法で、第2レベルのモデルの新しい予測子としてフォールドオブフォールド列を使用することによって実行できます。 第2レベルのモデルは通常、第1レベルのモデルよりも単純です。たとえば、一般化回帰のなげなわモデルや、より浅い別のXGBoostモデルです。 スタックされたアンサンブルモデルは、第1レベルのどのモデルよりも予測性能が優れている傾向があります。
提案する簡単なトレーニングベースの予測を取得するには、検証列を指定せずに新しいXGBoostモデルを近似するのが1つの良い方法です。 別の関連する方法は、データテーブルのコピーを作成し、すべてのY値を欠損値に設定して、元のデータに連結することです。 この場合、Yが欠落している行の予測は、すべての近似モデルにわたる予測の平均であり、「バギング」と呼ばれる手法です。
最後に、表示する複雑な式はすべてのケースをカバーした結果であることを述べておきたいと思います。 たとえば、元のデータの行にYがない場合、そのすべてのモデルに対してバギングされた予測を使用します。