AutoML と Python (SDK v1) を使用して回帰モデルをトレーニングする

適用対象:Python SDK azureml v1

この記事では、Azure Machine Learning の自動 ML を使用して Azure Machine Learning Python SDK で回帰モデルをトレーニングする方法について説明します。 この回帰モデルでは、NYC タクシーの料金を予測します。

このプロセスは、トレーニング データと構成設定を受け取り、さまざまなフィーチャーの正規化/標準化の方法、モデル、およびハイパーパラメーター設定の組み合わせを自動的に反復処理し、最適なモデルに到達します。

Flow diagram

この記事では、Python SDK を使用してコードを記述します。 次のタスクについて説明します。

  • Azure Open Datasets を使用してデータのダウンロード、変換、クリーニングを行う
  • 自動機械学習回帰モデルをトレーニングする
  • モデルの精度を計算する

コードなしの AutoML の場合は、次のチュートリアルを試してください。

前提条件

Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。 無料版または有料版の Azure Machine Learning を今すぐお試しください。

  • まだ Azure Machine Learning ワークスペースまたはコンピューティング インスタンスがない場合は、Azure Machine Learning の利用開始に関するクイックスタートを完了します。
  • ウィザードの完了後:
    1. スタジオで [Notebooks] を選択します。
    2. [サンプル] タブを選択します。
    3. SDK v1/tutorials/regression-automl-nyc-taxi-data/regression-automated-ml.ipynb ノートブックを開きます。
    4. チュートリアルで各セルを実行するには、 [このノートブックを複製する] を選択します

独自の ローカル環境で実行したい場合は、この記事を GitHub で入手することもできます。 必要なパッケージを取得するには、

データのダウンロードと準備

必要なパッケージをインポートします。 オープン データセット パッケージには各データ ソースを表すクラス (たとえば NycTlcGreen) が含まれており、ダウンロードする前に簡単に日付パラメーターをフィルター処理できます。

from azureml.opendatasets import NycTlcGreen
import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta

まず、タクシーのデータを保持するデータフレームを作成します。 Spark 以外の環境で作業する場合、Open Datasets では、大きなデータセットによる MemoryErrorを回避するために、特定のクラスの 1 か月分のデータしか一度にダウンロードできません。

タクシー データをダウンロードするには、一度に 1 か月分をフェッチすることを繰り返してから green_taxi_df に付加し、各月の 2,000 レコードをランダムにサンプリングして、データフレームが大きくならないようにします。 次に、データをプレビューします。

green_taxi_df = pd.DataFrame([])
start = datetime.strptime("1/1/2015","%m/%d/%Y")
end = datetime.strptime("1/31/2015","%m/%d/%Y")

for sample_month in range(12):
    temp_df_green = NycTlcGreen(start + relativedelta(months=sample_month), end + relativedelta(months=sample_month)) \
        .to_pandas_dataframe()
    green_taxi_df = green_taxi_df.append(temp_df_green.sample(2000))

green_taxi_df.head(10)
vendorID lpepPickupDatetime lpepDropoffDatetime passengerCount tripDistance puLocationId doLocationId pickupLongitude pickupLatitude dropoffLongitude ... paymentType fareAmount extra mtaTax improvementSurcharge tipAmount tollsAmount ehailFee totalAmount tripType
131969 2 2015-01-11 05:34:44 2015-01-11 05:45:03 3 4.84 なし なし -73.88 40.84 -73.94 ... 2 15.00 0.50 0.50 0.3 0.00 0.00 nan 16.30
1129817 2 2015-01-20 16:26:29 2015-01-20 16:30:26 1 0.69 なし なし -73.96 40.81 -73.96 ... 2 4.50 1.00 0.50 0.3 0.00 0.00 nan 6.30
1278620 2 2015-01-01 05:58:10 2015-01-01 06:00:55 1 0.45 なし なし -73.92 40.76 -73.91 ... 2 4.00 0.00 0.50 0.3 0.00 0.00 nan 4.80
348430 2 2015-01-17 02:20:50 2015-01-17 02:41:38 1 0.00 なし なし -73.81 40.70 -73.82 ... 2 12.50 0.50 0.50 0.3 0.00 0.00 nan 13.80
1269627 1 2015-01-01 05:04:10 2015-01-01 05:06:23 1 0.50 なし なし -73.92 40.76 -73.92 ... 2 4.00 0.50 0.50 0 0.00 0.00 nan 5.00
811755 1 2015-01-04 19:57:51 2015-01-04 20:05:45 2 1.10 なし なし -73.96 40.72 -73.95 ... 2 6.50 0.50 0.50 0.3 0.00 0.00 nan 7.80
737281 1 2015-01-03 12:27:31 2015-01-03 12:33:52 1 0.90 なし なし -73.88 40.76 -73.87 ... 2 6.00 0.00 0.50 0.3 0.00 0.00 nan 6.80
113951 1 2015-01-09 23:25:51 2015-01-09 23:39:52 1 3.30 なし なし -73.96 40.72 -73.91 ... 2 12.50 0.50 0.50 0.3 0.00 0.00 nan 13.80
150436 2 2015-01-11 17:15:14 2015-01-11 17:22:57 1 1.19 なし なし -73.94 40.71 -73.95 ... 1 7.00 0.00 0.50 0.3 1.75 0.00 nan 9.55
432136 2 2015-01-22 23:16:33 2015-01-22 23:20:13 1 0.65 なし なし -73.94 40.71 -73.94 ... 2 5.00 0.50 0.50 0.3 0.00 0.00 nan 6.30

トレーニングまたはその他の特徴の構築で必要としない列を削除します。 自動機械学習では、lpepPickupDatetime などの時間ベースの機能が自動的に処理されます。

columns_to_remove = ["lpepDropoffDatetime", "puLocationId", "doLocationId", "extra", "mtaTax",
                     "improvementSurcharge", "tollsAmount", "ehailFee", "tripType", "rateCodeID",
                     "storeAndFwdFlag", "paymentType", "fareAmount", "tipAmount"
                    ]
for col in columns_to_remove:
    green_taxi_df.pop(col)

green_taxi_df.head(5)

データをクレンジングする

新しいデータフレームに対して describe() 関数を実行して、各フィールドの概要の統計を確認します。

green_taxi_df.describe()
vendorID passengerCount tripDistance pickupLongitude pickupLatitude dropoffLongitude dropoffLatitude totalAmount month_num day_of_month day_of_week hour_of_day
count 48000.00 48000.00 48000.00 48000.00 48000.00 48000.00 48000.00 48000.00 48000.00 48000.00
mean 1.78 1.37 2.87 -73.83 40.69 -73.84 40.70 14.75 6.50 15.13
std 0.41 1.04 2.93 2.76 1.52 2.61 1.44 12.08 3.45 8.45
min 1.00 0.00 0.00 -74.66 0.00 -74.66 0.00 -300.00 1.00 1.00
25% 2.00 1.00 1.06 -73.96 40.70 -73.97 40.70 7.80 3.75 8.00
50% 2.00 1.00 1.90 -73.94 40.75 -73.94 40.75 11.30 6.50 15.00
75% 2.00 1.00 3.60 -73.92 40.80 -73.91 40.79 17.80 9.25 22.00
max 2.00 9.00 97.57 0.00 41.93 0.00 41.94 450.00 12.00 30.00

概要の統計では、外れ値すなわちモデルの精度を低下させる値を含むフィールドがいくつか見つかります。 まず、マンハッタン エリアの境界内に収まるように緯度と経度のフィールドをフィルター処理します。 これにより、その距離範囲を超えるタクシー乗車や、他の特徴との関係の点で外れ値となっているタクシー乗車が除外されます。

加えて、tripDistance フィールドが 0 より大きく 31 マイル (2 つの緯度経度ペア間の半正矢距離) 未満となるようにフィルター処理します。 これにより、移動距離が長く、矛盾した運賃となっている外れ値の乗車が除外されます。

最後に、タクシー料金の totalAmount フィールドに負の値が含まれていますが、これは、ここで扱うモデルのコンテキストでは意味を成しません。また、passengerCount フィールドにも、最小値が 0 である無効なデータがあります。

これらの異常値をフィルターで除外してから、最終的にトレーニングのために不必要ないくつかの列を削除します。

final_df = green_taxi_df.query("pickupLatitude>=40.53 and pickupLatitude<=40.88")
final_df = final_df.query("pickupLongitude>=-74.09 and pickupLongitude<=-73.72")
final_df = final_df.query("tripDistance>=0.25 and tripDistance<31")
final_df = final_df.query("passengerCount>0 and totalAmount>0")

