1

我正在做一个二元分类问题,我正在努力消除异常值并提高准确性。

评分是我的功能之一,如下所示:

在此处输入图像描述

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 
4

2 回答 2

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

于 2019-12-23T13:19:14.197 回答
0
  • 假设评分特征为正态分布,并将其转换为标准正态分布

  • 根据正态分布,我们知道 99.7% 的值被 3 个标准差覆盖。因此我们可以删除与平均值相差 3 个标准差以上的值。

在此处输入图像描述.**

请参阅下面的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]

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

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

于 2019-12-23T20:10:07.227 回答