机器学习偏差与方差

本文探讨了机器学习中模型的偏差与方差问题,提出了通过增加样本、减少特征、调整正则化参数等方法来解决。介绍了模型选择的策略,包括交叉验证和学习曲线,并通过实例展示了如何利用正则化参数改善模型的过拟合或欠拟合状态。文章以线性回归为例,分析了不同模型的偏差-方差属性,并给出了数据处理和模型优化的代码实现。
摘要由CSDN通过智能技术生成

一、应用机器学习的建议
(1)模型预测未知数据时发现有较大误差,可考虑采用下面的几种方法:
1、收集更多的训练样本;
2、尝试减少特征的数量;
3、尝试获得更多的特征;
4、尝试增加多项式特征;
5、尝试减少正则化参数λ;
6、尝试增加正则化参数λ。
(2)评估假设函数的方法:将数据分成训练集和测试集,典型的分割方法是按照7:3的比例(随机)。对训练集进行学习得到参数θ,利用测试集计算测试误差,即代价函数J。
(3)从多个模型中选择一个更能适应一般情况的模型,可以使用交叉验证集。把数据分为三个部分,training set训练集、cross validation set交叉验证集cv、test set测试集,典型比例是6:2:2。模型选择的方法是:
1、使用训练集训练出多个模型;
2、用这些模型分别对交叉验证集计算出交叉验证误差;
3、选取交叉验证误差最小的模型;
4、用步骤3选出的模型对测试集计算得出泛化误差。
在这里插入图片描述
(4)模型欠拟合时,偏差较大。模型过拟合时,方差较大。判断模型属于哪种问题,可以将训练集和交叉验证集的代价函数误差与多项式的次数绘制在同一张图上分析:
在这里插入图片描述
多项式次数低时,训练误差和验证误差都大,两者接近,模型欠拟合;次数高时,训练误差小,验证误差大,后者远大于前者,模型过拟合。
(5)正则化参数λ太大时,模型欠拟合,偏差较大。正则化参数λ太小时,模型过拟合,方差较大。λ值的选择通常是0—10之间的呈现2倍关系的值,如0,0.01,0.02,0.04,0.08,0.16,0.32,…,10。选择λ的方法为:
1、使用训练集训练出多个不同程度正则化的模型;
2、用这些模型分别对交叉验证集计算出交叉验证误差;
3、选择出交叉验证误差最小的模型;
4、运用步骤3选出的模型对测试集计算出泛化误差,同时将训练集和交叉验证集模型的代价函数误差与λ的值绘制在一张图上:
在这里插入图片描述
当λ较小时,训练集误差较小而交叉验证集误差较大。随着λ的增加,训练集误差不断增加,而交叉验证集误差则是先减小后增加。
(6)学习曲线可以判断算法是否处于偏差、方差问题,它将训练集误差和交叉验证集误差作为训练集样本数量(m)的函数绘制图表。当训练较少行数据的时候,模型能够非常完美地适应较少的训练数据,但是不能很好地适应交叉验证集数据或测试集数据。
在这里插入图片描述
在高偏差即欠拟合的情况下,训练集增加数据不一定有帮助。在高方差即过拟合的情况下,训练集增加数据可能可以提高算法效果。
(7)针对偏差和方差问题的改进策略:
1、获得更多的训练样本——解决高方差;
2、尝试减少特征的数量——解决高方差;
3、尝试获得更多的特征——解决高偏差;
4、尝试增加多项式特征——解决高偏差;
5、尝试减少正则化程度λ——解决高偏差;
6、尝试增加正则化程度λ——解决高方差。
简单神经网络参数较少,容易欠拟合,但计算量小;复杂神经网络参数较多,容易过拟合,可使用正则化来修正。通常选择较大的神经网络并采用正则化处理比采用较小的神经网络效果要好。
(8)构建一个学习算法的推荐方法为:
1、从一个简单的能快速实现的算法开始,实现该算法并用交叉验证集测试这个算法;
2、绘制学习曲线,决定是增加更多数据,或者添加更多特征,还是其他提高算法表现的选择;
3、进行误差分析:人工检查交叉验证集中算法预测错误的样本,看看这些样本是否有某种系统化的趋势。
二、以吴恩达机器学习课程练习材料实现,使用线性回归来研究具有不同偏差-方差属性的模型。背景是基于水库水位的变化来预测大坝的出水量。代码实现来源参考:吴恩达机器学习作业Python实现(五):偏差和方差
原始数据集以matlab的数据存储格式.mat保存,数据集共分为三部分:训练集、交叉验证集和测试集,其中x表示水位的变化,y表示大坝的出水量。
原始数据处理代码如下:

from scipy.io import loadmat
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as opt

data = loadmat('bias_va.mat')  #读取matlab格式的数据集
#print(data.keys())
X, y = data['X'], data['y'] #获得训练集数据
Xval, yval = data['Xval'], data['yval'] #获得交叉验证集数据
Xtest, ytest = data['Xtest'], data['ytest'] #获得测试集数据
X = np.insert(X, 0, 1, axis=1)  #各特征集前面添加一列1,以便计算截距项
Xval = np.insert(Xval, 0, 1, axis=1)
Xtest = np.insert(Xtest, 0, 1, axis=1)
#print(X.shape,y.shape)
#print(Xval.shape,yval.shape)
#print(Xtest.shape,ytest.shape)

相关函数实现代码如下:

def plotData(): #绘制训练集数据
    plt.figure(figsize=(8, 5))  #设置图的大小
    plt.scatter(X[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值