2017-03-08 2 views
2

Ich versuche, ein logistisches Regressionsmodell auf den Sklearn-Iris-Datensatz anzupassen. Ich bekomme eine Wahrscheinlichkeitskurve, die aussieht, als sei sie zu flach, oder der Koeffizient ist zu klein. Ich würde eine Wahrscheinlichkeit über neunzig Prozent von Kelchblatt Länge erwarten> 7:sklearn LogisticRegression - Plot zeigt zu kleinen Koeffizienten an

enter image description here

Ist diese Wahrscheinlichkeitskurve in der Tat falsch? Wenn ja, was könnte das in meinem Code verursachen?

from sklearn import datasets 
import matplotlib.pyplot as plt 
import numpy as np 
import math 

from sklearn.linear_model import LogisticRegression 

data = datasets.load_iris() 

#get relevent data 
lengths = data.data[:100, :1] 
is_setosa = data.target[:100]   

#fit model 
lgs = LogisticRegression() 
lgs.fit(lengths, is_setosa) 
m = lgs.coef_[0,0] 
b = lgs.intercept_[0] 

#generate values for curve overlay 
lgs_curve = lambda x: 1/(1 + math.e**(-(m*x+b)))   
x_values = np.linspace(2, 10, 100) 
y_values = lgs_curve(x_values) 

#plot it 
plt.plot(x_values, y_values) 
plt.scatter(lengths, is_setosa, c='r', s=2) 
plt.xlabel("Sepal Length") 
plt.ylabel("Probability is Setosa") 
+1

Was ist falsch an der Kurve? Es sieht gut aus für mich. Bleiben Sie bei [fragen] und geben Sie an, was Sie bekommen und wie weit es Ihre Erwartungen nicht erfüllt. – ImportanceOfBeingErnest

+0

Danke für die Erinnerung. Ich habe es gerade bearbeitet, um es klarer zu machen. – Selah

Antwort

1

Wenn Sie http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression beziehen, erhalten Sie einen Regularisierungsparameter C finden, die als Argument übergeben werden kann, während die logistische Ausbildung Regressionsmodell.

C: float, Standard: 1,0 Inverse der Regularisierungsstärke; muss ein positiver Schwimmer sein. Wie in Support-Vektor-Maschinen geben kleinere Werte eine stärkere Regularisierung vor.

Nun, wenn Sie unterschiedliche Werte dieser Regularisierung Parameter versuchen, werden Sie feststellen, dass größere Werte von C zur Anpassung von Kurven führt, die schärfere Übergänge von 0 auf 1 Wert des Ausgangs (Antwort) binäre hat Variable und noch größere Werte passen zu Modellen mit hoher Varianz (versuchen Sie, den Trainingsdatenübergang genauer zu modellieren, ich denke, das ist, was Sie erwarten, dann können Sie versuchen, C Wert so hoch wie 10 und Plot) aber gleichzeitig Zeit dürfte das Risiko haben, überzufallen, whil e der Standardwert C=1 und Werte kleiner als die führt zu hohen Vorspannung und zu Unterbau wahrscheinlich ist und hier kommt das berühmte Bias-Varianz-trade-off in maschinelles Lernen.

Sie können immer Techniken wie Kreuzvalidierung den C Wert zu wählen, das richtige für Sie ist. Die folgende Code/Abbildung zeigt die Wahrscheinlichkeitskurve mit Modellen unterschiedlicher Komplexität versehen (dh mit unterschiedlichen Werten des Regelungsparameters C, 1-10):

x_values = np.linspace(2, 10, 100) 
x_test = np.reshape(x_values, (100,1)) 

C = list(range(1, 11)) 
labels = map(str, C) 
for i in range(len(C)): 
    lgs = LogisticRegression(C = C[i]) # pass a value for the regularization parameter C 
    lgs.fit(lengths, is_setosa) 
    y_values = lgs.predict_proba(x_test)[:,1] # use this function to compute probability directly 
    plt.plot(x_values, y_values, label=labels[i]) 

plt.scatter(lengths, is_setosa, c='r', s=2) 
plt.xlabel("Sepal Length") 
plt.ylabel("Probability is Setosa") 
plt.legend() 
plt.show() 

Predicted probs mit Modellen mit unterschiedlichen Werten von C ausgestattet

enter image description here

+1

Das ist hilfreich, danke! Was kann ich C setzen, wenn ich keine Regularisierung möchte? (Ich weiß, dass dies zu einer reduzierten Testgenauigkeit beitragen wird, aber das ist eher eine theoretische Übung für mich) – Selah

+0

Zu einem hohen Wert, kann man 10, 100, 1000 usw. (Idealerweise unendlich) aber Werte wie 100 oder 1000 sollte dem Zweck dienen, denke ich. –

+1

In der Tat kann ich, danke. – Selah

0

Obwohl Sie beschreiben nicht, was Sie darstellen möchten, ich nehme an, Sie die Trennlinie zeichnen möchten. Es scheint, dass Sie in Bezug auf die logistische/sigmoide Funktion verwirrt sind. Die Entscheidungsfunktion der logistischen Regression ist eine Linie.

+0

Ich zeichne die Wahrscheinlichkeit auf, dass eine Iris vom Typ Setosa auf Sepal Länge basiert. Diese Wahrscheinlichkeit kommt von der Anpassung eines Modells an die Datenpunkte (in rot). Die Wahrscheinlichkeitsfunktion ist eine Sigmoidfunktion. – Selah

0

Ihr Wahrscheinlichkeitsdiagramm sieht flach aus, weil Sie in gewisser Weise zu viel "herangezoomt" haben.

Wenn man sich mitten in einer Sigmoidfunktion suchen, es zu bekommen ist fast linear zu sein, da die zweite Ableitung des bekommt fast 0 sein (siehe zum Beispiel eines wolfram alpha graph)

Bitte beachten Sie, dass der Wert den wir sprechen über die Ergebnisse der -(m*x+b)

sind, wenn wir die Grenzen des Diagramms reduzieren, etwa durch x_values = np.linspace(4, 7, 100) verwenden, wir bekommen etwas, das wie eine Linie aussieht: enter image description here

Aber auf der anderen han d, wenn wir mit den Grenzen verrückt gehen, sagen von x_values = np.linspace(-10, 20, 100) verwenden, erhalten wir die klareren sigmoid: enter image description here

+1

Ich sehe, was Sie über das Einstellen der x-Achsengrenzen sagen. Aber scheint es Ihnen nicht falsch zu sein, dass bei einer Länge des Sepales> 7 meine Wahrscheinlichkeit immer noch unter 80% liegt? Das verwirrt mich. – Selah

Verwandte Themen