Kurz: výuka regresního modelu pomocí AutoML a Pythonu

v tomto kurzu se naučíte naučit regresní model pomocí Azure Machine Learning Python SDK pomocí Azure Machine Learning automatizované ML. Tento regresní model předpovídá NYC taxislužby tarifs.

Tento proces přijímá školicí data a nastavení konfigurace a automaticky iterovat kombinace různých metod normalizace/normalizace funkcí, modelů a nastavení parametrů pro dosažení nejlepšího modelu.

diagram Flow

V tomto kurzu budete psát kód pomocí sady Python SDK. Naučíte se následující úlohy:

  • Stažení, transformace a vyčištění dat pomocí otevřených datových sad Azure
  • Výuka automatizovaného modelu Machine Learning
  • Vypočítat přesnost modelu

Pro AutoML žádného kódu vyzkoušejte následující kurzy:

Požadavky

Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet před tím, než začnete. vyzkoušení bezplatné nebo placené verze Azure Machine Learning dnes

  • dokončete rychlý start: začněte s Azure Machine Learning , pokud ještě nemáte pracovní prostor Azure Machine Learning nebo výpočetní instanci.
  • Po dokončení rychlého startu:
    1. V studiu vyberte poznámkové bloky .
    2. Vyberte kartu ukázky .
    3. Otevřete Poznámkový blok kurzy/Regression-automl-NYC-taxi-data/Regression-Automated-ml. ipynb .

tento kurz je také k dispozici na GitHub , pokud ho chcete spustit ve vašem vlastním místním prostředí. Chcete-li získat požadované balíčky,

Stažení a Příprava dat

Importujte potřebné balíčky. Balíček Open DataSets obsahuje třídu reprezentující jednotlivé zdroje dat ( NycTlcGreen například), aby bylo možné před stažením snadno filtrovat parametry data.

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

Začněte tím, že vytvoříte datový rámec, který bude uchovávat data taxislužby. Při práci v prostředí, které není Spark, mohou otevřené datové sady stahovat pouze jeden měsíc dat s určitými třídami, aby se předešlo velkým datovým MemoryError sadám.

Aby bylo možné stahovat data taxislužby, iterativním načítání po jednom měsíci a před jejich připojením k green_taxi_df náhodnému vzorkování 2 000 záznamů z každého měsíce, aby se zabránilo bloatingí datového rámce. Pak zobrazte 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 velký mtaTax improvementSurcharge tipAmount tollsAmount ehailFee totalAmount tripType
131969 2 2015-01-11 05:34:44 2015-01-11 05:45:03 3 4,84 Žádné Žádné -73,88 40,84 -73,94 ... 2 15,00 0,50 0,50 0.3 0,00 0,00 pak 16,30
1129817 2 2015-01-20 16:26:29 2015-01-20 16:30:26 1 0,69 Žádné Žádné -73,96 40,81 -73,96 ... 2 4,50 1.00 0,50 0.3 0,00 0,00 pak 6,30
1278620 2 2015-01-01 05:58:10 2015-01-01 06:00:55 1 0,45 Žádné Žádné -73,92 40,76 -73,91 ... 2 4,00 0,00 0,50 0.3 0,00 0,00 pak 4,80
348430 2 2015-01-17 02:20:50 2015-01-17 02:41:38 1 0,00 Žádné Žádné -73,81 40,70 -73,82 ... 2 12,50 0,50 0,50 0.3 0,00 0,00 pak 13,80
1269627 1 2015-01-01 05:04:10 2015-01-01 05:06:23 1 0,50 Žádné Žádné -73,92 40,76 -73,92 ... 2 4,00 0,50 0,50 0 0,00 0,00 pak 5,00
811755 1 2015-01-04 19:57:51 2015-01-04 20:05:45 2 1.10 Žádné Žádné -73,96 40,72 -73,95 ... 2 6,50 0,50 0,50 0.3 0,00 0,00 pak 7,80
737281 1 2015-01-03 12:27:31 2015-01-03 12:33:52 1 0,90 Žádné Žádné -73,88 40,76 -73,87 ... 2 6,00 0,00 0,50 0.3 0,00 0,00 pak 6,80
113951 1 2015-01-09 23:25:51 2015-01-09 23:39:52 1 3,30 Žádné Žádné -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 Žádné Žádné -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 Žádné Žádné -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 vytváření dalších funkcí. Automatizace strojového učení automaticky zřídí funkce založené na čase, jako je 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 funkce describe() na novém datovém rámci zobrazte souhrnné statistiky pro jednotlivá pole.

