You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

应用SelectPercentile后报错:数据含np.nan、np.inf或超出float64范围值

解决SelectPercentile因含np.nan、np.inf或数值溢出报错的问题

SelectPercentile依赖的特征评分函数(如f_classif、mutual_info_classif等)无法处理缺失值、无穷值或超出float64范围的数值,必须先完成数据清洗才能正常运行。以下是具体解决步骤:

一、处理缺失值(np.nan)

  • 直接删除:快速移除含缺失值的样本或特征,但要警惕数据丢失带来的偏差:
    # 删除含缺失值的样本
    X_clean = X.dropna(axis=0)
    # 删除含缺失值的特征
    X_clean = X.dropna(axis=1)
    
  • 填充替代:根据特征类型选择合适的填充值:
    # 数值特征用中位数填充(比均值更抗异常值)
    X.fillna(X.median(), inplace=True)
    # 分类特征用众数填充
    X.fillna(X.mode().iloc[0], inplace=True)
    
  • 模型填充:用KNN或回归模型预测缺失值,适合数据量较大的场景:
    from sklearn.impute import KNNImputer
    imputer = KNNImputer(n_neighbors=3)
    X_imputed = imputer.fit_transform(X)
    

二、处理无穷值(np.inf/-np.inf)

先将无穷值替换为NaN,再按缺失值逻辑处理:

import numpy as np
X.replace([np.inf, -np.inf], np.nan, inplace=True)
# 之后执行缺失值填充步骤

如果业务上有明确逻辑,也可将无穷值替换为特征的极值:

# 用特征最大值替代正无穷,最小值替代负无穷
X.replace(np.inf, X.max().max(), inplace=True)
X.replace(-np.inf, X.min().min(), inplace=True)

三、处理超出float64范围的数值

这类数值通常是异常大/小的极值,可通过以下方式处理:

  • 检查定位:用df.describe()查看各特征的极值,定位异常特征;
  • 特征缩放:用标准化或归一化将数值压缩到合理范围:
    from sklearn.preprocessing import StandardScaler
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    
  • 截断异常值:将超出分位数的数值截断为分位数,避免极端值干扰:
    # 截断99分位数以外的数值
    q99 = X.quantile(0.99)
    q01 = X.quantile(0.01)
    X = X.where(X >= q01, q01, axis=1)
    X = X.where(X <= q99, q99, axis=1)
    

完整示例代码

import numpy as np
import pandas as pd
from sklearn.feature_selection import SelectPercentile, f_classif
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler

# 模拟存在问题的数据集
X = pd.DataFrame({
    'feat1': [1, 2, np.nan, 4, 5],
    'feat2': [10, np.inf, 30, -np.inf, 50],
    'feat3': [1e300, 2e300, 3e300, 4e300, 5e300]
})
y = [0, 1, 0, 1, 0]

# 1. 替换无穷值为NaN
X.replace([np.inf, -np.inf], np.nan, inplace=True)

# 2. 填充缺失值
imputer = SimpleImputer(strategy='median')
X_imputed = imputer.fit_transform(X)

# 3. 缩放数值范围
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X_imputed)

# 4. 执行特征选择
selector = SelectPercentile(f_classif, percentile=50)
X_selected = selector.fit_transform(X_scaled, y)

内容的提问来源于stack exchange,提问作者Ojo Caleb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:16:05