Scikit Learn - การตรวจจับความผิดปกติ

ที่นี่เราจะเรียนรู้เกี่ยวกับการตรวจจับความผิดปกติใน Sklearn และวิธีใช้ในการระบุจุดข้อมูล

การตรวจจับความผิดปกติเป็นเทคนิคที่ใช้ในการระบุจุดข้อมูลในชุดข้อมูลที่ไม่เหมาะสมกับข้อมูลส่วนที่เหลือ มีแอพพลิเคชั่นมากมายในธุรกิจเช่นการตรวจจับการฉ้อโกงการตรวจจับการบุกรุกการตรวจสอบสุขภาพของระบบการเฝ้าระวังและการบำรุงรักษาเชิงคาดการณ์ ความผิดปกติซึ่งเรียกอีกอย่างว่าค่าผิดปกติสามารถแบ่งออกเป็นสามประเภทดังต่อไปนี้ -

  • Point anomalies - เกิดขึ้นเมื่ออินสแตนซ์ข้อมูลแต่ละรายการถูกพิจารณาว่าผิดปกติในส่วนที่เหลือของข้อมูล

  • Contextual anomalies- ความผิดปกติดังกล่าวเป็นบริบทเฉพาะ เกิดขึ้นหากอินสแตนซ์ข้อมูลผิดปกติในบริบทเฉพาะ

  • Collective anomalies - เกิดขึ้นเมื่อการรวบรวมอินสแตนซ์ข้อมูลที่เกี่ยวข้องผิดปกติ wrt ทั้งชุดข้อมูลแทนที่จะเป็นค่าแต่ละค่า

วิธีการ

สองวิธีคือ outlier detection และ novelty detectionสามารถใช้สำหรับการตรวจจับความผิดปกติ จำเป็นต้องดูความแตกต่างระหว่างกัน

การตรวจจับค่าผิดปกติ

ข้อมูลการฝึกอบรมประกอบด้วยค่าผิดปกติที่อยู่ไกลจากข้อมูลที่เหลือ ค่าผิดปกติดังกล่าวถูกกำหนดให้เป็นข้อสังเกต นั่นเป็นเหตุผลว่าตัวประมาณค่าการตรวจจับค่าผิดปกติจะพยายามปรับให้พอดีกับพื้นที่ที่มีข้อมูลการฝึกอบรมที่เข้มข้นที่สุดในขณะที่ไม่สนใจการสังเกตที่เบี่ยงเบน เรียกอีกอย่างว่าการตรวจจับความผิดปกติโดยไม่ได้รับการดูแล

การตรวจจับความแปลกใหม่

เกี่ยวข้องกับการตรวจจับรูปแบบที่ไม่สามารถสังเกตได้ในการสังเกตใหม่ซึ่งไม่รวมอยู่ในข้อมูลการฝึกอบรม ที่นี่ข้อมูลการฝึกอบรมไม่ได้รับมลพิษจากค่าผิดปกติ เรียกอีกอย่างหนึ่งว่าการตรวจจับความผิดปกติแบบกึ่งควบคุม

มีชุดเครื่องมือ ML ที่จัดทำโดย scikit-learn ซึ่งสามารถใช้สำหรับการตรวจจับค่าผิดปกติและการตรวจจับสิ่งแปลกใหม่ เครื่องมือเหล่านี้ใช้การเรียนรู้วัตถุจากข้อมูลก่อนโดยไม่ได้รับการดูแลโดยใช้วิธี fit () ดังนี้ -

estimator.fit(X_train)

ตอนนี้ข้อสังเกตใหม่จะถูกจัดเรียงเป็น inliers (labeled 1) หรือ outliers (labeled -1) โดยใช้วิธีการทำนาย () ดังนี้ -

estimator.fit(X_test)

ตัวประมาณจะคำนวณฟังก์ชันการให้คะแนนดิบก่อนจากนั้นวิธีการทำนายจะใช้ประโยชน์จากขีด จำกัด ของฟังก์ชันการให้คะแนนดิบนั้น เราสามารถเข้าถึงฟังก์ชันการให้คะแนนดิบนี้ได้ด้วยความช่วยเหลือของscore_sample วิธีการและสามารถควบคุมเกณฑ์โดย contamination พารามิเตอร์.

เรายังสามารถกำหนด decision_function วิธีการที่กำหนดค่าผิดปกติเป็นค่าลบและค่า inliers เป็นค่าที่ไม่เป็นลบ

estimator.decision_function(X_test)

อัลกอริทึม Sklearn สำหรับการตรวจจับค่าผิดปกติ

