[Paper Review] ROCKET: Exceptionally fast and accurate time series classification using random convolutional kernels
이 포스팅은 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 의존도가 높음
- BOSS, Shapelet Transform, HIVE-COTE 등은 복잡도 $O(n^2 \cdot l^4)$에 달해 대규모 데이터에 부적합
Motivation
- 단순한 선형 모델로 빠르고 정확한 예측이 가능할까?
- 학습이 필요 없는 랜덤 커널을 사용하면 어떨까?
이 질문에 대한 대답이 바로 ROCKET 입니다.
The ROCKET Method
Key Idea
- 수천 개의 무작위 Convolutional Kernels 생성
-
각 커널로부터 두 개의 특징 추출:
ppv
(Proportion of Positive Values)max
(최대값)
- 이 피처 벡터를 입력으로 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
- Dempster, A., Petitjean, F., & Webb, G. I. (2020). ROCKET: Exceptionally Fast and Accurate Time Series Classification Using Random Convolutional Kernels
- MiniRocket GitHub Repository
- UCR Time Series Classification Archive: https://www.cs.ucr.edu/~eamonn/time_series_data_2018/