腎臓病ケーススタディ I:カテゴリカル補完器
ここからは、より多くの前処理が必要なデータセットでパイプラインを使う練習を続けます。慢性腎臓病データセット にはカテゴリカル特徴量と数値特徴量の両方が含まれますが、欠損値が多く含まれています。ここでの目標は、さまざまな血液検査の指標を特徴量として、慢性腎臓病の有無を予測することです。
動画でSergeyが述べたように、新しいライブラリ sklearn_pandas を使います。これは、scikit-learnが標準でサポートする以上に多くの処理ステップをパイプライン内で連結できるようにするものです。具体的には、DataFrameMapper() クラスを使って、任意の sklearn 互換トランスフォーマーをDataFrameの列に適用でき、出力は NumPy 配列または DataFrame のいずれかにできます。
また、明示的に書かなくても(そしてパイプライン内で動作するように).to_dict("records") によるDataFrameの辞書化を内包した Dictifier というトランスフォーマーも用意しました。さらに、特徴量名のリストは kidney_feature_names、目的変数名は kidney_target_name、特徴量は X、目的変数は y に用意してあります。
この演習では、sklearn の SimpleImputer を使って、データセット内のすべてのカテゴリカル列を補完することが課題です。数値の補完マッパーがどのように作られているかをひな型として参照してください。キーワード引数に input_df=True と df_out=True があることに気づきましたか? これは、配列ではなくDataFrameで扱えるようにするためです。デフォルトでは、トランスフォーマーには選択された列の numpy 配列が入力として渡され、その結果、DataFrame mapper の出力も配列になります。scikit-learn のトランスフォーマーは、基本的なインデックス操作は似ているものの、歴史的に pandas のDataFrameではなく numpy 配列で動作するように設計されてきました。
この演習はコースの一部です
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=____
)