Подтвердить что ты не робот

Как пробовать большую базу данных и реализовывать K-средства и K-nn в R?

Я новый пользователь R, пытаясь отойти от SAS. Я задаю этот вопрос здесь, так как я чувствую себя немного расстроенным со всеми пакетами и источниками, доступными для R, и я не могу заставить эту работу работать в основном из-за размера данных.

У меня есть следующее:

Таблица, называемая SOURCE, в локальной базе данных MySQL с 200 функциями прогнозирования и одной переменной класса. В таблице 3 миллиона записей и 3 ГБ. Количество экземпляров в классе не равно.

Я хочу:

  • Случайно выберите базу данных SOURCE, чтобы создать меньший набор данных с равным количеством экземпляров на класс.
  • Разделите образец на тренировочный и тестовый набор.
  • Preform k - означает кластеризацию на тренировке, предназначенную для определения k центроидов на класс.
  • Предварительная классификация тестовых данных k-NN с центроидами.
4b9b3361

Ответ 1

Я бы продолжил:

1) Извлеките список идентификаторов вашей таблицы в R, вы можете сделать это с помощью простого SQL-запроса, используя библиотеку RMySQL.

2) Разделите идентификаторы любым способом, который вам нравится в R, а затем повторите последующие SQL-запросы с помощью RMySQL (я нашел это двухступенчатый подход намного быстрее, чем выборка непосредственно в MySQL).

3) В зависимости от того, насколько велика ваша выборка, вы могли бы уйти, используя базовую реализацию R kmeans, это, однако, может не сработать для более крупных образцов, в этом случае вы должны изучить использование bigkmeans из библиотеки biganalytics.

Ответ 2

Я могу помочь вам по двум вопросам. 1- стратифицированная выборка 2-разделенное обучение и тестирование (т.е. Проверка калибровки)

        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)

Ответ 3

Я думаю, что многие из ваших проблем могут быть решены с помощью пакета caret. Что касается случайной выборки с равным членством класса, я бы отбросил ее обратно в 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) для оценки модели классификации, поскольку это более мелкозернистая мера прочности классификатора, чем точность.