Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 Optuna 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
- Databricks Runtime 17.3 LTS ML veya üzerini çalıştıran küme. Databricks Runtime 16.4 LTS ML veya üzerini çalıştırıyorsanız bkz . Öğretici: Databricks'te (Hyperopt) ilk makine öğrenmesi modelinizi oluşturma.
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
import optuna
from mlflow.optuna.storage import MlflowStorage
from mlflow.pyspark.optuna.study import MlflowSparkStudy
# 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
tıklayın. Gerekirse, en son çalıştırmaları getirmek ve izlemek için yenile simgesine tıklayın.
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, Optuna kullanarak daha karmaşık ayarlamalar yapabilirsiniz.
Optuna kullanarak paralel eğitim
Optuna, birden çok işlem kaynağı arasında yatay olarak ölçeklendirilebilen hiper parametre ayarlamaya yönelik bir açık kaynak Python kitaplığıdır. Databricks'te Optuna kullanma hakkında daha fazla bilgi için bkz. Optuna ile hiper parametre ayarlama.
def objective(trial):
# Enable autologging on each worker
mlflow.autolog()
with mlflow.start_run(nested=True):
params = {
'n_estimators': trial.suggest_int('n_estimators', 20, 1000),
'learning_rate': trial.suggest_float('learning_rate', 0.05, 1.0, log=True),
'max_depth': trial.suggest_int('max_depth', 2, 5),
}
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)
# Negate the AUC because Optuna minimizes the objective by default
return -roc_auc
with mlflow.start_run(run_name='gb_optuna') as run:
# Use the MLflow Tracking Server as the Optuna storage backend
experiment_id = mlflow.active_run().info.experiment_id
mlflow_storage = MlflowStorage(experiment_id=experiment_id)
# MlflowSparkStudy distributes the tuning using Spark workers
mlflow_study = MlflowSparkStudy(
study_name="gb-optuna-tuning",
storage=mlflow_storage,
)
mlflow_study.optimize(objective, n_trials=32, n_jobs=4)
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.
- Kenar çubuğunda Hizmet'e tıklayarak Hizmet UI'sini görüntüleyin.
Sunum uç noktası oluştur'a tıklayın.
Ad alanında uç noktanız için bir ad girin.
Sunulan varlıklar bölümünde
- Varlık alanına tıklayarak Sunulan varlık seçin formunu açın.
- Modellerim- Unity Kataloğu'nu seçin. Form, seçiminize göre dinamik olarak güncelleştirilir.
-
wine_quality_modelve hizmet vermek istediğiniz model sürümünü seçin. - Hizmet sunulan modelinize yönlendirmek istediğiniz trafik yüzdesi olarak 100 seçin.
- Bu örnekte işlem türü olarak CPU'ya tıklayın.
- İşlem Ölçeği Genişletme'nin altında, işlem ölçeği genişletme boyutu olarak Küçük'e tıklayın.
Oluştur'utıklayın. Sunum uç noktaları sayfası, Sunum uç noktası durumuHazır Değil olarak gösterilir.
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
not defteri alma