Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Avtomatizirajte model skupne klasifikacije koles in skuterjev z Amazon SageMaker Autopilot

Amazonski SageMaker avtopilot omogoča organizacijam, da hitro zgradijo in uvedejo model strojnega učenja (ML) in cevovod sklepanja s samo nekaj vrsticami kode ali celo brez kode sploh z Amazon SageMaker Studio. Avtopilot razbremeni težko delo konfiguriranja infrastrukture in časa, ki je potreben za izgradnjo celotnega cevovoda, vključno z inženiringom funkcij, izbiro modela in prilagajanjem hiperparametrov.

V tem prispevku pokažemo, kako z avtopilotom preiti iz neobdelanih podatkov v robusten in popolnoma razporejen sklepni cevovod.

Pregled rešitev

Mi uporabljamo Lyftov javni nabor podatkov o souporabi koles za to simulacijo predvideti, ali uporabnik sodeluje ali ne Program Bike Share za vse. To je preprost problem binarne klasifikacije.

Želimo pokazati, kako enostavno je zgraditi avtomatiziran in sproten cevovod sklepanja za razvrščanje uporabnikov na podlagi njihovega sodelovanja v programu Bike Share for All. V ta namen simuliramo cevovod za vnos podatkov in sklepanje od konca do konca za namišljeno podjetje za souporabo koles, ki deluje na območju zaliva San Francisco.

Arhitektura je razdeljena na dva dela: cevovod za zaužitje in cevovod sklepanja.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

V prvem delu te objave se osredotočamo predvsem na cevovod ML, v drugem delu pa pregledujemo cevovod za vnos podatkov.

Predpogoji

Če želite slediti temu primeru, izpolnite naslednje predpogoje:

  1. Ustvarite nov primerek prenosnika SageMaker.
  2. Ustvari Amazon Kinesis Data Firehose dostavni tok z an AWS Lambda transformacijsko funkcijo. Za navodila glejte Transformacija podatkov Amazon Kinesis Firehose z AWS Lambda. Ta korak ni obvezen in je potreben samo za simulacijo pretakanja podatkov.

Raziskovanje podatkov

Prenesimo in vizualizirajmo nabor podatkov, ki se nahaja v javnosti Preprosta storitev shranjevanja Amazon (Amazon S3) vedro in statično spletno mesto:

# The dataset is located in a public bucket and static s3 website.
# https://www.lyft.com/bikes/bay-wheels/system-data import pandas as pd
import numpy as np
import os
from time import sleep !wget -q -O '201907-baywheels-tripdata.zip' https://s3.amazonaws.com/baywheels-data/201907-baywheels-tripdata.csv.zip
!unzip -q -o 201907-baywheels-tripdata.zip
csv_file = os.listdir('.')
data = pd.read_csv('201907-baywheels-tripdata.csv', low_memory=False)
data.head()

Naslednji posnetek zaslona prikazuje podnabor podatkov pred transformacijo.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Zadnji stolpec podatkov vsebuje cilj, ki ga želimo predvideti, ki je binarna spremenljivka z vrednostjo Da ali Ne, ki označuje, ali uporabnik sodeluje v programu Bike Share for All.

Oglejmo si porazdelitev naše ciljne spremenljivke za kakršno koli neravnovesje podatkov.

# For plotting
%matplotlib inline
import matplotlib.pyplot as plt
#!pip install seaborn # If you need this library
import seaborn as sns
display(sns.countplot(x='bike_share_for_all_trip', data=data))

Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Kot je prikazano na zgornjem grafu, so podatki neuravnoteženi, saj v programu sodeluje manj ljudi.

Podatke moramo uravnotežiti, da preprečimo pristranskost prevelike zastopanosti. Ta korak ni obvezen, ker Autopilot ponuja tudi interni pristop za samodejno obravnavanje neravnovesja razreda, ki je privzeto nastavljen na metriko preverjanja F1. Poleg tega, če se odločite za uravnoteženje podatkov sami, lahko uporabite naprednejše tehnike za obravnavo neravnovesja razredov, kot je npr. SMETE or GAN.

Za to objavo zmanjšamo vzorčenje večinskega razreda (Ne) kot tehniko za uravnoteženje podatkov:

Naslednja koda obogati podatke in premalo vzorči preveč zastopani razred:

