機械学習:前処理 NaNの取扱:Simple Imputerを使った補完
前記事では、pandasを使って数値データの補完を行いましたが、データは数値だけとは限らず、地名、色、サイズ等のカテゴリデータである場合もあります。
カテゴリデータは、平均値や中心値でなく、最も頻繁に出てくる値で置き換えたり、NaNではなく他の単語で置き換えることが最適でしょう。
その場合に使うのが、sklearn.imputeに含まれているSimple Imputerです。
例としてのデータフレームは前記事とは違い、カテゴリデータを含めておきます。
import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
# サンプルデータフレームを作成
df = pd.DataFrame({
'A': ['red', 'blue', np.nan, 'green', 'red'],
'B': ['small', 'large', 'medium', np.nan, 'small'],
'C': [10, 12, 13, np.nan,14]
})
このデータフレームの出力はこうなります。
これに関して、すべてのNaNを最も頻繁に出てくる値に補完するには以下のようにします。
imr = SimpleImputer(missing_values=np.nan,strategy='most_frequent')
imputed_df= pd.DataFrame(imr.fit_transform(df), columns=df.columns)
imputed_df
補完されたデータフレームは、こうなります。
でも、色とサイズは最頻値補完で良いけれど、C列の値は最頻値でなくて平均値にしたい場合、少々面倒ですが、列のみを抜き出して行います。
column_name = 'C'
column_data = df[column_name]
# 平均値で補完
imr = SimpleImputer(strategy='mean')
imputed_data = imr.fit_transform(column_data.values.reshape(-1, 1))
# 補完したデータを元のデータフレームに適用
df[column_name] = imputed_data
出力で見ると、C列のみ平均値で置き換えられています。
このdfに、最初に挙げた、全列のNaNを最頻値に置き換える作業を行うと、各行に関して最適な補完ができたデータフレームとなります。
なお、この例では不適切なので扱いませんでしたが、行指定で保管する場合も同じく、行を指定して抜き出して補完し、それを元に戻す作業を行います。
# 補完を行う行のインデックス
row_index = 1
# 指定した行のデータを抽出
row_data = df.iloc[row_index, :]
# SimpleImputerを作成して平均値で補完
imr = SimpleImputer(strategy='mean')
imputed_data = imr.fit_transform(row_data.values.reshape(1, -1))
# 補完したデータを元のデータフレームに適用
df.iloc[row_index, :] = imputed_data