Preobrazba značilnosti za strojno učenje, Vodnik za začetnike

Ko sem se prvič začel učiti, kako optimizirati modele strojnega učenja, sem po zaključku faze gradnje modelov pogosto ugotovil, da bom moral še naprej pregledati podatke, da bom lažje obvladal vrste funkcij, ki so prisotne v naboru podatkov. Sčasoma sem ugotovil, da je eden od prvih korakov, ki jih je treba narediti pred izdelavo modelov, natančen pregled spremenljivih vrst, ki so prisotni v podatkih, in poskusiti določiti najboljši postopek transformacije, ki ga je treba izvesti za dosego optimalne učinkovitosti modela.

V naslednjem prispevku bom opisal postopek, ki ga bom uporabil za prepoznavanje in preoblikovanje štirih običajnih spremenljivk. Uporabljal bom nabor podatkov iz tekmovanja "strojnega učenja s srcem", ki ga prirejam na spletnem mestu https://www.drivendata.org/. Celoten nabor podatkov lahko prenesete tukaj https://www.drivendata.org/competitions/54/machine-learning-with-a-heart/data/. DrivenData gosti redne spletne izzive, ki temeljijo na reševanju družbenih težav. Pred kratkim sem se začel ukvarjati z nekaterimi tovrstnimi tekmovanji, da bi nekatere svoje veščine izkoristil za dober namen, pa tudi za pridobivanje izkušenj s naboji podatkov in težavami, s katerimi se v vsakodnevnem delu običajno ne srečujem.

Prepoznavanje spremenljivih vrst

Številčne spremenljivke lahko v statistiki razvrstimo v štiri glavne vrste. Pri zagonu projekta strojnega učenja je pomembno določiti vrsto podatkov, ki so v vsaki od vaših lastnosti, saj lahko to pomembno vpliva na uspešnost modelov. Poskusil sem dati preprost opis spodaj navedenih štirih vrst.

  • Nenehne spremenljivke so spremenljivke, ki imajo lahko neskončno število možnih vrednosti, v nasprotju z diskretnimi spremenljivkami, ki imajo lahko le določen obseg vrednosti. Primer neprekinjene spremenljivke je število prevoženih kilometrov avtomobila v svoji življenjski dobi.
  • Nominalne spremenljivke so kategorične vrednosti, ki imajo 2 ali več možnih vrednosti, vendar v vrstnem redu teh vrednosti nimajo pomena. Na primer, lahko uporabimo številčno predstavitev za razlago vrst avtomobilov, ki pravijo, da ima kompakt vrednost 1, MPV vrednost 2, kabriolet pa vrednost 3. Vendar pa je dejstvo, da ima kompaktni avtomobil vrednost 1 in kabriolet ima vrednost 2, ne pomeni, da je matematično kabrioletna skupina na nek način večja od MPV. To je preprosto številčni prikaz kategorije.
  • Dihotomne spremenljivke so spet kategorične, vendar imajo le dve možni vrednosti, običajno 0 in 1. Na primer, lastništvo avtomobila lahko kategoriziramo kot 1 (kar pomeni da) ali 0 (kar pomeni ne). Ko spremenimo spremenljivke v stolpce z lutkami (kar bomo storili pozneje v tej objavi), nove izdelane funkcije postanejo tudi dihotomne.
  • Navadne spremenljivke so podobne nominalnim po tem, da imajo 2 ali več možnih vrednosti, osnovna razlika je v tem, da imajo te vrednosti pomenljiv vrstni red ali rang. V našem primeru je to morda nekaj takega kot velikost motorja, kjer bi bilo mogoče te kategorije naročiti glede na moč, 1,2, 1,6, 1,8.

Priprava podatkov

Naše strojno učenje bom uporabil s srčnim naborom podatkov, da bom prehodil postopek prepoznavanja in preoblikovanja spremenljivih vrst. Prenesla in prebrala sem datoteke csv v Jupyterjev zvezek. Nato zaženem naslednjo funkcijo, da dobim posnetek sestave podatkov.

uvozite pande kot pd
def_nahodna_analiza (df):
 natis ("Vrste podatkov:")
 tisk (df.dtypes)
 natis (»Vrstice in stolpci:«)
 tisk (df.oblika)
 natis ("Imena stolpcev:")
 tisk (df.kolumne)
 natis („Ničelne vrednosti:“)
 natisni (df.apply (lambda x: sum (x.isnull ()) / len (df)))
hitra_analiza (vlak)

To ustvari naslednji izhod.

To mi pove, da imam majhen nabor podatkov le 180 vrstic in da je 15 stolpcev. Ena od funkcij je neštevilčna, zato jo je treba pred uporabo večine knjižnic strojnega učenja spremeniti. Ničelnih vrednosti ni, zato mi ni treba skrbeti za njihovo obravnavo. Pred obdelavo nabora podatkov zaenkrat spustim tudi stolpec "pati_id", saj je to neštevilčno in ga ne bomo uporabili v nobeni fazi usposabljanja ali napovedovanja.

Nato zaženem funkcijo opisovanja pand, da pripravim nekaj hitrih opisnih statistik.

train.describe ()

Za kategorizacijo spremenljivk v naboru podatkov zaženim naslednjo kodo, ki ustvari histograme vseh numeričnih lastnosti. Iz dobljenega izvoda lahko vidite, katere lastnosti so neprekinjene in dihotomne. Neprekinjene funkcije prikazujejo vzorec neprekinjene distribucije, medtem ko imajo dihotomne lastnosti le dve vrstici. Nominalne in redne spremenljivke so lahko včasih zahtevnejše za določanje in lahko zahtevajo dodatno znanje o naboru podatkov ali določeno specifično domensko znanje. V primeru tekmovanja v strojnem učenju, kot je ta, bi predlagal, da se sklicuje na kateri koli podatkovni slovar, ki ga lahko dobite, če ni enega (kot je tukaj), potem bo morda potrebna kombinacija intuicije in poskusov in napak.

