【超参数研究01】使用网格搜索优化超参数

news2024/12/25 13:00:53

 

一、说明

        在神经网络训练中,超参数也是需要优化的,然而在超参数较多(大于3个)后,如果用穷举的,或是通过经验约摸实现就显得费时费力,无论如何,这是需要研究、规范、整合的要点,本文对超参的网格化搜索xgboost展开研究。

        请考虑查阅更多文章。不要忘记在https://blog.devops.dev/和  https://twitter.com/devops_blog 上关注我们机器学习模型中的超参数是不是从训练数据中学习而是设置的参数训练前。这些参数会影响模型在训练期间的行为,并对模型的性能和泛化到新数据的能力产生重大影响。

二、超参数有啥内涵?

        超参数的示例包括学习率(控制优化期间采取的步长)、正则化强度(控制应用于模型参数以防止过度拟合的惩罚程度)、神经网络中隐藏层的数量、树的数量在随机森林中,以及在支持向量机中使用的核函数。

        网格搜索是机器学习中使用的一种超参数调整技术,用于查找模型超参数的最佳值。它涉及定义要搜索的超参数值网格,然后详尽地评估网格中的每个值组合。

        我将使用 Kaggle 中的笔记本电脑价格数据集来演示如何在 Python 中使用网格搜索。您可以在这里获取数据。

三、基于Xgboost的网格搜索实践

        首先,我们需要预处理数据集并为模型开发做好准备。由于这不是本文的重点,因此对此进行了简要介绍。

import pandas as pd
import xgboost as xgb
import numpy as np
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.compose import ColumnTransformer

df = pd.read_csv("laptopPrice.csv")
# there are some duplicates in the dataset
df = df.drop_duplicates()
df.reset_index(drop=True,inplace=True)

# some replacements

df['ram_gb'] = df['ram_gb'].str.replace(' GB', '').astype(int)
df['ssd'] = df['ssd'].str.replace(' GB', '').astype(int)
df['hdd'] = df['hdd'].str.replace(' GB', '').astype(int)
df['graphic_card_gb'] = df['graphic_card_gb'].str.replace(' GB', '').astype(int)
df['os_bit'] = df['os_bit'].str.replace('-bit', '').astype(int)
df["rating"] = df["rating"].replace({"1 star": "1 stars"})
df['rating'] = df['rating'].str.replace(' stars', '').astype(int)

mapping = {'ThinNlight': 1, 'Casual': 2, 'Gaming': 3}
df["weight"] = df["weight"].replace(mapping)

mapping = {'No warranty': 0, '1 year':1, '2 years':2, '3 years':3}
df["warranty"] = df["warranty"].replace(mapping)

mapping = {'No': 0, 'Yes': 1}
df["Touchscreen"] = df["Touchscreen"].replace(mapping)

mapping = {'No': 0, 'Yes': 1}
df["msoffice"] = df["msoffice"].replace(mapping)

df.head(10)

前 10 行。图片由作者提供。

num_features = [feature for feature in df.columns if df[feature].dtype != 'object' and feature != "Price"]
cat_features = [feature for feature in df.columns if df[feature].dtype == 'object']
print("Numerical features: ", num_features)
print("Categorical featues:", cat_features)

"""
Numerical features:  ['ram_gb', 'ssd', 'hdd', 'os_bit', 'graphic_card_gb', 'weight', 'warranty', 'Touchscreen', 'msoffice', 'rating', 'Number of Ratings', 'Number of Reviews']
Categorical featues: ['brand', 'processor_brand', 'processor_name', 'processor_gnrtn', 'ram_type', 'os']
"""
# feature transformation

cat_transformer = OneHotEncoder(handle_unknown='ignore')
num_transformer = StandardScaler()

preprocessor = ColumnTransformer(
    transformers=[
        ('cat', cat_transformer, cat_features),
        ('num', num_transformer, num_features)
    ])

X = preprocessor.fit_transform(df)
y = df["Price"].values.reshape(-1,1)

print(f"X: {X.shape}, y: {y.shape}")
# X: (802, 51), y: (802, 1)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.3, shuffle=True)

        好的,我们现在已经对输入数据和目标数据进行了预处理,并且它们已准备好在模型中使用。

        让我们训练我们的基本模型。我将使用 XGBoost 及其默认超参数。

model = xgb.XGBRegressor()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
rmse_train = np.sqrt(mean_squared_error(y_train, model.predict(X_train)))
rmse_test = np.sqrt(mean_squared_error(y_test, y_pred))
print(f"Train RMSE: {rmse_train}, Test RMSE: {rmse_test}")
# Train RMSE: 2079.484814769608, Test RMSE: 19711.16864024852

        我们的模型似乎严重过度拟合。因此,我们现在将合并网格搜索来解决这个问题。

