异常值去除 孤立森林

3
我一直在尝试使用孤立森林从我的数据库中删除异常值,但我无法弄清楚如何操作。我已经看过信用卡欺诈和工资的示例,但我无法弄清楚如何将它们应用于每一列,因为我的数据库由3862900行和19列组成。我上传了一个数据库头部的图像。我无法弄清楚如何在每个列上应用孤立森林,然后永久删除这些异常值。enter image description here 谢谢。

enter image description here

3个回答

3

IsolationForest 可以用来清除您的数据中的异常值。正如这个答案所说,在通常的机器学习设置中,您可以将其运行来清除您的训练数据集

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进行参数化。


3

根据文档,此工具用于检测离群值而非移除它们。

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]])

数组([ 1, 1, -1])

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

如果你想从DataFrame中删除异常值,应该使用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

你可以看到异常值已被移除。
对于整个数据框来说。
def IQR(df, colname, bounds = [.25, .75]):
    s = df[colname]
    q = s.quantile(bounds)
    return df[~s.clip(*q).isin(q)]

注意:孤立森林无法从数据集中删除异常值,它用于检测新的异常值。

可以使用IQR来移除异常值,例如使用孤立森林预测的结果吗? - AliY
我不确定我理解了,孤立森林的结果是原始数据集中不存在的值,因此它们已经被移除了。 - Kenan
我的数据集充满了异常值,孤立森林无法检测到这些异常值? - AliY
1
孤立森林用于检测值(在数据集之外)是否为异常值。如果您的数据集中充满了异常值,并且您想要删除它们,请使用IQR。孤立森林不会删除异常值。 - Kenan
1
那么答案是否定的,你不能用那种方法移除。 - Kenan
显示剩余2条评论

0

我知道我晚回答这个问题,但正如@Kenan所说的,孤立森林用于识别异常值,但不会完全去除它们

你可以尝试使用O_Sieve,它可以自动删除异常值并给出数据集。

pip install vcosmos
from spatial_domain.anaomaly import O_Sieve
sieve=O_Sieve(your_df target_column, tsf=2,tsf=2)
clean_df=sieve.filtered_data()
print(clean_df)

您可以调整 tsf 和 bsf 参数以选择其对异常值数量的影响程度。要了解更多信息,请查阅 vcosmos 的文档。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接