去除异常值后具有新异常值的数据集
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
来确定要删除的数量。另外,请考虑阅读正态分布、均值和标准差的工作原理。
我是机器学习的新手,我正在尝试使用“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
来确定要删除的数量。另外,请考虑阅读正态分布、均值和标准差的工作原理。