libFM使用
要使用LibFM训练数据,发现要用libvsm格式数据
但libvsm格式的数据要求时一行一个样本,第一列是标签,其余列是feature特征,但我们的数据是有三个标签,于是设法分别对三个标签单独训练三次,向其他博客主请教后发现这种思路可行。
于是通过execl宏转换生成对应格式,比如对于第一个标签,我们得到的形式如下对应的libvsm格式。
列举其中一个输入训练文件的样式。
按照博客要求进行训练时发现异常错误
也没有找到libFM常用的训练数据,后根据一篇博客找到libvsm格式的数据网站,比对两个libvsm格式数据,表面上未发现不同,但是自己生成的数据就是过不去。于是使用网上下载地数据文件地外衣,将自己生成的数据内容放进去,发现可以运行。
数据网站地址https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html#ijcnn1
当测试集标签为NAN时发现会提示无法识别NAN的错误提示
ERROR: cannot parse line "Nan 1:.847222222222222 2:.381909547738693 3:.242424242424242" at character N
于是使用1看看,modeltxt里的内容是这样的。
0.185232
0.225945
0.0824995
0.0812175
0.0811083
0.0621622
执行过程截图为
当将test文档里的Nan都替换成0,modeltxt里的内容为
0.184451
0.224322
0.0837344
0.0826313
0.0815337
0.0633914
执行过程截图为
当讲test文档里的Nan替换成-1,modeltxt里的内容为
0.184796
0.225034
0.0831882
0.0820146
0.0813276
0.0628483
执行过程截图为
得到的结果大都相同,对于他们的含义,博客给出的解答是一个概率。 我原本以为得到的概率是指其属于+1类或者-1类的概率,但其输出的结果相近使我太不明白数据结果的含义。
之后再对其他两个标签进行训练,默认NAN为-1
第二个标签训练结果如上。
生成model2文件,
概率为
0.0586492
0.0699962
0.0322672
0.0282077
0.0377533
0.026012
第三个标签训练结果如上。
model3文件显示的概率为
0.182937
0.221114
0.078506
0.0778148
0.0751594
0.0576001
哈哈哈,我又回来了,经过一段时间得探索发现,略懂了一点点
在两个方面有所学习
libFM得savemodel 板块
对于原先版本是没有的,其功能模块包含在libfm-master中,下载解压编译后在libfm可执行文件中包含savemode 等功能,如下图所示。
libFM对测试集进行预测:
我们使用一个回归模型来作为例子
比如训练集如下
每一行代表一个样本。第一题是回归标签,后面是三个特征取值。
测试集也是相同格式:
0.434343434343434 1:.636363636363636 2:.47 3:.843137254901961
0.474747474747475 1:9.09090909090909E-02 2:.64 3:.705882352941177
0.676767676767677 1:1 2:.74 3:.823529411764706
0.696969696969697 1:.636363636363636 2:.97 3:.862745098039216
0.707070707070707 1:.636363636363636 2:1 3:.980392156862745
0.525252525252525 1:.727272727272727 2:.04 3:.274509803921569
可能会疑惑明明是预测,第一列的标签不应该啥都没有吗?但是为了输入的格式能被识别,标签不能为NAN,不能为空,可以随意设置一个数,比如0,1,问题不大,对结果并不影响。
预测
对于回归问题进行预测:
./libFM -task r -method mcmc -train ijcnn1tr.txt -test ijcnn1ts.txt -iter 100 -dim ‘1,1,2’ -out output.libfm
task -r 代表是回归任务
task - c 代表的是分类任务
-train 后面跟着是训练集
-test 后面跟着的是测试集
-method 是相应的训练方法,在网上的中文文档中有涉及,这里具体不展开。
-iter 代表模型训练的迭代次数
这里是一百次,当程序运行时会在屏幕上打印出来。
-out 则代表将预测结果输出到哪一个文件之中。
其中各个文件格式可以选择txt ,也可以选择libfm
都可以,不影响结果
上图为迭代过程。
下图为预测结果,也就是预测得到的标签。