更好,更快的超参数优化通过混合最好的人和机器。

hypermax的Python项目详细描述


简介

hypermax是优化算法的有力工具。它建立在强大的tpe算法的基础上,还具有其他特性 旨在帮助您更快、更轻松地获得最佳超参数。我们称我们的算法为自适应tpe,它是 快速准确的优化器,在探索风格和以智能方式开发风格策略之间进行权衡 根据你的结果。它取决于预先训练的机器学习模型,这些模型已经被教过如何优化 你的机器学习模式越快越好。阅读"优化优化"和"学习优化"中ATPE背后的研究。并通过下载hypermax为自己使用。

此外,hypermax会根据超参数结果自动为您提供各种图表。 hypermax可以在发生崩溃时轻松重启。hypermax可以监视算法的cpu和ram使用情况- 如果执行时间太长或使用的RAM太多,则自动终止进程。hypermax甚至有一个用户界面。 hypermax使您更容易、更快地获得您非常渴望的高性能超参数。

从今天开始优化!

hypermax的屏幕截图

安装

使用pip安装:

pip3 install hypermax -g

蟒蛇3是必需的。

入门(使用python库)

在hypermax中,定义超参数搜索,包括变量、搜索方法和 丢失函数,使用json对象作为配置文件。

入门(使用cli)

这是一个例子。假设您有以下文件model.py:

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}

通过定义具有所需值的json模式对象来配置超参数搜索空间:

{"hyperparameters":{"type":"object","properties":{"n_estimators":{"type":"number","min":1,"max":1000,"scaling":"logarithmic"}}}}

接下来,定义如何执行优化功能:

{"function":{"type":"python_function","module":"model.py","name":"trainModel"}}

接下来,需要定义超参数搜索:

{"search":{"method":"atpe","iterations":1000}}

接下来,设置要存储结果的位置,如果需要 生成的图形:

{"results":{"directory":"results","graphs":true}}

最后,如果要使用ui,需要提供指示:

{"ui":{"enabled":true}}

注意:目前windows环境不支持控制台ui,因此需要在 已启用属性。我们使用urwid.raw_display模块,它依赖于fcntl。有关详细信息,请参见此处

把所有这些放在一起,就创建了一个类似这样的文件search.json,定义了超参数搜索:

{"hyperparameters":{"type":"object","properties":{"n_estimators":{"type":"number","min":1,"max":1000,"scaling":"logarithmic"}}},"function":{"type":"python_function","module":"model","name":"trainModel"},"search":{"method":"atpe","iterations":1000},"results":{"directory":"results","graphs":true},"ui":{"enabled":true}}

现在您可以运行超参数搜索

$ hypermax search.json

hypermax将自动开始搜索超参数空间。如果你的电脑死机,你需要重新启动 你的超参数搜索,它很容易提供给它现有的结果目录作为第二个参数。超最大值 将自动拾取中断的位置。

pip3 install hypermax -g
0

结果

hypermax自动生成各种不同类型的结果供您分析。

超参数相关性

可以在用户界面内或在 你的结果目录。关联可以帮助您判断哪些超参数组合正在移动 针最多。请记住,负值或正值中的大值表示强相关性 在这两个超参数之间。接近0的值表示这些值之间的相关性很小 超级-参数。对角线访问将为您提供单参数相关性。

还应注意的是,这些数字被重新缩放到大约在-10和+10之间(保留原始符号)。 因此不是数学上定义的协方差。这样做是为了更容易看到重要的关系。

单参数损失图

单参数损失表

单参数损失图表在参数和损失之间创建散点图。这些是最有用的图表,通常是尝试 解释结果。hypermax将生成此图表的几个不同版本。原始版本将具有所有测试值。"扣环" 版本将尝试将超参数值合并到"bucket"中,并为每个bucket提供最小值-对于连续值的超参数非常有用 你有很多结果。"Top_10_Percent"版本只是向您显示结果前10%的散点图-当您希望在 这些最高性能值。

您还将得到模型执行所需时间的图表版本。如果在准确性和所用时间之间进行权衡很重要,则这可能很有用 给你。

双参数损失矩阵

两个参数损失矩阵是彩色编码图,可帮助您确定两个超参数之间的最佳值。

双参数损失矩阵

图形按以下方式进行颜色编码:

pip3 install hypermax -g
1

我们使用二次插值,这两个都提供了很好的平滑圆角,但不过分模糊关键区域。图表是由 将超参数值分成10个桶,形成一个10×10的正方形网格。我们用两种方法计算每个正方形的值:

图形的一个版本通过取该网格正方形中所有值的最小值来计算每个正方形的值。这通常是最有用的 图表。另一个版本通过取平均值来计算该值。第二个版本可能会受到异常结果的影响,但可能会显示出有趣的结果 有时会出现图案。

