LightGBM + bucket-skårer
Samme enkle LightGBM som varianten med perseptuelle features, pluss mål-enkodede fargebucket-skårer slått opp trilineært over et 8×8×8 RGB-gitter. Det signerte kjønn-bucket-totalet er den enkeltfeature med høyest gain i hele inputvektoren. Ny topp i kjønnskolonnen.
Resultater
Slik fungerer bucket-skårene
RGB-rommet deles inn i et 8×8×8 gitter av 32-brede kuber, med bucketsentre ved RGB-verdier 16, 48, 80, ..., 240. For hver sesjon bygger vi en 512-dims signert delta-vektor som fanger både fargene brukeren valgte og fargene de avslo:
- Ikke valgt i r1hver av de 48 runde-1-tilbudte fargene som IKKE ble valgt trekker 0.1 fra sin bucket
- Valgt overalthvert av de 21 valgene (16 r1 + 4 r2 + 1 siste) legger til 0.1 * 16 * 3 / 21 ≈ 0.229 til sin bucket
- Balanse48 * (-0.1) + 21 * (+0.229) = 0, så hver sesjons vektor summerer til nøyaktig null
Per CV-fold (StratifiedKFold for kjønn, KFold for regresjonshodene, seed 42) gjennomsnittes diskrete delta-vektorer over treningsradene i hver klasse / målverdi for å bygge per-bucket-skåregitter:
- girly_grid[b]gjennomsnittlig delta blant treningsjenter
- masc_grid[b]gjennomsnittlig delta blant treningsgutter
- age_grid[b]gjennomsnitt av ((alder - gjennitt_alder) * delta) over treningsrader (kovarians-stil)
- mood_grid[b]det samme for humør
Oppslag bruker trilineær interpolasjon: hver farges bidrag fordeles
over de 8 bucketsentrene rundt den i RGB-rommet, med vekter som summerer til
1. En farge nøyaktig på et bucketsenter lander helt i den bucketen; en farge
midt mellom to tilstøtende sentre deler 50/50; en farge midt i den 8-hjørnede
kuben deler åttedeler. Per-sesjons-featuren er deretter
smooth_delta @ grid, som matematisk tilsvarer "slå opp hvert
events interpolerte gitterverdi, vekt med +0.229 eller -0.1 avhengig av om
fargen ble valgt, summer over sesjonen".
Kritisk: gitterne bygges med kun treningsrader i gjeldende fold, slik at en sesjons bucket-deriverte features aldri avhenger av sin egen etikett – standardsikringen mot mål-enkodingslekkasje.
Hva dataene fant på egenhånd
Bucketene med høyest feminin-vs-maskulin lead, beregnet fra hele datasettet:
| RGB-senter | Lead | |
|---|---|---|
| (240, 176, 208) | +0.0190 | |
| (208, 176, 208) | +0.0174 | |
| (240, 144, 176) | +0.0154 | |
| (208, 176, 240) | +0.0152 | |
| (208, 144, 208) | +0.0150 |
Og de mest maskulint-lente:
| RGB-senter | Lead | |
|---|---|---|
| (48, 16, 240) | -0.0161 | |
| (48, 48, 240) | -0.0138 | |
| (48, 48, 208) | -0.0136 | |
| (80, 240, 48) | -0.0136 | |
| (16, 48, 176) | -0.0133 |
Dataene identifiserer de samme kjønnskodede klyngene som mennesker ville: rosa og lyse lilla lener seg feminint, sterke og mørke blå lener seg maskulint. Uteliggeren er en enkelt sterk grønn (80, 240, 48) – en guttefarge prototypemodellen min ikke fanget opp.
Aldersgitteret er like skarpt. Buckets som best forutsier over-gjennomsnittlig alder er mørke og dempede: mørk blå (80, 80, 208), mørk lilla (80, 48, 144), mørk grønn (16, 112, 16). Buckets som forutsier under-gjennomsnittlig alder er pasteller og sterke farger: lys rosa (240, 208, 240), lys cyan (112, 208, 240), hvit (240, 240, 240). Barn velger lyse og mettede farger, voksne velger dempede – og modellen finner det ut fra fargevelgene alene, uten håndkoding.
Feature-viktighet
Gain-basert viktighet fra en full-data LightGBM på kjønn. De tre kjønn-bucket-featurene dominerer fullstendig toppen av listen (* = ny feature fra dette eksperimentet, alle rangeringer av 477).
| Rangering | Feature | Gain |
|---|---|---|
| ★ 1 | signed_total | 27 326 |
| ★ 3 | girly_total | 1 789 |
| ★ 6 | masc_total | 1 119 |
signed_total alene bærer gain 27 326 – mer enn 2.5× den
nest-beste featuren (r1_lab_b_std med 10 689) og mer enn 15×
den neste individuelle bucket-featuren. Den signerte differansen er den
informasjonstette fordi den fanger kjønnsretningen med basispopulariteten
delt ut.
Hurtigoppslagstabell
Etter CV fitter skriptet også de fire gitterne på hele datasettet og skriver
dem til bucket_scores.npz. Alle med den filen pluss
konverteringskonstantene kan skåre en ny sesjon uten å kjøre trening på nytt:
bucket en farges RGB inn i gitteret, slå opp skåren med trilineær interpolasjon,
multipliser med +0.229 eller -0.1 avhengig av om fargen ble valgt, summer
over sesjonen. Fire tall kommer ut per sesjon – girly_total, masc_total,
age_total, mood_total – og de alene holder det meste av det den større
modellen bruker til å diskriminere.
Konfigurasjon
- Feature-vektor441 base + 33 perseptuelle (dokumentert her) + 3 kjønn-bucket-totaler (kjønnshode) + 1 alder-bucket-total (aldershode) + 1 humør-bucket-total (humørhode)
- ModellEnkel LightGBM, identisk konfig som enkelt-LGB-basislinje
- Bucket-gitter8×8×8 over RGB, 32-brede buckets, sentre ved (16, 48, ..., 240) per kanal
- Per-sesjons delta-verdier+0.1 * 16 * 3 / 21 ≈ +0.229 per valg, -0.1 per runde-1 tilbudt-men-ikke-valgt farge
- Skåregitterper-fold gjennomsnittlig delta over treningsrader i hver klasse (kjønn) eller per-fold kovarians av delta med mål (alder, humør)
- Oppslagtrilineær interpolasjon over de 8 omkringliggende bucketsentrene
- CV5-fold StratifiedKFold (kjønn), KFold (alder, humør), seed 42 – samme som alle andre rader