df = data.copy()
df.drop(columns=['rental_access_method'], inplace=True) df['start_time'] = pd.to_datetime(df['start_time'])
df['start_time'] = pd.to_datetime(df['end_time']) # Adding some day breakdown
df = df.assign(day_of_week=df.start_time.dt.dayofweek, hour_of_day=df.start_time.dt.hour, trip_month=df.start_time.dt.month)
# Breaking the day in 4 parts: ['morning', 'afternoon', 'evening']
conditions = [ (df['hour_of_day'] >= 5) & (df['hour_of_day'] < 12), (df['hour_of_day'] >= 12) & (df['hour_of_day'] < 18), (df['hour_of_day'] >= 18) & (df['hour_of_day'] < 21),
]
choices = ['morning', 'afternoon', 'evening']
df['part_of_day'] = np.select(conditions, choices, default='night')
df.dropna(inplace=True) # Downsampling the majority to rebalance the data
# We are getting about an even distribution
df.sort_values(by='bike_share_for_all_trip', inplace=True)
slice_pointe = int(df['bike_share_for_all_trip'].value_counts()['Yes'] * 2.1)
df = df[-slice_pointe:]
# The data is balanced now. Let's reshuffle the data
df = df.sample(frac=1).reset_index(drop=True)

Naše kategorične lastnosti, vključno z našo binarno ciljno vrednostjo, namenoma nismo kodirali. To je zato, ker Autopilot poskrbi za kodiranje in dekodiranje podatkov namesto nas kot del samodejnega inženiringa funkcij in uvajanja cevovoda, kot vidimo v naslednjem razdelku.

Naslednji posnetek zaslona prikazuje vzorec naših podatkov.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Podatki v naslednjih grafih so sicer videti običajni, z bimodalno porazdelitvijo, ki predstavlja dva vrha za jutranje ure in popoldanske konice, kot bi pričakovali. Nizke aktivnosti opažamo tudi ob vikendih in ponoči.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

V naslednjem razdelku posredujemo podatke avtopilotu, da lahko izvede poskus namesto nas.

Zgradite binarni klasifikacijski model

Avtopilot zahteva, da določimo vhodne in izhodne ciljne segmente. Uporablja vhodno vedro za nalaganje podatkov in izhodno vedro za shranjevanje artefaktov, kot so inženiring funkcij in ustvarjeni Jupyterjevi zvezki. Obdržimo 5 % nabora podatkov, da ocenimo in potrdimo delovanje modela po končanem usposabljanju in naložimo 95 % nabora podatkov v vhodno vedro S3. Oglejte si naslednjo kodo:

import sagemaker
import boto3 # Let's define our storage.
# We will use the default sagemaker bucket and will enforce encryption bucket = sagemaker.Session().default_bucket() # SageMaker default bucket. #Encrypting the bucket
s3 = boto3.client('s3')
SSEConfig={ 'Rules': [ { 'ApplyServerSideEncryptionByDefault': { 'SSEAlgorithm': 'AES256', } }, ] }
s3.put_bucket_encryption(Bucket=bucket, ServerSideEncryptionConfiguration=SSEConfig) prefix = 'sagemaker-automl01' # prefix for ther bucket
role = sagemaker.get_execution_role() # IAM role object to use by SageMaker
sagemaker_session = sagemaker.Session() # Sagemaker API
region = sagemaker_session.boto_region_name # AWS Region # Where we will load our data input_path = "s3://{}/{}/automl_bike_train_share-1".format(bucket, prefix) output_path = "s3://{}/{}/automl_bike_output_share-1".format(bucket, prefix) # Spliting data in train/test set.
# We will use 95% of the data for training and the remainder for testing.
slice_point = int(df.shape[0] * 0.95) training_set = df[:slice_point] # 95%
testing_set = df[slice_point:] # 5% # Just making sure we have split it correctly
assert training_set.shape[0] + testing_set.shape[0] == df.shape[0] # Let's save the data locally and upload it to our s3 data location
training_set.to_csv('bike_train.csv')
testing_set.to_csv('bike_test.csv', header=False) # Uploading file the trasining set to the input bucket
sagemaker.s3.S3Uploader.upload(local_path='bike_train.csv', desired_s3_uri=input_path)

Ko naložimo podatke na cilj vnosa, je čas, da zaženemo avtopilot:

from sagemaker.automl.automl import AutoML
# You give your job a name and provide the s3 path where you uploaded the data
bike_automl_binary = AutoML(role=role, target_attribute_name='bike_share_for_all_trip', output_path=output_path, max_candidates=30)
# Starting the training bike_automl_binary.fit(inputs=input_path, wait=False, logs=False)

