如果你的数据集中有很多异常值怎么办
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
我试图处理数据集中的离群值,但在检查它们的数量时,我发现每一列中都有大约 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