【问题标题】:What is wrong with calculating the Z-score?计算 Z 分数有什么问题?
【发布时间】:2020-06-02 14:50:06
【问题描述】:

我正在关注 this tutorial 删除异常值。我有一个火车和一个测试集:

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_ &lt; 3).all(axis=1)] 还是 test[(z_ &gt; 3).all(axis=1)],它总是会返回一个空数据框。为什么会发生这种情况?两个数据帧都以相同的方式编码并且具有完全相同的列数。只是行数不同。

【问题讨论】:

  • z_ 不知何故得到了所有nantest 中可能包含 nan,所以当你进行 zscore 时,你会得到 nan。那么z_ &gt; 3z_ &lt; 3 都是False。这是我的猜测。
  • 这不是 nan,如果我打印 z_ 它实际上包含一堆小于 3 的数字。而且我的集合中也没有 nan,因为我估算它们。
  • 那么你需要提供一个重现问题的样本数据集,以便我查看。

标签: pandas indexing


【解决方案1】:

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

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

我找到了以下解决方案:

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]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-31
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多