news 2026/4/16 14:58:21

彩笔运维勇闯机器学习--孤立森林

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
彩笔运维勇闯机器学习--孤立森林

孤立森林,一种非常高效快速的异常检测算法

开始探索

scikit-learn

import numpy as np

import matplotlib.pyplot as plt

from sklearn.ensemble import IsolationForest

rng = np.random.RandomState(0)

X_train = 0.3 * rng.randn(100, 2)

X_outliers = rng.uniform(low=-2, high=2, size=(10, 2))

clf = IsolationForest(n_estimators=100, max_samples='auto', contamination='auto', random_state=rng)

clf.fit(X_train)

y_pred_train = clf.predict(X_train)

y_pred_outliers = clf.predict(X_outliers)

plt.title("Isolation Forest")

plt.scatter(X_train[:, 0], X_train[:, 1], color='b', label="Normal")

plt.scatter(X_outliers[:, 0], X_outliers[:, 1], color='r', label="Outliers")

plt.legend()

plt.axis('tight')

plt.show()

脚本!启动:

watermarked-isolation_forest_1_4

深入理解

类似于随机森林,但每棵树不使用信息增益或基尼系数等指标,而是随机选择一个特征,在该特征的最小值和最大值之间随机选一个切分值,将数据集分成两部分,又在每个部分随机最大值与最小值之间随机选一个切分支,不断递归。指导到达指定深度或者当前节点只有1个样本

构造如此的树n棵,组成森林,开始计算每个样本在每棵树的平均路径长度(叶子节点的深度depth),计算异常分数

c

(

n

)

=

2

H

(

n

1

)

2

(

n

1

)

n

H

(

n

)

=

n

i

=

1

1

i

s

(

x

,

n

)

=

2

E

(

x

)

c

(

n

)

s

1

,强异常点,很容易被孤立

0.5

s

<

1

,可能是异常点,越接近1越是异常点,需要配合其他参数来确定,比如异常点比例

s

<

0.5

,正常点

举例说明

假设有以下样本: [1, 1.5, 1.8, 2.0, 2.3, 10]

构造第一棵树:

1)第一层:depth=1,随机选择划分值:1 < split < 10 的区间中选择 split = 5

左子树:[1, 1.5, 1.8, 2.0, 2.3]

右子树:[10.0]

2)第二层:depth=2,随机选择划分值:1 < split < 2.3 的区间中选择 split = 1.6

左子树:[1, 1.5]

右子树:[1.8, 2.0, 2.3]

3)第三层:depth=3,左子树,随机选择划分值:1 < split < 1.5 的区间中选择 split = 1.2

左子树:[1]

右子树:[1.5]

4)第三层:depth=3,右子树,随机选择划分值:1.8 < split < 2.3 的区间中选择 split = 2.1

左子树:[1.8, 2.0]

右子树:[2.3]

5)第四层:depth=4,随机选择划分值:1.8 < split < 2.9 的区间中选择 split = 1.9

左子树:[1.8]

右子树:[2.9]

6)计算路径

watermarked-isolation_forest_1_1

样本值 路径长度

1.0 3

1.5 3

1.8 4

2.0 4

2.3 3

10.0 1

重复构造第n棵树,得出路径,计算路径平均值

样本值 第1棵树路径 第2棵树路径 第n棵树路径 平均路径

1.0 3 3 .. 3

1.5 3 3 .. 3

1.8 4 4 .. 4

2.0 4 4 .. 4

2.3 3 3 .. 3

10.0 1 1 .. 1

计算异常得分

s

(

x

,

n

)

=

2

E

(

x

)

c

(

n

)

1)计算样本(1.0):

样本长度:

E

(

x

)

=

3

样本规模

n

=

6

的平均路径期望:

{

c

(

n

)

=

2

H

(

n

1

)

2

(

n

1

)

n

H

(

n

)

=

n

i

=

1

1

i

c

(

6

)

=

2

H

(

n

1

)

2

(

n

1

)

n

=

2

(

1

+

1

2

+

1

3

+

1

4

+

1

5

)

2

(

6

1

)

6

2.8999

s

(

1.0

)

=

2

E

(

x

)

c

(

n

)

=

2

3

2.8999

0.4882

2)计算所有样本

样本值 平均长度 异常得分

1.0 3 0.4882

1.5 3 0.4882

1.8 4 0.3844

2.0 4 0.3844

2.3 3 0.4882

10.0 1 0.7874

判断异常点:

路径长度越短的越异常,比如10.0的路径长度为1,在第一次分割的时候就被孤立了

异常分数越高就是异常点

sklearn中的异常分数

from sklearn.ensemble import IsolationForest

import numpy as np

X = np.array([[1], [1.5], [1.8], [2], [2.3], [10]])

clf = IsolationForest(random_state=0, contamination='auto')

clf.fit(X)

pred = clf.predict(X)

score = clf.decision_function(X)

for x, p, s in zip(X, pred, score):

print(f"样本 {x[0]:>4} -> {'异常' if p==-1 else '正常'} | 异常分数(decision_function): {s:.4f}")

脚本!启动:

watermarked-isolation_forest_1_2

问题出现了:

sklearn的分数和手工计算的并不一样

为什么1.0被当成异常了

分数越小反而越异常

先看第一个问题,sklearn的分数和手工计算的并不一样。首先,每棵树是采用部分的样本来计算,而不是采用所有的样本n=6来计算的。其次,在上面的手工计算中,期望路径长度

