In card_transaction.v1.csv, 51 calendar months contain normal transaction
volume with exactly zero rows labeled Is Fraud? = True.
The gaps are long and contiguous, not scattered:
2011 Feb–Dec, 2014 May–Dec, 2017 Jan–Oct, 2019 Nov–Dec, 2020 Jan–Feb
Example — 2017:
Months 1–10: ~145k transactions each, 0 fraud
Month 11: 142k transactions, 58 fraud
Month 12: 146k transactions, 197 fraud
Neighbouring years run 200–300 fraud/month at the same volume. At the
dataset's 0.122% base rate, ~145k transactions imply ~175 expected fraud
events per month, so zero across ten consecutive months appears to be a
labeling artifact rather than a property of the simulation.
Impact: these rows behave as false negatives. Trained on, they teach a
model that fraud-shaped behaviour is legitimate; in an evaluation window
they turn correct detections into apparent false positives. Any temporal
split that crosses one of these blocks will produce misleading metrics.
Is this expected — e.g. a change in the generator's labeling regime — or
unintended? Either way it may be worth a note in the dataset README so
users can exclude the affected months.
Reproduce (DuckDB):
SELECT Year, Month, count(*) rows, sum("Is Fraud?"::INT) fraud
FROM read_csv_auto('card_transaction.v1.csv')
GROUP BY 1,2 HAVING fraud = 0 AND rows > 10000 ORDER BY 1,2;
happy to submit a PR adding a note to data/credit_card/README.md
In card_transaction.v1.csv, 51 calendar months contain normal transaction
volume with exactly zero rows labeled Is Fraud? = True.
The gaps are long and contiguous, not scattered:
2011 Feb–Dec, 2014 May–Dec, 2017 Jan–Oct, 2019 Nov–Dec, 2020 Jan–Feb
Example — 2017:
Months 1–10: ~145k transactions each, 0 fraud
Month 11: 142k transactions, 58 fraud
Month 12: 146k transactions, 197 fraud
Neighbouring years run 200–300 fraud/month at the same volume. At the
dataset's 0.122% base rate, ~145k transactions imply ~175 expected fraud
events per month, so zero across ten consecutive months appears to be a
labeling artifact rather than a property of the simulation.
Impact: these rows behave as false negatives. Trained on, they teach a
model that fraud-shaped behaviour is legitimate; in an evaluation window
they turn correct detections into apparent false positives. Any temporal
split that crosses one of these blocks will produce misleading metrics.
Is this expected — e.g. a change in the generator's labeling regime — or
unintended? Either way it may be worth a note in the dataset README so
users can exclude the affected months.
Reproduce (DuckDB):
SELECT Year, Month, count(*) rows, sum("Is Fraud?"::INT) fraud
FROM read_csv_auto('card_transaction.v1.csv')
GROUP BY 1,2 HAVING fraud = 0 AND rows > 10000 ORDER BY 1,2;
happy to submit a PR adding a note to data/credit_card/README.md