2017-07-11 1 views
0

Ich habe gekämpft, um zu rechtfertigen, warum ich intercept_=0.0 mit LogisticRegression von scikit-learn bekomme. Der Einbau logistische Regression hat die folgenden Parameter:Ist es normal, intercept_ = 0.0 in scikits LogisticRegression zu haben?

LogisticRegression(C=0.0588579519026603, class_weight='balanced', 
        dual=False, fit_intercept=True, intercept_scaling=6.2196752179914165, 
        max_iter=100, multi_class='ovr', n_jobs=1, penalty='l1', 
        random_state=1498059397, solver='liblinear', tol=0.0001, 
        verbose=0, warm_start=False) 

Der Datensatz verwende ich die folgenden Eigenschaften:

  • Form (113.441, 69)
  • 1-Funktion mit unique (-1, 0)
  • 68 Merkmale mit uniques (1, 0)

ich begann mit den coef_ Erkundung an Huldigungen der logistischen Regression und sie sind die folgenden:

array([[-0.11210483, 0.09227395, 0.23526487, 0.1740976 , 0.  , 
    -0.3282085 , -0.41550312, 1.67325241, 0.  , 0.  , 
    -0.06987265, 0.  , -0.03053099, 0.  , 0.09354742, 
    0.06188271, -0.24618392, 0.0368765 , 0.  , 0.  , 
    -0.31796638, 1.75208672, -0.1270747 , 0.13805016, 0.  , 
    0.2136787 , -0.4032387 , -0.00261153, 0.  , 0.17788052, 
    -0.0167915 , 0.34149755, 0.0233405 , -0.09623664, -0.12918872, 
    0.  , 0.47359295, -0.16455172, -0.03106686, 0.00525001, 
    0.13036978, 0.  , 0.  , 0.01318782, -0.10392985, 
    0.  , -0.91211158, -0.11622266, -0.18233443, 0.43319013, 
    -0.06818055, -0.02732619, 0.  , -0.09166496, 0.03753666, 
    0.03857431, 0.  , -0.02650828, 0.19030955, 0.70891911, 
    -0.07383034, -1.29428322, -0.69191842, 0.  , 0.43798269, 
    -0.66869241, 0.  , 0.44498888, -0.08931519]]) 

wo wir einige Nullen (erwartet aufgrund L1 Strafe, nicht wahr?) zusammen mit intercept_=0.0 sehen können.

Ich möchte hinzufügen, dass ich versuchte mit class_weight=None und ich bekomme intercept_ != 0.0.

Was könnte der Grund für diese intercept_=0.0 sein? Wird der Abschnitt ebenfalls regularisiert und zufällig auf Null gesetzt (wie jeder andere Koeffizient von coef_)? War es nur "Glück"? Liegt es an meinem Datensatz?

Antwort

0

Vom docstring auf dem intercept_scaling Parameter LogisticRegression:

intercept_scaling: float, default 1.

Nur nützlich, wenn der Löser 'liblinear' verwendet wird und self.fit_intercept eingestellt ist Wahr. In diesem Fall wird x zu [x, self.intercept_scaling], d. H. Ein "synthetisches" -Merkmal mit einem konstanten Wert gleich intercept_scaling wird an den Instanzvektor angehängt. Der Abschnitt wird intercept_scaling * synthetic_feature_weight.

Hinweis! Das Gewicht des synthetischen Merkmals ist und unterliegt wie alle anderen Merkmale der Regulation l1/l2. Um den Effekt der Regularisierung auf das synthetische Merkmalsgewicht (und damit auf den Schnittpunkt) zu verringern, muss intercept_scaling erhöht werden.

Warum ist das normal? Der Abschnitt Begriff ist technisch nur der Koeffizient zu einem Spaltenvektor von 1s, die Sie an Ihre X/Feature-Begriffe anhängen.

Zum Beispiel mit der einfachen linearen Regression sagen, Sie haben einen Datensatz von Features X mit 2 Funktionen und 10 Proben. Wenn Sie scipy.linalg.lstsq verwenden, um die Koeffizienten einschließlich den Schnittpunkt zu erhalten, möchten Sie zunächst etwas wie statsmodels.tools.tools.add_constant verwenden, um eine Spalte von 1s an Ihre Features anzufügen. Wenn Sie die Spalte 1s nicht anhängen, erhalten Sie nur 2 Koeffizienten. Wenn Sie anhängen, erhalten Sie einen dritten "Koeffizienten", der nur Ihr Abfangen ist.

Der einfache Weg, das zurück zu binden, ist, an die vorhergesagten Werte zu denken. Der Schnittpunktausdruck multipliziert mit einer Spalte von 1s ist einfach selbst - d. Sie addieren den Schnittpunkt (mal eins) zu dem summierten Produkt der anderen Koeffizienten und Merkmale, um Ihr Array von vorhergesagten Werten zu erhalten.

+0

Ich habe zufällig einen Blick auf scikit-lernen Logistische Regression 'liblinear' [hier] (https://github.com/scikit-learn/scikit-learn/blob/55c9443ca47eac25a3b878b7654744e59474f38f/sklearn/svm/base.py# L903) und festgestellt, dass "intercept_ = intercept_scaling * raw_coef_ [:, -1]'. Aber ist das eine gute Übung? Ich habe gelesen, dass es nicht empfohlen wird, den Abfangterm zu regularisieren, aber ich habe tatsächlich keinen String-Grund gefunden. – HLopes

+0

Ich möchte genauer hinsehen, weil Ihr 'intercept_scaling = 6.2196752179914165' wenn der Standardwert 1 sein sollte. (Ich sehe keinen Grund, dass es sich ändern sollte, wenn' .fit' aufgerufen wird.) Könnten Sie möglicherweise Ihre CSV-Daten an Google senden Dokumente? Wie auch immer, "liblinear.train_wrap" reguliert den Intercept-Vektor. –

+0

Ich kam zu diesem 'intercept_scaling'-Wert aufgrund der Hyperparametersuche mit [skopt] (https://scikit-optimize.github.io/) über die meisten Logit-Hyperparameter. Ich werde versuchen, den Datensatz hochladen – HLopes

Verwandte Themen