K折验证交叉验证

K折验证交叉验证

       交叉验证既可以解决数据集的数据量不够大问题,也可以解决参数调优的问题。这块主要有三种方式:简单交叉验证(HoldOut检验)、k折交叉验证(k-fold交叉验证)、自助法。该文仅针对k折交叉验证做详解。

简单交叉验证

在这里插入图片描述
方法:将原始数据集随机划分成训练集和验证集两部分

       比如说,将样本按照70%~30%的比例分成两部分,70%的样本用于训练模型;30%的样本用于模型验证。
缺点:(1)数据都只被所用了一次,没有被充分利用
          (2)在验证集上计算出来的最后的评估指标与原始分组有很大关系。

 k折交叉验证

       为了解决简单交叉验证的不足,提出k-fold交叉验证。 

1、首先,将全部样本划分成k个大小相等的样本子集;
2、依次遍历这k个子集,每次把当前子集作为验证集,其余所有样本作为训练集,进行模型的训练和评估;
3、最后把k次评估指标的平均值作为最终的评估指标。在实际实验中,k通常取10.


举个例子:这里取k=10,如下图所示:


(1)先将原数据集分成10份
(2)每一将其中的一份作为测试集,剩下的9个(k-1)个作为训练集,此时训练集就变成了k * D(D表示每一份中包含的数据样本数)

(3)最后计算k次求得的分类率的平均值,作为该模型或者假设函数的真实分类率

在这里插入图片描述

       交叉验证的方式,要简单于数学理解,而且具有说服性。需要谨记一点,当样本总数过大,若使用留一法时间开销极大(具体API和参数下面有说明)。

自主法    

       自助法是基于自助采样法的检验方法。对于总数为n的样本合集,进行n次有放回的随机抽样,得到大小为n的训练集
       n次采样过程中,有的样本会被重复采样,有的样本没有被抽出过,将这些没有被抽出的样本作为验证集,进行模型验证。

cross_val_score参数设置

sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, error_score=’raise-deprecating’)

参数:

estimator: 需要使用交叉验证的算法
X: 输入样本数据
y: 样本标签
groups: 将数据集分割为训练/测试集时使用的样本的组标签(一般用不到)
scoring: 交叉验证最重要的就是他的验证方式,选择不同的评价方法,会产生不同的评价结果。可去官方查看详细评价方法解释
具体如下:

在这里插入图片描述

cv: 交叉验证折数或可迭代的次数。若估计器是一个分类器,并且y是二进制或多类,则使用StratifiedKFold(cv等价于StratifiedKFold,即cv=5 <=> cv=StratifiedKFold(n_splits=5));其他情况,就用KFold(cv=KFold(n_splits=n))。
n_jobs: 同时工作的cpu个数(-1代表全部)
verbose: 详细程度
fit_params: 传递给估计器(验证算法)的拟合方法的参数
pre_dispatch: 控制并行执行期间调度的作业数量。减少这个数量对于避免在CPU发送更多作业时CPU内存消耗的扩大是有用的。该参数可以是:没有,在这种情况下,所有的工作立即创建并产生。将其用于轻量级和快速运行的作业,以避免由于按需产生作业而导致延迟。
       一个int,给出所产生的总工作的确切数量
       一个字符串,给出一个表达式作为n_jobs的函数,如’2 * n_jobs
error_score: 如果在估计器拟合中发生错误,要分配给该分数的值(一般不需要指定)

cross_var_score使用方法:

from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsRegressor
import matplotlib.pylab as plt
train_data = pd.read_csv("E:/competitions/kaggle/House Price/train.csv")
X = pd.DataFrame(train_data["GrLivArea"].fillna(0))
y = train_data["SalePrice"]
score = []
alphas = []
for alpha in range(1,100,1):
    alphas.append(alpha)
    rdg = KNeighborsRegressor(alpha)
    sc = np.sqrt( -cross_val_score(rdg,X,y,scoring = "neg_mean_squared_error", cv = 10))
    score.append(sc.mean())
plt.plot(alphas,score)
plt.show()


这里使用了neg_mean_squared_error作为评分,画出损失——alpha的关系图如下:在这里插入图片描述
由上图可以看到,在alpha = 23的时候,其损失是最小的。这样便完成了选择参数的任务。