您还可以得到这个图表的版本,它只使用您结果的前10%,帮助您进一步关注 你的超参数空间。此外,您还可以为模型的执行时间完成此矩阵的版本-在CAES中这一点非常重要。

双参数响应矩阵

响应矩阵与损失矩阵非常相似。事实上-它显示所有相同的数据。只是颜色编码不同 为了突出不同的东西。损失矩阵基于全局统计定义其颜色。响应矩阵定义其颜色 仅基于每行中的一个值。这通常会突出显示重要的模式,例如一个超参数的最佳值 总是一样的,不管其他的超参数是什么(如下图所示,最佳助推回合似乎在40左右,不是 不管最大深度是多少。)

双参数响应矩阵>/P>

图形按以下方式进行颜色编码:

pip3 install hypermax -g
2

双参数散布

双参数散射沿着双参数损失矩阵。如果你担心损失矩阵也会试图推断 非常少的数据点,您可以检查分散性,以检查是否有一个像样的结果样本落在该区域内。

双参数散布

数值超参数

你要调整的大多数超参数都是数字。数字超参数的配置如下:

pip3 install hypermax -g
4

有3个必需参数-type、min和max。type应设置为"number",min和max应表示 您的范围。

还有三个可选参数。模式可以是统一正常(默认为统一)。scaling参数可以是线性的 或对数(默认为线性)。如果希望将值舍入到某个固定间隔,则可以另外设置舍入。四舍五入设置为1 将使您的参数成为整数。

对象超参数

超参数空间可以包含包含其他超参数的json对象。实际上,底层必须作为一个对象。简单地 将类型设置为对象并为其提供属性字段。

pip3 install hypermax -g
5

选择和决策点

tpe算法的真正威力来自它优化分类超参数的能力,包括那些使其他超参数 可用。为此,您可以提供其中一个或任意一个字段。此功能尚未完全测试,请随时提供帮助 出,

pip3 install hypermax -g
6

模型执行

执行模型有几种不同的方法。

python函数

执行模型的最直接的方法是定义一个python函数。为此,只需提供 "模块"和"名称"函数中的模块名和函数名,如下所示:

pip3 install hypermax -g
7

请记住,您没有包含模块名称的扩展名,上面没有".py"。模块是 使用蟒蛇标准系统引用。这意味着您可以直接引用当前工作中的任何文件 目录只需按其文件名。或者,您可以引用 在别处安装。只要这有效:

pip3 install hypermax -g
8

然后这将指向:

pip3 install hypermax -g
9

结果的格式

结果可以用两种格式之一提供。最简单的方法是直接将损失作为单个浮点值返回 从您的成本函数,或打印到您的可执行文件的标准输出。例如:

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
0

或作为可执行文件:

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
1

但是,如果使用多个loss,则必须将每个loss作为json对象的一部分返回。例如:

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
2

或作为可执行文件:

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
3

如果要在模型中存储其他元数据,可以。任何其他用途无法识别的字段都将自动视为元数据。

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
4

模型花费的时间由hypermax自动测量(时间可用于惩罚模型花费的时间过长,请参阅损失部分)。 但是,您可能只关心模型的执行/运行时,而不关心培训时间。在这些情况下,您可以返回time作为 一个附加变量。

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
5

需要注意的是,这一时间与用于auto_kill目的的时间不同。这是将在ui中显示并考虑进行优化的时间 目的。

由于运行时间或RAM使用而自动终止模型

有时候,你的模型在你的超参数空间的某些部分表现得很糟糕。因此这是可能的, 实际上,建议您对模型的运行时间和内存使用量设置额外的限制。这个 防止由于模型训练时间过长或完全崩溃而挂起优化例程 因为它使用的内存太多。

为此,只需添加一个auto_kill_max_timeauto_kill_max_ramauto_kill_max_system_ram选项,并设置 akill_loss变量,用于指示被终止的模型的损失。

自动杀戮最大时间以秒为单位。auto_kill_max_ramauto_kill_max_system_ram都在 兆字节,基于1024(不是1000)。

auto_kill_max_ram仅测量模型进程的ram。但是,如果您的成本函数有其他 占用RAM的子进程,这些将不被计算在内。因此,您可以在 这些情况是为了防止系统ram的总使用率太高(假设您的模型是 占用系统RAM)。您可以同时提供这两种服务(如果您愿意的话)。

auto_kill_loss只是一个浮点数,表示当模型 被杀。这有助于教会优化器避免导致模型死亡的超参数。

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
6

损失/成本函数(在建)

请注意,本节描述的是未来的功能,目前尚不支持。请忽略此部分。

