2017-11-21 7 views
1

私はtrainSAtestSAという名前のデータセットを使用しています。とりわけ、列番号はchd age alcohol obesity tobacco typea ldlです。train(method = "glm"、...)とglm(...)は同じ回答を期待していますか?

このコマンドは(私はRで働いていることに注意してください)

set.seed(13234) 
modFit<-train(chd~ age+ alcohol+ obesity +tobacco +typea +ldl, method="glm",family="binomial", data=trainSA) 
missClass(testSA$chd, predict(modFit,testSA)) 

戻り0.3116883、しばらくこの1

set.seed(13234) 
modFit<-glm(chd~ age+ alcohol+ obesity +tobacco +typea +ldl, family="binomial", data=trainSA) 
missClass(testSA$chd, predict(modFit,testSA)) 

戻り0.2943723

同じシードで1つずつ実行することができ(したがって、他のすべてのパラメータを同じに保ちます)、わずかに異なる結果が得られます。

これは予期されているのですか、それともどちらかに追加する必要があるコマンドがありますか?

注:この質問では、他のコードの詳細は含まれていないと考えていますが、必要に応じてこれを行うことができます。

答えて

0

predict関数が2つの異なるモデルで異なる動作をするため、出力が一致しません。この単純で再現可能な例を考えてみましょう。

library(caret) 
set.seed(123) 
df <- data.frame(
    y = as.factor(rbinom(100, 1, 0.5)), 
    x1 = rnorm(100), 
    x2 = rnorm(100) 
) 
trainSA <- df[1:70,] 
testSA <- df[71:100,] 

modFit1<-train(y ~ x1 + x2, method="glm",family="binomial", data=trainSA) 
head(predict(modFit1, testSA)) 
[1] 0 1 1 1 0 1 
Levels: 0 1 

modFit2<-glm(y ~ x1 + x2, family="binomial", data=trainSA) 
head(predict(modFit2, testSA)) 
     71   72   73   74   75   76 
-0.06855758 0.35434220 0.09654412 0.01410099 -0.91703771 0.25432903 

あなたは彼らが同じ結果を与えるために使用すると、2つのモデル間で予測機能を使用している方法を変更を指定する必要があります。これを行うための一つの方法があります。

as.integer(predict(modFit1,testSA))-1 == as.integer(predict(modFit2, testSA, type = 'response') >= 0.5) 

[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 
[18] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

あなたは第二の周りに行くpredictを呼び出す方法を変更することを検討し、おそらく、あなたのデータやmissClass機能についての詳細情報を提供していないので、私はあなたに完全な答えを与えることはできません。

predict(modFit,testSA, type = 'response') >= 0.5 

上記のコードは、あなたが探していることも、バイナリクラス予測を与えるだろうが、やはりそれはあなたの関数が実際にやっている、あなたのデータに依存して。