リーフの数を減らすために、パーティションプラットフォームの分割数にペナルティを追加しますか?私は最近、パーティションプラットフォームで多くの時間を費やしており、現在、分析を自動化する方法を探しています。
私の問題はこれです:一般的に私はデータセット50/50トレーニング/検証を分割し、検証RSquareを最大化する「実行」を押しています。 しかし、これにより、実際に信頼できるよりも多くの分割数を持つモデルが作成されることがよくあります。たとえば、ここでは、検証RSquare 0.288に到達するために5つの分割を作成しますが、2つの分割を使用するだけで、ほぼ同等に0.27の適合が得られます。

その結果、私は通常、モデル項の数が許容できるほど少ない許容可能な良好な検証RSquareを取得するために、常に手動で分割を削除する必要があります。
JMPにペナルティを適用するように依頼し、分割数に基づいてモデル選択基準にペナルティを課す、ある種の「正規化された」検証RSquareを作成する方法はありますか? たとえば、「正則化された」検証RSquareは、[Validation RSquare] -0.05 * [NSplits]のようになります。 または、正則化するためのより良い方法があるかもしれません(たとえば、絶対分散の5%ではなく、残差分散の少なくとも5%をモデル化できる場合は、項を追加し続けます)。
これは主に自動分析用であるため、JSLソリューションは大歓迎です。
分析スクリプティングRe:リーフの数を減らすために、パーティションプラットフォームの分割数にペナルティを追加しますか?やあ@markschwab 、
あなたの懸念に関して、それは分割の数が本当に信頼できるということですか、それとも分割の数がかなり少ないということですか? 信頼できる分割の数は、データテーブルの行から1を引いたものであると思いますが、100%ではありません。
とにかく、自動パーティショニングを行うために使用できるコードスニペットを含めています。 これは、BostonHousing.jmpファイルを使用して行いました。
JSLに精通している場合は、必要に応じてJSLを変更できるはずです。 コードはかなり基本的であり、数値の連続応答列があることを前提としています。 最初のウィンドウから定義した最大パーティションの数に応じてパーティション分割を実行し、パーティション分割の統計を保存します。 たとえば、独自の列式を簡単に作成して、「ペナルティ付き」検証RSquareを設定することも、パーティションにペナルティを課すことを選択することもできます。 次に、基準に最適なパーティションを選択し、決定した固定数の分割で再実行できます。 私はプログラムをどのように空想するかについていくつかのアイデアを持っていますが、それは後でです。
ちなみに、検証列を作成し(Proがない場合は、スクリプトインデックスで検索することでこれを行うことができます)、応答列で階層化することを検討してください。これにより、トレーニング/検証セットの詳細がわかります。 50/50以外の分割を処理する場合の同等の表現。 このようにして、パーティションをトレーニングするためのデータを増やすことができます。
お役に立てれば!、
DS
Names Default To Here( 1 );
lbWidth = 168;
//dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );
// Expression to store the current settings in global variables
recallRolesS1 = Expr(
::dtchosenRecall = dtchosen
);
// Expression to clear all current settings. KW: Clear
clearRoles = Expr(
Try(
colListY << RemoveAll;
ColListX << RemoveAll;
ColListW << RemoveAll;
ColListF << RemoveAll;
colListV << RemoveAll;
)
);
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::xcolRecall = colListX << GetItems;
::WcolRecall = colListW << GetItems;
::FcolRecall = colListF << GetItems;
::vcolRecall = colListV << GetItems;
);
//Function to choose the data table to model. KW: choose_data
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL>Re:リーフの数を減らすために、パーティションプラットフォームの分割数にペナルティを追加しますか?ありがとう@DiedrichSchmidt詳細な対応に! スクリプトを消化するのに少し時間がかかります。
今のところ、使い方の例を簡単に紹介していただけませんか。 これが私が試したもので、エラーが発生します:
1)行 "dt = Open(" $ SAMPLE_DATA / Boston Housing.jmp ");"のコメントを解除します。スクリプトを実行します
2)[データテーブルの選択]-> [ボストンハウジング]-> [OK]をクリックします
3)[アクション]で[OK]をクリックします
4)「パーティショニングを支援するJSL」ウィンドウで、「nox」をYに、「age」をXにキャストし、「OK」を押します。
5)JMPアラートが表示されます " 'w [Outline Box( "Partition for" || ycols [1])]'、w [/ * ### * / Outline Box( "Partition for" || ycols [のアクセスまたは評価における添え字の問題{20} 1])] "。 テーブル「Partition_Results」は、1〜20の範囲の列「Splits」を除いてnullです。
Re:葉の数を減らすために、パーティションプラットフォームの分割数にペナルティを追加しますか?こんにちは@markschwab 、
あなたは意図したとおりにコードを使用しています。私は、どのような状況でも機能するほど一般的ではないいくつかの推測をしました。 検証列があると思ったので、1つで実行するようにスクリプトを作成しました。以下の更新されたスクリプトは、パーティションプラットフォームウィンドウの場合と同様に、検証部分を入力できるようにすることで、この問題を回避します。 ただし、検証列と検証部分の両方を使用しないでください。スクリプトはまだそれを説明するようにコーディングされておらず、すべての可能なユーザー入力に対して完全に汎用的ではありません。
発生したエラーについては、プロセスに複数のXファクターがあると想定したため、それに応じてレポートウィンドウへの参照をスクリプト化したためです。 これは修正され、Xが1つしかない場合でも複数ある場合でも問題ありません。
繰り返しになりますが、このスクリプトは、非数値/非連続応答列Yを説明するのに十分なほど一般的ではありません。 応答がカテゴリ型の場合、このスクリプトはそれを説明するようには設計されていません。 必要に応じて、簡単に変更できます。
お役に立てれば、
DS
更新:わかりました。それで、これ以上コーディングするのを手伝うことができず、ペナルティ付きのRSquare列とトレーニング検証RSquare列をいくつか含めました。 コードを編集することで、ペナルティ計算の式と係数を変更できます。これをRsquare-0.05 * Splitsの概念に設定しました。 それに加えて、計算の実行が完了したときに結果をグラフィカルに表示するためのコードもいくつか含めました。
更新2:戻って、コードをもう少し楽しくしました-グラフの結果と一緒にテーブルの結果を確認できるようになりました。グラフ上の最も気に入ったポイントを選択すると、その特定のパーティションを再実行できます。 「OK」をクリックしたときの分割数。 以前のように、私はそれをどんな種類のユーザー入力に対しても超一般的にしませんでしたが、数値/連続応答のためにそれを機能させることを試みました。 あなたが今持っているものはあなたを動かすのに十分なはずです。
PS コードを学習するときは、JMPの[ヘルプ]メニューの[スクリプトインデックス]を使用してください。 いくつかの呼び出しと、スクリプトを作成するときにそれらを使用する方法を理解するのに非常に役立ちます。
Names Default To Here( 1 );
lbWidth = 168;
dt = Open( "$SAMPLE_DATA/Boston Housing.jmp" );
// Expression to store the current settings in global variables
recallRolesS1 = Expr(
::dtchosenRecall = dtchosen
);
// Expression to clear all current settings. KW: Clear
clearRoles = Expr(
Try(
colListY << RemoveAll;
ColListX << RemoveAll;
ColListW << RemoveAll;
ColListF << RemoveAll;
colListV << RemoveAll;
)
);
// Expression to store the current settings in global variables
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::xcolRecall = colListX << GetItems;
::WcolRecall = colListW << GetItems;
::FcolRecall = colListF << GetItems;
::vcolRecall = colListV << GetItems;
::max_spRecall = max_sp_input << get;
::partVPRecall = partVP_input << Get;
);
//Function to choose the data table to model. KW: choose_data
choose_data_table = Function( {},
list = {};
For( i = 1, i <= N Table(), i++,
list[i] = Data Table( i ) << get name
);
win = New Window( "Select a data table",
<<MODAL></MODAL>