Κοινή χρήση μέσω


Εκμάθηση: δημιουργία, αξιολόγηση και βαθμολογία ενός μοντέλου εντοπισμού σφαλμάτων μηχανής

Αυτό το εκπαιδευτικό βοήθημα παρουσιάζει ένα τελικό παράδειγμα μιας ροής εργασιών Synapse Data Science στο Microsoft Fabric. Το σενάριο χρησιμοποιεί την εκμάθηση μηχανής για μια πιο συστηματική προσέγγιση στη διάγνωση σφαλμάτων, για τον προληπτικό εντοπισμό προβλημάτων και την ανάληψη ενεργειών πριν από μια πραγματική αποτυχία μηχανής. Ο στόχος είναι να προβλέψετε εάν μια μηχανή θα αντιμετωπίσει μια αποτυχία με βάση τη θερμοκρασία διαδικασίας, την ταχύτητα περιστροφής κ.λπ.

Αυτό το εκπαιδευτικό βοήθημα καλύπτει τα εξής βήματα:

  • Εγκατάσταση προσαρμοσμένων βιβλιοθηκών
  • Φόρτωση και επεξεργασία των δεδομένων
  • Κατανόηση των δεδομένων μέσω διερευνητικής ανάλυσης δεδομένων
  • Χρησιμοποιήστε τα scikit-learn, LightGBM και MLflow για να εκπαιδεύσετε μοντέλα εκμάθησης μηχανής και χρησιμοποιήστε τη δυνατότητα Αυτόματη καταχώρηση Fabric για την παρακολούθηση πειραμάτων
  • Βαθμολογήστε τα εκπαιδευμένα μοντέλα με τη δυνατότητα Fabric PREDICT, αποθηκεύστε το καλύτερο μοντέλο και φορτώστε αυτό το μοντέλο για προβλέψεις
  • Εμφάνιση των επιδόσεων του φορτωμένου μοντέλου με απεικονίσεις του Power BI

Προϋποθέσεις

  • Λάβετε μια συνδρομής Microsoft Fabric . Εναλλακτικά, εγγραφείτε για μια δωρεάν δοκιμαστική έκδοση microsoft Fabric.

  • Εισέλθετε για να το Microsoft Fabric.

  • Χρησιμοποιήστε την εναλλαγή εμπειρίας στην κάτω αριστερή πλευρά της αρχικής σελίδας σας για να μεταβείτε σε Fabric.

    Στιγμιότυπο οθόνης του μενού εναλλαγής εμπειρίας, που εμφανίζει πού μπορείτε να επιλέξετε Επιστήμη δεδομένων.

Παρακολούθηση σε σημειωματάριο

Μπορείτε να κάνετε μία από αυτές τις επιλογές για να ακολουθήσετε τις οδηγίες σε ένα σημειωματάριο:

  • Ανοίξτε και εκτελέστε το ενσωματωμένο σημειωματάριο.
  • Αποστείλετε το σημειωματάριό σας από το GitHub.

Άνοιγμα του ενσωματωμένου σημειωματάριου

Το δείγμα την αποτυχία υπολογιστή σημειωματάριο συνοδεύει αυτό το πρόγραμμα εκμάθησης.

  1. Για να ανοίξετε το δείγμα σημειωματάριου για αυτό το εκπαιδευτικό βοήθημα, ακολουθήστε τις οδηγίες στο Προετοιμασία του συστήματός σας για εκπαιδευτικά βοηθήματα επιστήμης δεδομένων.

  2. Βεβαιωθείτε ότι επισυνάψετε μια λίμνη στο σημειωματάριο προτού ξεκινήσετε την εκτέλεση κώδικα.

Εισαγωγή του σημειωματάριου από το GitHub

Το σημειωματάριο AISample - προγνωστική συντήρηση συνοδεύει αυτό το πρόγραμμα εκμάθησης.

Βήμα 1: Εγκατάσταση προσαρμοσμένων βιβλιοθηκών

