我总是使用 sklearn
模型来预测下一个值。
y1_test, y2_test, y3_test, y4_test = get_test_targets(df)ypred1, ypred2, ypred3, ypred4 = ml_model(df, ElasticNet())
我想使用 sklearn 来测量 y_true
和 y_predicted
的 R2 分数。
np.array([y2_test])>> array([6.75233645])np.array([ypred2[0]])array([6.75233645])
使用 r2_score(np.array([y2_test]), np.array([ypred2[0]]))
得到 nan
我不明白为什么我会得到 nan
回答:
有一个警告告诉你问题出在哪里:
import numpy as npfrom sklearn.metrics import r2_scorex = np.array([2.3])y = np.array([2.1]) # 具体数值并不重要r2_score(x, y)
结果:
UndefinedMetricWarning: R^2 score is not well-defined with less than two samples. warnings.warn(msg, UndefinedMetricWarning)nan
这应该不令人惊讶:R^2 的定义是
R^2 = 1 - (total_sum_squares)/(residual_sum_squares)
但只有一个样本时,分数的分子和分母都是0,导致 0/0
的除法,这在计算上和数学上都是 nan
。
结论:你不应该只使用一对数据来计算 R^2;应将更多的预测与真实样本对批量处理在一起,以获得有意义的 R^2 结果。