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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Το σημειωματάριο AIsample - Uplift Modeling.ipynb συνοδεύει αυτό το εκπαιδευτικό βοήθημα.

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

Μπορείτε να δημιουργήσετε ένα νέο σημειωματάριο εάν προτιμάτε να αντιγράψετε και να επικολλήσετε τον κώδικα από αυτήν τη σελίδα.

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

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

Σύνολο δεδομένων

Το εργαστήριο AI Criteo δημιούργησε το σύνολο δεδομένων. Αυτό το σύνολο δεδομένων έχει 13 εκατομμύρια γραμμές. Κάθε γραμμή αντιπροσωπεύει έναν χρήστη. Κάθε γραμμή έχει 12 δυνατότητες, έναν δείκτη θεραπείας και δύο δυαδικές ετικέτες που περιλαμβάνουν επίσκεψη και μετατροπή.

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

  • f0 - f11: τιμές δυνατοτήτων (πυκνές, αιωρούμενες τιμές)
  • θεραπεία: εάν ένας χρήστης ήταν τυχαία στόχος για θεραπεία (για παράδειγμα, διαφήμιση) (1 = θεραπεία, 0 = έλεγχος)
  • μετατροπής: εάν έγινε μετατροπή (για παράδειγμα, πραγματοποίησε αγορά) για έναν χρήστη (δυαδική, ετικέτα)
  • επισκεφθείτε: εάν έγινε μετατροπή (για παράδειγμα, πραγματοποίησε αγορά) για έναν χρήστη (δυαδική, ετικέτα)

Αναφορά

Το σύνολο δεδομένων που χρησιμοποιείται για αυτό το σημειωματάριο απαιτεί αυτή τη παραπομπή BibTex:

@inproceedings{Diemert2018,
author = {{Diemert Eustache, Betlei Artem} and Renaudin, Christophe and Massih-Reza, Amini},
title={A Large Scale Benchmark for Uplift Modeling},
publisher = {ACM},
booktitle = {Proceedings of the AdKDD and TargetAd Workshop, KDD, London,United Kingdom, August, 20, 2018},
year = {2018}
}

Φιλοδώρημα

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

IS_CUSTOM_DATA = False  # If True, the user must upload the dataset manually
DATA_FOLDER = "Files/uplift-modelling"
DATA_FILE = "criteo-research-uplift-v2.1.csv"

# Data schema
FEATURE_COLUMNS = [f"f{i}" for i in range(12)]
TREATMENT_COLUMN = "treatment"
LABEL_COLUMN = "visit"

EXPERIMENT_NAME = "aisample-upliftmodelling"  # MLflow experiment name

Εισαγωγή βιβλιοθηκών

Πριν από την επεξεργασία, πρέπει να εισαγάγετε τις απαιτούμενες βιβλιοθήκες Spark και SynapseML. Πρέπει επίσης να εισαγάγετε μια βιβλιοθήκη απεικόνισης δεδομένων, για παράδειγμα, seaborn, μια βιβλιοθήκη απεικόνισης δεδομένων Python. Μια βιβλιοθήκη απεικονίσεων δεδομένων παρέχει μια διασύνδεση υψηλού επιπέδου για τη δημιουργία πόρων απεικονίσεων σε DataFrame και πίνακες. Μάθετε περισσότερα σχετικά με το Spark, το το SynapseMLκαι το Seaborn .

import os
import gzip

import pyspark.sql.functions as F
from pyspark.sql.window import Window
from pyspark.sql.types import *

import numpy as np
import pandas as pd

import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.style as style
import seaborn as sns

%matplotlib inline

from synapse.ml.featurize import Featurize
from synapse.ml.core.spark import FluentAPI
from synapse.ml.lightgbm import *
from synapse.ml.train import ComputeModelStatistics

import mlflow

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

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

Σημαντικός

