ROCKET ؛ دستهبندی سریع و دقیق سریهای زمانی
اکثر روشهای دستهبندی سریهای زمانی که با دقتی در سطح دقت آخرین پیشرفتهای علمی (یا به عبارتی SOTA) ایجاد شدهاند، سطح محاسباتی بسیار پیچیده و مقیاسپذیری پایینی دارند. به عبارت دیگر فرآیند آموزش آنها روی دیتاستهای کوچک کُند است و در دیتاستهای بزرگ کاملاً بلااستفاده هستند. روش ROCKET (که مخفف RandOM Convolutional KErnal Transform است) میتواند همین عملیات را در کسری از ثانیه با دقتی برابر با دقت الگوریتمهای محاسباتی SOTA از جمله شبکههای عصبی کانولوشن انجام دهد. معیار ارزیابی این الگوریتمها دیتاستِ استاندارد موجود در آرشیو UCR است.
رویکرد ROCKET ابتدا دیتاست سریزمانی را با کمک کرنلهای تصادفی کانولوشن، از جمله مواردی که در شبکههای عصبی کانولوشن مورد استفاده قرار میگیرند، تغییر شکل میدهد و سپس با استفاده از این ویژگیها، یک دستهبند خطی را آموزش میدهد.
سرعت ROCKET چقدر است؟ آموزش و در پی آن تستِ ROCKET با استانداردهای 85 دیتاست، یک ساعت و چهل دقیقه زمان میبرد. دومین الگوریتم سریع SOTA (یعنی cBOSS) همین مسئله را ظرف 19 ساعت و 33 دقیقه انجام میدهد.
مقاله حاضر در ادامه به موضوعات زیر میپردازد:
- دستهبندهای سریهای زمانی جایگزین
- نحوهی عملکرد ROCKET
- نمونه کدهای پایتون
دستهبندهای جایگزین کدامند؟
دیگر روشهای دستهبندی سریهای زمانی معمولاً سری را با کمک بازنماییهای معین دیگری همانند شکل، فراوانی، یا واریانس آن طبقه بندی میکنند. در مکانیسمی منفرد که امکان ضبط کردن ویژگیهای مشابه بسیاری را فراهم میآورد، کرنلهای کانولوشن ROCKET جایگزین استخراج ویژگی مهندسی شده میشوند.
بررسی دستهبندی سریهای زمانی
یکی از ایدههای بنیادی دستهبندی سریهای زمانی، تغییر شکل آنها است. بسیاری از الگوریتمهای معین سریهای زمانی ترکیبی از سریزمانی تغییر شکل یافته و الگوریتمهای دستهبندی متعارف هستند، مثل موارد موجود در sciki-learn.
روشهای رقابتی SOTA
همه روشهای زیر به دنبال بهبود سرعت و دقت الگوریتمهای تعریف شده در پژوهش فوق هستند.
- Proximity Forest اثر کلی گروهی از درختهای تصمیم است که با یک معیار فاصله اقلیدسی انعطاف پذیر تقسیم میشود.
- TS-CHIEF با کمک معیارهای تقسیم مبتنی بر دیکشنری و مبتنی بر فواصل از روش Proximity Forest فراتر رفته است.
- InceptionTime اثر کلی پنج شبکه عصبی کانولوشن (CNN) عمیق مبتنی بر معماری Inception است.
- Mr-SEQL دستهبند خطی را برای ویژگیهایی اجرا میکند که از طریق بازنمایی نمادین سریهای زمانی استخراج شدهاند (SAX، SFA).
- cBOSS، کوتاه شدهی عبارت contractable BOSS، نوعی دستهبند مبتنی بر دیکشنری است که بر مبنای تغییر شکل SAF عمل میکند.
- catch22 مجموعهای متشکل از 22 مبدل از پیش تعیین شده سریزمانی است که میتوان آنها را به یک دستهبند منتقل نمود.
ROCKET چگونه اجرا میشود؟
ROCKET ابتدا با استفاده از کرنلهای کانولوشن، سریزمانی را تغییر داده و سپس دادههای تغییر یافته را به یک دستهبند خطی منتقل میکند.
کرنل کانولوشن
مقداردهی اولیه کرنلهای کانولوشن، همانند کرنلهای شبکههای عصبی کانولوشن، با طول، وزن، انحراف، انبساط، و لایه گذاریهای تصادفی صورت میگیرد. این پارامترها بخشی از ROCKET هستند و دیگر نیازی نیست نمونه گیری تنظیم شود. این فرآیند یک مرحلهای است و ROCKET مبدلهای غیرخطی، مثل ReLU، را بر روی ویژگیهای نهایی پیاده نمی کند.
تعدادِ کرنلهای مورد استفاده در ROCKET بسیار زیاد است. به طور پیشفرض 10000 کرنل وجود دارد. هزینه بسیار اندک محاسبات کانولوشن امکان استفاده از کرنلهای فراوان در ROCKET را فراهم آورده است و این هزینههای اندک ناشی از دو دلیل عمده هستند: اول اینکه نمیتوان وزن کرنلها را به مدل “آموزش داد” و دوم اینکه این روش تنها شامل یک لایه کانولوشن میشود.
ROCKET، برعکس شبکه عصبی کانولوشن معمولی، میتواند انواع مختلف کرنل را مورد استفاده قرار دهد. طول، انبساط، لایه گذاری، وزن، و انحرافهای تصادفی این امکان را برای ROCKET فراهم میآورد تا اطلاعات وسیعی استخراج کند. به طور خاص، تنوع انبساط کرنل امکانِ ثبت الگو در تناوبها و مقیاسهای مختلف را برای ROCKET فراهم میآورد.
یک کرنل تصادفی کانولوشن به تنهایی در ثبت ویژگیهای کاربردی برگرفته از سریزمانی ضعیف عمل میکند لیکن کرنل های تصادفی در کنار هم میتوانند ویژگیهای مرتبط با طبقه بندی سری زمانی را استخراج کنند.
تغییر شکلِ کرنل کانولوشن
هر یک از کرنلها بر روی تمام سریهای زمانی اعمال میشود تا یک نگاشت ویژگی ایجاد گردد. مجموع نگاشتهای ویژگی کرنل، دو ویژگی در آن ایجاد میکند؛ این دو ویژگی عبارتند از: مقدار بیشینه و نسبت مقادیر مثبت.
ویژگی مقدار بیشینه مشابه حداکثر تجمع مطلق است.
نسبت مقادیر مثبت نیز حاکی از نحوه وزن دهی به انتشار یک الگو است که توسط کرنل استخراج شده است. نسبت مقادیر مثبت به دلیل داشتن سهم بسزایی در دقت بالای ROCKET، حساسترین مولفه آن محسوب میشود.
zi برابر است با خروجی عملیات کانولوشن.
دستهبند خطی
در دیتاستهای کوچکتر به دلیل انجام سریع اعتبار سنجی متقابلِ پارامتر منظمساز و عدم دخالت هایپرپارامترهای دیگر، دستهبند رگرسیون ستیغی پیشنهاد میگردد.
زمانی که تعداد ویژگیها، بیشتر از تعداد نمونههای آموزشی باشد، تنظیم کردن بسیار مهم خواهد بود. این امر اغلب در دیتاستهای کوچک به چشم میخورد. (به طور پیشفرض در ROCKET 10000 کرنل و در ازای هر کرنل دو ویژگی وجود دارد، که در مجموع 20000 وِیژگی میشود.)
در دیتاستهای بزرگ به دلیل مقیاسپذیری، رگرسیون لجستیک با گرادیان کاهشی تصادفی پیشنهاد میگردد.
در دیتاستهای بزرگ تعداد نمونههای آموزشی بسیار بیشتر از تعداد ویژگیهای استخراج شده است.
چگونگی استفاده از ROCKET در پایتون
مبدل ROCKET در بسته پایتون sktime قابل اجرا است.
Sktime: کتابخانهای یکپارچه برای سریهای زمانی مرتبط با یادگیری ماشین
چرا؟ ابزارهای موجود به خوبی در مسائل سری زمانی تعبیه نشدهاند و به راحتی با یکدیگر ادغام نمیشوندروشهای …
نمونه کد زیر از روی نمونه کار مبدل ROCKET موجود در sktime نوشته شده است.
ابتدا بسته مورد نظر را بارگذاری کنید:
import numpy as np from sklearn.linear_model import RidgeClassifierCV from sktime.datasets import load_arrow_head # univariate dataset from sktime.transformers.series_as_features.rocket import Rocket
سپس داده آموزشی و تست را راهاندازی نمایید. در این نمونه، سریزمانی تک متغیری ArrowHead مورد استفاده قرار گرفت زیرا در دسترس بود. مبدل ROCKET بر روی دادههای چند متغیری نیز قابل اجرا است.
X_train, y_train = load_arrow_head(split="test", return_X_y=True) X_test, y_test = load_arrow_head(split="train", return_X_y=True) print(X_train.shape, X_test.shape) >> (175, 1) (36, 1)
با استفاده از مبدل ROCKET دادههای آموزشی را تغییر شکل دهید. ROCKET به طور پیشفرض از 10،000 کرنل استفاده میکند. به طور کلی، افزایش تعداد کرنلها منجر به افزایش دقت طبقه بندی میشود؛ با این حال افزایش دقت به قیمت افزایش زمان محاسباتی است. ROCKET حتی با وجود داشتن کرنلهای زیاد، سرعت بالایی دارد.
rocket = Rocket(num_kernels=10000, random_state=111) rocket.fit(X_train) X_train_transform = rocket.transform(X_train) X_train_transform.shape >> (175, 20000)
یک دستهبند خطی sktime-learn را مقداردهی کرده و آموزش دهید . برنامه نویسان sktime پیشنهاد میکنند برای دیتاستهای کوچکتر (نمونههای آموزشی کمتر از 20 هزار) RidgeClassifierCV و برای دیتاستهای بزرگ رگرسیون لجستیک را مورد استفاده قرار دهید که با گرادیان کاهشی تصادفی SGDClassifier(loss=’log’) آموزش دیده است.
classifier = RidgeClassifierCV(alphas=np.logspace(-3, 3, 10), normalize=True) classifier.fit(X_train_transform, y_train)
در پایان، به منظور امتیاز دهی به مدل آموزش دیده و تولید پیشبینی، دادههای تست را با کمک ROCKET تغییرشکل داده و مدل آموزش دیده را فراخوانی کنید.
X_test_transform = rocket.transform(X_test) classifier.score(X_test_transform, y_test) >> 0.9167