问题描述:
一般情况下, 我们习惯将原始数据中的80% 作为训练集, 20% 作为测试集(当数据量足够大的时候,也可以将10% 作为测试集。 数据量较小时,如果每次都是随机划分训练集,执行多次训练后,模型可能就获取了完成是数据集。这是我们想要避免的。
解决上述的问题的方案有以下几种:
- 将第一次运行产生的测试集和训练集保存,后续训练时,先加载保存的训练集和测试集数据
- 设置 random_state, 保证每次分配的测试集相同
- 上述两种方法,当原始数据集增加后,仍然会出现测试数据和训练数据混合的问题,所以当原始数据集会不断增加时,可以将数据集中的某个字段转换成标识符,再将标识符转成哈希值,如果哈希值 < 最大哈希值 * 20%, 则将放入测试集
方法 2 对应代码如下:
from sklearn.model_selection import train_test_split
# 设置测试集大小为20%的原始数据, 设置random_state可以保证每次执行训练时,拆分得到的训练集和测试集都相同, random_state 可以设置成任意整数,只要每次训练使用的值相同即可
train_test_split(data, test_size=0.2, random_state=42)
或者使用numpy 生成随机的无序序列,来划分测试集和训练集
def split_train_test(data, test_ratio):
np.random.seed(42)
shuffled_indices = np.random.permutation(len(data)) # 生成和原数据等长的无序索引
test_set_size = int(len(data)