Поделиться через


Обучение модели регрессии с помощью автоматизированного машинного обучения и Python (пакет SDK версии 1)

ОБЛАСТЬ ПРИМЕНЕНИЯ: Пакет SDK для Python версии 1

В этой статье вы узнаете, как обучить модель регрессии с помощью пакета SDK для Python Машинное обучение Azure с помощью Машинное обучение Azure автоматизированного машинного обучения. Модель регрессии прогнозирует тарифы на пассажиров для такси, работающих в Нью-Йорке (Нью-Йорк). Вы создаете код с помощью пакета SDK для Python, чтобы настроить рабочую область с подготовленными данными, обучить модель локально с помощью пользовательских параметров и изучить результаты.

Процесс принимает данные обучения и параметры конфигурации. Он автоматически выполняет итерацию с помощью сочетаний различных методов нормализации и стандартизации функций, моделей и параметров гиперпараметра, чтобы получить лучшую модель. На следующей схеме показан поток процесса для обучения модели регрессии:

Схема, демонстрирующая поток процесса для обучения модели регрессии, описанной в статье.

Необходимые компоненты

  • Подписка Azure. Вы можете создать бесплатную или платную учетную запись Машинное обучение Azure.

  • Машинное обучение Azure рабочей области или вычислительного экземпляра. Сведения о подготовке этих ресурсов см. в кратком руководстве по началу работы с Машинное обучение Azure.

  • Получите подготовленные примеры данных для упражнений руководства, загрузив записную книжку в рабочую область:

    1. Перейдите в рабочую область в Студия машинного обучения Azure, выберите "Записные книжки" и перейдите на вкладку "Примеры".

    2. В списке записных книжек разверните узел sdk>для примеров>версии 1>. Регрессия-automl-nyc-taxi-data.

    3. Выберите записную книжку regression-automated-ml.ipynb .

    4. Чтобы запустить каждую ячейку записной книжки в рамках этого руководства, выберите клонировать этот файл.

    Альтернативный подход. Если вы предпочитаете, вы можете выполнить упражнения руководства в локальной среде. Руководство доступно в репозитории записных книжек Машинное обучение Azure на GitHub. Для этого подхода выполните следующие действия, чтобы получить необходимые пакеты:

    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 кадру данных случайным образом образец 2000 записей из каждого месяца, а затем предварительный просмотр данных. Этот подход помогает избежать раздувания кадра данных.

Следующий код создает кадр данных, извлекает данные и загружает его в кадр данных:

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 нет нет -73.996155 40.690903 -73.964287 ... 1 15,0 1.0 0,5 0,3 4,00 0,0 нет 20.80 1.0
1 2015-01-17 23:21:39 2015-01-17 23:35:16 1 2.70 нет нет -73.978508 40.687984 -73.955116 ... 1 11,5 0,5 0,5 0,3 2.55 0,0 нет 15.35 1.0
2 2015-01-16 01:38:40 2015-01-16 01:52:55 1 3,54 нет нет -73.957787 40.721779 -73.963005 ... 1 13,5 долл. США 0,5 0,5 0,3 2,80 0,0 нет 17.60 1.0
2 2015-01-04 17:09:26 2015-01-04 17:16:12 1 1.00 нет нет -73.919914 40.826023 -73.904839 ... 2 6,5 0,0 0,5 0,3 0.00 0,0 нет 7,30 1.0
1 2015-01-14 10:10:57 2015-01-14 10:33:30 1 5,10 нет нет -73.943710 40.825439 -73.982964 ... 1 18.5 0,0 0,5 0,3 3.85 0,0 нет 23.15 1.0
2 2015-01-19 18:10:41 2015-01-19 18:32:20 1 7.41 нет нет -73.940918 40.839714 -73.994339 ... 1 24,0 0,0 0,5 0,3 4,80 0,0 нет 29.60 1.0
2 2015-01-01 15:44:21 2015-01-01 15:50:16 1 1,03 нет нет -73.985718 40.685646 -73.996773 ... 1 6,5 0,0 0,5 0,3 1,30 0,0 нет 8.60 1.0
2 2015-01-12 08:01:21 2015-01-12 08:14:52 5 2,94 нет нет -73.939865 40.789822 -73.952957 ... 2 12.5 0,0 0,5 0,3 0.00 0,0 нет 13.30 1.0
1 2015-01-16 21:54:26 2015-01-16 22:12:39 1 3.00 нет нет -73.957939 40.721928 -73.926247 ... 1 14,0 0,5 0,5 0,3 2.00 0,0 нет 17.30 1.0
2 2015-01-06 06:34:53 2015-01-06 06:44:23 1 2,31 нет нет -73.943825 40.810257 -73.943062 ... 1 10.0 0,0 0,5 0,3 2.00 0,0 нет 12,80 1.0

Полезно удалить некоторые столбцы, которые не требуются для обучения или другого здания компонентов. Например, можно удалить столбец 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

Сводная статистика показывает несколько полей, которые являются выбросами, которые являются значениями, которые снижают точность модели. Чтобы устранить эту проблему, отфильтруйте поля широты/долготы (lat/long), чтобы значения находятся в пределах манхэттенского района. Этот подход фильтрует более длительные поездки на такси или поездки, которые выпадают в отношении их отношений с другими функциями.

