לימוד טכניקות שונות של זיהוי אנומליות

לימוד טכניקות שונות של זיהוי אנומליות

צומת המקור: 1867449

השתמשנו ב-Standard Scaler כדי להפוך את הנתונים שלנו לנורמליים ושרטטנו גרף פיזור.

כעת נייבא DBSCAN כדי לתת נקודות לאשכולות. אם זה נכשל, זה יראה -1.

עכשיו יש לנו את התוצאות, אבל איך בודקים איזה ערך הוא min, max והאם יש לנו ערכי -1? נשתמש בערך arg min כדי לבדוק את הערך הקטן ביותר באשכול.

אנו יכולים לראות מהתוצאה שישה ערכים שהם -1.

כעת נשרטט גרף פיזור.

השיטות לעיל שיישמנו הן על חריגים חד משתנים.

עבור זיהוי חריגים מרובי משתנים, עלינו להבין את החריגים מרובי משתנים.

לדוגמה, אנו לוקחים קריאות מכוניות. ראינו שני מדי קריאה אחד עבור מד המרחק, שמתעד או מודד את המהירות שבה הרכב נע, והשני הוא קריאת הסל"ד שמתעדת את מספר הסיבובים שמבצע גלגל המכונית בדקה.

נניח שמד המרחק מראה בטווח של 0-60 קמ"ש וסל"ד ב-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)

מדוע האוקלידית אינה מתאימה לישויות הקשורות זו לזו? המרחק האוקלידי לא יכול למצוא או ייתן נתונים שגויים על כמה קרובות שתי הנקודות.

שיטת Mahalanobis משתמשת במרחק בין נקודות והתפלגות שהוא נתונים נקיים. המרחק האוקלידי הוא לרוב בין שתי נקודות, וציון ה-z שלו מחושב לפי x מינוס ממוצע ומחולק בסטיית תקן. ב- Mahalanobis, ציון ה-z הוא x פחות הממוצע חלקי מטריצת השונות.

לכן, איזו השפעה יש לחלוקה על ידי מטריצת השונות? ערכי השונות המשתנים יהיו גבוהים אם המשתנים במערך הנתונים שלך נמצאים בקורלציה גבוהה.

באופן דומה, אם ערכי השונות הנמוכים, המרחק אינו מופחת באופן משמעותי אם הנתונים אינם מתואמים. זה עושה כל כך טוב שהוא מטפל הן בקנה המידה והן במתאם של בעיות המשתנים.

קופונים

ניתן לקחת ממנו ערכת נתונים Anomaly-/caret.csv ב-main · aster28/Anomaly- (github.com)

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

הגדרנו את הפונקציה מרחק כ-x= None, data= None, ו-Covariance = None. בתוך הפונקציה לקחנו את ממוצע הנתונים והשתמשנו בערך השונות של הערך שם. אחרת, נחשב את מטריצת השונות. 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 distance(x=None, data=None, cov=None): x_m = x - np.mean(data) if not 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) return m_distance.diagonal() df_g= df[['carat', 'depth', 'price' ]].head(50) df_g['m_distance'] = distance(x=df_g, data=df[['carat', 'depth', 'price']]) df_g.head()

ב.שיטה של ​​Tukey לזיהוי חריגים

שיטת Tukey נקראת לעתים קרובות גם Box and Whisker או Box plot.

שיטת Tukey משתמשת בטווח העליון והתחתון.

טווח עליון = אחוז 75 -k*IQR

טווח תחתון = אחוז 25 + k* IQR

תן לנו לראות את נתוני הטיטאניק שלנו עם משתנה גיל באמצעות עלילת קופסה.

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

אנו יכולים לראות בתמונה שכתם הקופסה שנוצר על ידי סיבורן מראה שנקודות רבות בין גיל 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) upper = שלישי + (k * iqr) החזר נמוך יותר, עליון
outliers_detect(titanic['age'], k = 1.5)
(2.5, 54.5)

ד. איתור על ידי 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()) print( ifor_anomaly.shape)

אנומליה 1 מציינת חריגות, ואנומליה 0 אינה מציגה חריגים.

הצבע הצהוב כאן מצביע על חריגים.

כעת נראה אלגוריתם אחר, K Nearest Neighbors (KNN)

knn = create_model("knn") plot_model(knn) knn_pred = predict_model(knn, data = df) print(knn_pred) knn_anomaly = knn_pred[knn_pred["Anomaly"] == 1] knn_anomaly.head() knn_anomaly.shape

כעת נשתמש באלגוריתם אשכולות.

