网格搜索算法与K折交叉验证

本文介绍网格搜索算法及K折交叉验证法在决策树模型中的应用,通过实例演示如何选择最佳参数并评估模型准确性。

网格搜索算法K折交叉验证法机器学习入门的时候遇到的重要的概念。

网格搜索算法是一种通过遍历给定的参数组合来优化模型表现的方法。

决策树为例,当我们确定了要使用决策树算法的时候,为了能够更好地拟合和预测,我们需要调整它的参数。在决策树算法中,我们通常选择的参数是决策树的最大深度

于是我们会给出一系列的最大深度的值,比如 {'max_depth': [1,2,3,4,5]},我们会尽可能包含最优最大深度。

不过,我们如何知道哪一个最大深度的模型是最好的呢?我们需要一种可靠的评分方法,对每个最大深度的决策树模型都进行评分,这其中非常经典的一种方法就是交叉验证,下面我们就以K折交叉验证为例,详细介绍它的算法过程。

首先我们先看一下数据集是如何分割的。我们拿到的原始数据集首先会按照一定的比例划分成训练集和测试集。比如下图,以8:2分割的数据集:

训练集用来训练我们的模型,它的作用就像我们平时做的练习题;测试集用来评估我们训练好的模型表现如何,它的作用像我们做的高考题,这是要绝对保密不能提前被模型看到的。

因此,在K折交叉验证中,我们用到的数据是训练集中的所有数据。我们将训练集的所有数据平均划分成K份(通常选择K=10),取第K份作为验证集,它的作用就像我们用来估计高考分数的模拟题,余下的K-1份作为交叉验证的训练集。

对于我们最开始选择的决策树的5个最大深度 ,以 max_depth=1 为例,我们先用第2-10份数据作为训练集训练模型,用第1份数据作为验证集对这次训练的模型进行评分,得到第一个分数;然后重新构建一个 max_depth=1 的决策树,用第1和3-10份数据作为训练集训练模型,用第2份数据作为验证集对这次训练的模型进行评分,得到第二个分数……以此类推,最后构建一个 max_depth=1 的决策树用第1-9份数据作为训练集训练模型,用第10份数据作为验证集对这次训练的模型进行评分,得到第十个分数。于是对于 max_depth=1 的决策树模型,我们训练了10次,验证了10次,得到了10个验证分数,然后计算这10个验证分数的平均分数,就是 max_depth=1 的决策树模型的最终验证分数。

对于 max_depth = 2,3,4,5 时,分别进行和 max_depth=1 相同的交叉验证过程,得到它们的最终验证分数。然后我们就可以对这5个最大深度的决策树的最终验证分数进行比较,分数最高的那一个就是最优最大深度,对应的模型就是最优模型

下面提供一个简单的利用决策树预测乳腺癌的例子:

from sklearn.model_selection import GridSearchCV, KFold, train_test_split
from sklearn.metrics import make_scorer, accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer

data = load_breast_cancer()

X_train, X_test, y_train, y_test = train_test_split(
    data['data'], data['target'], train_size=0.8, random_state=0)

regressor = DecisionTreeClassifier(random_state=0)
parameters = {'max_depth': range(1, 6)}
scoring_fnc = make_scorer(accuracy_score)
kfold = KFold(n_splits=10)

grid = GridSearchCV(regressor, parameters, scoring_fnc, cv=kfold)
grid = grid.fit(X_train, y_train)
reg = grid.best_estimator_

print('best score: %f'%grid.best_score_)
print('best parameters:')
for key in parameters.keys():
    print('%s: %d'%(key, reg.get_params()[key]))

print('test score: %f'%reg.score(X_test, y_test))

import pandas as pd
pd.DataFrame(grid.cv_results_).T

直接用决策树得到的分数大约是92%,经过网格搜索优化以后,我们可以在测试集得到95.6%的准确率:

best score: 0.938462
best parameters:
max_depth: 4
test score: 0.956140
<think>我们正在讨论如何使用Python中的GridSearchCV进行K交叉验证网格搜索。 根据引用[1]和[2]的内容,我们知道: - K交叉验证将数据集分成K份,每次用K-1份作为训练集,1份作为测试集,进行K次训练和测试,最后取平均得分。 - GridSearchCV是sklearn中用于网格搜索交叉验证的类,它可以自动遍历给定的参数组合,通过交叉验证确定最佳参数。 步骤: 1. 导入必要的库:包括GridSearchCV、KFold(如果需要自定义数)以及相应的模型和数据集。 2. 准备数据集。 3. 定义模型。 4. 定义参数网格(要搜索的参数范围)。 5. 创建GridSearchCV对象,设置模型、参数网格、交叉验证数等。 6. 在数据上拟合GridSearchCV对象。 7. 查看最佳参数和最佳得分。 注意:GridSearchCV内部已经实现了交叉验证,所以我们不需要手动进行K划分,只需要指定cv参数(即数)即可。 下面我们以K最近邻(KNN)在鸢尾花数据集上的分类为例,展示如何使用GridSearchCV。</think>### Python中K交叉验证网格搜索的实现方法 在机器学习中,**K交叉验证(K-Fold Cross Validation)** 用于评估模型泛化能力,而**网格搜索(Grid Search)** 则用于自动寻找最优超参数组合。两者结合可通过`GridSearchCV`类高效实现[^2]。 #### 实现步骤(以鸢尾花数据集为例) 1. **导入库数据** ```python from sklearn.datasets import load_iris from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import GridSearchCV, KFold # 加载数据 data = load_iris() X, y = data.data, data.target ``` 2. **配置参数网格交叉验证器** ```python # 定义参数搜索范围 param_grid = { 'n_neighbors': [3, 5, 7, 9], # 邻居数 'weights': ['uniform', 'distance'] # 权重计算方式 } # 创建5交叉验证器 kfold = KFold(n_splits=5, shuffle=True, random_state=42) ``` 3. **执行网格搜索交叉验证** ```python # 创建模型GridSearchCV对象 model = KNeighborsClassifier() grid_search = GridSearchCV( estimator=model, param_grid=param_grid, cv=kfold, # 使用配置好的K验证 scoring='accuracy', # 评估指标 n_jobs=-1 # 使用所有CPU核心 ) # 执行搜索 grid_search.fit(X, y) ``` 4. **获取最优结果** ```python print("最佳参数:", grid_search.best_params_) print("最佳准确率:", grid_search.best_score_) # 输出各参数组合结果 results = pd.DataFrame(grid_search.cv_results_) print(results[['param_n_neighbors', 'param_weights', 'mean_test_score']]) ``` #### 关键说明 1. **交叉验证流程** `GridSearchCV`自动将数据分为5(`n_splits=5`),每次用4训练,1验证,循环5次[^2]。 2. **参数搜索机制** 遍历所有参数组合(此处 4×2=8 种组合),每个组合执行5次交叉验证,共训练40个模型[^2]。 3. **结果优化** - `shuffle=True`:打乱数据避免顺序偏差 - `n_jobs=-1`:启用并行加速搜索 - `scoring`:可替换为`f1`/`precision`等指标 #### 输出示例 ``` 最佳参数: {'n_neighbors': 5, 'weights': 'distance'} 最佳准确率: 0.980 ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值