c

(

n

)

中的

H

(

n

)

,并不是由这个公式计算的

{

c

(

n

)

=

2

H

(

n

1

)

2

(

n

1

)

n

H

(

n

)

=

n

i

=

1

1

i

这个公式一旦n的数量增大,

H

(

n

)

的计算将会带来很大的计算消耗,通常使用另外一个公式计算近似值:

H

(

n

)

l

n

(

n

)

+

γ

γ

0.5772

以上两点原因,带来的就是sklearn计算异常分数与手工计算不一样

再看第二个问题,为什么1.0被当成异常了

只需要调整一个参数,contamination=0.1就可以解决这个问题了

watermarked-isolation_forest_1_3

contamination用来调节异常比例的参数,如果是auto,那么异常比例为33.3%,6个样本,那么异常点就是2个。手动调整为0.1,那就告诉模型只有1个异常点,那么最不正常的就是10.0了

最后第三个问题,分数越小反而越异常。这明显是计算方式不一样造成的,这里直接解析一下源码,版本:scikit-learn:1.6.1:

decision_function函数

def decision_function(self, X):

return self.score_samples(X) - self.offset_

score_samples函数返回的是:经过公式

s

(

x

,

n

)

=

2

E

(

x

)

c

(

n

)

计算的相反数

def score_samples(self, X):

...

return self._score_samples(X)

def _score_samples(self, X):

return -self._compute_chunked_score_samples(X)

def _compute_chunked_score_samples(self, X):

...

for sl in slices:

# compute score on the slices of test samples:

scores[sl] = self._compute_score_samples(X[sl], subsample_features)

return scores

def _compute_score_samples(self, X, subsample_features):

...

scores = 2 ** (

# For a single training sample, denominator and depth are 0.

# Therefore, we set the score manually to 1.

-np.divide(

depths, denominator, out=np.ones_like(depths), where=denominator != 0

)

)

return scores

self.offset_是根据整个样本异常分数,再加上异常比例参数contamination的中位数计算出来的

self.offset_ = np.percentile(self._score_samples(X), 100.0 * self.contamination)

看到这里,我就想说,复杂就行了,经过这么复杂的计算,与手动计算出来的肯定不一样

小结

在sklearn中

找到孤立点,contamination是一个非常重要的参数,它决定了每个节点的分数以及后续确定是否异常

快速找到孤立点,直接通过pred函数即可,-1是孤立点,1是正常点

想要获取点的评分,通过decision_function函数获取评分,与理论公式不同,评分越低反而越异常

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 12:08:32

深度评测:Blender屏幕操作显示工具在教程制作中的实战表现

深度评测&#xff1a;Blender屏幕操作显示工具在教程制作中的实战表现 【免费下载链接】Screencast-Keys Blender Add-on: Screencast Keys 项目地址: https://gitcode.com/gh_mirrors/sc/Screencast-Keys 对于Blender用户来说&#xff0c;制作教程视频时最头疼的问题莫…

作者头像 李华
网站建设 2026/4/16 11:59:38

NetGuard完整指南:简单几步掌控Android应用网络权限

想要彻底解决Android应用偷跑流量、耗电严重的问题吗&#xff1f;NetGuard这款开源网络管理工具正是你需要的解决方案。无需root权限&#xff0c;通过本地网络技术实现精准的网络控制&#xff0c;让每个应用的网络访问权限都在你的掌握之中。本指南将带你从零开始&#xff0c;快…

作者头像 李华
网站建设 2026/4/16 12:02:27

uesave完整教程:解锁Unreal Engine游戏存档编辑新技能

uesave完整教程&#xff1a;解锁Unreal Engine游戏存档编辑新技能 【免费下载链接】uesave-rs 项目地址: https://gitcode.com/gh_mirrors/ue/uesave-rs 存档管理困境&#xff1a;玩家们共同的烦恼 在游戏世界里&#xff0c;你是否曾经面临这样的尴尬局面&#xff1f;…

作者头像 李华
网站建设 2026/4/16 12:01:56

从零开始搭建BUCK电路:TL494控制芯片实战手册

从零开始搭建BUCK电路&#xff1a;TL494控制芯片实战手册 【免费下载链接】BUCK电路-TL494方案资源下载 本仓库提供了一个完整的BUCK电路设计方案&#xff0c;基于TL494控制芯片。该方案包含了详细的原理图、PCB设计文件以及Gerber文件&#xff0c;方便用户进行电路的设计、验证…

作者头像 李华
网站建设 2026/4/16 14:29:10

力扣--3433. 统计用户被提及情况

前言&#xff1a;这是力扣第3433的一道中等算法题&#xff0c;废话不多说&#xff0c;看题目和代码&#xff01;题目&#xff1a;给你一个整数 numberOfUsers 表示用户总数&#xff0c;另有一个大小为 n x 3 的数组 events 。每个 events[i] 都属于下述两种类型之一&#xff1a…

作者头像 李华
网站建设 2026/4/16 13:56:00

**2025小说软件推荐,助力高效创作**

在当今数字化时代&#xff0c;小说软件已成为众多写作者的得力助手。它不仅能够提供便捷的创作环境&#xff0c;还能帮助写作者提高创作效率和质量。然而&#xff0c;市场上的小说软件琳琅满目&#xff0c;如何选择一款适合自己的软件成为了许多写作者面临的难题。据《2025年中…

作者头像 李华