Öğretici: Uplift modeli oluşturma, eğitme ve değerlendirme

Bu öğretici, Microsoft Fabric'te Synapse Veri Bilimi iş akışının uçtan uca bir örneğini sunar. Uplift modellerini oluşturmayı, eğitmeyi ve değerlendirmeyi ve uplift modelleme tekniklerini uygulamayı öğrenirsiniz.

Önkoşullar

  • Microsoft Fabric not defterleri hakkında bilgi
  • Bu not defteri için, bu örnekteki verileri depolamak için bir lakehouse. Daha fazla bilgi için Not defterinize göl evi ekleme adresini ziyaret edin

Not defterinde birlikte izleme

Not defterindeki adımları iki yoldan biriyle izleyebilirsiniz:

  • Synapse Veri Bilimi deneyiminde yerleşik not defterini açma ve çalıştırma
  • Not defterinizi GitHub'dan Synapse Veri Bilimi deneyimine yükleme

Yerleşik not defterini açma

Örnek Uplift modelleme not defteri bu öğreticiye eşlik eder. Synapse Veri Bilimi deneyiminde öğreticinin yerleşik örnek not defterini açmak için:1 adresini ziyaret edin. Synapse Veri Bilimi giriş sayfasına gidin. 1. Örnek kullan'ı seçin. 1. Örnek bir Python öğreticisi içinse, varsayılan uçtan uca iş akışları (Python) sekmesinden ilgili örneği seçin:* . * Örnek bir R öğreticisi içinse Uçtan uca iş akışları (R) sekmesinden. * Hızlı öğreticiler sekmesinde, örnek hızlı bir öğretici içinse.1. Kod çalıştırmaya başlamadan önce not defterine bir lakehouse ekleyin. öğreticiler için yerleşik örnek not defterlerine erişme hakkında daha fazla bilgi için.

Synapse Veri Bilimi deneyiminde öğreticinin yerleşik örnek not defterini açmak için:

  1. Synapse Veri Bilimi giriş sayfasına gidin

  2. Örnek kullan'ı seçin

  3. İlgili örneği seçin:

    1. Örnek bir Python öğreticisi içinse varsayılan uçtan uca iş akışları (Python) sekmesinden
    2. Örnek bir R öğreticisi içinse Uçtan uca iş akışları (R) sekmesinden
    3. Örnek hızlı bir öğretici içinse Hızlı öğreticiler sekmesinden
  4. Kod çalıştırmaya başlamadan önce not defterine bir lakehouse ekleme

Not defterini GitHub'dan içeri aktarma

Bu öğreticiye AIsample - Uplift Modeling.ipynb not defteri eşlik eder.

Bu öğreticide eşlik eden not defterini açmak için, not defterini çalışma alanınıza aktarmak üzere Sisteminizi veri bilimi öğreticilerine hazırlama başlığındaki yönergeleri izleyin.

Bu sayfadan kodu kopyalayıp yapıştırmak isterseniz yeni bir not defteri oluşturabilirsiniz.

Kod çalıştırmaya başlamadan önce not defterine bir göl evi eklediğinizden emin olun.

1. Adım: Verileri yükleme

Veri kümesi

Criteo AI Lab veri kümesini oluşturmuştur. Bu veri kümesinin 13M satırı vardır. Her satır bir kullanıcıyı temsil eder. Her satırda 12 özellik, bir işlem göstergesi ve ziyaret ve dönüştürme içeren iki ikili etiket vardır.

f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 f10 f11 tedavi dönüştürme

  • f0 - f11: özellik değerleri (yoğun, kayan değerler)
  • tedavi: Bir kullanıcının tedavi için rastgele hedeflenip hedeflenmediği (örneğin reklam) (1 = tedavi, 0 = kontrol)
  • dönüştürme: Bir kullanıcı (ikili, etiket) için dönüştürme yapılıp yapılmadığı (örneğin, satın alma işlemi yapılmış)
  • visit: bir kullanıcı (ikili, etiket) için dönüştürme yapılıp yapılmadığı (örneğin, satın alma)

