Fallstudie Nierenerkrankung I: Categorical Imputer
Du setzt jetzt deine Arbeit mit Pipelines an einem Datensatz fort, der deutlich mehr Aufbereitung erfordert. Der Chronic-Kidney-Disease-Datensatz enthält sowohl kategoriale als auch numerische Merkmale, aber auch viele fehlende Werte. Ziel ist es, anhand verschiedener Blutindikatoren als Features vorherzusagen, wer an chronischer Nierenerkrankung leidet.
Wie Sergey im Video erwähnt hat, lernst du eine neue Bibliothek kennen: sklearn_pandas. Sie ermöglicht es dir, deutlich mehr Verarbeitungsschritte in einer Pipeline zu verketten, als es derzeit in scikit-learn unterstützt wird. Konkret kannst du die Klasse DataFrameMapper() verwenden, um beliebige sklearn-kompatible Transformer auf DataFrame-Spalten anzuwenden. Die resultierende Ausgabe kann entweder ein NumPy-Array oder ein DataFrame sein.
Außerdem haben wir einen Transformer namens Dictifier erstellt, der das Konvertieren eines DataFrames mit .to_dict("records") kapselt, ohne dass du das explizit tun musst (und damit es in einer Pipeline funktioniert). Schließlich haben wir dir auch die Liste der Feature-Namen in kidney_feature_names, den Zielnamen in kidney_target_name, die Features in X und das Ziel in y bereitgestellt.
In dieser Übung sollst du den SimpleImputer von sklearn anwenden, um alle kategorialen Spalten im Datensatz zu imputieren. Du kannst dich daran orientieren, wie der numerische Imputation-Mapper als Vorlage erstellt wurde. Sind dir die Schlüsselwortargumente input_df=True und df_out=True aufgefallen? Dadurch kannst du mit DataFrames statt mit Arrays arbeiten. Standardmäßig erhalten die Transformer ein numpy-Array der ausgewählten Spalten als Eingabe, und entsprechend ist die Ausgabe des DataFrame-Mappers ebenfalls ein Array. Scikit-learn-Transformer wurden historisch dafür entwickelt, mit numpy-Arrays zu arbeiten, nicht mit pandas-DataFrames, auch wenn ihre grundlegenden Indexing-Schnittstellen ähnlich sind.
Diese Übung ist Teil des Kurses
Extreme Gradient Boosting mit XGBoost
Anleitung zur Übung
- Wende den kategorialen Imputer mit
DataFrameMapper()undSimpleImputer()an.SimpleImputer()benötigt keine übergebenen Argumente. Die Spalten stehen incategorical_columns. Achte darauf,input_df=Trueunddf_out=Trueanzugeben, und verwendecategory_featureals Iteratorvariable in der List Comprehension.
Interaktive Übung
Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.
# 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=____
)