我是机器学习方面的新手,我试着用“下雨奥地利”数据集来训练一个模型。目前,我正处于预处理阶段,在使用KNNImputer填充所有NaN值之后,我尝试使用以下自定义转换器类删除异常值。
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我想知道这是数据集的正常行为,还是我做错了什么。
发布于 2022-02-17 21:05:23
在每次迭代中,您都会从X_train_transformed中移除异常值,并将返回的值分配给X_train_transformed。移除异常值的标准是,某些值将始终被移除(见下文)。
至于它是否是数据集的正常行为,是!任何数字数据集都有一个平均值和std,并且很可能有(value - mean) / std大于3的值。如果删除这些值并计算一个新的平均值和std,那么现在就会有新的值,其(value - mean) / std将大于3,因为您的平均值和std将发生更改。
我建议只移除一次异常值。也许可以使用threshold来确定要删除多少。同时,考虑阅读正态分布、它们的均值和标准差是如何工作的。
https://stackoverflow.com/questions/71160676
复制相似问题