green_taxi_df.describe()
vendorID (ID dodavatele) počet pasažérů tripDistance (tripDistance) pickupLongitude pickupLacide (vyzvednutí) dropoffLongitude dropoffLacide 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ých statistik vidíte, že existuje několik polí, která mají odlehlé hodnoty nebo hodnoty, které snižují přesnost modelu. Nejprve vyfiltrujte pole lat/long tak, aby byla v rámci hranic oblasti Sen. Tím se odfiltrují delší cesty taxíkem nebo cesty, které jsou odlehlé hodnoty v souvislosti s jejich vztahem s jinými vlastnostmi.

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

A konečně, pole má záporné hodnoty ceny jízdy taxíkem, které v kontextu našeho modelu nedává smysl, a pole obsahuje chybná data s minimálními hodnotami totalAmount passengerCount nulami.

Tyto anomálie vyfiltrujte pomocí funkcí dotazu a pak odeberte několik posledních sloupců, které jsou pro trénování nepotřebné.

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 describe() volejte data, abyste zajistili, že čištění funguje podle očekávání. Teď máte připravenou a vyvyčistit sadu dat o taxislužby, svátcích a počasí, které můžete použít k 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 o ověřování do objektu s názvem ws . ws se používá ve zbývající části kódu v tomto kurzu.

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

Rozdělení dat na trénování a testovací sady

Rozdělte data na trénovací a testovací sady train_test_split pomocí funkce v scikit-learn knihovně. Tato funkce oddělení dat do datové sady x ( funkcí ) pro trénování modelu a datové sady y ( pro predikci ) pro účely testování.

Parametr test_size určuje procento dat, která se přidělí k testování. Parametr nastaví do generátoru náhodných hodnot hodnotu, aby rozdělení trénování a testování random_state byla 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í dokončené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ě provádět 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énovat model

Pokud chcete model automaticky vytrénovat, postupujte následovně:

  1. Definujte nastavení pro spuštění experimentu. Připojte ke konfiguraci trénovací data a upravte nastavení, která řídí proces trénování.
  2. Odešlete experiment k ladění modelu. Po odeslání experimentu proces prochází různými algoritmy strojového učení a nastavením hyperparametrů a postupuje podle vašich definovaných omezení. Zvolí nejlépe vhodný model optimalizací metrik přesnosti.

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

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

Vlastnost Hodnota v tomto kurzu Description
iteration_timeout_minutes 10 Časový limit v minutách pro každou iteraci. Tuto hodnotu zvyšte 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, po kterou mohou všechny iterace trvat, než se experiment ukončí.
enable_early_stopping Ano Příznak, který povolí předčasné ukončení, pokud se skóre v krátkém období nezlepšuje.
primary_metric spearman_correlation Metrika, kterou chcete optimalizovat Model nejlépe přizpůsoben se vybere na základě této metriky.
featurization auto Pomocí auto může experiment předzpracovat vstupní data (zpracování chybějících dat, převod textu na číslo atd.).
podrobností logging.INFO Řídí úroveň protokolování.
n_cross_validations 5 Počet rozdělení křížového ověření, které se mají provést, pokud 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
}

Použijte vaše definovaná nastavení školení jako **kwargs parametr AutoMLConfig objektu. Dále určete vaše školicí údaje 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

Automatické kroky před zpracováním strojového učení (normalizace funkcí, zpracování chybějících dat, převod textu na číselnou atd.) se stanou součástí základního modelu. Při použití modelu pro předpovědi se na vstupní data automaticky aplikují stejné kroky před zpracováním během školení.

