使用mlxtend OneRClassifier进行交叉验证时遭遇索引越界错误:'index 5 is out of bounds for axis 0 with size 3'
看起来你遇到的这个索引越界问题,是因为你使用的mlxtend版本里的OneRClassifier存在一个已知的bug!
从你提供的报错信息能看到,错误出现在oner.py的第116行:inverse_index[most_frequent_class] = False。这行代码的逻辑明显有问题——inverse_index是用来标记特征取值的数组(长度等于该特征的唯一取值数量),但这里却用类别标签值去索引它,而不是特征值的索引。当你的类别标签数值(比如y里的5)大于某个特征的唯一取值数量(比如3或4)时,自然就会触发索引越界。
给你两个解决方案:
最直接的方案:升级mlxtend到最新版本
这个bug在后续的mlxtend版本中已经被修复了,最新版本的代码里会用特征值的索引idx来操作inverse_index,而不是类别标签。你可以用下面的命令升级:pip install --upgrade mlxtend如果暂时无法升级,手动修改源码
找到你Python环境里的oner.py文件(路径在报错里已经给出:C:\Python311\Lib\site-packages\mlxtend\classifier\oner.py),定位到第116行,把:inverse_index[most_frequent_class] = False修改为:
inverse_index[idx] = False这里的
idx是循环中特征值的索引,对应代码里的for idx, val in enumerate(most_frequent_class):循环变量。
另外顺便提个小建议:你在使用LabelEncoder的时候,用同一个实例连续fit_transform不同的列,虽然功能上能运行,但不够规范,容易因为之前的fit结果干扰后续的编码。更稳妥的做法是给每个列单独创建LabelEncoder实例:
df['A'] = LabelEncoder().fit_transform(df['A']) df['B'] = LabelEncoder().fit_transform(df['B']) df['C'] = LabelEncoder().fit_transform(df['C']) df['D'] = LabelEncoder().fit_transform(df['D'])
备注:内容来源于stack exchange,提问作者Reozilla

