НачатьНачать бесплатно

Кейс: болезни почек I — заполнение пропусков в категориальных признаках

Продолжим изучение конвейеров на примере набора данных, который требует значительно большей предобработки. Набор данных о хронической болезни почек содержит как категориальные, так и числовые признаки, а также большое количество пропущенных значений. Цель — предсказать наличие хронической болезни почек по различным показателям крови.

Как упоминал Сергей в видео, вы познакомитесь с новой библиотекой — sklearn_pandas. Она позволяет включать в конвейер значительно больше шагов обработки, чем поддерживает scikit-learn напрямую. В частности, класс DataFrameMapper() даёт возможность применять любой совместимый с sklearn преобразователь к столбцам DataFrame, а результат можно получить как в виде массива NumPy, так и в виде DataFrame.

Мы также подготовили преобразователь Dictifier, который инкапсулирует преобразование DataFrame с помощью .to_dict("records") — вам не нужно делать это вручную, и он корректно работает внутри конвейера. Кроме того, вам уже доступны: список названий признаков в kidney_feature_names, название целевой переменной в kidney_target_name, матрица признаков в X и целевой вектор в y.

В этом упражнении ваша задача — применить SimpleImputer из sklearn для заполнения пропусков во всех категориальных столбцах набора данных. В качестве шаблона используйте то, как был создан маппер для числовых признаков. Обратите внимание на именованные аргументы input_df=True и df_out=True: они нужны для работы с DataFrame вместо массивов. По умолчанию преобразователи получают на вход массив numpy из выбранных столбцов, и результат маппера тоже является массивом. Исторически преобразователи scikit-learn разрабатывались для работы с массивами numpy, а не с DataFrame из pandas — несмотря на схожесть их базовых интерфейсов индексирования.

Это упражнение является частью курса

Экстремальный градиентный бустинг с XGBoost

Посмотреть курс

Инструкции к упражнению

  • Примените маппер для категориальных признаков, используя DataFrameMapper() и SimpleImputer(). В SimpleImputer() не нужно передавать никаких аргументов. Столбцы содержатся в categorical_columns. Обязательно укажите input_df=True и df_out=True, а в генераторе списка используйте category_feature в качестве переменной итерации.

Интерактивное практическое упражнение

Попробуйте выполнить это упражнение, дополнив этот пример кода.

# 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=____
                                               )
Редактировать и запускать код