isolation forest直接调用sklearn.ensemble.isolationforest,目标是孤立异常点而非拟合分布;关键参数:contamination设异常比例、n_estimators建议100–200、max_samples默认'auto'。

Isolation Forest在Python中怎么调用
直接用 sklearn.ensemble.IsolationForest,不是自己实现树结构。它和 RandomForest 一样属于集成方法,但目标完全不同:不追求拟合数据分布,而是通过随机切分快速“孤立”异常点。
关键参数有三个必须留意:
-
contamination:预估异常比例,比如设为0.1表示假设 10% 样本是异常。注意这个值影响predict()的阈值判定,不是训练时硬过滤 -
n_estimators:默认 100,太少容易不稳定,超过 200 提升有限,建议 100–200 之间试 -
max_samples:控制每棵树的子采样大小,默认'auto'(即 min(256, n_samples)),对小数据集('sqrt' 或具体整数,避免单棵树太浅而漏检
fit()之后怎么判断哪些样本是异常
fit() 本身不输出标签,得靠后续方法。最常用的是 predict() 和 decision_function(),行为差异很大:
-
predict()返回数组,值为1(正常)或-1(异常)。它依赖训练时设定的contamination自动确定阈值,适合直接二分类任务 -
decision_function(X)返回每个样本的“异常分数”,越小越异常。这个值可排序、画直方图、手动设阈值——比如取最低 5% 的样本做人工复核 - 别用
score_samples()想当然当概率用,它返回的是负异常分数(越大越异常),且无统计意义,仅作相对排序参考
为什么结果全是-1或者全是1
这不是算法坏了,大概率是数据或参数没对齐。常见原因有:
- 特征没标准化:
IsolationForest对量纲敏感。比如一列是年龄(0–100),另一列是收入(0–1e6),后者会主导分割方向。务必先用StandardScaler或RobustScaler处理 -
contamination设得远高于真实异常率:比如实际只有 0.5% 异常,却设成0.2,模型会“强行”把大量正常点判为异常 - 特征中存在高比例缺失值或全零列:树在随机切分时可能反复选到无效维度,导致所有路径深度趋同。检查
X.isnull().sum()和(X == 0).mean() - 样本量过小(
Isolation Forest适合什么类型的数据
它强在快和无监督,但有明确边界:
- 适合:中低维(
- 不适合:纯类别特征(需先编码且慎用)、时间序列依赖性强(如股价走势,孤立森林忽略顺序)、图像/文本等高维稀疏特征(此时
AutoEncoder或OneClassSVM更稳) - 混合类型数据要小心:如果混了类别列,
pd.get_dummies()后注意稀疏性爆炸,建议先用VarianceThreshold剔除低频独热列
真正难的不是跑通代码,而是确认你的“异常”定义是否和孤立森林的数学假设匹配——它只对“少数+易隔离”有效,对系统性偏差(比如整个批次传感器漂移)无能为力。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











