import gradio as gr import pandas as pd import numpy as np from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix import pickle import os # Global variables to store the model and data model = None feature_columns = None def load_and_train_model(csv_file): """Load dataset and train a Random Forest model""" global model, feature_columns try: # Read the uploaded CSV df = pd.read_csv(csv_file.name) # Check if 'fraud' column exists if 'fraud' not in df.columns: return "โŒ Error: CSV must contain a 'fraud' column as the target variable." # Separate features and target X = df.drop(['fraud', 'transaction_id'], axis=1, errors='ignore') y = df['fraud'] feature_columns = X.columns.tolist() # Split data X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) # Train Random Forest model model = RandomForestClassifier(n_estimators=100, random_state=42, max_depth=10) model.fit(X_train, y_train) # Evaluate y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) cm = confusion_matrix(y_test, y_pred) # Format results results = f""" โœ… **Model Trained Successfully!** ๐Ÿ“Š **Dataset Information:** - Total Samples: {len(df)} - Training Samples: {len(X_train)} - Test Samples: {len(X_test)} - Fraud Cases: {y.sum()} ({y.mean()*100:.1f}%) - Legitimate Cases: {(y==0).sum()} ({(y==0).mean()*100:.1f}%) ๐Ÿ“ˆ **Model Performance:** - **Accuracy:** {accuracy*100:.2f}% - **Precision:** {precision*100:.2f}% - **Recall:** {recall*100:.2f}% - **F1-Score:** {f1*100:.2f}% ๐Ÿ”ข **Confusion Matrix:** ``` Predicted Fraud Legitimate Actual Fraud {cm[1][1]} {cm[1][0]} Legit {cm[0][1]} {cm[0][0]} ``` **Key Metrics Explained:** - **True Positives (TP):** {cm[1][1]} frauds correctly detected - **False Negatives (FN):** {cm[1][0]} frauds missed (โš ๏ธ costly!) - **False Positives (FP):** {cm[0][1]} false alarms - **True Negatives (TN):** {cm[0][0]} legitimate transactions correctly identified โœ… Model is ready! You can now make predictions below. """ return results except Exception as e: return f"โŒ Error: {str(e)}" def predict_single_transaction(amount, hour, dist_home, dist_last, ratio_median, repeat_retailer, used_chip, used_pin, online_order): """Make a prediction for a single transaction""" global model, feature_columns if model is None: return "โš ๏ธ Please upload and train a model first!", "" try: # Create input dataframe input_data = pd.DataFrame({ 'transaction_amount': [amount], 'transaction_hour': [hour], 'distance_from_home_km': [dist_home], 'distance_from_last_transaction_km': [dist_last], 'ratio_to_median_purchase': [ratio_median], 'repeat_retailer': [repeat_retailer], 'used_chip': [used_chip], 'used_pin': [used_pin], 'online_order': [online_order] }) # Make prediction prediction = model.predict(input_data)[0] probability = model.predict_proba(input_data)[0] # Format result fraud_prob = probability[1] * 100 legit_prob = probability[0] * 100 if prediction == 1: result = f"๐Ÿšจ **FRAUD DETECTED**" confidence = fraud_prob color = "red" else: result = f"โœ… **LEGITIMATE TRANSACTION**" confidence = legit_prob color = "green" details = f""" {result} **Confidence:** {confidence:.1f}% **Probability Distribution:** - Fraud: {fraud_prob:.1f}% - Legitimate: {legit_prob:.1f}% **Risk Level:** {'๐Ÿ”ด HIGH' if fraud_prob > 70 else '๐ŸŸก MEDIUM' if fraud_prob > 40 else '๐ŸŸข LOW'} **Transaction Details:** - Amount: ${amount:,.2f} - Time: {hour}:00 - Distance from home: {dist_home:.1f} km - Distance from last transaction: {dist_last:.1f} km - Ratio to median: {ratio_median:.2f}x - Repeat retailer: {'Yes' if repeat_retailer else 'No'} - Used chip: {'Yes' if used_chip else 'No'} - Used PIN: {'Yes' if used_pin else 'No'} - Online order: {'Yes' if online_order else 'No'} """ return details, result except Exception as e: return f"โŒ Error: {str(e)}", "" def predict_batch(csv_file): """Make predictions for batch of transactions""" global model, feature_columns if model is None: return None, "โš ๏ธ Please upload and train a model first!" try: # Read CSV df = pd.read_csv(csv_file.name) # Keep original df for output original_df = df.copy() # Prepare features X = df.drop(['fraud', 'transaction_id'], axis=1, errors='ignore') # Make predictions predictions = model.predict(X) probabilities = model.predict_proba(X) # Add predictions to dataframe original_df['predicted_fraud'] = predictions original_df['fraud_probability'] = probabilities[:, 1] * 100 original_df['confidence'] = np.max(probabilities, axis=1) * 100 # Calculate metrics if 'fraud' column exists if 'fraud' in original_df.columns: accuracy = accuracy_score(original_df['fraud'], predictions) precision = precision_score(original_df['fraud'], predictions) recall = recall_score(original_df['fraud'], predictions) f1 = f1_score(original_df['fraud'], predictions) metrics = f""" ๐Ÿ“Š **Batch Prediction Results:** - Total Transactions: {len(df)} - Predicted Fraud: {predictions.sum()} ({predictions.mean()*100:.1f}%) - Predicted Legitimate: {(predictions==0).sum()} ({(predictions==0).mean()*100:.1f}%) ๐Ÿ“ˆ **Performance Metrics:** - Accuracy: {accuracy*100:.2f}% - Precision: {precision*100:.2f}% - Recall: {recall*100:.2f}% - F1-Score: {f1*100:.2f}% โœ… Results are ready for download! """ else: metrics = f""" ๐Ÿ“Š **Batch Prediction Results:** - Total Transactions: {len(df)} - Predicted Fraud: {predictions.sum()} ({predictions.mean()*100:.1f}%) - Predicted Legitimate: {(predictions==0).sum()} ({(predictions==0).mean()*100:.1f}%) โœ… Results are ready for download! """ # Save results to temporary CSV output_file = "predictions_output.csv" original_df.to_csv(output_file, index=False) return output_file, metrics except Exception as e: return None, f"โŒ Error: {str(e)}" def calculate_business_impact(total_transactions, fraud_rate_percent, precision, recall, fraud_loss_per_transaction, review_cost_per_transaction): """Calculate the financial business impact of a fraud detection model""" try: # Convert fraud rate to decimal fraud_rate = fraud_rate_percent / 100 # Calculate actual frauds in the dataset total_frauds = int(total_transactions * fraud_rate) total_legitimate = total_transactions - total_frauds # Calculate confusion matrix components # Recall = TP / (TP + FN) = TP / total_frauds # So: TP = recall * total_frauds true_positives = int(recall * total_frauds) false_negatives = total_frauds - true_positives # Precision = TP / (TP + FP) # So: FP = TP / precision - TP = TP * (1/precision - 1) false_positives = int(true_positives / precision - true_positives) if precision > 0 else 0 true_negatives = total_legitimate - false_positives # Calculate financial impact # Frauds caught (prevented losses) fraud_losses_prevented = true_positives * fraud_loss_per_transaction # Frauds missed (actual losses) fraud_losses_incurred = false_negatives * fraud_loss_per_transaction # Review costs (for all flagged transactions) total_flagged = true_positives + false_positives total_review_costs = total_flagged * review_cost_per_transaction # Net benefit net_benefit = fraud_losses_prevented - fraud_losses_incurred - total_review_costs # Without model (baseline - all frauds go through) baseline_losses = total_frauds * fraud_loss_per_transaction savings_vs_baseline = baseline_losses - fraud_losses_incurred - total_review_costs # Calculate percentages fraud_detection_rate = (true_positives / total_frauds * 100) if total_frauds > 0 else 0 false_positive_rate = (false_positives / total_legitimate * 100) if total_legitimate > 0 else 0 # Format results results = f""" ## ๐Ÿ’ฐ Business Impact Analysis ### ๐Ÿ“Š Transaction Breakdown - **Total Transactions:** {total_transactions:,} per month - **Actual Frauds:** {total_frauds:,} ({fraud_rate_percent:.2f}%) - **Legitimate Transactions:** {total_legitimate:,} ({100-fraud_rate_percent:.2f}%) ### ๐ŸŽฏ Model Performance - **Precision:** {precision*100:.1f}% (of flagged, {precision*100:.1f}% are actually fraud) - **Recall:** {recall*100:.1f}% (catches {recall*100:.1f}% of all frauds) ### ๐Ÿ” Detection Results - **โœ… True Positives (Frauds Caught):** {true_positives:,} ({fraud_detection_rate:.1f}% of frauds) - **โŒ False Negatives (Frauds Missed):** {false_negatives:,} ({100-fraud_detection_rate:.1f}% of frauds) - **โš ๏ธ False Positives (False Alarms):** {false_positives:,} ({false_positive_rate:.2f}% of legitimate) - **โœ… True Negatives (Correctly Allowed):** {true_negatives:,} ### ๐Ÿ’ต Financial Impact (Monthly) **Fraud Prevention:** - **Losses Prevented:** ${fraud_losses_prevented:,.2f} - ({true_positives:,} frauds caught ร— ${fraud_loss_per_transaction:,.2f}) **Losses Incurred:** - **Missed Fraud Losses:** ${fraud_losses_incurred:,.2f} - ({false_negatives:,} frauds missed ร— ${fraud_loss_per_transaction:,.2f}) **Operational Costs:** - **Manual Review Costs:** ${total_review_costs:,.2f} - ({total_flagged:,} flagged transactions ร— ${review_cost_per_transaction:,.2f}) ### ๐Ÿ“ˆ **Net Benefit: ${net_benefit:,.2f} per month** ### ๐ŸŽฏ **Primary Benefit:** **The model saves ${savings_vs_baseline:,.2f} per month compared to having no fraud detection system.** **Annual Impact:** ${net_benefit * 12:,.2f} ### ๐Ÿ“Š Key Insights: 1. **Fraud Detection Rate:** {fraud_detection_rate:.1f}% of frauds are caught 2. **Cost Efficiency:** Every ${total_review_costs/fraud_losses_prevented:.2f} spent on reviews prevents ${fraud_loss_per_transaction:.2f} in fraud 3. **ROI:** {((net_benefit / total_review_costs) * 100) if total_review_costs > 0 else 0:.1f}% return on review investment 4. **Remaining Risk:** {false_negatives:,} frauds still slip through (${fraud_losses_incurred:,.2f} in losses) ### โš ๏ธ Recommendations: - **Current Recall ({recall*100:.1f}%):** Missing {false_negatives:,} frauds costs ${fraud_losses_incurred:,.2f}/month - Consider improving recall to reduce missed frauds - Balance precision to control review costs """ return results except Exception as e: return f"โŒ Error calculating business impact: {str(e)}" def analyze_model_drift(initial_precision, current_precision, months_deployed, initial_recall, current_recall): """Analyze model drift and provide recommendations""" try: precision_drop = initial_precision - current_precision precision_drop_pct = (precision_drop / initial_precision * 100) if initial_precision > 0 else 0 recall_change = current_recall - initial_recall recall_change_pct = (recall_change / initial_recall * 100) if initial_recall > 0 else 0 # Determine severity if precision_drop_pct > 20: severity = "๐Ÿ”ด CRITICAL" urgency = "Immediate action required" elif precision_drop_pct > 10: severity = "๐ŸŸ  HIGH" urgency = "Action needed within 1-2 weeks" else: severity = "๐ŸŸก MODERATE" urgency = "Monitor closely, plan retraining" # Most likely causes (in order of probability) causes = [] if precision_drop_pct > 15: causes.append({ "rank": 1, "cause": "**Data Drift / Distribution Shift**", "description": "The statistical distribution of incoming transactions has changed. Legitimate customer behavior patterns have shifted (e.g., new spending habits, new products, seasonal changes, post-pandemic behavior changes).", "probability": "Very High (80-90%)" }) else: causes.append({ "rank": 1, "cause": "**Data Drift / Distribution Shift**", "description": "Gradual changes in transaction patterns over time.", "probability": "High (70-80%)" }) causes.append({ "rank": 2, "cause": "**Concept Drift**", "description": "The relationship between features and fraud has changed. Fraudsters have adapted their tactics to evade detection, or new fraud patterns have emerged that weren't in training data.", "probability": "Medium-High (50-60%)" }) causes.append({ "rank": 3, "cause": "**Feature Drift**", "description": "Individual features have changed meaning or distribution. Examples: new payment methods, changes in merchant categories, updated transaction processing systems.", "probability": "Medium (30-40%)" }) causes.append({ "rank": 4, "cause": "**Label Quality Issues**", "description": "Ground truth labels may have become less accurate, or fraud definition has changed. This is less common but can cause apparent precision drops.", "probability": "Low (10-20%)" }) # Appropriate actions actions = [ { "priority": "๐Ÿ”ด IMMEDIATE", "action": "**Data Distribution Analysis**", "steps": [ "Compare feature distributions of recent data vs training data", "Use statistical tests (KS test, PSI - Population Stability Index)", "Identify which features have drifted most significantly", "Check for missing values, outliers, or data quality issues" ] }, { "priority": "๐Ÿ”ด IMMEDIATE", "action": "**Model Retraining**", "steps": [ "Collect recent labeled data (last 1-3 months)", "Retrain model with updated dataset", "Use time-based train/test splits (not random)", "Consider ensemble with older model for stability", "Validate on holdout set before deployment" ] }, { "priority": "๐ŸŸ  HIGH", "action": "**Implement Monitoring**", "steps": [ "Set up automated drift detection (PSI, feature drift alerts)", "Track precision/recall on rolling windows (daily/weekly)", "Monitor false positive rate trends", "Alert when metrics drop below thresholds", "Dashboard for real-time model health" ] }, { "priority": "๐ŸŸ  HIGH", "action": "**Threshold Adjustment**", "steps": [ "Temporarily adjust classification threshold to maintain precision", "Use probability scores instead of binary predictions", "Implement adaptive thresholds based on recent performance", "Balance precision vs recall based on business needs" ] }, { "priority": "๐ŸŸก MEDIUM", "action": "**Feature Engineering Updates**", "steps": [ "Review and update feature engineering logic", "Add new features that capture current fraud patterns", "Remove obsolete features", "Consider interaction features or time-based features" ] }, { "priority": "๐ŸŸก MEDIUM", "action": "**Continuous Learning Pipeline**", "steps": [ "Implement periodic retraining schedule (monthly/quarterly)", "Use online learning or incremental updates if applicable", "A/B test new model versions before full deployment", "Maintain model versioning and rollback capability" ] } ] # Calculate impact # Assuming same parameters as before for impact calculation # This is a simplified impact - in reality you'd need full business params impact_note = "โš ๏ธ Lower precision means more false positives, increasing review costs and customer friction." # Format results results = f""" ## ๐Ÿ” Model Drift Analysis ### ๐Ÿ“‰ Performance Degradation - **Initial Precision:** {initial_precision*100:.1f}% - **Current Precision:** {current_precision*100:.1f}% - **Precision Drop:** {precision_drop*100:.1f} percentage points ({precision_drop_pct:.1f}% relative decrease) - **Deployment Duration:** {months_deployed} months - **Initial Recall:** {initial_recall*100:.1f}% - **Current Recall:** {current_recall*100:.1f}% - **Recall Change:** {recall_change*100:+.1f} percentage points ({recall_change_pct:+.1f}% relative change) ### {severity} - {urgency} --- ## ๐ŸŽฏ Most Likely Cause ### {causes[0]['rank']}. {causes[0]['cause']} **Probability:** {causes[0]['probability']} **Explanation:** {causes[0]['description']} **Why This Matters:** - Lower precision = More false positives - More legitimate transactions flagged for review - Increased operational costs and customer friction - Model is becoming less reliable over time --- ## ๐Ÿ”ง Appropriate Actions (Priority Order) """ for action in actions: results += f""" ### {action['priority']} {action['action']} """ for i, step in enumerate(action['steps'], 1): results += f"{i}. {step}\n" results += "\n" results += f""" --- ## ๐Ÿ“Š Additional Considerations ### Why Precision Drops Are Critical: 1. **Financial Impact:** More false positives = higher review costs 2. **Customer Experience:** Legitimate customers face more friction 3. **Operational Burden:** Review teams overwhelmed with false alarms 4. **Trust Erosion:** Model loses credibility if too many false alarms ### Prevention Strategy: - **Proactive Monitoring:** Don't wait for metrics to drop - **Regular Retraining:** Schedule periodic model updates (every 1-3 months) - **Data Quality:** Ensure incoming data matches training data characteristics - **Feedback Loops:** Incorporate labeled outcomes back into training data ### Expected Timeline: - **Immediate (Week 1):** Data analysis, threshold adjustment - **Short-term (Weeks 2-4):** Model retraining, validation - **Long-term (Ongoing):** Continuous monitoring, scheduled retraining --- ## ๐Ÿ’ก Key Takeaway **The most likely cause is DATA DRIFT** - your model was trained on data from 3+ months ago, and transaction patterns have changed. The model needs to be retrained on recent data to adapt to current patterns. **Action:** Implement a retraining pipeline with recent labeled data and set up continuous monitoring to catch drift early. """ return results except Exception as e: return f"โŒ Error analyzing model drift: {str(e)}" # Create Gradio interface with gr.Blocks(title="Fraud Detection System") as demo: gr.Markdown(""" # ๐Ÿ’ณ Credit Card Fraud Detection System ### AI Infinity Programme | TalentSprint This interactive demo allows you to train a fraud detection model and make predictions on credit card transactions. **How to use:** 1. Upload your training dataset (CSV file) 2. Train the model 3. Make single predictions or batch predictions """) with gr.Tab("๐Ÿ“ค Upload & Train Model"): gr.Markdown("### Step 1: Upload Training Dataset") gr.Markdown("Upload a CSV file containing transaction data with a 'fraud' column (0 = legitimate, 1 = fraud)") with gr.Row(): with gr.Column(): train_file = gr.File(label="Upload Training CSV", file_types=[".csv"]) train_button = gr.Button("๐Ÿš€ Train Model", variant="primary", size="lg") with gr.Column(): train_output = gr.Markdown(label="Training Results") train_button.click( fn=load_and_train_model, inputs=[train_file], outputs=[train_output] ) gr.Markdown(""" --- **Expected CSV format:** - `transaction_amount`, `transaction_hour`, `distance_from_home_km`, `distance_from_last_transaction_km`, - `ratio_to_median_purchase`, `repeat_retailer`, `used_chip`, `used_pin`, `online_order`, `fraud` """) with gr.Tab("๐Ÿ” Single Prediction"): gr.Markdown("### Test Individual Transactions") gr.Markdown("Enter transaction details to check if it's fraudulent") with gr.Row(): with gr.Column(): amount = gr.Number(label="Transaction Amount ($)", value=100) hour = gr.Slider(0, 23, step=1, label="Transaction Hour (0-23)", value=14) dist_home = gr.Number(label="Distance from Home (km)", value=10) dist_last = gr.Number(label="Distance from Last Transaction (km)", value=5) ratio_median = gr.Number(label="Ratio to Median Purchase", value=1.0) with gr.Column(): repeat_retailer = gr.Checkbox(label="Repeat Retailer", value=True) used_chip = gr.Checkbox(label="Used Chip", value=True) used_pin = gr.Checkbox(label="Used PIN", value=True) online_order = gr.Checkbox(label="Online Order", value=False) predict_button = gr.Button("๐Ÿ”ฎ Predict", variant="primary", size="lg") with gr.Row(): prediction_output = gr.Markdown(label="Prediction Result") prediction_label = gr.Markdown(label="Quick Result") predict_button.click( fn=predict_single_transaction, inputs=[amount, hour, dist_home, dist_last, ratio_median, repeat_retailer, used_chip, used_pin, online_order], outputs=[prediction_output, prediction_label] ) gr.Markdown("---") gr.Markdown("### ๐Ÿงช Quick Test Scenarios") with gr.Row(): gr.Markdown(""" **Scenario 1: Obvious Fraud** - Amount: $4500, Hour: 3, Dist Home: 800km - New retailer, no chip/PIN, online """) gr.Markdown(""" **Scenario 2: Normal Transaction** - Amount: $45, Hour: 14, Dist Home: 5km - Repeat retailer, chip + PIN, in-person """) gr.Markdown(""" **Scenario 3: Suspicious** - Amount: $350, Hour: 22, Dist Home: 60km - New retailer, chip but no PIN, online """) with gr.Tab("๐Ÿ“Š Batch Predictions"): gr.Markdown("### Upload Multiple Transactions") gr.Markdown("Upload a CSV file with multiple transactions to get predictions for all of them") with gr.Row(): with gr.Column(): batch_file = gr.File(label="Upload Test CSV", file_types=[".csv"]) batch_button = gr.Button("๐Ÿ“ˆ Predict Batch", variant="primary", size="lg") with gr.Column(): batch_output = gr.Markdown(label="Batch Results") download_file = gr.File(label="Download Results CSV") batch_button.click( fn=predict_batch, inputs=[batch_file], outputs=[download_file, batch_output] ) with gr.Tab("๐Ÿ’ฐ Business Impact Calculator"): gr.Markdown("### Calculate Financial Impact of Your Fraud Detection Model") gr.Markdown("Enter your model's performance metrics and business parameters to see the financial impact") with gr.Row(): with gr.Column(): gr.Markdown("#### ๐Ÿ“Š Model Performance Metrics") precision_input = gr.Slider(0, 1, step=0.01, value=0.85, label="Precision (0-1)", info="Of flagged transactions, what % are actually fraud?") recall_input = gr.Slider(0, 1, step=0.01, value=0.90, label="Recall (0-1)", info="Of all frauds, what % does the model catch?") gr.Markdown("#### ๐Ÿฆ Business Parameters") total_transactions = gr.Number(label="Total Transactions per Month", value=1000000, precision=0) fraud_rate = gr.Slider(0, 10, step=0.01, value=1.0, label="Fraud Rate (%)", info="Percentage of transactions that are fraudulent") gr.Markdown("#### ๐Ÿ’ต Cost Parameters") fraud_loss = gr.Number(label="Average Fraud Loss per Transaction ($)", value=500, precision=2) review_cost = gr.Number(label="Manual Review Cost per Flagged Transaction ($)", value=2.00, precision=2) calc_button = gr.Button("๐Ÿ’ฐ Calculate Business Impact", variant="primary", size="lg") with gr.Column(): impact_output = gr.Markdown(label="Business Impact Analysis") calc_button.click( fn=calculate_business_impact, inputs=[total_transactions, fraud_rate, precision_input, recall_input, fraud_loss, review_cost], outputs=[impact_output] ) gr.Markdown("---") gr.Markdown(""" ### ๐Ÿ“š How to Use This Calculator **Example Scenario:** - Bank processes 1 million transactions/month - Model has 85% precision and 90% recall - 1% of transactions are fraudulent - Average fraud loss: $500 per transaction - Manual review cost: $2 per flagged transaction **What This Calculates:** 1. **True Positives:** Frauds caught by the model 2. **False Negatives:** Frauds missed (costly!) 3. **False Positives:** Legitimate transactions flagged (review costs) 4. **Net Benefit:** Total financial impact of using the model **Key Insight:** The primary benefit is the **net savings** compared to having no fraud detection system. """) with gr.Tab("๐Ÿ“‰ Model Drift Analysis"): gr.Markdown("### Analyze Model Performance Degradation") gr.Markdown("If your model's precision or recall has dropped over time, use this tool to identify likely causes and appropriate actions") with gr.Row(): with gr.Column(): gr.Markdown("#### ๐Ÿ“Š Initial Performance (At Deployment)") initial_precision = gr.Slider(0, 1, step=0.01, value=0.85, label="Initial Precision", info="Model precision when first deployed") initial_recall = gr.Slider(0, 1, step=0.01, value=0.90, label="Initial Recall", info="Model recall when first deployed") gr.Markdown("#### ๐Ÿ“‰ Current Performance (Now)") current_precision = gr.Slider(0, 1, step=0.01, value=0.70, label="Current Precision", info="Model precision after deployment period") current_recall = gr.Slider(0, 1, step=0.01, value=0.90, label="Current Recall", info="Model recall now (may have changed)") gr.Markdown("#### โฑ๏ธ Deployment Information") months_deployed = gr.Number(label="Months Since Deployment", value=3, precision=1, info="How long has the model been in production?") analyze_button = gr.Button("๐Ÿ” Analyze Model Drift", variant="primary", size="lg") with gr.Column(): drift_output = gr.Markdown(label="Drift Analysis & Recommendations") analyze_button.click( fn=analyze_model_drift, inputs=[initial_precision, current_precision, months_deployed, initial_recall, current_recall], outputs=[drift_output] ) gr.Markdown("---") gr.Markdown(""" ### ๐Ÿ“š Understanding Model Drift **What is Model Drift?** Model drift occurs when a machine learning model's performance degrades over time because the data it encounters in production differs from the data it was trained on. **Common Scenarios:** - **Precision drops from 85% to 70%** โ†’ More false positives (legitimate transactions flagged) - **Recall drops** โ†’ More frauds missed (false negatives) - **Both drop** โ†’ Model is becoming unreliable **Why It Happens:** 1. Customer behavior changes (new spending patterns, seasonal trends) 2. Fraudsters adapt their tactics 3. New products/services introduced 4. Changes in transaction processing systems 5. External factors (economic changes, regulations) **Example:** After 3 months, precision drops from 85% to 70%. This means: - Previously: 85 out of 100 flagged transactions were fraud - Now: Only 70 out of 100 flagged transactions are fraud - **30% increase in false positives** = Higher review costs, customer friction """) with gr.Tab("โ„น๏ธ About"): gr.Markdown(""" ## About This Demo This fraud detection system uses a **Random Forest Classifier** to identify potentially fraudulent credit card transactions. ### Features Used: 1. **transaction_amount**: Transaction value in dollars 2. **transaction_hour**: Hour of day (0-23) 3. **distance_from_home_km**: Distance from cardholder's home 4. **distance_from_last_transaction_km**: Distance from previous transaction 5. **ratio_to_median_purchase**: Ratio compared to typical spending 6. **repeat_retailer**: Whether customer used this merchant before 7. **used_chip**: Whether chip card was used 8. **used_pin**: Whether PIN was entered 9. **online_order**: Whether transaction was online ### Model Performance: The model is trained to maximize **recall** (catching frauds) while maintaining reasonable **precision** (avoiding false alarms). ### Important Metrics: - **Precision**: Of flagged transactions, how many are actually fraud? - **Recall**: Of all frauds, how many do we catch? - **F1-Score**: Balance between precision and recall ### Business Impact: - **False Negative (missed fraud)**: Very costly - customer loses money - **False Positive (false alarm)**: Moderately costly - customer inconvenience --- **Created for:** AI Infinity Programme | TalentSprint **Target Audience:** Software engineers transitioning to AI roles **Educational Purpose:** Understanding classification, metrics, and business logic """) # Launch the app if __name__ == "__main__": demo.launch()