from sklearn.model_selection import GridSearchCV

        现在,让我们仔细看看GridSearchCV课堂。它接受的参数如下:

  • estimator是将用于训练的模型。
  • param_grid指定要搜索的超参数空间。它应该是一个字典或一个字典列表,其中每个字典都包含一组要尝试的超参数。
  • scoring是用于评估模型性能的指标。它可以采用多种不同的形式,包括字符串、可调用函数和多个指标的字典。分类指标:准确度、精确度、召回率、f1。回归指标:neg_mean_squared_error,r2。聚类指标:adjusted_rand_score、silhoutte_score。这些是最受欢迎的,请访问此处查看整个列表。
  • n_jobs指定用于并行计算的 CPU 核心数。值-1表示应使用所有可用的内核。
  • refit指定是否使用搜索过程中找到的最佳超参数在整个数据集上重新拟合最佳估计器。默认情况下,refit设置为True,这意味着网格搜索完成后,GridSearchCV对象将使用找到的最佳超参数自动重新拟合整个数据集上的最佳估计器。
  • cv指定交叉验证分割策略。它可以是一个整数值来指定折叠次数,也可以是一个交叉验证生成器,可用于定义更高级的交叉验证策略。
  • verbose控制搜索期间输出的详细程度。
  • pre_dispatch用于控制网格搜索期间并行启动的作业数量。它采用一个整数值,指定在任何给定时间可以启动的最大作业数。例如,如果pre_dispatch=2,则在任何给定时间不会并行启动超过 2 个作业。
  • error_score用于指定如果无法完成拟合过程,应为超参数组合分配什么分数。在网格搜索过程中,GridSearchCV算法为每个超参数组合训练和评估模型。但有时,由于内存不足或数值不稳定等原因,模型可能无法拟合或评分。在这种情况下,GridSearchCV算法需要为失败的超参数组合分配一个分数,以便它可以继续搜索。
  • return_train_score指定是否在输出中包含训练分数。
param_grid = {
    'learning_rate': [0.01, 0.1],
    'n_estimators': [100, 500],
    'max_depth': [3, 5],
    'colsample_bytree': [0.5, 0.9],
    'gamma': [0, 0.1, 0.5],
    'reg_alpha': [0, 1, 10],
    'reg_lambda': [0, 1, 10],
}

xgb = xgb.XGBRegressor(random_state=1)
grid_search = GridSearchCV(xgb, param_grid=param_grid, cv=5, n_jobs=-1, verbose=1, 
                           scoring="neg_root_mean_squared_error", )

grid_search.fit(X_train, y_train)
#Fitting 5 folds for each of 432 candidates, totaling 2160 fits

  GridSearchCV对搜索空间中 432 个不同的超参数组合中的每一个执行 5 倍交叉验证(即,将数据分成 5 个部分并训练模型 5 次,每次使用不同的部分作为验证集)。这导致总共 2160 次拟合(即训练模型并评估其性能 2160 次)。

        我们现在已经创建了网格搜索对象。接下来,让我们探索一下可以使用的可用属性。

  • best_estimator_返回根据指定的评分指标在所有候选者中被选为最佳的估计器。
  • best_score_返回最佳估计器在测试数据上获得的平均交叉验证分数。
  • best_params_返回产生最佳结果的超参数的字典。
  • cv_results_返回一个字典,其中包含有关每个超参数组合性能的详细信息,包括交叉验证分数的平均值和标准差、对每个模型进行拟合和评分所需的时间以及每个模型的超参数值。
  • best_index_返回字典中最佳超参数组合的索引cv_results_
  • scorer_表示用于评估网格搜索期间模型性能的评分函数。
  • n_splits_表示网格搜索期间交叉验证过程中使用的折叠数。
  • refit_time_表示在整个数据集上重新拟合最佳估计器所花费的时间。
  • multimetric_指示网格搜索期间是否使用了多个评估指标。
  • classes_返回目标变量中的唯一类标签。
  • n_features_in_返回输入数据中的特征数量。
  • feature_names_in_是拟合期间看到的特征的名称。
print("Best estimator: ", grid_search.best_estimator_)

