Rsquared в Sklearn Python ПРОТИВ MLmetrics R

#python #r #scikit-learn #regression

#python #r #scikit-учиться #регрессия

Вопрос:

Я обучил некоторые регрессионные модели (лассо, случайный лес и SVR). Я попытался оценить свои результаты как на Python, так и на R. В python Sklearn показывает математическую формулу Rsquared, которая использует, тогда как пакет MLmetrics в R не показывает используемую формулу. Вы знаете, где я могу найти эту информацию? Результаты отличаются между двумя языками, и я хотел бы понять, почему. Я провожу непрерывное обучение для своих временных рядов на python, а затем оцениваю свои результаты, используя как python, так и R. Вот различия для Rsquared на один месяц до прогнозов на 4 месяца вперед — для python: 0,136, 0,021, -0,164, -0,173 — для R: 0,570, 0,536, 0,457, 0,450. Моя интуиция заключается в том, что математическая формула для R дает значения только от 0 до 1. Заранее благодарю вас.

Комментарии:

1. Я не думаю, что это формула для вычисления Rsq. Это довольно просто. смотрите en.wikipedia.org/wiki/Coefficient_of_determination . Подгонка будет отличаться для python, R и даже для разных пакетов на одном языке

2. Можете ли вы предоставить результаты обоих? Хотелось бы знать разницу…

3. @StupidWolf Я предполагаю, что должна быть математическая формула, и именно поэтому разные пакеты / языки дают разные результаты. В противном случае, как вы можете объяснить различия? Rsquared — это формула, и, как и все fomulas, она должна давать те же результаты. Я предполагаю, что Sklean и MLmetrics могут иметь небольшие различия в формулах, которые они используют.

4. @Ragnar Я добавил результаты. Спасибо 🙂

5. @StupidWolf спасибо за отзыв! 🙂

Ответ №1:

Чтобы долго вводить в качестве комментария, оба вычисления верны,

из mlmetrics:

 R2_Score <- function(y_pred, y_true) {
  R2_Score <- 1 - sum((y_true - y_pred)^2) / sum((y_true - mean(y_true))^2)
  return(R2_Score)
}

y_true = c(3, -0.5, 2, 7)
y_pred = c(2.5, 0.0, 2, 8)

R2_Score(y_pred,y_true)
[1] 0.94860816
  

от sklearn

 numerator = (weight * (y_true - y_pred) ** 2).sum(axis=0,
                                                      dtype=np.float64)
denominator = (weight * (y_true - np.average(
        y_true, axis=0, weights=sample_weight)) ** 2).sum(axis=0,
                                                          dtype=np.float64)
nonzero_denominator = denominator != 0
nonzero_numerator = numerator != 0
valid_score = nonzero_denominator amp; nonzero_numerator
output_scores = np.ones([y_true.shape[2]])
output_scores[valid_score] = 1 - (numerator[valid_score] /
                                      denominator[valid_score])
  

Если мы запустим его:

 from sklearn.metrics import r2_score
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
r2_score(y_true, y_pred)

0.9486081370449679
  

Комментарии:

1. вы абсолютно правы. Спасибо. Теперь я подтвердил свой код. Я использовал каретку R2, и это дает разные результаты. Я восстановил этот код, который я написал давно, поэтому прошу прощения за путаницу. Итак, проблема в том, что каретка rsquared. Я вижу, что здесь есть кто-то еще, у кого такая же проблема stats.stackexchange.com/questions/230913 /. … Итак, что производит каретка r в квадрате, я не уверен, что понимаю.

2. Еще одна информация: kite.com/python/answers/… . Код python, используемый в этой ссылке, который ограничивает Rsquared между 0 и 1, дает точно такие же результаты, что и каретка rsquared в R.

3. caret использует квадрат корреляции, потому что rsquared будет квадратом коэффициента корреляции Пирсона. Однако, когда с вашей моделью что-то не так, это не выполняется. Используйте R в квадрате из приведенных выше.. Я бы рекомендовал, чтобы