Aracılığıyla paylaş


Öğretici: Makine hata algılama modeli oluşturma, değerlendirme ve puanlama

Bu öğretici, Microsoft Fabric'te Synapse Veri Bilimi iş akışının uçtan uca bir örneğini sunar. Senaryo, hata tanılamaya daha sistematik bir yaklaşım sağlamak, sorunları proaktif olarak belirlemek ve gerçek bir makine hatasından önce eyleme geçmek için makine öğrenmesini kullanır. Amaç, bir makinenin işlem sıcaklığına, dönme hızına vb. göre hata yaşayıp yaşamayacağını tahmin etmektir.

Bu öğretici şu adımları kapsar:

  • Özel kitaplıkları yükleme
  • Verileri yükleme ve işleme
  • Keşif veri analizi aracılığıyla verileri anlama
  • Makine öğrenmesi modellerini eğitmek için scikit-learn, LightGBM ve MLflow kullanın ve denemeleri izlemek için Doku Otomatik Kaydetme özelliğini kullanın
  • Eğitilen modelleri Doku PREDICT özelliğiyle puanlayıp en iyi modeli kaydedin ve tahminler için bu modeli yükleyin
  • Power BI görselleştirmeleriyle yüklenen model performansını gösterme

Önkoşullar

Not defterinde birlikte izleme

Not defterinde izleyebileceğiniz şu seçeneklerden birini belirleyebilirsiniz:

  • Veri Bilimi deneyiminde yerleşik not defterini açma ve çalıştırma
  • Not defterinizi GitHub'dan Veri Bilimi deneyimine yükleme

Yerleşik not defterini açma

Örnek Makine hatası not defteri bu öğreticiye eşlik eder.

Synapse Veri Bilimi deneyiminde öğreticinin yerleşik örnek not defterini açmak için:

  1. Synapse Veri Bilimi giriş sayfasına gidin.

  2. Örnek kullan'ı seçin.

  3. İlgili örneği seçin:

    • Örnek bir Python öğreticisi içinse varsayılan uçtan uca iş akışları (Python) sekmesinden.
    • Örnek bir R öğreticisi içinse Uçtan uca iş akışları (R) sekmesinden.
    • Örnek hızlı bir öğretici içinse Hızlı öğreticiler sekmesinden.
  4. Kod çalıştırmaya başlamadan önce not defterine bir lakehouse ekleyin.

Not defterini GitHub'dan içeri aktarma

Bu öğreticiye AISample - Tahmine Dayalı Bakım not defteri eşlik eder.

Bu öğreticide eşlik eden not defterini açmak için, not defterini çalışma alanınıza aktarmak üzere Sisteminizi veri bilimi öğreticilerine hazırlama başlığındaki yönergeleri izleyin.

Bu sayfadaki kodu kopyalayıp yapıştırmayı tercih ederseniz, yeni bir not defteri oluşturabilirsiniz.

Kod çalıştırmaya başlamadan önce not defterine bir göl evi eklediğinizden emin olun.

1. Adım: Özel kitaplıkları yükleme

Makine öğrenmesi modeli geliştirme veya geçici veri analizi için Apache Spark oturumunuz için hızlı bir şekilde özel bir kitaplık yüklemeniz gerekebilir. Kitaplıkları yüklemek için iki seçeneğiniz vardır.

  • Yalnızca geçerli not defterinizde bir kitaplık yüklemek için not defterinizin satır içi yükleme özelliklerini (%pip veya %conda) kullanın.
  • Alternatif olarak, bir Doku ortamı oluşturabilir, ortak kaynaklardan kitaplıklar yükleyebilir veya özel kitaplıklar yükleyebilirsiniz ve çalışma alanı yöneticiniz ortamı çalışma alanı için varsayılan olarak ekleyebilir. Daha sonra ortamdaki tüm kitaplıklar çalışma alanındaki tüm not defterlerinde ve Spark iş tanımlarında kullanılabilir hale gelir. Ortamlar hakkında daha fazla bilgi için bkz . Microsoft Fabric'te ortam oluşturma, yapılandırma ve kullanma.

Bu öğreticide, kitaplığı not defterinize yüklemek imblearn için kullanın%pip install.

