首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
4.1 分类变量
4.1.1 One-Hot 编码(虚拟变量)
4.1.2 数字可以编码分类变量
4.2 分箱、离散化、线性模型与树
4.3 交互特征与多项式特征
4.4 单变量非线性变换
4.5 自动化特征选择
4.5.1 单变量统计
4.5.2 基于模型的特征选择
4.5.3 迭代特征选择
4.6 利用专家知识
5.1 交叉验证
5.1.1 scikit-learn 中的交叉验证
5.1.2 交叉验证的优点
5.1.3 分层k 折交叉验证和其他策略
5.2 网格搜索
5.2.1 简单网格搜索
5.2.2 参数过拟合的风险与验证集
5.2.3 带交叉验证的网格搜索
5.3 评估指标与评分
5.3.1 牢记目标
5.3.2 二分类指标
5.3.3 多分类指标
5.3.4 回归指标
5.3.5 在模型选择中使用评估指标
6.1 用预处理进行参数选择
6.2 构建管道
6.3 在网格搜索中使用管道
6.4 通用的管道接口
6.4.1 用make_pipeline 方便地创建管道
6.4.2 访问步骤属性
6.4.3 访问网格搜索管道中的属性
6.5 网格搜索预处理步骤与模型参数
6.6 网格搜索选择使用哪个模型
7.1 用字符串表示的数据类型
7.2 示例应用:电影评论的情感分析
7.3 将文本数据表示为词袋
7.3.1 将词袋应用于玩具数据集
7.3.2 将词袋应用于电影评论
7.4 停用词
7.5 用tf-idf 缩放数据
7.6 研究模型系数
7.7 多个单词的词袋(n元分词)
7.8 分词、词干提取与词形还原
7.9 主题建模与文档聚类
8.1 处理机器学习问题
8.2 从原型到生产
8.3 测试生产系统
8.4 构建你自己的估计器
8.5 下一步怎么走
8.5.1 理论
8.5.2 其他机器学习框架和包
8.5.3 排序、推荐系统与其他学习类型
8.5.4 概率建模、推断与概率编程
8.5.5 神经网络
8.5.6 推广到更大的数据集
当前位置:
首页>>
技术小册>>
Python机器学习基础教程(下)
小册名称:Python机器学习基础教程(下)
### 5.1.3 分层k折交叉验证和其他策略 在机器学习实践中,模型评估是一个至关重要的环节,它直接关系到我们构建的模型能否在实际应用中表现良好。交叉验证作为一种强大的评估技术,被广泛用于估计模型的泛化性能。其中,分层k折交叉验证(Stratified k-Fold Cross-Validation)是针对不平衡数据集的一种有效方法,旨在确保每一折的数据分布与原始数据集尽可能相似,从而提高评估的准确性和可靠性。本节将深入探讨分层k折交叉验证的原理、实现方法,并介绍其他几种在特定场景下非常有用的交叉验证策略。 #### 5.1.3.1 分层k折交叉验证原理 **基本概念**: 分层k折交叉验证是k折交叉验证的一个变种,特别适用于处理类别不平衡的数据集。在普通k折交叉验证中,数据被随机分割成k个大小相近的互斥子集(称为“折”),每次选择k-1个子集作为训练集,剩余的1个子集作为测试集,重复k次,每次选择不同的测试集。然而,当数据集存在类别不平衡时,随机分割可能会导致某些折中特定类别的样本数量过少,从而影响评估的公正性。 **分层策略**: 分层k折交叉验证通过确保每一折中各类别样本的比例与原始数据集中的比例大致相同,来解决这一问题。具体做法是,在划分数据时,不是简单地随机抽样,而是先按照类别进行分层,然后在每一层(即每个类别)中独立地进行随机抽样,以保证各层(各类别)的样本在每一折中均匀分布。 **优点**: - **减少偏差**:通过保持每折中类别分布的一致性,分层k折交叉验证减少了因类别不平衡导致的评估偏差。 - **提高稳定性**:由于每折的类别分布相似,模型在不同折上的表现更加稳定,评估结果更具说服力。 #### 5.1.3.2 实现分层k折交叉验证 在Python中,使用scikit-learn库可以方便地实现分层k折交叉验证。`StratifiedKFold`是scikit-learn提供的一个类,专门用于执行分层k折交叉验证。 **示例代码**: ```python from sklearn.model_selection import StratifiedKFold from sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression # 生成模拟的不平衡数据集 X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, weights=[0.1, 0.9], random_state=42) # 初始化StratifiedKFold skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) # 初始化模型 model = LogisticRegression(max_iter=1000) # 遍历每一折 for train_index, test_index in skf.split(X, y): X_train, X_test = X[train_index], X[test_index] y_train, y_test = y[train_index], y[test_index] # 训练模型 model.fit(X_train, y_train) # 评估模型 score = model.score(X_test, y_test) print(f"Test score for fold {skf.n_splits - skf.get_n_splits() + 1}: {score:.4f}") ``` #### 5.1.3.3 其他交叉验证策略 除了分层k折交叉验证外,还有多种交叉验证策略适用于不同的场景和需求。 **1. 时间序列交叉验证(Time Series Cross-Validation)**: 对于时间序列数据,普通的交叉验证方法可能导致数据泄露问题(即未来的数据被用于训练当前的数据点)。时间序列交叉验证通过将数据按时间顺序分割成多个连续的子集,确保每个训练集仅包含测试集之前的数据,从而避免数据泄露。 **2. 留出法(Hold-Out Method)**: 虽然不是交叉验证的一种,但留出法通过将数据集随机划分为训练集和测试集(通常比例为70%-80%用于训练,剩余用于测试),来简单评估模型性能。这种方法计算效率高,但结果稳定性较差,因为数据集的划分是随机的。 **3. 留一法(Leave-One-Out Cross-Validation, LOOCV)**: 留一法是一种极端的k折交叉验证,其中k等于数据集样本数量。每次迭代中,只留下一个样本作为测试集,其余所有样本作为训练集。这种方法评估结果非常准确,但计算成本极高,特别是在数据集较大时。 **4. 自定义交叉验证**: 在某些特定应用中,可能需要根据数据的特定属性或结构来设计自定义的交叉验证策略。例如,根据地理位置、用户群体等特征来划分数据,以模拟实际应用场景中的分布情况。 #### 结论 分层k折交叉验证是解决不平衡数据集评估问题的一种有效方法,它通过保持每折中类别分布的一致性,提高了评估的准确性和稳定性。此外,根据不同的数据集特性和评估需求,还可以选择其他交叉验证策略,如时间序列交叉验证、留出法、留一法或自定义交叉验证等。合理选择和应用这些策略,将有助于我们更准确地评估模型性能,为后续的模型优化和应用提供有力支持。
上一篇:
5.1.2 交叉验证的优点
下一篇:
5.2 网格搜索
该分类下的相关小册推荐:
Python爬虫入门与实战开发(下)
Python与办公-玩转PPT
Python甚础Django与爬虫
Python合辑13-面向对象编程案例(上)
Python编程轻松进阶(三)
剑指Python(万变不离其宗)
Python面试指南
Python合辑9-判断和循环
Python编程轻松进阶(四)
Python爬虫入门与实战开发(上)
Python自动化办公实战
Python合辑5-格式化字符串