使用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
相关产品推荐
相关产品推荐

