Funkciju pārveidošana mašīnu apguvei, rokasgrāmata iesācējiem

Sākot mācīties, kā optimizēt mašīnmācīšanās modeļus, pēc modeļa izveidošanas es bieži secinu, ka man atkal būs jāatsāk pārskatīt datus, lai labāk apstrādātu datu kopā esošo īpašību veidus. Laika gaitā es atklāju, ka viens no pirmajiem soļiem, kas jāveic pirms modeļu veidošanas, ir rūpīgi pārskatīt datos esošos mainīgos veidus un mēģināt sākotnēji noteikt labāko pārveidošanas procesu, kas jāveic, lai sasniegtu optimālu modeļa veiktspēju.

Šajā rakstā es aprakstīšu procesu, kuru veicu, lai identificētu un pārveidotu četrus izplatītos mainīgo tipus. Es izmantošu datu kopu, kas ņemta no “mašīnmācīšanās ar sirdi” iesildīšanas konkursa, kas tiek organizēts vietnē https://www.drivendata.org/. Pilnu datu kopu var lejupielādēt šeit: https://www.drivendata.org/competitions/54/machine-learning-with-a-heart/data/. DrivenData regulāri rīko tiešsaistes izaicinājumus, kuru pamatā ir sociālo problēmu risināšana. Nesen esmu sācis iesaistīties dažās no šīm sacensībām, cenšoties izmantot dažas savas prasmes labā nolūkā, kā arī iegūt pieredzi ar datu kopām un problēmām, ar kurām es parasti nesaskaros ikdienas darbā.

Mainīgo veidu identificēšana

Statistikā skaitliskos mainīgos var iedalīt četros galvenajos veidos. Uzsākot mašīnmācīšanās projektu, ir svarīgi noteikt datu tipu, kas atrodas katrā no jūsu līdzekļiem, jo ​​tas var ievērojami ietekmēt modeļu darbību. Es mēģināju sniegt vienkāršu aprakstu par četriem zemāk aprakstītajiem veidiem.

  • Nepārtraukti mainīgie ir mainīgie, kuriem var būt bezgalīgs iespējamo vērtību skaits pretstatā diskrētajiem mainīgajiem, kuriem var būt tikai noteikts vērtību diapazons. Nepārtraukta mainīgā piemērs varētu būt jūdžu skaits, ko automašīna ir nobraukusi dzīves laikā.
  • Nominālie mainīgie ir kategoriskas vērtības, kurām ir 2 vai vairāk iespējamās vērtības, bet kurām šo vērtību secībai nav nozīmes. Piemēram, mēs varētu izmantot skaitlisku atveidojumu, lai interpretētu automašīnu tipus, sakot, ka kompaktajai vērtībai ir 1, MPV ir 2 un kabrioletam ir 3. Tomēr fakts, ka kompaktajai automašīnai ir 1 un kabrioleta vērtība ir 2 nenozīmē, ka matemātiski kabrioleta grupa ir kaut kādā ziņā lielāka par MPV. Tas ir vienkārši kategorijas skaitlisks attēlojums.
  • Dihotomi mainīgie atkal ir kategoriski, bet tiem ir tikai 2 iespējamās vērtības, parasti 0 un 1. Piemēram, mēs varam klasificēt automašīnas piederību 1 (nozīmē jā) vai 0 (nozīmē nē). Pārveidojot mainīgos lielumus slejās (ko mēs darīsim vēlāk šajā amatā), iegūtās jaunās funkcijas arī kļūst divdomīgas.
  • Parastie mainīgie ir līdzīgi nominālajiem ar to, ka tiem ir 2 vai vairāk iespējamās vērtības, galvenā atšķirība ir tā, ka šīm vērtībām ir nozīmīga secība vai rangs. Tātad mūsu automašīnas piemērā tas varētu būt kaut kas līdzīgs motora izmēram, kur šīs kategorijas var pasūtīt jaudas izteiksmē, 1.2, 1.6, 1.8.

Datu sagatavošana

Es izmantošu mūsu mašīnmācīšanos ar sirds datu kopu, lai izsekotu mainīgo tipu identificēšanas un pārveidošanas procesu. Esmu lejupielādējis un lasījis csv failus Jupyter piezīmjdatorā. Tālāk palaižu šo funkciju, lai iegūtu momentuzņēmumu par datu sastāvu.

