肾病案例研究 I:分类变量插补器
现在,您将继续练习在需要更多数据整理的数据集上使用流水线。慢性肾病数据集同时包含分类特征和数值特征,但缺失值很多。本练习的目标是:基于多种血液指标等特征,预测哪些人患有慢性肾病。
正如 Sergey 在视频中提到的,您将接触一个新库 sklearn_pandas。它可以在流水线中串联更多预处理步骤,超出当前 scikit-learn 原生所支持的范围。具体来说,您可以使用 DataFrameMapper() 类,将任意兼容 sklearn 的变换器应用到 DataFrame 的列上,且输出可以是 NumPy 数组或 DataFrame。
我们还创建了一个名为 Dictifier 的变换器,用于封装对 DataFrame 调用 .to_dict("records") 的过程,避免您显式编写该步骤(并确保其可在流水线中工作)。此外,我们还提供了特征名列表 kidney_feature_names、目标名 kidney_target_name、特征 X 和目标 y。
在本练习中,您的任务是使用 sklearn 的 SimpleImputer 对数据集中的所有分类列进行插补。您可以参考数值插补映射器的创建方式作为模板。注意关键字参数 input_df=True 和 df_out=True 吗?这样您就可以直接处理 DataFrame,而不是数组。默认情况下,变换器接收所选列构成的 numpy 数组作为输入,因此 DataFrame 映射器的输出也会是数组。历史上,scikit-learn 的变换器主要面向 numpy 数组设计,而不是 pandas DataFrame,尽管它们的基本索引接口相似。
本练习是课程的一部分
使用 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=____
)