代码之家  ›  专栏  ›  技术社区  ›  Tilo

如何编程比较每次运行后的回归ml模型结果

  •  0
  • Tilo  · 技术社区  · 7 年前

    我想写一个R代码,在每次运行后读取错误度量,如mae,mape,r2等,并将结果进行比较。

    我在每次运行中添加了更多的训练数据,并希望在每次使用r代码而不是手动检查添加数据后,交叉检查它如何改进/减少错误。

    任何建议将不胜感激!

    1 回复  |  直到 7 年前
        1
  •  1
  •   coffeinjunky    6 年前

    这是一个非常普通的问题,确切的答案取决于您要运行的模型。为了在一定程度上帮助您,您需要了解您运行的每个拟合模型都具有特定的结构。例如,请考虑以下内容:

    # fix seed for reproducability
    set.seed(42)
    
    # generate fake data:
    x = rnorm(100000)
    y = x + 5*rnorm(100000)
    df <- data.frame(y,x)
    

    查看线性模型的摘要方法返回的结果(还请探索 names(lm(y~x, data = df))) )以下内容:

    names(summary(lm(y~x, data = df)))
     [1] "call"          "terms"         "residuals"     "coefficients"  "aliased"       "sigma"         "df"            "r.squared"    
     [9] "adj.r.squared" "fstatistic"    "cov.unscaled" 
    

    您将看到返回r^2和调整后的r^2。如果你对这个数量感兴趣,你可以多次拟合你的模型,提取这个数量,并以你想要的任何方式存储它。根据您的示例,假设我们要为每个运行到给定索引的数据提取r^2,我们可以定义以下函数:

    get_rsq <- function(ind){
      summary(lm(y~x, data = df[1:ind,]))$r.squared
    }
    

    然后跑

    sapply(seq(1000, nrow(df), 10000), get_rsq)
     [1] 0.05720826 0.04352535 0.03907049 0.03851629 0.04007696 0.04063812 0.04058338 0.03924757 0.03934495 0.03926088
    

    在我们使用的每一个合适的地方得到r^2 seq(1000, nrow(df), 10000) 以增加数据帧中的索引,从而增加我们用来拟合模型的数据量(每次迭代增加10000)。请确保数据被洗牌。

    注意,以我定义的同样方式 get_rsq ,您可以定义自己的函数,从拟合模型中提取所需的任何数量。

    有许多现有的包装有助于这种运动。例如,查看 caret 打包,或者读一些 blog posts 是的。根据您的应用程序, broom-package 它的功能 tidy glance 可能也有帮助。例如,下面给出了在数据帧中通过格兰仕收集的所有摘要统计信息,每个增量数据分区有一行:

    library(dplyr)
    library(broom)
    
    bind_rows(lapply(seq(1000, nrow(df), 10000), function(x) glance(lm(y~x, data = df[1:x,]))  ))
        r.squared adj.r.squared     sigma  statistic       p.value df      logLik       AIC        BIC   deviance df.residual
    1  0.05720826    0.05626358 0.9896907   60.55827  1.778778e-14  2   -1407.575   2821.15   2835.873   977.5288         998
    2  0.04352535    0.04343838 0.9734098  500.47514 1.924959e-108  2  -15310.872  30627.74  30649.662 10420.8975       10998
    3  0.03907049    0.03902473 0.9768702  853.75895 5.281910e-184  2  -29305.279  58616.56  58640.414 20037.8762       20998
    4  0.03851629    0.03848528 0.9805112 1241.75589 9.551206e-267  2  -43375.978  86757.96  86782.980 29801.5469       30998
    5  0.04007696    0.04005355 0.9802690 1711.67402  0.000000e+00  2  -57358.419 114722.84 114748.703 39396.0941       40998
    6  0.04063812    0.04061931 0.9793373 2160.25156  0.000000e+00  2  -71300.030 142606.06 142632.579 48912.2650       50998
    7  0.04058338    0.04056766 0.9785619 2580.21927  0.000000e+00  2  -85232.308 170470.62 170497.672 58410.6772       60998
    8  0.03924757    0.03923404 0.9778149 2900.32974  0.000000e+00  2  -99150.760 198307.52 198335.030 67882.7501       70998
    9  0.03934495    0.03933309 0.9789331 3317.38429  0.000000e+00  2 -113208.374 226422.75 226450.655 77621.2003       80998
    10 0.03926088    0.03925032 0.9789433 3718.65928  0.000000e+00  2 -127185.787 254377.57 254405.830 87206.1159       90998