Για την ανάπτυξη μοντέλου εκμάθησης μηχανής ή την ανάλυση δεδομένων ad-hoc, ίσως χρειαστεί να εγκαταστήσετε γρήγορα μια προσαρμοσμένη βιβλιοθήκη για την περίοδο λειτουργίας Apache Spark. Έχετε δύο επιλογές για την εγκατάσταση βιβλιοθηκών.

  • Χρησιμοποιήστε τις δυνατότητες ενσωματωμένης εγκατάστασης (%pip ή %conda) του σημειωματάριού σας για να εγκαταστήσετε μια βιβλιοθήκη, μόνο στο τρέχον σημειωματάριό σας.
  • Εναλλακτικά, μπορείτε να δημιουργήσετε ένα περιβάλλον Fabric, να εγκαταστήσετε βιβλιοθήκες από δημόσιες προελεύσεις ή να αποστείλετε προσαρμοσμένες βιβλιοθήκες σε αυτό και, στη συνέχεια, ο διαχειριστής του χώρου εργασίας σας μπορεί να συνδέσει το περιβάλλον ως προεπιλογή για τον χώρο εργασίας. Στη συνέχεια, όλες οι βιβλιοθήκες στο περιβάλλον θα γίνουν διαθέσιμες για χρήση σε οποιαδήποτε σημειωματάρια και ορισμούς εργασίας Spark στον χώρο εργασίας. Για περισσότερες πληροφορίες σχετικά με τα περιβάλλοντα, ανατρέξτε στο θέμα δημιουργία, ρύθμιση παραμέτρων και χρήση περιβάλλοντος στο Microsoft Fabric.

Για αυτή την εκμάθηση, χρησιμοποιήστε %pip install για να εγκαταστήσετε τη βιβλιοθήκη imblearn στο σημειωματάριό σας.

Σημείωση

Ο πυρήνας του PySpark επανεκκινείται μετά την %pip install εκτελέσεων. Εγκαταστήστε τις απαραίτητες βιβλιοθήκες πριν εκτελέσετε οποιαδήποτε άλλα κελιά.

# Use pip to install imblearn
%pip install imblearn

Βήμα 2: Φόρτωση των δεδομένων

Το σύνολο δεδομένων προσομοιώνει την καταγραφή των παραμέτρων μιας μηχανής παραγωγής ως συνάρτηση του χρόνου, κάτι που είναι σύνηθες στις βιομηχανικές ρυθμίσεις. Αποτελείται από 10.000 σημεία δεδομένων αποθηκευμένα ως γραμμές με δυνατότητες ως στήλες. Οι δυνατότητες περιλαμβάνουν:

  • Ένα μοναδικό αναγνωριστικό (UID) που κυμαίνεται από 1 έως 10000

  • Αναγνωριστικό προϊόντος, που αποτελείται από γράμμα L (για χαμηλό), M (για μεσαίο) ή H (για υψηλό), για την υπόδειξη της παραλλαγής της ποιότητας του προϊόντος και έναν σειριακό αριθμό συγκεκριμένης παραλλαγής. Παραλλαγές χαμηλής, μεσαίας και υψηλής ποιότητας αποτελούν 60%, 30%και 10% όλων των προϊόντων, αντίστοιχα

  • Θερμοκρασία του αέρα, σε βαθμούς Κέλβιν (K)

  • Θερμοκρασία διαδικασίας, σε βαθμούς Κέλβιν

  • Ταχύτητα περιστροφής, σε επαναστάσεις ανά λεπτό (RPM)

  • Ροπή, σε Newton-Meters (Nm)

  • Χρήση εργαλείου, σε λίγα λεπτά. Οι παραλλαγές ποιότητας H, M και L προσθέτουν 5, 3 και 2 λεπτά φθοράς του εργαλείου αντίστοιχα στο εργαλείο που χρησιμοποιείται στη διαδικασία

  • Μια Ετικέτα αποτυχίας υπολογιστή, η οποία υποδεικνύει εάν ο υπολογιστής απέτυχε στο συγκεκριμένο σημείο δεδομένων. Αυτό το συγκεκριμένο σημείο δεδομένων μπορεί να έχει οποιαδήποτε από τις παρακάτω πέντε ανεξάρτητες λειτουργίες αποτυχίας:

    • Αποτυχία φθοράς εργαλείου (TWF): Το εργαλείο αντικαθίσταται ή αποτυγχάνει σε έναν τυχαία επιλεγμένο χρόνο φθοράς του εργαλείου, μεταξύ 200 και 240 λεπτών
    • Αποτυχία διακοπής της θερμότητας (HDF): Η διασπορά της θερμότητας προκαλεί αποτυχία της διαδικασίας εάν η διαφορά μεταξύ της θερμοκρασίας του αέρα και της θερμοκρασίας της διαδικασίας είναι μικρότερη από 8,6 K και η ταχύτητα περιστροφής του εργαλείου είναι μικρότερη από 1380 RPM
    • Power Failure (PWF): το γινόμενο της ροπής και της ταχύτητας περιστροφής (σε ακτίνες) ισούται με την ισχύ που απαιτείται για τη διαδικασία. Η διαδικασία αποτυγχάνει εάν αυτή η ισχύς πέσει κάτω από τα 3.500 W ή υπερβεί τα 9.000 W
    • Αποτυχία overStrain (OSF): εάν το προϊόν φθοράς και ροπής εργαλείου υπερβαίνει τα 11.000 ελάχιστα Nm για την παραλλαγή του προϊόντος L (12.000 για την M, 13.000 για την H), η διαδικασία αποτυγχάνει λόγω υπερπεριοχής
    • Τυχαίες αποτυχίες (RNF): κάθε διαδικασία έχει πιθανότητα αποτυχίας 0,1%, ανεξάρτητα από τις παραμέτρους της διαδικασίας

