我不确定我是否遗漏了一些非常基本的东西,但我开始注意到 sklearn 的 r2_score() 函数返回的 R2 分数和从 PyTorch 的 MSELoss() 计算的 R2 分数之间存在一些细微的差异(在 stats.variance( 的额外帮助下) )).
基本上,sklearn 方法返回的 R2 分数始终(稍微)低于通过 MSELoss() 返回的分数。
这是一些重现差异的基本代码。
from sklearn.metrics import r2_score
from torch.nn import MSELoss
import statistics
import random
import torch
import numpy as np
actuals = random.sample(range(1, 50), 40)
preds = []
for value in actuals:
pred = value * 0.70
preds.append(pred)
loss = MSELoss()
mse = loss(torch.tensor(preds), torch.tensor(actuals))
r2 = 1 - mse / statistics.variance(actuals)
score = r2_score(actuals, preds)
print(f'R2 Score using (PyTorch) MSELoss: {r2}')
print(f'R2 Score using (sklearn) r2_score: {score}')
输出示例:
R2 Score using (PyTorch) MSELoss: 0.6261289715766907 R2 Score using (sklearn) r2_score: 0.6165425269729996
我认为这可能与 MSELoss() 将张量作为输入有关(但 sklearn 不这样做),但我真的不知道为什么或如何。
如果有人可以帮助/澄清,那就太好了。
谢谢!
版本:
这是由于贝塞尔修正。您可以使用
pvariance
代替 variance
获得相同的结果。
from sklearn.metrics import r2_score
from torch.nn import MSELoss
import statistics
import random
import torch
import numpy as np
actuals = random.sample(range(1, 50), 40)
preds = []
for value in actuals:
pred = value * 0.70
preds.append(pred)
loss = MSELoss()
mse = loss(torch.tensor(preds), torch.tensor(actuals))
r2_sample = 1 - mse / statistics.variance(actuals)
r2_population = 1 - mse / statistics.pvariance(actuals)
score = r2_score(actuals, preds)
print(f'R2 Score using (PyTorch) MSELoss (sample): {r2_sample}')
print(f'R2 Score using (PyTorch) MSELoss (population): {r2_population}')
print(f'R2 Score using (sklearn) r2_score: {score}')
> R2 Score using (PyTorch) MSELoss (sample): 0.6582530736923218
> R2 Score using (PyTorch) MSELoss (population): 0.6494903564453125
> R2 Score using (sklearn) r2_score: 0.6494903644913157