2015-01-31 18 views
7

Ich bin mit der Durchführung der logistischen Regression. Ich habe es geschafft, Wahrscheinlichkeiten daraus zu ziehen, und bin in der Lage, eine 2-Klassen-Klassifizierungsaufgabe vorherzusagen.Plotten Entscheidungsgrenze der logistischen Regression

Meine Frage ist:

Für mein letztes Modell, ich habe Gewichte und die Trainingsdaten. Es gibt 2 Merkmale, also ist mein Gewicht ein Vektor mit 2 Reihen.

Wie zeichne ich das? Ich sah this post, aber ich verstehe die Antwort nicht ganz. Brauche ich ein Konturdiagramm?

Antwort

20

Ein Vorteil des logistischen Regressions-Klassifikators ist, dass Sie nach der Anpassung Wahrscheinlichkeiten für jeden beliebigen Vektor erhalten können. Das könnte interessanter sein zu plotten. Hier ist ein Beispiel mit Scikit-Learn:

import numpy as np 
from sklearn.linear_model import LogisticRegression 
from sklearn.datasets import make_classification 
import matplotlib.pyplot as plt 
import seaborn as sns 
sns.set(style="white") 

Zuerst die Daten erzeugen und den Klassifikator zu dem Trainingssatz passen:

X, y = make_classification(200, 2, 2, 0, weights=[.5, .5], random_state=15) 
clf = LogisticRegression().fit(X[:100], y[:100]) 

nächste ein kontinuierliches Gitter von Werten machen und die Wahrscheinlichkeit jedem bewerten (x, y) Punkt in dem Gitter:

xx, yy = np.mgrid[-5:5:.01, -5:5:.01] 
grid = np.c_[xx.ravel(), yy.ravel()] 
probs = clf.predict_proba(grid)[:, 1].reshape(xx.shape) 

Nun plotten die Wahrscheinlichkeitsraster als Kontur Karte und zeigen zusätzlich die Testset Proben auf es:

01.235.
f, ax = plt.subplots(figsize=(8, 6)) 
contour = ax.contourf(xx, yy, probs, 25, cmap="RdBu", 
         vmin=0, vmax=1) 
ax_c = f.colorbar(contour) 
ax_c.set_label("$P(y = 1)$") 
ax_c.set_ticks([0, .25, .5, .75, 1]) 

ax.scatter(X[100:,0], X[100:, 1], c=y[100:], s=50, 
      cmap="RdBu", vmin=-.2, vmax=1.2, 
      edgecolor="white", linewidth=1) 

ax.set(aspect="equal", 
     xlim=(-5, 5), ylim=(-5, 5), 
     xlabel="$X_1$", ylabel="$X_2$") 

enter image description here

Die logistische Regression lässt Ihre Klassifizieren neue Proben basierend auf einer beliebigen Schwelle Sie wollen, so dass es nicht von Natur aus eine haben „Entscheidungsgrenze.“ Aber eine gemeinsame Entscheidungsregel ist natürlich p = 0,5. Wir können auch ziehen genau das Konturebene der obigen Code verwendet:

f, ax = plt.subplots(figsize=(8, 6)) 
ax.contour(xx, yy, probs, levels=[.5], cmap="Greys", vmin=0, vmax=.6) 

ax.scatter(X[100:,0], X[100:, 1], c=y[100:], s=50, 
      cmap="RdBu", vmin=-.2, vmax=1.2, 
      edgecolor="white", linewidth=1) 

ax.set(aspect="equal", 
     xlim=(-5, 5), ylim=(-5, 5), 
     xlabel="$X_1$", ylabel="$X_2$") 

enter image description here

+0

Bin ich richtig, dass Sie importiert haben 'seaborn' aber tatsächlich nicht in Ihrer Antwort verwendet? Ich bin mit dieser Bibliothek nicht vertraut und überprüfe nur, ob es für die Antwort notwendig ist. – Rhubarb

+1

@Zhubarb: Seaborn überschreibt viele der Standardkonfigurationen von Matplotlib, sobald Sie es importieren. Also, wenn Sie keine Funktionalität benötigen, die Seaborn direkt bietet, aber wollen nur Matplotlib VIEL besser als es standardmäßig aussieht, alles, was Sie tun müssen, ist Seaborn zu importieren und gehen Sie über Ihr Geschäft mit Matplotlib – Gus

+0

@Gus Ich bekomme einen Fehler bei 'probs = clf.predict_probs (Gitter) [:, 1] .reshape (xx.shape)' sagen, dass 'AttributeError:' LogisticRegression 'Objekt hat kein Attribut' predicate_probs'? Fehle ich etwas? –

Verwandte Themen