标签: hyperparameters

使用R中的纯游侠包进行超参数调整

喜欢随机森林模型创建的游侠包的速度,但无法看到如何调整mtry或树的数量.我意识到我可以通过插入符号的train()语法来实现这一点,但我更喜欢使用纯粹的游侠来提高速度.

这是我使用游侠创建基本模型的例子(效果很好):

library(ranger)
data(iris)

fit.rf = ranger(
  Species ~ .,
  training_data = iris,
  num.trees = 200
)

print(fit.rf)
Run Code Online (Sandbox Code Playgroud)

查看调优选项的官方文档,似乎csrf()函数可以提供调整超参数的能力,但我无法正确获得语法:

library(ranger)
data(iris)

fit.rf.tune = csrf(
  Species ~ .,
  training_data = iris,
  params1 = list(num.trees = 25, mtry=4),
  params2 = list(num.trees = 50, mtry=4)
)

print(fit.rf.tune)
Run Code Online (Sandbox Code Playgroud)

结果是:

Error in ranger(Species ~ ., training_data = iris, num.trees = 200) : 
  unused argument (training_data = iris)
Run Code Online (Sandbox Code Playgroud)

而且我更愿意使用常规(读取:非csrf)rf算法游侠提供.对于游侠中任何一条路径的超参数调整解决方案有任何想法吗?谢谢!

model r random-forest hyperparameters

8
推荐指数
2
解决办法
5855
查看次数

试验 1 失败,因为值 None 无法转换为 float

我正在尝试使用 Optuna 调整额外的树分类器。

我在所有的试验中都收到这样的消息:

[W 2022-02-10 12:13:12,501] 试验 2 失败,因为值 None 无法转换为浮点数。

