Различные результаты работы наивного Байеса в Python sklearn vs. R bnlearn - PullRequest
0 голосов
/ 30 января 2019

Я пробовал наивные байесы как в Python, так и в R, и получил разные значения AUROC.Почему это так?

R Код:

library(bnlearn)
library(pROC)
library(tm)

corpus <- VCorpus(VectorSource(paste(data$TEXT, sep = ' ')))
dtm <- DocumentTermMatrix(corpus, control = list(tolower = TRUE,
                                  removeNumbers = FALSE,
                                  stopwords = TRUE,
                                  removePunctuation = TRUE,
                                  stemming = TRUE))
convert_codes <- function(x) { x <- ifelse(x > 0, 1, 0) }
dtm <- apply(dtm, MARGIN = 2,convert_codes) 
dtm <- as.data.frame(dtm)

model <- naive.bayes(dtm, approval, colnames(dtm)[-length(dtm)])


preds <- predict(model, dtm, prior = c(0.5, 0.5), prob = TRUE)
data$SCORE <- t(attr(preds, "prob"))[,2]
data$SCORE[is.nan(data$SCORE)] <- 0
print(auc(data$APPROVAL, data$SCORE))

Результат = 0,93

Код Python:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import roc_auc_score
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import MultinomialNB

pipe = Pipeline([
    ('vectorizer', CountVectorizer()),
    ('model', MultinomialNB())
])

pipe.fit(data["TEXT"], data["APPROVAL"])
preds = pipe.predict_proba(data["TEXT"])
print(roc_auc_score(data["APPROVAL"], preds[:,1]))

Результат = 0,76

Почему существует такое большое расхождение?

1 Ответ

0 голосов
/ 30 января 2019

Конвейеры, которые вы определили в R и Python, не одинаковы:

  • В R параметр weighting для DocumentTermMatrix по умолчанию равен weightTf и, следовательно, не принимает компонент idfв учетную запись.
  • В Python TfidfVectorizer имеет параметр по умолчанию use_idf=True, следовательно, он использует компонент idf.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...