英文版原文:http://www.libfm.org/libfm-1.42.manual.pdf
自己翻译
libFM 1.4.2 - 指南
目录
1.说明
• Linux︰ 按照第 1.1 节中的说明编译 libFM 。
• MacOS x︰ 按照第 1.1 节中的说明编译 libFM 。
• Windows︰
libfm-1.40.windows.zip
(2013-07-12)
下载的已编译可执行文件。你可以跳第 1.1 节。
请注意,已编译的可执行文件的版本是 libFM 1.4.0。 这个版本有 libFM 1.4.2 相同的功能,但它有不同的许可证。
1.1编译
libFM 已经与与 GNU 编译器集和 GNU 测试过。在Linux 和 MacOS X上两者应该是可用的。
使用以下步骤中,您可以构建 libFM:
1.下载 libFM 源代码︰ http://www.libfm.org/libfm-1.42.src.tar.gz
2.解压缩︰ 例如焦油-xzvf libfm-1.42.src.tar.gz
3.输入目录 libfm 1.42.src 和编译工具︰ make all
文件概述
• history.txt︰ 版本历史记录和更改
• readme.pdf︰ libfm的手册
• Makefile︰ 使用make编译的可执行文件
• bin︰ executables(需要使用make来build,见1.1节)的文件夹
— — libFM: libFM 工具
— — convert︰ 将文字文件转换成二进制格式的工具
— — transpos︰ 转换二进制设计矩阵的一个工具
• scripts
— — ltriple format to libfm.pl︰ 一个 Perl 脚本将逗号/制表符分隔的数据集 转换成
libFM 格式。
• src︰ 源文件的 libFM 和工具
2.数据格式
libFM 支持两种文件格式用于输入数据︰ 文本格式和二进制格式。使用文本格式是更容易的,所以推荐新 libFM 用户使用。
2.1 文本格式
数据格式与SVMlite [3] 和 LIBSVM [1] 相同,每一行都都包含一个训练集(x,y),分别提供给实特征向量x和目标y。行首先规定y的值,然后是x的非零值。
对于二进制类型,y>0的类型被认为是积极的一类,y<=0被认为是消极的一类。
此
文件
包含
三个case:
第一
列
指出
的
三个case
的
每个
目标
︰4是第一个case的,
2是
第二的,-1是
第
三个
。
在每个
目标
之后
,
包含
非零
元素x。如
0:1.5
表示
=
1.5
,
3
:-7.9
表示
=
−7.9
等等
。
即:左边的值是
x
的
索引
,
而
右边的是
的值
,
即
=
值
。
总之,上述例子表示如下设计矩阵X和目标向量y;
2.1.1转变到推荐文件
在推荐系统中经常使用像 userid, itemid, rating的这样的文件格式。
在script文件夹中的perl脚本是用来将这样格式的数据集转换成libFM的格式的。例如,将Movielens 1M里的rating.csv转换成libFM格式,
使用——
./triple_format_to_libfm.pl-in ratings.dat -target 2 -delete_column 3 -separator "::"
输出将写入到一个文件扩展名为.libfm的文件中。例如,写入toratings.dat.libfm中。
如果一个数据集包含多个文件,如包含训练和测试split,则使用——in后面包含多个文件
./triple_format_to_libfm.pl -in train.txt,test.txt-target 2 -separator "\t"
注意:
如果你为每个文件单独运行一次脚本,则变量(id)将不会匹配了。
例如,第一个文件中的第n个变量将和第二个文件中的第n个变量不一样了。
2.2二进制文件
除了标准的文本格式,libFM 支持二进制数据格式。
该二进制文件的优点:
(1) 读的速度快
(2) 如果您的数据不适合到主内存中,二进制数据格式
支持
将
数据
缓存
在
硬盘
并
在
内存
中
保留
只有
一
小
部分
(使用
— — 高速缓存
的
大小
在
libFM),
(3)如果
你
使用
的
ALS
和
mcmc 方法
,
你
可以
预先计算
换位
的
设计
矩阵,
这
可以节省读取数据集时
的
时间
。
使用bin文件夹下的【如下】,可以将LibFM文本格式的文件转换为二进制格式的文件。
例如:
将前面提到的电影数据集转换成二级制格式:
./convert --ifile ratings.dat.libfm --ofilex ratings.x --ofiley ratings.y
输出两个文件:
(1)包含设计矩阵X即预测器变量的文件
(2)包含预测目标y的文件
建议,分别以.x和.y作为文件拓展名
2.2.1转置数据(Transpose data)
使用转置设计矩阵(transposed design matrix)来学习MCMC和ALS。
如果您使用的是文本格式,libFm内部会自动转换这些数据。
如果您使用的是二进制格式,二进制格式中必须存在转置数据。
使用transpose工具,将设计矩阵x转换为二级制格式:
例如:转换上述提到的电影数据集:
./transpose --ifile ratings.x --ofile ratings.xt
输出为设计矩阵x的一个转置复制,建议以.xt作为结尾。
3.libFm
libFm工具从训练数据集(-train)和验证数据集(-test)中训练FM模型。
libFm有如下选项:
3.1强制参数
•
指定的
第一个
强制性
参数—— -task 要么是分类
(-task c
)
要么就是
回归
(-任务
r)。
• 第二训练数据 (-train) 和测试数据 (-test) 必须存在。此处可以使用二进制文件,也可以使用libFm文本格式文件。
• 第三,分解机的维度需要用-dim来指定,由三个数字组成,
——来确定全局偏移是否要在模型中使用。
——来确定单向交互(one-way interactions)(为每个变量的偏移)即w是否要在模型中使用
——给出了用于成对相互作用的因素的个数,即k是
例如:一个FM,使用bias,1-way interactions,a factorization of k = 8 forpairwise interactions的回归任务——
/libFM -task r -train ml1m-train.libfm -test ml1m-test.libfm -dim ’1,1,8’
3.2可选参数
3.2.1基本参数
• out︰ 训练完毕后,您可以将测试数据集的所有预测结果通过out写入指定的文件。Out-file 是文本格式,与测试数据集的行数相等,第i行的数据为第i个测试数据的结果。
请注意,对于分类,有积极类型的数据输出的是概率。
• rlog︰ 生成一个有关每次迭代的统计信息的日志文件。该文件是 使用制表符分隔字段CSV 格式。
请注意,它取决于哪些字段报道的学习方法。
• verbosity︰ 使用参数-详细级别 1,libFM 打印的详细信息。这是有用的检查是否正确,读取您的数据,并找出错误。
3.2.1高阶参数
Grouping
通过使用meta选项可以进行将输入变量group,grouping可以用来给ALS,MCMC,SGDA来确定更复杂的正则化模型。
每个group可以有一个单独的正则化参数。
为了使用group,元参数需要使用文本文件的文件名,和有很多输入变量和许多行一样。
每一行指定一个相应输入参数的group id。【需要注意的是】group的id需要是从0开始的数字。
例如:
例子1中的设计矩阵(一共7行,最大的id是6)的group文件,应该是这样的
表示的意义是:一共有三组,前两个变量 (设计矩阵中的列)有同组,第三和最后是同一组,第四至第六变量有同一组。
二进制数据和缓存
在2.2章节中提到,二进制文件中,设计矩阵以应以.x和目标以.y结尾,转置以.xt结尾。如果在libfm中使用二进制文件,那么不需要以这些格式结尾。
即:如果你有 compiled training (ml1m-train.x, ml1m-train.y,ml1m-train.xt) and 测试数据 (ml1m-test.x, ml1m-test.y, ml1m-test.xt)
使用——
./libFM -task r -trainml1m-train -testml1m-test -dim ’1,1,8’
libFm会自动追加适当的扩展名,并为学习算法载入数据集
如果你的数据不适合进入内存,你可以指定libFM允许多大的文件允许保存在内存中
使用——
./libFM -task r -train ml1m-train -test ml1m-test -dim ’1,1,8’-cache_size 100000000
表示为100,000,000 Bytes (100 MB)的内存可以被.x或者.xt文件使用。
【注意】
.y文件通常完全地读入内存中。
如果没有指定参数cache-size,所有数据将都进入内存。
【注意】
只有当数据因为cache使用比读写内存慢很多的锁(harddisc)的时候而不适合进行内存,才使用caching。
Note: you should usecaching only if the data does not fit into memory because caching uses the harddisc which will be muchslower then memory access.
3.3学习方法
默认的学习方式是MCMC,因为MCMC是非常易于掌握的(没有学习速率,没有正则化项)
在libFM中你可以选择SGD,ALS, MCMC , SGDA。对于所有这些方法,迭代次数(iter)都需要指定
3.3.1 Stochastic Gradient Descent (SGD)
通过使用-method sgd参数,可以实现SGD学习方法,对于此方法,以下参数可以选择。
• -learn rate:SGD学习速率的步长,需是一个非零且postive的值
• -regular:正则化参数,需是0或者postive的值
对于SGD,你可以通过以下方法来确定正则化的值:
– One value (-regular value):所有的参数模型使用统一的正则化值
– Three values (-regular ’value0,value1,value2’):
0-way interactions (w0) use value0 asregularization,
1-way interactions (w) use value1
pairwise ones (V ) use value2
– No value:使用-regular 0来表示没有指定正则化值
• -init stdev:标准偏差的正态分布,用于
初始化V 的参数。在这里你应该使用一个非零的、 postive的值。
请慎重选择这些参数,预测质量很大程度上取决于对很好的选择。
例如:
./libFM -task r -train ml1m-train.libfm -test ml1m-test.libfm -dim ’1,1,8’ -iter 1000-method sgd -learn_rate 0.01 -regular ’0,0,0.01’ -init_stdev 0.1
3.3.2 Alternating Least Squares (ALS)
通过使用-method als参数,可以实现SGD学习方法,对于此方法,以下参数可以选择。
• -regular:正则化参数,需是一个非零且postive的值
对于ALS可以使用以下方法来正则化:
– One value (-regular value):所有的参数模型使用统一的正则化值
– Three values (-regular ’value0,value1,value2’):
0-way interactions (w0) use value0 asregularization,
1-way interactions (w) use value1
pairwise ones (V ) use value2
– Group specific values (-regular ’value0,value1g1,...,value1gm,value2g1,...,value2gm’):例如,对于m groups如果输入变量是grouped的,对于每个group,
1-way and 2-way interaction 每一个正则化值都被使用,那么有1+2m个正则化值,
– No value:使用-regular 0来表示没有指定正则化值
• -init stdev:标准偏差的正态分布,用于初始化V 的参数。在这里你应该使用一个非零的、 postive的值。
请慎重选择这些参数,预测质量很大程度上取决于对很好的选择。
例如:
./libFM -task r -train ml1m-train.libfm -test ml1m-test.libfm -dim ’1,1,8’ -iter 1000-method als -regular ’0,0,10’ -init_stdev 0.1
3.3.3 Markov Chain Monte Carlo (MCMC)
通过使用-method mcmc参数,可以实现MCMC学习方法,对于此方法,以下参数可以选择。
• -init stdev:标准偏差的正态分布,用于初始化V 的参数。在这里你应该使用一个非零的、 postive的值。
请慎重选择这些参数,预测质量很大程度上取决于对很好的选择。
例如:
./libFM -task r -train ml1m-train.libfm -test ml1m-test.libfm -dim ’1,1,8’ -iter 1000-method mcmc -init_stdev 0.1
3.3.4 Adaptive SGD (SGDA)
通过使用-method sgda参数,可以实现SGDA学习方法。当采用SGDA时,正则化值(每组和每层)会被自动找到。
你需要去指定一个有效的集合去调优正则化值。
• -validation:包含训练样本的数据集用作验证集合来调优正则化值。此数据集需要与训练数据集区分开。
• -learn rate:学习速率的步长,需是一个非零且postive的值
• -init stdev:
标准
偏差
的
正态分布
,用于初始化V 的参数。在这里你应该使用一个非零的、 postive的值。
请
慎重
选择
这些
参数
,
预测
质量
很大程度上
取决于
对
很好
的
选择。
例如:
./libFM -task r -train ml1m-train.libfm -test ml1m-test.libfm -dim ’1,1,8’ -iter 1000-method sgda -learn_rate 0.01 -init_stdev 0.1 -validation ml1m-val.libfm
4.块结构 (BS) 扩展
上图表示:
(a)
LibFM
数据
文件
(=
的
设计
矩阵
X
表示形式
)
可能
包含
大
块
重复
的
图案
。
(b)
libFM
的
BS
扩展
允许
使用
更
紧凑
的
表示
数据
文件来表示曾经描述过的
重复
图案
,
哪里
会
只是
曾经
描述了
。
(图
改编
自
[7])
在相关背景下,
在
设计
矩阵
可能
包含
大
块
的
重复
的
模式
(见
图
1a)。 这可能导致设计矩阵非常大,以至于学习速度慢而且占用很多内存。
在libFM的BS扩展中,允许在设计矩阵中定义和利用块结构。BS数据类型取代传统的数据类型所用时间和所占内存都会成线性。
来自相关数据的大的设计矩阵的具体细节详情见[7]
4.1数据格式
BS
扩展
允许
定义
块
(例如
B1
、
B2
、
B3
中
图
1)
,
在
libFM
中
使用
它们
。
每个
块
定义
包括
︰
•
设计
矩阵
(libFM 文件)
的
块
(例如
XB1
在
图
1)。
•
从训练
(或
测试)case
映射
到
行
中
的
块
(例如
φ
例B1
在
图
1)。
•
设计
矩阵
中的可选分组
(比较
第
3.2.2
节
)
。
对于
每个
块
,
预计
以下
文件
︰
4.2使用BS数据来启动LibFm
使用--relation参数来传递命令行参数,假设已经定义了两块(rel.user andrel.item)则使用
./libFM -task r -train ml1m-train -test ml1m-test -dim ’1,1,8’ --relation rel.user,rel.item
注意:上面文件中列出的每一块都必须出现。(i.e. rel.user.x, rel.user.xt,rel.user.train, rel.user.test, (rel.user.groups), rel.item.x, rel.item.xt, etc.).
4.3在libFm中使用BS的注意事项
• BS 仅支持由 MCMC 和 ALS/CD。
•
甚至当
使用
BS
时
, --train ,--test
参数
是
仍旧
强制执行,
文件
必须
是
在此处
指定
。
LibFM
文件
通过
--train ,--test
可以
有
预测
变量
以及
但
也
可能
是
空。
文件可以是二进制形式,可以是文本形式
• 在 BS 设计矩阵变量 id 的命名空间是不同的。
• 在BS文件中group的命名空间是不同的。每一个组文件可以有从0开始的组。 – overlaps are resolved the same way as with predictor ids.
• If no group files are passed, each block is automatically assumed to have a different group
5.许可证
If you use libFM in your work, please cite the following paper:
@article{rendle:tist2012,author = {Rendle, Steffen},title = {Factorization Machines with {libFM}},journal = {ACM Trans. Intell. Syst. Technol.},issue_date = {May 2012},volume = {3},number = {3},month = May,year = {2012},issn = {2157-6904},pages = {57:1--57:22},articleno = {57},numpages = {22},publisher = {ACM},address = {New York, NY, USA},}
References
[1] Chih-Chung Chang and Chih-Jen Lin. Libsvm: A library for support vector machines. ACM Trans.Intell. Syst. Technol., 2:27:1–27:27, May 2011.
[2] Christoph Freudenthaler, Lars Schmidt-Thieme, and Steffen Rendle. Bayesian factorization machines.In NIPS workshop on Sparse Representation and Low-rank Approximation, 2011.
[3] Thorsten Joachims. Making large-scale support vector machine learning practical, pages 169–184. MITPress, Cambridge, MA, USA, 1999.
[4] Steffen Rendle. Factorization machines. In Proceedings of the 10th IEEE International Conferenceon Data Mining. IEEE Computer Society, 2010.
[5] Steffen Rendle. Factorization machines with libFM. ACM Trans. Intell. Syst. Technol., 3(3):57:1–57:22, May 2012.
[6] Steffen Rendle. Learning recommender systems with adaptive regularization. In WSDM ’12: Proceedingsof the third ACM international conference on Web search and data mining, New York, NY,USA, 2012. ACM.
[7] Steffen Rendle. Scaling factorization machines to relational data. In Proceedings of the 39th internationalconference on Very Large Data Bases, PVLDB’13, pages 337–348. VLDB Endowment,2013.
[8] Steffen Rendle, Zeno Gantner, Christoph Freudenthaler, and Lars Schmidt-Thieme. Fast contextawarerecommendations with factorization machines. In Proceedings of the 34th ACM SIGIR Conferenceon Reasearch and Development in Information Retrieval. ACM, 2011.
推荐系统学习05-libFM - 风萧萧兮 - 博客频道 - CSDN.NET
http://blog.csdn.net/chenKFKevin/article/details/51066214