混合数据的 KNN(特征集)

数据挖掘 机器学习 Python k-nn
2022-02-12 18:57:28

我有一个数据集,其中特征集由一天中的小时(0 到 23 之间)、星期几(周一到周日)、商店数量(正整数)和道路类别(序数范围内的 0 到 8 )组成)。我希望预测行人数量,这是一个连续变量。因此,我正在寻找一种回归方法,并沿着使用 KNN 的思路进行思考。它适合这项任务吗?我特别担心小时和天数据,因为它们本质上是循环的。

df_test[['Day', 'Time','shop_count','road_category','pedestrian_volume']].iloc[0:5]

           Day  Time        shop_count       road_category  pedestrian_volume
  0    Tuesday    20                22                   0             210.0
  1    Tuesday    21                13                   4             196.0
  2    Tuesday    22                39                   4             214.0
  3    Tuesday    23                 2                   8              46.0
  4  Wednesday     0                15                   8              18.0
2个回答

KNN 是一种分类算法,其中通常使用连续变量来应用分类。您的问题是使用不连续的变量预测连续值的问题。

您的问题提出了几个挑战,对我来说,这表明 KNN 不是一个好的选择。

  1. 最大的问题可能是你有一个序数值的 road_category。类别 4 是否比类别 0 和类别 1 之间的差异大四倍?可能不是。
  2. 无论你的数据有多深,由于你的预测变量是整数或分类的,你的邻居不会是真正的邻居,更像是仓库里的室友;您可能会对同一个向量进行数百次观察。所以,现在你必须从m个观察中选择k 个值。所以,你需要想出一个算法来做到这一点。然后你必须想出一种方法来获得预测。平均值可能有效,但根据您的应用程序,最小值或最大值可能更有益。

最重要的是,KNN 期望变量接近相同的数量级,否则较大的变量往往会确定邻居,即使它们不一定更重要。使用虚拟变量可能会容纳一些有限的分类变量,但我会非常小心。

根据您对问题的描述,我认为您应该继续回归,但对分类值使用虚拟变量编码。

我会检查工作日是否有类似的行人体积分布,并对周末进行相同的检查。如果这是真的,我只会创建一个二进制变量“工作日”。

对于时间,如果说一个时间为 23 的观察即将到来,kNN 可能无法找到时间为 0 的邻居,但时间为 23 或 22 的邻居可能已经足够了。如果不是,您可以将时间转换为类别,例如:“晚上”、“早上”、“午餐时间”、“下午”、“晚上”,看看这是否更好。