评估回归模型的量度
我们还没有讨论如何评估训练的模型是否学习到了东西。评估模型是否补训练的第一个工具是看损失曲线以确何它有合理的形状。接下来我们看一下与模型相关的量度。量度是比较预测的标签与真实标签的工具。对于回归模型,有两种常见的量度: R2 和 RMSE (root-mean-squared error). R2 测定两个变量的相关性,取值为 +1 到 0。 +1 表示相关性很好,而 0表示不相关。 数学上, 数所集X 和 Y的R2 的定义为
其中cov(X, Y) 是 X和 Y的协方差,测量两个数据集的联合方差,而e σX 和 σY 是标准差, 测量各个数据集的变异。直观上,R2 测量独立方差被联合方差解释的多少。
多种类型的R2!
注意 R2 有两种常见的定义。初学者的常见错误是混淆这两种定义。本书,我们总是合用squared Pearson correlation coefficient (图 3-35)。另一个定义是the coefficient of determination。这个 R2 更混淆因为它不像squared Pearson correlation有下限0。
在图Figure 3-35里,预测值 和真实值高度相关, R2 接近 1。看来这个系统学习得很好。很快,你会发现,两个轴的刻度不一样。事实上R2 并不惩罚刻度的不同。为了理解系统发生了什么,我们要考虑另一种量度,风图 3-36.
#List3-26
def pearson_r2_score(y, y_pred):
#"""Computes Pearson R^2 (square of Pearson correlation)."""
return pearsonr(y, y_pred)[0]**2
y_pred=model(x_np,w,b).numpy()
#y_pred.append(y_pred_.numpy())
# Clear figure
plt.clf()
plt.xlabel("Y-true")
plt.ylabel("Y-pred")
plt.title("Predicted versus True values "
r"(Pearson $R^2$: $0.994$)")
plt.scatter(y_np, y_pred)
plt.savefig("lr_pred.png")
图3-35. 绘制Pearson correlation coefficient
RMSE是预测值与真实值的差的均值的量度。在图 Figure 3-36里我们将预测值和真实值按不同的函数绘制,使用数据点x 作为我们的 x-轴。注意,学习的直线不是直实的直线!
RMSE 相对高,并疹断了误差,不像R2,没有发现这个误差。
#List3-27
def rms_score(y_true, y_pred):
#"""Computes RMS error."""
return np.sqrt(mean_squared_error(y_true, y_pred))
# Now draw with learned regression line
plt.clf()
plt.xlabel("x")
plt.ylabel("y")
plt.title("True Model versus Learned Model "
r"(RMS: $1.027620$)")
plt.xlim(0, 1)
plt.scatter(x_np, y_np)
x_left = 0
y_left = w.numpy()*x_left + b.numpy()
x_right = 1
y_right = w.numpy()*x_right + b.numpy()
plt.plot([x_left, x_right], [y_left, y_right], color='k')
plt.savefig("lr_learned.png")
图 3-36. 绘制 root-mean-squared error (RMSE).
系统出了什和以问题 ? 为什么TensorFlow没有学习到正确的函数,尽管训练是收敛的?这个例子很好的说明了梯度下降算法的弱点。无法保证找到真正的解决方案! 梯度下降算法可能陷入局部最小值local minima。即是,它找到的解决方案看起来不错,但是实际上不是损失函数ℒ的最小值。为什么还要用梯度下降?对于简单的系统,实际上避免使用梯度下降而使用别的更有保障的算法更好。但是复杂的系统,没有替代的算法比梯度下降更好。