Funktsiooni teisendamine masinõppeks, Algajate juhend

Masinõppemudelite optimeerimise õppimisega alustades leian sageli pärast mudeli loomise etappi jõudmist, et peaksin uuesti andmete uuesti vaatama minemiseks, et andmestikus sisalduvate omaduste paremaks käsitlemiseks. Aja jooksul olen avastanud, et üks esimesi samme enne mudelite loomist on andmetes esinevate muutujate tüüpide hoolikalt ülevaatamine ja proovimine kindlaks teha parim muundumisprotsess, mida on vaja mudeli optimaalse jõudluse saavutamiseks.

Järgmises postituses kirjeldan protsessi, mida kasutan nelja tavalise muutuja tüübi tuvastamiseks ja teisendamiseks. Kasutan andmestikku, mis on võetud https://www.drivendata.org/ veebisaidil korraldatud soojendusvõistluse “Südame masinõpe” põhjal. Täieliku andmestiku saab alla laadida siit: https://www.drivendata.org/competitions/54/machine-learning-with-a-heart/data/. DrivenData korraldab regulaarselt veebipõhiseid väljakutseid, mis põhinevad sotsiaalsete probleemide lahendamisel. Olen hiljuti hakanud tegelema mõnega neist võistlustest, püüdes kasutada oma oskusi mõjuval põhjusel ning saada ka kogemusi andmekogumite ja probleemidega, millega ma oma igapäevases töös tavaliselt kokku ei puutu.

Muutujate tüüpide tuvastamine

Statistikas saab arvulisi muutujaid jagada nelja peamisse tüüpi. Masinõppeprojekti käivitamisel on oluline kindlaks teha, millist tüüpi andmeid teie funktsioonid sisaldavad, kuna see võib mudelite toimivusele märkimisväärset mõju avaldada. Olen püüdnud kirjeldada allpool toodud nelja tüüpi lihtsat kirjeldust.

  • Pidevad muutujad on muutujad, millel võib olla lõpmatu arv võimalikke väärtusi, erinevalt diskreetsetest muutujatest, millel võib olla ainult määratletud väärtuste vahemik. Pideva muutuja näiteks on miilide arv, mille auto on oma elu jooksul läbinud.
  • Nominaalmuutujad on kategoorilised väärtused, millel on 2 või enam võimalikku väärtust, kuid milles nende väärtuste järjekord ei oma tähendust. Näiteks võiksime numbrilise esituse abil tõlgendada seda tüüpi autosid, mis ütlevad, et kompaktsetel on väärtus 1, MPV-l on väärtus 2 ja kabriolettil on väärtus 3. Kuid asjaolu, et kompaktautodel on väärtus 1 ja kabrioleti väärtus 2 ei tähenda, et matemaatiliselt oleks kabriolett suurem kui MPV. See on lihtsalt kategooria numbriline esitus.
  • Dihhotoomilised muutujad on jällegi kategoorilised, kuid neil on ainult 2 võimalikku väärtust, tavaliselt 0 ja 1. Näiteks võime liigitada auto omamise kategooriasse 1 (tähendab jah) või 0 (tähendab ei). Kui teisendame muutujad näivveergudeks (mida teeme hiljem selles postituses), muutuvad ka toodetud uued omadused dihhotoomilisteks.
  • Tavalised muutujad sarnanevad nominaalsega selle poolest, et neil on 2 või enam võimalikku väärtust, peamine erinevus seisneb selles, et nendel väärtustel on tähenduslik järjekord või järjekord. Nii et meie auto näites võib see olla midagi sellist, nagu mootori suurus, kus neid kategooriaid saab tellida võimsuse järgi, 1,2, 1,6, 1,8.

Andmete ettevalmistamine

Ma kavatsen kasutada meie masinõpet koos südameandmetega muutujatüüpide tuvastamise ja muundamise protsessis. Olen CSV-failid alla laadinud ja lugenud Jupyteri sülearvuti. Järgmisena käivitan järgmise funktsiooni, et saada ülevaade andmete koostisest.

