การเรียนรู้เทคนิคต่างๆ ของการตรวจจับสิ่งผิดปกติ

การเรียนรู้เทคนิคต่างๆ ของการตรวจจับสิ่งผิดปกติ

โหนดต้นทาง: 1867449

เราใช้ Standard Scaler เพื่อทำให้ข้อมูลของเราเป็นปกติและวางแผนกราฟกระจาย

ตอนนี้เราจะนำเข้า DBSCAN เพื่อให้คะแนนกับคลัสเตอร์ หากล้มเหลวจะแสดง -1

ตอนนี้เราได้ผลลัพธ์แล้ว แต่เราจะตรวจสอบได้อย่างไรว่าค่าใดเป็น min, max และมีค่า -1 หรือไม่ เราจะใช้ค่า arg min เพื่อตรวจสอบค่าที่น้อยที่สุดในคลัสเตอร์

เราสามารถดูได้จากผลลัพธ์ 1 ค่าคือ -XNUMX

ตอนนี้ให้พล็อตกราฟกระจาย

วิธีการข้างต้นที่เราใช้นั้นใช้ค่าผิดปกติที่ไม่แปรผัน

สำหรับการตรวจจับค่าผิดปกติหลายตัวแปร เราจำเป็นต้องเข้าใจค่าผิดปกติหลายตัวแปร

ตัวอย่างเช่น เราอ่านค่ารถยนต์ เราได้เห็นการอ่านมาตรวัดสองค่า หนึ่งสำหรับมาตรวัดระยะทาง ซึ่งบันทึกหรือวัดความเร็วที่รถเคลื่อนที่ และอย่างที่สองคือการอ่านค่า rpm ซึ่งบันทึกจำนวนการหมุนของล้อรถยนต์ต่อนาที

สมมติว่ามาตรวัดระยะทางแสดงในช่วง 0-60 ไมล์ต่อชั่วโมงและรอบต่อนาทีใน 0-750 เราคิดว่าค่าทั้งหมดที่ได้มาควรสัมพันธ์กัน หากมาตรวัดระยะทางแสดงความเร็ว 50 และรอบต่อนาทีแสดงการสูบเข้าเป็น 0 แสดงว่าการอ่านค่าไม่ถูกต้อง ถ้ามาตรวัดระยะทางแสดงค่ามากกว่าศูนย์ แสดงว่ารถกำลังเคลื่อนที่ ดังนั้น rpm ควรมีค่าสูงกว่า แต่ในกรณีของเรา แสดงค่าเป็น 0 เช่น ค่าผิดปกติหลายตัวแปร

ค. วิธีหาระยะมหาลาโนบิส

ใน DBSCAN เราใช้เมตริกระยะทางแบบยุคลิด แต่ในกรณีนี้ เรากำลังพูดถึงวิธีวัดระยะทาง Mahalanobis เรายังสามารถใช้ Mahalanobis Distance กับ 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=ไม่มี ข้อมูล=ไม่มี และความแปรปรวนร่วม=ไม่มี ภายในฟังก์ชัน เราหาค่าเฉลี่ยของข้อมูลและใช้ค่าความแปรปรวนร่วมของค่าตรงนั้น มิฉะนั้น เราจะคำนวณเมทริกซ์ความแปรปรวนร่วม T ย่อมาจากทรานสโพส

ตัวอย่างเช่น ถ้าขนาดอาร์เรย์คือ XNUMX หรือ XNUMX และคุณต้องการให้อยู่ในสองตัวแปร เราก็จำเป็นต้องเปลี่ยนเมทริกซ์

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 dot เป็นวิธีคูณเมทริกซ์

นำเข้า scipy เป็นระยะทาง sp def (x=ไม่มี, data=ไม่มี, 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) return 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

ช่วงล่าง = เปอร์เซ็นไทล์ที่ 25 + k* IQR

ให้เราดูข้อมูลไททานิคพร้อมตัวแปรอายุโดยใช้โครงเรื่อง

sns.boxplot(ไททานิก['อายุ'].ค่า)

เราเห็นได้จากภาพว่าบ็อกซ์บ็อตที่สร้างโดย 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) คืนค่าล่าง บน
ค่าผิดปกติ (ไททานิก ['อายุ'], k = 1.5)
(2.5, 54.5)

ง. การตรวจจับโดย PyCaret

เราจะใช้ชุดข้อมูลเดียวกันสำหรับการตรวจจับโดย PyCaret

จาก pycaret.anomaly นำเข้า * setup_anomaly_data = การตั้งค่า (df)

Pycaret เป็นการเรียนรู้ของเครื่องแบบโอเพ่นซอร์สซึ่งใช้รูปแบบการเรียนรู้แบบไม่มีผู้ดูแลเพื่อตรวจจับค่าผิดปกติ มีเมธอด get_data สำหรับใช้ชุดข้อมูลใน pycaret เอง, set_up สำหรับงานประมวลผลล่วงหน้าก่อนการตรวจจับ, มักจะใช้ data frame แต่ยังมีคุณสมบัติอื่น ๆ อีกมากมายเช่น forget_features เป็นต้น

วิธีอื่น create_model สำหรับการใช้อัลกอริทึม ก่อนอื่นเราจะใช้ Isolation Forest

