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

机器学习分类LOOCV报positional indexers are out-of-bounds错误排查

报错核心原因
  • 触发越界错误的本质是特征矩阵X和标签向量y的样本未对齐,和loc/iloc本身的用法无关:
    • 你的X直接赋值为全量dfClass,包含所有样本,留一法交叉验证生成的train_index/test_index是基于全量dfClass的行数生成的位置索引,取值范围为0到len(dfClass)-1
    • 你的y是经过Diagnosis字段筛选后的子集,行数远小于X的总行数,且未重置索引时行号不连续,用iloc按全量生成的位置索引取y的行时,一旦索引值超过y的实际行数,就会抛出位置索引越界的错误。
可行修复方案

必须先对X和y做同步的样本筛选,保证两者行数完全一致、行顺序严格对应,再传入交叉验证流程,核心修正代码如下:

# 1. 先定义目标样本筛选条件,同步过滤特征和标签
target_mask = df_classification['Diagnosis'].isin(['Control', 'SCD'])
# 筛选后重置索引,保证行号从0开始连续,和交叉验证生成的位置索引匹配
X = dfClass.loc[target_mask, :].reset_index(drop=True)
y = df_classification.loc[target_mask, 'Diagnosis'].reset_index(drop=True)

# 2. 交叉验证实例基于对齐后的X初始化
loo = LeaveOneOut()
featCount = Counter()

# 3. 参数遍历与交叉验证循环
for threshold in thresholds:
    for c in cs:
        for class_weight in class_weights:
            row = {}
            svmAcc = []
            rfAcc = []
            # 交叉验证拆分传入对齐后的X
            for train_index, test_index in loo.split(X):
                X_train, X_test = X.iloc[train_index], X.iloc[test_index]
                y_train, y_test = y.iloc[train_index], y.iloc[test_index]
                pvalue = []
                x_control = X_train.loc[y_train=='Control', :].astype('float64', copy=False)
                x_scd = X_train.loc[y_train=='SCD', :].astype('float64', copy=False)
                # 后续特征筛选、模型训练、指标计算逻辑保持原有逻辑即可
代码中其他需要修正的问题
  • 性能表列名拼接错误:初始化dfModelPerf时,'RFCAUC-ROC'末尾缺少逗号,会和后续的'SVMacc'自动拼接为一个列名RFCAUC-ROCSVMacc,导致后续指标赋值时列匹配失败,需要补上缺失的逗号。
  • 重复计算冗余:X、y、loo、featCount这些不随参数组合变化的变量,不需要放在三层参数循环内部重复初始化,提到循环外层可以减少不必要的计算开销。
  • 冗余注释干扰:代码中多处注释掉的'MCI':1如果后续不需要做多分类,建议直接删除,避免后续调整类别时出现漏改。
  • 数据泄漏注意点:目前你在交叉验证循环内用训练集拆分对照组、SCD组计算p值做特征筛选的逻辑是正确的,后续不要把测试集加入特征筛选、标准化等预处理步骤,否则会导致模型性能估计虚高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:15:29