Затем отфильтруйте tripDistance поле для значений, которые больше нуля, но менее 31 миль (расстояние между двумя парами lat/long). Этот метод устраняет длительные поездки, которые имеют несогласованные затраты на поездку.

Наконец, totalAmount поле имеет отрицательные значения для тарифов на такси, которые не имеют смысла в контексте модели. Поле passengerCount также содержит плохие данные, в которых минимальное значение равно нулю.

Следующий код фильтрует эти аномалии значений с помощью функций запроса. Затем код удаляет последние несколько столбцов, которые не нужны для обучения:

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 используется в остальной части кода в этом руководстве.

Разделение данных на обучающий и тестовый наборы

Разделение данных на наборы обучения и тестирования с помощью train_test_split функции в библиотеке scikit-learn . Эта функция выполняет разделение данных на набор данных 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 значение параметра.

Свойство Значение в этом руководстве Description
iteration_timeout_minutes 10 Максимальная длительность каждой итерации в минутах. Увеличьте это значение для больших наборов данных, которым требуется больше времени для каждой итерации.
experiment_timeout_hours 0,3 Максимальное количество времени в часах, в течение которого могут быть пройдены все итерации до завершения эксперимента.
enable_early_stopping Истина Пометка, чтобы включить досрочное завершение, если оценка не улучшается в краткосрочной перспективе.
primary_metric spearman_correlation Метрика, который вы хотите оптимизировать. Модель лучшего соответствия выбирается на основе этой метрики.
featurization авто Автоматическое значение позволяет эксперименту предварительно обработать входные данные, включая обработку отсутствующих данных, преобразование текста в числовой и т. д.
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
}

Следующий код позволяет использовать определенные параметры обучения в качестве **kwargs параметра для AutoMLConfig объекта. Кроме того, вы указываете данные обучения и тип модели, что 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)

Примечание.

Автоматические этапы предварительной обработки машинного обучения (нормализация функций, обработка отсутствующих данных, преобразование текста в числовые и т. д.) становятся частью базовой модели. При использовании модели для прогнозирования те же предварительные действия, применяемые во время обучения, применяются автоматически к входным данным.

Обучение модели автоматической регрессии

Создайте объект эксперимента в рабочей области. Эксперимент выступает в качестве контейнера для отдельных заданий. Передайте определенный 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:

Снимок экрана: сведения о запуске мини-приложения Jupyter в Студия машинного обучения Azure.

Диаграмма диаграммы для мини-приложения Jupyter:

Снимок экрана: схема графиков мини-приложения Jupyter в Студия машинного обучения Azure.

Получение оптимальной модели

Следующий код позволяет выбрать лучшую модель из итерации. Функция get_output возвращает лучшее выполнение и соответствующую модель для последнего соответствующего вызова. Используя перегрузки get_output функции, вы можете получить оптимальную модель запуска и установленной модели для любой метрики журнала или определенной итерации.

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

Проверка оптимальной точности модели

Используйте лучшую модель для выполнения прогнозирования в тестовом наборе данных, чтобы прогнозировать тарифы на такси. Функция predict использует лучшую модель и прогнозирует значения y, затраты на поездку из x_test набора данных.

Следующий код выводит первые 10 прогнозируемых значений y_predict затрат из набора данных:

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

Чтобы вычислить среднюю абсолютную погрешность в процентах (MAPE), запустите следующий код с помощью полных наборов данных y_actual и y_predict. Эта метрика вычисляет абсолютное отклонение между каждой парой прогнозируемого и фактического значения, а затем суммирует все отклонения. Затем эта сумма выражается в процентах от общей суммы фактических значений.

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, выполните следующие действия, чтобы удалить ресурсы, которые больше не нужны.

Остановка вычисления

Если вы использовали вычислительные ресурсы, вы можете остановить виртуальную машину, если вы не используете ее, и сократить затраты:

  1. Перейдите в рабочую область в Студия машинного обучения Azure и выберите "Вычисления".

  2. В списке выберите вычислительные ресурсы, которые нужно остановить, и нажмите кнопку "Остановить".

Когда вы будете готовы снова использовать вычислительные ресурсы, можно перезапустить виртуальную машину.

Удаление других ресурсов

Если вы не планируете использовать ресурсы, созданные в этом руководстве, их можно удалить и избежать дополнительных расходов.

Выполните следующие действия, чтобы удалить группу ресурсов и все ресурсы:

  1. На портале Azure перейдите на страницу Группы ресурсов.

  2. В списке выберите группу ресурсов, созданную в этом руководстве, и выберите команду "Удалить группу ресурсов".

  3. В командной строке подтверждения введите имя группы ресурсов и нажмите кнопку "Удалить".

Если вы хотите сохранить группу ресурсов и удалить только одну рабочую область, выполните следующие действия.

  1. В портал Azure перейдите в группу ресурсов, содержащую рабочую область, которую нужно удалить.

  2. Выберите рабочую область, выберите "Свойства" и нажмите кнопку "Удалить".

Следующий шаг