Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot

Autopilot Amazon SageMaker memungkinkan organisasi untuk dengan cepat membangun dan menerapkan model pembelajaran mesin (ML) end-to-end dan saluran inferensi hanya dengan beberapa baris kode atau bahkan tanpa kode apapun sama sekali dengan Studio Amazon SageMaker. Autopilot mengurangi beban berat dari konfigurasi infrastruktur dan waktu yang diperlukan untuk membangun keseluruhan pipeline, termasuk rekayasa fitur, pemilihan model, dan penyetelan hyperparameter.

Dalam posting ini, kami menunjukkan cara beralih dari data mentah ke pipeline inferensi yang kuat dan diterapkan sepenuhnya dengan Autopilot.

Ikhtisar solusi

Kami menggunakan Kumpulan data publik Lyft tentang berbagi sepeda simulasi ini untuk memprediksi apakah pengguna berpartisipasi dalam Berbagi Sepeda untuk Semua program. Ini adalah masalah klasifikasi biner sederhana.

Kami ingin menunjukkan betapa mudahnya membangun saluran inferensi otomatis dan waktu nyata untuk mengklasifikasikan pengguna berdasarkan partisipasi mereka dalam program Berbagi Sepeda untuk Semua. Untuk tujuan ini, kami mensimulasikan penyerapan data end-to-end dan saluran inferensi untuk perusahaan bikeshare imajiner yang beroperasi di San Francisco Bay Area.

Arsitektur dipecah menjadi dua bagian: pipa penyerapan dan pipa inferensi.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Kami terutama berfokus pada pipeline ML di bagian pertama postingan ini, dan meninjau pipeline penyerapan data di bagian kedua.

Prasyarat

Untuk mengikuti contoh ini, selesaikan prasyarat berikut:

  1. Buat instans notebook SageMaker baru.
  2. Buat Firehose Data Amazon Kinesis aliran pengiriman dengan AWS Lambda mengubah fungsi. Untuk petunjuk, lihat Transformasi Data Amazon Kinesis Firehose dengan AWS Lambda. Langkah ini opsional dan hanya diperlukan untuk mensimulasikan streaming data.

Eksplorasi data

Mari unduh dan visualisasikan kumpulan data, yang terletak di tempat umum Layanan Penyimpanan Sederhana Amazon Bucket (Amazon S3) dan situs web statis:

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

Tangkapan layar berikut menunjukkan subset data sebelum transformasi.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Kolom terakhir dari data berisi target yang ingin kita prediksi, yang merupakan variabel biner yang mengambil nilai Ya atau Tidak, yang menunjukkan apakah pengguna berpartisipasi dalam program Bike Share for All.

Mari kita lihat distribusi variabel target kita untuk ketidakseimbangan data.

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

Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Seperti yang ditunjukkan pada grafik di atas, datanya tidak seimbang, dengan lebih sedikit orang yang berpartisipasi dalam program.

Kita perlu menyeimbangkan data untuk mencegah bias representasi yang berlebihan. Langkah ini opsional karena Autopilot juga menawarkan pendekatan internal untuk menangani ketidakseimbangan kelas secara otomatis, yang defaultnya adalah metrik validasi skor F1. Selain itu, jika Anda memilih untuk menyeimbangkan data sendiri, Anda dapat menggunakan teknik yang lebih canggih untuk menangani ketidakseimbangan kelas, seperti HALUS or Gan.

Untuk postingan kali ini, kita downsample kelas mayoritas (No) sebagai teknik data balancing:

Kode berikut memperkaya data dan mengurangi sampel kelas yang direpresentasikan secara berlebihan:

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)

Kami sengaja membiarkan fitur kategoris kami tidak dikodekan, termasuk nilai target biner kami. Ini karena Autopilot menangani encoding dan decoding data untuk kami sebagai bagian dari rekayasa fitur otomatis dan penerapan pipeline, seperti yang kita lihat di bagian berikutnya.

