改進分類用的特徵

Python 的時間序列資料機器學習

Chris Holdgraf

Fellow, Berkeley Institute for Data Science

聽覺包絡

  • 平滑資料以計算聽覺包絡(auditory envelope)
  • 反映各時間點的音訊總能量

Python 的時間序列資料機器學習

隨時間做平滑

  • 不用對「全部」時間取平均,而是做「區域」平均
  • 這稱為對時間序列做「平滑」
  • 去除短期雜訊,保留整體趨勢
Python 的時間序列資料機器學習

讓資料更平滑

Python 的時間序列資料機器學習

計算移動視窗統計量

# Audio 是一個 Pandas DataFrame
print(audio.shape)  
# (n_times, n_audio_files)
(5000, 20)  
# 以 50 個樣本的視窗取移動平均,讓資料更平滑
window_size = 50
windowed = audio.rolling(window=window_size)
audio_smooth = windowed.mean()
Python 的時間序列資料機器學習

計算聽覺包絡

  • 先將音訊做「整流」,再進行平滑

      audio_rectified = audio.apply(np.abs)
      audio_envelope = audio_rectified.rolling(50).mean()
    
Python 的時間序列資料機器學習

Python 的時間序列資料機器學習

Python 的時間序列資料機器學習

Python 的時間序列資料機器學習

對包絡做特徵工程

# 為每個聲音計算包絡的多個特徵
envelope_mean = np.mean(audio_envelope, axis=0)
envelope_std = np.std(audio_envelope, axis=0)
envelope_max = np.max(audio_envelope, axis=0)

# 建立分類器的訓練資料
X = np.column_stack([envelope_mean, envelope_std, envelope_max])
Python 的時間序列資料機器學習

為 scikit-learn 準備特徵

X = np.column_stack([envelope_mean, envelope_std, envelope_max])
y = labels.reshape(-1, 1)
Python 的時間序列資料機器學習

分類的交叉驗證

  • cross_val_score 自動化以下流程:
    • 將資料切成訓練集/驗證集
    • 以訓練資料擬合模型
    • 在驗證資料上評分
    • 重複以上步驟
Python 的時間序列資料機器學習

使用 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]
Python 的時間序列資料機器學習

聽覺特徵:Tempogram

  • 用時間序列專用函式可概括較複雜的時間資訊
  • librosa 很適合做聽覺與時間序列特徵工程
  • 我們將計算「tempogram」,估計聲音隨時間變化的節奏
  • 也能像包絡一樣,對節奏做摘要統計
Python 的時間序列資料機器學習

計算 tempogram

# 匯入 librosa 並計算 1 維聲音陣列的節奏
import librosa as lr
audio_tempo = lr.beat.tempo(y=audio, sr=sfreq, 
                            hop_length=2**6)
Python 的時間序列資料機器學習

一起來練習吧!

Python 的時間序列資料機器學習

Preparing Video For Download...