مشاركة عبر


بدء الاستخدام: إنشاء نموذج التعلم الآلي الأول على Azure Databricks

توضح لك هذه المقالة كيفية إنشاء نموذج تصنيف التعلم الآلي باستخدام المكتبة scikit-learn على Azure Databricks.

والهدف من ذلك هو إنشاء نموذج تصنيف للتنبؤ بما إذا كان النبيذ يعتبر "عالي الجودة". تتكون مجموعة البيانات من 11 سمة من النبيذ المختلف (على سبيل المثال، محتوى الكحول والحموضة والسكر المتبقي) وترتيب الجودة بين 1 إلى 10.

يوضح هذا المثال أيضا استخدام MLflow لتتبع عملية تطوير النموذج، وHyperopt لأتمتة ضبط المعلمات الفائقة.

مجموعة البيانات من UCI التعلم الآلي Repository، المقدمة في تفضيلات نبيذ النمذجة عن طريق استخراج البيانات من الخصائص الفيزيائية الكيميائية [Cortez et al.، 2009].

قبل البدء

  • يجب تمكين مساحة العمل الخاصة بك ل Unity Catalog.
  • يجب أن يكون لديك إذن لإنشاء نظام مجموعة أو الوصول إلى نظام مجموعة.
  • يجب أن يكون لديك امتياز USE_CATALOG على كتالوج.
  • ضمن هذا الكتالوج، يجب أن يكون لديك الامتيازات التالية على مخطط: USE_SCHEMA CREATE_TABLE CREATE_MODEL.

تلميح

تتوفر جميع التعليمات البرمجية في هذه المقالة في دفتر ملاحظات يمكنك استيراده مباشرة إلى مساحة العمل الخاصة بك. راجع مثال دفتر الملاحظات: إنشاء نموذج تصنيف.

الخطوة 1: إنشاء دفتر ملاحظات Databricks

لإنشاء دفتر ملاحظات في مساحة العمل، انقر فوق أيقونة جديدة جديد في الشريط الجانبي، ثم انقر فوق دفتر الملاحظات. يتم فتح دفتر ملاحظات فارغ في مساحة العمل.

لمعرفة المزيد حول إنشاء دفاتر الملاحظات وإدارتها، راجع إدارة دفاتر الملاحظات.

الخطوة 2: الاتصال بحساب الموارد

للقيام بتحليل البيانات الاستكشافية وهندسة البيانات، يجب أن يكون لديك حق الوصول إلى الحوسبة.

للحصول على إرشادات حول الاتصال بموارد الحوسبة الموجودة، راجع الحساب. للحصول على إرشادات حول تكوين مورد حساب جديد، راجع مرجع تكوين الحساب.

تتطلب الخطوات الواردة في هذه المقالة وقت تشغيل Databricks التعلم الآلي. لمزيد من المعلومات والإرشادات لتحديد إصدار التعلم الآلي من Databricks Runtime، راجع Databricks Runtime for التعلم الآلي.

الخطوة 3: إعداد سجل النموذج والكتالوج والمخطط

هناك خطوتان مهمتان مطلوبتان قبل البدء. أولا، يجب تكوين عميل MLflow لاستخدام كتالوج Unity كسجل النموذج. أدخل التعليمات البرمجية التالية في خلية جديدة في دفتر الملاحظات.

import mlflow
mlflow.set_registry_uri("databricks-uc")

يجب عليك أيضا تعيين الكتالوج والمخطط حيث سيتم تسجيل النموذج. يجب أن يكون لديك امتياز USE CATALOG على الكتالوج، USE_SCHEMA CREATE_TABLE وامتيازات CREATE_MODEL على المخطط.

لمزيد من المعلومات حول كيفية استخدام كتالوج Unity، راجع ما هو كتالوج Unity؟.

أدخل التعليمات البرمجية التالية في خلية جديدة في دفتر الملاحظات.

# If necessary, replace "main" and "default" with a catalog and schema for which you have the required permissions.
CATALOG_NAME = "main"
SCHEMA_NAME = "default"

الخطوة 4: تحميل البيانات وإنشاء جداول كتالوج Unity

يستخدم هذا المثال ملفين CSV مضمنين في Azure Databricks. لمعرفة كيفية استيعاب بياناتك الخاصة، راجع استيعاب البيانات في مستودع Databricks.

أدخل التعليمات البرمجية التالية في خلية جديدة في دفتر الملاحظات.

white_wine = spark.read.csv("dbfs:/databricks-datasets/wine-quality/winequality-white.csv", sep=';', header=True)
red_wine = spark.read.csv("dbfs:/databricks-datasets/wine-quality/winequality-red.csv", sep=';', header=True)

# Remove the spaces from the column names
for c in white_wine.columns:
    white_wine = white_wine.withColumnRenamed(c, c.replace(" ", "_"))
