├── LICENSE
├── Makefile
├── README.md
├── bin
└── .gitignore
├── lambdafm_predict.cpp
├── lambdafm_train.cpp
└── src
├── FTRL
├── ftrl_model.h
├── ftrl_predictor.h
└── ftrl_trainer.h
├── Frame
├── Makefile
├── pc_frame.cpp
├── pc_frame.h
├── pc_task.h
├── test_main.cpp
└── test_task.h
├── Sample
└── fm_sample.h
└── Utils
├── utils.cpp
└── utils.h
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Zhang Wei
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | all:
2 | g++ -O3 lambdafm_train.cpp src/Frame/pc_frame.cpp src/Utils/utils.cpp -I . -std=c++0x -o bin/lambdafm_train -lpthread
3 | g++ -O3 lambdafm_predict.cpp src/Frame/pc_frame.cpp src/Utils/utils.cpp -I . -std=c++0x -o bin/lambdafm_predict -lpthread
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # lambdaFM
2 | ## 前言:
3 | * lambdaFM是lambdaRank和FM(Factorization Machines)的结合,用于解决排序问题。实现了pairwise和lambdaRank两种训练方法,可通过-rank参数选择。
4 | lambdaFM是在[alphaFM](https://github.com/CastellanZhang/alphaFM)的代码基础上修改而成,同样是单机多线程版本,同样是FTRL优化算法。
5 |
6 | * 算法原理见我的博客文章:http://castellanzhang.github.io/2017/07/16/lambdafm/
7 |
8 | * lambdaFM和alphaFM类似,同样适用于真实业务中大规模数据、高维稀疏特征的训练。由于采用FTRL优化算法,样本只需过一遍,不占用内存。通过管道的方式接受输入。
9 | 比如训练样本存储在hdfs上,一个典型的使用方法是这样:
10 | 训练:10个线程计算,factorization的维度是8,最后得到模型文件fm_model.txt
11 | `hadoop fs -cat train_data_hdfs_path | ./lambdafm_train -core 10 -dim 1,8 -rank ndcg -m fm_model.txt`
12 | 测试:10个线程计算,factorization的维度是8,加载模型文件fm_model.txt,最后输出预测结果文件fm_pre.txt
13 | `hadoop fs -cat test_data_hdfs_path | ./lambdafm_predict -core 10 -dim 8 -m fm_model.txt -out fm_pre.txt`
14 |
15 | * lambdaFM同样支持加载上次模型继续训练,以及通过-fvs参数加强v的稀疏性。
16 |
17 | * 注意:dim参数有些变化,不再需要指定偏置项,所以只有两项。当将dim参数设置为1,0时,lambdaFM就退化成lambdaLR。
18 |
19 | ## 安装方法:
20 | 直接在根目录make即可,编译后会在bin目录下生成两个可执行文件。如果编译失败,请升级gcc版本。
21 | ## 输入文件格式:
22 | 类似于RankLib和SVMrank的格式,但更加灵活:特征编号不局限于整数也可以是字符串;特征值可以是整数或浮点数(特征值最好做归一化处理,否则可能会导致结果为nan),
23 | 特征值为0的项可以省略不写;qid可以是数字也可以是字符串;label(即相关性分数)必须是0,1,2,3等非负整数;#后面是注释,注释也可为空。
24 | 相同qid的数据必须相邻在一起,且按照自然展现的顺序排列。举例如下:
25 | `1 qid:1 sex:1 age:0.3 f1:1 f3:0.9 # 1AAAAA`
26 | `0 qid:1 sex:0 age:0.7 f2:0.4 f5:0.8 f8:1 # 1BBBBB`
27 | `3 qid:1 sex:1 age:0.3 f1:1 f3:0.9 # 1CCCCC`
28 | `2 qid:ab sex:0 age:0.2 f2:0.2 f8:1`
29 | `1 qid:ab sex:1 age:0.5 f1:1 f3:0.3`
30 | `4 qid:ab sex:0 age:0.1 f2:0.7 f5:0.2 f8:1`
31 | `...`
32 | ## 模型文件格式:
33 | `feature_name w v1 v2 ... vf w_n w_z v_n1 v_n2 ... v_nf v_z1 v_z2 ... v_zf`
34 | ## 预测结果格式:
35 | `label qid score`
36 |
37 | ## 参数说明:
38 | ### lambdafm_train的参数:
39 | -m \: 设置模型文件的输出路径。
40 | -dim \: k1为1表示使用w参数,为0表示不使用;k2为v的维度,可以是0。 default:1,8
41 | -init_stdev \: v的初始化使用均值为0的高斯分布,stdev为标准差。 default:0.1
42 | -w_alpha \: w0和w的FTRL超参数alpha。 default:0.05
43 | -w_beta \: w0和w的FTRL超参数beta。 default:1.0
44 | -w_l1 \: w0和w的L1正则。 default:0.1
45 | -w_l2 \: w0和w的L2正则。 default:5.0
46 | -v_alpha \: v的FTRL超参数alpha。 default:0.05
47 | -v_beta \: v的FTRL超参数beta。 default:1.0
48 | -v_l1 \: v的L1正则。 default:0.1
49 | -v_l2 \: v的L2正则。 default:5.0
50 | -core \: 计算线程数。 default:1
51 | -im \: 上次模型的路径,用于初始化模型参数。如果是第一次训练则不用设置此参数。
52 | -fvs \: 为了获得更好的稀疏解。当fvs值为1, 则训练中每当wi = 0,即令vi = 0;当fvs为0时关闭此功能。 default:0
53 | -rank \: pairwise或ndcg,支持两种排序算法,ndcg即lambdaRank算法。 default:pairwise
54 | -fast_mode \: 提供了一种快速训练模式,在v较大时速度能有一定提升,但效果可能会变差,谨慎使用。1表示开启,0表示关闭。 default:0
55 | ### lambdafm_predict的参数:
56 | -m \: 模型文件路径。
57 | -dim \: v的维度。 default:8
58 | -core \: 计算线程数。 default:1
59 | -out \: 输出文件路径。
60 |
61 | ## 评测工具:
62 | * 写了一个python版本的NDCG@k计算工具,具体见:https://github.com/CastellanZhang/NDCG
63 |
64 |
--------------------------------------------------------------------------------
/bin/.gitignore:
--------------------------------------------------------------------------------
1 | # Ignore everything in this directory
2 | *
3 | # Except this file !.gitignore
4 | !.gitignore
5 |
--------------------------------------------------------------------------------
/lambdafm_predict.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include