استخدام الميزات لتدريب النماذج

توضح هذه المقالة كيفية تدريب النماذج باستخدام هندسة الميزات في كتالوج Unity أو مخزن ميزات مساحة العمل المحلي. يجب أولا إنشاء مجموعة بيانات تدريب، والتي تحدد الميزات التي يجب استخدامها وكيفية الانضمام إليها. بعد ذلك، عند تدريب نموذج، يحتفظ النموذج بالمراجع إلى الميزات.

عند تدريب نموذج باستخدام هندسة الميزات في كتالوج Unity، يمكنك عرض دورة حياة النموذج في مستكشف الكتالوج. يتم تعقب الجداول والوظائف التي تم استخدامها لإنشاء النموذج وعرضها تلقائيا. راجع عرض دورة حياة مخزن الميزات.

عند استخدام النموذج للاستدلال، يمكنك اختيار استرداد قيم الميزات من مخزن الميزات. يمكنك أيضا خدمة النموذج مع خدمة النموذج وسيبحث تلقائيا عن الميزات المنشورة على المتاجر عبر الإنترنت. تتوافق نماذج مخزن الميزات أيضا مع واجهة MLflow pyfunc، بحيث يمكنك استخدام MLflow لإجراء استدلال دفعي مع جداول الميزات.

إذا كان النموذج الخاص بك يستخدم متغيرات البيئة، فتعرف على المزيد حول كيفية استخدامها عند تقديم النموذج عبر الإنترنت في تكوين الوصول إلى الموارد من نقاط نهاية خدمة النموذج.

يمكن استخدام النموذج على الأكثر 50 جدولا و100 وظيفة للتدريب.

إنشاء مجموعة بيانات للتدريب

لتحديد ميزات محددة من جدول ميزات لتدريب النموذج، يمكنك إنشاء مجموعة بيانات تدريب باستخدام FeatureEngineeringClient.create_training_set واجهة برمجة التطبيقات (لهندسة الميزات في كتالوج Unity) أو FeatureStoreClient.create_training_set (لمخزن ميزات مساحة العمل) وعنصر يسمى FeatureLookup. FeatureLookup يحدد كل ميزة لاستخدامها في مجموعة التدريب، بما في ذلك اسم جدول الميزات واسم (أسماء) الميزات والمفتاح (المفاتيح) المراد استخدامها عند الانضمام إلى جدول الميزة مع DataFrame الذي تم تمريره إلى create_training_set. راجع البحث عن الميزات للحصول على مزيد من المعلومات.

استخدم المعلمة feature_names عند إنشاء FeatureLookup. feature_names يأخذ اسم ميزة واحدة أو قائمة بأسماء الميزات أو بلا للبحث عن جميع الميزات (باستثناء المفاتيح الأساسية) في جدول الميزات في وقت إنشاء مجموعة التدريب.

إشعار

يجب أن يتطابق نوع الأعمدة lookup_key وترتيبها في DataFrame مع نوع المفاتيح الأساسية وترتيبها (باستثناء مفاتيح الطابع الزمني) لجدول الميزات المرجعية.

تتضمن هذه المقالة أمثلة التعليمات البرمجية لكلا إصداري بناء الجملة.

في هذا المثال، يحتوي DataFrame الذي تم إرجاعه بواسطة trainingSet.load_df على عمود لكل ميزة في feature_lookups. يحافظ على جميع أعمدة DataFrame المقدمة إلى create_training_set باستثناء تلك التي تم استبعادها باستخدام exclude_columns.

هندسة الميزات في كتالوج unity

from databricks.feature_engineering import FeatureEngineeringClient, FeatureLookup

# The model training uses two features from the 'customer_features' feature table and
# a single feature from 'product_features'
feature_lookups = [
    FeatureLookup(
      table_name='ml.recommender_system.customer_features',
      feature_names=['total_purchases_30d', 'total_purchases_7d'],
      lookup_key='customer_id'
    ),
    FeatureLookup(
      table_name='ml.recommender_system.product_features',
      feature_names=['category'],
      lookup_key='product_id'
    )
  ]

fe = FeatureEngineeringClient()

