2012-12-02 11 views
13

Jestem nowym użytkownikiem R, próbując odejść od SAS. Zadaję tutaj to pytanie, ponieważ czuję się trochę sfrustrowany wszystkimi pakietami i źródłami dostępnymi dla R, i nie mogę sprawić, żeby to działało głównie ze względu na rozmiar danych.Jak wypróbować dużą bazę danych i zaimplementować K-średnie i K-nn w R?

mam następujące:

tabeli o nazwie źródła w lokalnej bazie danych MySQL z 200 funkcji predykcyjnych i jednej zmiennej klasy. Stół ma 3 miliony rekordów i ma pojemność 3 GB. Liczba instancji na klasę nie jest równa.

chcę:

  1. losowo próbki źródłowej bazy danych, aby stworzyć mniejszy zbiór danych o z równej liczby wystąpień w każdej klasie.
  2. Podziel próbkę na zestaw szkoleniowy i testowy.
  3. Preformowanie k-średnich w zestawie treningowym w celu ustalenia k centroidów na klasę.
  4. Preforma k-NN klasyfikacji danych testowych za pomocą centroidów.
+5

Witamy w So! Proponuję: pakiet ** RMysqlite ** do wyodrębnienia danych, * próbka * funkcja (pakiet ** base **) do próbkowania! * funkcja kmeans * (pakiet ** baza)! * knn * funkcja (** klasa ** pakiet) – agstudy

+0

Jak obsługiwać duże dane? Problem z bazą danych, wstępne próbkowanie jest przechowywane w pamięci. Masz tylko 4GB pamięci RAM. – erichfw

+2

Spróbuj użyć mechanizmu db do przeprowadzenia losowego wyboru: http://stackoverflow.com/q/580639/269476. – James

Odpowiedz

0

Mogę Ci pomóc na dwa pytania. 1- losowanie warstwowe 2-split szkolenia & badania (tj kalibracja walidacja)

 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

Sposób chciałbym kontynuować to:

1) Wyciąg listę identyfikatorów stole do badań, można zrób to za pomocą prostej kwerendy SQL przy użyciu biblioteki RMySQL.

2) Podziel te identyfikatory w dowolny sposób w R, a następnie wykonaj kolejne zapytania SQL ponownie, używając RMySQL (Dwukrokowe podejście okazało się znacznie szybsze niż próbkowanie bezpośrednio w MySQL).

3) W zależności od tego, jak duża jest twoja próbka, możesz uciec, stosując podstawową implementację R kmeans, to jednak może się nie udać w przypadku większych próbek, w takim przypadku powinieneś przyjrzeć się używaniu bigkmeans z biblioteki biganalytics.

0

Myślę, że wiele z twoich problemów można rozwiązać za pomocą pakietu Caret. Jeśli chodzi o losowe próbkowanie z równym członkostwem w klasie, popchnąłbym to z powrotem do SQL, po prostu uruchomiłem dwa zapytania o żądanym rozmiarze dla każdej określonej klasy. Inni wspomnieli, że RMySql, RODBC lub RJDBC również by działały. Do rozdzielania danych do składów i testowych, należy użyć następującego daszka funkcję:

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

można też zrobić swoją KNN za pomocą daszka, na przykład:

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

i przewidywania jest proste:

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

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

można również użyć daszka dla oceny:

# Generate confusion matrix from class predictions and actual values 

confKNN <- confusionMatrix(testDep, predKNN) 

Chociaż osobiście używam AUC (za pośrednictwem pakietu pROC) do oceny modelu klasyfikacji, ponieważ jest to dokładniejsza miara siły klasyfikatora niż dokładność.

Powiązane problemy