Trénování regresního modelu pomocí AutoML a Pythonu (SDK v1)

PLATÍ PRO:Python SDK azureml v1

V tomto článku se dozvíte, jak trénovat regresní model pomocí sady Azure Machine Učení Python SDK pomocí služby Azure Machine Učení automatizovaného strojového učení. Tento regresní model predikuje jízdné taxislužby NYC.

Tento proces přijímá trénovací data a nastavení konfigurace a automaticky iteruje kombinacemi různých metod normalizace a standardizace funkcí, modelů a nastavení hyperparametrů, aby bylo dosaženo nejlepšího modelu.

Flow diagram

V tomto článku napíšete kód pomocí sady Python SDK. Naučíte se následující úkoly:

  • Stažení, transformace a vyčištění dat pomocí Azure Open Datasets
  • Trénování modelu regrese automatizovaného strojového učení
  • Výpočet přesnosti modelu

V případě autoML bez kódu vyzkoušejte následující kurzy:

Požadavky

Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet. Vyzkoušejte si bezplatnou nebo placenou verzi služby Azure Machine Učení ještě dnes.

  • Dokončete rychlý start: Začínáme se službou Azure Machine Učení, pokud ještě nemáte pracovní prostor Učení Azure nebo výpočetní instanci.
  • Po dokončení rychlého startu:
    1. Vyberte poznámkové bloky v studiu.
    2. Vyberte kartu Ukázky.
    3. Otevřete poznámkový blok SDK v1/tutorials/regression-automl-nyc-taxi-data/regression-automated-ml.ipynb .
    4. Pokud chcete spustit každou buňku v kurzu, vyberte Klonovat tento poznámkový blok.

Tento článek je také k dispozici na GitHubu , pokud ho chcete spustit ve vlastním místním prostředí. Pokud chcete získat požadované balíčky,

Stažení a příprava dat

Importujte potřebné balíčky. Balíček Open Datasets obsahuje třídu představující každý zdroj dat (NycTlcGreen například) pro snadné filtrování parametrů data před stažením.

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

Začněte vytvořením datového rámce pro uložení dat taxislužby. Když pracujete v prostředí mimo Spark, Open Datasets umožňuje stahovat data jenom jeden měsíc najednou s určitými třídami, aby nedocházelo MemoryError k velkým datovým sadám.

Pokud chcete stáhnout data taxislužby, iterativním načtením jednoho měsíce najednou a před jejich přidáním náhodně green_taxi_df vzorek 2 000 záznamů z každého měsíce, abyste se vyhnuli bloudění datového rámce. Pak si prohlédněte náhled dat.

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 zlepšení Surcharge tipAmount tollsAmount ehailFee totalAmount tripType
131969 2 2015-01-11 05:34:44 2015-01-11 05:45:03 3 4.84 Nic Nic -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 0 0.69 Nic Nic -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 0 0,45 Nic Nic -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 0 0,00 Nic Nic -73.81 40.70 -73.82 ... 2 12.50 0.50 0.50 0.3 0,00 0,00 Nan 13.80
1269627 0 2015-01-01 05:04:10 2015-01-01 05:06:23 0 0,50 Nic Nic -73.92 40.76 -73.92 ... 2 4,00 0.50 0.50 0 0,00 0,00 Nan 5.00
811755 0 2015-01-04 19:57:51 2015-01-04 20:05:45 2 1,10 Nic Nic -73.96 40.72 -73.95 ... 2 6.50 0.50 0.50 0.3 0,00 0,00 Nan 7,80
737281 0 2015-01-03 12:27:31 2015-01-03 12:33:52 0 0.90 Nic Nic -73.88 40.76 -73.87 ... 2 6,00 0,00 0,50 0.3 0,00 0,00 Nan 6.80
113951 0 2015-01-09 23:25:51 2015-01-09 23:39:52 0 3.30 Nic Nic -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 0 1.19 Nic Nic -73.94 40.71 -73.95 ... 0 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 Nic Nic -73.94 40.71 -73.94 ... 2 5.00 0.50 0.50 0.3 0,00 0,00 Nan 6.30

Odeberte některé sloupce, které nebudete potřebovat pro trénování nebo jiné sestavení funkcí. Automatizace strojového učení bude automaticky zpracovávat funkce založené na čase, jako je například 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)

Vyčištění dat

Spuštěním describe() funkce v novém datovém rámci zobrazíte souhrnné statistiky pro každé pole.

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

Ze souhrnné statistiky vidíte, že existuje několik polí, která mají odlehlé hodnoty nebo hodnoty, které snižují přesnost modelu. Nejprve vyfiltrujte lat/long pole tak, aby byla v mezích oblasti Manhattan. Tím se vyfiltrují delší cesty taxíkem nebo výlety, které jsou odlehlé hodnoty ve vztahu k jiným funkcím.

