【问题标题】:How to remove Outliers in Python?如何在 Python 中去除异常值?
【发布时间】:2022-04-02 15:36:53
【问题描述】:

我想从我的数据集“train”中删除异常值,为此我决定使用 z-score 或 IQR。

我正在 Microsoft Python Client for SQL Server 上运行 Jupyter notebook。

我已经尝试过 z-score:

from scipy import stats
train[(np.abs(stats.zscore(train)) < 3).all(axis=1)]

对于 IQR:

Q1 = train.quantile(0.02)
Q3 = train.quantile(0.98)
IQR = Q3 - Q1
train = train[~((train < (Q1 - 1.5 * IQR)) |(train > (Q3 + 1.5 * 
IQR))).any(axis=1)]

...返回...

对于 z 分数:

TypeError: /: 'str' 和 'int' 的操作数类型不受支持

对于 IQR:

TypeError:不可排序的类型:str()

我的火车数据集如下所示:

# Number of each type of column
print('Training data shape: ', train.shape)
train.dtypes.value_counts()

训练数据形状:(300000, 111) int32 66 float64 30 object 15 dtype: int64

我们将不胜感激。

【问题讨论】:

  • 可能缺少一些演员表。但您需要展示更多关于您的数据集的信息才能了解
  • 您的火车数据是什么样的?它是否包含任何分类特征?
  • 我刚刚为此编辑了 Q。

标签: python pandas numpy scipy


【解决方案1】:

您的代码有问题,因为您尝试在分类列上计算 zscore

为避免这种情况,您应该首先将您的火车分成具有数字和分类特征的部分:

num_train = train.select_dtypes(include=["number"])
cat_train = train.select_dtypes(exclude=["number"])

只有在那之后才计算要保留的行索引:

idx = np.all(stats.zscore(num_train) < 3, axis=1)

最后将这两部分加在一起:

train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)

对于 IQR 部分:

Q1 = num_train.quantile(0.02)
Q3 = num_train.quantile(0.98)
IQR = Q3 - Q1
idx = ~((num_train < (Q1 - 1.5 * IQR)) | (num_train > (Q3 + 1.5 * IQR))).any(axis=1)
train_cleaned = pd.concat([num_train.loc[idx], cat_train.loc[idx]], axis=1)

如果您有任何其他问题,请告诉我们。

PS

此外,您可以考虑使用pandas.DataFrame.clip 处理异常值的另一种方法,该方法将逐个删除异常值,而不是完全删除一行。

【讨论】:

  • 感谢您的回答。我尝试使用 z-score 得到一个错误:TypeError: include and exclude must both be non-string sequences.
  • 这对我有用:num_train = train.select_dtypes(include=['number']) cat_train = train.select_dtypes(exclude=['number'])
  • 你有没有得到idx 填充布尔值TrueFalse?如果是这样,使用它来索引num_traincat_train。它在我的笔记本电脑上完美运行。
  • 我没有。但是,IQR 方式似乎工作正常,并且更适合我的目的。谢谢。
【解决方案2】:

您可以使用自动优化器模块。

pip 安装自动优化器

从 autooptimizer.process 导入 o​​utlier_removal

【讨论】:

    猜你喜欢
    • 2019-07-06
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2015-03-11
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多