Βεβαιωθείτε ότι προσθέσετε ένα lakehouse στο σημειωματάριο προτού το εκτελέσετε. Εάν δεν το κάνετε αυτό, θα παρουσιαστεί σφάλμα.

if not IS_CUSTOM_DATA:
    # Download demo data files into lakehouse if not exist
    import os, requests

    remote_url = "http://go.criteo.net/criteo-research-uplift-v2.1.csv.gz"
    download_file = "criteo-research-uplift-v2.1.csv.gz"
    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}/{DATA_FILE}"):
        r = requests.get(f"{remote_url}", timeout=30)
        with open(f"{download_path}/{download_file}", "wb") as f:
            f.write(r.content)
        with gzip.open(f"{download_path}/{download_file}", "rb") as fin:
            with open(f"{download_path}/{DATA_FILE}", "wb") as fout:
                fout.write(fin.read())
    print("Downloaded demo data files into lakehouse.")

Ξεκινήστε την εγγραφή του χρόνου εκτέλεσης αυτού του σημειωματάριου.

# Record the notebook running time
import time

ts = time.time()

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

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

# Set up the MLflow experiment
import mlflow

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

Σημείωση

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

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

Διαβάστε ανεπεξέργαστα δεδομένα από το lakehouse Files ενότητα και προσθέστε περισσότερες στήλες για διαφορετικά μέρη ημερομηνίας. Οι ίδιες πληροφορίες χρησιμοποιούνται για τη δημιουργία ενός διαμεισμένου πίνακα δέλτα.

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

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

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

display(raw_df.limit(20))

Εξετάστε το ποσοστό των χρηστών που επισκέπτονται, το ποσοστό των χρηστών που μετατρέπουν και το ποσοστό των επισκεπτών που κάνουν μετατροπή.

raw_df.select(
    F.mean("visit").alias("Percentage of users that visit"),
    F.mean("conversion").alias("Percentage of users that convert"),
    (F.sum("conversion") / F.sum("visit")).alias("Percentage of visitors that convert"),
).show()

Η ανάλυση δείχνει ότι 4,9% χρηστών από την ομάδα θεραπείας - χρήστες που έλαβαν τη θεραπεία ή τη διαφήμιση - επισκέφθηκαν το ηλεκτρονικό κατάστημα. Μόνο 3,8% χρηστών από την ομάδα ελέγχου - χρήστες που δεν έλαβαν ποτέ τη θεραπεία ή δεν προσφέρθηκαν ή εκτέθηκαν ποτέ σε διαφήμιση - έκαναν το ίδιο. Επιπλέον, 0,31% όλων των χρηστών από την ομάδα επεξεργασίας που μετατράπηκαν ή πραγματοποίησαν αγορά - ενώ μόνο 0,19% χρηστών από την ομάδα ελέγχου το έκαναν. Κατά συνέπεια, το ποσοστό μετατροπών των επισκεπτών που πραγματοποίησαν αγορά, οι οποίοι ήταν επίσης μέλη της ομάδας θεραπείας, είναι 6,36%, σε σύγκριση με μόνο 5,07%** για τους χρήστες της ομάδας ελέγχου. Με βάση αυτά τα αποτελέσματα, η θεραπεία μπορεί δυνητικά να βελτιώσει το ποσοστό επίσκεψης κατά περίπου 1%και το ποσοστό μετατροπής των επισκεπτών κατά περίπου 1,3%. Η θεραπεία οδηγεί σε σημαντική βελτίωση.

Βήμα 3: Ορισμός του μοντέλου για εκπαίδευση

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

Εδώ, μπορείτε να προσαρμόσετε έναν μετασχηματιστή Featurize στο raw_df DataFrame, για να εξαγάγετε δυνατότητες από τις καθορισμένες στήλες εισόδου και να εξαγάγετε αυτές τις δυνατότητες σε μια νέα στήλη με την ονομασία features.

Το dataFrame που προκύπτει αποθηκεύεται σε ένα νέο DataFrame με την ονομασία df.

