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

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

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

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

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

  • Αποκτήστε συνδρομή Microsoft Fabric. Εναλλακτικά, εγγραφείτε για μια δωρεάν δοκιμή Microsoft Fabric.

  • Συνδεθείτε στο Microsoft Fabric.

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

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

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

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

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

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

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

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

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

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

Ο φορητός υπολογιστής AIsample - Fraud Detection.ipynb συνοδεύει αυτό το σεμινάριο.

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

Για την ανάπτυξη μοντέλων machine learning ή την 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: Φόρτωση των δεδομένων

Το σύνολο δεδομένων ανίχνευσης απάτης περιέχει συναλλαγές με πιστωτικές κάρτες από τον Σεπτέμβριο του 2013 που πραγματοποίησαν οι Ευρωπαίοι κάτοχοι καρτών κατά τη διάρκεια δύο ημερών. Το σύνολο δεδομένων περιέχει μόνο αριθμητικές δυνατότητες, εξαιτίας ενός μετασχηματισμού "Ανάλυση κύριων στοιχείων" (PCA) που εφαρμόζεται στις αρχικές δυνατότητες. Το PCA μετασχηματίζει όλες τις δυνατότητες εκτός από Time και Amount. Για την προστασία της εμπιστευτικότητας, οι αρχικές δυνατότητες ή περισσότερες πληροφορίες παρασκηνίου σχετικά με το σύνολο δεδομένων δεν είναι διαθέσιμες.

Αυτές οι λεπτομέρειες περιγράφουν το σύνολο δεδομένων:

  • Τα V1χαρακτηριστικά , V2, V3, ..., V28 είναι τα κύρια συστατικά που λαμβάνονται με το PCA.
  • Η Time δυνατότητα περιέχει τα δευτερόλεπτα που έχουν περάσει μεταξύ μιας συναλλαγής και της πρώτης συναλλαγής στο σύνολο δεδομένων.
  • Η δυνατότητα Amount είναι το ποσό συναλλαγής. Μπορείτε να χρησιμοποιήσετε αυτήν τη δυνατότητα για εκμάθηση που εξαρτάται από το κόστος, για παράδειγμα.
  • Η Class στήλη είναι η μεταβλητή απόκρισης (στόχος). Έχει την αξία 1 της απάτης, και 0 όχι μόνο.

Μόνο 492 συναλλαγές, από τις 284.807 συναλλαγές συνολικά, είναι δόλιες. Το σύνολο δεδομένων είναι εξαιρετικά μη ισορροπημένο, επειδή η κλάση μειονότητας (δόλια) αντιπροσωπεύει μόνο περίπου 0,172% των δεδομένων.

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

Ώρα V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 Ποσό Κλάση
0 -1.3598071336738 -0.0727811733098497 2.53634673796914 1.37815522427443 -0.338320769942518 0.462387777762292 0.239598554061257 0.0986979012610507 0.363786969611213 0.0907941719789316 -0.551599533260813 -0.617800855762348 -0.991389847235408 -0.311169353699879 1.46817697209427 -0.470400525259478 0.207971241929242 0.0257905801985591 0.403992960255733 0.251412098239705 -0.018306777944153 0.277837575558899 -0.110473910188767 0.0669280749146731 0.128539358273528 -0.189114843888824 0.133558376740387 -0.0210530534538215 149.62 "0"
0 1.19185711131486 0.26615071205963 0.16648011335321 0.448154078460911 0.0600176492822243 -0.0823608088155687 -0.0788029833323113 0.0851016549148104 -0.255425128109186 -0.166974414004614 1.61272666105479 1.06523531137287 0.48909501589608 -0.143772296441519 0.635558093258208 0.463917041022171 -0.114804663102346 -0.183361270123994 -0.145783041325259 -0.0690831352230203 -0.225775248033138 -0.638671952771851 0.101288021253234 -0.339846475529127 0.167170404418143 0.125894532368176 -0.00898309914322813 0.0147241691924927 2.69 "0"

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

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

IS_CUSTOM_DATA = False  # If True, the dataset has to be uploaded manually

TARGET_COL = "Class"  # Target column name
IS_SAMPLE = False  # If True, use only <SAMPLE_ROWS> rows of data for training; otherwise, use all data
SAMPLE_ROWS = 5000  # If IS_SAMPLE is True, use only this number of rows for training

