Självstudie: Skapa, utvärdera och poängsätta en modell för bedrägeriidentifiering
I den här självstudien visas ett exempel från slutpunkt till slutpunkt på ett Synapse-Datavetenskap arbetsflöde i Microsoft Fabric. Scenariot bygger en modell för identifiering av bedrägerier med maskininlärningsalgoritmer som tränats på historiska data. Den använder sedan modellen för att identifiera framtida bedrägliga transaktioner.
Den här självstudien beskriver följande steg:
- Installera anpassade bibliotek
- Läsa in data
- Förstå och bearbeta data genom undersökande dataanalys
- Använd scikit-learn för att träna en maskininlärningsmodell och spåra experiment med funktionerna för autologgning av MLflow och infrastrukturresurser
- Spara och registrera den maskininlärningsmodell som har högsta prestanda
- Läs in maskininlärningsmodellen för bedömning och för att göra förutsägelser
Förutsättningar
Skaffa en Microsoft Fabric-prenumeration. Eller registrera dig för en kostnadsfri utvärderingsversion av Microsoft Fabric.
Logga in på Microsoft Fabric.
Använd upplevelseväxlaren till vänster på startsidan för att växla till Synapse Datavetenskap upplevelse.
- Om det behövs skapar du ett Microsoft Fabric Lakehouse enligt beskrivningen i Skapa ett sjöhus i Microsoft Fabric.
Följ med i en notebook-fil
Du kan välja något av följande alternativ för att följa med i en notebook-fil:
- Öppna och kör den inbyggda notebook-filen i Datavetenskap-upplevelsen
- Ladda upp din notebook-fil från GitHub till Datavetenskap upplevelse
Öppna den inbyggda notebook-filen
Exempelanteckningsboken bedrägeriidentifiering medföljer den här självstudien.
Så här öppnar du självstudiekursens inbyggda exempelanteckningsbok i Synapse Datavetenskap upplevelse:
Gå till startsidan för Synapse Datavetenskap.
Välj Använd ett exempel.
Välj motsvarande exempel:
- Från standardfliken för arbetsflöden från slutpunkt till slutpunkt (Python) om exemplet är för en Python-självstudie.
- Från fliken Arbetsflöden från slutpunkt till slutpunkt (R) om exemplet är för en R-självstudie.
- Om exemplet är för en snabb självstudie på fliken Snabbsjälvstudier.
Koppla ett lakehouse till notebook-filen innan du börjar köra kod.
Importera anteckningsboken från GitHub
Notebook-filen AIsample – Fraud Detection.ipynb medföljer den här självstudien.
Om du vill öppna den medföljande notebook-filen för den här självstudien följer du anvisningarna i Förbereda systemet för självstudier för datavetenskap för att importera anteckningsboken till din arbetsyta.
Om du hellre vill kopiera och klistra in koden från den här sidan kan du skapa en ny notebook-fil.
Se till att bifoga ett lakehouse i notebook-filen innan du börjar köra kod.
Steg 1: Installera anpassade bibliotek
För utveckling av maskininlärningsmodeller eller ad hoc-dataanalys kan du snabbt behöva installera ett anpassat bibliotek för Apache Spark-sessionen. Du har två alternativ för att installera bibliotek.
- Använd de infogade installationsfunktionerna (
%pip
eller%conda
) i notebook-filen för att installera ett bibliotek, endast i den aktuella notebook-filen. - Du kan också skapa en Infrastrukturmiljö, installera bibliotek från offentliga källor eller ladda upp anpassade bibliotek till den och sedan kan din arbetsyteadministratör koppla miljön som standard för arbetsytan. Alla bibliotek i miljön blir sedan tillgängliga för användning i alla notebook-filer och Spark-jobbdefinitioner på arbetsytan. Mer information om miljöer finns i skapa, konfigurera och använda en miljö i Microsoft Fabric.
I den här självstudien använder du %pip install
för att installera imblearn
biblioteket i notebook-filen.
Kommentar
PySpark-kerneln startas om efter %pip install
körningar. Installera de bibliotek som behövs innan du kör andra celler.
# Use pip to install imblearn
%pip install imblearn
Steg 2: Läs in data
Datamängden för bedrägeriidentifiering innehåller kreditkortstransaktioner från september 2013 som europeiska kortinnehavare gjort under loppet av två dagar. Datamängden innehåller endast numeriska funktioner på grund av en PCA-transformering (Principal Component Analysis) som tillämpas på de ursprungliga funktionerna. PCA omvandlade alla funktioner förutom Time
och Amount
. För att skydda konfidentialiteten kan vi inte tillhandahålla de ursprungliga funktionerna eller mer bakgrundsinformation om datauppsättningen.
Den här informationen beskriver datamängden:
- Funktionerna
V1
,V2
,V3
, ...,V28
är huvudkomponenterna som erhålls med PCA - Funktionen
Time
innehåller de förflutna sekunderna mellan en transaktion och den första transaktionen i datamängden - Funktionen
Amount
är transaktionsbeloppet. Du kan använda den här funktionen för till exempel beroende, kostnadskänslig inlärning - Kolumnen
Class
är variabeln svar (mål). Det har värdet1
för bedrägeri, och0
i övrigt
Endast 492 transaktioner, av totalt 284 807 transaktioner, är bedrägliga. Datamängden är mycket obalanserad eftersom minoritetsklassen (bedräglig) endast står för cirka 0,172 % av data.
Den här tabellen visar en förhandsgranskning av creditcard.csv data:
Tid | 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 | Belopp | Klass |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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" |
Ladda ned datauppsättningen och ladda upp till lakehouse
Definiera dessa parametrar så att du kan använda den här notebook-filen med olika datauppsättningar:
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
Den här koden laddar ned en offentligt tillgänglig version av datamängden och lagrar den sedan i en Infrastruktursjöhus.
Viktigt!
Se till att lägga till ett sjöhus i anteckningsboken innan du kör det. Annars får du ett fel.
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.")
Konfigurera MLflow-experimentspårning
Experimentspårningsprocessen sparar all relevant experimentrelaterad information för varje experiment som du kör. Ibland kan du inte få bättre resultat när du kör ett specifikt experiment. I dessa fall bör du stoppa experimentet och prova ett nytt.
Synapse-Datavetenskap i Microsoft Fabric innehåller en funktion för automatisk loggning. Den här funktionen minskar mängden kod som behövs för att automatiskt logga parametrar, mått och objekt i en maskininlärningsmodell under träningen. Funktionen utökar funktionerna för automatisk MLflow-loggning. Den har djup integrering i Datavetenskap erfarenhet.
Med automatisk loggning kan du enkelt spåra och jämföra prestanda för olika modeller och experiment, utan att behöva manuell spårning. Mer information finns i Automatisk loggning i Microsoft Fabric.
Om du vill inaktivera automatisk loggning av Microsoft Fabric i en notebook-session anropar mlflow.autolog()
du och anger disable=True
:
# Set up MLflow for experiment tracking
import mlflow
mlflow.set_experiment(EXPERIMENT_NAME)
mlflow.autolog(disable=True) # Disable MLflow autologging
Läsa rådata från lakehouse
Den här koden läser rådata från lakehouse:
df = (
spark.read.format("csv")
.option("header", "true")
.option("inferSchema", True)
.load(f"{DATA_FOLDER}/raw/{DATA_FILE}")
.cache()
)
Steg 3: Utföra undersökande dataanalys
I det här avsnittet utforskar du först rådata och statistik på hög nivå. Om du sedan vill omvandla data omvandlar du kolumnerna till rätt typer och konverterar dem från Spark DataFrame till en Pandas DataFrame för enklare visualisering. Slutligen utforskar och visualiserar du klassdistributionerna i data.
Visa rådata
Utforska rådata och visa statistik på hög nivå med
display
kommandot . Mer information om datavisualisering finns i Notebook-visualisering i Microsoft Fabric.display(df)
Skriv ut grundläggande information om datauppsättningen:
# Print dataset basic information print("records read: " + str(df.count())) print("Schema: ") df.printSchema()
Omvandla data
Omvandla datauppsättningskolumnerna till rätt typer:
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)
Konvertera Spark DataFrame till en Pandas DataFrame för enklare visualisering och bearbetning:
df_pd = df.toPandas()
Utforska klassdistributionen i datauppsättningen
Visa klassfördelningen i datauppsättningen:
# 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')
Koden returnerar den här datamängdsklassfördelningen: 99,83 %
No Frauds
och 0,17 %Frauds
. Den här klassfördelningen visar att de flesta transaktionerna är icke-infrastrukturfria. Därför krävs förbearbetning av data före modellträning för att undvika överanpassning.Använd ett diagram för att visa klassobalansen i datamängden genom att visa fördelningen av bedrägliga kontra icke-bedrägliga transaktioner:
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)
Visa femtalssammanfattningen (minsta poäng, första kvartilen, median, tredje kvartilen och högsta poäng) för transaktionsbeloppet, med rutor:
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()
För data med hög obalans kan det hända att lådritningar inte visar korrekta insikter. Du kan dock åtgärda obalanssproblemet
Class
först och sedan skapa samma diagram för mer exakta insikter.
Steg 4: Träna och utvärdera modellerna
Här tränar du en LightGBM-modell för att klassificera bedrägeritransaktionerna. Du tränar en LightGBM-modell på både den obalanserade datamängden och den balanserade datamängden. Sedan jämför du prestandan för båda modellerna.
Förbereda tränings- och testdatauppsättningar
Innan träningen delar du upp data i tränings- och testdatauppsättningarna:
# 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]]
Tillämpa SMOTE på träningsdatauppsättningen
Biblioteket imblearn
använder smote-metoden (Synthetic Minority Oversampling Technique) för att lösa problemet med obalanserad klassificering. Obalanserad klassificering inträffar när för få exempel på minoritetsklassen är tillgängliga, för att en modell effektivt ska kunna lära sig beslutsgränsen. SMOTE är den mest använda metoden för att syntetisera nya exempel för minoritetsklassen.
Använd endast SMOTE på träningsdatauppsättningen i stället för testdatauppsättningen. När du bedömer modellen med testdata behöver du en uppskattning av modellens prestanda för osedda data i produktionen. För en giltig uppskattning förlitar sig testdata på den ursprungliga obalanserade fördelningen för att representera produktionsdata så nära som möjligt.
# 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)
Mer information om SMOTE finns på referenssidan för scikit-learn för SMOTE-metoden och användarhandboken för scikit-learn om översampling av resurser.
Träna maskininlärningsmodeller och köra experiment
Apache Spark i Microsoft Fabric möjliggör maskininlärning med stordata. Med Apache Spark kan du få värdefulla insikter från stora mängder strukturerade, ostrukturerade och snabba data.
Du har flera tillgängliga alternativ för att träna maskininlärningsmodeller med Apache Spark i Microsoft Fabric: Apache Spark MLlib, SynapseML och andra bibliotek med öppen källkod. Mer information finns i Träna maskininlärningsmodeller i Microsoft Fabric.
Ett maskininlärningsexperiment fungerar som den primära enheten för organisation och kontroll för alla relaterade maskininlärningskörningar. En körning motsvarar en enda körning av modellkod. Spårning av maskininlärningsexperiment omfattar hantering av alla experiment och deras komponenter, till exempel parametrar, mått, modeller och andra artefakter.
För experimentspårning kan du organisera alla nödvändiga komponenter i ett specifikt maskininlärningsexperiment. Dessutom kan du enkelt återskapa tidigare resultat med sparade experiment. Mer information om maskininlärningsexperiment finns i Maskininlärningsexperiment i Microsoft Fabric.
Om du vill spåra fler mått, parametrar och filer anger du
exclusive=False
för att uppdatera konfigurationen för automatisk MLflow-loggning:mlflow.autolog(exclusive=False)
Träna två modeller med LightGBM. Den ena modellen hanterar den obalanserade datamängden och den andra modellen hanterar den balanserade datamängden (via SMOTE). Jämför sedan prestandan för de två modellerna.
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), ], )
Fastställa funktionsvikt för träning
Fastställa funktionsvikt för den modell som du har tränat på den obalanserade datamängden:
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")
Fastställa funktionsvikt för den modell som du har tränat på balanserade data. SMOTE genererade balanserade data:
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")
För att träna en modell med den obalanserade datamängden har de viktiga funktionerna betydande skillnader jämfört med en modell som tränats med den balanserade datamängden.
Utvärdera modellerna
Här utvärderar du de två tränade modellerna:
model
tränas på rådata, obalanserade datasmote_model
tränas på balanserade data
Beräkningsmodellmått
Definiera en
prediction_to_spark
funktion som utför förutsägelser och konverterar förutsägelseresultatet till en Spark DataFrame. Du kan sedan beräkna modellstatistik för förutsägelseresultatet med 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
prediction_to_spark
Använd funktionen för att utföra förutsägelser med de två modellernamodel
ochsmote_model
:predictions = prediction_to_spark(model, test) smote_predictions = prediction_to_spark(smote_model, test) predictions.limit(10).toPandas()
Beräkningsmått för de två modellerna:
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)
Utvärdera modellprestanda med en förvirringsmatris
En förvirringsmatris visar antalet
- sanna positiva identifieringar (TP)
- true negatives (TN)
- falska positiva identifieringar (FP)
- falska negativa (FN)
som en modell producerar när den poängsätts med testdata. För binär klassificering returnerar modellen en 2x2
förvirringsmatris. För multiklassklassificering returnerar modellen en nxn
förvirringsmatris, där n
är antalet klasser.
Använd en förvirringsmatris för att sammanfatta prestanda för de tränade maskininlärningsmodellerna på testdata:
# 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)
Rita sammanblandningsmatrisen för förutsägelserna för
smote_model
(tränas på balanserade data):# 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")
Rita sammanblandningsmatrisen för förutsägelserna för
model
(tränad på rådata, obalanserade data):with mlflow.start_run(run_id=raw_run.info.run_id): ax = plot(cm) mlflow.log_figure(ax.figure, "ConfusionMatrix.png")
Utvärdera modellprestanda med AUC-ROC- och AUPRC-mått
Area under måttet Curve Receiver Operating Characteristic (AUC-ROC) utvärderar prestanda för binära klassificerare. AUC-ROC-diagrammet visualiserar kompromissen mellan den sanna positiva kursen (TPR) och den falska positiva kursen (FPR).
I vissa fall är det lämpligare att utvärdera klassificeraren baserat på måttet Område under AUPRC-måttet (Precision-Recall Curve). AUPRC-kurvan kombinerar dessa priser:
- Precisionen eller det positiva prediktiva värdet (PPV)
- Återkallandet, eller TPR
Så här utvärderar du prestanda med måtten AUC-ROC och AUPRC:
Definiera en funktion som returnerar måtten AUC-ROC och 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
Logga måtten AUC-ROC och AUPRC för den modell som du har tränat på obalanserade data:
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})
Logga måtten AUC-ROC och AUPRC för den modell som du har tränat på balanserade data:
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})
Modellen som tränas på balanserade data returnerar högre AUC-ROC- och AUPRC-värden jämfört med modellen som tränas på obalanserade data. Baserat på dessa mått verkar SMOTE vara en effektiv teknik för att förbättra modellprestanda när du arbetar med mycket obalanserade data.
Som nästa bild visar loggas alla experiment med respektive namn. Du kan spåra experimentparametrar och prestandamått på din arbetsyta.
Den här bilden visar prestandamåtten för modellen som tränats på den balanserade datamängden (i version 2):
Du kan välja Version 1 för att se måtten för modellen som tränats på den obalanserade datamängden. När du jämför måtten är AUROC högre för modellen som tränats med den balanserade datamängden. Dessa resultat indikerar att den här modellen är bättre på att 0
korrekt förutsäga klasser som 0
och förutsäga 1
klasser som 1
.
Steg 5: Registrera modellerna
Använd MLflow för att registrera de två modellerna:
# 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)
Steg 6: Spara förutsägelseresultatet
Med Microsoft Fabric kan användare operationalisera maskininlärningsmodeller med den PREDICT
skalbara funktionen. Den här funktionen stöder batchbedömning (eller batch-slutsatsdragning) i en beräkningsmotor.
Du kan generera batchförutsägelser direkt från Microsoft Fabric-anteckningsboken eller från en modells objektsida. Mer information om PREDICT
finns i Modellbedömning med PREDICT i Microsoft Fabric.
Läs in modellen med bättre prestanda (version 2) för batchbedömning och generera förutsägelseresultatet:
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)
Spara förutsägelser till lakehouse:
# Save the predictions to the lakehouse batch_predictions.write.format("delta").mode("overwrite").save(f"{DATA_FOLDER}/predictions/batch_predictions")