<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ali Ahmad</title>
    <description>The latest articles on DEV Community by Ali Ahmad (@whozahm3d).</description>
    <link>https://dev.to/whozahm3d</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3971397%2F7d716beb-9f6e-4fe0-bdfe-f75efb9cbbde.jpeg</url>
      <title>DEV Community: Ali Ahmad</title>
      <link>https://dev.to/whozahm3d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/whozahm3d"/>
    <language>en</language>
    <item>
      <title>I Built a Fraud Detection System That Catches 99.76% of Fraud — Here's Everything I Learned</title>
      <dc:creator>Ali Ahmad</dc:creator>
      <pubDate>Sat, 06 Jun 2026 14:58:44 +0000</pubDate>
      <link>https://dev.to/whozahm3d/i-built-a-fraud-detection-system-that-catches-9976-of-fraud-heres-everything-i-learned-55h3</link>
      <guid>https://dev.to/whozahm3d/i-built-a-fraud-detection-system-that-catches-9976-of-fraud-heres-everything-i-learned-55h3</guid>
      <description>&lt;p&gt;There is a number that haunts every fraud detection engineer: &lt;strong&gt;0.13%&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is the fraud rate in the PaySim dataset — 8,213 fraudulent transactions buried inside 6,362,620 legitimate ones. It sounds small. It is not. At that ratio, a model that predicts "legitimate" for every single transaction achieves &lt;strong&gt;99.87% accuracy&lt;/strong&gt; — and catches exactly zero fraud.&lt;/p&gt;

&lt;p&gt;This is the problem I set out to solve with TrustGuard AI, a course project that turned into one of the most technically demanding things I have built. By the end of it, our deployed XGBoost model achieves &lt;strong&gt;AUC-ROC of 0.9995&lt;/strong&gt; and &lt;strong&gt;Recall of 0.9976&lt;/strong&gt; — meaning it catches 99.76% of all fraud on a 6.3 million row test set. It also explains every single prediction using SHAP, and grounds each fraud alert in real State Bank of Pakistan regulatory documents through a RAG pipeline.&lt;/p&gt;

&lt;p&gt;This article is the full story — what worked, what broke, and why accuracy is the wrong metric for fraud detection.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem With Accuracy
&lt;/h2&gt;

&lt;p&gt;Before writing a single line of code, I want to be clear about why standard accuracy is useless here.&lt;/p&gt;

&lt;p&gt;The dataset has 6,362,620 transactions. Of those, 8,213 are fraud. If I build a model that always predicts "legitimate," here is its scorecard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Accuracy  = 99.87%
Precision = 0
Recall    = 0
F1        = 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A perfect-looking accuracy score on a model that is completely blind to fraud. This is why TrustGuard optimises for &lt;strong&gt;Recall&lt;/strong&gt; (catching fraud), &lt;strong&gt;Average Precision / AUPRC&lt;/strong&gt; (area under the precision-recall curve), and &lt;strong&gt;AUC-ROC&lt;/strong&gt; — not accuracy. Accuracy is literally a deceptive metric on imbalanced data.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Dataset
&lt;/h2&gt;

&lt;p&gt;TrustGuard uses the &lt;strong&gt;PaySim synthetic dataset&lt;/strong&gt; — a mobile money transaction log generated by a multi-agent simulation calibrated against real financial data. It spans 30 simulated days at hourly granularity.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Property&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Total Transactions&lt;/td&gt;
&lt;td&gt;6,362,620&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fraud Cases&lt;/td&gt;
&lt;td&gt;8,213&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fraud Rate&lt;/td&gt;
&lt;td&gt;0.13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transaction Types&lt;/td&gt;
&lt;td&gt;CASH_OUT, TRANSFER, PAYMENT, DEBIT, CASH_IN&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One of the first insights from EDA: &lt;strong&gt;fraud is not spread across all transaction types&lt;/strong&gt;. It is confined exclusively to &lt;code&gt;CASH_OUT&lt;/code&gt; and &lt;code&gt;TRANSFER&lt;/code&gt;. This makes structural sense — fraud follows the account-drain pattern: transfer funds to a mule account, then cash out. &lt;code&gt;PAYMENT&lt;/code&gt;, &lt;code&gt;DEBIT&lt;/code&gt;, and &lt;code&gt;CASH_IN&lt;/code&gt; are clean.&lt;/p&gt;

