libsvm 数据格式

机器算法验证 机器学习 支持向量机 Python libsvm C++
2022-02-09 00:58:40

我正在使用 libsvm ( http://www.csie.ntu.edu.tw/~cjlin/libsvm/ ) 工具进行支持向量分类。但是,我对输入数据的格式感到困惑。

从自述文件:

训练和测试数据文件格式为:

<label> <index1>:<value1> <index2>:<value2> ...
.
.
.

每行包含一个实例,并以“\n”字符结尾。对于分类,<label>是一个表示类标签的整数(支持多类)。对于回归,<label>是可以是任何实数的目标值。对于一类 SVM,它没有被使用,所以可以是任何数字。该对<index>:<value>给出一个特征(属性)值:<index>是一个从 1 开始的整数,<value> 是一个实数。唯一的例外是预计算内核, <index>从 0 开始;请参阅预计算内核部分。指数必须按升序排列。测试文件中的标签仅用于计算准确性或错误。如果它们未知,只需在第一列中填写任意数字即可。

我有以下问题:

  1. 有什么用<index>它的用途是什么?
  2. 不同数据实例的相同索引值之间是否存在对应关系?
  3. 如果我错过/跳过两者之间的索引怎么办?

我问是因为 libsvm 包中包含的数据文件 *heart_scale* 在第 12 行,索引从 2 开始。<value>索引 1 是否被视为未知/缺失?注意:随包提供的 tools/checkdata.py 工具表明 *heart_scale* 文件是正确的。

2个回答

这个链接应该有帮助: http ://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#/Q3:_Data_preparation

提到数据以稀疏数组/矩阵形式存储。本质上,这意味着只存储非零数据,任何丢失的数据都被视为保持值零。对于您的问题:

a) 索引仅用作区分特征/参数的一种方式。就超空间而言,它只是指定每个组件:例如:3-D(3 个特征)索引 1,2,3 将对应于 x,y,z 坐标。

b) 对应只是数学上的,在构建超平面时,这些作为坐标。

c) 如果您在两者之间跳过一个,则应为其分配一个默认值零。

简而言之,+1 1:0.7 2:1 3:1 转换为:

分配给 +1 类,点 (0.7,1,1)。

只是小而快速的指南:

LibSVM 格式意味着您的文档需要进行预处理。您需要知道将使用多少个分类类别(很可能是 2 个)和特征空间。

分类类类似于真/假;0,1,... 这里你需要把它转换成整数(例如0,1)。

特征空间是多维数据的空间。每个特征(向量)都应该有自己的 ID(索引)和它的值。例如 1:23.2 表示特征/维度 1 的值为 23.2

<label> <index1>:<value1> <index2>:<value2> ... <indexN>:<valueN>
...