我想将python中的Pandas数据框转换为LIBFM格式的稀疏矩阵txt文件。

这里的格式需要看起来像这样:

4   0:1.5   3:-7.9
2   1:1e-5  3:2
-1  6:1


该文件包含三种情况。第一列说明了三种情况中的每一种的目标:即,第一种情况为4,第二种情况为2,第三种情况为-1。在目标之后,每一行包含x的非零元素,其中0:1.5之类的项读取x0 = 1.5,而3:-7.9则表示x3 = −7.9,依此类推。这意味着INDEX:VALUE的左侧表示x内的索引,而右侧表示x的值。

该示例中的数据总共描述了以下设计矩阵X和目标向量y:

   1.5  0.0   0.0  −7.9  0.0  0.0  0.0
X: 0.0  10−5  0.0  2.0   0.0  0.0  0.0
   0.0  0.0   0.0  0.0   0.0  0.0  1.0

   4
Y: 2
  −1


第2章Manual file中也对此进行了说明。

现在这是我的问题:我有一个熊猫数据框,看起来像这样:

  overall reviewerID        asin       brand         Positive Negative  \
0  5.0   A2XVJBSRI3SWDI  0000031887  Boutique Cutie     3.0       -1
1  4.0   A2G0LNLN79Q6HR  0000031887  Boutique Cutie     5.0       -2
2  2.0   A2R3K1KX09QBYP  0000031887  Boutique Cutie     3.0       -2
3  1.0   A19PBP93OF896   0000031887  Boutique Cutie     2.0       -3
4  4.0   A1P0IHU93EF9ZK  0000031887  Boutique Cutie     2.0       -2

  LDA_0     LDA_1      ...    LDA_98      LDA_99
0  0.000833  0.000833  ...    0.000833    0.000833
1  0.000769  0.000769  ...    0.000769    0.000769
2  0.000417  0.000417  ...    0.000417    0.000417
3  0.000137  0.014101  ...    0.013836    0.000137
4  0.000625  0.000625  ...    0.063125    0.000625


其中“总体”是目标列,而所有其他105列是要素。

“ ReviewerId”,“ Asin”和“ Brand”列需要更改为虚拟变量。因此,每个唯一的“ ReviewerID”,“ Asin”和品牌都有自己的专栏。这意味着,如果“ ReviewerID”具有100个唯一值,则将获得100列,如果该行代表特定的Reviewer,则该值为1,否则为0。

所有其他列都不需要重新格式化。因此,这些列的索引可以只是列号。

因此,上述熊猫数据框中的前三行需要转换为以下输出:

5 0:1 5:1 6:1 7:3 8:-1 9:0.000833 10:0.000833 ... 107:0.000833 108:0.00833
4 1:1 5:1 6:1 7:5 8:-2 9:0.000769 10:0.000769 ... 107:0.000769 108:0.00769
2 2:1 5:1 6:1 7:3 8:-2 9:0.000417 10:0.000417 ... 107:0.000417 108:0.000417


在[LIBFM]包中,有一个程序可以将“用户-项目-评分”转换为LIBFM输出格式。但是,此程序不能与这么多列相处。

是否有捷径可寻?我总共有一百万行。

最佳答案

LibFM可执行文件需要您在此处说明的libSVM格式的输入。如果LibFM软件包中的文件转换器无法处理您的数据,请尝试scikit学习sklearn.datasets.dump_svmlight_file方法。

参考:http://scikit-learn.org/stable/modules/generated/sklearn.datasets.dump_svmlight_file.html

08-24 23:42