Я пытаюсь написать свой собственный логистический регрессор (используя пакетный / мини-пакетный градиентный спуск) для практических целей.
Я сгенерировал случайный набор данных (см. Ниже) с нормально распределенными входами, а выход - двоичным (0,1). Я вручную использовал коэффициенты для ввода и надеялся, что смогу их воспроизвести (см. Ниже фрагмент кода). Однако, к моему удивлению, ни мой собственный код, ни sklearn LogisticRegression не смогли воспроизвести действительные числа (хотя знак и порядок величины совпадают). Более того, полученные моим алгоритмом коэффициенты отличаются от коэффициентов, полученных с помощью sklearn.
Я неправильно истолковываю, каковы коэффициенты логистической регрессии?
Буду признателен за понимание этого несоответствия.
Спасибо!
edit: я пытался использовать statsmodels
Logit и получил третий набор слегка отличающихся значений для коэффициентов
Еще немного информации, которая может иметь отношение к:
Я написал линейный регрессор, используя почти идентичный код, и он работал отлично, поэтому я уверен, что это не проблема в коде. Кроме того, мой регрессор на самом деле превзошел склеарн на тренировочном наборе, и они имеют одинаковую точность на тестовом наборе, поэтому у меня нет оснований полагать, что регрессоры ошибочны.
Фрагменты кода для генерации набора данных:
o1 = 2
o2 = -3
x[:,1]=np.random.rand(size)*2
x[:,2]=np.random.rand(size)*3
y = np.vectorize(sigmoid)(x[:,1]*o1+x[:,2]*o2 + np.random.normal(size=size))
так что, как видно, входные коэффициенты равны +2 и -3 (перехват 0);
коэффициенты склеарна составляли ~ 2,8 и ~ -4,8;
мои коэффициенты были ~ 1,7 и ~ -2,6
и регрессора (наиболее значимые его части):
for j in range(bin_size):
xs = x[i]
y_real = y[i]
z = np.dot(self.coeff,xs)
h = sigmoid(z)
dc+= (h-y_real)*xs
self.coeff-= dc * (learning_rate/n)