Zaman serisi tahmin modelini eğitin ve değerlendirin

Bu not defterinde, mevsimsel döngüleri olan zaman serisi verilerini tahmin etmek için bir program oluşturacağız. NYC Açık Veri Portalı'nda NYC Finans Departmanı tarafından yayımlanan 2003 ile 2015 arasında tarihlerle NYC Property Sales veri kümesini kullanırız.

Önkoşullar

  • Microsoft Fabric not defterleri hakkında bilgi.
  • Bu örnekteki verileri depolamak için bir göl evi. Daha fazla bilgi için bkz . Not defterinize göl evi ekleme.

Not defterinde birlikte izleme

Not defterinde aşağıdaki iki yöntemden birini izleyebilirsiniz:

  • Synapse Veri Bilimi deneyiminde yerleşik not defterini açın ve çalıştırın.
  • Not defterinizi GitHub'dan Synapse Veri Bilimi deneyimine yükleyin.

Yerleşik not defterini açma

Örnek Zaman serisi not defteri bu öğreticiye eşlik eder.

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:

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

Not defterini GitHub'dan içeri aktarma

AIsample - Time Series Forecasting.ipynb , bu öğreticiye eşlik eden not defteridir.

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 sayfadaki kodu kopyalayıp yapıştırmayı tercih ederseniz, 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: Özel kitaplıkları yükleme

Bir makine öğrenmesi modeli geliştirirken veya geçici veri analizini işlerken Apache Spark oturumu için hızlı bir şekilde özel bir kitaplık (örneğin, prophet bu not defterinde) yüklemeniz gerekebilir. Bunu yapmak için iki seçeneğiniz vardır.

  1. Yeni kitaplıkları hızlı bir şekilde kullanmaya başlamak için satır içi yükleme özelliklerini (örneğin, %pip, %condavb.) kullanabilirsiniz. Bu, özel kitaplıkları çalışma alanına değil yalnızca geçerli not defterine yükler.
# Use pip to install libraries
%pip install <library name>

# Use conda to install libraries
%conda install <library name>
  1. Alternatif olarak, bir Doku ortamı oluşturabilir, ortak kaynaklardan kitaplıklar yükleyebilir veya özel kitaplıklar yükleyebilirsiniz ve çalışma alanı yöneticiniz ortamı çalışma alanı için varsayılan olarak ekleyebilir. Daha sonra ortamdaki tüm kitaplıklar çalışma alanındaki tüm not defterlerinde ve Spark iş tanımlarında kullanılabilir hale gelir. Ortamlar hakkında daha fazla bilgi için bkz . Microsoft Fabric'te ortam oluşturma, yapılandırma ve kullanma.

Bu not defteri için kitaplığı yüklemek prophet için kullanırsınız%pip install. PySpark çekirdeği sonrasında %pip installyeniden başlatılır. Bu, başka bir hücre çalıştırmadan önce kitaplığı yüklemeniz gerektiği anlamına gelir.

# Use pip to install Prophet
%pip install prophet

2. Adım: Verileri yükleme

Veri kümesi

Bu not defteri NYC Property Sales veri veri kümesini kullanır. NYC Açık Veri Portalı'nda NYC Finans Departmanı tarafından yayımlanan 2003 ile 2015 yıllarının verilerini kapsar.

Veri kümesi, 13 yıllık bir süre içinde New York City emlak pazarındaki tüm bina satışlarının kaydını içerir. Veri kümesindeki sütunların tanımı için Özellik Satış Dosyaları terimleri sözlüğüne bakın.

Borough Mahalle building_class_category tax_class block Çok eastment building_class_at_present adres apartment_number zip_code residential_units commercial_units total_units land_square_feet gross_square_feet year_built tax_class_at_time_of_sale building_class_at_time_of_sale sale_price sale_date
Manhattan ALPHABET CITY 07 KIRALAMA - WALKUP APARTMENTS 0,0 384.0 17.0 C4 225 DOĞU 2ND CADDESİ 10009.0 10.0 0,0 10.0 2145.0 6670.0 1900.0 2.0 C4 275000.0 2007-06-19
Manhattan ALPHABET CITY 07 KIRALAMA - WALKUP APARTMENTS 2.0 405,0 12.0 C7 508 DOĞU 12. CADDE 10009.0 28.0 2.0 30,0 3872.0 15428.0 1930.0 2.0 C7 7794005.0 2007-05-21

