אימון מודל חיזוי

בדף הזה מוסבר איך לאמן מודל לחיזוי מתוך מערך נתונים טבלאי באמצעות Google Cloud המסוף או Agent Platform API.

לפני שמתחילים

לפני שמאמנים מודל לחיזוי, צריך לבצע את הפעולות הבאות:

אימון מודל

מסוף Google Cloud

  1. במסוף Google Cloud , בקטע Agent Platform, עוברים לדף Datasets.

    כניסה לדף Datasets

  2. לוחצים על שם מערך הנתונים שבו רוצים להשתמש כדי לאמן את המודל, כדי לפתוח את דף הפרטים שלו.

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

  4. לוחצים על Train new model (אימון מודל חדש).

  5. בוחרים באפשרות אחר.

  6. בדף Training method, קובעים את ההגדרות הבאות:

    1. בוחרים את שיטת אימון המודל. מידע נוסף זמין במאמר בנושא שיטות לאימון מודלים.

    2. לוחצים על Continue.

  7. בדף פרטי המודל, מגדירים את האפשרויות הבאות:

    1. מזינים את שם התצוגה של המודל החדש.

    2. בוחרים את עמודת היעד.

      עמודת היעד היא הערך שהמודל יחזה. מידע נוסף על הדרישות לגבי עמודת היעד

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

    4. בוחרים את רמת הפירוט של הנתונים. בוחרים באפשרות Daily אם רוצים להשתמש במודלים של אפקטים של חגים. איך בוחרים את רמת הפירוט של הנתונים

    5. אופציונלי: בתפריט הנפתח Holiday regions, בוחרים אזור גיאוגרפי אחד או יותר כדי להפעיל מודלים של השפעות חגים. במהלך האימון, Agent Platform יוצר תכונות קטגוריות של חגים במודל על סמך התאריך מהעמודה Timestamp והאזורים הגיאוגרפיים שצוינו. אפשר לבחור באפשרות הזו רק אם רמת הפירוט של הנתונים מוגדרת לערך Daily. כברירת מחדל, בניית מודלים של השפעות של חגים מושבתת. מידע על האזורים הגיאוגרפיים שמשמשים למודלים של אפקטים של חגים זמין במאמר אזורים של חגים.

    6. מזינים את חלון ההקשר ואת האופק של התחזית.

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

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

      מידע נוסף

    7. אם רוצים לייצא את מערך נתוני הבדיקה ל-BigQuery, מסמנים את האפשרות ייצוא מערך נתוני הבדיקה ל-BigQuery ומזינים את שם הטבלה.

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

    9. פיצול הנתונים שמוגדר כברירת מחדל הוא כרונולוגי, עם האחוזים הרגילים של 80/10/10. אם רוצים לציין באופן ידני לאיזה פיצול מוקצות השורות, בוחרים באפשרות ידני ומציינים את העמודה של פיצול הנתונים.

      מידע נוסף על פיצול נתונים

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

      • Count (מספר): מגדירים את הערך של המספר המקסימלי של חלונות בתיבת הטקסט שמופיעה.
      • Stride (צעד): מגדירים את הערך של אורך פסיעה בתיבת הטקסט שמופיעה.
      • עמודה: בוחרים את שם העמודה המתאים מהתפריט הנפתח.

      מידע נוסף על שיטות בידינג עם חלון זמן מתגלגל

    11. לוחצים על Continue.

  8. בדף Training options, מגדירים את האפשרויות הבאות:

    1. אם עדיין לא עשיתם זאת, לוחצים על יצירת נתונים סטטיסטיים.

      כשמייצרים נתונים סטטיסטיים, התפריטים הנפתחים שינוי מתמלאים.

    2. בודקים את רשימת העמודות ומוציאים מהאימון עמודות שלא אמורות לשמש לאימון המודל.

      אם משתמשים בעמודה לפיצול נתונים, צריך לכלול אותה.

    3. בודקים את השינויים שנבחרו לתכונות הכלולות ומבצעים את העדכונים הנדרשים.

      שורות שמכילות נתונים לא תקינים עבור השינוי שנבחר לא נכללות באימון. מידע נוסף על שינויים

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

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

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

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

    8. אופציונלי. כדי להשתמש בתחזית היררכית, בוחרים באפשרות הפעלת תחזית היררכית. אפשר לבחור מבין שלוש אפשרויות קיבוץ:

      • No grouping
      • Group by columns
      • Group all

      אפשר גם להגדיר את משקלי ההפסד המצטברים הבאים:

      • Group total weight. אפשר להגדיר את השדה הזה רק אם בוחרים באפשרות Group by columns או באפשרות Group all.
      • Temporal total weight.
      • Group temporal total weight. אפשר להגדיר את השדה הזה רק אם בוחרים באפשרות Group by columns או באפשרות Group all.

      מידע נוסף על חיזוי היררכי

    9. לוחצים על Continue.

  9. בדף Compute and pricing, מגדירים את האפשרויות הבאות:

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

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

      Rows תכונות אופק התחזית זמן האימון
      ‫12 מיליון 10 6 3 עד 6 שעות
      20 מיליון 50 13 6 עד 12 שעות
      ‫16 מיליון 30 365 ‫24-48 שעות

      למידע על תמחור של אימון מודלים, אפשר לעיין בדף התמחור.

    2. לוחצים על התחלת ההדרכה.

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

