See leht ei lahenda praktikumi ära. Ta aitab sul vaadata õigesse kohta, selgitab, mida mõõdikud tähendavad, ja annab vihjeid kolmes astmes — võta järgmine alles siis, kui eelmisest ei piisanud.
Praktikumi mõte ei ole leida „õiget” eeltöötlust, vaid harjutada otsustamist olukorras, kus õiget vastust ei ole ette antud. Iga valik on hüpotees, mille sa mõõdad ära.
| Samm | Mida teed | Kuidas tead, et valmis |
|---|---|---|
| Ülevaatus | Vaatad iga veeru läbi ja paned kirja, mis on katki | Sul on tabel: veerg → probleem → plaan |
| Variant A | Minimaalne töötlus, et mudel üldse käima läheks | Sul on number, mida ületada |
| Variant B, C … | Üks muudatus korraga, iga muudatuse ette hüpotees | Tead, mis tulemust muutis ja mis mitte |
| Võrdlus | Võrdlustabel, graafikud, vastused küsimustele | Oskad põhjendada, miks valisid just selle |
cv_auc järgi, mitte test_auc järgi — testandmeid vaatad alles päris lõpus. Ja kui samm arvutab midagi andmete põhjal (mediaan, sagedaseim, kategooriate loend, skaleerija piirid), kuulub see Pipeline'i, mitte enne jagamist tehtud töötlusse.Kui hinda() kirjutab „Eeltöötlus tehti enne jagamist”, ei ole see viga, vaid meeldetuletus: kontrolli, kas mõni su samm õppis andmetest.
Kümme küsimust, mida andmestiku kohta küsida. Ava küsimus, kui ei tea, kust alustada. Vihjed avanevad ükshaaval — kolmas vihje ütleb, mida otsida, aga mitte, mida teha.
Enamik eeltöötlust parandab vigu. Aga mõnikord ei ole tunnus katki — ta on lihtsalt vales kujus. Kõige sagedasem juhtum: arv, mille suurus ei tähenda midagi. Kliendi number, artiklinumber, sihtnumber, osakonna kood. Pandas loeb need int64-ks ja mudel kohtleb neid mõõdetud suurustena.
Puumudel saab arvulise tunnusega teha ainult ühte asja: lõigata selle lävendi järgi kaheks (kood < 4718). Kui koodi number anti registreerimise järjekorras, ei tähenda selline lõige midagi. Mudel kas jätab tunnuse kasutamata või jätab üksikud koodid meelde — ja siis sobitub üle.
| Viis | Millal see mõttesse tuleb |
|---|---|
merge või map abitabeliga | Kui kood vastab millelegi sisukale ja see vastavus on kuskil kirjas |
Vahemike tabel (pd.IntervalIndex) | Kui tähendus on seotud väärtuse vahemikuga, mitte üksiku väärtusega |
pd.cut etteantud piiridega | Kui piirid tulevad valdkonnateadmisest (vanuserühmad, hinnaklassid) |
pd.qcut, KBinsDiscretizer | Kui tahad ühtlase suurusega rühmi ja piiridel pole sisulist tähendust |
Harvade tasemete liitmine "muu"-ks | Kui kategooriaid on palju ja osa neist esineb paar korda |
Andmeleke ei ole viga andmetes, vaid viga ajas. Tunnus, mis tekib pärast sündmust, mida ennustame, teeb mudeli treenides suurepäraseks ja päriselus kasutuks. Harjuta küsimust igal real: kas see väärtus on teada hetkel, mil ennustus tehakse?
Küsi iga sammu kohta: kas tulemus sõltub sellest, millised teised read andmestikus on?
| Ei sõltu → reegel → tohib olla enne jagamist | Sõltub → õpib → kuulub torustikku |
|---|---|
| tüübi teisendus · peidetud puuduvate märkimine · kirjapildi ühtlustamine · duplikaatide eemaldamine · võimatute väärtuste piiramine valdkonnateadmise järgi · kuupäevade teisendus · abitabeliga liitmine · tunnuse eemaldamine | puuduvate täitmine keskmise, mediaani või sagedaseimaga · skaleerimine · one-hot kategooriate loend · kvantiilidel põhinev binnimine · erindite piirid andmetest · sihtkodeerimine · tunnuste valik |
Praktikumi hinda() võtab vastu valmis torustiku ja fitib selle ainult treeningosal — ka iga ristvalideerimise foldi sees eraldi. Skelett, mille sisu on sinu otsustada:
handle_unknown="ignore" on seal põhjusega: foldis võib ette tulla kategooria, mida treeningosas polnud. Mõtle, mis juhtuks ilma selleta.
| Veerg | Mida ütleb | Mida sellega teha |
|---|---|---|
cv_auc | ROC AUC treeningosa 5-kordsest ristvalideerimisest | Selle järgi võrdled variante. Ainus number, mille põhjal otsustad. |
cv_std | Foldide hajuvus | Kui kahe variandi vahe on väiksem kui cv_std, ei ole vahet tõestatud. |
train_auc − test_auc | Ülesobitus | Suur vahe ei ole iseenesest viga, kui test ei kannata. Random forestil on see loomulikult suur. |
accuracy | Õigete ennustuste osakaal | Tasakaalust väljas klasside korral eksitav. Vaata, mida annaks „alati 0”. |
recall | Kui suur osa tegelikest ostjatest leiti | Oluline, kui vahelejäänud positiivne on kallis. |
f1 | Täpsuse ja saagise tasakaal | Sõltub lävendist 0,5 — AUC ei sõltu. |
Mudel annab tõenäosuse, mitte otsust. predict() kasutab vaikimisi lävendit 0,5, aga see ei ole püha number. Liiguta lävendit ja vaata, mis juhtub.
ROC AUC on kõigi lävendite kokkuvõte: tõenäosus, et juhuslik ostja saab kõrgema skoori kui juhuslik mitteostja. Seepärast ei muutu ta lävendist ja seepärast on ta variantide võrdlemiseks mugav.
Kõik kolm ehitavad otsustuspuid, aga erinevalt. See seletab, miks nad sinu eeltöötlusele erinevalt reageerivad.
| Parameeter | Mida reguleerib |
|---|---|
max_depth | Kui keerulisi reegleid üks puu tohib õppida |
min_samples_leaf | Kui väike võib leht olla — kaitse üksikute ridade meeldejätmise eest |
n_estimators | Puude arv. Metsas rohkem ei kahjusta, boostingus võib üle treenida |
learning_rate | Boostingus: kui suure sammu iga järgmine puu teeb |
class_weight, scale_pos_weight | Kui haruldasem klass on tähtsam kui tema osakaal |
Lühike meeldetuletus meetoditest, mis selles praktikumis ette tulevad. Kolm asja, mis segadust tekitavad:
df.isna() annab tabeli, df["veerg"].isna() ühe veeru vastuse. Enamik kokkuvõtteid (sum, mean, nunique, describe) töötab mõlemal: DataFrame'il veerupõhiselt, Seriesil ühe numbrina..str on ainult Seriesil ja ainult tekstiveerul: df["veerg"].str.strip(). Tervel DataFrame'il seda ei ole.pd.to_numeric(...), pd.cut(...), pd.to_datetime(...) võtavad sisse Seriesi, listi või NumPy massiivi ja annavad tagasi uue objekti — originaali nad ei muuda.Siin on ainult see, mida meetod teeb. Mis veeruga ja millise argumendiga seda rakendada, on sinu otsustada.
Vali olukord, mis sulle kõige lähemal on.
Kiire kontroll. Märgi ära, mis on tehtud.