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


Εκπαίδευση και αξιολόγηση ενός μοντέλου πρόβλεψης χρονικής σειράς

Σε αυτό το σημειωματάριο, δημιουργούμε ένα πρόγραμμα για την πρόβλεψη δεδομένων χρονικής σειράς που έχουν εποχιακούς κύκλους. Χρησιμοποιούμε το σύνολο δεδομένων Πωλήσεις ιδιοτήτων NYC με ημερομηνίες που κυμαίνονται από το 2003 έως το 2015 που δημοσιεύθηκαν από το Τμήμα Οικονομικών του NYC στην πύλη ανοικτών δεδομένων του NYC.

Προαπαιτούμενα στοιχεία

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

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

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

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

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

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

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

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

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

Για να ανοίξετε το ενσωματωμένο δείγμα σημειωματάριου της εκμάθησης στην εμπειρία Synapse Data Science:

  1. Μεταβείτε στην αρχική σελίδα Synapse Data Science.

  2. Επιλέξτε Χρήση δείγματος.

  3. Επιλέξτε το αντίστοιχο δείγμα:

    • Από την προεπιλεγμένη καρτέλα Ροές εργασιών από άκρο σε τέλος (Python ), εάν το δείγμα αφορά ένα πρόγραμμα εκμάθησης Python.
    • Από την καρτέλα Ολοκληρωμένες ροές εργασιών (R), εάν το δείγμα αφορά μια εκμάθηση R.
    • Από την καρτέλα Γρήγορα προγράμματα εκμάθησης , εάν το δείγμα προορίζεται για μια γρήγορη εκμάθηση.
  4. Επισυνάψτε μια λίμνη στο σημειωματάριο προτού ξεκινήσετε την εκτέλεση κώδικα.

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

AIsample - Time Series Forecasting.ipynb είναι το σημειωματάριο που συνοδεύει αυτό το πρόγραμμα εκμάθησης.

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

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

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

Βήμα 1: Εγκατάσταση προσαρμοσμένων βιβλιοθηκών

Όταν αναπτύσσετε ένα μοντέλο εκμάθησης μηχανής ή χειρίζεστε ad-hoc ανάλυση δεδομένων, ίσως χρειαστεί να εγκαταστήσετε γρήγορα μια προσαρμοσμένη βιβλιοθήκη (για παράδειγμα, prophet σε αυτό το σημειωματάριο) για την περίοδο λειτουργίας Apache Spark. Για να το κάνετε αυτό, έχετε δύο επιλογές.

  1. Μπορείτε να χρησιμοποιήσετε τις ενσωματωμένες δυνατότητες εγκατάστασης (για παράδειγμα, %pip, %condaκ.λπ.) για να ξεκινήσετε γρήγορα με νέες βιβλιοθήκες. Αυτό θα εγκαταστήσει μόνο τις προσαρμοσμένες βιβλιοθήκες στο τρέχον σημειωματάριο, όχι στον χώρο εργασίας.
# Use pip to install libraries
%pip install <library name>

# Use conda to install libraries
%conda install <library name>
  1. Εναλλακτικά, μπορείτε να δημιουργήσετε ένα περιβάλλον Fabric, να εγκαταστήσετε βιβλιοθήκες από δημόσιες προελεύσεις ή να αποστείλετε προσαρμοσμένες βιβλιοθήκες σε αυτό και, στη συνέχεια, ο διαχειριστής του χώρου εργασίας σας μπορεί να συνδέσει το περιβάλλον ως προεπιλογή για τον χώρο εργασίας. Στη συνέχεια, όλες οι βιβλιοθήκες στο περιβάλλον θα γίνουν διαθέσιμες για χρήση σε οποιαδήποτε σημειωματάρια και ορισμούς εργασίας Spark στον χώρο εργασίας. Για περισσότερες πληροφορίες σχετικά με τα περιβάλλοντα, ανατρέξτε στο θέμα Δημιουργία, ρύθμιση παραμέτρων και χρήση περιβάλλοντος στο Microsoft Fabric.

