Spaces:
Sleeping
Sleeping
File size: 4,356 Bytes
ad0def0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | import gradio as gr
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, IsolationForest
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score, roc_curve
# -------------------------
# Load Dataset (auto-download from GitHub mirror if not present)
# -------------------------
import os, requests, zipfile
DATA_URL = "https://storage.googleapis.com/download.tensorflow.org/data/creditcard.csv"
DATA_PATH = "creditcard.csv"
if not os.path.exists(DATA_PATH):
print("Downloading dataset...")
r = requests.get(DATA_URL)
with open(DATA_PATH, "wb") as f:
f.write(r.content)
df = pd.read_csv(DATA_PATH)
# -------------------------
# Preprocess
# -------------------------
X = df.drop("Class", axis=1)
y = df["Class"]
scaler = StandardScaler()
X["Amount"] = scaler.fit_transform(X["Amount"].values.reshape(-1, 1))
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
# -------------------------
# Train Models
# -------------------------
log_reg = LogisticRegression(max_iter=5000, class_weight="balanced", random_state=42)
log_reg.fit(X_train, y_train)
rf = RandomForestClassifier(n_estimators=200, class_weight="balanced", random_state=42)
rf.fit(X_train, y_train)
iso_forest = IsolationForest(
n_estimators=200, contamination=0.0017, random_state=42
)
iso_forest.fit(X_train)
# -------------------------
# Evaluation
# -------------------------
def evaluate_models():
results = {}
# Logistic Regression
y_pred_lr = log_reg.predict(X_test)
y_prob_lr = log_reg.predict_proba(X_test)[:, 1]
results["Logistic Regression"] = classification_report(y_test, y_pred_lr, digits=4)
# Random Forest
y_pred_rf = rf.predict(X_test)
y_prob_rf = rf.predict_proba(X_test)[:, 1]
results["Random Forest"] = classification_report(y_test, y_pred_rf, digits=4)
# Isolation Forest
y_pred_if = iso_forest.predict(X_test)
y_pred_if = np.where(y_pred_if == -1, 1, 0)
results["Isolation Forest"] = classification_report(y_test, y_pred_if, digits=4)
return results
# -------------------------
# Fraud Prediction Function
# -------------------------
def predict_transaction(amount, time, v_features):
# Build feature vector
data = np.array([time] + v_features + [amount]).reshape(1, -1)
data[:, -1] = scaler.transform(data[:, -1].reshape(-1, 1)) # scale amount
pred_lr = log_reg.predict(data)[0]
prob_lr = log_reg.predict_proba(data)[0][1]
pred_rf = rf.predict(data)[0]
prob_rf = rf.predict_proba(data)[0][1]
pred_if = iso_forest.predict(data)[0]
pred_if = 1 if pred_if == -1 else 0
return {
"Logistic Regression": f"Fraud={pred_lr} (Prob={prob_lr:.3f})",
"Random Forest": f"Fraud={pred_rf} (Prob={prob_rf:.3f})",
"Isolation Forest": f"Fraud={pred_if}",
}
# -------------------------
# Gradio UI
# -------------------------
def ui_transaction(amount, time, *v_features):
v_features = list(v_features)
return predict_transaction(amount, time, v_features)
with gr.Blocks() as demo:
gr.Markdown("# 💳 Credit Card Fraud Detection\nCompare Logistic Regression, Random Forest & Isolation Forest")
with gr.Tab("Evaluate Models"):
btn = gr.Button("Run Evaluation")
out = gr.Textbox(lines=15, label="Results")
def run_eval():
res = evaluate_models()
return "\n\n".join([f"{k}:\n{v}" for k, v in res.items()])
btn.click(run_eval, outputs=out)
with gr.Tab("Predict a Transaction"):
amount = gr.Number(label="Transaction Amount")
time = gr.Number(label="Time (seconds since first transaction)")
v_inputs = [gr.Number(label=f"V{i}") for i in range(1, 29)]
btn_pred = gr.Button("Predict Fraud")
out_pred = gr.JSON(label="Predictions")
btn_pred.click(ui_transaction, inputs=[amount, time] + v_inputs, outputs=out_pred)
demo.launch()
|