#python #pandas #dataframe
Вопрос:
У меня есть фрейм данных значений y_true и y_предикированных значений.
Мне нужно было бы последовательно вычислять RMSE для каждой строки, каждый раз используя следующую строку. Можно было бы описать это примерно так row 1
. После этого сохраните результат в новом столбце RMSE
.
Вот фрейм данных. Код возьмет первую строку y_true = 105, y_pred = 195
и вычислит RMSE (я использую from sklearn.metrics import mean_squared_error
), который будет равен 90,0, и поместит его в новый столбец.
После этого мы берем первую строку и следующую, которая будет y_true = [105, 297], y_pred = [195,337]
, и снова вычисляем ошибку, результат будет 69,6. И сделайте это для всего фрейма данных. В следующий раз y_true = [105, 297, 262], y_pred = [195,337, 804]
и так далее. Я предполагаю, что это можно было бы сделать с помощью цикла.
ID y_true y_pred 0 1 105 195 1 2 297 337 2 3 262 804 3 4 206 708 4 5 226 705 5 6 309 463 6 7 210 676 7 8 124 573
Результат должен быть:
ID y_true y_pred RMSE 0 1 105 195 90.00 1 2 297 337 69.60 2 3 262 804 318.04 3 4 206 708 372.64 4 5 226 705 396.20 5 6 309 463 367.11 6 7 210 676 382.00 7 8 124 573 391.00
В настоящее время код вычисляет RMSE
import pandas as pd from sklearn.metrics import mean_squared_error import numpy as np dataframe = pd.read_excel(r'S:...df.xlsx') y_true = dataframe['y_true'] y_pred = dataframe['y_pred'] rmse = mean_squared_error(y_true, y_pred, squared=False) print(rmse)
Но вопрос в том, как рассчитать его для строк, каждый раз беря следующую?
Ответ №1:
Если ваш фрейм данных не слишком велик, вы можете использовать понимание списка:
import pandas as pd from sklearn.metrics import mean_squared_error import numpy as np df = pd.DataFrame({'y_true':[105,297,262,206], 'y_pred':[195,337,804,708]}) df['RMSE'] = [mean_squared_error(df.y_true[:(i 1)], df.y_pred[:(i 1)], squared=False) for i in range(df.shape[0])] y_true y_pred RMSE 0 105 195 90.000000 1 297 337 69.641941 2 262 804 318.048214 3 206 708 372.648628
Или, основываясь на том, как рассчитывается RMSE, вам нужен квадратный корень из инкрементного среднего значения квадратной ошибки, поэтому это дает квадратную ошибку:
(df.y_true - df.y_pred)**2)
Это дает постепенное среднее из вышеперечисленного:
(df.y_true - df.y_pred)**2).expanding().mean()
Это добавляет квадратный корень, который, как вы можете видеть, такой же, как и выше:
df['RMSE'] = np.sqrt(((df.y_true - df.y_pred)**2).expanding().mean()) y_true y_pred RMSE 0 105 195 90.000000 1 297 337 69.641941 2 262 804 318.048214 3 206 708 372.648628
Комментарии:
1. Отлично, это работает гладко! И как я мог бы сделать то же самое с RMSE%, рассчитанным как rmse% = (df[‘RMSE’]/ (np.mean(df[‘y_true’])))*100 ? Я попробовал так df[‘RMSE%’] = [((df.RMSE [: (i 1)] / (np.mean(df.y_true[:(i 1)])))*100) для i в диапазоне(df.форма[0])] но что-то теперь работает
2.
df['RMSE'] / df['y_true'].expanding().mean()
если я правильно вас понял3. Это отлично работает! Большое спасибо!
Ответ №2:
Другой способ:
import pandas as pd from sklearn.metrics import mean_squared_error df = pd.read_excel('test.xls') df["RMSE"] = df.apply(lambda x: mean_squared_error(df.loc[:x.name, 'y_true'].tolist(), df.loc[:x.name, 'y_pred'].tolist(), squared=False), axis = 1) print(df)