Esercitazione: Creare, valutare e assegnare un punteggio a un modello di rilevamento delle frodi
Questa esercitazione presenta un esempio end-to-end di un flusso di lavoro di data science synapse in Microsoft Fabric. Lo scenario crea un modello di rilevamento delle frodi con algoritmi di Machine Learning sottoposti a training sui dati cronologici. Usa quindi il modello per rilevare le transazioni fraudolente future.
Questa esercitazione comprende i seguenti passaggi:
- Installare librerie personalizzate
- Caricare i dati
- Comprendere ed elaborare i dati tramite l'analisi esplorativa dei dati
- Usare scikit-learn per eseguire il training di un modello di Machine Learning e tenere traccia degli esperimenti con le funzionalità MLflow e Fabric Autologging
- Salvare e registrare il modello di Machine Learning con le prestazioni più elevate
- Caricare il modello di Machine Learning per l'assegnazione dei punteggi e per eseguire stime
Prerequisiti
Ottenere una sottoscrizione di Microsoft Fabric. In alternativa, iscriversi per ottenere una versione di valutazione di Microsoft Fabric gratuita.
Accedere a Microsoft Fabric.
Usare l’opzione esperienza sul lato sinistro della home page per passare all'esperienza Science di Synapse.
- Se necessario, creare un lakehouse di Microsoft Fabric come descritto in Creare un lakehouse in Microsoft Fabric.
Seguire la procedura in un notebook
È possibile scegliere una di queste opzioni per seguire la procedura in un notebook:
- Aprire ed eseguire il notebook predefinito nell'esperienza Data Science
- Caricare il notebook da GitHub nell'esperienza Data Science
Aprire il notebook predefinito
Il notebook di rilevamento delle frodi di esempio accompagna questa esercitazione.
Per aprire il notebook di esempio predefinito dell'esercitazione nell'esperienza Synapse Data Science:
Passare alla home page di Synapse Data Science.
Selezionare Usa un esempio.
Selezionare l’esempio corrispondente:
- Dalla scheda predefinita Flussi di lavoro end-to-end (Python), se l'esempio è relativo a un'esercitazione su Python.
- Dalla scheda Flussi di lavoro end-to-end (R), se l'esempio è relativo a un'esercitazione su R.
- Dalla scheda Esercitazioni rapide, se l'esempio è relativo a un'esercitazione rapida.
Collegare un lakehouse al notebook prima di iniziare a eseguire il codice.
Importare il notebook da GitHub
Il notebook AIsample - Fraud Detection.ipynb accompagna questa esercitazione.
Per aprire il notebook di accompagnamento per questa esercitazione, seguire le istruzioni riportate in Preparare il sistema per le esercitazioni di data science per importare il notebook nell'area di lavoro.
Se si preferisce copiare e incollare il codice da questa pagina, è possibile creare un nuovo notebook.
Assicurarsi di collegare un lakehouse al notebook prima di iniziare a eseguire il codice.
Passaggio 1: Installare librerie personalizzate
Per lo sviluppo di modelli di apprendimento automatico o l'analisi dei dati ad hoc, potrebbe essere necessario installare rapidamente una libreria personalizzata per la sessione di Apache Spark. Sono disponibili due opzioni per installare le librerie.
- Usare le funzionalità di installazione inline (
%pip
o%conda
) del notebook per installare una libreria solo nel notebook corrente. - In alternativa, è possibile creare un ambiente Fabric, installare librerie da origini pubbliche o caricarvi librerie personalizzate e quindi l'amministratore dell'area di lavoro può collegare l'ambiente come predefinito per l'area di lavoro. Tutte le librerie nell'ambiente diventano quindi disponibili per l'uso in qualsiasi notebook e definizione del processo Spark nell'area di lavoro. Per altre informazioni sugli ambienti, vedere creare, configurare e usare un ambiente in Microsoft Fabric.
Per questa esercitazione, usare %pip install
per installare la libreria imblearn
nel notebook.
Nota
Il kernel PySpark viene riavviato dopo l'esecuzione di %pip install
. Installare le librerie necessarie prima di eseguire qualsiasi altra cella.
# Use pip to install imblearn
%pip install imblearn
Passaggio 2: caricare i dati
Il set di dati di rilevamento delle frodi contiene le transazioni con carta di credito di settembre 2013, effettuate da titolari di carte europei nel corso di due giorni. Il set di dati contiene solo funzionalità numeriche a causa di una trasformazione di Analisi delle Componenti Principali (PCA) applicata alle funzionalità originali. PCA ha trasformato tutte le funzionalità ad eccezione di Time
e Amount
. Per proteggere la riservatezza, non è possibile fornire le funzionalità originali o altre informazioni di base sul set di dati.
Questi dettagli descrivono il set di dati:
- Le funzionalità
V1
,V2
,V3
, ...,V28
sono i componenti principali ottenuti con PCA - La funzionalità
Time
contiene i secondi trascorsi tra una transazione e la prima transazione nel set di dati - La funzionalità
Amount
è l'importo della transazione. È possibile usare questa funzionalità per l'apprendimento sensibile ai costi dipendente dall'esempio - La colonna
Class
è la variabile di risposta (destinazione). Ha il valore1
per le frodi e0
in caso contrario
Solo 492 transazioni, su un totale di 284.807 transazioni, sono fraudolente. Il set di dati è altamente sbilanciato, perché la classe di minoranza (fraudolenta) rappresenta solo circa lo 0,172% dei dati.
Questa tabella mostra un'anteprima dei dati creditcard.csv:
Time | V1 | V2 | V3 | V4 | V5 | V6 | V7 | V8 | V9 | V10 | V11 | Versione 12 | V13 | V14 | V15 | V16 | V17 | V18 | V19 | V20 | V21 | V22 | V23 | V24 | V25 | V26 | V27 | V28 | Periodo | Classe |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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" |
Scaricare il set di dati e caricarlo nel lakehouse
Definire questi parametri, in modo da poter usare questo notebook con set di dati diversi:
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
Questo codice scarica una versione disponibile pubblicamente del set di dati e quindi la archivia in un lakehouse di Fabric.
Importante
Assicurarsi di aggiungere un lakehouse al notebook prima di eseguirLO. In caso contrario, verrà visualizzato un errore.
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.")
Configurare il rilevamento dell'esperimento MLflow
Il processo di rilevamento dell'esperimento salva tutte le informazioni pertinenti relative all'esperimento per ogni esperimento eseguito. In alcuni casi, non è possibile ottenere risultati migliori quando si esegue un esperimento specifico. In questi casi, è consigliabile arrestare l'esperimento e provarne uno nuovo.
L'esperienza di data science di Synapse in Microsoft Fabric include una funzionalità di assegnazione automatica dei tag. Questa funzionalità riduce la quantità di codice necessaria per registrare automaticamente i parametri, le metriche e gli elementi di un modello di Machine Learning durante il training. La funzionalità estende le funzionalità di assegnazione automatica di MLflow. Offre un'integrazione approfondita nell'esperienza di data science.
Con l'assegnazione automatica, è possibile tenere traccia e confrontare facilmente le prestazioni di diversi modelli e esperimenti, senza la necessità di tenere traccia manuale. Per altre informazioni, vedere Autologging in Microsoft Fabric.
Per disabilitare l'autologging di Microsoft Fabric in una sessione del notebook, chiamare mlflow.autolog()
e impostare disable=True
:
# Set up MLflow for experiment tracking
import mlflow
mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True) # Disable MLflow autologging
Leggere i dati non elaborati dal lakehouse
Questo codice legge i dati non elaborati dal lakehouse:
df = (
spark.read.format("csv")
.option("header", "true")
.option("inferSchema", True)
.load(f"{DATA_FOLDER}/raw/{DATA_FILE}")
.cache()
)
Passaggio 3: eseguire l'analisi esplorativa dei dati
In questa sezione vengono innanzitutto esaminati i dati non elaborati e le statistiche di alto livello. Quindi, per trasformare i dati, eseguire il cast delle colonne nei tipi corretti e convertirli dal dataframe Spark in un dataframe pandas per semplificare la visualizzazione. Infine, si esplorano e si visualizzano le distribuzioni di classi nei dati.
Visualizzare i dati non elaborati
Esplorare i dati non elaborati e visualizzare le statistiche di alto livello con il comando
display
. Per altre informazioni sulla visualizzazione dei dati, vedere Visualizzazione notebook in Microsoft Fabric.display(df)
Stampare alcune informazioni di base sul set di dati:
# Print dataset basic information print("records read: " + str(df.count())) print("Schema: ") df.printSchema()
Trasformazione dei dati
Eseguire il cast delle colonne del set di dati nei tipi corretti:
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)
Convertire il dataframe Spark in un dataframe pandas per semplificare la visualizzazione e l'elaborazione:
df_pd = df.toPandas()
Esplorare la distribuzione delle classi nel set di dati
Visualizzare la distribuzione della classe nel set di dati:
# 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')
Il codice restituisce questa distribuzione della classe del set di dati: 99,83%
No Frauds
e 0,17%Frauds
. Questa distribuzione di classi mostra che la maggior parte delle transazioni non è fraudolenta. Pertanto, la pre-elaborazione dei dati è necessaria prima del training del modello, per evitare l'overfitting.Usare un tracciato per visualizzare lo squilibrio della classe nel set di dati visualizzando la distribuzione delle transazioni fraudolente e nonfradulente:
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)
Mostra il riepilogo a cinque numeri (punteggio minimo, primo quartile, mediano, terzo quartile e punteggio massimo) per l'importo della transazione, con tracciati box:
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()
Per i dati altamente sbilanciati, i tracciati box potrebbero non mostrare approfondimenti accurati. Tuttavia, è possibile risolvere prima il problema di
Class
di squilibrio e quindi creare gli stessi tracciati per approfondimenti più accurati.
Passaggio 4: eseguire il training e valutare i modelli
In questo caso si esegue il training di un modello LightGBM per classificare le transazioni di frode. Si esegue il training di un modello LightGBM sia nel set di dati sbilanciato che nel set di dati bilanciato. Quindi, confrontare le prestazioni di entrambi i modelli.
Preparare i set di dati di training e di test
Prima del training, suddividere i dati nei set di dati di training e test:
# 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]]
Applicare SMOTE al set di dati di training
La libreria imblearn
usa l'approccio SMOTE (Synthetic Minority Oversampling Technique) per risolvere il problema della classificazione sbilanciata. La classificazione sbilanciata si verifica quando sono disponibili troppi esempi della classe di minoranza, per consentire a un modello di apprendere efficacemente il limite decisionale. SMOTE è l'approccio più diffuso per sintetizzare nuovi campioni per la classe di minoranza.
Applicare SMOTE solo al set di dati di training anziché al set di dati di test. Quando si assegna un punteggio al modello con i dati di test, è necessaria un'approssimazione delle prestazioni del modello sui dati non visualizzati nell'ambiente di produzione. Per un'approssimazione valida, i dati di test si basano sulla distribuzione originale sbilanciata per rappresentare i dati di produzione il più possibile.
# 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)
Per altre informazioni su SMOTE, vedere la pagina di riferimento scikit-learn per il metodo SMOTE e la guida dell'utente scikit-learn sulle risorse di sovracampionamento.
Eseguire il training di modelli di apprendimento automatico ed eseguire gli esperimenti
Apache Spark, in Microsoft Fabric, consente l'apprendimento automatico con Big Data. Con Apache Spark è possibile ottenere informazioni dettagliate preziose da grandi quantità di dati strutturati, non strutturati e veloci.
Sono disponibili diverse opzioni per eseguire il training di modelli di Machine Learning con Apache Spark in Microsoft Fabric: Apache Spark MLlib, SynapseML e altre librerie open source. Per altre informazioni, vedere Eseguire il training di modelli di Machine Learning in Microsoft Fabric.
Un esperimento di Machine Learning funge da unità primaria di organizzazione e controllo per tutte le esecuzioni di Machine Learning correlate. Un'esecuzione corrisponde a una singola esecuzione del codice dei modelli. Il rilevamento degli esperimenti di Machine Learning implica la gestione di tutti gli esperimenti e dei relativi componenti, ad esempio parametri, metriche, modelli e altri artefatti.
Per il rilevamento dell'esperimento, è possibile organizzare tutti i componenti necessari di un esperimento di Machine Learning specifico. Inoltre, è possibile riprodurre facilmente i risultati precedenti con esperimenti salvati. Per altre informazioni, vedere Esperimenti di apprendimento automatico in Microsoft Fabric.
Per tenere traccia di altre metriche, parametri e file, impostare
exclusive=False
per aggiornare la configurazione dell'assegnazione automatica di tag MLflow:mlflow.autolog(exclusive=False)
Eseguire il training di due modelli con LightGBM. Un modello gestisce il set di dati sbilanciato e l'altro modello gestisce il set di dati bilanciato (tramite SMOTE). Confrontare quindi le prestazioni dei due modelli.
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), ], )
Determinare l'importanza della funzionalità per il training
Determinare l'importanza di funzionalità per il modello sottoposto a training nel set di dati sbilanciato:
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")
Determinare l'importanza della funzionalità per il modello sottoposto a training su dati bilanciati. SMOTE ha generato i dati bilanciati:
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")
Per eseguire il training di un modello con il set di dati sbilanciato, le caratteristiche importanti presentano differenze significative rispetto a un modello sottoposto a training con il set di dati bilanciato.
Valutare i modelli
In questo caso, si valutano i due modelli sottoposti a training:
model
sottoposto a training su dati non elaborati e sbilanciatismote_model
sottoposto a training su dati bilanciati
Metriche del modello di calcolo
Definire una funzione
prediction_to_spark
che esegue stime e converte i risultati della stima in un dataframe Spark. È quindi possibile calcolare le statistiche del modello sui risultati della stima con 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
Usare la funzione
prediction_to_spark
per eseguire stime con i due modellimodel
esmote_model
:predictions = prediction_to_spark(model, test) smote_predictions = prediction_to_spark(smote_model, test) predictions.limit(10).toPandas()
Metriche di calcolo per i due modelli:
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)
Valutare le prestazioni del modello con una matrice di confusione
Una matrice di confusione visualizza il numero di
- veri positivi (TP)
- veri negativi (TN)
- falsi positivi (FP)
- falsi negativi (FN)
che un modello produce quando viene ottenuto un punteggio con i dati di test. Per la classificazione binaria, il modello restituisce una matrice di confusione 2x2
. Per la classificazione multiclasse, il modello restituisce una matrice di confusione nxn
, dove n
è il numero di classi.
Usare una matrice di confusione per riepilogare le prestazioni dei modelli di Machine Learning sottoposti a training sui dati di test:
# 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)
Tracciare la matrice di confusione per le stime di
smote_model
(sottoposto a training su dati bilanciati):# 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")
Tracciare la matrice di confusione per le stime di
model
(sottoposto a training su dati non elaborati e sbilanciati):with mlflow.start_run(run_id=raw_run.info.run_id): ax = plot(cm) mlflow.log_figure(ax.figure, "ConfusionMatrix.png")
Valutare le prestazioni del modello con misure AUC-ROC e AUPRC
La misura Area sotto la curva Caratteristica di funzionamento del ricevitore (AUC-ROC) valuta le prestazioni dei classificatori binari. Il grafico AUC-ROC visualizza il compromesso tra il tasso positivo reale (TPR) e il tasso falso positivo (FPR).
In alcuni casi, è più appropriato valutare il classificatore in base alla misura Area Sotto la curva di richiamo della precisione (AUPRC). La curva AUPRC combina queste frequenze:
- Precisione o valore predittivo positivo (PPV)
- Richiamo o TPR
Per valutare le prestazioni con le misure AUC-ROC e AUPRC:
Definire una funzione che restituisce le misure AUC-ROC e 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
Registrare le metriche AUC-ROC e AUPRC per il modello sottoposto a training sui dati sbilanciati:
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})
Registrare le metriche AUC-ROC e AUPRC per il modello sottoposto a training sui dati bilanciati:
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})
Il modello sottoposto a training sui dati bilanciati restituisce valori AUC-ROC e AUPRC superiori rispetto al modello sottoposto a training sui dati sbilanciati. In base a queste misure, SMOTE sembra una tecnica efficace per migliorare le prestazioni del modello quando si lavora con dati altamente sbilanciati.
Come illustrato nell'immagine successiva, qualsiasi esperimento viene registrato con il rispettivo nome. È possibile tenere traccia dei parametri dell'esperimento e delle metriche delle prestazioni nell'area di lavoro.
Questa immagine mostra le metriche delle prestazioni per il modello sottoposto a training nel set di dati bilanciato (nella versione 2):
È possibile selezionare la versione 1 per visualizzare le metriche per il modello sottoposto a training nel set di dati sbilanciato. Quando si confrontano le metriche, l'AUROC è superiore per il modello sottoposto a training con il set di dati bilanciato. Questi risultati indicano che questo modello è migliore per stimare correttamente le classi 0
come 0
, e stimare le classi 1
come 1
.
Passaggio 5: Registrazione dei modelli
Usare MLflow per registrare i due modelli:
# 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)
Passaggio 6: Salvare i risultati della stima
Microsoft Fabric consente agli utenti di rendere operativi i modelli di Machine Learning con la funzione scalabile PREDICT
. Questa funzione supporta l'assegnazione dei punteggi batch (o l'inferenza batch) in qualsiasi motore di calcolo.
È possibile generare stime batch direttamente dal notebook di Microsoft Fabric o dalla pagina dell'elemento di un modello. Per altre informazioni su PREDICT
, vedere Assegnazione dei punteggi ai modelli di Machine Learning con PREDICT in Microsoft Fabric.
Caricare il modello con prestazioni migliori (versione 2) per l'assegnazione dei punteggi batch e generare i risultati della stima:
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)
Salvare le stime nel lakehouse:
# Save the predictions to the lakehouse batch_predictions.write.format("delta").mode("overwrite").save(f"{DATA_FOLDER}/predictions/batch_predictions")