Alıntı

Bu not defteri için kullanılan veri kümesi için şu BibTex alıntısı gerekir:

@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}
}

İpucu

Aşağıdaki parametreleri tanımlayarak bu not defterini farklı veri kümelerine kolayca uygulayabilirsiniz.

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

Kitaplıkları içeri aktarma

İşlemeden önce gerekli Spark ve SynapseML kitaplıklarını içeri aktarmanız gerekir. Veri görselleştirme kitaplığını da içeri aktarmanız gerekir; örneğin, Python veri görselleştirme kitaplığı Seaborn. Veri görselleştirme kitaplığı, DataFrame'ler ve diziler üzerinde görsel kaynaklar oluşturmak için üst düzey bir arabirim sağlar. Spark, SynapseML ve Seaborn hakkında daha fazla bilgi edinin.

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

Veri kümesini indirme ve lakehouse'a yükleme

Bu kod, veri kümesinin genel kullanıma açık bir sürümünü indirir ve ardından bu veri kaynağını bir Fabric lakehouse'ta depolar.

Önemli

Çalıştırmadan önce not defterine göl evi eklediğinizden emin olun. Bunun yapılmaması hataya neden olur.

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

Bu not defterinin çalışma zamanını kaydetmeye başlayın.

# Record the notebook running time
import time

ts = time.time()

MLflow deneme izlemesini ayarlama

MLflow günlük özelliklerini genişletmek için otomatik kaydetme, eğitim sırasında bir makine öğrenmesi modelinin giriş parametrelerinin ve çıkış ölçümlerinin değerlerini otomatik olarak yakalar. Bu bilgiler, MLflow API'lerinin veya çalışma alanında karşılık gelen denemenin erişebildiği ve görselleştirebildiği çalışma alanına kaydedilir. Otomatik dağıtma hakkında daha fazla bilgi için bu kaynağı ziyaret edin.

# Set up the MLflow experiment
import mlflow

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

Not

Not defteri oturumunda Microsoft Fabric otomatik kaydetmeyi devre dışı bırakmak için öğesini çağırın mlflow.autolog() ve ayarlayın disable=True.

Göl evinden veri okuma

Lakehouse Files bölümünden ham verileri okuyun ve farklı tarih bölümleri için daha fazla sütun ekleyin. Bölümlenmiş delta tablosu oluşturmak için de aynı bilgiler kullanılır.

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

2. Adım: Keşif veri analizi

Veri kümesiyle display ilgili üst düzey istatistikleri görüntülemek için komutunu kullanın. Veri kümesinin alt kümelerini kolayca görselleştirmek için Grafik görünümlerini de gösterebilirsiniz.

display(raw_df.limit(20))

Ziyaret eden kullanıcıların yüzdesini, dönüştüren kullanıcıların yüzdesini ve dönüştüren ziyaretçilerin yüzdesini inceleyin.

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()

Analiz, işlem grubundaki kullanıcıların %4,9'unun (tedaviyi alan veya reklam veren kullanıcılar) çevrimiçi mağazayı ziyaret ettiğini gösterir. Kontrol grubundaki kullanıcıların yalnızca % 3,8'i ( hiç işlem almamış veya hiçbir zaman teklif sunulmamış veya reklama açık olmayan kullanıcılar) aynı işlemi yapmıştır. Buna ek olarak, işlem grubundaki tüm kullanıcıların % 0,31'i dönüştürme veya satın alma işlemi yaparken, denetim grubundaki kullanıcıların yalnızca % 0,19'unu dönüştürmüştür. Sonuç olarak, aynı zamanda tedavi grubunun üyesi olan satın alma işlemini gerçekleştiren ziyaretçilerin dönüşüm oranı %6,36'dır ve bu oran denetim grubu kullanıcıları için yalnızca %5,07**'dir. Bu sonuçlara bağlı olarak, işlem potansiyel olarak ziyaret oranını yaklaşık %1 ve ziyaretçilerin dönüşüm oranını yaklaşık %1,3 artırabilir. Tedavi önemli bir gelişmeye yol açar.

