注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
このドキュメントでは、Code Repositories アプリケーションでモデルトレーニングテンプレートを使用し、オープンソースの UCI ML Breast Cancer Wisconsin (Diagnostic) ↗ データセットで scikit-learn の二値分類モデルをトレーニングする例を紹介します。
モデルアダプターの作成方法や、モデルのトレーニング用の Python トランスフォームの記述方法を含む、以下の手順の詳細なウォークスルーについては、Code Repositories でモデルをトレーニングする方法のドキュメントを参照してください。
まず、Code Repositories のモデルトレーニングテンプレートを使用して、モデルアダプターを作成します。
以下のロジックの例では、次のことを前提としています。
model で初期化されます。columns のすべての列と、prediction、probability_0、probability_1 を含みます。それぞれの意味は次のとおりです。
prediction は0または1で、0はがんが検出されなかったことを、1はがんが検出されたことを表します。probability_0 は、がんが検出されなかった確率です。probability_1 は、がんが検出された確率です。foundry-transforms-lib-python、pandas 1.5.3、scikit-learn 1.3.2、dill 0.3.7Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44import palantir_models as pm from palantir_models.serializers import * class SklearnClassificationAdapter(pm.ModelAdapter): @pm.auto_serialize( model=DillSerializer() ) def __init__(self, model): self.model = model @classmethod def api(cls): columns = [ 'mean_radius', 'mean_texture', 'mean_perimeter', 'mean_area', 'mean_smoothness', 'mean_compactness', 'mean_concavity', 'mean_concave_points', 'mean_symmetry', 'mean_fractal_dimension', 'radius_error', 'texture_error', 'perimeter_error', 'area_error', 'smoothness_error', 'compactness_error', 'concavity_error', 'concave_points_error', 'symmetry_error', 'fractal_dimension_error', 'worst_radius', 'worst_texture', 'worst_perimeter', 'worst_area', 'worst_smoothness', 'worst_compactness', 'worst_concavity', 'worst_concave_points', 'worst_symmetry', 'worst_fractal_dimension' ] inputs = {"df_in": pm.Pandas(columns=columns)} outputs = {"df_out": pm.Pandas(columns= columns + [ ("prediction", int), ("probability_0", float), ("probability_1", float) ])} return inputs, outputs def predict(self, df_in): X = df_in.copy() predictions = self.model.predict(X) probabilities = self.model.predict_proba(X) df_in['prediction'] = predictions for idx, label in enumerate(self.model.classes_): df_in[f"probability_{label}"] = probabilities[:, idx] return df_in
同じリポジトリの model_training/model_training.py に、モデルのトレーニングロジックを記述します。
この例では、scikit-learn ライブラリで提供されているオープンソースの UCI ML Breast Cancer Wisconsin (Diagnostic) データセット ↗を使用します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41from transforms.api import transform from palantir_models.transforms import ModelOutput from main.model_adapters.adapter import SklearnClassificationAdapter from sklearn.datasets import load_breast_cancer from sklearn.compose import make_column_transformer from sklearn.impute import SimpleImputer from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.ensemble import RandomForestClassifier @transform.using( model_output=ModelOutput("/path/to/model_asset"), ) def compute(model_output): X_train, y_train = load_breast_cancer(as_frame=True, return_X_y=True) X_train.columns = X_train.columns.str.replace(' ', '_') columns = X_train.columns numeric_transformer = Pipeline( steps=[ ("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler()) ] ) preprocessor = make_column_transformer( (numeric_transformer, columns), remainder="passthrough" ) model = Pipeline( steps=[ ("preprocessor", preprocessor), ("classifier", RandomForestClassifier(n_estimators=50, max_depth=3)) ] ) model.fit(X_train, y_train) foundry_model = SklearnClassificationAdapter(model) model_output.publish(model_adapter=foundry_model)
Python トランスフォームでモデルを使用して推論を実行できます。たとえば、モデルのトレーニングが完了したら、以下の推論ロジックを model_training/run_inference.py ファイルにコピーし、Build を選択します。
モデルが定義されていないトランスフォームリポジトリ内でモデルを実行するには、ModelInput で use_sidecar = True を設定します。これにより、モデルアダプターとその依存関係が自動的にインポートされ、依存関係の競合を防ぐために別の環境で実行されます。詳細については、ModelInput クラスのリファレンスを参照してください。この機能は、palantir_models のバージョン 0.2010.0以降で、Spark を使用しないトランスフォーム(@lightweight または @transform.using デコレーターを使用)で利用可能です。
use_sidecar が True に設定されていない場合は、モデルアダプターとその依存関係を現在のコードリポジトリにインポートするか、その中で定義する必要があります。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19from transforms.api import transform, Output, LightweightOutput from palantir_models.transforms import ModelInput from palantir_models import ModelAdapter from sklearn.datasets import load_breast_cancer @transform.using( model=ModelInput( "ri.models.main.model.cfc11519-28be-4f3e-9176-9afe91ecf3e1", # 現在のトランスフォームリポジトリの外部で定義されたモデルには use_sidecar=True を推奨します ), inference_output=Output("ri.foundry.main.dataset.5dd9907f-79bc-4ae9-a106-1fa87ff021c3"), ) def compute(model: ModelAdapter, inference_output: LightweightOutput): X, y = load_breast_cancer(as_frame=True, return_X_y=True) X.columns = X.columns.str.replace(' ', '_') inference_results = model.transform(X) inference_output.write_pandas(inference_results.df_out)
Palantir モデルは、以下の目的でモデリング目標に送信できます。
このモデルをモデリング目標に送信した後、リリースを作成して、ライブ推論用にこのモデルをホストできます。デプロイの準備が整うと、ライブ推論を実行し、このモデルを業務アプリケーションに接続できます。
以下の例は、単一の I/O エンドポイントを使用する二値分類モデルへの入力を示しています。
[
{
"mean_radius": 15.09,
"mean_texture": 23.71,
"mean_perimeter": 92.65,
"mean_area": 944.07,
"mean_smoothness": 0.53,
"mean_compactness": 0.21,
"mean_concavity": 0.76,
"mean_concave_points": 0.39,
"mean_symmetry": 0.08,
"mean_fractal_dimension": 0.14,
"radius_error": 0.49,
"texture_error": 0.82,
"perimeter_error": 2.51,
"area_error": 17.22,
"smoothness_error": 0.07,
"compactness_error": 0.01,
"concavity_error": 0.05,
"concave_points_error": 0.05,
"symmetry_error": 0.01,
"fractal_dimension_error": 0.08,
"worst_radius": 12.95,
"worst_texture": 20.66,
"worst_perimeter": 185.41,
"worst_area": 624.87,
"worst_smoothness": 0.18,
"worst_compactness": 0.26,
"worst_concavity": 0.01,
"worst_concave_points": 0.05,
"worst_symmetry": 0.29,
"worst_fractal_dimension": 0.05
}
]