21 交叉验证与调优
在上一节中,我们讨论了超参数调优中的随机搜索方法。随机搜索为我们提供了一种相对高效的方式来搜索超参数空间,但在实际应用中,我们可能还需要进一步评估模型的性能,以确保找到的超参数组合是最佳的。这就引入了交叉验证(Cross-Validation)
的概念,它可以帮助我们更准确地评估模型的表现。
交叉验证的基本概念
交叉验证
是用于评估机器学习模型性能的一种技术,它将训练集划分为多个小子集,以便进行多次训练和验证。最常用的交叉验证方法是K折交叉验证
(K-Fold Cross-Validation),其基本步骤如下:
- 将训练数据划分为
K
个相同大小的子集(折)。 - 每次使用
K-1
个子集进行训练,使用剩下的一个子集进行验证。 - 重复
K
次,每次使用不同的子集进行验证。 - 最终的模型性能是
K
次验证结果的平均值。
通过这种方式,我们可以更好地评估模型对未见数据的预测能力,降低过拟合的风险。
K折交叉验证的实现
接下来,我们将通过一个具体的例子来展示如何在Scikit-Learn
中实现K折交叉验证
。我们将利用KNeighborsClassifier
进行分类任务,并使用KFold
函数来执行交叉验证。
示例代码
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import KFold, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 构建模型
model = KNeighborsClassifier(n_neighbors=3)
# 设置K折交叉验证
kf = KFold(n_splits=5, shuffle=True, random_state=42)
# 进行交叉验证
scores = cross_val_score(model, X, y, cv=kf)
# 输出结果
print("交叉验证得分:", scores)
print("平均准确率:", np.mean(scores))
代码解析
- 我们首先加载了
Iris
数据集,并准备好特征矩阵X
和目标变量y
。 - 创建了一个
KNeighborsClassifier
模型,并设定k=3
。 - 使用
KFold
将数据划分为5个折,并设置随机种子以确保每次划分的可重复性。 - 用
cross_val_score
函数执行交叉验证,并得到每折的得分。 - 输出每折的得分和平均准确率,以评估模型的表现。
超参数调优与交叉验证的结合
在结合超参数调优时,我们可以使用GridSearchCV
或RandomizedSearchCV
,这两者均内置了交叉验证的功能。这样,在搜索超参数时,模型的评估将更加稳健,能够更有效地找到最佳参数。
示例代码
我们将使用GridSearchCV
来展示如何结合超参数调优与交叉验证:
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {'n_neighbors': np.arange(1, 15)}
# 使用GridSearchCV进行调优
grid_search = GridSearchCV(KNeighborsClassifier(), param_grid, cv=kf)
grid_search.fit(X, y)
# 输出最佳参数和最佳得分
print("最佳参数:", grid_search.best_params_)
print("最佳交叉验证得分:", grid_search.best_score_)
代码解析
- 定义了一个参数网格,指定
n_neighbors
的取值范围。 - 创建了一个
GridSearchCV
对象,其中指定了模型、参数网格及交叉验证方式。 - 调用
fit
方法进行调优,寻找最佳超参数组合。 - 最后输出最佳参数及其对应的交叉验证得分。
总结
在本节中,我们深入探讨了交叉验证
及其在超参数调优中的应用。通过结合K折交叉验证
与超参数调优,我们能够更为全面地评估模型的性能并找到最优的超参数配置。这种方法不仅可以提高模型的泛化能力,还能有效地避免过拟合,为后续的应用案例打下良好的基础。
在下一篇文章中,我们将进入一个实际应用案例,讨论如何使用模型进行房价预测
。