python sklearn 读取非常大的 svmlight 文件
Posted
技术标签:
【中文标题】python sklearn 读取非常大的 svmlight 文件【英文标题】:python sklearn read very big svmlight file 【发布时间】:2017-12-21 20:05:57 【问题描述】:我正在使用带有 svmlight 的 python 2.7 来存储和读取一个非常大的 svmlight 格式文件。
我正在使用
读取文件import sklearn
rows, labels = sklearn.datasets.load_svmlight_file(matrixPath, zero_based=True)
文件太大而无法存储在内存中。我正在寻找一种无需提前拆分文件即可批量迭代文件的方法。
目前我发现的最好方法是使用终端命令 split 拆分 svmlight 文件。然后读取我创建的部分文件。
我found 认为读取大文件的一个好方法是逐行分批读取,以免内存溢出。
如何使用 svmlight 格式的文件执行此操作?
谢谢!
【问题讨论】:
为了对批量数据进行任何有意义的操作,至少要从整个文件中进行一次传递以加载其中的特征总数。 @VivekKumar 没问题,我不能一次将所有矩阵都保存在内存中,迭代它无论如何都不是问题。 【参考方案1】:我遇到了同样的问题,这是我的解决方案:
使用 scikitlearn 中的 load_svmlight_file
函数,您可以指定 offset
和 length
参数。来自documentation:
偏移量:整数,可选,默认0
通过向前搜索忽略偏移量的第一个字节,然后丢弃后面的字节直到下一个换行符。长度:整数,可选,默认-1
如果严格肯定,一旦文件中的位置达到(偏移量 + 长度)字节阈值,就停止读取任何新的数据行。这是一个如何批量迭代 svmlight 文件的示例:
from sklearn.datasets import load_svmlight_file
def load_svmlight_batched(filepath, n_features, batch_size):
offset = 0
with open(filepath, 'rb') as f:
X, y = load_svmlight_file(f, n_features=n_features,
offset=offset, length=batch_size)
while X.shape[0]:
yield X, y
offset += batch_size
X, y = load_svmlight_file(f, n_features=n_features,
offset=offset, length=batch_size)
def main(filepath):
iterator = load_svmlight_batched(filepath,
n_features=2**14,
batch_size=10000)
for X_batch, y_batch in iterator:
# Do something
【讨论】:
以上是关于python sklearn 读取非常大的 svmlight 文件的主要内容,如果未能解决你的问题,请参考以下文章
机器学习SVM多分类问题及基于sklearn的Python代码实现