У меня timeseries dataset
с 5M rows
.
В столбце есть 19.5% missing values
, 80% zeroes
(не ориентируйтесь на процентные значения - хотя это означает, что полезны только 0,5% данных, но тогда достаточно 0,5% от 5M). Теперь мне нужно вменять этот столбец.
Учитывая количество строк, KNN требуется около 2,5 часов, чтобы вменять все это целиком.
Чтобы сделать это быстрее, я подумал об удалении всех строк с нулевыми значениями, а затем выполнить процесс вменения. Но я чувствую, что использование KNN наивно после этого приведет к переоценке (поскольку все нулевые значения ушли, а количество соседей остается фиксированным, ожидается, что среднее значение увеличится) .
Итак, есть ли способ:
Чтобы изменить ввод данных в модель KNN
Выполните процесс вменения после удаления строк с нулями, чтобы значения, полученные после вменения, были такими же или, по крайней мере, близкими к
Чтобы понять проблему более четко, рассмотрим следующий фиктивный фрейм данных:
DATE VALUE
0 2018-01-01 0.0
1 2018-01-02 8.0
2 2018-01-03 0.0
3 2018-01-04 0.0
4 2018-01-05 0.0
5 2018-01-06 10.0
6 2018-01-07 NaN
7 2018-01-08 9.0
8 2018-01-09 0.0
9 2018-01-10 0.0
Теперь, если я использую KNN (k=3)
, то с нулями значение будет средневзвешенным для 0
, 10
и 9
. Но если я удалю нули наивно, значение будет рассчитано на основе средневзвешенного значения 8
, 10
и 9
.
Вот несколько приблизительных идей, которые я придумал, но не смог реализовать:
- Изменение весов (используемых при вычислении средневзвешенного значения) процесса вменения KNN таким образом, чтобы удаленные нули учитывались во время вменения.
- Добавление столбца, в котором указано, сколько соседних нулей имеет конкретный столбец, а затем его использование для изменения процесса вменения.
Пункты 1.
и 2.
- это всего лишь приблизительные идеи, которые пришли мне в голову, когда я думал о том, как решить проблему, и могут помочь при ответе на ответ.
PS -
Очевидно, я не загружаю данные временных рядов непосредственно в KNN. Я извлекаю
month
,day
и т. Д. Из столбца даты, а затем использую это для вменения.Мне не нужна параллельная обработка в качестве ответа, чтобы код работал быстрее. Объем данных настолько велик, что мой ноутбук из-за высокой загрузки ОЗУ зависает.