【问题标题】:Isolation Forest隔离森林
【发布时间】:2017-07-06 14:20:48
【问题描述】:

我目前正在使用 Python 中的 IsolationForest 方法识别数据集中的异常值,但不完全理解 sklearn 上的示例:

http://scikit-learn.org/stable/auto_examples/ensemble/plot_isolation_forest.html#sphx-glr-auto-examples-ensemble-plot-isolation-forest-py

具体来说,图表实际上向我们展示了什么?观察结果已被定义为正常/异常值 - 所以我假设等高线图的阴影表明该观察结果是否确实是异常值(例如,具有较高异常分数的观察值位于较暗的阴影区域?)。

最后,如何实际使用以下代码部分(特别是 y_pred 函数)?

# fit the model
clf = IsolationForest(max_samples=100, random_state=rng)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers) 

我猜它只是为了完整性,以防有人想要打印输出?

提前感谢您的帮助!

【问题讨论】:

  • (at) bosbraves 我的解决方案有效吗?
  • 你介意接受这个答案吗?

标签: python scikit-learn outliers anomaly-detection


【解决方案1】:

使用您的代码

在您的代码之后,只需打印 y_pred_outliers

# fit the model
clf = IsolationForest(max_samples=100, random_state=rng)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers) 

print(y_pred_outliers)

因此,对于每个观察结果,它都会根据拟合模型说明(+1 或 -1)是否应将其视为异常值。

使用虹膜数据的简单示例

from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

rng = np.random.RandomState(42)
data = load_iris()

X=data.data
y=data.target
X_outliers = rng.uniform(low=-4, high=4, size=(X.shape[0], X.shape[1]))

X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=0)

clf = IsolationForest()
clf.fit(X_train)

y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)

print(y_pred_test)
print(y_pred_outliers)

结果:

[ 1  1 -1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1]

[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1]

解读:

print(y_pred_test) 仅返回 1。这意味着 X_test 的所有样本都不是异常值。

另一方面,print(y_pred_outliers) 只返回 -1。这意味着 X_outliers 的所有样本(虹膜数据总共 150 个)都是异常值。

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2018-09-10
    • 2019-07-11
    • 2019-06-29
    • 2020-11-16
    • 2019-08-02
    • 2019-07-20
    • 2017-08-21
    • 1970-01-01
    • 2015-07-16
    相关资源
    最近更新 更多