异常值去除隔离林

Posted

技术标签:

【中文标题】异常值去除隔离林【英文标题】:Outlier removal Isolation Forest 【发布时间】:2020-05-25 04:20:02 【问题描述】:

我一直在尝试使用隔离林从我的数据库中删除异常值,但我不知道怎么做。我已经看过信用卡欺诈和薪水的例子,但我不知道如何将它们应用于每一列,因为我的数据库由 3862900 行和 19 列组成。我已经上传了我的数据库负责人的图像。我不知道如何在每列上应用隔离林,然后永久删除这些异常值。

谢谢。

【问题讨论】:

【参考方案1】:

IsolationForest 可能打算从异常值中清除您的数据。正如answer 所说,在通常的机器学习设置中,您将运行它来清理您的训练数据集

from sklearn.ensemble import IsolationForest
clf = IsolationForest(max_samples=100, random_state=4, contamination=.1)
#identify outliers:
y_pred_train = clf.fit_predict(X_train)
#Remove outliers where 1 represent inliers and -1 represent outliers:
X_train_cleaned = X_train[np.where(y_pred_train == 1, True, False)]

我们可以在无监督设置中使用 IQR 等不同的方法来参数化 contamination

【讨论】:

【参考方案2】:

根据docs 用于检测异常值而不是删除它们

df = pd.DataFrame('temp': [1,2,3,345,6,7,5345, 8, 9, 10, 11])
clf = IsolationForest().fit(df['temp'].values.reshape(-1, 1)) 
clf.predict([[4], [5], [3636]])

array([ 1, 1, -1])

从输出中可以看出,45 不是异常值,但 3636 是。

如果您想从数据框中删除异常值,您应该使用 IQR

quant = df['temp'].quantile([0.25, 0.75])
df['temp'][~df['temp'].clip(*quant).isin(quant)]
4     6
5     7
7     8
8     9
9    10

如您所见,异常值已被删除

对于整个 df

def IQR(df, colname, bounds = [.25, .75]):
    s = df[colname]
    q = s.quantile(bounds)
    return df[~s.clip(*q).isin(q)]

注意:隔离林无法从您的数据集中移除异常值,它用于检测新的异常值

【讨论】:

是否可以使用 IQR 去除异常值,例如使用隔离林预测的结果? 我不确定我是否理解,隔离林的结果是不在您原始数据集中的值,因此它们已经被删除。 我的数据集充满了异常值,隔离林检测不到这些异常值? 隔离林用于检测值(在您的数据集之外)是否为异常值。如果您的数据集充满了异常值并且您想要删除它们,请使用 IQR。隔离林不会删除 那么答案是否定的,你不能用那个方法删除

以上是关于异常值去除隔离林的主要内容,如果未能解决你的问题,请参考以下文章

隔离林需要数据规范化吗?

运行模型后,如何将隔离林和局部离群因子保存为两个不同的模型?

从相关系数计算中去除异常值

R使用Z分数和四分位数区间法去除异常值(outlier)

如何使用 tidyverse 去除基于标准开发的异常值?

计算百分位数以去除异常值的快速算法