columns_to_remove_for_training = ["pickupLongitude", "pickupLatitude", "dropoffLongitude", "dropoffLatitude"]
for col in columns_to_remove_for_training:
    final_df.pop(col)

再びデータに対して describe() を呼び出して、クレンジングが予期したとおりに動作したことを確認します。 これで、機械学習モデルのトレーニングに使用するためのタクシー、休日、気象のデータセットの準備とクレンジングが終了しました。

final_df.describe()

ワークスペースの構成

既存のワークスペースからワークスペース オブジェクトを作成します。 ワークスペースは、お客様の Azure サブスクリプションとリソースの情報を受け取るクラスです。 また、これにより、お客様のモデル実行を監視して追跡するためのクラウド リソースが作成されます。 Workspace.from_config() により、config.json ファイルが読み取られ、認証の詳細情報が ws という名前のオブジェクトに読み込まれます。 ws は、この記事の残りのコード全体で使用されています。

from azureml.core.workspace import Workspace
ws = Workspace.from_config()

データをトレーニング セットとテスト セットに分割する

scikit-learn ライブラリの train_test_split 関数を使用して、トレーニング セットとテスト セットにデータを分割します。 この関数は、モデル トレーニング用の x (特徴) データ セットとテスト用の y (予測する値) データ セットに、データを分割します。

test_size パラメーターでは、テストに割り当てるデータの割合を決定します。 random_state パラメーターでは、お客様のトレーニングとテストの分割が決定論的になるように、乱数ジェネレーターにシードを設定します。

from sklearn.model_selection import train_test_split

x_train, x_test = train_test_split(final_df, test_size=0.2, random_state=223)

この手順の目的は、正しい精度を測定するために、モデルのトレーニングに使用されたことのないデータ ポイントで完成モデルをテストすることです。

つまり、適切にトレーニングされたモデルは、まだ見たことのないデータから正確な予測ができるはずです。 機械学習モデルの自動トレーニングに使用するデータの準備が整いました。

自動的にモデルをトレーニングする

モデルを自動的にトレーニングするには、次の手順を実行します。

  1. 実験の実行用の設定を定義する。 トレーニング データを構成にアタッチし、トレーニング プロセスを制御する設定を変更します。
  2. モデル調整用の実験を送信する。 実験を送信した後、プロセスは定義された制約に従って、他の機械学習アルゴリズムとハイパー パラメーター設定を反復処理します。 精度メトリックを最適化することによって、最適なモデルが選択されます。

トレーニングの設定を定義する

トレーニング用の実験パラメーターとモデルの設定を定義します。 設定の完全な一覧を表示します。 これらの既定の設定で実験を送信するには約 5 分から 20 分かかりますが、実行時間を短くしたい場合は experiment_timeout_hours パラメーターを減らしてください。

プロパティ この記事の値 説明
iteration_timeout_minutes 10 各イテレーションの分単位での時間制限。 各イテレーションにより多くの時間を必要とする大規模なデータセットの場合は、この値を大きくします。
experiment_timeout_hours 0.3 すべてのイテレーションを組み合わせて、実験が終了するまでにかかる最大時間 (時間単位)。
enable_early_stopping True 短期間でスコアが向上していない場合に、早期終了を有効にするフラグ。
primary_metric spearman_correlation 最適化したいメトリック。 このメトリックに基づいて、最適なモデルが選択されます。
featurization 自動 auto を使用すると、実験の入力データを前処理できます (欠損データの処理、テキストから数値への変換など)。
verbosity logging.INFO ログ記録のレベルを制御します。
n_cross_validations 5 検証データが指定されていない場合に実行される、クロス検証の分割の数。
import logging

automl_settings = {
    "iteration_timeout_minutes": 10,
    "experiment_timeout_hours": 0.3,
    "enable_early_stopping": True,
    "primary_metric": 'spearman_correlation',
    "featurization": 'auto',
    "verbosity": logging.INFO,
    "n_cross_validations": 5
}

定義済みのトレーニング設定を AutoMLConfig オブジェクトへの **kwargs パラメーターとして使用します。 さらに、トレーニング データとモデルの種類を指定します。モデルの種類は、ここでは regression です。

from azureml.train.automl import AutoMLConfig

