使用imbalanced-learn库sample_indices方法时如何解决IndexError报错问题?

问题现象与错误分析

在使用imbalanced-learn库的sample_indices方法进行不平衡数据集采样时,开发者常会遇到如下典型错误:

IndexError: index 150 is out of bounds for axis 0 with size 100

这种异常通常发生在以下场景:

  • 样本索引越界:当采样数量超过原始数据集大小时
  • 替换采样冲突:在replace=False模式下尝试抽取超过可用样本数
  • 分层采样不匹配:使用stratified参数时类别分布计算错误

5种核心解决方案

1. 输入数据验证机制

在执行采样前添加数据校验逻辑:

if n_samples > len(indices):
    raise ValueError(f"Requested samples {n_samples} exceed available {len(indices)}")

2. 动态采样模式切换

根据数据规模自动选择替换策略:

replace = n_samples > len(indices)
sampled = sample_indices(indices, n_samples, replace=replace)

3. 安全采样包装器

创建带异常处理的采样函数:

def safe_sample(indices, n_samples, **kwargs):
    try:
        return sample_indices(indices, n_samples, **kwargs)
    except IndexError:
        return np.random.choice(indices, size=min(n_samples, len(indices)), replace=False)

4. 分层采样校准

对于分层采样场景:

from sklearn.utils import check_array
y = check_array(y, ensure_2d=False, dtype=None)

5. 内存优化采样

处理大型数据集时采用批处理:

chunk_size = 100000
for chunk in np.array_split(indices, len(indices)//chunk_size):
    partial_sample = sample_indices(chunk, n_samples//10)

性能优化建议

场景 推荐参数 性能增益
小数据集(<10k) replace=False 2-3x加速
大数据集(>100k) random_state=None 30%内存降低

最佳实践总结

  1. 始终验证输入数据维度
  2. 对于超过5万样本的数据集启用批处理
  3. 在Jupyter环境中使用%%timeit测试不同参数性能
  4. 考虑结合SMOTE等过采样技术