تعلم تقنيات مختلفة لاكتشاف الشذوذ

تعلم تقنيات مختلفة لاكتشاف الشذوذ

عقدة المصدر: 1867449

استخدمنا Standard Scaler لجعل بياناتنا طبيعية ورسمنا رسمًا بيانيًا مبعثرًا.

الآن سنقوم باستيراد DBSCAN لإعطاء نقاط للمجموعات. إذا فشل ، سيظهر -1.

الآن لدينا النتائج ، ولكن كيف نتحقق من القيمة الدنيا ، والحد الأقصى ، وما إذا كان لدينا قيم -1؟ سنستخدم قيمة arg min للتحقق من أصغر قيمة في المجموعة.

يمكننا أن نرى من النتيجة ست قيم وهي -1.

دعنا الآن نرسم رسم بياني مبعثر.

الأساليب المذكورة أعلاه التي طبقناها هي على القيم المتطرفة أحادية التباين.

بالنسبة لاكتشافات القيم المتطرفة متعددة المتغيرات ، نحتاج إلى فهم القيم المتطرفة متعددة المتغيرات.

على سبيل المثال ، نأخذ قراءات السيارة. لقد رأينا اثنين من عدادات القراءة ، أحدهما لعداد المسافات ، والذي يسجل أو يقيس السرعة التي تتحرك بها السيارة ، والثاني هو قراءة rpm التي تسجل عدد الدورات التي تقوم بها عجلة السيارة في الدقيقة.

افترض أن عداد المسافات يظهر في نطاق 0-60 ميل في الساعة و rpm في 0-750. نحن نفترض أن جميع القيم التي تأتي يجب أن ترتبط ببعضها البعض. إذا أظهر عداد المسافات سرعة 50 وأظهر عدد الدورات في الدقيقة 0 مآخذ ، فإن القراءات غير صحيحة. إذا أظهر عداد المسافات قيمة أكبر من الصفر ، فهذا يعني أن السيارة كانت تتحرك ، لذلك يجب أن يكون لعدد الدورات في الدقيقة قيم أعلى ، ولكن في حالتنا ، فإنه يظهر قيمة 0. على سبيل المثال ، القيم المتطرفة متعددة المتغيرات.

طريقة مسافة ماهالانوبيس

في DBSCAN ، استخدمنا مقاييس المسافة الإقليدية ، ولكن في هذه الحالة ، نتحدث عن طريقة Mahalanobis للمسافة. يمكننا أيضًا استخدام مسافة 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)

لماذا الإقليدية غير مناسبة للكيانات المرتبطة ببعضها البعض؟ لا يمكن للمسافة الإقليدية العثور أو ستعطي بيانات غير صحيحة حول مدى قرب النقطتين.

تستخدم طريقة ماهالانوبيس المسافة بين النقاط وتوزيع البيانات النظيفة. غالبًا ما تكون المسافة الإقليدية بين نقطتين ، ويتم حساب الدرجة z الخاصة بها بواسطة x ناقص المتوسط ​​وتقسيمها على الانحراف المعياري. في Mahalanobis ، تكون الدرجة z هي x ناقص المتوسط ​​مقسومًا على مصفوفة التغاير.

لذلك ، ما هو تأثير القسمة على مصفوفة التغاير؟ ستكون قيم التغاير عالية إذا كانت المتغيرات في مجموعة البيانات الخاصة بك شديدة الارتباط.

وبالمثل ، إذا كانت قيم التباين المشترك منخفضة ، فلن يتم تقليل المسافة بشكل كبير إذا كانت البيانات غير مرتبطة. إنه يعمل بشكل جيد لدرجة أنه يعالج كلاً من المقياس والارتباط لقضايا المتغيرات.

رمز

يمكن الحصول على مجموعة البيانات من Anomaly- / caret.csv at main · aster28 / Anomaly- (github.com)

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

حددنا مسافة الوظيفة على أنها x = لا شيء ، والبيانات = لا شيء ، والتغاير = لا شيء. داخل الدالة ، أخذنا متوسط ​​البيانات واستخدمنا قيمة التباين المشترك للقيمة هناك. وإلا ، فسنحسب مصفوفة التغاير. T لتقف على تبديل.

