Scikit-learn Isolation Forest:如何提取样本路径长度?
获取IsolationForest中样本的路径长度
sklearn的IsolationForest没有直接提供获取样本路径长度的API,但可以通过访问模型内部的树结构来计算。路径长度是样本从根节点到叶子节点经过的边数,每棵树的路径长度取平均就是最终用于计算异常分数的基础值。
实现步骤:
- 训练
IsolationForest模型后,遍历模型中存储在estimators_属性里的每棵树。 - 对每个样本,通过树的
decision_path方法获取路径节点矩阵,统计路径中的节点数量,边数等于节点数减1。 - 将所有树的路径长度取平均,得到每个样本的平均路径长度。
代码示例:
from sklearn.ensemble import IsolationForest import numpy as np # 生成示例数据并训练模型 X = np.random.randn(100, 5) clf = IsolationForest(n_estimators=10, random_state=42) clf.fit(X) def get_path_lengths(model, X): path_lengths = [] for tree in model.estimators_: # 获取每个样本的路径节点稀疏矩阵 node_path = tree.decision_path(X) # 计算单棵树中每个样本的路径长度(节点数-1) tree_path_len = node_path.sum(axis=1).A1 - 1 path_lengths.append(tree_path_len) # 取所有树的路径长度平均值 avg_path_length = np.mean(path_lengths, axis=0) return avg_path_length # 获取每个样本的平均路径长度 avg_path = get_path_lengths(clf, X) print(avg_path[:5]) # 打印前5个样本的路径长度
说明:
estimators_属性存储了IsolationForest中所有孤立树,每棵树是ExtraTreeClassifier实例。decision_path(X)返回的稀疏矩阵,每行对应一个样本的路径节点,sum(axis=1)统计节点总数后减1,就是实际经过的边数(路径长度)。- 最终的平均路径长度是IsolationForest计算异常分数的核心指标,异常分数是对该值做归一化处理后的结果。
内容的提问来源于stack exchange,提问作者MVMV
相关产品推荐
相关产品推荐