clus = create_model("cluster") plot_model(cluster) clus_pred = predict_model(clus, data = df) print(clus_pred) clus_anomaly = clus_predictions[clus_pred["Anomaly"] == 1] print(clus_anomaly.head()) clus_anomaly. צוּרָה

E. זיהוי אנומליות על ידי PyOD

PyOD היא ספריית פיתון לזיהוי חריגים בנתונים מרובי משתנים. זה טוב גם ללמידה מפוקחת וגם ללא פיקוח.

מ-pyod.models.iforest ייבוא ​​IForest מ-pyod.models.knn ייבוא ​​KNN 

ייבאנו את הספרייה והאלגוריתם.

מ-pyod.utils.data ייבוא ​​gener_data מ-pyod.utils.data ייבוא ​​evaluate_print מ-pyod.utils.example ייבוא ​​visualize train= 300 test=100 contaminate = 0.1 X_train, X_test, y_train, y_test = generate_data(n_train=train, n_test=test , n_features=2,contamination=contaminate,random_state=42)
cname_alg = 'KNN' # שם האלגוריתם הוא K Nearest Neighbors c = KNN() c.fit(X_train) #Fit the algorithm y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predicty(X_test)s c.decision_function(X_test) print("נתוני אימון:") evaluate_print(cname_alg, y_train, y_train_scores) print("נתוני מבחן:") evaluate_print(cname_alg, y_test, y_test_scores) visualize(cname_alg, _train, X,_test, _train, X,_test y_trainpred,y_testpred, show_figure=True, save_figure=True)

נשתמש באלגוריתם IForest.

fname_alg = 'IForest' # שם האלגוריתם הוא K Nearest Neighbors f = IForest() f.fit(X_train) #התאמת האלגוריתם y_train_pred = c.labels_ y_train_scores = c.decision_scores_ y_test_pred = c.cores_testy_x_test =c.cores c.decision_function(X_test) print("נתוני אימון:") evaluate_print(fname_alg, y_train_pred, y_train_scores) print("נתוני בדיקה:") evaluate_print(fname_alg, y_test_pred, y_test_scores) visualize(x_name_alg,_,train_alg,_x_train,Xyd, _,train_alg, y_train_pred,y_test_pred, show_figure=True, save_figure=True)

ו. זיהוי אנומליה על ידי הנביא

נשתמש במערך הנתונים של הנוסעים האוויריים עם סדרות זמן prophet/example_air_passengers.csv ב-main · 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)

היומן של העמודה 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 return forcast
לזהות (תחזית)

לקחנו את האנומליה כ-1.

סיכום

התהליך של מציאת חריגים במערך נתונים נתון נקרא זיהוי אנומליות. חריגים הם אובייקטי נתונים הבולטים משאר ערכי האובייקט במערך הנתונים ואינם מתנהגים כרגיל.

משימות זיהוי חריגות יכולות להשתמש בשיטות מקבץ מבוססות מרחק וצפיפות כדי לזהות חריגים כאשכול.

אנו דנים כאן בשיטות השונות של זיהוי אנומליות ומסבירים אותן באמצעות הקוד בשלושת מערכי נתונים של נוסעי Titanic, Air ו-Caret כדי

נקודות מפתח

1. ניתן לזהות חריגים או גילוי אנומליות בשיטת Box-Whisker או באמצעות DBSCAN.

2. נעשה שימוש בשיטת המרחק האוקלידי עם הפריטים שאינם מתואמים.

3. נעשה שימוש בשיטת Mahalanobis עם חריגים מרובי משתנים.

4. כל הערכים או הנקודות אינם חריגים. חלקם הם רעשים שצריכים להיות זבל. חריגים הם נתונים חוקיים שיש להתאים.

5. השתמשנו ב-PyCaret לזיהוי חריגים על ידי שימוש באלגוריתמים שונים שבהם האנומליה היא אחת, מוצגת בצבעים צהובים, וללא חריגים שבהם החריגות היא 0.

6. השתמשנו ב- PyOD, שהיא ספריית הזיהוי של Python Outlier. יש לו יותר מ-40 אלגוריתמים. נעשה בו שימוש בטכניקות מפוקחות ובלתי מפוקחות.

7. השתמשנו ב-Prophet והגדרנו את הפונקציה detect כדי לשרטט את החריגים.

המדיה המוצגת במאמר זה אינה בבעלות Analytics Vidhya והיא משמשת לפי שיקול דעתו של המחבר.

בול זמן:

עוד מ אנליטיקה וידיה