如何正确设置验证集 如何设置一个好的初始学习率

我在一开始就犯了这个错误。我随机分割数据集,获得了超过99.6%的惊人的良好验证准确性。测试准确性仅为87%时,我感到很惊讶: 测试准确性和验证准确性之间的巨大差异是验证集设计不当过度拟合验证集

正确的方法是找到一系列图像,并将每个系列全部放入训练或验证集中,确保它们不会分割成两个。要了解关于创建一个好的验证集的更多信息,请阅读Rachel Thomas撰写的这篇文章。

www.fast.ai/2017/11/13/validation-sets/

 

 

算法搜索一个好的起始学习率。对于分类就用0.1*bn/256(bn表示batchsize)

https://towardsdatascience.com/estimating-optimal-learning-rate-for-a-deep-neural-network-ce32f2556ce0

def plot_loss_change(sched, sma=1, n_skip=20, y_lim=(-0.01, 0.01)):
    """
    Plots rate of change of the loss function.
    Parameters:
        sched - learning rate scheduler, an instance of LR_Finder class.
        sma - number of batches for simple moving average to smooth out the curve.
        n_skip - number of batches to skip on the left.
        y_lim - limits for the y axis.
    """
    derivatives = [0] * (sma + 1)
    for i in range(1 + sma, len(learn.sched.lrs)):
        derivative = (learn.sched.losses[i] - learn.sched.losses[i - sma]) / sma
        derivatives.append(derivative)

    plt.ylabel("d/loss")
    plt.xlabel("learning rate (log scale)")
    plt.plot(learn.sched.lrs[n_skip:], derivatives[n_skip:])
    plt.xscale('log')
    plt.ylim(y_lim)


learn.lr_find()

### 验证集正确率高于训练集的原因 在机器学习中,有时会出现验证集上的表现优于训练集的情况。这通常不是理想的结果,因为模型应该首先在训练数据上达到较高的准确性,然后再泛化到未见过的数据。 一种可能原因是过拟合不足(underfitting)。当模型复杂度不够高时,可能会导致欠拟合现象发生,即模型未能充分捕捉到输入特征与目标变量间的映射关系[^1]。此时即使是在训练集上也难以获得很好的效果;而在相对简单的验证集中,由于样本数量较少或噪声水平更低等原因,反而能取得更好的成绩。 另一个常见因素是数据分布差异。如果用于构建训练/测试划分的方法不当,则可能导致两个集合间存在显著统计特性区别——比如类别比例失衡、某些属性缺失等情形下,使得一部分特定模式更容易被识别出来从而提高了该部分子集的表现力[^2]。 此外,随机初始化权重也可能造成这种现象。神经网络初始参数的选择具有一定的偶然性,不同批次之间可能存在较大波动,特别是在小型数据集上更为明显。因此,在某些情况下,尽管整体趋势表明随着迭代次数增加两者差距逐渐缩小甚至反转,但在初期阶段确实可能出现上述反常情况[^3]。 最后还有一种可能性就是人为操作失误所致,例如混淆了两者的标签或是不小心泄露了一些未来信息给到了当前预测过程之中去了[^4]。 ### 影响及解决方案 #### 对模型评估的影响 这种情况会影响对模型真实性能的理解。理想的状况应该是训练集的准确率略高于验证集,表示模型既学到了有用的信息又具备良好的泛化能力。反之则暗示着潜在的问题所在,需要进一步调查原因并采取相应措施加以改进。 #### 解决方案建议 为了改善这一局面,可以考虑以下几个方面: - **调整超参数**:通过网格搜索或者贝叶斯优化等方式寻找更合适的配置组合来提升模型表达能力和适应范围; - **增强正则项强度**:适当加大L1/L2惩罚系数抑制过度复杂的结构形成,促使更加简洁有效的决策边界建立起来; - **扩充数据量级**:引入更多样化的实例帮助算法更好地理解问题本质规律而非依赖于局部特异性关联; - **重新审视预处理流程**:确保所有变换都是一致应用于整个数据集而不是仅限于某一分割部分; - **交叉验证策略应用**:采用k折交叉验证代替简单的一次性拆分方式提高结果稳定性的同时减少方差影响程度。 ```python from sklearn.model_selection import train_test_split, GridSearchCV from sklearn.preprocessing import StandardScaler from sklearn.pipeline import Pipeline from sklearn.linear_model import LogisticRegression pipeline = Pipeline([ ('scaler', StandardScaler()), ('classifier', LogisticRegression()) ]) param_grid = { 'classifier__C': [0.1, 1, 10], } grid_search = GridSearchCV(pipeline, param_grid=param_grid, cv=5) X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2) grid_search.fit(X_train, y_train) print(f'Best Parameters: {grid_search.best_params_}') print(f'Training Score: {grid_search.score(X_train, y_train)}') print(f'Validation Score: {grid_search.score(X_val, y_val)}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值