4.2.2 欠拟合与过拟合、偏差与方差
前文一直提到机器学习建模是权衡的过程,4.2.1节的正则化就是调节欠拟合(Underfitting)与过拟合(Overfitting)的有效手段。过拟合指的是,模型对训练数据过度学习(例如学习了数据中不该学习的噪声),使得模型在训练集上表现很好,而在测试集上表现很差的现象(即不能推广、泛化到新数据集)。欠拟合指的是,模型对训练数据学习不充分,模型性能表现很差。但是,该定义并没有给出具体的差异阈值表明是否过拟合或欠拟合,这对实践的指导意义打了一些折扣。
在最小化经验风险的学习范式下,机器学习优化算法的目标是最小化误差。训练模型、调优模型的过程就是算法和训练数据集“较劲”的过程。正如前文所述,“在有限的样本下,一旦设定学习目标就有过拟合的风险”,所以机器学习更多关注的是过拟合。过拟合描述的是模型在新数据集上泛化的概念,它往往和模型选择一并出现,如图4-12所示。该多项式模型选择误差曲线表明:起初随着多项式次数的增加,训练集和验证集上的误差都在减少,直到从多项式次数达到7,验证误差急剧上升,表明模型已经过拟合。
图4-12 多项式模型选择误差曲线示意图
在实践中,由于模型参数较多,各参数共同作用决定模型效果,单个参数与模型表现也并非简单的单调关系,绘制曲线观察并不现实。但是,可以绘制重要的模型参数误差曲线,观察参数调整方向与误差的趋势,并以此设计合理的参数搜索范围,sklearn中提供了一个很好的接口——validation_curve。[1]
validation_curve用来判断是否欠拟合或过拟合。sklearn中提供的learning_curve,实践中用于在模型效果表现不好的场景下,查看是否由于样本量过小而造成模型偏差或方差过大,见4.1.8节。
和欠拟合与过拟合不同的是,偏差与方差(Bias-Variance)从理论层面对泛化误差进行了分解和研究。其中训练集D,yD表示为数据集上的标记,y为数据集上的真实标记,学得的模型f,其期望为,如式(4-11)所示。
上式每项都有平方项,可简写成式(4-12),三项分别是偏差、方差和噪声(例如不正确的类标签或不准确的测量值):
上述的误差描述如下:偏差刻画了学习算法本身的拟合能力,方差刻画了数据扰动造成的波动,噪声刻画了学习问题本身的难度。这也正代表了模型泛化能力由学习算法、数据和问题本身三者共同决定。
另外,从拟合目标的角度也可以将误差分解为:算法在有限时间迭代、求解后输出的模型与最小化经验风险模型的差异;最小化经验风险模型与最小化期望风险模型的差异;所选算法空间下最优期望风险与全局最优期望风险的差异。
在实际建模中,偏差与方差、过拟合与欠拟合由模型评估得到,可参考4.1.9节的模型评估。例如,偏差间接可由模型性能指标(AUC、KS)衡量;方差则由多次运行不同数据集划分下的性能指标波动得到。这些指标正是评估报告中的内容,示例代码如下:
def example(X, y, times, test_size, random_state=42): auc_arr = [] ks_arr = [] # 多轮训练评估 for ii in range(times): r = np.random.randint(1000) # 划分数据集 X_train, X_test, y_train, y_test = \ sklearn.model_selection.train_test_split( X, y, stratify=y, test_size=test_size, random_state=random_state) # 训练模型-伪代码 mm = model_train(X_train, y_train) # 计算指标-伪代码 auc_t, ks_t = cal_auc_ks(mm, X_test, y_test) auc_arr.append(auc_t) ks_arr.append(ks_t) # 求平均 print('mean:auc={},ks={}'.format(np.mean(auc_arr), np.mean(ks_arr))) # 求方差 print('var:auc={},ks={}'.format(np.var(auc_arr), np.var(ks_arr)))
偏差与方差在实际建模中可通过技术手段减少,而噪声则不能在建模过程改变,是不可变的误差项,机器学习的目标就是减少可被改变的偏差与方差。理想情况下,我们期望偏差与方差同时小,但由图1-4可知,偏差与方差会相互影响,只能权衡取折中得到较好的模型。为了解决偏差与方差间的问题,已经发展了很多相应的学习算法,比如Boosting关注解决偏差问题,Bagging关注解决方差问题,以及前文描述的更具体的正则化。
一般来说欠拟合与过拟合、偏差与方差是相近的一对概念,常常成对出现。图4-13显示了欠拟合与过拟合、偏差与方差的关系的两种极端情况,以便读者解释。
图4-13 欠拟合与过拟合、偏差与方差的关系
其中:
1)假设当前模型正确拟合所有数据点,那么其bias为0,方差可能很大。
2)假设模型输出为常数,无法正常进行预测,那么其偏差很高;任何数据集上,模型输出都一致,没有波动,所以其方差为0。
如果我们结合图1-4的曲线来描述模型复杂度与过拟合的关系时,可能会有一定的误导性:复杂的模型就会过拟合,简单的模型就会欠拟合。实践上来看,模型复杂度并不是过拟合和欠拟合的充分条件,一个复杂的模型(由于其构造方式,比如能减少方差的随机森林)不一定过拟合,一个简单模型也不一定欠拟合。
为了防止过拟合(高方差),我们的学习目标不再是最小化偏差,而转变为最小化输出差异或最小化各数据集的平均误差。这是一个NP难问题,在有限的时间内无法求解。实践中我们期望在众多的候选算法中选择一个较优的模型,这需要相应的模型评估和选择方法,例如留出法(Hold-out)、自助法(Bootstrapping)和交叉验证(Cross validation)。其中留出法可视为交叉验证的特例,自助法大部分集成算法内部已实现,下文我们重点讲述交叉验证法。
[1] https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.validation_curve.html