如何使用隔离林
How to use Isolation Forest
我正在尝试检测数据集的异常值,我找到了 sklearn 的 Isolation Forest。我不明白如何使用它。我将我的训练数据放入其中,它返回一个具有 -1 和 1 值的向量。
任何人都可以向我解释它是如何工作的并提供一个例子吗?
我怎么知道异常值是'real'异常值?
调整参数?
这是我的代码:
clf = IsolationForest(max_samples=10000, random_state=10)
clf.fit(x_train)
y_pred_train = clf.predict(x_train)
y_pred_test = clf.predict(x_test)
[1 1 1 ..., -1 1 1]
-1 表示异常值(根据拟合模型)。参见 IsolationForest example for a nice depiction of the process. If you have some prior knowledge, you could provide more parameters to get a more accurate fitting. For example, if you know the contamination (proportion of outliers in the data set) you could provide it as an input. By default it is assumed to be 0.1. See description of the parameters here。
看来你的问题很多,我尽量一一解答。
如何运作?
之所以有效,是因为任何数据集中异常值的性质,即异常值,很少且不同,这与典型的基于聚类的方法有很大不同或基于距离的算法。在顶层,它的工作逻辑是,与任何数据集中的 'normal' 点相比,离群值 'isolate' 采取的步骤更少。
为此,这就是 IF 所做的;假设您的训练数据集 X 具有 n 个数据点,每个数据点具有 m 个特征。在训练中,IF为不同的特征创建隔离树(二叉搜索树)。
对于训练,在 train 阶段有 3 个参数用于调整:
- 隔离树的数量(sklearn_IsolationForest 中的
n_estimators
)
- 样本数(sklearn_IsolationForest 中的
max_samples
)
- 从 X 中提取的特征数以训练每个基本估计器(sklearn_IF 中的
max_features
)。
max_samples
是它将从原始数据集中选取的随机样本数,用于创建隔离树。
在测试阶段:
sklearn_IF从所有训练好的Isolation Trees中求待测数据点的路径长度,求平均路径长度。路径长度越大,点越正常,反之亦然。
基于平均路径长度。它计算异常分数,decision_function of sklearn_IF 可以用来得到这个。对于sklearn_IF,分数越低,样本越异常。
根据异常分数,您可以通过在sklearn_IF对象中设置适当的contamination
值来判断给定样本是否异常。 contamination
的默认值为 0.1,您可以调整它来决定阈值。数据集的污染程度,即数据集中异常值的比例。
调整参数
培训 -> n_estimators
、max_samples
、max_features
。
测试 -> contamination
让我补充一点,当我看到这个问题时,我被卡住了。
大多数时候你将它用于二进制 class化(我假设),其中你有大多数 class 0 和异常值 class 1。例如如果你想 detect fraud 那么你的专业 class 是非欺诈 (0),欺诈是 (1)。
现在,如果您有训练和测试拆分:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
还有你运行:
clf = IsolationForest(max_samples=10000, random_state=10)
clf.fit(x_train)
y_pred_test = clf.predict(x_test)
“正常”classifier 评分的输出可能非常混乱。如前所述,y_pred_test
将由 [-1,1] 组成,其中 1 是您的多数 class 0,-1 是您的未成年人 class 1。所以我可以建议您转换它:
y_pred_test = np.where(y_pred_test == 1, 0, 1)
然后就可以使用正常的计分功能等了
我正在尝试检测数据集的异常值,我找到了 sklearn 的 Isolation Forest。我不明白如何使用它。我将我的训练数据放入其中,它返回一个具有 -1 和 1 值的向量。
任何人都可以向我解释它是如何工作的并提供一个例子吗?
我怎么知道异常值是'real'异常值?
调整参数?
这是我的代码:
clf = IsolationForest(max_samples=10000, random_state=10)
clf.fit(x_train)
y_pred_train = clf.predict(x_train)
y_pred_test = clf.predict(x_test)
[1 1 1 ..., -1 1 1]
-1 表示异常值(根据拟合模型)。参见 IsolationForest example for a nice depiction of the process. If you have some prior knowledge, you could provide more parameters to get a more accurate fitting. For example, if you know the contamination (proportion of outliers in the data set) you could provide it as an input. By default it is assumed to be 0.1. See description of the parameters here。
看来你的问题很多,我尽量一一解答。
如何运作?
之所以有效,是因为任何数据集中异常值的性质,即异常值,很少且不同,这与典型的基于聚类的方法有很大不同或基于距离的算法。在顶层,它的工作逻辑是,与任何数据集中的 'normal' 点相比,离群值 'isolate' 采取的步骤更少。 为此,这就是 IF 所做的;假设您的训练数据集 X 具有 n 个数据点,每个数据点具有 m 个特征。在训练中,IF为不同的特征创建隔离树(二叉搜索树)。
对于训练,在 train 阶段有 3 个参数用于调整:
- 隔离树的数量(sklearn_IsolationForest 中的
n_estimators
) - 样本数(sklearn_IsolationForest 中的
max_samples
) - 从 X 中提取的特征数以训练每个基本估计器(sklearn_IF 中的
max_features
)。
max_samples
是它将从原始数据集中选取的随机样本数,用于创建隔离树。
在测试阶段:
sklearn_IF从所有训练好的Isolation Trees中求待测数据点的路径长度,求平均路径长度。路径长度越大,点越正常,反之亦然。
基于平均路径长度。它计算异常分数,decision_function of sklearn_IF 可以用来得到这个。对于sklearn_IF,分数越低,样本越异常。
根据异常分数,您可以通过在sklearn_IF对象中设置适当的
contamination
值来判断给定样本是否异常。contamination
的默认值为 0.1,您可以调整它来决定阈值。数据集的污染程度,即数据集中异常值的比例。
调整参数
培训 -> n_estimators
、max_samples
、max_features
。
测试 -> contamination
让我补充一点,当我看到这个问题时,我被卡住了。
大多数时候你将它用于二进制 class化(我假设),其中你有大多数 class 0 和异常值 class 1。例如如果你想 detect fraud 那么你的专业 class 是非欺诈 (0),欺诈是 (1)。
现在,如果您有训练和测试拆分:X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)
还有你运行:
clf = IsolationForest(max_samples=10000, random_state=10)
clf.fit(x_train)
y_pred_test = clf.predict(x_test)
“正常”classifier 评分的输出可能非常混乱。如前所述,y_pred_test
将由 [-1,1] 组成,其中 1 是您的多数 class 0,-1 是您的未成年人 class 1。所以我可以建议您转换它:
y_pred_test = np.where(y_pred_test == 1, 0, 1)
然后就可以使用正常的计分功能等了