机器学习分类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直接赋值为全量
可行修复方案
必须先对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
相关产品推荐
相关产品推荐

