Это нормально иметь 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.