Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Automatiseerige jagatud jalgrataste ja tõukerataste klassifikatsioonimudel Amazon SageMaker Autopilotiga

Amazon SageMakeri autopiloot võimaldab organisatsioonidel kiiresti luua ja juurutada täismasinõppe (ML) mudeli ja järelduste konveieri vaid mõne koodirea või isegi ilma igasuguse koodita üldse koos Amazon SageMaker Studio. Autopiloot vähendab infrastruktuuri konfigureerimise rasket raskust ja kogu torujuhtme ehitamiseks kuluvat aega, sealhulgas funktsioonide projekteerimist, mudelite valikut ja hüperparameetrite häälestamist.

Selles postituses näitame, kuidas jõuda toorandmetelt tugeva ja täielikult juurutatud järelduskonveierini koos Autopiloodiga.

Lahenduse ülevaade

Me kasutame Lyfti avalik andmestik jalgratta jagamise kohta et see simulatsioon ennustaks, kas kasutaja osaleb või mitte Programm Bike Share for All. See on lihtne binaarse klassifikatsiooni probleem.

Soovime näidata, kui lihtne on luua automatiseeritud ja reaalajas järelduste konveier, et klassifitseerida kasutajad nende osalemise alusel programmis Bike Share for All. Sel eesmärgil simuleerime San Francisco lahe piirkonnas tegutseva kujuteldava jalgrattajagamisettevõtte jaoks täielikku andmete sissevõtmist ja järelduste tegemise torustikku.

Arhitektuur on jagatud kaheks osaks: sisestuskonveier ja järelduskonveier.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Selle postituse esimeses osas keskendume peamiselt ML-i konveierile ja teises osas vaatame üle andmete sisestamise konveier.

Eeldused

Selle näite järgimiseks täitke järgmised eeltingimused.

  1. Looge uus SageMakeri märkmiku eksemplar.
  2. Loo Amazon Kinesis Data Firehose tarnevoog an AWS Lambda teisendusfunktsioon. Juhiseid vt Amazon Kinesis Firehose'i andmete teisendamine AWS lambdaga. See samm on valikuline ja vajalik ainult andmete voogesituse simuleerimiseks.

Andmete uurimine

Laadime alla ja visualiseerime andmestiku, mis asub avalikult Amazoni lihtne salvestusteenus (Amazon S3) ämber ja staatiline veebisait:

# 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()

Järgmine ekraanipilt näitab andmete alamhulka enne teisendamist.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Andmete viimane veerg sisaldab sihtmärki, mida tahame ennustada, mis on binaarne muutuja, mille väärtus on kas Jah või Ei, mis näitab, kas kasutaja osaleb programmis Bike Share for All.

Vaatame meie sihtmuutuja jaotust mis tahes andmete tasakaalustamatuse korral.

# 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))

Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Nagu ülaltoodud graafikul näha, on andmed tasakaalustamata, programmis osaleb vähem inimesi.

Peame andmed tasakaalustama, et vältida üleesindatust. See samm on valikuline, kuna Autopilot pakub ka sisemist lähenemisviisi klassi tasakaalustamatuse automaatseks käsitlemiseks, mis vaikimisi on F1 skoori valideerimismõõdik. Lisaks, kui otsustate andmeid ise tasakaalustada, saate klasside tasakaalustamatuse käsitlemiseks kasutada täiustatud tehnikaid, näiteks SMOTE or GAN.

Selle postituse jaoks võtame andmete tasakaalustamise tehnikana alla enamusklassi (No):

Järgmine kood rikastab andmeid ja moodustab üleesindatud klassi alavalimi:

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)

Jätsime oma kategoorilised tunnused, sealhulgas binaarse sihtväärtuse, tahtlikult kodeerimata. Seda seetõttu, et Autopilot hoolitseb meie eest andmete kodeerimise ja dekodeerimise eest osana automaatse funktsioonide projekteerimisest ja torujuhtme juurutusest, nagu näeme järgmises jaotises.

