fraud_detection / app.py
Kwasiasomani's picture
Update app.py
11c7e1d verified
raw
history blame
3.41 kB
# Import necessary libraries
import streamlit as st
import pandas as pd
import numpy as np
import pickle
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
from joblib import load
# Load pre-trained model and scaler
with open('standard_scaler.pkl', 'rb') as scaler_file:
scaler = pickle.load(scaler_file)
#with open('random_forest_model.pkl', 'rb') as model_file:
#model = pickle.load(model_file)
# Load the model
model = load('model.joblib')
def predict_fraud(user_input):
user_input_amount = user_input['Amount']
user_input_features = user_input.drop(columns=['Amount'])
# Scale the amount column
user_input_amount_scaled = scaler.transform(np.array(user_input_amount).reshape(-1, 1))
# Reshape user_input_features if necessary
if len(user_input_features.shape) == 1:
user_input_features = user_input_features.values.reshape(1, -1)
# Combine scaled amount with other features
user_input_scaled = np.concatenate((user_input_features, user_input_amount_scaled), axis=1)
# Ensure user_input_scaled is a 2D array
if len(user_input_scaled.shape) == 1:
user_input_scaled = user_input_scaled.reshape(1, -1)
# Make predictions
prediction = model.predict(user_input_scaled)[0]
probability = model.predict_proba(user_input_scaled)[0][1]
return prediction, probability
# Function to generate charts
def generate_charts(prediction, probability, amount):
fig, axes = plt.subplots(1, 2, figsize=(12, 6))
# Pie chart for prediction distribution
prediction_labels = ['Non-Fraudulent', 'Fraudulent']
prediction_values = [1 - prediction, prediction]
axes[0].pie(prediction_values, labels=prediction_labels, autopct='%1.1f%%', startangle=90, colors=['skyblue', 'lightcoral'])
axes[0].set_title('Prediction Distribution')
# Bar chart for probability distribution
axes[1].bar(['Probability'], [probability], color='lightgreen' if prediction == 0 else 'lightcoral')
axes[1].set_title('Probability of Fraud')
# Display amount
st.write(f"Transaction Amount: ${amount}")
# Display charts
st.pyplot(fig)
# Streamlit app
def main():
st.title("Fraud Detection Prediction App")
# User input fields
user_input = []
for i in range(1, 29):
user_input.append(st.number_input(f'V{i}', value=0.0))
min_amount = st.number_input('Minimum Amount', value=0.0)
max_amount = st.number_input('Maximum Amount', value=10000.0)
amount = st.number_input('Amount', min_value=min_amount, max_value=max_amount, value=(min_amount + max_amount) / 2)
# Make prediction on button click
if st.button('Predict'):
#user_input_array = np.array(user_input)
#user_input_array = np.append(user_input_array, amount)
user_input_df = pd.DataFrame([user_input]) # Convert list of dictionaries to DataFrame
user_input_df['Amount'] = amount
prediction, probability = predict_fraud(user_input_df)
# Display prediction result
st.write(f"Prediction: {'Fraudulent Transaction' if prediction == 1 else 'Non-Fraudulent Transaction'}")
st.write(f"Probability: {probability:.2%}")
# Generate and display charts
generate_charts(prediction, probability, amount)
if __name__ == "__main__":
main()