ให้เราเริ่มต้นด้วยการทำความเข้าใจว่าซองรูปไข่คืออะไร

ใส่ซองรูปไข่

อัลกอริทึมนี้ถือว่าข้อมูลปกติมาจากการแจกแจงที่ทราบเช่นการแจกแจงแบบเกาส์ สำหรับการตรวจจับค่าผิดปกติ Scikit-learn จะจัดเตรียมวัตถุที่มีชื่อว่าcovariance.EllipticEnvelop.

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

พารามิเตอร์

ตารางต่อไปนี้ประกอบด้วยพารามิเตอร์ที่ใช้โดย sklearn. covariance.EllipticEnvelop วิธีการ -

ซีเนียร์ No พารามิเตอร์และคำอธิบาย
1

store_precision - บูลีนทางเลือกค่าเริ่มต้น = True

เราสามารถระบุได้หากจัดเก็บความแม่นยำโดยประมาณไว้

2

assume_centered - บูลีนเป็นทางเลือกค่าเริ่มต้น = เท็จ

หากเราตั้งค่าเป็นเท็จมันจะคำนวณตำแหน่งที่แข็งแกร่งและความแปรปรวนร่วมโดยตรงด้วยความช่วยเหลือของอัลกอริทึม FastMCD ในทางกลับกันหากตั้งค่าเป็น True ระบบจะคำนวณการรองรับตำแหน่งที่แข็งแกร่งและโควาเรียน

3

support_fraction - ลอยเข้า (0. , 1. ), ทางเลือก, ค่าเริ่มต้น = ไม่มี

พารามิเตอร์นี้บอกวิธีการว่าสัดส่วนของคะแนนที่จะรวมอยู่ในการสนับสนุนของประมาณการ MCD ดิบ

4

contamination - ลอยเข้า (0. , 1. ), ทางเลือก, ค่าเริ่มต้น = 0.1

ให้สัดส่วนของค่าผิดปกติในชุดข้อมูล

5

random_state - int, RandomState instance หรือ None, optional, default = none

พารามิเตอร์นี้แสดงถึงจุดเริ่มต้นของหมายเลขสุ่มหลอกที่สร้างขึ้นซึ่งใช้ในขณะที่สับข้อมูล ตัวเลือกดังต่อไปนี้ -

  • int - ในกรณีนี้ random_state คือเมล็ดพันธุ์ที่ใช้โดยเครื่องสร้างตัวเลขสุ่ม

  • RandomState instance- ในกรณีนี้random_stateคือตัวสร้างตัวเลขสุ่ม

  • None - ในกรณีนี้ตัวสร้างตัวเลขสุ่มคืออินสแตนซ์ RandonState ที่ใช้โดย np.random

คุณลักษณะ

ตารางต่อไปนี้ประกอบด้วยแอตทริบิวต์ที่ใช้โดย sklearn. covariance.EllipticEnvelop วิธีการ -

ซีเนียร์ No คุณสมบัติและคำอธิบาย
1

support_ - คล้ายอาร์เรย์รูปร่าง (n_samples)

ซึ่งแสดงถึงรูปแบบของการสังเกตที่ใช้ในการคำนวณค่าประมาณตำแหน่งและรูปร่างที่มีประสิทธิภาพ

2

location_ - รูปร่างคล้ายอาร์เรย์ (n_features)

จะส่งคืนตำแหน่งที่แข็งแกร่งโดยประมาณ

3

covariance_ - คล้ายอาร์เรย์รูปร่าง (n_features, n_features)

จะส่งคืนเมทริกซ์ความแปรปรวนร่วมที่แข็งแกร่งโดยประมาณ

4

precision_ - คล้ายอาร์เรย์รูปร่าง (n_features, n_features)

จะส่งคืนเมทริกซ์ผกผันหลอกโดยประมาณ

5

offset_ - ลอย

ใช้เพื่อกำหนดฟังก์ชันการตัดสินใจจากคะแนนดิบ decision_function = score_samples -offset_

Implementation Example

import numpy as np^M
from sklearn.covariance import EllipticEnvelope^M
true_cov = np.array([[.5, .6],[.6, .4]])
X = np.random.RandomState(0).multivariate_normal(mean = [0, 0], cov=true_cov,size=500)
cov = EllipticEnvelope(random_state = 0).fit(X)^M
# Now we can use predict method. It will return 1 for an inlier and -1 for an outlier.
cov.predict([[0, 0],[2, 2]])

Output

array([ 1, -1])

ป่าแยก

