Başlarken: Databricks'te ilk makine öğrenmesi modelinizi oluşturma

Bu örnek not defteri Databricks'te makine öğrenmesi sınıflandırma modelini eğitmeyi göstermektedir. Machine Learning için Databricks Runtime, eğitim ve ön işleme algoritmaları için scikit-learn, model geliştirme sürecini izlemek için MLflow ve hiper parametre ayarlamasını ölçeklendirmek için SparkTrials ile Hyperopt dahil olmak üzere önceden yüklenmiş birçok kitaplıkla birlikte gelir.

Bu not defterinde, bir şarabın "yüksek kaliteli" olarak kabul edilip edilmeyeceğini tahmin etmek için bir sınıflandırma modeli oluşturacaksınız. Veri kümesi, farklı şaraplardan (örneğin, alkol içeriği, asitlik ve artık şeker) 11 özellik ve 1 ile 10 arasında bir kalite derecelendirmesi içerir.

Bu eğitim şunları kapsar:

  • Bölüm 1: MLflow izleme ile sınıflandırma modelini eğitme
  • Bölüm 2: Model performansını geliştirmek için hiper parametre ayarlama
  • Bölüm 3: Sonuçları ve modelleri Unity Kataloğu'na kaydetme
  • Bölüm 4: Modeli kurulumu

Model yaşam döngüsü yönetimi ve model çıkarımı dahil olmak üzere Databricks'te makine öğrenmesini üretime alma hakkında daha fazla bilgi için ML Uçtan Uca Örneğine bakın.

Veri kümesi UCI Makine Öğrenimi Veri Deposundan mevcuttur ve Fizikokimyasal özelliklerden veri madenciliği yoluyla şarap tercihlerinin modellenmesi [Cortez et al., 2009]'da sunulur.

Requirements

Kurulum

Bu bölümde aşağıdakileri yaparsınız:

  • MLflow istemcisini model kayıt defteri olarak Unity Kataloğu'nu kullanacak şekilde yapılandırın.
  • Modelin kaydedileceği kataloğu ve şemayı ayarlayın.
  • Verileri okuyun ve Unity Kataloğu'ndaki tablolara kaydedin.
  • Verileri ön işleme.

MLflow istemcisini yapılandırma

Varsayılan olarak, MLflow Python istemcisi Databricks çalışma alanı modeli kayıt defterinde modeller oluşturur. Unity Kataloğu'nda modelleri kaydetmek için MLflow istemcisini aşağıdaki hücrede gösterildiği gibi yapılandırın.

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

Aşağıdaki hücre, modelin kaydedileceği kataloğu ve şemayı ayarlar. Katalog üzerinde USE CATALOG yetkiniz olmalı, ve şema üzerinde USE_SCHEMA, CREATE_TABLE ve CREATE_MODEL yetkilerine sahip olmalısınız. Gerekirse aşağıdaki hücredeki katalog ve şema adlarını değiştirin.

Daha fazla bilgi için Unity Kataloğu belgelerine bakın.

# Specify the catalog and schema to use. You must have USE_CATALOG privilege on the catalog and USE_SCHEMA, CREATE_TABLE, and CREATE_MODEL privileges on the schema.
# Change the catalog and schema here if necessary.
CATALOG_NAME = "main"
SCHEMA_NAME = "default"

Unity Kataloğu'nda verileri okuma ve tablolara kaydetme

Veri kümesi databricks-datasets kullanılabilir. Aşağıdaki hücrede dosyalarındaki verileri Spark DataFrames'e .csv okursunuz. Ardından Unity Kataloğu'ndaki tablolara DataFrame'leri yazarsınız. Bu hem verileri kalıcı hale getirmekte hem de başkalarıyla nasıl paylaşabileceğinizi denetlemenize olanak tanır.

white_wine = spark.read.csv("/databricks-datasets/wine-quality/winequality-white.csv", sep=';', header=True)
red_wine = spark.read.csv("/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")

Verileri ön işleme

# Import required libraries
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
)

Bölüm 1. Sınıflandırma modelini eğitin

# Enable MLflow autologging for this notebook
mlflow.autolog()

Sonraki adımda, eğitilen modelin yanı sıra birçok ilgili metrik ve parametreyi otomatik olarak günlüğe kaydeden bir MLflow çalıştırması bağlamında bir sınıflandırıcı eğitin.

Test veri kümesindeki modelin AUC puanı gibi ek ölçümlerle günlüğe kaydetme işlemini tamamlayabilirsiniz.

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

MLflow çalıştırmalarını görüntüle

Günlüğe kaydedilen eğitim çalıştırmasını görüntülemek için, deneme kenar çubuğunu görüntülemek için not defterinin sağ üst kısmındaki Deneme simgesine Deneme simgesi tıklayın. Gerekirse, en son çalıştırmaları getirmek ve izlemek için yenile simgesine tıklayın.

Sağ kenar çubuğunda listelenen denemeler

Daha ayrıntılı MLflow deneme sayfasını görüntülemek için deneme sayfası simgesine tıklayın. Bu sayfa, çalıştırmaları karşılaştırmanıza ve belirli çalıştırmaların ayrıntılarını görüntülemenize olanak tanır. Bkz. MLflow kullanarak model geliştirmeyi izleme.