Σημείωση

Εάν τουλάχιστον μία από τις παραπάνω λειτουργίες αποτυχίας είναι true, η διαδικασία αποτυγχάνει και η ετικέτα "αποτυχία μηχανής" ορίζεται σε 1. Η μέθοδος εκμάθησης μηχανής δεν μπορεί να προσδιορίσει ποια λειτουργία αποτυχίας προκάλεσε την αποτυχία της διαδικασίας.

Λήψη του συνόλου δεδομένων και αποστολή στο lakehouse

Συνδεθείτε στο κοντέινερ Azure Open Datasets και φορτώστε το σύνολο δεδομένων Προγνωστική συντήρηση. Αυτός ο κώδικας κάνει λήψη μιας δημόσια διαθέσιμης έκδοσης του συνόλου δεδομένων και, στη συνέχεια, τον αποθηκεύει σε μια λίμνη Fabric:

Σημαντικός

Προσθέστε μια λίμνη στο σημειωματάριο προτού το εκτελέσετε. Διαφορετικά, θα λάβετε ένα σφάλμα. Για πληροφορίες σχετικά με την προσθήκη μιας λίμνης, ανατρέξτε στο θέμα Σύνδεση λιμνών και σημειωματάριων.

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

Μετά τη λήψη του συνόλου δεδομένων στο lakehouse, μπορείτε να το φορτώσετε ως Spark DataFrame:

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

Αυτός ο πίνακας εμφανίζει μια προεπισκόπηση των δεδομένων:

UDI Αναγνωριστικό προϊόντος Δακτυλογραφώ Θερμοκρασία αέρα [K] Θερμοκρασία διεργασίας [K] Ταχύτητα περιστροφής [rpm] Ροπή [Nm] Χρήση εργαλείου [λεπτά] Στόχος Τύπος αποτυχίας
1 M14860 M 298.1 308.6 1551 42.8 0 0 Καμία αποτυχία
2 L47181 L 298.2 308.7 1408 46.3 3 0 Καμία αποτυχία
3 L47182 L 298.1 308.5 1498 49.4 5 0 Καμία αποτυχία
4 L47183 L 298.2 308.6 1433 39.5 7 0 Καμία αποτυχία
5 L47184 L 298.2 308.7 1408 40.0 9 0 Καμία αποτυχία

Γράψτε ένα Spark DataFrame σε έναν πίνακα δέλτα lakehouse

Μορφοποιήστε τα δεδομένα (για παράδειγμα, αντικαταστήστε τα διαστήματα με χαρακτήρες υπογράμμισης) για να διευκολύνετε τις λειτουργίες Spark στα επόμενα βήματα:

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

Αυτός ο πίνακας εμφανίζει μια προεπισκόπηση των δεδομένων με αναδιαμορφωμένα ονόματα στηλών:

UDI Product_ID Δακτυλογραφώ Air_temperature_[K] Process_temperature_[K] Rotational_speed_[rpm] Torque_[Nm] Tool_wear_[λεπτά] Στόχος Failure_Type
1 M14860 M 298.1 308.6 1551 42.8 0 0 Καμία αποτυχία
2 L47181 L 298.2 308.7 1408 46.3 3 0 Καμία αποτυχία
3 L47182 L 298.1 308.5 1498 49.4 5 0 Καμία αποτυχία
4 L47183 L 298.2 308.6 1433 39.5 7 0 Καμία αποτυχία
5 L47184 L 298.2 308.7 1408 40.0 9 0 Καμία αποτυχία
# 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: Προεπεξεργασία δεδομένων και εκτέλεση διερευνητικής ανάλυσης δεδομένων

Μετατρέψτε το Spark DataFrame σε ένα dataFrame pandas, για να χρησιμοποιήσετε δημοφιλείς βιβλιοθήκες σχεδίασης συμβατές με Pandas.

Φιλοδώρημα

Για ένα μεγάλο σύνολο δεδομένων, ίσως χρειαστεί να φορτώσετε ένα τμήμα αυτού του συνόλου δεδομένων.

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