ในกรณีของชุดข้อมูลที่มีมิติสูงวิธีหนึ่งที่มีประสิทธิภาพสำหรับการตรวจจับค่าผิดปกติคือการใช้ฟอเรสต์แบบสุ่ม scikit-learn ให้ensemble.IsolationForestวิธีการที่แยกการสังเกตโดยการสุ่มเลือกคุณสมบัติ หลังจากนั้นจะสุ่มเลือกค่าระหว่างค่าสูงสุดและต่ำสุดของคุณสมบัติที่เลือก

ในที่นี้จำนวนการแยกที่จำเป็นในการแยกตัวอย่างจะเทียบเท่ากับความยาวเส้นทางจากโหนดรูทไปยังโหนดที่ยุติ

พารามิเตอร์

ตารางต่อไปนี้ประกอบด้วยพารามิเตอร์ที่ใช้โดย sklearn. ensemble.IsolationForest วิธีการ -

ซีเนียร์ No พารามิเตอร์และคำอธิบาย
1

n_estimators - int ทางเลือกค่าเริ่มต้น = 100

แสดงถึงจำนวนตัวประมาณฐานในชุด

2

max_samples - int หรือ float เป็นทางเลือกค่าเริ่มต้น = "auto"

แสดงจำนวนตัวอย่างที่จะดึงจาก X เพื่อฝึกตัวประมาณค่าฐานแต่ละตัว ถ้าเราเลือก int เป็นค่ามันจะดึงตัวอย่าง max_samples ถ้าเราเลือก float เป็นค่ามันจะดึง max_samples ∗ .shape [0] ตัวอย่าง และถ้าเราเลือก auto เป็นค่ามันจะวาด max_samples = min (256, n_samples)

3

support_fraction - ลอยเข้า (0. , 1. ), ทางเลือก, ค่าเริ่มต้น = ไม่มี

พารามิเตอร์นี้บอกวิธีการว่าสัดส่วนของคะแนนที่จะรวมอยู่ในการสนับสนุนของประมาณการ MCD ดิบ

4

contamination - อัตโนมัติหรือลอยตัวเลือกเริ่มต้น = อัตโนมัติ

ให้สัดส่วนของค่าผิดปกติในชุดข้อมูล ถ้าเราตั้งเป็นค่าเริ่มต้นคือ auto มันจะกำหนดเกณฑ์เหมือนในกระดาษต้นฉบับ หากตั้งค่าให้ลอยช่วงของการปนเปื้อนจะอยู่ในช่วง [0,0.5]

5

random_state - int, RandomState instance หรือ None, optional, default = none

พารามิเตอร์นี้แสดงถึงจุดเริ่มต้นของหมายเลขสุ่มหลอกที่สร้างขึ้นซึ่งใช้ในขณะที่สับข้อมูล ตัวเลือกดังต่อไปนี้ -

  • int - ในกรณีนี้ random_state คือเมล็ดพันธุ์ที่ใช้โดยเครื่องสร้างตัวเลขสุ่ม

  • RandomState instance- ในกรณีนี้random_stateคือตัวสร้างตัวเลขสุ่ม

  • None - ในกรณีนี้ตัวสร้างตัวเลขสุ่มคืออินสแตนซ์ RandonState ที่ใช้โดย np.random

6

max_features - int หรือ float เป็นทางเลือก (ค่าเริ่มต้น = 1.0)

แสดงถึงจำนวนคุณลักษณะที่จะดึงมาจาก X เพื่อฝึกตัวประมาณค่าฐานแต่ละตัว ถ้าเราเลือก int เป็นค่ามันจะดึงคุณสมบัติ max_features ถ้าเราเลือก float เป็นค่ามันจะดึง max_features * X.shape [] ตัวอย่าง

7

bootstrap - บูลีนเป็นทางเลือก (ค่าเริ่มต้น = เท็จ)

ตัวเลือกเริ่มต้นคือ False ซึ่งหมายความว่าการสุ่มตัวอย่างจะดำเนินการโดยไม่มีการแทนที่ และในทางกลับกันหากตั้งค่าเป็น True หมายความว่าต้นไม้แต่ละต้นจะพอดีกับชุดย่อยแบบสุ่มของข้อมูลการฝึกอบรมที่สุ่มตัวอย่างด้วยการแทนที่

8

n_jobs - int หรือไม่มีทางเลือก (ค่าเริ่มต้น = ไม่มี)

แสดงถึงจำนวนงานที่จะรันแบบขนาน fit() และ predict() วิธีการทั้งสอง

9

verbose - int เป็นทางเลือก (ค่าเริ่มต้น = 0)