Kromě toho vyfiltrujte tripDistance pole tak, aby bylo větší než nula, ale méně než 31 mil (vzdálenost haversinu mezi dvěma dvojicemi lat/long). Tím se eliminují dlouhé odlehlé cesty, které mají nekonzistentní náklady na cestu.

A konečně, totalAmount pole má záporné hodnoty pro jízdné taxíkem, které nedává smysl v kontextu našeho modelu, a passengerCount pole má špatná data s minimálními hodnotami, které jsou nula.

Vyfiltrujte tyto anomálie pomocí funkcí dotazů a pak odeberte posledních několik sloupců, které pro trénování nepotřebujete.

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)

Znovu zavolejte describe() na data, abyste zajistili, že čištění funguje podle očekávání. Teď máte připravenou a vyčištěnou sadu dat o taxi, svátku a počasí, která můžete použít pro trénování modelu strojového učení.

final_df.describe()

Konfigurace pracovního prostoru

Vytvořte objekt pracovního prostoru z existujícího pracovního prostoru. Pracovní prostor je třída, která přijímá informace o vašem předplatném a prostředcích Azure. Vytvoří také cloudový prostředek pro monitorování a sledování spuštění modelu. Workspace.from_config() přečte soubor config.json a načte podrobnosti ověřování do objektu s názvem ws. ws se používá ve zbytku kódu v tomto článku.

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

Rozdělení dat do trénovacích a testovacích sad

Data rozdělte na trénovací a testovací sady pomocí train_test_split funkce v knihovně scikit-learn . Tato funkce odděluje data do datové sady x (funkce) pro trénování modelu a sadu dat y (hodnoty k predikci) pro testování.

Parametr test_size určuje procento dat, která se mají přidělit k testování. Parametr random_state nastaví počáteční hodnoty náhodného generátoru tak, aby rozdělení trénovacích testů bylo deterministické.

from sklearn.model_selection import train_test_split

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

Účelem tohoto kroku je mít datové body k otestování hotového modelu, který nebyl použit k trénování modelu, aby bylo možné měřit skutečnou přesnost.

Jinými slovy, dobře natrénovaný model by měl být schopný přesně vytvářet předpovědi z dat, která ještě neviděl. Teď máte data připravená pro automatické trénování modelu strojového učení.

Automatické trénování modelu

Pokud chcete model vytrénovat automaticky, proveďte následující kroky:

  1. Definujte nastavení pro spuštění experimentu. Připojte trénovací data ke konfiguraci a upravte nastavení, která řídí proces trénování.
  2. Odešlete experiment pro ladění modelu. Po odeslání experimentu proces iteruje různými algoritmy strojového učení a nastavením hyperparametrů a dodržuje definovaná omezení. Zvolí nejvhodnější model optimalizací metriky přesnosti.

Definování nastavení trénování

Definujte parametry experimentu a nastavení modelu pro trénování. Zobrazte úplný seznam nastavení. Odeslání experimentu s těmito výchozími nastaveními trvá přibližně 5 až 20 minut, ale pokud chcete kratší dobu běhu, snižte experiment_timeout_hours parametr.

Vlastnost Hodnota v tomto článku Popis
iteration_timeout_minutes 10 Časový limit v minutách pro každou iteraci Zvyšte tuto hodnotu u větších datových sad, které potřebují více času pro každou iteraci.
experiment_timeout_hours 0.3 Maximální doba v hodinách, kterou mohou všechny iterace zkombinovat, může trvat před ukončením experimentu.
enable_early_stopping True Příznak pro povolení předčasného ukončení, pokud se skóre v krátkodobém horizontu nezlepšuje.
primary_metric spearman_correlation Metrika, kterou chcete optimalizovat Nejvhodnější model je zvolen na základě této metriky.
featurizace auto Pomocí automatického zpracování experimentu může předem zpracovat vstupní data (zpracování chybějících dat, převod textu na číselnou hodnotu atd.).
Podrobnost logging.INFO Řídí úroveň protokolování.
n_cross_validations 5 Počet rozdělení křížového ověření, které se má provést, když nejsou zadaná ověřovací data.
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
}

K objektu **kwargsAutoMLConfig použijte definovaná nastavení trénování jako parametr. Kromě toho zadejte trénovací data a typ modelu, který je regression v tomto případě.

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)

Poznámka:

Automatizované kroky předběžného zpracování strojového učení (normalizace funkcí, zpracování chybějících dat, převod textu na číselné atd.) se stanou součástí základního modelu. Při použití modelu pro předpovědi se na vstupní data automaticky použijí stejné kroky předběžného zpracování použité během trénování.

Trénování modelu automatické regrese

