Automated ML 및 Python을 사용하여 회귀 모델 학습(SDK v1)

적용 대상: Python SDK azureml v1

이 문서에서는 Azure Machine Learning 자동화된 ML을 사용하여 Azure Machine Learning Python SDK를 통해 회귀 모델을 학습하는 방법에 대해 알아봅니다. 회귀 모델은 뉴욕시(NYC)에서 운영되는 택시의 승객 요금을 예측합니다. Python SDK로 코드를 작성하여 준비된 데이터로 작업 영역을 구성하고, 사용자 지정 매개 변수를 사용하여 로컬에서 모델을 학습시키고, 결과를 탐색합니다.

프로세스는 학습 데이터 및 구성 설정을 허용합니다. 다양한 기능 정규화/표준화 방법, 모델 및 하이퍼 매개 변수 설정의 조합을 자동으로 반복하여 최상의 모델에 도달합니다. 다음 다이어그램은 회귀 모델 학습의 프로세스 흐름을 보여 줍니다.

문서에 설명된 회귀 모델 학습의 프로세스 흐름을 보여 주는 다이어그램.

필수 구성 요소

  • Azure 구독 Azure Machine Learning의 무료 또는 유료 계정을 만들 수 있습니다.

  • Azure Machine Learning 작업 영역 또는 컴퓨팅 인스턴스입니다. 이러한 리소스를 준비하려면 빠른 시작: Azure Machine Learning 시작하기를 참조하세요.

  • Notebook을 작업 영역에 로드하여 자습서 연습을 위한 준비된 샘플 데이터를 가져옵니다.

    1. Azure Machine Learning 스튜디오의 작업 영역으로 이동하여 Notebooks을 선택한 다음 샘플 탭을 선택합니다.

    2. Notebook 목록에서 샘플>SDK v1>자습서>regression-automl-nyc-taxi-data 노드를 확장합니다.

    3. regression-automated-ml.ipynb Notebook을 선택합니다.

    4. 이 자습서의 일부로 각 Notebook 셀을 실행하려면 이 파일 복제를 선택합니다.

    대체 방법: 원하는 경우 로컬 환경의 자습서 연습을 실행할 수 있습니다. 이 자습서는 GitHub의 Azure Machine Learning Notebooks 리포지토리를 사용할 수 있습니다. 이 방법의 경우 다음 단계에 따라 필요한 패키지를 가져옵니다.

    1. 전체 automl 클라이언트를 설치합니다.

    2. 로컬 컴퓨터에서 pip install azureml-opendatasets azureml-widgets 명령을 실행하여 필요한 패키지를 가져옵니다.

데이터 다운로드 및 준비

Open Datasets 패키지는 다운로드하기 전에 필터 날짜 매개 변수를 쉽게 필터링하기 위해 각 데이터 원본(예: NycTlcGreen)을 표시하는 클래스를 포함합니다.

다음 코드는 필요한 패키지를 가져옵니다.

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

첫 번째 단계는 택시 데이터의 데이터 프레임을 만드는 것입니다. Spark가 아닌 환경에서 작업하는 경우, Open Datasets 패키지를 사용하면 특정 클래스에서 한 번에 한 달 분량의 데이터만 다운로드할 수 있습니다. 이 방법은 큰 데이터 세트에서 발생할 수 있는 MemoryError 문제를 방지하는 데 도움이 됩니다.

택시 데이터를 다운로드하려면 한 번에 한 달씩 반복적으로 가져옵니다. green_taxi_df DataFrame에 다음 데이터 집합을 추가하기 전에 매월 2,000개의 레코드를 임의로 샘플링한 다음 데이터를 미리 봅니다. 이 방법을 사용하면 DataFrame이 bloating되는 것을 방지할 수 있습니다.

