MLflow によるグリッド検索

Mlflow Niyoruguriddo Jian Suo



機械学習モデルのハイパーパラメーターは、グリッド検索アプローチを使用して最適化されます。 MLflow はグリッド検索実験の結果を追跡するため、ユーザーは複数のハイパーパラメータ設定を迅速に比較し、最もパフォーマンスが高い設定を見つけることができます。 MLflow では、グリッド検索実験を他のチーム メンバーとすぐに共有できます。 MLflow を使用すると、グリッド検索実験からの最も効果的なモデルをデプロイできます。

グリッド検索の利点

  • 自動ハイパーパラメータ調整: グリッド検索はハイパーパラメータ調整を自動化し、手動で試行錯誤することなく体系的な探索を可能にします。
  • 再現性: グリッド検索は、コミュニケーションと信頼性を強化する再現可能な結果を​​再現的に取得することでテストの妥当性を保証します。
  • 徹底的な検索: GS は、組み合わせを徹底的に検索することで、モデルに最適なハイパーパラメーターを効率的に見つけます。
  • 堅牢性: グリッド検索は、データ ノイズに耐性があり、過剰適合を軽減する堅牢な手法です。
  • 使い方は簡単: グリッド検索は使いやすく、理解しやすいため、ハイパーパラメータ調整の実行可能な方法になります。
  • モデルの比較: グリッド検索により、モデルの比較と評価指標の選択が簡素化されます。

グリッド検索の欠点

  • 計算コスト: グリッド検索は、多数のハイパーパラメータを調整するために計算コストがかかります。
  • 時間がかかる: 複雑なハイパーパラメータの調整には時間がかかります。
  • 必ずしも必要というわけではありません: 現在では常に必須となっています。ランダム検索はそれに代わる最良の方法です。

例: 大学入学システムに最適なモデル設定を見つける

オンライン大学入学システムのフレームワーク内でハイパーパラメーターを調整するためのグリッド検索の例を見てみましょう。この例では、scikit-learn と単純な Gradient Boosting Classifier (GBC) 分類器を使用して、GPA ポイント、SAT スコア、ACT スコア、課外活動などの要素に基づいて、学生が大学に合格する可能性を予測します。 GBC の代わりにグリッド検索には、ロジスティック回帰 (LR)、SVM (サポート ベクター マシン) などの複数のオプションが利用可能です。

グリッド検索用の MLflow を使用したオンライン入学システム用のランダム データの生成

Python の Pandas とランダム パッケージを使用して、入学システム用の架空のデータセットを作成できます。このコードは、APP_NO、GPA、SAT スコア、ACT スコア、課外活動、および入学ステータス列のランダム値を使用して、合成入学データセットを生成します。 num_students 変数は、データセット内に存在する行数を制御します。







承認ステータスは 70% の承認率に基づいてランダムに設定され、ランダム モジュールを使用していくつかの列にランダムな値が生成されます。デモンストレーションの目的で、次のコード部分はランダムな値を使用して偽のアドミッション データセットを作成し、std_admission_dataset.csv ファイルに保存します。



コードスニペット:



# Panda ライブラリと Random ライブラリをインポートする
パンダを panda_obj としてインポートします
ランダムをrandom_objとしてインポート

# 学生データセットが生成するレコードの数を設定します
学生の記録 = 1000

# データを保存するリストを作成する
std_application_numbers = [ 'アプリ-' + str(ランダム_obj.randint( 1000 9999 )) for _ in range(students_records)]
std_gpa = [round(random_obj.uniform( 2.5 4.0 )、 2 ) for _ in range(students_records)]
std_sat_scores = [random_obj.randint( 900 1600 ) for _ in range(students_records)]
std_act_scores = [random_obj.randint( 二十 36 ) for _ in range(students_records)]
std_extra_curriculars = [random_obj.choice([ 'はい' 'いいえ' ]) for _ in range(students_records)]

# ランダムな合格率に基づいて入学ステータスを計算します
std_admission_status = [ 1 if random_obj.random() < 0.7 それ以外 0 for _ in range(students_records)]

# 生徒データを保持する辞書を作成する
std_data = {

「アプリケーション_いいえ」 : std_application_numbers、

「GPA」 : std_gpa、

「SAT_スコア」 : std_sat_scores、

'ACT_スコア' : std_act_scores、

'課外活動' : std_extra_curriculars、

「入学状況」 : std_admission_status

}

