2017-11-29 6 views
2

2つの問題があります。Rでsample.splitを使用してデータが正しく分割されず、ロジスティック回帰で発行される

  1. 私は以下のようにsample.splitを使用して、テストや電車のセットに私のデータを分割しようとすると、サンプリングはかなり不鮮明に行われます。私が意味するのは、データdの長さが392であるため、4:1除算では0.8 * 392 = 313.6つまり313または314行がテストセットに表示されますが、示されている長さは304です。行方不明ですか?

    require(caTools) 
    set.seed(101) 
    samplev = sample.split(d[,], SplitRatio= 0.80) 
    train = subset(d, samplev == TRUE) 
    test = subset(d, samplev == FALSE) 
    
  2. アイデアは、「名前」列を使用しないことですfollows-

    #Training 
    m <- glm(mpg01~ . -name, data= train, family = binomial(link = 'logit')) 
    out2 <- predict.glm(m, test, type = "response") 
    class2 <- vector() 
    for (i in 1:length(out2)) 
    { 
        if(out2[i] >= 0.5) 
        { 
        class2[i] <- 1 
        } 
        else 
        { 
        class2[i] <- 0 
        } 
    } 
    r2 <- table(class2, test$mpg01) #confusion Matrix 
    

ように私は、Rにおけるロジスティック回帰タスクのために、次のように分割されたデータを使用しようとしていますトレーニングのためのデータにモデルでpredict.glm(メートル、テスト、タイプ= "応答")

エラー - 私は、テストデータ上に構築されたモデルを実行しようとすると、それは< OUT2 following-

を示しています。 frame.default(利用規約、NEWDATA、na.action = na.action、xlev =オブジェクト$ xlevels):

因子名は/新しいレベルAMC大使のSST、AMCコンコードDL 6、AMCのペーサー、AMCペーサーdを有しますl、amc rebel sst、audi 100 ls、audi 5000、buick century 350、buick世紀限定、キャデラックセビリア、capri ii、シボレーベルエア、chシボレーモンテカルロ、シボレーベガ2300、クライスラーレバロンタウン@国(sw)、クライスラーニューヨーカーブロアム、datsun 510ハッチバック、datsun b210 gx、datsun f-10ハッチバック、dodge aries wagon(sw)、シボレーキャバリアワゴン、シボレーキャバリアワゴン、ダッジコスチューム、ダッジカスタム、ダッジマジックxe、ダッジラッシュ、フィート124 tc、フォードマストゥン、フォードマンスン2、フォードレンジャー、ホンダシビック1500 gl、マックスダrx3、マツダ626、 mazda glc 4、mazda glc custom、メルセデスベンツ240d、メルセデスベンツ280s、mercury capri 2000、mercury marquis、oldsmobile cutlass ciera(ディーゼル)、プジョー505sターボディーゼル、plymouth 'cuda 340、plymouth fury gran sedan、plymouth grand fury 、プリマス地平線、プリマス地平線の守銭奴、プリマス地平線TC3、プリマス衛星、plymo

「名前」属性を使用していないので、このエラーは表示されないはずです。それとも、私が何となくそれを意図していないときに使っているとすれば、私は間違っているのですか?あなたはどちらかdata.frameまたはmatrixを渡しているよう

答えて

1

問題1つの解答

はsample.split関数は最初の引数にベクトルを期待して、それが見えます。次に、異なる動作を示す簡単な例を示します。

# Mock up some data 
library(caTools) 
df0 <- data.frame(
    y = as.factor(rbinom(392, 1, 0.75)), 
    x1 = rnorm(392) 
) 

# sample.split with a data.frame as the first argument does not split 80/20 as expected 
set.seed(101) 
samplev = sample.split(df0, SplitRatio= 0.80) 
train = subset(df0, samplev == TRUE) 
test = subset(df0, samplev == FALSE) 
nrow(train) 
[1] 196 
nrow(test) 
[1] 196 

# feed in your response variable as a vector to get the expected split 
set.seed(101) 
samplev = sample.split(df0$y, SplitRatio= 0.80) 
train = subset(df0, samplev == TRUE) 
test = subset(df0, samplev == FALSE) 
nrow(train) 
[1] 314 
nrow(test) 
[1] 78 

問題2解答

何をやっていることは、合理的なようで、glm、最終的にmodel.frame機能は下の式を処理する方法ではありません、あなたが期待するように動作しなければならないように思えますがフード。

まず、やっていることや見ているエラーを再現するコードがあります。

set.seed(123) 
df <- data.frame(
    y = as.factor(rbinom(100, 1, 0.5)), 
    x1 = rnorm(100), 
    x2 = rnorm(100), 
    name = c(rep('a',40), rep('b',30), rep('c', 30)) 
) 
train <- df[1:70,] 
test <- df[71:100,] 
m <- glm(y~ . -name, data= train, family = binomial(link = 'logit')) 
out2 <- predict.glm(m, test, type = "response") 

は今、私はあなたの式に直接model.frameを呼び出すとき、それはまだname列を含めていることに気づきます。

head(model.frame(y~ . -name, data = train), 1) 
    y  x1  x2 name 
1 0 0.2533185 0.7877388 a 

.列記号を含まない数式には、余分な列は含まれません。一日の終わりに

head(model.frame(y~ x1 + x2, data = train), 1) 
    y  x1  x2 
1 0 0.2533185 0.7877388 

、式で直接列を指定するか、またはあなたがして、列をドロップすることで、.列の記号を使用し続けるために使用する場合のいずれか、あなたがこの問題を回避する必要があります表示されますあなたは除外したい。

具体的には、私の簡単な例では、回避策1は次のようになります。

m <- glm(y~ x1 + x2, data= train, family = binomial(link = 'logit')) 
out2 <- predict.glm(m, test, type = "response") 

回避策オプション2は次のようになります。

m <- glm(y~ ., data= train[,names(train) != 'name'], family = binomial(link = 'logit')) 
out2 <- predict.glm(m, test, type = "response") 
+0

これは本当に役に立ちました。私は 'sample.split()'ドキュメントを見ましたが、渡す必要のある 'vector'を見逃しているに違いありません。 私は最初の回避策を使用して作業を完了させましたが、追加のクエリとして、どのメソッドでも 'dependent_attr〜attrのリスト 'に対して無効なメソッドを使用しています。これは特別なケースです1?私は多くの場所で使ったものを見て、同じことを試みたことを覚えています。 – Akshayanti

関連する問題