LightGBM (produksjon)
Modellen det live-surveyet faktisk bruker: leaderboardets LightGBM + bucket-skårer i full konfigurasjon (800 trær for kjønn, 1 000 for alder og humør; num_leaves=63; lr=0.03). Trening er en to-pasningsprosedyre – først et ærlig evalueringspass på et stratifisert 6 000 / 710 tilfeldig splitt, deretter et utrullingspass som refitter de tre boosterne på alle 6 710 gyldige sesjoner før de emittes. Cloudflare-workeren håndterer bare feature-ekstraksjon og databasepersistering; LightGBM-trærne selv sendes som JSON og nettleseren går gjennom dem med en 30-linjers tree walker.
Resultater
To-pasningstrening
Pass én er evalueringspasset. De 6 710 gyldige sesjonene
splittes med sklearn's train_test_split, stratifisert på kjønn
med seed 42, i 6 000 trenre- / 710 valideringsrader. Per-pool bucket-gitter
bygges kun fra de 6 000 treningsradene, slik at det ikke er lekkasje på
valideringsfolden. Alle tre hoder fittes og skåres på 710-rads hold-out;
disse tallene er det som fyller leaderboard-raden.
Pass to er utrullingspasset. Bucket-gitterne bygges om fra
alle rader, og de tre hodene refitters på alle 6 710 sesjoner. Bare disse
endelige boosterne emitteres til models-js/ som JSON. Den
utrullede modellen ser 710 flere rader enn evalueringsmodellen, så dens
sanne generalisering bør ikke være dårligere enn det pass én rapporterer –
leaderboard-tallet er en nedre grense for det som faktisk er i drift.
En tidligere versjon av dette skriptet brukte et temporalt hold-out (de siste 710 sesjonene i innsendingsrekkefølge) i stedet for et tilfeldig stratifisert splitt. Det kuttet kjønn-AUC opp til 0.900 på hold-out, men sprengte også alder- og humør-MAE opp til 7.3 og 10.4 fordi den nyeste kohorten drifter på disse målene – alder R² på det hold-out-settet ble negativt. Det tilfeldige splittet som brukes her gir en representativ valideringsfordeling og lar alle tre metrikkene evalueres på samme protokoll.
Konfigurasjon
- Feature-vektor477 floats for kjønn (441 base + 33 perseptuelle ekstra + 3 bucket-totaler), 475 for alder og humør (det samme med én bucket-kodet kovarians-skår i stedet for tre)
- Bucket-gitter8×8×8 RGB-gitter; feminin/maskulin kovarians for kjønn, mål-sentrert kovarians for alder og humør. Evaluerings-passgitter fra 6 000 treningsrader; utrullede gitter fra alle 6 710
- Trær (kjønn)800, ubegrenset dybde, maks 63 blader, lr=0.03, L2 lambda 1.0
- Trær (alder, humør)1 000, samme konfig, standard LightGBM L2 regresjonsformål
- Evalueringssplittstratifisert tilfeldig 6 000 / 710 på kjønn, seed 42
- Konverteringegendefinert flat-tre-emitter traverserer
booster.dump_model()iterativt og emitterer kompakt JSON (~3 MB per booster). En 30-linjers JavaScript tree walker leser JSON og kjører inferens klientsiden; bit-eksakt samsvar med LightGBM raw scores (maks|delta|= 0 på verifiseringsbatchen) - Utrullingtre JSON-tre-filer på
/ai/color-polygraph/models-js/{gender,age,mood}_trees.json(kjønn 2.8 MB, alder 3.5 MB, humør 3.5 MB). Lastes late av survey-siden og caches for sesjonen - Varm inferens~3–6 ms per mål i V8 på en ny laptop, trygt under 10 ms-budsjettet