یادگیری تکنیک های مختلف تشخیص ناهنجاری

یادگیری تکنیک های مختلف تشخیص ناهنجاری

گره منبع: 1867449

ما از Standard Scaler برای نرمال کردن داده هایمان استفاده کردیم و نمودار پراکندگی را رسم کردیم.

اکنون DBSCAN را وارد می کنیم تا به خوشه ها امتیاز دهیم. اگر شکست بخورد، -1 را نشان می دهد.

حالا ما نتایج را داریم، اما چگونه بررسی کنیم که کدام مقدار min، max است و آیا مقادیر -1 داریم؟ ما از مقدار arg min برای بررسی کوچکترین مقدار در خوشه استفاده خواهیم کرد.

از نتیجه می توانیم شش مقدار را ببینیم که -1 هستند.

اجازه دهید اکنون یک نمودار پراکندگی رسم کنیم.

روش های فوق که ما به کار بردیم بر روی پرت تک متغیره هستند.

برای تشخیص نقاط پرت چند متغیره، باید مقادیر پرت چند متغیره را درک کنیم.

به عنوان مثال، ما قرائت خودرو را در نظر می گیریم. ما دو قرائت متر دیده ایم که یکی برای کیلومترشمار است که سرعت حرکت وسیله نقلیه را ثبت یا اندازه گیری می کند و دومی قرائت دور در دقیقه است که تعداد چرخش های چرخ ماشین را در دقیقه ثبت می کند.

فرض کنید کیلومتر شمار در محدوده 0-60 مایل در ساعت و دور در دقیقه 0-750 را نشان می دهد. ما فرض می کنیم که تمام مقادیری که می آیند باید با یکدیگر همبستگی داشته باشند. اگر کیلومترشمار سرعت 50 و دور در دقیقه 0 ورودی را نشان دهد، خوانش نادرست است. اگر کیلومترشمار مقداری بیش از صفر نشان می دهد، به این معنی است که ماشین در حال حرکت بوده است، بنابراین دور در دقیقه باید مقادیر بالاتری داشته باشد، اما در مورد ما، مقدار 0 را نشان می دهد. به عنوان مثال، پرت چند متغیره.

ج. روش فاصله‌گیری ماهالانوبیس

در DBSCAN از متریک های فاصله اقلیدسی استفاده کردیم، اما در این مورد، ما در مورد روش فاصله ماهالانوبیس صحبت می کنیم. همچنین می توانیم از فاصله Mahalanobis با DBSCAN استفاده کنیم.

DBSCAN(eps=0.5, min_samples=3, metric='mahalanobis', metric_params={'V':np.cov(X)}, algorithm='brute', leaf_size=30, n_jobs=-1)

چرا اقلیدسی برای موجودیت های مرتبط با یکدیگر مناسب نیست؟ فاصله اقلیدسی نمی تواند پیدا کند یا داده های نادرستی در مورد نزدیک بودن این دو نقطه به دست می دهد.

روش Mahalanobis از فاصله بین نقاط و توزیع استفاده می کند که داده های تمیز است. فاصله اقلیدسی اغلب بین دو نقطه است و امتیاز z آن با x منهای میانگین محاسبه شده و بر انحراف معیار تقسیم می شود. در Mahalanobis، z-score x منهای میانگین تقسیم بر ماتریس کوواریانس است.

بنابراین، تقسیم بر ماتریس کوواریانس چه تأثیری دارد؟ اگر متغیرهای موجود در مجموعه داده شما همبستگی بالایی داشته باشند، مقادیر کوواریانس بالا خواهد بود.

به طور مشابه، اگر مقادیر کوواریانس پایین باشد، اگر داده ها همبستگی نداشته باشند، فاصله به طور قابل توجهی کاهش نمی یابد. آنقدر خوب عمل می کند که هم به مقیاس و هم همبستگی مسائل متغیرها می پردازد.

رمز

مجموعه داده را می توان از Anomaly-/caret.csv در اصلی · aster28/Anomaly- (github.com)

df = pd.read_csv('caret.csv').iloc[:, [0,4,6]] df.head()

فاصله تابع را x= None، data= None و Covariance= None تعریف کردیم. در داخل تابع، میانگین داده ها را گرفتیم و از مقدار کوواریانس مقدار در آنجا استفاده کردیم. در غیر این صورت ماتریس کوواریانس را محاسبه خواهیم کرد. T مخفف transpose است.

به عنوان مثال، اگر اندازه آرایه پنج یا شش است و می خواهید در دو متغیر باشد، باید ماتریس را جابجا کنیم.