# Create a training set using training DataFrame and features from Feature Store
# The training DataFrame must contain all lookup keys from the set of feature lookups,
# in this case 'customer_id' and 'product_id'. It must also contain all labels used
# for training, in this case 'rating'.
training_set = fe.create_training_set(
  df=training_df,
  feature_lookups=feature_lookups,
  label='rating',
  exclude_columns=['customer_id', 'product_id']
)

training_df = training_set.load_df()

مخزن ميزات مساحة العمل

from databricks.feature_store import FeatureLookup, FeatureStoreClient

# The model training uses two features from the 'customer_features' feature table and
# a single feature from 'product_features'
feature_lookups = [
    FeatureLookup(
      table_name='recommender_system.customer_features',
      feature_names=['total_purchases_30d', 'total_purchases_7d'],
      lookup_key='customer_id'
    ),
    FeatureLookup(
      table_name='recommender_system.product_features',
      feature_names=['category'],
      lookup_key='product_id'
    )
  ]

fs = FeatureStoreClient()

# Create a training set using training DataFrame and features from Feature Store
# The training DataFrame must contain all lookup keys from the set of feature lookups,
# in this case 'customer_id' and 'product_id'. It must also contain all labels used
# for training, in this case 'rating'.
training_set = fs.create_training_set(
  df=training_df,
  feature_lookups=feature_lookups,
  label='rating',
  exclude_columns=['customer_id', 'product_id']
)

training_df = training_set.load_df()

إنشاء TrainingSet عندما لا تتطابق مفاتيح البحث مع المفاتيح الأساسية

استخدم الوسيطة lookup_key في FeatureLookup لاسم العمود في مجموعة التدريب. create_training_set ينفذ صلة مرتبة بين الأعمدة من مجموعة التدريب المحددة في الوسيطة lookup_key باستخدام الترتيب الذي تم تحديد المفاتيح الأساسية به عند إنشاء جدول الميزات.

في هذا المثال، recommender_system.customer_features يحتوي على المفاتيح الأساسية التالية: customer_id، . dt

يحتوي جدول الميزات على recommender_system.product_features مفتاح product_idأساسي .

إذا كان يحتوي على training_df الأعمدة التالية:

  • cid
  • transaction_dt
  • product_id
  • rating

ستقوم التعليمات البرمجية التالية بإنشاء عمليات البحث عن الميزات الصحيحة ل TrainingSet:

هندسة الميزات في كتالوج unity

feature_lookups = [
    FeatureLookup(
      table_name='ml.recommender_system.customer_features',
      feature_names=['total_purchases_30d', 'total_purchases_7d'],
      lookup_key=['cid', 'transaction_dt']
    ),
    FeatureLookup(
      table_name='ml.recommender_system.product_features',
      feature_names=['category'],
      lookup_key='product_id'
    )
  ]

مخزن ميزات مساحة العمل

feature_lookups = [
    FeatureLookup(
      table_name='recommender_system.customer_features',
      feature_names=['total_purchases_30d', 'total_purchases_7d'],
      lookup_key=['cid', 'transaction_dt']
    ),
    FeatureLookup(
      table_name='recommender_system.product_features',
      feature_names=['category'],
      lookup_key='product_id'
    )
  ]

عند create_training_set استدعاء، فإنه ينشئ مجموعة بيانات تدريب عن طريق تنفيذ صلة اليسرى، والانضمام training_df إلى الجداول recommender_system.customer_features واستخدام المفاتيح (customer_id،dt) المقابلة ل (cid،transaction_dt)، كما هو موضح في التعليمات البرمجية التالية:

هندسة الميزات في كتالوج unity

customer_features_df = spark.sql("SELECT * FROM ml.recommender_system.customer_features")
product_features_df = spark.sql("SELECT * FROM ml.recommender_system.product_features")

training_df.join(
  customer_features_df,
  on=[training_df.cid == customer_features_df.customer_id,
      training_df.transaction_dt == customer_features_df.dt],
  how="left"
).join(
  product_features_df,
  on="product_id",
  how="left"
)

مخزن ميزات مساحة العمل

customer_features_df = spark.sql("SELECT * FROM recommender_system.customer_features")
product_features_df = spark.sql("SELECT * FROM recommender_system.product_features")

training_df.join(
  customer_features_df,
  on=[training_df.cid == customer_features_df.customer_id,
      training_df.transaction_dt == customer_features_df.dt],
  how="left"
).join(
  product_features_df,
  on="product_id",
  how="left"
)

إنشاء TrainingSet تحتوي على ميزتين بنفس الاسم من جداول ميزات مختلفة

استخدم الوسيطة output_name الاختيارية FeatureLookupفي . يتم استخدام الاسم المقدم بدلا من اسم الميزة في DataFrame الذي تم إرجاعه بواسطة TrainingSet.load_df. على سبيل المثال، مع التعليمات البرمجية التالية، يتضمن DataFrame الذي تم إرجاعه بواسطة training_set.load_df أعمدة customer_height و product_height.

هندسة الميزات في كتالوج unity

feature_lookups = [
    FeatureLookup(
      table_name='ml.recommender_system.customer_features',
      feature_names=['height'],
      lookup_key='customer_id',
      output_name='customer_height',
    ),
    FeatureLookup(
      table_name='ml.recommender_system.product_features',
      feature_names=['height'],
      lookup_key='product_id',
      output_name='product_height'
    ),
  ]

fe = FeatureEngineeringClient()

with mlflow.start_run():
  training_set = fe.create_training_set(
    df=df,
    feature_lookups=feature_lookups,
    label='rating',
    exclude_columns=['customer_id']
  )
  training_df = training_set.load_df()

مخزن ميزات مساحة العمل

feature_lookups = [
    FeatureLookup(
      table_name='recommender_system.customer_features',
      feature_names=['height'],
      lookup_key='customer_id',
      output_name='customer_height',
    ),
    FeatureLookup(
      table_name='recommender_system.product_features',
      feature_names=['height'],
      lookup_key='product_id',
      output_name='product_height'
    ),
  ]

fs = FeatureStoreClient()

with mlflow.start_run():
  training_set = fs.create_training_set(
    df=df,
    feature_lookups=feature_lookups,
    label='rating',
    exclude_columns=['customer_id']
  )
  training_df = training_set.load_df()

إنشاء TrainingSet باستخدام نفس الميزة عدة مرات

لإنشاء TrainingSet باستخدام نفس الميزة المرتبطة بمفاتيح بحث مختلفة، استخدم FeatureLookups متعددة. استخدم فريدا output_name لكل إخراج FeatureLookup.

هندسة الميزات في كتالوج unity

feature_lookups = [
    FeatureLookup(
      table_name='ml.taxi_data.zip_features',
      feature_names=['temperature'],
      lookup_key=['pickup_zip'],
      output_name='pickup_temp'
    ),
    FeatureLookup(
      table_name='ml.taxi_data.zip_features',
      feature_names=['temperature'],
      lookup_key=['dropoff_zip'],
      output_name='dropoff_temp'
    )
  ]

مخزن ميزات مساحة العمل

feature_lookups = [
    FeatureLookup(
      table_name='taxi_data.zip_features',
      feature_names=['temperature'],
      lookup_key=['pickup_zip'],
      output_name='pickup_temp'
    ),
    FeatureLookup(
      table_name='taxi_data.zip_features',
      feature_names=['temperature'],
      lookup_key=['dropoff_zip'],
      output_name='dropoff_temp'
    )
  ]

إنشاء TrainingSet لنماذج التعلم الآلي غير الخاضعة للإشراف

تعيين label=None عند إنشاء TrainingSet لنماذج التعلم غير الخاضعة للإشراف. على سبيل المثال، يمكن استخدام TrainingSet التالية لدمج عملاء مختلفين في مجموعات بناء على اهتماماتهم:

هندسة الميزات في كتالوج unity

feature_lookups = [
    FeatureLookup(
      table_name='ml.recommender_system.customer_features',
      feature_names=['interests'],
      lookup_key='customer_id',
    ),
  ]

fe = FeatureEngineeringClient()
with mlflow.start_run():
  training_set = fe.create_training_set(
    df=df,
    feature_lookups=feature_lookups,
    label=None,
    exclude_columns=['customer_id']
  )

  training_df = training_set.load_df()

مخزن ميزات مساحة العمل

feature_lookups = [
    FeatureLookup(
      table_name='recommender_system.customer_features',
      feature_names=['interests'],
      lookup_key='customer_id',
    ),
  ]

