2017-07-11 2 views
0

私はscikit-learnからintercept_=0.0LogisticRegressionを取得している理由を正当化するために苦労してきました。嵌合ロジスティック回帰は、以下のパラメータを有する:scikitのLogisticRegressionでintercept_ = 0.0を使用するのは正常ですか?

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) 

私が使用しているデータセットは、以下の特性を有する:ユニークと

  • 形状(113441、69)
  • 1特徴(-1、私がcoef_を探索することにより開始したユニーク(1、0)

0)

  • 68の特徴ロジスティック回帰の賛辞と、彼らは次のとおりです。私たちはいくつかのゼロ見ることができます

    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]]) 
    

    intercept_=0.0と一緒に(原因L1ペナルティに期待されるが、右?)。

    私はclass_weight=Noneで試してみましたが、intercept_ != 0.0を付け加えたいと思います。

    この理由は何ですか?intercept_=0.0?インターセプトも同様に正則化されていて、ゼロに設定されます(その他の係数はcoef_)。それは単なる "運"でしたか?それは私のデータセットに起因するのでしょうか? LogisticRegressionintercept_scalingパラメータのdocstring から

  • 答えて

    0

    intercept_scaling:フロート、デフォルトの1

    ソルバー 'liblinear' が使用され、self.fit_interceptに設定されている場合にのみ有効真実。この の場合、xは[x、self.intercept_scaling]になります。すなわち、 インスタンスベクトルに、intercept_scalingに等しい定数値を持つ "合成" フィーチャが追加されます。インターセプトは、intercept_scaling * synthetic_feature_weightになります。

    注!合成特徴量は、他のすべての特徴と同様に、l1/l2正則化の対象となる である。 合成フィーチャウェイト(したがって、 のインターセプト)の正規化の影響を軽減するには、intercept_scalingを増やす必要があります。

    なぜこれが通常の方法ですか?インターセプトタームは、技術的にはX /フィーチャータームに追加する1sの列ベクトルに対する係数であるです。

    たとえば、単純な線形回帰を使用すると、2つのフィーチャと10個のサンプルを持つXフィーチャのデータセットがあるとします。 scipy.linalg.lstsqを使用して、を含む場合、最初にstatsmodels.tools.tools.add_constantのようなものを使用して、機能に1の列を追加します。 1の列を追加しなかった場合は、2つの係数しか得られません。あなたが追加した場合、あなたの傍受だけである第3の「係数」を得るでしょう。

    これを結び付ける簡単な方法は、予測値を考えることです。インターセプト項に1を掛けたものはそれ自体である。他の係数とフィーチャの合計積にインターセプト(1倍)を加えて、nx1予測値の配列を取得します。

    +0

    私はscissit-learnロジスティック回帰 'liblinear' [ここ](https://github.com/scikit-learn/scikit-learn/blob/55c9443ca47eac25a3b878b47654444e59474f38f/sklearn/svm/base.py#)を見ました。 L903)、 'intercept_ = intercept_scaling * raw_coef_ [:, -1]'が見つかりました。しかし、これは良い習慣ですか?私はそれが傍受用語を正規化することは推奨されていないが、実際には文字列の理由が見つからなかったと読んだ。 – HLopes

    +0

    'intercept_scaling = 6.2196752179914165'のデフォルト値は1であるため、より詳しく見てみたいと思います(' .fit'を呼び出すときに変更する必要はありません)。あなたのcsvデータをgoogleに投稿する可能性がありますか? docs?いずれにせよ、liblinear.train_wrapはインターセプト・ベクトルを正規化します。 –

    +0

    Logitのハイパーパラメータのほとんどで、[skopt](https://scikit-optimize.github.io/)でハイパーパラメータ検索を行ったため、そのintercept_scaling値に到達しました。私はデータセットをアップロードしようとします – HLopes

    関連する問題