Vytvořte v pracovním prostoru objekt experimentu. Experiment funguje jako kontejner pro jednotlivé úlohy. Předejte definovaný automl_config objekt do experimentu a nastavte výstup tak, aby True zobrazoval průběh během úlohy.

Po spuštění experimentu se výstup zobrazený živě aktualizuje při spuštění experimentu. Pro každou iteraci uvidíte typ modelu, dobu trvání běhu a přesnost trénování. BEST Pole sleduje nejlepší spuštěné trénovací skóre na základě vašeho typu metriky.

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

Kontrola výsledků

Prozkoumejte výsledky automatického trénování pomocí widgetu Jupyter. Widget umožňuje zobrazit graf a tabulku všech jednotlivých iterací úloh spolu s metrikami přesnosti trénování a metadaty. Kromě toho můžete pomocí selektoru rozevíracího seznamu filtrovat různé metriky přesnosti, než je vaše primární metrika.

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

Jupyter widget run detailsJupyter widget plot

Načtení nejlepšího modelu

Vyberte nejlepší model z vašich iterací. Funkce get_output vrátí nejlepší běh a fitovaný model pro poslední vyvolání fitu. Pomocí přetížení get_outputmůžete načíst nejlepší běh a fitovaný model pro jakoukoli protokolovanou metriku nebo konkrétní iteraci.

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

Testování nejlepší přesnosti modelu

Nejlepší model použijte ke spouštění predikcí v sadě testovacích dat, abyste mohli předpovědět jízdné taxíkem. Funkce predict používá nejlepší model a předpovídá hodnoty nákladů na cestu z x_test datové sady. Vytiskněte prvních 10 predikovaných hodnot nákladů z y_predict.

y_test = x_test.pop("totalAmount")

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

root mean squared error Výpočet výsledků y_test Převeďte datový rámec na seznam a porovnejte je s predikovanými hodnotami. Funkce mean_squared_error přebírá dvě pole hodnot a vypočítá průměrnou kvadratická chybu mezi nimi. Když vezmete druhou odmocninu výsledku, zobrazí se chyba ve stejných jednotkách jako proměnná y, náklady. Udává zhruba, jak daleko jsou předpovědi jízdného taxíkem od skutečných jízdné.

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

Spuštěním následujícího kódu můžete vypočítat absolutní procentuální chybu (MAPE) pomocí úplných y_actual sad dat a y_predict sad dat. Tato metrika vypočítá absolutní rozdíl mezi jednotlivými predikovanými a skutečnými hodnotami a sečte všechny rozdíly. Pak tento součet vyjadřuje jako procento součtu skutečných hodnot.

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

Z metrik přesnosti dvou predikcí vidíte, že model je poměrně dobrý při předpovídání jízdného taxíku od funkcí datové sady, obvykle v rozsahu +- 4,00 USD a přibližně 15 % chyby.

Tradiční proces vývoje modelů strojového učení je vysoce náročný na prostředky a vyžaduje významné znalosti a časové investice do domén, aby bylo potřeba spouštět a porovnávat výsledky desítek modelů. Použití automatizovaného strojového učení je skvělý způsob, jak rychle otestovat mnoho různých modelů pro váš scénář.

Vyčištění prostředků

Pokud máte v plánu spustit další kurzy ke službě Azure Machine Učení, nedokončíte tuto část.

Zastavení výpočetní instance

Pokud jste použili výpočetní instanci, zastavte virtuální počítač, když ho nepoužíváte, aby se snížily náklady.

  1. V pracovním prostoru vyberte Compute.

  2. V seznamu vyberte název výpočetní instance.

  3. Vyberte Zastavit.

  4. Až budete chtít server znovu použít, vyberte Spustit.

Odstranit vše

Pokud nechcete používat prostředky, které jste vytvořili, odstraňte je, takže se vám nebudou účtovat žádné poplatky.

  1. Úplně nalevo na webu Azure Portal vyberte Skupiny prostředků.
  2. V seznamu vyberte skupinu prostředků, kterou jste vytvořili.
  3. Vyberte Odstranit skupinu prostředků.
  4. Zadejte název skupiny prostředků. Poté vyberte Odstranit.

Můžete také zachovat skupinu prostředků, ale odstranit jeden pracovní prostor. Zobrazte vlastnosti pracovního prostoru a vyberte Odstranit.

Další kroky

V tomto článku automatizovaného strojového učení jste provedli následující úlohy:

  • Nakonfigurovali jste pracovní prostor a připravili data pro experiment.
  • Trénováno pomocí automatizovaného regresního modelu místně s vlastními parametry.
  • Prozkoumali a zkontrolovali výsledky trénování.

Nastavení AutoML pro trénování modelů počítačového zpracování obrazu pomocí Pythonu (v1)