اگر امروز دادههای خام سنسورها را مستقیماً به مدلهای تشخیص ناهنجاری میدهید، احتمالاً بحرانیترین خطاهای عملیاتی را نادیده میگیرید. یک سری زمانی خام برای الگوریتم Isolation Forest نامرئی است، زیرا این الگوریتم با ردیفها به عنوان موجودیتهای مستقل برخورد میکند و نمیداند که ردیفهای شما دارای ترتیب زمانی هستند. برای شناسایی ناهنجاریهای زمینهای — مثلاً دمای ۵۰ درجه که در دسامبر عادی اما در ژوئن غیرممکن است — باید منطق زمانی را از ترتیب ردیفها به ستونهای داده منتقل کنید.
بسیاری از توسعهدهندگان بهاشتباه مقادیر خام را به مدل میدهند و در نتیجه فقط نقاط بسیار پرت (Global Extremes) شناسایی میشوند. این رویکرد باعث میشود خطاهای حیاتی مثل توقف سنسور (Flat-line)، تغییرات سطح (Level Shift) یا انحرافات فصلی گم شوند. طبق راهنمای فنی منتشر شده در ۱۳ اوت ۲۰۲۶ در وبسایت dev.to، راز تشخیص مؤثر در ایجاد ویژگیهایی است که این ناهنجاریهای خاص را در حداقل یک بُعد، «بسیار پرت» جلوه دهد.
جنگل ایزولاسیون (Isolation Forest) — شبیه به بازی ۲۰ سوالی که در آن برای پیدا کردن یک فرد خاص، سوالاتی میپرسیم که سریعترین راه برای جدا کردن او از بقیه باشد — بر اساس پژوهش سال ۲۰۰۸ لیو، تینگ و ژو (Liu, Ting, and Zhou) در کنفرانس ICDM عمل میکند. این مدل جنگلی از درختان تصادفی میسازد. هر درخت یک ویژگی تصادفی و یک نقطه برش تصادفی را در محدوده مشاهده شدهی آن ویژگی انتخاب میکند. این فرآیند بهطور بازگشتی تکرار میشود تا زمانی که نقاط کاملاً ایزوله شوند.
در این سازوکار، دو وضعیت کلی وجود دارد:
- مناطق کمتراکم (Sparse regions): نقاطی که در این نواحی قرار دارند، پس از تعداد کمی برش ایزوله میشوند (طول مسیر کوتاه).
- مناطق متراکم (Dense regions): نقاط در این نواحی برای ایزوله شدن به برشهای بسیار بیشتری نیاز دارند (طول مسیر بلند).
امتیاز ناهنجاری از میانگین طول مسیر در کل جنگل به دست میآید. چون هیچ محاسبه فاصله (Distance) یا تراکمی (Density) صورت نمیگیرد، این الگوریتم برای جداول حجیم بسیار بهینه است و بهطور کارآمد مقیاسپذیر میشود.
همانطور که در تحلیلهای پیشین ما دربارهی بهینهسازی مدلهای یادگیری ماشین اشاره کردیم، انتخاب درست پارامترها میتواند دقت مدل را بدون نیاز به سختافزار بیشتر افزایش دهد. در مورد Isolation Forest، امتیاز ناهنجاری با فرمول ریاضی $s(x, n) = 2^{-E(h(x)) / c(n)}$ محاسبه میشود. در این فرمول، $E(h(x))$ میانگین طول مسیر در تمام درختان است و $c(n)$ عامل نرمالسازی است که نتیجه را بر اساس میانگین طول مسیر یک جستجوی ناموفق در یک درخت جستجوی دودویی با $n$ نقطه تنظیم میکند.
عامل نرمالسازی به صورت $c(n) = 2H(n−1) − 2(n−1)/n$ تعریف میشود، که در آن $H$ عدد هارمونیک است (تقریباً $\ln(i) + 0.5772$). برای اندازه نمونه پیشفرض ۲۵۶ در کتابخانه scikit-learn، محاسبات به این صورت است:
- $H(255) = \ln(255) + 0.5772 = 6.1185$
- $c(256) = 2(6.1185) - 2(255/256) = 10.2448$
اگر نقطهای بهطور میانگین در ۵ برش ایزوله شود، امتیاز آن حدود $2^{-5 / 10.2448} \approx 0.713$ خواهد بود که به عنوان ناهنجاری شناخته میشود. نقطهای که میانگین طول مسیر آن برابر با $c(n)$ باشد، منجر به امتیاز $s = 2^{-1} = 0.5$ میشود. در واقع عدد ۰.۵ نقطه چرخش (Neutral Pivot) است؛ مسیرهای کوتاهتر منجر به امتیاز بالای ۰.۵ (ناهنجاری) و مسیرهای بلندتر منجر به امتیاز زیر ۰.۵ میشوند.
در پیادهسازی scikit-learn، منطق امتیازدهی معکوس شده است. متد score_samples برای نقاط ناهنجارتر، اعداد کمتری برمیگرداند. متد decision_function در واقع همان score_samples منهای یک مقدار آفست است. وقتی پارامتر contamination روی حالت "auto" باشد، مقدار آفست روی ۰.۵- تنظیم میشود؛ بنابراین علامت عدد تعیینکننده است: مقادیر منفی نشاندهنده دادههای پرت (Outliers) و مقادیر مثبت نشاندهنده دادههای عادی (Inliers) هستند.
برای شکار خطاهای سری زمانی، باید مهندسی ویژگی (Feature Engineering) — مثل تبدیل یک متن طولانی به چند کلمه کلیدی برای سریعتر فهمیدن موضوع — را با استفاده از پنجرههای لغزان (Trailing Windows) انجام داد. هرگز نباید از کل سری زمانی استفاده کنید، زیرا ویژگیها در زمان $t$ حاوی اطلاعاتی از بعد از زمان $t$ خواهند بود (نشت داده). راهنمای مذکور چهار ستون ضروری را برای جایگزینی مقادیر خام معرفی میکند:
- انحراف فصلی (Seasonal Deviation): تفاضل مقدار فعلی از مقدار معمول در آن موقعیت از چرخه. این کار باعث میشود دمای ۵۰ درجه در ژوئن ناهنجار باشد اما در دسامبر نه. نسخه دقیقتر این ویژگی، باقیمانده حاصل از تجزیه STL است.
- Z-Score محلی: تفاضل مقدار از میانگین متحرک، تقسیم بر انحراف معیار متحرک. این ویژگی تغییرات سطحی (Level Shifts) را میگیرد که در بازه کلی دادهها عادیاند اما چهار انحراف معیار با سطح محلی فاصله دارند.
- تفاضل اول (First Difference): تغییر بین دو نقطه متوالی. یک تغییر پلهای (Step Change) یک تفاضل شدید ایجاد میکند و سپس به حالت عادی برمیگردد؛ اما یک Spike دو تفاضل شدید در جهتهای مخالف تولید میکند.
- انحراف معیار متحرک (Rolling Std): این ستون توقف سنسورها (Flat-line failure) را شناسایی میکند؛ جایی که سنسور قفل شده و مقدار آن ممکن است منطقی باشد اما دیگر هیچ تغییری نمیکند. این اغلب تنها ستونی است که جدیترین خطاهای عملیاتی را علامتگذاری میکند.
بهطور عمدی از ستون «مقدار خام» استفاده نکنیم. وجود آن باعث میشود مدل هر پیک فصلی را به عنوان ناهنجاری علامتگذاری کند و نتایج در هر روز در نقاط مشابه متمرکز شوند. اگر بررسی بزرگی مقادیر (Magnitude) لازم است، باید به صورت انحراف یا Z-score بیان شوند.
در محیط عملیاتی، پارامتر max_samples اهرم اصلی حساسیت است. برخلاف تصور، مقدار پیشفرض ۲۵۶ بهطور عمدی کوچک انتخاب شده است. بر اساس مقاله اصلی، نمونهبرداری کوچک باعث کاهش پدیدههای Swamping (غرقشدگی) و Masking (پوشاندگی) میشود، جایی که مناطق متراکم عادی، ناهنجاریها را از دید یکدیگر پنهان میکنند. افزایش این عدد درختان را عمیقتر کرده و اغلب عملکرد تشخیص را کاهش میدهد.
مقیاس (Scale) دادهها اهمیت ندارد، اما محدوده (Range) حیاتی است. چون برشها بهطور یکنواخت در محدوده مشاهده شدهی یک ویژگی انتخاب میشوند، ستونی با یک داده پرت بسیار عظیم، فضاهای خالی وسیعی ایجاد میکند. برشهای تصادفی در این فضاها نقاط را سریع ایزوله میکنند. اگرچه این هدف مدل است، اما یک ستون با توزیع دم-سنگین (Heavy-tailed) یا مقیاس بد میتواند بر کل جنگل غلبه کند. همیشه بررسی کنید کدام ستون باعث ایجاد پرچم ناهنجاری شده است.
نکته حیاتی دیگر پارامتر contamination است. حالت auto اجازه میدهد دادهها نرخ ناهنجاری را تعیین کنند (با آفست ثابت ۰.۵-). اما تعیین دستی یک عدد، آفست را طوری جابجا میکند که دقیقاً همان درصد از دادهها علامتگذاری شوند؛ این کار در واقع «تحمیل» یک نرخ ناهنجاری است تا «کشف» آن.
در استقرار واقعی، یک اتفاق معمولاً منجر به چندین پرچم متوالی میشود. مثلاً توقف ۱۵ ساعته سنسور، ۱۵ ردیف ناهنجار تولید میکند. توسعهدهندگان باید این پرچمهای مجاور را در بازههای زمانی گروهبندی کنند تا حجم هشدارها با نرخ نمونهبرداری رشد نکند.
باید به خاطر داشت که Isolation Forest ابزاری برای تشخیص نقطه تغییر (Change-point Detection) نیست. این مدل تغییر رژیم دائمی را به عنوان یک سری ردیف غیرعادی میبیند. به محض اینکه ویژگیهای متحرک (مثل میانگین متحرک) با سطح جدید سازگار شوند، مدل وضعیت جدید را «عادی» تلقی میکند. اگر هدف یافتن نقطهای است که یک فرآیند در آن تغییر کرده، ابزارهای Change Point Detection گزینه صحیح هستند.
برای کسانی که این مدل را پیاده میکنند، راهنما پیشنهاد میکند بهجای تکیه بر پرچمهای صفر و یک، دادهها را بر اساس score_samples رتبهبندی کنید. این روش به بازبینهای انسانی اجازه میدهد روی شدیدترین پرتها تمرکز کنند و با تغییر نرخ واقعی ناهنجاری در طول زمان، عملکرد مدل بهطور نرمتری کاهش مییابد.
گام بعدی شما
- بهجای تکیه بر پرچمهای صفر و یک، دادهها را بر اساس
score_samplesرتبهبندی کنید تا روی شدیدترین پرتها تمرکز کنید. - ستون انحراف معیار متحرک را برای شناسایی سریع «قفل شدن» سنسورها در خط لولههای داده اضافه کنید.
- از پنجرههای لغزان برای مهندسی ویژگی استفاده کنید تا از نشت داده (Data Leakage) جلوگیری شود.
اما داستان سختافزاری پردازش این حجم از دادهها در لبه شبکه حتی پیچیدهتر است — به تحلیل ما دربارهی رایانش لبه مراجعه کنید.




گفتگو