fs = FeatureStoreClient()
with mlflow.start_run():
  training_set = fs.create_training_set(
    df=df,
    feature_lookups=feature_lookups,
    label=None,
    exclude_columns=['customer_id']
  )

  training_df = training_set.load_df()

تدريب النماذج وتنفيذ الاستدلال الدفعي باستخدام جداول الميزات

عند تدريب نموذج باستخدام ميزات من 'متجر الميزات'، يحتفظ النموذج بالمراجع إلى الميزات. عند استخدام النموذج للاستدلال، يمكنك اختيار استرداد قيم الميزات من 'متجر الميزات'. يجب توفير المفتاح (المفاتيح) الأساسي للميزات المستخدمة في النموذج. يسترد النموذج الميزات التي يتطلبها من Feature Store في مساحة العمل الخاصة بك. ثم ينضم إلى قيم الميزة حسب الحاجة أثناء التسجيل.

لدعم البحث عن الميزة في وقت الاستدلال:

  • يجب تسجيل النموذج باستخدام log_model أسلوب FeatureEngineeringClient (لهندسة الميزات في كتالوج Unity) أو FeatureStoreClient (لمخزن ميزات مساحة العمل).
  • يجب استخدام DataFrame الذي تم إرجاعه من أجل TrainingSet.load_df تدريب النموذج. إذا قمت بتعديل DataFrame هذا بأي طريقة قبل استخدامه لتدريب النموذج، فلن يتم تطبيق التعديلات عند استخدام النموذج للاستدلال. وهذا يقلل من أداء النموذج.
  • يجب أن يكون لنوع النموذج مقابل python_flavor في MLflow. يدعم MLflow معظم أطر تدريب نموذج Python، بما في ذلك:
    • scikit-learn
    • keras
    • PyTorch
    • SparkML
    • LightGBM
    • XGBoost
    • TensorFlow Keras (باستخدام python_flavormlflow.keras)
  • نماذج MLflow pyfunc المخصصة

هندسة الميزات في كتالوج unity

# Train model
import mlflow
from sklearn import linear_model

feature_lookups = [
    FeatureLookup(
      table_name='ml.recommender_system.customer_features',
      feature_names=['total_purchases_30d'],
      lookup_key='customer_id',
    ),
    FeatureLookup(
      table_name='ml.recommender_system.product_features',
      feature_names=['category'],
      lookup_key='product_id'
    )
  ]

fe = FeatureEngineeringClient()

with mlflow.start_run():

  # df has columns ['customer_id', 'product_id', 'rating']
  training_set = fe.create_training_set(
    df=df,
    feature_lookups=feature_lookups,
    label='rating',
    exclude_columns=['customer_id', 'product_id']
  )

  training_df = training_set.load_df().toPandas()

  # "training_df" columns ['total_purchases_30d', 'category', 'rating']
  X_train = training_df.drop(['rating'], axis=1)
  y_train = training_df.rating

  model = linear_model.LinearRegression().fit(X_train, y_train)

  fe.log_model(
    model=model,
    artifact_path="recommendation_model",
    flavor=mlflow.sklearn,
    training_set=training_set,
    registered_model_name="recommendation_model"
  )

# Batch inference

# If the model at model_uri is packaged with the features, the FeatureStoreClient.score_batch()
# call automatically retrieves the required features from Feature Store before scoring the model.
# The DataFrame returned by score_batch() augments batch_df with
# columns containing the feature values and a column containing model predictions.

fe = FeatureEngineeringClient()

# batch_df has columns ‘customer_id’ and ‘product_id’
predictions = fe.score_batch(
    model_uri=model_uri,
    df=batch_df
)

# The ‘predictions’ DataFrame has these columns:
# ‘customer_id’, ‘product_id’, ‘total_purchases_30d’, ‘category’, ‘prediction’

مخزن ميزات مساحة العمل

# Train model
import mlflow
from sklearn import linear_model

feature_lookups = [
    FeatureLookup(
      table_name='recommender_system.customer_features',
      feature_names=['total_purchases_30d'],
      lookup_key='customer_id',
    ),
    FeatureLookup(
      table_name='recommender_system.product_features',
      feature_names=['category'],
      lookup_key='product_id'
    )
  ]

fs = FeatureStoreClient()

