Học sâu thực hiện tốt đáng kể trong nhiều nhiệm vụ phân tích chuỗi thời gian gần đây. Hiệu suất vượt trội của mạng nơ-ron sâu chủ yếu dựa vào một số lượng lớn dữ liệu đào tạo để tránh trang bị quá mức. Tuy nhiên, dữ liệu được gắn nhãn của nhiều ứng dụng chuỗi thời gian trong thế giới thực có thể bị hạn chế, chẳng hạn như phân loại trong chuỗi thời gian y tế và phát hiện bất thường. Là một cách hiệu quả để nâng cao quy mô và chất lượng của dữ liệu đào tạo, việc tăng dữ liệu là rất quan trọng để áp dụng thành công mô hình học sâu trên dữ liệu chuỗi thời gian.
Một số phương pháp tăng cường dữ liệu
Time Domain
Nói một cách đơn giản, biểu đồ miền thời gian cho biết tín hiệu thay đổi như thế nào theo thời gian.
Các phép biến đổi trong miền thời gian là phương pháp tăng dữ liệu đơn giản nhất cho dữ liệu chuỗi thời gian. Hầu hết chúng thao tác trực tiếp chuỗi thời gian đầu vào ban đầu, như đưa nhiễu Gaussian hoặc các mẫu nhiễu phức tạp hơn như tăng đột biến.
Frequency Domain
Biểu đồ miền tần số cho biết lượng tín hiệu nằm trong mỗi dải tần nhất định trên một dải tần số. Trong khi hầu hết các phương pháp tăng dữ liệu hiện có tập trung vào miền thời gian, chỉ có một số nghiên cứu điều tra việc tăng dữ liệu từ quan điểm miền tần số cho chuỗi thời gian.
Một công trình gần đây đề xuất sử dụng nhiễu loạn trong cả phổ biên độ và phổ pha trong miền tần số để tăng dữ liệu trong phát hiện dị thường chuỗi thời gian bằng mạng nơron. Cụ thể, đối với chuỗi thời gian đầu vào
[imath]x_1, · · ·, x_N[/imath]
, phổ tần số
[imath]F(ω_k)[/imath]
của nó thông qua biến đổi Fourier được tính như sau:
[math]
F(ω_k) = \frac{1}{N} \sum_{t=0}^{N-1} x_t e^{-jω_kt} = A(ω_k) exp[jθ(ω_k)]
[/math]
Trong đó
[imath]ω_k = \frac{2πk}{N}[/imath]
là tần số góc,
[imath]A(ω_k)[/imath]
là phổ biên độ và
[imath]θ(ω_k) [/imath]
là phổ pha. Đối với nhiễu loạn trong phổ biên độ
[imath]A(ω_k)[/imath]
các giá trị biên độ của các đoạn được chọn ngẫu nhiên được thay thế bằng nhiễu Gaussian bằng cách xem xét giá trị trung bình ban đầu và phương sai trong phổ biên độ. Trong khi đối với các nhiễu trong phổ pha
[imath]θ(ω_k)[/imath]
, các giá trị pha của các phân đoạn được chọn ngẫu nhiên được thêm vào bởi một tạp âm Gaussian trung bình bổ sung trong phổ pha.
Time-Frequency Domain
Phân tích Time-Frequency là một kỹ thuật được áp dụng rộng rãi để phân tích chuỗi thời gian, có thể được sử dụng như một đặc điểm đầu vào thích hợp trong mạng nơ-ron sâu. Tuy nhiên, tương tự như việc tăng dữ liệu trong miền tần số, chỉ có một số nghiên cứu xem xét việc tăng dữ liệu từ miền Time-Frequency cho chuỗi thời gian.
Decomposition-based Methods
Phương pháp tăng chuỗi thời gian dựa trên Decomposition-based cũng đã được áp dụng và cho thấy sự thành công trong nhiều nhiệm vụ liên quan đến chuỗi thời gian, chẳng hạn như dự báo và phát hiện bất thường. Phương pháp Decomposition-based phổ biến như STL, RobustSTL phân tích chuỗi thời gian
[imath]x_t[/imath]
dưới dạng.
[math]
x_t = τ_t + s_t + r_t, t = 1, 2, ...N
[/math]
trong đó
[imath]τ_t[/imath]
là tín hiệu xu hướng,
[imath]s_t[/imath]
là tín hiệu theo mùa và
[imath]r_t [/imath]
biểu thị tín hiệu còn lại.
Statistical Generative Models
Các phương pháp tiếp cận nâng cao chuỗi thời gian dựa trên các mô hình sinh thống kê thường liên quan đến việc mô hình hóa các động lực của chuỗi thời gian bằng các mô hình thống kê.
Learning-based Methods
Các phương pháp gia tăng dữ liệu chuỗi thời gian phải có khả năng không chỉ tạo ra các mẫu đa dạng mà còn bắt chước các đặc tính của dữ liệu thực. Một số chương trình dựa trên học tập gần đây có tiềm năng như vậy.
Một vài biến đổi dữ liệu trên miền thời gian với python
Đây là một số hàm ví dụ như thêm nhiễu, shift chuỗi thời gian, ... mà mình sử dụng các bạn có thể tham khảo
def shiftTimeSeries(data, shiftMagnitude=0):
if shiftMagnitude < 0:
minValue = np.min(data)
shiftMagnitude = max(-minValue, shiftMagnitude)
data += shiftMagnitude
return data
def noiseAddition(data, stdev=1):
for i in range(1, len(data.index)):
da = data[i]
noise = np.random.normal(0, stdev*(da/100))
data[i] *= (1 + noise/100)
return data
def lowPassFilter(data, order=5):
da = data.rolling(window=order).mean()
for i in range(order):
data[i] = da[i]
return data