我不确定我是否遗漏了一些非常基本的东西,但我已经开始注意到 sklearn 的 r2_score() 函数返回的 R2 分数与 PyTorch 的 MSELoss() 计算出的 R2 分数之间存在一些细微的差异(在 statistics.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