importida pandasid pd-na
def quick_analysis (df):
 print („Andmetüübid:”)
 print (df.dtypes)
 print („Ridad ja veerud:”)
 print (df.kuju)
 print (“Veeru nimed:”)
 print (df.kolonnid)
 print (“Nullväärtused:”)
 print (df.apply (lambda x: summa (x.isnull ()) / len (df)))
kiire_analüüs (rong)

See annab järgmise väljundi.

See ütleb mulle, et mul on väike andmestik, ainult 180 rida ja et seal on 15 veergu. Üks funktsioonidest on mittearvuline ja seetõttu tuleb see enne enamiku masinõppe raamatukogude rakendamist ümber kujundada. Puuduvad nullväärtused, nii et ma ei pea muretsema nende kohtlemise pärast. Enne andmestiku töötlemist kukutan praegu ka veeru „patsient_id”, kuna see pole arvuline ja seda ei kasutata ühelgi koolitus- ega ennustamisjärgus.

Seejärel käivitan pandade kirjeldamise funktsiooni, et saada kiire kirjeldav statistika.

rong.describe ()

Muutujatüüpide kategoriseerimiseks andmekogumis käivitan järgmise koodi, mis loob kõigi numbriliste tunnuste histogrammid. Saadud väljundist näete hõlpsalt, millised omadused on pidevad ja kaheharulised. Pidevatel omadustel on pidev jaotusmuster, samas kui dihhotoomilistel omadustel on ainult kaks riba. Nominaalsete ja harilike muutujate määramine võib mõnikord olla keerukam ja võib nõuda täiendavaid teadmisi andmekogumist või mõnda konkreetset valdkonna teadmist. Sellise masinõppevõistluse puhul soovitaksin viidata mis tahes pakutavale andmesõnastikule, kui seda pole (nagu siin on), võib olla vajalik intuitsiooni ning katse-eksituse kombinatsioon.

import matplotlib.pyplot plt
rong [train.dtypes [(train.dtypes == "float64")) | (train.dtypes == "int64")]
                        .index.values] .hist (fig. suurus = [11,11])

Ma kirjeldasin funktsioone alljärgnevas tabelis neljaks tüübiks. Nüüd saan teha mõned otsused ümberkujundamisetappide kohta, mida võtan ette andmete ettevalmistamiseks koolituseks ja ennustamiseks.

Mannekeeni muutujad

Nagu selles postituses varem mainitud, tuleb mittearvulised väärtused teisendada täisarvudeks või ujukiteks, et neid saaks kasutada enamikus masinõppe raamatukogudes. Madala kardinaalsusega muutujate puhul on parim viis tavaliselt muuta funktsioon üheks veeruks kordumatu väärtuse kohta, 0-ga, kui väärtust pole, ja 1-ga, kui see on. Neid nimetatakse näivmuutujateks.

Seda meetodit saab tavaliselt kõige paremini kasutada ka kõigi nominaalsete muutujate puhul. Kuna neil pole sisemist järjekorda, kui me seda esimest ei rakenda, võib masinõppe algoritm otsida seoseid nende väärtuste järjekorras valesti.

Pandas on selle nimega get_dummies () jaoks kena funktsioon. Allpool toodud koodis olen seda kasutanud kõigi nominaalsete ja mittenumbriliste tunnuste teisendamiseks uuteks veergudeks. Väljundist näete, et mitu uut veergu on loodud ja algsed veerud on maha jäetud.

dummy_cols = ['thal', 'chest_pain_type', 'num_major_vessels',
              'exercise_induced_angina', 'fasting_blood_sugar_gt_120_mg_per_dl',
              'resting_ekg_results', 'slope_of_peak_exercise_st_segment']
rong = pd.get_dummies (rong, veerud = dummy_cols)