transformer = Featurize().setOutputCol("features").setInputCols(FEATURE_COLUMNS).fit(raw_df)
df = transformer.transform(raw_df)
# Split the DataFrame into training and test sets, with a 80/20 ratio and a seed of 42
train_df, test_df = df.randomSplit([0.8, 0.2], seed=42)

# Print the training and test dataset sizes
print("Size of train dataset: %d" % train_df.count())
print("Size of test dataset: %d" % test_df.count())

# Group the training dataset by the treatment column, and count the number of occurrences of each value
train_df.groupby(TREATMENT_COLUMN).count().show()

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

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

# Extract the treatment and control DataFrames
treatment_train_df = train_df.where(f"{TREATMENT_COLUMN} > 0")
control_train_df = train_df.where(f"{TREATMENT_COLUMN} = 0")

Τώρα που έχετε προετοιμάσει τα δεδομένα σας, μπορείτε να συνεχίσετε με την εκπαίδευση ενός μοντέλου με το LightGBM.

Μοντελοποίηση αναβάθμισης: T-Learner με LightGBM

Οι μετα-εκπαιδευόμενοι είναι ένα σύνολο αλγόριθμων, που βασίζονται σε αλγόριθμους εκμάθησης μηχανής, όπως LightGBM, Xgboost κ.λπ. Βοηθούν στην εκτίμηση της επίδρασης της μέσης θεραπείας υπό όρους ή των CATE . Ο μαθητής T-learner είναι ένας μετα-μαθητής που δεν χρησιμοποιεί ένα μόνο μοντέλο. Αντίθετα, ο μαθητής T χρησιμοποιεί ένα μοντέλο ανά μεταβλητή θεραπείας. Επομένως, αναπτύσσονται δύο μοντέλα και αναφερόμαστε στον μετα-μαθητή ως t-learner. Ο μαθητής T-learner χρησιμοποιεί πολλά μοντέλα εκμάθησης μηχανής για να ξεπεράσει το πρόβλημα της πλήρους απόρριψης της θεραπείας, αναγκάζοντας τον μαθητή να τον χωρίσει πρώτα.

mlflow.autolog(exclusive=False)
classifier = (
    LightGBMClassifier(dataTransferMode="bulk")
    .setFeaturesCol("features")  # Set the column name for features
    .setNumLeaves(10)  # Set the number of leaves in each decision tree
    .setNumIterations(100)  # Set the number of boosting iterations
    .setObjective("binary")  # Set the objective function for binary classification
    .setLabelCol(LABEL_COLUMN)  # Set the column name for the label
)

# Start a new MLflow run with the name "uplift"
active_run = mlflow.start_run(run_name="uplift")

# Start a new nested MLflow run with the name "treatment"
with mlflow.start_run(run_name="treatment", nested=True) as treatment_run:
    treatment_run_id = treatment_run.info.run_id  # Get the ID of the treatment run
    treatment_model = classifier.fit(treatment_train_df)  # Fit the classifier on the treatment training data

# Start a new nested MLflow run with the name "control"
with mlflow.start_run(run_name="control", nested=True) as control_run:
    control_run_id = control_run.info.run_id  # Get the ID of the control run
    control_model = classifier.fit(control_train_df)  # Fit the classifier on the control training data
     

Χρήση του συνόλου δεδομένων δοκιμής για μια πρόβλεψη

Εδώ, χρησιμοποιείτε τις treatment_model και control_model, που έχουν οριστεί και οι δύο παραπάνω, για να μετασχηματίσετε το test_df σύνολο δεδομένων δοκιμής. Στη συνέχεια, υπολογίζετε την προβλεπόμενη αύξηση. Ορίζετε την προβλεπόμενη αύξηση ως τη διαφορά μεταξύ του προβλεπόμενου αποτελέσματος θεραπείας και του προβλεπόμενου αποτελέσματος ελέγχου. Όσο μεγαλύτερη ήταν αυτή η προβλεπόμενη διαφορά ανύψωσης, τόσο μεγαλύτερη είναι η αποτελεσματικότητα της θεραπείας (για παράδειγμα, η διαφήμιση) σε ένα άτομο ή μια υποομάδα.

