如果数据集中存在大量异常值,该怎么办

2024-06-12 04:11:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图处理数据集中的异常值,但在检查它们的数量时,我发现在每一列中大约有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

然而,在应用它之后,我的模型预测的结果是完美的,这意味着有一个问题


Tags: 数据inforchecknptraincolquantile
1条回答
网友
1楼 · 发布于 2024-06-12 04:11:56

对于你的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

相关问题 更多 >