训练与测试时同一组测试集结果不一致

训练与测试时同一组测试集结果不一致,相当于训练的模型不能后续使用了,这肯定不能容忍,所以耗费经历筛查:

1. 随机种子的设置问题

可在main函数加上这个:

SEED = 1
np.random.seed(SEED)
torch.manual_seed(SEED)
torch.cuda.manual_seed_all(SEED)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

但是我在数据加载的地方也用到了np.random函数,所以要在数据加载的init函数里加上:

SEED = 1
np.random.seed(SEED)

2. 存储整个模型,而不是用state_dict()

torch.save(model, path)   #存储
model = torch.load(path)  #加载,不用事先定义模型

3.数据预处理不一致

数据预处理阶段用到了 np.random.normal,如果测试时重新加载数据的话,模型效果就会变差。

需要保证数据预处理是一致的,最好的方法就是只处理一次数据,然后将处理后的数据保存到文件,多次运行模型时直接调用该数据文件。

这个改正后,重新加载测试与train后测试的结果完全一样。

4. model.eval()

测试之前一定要用

### 训练集、测试集验证集的区别使用场景 在机器学习实践中,训练集、测试集验证集各自扮演着同的角色,并且通常应是同一数据。 #### 定义作用 - **训练集 (Training Set)** 被用来训练模型参数。通过调整这些参数使得模型能够尽可能好地拟合训练样本所代表的模式[^2]。 - **验证集 (Validation Set)** 主要用于调优超参数以及防止过拟合现象的发生。它帮助开发者选择最佳配置选项,在此过程中会影响最终评价指标的真实性[^4]。 - **测试集 (Test Set)** 则完全独立于上述两个集合之外;其目的是提供一个公正无偏倚的方式去衡量经过充分优化后的算法性能表现。这意味着一旦确定了模型架构及其对应的最优设定之后,就再允许依据该部分反馈做任何更改操作[^1]。 #### 归一化处理原则 当对特征进行预处理如标准化(即均值为零,标准差为单位),应当始终基于训练集中统计得到的信息来进行变换计算。具体而言: - 对于新加入的数据点——无论是属于验证阶段还是正式投入使用前的最后一轮检验环节中的实例对象——都应采用之前已经固定下来的转换规则实施相同的操作流程,而是重新估算新的中心位置或尺度因子。 ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler().fit(X_train) X_train_scaled = scaler.transform(X_train) X_val_scaled = scaler.transform(X_validation) X_test_scaled = scaler.transform(X_test) ``` 这样做可以确保整个建模过程的一致性和稳定性,同也避免了潜在的信息泄露风险,因为如果利用到了未来才会知晓的知识,则会破坏原本应有的因果关系链条结构[^5]。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值