文章目录
主要内容 | 用途 |
---|---|
交叉验证 | 一种更可靠的评估泛化性能的方法 |
网格搜索 | 一种调节监督模型参数以获得最佳泛化性能的有效方法 |
其他评估分类和回归性能的方法 | 在默认度量(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() # 总结交叉验证精度的一种常用方法是计算平均值
- 优点
使用交叉验证,每个样例都会刚好在测试集中出现一次:每个样例位于一个折中,而每个折都在测试集中出现一次。这样可以告诉我们将模型应用于新数据时在最坏情况和最好情况下的可能表现。我们对数据的使用更加高效。
- 缺点
增加计算成本。现在我们要训练 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=