Μετατρέψτε συγκεκριμένες στήλες του συνόλου δεδομένων σε κινητή υποδιαστολή ή ακέραιους τύπους όπως απαιτείται και συμβολοσειρές χάρτη ('L', 'M', 'H') σε αριθμητικές τιμές (0, 1, 2):

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

Εξερεύνηση δεδομένων μέσω απεικονίσεων

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

Στιγμιότυπο οθόνης που εμφανίζει μια σχεδίαση της μήτρας συσχέτισης δυνατοτήτων.

Όπως αναμενόταν, η αποτυχία (IsFail) συσχετίζεται με τις επιλεγμένες δυνατότητες (στήλες). Ο πίνακας συσχέτισης δείχνει ότι Air_temperature, Process_temperature, Rotational_speed, Torqueκαι Tool_wear έχουν τη μεγαλύτερη συσχέτιση με τη μεταβλητή IsFail.

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

Στιγμιότυπο οθόνης που εμφανίζει ένα γράφημα με τις δυνατότητες.

Όπως δείχνουν τα γραφήματα σχεδίασης, οι μεταβλητές Air_temperature, Process_temperature, Rotational_speed, Torqueκαι Tool_wear δεν είναι αραιές. Φαίνεται να έχουν καλή συνέχεια στο χώρο του χαρακτηριστικού. Αυτά τα γραφήματα επιβεβαιώνουν ότι η εκπαίδευση ενός μοντέλου εκμάθησης μηχανής σε αυτό το σύνολο δεδομένων πιθανώς παράγει αξιόπιστα αποτελέσματα που μπορούν να γενικεύσουν σε ένα νέο σύνολο δεδομένων.

Έλεγχος της μεταβλητής προορισμού για ανισορροπία κλάσης

Μετρήστε τον αριθμό των δειγμάτων για τις μηχανές που απέτυχαν και δεν ήταν σε κατάσταση χρήσης και εξετάστε την ισορροπία δεδομένων για κάθε κλάση (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()

Στιγμιότυπο οθόνης μιας σχεδίασης που δείχνει ότι τα δείγματα δεν είναι ισορροπημένες.

Τα γραφήματα υποδεικνύουν ότι η κλάση no-failure (που εμφανίζεται ως IsFail=0 στη δεύτερη σχεδίαση) αποτελεί τα περισσότερα δείγματα. Χρησιμοποιήστε μια τεχνική υπερ-χρήσης για να δημιουργήσετε ένα πιο ισορροπημένο σύνολο δεδομένων εκπαίδευσης:

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

Υπερδείγματα για την εξισορρόπηση των κλάσεων στο σύνολο δεδομένων εκπαίδευσης

Η προηγούμενη ανάλυση έδειξε ότι το σύνολο δεδομένων είναι εξαιρετικά μη ισορροπημένες. Αυτή η ανισορροπία μετατρέπεται σε πρόβλημα, επειδή η μειονοτική τάξη έχει πολύ λίγα παραδείγματα για το μοντέλο για να μάθει αποτελεσματικά τα όρια απόφασης.

ΟΤΕ μπορεί να λύσει το πρόβλημα. Το SMOTE είναι μια ευρέως χρησιμοποιούμενη τεχνική υπερ-χρήσης που δημιουργεί συνθετικά παραδείγματα. Δημιουργεί παραδείγματα για την κλάση μειοψηφικής ομάδας με βάση τις ευκλείδωτες αποστάσεις μεταξύ σημείων δεδομένων. Αυτή η μέθοδος διαφέρει από την τυχαία υπερ-πωλήσεις, επειδή δημιουργεί νέα παραδείγματα που δεν αναπαράγουν απλώς την κλάση μειονότητας. Η μέθοδος γίνεται μια πιο αποτελεσματική τεχνική για τον χειρισμό μη ισορροπημένων συνόλων δεδομένων.

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

Στιγμιότυπο οθόνης μιας σχεδίασης που δείχνει ότι τα δείγματα είναι ισορροπημένα.

Ισορροπείτε με επιτυχία το σύνολο δεδομένων. Τώρα, μπορείτε να προχωρήσετε στην εκπαίδευση μοντέλου.

Βήμα 4: Εκπαίδευση και αξιολόγηση των μοντέλων

MLflow καταγράφει μοντέλα, εκπαιδεύει και συγκρίνει διάφορα μοντέλα και επιλέγει το καλύτερο μοντέλο για σκοπούς πρόβλεψης. Μπορείτε να χρησιμοποιήσετε τα παρακάτω τρία μοντέλα για εκπαίδευση μοντέλου:

  • Τυχαίος αλγόριθμος ταξινόμησης δασών
  • Αλγόριθμος ταξινόμησης λογιστικής παλινδρόμησης
  • Αλγόριθμος ταξινόμησης XGBoost

Εκπαίδευση τυχαίου αλγόριθμου ταξινόμησης δασών

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)

