在进行交叉验证时,我得到了这些奇怪的结果,如果有任何评论,我将不胜感激。
简而言之,与使用用于生成数据的“地面真实权重”进行比较时,使用交叉评估(CV)进行回归(最小二乘)时,我的均方误差(MSE)较低。
但是请注意,我是根据嘈杂的数据(生成的数据+噪声)计算MSE的,因此对于高于0的噪声水平,MSE不会为0。
奇怪的是,对于高噪声条件,与经过交叉验证的最小二乘法相比,我得到的MSE更低,而用于生成清晰数据的“地面”真实权重却要低-然后向输入(X)添加不同级别的噪声。相反,如果我在输出(y)中添加高斯噪声,则“地面真实权重”的效果会更好。
下面有更多详细信息。
我正在从波斯语中生成 beta ,从统一分布中生成 X 。然后,我将要回归的 y 计算为y = beta *X。 python 3代码:
def generate_data(noise_frac):
X = np.random.rand(ntrials,nneurons)
X = np.random.normal(size=(ntrials,nneurons))
beta = np.random.randn(nneurons)
y = X @ beta
# not very important how I generated noise here
noise_x = np.random.multivariate_normal(mean=zeros(nneurons), cov=diag(np.random.rand(nneurons)), size=ntrials)
X_noise = X + noise_x*noise_frac
return X_noise, y, beta
如您所见,我还为 X 添加了噪音。
然后,我将针对不同值 noise 的此噪声数据 X_noise 投影到 beta :
y_hat = (X_noise) @ beta
并计算MSE:
mse = mean((y_hat - y)**2)
正如预期的那样,MSE随噪声而增加(图中的蓝线)。
但是,如果使用交叉验证的最小二乘法,我的MSE会降低!现在这是图中的橙色线。
要进行简历,我将 X_noise 分为100个随机训练和测试集。概括地说,这就是我在python中做简历的方法:
beta_lsq = pinv(X_train) @ y_train
y_hat_lsq = (X_test) @ beta_lsq
mse = mean((y_hat_lsq - y_test)**2)
另一方面,如果我将噪声添加到y而不是X,那么一切都有意义:
非常感谢您!
PS:这是堆栈溢出的交叉点