Järgmine ekraanipilt näitab meie andmete näidist.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Järgmiste graafikute andmed näevad muidu normaalsed välja, bimodaalne jaotus esindab hommikutundide ja pärastlõunaste tipptundide kahte tippu, nagu arvata võiks. Samuti jälgime vähest tegevust nädalavahetustel ja öösel.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Järgmises jaotises edastame andmed Autopiloodile, et see saaks meie jaoks katse käivitada.

Ehitage binaarne klassifikatsioonimudel

Autopiloot nõuab, et me määraksime sisendi ja väljundi sihtkoha ämbrid. See kasutab andmete laadimiseks sisendämbrit ja esemete (nt funktsioonide projekteerimine ja loodud Jupyteri sülearvutid) salvestamiseks väljundsalvi. Säilitame 5% andmekogumist, et hinnata ja kinnitada mudeli toimivust pärast koolituse lõppu ning laadida 95% andmekogumist S3 sisendsalve. Vaadake järgmist koodi:

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)

Kui oleme andmed sisestuskohta üles laadinud, on aeg käivitada Autopilot:

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)

Katsetamise alustamiseks vajame ainult meetodi fit() kutsumist. Autopiloot vajab nõutavate parameetritena sisendi ja väljundi S3 asukohta ning sihtmärgi atribuudi veergu. Pärast funktsioonide töötlemist helistab Autopilot SageMaker automaatne mudeli häälestamine mudeli parima versiooni leidmiseks, käivitades oma andmestikul palju koolitustöid. Lisasime valikulise parameetri max_candidates, et piirata kandidaatide arvu 30-ni, mis on koolitustööde arv, mille Autopilot käivitab erinevate algoritmide ja hüperparameetrite kombinatsioonidega, et leida parim mudel. Kui te seda parameetrit ei määra, on see vaikimisi 250.

Autopiloodi edenemist saame jälgida järgmise koodiga:

# 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)

Koolituse läbimine võtab veidi aega. Kui see töötab, vaatame Autopiloodi töövoogu.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Parima kandidaadi leidmiseks kasutage järgmist koodi:

# 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'))

Järgmine ekraanipilt näitab meie väljundit.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Meie mudeli valideerimise täpsus on 96%, seega võtame selle kasutusele. Võiksime lisada tingimuse, et kasutame mudelit ainult siis, kui täpsus on üle teatud taseme.

Järelduste torujuhe

Enne oma mudeli kasutuselevõttu uurime oma parimat kandidaati ja seda, mis meie plaanis toimub. Vaadake järgmist koodi:

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

Järgmine diagramm näitab meie väljundit.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Autopiloot on mudeli loonud ja pakkinud selle kolme erinevasse konteinerisse, millest igaüks täidab järjestikku konkreetset ülesannet: teisendamine, ennustamine ja vastupidine teisendamine. See mitmeastmeline järeldus on võimalik a SageMakeri järelduskonveier.

Mitmeastmeline järeldus võib aheldada ka mitut järeldusmudelit. Näiteks võib üks konteiner toimida põhikomponentide analüüs enne andmete edastamist XGBoosti konteinerisse.

Juurutage järelduskonveier lõpp-punkti

Juurutusprotsess hõlmab vaid mõnda koodirida:

# 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)

Konfigureerime oma lõpp-punkti ennustajaga ennustamiseks:

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 )

Nüüd, kui meie lõpp-punkt ja ennustaja on valmis, on aeg kasutada kõrvale pandud testimisandmeid ja testida oma mudeli täpsust. Alustuseks määratleme kasuliku funktsiooni, mis saadab andmed rea kaupa meie järelduse lõpp-punkti ja saab vastutasuks ennustuse. Sest meil on XGBoost mudeli puhul eemaldame sihtmuutuja enne CSV-rea lõpp-punkti saatmist. Lisaks eemaldasime testitavast CSV-st päise, enne kui faili läbi vaatame, mis on ka üks XGBoosti nõue SageMakeris. Vaadake järgmist koodi:

# 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())

Järgmine ekraanipilt näitab meie väljundit.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Nüüd arvutame oma mudeli täpsuse.
Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.

Vaadake järgmist koodi:

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

