Классификация случайных лесов и разделение поезда / теста - PullRequest
0 голосов
/ 22 марта 2019

Я делаю свои первые шаги в машинном обучении в целом и с R в частности. Я использовал python's sklearn и раньше, но я совершенно новичок в R. Для университетского проекта я пытаюсь использовать случайный лес в наборе данных для экспрессии генов в образовательных целях. Я пытаюсь предсказать психические расстройства (биполярное расстройство, депрессия или шизофрения), используя экспрессию генов различных клеток мозга. Мой сценарий в настоящее время выглядит так:

library(randomForest)

train_ind <- sample.int(n = nrow(GSMdata),
                         size = floor(0.75*nrow(GSMdata)),
                         replace = F)
RFtrainSet <- data[,train_ind]
RFtestSet <- data[,-train_ind]
RFtrainLabel <- GSMdata$Disease_State[train_ind]
RFtestLabel <- GSMdata$Disease_State[-train_ind]

RFmodel <- randomForest(x = t(RFtrainSet),
                        y = RFtrainLabel,
                        ntree = 100)

table(RFtestLabel, predict(object = RFmodel, 
                           newdata = t(RFtestSet)))

Где data - это большой матричный объект, а GSMdata - это информационный кадр с особенностью каждого образца (каждый столбец в матрице представляет экспрессию гена каждого образца). Вывод функции table выглядит следующим образом:

RFtestLabel                 bipolar disorder control major depressive disorder schizophrenia
  bipolar disorder                         0       7                         6             7
  control                                  0       7                         6             0
  major depressive disorder                0       5                         2             2
  schizophrenia                            0       1                         7             2

Часто при выборке данных класс не отображается в наборе тестовых данных, как вы можете видеть в приведенном выше примере. Это проблема? Если да, есть ли функция, которая помогает мне получать однородные тестовые образцы?

Пример данных

data матрица:

          GSM1304852  GSM1304853  GSM1304854 GSM1304855 GSM1304856
1007_s_at  2.3945368  2.27518369  2.16116298  1.9641833  2.1322526
1053_at    0.1051084  0.06160802  0.34217618  0.3593916  0.2235696
117_at    -0.4597124 -0.52310349 -0.44360591 -0.6370277 -0.3511470
121_at     0.9333566  1.13180904  0.99756999  1.0079778  0.9720455
1255_g_at -0.2399138  0.10112324 -0.04087979 -0.2185137 -0.2991786

GSMdata пример:

                   title geo_accession Age    Disease_State Gender  pH  PMI Race RIN      tissue
GSM1304852 bipolar_hip_10    GSM1304852  52 bipolar disorder      M 6.7 23.5    W 6.3 hippocampus
GSM1304853 bipolar_hip_11    GSM1304853  50 bipolar disorder      F 6.4 11.7    W 6.8 hippocampus
GSM1304854 bipolar_hip_12    GSM1304854  28 bipolar disorder      F 6.3 22.3    W 7.7 hippocampus
GSM1304855 bipolar_hip_13    GSM1304855  55 bipolar disorder      F 6.4 17.5    W 7.6 hippocampus
GSM1304856 bipolar_hip_14    GSM1304856  58 bipolar disorder      M 6.8 27.7    W 7.0 hippocampus

Ответы [ 2 ]

1 голос
/ 22 марта 2019

Вот быстрое решение dplyr для выборки внутри класса, никакой специальной функции не требуется. В качестве примера я использую набор данных iris, но вы можете быстро адаптировать его к своим данным.

library(dplyr)
data(iris)
labels <- iris %>% dplyr::select(Species) %>% 
    sample_frac(1) %>% 
    group_by(Species) %>% 
    mutate(set = rep(c(rep("train",3),"test"), length.out=n()))

table(labels$Species, labels$set)

             test train
  setosa       12    38
  versicolor   12    38
  virginica    12    38

Также я бы порекомендовал пакет ranger random forest, так как он быстрее.

0 голосов
/ 22 марта 2019

Один из способов сделать это - использовать stratified (из пакета splitstackshape) и sqldf (для выполнения запросов SQL), как показано ниже:

set.seed(1231) 
data(iris)

data <- iris
data$ID <- seq.int(nrow(data)) #Why? remove it and run this again without this bit and you will see the difference.

# making stratified train samples
m_trn <- data.frame((splitstackshape::stratified(data, "Species", 0.5))) #0.5 is percent of training data in each class
m_tst <- (sqldf::sqldf('SELECT * FROM data EXCEPT SELECT * FROM m_trn'))
...