我们支持多种不同类型的成本函数。

定时损失(在建)

您还可以将模型训练所需的时间作为损失函数之一。这样就方便了 教算法避免因参数过大而导致训练时间过长。许多算法都很差 参数的组合会导致较长的执行时间,但性能不会提高。

如果算法花费的时间小于目标时间,则不会产生任何惩罚。在这段时间里 目标时间最大时间,惩罚是二次引入的。在max_time时,惩罚是完全正确的 惩罚最大值

这通常会导致算法在target_timemax_time之间选择一个值,但更接近 目标时间。例如,使用以下命令:

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
7

如果算法耗时5.0秒,则不引入惩罚。在6.0秒时,惩罚是:

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
8

在9秒时,惩罚是:

importsklearn.datasetsimportsklearn.ensembleimportsklearn.metricsimportdatetimedeftrainModel(params):inputs,outputs=sklearn.datasets.make_hastie_10_2()startTime=datetime.now()model=sklearn.ensemble.RandomForestClassifier(n_estimators=int(params['n_estimators']))model.fit(inputs,outputs)predicted=model.predict(inputs)finishTime=datetime.now()auc=sklearn.metrics.auc(outputs,predicted)return{"loss":auc,"time":(finishTime-startTime).total_seconds()}
9

在10秒时,惩罚是:

{"hyperparameters":{"type":"object","properties":{"n_estimators":{"type":"number","min":1,"max":1000,"scaling":"logarithmic"}}}}
0

更长的时间将有更大的惩罚。

有关自适应TPE的详细信息

请看这里:

待办事项列表

请随意贡献!联系brad:brad@electricbrain.io">brad@electricbrain.io或github上的此处。我们欢迎更多的贡献者。