getPred = F.udf(lambda v: float(v[1]), FloatType())

# Cache the resulting DataFrame for easier access
test_pred_df = (
    test_df.mlTransform(treatment_model)
    .withColumn("treatment_pred", getPred("probability"))
    .drop("rawPrediction", "probability", "prediction")
    .mlTransform(control_model)
    .withColumn("control_pred", getPred("probability"))
    .drop("rawPrediction", "probability", "prediction")
    .withColumn("pred_uplift", F.col("treatment_pred") - F.col("control_pred"))
    .select(TREATMENT_COLUMN, LABEL_COLUMN, "treatment_pred", "control_pred", "pred_uplift")
    .cache()
)

# Display the first twenty rows of the resulting DataFrame
display(test_pred_df.limit(20))

Εκτέλεση αξιολόγησης μοντέλου

Δεδομένου ότι δεν μπορεί να παρατηρηθεί πραγματική αύξηση για κάθε άτομο, πρέπει να μετρήσετε την αύξηση πάνω από μια ομάδα ατόμων. Χρησιμοποιείτε μια καμπύλη Uplift που σχεδιάζει την πραγματική, αθροιστική ανύψωση σε όλο τον πληθυσμό.

Στιγμιότυπο οθόνης ενός γραφήματος που εμφανίζει μια κανονικοποιημένη καμπύλη μοντέλου ανυψώματος έναντι τυχαίας θεραπείας.

Ο άξονας x αντιπροσωπεύει την αναλογία του πληθυσμού που επιλέχθηκε για τη θεραπεία. Η τιμή 0 δεν υποδηλώνει καμία ομάδα θεραπείας - κανείς δεν εκτίθεται ή προσφέρεται στη θεραπεία. Η τιμή 1 υποδηλώνει μια πλήρη ομάδα θεραπείας - όλοι εκτίθενται ή προσφέρονται, στη θεραπεία. Ο άξονας y εμφανίζει τη μέτρηση ανυψωτικής λειτουργίας. Ο στόχος είναι να βρεθεί το μέγεθος της ομάδας θεραπείας ή το ποσοστό του πληθυσμού που θα προσφερόταν ή θα εκτίθεται στη θεραπεία (για παράδειγμα, διαφήμιση). Αυτή η προσέγγιση βελτιστοποιεί την επιλογή προορισμού, για βελτιστοποίηση του αποτελέσματος.

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

# Compute the percentage rank of the predicted uplift values in descending order, and display the top twenty rows
test_ranked_df = test_pred_df.withColumn("percent_rank", F.percent_rank().over(Window.orderBy(F.desc("pred_uplift"))))

display(test_ranked_df.limit(20))

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

# Calculate the number of control and treatment samples
C = test_ranked_df.where(f"{TREATMENT_COLUMN} == 0").count()
T = test_ranked_df.where(f"{TREATMENT_COLUMN} != 0").count()

# Add columns to the DataFrame to calculate the control and treatment cumulative sum
test_ranked_df = (
    test_ranked_df.withColumn(
        "control_label",
        F.when(F.col(TREATMENT_COLUMN) == 0, F.col(LABEL_COLUMN)).otherwise(0),
    )
    .withColumn(
        "treatment_label",
        F.when(F.col(TREATMENT_COLUMN) != 0, F.col(LABEL_COLUMN)).otherwise(0),
    )
    .withColumn(
        "control_cumsum",
        F.sum("control_label").over(Window.orderBy("percent_rank")) / C,
    )
    .withColumn(
        "treatment_cumsum",
        F.sum("treatment_label").over(Window.orderBy("percent_rank")) / T,
    )
)

