如何更加重视sklearn Isolation Forest中的某些功能
How to give more importance to some features in sklearn Isolation Forest
我是用sklearn isolation forest for an anomaly detection task. Isolation forest consists of iTrees. As this paper描述的,iTrees的节点是这样拆分的:
我们 select 任意特征(均匀地)随机并对该特征的随机值执行拆分。
但我想赋予某些功能比其他功能更多的权重。因此,我不想 select 等概率地绘制特征,而是想绘制一些概率较高的特征(赋予这些特征更多的权重)和其他概率较低的特征。
我该怎么做?从 source code 看来我必须更改 _bagging.py
中的函数 _generate_bagging_indices
,但不确定。
您可以在不更改源代码的情况下实现这一点。相反,您可以通过复制您希望增加权重的特征来调整您的输入数据。如果你有一个特征出现两次,树将使用它两次来分割你的数据,这实际上意味着将特征的权重加倍。
除此之外,您还可以选择减少隔离林在每棵树中使用的特征量。这是由参数 max_features
控制的。默认值 1.0 确保每个特征都将用于每棵树。通过减少它,将训练更多的树,而不会在输入中出现频率较低的特征。
插图
加载数据
from sklearn.ensemble import IsolationForest
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
data = load_iris()
X = data.data
df = pd.DataFrame(X, columns=data.feature_names)
默认设置
IF = IsolationForest()
IF.fit(df)
preds = IF.predict(df)
plt.scatter(df.iloc[:, 0], df.iloc[:, 1], c=preds)
plt.title("Default settings")
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.show()
加权设置
df1 = df.copy()
weight_feature = 10
for i in range(weight_feature):
df1["duplicated_" + str(i)] = df1["sepal length (cm)"]
IF1 = IsolationForest(max_features=0.3)
IF1.fit(df1)
preds1 = IF1.predict(df1)
plt.scatter(df.iloc[:, 0], df.iloc[:, 1], c=preds1)
plt.title("Weighted settings")
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.show()
正如您在视觉上看到的那样,第二个选项更加密集地使用了 X-axis 来确定哪些是异常值。
我是用sklearn isolation forest for an anomaly detection task. Isolation forest consists of iTrees. As this paper描述的,iTrees的节点是这样拆分的: 我们 select 任意特征(均匀地)随机并对该特征的随机值执行拆分。
但我想赋予某些功能比其他功能更多的权重。因此,我不想 select 等概率地绘制特征,而是想绘制一些概率较高的特征(赋予这些特征更多的权重)和其他概率较低的特征。
我该怎么做?从 source code 看来我必须更改 _bagging.py
中的函数 _generate_bagging_indices
,但不确定。
您可以在不更改源代码的情况下实现这一点。相反,您可以通过复制您希望增加权重的特征来调整您的输入数据。如果你有一个特征出现两次,树将使用它两次来分割你的数据,这实际上意味着将特征的权重加倍。
除此之外,您还可以选择减少隔离林在每棵树中使用的特征量。这是由参数 max_features
控制的。默认值 1.0 确保每个特征都将用于每棵树。通过减少它,将训练更多的树,而不会在输入中出现频率较低的特征。
插图
加载数据
from sklearn.ensemble import IsolationForest
import pandas as pd
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt
data = load_iris()
X = data.data
df = pd.DataFrame(X, columns=data.feature_names)
默认设置
IF = IsolationForest()
IF.fit(df)
preds = IF.predict(df)
plt.scatter(df.iloc[:, 0], df.iloc[:, 1], c=preds)
plt.title("Default settings")
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.show()
加权设置
df1 = df.copy()
weight_feature = 10
for i in range(weight_feature):
df1["duplicated_" + str(i)] = df1["sepal length (cm)"]
IF1 = IsolationForest(max_features=0.3)
IF1.fit(df1)
preds1 = IF1.predict(df1)
plt.scatter(df.iloc[:, 0], df.iloc[:, 1], c=preds1)
plt.title("Weighted settings")
plt.xlabel("sepal length (cm)")
plt.ylabel("sepal width (cm)")
plt.show()
正如您在视觉上看到的那样,第二个选项更加密集地使用了 X-axis 来确定哪些是异常值。