2012-12-02 8 views
13

Sono un nuovo utente di R, cercando di allontanarmi da SAS. Sto facendo questa domanda qui perché mi sento un po 'frustrato con tutti i pacchetti e le fonti disponibili per R, e non riesco a farlo funzionare principalmente a causa della dimensione dei dati.Come campionare un grande database e implementare K-means e K-nn in R?

Ho il seguente:

una tabella denominata SOURCE in un database locale MySQL con 200 funzioni predittive e una variabile di classe. Il tavolo ha 3 milioni di record ed è grande 3 GB. Il numero di istanze per classe non è uguale.

voglio:

  1. Un campione a caso il database di origine per creare un set di dati più piccola di con uguale numero di istanze per classe.
  2. Dividere il campione in training e set di test.
  3. Preform k: indica il clustering sul set di addestramento per determinare k centroidi per classe.
  4. Preform k-NN classificazione dei dati di test con centroidi.
+5

Benvenuti in So! Ti suggerisco: ** Pacchetto RMysqlite ** per estrarre i tuoi dati, * funzione * esempio (pacchetto ** base **) per il campionamento! * Funzione kmeans * (pacchetto ** base **)! * knn * function (pacchetto ** class **) – agstudy

+0

Come gestire i dati di grandi dimensioni? Il problema con il database, il pre-campionamento viene tenuto in memoria. Ha solo RAM da 4 GB. – erichfw

+2

Prova a utilizzare il motore di database per eseguire la selezione casuale: http://stackoverflow.com/q/580639/269476. – James

risposta

0

Posso aiutarti per due domande. 1- campionamento stratificato 2-split formazione & test (cioè taratura validazione)

 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

Il modo in cui vorrei procedere è:

1) Estrarre un elenco di ID della tabella di R, si può fai questo con una semplice query SQL usando la libreria RMySQL.

2) Dividi gli ID in qualsiasi modo desideri in R, quindi esegui nuovamente le query SQL successive utilizzando RMySQL (ho trovato questo approccio in due passaggi molto più rapido del campionamento direttamente in MySQL).

3) A seconda di quanto è grande il campione che è possibile scappare utilizzando l'implementazione R kmeans di base, questo potrebbe non riuscire per i campioni più grandi, in tal caso si dovrebbe esaminare l'utilizzo dei grandikmani dalla libreria biganalytics.

0

Penso che molti dei vostri problemi potrebbero essere risolti utilizzando il pacchetto di accento circonflesso. Per quanto riguarda il campionamento casuale con l'appartenenza a classi uguali, lo rimetteremo in SQL, eseguendo solo due query con le dimensioni desiderate per ogni classe specificata. Altri hanno menzionato che RMySql, RODBC o RJDBC avrebbero funzionato bene. Per separare i dati in insiemi di treni e di prova, utilizzare la seguente funzione accento circonflesso:

# 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"]) 

È anche possibile fare la vostra KNN con accento circonflesso, in questo modo:

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

e quindi la previsione è facile:

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

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

È inoltre possibile utilizzare accento circonflesso per la valutazione:

# Generate confusion matrix from class predictions and actual values 

confKNN <- confusionMatrix(testDep, predKNN) 

Anche se personalmente uso l'AUC (tramite il pacchetto pROC) per la valutazione del modello di classificazione in quanto è una misura a grana più fine della forza del classificatore rispetto alla precisione.