机器学习1:scikit-learn简介(3)—— 交叉验证

本文介绍了如何在机器学习中使用scikit-learn进行K折交叉验证,包括步骤详解、预处理数据和实际操作示例,通过乳腺癌数据集演示了如何运用cross_validate函数进行3折交叉验证以评估模型性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scikit-learn的介绍

一、机器学习的一般步骤

链接:机器学习的一般步骤

二、预处理数据

链接:预处理数据

三、交叉验证

K-折交叉验证

jupyter 将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的 平均数 作为此K-CV下分类器的性能指标。
scikit-learn提供了三个函数:
cross_val_scorecross_val_predictcross_validate

from sklearn.model_selection import cross_validate
pipe=make_pipeline(MinMaxScaler(),
                  LogisticRegression(solver='lbfgs', multi_class='auto',max_iter=1000, random_state=42))
# cv=3表示3折交叉验证
scores=cross_validate(pipe,digits.data,digits.target,cv=3,return_train_score=True)

使用交叉验证函数,我们可以快速检查训练和测试分数,并使用pandas快速绘图。

import pandas as pd
df_scores=pd.DataFrame(scores)
df_scores

输出:

	fit_time	score_time	test_score	train_score
0	0.128265	0.001		0.925249	0.988285
1	0.123709	0.000		0.943239	0.984975
2	0.115268	0.000		0.924497	0.993339

绘制箱型图

df_scores[['train_score', 'test_score']].boxplot()

输出:

<matplotlib.axes._subplots.AxesSubplot at 0x26ebac5fa58>

在这里插入图片描述

练习

接着使用上一个练习的管道(乳腺癌数据集)并进行3折交叉验证,而不是单个拆分评估。

pipe=make_pipeline(StandardScaler(),SGDClassifier(max_iter=1000))
scores=cross_validate(pipe,breast.data,breast.target,scoring='balanced_accuracy',cv=3,return_train_score=True)
df_scores=pd.DataFrame(scores)
df_scores[['train_score','test_score']].boxplot()

在这里插入图片描述
(完。)

