LFED / docs /EXPANSION_PLAN.md
Kasualdad's picture
feat: fine-tuned model + GGUF export pipeline fixes
31c493f
|
Raw
History Blame Contribute Delete
11.3 kB

A newer version of the Gradio SDK is available: 6.19.0

Upgrade

LFED Training Data Expansion Plan

Last updated: 2026-06-08 Goal: Expand from 1,289 pairs on 2 tables → 10,000+ pairs across 8+ analytics domains


Current State

What We Have Now

  • Tables: 2 (enrollment, attendance)
  • Training pairs: 1,289 (template-generated)
  • Templates: 32
  • Coverage: Chronic absenteeism, enrollment counts, absence rates
  • Quality: Good for narrow domain, but synthetic-feeling

What's in local-data-stack (Untapped Analytics Domains)

From /Users/flucido/projects/local-data-stack/rill_project/data/:

Domain Table Rows Key Columns
Chronic Absenteeism Risk chronic_absenteeism_risk 1,700 risk_score, risk_level, attendance_rate_30d/90d, discipline_incidents, demographics
Student Wellbeing wellbeing_risk_profiles 1,700 attendance/discipline/academic_risk_scores, wellbeing_risk_level, primary_concern
Performance Correlations performance_correlations 3 correlation_pair, coefficient, strength
Class Effectiveness class_effectiveness 300 avg_grade, pct_passed, effectiveness_rating, ELL/SpEd/FRL pass rates
Equity Outcomes equity_outcomes_by_demographics 10 race_ethnicity, ELL, SpEd, FRL, avg_gpa, pct_below_c

Phase 1: Schema Expansion (Add 6 New Tables)

Add these tables to the DuckDB seed data and update prompts.py:

1.1 grades

CREATE TABLE grades (
    student_id INTEGER,
    school_name VARCHAR,
    school_year VARCHAR,
    grade_level INTEGER,
    course_name VARCHAR,
    term VARCHAR,              -- 'Fall', 'Spring'
    letter_grade VARCHAR,      -- 'A', 'B', 'C', 'D', 'F'
    grade_numeric DOUBLE,      -- 4.0, 3.0, etc.
    gpa DOUBLE,
    credit_hours DOUBLE
);

1.2 discipline

CREATE TABLE discipline (
    incident_id INTEGER,
    student_id INTEGER,
    school_name VARCHAR,
    school_year VARCHAR,
    grade_level INTEGER,
    incident_type VARCHAR,     -- 'Defiance', 'Fighting', 'Vandalism', 'Substance', 'Bullying'
    incident_date DATE,
    severity VARCHAR,          -- 'Minor', 'Major', 'Severe'
    action_taken VARCHAR,      -- 'Warning', 'Detention', 'Suspension', 'Expulsion'
    days_suspended INTEGER
);

1.3 demographics

CREATE TABLE demographics (
    student_id INTEGER,
    school_name VARCHAR,
    school_year VARCHAR,
    grade_level INTEGER,
    gender VARCHAR,
    race_ethnicity VARCHAR,
    english_learner BOOLEAN,
    special_education BOOLEAN,
    economically_disadvantaged BOOLEAN,
    homeless_flag BOOLEAN,
    migrant_flag BOOLEAN,
    foster_youth BOOLEAN
);

1.4 assessments

CREATE TABLE assessments (
    student_id INTEGER,
    school_name VARCHAR,
    school_year VARCHAR,
    grade_level INTEGER,
    assessment_type VARCHAR,   -- 'SBAC', 'CAASPP', 'CELCAST', 'District Benchmark'
    subject VARCHAR,           -- 'ELA', 'Math', 'Science'
    score DOUBLE,
    proficiency_level VARCHAR, -- 'Below Standard', 'Near Standard', 'At/Above Standard'
    growth_percentile INTEGER
);

1.5 programs

