Migliorare le feature per la classificazione

Machine Learning per dati di serie temporali in Python

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

L'envelope uditivo

  • Applica uno smoothing ai dati per calcolare l'envelope uditivo
  • Relativo alla quantità totale di energia audio presente in ogni istante

Machine Learning per dati di serie temporali in Python

Smoothing nel tempo

  • Invece di fare la media su tutto il tempo, facciamo una media locale
  • Si chiama smoothing della serie temporale
  • Rimuove il rumore a breve termine, mantenendo l'andamento generale
Machine Learning per dati di serie temporali in Python

Smoothing dei dati

Machine Learning per dati di serie temporali in Python

Calcolare una statistica a finestra mobile

# Audio è un DataFrame Pandas
print(audio.shape)  
# (n_times, n_audio_files)
(5000, 20)  
# Applica smoothing prendendo la media mobile in una finestra di 50 campioni
window_size = 50
windowed = audio.rolling(window=window_size)
audio_smooth = windowed.mean()
Machine Learning per dati di serie temporali in Python

Calcolare l'envelope uditivo

  • Prima rettifica l'audio, poi applica lo smoothing

      audio_rectified = audio.apply(np.abs)
      audio_envelope = audio_rectified.rolling(50).mean()
    
Machine Learning per dati di serie temporali in Python

Machine Learning per dati di serie temporali in Python

Machine Learning per dati di serie temporali in Python

Machine Learning per dati di serie temporali in Python

Feature engineering sull'envelope

# Calcola diverse feature dell'envelope, una per suono
envelope_mean = np.mean(audio_envelope, axis=0)
envelope_std = np.std(audio_envelope, axis=0)
envelope_max = np.max(audio_envelope, axis=0)

# Crea i dati di training per un classificatore
X = np.column_stack([envelope_mean, envelope_std, envelope_max])
Machine Learning per dati di serie temporali in Python

Preparare le feature per scikit-learn

X = np.column_stack([envelope_mean, envelope_std, envelope_max])
y = labels.reshape(-1, 1)
Machine Learning per dati di serie temporali in Python

Cross validation per la classificazione

  • cross_val_score automatizza:
    • Suddividere i dati in training/validation set
    • Addestrare il modello sui dati di training
    • Valutarlo sui dati di validation
    • Ripetere il processo
Machine Learning per dati di serie temporali in Python

Usare cross_val_score

from sklearn.model_selection import cross_val_score

model = LinearSVC()
scores = cross_val_score(model, X, y, cv=3) 
print(scores)
[0.60911642 0.59975305 0.61404035]
Machine Learning per dati di serie temporali in Python

Feature uditive: il Tempogram

  • Possiamo riassumere informazioni temporali più complesse con funzioni specifiche per serie temporali
  • librosa è un'ottima libreria per il feature engineering su audio e serie temporali
  • Qui calcoleremo il tempogram, che stima il tempo di un suono nel tempo
  • Possiamo calcolare statistiche di riepilogo del tempo come fatto per l'envelope
Machine Learning per dati di serie temporali in Python

Calcolare il tempogram

# Importa librosa e calcola il tempo di un array audio 1-D
import librosa as lr
audio_tempo = lr.beat.tempo(y=audio, sr=sfreq, 
                            hop_length=2**6)
Machine Learning per dati di serie temporali in Python

Esercitiamoci!

Machine Learning per dati di serie temporali in Python

Preparing Video For Download...