Tangkapan layar berikut menunjukkan contoh data kami.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Data dalam grafik berikut terlihat normal, dengan distribusi bimodal yang mewakili dua puncak untuk jam pagi dan jam sibuk sore, seperti yang Anda harapkan. Kami juga mengamati aktivitas rendah di akhir pekan dan di malam hari.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Di bagian selanjutnya, kami memasukkan data ke Autopilot sehingga dapat menjalankan eksperimen untuk kami.

Membangun model klasifikasi biner

Autopilot mengharuskan kita menentukan bucket tujuan input dan output. Ini menggunakan bucket input untuk memuat data dan bucket output untuk menyimpan artefak, seperti rekayasa fitur dan notebook Jupyter yang dihasilkan. Kami mempertahankan 5% dari kumpulan data untuk mengevaluasi dan memvalidasi kinerja model setelah pelatihan selesai dan mengunggah 95% kumpulan data ke bucket input S3. Lihat kode berikut:

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)

Setelah kita mengupload data ke tujuan input, saatnya untuk memulai 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)

Yang kita perlukan untuk mulai bereksperimen adalah memanggil metode fit(). Autopilot membutuhkan lokasi S3 input dan output dan kolom atribut target sebagai parameter yang diperlukan. Setelah pemrosesan fitur, panggilan Autopilot Tuning model otomatis SageMaker untuk menemukan versi model terbaik dengan menjalankan banyak tugas pelatihan pada set data Anda. Kami menambahkan parameter max_candidates opsional untuk membatasi jumlah kandidat hingga 30, yang merupakan jumlah tugas pelatihan yang diluncurkan Autopilot dengan berbagai kombinasi algoritme dan hyperparameter untuk menemukan model terbaik. Jika Anda tidak menentukan parameter ini, defaultnya adalah 250.

Kita dapat mengamati perkembangan Autopilot dengan kode berikut:

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

Pelatihan membutuhkan waktu untuk menyelesaikannya. Saat sedang berjalan, mari kita lihat alur kerja Autopilot.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Untuk menemukan kandidat terbaik, gunakan kode berikut:

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

Tangkapan layar berikut menunjukkan keluaran kami.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Model kami mencapai akurasi validasi 96%, jadi kami akan menerapkannya. Kita dapat menambahkan kondisi sedemikian rupa sehingga kita hanya menggunakan model jika akurasinya di atas tingkat tertentu.

Pipa inferensi

Sebelum kita menerapkan model kita, mari kita periksa kandidat terbaik kita dan apa yang terjadi di jalur kita. Lihat kode berikut:

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

Diagram berikut menunjukkan output kami.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Autopilot telah membangun model dan mengemasnya dalam tiga wadah berbeda, masing-masing secara berurutan menjalankan tugas tertentu: transformasi, prediksi, dan transformasi balik. Inferensi multi-langkah ini dimungkinkan dengan Pipa inferensi SageMaker.

Inferensi multi-langkah juga dapat menghubungkan beberapa model inferensi. Misalnya, satu wadah dapat melakukan analisis komponen utama sebelum meneruskan data ke wadah XGBoost.

Terapkan pipa inferensi ke titik akhir

Proses penyebaran hanya melibatkan beberapa baris 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)

Mari konfigurasikan titik akhir kita untuk prediksi dengan prediktor:

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 )

Sekarang setelah titik akhir dan prediktor kami siap, saatnya menggunakan data pengujian yang kami sisihkan dan menguji keakuratan model kami. Kami mulai dengan mendefinisikan fungsi utilitas yang mengirimkan data satu baris pada satu waktu ke titik akhir inferensi kami dan mendapatkan prediksi sebagai balasannya. Karena kami memiliki XGBoost model, kami menjatuhkan variabel target sebelum mengirim garis CSV ke titik akhir. Selain itu, kami menghapus header dari CSV pengujian sebelum mengulang file, yang juga merupakan persyaratan lain untuk XGBoost di SageMaker. Lihat kode berikut:

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

Tangkapan layar berikut menunjukkan keluaran kami.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Sekarang mari kita hitung akurasi model kita.
Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.

Lihat kode berikut:

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

