10

我正在尝试研究如何实现一些机器学习库,以帮助我找出每个参数的正确权重,以便做出正确的决定。

更详细地说:

上下文:尝试为 html 文件实现发布日期提取器。这是针对新闻网站的,所以我没有可以使用的通用日期格式。我在 python 中使用 dateutil 中的解析器,它做得很好。我最终得到了一个可能的发布日期列表(html 文件中的所有日期)。

从一组参数中,例如关闭标签、靠近日期子字符串的单词等。我根据发布日期的可能性对列表进行排序。每个参数的权重都是有根据的猜测。

我想实现一个机器学习算法,在训练(提供实际发布日期)之后,它确定每个参数的权重应该是多少。

我一直在阅读 python 中不同机器学习库的文档(pyML、scikit-learn、pybrain),但我没有发现任何有用的东西。我也读过这篇文章,有一个很接近的例子来确定蘑菇是否可以食用。

注意:我在 python 中工作。

非常感谢您的帮助。

4

2 回答 2

11

鉴于您的问题描述、yoru 数据的特征以及您的 ML 背景和个人偏好,我会推荐Orange

Orange 是一个成熟、免费和开源的项目,拥有大量的 ML 算法以及优秀的文档和培训材料。大多数用户可能使用 Orange 提供的 GUI,但该框架可以使用 Python 编写脚本。

因此,使用这个框架当然可以让您快速尝试各种分类器,因为(i)它们都在一个地方;( ii)每个都访问一个通用的配置语法 GUI。Orange 框架中的所有 ML 技术都可以在 Orange 安装提供的一个或多个示例数据集的“演示”模式下运行。Orange Install 中提供的文档非常好。此外,主页还包含许多教程的链接,这些教程可能涵盖了框架中包含的所有 ML 技术。

鉴于您的问题,也许从决策树算法(C4.5ID3实现)开始。Dobbs 博士期刊(在线)的最新版本包括一篇关于使用决策树的优秀文章;用例是 Web 服务器数据(来自服务器访问日志)。

Orange 有一个C4.5 实现,可从 GUI 获得(作为“小部件”)。如果这太容易了,那么在 python 中编写一个代码只需要大约 100 行代码。是该语言的工作实现的源代码

我建议从决策树开始有几个原因。

  1. 如果它适用于您的数据,您不仅将拥有一个经过训练的分类器,而且您还将拥有整个分类模式的可视化表示(表示为二叉树)。在这方面,决策树(可能)在 ML 技术中是独一无二的。

  2. 您的数据特征与 C4.5 的最佳性能场景一致;数据可以是分类变量或连续变量(尽管这种技术在更多特征(列/字段)离散而不是连续的情况下表现更好,这似乎描述了您的数据);决策树算法也可以接受,无需任何预处理,不完整的数据点

  3. 简单的数据预处理。馈送到决策树算法的数据不需要像大多数其他 ML 技术那样多的数据预处理;预处理通常(通常?)是整个 ML 工作流程中最耗时的任务。它的文档也很少,因此它可能也是最可能的错误来源。

  4. 您可以从每个节点与根的距离推断每个变量的(相对)权重 - 换句话说,通过对经过训练的分类器的快速视觉检查。回想一下,经过训练的分类器只是一棵二叉树(并且经常被渲染这种方式)其中节点对应于一个特征(变量或数据集中的列)的一个值;连接到该节点的两条边当然表示根据该特征的每个点的值分成两组的数据点(例如,如果该特征是分类变量“HTML 页头中的发布日期?”,然后通过左边缘将流动所有发布日期不在开始和结束头标签内的数据点,并且正确的节点获取另一组)。这有什么意义?由于节点仅代表特定变量的状态或值,因此该变量在对数据进行分类时的重要性(或权重)可以从其在树中的位置推断出来——即,它离根节点越近,越重要这是。


从您的问题来看,在您将训练数据提供给 ML 分类器之前,您似乎需要完成两项任务。

I. 识别合理的类别标签

您要预测的是日期。除非您的分辨率要求异常严格(例如,解决到单个日期),否则我将构建一个分类模型(返回给定数据点的类标签)而不是回归模型(返回单个连续值)。

鉴于您的响应变量是一个日期,一个简单的方法是将最早的日期设置为基线 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)    

二、将您的原始数据转换为“ML 可用”的形式。

对于 C4.5 分类器,与其他所有 ML 算法相比,此任务要简单得多,所需步骤也更少。这里首选的是离散化为相对较少数量的值,尽可能多的参数 - 例如,如果您的参数/变量之一是“发布日期字符串与结束正文标签的距离”,那么我会建议将这些值离散化为范围,因为营销调查通常要求参与者在一组指定的跨度(18 - 35;36 - 50 等)中报告他们的年龄,而不是作为单个整数 (41)。

于 2011-07-05T20:39:05.557 回答
2

假设您需要机器学习(文档集足够大,新闻站点的数量足够大以至于在每个站点上编写解析器很笨拙,URL 不包含任何明显的发布日期标记,HTTP Last-Modified 标头不可靠,等) - 你可以考虑这样的方法:

  • 使用决策树、贝叶斯学习或其他任何方法将您的文本特征转换为“我认为这个日期是给定出版日期的概率是多少......”排序的特征;
  • 使用 maxent 学习来计算权重(例如,http ://www-i6.informatik.rwth-aachen.de/web/Software/YASMET.html很有用。)
于 2011-07-05T21:26:36.577 回答