Python Numpy array (bad) автоматическое округление - PullRequest
0 голосов
/ 23 февраля 2019

Я использую проверку по методу Leave-One-Out-Cross-Validation для модели линейной регрессии.Имея 8869 наблюдений, в результате следующее:

reg = LinearRegression()

list_Rs = cross_val_score(reg, X_34_const, y_34,
                      cv = len(y_34), 
                      scoring = 'r2')

Я должен получить массив из 8869 значений, включенных между 0 и 1, с 8 десятичными знаками.Проблема в том, что при получении результата Python автоматически округляет все такие значения до 0.0:

array([0., 0., 0., ..., 0., 0., 0.])

, а вместо этого, например, если я использую перекрестную проверку 2 раза (что подразумевает, что list_Rsмассив Numpy с двумя значениями), он печатает правильно не округленные значения:

list_Rs = cross_val_score(reg, X_34_const, y_34,
                      cv = 2, 
                      scoring = 'r2')

, что при печати равно:

array([0.16496198, 0.18115719])

Это не просто печатное представление, проблема,поскольку, например:

print(list_Rs[3] == 0)

возвращает True.Для меня это большая проблема, так как в моих вычислениях мне нужно будет поместить значения list_Rs в знаменатель дроби!

Как я могу решить проблему, чтобы также не иметь автоматически округленных значенийв моем массиве размеров 8869?

Большое спасибо, и я с нетерпением жду вашего ответа.

1 Ответ

0 голосов
/ 23 февраля 2019

Ни Python, ни NumPy не делают здесь никакого округления: функция скоринга scikit-learn r2_score (которая вызывается под капотом при вызове cross_val_score с scoring='r2') не возвращает действительные нули.

Это связано с тем, что при использовании метода "оставь один" каждый набор проверки состоит из одного образца.Так что теперь для каждого раза вашей перекрестной проверки вызывается r2_score с одним наблюдаемым значением вместе с одним прогнозируемым значением для этого наблюдения.И в этой ситуации он производит ноль.Например:

>>> from sklearn.metrics import r2_score
>>> import numpy as np
>>> y_true = np.array([2.3])
>>> y_pred = np.array([2.1])
>>> r2_score(y_true, y_pred)
0.0

Здесь часть реализации, где r2_score заканчивается (несколько произвольно) возвращением нуля при оценке в одной точке данных, предполагая, что прогнозируемое значение нене является точным соответствием для наблюдаемого значения.

Возможно, r2_score должен либо вызывать исключение, либо создавать отрицательную бесконечность, а не ноль: коэффициент детерминации использует дисперсию наблюдаемых данных в качестве нормализациифактор, и когда есть только одно наблюдение, эта дисперсия равна нулю, поэтому формула для оценки R2 включает деление на ноль.Об этом говорится в отчете об ошибке scikit-learn .

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