目錄
- 一、前言
- 二、孤立森林算法
- 2.1 算法簡介
- 2.2 基本原理
- 2.3 算法步驟
- 2.4 異常分數計算方式
- 2.5 python調用方式
- 三、python代碼示例
- 四、小結
- 五、參考學習
一、前言
近期在研究構建壽命預測模型,相信很多數據人都懂建模的過程,其實有80%的時間都是在和數據處理打交道。
在數據處理過程中,一種常見的處理場景即異常值處理。日常常用的異常值處理,最常用的幾種方式: 西格瑪法則、四分位距、指定閾值 來識別檢測異常值,其它使用過的方法主要是基于距離或者密度的方法來識別,不過這類方法小數據量還行,大數據量就很很影響檢測效率。調研發現一種以前沒用過的一種方法:孤立森林算法(Isolation Forest),因此作一記錄學習。
二、孤立森林算法
2.1 算法簡介
孤立森林(Isolation Forest)是一種用于異常檢測的無監督學習算法,屬于ensemble的方法,由 Fei Tony Liu、Kai Ming Ting 和 Zhi-Hua Zhou 于 2008 年提出。它通過構建多棵孤立樹(Isolation Tree)來識別數據中的異常點,具有線性時間復雜度和高精準度,計算效率高、能夠處理高維數據等優點,廣泛應用于網絡安全、金融欺詐檢測、工業設備故障檢測等領域。
2.2 基本原理
孤立森林算法的核心思想基于這樣一個事實:異常點通常是數據集中少數且與其他數據點差異較大的點,因此它們更容易被孤立出來。該算法通過遞歸地隨機劃分數據空間,將異常點快速地隔離到樹的淺層節點,而正常點則需要更多的劃分才能被隔離,從而根據數據點在孤立樹中的路徑長度來判斷其是否為異常點。
2.3 算法步驟
- 步驟一:構建孤立樹(iTree)
- 從原始數據集中隨機選擇一部分樣本(通常為固定數量,記為 sample_size)作為當前樹的訓練樣本。
- 隨機選擇一個特征和該特征上的一個分割值,將樣本集劃分為兩個子集。
- 對每個子集重復上述步驟,直到滿足停止條件(例如,子集中只有一個樣本或達到最大樹深度)。
- 步驟二:構建孤立森林
重復步驟一,構建多棵孤立樹(通常記為 n_estimators),這些樹構成了孤立森林。
- 步驟三:計算路徑長度
對于每個數據點,將其輸入到孤立森林中的每棵樹中,記錄該數據點在每棵樹中從根節點到葉節點所經過的路徑長度。
- 步驟四:計算異常分數
根據數據點在所有孤立樹中的平均路徑長度,計算其異常分數。異常分數的取值范圍在 0 到 1 之間,分數越接近 1 表示該數據點越可能是異常點,分數越接近 0 表示該數據點越可能是正常點。
2.4 異常分數計算方式
為了量化異常程度,孤立森林定義了異常分數 s(x,n)s(x,n)s(x,n),公式如下:
s(x,n)=2?E(h(x))c(n)s(x,n)=2^{-\frac{E(h(x))}{c(n)}}s(x,n)=2?c(n)E(h(x))?
其中:
- h(x):樣本x在iTree上的路徑長度;
- E(h(x)):樣本 x 在所有 iTree 中的平均路徑長度;
- c(n):樣本量為 n 時的 “平均路徑長度期望”(作為歸一化因子,由理論推導得出,與 n 近似成對數關系);
- n:構建 iTree 時的樣本子集大小。
分數解讀:
- s≈1:樣本極可能是異常點(路徑長度遠短于平均);
- s≈0:樣本極可能是正常點(路徑長度接近平均);
- s≈0.5:樣本處于正常與異常的邊界(路徑長度接近隨機劃分的平均水平)。
2.5 python調用方式
python中有現在的算法庫,通過下述方式即可導入使用。
from sklearn.ensemble import IsolationForest
** 函數關鍵參數解析:**
- n_estimators:iTree 的數量(默認 100)。樹越多,結果越穩定,但計算成本越高;
- max_samples:每棵 iTree 處理的樣本量(默認 256)。過小可能導致異常點漏檢,過大則降低效率;
- max_depth:iTree 的最大深度(默認隨樣本量動態調整)。限制深度可避免過擬合(尤其是樣本量小時)。
三、python代碼示例
# 導入必要的庫
import pandas as pd # 數據處理庫
import numpy as np # 數值計算庫
import matplotlib.pyplot as plt # 數據可視化庫
from sklearn.model_selection import train_test_split # 數據集劃分工具
from sklearn.preprocessing import StandardScaler # 數據標準化工具
from sklearn.ensemble import IsolationForest # 異常檢測模型
from sklearn.metrics import mean_squared_error, r2_score ,root_mean_squared_error # 模型評估指標
from itertools import groupby
from operator import itemgetter# 生成一些示例數據
np.random.seed(42)
X_inliers = 0.3 * np.random.randn(100, 2)
X_inliers = np.r_[X_inliers + 2, X_inliers - 2]
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))
X = np.r_[X_inliers, X_outliers]# 創建并訓練孤立森林模型
clf = IsolationForest(n_estimators=100, contamination=0.1)
clf.fit(X)# 預測每個數據點的異常標簽
y_pred = clf.predict(X)# 可視化結果
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title('Isolation Forest Anomaly Detection')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
四、小結
以前,有問題,找百度;現在有個更快捷的方式,有問題找chatgpt。不得不說,各類gpt工具,確實助力工作效率得到了很大的提升,相比百度搜索查找信息更加精準。最后,底層算法雖重要,但上層的思維邏輯更重要,作為數據分析師,千錘百煉自己思考問題、定義問題、解決問題的方式方法,思維邏輯尤其重要!
五、參考學習
- 孤立森林異常值評分公式推導
- 【異常檢測】孤立森林(Isolation Forest)算法簡介
- 孤立森林(isolation):一個最頻繁使用的異常檢測算法