精华内容
下载资源
问答
  • 参数优化
    千次阅读
    2020-05-12 14:47:39

    **

    优化器的使用:

    **
    在机器学习与深度学习中,主要应用于梯度下降。比如:传统的优化器主要结合数据集,通过变化单次循环所采用的数据量的大小来对梯度下降进行控制;非传统的优化器则进一步结合数据集的特点和模型的训练时间,以不同的形式变化梯度下降的学习率。
    常见的优化器
    SGD、BGD、MBGD、Momentum、NAG、Adagrad、RMSprop、Adam
    梯度下降的原理:
    θn+1=θn−η▽θJ(θ)
    其中η为学习率;θn为更新前的参数;θn+1为更新后的参数;▽θJ(θ)是当前参数的导数。
    1.SGD(Stochastic Gradient Descent )
    SGD随机梯度下降参数更新原则:单条数据就可对参数进行一次更新。
    优点:参数更新速度快。
    缺点:由于每次参数更新时采用的数据量很小,造成梯度更新时震荡幅度大,但大多数情况都是向着梯度减小的方向。

    2.BGD(Batch Gradient Descent )
    BGD批量梯度下降参数更新原则:所有数据都参与参数的每一次更新。
    优点:由于每次参数更新时采用的数据量很大,梯度更新时很平滑。
    缺点:由于每次参数更新时采用的数据量很大,造成参数更新速度慢。

    更多相关内容
  • 基于MATLAB的倒立摆控制及参数优化 基于MATLAB的倒立摆控制及参数优化 基于MATLAB的倒立摆控制及参数优化 基于MATLAB的倒立摆控制及参数优化 基于MATLAB的倒立摆控制及参数优化 基于MATLAB的倒立摆控制及参数优化 ...
  • 参数优化

    千次阅读 2021-07-02 21:58:57
    参数优化,应该是所有机器学习模型都必须要经历的一个过程。很早以前训练模型,比如分类,认为精度达到90%或者自己觉得足够的精度就已经OK,但这其实是远远不够的。在Kaggle比赛中,寻找好的特征是一方面,有最佳...

    超参数优化,应该是所有机器学习模型都必须要经历的一个过程。很早以前训练模型,比如分类,认为精度达到90%或者自己觉得足够的精度就已经OK,但这其实是远远不够的。在Kaggle比赛中,寻找好的特征是一方面,有最佳的超参数也必不可少。尤其是现在使用集成学习比如随机森林、XGBoost等,超参数对模型的性能影响很大,必须要考虑。

    超参数优化超参数优化(Hyperparameter Optimization)主要存在两方面的困难

    (1)超参数优化是一个组合优化问题,无法像一般参数那样通过梯度下降方法来优化,而且,没有一种通用有效的优化方法,即每个人认为的最佳优化方法不同。

    (2)评估一组超参数配置(Configuration)的时间代价非常高,从而导致一些优化方法(深度神经网络)在超参数优化中难以应用,一组超参数意味着要训练一次深度神经网络,这将极大地的提高成本。

    假设一个机器学习模型中总共有𝐾个超参数,每个超参数配置表示为一个向量

    x ∈ 𝒳,𝒳 ⊂ R^{K} 是超参数配置的取值空间. 超参数优化的目标函数定义为

    𝑓(x) ∶ 𝒳 → R,𝑓(x) 是衡量一组超参数配置x 效果的函数,一般设置为测试集上的错误率. 目标函数𝑓(x) 可以看作是一个黑盒(black-box)函数,不需要知道其具体形式。虽然在神经网络的超参数优化中,𝑓(x) 的函数形式已知,但𝑓(x) 不是关于x的连续函数,并且x不同,𝑓(x)的函数形式也不同,因此无法使用梯度下降等优化方法。

    比较常用的方法有网格搜索、随机搜索、贝叶斯优化、动态资源分配、神经架构搜索等。这里可以介绍一下网络搜索和随机搜索,贝叶斯优化在之前的博文中提到,下次更新动态资源分配和神经架构。

    网格搜索(Grid Search)

    是一种通过尝试所有超参数的组合来寻址合适一组超参数配置的方法.。假设总共有𝐾个超参数,第𝑘个超参数的可以取𝑚𝑘个值。那么总共的配置组合数量为𝑚1 × 𝑚2 × ⋯ × 𝑚𝐾 . 如果超参数是连续的,可以将超参数离散化,选择几个“经验”值。比如学习率𝛼,我们可以设置𝛼∈{1,2,3,4,5},一般而言,对于连续的超参数,我们不能按等间隔的方式进行离散化,需要根据超参数自身的特点进行离散化。网格搜索根据这些超参数的不同组合分别训练一个模型,然后测试这些模型在测试集上的性能,选取一组性能最好的配置。

    网格搜索的弊端在于过于耗时,如果有三个超参数,每个参数有10个取值,那就要训练1000次模型。其优势也很明显,相当于枚举,最佳的超参数是肯定能够被找到的。

    随机搜索(Random Search)

    不同超参数对模型性能的影响有很大差异。有些超参数(比如正则化系数)对模型性能的影响有限,而另一些超参数(比如学习率)对模型性能影响比较大。在这种情况下,采用网格搜索会在不重要的超参数上进行不必要的尝试。一种在实践中比较有效的改进方法是对超参数进行随机组合,然后选取一个性能最好的配置,这就是随机搜索(Random Search)。随机搜索在实践中更容易实现,一般会比网格搜索更加有效。网格搜索和随机搜索都没有利用不同超参数组合之间的相关性,即如果模型的超参数组合比较类似,其模型性能也是比较接近的。

    随机搜索的优势在于可以使用更少的计算成本来得到看似最佳的超参数,这种又与奥卡姆剃刀原则相关联,我们可以选择一个精度较高、计算成本更低的模型,那就用随机搜索。

    更理想的是使用贝叶斯优化,在之前的博文有专门讲到,既然把𝑓(x)当成黑盒子,那模型的性能与超参数之间也是一个黑盒子的关系,这个时候用贝叶斯最合适不过。

    展开全文
  • 本程序有算例分析,详细介绍了三种优化SVM方法:遗传算法、PSO、网格搜索法
  • 在本文中,我们将深入研究超参数优化。为了方便起见本文将使用 Tensorflow 中包含的 Fashion MNIST[1] 数据集。该数据集在训练集中包含 60,000 张灰度图像,在测试集中包含 10,000 张图像。每张图片代表属于 10 个...

    在本文中,我们将深入研究超参数优化。

    为了方便起见本文将使用 Tensorflow 中包含的 Fashion MNIST[1] 数据集。该数据集在训练集中包含 60,000 张灰度图像,在测试集中包含 10,000 张图像。每张图片代表属于 10 个类别之一的单品(“T 恤/上衣”、“裤子”、“套头衫”等)。因此这是一个多类分类问题。

    这里简单介绍准备数据集的步骤,因为本文的主要内容是超参数的优化,所以这部分只是简单介绍流程,一般情况下,流程如下:

    • 加载数据。
    • 分为训练集、验证集和测试集。
    • 将像素值从 0–255 标准化到 0–1 范围。
    • One-hot 编码目标变量。
    #load data
    (train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
    
    # split into train, validation and test sets
    train_x, val_x, train_y, val_y = train_test_split(train_images, train_labels, stratify=train_labels, random_state=48, test_size=0.05)
    (test_x, test_y)=(test_images, test_labels)
    
    # normalize pixels to range 0-1
    train_x = train_x / 255.0
    val_x = val_x / 255.0
    test_x = test_x / 255.0
    
    #one-hot encode target variable
    train_y = to_categorical(train_y)
    val_y = to_categorical(val_y)
    test_y = to_categorical(test_y)
    

    我们所有训练、验证和测试集的形状是:

    print(train_x.shape)  #(57000, 28, 28)
    print(train_y.shape)  #(57000, 10)
    print(val_x.shape)    #(3000, 28, 28)
    print(val_y.shape)    #(3000, 10)
    print(test_x.shape)   #(10000, 28, 28)
    print(test_y.shape)   #(10000, 10)
    

    现在,我们将使用 Keras Tuner 库 [2]:它将帮助我们轻松调整神经网络的超参数:

    pip install keras-tuner
    

    Keras Tuner 需要 Python 3.6+ 和 TensorFlow 2.0+

    超参数调整是机器学习项目的基础部分。有两种类型的超参数:

    • 结构超参数:定义模型的整体架构(例如隐藏单元的数量、层数)
    • 优化器超参数:影响训练速度和质量的参数(例如学习率和优化器类型、批量大小、轮次数等)

    为什么需要超参数调优库?我们不能尝试所有可能的组合,看看验证集上什么是最好的吗?

    这肯定是不行的因为深度神经网络需要大量时间来训练,甚至几天。如果在云服务器上训练大型模型,那么每个实验实验都需要花很多的钱。

    因此,需要一种限制超参数搜索空间的剪枝策略。

    keras-tuner提供了贝叶斯优化器。它搜索每个可能的组合,而是随机选择前几个。然后根据这些超参数的性能,选择下一个可能的最佳值。因此每个超参数的选择都取决于之前的尝试。根据历史记录选择下一组超参数并评估性能,直到找到最佳组合或到达最大试验次数。我们可以使用参数“max_trials”来配置它。

    除了贝叶斯优化器之外,keras-tuner还提供了另外两个常见的方法:RandomSearch 和 Hyperband。我们将在本文末尾讨论它们。

    接下来就是对我们的网络应用超参数调整。我们尝试两种网络架构,标准多层感知器(MLP)和卷积神经网络(CNN)。

    首先让我们看看基线 MLP 模型是什么:

    model_mlp = Sequential()
    model_mlp.add(Flatten(input_shape=(28, 28)))
    model_mlp.add(Dense(350, activation='relu'))
    model_mlp.add(Dense(10, activation='softmax'))
    print(model_mlp.summary())
    model_mlp.compile(optimizer="adam",loss='categorical_crossentropy')
    

    调优过程需要两种主要方法:

    hp.Int():设置超参数的范围,其值为整数 - 例如,密集层中隐藏单元的数量:

    model.add(Dense(units = hp.Int('dense-bot', min_value=50, max_value=350, step=50))
    

    hp.Choice():为超参数提供一组值——例如,Adam 或 SGD 作为最佳优化器?

    hp_optimizer=hp.Choice('Optimizer', values=['Adam', 'SGD'])
    

    在我们的 MLP 示例中,我们测试了以下超参数:

    • 隐藏层数:1-3
    • 第一密集层大小:50–350
    • 第二和第三密集层大小:50–350
    • Dropout:0、0.1、0.2
    • 优化器:SGD(nesterov=True,momentum=0.9) 或 Adam
    • 学习率:0.1、0.01、0.001

    代码如下:

    model = Sequential()
    
    model.add(Dense(units = hp.Int('dense-bot', min_value=50, max_value=350, step=50), input_shape=(784,), activation='relu'))
    
    for i in range(hp.Int('num_dense_layers', 1, 2)):
      model.add(Dense(units=hp.Int('dense_' + str(i), min_value=50, max_value=100, step=25), activation='relu'))
      model.add(Dropout(hp.Choice('dropout_'+ str(i), values=[0.0, 0.1, 0.2])))
    
    model.add(Dense(10,activation="softmax"))
    
    hp_optimizer=hp.Choice('Optimizer', values=['Adam', 'SGD'])
    
    if hp_optimizer == 'Adam':
        hp_learning_rate = hp.Choice('learning_rate', values=[1e-1, 1e-2, 1e-3])
    elif hp_optimizer == 'SGD':
        hp_learning_rate = hp.Choice('learning_rate', values=[1e-1, 1e-2, 1e-3])
        nesterov=True
        momentum=0.9
    

    这里需要注意第 5 行的 for 循环:让模型决定网络的深度!

    最后,就是运行了。请注意我们之前提到的 max_trials 参数。

    model.compile(optimizer = hp_optimizer, loss='categorical_crossentropy', metrics=['accuracy'])
    
    tuner_mlp = kt.tuners.BayesianOptimization(
        model,
        seed=random_seed,
        objective='val_loss',
        max_trials=30,
        directory='.',
        project_name='tuning-mlp')
    tuner_mlp.search(train_x, train_y, epochs=50, batch_size=32, validation_data=(dev_x, dev_y), callbacks=callback)
    

    我们得到结果

    这个过程用尽了迭代次数,大约需要 1 小时才能完成。我们还可以使用以下命令打印模型的最佳超参数:

    best_mlp_hyperparameters = tuner_mlp.get_best_hyperparameters(1)[0]
    print("Best Hyper-parameters")
    best_mlp_hyperparameters.values
    

    现在我们可以使用最优超参数重新训练我们的模型:

    model_mlp = Sequential()
    
    model_mlp.add(Dense(best_mlp_hyperparameters['dense-bot'], input_shape=(784,), activation='relu'))
    
    for i in range(best_mlp_hyperparameters['num_dense_layers']):
      model_mlp.add(Dense(units=best_mlp_hyperparameters['dense_' +str(i)], activation='relu'))
      model_mlp.add(Dropout(rate=best_mlp_hyperparameters['dropout_' +str(i)]))
      
    model_mlp.add(Dense(10,activation="softmax"))
    
    model_mlp.compile(optimizer=best_mlp_hyperparameters['Optimizer'], loss='categorical_crossentropy',metrics=['accuracy'])
    history_mlp= model_mlp.fit(train_x, train_y, epochs=100, batch_size=32, validation_data=(dev_x, dev_y), callbacks=callback)
    

    或者,我们可以用这些参数重新训练我们的模型:

    model_mlp=tuner_mlp.hypermodel.build(best_mlp_hyperparameters)
    
    history_mlp=model_mlp.fit(train_x, train_y, epochs=100, batch_size=32, 
                               validation_data=(dev_x, dev_y), callbacks=callback)
    

    然后测试准确率

    mlp_test_loss, mlp_test_acc = model_mlp.evaluate(test_x,  test_y, verbose=2)
    print('\nTest accuracy:', mlp_test_acc)
    
    # Test accuracy: 0.8823
    

    与基线的模型测试精度相比:

    基线 MLP 模型:86.6 %最佳 MLP 模型:88.2 %。测试准确度的差异约为 3%!

    下面我们使用相同的流程,将MLP改为CNN,这样可以测试更多参数。

    首先,这是我们的基线模型:

    model_cnn = Sequential()
    model_cnn.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
    model_cnn.add(MaxPooling2D((2, 2)))
    model_cnn.add(Flatten())
    model_cnn.add(Dense(100, activation='relu'))
    model_cnn.add(Dense(10, activation='softmax'))
    model_cnn.compile(optimizer="adam", loss='categorical_crossentropy', metrics=['accuracy'])
    

    基线模型 包含卷积和池化层。对于调优,我们将测试以下内容:

    1. 卷积、MaxPooling 和 Dropout 层的“块”数
    2. 每个块中 Conv 层的过滤器大小:32、64
    3. 转换层上的有效或相同填充
    4. 最后一个额外层的隐藏层大小:25-150,乘以 25
    5. 优化器:SGD(nesterov=True,动量=0.9)或 Adam
    6. 学习率:0.01、0.001
    model = Sequential()
    
    model = Sequential()
    model.add(Input(shape=(28, 28, 1)))
    
    for i in range(hp.Int('num_blocks', 1, 2)):
        hp_padding=hp.Choice('padding_'+ str(i), values=['valid', 'same'])
        hp_filters=hp.Choice('filters_'+ str(i), values=[32, 64])
    
        model.add(Conv2D(hp_filters, (3, 3), padding=hp_padding, activation='relu', kernel_initializer='he_uniform', input_shape=(28, 28, 1)))
        model.add(MaxPooling2D((2, 2)))
        model.add(Dropout(hp.Choice('dropout_'+ str(i), values=[0.0, 0.1, 0.2])))
    
    model.add(Flatten())
    
    hp_units = hp.Int('units', min_value=25, max_value=150, step=25)
    model.add(Dense(hp_units, activation='relu', kernel_initializer='he_uniform'))
    
    model.add(Dense(10,activation="softmax"))
    
    hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3])
    hp_optimizer=hp.Choice('Optimizer', values=['Adam', 'SGD'])
    
    if hp_optimizer == 'Adam':
        hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3])
    elif hp_optimizer == 'SGD':
        hp_learning_rate = hp.Choice('learning_rate', values=[1e-2, 1e-3])
        nesterov=True
        momentum=0.9
    

    像以前一样,我们让网络决定它的深度。最大迭代次数设置为 100:

    model.compile( optimizer=hp_optimizer,loss='categorical_crossentropy', metrics=['accuracy'])
    
    tuner_cnn = kt.tuners.BayesianOptimization(
        model,
        objective='val_loss',
        max_trials=100,
        directory='.',
        project_name='tuning-cnn')
    

    结果如下:

    在这里插入图片描述

    得到的超参数

    在这里插入图片描述

    最后使用最佳超参数训练我们的 CNN 模型:

    model_cnn = Sequential()
    
    model_cnn.add(Input(shape=(28, 28, 1)))
    
    for i in range(best_cnn_hyperparameters['num_blocks']):
      hp_padding=best_cnn_hyperparameters['padding_'+ str(i)]
      hp_filters=best_cnn_hyperparameters['filters_'+ str(i)]
    
      model_cnn.add(Conv2D(hp_filters, (3, 3), padding=hp_padding, activation='relu', kernel_initializer='he_uniform', input_shape=(28, 28, 1)))
      model_cnn.add(MaxPooling2D((2, 2)))
      model_cnn.add(Dropout(best_cnn_hyperparameters['dropout_'+ str(i)]))
    
    model_cnn.add(Flatten())
    model_cnn.add(Dense(best_cnn_hyperparameters['units'], activation='relu', kernel_initializer='he_uniform'))
    
    model_cnn.add(Dense(10,activation="softmax"))
    
    model_cnn.compile(optimizer=best_cnn_hyperparameters['Optimizer'], 
                                                     loss='categorical_crossentropy', 
                                                     metrics=['accuracy'])
    print(model_cnn.summary())
    
    history_cnn= model_cnn.fit(train_x, train_y, epochs=50, batch_size=32, validation_data=(dev_x, dev_y), callbacks=callback)
    

    检查测试集的准确率:

    cnn_test_loss, cnn_test_acc = model_cnn.evaluate(test_x,  test_y, verbose=2)
    print('\nTest accuracy:', cnn_test_acc)
    
    # Test accuracy: 0.92
    

    与基线的 CNN 模型测试精度相比:

    1. 基线 CNN 模型:90.8 %
    2. 最佳 CNN 模型:92%

    我们看到优化模型的性能提升!

    除了准确性之外,我们还可以看到优化的效果很好,因为:

    在每种情况下都选择了一个非零的 Dropout 值,即使我们也提供了零 Dropout。这是意料之中的,因为 Dropout 是一种减少过拟合的机制。有趣的是,最好的 CNN 架构是标准CNN,其中过滤器的数量在每一层中逐渐增加。这是意料之中的,因为随着后续层的增加,模式变得更加复杂(这也是我们在学习各种模型和论文时被证明的结果)需要更多的过滤器才能捕获这些模式组合。

    以上例子也说明Keras Tuner 是使用 Tensorflow 优化深度神经网络的很好用的工具。

    我们上面也说了本文选择是贝叶斯优化器。但是还有两个其他的选项:

    RandomSearch:随机选择其中的一些来避免探索超参数的整个搜索空间。但是,它不能保证会找到最佳超参数

    Hyperband:选择一些超参数的随机组合,并仅使用它们来训练模型几个 epoch。然后使用这些超参数来训练模型,直到用尽所有 epoch 并从中选择最好的。

    最后数据集地址和keras_tuner的文档如下

    https://avoid.overfit.cn/post/c3f904fab4f84914b8a1935f8670582f

    作者:Nikos Kafritsas

    展开全文
  • 基于遗传算法优化多尺度排列熵参数,类似于粒子群算法优化参数
  • 使用Optuna进行超参数优化

    千次阅读 2021-11-03 10:36:27
    参数优化是一项艰巨的任务。 但是使用 Optuna 等工具可以轻松应对。 在这篇文章中,我将展示如何使用 Optuna 调整 CatBoost 模型的超参数。 Optuna 的超参数调整可视化 超参数 常规参数是在训练期间通过机器学习...

    超参数优化是一项艰巨的任务。 但是使用 Optuna 等工具可以轻松应对。

    在这篇文章中,我将展示如何使用 Optuna 调整 CatBoost 模型的超参数。

    Optuna 的超参数调整可视化

    超参数

    常规参数是在训练期间通过机器学习算法学习的参数。而超参数是设置如何训练模型的参数,它们有助于训练出更好的模型。

    以线性回归模型为例,线性回归通过训练参数来确定每个特征的权重。在构建模型时我们可以向模型添加正则化并附带一个超参数来控制正则化项的权重。这个带有超参数的附加项会改变模型的整体预测方式。所以更改这个超参数可以使模型变得更好或者更差,所以超参数的调整是非常重要并且必要的。

    超参数可以改变模型的行为在树型模型中更为突出,例如树型模型超参数可以控制树的深度、叶的数量、如何分割以及许多其他选项。这些选项中的每一个的改变都会对模型的结构以及它如何做出决策产生巨大的影响。虽然都是决策树,但树的类型可能会有很大的不同。

    对于更复杂集成模型来说,这些复杂的模型建立在许多不同的模型上,每个模型都有其超参数所以影响就更加的大了。需要为每个模型选择合适的超参数,如果人工来做工作量就会成倍增长,并且训练时间也会变得很长。

    超参数优化

    在超参数优化方面有多种选择。最常用的方法是Grid Search和它的一些改进的方法。

    Grid Search

    Grid Search是一种简单的暴力方法,它对输入到搜索空间的每个超参数进行组合。为每个组合创建一个模型并进行比较。虽然听着没有任何问题,但有几个关键方面需要注意。

    首先,确定最优超参数是一个NP-Hard问题,因为需要处理的是超参数的组合。就复杂性而言,暴力搜索的成本是无法接受的。

    第二个需要注意的方面是,训练的模型在很大一部分搜索中性能一直表现得很差。但Grid Search的还是会继续建立和训练这些模型。

    假设我们正在构建一棵决策树并使用Grid Search进行超参数的优化,在我们的超参数中包含了的“基尼系数”和”熵”的超参数设置。假设我们在训练时发前几个测试中,“基尼系数”的性能要优越得多。Grid Search还需会继续使用搜索空间中带有”熵”的参数进行训练。

    Random Search

    Grid Search的替代方法是Random Search。从名字看这似乎是比Grid Search更糟糕的选择。但是其实事实已经证明Random Search比Grid Search性能更好。

    非常简单的基本原理是随机搜索避免了Grid Search执行的许多冗余操作。Random Search通过以不均匀的间隔搜索超参数空间,更有可能找到局部最优的超参数。

    替代方案

    由于前面的两种方法都没有包含任何结构化的方法来搜索最优超参数集,所以我们这里将要介绍新的包来优化他们的问题提高效率。scikit-optimization和Optuna这样的包为我们提供了超参数搜索的新方法。

    Optuna

    Optuna是一个超参数的优化工具,对基于树的超参数搜索进行了优化,它使用被称为TPESampler“Tree-structured Parzen Estimator”的方法,这种方法依靠贝叶斯概率来确定哪些超参数选择是最有希望的并迭代调整搜索。

    无论使用的模型是什么,使用Optuna优化超参数都遵循类似的过程。第一步是建立一个学习函数。这个函数规定了每个超参数的样本分布。

    最常见的可用选项是categorical、integer、float或log uniform。想要检查 0.001、0.01 和 0.1 范围内的值时,可以使用log uniform,因为其中每个值都有相同的被选中概率。

    Optuna的另一个优点是能够设置条件超参数。因为许多超参数只有在与其他超参数组合使用时才更加有效。单独改变它们可能不会产生预期的效果。

    为了说明Optuna,我选择优化一个CatBoost模型。这个模型拥有数量惊人的超参数。虽然这篇文章只展示了其中的一部分,但是Optuna的许多特性,比如条件超参数都会被展示出来。

    Catboost

    Catboost 是一种基于树的集成方法。 这是一个非常强大的模型。

    与其他预测模型相比,CatBoost 的直接好处之一是可以直接处理分类变量。 因此,“cat”这个名字是 categorical 的缩写。

    CatBoost 的这一特性使其成为懒惰数据科学家的理想选择。 将分类变量转换为数值变量可能需要一些时间,并且还需要在验证、测试和推理时做相同的事情。使用 CatBoost只需定义分类参数,然后调整超参数即可处理这些分类特征。

    超参数“cat_features”设置哪些特征是分类的。 如果没有指定分类特征,CatBoost 将抛出一个错误,因为模型通常的输入必须是数字。

    Catboost 超参数

    loss_function — 训练损失函数,对于回归可以使用 RMSE 或 MAE。

    iterations — 设置迭代限制树的数量。其他超参数也可能会限制树的数量,从而导致总次数少于迭代次数。

    learning_rate — 在优化期间使用学习率。

    l2_leaf_reg— 指定正则化项的系数。这一项是 将L2 添加到成本函数中。

    depth— 树的深度。

    min_data_in_leaf— 指定何时停止分裂。当实例数低于此值时,该节点将变为叶子。

    one_hot_max_size— 唯一值小于或等于该值的参数的 One-Hot 编码。

    boosting_type — “Ordered”或“Plain” 。“Ordered”在较小的数据集上更好,但比普通方案慢。对于较大的数据集,建议使用“Plain”。

    rsm— ‘Alias: colsample_bylevel’定义用于在分割时选择特征以及随机再次选择特征时使用的百分比。

    bootstrap_type— 权重采样方法,‘Bayesian’, ‘Bernoulli’, ‘MVS’, ‘Poisson’, ‘No’

    bagging_temperature — 定义贝叶斯采样的设置。当参数设置为 1 时,根据指数分布添加权重。

    subsample— 当‘Poisson’、‘Bernoulli’或‘MVS’用于采样方法时,使用bagging的采样率。

    Optuna示例

    在这个例子中,我们使用使用钻石数据集。 该数据集旨在根据其他属性预测钻石的价格。 一些变量是分类的这通常需要一些预处理。

    https://www.kaggle.com/shivam2503/diamonds

    使用 CatBoost无需任何预处理即可生成模型,甚至可以处理缺失值,所以使它是一个非常强大且易于使用的模型。

    from sklearn.model_selection import train_test_split
    from sklearn.metrics import r2_score
    from catboost import CatBoostRegressor
    import optuna
    
    def objective(trial):
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
        param = {
            "loss_function": trial.suggest_categorical("loss_function", ["RMSE", "MAE"]),
            "learning_rate": trial.suggest_loguniform("learning_rate", 1e-5, 1e0),
            "l2_leaf_reg": trial.suggest_loguniform("l2_leaf_reg", 1e-2, 1e0),
            "colsample_bylevel": trial.suggest_float("colsample_bylevel", 0.01, 0.1),
            "depth": trial.suggest_int("depth", 1, 10),
            "boosting_type": trial.suggest_categorical("boosting_type", ["Ordered", "Plain"]),
            "bootstrap_type": trial.suggest_categorical("bootstrap_type", ["Bayesian", "Bernoulli", "MVS"]),
            "min_data_in_leaf": trial.suggest_int("min_data_in_leaf", 2, 20),
            "one_hot_max_size": trial.suggest_int("one_hot_max_size", 2, 20),  
        }
        # Conditional Hyper-Parameters
        if param["bootstrap_type"] == "Bayesian":
            param["bagging_temperature"] = trial.suggest_float("bagging_temperature", 0, 10)
        elif param["bootstrap_type"] == "Bernoulli":
            param["subsample"] = trial.suggest_float("subsample", 0.1, 1)
    
        reg = CatBoostRegressor(**param, cat_features=categorical_features_indices)
        reg.fit(X_train, y_train, eval_set=[(X_test, y_test)], verbose=0, early_stopping_rounds=100)
        y_pred = reg.predict(X_test)
        score = r2_score(y_test, y_pred)
        return score
    

    以上代码已经可以创建模型,但是如果使用Optuna还有一些参数需要设置,首先是采样器,需要使用前面讨论过的 TPESampler。 这种选择确保搜索将更加结构化和定向,而不是标准的Grid Search。

    需要注意的其他一些选项是direction、n_trials 和timeout。

    direction决定了优化的执行方式。 这个需要与正在使用的损失函数的预期优化相匹配。

    接下来,n_trials 控制将执行多少个超参数空间的样本。 结合timeout,这两个因素会影响最终的运行时间。 如果发现训练的时间紧张,则需要设置这两个参数。

    搜索的最终状态将都会被保存(并且稍后重新启动后可以加载),我们可以将长时间的训练任务分段执行。

    import numpy as np
    import pandas as pd
    from optuna.samplers import TPESampler
    
    df = pd.read_csv('diamonds.csv').drop(['index'],axis=1)
    X = df.drop(['price'],axis=1)
    y = df['price']
    categorical_features_indices = np.where(X.dtypes != np.float)[0]
    
    study = optuna.create_study(sampler=TPESampler(), direction="maximize")
    study.optimize(objective, n_trials=10, timeout=600) # Run for 10 minutes
    print("Number of completed trials: {}".format(len(study.trials)))
    print("Best trial:")
    trial = study.best_trial
    
    print("\tBest Score: {}".format(trial.value))
    print("\tBest Params: ")
    for key, value in trial.params.items():
        print("    {}: {}".format(key, value))
    

    超参数搜索的可视化

    一旦训练完成(无论是在达到最终迭代还是达到超时限制后)下一步是对结果进行可视化。

    上面的脚本将输出最优的模型性能和使用的超参数。我们还可以使用Optuna内置的可视化功能查看搜索进

    Hyper-Parameter重要性:确定哪些参数对模型的整体性能有最显著的影响。

    optuna.visualization.plot_param_importances(study)
    

    多次迭代的性能:模型在多次迭代中的性能。

    optuna.visualization.plot_optimization_history(study)
    

    单个超参数的性能:不同超参数在多次试验中的进展情况。

    optuna.visualization.plot_slice(study, params=['depth', 'learning_rate', 'bootstrap_type'])
    

    总结

    如果不适当调整超参数模型的性能可能会受到很大影响,如果人工调整产参数则会产生很大的工作量。像 Optuna 这样的工具可以帮助我们将超参数过程变得简单而有效。

    Optuna 提供了一种基于贝叶斯的方法来进行超参数优化和有效的搜索结构化,为模型的实际超参数调整提供了理想的解决方案。

    作者:Zachary Warnes

    展开全文
  • Spark参数优化

    千次阅读 2022-03-04 16:53:11
    Spark参数优化 spark conf 中加入一些参数,会加速shuffle过程,这里根据数据量实际大小可以调节下面一些参数,实践中会对于大数据量JOIN能加速20%以上 spark.default.parallelism 是控制每个stage的默认stage数量...
  • 【机器学习】五种超参数优化技巧

    千次阅读 2021-07-20 00:15:02
    转载:我不爱机器学习超参数是用于控制学习过程的不同参数值,对机器学习模型的性能有显著影响。超参数优化是找到超参数值的正确组合,以在合理的时间内实现数据的最大性能的过程1 数据处理impor...
  • 迭代学习控制PID学习率参数优化matlab程序,有注释,适合初学者。迭代学习控制PID学习率参数优化matlab程序,有注释,适合初学者。
  • 算法模型自动超参数优化方法!

    千次阅读 2020-12-22 19:57:32
    什么是超参数?学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter)。还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(...
  • ANSYS Workbench 目标参数优化案例分析

    千次阅读 2021-08-21 11:58:44
    文章目录 文章目录文章目录@[toc]创建模型网格设置与目标选择参数设置与结果仿真 创建模型 在ANSYS Workbench中选择静态结构模块,使用...此时,点击尺寸半径旁边的P框,可将该尺寸作为参数优化尺寸(注意:要同时选
  • 基于遗传算法超参数优化 超参数调整| AutoML | 随机搜索和网格搜索 (Hyper-parameter Tuning | AutoML | RandomSearch & GridSearch) Most Professional Machine Learning practitioners follow the ML Pipeline...
  • 公众号标题:神经网络中的优化方法之学习率衰减和动态梯度方向 ...超参数优化 第四篇包括 网络正则化 无论是神经网络还是机器学习都会存在很多的超参数,在神经网络中,常见的超参数有: 网...
  • 机器学习模型的超参数优化

    千次阅读 2020-06-06 16:55:14
    机器学习中的超参数优化旨在寻找使得机器学习算法在验证数据集上表现性能最佳的超参数。超参数与一般模型参数不同,超参数是在训练前提前设置的。举例来说,随机森林算法中树的数量就是一个超参数,而神经网络中的...
  • 优化算法+神经网络:神经网络自动参数优化

    千次阅读 热门讨论 2021-11-08 20:03:01
    这里写自定义目录标题优化算法进行神经网络的参数寻优,解放深度调参1.已经实现的Genetic Algorithm优化Neural Network功能快捷键2.已经实现的PSO优化Neural Network如何改变文本的样式插入链接与图片如何插入一段...
  • MySQL数据库:参数优化

    千次阅读 2021-03-08 01:31:33
    数据库属于 IO 密集型的应用程序,其...本文先从 MySQL 数据库IO相关缓存参数的角度来介绍可以通过哪些参数进行IO优化: 一、参数说明: 1、query_cache_size / query_cache_type (global): Query cache 主要.
  • 模型参数优化(一):遗传算法

    万次阅读 多人点赞 2019-06-25 15:57:39
    参数是指算法中的未知数,有的需要人为指定,比如神经网络算法中的学习...常用的参数优化方法主要包括交叉验证、网格搜索、遗传算法、粒子群优化、模拟退火,本节介绍遗传算法。 遗传算法实质:选定一批最佳参数,...
  • 使用TensorBoard进行超参数优化

    千次阅读 2020-07-04 09:08:07
    在本文中,我们将介绍超参数优化,然后使用TensorBoard显示超参数优化的结果。 深度神经网络的超参数是什么? 深度学习神经网络的目标是找到节点的权重,这将帮助我们理解图像、文本或语音中的数据模式。 要做到这...
  • 一 传统优化算法 机器学习中模型性能的好坏往往与超参数(如batch size,filter size等)有密切的关系。最开始为了找到一个好的超参数,通常都是靠人工试错的方式找到"最优"超参数。但是这种方式效率太慢,所以相继...
  • automl-超参数优化(HPO)-综述

    千次阅读 多人点赞 2020-03-14 19:30:01
    参数优化方法分类: 超参数优化方法分类 超参数优化的难题 当面对大模型、大数据集、复杂的机器学习时,功能函数的评估非常昂贵 配置空间非常复杂且是高维的 我们通常不能得到关于超参数的损失函数的梯度。此外...
  • [机器学习] 超参数优化介绍

    万次阅读 多人点赞 2019-04-18 10:47:53
    如果有一种方式可以帮助工程师找到最优的参数组合,那一定大有裨益,贝叶斯超参优化就是其中的一种。如果是单单罗列公式,可能会显得乏味,就用一些思考带上公式为大家分享。 目前在研究Automated Machine Learning...
  • 参数优化:随机搜索

    千次阅读 2020-06-08 20:48:44
    机器学习案例2.1导入相关库2.2导入数据2.3拆分数据集2.4随机搜索2.5使用最优参数重新训练模型3.深度学习案例3.1导入相关库3.2导入数据3.3拆分数据集3.4构造模型3.5随机搜索3.6使用最优参数重新训练模型 随机搜索在...
  • 每个模型都有其独特的超参数集,找到这些参数的最佳组合的任务称为超参数优化。 For solving hyperparameter optimization problem there are various methods are available. For example : 为了解决超参数优化...
  • 总的来说,系统内核的优化是对系统稳定高效的运行的一个重要的强有力的保障。 那么,Linux的内核参数是可以按照它们的功能进行一个简单的分类的,大体分类为:网络层面,文件系统层面(也就是指的文件打开数,文件...
  • 注:设置优化目标 6、回主界面,选择direct optimization模块 1、打开软件workbench 2、找到static structure,双击打开 3、选择材料 4、参数化建模 至此参数化建模就已经完成啦 注:印记面的创建 ...
  • 参数优化:贝叶斯优化

    千次阅读 2020-06-28 11:51:41
    机器学习案例2.1导入相关库2.2导入数据及数据清洗2.3拆分数据集2.4贝叶斯优化2.5使用最优参数组合重新训练模型,并进行预测3.深度学习案例3.1导入相关库3.2导入数据3.3构建模型3.4贝叶斯优化 贝叶斯优化在机器学习和...
  • 机器学习 | MATLAB Statistics and Machine Learning Toolbox fitrsvm 参数优化 目录机器学习 | MATLAB Statistics and Machine Learning Toolbox fitrsvm 参数优化目录fitrsvm超参数优化参考资料致谢 目录 fitrsvm...
  • SVM参数优化

    千次阅读 2019-09-23 09:09:32
    SVM参数优化 导入包 from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV 将SVM的C值和gamma调参,C值范围为2−5{2^{-5}}2−5到215{2^{15}}215, gamma值范围为2−15{2^{-15}}2−15到23...
  • 贝叶斯优化神经网络参数The purpose of this work is to optimize the neural network model hyper-parameters to estimate facies classes from well logs. I will include some codes in this paper but for a ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,345,305
精华内容 538,122
关键字:

参数优化