Vse, kar potrebujemo za začetek eksperimentiranja, je, da pokličemo metodo fit(). Avtopilot potrebuje vhodno in izhodno lokacijo S3 ter stolpec ciljnega atributa kot zahtevane parametre. Po obdelavi funkcij pokliče avtopilot Samodejno prilagajanje modela SageMaker da poiščete najboljšo različico modela z izvajanjem številnih izobraževalnih opravil na svojem naboru podatkov. Dodali smo izbirni parameter max_candidates, da omejimo število kandidatov na 30, kar je število delovnih mest za usposabljanje, ki jih Autopilot sproži z različnimi kombinacijami algoritmov in hiperparametrov, da bi našel najboljši model. Če tega parametra ne podate, je privzeta vrednost 250.

Napredek avtopilota lahko opazujemo z naslednjo kodo:

# Let's monitor the progress this will take a while. Go grup some coffe.
from time import sleep def check_job_status(): return bike_automl_binary.describe_auto_ml_job()['AutoMLJobStatus'] def discribe(): return bike_automl_binary.describe_auto_ml_job() while True: print (check_job_status(), discribe()['AutoMLJobSecondaryStatus'], end='** ') if check_job_status() in ["Completed", "Failed"]: if "Failed" in check_job_status(): print(discribe()['FailureReason']) break sleep(20)

Usposabljanje traja nekaj časa. Medtem ko teče, si poglejmo potek dela avtopilota.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Za iskanje najboljšega kandidata uporabite naslednjo kodo:

# Let's take a look at the best candidate selected by AutoPilot
from IPython.display import JSON
def jsonView(obj, rootName=None): return JSON(obj, root=rootName, expanded=True) bestCandidate = bike_automl_binary.describe_auto_ml_job()['BestCandidate']
display(jsonView(bestCandidate['FinalAutoMLJobObjectiveMetric'], 'FinalAutoMLJobObjectiveMetric'))

Naslednja slika zaslona prikazuje naš rezultat.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Naš model je dosegel 96-odstotno natančnost validacije, zato ga bomo uvedli. Lahko bi dodali pogoj, da model uporabimo le, če je natančnost nad določeno stopnjo.

Sklepni cevovod

Preden uvedemo naš model, preglejmo našega najboljšega kandidata in kaj se dogaja v našem načrtu. Oglejte si naslednjo kodo:

display(jsonView(bestCandidate['InferenceContainers'], 'InferenceContainers'))

Naslednji diagram prikazuje naš rezultat.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Autopilot je izdelal model in ga zapakiral v tri različne vsebnike, od katerih vsak zaporedno izvaja določeno nalogo: preoblikovanje, predvidevanje in povratno preoblikovanje. To večstopenjsko sklepanje je možno z a Sklepni cevovod SageMaker.

Večstopenjsko sklepanje lahko tudi veriži več modelov sklepanja. Na primer, en vsebnik lahko deluje analiza glavnih komponent preden posredujete podatke v vsebnik XGBoost.

Razmestite inferenčni cevovod do končne točke

Postopek uvajanja vključuje le nekaj vrstic kode:

# We chose to difine an endpoint name.
from datetime import datetime as dt
today = str(dt.today())[:10]
endpoint_name='binary-bike-share-' + today
endpoint = bike_automl_binary.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge', endpoint_name=endpoint_name, candidate=bestCandidate, wait=True)

Konfigurirajmo našo končno točko za napovedovanje s prediktorjem:

from sagemaker.serializers import CSVSerializer
from sagemaker.deserializers import CSVDeserializer
csv_serializer = CSVSerializer()
csv_deserializer = CSVDeserializer()
# Initialize the predictor
predictor = sagemaker.predictor.Predictor(endpoint_name=endpoint_name, sagemaker_session=sagemaker.Session(), serializer=csv_serializer, deserializer=csv_deserializer )

Zdaj, ko imamo pripravljeno našo končno točko in napovedovalec, je čas, da uporabimo podatke testiranja, ki smo jih pustili na stran, in preizkusimo natančnost našega modela. Začnemo z definiranjem funkcije pripomočka, ki pošilja podatke eno vrstico naenkrat v našo končno točko sklepanja in v zameno dobi napoved. Ker imamo XGBoost model, spustimo ciljno spremenljivko, preden pošljemo vrstico CSV končni točki. Poleg tega smo odstranili glavo iz testnega CSV, preden smo pregledali datoteko, kar je še ena zahteva za XGBoost na SageMakerju. Oglejte si naslednjo kodo:

