Zephyrnet-logotyp

Inledande anmärkning om imputeringstekniker

Datum:

Beskrivning

Maskininlärningsmodeller är skräp i soplådor, och det är viktigt att ta itu med eventuell saknad data innan du matar den till din modell.

Saknar data i din dpå grund av flera anledningar som

1) Uppgifterna var inte tillgängliga.

2) Informationen registrerades inte på grund av ett datainmatningsfel och så vidare.

Det är viktigt att hantera dem på rätt sätt istället för att helt ignorera dem, eftersom de kan representera avgörande information och påverka din modells prestanda.

Vi kommer att undersöka olika imputeringstekniker från grundläggande till avancerade som en del av den här artikeln. Låt oss börja!

Gör ingen förändring

Trädbaserade modeller som Light GBM och XGBoost kan arbeta med NA-värden; du kan prova en baslinjemodell med dina saknade data och kontrollera prestandamåttet.

Ett annat tillvägagångssätt skulle vara att släppa raderna med saknade värden; du kan göra detta när posterna med saknade värden är en liten andel av hela din datauppsättning. Annars skulle det inte vara någon mening att släppa så mycket information.

Under EDA-stadiet, försök att visualisera andelen saknade data och gör ett välgrundat val.

Handlingen med saknad data är en del av det arbete jag just nu gör i WIDS-tävlingen på Kaggle.

ncounts = pd.DataFrame([train.isna().mean(), test.isna().mean()]).T ncounts = ncounts.rename(columns={0: "train_missing", 1: "test_missing" }) ncounts.query("train_missing > 0").plot( kind="barh", figsize=(8, 5), title="% av värden saknas" ) plt.show()

ncounts.query("tåg_saknas > 0")

Bildkälla: Författare

Som du kan se, för vissa funktioner saknas nästan 50 % av poster i tågdata och 80 % av poster i testdata. I sådana fall kanske du vill ta bort funktionen helt eftersom den kanske inte ger något meningsfullt bidrag till det förutsagda målet.

Du kan också visualisera antalet saknade funktioner per post enligt nedan.

tt["n_missing"] = tt[nacols].isna().sum(axis=1) tåg["n_missing"] = tåg[nacols].isna().sum(axis=1) test["n_missing"] = test[nacols].isna().sum(axis=1) tt["n_missing"].value_counts().plot( kind="bar", title="Antal saknade värden per prov")

Vi kan se att vi har nästan 30000 824 poster med fyra saknade funktioner och cirka XNUMX poster med sex funktioner som saknas, en sådan analys skulle hjälpa dig att göra ett välgrundat val om den imputeringsteknik du skulle vilja använda, eller skulle du inte vilja använda någonting alls.

Imputering med ett konstant värde eller ett medelvärde/median/läge

Du kan imputera den saknade informationen genom att ersätta den med ett konstant värde; i vårt fall har vi en del saknade data för kolumnåret byggt eftersom tävlingen körs under innevarande år, dvs 2022, skulle ett rimligt val att ersätta saknade värden för funktionen vara 2022. Samma sak kan göras som nedan i python .

 train['year_built'] =tåg['year_built'].replace(np.nan, 2022) test['year_built'] =test['year_built'].replace(np.nan, 2022)

Ett annat tillvägagångssätt skulle vara att ersätta de saknade värdena med medelvärdet av de icke-tomma posterna i funktionen. Eftersom medelvärde är mottagligt för extremvärden, kan du också använda medelvärde eller median som ersättningsstrategi.

Kodexempel enligt nedan

test['energy_star_rating']=test['energy_star_rating'].replace(np.nan,test['energy_star_rating'].mean()) test['energy_star_rating']=test['energy_star_rating'].replace(np.nan ,test['energy_star_rating'].median())

En annan intressant strategi är att tillskriva en funktion med saknade värden baserat på en annan del.

Anta till exempel att du vill fylla i det saknade värdet för max vindhastighet baserat på byggnadsklassen. I så fall tillhör skivan; du skulle först göra en grupp genom att använda byggnadsklassen och beräkna medelvärdet av max vindhastighet i alla individuella grupper, varefter de saknade värdena i max vindhastighet beräknas utifrån den byggnadsklass posten tillhör.

