Een regressiemodel trainen met AutoML en Python (SDK v1)

VAN TOEPASSING OP: Python SDK azureml v1

In dit artikel leert u hoe u een regressiemodel traint met de Azure Machine Learning Python SDK met behulp van geautomatiseerde ML van Azure Machine Learning. Dit regressiemodel voorspelt de taxitarieven van NYC.

Dit proces gebruikt trainingsgegevens en configuratie-instellingen en doorloopt automatisch combinaties van verschillende methoden voor het normaliseren/standaardiseren van functies, modellen en instellingen van hyperparameters om het beste model te bepalen.

Flow diagram

U schrijft code met behulp van de Python SDK in dit artikel. U leert de volgende taken:

  • Gegevens downloaden, transformeren en opschonen met behulp van Azure Open Datasets
  • Een regressiemodel trainen met geautomatiseerde machine learning
  • De nauwkeurigheid van een model berekenen

Probeer voor AutoML zonder code de volgende zelfstudies:

Vereisten

Als u geen Azure-abonnement hebt, maakt u een gratis account voordat u begint. Probeer vandaag nog de gratis of betaalde versie van Azure Machine Learning.

  • Voltooi de quickstart: Aan de slag met Azure Machine Learning als u nog geen Azure Machine Learning-werkruimte of een rekenproces hebt.
  • Nadat u de quickstart hebt voltooid:
    1. Selecteer Notebooks in de studio.
    2. Selecteer het tabblad Voorbeelden .
    3. Open de SDK v1/tutorials/regression-automl-nyc-taxi-data/regression-automated-ml.ipynb notebook.
    4. Als u elke cel in de zelfstudie wilt uitvoeren, selecteert u Dit notebook klonen

Dit artikel is ook beschikbaar op GitHub als u het wilt uitvoeren in uw eigen lokale omgeving. Om de vereiste pakketten te downloaden

Gegevens downloaden en voorbereiden

Importeer de benodigde pakketten. Het Open Datasets-pakket bevat een klasse voor elke gegevensbron (NycTlcGreen bijvoorbeeld) om eenvoudig op datumparameters te filteren voordat u downloadt.

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

Maak eerst een dataframe om de taxigegevens op te slaan. Wanneer u in een niet-Spark-omgeving werkt, kunt u met Open Datasets slechts één maand aan gegevens tegelijk downloaden met bepaalde klassen om grote gegevenssets te voorkomen MemoryError .

Voor het downloaden van taxigegevens worden iteratief de gegevens voor één maand tegelijk opgehaald en voordat deze worden toegevoegd aan green_taxi_df, worden willekeurig 2000 records uit elke maand gehaald om bloating van het dataframe te voorkomen. Bekijk daarna een voorbeeld van de gegevens.

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 Geen Geen -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 Geen Geen -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 Geen Geen -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 Geen Geen -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 Geen Geen -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 Geen Geen -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 Geen Geen -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 Geen Geen -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 Geen Geen -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 Geen Geen -73,94 40,71 -73,94 ... 2 5.00 0.50 0.50 0,3 0,00 0,00 nan 6,30

Verwijder enkele kolommen die u niet nodig hebt voor training of een ander functiegebouw. Machine learning automatiseren verwerkt automatisch functies op basis van tijd, zoals 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)

Gegevens opschonen

Voer de functie describe() uit op het nieuwe dataframe om samenvattingsstatistieken voor elk veld weer te geven.

green_taxi_df.describe()
vendorID passengerCount tripDistance pickupLongitude pickupLatitude dropoffLongitude dropoffLatitude totalAmount month_num day_of_month day_of_week hour_of_day
aantal 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

In de overzichtsstatistieken ziet u dat er verschillende velden zijn met uitschieters of waarden die de nauwkeurigheid van het model verminderen. Filter eerst de velden met lengte-/breedtegraden zodat deze binnen de grenzen van het gebied Manhattan vallen. Hiermee worden langere taxiritten of ritten gefilterd die uitbijters zijn met betrekking tot hun relatie met andere functies.

Stel vervolgens een filter in om het veld tripDistance in te stellen op groter dan nul, maar kleiner dan 31 mijl (de haversine-afstand tussen de twee lengte-/breedtegraadparen). Dit elimineert lange uitbijters met inconsistente ritkosten.

En tot slot ziet u dat het veld totalAmount negatieve waarden voor de taxitarieven bevat. Dit heeft weinig zin in de context van ons model en het veld passengerCount bevat ongeldige gegevens waar de minimumwaarden nul zijn.

Filter ook deze afwijkingen eruit met behulp van queryfuncties en verwijder vervolgens de laatste paar kolommen die niet nodig zijn voor de training.

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)