Not

PySpark çekirdeği çalıştırıldıktan sonra %pip install yeniden başlatılır. Diğer hücreleri çalıştırmadan önce gerekli kitaplıkları yükleyin.

# Use pip to install imblearn
%pip install imblearn

2. Adım: Verileri yükleme

Veri kümesi, endüstriyel ayarlarda yaygın olarak kullanılan bir zaman işlevi olarak üretim makinesinin parametrelerinin günlüğe kaydedilmesini simüle eder. Sütun olarak özelliklere sahip satır olarak depolanan 10.000 veri noktasından oluşur. Özellikler şunlardır:

  • 1 ile 10000 arasında bir Benzersiz Tanımlayıcı (UID)

  • Ürün kalitesi değişkenini ve değişkene özgü seri numarasını belirtmek için L harfi (düşük için), M (orta için) veya H (yüksek için) içeren ürün kimliği. Düşük, orta ve yüksek kaliteli çeşitler sırasıyla tüm ürünlerin %60'ını, %30'ünü ve %10'ünü oluşturur

  • Hava sıcaklığı, Kelvin (K) derece

  • İşlem Sıcaklığı, Derece Kelvin

  • Dönme Hızı, dakika başına devir sayısı (RPM)

  • Tork, Newton-Metrede (Nm)

  • Araç aşınması, dakikalar içinde. Kalite varyantları H, M ve L, işlemde kullanılan araca sırasıyla 5, 3 ve 2 dakikalık takım aşınması ekler

  • Makinenin belirli bir veri noktasında başarısız olup olmadığını gösteren bir Makine Hatası Etiketi. Bu belirli veri noktası aşağıdaki beş bağımsız hata modundan herhangi birine sahip olabilir:

    • Takım Aşınma Hatası (TWF): Araç 200 ila 240 dakika arasında rastgele seçilen bir takım aşınma zamanında değiştirilir veya başarısız olur
    • Isı Dağılımı Hatası (HDF): Hava sıcaklığı ile işlem sıcaklığı arasındaki fark 8,6 K'den düşükse ve aracın dönme hızı 1380 RPM'den düşükse ısı dağılımı bir işlem hatasına neden olur
    • Güç Arızası (PWF): Tork ve dönme hızının (rad/sn cinsinden) ürünü, işlem için gereken güce eşittir. Bu güç 3.500 W'nin altına düştüğünde veya 9.000 W'ı aştığında işlem başarısız olur
    • OverStrain Failure (OSF): Takım aşınması ve tork ürünü L ürün çeşidi için minimum 11.000 Nm'yi aşarsa (M için 12.000, H için 13.000), işlem aşırı sınırdan dolayı başarısız olur
    • Rastgele Hatalar (RNF): İşlem parametrelerinden bağımsız olarak her işlemin %0,1 hata olasılığı vardır

Not

Yukarıdaki hata modlarından en az biri doğruysa işlem başarısız olur ve "makine hatası" etiketi 1 olarak ayarlanır. Makine öğrenmesi yöntemi, işlem hatasına hangi hata modunun neden olduğunu belirleyemiyor.

Veri kümesini indirin ve lakehouse'a yükleyin

Azure Açık Veri Kümeleri kapsayıcısına Bağlan ve Tahmine Dayalı Bakım veri kümesini yükleyin. Bu kod, veri kümesinin genel kullanıma açık bir sürümünü indirir ve ardından bir Fabric lakehouse'da depolar:

Önemli

Çalıştırmadan önce not defterine bir göl evi ekleyin. Aksi takdirde bir hata alırsınız. Göl evi ekleme hakkında daha fazla bilgi için bkz. Bağlan göl evleri ve not defterleri.

# Download demo data files into the lakehouse if they don't exist
import os, requests
DATA_FOLDER = "Files/predictive_maintenance/"  # Folder that contains the dataset
DATA_FILE = "predictive_maintenance.csv"  # Data file name
remote_url = "https://synapseaisolutionsa.blob.core.windows.net/public/MachineFaultDetection"
file_list = ["predictive_maintenance.csv"]
download_path = f"/lakehouse/default/{DATA_FOLDER}/raw"

