JMPでPythonの豊富な機能を活用するために、私たちはPythonの柔軟性とJMPの直感的でインタラクティブなユーザーエクスペリエンスを統合するという課題に直面しました。JMP 18以前は、JMPの煩雑なPython統合を回避するために、サーバー上でPythonを実行するという回避策でこの課題に対応していました。しかし、JMP 18のリリースによりPython統合が再導入され、このプロセスが簡素化されました。
JMPユーザーがプログラミングの専門知識を必要とせずにPythonを活用できるようにするという当初のコンセプトに基づき、JMPyFacade(JMPy)を開発しました。このツールは、JMPに類似した使い慣れたインターフェースを提供し、動的に生成されるユーザーインターフェースを介して事前定義されたPythonサービスを実行できます。同時に、基盤となるPythonおよびJSLコードは抽象化されています。
このプレゼンテーションでは、JMPyFacadeの技術アーキテクチャを解説し、JMPとPythonのギャップを効果的に埋める仕組みを実演します。参加者は、JMP内でPythonを活用して、効率的かつ魅力的なデータ分析を行う方法を学ぶことができます。
こんにちは。JMPとPythonの連携によるシームレスで魅力的な分析に関するポスタープレゼンテーションへようこそ。フィンランドのムラタで働いているJarmo Hirvonenと申します。このポスターでは、JMPでPythonを活用する理由、あるいはJMPへのPython統合についてご説明します。統合に関する注意点、そしてフィンランドのムラタで私と同僚のEeroが開発した、この統合を活用したアプリケーションの一つをご紹介します。まずは、なぜJMPでこの機能を活用するのか、その理由からお話ししましょう。
JMPは非常に視覚的でインタラクティブなツールであり、優れた分析機能を備えています。一方、Pythonは多くのデータ関連タスクにおいて事実上のデファクトプログラミング言語です。Pythonには確立されたライブラリが数多くあり、企業独自のPython機能を備えている可能性もあります。
私はこれを2つの観点から見ています。まず、JMPではネイティブでは利用できない機能、例えばTorchなどの機械学習モデルにアクセスできるユーザーがいます。そして、JMPでは本来利用できないファイル形式にもアクセスできるようになります。
一例として、ParquetファイルをPythonで開き、JMPとの統合機能を通じて取り込むことができます。Pythonを初めて使用するユーザーは、JMPの視覚的かつインタラクティブなツールにアクセスし、JMP内で直接、またはPython側から統合された方法で活用できます。もちろん、JMPでしか利用できない分析機能もいくつかあります。JMPとPythonの統合に関して注意すべき点は、PythonはJMP 18にインストールされるということです。
JMPインスタンスごとの初期読み込みは少し遅いです。つまり、会場がJMPインスタンスに最初に読み込まれるときには多少時間がかかりますが、JMPを完全に閉じなければ、次の読み込みは速くなります。非常に小さな作業であれば、この点を考慮する必要があるかもしれません。JSLだけで実行してみる価値はあるかもしれません。JSLの方が速いです。
パケット管理とインストールは時折問題を引き起こすことがありますが、それに関するドキュメントはいくつか存在します。しかし、解決が少々面倒な場合もあります。環境は1つしかないため、仮想環境での作業に慣れている場合、現状ではジョブ統合では対応できません。JSLとPythonのデータ型変換についてもある程度理解しておく必要がありますが、これに関するドキュメントはいくつかWebページに掲載されています。スコープ設定は分かりにくい、あるいは少し分かりにくい場合があります。Pythonは基本的にグローバルスコープであり、変数の命名方法によっては、異なるスクリプト間で変数が少し絡まってしまうなど、問題が発生することがあります。
最後に、私の意見では、ここで最も大きな問題の一つは、Pythonのデバッグと開発が少々面倒で、なかなかスムーズに作業が進まないことです。これは主に、JMPでPythonをリセットしたりカーネルを再起動したりできないことが原因です。そのため、結局は「開発のサイクル」に陥ってしまいます。Pythonで開発し、テストを行いたいと思った時に、例えば変数から何かを削除したいと思ったりするのです。
現時点では、JMPインスタンスを閉じてJMPを再実行し、すべてをロードし直してからコードをテストするしかありません。これは循環的なものではなく、基本的にここで中断し、最初から全てをやり直す必要があります。フローが中断されてしまいます。これはフラストレーションの原因となりますが、Pythonコードの書き方によっては、この問題をいくらか軽減できます。
さて、私たちのアプリケーションについてですが、JMPyFacadeとは何でしょうか?まず、この名前は、複雑なJMPとPythonのコードを、JMPに似た、馴染みのあるユーザーインターフェースの背後に隠蔽していることに由来しています。バージョン管理機能が追加されており、JMPユーザーは事前に設定されたPython機能にアクセスできます。私たちはこれをサービスと呼んでいます。サービスの範囲は、非常に単純なデータセット作成から、はるかに複雑な[inaudible 00:04:34]学習モデルまで多岐にわたります。
これを実現したいのは、JMPユーザーがPythonを使用していることをほとんど意識することなく、Pythonの機能を利用できるようにすることです。以前にも似たような機能がありましたが、その場合はサーバーを利用してJMPのPython統合を回避していました。以前は少し使いにくかったためです。JMP18ではネイティブ統合を利用できるようになり、非常にスムーズに動作しています。
ユーザーがアプリケーションを実行すると、まずアドインが実行され、更新されているかどうかが確認されます。更新されていない場合は更新が行われ、ユーザーはアドインを再実行します。更新が見つからない場合は、JMPでLS Pythonを初期化します。このステップの目的は、基本的に注文の更新を作成することです。ユーザーがまだ実行していない場合、何らかの問題が発生する可能性があります。このようなアプリケーションでは、問題が存在しない場合に問題が発生する可能性があります。
これらを初期化したら、パケット管理から更新が必要なパッケージがあるかどうか、必要に応じて更新するかどうか、そして更新するものがない場合はそのまま処理を続行するかどうかを確認します。ユーザーがテーブルを開いているかどうかを確認し、テーブルがない場合はアドインを閉じてユーザーにその旨を通知します。実行前にテーブルを開いてください。これは現在、基本的に1つの静的テーブルしかサポートしていないためです。
ユーザーがテーブルを開いて分析を開始すると、パッケージをインポートします。問題が発生した場合、ここでも処理が停止し、ログに問題の内容が表示されます。問題が解消された場合は、ユーザーインターフェースを初期化し、作成します。これでユーザーはツールの使用を開始できます。JMPインスタンスに既にユーザーインターフェースが存在する場合は、それを前面に表示するだけで、特に初期化は行いません。
バックグラウンドでどのように動作するかを少し説明します。データ型、JMP クラスを利用し、Python 側では Pydantic パッケージも使用して、使用するモデルを作成し、型の検証とデータの検証を行います。
ここではHDBSCANの例を示します。例えば、このfeatures引数は文字列のリストで、最小長が1のフィールドであり、JSONスキーマを利用して数値列を作成します。JMPはこれを受け取ると、このタイプのクラスを作成するように認識します。ボタンと列リストボックスが表示され、ユーザーは1つの数値を入力する必要があります。これが機能するには、少なくとも1つの数値列が必要です。また、異なるタイプのデータには異なるタイプの要素、つまり整数、数値ボックス、そしてチェックボックスなどのブール値があります。
ユーザーがサービスを実行する準備ができたら、列に値を入力し、「サービス実行」ボタンをクリックします。この時点で、JMP側のコードはこれらの列を含むデータのサブセットを作成し、除外されていない列を取得します。これらの列は、Python関数が呼び出される際に使用されます。これにより、Python側の管理が少し容易になるため、このように実装しています。
Pythonはアルゴリズムを実行し、サブセットの値を更新します。サブセットとPythonが値を返すと、JMPは「これで元のテーブルを更新できる」と判断します。テーブルを更新し、サブセットを閉じ、元のテーブルにテーブルスクリプトと列プロパティを作成します。ユーザーが基本的にサービスを実行するたびに、作成すべき列があれば、テーブルに新しい列が作成されます。
次に、使用例をいくつか紹介します。これは基本的な例です。ユーザーがアドインを実行すると、バージョン管理から確認されます。この場合、ユーザーはこのアドインからtSNEを実行したいので、左側からtSNEを選択し、列を入力します。また、ドキュメントも確認します。これはtSNEの公式ドキュメントで、例えば、仕組み、機能、パラメータなどを知りたい場合に役立ちます。ユーザーがサービスを実行する準備ができたら、「サービス実行」ボタンをクリックすると、JMPテーブルに新しい列が作成され、通常のJMPボタンと同じように操作できるようになります。
次に、レポートスクリプトも確認します。この場合は入力パラメータのみです。ここでは、もう少し複雑な例、過剰な例、あるいは拡張的な例をいくつか示します。このデモでは、インタラクティブモードになっています。個人的には、これが最も優れた機能の一つだと思います。これらのスクリプトは常に新しい列を作成するのではなく、静的な列を更新し、ユーザーがユーザーインターフェースで値を変更すると、Pythonアルゴリズムを即座に再実行します。例えば、このスクリプトを使用して、エクスポートデータの分析やアルゴリズムの微調整を行うことができます。
ここで、ユーザーは基本的にキーボードの上矢印をクリックすると、Pythonアルゴリズムが常に再実行され、ユーザーが値を更新すると、そのユーザーに基づいてクラスタリングが変化します。ここでビューを増やすとコンポーネントが変化するため、値によって全く異なるクラスターが生成されます。ここでインタラクティブに値を変更し、最適な値を見つけ出し、その後Pythonに戻って、例えばその値を使用することもできます。
次に、複数のアルゴリズムを活用する特徴量重要度サービスがあります。このサービスはShapley値を用いて、モデリングや予測においてどのアルゴリズムが最も重要かを判断します。モデルを実行するとShapley [inaudible 00:10:32] が返され、選択したアルゴリズムのランキングも表示されます。今回の場合はRGBM、XGBoost、AdaBoostです。ユーザーはここから値をコピー&ペーストし、これらの列を使ってJMPでモデリングを開始できます。
最後に、このツールの今後の取り組みとして、動的テーブルのサポートを追加します。これにより、静的テーブルが1つになり、サービスがさらに増え、画像解析と独自のカスタム機械学習モデルが利用できるようになります。インタラクティブ性が向上し、Pythonでグラフィックスクリプトを直接作成したり更新したりできるようになります。Pythonモデルのエクスポートとインポートもサポートします。パラメータの微調整にはJMPの優れたDOE機能を活用します。パイプラインを作成することで、複数のサービスを連続して実行できるようになります。現在提供されている動的機能をさらに改善し、JMP19で導入されるリファクタリング機能に応じてツールをさらに改良していきます。最後に、オープンソース化についても議論します。そうすれば、このツールの開発には私たちだけでなく、他の開発者も参加することになるかもしれません。ありがとうございます。