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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Βήμα 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: Φόρτωση των δεδομένων

Το σύνολο δεδομένων εντοπισμού απάτης περιέχει συναλλαγές με πιστωτικές κάρτες, από τον Σεπτέμβριο του 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.blob.core.windows.net/public/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 περιλαμβάνει μια δυνατότητα αυτόματης καταχώρησης. Αυτή η δυνατότητα μειώνει την ποσότητα κώδικα που απαιτείται για την αυτόματη καταγραφή των παραμέτρων, των μετρικών και των στοιχείων ενός μοντέλου εκμάθησης μηχανής κατά τη διάρκεια της εκπαίδευσης. Η δυνατότητα επεκτείνει τις δυνατότητες αυτόματης καταχώρησης ροής 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)

Για περισσότερες πληροφορίες σχετικά με τον SMOTE, ανατρέξτε στη σελίδα αναφοράς scikit-learn για τη μέθοδο SMOTE και στο οδηγίες χρήσης scikit-learn σχετικά με την υπερβολική χρήση πόρων.

Εκπαίδευση μοντέλων εκμάθησης μηχανής και εκτέλεση πειραμάτων

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

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

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

Για παρακολούθηση πειραμάτων, μπορείτε να οργανώσετε όλα τα απαιτούμενα στοιχεία ενός συγκεκριμένου πειράματος εκμάθησης μηχανής. Επιπλέον, μπορείτε εύκολα να αναπαραγάγετε προηγούμενα αποτελέσματα με αποθηκευμένα πειράματα. Για περισσότερες πληροφορίες σχετικά με τα πειράματα εκμάθησης μηχανής, ανατρέξτε στο θέμα πειράματα εκμάθησης μηχανής στο 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. Χρησιμοποιήστε μια μήτρα σύγχυσης για να συνοψίσετε τις επιδόσεις των εκπαιδευμένων μοντέλων εκμάθησης μηχανής στα δεδομένα δοκιμής:

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