ביצוע הנדסת פיצ'רים באמצעות פסוקית ה-TRANSFORM

במדריך הזה נלמד איך להשתמש במשפט TRANSFORM של ההצהרה CREATE MODEL כדי לבצע הנדסת פיצ'רים (feature engineering) בזמן שיוצרים ומאמנים מודל. בעזרת המשפט TRANSFORM, אתם יכולים לציין פונקציה אחת או יותר של עיבוד מקדים כדי לשנות את נתוני הקלט שמשמשים לאימון המודל. העיבוד המקדים שאתם מחילים על המודל מוחל באופן אוטומטי כשאתם משתמשים במודל עם הפונקציות ML.EVALUATE ו-ML.PREDICT.

במדריך הזה משתמשים במערך הנתונים הציבורי bigquery-public-data.ml_datasets.penguin.

מטרות

במדריך הזה מוסבר איך לבצע את הפעולות הבאות:

  • יצירת מודל רגרסיה לינארית כדי לחזות את סוג קריאת השירות באמצעות ההצהרה CREATE MODEL. בתוך ההצהרה CREATE MODEL, משתמשים בפונקציות ML.QUANTILE_BUCKETIZE ו-ML.FEATURE_CROSS כדי לעבד מראש את הנתונים.
  • הערכת המודל באמצעות הפונקציה ML.EVALUATE.
  • קבלת חיזויים מהמודל באמצעות הפונקציה ML.PREDICT.

עלויות

במדריך הזה משתמשים ברכיבים של Google Cloud, והשימוש בהם כרוך בתשלום, כולל:

  • BigQuery
  • BigQuery ML

