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 Learning Python SDK pomocí automatizovaného strojového učení Azure Machine Learning. 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.

Diagram toku

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

  • Stažení, transformace a vyčištění dat pomocí azure Open Datasets
  • Trénování regresního modelu 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 nemáte předplatné Azure, vytvořte si bezplatný účet, než začnete. Vyzkoušejte si bezplatnou nebo placenou verzi služby Azure Machine Learning dnes.

  • Dokončete rychlý start: Začněte se službou 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. 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 k dispozici také na GitHubu , pokud ho chcete spustit ve 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 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 taxi. Při práci v prostředí mimo Spark umožňují Open Datasets stahovat jenom jeden měsíc dat najednou s určitými třídami, aby se zabránilo MemoryError velkým datovým sadám.

Pokud chcete stáhnout data o taxislužby, iterativním načtením jednoho měsíce najednou a před připojením k green_taxi_df náhodně 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 data.

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 Žádné Žádné -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 1 0.69 Žádné Žádné -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 1 0,45 Žádné Žádné -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 1 0,00 Žádné Žádné -73.81 40.70 -73.82 ... 2 12.50 0,50 0,50 0.3 0,00 0,00 Nan 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 Nan 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 Nan 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 Nan 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 další sestavení funkcí. Automatizace strojového učení bude automaticky zpracovávat 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 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í s odlehlých hodnot nebo odlehlých hodnot, která sníží přesnost modelu. Nejprve vyfiltrujte pole lat/long tak, aby byla v mezích oblasti Manhattan. Tím se vyfiltrují delší cesty taxíkem nebo výlety, které jsou odlehlých hodnot ve vztahu k jiným funkcím.

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

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

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í fungovalo podle očekávání. Teď máte připravenou a vyčištěnou sadu dat o taxi, dovolené a počasí, která se mají použít pro trénování modelů 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

Rozdělte data do trénovacích a testovacích sad 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 y (hodnoty k predikci) datové sady 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, aby byly rozdělení trénovacích testů 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 vytrénovaný model by měl být schopný přesně vytvářet předpovědi z dat, která ještě neviděla. 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 prostřednictvím různých algoritmů strojového učení a nastavení hyperparametrů a dodržuje vaše definovaná omezení. Zvolí nejvhodnější model optimalizací metriky 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, snižte experiment_timeout_hours parametr.

Vlastnost Hodnota v tomto článku Description
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í množství času v hodinách, které mohou všechny iterace v kombinaci trvat, než experiment skončí.
enable_early_stopping Ano 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 bude 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
}

Použijte definovaná nastavení trénování jako **kwargs parametr objektu AutoMLConfig . 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ředzpracování použité během trénování.

Trénování automatického regresního modelu

Vytvořte v pracovním prostoru objekt experimentu. Experiment funguje jako kontejner pro jednotlivé úlohy. Předejte definovaný automl_config objekt 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. U každé iterace uvidíte typ modelu, dobu trvání běhu a přesnost trénování. Pole BEST sleduje nejlepší spuštěné skóre trénování 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 iterací jednotlivých ú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()

Diagram widgetu Jupyter s podrobnostmi owidgetu Jupyter

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í. Pomocí přetížení get_outputmůžete načíst nejlepší běh a fitovaný model pro libovolnou 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í testovací datové sady, abyste předpověděli jízdné taxíkem. predict Funkce používá nejlepší model a předpovídá hodnoty nákladů na jízdu z x_test datové sady. Vytiskněte prvních 10 předpovídané hodnoty 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 předpovězenými hodnotami. Funkce mean_squared_error přebírá dvě pole hodnot a vypočítá průměrnou kvadratická chybu mezi nimi. Když vezmeme druhou odmocninu výsledku, zobrazí se chyba ve stejných jednotkách jako proměnná y, náklady. Udává přibližně, 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 vypočítáte absolutní procentuální chybu (MAPE) pomocí úplných y_actual a y_predict datových sad. 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

Ze dvou metrik přesnosti predikce vidíte, že model je poměrně dobrý při předpovídání jízdy taxíkem 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 domény a časové investice ke spuštění a porovnání výsledků desítek modelů. Použití automatizovaného strojového učení představuje skvělý způsob rychlého testování mnoha různých modelů pro váš scénář.

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

Pokud plánujete spustit další kurzy služby Azure Machine Learning, tento oddíl nedokonejte.

Zastavení výpočetní instance

Pokud jste použili výpočetní instanci, zastavte virtuální počítač, když 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 server znovu použít, vyberte Spustit.

Odstranit vše

Pokud nemáte v plánu používat vytvořené prostředky, odstraňte je, takže vám nebudou účtovány žá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 článku automatizovaného strojového učení jste provedli následující úlohy:

  • Nakonfigurovali jste pracovní prostor a připravili data pro experiment.
  • Vytré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)