Как исправить 'Ввод содержит NaN, бесконечность или слишком большое значение для dtype (' float64 ').' при расчете MSLE - PullRequest
0 голосов
/ 27 апреля 2019

При попытке вычислить среднеквадратичную ошибку журнала я получаю следующую ошибку:

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

Расчет среднеквадратичной ошибки не дает ошибки.Для воспроизведения проблемы можно использовать следующий код:

from sklearn.datasets import load_boston
dataset = load_boston()

import pandas as pd
df = pd.DataFrame(dataset.data, columns=dataset.feature_names, )

df["MEDV"] = dataset.target

#tried this, no difference
df = df.reset_index()

df.isnull().sum()
#No missing values

df.dtypes
# all float64

cols = ["LSTAT", "RM"]
X = df[cols]#.astype(np.float)
y = df["MEDV"]#.astype(np.float)

from sklearn.linear_model import LinearRegression
slr = LinearRegression()
slr.fit(X, y)
y_pred = slr.predict(X)

np.all(np.isfinite(X))
# true
np.all(np.isfinite(y))
#true

np.all(np.isfinite(y_pred))
#true

from sklearn.metrics import mean_squared_error
mse = mean_squared_error(y, y_pred)
print(mse)

from sklearn.metrics import mean_squared_log_error
# THIS produces the error message:
msle = mean_squared_log_error(y, y_pred)
print(msle)

Я сделал несколько проверок:

  1. без пропущенных значений
  2. без бесконечных значений
  3. Типы данных: float64

Я не понимаю, почему это дает мне ошибку.Кто-нибудь знает, что я делаю не так?

С уважением,

Jaap

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Как mean_squared_log_error (y, y_pred) работает?

  1. Он принимает журнал y и y_pred отдельно.
  2. Возьмите разницу, то есть log (y) - log (y_pred).
  3. Квадратная разница
  4. Среднее значение разницы будет средним значением.

т.е. средний ((журнал (у) -log (y_pred)) ** 2)

Так что, если вы предполагаете, что он возьмет квадрат значения разности, а затем применит лог, тогда предположение неверно и, следовательно, оно не будет работать для отрицательного значения.

Примечание: я не получаю точно такую ​​же ошибку и получаю "" Среднеквадратичную логарифмическую ошибку нельзя использовать, когда "" цели содержат отрицательные значения. "")

0 голосов
/ 27 апреля 2019

Продолжительность:

y_pred[y_pred<0]

вы получите:

array([-4.66638608, -2.08933711])

И вы знаете, это проблема натурального логарифма.

...