API

בוחרים כרטיסייה לפי השפה או הסביבה:

REST

משתמשים בפקודה trainingPipelines.create כדי לאמן מודל.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • LOCATION: האזור שלכם.
  • PROJECT: מזהה הפרויקט.
  • TRAINING_PIPELINE_DISPLAY_NAME: השם המוצג של צינור העיבוד לאימון שנוצר עבור הפעולה הזו.
  • TRAINING_TASK_DEFINITION: שיטת האימון של המודל.
    • Time series Dense Encoder (TiDE)
      gs://google-cloud-aiplatform/schema/trainingjob/definition/time_series_dense_encoder_forecasting_1.0.0.yaml
    • ‫Temporal Fusion Transformer (TFT)
      gs://google-cloud-aiplatform/schema/trainingjob/definition/temporal_fusion_transformer_time_series_forecasting_1.0.0.yaml
    • ‫AutoML (L2L)
      gs://google-cloud-aiplatform/schema/trainingjob/definition/automl_forecasting_1.0.0.yaml
    • Seq2Seq+
      gs://google-cloud-aiplatform/schema/trainingjob/definition/seq2seq_plus_time_series_forecasting_1.0.0.yaml
    מידע נוסף זמין במאמר שיטות לאימון מודלים.
  • TARGET_COLUMN: העמודה (הערך) שהמודל הזה אמור לחזות.
  • TIME_COLUMN: עמודת השעה. מידע נוסף
  • TIME_SERIES_IDENTIFIER_COLUMN: העמודה של מזהה סדרת הזמן. מידע נוסף
  • WEIGHT_COLUMN: (אופציונלי) עמודת המשקל. מידע נוסף
  • TRAINING_BUDGET: משך הזמן המקסימלי שרוצים שהמודל יתאמן, במילי-שעות שימוש בצומת (1,000 מילי-שעות שימוש בצומת שוות לשעת שימוש בצומת אחת).
  • GRANULARITY_UNIT: היחידה שבה משתמשים לגרעיניות של נתוני האימון, לאופק התחזית ולחלון ההקשר. הערך יכול להיות minute, hour, day, week, month או year. בוחרים באפשרות day אם רוצים להשתמש במודלים של השפעות חגים. איך בוחרים את רמת הפירוט של הנתונים
  • GRANULARITY_QUANTITY: מספר היחידות של רמת הפירוט שמרכיבות את המרווח בין התצפיות בנתוני האימון. הערך חייב להיות 1 לכל היחידות, חוץ מדקות, שבהן הערך יכול להיות 1, 5, 10, 15 או 30. איך בוחרים את רמת הפירוט של הנתונים
  • GROUP_COLUMNS: שמות העמודות בטבלת נתוני האימון שמזהות את הקיבוץ ברמת ההיררכיה. העמודות צריכות להיות `time_series_attribute_columns`. מידע נוסף
  • GROUP_TOTAL_WEIGHT: המשקל של ההפסד המצטבר של הקבוצה ביחס להפסד האישי. התכונה מושבתת אם המדיניות מוגדרת לערך 0.0 או לא מוגדרת. אם לא מוגדרת עמודת קבוצה, כל סדרות הזמן ייחשבו כחלק מאותה קבוצה ויצטברו על פני כל סדרות הזמן. מידע נוסף
  • TEMPORAL_TOTAL_WEIGHT: המשקל של ההפסד המצטבר לאורך זמן ביחס להפסד האישי. התכונה מושבתת אם המדיניות מוגדרת לערך 0.0 או לא מוגדרת. מידע נוסף
  • GROUP_TEMPORAL_TOTAL_WEIGHT: משקל ההפסד הכולל (קבוצה x זמן) המצטבר ביחס להפסד האישי. התכונה מושבתת אם המדיניות מוגדרת לערך 0.0 או לא מוגדרת. אם עמודת הקבוצה לא מוגדרת, כל סדרות הזמן יטופלו כחלק מאותה קבוצה ויצטברו על פני כל סדרות הזמן. מידע נוסף
  • HOLIDAY_REGIONS: (אופציונלי) אתם יכולים לבחור אזור גיאוגרפי אחד או יותר כדי להפעיל מודלים של השפעות חגים. במהלך האימון, Agent Platform יוצר תכונות קטגוריות של חגים במודל על סמך התאריך מ-TIME_COLUMN והאזורים הגיאוגרפיים שצוינו. כדי להפעיל אותו, מגדירים את GRANULARITY_UNIT ל-day ומציינים אזור אחד או יותר בשדה HOLIDAY_REGIONS. כברירת מחדל, בניית מודלים של השפעות של חגים מושבתת. מידע נוסף זמין במאמר בנושא אזורים גיאוגרפיים לחגים.
  • FORECAST_HORIZON: אופק התחזית קובע עד כמה רחוק בעתיד המודל חוזה את ערך היעד לכל שורה של נתוני הסקה. אופק התחזית מצוין ביחידות של רמת הפירוט של הנתונים (GRANULARITY_UNIT). מידע נוסף
  • CONTEXT_WINDOW: חלון ההקשר קובע כמה זמן אחורה המודל בודק במהלך האימון (ובתחזיות). במילים אחרות, לגבי כל נקודת נתונים לאימון, חלון ההקשר קובע עד כמה המודל יחזור אחורה כדי לחפש דפוסים לחיזוי. חלון ההקשר מצוין ביחידות של רמת פירוט הנתונים (GRANULARITY_UNIT). מידע נוסף
  • OPTIMIZATION_OBJECTIVE: כברירת מחדל, Agent Platform ממזער את שורש הטעות הריבועית הממוצעת (RMSE). אם רוצים להגדיר יעד אופטימיזציה אחר למודל התחזית, צריך לבחור אחת מהאפשרויות שמופיעות בקטע יעדי אופטימיזציה למודלים של תחזיות. אם בוחרים למזער את הפסד הכמותון, צריך גם לציין ערך ל-QUANTILES.
  • PROBABILISTIC_INFERENCE: (אופציונלי) אם הערך מוגדר כ-true, המודלים של Agent Platform מחשבים את התפלגות ההסתברות של התחזית. הסקת מסקנות הסתברותית יכולה לשפר את איכות המודל על ידי טיפול בנתונים רועשים וכימות של אי הוודאות. אם מציינים את הערכים QUANTILES, פלטפורמת Agent מחזירה גם את הכמויות של התפלגות ההסתברות. הסקת מסקנות הסתברותית תואמת רק לשיטות האימון Time series Dense Encoder (TiDE) ו-AutoML (L2L). היא לא תואמת לחיזוי היררכי וליעד האופטימיזציה minimize-quantile-loss.
  • QUANTILES: קוונטילים לשימוש באופטימיזציה של minimize-quantile-loss ובהסקת מסקנות הסתברותית. מזינים רשימה של עד חמישה מספרים ייחודיים בין 0 ל-1, לא כולל.
  • TIME_SERIES_ATTRIBUTE_COL: השם או השמות של העמודות שהן מאפיינים של סדרות זמן. מידע נוסף
  • AVAILABLE_AT_FORECAST_COL: השם או השמות של עמודות המשתנים המסבירים שהערך שלהם ידוע בזמן התחזית. מידע נוסף
  • UNAVAILABLE_AT_FORECAST_COL: השם או השמות של עמודות המשתנים המסבירים שהערך שלהם לא ידוע בזמן התחזית. מידע נוסף
  • TRANSFORMATION_TYPE: סוג הטרנספורמציה מופיע בכל עמודה שמשמשת לאימון המודל. מידע נוסף
  • COLUMN_NAME: שם העמודה עם סוג השינוי שצוין. צריך לציין כל עמודה שמשמשת לאימון המודל.
  • MODEL_DISPLAY_NAME: השם המוצג של המודל החדש שאומן.
  • DATASET_ID: מזהה של מערך הנתונים לאימון.
  • אתם יכולים לספק אובייקט Split כדי לשלוט בפיצול הנתונים. מידע על שליטה בפילוח הנתונים זמין במאמר שליטה בפילוח הנתונים באמצעות REST.
  • אפשר לספק אובייקט windowConfig כדי להגדיר שיטת חלון נע ליצירת חלון תחזית. מידע נוסף זמין במאמר בנושא הגדרת שיטת חלון נע באמצעות REST.
  • PROJECT_NUMBER: מספר הפרויקט שנוצר באופן אוטומטי

