XGBoost による機械学習目的
これは、複雑な機械学習アルゴリズムを処理するために、JMP と Python 間の接続を使用して app-builder で構築した最初のアプリケーションの試みです。
このアプリの目的は、jsl で記述されたグラフィカル ユーザー インターフェイスを起動し、そのインターフェイスを「XGBoost」機械学習 API に接続することです。
使い方
ホールドアウト / 相互検証 / グリッド検索の 3 種類の検証スキームに取り組む可能性を実装しました。回帰と分類はどちらも、少数の目的と古典的な指標に基づいて開発されています。
トレーニングの最後に、トレーニング/検証セットの両方、または相互検証のための平均/標準偏差のメトリクス値がレポートに提供されます。グリッド検索トレーニングの場合、レポートには最良のハイパーパラメーター結果が提供され、早期停止の使用を選択できます。モデルを再度トレーニングせずに、Python モデルをエクスポートして新しいデータを予測することも可能です (ただし、Python 環境で行う必要があります)。
アプリを使用する前に、JMP が Python でそのリンクを処理できることを確認する必要があります。




2024 年の新しいリリースの場合:
Python ライブラリのアップグレードに伴い多くの更新が必要になったので、この機会に実用的に不足している機能を追加したり、かなりの数のバグを修正したりしました...
- Python/JMP 間の競合を避けるために列名に特定のパターンを強制するようにしました (すべての特殊文字、句読点、スペースをクリアします)。また、JMP 16 で導入された新しい機能を利用して、ドットを使用した 10 進形式を強制します。以前に経験した特定のクラッシュ。
- また、現在、応答が分類問題の正しい形式であることを確認しており(おそらく numpy の変更にリンクされている xgboost に加えられた変更のため、応答は数値であり、0 から始まる必要があります)、バイナリ応答のクラス問題を修正しています。これは、アドインの最初のバージョンで発生する可能性があります。
- 生成されたトレーニング データセットとテスト データセットを保持できるようにするチェックボックスを追加しました。これにより、このアドインを従来の Python (したがって、さらに楽しくするために他の ML アルゴ) と組み合わせたい場合に、CSV としてエクスポートして同じベースで作業できるようになります ^^ )。

- 「Gamma」ハイパーパラメータの追加 (別名「min_split_loss」、つまり、ノードの追加分割を正当化するために必要な損失関数の最小削減を指定することによる、ツリーの正則化の程度のチェック)。

- フィッティング後のモデルのハイパーパラメータをアドインと同じ順序で系統的に表示するようになりました。これにより、これらのハイパーパラメータをモデルのパフォーマンスに関連付けやすくなり、(グリッド検索から移動するときに) それらをアドインにコピーしやすくなります。たとえば相互検証など)。

- ここで、F スコアで正規化されたトレーニング済みモデルで使用される特徴のリストを取得し、正規化が 0.20 より大きい特徴を表示し、それを JMP に直接コピーして貼り付けることができる形式でログに表示します (そしてしたがって、別の分析に簡単に追加できます)。このリストは、F スコア値の降順に並べ替えられています。

