使用局部异常值因子 (LOF) 进行异常值检测
Outlier detection with Local Outlier Factor (LOF)
我正在处理医疗保险索赔数据,想识别欺诈性索赔。一直在网上阅读以尝试找到更好的方法。我在 scikit-learn.org
上遇到了以下代码
有谁知道如何 select 异常值?代码将它们绘制在图表中,但如果可能的话,我想 select 那些异常值。
我尝试将 y_predictions 附加到 x 数据框,但没有成功。
print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import LocalOutlierFactor
np.random.seed(42)
# Generate train data
X = 0.3 * np.random.randn(100, 2)
# Generate some abnormal novel observations
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))
X = np.r_[X + 2, X - 2, X_outliers]
# fit the model
clf = LocalOutlierFactor(n_neighbors=20)
y_pred = clf.fit_predict(X)
y_pred_outliers = y_pred[200:]
下面是我试过的代码。
X['outliers'] = y_pred
前 200 个数据是异常值,后 20 个是异常值。当您在 X 上执行 fit_predict 时,您将在 y_pred 中得到异常值 (-1) 或内部值 (1)。因此,要获得预测的异常值,您需要获取那些 y_pred = -1 并在 X 中获取相应的值。下面的脚本将为您提供 X 中的异常值。
X_pred_outliers = [each[1] for each in list(zip(y_pred, X.tolist())) if each[0] == -1]
我将 y_pred 和 X 组合成一个数组并检查 y=-1,如果是则收集 X 值。
但是,预测有八个错误(220 个中有 8 个)。这些错误在 y_pred[:200] 中为 -1,在 y_pred[201:220] 中为 1。也请注意错误。
我正在处理医疗保险索赔数据,想识别欺诈性索赔。一直在网上阅读以尝试找到更好的方法。我在 scikit-learn.org
上遇到了以下代码有谁知道如何 select 异常值?代码将它们绘制在图表中,但如果可能的话,我想 select 那些异常值。
我尝试将 y_predictions 附加到 x 数据框,但没有成功。
print(__doc__)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import LocalOutlierFactor
np.random.seed(42)
# Generate train data
X = 0.3 * np.random.randn(100, 2)
# Generate some abnormal novel observations
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))
X = np.r_[X + 2, X - 2, X_outliers]
# fit the model
clf = LocalOutlierFactor(n_neighbors=20)
y_pred = clf.fit_predict(X)
y_pred_outliers = y_pred[200:]
下面是我试过的代码。
X['outliers'] = y_pred
前 200 个数据是异常值,后 20 个是异常值。当您在 X 上执行 fit_predict 时,您将在 y_pred 中得到异常值 (-1) 或内部值 (1)。因此,要获得预测的异常值,您需要获取那些 y_pred = -1 并在 X 中获取相应的值。下面的脚本将为您提供 X 中的异常值。
X_pred_outliers = [each[1] for each in list(zip(y_pred, X.tolist())) if each[0] == -1]
我将 y_pred 和 X 组合成一个数组并检查 y=-1,如果是则收集 X 值。
但是,预测有八个错误(220 个中有 8 个)。这些错误在 y_pred[:200] 中为 -1,在 y_pred[201:220] 中为 1。也请注意错误。