【问题标题】:How do you calculate the training error and validation error of a linear regression model?如何计算线性回归模型的训练误差和验证误差?
【发布时间】:2020-08-09 00:11:43
【问题描述】:

我有一个线性回归模型,我的成本函数是平方和误差函数。我已将我的完整数据集拆分为三个数据集:训练、验证和测试。我不确定如何计算训练误差和验证误差(以及两者之间的差异)。

训练误差是使用训练数据集计算的残差平方和吗?

我要问的一个例子:如果我在 Python 中执行此操作,假设我在训练数据集中有 90 个数据点,那么这是训练错误的正确代码吗?

y_predicted = f(X_train, theta) #predicted y-value at point x, where y_train is the actual y-value at x
training_error = 0
for i in range(90):
  out = y_predicted[i] - y_train[i] 
  out = out*out 
  training_error+=out

training_error = training_error/2
print('The training error for this regression model is:', training_error)

【问题讨论】:

  • Mean 表示应该除以最后的样本数,而不是除以 2; scikit-learn.org/stable/modules/generated/…
  • IIRC 有时会包含除以 2,以便在计算损失梯度时被平方的导数 (2x) 抵消。但是当然这仍然缺少n的除法。
  • @xdurch0 我建议我们避免从一个明显的初学者那里就非常基本的定义提出一个非常简单的问题。即使您没记错,您所说的也仅适用于特定的上下文,并且如果 OP 从(非常)基础继续前进,将来可能会有更合适的时间来解决此类问题。

标签: python machine-learning linear-regression mean-square-error


【解决方案1】:

这篇文章的评论中提到了这一点,但您需要除以样本总数才能得到一个数字,您可以在验证集和测试集之间进行比较。

只需更改代码即可:

y_predicted = f(X_train, theta) #predicted y-value at point x, where y_train is the actual y-value at x
training_error = 0
for i in range(90):
  out = y_predicted[i] - y_train[i] 
  out = out*out 
  training_error+=out

#change 2 to 90 
training_error = training_error/90
print('The training error for this regression model is:', training_error)

这样做的目的是让您可以使用相同的指标比较两个不同的数据子集。您在那里除以 2,这没问题,只要您还除以样本数。

在 Python 中执行此操作的另一种方法是使用 sci-kit 学习库,它已经有 function

见下文。

from sklearn.metrics import mean_squared_error
training_error = mean_squared_error(y_train,y_predicted)

通常在进行这样的计算时,使用矩阵乘法而不是 for 循环会更好更快。在上下文中,这个问题的 90 条记录非常少,但是当您开始使用更大的样本量时,您可以尝试使用 numpy 进行类似的操作。

import numpy as np

training_error = np.mean(np.square(np.array(y_predicted)-np.array(y_train)))

所有 3 种方法都应该得到相似的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2014-05-02
    • 2010-12-20
    相关资源
    最近更新 更多