File size: 1,454 Bytes
d17ebad | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | """Train a small EC-frequency baseline using only the training split."""
import argparse
from collections import Counter
import json
from pathlib import Path
import pandas as pd
def train(path, output):
root = Path(__file__).parent
task = json.loads((root / 'task.json').read_text())
valid = set(json.loads((root / 'ec_vocabulary.json').read_text()))
frame = pd.read_parquet(path)
unique = frame.drop_duplicates(task['input_columns'] + ['ec_number'])
if not set(unique.ec_number) <= valid:
raise ValueError('Training data contains ECs outside the pinned vocabulary.')
counts = Counter(unique.ec_number)
ranked = sorted(counts, key=lambda ec: (-counts[ec], ec))
if not ranked:
raise ValueError('Training data is empty.')
limit = 1 # Both tasks are scored on the first EC only.
result = {'prediction': ranked[:limit], 'training_pairs': len(unique),
'baseline': 'EC frequency; ignores the input'}
target = Path(output)
target.parent.mkdir(parents=True, exist_ok=True)
target.write_text(json.dumps(result, indent=2) + '\n')
print(f'Trained on {len(unique)} input–EC pairs; saved {target}')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--train', required=True)
parser.add_argument('--output', default='weights/baseline.json')
args = parser.parse_args()
train(args.train, args.output)
|