这是2018年8月4日创建的大任务清单。有些项目可能已经完成。

  • 结果
    • 能够配置保存位置。
    • 自动将结果上载到Google Drive
  • 模型执行
    • 自动杀死需要太多GPU RAM的型号
    • 需要太多磁盘/网络的Autokill型号(对此不确定)
    • 修复与使用过多文件处理程序相关的错误。
    • 将模型作为可执行文件执行
    • 通过ssh远程执行模型
    • 通过消息缓冲区(如rabbitmq或kafka)发送消息来执行模型(接收结果相同)
    • 在远程执行之前rsync a文件夹
    • 可以将其他任意元数据附加到模型结果中
    • 能够对模型进行"速度测试",在简化的数据集上测试超参数以测量速度。有助于在不执行完整模型的情况下消除坏的超参数。
    • 类似地,能够在模型上运行"内存测试",确保超参数不会导致过度的RAM使用
    • 能够在您最好的模型上自动运行额外的交叉折叠,以确保它们不是统计上的侥幸
    • 舍入设置为1的超参数应自动转换为整数
  • 配置:
    • 配置文件的json模式
    • json模式的验证
    • 接受yaml和json的能力
    • 能够在超参数模式内具有固定值。
    • 能够拥有"无界"超参数(仅当使用迭代优化时,因为tpe本身并不这样做)
    • 在数组中具有超参数的能力,例如层列表
  • 可靠性:
    • hypermax从默认关闭的位置保存结果/重新加载
    • 尝试锁定与hyperopt相关的软件包版本,以便人们在安装时不会遇到问题
    • 需要更好的方法来处理在ui代码中发生的异常
    • 执行线程应该只通过队列进行通信,消除共享变量(并在无法消除的变量中添加锁)
    • 控制随机种子并确保运行是可复制的
  • 通用用户界面:
    • 更改用户界面代码以使用适当的有组织的类,而不是当前的即席样式
    • 查看最近培训的车型
    • 能够在用户界面上查看培训损失和测试损失
    • 查看有错误的模型
    • 修复与数据表相关的ui问题(例如在超参数关联中)
    • 能够调整损失图表的最小值、最大值、平滑值和范围
    • 基于超参数和先验数据预测模型执行时间
    • 模特培训进度条
    • 导出超参数关联时可以更改文件名
    • 可以使用xdg open&;等效项立即打开导出的文件
    • 允许轻松查看/滚动大文本块的小部件。
    • 查看原始的超参数搜索配置,如json
    • 导出超参数时,应将其保存为输入模型的精确格式,而不是扁平结构
    • 在模型运行时查看超参数空间
    • 可以查看附加到模型的任意元数据
    • 使用户界面对不同的控制台大小作出响应(如网格系统)
    • 修复当终端调整大小时,用户界面不会自动调整大小
    • 通过Web浏览器访问用户界面
    • Web浏览器用户界面上的密码保护
    • 能够监控当前执行模型的RAM(和GPU RAM)使用情况
    • 能够监视当前执行的型号的磁盘使用情况
    • 能够监控当前执行模型的网络使用情况
    • 能够监视一般的系统状态,如CPU、网络、磁盘和RAM
  • 损耗:
    • 能够有多个加权损失函数
    • 基于最小值、最大值、目标值的渐近线,自动通过数学函数传递损失函数
    • 编写有关如何操作成本函数以提高结果的文档
    • 为您的车型增加额外损失时间的便捷方法
    • 自动计算的时间,但如果在结果中提供,则可以覆盖该时间
    • 可以在用户界面中查看给定模型的所有损失,而不仅仅是最终损失
    • 在您的机型上添加峰值或中值RAM(和GPU RAM)作为附加损耗的便捷方法
    • 将磁盘/网络使用量作为您的机型的附加损耗添加到手机中的便捷方法
  • 超参数调整工具:
    • 改进超参数相关的特征向量设计
    • 在模型运行时编辑/更改超参数空间
    • 估计搜索空间的基数
    • 估计每个参数(或类似的)的运行次数
    • 能够拟合超模型并对超参数搜索进行模拟扩展,尝试预测是否有更好的值尚未搜索
    • 能够使用超模型保持某些超参数不变,并确定剩余超参数的最佳值
    • 分阶段调整-可以有多个调整"阶段",一次只调整某些超参数或使用不同的配置
    • 每个超参数都可以有一个"默认"值,例如您当前的最佳型号。
    • 增量调整-基本上一次只调整少数超参数。可以是随机的或指定的
    • 能够更改TPE的超参数
    • 研究自动猜测tpe高参数的方法
    • 集成贝叶斯超参数优化作为tpe的替代方案
    • 集成网格搜索作为TPE的替代方案
    • 集成遗传算法作为tpe的替代方案
  • 命令行界面
    • 不带CUI执行模型
    • 要测试的下一个超参数示例
    • 导出所有现有类型的结果分析(相关性、热点网格、参数与损失等)
    • 启动Web浏览器UI(不带CUI)
    • 将模板配置文件写入当前目录
  • 库接口:
    • 能够通过调用库函数激活hypermax
    • 能够以python函数的形式直接提供我们的成本函数,而不是json描述
  • 测试
    • 为超参数配置编写单元测试
    • 为模型执行编写单元测试
    • 编写损失函数的单元测试
    • 为优化器编写单元测试
    • 为生成结果编写单元测试
    • 编写与可靠性相关的单元测试(启动/停止模型)
    • 为命令行界面编写单元测试
    • 为Web UI模块编写单元测试(确保它已加载)
    • 为CUI编写UI测试
    • 为几个不同的实际数据集/算法编写端到端优化测试
  • 模板超参数空间:
    • 为lightgbm创建模板超参数搜索
    • 为xgbboost创建模板超参数搜索
    • 创建模板超参数搜索各种scikit学习估计器
    • 引用模板的能力在您自己的json模式中搜索超参数($ref)
  • 发布/发布:
    • 在以下环境中测试hypermax,并修复安装配置的任何问题
      • 新鲜的虚拟环境
      • 新软呢帽安装
      • 新的ubuntu安装
      • MacOS
    • 为hypermax的自述文件编写所有文档
    • 创建github wiki,在githubwiki中复制自述文档
    • 创建hypermax网页作为电子大脑的子域,复制自述文件中的信息
    • 写一篇博客文章,讨论一般情况下的hypermax和hyper optimization
    • 创建优化示例:
      • 巨蟒
      • < < Java >
      • nodejs
      • 红宝石
    • 为以下对象创建系统包:
      • Fedora/Redhat/Centos
      • debian/ubuntu
      • MacOS
      • 窗口

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
无gc io的垃圾收集Java   java hibernate与@Any和@JoinTable的映射   哈希映射中的java哈希映射尝试插入某些内容   Java:KeyListeners确实可以工作,但只在我键入空格时工作   通过Ansible安装Jenkins时发现Java版本不正确   Arch Linux上的openjdk Neo4j启动超时   java jpa本机查询因union all和date字段org而失败。冬眠MappingException:没有JDBC类型1111的方言映射   维特斯。io java+twitter4j事件循环集成   eclipse Jar文件作为java中的代理   Micronaut中需要java异步编程吗?   java如何将JCIFS与apache VFS结合使用来访问SMB URL?   部署在heroku上的Java Maven项目无法启动并崩溃。应用程序错误H10   java RESTful API身份验证和进一步请求   java如何创建多个级别的子类,以便参数是子类的参数?   多线程Java FX画布在完成之前不会显示   对main()中的函数进行java JUnit测试   另一个类中的java变量访问   从java更新mySQL数据库上的int   java因超时而安全取消线程