1、过拟合与欠拟合
对于包含噪音的数据集,进行数据拟合的时候,总能找到一条曲线穿过所有样本点,使得模型的预测结果与给定训练集内的样本真实标签完全一致,取得极低的预测误差;但这意味着算法所训练的模型过多的表达了数据之间的噪音关系,称为 过拟合(over fitting)。欠拟合(under fitting) 则表明算法所训练的模型不能完整表述数据关系。
则如果模型拟合程度不高,意味着模型没有很好地捕捉到数据特征,从而也不能够很好地用于生产环境。 在多项式回归预测分析中,选择过高或过低的幂来构造特征,就会产生欠拟合和过拟合的问题。
2 模型泛化能力
模型的泛化能力(generalization ability) 指的是训练出来的模型对新样例的预测能力。如果预测效果非常差,称模型的泛化能力弱。一个好的算法模型需要拥有较强的的泛化能力。这也是模型训练和测试的意义需要将原始采样数据拆分出 训练集 和 测试集 来训练和评估模型的泛化能力。
两种不同的算法模型的 模型泛化能力评估 简单的可使用在测试集上的 均方误差 (MSE = $\sum_{i=1}^{m}{(y^{(i)} - \hat {y^{(i)}})^{2}}$) 。
3 模型准确度与模型复杂度
① 对于训练集,模型的复杂度增加(在多项式回归中意味着参数的增多),模型对于训练集的预测准确率会越来越高。
② 对于测试集,随着模型的复杂度增加,对测试集的预测准确率会逐渐提高,但是当超过一个复杂度阈值之后准去率会转而逐渐降低,经历了一个欠拟合到过拟合的过程。
4 验证数据集与交叉验证
当使用训练集来训练模型,而仅仅使用测试集来调整模型,这样通过在测试集上的表现来调优的模型很可能出现 针对测试集的过拟合 问题。一个较为可靠的模型创建与测试方法应该通过将原始采样数据分割成 训练集、验证数据 和 测试集,通过在使用训练集创建模型,然后使用验证数据集来进行模型的评估和模参调整,得到一个对于验证数据集而言已经处于最优的模型,最后使用 测试集 来衡量通过了验证数据集调整后得到的最终模型的泛化能力;该过程 测试集 数据不参与模型的训练和调参,而是作为真实生产环境中新产生的不可知样例的模拟,最终用作衡量模型在生产环境中的表现能力。
4.1 交叉验证评估法
为了使得模型的训练和评估过程具有足够高的 随机性 ,交叉验证方法 提出分割训练集分成 k 份(k-folds cross validation,简单情况下k取3即可),通过组合这 k 份数据为训练集和验证机,每次训练出$k$个模型,和取得$k$ 个模型的性能评分,最后取这 $k$ 个模型的性能指标均值用作衡量当前超参数下的模型性能,作为进行模型超参数调整的依据。通过取均值的方式,可以有效降低携带极端值的数据集对模型评估上的影响。
4.2 使用Cross Validation 进行模型超参数搜索
import numpy as np
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn import datasets
### Prepare data
digits = datasets.load_digits()
from sklearn.model_selection import train_test_split
Train_X,Test_X,Train_Y,Test_Y = train_test_split(digits.data,digits.target,test_size= 0.2,random_state=666)
### Use cross_validate_score to Search Best Parameters
best_score = .0
best_parameter = None
for k in range(2,11):
knn_clf = KNeighborsClassifier(n_neighbors = k)
cur_score = np.mean(cross_val_score(knn_clf,Train_X,Train_Y,cv = 5)) ### 使用交叉验证得到当前超参数设置下的模型得分; 方法参数cv=5 设置期望每次训练5模型进行评分。
if cur_score > best_score: best_score ,best_parameter = cur_score , k
print(best_score,best_parameter)
### 最后使用测试集计算模型的最终准确度评分
knn_clf = KNeighborsClassifier(n_neighbors = best_parameter)
knn_clf.fit(Train_X,Train_Y)
knn_clf.score(Test_X,Test_Y)
交叉验证的评估得分单比使用一个训练集和测试集来获得的模型评分要更可靠地反映模型的泛化能力。
4.3 留一法 LOO-CV
k-folds cross validation 方法由于每次需要训练出多个模型,虽然该方法得出的评分结果较可靠,但性能相比整体拖慢了k倍。在$k$ 需要取值非常大的极端情况下,LOO-CV(Leave-One-Out Cross Validation) 提出将训练集分成 m 份,每次将 m-1 份样本用于模型训练,剩下的一份用作模型评估,将所有这些模型结果的指标平均用作衡量当前超参数下模型的准确度。有点即使脱离的随机的影响,最接近模型真正的性能指标。缺点计算量巨大。
5 偏差方差权衡 Bias Variance Trade off
- 偏差(Bias) $\ \ \ \ \ \ $ 数据点偏离目标中心的程度;
- 方差(Variance) $\ $数据点整体分布的稀疏程度。
机器学习任务目的是为了训练一个能够基本准确预测一个问题答案的算法模型,抽象理解待解决的问题为靶心,根据数据拟合生成的模型即射在靶子上的标枪,这些模型相对于问题本身就会犯 方差和偏差 两种错误从而不能很好的预测在问题允许误差范围内的答案。
$$\small {\bf {模型误差}} = \small {\bf {模型偏差(Bias)}} + \small {\bf {模型方差(Variance)}} + \small {\bf {不可避免的误差}}$$
模型中 不可避免的误差 成因复杂,多来源于数据采集噪音。
导致 偏差 错误的成因:
- ① 对问题的前提假设不正确(如非线性数据使用了线性拟合);
- ② 研究特征与问题本身高度不相关(如通过研究学生的姓名来预测学生成绩);
在算法层面高偏差主要表现为出现 欠拟合 现象。方差 错误:主要表现出数据哪怕出现一点点扰动都会较大的影响模型。通常原因就是 模型太复杂化 ,如高阶多项式回归。在算法层面高方差主要表现为出现 过拟合 现象。
5.2 一般ML算法模型与Bias & Var两类错误的关系:
非参数学习 通常属于 高方差算法,因为前提不对数据关系进行任何假设,高度依赖原始数据,对数据分布非常敏感。如kNN算法的判断结果仅取决于其k个邻居的投票,如果这个k个邻居本身就是存在错误测量,就会影响算法的预测结果准确度。
参$\ $数学习 通常属于 高偏差算法 ,这类算法通过参数与特征将问题规约成一个数学模型,对数据具有极强的前提假设,认为这些数据基本上是符合假设模型;如果数据不符合假设的数学模型,那么模型就会出错。如线性回归,对非线性关系的数据应用线性回归分析即产生非常大的偏差错误。
ML算法模型中方差与偏差的矛盾:降低偏差,会提高方差;降低方差,会提高偏差。
模型超参数调整任务就是平衡模型的方差和偏差;较高的偏差 意味着模型过于偏离原问题,较高的方差 意味着模型泛化能力太差。
5.3 降低模型的方差的解决方案
在机器学习算法的误差权衡任务中,最主要处理的是模型的方差错误(由模型复杂度主导),偏差错误主要来源于算法模型的错误选择,这在ML模型构建中通过推理假设还是很容易降低偏差错误的。
- 降低模型复杂度
- 减少数据维度;降噪
- 增加样本数
- 使用验证集(如调参时选用 Cross_Validation作为评估指标)
- 模型正则化