rtik007's picture
Update app.py
992cdf4 verified
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.covariance import EllipticEnvelope
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
from sklearn.linear_model import SGDOneClassSVM
from sklearn.kernel_approximation import Nystroem
from sklearn.pipeline import make_pipeline
from sklearn.datasets import make_blobs, make_moons
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
import gradio as gr
import time
# Helper function: Prepare data
def prepare_data(input_data, n_samples, outliers_fraction=0.01):
n_outliers = max(int(outliers_fraction * n_samples), 1)
n_inliers = n_samples - n_outliers
blobs_params = dict(random_state=0, n_samples=n_inliers, n_features=2)
DATA_MAPPING = {
"Central Blob": make_blobs(centers=[[0, 0], [0, 0]], cluster_std=0.5, **blobs_params)[0],
"Two Blobs": make_blobs(centers=[[2, 2], [-2, -2]], cluster_std=[0.5, 0.5], **blobs_params)[0],
"Blob with Noise": make_blobs(centers=[[2, 2], [-2, -2]], cluster_std=[1.5, 0.3], **blobs_params)[0],
"Moons": 4.0 * (make_moons(n_samples=n_samples, noise=0.05, random_state=0)[0] - np.array([0.5, 0.25])),
"Noise": 14.0 * (np.random.RandomState(42).rand(n_samples, 2) - 0.5),
}
X = DATA_MAPPING[input_data]
rng = np.random.RandomState(42)
outliers = rng.uniform(low=-6, high=6, size=(n_outliers, 2))
X = np.concatenate([X, outliers], axis=0)
return X
# Autoencoder Anomaly Detection
def build_autoencoder(input_dim):
model = Sequential([
Dense(64, activation='relu', input_dim=input_dim),
Dense(32, activation='relu'),
Dense(64, activation='relu'),
Dense(input_dim, activation='sigmoid'),
])
model.compile(optimizer=Adam(learning_rate=0.001), loss='mse')
return model
def autoencoder_anomaly_detection(X, outliers_fraction=0.01, epochs=50):
model = build_autoencoder(X.shape[1])
model.fit(X, X, epochs=epochs, batch_size=32, verbose=0)
reconstruction = model.predict(X)
reconstruction_error = np.mean((X - reconstruction) ** 2, axis=1)
threshold = np.percentile(reconstruction_error, 100 * (1 - outliers_fraction))
y_pred = (reconstruction_error > threshold).astype(int)
return y_pred
# Function to generate scatter plots
def plot_interactive_feature_scatter(input_data, feature_x, feature_y, n_samples):
X = prepare_data(input_data, n_samples)
plt.figure(figsize=(6, 6))
plt.scatter(X[:, 0], X[:, 1], alpha=0.8, c="blue", s=20, label="Data Points")
plt.title(f"Feature Interaction Scatter Plot - {feature_x} vs {feature_y}")
plt.xlabel(feature_x)
plt.ylabel(feature_y)
plt.legend()
return plt.gcf()
# Function to train models and generate comparison plots
def train_models(input_data, outliers_fraction, n_samples, clf_name):
X = prepare_data(input_data, n_samples, outliers_fraction)
NAME_CLF_MAPPING = {
"Robust covariance": EllipticEnvelope(contamination=outliers_fraction),
"One-Class SVM": svm.OneClassSVM(nu=outliers_fraction, kernel="rbf", gamma=0.1),
"One-Class SVM (SGD)": make_pipeline(
Nystroem(gamma=0.1, random_state=42, n_components=150),
SGDOneClassSVM(nu=outliers_fraction, random_state=42)
),
"Isolation Forest": IsolationForest(contamination=outliers_fraction, random_state=42),
"Local Outlier Factor": LocalOutlierFactor(n_neighbors=35, contamination=outliers_fraction),
"Autoencoders": autoencoder_anomaly_detection(X, outliers_fraction)
}
clf = NAME_CLF_MAPPING.get(clf_name, None)
if clf_name == "Autoencoders":
y_pred = clf
else:
if clf_name == "Local Outlier Factor":
y_pred = clf.fit_predict(X)
else:
clf.fit(X)
y_pred = clf.predict(X)
# Plot results
plt.figure(figsize=(5, 5))
colors = np.array(["#377eb8", "#ff7f00"])
plt.scatter(X[:, 0], X[:, 1], c=colors[(y_pred + 1) // 2], s=20)
plt.title(clf_name)
return plt.gcf()
# Gradio Interface
with gr.Blocks() as demo:
gr.Markdown("## Anomaly Detection Comparison App")
# Interactive Scatter Plot
gr.Markdown("### Interactive Feature Scatter Plot")
input_data = gr.Radio(choices=["Central Blob", "Two Blobs", "Blob with Noise", "Moons", "Noise"], value="Moons", label="Dataset")
feature_x = gr.Dropdown(choices=["Feature1", "Feature2"], value="Feature1", label="Feature 1")
feature_y = gr.Dropdown(choices=["Feature1", "Feature2"], value="Feature2", label="Feature 2")
n_samples = gr.Slider(minimum=10, maximum=10000, step=100, value=500, label="Number of Samples")
scatter_plot_button = gr.Button("Generate Scatter Plot")
scatter_plot = gr.Plot(label="Feature Scatter Plot")
scatter_plot_button.click(
fn=plot_interactive_feature_scatter,
inputs=[input_data, feature_x, feature_y, n_samples],
outputs=scatter_plot,
)
# Compare Anomaly Detection Algorithms
gr.Markdown("### Compare Anomaly Detection Algorithms")
outliers_fraction = gr.Slider(minimum=0.001, maximum=0.999, step=0.01, value=0.01, label="Fraction of Outliers")
input_models = gr.Radio(
choices=["Robust covariance", "One-Class SVM", "One-Class SVM (SGD)", "Isolation Forest", "Local Outlier Factor", "Autoencoders"],
value="Isolation Forest",
label="Select Model"
)
comparison_plot = gr.Plot(label="Model Comparison Results")
generate_comparison_plot = gr.Button("Generate Comparison Plot")
generate_comparison_plot.click(
fn=train_models,
inputs=[input_data, outliers_fraction, n_samples, input_models],
outputs=comparison_plot,
)
demo.launch()