dud*_*ud5 10 python machine-learning weighting
我正在尝试研究如何实现一些机器学习库,以帮助我找出每个参数的正确权重,以便做出正确的决定.
更详细:
上下文:尝试为html文件实现发布提取器的日期.这是针对新闻网站的,所以我没有可以使用的通用日期格式.我在python中的dateutil中使用解析器,这做得非常好.我最终得到了一个可能的发布日期列表(html文件中的所有日期).
从一组参数,例如关闭标签,接近日期子字符串的单词等.我根据作为发布日期的可能性对列表进行排序.每个参数的权重都以某种方式进行了有根据的猜测.
我想实现一种机器学习算法,在训练期(提供实际发布日期)之后,它确定每个参数的权重应该是多少.
我一直在阅读python(pyML,scikit-learn,pybrain)中不同机器学习库的文档,但我没有找到任何有用的东西.我也读过这个,并且有一个很好的例子来确定蘑菇是否可以食用.
注意:我在python中工作.
我非常感谢你的帮助.
dou*_*oug 11
鉴于您的问题描述,yoru数据的特征,以及您的ML背景和个人偏好,我会推荐Orange.
Orange是一个成熟的,免费的开源项目,拥有大量的ML算法和优秀的文档和培训材料.大多数用户可能使用Orange提供的GUI,但该框架可以使用Python编写脚本.
因此,使用这个框架,当然可以让你快速地试验各种分类器,因为(i)它们都在一个地方; 和(ⅱ)每一个被存取的公共配置语法GUI.Orange框架中的所有ML技术都可以在"演示"模式下运行,随橙色安装提供一个或多个样本数据集.Orange Install中提供的文档非常好.此外,主页包含许多教程的链接,这些教程可能涵盖了框架中包含的每种ML技术.
鉴于您的问题,可能从决策树算法(C4.5或ID3实现)开始.最近一期的Dr. Dobbs Journal(在线)包括一篇关于使用决策树的优秀文章; 用例是Web服务器数据(来自服务器访问日志).
Orange有一个C4.5实现,可从GUI(作为"小部件")获得.如果这太容易了,那么在python中编写一行就需要大约100行.以下是该语言的工作实现的来源
我建议从决策树开始,原因有几个.
如果它适用于您的数据,您不仅会有一个训练有素的分类器,而且您还可以直观地表示整个分类模式(表示为二叉树).在这方面,决策树(可能)在ML技术中是唯一的.
该数据的特性与C4.5性能最优的方案一致; 数据可以是分类变量或连续变量(尽管如果更多的特征(列/字段)是离散的而不是连续的,这种技术可以表现更好,这似乎描述了你的数据); 决策树算法也可以在不进行任何预处理的情况下接受不完整的数据点
简单的数据预处理.馈送到决策树算法的数据不需要像大多数其他ML技术那样多的数据预处理; 预处理通常(通常是?)是整个ML工作流程中最耗时的任务.它也很少记录,所以它可能也是最可能的错误来源.
您可以从每个节点与根的距离推导出每个变量的(相对)权重 - 换句话说,来自对训练分类器的快速目视检查.回想一下,训练有素的分类器只是一个二叉树(通常以这种方式呈现),其中节点对应于一个特征的一个值(数据集中的变量或列); 当然,连接到该节点的两条边表示基于该特征的每个点的值分成两组的数据点(例如,如果该特征是分类变量"HTML页头中的发布日期?",则通过左边缘将流出所有数据点,其中发布日期不在开始和结束头标记内,右边节点获取另一个组).这有什么意义?由于节点只表示特定变量的状态或值,因此该变量在分类数据时的重要性(或权重)可以从其在树中的位置推导出来 - 也就是说,它越接近根节点,就越重要它是.
从您的问题中,您可以在将训练数据提供给ML分类器之前完成两项任务.
I.识别合理的类标签
你想要预测的是约会.除非您的解析要求非常严格(例如,解析为单个日期),否则我将建立一个分类模型(返回给定数据点的类标签)而不是回归模型(返回单个连续值).
假设您的响应变量是日期,则直接的方法是将最早的日期设置为基线0,然后将所有其他日期表示为表示距该基线的距离的整数值.接下来,将所有日期离散化为少量范围.这样做的一个非常简单的技术是计算响应变量的五个摘要描述性统计(最小值,第一个四分位数,平均值,第三个四分位数和最大值).从这五个统计数据中,您可以得到四个合理选择的日期范围(尽管可能不是相等的跨度或相等的成员资格大小.
然后,这四个日期值范围代表您的类标签 - 例如,classI可能是所有数据点(网页,我猜),其响应变量(发布日期)在0之后0到10天; classII是0后0到25天后11天等等.
[注意:根据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)
Run Code Online (Sandbox Code Playgroud)
II.将原始数据转换为"ML可用"表单.
对于C4.5分类器,此任务更简单,并且需要比可能每隔其他ML算法更少的步骤.这里首选的是离散到相对较少数量的值,尽可能多的参数 - 例如,如果你的一个参数/变量是"发布日期字符串与结束体标记的距离",那么我会建议将这些值离散化为范围,因为营销调查经常要求参与者以指定的一组跨度(18-35; 36-50等)报告其年龄,而不是单个整数(41).