2015-01-31 7 views
7

Sto implementando la regressione logistica. Sono riuscito a tirarne fuori le probabilità e sono in grado di prevedere un compito di classificazione di 2 classi.tracciamento del limite decisionale della regressione logistica

La mia domanda è:

Per il mio modello finale, ho pesi e dati di addestramento. Ci sono 2 funzioni, quindi il mio peso è un vettore con 2 righe.

Come si traccia questo? Ho visto this post, ma non capisco la risposta. Ho bisogno di una trama di contorno?

risposta

20

Un vantaggio del classificatore di regressione logistica è che una volta adattato, è possibile ottenere probabilità per qualsiasi vettore campione. Questo potrebbe essere più interessante da tracciare. Ecco un esempio utilizzando 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") 

In primo luogo, elaborare i dati e montare il classificatore al training set:

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

Avanti, fare una griglia continua di valori e di valutare la probabilità di ogni (x, y) punto nella griglia:

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) 

Ora, tracciare la griglia probabilità come mappa di contorno e inoltre mostrare i campioni test set su di esso:

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

La regressione logistica consente ai tuoi nuovi campioni Classificare basate su una soglia che si desidera, in modo da non avere uno intrinsecamente "confine decisione". Ma, ovviamente, una regola di decisione comune da usare è p = .5. Possiamo anche solo disegnare quel livello di contorno utilizzando il codice di cui sopra:

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

ho ragione di aver importato 'seaborn' ma in realtà non l'ho usato nella tua risposta? Non ho familiarità con quella libreria, solo controllando se è necessario per la risposta. – Rhubarb

+1

@Zhubarb: Seaborn sovrascrive molte delle configurazioni predefinite di matplotlib non appena lo si importa. Quindi, se non hai bisogno di alcuna funzionalità che Seaborn fornisca direttamente, ma desideri semplicemente matplotlib per sembrare MOLTO migliore di quanto non lo sia per impostazione predefinita, tutto ciò che devi fare è inport seaborn e fare affari con matplotlib – Gus

+0

@Gus Ho un errore a 'probs = clf.predict_probs (grid) [:, 1] .reshape (xx.shape)' dicendo che l'oggetto 'AttributeError: 'LogisticRegression' non ha attributo 'predicict_probs'' sto perdendo qualcosa? –