Hedef, geçmiş verilere göre aylık toplam satışları tahmin eden bir model oluşturmaktır. Bunun için Facebook tarafından geliştirilen açık kaynak bir tahmin kitaplığı olan Prophet'ı kullanırsınız. Kahin, doğrusal olmayan eğilimlerin günlük, haftalık ve yıllık mevsimsellik ile tatil etkilerine uygun olduğu, katkılı bir modeli temel alır. Kahin, mevsimsel etkileri güçlü olan zaman serisi veri kümelerinde ve çeşitli geçmiş veri sezonlarında en iyi şekilde çalışır. Ek olarak, Kahin eksik verileri ve veri aykırı değerlerini sağlam bir şekilde işler.

Kahin, üç bileşenden oluşan ayrıştırılabilir bir zaman serisi modeli kullanır:

  • eğilim: Peygamber, otomatik değişim noktası seçimi ile parça başına sabit bir büyüme oranı olduğunu varsayar
  • mevsimsellik: Varsayılan olarak, Kahin haftalık ve yıllık mevsimsellik için Fourier Serisi kullanır
  • tatiller: Peygamber, tatillerin tüm geçmiş ve gelecekteki oluşumlarını gerektirir. Eğer bir tatil gelecekte tekrar etmezse, Hz. Peygamber bunu tahmine dahil etmez.

Bu not defteri verileri aylık olarak toplar, bu nedenle tatilleri yoksayar.

Hz. Peygamber modelleme teknikleri hakkında daha fazla bilgi için resmi yazıyı okuyun.

Veri kümesini indirin ve bir lakehouse'a yükleyin

Veri kaynağı 15 .csv dosyadan oluşur. Bu dosyalar, 2003 ile 2015 yılları arasında New York'taki beş ilçenin mülk satış kayıtlarını içerir. Kolaylık sağlamak için, nyc_property_sales.tar dosya bu .csv dosyaların tümünü barındırır ve bunları tek bir dosyada sıkıştırır. Genel kullanıma açık bir blob depolama alanı bu .tar dosyayı barındırıyor.

İpucu

Bu kod hücresinde gösterilen parametrelerle, bu not defterini farklı veri kümelerine kolayca uygulayabilirsiniz.

URL = "https://synapseaisolutionsa.blob.core.windows.net/public/NYC_Property_Sales_Dataset/"
TAR_FILE_NAME = "nyc_property_sales.tar"
DATA_FOLDER = "Files/NYC_Property_Sales_Dataset"
TAR_FILE_PATH = f"/lakehouse/default/{DATA_FOLDER}/tar/"
CSV_FILE_PATH = f"/lakehouse/default/{DATA_FOLDER}/csv/"

EXPERIMENT_NAME = "aisample-timeseries" # MLflow experiment name

Bu kod, veri kümesinin genel kullanıma açık bir sürümünü indirir ve ardından bu veri kümesini bir Fabric Lakehouse'da depolar.

Önemli

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

import os

if not os.path.exists("/lakehouse/default"):
    # Add a lakehouse if the notebook has no default lakehouse
    # A new notebook will not link to any lakehouse by default
    raise FileNotFoundError(
        "Default lakehouse not found, please add a lakehouse for the notebook."
    )
else:
    # Verify whether or not the required files are already in the lakehouse, and if not, download and unzip
    if not os.path.exists(f"{TAR_FILE_PATH}{TAR_FILE_NAME}"):
        os.makedirs(TAR_FILE_PATH, exist_ok=True)
        os.system(f"wget {URL}{TAR_FILE_NAME} -O {TAR_FILE_PATH}{TAR_FILE_NAME}")

    os.makedirs(CSV_FILE_PATH, exist_ok=True)
    os.system(f"tar -zxvf {TAR_FILE_PATH}{TAR_FILE_NAME} -C {CSV_FILE_PATH}")

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 istiyorsanız öğesini çağırın mlflow.autolog() ve ayarlayın disable=True.

Göl evinden ham tarih verilerini okuma

