列の調査
各列にどのようなデータが入っているか調べ、有効な列を特定する。
値が1種類しかない列
値の種類が1種類しかない列は学習に寄与しません。
次のコードは、カラムに含まれる値が1種類しかない列の列名を抽出します。
one_value_cols = [col for col in train.columns if train[col].nunique() <= 1]
one_value_cols_test = [col for col in test.columns if test[col].nunique() <= 1]
ある値がほとんどを占める列
列に含まれるデータのほとんどが、特定の1種類の値になっているとき、もはやその列には「特定の1種類の値 or それ以外」程度の情報しかない場合があります。
次のコードは、カラムに含まれる値のうち、特定の1種類の値が90%より多く占めている列の列名を抽出します。
big_top_value_cols = [col for col in train.columns if train[col].value_counts(dropna=False, normalize=True).values[0] > 0.9]
big_top_value_cols_test = [col for col in test.columns if test[col].value_counts(dropna=False, normalize=True).values[0] > 0.9]
nullが多すぎる列
列に含まれるデータのほとんどが、null値になっているとき、もはやその列には「null or not null」程度の情報しかない場合があります。
次のコードは、カラムに含まれる値のうち、null値が90%より多く占めている列の列名を抽出します。
many_null_cols = [col for col in train.columns if train[col].isnull().sum() / train.shape[0] > 0.9]
many_null_cols_test = [col for col in test.columns if test[col].isnull().sum() / test.shape[0] > 0.9]
特徴量作成
Frequency encoding
カテゴリ型の列を値の出現頻度に変換する。
df['cat'] = df['cat'].map(df['cat'].value_counts(dropna=False, normalize=True))
グループごとの偏差値
カテゴリ型の列でグルーピング、平均値を求め元の値から引き算する。厳密には偏差値は標準偏差で割るが、決定木系のモデルでは分布が変わらなければ影響がないので省略できる。
df['val_to_mean_cat'] = df['val'] - df.groupby('cat')['val'].transform('mean')