通过机器学习寻找日常模式
Posted
技术标签:
【中文标题】通过机器学习寻找日常模式【英文标题】:Finding daily patterns with machine learning 【发布时间】:2013-04-03 16:00:33 【问题描述】:我以 [时间戳,位置] 的格式创建了大量的日常活动日志。例如
[1365650747255, 'san francisco',
1365650743354, 'san francisco',
1365650741349, 'san mateo',
1365650756324, 'mountain view',
...
1365650813354, 'menlo park']
我可以通过哪些方式挖掘这些信息以找到类似的模式
“周日晚上,我可能在旧金山附近” “周一下午我可能在门洛帕克附近”问题是
数据集非常庞大。 似乎无法通过对时间戳值应用函数来判断日期/时间/日期(除非我们将时间戳解码为日期时间值)。【问题讨论】:
时间戳的来源是什么?它需要解释它 @e4e5f4 你能详细说明一下吗?为简单起见,让我们假设,它们是我的foursquare/facebook签到的时间戳。或者我的带有位置的推文。 是的,但是参考是什么?滴答计数是从什么时候开始的?起源是什么? @e4e5f4 它是 unix 时间戳(毫秒精度) @Codevalley 你所说的巨大是什么意思?多大?多少行/列?为什么不能只创建转换后的日期,将时间戳四舍五入到所需的时间窗口(例如 4 小时)并将其存储为日期时间? 【参考方案1】:我在这里看不到您的问题。由于它是从纪元开始计算秒数的时间戳,因此您只需应用模运算符,其值为感兴趣的范围。如果你训练一个分类器,你应该能够预测每个即将到来的地方。主要问题不是性能,因为学习只是偶尔进行,而是如何更新学习的数据集。 如前所述,您不必为此使用机器学习,但是如果您想使用机器学习来完成,这基本上可以使用一维数据集上的 k-最近邻来完成。
[编辑]: 混合语言但修复它:分类器是进行统计分类的算法。
在机器学习和统计中,分类是根据包含观察(或实例)的训练数据集来识别新观察属于一组类别(子群体)中的哪一个的问题其类别成员是已知的。[1]
由于我只使用 sklearn 来执行此类操作,因此以下是如何使用 k-最近邻分类器 [2] 的简约示例。为了能够进行分类,您必须将字符串更改为数字,然后在给定的测试数据集上训练您的分类器,然后您就能够预测新给定时间戳的位置。
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
data = [[1365650747255, 'san francisco'],
[1365650743354, 'san francisco'],
[1365650741349, 'san mateo'],
[1365650756324, 'mountain view'],
...
[1365650813354, 'menlo park']]
# Map location strings to integers and replace
location_mapping =
location_index = 0
for index, (time, location) in enumerate(data):
if(not location_mapping.has_key(location)):
location_mapping[location] = location_index
location_index += 1
data[index][1] = location_mapping[location]
inverse_location_mapping = value:key for key, value in location_mapping.items()
data = np.array(data)
week = 60 * 60 * 24 * 7
# Setup classifier
classifier = KNeighborsClassifier(n_neighbors=10)
# Train classifier on given data
classifier.fit(data[:, 0] % week, data[:, 1])
# Predict desired location
prediction = classifier.predict([[1365444444444 % week]]))
print(inverse_location_mapping[prediction])
[1] : http://en.wikipedia.org/wiki/Statistical_classification
[2]:http://scikit-learn.org/dev/modules/generated/sklearn.neighbors.KNeighborsClassifier.html
【讨论】:
你能详细说明一下吗。什么是分类器? @Codevalley 你需要做的阅读比我们在 *** 上提供的要多得多。试试en.wikipedia.org/wiki/Statistical_classification【参考方案2】:此解决方案的性能取决于您对模式识别的要求有多精细。
假设您的要求是将一天分为 4 个部分:
Morning,Noon,Evening,Night
,我们叫他们time_slots
现在让我们看看你的每日活动日志有多大,1 年、2 年、3 年?
假设它是 1 年。
所以我们总共需要监控 365 * 4 = 1460 个时隙。
现在,根据每个time_slot
的时间戳创建一个简单的地图。
例如。它从 T1 开始,在 T2 结束(其中 T1 和 T2 是时间戳,例如 1365650813354 )。
根据您日志中的时间戳值,很容易找到它的time_slot
,即 1 月 28 日晚上,或者
1 月 30 日上午。
您必须将time_slot
vs place_i_was 数据存储在具有适当架构的任何合适数据库中。
这取决于您想要的查询和分析类型。
这样您就不需要在数据集上运行公式,并且预定义的地图/数据库查找将满足您的目的。
【讨论】:
问题是 1)我不控制数据集(我以上述格式获取),每次处理它们时我都很难将它们映射到 1460 个区域。更糟糕的是,我有 1000 个用户和每个用户 1 年的数据。那么,这根本不会扩展。此外,我将不得不为 day_of_the_week 制作额外的时段。如果我的粒度是每小时一次(而不是每天四次),那么就会有 8760 个。 找槽是一个快速的操作,只是一个基于所需粒度的模运算。【参考方案3】:不确定这些问题需要机器学习,您可以使用常规统计数据。 IE。建立一个概率分布图,x
- 一天中的时间,y
- 概率是旧金山。如果时间在a
和b
之间,计算旧金山的概率...
这是在 pandas DataFrame 中加载数据的方法:
from __future__ import print_function, division
import pandas as pd
import datetime
df = pd.read_csv("data.csv",
names=["timestamp","location"],
parse_dates=["timestamp"],
date_parser=lambda x:datetime.datetime.fromtimestamp(int(x) / 1000))
print(df.head())
输出:
timestamp location
0 2013-04-11 04:25:47.255000 "san francisco"
1 2013-04-11 04:25:43.354000 "san francisco"
2 2013-04-11 04:25:41.349000 "san mateo"
3 2013-04-11 04:25:56.324000 "mountain view"
4 2013-04-11 04:26:53.354000 "menlo park"
【讨论】:
你建议我们如何从跨越 1000 条记录的时间戳中识别“一天中的时间”? 您的时间戳可能是 UTC 中自 Unix 纪元以来的秒数。您可以轻松地将其分解为组件。查找gmtime()
函数。如今,1000 条记录是微不足道的。
我在这里说的是数千条记录。因此,每次我在这里尝试某些东西时,都必须调用数千次预处理调用 datetime.fromtimestamp。
应该相当快,除非您使用的是 Intel 386 CPU 或类似的东西。没有什么可以替代真正的尝试和基准测试......【参考方案4】:
将时间戳转换为标记:“星期天早上”。
然后做关联规则挖掘,得到规则如
night => home
sunday morning => running in the park
您只保留这些规则的地方,所需的位置出现在右侧。
【讨论】:
对我来说整个问题是第一部分。将“时间戳转换为令牌”。我怎样才能有效地做到这一点? 解析日期时间并输出为所需的标记。if weekday in [ "saturday", "sunday"]: print "weekend"
【参考方案5】:
首先,将时间戳值转换为年-月-工作日。将时间戳列替换为年、月、日对应的 3 列。
稍后您可以简单地按日期值的特定范围进行分组,并计算每个位置的实例数。
【讨论】:
以上是关于通过机器学习寻找日常模式的主要内容,如果未能解决你的问题,请参考以下文章