Kami mendapatkan akurasi 92%. Ini sedikit lebih rendah dari 96% yang diperoleh selama langkah validasi, tetapi masih cukup tinggi. Kami tidak mengharapkan akurasi yang sama persis karena pengujian dilakukan dengan dataset baru.

Penyerapan data

Kami mengunduh data secara langsung dan mengonfigurasinya untuk pelatihan. Dalam kehidupan nyata, Anda mungkin harus mengirim data langsung dari perangkat edge ke data lake dan meminta SageMaker memuatnya langsung dari data lake ke notebook.

Kinesis Data Firehose adalah opsi yang baik dan cara paling mudah untuk memuat data streaming secara andal ke dalam data lake, penyimpanan data, dan alat analitik. Itu dapat menangkap, mengubah, dan memuat data streaming ke Amazon S3 dan penyimpanan data AWS lainnya.

Untuk kasus penggunaan kami, kami membuat aliran pengiriman Kinesis Data Firehose dengan fungsi transformasi Lambda untuk melakukan pembersihan data ringan saat melintasi aliran. Lihat kode berikut:

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

Fungsi Lambda ini melakukan transformasi ringan dari data yang dialirkan dari perangkat ke data lake. Ia mengharapkan file data berformat CSV.

Untuk langkah penyerapan, kami mengunduh data dan mensimulasikan aliran data ke Kinesis Data Firehose dengan fungsi transformasi Lambda dan menjadi data lake S3 kami.

Mari simulasikan streaming beberapa baris:

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

Membersihkan

Sangat penting untuk menghapus semua sumber daya yang digunakan dalam latihan ini untuk meminimalkan biaya. Kode berikut menghapus titik akhir inferensi SageMaker yang kami buat serta data pelatihan dan pengujian yang kami unggah:

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

Kesimpulan

Insinyur ML, ilmuwan data, dan pengembang perangkat lunak dapat menggunakan Autopilot untuk membangun dan menerapkan saluran inferensi dengan sedikit atau tanpa pengalaman pemrograman ML. Autopilot menghemat waktu dan sumber daya, menggunakan ilmu data dan praktik terbaik ML. Organisasi besar sekarang dapat mengalihkan sumber daya teknik dari konfigurasi infrastruktur ke peningkatan model dan penyelesaian kasus penggunaan bisnis. Startup dan organisasi yang lebih kecil dapat memulai pembelajaran mesin dengan sedikit atau tanpa keahlian ML.

Untuk memulai SageMaker Autopilot, lihat halaman produk atau akses SageMaker Autopilot dalam SageMaker Studio.

Kami juga merekomendasikan untuk mempelajari lebih lanjut tentang fitur penting lainnya yang ditawarkan SageMaker, seperti Toko Fitur Amazon SageMaker, yang terintegrasi dengan Pipa Amazon SageMaker untuk membuat, menambahkan pencarian dan penemuan fitur, dan menggunakan kembali alur kerja ML otomatis. Anda dapat menjalankan beberapa simulasi Autopilot dengan fitur atau varian target yang berbeda dalam kumpulan data Anda. Anda juga bisa mendekati ini sebagai masalah alokasi kendaraan dinamis di mana model Anda mencoba untuk memprediksi permintaan kendaraan berdasarkan waktu (seperti waktu hari atau hari dalam seminggu) atau lokasi, atau kombinasi keduanya.


Tentang Penulis

Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.Doug Mbaya adalah arsitek Solusi Senior dengan fokus pada data dan analitik. Doug bekerja sama dengan mitra AWS, membantu mereka mengintegrasikan data dan solusi analitik di cloud. Pengalaman Doug sebelumnya termasuk mendukung pelanggan AWS di segmen berbagi perjalanan dan pengiriman makanan.

Otomatiskan model klasifikasi sepeda dan skuter bersama dengan Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. Pencarian Vertikal. ai.Valerio Perron adalah Manajer Sains Terapan yang bekerja di Penyetelan Model Otomatis dan Autopilot Amazon SageMaker.

Stempel Waktu:

Lebih dari Pembelajaran Mesin AWS