ifor = create_model("iforest") plot_model(ifor) ifor_predictions = Predict_model(ifor, data = df) พิมพ์(ifor_predictions) ifor_anomaly = ifor_predictions[ifor_predictions["ความผิดปกติ"] == 1] พิมพ์(ifor_anomaly.head()) พิมพ์( ifor_anomaly.shape)

ความผิดปกติ 1 บ่งชี้ถึงค่าผิดปกติ และความผิดปกติ 0 บ่งชี้ว่าไม่มีค่าผิดปกติ

สีเหลืองในที่นี้หมายถึงค่าผิดปกติ

ตอนนี้ให้เราดูอัลกอริทึมอื่น K Nearest Neighbors (KNN)

knn = create_model("knn") plot_model(knn) knn_pred = Predict_model(knn, data = df) พิมพ์(knn_pred) knn_anomaly = knn_pred[knn_pred["ความผิดปกติ"] == 1] knn_anomaly.head() knn_anomaly.shape

ตอนนี้เราจะใช้อัลกอริทึมการจัดกลุ่ม

clus = create_model("คลัสเตอร์") plot_model(clus) 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 นำเข้า create_data จาก pyod.utils.data นำเข้า evaluation_print จาก pyod.utils.example นำเข้าภาพ train= 300 test=100 contaminate = 0.1 X_train, X_test, y_train, y_test = create_data(n_train=train, n_test=test , n_features=2,contamination=contaminate,random_state=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) y_testscores = c.decision_function(X_test) print("Training Data:") evaluation_print(cname_alg, y_train, y_train_scores) print("Test Data:") evaluation_print(cname_alg, y_test, y_test_scores) visualize(cname_alg, X_train, y_train, X_test, y_test, y_trainpred, y_testpred, show_figure=จริง, save_figure=จริง)

เราจะใช้อัลกอริทึม 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_scores = 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) visualize(fname_alg, X_train, y_train, X_test, y_test_pred, y_train_pred,y_test_pred, show_figure=จริง, save_figure=จริง)

F. การตรวจจับความผิดปกติโดยศาสดา

เราจะใช้ชุดข้อมูลผู้โดยสารทางอากาศกับอนุกรมเวลา 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 ทำให้ไม่มีค่าลบ เราแบ่งข้อมูลของเราออกเป็นการฝึก ทดสอบ และจัดเก็บการคาดคะเนในการพยากรณ์แบบแปรผัน

รถไฟ, test= train_test_split(ข้อมูล, Random_state =42) m.fit(รถไฟ[['ds','y']]) พยากรณ์ = m.predict(ทดสอบ) def ตรวจจับ(พยากรณ์): forcast = คาดการณ์[['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['real']= data['y'] forcast['anomaly'] =0 forcast.loc[forcast['ของจริง'] > 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

สรุป

กระบวนการค้นหาค่าผิดปกติในชุดข้อมูลที่กำหนดเรียกว่าการตรวจจับความผิดปกติ Outliers คือออบเจกต์ข้อมูลที่โดดเด่นจากค่าออบเจกต์อื่นๆ ในชุดข้อมูล และไม่ทำงานตามปกติ

งานตรวจจับความผิดปกติสามารถใช้วิธีการจัดกลุ่มตามระยะทางและตามความหนาแน่นเพื่อระบุค่าผิดปกติเป็นคลัสเตอร์

ในที่นี้เราจะพูดถึงวิธีการต่างๆ ของการตรวจจับสิ่งผิดปกติและอธิบายโดยใช้โค้ดในชุดข้อมูล XNUMX ชุดของไททานิค ผู้โดยสารทางอากาศ และแคเร็ต

ประเด็นสำคัญ

1. สามารถตรวจจับค่าผิดปกติหรือความผิดปกติได้โดยใช้วิธี Box-Whisker หรือโดย DBSCAN

2. วิธีระยะทางแบบยุคลิดใช้กับรายการที่ไม่สัมพันธ์กัน

3. วิธี Mahalanobis ใช้กับค่าผิดปกติหลายตัวแปร

4. ค่าหรือคะแนนทั้งหมดไม่ใช่ค่าผิดปกติ บ้างก็เป็นเสียงที่ควรจะเป็นขยะ Outliers เป็นข้อมูลที่ถูกต้องซึ่งจำเป็นต้องปรับเปลี่ยน

5. เราใช้ PyCaret ในการตรวจจับค่าผิดปกติโดยใช้อัลกอริธึมที่แตกต่างกัน โดยที่ค่าผิดปกติคือค่าเดียว แสดงเป็นสีเหลือง และไม่มีค่าค่าผิดปกติหากค่าค่าผิดปกติเป็น 0

6. เราใช้ PyOD ซึ่งเป็นไลบรารีการตรวจจับ Python Outlier มีอัลกอริธึมมากกว่า 40 รายการ ใช้เทคนิคที่มีการควบคุมและไม่มีการควบคุม

7. เราใช้ศาสดาและกำหนดฟังก์ชันตรวจจับเพื่อสรุปค่าผิดปกติ

สื่อที่แสดงในบทความนี้ไม่ได้เป็นของ Analytics Vidhya และถูกใช้ตามดุลยพินิจของผู้เขียน

ประทับเวลา:

เพิ่มเติมจาก การวิเคราะห์ วิทยา