على سبيل المثال ، إذا كان حجم المصفوفة خمسة أو ستة وتريد أن يكون في متغيرين ، فسنحتاج إلى تبديل المصفوفة.

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 (x = لا شيء ، البيانات = لا شيء ، cov = لا شيء): x_m = x - np.mean (البيانات) إن لم يكن cov: cov = np.cov (data.values.T) inv_cov = sp. linalg.inv (cov) left = np.dot (x_m، inv_cov) m_distance = np.dot (left، x_m.T) إرجاع m_distance.diagonal () df_g = df [['قيراط' ، 'عمق' ، 'السعر' ]]. head (50) df_g ['m_distance'] = المسافة (x = df_g، data = df [['قيراط'، 'عمق'، 'سعر']]) df_g.head ()

B. طريقة Tukey للكشف عن الخارجة

غالبًا ما تسمى طريقة Tukey أيضًا طريقة Box and Whisker أو Box plot.

تستخدم طريقة Tukey النطاق العلوي والسفلي.

النطاق الأعلى = 75 المئوية -k * IQR

النطاق الأدنى = النسبة المئوية الخامسة والعشرون + k * IQR

دعونا نرى بيانات تايتانيك مع متغير العمر باستخدام مخطط مربع.

sns.boxplot (قيم عملاقة ['Age'].)

يمكننا أن نرى في الصورة أن البقعة الصندوقية التي أنشأها Seaborn تُظهر أن العديد من النقاط بين سن 55 و 80 هي قيم متطرفة ليست ضمن الربعية. سنكتشف النطاق الأدنى والأعلى من خلال عمل دالة outliers_detect.

def outliers_detect (x، k = 1.5): x = np.array (x) .copy (). astype (float) first = np.quantile (x، .25) third = np.quantile (x، .75) # حساب IQR iqr = الثالث - الأول # النطاق العلوي والنطاق الأدنى الأدنى = الأول - (k * iqr) العلوي = الثالث + (k * iqr) يعود إلى الأسفل ، العلوي
outliers_detect (titanic ['age'] ، k = 1.5)
(2.5، 54.5)

D. الكشف عن طريق PyCaret

سنستخدم نفس مجموعة البيانات للكشف عن طريق PyCaret.

من استيراد pycaret.anomaly * setup_anomaly_data = الإعداد (df)

Pycaret هو تعلم آلي مفتوح المصدر يستخدم نموذجًا تعليميًا غير خاضع للإشراف لاكتشاف القيم المتطرفة. لديها طريقة get_data لاستخدام مجموعة البيانات في pycaret نفسها ، set_up لمهمة المعالجة المسبقة قبل الاكتشاف ، عادةً ما تأخذ إطار بيانات ولكن لديها أيضًا العديد من الميزات الأخرى مثل ignore_features ، إلخ.

طرق أخرى create_model لاستخدام الخوارزمية. سنستخدم غابة العزل أولاً.

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

يشير الشذوذ 1 إلى القيم المتطرفة ، بينما لا يُظهر الشذوذ 0 القيم المتطرفة.

يشير اللون الأصفر هنا إلى القيم المتطرفة.

الآن دعونا نرى خوارزمية أخرى ، K Nearest Neighbours (KNN)

knn = create_model ("knn") plot_model (knn) knn_pred = Forecast_model (knn، data = df) print (knn_pred) knn_anomaly = knn_pred [knn_pred ["Anomaly"] == 1] knn_anomaly.head () knn_omaly.sha ()

الآن سوف نستخدم خوارزمية التجميع.

