Eu recebi um script R de alguém para executar um modelo de floresta aleatório. Modifiquei e executei com alguns dados de funcionários. Estamos tentando prever separações voluntárias.
Aqui estão algumas informações adicionais: este é um modelo de classificação em que 0 = funcionário permaneceu, 1 = funcionário desligado, atualmente estamos apenas olhando para uma dúzia de variáveis preditivas, os dados são "desequilibrados", pois os registros do termo compõem cerca de 7 % do conjunto total de registros.
Eu corro o modelo com várias seleções mtry e ntree, mas resolvi o seguinte. O OOB é 6,8%, o que eu acho bom, mas a matriz de confusão parece contar uma história diferente para a previsão de termos, já que a taxa de erro é bastante alta em 92,79%. Estou certo ao supor que não posso confiar e usar esse modelo porque a alta taxa de erro para prever termos? ou há algo que eu possa fazer para usar a RF e obter uma taxa de erro menor para prever termos?
FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree OOB 1 2
100: 6.97% 0.47% 92.79%
200: 6.87% 0.36% 92.79%
300: 6.82% 0.33% 92.55%
400: 6.80% 0.29% 92.79%
500: 6.80% 0.29% 92.79%
> print(FOREST_model)
Call:
randomForest(formula = theFormula, data = trainset, mtry = 3, ntree = 500, importance = TRUE, do.trace = 100)
Type of random forest: classification
Number of trees: 500
No. of variables tried at each split: 3
OOB estimate of error rate: 6.8%
Confusion matrix:
0 1 class.error
0 5476 16 0.002913328
1 386 30 0.927884615
> nrow(trainset)
[1] 5908
fonte
Seu aparelho está bastante desequilibrado - a RF geralmente falha nesse cenário (ou seja, prediz bem apenas a classe maior).
Você deve tentar equilibrar seu conjunto amostrando a classe "0" apenas para ter o mesmo tamanho da classe "1" ou tocando com o
classwt
parâmetrofonte
classwt
parâmetro, acho que ele ainda não está implementado narandomForest()
função dorandomForest
pacote em R. Per Link . Você já usou isso antes? Eu tentei com valores diferentes, mas obtive resultados idênticos ao padrãoclasswt=NULL
.Com base na sua matriz de confusão, você possui 5.908 pontos de dados e a vasta e vasta maioria deles é do tipo 0 ('funcionário ficou'). O classificador pode, portanto, ser "preguiçoso" e escolher a classe majoritária, a menos que seja absolutamente certo que um exemplo pertence à outra classe. Observe que sua taxa de erro geral é de ~ 7%, o que é bastante próximo da porcentagem de exemplos da Classe 1!
Você tem algumas opções:
Descarte exemplos de Class0 até ter classes aproximadamente equilibradas. Não sei se há literatura sobre como escolher um subconjunto idealmente representativo (talvez alguém possa pesar?), Mas você pode começar soltando exemplos aleatoriamente. Você pode passar um
subset
argumento para randomForest, o que deve tornar esse teste trivial.Ajuste seus pesos de função / classe de perda para compensar o número desproporcional de Class0. Você quer essencialmente tornar muito mais caro para o classificador classificar incorretamente um exemplo de Classe1 do que um de Classe0. Pode fazer sentido tentar Class0 = 1 / 0.07 ~ = 14x Class1 para iniciar, mas convém ajustar isso com base nas demandas de seus negócios (quanto pior é um tipo de erro). Eu acho que o
classwt
parâmetro é o que você está procurando aqui.Use amostragem estratificada para garantir que você tenha exemplos de ambas as classes nos dados de treinamento das árvores. É possível que algumas de suas árvores tenham sido treinadas apenas nos dados da Classe 0, o que obviamente será um mau presságio para o desempenho de generalização. Confira o
strata
argumento.fonte