Обучение модели регрессии с помощью AutoML и Python (SDK версии 1)

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

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

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

Flow diagram

Вы пишете код с помощью пакета SDK для Python в этой статье. Вы узнаете о следующих задачах:

  • Загрузка, преобразование и очистка данных с помощью Открытых наборов данных Azure.
  • Обучение автоматизированной регрессионной модели машинного обучения.
  • Расчет точности модели.

Чтобы использовать AutoML без написания кода, изучите следующие учебники:

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

Если у вас нет подписки Azure, создайте бесплатную учетную запись, прежде чем приступить к работе. Опробуйте бесплатную или платную версию Машинного обучения Azure уже сегодня.

  • Выполните инструкции в кратком руководстве по началу работы с Машинным обучением Azure, если у вас еще нет рабочего пространства или вычислительного экземпляра службы "Машинное обучение Azure".
  • После завершения работы с кратким руководством выполните следующие действия.
    1. Выберите Записные книжки в студии.
    2. Перейдите на вкладку Образцы .
    3. Откройте записную книжку SDK версии 1/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, открытые наборы данных позволяют загружать только один месяц данных одновременно с определенными классами, чтобы избежать MemoryError больших наборов данных.

Чтобы получить данные о поездках на такси, поочередно скачайте данные за каждый месяц и, прежде чем добавить их к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 не число 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 не число 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 не число 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 не число 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 не число 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 не число 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 не число 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 не число 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 не число 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 не число 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
стандарт 0,41 1,04 2,93 2,76 1,52 2.61 1,44 12,08 3,45 8,45
мин 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
макс. 2.00 9.00 97,57 0.00 41.93 0.00 41,94 450.00 12,00 30.00

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

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

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

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

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

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

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

Используйте определенные вами параметры обучения в качестве параметра **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 widget run detailsJupyter widget plot

Извлечение наиболее эффективной модели

Выберите наиболее эффективную модель из итераций. Функция 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. В своей рабочей области выберите Вычисление.

  2. В списке выберите имя вычислительного экземпляра.

  3. Выберите Остановить.

  4. Когда вам снова понадобится использовать сервер, выберите Запустить.

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

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

  1. На портале Azure выберите Группы ресурсов в левой части окна.
  2. В списке выберите созданную группу ресурсов.
  3. Выберите команду Удалить группу ресурсов.
  4. Введите имя группы ресурсов. Затем выберите Удалить.

Вы также можете сохранить группу ресурсов, но удалить одну рабочую область. Отобразите свойства рабочей области и нажмите кнопку Удалить.

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

Изучив эту статью об автоматическом машинном обучении, вы выполнили указанные ниже задачи.

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

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