Από την έξοδο, τόσο τα σύνολα δεδομένων εκπαίδευσης όσο και δοκιμής αποδίδουν βαθμολογία F1, ακρίβεια και ανάκληση περίπου 0,9 όταν χρησιμοποιείται ο τυχαίος αλγόριθμος ταξινόμησης δασών.

Εκπαίδευση ενός αλγόριθμου ταξινόμησης λογιστικής παλινδρόμησης

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

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: Επιλέξτε το καλύτερο μοντέλο και προβλέψτε τις εξόδους

Στην προηγούμενη ενότητα, εκπαιδεύσατε τρεις διαφορετικούς αλγόριθμους ταξινόμησης: τυχαίο δάσος, λογιστική παλινδρόμηση και XGBoost. Τώρα έχετε την επιλογή να αποκτήσετε πρόσβαση στα αποτελέσματα μέσω προγραμματισμού ή να χρησιμοποιήσετε το περιβάλλον εργασίας χρήστη (UI).

Για την επιλογή διαδρομής περιβάλλοντος εργασίας χρήστη, μεταβείτε στον χώρο εργασίας σας και φιλτράρετε τα μοντέλα.

Στιγμιότυπο οθόνης του φίλτρου, με επιλεγμένα μοντέλα.

Επιλέξτε μεμονωμένα μοντέλα για λεπτομέρειες σχετικά με τις επιδόσεις του μοντέλου.

Στιγμιότυπο οθόνης των λεπτομερειών απόδοσης για μοντέλα.

Αυτό το παράδειγμα δείχνει πώς μπορείτε να αποκτήσετε πρόσβαση μέσω προγραμματισμού στα μοντέλα μέσω MLflow:

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 αποδίδει τα καλύτερα αποτελέσματα στο σύνολο εκπαίδευσης, δεν αποδίδει καλά στο σύνολο δεδομένων δοκιμής. Αυτή η κακή απόδοση υποδεικνύει υπερβολική τοποθέτηση. Ο αλγόριθμος ταξινόμησης λογιστικής παλινδρόμησης δεν αποδίδει καλά τόσο στα σύνολα δεδομένων εκπαίδευσης όσο και δοκιμής. Συνολικά, τα τυχαία δάση επιτυγχάνει μια καλή ισορροπία μεταξύ των επιδόσεων εκπαίδευσης και της αποφυγής της υπερορθόδοσης.

Στην επόμενη ενότητα, επιλέξτε το καταχωρημένο τυχαίο μοντέλο δάσους και εκτελέστε μια πρόβλεψη με τη δυνατότητα ΠΡΌΒΛΕΨΗ:

from synapse.ml.predict import MLFlowTransformer

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

Με το αντικείμενο MLFlowTransformer που δημιουργήσατε για να φορτώσετε το μοντέλο για συμπεραίωση, χρησιμοποιήστε το API Transformer για να βαθμολογήσετε το μοντέλο στο σύνολο δεδομένων δοκιμής:

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

Αυτός ο πίνακας εμφανίζει το αποτέλεσμα:

Δακτυλογραφώ Air_temperature_[K] Process_temperature_[K] Rotational_speed_[rpm] Torque_[Nm] Tool_wear_[λεπτά] Προβλέψεις
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

Αποθηκεύστε τα δεδομένα στο lakehouse. Τα δεδομένα, στη συνέχεια, γίνονται διαθέσιμα για μεταγενέστερες χρήσεις - για παράδειγμα, έναν πίνακα εργαλείων Power BI.

# 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: Προβολή επιχειρηματικής ευφυΐας μέσω απεικονίσεων στο Power BI

Εμφανίστε τα αποτελέσματα σε μια μορφή εκτός σύνδεσης, με έναν πίνακα εργαλείων Power BI.

Στιγμιότυπο οθόνης των δεδομένων που εμφανίζονται ως πίνακας εργαλείων του Power BI.

Ο πίνακας εργαλείων εμφανίζει ότι οι Tool_wear και Torque δημιουργούν ένα αισθητό όριο μεταξύ αποτυχημένων και μη αποτυχημένων υποθέσεων, όπως αναμένεται από την προηγούμενη ανάλυση συσχέτισης στο βήμα 2.