Για αυτό το σημειωματάριο, χρησιμοποιείτε %pip install το για να εγκαταστήσετε τη prophet βιβλιοθήκη. Ο πυρήνας του PySpark θα επανεκκινήσει μετά %pip installτο . Αυτό σημαίνει ότι πρέπει να εγκαταστήσετε τη βιβλιοθήκη προτού εκτελέσετε οποιαδήποτε άλλα κελιά.

# Use pip to install Prophet
%pip install prophet

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

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

Αυτό το σημειωματάριο χρησιμοποιεί το σύνολο δεδομένων πωλήσεων ιδιότητας NYC. Καλύπτει δεδομένα από το 2003 έως το 2015, που δημοσιεύθηκαν από το Υπουργείο Οικονομικών του NYC στην πύλη ανοικτών δεδομένων του NYC.

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

Δήμο Γειτονιά building_class_category tax_class block Πολλά eastment building_class_at_present Διεύθυνση 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
Μανχάταν ΑΛΦΑΒΗΤΙΚΉ ΠΌΛΗ 07 ΕΝΟΙΚΙΑΖΌΜΕΝΑ ΔΙΑΜΕΡΊΣΜΑΤΑ - ΔΙΑΜΕΡΊΣΜΑΤΑ WALKUP 0,0 384.0 17.0 C4 225 ΑΝΑΤΟΛΙΚΉ 2ND STREET 10009.0 10.0 0,0 10.0 2145.0 6670.0 1900.0 2.0 C4 275000.0 2007-06-19
Μανχάταν ΑΛΦΑΒΗΤΙΚΉ ΠΌΛΗ 07 ΕΝΟΙΚΙΑΖΌΜΕΝΑ ΔΙΑΜΕΡΊΣΜΑΤΑ - ΔΙΑΜΕΡΊΣΜΑΤΑ WALKUP 2.0 405.0 12.0 C7 508 ΑΝΑΤΟΛΙΚΉ 12Η ΟΔΌς 10009.0 28.0 2.0 30.0 3872.0 15428.0 1930.0 2.0 C7 7794005.0 2007-05-21

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

Ο Προφήτης χρησιμοποιεί ένα μοντέλο χρονικής σειράς με δυνατότητα αποδόμησης, το οποίο αποτελείται από τρία στοιχεία:

  • trend: Ο Προφήτης υποθέτει έναν σταθερό ρυθμό ανάπτυξης από άποψη κομματιού, με αυτόματη επιλογή σημείου αλλαγής
  • εποχικότητα: Από προεπιλογή, ο Προφήτης χρησιμοποιεί τη σειρά Fourier για να ταιριάζει με την εβδομαδιαία και ετήσια εποχικότητα
  • holidays: Ο Προφήτης απαιτεί όλες τις περασμένες και μελλοντικές εμφανίσεις αργιών. Εάν μια γιορτή δεν επαναληφθεί στο μέλλον, ο Προφήτης δεν θα την συμπεριλάβει στην πρόβλεψη.

Αυτό το σημειωματάριο συγκεντρώνει τα δεδομένα σε μηνιαία βάση, ώστε να παραβλέπει τις αργίες.

Διαβάστε την επίσημη εργασία για περισσότερες πληροφορίες σχετικά με τις τεχνικές μοντελοποίησης Του Προφήτη.

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

Η προέλευση δεδομένων αποτελείται από 15 .csv αρχεία. Αυτά τα αρχεία περιέχουν εγγραφές πωλήσεων ακινήτων από πέντε δήμους στη Νέα Υόρκη, μεταξύ 2003 και 2015. Για διευκόλυνση, το nyc_property_sales.tar αρχείο περιέχει όλα αυτά τα .csv αρχεία, συμπιέζοντάς τα σε ένα αρχείο. Ένας δημόσια διαθέσιμος χώρος αποθήκευσης αντικειμένων blob φιλοξενεί αυτό το .tar αρχείο.

Φιλοδώρημα

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

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

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

Σημαντικό

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

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

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

# 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

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

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

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

display(df)

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

  • Παρουσίες τιμών πωλήσεων 0,00 $. Σύμφωνα με το Γλωσσάρι των Όρων, αυτό συνεπάγεται μεταβίβαση κυριότητας χωρίς μετρητά. Με άλλα λόγια, δεν υπήρξε ταμειακή ροή στη συναλλαγή. Θα πρέπει να καταργήσετε τις πωλήσεις με τιμές 0,00 sales_price $ από το σύνολο δεδομένων.

  • Το σύνολο δεδομένων καλύπτει διαφορετικές οικοδομικές κλάσεις. Ωστόσο, αυτό το σημειωματάριο θα εστιάσει σε κτίρια κατοικιών τα οποία, σύμφωνα με το Γλωσσάρι των Όρων, επισημαίνονται ως τύπος "Α". Θα πρέπει να φιλτράρετε το σύνολο δεδομένων για να συμπεριλάβετε μόνο κτίρια κατοικιών. Για να το κάνετε αυτό, συμπεριλάβετε τις building_class_at_time_of_salebuilding_class_at_present στήλες ή . Πρέπει να συμπεριλάβετε μόνο τα building_class_at_time_of_sale δεδομένα.

  • Το σύνολο δεδομένων περιλαμβάνει παρουσίες όπου total_units οι τιμές ισούται με 0 ή gross_square_feet οι τιμές ισούται με 0. Θα πρέπει να καταργήσετε όλες τις παρουσίες όπου total_units ή gross_square_units τιμές ισούνται με 0.

  • Ορισμένες στήλες , για παράδειγμα, apartment_number, tax_class, build_class_at_presentκ.λπ.- έχουν τιμές που λείπουν ή NULL. Ας υποθέσουμε ότι τα δεδομένα που λείπουν περιλαμβάνουν σφάλματα κληρικού ή ανύπαρκτα δεδομένα. Η ανάλυση δεν εξαρτάται από αυτές τις τιμές που λείπουν, επομένως μπορείτε να τις αγνοήσετε.

  • Η sale_price στήλη αποθηκεύεται ως συμβολοσειρά, με έναν προκαθορισμένο χαρακτήρα "$". Για να συνεχίσετε με την ανάλυση, αντιπροσωπεύετε αυτήν τη στήλη ως αριθμό. Θα πρέπει να κάνετε μετατροπή της στήλης sale_price ως ακέραιου.

Μετατροπή και φιλτράρισμα τύπων

Για να επιλύσετε ορισμένα από τα ζητήματα που εντοπίστηκαν, εισαγάγετε τις απαιτούμενες βιβλιοθήκες.

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

Μετατροπή των δεδομένων πωλήσεων από συμβολοσειρά σε ακέραιο

Χρησιμοποιήστε κανονικές παραστάσεις για να διαχωρίσετε το αριθμητικό τμήμα της συμβολοσειράς από το σύμβολο του δολαρίου (για παράδειγμα, στη συμβολοσειρά "$300,000", διαιρέστε το "$" και το "300.000") και, στη συνέχεια, μεταβιβάστε το αριθμητικό τμήμα ως ακέραιο.

Στη συνέχεια, φιλτράρετε τα δεδομένα ώστε να περιλαμβάνουν μόνο παρουσίες που πληρούν όλες αυτές τις συνθήκες:

  1. Το sales_price είναι μεγαλύτερο από 0
  2. Το total_units είναι μεγαλύτερο από 0
  3. Το gross_square_feet είναι μεγαλύτερο από 0
  4. Το building_class_at_time_of_sale είναι τύπου Α
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%"'
)

Συνάθροιση σε μηνιαία βάση

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

Πρώτα, αλλάξτε τις τιμές ημερομηνίας ώστε να εμφανίζονται μόνο τα δεδομένα μήνα και έτους. Οι τιμές ημερομηνίας θα εξακολουθούν να περιλαμβάνουν τα δεδομένα του έτους. Εξακολουθείτε να μπορείτε να κάνετε διάκριση μεταξύ, για παράδειγμα, Δεκεμβρίου 2005 και Δεκεμβρίου 2006.

Επιπλέον, διατηρήστε μόνο τις στήλες σχετικές με την ανάλυση. Αυτές περιλαμβάνουν sales_priceτα , gross_square_feettotal_unitsκαι sales_date. Πρέπει επίσης να μετονομάσετε σε sales_datemonth.

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)

Συγκεντρώστε τις sale_priceτιμές και total_unitsgross_square_feet κατά μήνα. Στη συνέχεια, ομαδοποιήστε τα δεδομένα κατά monthκαι αθροίσετε όλες τις τιμές εντός κάθε ομάδας.

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

Τα Pyspark DataFrames χειρίζονται καλά μεγάλα σύνολα δεδομένων. Ωστόσο, λόγω της συνάθροισης δεδομένων, το μέγεθος του DataFrame είναι μικρότερο. Αυτό υποδηλώνει ότι μπορείτε πλέον να χρησιμοποιείτε dataFrames pandas.

Αυτός ο κώδικας δημιουργεί το σύνολο δεδομένων από ένα pyspark DataFrame σε ένα dataFrame pandas.

import pandas as pd

df_pandas = summary_df.toPandas()
display(df_pandas)

Απεικόνιση

Μπορείτε να εξετάσετε την τάση εμπορίου ακινήτων της Νέας Υόρκης για να κατανοήσετε καλύτερα τα δεδομένα. Αυτό οδηγεί σε πληροφορίες σχετικά με πιθανά μοτίβα και τάσεις εποχικότητας. Μάθετε περισσότερα σχετικά με την απεικόνιση δεδομένων Microsoft Fabric σε αυτόν τον πόρο.

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

Σύνοψη παρατηρήσεων από την διερευνητική ανάλυση δεδομένων

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

Για παράδειγμα, το 2004, η διαφορά εσόδων μεταξύ του μήνα υψηλότερων πωλήσεων και του μήνα χαμηλότερων πωλήσεων αφορά:

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

Για το 2011, αυτός ο υπολογισμός διαφοράς εσόδων αφορά:

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

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

Βήμα 4: Εκπαίδευση και παρακολούθηση μοντέλου

Τοποθέτηση μοντέλου

Η εισαγωγή του Προφήτη είναι πάντα ένα DataFrame δύο στηλών. Μία στήλη εισόδου είναι μια στήλη ώρας με την ονομασία dsκαι μία στήλη εισόδου είναι μια στήλη τιμών με ονομασία y. Η στήλη ώρας θα πρέπει να έχει μορφή δεδομένων ημερομηνίας, ώρας ή ημερομηνίας/ώρας (για παράδειγμα, YYYY_MM). Το σύνολο δεδομένων εδώ ικανοποιεί αυτή τη συνθήκη. Η στήλη τιμών πρέπει να είναι μορφή αριθμητικών δεδομένων.

Για την τοποθέτηση του μοντέλου, πρέπει μόνο να μετονομάσετε τη στήλη χρόνου σε ds και τη στήλη τιμών στο και να yμεταβιβάσετε τα δεδομένα στον Προφήτη. Διαβάστε την τεκμηρίωση του API Prophet Python για περισσότερες πληροφορίες.

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

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

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

  • Ορίστε την παράμετρο weekly_seasonality σε απενεργοποιημένη, επειδή τα δεδομένα συγκεντρώθηκαν κατά μήνα. Κατά συνέπεια, δεν υπάρχουν διαθέσιμα εβδομαδιαία δεδομένα.

  • Χρησιμοποιήστε τις μεθόδους Markov Chain Monte Carlo (MCMC) για να καταγράψετε τις εκτιμήσεις αβεβαιότητας εποχικότητας. Από προεπιλογή, ο Προφήτης μπορεί να παρέχει εκτιμήσεις αβεβαιότητας σχετικά με την τάση και τον θόρυβο παρατήρησης, αλλά όχι για την εποχικότητα. Τα MCMC απαιτούν περισσότερο χρόνο επεξεργασίας, αλλά επιτρέπουν στον αλγόριθμο να παρέχει εκτιμήσεις αβεβαιότητας σχετικά με την εποχικότητα και την τάση και τον θόρυβο παρατήρησης. Διαβάστε την τεκμηρίωση Διαστήματα αβεβαιότητας του Προφήτη για περισσότερες πληροφορίες.

  • Ρυθμίστε την ευαισθησία εντοπισμού αυτόματου σημείου αλλαγών μέσω της παραμέτρου changepoint_prior_scale . Ο αλγόριθμος Προφήτης αυτόματα προσπαθεί να βρει παρουσίες στα δεδομένα όπου οι τροχιές αλλάζουν απότομα. Μπορεί να είναι δύσκολο να βρείτε τη σωστή τιμή. Για να επιλύσετε αυτό το πρόβλημα, μπορείτε να δοκιμάσετε διαφορετικές τιμές και, στη συνέχεια, να επιλέξετε το μοντέλο με τις καλύτερες επιδόσεις. Διαβάστε την τεκμηρίωση του Prophet Trend Changepoints για περισσότερες πληροφορίες.

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

Διασταυρούμενη επικύρωση

Ο Προφήτης διαθέτει ένα ενσωματωμένο εργαλείο διασταυρούμενης επικύρωσης. Αυτό το εργαλείο μπορεί να εκτιμήσει το σφάλμα πρόβλεψης και να εντοπίσει το μοντέλο με τις καλύτερες επιδόσεις.

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

Για τη διασταυρούμενη επικύρωση, κάντε κράτηση ενός συγκεκριμένου δείγματος του συνόλου δεδομένων, το οποίο δεν ήταν μέρος του συνόλου δεδομένων εκπαίδευσης. Στη συνέχεια, δοκιμάστε το εκπαιδευμένο μοντέλο σε αυτό το δείγμα, πριν από την ανάπτυξη. Ωστόσο, αυτή η προσέγγιση δεν λειτουργεί για τα δεδομένα χρονικής σειράς, επειδή εάν το μοντέλο έχει δει δεδομένα από τους μήνες Ιανουάριος 2005 και Μάρτιος 2005 και προσπαθήσετε να προβλέψετε για τον μήνα Φεβρουάριο του 2005, το μοντέλο μπορεί ουσιαστικά να κάνει εξαπάτηση, επειδή μπορεί να δει πού οδηγεί η τάση δεδομένων. Σε πραγματικές εφαρμογές, ο στόχος είναι η πρόβλεψη για το μέλλον, ως αόρατες περιοχές.

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

Σε αυτό το σενάριο, ξεκινήστε με 11 έτη δεδομένων εκπαίδευσης και, στη συνέχεια, πραγματοποιήστε μηνιαίες προβλέψεις χρησιμοποιώντας ορίζοντα ενός έτους. Συγκεκριμένα, τα δεδομένα εκπαίδευσης περιέχουν τα πάντα από το 2003 έως το 2013. Στη συνέχεια, η πρώτη εκτέλεση χειρίζεται προβλέψεις για τον Ιανουάριο του 2014 έως τον Ιανουάριο του 2015. Η επόμενη εκτέλεση χειρίζεται προβλέψεις για τον Φεβρουάριο του 2014 έως τον Φεβρουάριο του 2015 και ούτω καθεξής.

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

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

Καταγράψτε τα μοντέλα, για να παρακολουθείτε τις παραμέτρους τους και αποθηκεύστε τα μοντέλα για μελλοντική χρήση. Όλες οι σχετικές πληροφορίες μοντέλου καταγράφονται στον χώρο εργασίας, με το όνομα του πειράματος. Το μοντέλο, οι παράμετροι και τα μετρικά, μαζί με τα στοιχεία αυτόματης καταχώρησης MLflow, αποθηκεύονται σε μία εκτέλεση MLflow.

# Setup MLflow
from mlflow.models.signature import infer_signature

Διεξαγωγή πειραμάτων