df = (
    spark.read.format("csv")
    .option("header", "true")
    .load("Files/NYC_Property_Sales_Dataset/csv")
)

3. Adım: Keşif veri analizine başlama

Veri kümesini gözden geçirmek için verilerin bir alt kümesini el ile inceleyerek daha iyi anlayabilirsiniz. DataFrame'i display yazdırmak için işlevini kullanabilirsiniz. Veri kümesinin alt kümelerini kolayca görselleştirmek için Grafik görünümlerini de gösterebilirsiniz.

display(df)

Veri kümesinin el ile gözden geçirilmesi bazı erken gözlemlere yol açar:

  • 0,00 ABD doları satış fiyatı örnekleri. HükümLer Sözlüğü'ne göre, bu, nakit olarak düşünülmeyen bir sahiplik aktarımı anlamına gelir. Başka bir deyişle, işlemde nakit akışı yapılmamış. Veri kümesinden 0,00 sales_price ABD doları değer içeren satışları kaldırmanız gerekir.

  • Veri kümesi farklı yapı sınıflarını kapsar. Ancak bu not defteri, Terimler Sözlüğü'ne göre "A" türü olarak işaretlenmiş konut binalarına odaklanacaktır. Veri kümesini yalnızca konut binalarını içerecek şekilde filtrelemeniz gerekir. Bunu yapmak için veya sütunlarını building_class_at_time_of_salebuilding_class_at_present ekleyin. Yalnızca verileri eklemeniz building_class_at_time_of_sale gerekir.

  • Veri kümesi, değerlerin 0'a veya gross_square_feet değerlerin 0'a eşit olduğu total_units örnekleri içerir. veya değerlerinin 0'a eşit olduğu total_unitsgross_square_units tüm örnekleri kaldırmanız gerekir.

  • Bazı sütunlarda (örneğin, apartment_number, tax_class, build_class_at_presentvb.) eksik veya NULL değerleri vardır. Eksik verilerin yazım hataları veya var olmayan veriler içerdiğini varsayalım. Çözümleme bu eksik değerlere bağlı olmadığından bunları yoksayabilirsiniz.

  • Sütun sale_price , önceden eklenen "$" karakteriyle bir dize olarak depolanır. Çözümlemeye devam etmek için bu sütunu sayı olarak temsil edin. Sütunu tamsayı olarak atamanız sale_price gerekir.

Tür dönüştürme ve filtreleme

Tanımlanan sorunlardan bazılarını çözmek için gerekli kitaplıkları içeri aktarın.

# Import libraries
import pyspark.sql.functions as F
from pyspark.sql.types import *

Satış verilerini dizeden tamsayıya dönüştürme

