#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 в квадрате из приведенных выше.. Я бы рекомендовал, чтобы