sklearn库之交叉验证与网格搜索

本文详细介绍了sklearn库中的交叉验证方法,包括k折交叉验证、分层k折交叉验证和其他策略,强调了交叉验证在评估模型泛化性能中的作用。接着讨论了网格搜索在参数调优中的应用,特别是带交叉验证的网格搜索,以及如何使用验证集避免过拟合。此外,还涵盖了评估指标,如二分类问题中的精度、召回率、f1分数,强调了在不平衡数据集上选择合适指标的重要性。
摘要由CSDN通过智能技术生成

主要内容 用途
交叉验证 一种更可靠的评估泛化性能的方法
网格搜索 一种调节监督模型参数以获得最佳泛化性能的有效方法
其他评估分类和回归性能的方法 在默认度量(score方法给出的精度和 R2 )之外的方法
一、交叉验证(主要用到sklearn.model_selection)

交叉验证(cross-validation)是一种评估泛化性能的统计学方法。

1.1 k 折交叉验证

最常用的交叉验证是 k 折交叉验证(k-fold cross-validation),其中 k 是由用户指定的数字,通常取 5 或 10。在执行 5 折交叉验证时,首先将数据划分为(大致)相等的 5 部分,每一部分叫作折(fold)。

在这里插入图片描述

from sklearn.model_selection import cross_val_score  # 导入交叉验证函数
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

iris = load_iris()
logreg =LogisticRegression()
scores = cross_val_score(logreg, iris.data, iris.target, cv=3)  # 参数 cv 表示折数 
scores.mean()  # 总结交叉验证精度的一种常用方法是计算平均值
  1. 优点

使用交叉验证,每个样例都会刚好在测试集中出现一次:每个样例位于一个折中,而每个折都在测试集中出现一次。这样可以告诉我们将模型应用于新数据时在最坏情况和最好情况下的可能表现。我们对数据的使用更加高效。

  1. 缺点

增加计算成本。现在我们要训练 k 个模型而不是单个模型,所以交叉验证的速度要比数据的单次划分大约慢 k 倍。


1.2 分层k折交叉验证

在这里插入图片描述

引入交叉验证分离器(cross-validation splitter)

从 model_selection 模块中导入 KFold 分离器类,并用我们想要使用的折数来将其实例化。

from sklearn.model_selection import KFold
kfold = KFold(n_splits=3)  # 不分层k折交叉验证
cross_val_score(logreg, iris.data, iris.target, cv=kfold) 

解决类别标签排序问题的另一种方法是将数据打乱来代替分层,以打乱样本按标签的排序。

kfold = KFold(n_splits=3, shuffle=True, random_state=0)  # 参数 shuffle 代表是否打乱数据

1.3 其他策略
  • 留一法交叉验证

另一种常用的交叉验证方法是留一法(leave-one-out),看作是每折只包含单个样本的 k 折交叉验证。这种方法可能非常耗时,特别是对于大型数据集来说,但在小型数据集上有时可以给出更好的估计结果。

from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
scores = cross_val_score(logreg, iris.data, iris.target, cv=loo)
  • 打乱划分交叉验证

另一种非常灵活的交叉验证策略是打乱划分交叉验证(shufflfle-split cross-validation)。

在打乱划分交叉验证中,每次划分为训练集取样 train_size 个点,为测试集取样 test_size 个(不相交的)点。将这一划分方法重复n_iter 次。

在这里插入图片描述

from sklearn.model_selection import ShuffleSplit
shuffle_split = ShuffleSplit(test_size=.5, train_size=.25, n_splits=10)
scores = cross_val_score(logreg, iris.data, iris.target, cv=shuffle_split)

ShuffleSplit 还有一种分层的形式,其名称为 StratifiedShuffleSplit,它可以为分类任务提供更可靠的结果。

  • 分组交叉验证

另一种非常常见的交叉验证适用于数据中的分组高度相关时。为了实现这一点,我们可以使用 GroupKFold,它以 groups 数组作为参数,可以用来说明照片中对应的是哪个人或者语音属于哪个人。

在这里插入图片描述

from sklearn.datasets import make_blobs
from sklearn.model_selection import GroupKFold
X, y = make_blobs(n_samples=
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值