Scikit-learn Imputer を使いこなす究極のガイド
Updated on
大規模なデータセットを扱う際に欠損値に遭遇することはほぼ避けられないでしょう。欠損データを効率的に扱うことは、データ前処理の基本的なステップです。Scikit-learn の Imputer は、このタスクに対して一連の堅牢な戦略を提供します。この記事では、Scikit-learn の SimpleImputer、IterativeImputer、KNNImputer について説明し、数値データとカテゴリカルデータを扱う方法を説明します。
Python Pandas データフレームからコードを必要とせずにデータ可視化をすばやく作成したいですか?
PyGWalker は、可視化を伴う探索的データ分析の Python ライブラリです。PyGWalker (opens in a new tab) は、パンダのデータフレーム (およびポラズのデータフレーム) をタブロー風のユーザーインターフェイスに変換することにより、Jupyter Notebook のデータ分析とデータ可視化のワークフローを簡素化します。
Imputer とは
「how-tos」に進む前に、まず Imputer が何であるかを理解しましょう。Imputer は、データセットの欠損値を埋める推定器です。数値データの場合は平均値、中央値、定数などの戦略を使用し、カテゴリカルデータでは最も頻繁に出現する値または定数を使用します。また、データの複雑さやリソースに応じて、モデルをトレーニングして欠損値を予測することもできます。
このガイドでは、主に Scikit-learn の SimpleImputer、IterativeImputer、KNNImputer に焦点を当てます。さらに、カテゴリカルと数値の両方の特徴を実行するためのパイプラインを作成し、機械学習モデルにシームレスにフィードする方法を説明します。
Scikit-learn's Imputer のセットアップ
Scikit-learn の imputation 関数は、わずか数行のコードを使って欠損データを処理する便利な方法を提供します。さらに、パイプラインを作成することができ、結果を再現し、機械学習の開発ワークフローを改善することができます。
環境とデータセット
Scikit-learn の Imputer を使用する具体的な方法に入る前に、環境を設定し、データセットを取得しましょう。このチュートリアルでは、機械学習コミュニティで人気の高い Pima Indians Diabetes Database を使用します。
このデータセットは Kaggle 上で無料で利用でき、Kaggle API を使用して直接ダウンロードすることができます。まず、必要な Python ライブラリをインストールする必要があります。
!pip install numpy pandas scikit-learn kaggle
次に、Kaggle API を使用して Pima Indians Diabetes Database をダウンロードします。
!kaggle datasets download -d uciml/pima-indians-diabetes-database
!unzip pima-indians-diabetes-database.zip -d ./dataset
これでデータセットが揃いましたので、pandas DataFrame に読み込み、確認してみましょう。
import pandas as pd
df = pd.read_csv("./dataset/diabetes.csv")
print(df.head())
データセットについて詳しく見ていく
データをロードしたら、その構造を理解することが不可欠です。ピマインディアン糖尿病データベースには、8つの数値特徴量と1つのバイナリターゲット列「Outcome」があります。特徴は、グルコースレベル、血圧、BMIなどのさまざまな健康指標に関連しており、ターゲット列は、個人が糖尿病を患っているかどうかを示します。
まず、データセットの形状を調べてみましょう。
print(df.shape)
この出力から、データセットが768行9列を含むことが確認できます。
欠損値の検出
リアルワールドのデータセットでは、欠損値は非常に一般的です。したがって、機械学習モデリングに入る前に、これらの欠損値を特定し、適切に処理する必要があります。
データセットの欠損値をチェックしましょう。
missing_values = df.isnull().sum()
print(missing_values)
理想的なシナリオでは、このコマンドはすべての列に対してゼロを返すはずです。しかし、実際にはそうではありません。次のセクションでこれらの欠損値をどのように処理するか説明します。
数値の補完
Scikit-learnのImputerでは、数値とカテゴリーの補完を区別します。数値補完は、欠損している数値を統計的推定値で置き換えるプロセスです。平均値、中央値、モードを置き換え値として使用するのが一般的です。
チュートリアルの目的に合わせて、「BloodPressure」列に欠損値があると仮定しましょう。最初に、欠損値の数を確認する必要があります。
print(df['BloodPressure'].isnull().sum())
次のセクションでは、Scikit-learnのSimpleImputerを使用してこれらの欠損値を補完する方法を学習します。
Scikit-learnのSimpleImputerを使用した数値の補完
Scikit-learnの SimpleImputer
は、欠損している数値を処理する簡単な方法を提供します。平均値、中央値、あるいは定数値を欠損値の代替値として使用するなど、様々な戦略を提供しています。ここでは、 'BloodPressure'列の欠損値を補完するために SimpleImputer
を使用する例を説明します。
from sklearn.impute import SimpleImputer
# SimpleImputerのインスタンスを作成する
imputer = SimpleImputer(strategy='mean')
# 列を2D配列に変換する
blood_pressure = df['BloodPressure'].values.reshape(-1, 1)
# 欠損値を補完する
imputed_blood_pressure = imputer.fit_transform(blood_pressure)
# DataFrameを更新し、補完後の値をセットする
df['BloodPressure'] = imputed_blood_pressure
strategyパラメータを 'mean'に設定することで、 SimpleImputer
は利用可能な値の平均値を計算し、その平均値を欠損値で置き換えます。データの性質に応じて、 'median'または 'constant'を戦略として使用することもできます。
欠損値を補完した後は、欠損値が残っていないかを確認することが常に良い習慣です。
まず、データセットの形状を調べてみましょう。
```python
print(df.shape)
この出力から、データセットが768行9列を含むことが確認できます。
欠損値の検出
リアルワールドのデータセットでは、欠損値は非常に一般的です。したがって、機械学習モデリングに入る前に、これらの欠損値を特定し、適切に処理する必要があります。
データセットの欠損値をチェックしましょう。
missing_values = df.isnull().sum()
print(missing_values)
理想的なシナリオでは、このコマンドはすべての列に対してゼロを返すはずです。しかし、実際にはそうではありません。次のセクションでこれらの欠損値をどのように処理するか説明します。
数値の補完
Scikit-learnのImputerでは、数値とカテゴリーの補完を区別します。数値補完は、欠損している数値を統計的推定値で置き換えるプロセスです。平均値、中央値、モードを置き換え値として使用するのが一般的です。
チュートリアルの目的に合わせて、「BloodPressure」列に欠損値があると仮定しましょう。最初に、欠損値の数を確認する必要があります。
print(df['BloodPressure'].isnull().sum())
次のセクションでは、Scikit-learnのSimpleImputerを使用してこれらの欠損値を補完する方法を学習します。
Scikit-learnのSimpleImputerを使用した数値の補完
Scikit-learnの SimpleImputer
は、欠損している数値を処理する簡単な方法を提供します。平均値、中央値、あるいは定数値を欠損値の代替値として使用するなど、様々な戦略を提供しています。ここでは、 'BloodPressure'列の欠損値を補完するために SimpleImputer
を使用する例を説明します。
from sklearn.impute import SimpleImputer
# SimpleImputerのインスタンスを作成する
imputer = SimpleImputer(strategy='mean')
# 列を2D配列に変換する
blood_pressure = df['BloodPressure'].values.reshape(-1, 1)
# 欠損値を補完する
imputed_blood_pressure = imputer.fit_transform(blood_pressure)
# DataFrameを更新し、補完後の値をセットする
df['BloodPressure'] = imputed_blood_pressure
strategyパラメータを 'mean'に設定することで、 SimpleImputer
は利用可能な値の平均値を計算し、その平均値を欠損値で置き換えます。データの性質に応じて、 'median'または 'constant'を戦略として使用することもできます。
欠損値を補完した後は、欠損値が残っていないかを確認することが常に良い習慣です。
```python
print(df['BloodPressure'].isnull().sum())
欠損値が補完された後、出力値は0でなければならず、「BloodPressure」列に残る欠損値はないことを示します。
カテゴリカル値の補完
次に、カテゴリカル値の補完に移りましょう。この例では、欠損値を含む「SkinThickness」列を考慮しましょう。
前のセクションと同様に、「SkinThickness」列に存在する欠損値の数を最初に確認します。
print(df['SkinThickness'].isnull().sum())
カテゴリカル値を補完するために、SimpleImputer
が提供する「most_frequent」戦略を使用できます。この戦略は、欠損値を列内の最頻値で置き換えます。
# カテゴリカル値用のSimpleImputerのインスタンスを作成する
imputer_categorical = SimpleImputer(strategy='most_frequent')
# 列を2D配列に変形する
skin_thickness = df['SkinThickness'].values.reshape(-1, 1)
# 欠損値を補完する
imputed_skin_thickness = imputer_categorical.fit_transform(skin_thickness)
# 補完された値でDataFrameを更新する
df['SkinThickness'] = imputed_skin_thickness
欠損値を補完した後、残る「SkinThickness」列に欠損値があるかどうかを確認しましょう。
print(df['SkinThickness'].isnull().sum())
出力値は0でなければならず、これは、「SkinThickness」列のすべての欠損カテゴリカル値が正常に補完されたことを示します。
結論
このガイドのこの部分では、Scikit-learnのSimpleImputer
を使用して、数値的およびカテゴリカル列の欠損値を処理する方法を学びました。データの性質に基づいて平均、中央値、最頻値などの戦略を探索し、欠損値を補完しました。
欠損値の補完は、データの前処理パイプラインの重要なステップであり、有用な情報を保持し、モデルが完全なデータセットから学習できることを保証するために必要です。Scikit-learnのSimpleImputer
を活用することで、データサイエンティストや機械学習の専門家は、欠損データを効率的に処理し、頑健なモデルを構築できます。