首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Machine Learning-模型评估与调参 ——K折交叉验证

为什么要评估模型的泛化能力,相信这个大家应该没有疑惑,一个模型如果性能不好,要么是因为模型过于复杂导致过拟合(高方差),要么是模型过于简单导致导致欠拟合(高偏差)。如何评估它,用什么数据来评估它,成为了模型评估需要重点考虑的问题。

我们常规做法,就是将数据集划分为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折交叉验证的代码实现:

代码语言:javascript
复制
 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已经有现成封装好的方法,直接调用即可。

代码语言:javascript
复制
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)))
代码语言:javascript
复制
—End—
下一篇
举报
领券