参数搜索流形学习

目录

  • 一、网格搜索
    • 1、介绍
    • 2、代码示例
  • 二、HalvingGridSearch
    • 1、介绍
    • 2、代码示例
  • 三、随机搜索
    • 1、介绍
    • 2、代码示例
  • 三、贝叶斯搜索
    • 1、介绍
    • 2、代码示例
  • 四、参数搜索总结
  • 五、流形学习
    • 1、LLE
      • 1、介绍
      • 2、官方代码示例
    • 2、t-SNE
      • 1、介绍
      • 2、官方代码示例

一、网格搜索

1、介绍

网格搜索(grid search)是一种用来选择模型超参数的方法。它通过遍历超参数的所有可能组合来寻找最优的超参数。通常,网格搜索和交叉验证结合使用,以便在选择超参数时考虑模型的泛化能力。
在这里插入图片描述
如图,每个格子都是一组参数,使用交叉验证测试参数效果。但是效率低下。

2、代码示例

from sklearn.model_selection import GridSearchCV
param = {"n_estimators": np.arange(100,150,20),    # 启,止,步长"max_depth": np.arange(3,6,2),"subsample": [0.8, 0.9],"colsample_bytree": [0.8, 0.9]}XGB = XGBClassifier()
grid_XGB = GridSearchCV(XGB, param, cv=3, n_jobs=-1)  
grid_XGB.fit(Xtrain, Ytrain_spreading)print("AUC: ", roc_auc_score(Ytest, grid_XGB.predict_proba(Xtest)[:, 1]))
grid_XGB.best_params_ #最优参数
grid_XGB.best_estimator_ # 最优学习器

在这里插入图片描述

二、HalvingGridSearch

1、介绍

HalvingGridSearchCV使用连续减半搜索策略来评估指定的参数值。搜索开始时,使用少量资源(默认为样本数量)评估所有候选参数组合,并在后续的迭代中逐步增加资源量,同时仅选择表现最佳的候选参数组合进行进一步的评估。

  • 工作流程

    • 初始化:从全数据集中无放回随机抽样出一个很小的子集(d0),并在该子集上验证全部参数组合的性能。
    • 淘汰:根据d0上的验证结果,淘汰评分排在后一半的参数组合。
    • 迭代:从全数据集中无放回抽样出一个比前一个子集大一倍的子集(如d1),并在该子集上验证剩余参数组合的性能。继续淘汰评分较低的参数组合。
    • 循环:重复上述步骤,每次迭代都使用更大的数据集,直到备选参数组合只剩下1组或剩余可用数据不足为止
  • 优点

    • 加速搜索:由于HalvingGridSearchCV在开始时使用较小的数据集评估参数组合,并在后续迭代中逐渐增加数据量,因此能够显著减少计算量,加速搜索过程。
    • 高效利用资源:通过逐步增加资源量并仅保留表现最佳的参数组合,HalvingGridSearchCV能够更高效地利用计算资源。
  • 优点

    • 数据集大小:HalvingGridSearchCV在处理大数据集时效果最佳。如果数据集本身较小,可能无法充分发挥其优势。
    • 初始数据集选择:初始数据集(d0)的选择对最终结果有重要影响。为了确保结果的准确性,初始数据集应该尽可能反映整体数据的分布情况。
    • 实验性特性:HalvingGridSearchCV是Scikit-Learn中的一个实验性特性,其预测和API可能会在没有任何弃用周期的情况下发生变化。因此,在使用时需要谨慎,并随时关注Scikit-Learn的更新
  • 参数说明

    estimator:评估器对象,实现了scikit-learn估计器接口。
    param_grid:字典或字典列表,指定要搜索的参数空间。
    factor:整数或浮点数,默认为3。表示每次后续迭代选择的候选者比例。例如,factor=3表示每次迭代仅保留评分最高的1/3候选者。
    resource:字符串,指定用于调整资源分配的策略。默认为'n_samples',表示根据样本数量进行调整。
    max_resources:整数或'auto',指定最大资源量。默认为'auto',表示使用完整数据集作为最大资源量
    

2、代码示例

from sklearn.experimental import enable_halving_search_cv  # noqa
from sklearn.model_selection import HalvingGridSearchCVparam = {"n_estimators": np.arange(100,150,1),    # 启,止,步长"max_depth": np.arange(3,6,1),"subsample": np.arange(0.5,1,0.1),"colsample_bytree": np.arange(0.5,1,0.1)}XGB = XGBClassifier()
Hal_XGB = HalvingGridSearchCV(XGB, param, factor=3, cv=3, verbose=1, n_jobs=-1)  # 输出训练日志
Hal_XGB.fit(Xtrain, Ytrain_spreading)print("AUC: ", roc_auc_score(Ytest, Hal_XGB.predict_proba(Xtest)[:, 1]))
Hal_XGB.best_params_ #最优参数
Hal_XGB.best_estimator_

在这里插入图片描述
在这里插入图片描述

三、随机搜索

1、介绍

随机搜索(random search)与网格搜索类似,但不是遍历所有可能的超参数组合,而是从超参数空间中随机采样一定数量的组合进行评估。随机搜索的优点是计算成本较低,且在高维超参空间中表现良好,缺点是可能无法找到全局最优解。可以搜索小数点后很多位的情况,而网格搜索和Halving Search均不行。
在这里插入图片描述

2、代码示例

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniformparam = dict(n_estimators= np.arange(100,150,1),    # 启,止,步长max_depth= np.arange(3,6,1),subsample= uniform(loc=0.5, scale=0.5),   # 启,增加量,即搜索范围为0.5~1之间均匀分布的随机抽样colsample_bytree= uniform(loc=0.5, scale=0.5))XGB = XGBClassifier()
Rand_XGB = RandomizedSearchCV(XGB, param, cv=3, n_iter=50, verbose=1, n_jobs=-1)  
Rand_XGB.fit(Xtrain, Ytrain_spreading)print("AUC: ", roc_auc_score(Ytest, Rand_XGB.predict_proba(Xtest)[:, 1]))
Rand_XGB.best_params_ #最优参数
Rand_XGB.best_estimator_

在这里插入图片描述
为防止抽样时遗漏最优解,可增加采样次数,根据大数定律,抽样次数足够多时,肯定会找到最优解。

三、贝叶斯搜索

1、介绍

  • 贝叶斯优化上一种全局优化方法,用于寻找黑盒函数的全局最优解,它通过构建一个概率模型来描述目标函数,并使用这个模型来指导下一步的采样点选择。
  • 贝叶斯优化的核心思想上利用贝叶斯定理来更新对目标函数的先验知识。在每一步迭代中,它都会选择一个新的采样点,并使用这个采样点的观测值来更新概率模型。然后它使用一个获取函数来缺点下一个采样点,以便在探索和利用之间取得平衡。贝叶斯优化常用于机器学习的超参数选择,因为它能够在较少的迭代次数内找到全局最优解,并对噪声数据有很好的容错性。
    优点:
  • 贝叶斯调参采用高斯过程,考虑之前的参数信息,不断更新先验
  • 迭代次数少,速度快
  • 针对凸问题依然稳健

在这里插入图片描述

2、代码示例

import optunadef objective(trial):param = {'lambda_l2': trial.suggest_float('lambda_l2', 0.01, 10.0),'num_leaves': trial.suggest_int('num_leaves', 2, 256),'feature_fraction': trial.suggest_float('feature_fraction', 0.4, 1.0),'bagging_fraction': trial.suggest_float('bagging_fraction', 0.4, 1.0),}model = lightgbm.train(params= param, train_set= train, valid_sets= test) # 建模AUC= roc_auc_score(Ytest, model.predict(Xtest))   # matricreturn AUClgb_opt = optuna.create_study(direction='maximize')
lgb_opt.optimize(objective, n_trials=100)  # 100次迭代# 打印结果
lgb_opt.best_params
lgb_opt.best_value

在这里插入图片描述

四、参数搜索总结

理论上random search可以更快地将整个参数空间都覆盖到,而不是像grid search一样从局部一点点去搜索。但是grid search和random search,都属于无先验式的搜索,有些地方称之为uninformed search(盲目搜索),即每一步的搜索都不考虑已经探索的点的情况,这也是grid/random search的主要问题,都是“偷懒式搜索”,闭眼乱找一通。
而贝叶斯优化,则是一种informed search(启发式搜索),会利用签名已经搜索过的参数的表现,来推测下一步怎么走会比较好,从而减少搜索空间,提高搜索效率。某种意义上贝叶斯优化和人工调参比较像,因为人工调参也会根据已有的结果及经验来判断下一步如何调参。

五、流形学习

Manifold learning(流形学习)是一种高级的机器学习技术,主要用于非线性降维。其核心思想是识别和利用数据中潜在的低维结构,这种结构被认为是嵌入在高维空间中的流形(manifold)。

Manifold learning通过探索数据的内在几何和拓扑结构,揭示数据之间复杂的关系。适用于多种类型的数据的降维,尤其是那些线性方法难以处理的复杂数据集。

常用的Manifold learning方法有:LLE(Local Linear Embedding)和 t-SNE(t-Distributed Stochastic Neighbor Embedding)

1、LLE

1、介绍

LLE(Local Linear Embedding)LLE的工作原理可以分为三个主要步骤:

  1. 邻域选择:对于每个数据点,LLE首先找到其在高维空间中的最近邻。这些邻域可以通过固定的“邻域大小”(即固定数量的最近邻)或固定的“半径”(即距离范围内的所有邻居)来确定。

  2. 局部重建权重计算:LLE的核心假设是每个数据点都可以由其邻域内的其他点的线性组合来近似表示。因此,算法计算一组权重,这些权重最好地重建每个点作为其邻居的线性组合。具体地,LLE最小化每个点和它的重建之间的均方差,以找到最佳的重建权重。

  3. 嵌入到低维空间:在获得重建权重之后,LLE将数据映射到低维空间,同时尽量保持原有的重建权重。这意味着每个点在低维空间中的位置是由它在高维空间中的邻居的位置决定的。通过最小化重建误差,LLE寻找一个低维表示,其中每个点仍然尽可能接近于其高维邻居的线性组合。

优点:与其他降维方法相比,LLE不需要过多的参数调整。最主要的参数是邻域的大小。

缺点:LLE对邻域大小的选择相对敏感,不同的选择可能导致完全不同的降维结果。并且LLE有时可能陷入局部最优解,特别是在降维到非常低的维度时。

2、官方代码示例

import matplotlib.pyplot as pltfrom sklearn import datasets, manifoldsr_points, sr_color = datasets.make_swiss_roll(n_samples=1500, random_state=0)fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
fig.add_axes(ax)
ax.scatter(sr_points[:, 0], sr_points[:, 1], sr_points[:, 2], c=sr_color, s=50, alpha=0.8
)
ax.set_title("Swiss Roll in Ambient Space")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)

在这里插入图片描述

sr_lle, sr_err = manifold.locally_linear_embedding(sr_points, n_neighbors=12, n_components=2
)sr_tsne = manifold.TSNE(n_components=2, perplexity=40, random_state=0).fit_transform(sr_points
)fig, axs = plt.subplots(figsize=(8, 8), nrows=2)
axs[0].scatter(sr_lle[:, 0], sr_lle[:, 1], c=sr_color)
axs[0].set_title("LLE Embedding of Swiss Roll")
axs[1].scatter(sr_tsne[:, 0], sr_tsne[:, 1], c=sr_color)
_ = axs[1].set_title("t-SNE Embedding of Swiss Roll")

在这里插入图片描述

2、t-SNE

1、介绍

t-SNE(t-Distributed Stochastic Neighbor Embedding)t-SNE的工作原理可以分为三个主要步骤:

  1. 高维空间中的相似性:t-SNE首先在高维空间中计算每一对数据点之间的相似性。这种相似性通常通过高斯分布(正态分布)来建模,并且是基于欧几里得距离的。对于每一个点 x i x_i xi,我们计算它和其他所有点 x j x_j xj之间的条件概率 P j ∣ i P_{j|i} Pji,这个概率反映了点 x j x_j xj被选择为 x i x_i xi的邻居的可能性。

  2. 低维空间中的相似性:然后,t-SNE在低维空间中为每个数据点创建一个对应点,并计算低维空间中点之间的相似性。在低维空间中,相似性通过t分布来计算,这有助于解决高维空间中的“拥挤问题”(crowding problem)。

  3. 最小化Kullback-Leibler(KL)散度:t-SNE的目标是使高维空间和低维空间中的相似性尽可能接近。这通过最小化KL散度来实现,KL散度是一种度量两个概率分布差异的方法。通过优化过程,t-SNE调整低维空间中的点,使得KL散度最小化。

优点:t-SNE通常会在低维表示中形成不同的簇,这些簇可以揭示数据中的固有分组。因此在大多数真实数据中,t_SNE的表现是最好的。

缺点:t-SNE对邻域大小(参数名为“困惑度”)的选择非常敏感,它会直接影响局部与全局结构的平衡。

2、官方代码示例

sh_points, sh_color = datasets.make_swiss_roll(n_samples=1500, hole=True, random_state=0
)fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection="3d")
fig.add_axes(ax)
ax.scatter(sh_points[:, 0], sh_points[:, 1], sh_points[:, 2], c=sh_color, s=50, alpha=0.8
)
ax.set_title("Swiss-Hole in Ambient Space")
ax.view_init(azim=-66, elev=12)
_ = ax.text2D(0.8, 0.05, s="n_samples=1500", transform=ax.transAxes)

在这里插入图片描述

sh_lle, sh_err = manifold.locally_linear_embedding(sh_points, n_neighbors=12, n_components=2
)sh_tsne = manifold.TSNE(n_components=2, perplexity=40, init="random", random_state=0
).fit_transform(sh_points)fig, axs = plt.subplots(figsize=(8, 8), nrows=2)
axs[0].scatter(sh_lle[:, 0], sh_lle[:, 1], c=sh_color)
axs[0].set_title("LLE Embedding of Swiss-Hole")
axs[1].scatter(sh_tsne[:, 0], sh_tsne[:, 1], c=sh_color)
_ = axs[1].set_title("t-SNE Embedding of Swiss-Hole")

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

BKP备份寄存器RTC实时时钟

BKP备份寄存器&RTC实时时钟 VDDA和VSSA是内部模拟部分的电路 VDD和VSS_1、2、3是内部数字电路的供电。系统以VDD开头的电源都是主电源。在正常使用STM32时,全部需要接到3.3v电源上。 VBAT备用电池供电引脚,如使用STM32内部的BKP和RTC,引…

SpringBoot修改banner

在resources目录下创建banner.txt文件 到该网站下选择banner https://www.bootschool.net/ascii-art 点击拷贝: 粘贴到banner.txt中,保存 重新运行项目即可:

JavaScript Window对象之(BOM、JS 执行机制、location对象、navigator对象、histroy对象、本地存储)

目录 1. BOM(浏览器对象模型)2. JS 执行机制3. location对象4. navigator对象5. histroy对象6. 本地存储6.1 localStorage6.2 sessionStorage 1. BOM(浏览器对象模型) BOM(Browser Object Model)是浏览器对象模型。其中window对象是JavaScript中一个全局的顶级对象基本的BOM属性…

MAC M1系统编译ffmpeg-gl-transition

MAC M1系统编译ffmpeg-gl-transition 1. 本人系统2. 编译💰系统准备2.1. 下载【ffmpeg-gl-transition】到用户家目录下,并解压2.2 下载ffmpeg源码2.3. brew安装GLEW glfw32.4 复制vf_gltransition.c文件到ffmpeg2.5 修改ffmpeg源码文件2.6 设置库目录和…

SpringBoot购物网站

摘要 随着信息技术的高速发展,二十一世纪的网络技术和网络应用正在快速融入人们的生活,并且由于网络服务以及网络应用日渐普及,人们对于现在生活的需求也随之增长,而网上购物的便捷对人们的吸引力越来越大,购物网站可…

Redis 5种常用数据类型

目录 Redis简介 1.字符串 string 2.哈希 hash 3.列表 list 4.集合 set 5.有序集合 sorted set / zset Redis简介 Redis,全称Remote Dictionary Server,是一个开源的、内存中的数据结构存储系统。它可以用作数据库、缓存和消息中间件,支…

面向对象和面向过程

Python完全采用了面向对象的思想,是真正面向对象的编程语言,完全支持面向对象的基本功能,例如:继承、多态、封装等。 Python支持面向过程、面向对象、函数式编程等多种编程方式。而Java编程语言支持面向对象的编程方式&#xff0…

论文阅读Rolling-Unet,卷积结合MLP的图像分割模型

这篇论文提出了一种新的医学图像分割网络Rolling-Unet,目的是在不用Transformer的前提下,能同时有效提取局部特征和长距离依赖性,从而在性能和计算成本之间找到良好的平衡点。 论文地址:https://ojs.aaai.org/index.php/AAAI/article/view/2…

leetcode LRU 缓存

leetcode: LRU 缓存 LRU 全称为 Least Recently Used,最近最少使用,常常用于缓存机制,比如 cpu 的 cache 缓存,使用了 LRU 算法。LRU 用于缓存机制时,关键的是当缓存满的时候有新数据需要加载到缓存的,这个…

streamlit markdown里支持latex公式显示

参考: https://docs.streamlit.io/develop/api-reference/write-magic/st.write https://discuss.streamlit.io/t/streamlit-markdown-a-streaming-markdown-component-with-latex-mermaid-table-code-support/72187 也有独立支持的st.latex 接口单独显示公司&…

Python 引入中文py文件

目录 背景 思路 importlib介绍 使用方法 1.导入内置库 importlib.util 2.创建模块规格对象 spec importlib.util.spec_from_file_location("example_module", "example.py") 3.创建模块对象 module importlib.util.module_from_spec(spec) …

远程工作岗位机会

电鸭:​​​​​​https://eleduck.com/?sortnew电鸭社区是具有8年历史的远程工作招聘社区,也是远程办公互联网工作者们的聚集地。在社区,我们进行有价值的话题讨论,也分享远程、外包、零活、兼职、驻场等非主流工作机会。「只工…

从客户端WebAPI视角下解读前端学习

API 应用程序接口(API,Application Programming Interface)是基于编程语言构建的结构,使开发人员更容易地创建复杂的功能。它们抽象了复杂的代码,并提供一些简单的接口规则直接使用。 JavaScript VS 客户端 API VS 客…

麒麟Kylin | 操作系统的安装与管理

以下所使用的环境为:VMware Workstation 17 Pro、Kylin-Server-10-SP2-x86-Release-Build09-20210524 一、创建虚拟机 在VMware主机单击【创建新的虚拟机】 **在新建虚拟机向导中选择【自定义】,然后点击【下一步】 ** 保持默认选项,然后…

elasticsearch hanlp插件远程词典配置

elasticsearch hanlp插件远程词典配置 背景远程词典配置新增远程词典文件修改hanlp-remote.xml自动加载词典 远程词典测试 背景 在使用elasticsearch的过程中,总会遇到与分词相关的需求,这里将针对常用的elasticsearch hanlp(后面统称为 es …

SpringBoot三层架构

目录 一、传统方式 二、三层架构 三、代码拆分 1、dao层 2、service层 3、control层 四、运行结果 一、传统方式 上述代码存在一定的弊端,在进行软件设计和软件开发中提倡单一责任原则,使代码的可读性更强,复杂性更低,可扩展性…

毕业答辩PPT:如何在短时间内高效准备?

提起PPT,大家的第一反应就是痛苦。经常接触PPT的学生党和打工人,光看到这3个字母,就已经开始头痛了: 1、PPT内容框架与文案挑战重重,任务艰巨,耗费大量精力。 2、PPT的排版技能要求高,并非易事…

R语言统计分析——数据集概念和数据结构

参考资料:R语言实战.第2版 1、数据集的概念 数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。 不同行业对于数据集的行和列叫法不同。统计学称为观测(observation)和变量(variable&#xff…

mysql数据库中触发器的使用

一、修改分隔符号 delimiter $$或者是//或者~~都行 二、创建触发器函数名称 create trigger 函数名 三、什么样的操作出发,操作那个表 after:.....之后触发 befor:.....之前触发 insert: 插入触发 update:修改被触发 d…

什么是隐马尔可夫模型?

文章目录 一、说明二、玩具HMM:5′拼接位点识别三、那么,隐藏了什么?四、查找最佳状态路径五、超越最佳得分对齐六、制作更逼真的模型七、收获 关键词:hidden markov model 一、说明 被称为隐马尔可夫模型的统计模型是计算生物学…