代码之家  ›  专栏  ›  技术社区  ›  ferdystschenko

准备培训数据的一般框架?[关闭]

  •  8
  • ferdystschenko  · 技术社区  · 15 年前

    作为一名计算语言学的学生,我经常做机器学习实验,在那里我必须准备来自各种不同资源的培训数据,如原始或注释文本语料库或句法树库。对于每一个新任务和每一个新的实验,我编写程序(通常在Python和Java中),以提取所需的特征和值,并将数据从一种格式转换为另一种格式。这通常会导致大量非常大的文件和大量处理这些文件的小程序,以便获得某些机器学习框架(如WEKA的ARFF文件)的输入。

    一个人必须非常有条理地处理这些问题,并且非常小心地编程,不要错过大量数据中的任何重要特性、异常或错误。许多优秀的软件设计原则,如设计模式或重构模式,对于这些任务来说并不是什么大用处,因为诸如安全性、可维护性或可持续性之类的东西并不重要——一旦程序成功地处理了数据,人们就不再需要它了。到目前为止,我甚至不再在我的Python代码和程序中以简单的过程方式使用类或函数。下一个实验将需要具有独特特性和不同格式的不同数据集,这样它们的准备工作就很可能需要从头开始编程。到目前为止,我的经验是,将80-90%的项目时间花在准备培训数据上并不罕见。数小时和数天只是在考虑如何从一种数据格式转换到另一种数据格式。有时,这会变得相当令人沮丧。

    好吧,你可能猜到我故意夸大了一点,但我肯定你明白我想说什么。实际上,我的问题是:

    是否有任何通用的框架、架构和最佳实践来处理这些任务?考虑到最佳设计,我所写的代码中有多少是可以重用的?

    2 回复  |  直到 13 年前
        1
  •  2
  •   Johan Benum Evensberget    15 年前

    我发现自己主要使用GNU coreutils和flex中的textuils来准备语料库,在简单的脚本中把事情链接在一起,至少当我需要做的准备对于正则表达式和琐碎的过滤等来说足够简单的时候。

    仍然可以使事物可重用,这里也适用一般规则。如果你的编程不考虑最佳实践等,只是程序化的编程,那么我毫不奇怪你在开始一个新项目时必须从头开始做所有的事情。

    尽管格式要求会有很大的变化,但仍然有许多常见的任务,例如标记剥离、标记转换、选择、制表、一些琐碎的数据收集,例如标记数、句子等。为高可重用性编程这些任务将获得回报,即使最初需要更长的时间。

        2
  •  1
  •   doug    15 年前

    我不知道任何这样的框架——并不意味着它们不存在。我更喜欢使用我自己的代码片段,这只是一组代码片段,随着时间的推移,我已经对它们进行了优化/调整/借用,并且我可以根据问题的不同,在不同的配置中链接在一起。如果您已经了解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 (imho),既清晰又完整,从原始数据收集到输入到ML算法(在本例中为MLP)的整个过程。他们还提供了他们的代码。