准备培训数据的一般框架?

时间:2010-01-14 17:11:03

标签: machine-learning nlp code-reuse training-data

作为计算语言学的学生,我经常进行机器学习实验,我必须准备来自各种不同资源的训练数据,如原始或注释文本语料库或句法树库。对于每个新任务和每个新实验,我编写程序(通常使用Python,有时是Java)来提取我需要的功能和值,并将数据从一种格式转换为另一种格式。这通常导致非常大量的非常大的文件和大量的小程序处理它们以获得某些机器学习框架的输入(如Weka的arff文件)。

人们需要非常有条理地处理这个问题,并非常谨慎地编制程序,不要错过大量数据中的任何重要特性,例外或错误。良好的软件设计原则,如设计模式或重构范例,对于这些任务来说并不是很重要,因为安全性,可维护性或可持续性等问题并不重要 - 一旦程序成功处理了数据,就不再需要它了。到目前为止,我甚至已经停止了在Python代码和程序中使用类或函数的简单程序方式。下一个实验将需要具有独特特征和不同格式的不同数据集,以便无论如何都可能必须从头开始编程。到目前为止,我的经验是,将80-90%的项目时间用于准备培训数据的任务并不罕见。小时和日子只考虑如何从一种数据格式到另一种数据格式。有时,这可能会非常令人沮丧。

好吧,你可能已经猜到我有点夸张了,但是我很肯定你理解我想说的话。实际上,我的问题是:

是否有任何通用框架,架构,最佳实践来处理这些任务?在优化设计的情况下,我编写的代码有多少可以重复使用?

2 个答案:

答案 0 :(得分:2)

我发现自己大多使用GNU coreutils中的textutils和flex进行语料库准备,用简单的脚本将事物链接在一起,至少在我需要做的准备工作对于正则表达式和琐碎的过滤等都很简单时。

仍然可以重复使用,一般规则也适用于此处。如果您的编程不考虑最佳实践等,并且只是程序化编程,那么恕我直言,真的难怪您在开始新项目时必须从头开始做所有事情。

即使格式要求变化很大,仍然有许多常见任务,即。标签剥离,标签翻译,选择,制表,一些简单的数据收集,例如令牌数量,句子等。将这些任务编程以获得高可重用性将获得回报,即使它最初需要更长时间。

答案 1 :(得分:1)

我不知道任何这样的框架 - 并不意味着他们不在那里。我更喜欢使用我自己的,这只是我随着时间的推移而改进/调整/借用的代码片段的集合,并且我可以根据问题以各种配置链接在一起。如果您已经了解python,那么我强烈建议您在NumPy中处理所有数据准备 - 如您所知,ML数据集往往很大 - 数千个行向量包含浮点数。 NumPy在这方面非常出色。另外,我可能会建议,为准备ML的训练数据,几乎每一个这样的努力都会产生一些任务,并且从一个问题到下一个问题不会发生很大变化。我已经为你提供了以下这些内容的片段。

规范化(缩放和平均中心数据以避免超重。我相信你知道,你可以将-1缩放到1或0到1.我通常选择后者所以我可以利用稀疏模式。在python中,使用NumPy库:

import numpy as NP
data = NP.linspace( 1, 12, 12).reshape(4, 3)
data_norm = NP.apply_along_axis( lambda x : (x - float(x.min())) / x.max(), 
                                             0, data )

交叉验证(这里我将默认参数设置为'5',因此测试集为5%,训练集为95% - 将此函数设置为k-fold更简单)

def divide_data(data, testset_size=5) :
  max_ndx_val = data.shape[0] -1
  ndx2 = NP.random.random_integers(0, max_ndx_val, testset_size)
  TE = data_rows[ndx2]
  TR = NP.delete(data, ndx2, axis=0)
  return TR, TE

最后,这是一个优秀的case study(恕我直言),既清晰又完整,从字面上显示从原始数据收集到输入到ML算法(本例中为MLP)的整个过程。他们还提供他们的代码。