- matplotlib 出力のインストール。これにより、IDE Python にエクスポートしてインポートする必要がなく、モデルの機能の重要性を直接表示できるようになりました (これは私の最初のリリースで想定されていましたが、matplotlib がインポートされるとすぐに JMP15 が組織的にクラッシュしました。これは、 JMP 17 では解決されているはずですが、JMP 16 ではテストしていません)、グラフは表示される特徴量 (フォント サイズとマージン) の数に適応します。
古典的なデータセットの例 (「ボストンの住宅価格」: https://www.kaggle.com/competitions/home-data-for-ml-course/data 

システム構成
アドインは、次のシステム構成を使用して開発およびテストされました。
JMP17
Python 3.11 または 3.12 (numpy、pandas、pathlib、multiprocess、scikit-learn、xgboost を使用)
古典的なデータセット(タイタニック号、ボストンハウスなど)を使用してテストされました。

予測モデリングとデータマイニングRe: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)オーケー、フランク
お返事をありがとうございます。
私はすでに知っていたので、知りたいと思っていました。 今、それは明らかです。
RGDS。フェリーチェ
Re: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)こんにちはフェリーチェ、フィードバックありがとうございます!
何が問題だったのか正確には覚えていませんが、Python 転送中に数値以外のデータを処理するという問題がありました。
また、JMP が Python コードを実行するとすぐにエラーレポートが表示されないため、根本原因を特定して解決することができませんでした。 カテゴリの Python スクリプト コードは問題ありませんでしたが、JMP コードも問題ありませんでしたが、JMP コード、次に Python コードがスクリプトをクラッシュさせていました...
いつか振り返ってみることにします!
たとえば、yes = 1 および no = 2 または setosa = 1、versicolor = 2、virginica =3 などの値を再コーディングするだけです。 少し面倒ですが、このバグを回避するためのものです
Re: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)チャオ・フランク。 あなたのアドインは本当によくできています。
ただの好奇心です。 分類タスクを選択する場合、応答変数のタイプが数値である必要があるのはなぜですか? カテゴリ変数(悪いものと良いもの、ベースラインと実験、猫と犬など)を期待していました。
RGDS。フェリーチェ
Re: JMP アドインでの XGBoost を使用した機械学習 (JMP アプリ + Python)問題ないよ、フランク。 素晴らしい貢献です。共有していただきありがとうございます。
Re: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)ありがとう!
はい、Python サポートが時間の経過とともに改善されることも期待しています。
インターフェイスについては、申し訳ありませんが、このアドインはほとんど自由時間で作成しましたが、JMP のライセンスは会社から支払われているため、ソース コードの公開は、このソース コードを非公開にすることを希望する雇用主によって検証される必要があると考えています。
Re: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)これは素晴らしい! 共有してくれてありがとう*
Windows の Python に関しては、Python 3.6 を搭載した Anaconda はそのまま JMP 15 で動作しますが、2 年前のパッケージであるため、すべてのパッケージを更新する必要があります。 JMP が次のバージョンで Python サポートを改善することを願っています。
(*注) 作成したインターフェースは他の Python API にも使用できます。 ソースコードも公開されていますか?
よろしく。
Re: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)こんにちは、ルース
大変申し訳ありませんが、何が起こっているのか全く分かりません。Mac OS が Windows とは異なる方法でディレクトリを処理する方法に何らかの問題があるのではないかと考えましたが、クラッシュは Python の部分にあり、それ以前ではありませんでした。 さらに、ファイルエクスポートオプションを使用しなかったときにクラッシュが発生します
おそらく、あなたが言及したようにパッケージの問題に関連している可能性があります。 できるだけ早くパッケージをアップグレードして、Windows 10 上の同じパッケージがまだ問題ないかどうかを確認してみます。
私のアドインをお試しいただきありがとうございます! 
フランク
Re: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)私の問題をご覧いただきありがとうございます。 @Frank_R 。私の Python インストールは、他のコード (提案されたテスト コードを含む) の JMP で動作していますが、アドインに必要なパッケージやその他の不足しているコンポーネントにまだ発見されていない問題が存在する可能性があります。 今のところ完全に困惑しています。 機会があれば、これを Windows マシンにセットアップしてもう一度試してみます。
これをコミュニティに公開していただき、改めて感謝いたします。これは非常に便利なアプリケーションです。
Re: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)私のコンピュータでは同じデータセットが問題なく動作しました。