uvoz matplotlib.pyplot kot plt
vlak [train.dtypes [(train.dtypes == "float64") | (train.dtypes == "int64")]
                        .index.values] .hist (figsize = [11,11])

V spodnji preglednici sem značilnosti razvrstil v štiri vrste. Zdaj se lahko odločim za korake preoblikovanja, ki jih bom sprejel, da bom pripravil podatke za usposabljanje in napovedovanje.

Dummy Variables

Kot smo že omenili v tej objavi, je treba vse neštevilčne vrednosti pretvoriti v cela števila ali floats, da jih lahko uporabimo v večini knjižnic strojnega učenja. Za spremenljivke z nizko kardinalnostjo je najboljši pristop pretvoriti funkcijo v en stolpec na edinstveno vrednost, z 0, kjer vrednost ni, in z 1, kjer je. Te se imenujejo navidezne spremenljivke.

To tehniko običajno najbolje uporabimo tudi pri vseh nominalnih spremenljivkah. Ker ti nimajo notranjega reda, če tega najprej ne uporabimo, lahko algoritem strojnega učenja napačno poišče odnos v vrstnem redu teh vrednosti.

Pandas ima lepo funkcijo za to imenovano get_dummies (). V spodnji kodi sem to uporabil za pretvorbo vseh nominalnih in neštevilčnih lastnosti v nove stolpce. Iz izhoda vidite, da je bilo ustvarjenih več novih stolpcev in izpuščeni izvirni stolpci.

dummy_cols = ['thal', 'sand_pain_type', 'num_major_vessels',
              'vadba_induced_angina', 'post_blood_sugar_gt_120_mg_per_dl',
              'resting_ekg_results', 'slope_of_peak_exercise_st_segment']
vlak = pd.get_dummies (vlak, stolpci = dummy_cols)

Prilagajanje velikosti

Nenehne spremenljivke v našem naboru podatkov so na različnih lestvicah. Če se na primer vrnete na zgornje histograme, lahko vidite, da se spremenljivka "oldpeak_eq_st_depression" giblje med 0 in 6, medtem ko se "max_heart_rate_achieved" giblje med 100 in 200. To predstavlja težavo pri številnih priljubljenih algoritmih strojnega učenja, ki pogosto uporabljajo evklidsko razdaljo med podatkovnimi točkami za končne napovedi. Standardizacija lestvice za vse neprekinjene spremenljivke lahko pogosto povzroči povečanje učinkovitosti modelov strojnega učenja.

Obstaja več načinov za izvedbo skaliranja funkcij v pythonu. Moj najprimernejši način je uporaba funkcije Sci-Kit Learn MinMaxScaler. Kar spremeni lestvico tako, da se vse vrednosti v lastnostih gibljejo od 0 do 1. Vključil sem nekaj kode, ki to naredi spodaj.

iz predobdelave uvoza sklearn
n_test = vlak [['serum_choterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure']]
cols_to_norm = ['serum_choterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure']
x = n_test.vredes
min_max_scaler = predhodna obdelava.MinMaxScaler ()
x_scaled = min_max_scaler.fit_transform (x)
n_test = pd.DataFrame (x_scaled, stolpci = cols_to_norm)
l_test = train.drop (['serum_choterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure'], os = 1)
vlak = pd.concat ([n_test, l_test], os = 1)
vlak.kolumni

Binning

Zgornja koda boste opazili, da v preoblikovanje spreminjanja lastnosti nisem vključil neprekinjene spremenljivke "starost". Razlog za to je, da je starost primer vrste značilnosti, ki bi lahko imela koristi od preoblikovanja v diskretno spremenljivko. V tem primeru lahko uporabimo vedro ali binning, da funkcijo spremenimo v seznam pomembnih kategorij.

V spodnji kodi sem določil intuitivne kategorije glede na porazdelitev podatkov. Pri tem uporabljamo funkcijo za rezanje pand, ki vsebuje seznam zabojev, imen_ skupin in podatkovnega okvira. Te funkcije vrnejo izvirni podatkovni okvir z novo funkcijo "age_categories". Ta stolpec je nato mogoče spremeniti v več stolpcev z lutkami po predhodno opisani metodi.

koši = [30, 40, 50, 60, 70, 80]
ime_ skupin = ['30 -39 ', '40 -49', '50 -59 ', '60 -69', '70 -79 ']
age_categories = pd.cut (vlak ['starost'], smetnjaki, oznake = imena_skupin)
vlak ['age_categories'] = pd.cut (vlak ['starost'], smetnjaki, oznake = imena_skupin)
starostne kategorije
pd.value_counts (vlak ['age_categories'])

Zdaj imamo nabor podatkov, kjer so vsi stolpci neštevilčni. Ustvarili smo več novih funkcij in obstoječe funkcije preoblikovali v formate, ki naj bi pripomogli k izboljšanju zmogljivosti vseh modelov strojnega učenja, ki jih zdaj lahko uporabljamo. Preobrazba lastnosti je pomemben prvi korak v procesu strojnega učenja in lahko pogosto pomembno vpliva na uspešnost modela. Tu sem orisal prve korake, ki bi jih naredil v procesu, da logično razmislim, kako ravnati z različnimi spremenljivkami, ki jih imam. Ko bom v fazi izdelave modela, se bom skoraj vedno vrnil nazaj in pregledoval podatke z različnimi metodami, da bom poskušal povečati natančnost modelov. Vendar pa ugotavljam, da z upoštevanjem teh korakov na začetku to pogosto skrajša čas, ki ga porabim za vrnitev v stopnje preobrazbe.