# The fuction takes 3 arguments: the file containing the test set,
# The predictor and finaly the number of lines to send for prediction.
# The function returns two Series: inferred and Actual.
def get_inference(file, predictor, n=1): infered = [] actual = [] with open(file, 'r') as csv: for i in range(n): line = csv.readline().split(',') #print(line) try: # Here we remove the target variable from the csv line before predicting observed = line.pop(14).strip('n') actual.append(observed) except: pass obj = ','.join(line) predicted = predictor.predict(obj)[0][0] infered.append(predicted) pd.Series(infered) data = {'Infered': pd.Series(infered), 'Observed': pd.Series(actual)} return pd.DataFrame(data=data) n = testing_set.shape[0] # The size of the testing data
inference_df = get_inference('bike_test.csv', predictor, n) inference_df['Binary_Result'] = (inference_df['Observed'] == inference_df['Infered'])
display(inference_df.head())

Naslednja slika zaslona prikazuje naš rezultat.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Zdaj pa izračunajmo natančnost našega modela.
Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Glej naslednjo kodo:

count_binary = inference_df['Binary_Result'].value_counts()
accuracy = count_binary[True]/n
print('Accuracy:', accuracy)

Dobimo 92-odstotno natančnost. To je nekoliko nižje od 96 %, pridobljenih med korakom validacije, vendar je še vedno dovolj visoko. Ne pričakujemo, da bo natančnost popolnoma enaka, ker se test izvaja z novim naborom podatkov.

Zaužitje podatkov

Podatke smo prenesli neposredno in jih konfigurirali za usposabljanje. V resničnem življenju boste morda morali poslati podatke neposredno iz robne naprave v podatkovno jezero in naj jih SageMaker naloži neposredno iz podatkovnega jezera v prenosni računalnik.

Kinesis Data Firehose je dobra možnost in najbolj enostaven način za zanesljivo nalaganje pretočnih podatkov v podatkovna jezera, podatkovne shrambe in analitična orodja. Lahko zajame, preoblikuje in naloži pretočne podatke v Amazon S3 in druge podatkovne shrambe AWS.

Za naš primer uporabe ustvarimo tok dostave Kinesis Data Firehose s funkcijo transformacije Lambda, da opravimo nekaj lahkega čiščenja podatkov, ko prečkajo tok. Oglejte si naslednjo kodo:

# Data processing libraries
import pandas as pd # Data processing
import numpy as np
import base64
from io import StringIO def lambda_handler(event, context): output = [] print('Received', len(event['records']), 'Records') for record in event['records']: payload = base64.b64decode(record['data']).decode('utf-8') df = pd.read_csv(StringIO(payload), index_col=0) df.drop(columns=['rental_access_method'], inplace=True) df['start_time'] = pd.to_datetime(df['start_time']) df['start_time'] = pd.to_datetime(df['end_time']) # Adding some day breakdown df = df.assign(day_of_week=df.start_time.dt.dayofweek, hour_of_day=df.start_time.dt.hour, trip_month=df.start_time.dt.month) # Breaking the day in 4 parts: ['morning', 'afternoon', 'evening'] conditions = [ (df['hour_of_day'] >= 5) & (df['hour_of_day'] < 12), (df['hour_of_day'] >= 12) & (df['hour_of_day'] < 18), (df['hour_of_day'] >= 18) & (df['hour_of_day'] < 21), ] choices = ['morning', 'afternoon', 'evening'] df['part_of_day'] = np.select(conditions, choices, default='night') df.dropna(inplace=True) # Downsampling the majority to rebalance the data # We are getting about an even distribution df.sort_values(by='bike_share_for_all_trip', inplace=True) slice_pointe = int(df['bike_share_for_all_trip'].value_counts()['Yes'] * 2.1) df = df[-slice_pointe:] # The data is balanced now. Let's reshuffle the data df = df.sample(frac=1).reset_index(drop=True) data = base64.b64encode(bytes(df.to_csv(), 'utf-8')).decode("utf-8") output_record = { 'recordId': record['recordId'], 'result': 'Ok', 'data': data } output.append(output_record) print('Returned', len(output), 'Records') print('Event', event) return {'records': output}

Ta funkcija Lambda izvaja rahlo transformacijo podatkov, ki se pretakajo iz naprav v podatkovno jezero. Pričakuje podatkovno datoteko v formatu CSV.