Roep describe() opnieuw aan voor de gegevens om te controleren of ze goed zijn opgeschoond. U hebt nu een voorbereide en opgeschoonde set taxi-, feestdagen- en weersgegevens die u voor de training van een machine learning-model kunt gebruiken.

final_df.describe()

Werkruimte configureren

Maak een werkruimte-object van de bestaande werkruimte. Een Werkruimte is een klasse die uw Azure-abonnement en resourcegegevens accepteert. Hier wordt ook een cloudresource gemaakt om de uitvoeringen van uw model te controleren en bij te houden. Workspace.from_config() leest het bestand config.json en laadt de verificatiegegevens in een object met de naam ws. ws wordt gebruikt in de rest van de code in dit artikel.

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

Gegevens splitsen in sets voor trainen en voor testen

Splitst de gegevens in trainings- en testsets met behulp van de functie train_test_split in de scikit-learn-bibliotheek. Met deze functie worden de gegevens verdeeld in de gegevensset x (kenmerken) voor het trainen van het model, en de gegevensset y (te voorspellen waarden) voor testen.

Met de parameter test_size wordt het percentage gegevens bepaald dat moet worden toegewezen aan testen. Met de parameter random_state wordt de willekeurige generator ingesteld, zodat de verdeling tussen trainen en testen deterministisch is.

from sklearn.model_selection import train_test_split

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

Het doel van deze stap is om gegevenspunten voor het testen van het voltooide model te verkrijgen die nog niet zijn gebruikt voor het trainen van het model. Zo kan de ware nauwkeurigheid van het model worden gemeten.

Met andere woorden, een goed getraind model moet in staat zijn nauwkeurige voorspellingen te doen voor gegevens die nog niet eerder de revue hebben gepasseerd. U hebt nu gegevens voorbereid voor het automatisch trainen van een machine learning-model.

Automatisch een model trainen

Als u automatisch een model wilt trainen, voert u de volgende stappen uit:

  1. Definieer de instellingen voor het uitvoeren van het experiment. Koppel uw trainingsgegevens aan de configuratie en wijzig de instellingen voor het trainingsproces.
  2. Verzend het experiment om het model af te stemmen. Nadat u het experiment hebt verzonden, doorloopt het proces verschillende machine learning-algoritmen en hyperparameter-instellingen conform de gedefinieerde beperkingen. Het optimale model worden gekozen door een metrische nauwkeurigheidswaarde te optimaliseren.

Trainingsinstellingen definiëren

Definieer de experimentparameter en modelinstellingen voor training. Bekijk de volledige lijst met instellingen. Het verzenden van het experiment met deze standaardinstellingen duurt ongeveer 5-20 minuten, maar als u een kortere uitvoeringstijd wilt, vermindert u de experiment_timeout_hours parameter.

Eigenschappen Waarde in dit artikel Beschrijving
iteration_timeout_minutes 10 Tijdslimiet in minuten voor elke iteratie. Verhoog deze waarde voor grotere gegevenssets die meer tijd nodig hebben voor elke iteratie.
experiment_timeout_hours 0,3 Maximale tijdsduur in uren dat de combinatie van alle iteraties voordat het experiment wordt beëindigd, kan duren.
enable_early_stopping Waar Vlag om vroegtijdige beëindiging in te schakelen als de score op korte termijn niet wordt verbeterd.
primary_metric spearman_correlation De metrische gegevens die u wilt optimaliseren. Het best passende model wordt gekozen op basis van deze metrische waarde.
featurization auto Door auto te gebruiken, kunnen de invoergegevens (afhandeling van ontbrekende gegevens, conversie van tekst naar numerieke waarden, enzovoort) voor het experiment worden voorverwerkt.
uitgebreidheid logging.INFO Hiermee bepaalt u het niveau van logboekregistratie.
n_cross_validations 5 Aantal kruisvalidatiesplitsingen dat moet worden uitgevoerd wanneer er geen validatiegegevens zijn opgegeven.
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
}

Gebruik de gedefinieerde trainingsinstellingen als **kwargs-parameter voor een AutoMLConfig-object. Geef uw trainingsgegevens en het type model op. In dat geval is dat 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)

Notitie

Geautomatiseerde machine learning-voorverwerkingsstappen (kenmerknormalisatie, het verwerken van ontbrekende gegevens, het converteren van tekst naar numerieke waarden, enzovoort) worden onderdeel van het onderliggende model. Wanneer u het model voor voorspellingen gebruikt, worden dezelfde voorverwerkingsstappen die tijdens de training zijn toegepast, automatisch toegepast op uw invoergegevens.

Het automatische regressiemodel trainen

Maak een experimentobject in uw werkruimte. Een experiment fungeert als een container voor uw afzonderlijke taken. Geef het gedefinieerde automl_config object door aan het experiment en stel de uitvoer in om True de voortgang tijdens de taak weer te geven.

