Eu tenho um conjunto de dados chamado spam
que contém 58 colunas e aproximadamente 3500 linhas de dados relacionadas a mensagens de spam.
Planejo executar alguma regressão linear neste conjunto de dados no futuro, mas gostaria de fazer um pré-processamento antecipado e padronizar as colunas para ter média zero e variação de unidade.
Foi-me dito que a melhor maneira de fazer isso é com o R, então gostaria de perguntar como posso alcançar a normalização com o R ? Eu já tenho os dados carregados corretamente e estou apenas procurando por alguns pacotes ou métodos para executar esta tarefa.
fonte
Percebendo que a pergunta é antiga e uma resposta é aceita, fornecerei outra resposta para referência.
scale
é limitado pelo fato de dimensionar todas as variáveis . A solução abaixo permite dimensionar apenas nomes de variáveis específicos, preservando outras variáveis inalteradas (e os nomes de variáveis podem ser gerados dinamicamente):o que me dá o seguinte:
e
EDIT 1 (2016) : Abordado o comentário de Julian: a saída de
scale
é a matriz Nx1, então idealmente devemos adicionar umas.vector
para converter o tipo de matriz novamente em um tipo vetorial. Obrigado Julian!EDIT 2 (2019) : Citando o comentário de Duccio A.: Para o dplyr mais recente (versão 0.8), você precisa alterar dplyr :: funcs com list, como
dat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
EDIT 3 (2020) : Graças a @mj_whales: a solução antiga foi preterida e agora precisamos usá-la
mutate_at
.fonte
f(g(x))
, pareceria melhor se alguém escrevessex %>% g %>% f
. Em outras palavras,dat %>% mutate_each_(funs(scale),vars=c("y","z"))
é justomutate_each_(dat,funs(scale),vars=c("y","z"))
. O operador ajuda muito quando uma cadeia é muito longa, poisf(g(h(i(j(x)))))
pode ser muito difícil de ler.dplyr
(versão 0.8), você precisa mudardplyr::funcs
comlist
, comodat %>% mutate_each_(list(~scale(.) %>% as.vector), vars=c("y","z"))
mutate_each_()
agora está obsoleto. Você pode usar em seumutate_at()
lugar. A nova maneira de fazer isso seria:dat2 <- dat %>% mutate_at(c("y", "z"), scale)
Isso tem 3 anos. Ainda assim, sinto que tenho que adicionar o seguinte:
A normalização mais comum é a transformação z , onde você subtrai a média e divide pelo desvio padrão de sua variável. O resultado terá média = 0 e sd = 1.
Para isso, você não precisa de nenhum pacote.
É isso aí.
fonte
mutate(var = (var - mean(var))/sd(var))
.myVar <- (zVar * sd(zVar)) + mean(zVar)
, certo?newVar <- (zVar * sd(myVar)) + mean(myVar)
. Você precisa usar a média / sd original. Conforme você o escreveu, você multiplicarásd(zVar)=1
e adicionarámean(zVar)=0
, para que nada mude :)O pacote 'Caret' fornece métodos para pré-processamento de dados (por exemplo, centralização e dimensionamento). Você também pode usar o seguinte código:
Mais detalhes: http://www.inside-r.org/node/86978
fonte
Quando usei a solução declarada por Dason, em vez de obter um quadro de dados como resultado, obtive um vetor de números (os valores dimensionados do meu df).
Caso alguém esteja tendo o mesmo problema, você deve adicionar as.data.frame () ao código, assim:
Espero que seja útil para pessoas com o mesmo problema!
fonte
train_dt[-24] <- scale(train_dt[-24])
onde "24" é o número da coluna a ser excluídaVocê pode facilmente normalizar os dados também usando a função data.Normalization no pacote clusterSim. Ele fornece um método diferente de normalização de dados.
Argumentos
x
vetor, matriz ou tipo de conjunto de dados
de normalização: n0 - sem normalização
n1 - padronização ((média x) / dp)
n2 - padronização posicional ((x-mediana) / mad)
n3 - unitização ((média x) / intervalo)
n3a - unitização posicional ((x-mediana) / intervalo)
n4 - unitização com zero mínimo ((x-min) / faixa)
n5 - normalização no intervalo <-1,1> ((média-x) / máx (abs (média-x)))
n5a - normalização posicional no intervalo <-1,1> ((x-mediana) / máx (abs (x-mediana)))
n6 - transformação de quociente (x / sd)
n6a - transformação de quociente posicional (x / mad)
n7 - transformação de quociente (x / intervalo)
n8 - transformação de quociente (x / max)
n9 - transformação de quociente (x / média)
n9a - transformação do quociente posicional (x / mediana)
n10 - transformação de quociente (x / soma)
n11 - transformação de quociente (x / sqrt (SSQ))
n12 - normalização ((média x) / sqrt (soma ((média x) ^ 2)))
n12a - normalização posicional ((x-mediana) / sqrt (soma ((x-mediana) ^ 2))))
n13 - normalização com zero sendo o ponto central ((faixa intermediária x) / (faixa / 2))
normalização
"coluna" - normalização por variável, "linha" - normalização por objeto
fonte
Com a
dplyr
v0.7.4, todas as variáveis podem ser dimensionadas usandomutate_all()
:Variáveis específicas podem ser excluídas usando
mutate_at()
:Criado em 24/04/2018 pelo pacote reprex (v0.2.0).
fonte
Novamente, mesmo que essa seja uma pergunta antiga, é muito relevante! E eu encontrei uma maneira simples de normalizar determinadas colunas sem a necessidade de nenhum pacote:
Por exemplo
Você verá que as colunas y e z foram normalizadas. Não são necessários pacotes :-)
fonte
A escala pode ser usada para o quadro de dados completo e colunas específicas. Para colunas específicas, o seguinte código pode ser usado:
Quadro de dados completo
fonte
O
dplyr
pacote tem duas funções que fazem isso.A sofrer mutações específicas colunas de uma tabela de dados, você pode usar a função
mutate_at()
. Para alterar todas as colunas, você pode usarmutate_all
.A seguir, é apresentado um breve exemplo do uso dessas funções para padronizar dados.
Mude colunas específicas:
Mude todas as colunas:
fonte
Antes de encontrar esse tópico, tive o mesmo problema. Eu tinha tipos de colunas dependentes do usuário, então escrevi um
for
loop passando por eles e obtendo as colunas necessáriasscale
'd. Provavelmente existem maneiras melhores de fazer isso, mas isso resolveu o problema muito bem:as.vector
é uma parte necessária, porque acabouscale
fazrownames x 1
matriz que geralmente não é o que você quer ter na suadata.frame
.fonte
Use o pacote "recomenderlab". Baixe e instale o pacote. Este pacote possui um comando "Normalizar" incorporado. Também permite que você escolha um dos muitos métodos para normalização, ou seja, 'centro' ou 'escore Z'. Siga o exemplo a seguir:
fonte
A função normalizar do pacote BBMisc foi a ferramenta certa para mim, pois pode lidar com os valores de NA.
Aqui está como usá-lo:
Dado o seguinte conjunto de dados,
valores normalizados podem ser obtidos assim:
onde o método calculado manualmente ignora colmuns contendo NAs:
(normalizedHuman é feita uma lista de NAs ...)
com relação à seleção de colunas específicas para cálculo, um método genérico pode ser empregado como este:
fonte
O @BBKim praticamente deu a melhor resposta, mas isso pode ser feito mais curto. Estou surpreso que ninguém tenha pensado nisso ainda.
dat <- data.frame(x = rnorm(10, 30, .2), y = runif(10, 3, 5)) dat <- apply(dat, 2, function(x) (x - mean(x)) / sd(x))
fonte