パイプラインでの欠損値補完
CoddyのMachine Learningジャーニー「教師あり学習」セクションの一部。レッスン 47/58。
実際のログには欠損があり、多くのモデルはそれを受け付けません。SimpleImputerは、各欠損値をその列の平均値、中央値、または最頻値で埋めます。
分割する前に補完すると、テスト行がその値の選択に使われます。これはリークです。ダイビングの深さが7つあり、1つ欠損しています。
パイプラインでは、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"])チャレンジ
中級森林管理局は、どの落雷が火災を引き起こすかを予測しますが、欠損している観測値もあります。用意されたコードはwildfire.csvを分割し、meanまたはmedianの戦略を読み取ります。
- その戦略を使う欠損値補完器、スケーラー、ロジスティック回帰のパイプラインを学習させます。テスト精度を出力してください。
- 各列について、パイプラインが補完に使った値と、
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.02つの値が異なる箇所では、分割前に補完すると、テスト行が学習データに影響を与えてしまいます。
自分で試してみよう
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()
# 以下にコードを書いてください
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
教師あり学習のすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