2 분 소요

이 포스팅은 Dempster et al. (2020)의 논문 “ROCKET: Exceptionally Fast and Accurate Time Series Classification Using Random Convolutional Kernels” 을 바탕으로 내용을 정리한 글입니다.


Introduction

시계열 분류(Time Series Classification)는 다양한 분야에서 중요한 역할을 합니다. 하지만 기존의 시계열 분류 알고리즘들은 높은 계산 복잡도와 느린 학습 속도로 인해 대규모 데이터셋에서 적용이 어려웠습니다.

본 논문은 이러한 문제를 극복하기 위해 제안된 ROCKET(Random Convolutional Kernel Transform) 방법론을 소개합니다. ROCKET은 무작위로 생성된 컨볼루션 커널간단한 선형 분류기만으로도 기존 SOTA(State-of-the-art) 모델들 이상의 정확도를 보여주는 놀라운 성능을 보입니다.


Why ROCKET?

Limitations of Existing Time Series Classification Models

  • 많은 기존 알고리즘은 shapelet, frequency, autocorrelation 등 단일 피처에 특화되어 있습니다.
  • 대표적인 알고리즘들:

    • BOSS, Shapelet Transform, HIVE-COTE 등은 복잡도 $O(n^2 \cdot l^4)$에 달해 대규모 데이터에 부적합
      • $n$ : 훈련 데이터 개수
      • $l$ : 시계열 시퀀스 길이
    • InceptionTime 같은 딥러닝 모델은 GPU 의존도가 높음

Motivation

  • 단순한 선형 모델로 빠르고 정확한 예측이 가능할까?
  • 학습이 필요 없는 랜덤 커널을 사용하면 어떨까?

이 질문에 대한 대답이 바로 ROCKET 입니다.


The ROCKET Method

Key Idea

  1. 수천 개의 무작위 Convolutional Kernels 생성
  2. 각 커널로부터 두 개의 특징 추출:

    • ppv (Proportion of Positive Values)
    • max (최대값)
  3. 이 피처 벡터를 입력으로 Ridge Regression 또는 Logistic Regression 학습

Architecture

  • Kernel Hyperparameter random setting

    • length, dilation, padding, weights, bias 를 모두 무작위로 설정.
  • Numba JIT 및 PyTorch 기반 구현
  • 병렬화 및 확장성 고려

Experiments

Dataset

  • 85개의 UCR “bake off” 시계열 데이터셋

Performance Evaluation and Experimental Results

데이터셋 ROCKET (CPU) InceptionTime (GPU) TS-CHIEF Proximity Forest
ElectricDevices 6분 7시간 46분 2시간 24분 1시간 35분
HandOutlines 4분 52초 8시간 10분 4일 이상 거의 3일
  • 전체 85개 실험 기준 총 학습 시간: ROCKET = 1시간 50분, InceptionTime = 6일 이상
  • 대규모 시계열 100만 개 → 1시간 15분 학습, 제한 버전(적은 개수의 피쳐와 커널을 사용하는 버전)은 1분 이내

Key Advantages

  • 정확도: 기존 SOTA 모델들 이상
  • 속도: GPU 없이도 초고속 학습 가능
  • 확장성: 시계열 길이 및 개수에 대해 선형 복잡도

Reference Implementation and Code

공식 논문에서는 ROCKET의 간단한 구조 덕분에 Python 및 PyTorch 기반으로 누구나 쉽게 구현할 수 있다고 소개합니다. 다음은 가장 기본적인 예제 코드입니다:

from sklearn.linear_model import RidgeClassifierCV
from rocket import generate_kernels, apply_kernels

# 임의 시계열 데이터
X_train, X_test, y_train, y_test = ...

# 10,000개의 랜덤 커널 생성 및 적용
kernels = generate_kernels(X_train.shape[1], num_kernels=10000)
X_train_transform = apply_kernels(X_train, kernels)
X_test_transform = apply_kernels(X_test, kernels)

# 선형 분류기 학습
clf = RidgeClassifierCV(alphas=10**np.arange(-3, 4))
clf.fit(X_train_transform, y_train)
print("Test Accuracy:", clf.score(X_test_transform, y_test))

Reference

업데이트: