isolationforest.fit() 因输入含 nan 而报 valueerror;需先用 df.isna().sum() 检查缺失值,再决定填充或删除;缺失超20%时优先选 isolationforest,lof 高维易失效。

IsolationForest.fit() 报错 ValueError: Input contains NaN
模型不接受缺失值,直接调用 fit() 会崩,不是警告而是硬报错。常见于读取 CSV 后没清洗、或特征工程中生成了 NaN(比如除零、np.log 负数)。
- 先检查:用
df.isna().sum()看哪些列有空值 - 填还是删?如果缺失比例 df.fillna(df.median()) 更稳;超过 20%,考虑删掉该特征列,别硬补
-
IsolationForest本身不支持sample_weight,别传权重参数,会静默忽略
预测结果全是 1,一个 -1 都没有
默认的 contamination 是 'auto',但实际版本(如 scikit-learn 1.2+)里它只是预估,并不保证输出指定比例的离群点。你看到全 1,说明模型认为“没异常”——大概率是数据没标准化,或者量纲差异太大。
- 必须做标准化:
StandardScaler或RobustScaler(后者对已有离群点更鲁棒) - 显式设
contamination=0.05(即预期 5% 异常),比用'auto'可控得多 - 确认输入是二维数组:
X.shape得是(n_samples, n_features),别传进一维Series或list
score_samples() 返回的分值怎么解释
这不是概率,也不是距离,是“异常程度”的相对打分:越负越异常。官方文档写的是“negative of the anomaly score”,所以直接看 iso.score_samples(X) 的输出,挑最小的那些就行。
- 想复现
predict()的 -1/1 判断?等价于score_samples(X) ,其中 <code>threshold来自模型的offset_属性 - 别用
score_samples做阈值搜索——它没归一化,不同数据集间不可比 - 如果要排序找 top-K 异常点,直接用
np.argsort(score_samples(X))[:k],比先 predict 再过滤快
和 LOF、OneClassSVM 比,什么时候选 IsolationForest
适合高维、样本量中等(几千到几十万)、不需要精确边界、且离群点是“稀疏孤立”的场景。它不建模分布,靠随机切分树来隔离异常,所以对簇状异常或低维稠密噪声效果一般。
- 维度 > 20?优先试
IsolationForest,LOF 在高维会失效(距离退化) - 样本 EllipticEnvelope,树方法小样本方差太大
- 实时流式检测?别用——它必须全量训练,没法 partial_fit
真正麻烦的不是调参,是确认“你定义的离群点”和模型发现的是否一致。比如业务上认为销售额突增是异常,但模型可能只对突降敏感——得拿真实误报样本来反推特征构造是否合理。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