&lt;p&gt;This single observation shaped the entire feature engineering approach.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Class Imbalance Problem — and Why SMOTE Alone Fails
&lt;/h2&gt;

&lt;p&gt;At 0.13% fraud rate, SMOTE alone is not enough. Here is why.&lt;/p&gt;

&lt;p&gt;With 5-fold cross-validation, some training folds can contain fewer than 10 actual fraud samples. SMOTE generates synthetic minority samples by interpolating between existing ones — but if there are only a handful of real fraud cases in a fold, SMOTE degenerates. The synthetic samples cluster too tightly and the model learns nothing useful.&lt;/p&gt;

&lt;p&gt;TrustGuard uses a &lt;strong&gt;two-stage imbalance strategy&lt;/strong&gt;:&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1 — Fraud Simulation Engine
&lt;/h3&gt;

&lt;p&gt;Before any train-test split, I apply a deterministic fraud injection step:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sample 5% of all legitimate &lt;code&gt;TRANSFER&lt;/code&gt; and &lt;code&gt;CASH_OUT&lt;/code&gt; transactions&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;amount = oldbalanceOrg&lt;/code&gt; (full account drain)&lt;/li&gt;
&lt;li&gt;Set &lt;code&gt;newbalanceOrig = 0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Recompute &lt;code&gt;balanceDiff&lt;/code&gt; and &lt;code&gt;amount_ratio&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Label as fraud and append to the dataset&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Fraud rate rises from 0.13% → 1.26%.&lt;/p&gt;

&lt;p&gt;The ablation study confirmed this was the single most important component in the pipeline. Removing it dropped CV F1 from 0.947 to 0.671 — a 29% relative reduction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2 — SMOTE Inside ImbPipeline
&lt;/h3&gt;

&lt;p&gt;After the 80/20 stratified train-test split, SMOTE (&lt;code&gt;sampling_strategy=0.3&lt;/code&gt;) is applied &lt;strong&gt;inside an ImbPipeline per cross-validation fold&lt;/strong&gt;. This is critical — SMOTE is fitted only on the training portion of each fold. The validation fold never sees synthetic samples. This prevents data leakage.&lt;/p&gt;

&lt;p&gt;The final training distribution: &lt;strong&gt;23.07% fraud&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Fraud Rate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Original Dataset&lt;/td&gt;
&lt;td&gt;0.13%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After Fraud Simulation&lt;/td&gt;
&lt;td&gt;1.26%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;After SMOTE (training folds)&lt;/td&gt;
&lt;td&gt;23.07%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Feature Engineering
&lt;/h2&gt;

&lt;p&gt;After cleaning, 12 features go into the model. The two most important are engineered:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;balanceDiff&lt;/code&gt;&lt;/strong&gt; = &lt;code&gt;oldbalanceOrg − newbalanceOrig − amount&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This detects balance inconsistencies. In a legitimate transaction, money flows normally. In an account-drain fraud, this value becomes anomalous.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;amount_ratio&lt;/code&gt;&lt;/strong&gt; = &lt;code&gt;amount / (oldbalanceOrg + 1)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This approaches 1.0 in full account-drain attacks. For routine transfers it stays near zero.&lt;/p&gt;

&lt;p&gt;The ablation confirmed their necessity: removing both dropped Test F1 from 0.5533 to 0.1538 and Test AP from 0.7317 to 0.6061. Without them, the model is nearly blind.&lt;/p&gt;




&lt;h2&gt;
  
  
  Training Four Models
