【问题标题】:What if there is a lot of outliers in your dataset如果数据集中有很多异常值怎么办
【发布时间】:2021-11-05 07:42:08
【问题描述】:

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

但是,应用它后,我的模型预测结果是完美的,这意味着存在问题!

【问题讨论】:

  • 数据集中有 95% 的异常值通常表明出现了问题。我建议再次检查该过程并查看某处是否存在问题
  • 一般来说,这对于Cross Validated(一个专注于统计的 Stack Exchange 站点)来说是一个更好的问题。 Stack Overflow 只关注关于编写代码的狭隘、具体的问题,并且存在规范正确的答案。

标签: python data-science outliers


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多