R Language
Выбор функции в R - Удаление внешних функций
Поиск…
Удаление функций с нулевой или почти нулевой дисперсией
Хорошим кандидатом для удаления является функция, имеющая почти нулевую дисперсию.
Вы можете вручную определить числовую дисперсию ниже своего собственного порога:
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. В качестве альтернативы мне может потребоваться объединить некоторые сильно коррелированные функции.