### enet() 可以运行,但在通过 caret::train() 运行时失败

我正在尝试运行一个弹性网(Elastic Net),从 LASSO 开始,然后继续进行。我可以直接运行它,但当我尝试使用 caret 包中的 train 函数使用相同的参数时,它就失败了。我希望能让 train 函数正常工作,这样我就可以用它来评估模型参数。

# Workstest <- enet( x=x, y=y, lambda=0, trace=TRUE, normalize=FALSE, intercept=FALSE )# Doesn'tenetGrid <- data.frame(.lambda=0,.fraction=c(.01,.001,.0005,.0001))ctrl <- trainControl( method="repeatedcv", repeats=5 )> test2 <- train( x, y, method="enet", tuneGrid=enetGrid, trControl=ctrl, preProc=NULL )  fraction lambda RMSE Rsquared RMSESD RsquaredSD1    1e-04      0  NaN      NaN     NA         NA2    5e-04      0  NaN      NaN     NA         NA3    1e-03      0  NaN      NaN     NA         NA4    1e-02      0  NaN      NaN     NA         NAError in train.default(x, y, method = "enet", tuneGrid = enetGrid, trControl = ctrl,  :   final tuning parameters could not be determinedIn addition: There were 50 or more warnings (use warnings() to see the first 50)> warnings()...50: In eval(expr, envir, enclos) :  model fit failed for Fold10.Rep5: lambda=0, fraction=0.01 Error in enet(as.matrix(trainX), trainY, lambda = lmbda) :   Some of the columns of x have zero variance

请注意,上述示例中的任何共线性只是为了生成可复现的示例而进行子集选择的结果(1,000 行与实际数据集中的 208,000 行相比)。

我已经通过多种方式检查了完整的数据集,包括使用 findLinearCombos。请注意,其中几百个变量是从临床诊断中提取的二进制变量,因此是二元的,且 1 的比例较低。

如何让 train(...,method="enet") 使用与 enet() 完全相同的设置运行?

用于可复现性的数据,sesionInfo 等

样本数据 xy 可在此处获取

sessionInfo() 的结果:

R version 3.0.1 (2013-05-16)Platform: x86_64-pc-linux-gnu (64-bit)locale: [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C         LC_TIME=C            LC_COLLATE=C         LC_MONETARY=C        LC_MESSAGES=C        LC_PAPER=C           [8] LC_NAME=C            LC_ADDRESS=C         LC_TELEPHONE=C       LC_MEASUREMENT=C     LC_IDENTIFICATION=C attached base packages: [1] parallel  splines   grid      stats     graphics  grDevices utils     datasets  methods   base     other attached packages: [1] scales_0.2.3        elasticnet_1.1      fscaret_0.8.5.3     gsubfn_0.6-5        proto_0.3-10        lars_1.2            caret_5.17-7        [8] foreach_1.4.1       cluster_1.14.4      lubridate_1.3.0     HH_2.3-37           reshape_0.8.4       latticeExtra_0.6-24 leaps_2.9          [15] multcomp_1.2-18     perturb_2.05        Zelig_4.2-0         sandwich_2.2-10     zoo_1.7-10          survey_3.29-5       Hmisc_3.12-2       [22] survival_2.37-4     lme4_0.999999-2     bayesm_2.2-5        stargazer_4.0       pscl_1.04.4         vcd_1.2-13          colorspace_1.2-2   [29] mvtnorm_0.9-9995    car_2.0-18          nnet_7.3-7          gdata_2.13.2        gtools_3.0.0        spBayes_0.3-7       Formula_1.1-1      [36] magic_1.5-4         abind_1.4-0         MapGAM_0.6-2        gam_1.08            fields_6.7.6        maps_2.3-2          spam_0.29-3        [43] FNN_1.0             spatstat_1.31-3     mgcv_1.7-24         rgeos_0.2-19        RArcInfo_0.4-12     automap_1.0-12      gstat_1.0-16       [50] SDMTools_1.1-13     rgdal_0.8-10        spdep_0.5-60        coda_0.16-1         deldir_0.0-22       maptools_0.8-25     nlme_3.1-110       [57] MASS_7.3-27         Matrix_1.0-12       lattice_0.20-15     boot_1.3-9          data.table_1.8.8    xtable_1.7-1        RCurl_1.95-4.1     [64] bitops_1.0-5        RColorBrewer_1.0-5  testthat_0.7.1      codetools_0.2-8     devtools_1.3        stringr_0.6.2       foreign_0.8-54     [71] ggplot2_0.9.3.1     sp_1.0-11           taRifx_1.0.5        reshape2_1.2.2      plyr_1.8            functional_0.4      R.utils_1.25.2     [78] R.oo_1.13.9         R.methodsS3_1.4.4  loaded via a namespace (and not attached): [1] LearnBayes_2.12  compiler_3.0.1   dichromat_2.0-0  digest_0.6.3     evaluate_0.4.4   gtable_0.1.2     httr_0.2         intervals_0.14.0 iterators_1.0.6 [10] labeling_0.2     memoise_0.1      munsell_0.4.2    rpart_4.1-1      spacetime_1.0-5  stats4_3.0.1     tcltk_3.0.1      tools_3.0.1      whisker_0.3-2   [19] xts_0.9-5       

更新

在数据集的 15% 样本上运行:

Warning in eval(expr, envir, enclos) :  model fit failed for Fold10.Rep1: lambda=0, fraction=0.005... (更多类似的警告信息) ...Warning in nominalTrainWorkflow(dat = trainData, info = trainInfo, method = met\hod,  :  There were missing values in resampled performance measures.Error in if (lambda > 0) { : argument is of length zeroCalls: train ... train.default -> system.time -> createModel -> enet

X 矩阵有 806 列,其中 801 列是虚拟变量。许多这些虚拟变量非常稀疏(在约 25k 行中只有 1-3 个观察值),其他变量的 TRUE 值比例为 0.1-5%。总共有 108867 个 TRUE 和 2100 万个 FALSE。


回答:

为了解决这个问题,现在我已经让它正常工作了。我删除了所有 TRUE 值少于 20 个的列(请记住,这是从近 20 万个观察值中得出的),因为这些列的信息量不足以提供贡献。这最终删除了大约一半的列。

在未来的工作中,我需要谨慎处理这些稀疏列,以免它们引入过多的偏差等问题,但我希望通过使用进行变量选择的方法(如 LASSO、随机森林等),这个问题会减少。

感谢 @O_Devinyak 的帮助。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注