&lt;/h2&gt;

&lt;p&gt;All four models were trained identically inside an &lt;code&gt;ImbPipeline(SMOTE → StandardScaler → Classifier)&lt;/code&gt; with 5-fold stratified cross-validation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-Validation Results:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;CV F1&lt;/th&gt;
&lt;th&gt;CV AUC-ROC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;XGBoost&lt;/td&gt;
&lt;td&gt;0.949 ± 0.020&lt;/td&gt;
&lt;td&gt;1.000 ± 0.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neural Network&lt;/td&gt;
&lt;td&gt;0.793 ± 0.061&lt;/td&gt;
&lt;td&gt;0.999 ± 0.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random Forest&lt;/td&gt;
&lt;td&gt;0.711 ± 0.007&lt;/td&gt;
&lt;td&gt;0.999 ± 0.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logistic Regression&lt;/td&gt;
&lt;td&gt;0.249 ± 0.003&lt;/td&gt;
&lt;td&gt;0.977 ± 0.001&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Test Set Results:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Test Recall&lt;/th&gt;
&lt;th&gt;Test AUC&lt;/th&gt;
&lt;th&gt;Test Avg Precision&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;XGBoost&lt;/td&gt;
&lt;td&gt;0.9976&lt;/td&gt;
&lt;td&gt;0.9995&lt;/td&gt;
&lt;td&gt;0.9358&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Random Forest&lt;/td&gt;
&lt;td&gt;0.9976&lt;/td&gt;
&lt;td&gt;0.9995&lt;/td&gt;
&lt;td&gt;0.8870&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Neural Network&lt;/td&gt;
&lt;td&gt;0.9732&lt;/td&gt;
&lt;td&gt;0.9983&lt;/td&gt;
&lt;td&gt;0.7081&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logistic Regression&lt;/td&gt;
&lt;td&gt;0.9860&lt;/td&gt;
&lt;td&gt;0.9946&lt;/td&gt;
&lt;td&gt;0.5567&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;XGBoost dominates across every metric. Its Test Average Precision (0.9358) is 3.8× higher than Logistic Regression at comparable recall. XGBoost was selected for deployment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why XGBoost? The Hyperparameter Story
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;n_estimators&lt;/th&gt;
&lt;th&gt;CV F1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;0.921&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;0.938&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;td&gt;0.949&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;More trees, lower learning rate (0.05), better generalisation. Max depth of 6 over 8 to avoid overfitting on fold-specific patterns.&lt;/p&gt;




&lt;h2&gt;
  
  
  Explainability with SHAP
&lt;/h2&gt;

&lt;p&gt;A fraud detection system that says "this transaction is fraud" without explaining why is not useful to an analyst — and not acceptable to a regulator.&lt;/p&gt;

&lt;p&gt;TrustGuard implements &lt;strong&gt;SHAP TreeExplainer&lt;/strong&gt;, which computes exact Shapley values for each prediction. For every flagged transaction, a waterfall plot shows exactly which features pushed the prediction toward fraud and by how much.&lt;/p&gt;

&lt;p&gt;For a sample transaction flagged at 94% fraud probability:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;amount_ratio ≈ 1.0&lt;/code&gt; → largest push toward fraud (full drain detected)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;type_TRANSFER&lt;/code&gt; → second largest push&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;balanceDiff&lt;/code&gt; → third largest push&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tells the analyst: &lt;em&gt;this transaction looks like fraud because it drained an account completely via a transfer operation&lt;/em&gt;. That is auditable and defensible.&lt;/p&gt;




&lt;h2&gt;
  
  
  The RAG Pipeline — Grounding Alerts in Regulation
&lt;/h2&gt;

&lt;p&gt;This is the part most fraud detection tutorials skip entirely.&lt;/p&gt;