Modelleri yükleme

MLflow API'sini kullanarak belirli bir çalıştırmanın sonuçlarına da erişebilirsiniz. Aşağıdaki hücredeki kod, belirli bir MLflow çalıştırmasında eğitilen modelin nasıl yüklendiğini ve tahminlerde bulunmak için nasıl kullanılacağını gösterir. Ayrıca MLflow çalıştırma sayfasında belirli modelleri yüklemeye yönelik kod parçacıklarını da bulabilirsiniz.

# After a model has been logged, you can load it in different notebooks or jobs
# mlflow.pyfunc.load_model makes model prediction available under a common API
model_loaded = mlflow.pyfunc.load_model(
  'runs:/{run_id}/model'.format(
    run_id=run.info.run_id
  )
)

predictions_loaded = model_loaded.predict(X_test)
predictions_original = model.predict(X_test)

# The loaded model should match the original
assert(np.array_equal(predictions_loaded, predictions_original))

Bölüm 2. Hiperparametre optimizasyonu

Bu noktada basit bir model eğitdiniz ve çalışmanızı düzenlemek için MLflow izleme hizmetini kullandınız. Ardından, Hyperopt kullanarak daha karmaşık ayarlamalar yapabilirsiniz.

Hyperopt ve SparkTrials ile paralel eğitim

Hyperopt hiper parametre ayarlamaya yönelik bir Python kitaplığıdır. Databricks'te Hyperopt kullanma hakkında daha fazla bilgi için bkz. Hyperopt ile dağıtılmış eğitim algoritmalarını kullanma.

Hyperopt'u SparkTrials ile kullanarak hiper parametre taramalarını çalıştırabilir ve birden çok modeli paralel olarak eğitebilirsiniz. Bu, model performansını iyileştirmek için gereken süreyi azaltır. MLflow izleme, modellerin ve parametrelerin otomatik olarak kayıtlarını tutmak için Hyperopt ile entegredir.

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

En iyi modeli elde etmek için arama işlemleri yürütülür.

Tüm çalıştırmalar MLflow tarafından izlendiği için, en yüksek test AUC'ye sahip ayarlama sürecini bulmak amacıyla, MLflow arama işlemi API'sini kullanarak en iyi çalıştırmanın ölçütlerini ve parametrelerini alabilirsiniz.

Bu ayarlanmış model, Bölüm 1'de eğitilen daha basit modellerden daha iyi performans göstermelidir.

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

best_model_pyfunc = mlflow.pyfunc.load_model(
  'runs:/{run_id}/model'.format(
    run_id=best_run.run_id
  )
)

# Make a dataset with all predictions
best_model_predictions = X_test
best_model_predictions["prediction"] = best_model_pyfunc.predict(X_test)

Bölüm 3. Sonuçları ve modelleri Unity Kataloğu'na kaydetme

predictions_table = f"{CATALOG_NAME}.{SCHEMA_NAME}.predictions"
spark.sql(f"DROP TABLE IF EXISTS {predictions_table}")

results = spark.createDataFrame(best_model_predictions)

# Write results back to Unity Catalog from Python
results.write.saveAsTable(f"{CATALOG_NAME}.{SCHEMA_NAME}.predictions")
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")

Bölüm 4. Modeli dağıt

Modelinizi Unity Kataloğu'na kaydettikten sonra, Sunma kullanıcı arabirimini kullanarak dağıtabilirsiniz. Aşağıdaki yönergeler kısa bir açıklama verir. Daha fazla bilgi için bkz. Uç noktaları sunan özel model oluşturma.

  1. Kenar çubuğunda Hizmet'e tıklayarak Hizmet UI'sini görüntüleyin.

Model sunma kullanıcı arabirimi

  1. Sunum uç noktası oluştur'a tıklayın.

  2. Ad alanında uç noktanız için bir ad girin.

  3. Sunulan varlıklar bölümünde

    1. Varlık alanına tıklayarak Sunulan varlık seçin formunu açın.
    2. Modellerim- Unity Kataloğu'nu seçin. Form, seçiminize göre dinamik olarak güncelleştirilir.
    3. wine_quality_model ve hizmet vermek istediğiniz model sürümünü seçin.
    4. Hizmet sunulan modelinize yönlendirmek istediğiniz trafik yüzdesi olarak 100 seçin.
    5. Bu örnekte işlem türü olarak CPU'ya tıklayın.
    6. İşlem Ölçeği Genişletme'nin altında, işlem ölçeği genişletme boyutu olarak Küçük'e tıklayın.
  4. Oluştur'utıklayın. Sunum uç noktaları sayfası, Sunum uç noktası durumuHazır Değil olarak gösterilir.

  5. Uç noktanız Hazır olduğunda, uç noktaya çıkarım isteği göndermek için Kullan'ı seçin.

Örnek defter

Başlarken: Databricks'te ilk makine öğrenmesi modelinizi oluşturma

Dizüstü bilgisayar al