DATA_FOLDER = "Files/fraud-detection/"  # Folder with data files
DATA_FILE = "creditcard.csv"  # Data file name

EXPERIMENT_NAME = "aisample-fraud"  # MLflow experiment name

Αυτός ο κώδικας κάνει λήψη μιας δημόσια διαθέσιμης έκδοσης του συνόλου δεδομένων και, στη συνέχεια, την αποθηκεύει σε μια λίμνη Fabric.

Σημαντικός

Πριν εκτελέσετε το σημειωματάριο, προσθέστε ένα lakehouse. Διαφορετικά, λαμβάνετε ένα σφάλμα.

if not IS_CUSTOM_DATA:
    # Download data files into the lakehouse if they're not already there
    import os, requests

    remote_url = "https://synapseaisolutionsa.z13.web.core.windows.net/data/Credit_Card_Fraud_Detection"
    fname = "creditcard.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)
    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.")

Ρύθμιση παρακολούθησης πειραμάτων MLflow

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

Η εμπειρία Synapse Data Science στο Microsoft Fabric περιλαμβάνει μια δυνατότητα αυτόματης καταγραφής. Αυτή η δυνατότητα μειώνει την ποσότητα του κώδικα που απαιτείται για την αυτόματη καταγραφή των παραμέτρων, των μετρήσεων και των στοιχείων ενός μοντέλου machine learning κατά τη διάρκεια της εκπαίδευσης. Η δυνατότητα επεκτείνει τις δυνατότητες αυτόματης καταχώρησης ροής ML. Διαθέτει βαθιά ενοποίηση με την εμπειρία της επιστήμης δεδομένων.

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

Για να απενεργοποιήσετε Microsoft Fabric αυτόματη καταγραφή σε μια περίοδο λειτουργίας σημειωματαρίου, καλέστε mlflow.autolog() και ορίστε disable=True:

# Set up MLflow for experiment tracking
import mlflow

mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True)  # Disable MLflow autologging

Ανάγνωση ανεπεξέργαστων δεδομένων από το lakehouse

Αυτός ο κώδικας διαβάζει ανεπεξέργαστα δεδομένα από το lakehouse:

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

Βήμα 3: Εκτέλεση διερευνητικής ανάλυσης δεδομένων

Σε αυτή την ενότητα, θα εξερευνήσετε πρώτα τα ανεπεξέργαστα δεδομένα και τα στατιστικά στοιχεία υψηλού επιπέδου. Στη συνέχεια, για να μετασχηματίστε τα δεδομένα, μετατρέψτε τις στήλες στους σωστούς τύπους και μετατρέψτε τις από το Spark DataFrame σε ένα dataFrame pandas για ευκολότερη απεικόνιση. Τέλος, εξερευνάτε και απεικονίζετε τις κατανομές κλάσης στα δεδομένα.

Εμφάνιση ανεπεξέργαστων δεδομένων

  1. Εξερευνήστε τα ανεπεξέργαστα δεδομένα και προβάλετε στατιστικά στοιχεία υψηλού επιπέδου χρησιμοποιώντας την display εντολή. Για περισσότερες πληροφορίες σχετικά με την απεικόνιση δεδομένων, ανατρέξτε στο θέμα Απεικόνιση σημειωματαρίου στο Microsoft Fabric.

    display(df)
    
  2. Εκτυπώστε ορισμένες βασικές πληροφορίες σχετικά με το σύνολο δεδομένων:

    # Print dataset basic information
    print("records read: " + str(df.count()))
    print("Schema: ")
    df.printSchema()
    

Μετασχηματισμός των δεδομένων

  1. Μετατρέψτε τις στήλες συνόλου δεδομένων στους σωστούς τύπους:

    import pyspark.sql.functions as F
    
    df_columns = df.columns
    df_columns.remove(TARGET_COL)
    
    # Ensure that TARGET_COL is the last column
    df = df.select(df_columns + [TARGET_COL]).withColumn(TARGET_COL, F.col(TARGET_COL).cast("int"))
    
    if IS_SAMPLE:
        df = df.limit(SAMPLE_ROWS)
    
  2. Μετατρέψτε το Spark DataFrame σε ένα dataFrame pandas για ευκολότερη απεικόνιση και επεξεργασία:

    df_pd = df.toPandas()
    

