2017-08-03 28 views
1

的假象我有70行數據和特點,34列的製表符分隔的文件,其中第60行是這樣的:LDA分類:處於測試數據零預測能力設置實或錯誤

groups x1 x2  x3 x4 x5 (etc, up to x34) 
0 0.1 0.5 0.5 0.4 0.2 
1 0.2 0.3 0.8 0.4 0.1 
0 0.4 0.7 0.6 0.2 0.1 
1 0.4 0.4 0.7 0.1 0.4 

而最後10行是這樣的:

groups x1 x2  x3 x4 x5 
? 0.2 0.1 0.5 0.4 0.2 
? 0.2 0.1 0.8 0.4 0.1 
? 0.2 0.2 0.6 0.2 0.1 
? 0.2 0.3 0.7 0.1 0.4 

這些組是二進制(即每一行任一屬於組0或1組)。目標是使用前60行作爲我的訓練數據集,最後10行作爲我的測試數據集;最後10行分成組0或1

我寫了這個,下面所描述的方法here

data <-read.table("data_challenge_test.tab",header=TRUE) 
train <-sample(1:60) 
data.train <-data[train,] 
data.test <-data[-train,] 
odd.lda <-lda(groups ~ x1+x2+x3+x4+x5, data.train) 
pred.train <- predict(odd.lda,data.train)$class 
pred.test <- predict(odd.lda,data.test)$class 

training_prediction = mean(pred.train == data.train$groups) 
testing_prediction = mean(pred.test == data.test$groups) 

的「odd.lda」行之後,我得到警告:

Warning message: 
In lda.default(x, grouping, ...) : group ? is empty 

問題是我的測試訓練數據集不應該有組「?」 (因爲我的訓練數據集是前60行,都是0或1)。

然後,我training_prediction值是0.9,但我test_prediction值爲0

我明白,我也可以考慮分類的其他方法(我還期待着爲GLM),但我想,以確保從test_prediction數據集中獲得的0預測能力是真實的,而不是一個錯誤的假象(即我上面提到的組號問題)。

我是否正確地進行了分析,或者上述代碼中是否存在導致上述警告的錯誤,以及測試數據集的0預測能力。

編輯1: 由於在評論的討論中,爲了計算該模型的預測能力,我複製的方法描述here,其隨機地選擇50 60的行,估計訓練參數,然後進行分類的剩下10個樣本。這被重複100次。

n = 60 
nt = 50 
neval = n-nt 
rep=100 
errlin = dim(rep) 

set.seed(123456789) 
data <-read.table("data_challenge_test.tab",header=TRUE) 
data <-data[1:60,] 
for (k in 1:rep) { 
train = sample(1:n,nt) 
data.train <-data[train,] 
data.test <-data[-train,] 
m1 = lda(groups ~ x1+x2+x3+x4+x5,data.train) 
tablin = table(data$groups[-train],predict(m1,data.test)$class) 
errlin[k] = (neval-sum(diag(tablin)))/neval 
} 
merrlin=mean(errlin) 
merrlin 

就我而言,merrlin是0.454;這意味着有45%的錯誤分類。虹膜數據集(參見下面的註釋)

精確代碼:

n = 120 
nt = 90 
neval = n-nt 
rep=100 
errlin = dim(rep) 
set.seed(123456789) 
data <-iris 
for (k in 1:rep) { 
    train = sample(1:n,nt) 
    data.train <-data[train,] 
    data.test <-data[-train,] 
    m1 = lda(Species ~ .,data.train) 
    tablin = table(data$Species[-train],predict(m1,data.test)$class) 
    errlin[k] = (neval-sum(diag(tablin)))/neval 
} 

merrlin=mean(errlin) 
merrlin 
+0

你在你的'lda'調用中有'groups',但你的變量名中有'group'。 –

+0

嘗試用'NA'替換問號。就目前而言,他們可能會迫使第一列成爲因素,這可能不是你想要的。特別是,包含'?'的因子級別將被傳遞給'lda',即使它們不出現在前60行中。 –

+0

謝謝。該組/團體是一個錯字。我用NAs替換了問號。當我重新運行代碼時,沒有錯誤,但仍然是0.9訓練預測和0.0測試預測。我想這意味着在這種情況下,這個算法不適合我正在尋找的數據集的最後10行的二進制分類。謝謝。 –

回答

0

跟進回答上述評論...

在你的榜樣與iris,如果你設置n 120 ,那麼您必須將數據限制在第一行n行,否則data[-train,]將包含行121:150以及您所期望的行。

我做了以下一些小的改動......

library(MASS) 
n = 120 
nt = 90 
neval = n-nt 
rep=100 
errlin = dim(rep) 
set.seed(123456789) 
data <-iris[1:n,] # here is where you need to keep your data to n rows 
for (k in 1:rep) { 
    train = sample(1:n,nt) 
    data.train <-data[train,] 
    data.test <-data[-train,] #now excludes iris[(n+1):150,] 
    m1 = lda(Species ~ .,data.train) 
    tablin = table(data.test$Species,predict(m1,data.test)$class) #edited first term 
    errlin[k] = (neval-sum(diag(tablin)))/neval 
} 

merrlin=mean(errlin) 
merrlin 

[1] 0.019 

這是一個更好的誤差率!

+0

謝謝。如果我轉移到一個完全不同的外部服務器,直到現在還沒有開放(例如,這是一個全新的終端/服務器/ R副本),請將上述文本複製並粘貼到R腳本中,然後運行R腳本,我得到merrlin = 0.019?也許這只是我能想出的一個小問題,謝謝你的幫助。 –

+0

對不起 - 我也是 - 我必須重新運行循環而不重做'set.seed'行!以上更正。 –