sklearn cross_val_score实现交叉验证详解与实例

版权申诉
16 下载量 189 浏览量 更新于2024-09-11 收藏 132KB PDF 举报
"这篇教程介绍了如何使用Python的机器学习库scikit-learn(sklearn)中的`cross_val_score`函数进行交叉验证,并结合K近邻(K-Nearest Neighbors, KNN)算法来选择最佳参数。" 在机器学习中,交叉验证是一种评估模型性能的有效方法,它能帮助我们避免过拟合并充分利用有限的数据。sklearn库提供的`cross_val_score`函数实现了这一功能。该函数将数据集分成多个子集(或称为“折”),依次用其中一部分作为测试集,其余部分作为训练集,从而多次训练和评估模型。通过这种方式,可以得到更稳定和可靠的模型性能估计。 交叉验证的核心思想是通过多次训练和测试来平均模型的表现,减少由于随机性导致的评估误差。在本例中,作者提到了10折交叉验证(k=10),意味着数据集会被划分为10个相等的部分,每次用9/10的数据训练模型,剩下的1/10作为测试集。这个过程重复10次,每次选择不同的子集作为测试集。最终,`cross_val_score`会返回这10次得分的平均值。 交叉验证的优点包括: 1. **降低过拟合风险**:通过多次验证,可以更准确地估计模型在未见数据上的表现,从而减少因过拟合导致的错误估计。 2. **提高数据利用效率**:在有限的数据集上,交叉验证能更好地利用所有样本,提高模型泛化能力。 在选择模型参数时,我们可以结合交叉验证进行参数调优。例如,对于KNN模型,关键参数是`n_neighbors`(即K值)。通过设置不同的K值,使用`cross_val_score`评估每个K值对应的模型性能,选择得分最高的K值作为最佳参数。以下是一个简单的代码示例: ```python # 加载数据 iris = datasets.load_iris() X = iris.data y = iris.target # 划分数据 train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.2) # 定义模型 knn = KNeighborsClassifier() # 定义参数网格 k_values = range(1, 31) # 尝试1到30的K值 scores = [] # 交叉验证并计算得分 for k in k_values: knn.set_params(n_neighbors=k) scores.append(cross_val_score(knn, X, y, cv=10).mean()) # 使用10折交叉验证 # 绘制得分与K值的关系图 plt.plot(k_values, scores) plt.xlabel('Number of Neighbors (K)') plt.ylabel('Cross Validation Score') plt.title('KNN Model Performance with Varying K') plt.show() # 找到最高得分的K值 best_k = k_values[np.argmax(scores)] print(f'Best K value is {best_k}') ``` 这段代码展示了如何使用`cross_val_score`在KNN模型中选择最佳的`n_neighbors`。通过绘制得分与K值的图形,可以直观地看到哪个K值对应的最佳模型性能。这样的方法被称为网格搜索(Grid Search),是一种常见的参数调优策略。 `sklearn`的`cross_val_score`函数是实现交叉验证的重要工具,对于模型选择和参数调优具有重要意义。通过结合不同的模型和参数,我们可以更有效地构建和优化机器学习模型。