我正在处理二进制分类问题,我在努力消除异常值并提高准确性。
评分是我的特色之一:
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
答案 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%的数据。这一切都取决于领域知识和您的数据。 **