Продолжайте устранять точки данных, пока не будет получен хороший коэффициент корреляции - PullRequest
0 голосов
/ 17 сентября 2018

Я пытался найти способ устранить выбросы из набора данных.Выбросы удаляются следующим образом: любое значение, которое приводит к снижению значения R2 на 10%, необходимо удалить.Когда 4.2 в наборе данных A было заменено на 1.3 (в наборе данных B), оно изменило R2> 10% и, таким образом, было исключено в наборе данных C.

Однако, когда 0.7 в A было заменено на0,9, он не изменит коэффициент корреляции на 10% и, следовательно, не будет удален из набора данных C.

Изображение прилагается.

Eliminating outliers inorder to improve the correlation

На снимке: -площадка A имеет значение R2, равное 1,0, -площадка B имеет значение R2, равное 0,8294 (1,3 является выбросом, так как это вызывает снижение значений R2 на> 10%), -площадка C имеет значение R2, равное 1,0 (при удалении 1,3из набора данных)

Как мне решить эту проблему.Мне нужно использовать Python, чтобы добраться до решения.Для улучшения корреляции из 10 точек данных можно удалить не более 3 точек данных.

Я прошу прощения, если этот вопрос был задан ранее.Огромное спасибо за помощь!

1 Ответ

0 голосов
/ 18 сентября 2018

Вы хотите устойчивая линейная регрессия , игнорируя выбросы.Такая вещь уже реализована в модуле sklearn , но поскольку ее нет в тегах, вот простое решение 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 ]".

regression

Линия вообще не возмущена выбросом.

Возможно, вы захотите заменить 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), затем процесс повторяется до тех пор, пока корреляция не станет хорошей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...