Saame täpsuseks 92%. See on veidi madalam kui valideerimisetapi käigus saadud 96%, kuid see on siiski piisavalt kõrge. Me ei eelda, et täpsus on täpselt sama, kuna test viiakse läbi uue andmekogumiga.

Andmete sissevõtmine

Laadisime andmed otse alla ja seadistasime treeningu jaoks. Reaalses elus peate võib-olla saatma andmed otse ääreseadmest andmejärve ja laskma SageMakeril need otse andmejärvest sülearvutisse laadida.

Kinesis Data Firehose on hea valik ja kõige lihtsam viis voogesituse andmete usaldusväärseks laadimiseks andmejärvedesse, andmesalvedesse ja analüüsitööriistadesse. See suudab jäädvustada, teisendada ja laadida voogesituse andmeid Amazon S3 ja teistesse AWS-i andmesalvedesse.

Meie kasutusjuhtumi jaoks loome Lambda teisendusfunktsiooniga Kinesis Data Firehose'i edastusvoo, et teha voo läbimisel kerget andmete puhastamist. Vaadake järgmist koodi:

# 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}

See Lambda funktsioon teostab seadmetelt voogesitatud andmete valguse teisendamist andmejärve. See eeldab CSV-vormingus andmefaili.

Allaneelamise etapis laadime andmed alla ja simuleerime andmevoogu Lambda teisendusfunktsiooniga Kinesis Data Firehose'i ja meie S3 andmejärve.

Simuleerime mõne rea voogesitust:

# 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())

Koristage

Kulude minimeerimiseks on oluline kustutada kõik selles harjutuses kasutatud ressursid. Järgmine kood kustutab meie loodud SageMakeri järelduse lõpp-punkti ning üleslaaditud koolitus- ja testimisandmed:

#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()

Järeldus

ML-i insenerid, andmeteadlased ja tarkvaraarendajad saavad kasutada Autopiloti järelduste konveieri loomiseks ja juurutamiseks vähese või ilma ML-i programmeerimise kogemusega. Autopiloot säästab aega ja ressursse, kasutades andmeteaduse ja ML parimaid tavasid. Suured organisatsioonid saavad nüüd suunata inseneriressursse infrastruktuuri konfigureerimiselt mudelite täiustamise ja ärikasutusjuhtude lahendamise suunas. Idufirmad ja väiksemad organisatsioonid saavad masinõppega alustada, kui neil on vähe või üldse mitte.

SageMaker Autopilotiga alustamiseks vaadake Toote leht või pääsete juurde SageMakeri stuudios SageMaker Autopilot.

Samuti soovitame saada lisateavet teiste SageMakeri pakutavate oluliste funktsioonide kohta, näiteks Amazon SageMakeri funktsioonipood, mis integreerub Amazon SageMakeri torujuhtmed automaatsete ML-töövoogude loomiseks, lisamiseks funktsioonide otsimiseks ja leidmiseks ning taaskasutamiseks. Saate käitada mitut autopiloodi simulatsiooni oma andmekogus erinevate funktsioonide või sihtvariantidega. Võite sellele läheneda ka kui sõiduki dünaamilise jaotamise probleemile, mille puhul teie mudel püüab ennustada sõidukite nõudlust aja (nt kellaaja või nädalapäeva) või asukoha või mõlema kombinatsiooni alusel.


Autoritest

Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.Doug Mbaya on vanemlahenduste arhitekt, kes keskendub andmetele ja analüütikale. Doug teeb tihedat koostööd AWS-i partneritega, aidates neil integreerida andmeid ja analüüsilahendusi pilve. Dougi varasem kogemus hõlmab AWS-i klientide toetamist sõidujagamise ja toidu kohaletoimetamise segmendis.

Automatiseerige jagatud jalgrataste ja tõukerataste klassifitseerimismudel Amazon SageMakeri autopiloodiga PlatoBlockchain Data Intelligence. Vertikaalne otsing. Ai.Valerio Perrone on rakendusteaduste juht, kes töötab Amazon SageMakeri automaatse mudeli häälestamise ja autopiloodi kallal.

Ajatempel:

Veel alates AWS-i masinõpe