למידע נוסף על העלויות של BigQuery, קראו את הדף תמחור ב-BigQuery.

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

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  2. Verify that billing is enabled for your Google Cloud project.

  3. ‫BigQuery מופעל באופן אוטומטי בפרויקטים חדשים. כדי להפעיל את BigQuery בפרויקט קיים, עוברים אל

    מפעילים את BigQuery API, אם הוא עדיין לא מופעל.

    התפקידים שנדרשים כדי להפעיל ממשקי API

    כדי להפעיל ממשקי API, צריך את ההרשאה serviceusage.services.enable. אם אתם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד "בעלים" (roles/owner). אחרת, אתם יכולים לקבל את ההרשאה הזו דרך התפקיד "אדמין בממשק 'שימוש בשירות'" (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים?

    להפעלת ה-API

יצירת קבוצת נתונים

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

המסוף

  1. נכנסים לדף BigQuery במסוף Google Cloud .

    כניסה ל-BigQuery

  2. בחלונית הימנית, לוחצים על Explorer:

    כפתור מודגש לחלונית Explorer.

    אם החלונית הימנית לא מוצגת, לוחצים על Expand left pane כדי לפתוח אותה.

  3. ב-Explorer, מרחיבים את הפרויקט ולוחצים על Datasets.

  4. בדף Datasets, לוחצים על Create dataset.

  5. בחלונית Create dataset:

    • בשדה Dataset ID, מזינים bqml_tutorial.

    • בקטע Data location (מיקום הנתונים), בוחרים באפשרות US (ארה"ב).

    משאירים את שאר הגדרות ברירת המחדל כמו שהן.

  6. לוחצים על Create dataset.

BQ

כדי ליצור קבוצת נתונים חדשה, משתמשים בפקודה bq mk --dataset.

  1. יוצרים מערך נתונים בשם bqml_tutorial ומגדירים את מיקום הנתונים ל-US:

    bq mk --dataset \
      --location=US \
      --description "BigQuery ML tutorial dataset." \
      bqml_tutorial
  2. מוודאים שמערך הנתונים נוצר:

    bq ls

API

מפעילים את השיטה datasets.insert עם משאב של מערך נתונים מוגדר:

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

יצירת המודל

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

הסעיף OPTIONS(model_type='linear_reg', input_label_cols=['body_mass_g']) מציין שאתם יוצרים מודל רגרסיה ליניארית. מודל רגרסיה לינארית יוצר ערך רציף משילוב לינארי של מאפייני קלט. העמודה body_mass_g היא עמודת תווית הקלט. במודלים של רגרסיה לינארית, עמודת התווית חייבת להיות בעלת ערך ממשי (כלומר, ערכי העמודה חייבים להיות מספרים ממשיים).

הסעיף TRANSFORM בשאילתה הזו משתמש בעמודות הבאות מההצהרה SELECT:

  • ‫body_mass_g: משמש לאימון ללא שינוי.
  • ‫culmen_depth_mm: משמש לאימון ללא שינוי.
  • ‫flipper_length_mm: משמש לאימון ללא שינוי.
  • ‫bucketized_culmen_length: נוצר מ-culmen_length_mm על ידי חלוקה של culmen_length_mm לקטגוריות על סמך אחוזונים באמצעות הפונקציה האנליטית ML.QUANTILE_BUCKETIZE().
  • ‫culmen_length_mm: הערך המקורי של culmen_length_mm, שהומר לערך STRING ושימש באימון.
  • ‫species_sex: נוצר מהצלבה של species ו-sex באמצעות הפונקציה ML.FEATURE_CROSS.

לא צריך להשתמש בכל העמודות מטבלת האימון בסעיף TRANSFORM.

הסעיף WHERE – WHERE body_mass_g IS NOT NULL AND RAND() < 0.2 – מחריג שורות שבהן משקל הפינגווינים הוא NULL, ומשתמש בפונקציה RAND כדי ליצור מדגם אקראי של הנתונים.

כדי ליצור את המודל:

  1. נכנסים לדף BigQuery במסוף Google Cloud .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    CREATE OR REPLACE MODEL `bqml_tutorial.penguin_transform`
      TRANSFORM(
        body_mass_g,
        culmen_depth_mm,
        flipper_length_mm,
        ML.QUANTILE_BUCKETIZE(culmen_length_mm, 10) OVER () AS bucketized_culmen_length,
        CAST(culmen_length_mm AS string) AS culmen_length_mm,
        ML.FEATURE_CROSS(STRUCT(species, sex)) AS species_sex)
      OPTIONS (
        model_type = 'linear_reg',
        input_label_cols = ['body_mass_g'])
    AS
    SELECT
      *
    FROM
      `bigquery-public-data.ml_datasets.penguins`
    WHERE
      body_mass_g IS NOT NULL
      AND RAND() < 0.2;

    השאילתה מסתיימת תוך כ-15 דקות, ואז המודל penguin_transform מופיע בחלונית Explorer. מכיוון שהשאילתה משתמשת בהצהרת CREATE MODEL כדי ליצור מודל, לא מוצגות תוצאות שאילתה.

הערכת המודל

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

ההצהרה SELECT והסעיף FROM שמוטמעים בשאילתה הזו זהים לאלה שבשאילתה CREATE MODEL. מכיוון שהשתמשתם בסעיף TRANSFORM כשאתם יוצרים את המודל, אתם לא צריכים לציין שוב את העמודות והטרנספורמציות בפונקציה ML.EVALUATE. הפונקציה מאחזרת אותם באופן אוטומטי מהמודל.

כדי להעריך את המודל:

  1. נכנסים לדף BigQuery במסוף Google Cloud .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    SELECT
      *
    FROM
      ML.EVALUATE(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            body_mass_g IS NOT NULL
        ));

    התוצאות אמורות להיראות כך:

    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    | mean_absolute_error | mean_squared_error | mean_squared_log_error | median_absolute_error |      r2_score      | explained_variance |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    |   64.21134350607677 | 13016.433317859564 |   7.140935762696211E-4 |     15.31788461553515 | 0.9813042531507734 | 0.9813186268757634 |
    +---------------------+--------------------+------------------------+-----------------------+--------------------+--------------------+
    

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

    למידע נוסף על הפלט של הפונקציה ML.EVALUATE, קראו את המאמר פלט.

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

שימוש במודל כדי לחזות את משקל הפינגווין

משתמשים במודל עם הפונקציה ML.PREDICT כדי לחזות את המשקל של פינגווינים זכרים.

הפונקציה ML.PREDICT מפיקה את הערך החזוי בעמודה predicted_label_column_name, במקרה הזה predicted_body_mass_g.

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

כדי לקבל חיזויים מהמודל, פועלים לפי השלבים הבאים:

  1. נכנסים לדף BigQuery במסוף Google Cloud .

    כניסה ל-BigQuery

  2. בעורך השאילתות, מדביקים את השאילתה הבאה ולוחצים על Run:

    SELECT
      predicted_body_mass_g
    FROM
      ML.PREDICT(
        MODEL `bqml_tutorial.penguin_transform`,
        (
          SELECT
            *
          FROM
            `bigquery-public-data.ml_datasets.penguins`
          WHERE
            sex = 'MALE'
        ));

    התוצאות אמורות להיראות כך:

    +-----------------------+
    | predicted_body_mass_g |
    +-----------------------+
    |    2810.2868541725757 |
    +-----------------------+
    |    3813.6574220842676 |
    +-----------------------+
    |     4098.844698262214 |
    +-----------------------+
    |     4256.587135004173 |
    +-----------------------+
    |     3008.393497302691 |
    +-----------------------+
    |     ...               |
    +-----------------------+
    

הסרת המשאבים

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

  • אתם יכולים למחוק את הפרויקט שיצרתם.
  • אפשר גם להשאיר את הפרויקט ולמחוק את מערך הנתונים.

מחיקת מערך הנתונים

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

  1. אם צריך, פותחים את הדף של BigQuery במסוףGoogle Cloud .

    כניסה לדף BigQuery

  2. בחלונית הניווט, לוחצים על מערך הנתונים bqml_tutorial שיצרתם.

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

  4. בתיבת הדו-שיח Delete dataset, מאשרים את פקודת המחיקה על ידי הקלדת שם מערך הנתונים (bqml_tutorial) ולוחצים על Delete.

מחיקת הפרויקט

כדי למחוק את הפרויקט:

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

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