if not os.path.exists("/lakehouse/default"):
    raise FileNotFoundError(
        "Default lakehouse not found, please add a lakehouse and restart the session."
    )
os.makedirs(download_path, exist_ok=True)
for fname in file_list:
    if not os.path.exists(f"{download_path}/{fname}"):
        r = requests.get(f"{remote_url}/{fname}", timeout=30)
        with open(f"{download_path}/{fname}", "wb") as f:
            f.write(r.content)
print("Downloaded demo data files into lakehouse.")

Veri kümesini lakehouse'a indirdikten sonra Spark DataFrame olarak yükleyebilirsiniz:

df = (
    spark.read.option("header", True)
    .option("inferSchema", True)
    .csv(f"{DATA_FOLDER}raw/{DATA_FILE}")
    .cache()
)
df.show(5)

Bu tabloda verilerin önizlemesi gösterilir:

UĞUR Ürün Kimliği Tür Hava sıcaklığı [K] İşlem sıcaklığı [K] Dönme hızı [rpm] Tork [Nm] Takım aşınması [min] Hedef Hata Türü
1 M14860 M 298.1 308.6 1551 42.8 0 0 Hata Yok
2 L47181 L 298.2 308.7 1408 46.3 3 0 Hata Yok
3 L47182 L 298.1 308.5 1498 49.4 5 0 Hata Yok
4 L47183 L 298.2 308.6 1433 39.5 7 0 Hata Yok
5 L47184 L 298.2 308.7 1408 40.0 9 0 Hata Yok

Lakehouse delta tablosuna Spark DataFrame yazma

Sonraki adımlarda Spark işlemlerini kolaylaştırmak için verileri biçimlendirin (örneğin, boşlukları alt çizgilerle değiştirin):

# Replace the space in the column name with an underscore to avoid an invalid character while saving 
df = df.toDF(*(c.replace(' ', '_') for c in df.columns))
table_name = "predictive_maintenance_data"
df.show(5)

Bu tabloda, yeniden biçimlendirilmiş sütun adlarıyla verilerin önizlemesi gösterilir:

UĞUR Product_ID Tür Air_temperature_[K] Process_temperature_[K] Rotational_speed_[rpm] Torque_[Nm] Tool_wear_[min] Hedef Failure_Type
1 M14860 M 298.1 308.6 1551 42.8 0 0 Hata Yok
2 L47181 L 298.2 308.7 1408 46.3 3 0 Hata Yok
3 L47182 L 298.1 308.5 1498 49.4 5 0 Hata Yok
4 L47183 L 298.2 308.6 1433 39.5 7 0 Hata Yok
5 L47184 L 298.2 308.7 1408 40.0 9 0 Hata Yok
# Save data with processed columns to the lakehouse 
df.write.mode("overwrite").format("delta").save(f"Tables/{table_name}")
print(f"Spark DataFrame saved to delta table: {table_name}")

3. Adım: Verileri ön işleme ve keşif veri analizi gerçekleştirme

Spark DataFrame'i pandas DataFrame'e dönüştürerek Pandas uyumlu popüler çizim kitaplıklarını kullanın.

İpucu

Büyük bir veri kümesi için bu veri kümesinin bir bölümünü yüklemeniz gerekebilir.

data = spark.read.format("delta").load("Tables/predictive_maintenance_data")
SEED = 1234
df = data.toPandas()
df.drop(['UDI', 'Product_ID'],axis=1,inplace=True)
# Rename the Target column to IsFail
df = df.rename(columns = {'Target': "IsFail"})
df.info()

Veri kümesinin belirli sütunlarını gerektiği gibi kayan veya tamsayı türlerine dönüştürün ve dizeleri ('L', 'M', 'H') sayısal değerlere (0, 1, 2) eşleyin:

# Convert temperature, rotational speed, torque, and tool wear columns to float
df['Air_temperature_[K]'] = df['Air_temperature_[K]'].astype(float)
df['Process_temperature_[K]'] = df['Process_temperature_[K]'].astype(float)
df['Rotational_speed_[rpm]'] = df['Rotational_speed_[rpm]'].astype(float)
df['Torque_[Nm]'] = df['Torque_[Nm]'].astype(float)
df['Tool_wear_[min]'] = df['Tool_wear_[min]'].astype(float)