<think>好的,我现在需要回答用户关于k交叉验证的问题。用户已经提供了三个站内引用,我需要结合这些引用来组织答案。 首先,用户的上一次问题关于CART决策树,而当前问题转向k交叉验证,所以可能需要确保答案的结构清晰,符合用户之前的要求,比如使用中文、数学公式用$...$,独立公式用$$...$$,以及生成相关问题。同时要注意引用标记。 用户给出的引用中,引用[1]解释了K交叉验证的特殊情况是留一法,但指出实际工作中可能不常用,尤其是数据量大时。引用[2]提供了KFold的代码示例,说明如何划分数据集。引用[3]提到k交叉验证的参数管理和GPU使用,可能涉及实现细节。 我需要先定义k交叉验证,然后说明其步骤,可能引用中的内容,比如分成k个子集,k-1训练,1个验证,循环k次。要提到它的优点,比如减少过拟合,提高模型泛化能力,同时结合引用[1]提到的留一法作为特例,但指出其计算成本高,尤其在数据量大时。 然后,需要讨论k的取值影响,比如k=5或10的常见选择,以及如何平衡偏差和方差。接下来,可以结合引用[2]中的代码示例,说明如何在scikit-learn中使用KFold,展示具体实现步骤,比如导入KFold,设置n_splits,分割数据等。 还要提到k交叉验证的变体,如分层K(StratifiedKFold)和组K(GroupKFold),这些在引用[2]中有提及,适用于分类问题和保持组结构的情况。最后,结合引用[1]和实际应用,指出虽然理论上有优势,但需要考虑计算资源,特别是在大数据场景下可能需要调整k值。 在数学公式部分,可能需要给出交叉验证误差的计算公式,比如平均误差。同时,确保使用正确的LaTeX格式,如$$...$$。最后生成相关问题,参考用户之前的示例,比如k的选取、与留一法的比较、变体区别等。 检查是否有遗漏的引用内容,比如引用[3]提到的参数管理和GPU使用,可能需要在实现注意事项中提及,但用户主要询问的是概念,所以可能简要带过。确保回答结构符合用户要求的层次,分点清晰,代码块正确,引用标记正确放置。</think>### K交叉验证详解(基于站内知识整合) #### 一、核心定义 **K交叉验证**(K-Fold Cross Validation)是机器学习中**评估模型泛化能力**的核心方法,其定义为: $$ CV_{error} = \frac{1}{k}\sum_{i=1}^k Error_i $$ 其中$k$为数,$Error_i$表示第$i$验证集的评估误差(如引用[1]中描述的误差计算逻辑) #### 二、算法流程 ##### 1. 标准步骤 ```mermaid graph LR A[原始数据集] --> B[随机划分k个互斥子集] B --> C{循环k次} C --> D[第i次取第i个子集作为验证集] D --> E[剩余k-1个子集合并为训练集] E --> F[训练模型并计算验证误差] F --> C C --> G[输出k次误差平均值] ``` ##### 2. 关键特性 - **数据利用率**:每个样本都参与且仅参与1次验证(对比留出法的数据浪费问题) - **误差稳定性**:通过多轮平均降低随机划分带来的波动(如引用[2]中KFold的实现方式) #### 三、scikit-learn实现示例 ```python from sklearn.model_selection import KFold import numpy as np # 模拟数据集(6个样本) X = np.array([[1,2],[3,4],[5,6],[7,8],[9,10],[11,12]]) y = np.array([0,1,0,1,0,1]) # 4交叉验证(如引用[2]代码示例) kf = KFold(n_splits=4) for train_index, test_index in kf.split(X): print(f"训练集索引:{train_index} 测试集索引:{test_index}") X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] ``` #### 四、关键参数解析 | 参数 | 作用域 | 典型取值 | 注意事项 | |-------------|--------------------|----------|--------------------------| | `n_splits` | 数控制 | 5/10 | 数据量>10k时建议≤5(如引用[1]的10w数据警告) | | `shuffle` | 数据打乱 | True | 时间序列数据需禁用 | | `random_state` | 随机种子 | 42 | 保证实验可复现性 | #### 五、方法对比 | 验证方法 | 数据利用率 | 计算成本 | 适用场景 | |---------------|------------|----------|--------------------------| | 留出法 | 低 | 低 | 超大数据集初步验证 | | **K交叉验证** | 高 | 中 | 中小数据集精细评估 | | 留一法(LOO) | 极高 | 极高 | 极小数据集(如引用[1]中N=100时) | #### 六、工程实践要点 1. **分层抽样优化**: - 使用`StratifiedKFold`保持类别分布(如引用[2]提到的变体) - 特别适用于分类任务中的不平衡数据集 2. **计算资源管理**: - GPU加速时注意内存分配(如引用[3]中GPU使用提示) - 并行化策略:同时训练不同的模型 3. **结果解读准则**: - 关注**标准差**:若标准差>均值10%,说明模型稳定性不足 - 对比**训练误差vs验证误差**:差值>20%提示过拟合 [^1]: 交叉验证计算成本说明引自站内《交叉验证-原理小结》 [^2]: KFold实现方法引自站内《特征工程数据集划分方法》 [^3]: GPU加速策略参考站内《k交叉验证参数管理》 ### 相关问题 1. 如何选择最优的k值?k=5和k=10有什么本质区别? 2. K交叉验证与留一法(LOO)在什么场景下会失效? 3. 分层K交叉验证(StratifiedKFold)解决了哪些具体问题?
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值