sklearn 的 r2_score() 和 PyTorch 的 MSELoss() 之间的差异?

问题描述 投票:0回答:1

我不确定我是否遗漏了一些非常基本的东西,但我开始注意到 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 不这样做),但我真的不知道为什么或如何。

如果有人可以帮助/澄清,那就太好了。

谢谢!

版本:

  • PyTorch == 2.1.0
  • scikit-learn == 1.4.2
  • Python == 3.9.18
scikit-learn pytorch
1个回答
0
投票

这是由于贝塞尔修正。您可以使用

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
© www.soinside.com 2019 - 2024. All rights reserved.