Поиск…


Удаление функций с нулевой или почти нулевой дисперсией

Хорошим кандидатом для удаления является функция, имеющая почти нулевую дисперсию.

Вы можете вручную определить числовую дисперсию ниже своего собственного порога:

data("GermanCredit")
variances<-apply(GermanCredit, 2, var)
variances[which(variances<=0.0025)]

Или вы можете использовать пакет каретки, чтобы найти почти нулевую дисперсию. Преимущество здесь заключается в том, что определяется почти нулевая дисперсия не в численном расчете дисперсии, а скорее как функция редкости:

«nearZeroVar диагностирует предиктора, которые имеют одно уникальное значение (т. е. являются предикторами с нулевой дисперсией) или предикторами, которые имеют обе следующие характеристики: у них очень мало уникальных значений по сравнению с количеством выборок и отношением частоты наиболее распространенного значения к частоте второго наиболее распространенного значения большое ... "

library(caret)
names(GermanCredit)[nearZeroVar(GermanCredit)]

Удаление функций с большим количеством NA

Если функция в основном не содержит данных, она является хорошим кандидатом для удаления:

library(VIM)
data(sleep)
colMeans(is.na(sleep))

   BodyWgt   BrainWgt       NonD      Dream      Sleep       Span       Gest 
0.00000000 0.00000000 0.22580645 0.19354839 0.06451613 0.06451613 0.06451613 
      Pred        Exp     Danger 
0.00000000 0.00000000 0.00000000 

В этом случае мы можем захотеть удалить NonD и Dream, каждый из которых имеет около 20% отсутствующих значений (ваше обрезание может отличаться)

Удаление тесно связанных функций

Близко коррелированные функции могут добавить отклонения в вашу модель, и удаление одной из коррелированных пар может помочь уменьшить это. Существует множество способов обнаружения корреляции. Вот один из них:

library(purrr) # in order to use keep()

# select correlatable vars
toCorrelate<-mtcars %>% keep(is.numeric)

# calculate correlation matrix
correlationMatrix <- cor(toCorrelate)

# pick only one out of each highly correlated pair's mirror image
correlationMatrix[upper.tri(correlationMatrix)]<-0  

# and I don't remove the highly-correlated-with-itself group
diag(correlationMatrix)<-0 

# find features that are highly correlated with another feature at the +- 0.85 level
apply(correlationMatrix,2, function(x) any(abs(x)>=0.85))

  mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb 
 TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

Я хочу посмотреть на то, что MPG коррелирует так сильно, и решить, что сохранить и что бросить. То же самое для цил и disp. В качестве альтернативы мне может потребоваться объединить некоторые сильно коррелированные функции.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow