L’apprendimento semi-supervisionato su serie temporali (S4L) rappresenta un’area di ricerca molto promettente nel campo del machine learning. Questo metodo combina dati etichettati e non etichettati per migliorare la qualità dei modelli predittivi, soprattutto quando le etichette sono costose o difficili da ottenere. In questo articolo, esploreremo come l’S4L può essere applicato efficacemente per analizzare e prevedere dati di serie temporali.

Che Cos’è l’apprendimento semi-supervisionato?

L’apprendimento semi-supervisionato si colloca tra l’apprendimento supervisionato (dove tutti i dati di input sono etichettati) e quello non supervisionato (dove nessun dato di input è etichettato). Utilizza una combinazione di un piccolo set di dati etichettati e un grande set di dati non etichettati. L’idea è che i dati non etichettati, pur non avendo etichette, possono comunque fornire informazioni strutturali preziose che aiutano a modellare meglio la distribuzione dei dati.

Applicazioni di S4L nelle serie temporali

Le serie temporali sono dati che variano nel tempo, comunemente trovati in settori come finanza, meteorologia, salute, e molti altri. L’S4L è particolarmente utile in queste applicazioni perché frequentemente si dispone di una quantità limitata di dati etichettati a fronte di un’enorme quantità di dati non etichettati. Ad esempio, in medicina, le etichette potrebbero essere diagnosi che richiedono tempo e competenze specifiche per essere assegnate.

Metodologie di S4L per serie temporali

Una tecnica comune in S4L è l’uso di modelli generativi, come i modelli autoencoder, che apprendono a ricostruire i dati di input utilizzando sia dati etichettati che non. Un altro approccio è l’autoetichettatura, dove il modello usa le proprie previsioni per etichettare i dati non etichettati e poi riutilizza questi dati appena etichettati per migliorare ulteriormente il proprio apprendimento.

Esempio Pratico: analisi di serie temporali finanziarie

Per dimostrare l’applicazione pratica dell’S4L, consideriamo il caso dell’analisi delle serie temporali finanziarie. Prendiamo come esempio il dataset del mercato azionario, che contiene sia dati etichettati (es. prezzi di chiusura) che non (es. indicatori tecnici non categorici).

Script Python: Applicazione di S4L a Dati Reali del Mercato Azionario

Per mettere in pratica quanto discusso, fornirò uno script Python che utilizza un modello di apprendimento semi-supervisionato su un set di dati del mercato azionario. Utilizzeremo dati di prezzi delle azioni, disponibili tramite la libreria yfinance di Yahoo Finance. L’obiettivo sarà prevedere il movimento dei prezzi basandoci su una combinazione di dati etichettati (prezzi passati) e non etichettati (indicatori tecnici).

import matplotlib.pyplot as plt
import yfinance as yf
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.semi_supervised import LabelSpreading

# Scarichiamo i dati delle azioni di Apple
data = yf.download('AAPL', start='2020-01-01', end='2020-12-31')
data['Return'] = data['Close'].pct_change() # Calcoliamo il rendimento giornaliero
data.dropna(inplace=True) # Rimuoviamo i valori mancanti

# Prepariamo i dati
X = data[['Open', 'High', 'Low', 'Close']].values
y = (data['Return'] > 0).astype(int).values # Etichetta: 1 se il rendimento è positivo, 0 altrimenti

# Simuliamo un scenario semi-supervisionato
y_semi_supervised = y.copy()
y_semi_supervised[::5] = -1 # Nascondiamo alcune etichette

# Creiamo il modello di apprendimento semi-supervisionato
model = LabelSpreading(kernel='knn', alpha=0.8)
model.fit(X, y_semi_supervised)

# Previsioni
y_pred = model.predict(X)

# Grafico dei prezzi di chiusura
plt.figure(figsize=(14, 7))
plt.plot(data.index, data['Close'], label='Prezzo di chiusura', color='blue')
plt.title('Andamento dei prezzi di chiusura di Apple nel 2020')
plt.xlabel('Data')
plt.ylabel('Prezzo di chiusura in $')
plt.legend()
plt.show()

# Grafico della distribuzione delle etichette
plt.figure(figsize=(14, 7))
plt.scatter(data.index, y, color='green', label='Etichette reali', alpha=0.5)
plt.scatter(data.index[y_semi_supervised == -1], y[y_semi_supervised == -1], color='red', label='Etichette nascoste', alpha=0.5)
plt.title('Distribuzione delle etichette reali e nascoste')
plt.xlabel('Data')
plt.ylabel('Etichetta')
plt.legend()
plt.show()

# Grafico delle etichette reali vs predette
plt.figure(figsize=(14, 7))
plt.bar(data.index, y, width=0.4, label='Etichette reali', align='center', alpha=0.7)
plt.bar(data.index, y_pred - 0.4, width=0.4, label='Etichette predette', align='center', alpha=0.7)
plt.title('Confronto delle etichette reali e predette')
plt.xlabel('Data')
plt.ylabel('Etichetta')
plt.legend()
plt.show()

Questo script dimostra come l’apprendimento semi-supervisionato può essere utilizzato per migliorare le previsioni su serie temporali anche quando non tutte le etichette sono disponibili. L’uso di tecniche come il LabelSpreading permette di sfruttare al meglio sia i dati etichettati che quelli non etichettati, migliorando così l’accuratezza del modello.

Di seguito le rappresentazioni grafiche:

Questi grafici ti forniranno una visione chiara di come il modello di apprendimento semi-supervisionato sta lavorando con i dati e quale sia il suo livello di accuratezza in termini di previsione delle etichette.