Üksus 5 / 11

Funktsioonide projekteerimine: variantide loomine, kodeerimine, skaleerimine ja lekke vältimine

Kasu:

  • Võimalus luua tähenduslikke tuletusfunktsioone domeeni teadmistega ja kodeerida kategoorilisi kategooriaid sobivate meetoditega (üks kuum, silt, sihtmärk)
  • Võimalus skaleerida numbrilisi muutujaid mudeli tüübi järgi (standardiseerimine, normaliseerimine) ja vältida tarbetut või mittetäielikku skaleerimist
  • Võimalus vältida funktsioonide leket, õppides selgeks kõik teisendused pärast treeningu/testi jaotust ja ainult treeningust

Masinõppes kehtib vana ütlus: "Rakenduslik masinõpe on sisuliselt funktsioonitehnoloogia." Kuna mudeli edu tuleneb sageli sellest, milliseid sisendeid te mudelile annate, mitte sellest, millise algoritmi valite. Funktsioonide projekteerimine on toorandmetest tähenduslike signaalide tootmise kunst, millest mudel saab õppida. Tehisintellekt on praeguses etapis rikkalik ideede allikas: kui küsite "millisi funktsioone saab nendest andmetest toota", loetleb see kümneid soovitusi. Kuid mõned neist soovitustest võivad olla väärtuslikud, mõned kasutud ja mõned võivad olla ohtlikud (lekkida). Sinu ülesanne on see korda teha.

Miks funktsioonitehnoloogia

Toorandmed jõuavad mudelisse harva selle parimal kujul. Kui ainuüksi veerg "sünnikuupäev" on mõttetu, on selle põhjal genereeritud "vanuse" väärtus tugev signaal. Tellimuse ajatemplist saate eraldada atribuute, nagu "nädalapäev", "päev/öö", "kas on puhkus". Suhtarvu (võla/sissetuleku suhe) saamiseks võite kombineerida kaks veergu. Siin muudab funktsioonide insener domeeniteadmised matemaatiliseks signaaliks; Ja just seetõttu on see lava, mis nõuab kõige rohkem inimlikku intelligentsust.

Kategooriliste muutujate teisendamine arvudeks: kodeerimine

Mudelid töötavad üldiselt numbrite, mitte tekstiga. Kategooriliste muutujate (nagu linn, värv, toote tüüp) teisendamist numbriteks nimetatakse kodeerimiseks. Kolm levinud meetodit:

Ühekordne kodeering: avab iga kategooria jaoks eraldi veeru väärtusega 0/1. "Linna" jaoks moodustatakse Istanbuli, Ankara, Izmiri veerud; Kui klient on Istanbulist, on ainult see veerg 1. Ideaalne, kui kategooriate arv on väike; Kui kategooriaid on liiga palju, tekitab see sadu veerge (seda nimetatakse "suuruse plahvatuseks").

Sildi kodeering: annab igale kategooriale numbri (Istanbul=0, Ankara=1). See on lihtne, kuid võib kogemata mudelile jada õpetada (nt Ankara > Istanbul); seega kasutatakse seda järjestamata kategooriates ettevaatusega.

Sihtkodeering: asendab iga kategooria selle kategooria sihtmuutuja keskmisega. See on väga võimas, kuid kõige ohtlikum lekkeallikas: kui võtta arvesse katseandmete sihtmärki, näeb mudel tulevikku. Seda tuleks arvutada ainult treeningandmete põhjal ja hoolikalt (ristvalideerimise raames).

Skaleerimine: suured numbrid ei koorma mudelit üle jõu

Mõned mudelid (kauguspõhised, lineaarsed mudelid, närvivõrgud) on muutujate skaala suhtes tundlikud. Kui "sissetulek" (0-500 000) ja "vanus" (0-100) langevad samasse mustrisse, võib sissetulek domineerida lihtsalt seetõttu, et see on suurem. Skaleerimine parandab selle. Kaks levinumat meetodit: standardimine (teisendab iga väärtuse "mitu standardhälvet keskmisest kõrvale") ja normaliseerimine (min-max normaliseerimine - tihendab väärtused vahemikku 0-1). Puupõhised mudelid (otsustuspuud, juhuslik mets) on mastaabitundetud, ei vaja skaleerimist.