Ένα πείραμα εκμάθησης μηχανής χρησιμεύει ως η κύρια μονάδα οργανισμού και ελέγχου, για όλες τις σχετικές εκτελέσεις εκμάθησης μηχανής. Μια εκτέλεση αντιστοιχεί σε μία μόνο εκτέλεση κώδικα μοντέλου. Η παρακολούθηση πειραμάτων εκμάθησης μηχανής αναφέρεται στη διαχείριση όλων των διαφορετικών πειραμάτων και των στοιχείων τους. Αυτό περιλαμβάνει παραμέτρους, μετρικά, μοντέλα και άλλα αντικείμενα σχεδίασης και βοηθά στην οργάνωση των απαιτούμενων στοιχείων ενός συγκεκριμένου πειράματος εκμάθησης μηχανής. Η παρακολούθηση πειραμάτων εκμάθησης μηχανής επιτρέπει επίσης την εύκολη αναπαραγωγή προηγούμενων αποτελεσμάτων με αποθηκευμένα πειράματα. Μάθετε περισσότερα σχετικά με τα πειράματα εκμάθησης μηχανής στο Microsoft Fabric. Μόλις προσδιορίσετε τα βήματα που σκοπεύετε να συμπεριλάβετε (για παράδειγμα, τοποθέτηση και αξιολόγηση του μοντέλου Προφήτη σε αυτό το σημειωματάριο), μπορείτε να εκτελέσετε το πείραμα.

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)

Στιγμιότυπο οθόνης του παραθύρου ιδιοτήτων.

Απεικονίστε ένα μοντέλο με τον Προφήτη

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

Οι μαύρες κουκκίδες υποδηλώνουν τα σημεία δεδομένων που χρησιμοποιούνται για την εκπαίδευση του μοντέλου. Η μπλε γραμμή είναι η πρόβλεψη και η ανοιχτό μπλε περιοχή δείχνει τα διαστήματα αβεβαιότητας. Έχετε δημιουργήσει τρία μοντέλα με διαφορετικές changepoint_prior_scale τιμές. Οι προβλέψεις αυτών των τριών μοντέλων εμφανίζονται στα αποτελέσματα αυτού του μπλοκ κώδικα.

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

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

Ο Προφήτης μπορεί επίσης εύκολα να απεικονίσει τις υποκείμενες τάσεις και εποχικές περιόδους. Οι απεικονίσεις του δεύτερου μοντέλου εμφανίζονται στα αποτελέσματα αυτού του μπλοκ κώδικα.

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

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

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

Αξιολογήστε τις επιδόσεις των μοντέλων χρησιμοποιώντας διάφορα μετρικά, για παράδειγμα:

  • μέσο τετράγωνο σφάλμα (MSE)
  • ριζικό μέσο τετράγωνο σφάλμα (RMSE)
  • μέσο απόλυτο σφάλμα (MAE)
  • μέση σφάλμα απόλυτου ποσοστού (MAPE)
  • σφάλμα απόλυτου ποσοστού διαμέσου (MDAPE)
  • συμμετρικό μέσο σφάλμα απόλυτου ποσοστού (SMAPE)

Αξιολογήστε την κάλυψη χρησιμοποιώντας τις εκτιμήσεις yhat_lower και yhat_upper . Παρατηρήστε τους ορίζοντες που διαφέρουν, όπου προβλέπετε ένα έτος στο μέλλον, 12 φορές.

display(df_metrics[BEST_MODEL_INDEX])

Με το μετρικό MAPE, για αυτό το μοντέλο πρόβλεψης, οι προβλέψεις που επεκτείνονται έναν μήνα στο μέλλον συνήθως περιλαμβάνουν σφάλματα περίπου 8%. Ωστόσο, για προβλέψεις ένα έτος στο μέλλον, το σφάλμα αυξάνεται σε περίπου 10%.

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

Τώρα βαθμολογήστε το μοντέλο και αποθηκεύστε τα αποτελέσματα πρόβλεψης.

Πραγματοποίηση προβλέψεων με το Predict Transformer

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

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