np.random.multivariate_normal(mean, cov, size = 5)
array([[ 0.0509196, 0.536808 ], [ 0.1081547, 0.9308906], [ 0.4545248, 1.4000731], [ 0.9803848, 0.9660610], [ 0.8079491 , 0.9687909]])
np.random.multivariate_normal(mean, cov, size = 5).T
array([[ 0.0586423, 0.8538419, 0.2910855, 5.3047358, 0.5449706], [ 0.6819089, 0.8020285, 0.7109037, 0.9969768, -0.7155739]])

ما از sp.linalg استفاده کردیم که جبر خطی است و عملکردهای متفاوتی برای انجام در جبر خطی دارد. دارای تابع inv برای وارونگی ماتریس است. نقطه NumPy به عنوان وسیله ای برای ضرب ماتریس.

وارد کردن scipy به عنوان sp def distance(x=هیچکدام، داده=هیچکدام، cov=هیچکدام): x_m = x - np.mean(data) اگر نه cov: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) left = np.dot(x_m، inv_cov) m_distance = np.dot(سمت چپ، x_m.T) بازگشت m_distance.diagonal() df_g= df[['قیراط'، 'عمق'، 'قیمت' ]].head(50) df_g['m_distance'] = فاصله(x=df_g، داده=df[['قیراط'، 'عمق'، 'قیمت']]) df_g.head()

ب. روش توکی برای تشخیص پرت

روش Tukey را اغلب Box and Whisker یا Box plot نیز می نامند.

روش Tukey از محدوده بالا و پایین استفاده می کند.

محدوده بالایی = صدک ۷۵ -k*IQR

محدوده پایین = صدک 25 + k* IQR

اجازه دهید داده‌های تایتانیک خود را با متغیر سن با استفاده از نمودار جعبه ببینیم.

sns.boxplot(titanic['age'].values)

ما می‌توانیم در تصویر ببینیم که باکس بلات ایجاد شده توسط Seaborn نشان می‌دهد که بسیاری از نقاط بین سنین 55 تا 80، نقاط پرت هستند که در داخل چارک‌ها نیستند. با ایجاد یک تابع outliers_detect، محدوده پایین و بالایی را تشخیص می دهیم.

def outliers_detect(x, k = 1.5): x = np.array(x).copy().atype(float) first = np.quantile(x, .25) سوم = np.quantile(x, 75) # محاسبه IQR iqr = سوم - اول #محدوده بالایی و محدوده پایینی پایین تر = اول - (k * iqr) بالا = سوم + (k * iqr) بازگشت پایین تر، بالا
outliers_detect(تایتانیک['سن']، k = 1.5)
(2.5، 54.5)

D. تشخیص توسط PyCaret

ما از همان مجموعه داده برای شناسایی توسط PyCaret استفاده خواهیم کرد.

از pycaret.anomaly import * setup_anomaly_data = setup(df)

Pycaret یک یادگیری ماشینی منبع باز است که از یک مدل یادگیری بدون نظارت برای تشخیص موارد پرت استفاده می کند. این یک متد get_data برای استفاده از مجموعه داده در خود pycaret دارد، set_up برای کار پیش پردازش قبل از شناسایی، معمولاً چارچوب داده را می گیرد اما همچنین دارای بسیاری از ویژگی های دیگر مانند ignore_features و غیره است.

روش های دیگر create_model برای استفاده از یک الگوریتم. ابتدا از Isolation Forest استفاده خواهیم کرد.

ifor = create_model("iforest") plot_model(ifor) ifor_predictions = predict_model(ifor، data = df) print(ifor_predictions) ifor_anomaly = ifor_predictions[ifor_predictions["Anomaly"] == 1] print(ifor_anomaly. head. ifor_anomaly.shape)

ناهنجاری 1 نشان دهنده نقاط پرت است و ناهنجاری 0 هیچ پرت را نشان نمی دهد.

رنگ زرد در اینجا نشان دهنده نقاط پرت است.

حالا اجازه دهید الگوریتم دیگری را ببینیم، K نزدیکترین همسایگان (KNN)

knn = create_model("knn") plot_model(knn) knn_pred = predict_model(knn، داده = df) print(knn_pred) knn_anomaly = knn_pred[knn_pred["Anomaly"] == 1] knheadan_nomaly.shannpe.

اکنون از یک الگوریتم خوشه بندی استفاده خواهیم کرد.