Za korak vnosa prenesemo podatke in simuliramo podatkovni tok v Kinesis Data Firehose s funkcijo pretvorbe Lambda in v naše podatkovno jezero S3.

Simulirajmo pretakanje nekaj vrstic:

# Saving the data in one file.
file = '201907-baywheels-tripdata.csv' data.to_csv(file) # Stream the data 'n' lines at a time.
# Only run this for a minute and stop the cell
def streamer(file, n): with open(file, 'r') as csvfile: header = next(csvfile) data = header counter = 0 loop = True while loop == True: for i in range(n): line = csvfile.readline() data+=line # We reached the end of the csv file. if line == '': loop = False counter+=n # Use your kinesis streaming name stream = client.put_record(DeliveryStreamName='firehose12-DeliveryStream-OJYW71BPYHF2', Record={"Data": bytes(data, 'utf-8')}) data = header print( file, 'HTTPStatusCode: '+ str(stream['ResponseMetadata']['HTTPStatusCode']), 'csv_lines_sent: ' + str(counter), end=' -*- ') sleep(random.randrange(1, 3)) return
# Streaming for 500 lines at a time. You can change this number up and down.
streamer(file, 500) # We can now load our data as a DataFrame because it’s streamed into the S3 data lake:
# Getting data from s3 location where it was streamed.
STREAMED_DATA = 's3://firehose12-deliverybucket-11z0ya3patrod/firehose/2020'
csv_uri = sagemaker.s3.S3Downloader.list(STREAMED_DATA)
in_memory_string = [sagemaker.s3.S3Downloader.read_file(file) for file in csv_uri]
in_memory_csv = [pd.read_csv(StringIO(file), index_col=0) for file in in_memory_string]
display(df.tail())

Čiščenje

Pomembno je, da izbrišete vse vire, uporabljene v tej vaji, da zmanjšate stroške. Naslednja koda izbriše končno točko sklepanja SageMaker, ki smo jo ustvarili, ter podatke o usposabljanju in testiranju, ki smo jih naložili:

#Delete the s3 data
predictor.delete_endpoint() # Delete s3 data
s3 = boto3.resource('s3')
ml_bucket = sagemaker.Session().default_bucket()
delete_data = s3.Bucket(ml_bucket).objects.filter(Prefix=prefix).delete()

zaključek

Inženirji ML, podatkovni znanstveniki in razvijalci programske opreme lahko uporabljajo Autopilot za izgradnjo in uvajanje sklepnega cevovoda z malo ali nič izkušenj s programiranjem ML. Avtopilot prihrani čas in vire z uporabo podatkovne znanosti in najboljših praks ML. Velike organizacije lahko sedaj preusmerijo inženirske vire stran od konfiguracije infrastrukture k izboljšanju modelov in reševanju primerov poslovne uporabe. Startupi in manjše organizacije lahko začnejo uporabljati strojno učenje z malo ali nič strokovnega znanja o ML.

Če želite začeti uporabljati SageMaker Autopilot, glejte Stran izdelka ali odprite SageMaker Autopilot znotraj SageMaker Studio.

Priporočamo tudi, da izveste več o drugih pomembnih funkcijah, ki jih ponuja SageMaker, kot je Trgovina s funkcijami Amazon SageMaker, ki se integrira z Amazonski cevovodi SageMaker za ustvarjanje, dodajanje iskanja in odkrivanja funkcij ter ponovno uporabo avtomatiziranih delovnih tokov ML. Zaženete lahko več simulacij avtopilota z različnimi značilnostmi ali ciljnimi različicami v svojem naboru podatkov. Temu bi lahko pristopili tudi kot k problemu dinamičnega dodeljevanja vozil, pri katerem vaš model poskuša predvideti povpraševanje po vozilih na podlagi časa (kot je čas dneva ali dan v tednu) ali lokacije ali kombinacije obojega.


O avtorjih

Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.Doug Mbaya je višji arhitekt rešitev s poudarkom na podatkih in analitiki. Doug tesno sodeluje s partnerji AWS in jim pomaga pri integraciji podatkovne in analitične rešitve v oblaku. Dougove predhodne izkušnje vključujejo podporo strankam AWS v segmentu deljenja prevozov in dostave hrane.

Avtomatizirajte skupni model klasifikacije koles in skuterjev z Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.Valerio Perrone je vodja uporabne znanosti, ki dela na avtomatski nastavitvi modela in avtopilotu Amazon SageMaker.

Časovni žig:

Več od Strojno učenje AWS