DoDataThings commited on
Commit
cec1948
·
verified ·
1 Parent(s): 454644d

Upload folder using huggingface_hub

Browse files
Files changed (5) hide show
  1. README.md +98 -75
  2. config.json +20 -18
  3. label_mapping.json +20 -18
  4. onnx/model_quantized.onnx +2 -2
  5. training-report.json +393 -384
README.md CHANGED
@@ -19,90 +19,59 @@ pipeline_tag: text-classification
19
 
20
  # DistilBERT US Bank Transaction Classifier v2
21
 
22
- **Successor to [v1](https://huggingface.co/DoDataThings/distilbert-us-transaction-classifier).** Sign-aware classification with expanded merchant coverage, PayPal wrapper handling, and a refined 16-category taxonomy.
23
 
24
- ## What Changed from v1
25
 
26
- | | v1 | v2 |
27
- |---|---|---|
28
- | **Input format** | Description only | `[debit]` / `[credit]` prefix + full description |
29
- | **Categories** | 16 (includes Housing) | 16 (Housing split into Rent + Mortgage removed) |
30
- | **Training data** | 16,000 samples | 24,000 samples |
31
- | **Merchant coverage** | ~300 merchants | ~500+ merchants |
32
- | **PayPal awareness** | Limited | Full — PreApproved, Express Checkout, PP*, PAYPAL * |
33
- | **POS prefix awareness** | SQ* only | SQ*, TST* (Toast), CLV* (Clover) |
34
- | **Transfer patterns** | Basic | Brokerage sweeps, fintech platforms, wire, cashier's checks, ATM |
35
-
36
- ### Why v2?
37
-
38
- v1 confused Income and Transfer because it only saw the description text. A "VENMO CASHOUT" deposit looks the same regardless of direction. v2 prepends `[credit]` or `[debit]` based on the transaction sign (after normalization to cardholder perspective), giving the model a strong directional signal.
39
-
40
- Mortgage was removed as a model category because mortgage account transactions are better classified by account type — every transaction on a mortgage account is a mortgage payment by definition.
41
-
42
- ## What This Is (and Isn't)
43
-
44
- A fine-tuned DistilBERT model for classifying US bank transaction descriptions into 16 spending categories. Designed as a **fallback layer** in a multi-tier classification pipeline — not a standalone classifier.
45
 
46
- 1. **User rules** pattern matching catches known merchants (highest accuracy)
47
- 2. **This model** — classifies everything else, with sign awareness
48
- 3. **Bank-provided categories** — fallback when model confidence is low
49
- 4. **User overrides** — manual corrections for edge cases
50
 
51
- ## Training
52
-
53
- ```
54
- Model: DistilBERT-base-uncased + LoRA (r=32, alpha=64)
55
- Dataset: 24,000 synthetic samples, 1,500 per category
56
- Trainable: 1.8M / 68.7M parameters (2.6%)
57
- Training: 20 epochs, ~8 minutes on consumer GPU
58
- Best epoch: 17 (99.1% validation accuracy)
59
  ```
 
 
60
 
61
- ### Loss Curve
 
62
 
63
- | Epoch | Train Loss | Val Loss | Train Acc | Val Acc |
64
- |-------|-----------|----------|-----------|---------|
65
- | 1 | 2.590 | 1.936 | 20.8% | 52.6% |
66
- | 5 | 0.325 | 0.214 | 90.5% | 93.9% |
67
- | 10 | 0.078 | 0.055 | 97.8% | 98.3% |
68
- | 15 | 0.034 | 0.026 | 99.0% | 99.2% |
69
- | 17 | 0.029 | 0.030 | 99.1% | 99.1% |
70
 
71
- ### Honest Assessment
72
-
73
- Validation accuracy (99.1%) is on synthetic data. Real-world performance on ~2,000 transactions:
74
 
75
- - **86% of model classifications at 0.90+ confidence**
76
- - **< 0.4% below 0.50 confidence** (9 of 2,038 transactions)
77
- - Income and Transfer both at 100% on synthetic validation
78
- - Shopping remains the weakest category (~93%) due to overlap with Subscription and Groceries
79
 
80
- The sign prefix resolved the Income/Transfer confusion from v1. The main remaining challenge is niche merchants the model hasn't seen diminishing returns territory best handled by user rules.
81
 
82
- ## Categories (16)
83
 
84
  | Category | What it covers |
85
  |----------|----------------|
86
- | Restaurants | Fast food, sit-down, coffee shops, food delivery, POS systems (TST*, SQ*, CLV*) |
87
  | Groceries | Supermarkets, warehouse clubs, farmers markets, convenience stores |
88
- | Shopping | Retail, online purchases, department stores, pet stores, liquor stores, e-commerce marketplaces |
89
- | Transportation | Gas, EV charging, rideshare, auto maintenance, parking, tolls, DMV |
90
- | Entertainment | Movies, events, gaming (Steam, PlayStation), gambling/sportsbooks |
91
  | Utilities | Electric, internet, phone, water, waste/trash, solar |
92
- | Subscription | Streaming, SaaS, AI tools, VPNs, social media premium, dating apps, news |
93
  | Healthcare | Pharmacy, doctor, dentist, telehealth, vision, hospital |
94
- | Insurance | Auto, home, health, life insurance |
 
95
  | Rent | Property management companies, lease payments |
96
  | Travel | Hotels, airlines, car rental, cruise lines, airport services |
97
  | Education | Online courses, tutoring, books, tuition, certification |
98
  | Personal Care | Salon, gym, beauty, spa, barber |
99
- | Transfer | CC autopay, Zelle/Venmo sends, bank transfers, brokerage sweeps, BNPL, wire transfers, ATM, cashier's checks |
100
  | Income | Payroll, direct deposit, interest, refunds, government benefits, gig economy payouts |
101
- | Fees | Bank fees, late fees, service charges, ATM fees |
102
 
103
- ### Account-Type-Implied Categories (not model-classified)
104
 
105
- These categories are determined by the account type, not the model:
106
 
107
  | Account Type | Category |
108
  |---|---|
@@ -113,6 +82,45 @@ These categories are determined by the account type, not the model:
113
  | HELOC | Transfer |
114
  | CD | Income |
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  ## Usage
117
 
118
  ### Python
@@ -122,9 +130,9 @@ from transformers import pipeline
122
 
123
  classifier = pipeline("text-classification", model="DoDataThings/distilbert-us-transaction-classifier-v2")
124
 
125
- # v2 requires sign prefix
126
  result = classifier("[debit] STARBUCKS #1234 SAN FRANCISCO CA")
127
- print(result) # [{'label': 'Restaurants', 'score': 0.98}]
128
 
129
  # Sign matters for ambiguous transactions
130
  classifier("[credit] VENMO CASHOUT PPD ID: 12345678")
@@ -132,6 +140,13 @@ classifier("[credit] VENMO CASHOUT PPD ID: 12345678")
132
 
133
  classifier("[debit] VENMO PAYMENT TO JOHN SMITH")
134
  # [{'label': 'Transfer', 'score': 0.97}]
 
 
 
 
 
 
 
135
  ```
136
 
137
  ### JavaScript (Transformers.js)
@@ -145,31 +160,39 @@ const classifier = await pipeline(
145
  );
146
 
147
  const result = await classifier('[debit] STARBUCKS #1234');
148
- // [{ label: 'Restaurants', score: 0.98 }]
149
  ```
150
 
151
  An ONNX export is included in the `onnx/` subdirectory.
152
 
153
- ### Sign Prefix Convention
154
-
155
- Prepend `[credit]` or `[debit]` based on the **normalized** transaction amount (cardholder perspective):
156
- - `[debit]` — money left the account (purchases, payments out, fees)
157
- - `[credit]` — money entered the account (income, refunds, payments received)
158
 
159
- If your data uses issuer perspective (e.g., Apple Card where purchases are positive), normalize the sign first, then apply the prefix.
 
 
 
160
 
161
  ## Training Data
162
 
163
- The synthetic dataset is published at [`DoDataThings/us-bank-transaction-categories-v2`](https://huggingface.co/datasets/DoDataThings/us-bank-transaction-categories-v2). The generator script is open source — you can extend the merchant pools, add format templates, or increase sample counts.
 
 
 
 
 
 
 
 
 
 
164
 
165
  ## Limitations
166
 
167
- - **US bank formats only** — Trained on Chase, Apple Card, PayPal, Capital One, and US Bank statement patterns
168
  - **Synthetic training data** — May miss patterns from banks not represented
169
- - **Shopping is the weakest category** (~93%) due to overlap with Subscription and Groceries
170
- - **Niche merchants** may classify with low confidence use merchant rules for known edge cases
171
- - **Sign prefix required** — The model expects `[debit]` or `[credit]` prefix. Passing raw descriptions without the prefix will degrade accuracy.
172
- - **Not a standalone solution** — Best results come from combining with merchant rules and account-type-implied classifications
173
 
174
  ## License
175
 
 
19
 
20
  # DistilBERT US Bank Transaction Classifier v2
21
 
22
+ A fine-tuned DistilBERT model that classifies US bank transaction descriptions into 17 spending categories. Uses a `[debit]`/`[credit]` sign prefix to disambiguate transaction direction a payroll deposit and a Venmo payment look similar in text but mean opposite things financially.
23
 
24
+ **Successor to [v1](https://huggingface.co/DoDataThings/distilbert-us-transaction-classifier)**, which classified on description text alone. v2 adds sign-aware input, expanded merchant coverage (500+), multi-format training across 8 bank statement structures, and PayPal as a first-class format.
25
 
26
+ ## How It Works
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
 
28
+ The model takes a sign prefix + transaction description and outputs one of 17 categories:
 
 
 
29
 
 
 
 
 
 
 
 
 
30
  ```
31
+ Input: "[debit] STARBUCKS #1234 SAN FRANCISCO CA"
32
+ Output: Restaurants (0.99)
33
 
34
+ Input: "[credit] Patelco CU PAYROLL PPD ID: 321076470"
35
+ Output: Income (1.00)
36
 
37
+ Input: "[debit] CHASE CREDIT CRD AUTOPAY PPD ID: 4760039224"
38
+ Output: Transfer (1.00)
 
 
 
 
 
39
 
40
+ Input: "[debit] PreApproved Payment Bill User Payment: Netflix"
41
+ Output: Subscription (1.00)
42
+ ```
43
 
44
+ The sign prefix encodes the transaction direction from the cardholder's perspective:
45
+ - `[debit]` money left the account (purchases, payments out, fees)
46
+ - `[credit]` money entered the account (income, refunds, payments received)
 
47
 
48
+ This is critical for distinguishing Income from Transfer. `[credit] VENMO CASHOUT` is Income (money arriving). `[debit] VENMO PAYMENT TO JOHN SMITH` is Transfer (money leaving). The description alone can't tell you which.
49
 
50
+ ## Categories (17)
51
 
52
  | Category | What it covers |
53
  |----------|----------------|
54
+ | Restaurants | Fast food, sit-down, coffee, delivery, POS systems (TST*, SQ*, CLV*) |
55
  | Groceries | Supermarkets, warehouse clubs, farmers markets, convenience stores |
56
+ | Shopping | Retail, online, department stores, pet stores, liquor stores, e-commerce marketplaces |
57
+ | Transportation | Gas, EV charging, rideshare, auto service, parking, tolls, DMV |
58
+ | Entertainment | Movies, events, gaming, gambling/sportsbooks |
59
  | Utilities | Electric, internet, phone, water, waste/trash, solar |
60
+ | Subscription | Streaming, SaaS, AI tools, VPNs, social media premium, dating, business SaaS |
61
  | Healthcare | Pharmacy, doctor, dentist, telehealth, vision, hospital |
62
+ | Insurance | Auto, home, health, life, home warranty |
63
+ | Mortgage | Bank, credit union, and fintech mortgage payments, escrow, principal |
64
  | Rent | Property management companies, lease payments |
65
  | Travel | Hotels, airlines, car rental, cruise lines, airport services |
66
  | Education | Online courses, tutoring, books, tuition, certification |
67
  | Personal Care | Salon, gym, beauty, spa, barber |
68
+ | Transfer | CC autopay, P2P sends, bank transfers, brokerage sweeps, fintech, BNPL, wire, ATM, cashier's checks |
69
  | Income | Payroll, direct deposit, interest, refunds, government benefits, gig economy payouts |
70
+ | Fees | Bank fees, late fees, ATM surcharges, service charges |
71
 
72
+ ### Account-Type-Implied Categories
73
 
74
+ If you know the account type, some categories can be assigned without the model:
75
 
76
  | Account Type | Category |
77
  |---|---|
 
82
  | HELOC | Transfer |
83
  | CD | Income |
84
 
85
+ For checking, savings, and credit card accounts, use the model.
86
+
87
+ ## Training
88
+
89
+ ```
90
+ Model: DistilBERT-base-uncased + LoRA (r=32, alpha=64)
91
+ Dataset: 68,000 synthetic samples (4,000 per category)
92
+ Trainable: 1.8M / 68.7M parameters (2.6%)
93
+ Training: 20 epochs, best at epoch 16
94
+ Validation: 99.9% accuracy (15 of 17 categories at 100%)
95
+ ```
96
+
97
+ ### Multi-Format Training
98
+
99
+ The model is trained on 8 bank statement formats so it classifies correctly regardless of which bank produced the description:
100
+
101
+ | Format | Example | Source |
102
+ |---|---|---|
103
+ | Chase merchant | `STARBUCKS #1234` | Chase credit cards |
104
+ | Chase ACH | `INSTITUTION PURPOSE PPD ID: CODE` | Chase checking |
105
+ | Apple Card | `MERCHANT ADDRESS CITY ZIP STATE USA` | Apple Card |
106
+ | PayPal native | `PreApproved Payment Bill User Payment: MERCHANT` | PayPal credit card |
107
+ | PayPal prefix | `PP*MERCHANT`, `PYPL*MERCHANT`, `PAYPAL *MERCHANT` | Chase/other banks |
108
+ | Capital One | `Withdrawal from MERCHANT`, `Preauthorized Deposit from MERCHANT` | Capital One |
109
+ | Mercury | `MERCHANT; Description` or just `MERCHANT` | Mercury, neobanks |
110
+ | POS prefix | `SQ *MERCHANT`, `TST*MERCHANT`, `CLV*MERCHANT` | Square, Toast, Clover |
111
+
112
+ PayPal formats appear across all spending categories at meaningful rates, reflecting that people use PayPal cards at any merchant.
113
+
114
+ ### Honest Assessment
115
+
116
+ The 99.9% validation accuracy is on synthetic data. On ~2,000 real transactions:
117
+
118
+ - **96.1% of model classifications at 0.90+ confidence**
119
+ - **< 0.5% below 0.50 confidence**
120
+ - 17 bank-category fallbacks (obscure merchants where the model defers)
121
+ - Shopping is the weakest category due to overlap with Subscription and Groceries
122
+ - Niche/unknown merchants may classify with lower confidence — use merchant rules for known edge cases
123
+
124
  ## Usage
125
 
126
  ### Python
 
130
 
131
  classifier = pipeline("text-classification", model="DoDataThings/distilbert-us-transaction-classifier-v2")
132
 
133
+ # Sign prefix required
134
  result = classifier("[debit] STARBUCKS #1234 SAN FRANCISCO CA")
135
+ print(result) # [{'label': 'Restaurants', 'score': 0.99}]
136
 
137
  # Sign matters for ambiguous transactions
138
  classifier("[credit] VENMO CASHOUT PPD ID: 12345678")
 
140
 
141
  classifier("[debit] VENMO PAYMENT TO JOHN SMITH")
142
  # [{'label': 'Transfer', 'score': 0.97}]
143
+
144
+ # Works across all bank formats
145
+ classifier("[debit] PreApproved Payment Bill User Payment: Netflix")
146
+ # [{'label': 'Subscription', 'score': 1.00}]
147
+
148
+ classifier("[debit] PP*SAFEWAY")
149
+ # [{'label': 'Groceries', 'score': 1.00}]
150
  ```
151
 
152
  ### JavaScript (Transformers.js)
 
160
  );
161
 
162
  const result = await classifier('[debit] STARBUCKS #1234');
163
+ // [{ label: 'Restaurants', score: 0.99 }]
164
  ```
165
 
166
  An ONNX export is included in the `onnx/` subdirectory.
167
 
168
+ ## Design Decisions
 
 
 
 
169
 
170
+ - **Sign prefix, not account type.** We considered passing account type (checking, credit, etc.) as a feature but concluded that sign alone provides the disambiguation signal. Account type is an upstream routing concern — it determines which classifier runs, not what the classifier outputs.
171
+ - **17 model categories + 6 account-type categories.** Mortgage is both a model category (for classifying mortgage descriptions on checking accounts) and an account-type-implied category (for mortgage account transactions). This serves both use cases — people with account type metadata and people with just transaction descriptions.
172
+ - **PayPal as a bank format, not a wrapper.** PayPal is a card issuer. People use PayPal cards at restaurants, grocery stores, and everywhere else. The training data treats PayPal formats as first-class bank statement structures across all categories.
173
+ - **Synthetic data with real formats.** The training data is synthetic but models real bank statement patterns — Chase ACH padding, Apple Card address formats, Capital One action prefixes, Mercury's minimal format. The generator is open source so you can extend it.
174
 
175
  ## Training Data
176
 
177
+ The dataset is published at [`DoDataThings/us-bank-transaction-categories-v2`](https://huggingface.co/datasets/DoDataThings/us-bank-transaction-categories-v2).
178
+
179
+ ## Generator
180
+
181
+ The synthetic data generator is open source:
182
+
183
+ ```bash
184
+ node scripts/generate-training-data.js --count 4000 # 4,000 per category
185
+ ```
186
+
187
+ Available at [github.com/wnstnb/foliome](https://github.com/wnstnb/foliome).
188
 
189
  ## Limitations
190
 
191
+ - **US bank formats only** — Trained on Chase, Apple Card, PayPal, Capital One, Mercury, and US Bank patterns
192
  - **Synthetic training data** — May miss patterns from banks not represented
193
+ - **Shopping is the weakest category** due to overlap with Subscription and Groceries
194
+ - **Sign prefix required** — Passing raw descriptions without `[debit]`/`[credit]` will degrade accuracy
195
+ - **Not a standalone solution** — Best results come from combining with merchant rules and account-type classification
 
196
 
197
  ## License
198
 
config.json CHANGED
@@ -16,15 +16,16 @@
16
  "4": "Healthcare",
17
  "5": "Income",
18
  "6": "Insurance",
19
- "7": "Personal Care",
20
- "8": "Rent",
21
- "9": "Restaurants",
22
- "10": "Shopping",
23
- "11": "Subscription",
24
- "12": "Transfer",
25
- "13": "Transportation",
26
- "14": "Travel",
27
- "15": "Utilities"
 
28
  },
29
  "initializer_range": 0.02,
30
  "label2id": {
@@ -35,15 +36,16 @@
35
  "Healthcare": 4,
36
  "Income": 5,
37
  "Insurance": 6,
38
- "Personal Care": 7,
39
- "Rent": 8,
40
- "Restaurants": 9,
41
- "Shopping": 10,
42
- "Subscription": 11,
43
- "Transfer": 12,
44
- "Transportation": 13,
45
- "Travel": 14,
46
- "Utilities": 15
 
47
  },
48
  "max_position_embeddings": 512,
49
  "model_type": "distilbert",
 
16
  "4": "Healthcare",
17
  "5": "Income",
18
  "6": "Insurance",
19
+ "7": "Mortgage",
20
+ "8": "Personal Care",
21
+ "9": "Rent",
22
+ "10": "Restaurants",
23
+ "11": "Shopping",
24
+ "12": "Subscription",
25
+ "13": "Transfer",
26
+ "14": "Transportation",
27
+ "15": "Travel",
28
+ "16": "Utilities"
29
  },
30
  "initializer_range": 0.02,
31
  "label2id": {
 
36
  "Healthcare": 4,
37
  "Income": 5,
38
  "Insurance": 6,
39
+ "Mortgage": 7,
40
+ "Personal Care": 8,
41
+ "Rent": 9,
42
+ "Restaurants": 10,
43
+ "Shopping": 11,
44
+ "Subscription": 12,
45
+ "Transfer": 13,
46
+ "Transportation": 14,
47
+ "Travel": 15,
48
+ "Utilities": 16
49
  },
50
  "max_position_embeddings": 512,
51
  "model_type": "distilbert",
label_mapping.json CHANGED
@@ -7,15 +7,16 @@
7
  "4": "Healthcare",
8
  "5": "Income",
9
  "6": "Insurance",
10
- "7": "Personal Care",
11
- "8": "Rent",
12
- "9": "Restaurants",
13
- "10": "Shopping",
14
- "11": "Subscription",
15
- "12": "Transfer",
16
- "13": "Transportation",
17
- "14": "Travel",
18
- "15": "Utilities"
 
19
  },
20
  "label2id": {
21
  "Education": 0,
@@ -25,14 +26,15 @@
25
  "Healthcare": 4,
26
  "Income": 5,
27
  "Insurance": 6,
28
- "Personal Care": 7,
29
- "Rent": 8,
30
- "Restaurants": 9,
31
- "Shopping": 10,
32
- "Subscription": 11,
33
- "Transfer": 12,
34
- "Transportation": 13,
35
- "Travel": 14,
36
- "Utilities": 15
 
37
  }
38
  }
 
7
  "4": "Healthcare",
8
  "5": "Income",
9
  "6": "Insurance",
10
+ "7": "Mortgage",
11
+ "8": "Personal Care",
12
+ "9": "Rent",
13
+ "10": "Restaurants",
14
+ "11": "Shopping",
15
+ "12": "Subscription",
16
+ "13": "Transfer",
17
+ "14": "Transportation",
18
+ "15": "Travel",
19
+ "16": "Utilities"
20
  },