Ettevaatust: Skaleerimis- ja kodeerimisparameetrid (keskmine, standardhälve, kategooria-keskmise kaardistamine) tuleks arvutada ainult treeningandmete põhjal, seejärel tuleks sama rakendada ka katseandmetele. Katseandmete kaasamine on leke ja muudab teie mudeli tegelikust paremaks.

Lekke süda funktsioonide projekteerimisel

Funktsioonide genereerimine on see koht, kus andmete lekkimine kõige sagedamini pärineb. Kaks tüüpilist viga: ajaleke – tulevast teavet sisaldava funktsiooni loomine (kaasa arvatud päevad pärast prognoosipäeva, kui arvutatakse „viimase 30 päeva keskmine”). Statistika leke — funktsiooni (skaala keskmise, sihtkodeeringu väärtuse) arvutamine kõigist andmetest enne treeningu/testi jaotust. Reegel: õppige iga teisendust pärast seda, kui olete kõigepealt teinud rongi/testi jaotuse ja ainult treeningandmetest. Kõige ohutum viis seda regulaarselt teha on torujuhtme kasutamine – struktuur, mis kogub kõik teisendused ühte ahelasse ja rakendab need pärast poolitamist.

meetod

mille eest

Lekkeoht

märkus

Üks kuum kodeering

Muutuja mõne kategooriaga

madal

Suureneb plahvatuslikult mitmes kategoorias

Sildi kodeerimine

Sorteeritud kategooria

madal

Korrast väljas õpetab vale järjekorda

sihtkodeering

Mitme kategooria, tugev signaal

väga kõrge

Just haridusest, CV-s

standardimine

Lineaarsed/kaugusmudelid

keskmine

Parameeter sõltub ainult haridusest

Ajaakna funktsioon

aegrida

kõrge

Lisage tulevik

kolm minikarpi

Juhtum 1 – Väärtuslik vara. Krediidimeeskond genereeris võla ja sissetuleku suhte funktsiooni töötlemata veergudest „igakuine sissetulek” ja „igakuine võlamakse”. See üksainus tuletatud funktsioon suurendas mudeli täpsust 71%-lt 79%-le; sest riski määras tegelikult määr, mitte absoluutne sissetulek. Õppetund: domeeniteadmiste genereeritud suhted on tugevad signaalid.

Juhtum 2 – sihtmärgi kodeeringu leke. Üks meeskond teisendas sihtkoodi sihtkodeeringuga numbriks (selle piirkonna keskmine suhtlusmäär), kuid tegi seda enne jagamist kõigi andmete põhjal. Mudel andis testikomplektis 94%, langedes tootmises 68%-le. 6 nädalat pingutust raisatud. Õppetund: eesmärgi kodeerimine toimub hoolikalt, ainult koolituse raames.

Juhtum 3 – skaleerimise unustamine. Üks analüütik andis tulu (0–400 000) ja kliendi vanuse (18–75) kauguspõhisesse mudelisse ilma skaleerimata. Modell vaatas peaaegu eranditult sissetulekut, purustades vanuseefekti. Kui skaleerimine lisati, muutus segmenteerimine tähendusrikkaks. Õppetund: kauguse/lineaarsete mudelite puhul ei jäeta tähelepanuta skaleerimist.

Neli kopeeritavat malli

1) Funktsiooniideede loomine (kõrvaldamine on teie otsustada):

Teie roll: funktsioonide inseneri assistent. Minu df veerud: sünnikuupäev, tellimuse_aeg (ajatempel), tulu_tl, võla_tl, linn, toote_kategooria. Eesmärk: "kas laen makstakse tagasi" (0/1). Soovitage 15 funktsiooni, mida saab nendest veergudest genereerida; määrake iga jaoks lekkeoht (madal/keskmine/kõrge). Märkige selgelt need, mis sisaldavad tulevast teavet.

2) Turvaline kodeerimine (jagamisjärgne):

Kirjutage kood, mis kodeerib "linn" ja "tootekategooria". TÄHTIS: sobitage kodeering ainult treeningandmetega, seejärel teisendage testiandmed (sklearn OneHotEncoderiga). Selgitage, kuidas käsitlete hariduses nähtamatut kategooriat (handle_unknown).

3) Lekkevaba muundamine torujuhtmega:

Sklearn Pipeline'i seadistamine: kasutage StandardScalerit numbriveergudele, OneHotEncoderit kategoorilistele veergudele, lisage lõppu klassifikaator. Garanteerige, et kõik muudatused õpitakse PÄRAST rongi/testi jaotust ja ainult koolitusest. Selgitage koodi ja miks see on lekkevaba.