ה-method של ה-HTTP וכתובת ה-URL:

POST https://LOCATION-aiplatform.googleapis.com/v1/projects/PROJECT/locations/LOCATION/trainingPipelines

תוכן בקשת JSON:

{
    "displayName": "TRAINING_PIPELINE_DISPLAY_NAME",
    "trainingTaskDefinition": "TRAINING_TASK_DEFINITION",
    "trainingTaskInputs": {
        "targetColumn": "TARGET_COLUMN",
        "timeColumn": "TIME_COLUMN",
        "timeSeriesIdentifierColumn": "TIME_SERIES_IDENTIFIER_COLUMN",
        "weightColumn": "WEIGHT_COLUMN",
        "trainBudgetMilliNodeHours": TRAINING_BUDGET,
        "dataGranularity": {"unit": "GRANULARITY_UNIT", "quantity": GRANULARITY_QUANTITY},
        "hierarchyConfig": {"groupColumns": GROUP_COLUMNS, "groupTotalWeight": GROUP_TOTAL_WEIGHT, "temporalTotalWeight": TEMPORAL_TOTAL_WEIGHT, "groupTemporalTotalWeight": GROUP_TEMPORAL_TOTAL_WEIGHT}
        "holidayRegions" : ["HOLIDAY_REGIONS_1", "HOLIDAY_REGIONS_2", ...]
        "forecast_horizon": FORECAST_HORIZON,
        "context_window": CONTEXT_WINDOW,
        "optimizationObjective": "OPTIMIZATION_OBJECTIVE",
        "quantiles": "QUANTILES",
        "enableProbabilisticInference": "PROBABILISTIC_INFERENCE",
        "time_series_attribute_columns": ["TIME_SERIES_ATTRIBUTE_COL_1", "TIME_SERIES_ATTRIBUTE_COL_2", ...]
        "available_at_forecast_columns": ["AVAILABLE_AT_FORECAST_COL_1", "AVAILABLE_AT_FORECAST_COL_2", ...]
        "unavailable_at_forecast_columns": ["UNAVAILABLE_AT_FORECAST_COL_1", "UNAVAILABLE_AT_FORECAST_COL_2", ...]
        "transformations": [
            {"TRANSFORMATION_TYPE_1":  {"column_name" : "COLUMN_NAME_1"} },
            {"TRANSFORMATION_TYPE_2":  {"column_name" : "COLUMN_NAME_2"} },
            ...
    },
    "modelToUpload": {"displayName": "MODEL_DISPLAY_NAME"},
    "inputDataConfig": {
      "datasetId": "DATASET_ID",
    }
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אתם אמורים לקבל תגובת JSON שדומה לזו:

{
  "name": "projects/PROJECT_NUMBER/locations/LOCATION/trainingPipelines/TRAINING_PIPELINE_ID",
  "displayName": "myModelName",
  "trainingTaskDefinition": "gs://google-cloud-aiplatform/schema/trainingjob/definition/automl_tabular_1.0.0.yaml",
  "modelToUpload": {
    "displayName": "myModelName"
  },
  "state": "PIPELINE_STATE_PENDING",
  "createTime": "2020-08-18T01:22:57.479336Z",
  "updateTime": "2020-08-18T01:22:57.479336Z"
}

Python

במאמר התקנת Vertex AI SDK ל-Python מוסבר איך להתקין או לעדכן את Vertex AI SDK ל-Python. מידע נוסף מופיע ב מאמרי העזרה של Python API.

def create_training_pipeline_forecasting_time_series_dense_encoder_sample(
    project: str,
    display_name: str,
    dataset_id: str,
    location: str = "us-central1",
    model_display_name: str = "my_model",
    target_column: str = "target_column",
    time_column: str = "date",
    time_series_identifier_column: str = "time_series_id",
    unavailable_at_forecast_columns: List[str] = [],
    available_at_forecast_columns: List[str] = [],
    forecast_horizon: int = 1,
    data_granularity_unit: str = "week",
    data_granularity_count: int = 1,
    training_fraction_split: float = 0.8,
    validation_fraction_split: float = 0.1,
    test_fraction_split: float = 0.1,
    budget_milli_node_hours: int = 8000,
    timestamp_split_column_name: str = "timestamp_split",
    weight_column: str = "weight",
    time_series_attribute_columns: List[str] = [],
    context_window: int = 0,
    export_evaluated_data_items: bool = False,
    export_evaluated_data_items_bigquery_destination_uri: Optional[str] = None,
    export_evaluated_data_items_override_destination: bool = False,
    quantiles: Optional[List[float]] = None,
    enable_probabilistic_inference: bool = False,
    validation_options: Optional[str] = None,
    predefined_split_column_name: Optional[str] = None,
    sync: bool = True,
):
    aiplatform.init(project=project, location=location)

    # Create training job
    forecasting_tide_job = aiplatform.TimeSeriesDenseEncoderForecastingTrainingJob(
        display_name=display_name,
        optimization_objective="minimize-rmse",
    )

    # Retrieve existing dataset
    dataset = aiplatform.TimeSeriesDataset(dataset_id)

    # Run training job
    model = forecasting_tide_job.run(
        dataset=dataset,
        target_column=target_column,
        time_column=time_column,
        time_series_identifier_column=time_series_identifier_column,
        unavailable_at_forecast_columns=unavailable_at_forecast_columns,
        available_at_forecast_columns=available_at_forecast_columns,
        forecast_horizon=forecast_horizon,
        data_granularity_unit=data_granularity_unit,
        data_granularity_count=data_granularity_count,
        training_fraction_split=training_fraction_split,
        validation_fraction_split=validation_fraction_split,
        test_fraction_split=test_fraction_split,
        predefined_split_column_name=predefined_split_column_name,
        timestamp_split_column_name=timestamp_split_column_name,
        weight_column=weight_column,
        time_series_attribute_columns=time_series_attribute_columns,
        context_window=context_window,
        export_evaluated_data_items=export_evaluated_data_items,
        export_evaluated_data_items_bigquery_destination_uri=export_evaluated_data_items_bigquery_destination_uri,
        export_evaluated_data_items_override_destination=export_evaluated_data_items_override_destination,
        quantiles=quantiles,
        enable_probabilistic_inference=enable_probabilistic_inference,
        validation_options=validation_options,
        budget_milli_node_hours=budget_milli_node_hours,
        model_display_name=model_display_name,
        sync=sync,
    )

    model.wait()

    print(model.display_name)
    print(model.resource_name)
    print(model.uri)
    return model

שליטה בפיצול הנתונים באמצעות REST

אתם קובעים איך נתוני האימון יפוצלו בין קבוצות האימון, האימות והבדיקה. משתמשים בעמודה מפוצלת כדי לציין ידנית את פיצול הנתונים לכל שורה, ומספקים אותם כחלק מאובייקט PredefinedSplit Split ב-inputDataConfig של בקשת ה-JSON.

DATA_SPLIT_COLUMN היא העמודה שמכילה את ערכי פיצול הנתונים (TRAIN, ‏ VALIDATION, ‏ TEST).

"predefinedSplit": {
  "key": DATA_SPLIT_COLUMN
},

מידע נוסף על פיצול נתונים

הגדרה של שיטת חלון מתגלגל באמצעות REST

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

  • כדי להשתמש באפשרות maxCount, מוסיפים את הקוד הבא ל-trainingTaskInputs של בקשת ה-JSON. MAX_COUNT_VALUE מתייחס למספר המקסימלי של חלונות.

      "windowConfig": {
        "maxCount": MAX_COUNT_VALUE
      },
      ```
    
  • כדי להשתמש באפשרות strideLength, מוסיפים את הקוד הבא ל-trainingTaskInputs של בקשת ה-JSON. STRIDE_LENGTH_VALUE מייצג את הערך של אורך פסיעה.

      "windowConfig": {
        "strideLength": STRIDE_LENGTH_VALUE
      },
      ```
    
  • כדי להשתמש באפשרות column, מוסיפים את הקוד הבא ל-trainingTaskInputs של בקשת ה-JSON. COLUMN_NAME מתייחס לשם העמודה עם הערכים True או False.

      "windowConfig": {
        "column": "COLUMN_NAME"
      },
      ```
    

מידע נוסף על שיטות בידינג עם חלון זמן מתגלגל

המאמרים הבאים