【集成学习(上)】My 您所在的位置:网站首页 Optuna进行超参数调参 【集成学习(上)】My

【集成学习(上)】My

2023-05-20 20:59| 来源: 网络整理| 查看: 265

【集成学习(上)】My_Task04掌握回归模型的评估及超参数调优 笔记 原创

wx6325d39bd24bd 2022-12-15 20:41:53 博主文章分类:【集成学习】 ©著作权

文章标签 搜索 ci 交叉验证 文章分类 运维

©著作权归作者所有:来自51CTO博客作者wx6325d39bd24bd的原创作品,请联系作者获取转载授权,否则将追究法律责任

参数与超参数参数:通过模型训练得到,无需人为设置的是参数,像线性回归中的 y=ax+b 中的a非参数:需要人为设置,例如 lgbm等与决策树相关的模型num_leaves的参数超参数优化网格搜索GridSearchCV(): 网格搜索:https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html?highlight=gridsearchcv#sklearn.model_selection.GridSearchCV 网格搜索结合管道:https://scikit-learn.org/stable/auto_examples/compose/plot_compare_reduction.html?highlight=gridsearchcv 网格搜索的思想非常简单,比如你有2个超参数需要去选择,那你就把所有的超参数选择列出来分别做排列组合。举个例子: 𝜆=0.01,0.1,1.0 和 𝛼=0.01,0.1,1.0 ,你可以做一个排列组合,即:{[0.01,0.01],[0.01,0.1],[0.01,1],[0.1,0.01],[0.1,0.1],[0.1,1.0],[1,0.01],[1,0.1],[1,1]} ,然后针对每组超参数分别建立一个模型,然后选择测试误差最小的那组超参数。换句话说,我们需要从超参数空间中寻找最优的超参数,很像一个网格中找到一个最优的节点,因此叫网格搜索。随机搜索 RandomizedSearchCV() :​​​ https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html?highlight=randomizedsearchcv#sklearn.model_selection.RandomizedSearchCV​​​ 网格搜索相当于暴力地从参数空间中每个都尝试一遍,然后选择最优的那组参数,这样的方法显然是不够高效的,因为随着参数类别个数的增加,需要尝试的次数呈指数级增长。有没有一种更加高效的调优方式呢?那就是使用随机搜索的方式,这种方式不仅仅高校,而且实验证明,随机搜索法结果比稀疏化网格法稍好(有时候也会极差,需要权衡)。参数的随机搜索中的每个参数都是从可能的参数值的分布中采样的。与网格搜索相比,这有两个主要优点: 可以独立于参数数量和可能的值来选择计算成本。 添加不影响性能的参数不会降低效率。

通过使用SVR的例子,结合管道进行调优

# 我们先来对未调参的SVR进行评价: from sklearn.svm import SVR # 引入SVR类from sklearn.pipeline import make_pipeline # 引入管道简化学习流程from sklearn.preprocessing import StandardScaler # 由于SVR基于距离计算,引入对数据进行标准化的类from sklearn.model_selection import GridSearchCV # 引入网格搜索调优from sklearn.model_selection import cross_val_score # 引入K折交叉验证from sklearn import datasetsboston = datasets.load_boston() # 返回一个类似字典的类X = boston.datay = boston.targetfeatures = boston.feature_namespipe_SVR = make_pipeline(StandardScaler(),SVR())

score1 = cross_val_score(estimator = pipe_SVR,X = X,y = y,scoring = 'r2',cv = 10) # 10折交叉验证

print("CV accuracy: %.3f +/- %.3f" % ((np.mean(score1)),np.std(score1)))

CV accuracy: 0.187 +/- 0.649# 下面我们使用网格搜索来对SVR调参:from sklearn.pipeline import Pipelinepipe_svr = Pipeline([("StandardScaler",StandardScaler()), ("svr",SVR())])param_range = [0.0001,0.001,0.01,0.1,1.0,10.0,100.0,1000.0]param_grid = [{"svr__C":param_range,"svr__kernel":["linear"]}, # 注意__是指两个下划线,一个下划线会报错的 {"svr__C":param_range,"svr__gamma":param_range,"svr__kernel":["rbf"]}]gs = GridSearchCV(estimator=pipe_svr, param_grid = param_grid, scoring = 'r2', cv = 10) # 10折交叉验证gs = gs.fit(X,y)print("网格搜索最优得分:",gs.best_score_)print("网格搜索最优参数组合:\n",gs.best_params_)网格搜索最优得分: 0.6081303070817536网格搜索最优参数组合: {'svr__C': 1000.0, 'svr__gamma': 0.001, 'svr__kernel': 'rbf'}# 下面我们使用随机搜索来对SVR调参:from sklearn.model_selection import RandomizedSearchCVfrom scipy.stats import uniform # 引入均匀分布设置参数pipe_svr = Pipeline([("StandardScaler",StandardScaler()), ("svr",SVR())])distributions = dict(svr__C=uniform(loc=1.0, scale=4), # 构建连续参数的分布 svr__kernel=["linear","rbf"], # 离散参数的集合 svr__gamma=uniform(loc=0, scale=4))

rs = RandomizedSearchCV(estimator=pipe_svr, param_distributions = distributions, scoring = 'r2', cv = 10) # 10折交叉验证rs = rs.fit(X,y)print("随机搜索最优得分:",rs.best_score_)print("随机搜索最优参数组合:\n",rs.best_params_)

随机搜索最优得分: 0.30240411273864065随机搜索最优参数组合: {'svr__C': 1.1941350788707648, 'svr__gamma': 3.898205602334593, 'svr__kernel': 'linear'}distributions{'svc_C': , 'svr_kernel': ['linear', 'rbf'], 'svr_gamma': }

【集成学习(上)】My_Task04掌握回归模型的评估及超参数调优 笔记_交叉验证

​​参考链接​​参考 : ​​GitHub开源集成学习(上) Datawhale​​

​​最后一张图​​

收藏 评论 分享 举报

上一篇:Task02详读西瓜书+南瓜书第3章

下一篇:常见的数据分析师的面试问题 完整文件放在GitHub链接上了!!!擅用crtl + F



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有