21
  "label2id": {
22
  "Education": 0,
 
26
  "Healthcare": 4,
27
  "Income": 5,
28
  "Insurance": 6,
29
+ "Mortgage": 7,
30
+ "Personal Care": 8,
31
+ "Rent": 9,
32
+ "Restaurants": 10,
33
+ "Shopping": 11,
34
+ "Subscription": 12,
35
+ "Transfer": 13,
36
+ "Transportation": 14,
37
+ "Travel": 15,
38
+ "Utilities": 16
39
  }
40
  }
onnx/model_quantized.onnx CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:af4d35409501558e9112dbc5aef014f0c8086427d00b4950d629f497d20d54fd
3
- size 267975237
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1ab2b64277921566be0303003473fac0bb6b65b21dd7db74548575410eecc5c6
3
+ size 267978313
training-report.json CHANGED
@@ -1,14 +1,14 @@
1
  {
2
  "model": "distilbert-base-uncased + LoRA (r=32, alpha=64)",
3
- "dataset": "24000 synthetic transactions, 16 categories, 1500/category",
4
- "split": "20400 train / 3600 val (85/15)",
5
  "epochs": 20,
6
- "best_epoch": 18,
7
- "best_val_accuracy": 0.9908,
8
- "total_training_time_s": 458.7,
9
  "device": "cuda",
10
- "trainable_params": 1782544,
11
- "total_params": 68748320,
12
  "categories": [
13
  "Education",
14
  "Entertainment",
@@ -17,6 +17,7 @@
17
  "Healthcare",
18
  "Income",
19
  "Insurance",
 
20
  "Personal Care",
21
  "Rent",
22
  "Restaurants",
@@ -30,643 +31,651 @@
30
  "history": [
31
  {
32
  "epoch": 1,
33
- "train_loss": 2.5896,
34
- "val_loss": 1.9356,
35
- "train_acc": 0.2075,
36
- "val_acc": 0.5256,
37
  "per_category": {
38
- "Education": 0.362,
39
- "Entertainment": 0.142,
40
- "Fees": 1.0,
41
- "Groceries": 0.575,
42
- "Healthcare": 0.798,
43
- "Income": 0.964,
44
- "Insurance": 0.273,
45
- "Personal Care": 0.203,
46
- "Rent": 0.97,
47
- "Restaurants": 0.544,
48
- "Shopping": 0.36,
49
- "Subscription": 0.802,
50
- "Transfer": 0.166,
51
- "Transportation": 0.5,
52
- "Travel": 0.241,
53
- "Utilities": 0.479
 
54
  },
55
- "epoch_time_s": 23.7
56
  },
57
  {
58
  "epoch": 2,
59
- "train_loss": 1.3952,
60
- "val_loss": 0.8527,
61
- "train_acc": 0.6386,
62
- "val_acc": 0.7642,
63
  "per_category": {
64
- "Education": 0.819,
65
- "Entertainment": 0.652,
66
- "Fees": 1.0,
67
- "Groceries": 0.617,
68
- "Healthcare": 0.88,
69
- "Income": 1.0,
70
- "Insurance": 0.745,
71
- "Personal Care": 0.586,
72
- "Rent": 0.991,
73
- "Restaurants": 0.628,
74
- "Shopping": 0.671,
75
- "Subscription": 0.718,
76
- "Transfer": 0.751,
77
- "Transportation": 0.71,
78
- "Travel": 0.565,
79
- "Utilities": 0.853
 
80
  },
81
- "epoch_time_s": 23.2
82
  },
83
  {
84
  "epoch": 3,
85
- "train_loss": 0.7496,
86
- "val_loss": 0.4969,
87
- "train_acc": 0.7876,
88
- "val_acc": 0.8619,
89
  "per_category": {
90
- "Education": 0.95,
91
- "Entertainment": 0.826,
92
  "Fees": 1.0,
93
- "Groceries": 0.696,
94
- "Healthcare": 0.93,
95
- "Income": 0.982,
96
- "Insurance": 0.892,
97
- "Personal Care": 0.918,
 
98
  "Rent": 1.0,
99
- "Restaurants": 0.686,
100
- "Shopping": 0.778,
101
- "Subscription": 0.861,
102
- "Transfer": 0.889,
103
- "Transportation": 0.694,
104
- "Travel": 0.728,
105
- "Utilities": 0.943
106
  },
107
- "epoch_time_s": 23.5
108
  },
109
  {
110
  "epoch": 4,
111
- "train_loss": 0.4773,
112
- "val_loss": 0.2947,
113
- "train_acc": 0.8612,
114
- "val_acc": 0.9169,
115
  "per_category": {
116
- "Education": 0.977,
117
- "Entertainment": 0.939,
118
  "Fees": 1.0,
119
- "Groceries": 0.734,
120
- "Healthcare": 0.946,
121
- "Income": 1.0,
122
- "Insurance": 0.944,
123
- "Personal Care": 0.991,
 
124
  "Rent": 1.0,
125
- "Restaurants": 0.863,
126
- "Shopping": 0.796,
127
- "Subscription": 0.842,
128
- "Transfer": 0.926,
129
- "Transportation": 0.863,
130
- "Travel": 0.869,
131
- "Utilities": 0.953
132
  },
133
- "epoch_time_s": 23.4
134
  },
135
  {
136
  "epoch": 5,
137
- "train_loss": 0.325,
138
- "val_loss": 0.2142,
139
- "train_acc": 0.9049,
140
- "val_acc": 0.9392,
141
  "per_category": {
142
- "Education": 0.982,
143
- "Entertainment": 0.951,
144
  "Fees": 1.0,
145
- "Groceries": 0.883,
146
- "Healthcare": 0.967,
147
  "Income": 1.0,
148
- "Insurance": 0.97,
 
149
  "Personal Care": 1.0,
150
  "Rent": 1.0,
151
- "Restaurants": 0.881,
152
- "Shopping": 0.804,
153
- "Subscription": 0.866,
154
- "Transfer": 0.917,
155
- "Transportation": 0.891,
156
- "Travel": 0.921,
157
- "Utilities": 0.976
158
  },
159
- "epoch_time_s": 23.4
160
  },
161
  {
162
  "epoch": 6,
163
- "train_loss": 0.2342,
164
- "val_loss": 0.1447,
165
- "train_acc": 0.9325,
166
- "val_acc": 0.9575,
167
  "per_category": {
168
- "Education": 0.982,
169
- "Entertainment": 0.988,
170
  "Fees": 1.0,
171
- "Groceries": 0.883,
172
- "Healthcare": 0.967,
173
  "Income": 1.0,
174
- "Insurance": 0.939,
 
175
  "Personal Care": 1.0,
176
  "Rent": 1.0,
177
- "Restaurants": 0.947,
178
- "Shopping": 0.836,
179
- "Subscription": 0.941,
180
- "Transfer": 0.982,
181
- "Transportation": 0.907,
182
- "Travel": 0.948,
183
- "Utilities": 0.995
184
  },
185
- "epoch_time_s": 23.4
186
  },
187
  {
188
  "epoch": 7,
189
- "train_loss": 0.1724,
190
- "val_loss": 0.1079,
191
- "train_acc": 0.9508,
192
- "val_acc": 0.9708,
193
  "per_category": {
194
- "Education": 0.982,
195
- "Entertainment": 0.996,
196
  "Fees": 1.0,
197
- "Groceries": 0.953,
198
- "Healthcare": 0.967,
199
  "Income": 1.0,
200
- "Insurance": 0.991,
201
- "Personal Care": 1.0,
 
202
  "Rent": 1.0,
203
- "Restaurants": 0.942,
204
- "Shopping": 0.844,
205
- "Subscription": 0.926,
206
- "Transfer": 0.982,
207
- "Transportation": 0.972,
208
- "Travel": 0.979,
209
- "Utilities": 0.991
210
  },
211
- "epoch_time_s": 23.5
212
  },
213
  {
214
  "epoch": 8,
215
- "train_loss": 0.1254,
216
- "val_loss": 0.0775,
217
- "train_acc": 0.9649,
218
- "val_acc": 0.9789,
219
  "per_category": {
220
  "Education": 1.0,
221
- "Entertainment": 0.988,
222
  "Fees": 1.0,
223
- "Groceries": 0.967,
224
- "Healthcare": 0.967,
225
  "Income": 1.0,
226
- "Insurance": 0.996,
 
227
  "Personal Care": 1.0,
228
  "Rent": 1.0,
229
- "Restaurants": 0.96,
230
- "Shopping": 0.893,
231
- "Subscription": 0.95,
232
- "Transfer": 0.982,
233
- "Transportation": 0.976,
234
- "Travel": 0.995,
235
- "Utilities": 0.986
236
  },
237
- "epoch_time_s": 23.5
238
  },
239
  {
240
  "epoch": 9,
241
- "train_loss": 0.0972,
242
- "val_loss": 0.0627,
243
- "train_acc": 0.9723,
244
- "val_acc": 0.9814,
245
  "per_category": {
246
- "Education": 0.995,
247
- "Entertainment": 0.992,
248
  "Fees": 1.0,
249
- "Groceries": 0.981,
250
- "Healthcare": 0.967,
251
  "Income": 1.0,
252
- "Insurance": 0.996,
 
253
  "Personal Care": 1.0,
254
  "Rent": 1.0,
255
- "Restaurants": 0.96,
256
- "Shopping": 0.884,
257
- "Subscription": 0.96,
258
- "Transfer": 0.982,
259
- "Transportation": 0.988,
260
- "Travel": 0.995,
261
  "Utilities": 1.0
262
  },
263
- "epoch_time_s": 22.4
264
  },
265
  {
266
  "epoch": 10,
267
- "train_loss": 0.0771,
268
- "val_loss": 0.0557,
269
- "train_acc": 0.9789,
270
- "val_acc": 0.985,
271
  "per_category": {
272
  "Education": 1.0,
273
  "Entertainment": 1.0,
274
  "Fees": 1.0,
275
  "Groceries": 1.0,
276
- "Healthcare": 0.963,
277
  "Income": 1.0,
278
- "Insurance": 0.996,
279
- "Personal Care": 1.0,
 
280
  "Rent": 1.0,
281
- "Restaurants": 0.978,
282
- "Shopping": 0.889,
283
- "Subscription": 0.955,
284
- "Transfer": 0.995,
285
- "Transportation": 0.988,
286
- "Travel": 0.995,
287
  "Utilities": 1.0
288
  },
289
- "epoch_time_s": 22.6
290
  },
291
  {
292
  "epoch": 11,
293
- "train_loss": 0.0665,
294
- "val_loss": 0.0485,
295
- "train_acc": 0.9812,
296
- "val_acc": 0.9864,
297
  "per_category": {
298
  "Education": 1.0,
299
  "Entertainment": 1.0,
300
  "Fees": 1.0,
301
- "Groceries": 0.991,
302
- "Healthcare": 0.967,
303
  "Income": 1.0,
304
- "Insurance": 0.996,
 
305
  "Personal Care": 1.0,
306
  "Rent": 1.0,
307
- "Restaurants": 0.987,
308
- "Shopping": 0.898,
309
- "Subscription": 0.975,
310
- "Transfer": 0.982,
311
- "Transportation": 0.988,
312
  "Travel": 1.0,
313
  "Utilities": 1.0
314
  },
315
- "epoch_time_s": 22.6
316
  },
317
  {
318
  "epoch": 12,
319
- "train_loss": 0.0534,
320
- "val_loss": 0.0404,
321
- "train_acc": 0.9841,
322
- "val_acc": 0.9872,
323
  "per_category": {
324
  "Education": 1.0,
325
  "Entertainment": 1.0,
326
  "Fees": 1.0,
327
- "Groceries": 0.986,
328
- "Healthcare": 0.963,
329
  "Income": 1.0,
330
- "Insurance": 0.996,
331
- "Personal Care": 0.991,
 
332
  "Rent": 1.0,
333
- "Restaurants": 0.991,
334
- "Shopping": 0.907,
335
- "Subscription": 0.98,
336
- "Transfer": 0.995,
337
- "Transportation": 0.988,
338
  "Travel": 1.0,
339
  "Utilities": 1.0
340
  },
341
- "epoch_time_s": 22.6
342
  },
343
  {
344
  "epoch": 13,
345
- "train_loss": 0.0463,
346
- "val_loss": 0.0418,
347
- "train_acc": 0.9857,
348
- "val_acc": 0.9889,
349
  "per_category": {
350
  "Education": 1.0,
351
  "Entertainment": 1.0,
352
  "Fees": 1.0,
353
- "Groceries": 1.0,
354
- "Healthcare": 0.967,
355
  "Income": 1.0,
356
- "Insurance": 0.996,
 
357
  "Personal Care": 1.0,
358
  "Rent": 1.0,
359
- "Restaurants": 0.991,
360
- "Shopping": 0.898,
361
- "Subscription": 0.975,
362
- "Transfer": 0.995,
363
- "Transportation": 1.0,
364
  "Travel": 1.0,
365
  "Utilities": 1.0
366
  },
367
- "epoch_time_s": 22.3
368
  },
369
  {
370
  "epoch": 14,
371
- "train_loss": 0.0421,
372
- "val_loss": 0.0386,
373
- "train_acc": 0.9872,
374
- "val_acc": 0.9889,
375
  "per_category": {
376
  "Education": 1.0,
377
  "Entertainment": 1.0,
378
  "Fees": 1.0,
379
- "Groceries": 0.995,
380
- "Healthcare": 0.967,
381
  "Income": 1.0,
382
  "Insurance": 1.0,
383
- "Personal Care": 1.0,
 
384
  "Rent": 1.0,
385
- "Restaurants": 0.991,
386
- "Shopping": 0.911,
387
- "Subscription": 0.98,
388
- "Transfer": 0.991,
389
- "Transportation": 0.988,
390
  "Travel": 1.0,
391
  "Utilities": 1.0
392
  },
393
- "epoch_time_s": 22.3
394
  },
395
  {
396
  "epoch": 15,
397
- "train_loss": 0.0378,
398
- "val_loss": 0.0341,
399
- "train_acc": 0.9886,
400
- "val_acc": 0.9892,
401
  "per_category": {
402
  "Education": 1.0,
403
  "Entertainment": 1.0,
404
  "Fees": 1.0,
405
- "Groceries": 0.995,
406
- "Healthcare": 0.971,
407
  "Income": 1.0,
408
  "Insurance": 1.0,
 
409
  "Personal Care": 1.0,
410
  "Rent": 1.0,
411
- "Restaurants": 0.991,
412
- "Shopping": 0.907,
413
- "Subscription": 0.98,
414
- "Transfer": 0.995,
415
- "Transportation": 0.988,
416
  "Travel": 1.0,
417
  "Utilities": 1.0
418
  },
419
- "epoch_time_s": 22.4
420
  },
421
  {
422
  "epoch": 16,
423
- "train_loss": 0.0319,
424
- "val_loss": 0.0363,
425
- "train_acc": 0.9912,
426
- "val_acc": 0.9894,
427
  "per_category": {
428
  "Education": 1.0,
429
  "Entertainment": 1.0,
430
  "Fees": 1.0,
431
  "Groceries": 1.0,
432
- "Healthcare": 0.967,
433
  "Income": 1.0,
434
  "Insurance": 1.0,
435
- "Personal Care": 1.0,
 
436
  "Rent": 1.0,
437
- "Restaurants": 0.991,
438
- "Shopping": 0.902,
439
- "Subscription": 0.985,
440
- "Transfer": 0.995,
441
- "Transportation": 0.992,
442
  "Travel": 1.0,
443
  "Utilities": 1.0
444
  },
445
- "epoch_time_s": 22.4
446
  },
447
  {
448
  "epoch": 17,
449
- "train_loss": 0.0288,
450
- "val_loss": 0.0296,
451
- "train_acc": 0.9913,
452
- "val_acc": 0.9906,
453
  "per_category": {
454
  "Education": 1.0,
455
  "Entertainment": 1.0,
456
  "Fees": 1.0,
457
- "Groceries": 0.986,
458
- "Healthcare": 0.971,
459
  "Income": 1.0,
460
- "Insurance": 0.996,
461
- "Personal Care": 0.991,
 
462
  "Rent": 1.0,
463
- "Restaurants": 0.991,
464
- "Shopping": 0.947,
465
- "Subscription": 0.985,
466
- "Transfer": 0.995,
467
- "Transportation": 0.988,
468
  "Travel": 1.0,
469
  "Utilities": 1.0
470
  },
471
- "epoch_time_s": 22.3
472
  },
473
  {
474
  "epoch": 18,
475
- "train_loss": 0.0255,
476
- "val_loss": 0.0284,
477
- "train_acc": 0.993,
478
- "val_acc": 0.9908,
479
  "per_category": {
480
  "Education": 1.0,
481
  "Entertainment": 1.0,
482
  "Fees": 1.0,
483
- "Groceries": 0.995,
484
- "Healthcare": 0.971,
485
  "Income": 1.0,
486
- "Insurance": 0.996,
487
- "Personal Care": 1.0,
 
488
  "Rent": 1.0,
489
- "Restaurants": 0.991,
490
- "Shopping": 0.929,
491
- "Subscription": 0.985,
492
- "Transfer": 0.995,
493
- "Transportation": 0.992,
494
  "Travel": 1.0,
495
  "Utilities": 1.0
496
  },
497
- "epoch_time_s": 22.4
498
  },
499
  {
500
  "epoch": 19,
501
- "train_loss": 0.0273,
502
- "val_loss": 0.0306,
503
- "train_acc": 0.9912,
504
- "val_acc": 0.9897,
505
  "per_category": {
506
  "Education": 1.0,
507
  "Entertainment": 1.0,
508
  "Fees": 1.0,
509
  "Groceries": 1.0,
510
- "Healthcare": 0.967,
511
  "Income": 1.0,
512
- "Insurance": 0.996,
513
- "Personal Care": 1.0,
 
514
  "Rent": 1.0,
515
- "Restaurants": 0.991,
516
- "Shopping": 0.907,
517
- "Subscription": 0.98,
518
  "Transfer": 1.0,
519
- "Transportation": 0.996,
520
  "Travel": 1.0,
521
  "Utilities": 1.0
522
  },
523
- "epoch_time_s": 22.5
524
  },
525
  {
526
  "epoch": 20,
527
- "train_loss": 0.023,
528
- "val_loss": 0.03,
529
- "train_acc": 0.9928,
530
- "val_acc": 0.9906,
531
  "per_category": {
532
  "Education": 1.0,
533
  "Entertainment": 1.0,
534
  "Fees": 1.0,
535
  "Groceries": 1.0,
536
- "Healthcare": 0.967,
537
  "Income": 1.0,
538
- "Insurance": 0.996,
539
- "Personal Care": 1.0,
 
540
  "Rent": 1.0,
541
- "Restaurants": 0.991,
542
- "Shopping": 0.916,
543
- "Subscription": 0.985,
544
  "Transfer": 1.0,
545
- "Transportation": 0.996,
546
  "Travel": 1.0,
547
  "Utilities": 1.0
548
  },
549
- "epoch_time_s": 23.2
550
  }
551
  ],
552
  "final_per_category": {
553
  "Education": {
554
  "accuracy": 1.0,
555
- "correct": 221,
556
- "total": 221,
557
  "top_confusions": {}
558
  },
559
  "Entertainment": {
560
  "accuracy": 1.0,
561
- "correct": 247,
562
- "total": 247,
563
  "top_confusions": {}
564
  },
565
  "Fees": {
566
  "accuracy": 1.0,
567
- "correct": 240,
568
- "total": 240,
569
  "top_confusions": {}
570
  },
571
  "Groceries": {
572
- "accuracy": 0.995,
573
- "correct": 213,
574
- "total": 214,
575
- "top_confusions": {
576
- "Shopping": 1
577
- }
578
  },
579
  "Healthcare": {
580
- "accuracy": 0.971,
581
- "correct": 235,
582
- "total": 242,
583
- "top_confusions": {
584
- "Education": 2,
585
- "Utilities": 2,
586
- "Insurance": 1
587
- }
588
  },
589
  "Income": {
590
  "accuracy": 1.0,
591
- "correct": 221,
592
- "total": 221,
593
  "top_confusions": {}
594
  },
595
  "Insurance": {
596
- "accuracy": 0.996,
597
- "correct": 230,
598
- "total": 231,
599
- "top_confusions": {
600
- "Income": 1
601
- }
602
  },
603
- "Personal Care": {
604
  "accuracy": 1.0,
605
- "correct": 232,
606
- "total": 232,
607
  "top_confusions": {}
608
  },
 
 
 
 
 
 
 
 
609
  "Rent": {
610
  "accuracy": 1.0,
611
- "correct": 232,
612
- "total": 232,
613
  "top_confusions": {}
614
  },
615
  "Restaurants": {
616
- "accuracy": 0.991,
617
- "correct": 224,
618
- "total": 226,
619
- "top_confusions": {
620
- "Groceries": 2
621
- }
622
  },
623
  "Shopping": {
624
- "accuracy": 0.929,
625
- "correct": 209,
626
- "total": 225,
627
  "top_confusions": {
628
- "Personal Care": 4,
629
- "Restaurants": 3,
630
- "Travel": 3
631
  }
632
  },
633
  "Subscription": {
634
- "accuracy": 0.985,
635
- "correct": 199,
636
- "total": 202,
637
- "top_confusions": {
638
- "Education": 1,
639
- "Personal Care": 1,
640
- "Shopping": 1
641
- }
642
  },
643
  "Transfer": {
644
- "accuracy": 0.995,
645
- "correct": 216,
646
- "total": 217,
647
- "top_confusions": {
648
- "Shopping": 1
649
- }
650
  },
651
  "Transportation": {
652
- "accuracy": 0.992,
653
- "correct": 246,
654
- "total": 248,
655
- "top_confusions": {
656
- "Shopping": 1,
657
- "Subscription": 1
658
- }
659
  },
660
  "Travel": {
661
  "accuracy": 1.0,
662
- "correct": 191,
663
- "total": 191,
664
  "top_confusions": {}
665
  },
666
  "Utilities": {
667
  "accuracy": 1.0,
668
- "correct": 211,
669
- "total": 211,
670
  "top_confusions": {}
671
  }
672
  }
 
1
  {
2
  "model": "distilbert-base-uncased + LoRA (r=32, alpha=64)",
3
+ "dataset": "68000 synthetic transactions, 17 categories, 4000/category",
4
+ "split": "57800 train / 10200 val (85/15)",
5
  "epochs": 20,
6
+ "best_epoch": 16,
7
+ "best_val_accuracy": 0.9992,
8
+ "total_training_time_s": 1262.2,
9
  "device": "cuda",
10
+ "trainable_params": 1783313,
11
+ "total_params": 68749858,
12
  "categories": [
13
  "Education",
14
  "Entertainment",
 
17
  "Healthcare",
18
  "Income",
19
  "Insurance",
20
+ "Mortgage",
21
  "Personal Care",
22
  "Rent",
23
  "Restaurants",
 
31
  "history": [
32
  {
33
  "epoch": 1,
34
+ "train_loss": 2.197,
35
+ "val_loss": 1.1123,
36
+ "train_acc": 0.3841,
37
+ "val_acc": 0.713,
38
  "per_category": {
39
+ "Education": 0.649,
40
+ "Entertainment": 0.644,
41
+ "Fees": 0.995,
42
+ "Groceries": 0.419,
43
+ "Healthcare": 0.815,
44
+ "Income": 0.979,
45
+ "Insurance": 0.66,
46
+ "Mortgage": 0.901,
47
+ "Personal Care": 0.535,
48
+ "Rent": 0.98,
49
+ "Restaurants": 0.664,
50
+ "Shopping": 0.522,
51
+ "Subscription": 0.749,
52
+ "Transfer": 0.653,
53
+ "Transportation": 0.595,
54
+ "Travel": 0.571,
55
+ "Utilities": 0.776
56
  },
57
+ "epoch_time_s": 62.7
58
  },
59
  {
60
  "epoch": 2,
61
+ "train_loss": 0.7792,
62
+ "val_loss": 0.3999,
63
+ "train_acc": 0.7801,
64
+ "val_acc": 0.879,
65
  "per_category": {
66
+ "Education": 0.966,
67
+ "Entertainment": 0.876,
68
+ "Fees": 0.997,
69
+ "Groceries": 0.7,
70
+ "Healthcare": 0.922,
71
+ "Income": 0.997,
72
+ "Insurance": 0.906,
73
+ "Mortgage": 0.982,
74
+ "Personal Care": 0.986,
75
+ "Rent": 1.0,
76
+ "Restaurants": 0.841,
77
+ "Shopping": 0.642,
78
+ "Subscription": 0.792,
79
+ "Transfer": 0.873,
80
+ "Transportation": 0.803,
81
+ "Travel": 0.765,
82
+ "Utilities": 0.899
83
  },
84
+ "epoch_time_s": 62.9
85
  },
86
  {
87
  "epoch": 3,
88
+ "train_loss": 0.3276,
89
+ "val_loss": 0.134,
90
+ "train_acc": 0.9017,
91
+ "val_acc": 0.963,
92
  "per_category": {
93
+ "Education": 0.988,
94
+ "Entertainment": 0.978,
95
  "Fees": 1.0,
96
+ "Groceries": 0.915,
97
+ "Healthcare": 0.981,
98
+ "Income": 0.995,
99
+ "Insurance": 0.997,
100
+ "Mortgage": 0.989,
101
+ "Personal Care": 0.997,
102
  "Rent": 1.0,
103
+ "Restaurants": 0.917,
104
+ "Shopping": 0.841,
105
+ "Subscription": 0.893,
106
+ "Transfer": 0.988,
107
+ "Transportation": 0.922,
108
+ "Travel": 0.983,
109
+ "Utilities": 0.987
110
  },
111
+ "epoch_time_s": 62.8
112
  },
113
  {
114
  "epoch": 4,
115
+ "train_loss": 0.1417,
116
+ "val_loss": 0.0588,
117
+ "train_acc": 0.9577,
118
+ "val_acc": 0.9824,
119
  "per_category": {
120
+ "Education": 0.997,
121
+ "Entertainment": 0.998,
122
  "Fees": 1.0,
123
+ "Groceries": 1.0,
124
+ "Healthcare": 0.982,
125
+ "Income": 0.997,
126
+ "Insurance": 0.994,
127
+ "Mortgage": 0.998,
128
+ "Personal Care": 1.0,
129
  "Rent": 1.0,
130
+ "Restaurants": 0.98,
131
+ "Shopping": 0.871,
132
+ "Subscription": 0.918,
133
+ "Transfer": 0.98,
134
+ "Transportation": 0.991,
135
+ "Travel": 0.997,
136
+ "Utilities": 0.998
137
  },
138
+ "epoch_time_s": 63.0
139
  },
140
  {
141
  "epoch": 5,
142
+ "train_loss": 0.0701,
143
+ "val_loss": 0.0272,
144
+ "train_acc": 0.9788,
145
+ "val_acc": 0.9925,
146
  "per_category": {
147
+ "Education": 1.0,
148
+ "Entertainment": 0.995,
149
  "Fees": 1.0,
150
+ "Groceries": 1.0,
151
+ "Healthcare": 0.998,
152
  "Income": 1.0,
153
+ "Insurance": 0.998,
154
+ "Mortgage": 0.996,
155
  "Personal Care": 1.0,
156
  "Rent": 1.0,
157
+ "Restaurants": 0.995,
158
+ "Shopping": 0.919,
159
+ "Subscription": 0.98,
160
+ "Transfer": 0.995,
161
+ "Transportation": 0.995,
162
+ "Travel": 1.0,
163
+ "Utilities": 1.0
164
  },
165
+ "epoch_time_s": 63.3
166
  },
167
  {
168
  "epoch": 6,
169
+ "train_loss": 0.042,
170
+ "val_loss": 0.0126,
171
+ "train_acc": 0.9873,
172
+ "val_acc": 0.9967,
173
  "per_category": {
174
+ "Education": 1.0,
175
+ "Entertainment": 1.0,
176
  "Fees": 1.0,
177
+ "Groceries": 1.0,
178
+ "Healthcare": 1.0,
179
  "Income": 1.0,
180
+ "Insurance": 1.0,
181
+ "Mortgage": 0.998,
182
  "Personal Care": 1.0,
183
  "Rent": 1.0,
184
+ "Restaurants": 1.0,
185
+ "Shopping": 0.968,
186
+ "Subscription": 0.985,
187
+ "Transfer": 0.997,
188
+ "Transportation": 0.995,
189
+ "Travel": 1.0,
190
+ "Utilities": 1.0
191
  },
192
+ "epoch_time_s": 63.3
193
  },
194
  {
195
  "epoch": 7,
196
+ "train_loss": 0.0254,
197
+ "val_loss": 0.0114,
198
+ "train_acc": 0.9924,
199
+ "val_acc": 0.9973,
200
  "per_category": {
201
+ "Education": 1.0,
202
+ "Entertainment": 1.0,
203
  "Fees": 1.0,
204
+ "Groceries": 1.0,
205
+ "Healthcare": 1.0,
206
  "Income": 1.0,
207
+ "Insurance": 1.0,
208
+ "Mortgage": 0.998,
209
+ "Personal Care": 0.998,
210
  "Rent": 1.0,
211
+ "Restaurants": 0.992,
212
+ "Shopping": 0.972,
213
+ "Subscription": 0.998,
214
+ "Transfer": 1.0,
215
+ "Transportation": 0.995,
216
+ "Travel": 1.0,
217
+ "Utilities": 1.0
218
  },
219
+ "epoch_time_s": 63.2
220
  },
221
  {
222
  "epoch": 8,
223
+ "train_loss": 0.0202,
224
+ "val_loss": 0.0072,
225
+ "train_acc": 0.994,
226
+ "val_acc": 0.9983,
227
  "per_category": {
228
  "Education": 1.0,
229
+ "Entertainment": 1.0,
230
  "Fees": 1.0,
231
+ "Groceries": 1.0,
232
+ "Healthcare": 1.0,
233
  "Income": 1.0,
234
+ "Insurance": 1.0,
235
+ "Mortgage": 0.998,
236
  "Personal Care": 1.0,
237
  "Rent": 1.0,
238
+ "Restaurants": 1.0,
239
+ "Shopping": 0.978,
240
+ "Subscription": 0.998,
241
+ "Transfer": 1.0,
242
+ "Transportation": 0.997,
243
+ "Travel": 1.0,
244
+ "Utilities": 1.0
245
  },
246
+ "epoch_time_s": 63.2
247
  },
248
  {
249
  "epoch": 9,
250
+ "train_loss": 0.0139,
251
+ "val_loss": 0.0035,
252
+ "train_acc": 0.9958,
253
+ "val_acc": 0.999,
254
  "per_category": {
255
+ "Education": 1.0,
256
+ "Entertainment": 1.0,
257
  "Fees": 1.0,
258
+ "Groceries": 1.0,
259
+ "Healthcare": 1.0,
260
  "Income": 1.0,
261
+ "Insurance": 1.0,
262
+ "Mortgage": 1.0,
263
  "Personal Care": 1.0,
264
  "Rent": 1.0,
265
+ "Restaurants": 1.0,
266
+ "Shopping": 0.983,
267
+ "Subscription": 1.0,
268
+ "Transfer": 1.0,
269
+ "Transportation": 1.0,
270
+ "Travel": 1.0,
271
  "Utilities": 1.0
272
  },
273
+ "epoch_time_s": 63.3
274
  },
275
  {
276
  "epoch": 10,
277
+ "train_loss": 0.0121,
278
+ "val_loss": 0.0043,
279
+ "train_acc": 0.9966,
280
+ "val_acc": 0.9989,
281
  "per_category": {
282
  "Education": 1.0,
283
  "Entertainment": 1.0,
284
  "Fees": 1.0,
285
  "Groceries": 1.0,
286
+ "Healthcare": 1.0,
287
  "Income": 1.0,
288
+ "Insurance": 1.0,
289
+ "Mortgage": 1.0,
290
+ "Personal Care": 0.998,
291
  "Rent": 1.0,
292
+ "Restaurants": 1.0,
293
+ "Shopping": 0.987,
294
+ "Subscription": 0.998,
295
+ "Transfer": 1.0,
296
+ "Transportation": 0.998,
297
+ "Travel": 1.0,
298
  "Utilities": 1.0
299
  },
300
+ "epoch_time_s": 63.4
301
  },
302
  {
303
  "epoch": 11,
304
+ "train_loss": 0.0094,
305
+ "val_loss": 0.0049,
306
+ "train_acc": 0.9975,
307
+ "val_acc": 0.9988,
308
  "per_category": {
309
  "Education": 1.0,
310
  "Entertainment": 1.0,
311
  "Fees": 1.0,
312
+ "Groceries": 1.0,
313
+ "Healthcare": 1.0,
314
  "Income": 1.0,
315
+ "Insurance": 1.0,
316
+ "Mortgage": 1.0,
317
  "Personal Care": 1.0,
318
  "Rent": 1.0,
319
+ "Restaurants": 1.0,
320
+ "Shopping": 0.982,
321
+ "Subscription": 1.0,
322
+ "Transfer": 1.0,
323
+ "Transportation": 0.998,
324
  "Travel": 1.0,
325
  "Utilities": 1.0
326
  },
327
+ "epoch_time_s": 63.2
328
  },
329
  {
330
  "epoch": 12,
331
+ "train_loss": 0.0087,
332
+ "val_loss": 0.0027,
333
+ "train_acc": 0.9976,
334
+ "val_acc": 0.9991,
335
  "per_category": {
336
  "Education": 1.0,
337
  "Entertainment": 1.0,
338
  "Fees": 1.0,
339
+ "Groceries": 1.0,
340
+ "Healthcare": 1.0,
341
  "Income": 1.0,
342
+ "Insurance": 1.0,
343
+ "Mortgage": 1.0,
344
+ "Personal Care": 0.998,
345
  "Rent": 1.0,
346
+ "Restaurants": 1.0,
347
+ "Shopping": 0.988,
348
+ "Subscription": 1.0,
349
+ "Transfer": 1.0,
350
+ "Transportation": 0.998,
351
  "Travel": 1.0,
352
  "Utilities": 1.0
353
  },
354
+ "epoch_time_s": 63.3
355
  },
356
  {
357
  "epoch": 13,
358
+ "train_loss": 0.0068,
359
+ "val_loss": 0.0047,
360
+ "train_acc": 0.9981,
361
+ "val_acc": 0.9988,
362
  "per_category": {
363
  "Education": 1.0,
364
  "Entertainment": 1.0,
365
  "Fees": 1.0,
366
+ "Groceries": 0.998,
367
+ "Healthcare": 1.0,
368
  "Income": 1.0,
369
+ "Insurance": 1.0,
370
+ "Mortgage": 1.0,
371
  "Personal Care": 1.0,
372
  "Rent": 1.0,
373
+ "Restaurants": 1.0,
374
+ "Shopping": 0.983,
375
+ "Subscription": 1.0,
376
+ "Transfer": 1.0,
377
+ "Transportation": 0.998,
378
  "Travel": 1.0,
379
  "Utilities": 1.0
380
  },
381
+ "epoch_time_s": 63.1
382
  },
383
  {
384
  "epoch": 14,
385
+ "train_loss": 0.0066,
386
+ "val_loss": 0.0029,
387
+ "train_acc": 0.9981,
388
+ "val_acc": 0.9989,
389
  "per_category": {
390
  "Education": 1.0,
391
  "Entertainment": 1.0,
392
  "Fees": 1.0,
393
+ "Groceries": 0.998,
394
+ "Healthcare": 1.0,
395
  "Income": 1.0,
396
  "Insurance": 1.0,
397
+ "Mortgage": 1.0,
398
+ "Personal Care": 0.998,
399
  "Rent": 1.0,
400
+ "Restaurants": 1.0,
401
+ "Shopping": 0.988,
402
+ "Subscription": 1.0,
403
+ "Transfer": 1.0,
404
+ "Transportation": 0.997,
405
  "Travel": 1.0,
406
  "Utilities": 1.0
407
  },
408
+ "epoch_time_s": 63.1
409
  },
410
  {
411
  "epoch": 15,
412
+ "train_loss": 0.0059,
413
+ "val_loss": 0.0049,
414
+ "train_acc": 0.9983,
415
+ "val_acc": 0.9989,
416
  "per_category": {
417
  "Education": 1.0,
418
  "Entertainment": 1.0,
419
  "Fees": 1.0,
420
+ "Groceries": 1.0,
421
+ "Healthcare": 1.0,
422
  "Income": 1.0,
423
  "Insurance": 1.0,
424
+ "Mortgage": 1.0,
425
  "Personal Care": 1.0,
426
  "Rent": 1.0,
427
+ "Restaurants": 1.0,
428
+ "Shopping": 0.985,
429
+ "Subscription": 1.0,
430
+ "Transfer": 1.0,
431
+ "Transportation": 0.997,
432
  "Travel": 1.0,
433
  "Utilities": 1.0
434
  },
435
+ "epoch_time_s": 63.0
436
  },
437
  {
438
  "epoch": 16,
439
+ "train_loss": 0.0055,
440
+ "val_loss": 0.0033,
441
+ "train_acc": 0.9983,
442
+ "val_acc": 0.9992,
443
  "per_category": {
444
  "Education": 1.0,
445
  "Entertainment": 1.0,
446
  "Fees": 1.0,
447
  "Groceries": 1.0,
448
+ "Healthcare": 1.0,
449
  "Income": 1.0,
450
  "Insurance": 1.0,
451
+ "Mortgage": 1.0,
452
+ "Personal Care": 0.998,
453
  "Rent": 1.0,
454
+ "Restaurants": 1.0,
455
+ "Shopping": 0.988,
456
+ "Subscription": 1.0,
457
+ "Transfer": 1.0,
458
+ "Transportation": 1.0,
459
  "Travel": 1.0,
460
  "Utilities": 1.0
461
  },
462
+ "epoch_time_s": 63.1
463
  },
464
  {
465
  "epoch": 17,
466
+ "train_loss": 0.0049,
467
+ "val_loss": 0.0032,
468
+ "train_acc": 0.9987,
469
+ "val_acc": 0.9991,
470
  "per_category": {
471
  "Education": 1.0,
472
  "Entertainment": 1.0,
473
  "Fees": 1.0,
474
+ "Groceries": 1.0,
475
+ "Healthcare": 1.0,
476
  "Income": 1.0,
477
+ "Insurance": 1.0,
478
+ "Mortgage": 1.0,
479
+ "Personal Care": 0.998,
480
  "Rent": 1.0,
481
+ "Restaurants": 1.0,
482
+ "Shopping": 0.987,
483
+ "Subscription": 1.0,
484
+ "Transfer": 1.0,
485
+ "Transportation": 1.0,
486
  "Travel": 1.0,
487
  "Utilities": 1.0
488
  },
489
+ "epoch_time_s": 63.0
490
  },
491
  {
492
  "epoch": 18,
493
+ "train_loss": 0.0042,
494
+ "val_loss": 0.0034,
495
+ "train_acc": 0.9988,
496
+ "val_acc": 0.9991,
497
  "per_category": {
498
  "Education": 1.0,
499
  "Entertainment": 1.0,
500
  "Fees": 1.0,
501
+ "Groceries": 0.998,
502
+ "Healthcare": 1.0,
503
  "Income": 1.0,
504
+ "Insurance": 1.0,
505
+ "Mortgage": 1.0,
506
+ "Personal Care": 0.998,
507
  "Rent": 1.0,
508
+ "Restaurants": 1.0,
509
+ "Shopping": 0.988,
510
+ "Subscription": 1.0,
511
+ "Transfer": 1.0,
512
+ "Transportation": 1.0,
513
  "Travel": 1.0,
514
  "Utilities": 1.0
515
  },
516
+ "epoch_time_s": 63.0
517
  },
518
  {
519
  "epoch": 19,
520
+ "train_loss": 0.0045,
521
+ "val_loss": 0.0032,
522
+ "train_acc": 0.9989,
523
+ "val_acc": 0.9992,
524
  "per_category": {
525
  "Education": 1.0,
526
  "Entertainment": 1.0,
527
  "Fees": 1.0,
528
  "Groceries": 1.0,
529
+ "Healthcare": 1.0,
530
  "Income": 1.0,
531
+ "Insurance": 1.0,
532
+ "Mortgage": 1.0,
533
+ "Personal Care": 0.998,
534
  "Rent": 1.0,
535
+ "Restaurants": 1.0,
536
+ "Shopping": 0.988,
537
+ "Subscription": 1.0,
538
  "Transfer": 1.0,
539
+ "Transportation": 1.0,
540
  "Travel": 1.0,
541
  "Utilities": 1.0
542
  },
543
+ "epoch_time_s": 63.0
544
  },
545
  {
546
  "epoch": 20,
547
+ "train_loss": 0.0038,
548
+ "val_loss": 0.0032,
549
+ "train_acc": 0.9989,
550
+ "val_acc": 0.9992,
551
  "per_category": {
552
  "Education": 1.0,
553
  "Entertainment": 1.0,
554
  "Fees": 1.0,
555
  "Groceries": 1.0,
556
+ "Healthcare": 1.0,
557
  "Income": 1.0,
558
+ "Insurance": 1.0,
559
+ "Mortgage": 1.0,
560
+ "Personal Care": 0.998,
561
  "Rent": 1.0,
562
+ "Restaurants": 1.0,
563
+ "Shopping": 0.988,
564
+ "Subscription": 1.0,
565
  "Transfer": 1.0,
566
+ "Transportation": 1.0,
567
  "Travel": 1.0,
568
  "Utilities": 1.0
569
  },
570
+ "epoch_time_s": 63.0
571
  }
572
  ],
573
  "final_per_category": {
574
  "Education": {
575
  "accuracy": 1.0,
576
+ "correct": 582,
577
+ "total": 582,
578
  "top_confusions": {}
579
  },
580
  "Entertainment": {
581
  "accuracy": 1.0,
582
+ "correct": 579,
583
+ "total": 579,
584
  "top_confusions": {}
585
  },
586
  "Fees": {
587
  "accuracy": 1.0,
588
+ "correct": 609,
589
+ "total": 609,
590
  "top_confusions": {}
591
  },
592
  "Groceries": {
593
+ "accuracy": 1.0,
594
+ "correct": 613,
595
+ "total": 613,
596
+ "top_confusions": {}
 
 
597
  },
598
  "Healthcare": {
599
+ "accuracy": 1.0,
600
+ "correct": 616,
601
+ "total": 616,
602
+ "top_confusions": {}
 
 
 
 
603
  },
604
  "Income": {
605
  "accuracy": 1.0,
606
+ "correct": 626,
607
+ "total": 626,
608
  "top_confusions": {}
609
  },
610
  "Insurance": {
611
+ "accuracy": 1.0,
612
+ "correct": 635,
613
+ "total": 635,
614
+ "top_confusions": {}
 
 
615
  },
616
+ "Mortgage": {
617
  "accuracy": 1.0,
618
+ "correct": 565,
619
+ "total": 565,
620
  "top_confusions": {}
621
  },
622
+ "Personal Care": {
623
+ "accuracy": 0.998,
624
+ "correct": 584,
625
+ "total": 585,
626
+ "top_confusions": {
627
+ "Shopping": 1
628
+ }
629
+ },
630
  "Rent": {
631
  "accuracy": 1.0,
632
+ "correct": 608,
633
+ "total": 608,
634
  "top_confusions": {}
635
  },
636
  "Restaurants": {
637
+ "accuracy": 1.0,
638
+ "correct": 590,
639
+ "total": 590,
640
+ "top_confusions": {}
 
 
641
  },
642
  "Shopping": {
643
+ "accuracy": 0.988,
644
+ "correct": 596,
645
+ "total": 603,
646
  "top_confusions": {
647
+ "Healthcare": 6,
648
+ "Personal Care": 1
 
649
  }
650
  },
651
  "Subscription": {
652
+ "accuracy": 1.0,
653
+ "correct": 597,
654
+ "total": 597,
655
+ "top_confusions": {}
 
 
 
 
656
  },
657
  "Transfer": {
658
+ "accuracy": 1.0,
659
+ "correct": 599,
660
+ "total": 599,
661
+ "top_confusions": {}
 
 
662
  },
663
  "Transportation": {
664
+ "accuracy": 1.0,
665
+ "correct": 588,
666
+ "total": 588,
667
+ "top_confusions": {}
 
 
 
668
  },
669
  "Travel": {
670
  "accuracy": 1.0,
671
+ "correct": 601,
672
+ "total": 601,
673
  "top_confusions": {}
674
  },
675
  "Utilities": {
676
  "accuracy": 1.0,
677
+ "correct": 604,
678
+ "total": 604,
679
  "top_confusions": {}
680
  }
681
  }