移除异常值以进行线性回归 (Python)

Removing outliers for linear regression (Python)

我想从下图中删除那 9 个橙色离群点,为此我需要计算每个橙色点的准确度分数并选择最低的 9 个。我怎样才能做到这一点?我知道可以计算整个预测准确度的函数,但是有什么方法可以对每个点进行计算吗?

我试过这样做,但是我从这里得到的 x 和 y 值与图表上的异常值不匹配。 (我正在使用 sklearn 线性回归)

score_array = []
for i in range(len(x_train)):
    #reshaping to fit the predict() function
    x = np.array(x_train[i]).reshape(1, -1)
    pred = clf.predict(x)
    # calculating square difference of y_expected and y_predicted
    score = y_train[i]**2 - pred**2
    score_array.append(score) # array containing score for each dot
# larger the difference between squares, higher chance of being an outlier
# sorting array in descending order
score_array = sorted(score_array, key = float, reverse = True)
# first 9 members will have largest difference of squares
# outlier_score array contains score of 9 dots we want to remove
outlier_score = score_array[0:9]
outlier_array_x = []; outlier_array_y = []
# we traverse again to see which x and y result in highest scores
for i in range(len(x_train)):
    x = np.array(x_train[i]).reshape(1, -1)
    pred = clf.predict(x)
    score = y_train[i]**2 - pred**2
    # if the score for current index i is in outlier_score, we get x and y values
    if score in outlier_score:
        outlier_array_x.append(x_train[i])
        outlier_array_y.append(y_train[i])

编辑:感谢下面的人,我解决了这个问题,但现在我无法真正删除这些点。旧数组的长度均为 90,新长度如预期的那样为 81,但在绘制图形时,这 9 个异常值保持不变。

从数组中删除特定值的最佳方法是什么? 我尝试这样做,但随后 x 和 y 值被打乱,导致一个完全不同的图表

编辑 2:

我用这个循环来删除元素:

j = 0
for i in index_array:
    i = i - j
    del x_train[i]
    del y_train[i]
    j += 1

y_train[i]**2 - pred**2不是实际和预期的差距。 (y_train 总是大于 pred 吗?为什么对于您指出的异常值,此距离度量可能是 最低?)

尝试(y_train[i] - pred)**2获取实际距离。

准确性告诉您有多少数据点被正确分类。 这对于单个数据点或回归没有意义。 您可以采用其他函数,例如均方误差或任何其他 "distance" 从预测到实际值。

您的 score 价值正在做这样的事情。 因此,您需要找到具有最大 score 的点。 你有一个你排序的 score_array ,你可以直接使用它。 然后您不需要重新计算预测并在数组中查找浮点值。

注意,使用 L = [0.9, 0.1, 0.3, 0.4] 可以在索引中使用 enumerate(L) 配对,在 L 中使用 score/value:

>>> sorted(enumerate(L), key = lambda (i,v) : v, reverse = True)
[(0, 0.9), (3, 0.4), (2, 0.3), (1, 0.1)]

那你可以跳过前n个。例如

>>> sorted(enumerate(L), key = lambda (i,v) : v, reverse = True)[2:]
[(2, 0.3), (1, 0.1)]

所以,而不是

score_array = sorted(score_array, key = float, reverse = True)

尝试

score_array = sorted(enumerate(score_array), key = lambda (i,v) : v, reverse = True)

然后您可以删除其中的前几个,因为它包含 x 和 y 值的索引。 你甚至可以在一定距离以外的地方抛弃任何东西。


编辑:

我们观察到您需要使用误差的平方,而不是平方的误差,如其他答案所示。

然后要获得新的训练集,使用来自 score_array 的索引,现在是 (index, value) 的元组,像这样

 x_train = [x_train[x[0]] for x in score_array]

对应的 y 值也类似。