构建基于max_depth的验证曲线时遇n_splits报错求助
解决验证曲线报错:n_splits不能大于每个类别的样本数
问题根源
- 代码存在参数冲突:你已经定义了
cv = StratifiedKFold(n_splits=5,...),但调用validation_curve时又传入cv=10,这会直接覆盖之前的cv配置,实际使用的是n_splits=10的分层交叉验证。 - 报错核心原因:数据集中至少有一个类别的样本数量小于10,而
StratifiedKFold要求每个折必须包含所有类别,因此n_splits不能超过最小类别样本数。
解决步骤
1. 统一交叉验证参数
删除validation_curve中的cv=10,改用预先定义好的cv对象,确保使用n_splits=5的配置:
from sklearn.tree import DecisionTreeClassifier import numpy as np from sklearn.model_selection import validation_curve, StratifiedKFold model = DecisionTreeClassifier(random_state=123) cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=132) train_scores, valid_scores = validation_curve( model, X, y, param_name="max_depth", param_range=np.arange(1, 20), cv=cv, # 使用预先定义的cv对象 scoring="accuracy", n_jobs=-1 )
2. 检查数据集类别分布
先确认每个类别的样本数量,确保n_splits不超过最小类别的样本数:
import pandas as pd # 查看每个类别的样本量 print(pd.Series(y).value_counts())
如果输出中最小的类别样本数小于5,需要进一步降低n_splits(比如设为3),或者换用其他交叉验证方法。
3. 小样本/不平衡数据的替代方案
如果最小类别样本数极少(比如小于5),可以使用StratifiedShuffleSplit,它不要求每个折包含所有类别,更适合小样本场景:
from sklearn.model_selection import StratifiedShuffleSplit cv = StratifiedShuffleSplit(n_splits=10, test_size=0.2, random_state=132) train_scores, valid_scores = validation_curve( model, X, y, param_name="max_depth", param_range=np.arange(1, 20), cv=cv, scoring="accuracy", n_jobs=-1 )
内容的提问来源于stack exchange,提问作者liewife
相关产品推荐
相关产品推荐