下面是我的代码。我所有的考验都会发生这种情况。谁能告诉我我做错了什么?

    def objective(trial, X, y):
    
        param = {
            'verbose': trial.suggest_categorical('verbosity', [1]),
            'random_state': trial.suggest_categorical('random_state', [RS]),
            'n_estimators': trial.suggest_int('n_estimators', 100, 150),
            'n_jobs': trial.suggest_categorical('n_jobs', [-1]),
        }
            
    
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=True, random_state=RS)
    
        clf = ExtraTreesClassifier(**param)
        
        clf.fit(X_train, y_train)
        
        y_pred = clf.predict(X_test)
        
        acc = accuracy_score(y_pred, y_test)
        print(f"Model Accuracy: {round(acc, 6)}")
        print(f"Model Parameters: {param}")
        print('='*50)
        return`
    
    
        study = optuna.create_study(
            direction='maximize',
            sampler=optuna.samplers.TPESampler(),
            pruner=optuna.pruners.HyperbandPruner(),
            study_name='ExtraTrees-Hyperparameter-Tuning')

    func = lambda trial: objective(trial, X, y)

    %%time …
Run Code Online (Sandbox Code Playgroud)

performance hyperparameters optuna

8
推荐指数
2
解决办法
5513
查看次数

有没有一种方法可以对一类SVM执行网格搜索超参数优化

有没有一种方法可以使用GridSearchCV或任何其他内置的sklearn函数来为OneClassSVM分类器找到最佳的超参数?

我目前要做的是使用训练/测试拆分自己执行搜索,如下所示:

Gamma和nu值定义为:

gammas = np.logspace(-9, 3, 13)
nus = np.linspace(0.01, 0.99, 99)
Run Code Online (Sandbox Code Playgroud)

探索所有可能的超参数并找到最佳参数的函数:

clf = OneClassSVM()

results = []

train_x = vectorizer.fit_transform(train_contents)
test_x = vectorizer.transform(test_contents)

for gamma in gammas:
    for nu in nus:
        clf.set_params(gamma=gamma, nu=nu)

        clf.fit(train_x)

        y_pred = clf.predict(test_x)

        if 1. in y_pred:  # Check if at least 1 review is predicted to be in the class
            results.append(((gamma, nu), (accuracy_score(y_true, y_pred),
                                              precision_score(y_true, y_pred),
                                              recall_score(y_true, y_pred),
                                              f1_score(y_true, y_pred),
                                              roc_auc_score(y_true, y_pred),
                                              ))
                               )

    # Determine and print the best parameter settings …
Run Code Online (Sandbox Code Playgroud)

svm scikit-learn multilabel-classification hyperparameters grid-search

7
推荐指数
2
解决办法
4180
查看次数

Hyperopt 中的 qloguniform 搜索空间设置问题

我正在使用 hyperopt 来调整我的 ML 模型,但在使用 qloguniform 作为搜索空间时遇到了麻烦。我给出了来自官方维基的例子并改变了搜索空间。

import pickle
import time
#utf8
import pandas as pd
import numpy as np
from hyperopt import fmin, tpe, hp, STATUS_OK, Trials

def objective(x):
    return {
        'loss': x ** 2,
        'status': STATUS_OK,
        # -- store other results like this
        'eval_time': time.time(),
        'other_stuff': {'type': None, 'value': [0, 1, 2]},
        # -- attachments are handled differently
        'attachments':
            {'time_module': pickle.dumps(time.time)}
        }
trials = Trials()
best = fmin(objective,
    space=hp.qloguniform('x', np.log(0.001), np.log(0.1), np.log(0.001)),
    algo=tpe.suggest,
    max_evals=100,
    trials=trials)
pd.DataFrame(trials.trials) …
Run Code Online (Sandbox Code Playgroud)

python machine-learning hyperparameters hyperopt

7
推荐指数
1
解决办法
1940
查看次数

什么是 hp.Discrete 和 hp.Realinterval?我可以在 hp.realinterval 中包含更多值而不是 2 个吗?

我按照此处的建议在 Tensorflow 2.0-beta0 中使用 HParams 仪表板使用超参数https://www.tensorflow.org/tensorboard/r2/hyperparameter_tuning_with_hparams

我在步骤 1 中感到困惑,找不到更好的解释。我的问题与以下几行有关:

HP_NUM_UNITS = hp.HParam('num_units', hp.Discrete([16, 32]))
HP_DROPOUT = hp.HParam('dropout', hp.RealInterval(0.1, 0.2))
HP_OPTIMIZER = hp.HParam('optimizer', hp.Discrete(['adam', 'sgd']))
Run Code Online (Sandbox Code Playgroud)

我的问题:我想尝试更多的 dropout 值,而不仅仅是两个(0.1 和 0.2)。如果我在其中写入更多值,则会引发错误-“最多可以给出 2 个参数”。我试图寻找文档,但找不到这些 hp.Discrete 和 hp.RealInterval 函数来自何处的任何内容。任何帮助,将不胜感激。谢谢!

hyperparameters tensorboard tensorflow2.0

7
推荐指数
1
解决办法
1829
查看次数

具有多个输入的 Keras 网格搜索

我正在尝试对我的超参数进行网格搜索,以调整深度学习架构。我有多个模型输入选项,我正在尝试使用 sklearn 的网格搜索 api。问题是,网格搜索api只接受单个数组作为输入,代码在检查数据大小维度时失败。(我的输入维度是5*数据点数,而根据sklearn api,它应该是数据点数*特征维度)。我的代码看起来像这样:

from keras.layers import Concatenate, Reshape, Input, Embedding, Dense, Dropout
from keras.models import Model
from keras.wrappers.scikit_learn import KerasClassifier

def model(hyparameters):
    a = Input(shape=(1,))
    b = Input(shape=(1,))
    c = Input(shape=(1,))
    d = Input(shape=(1,))
    e = Input(shape=(1,))

    //Some operations and I get a single output -->out
    model = Model([a, b, c, d, e], out)
    model.compile(optimizer='rmsprop',
                               loss='categorical_crossentropy',
                               metrics=['accuracy'])
    return model

k_model = KerasClassifier(build_fn=model, epochs=150, batch_size=512, verbose=2)
# define the grid search parameters
param_grid = hyperparameter options dict
grid = …
Run Code Online (Sandbox Code Playgroud)

python hyperparameters keras grid-search tensorflow

7
推荐指数
1
解决办法
1486
查看次数

如何在keras-tuner中选择超参数训练的优化器和学习率

我想使用 kerastuner 框架进行超参数训练。

我如何选择优化器以及可以传递给优化器的不同学习率。这是我的model.compile()方法。

        model.compile(
        loss=BinaryCrossentropy(from_logits=True),
        optimizer=hp.Choice('optimizer', values=['adam', 'adagrad', 'SGD']),
        metrics=['accuracy']
        )
Run Code Online (Sandbox Code Playgroud)

该代码一次仅选择一个优化器,并使用默认的学习率。我想将学习率传递hp.Float('lrate', min_value=1e-4, max_value=1e-2, sampling='LOG') 给每个优化器。我怎样才能嵌套它们。

machine-learning neural-network hyperparameters tensorflow keras-tuner

7
推荐指数
1
解决办法
2233
查看次数

Optuna 在多次试验中建议相同的参数值(重复试验浪费时间和预算)

由于某种原因,Optuna TPESampler 和 RandomSampler 多次尝试对任何参数使用相同的建议整数值(也可能是浮点数和对数统一值)。我找不到办法阻止它再次建议相同的值。在 100 次试验中,有相当多的试验都是重复的。在 100 次试验中,独特的建议值计数最终约为 80-90。如果我包含更多参数进行调整,例如 3 个,我什至会看到所有 3 个参数在 100 次试验中多次获得相同的值。

就像这样。min_data_in_leaf 为 75,使用了 3 次:

[I 2020-11-14 14:44:05,320] 试验 8 完成,值:45910.54012028659 和参数:{'min_data_in_leaf': 75}。最好的是试验 4,其值:45805.19030897498。

[I 2020-11-14 14:44:07,876] 试验 9 完成,值:45910.54012028659 和参数:{'min_data_in_leaf': 75}。最好的是试验 4,其值:45805.19030897498。

[I 2020-11-14 14:44:10,447] 试验 10 完成,值:45831.75933279074 和参数:{'min_data_in_leaf': 43}。最好的是试验 4,其值:45805.19030897498。

[I 2020-11-14 14:44:13,502] 试验 11 完成,值:46125.39810101329 和参数:{'min_data_in_leaf': 4}。最好的是试验 4,其值:45805.19030897498。

[I 2020-11-14 14:44:16,547] 试验 12 完成,值:45910.54012028659 和参数:{'min_data_in_leaf': 75}。最好的是试验 4,其值:45805.19030897498。

示例代码如下:

def lgb_optuna(trial):

    rmse = []

    params = {
        "seed": 42,
        "objective": "regression",
        "metric": …
Run Code Online (Sandbox Code Playgroud)

python machine-learning python-3.x hyperparameters optuna

7
推荐指数
1
解决办法
3466
查看次数

贝叶斯优化可能不适用于 CNN 的一些原因是什么

我尝试将贝叶斯优化应用于 MNIST 手写数字数据集的简单 CNN,但几乎没有迹象表明它有效。我已经尝试进行 k 折验证以消除噪声,但似乎优化仍然没有在收敛到最佳参数方面取得任何进展。一般来说,贝叶斯优化可能失败的一些主要原因是什么?在我的特殊情况下?

其余的只是上下文和代码片段。

型号定义:

def define_model(learning_rate, momentum):
    model = Sequential()
    model.add(Conv2D(32, (3,3), activation = 'relu', kernel_initializer = 'he_uniform', input_shape=(28,28,1)))
    model.add(MaxPooling2D((2,2)))
    model.add(Flatten())
    model.add(Dense(100, activation='relu', kernel_initializer='he_uniform'))
    model.add(Dense(10, activation='softmax'))
    opt = SGD(lr=learning_rate, momentum=momentum)
    model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])
    return model
Run Code Online (Sandbox Code Playgroud)

使用超参数运行一次训练:batch_size = 32,学习率 = 1e-2,Momentum = 0.9,10 个 epoch。(蓝色 = 训练,黄色 = 验证)。

在此处输入图片说明

盒须图用于 5 折交叉验证的准确性,具有与上述相同的超参数(以了解传播)

在此处输入图片说明

网格搜索将 batch_size 保持在 32,并保持 10 个纪元。我是在单次评估而不是 5 倍上这样做的,因为差价不足以破坏结果。

在此处输入图片说明 在此处输入图片说明

贝叶斯优化。如上,batch_size=32 和 10 epoch。在相同的范围内搜索。但这一次使用 5 折交叉验证来消除噪音。它应该进行 100 次迭代,但这还需要 20 个小时。

space = …
Run Code Online (Sandbox Code Playgroud)

python hyperparameters conv-neural-network keras hyperopt

6
推荐指数
1
解决办法
348
查看次数

AWS - Step 函数,在 TuningStep 中使用执行输入

我用一个步骤编写了一个简单的 AWS 步骤函数工作流程:

from stepfunctions.inputs import ExecutionInput
from stepfunctions.steps import Chain, TuningStep
from stepfunctions.workflow import Workflow
import train_utils


def main():
    workflow_execution_role = 'arn:aws:iam::MY ARN'
    execution_input = ExecutionInput(schema={
        'app_id': str
    })
    estimator = train_utils.get_estimator()
    tuner = train_utils.get_tuner(estimator)

    tuning_step = TuningStep(state_id="HP Tuning", tuner=tuner, data={
        'train': f's3://my-bucket/{execution_input["app_id"]}/data/'},
                             wait_for_completion=True,
                             job_name='HP-Tuning')

    workflow_definition = Chain([
        tuning_step
    ])

    workflow = Workflow(
        name='HP-Tuning',
        definition=workflow_definition,
        role=workflow_execution_role,
        execution_input=execution_input
    )
    workflow.create()


if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我的目标是从运行时提供的执行 JSON 中提取训练输入。当我执行工作流(从步骤函数控制台)时,提供 JSON{"app_id": "My App ID"}调整步骤不会获得正确的数据,而是获得stepfunctions.inputs.placeholders.ExecutionInput. 此外,在查看生成的 ASL 时,我可以看到执行输入被呈现为字符串:

... …
Run Code Online (Sandbox Code Playgroud)

python machine-learning state-machine hyperparameters aws-step-functions

6
推荐指数
1
解决办法
448
查看次数