clus = create_model ("الكتلة") plot_model (clus) clus_pred = Forecast_model (clus، data = df) print (clus_pred) clus_anomaly = clus_prediction [clus_pred ["Anomaly"] == 1] print (clus_anomaly.head (). شكل

E. الكشف عن الشذوذ بواسطة PyOD

PyOD هي مكتبة بيثون للكشف عن القيم المتطرفة في البيانات متعددة المتغيرات. إنه جيد للتعلم الخاضع للإشراف وغير الخاضع للإشراف.

من pyod.models.iforest استيراد IForest من pyod.models.knn استيراد KNN 

قمنا باستيراد المكتبة والخوارزمية.

من استيراد pyod.utils.data create_data من pyod.utils.data استيراد قيم_طباعة من pyod.utils.example استيراد تصور قطار = 300 اختبار = 100 ملوث = 0.1 X_train ، X_test ، y_train ، y_test = إنشاء_ بيانات (n_train = قطار ، n_test = اختبار ، n_features = 2 ، تلوث = تلوث ، عشوائي_حالة = 42)
cname_alg = 'KNN' # اسم الخوارزمية هو K أقرب الجيران c = KNN () c.fit (X_train) # تناسب الخوارزمية y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict (X_test) yestscores = c. y_trainpred ، y_testpred ، show_figure = True ، save_figure = True)

سوف نستخدم خوارزمية IForest.

fname_alg = 'IForest' # اسم الخوارزمية هو K أقرب الجيران f = IForest () f.fit (X_train) # تناسب الخوارزمية y_train_pred = c.labels_ y_train_scores = c.decision_scores_ y_test_pred = c.predict (X_test) y_test_pred = c. c.decision_function (X_test) print ("Training Data:") Evaluation_print (fname_alg، y_train_pred، y_train_scores) print ("Test Data:") Evaluation_print (fname_alg، y_test_pred، y_test_scores) تصور (fname_alg، X_tprrain، y_train، X_ted y_train_pred ، y_test_pred ، show_figure = صحيح ، save_figure = True)

و. كشف الشذوذ بالنبي

سوف نستخدم مجموعة بيانات الركاب جواً مع سلاسل زمنية النبي / example_air_passengers.csv at main · aster28 / prophet (github.com)

استيراد النبي من النبي استيراد المتنبئ من النبي استيراد النبي م = النبي ()
data = pd.read_csv ('air_pass.csv') data.head ()
data.columns = ['ds'، 'y'] البيانات ['y'] = np.where (data ['y']! = 0، np.log (data ['y'])، 0)

لا يتيح سجل العمود y أي قيمة سالبة. نقوم بتقسيم بياناتنا إلى قطار واختبار وتخزين التنبؤ في التنبؤ المتغير.

القطار ، الاختبار = train_test_split (البيانات ، random_state = 42) m.fit (القطار [['ds'، 'y']]) التوقعات = m.predict (الاختبار) def اكتشاف (التنبؤ): التنبؤ = التنبؤ [['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 return forcast
كشف (توقع)

أخذنا الشذوذ كـ -1.

وفي الختام

تسمى عملية العثور على القيم المتطرفة في مجموعة بيانات معينة اكتشاف الانحراف. القيم المتطرفة هي كائنات بيانات تبرز عن باقي قيم الكائن في مجموعة البيانات ولا تتصرف بشكل طبيعي.

يمكن لمهام الكشف عن الشذوذ استخدام طرق التجميع القائمة على المسافة والكثافة لتحديد القيم المتطرفة كمجموعة.

نناقش هنا الطرق المختلفة لاكتشاف الشذوذ وشرحها باستخدام الكود الموجود في ثلاث مجموعات بيانات من تيتانيك ، وركاب طيران ، وعلامة الإقحام إلى

النقاط الرئيسية

1. يمكن الكشف عن القيم المتطرفة أو الكشف عن الشذوذ باستخدام طريقة Box-Whisker أو عن طريق DBSCAN.

2. يتم استخدام طريقة المسافة الإقليدية مع العناصر غير المرتبطة.

3. يتم استخدام طريقة Mahalanobis مع القيم المتطرفة متعددة المتغيرات.

4. جميع القيم أو النقاط ليست القيم المتطرفة. بعضها ضوضاء يجب أن تكون قمامة. القيم المتطرفة هي بيانات صالحة تحتاج إلى تعديل.

5. استخدمنا PyCaret لاكتشاف القيم المتطرفة باستخدام خوارزميات مختلفة حيث يكون الشذوذ واحدًا ، ويظهر باللون الأصفر ، ولا توجد قيم متطرفة حيث يكون الشذوذ 0.

6. استخدمنا PyOD ، وهي مكتبة الكشف عن Python Outlier. لديها أكثر من 40 خوارزمية. يتم استخدامه تقنيات خاضعة للإشراف وغير خاضعة للإشراف.

7. استخدمنا النبي وحددنا وظيفة الكشف لتحديد القيم المتطرفة.

الوسائط الموضحة في هذه المقالة ليست مملوكة لـ Analytics Vidhya ويتم استخدامها وفقًا لتقدير المؤلف.

الطابع الزمني:

اكثر من تحليلات Vidhya