建構多個神經網路模型我正在使用神經平台進行預測,並且,作為神經網路的新手,我對所有輸入參數僅略有熟悉:隱藏層數量、節點/隱藏層數量、提升模型、學習率和遊覽。 我想做的是盡量減少 RMSE 和驗證模型誤分類率。 我一直在做的是迭代地逐一更改每個參數,保存模型性能參數,並將它們粘貼到新的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。
我想一旦我更熟悉資料集,我就可以解決其中的一些問題。 當然,擁有許多節點和大量的提升模型沒有意義(某些其他組合也沒有意義),但我們仍然在談論潛在的數百個值得測試的模型。 當然,這種模型篩選/比較可以編寫腳本,對吧?
預測建模和機器學習回覆:建構多個神經網路模型@SDF1我看到了您的訊息,但在嘗試回覆時收到了一條奇怪的錯誤訊息: abm64@miami.edu 。
順便說一句,在幾週沒有使用它之後,最後一個版本的GUI 現在可以在我的16 吋Macbook Pro 上運行,沒有任何與邊界框相關的問題(使用連續Y 和分類Y 以及所有不同的驗證類型)。 我不記得在我的電腦上更新過任何東西,但是,嘿,我很高興它也能在這台電腦上運行(它一直能在我的 Macbook Air 上運行,它已經快不行了!)。
回覆:建構多個神經網路模型你好@abmayfield ,
有趣的是,這個問題似乎確實與 Macbook Pro(也許還與它運行的作業系統)有關。 它可能與作業系統甚至硬體相關——例如 JMP 在 Pro 上使用圖形處理單元的方式與在 Air 上使用圖形處理單元的方式有所不同。 也許檢查一下 Mac 是否使兩台電腦具有相同的 GPU,或者是否可能是硬體問題。 無論如何,我想 JMP 開發人員會希望更多地了解您所面臨的具體情況,並且在發現峰會上提請他們注意這一點將會有所幫助。 至少不是我無能! 
我很高興您仍然能夠在 Air 上運行它。 我希望您的 Air 繼續工作,以便您可以製作影片並將其提交給峰會。 讓我知道您的演講時間,我想看看。
謝謝!,
DS
回覆:建構多個神經網路模型你知道我這週學到了什麼,這實際上是我在工作 Macbook Pro 上花費的最多時間? JMP Pro 16.1 中有很多小、煩人但大多是微不足道的錯誤,但在我的 Macbook Air 上完全不存在。 而這一切都與美學有關。 例如,您知道如何將左側的腳本分組,然後按一下以展開分組的資料夾嗎? 那是行不通的。 嗯,有時它會起作用。 您需要單擊展開箭頭,然後單擊螢幕上的其他位置,返回,再次單擊,它最終會展開。 還有其他一些小而奇怪的事情,例如我在另一台Mac 上的相同作業系統和相同版本的JMP Pro 上從未註意到它們,因此JMP 和這台特定電腦之間的相互通信一定存在問題,從而影響您的腳本因為這似乎與外表有關。 換句話說,我不認為這是因為你的無能,哈哈,我完全希望在我的另一台電腦上仍然使用新的 GUI。 事實上,當我在工作電腦上輸入此內容時,它正在運行 2,000 個神經網路模型。 考慮到我的 Macbook Air 的老化性質,我只需要最終解決這些 Macbook Pro 問題。 事實上,我可能會開始記錄所有這些小錯誤和怪癖,並嘗試在發現峰會上與一些開發人員交談。 我想知道這確實是我的電腦問題還是 Macbook Pro 的普遍問題。 我不想升級到最新的 Mac 作業系統 (Big Sur),但我想知道這是否真的是解決方案。
回覆:建構多個神經網路模型你好@abmayfield ,
得知您繼續收到此錯誤,我們深感抱歉。 我上傳的「GenAT_ver3.0.jsl」檔案就是我正在使用的檔案。 我已經在我的工作 (JMP 16.0 Pro) 和個人 PC (JMP EA17) 上嘗試過,並且它適用於兩者。 當我嘗試擬合您的數據時,兩台電腦上都沒有出現錯誤。 這肯定與 Macbook Pro 如何處理適配報告視窗有關。 我對如何在無法訪問特定計算機的情況下修復它感到困惑。 我必須查看報告視窗的樹狀結構,並嘗試找出 PC、Macbook 和 Macbook Pro 之間的差異。
我回去仔細查看了您的日誌文件,認為這可能與您生成的特定 DOE 有關,但即使當我運行該 DOE 並基於它製作調整表時,它仍然有效。 至少它可以在我使用的電腦上運作。
這太糟糕了,因為聽起來如果 GUI 不是在 Macbook Pro 上運行,您可能無法在演講中演示 GUI。 我希望我能在這個問題上提供更多幫助。
DS
回覆:建構多個神經網路模型另一件可能提供資訊的事情是:即使我有連續的 Y,我也會收到相同的訊息(無論驗證類型如何)。 奇怪的!
回覆:建構多個神經網路模型我剛剛在 Macbook Pro 上嘗試並得到了相同的 Outline box/arg 1 錯誤,但我注意到了一些事情:7 月的版本被命名為“3.0”。 您是否認為您已更新但隨後不小心上傳了舊版本?
回覆:建構多個神經網路模型驚人的! 讓我現在嘗試並報告。 事實證明,JMP 支持確實得出了相同的結論,所以我相信它現在會起作用。
回覆:建構多個神經網路模型你好@abmayfield ,
感謝您提供的文件,它幫助我找出錯誤所在。 這與我平庸的程式設計能力和對 JMP 中樹結構的完全理解有關(這方面我都是自學的)。 不管怎樣,最新版本的日期是正確的,我在七月初左右更新了一些內容,以考慮到擬合統計數據根據 Y 值的建模數據類型(例如數值)改變它們在樹結構中的位置的事實、序數或分類。 我幾乎 100% 的時間都在處理純數位回應,因此我沒有定期看到此錯誤。 為了正確提供其他建模類型資料的擬合統計信息,我需要修改它分配該變數的方式。 值得慶幸的是,從 JMP 方面來看,這一切都相當合乎邏輯,因此修改並不那麼困難。
附件是 ver3.0,無論您使用的作業系統或 JMP 版本為何,都應該解決此問題。 我認為支援不會有太大幫助,因為從某種意義上來說這是一個「第三方」程式碼。 不管怎樣,請嘗試這個 ver3.0,如果它繼續出現問題,請告訴我。
謝謝!,
DS
回覆:建構多個神經網路模型我嘗試了 JMP Pro 15,但仍然收到相同的錯誤訊息:
存取或評估 'Outline Box' 、Outline Box/*###*/(o_box) 時預期字元 arg 1
我從 7 月 10 日左右開始使用 GUI 版本 3。 那是最近的,對吧?
當我運行偵錯器時,它告訴我:「物件按鈕框無法識別發送的訊息;也許您的意思是其中之一...」然後它列出了一些替代方案。 但按鈕盒的形狀很好,所有按鈕都可以工作。
我認為你的樹狀結構參數可能是問題所在,但它是相同的作業系統(Catalina)。 我將聯繫技術支援。
回覆:建構多個神經網路模型我正在附加帶有 GUI 的日誌和表格(最後一個腳本)。 我嘗試了所有對我試圖預測的事情(Y)有意義的驗證類型。 通常情況下,我會在我的個人Macbook 上完成所有操作(一切正常),但這台電腦距離報廢還有幾週時間,所以我希望我能在這台更新、更好的Macbook Pro 上完成所有操作! 同時,我將嘗試一些事情。 There is a slight chance that I might have just copied and older version of the GUI (that still had bugs), which would be a simple fix, though I don't think that is the issue since, regardless, it worked on the other電腦. 如果您發現任何奇怪的事情,我會很好奇,並再次感謝您對此進行調查。
回覆:建構多個神經網路模型你好@abmayfield ,
我不得不說,對於它與 Air 而不是 Pro 一起工作來說,這是一些奇怪的行為。 如果我沒記錯的話,那個 o_box 呼叫是為了提取一些擬合的統計數據,它可以根據您使用的驗證方法類型而改變:保留、排除行等。 聽起來不像是 JMP 版本,因為兩者都運行 16.1。 您對兩台計算機使用相同的驗證方法嗎? 您使用哪一種方法?
我唯一的猜測是,如果從一個 Macbook 型號到下一個型號都不起作用,則報告的樹結構必鬚髮生變化,並且 JSL 代碼正在尋找位於特定位置的值,但它又回來了空或NAN 或其他東西,它會拋出錯誤。 這可能有點超出了我的編碼能力——使其獨立於作業系統可能超出了我的能力範圍。 我在 PC 上運行,Windows10。 我毫不懷疑 JMP 中有更熟練的程式設計師可以弄清楚如何解決這個問題,以便它可以在不同的作業系統上運行等等。
如果我可以重現該錯誤,那麼修復對我來說相對容易,但我無法存取 Macbook Pro。 同時,您可以在 Macbook Pro 上運行它並檢查日誌文件,看看它是否會告訴您它在哪一行程式碼處崩潰? 這可能會幫助我縮小錯誤的位置,並可能了解如何修復它。
謝謝!,
DS
回覆:建構多個神經網路模型G r吃。 非常感謝。 我確實注意到了一些事情今天:在我運行 Catalina 和 JMP Pro 16.1 的 13 吋 Macbook Air 上,一切正常。 然後,我遷移到我的工作 Macbook Pro 16 英寸,也運行 Catalina 和 JMP Pro 16.1,使用完全相同的數據表和 GUI,我在訪問或評估“大綱框”時得到了奇怪的“預期字符 arg 1” ,大綱框/*###*/(o_box)”,無論我輸入什麼。 您認為它實際上可以連結到顯示器(即更大的螢幕)嗎? 當然不是。 腳本在一台電腦上運行而不是在另一台電腦上運行似乎很奇怪。 有任何想法嗎?
回覆:建構多個神經網路模型你好@abmayfield ,
沒問題,我很高興它能有所幫助。 是的,調整 XGBoost 可能會涉及更多。 我找到了一個博客這裡這非常有用——該頁面上的最後一個部落格條目,但由於某種原因,部落格文章的連結沒有真正響應。 它提供瞭如何在 Python 中完成此操作的範例,但一旦您弄清楚了模型參數的術語,它在 JMP 中基本上是相同的。 我也發現了這個地點以及隨附的文件對於了解 XGBoost 的作用以及哪些參數使其或多或少保守模型非常有幫助。 我喜歡它的一件事是它比增強樹或隨機森林穩定得多。 這兩者在 R^2 中都有一些隨機行為,導致每次在所有參數相同的情況下運行擬合時,模型都會略有不同。 每次執行相同的參數集時,XGBoost 都會為您提供相同的擬合品質。
請隨意在您的 Discovery 演講中提及 NN GUI——我計劃虛擬參加,並打算嘗試親自去卡里參觀(我距離這裡只有一個小時的路程),但我認為由於大流行帶來的持續問題,他們停止了面對面的聚會。 我已經將 GUI 發佈到了加載項頁面,因此從技術上講,我猜它已經「發布」並在那裡了。 感謝您詢問並考慮甚至演示它。 希望能順利進行! 我不是最好的程式設計師,但我可以讓事情正常運作。 如果您遇到任何問題,請告訴我,我會盡力盡快糾正。
謝謝!,
DS
回覆:建構多個神經網路模型哇! 非常感謝r 表格和解釋。 我在想,既然我終於熟悉了所有的 NN 術語,XGBoost 就會輕而易舉,但似乎我還有很多東西要學(只是為了掌握術語)! 看起來 XGBoost 是目前機器學習世界的“寵兒”,但更重要的是,它實際上可能更適合我生成的資料類型,所以我絕對需要深入研究所有這一切(例如,當您的GUI 在後台運行時!)。 說到這裡,您介意我在 JMP Discovery 演講(我本週錄製)中提到 NN GUI,甚至很可能會示範它嗎? 我肯定會讚揚你,但如果你想成為向更多觀眾展示它的人並且不想“搶走你的風頭”,我完全理解。 我只會使用神經平台,因為我懷疑我會在星期五(當我錄製演講時)成為 XGBoost 的大師,哈哈。
回覆:建構多個神經網路模型你好@abmayfield ,
我還沒有升級到 16.1,所以我沒有遇到相同的錯誤,但我會密切關注以防發生這種情況,並在需要時發布任何更新。
至於 XGBoost,我確實有一個調整表來優化它。 它附在這裡。 XGBoost 平台有許多不同的可以修改的調整參數。 有些人比其他人更有影響力。 我通常會逐步調整模型,因為它的參數空間非常大。 我沒有調整表的所有可能參數,只有最有影響力的參數(您始終可以使用適當名稱的列添加更多參數)。 您可以透過開啟 XGBoost 視窗中的「進階選項」子選單來存取平台中的整個參數清單。 由於您提到您有一個高度不平衡的資料集,因此您需要確保將scale_pos_weight參數設為1。
事實上,您甚至可以從平臺本身運行調整設計,它將使用空間填充 DOE 來產生調整表。 它非常方便和靈活。 然而,我發現對於 CPU 使用和 RAM 最小化,在 JMP 中像 GUI 的工作方式一樣運行它會更好。
我發現對於我的情況,遵循以下步驟對於 XGBoost 非常有效:
1. 修復學習率、max_深度、min_child_weight、gamma、subsample 和 colsample_bytree,以先找到正確的樹數。 這些其他參數將在稍後調整。 我首先將它們設為預設值。
2. 調整 max_depth 和 min_child_weight
3.調整gamma(在進行步驟4之前重新調整樹的數量是個好主意)
4. 調整 subsample 和 colsample_bytree
5 調整 alpha 和 lambda,正規化參數
6. 調整學習率:降低學習率並增加樹的數量。
在每個步驟中,我都會為我希望調整的參數產生一個調整表,同時將其他參數固定在該步驟的值。 我通常會重複這個序列兩次。 在執行 XGBoost 時使用交叉驗證(K 摺或驗證列)至關重要。 您可以在沒有交叉驗證的情況下運行擬合,但是您可能會面臨資料過度擬合的風險,並且最終無法真正獲得那麼好的預測模型。
希望這可以幫助!,
DS
回覆:建構多個神經網路模型沒關係第一點。 我認為對我來說有些奇怪,或將樣本適當分層為訓練、驗證和測試。 基本上,我有一個完全不平衡的設計,其中我試圖預測的一組更為常見,所以我認為這是導致問題的原因!
回覆:建構多個神經網路模型升級到 JMP Po 16.1 後,我再次開始使用您的 NN GUI,並表示再次出現「下標範圍」錯誤。 您遇到過這個問題嗎?
另一方面,你們有 XGBoost 調整表的 DOE 腳本嗎? 我也將使用您的 GUI 來探索這種方法! 非常感謝
回覆:建構多個神經網路模型非常感謝您提供的所有資訊。 我確實會嘗試建立大量模型,但根本不知道自己在做什麼。 兩年前,我用另一種方法做到了這一點,當時正準備寫一篇《自然》文章,以為我已經改變了我們所知道的海洋生物學,然後我意識到我完全錯誤地解釋了模型,哈哈。 值得慶幸的是,人工智慧和機器學習模型在我工作的地方非常流行,所以,儘管我使用它們的動機是由傳統方法驅動的,而不是削減它(而不是我想做人工智慧,因為它很「性感」) ,我希望我能利用這股對這類分析的興趣,試著了解所有的來龍去脈。
回覆:建構多個神經網路模型你好@abmayfield ,
至於 XGBoost 插件,您需要單獨下載並安裝該插件。 它適用於 JMP Pro 15 及更高版本。 你可以找到插件這裡。 在繼續進行自己的建模之前,請務必閱讀文件並嘗試 Russ 在帖子中解釋的一些測試建模。 目前,該平台仍需要使用者對如何修改/操作擬合的超參數有更多的了解。 我找到了這個部落格在調整 XGBoost 平台時非常有幫助(有許多不同的參數需要調整,這使得整個空間相當麻煩)。 儘管它是為 python 用戶編寫的,但相同的基本想法也適用於 JMP 平台。 這影片也很有幫助,您還需要了解模型中每個參數的作用、其工作範圍是什麼,以及為什麼您可能想要或可能不想修改它的預設值這裡。 它絕對不是一個不做任何背景作業就可以直接進入的平台。 我一開始就發現了這一點,並意識到我不知道自己在做什麼。 所以,我做了一些作業,這很有幫助。 現在,我可以使用上面列出的部落格中的框架快速調整模型。
祝你好運!,
DS
回覆:建構多個神經網路模型非常感謝您的解釋,我很高興我問了這個問題,因為我的假設是錯誤的。 不過,更有意義的是,每次「運行」都會是一次隨機洗牌,即哪些樣本在訓練模型中,哪些樣本被保留。 正如您之前所說,對於我的小而寬的數據集,手動排除行或創建驗證列更有意義,所以實際上我只是想確保我“掌握”所有各種選項,因為希望在將來,我將擁有一個可以使用holdback和kfold的資料集。 我特別認為後者很有吸引力/很聰明。
我有大約 15,000 個帶有你們 GUI 的模型,這並不誇張。 現在我想我要嘗試比較 NN 和 XGBoost,這是我在 GUI 之前從未聽說過的技術。 我什至不知道它是否在 JMP Pro 16 中(儘管它可能隱藏在某個地方)!
回覆:建構多個神經網路模型你好@abmayfield ,
抱歉這麼晚才回复,上週我出去度假了。
關於您關於保留部分的問題,據我了解,JMP 將根據您的保留值隨機選擇行的百分比。 因此,如果您有 100 行並選擇 0.3 作為保留部分,則每次 JMP 執行 NN 平台時,它將選擇一組新的隨機 30 行作為驗證部分。 因此,就使用調優表而言,該平台稱為每次迭代,其中它向 NN 平台發送一組新的模型參數。 如果您選擇了保留選項進行驗證並輸入一個 0 到 1 範圍內的數字,則調整表中的每次新運行,JMP 將根據保留部分選擇一組不同的行。 但是,如果您在單一 NN 模型擬合期間執行多個遊覽,則它將在每個遊覽期間使用相同的保留行。 每次呼叫 NN 平台時,它都會產生一個新的子集進行驗證。 至少這是我的理解。
對於上述情況,不可能知道哪些行被保留(至少我不知道)。 如果您想做類似的事情,那麼我會選擇排除行保留驗證選項。 然後,您可以選擇應排除資料表中的哪些行,並且僅將這些行用於驗證。 據推測,您可以為 NN 平台提供特定的隨機種子(例如 10191),用於每次帶有保留部分的調整運行,並且每次都會使用該隨機數來產生用於驗證的子集。 由於每次呼叫 NN 平台時都從相同的隨機種子開始,理論上 JMP 最終應該為每次調優運行選擇相同的行。 然而,在這種情況下,您仍然不知道那些是哪些行。 再說一次,這是我對其工作原理的理解。
希望這可以幫助!,
DS
回覆:建構多個神經網路模型感謝您出色的 GUI,我現在已經運行了 10,000 多個模型。 我確實有一個關於保留的問題。 假設我的調優表有 100 行(即要測試的不同模型)。 每行是否根據百分比獲得隨機保留,或者每個模型是否保留相同的 X 個樣本? 我猜是後者。 換句話說,如果樣本 A、B、C 和 D 被模型 #1 阻止,那麼這四個樣本也會被模型 #2 阻止。 我想無論如何我的後續問題是:是否有可能知道哪些樣本被扣留? 無論如何,正如我們所討論的,在我的例子中,擁有一個分層驗證列確實更有意義,因為我可以確保每種處理中至少有一個樣本被包含在訓練、驗證和測試中,而理論上隨機30% 的保留可以僅保留來自相同處理的樣本(這會使預測偏向所述處理!
回覆:建構多個神經網路模型你好@abmayfield ,
我真的很高興聽到它對你有用,我希望這些錯誤已經解決。 我希望我有一個更好的解決方案來解決頂部數據表問題。 老實說,我不知道該如何解決這個問題。
不管怎樣,我相信你對 Kfold xvalidation 的看法是正確的。 這種方法通常適用於高桌子,但不適用於寬桌子。 如果您的資料條目很少,那麼使用對回應進行分層的驗證列是一個好主意。 或者,如果您使用 GenReg 平台,則可以使用留一法。 但通常情況下,如果您需要考慮的數據點很少,Kfold 並不是最好的選擇。
我絕對建議您研究一下 XGBoost,您可以從 JMP 上的插件頁面下載該插件。 這是一個非常穩定且穩健的演算法。 XGBoost 與驗證列配合得非常好。
您也可以考慮研究 JMP Pro 具有的支援向量機。 它最初是為分類問題而開發的,但也可以處理迴歸問題。 無論如何,使用未在模型訓練或驗證中使用的保留資料集來比較不同模型始終是一個好主意。 我通常會建立幾個不同的模型,然後在全新的資料集上比較它們,看看哪個模型最能預測結果。
很高興我能幫上忙!,
DS
回覆:建構多個神經網路模型這太棒了。 我正在對每種驗證方法進行 100 次迭代,但尚未遇到任何錯誤。 我還沒有嘗試過“排除行”,但我相信它會起作用。
kfold 總是給我相同的、完美的(過度擬合?)解決方案,儘管我認為這是對我的資料集的大小/格式的證明,而不是腳本的任何類型的錯誤。
從科學角度來說,我一直在做一些研究,看來我的「小」資料集(數十個樣本和數百個潛在預測因子)可能更適合XGBoost,否則神經網路可能會殺傷力過大,所以我將嘗試一下平台也是一樣。 我甚至根本不知道 JMP 支援 XGBoost(而我在 GUI 中見過隨機森林以及可能的其他方法)。 換句話說,我期待利用這個優秀研究工具的所有組件! 非常感謝您的幫助(再次),如果我遇到任何其他錯誤,我會告訴您。
回覆:建構多個神經網路模型你好@abmayfield ,
所以,我發現了我的編碼中的問題所在。 這不是從一個版本的 JMP 到另一個版本的問題,它與名義或有序回應有多少層級有關。 這會變更報告視窗中列號框的位置。 我需要調整程式碼以反映當從具有 2 或 3、或 4 或 6 個層級的回應進行處理時,擬合的統計資料會更改報告中的位置。 好處是,更改的數量與等級的數量相關,因此我能夠相對輕鬆地修復程式碼。 我花了一段時間才找出這個錯誤,因為我使用了範例資料中的 PowderMetallurgy 文件,但它只有兩個級別,而不是像你的那樣有 4 個級別。
附件是更新後的版本,它更通用化到不同層級的回應變數。 該代碼應該已經適用於 2 級或 3 級驗證列以及名目、序數和連續回應。
我使用您的資料集測試了所有適合的平台:NN、BT、Bootstrap Forest 和 XGBoost,它在所有資料類型和不同的驗證選項中都能正常運作。 請注意,目前,JMP 只能使用提升樹平台來擬合兩級回應(名目或序數)。 其他平台可以處理比這更多的層次。
我很確定它現在正在按預期工作(除了預設為最後打開的數據表 - 我不知道如何解決這個問題)。 但是,如果您確實發現其中存在錯誤,請告訴我。
謝謝,祝你好運!
DS
回覆:建構多個神經網路模型你好@abmayfield ,
我的數據表也有同樣的問題。 我認為你是對的,如果你不直接從建模的資料表運行它,它會以某種方式預設為 JMP 主視窗中最後打開的資料表。 我不知道如何解決這個問題。
嗯,程式碼應該與僅訓練和驗證或全部三個的驗證列一起使用。 我編寫它是為了檢查驗證列中的級別數並進行相應調整,這意味著無論有兩個級別還是三個級別,都要記錄適當的擬合統計資料。 明天我會仔細檢查一下。 我認為下標範圍錯誤很可能是由於15和16之間的變化造成的。 當 16 發佈時,我沒有回去仔細檢查程式碼以確保它有效,但我在 15 中對其進行了多次測試,一切正常。 儘管如此,我會解決這個問題並糾正問題,以便它按預期工作,只是直到週五早上我才有時間去做。
再次感謝您幫我調試程式碼,對於造成您的不便,我們深表歉意。 當我檢查了所有資料類型和代碼類型(就像我將其作為 JMP 插件提交時所做的那樣)後,我會回复您。
謝謝!,
DS
回覆:建構多個神經網路模型驚人的! 現在我們用火做菜。 我現在唯一看到的是,即使 GUI 要求你告訴它哪個是資料表,哪個是調整表,有時它仍然會把它們混淆。 我認為它預設為最接近“堆頂部”的表(我傾向於打開 10-20 個表,否則這可能不會成為問題)。
是否可以添加一個簡單的“規則”,即“如果驗證列只有訓練和驗證項,則不要計算測試資料”或類似的內容? 我想另一種方法是手動檢查程式碼並將“//”放在所有“測試”選項前面。 我問是因為有時我只使用訓練和驗證,而不是訓練/驗證/測試(因為我的樣本量很小)。如果您現在輸入僅包含訓練和驗證項目的驗證列,您會收到“下標範圍”錯誤,我認為這是因為它正在尋找不存在的“測試”資料!
回覆:建構多個神經網路模型你好@abmayfield ,
再次感謝您發現這一點並讓我知道——我的模型往往有數字響應,因此我通常不需要編輯標稱資料類型的內容。
無論如何,我認為從 JMP 15 到 16 可能發生了變化,導致報告視窗中出現不同的數字列框,因為我需要將所有相同的值從原來的值更改為現在的值,並且它之前在JMP 15 ,我記得我測試過它。 我已經重新檢查過,這個更新版本可以使用 NN 的不同驗證方法正確運行:排除行保留、保留、kfold 和驗證列。 對於造成您的不便,再次表示歉意。 我很高興您可以對其進行測試並讓我知道其中的錯誤,以便它可以變得更好並幫助其他人。 如果您發現其他任何內容,請告訴我!
謝謝!,
DS
回覆:建構多個神經網路模型感謝您對此進行研究,它現在可以與驗證列一起使用,但是當我使用holdback或kfold時,我得到相同的錯誤代碼。 我想知道是否是因為這些方法不一定將資料分層到我試圖預測的每個 bin 所代表的位置? 我將嘗試使用更大的資料集,看看是否出現相同的“下標範圍”錯誤。
回覆:建構多個神經網路模型你好@abmayfield ,
抱歉,過了一段時間才回覆您。 我能夠重現您遇到的錯誤,並找到我的程式碼中的錯誤所在。第 348 行和第 349 行的變數 ncol_box_v 和 ncol_box test 的值錯誤。 他們應該分別是 10 歲和 19 歲。 我已經糾正了這個問題,並使用驗證列重新運行了神經網絡,它按預期工作。 我附上更正後的代碼。 帶來不便敬請諒解。 感謝您發現這一點,如果您發現任何其他錯誤,請告訴我。
希望這可以幫助!,
DS
回覆:建構多個神經網路模型哇,這 GUI 真的升級了! 唯一的問題是現在我收到一個錯誤:“
無論我使用哪種驗證類型,存取或評估 'V_stats[ /*###*/5]' 、 V_stats[/*###*/5" 時的下標範圍。 我想知道是否是因為我的樣本量太小,無法為四組(如 Y)中的每一組提供訓練、驗證和測試樣本?
回覆:建構多個神經網路模型你好@abmayfield ,
不,我猜這是因為您選擇為單選按鈕選擇設定驗證列(相對於保留或排除保留等),但在將列轉換為所選列時忘記將驗證包含在列清單中角色。 這是我的猜測,但如果不是這樣,那麼我可能需要您提供逐步的描述。
我還對程式碼進行了一些更新,以糾正其他一些錯誤。 我的程式碼包括進度窗口,我認為您不想要它,但無論如何,我附加了新的 GenAt.jsl 文件,以便您可以獲得原始程式碼。 我一直使用它來協助我的建模——NN、提升樹、隨機森林和 XGBoost。 我喜歡它,但它確實需要從建模角度了解您正在做什麼以及不同平台允許您做什麼。
我不知道這是不是關聯會起作用,但我嘗試編寫有關如何將其用於加載項存儲庫的描述。 我知道我可以透過我的 SAS 帳戶訪問該鏈接,只是不確定其他人是否可以。 不過,它尚未在儲存庫上公開。
希望這可以幫助!,
DS
回覆:建構多個神經網路模型你好!
中斷 6 個月後,我又回到了 NN 工作,我注意到,當我嘗試運行 NN GUI 時,我收到一條新錯誤訊息:「Send 需要 Scriptable Object 存取『list』的評估,{/ *## #*/“驗證”})。” 您認為這可能是因為 JMP 15 和 16 之間的某些變更(即某些 JMP 15 腳本需要針對 JMP 16 進行修改嗎?)
回覆:建構多個神經網路模型太棒了! 當您發佈時請告訴我。 我肯定會嘗試一下,特別是因為我仍處於弄清楚該資料集的早期階段(儘管 NN 明顯優於我在 JMP Pro 16 上測試的所有其他模型類型)。 由於您所說的原因,我確實看到了不直接進入 NN 的價值,而且因為這對於減少響應變數來說並不是很好。 就我而言,我需要在每個樣本中重複測量同一組 30-40 種蛋白質(正如您所指出的,沒有丟失數據),與採用更傳統的候選生物標記方法(使用一個或只是一些預測因素)。 因此,我基本上只使用一些生物標記(通常使用 Gen-reg)來製作簡單、精簡的模型,並將它們與腳本中優化的神經網路模型進行比較。 在這種情況下,NN 更優越,但這並不是說它總是來自我未來收集的每個資料集! 期待嘗試 GUI、錯誤等等。
回覆:建構多個神經網路模型你好@abmayfield ,
我絕對同意你關於不要有過於複雜的模型的觀點。 這絕對是一個應該避免的問題。
我的看法是,神經網路建模與其他平台並沒有太大不同。 每一種都有其優點和缺點。 例如,神經網路在處理缺失資料方面並不是那麼出色,它們的計算可擴展性不是很好,而且眾所周知,它們難以解釋。 對於使用此類模型來幫助建立理論的人來說,這種解釋很重要。 神經網路也無法處理所有類型的資料集或不相關的輸入。 但是,模型中沒有任何假設,而且它們往往具有很高的預測能力。
但是,由於每種建模方法都有不同的優點/缺點,因此我傾向於跨不同平台進行建模,然後在新資料集上將每個平台的最佳模型與彼此進行比較,以了解哪種模型在預測結果方面表現最佳。新資料集並使用該資料集。
話雖這麼說,我剛剛完成了 GUI 介面的 1.0 版,該介面可以從 JMP 選單熱按鈕運行(而不僅僅是從資料表中運行)。 您向其提供資料表和調整表,並根據您選擇的四種方法(NN、提升樹、引導森林、XGBoost)中的哪一種,它將運行您根據調整表發送的擬合次數。 它將適用於 Y 輸入的不同資料類型和不同的驗證列類型,甚至適用於 XGBoost 平台的多個驗證列。 它絕不是沒有錯誤的,但我很高興在發布 NN 平台的第一個 GUI 後一周左右的時間裡它就可以工作了。 它確實要求使用者了解每個平台要使用哪個調整表以及其他平台的特定要求 - 就像必須知道 JMP 中的提升樹平台不能處理超過 2 級的名目/序數資料(至少對於JMP 15)或者XGBoost 平台可以使用多個驗證列,但每個驗證列必須只有2 個等級。
從事這個專案很有趣,並將對我未來的工作有所幫助。 謝謝!
祝你好運,
DS
回覆:建構多個神經網路模型我認為部分原因可能與以下事實有關:對於許多建模類型,建立越來越複雜的模型並不是您想要做的:如果一個簡單的模型很好地適合您的數據,並且驗證或測試RSME 值是低,然後就停在那裡。 但對於神經網路來說,添加層、節點、增強、遊覽等不一定是壞事,因為雖然更複雜,但它們也更靈活。 所以我可以理解為什麼為所有建模平台提供這個 GUI 可能會導致那些不熟悉建模的人進行徹底的資料探勘,從而對他們造成損害。 不過,根據我對NN 的有限理解,如果一個模型在TanH=3 的預設條件下具有可觀的驗證RSME,而另一個模型在兩個隱藏層上具有3 個TanH、3 個線性節點和3 個高斯節點,但具有類似的RSME,您不會自動拒絕後一個模型,因為它更複雜,但在 RSME 方面同樣足夠,因為它最終可能對未來的測試資料集更加靈活。 因此,大多數人很可能會很好地建立數百到數千個神經網路模型。 不過,我完全有可能錯了,神經網路與其他建模類型沒有什麼不同,在其他建模類型中,在其他條件相同的情況下,簡單更好。 我只是吐槽為什麼你沒有看到更多的人嘗試優化神經網路輸入參數:是出於對資料探勘的無知或恐懼嗎?
回覆:建構多個神經網路模型你好@abmayfield ,
感謝您的回饋和客氣話。 是的,我也遇到了這個問題,如果它不是“在頂部”,它就會拉出錯誤的資料表。 我根本不知道為什麼它會這樣做。 當我在新視窗中調用某些內容以便稍後傳遞到合適部分時,它的回應方式也很有趣。 「取消」按鈕沒有像我預期的那樣工作,「幫助」按鈕現在也沒有去任何地方,但這是一個開始! 我認為腳本專家可以輕鬆修復這些錯誤並使其按預期工作。 也許當我將其設定為在更多平台上運行並且不存在這些錯誤時,我可以將其發佈到加載項頁面。 如果能將其納入 JMP 將是一種榮幸。
它確實對我的工作有幫助,因為它將使調整模型的流程更加自動化和簡化。 我本來想為 NN 平台做一些事情,但一直推遲到你的帖子,現在我已經製作了 GUI,我想對此進行擴展,使其更具跨功能性。 調整大量模型並僅關注統計數據的能力確實有助於縮小超參數空間,以便更輕鬆地比較不同平台上的模型,並了解哪個最適合預測新數據。 然後,您可以返回並在標準平台中運行最佳設置,並獲得 JMP 提供的所有豐富的圖形回饋來視覺化模型和所有其他內容。
祝你好運!,
DS
回覆:建構多個神經網路模型哇! 現在這真的很棒。 唯一的小問題是,如果腳本視窗位於「調整」表的正上方,它會「呼叫」模型視窗中的調整表而不是資料表。 只要資料表和腳本位於螢幕的最前面,它就會正確載入模型項目。 事實上,我在短短幾分鐘內就運行了 100 個模型。 不知能否將其放在JMP網站上的“add-in”depot(忘記了實際名稱)上,以便得到更廣泛的關注。 我確信這對很多人有幫助(如果不是立即,那麼將來會有更多人看到神經網路在模型建構中的實用性)。 天哪,它可能應該以某種形式進入 JMP Pro 17(對於 16 來說可能為時已晚)。 非常感謝您的所有幫助,我希望這也對您自己的研究有所幫助。
回覆:建構多個神經網路模型你好@abmayfield ,
我希望 JMP 和/或電腦重新設定能夠解決問題。 如果沒有,我還回去為神經網路建模建立了一個 GUI——我計劃將其擴展為跨不同平台工作。 它不能完美地工作,有時我會遇到一些奇怪的錯誤(專家腳本編寫者可能可以在幾秒鐘內調試它)。 但是,好處是它可以處理任何類型的輸入資料列——序數、名義和連續,並且它可以處理 NN 可接受的驗證方法——排除行、保留、Kfold 和驗證列。 它將適用於包含測試資料和不包含測試資料的驗證列。 這是資料表中名為 NN GUI 的腳本(附後)。
對於有興趣的人,我在部落格上大量借用了 JMP 員工的內容.@juliagong (退休)這裡以及來自的支持說明.@Wendy_Murphrey這裡。 我計劃創建一個 GUI,可以為其他平台(我也從資料表中實現自動化)自動執行此操作:boosted 樹、bootstrap 森林和 XGBoost。 我計劃將其發佈在社區中,但這可能需要一些時間 - 特別是要確保它已完全調試。
從下列程式碼到資料表中 GUI 的唯一變更是將 dt = 資料表 ("...") 變更為 dt = 目前資料表()。
我希望這有助於您的工作取得進展。 它對我有用,因為我可以改進它,使我的建模工作也更容易!
祝你好運,
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>回覆:建構多個神經網路模型嗯,我下載了你的新表格,現在我每次都會收到大綱框錯誤。 我將嘗試重新啟動 JMP,然後重新啟動電腦。 這似乎很奇怪,它對你有效,但對我無效!
回覆:建構多個神經網路模型你好@abmayfield ,
我重新發布此內容是因為我嘗試編輯的原始帖子似乎不知何故丟失了。 感謝您分享數據表,它有助於解決問題。
無論如何,我做了一些改變,所以有幾點需要注意:
- 我這樣做是為了讓單一程式碼可以在序數、名義和連續建模類型上運行。 不再需要兩個不同的版本。
- 您需要透過在引號之間輸入列名稱來編輯變數 y_resp,它是 Y 回應列(請參閱第 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
回覆:建構多個神經網路模型你好@abmayfield ,
感謝分享數據表。 我找到了一些東西。
- 找出錯誤所在,它不斷寫入日誌視窗並修復它。 它在 str 調用中。 必須將括號移到不同的位置。
- 我發現在進行K-fold或Holdback時,需要將Validation()改為Validation Method()。 然後它就會工作並適當地比例數據。
- 我重新編碼了它如何測試列的建模類型並進行了一些相關的更改。
- 我還編寫了它,以便相同的程式碼可用於名義、序數和連續。 只需更改變數 y_resp(Y 回應列名稱)即可完成此操作。 剩下的一切它都會自動完成。
- 我還在結果資料表中新增了一個標題,該標題隨「主機」資料表和驗證類型而變化,以便您可以運行所有三種方法,並且不會受到 JMP 的命名幹擾。
- 現在可以將資料表中的三個 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
回覆:建構多個神經網路模型有點奇怪。 如果我繼續運行腳本,它最終會起作用!
另一個奇怪的事情是:無論我將保留百分比更改為多少,它總是給我 11 次訓練和 9 次驗證(~55/45%)。 是不是不可能做到 70/30%? 我有一種強烈的感覺,這是因為我只是錯誤地輸入了命令,而不是不可能!
回覆:建構多個神經網路模型你好@abmayfield ,
輪廓框錯誤可能是由於它嘗試從 NN 視窗取得統計值時產生的。 可以分享一下新的資料表和程式碼嗎? 我可以對其進行故障排除,看看是否可以更輕鬆地將其從一個資料表移植到另一個資料表。
我認為這可能與我如何設定該部分以檢查資料列類型並使 ncol_box 變數具有不同的值有關。 如果是名目值,則該值與序數值甚至數字值不同。
如果您可以分享出現此錯誤的資料表和程式碼,我相信我可以修復它。 如果需要,您可以將資料表匿名化:表 > 匿名化。
DS
回覆:建構多個神經網路模型太好了。 這回答了我的一些額外問題。 現在,我唯一遇到的問題是,當我在新的資料表中複製、貼上和運行腳本時,出現大綱框錯誤,您在腳本註釋中提到了這一點。 “存取或評估大綱框時需要字元 arg 1。” 這意味著什麼?? 我增加和減少了數字,但每次都會收到相同的錯誤訊息,並且腳本不會運行。 我甚至不知道輪廓框是什麼。 奇怪的是樹狀結構是相同的。 我剛剛更改了文件名。 文件名較長。 也許這意味著我需要一個更大的輪廓框?回覆:建構多個神經網路模型你好@abmayfield ,
如果您返回並查看腳本,第二行定義了分析期間要使用的資料表。 JSL 程式碼 dt = Current Data Table() 定義了一個局部變數“dt”,然後在腳本的其餘部分中使用該變量,而不必按名稱呼叫資料表。 同樣,dt_parms 是分配給 NN 調整表“NN 調整”的局部變數。 這兩個表實際上是您提供給腳本的唯一內容。 其餘的都是內部的。
如果您將 JSL 程式碼複製/貼上到新的資料表中,它應該會自動工作,因為您正在該資料表中本地運行它。
您不應該修改呼叫 dt << Nerual(),除非定義 Y() 和 X(),也許也定義 Validation() 方法。 JSL 程式碼 dt << Nerual() 是一個指令,告訴 JMP 對資料表「dt」執行 NN 建模。 因此,dt 的定義位於程式碼的開頭。
您還需要修改 w = Window() 呼叫以反映 NN 報告視窗的標題及其下方的 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
回覆:建構多個神經網路模型我有一個(可能很簡單)腳本問題。 假設我想將輸入 dt 更改為另一個。 難道我不應該複製並貼上腳本,然後將“Neural”中的 dt 替換為其他內容嗎?
str = Eval Insert(
"report = (dt << Neural (
Y( :health designation ),
X(
如果我刪除原始的“神經”檔案並將其替換為具有完全相同資訊和不同名稱的另一個表,則腳本將無法工作! 是否有必要在兩個數據表中擁有完全相同的數據,其中一個數據表名為“Neural”? 也許我錯過了那部分!
回覆:建構多個神經網路模型很高興聽到它對你有用。 祝建模順利! 您可能還想檢查其他模型平台,然後比較測試資料集上的模型,看看哪個是最佳預測變數。
DS回覆:建構多個神經網路模型哇,我簡直不敢相信,多虧了您的腳本幫助,我在午餐前就運行了 300 個神經網路模型。 我希望這一點能夠得到重視並獲得“榮譽”,正如我想像的那樣,當越來越多的人開始看到NN 平台的價值時,他們會傾向於這樣的東西,特別是如果它是一個全新的資料集,而你並不真正了解它的話。知道在哪裡「潛入」大量令人眼花繚亂的神經網路模型輸入參數,這些參數可以稍微調整(有時即使只是增加學習率,例如從0.05 到0.1,有時也會導致巨大的差異)。 接下來我將嘗試不同的驗證方法(驗證列、保留和 KFold)。 鑑於我(目前)的樣本量較小(希望使用這些初步數據來獲得資金來添加更多“行”,即珊瑚),絕對需要小心。
回覆:建構多個神經網路模型你好@abmayfield ,
Kfold 也是驗證短資料集的另一種好方法。 是的,您可以將行排除設為行狀態,您可以透過選擇「測試」資料集並將行狀態設為「排除」來完成此操作。 如果您使用 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
回覆:建構多個神經網路模型更多優秀的建議,尤其是關於驗證類型的建議。 我看到 Neural 支援保留、Kfold 或行排除(因此我猜測我只是隨機選擇幾行來省略)。 如果我想要更改腳本來更改驗證類型,我是否只需更改“Validation (:Validation with test)”行? 在 JMP 看來,保留的樣本是否等同於驗證樣本? 如果沒有,我需要刪除驗證列(或重新命名它們),並且測試列也必須刪除。
回覆:建構多個神經網路模型你好@abmayfield ,
很高興它解決了您的問題。
透過基於樹的建模(XGBoost、提升樹和引導森林),您可以輕鬆使用 JMP 中的調整表 GUI 來運行許多模型。 但是,它的一個缺點是它會佔用大量記憶體。 以這種方式運行它的好處是,您可以運行數十個數千個不同的參數設置,並且它不會消耗太多內存,只是消耗 CPU。 我已經使用引導森林運行了多達 40k 種不同的設定(速度很慢),並且在我的工作筆記型電腦(32 GB RAM 和 2GHz CPU)上可能需要幾天時間。
我也是 JMP 16 的早期採用者,模型篩選很好,但正如您所指出的,它沒有調整任何模型,這可能有點誤導。 它僅使用預設設置,這並不總是創建預測模型的最佳設定。 它至少可以幫助您確定哪些平台值得花時間進一步調整,哪些不值得研究。
您可能還想考慮使用 SVM 平台對標稱資料進行建模,因為這對於此類資料來說也是一種很好的方法。
至於模擬器,這是不同的,它是一種用不同的初始條件(隨機化)來測試估計值的方法。 這給出了估計值的分佈,並為您提供了原始估計的置信區間,然後您可以決定具有給定估計值的模型是否良好。
至於 DOE,您可以進行階乘,甚至可以透過適當設定因子來運行空間填充設計,而且我認為該平台還允許條件約束。 此外,您可能會考慮對預測變量進行預測篩選或引導,看看您是否確實需要全部 89 個預測變量,或者是否真的只能使用較小的子集。
最後一點,由於您有一個短而寬的資料表,您可能需要考慮使用留一方法進行驗證,而不是使用驗證列。 如果您這樣做,則必須為此編輯腳本。
祝你好運!,
DS
回覆:建構多個神經網路模型啊哈! 非常感謝你為我重新做這件事。 我顯然沒有腳本知識,所以我只是將“Neural”更改為我的數據表的名稱......這顯然是行不通的。 當我將資料表的名稱更改為“神經”、添加測試列並進行您建議的其他更改後,它就起作用了。
現在我可能做的是使用 DOE 進行條件因子設計(因為,正如您所指出的,您無法使用多個隱藏層進行提升)並在我的工作計算機上運行數百個模型(以免對我的 8 - GB RAM 筆記型電腦)。
我覺得你的腳本需要成為一個 GUI 或插件(有人接受嗎?)。 我正在測試JMP Pro 16,它有一個非常出色的「模型篩選」工具,但我認為它會跨建模類型(例如PLS 與Gen-Reg)進行測試,而不是在可能的數千個模型中進行測試。建立在每個建模類型中(否則它可能永遠不會停止運行)。 我聽說過“模擬器”,但我認為它正在做一些不同的事情(不會產生大量的模擬模型),儘管我可能是錯的。 再次非常感謝您的幫忙。 這肯定會節省我幾天的時間!
回覆:建構多個神經網路模型你好@abmayfield ,
感謝您分享數據表,它有助於調試您在腳本中所做的更改。
我注意到一些事情:
- 您需要為要記錄的「測試」資料集統計資料新增其他欄位。
- 你不小心刪除了imax的定義,它是參數表的行數
- 您還意外地更改了對 NN 平台的調用,其中腳本中顯示 dt << Neural(),這是它發送命令以對資料表「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
回覆:建構多個神經網路模型好吧,我失敗了,但我認為這可能是因為一些微小的腳本錯誤。 我使用了您的神經網路調整表和我的資料(附後)並進行了所有必要的更新(我使用了三個訓練+驗證+測試樣本)。 如果您執行最後一個腳本(「神經網路比較」),它將建立新表,但不會執行任何分析。 我只是包含了一些 X 術語,但實際上它是「標準化資料」群組中的所有 86 列。 當我使用調試器時,它說出現問題
」為了(我= 1 ,i <= imax,i++,」區域。 我希望/猜測更有能力的編劇可能可以在幾秒鐘內找到問題!
回覆:建構多個神經網路模型是的! 這正是我想要的:一個包含與 NN 平台同步的所有 NN 輸入參數(例如,TanH 節點數、層數等)的表。 我還沒有嘗試過,我確實想像這需要一段時間,但我使用的是一個小型的 20 個樣本 x 90 預測器「練習」資料集,所以它可能是可行的。 事實上,我實際上只發現激活類型和節點數量(以及遊覽數量)實際上降低了我的 RMSE,而提升並沒有多大幫助。 但即便如此,這也會比我計劃運行的所有約 500 個模型快得多(幸好沒有我昨天打算運行的那麼多,因為我想保持在 4 個節點/激活類型以下)。 明天我會嘗試一下,讓大家知道效果如何。
回覆:建構多個神經網路模型你好@abmayfield ,
這是我一段時間以來一直想寫的腳本,而且非常有趣,你的貼文激發了它的熱情,謝謝! 一段時間以來我一直希望有一種方法來調整神經網路平台,因為它對初始條件非常敏感,而且手動調整速度相當慢。
因此,我改編了一些為其他模型平台製作的腳本,以自動化其調整過程,例如提升樹、引導森林和 XGBoost 平台。 這些腳本旨在保存到資料表中並使用綠色熱按鈕運行。
希望您了解一些有關腳本編寫的知識,並且知道在哪裡使這些腳本適應您的特定情況/資料結構/列名稱等。 我已經輸入了一些評論,試圖幫助解釋我在每個更大的組中所做的事情。 我附上兩個腳本——一個用於連續 Y,另一個用於名義/序數 Y。 我確實必須包含一個測試來查看輸出 Y 是名義的還是序數的,因為 Number Col Box() 值會根據此而變化。 我使用範例資料中的 Big Class Families.jmp 資料表作為測試資料集。 我還包括使用數值 NN 調整或名目/序數 NN 調整生成的兩個輸出資料表。 我使用 :age、:weight:、:height 對 :sex 進行了標稱,然後將 :age 從 Ordinal 更改為 Continuous,並使用 :weight 和 :sex 建模年齡以進行連續 NN 調整。擬合度和統計數據都很糟糕,但它的目的只是為了看看 JSL 是否有效。 我還透過對 :age 進行分層,向資料表添加了 :Validation 列,只是為了檢查其是否全部正常運作。
我確信其他人可以更優雅地編寫腳本來測試 Y() 輸入列是否為連續、名義或序數建模類型,然後插入適當的 Number Col Box() 值,以僅使用單個 JSL 程式碼。
您需要編輯 dt << Nerual() 部分以及獲取報告視窗名稱的部分的 Y() 和 X() 輸入,因為它以您正在建模的變數命名。
原則上,NN 調整表可以像空間填充 DOE 一樣處理,其中下限和上限設定是您想要設定的任何值,除了其中一些,例如 N_Layers 只能為 1 或 2,因為 JMP 只允許 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>
我不明白的一件奇怪的事情是,當我在 NN 平台上運行它時,我收到了有關我創建的日誌視窗的警告,但我從未從其他平台上收到過它。 我無法追蹤該警告的來源,但它仍然正確運行。 也許有人可以修復我的程式碼的那部分?
出乎意料 ",". 可能少了一個「)」。
試著解析“<<”運算符的操作數。
第 23 行第 10 欄:))►,
最後一點:請小心設置,因為如果您有大量的提升、遊覽或傳遞函數,則運行建模可能需要很長時間。 只是要小心不要太過分。
希望這可以幫助!,
DS
回覆:建構多個神經網路模型順便說一句,讓所有相關功能顯示與您主動選擇的功能相同的資訊的「選項」技巧實際上是 Mac 上的「命令」技巧(因此以前不起作用)。
回覆:建構多個神經網路模型馬克,謝謝你的建議。 第二個是我嘗試過的,但失敗了。 我知道其他平台上的“製作組合表”選項,但也許由於某種原因它被排除在神經平台之外。 奇怪的是,「選項」技巧,即你按住選項鍵,進行選擇,它適用於報告的所有部分,在神經平台中不起作用,或者可以加快速度。
如果我可以將我的神經網路參數(#nodes、#tours 等)作為 DOE 中的 X,以最小化 RSME 為目標,那就太酷了,但這似乎是不可能的,因為您必須輸入神經模型啟動中特定框中的參數。 您必須執行一些非常高級的腳本,即使這樣,我也不確定 DOE 和 Neural 是否可以正常溝通。 但是,如果有人知道我可以讓神經平台基本上運行此螢幕截圖中反映的模型(作為總計的子選擇)的方法,我將不勝感激。 換句話說,第一個螢幕截圖中的值需要轉到第二個螢幕截圖中的對應輸入框(即神經模型啟動)。
回覆:建構多個神經網路模型您可以設計一個較少程度的實驗來擬合 RMSE 的二階模型,然後使用該模型來最佳化設定。 此外,您還可以依序製作每個模型,然後透過右鍵單擊其中一個結果表並選擇「產生組合表」來一次提取所有結果。