本文针对Q群某人的骂街。原文一字不差。如下:

——————分割线——————

鉴于你对LightGCN比较熟悉,故而以https://github.com/kuandeng/LightGCN该项目为例进行说明。

整体流程想必你已经跑通,如下示例:

python LightGCN.py --dataset yelp2018 --regs [1e-4] --embed_size 64 --layer_size [64,64,64] --lr 0.001 --batch_size 2048 --epoch 10

log日志-运行记录:

Epoch 1 [69.8s]: train==[0.33653=0.33625 + 0.00028]

Epoch 2 [59.1s]: train==[0.16154=0.16093 + 0.00061]

Epoch 3 [60.0s]: train==[0.15031=0.14961 + 0.00070]

Epoch 4 [58.7s]: train==[0.14280=0.14205 + 0.00075]

Epoch 5 [59.3s]: train==[0.13769=0.13689 + 0.00079]

Epoch 6 [56.7s]: train==[0.13310=0.13226 + 0.00083]

Epoch 7 [57.2s]: train==[0.12706=0.12618 + 0.00088]

Epoch 8 [57.3s]: train==[0.12209=0.12116 + 0.00093]

Epoch 9 [56.7s]: train==[0.11625=0.11527 + 0.00098]

Epoch 10 [56.3s]: train==[0.11190=0.11086 + 0.00104]

Traceback (most recent call last):

File "LightGCN.py", line 700, in <module>

best_rec_0 = max(recs[:, 0])

IndexError: too many indices for array

这个报错需要改其中的一个参数

将其中的20改为1,这样就可以随意设置epoch,

609行    if (epoch % 20) != 0:

