机器学习--模型评估和调整--K 倍交叉验证
最编程
2024-05-06 11:23:28
...
为什么要评估模型的泛化能力,相信这个大家应该没有疑惑,一个模型如果性能不好,要么是因为模型过于复杂导致过拟合(高方差),要么是模型过于简单导致导致欠拟合(高偏差)。如何评估它,用什么数据来评估它,成为了模型评估需要重点考虑的问题。
我们常规做法,就是将数据集划分为3部分,分别是训练、测试和验证,彼此之间的数据不重叠。但,如果我们遇见了数据量不多的时候,这种操作就显得不太现实,这个时候k折交叉验证就发挥优势了。
K折交叉验证原理
先不多说,先贴一张原理图(以10折交叉验证为例)。
k折交叉验证步骤:
Step 1:使用不重复抽样将原始数据随机分为k份;
Step 2:其中k-1份数据用于模型训练,剩下的那1份数据用于测试模型;
Step 3:重复Step 2 k次,得到k个模型和他的评估结果。
Step 4:计算k折交叉验证结果的平均值作为参数/模型的性能评估。
K折交叉验证实现
K折交叉验证,那么K的取值该如何确认呢?一般我们默认10折,但根据实际情况有所调整。我们要知道,当K很大的时候,你需要训练的模型就会很多,这样子对效率影响较大,而且每个模型的训练集都差不多,效果也差不多。我们常用的K值在5~12。
我们根据k折交叉验证的原理步骤,在sklearn中进行10折交叉验证的代码实现:
1import numpy as np
2from sklearn.model_selection import StratifiedKFold
3kfold = StratifiedKFold(n_splits=10,
4 random_state=1).split(X_train, y_train)
5scores = []
6for k, (train, test) in enumerate(kfold):
7 pipe_lr.fit(X_train[train], y_train[train])
8 score = pipe_lr.score(X_train[test], y_train[test])
9 scores.append(score)
10 print('Fold: %s, Class dist.: %s, Acc: %.3f' % (k+1,
11 np.bincount(y_train[train]), score))
12print('nCV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
output:
当然,实际使用的时候没必要这样子写,sklearn已经有现成封装好的方法,直接调用即可。
1from sklearn.model_selection import cross_val_score
2scores = cross_val_score(estimator=pipe_lr,
3 X=X_train,
4 y=y_train,
5 cv=10,
6 n_jobs=1)
7print('CV accuracy scores: %s' % scores)
8print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))
—End—
上一篇: 如何计算一般和特殊装配力
下一篇: 48 竹林风--正史文学与阮籍简介