1

ここで明らかに明らかな何かが欠けていると予想しています。

過剰適合のデモを作成しようとしています。20 個のサンプルを抽出した 2 次生成関数があり、次数が増加する多項式線形モデルをサンプル データに適合させたいと考えています。

何らかの理由で、使用するモデルに関係なく、実行するたびにpredictN 個の予測が返されます。ここで、N はモデルのトレーニングに使用されるレコードの数です。

set.seed(123)
N=20
xv = seq(1,5,length.out=1e4)
x=sample(xv,N)
gen=function(v){v^2 + 2*rnorm(length(v))}
y=gen(x)
df = data.frame(x,y)

# convenience function for building formulas for polynomial regression
build_formula = function(N){ 
  fpart = paste(lapply(2:N, function(i) {paste('+ poly(x,',i,',raw=T)')}  ), collapse="")
  paste('y~x',fpart)
}
## Example:
## build_formula(4)="y~x + poly(x, 2 ,raw=T)+ poly(x, 3 ,raw=T)+ poly(x, 4 ,raw=T)"



model = lm(build_formula(10), data=df)
predict(model, data=xv) # returns 20 values instead of 1000
predict(model, data=1)  # even *this* spits out 20 results. WTF?

この動作は、自明なケースを含め、式の多項式の次数に関係なく存在し'y~x'ます。

formulas = sapply(c(2,10,20), build_formula)
formulas = c('y~x', formulas)
pred = lapply(formulas
              ,function(f){
                predict(
                  lm(f, data=df)
                  ,data=xv)
              })

lapply(pred, length) # 4 x 20 predictions, expecting 4 x 1000

# unsuccessful sanity check
m1 = lm('y~x', data=df)
predict(m1,data=xv)

これは私を狂わせています。私は何を間違っていますか?

4

1 に答える 1

3

の 2 番目の引数predictnewdataではなくdataです。

polyまた、モデル式でを複数回呼び出す必要はありません。poly(N)および他のすべてと共線にpoly(N-1)なります。

また^2、 を使用して一連の予測を生成するにxvは、適切な名前のデータ フレームに配置する必要があります: data.frame(x=xv)

于 2013-07-12T19:16:55.400 に答える