Последовательно вычисляйте RMSE для каждой строки, каждый раз используя следующую строку (Панды)

#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)