去除异常值后具有新异常值的数据集

Dataset with new outliers after removing the outliers

我是机器学习的新手,我正在尝试使用“rain austrialia”数据集训练模型。目前我正处于预处理步骤,在使用 KNNImputer 填充所有 NaN 值后,我尝试使用以下自定义转换器 class.

删除异常值
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.

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

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

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

至于这是否是数据集的正常行为,是的!。任何数值数据集都有均值和标准差,并且很可能具有 (value - mean) / std 大于 3 的值。如果您删除这些值并计算新的均值和标准差,您现在将拥有新的值(value - mean) / std 将大于 3,因为您的均值和标准差将发生变化。

我建议只删除异常值一次。也许使用 threshold 来确定要删除的数量。另外,请考虑阅读正态分布、均值和标准差的工作原理。