# Display the first 20 rows of the dataframe
display(test_ranked_df.limit(20))

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

test_ranked_df = test_ranked_df.withColumn("group_uplift", F.col("treatment_cumsum") - F.col("control_cumsum")).cache()
display(test_ranked_df.limit(20))

Τώρα, σχεδιάστε την καμπύλη ανυψώματος για την πρόβλεψη του συνόλου δεδομένων δοκιμής. Πρέπει να μετατρέψετε το PySpark DataFrame σε Pandas DataFrame πριν από τη σχεδίαση.

def uplift_plot(uplift_df):
    """
    Plot the uplift curve
    """
    gain_x = uplift_df.percent_rank
    gain_y = uplift_df.group_uplift
    # Plot the data
    fig = plt.figure(figsize=(10, 6))
    mpl.rcParams["font.size"] = 8

    ax = plt.plot(gain_x, gain_y, color="#2077B4", label="Normalized Uplift Model")

    plt.plot(
        [0, gain_x.max()],
        [0, gain_y.max()],
        "--",
        color="tab:orange",
        label="Random Treatment",
    )
    plt.legend()
    plt.xlabel("Porportion Targeted")
    plt.ylabel("Uplift")
    plt.grid()

    return fig, ax


test_ranked_pd_df = test_ranked_df.select(["pred_uplift", "percent_rank", "group_uplift"]).toPandas()
fig, ax = uplift_plot(test_ranked_pd_df)

mlflow.log_figure(fig, "UpliftCurve.png")

Στιγμιότυπο οθόνης ενός γραφήματος που εμφανίζει μια κανονικοποιημένη καμπύλη μοντέλου ανυψώματος έναντι τυχαίας θεραπείας.

Ο άξονας x αντιπροσωπεύει την αναλογία του πληθυσμού που επιλέχθηκε για τη θεραπεία. Η τιμή 0 δεν υποδηλώνει καμία ομάδα θεραπείας - κανείς δεν εκτίθεται ή προσφέρεται στη θεραπεία. Η τιμή 1 υποδηλώνει μια πλήρη ομάδα θεραπείας - όλοι εκτίθενται ή προσφέρονται, στη θεραπεία. Ο άξονας y εμφανίζει τη μέτρηση ανυψωτικής λειτουργίας. Ο στόχος είναι να βρεθεί το μέγεθος της ομάδας θεραπείας ή το ποσοστό του πληθυσμού που θα προσφερόταν ή θα εκτίθεται στη θεραπεία (για παράδειγμα, διαφήμιση). Αυτή η προσέγγιση βελτιστοποιεί την επιλογή προορισμού, για βελτιστοποίηση του αποτελέσματος.

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

# Compute the percentage rank of the predicted uplift values in descending order, and display the top twenty rows
test_ranked_df = test_pred_df.withColumn("percent_rank", F.percent_rank().over(Window.orderBy(F.desc("pred_uplift"))))

display(test_ranked_df.limit(20))

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

# Calculate the number of control and treatment samples
C = test_ranked_df.where(f"{TREATMENT_COLUMN} == 0").count()
T = test_ranked_df.where(f"{TREATMENT_COLUMN} != 0").count()

# Add columns to the DataFrame to calculate the control and treatment cumulative sum
test_ranked_df = (
    test_ranked_df.withColumn(
        "control_label",
        F.when(F.col(TREATMENT_COLUMN) == 0, F.col(LABEL_COLUMN)).otherwise(0),
    )
    .withColumn(
        "treatment_label",
        F.when(F.col(TREATMENT_COLUMN) != 0, F.col(LABEL_COLUMN)).otherwise(0),
    )
    .withColumn(
        "control_cumsum",
        F.sum("control_label").over(Window.orderBy("percent_rank")) / C,
    )
    .withColumn(
        "treatment_cumsum",
        F.sum("treatment_label").over(Window.orderBy("percent_rank")) / T,
    )
)

