Andmete eeltöötlus on tegelikult kaks eri tööd. Esimene on vigade parandamine: vale andmetüüp, kirjavead, duplikaadid, võimatud väärtused. Teine on andmete ettevalmistamine mudelile: puuduvate väärtuste täitmine, kodeerimine, skaleerimine. Nende vahele jääb üks otsustav samm – andmete jagamine treening- ja testosaks.
pd.read_csv, märgi peidetud puuduvad väärtusedIga eeltöötlussammu juures küsi: kas see samm arvutab midagi andmete põhjal? Kui arvutab (keskmine, mediaan, min ja max, kategooriate loend), siis on see samm „õppiv” ja see tohib õppida ainult treeningandmetelt. Kui ei arvuta, vaid rakendab kindlat reeglit, võib seda teha kohe pärast laadimist.
Tulemus ei sõltu sellest, millised teised read andmestikus on.
pd.to_numeric"?", "NA" → NaN"tallinn " → "Tallinn"fit treeningandmetel, transform mõlemal.
StandardScaler jt)Esimene samm on laadimine. Juba siin tasub pandasele öelda, millised tekstid tähendavad „väärtus puudub”, muidu jääb näiteks "?" tavaliseks tekstiks ja rikub terve arvulise veeru.
Järgmises osas on andmestik laaditud naiivselt – nii näed, mida iga kontroll leiab.
Allpool on väike klientide andmestik, kus ennustatakse, kas klient ostab (ostis). Selles on peidus kümme tüüpilist probleemi. Vali vasakult kontroll: näed pandase koodi, selle väljundit ja tabelis märgitakse kollasega, mida kontroll leidis. Kui parandus on reeglipõhine, saad selle kohe rakendada.
Testandmed mängivad „tulevikku”: andmeid, mida mudel treenimise ajal ei näe. Kui arvutad puuduvate täitmiseks keskmise kogu andmestikult, on testandmete info juba treeningusse jõudnud. Seda nimetatakse andmelekkeks (data leakage). Tulemus: testitäpsus paistab parem, kui mudel tegelikult uute andmete peal saavutab.
Vaata, kust tuleb väärtus, millega täidetakse puuduv sissetulek. Raamitud väärtused lähevad keskmise arvutamisse.
Vale
Õige
stratify=y hoiab klasside osakaalu treening- ja testosas samana – oluline, kui üks klass on haruldane. Ristvalideerimisel kehtib sama reegel iga foldi kohta; Pipeline hoolitseb selle eest automaatselt (vt samm 5).
Siin on kolm õppivat sammu. Igaühel on mitu võimalust ja õige valik sõltub tunnuse sisust ning mudelist.
Veerg vanus pärast ülevaatust: kolm väärtust on NaN ("?", −3 ja 210 muudeti puuduvaks). Vali strateegia ja vaata, kuidas muutuvad veeru statistikud.
Mudelid (sklearnis) vajavad arve. Küsimus on, kas kategooriatel on järjestus. linn on nominaalne (Tallinn pole „rohkem” kui Narva), haridus on järjestatud (põhi < kesk < kõrg).
linn
haridus
Veel: OneHotEncoder(handle_unknown="ignore") ei kuku kokku, kui testandmetes on linn, mida treeningus polnud. Väga paljude kategooriatega tunnusele (nt postiindeks) sobib pigem sageduse- või sihtkodeerimine (TargetEncoder, sklearn ≥ 1.3), mis teeb ristvalideerimise sisemiselt, et vältida leket. LabelEncoder on mõeldud sihttunnusele y, mitte tunnustele.
Sissetulekud eurodes, sh üks erind (45 000). Vali skaleerija ja vaata, kuhu punktid teljel satuvad.
Kõik mudelid ei vaja sama eeltöötlust. Vali veerupäisest mudel.
vajalik – ilma selleta mudel ei tööta või töötab halvasti soovitatav – mõjutab tulemust pole vaja
Reeglipõhine puhastus on funktsioonina enne jagamist, õppiv eeltöötlus on Pipeline'i sees. Nii tehakse fit ristvalideerimisel iga foldi treeningosal eraldi ja lekke võimalust pole.
Kui vahetad LogisticRegression välja RandomForestClassifier vastu, võid skaleerimise ära jätta – vaata tabelit eespool. Ülejäänud struktuur jääb samaks.