3

我编写了一个 python 脚本来获取一个大文件(一个矩阵 ~50k 行 X ~500 cols)并将其用作数据集来训练随机森林模型。

我的脚本有两个功能,一个是加载数据集,另一个是使用所述数据训练随机森林模型。这些都可以正常工作,但是文件上传需要大约 45 秒,每次我想训练一个稍微不同的模型(在同一个数据集上测试许多模型)时,这样做很痛苦。这是文件上传代码:

def load_train_data(train_file):
    # Read in training file
    train_f = io.open(train_file)
    train_id_list = []
    train_val_list = []
    for line in train_f:
        list_line = line.strip().split("\t")
        if list_line[0] != "Domain":
            train_identifier = list_line[9]
            train_values = list_line[12:]
            train_id_list.append(train_identifier)
            train_val_float = [float(x) for x in train_values]
            train_val_list.append(train_val_float)
    train_f.close()
    train_val_array = np.asarray(train_val_list)

    return(train_id_list,train_val_array)

这将返回一个带有 col 的 numpy 数组。9 作为标签和列。12-end 作为元数据来训练随机森林。

我将使用相同的数据训练我的模型的许多不同形式,所以我只想上传一次文件并将其提供给我的随机森林函数。我希望文件成为我认为的对象(我对 python 相当陌生)。

4

4 回答 4

1

如果我理解正确,数据集不会改变,但模型参数会改变,并且您在每次运行后都会更改参数。

我会将文件加载脚本放在一个文件中,然后在 python 解释器中运行它。然后该文件将使用您使用的任何变量加载并保存在内存中。

然后,您可以使用模型代码导入另一个文件,并使用训练数据作为参数运行该文件。

如果您的所有模型更改都可以确定为函数调用中的参数,那么您只需导入模型,然后使用不同的参数设置调用训练函数。

如果您需要在运行之间更改模型代码,请使用新文件名保存并导入该文件,再次运行并将源数据发送到该文件。

如果您不想使用新文件名保存每个模型修改,您可以根据 python 版本使用重新加载功能,但不建议这样做(请参阅从控制台重新加载 python 模块的正确方法

于 2015-06-23T22:55:55.673 回答
0

最简单的方法是缓存结果,如下所示:

_train_data_cache = {}
def load_cached_train_data(train_file):
  if train_file not in _train_data_cache:
    _train_data_cache[train_file] = load_train_data(train_file)
  return _train_data_cache[train_file]
于 2015-06-23T22:47:32.790 回答
0

尝试了解 Python 数据序列化。您基本上将使用 python 的marshal函数将大文件存储为特定于 python 的序列化二进制对象。这将大大加快文件的 IO。请参阅这些基准以了解性能变化。但是,如果这些随机森林模型都同时进行了训练,那么您可以针对内存中已有的数据集对其进行训练,然后在完成后发布训练数据。

于 2015-06-23T22:51:44.447 回答
0

在 ipython 中加载您的数据。

my_data = open("data.txt")

在 python 脚本中编写代码,例如 example.py,它使用这些数据。在脚本 example.py 的顶部添加以下行:

import sys

args = sys.argv

data = args[1]
...

现在在 ipython 中运行 python 脚本:

%run example.py $mydata

现在,在运行您的 python 脚本时,您不需要多次加载数据。

于 2018-11-22T23:37:39.380 回答