【scikit-learn】sklearn.ensemble.IsolationForest 类:孤立森林(异常检测)
IsolationForest是sklearn.ensemble提供的异常检测(Outlier Detection)方法,它通过构建多棵随机树,将异常点隔离,适用于异常检测、欺诈检测、入侵检测等任务。IsolationForest适用于异常检测任务,利用决策树隔离异常点,适用于高维数据和大规模数据,比基于距离的方法计算效率更高。
·
sklearn.ensemble.IsolationForest(孤立森林,异常检测)
IsolationForest 是 sklearn.ensemble 提供的 异常检测(Outlier Detection) 方法,它通过 构建多棵随机树,将异常点隔离,适用于 异常检测、欺诈检测、入侵检测等任务。
1. IsolationForest 作用
- 用于异常检测(如 信用卡欺诈检测、网络入侵检测)。
- 基于决策树,将异常数据隔离开,计算其异常分数(
anomaly score)。 - 比基于距离的异常检测方法(如 KNN)更适用于高维数据。
2. IsolationForest 代码示例
(1) 训练 IsolationForest 进行异常检测
from sklearn.ensemble import IsolationForest
import numpy as np
# 生成数据
rng = np.random.RandomState(42)
X = 0.3 * rng.randn(100, 2) # 100 个正常点
X = np.concatenate([X, rng.uniform(low=-4, high=4, size=(10, 2))]) # 10 个异常点
# 训练孤立森林模型
model = IsolationForest(n_estimators=100, contamination=0.1, random_state=42)
model.fit(X)
# 预测:1 表示正常点,-1 表示异常点
y_pred = model.predict(X)
# 统计异常点数量
n_outliers = np.sum(y_pred == -1)
print("检测到的异常点数量:", n_outliers)
解释
contamination=0.1:假设 10% 的数据是异常点(超参数)。predict(X)返回1(正常点)或-1(异常点)。
3. IsolationForest 主要参数
IsolationForest(n_estimators=100, contamination="auto", max_samples="auto", max_features=1.0, bootstrap=False, random_state=None)
| 参数 | 说明 |
|---|---|
n_estimators |
森林中的决策树数量(默认 100,值越大效果越稳) |
contamination |
异常样本比例(默认 "auto",可设 0.1 表示 10% 的数据是异常点) |
max_samples |
每棵树的样本数(默认 "auto",即 min(256, n_samples)) |
max_features |
每棵树的特征比例(默认 1.0,使用所有特征) |
bootstrap |
是否使用自助采样(默认 False) |
random_state |
设置随机种子,保证结果可复现 |
4. 获取异常分数
anomaly_scores = model.decision_function(X)
print("前 10 个样本的异常分数:", anomaly_scores[:10])
解释
decision_function(X)返回 异常分数(anomaly score),值越小越可能是异常点。
5. 可视化异常点
import matplotlib.pyplot as plt
# 可视化正常点和异常点
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap="coolwarm", edgecolors="k")
plt.title("IsolationForest 异常检测")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
解释
- 蓝色表示正常点,红色表示异常点。
6. IsolationForest vs. 其他异常检测方法
| 方法 | 适用情况 | 主要区别 |
|---|---|---|
IsolationForest |
基于树结构,适用于高维数据 | 无需计算距离,适用于大规模数据 |
LocalOutlierFactor (LOF) |
基于密度,适用于低维数据 | 计算邻域密度,适合小规模数据 |
One-Class SVM |
基于支持向量机,适用于复杂分布数据 | 计算成本较高 |
示例
from sklearn.neighbors import LocalOutlierFactor
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
y_pred_lof = lof.fit_predict(X) # -1 表示异常点
print("LOF 检测到的异常点数量:", np.sum(y_pred_lof == -1))
解释
IsolationForest适用于大规模高维数据,LOF适用于小规模密度异常检测。
7. contamination 对异常检测的影响
contaminations = [0.05, 0.1, 0.2]
for c in contaminations:
model = IsolationForest(n_estimators=100, contamination=c, random_state=42)
model.fit(X)
y_pred = model.predict(X)
print(f"污染率={c}, 检测到的异常点数={np.sum(y_pred == -1)}")
解释
contamination=0.05:认为 5% 的数据是异常点。contamination=0.2:认为 20% 的数据是异常点。
8. 适用场景
- 异常检测(如 欺诈检测、网络攻击检测)。
- 高维数据异常检测,避免计算距离过于复杂。
- 当数据异常点较少时,IsolationForest 可能比传统方法更有效。
9. 结论
IsolationForest适用于异常检测任务,利用决策树隔离异常点,适用于高维数据和大规模数据,比基于距离的方法 计算效率更高。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)