【发布时间】:2020-10-05 14:05:33
【问题描述】:
我有一个timeseries dataset 和5M rows。
该列有19.5% missing values、80% zeroes(不要按百分比值 - 虽然这意味着只有 0.5% 的数据有用,但 5M 的 0.5% 就足够了)。现在,我需要估算此列。
考虑到行数,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 插补过程的权重(用于加权平均计算),以便在插补过程中考虑移除的 0。
- 添加一列,说明特定列有多少个相邻零,然后以某种方式使用它来修改插补过程。
点1. 和2. 只是我在思考如何解决问题时想到的粗略想法,可能会在回答答案时有所帮助。
PS-
显然,我没有将时间序列数据直接输入 KNN。我正在做的是从日期列中提取
month、day等,然后使用它进行估算。我不需要并行处理作为答案来使代码运行得更快。数据如此之大,以至于我的笔记本电脑占用了大量内存。
【问题讨论】:
-
嗨,@paradoxlover。在数据中使用零的平均值进行插补将显着影响您的插补因为零的数量很高并且它们没有意义,但在插补数据时它们肯定会充当异常值。因此,我建议使用中位数进行估算,因为它对异常值的影响较小。您可以参考以下链接,为什么我建议将中值作为填充值。 stats.stackexchange.com/questions/143700/…
-
另外,您可以使用时间序列本身来查找缺失值
标签: python pandas missing-data knn imputation