如何在Python中使用机器学习根据给定地理数据进行预测?

7 投票
1 回答
9766 浏览
提问于 2025-04-17 13:55

我在分析一些地理数据,试图预测事件在时间和地理位置上的下次发生。数据的排列顺序如下(附上样本数据)

Timestamp Latitude     Longitude   Event 
13307266  102.86400972 70.64039541 "Event A"
13311695  102.8082912  70.47394645 "Event A"
13314940  102.82240522 70.6308513  "Event A"
13318949  102.83402128 70.64103035 "Event A"
13334397  102.84726242 70.66790352 "Event A"

第一步是把数据分成100个区域,这样可以减少数据的维度和复杂性。

 
Timestamp Zone 
13307266  47
13311695  65
13314940  51
13318949  46
13334397  26

接下来的步骤是进行时间序列分析,但我在这方面卡了两个月,读了很多相关资料,最终发现我有以下几种选择: * ARIMA(自回归模型) * 机器学习

我想用机器学习来进行预测,使用Python,但不知道该怎么做。具体来说,有没有适合我这个情况的Python库或开源代码可以使用呢?

编辑 1: 为了澄清一下,数据与过去的数据有一定的依赖关系,但随着时间的推移是均匀分布的。 最好的数据可视化方式是想象有N个代理(agent),由一个算法控制,负责从网格中获取资源。资源的获取与社会的经济结构有关,也与地理位置密切相关。这个算法的目标是能够预测需求的区域和时间。

附注: 对于像ARIMA这样的自回归模型,Python已经有一个库可以使用,链接是http://pypi.python.org/pypi/statsmodels

1 个回答

18

没有示例数据或现有代码,我无法给你提供具体的帮助。

不过,通常把你的问题用你想研究的领域的术语重新表述一下是很有帮助的。在机器学习(ML)的术语中:

  • 你的问题的特征:就是你的输入是怎么定义的。时间戳是连续的,地理区域是离散的。
  • 你的问题的目标标签:一个事件,具体来说就是某个事件是否发生。
  • 你的问题是监督学习:之前的数据有目标标签。你有之前的(时间戳,地理区域)和事件的对应关系。
  • 目标标签是离散的,所以这是一个分类问题(与回归问题不同,回归问题的输出是连续的)。

所以我认为你有一个监督分类问题。顺便提一下,你可能想先做一些时间上的规范化;我猜事件的发生会根据一天中的时间、一个月中的天数或一年中的月份有不同的模式,你可能想把这些作为额外的特征来表示。

看看一个流行的Python机器学习库,scikit-learn,这里有相关信息:

http://scikit-learn.org/stable/supervised_learning.html

还有一篇关于scikit-learn的速查表的最新帖子,来自一位贡献者:

http://peekaboo-vision.blogspot.de/2013/01/machine-learning-cheat-sheet-for-scikit.html

你可以先尝试一下支持向量机(SVM),如果不行的话,可以试试k近邻(kNN)。注意,使用集成分类器通常比单独使用一个SVM或kNN要好。

具体如何将时间作为特征应用于SVM/kNN可能需要更多的研究,因为据我所知(其他人可能会纠正我),SVM/kNN需要输入数据有界且均值为零(或者经过标准化使均值为零)。你可以随便在网上搜索一下,可能会找到一些SVM核,比如傅里叶核,可以帮你转换时间序列特征:

SVM核用于时间序列分析
http://www.stefan-rueping.de/publications/rueping-2001-a.pdf

scikit-learn方便地允许你为SVM指定自定义核。见:
http://scikit-learn.org/stable/auto_examples/svm/plot_custom_kernel.html#example-svm-plot-custom-kernel-py

掌握了机器学习的术语,并且手头有示例数据后,你可能想考虑把问题发布到Cross Validated,这是一个统计学的问答网站。

编辑 1:再考虑这个问题,你需要真正理解你的特征和对应的标签是否是独立同分布(IID)的。例如,如果你在建模森林火灾如何随时间传播,很明显某个区域着火的可能性与它周围的区域是否着火有关。据我所知,SVM和kNN假设数据是IID。在这一点上,我开始有点超出我的理解范围,但我认为你至少应该尝试几种机器学习方法,看看结果如何!记得进行交叉验证!(scikit-learn会为你处理这个)。

撰写回答