אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם טייס אוטומטי של Amazon SageMaker

טייס אוטומטי של אמזון מאפשרת לארגונים לבנות ולפרוס במהירות מודל למידת מכונה מקצה לקצה (ML) וצינור מסקנות עם מספר שורות קוד בלבד או אפילו בלי שום קוד בכלל עם סטודיו SageMaker של אמזון. טייס אוטומטי מוריד את ההרמה הכבדה של הגדרת תשתית ואת הזמן שלוקח לבניית צינור שלם, כולל הנדסת תכונות, בחירת דגמים וכוונון היפרפרמטרים.

בפוסט זה, אנו מראים כיצד לעבור מנתונים גולמיים לצינור מסקנות חזק ופרוס במלואו עם טייס אוטומטי.

סקירת פתרונות

אנו משתמשים מערך הנתונים הציבורי של Lyft בנושא שיתוף אופניים לסימולציה זו כדי לחזות אם משתמש ישתתף או לא תוכנית Bike Share for All. זוהי בעיית סיווג בינארי פשוטה.

אנחנו רוצים להראות כמה קל לבנות צינור מסקנות אוטומטי ובזמן אמת כדי לסווג משתמשים על סמך השתתפותם בתוכנית Bike Share for All. לשם כך, אנו מדמים צינור של קליטת נתונים והסקת מידע מקצה לקצה עבור חברת שיתוף אופניים דמיונית הפועלת באזור מפרץ סן פרנסיסקו.

הארכיטקטורה מחולקת לשני חלקים: צינור הבליעה וצינור ההסקה.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

אנו מתמקדים בעיקר בצינור ML בחלק הראשון של פוסט זה, וסוקרים את צינור קליטת הנתונים בחלק השני.

תנאים מוקדמים

כדי לעקוב אחר דוגמה זו, השלם את התנאים המוקדמים הבאים:

  1. צור מופע מחברת SageMaker חדש.
  2. צור צינור אש נתונים של אמזון קינסי זרם משלוח עם AWS למבדה לשנות פונקציה. להנחיות, ראה אמזון Kinesis Firehose Transformation Data עם AWS Lambda. שלב זה הוא אופציונלי ונחוץ רק כדי לדמות הזרמת נתונים.

חקר נתונים

בוא נוריד ונדמיין את מערך הנתונים, שנמצא בציבור שירות אחסון פשוט של אמזון (Amazon S3) דלי ואתר סטטי:

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

צילום המסך הבא מציג תת-קבוצה של הנתונים לפני השינוי.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

העמודה האחרונה של הנתונים מכילה את היעד שאנו רוצים לחזות, שהוא משתנה בינארי שלוקח ערך כן או לא, המציין אם המשתמש משתתף בתוכנית Bike Share for All.

בואו נסתכל על ההתפלגות של משתנה היעד שלנו עבור כל חוסר איזון בנתונים.

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

אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

כפי שמוצג בגרף לעיל, הנתונים אינם מאוזנים, כאשר פחות אנשים משתתפים בתוכנית.

אנחנו צריכים לאזן את הנתונים כדי למנוע הטיית ייצוג יתר. שלב זה הוא אופציונלי מכיוון שהטייס האוטומטי מציע גם גישה פנימית לטיפול בחוסר איזון בכיתה באופן אוטומטי, אשר כברירת מחדל היא מדד אימות ציון F1. בנוסף, אם תבחר לאזן את הנתונים בעצמך, תוכל להשתמש בטכניקות מתקדמות יותר לטיפול בחוסר איזון כיתתי, כגון עשן or גן.

עבור פוסט זה, אנו מקטינים את מחלקת הרוב (לא) כטכניקת איזון נתונים:

הקוד הבא מעשיר את הנתונים ומדגים פחות את המחלקה המיוצגת יתר על המידה:

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)

השארנו בכוונה את התכונות הקטגוריות שלנו לא מקודדות, כולל ערך היעד הבינארי שלנו. הסיבה לכך היא כי טייס אוטומטי דואג לקידוד ופענוח הנתונים עבורנו כחלק מהנדסת הפיצ'רים האוטומטית ופריסה של צינורות, כפי שנראה בסעיף הבא.

צילום המסך הבא מציג דוגמה מהנתונים שלנו.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

הנתונים בגרפים הבאים נראים נורמליים אחרת, כאשר התפלגות בי-מודאלית מייצגת את שתי השיאים עבור שעות הבוקר ושעות העומס של אחר הצהריים, כפי שהיית מצפה. אנו צופים בפעילות נמוכה גם בסופי שבוע ובלילה.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