automl_config = AutoMLConfig(task='regression',
                             debug_log='automated_ml_errors.log',
                             training_data=x_train,
                             label_column_name="totalAmount",
                             **automl_settings)

Note

自動化された機械学習の前処理手順 (機能の正規化、欠損データの処理、テキストから数値への変換など) は、基になるモデルの一部になります。 モデルを予測に使用する場合、トレーニング中に適用されたのと同じ前処理手順が入力データに自動的に適用されます。

自動回帰モデルをトレーニングする

自分のワークスペース内に実験オブジェクトを作成します。 実験は、個々のジョブのコンテナーとして機能します。 定義済みの automl_config オブジェクトを実験に渡し、出力を True に設定してジョブ中の進行状況を表示します。

実験の開始後、その実行に伴い、表示される出力が随時更新されます。 各イテレーションでは、モデルの種類、実行継続時間、およびトレーニングの精度が表示されます。 BEST フィールドでは、メトリックの種類に基づいて、最高の実行トレーニング スコアが追跡されます。

from azureml.core.experiment import Experiment
experiment = Experiment(ws, "Tutorial-NYCTaxi")
local_run = experiment.submit(automl_config, show_output=True)
Running on local machine
Parent Run ID: AutoML_1766cdf7-56cf-4b28-a340-c4aeee15b12b
Current status: DatasetFeaturization. Beginning to featurize the dataset.
Current status: DatasetEvaluation. Gathering dataset statistics.
Current status: FeaturesGeneration. Generating features for the dataset.
Current status: DatasetFeaturizationCompleted. Completed featurizing the dataset.
Current status: DatasetCrossValidationSplit. Generating individually featurized CV splits.
Current status: ModelSelection. Beginning model selection.

****************************************************************************************************
ITERATION: The iteration being evaluated.
PIPELINE: A summary description of the pipeline being evaluated.
DURATION: Time taken for the current iteration.
METRIC: The result of computing score on the fitted pipeline.
BEST: The best observed score thus far.
****************************************************************************************************

 ITERATION   PIPELINE                                       DURATION      METRIC      BEST
         0   StandardScalerWrapper RandomForest             0:00:16       0.8746    0.8746
         1   MinMaxScaler RandomForest                      0:00:15       0.9468    0.9468
         2   StandardScalerWrapper ExtremeRandomTrees       0:00:09       0.9303    0.9468
         3   StandardScalerWrapper LightGBM                 0:00:10       0.9424    0.9468
         4   RobustScaler DecisionTree                      0:00:09       0.9449    0.9468
         5   StandardScalerWrapper LassoLars                0:00:09       0.9440    0.9468
         6   StandardScalerWrapper LightGBM                 0:00:10       0.9282    0.9468
         7   StandardScalerWrapper RandomForest             0:00:12       0.8946    0.9468
         8   StandardScalerWrapper LassoLars                0:00:16       0.9439    0.9468
         9   MinMaxScaler ExtremeRandomTrees                0:00:35       0.9199    0.9468
        10   RobustScaler ExtremeRandomTrees                0:00:19       0.9411    0.9468
        11   StandardScalerWrapper ExtremeRandomTrees       0:00:13       0.9077    0.9468
        12   StandardScalerWrapper LassoLars                0:00:15       0.9433    0.9468
        13   MinMaxScaler ExtremeRandomTrees                0:00:14       0.9186    0.9468
        14   RobustScaler RandomForest                      0:00:10       0.8810    0.9468
        15   StandardScalerWrapper LassoLars                0:00:55       0.9433    0.9468
        16   StandardScalerWrapper ExtremeRandomTrees       0:00:13       0.9026    0.9468
        17   StandardScalerWrapper RandomForest             0:00:13       0.9140    0.9468
        18   VotingEnsemble                                 0:00:23       0.9471    0.9471
        19   StackEnsemble                                  0:00:27       0.9463    0.9471

結果を検索する

Jupyter ウィジェットを使用して、自動トレーニングの結果を探索します。 このウィジェットを使用すると、トレーニング精度のメトリックとメタデータと共に、各ジョブのすべてのイテレーションのグラフと表を確認できます。 さらに、ドロップダウン セレクターを使用して、主なメトリック以外にも、さまざまな精度メトリックを条件としてフィルター処理することができます。

from azureml.widgets import RunDetails
RunDetails(local_run).show()

