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.
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:
- Vyberte poznámkové bloky v studiu.
- Vyberte kartu Ukázky.
- Otevřete poznámkový blok SDK v1/tutorials/regression-automl-nyc-taxi-data/regression-automated-ml.ipynb .
- 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,
- Nainstalujte celého
automl
klienta. - Spuštěním
pip install azureml-opendatasets azureml-widgets
získejte 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:
- Definujte nastavení pro spuštění experimentu. Připojte trénovací data ke konfiguraci a upravte nastavení, která řídí proces trénování.
- 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 **kwargs
AutoMLConfig
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()
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_output
můž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.
V pracovním prostoru vyberte Compute.
V seznamu vyberte název výpočetní instance.
Vyberte Zastavit.
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.
- Úplně nalevo na webu Azure Portal vyberte Skupiny prostředků.
- V seznamu vyberte skupinu prostředků, kterou jste vytvořili.
- Vyberte Odstranit skupinu prostředků.
- 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)