Re: JMP アドインの XGBoost を使用した機械学習 (JMP アプリ + Python)やあ、
はい、問題は確かにPython部分にあります、申し訳ありません...
Python コードがまったく実行されていないため、これは奇妙です。「try」コマンドの前にコードがクラッシュしました。 私はそのようなクラッシュを追加することはありません...
しかし、JMP は Python のエラー メッセージを何も書き込まないため、ログをデバッグするのは困難です...説明なしで Python コードをスローするだけです... JMP で Python を使用し、Python で問題が発生した場合、明示的なエラー コードはありません。そのため、すべての Python コードを JMP の外部で開発してから、そのコードを JMP に統合する必要がありました...
このデータセットは私のコンピューターではうまく処理されますが、Windows 10 と Python 3.7 で作業しています。
最初に確認することは、JMP 15.1 が Python 3.8 を処理できるかどうかです。実際にそうであるかどうかはわかりません (Python 3.7 ではいくつかの問題がありました。たとえば、を参照してください) https://community.jmp.com/t5/Discussions/JMP-14-Python-abilities-working-Im-confused/td-p/184515
スクリプト インデックス内のサンプル コードを実行してみます。
名前のデフォルトは Here( 1 );
Python Init();
Python 送信(
「\[
str = '機敏な茶色のキツネが怠惰な犬を飛び越えます';
a = 200;
]\"
);
getStr = Python Get( str );
getNum = Python Get( a );
Show( getStr, getNum );
Python 用語();
次に、データセットに欠損値はありますか? (データセット内の欠損値をチェックしません。欠損値が含まれる再加工されたボストン データセットである場合、それが原因でクラッシュする可能性があります)
私のコードが Mac OS を処理できるかどうかもわかりません。それを確認する方法がなく、Python の統合はおそらく Windows とは少し異なる可能性があるためです...
Re: JMP アドインでの XGBoost を使用した機械学習 (JMP アプリ + Python)これを利用できるようにしてくれてありがとう! 適切な検証列と数値 ID 列を含めるようにわずかに調整し、数値インジケーターとして「chas」変数を使用して、ボストン ハウジング データに対して実行しようとしています。 (下のスクリーンショットを参照してください。) MacOS 10.15.3 上で、Python 3.8.2、numpy 1.18.2、pandas 1.0.3、scikit-learn 0.23.1、および XGBoost 1.1.0 を使用して JMP Pro 15.1 を実行しています。 以下のログをコピーしています。 明らかに何かが少しの間動作していましたが、その後 Python がクラッシュしました。 最終的に、「Send Expects Scriptable Object in access or ratings of 'Send'」という警告が表示されます。 このエラーは、Python がクラッシュし、送信するオブジェクトを作成できなかったことが原因で発生したと考えられます。
何が問題になっているのか何か考えはありますか? 私はスクリプトの専門家ではありませんが、この弱点に加えて、ログ内のフランス語の出力の一部が理解できません 
ありがとう!
ルース
"*** DEBUG Report: Start"
"******* Fonction update OK"
"**** Valeurs initialisées"
2
"**** OK avant lancement algo"
"***** La table de travail est:"
DataTable("Boston Housing.jmp")
/Library/Frameworks/Python.framework/Versions/3.8/lib/python38.zip
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/lib-dynload
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages
/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/aeosa
/**********/
# Partie import des biblios Python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
from sklearn.metrics import mean_squared_error
from xgboost import XGBRegressor
from joblib import dump, load
from pathlib import Path
# Optionnel
#from xgboost import plot_tree
# On affiche pas les warnings python
import warnings
warnings.simplefilter("ignore")
try:
# On créé des DataFrame avec les Data Table JMP
data_frame_train = pd.DataFrame(dt_train)
data_frame_valid = pd.DataFrame(dt_valid)
data_frame_test = pd.DataFrame(dt_test)
# On récupère l'index du DF avec Id pour le réutiliser dans la génération du dataframe de la réponse
Id_train = data_frame_train[colId]
Id_valid = data_frame_valid[colId]
Id_test = data_frame_test[colId]
# On fixe l'index du DF avec Id
data_frame_train.set_index(colId)
data_frame_valid.set_index(colId)
data_frame_test.set_index(colId)
# On conserve la table train non modifiée
data_frame_train_initial = pd.DataFrame(dt_train)
# On fixe l'index du DF avec Id
data_frame_train_initial.set_index(colId)
# On fixe le y
y_train = data_frame_train[colY]
y_valid = data_frame_valid[colY]
y_test = data_frame_test[colY]
# On fixe les facteurs: ce sont ici les colonnes récupérées de la liste des colonnes de JMP donc les features contenus dans liste_colonne
X_train = data_frame_train[liste_colonne]
X_valid = data_frame_valid[liste_colonne]
X_test = data_frame_test[liste_colonne]
# MODELISATION
# On définit le modèle comme étant un régresseur XGBoost
# my_model = XGBRegressor(n_estimators=100, learning_rate=0.05, random_state=0)
#param_dist = {'n_estimators':2,'learning_rate'=0.05,'random_state'=0 }
# ATTENTION: le transfert de variable est piégeux car un integer est converti en decimal
# Or dans cette list de paramètre XGBoost ne tolère pas tout le temps des décimals, il faut donc convertir en Integer avec int()
# Conversion des paramètres:
Int_Nb_Iterations = int(Nb_Iterations)
Int_Max_Depth = int (Max_Depth)
Int_Min_Child = int (Min_Child)
# Assignation des paramètres
max_depth = Int_Max_Depth
min_child_weight = Int_Min_Child
subsample = Sub_Sample
colsample_bytree = Col_Sample
objective = Objective
num_estimators = Int_Nb_Iterations
learning_rate = Learning_Rate
my_model = XGBRegressor(max_depth=max_depth,min_child_weight=min_child_weight,subsample=subsample,colsample_bytree=colsample_bytree,objective=objective,n_estimators=num_estimators,learning_rate=learning_rate)
# On fitte le modèle
my_model.fit(X_train, y_train)
# On récupère les prédictions sur le set de la table train partie validation
predictions_sur_train_XGBoost = my_model.predict(X_train)
predictions_sur_validation_XGBoost = my_model.predict(X_valid)
# Calculate Score
#score_train = mean_absolute_error(predictions_sur_train_XGBoost, y_train)
#score_valid = mean_absolute_error(predictions_sur_validation_XGBoost, y_valid)
if Type_Score == 'MAE': score_train = mean_absolute_error(predictions_sur_train_XGBoost, y_train); score_valid = mean_absolute_error(predictions_sur_validation_XGBoost, y_valid)
elif Type_Score == 'RMSE': score_train = mean_squared_error(predictions_sur_train_XGBoost, y_train) ; score_valid = mean_squared_error(predictions_sur_validation_XGBoost, y_valid)
else: print("toto")
# Export prévisions sur table train et validate
output_train_XGBoost = pd.DataFrame({colY: predictions_sur_train_XGBoost,colId : Id_train})
output_validation_XGBoost = pd.DataFrame({colY: predictions_sur_validation_XGBoost, colId : Id_valid })
# On concatene les dataframe train et valid afin de réentrainer le modèle sur l'ensemble des données pour prédire le y_test
X_full = pd.concat([X_train, X_valid])
y_full = pd.concat([y_train, y_valid])
# On réentraine le modèle sur train + validate et on l'exporte sur test
my_model.fit(X_full, y_full)
predictions_sur_test_XGBoost = my_model.predict(X_test)
output_test_XGBoost = pd.DataFrame({colY: predictions_sur_test_XGBoost,colId : Id_test})
# ------------------------- Essais de sortie graphique: plantage car JMP 15.1 n'est pas fonctionnel
# fit = alg.fit(dtrain[ft_cols].values, dtrain['y'].values)
# ft_weights = pd.DataFrame(fit.feature_importances_, columns=['weights'], index=ft_cols)
# model = xgb.train(params, d_train, 1000, watchlist)
# fig, ax = plt.subplots(figsize=(12,18))
# xgb.plot_importance(model, max_num_features=50, height=0.8, ax=ax)
# plt.show()
# ft_weights = my_model.feature_importances_
#import matplotlib.pylab as plt
#from matplotlib import pyplot
#from xgboost import plot_importance
#plot_importance(model, max_num_features=10) # top 10 most important features
#plt.show()
# -------------------------
if int(File_Save_Check) == 1:
data_folder = Path(File_Save_Directory)
file_to_save = data_folder / File_Save_Name
dump(my_model, file_to_save)
except:
print("python has crashed check your parameters")
/**********/
Send Expects Scriptable Object in access or evaluation of 'Send'


