nzc / dnn_ctr

The framework to deal with ctr problem。The project contains FNN,PNN,DEEPFM, NFM etc
756 stars 285 forks source link

关于DeepFM模型 #2

Open simpleDgq opened 6 years ago

simpleDgq commented 6 years ago

你好,我在fork你的代码之后,运行main.py文件,报如下错误, image 缺少./data/category_emb.csv这个文件,我想问这个文件我应该怎么生成啊? 谢谢。

已经更新

nzc commented 6 years ago

已经push了

simpleDgq commented 6 years ago

image data文件夹下面没有。

nzc commented 6 years ago

可以了

simpleDgq commented 6 years ago

非常感谢,跑起来了。 image

simpleDgq commented 6 years ago

你好,tiny_train_input.csv不是criteo数据集吧?我想使用criteo数据集跑DeepFM,对于criteo应该怎么处理成如下格式啊: image 谢谢。

nzc commented 6 years ago

tiny_train_input.csv 是criteo数据集的一个sample,我主要是利用了criteo 冠军队伍的特征工程方法生成的,但是没有包含他们的gbdt的叶子节点特征。所以只有39维。 利用他们的脚本生成libsvm格式的样本,再调用我的数据处理脚本里面的函数就可以了。当然 你可以有其他的特征工程方法,只要对应的数据的格式如我给的那样的格式就可以了

simpleDgq commented 6 years ago

你好,我使用你说的criteo 冠军队伍的脚本生成了tr.ffm和te.ffm文件,在生成category_emb.csv的时候,我使用的是如下图所示的方法,对于tr.ffm和te.ffm分别生成了对应的category_emb文件,然后分别使用对应的category_emb文件生成训练集和测试集。 image 为什么你上传的category_emb.csv只有一个,而不是训练集和测试集分别对应一个category_emb啊?是不是我哪里弄错了?

nzc commented 6 years ago

你可以尝试将训练集和测试集合并生成一个category_emb.csv 其实训练集和测试集的编码应该是要求一致的。如果不一致,那特征都是错误的。。。结果怎么会好?。。。

simpleDgq commented 6 years ago

非常感谢你的解答,我尝试将tr.ffm和te.ffm合并成为了一个文件(使用的是cat tr.ffm te.ffm > data.ffm),然后使用data.ffm生成了category_emb.csv。现在成功跑起来了。接下来认真研究一下你的代码,还有许多地方不是很懂。 再次感谢。

Eaphan commented 6 years ago

你好,在冠军的解决方案中他将数值类型的变量也进行了hash,然后处理方式和类别相同,也进行embedding,请问这样做的意义是啥?我觉得这样丢失了本来的相对大小信息。 @nzc @CarlosDGQ

simpleDgq commented 6 years ago

说一下我的看法,数据集中有13个数值类型的特征(都为int类型),26个categorical特征。在连续特征和categorical特征之间我觉得是不存在相对大小信息的,因为categorical可能是ip、userId等hash之后生成的,(ip类似的信息和连续值特征没有相对大小信息吧)但是具体数据集描述文件也没有给出,我们并不知道每个字段的意义。对于数值类型的特征相对大小在hash之后,在求出其整数表示,相对大小的信息应该没有发生丢失。代码中对大于2的连续特征进行了取对数,对于小于2的特征和大于2的特征可能会存在一定的相对大小信息的丢失,但是也比较小。欢迎讨论。

Eaphan commented 6 years ago

@CarlosDGQ 我的意思就是这个特征本身的相对大小,特征之间当然比较大小没意义。但是那13个数值类型的变量大部分是count意义,通过hash变换的是带‘SP'和数值的字符串,这样转换value = 'SP'+str(value),hash没有保证原来的相对大小。另外加个好友吧,共同学习:)我qq是18324分割0719.

nzc commented 6 years ago

在CTR预估场景中,一般连续值特征最后也是需要离散化的。连续值特征的处理方式要根据分布会有不同的处理方法。感觉冠军队伍是分析过的,所以才采用了那样的特征处理方法。至于信息损失,其实个人感觉还好。连续值特征的信息损失一般来源于分桶的时候,因为冠军队伍后面用了gbdt,所以两者结合的话,感觉信息损失不会太大。

TaylorWPY commented 6 years ago

@CarlosDGQ 你好,我想问你一下tr.ffm和te.ffm文件是怎么生成的

simpleDgq commented 6 years ago

@TaylorWPY 你好,我是直接使用https://github.com/guestwalk/kaggle-2014-criteo脚本生成的。按照作者GitHub上的步骤生成就可以了。 image

aa147138 commented 5 years ago

@CarlosDGQ @TaylorWPY 您好,我用了https://github.com/guestwalk/kaggle-2014-criteo脚本生成的tr.ffm文件的时候执行到cmd = 'python converters/parallelizer-a.py -s {nr_thread} python converters/pre-a.py tr.csv tr.gbdt.dense tr.gbdt.sparse'.format(nr_thread=NR_THREAD) subprocess.call(cmd, shell=True)这一句的时候 ,为什么会出现parallelizer-a.py: error: unrecognized arguments: tr.gbdt.sparse 这种错误呢,是不是少了什么步骤?

wangdazi commented 5 years ago

你好,我想请教一下deepfm的输入可以是评论文本表示的user,item特征吗?