Wie kombiniere ich die Ausgänge von mehreren naiven Bayes Klassifikator?

Ich bin neu hier.

Ich habe eine Reihe von schwachen Klassifikatoren konstruiert mit Naive Bayes Classifier (NBC) in Sklearn Toolkit.

  • Sklearn GaussianNB - schlechte Ergebnisse, [nan] Wahrscheinlichkeiten
  • Geänderte BPMF in PyMC3 mit `LKJCorr` priors: PositiveDefiniteError mit` NUTS`
  • Mein Problem ist, wie kombiniere ich die Ausgabe von jedem der NBC, um endgültige Entscheidung zu treffen. Ich möchte, dass meine Entscheidung in Wahrscheinlichkeiten und nicht Etiketten ist.

    Ich habe das folgende Programm in Python gemacht. Ich nehme 2 Klasse Problem aus Iris-Datensatz in Sklean. Für Demo / Lernen sagen, ich mache eine 4 NBC wie folgt.

    from sklearn import datasets from sklearn.naive_bayes import GaussianNB import numpy as np import cPickle import math iris = datasets.load_iris() gnb1 = GaussianNB() gnb2 = GaussianNB() gnb3 = GaussianNB() gnb4 = GaussianNB() #Actual dataset is of 3 class I just made it into 2 class for this demo target = np.where(iris.target, 2, 1) gnb1.fit(iris.data[:, 0].reshape(150,1), target) gnb2.fit(iris.data[:, 1].reshape(150,1), target) gnb3.fit(iris.data[:, 2].reshape(150,1), target) gnb4.fit(iris.data[:, 3].reshape(150,1), target) #y_pred = gnb.predict(iris.data) index = 0 y_prob1 = gnb1.predict_proba(iris.data[index,0].reshape(1,1)) y_prob2 = gnb2.predict_proba(iris.data[index,1].reshape(1,1)) y_prob3 = gnb3.predict_proba(iris.data[index,2].reshape(1,1)) y_prob4 = gnb4.predict_proba(iris.data[index,3].reshape(1,1)) #print y_prob1, "\n", y_prob2, "\n", y_prob3, "\n", y_prob4 # I just added it over all for each class pos = y_prob1[:,1] + y_prob2[:,1] + y_prob3[:,1] + y_prob4[:,1] neg = y_prob1[:,0] + y_prob2[:,0] + y_prob3[:,0] + y_prob4[:,0] print pos print neg 

    Wie Sie bemerken, habe ich einfach nur die probabilites von jedem von NBC als endgültige Punktzahl hinzugefügt. Ich frage mich, ob das richtig ist?

    Wenn ich es nicht falsch habe, können Sie bitte einige Ideen vorschlagen, damit ich mich selbst korrigieren kann.

  • Wie man eine Liste der positiven und negativen Dezimalzahl auf einen bestimmten Bereich normalisiert
  • Umwandlung einer Liste von ganzen Zahlen in Bereich in Python
  • "Listenindex außerhalb des zulässigen Bereichs" Fehler
  • Identifizieren Sie Gruppen von fortlaufenden Nummern in einer Liste
  • One Solution collect form web for “Wie kombiniere ich die Ausgänge von mehreren naiven Bayes Klassifikator?”

    Zuerst – warum machst du das? Du solltest hier eine Naive Bayes haben. Es sieht so aus, als würdest du die Idee des Klassifikators nicht verstehen. Was du getan hast, ist eigentlich das, was Naive Bayes intern macht – es behandelt jedes Merkmal unabhängig, aber da dies Wahrscheinlichkeiten sind, solltest du sie vermehren oder Logarithmen hinzufügen , also:

    1. Du solltest nur einen NB haben, gnb.fit(iris.data, target)
    2. Wenn Sie darauf bestehen, dass Sie viele NBs haben, sollten Sie sie durch Multiplikation oder Hinzufügung von Logarithmen zusammenführen (was aus mathematischer Perspektive gleich ist, aber die Multiplikation im numerischen Sinne weniger stabil ist)

      pos = y_prob1[:,1] * y_prob2[:,1] * y_prob3[:,1] * y_prob4[:,1]

      oder

      pos = np.exp(np.log(y_prob1[:,1]) + np.log(y_prob2[:,1]) + np.log(y_prob3[:,1]) + np.log(y_prob4[:,1]))

      Sie können auch logarithm durch gnb.predict_log_proba statt gbn.predict_proba direkt gbn.predict_proba .

      Allerdings hat dieser Ansatz einen Fehler – Naive Bayes wird auch vor in jedem Ihrer prob's, so dass Sie sehr schiefe Verteilungen haben. Also musst du manuell normalisieren

      pos_prior = gnb1.class_prior_[1] # alle Modelle haben das gleiche vorher so können wir die von gnb1 verwenden

      pos = pos_prior_ * (y_prob1[:,1]/pos_prior_) * (y_prob2[:,1]/pos_prior_) * (y_prob3[:,1]/pos_prior_) * (y_prob4[:,1]/pos_prior_)

      Was sich vereinfacht

      pos = y_prob1[:,1] * y_prob2[:,1] * y_prob3[:,1] * y_prob4[:,1] / pos_prior_**3

      Und für log zu

      pos = ... - 3 * np.log(pos_prior_)

      Also noch einmal – du solltest die Option "1" verwenden.

    Python ist die beste Programmiersprache der Welt.