移除异常值以进行线性回归 (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 值也类似。
我想从下图中删除那 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 值也类似。