Là phần tiếp theo của bài viết dành cho người mới bắt đầu về phân tích ngoại lệ [liên kết], chúng ta sẽ thảo luận về một số kỹ thuật giúp phát hiện các ngoại lệ trong dữ liệu. Các ngoại lệ có thể là một tính năng cụ thể hoặc một phiên bản có nhiều thuộc tính có thể là một ngoại lệ [bất thường] nói chung
Hãy xem xét bộ dữ liệu Tín dụng nổi tiếng của Đức với mục đích tìm hiểu hoạt động của các phương pháp mà chúng ta sẽ thảo luận để phát hiện các ngoại lệ đơn biến và đa biến
Ở đây, chúng tôi đã lấy một tập hợp con chỉ có các cột số chỉ vì mục đích đơn giản
Phương pháp phát hiện ngoại lệ đơn biến
Phần 1 của bài viết này tập trung vào các phương pháp phát hiện ngoại lệ đơn biến được sử dụng thường xuyên trong Python
1. Biểu đồ IQR và Box-and-Whisker
Một phương pháp mạnh mẽ để ghi nhãn các ngoại lệ là phương pháp IQR [Phạm vi tứ phân vị] được phát triển bởi John Tukey, người tiên phong trong phân tích dữ liệu khám phá. Biểu đồ Box-and-Whiskers sử dụng các phần tư để vẽ hình dạng của một biến. Phạm vi liên vùng là phạm vi giữa phần tư thứ nhất và phần tư thứ ba [các cạnh của hộp]. Bất kỳ điểm dữ liệu nào nằm ngoài 1. 5 lần IQR dưới phần tư đầu tiên hoặc 1. 5 lần IQR trên phần tư thứ ba được coi là ngoại lệ
Hộp đại diện cho phần tư thứ 1 và thứ 3, tương đương với phần trăm thứ 25 và 75. Dòng bên trong hộp đại diện cho phần tư thứ 2, là trung vị
Nếu IQR = quartile_3 — quartile_1, thì giá trị thấp hơn là 'quartile_1 — [1. 5 lần IQR]’ và cận trên là ‘quartile_3 + [1. 5 lần IQR]'. Vì vậy, bất kỳ giá trị nào bên dưới giới hạn dưới và trên giới hạn trên đều được coi là ngoại lệ
Mã trong python để lấy các chỉ số của các ngoại lệ có thể có trong tính năng Credit_Amount
2. Sử dụng độ lệch chuẩn Quy tắc phân phối chuẩn
Một hạn chế của phương pháp này là nó chỉ có thể được sử dụng khi dữ liệu 'không' bị sai lệch nhiều. Nó yêu cầu dữ liệu phải gần với bình thường
Như trong hình trên, nếu dữ liệu được phân phối bình thường, 99. 7% giá trị của dữ liệu phải nằm giữa +/- 3 độ lệch chuẩn và 95. 4% giá trị nằm trong khoảng +/-2 độ lệch chuẩn của dữ liệu. Vì vậy, chúng tôi có thể coi bất kỳ điểm dữ liệu nào cách xa +/- 2 hoặc 3 độ lệch chuẩn là ngoại lệ
Điều này có thể đạt được bằng cách tính điểm tiêu chuẩn hoặc điểm z của các điểm dữ liệu. Wikipedia tuyên bố điểm z là
Điểm chuẩn hoặc điểm z là số độ lệch chuẩn đã ký theo đó giá trị của một điểm quan sát hoặc điểm dữ liệu cao hơn giá trị trung bình của những gì đang được quan sát hoặc đo lường
Chúng tôi tính điểm z bằng cách trừ giá trị trung bình của tất cả các giá trị dữ liệu từ một điểm dữ liệu và chia cho độ lệch chuẩn. Thay vì sử dụng 'hàm zscore của scipy', hãy xác định một hàm tương tự và sau đó chúng ta thêm một ngưỡng để đưa ra các chỉ số của các điểm dữ liệu ngoại lệ
Thực hiện trong python
Chúng tôi thấy rằng một vài điểm tại các chỉ số 63,105, 236, v.v. thường được phát hiện là ngoại lệ bởi cả hai phương pháp
Chúng tôi có thể sử dụng nhiều phương pháp và xử lý các ngoại lệ thường được xác định. Ngoại lệ có thể được cố định bằng cách
- Giới hạn ở giá trị tối đa ở râu
- Thay thế bằng một miền giá trị thích hợp cho biến
- Trước tiên, thay thế các giá trị ngoại lệ bằng các giá trị null và sử dụng các phương thức gán giá trị còn thiếu. Một cách tiếp cận tốt hơn nhiều có thể là sử dụng mô hình cây quyết định với tính năng có ngoại lệ làm biến mục tiêu. Điều này được khuyến nghị khi một tập hợp con lớn của dữ liệu là ngoại lệ và nếu những bản ghi này không thể bị xóa hoặc gán giá trị trung bình hoặc giá trị trung bình
- Xóa bản ghi- Tuy nhiên, việc xóa toàn bộ bản ghi khách hàng chỉ vì 'Số tiền_tín dụng' của khách hàng được xác định là ngoại lệ không phải là một việc làm khôn ngoan
Phương pháp phát hiện ngoại lệ đa biến
- Sử dụng khoảng cách Mahalanobis
- Phương pháp phân cụm DBScan
- Rừng cách ly
Những phương pháp này có nhiều ứng dụng thực tế và sẽ được thảo luận chi tiết trong blog tiếp theo. Chúng ta sẽ xem cách thức và liệu từng trường hợp [ở đây là khách hàng] có thể được gắn thẻ là ngoại lệ hay không, bằng cách sử dụng ba phương pháp trên
Như đã đề cập, Hệ mét Euclide không tìm được khoảng cách chính xác vì nó cố lấy khoảng cách đường thẳng thông thường. Do đó, nếu chúng ta có không gian đa chiều của các biến, hai điểm có thể có cùng khoảng cách với Giá trị trung bình, nhưng một trong số chúng cách xa đám mây dữ liệu [i. e. đó là một ngoại lệ]
Giải pháp là Khoảng cách Mahalanobis tạo ra thứ gì đó tương tự như tính năng chia tỷ lệ thông qua việc lấy các vectơ riêng của các biến thay vì trục ban đầu
Nó áp dụng công thức sau
ở đâu
x
là quan sát để tìm khoảng cách của nó;
0 là giá trị trung bình của các quan sát;inv_covariance_matrix = np.linalg.inv[covariance_matrix]
1 là Ma trận hiệp phương saiinv_covariance_matrix = np.linalg.inv[covariance_matrix]
bồi dưỡng
Hiệp phương sai thể hiện hướng của mối quan hệ giữa hai biến [i. e. dương, âm hoặc bằng không], vì vậy nó cho thấy sức mạnh của cách một biến có liên quan đến sự thay đổi của các biến khác
Thực hiện
Hãy xem xét tập dữ liệu 6x3 này, trong đó mỗi hàng đại diện cho một mẫu và mỗi cột đại diện cho một tính năng của mẫu đã cho
Trước tiên, chúng tôi cần tạo Ma trận hiệp phương sai của các đặc điểm của từng mẫu và đó là lý do tại sao chúng tôi đặt tham số
inv_covariance_matrix = np.linalg.inv[covariance_matrix]
2 thành inv_covariance_matrix = np.linalg.inv[covariance_matrix]
3 trong numpy. cov, vì vậy mỗi cột hiện đại diện cho một biếncovariance_matrix = np.cov[data, rowvar=False]
# data here looks similar to the above table
# in the picture
Tiếp theo, chúng ta tìm Nghịch đảo của Ma trận hiệp phương sai
inv_covariance_matrix = np.linalg.inv[covariance_matrix]
Nhưng trước khi tiếp tục, chúng ta nên kiểm tra, như đã đề cập ở trên, nếu ma trận và ma trận nghịch đảo của nó là Đối xứng và Xác định Dương. Chúng tôi sử dụng cho Thuật toán phân tách Cholesky này, may mắn thay, thuật toán này đã được triển khai trong numpy. linalg. nghẹn ngào
def is_pos_def[A]:
if np.allclose[A, A.T]:
try:
np.linalg.cholesky[A]
return True
except np.linalg.LinAlgError:
return False
else:
return False
Sau đó, chúng tôi tìm giá trị trung bình _______0_______0 của các biến trên mỗi tính năng [tôi sẽ nói thứ nguyên] và lưu chúng vào một mảng như thế này
________số 8_______Lưu ý rằng tôi đã lặp lại từng hàng chỉ để tận dụng phép trừ ma trận như sẽ được hiển thị tiếp theo
Tiếp theo, chúng tôi tìm thấy
inv_covariance_matrix = np.linalg.inv[covariance_matrix]
5 [i. e. vi phân], nhưng vì chúng ta đã có inv_covariance_matrix = np.linalg.inv[covariance_matrix]
6 được véc tơ hóa, nên tất cả những gì chúng ta cần làm làdiff = data - vars_mean
# here we subtract the mean of feature
# from each feature of each example
Cuối cùng, áp dụng công thức như thế này
md = []
for i in range[len[diff]]:
md.append[np.sqrt[diff[i].dot[inv_covariance_matrix].dot[diff[i]]]]
Lưu ý những điều sau
- Thứ nguyên của nghịch đảo của ma trận hiệp phương sai là.
7inv_covariance_matrix = np.linalg.inv[covariance_matrix]
- Kích thước của ma trận
8 tương tự như ma trận dữ liệu gốc.inv_covariance_matrix = np.linalg.inv[covariance_matrix]
9inv_covariance_matrix = np.linalg.inv[covariance_matrix]
- Như vậy, mỗi
0 [i. e. hàng] làdef is_pos_def[A]: if np.allclose[A, A.T]: try: np.linalg.cholesky[A] return True except np.linalg.LinAlgError: return False else: return False
1def is_pos_def[A]: if np.allclose[A, A.T]: try: np.linalg.cholesky[A] return True except np.linalg.LinAlgError: return False else: return False
- Vậy theo quy tắc Nhân ma trận, ma trận kết quả từ
2 sẽ làdef is_pos_def[A]: if np.allclose[A, A.T]: try: np.linalg.cholesky[A] return True except np.linalg.LinAlgError: return False else: return False
1; . e.def is_pos_def[A]: if np.allclose[A, A.T]: try: np.linalg.cholesky[A] return True except np.linalg.LinAlgError: return False else: return False
6]; . e. không cần chuyển vị]def is_pos_def[A]: if np.allclose[A, A.T]: try: np.linalg.cholesky[A] return True except np.linalg.LinAlgError: return False else: return False
Để phát hiện các ngoại lệ, chúng ta nên chỉ định một
def is_pos_def[A]:
if np.allclose[A, A.T]:
try:
np.linalg.cholesky[A]
return True
except np.linalg.LinAlgError:
return False
else:
return False
7; . 1, sau đó chúng ta có thể sử dụng chi2. phương pháp cdf từ def is_pos_def[A]:
if np.allclose[A, A.T]:
try:
np.linalg.cholesky[A]
return True
except np.linalg.LinAlgError:
return False
else:
return False
8, như thế này1 - chi2.cdf[square_of_mahalanobis_distances, degree_of_freedom]
Vì vậy, bất kỳ điểm nào có [1 - CDF chi bình phương] nhỏ hơn hoặc bằng ngưỡng, đều có thể được phân loại là ngoại lệ