Εξερεύνηση της κατανομής κλάσης στο σύνολο δεδομένων

  1. Εμφανίζει την κατανομή κλάσης στο σύνολο δεδομένων:

    # The distribution of classes in the dataset
    print('No Frauds', round(df_pd['Class'].value_counts()[0]/len(df_pd) * 100,2), '% of the dataset')
    print('Frauds', round(df_pd['Class'].value_counts()[1]/len(df_pd) * 100,2), '% of the dataset')
    

    Ο κώδικας επιστρέφει αυτήν την κατανομή κλάσης συνόλου δεδομένων: 99,83% No Frauds και 0,17% Frauds. Αυτή η κατανομή κλάσης δείχνει ότι οι περισσότερες συναλλαγές δεν είναι καταχθλήσεις. Επομένως, απαιτείται προεπεξεργασία δεδομένων πριν από την εκπαίδευση του μοντέλου για να αποφευχθεί η υπερβολική προσαρμογή.

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

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    colors = ["#0101DF", "#DF0101"]
    sns.countplot(x='Class', data=df_pd, palette=colors) 
    plt.title('Class Distributions \n (0: No Fraud || 1: Fraud)', fontsize=10)
    
  3. Εμφανίστε τη σύνοψη πέντε αριθμών (ελάχιστη βαθμολογία, πρώτο τεταρτημόριο, διάμεσος, τρίτο τεταρτημόριο και μέγιστη βαθμολογία) για το ποσό συναλλαγής, με γραφήματα πλαισίου:

    fig, (ax1, ax2) = plt.subplots(ncols=2, figsize=(12,5))
    s = sns.boxplot(ax = ax1, x="Class", y="Amount", hue="Class",data=df_pd, palette="PRGn", showfliers=True) # Remove outliers from the plot
    s = sns.boxplot(ax = ax2, x="Class", y="Amount", hue="Class",data=df_pd, palette="PRGn", showfliers=False) # Keep outliers from the plot
    plt.show()
    

    Για δεδομένα υψηλής ανισορροπίας, οι σχεδιάσεις πλαισίων μπορεί να μην εμφανίζουν ακριβείς πληροφορίες. Ωστόσο, μπορείτε να αντιμετωπίσετε πρώτα το πρόβλημα ανισορροπίας Class και, στη συνέχεια, να δημιουργήσετε τις ίδιες σχεδιάσεις για πιο ακριβείς πληροφορίες.

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

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

Προετοιμασία συνόλων δεδομένων εκπαίδευσης και δοκιμής

Πριν από την εκπαίδευση, διαιρέστε τα δεδομένα στα σύνολα δεδομένων εκπαίδευσης και δοκιμής:

# Split the dataset into training and testing sets
from sklearn.model_selection import train_test_split

train, test = train_test_split(df_pd, test_size=0.15)
feature_cols = [c for c in df_pd.columns.tolist() if c not in [TARGET_COL]]

Εφαρμογή SMOTE στο σύνολο δεδομένων εκπαίδευσης

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

Εφαρμόστε το SMOTE μόνο στο σύνολο δεδομένων εκπαίδευσης, αντί για το σύνολο δεδομένων δοκιμής. Όταν βαθμολογείτε το μοντέλο με τα δεδομένα δοκιμής, χρειάζεστε μια προσέγγιση των επιδόσεων του μοντέλου σε μη ορογνώμων δεδομένα στην παραγωγή. Για μια έγκυρη προσέγγιση, τα δεδομένα δοκιμής σας βασίζονται στην αρχική μη ισορροπημένη κατανομή, ώστε να αντιπροσωπεύουν τα δεδομένα παραγωγής όσο το δυνατόν πιο στενά.

# Apply SMOTE to the training data
import pandas as pd
from collections import Counter
from imblearn.over_sampling import SMOTE

X = train[feature_cols]
y = train[TARGET_COL]
print("Original dataset shape %s" % Counter(y))

sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_resample(X, y)
print("Resampled dataset shape %s" % Counter(y_res))

new_train = pd.concat([X_res, y_res], axis=1)

