百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

超参数自动调参库介绍(超参数选择)

itomcoil 2025-03-14 18:07 18 浏览

前言

今天给大家聊聊机器学习领域中,存在的一些自动化超参数寻优库。优化基模型选择的耳熟能详的支持向量机模型,就用不同的自动化寻参工具来实现SVM参数的优化。

介绍

Auto-Sklearn

Auto-Sklearn 是一个用于自动特征工程和机器学习模型选择的库,是 Scikit-Learn 的扩展。这个库因为不支持windows环境,所以这里就暂时不讲解了。

Optuna

Optuna 是一个为机器学习提供最优化超参数的框架。它包括了对未知搜索空间的支持,以及针对计算资源进行高效优化的能力。

import optuna
from sklearn import datasets, svm
from sklearn.model_selection import train_test_split
import pickle

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 划分训练集和验证集
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.25, random_state=0)

# 定义目标函数
def objective(trial):
    C = trial.suggest_loguniform('C', 1e-10, 1e10)
    gamma = trial.suggest_loguniform('gamma', 1e-10, 1e10)
    
    classifier_obj = svm.SVC(C=C, gamma=gamma)
    classifier_obj.fit(X_train, y_train)
    return classifier_obj.score(X_valid, y_valid)

# 创建一个study对象并找到最佳参数
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

# 输出最佳参数
print('Best trial:')
trial = study.best_trial
print('Value: ', trial.value)
print('Params: ')
for key, value in trial.params.items():
    print('{}: {}'.format(key, value))

# 使用最佳参数创建模型
best_params = study.best_params
best_model = svm.SVC(**best_params)
best_model.fit(X_train, y_train)

# 保存模型
with open('best_model.pkl', 'wb') as f:
    pickle.dump(best_model, f)

Hyperopt

Hyperopt 是一个用于优化超参数的库。它使用了贝叶斯优化方法,并支持并行计算。

from sklearn import datasets, svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from hyperopt import hp, fmin, tpe, Trials, STATUS_OK
import pickle

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 划分训练集和验证集
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.25, random_state=0)

# 定义目标函数
def objective(params):
    classifier_obj = svm.SVC(**params)
    classifier_obj.fit(X_train, y_train)
    pred = classifier_obj.predict(X_valid)
    return {'loss': -accuracy_score(y_valid, pred), 'status': STATUS_OK}

# 定义搜索空间
space = {
    'C': hp.loguniform('C', -10, 10),
    'gamma': hp.loguniform('gamma', -10, 10)
}

# 执行优化
trials = Trials()
best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=100, trials=trials)

# 输出最佳参数
print('Best: ', best)

# 使用最佳参数创建模型
best_model = svm.SVC(**best)
best_model.fit(X_train, y_train)

# 保存模型
with open('best_model.pkl', 'wb') as f:
    pickle.dump(best_model, f)

Tune

Ray Tune 是一个用于深度学习和强化学习的库。它支持多种搜索算法和早停策略。接下来还是以SVM优化举例。

from sklearn import datasets, svm
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from ray import tune

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 划分训练集和验证集
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.25, random_state=0)

def train_model(config):
    # 使用传入的参数创建模型
    model = svm.SVC(**config)
    model.fit(X_train, y_train)

    # 验证模型并返回准确率
    predictions = model.predict(X_valid)
    acc = accuracy_score(y_valid, predictions)
    
    tune.report(accuracy=acc)

# 定义搜索空间
search_space = {
    'C': tune.loguniform(1e-10, 1e10),
    'gamma': tune.loguniform(1e-10, 1e10)
}

# 执行优化
analysis = tune.run(train_model, config=search_space, num_samples=100, metric='accuracy', mode='max')

# 输出最佳参数
print('Best config: ', analysis.best_config)

# 使用最佳参数创建模型
best_model = svm.SVC(**analysis.best_config)
best_model.fit(X_train, y_train)

# 保存模型
import pickle
with open('best_model.pkl', 'wb') as f:
    pickle.dump(best_model, f)

Keras Tuner

Keras Tuner 是一个专门为 Keras 库设计的超参数调优框架。所以不能使用它来优化svm了,就随便举个例子。

from tensorflow import keras
from kerastuner.tuners import RandomSearch
from sklearn import datasets

# 加载数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 划分训练集和验证集
X_train, X_valid, y_train, y_valid = train_test_split(X, y, test_size=0.25, random_state=0)

def build_model(hp):
    model = keras.Sequential()
    model.add(keras.layers.Dense(units=hp.Int('units', min_value=32, max_value=512, step=32), activation='relu'))
    model.add(keras.layers.Dense(10, activation='softmax'))
    model.compile(optimizer=keras.optimizers.Adam(hp.Choice('learning_rate', values=[1e-2, 1e-3, 1e-4])), loss='categorical_crossentropy', metrics=['accuracy'])
    return model

tuner = RandomSearch(build_model, objective='val_accuracy', max_trials=5)
tuner.search(X_train, y_train, epochs=5, validation_data=(X_valid, y_valid))

TPOT (Tree-based Pipeline Optimization Tool)

TPOT 使用遗传算法优化机器学习管道。

from tpot import TPOTClassifier
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split

# 加载数据
digits = load_digits()
X_train, X_test, y_train, y_test = train_test_split(digits.data, digits.target,
                                                    train_size=0.75, test_size=0.25)

