【问题标题】:Machine learning for weighting adjustment用于权重调整的机器学习
【发布时间】:2011-09-28 23:14:11
【问题描述】:

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

更详细的:

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

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

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

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

注意:我正在使用 python。

非常感谢您的帮助。

【问题讨论】:

  • 幻灯片 #10 概述了一种算法。这是您需要帮助来实施的吗?
  • 我需要帮助来完成这项任务。通过使用 PyML 或任何其他机器学习库。现在,我对它的工作原理不太感兴趣。
  • 好吧,你有参数,你可以加权。但是你有足够的标记数据,以便你可以做一个训练和一个测试集吗?
  • 如果标签是指具有正确发布日期的 html,而不是现在。当我有一些代码工作时,我正在考虑外包。

标签: python machine-learning weighting


【解决方案1】:

鉴于您的问题描述、yoru 数据的特点以及您的机器学习背景和个人喜好,我推荐Orange

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

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

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

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

出于几个原因,我建议从决策树开始。

  1. 如果它适用于您的数据,您将 不仅有训练有素的分类器, 但你也会有一个视觉 代表整体 分类架构(表示 作为二叉树)。在这方面,决策树(可能)在 ML 技术中是独一无二的。

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

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

  4. 您可以从每个节点到根的距离推导出每个变量的(相对)权重——换句话说,从快速的视觉 受过训练的检查 分类器。回想一下经过训练的分类器 只是一棵二叉树(通常是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)。

【讨论】:

  • 我无法表达我的感激之情,因为您真的在做出回应。我需要一些时间才能理解你所写的一切,但再次感谢。我在发布我的问题后发现了 Orange,这就是我想到的: 1.准备一个数据集,其属性是我想要权重的参数(作为布尔值)。 2.类(我不确定这是正确的词)是日期是否是publication_date。 3.训练它。 4.按每个“publication_date”的概率对HTML文件中可能的发布日期列表进行排序。这听起来合理吗?
  • "然后将所有其他日期表示为一个整数值,表示距该基线的距离" 整数是多少?我并没有真正关注这部分。我明天再读一遍,研究一下。在欧洲已经很晚了。
  • 很高兴您发现我的回答很有帮助(如果这是您喜欢的答案,请将其标记为“已接受的答案”)。我已经用 python 代码补充了我在“我。识别....”下的回复,所以你可以忽略我那令人困惑的句子。
【解决方案2】:

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

【讨论】:

  • 如果我真的不需要权重,但要找出 HTML 中的哪个日期最有可能是发布日期(我猜,权重参数只是一种方法),我会采用这种方法吗?在我对先前回复的评论中描述的可以吗? (按照每个日期为发表日期的概率排序)。
  • 这是一个排名问题。你所说的“概率”实际上是一个评分函数;对于每个日期,您要分配一个“发布日期”分数,您可能(或可能不)想将其视为日期实际上是发布日期的概率(根据某些模型)。一旦您以准确且有意义的方式分配该分数,那么是的 - 按“出版日期”的降序对这些进行排序就是您想要的。计算这个分数是困难的部分;)
猜你喜欢
  • 2014-08-27
  • 2012-05-26
  • 2023-01-07
  • 2016-01-17
  • 2019-07-14
  • 2018-03-18
  • 2022-10-18
  • 2017-01-14
  • 2017-04-20
相关资源
最近更新 更多