with mlflow.start_run():

  # df has columns ['customer_id', 'product_id', 'rating']
  training_set = fs.create_training_set(
    df=df,
    feature_lookups=feature_lookups,
    label='rating',
    exclude_columns=['customer_id', 'product_id']
  )

  training_df = training_set.load_df().toPandas()

  # "training_df" columns ['total_purchases_30d', 'category', 'rating']
  X_train = training_df.drop(['rating'], axis=1)
  y_train = training_df.rating

  model = linear_model.LinearRegression().fit(X_train, y_train)

  fs.log_model(
    model=model,
    artifact_path="recommendation_model",
    flavor=mlflow.sklearn,
    training_set=training_set,
    registered_model_name="recommendation_model"
  )

# Batch inference

# If the model at model_uri is packaged with the features, the FeatureStoreClient.score_batch()
# call automatically retrieves the required features from Feature Store before scoring the model.
# The DataFrame returned by score_batch() augments batch_df with
# columns containing the feature values and a column containing model predictions.

fs = FeatureStoreClient()

# batch_df has columns ‘customer_id’ and ‘product_id’
predictions = fs.score_batch(
    model_uri=model_uri,
    df=batch_df
)

# The ‘predictions’ DataFrame has these columns:
# ‘customer_id’, ‘product_id’, ‘total_purchases_30d’, ‘category’, ‘prediction’

استخدام قيم الميزة المخصصة عند تسجيل نموذج مع حزمة بيانات تعريف الميزة

بشكل افتراضي، يبحث النموذج المحزم مع بيانات تعريف الميزة عن الميزات من جداول الميزات عند الاستدلال. لاستخدام قيم الميزات المخصصة لتسجيل النقاط، قم بتضمينها في DataFrame الذي تم تمريره إلى FeatureEngineeringClient.score_batch (لهندسة الميزات في كتالوج Unity) أو FeatureStoreClient.score_batch (لمخزن ميزات مساحة العمل).

على سبيل المثال، افترض أنك قمت بحزم نموذج بهذين الميزتين:

هندسة الميزات في كتالوج unity

feature_lookups = [
    FeatureLookup(
      table_name='ml.recommender_system.customer_features',
      feature_names=['account_creation_date', 'num_lifetime_purchases'],
      lookup_key='customer_id',
    ),
  ]

مخزن ميزات مساحة العمل

feature_lookups = [
    FeatureLookup(
      table_name='recommender_system.customer_features',
      feature_names=['account_creation_date', 'num_lifetime_purchases'],
      lookup_key='customer_id',
    ),
  ]

عند الاستدلال، يمكنك توفير قيم مخصصة للميزة account_creation_date عن طريق استدعاء score_batch DataFrame الذي يتضمن عمودا يسمى account_creation_date. في هذه الحالة، تبحث واجهة برمجة التطبيقات عن الميزة num_lifetime_purchases فقط من 'متجر الميزات' وتستخدم قيم الأعمدة المخصصة account_creation_date المتوفرة لتسجيل النماذج.

هندسة الميزات في كتالوج unity

# batch_df has columns ['customer_id', 'account_creation_date']
predictions = fe.score_batch(
  model_uri='models:/ban_prediction_model/1',
  df=batch_df
)

مخزن ميزات مساحة العمل

# batch_df has columns ['customer_id', 'account_creation_date']
predictions = fs.score_batch(
  model_uri='models:/ban_prediction_model/1',
  df=batch_df
)

تدريب نموذج وتسجيله باستخدام مجموعة من ميزات 'متجر الميزات' والبيانات الموجودة خارج 'متجر الميزات'

يمكنك تدريب نموذج باستخدام مجموعة من ميزات 'متجر الميزات' وبياناته من خارج 'متجر الميزات'. عند حزم النموذج مع بيانات تعريف الميزة، يسترد النموذج قيم الميزات من مخزن الميزات للاستدلال.

لتدريب نموذج، قم بتضمين البيانات الإضافية كأعمدة في DataFrame التي تم تمريرها إلى FeatureEngineeringClient.create_training_set (لهندسة الميزات في كتالوج Unity) أو FeatureStoreClient.create_training_set (لمخزن ميزات مساحة العمل). يستخدم هذا المثال الميزة total_purchases_30d من مخزن الميزات والعمود browserالخارجي .