clus = create_model("cluster") plot_model(clus) clus_pred = predict_model(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Anomaly"] == 1] print(clus_anomaly. شکل

E. تشخیص ناهنجاری توسط PyOD

PyOD یک کتابخانه پایتون برای تشخیص نقاط پرت در داده های چند متغیره است. هم برای یادگیری تحت نظارت و هم برای یادگیری بدون نظارت خوب است.

از pyod.models.iforest import IForest از pyod.models.knn واردات KNN 

کتابخانه و الگوریتم را وارد کردیم.

from pyod.utils.data import generate_data from pyod.utils.data import valuevalue_print from pyod.utils.example import visualize train= 300 test=100 contaminate = 0.1 X_train, X_test, y_train, y_test =gene_data(n_traintest=genering_data(n_traintest= , n_features=2, contamination=آلودگی,random_state=42)
cname_alg = 'KNN' # نام الگوریتم K Nearest Neighbors است c = KNN() c.fit(X_train) #براساس الگوریتم y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predicty(X_test) c.decision_function(X_test) print("Training Data:") value_print(cname_alg، y_train، y_train_scores) print("Test Data:") value_print(cname_alg, y_test, y_test_scores) visualize(cname_alg, y_test, X_train y_trainpred,y_testpred, show_figure=True, save_figure=True)

ما از الگوریتم IForest استفاده خواهیم کرد.

fname_alg = 'Iforest' # نام الگوریتم K Nearest Neighbors است f = IForest() f.fit(X_train) #Fit the الگوریتم y_train_pred = c.labels_ y_train_scores = c.decision_scores_ y_core_pred_stest c.decision_function(X_test) print("Training Data:") value_print(fname_alg، y_train_pred، y_train_scores) print("Test Data:") value_print(fname_alg، y_test_pred، y_test_scores)g visualize,__train_test, y_train_pred,y_test_pred, show_figure=True, save_figure=True)

ج. تشخیص ناهنجاری توسط پیامبر

ما از مجموعه داده مسافران هوایی با سری های زمانی استفاده خواهیم کرد prophet/example_air_passengers.csv در اصلی · aster28/prophet (github.com)

واردات پیامبر از پیامبر پیش بینی کننده واردات از پیامبر واردات پیامبر m = پیامبر()
data = pd.read_csv('air_pass.csv') data.head()
data.columns = ['ds', 'y'] data['y'] = np.where(data['y'] != 0, np.log(data['y'])، 0)

Log ستون y هیچ مقدار منفی را فعال نمی کند. ما داده های خود را به قطار تقسیم کردیم، آزمایش کردیم و پیش بینی را در پیش بینی متغیر ذخیره کردیم.

train, test= train_test_split(data, random_state =42) m.fit(train[['ds','y']]) forecast = m.predict(test) def detect(forecast): forcast = forecast[['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['real']= data['y'] forcast['anomaly'] =0 forcast.loc[forcast['real'] > forcast['yhat_upper'], 'anomaly']=1 forcast.loc[forcast['real']< forcast['yhat_lower'], 'anomaly']=-1 forcast['imp']=0 in_range = forcast ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['anomaly']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ forcast['anomaly']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range بازگشت پیش‌بینی
تشخیص (پیش بینی)

ناهنجاری را -1 در نظر گرفتیم.

نتیجه

فرآیند یافتن نقاط پرت در یک مجموعه داده معین، تشخیص ناهنجاری نامیده می شود. Outliers اشیاء داده ای هستند که از بقیه مقادیر شی در مجموعه داده متمایز هستند و رفتار عادی ندارند.

کارهای تشخیص ناهنجاری می توانند از روش های خوشه بندی مبتنی بر فاصله و چگالی برای شناسایی نقاط پرت به عنوان یک خوشه استفاده کنند.

ما در اینجا روش‌های مختلف تشخیص ناهنجاری را مورد بحث قرار می‌دهیم و آنها را با استفاده از کد روی سه مجموعه داده تایتانیک، مسافران ایر و کارت توضیح می‌دهیم.

نکات کلیدی

1. نقاط پرت یا تشخیص ناهنجاری را می توان با استفاده از روش Box-Whisker یا با DBSCAN شناسایی کرد.

2. روش فاصله اقلیدسی با موارد غیر همبسته استفاده می شود.

3. روش Mahalanobis با پرت چند متغیره استفاده می شود.

4. همه مقادیر یا نقاط پرت نیستند. برخی صداهایی هستند که باید زباله باشند. پرت ها داده های معتبری هستند که باید تنظیم شوند.

5. ما از PyCaret برای تشخیص نقاط پرت با استفاده از الگوریتم‌های مختلف استفاده کردیم که در آن ناهنجاری یک است که با رنگ‌های زرد نشان داده شده است، و هیچ نقطه پرت در جایی که نقطه پرت 0 است، وجود ندارد.

6. ما از PyOD استفاده کردیم که کتابخانه تشخیص Python Outlier است. بیش از 40 الگوریتم دارد. از تکنیک های نظارت شده و بدون نظارت استفاده می شود.

7. ما از Prophet استفاده کردیم و تابع detect را برای ترسیم نقاط پرت تعریف کردیم.

رسانه نشان داده شده در این مقاله متعلق به Analytics Vidhya نیست و به صلاحدید نویسنده استفاده می شود.

تمبر زمان:

بیشتر از تجزیه و تحلیل Vidhya