Nadat het experiment is gestart, wordt de weergegeven uitvoer live bijgewerkt terwijl het experiment wordt uitgevoerd. Voor elke iteratie ziet u het modeltype, de uitvoeringsduur en de nauwkeurigheid van de training. In het veld BEST wordt de beste trainingsscore op basis van uw type metrische waarde bijgehouden.

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

De resultaten verkennen

Bekijk de resultaten van de automatische training met een Jupyter-widget. Met de widget kunt u een grafiek en tabel van alle afzonderlijke taakiteraties bekijken, samen met metrische gegevens en metagegevens voor de nauwkeurigheid van de training. Daarnaast kunt u met behulp van de vervolgkeuzelijst filteren op andere metrische nauwkeurigheidsgegevens dan de eerste metrische gegevens.

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

Jupyter widget run detailsJupyter widget plot

Het beste model ophalen

Selecteer het beste model in uw iteraties. De methode get_output retourneert de beste uitvoering en het aangepaste model voor de laatste aangepaste aanroep. U kunt de overloads op get_output gebruiken om de beste uitvoering en het aangepaste model op te halen voor alle geregistreerde metrische gegevens of voor een bepaalde interatie.

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

Nauwkeurigheid van het beste model testen

Gebruik het beste model om voorspellingen uit te voeren op de testgegevensset om taxitarieven te voorspellen. De functie predict maakt gebruik van het beste model en voorspelt de waarden van y (ritkosten) uit de gegevensset x_test voorspeld. Druk de eerste 10 voorspelde kostenwaarden uit y_predict af.

y_test = x_test.pop("totalAmount")

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

Bereken de root mean squared error van de resultaten. Converteer het gegevensframe y_test in een lijst voor vergelijking met de voorspelde waarden. Met de functie mean_squared_error wordt de gemiddelde gekwadrateerde fout berekend tussen twee matrices met waarden. De vierkantswortel van het resultaat veroorzaakt een fout in dezelfde eenheden als de variabele y (kosten). Deze waarde geeft aan in welke mate de voorspelde taxitarieven ongeveer afwijken van de werkelijke tarieven.

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

Voer de volgende code uit om MAPE (het gemiddelde absolute foutpercentage) te berekenen met behulp van de volledige gegevenssets y_actual en y_predict. Met deze statistiek wordt een absoluut verschil tussen elke voorspelde en werkelijke waarde berekent en worden alle verschillen opgeteld. Vervolgens wordt die som weergegeven als een percentage van het totaal van de werkelijke waarden.

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

In de twee metrische nauwkeurigheidsgegevens van de voorspellingen kunt u zien dat het model redelijk goed is in het voorspellen van taxitarieven op basis van de functies van de gegevensset; gewoonlijk $4,00 te veel of te weinig en een foutmarge van circa 15%.

In het traditionele ontwikkelingsproces voor een Machine Learning-model vergt het veel resourcecapaciteit, domeinkennis en tijd om verschillende modellen uit te voeren en de resultaten daarvan met elkaar te vergelijken. Geautomatiseerde machine learning is een uitstekende manier om in korte tijd veel verschillende modellen voor uw scenario te testen.

Resources opschonen

Voltooi deze sectie niet als u van plan bent om andere Azure Machine Learning-zelfstudies uit te voeren.

Het rekenproces stoppen

Als u een rekenproces hebt gebruikt, stopt u de VM wanneer u deze niet gebruikt om de kosten te verlagen.

  1. Selecteer in uw werkruimte Compute.

  2. Selecteer in de lijst de naam van het rekenproces.

  3. Selecteer Stoppen.

  4. Wanneer u klaar bent om de server opnieuw te gebruiken, selecteert u Starten.

Alles verwijderen

Als u niet van plan bent om gebruik te maken van de resources die u hebt gemaakt, kunt u ze verwijderen zodat er geen kosten voor in rekening worden gebracht.

  1. Selecteer Resourcegroepen links in Azure Portal.
  2. Selecteer de resourcegroep die u eerder hebt gemaakt uit de lijst.
  3. Selecteer Resourcegroep verwijderen.
  4. Voer de naam van de resourcegroup in. Selecteer daarna Verwijderen.

U kunt de resourcegroep ook bewaren en slechts één werkruimte verwijderen. Bekijk de eigenschappen van de werkruimte en selecteer Verwijderen.

Volgende stappen

In dit artikel over geautomatiseerde machine learning hebt u de volgende taken uitgevoerd:

  • U hebt een werkruimte geconfigureerd en gegevens voorbereid voor een experiment.
  • U hebt getraind met behulp van een lokaal geautomatiseerd regressiemodel met aangepaste parameters.
  • U hebt trainingsresultaten verkend en gecontroleerd.

AutoML instellen om Computer Vision-modellen te trainen met Python (v1)