2016-09-16 4 views
-1

私は訓練してシリアライズしたRのlmモデルを持っています。私は、入力としてモデルと特徴ベクトル(単一のアレイ)を渡す機能、内部に、私は:1つの配列でRリニアモデル(lm)予測関数

CREATE OR REPLACE FUNCTION lm_predict(
    feat_vec float[], 
    model bytea 
) 
RETURNS float 
AS 
$$ 
    #R-code goes here. 
    mdl <- unserialize(model) 
    # class(feat_vec) outputs "array" 
    y_hat <- predict.lm(mdl, newdata = as.data.frame.list(feat_vec)) 
    return (y_hat) 
$$ LANGUAGE 'plr'; 

これは間違ったy_hatを返します!この他のソリューションが動作するので、私は(この関数への入力はまだByteArrayの中のモデル()と1 feat_vec(配列)されている)これを知っている:

CREATE OR REPLACE FUNCTION lm_predict(
    feat_vec float[], 
    model bytea 
) 
RETURNS float 
AS 
$$ 
    #R-code goes here. 
    mdl <- unserialize(model) 
    coef = mdl$coefficients 
    y_hat = coef[1] + as.numeric(coef[-1]%*%feat_vec) 
    return (y_hat) 
$$ LANGUAGE 'plr'; 

私が間違って何をやっています?それは同じシリアル化されていないモデルです、最初のオプションは私にも正しい答えを与える必要があります...

+0

は、このRコードのですか?それは半分のpythonのように見えます。コロンはRでそのようには動作せず、 'return'や' + 'も機能しません。 – alistaire

+0

はい、それはR +擬似コードです - 関数宣言を無視することができます 実際には - これはPostgresのPL/R関数の中にありますが、Postgresに焦点を当てたくありません – strv7

+0

...擬似コードはどのように結果を返します、正しいかどうか? – alistaire

答えて

1

問題はnewdata = as.data.frame.list(feat_vec)の使用のようです。 previous questionで説明したように、これは醜い列名を返します。 predictに電話するときは、newdataの列名は、モデル式の共変量名と一致する必要があります。 predictに電話すると、警告メッセージが表示されます。あなたが必要なもの

## example data 
set.seed(0) 
x1 <- runif(20) 
x2 <- rnorm(20) 
y <- 0.3 * x1 + 0.7 * x2 + rnorm(20, sd = 0.1) 

## linear model 
model <- lm(y ~ x1 + x2) 

## new data 
feat_vec <- c(0.4, 0.6) 
newdat <- as.data.frame.list(feat_vec) 
# X0.4 X0.6 
#1 0.4 0.6 

## prediction 
y_hat <- predict.lm(model, newdata = newdat) 
#Warning message: 
#'newdata' had 1 row but variables found have 20 rows 

newdat <- as.data.frame.list(feat_vec, 
          col.names = attr(model$terms, "term.labels")) 
# x1 x2 
#1 0.4 0.6 

y_hat <- predict.lm(model, newdata = newdat) 
#  1 
#0.5192413 

これは、手動で計算することができるものと同じである。

coef = model$coefficients 
unname(coef[1] + sum(coef[-1] * feat_vec)) 
#[1] 0.5192413 
+0

PostgresからRを呼び出すと警告メッセージが表示されません...しかし何かが間違っています – strv7

+0

あなたの答えに感謝します。ほんとうにありがとう。 それでも私にとってはうまくいきません、y_hatは常に同じ結果を返しますが、 "手動の"計算は正しい予測を返します。理由を理解できません:/ なぜcol.namesを含める必要がありますか?それは本当に重要ですか? – strv7

+0

これは私の問題をrandomForestで扱うときに解決しました...ありがとう!私はまだ映画で奇妙な振る舞いをしますが、別の回帰モデルとまったく同じコードを扱うことができてうれしく思います! – strv7

関連する問題