注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

scikit-learn を使った二値分類モデルの学習(コードリポジトリ)

以下のドキュメントでは、オープンソースの UCI ML Breast Cancer Wisconsin(Diagnostic) (外部) データセットを使用して、コードリポジトリ アプリケーション内で scikit-learn 二値分類モデルを学習する方法についての例を提供しています。Model Training Template を使用します。

モデルアダプターの作成やモデル学習のための Python トランスフォームの記述方法など、以下の手順の詳細なウォークスルーについては、コードリポジトリでのモデル学習方法に関するドキュメントを参照してください。

1. モデルアダプターの作成

まず、コードリポジトリ内で Model Training Template を使用して、モデルアダプター を作成します。

以下の例のロジックは、次のことを前提としています。

  • このモデルアダプターは scikit-learn の model で初期化されます。
  • このモデルに提供されるデータは表形式です。
  • このモデルの出力は、columnspredictionprobability_0、および probability_1 からなる表形式で、
    • prediction は 0 または 1 で、0 は癌が検出されなかったことを示し、1 は癌が検出されたことを示します。
    • probability_0 は、癌が検出されなかった確率です。
    • probability_1 は、癌が検出された確率です。
  • 以下の依存関係がリポジトリに追加されています:python 3.8.18pandas 1.5.3scikit-learn 1.3.2、および dill 0.3.7
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 41 42 43 44 45 46 47 import palantir_models as pm from palantir_models_serializers import * # SklearnClassificationAdapterという新しいクラスを定義します class SklearnClassificationAdapter(pm.ModelAdapter): # オブジェクトを初期化するための特殊メソッドです @pm.auto_serialize( model=DillSerializer() ) def __init__(self, model): self.model = model # apiメソッドを定義します。このメソッドは、モデルの入力と出力の形式を定義します @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 # predictメソッドを定義します。このメソッドは、入力データフレームに対してモデルの予測を行います 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

2. モデルのトレーニングのための Pythonトランスフォームを書く

同じリポジトリの model_training/model_training.py で、モデルトレーニングのロジックを作成します。

この例では、scikit-learn ライブラリに提供されているオープンソースの UCI ML Breast Cancer Wisconsin (Diagnostic) dataset を使用します。

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 41 42 43 44 45 46 47 from 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( 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モデルへの変換 foundry_model = SklearnClassificationAdapter(model) model_output.publish(model_adapter=foundry_model) # モデルの公開

3. モデルの利用

Pythonトランスフォームで推論を実行する

ユーザーのモデルを Pythonトランスフォームで推論を実行できます。例えば、モデルが訓練された後、以下の推論ロジックを model_training/run_inference.py ファイルにコピーし、ビルドを選択してください。

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 # 必要なライブラリをインポートします from transforms.api import transform, Output from palantir_models.transforms import ModelInput from sklearn.datasets import load_breast_cancer @transform( # インファレンスの結果を書き出すデータセットを指定します inference_output=Output("ri.foundry.main.dataset.5dd9907f-79bc-4ae9-a106-1fa87ff021c3"), # 使用するモデルを指定します model=ModelInput("ri.models.main.model.cfc11519-28be-4f3e-9176-9afe91ecf3e1"), ) def compute(inference_output, model): # データセットをロードします 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エンドポイントを使用したバイナリ分類モデルの入力を示しています: このコードはJSON形式のデータを表しています。特に、乳がん検査の結果を示すさまざまなパラメータが含まれています。

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 [ { "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 // 最悪のフラクタル次元 } ]

scikit-learn の二値分類モデルのためのサンドボックスデプロイメント。