為了充分利用 Python 在 JMP 中的強大功能,我們面臨著如何將 Python 的靈活性與 JMP 直覺且互動式的使用者體驗結合的挑戰。在 JMP 18 之前,我們透過一種變通方法來實現這一點——在伺服器上運行 Python 來繞過 JMP 繁瑣的 Python 整合。然而,JMP 18 的發布重新引入了 Python 集成,簡化了這個過程。
基於我們最初讓 JMP 使用者無需程式設計專業知識即可利用 Python 的理念,我們開發了 JMPyFacade (JMPy)。該工具提供了一個與 JMP 類似的熟悉介面,使用者可以透過動態生成的使用者介面執行預先定義的 Python 服務,同時抽象化底層 Python 和 JSL 程式碼。
本次演講將探討 JMPyFacade 的技術架構,並展示它如何有效地彌合 JMP 和 Python 之間的鴻溝。與會者將學習如何在 JMP 中利用 Python 進行高效且引人入勝的數據分析。
大家好,歡迎觀看我的海報展示,主題是「JMP與Python的無縫銜接,打造引人入勝的分析體驗」。我叫Jarmo Hirvonen,在芬蘭的Murata公司工作。在這張海報中,我將解釋為什麼要在JMP中使用Python,或者為什麼要將Python整合到JMP中。關於集成,需要注意一些事項,以及我和我的同事Eero在芬蘭Murata公司開發的一個利用此集成的應用程式。首先,讓我們來探討為什麼要在JMP中使用這項功能。
JMP是一款可視化程度高、互動性強且分析能力優異的工具。另一方面,Python基本上是許多資料相關任務的事實標準程式語言。它擁有許多非常成熟的程式庫,而且貴公司可能已經擁有自己的Python開發能力。
我從兩個角度來看這個問題。首先,我們的一些首批使用者將能夠使用JMP本身不具備的功能,例如一些機器學習模型(例如Torch),其次,他們還可以存取JMP原本無法使用的檔案類型。
例如,Parquet 檔案就是一個例子,你可以用 Python 開啟它們,然後透過整合匯入到 JMP 中。這樣,Python 使用者就可以存取 JMP 的視覺化和互動式工具,可以直接在 JMP 中使用,也可以透過 Python 端以某種整合方式使用。當然,JMP 也提供了一些獨特的分析功能。關於 JMP 和 Python 的集成,需要注意的是,Python 是隨 JMP 18 一起安裝的。
每個 JMP 實例首次載入時速度會比較慢。也就是說,場地首次載入到 JMP 實例中需要一些時間,但下次載入時,如果您不完全關閉 JMP,速度就會快很多。如果您只是進行一些非常小的操作,則可能需要考慮這一點。嘗試僅使用 JSL 編寫程式碼可能更值得,因為它速度更快。
資料包管理和安裝有時會引發一些問題,雖然有相關的文檔,但解決起來可能有點麻煩。您只有一個環境,所以如果您習慣使用虛擬環境,目前無法在作業整合中實現。您需要對 JSL 和 Python 資料類型轉換有一定的了解,相關文件可以在某個網頁上找到。作用域可能會讓人困惑,或者有點讓人摸不著頭腦。 Python 基本上是全域作用域,根據您命名變數的方式,它們可能會在不同的腳本之間相互幹擾。
最後,我認為,Python 調試和開發最大的問題之一在於它可能會讓人感到有些惱火,而且很難進入工作狀態。這主要是因為你無法像在 JMP 中那樣重置 Python 或重啟內核,最終陷入一種「開發循環」。例如,你用 Python 開發,然後想要測試,這時你又懷疑某些變數需要清理,例如。
目前唯一的方法是關閉 JMP 實例,重新執行 JMP,然後重新載入所有內容,之後才能測試程式碼。這不是一個循環,它基本上在這裡中斷了,你必須從頭開始重新執行整個流程。這會打斷流程,令人沮喪。你可以透過寫 Python 程式碼的方式來稍微緩解這個問題。
接下來談談我們的應用,那麼 JMPyFacade 是什麼呢?首先,它的名字來自於它將複雜的 JMP 和 Python 程式碼封裝在一個與 JMP 非常相似、非常熟悉的使用者介面之後。它添加了版本控制功能,使 JMP 使用者能夠存取預先設定的 Python 功能。我們稱這些功能為「服務」。這些服務涵蓋了從非常簡單的資料集創建到更複雜的學習模型等各種功能。 [聽不清楚 00:04:34]
我們希望讓 JMP 使用者能夠在幾乎不知情的情況下使用 Python 功能。之前我們也做過類似的事情,但當時我們是透過伺服器繞過 JMP 的 Python 集成,因為之前的集成使用起來比較複雜。現在有了 JMP 18,我們可以使用原生集成,而且效果非常好。
當使用者執行應用程式時,流程如下:首先執行插件,然後檢查資料是否已更新。如果資料未更新,則進行更新,使用者需要重新執行插件。如果仍然找不到更新,則會在 JMP 中初始化 LS Python。此步驟的主要目的是更新訂單。如果使用者沒有執行此步驟,則執行類似這樣的應用程式可能會導致一些問題(例如,如果訂單不存在)。
完成這些初始化後,我們會檢查資料包管理系統,看看是否有需要更新的資料包。如果需要更新,我們會進行更新;如果沒有需要更新的資料包,則繼續執行後續步驟。我們會檢查使用者是否開啟了表格。如果沒有開啟表格,我們會關閉外掛程式並通知用戶,請先開啟表格再執行此程式。目前這樣做是因為我們基本上只支援單一靜態表格。
然後,當使用者開啟一個表格並想要進行分析時,我們需要匯入對應的套件。如果出現問題,程式會停止運作並顯示日誌,說明哪裡出了問題。如果導入成功,我們會初始化使用者介面,建立使用者介面,使用者就可以開始使用該工具了。如果使用者介面已經存在於 JMP 實例中,我們會直接將其顯示在前台,而無需進行任何初始化操作。
簡單介紹一下它的工作原理:我們在後台使用了資料類型、JMP 類,然後在 Python 端使用了 Pydantic 套件來建立我們使用的模型,並進行類型驗證和資料驗證。
這裡我們以 HDBSCAN 為例,例如這裡的 features 參數,它是一個字串列表,字段長度至少為 1,並使用 JSON Schema,其中包含數值列。當 JMP 接收到此參數時,它會建立相應的類,因此您會看到一個按鈕、一個列列錶框,使用者必須輸入一個數值(至少需要一個數值列才能正常工作),並且針對不同類型的資料(例如整數、數字框、布林值複選框等)使用不同的元素。
當使用者準備運行服務時,他們填寫相應的列,點擊「運行服務」按鈕。此時,JMP 程式碼會建立一個資料子集,其中包含這些列,並提取未被排除的列。然後,當呼叫 Python 函數時,會使用這些未被排除的欄位。這樣做可以簡化 Python 端的管理,因此我們採用了這種方式。
Python 會運行其演算法,並將值更新到子集中。當子集和 Python 回傳一些值後,JMP 就知道「好了,現在可以更新原始表了」。它會更新原始表,關閉子集,然後為原始表建立一些表腳本和列屬性。基本上,每次使用者執行服務時,如果需要建立列,它都會向表中建立新列。
接下來是一些使用範例,這是一個基本範例。用戶運行該插件,它會檢查版本控制系統。在本例中,使用者希望透過該外掛程式運行 tSNE,因此他們從左側選擇 tSNE,輸入列,並查閱文件。這是 tSNE 的官方文檔,例如,如果他們想了解它的工作原理、功能和參數。當使用者準備好運行服務時,他們點擊「運行服務」按鈕,新列將新增到 JMP 表中,現在他們只需像使用普通的 JMP 按鈕一樣操作這些新列即可。
然後我們也會查看報告腳本,在本例中它只包含輸入參數。這裡有一些更複雜、更繁瑣或更全面的範例。本次示範採用的是互動模式。在我看來,這是我們這裡最好的功能之一。這些功能不會總是建立新列,而是更新靜態列,並且當使用者在使用者介面中變更任何值時,它們會立即重新執行其演算法(Python 演算法)。例如,您可以使用此功能匯出資料分析或微調演算法。
在這裡,使用者只需點擊鍵盤上的向上箭頭,Python 演算法就會不斷重新運行,聚類結果也會根據使用者更新的值而改變。這裡視圖越多,元件就越會變化,因此根據你輸入的值,你會得到完全不同的聚類結果。你可以在這裡互動式地修改值,找出在這種情況下最佳的值,然後回到 Python 中使用這些值。
然後我們有一個特徵重要性服務,它利用多種演算法,並使用 Shapley 值來確定哪些特徵對於建模或預測最為重要。我們運行模型,得到 Shapley 值(聽不清楚 00:10:32),以及我們所選演算法的排名。在這個例子中,我們選擇了 RGBM、XGBoost 和 AdaBoost。使用者可以從這裡複製貼上這些值,然後在 JMP 中使用這些欄位開始建模。
最後,讓我們來談談這個工具的未來發展方向:增加對動態表格的支援(目前我們只有一個靜態表格)、更多服務、影像分析以及我們自訂的機器學習模型。改進互動性,使 Python 可以直接建立或更新圖形腳本。支援匯出和匯入 Python 模型。利用 JMP 強大的 DOE 功能進行參數微調。建立管道,以便按順序運行多個服務。改進我們現有的動態功能,並根據 JMP19 的更新內容進行一些可能的重構,從而進一步完善該工具。此外,我們也可以討論開源該工具,讓更多人參與工具的開發。謝謝。