Menu
CoddyTech

Заполнение пропусков в конвейере

Часть раздела Обучение с учителем путешествия по Machine Learning на Coddy. Урок 47 из 58.

В реальных журналах есть пропуски, и большинство моделей не может с ними работать. SimpleImputer заполняет каждый пропуск средним, медианным или наиболее часто встречающимся значением в столбце.

Заполнить до разделения, и тестовые строки помогают выбрать это значение: утечка. Семь глубин погружения и один пропуск:

Две копии столбца из 8 глубин погружения, последние две отмечены как тестовые строки, а в одной ячейке пропуск. Слева, заполнение, затем разделение: пропуск получает значение 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:

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

Там, где значения различаются, заполнение перед разделением позволило бы тестовым строкам повлиять на обучающие данные.

Попробуйте сами

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