Enkel imputer

Sklearn tillhandahåller en liknande strategi som vi diskuterade ovan för att tillskriva saknade värden med ett konstant eller ett medelvärde.

Det är alltid bra att känna till alternativa metoder för att utföra samma uppgift, det är därför vi tittar på koden nedan med Simple Imputer i aktion.

från sklearn.impute import SimpleImputer imptr = SimpleImputer(strategy="mean") tr_imp = imptr.fit_transform(tåg[FEATURES]) test_imp = imptr.transform(test[FEATURES])

Baserat på ditt användningsfall kan du ersätta strategin med medelvärde, läge, median eller konstant.

Avancerade imputeringstekniker

Under detta ämne kommer vi att titta på imputeringsteknikerna nedan.

  • Iterativ imputer
  • KNN Imputer
  • LGBM imputer

Iterativ imputer

Under huven involverar dess implementering att tillskriva saknade värden genom att modellera varje funktion som en funktion av andra element runt om.

Du kan också förstå detta helt enkelt för att de saknade värdena anses vara mål, och de återstående funktionerna används för att förutsäga deras värden.

Den använder Bayesian Ridge-algoritmen internt.

Låt oss se detsamma i aktion med pythonkoden nedan.

it_imputer = IterativeImputer(max_iter=10) train_iterimp = it_imputer.fit_transform(X[FEATURES]) test_iterimp = it_imputer.transform(X_test[FEATURES]) # Skapa tågtest imputerad dataram X_df = pd.DataFrame(train_iterimp, kolumner) =_FestEAd. pd.DataFrame(test_iterimp, columns=FEATURES)

KNN Imputer

Imputeren fungerar enligt samma principer som den oövervakade K närmaste granne-algoritmen för klustring. Den använder KNN för att tillskriva saknade värden; två poster anses vara grannar om de funktioner som inte saknas ligger nära varandra.

Logiskt sett är det vettigt att tillskriva värden baserat på sin närmaste granne. Du kan prova det och kontrollera din korsvalideringspoäng för en förbättring eller på annat sätt på din datauppsättning.

Nedan finns koden för att komma igång med KNN-imputern

från sklearn.impute import KNNImputer imputer = KNNImputer(n_neighbors=2) imputer.fit_transform(X)

n_neighbors-parametern anger antalet grannar som ska beaktas för imputering.

LGBM imputer

Den använder LightGBM för att tillskriva saknade värden i funktioner; du kan referera till hela implementeringen av imputeren av Hiroshi Yoshihara här..

!git clone https://github.com/analokmaus/kuma_utils.git import sys sys.path.append("kuma_utils/") från kuma_utils.preprocessing.imputer import LGBMImputer lgbm_imtr = LGBMImputer(n_iter=100, verbose_=lgbum)imp = lgbm_imtr.fit_transform(tåg[FEATURES]) test_lgbmimp = lgbm_imtr.transform(test[FEATURES]) tt_lgbmimp = lgbm_imtr.fit_transform(tt[FEATURES]) tt_imp = pd.DataFrameAmpTURES(tt_lgbmTrägfm/kolumner) imputerad dataram lgbm_imp_df = pd.DataFrame(tt_imp, columns=FEATURES) 

Kodreferens:- här.

Vi har diskuterat flera tekniker för att tillskriva saknade värden som en del av den här artikeln, och jag hoppas att du har lärt dig något nytt av det. Det finns ingen lösning som passar alla mekanism för imputering; du kanske måste prova olika tillvägagångssätt och se vilken som fungerar bäst för din korsvalideringspoäng; en generell riktlinje skulle vara att börja med en baslinjemodell med genomsnittlig imputering och bygga upp därifrån.

Om du har några frågor eller feedbackförslag kan du ange detsamma i kommentarerna nedan. Jag skriver dessa artiklar för att förbättra min förståelse av tillämpad maskininlärning. Du kan kontakta mig på Linkedin eller läsa om mig här.. Hoppas du gillade min artikel om imputationstekniker, dela den i kommentarerna nedan.

Läs fler artiklar om vår blogg.

Medierna som visas i den här artikeln ägs inte av Analytics Vidhya och används efter författarens gottfinnande. 

plats_img

Senaste intelligens

plats_img