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$")
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$")
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
@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
@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? –