Spaces:
Sleeping
Sleeping
| """ | |
| Gradio Demo for Credit Card Fraud Detection | |
| This app can be deployed to Hugging Face Spaces | |
| """ | |
| import gradio as gr | |
| import joblib | |
| import pandas as pd | |
| import numpy as np | |
| from datetime import datetime | |
| # ============================================================================ | |
| # Feature Engineering Function | |
| # ============================================================================ | |
| def engineer_features(df): | |
| """Engineer features for prediction""" | |
| # Amount-based features | |
| df['amount_log'] = np.log1p(df['amount']) | |
| df['amount_zscore'] = (df['amount'] - df['avg_transaction_amount']) / (df['avg_transaction_amount'] + 1) | |
| df['is_high_amount'] = (df['amount'] > 1000).astype(int) | |
| df['is_round_amount'] = (df['amount'] % 10 == 0).astype(int) | |
| # Time-based features | |
| df['is_night'] = ((df['time_of_day'] >= 22) | (df['time_of_day'] <= 6)).astype(int) | |
| df['is_weekend'] = (df['day_of_week'] >= 5).astype(int) | |
| df['is_business_hours'] = ((df['time_of_day'] >= 9) & (df['time_of_day'] <= 17)).astype(int) | |
| # Location-based features | |
| df['is_far_from_home'] = (df['distance_from_home'] > 50).astype(int) | |
| df['unusual_location_change'] = (df['distance_from_last_transaction'] > 100).astype(int) | |
| df['location_velocity'] = df['distance_from_last_transaction'] / (df['time_since_last_transaction'] + 0.1) | |
| # Velocity features | |
| df['rapid_transactions'] = (df['time_since_last_transaction'] < 1).astype(int) | |
| df['high_daily_frequency'] = (df['num_transactions_today'] > 5).astype(int) | |
| df['high_weekly_frequency'] = (df['num_transactions_last_week'] > 15).astype(int) | |
| # Behavioral features | |
| df['online_without_card'] = ((df['is_online'] == 1) & (df['card_present'] == 0)).astype(int) | |
| df['international_online'] = ((df['is_international'] == 1) & (df['is_online'] == 1)).astype(int) | |
| df['new_account'] = (df['account_age_days'] < 90).astype(int) | |
| # Risk score | |
| df['risk_score'] = ( | |
| df['is_night'] * 2 + | |
| df['is_far_from_home'] * 3 + | |
| df['rapid_transactions'] * 3 + | |
| df['high_daily_frequency'] * 2 + | |
| df['online_without_card'] * 2 + | |
| df['is_international'] * 1 | |
| ) | |
| return df | |
| # ============================================================================ | |
| # Load Model | |
| # ============================================================================ | |
| try: | |
| model_data = joblib.load('fraud_model.pkl') | |
| MODEL = model_data['model'] | |
| SCALER = model_data['scaler'] | |
| FEATURE_COLUMNS = model_data['feature_columns'] | |
| model_loaded = True | |
| except Exception as e: | |
| model_loaded = False | |
| error_message = str(e) | |
| # ============================================================================ | |
| # Prediction Function | |
| # ============================================================================ | |
| def predict_fraud( | |
| amount, | |
| time_of_day, | |
| day_of_week, | |
| distance_from_home, | |
| distance_from_last_transaction, | |
| time_since_last_transaction, | |
| num_transactions_today, | |
| num_transactions_last_week, | |
| merchant_category, | |
| is_online, | |
| card_present, | |
| is_international, | |
| avg_transaction_amount, | |
| account_age_days | |
| ): | |
| """Predict if a transaction is fraudulent""" | |
| if not model_loaded: | |
| return "❌ Model not loaded. Please ensure fraud_model.pkl is in the directory.", "", "", "" | |
| try: | |
| # Prepare transaction data | |
| transaction = { | |
| 'amount': amount, | |
| 'time_of_day': time_of_day, | |
| 'day_of_week': day_of_week, | |
| 'distance_from_home': distance_from_home, | |
| 'distance_from_last_transaction': distance_from_last_transaction, | |
| 'time_since_last_transaction': time_since_last_transaction, | |
| 'num_transactions_today': num_transactions_today, | |
| 'num_transactions_last_week': num_transactions_last_week, | |
| 'merchant_category': merchant_category, | |
| 'is_online': 1 if is_online == "Yes" else 0, | |
| 'card_present': 1 if card_present == "Yes" else 0, | |
| 'is_international': 1 if is_international == "Yes" else 0, | |
| 'avg_transaction_amount': avg_transaction_amount, | |
| 'account_age_days': account_age_days | |
| } | |
| # Engineer features | |
| transaction_df = pd.DataFrame([transaction]) | |
| transaction_df = engineer_features(transaction_df) | |
| # Extract features | |
| X = transaction_df[FEATURE_COLUMNS] | |
| X_scaled = SCALER.transform(X) | |
| # Predict | |
| fraud_probability = float(MODEL.predict_proba(X_scaled)[0, 1]) | |
| is_fraud = bool(MODEL.predict(X_scaled)[0]) | |
| # Determine risk level and color | |
| if fraud_probability >= 0.9: | |
| risk_level = "🔴 CRITICAL" | |
| risk_color = "red" | |
| elif fraud_probability >= 0.7: | |
| risk_level = "🟠 HIGH" | |
| risk_color = "orange" | |
| elif fraud_probability >= 0.5: | |
| risk_level = "🟡 MEDIUM" | |
| risk_color = "yellow" | |
| elif fraud_probability >= 0.3: | |
| risk_level = "🔵 LOW" | |
| risk_color = "blue" | |
| else: | |
| risk_level = "🟢 MINIMAL" | |
| risk_color = "green" | |
| # Decision | |
| if is_fraud: | |
| decision = "🚨 BLOCK TRANSACTION" | |
| decision_color = "red" | |
| else: | |
| decision = "✅ APPROVE TRANSACTION" | |
| decision_color = "green" | |
| # Format output | |
| probability_text = f"**Fraud Probability:** {fraud_probability*100:.2f}%" | |
| risk_text = f"**Risk Level:** {risk_level}" | |
| decision_text = f"**Decision:** {decision}" | |
| # Additional info | |
| details = f""" | |
| ### Transaction Analysis | |
| **Input Summary:** | |
| - Amount: ${amount:.2f} | |
| - Time: {time_of_day:.1f}:00 (Hour {int(time_of_day)}) | |
| - Location: {distance_from_home:.0f}km from home | |
| - Frequency: {num_transactions_today} today, {num_transactions_last_week} this week | |
| - Type: {"Online" if is_online == "Yes" else "In-Store"} | {"Card Present" if card_present == "Yes" else "Card Not Present"} | |
| - International: {is_international} | |
| **Risk Indicators:** | |
| - {'⚠️ Late night transaction' if (time_of_day >= 22 or time_of_day <= 6) else '✓ Normal hours'} | |
| - {'⚠️ Far from home' if distance_from_home > 50 else '✓ Normal location'} | |
| - {'⚠️ High transaction frequency' if num_transactions_today > 5 else '✓ Normal frequency'} | |
| - {'⚠️ Rapid transactions' if time_since_last_transaction < 1 else '✓ Normal velocity'} | |
| **Model Confidence:** {max(fraud_probability, 1-fraud_probability)*100:.1f}% | |
| """ | |
| return probability_text, risk_text, decision_text, details | |
| except Exception as e: | |
| return f"❌ Error: {str(e)}", "", "", "" | |
| # ============================================================================ | |
| # Gradio Interface | |
| # ============================================================================ | |
| # Example transactions | |
| legitimate_example = [ | |
| 75.50, # amount | |
| 14.0, # time_of_day | |
| 2, # day_of_week (Tuesday) | |
| 3, # distance_from_home | |
| 2, # distance_from_last_transaction | |
| 24, # time_since_last_transaction | |
| 1, # num_transactions_today | |
| 7, # num_transactions_last_week | |
| 2, # merchant_category | |
| "No", # is_online | |
| "Yes", # card_present | |
| "No", # is_international | |
| 80, # avg_transaction_amount | |
| 730 # account_age_days (2 years) | |
| ] | |
| fraudulent_example = [ | |
| 1250.00, # amount | |
| 2.5, # time_of_day (2:30 AM) | |
| 3, # day_of_week (Wednesday) | |
| 250, # distance_from_home | |
| 200, # distance_from_last_transaction | |
| 0.5, # time_since_last_transaction | |
| 12, # num_transactions_today | |
| 25, # num_transactions_last_week | |
| 7, # merchant_category | |
| "Yes", # is_online | |
| "No", # card_present | |
| "Yes", # is_international | |
| 65, # avg_transaction_amount | |
| 30 # account_age_days | |
| ] | |
| # Create interface | |
| with gr.Blocks(title="Credit Card Fraud Detection", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown(""" | |
| # 💳 Credit Card Fraud Detection System | |
| Real-time machine learning model to detect fraudulent credit card transactions. | |
| **Model Performance:** | |
| - ✅ 100% Fraud Detection Rate | |
| - ✅ <1% False Alarm Rate | |
| - ✅ ROC AUC: 1.0000 | |
| - ⚡ Real-time processing (<5ms) | |
| Enter transaction details below to check if it's fraudulent. | |
| """) | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown("### Transaction Details") | |
| amount = gr.Number(label="Transaction Amount ($)", value=100.00, minimum=0) | |
| with gr.Row(): | |
| time_of_day = gr.Slider(label="Time of Day (24h)", minimum=0, maximum=23.99, value=14.0, step=0.1) | |
| day_of_week = gr.Slider(label="Day of Week (0=Mon, 6=Sun)", minimum=0, maximum=6, value=2, step=1) | |
| gr.Markdown("### Location & Movement") | |
| with gr.Row(): | |
| distance_from_home = gr.Number(label="Distance from Home (km)", value=10, minimum=0) | |
| distance_from_last_transaction = gr.Number(label="Distance from Last Txn (km)", value=5, minimum=0) | |
| time_since_last_transaction = gr.Number(label="Hours Since Last Transaction", value=24, minimum=0) | |
| gr.Markdown("### Transaction Patterns") | |
| with gr.Row(): | |
| num_transactions_today = gr.Slider(label="Transactions Today", minimum=0, maximum=20, value=2, step=1) | |
| num_transactions_last_week = gr.Slider(label="Transactions Last Week", minimum=0, maximum=50, value=8, step=1) | |
| merchant_category = gr.Slider(label="Merchant Category (1-8)", minimum=1, maximum=8, value=2, step=1) | |
| gr.Markdown("### Transaction Type") | |
| with gr.Row(): | |
| is_online = gr.Radio(["Yes", "No"], label="Online Transaction?", value="No") | |
| card_present = gr.Radio(["Yes", "No"], label="Card Present?", value="Yes") | |
| is_international = gr.Radio(["Yes", "No"], label="International?", value="No") | |
| gr.Markdown("### Account Information") | |
| with gr.Row(): | |
| avg_transaction_amount = gr.Number(label="Average Transaction Amount ($)", value=100, minimum=0) | |
| account_age_days = gr.Number(label="Account Age (days)", value=365, minimum=0) | |
| with gr.Row(): | |
| predict_btn = gr.Button("🔍 Check for Fraud", variant="primary", size="lg") | |
| clear_btn = gr.ClearButton() | |
| with gr.Column(): | |
| gr.Markdown("### Fraud Analysis Results") | |
| probability_output = gr.Markdown(label="Fraud Probability") | |
| risk_output = gr.Markdown(label="Risk Level") | |
| decision_output = gr.Markdown(label="Decision") | |
| details_output = gr.Markdown(label="Analysis Details") | |
| gr.Markdown("### Try These Examples") | |
| gr.Examples( | |
| examples=[ | |
| legitimate_example + ["Legitimate Transaction - Normal spending pattern"], | |
| fraudulent_example + ["Suspicious Transaction - Multiple fraud indicators"] | |
| ], | |
| inputs=[ | |
| amount, time_of_day, day_of_week, distance_from_home, | |
| distance_from_last_transaction, time_since_last_transaction, | |
| num_transactions_today, num_transactions_last_week, | |
| merchant_category, is_online, card_present, is_international, | |
| avg_transaction_amount, account_age_days, | |
| gr.Textbox(visible=False) # Description (hidden) | |
| ], | |
| label="Click to load example" | |
| ) | |
| # Button actions | |
| predict_btn.click( | |
| fn=predict_fraud, | |
| inputs=[ | |
| amount, time_of_day, day_of_week, distance_from_home, | |
| distance_from_last_transaction, time_since_last_transaction, | |
| num_transactions_today, num_transactions_last_week, | |
| merchant_category, is_online, card_present, is_international, | |
| avg_transaction_amount, account_age_days | |
| ], | |
| outputs=[probability_output, risk_output, decision_output, details_output] | |
| ) | |
| gr.Markdown(""" | |
| --- | |
| ### About This Model | |
| This fraud detection system uses a Random Forest classifier trained on 100,000 transactions with 31 engineered features. | |
| **Key Features Analyzed:** | |
| - Transaction amount and patterns | |
| - Time of day and day of week | |
| - Location and distance traveled | |
| - Transaction velocity and frequency | |
| - Merchant type and transaction mode | |
| - Account age and history | |
| **Disclaimer:** This is a demonstration model trained on synthetic data. For production use, train on real transaction data and implement proper security measures. | |
| 📚 [Full Documentation](https://huggingface.co/YOUR_USERNAME/credit-card-fraud-detector) | 💻 [GitHub Repository](https://github.com/YOUR_USERNAME/fraud-detection) | |
| """) | |
| # Launch | |
| if __name__ == "__main__": | |
| demo.launch() |