У меня timeseries dataset
с 5M rows
.
В столбце есть 19.5% missing values
, 80% zeroes
(не go по процентным значениям - хотя это означает, что полезны только 0,5% данных, но тогда достаточно 0,5% от 5M). Теперь мне нужно вменять этот столбец.
Учитывая количество строк, требуется около 2,5 часов для KNN, чтобы вменять все это.
Чтобы сделать это быстрее, я подумал об удалении всех строк с нулевыми значениями, а затем выполнить процесс вменения. Но я чувствую, что использование 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
, et c. из столбца даты, а затем использовать это для вменения.
I не требует параллельной обработки в качестве ответа , чтобы код работал быстрее. Объем данных настолько велик, что из-за большого объема оперативной памяти мой ноутбук зависает.