Jupyter widget run detailsJupyter widget plot

最高のモデルを取得する

イテレーションから最適なモデルを選択します。 get_output 関数は、最適な実行と、最後の fit の呼び出しで適合したモデルを返します。 get_output 上のオーバーロードを使用して、ログ記録された任意のメトリックや特定のイテレーションに対する最適な実行と適合モデルを取得できます。

best_run, fitted_model = local_run.get_output()
print(best_run)
print(fitted_model)

最高のモデルの正確性をテストする

最高のモデルを使用して、テスト データ セット上で予測を実行し、タクシー料金を予測します。 関数 predict は最高のモデルを使用して、x_test データ セットから y (交通費) の値を予測します。 y_predict から最初の 10 個の予測コスト値をプリントします。

y_test = x_test.pop("totalAmount")

y_predict = fitted_model.predict(x_test)
print(y_predict[:10])

結果の root mean squared error を計算します。 予測値と比較するために、y_test データフレームをリストに変換します。 関数 mean_squared_error によって 2 つの配列の値が受け取られ、それらの間の平均二乗誤差が計算されます。 結果の平方根を取ると、y 変数 (コスト) と同じ単位で誤差が得られます。 これは、タクシー料金の予測が実際の料金からどの程度離れているかを大まかに示します。

from sklearn.metrics import mean_squared_error
from math import sqrt

y_actual = y_test.values.flatten().tolist()
rmse = sqrt(mean_squared_error(y_actual, y_predict))
rmse

次のコードを実行し、完全な y_actualy_predict データ セットを使用して平均絶対誤差率 (MAPE) を計算します。 このメトリックでは、予測される各値と実際の値の間の絶対誤差が計算され、すべての差分が合計されます。 そしてその合計が、実際の値の合計に対する割合として表されます。

sum_actuals = sum_errors = 0

for actual_val, predict_val in zip(y_actual, y_predict):
    abs_error = actual_val - predict_val
    if abs_error < 0:
        abs_error = abs_error * -1

    sum_errors = sum_errors + abs_error
    sum_actuals = sum_actuals + actual_val

mean_abs_percent_error = sum_errors / sum_actuals
print("Model MAPE:")
print(mean_abs_percent_error)
print()
print("Model Accuracy:")
print(1 - mean_abs_percent_error)
Model MAPE:
0.14353867606052823

Model Accuracy:
0.8564613239394718

最終的な予測精度メトリックから、モデルでのデータ セットの特徴によるタクシー料金の予測はかなり良好で、誤差は ± 4 ドル (約 15%) 以内であることがわかります。

従来の機械学習モデルの開発プロセスでは、リソースが大量に消費され、数十個のモデルを実行して結果を比較するために、その領域に関する膨大な知識と時間の投資が必要とされます。 自動化された機械学習の使用は、シナリオに合わせてさまざまなモデルを迅速にテストするための優れた方法です。

リソースをクリーンアップする

Azure Machine Learning の他のチュートリアルを実行する予定の場合、このセクションを実行しないでください。

コンピューティング インスタンスの停止

コンピューティング インスタンスを使用していた場合は、使用していない VM を停止してコストを削減します。

  1. お使いのワークスペースで、 [コンピューティング] を選択します。

  2. 一覧から、コンピューティング インスタンスの名前を選択します。

  3. [停止] を選択します。

  4. サーバーを再び使用する準備が整ったら、 [開始] を選択します。

すべてを削除する

作成したリソースを今後使用する予定がない場合は、課金が発生しないように削除します。

  1. Azure Portal で、左端にある [リソース グループ] を選択します。
  2. 作成したリソース グループを一覧から選択します。
  3. [リソース グループの削除] を選択します。
  4. リソース グループ名を入力します。 次に、 [削除] を選択します。

リソース グループは保持しつつ、いずれかのワークスペースを削除することもできます。 ワークスペースのプロパティを表示し、 [削除] を選択します。

次のステップ

自動化された機械学習に関するこの記事では、以下のタスクを学習しました。

  • 実験用のワークスペースと準備されたデータを構成しました。
  • カスタム パラメーターを使って、自動化された回帰モデルをローカルで使用してトレーニングしました。
  • トレーニング結果を調べて確認しました。

Python を使用して Computer Vision モデルをトレーニングするために AutoML を設定する (v1)