File size: 2,848 Bytes
cb2fac0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import pandas as pd
import pickle
from sklearn.ensemble import IsolationForest  # Example model, replace if using a different one

st.markdown("<h1 style='text-align: center; font-size: 48px; color: red;'>Credit Card Fraud Anomaly Detection ML App</h1>", unsafe_allow_html=True)

# Load the credit card dataset directly
@st.cache_data
def load_dataset():
    return pd.read_csv('creditcard.csv')  # Path to the creditcard.csv file

# Cache function to convert DataFrame to CSV
@st.cache_data
def convert_df(df):
    return df.to_csv(index=False).encode("utf-8")

# Load pre-trained anomaly detection model
@st.cache_resource
def load_model():
    with open("model.pkl", "rb") as f:
        model = pickle.load(f)
    return model

# Load the dataset
df = load_dataset()

# Display the dataset preview
st.write("Dataset Preview:")
st.dataframe(df.head())

# Ensure the dataset has the 'Class' column
if 'Class' not in df.columns:
    st.error("The dataset must contain a 'Class' column.")
else:
    # Add functionality for row selection
    st.markdown("### Select a Row for Model Input:")

    # Option to select a row
    selected_row = st.selectbox("Select a Row", options=range(len(df)), index=0)

    # Add a button below the row selection for anomaly detection
    detect_button = st.button("Detect Anomaly")

    # If the "Detect" button is clicked
    if detect_button:
        # Row to use for the model
        row_to_use = df.iloc[selected_row]

        # Drop 'Class' column (exclude it from features used for prediction)
        row_to_use_for_model = row_to_use.drop('Class', errors='ignore')

        # Check if the number of features matches the model's expectations
        model = load_model()

        if len(row_to_use_for_model) != model.n_features_in_:
            st.error(f"The model expects {model.n_features_in_} features, but {len(row_to_use_for_model)} were provided.")
        else:
            # Apply the model for anomaly detection
            prediction = model.predict([row_to_use_for_model])

            # Display the row and the anomaly detection result
            st.write(f"Row selected for anomaly detection:")
            st.write(row_to_use)

            # Show the anomaly result for the selected row
            result = "Anomaly" if prediction[0] == -1 else "Not Anomaly"
            st.write(f"Anomaly Detection Result: {result}")

            # Provide option to download the result
            result_df = row_to_use.to_frame().T  # Convert Series to DataFrame
            result_df['Anomaly'] = result
            result_csv = convert_df(result_df)
            st.download_button(
                label="Download Selected Row Result",
                data=result_csv,
                file_name="Selected_Row_Anomaly_Result.csv",
                mime="text/csv",
            )