4) Ajaakna funktsioon (lekkekontroll):

Looge iga kliendi jaoks atribuut "tellimuste arv viimase 30 päeva jooksul", kuid ärge kunagi lisage andmeid pärast prognoositavat päeva. Selgitage rida-realt, et kood ei vaata tulevikku. Esitan viitekuupäeva veeru.

Nõrk viip / Tugev viip

Nõrk viip:

Lisage nendele andmetele häid omadusi.

"Hea" on määratlemata, sihtmärk on ebaselge, lekkekontroll puudub. AI genereerib juhuslikke, võib-olla lekkivaid funktsioone.

Võimas viip:

Teie roll: funktsiooniinsener. Sihtmärk: "lõpeta 30 päeva pärast" (0/1), hinnanguline võrdluskuupäev: salvestamise_kuupäev. Teenuses df.Task on tehinguajalugu: looge 8 funktsiooni, vastake igale küsimusele "Kas mul on prognoosimise ajal see teave". Kuupäeva lisamine pärast võrdluskuupäeva ajaakna funktsioonidesse. Kirjutage kood torujuhtmega ühilduval viisil, et see käivitataks pärast rongi/testi sektsiooni.

Siin on algusest peale määratletud sihtmärk, võrdlusaeg ja lekkekontroll.

Levinud vead

  • Teisenduse õppimine kõigist andmetest enne jagamist. Kui skaleerimise/kodeerimise parameeter näeb katseandmeid, tekib leke.
  • Sihtmärgi kodeerimise hooletu kasutamine. See on kõige võimsam, kuid kõige lekkivam meetod; just koolituselt, ristvalideerimisel.
  • Tuleviku lisamine ajaakna funktsiooniga. Kui "viimase 30 päeva" arvutus sisestatakse pärast prognoosipäeva, näeb mudel tulevikku.
  • Tarbetu skaleerimine puumudelis ja mittetäielik skaleerimine lineaarses mudelis. Skaleerimise otsused tehakse vastavalt mudelitüübile.
  • AI iga funktsiooni soovituse lisamine ilma kahtluseta. Soovitused võivad sisaldada kasutuid ja lekkivaid funktsioone.
Näpunäide. Kirjutage iga loodud funktsiooni kohta üks küsimus: "Kas ma saan selle väärtuse arvutada selle teabe põhjal, mis mul on ennustuse tegemise ajal?" Kui vastus ei ole selge "jah", ärge kasutage seda funktsiooni. See üksainus distsipliin kõrvaldab enamiku funktsioonidega seotud lekkeid.

Kokkuvõttes

Funktsioonide projekteerimine on toorandmetest tähenduslike signaalide genereerimise kunst ja see määrab sageli mudeli edukuse rohkem kui algoritm. Peamised tööriistad on kategooriate kodeerimine (üksik, silt, sihtmärk), numbrite skaleerimine (standardiseerimine, normaliseerimine) ja tuletistunnuste loomine domeeni teadmistega. Kuid see faas on ka lekke süda: kõik teisendused tuleb õppida pärast treeningu/testi jaotust ja ainult treeningandmetest. AI genereerib palju ideid; Inimlik otsustusvõime eristab väärtuslikku ohtlikust.

Rakenduse ülesanne

Valige sihtmuutuja ja kujundage olemasolevatest veergudest vähemalt viis tuletist. Igaühe neist vastake kirjalikult küsimusele "kas olen ennustuse hetkel kättesaadav" ja kõrvaldage vähemalt üks "kõrge lekkeoht". Seejärel kodeerige turvafunktsioonid konveierisse, mida rakendatakse pärast partitsiooni.

kontrollnimekiri

  • [ ] Kas rakendasin pärast rongi/katse jagamist kõik teisendused?
  • [ ] Kas ma õppisin skaleerimise/kodeerimise parameetreid ainult koolitusest?
  • [ ] Kas olen vastanud iga funktsiooni puhul küsimusele "kas mul on see ennustamise ajal"?
  • [ ] Kas olen olnud eriti ettevaatlik kõrge riskiga meetodite, näiteks sihtmärgi kodeerimisega?
  • [ ] Kas olen otsustanud mudelitüübile (puu/lineaarne) sobivalt skaleerida?