2016-12-22 110 views
0

我有一個包含10,000個觀測值的數據集。我的目標變量有兩類 - 「Y」和「N下面是分佈‘Y’和‘N’:如何在R中創建平衡訓練和不平衡測試數據集?

> table(data$Target_Var) 
Y N 
2000 8000 

現在我想建立一個平衡的訓練數據集,使得50%(1000 )中的「Y」的是在訓練,作爲訓練數據集被認爲是平衡的,它會與「N」。觀察總數另一個1000行= 2000

table(Training$Target_Var) 
Y N 
1000 1000 

測試數據集將是不平衡的,但是具有與在羣體中相同的「Y」和「N」比率,即測試將具有1000行的1000行「N」和4000行「N」的觀察行

table(Test$Target_Var) 
Y N 
1000 4000 

現在,我可以寫一個函數來做到這一點,但是有沒有內置的R函數可以做到這一點?我研究了插入符號和採樣包的採樣功能,但找不到可以創建訓練數據集的任何功能。 SMOTE做到這一點,但創造了一個新的觀察。

+0

你可以用'樣本(水平嘗試(培訓$ Target_Var),2000,replace = TRUE,prob = c(0.2,0.8))' – akrun

回答

1

我能夠在兩個步驟中做到這一點。 假設我有數據集如下:

data<- data.frame(Target_Var = rep("A", 2000), Pop = rep(1:100,20)) 
data<- rbind(data, data.frame(Target_Var = rep("B", 8000), Pop = rep(1:100,80))) 

> table(data$Target_Var) 
Y N 
2000 8000 

第一步:創建測試數據與「Y」(即1000行)和4000點的行的「N」的50%的設定。這與人口中的'Y'和'N'具有相同的分佈。

test_index <- createDataPartition(data$Target_Var, p = .5, list = F) 
Test<- data[test_index,] 

table(Test$Target_Var) 
A B 
1000 4000 

第二步:創建平衡訓練數據集表格中的其餘數據(1000行 'Y' 和1000行的 'N')

Training<- data[-test_index,] 
Training<- strata(Training, stratanames = "Target_Var", size = c(1000,1000)) 

table(Training$Target_Var) 
A B 
1000 1000