一、应用机器学习的建议
(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[