如何删除系数值最小的特征?程序索引错误求助
问题分析与修复
核心错误原因
你的代码在寻找最小系数索引时逻辑错误:当发现更小的系数时,错误地用index = index + 1更新索引,而非直接将索引赋值为当前循环的i。这种写法仅在最小系数索引连续递增时偶然正确,一旦最小系数出现在非连续位置,就会导致索引匹配错误。
另外,循环范围使用rfeIndex而非当前特征数nFeatures,若两者初始值不一致或同步偏差,会导致遍历特征数量错误。同时,变量名min覆盖了Python内置函数,属于不良编码习惯。
修复后的关键代码段
while nFeatures >= 3: # 移除冗余的True,直接用特征数作为循环条件 # 打印当前特征的系数 for i in range(nFeatures): print(samples.columns[i], ":", coef[0][i]) # 寻找系数最小的特征索引 min_val = coef[0][0] index = 0 for i in range(nFeatures): # 遍历当前全部特征,用nFeatures替代rfeIndex if coef[0][i] < min_val: # 直接判断当前系数是否更小,逻辑更直观 min_val = coef[0][i] index = i # 直接赋值为当前特征的真实索引i if len(samples.columns) == 1: print(f"递归筛选后剩余特征:{samples.columns[index]},系数值:{min_val}") accuracy(model, x_test, y_test) break else: print(f"系数最小的特征是{samples.columns[index]},值为:{min_val}") print(f"删除特征:{samples.columns[index]}") # 同步删除训练集和测试集中的目标特征 samples.drop(samples.columns[index], axis=1, inplace=True) x_test = x_test.drop(x_test.columns[index], axis=1) # 重新训练模型并更新系数(此步骤之前遗漏,必须添加) model.fit(samples, y_train) # 假设y_train为你的训练集标签 coef = model.coef_ # 评估模型性能 accuracy(model, x_test, y_test) print("\n") nFeatures -= 1 # 移除rfeIndex变量,用nFeatures即可追踪当前特征数量
额外注意事项
- 同步更新测试集:删除训练集特征后,必须同步删除测试集中的对应特征,否则模型预测时会出现特征数量不匹配的错误。
- 重新训练模型:每次删除特征后,必须重新训练模型并更新
coef,否则后续系数仍基于旧特征集计算,与当前特征列完全不匹配。 - 避免覆盖内置函数:不要用
min这类Python内置函数名作为变量名,改用min_val这类名称。
内容的提问来源于stack exchange,提问作者Timotius Ivander04
相关产品推荐
相关产品推荐

