首页 > 解决方案 > 计算 Z 分数有什么问题?

问题描述

我正在关注有关删除异常值的本教程。我有一个火车和一个测试集:

train.shape
>>>(38959, 114)
test.shape
>>>(3988, 114)

我有:

z = np.abs(stats.zscore(train.astype(float)))
train = train[(z < 3).all(axis=1)]

z_ = np.abs(stats.zscore(test.astype(float)))
test = test[(z_ < 3).all(axis=1)]

这适用于train,但会删除测试中的每一行。无论我是否这样做test[(z_ < 3).all(axis=1)]test[(z_ > 3).all(axis=1)]它都会返回一个空的数据框。为什么会发生这种情况?两个数据帧都以相同的方式编码并且具有完全相同的列数。只有行数不同。

标签: pandasindexing

解决方案


也遇到了这个麻烦。发现如果您的数据框列具有非唯一值(例如,列满分类值 1)。如果为真,则stats.zscore将此列转换为 NaN 值。然后 np.abs 只是将其变为 True。

原因是你必须在 "np.abs()" 之前填写

我找到了以下解决方案:

z_scores = pd.DataFrame(stats.zscore(df))
z_scores.fillna(0, inplace=True)
z_scores = np.abs(z_scores < 3).all(axis=1)
filtered_df = df[z_scores]

为了更好地表示数据,我们可以仅针对收入、薪水等连续值去除异常值。ETC


推荐阅读