机器学习_高偏差(High bias)与高方差(High vars)

本文介绍了高偏差和高方差的概念,并通过吴恩达老师的机器学习课程中的图表进行了解释。高偏差模型增加数据无效,而高方差模型增加数据能改善效果。为解决这些问题,文章展示了如何通过增加训练特征、使用多项式特征、减少正则化或切换复杂模型(如XGB回归)来改善模型性能。同时,增加训练样本和正则化也可用于降低方差。
摘要由CSDN通过智能技术生成

笔者之前写过篇有关学习曲线和过拟合的,里面表述不是非常清晰。最近刚刚刷完吴恩达老师2017的机器学习课程,又看到吴恩达老师的深度学习中1.5节。 所以,就来了兴致,准备把高偏差和高方差梳理下记录下来。

一、高偏差和高方差是什么

这里直接用吴恩达老师的机器学习课程的图来做解释
非常直观

高偏差(High bias)

在这里插入图片描述
对于高偏差的模型增加训练数据并不会改善模型的效果

高方差(High vars)

在这里插入图片描述
对于高方差的模型增加训练数据会在一定程度上改善模型的效果

二、改善策略

我们将在下面的数据集上演示

x = np.array(list(range(2000)) + list(range(50)) + list(range(20)) + list(range(10))) + 1
y = 2 * np.log(x * x) + np.random.rand(len(x)) * 3 + np.cos(x)
plt.scatter(x, y, s=5, alpha=0.6)
plt.show()

在这里插入图片描述

模型简单训练和绘制学习曲线如下

def sklearn_plot_learning_curves(model_in, x_in, y_in, ax=None):
    x_train, x_test, y_train, y_test = train_test_split(x_in, y_in, test_size=0.25)
    y_train = y_train.reshape((-1, 1))
    y_test = y_test.reshape((-1, 1))
    train_errors, test_errors = [], []
    for m in tqdm(range(1, len(x_train), 20)):
        model_t = model_in.fit(x_train, y_train)
        y_train_pre = model_t.predict(x_train[:m])
        y_test_pre = model_t.predict(x_test)

        train_errors.append(mean_squared_error(y_train[:m], y_train_pre))
        test_errors.append(mean_squared_error(y_test, y_test_pre))

    print('y_test_pre.shape:', y_test_pre.shape)
    ax.plot(train_errors, 'r-+', lw=2, label='train', alpha=0.6)
    ax.plot(test_errors, 'b-', lw=2, label='test', alpha=0.6)
    ax.legend(loc='upper right')
    ax.set_title(f"total sample: {x_in.shape[0]}")
    return model_t

def sklearn_simple_train(model_in, x, y, add_log=False):
    """
    单一特征训练
    """
    fig, axes = plt.subplots(1, 2, figsize=(16, 6))
    if add_log:
        reg_ = sklearn_plot_learning_curves(model_in, np.c_[x, np.log1p(x)], y, ax=axes[0])
    else:
        reg_ = sklearn_plot_learning_curves(model_in, x, y, ax=axes[0])
    x_p = np.linspace(0, x.shape[0], 100)
    if add_log:
        y_p = reg_.predict(
            np.c_[x_p.reshape((-1, 1)), np.log1p(x_p.reshape((-1, 1)))]
        )
    else:
        y_p = reg_.predict(x_p.reshape((-1, 1)))

    axes[1].scatter(x, y, s=5, alpha=0.6)
    axes[1].scatter(x_p, y_p, s=5, alpha=0.6)
    axes[1].set_title(f'add_log: {add_log}')
    plt.show()

改善高偏差(High bias)

lr = LinearRegression()
sklearn_simple_train(lr, x, y)

对于单一维度简单模型拟合,出现高偏差,增加数据并不会改善模型
在这里插入图片描述
在这里插入图片描述

  • 增加训练特征
  • 增加多项式特征
    • 增加了特征,显然从原先的cost大于8, 到现在的1.3左右,从拟合线上看,也是显著好转。

在这里插入图片描述

  • 减少正则
  • 在不增加数据和特征的情况下,还可以采用复杂的模型
    • 如 xgb的树回归
xgb_lr = XGBRegressor()
sklearn_simple_train(xgb_lr, x, y)

在这里插入图片描述

改善高方差(High vars)

  • 增加更多的训练样本
    • 从我们采用xgb树回归的时候,我们发现存在较大的方差,所以,我们可以考虑增加数据量
    • 增加训练数据果然达到了我们所需要的效果
      在这里插入图片描述
  • 减少训练特征
  • 增加正则
  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Scc_hy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值