Python随机森林手动调参报错ValueError: too many values to unpack (expected 4)如何解决
问题解决:Random Forest手动调参解包报错
报错原因
你遇到的ValueError: too many values to unpack (expected 4)由两处代码错误共同导致:
- 遍历逻辑错误:
for a,b,c,d in 列表1,列表2,列表3,列表4的写法,本质是把四个range对象打包成了一个长度为4的元组遍历,每次循环只会返回1个range对象,无法拆分为4个参数变量 - 缩进错误:for循环下的模型初始化、训练等代码没有缩进,不会被识别为循环体内的执行逻辑
解决方案
如果你需要遍历所有参数的笛卡尔积组合(所有参数的排列组合,是手动调参的常规需求),可以使用Python标准库的itertools.product实现,不需要引入sklearn的自动调参工具:
from itertools import product from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import roc_auc_score depth_options= range(8,30) sample_split_options= range(2, 200) sample_leaf_options= range(1, 100) estimator_options= range(10, 1000) # 生成所有参数的排列组合,变量顺序和product传入的参数列表顺序要一一对应 for leaf_size,split_size,n_est,depth in product(sample_leaf_options, sample_split_options, estimator_options, depth_options): # 循环体内代码要统一缩进4个空格 model = RandomForestClassifier(n_estimators = n_est, n_jobs = -1,random_state = 42, min_samples_leaf = leaf_size, min_samples_split=split_size, max_depth=depth) model.fit(X4_train,y_train) print(leaf_size, split_size, n_est, depth) print ("AUC - ROC : ", roc_auc_score(y_test,model.predict_proba(X4_test)[:,1]))
注意事项
- 上述参数组合的总数量约为4.2亿,直接全量遍历耗时极长,建议先缩小参数范围,或者在循环内加入最优结果的判定逻辑,满足阈值后提前终止循环
- 如果你不需要遍历全组合,只需要按顺序取四个列表对应位置的参数配对遍历,把
product替换为zip即可,注意此时四个列表的长度必须一致
内容的提问来源于stack exchange,提问作者Giusy
相关产品推荐
相关产品推荐

