Puuttuvien arvojen käsittely: poista, imputoi ja merkitse
Tunnista null-arvot, käytä SimpleImputerilla keskiarvo-, mediaani- tai yleisin arvo -imputointia ja päätä, milloin rivien poistaminen on täyttämistä turvallisempaa.
Puuttuvien arvojen käsittely: poista, imputoi ja merkitse on ilmainen Machine Learning Academy-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Machine Learning Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Miksi puuttuvat arvot ovat vaarallisia
Puuttuvat arvot — jotka esitetään muodossa NaN, None tai tyhjinä soluina — ovat yksi yleisimmistä tosielämän aineistojen datan laatuongelmista. Jos niitä ei käsitellä, ne aiheuttavat virheitä scikit-learn-estimaattoreissa, jotka odottavat kokonaan numeerisia matriiseja. Jokaisen ML-putken on käsiteltävä puuttuvat arvot ennen koulutusta. Päästrategioita on kolme: poistaa rivejä tai sarakkeita, imputoida eli täyttää ne arvioiduilla arvoilla tai merkitä puuttuvuus omaksi piirteekseen.
import pandas as pd
import numpy as np
df = pd.DataFrame({
'age': [25, np.nan, 35, np.nan, 50],
'income': [40000, 55000, np.nan, 72000, 90000],
'score': [85, 90, 78, np.nan, 95]
})
print(df.isnull().sum()) # Count nulls per column
print(df.isnull().mean()) # Fraction missing per columnTyhjien arvojen tunnistaminen Pandasilla
Ennen kuin päätätte, miten puuttuvia arvoja käsitellään, ongelman laajuus on määritettävä. Pandas tarjoaa df.isnull()-funktion totuusarvomaskin luomiseen ja df.isnull().sum()-funktion tyhjien arvojen laskemiseen sarakkeittain. Myös df.info()-metodi näyttää muiden kuin tyhjien arvojen määrät. Tarkistakaa aina puuttuvien arvojen osuus — jos sarakkeesta puuttuu yli 50 %, sarake on ehkä parempi poistaa kokonaan kuin imputoida.
import pandas as pd
import numpy as np
df = pd.read_csv('housing.csv')
# Fraction missing per column (sorted)
missing_frac = df.isnull().mean().sort_values(ascending=False)
print(missing_frac[missing_frac > 0])
# Heat map of missing values
import seaborn as sns
import matplotlib.pyplot as plt
sns.heatmap(df.isnull(), cbar=False)
plt.show()Rivien ja sarakkeiden poistaminen
df.dropna() poistaa oletusarvoisesti rivit, jotka sisältävät vähintään yhden tyhjän arvon. Välittäkää parametriksi axis=1, jos haluatte poistaa sarakkeita. thresh-parametrin avulla voitte säilyttää rivit, joissa on vähintään N muuta kuin tyhjää arvoa. Poistaminen on turvallista, kun puuttuvuus on täysin satunnaista (MCAR) ja osuus on hyvin pieni — alle 1–5 % riveistä. Liian voimakas poistaminen aiheuttaa kuitenkin tiedon menetystä ja voi johtaa harhaan, jos data ei puutu satunnaisesti.
# Drop rows with ANY null
df_no_null = df.dropna()
# Drop columns where MORE than 40% of values are missing
df_cleaned = df.dropna(axis=1, thresh=int(0.6 * len(df)))
# Drop rows only if specific columns are null
df_subset = df.dropna(subset=['age', 'income'])
print('Original shape:', df.shape)
print('After drop:', df_no_null.shape)Keskiarvo- ja mediaani-imputointi
Imputoinnissa puuttuvat arvot täytetään arvioiduilla korvaavilla arvoilla. Keskiarvoimputoinnissa tyhjät arvot korvataan sarakkeen keskiarvolla, mikä toimii hyvin symmetriselle, normaalijakautuneelle datalle. Mediaani-imputointi kestää poikkeavia arvoja paremmin, ja sitä suositaan vinoissa jakaumissa. Molemmat menetelmät ovat yksinkertaisia ja nopeita, mutta pienentävät varianssia keinotekoisesti, koska kaikki imputoidut arvot ovat samoja. Käyttäkää scikit-learnin SimpleImputer-luokkaa putkien kanssa yhteensopivaan imputointiin.
from sklearn.impute import SimpleImputer
import numpy as np
X = np.array([[1, 2], [np.nan, 3], [7, 6], [np.nan, np.nan]])
# Mean imputation
imp_mean = SimpleImputer(strategy='mean')
X_mean = imp_mean.fit_transform(X)
print('Mean imputed:\n', X_mean)
# Median imputation (more robust)
imp_median = SimpleImputer(strategy='median')
X_median = imp_median.fit_transform(X)
print('Median imputed:\n', X_median)Kategoristen muuttujien yleisimmän arvon imputointi
Kategorisissa sarakkeissa keskiarvon tai mediaanin käyttäminen ei ole mielekästä. Käyttäkää sen sijaan SimpleImputer-luokassa asetusta strategy='most_frequent', joka täyttää puuttuvat arvot moodilla eli yleisimmällä luokalla. Tämä säilyttää jakauman muodon paremmin kuin satunnainen määritys. Sovittakaa imputoija aina vain koulutusdataan ja käyttäkää sovitettua imputoijaa sekä koulutus- että testijoukkojen muuntamiseen — näin testijoukosta ei pääse vuotamaan tietoa, joka vaikuttaisi imputoituihin arvoihin.
from sklearn.impute import SimpleImputer
import numpy as np
X_cat = np.array([
['cat'],
['dog'],
[np.nan],
['cat'],
[np.nan]
])
imp = SimpleImputer(strategy='most_frequent')
X_imputed = imp.fit_transform(X_cat)
print(X_imputed.flatten())
# Output: ['cat' 'dog' 'cat' 'cat' 'cat']Vakio- ja mukautettu imputointi
Joskus paras imputoitu arvo on toimialakohtainen vakioarvo, ei tilastollinen tunnusluku. Esimerkiksi aiempien ostosten lukumäärän puuttuminen voi tarkoittaa nollaa. Käyttäkää SimpleImputer-luokassa asetusta strategy='constant' yhdessä arvon fill_value=0 kanssa. Monimutkaisempaa logiikkaa varten, kuten puuttuvan kaupungin täyttämiseen arvolla 'Unknown', välittäkää merkkijonovakio. Vakioimputointi on helposti tulkittavaa ja turvallista, kun puuttuminen todella tarkoittaa tiettyä arvoa eikä johdu tiedonkeruun epäonnistumisesta.
from sklearn.impute import SimpleImputer
import numpy as np
# Numeric: fill 0 (e.g., previous purchases)
imp_zero = SimpleImputer(strategy='constant', fill_value=0)
# Categorical: fill with 'Unknown'
imp_unknown = SimpleImputer(strategy='constant', fill_value='Unknown')
X_num = np.array([[5], [np.nan], [3], [np.nan]])
X_cat = np.array([['Paris'], [None], ['Tokyo'], [None]])
print(imp_zero.fit_transform(X_num).flatten())
print(imp_unknown.fit_transform(X_cat).flatten())KNN- ja iteratiivinen imputointi
Edistyneemmät imputoijat mallintavat piirteiden välisiä suhteita tuottaakseen parempia arvioita. KNNImputer täyttää puuttuvan arvon etsimällä k lähintä täydellistä riviä ja laskemalla niiden arvojen keskiarvon — näin paikallinen datarakenne säilyy. IterativeImputer (kokeellinen) sovittaa erillisen regressiomallin jokaiselle puuttuvia arvoja sisältävälle piirteelle ja käyttää kaikkia muita piirteitä ennustajina. Molemmat ovat tarkempia kuin keskiarvoimputointi, mutta hitaampia ja voivat ylisovittua pienissä aineistoissa.
from sklearn.impute import KNNImputer
import numpy as np
X = np.array([
[1, 2, np.nan],
[3, 4, 3],
[np.nan, 6, 5],
[8, 8, 7]
])
imp = KNNImputer(n_neighbors=2)
X_filled = imp.fit_transform(X)
print('KNN imputed:\n', X_filled)Puuttuvuusindikaattori: puuttuvien arvojen merkitseminen
Joskus se, että arvo puuttuu, on itsessään informatiivista. Esimerkiksi puuttuva palkkatieto voi viitata työttömyyteen. Lisäämällä binäärisen indikaattorisarakkeen, joka ilmaisee, oliko kukin arvo alun perin tyhjä, malli voi oppia puuttuvuuden rakenteesta. scikit-learnin MissingIndicator luo nämä merkkisarakkeet. Käyttäkää sitä yhdessä imputoinnin kanssa FeatureUnion- tai ColumnTransformer-rakenteessa, jotta malli näkee sekä imputoidun arvon että merkin.
from sklearn.impute import SimpleImputer, MissingIndicator
from sklearn.pipeline import FeatureUnion
import numpy as np
X = np.array([[1, 2], [np.nan, 3], [7, 6], [np.nan, np.nan]])
indicator = MissingIndicator()
flags = indicator.fit_transform(X)
print('Missing flags:\n', flags)
# Adds True/False columns marking original NaN positionsKoulutus- ja testidatan imputointi ilman tietovuotoa
Kriittinen sääntö: sovittakaa imputoija aina vain koulutusdataan ja käyttäkää sitten sovitettua imputoijaa sekä koulutus- että testijoukkojen muuntamiseen. Jos sovitatte imputoijan koko aineistoon, testiaineiston tilastot vuotavat koulutukseen, mikä tuottaa liian optimistisia arviointituloksia. Tämä koskee kaikkia esikäsittelyn aikana laskettavia tilastotietoja — keskiarvoa, mediaania, moodia ja lähimmän naapurin etäisyyksiä. Käyttäkää scikit-learnin Pipeline-rakennetta tämän varmistamiseen automaattisesti: putki sovittaa esikäsittelyvaiheet vain koulutusosaan ristiinvalidoinnin aikana.
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
import numpy as np
X = np.array([[1, 2], [np.nan, 3], [7, 6], [5, np.nan], [9, 1]])
y = np.array([0, 1, 0, 1, 0])
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
imp = SimpleImputer(strategy='mean')
imp.fit(X_train) # Fit ONLY on training data
X_train_imp = imp.transform(X_train)
X_test_imp = imp.transform(X_test) # Apply same stats to testMilloin kannattaa poistaa, imputoida tai merkitä
Oikean strategian valinta riippuu kolmesta tekijästä: (1) puuttuvien arvojen osuus — alle 5 %:n osuudella rivien poistaminen on hyväksyttävää; yli 50 %:n osuudella sarakkeen poistamista kannattaa harkita; (2) puuttuvuuden mekanismi — MCAR (täysin satunnainen) puoltaa poistamista, MAR (satunnainen muiden piirteiden perusteella) imputointia ja MNAR (ei satunnainen) merkitsemistä; (3) myöhempi malli — puupohjaiset mallit käsittelevät puuttuvia tietoja natiivisti (asettakaa allow_nan=True XGBoostissa/LightGBM:ssä), joten imputointi voi olla valinnaista. Vahvistakaa aina ristiinvalidoinnilla, että strategianne parantaa mallin suorituskykyä.
# Decision guide in code form
def imputation_strategy(fraction_missing, is_informative):
if fraction_missing > 0.6:
return 'drop column'
elif fraction_missing < 0.02:
return 'drop rows'
elif is_informative:
return 'impute + add flag column'
else:
return 'impute (mean/median/mode)'
print(imputation_strategy(0.7, False)) # drop column
print(imputation_strategy(0.01, False)) # drop rows
print(imputation_strategy(0.2, True)) # impute + flagTäydellinen imputointiputkiesimerkki
Tässä on täydellinen esimerkki, jossa imputointi yhdistetään scikit-learn-putkeen. ColumnTransformer käyttää samanaikaisesti SimpleImputer-luokkaa asetuksella strategy='median' numeerisiin sarakkeisiin ja asetuksella strategy='most_frequent' kategorisiin sarakkeisiin. Tulos siirtyy luokittimeen, ja koko putki ristiinvalidoidaan turvallisesti, joten imputointitilastot eivät vuoda osioiden välillä. Tämä malli on tuotantokäyttöön valmis tapa käsitellä puuttuvia tietoja kaikissa todellisissa ML-projekteissa.
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
num_features = ['age', 'income']
cat_features = ['city']
preprocessor = ColumnTransformer([
('num', SimpleImputer(strategy='median'), num_features),
('cat', SimpleImputer(strategy='most_frequent'), cat_features)
])
pipeline = Pipeline([
('prep', preprocessor),
('clf', RandomForestClassifier(random_state=42))
])
scores = cross_val_score(pipeline, X, y, cv=5)
print('CV accuracy:', scores.mean())Pikatarkistus
Testatkaa tämän oppitunnin Machine Learning with Python -käsitteiden ymmärtämistänne.
Oppitunnin kertaus
Tässä oppitunnissa opitte tunnistamaan puuttuvat arvot isnull().sum()- ja info()-funktioilla, kolme päästrategiaa — poistamisen, imputoinnin ja merkitsemisen — sekä sen, milloin kukin niistä soveltuu, ja käyttämään SimpleImputer-, KNNImputer- ja MissingIndicator-luokkia putkessa tietovuodon estämiseksi. Seuraavaksi tutustumme piirteiden skaalaukseen StandardScaler- ja MinMaxScaler-luokilla.
Opi Python tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 30
- Oppitunnit
- 120
Usein kysytyt kysymykset
Onko oppitunti ”Puuttuvien arvojen käsittely: poista, imputoi ja merkitse” ilmainen?
Kyllä – oppitunnin ”Puuttuvien arvojen käsittely: poista, imputoi ja merkitse” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Machine Learning Academy-kurssin, päivitä CoddyKit PROhon. Machine Learning Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Puuttuvien arvojen käsittely: poista, imputoi ja merkitse”?
Tunnista null-arvot, käytä SimpleImputerilla keskiarvo-, mediaani- tai yleisin arvo -imputointia ja päätä, milloin rivien poistaminen on täyttämistä turvallisempaa. Harjoittelet Machine Learning Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Machine Learning Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Machine Learning Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Puuttuvien arvojen käsittely: poista, imputoi ja merkitse”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Machine Learning Academy-oppitunnilla?
Kyllä. Jokainen Machine Learning Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Puuttuvien arvojen käsittely: poista, imputoi ja merkitse
- Piirteiden skaalaus: StandardScaler ja MinMaxScaler
- Kategoristen muuttujien koodaus: OrdinalEncoder ja OneHotEncoder
- Vaiheiden yhdistäminen ColumnTransformerilla