library(imputeTS)na.random(mydata) # Random Imputation
na.locf(mydata, option = "locf") # Last Obs. Carried Forward
na.locf(mydata, option = "nocb") # Next Obs. Carried Backward
na.interpolation(mydata) # Linear Interpolation
na.seadec(mydata, algorithm = "interpolation") # Seasonal Adjustment then Linear Interpolation
Keskiarvo, mediaani ja moodi
Kokonaiskeskiarvon, mediaanin tai moodin laskeminen on hyvin perustavanlaatuinen imputointimenetelmä, se on ainoa testattu funktio, joka ei hyödynnä aikasarjan ominaisuuksia tai muuttujien välistä suhdetta. Se on hyvin nopea, mutta sillä on selviä haittoja. Yksi haittapuoli on se, että keskiarvon imputointi vähentää aineiston varianssia.
library(imputeTS)na.mean(mydata, option = "mean") # Mean Imputation
na.mean(mydata, option = "median") # Median Imputation
na.mean(mydata, option = "mode") # Mode ImputationIn Python
from sklearn.preprocessing import Imputer
values = mydata.values
imputer = Imputer(missing_values='NaN', strategy='mean')
transformed_values = imputer.fit_transform(values)# strategy can be changed to "median" and "most_frequent"
Lineaarinen regressio
Aluksi tunnistetaan korrelaatiomatriisin avulla useita puuttuvien arvojen muuttujan ennustajia. Parhaat ennustajat valitaan ja niitä käytetään riippumattomina muuttujina regressioyhtälössä. Riippuvana muuttujana käytetään muuttujaa, josta puuttuvat tiedot puuttuvat. Tapauksia, joissa ennustemuuttujien osalta on täydelliset tiedot, käytetään regressioyhtälön luomiseen; yhtälöä käytetään sitten ennustamaan puuttuvia arvoja epätäydellisten tapausten osalta. Iteratiivisessa prosessissa puuttuvan muuttujan arvot lisätään ja sitten kaikkia tapauksia käytetään riippuvan muuttujan ennustamiseen. Näitä vaiheita toistetaan, kunnes ennustettujen arvojen välillä on vain vähän eroa vaiheesta toiseen, eli ne lähenevät toisiaan.
Se ”teoreettisesti” tuottaa hyviä estimaatteja puuttuville arvoille. Tässä mallissa on kuitenkin useita haittoja, jotka ovat yleensä suuremmat kuin sen edut. Ensinnäkin, koska korvatut arvot ennustettiin muista muuttujista, niillä on taipumus sopia yhteen ”liian hyvin”, joten keskivirhe paisuu. On myös oletettava, että regressioyhtälössä käytettyjen muuttujien välillä on lineaarinen suhde, vaikka sellaista ei välttämättä ole.
Multiple Imputation
- Imputation: Imputoi epätäydellisten aineistojen puuttuvat merkinnät m kertaa (kuvassa m=3). Huomaa, että imputoidut arvot arvotaan jakaumasta. Satunnaisten arvontojen simulointi ei sisällä epävarmuutta malliparametreihin. Parempi lähestymistapa on käyttää Markov Chain Monte Carlo (MCMC) -simulointia. Tämän vaiheen tuloksena saadaan m täydellistä datasarjaa.
- Analyysi: Analysoi jokainen m valmiista datajoukoista.
- Pooling: Integroi m analyysitulokset lopputulokseksi
# We will be using mice library in r
library(mice)
# Deterministic regression imputation via mice
imp <- mice(mydata, method = "norm.predict", m = 1)
# Store data
data_imp <- complete(imp)# Multiple Imputation
imp <- mice(mydata, m = 5)#build predictive model
fit <- with(data = imp, lm(y ~ x + z))#combine results of all 5 models
combine <- pool(fit)
Tämä on ylivoimaisesti suositeltavin imputointimenetelmä seuraavista syistä:
– Helppo käyttää
– Ei harhoja (jos imputointimalli on oikea)
Kategoristen muuttujien imputointi
- Moodi-imputointi on yksi menetelmä, mutta se tuo varmasti harhoja
- Puuttuvia arvoja voidaan käsitellä omana erillisenä kategoriana. Voimme luoda puuttuville arvoille toisen luokan ja käyttää niitä eri tasona. Tämä on yksinkertaisin menetelmä.
- Prediction models: Tässä luodaan ennustava malli estimoimaan arvoja, jotka korvaavat puuttuvat tiedot. Tässä tapauksessa jaamme aineistomme kahteen joukkoon: Toinen joukko, jossa ei ole muuttujan puuttuvia arvoja (koulutus) ja toinen joukko, jossa on puuttuvia arvoja (testi). Voimme käyttää ennustamiseen sellaisia menetelmiä kuin logistinen regressio ja ANOVA
- Multiple Imputation
KNN (K Nearest Neighbors)
Tieto imputointiin on olemassa muitakin koneoppimistekniikoita, kuten XGBoost ja Random Forest, mutta keskustelemme KNN:stä, koska sitä käytetään yleisesti. Tässä menetelmässä valitaan k naapuria jonkin etäisyysmitan perusteella ja niiden keskiarvoa käytetään imputointiestimaattina. Menetelmä edellyttää lähimpien naapureiden lukumäärän ja etäisyysmittarin valintaa. KNN voi ennustaa sekä diskreettejä attribuutteja (k:n lähimmän naapurin yleisin arvo) että jatkuvia attribuutteja (k:n lähimmän naapurin keskiarvo)
Etäisyysmetriikka vaihtelee datan tyypin mukaan:
1. Jatkuva data:
2. Kategoriset tiedot: Jatkuville tiedoille yleisesti käytetyt etäisyysmetriikat ovat Euklidinen, Manhattan ja Kosinus
2. Kategoriset tiedot: Tällöin käytetään yleensä Hamming-etäisyyttä. Se ottaa kaikki kategoriset attribuutit ja laskee jokaisesta yhden, jos arvo ei ole sama kahden pisteen välillä. Hammingin etäisyys on tällöin yhtä suuri kuin niiden attribuuttien lukumäärä, joiden arvo oli erilainen.
Yksi KNN-algoritmin houkuttelevimmista ominaisuuksista on, että se on yksinkertainen ymmärtää ja helppo toteuttaa. KNN-algoritmin ei-parametrinen luonne antaa sille etulyöntiaseman tietyissä tilanteissa, joissa data voi olla hyvin ”epätavallista”.
Yksi KNN-algoritmin ilmeisistä haittapuolista on se, että se muuttuu aikaa vieväksi analysoitaessa suuria tietokokonaisuuksia, koska siinä etsitään samankaltaisia tapauksia läpi koko tietokokonaisuuden. Lisäksi KNN:n tarkkuus voi heikentyä huomattavasti korkea-ulotteisilla aineistoilla, koska lähimmän ja kaukaisimman naapurin välillä on vain vähän eroa.
library(DMwR)
knnOutput <- knnImputation(mydata)In python
from fancyimpute import KNN
# Use 5 nearest rows which have a feature to fill in each row's missing features
knnOutput = KNN(k=5).complete(mydata)
Kaikkien edellä käsiteltyjen menetelmien joukossa moninkertainen imputaatio ja KNN ovat laajalti käytettyjä, ja moninkertainen imputaatio, joka on yksinkertaisempi, on yleisesti ottaen suositeltavampi.
Jos sinulla on kysyttävää tästä postauksesta, kysy sitä kommenteissa, ja teen parhaani vastatakseni.
library(DMwR)
knnOutput <- knnImputation(mydata)In python
from fancyimpute import KNN
# Use 5 nearest rows which have a feature to fill in each row's missing features
knnOutput = KNN(k=5).complete(mydata)
Kysy kommentteihin ja teen parhaani vastataksesi.