UCB Data100:数据科学的原理和技巧:第十一章到第十二章(2)https://developer.aliyun.com/article/1427175
让我们花点时间解释一下这个结果。 θ ^ = y ˉ \hat{\theta} = \bar{y}θ^=yˉ 是常数模型 + MSE 的最佳参数。无论你有什么样的数据样本,它都是成立的,并且它提供了一些正式的推理,解释了为什么均值是如此常见的摘要统计量。
我们的最佳模型参数是使成本函数最小化的参数值。成本函数的最小值可以表示为:
R ( θ ^ ) = min θ R ( θ ) R(\hat{\theta}) = \min_{\theta} R(\theta)R(θ^)=θminR(θ)
用简单的英语重新陈述上面的内容:当成本函数以最佳参数作为输入时,我们正在查看成本函数的值。这个最佳模型参数 θ ^ \hat{\theta}θ^ 是使成本 R RR 最小化的 θ \thetaθ 的值。
对于建模目的,我们更关心成本的最小值 R ( θ ^ ) R(\hat{\theta})R(θ^),而不是导致这种最低平均损失的 * θ \thetaθ 的值。换句话说,我们关心找到最佳参数值,使得:
θ ^ = arg min θ R ( θ ) \hat{\theta} = \underset{\theta}{\operatorname{\arg\min}}\:R(\theta)θ^=θargminR(θ)
也就是说,我们想要找到使成本函数最小化的参数 θ \thetaθ。
11.2.2 比较两个不同的模型,都使用 MSE 进行拟合
现在我们已经探讨了带有 L2 损失的常数模型,我们可以将其与上一讲学到的 SLR 模型进行比较。考虑下面的数据集,其中包含嘴海牛的年龄和长度信息。假设我们想要预测嘴海牛的年龄:
常数模型 | 简单线性回归 | |
模型 | y ^ = θ 0 \hat{y} = \theta_0y^=θ0 | y ^ = θ 0 + θ 1 x \hat{y} = \theta_0 + \theta1 xy^=θ0+θ1x |
数据 | 年龄样本 D = { y 1 , y 2 , . . . , y m } D = \{y_1, y_2, ..., y_m\}D={y1,y2,...,ym} | 年龄样本 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } D = \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\}D={(x1,y1),(x2,y2),...,(xn,yn)} |
维度 | θ 0 ^ \hat{\theta_0}θ0^ 是 1-D | θ ^ = [ θ 0 ^ , θ 1 ^ ] \hat{\theta} = [\hat{\theta_0}, \hat{\theta_1}]θ^=[θ0^,θ1^] 是 2-D |
损失曲面 | 2-D | 3-D |
损失模型 | R ^ ( θ ) = 1 n ∑ i = 1 n ( y i − θ 0 ) 2 \hat{R}(\theta) = \frac{1}{n}\sum^{n}_{i=1} (y_i - \theta_0)^2R^(θ)=n1∑i=1n(yi−θ0)2 | R ^ ( θ ) = 1 n ∑ i = 1 n ( y i − ( θ 0 + θ 1 x ) ) 2 \hat{R}(\theta) = \frac{1}{n}\sum^{n}_{i=1} (y_i - (\theta_0 + \theta_1 x))^2R^(θ)=n1∑i=1n(yi−(θ0+θ1x))2 |
RMSE | 7.72 | 4.31 |
可视化预测 | 地毯图 | 散点图 |
(注意我们的 SLR 散点图的点在视觉上并不是一个很好的线性拟合。我们会回到这个问题)。
生成图形和模型的代码如下,但我们不会深入讨论。
代码
dugongs = pd.read_csv("data/dugongs.csv") data_constant = dugongs["Age"] data_linear = dugongs[["Length", "Age"]]
# Constant Model + MSE plt.style.use('default') # Revert style to default mpl adjust_fontsize(size=16) %matplotlib inline def mse_constant(theta, data): return np.mean(np.array([(y_obs - theta) ** 2 for y_obs in data]), axis=0) thetas = np.linspace(-20, 42, 1000) l2_loss_thetas = mse_constant(thetas, data_constant) # Plotting the loss surface plt.plot(thetas, l2_loss_thetas) plt.xlabel(r'$\theta_0/details>) plt.ylabel(r'MSE') # Optimal point thetahat = np.mean(data_constant) plt.scatter([thetahat], [mse_constant(thetahat, data_constant)], s=50, label = r"$\hat{\theta}_0$") plt.legend(); # plt.show()
代码
# SLR + MSE def mse_linear(theta_0, theta_1, data_linear): data_x, data_y = data_linear.iloc[:,0], data_linear.iloc[:,1] return np.mean(np.array([(y - (theta_0+theta_1*x)) ** 2 for x, y in zip(data_x, data_y)]), axis=0) # plotting the loss surface theta_0_values = np.linspace(-80, 20, 80) theta_1_values = np.linspace(-10, 30, 80) mse_values = np.array([[mse_linear(x,y,data_linear) for x in theta_0_values] for y in theta_1_values]) # Optimal point data_x, data_y = data_linear.iloc[:, 0], data_linear.iloc[:, 1] theta_1_hat = np.corrcoef(data_x, data_y)[0, 1] * np.std(data_y) / np.std(data_x) theta_0_hat = np.mean(data_y) - theta_1_hat * np.mean(data_x) # Create the 3D plot fig = plt.figure(figsize=(7, 5)) ax = fig.add_subplot(111, projection='3d') X, Y = np.meshgrid(theta_0_values, theta_1_values) surf = ax.plot_surface(X, Y, mse_values, cmap='viridis', alpha=0.6) # Use alpha to make it slightly transparent # Scatter point using matplotlib sc = ax.scatter([theta_0_hat], [theta_1_hat], [mse_linear(theta_0_hat, theta_1_hat, data_linear)], marker='o', color='red', s=100, label='theta hat') # Create a colorbar cbar = fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10) cbar.set_label('Cost Value') ax.set_title('MSE for different $\\theta_0, \\theta_1/details>) ax.set_xlabel('$\\theta_0/details>) ax.set_ylabel('$\\theta_1/details>) ax.set_zlabel('MSE') # plt.show()
Text(0.5, 0, 'MSE')
代码
# Predictions yobs = data_linear["Age"] # The true observations y xs = data_linear["Length"] # Needed for linear predictions n = len(yobs) # Predictions yhats_constant = [thetahat for i in range(n)] # Not used, but food for thought yhats_linear = [theta_0_hat + theta_1_hat * x for x in xs]
# Constant Model Rug Plot # In case we're in a weird style state sns.set_theme() adjust_fontsize(size=16) %matplotlib inline fig = plt.figure(figsize=(8, 1.5)) sns.rugplot(yobs, height=0.25, lw=2) ; plt.axvline(thetahat, color='red', lw=4, label=r"$\hat{\theta}_0$"); plt.legend() plt.yticks([]); # plt.show()
代码
# SLR model scatter plot # In case we're in a weird style state sns.set_theme() adjust_fontsize(size=16) %matplotlib inline sns.scatterplot(x=xs, y=yobs) plt.plot(xs, yhats_linear, color='red', lw=4); # plt.savefig('dugong_line.png', bbox_inches = 'tight'); # plt.show()
解释 RMSE(均方根误差):* 常数误差高于线性误差。
因此,* 常数模型比线性模型更差(至少对于这个度量)。
11.3 常数模型 + MAE
我们现在看到,改变用于预测的模型会导致最佳模型参数的结果大不相同。如果我们改变模型评估中使用的损失函数会发生什么?
这一次,我们将考虑具有 L1(绝对损失)作为损失函数的常数模型。这意味着平均损失将被表示为平均绝对误差(MAE)。
- 选择模型:常数模型
- 选择损失函数:L1 损失
- 拟合模型
- 评估模型性能
11.3.1 求解最优 θ 0 \theta_0θ0
回想一下,MAE 是数据 D = { y 1 , y 2 , . . . , y m } D = \{y_1, y_2, ..., y_m\}D={y1,y2,...,ym} 上的平均绝对损失(L1 损失)。
R ^ ( θ ) = 1 n ∑ i = 1 n ∣ y i − y i ^ ∣ \hat{R}(\theta) = \frac{1}{n}\sum^{n}_{i=1} |y_i - \hat{y_i}|R^(θ)=n1i=1∑n∣yi−yi^∣
给定常数模型 y ^ = θ 0 \hat{y} = \theta_0y^=θ0,我们可以将 MAE 写成:
R ^ ( θ ) = 1 n ∑ i = 1 n ∣ y i − θ 0 ∣ \hat{R}(\theta) = \frac{1}{n}\sum^{n}_{i=1} |y_i - \theta_0|R^(θ)=n1i=1∑n∣yi−θ0∣
为了拟合模型,我们通过微积分方法找到最优参数值 θ ^ \hat{\theta}θ^:
- 对 θ 0 ^ \hat{\theta_0}θ0^ 求导数。
R ^ ( θ ) = 1 n ∑ i = 1 n ∣ y i − θ ∣ \hat{R}(\theta) = \frac{1}{n}\sum^{n}_{i=1} |y_i - \theta|R^(θ)=n1i=1∑n∣yi−θ∣
d d θ R ( θ ) = d d θ ( 1 n ∑ i = 1 n ∣ y i − θ ∣ ) \frac{d}{d\theta} R(\theta) = \frac{d}{d\theta} \left(\frac{1}{n} \sum^{n}_{i=1} |y_i - \theta| \right)dθdR(θ)=dθd(n1i=1∑n∣yi−θ∣)
= 1 n ∑ i = 1 n d d θ ∣ y i − θ ∣ = \frac{1}{n} \sum^{n}_{i=1} \frac{d}{d\theta} |y_i - \theta|=n1i=1∑ndθd∣yi−θ∣
- 这里,我们似乎遇到了一个问题:当参数为 0 时(即 y i = θ y_i = \thetayi=θ)绝对值的导数是未定义的。现在,我们将忽略这个问题。事实证明,忽略这种情况不会影响我们的最终结果。
- 进行导数运算时,考虑两种情况。当 θ \thetaθ小于或等于y i y_iyi 时,项 y i − θ y_i - \thetayi−θ 将为正值,绝对值不会产生影响。当 θ \thetaθ大于y i y_iyi 时,项 y i − θ y_i - \thetayi−θ 将为负值。应用绝对值将其转换为正值,我们可以表示为 − ( y i − θ ) = θ − y i -(y_i - \theta) = \theta - y_i−(yi−θ)=θ−yi。
∣ y i − θ ∣ = { y i − θ 如果 θ ≤ y i θ − y i 如果 θ > y i |y_i - \theta| = {yi−θ 如果 θ≤yiθ−yi如果 θ>yi
\begin{cases} y_i - \theta \quad \text{ 如果 } \theta \le y_i \\ \theta - y_i \quad \text{如果 }\theta > y_i \end{cases} ∣ y i − θ ∣ = { y i − θ 如果 θ ≤ y i θ − y i 如果 θ > y i
- 求导:
d d θ ∣ y i − θ ∣ = { d d θ ( y i − θ ) = − 1 如果 θ < y i d d θ ( θ − y i ) = 1 如果 θ > y i \frac{d}{d\theta} |y_i - \theta| = {ddθ(yi−θ)=−1如果 θ<yiddθ(θ−yi)=1如果 θ>yi
\begin{cases} \frac{d}{d\theta} (y_i - \theta) = -1 \quad \text{如果 }\theta < y_i \\ \frac{d}{d\theta} (\theta - y_i) = 1 \quad \text{如果 }\theta > y_i \end{cases} d θ d ∣ y i − θ ∣ = { dθ d ( y i − θ ) = − 1 如果 θ < y i dθ d ( θ − y i ) = 1 如果 θ > y i
- 这意味着我们对于 θ < y i \theta < y_iθ<yi 和 θ > y i \theta > y_iθ>yi 的数据点得到了不同的导数值。我们可以总结为:
d d θ R ( θ ) = 1 n ∑ i = 1 n d d θ ∣ y i − θ ∣ = 1 n [ ∑ θ 0 ^ < y i ( − 1 ) + ∑ θ 0 ^ > y i ( + 1 ) ] \frac{d}{d\theta} R(\theta) = \frac{1}{n} \sum^{n}_{i=1} \frac{d}{d\theta} |y_i - \theta| \\ = \frac{1}{n} \left[\sum_{\hat{\theta_0} < y_i} (-1) + \sum_{\hat{\theta_0} > y_i} (+1) \right]dθdR(θ)=n1i=1∑ndθd∣yi−θ∣=n1θ0^<yi∑(−1)+θ0^>yi∑(+1)
- 换句话说,我们取i = 1 , 2 , . . . , n i = 1, 2, ..., ni=1,2,...,n的值的总和:
- 如果我们的观察值 y i y_iyi大于 我们的预测值 θ 0 ^ \hat{\theta_0}θ0^,则为− 1 -1−1
- 如果我们的观察值 y i y_iyi小于 我们的预测值 θ 0 ^ \hat{\theta_0}θ0^,则为+ 1 +1+1
- 置为 0。0 = 1 n ∑ θ 0 ^ < y i ( − 1 ) + 1 n ∑ θ 0 ^ > y i ( + 1 ) 0 = \frac{1}{n}\sum_{\hat{\theta_0} < y_i} (-1) + \frac{1}{n}\sum_{\hat{\theta_0} > y_i} (+1)0=n1θ0^<yi∑(−1)+n1θ0^>yi∑(+1)
- 求解 θ 0 ^ \hat{\theta_0}θ0^。0 = − 1 n ∑ θ 0 ^ < y i ( 1 ) + 1 n ∑ θ 0 ^ > y i ( 1 ) 0 = -\frac{1}{n}\sum_{\hat{\theta_0} < y_i} (1) + \frac{1}{n}\sum_{\hat{\theta_0} > y_i} (1)0=−n1θ0^<yi∑(1)+n1θ0^>yi∑(1)
∑ θ 0 ^ < y i ( 1 ) = ∑ θ 0 ^ > y i ( 1 ) \sum_{\hat{\theta_0} < y_i} (1) = \sum_{\hat{\theta_0} > y_i} (1)θ0^<yi∑(1)=θ0^>yi∑(1)
因此,最小化 MAE 的常数模型参数 θ = θ 0 ^ \theta = \hat{\theta_0}θ=θ0^ 必须满足:
∑ θ 0 ^ < y i ( 1 ) = ∑ θ 0 ^ > y i ( 1 ) \sum_{\hat{\theta_0} < y_i} (1) = \sum_{\hat{\theta_0} > y_i} (1)θ0^<yi∑(1)=θ0^>yi∑(1)
换句话说,大于 θ 0 \theta_0θ0 的观察数量必须等于小于 θ 0 \theta_0θ0 的观察数量;方程的左右两侧必须有相等数量的点。这就是中位数的定义,因此我们的最优值是θ 0 ^ = m e d i a n ( y ) \hat{\theta_0} = median(y)θ0^=median(y)
11.4 总结:损失优化、微积分和临界点
首先,将目标函数定义为平均损失。
- 代入 L1 或 L2 损失。
- 代入模型,使得结果表达为 θ \thetaθ 的函数。
然后,找到目标函数的最小值:
- 对 θ \thetaθ 求导数。
- 置为 0。
- 求解 θ ^ \hat{\theta}θ^。
- (如果我们有多个参数)重复步骤 1-3,使用偏导数。
回想微积分中的临界点:R ( θ ^ ) R(\hat{\theta})R(θ^)可能是一个最小值、最大值或者鞍点!* 从技术上讲,我们还应该进行二阶导数测试,即,展示 R ′ ′ ( θ ^ ) > 0 R''(\hat{\theta}) > 0R′′(θ^)>0。* MSE 具有一个特性——凸性——它保证了 R ( θ ^ ) R(\hat{\theta})R(θ^) 是一个全局最小值。* MAE 的凸性证明超出了本课程的范围。
11.5 比较损失函数
我们现在已经尝试了在 MSE 和 MAE 成本函数下拟合模型。这两个结果如何比较?
让我们考虑一个数据集,其中每个条目代表了泡泡茶店每天卖出的饮料数量。我们将拟合一个常数模型来预测明天将卖出的饮料数量。
drinks = np.array([20, 21, 22, 29, 33]) drinks
array([20, 21, 22, 29, 33])
根据我们上面的推导,我们知道 MSE 成本下的最佳模型参数是数据集的均值。在 MAE 成本下,最佳参数是数据集的中位数。
np.mean(drinks), np.median(drinks)
(25.0, 22.0)
如果我们在几个可能的 θ \thetaθ 值上绘制每个经验风险函数,我们会发现每个 θ ^ \hat{\theta}θ^ 确实对应于最低的错误值:
注意上面的 MSE 是一个平滑函数——它在所有点上都是可微的,这使得用数值方法最小化它变得容易。相比之下,MAE 在每个“拐点”处都不可微。我们将在几周内探讨成本函数的平滑性如何影响我们应用数值优化的能力。