Кейс: болезни почек 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=____
)