Funktsiooni skaleerimine

Pidevad muutujad meie andmekogumis on erineva ulatusega. Näiteks kui vaadata tagasi ülaltoodud histogramme, näete, et muutuja „oldpeak_eq_st_depression” on vahemikus 0 kuni 6, samas kui „max_heart_rate_achieved” on vahemikus 100 kuni 200. See tekitab probleeme paljudele populaarsetele masinõppe algoritmidele, mis kasutavad sageli Eukleidese vahemaid lõplike ennustuste tegemiseks andmepunktide vahel. Kõigi pidevate muutujate skaala standardiseerimine võib sageli suurendada masinõppe mudelite jõudlust.

Funktsioonide skaleerimise teostamiseks pythonis on mitmeid meetodeid. Minu eelistatud meetod on kasutada funktsiooni Sci-Kit Learn MinMaxScaler. Mis muudab skaala nii, et funktsioonide kõik väärtused jäävad vahemikku 0 kuni 1. Olen lisanud mõne koodi, mis seda allpool teeb.

sklearn impordi eeltöötlus
n_test = rong [['seerumi_kolesterooli_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure']]
cols_to_norm = ['seerumi_kolesterooli_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure']
x = n_testiväärtused
min_max_scaler = eeltöötlus.MinMaxScaler ()
x_scaled = min_max_scaler.fit_transform (x)
n_test = pd.DataFrame (x_scaled, columns = cols_to_norm)
l_test = rong.drop (['seerumi_kolesterooli_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure'], telg = 1)
rong = pd.concat ([n_test, l_test], telg = 1)
rong.veerud

Binning

Ülaltoodud koodi põhjal võite märgata, et ma ei lisanud funktsiooni skaleerimise teisendusse pidevat muutujat “vanus”. Põhjus on see, et vanus on näide tunnuse tüübist, mille muutumisest diskreetseks muutujaks võiks kasu olla. Selles näites saame funktsiooni kohendamise või binningu abil muuta funktsioon tähenduslike kategooriate loendiks.

Allpool olevas koodis olen määratlenud intuitiivsed kategooriad, mis põhinevad andmete jaotusel. See kasutab pandade lõikamise funktsiooni, mis võtab arvesse prügikastide loendi, rühmanimed ja andmeraami. See funktsioon tagastab algse andmeraami koos uue funktsiooniga “age_categories”. Selle veeru saab seejärel eelnevalt kirjeldatud meetodil muuta mitmeks mannetuks veeruks.

prügikastid = [30, 40, 50, 60, 70, 80]
rühmanimed = ['30 -39 ', '40 -49', '50-59 ', '60-69', '70-79 ']
age_categories = pd.cut (rong ['vanus'], prügikastid, sildid = rühmanimed)
rong ['age_categories'] = pd.cut (rong ['vanus'], prügikastid, sildid = rühmanimed)
vanusekategooriad
pd.value_counts (rong ['age_categories'])

Nüüd on meil andmekogum, kus kõik veerud ei ole arvulised. Oleme loonud mitmeid uusi funktsioone ja mugandanud olemasolevad funktsioonid vormingutesse, mis peaksid aitama parandada kõigi masinõppe mudelite toimivust, mida me nüüd kasutame. Funktsioonide ümberkujundamine on oluline esimene samm masinõppe protsessis ja see võib sageli märkimisväärselt mõjutada mudeli jõudlust. Olen siin visandanud esimesed sammud, mille ma ette astuksin, et loogiliselt mõelda, kuidas käsitleda erinevaid muutujaid, mis mul on. Mudeli loomise etapis lähen peaaegu alati tagasi ja täpsustan andmeid, kasutades erinevaid meetodeid, et proovida mudelite täpsust suurendada. Kuid ma leian, et kui neid samme alguses järgida, vähendab see sageli aega, mille ma kulutaksin üleminekuetappide juurde naasmiseks.