다음 코드는 DataFrame을 만들고, 데이터를 가져오고, DataFrame에 로드합니다.

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
2 2015-01-30 18:38:09 2015-01-30 19:01:49 1 1.88 None None -73.996155 40.690903 -73.964287 ... 1 15.0 1.0 0.5 0.3 4.00 0.0 None 20.80 1.0
1 2015-01-17 23:21:39 2015-01-17 23:35:16 1 2.70 None None -73.978508 40.687984 -73.955116 ... 1 11.5 0.5 0.5 0.3 2.55 0.0 None 15.35 1.0
2 2015-01-16 01:38:40 2015-01-16 01:52:55 1 3.54 None None -73.957787 40.721779 -73.963005 ... 1 13.5 0.5 0.5 0.3 2.80 0.0 None 17.60 1.0
2 2015-01-04 17:09:26 2015-01-04 17:16:12 1 1.00 None None -73.919914 40.826023 -73.904839 ... 2 6.5 0.0 0.5 0.3 0.00 0.0 None 7.30 1.0
1 2015-01-14 10:10:57 2015-01-14 10:33:30 1 5.10 None None -73.943710 40.825439 -73.982964 ... 1 18.5 0.0 0.5 0.3 3.85 0.0 None 23.15 1.0
2 2015-01-19 18:10:41 2015-01-19 18:32:20 1 7.41 None None -73.940918 40.839714 -73.994339 ... 1 24.0 0.0 0.5 0.3 4.80 0.0 None 29.60 1.0
2 2015-01-01 15:44:21 2015-01-01 15:50:16 1 1.03 None None -73.985718 40.685646 -73.996773 ... 1 6.5 0.0 0.5 0.3 1.30 0.0 None 8.60 1.0
2 2015-01-12 08:01:21 2015-01-12 08:14:52 5 2.94 None None -73.939865 40.789822 -73.952957 ... 2 12.5 0.0 0.5 0.3 0.00 0.0 None 13.30 1.0
1 2015-01-16 21:54:26 2015-01-16 22:12:39 1 3.00 None None -73.957939 40.721928 -73.926247 ... 1 14.0 0.5 0.5 0.3 2.00 0.0 None 17.30 1.0
2 2015-01-06 06:34:53 2015-01-06 06:44:23 1 2.31 None None -73.943825 40.810257 -73.943062 ... 1 10.0 0.0 0.5 0.3 2.00 0.0 None 12.80 1.0

학습 또는 기타 기능 빌드에 필요하지 않은 일부 열을 제거하는 것이 유용합니다. 예를 들어, 자동화된 ML은 시간 기반 기능을 자동으로 처리하므로 lpepPickupDatetime 열을 제거할 수 있습니다.

다음 코드는 샘플 데이터에서 14개의 열을 제거합니다.

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
count 24000.00 24000.00 24000.00 24000.00 24000.00 24000.00 24000.00 24000.00
mean 1.777625 1.373625 2.893981 -73.827403 40.689730 -73.819670 40.684436 14.892744
std 0.415850 1.046180 3.072343 2.821767 1.556082 2.901199 1.599776 12.339749
min 1.00 0.00 0.00 -74.357101 0.00 -74.342766 0.00 -120.80
25% 2.00 1.00 1.05 -73.959175 40.699127 -73.966476 40.699459 8.00
50% 2.00 1.00 1.93 -73.945049 40.746754 -73.944221 40.747536 11.30
75% 2.00 1.00 3.70 -73.917089 40.803060 -73.909061 40.791526 17.80
max 2.00 8.00 154.28 0.00 41.109089 0.00 40.982826 425.00

요약 통계에는 모델 정확도를 떨어뜨리는 값인 이상값이 있는 여러 필드가 표시됩니다. 이 문제를 해결하려면 위도/경도 필드를 필터링하여 값이 맨해튼 지역 범위 내에 오도록 합니다. 이런 접근은 장거리 택시 여행이나 다른 특징과 관련된 이상치인 여행을 필터링합니다.

다음으로, tripDistance 필드를 필터링하여 0보다 크지만 31마일 미만인 값(두 위도/경도 쌍 사이의 haversine 거리)을 필터링합니다. 이 기술은 운행 비용에 일관성이 없는 장거리 이상치 운행이 제외됩니다.

마지막으로, 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()

작업 영역 구성

기존 작업 영역에서 작업 영역 개체를 만듭니다. Workspace는 Azure 구독 및 리소스 정보를 허용하는 클래스입니다. 또한 클라우드 리소스를 만들어서 모델 실행을 모니터링하고 추적합니다.

