终于把机器学习中的超参数调优搞懂了!!!

人工智能
超参数是用户在模型训练前需要手动设置的参数,与训练过程中通过算法自动调整的参数(如神经网络中的权重)不同。这些超参数直接控制着训练过程和模型的行为,例如学习率、隐藏层的数量、隐藏层的节点数等。超参数的选择对模型的表现至关重要。

大家好,我是小寒

今天给大家分享机器学习中的一个关键知识点,超参数调优

超参数调优是机器学习中调整模型超参数以优化模型性能的过程。

超参数是用户在模型训练前需要手动设置的参数,与训练过程中通过算法自动调整的参数(如神经网络中的权重)不同。这些超参数直接控制着训练过程和模型的行为,例如学习率、隐藏层的数量、隐藏层的节点数等。超参数的选择对模型的表现至关重要。

超参数调优的目的是找到一组最佳的超参数,使模型在验证集上表现良好,能够实现良好的泛化能力(即在新数据上具有较好的性能),同时避免过拟合或欠拟合。

图片图片

超参数调优的重要性

  1. 性能优化
    合适的超参数可以显著提高模型的准确性、召回率等性能指标。
  2. 控制过拟合和欠拟合
    超参数调节可以控制模型复杂度,降低过拟合和欠拟合的风险。
  3. 训练效率
    调整超参数(如学习率、批量大小)可以提高训练速度并稳定收敛。

常见超参数调优方法

网格搜索

网格搜索是一种系统地搜索超参数空间的方法,它通过穷举搜索遍历所有可能的超参数组合。

对于每组超参数,模型在训练集上训练并在验证集上评估性能,从而找到最佳组合。

图片图片

步骤:

  1. 定义超参数及其可能取值范围(通常是离散的值)。
  2. 生成所有可能的超参数组合。
  3. 逐一训练模型并在验证集上进行评估。
  4. 选择使模型性能最优的超参数组合。

优点:

  • 简单易实现。
  • 对于搜索空间较小的问题能找到全局最优解。

缺点:

  • 计算复杂度高,随着超参数的维度和可能取值数量增加,搜索空间呈指数级增长。
  • 低效:如果某些超参数的作用较小或对模型性能影响不大,依然会浪费大量计算资源。

案例:

假设有一个分类模型,其超参数有:

  • learning_rate: [0.001, 0.01, 0.1]
  • max_depth: [3, 5, 7]

网格搜索将会尝试以下组合:

(0.001, 3), (0.001, 5), (0.001, 7), 
(0.01, 3), (0.01, 5), (0.01, 7),
(0.1, 3), (0.1, 5), (0.1, 7)

一共 3 × 3 = 9 次训练。

随机搜索

随机搜索是一种随机采样超参数空间的方法,它从所有可能的超参数组合中随机选择一定数量的组合进行尝试,而不是穷尽所有可能性。

图片图片

步骤:

  1. 定义超参数的分布范围。
  2. 随机采样一定数量的超参数组合。
  3. 逐一训练模型并在验证集上进行评估。
  4. 选择使模型性能最优的超参数组合。

优点:

  • 计算效率高,通过减少搜索空间中的点,显著降低计算成本。
  • 效果较好,相比网格搜索,随机搜索在高维空间中更有可能找到接近最优的解。

缺点:

  • 没有系统性,不保证找到全局最优解。
  • 需要事先定义采样数量。

案例:

假设超参数空间与上述网格搜索相同,但随机搜索仅采样 5 组超参数组合,例如:

(0.001, 7), (0.01, 5), (0.1, 3), (0.001, 5), (0.01, 3)

相比网格搜索的 9 次训练,这里仅训练 5 次。

示例代码

以下是使用 Python 实现网格搜索和随机搜索的示例代码。

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)

model = RandomForestClassifier(random_state=42)

param_grid = {
    'n_estimators': [10, 50, 100],
    'max_depth': [5, 10, 15],
    'min_samples_split': [2, 5, 10]
}

# 网格搜索
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, scoring='accuracy')
grid_search.fit(X, y)
print("Best parameters (Grid Search):", grid_search.best_params_)

from scipy.stats import randint
param_dist = {
    'n_estimators': randint(10, 200),
    'max_depth': randint(5, 50),
    'min_samples_split': randint(2, 20)
}

# 随机搜索
random_search = RandomizedSearchCV(estimator=model, param_distributinotallow=param_dist, n_iter=10, cv=3, scoring='accuracy', random_state=42)
random_search.fit(X, y)
print("Best parameters (Random Search):", random_search.best_params_)


责任编辑:武晓燕 来源: 程序员学长
相关推荐

2024-10-14 14:02:17

机器学习评估指标人工智能

2024-11-05 12:56:06

机器学习函数MSE

2024-09-18 16:42:58

机器学习评估指标模型

2024-08-23 09:06:35

机器学习混淆矩阵预测

2024-10-28 00:00:10

机器学习模型程度

2024-10-08 15:09:17

2024-10-08 10:16:22

2024-10-28 15:52:38

机器学习特征工程数据集

2024-10-30 08:23:07

2021-01-22 11:18:58

Python机器学习超参数

2024-07-16 16:13:14

2024-08-01 08:41:08

2024-10-16 07:58:48

2022-10-31 11:33:30

机器学习参数调优

2024-07-17 09:32:19

2024-09-23 09:12:20

2024-11-21 10:07:40

2024-10-31 10:00:39

注意力机制核心组件

2024-09-12 08:28:32

2024-10-17 13:05:35

神经网络算法机器学习深度学习
点赞
收藏

51CTO技术栈公众号