You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Optuna进行超参数优化时搜索空间报错问题求助

Optuna超参数优化时的参数类型错误

问题代码

import optuna

def objective(trial):
    criterion = trial.suggest_categorical("criterion", ["gini", "entropy"]),
    min_samples_split = trial.suggest_float('min_samples_split', 0, 1),
    max_depth = trial.suggest_int('max_depth', 3, 20, step=3),
    min_samples_leaf = trial.suggest_float('min_samples_leaf', 0, 1),
    min_impurity_decrease = trial.suggest_float('min_impurity_decrease', 0, 0.1),
    splitter = trial.suggest_categorical('splitter', ['best', 'random']),
    class_weight = trial.suggest_categorical('class_weight', [None, 'balanced'])

    clf = DecisionTreeClassifier(splitter=splitter, criterion=criterion, min_samples_split=min_samples_split, max_depth=max_depth, min_samples_leaf=min_samples_leaf, min_impurity_decrease=min_impurity_decrease, class_weight=class_weight)

    return cross_val_score(clf, X_train, y_train, cv=5, scoring='accuracy', n_jobs=-1).mean()

study = optuna.create_study(direction='maximize', sampler=optuna.samplers.TPESampler())
study.optimize(objective, n_trials=60, n_jobs=-1)

trial = study.best_trial

print('Accuracy: ', trial.value)
print('Best params: ', trial.params)

错误日志

[I 2023-08-13 23:29:24,693] A new study created in memory with name: no-name-9880947b-61e8-4f48-9439-9598b5855f1e
[W 2023-08-13 23:29:24,949] Trial 0 failed with parameters: {'criterion': 'gini', 'min_samples_split': 0.9672704152904984, 'max_depth': 3, 'min_samples_leaf': 0.9028727486308868, 'min_impurity_decrease': 0.03168240940817766, 'splitter': 'best', 'class_weight': 'balanced'} because of the following error: ValueError('\nAll the 5 fits failed.\nIt is very likely that your model is misconfigured.\nYou can try to debug the error by setting error_score=\'raise\'.\n\nBelow are more details about the failures:\n--------------------------------------------------------
  File "/home/mist/anaconda3/envs/ml/lib/python3.8/site-packages/sklearn/utils/_param_validation.py", line 97, in validate_parameter_constraints
    raise InvalidParameterError(
sklearn.utils._param_validation.InvalidParameterError: The 'criterion' parameter of DecisionTreeClassifier must be a str among {'log_loss', 'gini', 'entropy'}. Got ('gini',) instead.

错误原因

所有参数变量的赋值语句末尾都多了一个逗号,导致每个变量都被包装成单元素元组(比如criterion的值是('gini',)而不是字符串'gini')。Sklearn的DecisionTreeClassifier要求参数是对应的数据类型(字符串、整数、浮点数),而非元组,因此触发参数验证错误。即使注释掉criterion的代码,其他参数比如min_samples_split同样是元组类型,依然会报错。

修复后的代码

import optuna
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score

def objective(trial):
    # 去掉所有赋值语句末尾的逗号
    criterion = trial.suggest_categorical("criterion", ["gini", "entropy"])
    min_samples_split = trial.suggest_float('min_samples_split', 0, 1)
    max_depth = trial.suggest_int('max_depth', 3, 20, step=3)
    min_samples_leaf = trial.suggest_float('min_samples_leaf', 0, 1)
    min_impurity_decrease = trial.suggest_float('min_impurity_decrease', 0, 0.1)
    splitter = trial.suggest_categorical('splitter', ['best', 'random'])
    class_weight = trial.suggest_categorical('class_weight', [None, 'balanced'])

    clf = DecisionTreeClassifier(
        splitter=splitter,
        criterion=criterion,
        min_samples_split=min_samples_split,
        max_depth=max_depth,
        min_samples_leaf=min_samples_leaf,
        min_impurity_decrease=min_impurity_decrease,
        class_weight=class_weight
    )

    return cross_val_score(clf, X_train, y_train, cv=5, scoring='accuracy', n_jobs=-1).mean()

study = optuna.create_study(direction='maximize', sampler=optuna.samplers.TPESampler())
study.optimize(objective, n_trials=60, n_jobs=-1)

trial = study.best_trial

print('Accuracy: ', trial.value)
print('Best params: ', trial.params)

内容的提问来源于stack exchange,提问作者YuvrajSingh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 12:10:24