如何使用Python删除异常值

时间:2019-12-23 13:11:10

标签: machine-learning data-analysis eda

我正在处理二进制分类问题,我在努力消除异常值并提高准确性。

评分是我的特色之一:

enter image description here

0        0.027465
1        0.027465
2        0.027465
3        0.027465
4        0.027465
           ...   
26043    0.027465
26044    0.027465
26045    0.102234
26046    0.027465
26047    0.027465

数据的平均值:

train.ratings.mean()
0.03871552285960927 

数据标准:

train.ratings.std()
0.07585168664836195

我尝试了对数转换,但准确性并未提高:

train['ratings']=np.log(train.ratings+1)

我的目标是对数据的正确或错误进行分类:

train.netgain
0        False
1        False
2        False
3        False
4         True
         ...  
26043     True
26044    False
26045     True
26046    False
26047    Fals 

2 个答案:

答案 0 :(得分:1)

我使用的一种方法是计算MAD,然后用bool类型标记所有异常值,这样我就可以获得所有异常值。

MAD计算示例:

def mad(x): return np.median(np.abs(x - np.median(x)))

def mad_ratio(x): mad_value = mad(x) if mad_value == 0: return 0 x_mad = np.abs(x - np.median(x)) / mad_value return x_mad

答案 1 :(得分:0)

  • 假设评级功能呈正态分布并将其转换为标准正态分布

  • 根据正态分布,我们知道99.7%的值覆盖了3个标准差。因此我们可以去除均值超过3个标准偏差的值。

This guide。**

有关Python代码,请参见下文。

ratings_mean=train['ratings'].mean()  #Finding the mean of ratings column

ratings_std=train['ratings'].std()     # standard deviation of the column

train['ratings']=train['ratings'].map(lamdba x: (x - ratings_mean)/ ratings_std

好吧,现在我们已经将数据转换为标准正态分布。现在,如果看到的话,它的均值应为0,标准差应为1。由此,我们可以找出大于3且小于-3的值。这样我们就可以从数据集中删除这些行。

train=train[np.abs(train_ratings) < 3]

现在 train 数据框将从数据集中删除异常值。

**注意:您也可以应用2个标准差,因为2-std包含95%的数据。这一切都取决于领域知识和您的数据。 **