| # 15-feature transaction schema v2. | |
| # Changes from v1: merchant_id scaled to 10K, device_hash to 2K. | |
| # Within-transaction ordering grouped by semantic family (D14) so the 3-wide | |
| # conv windows see coherent feature neighborhoods. | |
| # Reserved token convention per feature (D6): 0=MASK, 1=OOV, 2=NULL, 3+=values. | |
| # vocab_size = num_values + 3 for every feature. | |
| num_features: 15 | |
| num_transactions: 64 | |
| reserved_tokens: | |
| MASK: 0 | |
| OOV: 1 | |
| NULL: 2 | |
| values_start: 3 | |
| features: | |
| # --- Temporal block (indices 0-3) --- | |
| - name: hour | |
| family: temporal | |
| type: categorical | |
| num_values: 24 | |
| vocab_size: 27 | |
| description: Hour of day (0-23) | |
| - name: dow | |
| family: temporal | |
| type: categorical | |
| num_values: 7 | |
| vocab_size: 10 | |
| description: Day of week (0=Monday) | |
| - name: days_since_last | |
| family: temporal | |
| type: bucketed | |
| num_values: 30 | |
| vocab_size: 33 | |
| bucket_range: [0, 365] | |
| bucket_method: quantile | |
| description: Days since previous transaction, bucketed | |
| - name: is_recurring | |
| family: temporal | |
| type: binary | |
| num_values: 2 | |
| vocab_size: 5 | |
| description: Whether this is a recurring/subscription payment | |
| # --- Merchant block (indices 4-7) --- | |
| - name: mcc | |
| family: merchant | |
| type: categorical | |
| num_values: 100 | |
| vocab_size: 103 | |
| description: Merchant category code (100 common MCCs) | |
| - name: merchant_id | |
| family: merchant | |
| type: categorical | |
| num_values: 10000 | |
| vocab_size: 10003 | |
| description: Synthetic merchant identifier (10K merchants) | |
| - name: customer_merchant_count | |
| family: merchant | |
| type: bucketed | |
| num_values: 20 | |
| vocab_size: 23 | |
| bucket_range: [0, 500] | |
| bucket_method: quantile | |
| description: How many times this customer has transacted at this merchant | |
| - name: entry_mode | |
| family: merchant | |
| type: categorical | |
| num_values: 5 | |
| vocab_size: 8 | |
| values: | |
| 0: card_present | |
| 1: card_not_present | |
| 2: contactless | |
| 3: chip | |
| 4: manual_key | |
| description: How the card was presented | |
| # --- Risk + identity block (indices 8-14) --- | |
| - name: amount | |
| family: risk_identity | |
| type: bucketed | |
| num_values: 256 | |
| vocab_size: 259 | |
| bucket_range: [0.01, 25000.0] | |
| bucket_method: quantile | |
| description: Transaction amount in USD, quantile-bucketed into 256 bins | |
| - name: card_product | |
| family: risk_identity | |
| type: categorical | |
| num_values: 10 | |
| vocab_size: 13 | |
| values: | |
| 0: basic_debit | |
| 1: basic_credit | |
| 2: rewards_credit | |
| 3: premium_credit | |
| 4: platinum_credit | |
| 5: business_debit | |
| 6: business_credit | |
| 7: prepaid | |
| 8: virtual | |
| 9: corporate | |
| description: Card product type | |
| - name: country | |
| family: risk_identity | |
| type: categorical | |
| num_values: 50 | |
| vocab_size: 53 | |
| description: Transaction country code (50 most common) | |
| - name: avs | |
| family: risk_identity | |
| type: categorical | |
| num_values: 5 | |
| vocab_size: 8 | |
| values: | |
| 0: full_match | |
| 1: zip_match | |
| 2: address_match | |
| 3: no_match | |
| 4: not_checked | |
| description: Address verification result | |
| - name: cvv | |
| family: risk_identity | |
| type: categorical | |
| num_values: 3 | |
| vocab_size: 6 | |
| values: | |
| 0: match | |
| 1: no_match | |
| 2: not_provided | |
| description: CVV verification result | |
| - name: device_hash | |
| family: risk_identity | |
| type: categorical | |
| num_values: 2000 | |
| vocab_size: 2003 | |
| description: Device fingerprint hash bucket (2000 synthetic devices) | |
| - name: customer_tenure | |
| family: risk_identity | |
| type: bucketed | |
| num_values: 10 | |
| vocab_size: 13 | |
| bucket_range: [0, 120] | |
| bucket_method: uniform | |
| description: Customer account age in months, bucketed | |