# 辞書から DataFrame DataFrame_Student を作成します
DataFrame_Student = panda_obj.DataFrame(std_data)

# DataFrame DataFrame_Student を std_admission_dataset.csv という名前の CSV ファイルに保存します
DataFrame_Student.to_csv( 「std_admission_dataset.csv」 、インデックス=False)
印刷( 「生徒データが CSV ファイルに正常にエクスポートされました!」

コードの実行:

Python コマンドを使用してコードをコンパイルし、モジュール エラーが発生した場合は pip コマンドを使用して特定のモジュールをインストールします。 Python がバージョン 3.X 以降の場合は、pip3 install コマンドを使用して、指定されたライブラリをインストールします。





実行成功:



サンプルデータのスクリーンショット:

ステップ 1: ライブラリをインポートする

  • 機械学習実験追跡用の MLflow ライブラリ
  • データの処理と分析を処理するための Pandas ライブラリと、Scikit-Learn モデルを統合するための mlflow.sklearn パッケージ
  • 4 行目は、エラーを抑制するために「警告」ライブラリをインポートします。
  • sklearn.model_selection モジュールのグリッド検索用の ParameterGrid クラス
  • sklearn.model_selection およびアンサンブルからの GridSearchCV および GradientBoostingClassifier (グリッド検索および勾配ブースティング分類子モデル用)
  • モデルの精度を計算し、分類レポートを生成するための、sklearn.metrics モジュールの activity_score 関数とclassification_report関数
  • このコードは OS モジュールをインポートし、GIT_PYTHON_REFRESH 環境変数を Quiet に設定します。

コードスニペット:

# ステップ-I 必要なライブラリをインポートする
mlflowをインポートする
mlflow.sklearnをインポートする
警告を警告としてインポートする
パンダを panda_obj としてインポートします
sklearn.model_selection から train_test_split を tts として、ParameterGrid を pg として、GridSearchCV を gscv としてインポートします
私たちを輸入してください
sklearn.ensemble から GradientBoostingClassifier を GBC としてインポート
sklearn.metrics から、accuracy_score を acs として、classification_report を cr としてインポートします
os.環境[ 「GIT_PYTHON_REFRESH」 ] = '静かな'

ステップ 2: トラッキング URI を設定する

MLflow サーバーの追跡 URI は、mlflow.set_tracking_uri() 関数を使用して設定され、実験とモデル用にポート 5000 上のローカル マシンが確保されます。

mlflow.set_tracking_uri( 「http://localhost:5000」

ステップ 3: 入学データセットをロードして準備する

データ操作と分析のために、Pandas ライブラリを panda_obj としてインポートします。 read_csv() 関数は、アドミッション データセットをロードするために適用されます。データセットへのパスは、read_csv() 関数で必要な唯一の引数です。このインスタンスのデータセットへのパスは std_admission_dataset.csv です。 read_csv() 関数を使用することにより、データセットが Pandas DataFrame にロードされます。

コードによって、最初に std_admissions_data データフレームの Admission_Status 列が削除されます。この列には目的の変数が含まれているため、前処理は必要ありません。

次に、コードは 2 つの新しい変数「F」と「t」を作成します。特徴は「F」変数に含まれ、ターゲット変数は「t」変数に含まれます。

その後、データはテスト セットとトレーニング セットに分散されます。これは、sklearn.model_selection パッケージの tts() 関数を使用して実現されます。特徴量、ターゲット変数、テスト サイズ、ランダム状態は、tts() 関数に必要な 4 つの引数です。 test_size パラメータは、テスト目的で使用されるデータの部分を指定します。このインスタンスのテスト サイズは 0.2 に設定されているため、データの 20% がテストに使用されます。

random_state オプションは、乱数ジェネレーターのシードを指定します。これは、データがランダムに分離されるようにするために行われます。トレーニング セットとテスト セットは、F_training、F_testing、t_training、および t_testing 変数に保存されるようになりました。これらのセットは、機械学習モデルの評価とトレーニングに使用できます。

コードスニペット:

# ステップ 3: アドミッション データセットをロードする
std_admissions_data = panda_obj.read_csv( 「std_admission_dataset.csv」

# データを前処理し、特徴 (F) とターゲット (t) に分割します。
F = std_admissions_data.drop([ 「入学状況」 ]、軸= 1
t = std_admissions_data[ 「入学状況」

# ワンホットエンコーディングを使用してカテゴリ変数を数値に変換する
F = panda_obj.get_dummies(F)
F_training, F_testing, t_training, t_testing = tts(F, t, test_size= 0.2 、ランダム状態= 42

ステップ 4: MLflow 実験名を設定する

adm_experiment_name = 「大学_入学_実験」
mlflow.set_experiment(adm_experiment_name)

ステップ 5: 勾配ブースティング分類器を定義する

勾配ブースティング分類器モデルが gbc_obj 変数に保存されるようになりました。入場データセットは、このモデルのテストとトレーニングに使用できます。 random_state 引数の値は 42 です。これにより、モデルがまったく同じ乱数生成シードを使用してトレーニングされることが保証され、結果が再現可能になります。

gbc_obj = GBC(ランダム状態= 42

ステップ 6: ハイパーパラメータ グリッドを定義する

コードは最初に param_grid 辞書を作成します。グリッド検索によって調整されるハイパーパラメータは、このディクショナリに含まれています。 param_grid ディクショナリは、n_estimators、learning_rate、max_ Depth の 3 つのキーで構成されます。これらは、勾配ブースティング分類子モデルのハイパーパラメーターです。モデル内のツリーの数は、ハイパーパラメーター n_estimators によって指定されます。モデルの学習率は、learning_rate ハイパーパラメーターによって指定されます。ハイパーパラメータ max_ Depth は、モデルのツリーの最大の深さを定義します。

コードスニペット:

param_grid = {

'n_estimators' :[ 100 150 200 ]、

'学習率' :[ 0.01 0.1 0.2 ]、

'最大深さ' :[ 4 5 6

}

ステップ 7: MLflow Tracking を使用してグリッド検索を実行する

次に、コードは param_grid ディクショナリを反復処理します。ディクショナリ内のハイパーパラメータのセットごとに、コードは次の処理を実行します。

  • 新しい MLflow 実行を開始します
  • ハイパーパラメータがリストになっていない場合は、ハイパーパラメータをリストに変換します。
  • ハイパーパラメータを MLflow に記録します。
  • 指定されたハイパーパラメータを使用してグリッド検索モデルをトレーニングします
  • グリッド検索から最適なモデルを取得します
  • 最適なモデルを機能させるテストデータを予測します
  • モデルの精度を計算します
  • ハイパーパラメータ、精度、分類レポートを印刷します。
  • 精度とモデルを MLflow に記録します。

コードスニペット:

warn.catch_warnings() を使用:
warn.filterwarnings( '無視する' 、カテゴリ=ユーザー警告、モジュール= '.*distutil.*' )
pg(param_grid) のパラメータの場合:
mlflow.start_run(run_name= を使用) 「入学_ステータス実行」 ):
# 単一の値をリストに変換する
params = {key: [value] if isinstance(value, list) else キーの値、params.items() の値}
mlflow.log_params(params)
Grid_search = gscv(gbc_obj, param_grid=params, cv= 5 )
Grid_search.fit(F_training, t_training)
std_best_model = Grid_search.best_estimator_
model_predictions = std_best_model.predict(F_testing)
model_accuracy_score = acs(t_testing, model_predictions)
印刷( 「ハイパーパラメータ:」 、パラメータ)
印刷( '正確さ:' 、モデル精度スコア)
# UnknownMetricWarning を明示的に無視する
warn.catch_warnings() を使用:
warn.filterwarnings( '無視する' 、カテゴリ=警告)
印刷( 「分類レポート:」 )
print(cr(t_testing、model_predictions、zero_division= 1 ))
mlflow.log_metric( '正確さ' 、モデル精度スコア)
mlflow.sklearn.log_model(std_best_model, 「gb_classifier_model」 )

ステップ 8: Python を使用してプログラムを実行する

MLflow サーバー上の出力は次のとおりです。

結論

MLflow のグリッド検索ツールは、機械学習モデルの調整、結果の追跡、ハイパーパラメーターの変更を自動化します。理想的なハイパーパラメータを決定し、信頼性の高い結果を保証するのに役立ちますが、大規模なハイパーパラメータ実験では計算コストが高くなる可能性があります。