พารามิเตอร์นี้ควบคุมความละเอียดของกระบวนการสร้างต้นไม้

10

warm_start - บูลเป็นทางเลือก (ค่าเริ่มต้น = เท็จ)

ถ้า warm_start = true เราสามารถใช้วิธีแก้ปัญหาการโทรก่อนหน้านี้ซ้ำเพื่อให้เหมาะสมและสามารถเพิ่มตัวประมาณค่าเพิ่มเติมให้กับชุดได้ แต่ถ้าตั้งค่าเป็นเท็จเราจำเป็นต้องพอดีกับฟอเรสต์ใหม่ทั้งหมด

คุณลักษณะ

ตารางต่อไปนี้ประกอบด้วยแอตทริบิวต์ที่ใช้โดย sklearn. ensemble.IsolationForest วิธีการ -

ซีเนียร์ No คุณสมบัติและคำอธิบาย
1

estimators_ - รายการ DecisionTreeClassifier

ให้การรวบรวมตัวประมาณค่าย่อยที่ติดตั้งทั้งหมด

2

max_samples_ - จำนวนเต็ม

ให้จำนวนตัวอย่างจริงที่ใช้

3

offset_ - ลอย

ใช้เพื่อกำหนดฟังก์ชันการตัดสินใจจากคะแนนดิบ decision_function = score_samples -offset_

Implementation Example

สคริปต์ Python ด้านล่างจะใช้ sklearn. ensemble.IsolationForest วิธีการใส่ต้นไม้ 10 ต้นในข้อมูลที่กำหนด

from sklearn.ensemble import IsolationForest
import numpy as np
X = np.array([[-1, -2], [-3, -3], [-3, -4], [0, 0], [-50, 60]])
OUTDClf = IsolationForest(n_estimators = 10)
OUTDclf.fit(X)

Output

IsolationForest(
   behaviour = 'old', bootstrap = False, contamination='legacy',
   max_features = 1.0, max_samples = 'auto', n_estimators = 10, n_jobs=None,
   random_state = None, verbose = 0
)

ปัจจัยภายนอกในท้องถิ่น

อัลกอริทึม Local Outlier Factor (LOF) เป็นอีกหนึ่งอัลกอริทึมที่มีประสิทธิภาพในการตรวจจับค่าผิดปกติในข้อมูลขนาดสูง scikit-learn ให้neighbors.LocalOutlierFactorวิธีการคำนวณคะแนนที่เรียกว่าปัจจัยผิดปกติในท้องถิ่นซึ่งสะท้อนถึงระดับความผิดปกติของข้อสังเกต ตรรกะหลักของอัลกอริทึมนี้คือการตรวจจับตัวอย่างที่มีความหนาแน่นต่ำกว่าเพื่อนบ้านอย่างมาก นั่นเป็นเหตุผลที่วัดค่าเบี่ยงเบนความหนาแน่นในพื้นที่ของจุดข้อมูลที่ระบุเขียนเพื่อนบ้าน

พารามิเตอร์

ตารางต่อไปนี้ประกอบด้วยพารามิเตอร์ที่ใช้โดย sklearn. neighbors.LocalOutlierFactor วิธี

ซีเนียร์ No พารามิเตอร์และคำอธิบาย
1

n_neighbors - int, ทางเลือก, ค่าเริ่มต้น = 20

แสดงถึงจำนวนเพื่อนบ้านที่ใช้โดยค่าเริ่มต้นสำหรับการสอบถามคุกเข่า ตัวอย่างทั้งหมดจะถูกใช้ถ้า

2

algorithm - ไม่จำเป็น

อัลกอริทึมใดที่จะใช้ในการคำนวณเพื่อนบ้านที่ใกล้ที่สุด

  • หากคุณเลือก ball_tree จะใช้อัลกอริทึม BallTree

  • หากคุณเลือก kd_tree จะใช้อัลกอริทึม KDTree

  • หากคุณเลือกเดรัจฉานมันจะใช้อัลกอริทึมการค้นหาแบบ brute-force

  • หากคุณเลือกอัตโนมัติระบบจะตัดสินอัลกอริทึมที่เหมาะสมที่สุดโดยพิจารณาจากค่าที่เราส่งให้พอดีกับ () วิธีการ

3

leaf_size - int, ทางเลือก, ค่าเริ่มต้น = 30

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

4

contamination - อัตโนมัติหรือลอยตัวเลือกเริ่มต้น = อัตโนมัติ