Dizenin sayısal bölümünü dolar işaretinden ayırmak için normal ifadeler kullanın (örneğin, "$300.000" dizesinde, "$" ve "300.000" değerlerini böler ve ardından sayısal bölümü tamsayı olarak döndürür.

Ardından, verileri yalnızca bu koşulların tümünü karşılayan örnekleri içerecek şekilde filtreleyin:

  1. 0'dan sales_price büyük
  2. 0'dan total_units büyük
  3. 0'dan gross_square_feet büyük
  4. building_class_at_time_of_sale A türündedir
df = df.withColumn(
    "sale_price", F.regexp_replace("sale_price", "[$,]", "").cast(IntegerType())
)
df = df.select("*").where(
    'sale_price > 0 and total_units > 0 and gross_square_feet > 0 and building_class_at_time_of_sale like "A%"'
)

Aylık olarak toplama

Veri kaynağı, özellik satışlarını günlük olarak izler, ancak bu yaklaşım bu not defteri için çok ayrıntılıdır. Bunun yerine, verileri aylık olarak toplama.

İlk olarak, tarih değerlerini yalnızca ay ve yıl verilerini gösterecek şekilde değiştirin. Tarih değerleri yine de yıl verilerini içerir. Yine de Aralık 2005 ile Aralık 2006 arasında ayrım yapabilir.

Ayrıca, yalnızca analizle ilgili sütunları tutun. Bunlar , total_unitsgross_square_feet ve sales_dateiçerirsales_price. Ayrıca olarak yeniden adlandırmanız sales_datemonthgerekir.

monthly_sale_df = df.select(
    "sale_price",
    "total_units",
    "gross_square_feet",
    F.date_format("sale_date", "yyyy-MM").alias("month"),
)
display(monthly_sale_df)

ve total_unitsgross_square_feet değerlerini aya sale_pricegöre toplama. Ardından, verileri ölçütüne göre monthgruplandırın ve her grup içindeki tüm değerleri topla.

summary_df = (
    monthly_sale_df.groupBy("month")
    .agg(
        F.sum("sale_price").alias("total_sales"),
        F.sum("total_units").alias("units"),
        F.sum("gross_square_feet").alias("square_feet"),
    )
    .orderBy("month")
)

display(summary_df)

Pyspark'ı Pandas'a dönüştürme

Pyspark DataFrame'ler büyük veri kümelerini iyi işler. Ancak, veri toplama nedeniyle DataFrame boyutu daha küçüktür. Bu, artık pandas DataFrames'i kullanabileceğinizi gösterir.

Bu kod, veri kümesini bir pyspark DataFrame'den pandas DataFrame'e yayınlar.

import pandas as pd

df_pandas = summary_df.toPandas()
display(df_pandas)

Görselleştirme

Verileri daha iyi anlamak için New York City'nin özellik ticaret eğilimini inceleyebilirsiniz. Bu, olası desenler ve mevsimsellik eğilimleri hakkında içgörülere yol açar. Bu kaynakta Microsoft Fabric veri görselleştirmesi hakkında daha fazla bilgi edinin.

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

f, (ax1, ax2) = plt.subplots(2, 1, figsize=(35, 10))
plt.sca(ax1)
plt.xticks(np.arange(0, 15 * 12, step=12))
plt.ticklabel_format(style="plain", axis="y")
sns.lineplot(x="month", y="total_sales", data=df_pandas)
plt.ylabel("Total Sales")
plt.xlabel("Time")
plt.title("Total Property Sales by Month")

plt.sca(ax2)
plt.xticks(np.arange(0, 15 * 12, step=12))
plt.ticklabel_format(style="plain", axis="y")
sns.lineplot(x="month", y="square_feet", data=df_pandas)
plt.ylabel("Total Square Feet")
plt.xlabel("Time")
plt.title("Total Property Square Feet Sold by Month")
plt.show()

Keşif veri analizinden gözlemlerin özeti

  • Veriler, yıllık tempoda net bir yinelenen desen gösterir; Bu, verilerin yıllık mevsimselliği olduğu anlamına gelir
  • Yaz ayları, kış aylarına kıyasla daha yüksek satış hacimlerine sahip gibi görünüyor
  • Yüksek satışlı yılların ve düşük satışlı yılların karşılaştırmasında, yüksek satış ayları ile yüksek satış yıllarındaki düşük satış ayları arasındaki gelir farkı, mutlak olarak yüksek satış ayları ile düşük satış yıllarındaki düşük satış ayları arasındaki gelir farkını aşıyor.

Örneğin, 2004'te en yüksek satış ayı ile en düşük satış ayı arasındaki gelir farkı şu şekildedir:

$900,000,000 - $500,000,000 = $400,000,000

2011 için bu gelir farkı hesaplaması şu şekildedir:

$400,000,000 - $300,000,000 = $100,000,000

Bu daha sonra, çarpımsal ve ek mevsimsellik etkileri arasında karar vermeniz gerektiğinde önemli hale gelir.

4. Adım: Model eğitimi ve izleme

Model sığdırma

Kahin girişi her zaman iki sütunlu bir DataFrame'dir. Bir giriş sütunu adlı dssaat sütunu, bir giriş sütunu ise adlı ybir değer sütunudur. Saat sütununun tarih, saat veya tarih saat veri biçimi olmalıdır (örneğin, YYYY_MM). Buradaki veri kümesi bu koşulu karşılar. Değer sütunu sayısal bir veri biçimi olmalıdır.

Model sığdırma için, zaman sütununu yalnızca olarak yeniden adlandırmanız ve değer sütununu ds olarak yyeniden adlandırmanız ve verileri Peygamber'e geçirmeniz gerekir. Daha fazla bilgi için Prophet Python API belgelerini okuyun.

df_pandas["ds"] = pd.to_datetime(df_pandas["month"])
df_pandas["y"] = df_pandas["total_sales"]

Hz. Peygamber, scikit-learn kuralını izler. İlk olarak yeni bir Kahin örneği oluşturun, belirli parametreleri (örneğinseasonality_mode) ayarlayın ve ardından bu örneği veri kümesine sığdırın.

  • Sürekli bir katkı faktörü, Peygamber için varsayılan mevsimsellik etkisi olsa da, mevsimsellik etkisi parametresi için 'çarpımsal' mevsimselliği kullanmalısınız. Önceki bölümdeki analiz, mevsimsellik genliğindeki değişiklikler nedeniyle basit bir eklenebilir mevsimselliğin verilere hiç uymayacağını göstermiş.

  • Veriler aya göre toplandığı için weekly_seasonality parametresini kapalı olarak ayarlayın. Sonuç olarak haftalık veriler kullanılamaz.

  • Mevsimsellik belirsizliği tahminlerini yakalamak için Markov Chain Monte Carlo (MCMC) yöntemlerini kullanın. Hz. Peygamber varsayılan olarak eğilim ve gözlem gürültüsü hakkında belirsizlik tahminleri sağlayabilir, ancak mevsimsellik için sağlanmaz. MCMC daha fazla işlem süresi gerektirir, ancak algoritmanın mevsimsellik ile eğilim ve gözlem gürültüsü hakkında belirsizlik tahminleri sağlamasına olanak sağlar. Daha fazla bilgi için Hz. Peygamber Belirsizlik Aralıkları belgelerini okuyun.

  • changepoint_prior_scale parametresi aracılığıyla otomatik değişiklik noktası algılama duyarlılığını ayarlayın. Kahin algoritması, verilerde yörüngelerin aniden değiştiği örnekleri otomatik olarak bulmaya çalışır. Doğru değeri bulmak zor olabilir. Bu sorunu çözmek için farklı değerler deneyebilir ve ardından en iyi performansa sahip modeli seçebilirsiniz. Daha fazla bilgi için Peygamber Eğilim Değişim Noktaları belgelerini okuyun.

from prophet import Prophet

def fit_model(dataframe, seasonality_mode, weekly_seasonality, chpt_prior, mcmc_samples):
    m = Prophet(
        seasonality_mode=seasonality_mode,
        weekly_seasonality=weekly_seasonality,
        changepoint_prior_scale=chpt_prior,
        mcmc_samples=mcmc_samples,
    )
    m.fit(dataframe)
    return m

Çapraz doğrulama

Kahin'in yerleşik bir çapraz doğrulama aracı vardır. Bu araç tahmin hatasını tahmin edebilir ve en iyi performansa sahip modeli bulabilir.

Çapraz doğrulama tekniği model verimliliğini doğrulayabilir. Bu teknik modeli veri kümesinin bir alt kümesinde eğiter ve veri kümesinin daha önce görünmeyen bir alt kümesinde testler çalıştırır. Bu teknik, istatistiksel modelin bağımsız bir veri kümesine ne kadar iyi genelleştirebildiğini kontrol edebilir.

Çapraz doğrulama için, eğitim veri kümesinin parçası olmayan veri kümesinin belirli bir örneğini ayırın. Ardından, eğitilen modeli dağıtımdan önce bu örnekte test edin. Ancak model Ocak 2005 ve Mart 2005 aylarına ait verileri gördüyse ve Şubat 2005 ayı için tahminde bulunursanız model temelde hile yapabilir çünkü veri eğiliminin nereye gittiğini görebilir. Gerçek uygulamalarda amaç, görülmeyen bölgeler olarak geleceğe yönelik tahminde bulunur.

Bunu işlemek ve testi güvenilir hale getirmek için veri kümesini tarihlere göre bölün. Veri kümesini eğitim için belirli bir tarihe kadar (örneğin, ilk 11 yıllık veriler) kullanın ve ardından tahmin için kalan görünmeyen verileri kullanın.

Bu senaryoda, 11 yıllık eğitim verileriyle başlayın ve bir yıllık ufuk çizgisi kullanarak aylık tahminler yapın. Özellikle, eğitim verileri 2003 ile 2013 arasında her şeyi içerir. Ardından, ilk çalıştırma Ocak 2014 ile Ocak 2015 arasında tahminleri işler. Sonraki çalıştırma, Şubat 2014 ile Şubat 2015 arasında tahminleri işler ve bu şekilde devam eder.

Hangi modelin en iyi performansı sergilediğini görmek için eğitilen üç modelin her biri için bu işlemi yineleyin. Ardından, en iyi modelin tahmin kalitesini oluşturmak için bu tahminleri gerçek dünya değerleriyle karşılaştırın.

from prophet.diagnostics import cross_validation
from prophet.diagnostics import performance_metrics

def evaluation(m):
    df_cv = cross_validation(m, initial="4017 days", period="30 days", horizon="365 days")
    df_p = performance_metrics(df_cv, monthly=True)
    future = m.make_future_dataframe(periods=12, freq="M")
    forecast = m.predict(future)
    return df_p, future, forecast

MLflow ile günlük modeli

Parametrelerini izlemek için modelleri günlüğe kaydedin ve modelleri daha sonra kullanmak üzere kaydedin. Tüm ilgili model bilgileri çalışma alanında deneme adının altında günlüğe kaydedilir. MLflow otomatik kaydetme öğeleriyle birlikte model, parametreler ve ölçümler tek bir MLflow çalıştırmasında kaydedilir.

# Setup MLflow
from mlflow.models.signature import infer_signature

Denemeler yapma

Makine öğrenmesi denemesi, tüm ilgili makine öğrenmesi çalıştırmaları için birincil kuruluş ve denetim birimi görevi görür. Çalıştırma, model kodunun tek bir yürütülmesine karşılık gelir. Makine öğrenmesi denemesi izleme, tüm farklı denemelerin ve bileşenlerinin yönetimini ifade eder. Bu parametreler, ölçümler, modeller ve diğer yapıtları içerir ve belirli bir makine öğrenmesi denemesinin gerekli bileşenlerini düzenlemeye yardımcı olur. Makine öğrenmesi denemesi izleme, kaydedilmiş denemelerle geçmiş sonuçların kolayca çoğaltılmasını da sağlar. Microsoft Fabric'te makine öğrenmesi denemeleri hakkında daha fazla bilgi edinin. Dahil etmeyi planladığınız adımları belirledikten sonra (örneğin, bu not defterine Peygamber modelini uydurma ve değerlendirme), denemeyi çalıştırabilirsiniz.

model_name = f"{EXPERIMENT_NAME}-prophet"

models = []
df_metrics = []
forecasts = []
seasonality_mode = "multiplicative"
weekly_seasonality = False
changepoint_priors = [0.01, 0.05, 0.1]
mcmc_samples = 100

for chpt_prior in changepoint_priors:
    with mlflow.start_run(run_name=f"prophet_changepoint_{chpt_prior}"):
        # init model and fit
        m = fit_model(df_pandas, seasonality_mode, weekly_seasonality, chpt_prior, mcmc_samples)
        models.append(m)
        # Validation
        df_p, future, forecast = evaluation(m)
        df_metrics.append(df_p)
        forecasts.append(forecast)
        # Log model and parameters with MLflow
        mlflow.prophet.log_model(
            m,
            model_name,
            registered_model_name=model_name,
            signature=infer_signature(future, forecast),
        )
        mlflow.log_params(
            {
                "seasonality_mode": seasonality_mode,
                "mcmc_samples": mcmc_samples,
                "weekly_seasonality": weekly_seasonality,
                "changepoint_prior": chpt_prior,
            }
        )
        metrics = df_p.mean().to_dict()
        metrics.pop("horizon")
        mlflow.log_metrics(metrics)

Özellikler panelinin ekran görüntüsü.

Peygamber ile bir modeli görselleştirme

Kahin,modele uygun sonuçları gösterebilen yerleşik görselleştirme işlevlerine sahiptir.

Siyah noktalar modeli eğitmek için kullanılan veri noktalarını belirtir. Mavi çizgi tahmindir ve açık mavi alan belirsizlik aralıklarını gösterir. Farklı changepoint_prior_scale değerlere sahip üç model oluşturacaksınız. Bu üç modelin tahminleri bu kod bloğunun sonuçlarında gösterilir.

for idx, pack in enumerate(zip(models, forecasts)):
    m, forecast = pack
    fig = m.plot(forecast)
    fig.suptitle(f"changepoint = {changepoint_priors[idx]}")

İlk grafikteki en changepoint_prior_scale küçük değer, eğilim değişikliklerinin yetersiz uygunluğuna neden olur. Üçüncü grafikteki en büyük changepoint_prior_scale grafik fazla uygunlukla sonuçlanabilir. Bu nedenle, ikinci grafik en uygun seçenek gibi görünüyor. Bu, ikinci modelin en uygun olduğu anlamına gelir.

Kahin, temeldeki eğilimleri ve mevsimsellikleri de kolayca görselleştirebilir. İkinci modelin görselleştirmeleri bu kod bloğunun sonuçlarında gösterilir.

BEST_MODEL_INDEX = 1  # Set the best model index according to the previous results
fig2 = models[BEST_MODEL_INDEX].plot_components(forecast)

Fiyatlandırma verilerindeki yıllık eğilimlerin grafiğinin ekran görüntüsü.

Bu grafiklerde açık mavi gölgelendirme belirsizliği yansıtır. En üstteki grafik güçlü, uzun süreli salınım eğilimini gösterir. Birkaç yıl içinde satış hacimleri artar ve düşer. Alttaki grafik, satışların Şubat ve Eylül aylarında en yüksek değere ulaştığını ve bu aylarda yıl için en yüksek değerlere ulaştığını göstermektedir. Bu aylardan kısa bir süre sonra, Mart ve Ekim aylarında, yılın minimum değerlerine düşerler.

Çeşitli ölçümleri kullanarak modellerin performansını değerlendirin, örneğin:

  • ortalama kare hatası (MSE)
  • kök ortalama kare hatası (RMSE)
  • ortalama mutlak hata (MAE)
  • ortalama mutlak yüzde hatası (MAPE)
  • ortanca mutlak yüzde hatası (MDAPE)
  • simetrik ortalama mutlak yüzde hatası (SMAPE)

ve yhat_upper tahminlerini kullanarak yhat_lower kapsamı değerlendirin. Gelecekte bir yıl, 12 kez tahmin ettiğiniz değişen ufuklara dikkat edin.

display(df_metrics[BEST_MODEL_INDEX])

MAPE ölçümüyle, bu tahmin modeli için bir ayı geleceğe doğru genişleten tahminler genellikle yaklaşık %8 hataları içerir. Ancak gelecekte bir yıl boyunca yapılan tahminlerde hata yaklaşık %10'a çıkıyor.

5. Adım: Modeli puanlayıp tahmin sonuçlarını kaydetme

Şimdi modeli puanlayıp tahmin sonuçlarını kaydedin.

Predict Transformer ile tahminde bulunma

Artık modeli yükleyebilir ve tahminlerde bulunmak için kullanabilirsiniz. Kullanıcılar, herhangi bir işlem altyapısında toplu puanlama desteği sağlayan ölçeklenebilir bir Microsoft Fabric işlevi olan PREDICT ile makine öğrenmesi modellerini kullanıma hazır hale getirir. hakkında PREDICTdaha fazla bilgi edinmek için bu kaynakta Microsoft Fabric'te nasıl kullanacağınızı öğrenin.

from synapse.ml.predict import MLFlowTransformer

spark.conf.set("spark.synapse.ml.predict.enabled", "true")

model = MLFlowTransformer(
    inputCols=future.columns.values,
    outputCol="prediction",
    modelName=f"{EXPERIMENT_NAME}-prophet",
    modelVersion=BEST_MODEL_INDEX,
)

test_spark = spark.createDataFrame(data=future, schema=future.columns.to_list())

batch_predictions = model.transform(test_spark)

display(batch_predictions)
# Code for saving predictions into lakehouse
batch_predictions.write.format("delta").mode("overwrite").save(
    f"{DATA_FOLDER}/predictions/batch_predictions"
)
# Determine the entire runtime
print(f"Full run cost {int(time.time() - ts)} seconds.")