为什么在套索回归中计算 MSE 会给出不同的输出?

2023-12-24

我正在尝试对 lasso2 包中的前列腺癌数据运行不同的回归模型。当我使用 Lasso 时,我看到两种不同的方法来计算均方误差。但它们确实给了我完全不同的结果,所以我想知道我是否做错了什么,或者这是否仅仅意味着一种方法比另一种方法更好?

# Needs the following R packages.
library(lasso2)
library(glmnet)

# Gets the prostate cancer dataset
data(Prostate)

# Defines the Mean Square Error function 
mse = function(x,y) { mean((x-y)^2)}

# 75% of the sample size.
smp_size = floor(0.75 * nrow(Prostate))

# Sets the seed to make the partition reproductible.
set.seed(907)
train_ind = sample(seq_len(nrow(Prostate)), size = smp_size)

# Training set
train = Prostate[train_ind, ]

# Test set
test = Prostate[-train_ind, ]

# Creates matrices for independent and dependent variables.
xtrain = model.matrix(lpsa~. -1, data = train)
ytrain = train$lpsa
xtest = model.matrix(lpsa~. -1, data = test)
ytest = test$lpsa

# Fitting a linear model by Lasso regression on the "train" data set
pr.lasso = cv.glmnet(xtrain,ytrain,type.measure='mse',alpha=1)
lambda.lasso = pr.lasso$lambda.min

# Getting predictions on the "test" data set and calculating the mean     square error
lasso.pred = predict(pr.lasso, s = lambda.lasso, newx = xtest) 

# Calculating MSE via the mse function defined above
mse.1 = mse(lasso.pred,ytest)
cat("MSE (method 1): ", mse.1, "\n")

# Calculating MSE via the cvm attribute inside the pr.lasso object
mse.2 = pr.lasso$cvm[pr.lasso$lambda == lambda.lasso]
cat("MSE (method 2): ", mse.2, "\n")

这些是我得到的两个 MSE 的输出:

MSE (method 1): 0.4609978 
MSE (method 2): 0.5654089 

他们完全不同。有谁知道为什么? 预先非常感谢您的帮助!

Samuel


正如 @alistaire 所指出的,在第一种情况下,您使用测试数据来计算 MSE,在第二种情况下,报告来自交叉验证(训练)折叠的 MSE,因此这不是同类比较。

我们可以执行类似下面的操作来进行同类比较(通过在训练折叠上保留拟合值),并且我们可以看到,如果在相同的训练折叠上计算,则 mse.1 和 mse.2 完全相等(尽管值与你的略有不同,我的桌面 R 版本 3.1.2,x86_64-w64-mingw32,Windows 10):

# Needs the following R packages.
library(lasso2)
library(glmnet)

# Gets the prostate cancer dataset
data(Prostate)

# Defines the Mean Square Error function 
mse = function(x,y) { mean((x-y)^2)}

# 75% of the sample size.
smp_size = floor(0.75 * nrow(Prostate))

# Sets the seed to make the partition reproductible.
set.seed(907)
train_ind = sample(seq_len(nrow(Prostate)), size = smp_size)

# Training set
train = Prostate[train_ind, ]

# Test set
test = Prostate[-train_ind, ]

# Creates matrices for independent and dependent variables.
xtrain = model.matrix(lpsa~. -1, data = train)
ytrain = train$lpsa
xtest = model.matrix(lpsa~. -1, data = test)
ytest = test$lpsa

# Fitting a linear model by Lasso regression on the "train" data set
# keep the fitted values on the training folds
pr.lasso = cv.glmnet(xtrain,ytrain,type.measure='mse', keep=TRUE, alpha=1)
lambda.lasso = pr.lasso$lambda.min
lambda.id <- which(pr.lasso$lambda == pr.lasso$lambda.min)

# get the predicted values on the training folds with lambda.min (not from test data)
mse.1 = mse(pr.lasso$fit[,lambda.id], ytrain) 
cat("MSE (method 1): ", mse.1, "\n")

MSE (method 1):  0.6044496 

# Calculating MSE via the cvm attribute inside the pr.lasso object
mse.2 = pr.lasso$cvm[pr.lasso$lambda == lambda.lasso]
cat("MSE (method 2): ", mse.2, "\n")

MSE (method 2):  0.6044496 

mse.1 == mse.2
[1] TRUE
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在套索回归中计算 MSE 会给出不同的输出? 的相关文章

