shenweichen / DeepCTR-Torch

【PyTorch】Easy-to-use,Modular and Extendible package of deep-learning based CTR models.
https://deepctr-torch.readthedocs.io/en/latest/index.html
Apache License 2.0
3.02k stars 705 forks source link

Update basemodel.py and fix the logic #189

Closed chongminggao closed 3 years ago

chongminggao commented 3 years ago

修复basemodel中training data和validation data划分问题

1. 目前basemodel中比较严重的逻辑问题

basemodel.py在划分training set和validation set时候逻辑有问题。

举个例子:

如果划分training data和validation data比例为80%:20%。

而原始的data的label为:

y = [0] * 90 + [1] * 10 # 即所有正样本都在y的尾部。

那么basemodel的以下代码

y_train, y_val = (slice_arrays(y, 0, 80), slice_arrays(y, 80))

将会把80个0放到y_train中,把剩下10个0和10个1放到y_val中。即y_train全为负样本0,所有正样本全在y_val中。

以上的例子只是一个比较极端的例子。总而言之,当默认shuffle=True时候,划分training和validation应该是随机的,不应该依赖数据的位置!

注意:这时候即便选择basemodel的shuffle参数等于True,还是不能得到正确的划分。因为shuffle参数只影响dataloader,没有作用在training和validation的划分上。

2. 本次pull request修复的逻辑:

  1. 在basemodel.fit中,不同于之前的先划分数据、再转为numpy array,我将逻辑调整为先转为numpy array,再切分数据。由于数据先转为numpy,也避免了util.slice_arrays函数的复杂逻辑。

  2. 略微调整了下tqdm的进度条,加了一个total参数,让进度条有个终点。

  3. 调整basemodel.predict函数,使得顺应改动。

  4. 调整tests/models/DIN_test.py 与 tests/models/DIEN_test.py两个test逻辑。由于这两个test只有4个样本输入,故在shuffle后很容易将正负样本分开置于training、validation中。故这里不能shuffle,故调整了test的代码。使得所有test都能顺利通过。

chongminggao commented 3 years ago

好的,感谢! 我先把这个pull request给关了~