什么是线性回归的正确成本函数
数据挖掘
机器学习
线性回归
成本函数
套索
岭回归
2022-03-08 01:46:19
1个回答
有趣的问题。由于以下原因,我会说不划分是正确的......
对于线性回归,没有区别。成本函数的最优值保持不变,无论它如何缩放。
在做 Ridge 或 Lasso 时,除法会影响成本函数的最小二乘和正则化部分之间的相对重要性。如果没有足够的数据,我们通常使用正则化来避免过度拟合。我们拥有的数据越多,我们希望正则化对模型的影响就越小。通过不划分,如果有很多记录,最小二乘项将支配正则化项。
简而言之,使用恒定的 lambda:
通过除法,成本函数的最优值或多或少与记录数无关,这通常不是我们想要的。
在没有除法的情况下,成本函数的最优值会随着记录数的增加而接近真实参数。
为了说明这一点,我计算了一个简单线性回归的成本函数,该回归具有岭正则化和真正的斜率为 1。
如果我们除以记录数,即使对于大量记录,最优值仍低于真实斜率:

import numpy as np
import scipy.optimize as spo
import matplotlib.pyplot as plt
np.random.seed(123)
def make_data(n, noise=0.2):
x = np.random.randn(n)
y = x + noise * np.random.randn(n)
return x, y
def cost(w, lam, x, y, divide_by_n=False):
y_hat = w[:, None] * x[None, :]
least_squares = np.sum((y_hat - y)**2, axis=1)
ridge = lam * w**2
factor = 0.5/len(x) if divide_by_n else 1
return ridge + least_squares * factor
w = np.linspace(0, 2)
for do_div in [True, False]:
plt.figure()
for n in [10, 100, 1000]:
plt.plot(w, cost(w, 5, *make_data(10), divide_by_n=do_div), label=f"n={n}")
plt.xlabel('weight')
plt.ylabel('cost')
plt.legend()
plt.title(f'divide by N = {do_div}')
其它你可能感兴趣的问题