CREATE TABLE programs (
    student_id INTEGER,
    school_name VARCHAR,
    school_year VARCHAR,
    program_type VARCHAR,      -- 'Title I', 'ELL Support', 'SpEd IEP', '504 Plan', 'MTSS Tier 1/2/3'
    start_date DATE,
    end_date DATE,
    status VARCHAR             -- 'Active', 'Exited', 'Transferred'
);

1.6 staff

CREATE TABLE staff (
    staff_id INTEGER,
    school_name VARCHAR,
    school_year VARCHAR,
    role VARCHAR,              -- 'Teacher', 'Counselor', 'Admin', 'Aide'
    subject_area VARCHAR,
    years_experience INTEGER,
    credential_type VARCHAR,
    student_load INTEGER
);

Phase 2: Training Data Expansion (1,289 → 10,000+ pairs)

2.1 New Template Categories (add ~150 templates)

Grades & GPA (~30 templates)

  • Average GPA by school/grade/demographic
  • Grade distribution (A/B/C/D/F counts and percentages)
  • GPA trends over time
  • Failing rate by course/teacher
  • GPA comparison between schools
  • Students below 2.0 GPA
  • Honor roll counts

Discipline (~30 templates)

  • Incident counts by type, school, year
  • Suspension rates by demographic
  • Discipline trends over time
  • Most common incident types
  • Students with multiple incidents
  • Days lost to suspension by school
  • Discipline correlation with attendance

Demographics (~20 templates)

  • Enrollment by race/ethnicity
  • ELL student counts and percentages
  • SpEd population by school
  • Economically disadvantaged rates
  • Foster/homeless student counts
  • Demographic breakdowns of outcomes

Assessments (~30 templates)

  • Proficiency rates by subject and school
  • Growth percentiles by grade
  • Assessment score trends
  • Below-standard student counts
  • Demographic gaps in test scores
  • School performance rankings

Programs (~20 templates)

  • Active program counts by type
  • MTSS tier distribution
  • IEP/504 plan counts
  • Program participation by school
  • Title I eligible counts

Cross-Table Joins (~20 templates)

  • Attendance vs. grades correlation
  • Discipline incidents vs. GPA
  • ELL status vs. assessment scores
  • SpEd vs. chronic absenteeism
  • Program participation vs. outcomes

2.2 Data Augmentation Strategies

A. Rephrasing (3-5x multiplier)

For each template, generate additional natural-language phrasings:

  • Formal: "What is the average GPA for 9th graders at Jefferson High?"
  • Informal: "What's the avg GPA for freshmen at Jefferson?"
  • Abbreviated: "9th grade GPA at Jefferson High?"
  • Typo-prone: "Whats the avg gpa for 9th graders at jefferson hiogh?"
  • Context-rich: "I'm preparing for the board meeting — need 9th grade GPA at Jefferson High for 2023-2024"

Implementation: Use a small LLM (Qwen2.5-1.5B) to rephrase each template's question while keeping the SQL identical.

B. Question Decomposition

Train on multi-part questions:

  • Q: "Compare chronic absenteeism rates and average GPA between Lincoln Elementary and Jefferson High"
  • SQL: Two CTEs or UNION ALL

C. Ambiguous Questions

Train the model to ask clarifying questions or make reasonable assumptions:

  • Q: "How are our students doing?"
  • SQL: SELECT school_name, AVG(gpa) ... (with a reasonable default)

D. Error Recovery

Train on edge cases:

  • Questions referencing non-existent columns → model should generate closest valid query
  • Questions about data that doesn't exist → model should return empty result gracefully

2.3 Seed Data Expansion

Current: 2,900 students, 5 schools, 4 years

Expand to:

  • 10,000 students across 8 schools
  • 6 school years (2019-2025)
  • Realistic distributions:
    • Chronic absenteeism: 15% (current) — keep
    • GPA distribution: normal around 2.8, std 0.8
    • Discipline: 8% of students with 1+ incident
    • ELL: 18%, SpEd: 12%, FRL: 45%
    • Assessment proficiency: 55% at/above standard

