详细内容或原文请订阅后点击阅览
你的模型是时盲的吗?循环特征编码的案例
循环编码如何改进机器学习预测帖子“你的模型是时盲的吗?”循环特征编码案例首先出现在《走向数据科学》上。
来源:走向数据科学: 午夜悖论
想象一下。您正在构建一个模型来预测电力需求或出租车接送情况。因此,您从午夜开始给它喂食时间(例如分钟)。干净简单。正确的?
现在,您的模型会看到 23:59(当天的 1439 分钟)和 00:01(当天的 1 分钟)。对你来说,它们相隔两分钟。对于你的模型来说,它们相距很远。这就是午夜悖论。是的,你的模型可能是时间盲的。
为什么会发生这种情况?
因为大多数机器学习模型将数字视为直线,而不是圆形。
线性回归、KNN、SVM,甚至神经网络都会逻辑地处理数字,假设较大的数字比较小的数字“更多”。他们不知道时间会结束。午夜是他们永远不会原谅的极端情况。
如果您曾经向模型添加每小时信息但没有成功,后来想知道为什么您的模型在日边界上挣扎,这可能就是原因。
标准编码的失败
我们来谈谈常用的方法。您可能至少使用过其中之一。
您将小时编码为从 0 到 23 的数字。现在 23 小时和 0 小时之间存在一个人为的悬崖。因此,该模型认为午夜是一天中最大的跳跃。然而,午夜与晚上 11 点之间的差异真的比晚上 10 点与晚上 9 点之间的差异更大吗?
当然不是。但你的模型不知道这一点。
这是处于“线性”模式时的小时表示。
# 生成数据
date_today = pd.to_datetime('今天').normalize()
datetime_24_hours = pd.date_range(start=date_today, period=24, freq='h')
df = pd.DataFrame({'dt': datetime_24_hours})df['小时'] = df['dt'].dt.小时# 计算正弦和余弦df["hour_sin"] = np.sin(2 * np.pi * df["hour"] / 24)df["hour_cos"] = np.cos(2 * np.pi * df["hour"] / 24)# 以线性模式绘制小时数plt.figure(figsize=(15, 5))plt.plot(df['小时'], [1]*24, 线宽=3)plt.title('线性模式下的小时数')plt.xlabel('小时')plt.xticks(np.arange(0, 24, 1))plt.ylabel('值')plt.show()那么,让我们转向一个可行的替代方案。代码获取数据。
