为什么R语言glmnet的predict函数返回矩阵而非单列预测结果?
问题解答
返回多列预测结果的原因
glmnet包默认设计为自动生成100个不同的正则化惩罚系数lambda取值,拟合整个正则化路径上的所有模型。你调用predict()时没有指定要使用的lambda参数,函数会默认返回全部100个lambda对应的预测结果,因此输出为294行(测试集样本量)100列的矩阵,你的代码逻辑本身没有本质错误,只是缺少指定预测所用lambda的步骤。
修正方案
推荐通过交叉验证自动选择最优lambda再做预测,修正后的核心代码如下:
# 拟合模型部分替换为交叉验证版本 X <- model.matrix(Attrition~ ., train) # 5折交叉验证拟合岭正则化逻辑回归,alpha=0代表岭回归 cv_ridge <- cv.glmnet(X, train$Attrition, family = 'binomial', alpha = 0, nfolds = 5) # 预测时指定s参数为交叉验证得到的最优lambda(交叉验证误差最小的取值) prob_ridge <- predict(cv_ridge, newx = model.matrix(Attrition~ ., test), type = 'response', s = "lambda.min")
运行后得到的prob_ridge就是你期望的294×1单列预测结果。
如果你已经手动确定了要使用的lambda取值,也可以直接在predict的s参数中传入对应的数值即可。
内容的提问来源于stack exchange,提问作者ycenycute
相关产品推荐
相关产品推荐

