複数のニューラル ネットワーク モデルを構築する私はニューラル プラットフォームを使用して予測を行っていますが、ニューラル ネットワーキングは初めてなので、すべての入力パラメーター (隠れ層の数、ノード/隠れ層の数、ブースティング モデル、学習率、ツアー) については少ししか理解していません。 私がやりたいのは、RMSE と検証モデルの誤分類率を最小限に抑えることです。 私が行ってきたことは、各パラメーターを 1 つずつ繰り返し変更し、モデルのパフォーマンス パラメーターを保存し、新しい JMP テーブルに貼り付けることですが、レイヤー、ノード、ツアー、 JMP Pro が、たとえば 1,000 個のモデルを構築し、データをテーブルにダンプするスクリプトを記述して、各モデルの入力パラメーターを手動で変更する必要がないようにすることは可能でしょうか?
#隠しレイヤー: 1 または 2
#S 状ノード: 0、1、2、3、または 4
#線形ノード: 0、1、2、3、または 4
#放射状ノード: 0、1、2、3、または 4
#boosting モデル: わかりません、1 ~ 5 くらいでしょうか?
#学習率: 0-0.5 (0.1 刻み)
ツアー数: 1、5、10、20、100
つまり、2 x 5 x 5 x 5 x 5 x 5 x 5=~30,000 となります。
データセットに詳しくなったら、これらのいくつかを詳しく説明できると思います。 もちろん、多くのノードと多数のブースティング モデルがあることは意味がありません (他の特定の組み合わせも意味がありません) が、それでもテストする価値のある潜在的に数百のモデルについて話しています。 確かに、この種のモデルのスクリーニング/比較はスクリプト化できますよね?
予測モデリングと機械学習Re: 複数のニューラル ネットワーク モデルの構築@SDF1あなたのメッセージを見ましたが、応答しようとすると奇妙なエラー メッセージが表示されました。 abm64@miami.edu 。
ところで、数週間使用しなかった後、GUI の最後のバージョンは、境界ボックス関連の問題を発生させることなく、私の 16 インチ Macbook Pro で動作するようになりました (すべての異なる検証タイプで連続 Y とカテゴリ Y の両方を使用)。 自分のコンピュータで何かをアップデートした覚えはありませんが、このコンピュータでも動作するのは嬉しいことです (私の Macbook Air では常に動作していました。最後のほうです!)。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
興味深いことに、確かに、この問題は本当に Macbook Pro (そしておそらくそれが実行している OS) に関連しているように思えます。 おそらく、OS やハードウェアに関連している可能性があります。たとえば、JMP が Pro でグラフィックス プロセッシング ユニットを使用する方法が、Air で使用される方法と何らかの理由で異なる場合があります。 Mac が 2 台のコンピュータに同じ GPU を搭載しているかどうか、またはハードウェアに問題があるかどうかを確認してください。 いずれにせよ、JMP 開発者は、あなたが直面している具体的な問題についてもっと知りたいと思うでしょう。Discover Summit でこの問題に注目してもらうと役立つでしょう。 少なくともそれは私の無能ではありません! 
Airでも引き続き実行できるのは嬉しいですね。 あなたの Air が引き続き動作し、ビデオを作成してサミットに提出できることを願っています。 講演の時間をお知らせください。ご覧になりたいのですが。
ありがとう!、
DS
Re: 複数のニューラル ネットワーク モデルの構築今週私が何を学んだか知っていますか?これは文字通り、私がこれまで仕事で Macbook Pro に費やした中で最も多くの時間を費やした時間です。 JMP Pro 16.1 には、小さくて迷惑な、しかしほとんどが些細なバグがたくさんありますが、私の Macbook Air にはまったく存在しません。 そしてすべては美学と関係しています。 たとえば、左側でスクリプトをグループ化し、グループ化されたフォルダーをクリックして展開する方法をご存知ですか? それはうまくいきません。 まあ、それは時々うまくいきます。 展開矢印をクリックしてから、画面上の別の場所をクリックし、戻ってもう一度クリックすると、最終的に展開されます。 他にも、他の Mac 上の同じ OS と同じバージョンの JMP Pro で気付かなかったような、小さくて奇妙な問題があります。そのため、JMP とこの特定のコンピュータの相互通信に何らかの問題があり、スクリプトに影響を与えるに違いありません。それは見た目にも関係があるようなので。 言い換えれば、それはあなたの無能のせいではないと思います (笑)。そして、私は別のコンピューターでも新しい GUI を引き続き使用することを十分に期待しています。 実際、私が職場のコンピューターでこれを入力しているとき、2,000 の NN モデルが実行されています。 私の Macbook Air の老朽化を考えると、これらの Macbook Pro の問題を最終的に解決する必要があるだけです。 実際、私はこれらすべての小さなバグや癖を記録し始めて、Discovery Summit で何人かの開発者と話をしようとするかもしれません。 それは本当に私のコンピューターの問題なのか、それとも Macbook Pro 全般の問題なのか疑問です。 最新の Mac OS (Big Sur) にアップグレードしたくないのですが、これが実際に解決策になるのだろうか。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
引き続きエラーが発生するとのこと、申し訳ございません。 私が使用しているのはアップロードした「GenAT_ver3.0.jsl」ファイルです。 職場 (JMP 16.0 Pro) と個人用 PC (JMP EA17) で試しましたが、どちらでも動作します。 データを適合させようとしても、どちらの PC でもエラーは発生しません。 それは、MacBook Pro がフィットレポートウィンドウをどのように扱うかに関するものに違いありません。 特定のコンピューターにアクセスせずにそれを修正する方法に困惑しています。 レポート ウィンドウのツリー構造を見て、PC、Macbook、Macbook Pro の違いを理解する必要があります。
戻ってログ ファイルを詳しく調べたところ、生成した特定の DOE に関する問題ではないかと思いましたが、その DOE を実行し、それに基づいて調整テーブルを作成しても、機能します。 少なくとも私が使っているPCでは動作します。
Macbook Pro で実行されていない場合、講演用の GUI をデモすることができない可能性があるため、これは非常に残念です。 この問題に関してもっとお役に立てれば幸いです。
DS
Re: 複数のニューラル ネットワーク モデルの構築もう 1 つ有益かもしれないこと: 連続した Y がある場合でも、(検証の種類に関係なく) 同じメッセージが表示されます。 奇妙な!
Re: 複数のニューラル ネットワーク モデルの構築Macbook Pro で試してみたところ、同じアウトライン ボックス/引数 1 エラーが発生しましたが、あることに気づきました。7 月のバージョンは「3.0」という名前でした。 更新したのに、誤って古いバージョンをアップロードしたと思いますか?
Re: 複数のニューラル ネットワーク モデルの構築素晴らしい! させてください今すぐ試してまた報告してください。 結局のところ、JMP サポート DID も同じ結論に達しているため、今後は機能すると確信しています。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
ファイルをありがとう。どこに間違いがあるのかを理解するのに役立ちました。 それは私の平凡なプログラミングと、JMP 内のツリー構造の完全な理解に関係しています (これについてはすべて独学です)。 とにかく、最新バージョンの日付はちょうどいいです。Y 値がどのような種類のモデリング データ (数値など) に基づいて適合統計がツリー構造内の位置を変更するという事実を考慮して、7 月初旬頃に更新しました。 、序数、またはカテゴリ。 私はほぼ 100% の時間、純粋に数値応答を処理しているため、このエラーは定期的に発生することはありませんでした。 他のモデリング タイプのデータの適合統計に関する情報を正しく提供するには、その変数の割り当て方法を変更する必要がありました。 ありがたいことに、JMP 側から見るとすべて論理的だったので、変更はそれほど難しくありませんでした。
OS や JMP のバージョンに関係なく、この問題を修正できる ver3.0 が添付されています。 これはある意味「サードパーティ」のコードであるため、サポートはあまり役に立たないと思います。 とにかく、このver3.0を試してみて、引き続き不正な動作が続く場合はお知らせください。
ありがとう!、
DS
Re: 複数のニューラル ネットワーク モデルの構築JMP Pro 15 を試してみましたが、同じエラー メッセージが表示されました。
'Outline Box' のアクセスまたは評価で予期される文字引数 1、Outline Box/*###*/(o_box)
7月10日頃からGUIバージョン3を使用しています。 それが一番最近のことですよね?
デバッガーを実行すると、「オブジェクト ボタン ボックスはメッセージ送信を認識しません。おそらくこれらのいずれかを意味します...」と表示され、いくつかの代替案がリストされます。 しかし、ボタン ボックスの形状は問題なく、すべてのボタンが機能します。
ツリー構造の引数が問題である可能性があると思いますが、それは同じOS(Catalina)です。 テクニカルサポートに問い合わせてみます。
Re: 複数のニューラル ネットワーク モデルの構築GUI(最後のスクリプト)を使用したログとテーブルを添付します。 私は、予測しようとしているいくつかのこと (Y) に対して意味のある検証タイプをすべて試しました。 通常、私は個人用の Macbook (すべてが動作する) ですべての操作を行うだけですが、そのコンピューターが壊れるまであと数週間かかるため、この新しくて優れた Macbook Pro ですべてを動作させることができることを願っています。 その間、いくつかのことを試してみます。 古いバージョンの GUI (まだバグが残っている) をコピーした可能性がわずかにありますが、これは簡単な修正になりますが、関係なく、他のバージョンでは動作したため、それが問題だとは思いません。コンピューター。 何か奇妙な点を見つけたら知りたいと思います。調査していただきありがとうございます。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
ProではなくAirで動作するのは奇妙な動作だと言わざるを得ません。 私の記憶が正しければ、その o_box 呼び出しは適合の統計の一部を抽出するためのもので、使用している検証方法のタイプ (ホールドバック、除外された行など) に応じて変わる可能性があります。 両方で 16.1 を実行しているため、JMP バージョンではないようです。 両方のコンピュータで同じ検証方法を使用していますか? どの方法を使用していますか?
私の唯一の推測は、Macbook モデル間で動作しない場合は、レポートのツリー構造に変更があり、JSL コードが特定の場所にある値を探しているはずですが、それが戻ってきているということです。空、NAN、または何かを指定すると、エラーがスローされます。 これは私のコーディング スキルを少し超えているかもしれません。OS に依存しないようにするのは私には無理かもしれません。 Windows10のPCで実行しています。 JMP には、この問題を回避して、異なる OS などで実行できるようにする方法を見つけられる、より熟練したプログラマがいることに疑いの余地はありません。
エラーを再現できれば比較的簡単に修正できますが、Macbook Pro にアクセスできません。 それまでの間、Macbook Pro で実行してログ ファイルをチェックして、コードのどの行で問題が発生しているのかを確認してもらえますか? これは、バグの場所を絞り込み、修正方法を確認するのに役立つ可能性があります。
ありがとう!、
DS
Re: 複数のニューラル ネットワーク モデルの構築G r食べる。 本当にありがとう。 何かに気づいたんだけどね今日: Catalina と JMP Pro 16.1 を実行している 13 インチ Macbook Air では、すべてが動作しました。 その後、Catalina と JMP Pro 16.1 を実行している職場の Macbook Pro 16 インチに移行し、まったく同じデータ テーブルと GUI を使用しました。すると、「アウトライン ボックス」へのアクセスまたは評価で、奇妙な「期待される文字引数 1」が表示されます。 , 入力内容に関係なく、Outline Box/*###*/(o_box)」となります。 実際にディスプレイ (つまり、より大きな画面) にリンクできると思いますか? 確かにそうではありません。 スクリプトが一方のコンピュータでは実行され、もう一方のコンピュータでは実行されないのは奇妙に思えます。 何か案は?
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
問題ありません。お役に立てれば幸いです。 そうですね、XGBoost の調整はもう少し複雑になる可能性があります。 ブログを見つけましたこここれは非常に便利です。そのページの最後のブログ エントリですが、何らかの理由でブログ記事へのリンクが実際には応答しません。 これは Python でどのように実行できるかの例を示していますが、モデル パラメーターの専門用語を理解すれば、JMP でも基本的に同じです。 これも見つけましたサイトおよび付属のドキュメントは、XGBoost が何を行うのか、どのパラメータが XGBoost を多かれ少なかれ保守的なモデルにするのかを理解するのに非常に役立ちます。 私が気に入っている点の 1 つは、ブーストされたツリーやランダム フォレストよりもはるかに安定していることです。 どちらも R^2 には確率的な動作があり、その結果、すべてのパラメーターが同じで近似を実行するたびにモデルがわずかに異なります。 XGBoost では、同じパラメータ セットを実行するたびに同じフィット品質が得られます。
Discovery の講演の中で、NN GUI について自由に言及してください。私はバーチャルで参加する予定で、ケアリー (ほんの 1 時間離れています) での直接訪問に行こうと思っていましたが、パンデミックによる問題が続いているため、彼らは対面での交流会を中止した。 GUI をアドイン ページに投稿したので、技術的には「公開」されて公開されていると思います。 ご質問いただき、デモも検討していただきありがとうございます。 スムーズに進むといいですね! 私は最高のプログラマーではありませんが、物事を動かすことはできます。 問題が発生した場合はお知らせください。できるだけ早く修正するよう努めます。
ありがとう!、
DS
Re: 複数のニューラル ネットワーク モデルの構築おお! 本当にありがとうございますr 表と説明。 ようやく NN の専門用語をすべて理解できたので、XGBoost を使うのは簡単だろうと思っていましたが、まだ学ぶべきことがたくさんあるようです (専門用語を理解するためだけに)。 現時点では、XGBoost は機械学習の世界の「最愛の人」のようなものであるように思えますが、さらに重要なのは、XGBoost が実際に私が生成するデータの種類により適している可能性があるため、確実に深く掘り下げる必要があることです。これらすべて (たとえば、GUI がバックグラウンドで実行されているときなど)。 そういえば、私の JMP Discovery の講演 (今週録画しています) の中で NN GUI について言及し、おそらくデモもさせていただいてもよろしいでしょうか? 私はあなたの功績を称賛したいと思いますが、あなたがそれをより多くの聴衆に公開したいと思っていて、「自分の雷を盗む」ことを望まないのはよくわかります。 (講演を録音する)金曜日までに XGBoost のマスターになれるとは思えないので、ニューラル プラットフォームのみを使用します (笑)。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
私はまだ 16.1 にアップグレードしていないため、同じエラーは発生していませんが、万が一発生した場合に備えて注意し、必要に応じてアップデートを投稿するつもりです。
XGBoost に関しては、それを最適化するためのチューニング テーブルがあります。 ここに貼ってあります。 XGBoost プラットフォームには、変更できるさまざまなチューニング パラメーターが多数あります。 他のものよりも影響力のあるものもあります。 モデルはパラメーター空間が非常に大きいため、通常はモデルを段階的に調整します。 チューニング テーブルに使用できるすべてのパラメーターがあるわけではありません。最も影響力のあるパラメーターだけです (適切な名前の列を使用して、いつでも追加できます)。 XGBoost ウィンドウで [詳細オプション] サブメニューを開くと、プラットフォームのパラメータのリスト全体にアクセスできます。 非常に不均衡なデータセットがあると述べたので、scale_pos_weight パラメーターが 1 に設定されていることを確認する必要があります。
実際、プラットフォーム自体から調整設計を実行することもでき、スペース充填 DOE を使用して調整テーブルを生成します。 かなり便利で柔軟です。 ただし、CPU の使用と RAM の最小化を考えると、GUI の動作と同じように JMP 内から実行する方が良いことがわかりました。
私の状況では、次の手順に従うことが XGBoost に非常にうまく機能することがわかりました。
1. 学習率、max_ Depth、min_child_weight、gamma、subsample、およびcolsample_bytreeを修正して、最初に適切なツリー数を見つけます。 これらの他のパラメータは後で調整します。 最初はデフォルト値に設定しました。
2. max_ Depth と min_child_weight を調整する
3. ガンマを調整します (ステップ 4 に進む前にツリーの数を再調整することをお勧めします)
4. サブサンプルとcolsample_bytreeを調整する
5 正則化パラメータであるアルファとラムダを調整する
6. 学習率の調整: 学習率を下げ、ツリーの数を増やします。
各ステップで、調整したいパラメータの調整テーブルを生成し、他のパラメータはそのステップでの値に固定します。 通常、このシーケンスを 2 回実行します。 XGBoost を実行するときは、相互検証 (K 分割または検証列のいずれか) を使用することが重要です。 相互検証を行わずに近似を実行することもできますが、データが過剰に適合し、最終的にはそれほど優れた予測モデルが得られなくなるリスクがあります。
お役に立てれば!、
DS
Re: 複数のニューラル ネットワーク モデルの構築ポイント#1については気にしないでください。 私の側で何か奇妙だったか、トレーニング、検証、テストへのサンプルの適切な層別化があったのだと思います。 基本的に、私は予測しようとしている 1 つのグループがはるかに一般的である完全にアンバランスなデザインをしているため、これが問題の原因になっていると思います。
Re: 複数のニューラル ネットワーク モデルの構築JMP Po 16.1 にアップグレードした後、再び NN GUI を使用し始めましたが、「添字範囲」エラーが再び発生すると述べました。 この問題に遭遇したことがありますか?
話は変わりますが、XGBoost チューニング テーブル用の DOE スクリプトはありますか? GUI を使用したそのアプローチも検討してみます。 本当にありがとう
Re: 複数のニューラル ネットワーク モデルの構築たくさんの情報をありがとうございました。 実際、私は自分が何をしているのか全く分からずに大量のモデルを構築しようとしていたでしょう。 2年前、私は別のアプローチでこれを行い、私たちが知っている海洋生物学を変えてしまったと思ってネイチャーの記事を書こうとしていたところ、モデルを完全に間違って解釈していることに気づきました(笑)。 ありがたいことに、私が働いている現在、AI と機械学習モデルが大流行しているため、それらを使用する私の動機は、従来のアプローチに当てはまらなかったとしても (AI が「セクシー」だから AI をやりたいというよりは)、 , このような分析への関心の波を利用して、隅から隅まで学んでいきたいと思っています。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
XGBoost アドインに関しては、アドインを個別にダウンロードしてインストールする必要があります。 JMP Pro 15 以降で動作します。 アドインを見つけることができますここ。 独自のモデリングに進む前に、必ずドキュメントを読み、Russ が投稿で説明しているテスト モデリングをいくつか試してください。 現時点では、そのプラットフォームは依然として、フィットのハイパーパラメータを変更/操作する方法についてユーザーにかなりの理解を必要とするものです。 私はこれを見つけましたブログこれは、XGBoost プラットフォームを調整するときに非常に役立ちます (調整するパラメーターが多数あるため、スペース全体が非常に煩雑になります)。 これは Python ユーザー向けに書かれていますが、同じ基本的な考え方が JMP プラットフォームでもうまく機能します。 これビデオまた、モデル内の各パラメーターの機能、その動作範囲、およびデフォルト値から変更する必要がある場合としない理由についても読んでください。ここ。 これは、背景の下調べをせずにただ飛び込むためのプラットフォームではありません。 私は最初に飛び込んで、自分が何をしているのか分かっていなかったことに気づき、苦労してこのことに気づきました。 それで、私はいくつかの宿題をしました、そしてそれはとても役に立ちました。 現在、上に挙げたブログのフレームワークを使用して、モデルを非常に迅速に調整できるようになりました。
幸運を!、
DS
Re: 複数のニューラル ネットワーク モデルの構築丁寧に説明していただきありがとうございます。私の思い込みが間違っていたので質問して良かったと思います。 ただし、どのサンプルがトレーニング モデルに含まれ、どのサンプルが保留されるかという点で、各「実行」がランダムにシャッフルされることの方が理にかなっています。 前に述べたように、私の小規模で幅の広いデータセットでは、行を手動で除外するか、検証列を作成する方が合理的です。そのため、実際には、さまざまなオプションをすべて「マスター」していることを確認しようとしているだけです。将来的には、ホールドバックと kfold を使用できるデータセットを作成する予定です。 私は特に後者が魅力的/賢いと思います。
誇張ではなく、あなたの GUI を使用したモデルは約 15,000 個あります。 ここで、NN と XGBoost を比較してみようと思います。これは、GUI が登場するまでまったく聞いたこともなかったテクニックです。 それが JMP Pro 16 にあるかどうかさえわかりません (おそらくどこかに隠されているかもしれませんが)。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
先週休暇に出ていたため、返信が遅くなり申し訳ありません。
ホールドバック部分に関するご質問に関しては、JMP がホールドバック値に基づいて行のパーセンテージをランダムに選択すると理解しています。 したがって、100 行があり、ホールドバック部分として 0.3 を選択した場合、JMP が NN プラットフォームを実行するたびに、検証部分として 30 行の新しいランダム セットが選択されます。 したがって、調整テーブルの使用に関しては、プラットフォームは反復ごとに呼び出され、モデル パラメーターの新しいセットを NN プラットフォームに送信します。 検証にホールドバック オプションを選択し、0 ~ 1 の範囲の数値を入力した場合、チューニング テーブルで新しい実行が実行されるたびに、JMP はホールドバック部分に従って異なる行セットを選択します。 ただし、単一の NN モデルの適合中に複数のツアーを実行している場合は、各ツアー中に同じホールドバック行が使用されます。 NN プラットフォームが呼び出されるたびに、検証のために新しいサブセットが生成されます。 少なくともこれが私の理解です。
上記の状況では、どの行が抑制されているかを知ることはできません (少なくとも私が認識していることはありません)。 そのようなことをしたい場合は、除外行ホールドバック検証オプションを選択します。 次に、データ テーブル内のどの行を除外するかを選択し、それらの行のみが検証に使用されるようにすることができます。 おそらく、ホールドバック部分を含むチューニング実行ごとに、NN プラットフォームに特定のランダム シード (たとえば 10191) を供給すると、検証用のサブセットを生成するために毎回その乱数が使用されます。 NN プラットフォームが呼び出されるたびに同じランダム シードから開始されるため、理論上、JMP はチューニング実行ごとに同じ行を選択することになります。 ただし、この場合、それらがどの行であるかはまだわかりません。 繰り返しになりますが、これはそれがどのように機能するかについての私の理解です。
お役に立てれば!、
DS
Re: 複数のニューラル ネットワーク モデルの構築素晴らしい GUI のおかげで、私は文字通り 10,000 の奇妙なモデルを実行することができました。 保留に関して1つ質問がありました。 私の調整テーブルに 100 行 (つまり、テストするさまざまなモデル) があるとします。 各行はパーセンテージに基づいてランダムなホールドバックを取得しますか、それともモデルごとに同じ X 個のサンプルがホールドバックされますか? たぶん後者だと思います。 言い換えれば、サンプル A、B、C、D がモデル #1 から保留される場合、同じ 4 つのサンプルがモデル #2 から保留されます。 それは関係なく、私のフォローアップの質問は次のとおりだと思います: どのサンプルが保留されているかを知ることは可能ですか? いずれにせよ、議論したように、私の場合、層別検証カラムを使用することは、各治療からの少なくとも 1 つのサンプルがトレーニング、検証、テストとして確実に含まれることを保証できるため、非常に意味があります。一方、ランダムな 30% のホールドバックは、理論的には可能です。同じ治療からのサンプルのみを保留してください (これは、その治療を支持する予測に偏りを生じさせます!)
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
うまく機能していると聞いて本当にうれしく思います。バグが修正されたことを願っています。 山の頂上のデータテーブルの問題について、もっと良い解決策があればいいのにと思います。 正直、それを回避する方法がわかりません。
とにかく、Kfold xvalidation については正しいと思います。 この方法は通常、背の高いテーブルでは効果的ですが、幅の広いテーブルではあまり効果がありません。 データ エントリが非常に少ない場合は、応答に対して階層化された検証列を使用することをお勧めします。 または、GenReg プラットフォームを使用している場合は、leave-one-out アプローチを使用できます。 ただし、通常、考慮すべきデータ ポイントがほとんどない場合、Kfold は最適ではありません。
XGBoost を検討することを強くお勧めします。JMP のアドイン ページからアドインをダウンロードできます。 これは非常に安定した堅牢なアルゴリズムです。 XGBoost は検証列と非常にうまく連携します。
JMP Pro が備えているサポート ベクター マシンも検討することを検討してください。 元々は分類問題用に開発されましたが、回帰問題も処理できます。 いずれの場合も、モデルのトレーニングや xvalidation に使用されていないホールドアウト データ セットを使用して、さまざまなモデルを比較することをお勧めします。 通常、私はいくつかの異なるモデルを構築し、それらがまったく新しいデータセットでどのように比較されるかを調べて、どれが結果を予測するのに最も優れているかを確認します。
お役に立てて嬉しいです!、
DS
Re: 複数のニューラル ネットワーク モデルの構築これは本当に素晴らしいです。 各検証メソッドで 100 回の反復のバッチを実行していますが、まだエラーは発生していません。 「除外行」はまだ試していませんが、うまくいくと確信しています。
kfold は常に同じ完璧な (オーバーフィット?) ソリューションを提供しますが、これはスクリプトの何らかのエラーではなく、データセットのサイズ/形式の証拠だと思います。
科学的に、私はいくつかの研究を行ってきましたが、私の「小さな」データセット(数十のサンプルと数百の潜在的な予測子)はおそらく XGBoost に適しているようです、そうでない場合はニューラルネットが過剰である可能性があるため、それを試してみるつもりですプラットフォームも。 XGBoost が JMP でサポートされていることすら知りませんでした (一方、ランダム フォレストやおそらく GUI での他のアプローチは見たことがあります)。 言い換えれば、この優れた研究ツールのすべてのコンポーネントを活用することを楽しみにしています。 (もう一度) ご協力いただき、誠にありがとうございます。他にエラーが発生した場合はお知らせします。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
そこで、自分のコーディングに問題があったことがわかりました。 これは、JMP のバージョン間の問題ではなく、名目または序数の応答にいくつのレベルがあるかに関係しています。 これにより、レポート ウィンドウ内の列番号ボックスの位置が変更されます。 2 レベル、3 レベル、4 レベル、または 6 レベルの応答から移動する場合、近似の統計がレポート内の位置を変更することを反映するようにコードを調整する必要がありました。 良い点は、レベルの数に応じて一定量の変更が行われるため、コードを比較的簡単に修正できたことです。 ただし、サンプル データから PowderMetallurgy ファイルを使用していたため、そのバグを理解するのに時間がかかりましたが、それは 2 レベルのみであり、あなたのもののように 4 レベルではありませんでした。
応答変数のさまざまなレベルに対してより一般化された更新バージョンを添付します。 このコードは、2 レベルまたは 3 レベルの検証列、および名目、順序、連続応答に対してすでに機能しているはずです。
データ セットを使用して、すべての適合プラットフォーム (NN、BT、Bootstrap Forest、XGBoost) をテストしました。すべてのデータ タイプとさまざまな検証オプションで適切に動作しました。 現時点では、JMP はブースト ツリー プラットフォームを使用して 2 レベルの応答 (名目または序数) のみを適合できることに注意してください。 他のプラットフォームはそれより多くのレベルを処理できます。
これで意図したとおりに動作していると確信しています(デフォルトで最後に開いたデータテーブルを使用することを除いて、それを回避する方法はわかりません)。 ただし、バグを見つけた場合はお知らせください。
ありがとう、そして幸運を祈ります!、
DS
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
データテーブルにも同じ問題があります。 あなたが正しいと思います。モデリングの元のデータテーブルから直接実行しない場合、どういうわけか、JMP ホームウィンドウで最後に開いたデータテーブルがデフォルトになります。 これを回避する方法がわかりません。
うーん、コードはトレーニングと検証のみ、またはその 3 つすべてを含む検証列で動作するはずです。 これは、検証列のレベル数を確認し、それに応じて調整するために作成しました。つまり、レベルが 2 つであろうと 3 つであろうと、適切な適合統計を記録するためです。 明日それを再確認します。 添字範囲エラーはおそらく 15 と 16 の間の変更が原因だと思います。 16 がリリースされたとき、コードが機能することを確認するために戻って再チェックすることはありませんでしたが、15 では複数のテストを実行し、すべてが機能しました。 それでも、これを修正して期待通りに動作するように修正していきます。金曜日の朝までは時間がありません。
繰り返しになりますが、コードのデバッグにご協力いただきありがとうございます。ご迷惑をおかけして申し訳ありませんでした。 JMP アドインとして送信したときと同様に、すべてのデータ タイプとコード タイプを確認したら、折り返しご連絡します。
ありがとう!、
DS
Re: 複数のニューラル ネットワーク モデルの構築素晴らしい! 今は火を使って調理中です。 今私が感じている唯一のことは、GUI がどちらがデータ テーブルでどちらがチューニング テーブルであるかを指示するように要求しても、依然としてそれらが混同されることがあるということです。 「山の一番上」に近いテーブルがデフォルトになると思います (私は 10 ~ 20 のテーブルを開いていることが多いですが、そうでなければ問題はないと思われます)。
「検証列にトレーニング項と検証項のみがある場合は、テスト データを計算しない」などの単純な「ルール」を追加することは可能でしょうか。 別の方法は、コードを手動で調べて、すべての「test」オプションの前に「//」を置くことだと思います。 私が質問したのは、トレーニング/検証/テストではなく、トレーニングと検証のみを使用する場合があるためです (サンプルサイズが小さいため)。ここで、トレーニング用語と検証用語のみを含む検証列を入力すると、「添字範囲」エラーが発生します。これは、そこに存在しない「テスト」データを探しているためだと思います。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
それを見つけて知らせてくれて、改めて感謝します。私のモデルは数値応答を持つ傾向があるため、通常は公称データ型に合わせて編集する必要はありません。
とにかく、JMP 15 から 16 への変更により、レポート ウィンドウの数値列ボックスが異なる可能性があると思います。これは、すべて同じ値を以前のものから現在のものに変更する必要があったためです。以前は機能していました。 JMP 15、私はそれをテストしたことを覚えています。 再確認したところ、この更新バージョンは、NN のさまざまな検証方法 (除外行ホールドバック、ホールドバック、kfold、および検証列) で正しく実行されました。 ご迷惑をおかけして申し訳ございません。 改善して他の人を助けるために、テストしてバグをお知らせいただければ幸いです。 他に何か見つけたらぜひ教えてください!
ありがとう!、
DS
Re: 複数のニューラル ネットワーク モデルの構築調べていただきありがとうございます。検証列では動作するようになりましたが、holdback または kfold を使用すると同じエラー コードが表示されます。 これらの方法では、予測しようとしている各ビンが表現される場所までデータを必ずしも階層化するわけではないからでしょうか。 より大きなデータセットで試して、同じ「添字範囲」エラーが発生するかどうかを確認します。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
申し訳ありませんが、返信までに少し時間がかかりました。 発生していたエラーを再現することができ、コードのどこに間違いがあるのかを見つけることができました。行 348 と 349 には、変数 ncol_box_v と ncol_box test の値が間違っていました。 それぞれ 10 と 19 である必要があります。 それを修正し、検証列を使用して NN を再実行したところ、正常に動作しました。 修正したコードを添付します。 ご不便をおかけして申し訳ありません。 ご指摘いただきありがとうございます。他にもバグを見つけた場合は、お知らせください。
お役に立てれば!、
DS
Re: 複数のニューラル ネットワーク モデルの構築うわー、この GUI は本当にアップグレードされました。 唯一のことは、次のエラーが発生することです。
使用する検証タイプに関係なく、 'V_stats[ /*###*/5]' 、 V_stats[/*###*/5" のアクセスまたは評価における添え字範囲。 4 つのグループ (Y として) ごとにトレーニング、検証、テストのサンプルを作成するには、サンプル サイズが非常に小さいためでしょうか。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
いいえ、ラジオ ボタンの選択 (ホールドバックまたはホールドバックの除外など) に検証列を含めることを選択したのに、選択した列に列をキャストするときに列のリストに検証を含めるのを忘れたためだと思います。役割。 これは私の推測ですが、そうでない場合は、段階的に説明していただく必要があるかもしれません。
また、他のいくつかの間違いを修正するためにコードを若干更新しました。 私のコードには進行状況ウィンドウが含まれていますが、これはあなたが望んでいなかったと思いますが、とにかく、ソース コードを入手できるように新しい GenAt.jsl ファイルを添付します。 私はモデリングを支援するために常にそれを使用しています (NN、ブースト ツリー、ランダム フォレスト、XGBoost)。 私はそれが好きですが、モデリングの観点から何をしているのか、またさまざまなプラットフォームで何ができるのかについてある程度の知識/理解が必要です。
これかどうかはわかりませんリンクも動作しますが、アドイン リポジトリでの使用方法について説明を書いてみました。 自分の SAS アカウントからそのリンクにアクセスできることはわかっていますが、他の人がアクセスできるかどうかはわかりません。 ただし、リポジトリではまだ公開されていません。
お役に立てれば!、
DS
Re: 複数のニューラル ネットワーク モデルの構築こんにちは!
6 か月ぶりに NN の作業に戻ってきましたが、NN GUI を実行しようとすると、次のような新しいエラー メッセージが表示されることに気付きました。「Send Expects Scriptable Object in access of 'list', {/ *###*/"検証"})。 これは、JMP 15 と 16 の間の何らかの変更 (つまり、特定の JMP 15 スクリプトを JMP 16 用に変更する必要がある) が原因である可能性があると思いますか?
Re: 複数のニューラル ネットワーク モデルの構築すばらしい! 投稿したら教えてください。 特にこのデータセットを理解する初期段階にあるので、ぜひ試してみます (ただし、JMP Pro 16 でテストした他のすべてのモデル タイプよりも NN が明らかに勝者でした)。 あなたが述べた理由と、応答変数の削減に最適ではないため、NNに直接行かないことの価値はわかります。 私の場合、すべてのサンプルで同じ 30 ~ 40 個のタンパク質を繰り返し測定する必要があります (ご指摘のとおり、欠落データはありません)。これにより、より伝統的な候補バイオマーカー アプローチ (1 つを使用したアプローチ) を行う場合と比較してコストが上昇します。またはいくつかの予測因子だけ)。 したがって、私は基本的に、いくつかのバイオマーカーのみを使用してシンプルで必要なものを取り除いたモデルを作成し (通常は Gen-reg を使用します)、スクリプトから最適化された NN モデルと比較します。 この例では、NN が優れていますが、今後収集するすべてのデータセットから常に NN が優れているというわけではありません。 GUI、バグ、その他すべてを試してみるのを楽しみにしています。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
過度に複雑なモデルを使用しないという点については、私も確かに同意します。 それは絶対に避けるべき問題です。
私の見解では、NN モデリングは他のプラットフォームとそれほど似ていません。 それぞれに長所と短所があります。 たとえば、NN は欠損データの処理がそれほど得意ではなく、計算能力があまり高くなく、解釈が難しいことで有名です。 理論の構築にそのようなモデルを使用する人々にとって、その解釈は重要です。 また、NN は、すべての種類のデータ セットや無関係な入力を処理できるわけではありません。 ただし、モデルには仮定が含まれていないため、高い予測能力を持つ傾向があります。
ただし、各モデリング手法には異なる利点と欠点があるため、異なるプラットフォーム間でモデルを作成し、各プラットフォームの最良のモデルを新しいデータセット上で相互に比較して、どれが予測に最も優れたパフォーマンスを発揮するかを確認する傾向があります。新しいデータセットを作成し、それを使用します。
ということで、(データテーブル内からだけでなく) JMP メニューのホットボタンから実行できる GUI インターフェースの Ver 1.0 が完成したところです。 データ テーブルと調整テーブルを入力すると、選択した 4 つの方法 (NN、ブースト ツリー、ブートストラップ フォレスト、XGBoost) に応じて、調整テーブルに基づいて送信した数の適合が実行されます。 これは、Y 入力のさまざまなデータ型やさまざまな検証列の種類、さらには XGBoost プラットフォームの複数の検証列でも機能します。 決してバグがないわけではありませんが、NN プラットフォーム用の最初の GUI を投稿してから 1 週間ほどで動作するようになったことにとても興奮しています。 ユーザーは、各プラットフォームでどのチューニング テーブルを使用するか、およびその他のプラットフォーム固有の要件についての知識を持っている必要があります。同様に、JMP のブースト ツリー プラットフォームは 2 レベルを超える公称/順序データでは機能しないことを知っておく必要があります (少なくとも JMP 15 では)、または XGBoost プラットフォームは複数の検証列を使用できるが、それぞれは 2 レベルのみでなければなりません。
このプロジェクトに取り組むのは楽しかったので、今後の取り組みに役立ちます。 ありがとう!
幸運を、
DS
Re: 複数のニューラル ネットワーク モデルの構築これの一部は、多くのモデリング タイプにとって、これまで以上に複雑なモデルを構築することはやりたいことではない、という事実と関係があるのではないかと思います。つまり、単純なモデルがデータによく適合し、検証またはテストの RSME 値が低い場合は、そこで停止してください。 しかし、NN の場合、レイヤー、ノード、ブースト、ツアーなどを追加することは必ずしも悪いことではありません。なぜなら、それらはより複雑ではあるものの、より柔軟でもあるからです。 したがって、すべてのモデリング プラットフォームにこの GUI を導入すると、モデリングに不慣れなユーザーが本質的に徹底的なデータマイニングを行ってしまい、不利益を被る可能性がある理由がなんとなくわかります。 ただし、NN についての私の限られた理解からすると、あるモデルが TanH=3 のデフォルト条件で適切な検証 RSME を持ち、さらに別のモデルが 2 つの隠れ層にわたって 3 つの TanH、3 つの線形ノード、および 3 つのガウス ノードを持ち、それでも同様の RSME を持っている場合、後者のモデルはより複雑ですが、RSME の点では同等に適切であるという理由で自動的に拒否することはありません。最終的には、後者のモデルの方が将来のテスト データセットに対してより柔軟になる可能性があるからです。 したがって、ほとんどの人は潜在的に数百から数千の NN モデルを構築することができるでしょう。 ただし、私が間違っている可能性は十分にあり、NN は他のすべてが同じであれば、シンプルであるほど優れている他のモデリング タイプと何ら変わりはありません。 NN の入力パラメータを最適化しようとする人がなぜ増えないのかについては、私はただ唾を吐きかけているだけです。それはデータ マイニングに対する無知や恐怖からでしょうか?!
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
フィードバックと温かいお言葉をいただきありがとうございます。 ええ、私もその問題を抱えていました。それは、「一番上」にない場合に間違ったデータテーブルを取得するというものです。 なぜそんなことをするのか全く分かりません。 また、後でフィット部分に渡すために新しいウィンドウで特定のものを呼び出したときの応答方法にも、何かおかしな点があります。 「キャンセル」ボタンが意図したとおりに機能せず、「ヘルプ」ボタンも今のところどこにも進みませんが、これでスタートです。 スクリプトの専門家であれば、これらのバグを簡単に修正して、意図したとおりに動作させることができると思います。 おそらく、より多くのプラットフォームで実行し、バグが発生しないように設定できたら、アドイン ページに投稿できるでしょう。 JMP に組み込んでいただけると光栄です。
モデルを調整するプロセスがさらに自動化され、簡素化されるため、作業に役立ちます。 私は NN プラットフォーム用に何かをしたいと思っていましたが、あなたの投稿まで先延ばしにしていました。GUI を作成したので、それを拡張してより機能横断的なものにしたいと考えています。 大規模なモデルのセットを調整して統計のみに焦点を当てる機能は、ハイパーパラメーターのスペースを絞り込むのに非常に役立ち、異なるプラットフォーム間でモデルを比較し、新しいデータの予測に最適なものを確認することが容易になります。 その後、戻って標準プラットフォームで最適な設定を実行し、JMP が提供するすべての豊富なグラフィカル フィードバックを取得して、モデルやその他すべてのものを視覚化できます。
幸運を!、
DS
Re: 複数のニューラル ネットワーク モデルの構築おお! これは本当に素晴らしいことです。 唯一のわずかな問題は、スクリプト ウィンドウが「チューニング」テーブルのすぐ上にある場合、データ テーブルではなくモデル ウィンドウ内のチューニング テーブルを「呼び出す」ことです。 データ テーブルとスクリプトが画面の最前面にある限り、モデル項が正しく読み込まれます。 実際、ほんの数分で 100 個のモデルを実行しました。 もっと広く注目されるように、これを JMP Web サイトの「アドイン」デポ (実際の名前は忘れました) に置いていただけないでしょうか。 これは多くの人に役立つと確信しています (すぐにではないにしても、モデル構築における NN の有用性がより多くの人に認識されるようになるでしょう)。 おそらく、何らかの形で JMP Pro 17 に組み込まれるはずです (16 では遅すぎるかもしれません)。 ご協力いただきありがとうございます。これがあなた自身の研究にも役立つことを願っています。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
JMP やコンピュータのリセットがうまくいったといいのですが。 そうでない場合は、戻って NN モデリング用の GUI も構築しました。さまざまなプラットフォームで動作するように拡張する予定です。 完璧に動作するわけではなく、時々奇妙なエラーが発生します (熟練したスクリプト作成者ならおそらく数秒以内にデバッグできるでしょう)。 しかし、良い点は、順序、公称、連続など、あらゆるタイプの入力データ列で動作し、NN で許容される検証方法 (除外行、ホールドバック、Kfold、検証列) で動作することです。 これは、テスト データを含む検証列と含まない検証列の両方で機能します。 これは、データ テーブル (添付) にある NN GUI というスクリプトです。
興味のある方は、JMP スタッフのブログから大いに拝借しました。 .@juliagong (退職)ここそして、からのサポートノート.@ウェンディ_マーフリーここ。 データ テーブル内から自動化した他のプラットフォーム (ブースト ツリー、ブートストラップ フォレスト、XGBoost) に対してもこれを自動化できる GUI を作成する予定です。 コミュニティに投稿する予定ですが、特に完全にデバッグされたことを確認するためには時間がかかる可能性があります。
以下のコードからデータ テーブルの GUI への唯一の変更は、dt = Data Table ("...") を dt = Current Data Table() に変更することです。
これがあなたの仕事の進歩に役立つことを願っています。 これを改善してモデリング作業を容易にすることもできるので、これは私にとっても役に立ちます。
幸運を、
DS
NN GUI コード:
Names Default To Here( 1 );
//Clear Symbols();
dt = Data Table( "Neural networking Ofav 2017 dataset" );
dt_parms = Data Table( "NN Tuning 8" );
nc = N Col( dt );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
valid_list = {"Excluded Rows Holdback", "Holdback", "KFold", "Validation Column"};
//the width of the column list box in pixels
lbWidth = 110;
/* Expression to clear all current settings */
clearRoles = Expr(
colListY << RemoveAll;
colListV << RemoveAll;
);
/* Expression to store the current settings in global variables */
recallRoles = Expr(
::ycolRecall = colListY << GetItems;
::vcolRecall = colListV << GetItems;
);
VmethodDlg = New Window( "Choose Validation Type",
<<RETURN result=""> 0,
VMeth_Insert = "Validation(" || ":" || validCol[1] || ")";
If(
coltype == "Ordinal",
set = 1;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );,
coltype == "Nominal",
set = 2;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );,
coltype == "Continuous",
set = 3;
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
);
If( VMeth == "Validation Column" & lvl == 0,
VMeth_Insert = "Validation(" || ":" || validCol[1] || ")";
If(
coltype == "Ordinal",
set = 1;
o_box = 3;
ncol_box_v = 10;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );,
coltype == "Nominal",
set = 2;
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );,
coltype == "Continuous",
set = 3;
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
);
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
^VMeth_insert^,
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt_name || " - " || "Neural of " || y_resp[1] );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
If( VMeth == "Validation Column" & lvl > 0,
Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get
);
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
If( VMeth == "Validation Column" & lvl > 0,
dt_results:R² Test[i] = Test_stats[1];
dt_results:RMSE Test[i] = Test_stats[2];
dt_results:Mean Abs Dev Test[i] = Test_stats[3];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
dt_results:SSE Test[i] = Test_stats[5];
dt_results:Sum Freq Test[i] = Test_stats[6];
);
);
);</RETURN>Re: 複数のニューラル ネットワーク モデルの構築うーん、新しいテーブルをダウンロードしましたが、毎回アウトライン ボックス エラーが表示されます。 JMP を再起動してから、コンピュータを再起動してみます。 それがあなたの側ではうまくいくのに、私の側ではうまくいかないというのは奇妙に思えます。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
編集しようとした元の投稿が何らかの理由で失われたようですので、これを再投稿します。 データテーブルを共有していただきありがとうございます。問題の解決に役立ちました。
とにかく、いくつかの変更を加えたので、注意すべき点がいくつかあります。
- 単一のコードが順序、名目、連続モデリング タイプで実行できるようにしました。 2 つの異なるバージョンは必要なくなりました。
- 引用符の間に列名を入力して、Y 応答列である変数 y_resp を編集する必要があります (8 行目を参照)。 Neural() 内の呼び出しで編集する必要はなくなりました。 ただし、X() のリストを編集する必要があります。
- 次に、コードは y_resp 列のモデリング タイプをテストし、いくつかの変数を設定して、出力データ テーブルに適切な列を生成します。
- 出力データ テーブルには、検証タイプとホスト データ テーブルに応じた名前が付けられるようになりました。 こうすることで、JMP による奇妙な名前の問題が発生することなく、すべての検証タイプを実行して比較できます。
- データ テーブルにあるさまざまな検証タイプのスクリプトをそれぞれ編集したので、新しいデータ テーブルに簡単にコピー/ペーストできます。 お送りいただいた以前のテーブルでこれをテストしましたが、問題なく動作しました。
- コードが実行されるたびにログ ファイルに書き込まれ、括弧を新しい場所に移動する必要があるというエラーを修正しました。
- あなたのホールドバックと私のk-foldが実際に正しく機能しなかった理由は、そのタイプを実行するときにValidation()をValidation Method()に変更する必要があるためであることがわかりました。 さまざまなメソッドに対してこれを実行し、スクリプトが修正されました。
ということで、少しずつ良くなってきているので、それは良いことです。 追加の列を生成する前に、応答列のタイプと検証方法をテストさせたいのですが、その方法がまだわかりません。 次回の公開に向けて編集するかもしれません。
以下は、Kfold 検証のコード例です。 修正されたスクリプトが保存された新しいデータ テーブルも添付しました。
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning 8" );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
//edit the line below so that it has the name of the column you want to model.
y_resp = "health designation";
response_col = Column( dt, Eval( Eval Expr( Expr( y_resp ) ) ) );
dt_results = dt_parms << Subset( Output Table( "Output of " || dtp_name || " with Kfold" || " for " || dt_name ), All rows, Selected Columns Only( 0 ) );
//This tests the response column type to automatically set the values for pulling the data out of the report window.
//It also will create the appropriate columns depending on the modeling type of the response column.
coltype = response_col << Get Modeling Type;
If( coltype == "Ordinal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Nominal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Continuous",
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
//dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
//dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
Validation Method ( \!"Kfold\!", 5 ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of " || y_resp );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
//Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
//dt_results:R² Test[i] = Test_stats[1];
//dt_results:RMSE Test[i] = Test_stats[2];
//dt_results:Mean Abs Dev Test[i] = Test_stats[3];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
//dt_results:SSE Test[i] = Test_stats[5]
//dt_results:Sum Freq Test[i] = Test_stats[6];
);
);
他に問題を見つけた場合はお知らせください。解決できるよう努めます。
お役に立てれば!、
DS
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
データテーブルを共有していただきありがとうございます。 いくつかのことを見つけることができました。
- ログ ウィンドウに書き込みが続くというエラーの原因を特定し、修正しました。 それは str 呼び出し内にあります。 括弧を別の場所に移動する必要がありました。
- K-fold や Holdback を行う場合は、Validation() を Validation Method() に変更する必要があることがわかりました。 その後、それが機能し、データを適切に配分します。
- 列のモデリング タイプをテストする方法を再コーディングし、関連する変更をいくつか加えました。
- また、同じコードを Nominal、Ordinal、Continuous に使用できるように書きました。 これは、変数 y_resp (Y 応答列名) を変更するだけで実行できます。 残りの部分はすべて自動的に実行されます。
- また、「ホスト」データ テーブルと検証タイプに応じて変化するタイトルを結果データ テーブルに追加しました。これにより、3 つのメソッドすべてを実行でき、JMP による名前付けの干渉がなくなりました。
- データ テーブル内の 3 つの NN フィッティング スクリプトは、あるデータ テーブルから次のデータ テーブルに問題なくコピー&ペーストできるようになりました。 お送りいただいた最初のデータテーブルでテストしましたが、問題なく動作しました。
現在は少し自動化されており、少し改善されています。 検証方法をチェックしてから追加の列を生成し、それに応じて値を割り当てることを希望します。 おそらく次の展開で!
一般的なコードは次のようになります。 連続モデリング タイプをチェックするために温度列をテストしていることに注目してください。
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning 8" );
dtp_name = dt_parms << get name;
dt_name = dt << get name;
//edit the line below so that it has the name of the column you want to model.
y_resp = "temperature (1, 2, 3)";
response_col = Column( dt, Eval( Eval Expr( Expr( y_resp ) ) ) );
dt_results = dt_parms << Subset( Output Table( "Output of " || dtp_name || " with (validation type)" || " for " || dt_name), All rows, Selected Columns Only( 0 ) );
//This tests the response column type to automatically set the values for pulling the data out of the report window.
//It also will create the appropriate columns depending on the modeling type of the response column.
coltype = response_col << Get Modeling Type;
If( coltype == "Ordinal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Nominal",
o_box = 3;
ncol_box_v = 10;
ncol_box_test = 19;
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
If( coltype == "Continuous",
o_box = 3;
ncol_box_v = 2;
ncol_box_test = 3;
dt_results << New Column( "R² Training" );
dt_results << New Column( "R² Validation" );
dt_results << New Column( "R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "SSE Training" );
dt_results << New Column( "SSE Validation" );
dt_results << New Column( "SSE Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
);
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( response_col ),
X(
:OFA...22_c0_g2_i1.p1,
:OFA...47_c0_g1_i1.p1,
:OFA...73_c1_g1_i3.p1,
:OFA...72_c1_g1_i1.p1,
:OFA...5_c1_g2_i15.p1,
:OFA...78_c2_g1_i3.p1,
:OFA...51_c4_g1_i1.p1,
:OFA...38_c0_g1_i8.p1,
:OFA...19_c0_g1_i1.p1,
:OFA...22_c2_g1_i4.p1,
:OFA...27_c1_g3_i5.p1,
:OFA...82_c3_g2_i3.p1,
:OFA...11_c1_g1_i7.p1,
:OFA...50_c2_g4_i1.p3,
:OFA...18_c1_g1_i7.p1,
:OFA...66_c2_g1_i3.p1,
:OFA...85_c0_g1_i2.p1,
:OFA...99_c5_g1_i6.p1,
:OFA...03_c2_g1_i1.p1,
:SYM...24_c0_g1_i1.p1,
:SYM...75_c0_g2_i1.p1,
:SYM...42_c0_g1_i1.p1,
:SYM...04_c0_g1_i1.p1,
:SYM...97_c0_g1_i1.p1,
:SYM...13_c0_g1_i1.p1,
:SYM...66_c0_g1_i1.p1,
:SYM...72_c0_g6_i1.p1,
:SYM...13_c0_g1_i1.p1 2,
:SYM...33_c0_g1_i1.p1 3,
:SYM...43_c0_g1_i1.p1,
:SYM...51_c0_g1_i1.p1,
:SYM...65_c0_g1_i1.p1 2
),
Validation ( :Validation with test ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
),
Go,
invisible
)) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of " || y_resp );
T_stats = w[Outline Box( o_box ), Number Col Box( 1 )] << Get;
V_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_v )] << Get;
Test_stats = w[Outline Box( o_box ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
If( coltype == "Ordinal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Nominal",
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
If( coltype == "Continuous",
dt_results:R² Training[i] = T_stats[1];
dt_results:RMSE Training[i] = T_stats[2];
dt_results:Mean Abs Dev Training[i] = T_stats[3];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[4];
dt_results:SSE Training[i] = T_stats[5];
dt_results:Sum Freq Training[i] = T_stats[6];
dt_results:R² Validation[i] = V_stats[1];
dt_results:RMSE Validation[i] = V_stats[2];
dt_results:Mean Abs Dev Validation[i] = V_stats[3];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[4];
dt_results:SSE Validation[i] = V_stats[5];
dt_results:Sum Freq Validation[i] = V_stats[6];
dt_results:R² Test[i] = Test_stats[1];
dt_results:RMSE Test[i] = Test_stats[2];
dt_results:Mean Abs Dev Test[i] = Test_stats[3];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[4];
dt_results:SSE Test[i] = Test_stats[5];
dt_results:Sum Freq Test[i] = Test_stats[6];
);
);さらに問題がある場合はお知らせください。
ありがとう!、
DS
Re: 複数のニューラル ネットワーク モデルの構築それは奇妙だ。 スクリプトを実行し続けると、最終的には機能するようになります。
もう 1 つの奇妙な点: ホールドバックのパーセンテージを何に変更しても、常にトレーニングが 11 対検証が 9 (~55/45%) になります。 例えば70/30%とかはできないのでしょうか? これは、不可能ではなく、単にコマンドを間違って入力したためであると強く感じています。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
アウトライン ボックスのエラーは、おそらく NN ウィンドウから統計値を取得しようとしたときに発生します。 新しいデータテーブルとコードを共有してもらえますか? これをトラブルシューティングして、あるデータ テーブルから別のデータ テーブルに簡単に移植できるかどうかを確認できます。
これは、データ列の型をチェックし、ncol_box 変数を別の値にする部分の設定方法に関係があるのかもしれません。 公称値の場合、この値は順序値、または数値の場合とは異なります。
このエラーが発生しているデータ テーブルとコードを共有していただければ、必ず修正できると思います。 必要に応じて、[テーブル] > [匿名化] を選択してデータ テーブルを匿名化できます。
DS
Re: 複数のニューラル ネットワーク モデルの構築わかりました、素晴らしいです。 これは、私が抱いていたいくつかの追加の質問に対する答えです。 現在、私が苦労している唯一のことは、新しいデータ テーブルでスクリプトをコピーして貼り付けて実行すると、スクリプトのコメントでほのめかされているアウトライン ボックス エラーが発生することです。 「アウトライン ボックスのアクセスまたは評価で文字引数 1 が予期されます。」 それはどういう意味ですか?? 数値を増減しましたが、毎回同じエラー メッセージが表示され、スクリプトが実行されません。 アウトラインボックスが何なのかすら分かりません。 ツリー構造が同じというのは奇妙です。 ファイル名を変更しただけです。 ファイル名が長くなりました。 おそらくそれは、より大きなアウトラインボックスが必要であることを意味しますか?Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
戻ってスクリプトを確認すると、2 行目で分析中に使用されるデータ テーブルが定義されています。 JSL コード dt = Current Data Table() は、データ テーブルを名前で呼び出す代わりに、スクリプトの残りの部分で使用されるローカル変数 "dt" を定義します。 同様に、dt_parms は、NN チューニング テーブル「NN チューニング」に割り当てられるローカル変数です。 実際にスクリプトにフィードするのは、これら 2 つのテーブルだけです。 残りはすべて内部的なものです。
JSL コードをコピーして新しいデータ テーブルに貼り付けると、そのデータ テーブルでローカルに実行しているため、コードは自動的に機能するはずです。
Y() と X()、および場合によっては Validation() メソッドを定義する場合を除き、呼び出し dt << Nerual() を変更しないでください。 JSL コード dt << Nerual() は、データ テーブル "dt" に対して NN モデリングを実行するように JMP に指示するコマンドです。 したがって、dt が何であるかの定義はコードの先頭にあります。
また、NN レポート ウィンドウのタイトルを反映するように w = Window() 呼び出しとその下の Regex() を変更する必要もあります。 最後に、検証列の一部として「テスト」データセットを実際に持つかどうかに応じて、(行の先頭に // コマンドを使用して) コメントアウトするか、コメントを削除する必要があります。 Test 結果列と Test_stats 定義を作成するときに、コードの先頭に出力され、コードが結果を新しい出力データ テーブルに書き込む場所になります。
それ以外は、ほとんど編集する必要はありません。
最後の質問に関しては、コードの実装方法によって異なります。 データ テーブル内から実行している場合、つまりデータ テーブルのスクリプト部分に保存されており、緑色のホット ボタンから実行している場合は、Y() と X( ) は、新しいデータ テーブルの列名と一致する予測子および応答として使用しています。 もちろん、「NN チューニング」テーブルを開いている必要があります。 一方、これを別のスクリプトとして実行している場合は、dt の定義を dt = Current Data Table() から dt = Data Table (" ") に変更するとよいでしょう。引用符で囲まれた新しいデータテーブルの名前。
あなたが言及している「ニューラル」はデータテーブルではなく、指定されたデータテーブル上でニューラルネットモデルを実行するためのJMPコマンドです。 「<<」コマンドは、左側のオブジェクトの << の右側にあるアクションを実行することを意味します。 コードの先頭近くで、新しい列コマンドを使用していることがわかります。 dt_results << New Column() と書かれている部分では、コードは JMP にオブジェクト dt_results の新しい列を作成するように指示しています。これは、dt_parms データ テーブルから生成されたサブセット データです。
お役に立てれば!、
DS
Re: 複数のニューラル ネットワーク モデルの構築(おそらく単純な) スクリプトに関する質問があります。 入力 dt を別のものに変更したいとします。 スクリプトをコピーして貼り付けて、「Neural」の dt を別のものに置き換えることはできませんか?
str = Eval Insert(
"report = (dt << Neural (
Y( :health designation ),
X(
元の「Neural」ファイルを削除し、まったく同じ情報と別の名前を持つ別のテーブルに置き換えると、スクリプトは機能しません。 2 つのデータ テーブルにまったく同じデータがあり、その 1 つは「Neural」という名前である必要がありますか? もしかしたらその部分を見逃してしまったかもしれません!
Re: 複数のニューラル ネットワーク モデルの構築うまくいっていると聞いてうれしいです。 モデリング頑張ってください! 他のモデル プラットフォームもチェックし、テスト データ セットでモデルを比較して、どれが最良の予測子であるかを確認することもできます。
DSRe: 複数のニューラル ネットワーク モデルの構築わあ、スクリプト作成の助けのおかげで、昼食前に 300 個のニューラル ネットワーク モデルを実行できたことが信じられません。 これが取り上げられ、「称賛」されることを願っています。より多くの人が NN プラットフォームの価値を認識し始めると、特にそれが真新しいデータセットで、実際にはそうではない場合には、このようなものに引き寄せられるだろうと想像しています。わずかに調整できる、途方もない量の NN モデル入力パラメーターに関して、どこに「突っ込む」べきかを知っています (たとえば、学習率を 0.05 から 0.1 に増やすだけでも、場合によっては大きな違いが生じることがあります)。 次に、さまざまな検証アプローチ (検証列、ホールドバック、KFold) を試してみます。 私の(現在の)サンプルサイズが小さいことを考えると、間違いなく注意が必要です(これらの予備データを使用して、より多くの「行」、つまりサンゴを追加するための資金を獲得したいと考えています)。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
Kfold は、短いデータ セットを検証するもう 1 つの優れた方法です。 はい、行の状態として行の除外を設定します。これは、「テスト」データ セットを選択し、行の状態を「除外」に設定することで実行できます。 Kfold または Holdback を使用する場合、JMP はそれらをデータのテストとしてではなく、データの検証に使用します。 できれば、トレーニング データや検証データと同じデータ テーブル内になく、テスト データとして使用できる別のデータ セットも用意しておいてください。
Kfold を検証に使用し、スクリプトを実行する必要のない部分をコメントアウトします。 以下は、NN プラットフォームの 5-Kfold 検証設定を使用して編集されたバージョンです。うまくいくはずです、私にとってはうまくいきました。
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning" );
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
//dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
//dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
//dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
//dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
//dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
//dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//dt_results << New Column( "Sum Freq Test" );
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( :health designation ),
X(:OFA...22_c0_g2_i1.p1 ),
Validation ( \!"KFold\!", 5 ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
)),
Go,
invisible
) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of health designation by OFA...22_c0_g2_i1.p1" );
If( !Is Missing( Regex( w << Get Window Title, "health designation by OFA...22_c0_g2_i1.p1" ) ) == 1,
ncol_box_v = 10;
//ncol_box_test =19;
);
T_stats = w[Outline Box( 3 ), Number Col Box( 1 )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
V_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_v )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
//Test_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
//dt_results:Generalized R² Test[i] = Test_stats[1];
//dt_results:Entropy R² Test[i] = Test_stats[2];
//dt_results:RMSE Test[i] = Test_stats[3];
//dt_results:Mean Abs Dev Test[i] = Test_stats[4];
//dt_results:Misclassification Rate Test[i] = Test_stats[5];
//dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
//dt_results:Sum Freq Test[i] = Test_stats[7];
);
幸運を!、
DS
Re: 複数のニューラル ネットワーク モデルの構築特に検証の種類に関して、より優れた提案。 Neural はホールドバック、Kfold、または行の除外をサポートしていることがわかりました (これにより、除外する行をランダムに選択することになると思います)。 スクリプトを変更して検証の種類を変更したい場合は、「Validation ( :Validation with test )」行を変更するだけでよいでしょうか? そして、保留されたサンプルは、JMP の目から見て検証サンプルと同等なのでしょうか? そうでない場合は、検証列を削除 (または名前変更) する必要があり、テスト列も削除する必要があります。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
問題が解決されてよかったです。
ツリーベースのモデリング (XGBoost、ブーストされたツリー、およびブートストラップ フォレスト) を使用すると、JMP 内のチューニング テーブル GUI を簡単に使用して、多くのモデルを実行できます。 ただし、1 つの欠点は、RAM を大量に消費することです。 この方法で実行することの良い点は、何万もの異なるパラメーター設定を実行でき、RAM をあまり消費せず、CPU 消費だけを消費することです。 ブートストラップ フォレスト (これは遅い) を使用して最大 40,000 の異なる設定を実行しましたが、職場のラップトップ (32 GB RAM と 2 GHz CPU) では数日かかることがあります。
私も JMP 16 の早期導入者であり、モデルのスクリーニングは優れていますが、ご指摘のとおり、どのモデルもチューニングされていないため、少し誤解を招く可能性があります。 デフォルト設定が使用されるだけですが、これは予測モデルを作成するのに常に最適な設定であるとは限りません。 少なくとも、どのプラットフォームが時間をかけてさらに調整する価値があり、どのプラットフォームが検討する価値がないのかを判断するのに役立ちます。
公称データをモデル化するために SVM プラットフォームを検討することも検討してください。これは、この種のデータにも適した方法であると考えられます。
シミュレーターに関しては、これは別のものであり、異なる初期条件 (ランダム化) で推定値をテストする方法を目的としています。 これにより、推定値の分布が得られ、元の推定値の信頼区間が得られるので、指定された推定値を持つモデルが適切かどうかを判断できます。
DOE に関しては、要因を適切に設定して階乗計画を実行したり、空間充填計画として実行したりすることもできます。また、このプラットフォームでは条件付き制約も可能だと思います。 また、実際に 89 個すべてが必要なのか、それとも本当に小さいサブセットしか使用できないのかを確認するために、予測子のスクリーニングまたは予測子のブートストラップを実行することを検討することもできます。
最後の注意として、短くて広いデータ テーブルがあるため、検証列を使用する代わりに、検証に 1 つを残すアプローチを実行することを検討することをお勧めします。 その場合は、スクリプトを編集する必要があります。
幸運を!、
DS
Re: 複数のニューラル ネットワーク モデルの構築ああ! やり直してくれて本当にありがとう。 私は明らかにスクリプトの知識がありません。そのため、「Neural」をデータ テーブルの名前に変更しただけです。これは明らかに機能しません。 データテーブルの名前を「Neural」に変更し、テスト列を追加し、推奨されたその他の変更を加えたら、うまくいきました。
さて、私ができることは、DOEを使用して条件付き要因計画を作成し(あなたが指摘したように、複数の隠れ層でブーストすることはできないため)、職場のコンピューターで数百のモデルを実行することです(8に過度の負担をかけないようにするため) -GB RAM ラップトップ)。
あなたのスクリプトは GUI またはアドインになる必要があるような気がします (採用者はいますか?)。 私がベータテストしている JMP Pro 16 には、非常に優れた「モデル スクリーニング」ツールが備わっていますが、テスト対象となる可能性のある数千のモデル内ではなく、モデリング タイプ全体 (例: PLS 対 Gen-Reg) をテストしていると思います。各モデリング タイプ内に構築されます (そうしないと、実行が停止しない可能性があります)。 「シミュレーター」について聞いたことはありますが、間違っている可能性もありますが、それは何か違うことをしていると思います (大量のシミュレートされたモデルを生成するわけではありません)。 改めて、ご協力いただき誠にありがとうございました。 これで確実に何日も時間を節約できるでしょう。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
データ テーブルを共有していただきありがとうございます。スクリプトに加えた変更をデバッグするのに役立ちました。
私が気づいたことがいくつかあります:
- 記録する「テスト」データセット統計用に列を追加する必要がありました。
- パラメーター テーブルの行数である imax の定義を誤って削除してしまいました。
- また、スクリプト内で dt << Neural() と記述されている NN プラットフォームへの呼び出しを誤って変更してしまいました。これは、データ テーブル "dt" でニューラル ネット モデリングを実行するコマンドを送信する場所です。 あなたはそれを別のものに変えていました。
- ウィンドウ「w」の定義には、NN ウィンドウの完全な名前が必要です。単一の X のみを実行している場合、JMP はそれをウィンドウ名の一部として入れるため、両方の名前に含める必要があります。 GetName コマンドとその下の IF ステートメント。 ただし、これは単一の X を使用してモデリングする場合にのみ当てはまります。 複数を使用する場合は、ウィンドウ名または IF ステートメントに「by....」を含める必要はありません。
- 最後の部分は、トレーニング、検証、およびテスト データの統計が Number Col Box() コマンドで正しく呼び出されているかどうかを確認することです。
以下のコードはデータ テーブルで動作します (変更されたスクリプトも添付されています)。 これは、以前に示した NN チューニング テーブルと連携します。
本当に 86 列すべてを使用する場合は、スクリプトの X(col1,col2,...) 部分に手動で列を挿入する必要があります。 次に、GetName 部分も編集する必要があります。これは、86 個すべての名前が含まれるわけではなく、応答列を含むウィンドウ名だけになるためです。
Names Default To Here( 1 );
dt = Current Data Table();
dt_parms = Data Table( "NN Tuning" );
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Generalized R² Test" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "Entropy R² Test" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "RMSE Test" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Mean Abs Dev Test" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "Misclassification Rate Test" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "-LogLiklihood Test" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
dt_results << New Column( "Sum Freq Test" );
imax = N Row( dt_parms );
For( i = 1, i <= imax, i++,
Nlayer = dt_parms:N_Layers[i];
If( dt_results:N_Layers[i] == 1,
dt_results:N_TanH_2[i] = 0;
dt_results:N_Linear_2[i] = 0;
dt_results:N_Gauss_2[i] = 0;
);
If( dt_results:N_Layers[i] == 2,
dt_results:N_Boosts[i] = 0;
dt_results:Learn_Rate[i] = 0.1;
);
NTH1 = dt_results:N_TanH_1[i];
NTH2 = dt_results:N_TanH_2[i];
NL1 = dt_results:N_Linear_1[i];
NL2 = dt_results:N_Linear_2[i];
NG1 = dt_results:N_Gauss_1[i];
NG2 = dt_results:N_Gauss_2[i];
Nboosts = dt_results:N_Boosts[i];
LR = dt_results:Learn_Rate[i];
TCov = dt_results:T_Cov[i];
RFit = dt_results:Robust_Fit[i];
PMethod = dt_results:Penalty_Method[i];
Ntours = dt_results:N_Tours[i];
str = Eval Insert(
"report = (dt << Neural(
Y( :health designation ),
X(
:OFA...22_c0_g2_i1.p1
),
Validation ( :Validation with test ),
Informative Missing(0),
Transform Covariates(^TCov^),
Fit(
NTanH(^NTH1^),
NLinear(^NL1^),
NGaussian(^NG1^),
NTanH2(^NTH2^),
NLinear2(^NL2^),
NGaussian2(^NG2^),
Transform Covariates(^TCov^),
Penalty Method(\!"PMethod\!"),
Number of Tours(^Ntours^),
N Boost(^Nboosts^),
Learning Rate(^LR^)
)),
Go,
invisible
) << Report;"
);
Eval( Parse( str ) );
w = Window( dt << GetName || " - " || "Neural of health designation by OFA...22_c0_g2_i1.p1" );
If( !Is Missing( Regex( w << Get Window Title, "health designation by OFA...22_c0_g2_i1.p1" ) ) == 1,
ncol_box_v = 10;
ncol_box_test =19;
);
T_stats = w[Outline Box( 3 ), Number Col Box( 1 )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
V_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_v )] << Get;//You might need to adjust the Outline Box () and Number Col Box() values depending on your tree structure
Test_stats = w[Outline Box( 3 ), Number Col Box( ncol_box_test )] << Get;
report << Close Window;
dt_results:Generalized R² Training[i] = T_stats[1];
dt_results:Entropy R² Training[i] = T_stats[2];
dt_results:RMSE Training[i] = T_stats[3];
dt_results:Mean Abs Dev Training[i] = T_stats[4];
dt_results:Misclassification Rate Training[i] = T_stats[5];
dt_results:Name( "-LogLiklihood Training" )[i] = T_stats[6];
dt_results:Sum Freq Training[i] = T_stats[7];
dt_results:Generalized R² Validation[i] = V_stats[1];
dt_results:Entropy R² Validation[i] = V_stats[2];
dt_results:RMSE Validation[i] = V_stats[3];
dt_results:Mean Abs Dev Validation[i] = V_stats[4];
dt_results:Misclassification Rate Validation[i] = V_stats[5];
dt_results:Name( "-LogLiklihood Validation" )[i] = V_stats[6];
dt_results:Sum Freq Validation[i] = V_stats[7];
dt_results:Generalized R² Test[i] = Test_stats[1];
dt_results:Entropy R² Test[i] = Test_stats[2];
dt_results:RMSE Test[i] = Test_stats[3];
dt_results:Mean Abs Dev Test[i] = Test_stats[4];
dt_results:Misclassification Rate Test[i] = Test_stats[5];
dt_results:Name( "-LogLiklihood Test" )[i] = Test_stats[6];
dt_results:Sum Freq Test[i] = Test_stats[7];
);
お役に立てれば!、
DS
Re: 複数のニューラル ネットワーク モデルの構築まあ、失敗しましたが、おそらくスクリプトの小さなミスが原因だと思います。 私はあなたの NN 調整テーブルと私のデータ (添付) を使用し、必要な更新をすべて行いました (3 つのトレーニング + 検証 + テスト サンプルを使用しました)。 最後のスクリプト (「ニューラル ネットワーク比較」) を実行すると、新しいテーブルが構築されますが、分析は実行されません。 いくつかの X 用語を含めましたが、実際には「標準化データ」グループの 86 列すべてになります。 デバッガを使用すると、何か問題が発生していると表示されます。
」のために( i = 1 、i <= imax、i++」の領域。 より有能なスクリプト作成者ならおそらく数秒で問題を発見できるだろうと期待/推測しています。
Re: 複数のニューラル ネットワーク モデルの構築はい! これはまさに私が望んでいることです。NN プラットフォームと同期する、すべての NN 入力パラメーター (TanH ノードの数、レイヤーの数など) を含むテーブルです。 まだ試していませんし、時間がかかるとは思いますが、20 サンプル x 90 個の小さな予測子の「練習用」データセットを使用しているので、実行できるかもしれません。 実際のところ、アクティベーションの種類とノード数 (およびツアー数) が実際に RMSE を下げることがわかっただけで、ブーストはあまり役に立ちません。 しかし、それでも、これは、実行する予定だった約 500 のモデルをすべて実行するよりもはるかに高速です (ありがたいことに、アクティブ化タイプあたり 4 ノード以下に抑えたいので、昨日実行するつもりだったモデルほど多くはありません)。 明日試してみて、どうなるかをみんなに報告します。
Re: 複数のニューラル ネットワーク モデルの構築こんにちは@abmayfield 、
これは私がしばらくの間スクリプトを作成したいと思っていたもので、本当に楽しかったです。あなたの投稿のおかげでそれを進めるための火がつきました、ありがとう! NN プラットフォームは初期条件に非常に敏感で、手動で行うとかなり時間がかかるため、しばらくの間、NN プラットフォームを調整する方法が欲しいと思っていました。
そこで、他のモデル プラットフォーム用に作成したいくつかのスクリプトを調整して、ブースト ツリー、ブートストラップ フォレスト、XGBoost プラットフォームなどのチューニング プロセスを自動化しました。 スクリプトはデータ テーブルに保存され、緑色のホット ボタンで実行されるように設計されています。
スクリプトについてある程度の知識があり、特定の状況/データ構造/列名などにこれらのスクリプトをどこに適用するかを理解していただければ幸いです。 それぞれの大きなグループで私が何をしているのかを説明するために、いくつかのコメントを入力しました。 2 つのスクリプトを添付します。1 つは連続 Y 用、もう 1 つは名目/順序 Y 用です。 Number Col Box() の値はこれに応じて変化するため、出力 Y が名目値か順序値かを確認するテストを含める必要がありました。 サンプル データ内の Big Class Families.jmp データ テーブルをテスト データ セットとして使用しました。 また、数値 NN チューニングまたは公称/順序 NN チューニングのいずれかを使用して生成した 2 つの出力データ テーブルも含めます。 :age、:weight:、:height を使用して :sex を公称化し、その後、:age を Ordinal から Continuous に変更し、連続 NN チューニングのために :weight と :sex で年齢をモデル化しました。適合性と統計はひどいものですが、これは JSL が機能するかどうかを確認することのみを目的としています。 また、すべてが正しく機能することを確認するために、:age で階層化して :Validation 列をデータ テーブルに追加しました。
他の誰かがもっとエレガントにスクリプトを作成して、Y()入力列がモデリングタイプContinuous、Nominal、またはOrdinalであることをテストし、適切なNumber Col Box()値を挿入して、単一の JSL コード。
dt << Nerual() セクションへの Y() 入力と X() 入力、およびレポート ウィンドウの名前を取得する部分 (モデリングしている変数にちなんで名付けられているため) を編集する必要があります。
NN チューニング テーブルは、原則としてスペースを埋める DOE のように扱うことができます。この場合、JMP では 1 または 2 しか許可されないため、N_Layers は 1 または 2 のみにできるなど、一部を除き、下限および上限の設定は任意に設定できます。層。 Penalty_Method は NN プラットフォームでのみ有効なオプションであり、Transform Covariate と Robust Fit は 0 または 1 (オフまたはオン) の値のみをとります。 NNチューニングテーブルも載せておきます。
ご質問がございましたら、お知らせください。
名目/順序モデリング タイプのコードは次のとおりです。
Names Default To Here( 1 );
dt = Data Table( "Big Class Families" );//enter the name of the current data table
dt_parms = Data Table( "NN Tuning" );//enter name of parameter data table for tuning the NN
dt_results = dt_parms << Subset( All rows, Selected Columns Only( 0 ) );//this copies the tuning table with all the different rows in it
//these commands create columns to record the fit results
dt_results << New Column( "Generalized R² Training" );
dt_results << New Column( "Generalized R² Validation" );
dt_results << New Column( "Entropy R² Training" );
dt_results << New Column( "Entropy R² Validation" );
dt_results << New Column( "RMSE Training" );
dt_results << New Column( "RMSE Validation" );
dt_results << New Column( "Mean Abs Dev Training" );
dt_results << New Column( "Mean Abs Dev Validation" );
dt_results << New Column( "Misclassification Rate Training" );
dt_results << New Column( "Misclassification Rate Validation" );
dt_results << New Column( "-LogLiklihood Training" );
dt_results << New Column( "-LogLiklihood Validation" );
dt_results << New Column( "Sum Freq Training" );
dt_results << New Column( "Sum Freq Validation" );
//This part just creates a separate modelling progress, delete if you don't want it.
i = 1;
imax = N Row( dt_parms );
dlgStatus = New Window( "Overall Modeling Progress",
V List Box(
Text Box( " Overall Modeling Progress ", <<SET font="" size=""></SET>
私が理解できない奇妙な点の 1 つは、NN プラットフォームで実行すると、作成したログ ウィンドウに関してこの警告が表示されるのですが、他のプラットフォームではこの警告が表示されないことです。 その警告がどこから来たのか追跡できませんが、それでも正しく実行されます。 誰かが私のコードのその部分を修正してくれるでしょうか?
予想外の「、」。 おそらく「)」が欠落している可能性があります。
「<<」演算子のオペランドを解析しようとしています。
23 行目 10 列目: ))►、
最後の注意: 膨大な数のブースト、ツアー、または伝達関数がある場合、モデリングの実行に非常に長い時間がかかる可能性があるため、設定には注意してください。 ただ行き過ぎないように注意してください。
お役に立てれば!、
DS
Re: 複数のニューラル ネットワーク モデルの構築ところで、現在選択している機能と同じ情報を表示するために関連するすべての機能を取得する「オプション」トリックは、実際には Mac では「コマンド」トリックです (そのため、以前は機能しませんでした)。
Re: 複数のニューラル ネットワーク モデルの構築マーク、ご提案ありがとうございます。 2番目は私が試して失敗しました。 他のプラットフォームの「結合テーブルにする」オプションは知っていますが、何らかの理由でニューラル プラットフォームから除外されたのかもしれません。 奇妙なことに、オプション キーを押したまま選択するとレポートのすべての部分に適用されるという「オプション」トリックは、ニューラル プラットフォームでも機能せず、その他の処理を高速化する可能性もあります。
RSME を最小限に抑えることを目的として、ニューラル ネットワーク パラメーター (ノード数、ツアー数など) を DOE の X として指定できれば素晴らしいことですが、入力する必要がある方法のせいでそれは不可能のようです。ニューラル モデルの特定のボックス内のパラメーターが起動されます。 非常に高度なスクリプトを作成する必要がありますが、それでも DOE と Neural が適切に通信できるかどうかはわかりません。 ただし、このスクリーンショットに反映されているモデル (総計のサブ選択) を基本的に実行するニューラル プラットフォームを取得できる方法を知っている人がいたら、私はそれを非常に感謝します。 言い換えれば、最初のスクリーンショット テーブルの値は、2 番目のスクリーンショット (つまり、ニューラル モデルの起動) の適切な入力ボックスに移動する必要があります。
Re: 複数のニューラル ネットワーク モデルの構築RMSE の 2 次モデルに適合するようにより少ないレベルで実験を設計し、そのモデルを使用して設定を最適化することができます。 また、各モデルを順番に作成し、結果テーブルの 1 つを右クリックして [結合テーブルに作成] を選択することで、すべての結果を一度に抽出することもできます。