다음 코드는 Workspace.from_config() 함수를 호출하여 config.json 파일을 읽고 인증 세부 정보를 ws 개체에 로드합니다.

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

ws 개체는 이 자습서에서 나머지 코드에 사용됩니다.

훈련 및 테스트 집합으로 데이터 분할

scikit-learn 라이브러리에서 train_test_split 함수를 사용하여 데이터를 학습 및 테스트 세트로 분할합니다. 이 함수는 데이터를 모델 학습용 x(기능) 데이터 세트 및 테스트용 y(예측 값) 데이터 세트로 분리합니다.

test_size 매개 변수는 테스트에 할당할 데이터 백분율을 정의합니다. random_state 매개 변수는 학습-테스트 분할이 결정적이 되도록 임의 생성기에 시드를 설정합니다.

다음 코드는 train_test_split 함수를 호출하여 x 및 y 데이터 세트를 로드합니다.

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)

참고 항목

자동화된 ML 사전 처리 단계(기능 정규화, 누락된 데이터 처리, 텍스트를 숫자로 변환 등)는 기본 모델의 일부가 됩니다. 예측에 모델을 사용하는 경우 학습 중에 적용되는 동일한 전처리 단계가 입력 데이터에 자동으로 적용됩니다.

자동 회귀 모델 학습

작업 영역에 실험 개체를 만듭니다. 실험은 개별 작업에 대한 컨테이너 역할을 합니다. 정의된 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 위젯에 대한 실행 세부 정보:

Azure Machine Learning 스튜디오의 Jupyter 위젯 실행 세부 정보를 보여 주는 스크린샷

Jupyter 위젯의 플롯 차트:

Azure Machine Learning 스튜디오의 Jupyter 위젯 플롯 다이어그램을 보여 주는 스크린샷.

최상의 모델 검색

다음 코드를 사용하면 반복에서 최상의 모델을 선택할 수 있습니다. get_output 함수는 마지막 맞춤 호출에 대한 최적의 실행 및 맞춤 모델을 반환합니다. 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 함수는 두 개의 값 배열을 사용하고 두 배열 간의 평균 제곱 오차를 계산합니다. 결과의 제곱근을 구하면 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.00 이내, 오류율 약 15%).

기존의 기계 학습 모델 개발 프로세스는 리소스를 많이 사용합니다. 수십 개의 모델을 실행하고 결과를 비교하려면 상당한 도메인 지식과 시간 투자가 필요합니다. 자동화된 기계 학습을 사용하는 것은 시나리오에 대한 다른 여러 모델을 신속하게 테스트하는 좋은 방법입니다.

리소스 정리

다른 Azure Machine Learning 자습서에서 작업할 계획이 없는 경우 다음 단계를 완료하여 더 이상 필요하지 않은 리소스를 제거합니다.

컴퓨팅 중지

컴퓨팅을 사용한 경우 가상 머신을 사용하지 않을 때 가상 머신을 중지하고 비용을 절감할 수 있습니다.

  1. Azure Machine Learning 스튜디오의 작업 영역으로 이동하여 컴퓨팅을 선택합니다.

  2. 목록에서 중지하려는 컴퓨팅을 선택한 다음 중지를 선택합니다.

컴퓨팅을 다시 사용할 준비가 되면 가상 머신을 다시 시작할 수 있습니다.

다른 리소스 삭제

이 자습서서 만든 리소스를 사용하지 않을 계획이라면 삭제하여 추가 요금이 부과되지 않도록 할 수 있습니다.

다음 단계에 따라 리소스 그룹 및 모든 리소스를 제거합니다.

  1. Azure Portal에서 리소스 그룹으로 이동합니다.

  2. 목록에서 이 자습서에서 만든 리소스 그룹을 선택한 다음, 리소스 그룹 삭제를 선택합니다.

  3. 확인 프롬프트에서 리소스 그룹 이름을 입력한 후 삭제를 선택합니다.

리소스 그룹을 유지하고 단일 작업 영역만 삭제하려면 다음 단계를 수행합니다.

  1. Azure Portal에서 제거하려는 작업 영역이 포함된 리소스 그룹으로 이동합니다.

  2. 작업 영역을 선택하고 속성을 선택한 다음 삭제를 선택합니다.

다음 단계