🤖

欠損値補完ライブラリ DataWig を使ってみた

2021/02/27に公開

こちらの記事をみて DataWig という欠損値補完ライブラリを知ったので試してみました。
https://zenn.dev/atfujita/articles/84e826f3b8e4f99d24cb

なお、DataWig の詳細な仕様については公式ドキュメントをご参照ください。

コードの詳細部分は割愛していますので、GitHubGoogle Colabでご確認ください。

データセットはタイニックのものを使用しています。
https://raw.githubusercontent.com/mwaskom/seaborn-data/master/raw/titanic.csv

学習データ80%、テストデータ20%という割合になっております。

欠損値を含む特徴量、age(数値データ)、cabin(カテゴリデータ)、embarked(カテゴリデータ) についてDataWigを使ってみます。

パラメータ

欠損値の分布はいったん考えず、下記の6項目をもとに age、cabin、embarked の欠損値を補完します。

またエポック数は1000にしています。

INPUT_COLUMNS = ['name', "sex", "sibsp", "parch", "fare", "survived"]
EPOCH = 1000

embarked の欠損値補完

FILE_PATH は学習の重みを保存するパスなので、適当に設定ください。

import datawig

imputer = datawig.SimpleImputer(
    input_columns=INPUT_COLUMNS,
    output_column='embarked',
    output_path = FILE_PATH
)

# 学習
imputer.fit(
    train_df=train,
    num_epochs=EPOCH
)

# 欠損値に相当する項目の予測
predictions = imputer.predict(test)

下記のような感じで xxx_imputed、xxx_imputed_proba という項目が追加されました。

xxx_imputed が予測された補完内容になります。

見ていただくとお分かりと思いますが、欠損ではない項目についても補完内容を予測しており、ところどころ違っているところもあります。

予測された補完内容は、欠損部分のみ使用するのがよさそうです。

le_xxx、le_xxx_imputedという項目は、元々の値と予測した補完内容をそれぞれラベルエンコーディングしたものです。

f1_score(temp["le_embarked"], temp["le_embarked_imputed"], average='macro')

欠損していない部分について予測された補完内容と実際の内容からf1スコアを算出すると約60%とまあまあな割合でした。

0.639421620673713

cabin、age の欠損値処理

カテゴリデータの場合も数値データの場合も、datawig.SimpleImputer() の処理は変わらないので割愛します。

cabin のF1スコア

f1_score(temp["le_cabin"], temp["le_cabin_imputed"], average='macro')

embarked と同様の考えに基づき Cabin についてもF1スコアを算出しましたが、約3%とかなり低い精度になりました。

cabin はそもそもほとんどが欠損値であり、かつユニーク値も多いことから、予測精度はかなり低い値になってしまったようです。

0.028735632183908042

age の R2スコア

r2_score(temp["age"], temp["age_imputed"])

ageは数値データなので R2スコアを算出したところ、約25%と微妙な精度になりました。

0.25760977146668074

以上になります、最後までお読みいただきありがとうございました。

Discussion