随机推荐

  • 如何在codeigniter中显示电子邮件中的图像?

    this gt load gt library upload this gt load gt library email this gt email gt set newline r n this gt email gt from emai
  • 为什么 DapperRow.GetType() 返回 null?

    据我所知 Object GetType 永远不应该返回 null 相关讨论 https stackoverflow com questions 2201007 can object gettype ever return null Dapp
  • ZF + Doctrine2 phpUnit 错误:PDOExeption:您无法序列化或反序列化 PDO 实例

    我正在使用 DynamicGuys Doctrine2 集成到 zend 框架中 https github com dynamicguy zf1doctrine2 它有效 但如果我想用 phpUnit 进行测试 我会收到此错误 PDOExe
  • 无法在异步模块中使用“map”功能

    我正在使用node js 异步 模块并且需要使用 map 方法 基本上我有一个包含其他数组的数组 内部数组包含 2 个元素 类型和图像文件名 var arr0 var arr1 type1 image1 jpg jsonArr push o
  • QListWidget中的InternalMove使项目消失

    我正在尝试在树小部件内进行拖放操作 以便能够在该小部件内移动项目 我已经设法使项目可拖动 但是当我释放鼠标按钮时 该项目就会消失 为了缩小范围 我尝试了以下示例 取自此处的另一篇文章 它与 Windows 7 上的 Qt 5 4 中的树小部
  • Automapper 自定义值解析器重用多种类型

    我有一个项目 我试图使用 AutoMapper 从多个类进行映射 每个类中都有一些属性 我想使用一些自定义逻辑将源值解析到目标 我尝试使用 AutoMapper 文档中记录的自定义解析器方法 这是我的代码 public class Cust
  • Chrome 中的同步控制台日志记录

    是否可以同步记录到控制台 我经常遇到代码执行比转储结构更快的情况 这解决了输出已更改的对象的问题 我当然可以使用调试器浏览代码 进行单元测试等 通常很方便console log只是为了大致了解正在发生的事情 您可以在将对象传递给之前创建该对
  • 将 React Element 的字符串值的一部分设为粗体

    我在我的文件中定义了变量 var text The start of string b this state isTrue Bolded Also Bolded b the end of string 该字符串被传递给 React 元素 s
  • 构建批量插入语句powershell到sql

    我有一个 powershell 脚本 它从特定目录开始递归地写入每个文件及其属性 这可行 但目录可能包含多达 1 000 000 个文件 我想要做的是以每个事务 1000 次插入的方式对它们进行批处理 PS原图如下 server Datab
  • Spring WebClient:使用 WebFlux.fn +reactor-addons 重试

    我正在尝试添加条件重试WebClient使用 Kotlin 协程 WebFlux fn reactor addons suspend fun ClientResponse asResponse ServerResponse status s
  • Qt:无法执行'':请求的操作需要提升

    我无法运行 Qt 创建者的应用程序 它抱怨以下错误 无法执行 请求的操作需要提升 我的 exe 文件上有一个 Windows 管理员盾牌符号 我需要更改项目设置吗 我广泛使用 Qt File 库来执行一些文件操作 您的可执行文件的文件名是什
  • 我需要在样式表中插入一些 PHP 代码

    在我的CSS中 div image width px 大小存储在一个数组中 所以我在这里调用 size 1 我是php初学者 有人请帮忙吗 更好的解决方案是在我的示例 cssfile php 中为 css php 文件设置标头 然后就可以使
  • 带有子菜单的可检查菜单项

    WPF 中是否可以将顶级子菜单设置为复选框 我似乎无法让它发挥作用
  • 来自具有交互作用的多元回归 glm 的 LC50 / LD50 置信区间

    我有一个准二项式 glm 其中有两个连续解释变量 假设 LogPesticide 和 LogFood 和交互作用 我想计算不同食物量 例如最小和最大食物值 下农药的 LC50 和置信区间 如何才能实现这一目标 示例 首先我生成一个数据集 m
  • Rails 的即时通讯实现?

    我花了一些时间研究几种技术来为 ruby on Rails 应用程序构建一个简单的即时消息系统 这看起来非常复杂 因为我还没有找到任何跨浏览器的实现或任何 1 1 概念证明 调查 xmpp客户端 github上有Candy只支持群聊 xmp
  • 存储库层是否应该返回数据传输对象(DTO)?

    我有一个存储库层负责我的数据访问 它由服务层调用 服务层返回经过序列化并通过线路发送的 DTO 通常 服务只是访问存储库并返回存储库返回的任何内容 但要使其发挥作用 存储库必须返回该 DTO 的实例 否则 您首先必须将存储库返回的数据层对象
  • Android:选择器中禁用按钮的文本颜色未显示?

    我正在尝试制作一个带有选择器的按钮 我的按钮可以具有以下状态 启用 禁用 按下 未按下 根据上述状态 我需要操纵按钮 文字颜色 背景图 该按钮从我被禁用开始 因此它应该具有禁用的 textColor 和禁用的按钮背景 但我可以看到默认的文本
  • jQuery Mobile 弹出窗口未在 .popup('open') 上打开

    我正在尝试使用 jQuery Mobile 1 3 1 的弹出窗口在登录凭据错误时警告用户 我从 jquerymobile 文档中的基本模板开始 但我无法让它与 popupBasic popup open 如果我这样使用它 div div
  • 如何在加特林的Json Body中添加随机值?

    我需要每次创建一个随机正整数并将其发送到加特林中的 Json 主体 我使用下面的代码创建一个随机正整数 val r new scala util Random val OrderRef r nextInt Integer MAX VALUE
  • 为什么在套索回归中计算 MSE 会给出不同的输出?

    我正在尝试对 lasso2 包中的前列腺癌数据运行不同的回归模型 当我使用 Lasso 时 我看到两种不同的方法来计算均方误差 但它们确实给了我完全不同的结果 所以我想知道我是否做错了什么 或者这是否仅仅意味着一种方法比另一种方法更好 Ne