<think>好的,我现在需要帮助用户理解三折交叉验证的定义和使用方法。用户之前询问了随机森林中max_features参数的设置,现在转向交叉验证,特别是三折交叉验证。首先,我需要确保自己准确掌握三折交叉验证的基本概念和步骤,然后以清晰的方式传达给用户。 首先,三折交叉验证属于交叉验证的一种,用于模型评估和超参数调优。交叉验证的核心思想是将数据集分成多个部分,轮流使用其中一部分作为验证集,其余作为训练集,以减小数据划分带来的偏差。三折交叉验证具体是将数据分为三个子集,每次用两个子集训练,一个子集验证,重复三次,取平均结果。 用户可能的需求是了解如何正确应用三折交叉验证,特别是在超参数调优和模型评估中。根据用户提供的引用[1],他们提到使用三折交叉验证来确定超参数,并且在模型评估中使用R2分数。因此,我需要结合这个例子,说明三折交叉验证在实践中的应用步骤。 接下来,需要解释三折交叉验证的具体步骤,可能包括数据划分、训练验证循环、结果聚合。同时,需要提到其优缺点,比如计算成本较低但方差可能较高,适合中小型数据集。此外,用户可能想知道如何在实际中使用,比如在Pythonscikit-learn库中如何实现,所以给出代码示例会很有帮助。 同时,用户之前的问题涉及随机森林的参数调优,可以指出三折交叉验证在调优中的应用,比如结合网格搜索。需要确保回答结构清晰,分点说明,并避免技术术语过于复杂,但保持准确性。还要注意引用用户提到的文献,比如引用[1]中的使用案例,增强回答的可信度。 最后,检查是否有遗漏点,比如与k折交叉验证的比较,何时选择三折,以及常见错误,比如数据泄露问题。确保回答覆盖定义、使用方法、实践建议和相关问题,帮助用户全面理解。</think>### 三折交叉验证的定义及使用方法 #### 一、核心定义 **三折交叉验证**(3-fold cross-validation)是机器学习中**评估模型泛化性能**和**调优超参数**的核心技术,其核心逻辑为: 1. **数据划分**:将原始数据集**均等分割为3个互斥子集**(称为"折"或fold) 2. **循环验证**:进行3轮训练-验证,每轮使用**2个子集作为训练集**,剩余1个作为验证集 3. **性能聚合**:最终结果取3次验证得分的平均值 数学表达式为: $$ \text{最终得分} = \frac{1}{3} \sum_{i=1}^{3} \text{Metric}(M_i, D_{\text{test}_i}) $$ 其中 $M_i$ 表示第$i$轮训练的模型,$D_{\text{test}_i}$ 为对应验证集[^1]。 --- #### 二、操作步骤详解 1. **数据预处理阶段** - **分层抽样**(Stratified Sampling):分类任务中需**保持每折的类别比例**与原始数据一致 - **乱序处理**:对数据集进行随机打乱,避免顺序偏差 - **划分比例**:若原始数据量$N$,则每折包含约$N/3$个样本 2. **训练-验证循环流程** | **轮次** | **训练集** | **验证集** | **模型动作** | |----------|-----------------|-----------------|-----------------------------| | 第1轮 | Fold2 + Fold3 | Fold1 | 训练模型 → 验证Fold1 | | 第2轮 | Fold1 + Fold3 | Fold2 | 训练模型 → 验证Fold2 | | 第3轮 | Fold1 + Fold2 | Fold3 | 训练模型 → 验证Fold3 | 3. **结果分析方法** - **性能指标选择**:根据任务类型选择: - 回归任务:R²分数(如引用[1]中的研究)、MSE - 分类任务:准确率、F1-score、AUC-ROC - **方差分析**:计算3次验证得分的标准差,评估模型稳定性 --- #### 三、典型应用场景 1. **超参数调优**(如引用[1]中的超参数选择) ```python from sklearn.model_selection import GridSearchCV from sklearn.ensemble import RandomForestRegressor param_grid = {&#39;max_depth&#39;: [5, 10, 15], &#39;n_estimators&#39;: [100, 200]} model = GridSearchCV(RandomForestRegressor(), param_grid, cv=3, scoring=&#39;r2&#39;) model.fit(X, y) print(f"最佳参数:{model.best_params_}") # 输出通过3交叉验证选出的最优参数组合 ``` 2. **小数据集建模** - 当样本量$N<1000$时,k=3能**平衡偏差与方差**: $$ \text{训练集量} = \frac{2}{3}N, \quad \text{验证集量} = \frac{1}{3}N $$ - 对比k=5或10时,训练数据量更充足 3. **计算效率优先场景** - 时间复杂度比较(假设单次训练耗时为$t$): $$ \text{3折总耗时} = 3t \quad vs. \quad \text{10折总耗时}=10t $$ --- #### 四、注意事项与优化策略 1. **数据泄露预防** - **特征工程必须在训练集内完成**:如标准化操作应**仅用训练集计算均值和方差**,再应用到验证集 - 错误示例: ```python # 错误做法:先全局标准化再划分数据 X_scaled = StandardScaler().fit_transform(X) # 泄露了全局分布信息 X_train, X_val = train_test_split(X_scaled, test_size=0.33) ``` 2. **交叉验证类型选择** | **数据特性** | **推荐方法** | |-----------------------------|---------------------------| | 时间序列数据 | TimeSeriesSplit(时序交叉验证) | | 类别不平衡数据(如1:10) | StratifiedKFold(分层抽样) | | 超大样本量(>1M) | Hold-out验证(简单拆分) | 3. **与最终评估的关系** - **三折交叉验证≠最终模型评估**:如引用[1]中流程: 1. 用3折CV确定超参数 2. **用独立测试集进行最终验证** 3. 进行统计显著性检验(如置换检验) --- #### 五、与其他交叉验证方法的对比 | **方法** | 训练集比例 | 验证次数 | 计算成本 | 方差 | 适用场景 | |------------------|------------|----------|----------|---------|--------------------| | **3折CV** | 66.6% | 3 | 低 | 较高 | 中小数据集快速验证 | | **5折CV** | 80% | 5 | 中 | 中等 | 一般场景默认选择 | | **留一法(LOO)** | (N-1)/N | N | 极高 | 最低 | 极小数据集(N<100) | | **重复随机拆分** | 自定义 | 多次 | 可变 | 较低 | 数据分布复杂时 | --- ### 示例代码Python实现) ```python from sklearn.datasets import load_diabetes from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score import numpy as np # 加载数据 X, y = load_diabetes(return_X_y=True) # 设置3交叉验证 model = Ridge(alpha=1.0) scores = cross_val_score(model, X, y, cv=3, scoring=&#39;r2&#39;) # 输出结果 print(f"三次验证R²分数:{scores}") print(f"平均R²:{np.mean(scores):.3f} ± {np.std(scores):.3f}") ``` --- ### 相关问题 1. 如何选择k折交叉验证中的k值? 2. 交叉验证与独立测试集验证有什么本质区别? 3. 时间序列数据为什么不能使用标准的三折交叉验证? [^1]: 参考自用户提供的文献:焦虑相关症状研究中使用的三折交叉验证流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shi_jiaye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值