Casestudy nierziekte I: Categorical Imputer
Je gaat nu verder met het verkennen van pipelines met een gegevensset die aanzienlijk meer bewerking vereist. De chronic kidney disease dataset bevat zowel categorische als numerieke features, maar ook veel ontbrekende waarden. Het doel is om te voorspellen wie chronische nierziekte heeft op basis van verschillende bloedindicatoren als features.
Zoals Sergey in de video aangaf, maak je kennis met een nieuwe bibliotheek, sklearn_pandas, waarmee je veel meer verwerkingsstappen in een pipeline kunt koppelen dan momenteel in scikit-learn worden ondersteund. Je kunt specifiek de klasse DataFrameMapper() gebruiken om een willekeurige, met sklearn compatibele transformer toe te passen op DataFrame-kolommen, waarbij de resulterende output een NumPy-array of een DataFrame kan zijn.
We hebben ook een transformer gemaakt, een Dictifier, die het omzetten van een DataFrame met .to_dict("records") kapselt zonder dat je dit expliciet hoeft te doen (en zodat het in een pipeline werkt). Tot slot hebben we ook de lijst met featurenamen in kidney_feature_names, de doelsnaam in kidney_target_name, de features in X en het doel in y toegevoegd.
In deze oefening is het jouw taak om sklearn's SimpleImputer toe te passen om alle categorische kolommen in de gegevensset te imputeren. Je kunt kijken naar hoe de numerieke imputation-mapper is gemaakt als sjabloon. Vallen de sleutelargumenten input_df=True en df_out=True je op? Dit is zodat je met DataFrames kunt werken in plaats van met arrays. Standaard krijgen de transformers een numpy-array van de geselecteerde kolommen als input, en daarom is de output van de DataFrame-mapper ook een array. Scikit-learn-transformers zijn historisch ontworpen om met numpy-arrays te werken, niet met pandas DataFrames, ook al lijken hun basis-indexeerinterfaces op elkaar.
Deze oefening maakt deel uit van de cursus
Extreme Gradient Boosting met XGBoost
Oefeninstructies
- Pas de categorische imputer toe met
DataFrameMapper()enSimpleImputer().SimpleImputer()heeft geen argumenten nodig. De kolommen staan incategorical_columns. Zorg dat jeinput_df=Trueendf_out=Trueopgeeft, en gebruikcategory_featureals je iteratorvariabele in de list comprehension.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
# Import necessary modules
from sklearn_pandas import DataFrameMapper
from sklearn.impute import SimpleImputer
# Check number of nulls in each feature column
nulls_per_column = X.isnull().sum()
print(nulls_per_column)
# Create a boolean mask for categorical columns
categorical_feature_mask = X.dtypes == object
# Get list of categorical column names
categorical_columns = X.columns[categorical_feature_mask].tolist()
# Get list of non-categorical column names
non_categorical_columns = X.columns[~categorical_feature_mask].tolist()
# Apply numeric imputer
numeric_imputation_mapper = DataFrameMapper(
[([numeric_feature], SimpleImputer(strategy="median")) for numeric_feature in non_categorical_columns],
input_df=True,
df_out=True
)
# Apply categorical imputer
categorical_imputation_mapper = ____(
[(category_feature, ____) for ____ in ____],
input_df=____,
df_out=____
)