Εκπαίδευση μοντέλων machine learning και εκτέλεση πειραμάτων

Το Apache Spark, στο Microsoft Fabric, επιτρέπει τη μηχανική εκμάθηση με μεγάλα δεδομένα. Χρησιμοποιώντας το Apache Spark, μπορείτε να λάβετε πολύτιμες πληροφορίες από μεγάλες ποσότητες δομημένων, μη δομημένων και ταχέως κινούμενων δεδομένων.

Έχετε πολλές διαθέσιμες επιλογές για την εκπαίδευση μοντέλων εκμάθησης μηχανής με το Apache Spark στο Microsoft Fabric: Apache Spark MLlib, SynapseML και άλλες βιβλιοθήκες ανοιχτού κώδικα. Για περισσότερες πληροφορίες, ανατρέξτε στο θέμα Εκπαίδευση μοντέλων εκμάθησης μηχανής στο Microsoft Fabric.

Ένα πείραμα machine learning χρησιμεύει ως η κύρια μονάδα οργάνωσης και ελέγχου για όλες τις σχετικές machine learning εκτελέσεις. Μια εκτέλεση αντιστοιχεί σε μία εκτέλεση κώδικα μοντέλου. Η παρακολούθηση Machine learning experiment περιλαμβάνει τη διαχείριση όλων των πειραμάτων και των στοιχείων τους, όπως παραμέτρους, μετρήσεις, μοντέλα και άλλα artifacts.

Για την παρακολούθηση πειραμάτων, μπορείτε να οργανώσετε όλα τα απαιτούμενα στοιχεία ενός συγκεκριμένου πειράματος machine learning. Επιπλέον, μπορείτε εύκολα να αναπαραγάγετε προηγούμενα αποτελέσματα με αποθηκευμένα πειράματα. Για περισσότερες πληροφορίες σχετικά με τα πειράματα εκμάθησης μηχανής, ανατρέξτε στο θέμα Πειράματα εκμάθησης μηχανής στο Microsoft Fabric.

  1. Για να παρακολουθήσετε περισσότερα μετρικά, παραμέτρους και αρχεία, ορίστε exclusive=False για να ενημερώσετε τη ρύθμιση παραμέτρων αυτόματης καταχώρησης MLflow:

    mlflow.autolog(exclusive=False)
    
  2. Εκπαιδεύστε δύο μοντέλα με το LightGBM. Το ένα μοντέλο χειρίζεται το μη ισορροπημένο σύνολο δεδομένων και το άλλο μοντέλο χειρίζεται το ισορροπημένο σύνολο δεδομένων (μέσω SMOTE). Στη συνέχεια, συγκρίνετε τις επιδόσεις των δύο μοντέλων.

    import lightgbm as lgb
    
    model = lgb.LGBMClassifier(objective="binary") # Imbalanced dataset
    smote_model = lgb.LGBMClassifier(objective="binary") # Balanced dataset
    
    # Train LightGBM for both imbalanced and balanced datasets and define the evaluation metrics
    print("Start training with imbalanced data:\n")
    with mlflow.start_run(run_name="raw_data") as raw_run:
        model = model.fit(
            train[feature_cols],
            train[TARGET_COL],
            eval_set=[(test[feature_cols], test[TARGET_COL])],
            eval_metric="auc",
            callbacks=[
                lgb.log_evaluation(10),
            ],
        )
    
    print(f"\n\nStart training with balanced data:\n")
    with mlflow.start_run(run_name="smote_data") as smote_run:
        smote_model = smote_model.fit(
            new_train[feature_cols],
            new_train[TARGET_COL],
            eval_set=[(test[feature_cols], test[TARGET_COL])],
            eval_metric="auc",
            callbacks=[
                lgb.log_evaluation(10),
            ],
        )
    