ให้สัดส่วนของค่าผิดปกติในชุดข้อมูล ถ้าเราตั้งเป็นค่าเริ่มต้นคือ auto มันจะกำหนดเกณฑ์เหมือนในกระดาษต้นฉบับ หากตั้งค่าให้ลอยช่วงของการปนเปื้อนจะอยู่ในช่วง [0,0.5]

5

metric - สตริงหรือโทรได้ค่าเริ่มต้น

แสดงถึงเมตริกที่ใช้สำหรับการคำนวณระยะทาง

6

P - int เป็นทางเลือก (ค่าเริ่มต้น = 2)

เป็นพารามิเตอร์สำหรับเมตริก Minkowski P = 1 เทียบเท่ากับการใช้ manhattan_distance เช่น L1 ในขณะที่ P = 2 เทียบเท่ากับการใช้ euclidean_distance เช่น L2

7

novelty - บูลีน (ค่าเริ่มต้น = เท็จ)

โดยค่าเริ่มต้นอัลกอริทึม LOF จะใช้สำหรับการตรวจจับค่าผิดปกติ แต่สามารถใช้สำหรับการตรวจจับความแปลกใหม่ได้หากเราตั้งค่าความแปลกใหม่ = จริง

8

n_jobs - int หรือไม่มีทางเลือก (ค่าเริ่มต้น = ไม่มี)

หมายถึงจำนวนงานที่จะรันแบบขนานสำหรับวิธี fit () และ Predict () ทั้งคู่

คุณลักษณะ

ตารางต่อไปนี้ประกอบด้วยแอตทริบิวต์ที่ใช้โดย sklearn.neighbors.LocalOutlierFactor วิธีการ -

ซีเนียร์ No คุณสมบัติและคำอธิบาย
1

negative_outlier_factor_ - อาร์เรย์ numpy รูปร่าง (n_samples)

ให้ LOF ตรงข้ามกับตัวอย่างการฝึกอบรม

2

n_neighbors_ - จำนวนเต็ม

ให้จำนวนเพื่อนบ้านที่แท้จริงที่ใช้สำหรับข้อความค้นหาเพื่อนบ้าน

3

offset_ - ลอย

ใช้เพื่อกำหนดป้ายกำกับไบนารีจากคะแนนดิบ

Implementation Example

สคริปต์ Python ที่ระบุด้านล่างจะใช้ sklearn.neighbors.LocalOutlierFactor วิธีการสร้างคลาส NeighboursClassifier จากอาร์เรย์ใด ๆ ที่สอดคล้องกับชุดข้อมูลของเรา

from sklearn.neighbors import NearestNeighbors
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
LOFneigh = NearestNeighbors(n_neighbors = 1, algorithm = "ball_tree",p=1)
LOFneigh.fit(samples)

Output

NearestNeighbors(
   algorithm = 'ball_tree', leaf_size = 30, metric='minkowski',
   metric_params = None, n_jobs = None, n_neighbors = 1, p = 1, radius = 1.0
)

Example

ตอนนี้เราสามารถถามได้จากลักษณนามที่สร้างขึ้นนี้คือตู้เสื้อผ้าชี้ไปที่ [0.5, 1. , 1.5] โดยใช้สคริปต์ python ต่อไปนี้ -

print(neigh.kneighbors([[.5, 1., 1.5]])

Output

(array([[1.7]]), array([[1]], dtype = int64))

SVM ชั้นเดียว

One-Class SVM ซึ่งแนะนำโดยSchölkopf et al. คือการตรวจจับ Outlier ที่ไม่ได้รับการดูแล นอกจากนี้ยังมีประสิทธิภาพมากในข้อมูลมิติสูงและประมาณการรองรับการกระจายมิติสูง มันถูกนำไปใช้ในSupport Vector Machines โมดูลใน Sklearn.svm.OneClassSVMวัตถุ. สำหรับการกำหนดฟรอนเทียร์ต้องใช้เคอร์เนล (ส่วนใหญ่ใช้คือ RBF) และพารามิเตอร์สเกลาร์

เพื่อความเข้าใจที่ดีขึ้นให้พอดีกับข้อมูลของเราด้วย svm.OneClassSVM วัตถุ -

ตัวอย่าง

from sklearn.svm import OneClassSVM
X = [[0], [0.89], [0.90], [0.91], [1]]
OSVMclf = OneClassSVM(gamma = 'scale').fit(X)

ตอนนี้เราสามารถรับ score_samples สำหรับข้อมูลอินพุตได้ดังนี้ -

OSVMclf.score_samples(X)

เอาต์พุต

array([1.12218594, 1.58645126, 1.58673086, 1.58645127, 1.55713767])