Closed chongminggao closed 3 years ago
basemodel.py在划分training set和validation set时候逻辑有问题。
basemodel.py
举个例子:
如果划分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中。
y_train
y_val
以上的例子只是一个比较极端的例子。总而言之,当默认shuffle=True时候,划分training和validation应该是随机的,不应该依赖数据的位置!
注意:这时候即便选择basemodel的shuffle参数等于True,还是不能得到正确的划分。因为shuffle参数只影响dataloader,没有作用在training和validation的划分上。
在basemodel.fit中,不同于之前的先划分数据、再转为numpy array,我将逻辑调整为先转为numpy array,再切分数据。由于数据先转为numpy,也避免了util.slice_arrays函数的复杂逻辑。
略微调整了下tqdm的进度条,加了一个total参数,让进度条有个终点。
调整basemodel.predict函数,使得顺应改动。
调整tests/models/DIN_test.py 与 tests/models/DIEN_test.py两个test逻辑。由于这两个test只有4个样本输入,故在shuffle后很容易将正负样本分开置于training、validation中。故这里不能shuffle,故调整了test的代码。使得所有test都能顺利通过。
好的,感谢! 我先把这个pull request给关了~
修复basemodel中training data和validation data划分问题
1. 目前basemodel中比较严重的逻辑问题
basemodel.py
在划分training set和validation set时候逻辑有问题。举个例子:
如果划分training data和validation data比例为80%:20%。
而原始的data的label为:
那么basemodel的以下代码
将会把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修复的逻辑:
在basemodel.fit中,不同于之前的先划分数据、再转为numpy array,我将逻辑调整为先转为numpy array,再切分数据。由于数据先转为numpy,也避免了util.slice_arrays函数的复杂逻辑。
略微调整了下tqdm的进度条,加了一个total参数,让进度条有个终点。
调整basemodel.predict函数,使得顺应改动。
调整tests/models/DIN_test.py 与 tests/models/DIEN_test.py两个test逻辑。由于这两个test只有4个样本输入,故在shuffle后很容易将正负样本分开置于training、validation中。故这里不能shuffle,故调整了test的代码。使得所有test都能顺利通过。