import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from keras.layers import Input, Dense
from keras.models import Model
# Load the German Credit Data (you can download it from the source)
= "https://archive.ics.uci.edu/ml/machine-learning-databases/statlog/german/german.data"
data_url = ['existing_checking', 'duration', 'credit_history', 'purpose', 'credit_amount', 'savings',
column_names 'employment', 'installment_rate', 'personal_status', 'other_debtors', 'residence_since',
'property', 'age', 'other_installment_plans', 'housing', 'existing_credits', 'job', 'people_liable',
'telephone', 'foreign_worker', 'class']
= pd.read_csv(data_url, delimiter=' ', names=column_names)
data
# Convert categorical columns to one-hot encoding
= ['existing_checking', 'credit_history', 'purpose', 'savings', 'employment',
categorical_columns 'personal_status', 'other_debtors', 'property', 'other_installment_plans',
'housing', 'job', 'telephone', 'foreign_worker']
= pd.get_dummies(data, columns=categorical_columns, drop_first=True)
data
# Split the data into features and labels
= data.drop('class', axis=1).values
X = data['class'].values y
Autoencoders - anomaly detection
Autoencoders
Bộ mã hóa tự động (Autoencoders) là một loại kiến trúc mạng thần kinh thường được sử dụng cho nhiều tác vụ khác nhau, bao gồm cả phát hiện sự bất thường. Chúng đặc biệt hiệu quả trong việc phát hiện sự bất thường không có giám sát, trong đó mô hình học cách tái tạo lại dữ liệu thông thường và xác định các điểm bất thường là các điểm dữ liệu sai lệch đáng kể so với phiên bản được xây dựng lại.
Sau đây là cách bộ mã hóa tự động hoạt động để phát hiện sự bất thường:
Kiến trúc: Bộ mã hóa tự động bao gồm bộ mã hóa và bộ giải mã (encoder - decoder). Bộ mã hóa nén dữ liệu đầu vào thành biểu diễn có chiều thấp hơn và bộ giải mã cố gắng tái tạo lại dữ liệu đầu vào ban đầu từ biểu diễn này.
Encoder: Nén đầu vào thành một biểu diễn không gian ẩn. Lớp mã hóa mã hóa hình ảnh đầu vào dưới dạng biểu diễn nén ở kích thước giảm; bây giờ, ảnh nén trông giống ảnh gốc nhưng không giống ảnh gốc.
Decoder: Bộ giải mã giải mã hình ảnh được mã hóa trở lại hình ảnh gốc có cùng kích thước. Bộ giải mã đưa dữ liệu từ không gian ẩn thấp hơn đến giai đoạn tái tạo, trong đó kích thước của đầu ra được giải mã bằng đầu ra X ban đầu. Nhưng nếu chúng ta xem nó là nén Ảnh thì sẽ có nén không mất dữ liệu, nhưng trong trường hợp Autoencoders, thông tin bị mất do nó nén và giải nén đầu vào. Khi giải nén, nó cố gắng đạt gần đầu vào, nhưng đầu ra không hoàn toàn giống ban đầu.
Không gian ẩn (Latent Space): Giảm số chiều của dữ liệu thấp hơn do bộ mã hóa tạo ra (thường được gọi là không gian ẩn hay nén dữ liệu). Ví dụ số chiều dữ liệu ban đầu là 10x10x1 sau khi giảm chiều hoặc nén lại còn 5x1 (kích thước latent space còn 5x1). Bây giờ, mỗi điểm dữ liệu 10x10x1 chỉ được xác định bởi 5 số
Lỗi tái tạo (Reconstruction Error): Do quá trình nén (giảm chiều) rồi tái tạo về số chiều ban đầu làm cho thông tin đầu vào và đầu ra bị khác nhau. Sai khác này được gọi là Lỗi tái tạo (Reconstruction Error). Các điểm bất thường được phát hiện dựa trên lỗi tái tạo của chúng. Với những điểm bất thường, lỗi tái tạo thường cao hơn nhiều so với dữ liệu thông thường.
Đào tạo: Bộ mã hóa tự động thường được đào tạo trên tập dữ liệu chỉ chứa dữ liệu thông thường. Mục tiêu là giảm thiểu lỗi tái tạo, nghĩa là bộ mã hóa tự động sẽ có thể tái tạo lại dữ liệu bình thường một cách chính xác trong khi gặp khó khăn trong việc tái tạo lại các điểm bất thường.
Ngưỡng: Việc phát hiện bất thường bằng bộ mã hóa tự động thường liên quan đến việc đặt ngưỡng cho lỗi tái tạo. Điểm dữ liệu có lỗi tái tạo vượt quá ngưỡng được coi là bất thường.
Bộ mã hóa tự động có một số lợi thế để phát hiện sự bất thường:
- Chúng có thể nắm bắt các mẫu phức tạp trong dữ liệu, khiến chúng phù hợp với dữ liệu nhiều chiều.
- Chúng không được giám sát nên không yêu cầu dữ liệu bất thường được dán nhãn để huấn luyện.
- Chúng có khả năng thích ứng với các loại dữ liệu khác nhau, bao gồm dữ liệu số và hình ảnh.
So sánh Autoencoders với PCA (Phân tích thành phần chính) và Isolation Forest trong phát hiện bất thường:
- Autoencoders:
- Thuận lợi:
- Có thể nắm bắt các mẫu phức tạp, phi tuyến trong dữ liệu.
- Thích hợp cho dữ liệu nhiều chiều.
- Có thể tinh chỉnh cho các nhiệm vụ cụ thể.
- Nhược điểm:
- Yêu cầu nhiều dữ liệu và thời gian huấn luyện hơn so với PCA.
- Có thể cần phải điều chỉnh siêu tham số.
- Có thể bị overfit nếu không được điều chỉnh đúng cách.
- Thuận lợi:
- PCA:
- Thuận lợi:
- Đơn giản và hiệu quả tính toán.
- Hữu ích cho việc giảm kích thước và trực quan hóa.
- Cung cấp các tính năng trực giao, có thể nắm bắt một số mẫu.
- Nhược điểm:
- Phương pháp tuyến tính; có thể không nắm bắt được các mẫu phức tạp, phi tuyến.
- Giả sử dữ liệu được phân phối Gaussian.
- Không có tiêu chí cụ thể về dị thường; dựa vào các thuộc tính thống kê.
- Thuận lợi:
- Isolation Forest:
- Thuận lợi:
- Được thiết kế riêng cho mục đích phát hiện sự bất thường.
- Hoạt động tốt với cả dữ liệu có nhiều chiều và ít chiều.
- Có thể xử lý các kiểu dữ liệu hỗn hợp (số và phân loại).
- Nhược điểm:
- Dễ bị overfitting trên các tập dữ liệu nhỏ.
- Có thể yêu cầu tinh chỉnh các siêu tham số.
- Không giải thích được tại sao trường hợp cụ thể lại bất thường
- Thuận lợi:
Các yếu tố so sánh cần xem xét khi lựa chọn phương pháp cho nhiệm vụ phát hiện dấu vết bất thường của bạn:
Tính phức tạp của Dữ liệu: Autoencoders phù hợp cho dữ liệu phức tạp, phi tuyến tính, trong khi PCA và Isolation Forest thích hợp cho dữ liệu đơn giản, tuyến tính hơn.
Số chiều: Nếu làm việc với dữ liệu có số chiều cao, autoencoders và PCA có thể hữu ích hơn. PCA đặc biệt tốt cho việc giảm chiều dữ liệu.
Khả năng diễn giải: PCA cung cấp biến đổi đặc trưng và điểm số thành phần có thể diễn giải. Autoencoders và Isolation Forest không cung cấp điều này theo cách tự nhiên.
Tính toán: PCA hiệu quả tính toán nhất, theo sau là Isolation Forest. Autoencoders yêu cầu nhiều tài nguyên tính toán hơn cho quá trình đào tạo.
Kích thước Dữ liệu: Isolation Forest có thể gây overfitting trên tập dữ liệu nhỏ hơn. Autoencoders và PCA có thể mạnh mẽ hơn đối với tập dữ liệu nhỏ.
Loại đặc trưng: Nếu dữ liệu của bạn bao gồm cả số và phân loại, Isolation Forest phù hợp hơn vì nó có thể xử lý cả hai loại dữ liệu. Autoencoders và PCA thường được sử dụng cho dữ liệu số.
Sự có sẵn của Dữ liệu Đào tạo: Autoencoders yêu cầu nhiều dữ liệu đào tạo hơn so với Isolation Forest và PCA, có thể xử lý các tập dữ liệu nhỏ hơn.
Tinh chỉnh siêu tham số: Tất cả các phương pháp có thể yêu cầu một mức độ tinh chỉnh siêu tham số, nhưng autoencoders có thể yêu cầu nhiều hơn.
Mục đích Sử dụng: Xem xét yêu cầu cụ thể và tính chất của vấn đề phát hiện dấu vết bất thường của bạn. Mỗi phương pháp có thể hoạt động tố
# Standardize the features
= StandardScaler()
scaler = scaler.fit_transform(X)
X
# Define and train the autoencoder model
= X.shape[1]
input_dim = 10 # Number of neurons in the encoding layer
encoding_dim
= Input(shape=(input_dim,))
input_layer = Dense(encoding_dim, activation='relu')(input_layer)
encoded = Dense(input_dim, activation='linear')(encoded)
decoded = Model(input_layer, decoded)
autoencoder compile(optimizer='adam', loss='mean_squared_error')
autoencoder.
=50, batch_size=64, shuffle=True)
autoencoder.fit(X, X, epochs
# Evaluate the autoencoder model on the entire dataset
= np.mean(np.square(X - autoencoder.predict(X)), axis=1)
reconstruction_errors
# Set a threshold for anomalies
= np.percentile(reconstruction_errors, 95) # Example threshold (adjust as needed)
threshold
# Detect anomalies for the entire dataset
= reconstruction_errors > threshold
anomalies_detected
# Print the number of anomalies detected
print(f'Anomalies detected: {np.sum(anomalies_detected)} out of {len(X)}')
Epoch 1/50
16/16 [==============================] - 0s 2ms/step - loss: 1.1801
Epoch 2/50
16/16 [==============================] - 0s 1ms/step - loss: 1.1139
Epoch 3/50
16/16 [==============================] - 0s 1ms/step - loss: 1.0666
Epoch 4/50
16/16 [==============================] - 0s 2ms/step - loss: 1.0310
Epoch 5/50
16/16 [==============================] - 0s 1ms/step - loss: 1.0032
Epoch 6/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9797
Epoch 7/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9594
Epoch 8/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9411
Epoch 9/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9241
Epoch 10/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9077
Epoch 11/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8921
Epoch 12/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8774
Epoch 13/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8631
Epoch 14/50
16/16 [==============================] - 0s 3ms/step - loss: 0.8497
Epoch 15/50
16/16 [==============================] - 0s 2ms/step - loss: 0.8370
Epoch 16/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8249
Epoch 17/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8138
Epoch 18/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8033
Epoch 19/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7934
Epoch 20/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7843
Epoch 21/50
16/16 [==============================] - 0s 2ms/step - loss: 0.7759
Epoch 22/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7681
Epoch 23/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7609
Epoch 24/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7544
Epoch 25/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7483
Epoch 26/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7425
Epoch 27/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7373
Epoch 28/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7322
Epoch 29/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7277
Epoch 30/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7234
Epoch 31/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7193
Epoch 32/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7154
Epoch 33/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7118
Epoch 34/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7082
Epoch 35/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7049
Epoch 36/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7017
Epoch 37/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6988
Epoch 38/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6958
Epoch 39/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6931
Epoch 40/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6904
Epoch 41/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6878
Epoch 42/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6853
Epoch 43/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6828
Epoch 44/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6804
Epoch 45/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6781
Epoch 46/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6758
Epoch 47/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6737
Epoch 48/50
16/16 [==============================] - 0s 2ms/step - loss: 0.6716
Epoch 49/50
16/16 [==============================] - 0s 2ms/step - loss: 0.6697
Epoch 50/50
16/16 [==============================] - 0s 10ms/step - loss: 0.6675
32/32 [==============================] - 0s 936us/step
Anomalies detected: 50 out of 1000
# Select the rows of data that are anomalies
= data[anomalies_detected]
anomalous_data anomalous_data
duration | credit_amount | installment_rate | residence_since | age | existing_credits | people_liable | class | existing_checking_A12 | existing_checking_A13 | ... | property_A124 | other_installment_plans_A142 | other_installment_plans_A143 | housing_A152 | housing_A153 | job_A172 | job_A173 | job_A174 | telephone_A192 | foreign_worker_A202 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
38 | 10 | 1225 | 2 | 2 | 37 | 1 | 1 | 1 | 0 | 1 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
42 | 18 | 6204 | 2 | 4 | 44 | 1 | 2 | 1 | 1 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
65 | 27 | 5190 | 4 | 4 | 48 | 4 | 2 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
72 | 8 | 1164 | 3 | 4 | 51 | 2 | 2 | 1 | 0 | 0 | ... | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
83 | 24 | 1755 | 4 | 4 | 58 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
105 | 24 | 11938 | 2 | 3 | 39 | 2 | 2 | 2 | 1 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
156 | 9 | 1288 | 3 | 4 | 48 | 2 | 2 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
157 | 12 | 339 | 4 | 1 | 45 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
162 | 15 | 1262 | 4 | 3 | 36 | 2 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
203 | 12 | 902 | 4 | 4 | 21 | 1 | 1 | 2 | 0 | 0 | ... | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
207 | 12 | 1424 | 4 | 3 | 26 | 1 | 1 | 1 | 1 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
209 | 12 | 1413 | 3 | 2 | 55 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
215 | 6 | 932 | 1 | 3 | 39 | 2 | 1 | 1 | 1 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
226 | 48 | 10961 | 1 | 2 | 27 | 2 | 1 | 2 | 1 | 0 | ... | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
244 | 12 | 3447 | 4 | 3 | 35 | 1 | 2 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
274 | 30 | 11998 | 1 | 1 | 34 | 1 | 1 | 2 | 0 | 0 | ... | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
287 | 48 | 7582 | 2 | 4 | 31 | 1 | 1 | 1 | 1 | 0 | ... | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
310 | 48 | 5381 | 3 | 4 | 40 | 1 | 1 | 1 | 1 | 0 | ... | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
337 | 15 | 1275 | 4 | 2 | 24 | 1 | 1 | 2 | 0 | 0 | ... | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
350 | 9 | 1236 | 1 | 4 | 23 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
374 | 60 | 14782 | 3 | 4 | 60 | 2 | 1 | 2 | 1 | 0 | ... | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 |
429 | 18 | 1190 | 2 | 4 | 55 | 3 | 2 | 2 | 0 | 0 | ... | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
431 | 24 | 11328 | 2 | 3 | 29 | 2 | 1 | 2 | 1 | 0 | ... | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
436 | 6 | 660 | 2 | 4 | 23 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
438 | 42 | 3394 | 4 | 4 | 65 | 2 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
442 | 20 | 2629 | 2 | 3 | 29 | 2 | 1 | 1 | 1 | 0 | ... | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
449 | 15 | 1512 | 3 | 3 | 61 | 2 | 1 | 2 | 1 | 0 | ... | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
458 | 6 | 343 | 4 | 1 | 27 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
463 | 12 | 754 | 4 | 4 | 38 | 2 | 1 | 1 | 1 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
473 | 6 | 1238 | 4 | 4 | 36 | 1 | 2 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
579 | 24 | 937 | 4 | 3 | 27 | 2 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
583 | 36 | 2384 | 4 | 1 | 33 | 1 | 1 | 2 | 1 | 0 | ... | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 |
588 | 18 | 1217 | 4 | 3 | 47 | 1 | 1 | 2 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
594 | 24 | 1358 | 4 | 3 | 40 | 1 | 1 | 2 | 0 | 0 | ... | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
610 | 12 | 741 | 4 | 3 | 22 | 1 | 1 | 2 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
613 | 24 | 3632 | 1 | 4 | 22 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 |
665 | 24 | 6314 | 4 | 2 | 27 | 2 | 1 | 1 | 0 | 0 | ... | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 |
666 | 30 | 3496 | 4 | 2 | 34 | 1 | 2 | 1 | 1 | 0 | ... | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
721 | 6 | 433 | 4 | 2 | 24 | 1 | 2 | 2 | 1 | 0 | ... | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 |
735 | 36 | 3990 | 3 | 2 | 29 | 1 | 1 | 1 | 1 | 0 | ... | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
754 | 12 | 1555 | 4 | 4 | 55 | 2 | 2 | 2 | 0 | 0 | ... | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 0 |
782 | 12 | 1410 | 2 | 2 | 31 | 1 | 1 | 1 | 1 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 |
813 | 48 | 3051 | 3 | 4 | 54 | 1 | 1 | 2 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
816 | 6 | 1338 | 1 | 4 | 62 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
818 | 36 | 15857 | 2 | 3 | 43 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | 0 |
856 | 10 | 894 | 4 | 3 | 40 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
873 | 15 | 874 | 4 | 1 | 24 | 1 | 1 | 1 | 0 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
915 | 48 | 18424 | 1 | 2 | 32 | 1 | 1 | 2 | 1 | 0 | ... | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
964 | 6 | 454 | 3 | 1 | 22 | 1 | 1 | 1 | 1 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
970 | 15 | 1514 | 4 | 2 | 22 | 1 | 1 | 1 | 1 | 0 | ... | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 |
50 rows × 49 columns
# Standardize the features
= StandardScaler()
scaler = scaler.fit_transform(X)
X
# Split the data into train and test sets
= train_test_split(X, y, test_size=0.2, random_state=42)
X_train, X_test, y_train, y_test
# Define and train the autoencoder model
= X_train.shape[1]
input_dim = 10 # Number of neurons in the encoding layer
encoding_dim
= Input(shape=(input_dim,))
input_layer = Dense(encoding_dim, activation='relu')(input_layer)
encoded = Dense(input_dim, activation='linear')(encoded)
decoded = Model(input_layer, decoded)
autoencoder compile(optimizer='adam', loss='mean_squared_error')
autoencoder.
=50, batch_size=64, shuffle=True, validation_data=(X_test, X_test))
autoencoder.fit(X_train, X_train, epochs
# Evaluate the autoencoder model on the test set
= np.mean(np.square(X_test - autoencoder.predict(X_test)), axis=1)
reconstruction_errors
# Set a threshold for anomalies
= np.percentile(reconstruction_errors, 95) # Example threshold (adjust as needed)
threshold
# Detect anomalies
= reconstruction_errors > threshold
anomalies_detected
# Print the number of anomalies detected
print(f'Anomalies detected: {np.sum(anomalies_detected)} out of {len(X_test)}')
Epoch 1/50
13/13 [==============================] - 0s 11ms/step - loss: 1.2654 - val_loss: 1.1622
Epoch 2/50
13/13 [==============================] - 0s 4ms/step - loss: 1.1879 - val_loss: 1.1093
Epoch 3/50
13/13 [==============================] - 0s 4ms/step - loss: 1.1322 - val_loss: 1.0692
Epoch 4/50
13/13 [==============================] - 0s 4ms/step - loss: 1.0886 - val_loss: 1.0381
Epoch 5/50
13/13 [==============================] - 0s 4ms/step - loss: 1.0551 - val_loss: 1.0139
Epoch 6/50
13/13 [==============================] - 0s 4ms/step - loss: 1.0286 - val_loss: 0.9934
Epoch 7/50
13/13 [==============================] - 0s 4ms/step - loss: 1.0062 - val_loss: 0.9760
Epoch 8/50
13/13 [==============================] - 0s 4ms/step - loss: 0.9867 - val_loss: 0.9606
Epoch 9/50
13/13 [==============================] - 0s 4ms/step - loss: 0.9696 - val_loss: 0.9468
Epoch 10/50
13/13 [==============================] - 0s 3ms/step - loss: 0.9543 - val_loss: 0.9342
Epoch 11/50
13/13 [==============================] - 0s 4ms/step - loss: 0.9399 - val_loss: 0.9223
Epoch 12/50
13/13 [==============================] - 0s 3ms/step - loss: 0.9263 - val_loss: 0.9112
Epoch 13/50
13/13 [==============================] - 0s 4ms/step - loss: 0.9133 - val_loss: 0.9005
Epoch 14/50
13/13 [==============================] - 0s 3ms/step - loss: 0.9009 - val_loss: 0.8902
Epoch 15/50
13/13 [==============================] - 0s 4ms/step - loss: 0.8892 - val_loss: 0.8801
Epoch 16/50
13/13 [==============================] - 0s 3ms/step - loss: 0.8779 - val_loss: 0.8707
Epoch 17/50
13/13 [==============================] - 0s 3ms/step - loss: 0.8670 - val_loss: 0.8614
Epoch 18/50
13/13 [==============================] - 0s 5ms/step - loss: 0.8566 - val_loss: 0.8528
Epoch 19/50
13/13 [==============================] - 0s 3ms/step - loss: 0.8468 - val_loss: 0.8442
Epoch 20/50
13/13 [==============================] - 0s 4ms/step - loss: 0.8375 - val_loss: 0.8360
Epoch 21/50
13/13 [==============================] - 0s 4ms/step - loss: 0.8283 - val_loss: 0.8283
Epoch 22/50
13/13 [==============================] - 0s 4ms/step - loss: 0.8197 - val_loss: 0.8211
Epoch 23/50
13/13 [==============================] - 0s 4ms/step - loss: 0.8116 - val_loss: 0.8140
Epoch 24/50
13/13 [==============================] - 0s 4ms/step - loss: 0.8040 - val_loss: 0.8074
Epoch 25/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7966 - val_loss: 0.8010
Epoch 26/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7898 - val_loss: 0.7953
Epoch 27/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7833 - val_loss: 0.7896
Epoch 28/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7771 - val_loss: 0.7845
Epoch 29/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7714 - val_loss: 0.7796
Epoch 30/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7658 - val_loss: 0.7751
Epoch 31/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7608 - val_loss: 0.7706
Epoch 32/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7560 - val_loss: 0.7665
Epoch 33/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7515 - val_loss: 0.7628
Epoch 34/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7473 - val_loss: 0.7590
Epoch 35/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7431 - val_loss: 0.7558
Epoch 36/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7393 - val_loss: 0.7526
Epoch 37/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7356 - val_loss: 0.7495
Epoch 38/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7322 - val_loss: 0.7468
Epoch 39/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7289 - val_loss: 0.7437
Epoch 40/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7259 - val_loss: 0.7413
Epoch 41/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7228 - val_loss: 0.7385
Epoch 42/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7201 - val_loss: 0.7362
Epoch 43/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7174 - val_loss: 0.7340
Epoch 44/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7149 - val_loss: 0.7318
Epoch 45/50
13/13 [==============================] - 0s 5ms/step - loss: 0.7123 - val_loss: 0.7297
Epoch 46/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7100 - val_loss: 0.7275
Epoch 47/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7078 - val_loss: 0.7256
Epoch 48/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7056 - val_loss: 0.7235
Epoch 49/50
13/13 [==============================] - 0s 3ms/step - loss: 0.7035 - val_loss: 0.7215
Epoch 50/50
13/13 [==============================] - 0s 4ms/step - loss: 0.7012 - val_loss: 0.7197
7/7 [==============================] - 0s 1ms/step
Anomalies detected: 10 out of 200
# Split the data into features and labels
= data.drop('class', axis=1).values
X = data['class'].values
y
# Standardize the features
= StandardScaler()
scaler = scaler.fit_transform(X)
X
# Define and train the autoencoder model
= X.shape[1]
input_dim = 10 # Number of neurons in the encoding layer
encoding_dim
= Input(shape=(input_dim,))
input_layer = Dense(encoding_dim, activation='relu')(input_layer)
encoded = Dense(input_dim, activation='linear')(encoded)
decoded = Model(input_layer, decoded)
autoencoder compile(optimizer='adam', loss='mean_squared_error')
autoencoder.
=50, batch_size=64, shuffle=True)
autoencoder.fit(X, X, epochs
# Evaluate the autoencoder model on the entire dataset
= np.mean(np.square(X - autoencoder.predict(X)), axis=1)
reconstruction_errors
# Set a threshold for anomalies
= np.percentile(reconstruction_errors, 95) # Example threshold (adjust as needed)
threshold
# Detect anomalies for the entire dataset
= reconstruction_errors > threshold
anomalies_detected
# Print the number of anomalies detected
print(f'Anomalies detected: {np.sum(anomalies_detected)} out of {len(X)}')
Epoch 1/50
16/16 [==============================] - 0s 1ms/step - loss: 1.2795
Epoch 2/50
16/16 [==============================] - 0s 1ms/step - loss: 1.1882
Epoch 3/50
16/16 [==============================] - 0s 1ms/step - loss: 1.1245
Epoch 4/50
16/16 [==============================] - 0s 1ms/step - loss: 1.0789
Epoch 5/50
16/16 [==============================] - 0s 1ms/step - loss: 1.0441
Epoch 6/50
16/16 [==============================] - 0s 1ms/step - loss: 1.0170
Epoch 7/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9944
Epoch 8/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9754
Epoch 9/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9588
Epoch 10/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9433
Epoch 11/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9291
Epoch 12/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9158
Epoch 13/50
16/16 [==============================] - 0s 1ms/step - loss: 0.9028
Epoch 14/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8905
Epoch 15/50
16/16 [==============================] - 0s 2ms/step - loss: 0.8784
Epoch 16/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8665
Epoch 17/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8548
Epoch 18/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8433
Epoch 19/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8321
Epoch 20/50
16/16 [==============================] - 0s 1ms/step - loss: 0.8211
Epoch 21/50
16/16 [==============================] - 0s 2ms/step - loss: 0.8105
Epoch 22/50
16/16 [==============================] - 0s 2ms/step - loss: 0.8005
Epoch 23/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7909
Epoch 24/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7817
Epoch 25/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7733
Epoch 26/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7654
Epoch 27/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7583
Epoch 28/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7516
Epoch 29/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7455
Epoch 30/50
16/16 [==============================] - 0s 2ms/step - loss: 0.7400
Epoch 31/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7346
Epoch 32/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7297
Epoch 33/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7253
Epoch 34/50
16/16 [==============================] - 0s 2ms/step - loss: 0.7211
Epoch 35/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7170
Epoch 36/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7133
Epoch 37/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7099
Epoch 38/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7067
Epoch 39/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7036
Epoch 40/50
16/16 [==============================] - 0s 1ms/step - loss: 0.7006
Epoch 41/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6979
Epoch 42/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6952
Epoch 43/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6927
Epoch 44/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6903
Epoch 45/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6881
Epoch 46/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6860
Epoch 47/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6839
Epoch 48/50
16/16 [==============================] - 0s 2ms/step - loss: 0.6819
Epoch 49/50
16/16 [==============================] - 0s 2ms/step - loss: 0.6800
Epoch 50/50
16/16 [==============================] - 0s 1ms/step - loss: 0.6782
32/32 [==============================] - 0s 935us/step
Anomalies detected: 50 out of 1000