使用RFE特征选择时报错Input contains NaN, infinity or a value too large for dtype('float64')
错误根因
你使用的CSE-CIC-IDS2018流量数据集本身存在三类scikit-learn无法直接处理的异常值,你仅执行了dropna()删除空值,没有覆盖另外两类异常:
- 流量特征计算时出现除0操作,生成了大量
inf、-inf无穷值 - 部分统计特征数值超过float64类型的存储范围
- 你仅对第一个读取的文件做了重复列过滤,其余7个文件可能存在重复列,合并后会产生无效异常值
直接修复方案
按照以下步骤修改代码即可解决报错:
- 读取CSV时统一处理列名空格和重复列
# 每个文件读取时统一处理,示例如下 first_file = pd.read_csv(r"/Users/feliperivas/Downloads/MachineLearningCVE/Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv", skipinitialspace=True) first_file = first_file.loc[:,~first_file.columns.duplicated()] # 其余7个文件读取时都要执行上面两行的重复列过滤操作
- 拆分特征标签后统一处理所有异常值
X = df.drop('Label', axis=1) y = df['Label'] # 替换无穷值为空值 X = X.replace([np.inf, -np.inf], np.nan) # 删除带空值的行,也可根据业务需要用均值/中位数填充空值 X = X.dropna(axis=0) # 同步过滤标签,保证特征和标签样本一一对应 y = y.loc[X.index]
- 纠正模型选型错误
你的任务是攻击类型分类,不是回归任务,要把所有AdaBoostRegressor替换为AdaBoostClassifier,否则即使解决数值报错,模型输出结果也不符合预期。
优化实现思路
- 特征选择要避免数据泄露:先拆分训练集和测试集,仅用训练集拟合特征选择器,再用训练好的选择器分别转换训练集和测试集,不要用全量数据做特征选择
- 可先做粗筛减少计算量:先通过方差过滤删除方差为0的常量特征,再用RFE做细粒度特征选择,大幅降低计算耗时
- 若RFE运行过慢,可先用
SelectFromModel基于树模型的特征重要性快速筛选top N特征,再做后续训练
内容的提问来源于stack exchange,提问作者felipedrivas
相关产品推荐
相关产品推荐

