首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >移除异常值后带有新异常值的数据集

移除异常值后带有新异常值的数据集
EN

Stack Overflow用户
提问于 2022-02-17 15:13:02
回答 1查看 59关注 0票数 1

我是机器学习方面的新手,我试着用“下雨奥地利”数据集来训练一个模型。目前,我正处于预处理阶段,在使用KNNImputer填充所有NaN值之后,我尝试使用以下自定义转换器类删除异常值。

代码语言:javascript
复制
class OutliersRemover(BaseEstimator, TransformerMixin):
  def __init__(self, cols_indexes):
    self.cols_indexes = cols_indexes

  def fit(self, X, y=None):
    return self

  def transform(self, X, y=None):
    outliers_indexes = set()
    threshold = 3
    X = X.to_numpy()
    
    for col_index in self.cols_indexes:
      mean = np.mean(X[:, col_index])
      std  = np.std(X[:, col_index])

      for line_index, item in enumerate(X[:, col_index]):
        z_score = (item - mean) / std
        if np.abs(z_score) > threshold:
          outliers_indexes.add(line_index)
    print("Removing: {} outliers".format(len(outliers_indexes)))
    return np.delete(X, list(outliers_indexes), 0)


outliers_remover    = OutliersRemover(np.arange(24))
X_train_transformed = outliers_remover.fit_transform(X_train)

它似乎正确地删除,但问题是,如果我运行下面的代码,以检查是否删除了所有异常值,它删除了另一组异常值。如果我运行10倍相同的代码,它会删除不同的离群值集,直到0。

代码语言:javascript
复制
for _ in range(10):
    X_train_transformed = outliers_remover.fit_transform(X_train_transformed)

Removing: 1389 outliers
Removing: 319 outliers
Removing: 528 outliers
...
Removing: 0 outliers

我想知道这是数据集的正常行为,还是我做错了什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-17 21:05:23

在每次迭代中,您都会从X_train_transformed中移除异常值,并将返回的值分配给X_train_transformed。移除异常值的标准是,某些值将始终被移除(见下文)。

至于它是否是数据集的正常行为,是!任何数字数据集都有一个平均值和std,并且很可能有(value - mean) / std大于3的值。如果删除这些值并计算一个新的平均值和std,那么现在就会有新的值,其(value - mean) / std将大于3,因为您的平均值和std将发生更改。

我建议只移除一次异常值。也许可以使用threshold来确定要删除多少。同时,考虑阅读正态分布、它们的均值和标准差是如何工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71160676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档