"""
Best estimator:  XGBRegressor(base_score=0.5, booster='gbtree', callbacks=None,
             colsample_bylevel=1, colsample_bynode=1, colsample_bytree=0.5,
             early_stopping_rounds=None, enable_categorical=False,
             eval_metric=None, gamma=0, gpu_id=-1, grow_policy='depthwise',
             importance_type=None, interaction_constraints='',
             learning_rate=0.1, max_bin=256, max_cat_to_onehot=4,
             max_delta_step=0, max_depth=5, max_leaves=0, min_child_weight=1,
             missing=nan, monotone_constraints='()', n_estimators=100, n_jobs=0,
             num_parallel_tree=1, predictor='auto', random_state=1, reg_alpha=0,
             reg_lambda=0, ...)
"""
print("Best score: ", grid_search.best_score_)
print("Best hyperparameters: ", grid_search.best_params_)

"""
Best score:  -23298.387344638286
Best hyperparameters:  {'colsample_bytree': 0.5, 'gamma': 0, 'learning_rate': 0.1, 'max_depth': 5, 'n_estimators': 100, 'reg_alpha': 0, 'reg_lambda': 0}
"""
results_df = pd.DataFrame(grid_search.cv_results_)
results_df.head()

简历结果数据框。图片由作者提供。

print("Best index: ", grid_search.best_index_)
print("Best scorer: ", grid_search.scorer_)
print("Best n splits: ", grid_search.n_splits_)
print("Best refit time: ", grid_search.refit_time_)
print("Best multi metric: ", grid_search.multimetric_)
print("Best n features: ", grid_search.n_features_in_)

"""
Best index:  54
Best scorer:  make_scorer(mean_squared_error, greater_is_better=False, squared=False)
Best n splits:  5
Best refit time:  0.055130958557128906
Best multi metric:  False
Best n features:  51
"""

我们现在可以使用最好的模型。我们已经取得了一些小小的进步。

best_model = grid_search.best_estimator_
best_model.fit(X_train, y_train)
y_pred = best_model.predict(X_test)
rmse_train = np.sqrt(mean_squared_error(y_train, best_model.predict(X_train)))
rmse_test = np.sqrt(mean_squared_error(y_test, y_pred))
print(f"Train RMSE: {rmse_train}, Test RMSE: {rmse_test}")

"""
Train RMSE: 6502.070891973686, Test RMSE: 17419.48195947506
"""

 四、后记

       GridSearchCV 评估指定超参数的所有可能组合,这可以帮助识别给定模型的最佳超参数集。而且,它确保在模型的不同运行中使用相同的超参数,从而促进可重复性

        评估超参数的所有可能组合的计算成本可能很高,尤其是对于更大的数据集和更复杂的模型。如果搜索空间太大,它也可能容易出现过度拟合,这可能导致对未见过的数据的泛化性能较差。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1136225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漏洞复现--用友U8-Cloud upload.jsp任意文件上传

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

分享一下怎么做多门店商城系统

随着互联网的快速发展,传统实体店面临着巨大的挑战。为了更好地适应市场变化,提高竞争力,多门店商城系统应运而生。这种新型的商业模式,旨在通过线上线下融合,实现门店之间的互联互通,提高运营效率&#xf…

云尘靶场-铁三域控

第一次 通过vpn链接 然后fscan扫描c段 扫描出来三个ip存活 并且141存在永恒之蓝 我们看看能不能直接复现 按照原本的设置发现 提示这里需要通过32位来进行 那我们开始设置 利用MS17-010渗透win7(32位)_利用ms17-010渗透win7(32位)-CSDN博客 https:…

外汇天眼:MT4白标与MT5,谁更适合如今的外汇市场?

2017年4月,外汇市场因迈达克的官宣闹得沸沸扬扬。 俄罗斯知名软件提供商迈达克(MetaQuotes)宣布停止出售旗下产品MT4的主标业务,意在淘汰MT4软件,转而主推MT5平台。 对于计划成为经纪商的人来说,是选择快速…

个人记账理财软件 Money Pro mac中文版软件介绍

Money Pro for mac是一款综合性高的理财工具,Money Pro是一套能够协同工作的工具,可用来追踪账户、管理账单以及制作预算,您可以为每个时间段设置不同的预算限值。财务一切尽在掌控之中。 Money Pro for mac软件介绍 Money Pro for mac提供一…

常见深度学习目标检测指标 AP mAP mAP@0.5 mAP@0.5:0.95 简短总结

目标检测指标计算 准确率 召回率 AP mAP 1.准确率与召回率 TP 真正例 将正类预测为正类数 FP 假正例 将负类预测为正类数 误检 TN 真负例 将负类预测为负类 FN 假负例 将正类预测为负类 漏检 2.AP 通常情况下 P与R成反比 因此为了更好的衡量模型 引入 AP mAP AP为…