# Display the first 20 rows of the dataframe
display(test_ranked_df.limit(20))

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

test_ranked_df = test_ranked_df.withColumn("group_uplift", F.col("treatment_cumsum") - F.col("control_cumsum")).cache()
display(test_ranked_df.limit(20))

Τώρα, σχεδιάστε την καμπύλη ανυψώματος για την πρόβλεψη του συνόλου δεδομένων δοκιμής. Πρέπει να μετατρέψετε το PySpark DataFrame σε Pandas DataFrame πριν από τη σχεδίαση.

def uplift_plot(uplift_df):
    """
    Plot the uplift curve
    """
    gain_x = uplift_df.percent_rank
    gain_y = uplift_df.group_uplift
    # Plot the data
    fig = plt.figure(figsize=(10, 6))
    mpl.rcParams["font.size"] = 8

    ax = plt.plot(gain_x, gain_y, color="#2077B4", label="Normalized Uplift Model")

    plt.plot(
        [0, gain_x.max()],
        [0, gain_y.max()],
        "--",
        color="tab:orange",
        label="Random Treatment",
    )
    plt.legend()
    plt.xlabel("Porportion Targeted")
    plt.ylabel("Uplift")
    plt.grid()

    return fig, ax


test_ranked_pd_df = test_ranked_df.select(["pred_uplift", "percent_rank", "group_uplift"]).toPandas()
fig, ax = uplift_plot(test_ranked_pd_df)

mlflow.log_figure(fig, "UpliftCurve.png")

Στιγμιότυπο οθόνης ενός γραφήματος που εμφανίζει μια κανονικοποιημένη καμπύλη μοντέλου ανυψώματος έναντι τυχαίας θεραπείας.

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

cutoff_percentage = 0.2
cutoff_score = test_ranked_pd_df.iloc[int(len(test_ranked_pd_df) * cutoff_percentage)][
    "pred_uplift"
]

print("Uplift scores that exceed {:.4f} map to Persuadables.".format(cutoff_score))
mlflow.log_metrics(
    {"cutoff_score": cutoff_score, "cutoff_percentage": cutoff_percentage}
)

Βήμα 4: Καταχώρηση του τελικού μοντέλου εκμάθησης μηχανής

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

# Register the model
treatment_model_uri = "runs:/{}/model".format(treatment_run_id)
mlflow.register_model(treatment_model_uri, f"{EXPERIMENT_NAME}-treatmentmodel")

control_model_uri = "runs:/{}/model".format(control_run_id)
mlflow.register_model(control_model_uri, f"{EXPERIMENT_NAME}-controlmodel")

mlflow.end_run()

Για να δείτε τα πειράματά σας:

  1. Στον αριστερό πίνακα, επιλέξτε τον χώρο εργασίας σας.
  2. Βρείτε και επιλέξτε το όνομα του πειράματος, σε αυτή την περίπτωση aisample-upliftmodelling.

στιγμιότυπο οθόνης που εμφανίζει τα αποτελέσματα του πειράματος μοντελοποίησης aisample uplift.

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

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

# Load the model back
loaded_treatmentmodel = mlflow.spark.load_model(treatment_model_uri, dfs_tmpdir="Files/spark")
loaded_controlmodel = mlflow.spark.load_model(control_model_uri, dfs_tmpdir="Files/spark")

# Make predictions
batch_predictions_treatment = loaded_treatmentmodel.transform(test_df)
batch_predictions_control = loaded_controlmodel.transform(test_df)
batch_predictions_treatment.show(5)
# Save the predictions in the lakehouse
batch_predictions_treatment.write.format("delta").mode("overwrite").save(
    f"{DATA_FOLDER}/predictions/batch_predictions_treatment"
)
batch_predictions_control.write.format("delta").mode("overwrite").save(
    f"{DATA_FOLDER}/predictions/batch_predictions_control"
)
# Determine the entire runtime
print(f"Full run cost {int(time.time() - ts)} seconds.")