2012-12-02 26 views
13

我是R的新用戶,試圖擺脫SAS。我在這裏問這個問題,因爲我對所有可用於R的包和源感到有點沮喪,而且我似乎無法得到這個工作,主要是由於數據大小。如何在R中採樣大數據庫並實現K-means和K-nn?

我有以下幾點:

稱爲源在本地MySQL數據庫與200個預測功能和一個類變量的表。該表有300萬條記錄,大小爲3GB。每個類的實例數不相等。

欲:

  1. 甲隨機抽樣源數據庫創建的 與相等數目的每類實例的一個較小的數據集。
  2. 將樣本分成訓練和測試集。
  3. 對訓練集進行k-均值聚類以確定每個類的k個質心。
  4. 帶有質心的測試數據的預成形k-NN分類。
+5

歡迎來到So!我建議你:** RMysqlite **包提取你的數據,* sample *函數(** base **包)進行採樣! * kmeans *函數(** base **包)! * knn *函數(**類**包) – agstudy

+0

如何處理大數據?數據庫的問題,預採樣保存在內存中。只有4Gb內存。 – erichfw

+2

嘗試使用數據庫引擎執行隨機選擇:http://stackoverflow.com/q/580639/269476。 – James

回答

0

我可以幫你解決兩個問題。 1-分層抽樣 兩分訓練&測試(即校準驗證)

 n = c(2.23, 3.5, 12,2, 93, 57, 0.2, 
33, 5,2, 305, 5.3,2, 3.9, 4) 
    s = c("aa", "bb", "aa","aa", "bb", "cc","aa", "bb", 
"bb","aa", "aa","aa","aa","bb", "cc") 
     id = c(1, 2, 3,4, 5, 6,7, 8, 9, 
10, 11, 12,13, 14, 15) 
     df = data.frame(id, n, s)  # df is a data frame 

     source("http://news.mrdwab.com/stratified") 
     sample<- stratified(df=df, 
          id=1, #ID of your dataframe, 
          #if there isn't you have to create it 
          group=3, #the position of your predictor features 
          size=2, #cardinality of selection 
          seed="NULL") 

     #then add a new column to your selection 
     sample["cal_val"]<- 1 

     #now, you have a random selection of group 3, 
     #but you need to split it for cal and val, so: 

     sample2<- stratified(df=sample, #use your previous selection 
          id=1, 
          group=3, #sample on the same group used previously 
          size=1,#half of the previous selection 
          seed="NULL") 

     sample2["val"]<- 1 
     #merge the two selection 
     merge<- merge(sample, sample2, all.x=T, by="id") 
     merge[is.na(merge)] <- 0 #delete NA from merge 
    #create a column where 1 is for calibration and 2 for validation  
    merge["calVal"]<- merge$cal_val.x + merge$cal_val.y 
#now "clean" you dataframe, because you have too many useless columns  
id<- merge$id 
     n<- merge$n.x 
     s<- merge$s.x 
     calval<- merge$calVal 
     final_sample<- data.frame(id, n, s, calval) 
2

我會繼續的方式是:

1)提取你的表的ID的列表爲R,則可以通過使用RMySQL庫的簡單SQL查詢來完成此操作。

2)在R中以任何你喜歡的方式拆分ID,然後使用RMySQL(我發現這兩步方法比直接在MySQL中進行採樣要快得多)再次執行後續的SQL查詢。 3)根據你的樣本有多大,你可以通過使用基本R kmeans實現逃脫,但是這對於更大的樣本可能會失敗,在這種情況下,你應該考慮使用庫biganalytics中的bigkmeans。

0

我認爲你的許多問題都可以通過使用脫字符包來解決。關於具有相同類成員的隨機採樣,我會將它推回到SQL中,只是針對指定的每個類運行兩個具有所需大小的查詢。其他人提到RMySql,RODBC或RJDBC也可以。對於數據分成訓練和測試集,使用下面的插入符號功能:

# separate data into test and train sets, 70/30 split in this case 

splitIndex <- createDataPartition(mydata$mytargetcolumn, p = 0.7, list = FALSE) 
train <- mydata[splitIndex, ] 
test <- mydata[-splitIndex, ] 
testInd <- test[ ,!colnames(test) %in% "mytargetcolumn"] 
testDep <- as.factor(test[, names(test) == "mytargetcolumn"]) 

你也可以做你的KNN使用插入符號,像這樣:

modelKNN <- knn3(mytargetcolumn ~ ind1 + ind2, data = train, k = neighborCount, prob = TRUE) 

,然後預測很簡單:

# prediction using KNN to get class probabilities, change 'type' if you just want class prediction 

predKNN <- predict(modelKNN, testInd, type = "prob") 

您還可以使用插入符,對於評價:

# Generate confusion matrix from class predictions and actual values 

confKNN <- confusionMatrix(testDep, predKNN) 

雖然我個人使用AUC(通過pROC包)進行分類模型評估,因爲它是分類器強度比精度更精細的度量。