&lt;p&gt;A model flagging a transaction at 97% is useful. A model that also cites the specific SBP regulatory provision being violated is operationally deployable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipeline architecture:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Document Ingestion:&lt;/strong&gt; Five SBP regulatory PDFs chunked into ~100 passages, stored in ChromaDB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedding:&lt;/strong&gt; &lt;code&gt;all-MiniLM-L6-v2&lt;/code&gt; (384-dimensional dense retriever)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid Retrieval:&lt;/strong&gt; BM25 (lexical) + dense vector retrieval combined&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reranking:&lt;/strong&gt; CrossEncoder (&lt;code&gt;ms-marco-MiniLM-L-6-v2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generation:&lt;/strong&gt; GPT-4o-mini receives fraud probability + retrieved passages → structured risk report with SBP citations&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Results:&lt;/strong&gt; Average Precision@5 = 0.855 across 10 retrieval queries. Zero hallucinations across all four high-risk transaction evaluations.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Full Ablation Study
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;CV F1&lt;/th&gt;
&lt;th&gt;Test F1&lt;/th&gt;
&lt;th&gt;Test AP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No Fraud Simulation (SMOTE only)&lt;/td&gt;
&lt;td&gt;0.671&lt;/td&gt;
&lt;td&gt;0.6247&lt;/td&gt;
&lt;td&gt;0.9363&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Full Pipeline (baseline)&lt;/td&gt;
&lt;td&gt;0.947&lt;/td&gt;
&lt;td&gt;0.5533&lt;/td&gt;
&lt;td&gt;0.7317&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No SMOTE&lt;/td&gt;
&lt;td&gt;0.947&lt;/td&gt;
&lt;td&gt;0.9132&lt;/td&gt;
&lt;td&gt;0.9639&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMOTE ratio = 0.3 (selected)&lt;/td&gt;
&lt;td&gt;0.947&lt;/td&gt;
&lt;td&gt;0.5557&lt;/td&gt;
&lt;td&gt;0.7322&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMOTE ratio = 0.5&lt;/td&gt;
&lt;td&gt;0.947&lt;/td&gt;
&lt;td&gt;0.5280&lt;/td&gt;
&lt;td&gt;0.7180&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;No Engineered Features&lt;/td&gt;
&lt;td&gt;0.636&lt;/td&gt;
&lt;td&gt;0.1538&lt;/td&gt;
&lt;td&gt;0.6061&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;With Engineered Features (full)&lt;/td&gt;
&lt;td&gt;0.947&lt;/td&gt;
&lt;td&gt;0.5533&lt;/td&gt;
&lt;td&gt;0.7317&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three takeaways: the Fraud Simulation Engine is irreplaceable, engineered features are critical, and no SMOTE gives better precision but worse robustness.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Numbers
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AUC-ROC&lt;/td&gt;
&lt;td&gt;0.9995&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recall&lt;/td&gt;
&lt;td&gt;0.9976&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average Precision (AUPRC)&lt;/td&gt;
&lt;td&gt;0.9358&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fraud cases caught (of 8,213)&lt;/td&gt;
&lt;td&gt;8,190&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fraud cases missed&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAG hallucinations&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retrieval Precision@5&lt;/td&gt;
&lt;td&gt;0.855&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Stack
&lt;/h2&gt;

&lt;p&gt;Python · XGBoost · Scikit-learn · imbalanced-learn · SHAP · ChromaDB · sentence-transformers · rank-bm25 · CrossEncoder · GPT-4o-mini · Streamlit · Pandas · NumPy&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://trustguard-ai-fraud-detection-c7um3xntqvxthahgld5ucm.streamlit.app/" rel="noopener noreferrer"&gt;trustguard-ai-fraud-detection-c7um3xntqvxthahgld5ucm.streamlit.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/whozahm3d/trustguard-ai-fraud-detection" rel="noopener noreferrer"&gt;github.com/whozahm3d/trustguard-ai-fraud-detection&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you found this useful, the repo is public — feedback, issues, and stars are all welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>datascience</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