# 设置 SVM 的配置字典
tpot_config = {
    'sklearn.svm.SVC': {
        'C': [1.0, 10.0, 100.0],
        'kernel': ['linear', 'poly', 'rbf'],
        'degree': [1, 2, 3, 4, 5],
        'gamma': ['scale', 'auto']
    },
}

# 创建 TPOT 分类器实例
pipeline_optimizer = TPOTClassifier(generations=5, population_size=20, verbosity=2,
                                    config_dict=tpot_config)

# 在数据上训练 TPOT 分类器
pipeline_optimizer.fit(X_train, y_train)

# 打印最佳模型管道
print(pipeline_optimizer.fitted_pipeline_)

# 使用测试集评价模型性能
print(pipeline_optimizer.score(X_test, y_test))

Spearmint

Spearmint 是一个贝叶斯优化库,它将问题视作黑盒函数优化问题。

from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score

# 加载数据集
iris = datasets.load_iris()

def svm_cv(C, kernel):
    # 创建一个 SVM 分类器
    svc = svm.SVC(C=C, kernel=kernel)
    
    # 使用交叉验证评估模型
    scores = cross_val_score(svc, iris.data, iris.target, cv=5)

    # 返回平均精度的负值(因为 Spearmint 进行最小化)
    return -scores.mean()

然后,创建一个 JSON 配置文件 (例如,config.json) 来指定优化的参数:

[
    {
        "name": "C",
        "type": "float",
        "min": 0.1,
        "max": 100.0
    },
    {
        "name": "kernel",
        "type": "enum",
        "options": ["linear", "poly", "rbf", "sigmoid"]
    }
]

接着,在命令行中运行 Spearmint:

spearmint svm.py --config config.json

SMAC (Sequential Model-based Algorithm Configuration)

SMAC 通常用于优化算法的配置,但也可以用于机器学习模型的超参数优化。

import numpy as np
from sklearn import datasets, svm
from sklearn.model_selection import cross_val_score
from smac.configspace import ConfigurationSpace
from ConfigSpace.hyperparameters import CategoricalHyperparameter, UniformFloatHyperparameter
from smac.scenario.scenario import Scenario
from smac.facade.smac_hpo_facade import SMAC4HPO

# 加载数据
iris = datasets.load_iris()
X = iris.data
y = iris.target

# 定义一个目标函数
def svm_from_cfg(cfg):
    # 从配置中获取SVM参数
    C = cfg["C"]
    kernel = cfg["kernel"]

    # 创建并评估 SVM 分类器
    clf = svm.SVC(C=C, kernel=kernel, random_state=42)
    scores = cross_val_score(clf, X, y, cv=5)

    # SMAC 贝叶斯优化是最小化目标函数,因此我们取负值,即 - mean_accuracy
    return -1 * np.mean(scores)

# 创建配置空间
cs = ConfigurationSpace()

# 添加相关的超参数
C = UniformFloatHyperparameter("C", 0.001, 100.0, default_value=1.0)
kernel = CategoricalHyperparameter("kernel", ["linear", "poly", "rbf", "sigmoid"], default_value="rbf")

cs.add_hyperparameters([C, kernel])

# 定义 scenario
scenario = Scenario({"run_obj": "quality",
                     "runcount-limit": 50,
                     "cs": cs,
                     "deterministic": "true"
                     })

# 创建一个 SMAC 对象
smac = SMAC4HPO(scenario=scenario, rng=np.random.default_rng(42),
                tae_runner=svm_from_cfg)

# 运行优化过程
incumbent = smac.optimize()

# 输出优化结果
print("Optimized Value: %.2f" % -svm_from_cfg(incumbent))
print("Optimized Parameters: ", incumbent.get_dictionary())

FLAML

旨在自动化机器学习任务的各个方面,包括特征工程、模型选择和超参数调优。FLAML内置了很多集成模型和线性模型方法,但是不包括SVM,所以这里我们讲解怎么自定义模型。

from flaml import AutoML
from sklearn.datasets import load_digits

# 加载数据集
digits = load_digits()
X_train, y_train = digits.data, digits.target

# 初始化AutoML实例
automl = AutoML()

# 创建并添加一个新的学习器
class MySVMEstimator(LGBMEstimator):
    base_class = 'sklearn.svm.SVC'

automl.add_learner(learner_name='svm', learner_class=MySVMEstimator)

# 设置参数
settings = {
    "time_budget": 30,  # 总共运行时间(秒)
    "metric": 'accuracy',  # 评价指标
    "task": 'classification',  # 任务类型
    "estimator_list": ['svm'],  # 指定待调整模型
    "log_file_name": 'flaml.log',  # 输出日志文件
}

# 进行自动化的机器学习搜索
automl.fit(X_train=X_train, y_train=y_train, **settings)

# 检查是否选择了SVM模型
best_model = automl.model
if isinstance(best_model, MySVMEstimator):
    print("Selected model is SVM.")
    print("Best hyperparameters:", automl.best_config)
    print('Best accuracy on training data: {0:.4g}'.format(1-automl.best_loss))
else:
    print(f"Selected model is not SVM. It's {type(best_model)}.")

我试了一下,发现并不是优化的svm参数,我看了官网,说FLAML可能会选择它认为最好的模型,这可能包括其他类型的模型,例如集成模型。这是因为FLAML旨在自动化地找出最佳的模型和超参数。

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...