# Convert the 'Target' column to an integer 
df['IsFail'] = df['IsFail'].astype(int)
# Map 'L', 'M', 'H' to numerical values 
df['Type'] = df['Type'].map({'L': 0, 'M': 1, 'H': 2})

Görselleştirmeler aracılığıyla verileri keşfetme

# Import packages and set plotting style
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
sns.set_style('darkgrid')

# Create the correlation matrix
corr_matrix = df.corr(numeric_only=True)

# Plot a heatmap
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True)
plt.show()

Screenshot showing a plot of the correlation matrix of features.

Beklendiği gibi, hata (IsFail) seçili özelliklerle (sütunlar) bağıntılı olur. Bağıntı Air_temperaturematrisi , Process_temperature, Rotational_speed, , Torqueve Tool_wear değişkenleriyle en yüksek bağıntıya IsFail sahip olduğunu gösterir.

# Plot histograms of select features
fig, axes = plt.subplots(2, 3, figsize=(18,10))
columns = ['Air_temperature_[K]', 'Process_temperature_[K]', 'Rotational_speed_[rpm]', 'Torque_[Nm]', 'Tool_wear_[min]']
data=df.copy()
for ind, item in enumerate (columns):
    column = columns[ind]
    df_column = data[column]
    df_column.hist(ax = axes[ind%2][ind//2], bins=32).set_title(item)
fig.supylabel('count')
fig.subplots_adjust(hspace=0.2)
fig.delaxes(axes[1,2])

Screenshot showing a graph plot of the features.

Çizilen grafiklerde gösterildiği gibi, Air_temperature, Process_temperature, Rotational_speed, Torqueve Tool_wear değişkenleri seyrek değildir. Özellik alanında iyi bir sürekliliğe sahip gibi görünüyorlar. Bu çizimler, bu veri kümesindeki bir makine öğrenmesi modelini eğitmek büyük olasılıkla yeni bir veri kümesine genelleştirilebilen güvenilir sonuçlar üretir.

Sınıf dengesizliği için hedef değişkeni inceleme

Başarısız ve korumasız makineler için örnek sayısını sayın ve her sınıf için veri bakiyesini inceleyin (IsFail=0, IsFail=1):

# Plot the counts for no failure and each failure type
plt.figure(figsize=(12, 2))
ax = sns.countplot(x='Failure_Type', data=df)
for p in ax.patches:
    ax.annotate(f'{p.get_height()}', (p.get_x()+0.4, p.get_height()+50))

plt.show()

# Plot the counts for no failure versus the sum of all failure types
plt.figure(figsize=(4, 2))
ax = sns.countplot(x='IsFail', data=df)
for p in ax.patches:
    ax.annotate(f'{p.get_height()}', (p.get_x()+0.4, p.get_height()+50))

plt.show()

Screenshot of a plot showing that samples are imbalanced.

Çizimler hata yok sınıfının (ikinci çizimde gösterildiği gibi IsFail=0 ) örneklerin çoğunu oluşturduğunu gösterir. Daha dengeli bir eğitim veri kümesi oluşturmak için bir fazla örnekleme tekniği kullanın:

# Separate features and target
features = df[['Type', 'Air_temperature_[K]', 'Process_temperature_[K]', 'Rotational_speed_[rpm]', 'Torque_[Nm]', 'Tool_wear_[min]']]
labels = df['IsFail']

# Split the dataset into the training and testing sets
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

# Ignore warnings
import warnings
warnings.filterwarnings('ignore')
# Save test data to the lakehouse for use in future sections
table_name = "predictive_maintenance_test_data"
df_test_X = spark.createDataFrame(X_test)
df_test_X.write.mode("overwrite").format("delta").save(f"Tables/{table_name}")
print(f"Spark DataFrame saved to delta table: {table_name}")

Eğitim veri kümesindeki sınıfları dengelemek için fazla örnekleme

Önceki analiz, veri kümesinin yüksek düzeyde dengesiz olduğunu gösterdi. Azınlık sınıfının karar sınırını etkili bir şekilde öğrenemeyecek kadar az örneği olduğundan bu dengesizlik bir sorun haline gelir.

SMOTE sorunu çözebilir. SMOTE, yapay örnekler oluşturan yaygın olarak kullanılan bir oversampling tekniğidir. Veri noktaları arasındaki Öklidyen mesafeleri temel alarak azınlık sınıfı için örnekler oluşturur. Bu yöntem, yalnızca azınlık sınıfını çoğaltmayan yeni örnekler oluşturduğundan rastgele aşırı örneklemeden farklıdır. yöntemi, dengesiz veri kümelerini işlemek için daha etkili bir teknik haline gelir.

# Disable MLflow autologging because you don't want to track SMOTE fitting
import mlflow

mlflow.autolog(disable=True)

from imblearn.combine import SMOTETomek
smt = SMOTETomek(random_state=SEED)
X_train_res, y_train_res = smt.fit_resample(X_train, y_train)

# Plot the counts for both classes
plt.figure(figsize=(4, 2))
ax = sns.countplot(x='IsFail', data=pd.DataFrame({'IsFail': y_train_res.values}))
for p in ax.patches:
    ax.annotate(f'{p.get_height()}', (p.get_x()+0.4, p.get_height()+50))

plt.show()

Screenshot of a plot showing that samples are balanced.

Veri kümesini başarıyla dengelediyseniz. Artık model eğitimine geçebilirsiniz.

4. Adım: Modelleri eğitme ve değerlendirme

MLflow modelleri kaydeder, çeşitli modelleri eğitip karşılaştırır ve tahmin amacıyla en iyi modeli seçer. Model eğitimi için aşağıdaki üç modeli kullanabilirsiniz:

  • Rastgele orman sınıflandırıcısı
  • Lojistik regresyon sınıflandırıcısı
  • XGBoost sınıflandırıcısı

Rastgele bir orman sınıflandırıcısı eğitin

import numpy as np 
from sklearn.ensemble import RandomForestClassifier
from mlflow.models.signature import infer_signature
from sklearn.metrics import f1_score, accuracy_score, recall_score

mlflow.set_experiment("Machine_Failure_Classification")
mlflow.autolog(exclusive=False) # This is needed to override the preconfigured autologging behavior

with mlflow.start_run() as run:
    rfc_id = run.info.run_id
    print(f"run_id {rfc_id}, status: {run.info.status}")
    rfc = RandomForestClassifier(max_depth=5, n_estimators=50)
    rfc.fit(X_train_res, y_train_res) 
    signature = infer_signature(X_train_res, y_train_res)

    mlflow.sklearn.log_model(
        rfc,
        "machine_failure_model_rf",
        signature=signature,
        registered_model_name="machine_failure_model_rf"
    ) 

    y_pred_train = rfc.predict(X_train)
    # Calculate the classification metrics for test data
    f1_train = f1_score(y_train, y_pred_train, average='weighted')
    accuracy_train = accuracy_score(y_train, y_pred_train)
    recall_train = recall_score(y_train, y_pred_train, average='weighted')

    # Log the classification metrics to MLflow
    mlflow.log_metric("f1_score_train", f1_train)
    mlflow.log_metric("accuracy_train", accuracy_train)
    mlflow.log_metric("recall_train", recall_train)

    # Print the run ID and the classification metrics
    print("F1 score_train:", f1_train)
    print("Accuracy_train:", accuracy_train)
    print("Recall_train:", recall_train)    

    y_pred_test = rfc.predict(X_test)
    # Calculate the classification metrics for test data
    f1_test = f1_score(y_test, y_pred_test, average='weighted')
    accuracy_test = accuracy_score(y_test, y_pred_test)
    recall_test = recall_score(y_test, y_pred_test, average='weighted')

    # Log the classification metrics to MLflow
    mlflow.log_metric("f1_score_test", f1_test)
    mlflow.log_metric("accuracy_test", accuracy_test)
    mlflow.log_metric("recall_test", recall_test)

    # Print the classification metrics
    print("F1 score_test:", f1_test)
    print("Accuracy_test:", accuracy_test)
    print("Recall_test:", recall_test)

Çıktıdan, hem eğitim hem de test veri kümeleri rastgele orman sınıflandırıcısını kullanırken F1 puanı, doğruluğu ve yaklaşık 0,9'un geri çekmesini sağlar.

Lojistik regresyon sınıflandırıcıyı eğitme

from sklearn.linear_model import LogisticRegression

with mlflow.start_run() as run:
    lr_id = run.info.run_id
    print(f"run_id {lr_id}, status: {run.info.status}")
    lr = LogisticRegression(random_state=42)
    lr.fit(X_train_res, y_train_res)
    signature = infer_signature(X_train_res, y_train_res)
  
    mlflow.sklearn.log_model(
        lr,
        "machine_failure_model_lr",
        signature=signature,
        registered_model_name="machine_failure_model_lr"
    ) 

    y_pred_train = lr.predict(X_train)
    # Calculate the classification metrics for training data
    f1_train = f1_score(y_train, y_pred_train, average='weighted')
    accuracy_train = accuracy_score(y_train, y_pred_train)
    recall_train = recall_score(y_train, y_pred_train, average='weighted')

    # Log the classification metrics to MLflow
    mlflow.log_metric("f1_score_train", f1_train)
    mlflow.log_metric("accuracy_train", accuracy_train)
    mlflow.log_metric("recall_train", recall_train)

    # Print the run ID and the classification metrics
    print("F1 score_train:", f1_train)
    print("Accuracy_train:", accuracy_train)
    print("Recall_train:", recall_train)    

    y_pred_test = lr.predict(X_test)
    # Calculate the classification metrics for test data
    f1_test = f1_score(y_test, y_pred_test, average='weighted')
    accuracy_test = accuracy_score(y_test, y_pred_test)
    recall_test = recall_score(y_test, y_pred_test, average='weighted')

    # Log the classification metrics to MLflow
    mlflow.log_metric("f1_score_test", f1_test)
    mlflow.log_metric("accuracy_test", accuracy_test)
    mlflow.log_metric("recall_test", recall_test)

XGBoost sınıflandırıcıyı eğitin

from xgboost import XGBClassifier

with mlflow.start_run() as run:
    xgb = XGBClassifier()
    xgb_id = run.info.run_id 
    print(f"run_id {xgb_id}, status: {run.info.status}")
    xgb.fit(X_train_res.to_numpy(), y_train_res.to_numpy()) 
    signature = infer_signature(X_train_res, y_train_res)
  
    mlflow.xgboost.log_model(
        xgb,
        "machine_failure_model_xgb",
        signature=signature,
        registered_model_name="machine_failure_model_xgb"
    ) 

    y_pred_train = xgb.predict(X_train)
    # Calculate the classification metrics for training data
    f1_train = f1_score(y_train, y_pred_train, average='weighted')
    accuracy_train = accuracy_score(y_train, y_pred_train)
    recall_train = recall_score(y_train, y_pred_train, average='weighted')

    # Log the classification metrics to MLflow
    mlflow.log_metric("f1_score_train", f1_train)
    mlflow.log_metric("accuracy_train", accuracy_train)
    mlflow.log_metric("recall_train", recall_train)

    # Print the run ID and the classification metrics
    print("F1 score_train:", f1_train)
    print("Accuracy_train:", accuracy_train)
    print("Recall_train:", recall_train)    

    y_pred_test = xgb.predict(X_test)
    # Calculate the classification metrics for test data
    f1_test = f1_score(y_test, y_pred_test, average='weighted')
    accuracy_test = accuracy_score(y_test, y_pred_test)
    recall_test = recall_score(y_test, y_pred_test, average='weighted')

    # Log the classification metrics to MLflow
    mlflow.log_metric("f1_score_test", f1_test)
    mlflow.log_metric("accuracy_test", accuracy_test)
    mlflow.log_metric("recall_test", recall_test)

5. Adım: En iyi modeli seçin ve çıkışları tahmin edin

Önceki bölümde üç farklı sınıflandırıcı eğittiniz: rastgele orman, lojistik regresyon ve XGBoost. Artık sonuçlara program aracılığıyla erişme veya kullanıcı arabirimini (UI) kullanma seçeneğiniz vardır.

Kullanıcı arabirimi yolu seçeneği için çalışma alanınıza gidin ve modelleri filtreleyin.

Screenshot of the filter, with models selected.

Model performansının ayrıntıları için tek tek modelleri seçin.

Screenshot of performance details for models.

Bu örnekte MLflow aracılığıyla modellere program aracılığıyla nasıl erişilir gösterilmektedir:

runs = {'random forest classifier':   rfc_id,
        'logistic regression classifier': lr_id,
        'xgboost classifier': xgb_id}

# Create an empty DataFrame to hold the metrics
df_metrics = pd.DataFrame()

# Loop through the run IDs and retrieve the metrics for each run
for run_name, run_id in runs.items():
    metrics = mlflow.get_run(run_id).data.metrics
    metrics["run_name"] = run_name
    df_metrics = df_metrics.append(metrics, ignore_index=True)

# Print the DataFrame
print(df_metrics)

XGBoost eğitim kümesinde en iyi sonuçları verse de test veri kümesinde kötü performans gösterir. Bu düşük performans fazla uygun olduğunu gösterir. Lojistik regresyon sınıflandırıcısı hem eğitim hem de test veri kümelerinde kötü performans gösterir. Genel olarak rastgele orman, eğitim performansı ile fazla uygunluktan kaçınma arasında iyi bir denge oluşturur.

Sonraki bölümde kayıtlı rastgele orman modelini seçin ve PREDICT özelliğiyle bir tahmin gerçekleştirin:

from synapse.ml.predict import MLFlowTransformer

model = MLFlowTransformer(
    inputCols=list(X_test.columns),
    outputCol='predictions',
    modelName='machine_failure_model_rf',
    modelVersion=1
)

MLFlowTransformer Modeli çıkarım için yüklemek üzere oluşturduğunuz nesneyle transformer API'sini kullanarak test veri kümesinde modeli puanlama:

predictions = model.transform(spark.createDataFrame(X_test))
predictions.show()

Bu tabloda çıkış gösterilmektedir:

Tür Air_temperature_[K] Process_temperature_[K] Rotational_speed_[rpm] Torque_[Nm] Tool_wear_[min] Öngörüler
0 300.6 309.7 1639.0 30.4 121.0 0
0 303.9 313.0 1551.0 36,8 140.0 0
1 299.1 308.6 1491.0 38.5 166.0 0
0 300.9 312.1 1359.0 51.7 146.0 1
0 303.7 312.6 1621.0 38.8 182.0 0
0 299.0 310.3 1868.0 24.0 221.0 1
2 297.8 307.5 1631.0 31.3 124.0 0
0 297.5 308.2 1327.0 56.5 189.0 1
0 301.3 310.3 1460.0 41.5 197.0 0
2 297.6 309.0 1413.0 40.2 51.0 0
1 300.9 309.4 1724.0 25.6 119.0 0
0 303.3 311.3 1389.0 53.9 39.0 0
0 298.4 307.9 1981.0 23,2 16.0 0
0 299.3 308.8 1636.0 29.9 201.0 0
1 298.1 309.2 1460.0 45.8 80,0 0
0 300.0 309.5 1728.0 26.0 37.0 0
2 299.0 308.7 1940.0 19.9 98.0 0
0 302.2 310.8 1383.0 46.9 45.0 0
0 300.2 309.2 1431.0 51.3 57.0 0
0 299.6 310.2 1468.0 48.0 9.0 0

Verileri lakehouse'a kaydedin. Daha sonra veriler daha sonra kullanılabilir duruma gelir ( örneğin, bir Power BI panosu).

# Save test data to the lakehouse for use in the next section. 
table_name = "predictive_maintenance_test_with_predictions"
predictions.write.mode("overwrite").format("delta").save(f"Tables/{table_name}")
print(f"Spark DataFrame saved to delta table: {table_name}")

6. Adım: Power BI'da görselleştirmeler aracılığıyla iş zekası görüntüleme

Power BI panosuyla sonuçları çevrimdışı biçimde gösterin.

Screenshot of the data displayed as a Power BI dashboard.

Pano, 2. adımda önceki bağıntı Tool_wear Torque analizinden beklendiği gibi başarısız ve bozulmamış durumlar arasında fark edilebilir bir sınır oluşturduğunu gösterir.