Наилучшая практика выбора правильного набора тестов с учетом неверных данных - PullRequest
0 голосов
/ 20 июня 2019

Мы разрабатываем модели машинного обучения, в основном используя scikit-learn. Как и большинство реальных данных, наши обучающие наборы данных имеют большое количество (несколько) идентифицируемых «плохих строк». В этом случае BAD во многом определяется тем, что TARGET неправдоподобен по отношению к функциям. Однако существует несколько слегка отличающихся способов диагностики этих неправдоподобных строк, и нет удобной функции с именем is_bad_data: -).

Все наши конвейеры выполняют некоторую степень «фильтрации плохих данных» перед режимом обучения. Но мы играли с вариациями фильтрации, ни одна из которых не является на 100% правильной, а разные методы дают разные ложные срабатывания и ложные отрицания.

Когда мы получаем новые наблюдения, у нас нет желания делать прогнозы для старых плохих ЦЕЛЕЙ. На самом деле, интуитивно понятная производительность будет просто хуже, если мы прогнозируем цели в плохих строках.

Так, как мы проверяем наши различные модели друг против друга? То есть должен ли тестовый набор извлекаться из «сырых» данных или из «чистых» данных (последние исключая строки в нашем начальном наборе)?

Различные конвейеры используют разные методы очистки данных. Наша существующая первичная метрика просто проверяет необработанные данные, а не выполняет очистку (или передискретизацию и т. Д.) Перед подачей их в метрику.

Коллега предложил более справедливо отфильтровать данные перед их использованием в тестовом наборе. Однако это сильно сказывается на нашей уверенности в качестве фильтрации.

В псевдокоде наш процесс выглядит следующим образом:

raw = read_dataset()
# Each style earnestly tries to arrive at good data
clean1 = remove_rows(raw, style1)
clean2 = remove_rows(raw, style2)
clean3 = remove_rows(raw, style3)

model0 = ModelClass0().fit(raw.data, raw.target)
model1 = ModelClass1().fit(clean1.data, clean1.target)
model2 = ModelClass2().fit(clean2.data, clean2.target)
model3 = ModelClass3().fit(clean3.data, clean3.target)

Время проверить. Что справедливо?

models = [model0, model1, model2, model3]
# Might score against the raw data
scores0 = BogoMetric(models, raw)
# Or maybe one of the attempts at cleaning
scores1 = BogoMetric(models, clean1)
scores2 = BogoMetric(models, clean2)
scores3 = BogoMetric(models, clean3)

Каждая модель, по-видимому, работает лучше, если ей предоставляется возможность проверить свой собственный стиль фильтрации данных. Это не честно. Но тогда у необработанных данных есть по крайней мере несколько строк, которые явно неверны, и мы не должны предсказывать.

...