背景
特徴量に欠損値(NaNとか)がある場合、平均や0で埋めたりする。しかし、欠損値の割合が増すにつれて平均や0で埋める割合が増えるわけだけど、それは同時に「その特徴量の大部分が同じ値なる」ことがある。パッと思いつく問題点は以下。
- 全て欠損値の場合、全てが同じ値で埋められて、分散が0に。(標準化ができない。)
- 全てが欠損値じゃない場合でも、交差検証で分割次第で値が全て同じに。
一定割合以上の欠損値を含む特徴量をモデルから削除
ということで、手っ取り早く一定の割合以上の欠損値を含む特徴量を削除してしまうことで、上記の問題を避けてしまうことにする。データはpd.DataFrameで与えられるとして手順は以下。
- 各列の欠損値の合計を示す配列を取得
- 1.をデータ数で割って割合にする
- 一定の割合(rate)よりも欠損値を含む列番号をリストに追加していく
- 3.のリストをpd.DataFrame.drop()に入れてまとめて削除
main_in
import pandas as pd
def drop_manyNuNcolumns(df,rate):
NaN_sum = df.isnull().sum() # 1.
rate_NaN = NaN_sum / df.shape[0] # 2.
drop_list = list() # 3.
for i in range(rate_NaN.shape[0]-1):
if rate_NaN[i] > rate:
drop_list.append(i)
else:
pass
return df.drop(data.columns[drop_list], axis=1) # 4.