Zacznij terazZacznij za darmo

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

Zobacz kurs

Instrukcje do ćwiczenia

  • Zastosuj imputację kategoryczną, używając DataFrameMapper() i SimpleImputer(). Do SimpleImputer() nie trzeba przekazywać żadnych argumentów. Kolumny są przechowywane w categorical_columns. Pamiętaj, aby podać input_df=True i df_out=True, a jako zmienną iteratora w wyrażeniu listowym użyj category_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=____
                                               )
Edytuj i uruchom kod