3. Adım: Eğitim için modeli tanımlama

Eğitimi hazırlama ve veri kümelerini test edin

Burada, belirtilen giriş sütunlarından özellikleri ayıklamak raw_df ve bu özellikleri adlı featuresyeni bir sütuna çıkarmak için Bir Featurize dönüştürücüsü DataFrame'e sığdırırsınız.

Sonuçta elde edilen DataFrame adlı dfyeni bir DataFrame'de depolanır.

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()

İşlem ve denetim veri kümelerini hazırlama

Eğitim ve test veri kümelerini oluşturduktan sonra, makine öğrenmesi modellerini yükseltmeyi ölçecek şekilde eğitmek için işleme ve denetim veri kümelerini de oluşturmanız gerekir.

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

Verilerinizi hazırladığınıza göre, LightGBM ile bir modeli eğitmeye devam edebilirsiniz.

Uplift modelleme: LightGBM ile T-Learner

Meta öğrenenler, LightGBM, Xgboost vb. makine öğrenmesi algoritmalarının üzerine kurulmuş bir dizi algoritmadır. Koşullu ortalama işlem etkisini veya CATE'yi tahmin etmede yardımcı olur. T-learner, tek bir model kullanmayan bir meta öğrencidir. Bunun yerine, T-learner işlem değişkeni başına bir model kullanır. Bu nedenle iki model geliştirilir ve meta-öğrenene T-learner olarak atıfta bulunuruz. T-learner, tedaviyi tamamen atma sorununun üstesinden gelmek için birden çok makine öğrenmesi modeli kullanır ve bunu öğreneni ilk olarak bölmeye zorlar.

