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

使用10折交叉验证做模型选择遇n_splits报错,求排查建议

问题排查与解决

报错原因

n_splits=10 cannot be greater than the number of members in each class 这个错误的核心是:你的分类任务中存在类别样本数小于10,而默认的分层10折交叉验证要求每个折都必须包含所有类别的样本,当某个类别样本数不足10时,无法满足这个要求,就会触发报错。

你的代码问题

你把mtcars数据集中的model列作为目标变量Y,但mtcars的model是每个车型的唯一名称——32条数据对应32个不同的model,相当于做32分类任务,每个类别只有1个样本。这种情况下用10折交叉验证完全不合理,因为每个类别的样本数远小于10。

解决步骤

  1. 修正目标变量
    mtcars数据集通常用于回归或二分类任务,比如以am(自动/手动变速箱,0=自动,1=手动)作为二分类目标,这才是合理的分类任务:

    # 替换原Y的定义
    Y = mtcars_df['am'].values
    
  2. 调整交叉验证参数

    • 如果坚持做多分类任务(比如其他自定义数据集),要把cv值改小,确保所有类别的样本数都≥折数,比如改成3折:
      print(cross_val_score(knn,X,Y, cv=3, scoring='accuracy').mean())
      
    • 若必须用10折且能接受非分层抽样(不推荐,会导致数据分布失衡),可以手动指定KFold:
      from sklearn.model_selection import KFold
      # 打乱数据后做10折
      kf = KFold(n_splits=10, shuffle=True, random_state=42)
      print(cross_val_score(knn,X,Y, cv=kf, scoring='accuracy').mean())
      
  3. 确认任务合理性
    用model作为分类目标完全没有意义,每个类别仅1个样本,模型无法学习到特征与类别之间的关联,必须重新确定你的任务目标。

内容的提问来源于stack exchange,提问作者daniness

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:25:22