2

Was ist der richtige Weg scikit-learn 's LogisticRegression Löser zu verwenden, wenn Sie nur eine numerische Funktion haben?Logistische Regression mit nur einer numerischen Funktion

Ich lief ein einfaches Beispiel, das ich schwer zu erklären fand. Kann mir bitte jemand erklären, was ich hier falsch mache?

import pandas 
import numpy as np 
from sklearn.linear_model import LogisticRegression 

X = [1, 2, 3, 10, 11, 12] 
X = np.reshape(X, (6, 1)) 
Y = [0, 0, 0, 1, 1, 1] 
Y = np.reshape(Y, (6, 1)) 

lr = LogisticRegression() 

lr.fit(X, Y) 
print ("2 --> {0}".format(lr.predict(2))) 
print ("4 --> {0}".format(lr.predict(4))) 

Dies ist die Ausgabe erhalte ich, wenn das Skript ausgeführt wird beendet. Sollte die Vorhersage für 4 nicht 0 sein, da gemäß der Gaußschen Verteilung 4 näher an der Verteilung ist, die gemäß dem Testsatz als 0 klassifiziert wird?

2 --> [0] 
4 --> [1] 

Welchen Ansatz verfolgt die logistische Regression, wenn Sie nur eine Spalte mit numerischen Daten haben?

Antwort

4

Sie Umgang mit einer einzigen Funktion richtig, aber Sie gehen davon aus falsch, dass nur weil 4 an die 0 Klasse Merkmale nahe, dass sie auch als solche vorausgesagt werden würden

Sie Ihre Trainingsdaten dargestellt werden können, zusammen mit die S-förmige Funktion, eine Schwelle von y=0.5 für die Einstufung unter der Annahme, und die gelernten Koeffizienten und fängt von Ihrem Regressionsmodell:

import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.linear_model import LogisticRegression 

X = [1, 2, 3, 10, 11, 12] 
X = np.reshape(X, (6, 1)) 
Y = [0, 0, 0, 1, 1, 1] 
Y = np.reshape(Y, (6, 1)) 

lr = LogisticRegression() 
lr.fit(X, Y) 

plt.figure(1, figsize=(4, 3)) 
plt.scatter(X.ravel(), Y, color='black', zorder=20) 

def model(x): 
    return 1/(1 + np.exp(-x)) 

X_test = np.linspace(-5, 15, 300) 
loss = model(X_test * lr.coef_ + lr.intercept_).ravel() 

plt.plot(X_test, loss, color='red', linewidth=3) 
plt.axhline(y=0, color='k', linestyle='-') 
plt.axhline(y=1, color='k', linestyle='-') 
plt.axhline(y=0.5, color='b', linestyle='--') 
plt.axvline(x=X_test[123], color='b', linestyle='--') 

plt.ylabel('y') 
plt.xlabel('X') 
plt.xlim(0, 13) 
plt.show() 

Hier ist, was die S-förmige Funktion wie in Ihrem Fall aussieht:

enter image description here

in etwas Vergrößerte:

enter image description here

Für Ihr spezielles Modell, wird der Wert von X wenn Y an der Schwelle 0,5 Klassifizierung ist irgendwo zwischen 3.161 und 3.227. Sie können dies überprüfen, indem Sie die loss und X_test Arrays zu vergleichen (X_test[123] ist der X-Wert im Zusammenhang mit dem gebundenen Ober - Sie eine Funktion Optimierungsmethode verwenden können einen genauen Wert zu erhalten, wenn Sie möchten)

So ist der Grund, warum 4 wird als Klasse vorhergesagt 1 ist, weil 4 über dem für gebunden ist, wenn Y == 0.5

können Sie dies weiter zeigen, mit den folgenden:

:

print ("2 --> {0}".format(lr.predict(2))) 
print ("3 --> {0}".format(lr.predict(3))) 
print ("3.1 --> {0}".format(lr.predict(3.1))) 
print ("3.3 --> {0}".format(lr.predict(3.3))) 
print ("4 --> {0}".format(lr.predict(4))) 

, die aus der folgenden gedruckt werden

2 --> [0] 
3 --> [0] 
3.1 --> [0] # Below threshold 
3.3 --> [1] # Above threshold 
4 --> [1] 
+0

Ich realisierte das ein wenig später. Aber die Graphen treiben den Punkt nach Hause. :) – rgk

Verwandte Themen