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