BeyzaTopbas's picture
Update src/streamlit_app.py
cdc7ddc verified
Raw History Blame Contribute Delete
3.66 kB
import streamlit as st
import numpy as np
import joblib
import os
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.metrics import (
ConfusionMatrixDisplay,
RocCurveDisplay,
roc_auc_score
)
st.set_page_config(page_title="Credit Card Fraud Detection", layout="centered")
BASE_DIR = os.path.dirname(__file__)
MODEL_PATH = os.path.join(BASE_DIR, "model.pkl")
model = joblib.load(MODEL_PATH)
# ================= LOAD TEST DATA =================
X_test_path = os.path.join(BASE_DIR, "X_test.npy")
y_test_path = os.path.join(BASE_DIR, "y_test.npy")
if os.path.exists(X_test_path):
X_test = np.load(X_test_path)
y_test = np.load(y_test_path)
y_prob = model.predict_proba(X_test)[:, 1]
y_pred = model.predict(X_test)
auc = roc_auc_score(y_test, y_prob)
else:
X_test, y_test, y_prob, y_pred, auc = None, None, None, None, None
# ================= TITLE =================
st.title("πŸ’³ Credit Card Fraud Detection")
st.markdown("Real-time fraud detection using Machine Learning.")
threshold = st.slider("Fraud detection threshold", 0.0, 1.0, 0.5)
# ================= TABS =================
tab1, tab2 = st.tabs(["πŸ” Prediction", "πŸ“Š Model Insights"])
# ================= TAB 1 =================
with tab1:
st.subheader("Transaction Input")
if st.button("🎲 Generate Random Transaction"):
time = np.random.randint(0, 172800)
amount = np.random.uniform(1, 5000)
pca_values = np.random.normal(0, 1, 28)
else:
col1, col2 = st.columns(2)
with col1:
time = st.number_input("Time", value=0)
with col2:
amount = st.number_input("Amount", value=0.0)
st.info("V1–V28 are PCA-transformed anonymized features.")
pca_values = []
with st.expander("PCA Features"):
for i in range(28):
pca_values.append(st.number_input(f"V{i+1}", value=0.0))
features = np.array([[time] + list(pca_values) + [amount]])
if st.button("Predict"):
with st.spinner("Analyzing transaction..."):
prob = model.predict_proba(features)[0][1]
pred = int(prob >= threshold)
st.markdown("## Result")
col1, col2 = st.columns(2)
with col1:
if pred == 1:
st.error("🚨 Fraudulent Transaction")
else:
st.success("βœ… Legitimate Transaction")
with col2:
st.metric("Fraud Probability", f"{prob:.4f}")
st.progress(prob)
# Download report
report = pd.DataFrame({
"Time": [time],
"Amount": [amount],
"Fraud Probability": [prob],
"Prediction": [pred]
})
st.download_button(
"πŸ“₯ Download prediction report",
report.to_csv(index=False),
"prediction.csv"
)
# ================= TAB 2 =================
with tab2:
st.subheader("Model Performance")
if X_test is None:
st.info("Upload X_test.npy and y_test.npy to enable insights.")
else:
st.metric("AUC", round(auc, 3))
fig, ax = plt.subplots()
RocCurveDisplay.from_predictions(y_test, y_prob, ax=ax)
st.pyplot(fig)
fig2, ax2 = plt.subplots()
ConfusionMatrixDisplay.from_predictions(y_test, y_pred, ax=ax2)
st.pyplot(fig2)
if hasattr(model, "feature_importances_"):
st.subheader("Feature Importance")
fig3, ax3 = plt.subplots()
ax3.bar(range(len(model.feature_importances_)), model.feature_importances_)
ax3.set_title("Feature Importance")
st.pyplot(fig3)