Προσδιορίστε τη σημασία της δυνατότητας για την εκπαίδευση

  1. Προσδιορίστε τη σημασία της δυνατότητας για το μοντέλο που έχετε εκπαιδεύσει στο μη ισορροπημένο σύνολο δεδομένων:

    with mlflow.start_run(run_id=raw_run.info.run_id):
        importance = lgb.plot_importance(
            model, title="Feature importance for imbalanced data"
        )
        importance.figure.savefig("feauture_importance.png")
        mlflow.log_figure(importance.figure, "feature_importance.png")
    
  2. Προσδιορίστε τη σημασία της δυνατότητας για το μοντέλο που έχετε εκπαιδεύσει σε ισορροπημένα δεδομένα. Ο SMOTE δημιούργησε τα ισορροπημένα δεδομένα:

    with mlflow.start_run(run_id=smote_run.info.run_id):
        smote_importance = lgb.plot_importance(
            smote_model, title="Feature importance for balanced (via SMOTE) data"
        )
        smote_importance.figure.savefig("feauture_importance_smote.png")
        mlflow.log_figure(smote_importance.figure, "feauture_importance_smote.png")
    

Όταν εκπαιδεύετε ένα μοντέλο με το μη ισορροπημένο σύνολο δεδομένων, τα σημαντικά χαρακτηριστικά παρουσιάζουν σημαντικές διαφορές σε σύγκριση με ένα μοντέλο που έχει εκπαιδευτεί με το ισορροπημένο σύνολο δεδομένων.

Αξιολόγηση των μοντέλων

Εδώ, αξιολογείτε τα δύο εκπαιδευμένα μοντέλα:

  • model εκπαιδευμένα σε ανεπεξέργαστα, μη ισορροπημένα δεδομένα
  • smote_model εκπαιδευμένοι σε ισορροπημένα δεδομένα

Μετρικά υπολογιστικού μοντέλου

  1. Ορίστε μια prediction_to_spark συνάρτηση που κάνει προβλέψεις και μετατρέπει τα αποτελέσματα της πρόβλεψης σε Spark DataFrame. Στη συνέχεια, μπορείτε να υπολογίσετε στατιστικά στοιχεία μοντέλου για τα αποτελέσματα πρόβλεψης χρησιμοποιώντας το SynapseML.

    from pyspark.sql.functions import col
    from pyspark.sql.types import IntegerType, DoubleType
    
    def prediction_to_spark(model, test):
        predictions = model.predict(test[feature_cols], num_iteration=model.best_iteration_)
        predictions = tuple(zip(test[TARGET_COL].tolist(), predictions.tolist()))
        dataColumns = [TARGET_COL, "prediction"]
        predictions = (
            spark.createDataFrame(data=predictions, schema=dataColumns)
            .withColumn(TARGET_COL, col(TARGET_COL).cast(IntegerType()))
            .withColumn("prediction", col("prediction").cast(DoubleType()))
        )
    
        return predictions
    
  2. Χρησιμοποιήστε τη prediction_to_spark συνάρτηση για να κάνετε προβλέψεις με τα δύο μοντέλα model και smote_model:

    predictions = prediction_to_spark(model, test)
    smote_predictions = prediction_to_spark(smote_model, test)
    predictions.limit(10).toPandas()
    
  3. Υπολογιστικά μετρικά για τα δύο μοντέλα:

    from synapse.ml.train import ComputeModelStatistics
    
    metrics = ComputeModelStatistics(
        evaluationMetric="classification", labelCol=TARGET_COL, scoredLabelsCol="prediction"
    ).transform(predictions)
    
    smote_metrics = ComputeModelStatistics(
        evaluationMetric="classification", labelCol=TARGET_COL, scoredLabelsCol="prediction"
    ).transform(smote_predictions)
    display(metrics)
    

Αξιολόγηση απόδοσης μοντέλου με πίνακα σύγχυσης

Μια πίνακα σύγχυσης εμφανίζει τον αριθμό των

  • αληθώς θετικά (TP)
  • αληθώς αρνητικά (TN)
  • ψευδώς θετικά (FP)
  • ψευδώς αρνητικά (FN)