Analýza automatického regresního modelu

Vytvořte v pracovním prostoru objekt experiment. Experiment funguje jako kontejner pro vaše jednotlivá spuštění. Předejte definovaný automl_config objekt experimentu a nastavte výstup na k True zobrazení průběhu během běhu.

Po zahájení experimentu se výstup v rámci spuštění experimentu zobrazí jako živý. Pro každou iteraci vidíte typ modelu, dobu trvání běhu a přesnost školení. Pole BEST sleduje nejlepší průběžné školení na základě 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 školení pomocí widgetu Jupyter. Pomůcka vám umožní zobrazit graf a tabulku všech jednotlivých iterací spuštění spolu s metrikami přesnosti školení a metadaty. Kromě toho můžete filtrovat různé metriky přesnosti, než je vaše primární metrika, pomocí rozevíracího selektoru.

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

Jupyter widget detail Run Details  Jupyter

Načtení nejlepšího modelu

Vyberte nejlepší model z vašich iterací. get_outputFunkce vrátí nejlepší běh a namontovaný model pro poslední vyvolání. Pomocí přetížení get_output můžete načíst nejlepší běh a namontovaný model pro všechny protokolované metriky nebo konkrétní iterace.

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

Testování nejlepší přesnosti modelu

Použijte nejlepší model pro spuštění předpovědi na testovacích datech sady pro předpověď taxislužby tarifů. Funkce predict využívá nejlepší model a předpovídá hodnoty y, nákladů na cestu ze x_test sady dat. Vytiskněte prvních 10 předpokládaných hodnot nákladů z y_predict .

y_test = x_test.pop("totalAmount")

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

Vypočítá root mean squared error výsledky. Převeďte y_test datový rámec na seznam pro porovnání s předpokládanými hodnotami. Funkce mean_squared_error přebírá dvě pole hodnot a vypočítá průměrnou kvadratickou chybu mezi nimi. Výsledkem druhé odmocniny výsledku je chyba ve stejných jednotkách jako proměnná y, náklady. Uvádí zhruba, jak daleko se taxislužby tarif předpovědi ze skutečné tarify.

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

Spusťte následující kód, který vypočítá průměrnou absolutní procentuální chybu (MAPE) pomocí úplné y_actual a y_predict datové sady. Tato metrika vypočítá absolutní rozdíl mezi každou předpovězenou a skutečnou hodnotou a sečte všechny rozdíly. Pak vyjadřuje, že součet je procentuální podíl celkového poč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

Ze dvou metrik přesnosti předpovědi vidíte, že model je poměrně dobrý při předvídání taxislužby tarifů z funkcí datové sady, obvykle v rámci +-$4,00 a přibližně 15% chyby.

Tradiční proces vývoje modelu strojového učení je vysoce náročný na prostředky a vyžaduje, aby ke spuštění a porovnání výsledků desítek modelů byly významné znalosti v doméně a časové investice. Používání automatizovaného strojového učení je skvělým způsobem, jak rychle testovat spoustu různých modelů pro váš scénář.

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

tuto část neprovádějte, pokud máte v plánu spouštět jiné kurzy Azure Machine Learning.

Zastavení výpočetní instance

Pokud jste použili výpočetní instanci, zastavte virtuální počítač, pokud ho nepoužíváte ke snížení nákladů.

  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 znovu použít server, vyberte Spustit.

Odstranit vše

Pokud neplánujete použít prostředky, které jste vytvořili, odstraňte je, takže se vám neúčtují žá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ů. 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 kurzu automatizovaného strojového učení jste provedli následující úlohy:

  • Nakonfigurovali jste pracovní prostor a připravené data pro experiment.
  • Vyškoleno pomocí automatizovaného regresního modelu místně s vlastními parametry.
  • Prozkoumání a přezkoumání výsledků školení.

Nasaďte model pomocí Azure Machine Learning.