importēt pandas kā pd
def quick_analysis (df):
 print (“Datu veidi:”)
 drukāt (df.dtypes)
 drukāt (“Rindas un kolonnas:”)
 drukāt (df.shape)
 print (“Kolonnu nosaukumi:”)
 print (df.kolonnas)
 print (“Null Values:”)
 drukāt (df.apply (lambda x: summa (x.isnull ()) / len (df)))
quick_analysis (vilciens)

Tādējādi tiek iegūta šāda izvade.

Tas man saka, ka man ir maza datu kopa, kurā ir tikai 180 rindas, un ka ir 15 kolonnas. Viena no funkcijām nav skaitliska, un tāpēc tā būs jāpārveido pirms lielākās daļas mašīnmācības bibliotēku izmantošanas. Nav nulles vērtību, tāpēc man nav jāuztraucas par izturēšanos pret tām. Pirms datu kopas apstrādes es arī nometīšu kolonnu “pacienta_id”, jo tā nav skaitliska un netiks izmantota nevienā apmācības vai prognozēšanas posmā.

Pēc tam es palaižu pandas aprakstīšanas funkciju, lai iegūtu īsu aprakstošu statistiku.

vilciens.rakstīties ()

Lai kategorizētu mainīgo tipus datu kopā, es palaižu šo kodu, kas rada visu skaitlisko īpašību histogrammas. No iegūtās izvades var viegli redzēt, kuras funkcijas ir nepārtrauktas un divdomīgas. Nepārtrauktajām funkcijām ir nepārtraukta sadalījuma shēma, savukārt divdimensionālajām pazīmēm ir tikai divas joslas. Nominālos un kārtējos mainīgos dažreiz var būt grūtāk noteikt, un tiem var būt vajadzīgas papildu zināšanas par datu kopu vai kādas īpašas zināšanas par domēnu. Tādās mašīnmācības sacensībās kā šis es ieteiktu atsaukties uz jebkuru datu vārdnīcu, kas var tikt piegādāta, ja tādas nav (kā tas ir šajā gadījumā), iespējams, būs nepieciešama intuīcijas un izmēģinājumu un kļūdu kombinācija.

importēt matplotlib.pyplot kā plt
vilciens [train.dtypes [(train.dtypes == "float64") | | (train.dtypes == "int64")]
                        .index.values] .hist (figsize = [11,11])

Iezīmes ir aprakstītas četros veidos tabulā zemāk. Tagad es varu pieņemt dažus lēmumus par pārveidošanas soļiem, ko es veikšu, lai sagatavotu datus apmācībai un prognozēšanai.

Manekena mainīgie

Kā jau minēts iepriekš šajā rakstā, visas skaitliskās vērtības ir jāpārvērš veselos skaitļos vai mainīgajos skaitļos, lai tās varētu izmantot lielākajā daļā mašīnmācības bibliotēku. Zemu kardināluma mainīgo gadījumā labākā pieeja parasti ir objekta pārvēršana vienā kolonnā par unikālo vērtību ar 0, kur vērtības nav, un 1, ja tāda ir. Tos sauc par fiktīvajiem mainīgajiem.

Šo paņēmienu parasti vislabāk piemēro arī visiem nominālajiem mainīgajiem. Tā kā tiem nav raksturīga secība, ja mēs to nepiemērojam pirmo, mašīnmācīšanās algoritms var nepareizi meklēt sakarību šo vērtību secībā.

Pandai ir jauka funkcija, ko sauc par get_dummies (). Zemāk redzamajā kodā es to esmu izmantojis, lai pārveidotu visas nominālās un skaitliskās funkcijas jaunajās kolonnās. No izvades var redzēt, ka ir izveidotas vairākas jaunas kolonnas un sākotnējās kolonnas ir nomestas.

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']
vilciens = pd.get_dummies (vilciens, kolonnas = dummy_cols)

Funkciju mērogošana