627  train_writer.add_summary(summary_train_acc, epoch // 20)

657 train_writer.add_summary(summary_test_loss, epoch // 20)

664 train_writer.add_summary(summary_test_acc, epoch // 20)

如果不需要查看tensorboard,则上述summary都可以去掉。

再次运行,如下:

Epoch 1: train==[0.33689=0.33661 + 0.00028 + 0.00000], recall=[0.08075], precision=[0.05722], ndcg=[0.08652]

Epoch 1 [140.6s + 3.8s]: test==[0.22916=0.22865 + 0.00051 + 0.00000], recall=[0.06303], precision=[0.01217], ndcg=[0.03778]

Epoch 2: train==[0.15997=0.15936 + 0.00061 + 0.00000], recall=[0.08421], precision=[0.05929], ndcg=[0.09006]

Epoch 2 [125.5s + 3.4s]: test==[0.21441=0.21375 + 0.00066 + 0.00000], recall=[0.06528], precision=[0.01247], ndcg=[0.03924]

Epoch 3: train==[0.14913=0.14842 + 0.00071 + 0.00000], recall=[0.08670], precision=[0.06067], ndcg=[0.09214]

Epoch 3 [125.0s + 3.2s]: test==[0.20732=0.20660 + 0.00072 + 0.00000], recall=[0.06649], precision=[0.01262], ndcg=[0.03993]

Epoch 4: train==[0.14210=0.14134 + 0.00076 + 0.00000], recall=[0.08832], precision=[0.06160], ndcg=[0.09361]

Epoch 4 [124.7s + 3.4s]: test==[0.20286=0.20209 + 0.00077 + 0.00000], recall=[0.06737], precision=[0.01276], ndcg=[0.04049]

Epoch 5: train==[0.13637=0.13558 + 0.00080 + 0.00000], recall=[0.09014], precision=[0.06267], ndcg=[0.09546]

Epoch 5 [125.4s + 3.4s]: test==[0.19661=0.19579 + 0.00081 + 0.00000], recall=[0.06901], precision=[0.01306], ndcg=[0.04134]

Epoch 6: train==[0.13194=0.13110 + 0.00084 + 0.00000], recall=[0.09232], precision=[0.06405], ndcg=[0.09773]

Epoch 6 [128.8s + 2.9s]: test==[0.19095=0.19009 + 0.00086 + 0.00000], recall=[0.07093], precision=[0.01340], ndcg=[0.04237]

Epoch 7: train==[0.12587=0.12498 + 0.00089 + 0.00000], recall=[0.09488], precision=[0.06573], ndcg=[0.10043]

Epoch 7 [131.7s + 3.9s]: test==[0.18535=0.18444 + 0.00091 + 0.00000], recall=[0.07279], precision=[0.01372], ndcg=[0.04340]

Epoch 8: train==[0.12058=0.11964 + 0.00094 + 0.00000], recall=[0.09756], precision=[0.06749], ndcg=[0.10318]

Epoch 8 [133.0s + 3.9s]: test==[0.18150=0.18054 + 0.00096 + 0.00000], recall=[0.07440], precision=[0.01403], ndcg=[0.04440]

Epoch 9: train==[0.11539=0.11440 + 0.00099 + 0.00000], recall=[0.09995], precision=[0.06911], ndcg=[0.10576]

Epoch 9 [125.9s + 3.9s]: test==[0.17683=0.17582 + 0.00102 + 0.00000], recall=[0.07586], precision=[0.01426], ndcg=[0.04521]

Epoch 10: train==[0.11124=0.11020 + 0.00105 + 0.00000], recall=[0.10202], precision=[0.07041], ndcg=[0.10789]

Epoch 10 [123.5s + 3.9s]: test==[0.17172=0.17065 + 0.00107 + 0.00000], recall=[0.07693], precision=[0.01449], ndcg=[0.04594]

Best Iter=[9]@[1327.3]    recall=[0.07693], precision=[0.01449], ndcg=[0.04594]

这样每次都有指标,分别为traintest的指标,PR

如果觉得每次计算指标浪费时间,可以将20改为epoch同样的数,这样就只计算一次指标。

本次训练采用的yelp2018数据,其他数据一样,运行完如下示例:

yelp2018$ ls -lht

total 39M

12M Aug  7 16:10 s_pre_adj_mat.npz

5.6M Aug  7 16:10 s_mean_adj_mat.npz

5.9M Aug  7 16:10 s_norm_adj_mat.npz

5.4M Aug  7 16:10 s_adj_mat.npz

887K Sep  4  2020 user_list.txt

6.6M Sep  4  2020 train.txt

1.9M Sep  4  2020 test.txt

1.1M Sep  4  2020 item_list.txt

其中上面的是计算的中间参数,只有user_list,train,test,item_list是数据源,

重点:

user_list如下格式:

org_id remap_id

nkN_do3fJ9xekchVC-v68A 0

62GNFh5FySkA3MbrQmnqvg 1

HLaSqQMDVvlcFPGJL_kGCA 2

GXn4ZsasLKh0qZ5g3nIqcQ 3

Bf87HcPERF9yiSjb2tQBqw 4

第一列表示user的原始id,第二列是编码后的id

同样item_list也是如此:

org_id remap_id

na4Th5DrNauOv-c43QQFvA 0

AtLv64FV-Pw6JuT3XUKU1g 1

u8C8pRvaHXg3PgDrsUHJHQ 2

s_466owgNXqmQRuSluHHEQ 3

-FLnsWAa4AGEW4NgE8Fqew 4

DwP10iEz5LGf3fhcVQZm0Q 5

FI-8LPGkc8D_hwx0l0zyyg 6

thBWpIcP6vclsHS6GfI1dw 7

t-o_Sraneime4DDhWrQRBA 8

train是训练的数据集,如下示例:

0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

1 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 0 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 26

这是前两行数据,也就是说用户01的点击日志,

第一行

0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

第一个0表示编码后的user 0,后面的则是编码后的item

以此类推。

同样test数据也是如此:

0 795 694 1531 14517 8784

1 24051 32515 21810 32098 2977 22009 26693 26353 22814 3008 35547 22004 21453 36910 23738 29140 25953 37157 17022 11412 2997 15543 31136 26047 30194 9799 17085 15226 32997 36457 34719 36988 26344 3015 3043 31564 35868 36556 22901 21454 26414 36007 17075 7259 21809 22017 17078 17086 35811 3028 2991 12019 3006 17076 22820 4748 15530 28631 32157 28032 6011 3030 35956 26362 34288 3026 24418 31944 34586 4813 28866 35957 26780 21931 14898 28635 4821 32527 3024 32521 32520 12453 26363 36666 21778 37352 35226 9487 28365 10313 36778 8026 21565 9970 33234 37718 21755 31946 12415 37531 21877 26356 12454 15041 34582 32203 14899 15366 32155 31565 15048 36496 26364 15036 26694 6010 33963 15370 26348 17216 32545 26769 10729 28862 20878 36635 4806 26805 4808 35844 37048 37981 37382 36482 10728

2 3465 2920 836 29378 1680 2922 4696 4691 7528 29505 10009 15069 828 987 10028 838 4858 996

3 576 608 1672 2922 10021

4 13 3276 7007 802 4028 1306

5 4399 11571 2701 8921 1646

其中第一行

0 795 694 1531 14517 8784

第一个0表示编码后的user 0,后面的数字表示其点击的item,这些item用来测试。

结论:

只有train和test实际参与了整个脚本的训练,故而只需要准备这两个文件即可。其数据格式必须是编码后的0,1,2,。。。,N

其中点击的item尽量有时间先后顺序。

关于负采样,作者是采用的随机负采样,也就是将其他user的点击作为其中一个user的负样本。

所以,如果构造自己的数据集,需要的是点击/购买数据,根据你的描述,应该是购买,但这样就会造成数据太过稀疏,因此建议你将点击设为正样本。

关于LightGCN数据的格式相关推荐

  1. R语言ggplot2可视化:应用pivot_longer函数将数据从宽格式转换为长格式、为dataframe的每一列绘制密度图和直方图(堆叠)

    R语言ggplot2可视化:应用pivot_longer函数将数据从宽格式转换为长格式.为dataframe的每一列绘制密度图和直方图(堆叠) 目录 R语言ggplot2可视化:应用pivot_lon ...

  2. R语言dataframe数据列格式转换(从整型integer转化为浮点型float)

    R语言dataframe数据列格式转换(从整型integer转化为浮点型float) 目录 R语言dataframe数据列格式转换(从整型integer转化为浮点型float)

  3. 常用的数据交换格式有哪些_Linux后台开发6大常用的开源库,让你在同行中脱颖而出...

    后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥 ...

  4. XML和JSON 数据交换格式

    为什么80%的码农都做不了架构师?>>>    一.什么是数据交换格式? 客户端与服务器常用数据交换格式xml.json.html 二.数据交换格式应用场景 移动端(安卓.IOS)通 ...

  5. python 表格格式输出_利用python对excel中一列的时间数据更改格式操作

    问题场景:需要将下列的交期一列的数据格式更改成2019/05/10 存货编码 尺寸 数量 交期 0 K10Y0190000X B140 200 2019-05-10 00:00:00 1 K10Y01 ...

  6. 【FPGA】SRIO中的关键问题总结(一)SRIO中的关键数据包格式总结

    目录 1 SRIO事务及其类型 2 常用的I/O逻辑操作事务 3 HELLO包格式(重点) 4 SRIO数据包包格式 5 控制符号数据包格式 1 SRIO事务及其类型 SRIO(Serial Rapi ...

  7. I2C总线学习(二)--数据传送格式

    数据传送格式 (1)字节传送与应答 每一个字节必须保证是8位长度.数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位). (2)数据帧格式 在起始信号后必须 ...

  8. 计算机网络数据分析报告,贵州大学计算机网络实验报告-实验四-分析IP协议数据包格式...

    贵州大学计算机网络实验报告-实验四-分析IP协议数据包格式 (7页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 贵州大学GUIZHOU UN ...

  9. (POST请求中的三种数据请求格式.application/x-www-form-urlencoded和multipart/form-data和application/json)

    (POST请求中的三种数据请求格式.application/x-www-form-urlencoded和multipart/form-data和application/json) applicatio ...

最新文章

  1. LSTM登顶20世纪AI论文高引No.1,NLP技术崛起!!!
  2. 配置 L2 Population - 每天5分钟玩转 OpenStack(114)
  3. java代码走查常见错误_FindBugs常见错误描述和解决方法
  4. SQL SERVER 2008的SQLCMD模式
  5. oracle 判断如果有符合条件的记录则不插入_Oracle数据库AWR部分报告说明
  6. nginx配置支持http2
  7. python找零钱问题_Python基于回溯法子集树模板解决找零问题示例
  8. HUAWEI nova 青春版闪速快充,让追剧不再断电
  9. oracle怎么获取行,在oracle中如何实现SELECT TOP N取得前几行记录
  10. [Leetcode][第24题][JAVA][两两交还的链表中的节点][递归][三指针]
  11. Leecode刷题热题HOT100(14)——最长公共前缀
  12. 浅谈Android五大布局(一)——LinearLayout、FrameLayout和AbsoulteLayout
  13. LeetCode.83. Remove Duplicates from Sorted List(删除单链表中的重复元素)
  14. 图像大小批量调整工具Image Resizer for Mac
  15. uniapp封装request
  16. python写一个简单的CMS识别
  17. 游戏数据库 TcaplusDB
  18. 做phodal的御用编辑,其实我是拒绝的
  19. 关注奢交所兄弟品牌佰家当 17年积累撬动万亿民资市场
  20. 控件、组件和插件的区别

热门文章

  1. Numpy *****
  2. 毕业设计-基于机器视觉的指针式仪表读数自动识别研究与实现
  3. 樱花漫地集于我心,蝶舞纷飞祈愿相随---总结 浮动:flux 浮动:flux
  4. 什么是C101N日内创新高选股指标?
  5. 搭建商城系统,多种系统源码的区别
  6. 深度学习--主动学习
  7. javaScript内置函数(内置函数,内置关键字)
  8. suse与opensuse的区别
  9. Spring Security OAuth2学习
  10. azkaban使用了解