即误差 偏差 方差 不可避免的标准差 之间,是什么关系? 先上结论:
误差来源有三个:
- Irreducible Error,即不可避免误差部分,刻画了当前任务任何算法所能达到的期望泛化误差的下限,即刻画了问题本身的难度;
- Bias,即偏差部分,刻画了算法的拟合能力,Bias偏高表示预测函数与真实结果相差很大;
-
Variance,即方差部分,则代表 “同样大小的不同数据集训练出的模型” 与 “这些模型的期望输出值” 之间的差异。训练集变化导致性能变化,Var高表示模型很不稳定。
上图理解:
bias:
看样本拟合得怎么样?由上面靶图可以分析,bias决定点离靶中心位置,bias越低离靶心越近,代表越好,途径就是复杂化模型,增加模型的参数,但是可能导致过拟合,对应high variance情况。low bias 可以理解打靶打的相对比较准,在靶心附近周围。
varience:
看样本上训练出来的模型在测试集上的表现,varience决定点的分散程度,varience越低越集中,代表越好,途径就是简化模型,减少模型的参数,但是可能导致欠拟合,对应high bias情况。low variance可以理解打靶打的比较稳,比较集中。
综上所述:
由曲线图可以理解,bias和varience需要tradeoff来使用。
补充:
上述说明的泛化误差,并不同于cross-validation里面说的Bias与Variance。
上述内容并没有涉及到模型选择的问题,我们用训练集训练出来一个预测模型,就拿测试集去计算预测误差。如果我们有一系列模型需要选择的话,当然不能用测试集去做选择,因为这相当于提前偷看了测试集的数据,得到的测试误差会低估真实的预测误差。
所以我们需要在测试集以外,另外寻找一个统计量作为预测误差的估计值,以这个统计量来作为模型选择的标准。这样的统计量有基于Optimism的Cp,AIC,基于贝叶斯方法的BIC,还有Vapnik-Chervonenkis维度,验证误差等,其中验证误差需要另外找一个独立的验证集,因此在样本量不足,分割出一个验证集并不现实的情况,我们就有了Cross Validation的方法。
我们使用Cross Validation的目的是获得预测误差的无偏估计量CV,从而可以用来选择一个最优的Theta*,使得CV最小。假设K-folds cross validation,CV统计量定义为每个子集中误差的平均值,而K的大小和CV平均值的bias和variance是有关的:
其中,m = N/K 代表每个subset的大小, N是总的训练样本量,K是subsets的数目。当K较大时,m较小,模型建立在较大的N-m上,因此CV与Testing Error的差距较小,所以说CV对Testing Error估计的Bias较小。同时每个Subsets重合的部分较大,相关性较高,如果在大量不同样本中进行模拟,CV统计量本身的变异较大,所以说Variance高。反之亦然。
所以,Cross Validation是为了得到预测误差的估计值,bias是CV统计量的期望与预测误差的距离,variance是CV统计量自己的方差。这和模型泛化误差的分解是两回事。
交叉验证(CrossValidation)方法思想简介
以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标.常见CV的方法如下
1).Hold-Out Method
将原始数据随机分为两组,一组做为训练集,一组做为验证集,利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性.
2).K-fold Cross Validation(记为K-CV)
将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.
3).Leave-One-Out Cross Validation(记为LOO-CV)
如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.相比于前面的K-CV,LOO-CV有两个明显的优点:
①
a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。
②
b.实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。
但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间.
K-fold Cross Validation(K-折交叉验证,记为K-CV)
下图表示k=10
交叉检验代码:
Let's now see how we can perform K-fold-cross-validation using scikit-learn on the auto-dataset.
In addition to the usual imports, you should also import the function cross_val_score() from sklearn.model_selection.
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error as MSE
from sklearn.model_selection import cross_val_score
# Set seed for reproducbility
SEED = 123
# Split data into 70% train and 30% test
X_train, X_test, y_train, y_test = train_test_split(X, y
test_size=0.3,
random_state=SEED)
# Instantiate decision tree regressor and assign it to 'dt'
dt = DecisionTreeRegressor(max_depth=4,
min_samples_leaf=0.14,
random_state=SEED)
Next, call cross_val_score()by passing dt, X_train, y_train; set the parameters cv to 10 for 10-fold-cross-validation and scoring to neg_mean_squared_error to compute the negative-mean-squared-errors.
# Evaluate the list of MSE ontraind by 10-fold CV
# Set n_jobs to -1 in order to exploit all CPU cores in computation
MSE_CV = - cross_val_score(dt, X_train, y_train, cv=10,
scoring='neg_mean_squared_error',
n_jobs=1)
The scoring parameter was set so because cross_val_score () does not allow computing the mean-squared-errors directly.
The result is a numpy-array of the 10 negative mean-squared-errors achieved on the 10-folds. You can multiply the result by -1 to obtain an array of CV-MSE.
The CV-mean-squared-error can be determined as the mean of MSE_CV.
# Fit 'dt' to the training set
dt.fit(X_train,y_train)
# Predict the labels of training set
y_pred_train = dt.predict(X_train)
# Predict the labels of test set
y_pred_test = dt.predict(X_test)
# CV MSE
print('CV MSE: {:.2f}'.format(MSE_CV.mean()))
CV MSE: 20.51
Finally, you can use the function MSE to evaluate the train and test set mean-squared-errors.
# Training set MSE
print('Train MSE: {:.2f}'.format(MSE(y_train, y_pred_train)))
Train MSE: 15.30
# Test set MSE
print('Test MSE: {:.2f}'.format(MSE(y_test, y_pred_test)))
Test MSE: 20.92
Given that the training set error is smaller than the CV-error, we can deduce that dt overfits the training set and that it suffers from high variance. Notice how the CV and test set errors are roughly equal.
参考链接:
交叉验证 Cross-validation
ML:图解Error = Bias^2 + Var + Irreducible Error
知乎:机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?