ότι ένα μοντέλο παράγει όταν βαθμολογηθεί με δεδομένα δοκιμής. Για τη δυαδική ταξινόμηση, το μοντέλο επιστρέφει μια 2x2 μήτρα σύγχυσης. Για ταξινόμηση πολλών κλάσεων, το μοντέλο επιστρέφει μια nxn μήτρα σύγχυσης, όπου n είναι ο αριθμός των κλάσεων.

  1. Χρησιμοποιήστε έναν πίνακα σύγχυσης για να συνοψίσετε τις επιδόσεις των εκπαιδευμένων μοντέλων machine learning στα δεδομένα δοκιμής:

    # Collect confusion matrix values
    cm = metrics.select("confusion_matrix").collect()[0][0].toArray()
    smote_cm = smote_metrics.select("confusion_matrix").collect()[0][0].toArray()
    print(cm)
    
  2. Σχεδίαση της μήτρας σύγχυσης για τις προβλέψεις των smote_model (με εκπαίδευση σε ισορροπημένα δεδομένα):

    # Plot the confusion matrix
    import seaborn as sns
    
    def plot(cm):
        """
        Plot the confusion matrix.
        """
        sns.set(rc={"figure.figsize": (5, 3.5)})
        ax = sns.heatmap(cm, annot=True, fmt=".20g")
        ax.set_title("Confusion Matrix")
        ax.set_xlabel("Predicted label")
        ax.set_ylabel("True label")
        return ax
    
    with mlflow.start_run(run_id=smote_run.info.run_id):
        ax = plot(smote_cm)
        mlflow.log_figure(ax.figure, "ConfusionMatrix.png")
    
  3. Σχεδιάστε τη μήτρα σύγχυσης για τις προβλέψεις των model (εκπαιδευμένες σε ανεπεξέργαστα, μη ισορροπημένα δεδομένα):

    with mlflow.start_run(run_id=raw_run.info.run_id):
        ax = plot(cm)
        mlflow.log_figure(ax.figure, "ConfusionMatrix.png")
    

Αξιολογήστε την απόδοση του μοντέλου με μετρήσεις AUC-ROC και AUPRC

Η μέτρηση Χαρακτηριστικό λειτουργίας Area Under the Curve Receiver (AUC-ROC) αξιολογεί την απόδοση των δυαδικών ταξινομητών. Το AUC-ROC γράφημα απεικονίζει την ανταλλαγή μεταξύ του αληθώς θετικού ρυθμού (TPR) και του ψευδώς θετικού ρυθμού (FPR).

Σε ορισμένες περιπτώσεις, είναι πιο κατάλληλο να αξιολογήσετε τον ταξινομητή σας με βάση τη μέτρηση Περιοχή κάτω από την Precision-Recall καμπύλης (AUPRC). Η καμπύλη AUPRC συνδυάζει αυτούς τους ρυθμούς:

  • Η ακρίβεια ή η θετική προγνωστική τιμή (PPV)
  • Η ανάκληση ή TPR

Για να αξιολογήσετε τις επιδόσεις με τις μετρήσεις AUC-ROC και AUPRC:

  1. Καθορίστε μια συνάρτηση που επιστρέφει τις μετρήσεις AUC-ROC και AUPRC:

    from pyspark.ml.evaluation import BinaryClassificationEvaluator
    
    def evaluate(predictions):
        """
        Evaluate the model by computing AUROC and AUPRC with the predictions.
        """
    
        # Initialize the binary evaluator
        evaluator = BinaryClassificationEvaluator(rawPredictionCol="prediction", labelCol=TARGET_COL)
    
        _evaluator = lambda metric: evaluator.setMetricName(metric).evaluate(predictions)
    
        # Calculate AUROC, baseline 0.5
        auroc = _evaluator("areaUnderROC")
        print(f"The AUROC is: {auroc:.4f}")
    
        # Calculate AUPRC, baseline positive rate (0.172% in the data)
        auprc = _evaluator("areaUnderPR")
        print(f"The AUPRC is: {auprc:.4f}")
    
        return auroc, auprc    
    
  2. Καταγράψτε τα μετρικά AUC-ROC και AUPRC για το μοντέλο που εκπαιδεύσατε σε μη ισορροπμένα δεδομένα:

    with mlflow.start_run(run_id=raw_run.info.run_id):
        auroc, auprc = evaluate(predictions)
        mlflow.log_metrics({"AUPRC": auprc, "AUROC": auroc})
        mlflow.log_params({"Data_Enhancement": "None", "DATA_FILE": DATA_FILE})
    
  3. Καταγράψτε τα μετρικά AUC-ROC και AUPRC για το μοντέλο που έχετε εκπαιδεύσει σε ισορροπημένα δεδομένα:

    with mlflow.start_run(run_id=smote_run.info.run_id):
        auroc, auprc = evaluate(smote_predictions)
        mlflow.log_metrics({"AUPRC": auprc, "AUROC": auroc})
        mlflow.log_params({"Data_Enhancement": "SMOTE", "DATA_FILE": DATA_FILE})
    

