如果你的数据集中有很多异常值怎么办

What if there is a lot of outliers in your dataset

我试图处理数据集中的离群值,但在检查它们的数量时,我发现每一列中都有大约 95% 的离群值!这太奇怪了。

那么使用 IQR 替换这些值是一个不错的选择,还是我应该保持原样?

def check_outliers(col) :
    outliers = []
    Q1 = col.quantile(.25)
    Q3 = col.quantile(.75)
    IQR = Q3 - Q1
    lowerLimit = Q1 - 1.5*IQR
    higherLimit = Q3 - 1.5*IQR
    
    for elt in col :
        if elt < lowerLimit or elt > higherLimit :
            outliers.append(elt)
            
    return np.array(outliers), lowerLimit, higherLimit


for col in train.columns :
    arr,lowerLimit,higherLimit = check_outliers(train[col])
    print(col, len(arr))
    
    train[col] = np.where(train[col]>higherLimit,higherLimit,train[col])
    train[col] = np.where(train[col] <lowerLimit,lowerLimit,train[col])

我认为这些值可能是某些人为错误或系统故障的结果。所以我们不能简单地接受或删除它们,因为那样我们将错过其他功能数据。

所以我说为什么不使用 IQR?

但是应用之后,我的模型预测的结果很完美,说明有问题!

对于您的higherlimit,您写的是Q3 - 1.5*IQR,但这里应该是+。目前你的上限将输出比它应该的低得多,因此返回 95% 的异常值(这不应该使用 LQ/UQ 和 IQR)。

def check_outliers(col) :
outliers = []
Q1 = col.quantile(.25)
Q3 = col.quantile(.75)
IQR = Q3 - Q1
lowerLimit = Q1 - 1.5*IQR
higherLimit = Q3 + 1.5*IQR

for elt in col :
    if elt < lowerLimit or elt > higherLimit :
        outliers.append(elt)
        
return np.array(outliers), lowerLimit, higherLimit