2.4 Quality Assurance Pipeline

  1. SQL Validation: Run every generated SQL against seed data — must return results (or empty for legitimate queries)
  2. Schema Match: Every column/table referenced must exist in schema
  3. Dedup: Exact-match dedup on questions, near-match dedup on SQL structure
  4. Balance Check: Ensure even coverage across all tables and query patterns
  5. Human Review: Sample 5% of pairs for manual review

Phase 3: Training Improvements

3.1 Data Quality

Current Target
1,289 pairs 10,000+ pairs
2 tables 8 tables
32 templates 150+ templates
Template-only questions Template + LLM-rephrased + typo variants
No join queries 20% multi-table joins
No ambiguous queries 5% ambiguous/clarification-needed

3.2 Training Config Improvements

Param Current Proposed Why
Epochs 3 2 More data needs fewer epochs to avoid overfitting
Learning rate 2e-4 1e-4 More data = can use lower LR for better convergence
LoRA rank 16 32 More data supports higher rank without overfitting
Max seq length 2048 4096 Multi-table joins need longer sequences
Batch size 4×4=16 4×8=32 Larger effective batch for larger dataset

3.3 Evaluation Metrics

Add eval set (10% holdout):

  • Exact match: Generated SQL matches expected SQL
  • Execution match: Generated SQL returns same results as expected
  • Schema validity: All referenced columns/tables exist
  • Safety: No DDL/DML statements generated

Phase 4: Implementation Order

Step Task Effort Priority
1 Define new table schemas (above) 1 hour P0
2 Generate seed data for 6 new tables 2 hours P0
3 Add new templates for grades + discipline (60 templates) 3 hours P0
4 Run synthetic generation → 5,000+ pairs 30 min P0
5 SQL validation pass (run all pairs against seed data) 1 hour P0
6 Add demographic + assessment templates (50 templates) 2 hours P1
7 LLM rephrasing augmentation (3x multiplier) 2 hours P1
8 Add cross-table join templates (20 templates) 1 hour P1
9 Re-run generation → 10,000+ pairs 30 min P1
10 Train v2 model with expanded data 2-3 hours P1
11 Eval v1 vs v2 on holdout set 1 hour P2
12 Deploy v2 to HF Space 30 min P2

Total estimated effort: ~15-18 hours of work


Phase 5: Quick Wins (Do First)

5.1 Expand Seed Data (immediate)

Write a generate_seed_v2.py that creates all 6 new tables with realistic distributions. This unblocks everything else.

5.2 Port local-data-stack Patterns

The local-data-stack already has analytics models for:

  • Chronic absenteeism risk scoring
  • Wellbeing composite scores
  • Class effectiveness ratings
  • Equity outcome comparisons

Port these SQL patterns into training templates. The queries are already validated — just need NL phrasings.

5.3 Add Join Templates

The biggest gap in current training is zero join queries. Even 20 join templates would dramatically improve the model's ability to answer cross-domain questions.


Appendix: local-data-stack Column Reference

chronic_absenteeism_risk

student_key, grade_level, school_id, gender, race_ethnicity, english_learner, special_education, economically_disadvantaged, homeless_flag, attendance_rate_30d, unexcused_absence_rate_30d, discipline_incidents_30d, absence_discipline_correlation_score, attendance_rate_90d, attendance_trend_90d, chronic_absence_flag, chronic_absenteeism_risk_score, risk_level

wellbeing_risk_profiles

student_key, grade_level, school_id, attendance_risk_score, discipline_risk_score, academic_risk_score, high_risk_domain_count, wellbeing_risk_score, wellbeing_risk_level, primary_concern

class_effectiveness

course_id, school_id, grade_level, enrollment_count, avg_grade_numeric, pct_passed, pct_a_b_grades, course_avg_grade, grade_diff_from_course_avg, pct_passed_ell, pct_passed_sped, pct_passed_frl, pass_rate_rank, grade_rank, effectiveness_rating, term

equity_outcomes_by_demographics

race_ethnicity, english_learner, special_education, economically_disadvantaged, cohort_size, pct_good_attendance, pct_no_discipline, avg_gpa, pct_gpa_2_5_plus, pct_below_c