鉴于您的问题描述、yoru 数据的特点以及您的机器学习背景和个人喜好,我推荐Orange。
Orange 是一个成熟的免费开源项目,拥有大量的 ML 算法以及优秀的文档和培训材料。大多数用户可能使用 Orange 提供的 GUI,但该框架可以使用 Python 编写脚本。
因此,使用这个框架当然可以让您快速试验各种分类器,因为(i)它们都在一个地方; (ii) 每个都可以访问一个通用的配置语法 GUI。 Orange 框架中的所有 ML 技术都可以在“演示”模式下运行
随 Orange 安装提供的一个或多个示例数据集。提供的文件
在橙色安装中非常出色。此外,主页还包含许多链接
可能涵盖框架中包含的所有 ML 技术的教程。
鉴于您的问题,也许从 决策树 算法(C4.5 或 ID3 实现)开始。 Dobbs 博士期刊(在线)的最新版本包括一篇关于使用决策树的优秀文章;用例是 Web 服务器数据(来自服务器访问日志)。
Orange 有一个C4.5 implementation,可从 GUI 获得(作为“小部件”)。如果这太容易了,那么在 python 中编写一个代码只需要大约 100 行代码。 Here 是该语言的工作实现的来源
出于几个原因,我建议从决策树开始。
如果它适用于您的数据,您将
不仅有训练有素的分类器,
但你也会有一个视觉
代表整体
分类架构(表示
作为二叉树)。在这方面,决策树(可能)在 ML 技术中是独一无二的。
数据的特征是
与最佳性能一致
C4.5的场景;数据可以是
分类的或连续的
变量(虽然这种技术
如果更多则表现更好
特征(列/字段)离散
而不是连续的,这似乎
描述您的数据);还
决策树算法可以接受,
无需任何预处理,
数据点不完整
简单的数据预处理。 馈送到决策树的数据
算法不需要那么多
与大多数其他 ML 一样进行数据预处理
技术;预处理通常是
(通常?)最耗时的
整个 ML 工作流程中的任务。它是
也很少记录,所以它是
可能也是最可能的来源
错误。
您可以从每个节点到根的距离推导出每个变量的(相对)权重——换句话说,从快速的视觉
受过训练的检查
分类器。回想一下经过训练的分类器
只是一棵二叉树(通常是rendered 这种方式),其中的节点
对应一值一
特征(变量或列中的
数据集);两条边连接到
该节点当然代表
数据点分为两组
基于每个点的值
特征(例如,如果特征是
分类变量“出版物
HTML 页头中的日期?”,然后
通过左边缘将全部流动
数据点,其中
发布日期不在
打开和关闭头部标签,以及
正确的节点得到另一个
团体)。有什么意义
这?由于一个节点只代表
特定的状态或值
变量,那个变量的
重要性(或权重)
可以推导出对数据进行分类
从它在
树——也就是离树越近
根节点,越重要。
从您的问题来看,您似乎需要完成两项任务才能将训练数据提供给 ML 分类器。
我。识别合理的类别标签
您要预测的是日期。除非您的分辨率要求异常严格(例如,解决到单个日期),否则我将构建一个分类模型(返回给定数据点的类标签)而不是回归模型(返回单个连续值)。
鉴于您的响应变量是一个日期,一个直接的方法是将最早的日期设置为基线 0,然后将所有其他日期表示为一个整数值,表示与该基线的距离。接下来,将所有日期离散化为少量范围。一种非常简单的方法是计算响应变量的五个汇总描述性统计数据(最小值、第 1 个四分位数、平均值、第 3 个四分位数和最大值)。从这五个统计数据中,您可以得到四个明智选择的日期范围(尽管可能跨度不相等或成员规模不相等。
这四个日期值范围代表您的类别标签——例如,classI 可能是响应变量(发布日期)为 0 后 0 到 10 天的所有数据点(我想是网页); classII 是 0 后 11 天到 0 后 25 天等。
[注意:根据 OP 在此答案下方的评论添加了以下代码,要求澄清。]
# suppose these are publication dates
>>> pd0 = "04-09-2011"
>>> pd1 = "17-05-2010"
# convert them to python datetime instances, e.g.,
>>> pd0 = datetime.strptime(pd0, "%d-%m-%Y")
# gather them in a python list and then call sort on that list:
>>> pd_all = [pd0, pd1, pd2, pd3, ...]
>>> pd_all.sort()
# 'sort' will perform an in-place sort on the list of datetime objects,
# such that the eariest date is at index 0, etc.
# now the first item in that list is of course the earliest publication date
>>> pd_all[0]
datetime.datetime(2010, 5, 17, 0, 0)
# express all dates except the earliest one as the absolute differenece in days
# from that earliest date
>>> td0 = pd_all[1] - pd_all[0] # t0 is a timedelta object
>>> td0
datetime.timedelta(475)
# convert the time deltas to integers:
>>> fnx = lambda v : int(str(v).split()[0])
>>> time_deltas = [td0,....]
# d is jsut a python list of integers representing number of days from a common baseline date
>>> d = map(fnx, time_deltas)
二。将您的原始数据转换为“机器学习可用”的形式。
对于 C4.5 分类器,此任务是
比可能所有其他 ML 算法更简单,所需步骤更少。什么是
这里首选的是离散化到相对较少的值,
尽可能多的参数 - 例如,如果您的参数/变量之一是
“发布日期字符串与结束正文标签的距离”,那么我会
建议将这些值离散化为范围,正如营销调查经常询问的那样
参与者在指定的一组跨度(18 - 35;36 - 50 等)中报告他们的年龄
而不是单个整数 (41)。