我一直在尝试寻找一种方法来消除数据集中的异常值。异常值的删除方法如下:任何导致R2值降低10%的值都需要删除。当A数据集中的4.2替换为1.3(B数据集中)时,R2的值更改为> 10%,因此在C数据集中被消除了。
但是,将A中的0.7替换为0.9时,它不会将相关系数更改10%,因此不会从C数据集中删除。
随信附上图片。
在图中,-plot A的R2为1.0 -情节B的R2为0.8294(1.3是离群值,因为它会导致R2值降低> 10%) -图C的R2为1.0(从数据集中删除1.3时)
如何处理此问题。我需要使用python来解决问题。在10个数据点中,最多只能删除3个数据点,以改善相关性。
如果这个问题以前被问过,我深表歉意。非常感谢您的帮助!
答案 0 :(得分:2)
您要稳健的线性回归,而忽略异常值。这样的事情已经在sklearn module中实现了,但是由于它不在标签中,因此这里是一个简单的SciPy解决方案。
这个想法是使偏差的绝对值之和(L1损失函数)最小,而不是平方和。 (比较:中位数与平均值)。
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
x = np.linspace(0.7, 7, 10)
y = 0.8*x + 1.2
y[5] = 2.5 # outlier
l1_loss = lambda c: np.sum(np.abs(c[0]*x + c[1] - y))
c = minimize(l1_loss, (0, 0)).x
plt.plot(x, y, 'b*')
plt.plot(x, c[0]*x+c[1], 'r')
plt.show()
good = np.abs(c[0]*x + c[1] - y) < 0.1 # arbitrary threshold to separate good from bad
print('good data: x = {}, y = {}'.format(x[good], y[good]))
输出:“好的数据:x = [0.7 1.4 2.1 2.8 3.5 4.9 5.6 6.3 7. ]
,y = [1.76 2.32 2.88 3.44 4. 5.12 5.68 6.24 6.8 ]
”。
该行完全不受异常值的干扰。
您可能要用迭代方法代替good = np.abs(c[0]*x + c[1] - y) < 0.1
,在该方法中,数据点的偏差值最大,即
outlier_idx = np.argmax(np.abs(c[0]*x + c[1] - y))
确定并将其从x和y数组(np.delete
)中删除,然后重复该过程,直到相关性良好为止。