for c in red_wine.columns:
    red_wine = red_wine.withColumnRenamed(c, c.replace(" ", "_"))

# Define table names
red_wine_table = f"{CATALOG_NAME}.{SCHEMA_NAME}.red_wine"
white_wine_table = f"{CATALOG_NAME}.{SCHEMA_NAME}.white_wine"

# Write to tables in Unity Catalog
spark.sql(f"DROP TABLE IF EXISTS {red_wine_table}")
spark.sql(f"DROP TABLE IF EXISTS {white_wine_table}")
white_wine.write.saveAsTable(f"{CATALOG_NAME}.{SCHEMA_NAME}.white_wine")
red_wine.write.saveAsTable(f"{CATALOG_NAME}.{SCHEMA_NAME}.red_wine")

الخطوة 5. المعالجة المسبقة للبيانات وتقسيمها

في هذه الخطوة، يمكنك تحميل البيانات من جداول كتالوج Unity التي أنشأتها في الخطوة 4 إلى Pandas DataFrames ومعالجة البيانات مسبقا. تقوم التعليمات البرمجية في هذا القسم بالآتي:

  1. تحميل البيانات ك Pandas DataFrames.
  2. يضيف عمودا منطقيا إلى كل DataFrame لتمييز النبيذ الأحمر والأبيض، ثم يجمع بين DataFrames في DataFrame جديد، data_df.
  3. تتضمن مجموعة البيانات عمودا quality يعدل النبيذ من 1 إلى 10، مع 10 يشير إلى أعلى جودة. تحول التعليمة البرمجية هذا العمود إلى قيمتين للتصنيف: "True" للإشارة إلى نبيذ عالي الجودة (quality>= 7) و"False" للإشارة إلى نبيذ غير عالي الجودة (quality< 7).
  4. تقسيم DataFrame إلى مجموعات بيانات تدريب واختبار منفصلة.

أولا، استيراد المكتبات المطلوبة:

import numpy as np
import pandas as pd
import sklearn.datasets
import sklearn.metrics
import sklearn.model_selection
import sklearn.ensemble

import matplotlib.pyplot as plt

from hyperopt import fmin, tpe, hp, SparkTrials, Trials, STATUS_OK
from hyperopt.pyll import scope

الآن قم بتحميل البيانات والمعالجة المسبقة لها:

# Load data from Unity Catalog as Pandas dataframes
white_wine = spark.read.table(f"{CATALOG_NAME}.{SCHEMA_NAME}.white_wine").toPandas()
red_wine = spark.read.table(f"{CATALOG_NAME}.{SCHEMA_NAME}.red_wine").toPandas()

# Add Boolean fields for red and white wine
white_wine['is_red'] = 0.0
red_wine['is_red'] = 1.0
data_df = pd.concat([white_wine, red_wine], axis=0)

# Define classification labels based on the wine quality
data_labels = data_df['quality'].astype('int') >= 7
data_df = data_df.drop(['quality'], axis=1)

# Split 80/20 train-test
X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(
  data_df,
  data_labels,
  test_size=0.2,
  random_state=1
)

الخطوة 6. تدريب نموذج التصنيف

تقوم هذه الخطوة بتدريب مصنف تعزيز التدرج باستخدام إعدادات الخوارزمية الافتراضية. ثم يطبق النموذج الناتج على مجموعة بيانات الاختبار ويحسب ويسجل ويعرض المنطقة تحت منحنى تشغيل المتلقي لتقييم أداء النموذج.

أولا، قم بتمكين التسجيل التلقائي ل MLflow:

mlflow.autolog()

الآن ابدأ تشغيل تدريب النموذج:

with mlflow.start_run(run_name='gradient_boost') as run:
    model = sklearn.ensemble.GradientBoostingClassifier(random_state=0)

    # Models, parameters, and training metrics are tracked automatically
    model.fit(X_train, y_train)

    predicted_probs = model.predict_proba(X_test)
    roc_auc = sklearn.metrics.roc_auc_score(y_test, predicted_probs[:,1])
    roc_curve = sklearn.metrics.RocCurveDisplay.from_estimator(model, X_test, y_test)

    # Save the ROC curve plot to a file
    roc_curve.figure_.savefig("roc_curve.png")

    # The AUC score on test data is not automatically logged, so log it manually
    mlflow.log_metric("test_auc", roc_auc)

    # Log the ROC curve image file as an artifact
    mlflow.log_artifact("roc_curve.png")

    print("Test AUC of: {}".format(roc_auc))

تظهر نتائج الخلية المنطقة المحسوبة أسفل المنحنى ومخطط منحنى ROC:

منحنى ROC لنموذج التصنيف.

الخطوة 7. عرض تشغيل التجربة في MLflow

