如何使用Python库读取稀疏ARFF数据?LIAC-ARFF报错求助
解决稀疏ARFF(如delicious.arff)读取报错的问题
我之前也碰到过LIAC-ARFF处理多标签稀疏ARFF的坑,尤其是delicious这种经典数据集,它报错ValueError: {60 1 value not in ('0', '1')的原因很明确:LIAC-ARFF默认把属性当成二分类的0/1值,但稀疏ARFF里的{60 1,248 1,...}是索引-值对的格式,它错误地把60 1当成了单个属性值来校验,自然就不通过了。
给你几个靠谱的解决办法:
方法1:手动解析稀疏ARFF格式
既然LIAC-ARFF搞不定,我们可以自己写代码处理,逻辑也不复杂:先读取ARFF的元数据(关系名、属性),再逐行解析稀疏数据段。示例代码如下:
def load_sparse_arff(file_path): attributes = [] data = [] in_data_section = False with open(file_path, 'r') as f: for line in f: line = line.strip() # 跳过空行和注释 if not line or line.startswith('%'): continue # 读取属性信息 if line.startswith('@attribute'): parts = line.split() attr_name = parts[1] attributes.append(attr_name) # 进入数据段 elif line.startswith('@data'): in_data_section = True # 处理数据行 elif in_data_section: # 提取大括号内的内容 sparse_part = line.strip('{}') if not sparse_part: # 全0的稀疏行 data.append({}) continue # 分割成索引-值对 pairs = sparse_part.split(',') sample = {} for pair in pairs: idx, val = pair.strip().split() sample[int(idx)] = float(val) data.append(sample) return attributes, data # 使用示例 attrs, sparse_data = load_sparse_arff('delicious.arff')
这个方法能精准控制解析逻辑,适合需要保留稀疏结构的场景。
方法2:用scikit-learn直接获取数据集
delicious数据集已经收录在OpenML里,scikit-learn的fetch_openml可以直接加载处理好的数据,完全不用管ARFF的格式问题:
from sklearn.datasets import fetch_openml # 加载delicious数据集,version=1对应原始版本 dataset = fetch_openml(name='delicious', version=1) X = dataset.data # 特征矩阵(稀疏格式) y = dataset.target # 多标签标签矩阵
这个方法最省心,scikit-learn已经帮你处理好了稀疏数据的解析和存储。
方法3:借助WEKA的Python接口
WEKA对ARFF格式(包括稀疏多标签)的支持非常完善,毕竟MULAN的数据集本来就和WEKA生态兼容。可以用python-weka-wrapper3库来加载:
首先安装库:
pip install python-weka-wrapper3
然后加载数据:
from weka.core.converters import Loader # 初始化ARFF加载器 loader = Loader(classname="weka.core.converters.ArffLoader") # 加载文件 data = loader.load_file("delicious.arff") # 可以获取特征和标签的信息 print(f"属性数量:{data.num_attributes}") print(f"样本数量:{data.num_instances}")
如果需要把WEKA的实例转换成Python常用的格式,还可以用库提供的工具函数进行转换。
内容的提问来源于stack exchange,提问作者Sanket Agarwal
相关产品推荐
相关产品推荐

