算法模型超参数调优方法

机器学习模型超参数调优方法: 交叉验证网格搜索 & 交叉验证随机搜索

一、交叉验证

1.概述

交叉验证(Cross-Validation)是一种评估机器学习模型性能的方法,可以更准确地估计模型的泛化能力(在未见过的数据上的表现)。

2.步骤

传统的交叉验证流程如下:

  1. 将数据集分为训练集和测试集。通常,大部分数据用于训练模型,剩余的部分用于测试模型。
  2. 将训练集进一步划分为 K 个折(folds),通常是等大小的子集。
  3. 对于每个折,选择其中一个作为验证集(validation set),其余折作为训练集。
  4. 使用训练集来训练模型,并使用验证集来评估模型性能。
  5. 重复步骤 3 和 4,直到每个折都被用作验证集。
  6. 对 K 个验证集上的性能进行评估,通常取平均值作为最终模型性能的评估指标。

3.分类

交叉验证的优点是可以更充分地利用数据,并提供对模型性能的更稳健的估计。常见的交叉验证方法包括 K 折交叉验证(K-Fold Cross-Validation)和留一交叉验证(Leave-One-Out Cross-Validation)。

4. 示例

在 Python 中,可以使用 Scikit-learn(sklearn)库来实现交叉验证。以下是一个使用 K 折交叉验证评估模型性能的示例:

from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.linear_model import LogisticRegression

# 创建模型对象
model = LogisticRegression()

# 创建 K 折交叉验证对象
kfold = KFold(n_splits=5, shuffle=True)

# 使用交叉验证评估模型性能
scores = cross_val_score(model, X, y, cv=kfold)

# 查看模型性能评估结果
print("交叉验证结果:", scores)
print("平均准确率:", scores.mean())

在上面的示例中,我们使用了 Logistic 回归模型,将数据集 X 和标签 y 与 K 折交叉验证对象 kfold 一起传递给 cross_val_score() 函数,该函数将返回每一折的模型性能评分。可以使用 mean() 方法取得这些评分的平均值。

二、网格搜索

1.概述

网格搜索(Grid Search)是一种常用的超参数调优方法,用于自动化地选择最佳模型参数组合。

2. 作用 

在机器学习模型中,有许多超参数(hyperparameters),它们不能通过模型训练过程自动学习,需要手动设置。这些超参数的取值对模型性能有着重要影响,因此选择合适的超参数组合非常重要。

网格搜索通过指定超参数的候选值组成的网格,在给定的参数空间中进行系统地遍历和评估,以找到模型在验证集上表现最好的超参数组合。

3. 示例

在 Python 中,可以使用 Scikit-learn(sklearn)库中的 GridSearchCV 类来实现网格搜索。以下是一个示例:

from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier

# 创建模型对象
model = KNeighborsClassifier()

# 定义超参数的候选值
param_grid = {
    'n_neighbors': [3, 5, 7],
    'weights': ['uniform', 'distance']
}

# 创建网格搜索对象
grid_search = GridSearchCV(model, param_grid=param_grid, cv=5)

# 在训练数据上进行网格搜索
grid_search.fit(X_train, y_train)

# 输出最佳参数组合和对应的模型性能
print("最佳参数:", grid_search.best_params_)
print("最佳准确率:", grid_search.best_score_)

在上面的示例中,我们使用了 K 近邻分类器(KNeighborsClassifier)作为模型,并定义了超参数 n_neighbors 和 weights 的候选值。然后,通过传递模型对象、超参数候选值字典以及交叉验证折数给 GridSearchCV 类来创建网格搜索对象。最后,调用 fit() 方法在训练数据上进行网格搜索。

完成网格搜索后,可以通过 best_params_ 属性获取最佳参数组合,通过 best_score_ 属性获取最佳模型的性能评分。

网格搜索会遍历所有候选参数组合,因此可能会消耗较长的时间。为了加速搜索过程,可以考虑使用随机搜索(Randomized Search)或其他优化算法。

三、随机搜索

1.概念

随机搜索(Randomized Search)是一种超参数调优方法,它与网格搜索相比,通过在指定的超参数空间中进行随机采样来选择参数组合。

2.作用

与网格搜索相比,随机搜索的优势在于它可以更高效地搜索参数空间。由于随机搜索不需要遍历所有的参数组合,而是通过设置搜索次数或迭代次数来控制采样的数量,因此可以在更短的时间内寻找到最佳参数。

3.优点

随机搜索在没有先验知识的情况下特别有用,或者当超参数空间非常大时,其可以帮助更快地找到良好的超参数组合。

4.示例

在 Python 中,也可以使用 Scikit-learn(sklearn)库中的 RandomizedSearchCV 类来实现随机搜索。以下是一个示例:

from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestClassifier
from scipy.stats import randint

# 创建模型对象
model = RandomForestClassifier()

# 定义超参数的分布或候选值范围
param_dist = {
    'n_estimators': randint(100, 1000),
    'max_depth': [None, 5, 10, 20],
    'min_samples_split': randint(2, 10),
    'min_samples_leaf': randint(1, 5),
    'criterion': ['gini', 'entropy']
}

# 创建随机搜索对象
random_search = RandomizedSearchCV(model, param_distributions=param_dist, n_iter=10, cv=5)

# 在训练数据上进行随机搜索
random_search.fit(X_train, y_train)

# 输出最佳参数组合和对应的模型性能
print("最佳参数:", random_search.best_params_)
print("最佳准确率:", random_search.best_score_)

在上面的示例中,我们使用了随机森林分类器(RandomForestClassifier)作为模型,并定义了超参数的分布或候选值范围。通过传递模型对象、超参数分布字典、迭代次数和交叉验证折数给 RandomizedSearchCV 类来创建随机搜索对象。最后,调用 fit() 方法在训练数据上进行随机搜索。

与网格搜索不同的是,RandomizedSearchCV 类通过参数 n_iter 来控制随机搜索的迭代次数,即采样的参数组合数量。较低的 n_iter 值可能导致搜索结果不够准确,而较高的值可能会增加搜索时间。

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值