機械学習:前処理 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]
})

このデータフレームの出力はこうなります。

df

これに関して、すべてのNaNを最も頻繁に出てくる値に補完するには以下のようにします。

imr = SimpleImputer(missing_values=np.nan,strategy='most_frequent')
imputed_df= pd.DataFrame(imr.fit_transform(df), columns=df.columns)

imputed_df

補完されたデータフレームは、こうなります。

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列のみ平均値で置き換えられています。

imputed df only C

このdfに、最初に挙げた、全列のNaNを最頻値に置き換える作業を行うと、各行に関して最適な補完ができたデータフレームとなります。

Imputed data

なお、この例では不適切なので扱いませんでしたが、行指定で保管する場合も同じく、行を指定して抜き出して補完し、それを元に戻す作業を行います。

# 補完を行う行のインデックス
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

いいなと思ったら応援しよう!