2017-11-12 7 views
1

ich mit diesem Beispiel aus wikipedia logistischer Regression in Python mache. link to exampleverwirrende Ergebnisse mit logistischer Regression in Python

hier ist der Code, den ich habe:

from sklearn.linear_model import LogisticRegression 
lr = LogisticRegression() 
Z = [[0.5], [0.75], [1.0], [1.25], [1.5], [1.75], [1.75], [2.0], [2.25], [2.5], [2.75], [3.0], [3.25], [3.5], [4.0], [4.25], [4.5], [4.75], [5.0], [5.5]] # number of hours spent studying 
y = [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1] # 0=failed, 1=pass 

lr.fit(Z,y) 

Ergebnisse hierfür sind

lr.coef_ 
array([[ 0.61126347]]) 

lr.intercept_ 
array([-1.36550178]) 

während sie Werte 1,5046 für Stunde Koeffizient und -4,0777 abfangen zu bekommen. Warum sind die Ergebnisse so unterschiedlich? ihre Voraussage für 1 Stunde der Studie ist Wahrscheinlichkeit 0.07 zu überschreiten, während ich 0.32 mit diesem Modell bekomme, sind diese drastisch unterschiedliche Ergebnisse.

+0

Ich denke, das Problem mit der tatsächlichen Formel sein könnte, die für die Berechnung verwendet. Bitte geben Sie das Ergebnis einer Probenvorhersage einmal an. Ich werde versuchen, es zu testen. – Kishor

Antwort

4

Das "Problem" ist LogisticRegression in scikit-learn verwendet L2-regularization (aka Tichonov Regularisierung, ak ein Ridge, alias normaler Prior). Bitte lesen Sie sklearn user guide about logistic regression für Implementierungsdetails.

In der Praxis bedeutet dies, dass LogisticRegression einen Parameter C hat, der standardmäßig 1 entspricht. Je kleiner C, desto mehr Regularisierung ist - es bedeutet, coef_ wird kleiner, und intercept_ größer, die numerische Stabilität erhöht und reduziert Überanpassung.

Wenn Sie setzen C sehr groß ist, wird die Wirkung der Regularisierung verschwinden. Mit

lr = LogisticRegression(C=100500000) 

Sie coef_ und intercept_ erhalten jeweils

[[ 1.50464535]] 
[-4.07771322] 

genau wie in der Wikipedia-Artikel.

Einige weitere Theorie. Overfitting ist ein Problem, bei dem es viele Features gibt, aber nicht zu viele Beispiele. Eine einfache Faustregel: Verwenden Sie kleines C, wenn n_obs/n_features kleiner als 10 ist. Im Wiki-Beispiel gibt es ein Feature und 20 Beobachtungen, so dass eine einfache logistische Regression selbst bei großen C-Werten nicht übersteuert werden würde Fall für kleine C ist Konvergenzprobleme. Sie können vorkommen, wenn positive und negative Beispiele perfekt getrennt sind oder im Fall von Multikollinearität (was wiederum wahrscheinlicher ist, wenn n_obs/n_features klein ist) und zu einem unendlichen Koeffizientenwachstum im nicht regulierten Fall führen.

+0

danke! werde das lesen. – DoctorEvil

+0

Wenn ich das richtig verstanden habe, wäre ein kleines C für ein Modell mit vielen Trainingsbeispielen und Varianz (sehr ähnliche Eingaben könnten leicht zu unterschiedlichen Ergebnissen führen) besser geeignet, um eine Überanpassung zu verhindern. Dieses Beispiel aus dem Wiki scheint simpel und die Daten sind "wie erwartet", so dass Überanpassung kein Problem ist. – DoctorEvil

+0

Sie haben es halb richtig. Siehe das Update zu meiner Antwort. –

0

denke ich, das Problem aus der Tatsache ergeben, dass Sie

Z = [[0.5], [0.75], [1.0], [1.25], [1.5], [1.75], [1.75], [2.0], [2.25], [2.5], [2.75], [3.0], [3.25], [3.5], [4.0], [4.25], [4.5], [4.75], [5.0], [5.5]]

haben, sondern sollte es sein

Z = [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 1.75, 2.0, 2.25 ...]

Versuchen Sie, diese

+0

dann erhalte ich: DeprecationWarning: Passing 1d Arrays als Daten in 0,17 veraltet und wird in Valueerror 0,19 erhöhen. Ändern Sie Ihre Daten um, indem Sie X.reshape (-1, 1) verwenden, wenn Ihre Daten ein einzelnes Feature enthalten, oder X.reshape (1, -1), wenn es ein einzelnes Beispiel enthält. – DoctorEvil

+0

@DoctorEvil Ich habe mich geirrt, siehe David Dales Antwort – Moulick

Verwandte Themen