يساعدك تتبع تجربة MLflow على تتبع تطوير النموذج عن طريق تسجيل التعليمات البرمجية والنتائج أثناء تطوير النماذج بشكل متكرر.

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

ارتباط للتجربة في نتائج الخلايا.

تسمح لك صفحة التجربة بمقارنة عمليات التشغيل وعرض تفاصيل عمليات تشغيل معينة. راجع تتبع تجربة MLflow.

الخطوة 8. ضبط المعلمات الفائقة

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

يتضمن التعلم الآلي من Databricks Runtime Hyperopt، وهي مكتبة Python لضبط المعلمات الفائقة. يمكنك استخدام Hyperopt لتشغيل عمليات مسح المعلمات الفائقة وتدريب نماذج متعددة بالتوازي، ما يقلل من الوقت المطلوب لتحسين أداء النموذج. يتم دمج تتبع MLflow مع Hyperopt لتسجيل النماذج والمعلمات تلقائيا. لمزيد من المعلومات حول استخدام Hyperopt في Databricks، راجع ضبط Hyperparameter.

تعرض التعليمات البرمجية التالية مثالا على استخدام Hyperopt.

# Define the search space to explore
search_space = {
  'n_estimators': scope.int(hp.quniform('n_estimators', 20, 1000, 1)),
  'learning_rate': hp.loguniform('learning_rate', -3, 0),
  'max_depth': scope.int(hp.quniform('max_depth', 2, 5, 1)),
}

def train_model(params):
  # Enable autologging on each worker
  mlflow.autolog()
  with mlflow.start_run(nested=True):
    model_hp = sklearn.ensemble.GradientBoostingClassifier(
      random_state=0,
      **params
    )
    model_hp.fit(X_train, y_train)
    predicted_probs = model_hp.predict_proba(X_test)
    # Tune based on the test AUC
    # In production, you could use a separate validation set instead
    roc_auc = sklearn.metrics.roc_auc_score(y_test, predicted_probs[:,1])
    mlflow.log_metric('test_auc', roc_auc)

    # Set the loss to -1*auc_score so fmin maximizes the auc_score
    return {'status': STATUS_OK, 'loss': -1*roc_auc}

# SparkTrials distributes the tuning using Spark workers
# Greater parallelism speeds processing, but each hyperparameter trial has less information from other trials
# On smaller clusters try setting parallelism=2
spark_trials = SparkTrials(
  parallelism=1
)

with mlflow.start_run(run_name='gb_hyperopt') as run:
  # Use hyperopt to find the parameters yielding the highest AUC
  best_params = fmin(
    fn=train_model,
    space=search_space,
    algo=tpe.suggest,
    max_evals=32,
    trials=spark_trials)

الخطوة 9. العثور على أفضل نموذج وتسجيله في كتالوج Unity

تحدد التعليمات البرمجية التالية التشغيل الذي أدى إلى أفضل النتائج، كما يتم قياسه حسب المنطقة تحت منحنى ROC:

# Sort runs by their test auc. In case of ties, use the most recent run.
best_run = mlflow.search_runs(
  order_by=['metrics.test_auc DESC', 'start_time DESC'],
  max_results=10,
).iloc[0]
print('Best Run')
print('AUC: {}'.format(best_run["metrics.test_auc"]))
print('Num Estimators: {}'.format(best_run["params.n_estimators"]))
print('Max Depth: {}'.format(best_run["params.max_depth"]))
print('Learning Rate: {}'.format(best_run["params.learning_rate"]))

run_id باستخدام الذي حددته للحصول على أفضل نموذج، تسجل التعليمات البرمجية التالية هذا النموذج في كتالوج Unity.

model_uri = 'runs:/{run_id}/model'.format(
    run_id=best_run.run_id
  )

mlflow.register_model(model_uri, f"{CATALOG_NAME}.{SCHEMA_NAME}.wine_quality_model")

مثال على دفتر الملاحظات: إنشاء نموذج تصنيف

استخدم دفتر الملاحظات التالي لتنفيذ الخطوات الواردة في هذه المقالة. للحصول على إرشادات حول استيراد دفتر ملاحظات إلى مساحة عمل Azure Databricks، راجع استيراد دفتر ملاحظات.

بناء نموذج التعلم الآلي الأول باستخدام Databricks

الحصول على دفتر الملاحظات

معرفة المزيد

يوفر Databricks نظاما أساسيا واحدا يخدم كل خطوة من خطوات تطوير التعلم الآلي ونشره، من البيانات الأولية إلى جداول الاستدلال التي تحفظ كل طلب واستجابة لنموذج يخدم. يمكن لعلماء البيانات ومهندسي البيانات ومهندسي التعلم الآلي وDevOps القيام بعملهم باستخدام نفس مجموعة الأدوات ومصدر واحد للحقيقة للبيانات.

لمعرفة المزيد، راجع ما يلي: