Это нормально иметь intercept_ = 0.0 в LogisticRegression от scikit?

Я изо всех сил пытался оправдать, почему я получаю intercept_=0.0 с LogisticRegression от scikit-Learn. Встроенная логистическая регрессия имеет следующие параметры:

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, 0)
  • 68 функций с уникальными (1, 0)

Я начал с изучения coef_ Атрибуты логистической регрессии и они следующие:

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

где мы можем увидеть некоторые нули (ожидаемые из-за штрафа L1, верно?) вместе с intercept_=0.0,

Я хотел бы добавить, что я пытался с class_weight=None и я получаю intercept_ != 0.0,

Что может быть причиной этого intercept_=0.0? Является ли перехват регуляризованным, а также установлен ли он на ноль (как и любой другой коэффициент coef_)? Это была просто "удача"? Это из-за моего набора данных?

1 ответ

Решение

Из документации на intercept_scaling параметр для LogisticRegression:

intercept_scaling: float, по умолчанию 1.

Полезно только тогда, когда используется решатель liblinear и для self.fit_intercept задано значение True. В этом случае x становится [x, self.intercept_scaling], то есть "синтетический" признак с постоянным значением, равным intercept_scaling, добавляется к вектору экземпляра. Перехват становится intercept_scaling * синтетическим_разведением_весом.

Заметка! вес синтетического признака подлежит регуляризации l1/l2, как и все остальные свойства. Чтобы уменьшить влияние регуляризации на синтетический вес объекта (и, следовательно, на перехват), необходимо увеличить значение intercept_scaling.

Почему это нормальная практика? Термин перехвата технически является просто коэффициентом для вектора столбца 1 с, который вы добавляете к своим терминам X/feature.

Например, используя простую линейную регрессию, скажем, у вас есть набор данных объектов X с 2 объектами и 10 выборками. Если бы вы использовали scipy.linalg.lstsq для получения коэффициентов, включая перехват, вы сначала хотели бы использовать что-то вроде statsmodels.tools.tools.add_constant добавить столбец 1с к вашим функциям. Если вы не добавите столбец 1 с, вы получите только 2 коэффициента. Если вы добавите, вы получите третий "коэффициент", который является просто вашим перехватом.

Самый простой способ связать это - подумать о прогнозируемых значениях. Член перехвата, умноженный на столбец 1 с, сам по себе - т.е. вы добавляете перехват (умноженный на один) к суммированному произведению других коэффициентов и характеристик, чтобы получить массив прогнозируемых значений nx1.

Другие вопросы по тегам