このチュートリアルでは、欠測値を処理するための3つのアプローチを学習します。 次に、これらのアプローチの有効性を実際のデータセットで比較します。
はじめに
データが欠落した値になる可能性がある多くの方法があります。 例えば、
- 2ベッドルームの家には、3ベッドルームのサイズの値は含まれません。
- 調査回答者は、収入を共有しないことを選択できます。
ほとんどの機械学習ライブラリ(scikit-learnを含む)では、値が欠落しているデータを使用してモデルを構築しようとするとエラーが発生します。 したがって、以下の戦略のいずれかを選択する必要があります。
3つのアプローチ
1)簡単なオプション:値が欠落している列を削除する
最も簡単なオプションは、値が欠落している列を削除することです。

ドロップされた列のほとんどの値が欠落していない限り、モデルはこのアプローチで多くの(潜在的に有用な!)情報にアクセスできなくなります。 極端な例として、1つの重要な列に1つのエントリがない、10,000行のデータセットについて考えてみます。 このアプローチでは、列が完全に削除されます。
2)より良いオプション:代入
代入は、欠落している値をいくつかの数値で埋めます。 たとえば、各列に沿って平均値を入力できます。

ほとんどの場合、入力された値は正確には正しくありませんが、通常、列を完全に削除した場合よりも正確なモデルになります。
3)代入の拡張
代入は標準的なアプローチであり、通常はうまく機能します。 ただし、代入された値は、実際の値(データセットに収集されなかった)よりも体系的に上または下にある場合があります。 または、値が欠落している行が他の方法で一意である可能性があります。 その場合、モデルは、元々欠落していた値を考慮することにより、より適切な予測を行います。

このアプローチでは、以前と同様に、欠落している値を代入します。 さらに、元のデータセットにエントリが欠落している列ごとに、入力されたエントリの場所を示す新しい列を追加します。
場合によっては、これにより結果が大幅に改善されます。 それ以外の場合は、まったく役に立ちません。
例えば
この例では、MelbourneHousingデータセットを使用します。 私たちのモデルは、部屋の数や土地のサイズなどの情報を使用して住宅価格を予測します。
データの読み込み手順には焦点を当てません。 代わりに、X_train、X_valid、y_train、およびy_validにトレーニングと検証のデータがすでにある時点にいると想像できます。
各アプローチの品質を測定する関数を定義する
関数score_dataset()を定義して、欠落値を処理するためのさまざまなアプローチを比較します。 この関数は、ランダムフォレストモデルからの平均絶対誤差(MAE)を報告します。
アプローチ1のスコア(値が欠落している列を削除)
トレーニングセットと検証セットの両方を使用しているため、両方のDataFrameに同じ列をドロップするように注意します。

アプローチ2からのスコア(代入)
次に、SimpleImputerを使用して、欠落している値を各列の平均値に置き換えます。
簡単ですが、平均値の入力は一般的に非常にうまく機能します(ただし、これはデータセットによって異なります)。 統計学者は、代入値を決定するためのより複雑な方法(たとえば、回帰代入など)を実験してきましたが、結果を高度な機械学習モデルにプラグインすると、通常、複雑な戦略は追加のメリットをもたらしません。

アプローチ2のMAEはアプローチ1よりも低いため、このデータセットではアプローチ2のパフォーマンスが向上していることがわかります。
アプローチ3(代入の拡張)からのスコア
次に、どの値が代入されたかを追跡しながら、欠落している値を代入します。

ご覧のとおり、アプローチ3はアプローチ2よりもわずかにパフォーマンスが劣っていました。
では、なぜ代入は列を削除するよりも優れたパフォーマンスを示したのでしょうか。
トレーニングデータには10864行と12列があり、3列には欠測データが含まれています。 各列で、欠落しているエントリは半分未満です。 したがって、列を削除すると多くの有用な情報が削除されるため、代入のパフォーマンスが向上することは理にかなっています。

結論
よくあることですが、(アプローチ2とアプローチ3で)欠落値を代入すると、(アプローチ1で)欠落値のある列を単純に削除した場合と比較して、より良い結果が得られました。
あなたの番です
この演習では、欠測値を自分で処理するためのこれらのアプローチを比較してください。
![]() | データサイエンスの森 Kaggleの歩き方 [ 坂本俊之 ] 価格:2,904円 |

![]() | 価格:3,608円 |

![]() | すぐに使える!業務で実践できる!PythonによるAI・機械学習・深層学習アプリ [ クジラ飛行机 ] 価格:3,520円 |
