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

构建基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:40:39