mlflow.autolog(exclusive=False)
classifier = (
    LightGBMClassifier()
    .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
     

Tahmin için test veri kümesini kullanma

Burada, treatment_model test veri kümesini dönüştürmek test_df için daha önce tanımlanan ve control_modelkullanın. Ardından tahmin edilen yukarı kaldırmayı hesaplarsınız. Tahmin edilen yukarı kaldırmayı, tahmin edilen tedavi sonucu ile tahmin edilen kontrol sonucu arasındaki fark olarak tanımlarsınız. Bu tahmin edilen yükseltme farkı ne kadar büyük olursa, bir birey veya alt grup üzerinde tedavinin (örneğin reklam) etkinliği de o kadar fazla olur.

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

Model değerlendirmesi gerçekleştirme

Her birey için gerçek bir yukarı kaldırma gözlemlenmediğinden, bir grup birey üzerinde yukarı kaldırmayı ölçmeniz gerekir. Popülasyon genelinde gerçek, kümülatif yukarı kaldırmayı çizen bir Uplift Eğrisi kullanırsınız.

Normalleştirilmiş bir yukarı kaldırma modeli eğrisini ve rastgele işlemeyi gösteren grafiğin ekran görüntüsü.

x ekseni, işlem için seçilen popülasyonun oranını temsil eder. 0 değeri hiçbir tedavi grubu önermez - kimse tedaviye maruz kalmaz veya sunulmaz. 1 değeri tam bir tedavi grubu önerir- herkes tedaviye maruz kalıyor veya tedavi sunuluyor. y ekseni, yukarı kaldırma ölçüsünü gösterir. Amaç, tedavi grubunun boyutunu veya tedavinin sunulacağı veya kullanıma sunulacağı popülasyonun yüzdesini bulmaktır (örneğin, reklam). Bu yaklaşım, sonucu iyileştirmek için hedef seçimi iyileştirir.

İlk olarak, test DataFrame sırasını tahmin edilen yukarı kaldırmaya göre derecelendirin. Tahmin edilen yukarı kaldırma, tahmin edilen tedavi sonucu ile tahmin edilen kontrol sonucu arasındaki farktır.

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

Ardından, hem tedavi hem de kontrol gruplarındaki ziyaretlerin kümülatif yüzdesini hesaplayın.

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

Son olarak, her yüzdede, tedavi ve kontrol grupları arasındaki ziyaretlerin kümülatif yüzdesi arasındaki fark olarak grubun yukarı yukarı doğru değerini hesaplayın.

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

Şimdi test veri kümesi tahmini için yükseltme eğrisini çizin. Çizimden önce PySpark DataFrame'i Pandas DataFrame'e dönüştürmeniz gerekir.

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

Normalleştirilmiş bir yukarı kaldırma modeli eğrisini ve rastgele işlemeyi gösteren grafiğin ekran görüntüsü.

x ekseni, işlem için seçilen popülasyonun oranını temsil eder. 0 değeri hiçbir tedavi grubu önermez - kimse tedaviye maruz kalmaz veya sunulmaz. 1 değeri tam bir tedavi grubu önerir- herkes tedaviye maruz kalıyor veya tedavi sunuluyor. y ekseni, yukarı kaldırma ölçüsünü gösterir. Amaç, tedavi grubunun boyutunu veya tedavinin sunulacağı veya kullanıma sunulacağı popülasyonun yüzdesini bulmaktır (örneğin, reklam). Bu yaklaşım, sonucu iyileştirmek için hedef seçimi iyileştirir.

İlk olarak, test DataFrame sırasını tahmin edilen yukarı kaldırmaya göre derecelendirin. Tahmin edilen yukarı kaldırma, tahmin edilen tedavi sonucu ile tahmin edilen kontrol sonucu arasındaki farktır.

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

Ardından, hem tedavi hem de kontrol gruplarındaki ziyaretlerin kümülatif yüzdesini hesaplayın.

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

Son olarak, her yüzdede, tedavi ve kontrol grupları arasındaki ziyaretlerin kümülatif yüzdesi arasındaki fark olarak grubun yukarı yukarı doğru değerini hesaplayın.

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

Şimdi test veri kümesi tahmini için yükseltme eğrisini çizin. Çizimden önce PySpark DataFrame'i Pandas DataFrame'e dönüştürmeniz gerekir.

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

Normalleştirilmiş bir yukarı kaldırma modeli eğrisini ve rastgele işlemeyi gösteren grafiğin ekran görüntüsü.

Hem analiz hem de yukarı kaldırma eğrisi, tahmine göre sıralanan ilk %20 popülasyonunun, tedaviyi alması durumunda büyük bir kazanç elde edeceğini göstermektedir. Bu, popülasyonun ilk %20'sinin ikna edilebilirler grubunu temsil ettiği anlamına gelir. Bu nedenle, en büyük etkiyi elde etmek için hedef seçim müşterilerini belirlemek üzere istenen işlem grubu boyutu için kesme puanını %20 olarak ayarlayabilirsiniz.

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. Adım: Son ML Modelini kaydetme

Hem işlem hem de denetim grupları için tüm denemeleri izlemek ve günlüğe kaydetmek için MLflow kullanırsınız. Bu izleme ve günlüğe kaydetme işlemine karşılık gelen parametreler, ölçümler ve modeller dahildir. Bu bilgiler, daha sonra kullanmak üzere çalışma alanında deneme adı altında günlüğe kaydedilir.

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

Denemelerinizi görüntülemek için:

  1. Sol panelde çalışma alanınızı seçin.
  2. Bu örnekte aisample-upliftmodelling deneme adını bulun ve seçin.

Aisample uplift modelleme denemesi sonuçlarını gösteren ekran görüntüsü.

5. Adım: Tahmin sonuçlarını kaydetme

Microsoft Fabric, herhangi bir işlem altyapısında toplu puanlama desteği sunan ölçeklenebilir bir işlev olan PREDICT sunar. Müşterilerin makine öğrenmesi modellerini kullanıma hazır hale getirmesini sağlar. Kullanıcılar, belirli bir model için doğrudan bir not defterinden veya öğe sayfasından toplu tahminler oluşturabilir. PREDICT hakkında daha fazla bilgi edinmek ve Microsoft Fabric'te PREDICT kullanmayı öğrenmek için bu kaynağı ziyaret edin.

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