sklearn中使用训练/验证/测试集时如何为RandomizedSearchCV传递cv参数
报错原因
你触发ValueError: too many values to unpack (expected 2)的核心原因是RandomizedSearchCV的cv参数传入格式不符合要求:
自定义训练验证拆分时,cv需要接收一个包含多组(训练集索引, 验证集索引)元组的可迭代对象。你直接传入[train_idx, val_idx]会被识别为2组拆分,每组拆分只有一个索引数组,无法拆分为训练、验证两个索引变量,因此抛出解包错误。
正确实现代码
修正cv参数格式即可解决报错,同时补充测试集评估步骤,符合训练、验证、测试三集的使用规范,完整可运行代码如下:
from sklearn.datasets import load_iris from sklearn.linear_model import LogisticRegression from sklearn.model_selection import RandomizedSearchCV from scipy.stats import uniform from sklearn.metrics import accuracy_score iris = load_iris() X, y = iris.data, iris.target # 自定义数据集拆分 train_idx = list(range(100)) # 训练集索引 val_idx = list(range(100, 125)) # 验证集索引,用于参数调优 test_idx = list(range(125, 150)) # 测试集索引,用于最终泛化能力评估 logistic = LogisticRegression(solver='saga', tol=1e-2, max_iter=200, random_state=0) distributions = dict(C=uniform(loc=0, scale=4), penalty=['l2', 'l1']) # 核心修正:将训练、验证索引打包为元组后放入列表,代表1折自定义交叉验证 clf = RandomizedSearchCV(logistic, distributions, random_state=0, cv=[(train_idx, val_idx)]) search = clf.fit(X, y) # 输出调优得到的最优参数 print("最优参数:", search.best_params_) # 用完全未参与调优的测试集评估最优模型的泛化能力 best_model = search.best_estimator_ test_acc = accuracy_score(y[test_idx], best_model.predict(X[test_idx])) print("测试集准确率:", test_acc)
补充说明
- 若需要使用多折交叉验证,只需在
cv对应的列表中添加多组(训练索引, 验证索引)格式的元组即可 - 整个调优过程不会接触测试集数据,避免数据泄露,保证最终测试集评估结果的可信度
内容的提问来源于stack exchange,提问作者Ratchainant Thammasudjarit
相关产品推荐
相关产品推荐

