Menu
CoddyTech

パイプラインでの欠損値補完

CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 47/58。

実際のログには欠損があり、多くのモデルはそれを受け付けません。SimpleImputerは、各欠損値をその列の平均値、中央値、または最頻値で埋めます。

分割する前に補完すると、テスト行がその値の選択に使われます。これはリークです。ダイビングの深さが7つあり、1つ欠損しています。

ダイビングの深さを示す8行の列を2つ並べた図。最後の2行はテスト行として示され、1つのセルが欠損している。左は、補完してから分割する場合:欠損値には21.3が入り、既知の深さ7つすべての平均が使われる。テスト行も含まれており、リークが発生する。右は、分割してからパイプラインを使う場合:欠損値には18.0が入り、学習行のみの平均が使われる

パイプラインでは、fit は訓練データの行のみから補完値を学習します:

from sklearn.impute import SimpleImputer

pipe = make_pipeline(SimpleImputer(strategy="median"), StandardScaler(), model)
pipe.fit(X_train, y_train)
print(pipe[0].statistics_)  # 最初のステップで補完に使う値

ダイブログ(深度、分数、水温)の場合、次のように出力されます。

[19. 44. 21.]

単語と同様に、数値の処理手順もColumnTransformerの1つのレーンになります。

lane = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
("numbers", lane, ["depth_m", "minutes"])
challenge icon

チャレンジ

中級

森林管理局は、どの落雷が火災を引き起こすかを予測しますが、欠損している観測値もあります。用意されたコードはwildfire.csvを分割し、meanまたはmedianの戦略を読み取ります。

  1. その戦略を使う欠損値補完器、スケーラー、ロジスティック回帰のパイプラインを学習させます。テスト精度を出力してください。
  2. 各列について、パイプラインが補完に使った値と、Xの全行から計算した場合の値を、小数点以下1桁で出力してください。

別の森林で、medianを使った場合:

Test accuracy: 0.840
humidity_pct: fill 46.0, all rows would give 46.0
wind_kmh: fill 29.0, all rows would give 32.0
temp_c: fill 25.0, all rows would give 26.0
days_without_rain: fill 23.0, all rows would give 23.0

2つの値が異なる箇所では、分割前に補完すると、テスト行が学習データに影響を与えてしまいます。

自分で試してみよう

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline

# 乾燥した森林への落雷:落雷によって火災が発生した (1) か、しなかった (0) か?
# 気象観測値の一部が欠けています。
strikes = pd.read_csv("wildfire.csv")
columns = ["humidity_pct", "wind_kmh", "temp_c", "days_without_rain"]
X = strikes[columns]
y = strikes["fire"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
strategy = input()

# 以下にコードを書いてください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

教師あり学習のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