Re: XGBoost を使用した機械学習こんにちは
新しい Python バージョンとの互換性 + 新機能 + バグ修正を追加してアドインを更新しました
Re: XGBoost を使用した機械学習matplotlib でクラッシュが発生した理由についてコメントできます。 JMP のメイン ウィンドウ イベント ループと matplotlib のメイン ウィンドウ イベント ループの両方が衝突します。 Python 共有ライブラリは JMP のプロセス空間にロードされるため、JMP にはすでにメイン ウィンドウがあります。通常のメソッドで呼び出された Matplotlib は、メイン ウィンドウ ループがあると認識します。それは、選択した matplolib バックエンドに完全に依存します。 14 以降では、maptplotlib バックエンドを非対話型の「AGG」バックエンドに強制しました。これは、図を表示するのではなく保存するように matplotlib に指示するだけで完全に使用できるようになります。もう 1 つの問題は、JMP がすべてのケースでクラッシュするわけではなく、終了してしまうということです。最後に閉じられた matplotib のウィンドウは、JMP の制御外で C レベルの exit() を呼び出していました。 JMP 18.0 は、AGG バックエンドに強制することなく Windows 上で matplotlib を許可する場合はもう少し寛大ですが、Mac ではデフォルトの Cocoa バックエンドが依然としてクラッシュします。私は matplotlib 開発者とオープンなバグ レポートを持っています。 Mac では、PySide または PyQt バックエンドである程度の成功を収めましたが、それでも当たり外れがあります。 matplotlib を呼び出す最良の方法は、Figure を画像として保存することです。
Re: XGBoost を使用した機械学習こんにちは、ポールさん
フォローと説明ありがとうございます! Python との統合が JMP 18 でも継続されていることを嬉しく思います...