Το μοντέλο που έχει εκπαιδευτεί με τα ισορροπημένα δεδομένα επιστρέφει υψηλότερες τιμές AUC-ROC και AUPRC σε σύγκριση με το μοντέλο που έχει εκπαιδευτεί με τα μη ισορροπημένα δεδομένα. Με βάση αυτές τις μετρήσεις, ο SMOTE φαίνεται σαν μια αποτελεσματική τεχνική για τη βελτίωση των επιδόσεων του μοντέλου όταν εργάζεστε με εξαιρετικά μη ισορροπωμένα δεδομένα.

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

Στιγμιότυπο οθόνης του πειράματος που παρακολουθείται.

Η παρακάτω εικόνα εμφανίζει τα μετρικά επιδόσεων για το μοντέλο που έχει εκπαιδευτεί στο ισορροπημένο σύνολο δεδομένων (στην έκδοση 2):

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

Επιλέξτε Έκδοση 1 για να δείτε τα μετρικά για το μοντέλο που εκπαιδεύτηκε στο μη ισορροπημένο σύνολο δεδομένων. Όταν συγκρίνετε τις μετρήσεις, βλέπετε ότι το AUROC είναι υψηλότερο για το μοντέλο που έχει εκπαιδευτεί με το ισορροπημένο σύνολο δεδομένων. Αυτά τα αποτελέσματα υποδεικνύουν ότι αυτό το μοντέλο είναι καλύτερο στην ορθή πρόβλεψη των κλάσεων 0 ως 0και στην πρόβλεψη 1 κλάσεων ως 1.

Βήμα 5: Καταχώρηση των μοντέλων

Χρησιμοποιήστε τη ροή MLflow για να καταχωρήσετε τα δύο μοντέλα:

# Register the model
registered_model_name = f"{EXPERIMENT_NAME}-lightgbm"

raw_model_uri = "runs:/{}/model".format(raw_run.info.run_id)
mlflow.register_model(raw_model_uri, registered_model_name)

smote_model_uri = "runs:/{}/model".format(smote_run.info.run_id)
mlflow.register_model(smote_model_uri, registered_model_name)

Βήμα 6: Αποθήκευση των αποτελεσμάτων πρόβλεψης

Microsoft Fabric οι χρήστες μπορούν να θέσουν σε λειτουργία μοντέλα μηχανικής εκμάθησης χρησιμοποιώντας την κλιμακούμενη συνάρτηση PREDICT. Αυτή η συνάρτηση υποστηρίζει βαθμολόγηση δέσμης (ή συμπερίφραση δέσμης) σε οποιαδήποτε μηχανή υπολογιστικής λειτουργίας.

Μπορείτε να δημιουργήσετε προβλέψεις δέσμης απευθείας από το σημειωματάριο Microsoft Fabric ή από τη σελίδα στοιχείου ενός μοντέλου. Για περισσότερες πληροφορίες σχετικά με το PREDICT, ανατρέξτε στο θέμα Βαθμολόγηση μοντέλου με PREDICT στο Microsoft Fabric.

  1. Φορτώστε το μοντέλο με καλύτερες επιδόσεις (Έκδοση 2) για βαθμολόγηση δέσμης και δημιουργήστε τα αποτελέσματα πρόβλεψης:

    from synapse.ml.predict import MLFlowTransformer
    
    spark.conf.set("spark.synapse.ml.predict.enabled", "true")
    
    model = MLFlowTransformer(
        inputCols=feature_cols,
        outputCol="prediction",
        modelName=f"{EXPERIMENT_NAME}-lightgbm",
        modelVersion=2,
    )
    
    test_spark = spark.createDataFrame(data=test, schema=test.columns.to_list())
    
    batch_predictions = model.transform(test_spark)
    
  2. Αποθήκευση προβλέψεων στο lakehouse:

    # Save the predictions to the lakehouse
    batch_predictions.write.format("delta").mode("overwrite").save(f"{DATA_FOLDER}/predictions/batch_predictions")