Nepārtraukti mainīgie mūsu datu kopā ir dažādos mērogos. Piemēram, ja jūs atsaucaties uz iepriekš sniegtajām histogrammām, jūs varat redzēt, ka mainīgais “oldpeak_eq_st_depression” svārstās no 0 līdz 6, bet “max_heart_rate_achieved” svārstās no 100 līdz 200. Tas rada problēmas daudziem populāriem mašīnmācīšanās algoritmiem, kuri bieži izmanto Eiklida attālumu. starp datu punktiem, lai veiktu galīgās prognozes. Standartizējot visu nepārtraukto mainīgo mērogu, bieži var palielināties mašīnmācīšanās modeļu veiktspēja.

Ir vairākas metodes funkciju mērogošanai python. Mana vēlamā metode ir Sci-Kit Learn MinMaxScaler funkcijas izmantošana. Kas pārveido skalu tā, lai visu pazīmju vērtības svārstītos no 0 līdz 1. Man ir iekļauts kods, kas to dara zemāk.

no sklearn importa priekšapstrādes
n_test = vilciens [['serum_cholesterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure']]
cols_to_norm = ['serum_cholesterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure']
x = n_test.vērtības
min_max_scaler = priekšapstrāde.MinMaxScaler ()
x_scaled = min_max_scaler.fit_transform (x)
n_test = pd.DataFrame (x_scaled, kolonnas = cols_to_norm)
l_test = train.drop (['serum_cholesterol_mg_per_dl', 'max_heart_rate_achieved',
                'oldpeak_eq_st_depression', 'resting_blood_pressure'], ass = 1)
vilciens = pd.concat ([n_test, l_test], ass = 1)
vilciena.kolonnas

Binning

No iepriekš redzamā koda jūs pamanīsit, ka objekta mērogošanas pārveidē es neiekļāvu nepārtrauktu mainīgo “vecums”. Iemesls tam ir tas, ka vecums ir pazīmju veida piemērs, kam varētu būt noderīga pārveidošana par diskrētu mainīgo. Šajā piemērā mēs varam izmantot spaiņošanu vai dublēšanu, lai pārveidotu objektu nozīmīgu kategoriju sarakstā.

Zemāk esošajā kodā esmu norādījis intuitīvas kategorijas, kuru pamatā ir datu sadalījums. Tas izmanto pandu griezuma funkciju, kurā tiek iekļauts atkritumu tvertņu saraksts, grupas nosaukumi un datu rāmis. Šīs funkcijas atgriež sākotnējo datu rāmi ar jaunu “age_categories” funkciju. Pēc tam, izmantojot iepriekš aprakstīto metodi, šo kolonnu var pārvērst par vairākām fiktīvām kolonnām.

tvertnes = [30, 40, 50, 60, 70, 80]
group_names = ['30 -39 ', '40 -49', '50-59 ', '60-69', '70-79 ']
age_categories = pd.cut (vilciens ['vecums'], atkritumu tvertnes, etiķetes = grupas_vārdi)
vilciens ['age_categories'] = pd.cut (vilciens ['vecums'], atkritumu tvertnes, etiķetes = grupas nosaukumi)
vecuma kategorijas
pd.value_counts (vilciens ['age_categories'])

Mums tagad ir datu kopa, kurā visām kolonnām nav skaitļu. Mēs esam izveidojuši vairākas jaunas funkcijas un pārveidojis esošās funkcijas formātos, kuriem vajadzētu palīdzēt uzlabot to mašīnu apguves modeļu veiktspēju, kurus mēs tagad varam izmantot. Funkcijas pārveidošana ir svarīgs pirmais solis mašīnmācīšanās procesā, un tas bieži var būtiski ietekmēt modeļa veiktspēju. Šeit es esmu aprakstījis pirmos soļus, ko es veiktu šajā procesā, lai loģiski domātu, kā izturēties pret dažādiem man raksturīgajiem mainīgajiem. Kad es būvēšu modeli, es gandrīz vienmēr atgriezīšos un pielāgoju datus, izmantojot dažādas metodes, lai mēģinātu uzlabot modeļu precizitāti. Tomēr es uzskatu, ka, veicot šīs darbības sākumā, tas bieži samazina laiku, ko pavadu, dodoties atpakaļ uz pārveidošanas posmiem.