注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
モデルを開発する際に、ハイパーパラメーターを試行錯誤し、効果的な値の組み合わせを見つけたいことがあります。Foundry では、一般的なライブラリやカスタムコードを使用して、トレーニングジョブの一環としてモデルのトレーニング中にハイパーパラメーターの最適化を行い、メトリクスやメタデータと共に一つまたは複数の「勝者」となるモデルを保存することができます。
この例では、コードリポジトリ内の Python トランスフォームを使用して、scikit-learn の GridSearchCV
を使用する方法を示します。これは、scikit-learn と互換性のあるモデルを「フィッタブル」なクラスでラップし、パラメーターセット全体でクロスバリデーションを実行し、最適なモデルを生成します。
以下に示す実装は、単一の大きなドライバでグリッドサーチを実行します。リポジトリに対してプロファイルを有効にする方法については、Spark プロファイルのドキュメントを参照してください。また、Spark を活用して分散型グリッドサーチを実装することも可能です(たとえば、pandas_udf
とトレーニング関数を使用して)が、以下では実装されていません。
マルチ出力形式は、1つの変換で複数のモデルをトレーニングするのにも役立ちます。
以下の例では、トップモデルを抽出し、関連する評価指標を保存します。この例では、モデリング目的のチュートリアルからの住宅データを使用しています。
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 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
from transforms.api import transform, Input, Output, configure from sklearn.compose import make_column_transformer from sklearn.preprocessing import StandardScaler from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import GridSearchCV import pandas as pd from foundry_ml_sklearn.utils import extract_matrix from foundry_ml import Model, Stage from foundry_ml_metrics import MetricSet @configure(profile=['DRIVER_CORES_EXTRA_LARGE', 'DRIVER_MEMORY_OVERHEAD_EXTRA_LARGE']) @transform( training_data=Input('/Public/.../training_data'), out_model=Output('/Public/.../mo_model'), out_metrics=Output('/Public/.../mo_training_metrics'), ) def brown_hair_by_sex(training_data, out_model, out_metrics): # データフレームをPandasに変換 training = training_data.dataframe().toPandas() # パススルーオプションは数値列を特徴ベクトルに結合します column_transformer = make_column_transformer( (StandardScaler(), ['median_income', "housing_median_age", "total_rooms"]) ) # 列変換器をフィットしてベクトル化器として機能させる column_transformer.fit(training) # ベクトル化器をStageとしてラップし、これがモデルで適用される変換を示す vectorizer = Stage(column_transformer) training_df = vectorizer.transform(training) # ベクトルの列をNumPy行列に変換し、疎行列を処理するヘルパー関数を呼び出す X = extract_matrix(training_df, 'features') y = training_df['median_house_value'] # オプションのパラメータグリッドを作成 param_grid = [ {'n_estimators': [3, 10, 30], 'max_features': [2, 3]}, {'bootstrap': [False], 'n_estimators': [3, 10], 'max_features': [2, 3]}, ] # アルゴリズムを選択し、クロスバリデーションのメトリクスを選択 forest_reg = RandomForestRegressor() grid_search = GridSearchCV(forest_reg, param_grid, cv=5, scoring='neg_mean_squared_error') grid_search.fit(X, y) # 内部cvの結果を取得 - 最適なモデル cv_results = pd.DataFrame(grid_search.cv_results_).select_dtypes(include=['number']) # メトリクスを抽出し、辞書に変換 cv_results = cv_results[cv_results['rank_test_score'] == 1].to_dict('records')[0] # 変換のパイプラインを含むモデルオブジェクトを返す model = Model(vectorizer, Stage(grid_search.best_estimator_, input_column_name='features')) # 最良のスコアをメトリクスとして保存 metric_set = MetricSet( model = model, input_data=training_data ) # メトリクスをメトリックセットに追加 for key, value in cv_results.items(): metric_set.add(name=key, value=value) model.save(out_model) metric_set.save(out_metrics)