You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:41:57