בסעיף הבא, אנו מאכילים את הנתונים לטייס אוטומטי כדי שיוכל להריץ עבורנו ניסוי.

בניית מודל סיווג בינארי

הטייס האוטומטי דורש שנציין את דלי יעדי הקלט והפלט. הוא משתמש בדלי הקלט כדי לטעון את הנתונים ובדלי הפלט כדי לשמור את החפצים, כגון הנדסת תכונות ומחברות Jupyter שנוצרו. אנו שומרים 5% ממערך הנתונים כדי להעריך ולאמת את ביצועי המודל לאחר השלמת ההדרכה ולהעלות 95% ממערך הנתונים לדלי הקלט של S3. ראה את הקוד הבא:

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)

לאחר שהעלינו את הנתונים ליעד הקלט, הגיע הזמן להפעיל את הטייס האוטומטי:

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)

כל מה שאנחנו צריכים כדי להתחיל להתנסות הוא לקרוא לשיטת fit() . הטייס האוטומטי צריך את מיקום הקלט והפלט S3 ואת עמודת תכונת היעד כפרמטרים הנדרשים. לאחר עיבוד תכונה, הטייס האוטומטי מתקשר כוונון הדגם האוטומטי של SageMaker כדי למצוא את הגרסה הטובה ביותר של מודל על ידי הפעלת עבודות הדרכה רבות במערך הנתונים שלך. הוספנו את הפרמטר האופציונלי max_candidates כדי להגביל את מספר המועמדים ל-30, שהוא מספר עבודות ההדרכה שהטייס האוטומטי משיק עם שילובים שונים של אלגוריתמים והיפרפרמטרים על מנת למצוא את המודל הטוב ביותר. אם לא תציין פרמטר זה, ברירת המחדל היא 250.

אנו יכולים לצפות בהתקדמות של טייס אוטומטי עם הקוד הבא:

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

ההכשרה לוקחת זמן מה. בזמן שהוא פועל, בואו נסתכל על זרימת העבודה של הטייס האוטומטי.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

כדי למצוא את המועמד הטוב ביותר, השתמש בקוד הבא:

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

צילום המסך הבא מראה את הפלט שלנו.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

המודל שלנו השיג דיוק אימות של 96%, אז אנחנו הולכים לפרוס אותו. נוכל להוסיף תנאי כך שנשתמש במודל רק אם הדיוק הוא מעל רמה מסוימת.

צינור מסקנות

לפני שנפרוס את המודל שלנו, בואו נבחן את המועמד הטוב ביותר שלנו ומה קורה בצנרת שלנו. ראה את הקוד הבא:

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

התרשים הבא מציג את הפלט שלנו.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

הטייס האוטומטי בנה את המודל וארז אותו בשלושה מיכלים שונים, שכל אחד מהם מריץ משימה ספציפית ברצף: טרנספורמציה, חיזוי ושינוי הפוך. הסקה רב-שלבית זו אפשרית עם א צינור מסקנות של SageMaker.

הסקת מסקנות מרובת שלבים יכולה גם לשרשר מודלים מרובים של הסקה. לדוגמה, מיכל אחד יכול לבצע ניתוח רכיבים עיקריים לפני העברת הנתונים למיכל XGBoost.

פרוס את צינור ההסקה לנקודת קצה

תהליך הפריסה כולל רק כמה שורות קוד:

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

בואו נגדיר את נקודת הקצה שלנו לחיזוי עם מנבא:

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 )

כעת, כשיש לנו את נקודת הקצה והמנבא שלנו מוכנים, הגיע הזמן להשתמש בנתוני הבדיקה שהנחנו בצד ולבדוק את הדיוק של המודל שלנו. אנו מתחילים בהגדרת פונקציית עזר ששולחת את הנתונים שורה אחת בכל פעם לנקודת הקצה שלנו ומקבלת תחזית בתמורה. כי יש לנו XGBoost מודל, אנו שומטים את משתנה היעד לפני שליחת שורת ה-CSV לנקודת הקצה. בנוסף, הסרנו את הכותרת מה-CSV הבודק לפני שעברנו לולאה בקובץ, שהיא גם דרישה נוספת עבור XGBoost ב- SageMaker. ראה את הקוד הבא:

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

צילום המסך הבא מראה את הפלט שלנו.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

עכשיו בואו לחשב את הדיוק של המודל שלנו.
אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

ראה את הקוד הבא:

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