هندسة الميزات في كتالوج unity

feature_lookups = [
    FeatureLookup(
      table_name='ml.recommender_system.customer_features',
      feature_names=['total_purchases_30d'],
      lookup_key='customer_id',
    ),
  ]

fe = FeatureEngineeringClient()

# df has columns ['customer_id', 'browser', 'rating']
training_set = fe.create_training_set(
  df=df,
  feature_lookups=feature_lookups,
  label='rating',
  exclude_columns=['customer_id']  # 'browser' is not excluded
)

مخزن ميزات مساحة العمل

feature_lookups = [
    FeatureLookup(
      table_name='recommender_system.customer_features',
      feature_names=['total_purchases_30d'],
      lookup_key='customer_id',
    ),
  ]

fs = FeatureStoreClient()

# df has columns ['customer_id', 'browser', 'rating']
training_set = fs.create_training_set(
  df=df,
  feature_lookups=feature_lookups,
  label='rating',
  exclude_columns=['customer_id']  # 'browser' is not excluded
)

عند الاستدلال، يجب أن يتضمن browser DataFrame المستخدم في FeatureStoreClient.score_batch العمود.

هندسة الميزات في كتالوج unity

# At inference, 'browser' must be provided
# batch_df has columns ['customer_id', 'browser']
predictions = fe.score_batch(
  model_uri=model_uri,
  df=batch_df
)

مخزن ميزات مساحة العمل

# At inference, 'browser' must be provided
# batch_df has columns ['customer_id', 'browser']
predictions = fs.score_batch(
  model_uri=model_uri,
  df=batch_df
)

تحميل النماذج وتنفيذ الاستدلال الدفعي باستخدام MLflow

بعد تسجيل نموذج باستخدام log_model أسلوب FeatureEngineeringClient (لهندسة الميزات في كتالوج Unity) أو FeatureStoreClient (لمخزن ميزات مساحة العمل)، يمكن استخدام MLflow للاستدلال. MLflow.pyfunc.predict يسترد قيم الميزات من 'متجر الميزات' وينضم أيضا إلى أي قيم يتم توفيرها في وقت الاستدلال. يجب توفير المفتاح (المفاتيح) الأساسي للميزات المستخدمة في النموذج.

إشعار

يتطلب الاستدلال الدفعي مع MLflow إصدار MLflow 2.11 وما فوق.

# Train model
import mlflow
from sklearn import linear_model

feature_lookups = [
  FeatureLookup(
    table_name='ml.recommender_system.customer_features',
    feature_names=['total_purchases_30d'],
    lookup_key='customer_id',
  ),
  FeatureLookup(
    table_name='ml.recommender_system.product_features',
    feature_names=['category'],
    lookup_key='product_id'
  )
]

fe = FeatureEngineeringClient()

with mlflow.start_run():

  # df has columns ['customer_id', 'product_id', 'rating']
  training_set = fe.create_training_set(
    df=df,
    feature_lookups=feature_lookups,
    label='rating',
    exclude_columns=['customer_id', 'product_id']
  )

  training_df = training_set.load_df().toPandas()

  # "training_df" columns ['total_purchases_30d', 'category', 'rating']
  X_train = training_df.drop(['rating'], axis=1)
  y_train = training_df.rating

  model = linear_model.LinearRegression().fit(X_train, y_train)

  fe.log_model(
    model=model,
    artifact_path="recommendation_model",
    flavor=mlflow.sklearn,
    training_set=training_set,
    registered_model_name="recommendation_model",
    #refers to the default value of "result_type" if not provided at inference
    params={"result_type":"double"},
  )

# Batch inference with MLflow

# NOTE: the result_type parameter can only be used if a default value
# is provided in log_model. This is automatically done for all models
# logged using Databricks Runtime for ML 15.0 or above.
# For earlier Databricks Runtime versions, use set_result as shown below.

# batch_df has columns ‘customer_id’ and ‘product_id’
model = mlflow.pyfunc.load_model(model_version_uri)

# If result_type parameter is provided in log_model
predictions = model.predict(df, {"result_type":"double"})

# If result_type parameter is NOT provided in log_model
model._model_impl.set_result_type("double")
predictions = model.predict(df)