学会场景提问,让AI“小助手”为我所用

文章目录 一、故事叙述提问举例 二、产品描述提问举例 三、报告撰写提问举例 四、邮件和信件撰写提问举例 五、新间稿和公告撰写提问举例 六、学术论文和专业文章撰写提问举例 我们知道AI技术不仅能够自动生成文章和内容,还可以根据我们的需求提供创意灵感和解决问题…

uni-app配置微信开发者工具

一、配置微信开发者工具路径 工具->设置->运行配置->小程序运行配置->微信开发者工具路径 二、微信开发者工具开启服务端口

OpenWRT软路由web界面如何远程访问?

文章目录 1.openWRT安装cpolar2.配置远程访问地址3.固定公网地址 简单几步实现在公网环境下远程访问openWRT web 管理界面,使用cpolar内网穿透创建安全隧道映射openWRT web 界面面板443端口,无需公网IP,无需设置路由器。 1.openWRT安装cpola…

buuctf[强网杯 2019]随便注 1(超详细,三种解法)

第一种解法 堆叠注入 网页环境判断是否是字符型注入1判断是否存在关键字过滤select联合查询被过滤,只能用堆叠注入了查看有几个字段1 order by 2#正常回显1 order by 3#回显报错,可以看出只有两个字段查看所有数据库1; show databases;查看所有数据表1;…

python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色,

python,pandas ,openpyxl提取excel特定数据,合并单元格合并列,设置表格格式,设置字体颜色, 代码 import osimport numpy import pandas as pd import openpyxl from openpyxl.styles import Font from op…

数字音频工作站软件 Ableton Live 11 mac中文软件特点与功能

Ableton Live 11 mac是一款数字音频工作站软件,用于音乐制作、录音、混音和现场演出。它由Ableton公司开发,是一款极其流行的音乐制作软件之一。 Ableton Live 11 mac软件特点和功能 Comping功能:Live 11增加了Comping功能,允许用…

详解:飞讯是如何助力集团型制造企业实现数字化转型的

飞讯软件成立17年来,成功服务了上百家自动化装备及零部件制造企业,对这类企业的业务特点和痛点非常熟悉。在解决企业数字化转型挑战方面,我们拥有丰富的经验和技术平台优势。因此,于2022年我们与东莞一家大型自动化装备制造企业正…

Fuzz测试:自动化测试软件隐患和漏洞的秘密武器

0x01 什么是模糊测试 模糊测试(Fuzz Testing)是一种广泛用于软件安全和质量测试的自动化测试方法。它的基本思想是向输入参数或数据中注入随机、不规则或异常的数据,以检测目标程序或系统在处理不合法、不正常或边缘情况下的行为。模糊测试通…

Egg.js使用MySql数据库

最近在接手一个项目,vuenuxtegg,我也是刚开始学习egg.js,所以会将自己踩的坑都记录下来。 安装mysql 使用sequelize连接数据库,首先安装egg-sequelize和mysql2。 npm install --save egg-sequelize mysql2打开package.json文件…

优思学院|中质协六西格玛考试形式是什么样的?

中质协的考试形式主要为单选和多选题,近年也有加了一小部分填空题,和国际认证考试有很大区别,因为美质协(ASQ)、国际精益六西格玛研究所(ILSSI),又或者著名的PMP项目管理认证等都是采…

day51 --动态规划10

121. 买卖股票的最佳时机 122.买卖股票的最佳时机II 第一题:买卖股票的最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出…

Phthon下载库函数

在代码中使用import tushare as ts导入时编译会报错找不到tushare,此时则表示本地没有相应的库函数包 打开安装python的目录,找到pip.exe文件目录,例如D:\Python\Python311\Scripts,文件夹右键->在终端打开,输入pi…

RPC远程调用加密方法获取返回值

前言 从混淆的加密JS中还原了加密参数的具体生成流程,结果想从JS转python的过程中第一步就卡住了。开头密钥JS代码如下,但是水平有限不知道如何转为python实现(如果有大佬知道希望可以评论指点)。利用execjsjsdom来执行简化还原后的JS代码依旧无法实现。…

云游数智农业世界,体验北斗时空智能

今日,2023年中国国际农业机械展览会在武汉正式拉开帷幕,众多与会者云集,各类农机产品纷呈,盛况空前。 千寻位置作为国家北斗地基增强系统的建设与运营方,在中国国际农业机械展览会上亮相,以「北斗时空智能 …