אנו מקבלים דיוק של 92%. זה מעט נמוך מ-96% שהתקבל במהלך שלב האימות, אבל זה עדיין מספיק גבוה. אנחנו לא מצפים שהדיוק יהיה זהה לחלוטין מכיוון שהבדיקה מתבצעת עם מערך נתונים חדש.

בליעת נתונים

הורדנו את הנתונים ישירות והגדרנו אותם לאימון. בחיים האמיתיים, ייתכן שיהיה עליך לשלוח את הנתונים ישירות ממכשיר הקצה אל אגם הנתונים ולגרום ל-SageMaker לטעון אותם ישירות מאגם הנתונים למחברת.

Kinesis Data Firehose היא אפשרות טובה והדרך הפשוטה ביותר לטעון באופן אמין נתונים זורמים לתוך אגמי נתונים, מאגרי נתונים וכלי ניתוח. זה יכול ללכוד, להפוך ולטעון נתונים זורמים לתוך Amazon S3 וחנויות נתונים אחרות של AWS.

במקרה השימוש שלנו, אנו יוצרים זרם אספקת Kinesis Data Firehose עם פונקציית טרנספורמציה של Lambda כדי לבצע ניקוי נתונים קל משקל בזמן שהוא חוצה את הזרם. ראה את הקוד הבא:

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

פונקציית Lambda זו מבצעת טרנספורמציה קלה של הנתונים המוזרמים מהמכשירים אל אגם הנתונים. הוא מצפה לקובץ נתונים בפורמט CSV.

עבור שלב ההטמעה, אנו מורידים את הנתונים ומדמים זרם נתונים ל-Kinesis Data Firehose עם פונקציית טרנספורמציה של Lambda ואל אגם הנתונים S3 שלנו.

בואו נדמה זרימה של כמה שורות:

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

לנקות את

חשוב למחוק את כל המשאבים המשמשים בתרגיל זה כדי למזער את העלות. הקוד הבא מוחק את נקודת הסיום של SageMaker שיצרנו וכן את נתוני ההדרכה והבדיקות שהעלינו:

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

סיכום

מהנדסי ML, מדעני נתונים ומפתחי תוכנה יכולים להשתמש בטייס אוטומטי כדי לבנות ולפרוס צינור מסקנות עם מעט ניסיון בתכנות ML. טייס אוטומטי חוסך זמן ומשאבים, תוך שימוש במדעי הנתונים ושיטות העבודה המומלצות של ML. ארגונים גדולים יכולים כעת להעביר משאבים הנדסיים הרחק מתצורת תשתית לשיפור מודלים ופתרון מקרי שימוש עסקיים. סטארט-אפים וארגונים קטנים יותר יכולים להתחיל עם למידת מכונה עם מומחיות מועטה עד ללא מומחיות ב-ML.

כדי להתחיל עם טייס אוטומטי של SageMaker, ראה את דף מוצר או גש ל-SageMaker Autopilot בתוך SageMaker Studio.

אנו ממליצים גם ללמוד עוד על תכונות חשובות אחרות שיש ל-SageMaker להציע, כגון חנות הפונקציות של אמזון SageMaker, המשתלב עם צינורות SageMaker של אמזון כדי ליצור, להוסיף חיפוש וגילוי תכונות ולהשתמש מחדש בזרימות עבודה אוטומטיות של ML. אתה יכול להריץ סימולציות של טייס אוטומטי מרובות עם גרסאות שונות של תכונה או יעד במערך הנתונים שלך. אתה יכול גם להתייחס לזה כבעיית הקצאת רכב דינמית שבה הדגם שלך מנסה לחזות את הביקוש לרכב על סמך זמן (כגון שעה ביום או יום בשבוע) או מיקום, או שילוב של שניהם.


על הכותבים

אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.דאג מבאיה הוא ארכיטקט פתרונות בכיר עם התמקדות בנתונים וניתוחים. דאג עובד בשיתוף פעולה הדוק עם שותפי AWS, ועוזר להם לשלב פתרונות נתונים וניתוח בענן. הניסיון הקודם של דאג כולל תמיכה בלקוחות AWS בגזרת שיתוף הנסיעות ומשלוחי מזון.

אוטומציה של מודל סיווג אופניים וקטנועים משותפים עם Amazon SageMaker Autopilot PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.ולריו פרונה הוא מנהל מדע יישומי שעובד על אמזון SageMaker כוונון דגמים אוטומטי וטייס אוטומטי.

בול זמן:

עוד מ למידת מכונות AWS