Studium przypadku: choroba nerek I – imputacja kategoryczna
Kontynuujemy eksplorację potoków przetwarzania – tym razem na zbiorze danych wymagającym znacznie więcej przygotowania. Zbiór danych dotyczący przewlekłej choroby nerek zawiera zarówno cechy kategoryczne, jak i liczbowe, a do tego wiele brakujących wartości. Celem jest przewidzenie, u kogo występuje przewlekła choroba nerek, na podstawie różnych wskaźników krwi jako cech.
Jak wspomniał Sergey w nagraniu, poznasz nową bibliotekę – sklearn_pandas – która pozwala łączyć znacznie więcej kroków przetwarzania w potoku, niż obsługuje to scikit-learn samodzielnie. W szczególności klasa DataFrameMapper() umożliwia zastosowanie dowolnego transformatora zgodnego ze sklearn na kolumnach obiektu DataFrame, a wynik może być tablicą NumPy albo obiektem DataFrame.
Przygotowaliśmy też transformer o nazwie Dictifier, który automatycznie konwertuje obiekt DataFrame za pomocą .to_dict("records") – nie musisz robić tego ręcznie, a poza tym działa on wewnątrz potoku. Udostępniliśmy również: listę nazw cech w kidney_feature_names, nazwę zmiennej docelowej w kidney_target_name, cechy w X oraz zmienną docelową w y.
Twoim zadaniem w tym ćwiczeniu jest zastosowanie klasy SimpleImputer ze sklearn do uzupełnienia brakujących wartości we wszystkich kolumnach kategorycznych zbioru danych. Jako wzorzec możesz wykorzystać sposób, w jaki powstał mapper do imputacji wartości liczbowych. Zwróć uwagę na argumenty słów kluczowych input_df=True i df_out=True – dzięki nim możesz pracować na obiektach DataFrame zamiast na tablicach. Domyślnie transformatory otrzymują tablicę numpy z wybranych kolumn, przez co wynik mappera DataFrame również jest tablicą. Transformatory Scikit-learn były historycznie projektowane z myślą o tablicach numpy, a nie obiektach pandas DataFrame, mimo że ich podstawowe interfejsy indeksowania są podobne.
To ćwiczenie jest częścią kursu
Extreme Gradient Boosting with XGBoost
Instrukcje do ćwiczenia
- Zastosuj imputację kategoryczną, używając
DataFrameMapper()iSimpleImputer(). DoSimpleImputer()nie trzeba przekazywać żadnych argumentów. Kolumny są przechowywane wcategorical_columns. Pamiętaj, aby podaćinput_df=Trueidf_out=True, a jako zmienną iteratora w wyrażeniu listowym użyjcategory_feature.
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
# 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=____
)