2017-09-03 3 views
-1

J'ai le problème suivant: Je voudrais pédaler un facteur-variable "cancer" (oui ou non) en utilisant deux variables "sexe" et "groupe d'âge" avec un classificateur Bayes. Ce sont mes données d'échantillon (fictif):Naive Bayes Classification avec R - résultat étrange

install.packages("e1071") 
install.packages("gmodels") 
library(e1071) 
library(gmodels) 

data<-read.csv("http://www.reduts.net/cancer.csv", sep=";", stringsAsFactors = T) 

## Sex and Agegroup ## 
###################### 

# classification 
testset<-data[,c("sex", "agegroup")] 
cancer<-data[,"cancer"] 
model<-naiveBayes(testset, cancer) 
model 

# apply model on testset 
testset$predicted<-predict(model, testset) 
testset$cancer<-cancer 

CrossTable(testset$predicted, testset$cancer, prop.chisq=F, prop.r=F, prop.c=F, prop.t = F) 

Le résultat me montre que, selon mes données les hommes et les jeunes sont plus susceptibles d'avoir un cancer. Par rapport à la classification réelle du cancer, mon modèle classe 147 (= 88 + 59) sur 200 cas correctement (73,5%).

    | testset$original 
testset$predicted |  no |  yes | Row Total | 
------------------|-----------|-----------|-----------| 
       no |  88 |  12 |  100 | 
------------------|-----------|-----------|-----------| 
       yes |  54 |  46 |  100 | 
------------------|-----------|-----------|-----------| 
    Column Total |  142 |  58 |  200 | 
------------------|-----------|-----------|-----------| 

Cependant, alors que je faisais la même chose en utilisant une seule variable classement (sexe):

## Sex only   ## 
###################### 

# classification 
testset2<-data[,c("sex")] 
cancer<-data[,"cancer"] 
model2<-naiveBayes(testset2, cancer) 
model2 

Le modèle se présente comme suit:

Naive Bayes Classifier for Discrete Predictors 

Call: 
naiveBayes.default(x = testset2, y = cancer) 

A-priori probabilities: 
cancer 
    no yes 
0.645 0.355 

Conditional probabilities: 
     x 
cancer   f   m 
    no 0.4573643 0.5426357 
    yes 0.5774648 0.4225352 

De toute évidence, les hommes sont plus susceptibles d'avoir un cancer par rapport aux femmes (54% vs 46%).

# apply model on testset 
testset2$predicted<-predict(model2, testset2) 
testset2$cancer<-cancer 

CrossTable(testset2$predicted, testset2$cancer, prop.chisq=F, prop.r=F, prop.c=F, prop.t = F) 

Maintenant, quand je demande mon modèle aux données d'origine, tous les cas sont classés comme la même classe:

Total Observations in Table: 200 

        | testset2$cancer 
testset2$predicted |  no |  yes | Row Total | 
-------------------|-----------|-----------|-----------| 
       no |  129 |  71 |  200 | 
-------------------|-----------|-----------|-----------| 
     Column Total |  129 |  71 |  200 | 
-------------------|-----------|-----------|-----------| 

Quelqu'un peut-il s'il vous plaît me expliquer, pourquoi les femmes et les hommes sont affectés à la même classe?

Répondre

1

Vous interprétez mal ces sorties. Lorsque vous imprimez model2 et voir

Conditional probabilities: 
     x 
cancer   f   m 
    no 0.4573643 0.5426357 
    yes 0.5774648 0.4225352 

Il est faux de conclure "De toute évidence, les hommes sont plus susceptibles d'avoir un cancer par rapport aux femmes (54% vs 46%)."

Qu'est-ce que ce tableau nous dit est les quatre numéros

P(female | no cancer)  P(male | no cancer) 
P(female | cancer)  P(male | cancer) 

Il est facile de voir cela en regardant la sortie de

table(cancer, testset2) 
     testset2 
cancer f m 
    no 59 70 
    yes 41 30 

Le premier ligne de probabilités conditionnelles à partir du modèle peut être calculée comme suit: 129 personnes n'ont pas de cancer. 59/129 = 0.4573643 sont des femmes. 70/129 = 0,5426357 sont des hommes. Donc, la façon de lire cette première ligne est "Étant donné qu'un patient n'a pas de cancer, il est plus probable qu'il soit un homme (54% vs 46%)".

Maintenant à votre question: Quelqu'un peut-il m'expliquer s'il vous plaît, pourquoi les deux les femmes et les hommes sont affectés à la même classe?

décider quelle classe les hommes sera attribué à, vous devez comparer
P(Cancer | Male) avec P(No Cancer | male).Quel que soit le plus grand, nous déclarons pour indiquer la classe. Lorsque vous utilisez Naïf Bayes, ces sont estimées en appliquant la règle de reformuler cette Bayes comme comparaient

P(Cancer | Male) = P(Male | Cancer) * P(Cancer)/P(Male) 
with 
P(No Cancer | Male) = P(Male | No Cancer) * P(No Cancer)/P(Male) 

Les dénominateurs sont les mêmes dans les deux cas, si nous nous soucions seulement qui est plus grand, nous peut comparer la taille des

P(Male | Cancer) * P(Cancer) avec P(Male | No Cancer) * P(No Cancer)

Ce sont exactement t Les chiffres sont signalés lorsque vous imprimez le modèle.

Ainsi, pour les hommes

P(Male | Cancer) * P(Cancer)  = 0.4225352 * 0.355 = 0.15 
P(Male | No Cancer) * P(No Cancer) = 0.5426357 * 0.645 = 0.35 

(Note: ce ne sont pas des probabilités réelles parce que nous ignorions le dénominateur P(Male)) Aucun cancer a le plus grand nombre, nous prévoyons Aucun cancer chez les hommes.

De même, pour les femmes, nous calculons

P(Female | Cancer) * P(Cancer)  = 0.5774648 * 0.355 = 0.205 
P(Female | No Cancer) * P(No Cancer) = 0.4573643 * 0.645 = 0.295 

et pour les femmes aussi, nous prédisons pas de cancer. Il peut être utile de souligner ce calcul pour les femelles. Même si P(Female | Cancer) > P(Female | No Cancer), ils sont pondérés par les probabilités globales P(Cancer) et P(No Cancer).
Puisque globalement il est plus probable d'avoir aucun cancer plutôt que le cancer, que commute qui est plus grand. Naïve Bayes prédit No Cancer pour les deux sexes.